Author Archives: oreore

Re:dash

redash_screenshot_dashboard

http://redash.io/

BIツールと呼ぶには微妙ですが、データを可視化するにはかなり便利なツールといえるre:dash。

何が便利かと言えば、新たに憶えることが最小でグラフ等を自在に出力出来るようになります。

 

Re:dashの概要

DBにクエリーを投げて、結果をグラフなどに紐付けを行い、チャートの種類などを選べばグラフを生成して くれます。一般的なBIツールだとDB等に接続しそのBIツールのルールなり操作方法に従いチャートを生成するのでBIツールの機能習得が必要となります が、re:dashは表示方法の種類を憶える程度ですので習得が早い上に他人に教えるのも安易となります。

 

セットアップ

AWSのイメージ(AMI)から構築がとても楽。それ以外でもセットアップ可能ですが、かなり面倒ですので頑張って自前で構築するよりもAWSにアカウントを作ってAWSを憶えた方が早く構築出来るでしょう。唯一の注意点は、UbuntuでEC2を構築するとログインユーザーがubuntuになること(サーバーにログイン出来なくて1時間ほど悩んだ・・・・)。

 

様々なDBに接続

MySQLやPostgreSQLなど一般的なDB以外でもBigQueryやPrestoなどもサポートしています。

 

活用方法newplot

まだテスト導入ですが、手元にあるデータでいろいろ試しています。例として、電子書籍のリアルタイムダウンロード件数の確認や、カテゴリーの増減推移の確認。GoogleAnalyticsのデータをBigQueryにインポートせさ(GAのプレミアム登録が必要)、そのBigQueryからリファラーのグラフ化など。表示方法でSQL文に悩むことがありますが、逆にSQLで出来ること出来ないことが判断可能となるので可否の判断は早いと言えます。

 

Re:dash開発状況

今現在(0.91)のバージョンでそこそこ安定してきました。バージョン0.8以前はバグが多かったのでオススメするには微妙でしたが、簡易に使う分には問題ないでしょう(但しまだそこそこバグは残っています)。

 

csv出力時の文字コードの変更

エクセルの日本語版はcsvを読み込む時にShift-JIS(cp932?)固定となっています。re:dashはUTF-8でcsvを出力するので日本語があると文字化けを起こします。以下のファイルを修正すればShift-JISで出力されます。

/opt/redash/current/redash/utils.py

ただgithubを見たらxslx出力のPRがあるので次バージョンあたりにxslx出力が実装されるかもしれませんが。

 

追記

バージョン0.92でxslx出力が追加されました。

csvの出力周りのファイル名が変更になっています(/opt/redash/current/redash/utils/__init__.py)

集計プログラムにおける言語速度比較(PHP Perl Java Go)

(プログラムにバグがあったので計測やりなおして再投稿)

Perlでガリガリと解析しているのですが解析速度がどうしても遅い。単発作業ならまだしも、定期的に依頼が来るとプログラムの遅さが重なり結構な時間が掛かってしまいます。

そこで他の言語を使い速度比較。Go、PHP、Javaで似たようなコードを書いて時間計測でベンチマークを取ります。

ただ最初にお断りしておくと、昨今の流行りのデータマイニングではなく導線比較や継続集計(analysis)といったアクセス解析的なプログラムで、且つ一部分での比較となります。

元のPerlプログラム(比較用に遅い部分を切り出し)。

データベースAから取得したuser_idとデータベースBの入会データをマッチさせて、マッチした情報を一時テーブルに入れるだけ。最適化も何もしていないので突っ込みどころの多いコードですが、実際の集計だと手直しや仕様変更や概念違いによる書き直しが多いので、面倒な記述はなかなか出来ないのです(bind_columns使えとか1行insertにしろとかthreadsで投げろとか聞こえてきそうですが)。

で、これを他の言語に書き換えて時間を測ります。PHPとJavaとGo言語のプログラムは一番下に記します。

速度予想

Go言語>Java>PHP>Perlの順で早いだろうと予想(PHPとPerlは誤差程度)。もしくはほぼ誤差で変わらず。MySQLやI/O負荷がボトルネックになりあまり差がでない可能性も考えました。一抹の不安はJavaがソケット接続出来ずにポート接続になること。

結果

CPU:Pentium G3258  SSD:M5Pro

timeコマンドで計測

Go PHP Perl Java
real    0m13.598s
user    0m1.054s
sys    0m1.287s
real 0m10.412s
user 0m0.799s
sys 0m0.862s
real 0m9.709s
user 0m1.694s
sys 0m0.452s
real 0m17.294s
user 0m6.189s
sys 0m1.124s

Perl>PHP>Go言語>Java

Perl速い。Java遅い。

Javaの遅さは後ほど考察。何も考えずにダラダラ書くと世間で言われている通り遅くなります。

ここまでの感想

Goが予想に反して速くない。ただ改善の余地はありそう。PHPとPerlはインタプリタ言語らしくほぼ変わらず。たぶんRubyやPythonも(巷のベンチマーク結果から勘案して)それほど変わらないでしょう。Javaは困った。

ソケット接続からポート接続に変更

Javaは言語仕様でソケット接続がサポートされていないらしい。よって他の言語もポート接続に変更して再実行。

Go

PHP

Perl

ポート接続の結果

Go PHP Perl Java
real    0m15.809s
user    0m1.201s
sys    0m1.896s
real 0m12.665s
user 0m0.947s
sys 0m1.492s
real 0m11.819s
user 0m2.068s
sys 0m0.883s
real 0m17.294s
user 0m6.189s
sys 0m1.124s

どの言語もJavaに近い数字に。とりあえずポート接続の方が遅いですが1割程度のダウンだとコスト的には気にならないかと。

Java修正

ループの中で毎回PreparedStatementはご法度らしい。ループ外に出して再度計測。

ループ内で毎回セットしていたのをループ外に出してsetStringとexecuteQueryだけをループ内で回す。

Java(改善前) Java(改善後)
real 0m17.294s
user 0m6.189s
sys 0m1.124s
real 0m14.723s
user 0m3.705s
sys 0m0.827s

PHPやPerlに近づいてきた。ただしexecuteQuery()が遅さの9割以上を占めるのでこれ以上は改善の余地はなさそう。憶測だけれどたぶんJDBCが遅い。

ついでに他の速度改善を試みる

プレースホルダが重そうなんで取っ払う。社内システムなら必要性なし。可読性は落ちるけれど。

Go(socket) PHP(socket) PHP(port) Perl(port) Java
 real    0m11.660s
user    0m0.723s
sys    0m0.927s
real    0m7.810s
user    0m0.438s
sys    0m0.431s
real 0m9.237s
user 0m0.451s
sys 0m0.764s
real 0m12.149s
user 0m2.170s
sys 0m1.008s
real 0m14.376s
user 0m3.516s
sys 0m0.839s

PHPが大きく改善。2割以上の速度アップでPerlより速くなった。文字列処理の得手不得手かも。他に組み込み関数の強さを発揮しています。

まとめ

というか全体的な考察。Goが予想に反してそれほど速くない。後日SELECT周りをいじってみます。

意外と速かったのがPHP。ソケット接続でプレースホルダを使わないとJavaの2倍ほど速度が出ている。これは全くの予想外で、大量のデータを扱うときに有用でしょう。

Javaは重くなりそうな処理を常に意識しなければならないので、しっかりとプロジェクトを組める案件じゃないと難しい。

Perlはまあ適当に書いて適当に動かす用途に丁度いい。下手に書いても速度が変わらないのはありがたい。

 

Go

PHP

Java(遅いコード)

Java(PreparedStatementをforの外へ)

 

 

黄ばんだキーボード(プラスチック)を白くする

10年モノのRealForceが黄色くなり見た目が悪いので買い換えようとしたが、実験的なオモシロ作業を思い出したので試してみた。

IMG_2529

元ネタ – Retr0bright

過酸化水素と紫外線(日光またはブラックライト)で黄ばみを取ります。

過酸化水素を入手するのが面倒なのでワイドハイターexで代用。コンビニで売ってる。

IMG_2534

 

1本200円くらい。2本買ってきて漬けます(水を同容量ほど足しています)。

IMG_2538

キッチンペーパーで覆っても可。

さすがに冬場は日光に当てるのが住宅街だと難しい。ただ紫外線は日陰でも50%程度はあるらしいので、漬け置き時間でカバーします。

で、3日間漬けた結果がこんな感じ。

IMG_2540

 

だいぶ白くなった。まだまだ使える。

Dockerをドッカドッカと構築する

nigaraです。タイトル寒い。

CentOS6でDockerの構築。

Dockerインストール

  • epelレポジトリの追加。CentOS7は必要なし。

  •  dockerインストール。

Screenshot_from_2015-01-20 11:47:47

yum searchするとdockerとdocker-ioが表示されますが、dockerは同名の別物ですのでdocker-ioをインストールしてください(CentOS7だとdockerですが)。

  • docker起動

Screenshot_from_2015-01-20 11:48:40

以上でdocker本体の準備は終了。なんとも楽。

 

Docker操作

  • OSイメージの取得

Screenshot_from_2015-01-20 11:49:39

とりあえずubuntuを取得。他にFedoraやSlackwareなどもありますので、「docker search」やDocker Hub Registryで探せます。

  • OSイメージの確認

Screenshot_from_2015-01-20 11:50:12

取得したイメージが表示されます。

  • 起動&ログイン

Screenshot_from_2015-01-20 11:50:37

実はpullしないでrunしても自動でイメージを取得してくれます。

  • ログアウト&終了

ログアウトと同時にubuntuも終了します。

  • 再起動&再ログイン

まず コンテナ一覧を表示させる。

起動は「docker start (CONTAINER ID)」。

ログインは「docker attach (CONTAINER ID)」

  •  終了させずにログアウト(dettach)

Ctrl-pの次にCtrl-qでdettach。もしくはrunするときに

-dオプションを付ける。

  • コンテナ削除

コンテナを調べる

起動していたらストップ

削除

 

とりあえずdockerの基本的な使い方まで。

 

 

Seleniumでブラウザ操作

nigaraです。

ブラウザを自動で動かしてデータ取得やテストを行う場合にSeleniumを使うと大抵の動作はプログラミングで可能となります。また、wgetやPerlのLWP等ではjavascriptでの遷移やPOST送信が出来ませんが、Seleniumならそれらも可能。

さらには仮想デスクトップでも動かせるので、X環境のないLinuxでもブラウザでの自動化処理が出来ます。

Selenium環境構築例(CentOS Python)
・Firefoxを仮想画面で動かす準備

・SeleniumをPythonで動作させる

あとはPythonでプログラムを書いて実行させるだけ。

で、そのPythonプログラムですが一から書くのは面倒なのでFireFoxのアドオンでSelenium IDEをインストールし、マウス操作を記録させれば簡単にコードが生成されます(VBAのマクロ自動記録の様なもの)。

・FireFoxアドオン
Selenium IDE
Selenium IDE Button
Selenium IDE:Python Formatters

スクリーンショット 2014-12-22 20.52.33

特定の言語として保存するには「ファイル」→「テストケースをエクスポート」で指定の言語のWebDriverで出力。
Pythonなら「Python 2 / unittest / WebDriver」となります。

・実行

ダウンロードも自動化が可能ですが、ブラウザを動かしているのと同じ挙動ですのでそのままだとポップアップが出てしまいそれ以上の操作が不可能となります。そこでダウンロードの場合はポップアップを出さないpreferenceを組み込めば回避出来ます。

・設定例

Seleniumはテストだけではなく、社外システムから自動でデータを取得したい場合にも便利。

 

MySQLチューニング(その3)

nigaraです。
つい先日MySQL増強をやったので内容をつらつらと。

・システム
大量のログを管理(集計)するシステム

・問題
バッチ処理が遅くなっている。原因はデータ量が巨大なためI/Owaitが増大。古いデータを一切削除出来ないのでソフトウェア対応が不可能。

・対応方法
サーバーを強化。速いサーバーにMySQLを移設。

・新旧サーバースペック
旧 HP DL360G6 SATA500Gx2 RAID1
新 at+link富士通サーバー FJ03-G2 SAS300Gx6 RAID10

・ベンチマーク(fio)

fio -filename=/tmp/test2g -direct=1 -rw=randread -bs=4k -size=2G -numjobs=64 -runtime=10 -group_reporting -name=file1

旧 read : io=31352KB, bw=3073.8KB/s, iops=768 , runt= 10200msec
新 read : io=183680KB, bw=18288KB/s, iops=4571 , runt= 10044msec

・稼働時vmstat
vmstat cpuのwa
旧 最高時22
新 最高時7

・所感
SATAでRAID1は遅すぎますよ。SAS6本でRAID10だと3倍〜6倍ほど性能が上がります。本来はSSDを導入したかったのですが諸般の事情(保守の面倒とか等)を考慮して見送りに。あとSSDでRAIDでHotSwapは現在発売されているのRAIDカードだと無理みたい。

ちなみに会社に転がっていたFusion-ioでのベンチマーク結果も以下に(上記fioと同じ)
read : io=3822.7MB, bw=391356KB/s, iops=97839, runt= 10002msec

SATAの100倍ですよ・・・・。

Komodo Edit (IDE)

nigaraです。

開発ツール探しで彷徨ってたら以外と良いエディター(IDE)を見つけたのでざっと紹介。

Komodo Edit (IDE)
Komodo
スクリーンショット 2014-06-26 11.29.30

・Editは無料。IDEは有料
通常利用ならEditで充分。IDEだとbreakpointなどいろいろ使えるようになります。

・関数説明
スクリーンショット 2014-06-26 12.02.50
画像のように「substr」と入力するとその関数の説明が出てきます。言語によって引数の順番が違うので何気に便利。

・コード補完
スクリーンショット 2014-06-26 12.09.02
パスを通してあれば自前のpmも補完しれくれる。

・リアルタイムsyntaxチェック
スクリーンショット 2014-06-26 12.28.39
宣言の重複とかsyntax等をその場で警告してくれます。

・サポート言語
スクリーンショット 2014-06-26 11.51.55
そこそこ豊富。さらにコード補完の対応言語も多い。

・リモート接続した先のファイルを直接編集
sshやftp先のファイルを直接編集出来る。ただその場合はパスが通らないのでsyntaxが面倒に。
(オススメは別のftpソフト等でマウントし、そのディレクトリ以下を編集すればパスは通る)

昨今の他のIDEに比べ遜色ない作りとなっています。ただ唯一の欠点は若干動作が重い。
Core2DuoのiMacでやっと使えるぐらい。最近の機種なら大丈夫かもしれませんが。

search_arrayやin_arrayは遅いので・・・

nigaraです。

最近大量のデータ解析をやってるのですが、何も考えずに配列に突っ込んで検索してたら処理が終わらなくなったでござる。

例えば以下のようなコード

$datasの要素数は76070。$user_id_datasの要素数は1117。

掛かった時間は10.5 sec。検索元の要素数が増えると1(n)となり全く終わらなくなる・・・。

そこでこのデータを配列ではなく連想配列に入れ、keyの評価にすると一気に改善します。

0.8 sec。10倍以上、検索が増えればさらにその差は開きます。

PHPに限らずPerlも同じで

grepで検索だと7秒。

連想配列だと0.2秒。こちらも大幅に速くなります。

業務では配列の検索を極力使わないか、いっそ禁止にした方が良さそうですね。

DN2820FYKのBIOS

DN2820FYKのBIOSを0021にupdateしたら大問題発生。これは地雷BIOSです。症状はUSBが認識しなくなるので一切操作出来なくなる。起動時にgrubまでは問題ないのですが、OSが立ち上がるとkernelがエラー吐いてUSB機器を認識しなくなります。OSも疑ったのですが、OS再インストールを試みるもUSBが認識しなくなるのでインストールが出来なくなります。

不具合に遭遇してる人はBIOSの問題だと思いますので・・・と書いてたら新BIOSがリリースされてますね。バージョンは0025。

今試しましたがUSBの不具合は解消されています。旧BIOSだとHDMIが未接続だと起動出来ませんでしたが、新BIOSは未接続でも起動します。あと若干ネットワークの速度が上がってますね。

と言うわけで、問題が出ている場合はBIOSバージョンを確認してみるのが良いかもしれません

DN2820FYKHの消費電力とベンチマーク

前回からの続き。(*ベンチマークを追記)

DN2820FYKHの消費電力

消費電力が驚異の少なさです。アイドル時で5W。x86でチャンピオン級な低消費電力です。

IMG_1609

yes >> /dev/nullを2つ回して負荷を掛けても8W。

IMG_1612

予想以上に省電力すぎて驚きました。

 

DN2820FYKHのベンチマーク

性能比較を判りやすくするためにWindows8.1(64bit)を入れて諸々試してみました。

スーパーパイ104万桁は34秒。

IMG_1613

 

CINEBENCHはOpenGLが2.75fps。CPUが70cb。

IMG_1628

モンハンベンチ大討伐は745。

IMG_1619

FFベンチ3はLowで4559。

IMG_1623

ゲームはさすがに厳しいですね。ブラウザゲーム(艦これ)程度までならなんとか動きそう。

DN2820FYKHの位置づけですが、以前のAtomよりは全然速いけどCerelonには届かず。ARM並の省電力で性能はARMよりかなり高い。用途としてはサブPCやNAS、もしくはテレビに繋ぐリビングPCあたりでしょうか。あとファンの音ですが、デフォルトは一般的なノートPC並の音量があります。ただBIOSで回転数の調整が出来ますので、かなり静かな回転数に落とす事も可能です。