コミケ告知

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

C85活動内容

C85 3日目 (12/31 火曜) 西地区 "し" ブロック 39b サークル 浜風もっこす

内容は以下を予定しています。

  • 新刊
    • ネットワークマニアックス vol.2
      • QUIC
      • FiddlerCoreを用いた解析の初歩
    • (少し初歩っぽい内容のコピー本が増えるかも)
  • 既刊
    • ネットワークマニアックス vol.1(C84)
      • TCPの高速化手法
      • ネットワークバッファ

既刊の内容については、前回の記事もご覧ください。

新刊概要

前半は、Googleの人たちがChromiumプロジェクト中で実験を始めたプロトコル、QUICの説明です。
  • 概要と立ち位置の説明
  • ブラウザで試してみる方法
  • テスト用のサーバー・クライアントをビルドして遊んでみる方法


後半は、FiddlerCoreを使ったネットワーク解析の一歩目の手順の解説です。
  • ライセンスの話
  • サンプルの起動
  • イベントの説明
  • body部分の取得
特定サイトの特定のクエリーに対するレスポンスを取るくらいまでなら、出来るようになるはず。
艦○れ等のゲーム解析は節度をもってお願いしますw

当日について

人気ジャンルでも人気サークルでもないので、急いで来る必要は全くありません。ただコピー本については、生産能力に限界がある都合、単に数が少なくて昼すぎに消滅してしまうことはあります。
このジャンルは例年、11時~12時半あたりがピークで、13時以降一気に閑散とし、14時半以降は滅多に人が来ない(そのため撤収サークル増える) という感じです。

# 当日追記
C85新刊中のURLをまとめた記事はこちら→ C85新刊用リンク集


2013年10月26日土曜日

FiddlerCoreのライセンス

艦これの通信内容を覗き見るのに便利なFiddlerですが…



基礎となる部分はFiddlerCoreとして切り出されて公開されています。

ライセンスを確認したところ、個人が無料のソフトウェアとして公開する分には、使用しても問題なさそうです。

条文はインストール時のダイアログにも出ますが、Windows文化の常として(?)、これは絶望的に読みづらいですね。なんだか順序が逆ですが、インストール後に、License.txtで確認できます。Fiddlerのライセンスとは違って、Coreの方はなかなかの長文。
以下は 1.5 Non-commercial License 項目内の一文です。

1.5.2 Restricted Scope of Use.  If You download the free Non-commercial License, the Software (i) may be used for development purposes by no more than five Licensed Developers and (ii) may only be embedded within Integrated Products that do not generate profit. 
generate profit に、donate me!スタイルは入るのでしょうかね~

ライセンスの変化?

Fiddlerについては、作者本人による解説書籍がリリースされています。

英語版は10USDと非常に安いので、使うかどうかわからんのに買ってしまいました。日本語版は2.5倍くらいの値段がします。
この本は2012年頃の発行で、その時点では、とても緩いライセンスが設定されていたようです。書籍中より引用。

Fortunately, FiddlerCore has a simple license. You may freely redistribute the FiddlerCore assembly with your application, without payment of any royalties, subject to the terms in the License.txt file included in the package.
The license terms are quite liberal, and amount to a statement that the library is provided with no warranty and you may not use it for any illegal purpose.
 作者本人の2011年のTweetも見つかりました。



これらの情報と現在のライセンス条文が同じとは思えず不思議に思い検索してみると、2013年6月の本人の投稿が見つかりました。
FiddlerCore was recently updated and bears a new EULA,
ライセンス形態は、ある時期を境に変わっているようですね。個人で、お金を取らないソフトウェアを開発する分には問題なさそうですが。
オライリーの邦訳版は2013年5月の発行で、ライセンスの説明がどうなっているのか気になります。


余談

個人的に気になったのはもちろん、自分が趣味のソフトウェア開発に用いる場合でしたが、このライセンス文には面白い文言がありました。

Content Management System and/or .NET component vendors are not allowed to use the Software (as defined below) without the express permission of Telerik.

業務内容によってライセンス取得が制限される模様。
2013年9月7日土曜日

Windowsのプログラムの標準出力とリダイレクトと

 Windowsでもコンソールアプリから…

Z;\>hoge.exe > log.txt

 このようにすると、標準出力がファイルにリダイレクトできます。
 ところが微妙に複雑な仕様があるらしく、若干うまくいかなかったのでメモ。


状況


 普通に実行すると、標準出力にテキストを色々吐くプログラムがあり…
Z;\>hoge.exe
I love beef!
I love pork!
 ファイルにリダイレクトすると、出力されないものがある。どういうこっちゃ。
Z;\>hoge.exe > log.txt
Z;\>type log.txt
I love beef! 
 

解明

テスト用のソースコードは以下。

リダイレクトしなかった場合の出力: (実際には微妙な色で装飾される)
GetConsoleScreenBufferInfo: OK
SetConsoleTextAttribute: OK
I love beef!
WriteConsole: OK
I love pork!
WriteFile: OK

リダイレクトした場合にファイルに書かれる内容:
I love pork!
GetConsoleScreenBufferInfo: NG
SetConsoleTextAttribute: NG
WriteConsole: NG
WriteFile: OK
  • ファイルにリダイレクトされた場合、Console関係の関数は失敗する
    • WriteConsole
    • GetConsoleScreenBufferInfo
    • SetConsoleTextAttribute
  • WriteFileはリダイレクトの有無にかかわらず成功する
  • (w)printfはリダイレクトの有無にかかわらず成功する
 リダイレクトによって挙動が変わるなんて思っていなかったので、ログ全体をうまくファイルに書き出せずに焦りました。WriteConsoleした分は引き続き画面に出る…というわけではなく、単純に消滅します。
 そういう挙動が嫌なら、WriteConsoleは使わずにWriteFileを使うのがよさそうです。着色のために呼ぶConsole関係の関数が失敗しても、気にせずWriteFile。
2013年8月13日火曜日

C84 お疲れ様でした

参加者の皆様、お疲れ様でした。
おかげさまで、ネットワーク本が12時すぎには完売しました。部数を迷ったのですが、想定よりかなり早いペースで出たため、結果としては読み違いでした。今まではEthernetのレイヤーの話を書いていたことが多かったのですが、やはりTCPの方が興味のある方が多いのでしょうね。
次回があれば、オフセット版を出したいと思います。また、そぎ落とした話題が多いので、続編も作れれば、などと。やる事が明確なときに限って、落ちるんですけどね…
2013年8月11日日曜日

C84 活動内容

C84 3日目 (8/12 月曜) 東地区“プ”ブロック-57a サークル 浜風もっこす
なんとか新刊も出そうです。

  • C84新刊 「Network Maniacs 2013」 20p
ネットワーク関係のマニアックなネタを解説する本です。
色々詰め込むつもりでしたが、内容にまとまりがなくなってしまったので、最終的に2テーマに絞りました。「TCPの高速化手法」と「ネットワーク上のバッファリング」です。
サンプル貼っておきます。編集画面のキャプチャなので多少表示が違いますが。
(クリックで拡大するはず)

 20130811222137

  • 既刊 「無職生活からのIT業界転職活動」 20p
C83で出したものです。
無職生活&転職活動の記録と傾向、それから雇用保険(失業保険)について説明したものです。
こんな本が役に立たない社会になってくれた方がよいのですが!

2013年8月1日木曜日

C84用リンク集

コミックマーケット84 (C84)で頒布した本の中に記載したリンクをまとめた記事です。

・ネットワークマニアックス2013

2013年6月29日土曜日

W7100Aの起動に挫折

Wiznetという韓国のメーカーがハードウェア処理TCP/IPのチップをいくつか出しています。PHYのついているW5x00のシリーズ、特にSPI接続のできるW5100は、接続が手抜きできるという理由で地味に使われていた印象があります。
Network機能だけを持ったコアなので、お好きなマイコンで外部から制御しておくんなまし、というチップですが、汎用CPUコアが 一緒に封入されたW7x00シリーズというものもあります。旧式、Intel8051が乗っているのがW7100で、ARMが乗ってるのがW7200。以前なぜか購入して放置していたW7100を、ふと思い出して動かそうとしました。

動きませんでした\(^o^)/
本当ならここがスタートで、色々と解析を始めるのですが、あまりにも情報が少なすぎて大変そうなのでもういいかなと。データシート見て配線確認する以外に、出来ることがない…。WIZnetの提供する読み書きソフトウェアを使って、シリアル経由で接続を試みますが、「read flash operation mode timeout」と出るのみ。最低限読み書きができたら、色々頑張ろうと思ったんですが。こりゃ手も足も出ない。電圧はしかるべき値がしかるべき場所に突っ込まれているんだけど。


Googleで検索すると、同じ症状の人が見かけられますが、結局解決されていないようです。
公式で放置されているとはw


トラブルの回避方法どころか、このW7100を使った事例を探しても、ほとんど見当たりません。W7100の評価ボードを使った例は無くはないようなのですが。2010年公開のデータシートやサンプルのダウンロード数が3000台なので、どれだけ売れてないんだか。2011年公開のW5100最新データシートで16000くらい。

現在はこのチップ、Serial to Ethernetのファームが既に書き込まれた製品としても売られているようです。

http://www.wiznet.co.kr/Sub_Modules/en/technical/Download_View.asp?PK_Num=587

汎用のはずが、なぜか固定機能を書き込んで売ってる。しかもよく見たら、W7100の方はGPIOは潰されてるしuser passwordくらいしかConfigurableになっていない。とても怪しい。まともに動くのかなあ、このチップ。

64kBのメモリが組み込まれていてスペック上は魅力的ですが、動作するのが明らかなW5100・W5300あたりと、使い慣れたマイコンと、必要なら外付けメモリ…という感じで、単品を組み合わせた方が良さそうです。本家とサポート契約して本格的に開発するつもりでもなければ。
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ってチェーンできたっけ?)
2013年3月31日日曜日

Fluentdの出力をWebSocketに流すoutput pluginを書いた

Fluentdの出力をWebSocketに流すだけのoutput pluginを書いてみました。Rubyが全然わからないので、使い方をぐぐりながら。
普通はモニタリングしたければログなり標準出力なりに出せばいいので、広く一般に使えるものではないでしょう。リモートで動いているFluentdが吐くデータを、ちょっと手元のブラウザに出してみたかったんじゃよ。

いわゆる自分用プラグインです。インストールは「pluginディレクトリに置いてくれ」「em-websocketに依存してるからあれ入れてね」というバルクな仕様。他に使う人がいれば、Gemにした方が良いのかもしれません。

はじめてのRuby雑感

何かの勉強会でサンプルがRubyだったため、1回書いたことがあるような気がしますが、何も覚えていませんでした。変数の種類とかifの書き方とかを検索するレベル。
Rubyでは、変数に関数を直接代入は出来ないという理解であってますかね?検索したら proc というのが出てきたので、とりあえずそれを使ってみました。変数に直接関数入れられる言語と比べると、めんどくせーなーという印象です。

はじめてのWebSocket (クライアント側) 雑感

WebSocketってきっと面倒で、専用のライブラリがあってそれを使うのかな…と想像していましたが、生のWebScoketオブジェクトを使ってちょろっと送受信するだけなら簡単でした。
websocket.orgにechoのサンプルがあるので見ると、WebSocketのオブジェクトをnewして、あとはハンドラ(onXXX)に必要なものをセットするだけです。サンプルをここに書きおこす必要は感じられない程度に、シンプル。
最初はサーバーを自前で立てなくても、サンプルで使っているws://echo.websocket.orgで試せるのも有難いです。サーバーの動作を疑わなくてもよい点で。

はじめてのWebSocket (サーバー側) 雑感

FluentdのプラグインはRubyである必要があるため、em-websocketを使いました。作者が作者だけにrev-websocketで…とまず思ったけど、3年間更新されてませんね。動きませんでした。
exampleの中にあるmulticastのサンプルを見ながら動かしたら、意外とあっさり複数接続も出来ているようです。

FluentdはMessagePackフォーマットで出すのも簡単なため、受信側にmsgpack.jsを組み込んで、バイナリ送信にも対応しました。その際、いつものsendメソッドで送ろうとしたら接続が切れてしまうので何かと思ったら、どうやらsend_binaryという別のメソッドがあったようです。pull requestの履歴の中にありました。READMEの範囲では、そんなのわからなかったよ…
2013年3月19日火曜日

g++ -std=c++11で色々と"not declared"が発生する場合

状況

  • g++でコンパイル
  • -stdの指定をしなければ万事うまくいく
  • -std=c++11を指定すると、not declaredになる関数がたくさん出る
    • snprintf, strdup, fileno等 
例:
hoge.cpp:20:21: error: ‘strdup’ was not declared in this scope

解決方法

-std=c++11ではなく、-std=gnu++11を使用する。

参考にしたのは、2年ほど前のstackoverflowの記事でした。
acceptされた解答にあるように、厳密に標準のC++の関数ではなくてGNU拡張であるため、こういうことが起きるようです。

使用したg++はCygwin上の4.7.2でした。
2013年3月12日火曜日

BOOST_FOREACHは参照で受けないとコピーされる

C++でループを回てコレクションを巡回するときに時折役に立つ、BOOST_FOREACH。(boost/foreach.hpp)
便利なんですが、巡回先のコレクションから受け側の変数に代入されるだけなので、参照で受けないとコピーされます。

以下のような、テスト用にコンストラクタ・デストラクタでprintfするだけの適当なクラスがあるとして。
class Hoge {
  public:
    Hoge() { printf("ctor %p\n", this); }
    Hoge(const Hoge& h) { printf("copy %p\n", this); }
    ~Hoge() { printf("dtor %p\n", this); }
};
気を使わずに単に変数で受けて巡回すると…
vector<hoge> hoge_vector(3);
BOOST_FOREACH(Hoge x, hoge_vector) { ; }
ctor 0x20010210
ctor 0x20010211
ctor 0x20010212
copy 0x28ac26
dtor 0x28ac26
copy 0x28ac26
dtor 0x28ac26
copy 0x28ac26
dtor 0x28ac26
dtor 0x20010210
dtor 0x20010211
dtor 0x20010212
ですよねー。参照(&x)で受けないと、スタック上にコピーして破棄してを繰り返しています。関数の引数でオブジェクトを値渡し、みたいな話でちょっと恥ずかしい。 boost.org公式のドキュメントにも、"Iterate over a sequence by reference, and modify the underlying sequence" という例が書いてあります。

参考:公式ドキュメント

参照で受ければ、もちろんコピーされずに済みます。
BOOST_FOREACH(Hoge &x, hoge_vector) { ; }
ctor 0x20010210
ctor 0x20010210
ctor 0x20010211
ctor 0x20010212
dtor 0x20010210
dtor 0x20010211
dtor 0x20010212
こんなくだらない話ですが、autoを使おうとするときって、型に対する意識が散漫になりませんか?
BOOST_FOREACH(auto x, hoge_vector) { ; }  // コピーされるよ
BOOST_FOREACH(auto &x, hoge_vector) { ; }
このループで変更を加えようとしている場合には、一時的に複製されたものを触っても何もおきなくて気づきます。しかし、読むだけの場合にはロジック上の不都合は起きないので、うっかりこのようなコードを埋め込んでしまうかも。
# boost 1.48.0にて確認
2013年3月9日土曜日

Chrome「プロフィールを開くことができませんでした」の解消

症状

起動時に「プロフィールを開くことができませんでした」というポップアップが毎回出る。

解決方法

C:\Users\ログインユーザー名\AppData\Local\Google\Chrome
の下の、Web Dataから始まる名前のファイルを削除。

雑感


こんな事をしようとした原因は、Chromeの開発版を最近アップデートしたら、アドレスバーの右に出るタイプの拡張機能が全滅したことでした。はてなブックマーク拡張とか、Adblockとか、クリックしてもpopupが出なくなってしまって、快適なWeb徘徊に支障をきたしていました。
どうしてこんな重大なバグを含むリリースがされてしまったのか…。とりあえず直ったので良かったですが。

開発版を使いたい場合、Google Chrome Canaryをインストールするべきですね。今回困ってあちこち検索するまで、存在を知りませんでした。通常のChromeとは別物として、同じ環境に同時にインストールできます。
2013年2月28日木曜日

C# (VS2012)のプロジェクトからF#のライブラリを呼ぶための初歩

Visual Studio 2012 Express Editionを使って、C#のWindowsアプリからF#のライブラリを呼ぶ。…ということをやりたかっただけなのに。VS2012では、F#はVisual Studio Express for Web、C#のデスクトップアプリケーションは、Visual Stidio Express for Window Desktopの担当に分けられていて、無用にめんどくさかったです。

手順


Windows DesktopのWPFアプリのソリューション内に、F#のライブラリプロジェクトを作成!ができれば簡単だったのですが、どうも上手くいかず、現在のところ以下の手順でなんとかしています。

  1. for Webを使って、F#ライブラリプロジェクトを作成
  2. そのプロジェクトで出来たdllを、for Windows DesktopのC#プロジェクト内「参照設定」に追加
    • 参照設定→参照の追加で開いたダイアログ中の「参照」を押すとファイル選択ダイアログが出るので、選ぶ
      • ライブラリプロジェクト名のdllがDebugとかReleaseとかの下にあるはず
    • 同様にFSharp.core.dllも追加
 

fow Webの画面でF#をいじりつつ、for Windows Desktopの画面でWindowsアプリケーションをいじっています。どうにか1つに出来ないものかね…。

for WebでF#を動かすまでの話は少し前のポストの序盤に書いたので、あちらを参照で。
あれ?DebugとReleaseどっちを追加すればいいんだ?切り替えるには、プロジェクトファイルに手を入れないといけないようです。F#で遊んでいる段階では常時Debugビルドでもいいんですが。


プロジェクトを参照出来れば、こんなことをする必要はなく楽なのに。F#プロジェクトを含むソリューションを開こうとすると「このEditionではダメ」と言われてしまいました。出来る方法があったら知りたい。

  • (2013/02/24追記) F#ライブラリは、--standalone をコンパイラに渡すと、F#関係もバンドルされたdllを生成できる (C#側でFSharp.dllを別に読まなくても良い)

デバッグ

プロジェクトは分かれていても、for Windows Desktopの側からステップ実行したり、F#のソースにブレークポイントを張ったりできます。


F#で定義したところにステップインすると…

F#のソースがそのまま見えます。ブレークポイントも設置できます。普通にファイルを開いているだけなので編集もできますが、for Web上のF#ライブラリプロジェクトでビルドしないと反映されません。両側で編集しちゃうと危険。

技術的にはF#が混在することに全く問題なさそうだけれども、機能が潰されてる感じですね。普及段階なんだから、もうちょっとなんとかしてよ、と思います。
2013年2月23日土曜日

JRA公式Webのリンクに小細工するだけのChrome拡張

自作Chrome拡張は意外と難しくないことがわかったので、変な小物を色々と作っています。画像保存とか特定の文字列をコピペするとか、公開したくないようなものが多いですが。

今日は、JRA公式Webサイトのリンクの挙動を書き換えるものを作っていました。

目的


このWebサイト、官公庁なので仕方ないですが、少し古いつくりです。

通常のハイパーリンクと、JavaScriptで処理されるリンクが混在しています。通常のリンクは良いのですが、JavaScriptで処理されるリンクは、右クリックから「新しいタブで開く」を使おうとしても、新しいタブでは正常に開けず、エラーが発生します。さらに残念なことに、見た目ではこの2種類のリンクは区別がつきません。

関連する情報を並べることができないので、タブ一枚で進んだり戻ったりしながら閲覧するのに疲れたので、少し小細工するための拡張を作ることにしました。

構造

JavaScriptで処理されるリンクは、doActionという関数にパラメータが渡されるようになっています。中を見るとただのアンカーではなく、ページ内の隠しフォームにパラメータを入れて、GETではなくPOSTでデータをSubmitすることにより、次のページを開いているようです。

実装


Google先生に尋ねたところ、form.targetに開く先を指定できることがわかりました。リンクの開き方がわかれば、あとは通常動作と「新しいタブで開く」動作で分岐すればよさそうです。とりあえず、Ctrlキーを押しているかどうかを判定し、押されている場合は新しいタブで開くことにしました。

ついでに、あまり使わないけれども、shift同時押しでウィンドウが開くように。適当にターゲット名をでっちあげて、毎回違うウィンドウが増える仕様です。


Chromeの「拡張機能のパッケージ化」では、ディレクトリの中身をまるごと全部、つまりアイコン作成用の作業ディレクトリ&ファイルや、.gitまでまとめて固めてくれるみたいです。そのため、固めるように別ディレクトリを作り、必要なファイルだけそちらにコピーして固めるようにしています。

雑感

Chrome拡張、くだらないものが、それに見合った労力で作れるのが良いですね。ウェブストアに公開するような場合は、細かい作りこみが増えて大変なのかもしれませんが、自分用に作る分にはとても気楽です。
難点があるとすれば、JavaScriptは動的型付け言語のため、簡単なコードですらエラー箇所特定が大変なところです。Chromeのデバッグ環境はかなり強力ですが、それでもあまり大きなものは作りたくありません。
2013年2月20日水曜日

rvmのfirewall対策 (gitのプロトコル変更)

Ruby言語は自分では書かないし使うこともあまりないのですが、バージョンが依存があってめんどくさいので、複数のバージョンをひとつの環境内に共存させるのが割と定番みたいです。 そういった環境管理ツールのひとつがrvmなのですが、内部でgitを呼び出すときに、HTTPではない(ファイアウォールで閉じられていることの多々ある)ポート番号を使おうとする上にエラー処理が適当なので困ります。

debian# rvm install 1.9.3-head
Installing Ruby from source to: /usr/local/rvm/rubies/ruby-1.9.3-head, this may take a while depending on your cpu(s)...
Cloning from git://github.com/ruby/ruby.git, this may take a while depending on your connection...

タイムアウト処理が一切ないようで、接続できなければ永遠に待ちます。gitのプロトコルが使えないのに待っていても成功することはないので、どうにかします。 rvmの中をgit://という文字列で検索をかけたところ、rvmのディレクトリ/config/dbに設定があり、こいつの中身を置換すればいいようです。

git:/をhttps:/に一括置換したところ、うまくいきました。
2013年2月16日土曜日

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

今年も何か新しい言語に触ってみたいと思っていたところに、ちょうど入門コースのある勉強会があったので、参加してきました。
みんなで一斉に進めていきましょう形式ではなく、各自好きなことをやる集まりです。時間も夕方のLT以外は特に予定なく。

自分はF#の最初の一歩から始めたかったため、主催の七誌さんがビギナー向けとして用意してくださっていた資料を見ながら進めました。到着が17時、場所を閉めるのが20時、その間約3時間の参加でした。

環境のセットアップ (VS2012 ExpressでF# + Windowsフォームが遊べるまで)

無料のExpressでは、F#を使うまでに追加の作業が必要でした。F#を推進する気なら、最初から使えるようにしておけばいいのに…
  • Visual Studio 2012 for Webをインストール
  • Web Platform Installerを使って、追加コンポーネントとしてF#をインストール
    • 検索窓にF#と入れると、それっぽいものが出てくる
環境としてはここまで。チュートリアルでは、C#の入門編でやっているようにWindowsフォームを表示させて遊びたいのですが、Visual F#のプロジェクトはライブラリとチュートリアルしか選択肢がありません。実用的には、ライブラリの利用のみが提示されている状態。
そこで、「F#のチュートリアルプロジェクトを作成し、元から書いてあるコードを抹消する」という方法により、F#でWindowsフォームの使えるプロジェクト構成を安直に入手することが出来る、と教わりました。

はじめての えふしゃーぷ

リバーシ(オセロ)のサンプルをいじって、ネット上の文法のリファレンスを見ながら、途中パワーユーザーの方のLTを挟んで、実質90分ほどかけて、なんとか自分で関数が書ける程度にまで進みました。(いきなりリファクタリングっぽいところから入る性分もどうかと思いますが…)
以下がそのコードです…と丸ごと貼るには少々長かったのでリンクのみ。
https://gist.github.com/moccos/4967078

  • 自作の関数を書いた
    • 関数の引数に型が指定した
  • enumっぽいもの(?)を使った
  • if式、match式を覚えた
  • for構文を使った
  • 配列を使い始めた  (まだよくわかっていない気がする)
こんな状態です。石をひっくり返すロジックがないので、まだリバーシではなく石置きですね。

間違えたところ

  • 関数の引数に型指定するとき、カッコをけちって失敗
  • 関数呼び出すときに、引数足りなくて失敗
後者、C言語やJavaならば「そんな関数/メソッドないよ」というコンパイルエラーが出るところですが、F#は部分適用が効くので、違った形でエラーが現れます。boolを返す関数 myfunc x y を用いて if (myfunc 1) then ... と書くと、「boolじゃなくてint->boolがあるので型がおかしいよ」と言われるわけです。
ここでmyfuncの返り値を真っ先に疑ってしまいました。関数型言語そこそこに使っているのに、これは恥ずかしい…(゚Д゚)

雑感

わりと無難な感じでF#の第一歩を踏み出せたような気がします。F#でいきなり何か作るのは難しくても、C#のプロジェクトの一部にF#のライブラリを混ぜ込むような感じで、徐々に浸食していけるように頑張ります。

言語自体については…mutableな変数が簡単に定義でき、クラスの概念があるので、Scalaと似たような立ち位置になるのでしょうか。JVMに対する.NET、Javaに対するC#、Scalaに対するF#、と。
ML系の言語が初めてなので、不慣れな文法や演算子にびっくりしながら進めてました。Erlangのときも、文法にはなかなか馴染めなかったので、新しい流儀に入るときはこんなものでしょうかね。全く抵抗を感じさせなかったScalaのすごさを改めて感じました。


2013年2月13日水曜日

PARTAKEのタイトルを書きなおすだけのChrome Extension

# はてなダイアリーから移動した記事です。あまり真面目に整形していません。

なぜかイベントページのタイトルが PARTAKE になってしまうpartake.in。何度かいらっとしたので、くだらないChrome拡張を作りました。

最初はgithubに置いてみましたが、これを続けて改良していくことはないだろうし、PARTAKEがまともになれば(あるいはサービス終了すれば)それで終了な一時的なネタなので、gistに移しました。
バイナリ(PartakeTitleCorrector.crx)をChrome拡張画面にドロップすればインストールできるはずです。

実体は、ほぼ定型のコンフィグレーションファイル(manifest.json)と、1行のjavascript。やる気のないアイコンを用意する時間の方が長かったくらいかもしれません。これくらいの分量で動くなら、くだらん自分専用の拡張機能を色々作る気になります。

document.title = "PARTAKE: " + document.body.getElementsByTagName("h1")[0].innerText;

そもそもの問題として、PARTAKEの中の人ならば、TITLEタグの修正はあっという間に終えられるはず。タイトルがおかしいなんて、顔色変えて即修正するレベルの問題では?いったいどうなっているのでしょうか。もはや改良する気はなくて、売却に夢中だったりして?

# 13/02/14追記 バージョン指定が間違っていて、開発版にしかインストールできないので修正しました

2013年2月9日土曜日

RxJavaをScala(+SBT)から試してみる

# はてなダイアリーから移動した記事です。あまり真面目に整形していません。

C#のReactive ExtensionsのJava版*1であるRxJavaが、NetflixからApache License Version 2.0で公開されていました。

Rxについては

SBTのコンフィグレーション

rxjava-scalaへの依存性を書けばOK。依存しているrxjava-coreも取ってきてくれるので。

libraryDependencies += "com.netflix.rxjava" % "rxjava-scala" % "0.5.+"

最初見たときは0.5.0でしたが、今見たら0.5.1でした。

動作確認

ScalaAdaptorでテストに使われているサンプルほぼそのまま*2。くだらないけど、これが動かなければ設定がおかしいので、まずはここから。

    Observable.toObservable("1", "2", "3").take(1).subscribe(Map(
      "onNext" -> ((callback: String) => {
        println("testTake: callback = " + callback)
      })
    ))
run
[info] Running info.moccos.Main
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
testTake: callback = 1

動いているようです。
SLF4Jが邪魔ですが、ログは今は出なくてもいいので見なかったことに。(以後のログでも省きます)

java.lang.RuntimeException: Unsupported closure type というエラー

サポートしていない型をObservable.toObservableに渡すと、そんな型知らんとRuntimeExceptionを飛ばされます。最初、rxjava-core(ScalaのAdaptorがない)を引っ張ってきていたときに遭遇しました。

もう少し使ってみる

    val xs = 1 to 10
    Observable.toObservable(xs)
      .take(3)
      .subscribe(Map(
        "onNext" -> ((x: Int) => {
          println("testTake: callback = " + x)
        })
      ))
[info] Running info.moccos.Main
[error] (run-main) java.lang.ClassCastException
java.lang.ClassCastException
[trace] Stack trace suppressed: run last compile:run for the full output.
java.lang.RuntimeException: Nonzero exit code: 1
        at scala.sys.package$.error(package.scala:27)
[trace] Stack trace suppressed: run last compile:run for the full output.
[error] (compile:run) Nonzero exit code: 1

ぬ?
ここでonNextで拾う型をとりあえずAnyにしてみると…

testTake: callback = Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

お、おう。テストコードにあったようなtupleだと、ScalaAdapterが直接変換してくれて上手くいきますが、コレクションの変換はまだ実装されていないみたいです。明示的にJavaの理解できる型を渡してあげないと。

    val xs: java.util.List[Int] = 1 to 10

または

    Observable.toObservable[Int](xs)
[info] Running info.moccos.Main
testTake: 1
testTake: 2
testTake: 3

これはOK。ちなみにStreamの無限数列を渡したら、無限に数えます。push型=値を生成できる限りどんどんpushするのだから、そりゃ当然か。

使える操作

rx-coreのpackage rx.operatorsを見ればわかりそうです。

参考までに本家Rxのものは…もう2年半前で古い記事ですがこれを。

合成したり取得する値を選んだりという基本中の基本だけ備わっている状態です。それから、onCompletedって書いても動いてくれないみたい。まだ趣味プロジェクトの範囲内かなあ。時間系が入ってくると面白いんですが。
pull requestにあるように、Netflixの狙い通り(?)にいくつか飛んできているので、興味を持った人たちによってじわじわと増えるのでしょう。*3

雑感

生まれたてです。既に実戦投入されたものを公開したわけではないので、これからみんなでがんばろうぜ!と煽っている段階ですね。
Scalaだと、Akka発のFutureが強力だし、元々マッチングも手軽に色々できるので、rxjavaすげー!世界が変わる!ということにはならないかもしれませんが、今後どうなるのか楽しみではあります。

*1:JVM版と呼ぶべきかどうか

*2:テスト文取って改行を足した。

*3:お前も参加しろと言われると、力不足ですまんと答えるほかない…

2013年2月6日水曜日

Raspberry Piでboostの使えるクロスコンパイル環境を構築

# はてなダイアリーから移動した記事です。あまり真面目に整形していません。

Raspberry Piはいいハードウェアですが、これの上でコード書いたりコンパイルしたりというのは大変です。入出力が弱いこともあって、C++のSTLやboostのヘッダをincludeすいると悲しいことになります。GNU screenの上に妙なプラグインがいくつも走るVimをたくさん開く開発スタイルもきつそう。

distcc(分散コンパイル環境)を走らせれば…と一瞬思いましたが、Raspberry Pi上のリソースを使う意味が皆無なので、まっとうなPCの上でクロスコンパイルすることにしました。

試した環境

Windows上で走っているVirtualBox内の、64bitのDebianです。

Linux version 2.6.32-5-amd64 (Debian 2.6.32-46) (dannf@debian.org) (gcc version 4.3.5 (Debian 4.3.5-4) ) #1 SMP Sun Sep 23 10:07:46 UTC 2012

クロスコンパイル環境の構築

参考記事:How to build a cross compiler for your Raspberry Pi | Chris's Digital Realm
多少のバージョン番号の違いはあれど、上記記事の箇条書きに従って進めれば、あっさりとクロスコンパイル環境が出来ました。

微妙にはまったところは…

  • ディスク容量は4GBでは足りなかった
    • 仮想マシン等でディスク容量が限られる場合や、RAMディスク上で済ませようとする場合は注意
  • C++を使いたい場合は、参考記事の手順では足りない
    • コメントにある通り、C-compiler → Additional supported languages and enable C++を有効にする
  • rootユーザーで作業しないこと

rootユーザーについては、ct-ng menuconfig内に警告文があります。以下引用。

You normally do *not* need to be root to build a toolchain using crosstool-NG.
In fact, it is *VERY* dangerous to run as root, as crosstool-NG will, as part of the build process, remove a few directories.
If anything goes wrong, running as root can ruin your host distribution.

変な設定してrootで走らせると、OSごとまともに動かなくなる可能性もあるよ!という警告。警告文があるだけでなくて、何か所かそれっぽい設定にチェックを入れないと実行も出来ません。

全てが無事終わると、/opt/cross/x-tools/arm-unknown-linux-gnueabi/bin 以下に、arm-unknown-linux-gnueabi-xxx といった名前のものがごろごろしているので、これらを用いればあっさりとクロスコンパイルが出来ます。

% arm-unknown-linux-gnueabi-gcc main.c
% file a.out a.out: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 3.7.3, not stripped

boostの準備

ヘッダだけで済むものは何の苦労もないですが、ライブラリをリンクする必要のあるものはboostをビルドする必要があります。たぶん。
めんどいので完成品をいただきました。
Raspberry Pi • View topic - Boost C++ libraries for Raspberry Pi

適当なコードを書いて…

#include <stdio.h>
#include <unistd.h>
#include <boost/thread.hpp>

int main(int argc, char **argv) {
  bool enabled = true;
  boost::thread th1([&enabled](){
    while (enabled) {
      printf("hoge!\n");
      sleep(1);
    }
  });
  getchar();
  enabled = false;
  return 0;
}

適当に必要なパス情報を与えてコンパイル。-Lのパスは必要なもの(*.so)を置いた場所によりけり。この場所に置くのが妥当がどうかは知らないけども…

% arm-unknown-linux-gnueabi-g++ -std=c++11 bthread.cpp -I/usr/include -L/opt/cross/x-tools/arm-unknown-linux-gnueabi/lib -lboost_thread

scpでRaspberry Pi上に送って実行。Raspberry Piの環境には、apt-getでboostのライブラリを導入してあります。
raspberrypi ~% ./a.out
hoge!
hoge!
hoge!

動いた。本日ここまで。

2013年2月3日日曜日

GNU findの-regextype指定をどうにかうまく出来ないか

GNU findで正規表現を使いたい場合、デフォルトはエスケープがたくさん必要で使い勝手の悪いemacs正規表現です。というところまでは以前調べました。

毎回-regextype posix-egrepと打つなど本末転倒なので、findとタイプして呼び出すだけで自然についてきて欲しい。そこでまずは、安直にシェルのaliasで解決しようとしました。

alias find='find -regextype posix-egrep'

これで安心と思いきや、探索先のパスを指定すると…つまりカレントディレクトリ以外から探そうとすると動きません。

(上記aliasのfind)
% find ./hoge -regex ".*\.(h|cpp)"
find: paths must precede expression: ../
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

パスは、-regexや-regextypeより前に置けと。エイリアスを使わない形で書くと、次のような形式が正しいようです。

% find ./hoge -regextype posix-egrep -regex ".*\.(h|cpp)"

それならば、最初の引数だけ前の方に動かすシェル関数でも書くか、と次に思いました。簡単な検索ならばそれでOKですが、まだ問題があります。Usageに示されているように、パスよりも前に書く必要のあるオプションがあり、これを真面目に考えるとさらに面倒になります。

% find ./hoge -L -regex ".*\.(h|cpp)"
find: unknown predicate `-L'

これらのオプションは0個以上で不定なので、引数の位置で判断するわけにいかないし、かといってパスを字面から判断するのもなかなか困難でしょう。

-D (デバッグ) と -Olevel (検査の最適化)は使わないと割り切り、-H -L -P(シンボリック関係のオプション)があったら-regextypeの前方に動かして、残りの引数の先頭が-で始まらない場合(=パス)をそれらと-regextypeの間に動かす(という挙動をするシェル関数なりスクリプトなりを書く)、あたりが手抜きの妥協点かなと思いました。

実際作ってみたら、こんな下らない事なのに意外と長く… → [Perl] GNU find wrapper to set -regextype.

2013年2月1日金曜日

Operaの怪しいショートカットを修正してやる!

# はてなダイアリーから移動した記事です。あまり真面目に整形していません。
  • Ctrl+kで検索しようとすると「アカウントを作成する必要があります」とポップアップが出る
  • Ctrl+Tabでタブを巡回しようとすると、2つのタブを往復する

ChromeやらFirefoxやらをメインに使っていると、この不要なオリジナリティにストレスがたまるため、AutoHotKeyになんとかしてもらいました。



ついでにCtrl+PageUp/Downも入れてみたけど、こっちは自分では使っていません。

検索については、Ctrl+eならば IE/Firefox/Chrome/Opera のデフォルト設定で検索が出来るので、そちらにシフトした方が良さそうですね。
Ctrl+Tabは、Operaだけ挙動が違うのでお仕置きが必要です。

ちなみにブラウザを複数使う理由は、SNSの類にログインするブラウザと、普段Webを巡回するブラウザを分けたいからです。Flashを使えば*1クロスブラウザで情報を取れるし、そもそもIPアドレスが同じなので大きな効果は期待できないものの、うっかりワンクリックで(ログイン状態の)SNSに何か投稿してしまうことは防げます。

*1:一応Local Shared Objectを消すアドオンを走らせてはいるけれど…

2013年1月15日火曜日

viユーザー専用PS3コントローラーを作ってみた

# はてなダイアリーから移動した記事です。あまり真面目に整形していません。

PS3コントローラーの配線を外に引っ張り出して、テンキーを繋いでみました。
ゲームのコントローラーの入力(=スイッチ)を引っ張りだして挿げ替えただけですが。

f:id:moccos_info:20130115063320j:image:w300f:id:moccos_info:20130115063333j:image:w300


動画版も作ったんだけど、動画にして面白いものではなかった…(゚Д゚) 原理的にはとても単純だし、見た目がすごくなるわけでもないので、不向きでしたね。
D

動機

東方シリーズでSTGを覚えたため、キーボード操作でしかSTGを遊べない身体になっていました。PS2のSTG買っても、十字キーではとてもプレイする気にならなかったのです。勿体ないので、いつか作ろうとは思っていました。
コントローラーの入力スイッチ部分に、カーソルキーに相当する入力デバイスの出力を繋げれば出来るので、回路は簡単です。外形加工は多少めんどくさいですが…。

昨年末に、そろそろ作ろうかなーと思い立ったとき、ちょうどVimを使い始めの頃だったので、ついでにVimのカーソルキー配置にしようかという余計な考えが混入し、こうなりました。

素材

市販の適当なPS3コントローラーと、適当なUSBテンキーを組み合わせました。特定の製品に依存するようなことはないので、好きなもの(安いもの)を使えば良いはずです。今回使ったのは以下の製品。



コントローラーはSTG目的なので、有線を選択しました。この製品は安いし、レビューを見るとPS2規格ソフトウェアでも動作するようなので選びました。
テンキーはスイッチ部分しか使わないので、入力感に拘るつもりがなければ、安さ追求で良いでしょう。秋葉原だと200円くらいで売っているのも見かけました。運がよければ、100円ジャンクにもあるかも。

工作 - コントローラー側

十字キーの入力を外に引っ張り出すのみです。原理としては一切難しいところはありません。

f:id:moccos_info:20130115063317j:image:w200f:id:moccos_info:20130115063316j:image:w250
スイッチの金属らしき部分はソルダーレジストが乗っているのか、半田付けできませんでした。しかし、どのキーの近辺にも半田付けできるエリアが用意されていたので、ありがたくそれを使わせてもらっています。何のためにこうなっているのかは謎です。


f:id:moccos_info:20130115063318j:image:w250f:id:moccos_info:20130115063314j:image:w250
何かで使った余りの基板の欠片があったので、内部と外部を接続するようにネジ止めして、外側にピンヘッダを付けました。

工作 - テンキー側

分解

以前外付けHDDを分解したときに少し大変だったので身構えていましたが、突くと開くタイプの簡易ツメ+底面のネジで組み立てられていて、綺麗に簡単に分解できる製品でした。底面のゴム足シールの裏にネジが隠されているのに気づかず、筐体の端にでかい穴を開けてしまいましたが、そんなことは不要でした。
f:id:moccos_info:20130115063319j:image:w300

メンブレンスイッチ

メンブレンスイッチの構造については、以下の記事がわかりやすく、参考にしました。

導電インクで回路が印刷されたシートが2枚、絶縁用のシートが間に1枚。
f:id:moccos_info:20130115063330j:image:w300

絶縁用シートにはボタンが押される部分に穴が開いていて、キー入力によりそこが接触し、表・裏間が接続されます。こんな簡単な仕組みだったとは。
流用するためには、端に引き出されている部分のどの線がどう配線されているか、解析する必要があります。このシートに直接半田付けしようとすると溶けてしまうので、無難に元々の配線パターンに従って、端から引き出すことにしました。シートの位置固定の問題もあるので、余計なことはせずに、USBテンキーの元々の形態そのままになりました。使うのはキー4つだけなんですけどね。

f:id:moccos_info:20130115063332j:image:w250f:id:moccos_info:20130115063331j:image:w250

配線パターンは、この製品では以下のようになりました。fが表、rが裏です。製品ごとに違ったり、同じ製品でもロットにより改変がされる可能性もあるので、データそのものが誰かの役に立つものではありませんが。

f:id:moccos_info:20130115084333p:image

当然、それぞれの穴が表裏1つずつと繋がる構造になっています。これなら4/5/6/+を使うのが一番簡単そうですね。ただ今回、間違えて10pinの変換基板を用意してしまい、端を落とす必要があったため、1/2/3/Enterの横並びを使う事になりました。
実は変換基板の値段がテンキーと同じくらいかかっていて微妙感溢れるものの、量産しない場合に390円のコストはまあOKということにしましょう…
f:id:moccos_info:20130115063326j:image:w250

次の写真は、もともと入っていたUSB接続の基板とコネクタ。ここに半田付けして引っ張りだしても良かったかなあ。
f:id:moccos_info:20130115063325j:image:w300

外部への引き出し

コントローラー側と同様に、筐体に穴をあけて基板を通し、内側をネジ止め・外側にピンヘッダという構成です。
f:id:moccos_info:20130115063322j:image:w250f:id:moccos_info:20130115063324j:image:w250
ネジ穴を適当に開けたため、ちょっと曲がっているのがださいですが、誰も見ませんこんなところ。

使用感

viのカーソルキーが全く身についていない状態なので、まだ上下移動がうまくできません。さらに、ナナメ移動のときに1個空きに同時押しするのが直感的に難しいです。
そして、ゲームをする際には当然4本指を固定で置きますが、本来HJKLはJがホームポジションなので、指使いがちょっと違います。JとKの位置関係は覚えられるかもしれないけれど、指使いを脊髄に叩き込むとまでは行かないかもしれません。


また、実は左手で通常コントローラーの右手部を操作していることにも、ちょっと無理があります。こっちも左手用のテンキーを用意するのがベストなのかもしれません。もうやらんけどw

2013年1月4日金曜日

Windows上でVisualStudio 2010と2012用にboostをビルド(x86/x64)

# はてなダイアリーから移動した記事です。あまり真面目に整形していません。

意外とめんどくさくて、次忘れそうなのでメモ。

ビルド環境

cl.exeでビルド。環境変数の設定がたくさんあって大変なので、無理せず、スタートメニューから辿れるビルド環境のコマンドプロンプトを使います。

  • Windows SDK 7.1 Command Prompt
    • Microsoft Windows SDK v7.1の下にある

Visual Studio 2010のVisual Studioコマンドプロンプトだと、x86(32bit)しか作れないっぽいので、x64(64bit)のライブラリをビルドするのには必要。そもそも64bitバイナリをビルドする人はインストールしているはずですが。
Visual Studio 2012ではx86用とx64用のプロンプトが選べるので、2012だけならそちらで良いかも。

x86/x64の選択

setenv でさくっと設定できます。

Usage: "Setenv [/Debug | /Release][/x86 | /x64 | /ia64][/vista | /xp | /2003 | /2008 | /win7][-h | /?]"
/Debug - Create a Debug configuration build environment /Release - Create a Release configuration build environment /x86 - Create 32-bit x86 applications /x64 - Create 64-bit x64 applications /ia64 - Create 64-bit ia64 applications /vista - Windows Vista applications /xp - Create Windows XP SP2 applications /2003 - Create Windows Server 2003 applications /2008 - Create Windows Server 2008 or Vista SP1 applications /win7 - Create Windows 7 applications


Debug版とRelease版両方一度にビルドしてくれるので、そこを設定する必要はなさそうです。
> setenv /x64
または
> setenv /x86


ビルド時の引数による設定

まず、ビルド用の準備(共通)。解凍したboostソースコードのトップディレクトリで、バッチファイルを一撃。

h:\>cd boost_1_52_0
h:\boost_1_52_0>bootstrap.bat


あとは必要に応じてbjamへの引数を変えます。
参考:c++ - 64-bit version of Boost for 64-bit windows - Stack Overflow

  • ターゲットバージョン
    • --toolset=msvc-10.0 など
      • 9.0が2008、10.0が2010、11.0が2012
  • 出力先
    • --stagedir=x64 など
    • 指定したディレクトリの下にさらに lib が掘られて、そこに出力される

例:

bjam --toolset=msvc-11.0 --build-type=complete --stagedir=x86 stage
bjam --toolset=msvc-10.0 address-model=64 --build-type=complete --stagedir=x64 stage


64bit環境にしても、address-modelを設定しないと32bitになります。

32bitのビルドが行われる場合の、ビルド開始直後の表示例。
Performing configuration checks
- 32-bit : yes - x86 : yes


64bitのときは、32-bit の項目が表示されませんでした。(noと表示されるわけではない)
Performing configuration checks
- x86 : yes


出力ファイル

出力ファイル名は boost_random-vc100-mt-1_52.lib のように、コンパイラのバージョン入りになるので、バージョンごとに最終的な置き場所を変える必要はなさそうです。ファイル名のboostバージョンの前の部分に、gdと入っているのがデバッグ版です。boost_random-vc100-mt-gd-1_52.lib など。
ただし、どうやらこの長い名前をプログラマが意識する必要はなさそうです。

リンク

ヘッダをincludeしただけでビルドすると動いてしまい、なんだこりゃ?とヘッダを追いかけてみると、どうやら環境を判断して必要なlibファイルの名前を生成し、勝手にスタティックリンクしてくれているようです。あちこちに転がっているconfig.hppや、config/auto_link.hppなどが暗躍しています。
どうやらダイナミックリンクにしたい場合は…

  • boost関係全てDLLにするなら、BOOST_ALL_DYN_LINKを定義
  • 特定のライブラリのみDLLにするなら、BOOST_PROGRAM_OPTIONS_DYN_LINKのような個別定義を使用

2013年1月3日木曜日

2012年に覚えた(はずの)事一覧

# はてなダイアリーから移動した記事です。あまり真面目に整形していません。

プログラミング関係で何か覚えるたびにTwitterにポストしていたものの振り返り。
Twitter記法並べたらクソ重いなあ。




言語はJavascript(主にjQuery)、Erlang、Java、Scala、C++、まれにC#やPython。環境はVimとgitが多めでした。
覚えた、って書いてもその後二度と使わないようなものは、見事に忘れてます。tmuxはCygwinで動かなかったから使わなくなったし、Vimで画面分割するのに慣れたからGNU screenでの画面分割も使っていないなあ。


しばらくErlangは使わないだろうから、完全に忘れちゃうかもしれません。一昨年少し触ったHaskellは、もはや入門からやり直さないといけない程度に忘れました。うーん勿体ない。Java・Scala・C++はそれなりに進歩、C#・Python・R言語は実力キープ~やや前進という程度でした。
2012年に新しく覚えた言語が無かった気がするけれども、中途半端に手を出しても使わなければ忘れてしまうので、HaskellかC#あたりを強化する方向にしようかなー…と思います。全く新規の物の方が面白いけれども、これ以上器用貧乏で手を広げるより、何か小さくても自慢できるようなものが出来る程度に、何かに専念した方がいいかなーと。