大阪行ってきた。目的地は京都だけど、上陸地点は関西空港。
今回は完全にプライベートで、そうなると往路は遅延とかどうでもいいので、Peachにしてみた。欠航の時の代替便が飛ぶのか、とか、そういうのをいちいち考え始めたらキリがないけど、なにしろ那覇から関空まで5000円。
那覇空港では貨物エリアにあるLCCターミナルから出発なので、駐車場に自分の車をとめたら国内線ターミナル前からシャトルバスに乗る。LCCターミナルは貨物エリアで、海外からの荷物を受け取るときなんかに自分の車で行ったことがあるけど、そこへバスで行くのはなんだか不思議な感じ。バスは満員でした。
ターミナルに着くと自動チェックイン機が。
僕はなぜかここで「カウンターへ行け」というメッセージが出てカウンターへ。謎でした。自動チェックインのほうは、みんな慣れた感じでスムーズ。僕はとにかく一番安い運賃だったので、ここで初めて自分の座席が決まります。
保安検査は普通の手順で、それを通り抜けると搭乗口。貨物上屋をそのまま使っているので天井が高くて、体育館みたい。中に売店もありますが、あんまり充実してない印象。お土産も自分のものも、国内線ターミナルで買っておくのがいいかも…
客層はわりと若いのだけれど、意外なことに外国の (しかも在沖米軍の方々ではなさそうな) 方もかなり。
搭乗は前方・後方だけじゃなくて、窓際の人を先に、通路側はあと、という徹底っぷり。これすごいね。ターミナルビルからは歩いて搭乗、タラップは ANA の。
機内は新造機なこともあってきれい。シートピッチは昔の国際線エコノミーな感じで、前の座席の下に荷物を入れるときはちょっともじもじしないといけないけど、そんなものでしょう。写真撮るの忘れちゃった。
座席は背もたれが薄くて、うしろの人が座席ポケットにペットボトルとか入れるともこもこしてアレでしたが、ま、たったの2時間ですしね。
降りる時はうしろのドアも使います。効率的。関空はちゃんと Peach のタラップが用意されてました。さすが。
あと、なんか桃もらった。
で、なにしに大阪いったかっていうと、この、とり天カレーうどん食べにいったんですよ。
いや、おなかいっぱいでした。
投稿者: yasu
東京いってきた
坦々亭
最南端ロッテリア
FreeBSD device driver で DMA
FreeBSD でデバイスドライバ書いて DMA を動かすためのいろいろ。とりあえず参考になりそうなのは、
- FreeBSD Architecture Handbook: Bus Memory Mapping
- bus_dma (9)
- Writing and Adapting Device Drivers for FreeBSD
- How to write a device driver in FreeBSD (PDF)
このあたり。実例は /usr/src/sys/dev の下あたりをみればいくらでもあるけれど、とりあえず参考にしたのは /usr/src/sys/dev/hifn/hifn7751.c とか。
bus_alloc_resources() とかで BAR の値を読み出したり、DMAC を制御するためのレジスタを mmap() できるようにするあたりは今回はとりあえず省略して、DMA のアクセス先になるメインメモリ上の領域を確保するための手順をまとめておくことにします。
- bus_dma_tag_create()
デバイスのDMACに関するいろいろを設定する。たとえば以下のようなこと。これを DMA tag という。- 何バイト単位でDMAできるか(1バイト単位か、4バイト単位か、など)
- DMA可能なアドレスの範囲 (16MB, 4GB, それ以上、など)
- DMA用のメモリの合計の最大サイズ
- 上記メモリを最大いくつのセグメントに分割してよいか、セグメントサイズの上限はいくらか
DMA tag を作るだけではメモリは確保されません。
- bus_dmamap_create()
タグの情報に基づいて map を生成します。ひとつのタグに対応する複数の map を生成できます。map だけで、実際のメモリは確保されないっぽい。 - bus_dmamem_alloc()
ここでmalloc() か contigmalloc() (確保する領域のサイズ次第ですね) が呼ばれます。確保されるサイズは tag を作るときに指定した最大サイズ。物理アドレスは分散している可能性がありますが、カーネル仮想アドレス空間では連続した領域になります (たぶん)。 - bus_dmamap_load()
最後にこれでデバイス側から見えるアドレスのリストを受け取ります。bus_dmamap_load() ではすぐにリストがもらえなくて、callback 関数を指定しておいて、おわると結果が帰ってくる感じです。
片付けるときは逆順です。
- bus_dmamap_unload()
- bus_dmamem_free()
- bus_dmamp_destroy()
- bus_dma_tag_destroy()
ナゴチキン
おきなわ名店街シリーズ第一弾はとりあえずナゴチキン。名護市役所の(裏側の通りの)隣です。
注文してから揚げてくれる唐揚げはめっちゃジューシー。名護に住んでたらこれで大宴会やりたい。
半身揚げおいしそうなんですが、さすがに一人では・・・どうかな。メニューはこれだけです。かっこいい。
あと、持ち帰り専門店です。
TCP プログラミングあれこれ
ICFPT Design Competition の委員をやっているので、ホストになるコードをごりごり書いているわけですが、GTK とか Qt とかでユーザインタフェイス作るのだるいなー、と思って HTML+JavaScript でやることにしまいた。最近は nmny 作ったりしてけっこう JavaScript 書いてた (きれいなコードじゃないと怒られそうですが) ので、まあいけるかなー、と。
ブラウザで表示させる部分から AJAX でデータを取りにいけばいいわけですが、そうすると何が問題かというと、HTTP のところを自分で書かないといけないところです。今回の場合、会場でプロジェクタに接続するマシン一台だけで見られればいいので、複数のブラウザから同時にセッションを張られることは考えていません。
なんとかわりとちゃんと動くようになったのですが、引っかかったポイントを記録しておきます。なにしろ、MPI とかじゃなくて、直接 TCP で通信するプログラムをまともに書くのは、自分が学生だったときの学生実験以来なので…
Address already in use
デバッグ中はプログラムを走らせて止めて、修正してはすぐ起動するわけですが、すぐ同じポートを使うプログラムを走らせると Address already in use になって bind() できないことがあります。
これは、ソケットが close されてもしばらく再利用できないため (再利用できるまでの時間はTCP/IP stackの実装依存っぽい) で、setsockopt() を使って解決します。FreeBSD/MacOS X では SO_REUSEPORT も指定しますが、Linux では SO_REUSEADDR だけで動くみたい、というか、SO_REUSEPORT がありませんでした。
[code:cpp]
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char*)&on, sizeof(on));
#if defined (__FreeBSD__) || (__APPLE__)
setsockopt(sock, SOL_SOCKET, SO_REUSEPORT, (char*)&on, sizeof(on));
#endif
[/code]
ブラウザへデータを送信するタイミング
いまのところ複数のクライアントから接続されることはないので、何回目のアクセスではこれを返す、というのが静的に決まっています。そこで、accept() で接続が成立したらすぐにブラウザにデータを送信すればいいや、と思ったのですが、ブラウザによってはブラウザがリクエストを送信するまえにデータが届くとエラーになるようです。
ちゃんと GET がくるまで待ちましょう。あたりまえか…
Socket を close() する前に
BSD 系のシステムでは問題が起きなかったのですが、Linux ではデータがブラウザ側に届く前に、サーバ側から RST が送信されて接続が切れてしまう問題がおきました (これは最初全然わからなくて、wireshark で通信の様子をのぞいてみてはじめて気づきました)。RST が突然送られるので、ブラウザにどこまでデータが送れるかは、毎回違う感じです。
最初は socket を fdopen() して fgets() や fprintf() でアクセスするのが悪いのかな、と思って、最後に fflush() してみたりしたのですが、状況は改善しません。それで、まじめに send() と recv() を使うようにもしてみましたが、やはりうまく動作しません。
で、いろいろ調べた結果、受信バッファにデータが残った状態で socket を close() すると RST が送信されるということがわかりました。つまり、GET がきただけで返事を送っていたのですが、最後の空行まで受信してから返事をすれば OK ということです。
受信バッファが空でないと close() のときに RST が送信されるという挙動、もしかしたら Linux だけなのかもしれませんが、気をつけないといけませんね。
SyntaxHighlighterいれてみた
同じような名前のエントリ書いてる人が100人くらいいそうですけど、MovableTypeでコード書くときに不便なので、SyntaxHighlighterいれてみた。これすごいね。
HTML Head のテンプレートの最後に、
[code:xml]
<$mt:SyntaxHighlighterInclude brush="cpp,php,jscript,xml" theme="default"$>
[/code]
と書くだけでした。あとは本家のサイトに説明がある通り。各種言語に対応しているのも非常にありがたいです。Verilog-HDL とか VHDL とかはないけどね… (書けって?)