コミケ告知

サークル活動の詳細は circle タグの記事へ。
2013年4月30日火曜日

findで特定条件の最新ファイルを探す

find 検索条件 | xargs ls -t | head -1
lsのオプションにhead -1相当のものがあるのではないかと確認しましたが、見つからず。
UNIXの思想からして、専用のツールをパイプで繋げるのは正しいのだろうけど、若干打つのがめんどくさいですね。

使用目的

実行ファイルが落ちたときに、最新のダンプファイルをgdbに食わせたかったけども、探すのが意外とめんどくさい!というのが元々のモチベーションでした。
gdb ./a.out `find -name "*.core"  | xargs ls -t | head -1`
他には、適当な名前のログファイルや一時ファイルから最新を探したい場面も、たまにあったような気がします。

シェル関数化

定型処理がめんどくさいので、latestで呼び出せるように。
### .zshrc等
latest() {
    find -name $1 | xargs ls -t | head -1
}
% latest "*.core"
./hoge1.core

-regexにした方がいいかなあと一瞬思ったけども、特定の拡張子を探すという主目的において、".*\.core"と打つのが嫌なので、-nameにしました。
$@にすれば他にもfindのオプションが指定できるのではないかとか、xargs ls -t | head -1だけまとめるのが美しいのではないかとか、そんなことも同様に一瞬考えて没案に。
2013年4月29日月曜日

F#のUnit Test、FsUnitの設定(VS2012)

問題点

F#でもテストを書こうと、NuGet経由でFsUnitをインストールしてみたものの、当初は動作させようとするとFileNotFoundExceptionが出て動きませんでした。"FSharp.Core, Version=4.0.0.0"というアセンブリを探していますが、手元のFSharp.Coreは4.3.0.0なのです。

解決方法

FsUnit公式のVisual Studio 11 Supportのところを読むと、Add-BindingRedirect projectnameを使えと書いてあります。
Powershellのコマンドのようですが、普通にPowershellを起動してもだめで、VisualStudioのメニューから起動する必要がありました。ツール→ライブラリ パッケージ マネージャ→パッケージ マネージャ コンソールです。


ここで Add-BindingRedirect コマンドを使えば、App.configが更新されて、無事FSharp.Coreを読み込めるようになりました。こんなつまらんことで、1時間以上はまりましたorz Microsoft(.NET)慣れした人なら、こんなことは無いのですかねえ。

FsUnitというよりNuGet自体のバッドノウハウでしょうか。なんだか微妙なパッケージ管理ですね…

FsUnitの設定

F# Library Projectは直接実行できないので、隣にF# Console Appのプロジェクトを作って、そちらでテストを書いています。普通にmain関数でテストを順々に呼んでいるのですが、このやり方は正しいのでしょうかね…?
Console Appについては昨日の記事参照。新規作成後、いらんファイル消して、NuGetでFsUnit入れて。さらにテストプロジェクトのReferencesを右クリックして、参照の追加→ソリューションからテスト対象のプロジェクトを追加しています。
2013年4月28日日曜日

F#アプリケーションを新規作成するためのテンプレート集

Visual StudioでF#を扱う場合、プロジェクトとして選択できるのは「F# Library」と「F# Tutorial」だけです。

以前、F#談話室(2)において、はじめてのF#入門コースとしてWindows Formを使ったアプリケーションを作る際には、Tutorialを改造して作り始める、ということをしていました。(記事→F#談話室(2) に参加してきた)

Microsoftのテンプレートギャラリーにある、F# Applications Windowsという拡張を入れると、新規作成でアプリケーションを作りやすくなるテンプレートがいくつかインストールされます。おそらくMicrosoft公式のものではないけれども、作者の所属がMicrosoft UKらしいので、どこぞの学生が適当に作ったレベルでもなさそうです。


F#Windows App (WinForms)

昔ながらのWindows Formを使うアプリのテンプレートです。
こんな感じの最低限のフォームが出ます。ラベルが1つある以外は何も機能はありません。
フォーム定義はMainFormfsにまとまっていて、ClientSize等のプロパティへの値代入と、ハンドラの定義のサンプルが多少書かれています。

F#Windows App (WPF)


Windows Formと似たような構成のWPF版。クリックすると文字が変わります。つまり、中央のコントロールのTextプロパティ変更と、ハンドラ追加のサンプルが最低限書いてあります。

F# Console App

コンソールアプリです。ただこれは、個人的にはあまり好きではありません。Argumentsという引数処理用の、おそらくテンプレート作者が書いた独自仕様のmodule(Argument.fs)が組み込まれていて、プロジェクトのテンプレートとしてはやや冗長です。
しかも、初期状態ではプロジェクトから「開始」を押してもちゃんと走らない。ソースコード中で「Required」と指定している第一引数がないのですぐ死んでいるのですが、ここはコンソールの窓に普通にHello Worldでも出して欲しかった。

雑感

入門向け勉強会やハッカソン、あるいは自分用の単純なGUIを作る際のベースとしては、良い感じではないでしょうか。

2013年4月22日月曜日

第17回 FreeBSD勉強会に参加してきた

FreeBSDには一切興味も経験もありませんが、概要を見たところFreeBSDを使うではなく作るという方向性に見えたため、おそらく得るものがあるだろうと考え参加しました。

内容

予想通り、ネットワークスタックの構造とNICに載っている機能の話であり、FreeBSD特有の話はほとんどありませんでした。FreeBSDにはないけどLinuxにはあるよ、という部分の方が多かったくらい。

このあたりのレイヤーで考えた事のない運用者向けに性能要点を広く説明するという感じでした。割り込み頻度の話(NIC機能とNAPI相当)・マルチコアへのスケール(主にMulti-queue NIC)等々。特別フレッシュな話題はありませんでしたが、調べるカギとなるキーワードが色々詰まっていたし、説明もわかりやすかったので、入りとしては非常に良い勉強会だったのではないでしょうか。下層ネットワーク屋を本業とする者が目をギラギラさせて聞くものではなかったけれども。

遅刻

本題とは関係ありませんが…
講師の方が30分遅れて、何事もなかったように普通に説明して普通に終わりました。
まあ、2000円で120分が2000円で90分になるとか、仕事を早めに切り上げてきた一般人数十名の30分が無駄になるとか、その程度では実績のある人の評判に対して影響は全くないと言っても良いのですよね。
こういう国内技術者のモラル構造を見るに、いくらでも家入一真は出るのだろうな、と思いますが。

余談1

ところで、序盤の時間繋ぎの雑談で「CPUの温度が太陽表面に達する」とありましたが、それは発熱密度の話ですね。(その場で突っ込めず、帰宅してぐぐって確認するチキン野郎)
参考→http://pc.watch.impress.co.jp/docs/article/20010206/kaigai01.htm

余談2

性能をカリカリチューンするという話題にnetmapが出てこないなんてー
2013年4月20日土曜日

F#談話室 (4) に参加してきた

前回咳が止まらなくて病欠してしまったF#談話会、今回は無事参加できました。


自分の作業 (VS2012 for Web単体でF#ライブラリ プロジェクトを動かす)

15時頃着いて、まず馬券を買ったのちに作業開始…しようと思ったら、なんとVisual Studio 2012のWindows DesktopをノートPCに入れていなかったことが判明。C#からF#のライブラリを呼ぶものを今日は作ろうと思っていたのに、これは誤算です。
ただ、ライブラリ部分をC#から呼ぶだけならば、C#単体テストプロジェクトがfor Webでも作れるので、これでいけそうです。ビルド依存性の設定で、C#単体テストプロジェクトがF#ライブラリ プロジェクトに依存するように設定。

F#ライブラリ プロジェクトにはScript.fsxが入っているので、これが実行できればプロジェクト単体でいくつかテストも出来ると思うのですが、いまいち使用法がわかりません。普通に実行しようとすると、出力がライブラリなので実行できませんという、ライブラリプロジェクトに対してはごく普通のエラーメッセージが出るのみです。

F# Interactive を立ち上げて #load してみましたが、カレントディレクトリがWindowsのTempディレクトリになっているようで、使い勝手がイマイチですね。

作りたいものも決めていったのですが、実装作業の進みはいまいちでした。APIを調べながらの作業はノートPCで行うには不向き、かつどちらかというと設計段階でメモ帳に手書きみたいなフェイズであり、これ家でやった方がいいなあ…という感じでした。ノートPCで作業しても問題ないフェイズにしておくことを、次回以降は考えておきます。


LT

ヘヴィなトークが2時間くらいありました。16時→18時がLTだったので、結局参加時間のほとんどLT聴講に…!F#という言語をどう使うか?どういう利点があるか?というのは自分の謎でも、世間の謎でもあります。ヘビーユーザーの使いかた、というのは参考になりますね。
コンピュテーション式を使えるくらいになると、楽しくなるのかなあ。
2013年4月15日月曜日

Cygwin+SBTでEnterキーが効かない場合の対処

現象

Cygwin上でsbtを起動は出来るが、Enterキーが効かないので何もできない。


原因

ターミナルの設定とSBT側の処理が合っていないのが原因。sbt-launch.jarを実行するときに、-Djline.terminal=jline.UnixTerminal を引数に渡せばよい。

Windows用のsbt…すなわち、msiでセットアップされるsbtや、アーカイブ中のwin-sbtには、$TERMがxtermのときだけ前述のオプションを渡すという中途半端な処理が書いてあるのだが、少しでも違うとそちらの分岐に行かない。(たとえばminttyのxterm-256color)


対処

  • sbt.batをいじって、必ず引数が渡るようにする
    •  if [ "_$TERM" = "_xterm" ]; の判定文をいじるとか
    • "$JAVA_CMD"のあとに直接書いちゃうとか (cmd.exeから呼んだときに大丈夫かどうか知らないが)
  • あるいは、環境変数 $JAVA_OPTS に指定する

2013年4月4日木曜日

fluent-plugin-websocketのgemを公開

fluentdのプラグインとしてwebsocketに流すようなものを作ってみた…というのは前回書きました。→ Fluentdの出力をWebSocketに流すoutput pluginを書いた
その後、せっかくなのでRuby周辺をもう少し触ってみようと思い、もう少しだけ手をかけました。

  • テストを作成
  • ログ出力の変更
  • gemとして公開
  • READMEをmarkdownからrdocに変更

テストを作成

fluentd公式のドキュメントにも、作成のための情報が色々詰まっていて参考になったスライドにも、テスト関係の情報はあまりありません。そのため、fluentd本体に含まれるテストコードを参考にしました。

このpluginはwebsocket serverなので、client側が必要です。client側はブラウザであることが多いためか、client側の実装はあまり多くなさそうでした。
いくつか試した上で、websocket-eventmachine-clientで接続することは出来たものの、いまいちテストが確実に成功しません。sleepをあちこちに挟んでみたものの、接続が出来上がる前に終了してしまう事があるようで。
また、設定項目use_msgpackがtrueとfalseの2通りのテストを試したかったけども、これも上手くいっていません。 create_driverの引数にconfigを書けば、それに従ったインスタンスが出来るのかとパッと見で思いこみましたが、後に書いた方が失敗してしまいます。

ログ出力の変更

fluentdにはちゃんとロギングの仕組みがあるようなので、putsなどではなくそちらを使うことにしました。既存pluginのソースを見たところ、$log が存在して、warningとかinfoとかに出力できる模様。レベルの定義はlog.rbにありました。

  LEVEL_TRACE = 0
  LEVEL_DEBUG = 1
  LEVEL_INFO  = 2
  LEVEL_WARN  = 3
  LEVEL_ERROR = 4
  LEVEL_FATAL = 5

traceは-vv、debugは-vで出るようです。

% fluentd -h
Usage: fluentd [options]
  -v, --verbose  increase verbose level (-v: debug, -vv: trace)

待ち受けソケットを開けたときにはinfo、clientからの接続開始・終了やその他動作状況はtraceで出してみました。in_forwardがlistenのときにinfoで出していたので。
$log.trace "Started em-websocket thread."
$log.info "WebSocket server #{@host}:#{@port} [msgpack: #{@use_msgpack}]"

gemとして公開

この程度のものを公開して良いものか?と気後れしつつも、rubygems.orgで公開してみました。

gem install fluent-plugin-websocket でインストールできるようになった…と思います。
gemspecを書いて、rubygems.orgのドキュメントに従いgem buildしたら、何事もなくgemが出来ました。Publishing your gemの項にあるとおりに、curlでAPI keyを引っ張ってきたのちにgem pushしたら、これもあっさり登録されました。
最初にpublishしたものが、よりによってdependenciesという重要なところにtypoがあったため、それのために0.1.2から0.1.3に上げるという悲しいことに…(;´Д`)

この時点で自己満足完了でしたが、fluentd公式のpluginページに載っていて、現時点で80くらいのダウンロードがあるようでびびっています。(小心者)


READMEをmarkdownからrdocに変更

ついでの初体験。同じような機能なのに微妙ーにマークアップが違うんですねえ。
苦労してなんとか形にした後に、これは大変だと思ってvimで色付けしてくれるスクリプトを探しました。順序が逆ですね。 Bundle 'RDoc' で色がつくようになったので今後はきっと大丈夫!

今後

とりあえずは動くので、自分が使うのに不便はありません。安直な方向では、使っているライブラリの機能をもうちょっと使えるようにするくらいかな。https等々。
フィルタリングとか加工とかについては、独自に内部に作るのは何か違うかなーと思っています。(他のpluginってチェーンできたっけ?)