python+SQLiteでlike文

ここを参考に、

Asciiの場合

Unicodeの場合

tagはunicode string

ValueError: unsupported format character ‘Y’ (0x59) at index 51

MySQL+Pythonのエラー

このようなエラーが出るときの対応。

これだと上記エラーが発生します。

ここに解決策が載っていました。

ポイントはsql文の文字列をformat()するだけ

lambdaのAPIにキーを付与する

AWSの仕様がすぐ変わるのでメモ。

こちらの記事を参考にAPIGatewayにAPIキーをつけようとしたのですが、2017.5.16現在、仕様が変わってしまっているようでそのままでは設定できませんでした。

記事の中頃「API Keyの追加」の部分ですが、API Stage AssociationはAPI Keyのページには存在しません。

以下の手順となります

  • 左メニューのUsagePlansというメニューをクリック
  • createでNameに何か適当な名前を入れる。
  • リクエスト数にリミットをつけないのならば、Enable throttlingとEnable Quotaはチェックを外す
  • Add API Stageでデプロイ済みのAPIとStageを選択しチェックマークをクリック。Nextをクリック
  • Add API Key to Usage Planをクリックし、作成済みのAPI Keyの名前を入力。チェックマークをクリックしDone

これでAPIキーが付加されます。

AWSのlambdaでJavaを使う

ちょっとハマったのでメモ。JavaはMavenでコンパイルします。

Test.java

pom.xml

コンパイル

Lambdaへアップロード

  • zipファイルをアップロード
  • Configulationを設定
  • RuntimeJava 8
    Handlercom.example.Test::handler

     これで動きます。テストの際に与えるパラメタの値が表示されます

torchをeclipseでデバッグ

torchというディープラーニングのライブラリが有ります。Luaで書かれているようであまり馴染みがなかったのですが、論文を読んでいて、サンプルをどうしても動かしたくてデバッグできる環境の構築を行った時のメモです

環境

  • MacOS Seirra 10.12.4
  • eclipse 4.6.3

こちらにubuntuの場合の設定方法があるのですが、Macではちょっと違いました。

luaインストール

これだけです

torchインストール

公式の手順通りにやれば問題なく終了します。

eclipseプラグイン

下記URLからLuaプラグインをインストールします。1.4.1が最新でした
http://download.eclipse.org/ldt/releases/milestones/

eclipseの設定

これが一番ハマりました。

環境設定 > Lua > Interpreters で Addで追加します。

Interpreter typeLua JIT 2.0
Interpreter executable/Users/yourname/torch/install/bin/luajit
Interpreter name Lua JIT
interpreter arguments-lenv -e “io.stdout:setvbuf(‘no’); if os.getenv(‘DEBUG_MODE’) then require ‘debugger’ ; require ‘debugger.plugins.ffi’end”
Linked Execution Environmentlua-5.1

また、Import…で/Users/yourname/torch/install/bin/torch-activateをインポートし環境変数を追加します

実行

こちらのサンプルを動かしてみます。
EclipseでLuaプロジェクトを作成し、srcディレクトリ内にファイルを作成します。
ここでポイントは、ファイルのパスをコード中に記述する際にはプロジェクトのトップからの相対パスを書きます。

download.py

右クリックのRunで実行できます

Tensorflowのエラー

Tensorflowをバージョンアップすると、昔動いていたスクリプトが動かなくなったりします

こんなエラーとか。

こちらを参照し修正します。

これを

これに変更

Maven起動時のエラー

Mavenの起動時にエラーが出たのでメモ

エラーメッセージ

対応方法

こちらを参考に

omp4jによる並列化

Pythonで並列化させたプログラムを走らせていたのですがあまりの遅さにJavaへと変更した際、並列化をomp4jで簡単にできたのでメモ。

omp4j

OpenMPの説明は、Wikipediaをみてもらうことにして、ソースコード中にコメントを書いておいて、コンパイルをすれば並列化プログラムの出来上がるという便利なライブラリ。

ここからJarファイルをダウンロードします。

Javaプログラム

簡単なプログラムを作成します。スレッド5で10回計算しています。

シングルスレッド

普通にコンパイルします。シングルスレッドで動作します。

シリアルに計算されているのがわかります。

マルチスレッド

並列化できるようにコンパイルします。

並列に計算できているのがわかります。
実際にはコンパイル時にコードを変換してコンパイルしています。
ここにソースコードを貼り付けると変換後のソースが表示されます。上記サンプルだとエラーになってしまいましたが、簡単なコードならばそのコードが表示されます。

まとめ

簡単にJavaのコードが並列化できます。色々と制約はありますが(変数関連など)、簡単に並列プログラムが作成できるのはメリットでしょう。

SQLiteをPythonからインメモリで使う

SQLite、手軽で便利なデータベースですが激しく使っていると速度が気になる時もあります。

SQLiteはインメモリデータベースもサポートしているので、既存のSQLiteのデータベースからインメモリ化して読み取り専用にすると早くなります。

データベース準備

適当に大きなデータベースを用意します。

1000万レコードのデータベースを作成しました。

プログラム

こちらを参考にプログラムを作成します。

conのコネクションが通常のデータベースアクセス、mconがデータベースファイルをインメモリ化したものになります。10000回ランダムにSELECTしてみます。

結果

大学のスパコンで計算したのですが2倍以上の差が出ました。

Rをソースコードからインストール

スーパーユーザ権限のないサーバにソースコードからインストールしてみたのでそのメモ

大学のサーバなど勝手になんでもインストールできない環境ではローカルのユーザ環境に色々とインストールしないといけません。今回はRをインストールしてみました

Rの取得

cranからRのソースコードをダウンロードしコンパイルします

エラーになります

足りないライブラリを入れていきます

bzip2

このあたりを参考にMakefileを修正しておきます。CFLAGSに-fPICを追加します

makeします

Rのconfigを再開します。この際、オプションにライブラリのパスを入れます

またエラーです

xz

xzライブラリを入れます。

Rのconfigを再開

またエラー

pcre

pcreライブラリを入れる。ここで、UTF8を有効にしておきます

Rのconfigを再開

またエラーです

curl

Rのconfigを再開

成功しました

コンパイル

またエラー。。

これは使っているGCCとそのライブラリがずれていたためでした。
LD_LIBRARY_PATHに使っているGCCのライブラリパスを前の方に追加し再度make

これでOKです。