Ansibleで遊んだ
成果物は今日のお仕事とQiitaの記事。
http://qiita.com/unarist@github/items/39f5510f95c752c10df1
なんか久々に初めましてから実用レベルまで遊んだ気がする。
とりあえず読むとよさそうなもの
- AdventCalender http://qiita.com/advent-calendar/2013/ansible
- チュートリアル http://yteraoka.github.io/ansible-tutorial/
- 公式 http://docs.ansible.com/
公式ドキュメントはモジュール一覧が楽しい。正直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/
今になって日本語の情報を提供し始めるとかどうしちゃったの、というのが第一印象。まあAndroidやiOS向けのデバイスを出してきたとか、タブレットPCの敷居が下がってきたとかそんなあたりでしょう。
対象とする範囲も広いです。
- Wintab
- Windows + feel Multi-touch(最近のIntuosとかで使えるタッチ機能)
- WebPlugin(Javascriptから使える)
- Androidの標準API
- iOS + Creative Stylus
ここまではドキュメントやQ&Aも充実してる。
あとブログなんかもあるようです。ところでWDNとは別に、中の人がこのあたりの話を書いているブログも見つけたんですが、こっちもなかなかおもしろそうです。
http://inktechja.wordpress.com/
で、WintabとMSInkどっちがいいの
- デバイス面
- 開発面
- Wintabならwintab.dllを動的リンク、MSInkならCOMとか.NETとか使いましょう
- ストアアプリではwintab.dllなんて使えないので、MSInk一択
Wintab ではペンが送信する様々な情報を API として扱うことができます。
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/
たとえば、Microsoft 標準の API では扱うことができないペンの傾きやペンのUnique ID、ペンの回転などの情報を得ることができます。
これらの情報は特にグラフィック系のアプリケーションで必要となる情報であるため、これらのアプリケーションではWintabが利用されているのです。
という話もあったので確かめたところ、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が面倒だった
- 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-*消さない方法ないの? -> 依存関係無視していいから一度消した方が多分簡単。
- use.maskに-abi_x86_32を書く
- 一旦emul-linuxを全部emerge -Cで消す
- そのままuDNすると[-abi_x86_32]が優先されるのかコンフリクトの嵐なので、package.useでemul-linuxにだけabi_x86_32付けてしまう
- emerge --autounmask-write -uDN worldを繰り返して必要なUSEフラグや~外しをする
- ここまで来るとコンフリクトも4つぐらいにまで減ったので、指摘されたパッケージを適当にemergeしていく
- 完
autounmaskがあるとはいえ、なるべくそういった変更を避けた提案をしようとしてコンフリクトするケースが多いみたい。というかそりゃそうだ。
なのでバージョンを明示してあげると、USEフラグ変えろ!キーワード変えろ!となり話が進む。
読んだ
- Xubuntu編 http://d.hatena.ne.jp/keita44_f4/20140412/1397279451
- Arch編 http://cohama.hateblo.jp/entry/2014/05/08/010819
- GentooWiki http://wiki.gentoo.org/wiki/Multilib/gx86-multilib その他multilib周りを。
- Gentooの開発ガイド http://devmanual.gentoo.org/ ebuildの書きかたは主にここを見ながら。amd64のところにABIの話もあるけど、よくわからなかった。
- abi_x86_32の話 http://gentooligan.blogspot.jp/2013/10/your-daily-nightmare-with-abix86.html
フォーラムとかbugzillaとか
ところで
SML#書いたことないです。
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はタブ文字を表示しない、というかゼロ幅で表示するようです。それだけ。
値としてはタブ文字が存在しているので、メモ帳とかにコピペするとタブ文字が現れます。
ごまかしてるだけなのでは
まあウィザードのように型を指定する方法はないみたいですね。。。
VSがファイルの改行コードを無視するケース
基本的にはLFのファイルを開いたら改行もLFで入るんだけど、ファイルの改行コードが無視されるケースをメモ。固まったらどっかに投げたい。
- HTMLのコードフォーマット
- 全体がCR+LFになる
- JSのコードフォーマット
- ブロックの端、波括弧のあたりがCR+LFになる
そのうえJSのコードフォーマットは初期設定だと自動的に適用される。
CSSでもなぜか混在してたことがあったけども再現できず。上に挙げたケースも別の問題かも?