UbuntuでのImageMagickの”unable to read font `helvetica'”

UbuntuでのImageMagickのconvertコマンドで”helvetica”フォントがない、というエラーが出ることがあります(docker環境とかで特に)。

% convert in.jpg -annotate +10+50 "Hello World" out.png
convert-im6.q16: unable to read font `helvetica' @ error/annotate.c/RenderFreetype/1338

ぐぐるといろいろな解法が書いてありghostscriptの導入などもありましたが、自分の場合Ubuntuではgsfontsをapt installすることでした。

% sudo apt install -y gsfonts

参考
ImageMagick 画像中に文字を入れる – Qiita

2022シーズンのJリーグ公式戦試合日程ical電子カレンダーデータ

2022シーズンのJリーグの全日程も無事発表されました。
今季は開幕戦の発表が非常に早かったので例年であれば遠征計画を立てるのにとても助かったところですが、いかんせんコロナ禍とあって遠征計画の立てようがないのがモヤモヤするところです。

http://2022シーズンの日程が発表【Jリーグ】:Jリーグ.jp

観戦に行ける試合を検討するために電子データ形式でiPhoneやGoogleカレンダーに推しチームの全日程が今すぐ入ってほしい皆さんのために、おそらく日本最速(?)でicalカレンダー形式のデータを作成しました。
jleague2022-ical – Google Drive
これらのicsファイルは再頒布不可とします。Google Calendar等に取り込んだ上で共有カレンダーとすることは不可です。個人のカレンダーのみでご利用ください。

Jリーグデータサイトの日程表を手作業でCSV化し、こちらの自作script(その後Github化)でical形式に変換したものです。コードについてはMITライセンスとします。

活用方法としては、PCやスマートフォンであればicalファイルをダウンロードしてそのまま開くと標準のカレンダーアプリに取り込むことができます。またicalファイルをダウンロードしGoogle Calendarに取り込むことも可能です。
内容の正誤および今後の日程の確定に伴うアップデートについては一切無保証です。

今はとにかくコロナ禍が早く収束し観戦に足を伸ばせるようになることを願い、JリーグファンとしてはJリーグと世間様の足を引っ張るような行動をしないよう気をつけたいものです。
なお、Jリーグのマスコットはレノ丸が最強です。



変換スクリプトで地味にハマったところメモ

  • ブラウザからcsvにコピペするとSJISになってしまうこと
  • ical形式のタイムゾーン指定。とくに、RFC2445を参考にしてZをつけてしまうとGMT扱いとなりカレンダー上で9時間ずれる

ZealをショートカットキーでToggleするためのshell script

DashのalternativeとしてLinuxマシンではZealを使っています。
Dashにはキーボードショートカット機能があり、指定したキーマップでDashのウィンドウのアクティブ・非アクティブをトグルすることができてとても便利です。
Zealには標準機能としてはこれがなくて、手で毎回画面を出し入れする面倒くささに真面目に対処してこなかったんですが、ちょっとUbuntuのキーボードショートカット機能とxdotoolによるウィンドウ操作を駆使して(というほどのことはしてない)一発でトグルできるようにするシェルスクリプトを書いたので自分用メモも兼ねて記録。

ウィンドウを操作するためにxdotoolが入っている必要があるのでaptで事前に入れておいてください。

Ubuntuの場合、設定方法は”Menu” -> “Keyboard shortcuts” -> “+ Add”で、このシェルスクリプトへのパスを追加するだけです(+xパーミッションをつけるかshを頭につけるかしないとエラーになります)。

Dashのキーボードショートカット機能ではDashをdeactivateするときDashウィンドウは最小化され見えなくなりますが、このシェルスクリプトでは単にZealを(このshell scriptで)activateする直前までactiveであったウィンドウを再びactiveにするのみで、Zealのウィンドウ自体はその元ウィンドウの後ろに行くだけで最小化されたり見えなくなったりはしません。
つまり、もしZealがactivateされたとき直前まで使っていたウィンドウを隠していない場合、deactivateされたZealは見えたままフォーカスだけが元のウィンドウに戻ります(元ウィンドウをZealが隠していた場合、元ウィンドウが最前面に出てくることに伴ってZealは隠されることになります)。
この挙動はデュアルスクリーンの左右でコーディングとZealを行き来するときに便利であると思います。

Dashと同じ挙動にする(Zealをdeactivateする際に最小化させる)場合、

xdotool windowactivate $LAST_ACTIVE_WINDOW_ID

となっているところを、

xdotool windowminimize $ZEAL_WINDOW_ID

と書き換えればOKです(それに伴ってCURRENT_ACTIVE_WINDOW_IDをこねこねしてる部分はまるっと不要になり、shell scriptはだいぶ軽くできます)。

Ubuntu MATE 18.04・Zeal 0.6.1・xdotool 3.20160805.1で動作を確認しています。

Core i7 7700Kとi7 9700KのUnixBench

あけましておめでとうございます。毎年が魚年です。

手元のデスクトップPCのベンチマークをUnixBenchでとってみたのでメモ。

項目 自宅新PC 業務PC 自宅旧PC
CPU i7 9700K
8C8T 3.6GHz TB4.9GHz
i7 7700K
4C8T 4.2GHz TB4.5GHz
i5 3570
4C4T 3.4GHz TB3.8GHz
メモリ DDR4-2666 8GBx2 (16GB) DDR4-2400 16GBx2 (32GB) DDR3-1600 8GBx2 (16GB)
SSD WD Black 500GB High-Performance NVMe Crucial MX300 525GB N/A (Live USB)
(本来はCrucial M4 256GB)
OS Ubuntu MATE 18.04.1 Ubuntu MATE 18.04.1 Ubuntu MATE 18.04.1 (Liveモード)
GCC 7.3.0 7.3.0 7.3.0

6年戦士の自宅旧PCがLive USBなのは、処分前でディスクをすでに抜いてしまっため。File Copy関連は参考にならない(低く出ているはず)です。

いずれもCPU scaling governerをperformanceにしています。

% sudo cpufreq-set -g performance

なおIntel CPU搭載のUbuntuであればperformanceとpowersaveモードが利用可能ですが、powersaveにしてもスコアは誤差レベルでしか変わりませんでした。

i7 9700K

X Benchmarks (Version 5.1.3)

   System: sillaginoid: GNU/Linux
   OS: GNU/Linux -- 4.15.0-43-generic -- #46-Ubuntu SMP Thu Dec 6 14:45:28 UTC 2018
   Machine: x86_64 (x86_64)
   Language: en_US.utf8 (charmap="UTF-8", collate="UTF-8")
   CPU 0: Intel(R) Core(TM) i7-9700K CPU @ 3.60GHz (7200.0 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   CPU 1: Intel(R) Core(TM) i7-9700K CPU @ 3.60GHz (7200.0 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   CPU 2: Intel(R) Core(TM) i7-9700K CPU @ 3.60GHz (7200.0 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   CPU 3: Intel(R) Core(TM) i7-9700K CPU @ 3.60GHz (7200.0 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   CPU 4: Intel(R) Core(TM) i7-9700K CPU @ 3.60GHz (7200.0 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   CPU 5: Intel(R) Core(TM) i7-9700K CPU @ 3.60GHz (7200.0 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   CPU 6: Intel(R) Core(TM) i7-9700K CPU @ 3.60GHz (7200.0 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   CPU 7: Intel(R) Core(TM) i7-9700K CPU @ 3.60GHz (7200.0 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   00:01:57 up 2 min,  4 users,  load average: 0.14, 0.05, 0.01; runlevel 2018-12-31

 ------------------------------------------------------------------------
Benchmark Run: 火  1月 01 2019 00:01:57 - 00:32:27
8 CPUs in system; running 1 parallel copy of tests

Dhrystone 2 using register variables       62027018.9 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                     3567.3 MWIPS (25.1 s, 7 samples)
Execl Throughput                               5934.1 lps   (30.0 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks       1738508.8 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks          457482.9 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks       4629351.3 KBps  (30.0 s, 2 samples)
Pipe Throughput                             2933013.1 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                 282824.7 lps   (10.0 s, 7 samples)
Process Creation                               2678.1 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                   3386.2 lpm   (60.0 s, 2 samples)
Shell Scripts (8 concurrent)                   5832.1 lpm   (60.0 s, 2 samples)
System Call Overhead                        4218840.7 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0   62027018.9   5315.1
Double-Precision Whetstone                       55.0       3567.3    648.6
Execl Throughput                                 43.0       5934.1   1380.0
File Copy 1024 bufsize 2000 maxblocks          3960.0    1738508.8   4390.2
File Copy 256 bufsize 500 maxblocks            1655.0     457482.9   2764.2
File Copy 4096 bufsize 8000 maxblocks          5800.0    4629351.3   7981.6
Pipe Throughput                               12440.0    2933013.1   2357.7
Pipe-based Context Switching                   4000.0     282824.7    707.1
Process Creation                                126.0       2678.1    212.5
Shell Scripts (1 concurrent)                     42.4       3386.2    798.6
Shell Scripts (8 concurrent)                      6.0       5832.1   9720.1
System Call Overhead                          15000.0    4218840.7   2812.6
                                                                   ========
System Benchmarks Index Score                                        1977.0

 ------------------------------------------------------------------------
Benchmark Run: 火  1月 01 2019 00:32:27 - 01:02:03
8 CPUs in system; running 8 parallel copies of tests

Dhrystone 2 using register variables      360870045.0 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                    27462.9 MWIPS (19.2 s, 7 samples)
Execl Throughput                              30488.8 lps   (29.7 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks       1423574.4 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks          368401.6 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks       4716377.0 KBps  (30.0 s, 2 samples)
Pipe Throughput                            17216147.8 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                2686191.6 lps   (10.0 s, 7 samples)
Process Creation                              84876.2 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                  59599.6 lpm   (60.0 s, 2 samples)
Shell Scripts (8 concurrent)                   9173.1 lpm   (60.0 s, 2 samples)
System Call Overhead                        7779244.7 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0  360870045.0  30922.9
Double-Precision Whetstone                       55.0      27462.9   4993.3
Execl Throughput                                 43.0      30488.8   7090.4
File Copy 1024 bufsize 2000 maxblocks          3960.0    1423574.4   3594.9
File Copy 256 bufsize 500 maxblocks            1655.0     368401.6   2226.0
File Copy 4096 bufsize 8000 maxblocks          5800.0    4716377.0   8131.7
Pipe Throughput                               12440.0   17216147.8  13839.3
Pipe-based Context Switching                   4000.0    2686191.6   6715.5
Process Creation                                126.0      84876.2   6736.2
Shell Scripts (1 concurrent)                     42.4      59599.6  14056.5
Shell Scripts (8 concurrent)                      6.0       9173.1  15288.5
System Call Overhead                          15000.0    7779244.7   5186.2
                                                                   ========
System Benchmarks Index Score                                        7787.0

アイドル時は800MHzまでクロックが落ちるのでいいですね。
CPUファンをちょっと良いやつにしてみたので、CPU温度もアイドル時30度・UnixBench時や動画並列エンコードなど最大負荷をかけても50度にはいかない程度にとどまるので、とても安心感あります。空冷でもちゃんとしたやつならハイエンドCPUに対しても十分みたいですね。

この構成で1070Tiを載せてパーツ代全部で税込み17万円ぐらい。BTOだったら20万を下回ることはない構成(2018年12月現在)なので自作だとやはり結構抑えられますね。PC組むの久々なのでまる1日仕事にはなりましたが。

i7 7700K

Benchmark Run: 火  1月 01 2019 03:48:55 - 04:19:10
8 CPUs in system; running 1 parallel copy of tests

Dhrystone 2 using register variables       56530085.0 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                     3475.1 MWIPS (23.2 s, 7 samples)
Execl Throughput                               4584.7 lps   (30.0 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks       1132522.6 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks          293491.9 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks       2832499.6 KBps  (30.0 s, 2 samples)
Pipe Throughput                             1581458.1 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                 248860.2 lps   (10.0 s, 7 samples)
Process Creation                              18400.0 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                  15613.3 lpm   (60.0 s, 2 samples)
Shell Scripts (8 concurrent)                   5388.5 lpm   (60.0 s, 2 samples)
System Call Overhead                        1167379.7 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0   56530085.0   4844.1
Double-Precision Whetstone                       55.0       3475.1    631.8
Execl Throughput                                 43.0       4584.7   1066.2
File Copy 1024 bufsize 2000 maxblocks          3960.0    1132522.6   2859.9
File Copy 256 bufsize 500 maxblocks            1655.0     293491.9   1773.4
File Copy 4096 bufsize 8000 maxblocks          5800.0    2832499.6   4883.6
Pipe Throughput                               12440.0    1581458.1   1271.3
Pipe-based Context Switching                   4000.0     248860.2    622.2
Process Creation                                126.0      18400.0   1460.3
Shell Scripts (1 concurrent)                     42.4      15613.3   3682.4
Shell Scripts (8 concurrent)                      6.0       5388.5   8980.8
System Call Overhead                          15000.0    1167379.7    778.3
                                                                   ========
System Benchmarks Index Score                                        1913.0

 ------------------------------------------------------------------------
Benchmark Run: 火  1月 01 2019 03:48:55 - 04:19:10
8 CPUs in system; running 1 parallel copy of tests

Dhrystone 2 using register variables       56530085.0 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                     3475.1 MWIPS (23.2 s, 7 samples)
Execl Throughput                               4584.7 lps   (30.0 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks       1132522.6 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks          293491.9 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks       2832499.6 KBps  (30.0 s, 2 samples)
Pipe Throughput                             1581458.1 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                 248860.2 lps   (10.0 s, 7 samples)
Process Creation                              18400.0 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                  15613.3 lpm   (60.0 s, 2 samples)
Shell Scripts (8 concurrent)                   5388.5 lpm   (60.0 s, 2 samples)
System Call Overhead                        1167379.7 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0   56530085.0   4844.1
Double-Precision Whetstone                       55.0       3475.1    631.8
Execl Throughput                                 43.0       4584.7   1066.2
File Copy 1024 bufsize 2000 maxblocks          3960.0    1132522.6   2859.9
File Copy 256 bufsize 500 maxblocks            1655.0     293491.9   1773.4
File Copy 4096 bufsize 8000 maxblocks          5800.0    2832499.6   4883.6
Pipe Throughput                               12440.0    1581458.1   1271.3
Pipe-based Context Switching                   4000.0     248860.2    622.2
Process Creation                                126.0      18400.0   1460.3
Shell Scripts (1 concurrent)                     42.4      15613.3   3682.4
Shell Scripts (8 concurrent)                      6.0       5388.5   8980.8
System Call Overhead                          15000.0    1167379.7    778.3
                                                                   ========
System Benchmarks Index Score                                        1913.0

 ------------------------------------------------------------------------
Benchmark Run: 火  1月 01 2019 04:19:10 - 04:50:33
8 CPUs in system; running 8 parallel copies of tests

Dhrystone 2 using register variables      325161813.9 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                    19474.7 MWIPS (28.5 s, 7 samples)
Execl Throughput                              24605.3 lps   (29.9 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks       1695174.5 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks          445061.6 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks       4865765.0 KBps  (30.0 s, 2 samples)
Pipe Throughput                             9554265.8 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                1938914.1 lps   (10.0 s, 7 samples)
Process Creation                              86469.2 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                  51215.3 lpm   (60.0 s, 2 samples)
Shell Scripts (8 concurrent)                   7675.0 lpm   (60.0 s, 2 samples)
System Call Overhead                        7493113.4 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0  325161813.9  27863.1
Double-Precision Whetstone                       55.0      19474.7   3540.9
Execl Throughput                                 43.0      24605.3   5722.2
File Copy 1024 bufsize 2000 maxblocks          3960.0    1695174.5   4280.7
File Copy 256 bufsize 500 maxblocks            1655.0     445061.6   2689.2
File Copy 4096 bufsize 8000 maxblocks          5800.0    4865765.0   8389.2
Pipe Throughput                               12440.0    9554265.8   7680.3
Pipe-based Context Switching                   4000.0    1938914.1   4847.3
Process Creation                                126.0      86469.2   6862.6
Shell Scripts (1 concurrent)                     42.4      51215.3  12079.1
Shell Scripts (8 concurrent)                      6.0       7675.0  12791.7
System Call Overhead                          15000.0    7493113.4   4995.4
                                                                   ========
System Benchmarks Index Score                                        6854.2

i5 3570

BYTE UNIX Benchmarks (Version 5.1.3)</pre>
System: ubuntu-mate: GNU/Linux
OS: GNU/Linux -- 4.15.0-29-generic -- #31-Ubuntu SMP Tue Jul 17 15:39:52 UTC 2018
Machine: x86_64 (x86_64)
Language: en_US.utf8 (charmap="UTF-8", collate="UTF-8")
CPU 0: Intel(R) Core(TM) i5-3570 CPU @ 3.40GHz (6799.9 bogomips)
Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
CPU 1: Intel(R) Core(TM) i5-3570 CPU @ 3.40GHz (6799.9 bogomips)
Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
CPU 2: Intel(R) Core(TM) i5-3570 CPU @ 3.40GHz (6799.9 bogomips)
Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
CPU 3: Intel(R) Core(TM) i5-3570 CPU @ 3.40GHz (6799.9 bogomips)
Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
18:56:39 up 2:06, 1 user, load average: 0.00, 0.00, 0.09; runlevel 2018-12-31

 ------------------------------------------------------------------------
Benchmark Run: Mon Dec 31 2018 18:56:39 - 19:25:38
4 CPUs in system; running 1 parallel copy of tests

Dhrystone 2 using register variables 46001947.1 lps (10.0 s, 7 samples)
Double-Precision Whetstone 3571.7 MWIPS (15.9 s, 7 samples)
Execl Throughput 5504.8 lps (30.0 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks 1080708.2 KBps (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks 282868.5 KBps (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks 2941169.9 KBps (30.0 s, 2 samples)
Pipe Throughput 1295184.1 lps (10.0 s, 7 samples)
Pipe-based Context Switching 209435.3 lps (10.0 s, 7 samples)
Process Creation 13663.2 lps (30.0 s, 2 samples)
Shell Scripts (1 concurrent) 9563.6 lpm (60.0 s, 2 samples)
Shell Scripts (8 concurrent) 3438.4 lpm (60.0 s, 2 samples)
System Call Overhead 936350.5 lps (10.0 s, 7 samples)

System Benchmarks Index Values BASELINE RESULT INDEX
Dhrystone 2 using register variables 116700.0 46001947.1 3941.9
Double-Precision Whetstone 55.0 3571.7 649.4
Execl Throughput 43.0 5504.8 1280.2
File Copy 1024 bufsize 2000 maxblocks 3960.0 1080708.2 2729.1
File Copy 256 bufsize 500 maxblocks 1655.0 282868.5 1709.2
File Copy 4096 bufsize 8000 maxblocks 5800.0 2941169.9 5071.0
Pipe Throughput 12440.0 1295184.1 1041.1
Pipe-based Context Switching 4000.0 209435.3 523.6
Process Creation 126.0 13663.2 1084.4
Shell Scripts (1 concurrent) 42.4 9563.6 2255.6
Shell Scripts (8 concurrent) 6.0 3438.4 5730.6
System Call Overhead 15000.0 936350.5 624.2
========
System Benchmarks Index Score 1636.8

 ------------------------------------------------------------------------
Benchmark Run: Mon Dec 31 2018 19:25:38 - 19:54:23
4 CPUs in system; running 4 parallel copies of tests

Dhrystone 2 using register variables 172882513.2 lps (10.0 s, 7 samples)
Double-Precision Whetstone 14921.4 MWIPS (14.4 s, 7 samples)
Execl Throughput 19555.6 lps (30.0 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks 3048166.0 KBps (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks 849643.4 KBps (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks 7705026.7 KBps (30.0 s, 2 samples)
Pipe Throughput 4863898.8 lps (10.0 s, 7 samples)
Pipe-based Context Switching 1002740.5 lps (10.0 s, 7 samples)
Process Creation 47665.8 lps (30.0 s, 2 samples)
Shell Scripts (1 concurrent) 28147.8 lpm (60.0 s, 2 samples)
Shell Scripts (8 concurrent) 4407.1 lpm (60.0 s, 2 samples)
System Call Overhead 3330777.8 lps (10.0 s, 7 samples)

System Benchmarks Index Values BASELINE RESULT INDEX
Dhrystone 2 using register variables 116700.0 172882513.2 14814.3
Double-Precision Whetstone 55.0 14921.4 2713.0
Execl Throughput 43.0 19555.6 4547.8
File Copy 1024 bufsize 2000 maxblocks 3960.0 3048166.0 7697.4
File Copy 256 bufsize 500 maxblocks 1655.0 849643.4 5133.8
File Copy 4096 bufsize 8000 maxblocks 5800.0 7705026.7 13284.5
Pipe Throughput 12440.0 4863898.8 3909.9
Pipe-based Context Switching 4000.0 1002740.5 2506.9
Process Creation 126.0 47665.8 3783.0
Shell Scripts (1 concurrent) 42.4 28147.8 6638.6
Shell Scripts (8 concurrent) 6.0 4407.1 7345.2
System Call Overhead 15000.0 3330777.8 2220.5
========
System Benchmarks Index Score 5193.7

所感

i5 3570→i7 9700Kであっても倍精度演算(Whetstone MWIPS)が実はコア当たりだと全然速くなってないらしいのが意外。SIMDでなければ1FLOP/1clockに漸近していくからかな?
OS関連、プロセスとかシステムコールとかが圧倒的に速くなってるみたい。日頃の動作で差を感じることは多そう。

OpenCV野良ビルド時にCMakeが指定したPythonのライブラリをうまく見つけてくれない時は

OpenCVをPythonサポート込みでビルドしたいことがあります。
Python側へインタフェースを露出するためのヘッダなどが必要なので、いくつかのPython関連パッケージを入れれば、あとはシンプルにCMakeを実行すればよいことがほとんどです。
(そのやり方はネットにたくさんまとまっているので他をご参照ください)

% sudo apt-get install python2.7-dev python3.4-dev #などなど。
% cd /path/to/opencv/source/root
% mkdir build; cd build
% cmake -DBUILD_opencv_python2=ON -DBUILD_opencv_python3=ON ..

一方で、rootがないなどの状況でpython2.7-devなどのパッケージがシステムにない場合は、例えばpyenvを使って一時的にpythonをユーザ環境に入れそのパスを参照させることで、Python対応こみでビルドすることが可能です。
(ビルドがおわったら一時的に入れたPython環境は消してOKです)

% pyenv install miniconda2-latest
% pyenv install miniconda3-latest
% cmake -DCMAKE_BUILD_TYPE=RELEASE -DCMAKE_INSTALL_PREFIX=$HOME \
        -DBUILD_opencv_python2=ON \
        -DPYTHON2_EXECUTABLE=`pyenv local miniconda2-latest; pyenv which python` \
        -DPYTHON2_INCLUDE_DIR=`pyenv local miniconda2-latest; python -c 'from distutils.sysconfig import get_python_inc; print(get_python_inc())'` \
        -DPYTHON2_NUMPY_INCLUDE_DIRS=`pyenv local miniconda2-latest; python -c 'import numpy; print(numpy.get_include())'` \
        -DPYTHON2_LIBRARIES=`find $PYENV_ROOT/versions/miniconda2-latest/lib -name 'libpython*.so'` \
        -DBUILD_opencv_python3=ON \
        -DPYTHON3_EXECUTABLE=`pyenv local miniconda3-latest; pyenv which python` \
        -DPYTHON3_INCLUDE_DIR=`pyenv local miniconda3-latest; python -c 'from distutils.sysconfig import get_python_inc; print(get_python_inc())'` \
        -DPYTHON3_NUMPY_INCLUDE_DIRS=`pyenv local miniconda3-latest; python -c 'import numpy; print(numpy.get_include())'` \
        -DPYTHON3_LIBRARIES=`find $PYENV_ROOT/versions/miniconda3-latest/lib -name 'libpython*.so'` \
        ..

このとき、CMakeを走らせたときの序盤にこんなメッセージが出たり(PythonLibsを見つけられてなかったり、意図したのと違うものを見つけに行ってる)、

 -- Found PythonInterp: /home/xxxx/.pyenv/versions/miniconda2-latest/bin/python (found suitable version "2.7.14", minimum required is "2.7")
 -- Found PythonLibs: /usr/lib/x86_64-linux-gnu/libpython2.7.so (found suitable exact version "2.7.14")
 -- Found PythonInterp: /home/xxxx/.pyenv/versions/miniconda3-latest/bin/python (found suitable version "3.6.3", minimum required is "3.4")
 -- Could NOT find PythonLibs (missing:  PYTHON_LIBRARIES PYTHON_INCLUDE_DIRS) (found suitable exact version "3.6.3")

CMakeの最後の結果表示のときにこんなメッセージが出たり(LibrariesがNO)、

 --   Python 2:
 --     Interpreter:                 /home/xxxx/.pyenv/versions/miniconda2-latest/bin/python (ver 2.7.14)
 --     Libraries:                   NO
 --     numpy:                       /home/xxxx/.pyenv/versions/miniconda2-latest/lib/python2.7/site-packages/numpy/core/include (ver 1.14.0)
 --     packages path:               lib/python2.7/site-packages
 --
 --   Python 3:
 --     Interpreter:                 /home/xxxx/.pyenv/versions/miniconda3-latest/bin/python (ver 3.6.3)
 --     Libraries:                   NO
 --     numpy:                       /home/xxxx/.pyenv/versions/miniconda3-latest/lib/python3.6/site-packages/numpy/core/include (ver 1.14.0)
 --     packages path:               lib/python3.6/site-packages

正しく指定したはずのライブラリのパスをCMakeがどうも認識してくれない様子のときは、CMakeのバージョンを疑ってみてください

% cmake --version
cmake version 2.8.12.2

2.8系では、うまくPythonのライブラリをみつけてくることができないようです。
OpenCVの提供するCMakeLists.txtのcmake_minimum_requiredは(Linuxであれば)2.8になっているので、特に怒られることなく進んでしまう、というのが罠でした(今回取り上げたかなり限定的なシチュエーション以外ではそれで問題なく動くためです)。
より新しいCMake 3.5などを使ってください。

特にUbuntu14.04をまだ使っていたりした場合は、標準でapt-getしたものは2.8までになります。
野良ビルドするなり、PPAにするなり、新しいUbuntuに乗り換えるなりするといいです。

自分用メモ。

tmuxのセッション作成時に名前付けを強制するzshrc

魚を飼う時、繁殖をさせやすいのはグッピーやアカヒレなどだそうです。数匹のつがいがいればすぐに数百匹まで増えてしまうんだとか。

さて、tmuxヘビーユーザーなんですがセッションが乱立しがちで、外からsshして既存セッションをattachするときにどれがどれかわからないことが個人的にはよくあります。
セッション内の任意のウィンドウもしくはペインでtmux rename-sessionをすることでセッション全体に名前をつけることができ、attachするときこの名前で参照することができて便利です。
これを、セッション作成時に自動で聞くようにしてみました。

やりたいこと

  • tmuxでセッションを作ったあと最初のウィンドウが開かれる時、そのセッションに名前をつけるのを強制したい
  • 何も入力しないことも許容する。その場合は名前付けしない

やりたくないこと

  • 名前付けしなかった場合、セッション内で新たなウィンドウやペインを開く度にまた聞かれたくない

やってることは単純で、zshが起動した時それがtmuxセッション内でかつセッション名がデフォルト(数字のみ)のままである場合、名前の入力を求めtmux rename-sessionコマンドを呼ぶだけです。
何も入力しない場合はセッション名はデフォルトのまま放置しますが、そのままだとセッション内で新たなshellを開く度にプロンプトが出て鬱陶しいので、それが出ないようtmuxのsession-wideな環境変数を使いマークしています。シェル環境変数にマークした場合引き継がれないのでうまくいきません。

tmux 2.2(Mac)と2.1(Ubuntu)で確認しています。

てきとうに書いたのでもっとCOOLなやり方もあると思いますが、ひとまずこんなかんじで。

Firefox QuantumでTree Style Tabを使う時タブバーを消したかった

マッコウクジラは鯨の中でも特に深海に特化した進化をしていて、海面で息継ぎをしてから3000メートルを一気に潜ってしまうそうです。頭部にびっしり詰まっている脳油を海水と血液で冷やしたりし温めたりて比重を変えることで潜ったり浮いたりする様は、潜水艦よりも高度とさえ言えるのかもしれない。

さて、最近爆速になって登場したFirefox Quantumを使っているのですが、WebExtension版のTree Style Tabを使っていても画面上の方にタブバーが一緒に出てきてしまって邪魔でした。

基本的には
Firefox Quantum(57以上)で上部のタブバーを消す – Qiita
の通りなのですが、それだけだとなぜか動かなかったので、もう少し調べた結果出てきたこちら
Firefox Quantum (ver >= 57) – How Can I Hide the Horizontal Tab Bar with TreeStyle Tabs? – Super User
を適用すると動きました。

合わせると、新規作成するuserChrome.cssには次のような内容を書けばOKです。

@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
#tabbrowser-tabs {
  visibility: collapse !important;
}
#sidebar-header {
  visibility: collapse;
}

Macだとちょっとだけウィンドウのタイトルバー?がおかしいですが、困るものではないのでまぁいいでしょう。

完全に自分用メモ。

Dashにchainerのドキュメントを登録する

魚について調べる時、(Wikipediaもいいんですが)FishBase : A Global Information System on Fishesとかは結構分量も凄くて、英語中心ですがときどき役に立ちます。

さて、Macを3年ぐらい使ってきてて恥ずかしながらわりと最近までドキュメントのインクリメンタルサーチができるDashを知らなかったんですけども、ちょっと前から使うようになりました。仕事や趣味でChainerを使うんですが、ChainerのドキュメントはDashで提供されてないので、自分でドキュメントをDash用に変換する必要があります。

とは言えChainerはSphinxでドキュメントが書かれているので、doc2dashというpipを使えば一発でできます。

なのですごい簡単なんですが、環境を新しくする度にやり方を調べてやってる気がするので、メモ。
別にchainer限定ではなくて他の何にでも当てはまる一般的な話なんですが、あえてchainer specificな話題にしてみました。

# 準備。doc2dashを入れる。
% pip install doc2dash

# Cloneしてくる
% git clone https://github.com/pfnet/chainer.git --branch v2.0.0
% cd chainer/docs

# Optional: アイコンに使う画像をダウンロードしてくる。ここではTwitterから。
% wget https://pbs.twimg.com/profile_images/606654945438203905/D7LygzpN_400x400.png -O chainer_logo.png

# ドキュメントをビルドし、dash形式に変換
% make html
% doc2dash build/html -n chainer2 -i chainer_logo.png
# % doc2dash build/html -n chainer2   #アイコンが不要な場合

これを実行すると、chainer2.docsetというディレクトリが生成されます。Sphinx等はもちろん入っている必要があるので、怒られた場合は指示に従って入れてください。
Dashをインストール済みのMacでFinderにてこのディレクトリをダブルクリックすると、検索できるドキュメントとして追加されます。

ぼくの場合手元のMacだと、2017/7/3現在でのmasterのときsphinxのビルド(上記のmake html)がこんなかんじで失敗することがあったので、Linux環境でmakeしました。また、いきなりmake htmlするとエラーで死ぬんですがmake dirhtmlしてからmake htmlすると通ることも度々ありました。ちょっと謎。

% make dirhtml
...
...
reading sources... [ 76%] reference/generated/chainer.links.StatelessLSTM
reading sources... [ 76%] reference/generated/chainer.links.VGG16Layers
reading sources... [ 76%] reference/generated/chainer.links.caffe.CaffeFunction
reading sources... [ 77%] reference/generated/chainer.links.model.vision.googlenet.prepare
reading sources... [ 77%] reference/generated/chainer.links.model.vision.resnet.ResNetLayers
reading sources... [ 77%] reference/generated/chainer.links.model.vision.resnet.prepare
reading sources... [ 77%] reference/generated/chainer.links.model.vision.vgg.prepare
reading sources... [ 78%] reference/generated/chainer.optimizers.AdaDelta
/Users/hoge/Work/chainer/chainer/docs/source/reference/check.rst:30: WARNING: failed to import chainer.gradient_check.check_backward
/Users/hoge/Work/chainer/chainer/docs/source/reference/check.rst:30: WARNING: failed to import chainer.gradient_check.numerical_grad
/Users/hoge/Work/chainer/chainer/docs/source/reference/check.rst:30: WARNING: toctree references unknown document 'reference/generated/chainer.gradient_check.check_backward'
/Users/hoge/Work/chainer/chainer/docs/source/reference/check.rst:30: WARNING: toctree references unknown document 'reference/generated/chainer.gradient_check.numerical_grad'
/Users/hoge/Work/chainer/chainer/docs/source/reference/check.rst:43: WARNING: failed to import chainer.testing.assert_allclose
/Users/hoge/Work/chainer/chainer/docs/source/reference/check.rst:43: WARNING: toctree references unknown document 'reference/generated/chainer.testing.assert_allclose'
/Users/hoge/Work/chainer/chainer/docs/source/reference/check.rst:53: WARNING: failed to import chainer.testing.unary_math_function_unittest
/Users/hoge/Work/chainer/chainer/docs/source/reference/check.rst:53: WARNING: toctree references unknown document 'reference/generated/chainer.testing.unary_math_function_unittest'
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.Chain.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.ChainList.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.Link.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/Work/chainer/chainer/docs/source/reference/core/optimizer.rst:4: WARNING: failed to import chainer.Hyperparameter
/Users/hoge/Work/chainer/chainer/docs/source/reference/core/optimizer.rst:4: WARNING: toctree references unknown document 'reference/core/generated/chainer.Hyperparameter'
WARNING: /Users/hoge/Work/chainer/chainer/docs/source/reference/datasets.rst:57: (WARNING/2) autodoc: failed to import class 'ConcatenatedDataset' from module 'chainer.datasets'; the following exception was raised:
Traceback (most recent call last):
  File "/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/sphinx/util/inspect.py", line 169, in safe_getattr
    return getattr(obj, name, *defargs)
AttributeError: module 'chainer.datasets' has no attribute 'ConcatenatedDataset'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
  File "/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/sphinx/ext/autodoc.py", line 664, in import_object
    obj = self.get_attr(obj, part)
  File "/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/sphinx/ext/autodoc.py", line 554, in get_attr
    return safe_getattr(obj, name, *defargs)
  File "/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/sphinx/util/inspect.py", line 185, in safe_getattr
    raise AttributeError(name)
AttributeError: ConcatenatedDataset
/Users/hoge/Work/chainer/chainer/docs/source/reference/functions.rst:30: WARNING: failed to import chainer.functions.tree_lstm
/Users/hoge/Work/chainer/chainer/docs/source/reference/functions.rst:30: WARNING: toctree references unknown document 'reference/generated/chainer.functions.tree_lstm'
/Users/hoge/Work/chainer/chainer/docs/source/reference/functions.rst:216: WARNING: failed to import chainer.functions.layer_normalization
/Users/hoge/Work/chainer/chainer/docs/source/reference/functions.rst:216: WARNING: toctree references unknown document 'reference/generated/chainer.functions.layer_normalization'
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.BatchNormalization.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.Bias.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.Bilinear.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.BinaryHierarchicalSoftmax.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.BlackOut.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.CRF1d.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.Classifier.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.Convolution2D.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.ConvolutionND.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.Deconvolution2D.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.DeconvolutionND.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.DepthwiseConvolution2D.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.DilatedConvolution2D.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.EmbedID.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.GRU.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.GoogLeNet.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.Highway.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.Inception.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.InceptionBN.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.LSTM.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.LayerNormalization.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.Linear.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.MLPConvolution2D.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.Maxout.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.NStepBiGRU.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.NStepBiLSTM.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.NStepBiRNNReLU.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.NStepBiRNNTanh.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.NStepGRU.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.NStepLSTM.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.NStepRNNReLU.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.NStepRNNTanh.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.NegativeSampling.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.PReLU.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.ResNet101Layers.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.ResNet152Layers.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.ResNet50Layers.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.Scale.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.SimplifiedDropconnect.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.StatefulGRU.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.StatefulPeepholeLSTM.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.StatelessLSTM.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.VGG16Layers.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.caffe.CaffeFunction.init_scope:19: WARNING: Unexpected indentation.
/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/link.py:docstring of chainer.links.model.vision.resnet.ResNetLayers.init_scope:19: WARNING: Unexpected indentation.
Exception occurred:
  File "/Users/hoge/.pyenv/versions/3.6.1/lib/python3.6/site-packages/chainer/optimizer.py", line 598, in __get__
    return getattr(obj.hyperparam, self._attr_name)
AttributeError: 'NoneType' object has no attribute 'hyperparam'
The full traceback has been saved in /var/folders/y1/tp8l6j7n67bgbz8tpm0_05b40000gn/T/sphinx-err-6hlmrj53.log, if you want to report the issue to the developers.
Please also report this if it was a user error, so that a better error message can be provided next time.
A bug report can be filed in the tracker at <https://github.com/sphinx-doc/sphinx/issues>. Thanks!
make: *** [dirhtml] Error 1

また、DashのWindows/Linux版であるZealを使っている場合、上記の手順でビルドしてできたchainer2.docsetディレクトリを、Zealのdocsetsディレクトリに入れることでZealに見えるようになります。

% mv chainer2.docset ~/.local/share/Zeal/Zeal/docsets/

(docsetsディレクトリの場所は環境によって異なる可能性があります。optionsで確認できます)

✌(‘ω’✌ )三✌(‘ω’)✌三( ✌’ω’)✌たのしい!

なお、後になってDash-User-ContributionにChainerがあることを知った…
https://github.com/Kapeli/Dash-User-Contributions/tree/master/docsets/Chainer
常に自分の責任で最新に追従させたいわけじゃなければ、これで十分。メンテナのmitmulさんは同僚ですw

tqdmをムリヤリprocess safeっぽくするdirty hack

生物界で最大の目(光を検知する器官)を持っているのはダイオウイカおよびダイオウホウズキイカと言われ、その大きさは30〜35cmほどにもなるのだそうです。

さて、世界70億人のPythonプログラマが手放せないのが、tqdmというプログレスバーを簡単に表示できるようにしてくれるライブラリです。
しかしながらtqdmは(当然と言えば当然ですが)複数のプロセスから1つのプログレスバーを管理することができるような設計にはなっていません。
たとえば高速化のためにmultiprocessingを用いて並列処理をしながらプログレスバーを出したいとき、tqdmはそのままでは使えないことになります。

例えば、下記のようなコードで単にtqdmのインスタンスを子プロセスに渡して中でupdateをすると…

import tqdm
import multiprocessing

def worker(pbar):
    pbar.update()

ar = [i for i in range(100)]
with tqdm.tqdm(ar) as pbar:
    jobs = []
    for t in ar:
        job = multiprocessing.Process(target=worker, args=(pbar,))
        job.start()
        jobs.append(job)
    for job in jobs:
        job.join()

実行結果はこんな感じ。

% python usage.py
  1%|▉                                                                                                 | 1/100 [00:00<00:25,  3.89it/s]

こんなふうに、100%まで行ってくれません。
端的に説明すると、100個forkされた内部カウント0の状態をそれぞれ+1するのが100回走るだけ、だからです。

じゃあ内部カウントが常によろしく増えるために、内部カウントを無視して共有メモリで常に正しくカウントしてればいいよね、っていう単純な発想による汚いハックをしてみました。

Continue reading

大量のサーバに同じファイル(でかい)を効率的にコピーする

インド洋では、夏頃にイワシの大群が押し寄せるサーディンラン現象というのがあるのだそうです。その個体数、にわかには信じがたいですが億のオーダーにもなるとのことです。すげーな!

さて、あるサーバ1台が数百GBにもなる巨大なファイル(群)を持っているとします。
このファイル群を、そのサーバに接続された他の複数(大量)のサーバのローカルディスクにコピーしたいです。
以後これを便宜的にbcast cpと呼ぶことにします。

rsyncを1台ずつ回すのが頭悪い方法なのは明らか。当然NFSなどを立てて共有するというのも本質的にはそれと同じ。
同僚のiwiwiさんがちょうど集団通信アルゴリズムの話をしていたのを聞いて、それを活用して効率的にファイルをバラまくようなアドホックなスクリプトを書いて、ときどき使えそうなのでまとめておきました。

「やってみた」ぐらいの話なのでガチ勢の方たちにはƱ”-ʓ飲んで寝ていてほしいです。

Continue reading