Ansibleで遊んだ

成果物は今日のお仕事とQiitaの記事。
http://qiita.com/unarist@github/items/39f5510f95c752c10df1

なんか久々に初めましてから実用レベルまで遊んだ気がする。

とりあえず読むとよさそうなもの

公式ドキュメントはモジュール一覧が楽しい。正直Playbookの説明とかは文章ばかりでつらい。

設定ファイルの配置

templateモジュールでJinja2ってテンプレエンジンが使えるけど、/etc/にありがちな設定ファイルならlineinfileで結構事足りる。

モジュールがないのでコマンド実行したい

commandモジュールやshellモジュール。
実行済みチェックや結果チェックが少々面倒だったりもするけど、「ファイルが存在しなければ」という条件ならcreatesオプションが使えるので簡単。

ループとか

with_items便利。複数の値をまとめて指定したければ辞書形式で。

playbook内でsshのポート変えたい

Ansibleが使うsshのポートは環境変数みたいな扱いになってるので、結構好きなとこで変更できるみたい。
応用として、実行時にいくつかのポート番号を試す方法も。
http://serverfault.com/questions/545978/how-to-handle-ssh-port-changes-with-ansible
task増えるのがちょっと気になるけど。

実行ユーザー

sudo使えます。これもsshのポートと同じような扱いなので、基本はrootだけどここだけpostgresみたいなこともできる。
あとファイル系のモジュールは所有ユーザーやグループ指定できる。

感想

使えるモジュールがいっぱいあるUbuntu系で遊ぶのが楽しいと思います。はい。
仕事に関して言えば、初Ansibleで鯖セットアップしようぜって話なのに、Ansible関係ないところで躓いてばかりだったのがちょっと悲しい。

念願のWintabの日本語情報がきたけど、MSInkで十分っぽいという話

しばらく前にWintabがどうのって記事*1を書きました。Wintabが実質Wacom専用じゃねーのって話だったと思います、たぶん。
で思い出したようにペンタブ周りを探りなおしたのでメモ。

Wacom Developer Network

なんかWacomが開発者向けのポータル作ってました。
http://wdnet.jp/
今になって日本語の情報を提供し始めるとかどうしちゃったの、というのが第一印象。まあAndroidiOS向けのデバイスを出してきたとか、タブレットPCの敷居が下がってきたとかそんなあたりでしょう。
対象とする範囲も広いです。

ここまではドキュメントやQ&Aも充実してる。

  • MacもといCocoaのTabletAPI(wacomengにリンク貼ってあるけど切れてる)
  • Mac + feel Multi-touch(サンプルだけ?)
  • Linux(sf.jpへのリンクだけ)

あとブログなんかもあるようです。ところでWDNとは別に、中の人がこのあたりの話を書いているブログも見つけたんですが、こっちもなかなかおもしろそうです。
http://inktechja.wordpress.com/

で、WintabとMSInkどっちがいいの

  • バイス
    • Wacomの普通のペンタブ(Intuosとか)はMSInkも対応してる
      • Wacom以外でWintab使うやつだと、MSInk対応してないとかあるんだろうか?
    • Wacomのfeel IT Technologyを使ったタブレットPCやBamboo Padは、そのままだとMSInkのみという話もあるが、公式からWintabドライバ出てる*2
    • N-trigもMSInkが標準だけど、Wintabドライバも公式にあるらしい*3
  • 開発面
    • Wintabならwintab.dllを動的リンク、MSInkならCOMとか.NETとか使いましょう
    • ストアアプリではwintab.dllなんて使えないので、MSInk一択

Wintab ではペンが送信する様々な情報を API として扱うことができます。
たとえば、Microsoft 標準の API では扱うことができないペンの傾きやペンのUnique ID、ペンの回転などの情報を得ることができます。
これらの情報は特にグラフィック系のアプリケーションで必要となる情報であるため、これらのアプリケーションではWintabが利用されているのです。

http://inktechja.wordpress.com/2013/11/14/%E7%AD%86%E5%9C%A7%E3%81%A8%E3%83%89%E3%83%A9%E3%82%A4%E3%83%90%E3%83%BC%E3%81%A8api-surface-pro%E3%81%A7%E7%AD%86%E5%9C%A7%E3%81%8C%E3%81%AE%E8%A3%8F%E5%81%B4/

という話もあったので確かめたところ、Win8.1+Intuos4+.NET4.5では余裕で傾きや回転取れました。
例えばTabletDevice.SupportedStylusPointPropertiesを取ってみるとこんな感じ。

{Id=X, IsButton=False} 
{Id=Y, IsButton=False} 
{Id=NormalPressure, IsButton=False} 
{Id=ButtonPressure, IsButton=False} 
{Id=XTiltOrientation, IsButton=False} 
{Id=YTiltOrientation, IsButton=False} 
{Id=AltitudeOrientation, IsButton=False} 
{Id=AzimuthOrientation, IsButton=False} 
{Id=TwistOrientation, IsButton=False} 
{Id=Unknown, IsButton=False} 
{Id=PacketStatus, IsButton=False} 
{Id=TipButton, IsButton=True} 
{Id=BarrelButton, IsButton=True} 

機能的にはMSInkでもさほど困らなそう・・・。
MSInkが使いたくない(COMが嫌とか)ってわけでもないなら、今後はMSInkで書けばいいのかなーというところ。
  
と思ったけれど、そういえばWPF使わずにMSInk使う情報が見つけられてない。うーむ。

SML#のebuild書きました、もしくはmultilibとの戦い

流行ってるらしいので。

https://github.com/unarist/unarist-overlay/blob/master/dev-lang/smlsharp/smlsharp-2.0.0.ebuild

licenseとかpatchとかちらばってるのでlayman使うといいかも。

作った

また,SML#は現時点での最新版であるLLVM3.4 32bitを必要としますので,多くのディストリビューションで自力ビルドが必要かと思います.

http://d.hatena.ne.jp/keita44_f4/20140412/1397279451

Gentooだからそんなの余裕ですね^^と思っていたんですが、見事にLLVM 32bitではまりました。

  • そもそもmultilibが面倒だった
    • 時代はemul-linuxじゃなくてgx86-multilibらしい。というかLLVMは後者でないと無理
    • 今emul-linux使ってる人
      • emul-linuxにabi_x86_32付けるとメタパッケージみたいになるので、入れ替えることは可能
      • ただし実際の移行は依存関係があれで面倒でした。subslotの件と似てる
    • emul-linux使ってないひと
      • 上のebuildならautounmaskで解決できるはず
      • もしくはWiki通りにmake.confにUSE_X86=32で全パッケージに指定
  • ebuild
    • DEPENDに[abi_x86_32]つけて、toolchain切り替えるだけなので簡単
    • 基本的にはmultilib_toolchain_setupがconfigureのパラメータをうまく設定してくれます
    • llvm[abi_x86_32]はx86用のllvm-configを違う名前でインストールするのでconfigureの修正が必要
    • 今のところ{triple}-llvm-configとllvm-config.x86にインストールされるが、前者は「# Backwards compat, will be happily removed someday.」とか書いてあったので、llvm-config.x86 llvm-configの順に検索させるようにした*1

とはいえ調査や環境の調整に手間取っただけで、ebuild書くの自体は簡単でいいですね。ビルドバッチみたいなものだから応用も効くし。

emul-linuxからgx86-multilibへの移行

stable.use.maskじゃ駄目なの? -> 理由はわかっていないけどuse.maskで。
emul-linux-*消さない方法ないの? -> 依存関係無視していいから一度消した方が多分簡単。

  1. use.maskに-abi_x86_32を書く
  2. 一旦emul-linuxを全部emerge -Cで消す
  3. そのままuDNすると[-abi_x86_32]が優先されるのかコンフリクトの嵐なので、package.useでemul-linuxにだけabi_x86_32付けてしまう
  4. emerge --autounmask-write -uDN worldを繰り返して必要なUSEフラグや~外しをする
  5. ここまで来るとコンフリクトも4つぐらいにまで減ったので、指摘されたパッケージを適当にemergeしていく

autounmaskがあるとはいえ、なるべくそういった変更を避けた提案をしようとしてコンフリクトするケースが多いみたい。というかそりゃそうだ。
なのでバージョンを明示してあげると、USEフラグ変えろ!キーワード変えろ!となり話が進む。

ところで

SML#書いたことないです。

*1:x86環境だとllvm-config.x86にならない気がしたので。修正はconfigure.acで行い、configureを再生成してパッチに

emergeの高速化、もしくはメタデータキャッシュの話

eixはeix-updateで自前のキャッシュを作りますが、この時のソースがいくつか用意されています。

個別のebuildを直接読む(parse, ebuild
当然時間がかかります。また"ebuild"の場合はebuild(中身はシェルスクリプト)を実行するので、信用できないoverlayで使うべきでないとeixのmanには書かれていますね。
treeごとのキャッシュを使う(metadata-flat, metadata-md5, metadata-assign)
例えば/usr/portage/metadata/以下にあるやつです。gentooツリーの場合はこのキャッシュごと同期するので、ローカルで生成しなくても使えます。
emergeで生成するキャッシュを使う(flat, cdb, assign, sqlite, 多分repo-*も)
通常/var/cache/edb/dep/以下にあります。emerge --metadataなどで生成します。
eixのキャッシュファイルを使う(eix)
通常/var/cache/eix/以下にあります。

これはeixから見た話ですが、同じようなことをemergeでもしてるはず。
eixは何も考えなくても速いのでいいんですが、emergeはそのままだとなかなか依存解決に時間がかかるので速くしたいですね。
ということで色々比較。

環境

gentoo, local, gentoo-haskell, betagarden, sunriseが入ってます。
ちょうどhaskell-platformすら入っていない状態なので、emerge -p yesod-platformの時間を計ります。
ちなみにキャッシュ破棄した状態だとこんな感じ。

$ sudo rm -rf /var/cache/edb/dep
$ emerge -p yesod-platform
real    1m1.100s
user    1m24.869s
sys     0m18.156s

肝心のhaskell overlay以外も入ってるし、一回分のtimeそのままという適当さなのでほんとにざっくりですが。

emerge --metadata

emerge --syncしたときに勝手に走るようですが。eixから見たflatやassign。

$ sudo emerge --metadata
real    0m13.520s
user    0m12.737s
sys     0m0.760s

$ emerge -p yesod-platform
real    0m36.400s
user    0m27.230s
sys     0m5.042s

30秒って数字で見るとたいしたことなさそうですが、なかなか長く感じます。

md5-cache

treeごとのキャッシュのひとつで、gentooツリーでも使われています。eixから見たmetadata-md5
egencacheというコマンドで生成します。細かいことは後述。

$ sudo rm -rf /var/cache/edb/dep
$ sudo egencache --repo=gentoo-haskell --update --update-use-local-desc
real    1m22.179s
user    0m54.974s
sys     0m12.471s

$ emerge -p yesod-platform
real    0m28.985s
user    1m1.687s
sys     0m13.470s

--metadataだけと比べて、userはあまり変わってないもののrealが短くなってますね。
/var/lib/layman/haskell/metadata/md5-cache/ができています。
ここでさらに--metadata。

$ sudo emerge --metadata
real    0m19.451s
user    0m15.896s
sys     0m1.605s

$ emerge -p yesod-platform
real    0m4.473s
user    0m4.397s
sys     0m0.060s

速い。
試しに上で生成したgentoo-haskellのキャッシュを消してみましたが、変わりませんね。同じようにemerge --metadataを実行しても、元の形式によって変わるのでしょうか。。

sqlite

wiki.gentoo.orgができるまえのGentoo Wikiに記事があった方法です。
http://www.gentoo-wiki.info/TIP_speed_up_portage_with_sqlite
という時点でobsolete臭がするのですが、以前使っていた記憶があるのでこれも試してみます。

$ sudo vi /etc/portage/modules
$ sudo emerge --metadata
real    0m20.192s
user    0m17.771s
sys     0m2.379s

$ emerge -p yesod-platform
real    0m36.443s
user    0m27.226s
sys     0m5.068s

/var/cache/edb/dep/var/lib/layman/haskell.sqliteが生成されてはいますが・・・sqlite使わない場合とあまり変わりませんね。
md5-cacheと組み合わせてみましょう。

$ sudo egencache --repo=gentoo-haskell --update --update-use-local-desc
$ sudo rm -rf /var/cache/edb/dep
$ sudo emerge --metadata
real    0m21.745s
user    0m18.898s
sys     0m2.588s

$ emerge -p yesod-platform
real    0m4.701s
user    0m4.922s
sys     0m0.230s

これまたsqlite使わない場合と変わりませんね・・・。
eixのmanを見ると、portage-2.1以上でデフォルトのキャッシュがflatからassignに変更されているようです。flatの頃は今より遅く、cdbという非公式拡張や、今回試したsqliteなどが使われていた、というところでしょうか。

まとめ

大きなoverlayを使う場合はtreeごとのキャッシュを作ると良さそうです。というか、eixのmanにはSPEEDUPというセクションがあり、そういう話が書いてあります。自動で走らせる方法や注意点なども書いてあるので読みましょう、英語だけど。
ハウツー的なのをQiitaに書いたので読みたい方はこちらへ。
http://qiita.com/unarist@github/items/c1afa5ddfc7da1337b11

*1:ここには--regenを使った方法が書いてあるけど、--metadataでいいんじゃないかなあ。assign使うとしてもegencacheで変化するのは上に書いたとおり。

emergeうどんワールドとの戦い

参考資料 http://bpaste.net/show/225618/
emergeは聖徳太子じゃないみたいなので、今後はややこしいお願いは単独でしようと思いました。

libvdpau

emerge -p1u xorg-serverを眺めてみて、目に止まったxcb周りから攻めてみることに。
conflictせずにupdateできるのを手探りで探した結果、libxcb->xcb-proto->xpybにたどり着いた。
もうひとつ片付けておこうと思ってlibX11もupdate。
その後xorg-serverと一緒にlibvdpauも難なく入りましたとさ。

perl

$ sudo emerge -1u perl

These are the packages that would be merged, in order:

Calculating dependencies... done!
[ebuild   R    ] dev-lang/perl-5.12.4-r1

WARNING: One or more updates have been skipped due to a dependency conflict:

dev-lang/perl:0

  (dev-lang/perl-5.16.3::gentoo, ebuild scheduled for merge) conflicts with
    dev-lang/perl[-build] required by (dev-perl/Error-0.170.160::gentoo, installed)
  (dev-lang/perl-5.16.3::gentoo, ebuild scheduled for merge) conflicts with
    dev-lang/perl[-build] required by (dev-perl/Cairo-1.90.0::gentoo, installed)
  (dev-lang/perl-5.16.3::gentoo, ebuild scheduled for merge) conflicts with
    dev-lang/perl[-build] required by (dev-perl/Net-Daemon-0.480.0::gentoo, installed)
  (dev-lang/perl-5.16.3::gentoo, ebuild scheduled for merge) conflicts with
    dev-lang/perl[-build] required by (dev-perl/File-MimeInfo-0.150.0::gentoo, installed)
$ sudo emerge -1u Error Cairo Net-Daemon File-MimeInfo

Calculating dependencies... done!
[ebuild     U  ] dev-perl/Cairo-1.103.0 [1.90.0]
[ebuild     U  ] dev-perl/File-MimeInfo-0.170.0 [0.150.0]
[ebuild     U  ] dev-perl/Error-0.170.210 [0.170.160]

WARNING: One or more updates have been skipped due to a dependency conflict:

dev-lang/perl:0

  (dev-lang/perl-5.16.3::gentoo, ebuild scheduled for merge) conflicts with
    dev-lang/perl[-build] required by (dev-perl/extutils-depends-0.304.0::gentoo, installed)
$ sudo emerge -1u extutils-depends

[ebuild  r  U  ] dev-lang/perl-5.16.3 [5.12.4-r1]
[ebuild     U  ] dev-perl/extutils-depends-0.305.0 [0.304.0]
[ebuild  rR    ] dev-perl/Net-Daemon-0.480.0-r1
[ebuild  rR    ] dev-perl/PlRPC-0.202.0-r2
[ebuild  rR    ] dev-perl/Error-0.170.210
[ebuild  rR    ] dev-perl/Cairo-1.103.0
[ebuild  rR    ] dev-vcs/subversion-1.7.14

唐突にゴールした。

cabal

  (dev-haskell/cabal-1.16.0.3::gentoo-haskell, installed) pulled in by
    >=dev-haskell/cabal-1.8:0/1.16.0.3= required by (dev-haskell/hoogle-4.2.16::gentoo-haskell, installed)

subslot使ってますね。
https://wiki.gentoo.org/wiki/Sub-slots_and_Slot-Operators
これこそ自動で解決してくれそうだけど・・・まあいいや。
ここまでの流れから、updateしたいパッケージにバージョンを明示して、そのsubslotに依存してるパッケージも同時に指定してみる。

$ sudo emerge -1 =dev-haskell/cabal-1.18.1.2 hoogle

いけた。けれど他にも詰まり、ちょうどUSEフラグ変更して一式emergeし直しだったので、haskell周りを少しworldから除外して作業することに・・・
# ghc消す必要はなかったなー

ruby

ひねくれた依存解決をした結果ruby2.1を無理に入れようとしていると思い込んでいたのだけど、よく見るとruby2.1がworldに入っていることになっている。eixで確認したら確かに(~)amd64になってる。
以前mikutterを入れたときにautounmask-writeして、>=ruby-1.9.3_rc1 ~amd64がaccept_keywordsに入ってた。。。
mikutterに必要なrubyはstableになっているので、これを消して解決。

仕上げ

依存解決に時間かかるからって理由で--deep付けずにいじっていたので、それぞれ途中でこけたりしてます。
ので改めてemerge -uDN @world。あとさっき見かけた--with-bdeps=yも付けてみる。
まだ途中だけど多分無事に終わる。終わって。

ExcelでCSVを読み込むと数値が勝手に整形されてしまう話

テキストファイルウィザード使いましょう。おわり。
頭の0が消えるとか指数表記になるとかのあれですね。ちなみにシングルクォートを頭につけると、それごと表示されます。

回避策

検索するとこれが答えだ!ってのがいくつか見つかります。

方法1. 012 とか 012 とか

Excelはタブ文字を表示しない、というかゼロ幅で表示するようです。それだけ。
値としてはタブ文字が存在しているので、メモ帳とかにコピペするとタブ文字が現れます。

方法2. ="012"

そもそもExcelCSVを読み込むとき、=で始まるデータを数式として扱うそうで。
なので表示上は「012」ですが、ただの値ではなく数式として入っています。
ただ値に余計な文字が入っていないので、データとしてはタブ使うよりいいですね。

ごまかしてるだけなのでは

まあウィザードのように型を指定する方法はないみたいですね。。。

VSがファイルの改行コードを無視するケース

基本的にはLFのファイルを開いたら改行もLFで入るんだけど、ファイルの改行コードが無視されるケースをメモ。固まったらどっかに投げたい。

HTMLのコードフォーマット
全体がCR+LFになる
JSのコードフォーマット
ブロックの端、波括弧のあたりがCR+LFになる

そのうえJSのコードフォーマットは初期設定だと自動的に適用される。
CSSでもなぜか混在してたことがあったけども再現できず。上に挙げたケースも別の問題かも?