BlobstoreServiceでGCSにファイルUP→Bucket直下以外でもUP可能

GAE/Jのお話です。BlobstoreServiceを利用してGCSにファイルをアップロードする場合、バケット直下にしかファイルをアップできないという話を聞きましたが、そんなことはありません。オプションのwithGoogleStorageBucketName()にバケットからサブディレクトリまでのパスを指定すれば、指定先にアップ可能です。


String dest = "sample_bucket/test";
BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
UploadOptions options = UploadOptions.Builder.withGoogleStorageBucketName(dest);
String url = blobstoreService.createUploadUrl("/upload", options);


GCS  2014年03月22日 23時03分 

個人的によく使うgsutilコマンドランキングBEST10


個人的に(オプション込みで)よく使うgsutilコマンドランキングです。
ただ、オプションの内容についてはあまり触れません。
※オプションについては「gsutil help コマンド名」で確認できます。

第10位 Storageの情報確認

作成したバケットの情報を確認するために利用します。
バケットのクラス(Standard or DRA)やACL、リージョン等が確認できます。
$ gsutil ls -L -b gs://バケット名


第9位 設定ファイルの作成

よく使うコマンド・・・ではない気もしますがこのコマンドを打つと
生成されるgsutilの設定ファイルはよくいじります。
$ gsutil config

このコマンドを打つと.botoという設定ファイルが生成されるのですが
そこで処理のスレッド数や並列でアップロードできるファイルの最大容量等
がチューニングできます。

しかも以下のような設定項目もあるので↓を設定すれば
AWSのS3へのアップロードも可能っぽいです。
#aws_access_key_id = **********
#aws_secret_access_key = **********


第8位 バケットの削除

使わなくなったバケットの削除に使っています。
$ gsutil rm -R gs://バケット名


第7位 バケットの作成

DRAバケットの作成方法については以前書きました。作成方法は以下の通りです。クラス名の「S」はスタンダードクラスのSです。このオプションをつけないとデフォルトではスタンダードのストレージが作成されるようです。
gsutil mb -c クラス名(DRA or S) -l ロケーション -p プロジェクト名 gs://バケット名


第6位 ACL設定

アップした画像を一般公開するときとかに利用します。他にもプロジェクトのPermissionsユーザOnlyで共有・・・みたいな設定ができます。
gsutil acl set public-read gs://バケット名/*.png

※aclの詳細についてはココに書かれています。

第5位 アップデート

ツールのアップデートをおこなうときに使います。
$ gcloud components update


第4位 ファイル内容の確認

ファイル内容を確認するときに使います。
$ gsutil cat gs://バケット名/tomorier.txt


第3位 ヘルプ

コマンドのオプションを確認するときによく使います。
$ gsutil help


第2位 使用容量の確認

料金が気になってよく使うコマンドです。
$ gsutil du -ch gs://バケット名


第1位 storageにファイルUP

やっぱりこのコマンドを一番よく使います。
gsutil mv( or cp) ファイル名 gs://バケット名/(サブディレクトリ名)

具体的にはcronを使って↓な感じで定期的にストレージ上にログをアップしたりしています。
gsutil mv /home/tomorier/*`date --date '1 day ago' +%Y%m%d`.log gs://tomorier/log

※↑は日をまたいだときに前日のログをストレージにUpするサンプルです。

以上、ランキングでした。

gsutil  2014年03月13日 15時03分 

GoogleCloudSDKのインストールからGCEインスタンス作成までの手順


タイトル通りですが、Google Cloud SDKのインストールからGCEインスタンスを
作成するまでの手順について説明します。ただし、環境はMacOS Xとなります。
※ 以下の手順はCloudコンソールでプロジェクトを作成していることが前提となります。

Google Cloud SDKのダウンロード

Terminalを起動し以下のコマンドを実行します。
$ curl https://dl.google.com/dl/cloudsdk/release/install_google_cloud_sdk.bash | bash


インストール


SDKのダウンロードフォルダに移動しinstall.shを実行します。
$ ./install.sh


gcloudによる認証

インストールが完了すると、SDKのダウンロードフォルダ内のbinフォルダに
gcloud、gcutil、gsutil等がインストールされるので、さっそくgcloudによる認証をおこないます。
$ ./gcloud auth login


ブラウザによる認証


上記コマンドを打つとブラウザが立ち上がり認証を求められるので
「承認する」ボタンを押下します。

ProjectIDの入力



次にターミナルに戻り、プロジェクトIDを入力しEnterキーを押下します。
これで設定は完了です。

GCEインスタンスの作成

現在、認証されているユーザを確認するにはターミナル上で
以下のコマンドを実行します。
$ ./gcutil whoami

作業中のプロジェクトを確認するためには以下のコマンドを実行します。
$ ./gcutil getproject

それではインスタンスを作成してみます。以下のコマンドを実行します。
$ ./gcutil addinstance testinstance

(1) リージョンの選択

選べるのは現状4種類です。

(2) スペックの選択

選択するのは一番安いf1-microです。1時間$0.019なので月だと$0.019*24*30=$13.68くらいです。

(3) OSの選択

すくないですね・・・とりあえずCentOSで。

(4) passphraseの入力
こちらは未入力でもかまいません。

(5) 確認
お疲れさまでした。これで完了です。
作成したインスタンスは以下のコマンドで確認可能です。
$ ./gcutil listinstances




今日は飲み過ぎて頭がいたいです。
そろそろ寝ますので、これで終了とさせていただきます。。

GoogleCloudPlatform  2014年03月10日 23時03分 

Google Cloud StorageのBucketには選択肢がある


GCSのバケットを作成する場合、↑画像のようにCloud Condoleから作成していたのですが、
gsutilで作成するとストレージのグレードも指定できるようです。
※ブラウザからの場合はStandard Storageしか選択できないみたいです。

(1) 選択できるStorageについて

選択できるストレージは以下の2つです。

・Standard Storage
・Durable Reduced Availability Storage

※DRA storageは可用性が低いストレージのようです。

(2) 料金体系について

料金体系は以下の通りです。やっぱりDRA Storageの方が安いですね。


※詳しくはコチラを参照。

(3) 作成方法について

以下のコマンドから作成可能です。
$ gsutil mb -c DRA gs://バケット名/

※詳しくはコチラを参照。

(4) 実際に打ってみた

・・・なんかできたっぽいですね。


(5) Cloud Consoleを確認

お!本当にバケットできてますね。


とりあえず今後画像は料金の安いDRA Storageにあげていくことにします。
もし何か問題があればまたレポートします。

GCS  2014年02月16日 12時02分 

GAEのBlobstoreで気になる2つの問題

ある案件でBlobstoreを使う機会がありまして、そのとき2点ほど問題が発生しました。
発生した問題と解決策を念のため書いておきます。
※ちなみに利用した言語はJAVAです。

(1)URLの有効期限の問題

一般的にブロブストアに画像をアップロードする場合バイナリデータの送信先(formのactionに指定するURL)をblobstoreService.createUploadUrl()で生成します。
ただ、実はここに落とし穴があります。おそらく実際にサービスでBlobstoreを利用している開発者にしかわからない問題かもしれません。(自分はユーザに指摘されて気づきました。。)

結論から言うと、生成されたURLに有効期限があり、その有効期限が切れるとアップロードができなくなります。解決策として、送信ボタン押下時にAjax経由で生成されたURLを使ってデータの送信をおこなうようにしました。

この問題については、Googleの人と直接話をしたのですが、あまり致命的な問題だと考えていないようでした。要は「ユーザがそんなに長い時間フォーム画面にとどまることがあるのか?」という認識です。もちろん、そのような可能性がある・・・というか実際におこっていることは伝えましたが、しばらくは解決しないような気がします。

(2)マルチバイト文字の文字化け問題

ある一部の漢字が文字化けしてしまう問題です。この問題は結構有名だと・・・思います。
解決策は、送信前にBase64エンコードして、データ受信時にBase64デコードするだけです。
(ネットで調べれば具体的な解決策は出てくると思います。)

ちなみに、この問題についてもGoogleの人と直接話をしました。
返答ですが、「そもそもバイナリデータ送信のためのAPIなので、マルチバイト文字は考慮されていない」とのことでした。
これは1の問題以上に解決する日が遠い気がします。。


以上、Blobstoreで気になる2つの問題でした。

Blobstore  2013年09月28日 00時09分 

Twitter4Jを今更ながら使ってみる


最近仕事の方も落ち着いてきたので、簡易なWebサービスを作ろうと思います。ユーザ登録を作るのは面倒なので、twitter4jを利用してtwitterアカウントでユーザを管理するようにします。twitter4jの使い方については、このサイトを参考にしました。(説明がとてもわかりやすいです!)


(1) Slim3プロジェクトを作成

(2) ココからtwitter4Jをダウンロード

(3) Build Pathにtwitter4j-appengine-3.0.3.jartwitter4j-core-3.0.3.jarを追加

(4) ココに今回作成するアプリケーションを登録

(5) プログラムの作成


index.html

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>twitter Index</head>
<body>
<p><a href="/login">twitterでログイン</a></p>
</body>
</html>


LoginController.java
consumerKeyとconsumerSecretに(4)で生成された値をセットする。

public class LoginController extends Controller {
public static final String consumerKey = "コンシューマキー";
public static final String consumerSecret = "コンシューマシークレット";
static TwitterFactory twitterFactory = new TwitterFactory();

@Override
public Navigation run() throws Exception {
Twitter twitter = twitterFactory.getInstance();
twitter.setOAuthConsumer(consumerKey, consumerSecret);
try{
RequestToken reqToken = twitter.getOAuthRequestToken();
HttpSession session = request.getSession();
session.setAttribute("RequestToken", reqToken);
session.setAttribute("Twitter", twitter);
String strUrl = reqToken.getAuthorizationURL();
response.sendRedirect(strUrl);
}catch (TwitterException e){
throw e;
}
return null;
}
}


LoginSuccessController.java
(4)でcallbackURLとして「/loginSuccess」を事前に登録しておくと、twitter認証成功後このクラスが呼ばれる。

public class LoginSuccessController extends Controller {

@Override
public Navigation run() throws Exception {
HttpSession session = request.getSession();
Twitter twitter = (Twitter)session.getAttribute("Twitter");
String verifier = request.getParameter("oauth_verifier");
AccessToken accessToken = null;
try {
accessToken = twitter.getOAuthAccessToken((RequestToken)session.getAttribute("RequestToken"), verifier);
} catch (TwitterException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(accessToken != null){
// AccessTokenをセッションに保持
session.setAttribute("AccessToken", accessToken.getToken());
session.setAttribute("AccessTokenSecret", accessToken.getTokenSecret());
}
return null;
}
}


アクセストークンはこの流れで取得することができました。

twitter4J  2013年09月18日 08時09分 

iPhoneアプリを個人で出してます。Python/JavaScriptが大好きです。このブログはGAE/Pythonで作ったオリジナルブログです。
カテゴリ
開発アプリ