Programming」カテゴリーアーカイブ

Parallelization bug in Graphlab Create 2.1

There seems to be a parallelization bug in Graphlab Create 2.1.

When calling SGraph.triple_apply() with a function which updates edge attributes, the result becomes non-deterministic in the parallel processing situation.

To solve this problem, set the number of Graphlab’s worker threads to 1, which can be done as follows.

graphlab.set_runtime_config('GRAPHLAB_DEFAULT_NUM_GRAPH_LAMBDA_WORKERS', 1)

Though it seems OK to update node attributes in parallel, I’m not sure whether the number of workers can be changed after once initiated.

NetworkX から、Graphlab Create に乗り換えた話

長らく(2年くらい)NetworkX のユーザだったが、今回 Graphlab Create に乗り換えた。それと同時に、pythonz + virtualenv から、anaconda に乗り換えた。

ここに書いていることは、自分が何か大事なことを勘違いしていなければ恐らく当たり前のことなので、わざわざ言わなくても、と思われかねない。だけど、グラフのプラットフォームを調べている初学者には多少有用かもしれないので書き残しておく。 続きを読む

Pythonz で Python のインストールが失敗する原因と対策


OS やアプリのバージョンがまちまちな複数の共有マシンで作業することが多い。Python やライブラリのバージョンを揃えたいとき、ユーザーディレクトリに Python をインストールするツールとして Pythonz や Virtualenv は便利だ。

これらなしの Python 環境は考えられないくらい依存しているのだけれど、今日 CPython 3.5.2 をインストールしようとしたら失敗。その環境には、自前で Gcc 4.8.4 をいれていたこともあり、色々試行錯誤するも改善せず。

ふと思って、make の並列化を無効化したところ、コンパイルが通る。このパターンか…と思いつつ、Pythonz から無効化する術がないことを知りしょんぼり。とりあえず Pythonz を一部書き換えてインストール成功。

こういうことは他の環境では起きたことがないので再現性低そうだなと思いつつ、時間があったら Pull request 送ってみようかな。

Virtualenv 環境からサブシェルを作って deactivate すると環境変数がおかしくなる問題の解決方法

Python の個別の環境を作る Virtualenv を Pythonz と組み合わせて使っているけど、tmux と組み合わせて使った時になんかおかしいなーと思っていた。

Virtualenv を activate したシェルから tmux を立ち上げると、tmux の中のシェルはサブシェルになる(と思ってるけど違うかもしれない)。

virtualenv は activate 時に deactivate が呼ばれるんだけど、うまく deactivate できなくなっていておかしくなる。これは、activate 前の PATH をシェル変数に保存しているんだけど、そのシェル変数がサブシェルに引き継がれないことが問題。これをサブシェルに引き継ぐためには export して環境変数にしておけば良い。ということで、activate ファイルを書き換えて環境変数として export されるようにしたところ解決した。

ラジオ日経第2の曲情報を Mac の通知センターに通知する

動機

作業するときの多くの時間はラジオ日経第2(RN2)を聞いている。いろいろな曲が朝8時から夜11時まで流れているのでとてもありがたい。

聴く際には、Adobe Air で作られた Radiko ガジェットを利用しているけど、RN2は再生中の曲の情報がツールに表示されない。再生中の曲情報も公開されているけど、タイミングがあまり正確でないのと、ブラウザで表示するというのがイマイチだったので、Mac の通知センターに再生中の曲を表示する Python スクリプトを作ってみた。

ポイントは以下の3点

  • terminal-notifier という素晴らしいツールの利用
  • タイムテーブル が JSON 形式で取得できる
  • アートワークを表示できるようにしてるけど今はできない

JSON 形式の中身が結構充実していて、アートワークの URL も含まれていたりするので、通知する際の画像 URL に指定するとアートワークが通知センターに表示されて結構気に入っていた。

ところがこれらの画像の URL は HTTP なので、App Transport Security の仕様変更で表示されなくなってしまった。確かに、外部から取得した URL に対してさらにアクセスすることになるから、脆弱ではある。曲名とアーティスト名がわかることが第一の目的なので、とりあえずはブロックされたまま保留中。

C++ で正規表現を使うときには g++-4.9 以上が必要

C++ で正規表現(regex)を使おうと思って、プログラムを作成していた。コンパイルは通るけど、どうも動作が思ったようにならない。しばらく悩んだ結果見つけたのが以下。

Is gcc 4.8 or earlier buggy about regular expressions?

4.8 以下のバージョンだと正規表現がちゃんとサポートされてないという話らしい。というわけで、g++-4.9 をインストールしたところ所望の動作を得られた。

regex_match() 便利でいい。