読者です 読者をやめる 読者になる 読者になる

雑多なノート

プログラミング初心者がメモとかを書きます。基礎的なこともメモとして。偏食系のアニオタ。

Djangoでクエリ文字列を使う

Djangohttp://hogehoge?key=value形式の値の取得をした
url.pyで色々やって取得するのかと思ったけど見つからなかった

url.pyでは特に指定せずにrequest変数から取得できるらしい

def query_test(request):
    req_string = request.GET.get('name',1)

1つ目の引数がキーで2つ目がデフォルトの値らしい
古い記事しか見つからないのはこういうやり方は流行りじゃないからなのだろうか

X11ポートフォワーディングに失敗する

いつのまにかX11ポートフォワーディングに失敗するようになっていた

[vayacico@rabbit ~]$ xeyes
Error: Can't open display: localhost:10.0

OS再インストールしてから1回もやってなかった気がしたので何か入れるものあるのかと思ったけど設定ファイルがおかしかっただけだった

無駄にデスクトップ環境入れてしまった……

localhostping打って気付いたのだけどlocalhostが名前解決されないのが原因だったっぽい

[vayacico@rabbit ~]$ ping localhost
ping: unknown host localhost

ホスト名を変えるときに/etc/hostsのからlocalhostを消してしまったのが原因だったみたい

127.0.0.1   rabbit localhost.localdomain localhost4 localhost4.localdomain4
::1         rabbit localhost.localdomain localhost6 localhost6.localdomain6

127.0.0.1   rabbit localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         rabbit localhost localhost.localdomain localhost6 localhost6.localdomain6

のようにlocalhostを追加することで解決

ググっても全く引っかからないから焦った

まあこんなへまする奴が自分以外に居ないってことなんだろうけど

解決のために色々設定弄ったから変なところに影響でたら嫌だなぁ


そういえばGUIの動作確認でおなじみのxeyesってなんのために入ってるんだろ…?
何となくかわいいけど

X11ポートフォワーディングに失敗する

いつのまにかX11ポートフォワーディングに失敗するようになっていた

[vayacico@rabbit ~]$ xeyes
Error: Can't open display: localhost:10.0

OS再インストールしてから1回もやってなかった気がしたので何か入れるものあるのかと思ったけど設定ファイルがおかしかっただけだった

無駄にデスクトップ環境入れてしまった……

localhostping打って気付いたのだけどlocalhostが名前解決されないのが原因だったっぽい

[vayacico@rabbit ~]$ ping localhost
ping: unknown host localhost

ホスト名を変えるときに/etc/hostsのからlocalhostを消してしまったのが原因だったみたい

127.0.0.1   rabbit localhost.localdomain localhost4 localhost4.localdomain4
::1         rabbit localhost.localdomain localhost6 localhost6.localdomain6

127.0.0.1   rabbit localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         rabbit localhost localhost.localdomain localhost6 localhost6.localdomain6

のようにlocalhostを追加することで解決

ググっても全く引っかからないから焦った

まあこんなへまする奴が自分以外に居ないってことなんだろうけど

解決のために色々設定弄ったから変なところに影響でたら嫌だなぁ

RのigraphでgraphML形式を読み込む

簡単に読み込めるって聞いたからわざわざgraphML形式でエクスポートしたというのに何故か読み込めなかった

read.graph("test.graphml", format="graphml")
Error in read.graph.graphml(file, ...) :
At foreign-graphml.c:1007 : GraphML support is disabled, Unimplemented function call

調べたらigraphをインストールする時にライブラリが不足してると無効になるらしい

まずはlibxml2-develをインストール

[vayacico@lavie ~]$ sudo yum install libxml2-devel

その後igraphのインストールをやり直すことで解決した
特にアンインストールとかは必要なかった

> install.packages("igraph", dependencies = TRUE)

Neo4jのデータをGraphML形式でエクスポート

Neo4jに貯めこんだデータをRで使いたくなったのでGraphML形式でエクスポートを行った

Web管理画面からじゃなくてシェルからコマンドを実行するらしい

neo4jの実行ファイルと同じディレクトリにあるneo4j-shellを使う

[vayacico@lavie bin]$ ./neo4j-shell 
Welcome to the Neo4j Shell! Enter 'help' for a list of commands
NOTE: Remote Neo4j graph database service 'shell' at port 1337

neo4j-sh (?)$ 

export-graphmlなるコマンドを使うと出来るらしいのだけどエラー

neo4j-sh (?)$ man export-graphml
No manual entry for 'export-graphml'

どうやら含まれていないらしい

neo4j-sh (?)$ help
Available commands: alias begin call cd commit create cypher dbinfo drop dump env explain export foreach gsh help index jsh load ls man match merge mknode mkrel mv optional paths planner profile pwd return rm rmnode rmrel rollback runtime schema set start trav unwind using with
Use man <command> for info about each command.

exportってコマンドがあったけどシェルのEXPORTと同じものみたいだった
どうやら自分で持ってこなければいけないらしい

neo4j-shell-tools からneo4j-shell-tools_3.0.1.zipをダウンロードして解凍する

[vayacico@lavie tmp]$ wget http://dist.neo4j.org/jexp/shell/neo4j-shell-tools_3.0.1.zip
[vayacico@lavie tmp]$ unzip neo4j-shell-tools_3.0.1.zip 
[vayacico@lavie tmp]$  ls
geoff-0.5.0.jar  import-tools-3.0.1.jar  mapdb-0.9.3.jar  opencsv-2.3.jar

解凍して出てきたファイルをneo4jのlib/以下にコピーする

[vayacico@lavie tmp]$ cp * /opt/neo4j-community-3.0.7/lib/

neo4j(本体)を再起動してもう一度neo4j-shellを起動すると使えるようになっている

[vayacico@lavie bin]$ ./neo4j-shell 
Welcome to the Neo4j Shell! Enter 'help' for a list of commands
NOTE: Remote Neo4j graph database service 'shell' at port 1337

neo4j-sh (?)$ man export-graphml

  
  -o     Output GraphML file.
  -r     Add all nodes of selected relationships.
  -t     Write key types upfront (double pass).
  
neo4j-sh (?)$ 

あとは出力ファイル名とクエリを引数として与えるとグラフがエクスポートできる

neo4j-sh (?)$ export-graphml -o output.graphml match (n:Foo)-[r]->() return n,r
Wrote to GraphML-file output.graphml 0. 100%: nodes = 165 rels = 27390 properties = 27885 time 5712 ms total 5712 ms


ここまでやってから気付いたけど普通にRから直接Neo4jにアクセスできるのねー

Neo4jでINDEXの追加

データが増えてきてMERGEに時間がかかるようになってきたのでインデックスを追加してみた

CREATE INDEX ON :User(userId)

これだけ
データ数のわりにすぐに完了した
MySQLとかと違って存在しないラベルやプロパティを指定してもエラーにはならないみたい

インデックスを作成したら大体10倍くらい早くなった
とくにクエリに記述しなくても勝手にインデックスを使って検索してくれるみたい
強制的に使わせるみたいなのもあるみたいだけど

強制終了の理由とMySQLの仕様

前回のつづき
どうやらPerlで(たぶんPerlに限らないけど)MySQLからデータ持ってこようとすると全ての結果をクライアント(Perl側)に持ってきてから処理を行うようになってるみたい


PerlのDBD::mysqlではMySQLからデータを持ってくるときにmysql_store_result()というAPIをデフォルトで使っている

このAPIは全データをクライアントに持ってくるように作られてるらしく,そのせいでメモリ使いすぎてout of memoryになったっぽい
要するにレコード多すぎってだけだけど


mysql_use_result()っていう1つずつデータ持ってくるAPIもあってオプション付ければDBD::mysqlからも使えるらしいけど,データベースを長い間ロックしてしまうというデメリットがあるらしい
そのせいでデフォルトでは使わないようになってるんだとか

mysql_use_result使うと色々面倒そうだし素直にLIMIT使って結果を減らすかー
初心者が推奨されない方法を使うと録なことないし