2012年4月27日金曜日

[python]組み合わせを作るのが簡単

python で組み合わせを作るとき便利な関数があった

http://tanopy.blog79.fc2.com/blog-entry-48.html

list = ['a','b','c']
itertools.combination(list, 2)


こんな感じ。
すげー便利。
ここまでやっちゃうと…という思いはあるが仕事は効率。
自分の時間でアルゴリズム考えよう。



2012年4月25日水曜日

[eclipse]ショートカット

eclipseのショートカットすぐ忘れちゃう。


名前変更
SHIFT+ALT+R

大文字
CTRL+SHIFT+X

小文字
CTRL+SHIFT+Y

よく使う。

あとは
CTRL+1

CTRL+2 L or F
くらいをよく使うかな。


[eclipse]eclipseからSQLCloudに接続する

eclipseでSQLCloudに接続する方法

ドキュメント
https://developers.google.com/eclipse/docs/cloudsql-database?hl=ja


all-in-one-eclipse3.7 インストール
http://mergedoc.sourceforge.jp/

google plugin for eclipse インストール
https://developers.google.com/eclipse/docs/getting_started

ウィンドウ>設定>Google>Appエンジン>SDK から
appengine sdk を追加
ちなみに sdk version.1.6.5


データベース開発 パースペクティブを開く

データ・ソース・エクスプローラー ビューのデータベース接続で新規

Google Cloud SQL 選択

ドライバー         Driver (GOOGLE)
データベース名  設定したもの
インスタンス名   設定したもの
ユーザ名          なし
パスワード        なし

ドライバーの右の方のドライバー定義の編集

JAR List で google_sql.jar を除去

JAR/Zip の追加 でAPPENGINEHOME/lib/impl/google_sql.jar を選択して追加

これで接続のテストを実行してpingが通ればOK

追加したデータベース接続を右クリックしてSQLスクラップブックを開く

型:MySql_5.1 名前:データベース接続 データベース:データベース名 で接続できるはず

あとはSQL書いてALT+SHIFT+X とかで実行





[java]SQLCloudに接続

SQL Cloudの記事が割と書かれるようになってきた。

公式
https://developers.google.com/cloud-sql/

記事
http://www.atmarkit.co.jp/fjava/rensai4/cloudsql01/01.html
http://www.atmarkit.co.jp/fdb/rensai/googlecloudsql/01/01.html


で、開発環境のアプリケーションからどうやって接続できる自分がわかっている方法としては、

EclipseプラグインでGoogle CloudSQLの設定でEnableにしてインスタンス名とデータベース名を入力して(設定する箇所が2つある?)SQLCloudを登録したアカウントでログイン(EclipseのGUIでWEBアプリをデプロイ出来る状態)してアプリを実行する。
これだけ。
JDBCでのユーザやパスワードはいらない。
これ以外のアカウントで認証しようとするとはじかれた。
およそこんなコード。

<pre>

        Connection c = null;

            DriverManager.registerDriver(new AppEngineDriver());
            c = (Connection) DriverManager.getConnection("jdbc:google:rdbms://インスタンス名(APIコンソールのOverviewのところ)/データベース名");
</pre>


あと、テストコード(ktrwjr)でリクエストして処理内で接続しようとするとこれも怒られた。

多分、インスタンス名とかデータベース名とかを実行時のJVM引数で指定すればいけるかも。
とりあえず上で無理やりにでもテストできるので試してない。
https://developers.google.com/cloud-sql/docs/developers_guide_java#using_the_java_development_server


2012年4月20日金曜日

[java]GAEのタイムゾーンをJSTにする


タイムゾーンの問題
========================================


  • UNIX時間「0」は、UTCでは「1970-01-01T00:00:00」、JSTでは「1970-01-01T09:00:00」となる
  • 下記を通せばタイムゾーンはJSTとなって登録されるデータも整合性があう


<pre class="pretty">
TimeZone.setDefault(TimeZone.getTimeZone("JST"));
</pre>


  • GAEではスケールアウトもろもろでインスタンスがいつ落ちるかわからないので毎回念の為に設定しておく

2012年4月19日木曜日

[java]GAEでバイナリデータをBlobstoreに登録する←FileAPI


GAE/Jでサーバのメモリ上で展開しているバイナリデータ(JPEG)をBlobstoreに追加するスニペット。

    private BlobKey registerBlob(byte[] bytes) throws IOException{
        // Get a file service
        FileService fileService = FileServiceFactory.getFileService();
        // Create a new Blob file with mime-type "application/octet-stream"
        AppEngineFile file = fileService.createNewBlobFile("image/jpeg");
        // Open a channel to write to it
        boolean lock = true;
        FileWriteChannel writeChannel = fileService.openWriteChannel(file, lock);
        // This time we write to the channel using standard Java
        writeChannel.write(ByteBuffer.wrap(bytes));
        // Now finalize
        writeChannel.closeFinally();
        return fileService.getBlobKey(file);
    }


[IntelliJ IDEA]ブロックレベルの選択

idea で CTRL + W でブロックレベルで選択範囲を増やして
SHIFT + CTRL + W で選択範囲を減らせる。

eclpse も ALT + SHIFT + UP と  ALT + SHIFT + DOWN で
同等のことが出来る。

ideaのほうが好み選択してくれるけどね。

[other]gaeで1アプリにjavaとpythonのっけてやりとり

意味があるのかと言われればあれだけど、


たとえばGAEのアプリIDが


hogemaruo






  • gae/java
  • gae/python



それぞれで hogemaruo アプリの別バージョンとして定義ができる。


一つのアプリケーションIDで異なる実行環境が用意できるっちゅうことだ。


url fetch使って行き来すれば色々と出来るな。


あんまりいいやり方じゃないけど切羽詰まったからありだろ。


将来的にはできなくなるかも…。


まあこのやり方だと幸か不幸かDatastoreを共有することにもなる。


マルチテナンシーAPIって全然知らないけど、シノニムみたいなもの?


これ使えば…。


pyシノニムとjavaシノニム、、、なんてね。



2012年4月18日水曜日

[IntelliJ IDEA]プロジェクトビューを同期する

intellj idea で

エディタで参照しているパスと

プロジェクトビューを同期するには

Alt+F1 して Project を押せばいいのか。


2012年4月17日火曜日

[other]GQL

GQL

keyでの検索

nameとidに注意ね

where __key__ = key('Model', 'name')

or


where __key__ = key('Model', 123456789)




ある親に属する子エンティティ検索

where ancestor is key('Model', 'name')

or

where ancestor is key('Model', 123456789)


Keyプロパティへの検索

where key_property = key('Model', 'name')

or


where key_property = key('Model', 123456789)



こんな感じ。

[other]taskqueueの例外


ログを見てて、見慣れない例外。

com.google.appengine.api.taskqueue.TransactionalTaskException
 at com.google.appengine.api.taskqueue.QueueApiHelper.translateError(QueueApiHelper.java:69)
 at com.google.appengine.api.taskqueue.QueueApiHelper.translateError(QueueApiHelper.java:139)
 at com.google.appengine.api.taskqueue.QueueApiHelper.makeSyncCall(QueueApiHelper.java:33)
 at com.google.appengine.api.taskqueue.QueueImpl.add(QueueImpl.java:481)
 at com.google.appengine.api.taskqueue.QueueImpl.add(QueueImpl.java:427)
 at com.google.appengine.api.taskqueue.QueueImpl.add(QueueImpl.java:412)



Caused by: java.lang.IllegalArgumentException: too many messages, maximum allowed: 5
 at com.google.appengine.api.datastore.DatastoreApiHelper.translateError(DatastoreApiHelper.java:36)
 at com.google.appengine.api.taskqueue.QueueApiHelper.translateError(QueueApiHelper.java:70)
 ... 53 more

ぎゃああああああ。

これはやばい。

[other]json形式のフォーマットについて

jsonで扱うマルチバイト文字はUnicodeエスケープしようぜって話。






変換ツール





Javaでユニコードエスケープするメソッド




ユニコードエスケープやらユニバーサルキャラクタ名やらってなんや、Javaではって話。






2012年4月15日日曜日

[vim]矩形選択

vimで矩形選択する。

http://nanasi.jp/articles/howto/editing/blockwise-operation.html

ノーマルモードか、ビジュアルモードで「Control-v」と押下すると、 矩形ビジュアルモードに入ります

[vim]カーソル移動のキーバインド

vimのカーソル移動についてメモ。
よく忘れる。
体が覚えるまでは参照しよう。

http://www.7key.jp/software/vi.html
h左へカーソルを移動(5hで5文字左に移動)。BSも同様。
j下へカーソルを移動(5jで5行下に移動)。C-nも同様。
k上へカーソルを移動(5kで5行上に移動)。C-pも同様。
l右へカーソルを移動(5lで5文字右に移動)。Spaceも同様。
0カーソル行の行頭に飛ぶ。
^カーソル行の行頭に飛ぶ。ただし、行頭が空白であれば空白部分の右へ。
|(パイプ)現在行の指定する文字数目へ移動(5|で先頭から数えて5文字目へ移動)。
$カーソル行の行末に飛ぶ。

[vim]クリップボードとのやりとり

Windowsのgvimでクリップボードとのやりとりについて


http://nanasi.jp/articles/howto/editing/clipboard.html#id13


Windows環境のvimエディタでは、次のコマンドでクリップボードのデータを操作できます。
この操作は、ノーマルモード、入力モード、コマンドラインモード、ビジュアルモード、 検索と全ての操作で使用可能です。
  • Control キー + Insert キーでコピー
  • Control キー + Delete キーでカット
  • Shift キー + Delete キーでカット
  • Shift キー + Insert キーでペースト


[python]いつもの文字コードにまつわる変換エラー

    search_word_end = search_word + u'\uFFFD'.encode('utf-8')
UnicodeDecodeError: 'ascii' codec can't decode byte 0xef in position 0: ordinal not in range(128)

gaeで文字によるレンジスキャンしようとして
pythonの文字コード的な初歩的エラーで引っかかった。

なんぞこれ?

開発環境では動いていたからバージョンとかのせい?


わかったー。

search_word + u'\uFFFD'.encode('utf-8') 





のうち、search_word をself.request.get('keyname')で取得してたんだけれど、
ローカルではstr型でとれてるものだとおもってstr型にして + してけど、
実はunicode型で、unicode + str でseachをGAEデフォルトのasciiコーデックでデコードしようとしてエンコーディングに失敗していたっぽい。

なので、あえてencodeしてたところをunicodeのままほったらかしにやればいけた。

この苦しみ、ascii圏の人にはわかるまい。


2012年4月11日水曜日

[other]GAEのインデックスエラー




カラム1、カラム2、カラム3、日付

のインデックス定義で、


カラム1、カラム3、日付


のクエリを投げたらエラー。

まあそりゃそうか。
めんどくさいなー。


致命的: com.google.appengine.api.datastore.DatastoreNeedIndexException: Query com.google.appengine.api.datastore.dev.LocalCompositeIndexManager$IndexComponentsOnlyQuery@97be02ad requires a composite index that is not defined. You must update C:\usr\local\eclipse\workspace\project\war\WEB-INF\datastore-indexes.xml or enable autoGenerate to have it automatically added.
The suggested index for this query is:
    <datastore-index kind="Model" ancestor="false" source="manual">
        <property name="column_01" direction="asc"/>
        <property name="column_03" direction="asc"/>
        <property name="insert_date" direction="asc"/>
    </datastore-index>


 at com.google.appengine.api.datastore.DatastoreApiHelper.translateError(DatastoreApiHelper.java:42)
 at com.google.appengine.api.datastore.DatastoreApiHelper$1.convertException(DatastoreApiHelper.java:76)
 at com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:106)
 at com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:90)
 at com.google.appengine.api.datastore.FutureHelper.getInternal(FutureHelper.java:72)
 at com.google.appengine.api.datastore.FutureHelper.quietGet(FutureHelper.java:33)
 at com.google.appengine.api.datastore.QueryResultsSourceImpl.peekQueryResultAndIfFirstRecordIndexList(QueryResultsSourceImpl.java:162)
 at com.google.appengine.api.datastore.QueryResultsSourceImpl.loadMoreEntities(QueryResultsSourceImpl.java:98)
 at com.google.appengine.api.datastore.QueryResultIteratorImpl.ensureLoaded(QueryResultIteratorImpl.java:174)
 at com.google.appengine.api.datastore.QueryResultIteratorImpl.nextList(QueryResultIteratorImpl.java:120)
 at com.google.appengine.api.datastore.LazyList.forceResolveToIndex(LazyList.java:108)
 at com.google.appengine.api.datastore.LazyList.resolveToIndex(LazyList.java:84)
 at com.google.appengine.api.datastore.LazyList.resolveAllData(LazyList.java:54)
 at com.google.appengine.api.datastore.LazyList.size(LazyList.java:136)

[IntelliJ IDEA]Intellij IDEAでslim3 model Processor Factoryが動作しない

エラー:注釈プロセッサ 'org.slim3.gen.processor.ModelProcessorFactory' が javax.annotation.processing.Processor を実装していません



Compiler internal error. Process terminated with exit code 1




Intellij IDEA でslim3 …
なんとかならないのかな。