刺身の上にたんぽぽ乗せる日記

プログラミングしたり、自販機の下に落ちてる小銭を集めたりしてます

AJPC2015東京予選

毎年恒例となったAJPCの東京予選土曜のスーパーサテライトに参加してきた。去年の50人のSnGと違って計40テーブル、460名の参加*1で、46名が通過。

ストラクチャは割とターボ気味。じゃんけん大会と言われる所以である。

http://www.ajpc.jp/wp/wp-content/uploads/structure/2015/2015super.pdf

序盤(25/50 - 50/100)

3000点スタートなので、50/100まではポストフロップでエッジを出せる場面だと思う。

最初のテーブルは最初の数ハンドでレイトのスティールにブラインドのリスティールが何回か入ってて、去年のゆるふわテーブルと比べるとマジきついテーブルに入ってしまったという感じがあった。厳しいのは最初だけだったので、先制パンチを入れると心に決めて来た人がいたのか、ただハンドがよかっただけなのかはわからない。
何回かいいハンドが入って、オープンレイズからスティールしたり、フロップ開いてスティールとかしてた。

最初に一番大きく動いたのは25/50でMPでAJoが入って、150にオープンレイズして、後ろレイト一人とブラインド二名コール。フロップはローボードのエアー。チェックで回ってきたけど、4wayでブラフはきついと思い、チェックで回したところ、後ろもチェックで回る。ターンがJ。プレイが色々と怪しいSBが先に250打ってきた。トップペアトップキッカーなので、アイソレートも兼ねてフリーズプレイでもするか、と思い750にレイズ。するとまさかの後ろのプレイヤーがコールで、SBが悩んでフォールド。後ろのプレイヤーはそれほど悩まずフラットコールしてきたのに加えて、フラッシュドローがあるボードだったので、怖くないリバーを確認して、ドローをミスしただろう、ということで先に1,000打って、相手がフォールド。

次に面白かったのは50/100くらいで、アーリーからのレイズをミドルのAKでフラットコールでヘッズアップ。フロップはJJXみたいなボードにペアがあるフロップ。相手はハーフポットくらいのコンティニュエーションベットを打ってきた。相手のレンジに対してこちらは恐らくハイカードで勝ってるし、相手はターンまでバレルしたらコミットするから、このドライなボードでAX持ってるなら諦めるだろう、とフロートすることにした。ターンはエアーで期待通りチェックで回ってきたので、ハーフポット弱打ってスティール成功。

ここからは比較的プリフロップでのスティールばっかり。右手側のプレイヤーがスタック小さめで緩かったので、レイトからオープンしてきたら、プレッシャーかけてスティールしてた。

非常に痛かったのは同じく確か50/100くらいで99でアーリーから250くらいにオープン。AJoのハンドでの怪しいSBがレイトからフラットコール、AKフロートしてた相手がチップを減らしており、ショートでスクイーズオールイン。1000ちょいくらいだったので、恐らくハンドレンジは強くないし、5000くらいのチップで多分テーブル内ではチップリーダーでリスク取れる、ということで、レイトをさらにスクイーズして、アイソレート+デッドマネーを増やしてうめぇえええ!!を狙ってレイズしたらレイトからKK出てきた。あばばばばばー。3000くらい持ってたので、2000までスタックが減った。

中盤(75/150 - 400/800)

幸い2000のスタックは50/100、75/150、100/200のブラインドではハンドを待っててもアンティもなく、ブラインドがで削られるダメージが少ない上に、相手を下ろすには十分大きい。丁度いい具合にスティール・リスティールオールインしやすいサイズである。

またもや右側の緩いプレイヤーとブラインドからスティールを続けて4000くらいに戻すも、カードデッドな状況が続き、いい加減仕掛けてもいいかな、とブラフレイズでオープンしたら、後ろにコールされて、Aハイフロップのコンティニュエーションベットもコールされ、ターンで諦めてチェックフォールド。これでまた2000くらいに減らし、死ぬほど後悔し、やっぱりタイトに真面目に生きていこうと誓う。

とはいえ、あまりいいハンドも来ないで、スティールで食いつないでいたところで、割と緩いアーリーがオープンレイズしてきて、MPで66があったので、ここでフリップするか、と思い2000でオールイン。すると後ろの1700のショートが同じくオールイン。3wayで思った通りアーリーはAJoだったけど、レイトが99で、6は引けずにサイドポットの600だけを拾う。誓いとはなんだったのか。死にそう。

ボタンは向こう側にあるので、あと数ハンド中に腹を決めなくてはいけない、と思ってたら、間もなく都合よくQQが入る。ショートのオールインなのであっさりコールされるも、2000くらいにまた戻す。

ここからは、また右手側の人をいじめ続ける。引き続きオープンリンプやオープンミニマムレイズで入ってきたところを奪い続け、加えてレイトからもブラインドも盗みまくり、5000くらいまで戻した。
ここでテーブルブレーク。新しいテーブルでは特に面白いアクションはなし。というか、ショート過ぎてスティール以外は基本的に何もしなかった。必要以上にスティールできるほど後ろが弱い感じではなかったので、最低限だけ定期的にスティールして5000を維持し続ける。

終盤(600/1200+A100 - 1200/2400+A200)

しばらくしてまたテーブルブレーク。BBが1200くらいまで上がってきて、アンティも発生しはじめた。スティールでスタックを維持し続けてたけど、このくらいになるとスタックが4BBしかなく、リスティールはほぼ不可能。ブラインドのスティールすら厳しいので、命をかけた勝負に出なくてはいけない。

15,000くらいのチップを持ったミドルがオープンしてきて、SBで66を持った自分に回ってきた。比較的緩く開いているように見えたのに加えて、ブラインドとアンティが入って旨味があるので、ここでフリップしようと突っ込んだ。相手はAToで無事フリップ勝利。

その直後のハンドで、AToの相手がアーリー/ミドル辺りからオープンレイズオールイン。なんとここでAAが入っていたので、ボタンから被せてオールイン。10K越えのスタックで、ぎりぎりカバーして、わずか2ハンドでスタックが4倍以上に。ポーカーって簡単なゲームですね。

大分スタックが増えたので、少しリスクが取れるようになった。後ろのプレーヤーは入賞圏内のスタックがあったせいか、少し守りに入っていたので、気持ち多めにスティールして、チップを増やす。

ここからテーブルブレークが何回かあって、別の島の6テーブルのほうにみんな収納。残り60名、46名が決勝進出。自分のスタックは30Kを越えてたので、入賞ラインは余裕で超えていて、死ぬ恐怖よりは、ここで飛んだら恥ずかしいよな、という感じだった。

最後のテーブルは守りに入ったプレーヤーが数名、緩いのが2人、チップリーダーが手なりでプレイして、一人イケイケな兄ちゃんがいた。自分の後ろは少しタイト目な人と、完全に逃げに入ったショートだけだったので、食いつなぐのには苦労しなかった。

少しきつかったのは、全ハンド織り続けてたアーリーからのオープンオールインをレイトでJJを見つけてしまって、受けたら、出てきたのはこれまたKKで15Kくらい持って行かれた。まだ全然生き残れる範囲ではあるけど、死んだら恥ずかしいので、死にたくない。

ハンドフォーハンド

ブラインドは1000/2000、1200/2400、1500/3000と上がってくるもスティールを定期的に行い食いつなぐ。1500/3000のちょっと前くらいで5テーブルで残り50名。残り4名飛ぶまでHand for handに入った。色んなテーブルで何度もオールインが入るも、中々飛ばず。自分のテーブルにドショート2名、ショート1名いるので、何もしなくても多分入賞できるシチュエーション。加えて他のテーブルにもショートが数名いたので、さらに余裕。何人かは他のテーブルのプレイヤーのチップ量を確認しにいってたけど、ほとんどの人は自分の席に座りっぱなしだった。ショートの人はダブルアップのリスクを取るべきか判断するために、全テーブルのチップ量を確認すべきなんだけどね。

しばらくたって、ブラインドも上がり、3人目が飛んだ。ここでバブル。自分のテーブルの左側のほうにいるプレーヤーのスタックが1BB分もなく、勝負にでなくてはいけない。UTGで降りて、勝負はBBに。そして最後のハンドはみんなで囲んでぶっ殺す、と思いきや、理解している人が意外と少なく、10人のテーブルにも関わらず、BBを除いて4人しかコールしていない。決してショートというわけでもないSBがフォールドした時は特にびっくりした。自分までハイカードしかなかったものの、最後の一人がAKoで見事トップペアトップキッカーで勝利。これでAJPC東京予選第一日スーパーサテライトの幕を閉じた。

確か10:30くらいスタートで終了15:30だったので、5時間くらいかかった。去年のAJPCは2時間ちょっとくらいでファイナルテーブルになって、休憩挟んであと1時間くらいだったから、そんなに疲れはしなかったけど、今回はずっとやりっぱなしですんごく疲れた。

*1:400名スタート、飛んだ席を順次埋めてた

サーバが死んだ

https://www.mail-archive.com/debian-bugs-dist@lists.debian.org/msg1264075.html
Rescueで起動するとこれとそっくりな症状。なんと糞タイムリーな。

Welcome to Debian GNU/Linux jessie/sid!
[ 3.012374] <30> systemd[1]: Inserted module 'autofs4'
[ 3.038538] <30> systemd[1]: Set hostname to
[ 3.062844] <27> systemd[1]: Failed to create root cgroup hierarchy:
Invalid argument
[ 3.063076] <27> systemd[1]: failed to allocate manager object: Invalid
argument

以下復帰するために試した手順についてメモ。
試行錯誤でやって、なんとか動いた手順、というだけなので、恐らく正しい手順ではない。

  • grubdebianのrescueではなく、普通のやつを起動パラメータを修正して起動する。
    • eを押して修正モードに
    • linux ..... quietのquietを消してinit=/bin/bashにする。これでsystemdが走る前にbashに移れる
  • ファイルシステムがreadonlyで特に何もできないので、

# mount -o remount,rw /

これで書き込み可能に。
多分何度も失敗しながらやり直すことになるので、セットアップのコマンドをシェルスクリプトに保存しておく。emacsは動かなかったけど、jedは動いた。

#!/bin/sh
mount -o remount,rw /
/etc/init.d/networking start
ifconfig eth0 (server ip address) netmask (netmask)
route add default gw (gw ip address)
hostname broken
/etc/init.d/ssh start

これでネットにつながって、sshdが立ち上がる。nameserverの設定はやらなくても大丈夫だった。

あとは必要なサービスを動かす

/etc/init.d/nginx start
/etc/init.d/supervisor start

これでなんとかそれっぽく動くところまで持ってくることができるようになった。
systemdの208で起きる問題らしいので、バックアップが終わり次第ダメ元での215を入れようかと思う。

https://bbs.archlinux.org/viewtopic.php?id=176171
VPSとの相性でも起きる問題らしいので、cloudcore側に解決して欲しい問題なんだが、全く相手にしてくれなかった。腹立たしい。

追記:
上記の状態でapt-getは使えるようになったので、systemdの215を試してみるも直らず。
systemdをダウングレードするか別のinitを使うか迷って結局sysvinitにすることにした。dselectからsysvinit選ぶ。systemdの色々削るけど、めげずに選ぶ。再起動したら普通に動いた。

feedparser置き換え

2chnaviのサービスを運用するにあたって、リソースのボトルネックは何かというと、実はCPUが一番きつい。HDDと違って足りなかったら遅くなるだけでよかったんだけど、流石に全てのフィードをとってパースするのに1時間以上かかるのは、1万以上のRSSがあるとはいえ遅すぎる。

http://d.hatena.ne.jp/kudzu/20120403/1333449336

にも書いたけど、原因はfeedparserの実装が糞遅いから。涙がでるほど遅い。

で、ちょっと調べてたらspeedparserというfeedparserとある程度互換があるfeedparserの実装があったので、試してみた。

https://github.com/jmoiron/speedparser

pypiでパッケージがあったので、pip install speedparserで入れた。

てきとうに2chnaviに登録してあるrssを100ほどdlしてみて、2つのパーサが生成するオブジェクトのフィールドを比べてみたところ、更新日時の解釈が若干違うけど、url、コンテンツ、タイトルなどは割と互換に見える(追記:コンテンツはfeedparserのほうがタグの正規化などを行ってしまうため、完全マッチはできなかった。SANITIZE_HTML=0でも同様)。100くらいしかまだ試してないから、もしかしたらエンコーディングとか色々と細かいところで気が利かないのかもしれんけど。

参考までに速度を一部載せておくと、

5.380 vs 172.251 index.html?xml.15
4.532 vs 1421.450 rss.1
2.985 vs 122.598 index.rdf.21
11.675 vs 910.587 index.html?xml.5
1.524 vs 131.796 index.rdf.6
3.764 vs 487.475 index.rdf.12
5.577 vs 593.087 index.rdf.36
3.477 vs 276.774 index.rdf.43
14.047 vs 7256.265 index.rdf.23
3.561 vs 90.582 index.html.1
4.213 vs 806.865 index.rdf.5
3.599 vs 542.688 index.rdf.34
1.437 vs 432.654 index.html
6.362 vs 1437.406 index.rdf.42
3.384 vs 272.167 index.html?xml.8
5.521 vs 1194.197 index.rdf.47
3.104 vs 143.062 index.rdf.28
3.376 vs 152.067 index.html?xml.12
4.367 vs 872.829 index.rdf.2
14.783 vs 9165.716 talk?feed=rss2
6.751 vs 980.692 index.rdf.19
1.984 vs 205.695 index.html?xml.18
3.122 vs 225.296 index.rdf.18
36.107 vs 19888.307 index.html.4
3.402 vs 316.764 index.rdf.54
2.829 vs 226.778 index.rdf.32
4.423 vs 1081.482 index.rdf.3
5.801 vs 1916.120 index.html.2
25.172 vs 6872.890 gamble?feed=rss2
4.735 vs 846.101 index.rdf.15
11.688 vs 6284.851 pc?feed=rss2
3.572 vs 374.356 index.rdf.7
3.788 vs 377.102 index.rdf.53
4.442 vs 795.737 index.rdf.4
27.751 vs 18444.048 manga?feed=rss2
3.590 vs 524.870 index.rdf.14
2.967 vs 221.017 index.rdf.48
3.441 vs 568.598 index.rdf.20
2.940 vs 303.711 index.rdf.13
8.368 vs 3125.123 index.html?feed=rss2
4.147 vs 139.066 index.html?xml.2
8.120 vs 1324.849 index.rdf.40
3.152 vs 133.390 index.rdf.52
3.258 vs 290.415 index.rdf.44
7.013 vs 96.820 rss
2.808 vs 181.106 index.rdf.22
2.967 vs 233.972 index.rdf.50
3.104 vs 421.921 index.rdf.39
6.247 vs 1839.871 index.rdf.29
2.168 vs 89.000 index.html?xml.19
2.829 vs 178.847 index.rdf.16
2.832 vs 161.458 index.rdf.51
2.636 vs 186.148 index.rdf.24
15.118 vs 7562.889 feed.3
3.090 vs 253.103 index.rdf.10
2.158 vs 205.923 index.html?xml.9
2.976 vs 229.955 index.rdf.1
3.398 vs 446.549 index.rdf.31
3.053 vs 276.134 index.rdf
1.991 vs 169.961 index.html?xml.3
11.469 vs 1167.462 index.html?xml.1
3.876 vs 626.648 index.rdf.30
5.847 vs 1982.844 index.html.3
2.025 vs 167.217 index.html?xml.17
3.242 vs 147.577 index.html?feed=rss2.2
16.571 vs 10932.801 sports?feed=rss2
2.047 vs 70.548 index.html?xml
3.254 vs 276.725 index.rdf.41
1.998 vs 158.414 index.html?xml.11
1.994 vs 210.396 index.html?xml.14
3.120 vs 258.864 index.html?feed=rss2.1
15.106 vs 8625.756 index.html?xml.7
4.855 vs 1182.983 feed.1
1.979 vs 160.850 index.html?xml.16
3.355 vs 428.056 index.rdf.35
11.931 vs 1417.789 feed.4
3.353 vs 307.679 index.rdf.45
3.776 vs 474.214 index.rdf.8
1.795 vs 50.013 index.html?xml.4
10.671 vs 6183.113 music?feed=rss2
3.641 vs 310.649 index.rdf.38

speedparserはclean_html=False、feedparserはfeedparser.PARSE_MICROFORMATS = 0を設定。
単位はmsecで、左がspeedparser、右がfeedparser。正確な数字をとるために何度も回したりとかはしてないけど、別にそんなことしなくても余裕でわかるくらい差が出てる。
ざっくりspeedparserが数十-数百倍くらい速い。feedparserがいかに遅いかよくわかると思う。

もう少しtestcase追加してunittest全部通したらdeployしてみようかと思う。

追記:

一時間以上かかってたクロールが3分もかからなくなった。
しかもその3分の大部分がいくつか返事が返ってこないフィードの待ち時間で、過半数はあっという間に終わってた。

右端のところが新しいparserを使ったところで、見ての通り、ピークが100%にいかなくなってる。互換性の問題で移植できなかった部分はfeedparserのままにしておいたせいで多分まだ高めになってる。その処理自体はioのほうがボトルネックになるから、気にしなくていいかな、と思って放置してる。

追記2:

べ、別に都合のいい部分だけ切り抜いたわけじゃないんだからね、ということでピークがすぎる部分も載せてみる。ピークが小さくなった上に、圧倒的に短くなってるのがよくわかると思う。

pulse audio raop設定 / alsa設定

http://raspberrypi.stackexchange.com/questions/5508/redirect-audio-to-another-airplay-device
にしたがってできたはずなんだけど、rebootしたら動かなくなってた...。
まずはpulse audioからraopで音を飛ばすところを確認する。

$ pulseaudio --log-level=debug -vvvv
(snip)
D: [raop-sink] module-raop-sink.c: Thread starting up
D: [pulseaudio] protocol-dbus.c: Interface org.PulseAudio.Core1.Device added for object /org/pulseaudio/core1/source1
D: [pulseaudio] protocol-dbus.c: Interface org.PulseAudio.Core1.Source added for object /org/pulseaudio/core1/source1
D: [pulseaudio] module-device-restore.c: Could not set format on sink raop.ipanema.local
D: [pulseaudio] module-suspend-on-idle.c: Sink raop.ipanema.local becomes idle, timeout in 5 seconds.
D: [pulseaudio] protocol-dbus.c: Interface org.PulseAudio.Core1.Device added for object /org/pulseaudio/core1/sink1
D: [pulseaudio] protocol-dbus.c: Interface org.PulseAudio.Core1.Sink added for object /org/pulseaudio/core1/sink1
I: [pulseaudio] module.c: Loaded "module-raop-sink" (index: #21; argument: "server=[169.254.171.141]:5000 sink_name=raop.ipanema.local sink_properties='device.description="ipanema"'").
D: [pulseaudio] protocol-dbus.c: Interface org.PulseAudio.Core1.Module added for object /org/pulseaudio/core1/module21
I: [pulseaudio] module-suspend-on-idle.c: Sink alsa_output.platform-bcm2835_AUD0.0.analog-stereo idle for too long, suspending ...
D: [pulseaudio] sink.c: Suspend cause of sink alsa_output.platform-bcm2835_AUD0.0.analog-stereo is 0x0004, suspending
I: [alsa-sink] alsa-sink.c: Device suspended...
D: [pulseaudio] core.c: Hmm, no streams around, trying to vacuum.
D: [pulseaudio] module-udev-detect.c: /dev/snd/controlC0 is accessible: yes
E: [pulseaudio] rtsp_client.c: Connection failed: Connection timed out
I: [pulseaudio] module-suspend-on-idle.c: Sink raop.ipanema.local idle for too long, suspending ...
D: [pulseaudio] sink.c: Suspend cause of sink raop.ipanema.local is 0x0004, suspending

もしやと思い

$ telnet 169.254.171.141 5000
Trying 169.254.171.141...

つながらず、macのほうでは

$ telnet 169.254.171.141 5000
Trying 169.254.171.141...
Connected to ipanema.local.
Escape character is '^]'.

試しにmacからping

$ ping ipanema.local
PING ipanema.local (192.168.0.38): 56 data bytes
64 bytes from 192.168.0.38: icmp_seq=0 ttl=255 time=5.395 ms

raspberry piからairmac expresstelnet

$ telnet 192.168.0.38 5000
Trying 192.168.0.38...
Connected to 192.168.0.38.
Escape character is '^]'.

avahiが胡散臭い。

pi@rpi ~ $ ping ipanema.local
PING ipanema.local (192.168.0.38) 56(84) bytes of data.
64 bytes from ipanema.local (192.168.0.38): icmp_req=1 ttl=255 time=0.761 ms
64 bytes from ipanema.local (192.168.0.38): icmp_req=2 ttl=255 time=0.801 ms
^C

      • ipanema.local ping statistics ---

2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.761/0.781/0.801/0.020 ms
pi@rpi ~ $ ping ipanema.local
PING ipanema.local (169.254.171.141) 56(84) bytes of data.
^C

      • ipanema.local ping statistics ---

7 packets transmitted, 0 received, 100% packet loss, time 6008ms

  • 立て続けでやると、二回目以降が何故かlink localのもので解決されるというのが問題らしい。
  • しょうがないからlink localのアドレスも割り振る。
    • force-bindはつけないと、普通のdefault routeあるせいか有効にならない。

pi@rpi ~ $ sudo avahi-autoipd eth0 --force-bind
Found user 'avahi-autoipd' (UID 111) and group 'avahi-autoipd' (GID 115).
Successfully called chroot().
Successfully dropped root privileges.
Starting with address 169.254.7.39
Callout BIND, address 169.254.7.39 on interface eth0
Received conflicting normal ARP packet.
Callout CONFLICT, address 169.254.7.39 on interface eth0
Trying address 169.254.204.240
Callout BIND, address 169.254.204.240 on interface eth0
Received conflicting normal ARP packet.
Callout CONFLICT, address 169.254.204.240 on interface eth0
Trying address 169.254.127.95
Callout BIND, address 169.254.127.95 on interface eth0
Received conflicting normal ARP packet.
Callout CONFLICT, address 169.254.127.95 on interface eth0
Trying address 169.254.99.123
Callout BIND, address 169.254.99.123 on interface eth0
Successfully claimed IP address 169.254.99.123

んで、ping

pi@rpi ~ $ ping ipanema.local
PING ipanema.local (192.168.0.38) 56(84) bytes of data.
64 bytes from ipanema.local (192.168.0.38): icmp_req=1 ttl=255 time=0.748 ms
64 bytes from ipanema.local (192.168.0.38): icmp_req=2 ttl=255 time=0.735 ms
^C

      • ipanema.local ping statistics ---

2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.735/0.741/0.748/0.028 ms
pi@rpi ~ $ ping ipanema.local
PING ipanema.local (169.254.171.141) 56(84) bytes of data.
64 bytes from ipanema.local (169.254.171.141): icmp_req=1 ttl=255 time=1.47 ms
64 bytes from ipanema.local (169.254.171.141): icmp_req=2 ttl=255 time=0.703 ms

これやったけど、結局音出ない。
そもそもalsaで音出すのがまともに上手く行っていない。
http://raspberrypi.stackexchange.com/questions/639/how-to-get-pulseaudio-running

$ echo "play-file /usr/share/sounds/alsa/Front_Center.wav 0"|pacmd
Welcome to PulseAudio! Use "help" for usage information.

一応たまに音が出る。なんだこの糞は。

Raspberry PIにLCDをつなげる

http://d.hatena.ne.jp/kudzu/20140426/1398523133の続き

root@rpi:~# i2cdetect 0
WARNING! This program can confuse your I2C bus, cause data loss and worse!
I will probe file /dev/i2c-0.
I will probe address range 0x03-0x77.
Continue? [Y/n] y
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
root@rpi:~# i2cdetect 1
WARNING! This program can confuse your I2C bus, cause data loss and worse!
I will probe file /dev/i2c-1.
I will probe address range 0x03-0x77.
Continue? [Y/n] y
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 3e --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

  • まさかの一発OKで、自分でも驚き
  • サンプルのハローワールドのshell script動かしてみた。

root@rpi:~# ./lcdhelloworld.sh
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed
Error: Write failed

  • 原因はアドレスがi2cdetectで3eになっているので、これに合わせる必要がある。
    • コピペしたい人用に下に貼り付けとく。

#!/bin/sh

# LCD の初期化
i2cset -y 1 0x3e 0 0x38 0x39 0x14 0x78 0x5f 0x6a i
sleep 0.3
i2cset -y 1 0x3e 0 0x0c 0x01 i
sleep 0.3
i2cset -y 1 0x3e 0 0x06 i
sleep 0.3

# a. 1行目の文字を出力 "ハロー"
i2cset -y 1 0x3e 0 0x80 b
i2cset -y 1 0x3e 0x40 0xCA 0xDB 0xB0 i

# b. 2行目の文字を出力 "ワールド"
i2cset -y 1 0x3e 0 0xc0 b
i2cset -y 1 0x3e 0x40 0xDC 0xB0 0xD9 0xC4 0xDE i

やたら文字が薄いのはそういうハードウェアなのか、なんか自分が失敗しているのかどちらか不明。

Raspberry PIセットアップメモ

目指すはインターネットラジオ専用デバイス

このケース付き買ったのはいいけど、

これ挿すと、microsdがでっぱって、ケースにぶつかる。ちょっとケース削れば入るかもしれない。

  • SDカードフォーマットして、NOOBのファイルコピーするだけで、初回起動時にインストールするdistroを選べる
  • ユーザpiのパスワードだけ変えておく。
  • piはsudo使える
  • 無線はhttp://wtakuo.tumblr.com/post/48835029766/raspberry-pi-usb-lanにしたがって設定を行った。
  • apはairmac expressでwpa/wpa2でパスワード設定してる
  • ハードウェアは下のUSBのものを使用

BUFFALO 無線LAN子機 コンパクトモデル 11n技術・11g/b対応 WLI-UC-GNM

BUFFALO 無線LAN子機 コンパクトモデル 11n技術・11g/b対応 WLI-UC-GNM

  • うまくいかず。

# ifdown wlan0;ifup wlan0
wpa_supplicant: /sbin/wpa_supplicant daemon failed to start
run-parts: /etc/network/if-pre-up.d/wpasupplicant exited with return code 1
Failed to connect to wpa_supplicant - wpa_ctrl_open: No such file or directory
wpa_supplicant: /sbin/wpa_cli daemon failed to start
run-parts: /etc/network/if-up.d/wpasupplicant exited with return code 1

  • ネットで調べると、単純に設定ファイルのパースエラーなどでも出るエラーらしい。

root@raspberrypi:~# wpa_supplicant -Dwext -iwlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf
ioctl[SIOCSIWENCODEEXT]: Invalid argument
ioctl[SIOCSIWENCODEEXT]: Invalid argument
}'twork=group=CCMP TKIPKIP"
}'.work=group=CCMP TKIPKIP"l interface 'DIR=/var/run/wpa_supplicant GROUP=netdev
You may have another wpa_supplicant process already running or the file was
left by an unclean termination of wpa_supplicant in which case you will need
to manually remove this file before starting wpa_supplicant again.

  • メッセージが無茶苦茶になってるのは、どうやら改行コードがおかしいらしい。
  • perl -pi -e 's/\r/\n/g' wpa_supplicant.confで置き換えできる。間違えて\bと打っちゃったけど、nanoで上書きできた。
  • まだwifiつながらなくて、諦めたので、有線でつないでapt-get update/upgrade
  • rebootしてifdown/ifupしたらつながった
  • apt-get install mpc mpd
  • KCBSのurlを追加

$ curl http://provisioning.streamtheworld.com/pls/KCBSAM.pls
(list of stream url)
$ mpc add http://7279.live.streamtheworld.com:443/KCBSAM_SC
$ mpc play

$ ping rpi.local
PING rpi.local (192.168.0.44): 56 data bytes
64 bytes from 192.168.0.44: icmp_seq=0 ttl=64 time=387.840 ms
64 bytes from 192.168.0.44: icmp_seq=1 ttl=64 time=24.991 ms
64 bytes from 192.168.0.44: icmp_seq=2 ttl=64 time=151.270 ms

pi@rpi ~ $ pactl load-module module-raop-discover
Failure: Module initialization failed
$apt-get install pulseaudio-module-raop
(snip)
pi@rpi ~ $ pactl load-module module-raop-discover
20

  • ごちゃごちゃしてるうちになんか動いた。
  • mpdからraopで音でない
  • paplay /usr/share/sounds/alsa/Front_Center.wavは音が出るけど、超途切れる。全く出ないことも
  • mpdを何回か再起動してるうちに結局動いた。play叩いてから音が出るまでディレイがあったので、短いwavでテストすると再生される前にプロセス終了して音が出ていないかも

後はハードウェア。
http://sea-mountain.hatenablog.jp/entry/2013/09/21/231242
がわかりやすそう?