ラベル golang の投稿を表示しています。 すべての投稿を表示
ラベル golang の投稿を表示しています。 すべての投稿を表示

2013年11月7日木曜日

Google App Engine の dev_appserver起動時にsqliteでエラーがでる場合の対処法

久しぶりにMacOSでGo言語版のGoogle App Engineを触ってみたら、sqliteでエラーがでしまったので、なんとかした時のメモ

ちなみに環境は、下記の通り

  • MacOS X Marveric
  • go-app-engine-64(home brewでインストール)
  • sqlite 3.8.1 (home brewでインストール)
  • python 2.7.5 (home brewでインストール)

 

まずは、実行してみると

$ dev_appserver.py myapp
Traceback (most recent call last):
File "/usr/local/bin/dev_appserver.py", line 197, in <module>
_run_file(__file__, globals())
File "/usr/local/bin/dev_appserver.py", line 193, in _run_file
execfile(script_path, globals_)
File "/usr/local/Cellar/go-app-engine-64/1.8.7/share/go-app-engine-64/google/appengine/tools/devappserver2/devappserver2.py", line 33, in <module>
from google.appengine.tools.devappserver2 import api_server
File "/usr/local/Cellar/go-app-engine-64/1.8.7/share/go-app-engine-64/google/appengine/tools/devappserver2/api_server.py", line 50, in <module>
from google.appengine.api.logservice import logservice_stub
File "/usr/local/Cellar/go-app-engine-64/1.8.7/share/go-app-engine-64/google/appengine/api/logservice/logservice_stub.py", line 22, in <module>
import sqlite3
File "/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/sqlite3/__init__.py", line 24, in <module>
from dbapi2 import *
File "/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/sqlite3/dbapi2.py", line 27, in <module>
from _sqlite3 import *
ImportError: dlopen(/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_sqlite3.so, 2): Library not loaded: /usr/local/opt/sqlite/lib/libsqlite3.0.8.6.dylib
Referenced from: /usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_sqlite3.so
Reason: image not found

 

てな感じに、『sqliteのイメージが見つかんないよ』と言われてしまう。

ということで、おいでませStackOverflow!

エラーメッセージで調べてみると、それっぽい記事を発見

http://stackoverflow.com/questions/15595473/python-import-sqlite-error

 

この記事のとおりに試してみます。

まずは、HomeBrewでインストールしたSqliteとPythonをアンインストールします。

brew rm sqlite python

 

そして、再度Pythonのみをインストールします

brew install python

 

pythonのインストール時に、合わせてSqliteも入るため、そっちを使うようにするようです。

 

とりあえず、これでうまくdev_appserver.pyが動くはずです。

自分の環境では、app.yamlの構文エラーで失敗しましたが・・・。

2013年9月24日火曜日

Go言語からNeo4jを試してみる

ここ一年半ほどあるものを実装しようとモヤモヤしていたのですが、先週元上司との会話の中でヒントをもらった気がしたので、グラフDBをためしてみることにしました。
グラフDBは初挑戦のため、情報も多いメジャーどころのNeo4jを使用することにしました。
そもそもグラフDBとはなんぞや?って人は各々ググッてください。

◯Neo4Jのインストール

とりあえずローカルで試せればいいので、brewから一発でインストールします
brew install neo4j
で、インストールが終わったら、
neo4j start
で実行させるのですが、Neo4jの動作にはJava7が必要ということらしく、Oracleのサイトからダウンロード&インストールを行いました。
再度 neo4j start コマンドを実行すると、文句を言われながらも、サーバーが立ち上がります。
$ neo4j start
WARNING! You are using an unsupported version of the Java runtime. Please use Oracle(R) Java(TM) Runtime Environment 7.
Using additional JVM arguments: -server -XX:+DisableExplicitGC -Dorg.neo4j.server.properties=conf/neo4j-server.properties -Djava.util.logging.config.file=conf/logging.properties -Dlog4j.configuration=file:conf/log4j.properties -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -Dneo4j.ext.udc.source=homebrew
Detected installation in launchd, starting it...

 サーバが正常に立ち上がったら、Web管理者用ページを開いてみます。
open http://localhost:7474/webadmin/
Neo4j 001
上記の画面はいくつかテスト的にデータを突っ込んだ後の状態になっています。
とりあえず、ここまで確認できたら、インストールは完了です。


◯Go言語用クライアントをインストール

Go言語のライブラリを探す際は、
  • できるだけ最近更新されており
  • こまめにコミットされている
を基準としてるため、Neo4jを試した日(2013/09/23時点)で、最も上記に当てはまった
jmcvetta/neoism
 を採用しました。
ということで、さくっとインストールを行います。
$go get github.com/jmcvetta/neoism

◯データの登録

Go言語からデータの登録を行います。

上記のコードで、一個のルートノードに対して、5つの子ノードを、"ConnectTo"というリレーションで接続したグラフが作成されます。
fmt.Printlnで表示しているルートノードのIDはメモっておきましょう。この後使用します。


◯データの検索

RDBのSQLの様に、Neo4JではCypherというクエリでデータの作成、検索を行えます。
先ほどの
http://localhost:7474/webadmin/
にアクセスして、Power tool Console タブを選択します。
Neo4j 002
そして、コンソールに対して、以下のクエリを入力します。
START a = node([先ほどの実行結果のID])
MATCH a-[r]->b
RETURN a,r,b;
Neo4j 003

START句は、検索開始のノードを指定します。
今回は自分の環境での実行結果が、ルートノードID=20だったため、node(20)を開始ノードとして設定しています。
そして、開始ノード に対して a という別名を定義しています。

MATCH句は、検索対象のパターンを記載します。
MATCH a-[r]->b
は、aに接続されている、リレーション r と、子ノード bという意味合いです。
それぞれ、a, r, b という別名が定義され、以降は別名で参照することができます。
なおここで、リレーションの種類を指定したい場合は、[r]の代わりに
MATCH a-[:ConnectTo]->b
と記載することで、aとbをつなぐリレーションをConnectToのみに限定することができます。

RETURN句はそのまま、返却する値を定義します。
ここで指定した別名がそのまま実行結果として返ってきます。
RDBでいうところのSELECT句ですね。

と、比較的わかりやすい構文で構成されています。
構文についは、Consoleの左サイドバーにチートシートがあるので、いろいろ試してみると新しい発見があるかもしれません(僕もまだ全部は見てないです)

◯感想

触ってみた感想としては、RDBとは異なったパラダイムですが、Cypherが比較的理解しやすいのと、データ構造が人間に理解しやすい形のため、
さわりの部分で投げ出すことはなさそうです。
とは言え、『やっと動かせた!』ってレベルなので、そもそも僕の目的にあっているのか吟味しながら触っていこうと思います。