2012-03-03

CTPC (College of Technology Programming Contest) 参加記

dev

高専生向け競技プログラミングコンテストらしい。 http://koj.cms.am/contest/index.html

起きたら twitter の TL で話題になっていたので寝起きで参加しました。

結果: 400/1100点 (39/65位), 2 WA.

といた順番は A→C→B→E. A の後 B は一見難しそうに見えて C を解き、その後他の問題を物色して E を解き始めたのだけど、 途中これはグラフ理論とか使うのかなあ、と思って物色を再開した所、実は B が簡単だった事に気づいて B を解き、時間が余った。E をもう一度見たら実は Time Limit 8 秒とか入力の制約を見るにシンプルな 探索でも通るだろうということで再度解き始めて、ギリギリで通した。

問題 A - Average

http://www.atcoder.jp/problem/detail/151

改行区切りで 4 つの数値が与えられるので、(それらの最高値+それらの合計)/5 を求め、60 以上であれば Yes, 60 未満であれば No を表示すれば良い。

Codeforces とかだと YES, NO (全て大文字) なのでそこで引っかかってる人が多かったイメージ。

コード

きたないですね。

問題 B - Macaron

http://www.atcoder.jp/problem/detail/152

W 高さ H の盤面 (自分は空白マスを false, 壁マスを true とした) を用意、その後 X, Y, L の 3 つの数値がスタンプとして与えられるので、 座標 (X,Y) 中心に L 間隔の正方形の形になるように盤面のマスを反転 (空白マスなら壁マスへ、壁マスなら空白マスへ) した。 自分は前述のように bool で管理したので ! つかって反転させるだけ。らくちん。

正方形の作り方は、n を任意の 1 以上の整数として、 頂点の座標は X, Y に下の式から求められる数値を足したり引いたりすれば求められる。(コードでは 27 行目の変数 s への代入)

s = L + (L+1)(n-1)

左上、右上、左下、右下の座標は以下のようになる:

  • 左上: (X-s,Y-s)
  • 左下: (X-s,Y+s)
  • 右上: (X+s,Y-s)
  • 右下: (X+s,Y+s)

処理は n を初期値 1 でループを回し、まず頂点を反転し頂点と頂点の間の線となるマスも反転、 一つの正方形の処理において反転させようとしたマスがすべて盤面の外ならループを打ち切り、 そのスタンプの適用を終了して次のスタンプの適用に入る。

そして与えられたスタンプを全部適用したらおわり。それを整形して表示するだけ。

もっと賢い方法あるのかなあ。

日本語が書けないのでうまく解説できないな。しかし。

コード

問題 C - Communication Tool

http://www.atcoder.jp/problem/detail/153

n つの文字列が改行区切りで2行目以降に入力されてくる。

それぞれの文字列は以下のルールに従ってカテゴリ分けできる。

  • その文字列は 1 文字以上 140 文字以下であるなら Tw○tter からの情報 であり、また:

    • @ で始まる文字列であるなら リプライ
    • @ で始まらない文字列である つぶやき
  • それ以外の文字列 (リプライでもつぶやきでもない) はすべて mix○ または gre○ からの情報となる。

表示するものは つぶやきリプライ の割合であるため、リプライでもつぶやきでもない文字列は無視して問題がない。 また文字列自体もどうでもよくただ個数だけ数えれば良い。

割合については以下のように求めて (C++ なのでつぶやきとリプライを数えた変数を double 型にしておく) 小数点以下を切り捨てたものを表示すれば良い (C++ だと普通に int にキャストしてしまえば良い)

つぶやき もしくは リプライ / (つぶやき+リプライ)

しかし入力によっては つぶやきもリプライも存在しない 事があるので、その場合は "NA" を割合の代わりに表示すれば良い。

この問題で Wrong Answer を唯一 2 回も出してしまって、理由はそれぞれ以下。非常にクズであると思います。

  1. NA を表示しなかった
  2. NA を表示する条件がどちらか片方が 0 以下だった (ひどい)。

|| から && に修正してやっと通った。

コード

問題 E - Airport

http://www.atcoder.jp/problem/detail/155

空港の名前と、空港同士の便 (出発地, 目的地) が与えられる。

与えられた空港と便を見て、以下の条件に当てはまれば Yes, 当てはまらなければ No を表示しろという問題。

  • すべての空港 A において、他全ての空港 B (A != B) との間に、便 AB もしくは BA が存在する事
  • 任意の空港 A, B (A != B) の間に、便 ABBA 両方が存在しない事
  • すべての空港 A は空港 A から出発する任意の便に搭乗し、他の空港の便と乗継、最初に搭乗した空港 A に戻ってくる事ができる事

最初 3 番目の条件をみて間違いなく自分のコードだと Time Limit Exceeded になってダメだろうと思ったがよく制約と time limit を見ると、 time limit は 8 秒だったり、空港は最大でも 17 個、つまり便は最大でも 272 個なので幅優先で挑戦してみた。

(メモ化再帰の深さ優先探索とどっちが良いのかは知らない)

コード

  1. map で空港名 (string) をキーに Flights* (実態は vector<string>, 空港名を格納) を保管。空港毎にその空港からの便の行き先を列挙しておく。
  2. 便を受け取って Flight flights (Flight は ↑の map<string,Flights*>) に格納していく課程で、同じ空港同士で逆方向の便がみつかれば即座に No を表示して終了
  3. 便を Flight flights に保存したらとりあえず総当たりで 1 番目の条件に当てはまるか確かめ、当てはまらない物があったらその場で No を表示して終了。
  4. 最後に全ての空港に対し check_loop を呼び出して、3 番目の条件に当てはまるかを確かめる。一つでも当てはまらなければ No を表示して終了。

check_loopqueue 使った幅優先探索。

あと、最初 typedef vector<Flights*> Flights しようと思ったけどできないのね。残念。

反省

くだらない 2 WA は酷かった。 もうちょっと問題の難易度を推定して自分の実力で時間以内に解けるかどうかの判断を迅速に間違いなく下したいなあ。

@kyuridenamida さん, @kagamiz さんへ: 面白いコンテストをありがとう。次回はありますか?

Published at 2012-03-03 18:43:55 +0900 | Permalink
2012-03-02

OS X Lion を再インストールした

再インストールであるため Time Machine などからの復元は行わず、InstallESD.dmg を利用してクリーンインストールした作業記録。

バックアップ

アプリケーション類

  • まず /Applications を覗いて必要なアプリケーションをリストアップ (必要なものだけ)
  • Vim で :tabe|r !ls /Applications とかでリストを生成できます。
  • まだ使うであろうアプリケーションで先にダウンロードできるものはしておいて外付けHDDに入れておくとさくさくセットアップできます。
  • ちなみに、Xcode は引き続き dmg でダウンロードしておく事ができます。developer.apple.com の XCode ページを開き、"View Downloads" から探しましょう。ただ、4.3 からは単独のアプリケーションっぽいから Mac App Store で DL してできた /Applications/Xcode.app をそのまま保管しても良いと思いますが、個人的には MAS で管理死たくないので dmg をダウンロードします。

アプリケーションリスト

いちいち開いてどんどんダウンロードしたんだけど面倒臭いからダウンロード URL を推測して取得したりしたいなあ。 割と効率悪い。

Aperture はサイズも大きいし再ダウンロードが面倒臭かったので /Applications/Aperture.app を何も考えずに外付け HDD へ運んであげて再インストール後に外付け HDD から直接書き戻しましたが何も問題が無く動いています。他の Mac App Store 経由のアプリケーションもバックアップできるのかどうかは知らない。詳細は後述。

設定類

  • 後で何かバックアップ漏れが困ると困るのでとりあえず $HOME をまるごと外付けハードディスクに移して再インストール後にちまちまそこからコピーする方針でバックアップする。
  • コピーする外付け HDD 等に diskutil enableOwnership ... を実行してパーミッション等を維持できるようにしておく
  • コピーは ditto (ditto(1)) を使う事もできる (べんり)。cp 等でやるといろいろ OS X 固有の情報が落ちるらしいので、Finder のコピーと同じようなコピーをコマンドラインで行うには ditto を利用するのが良い (らしい)
  • ditto -V $HOME /Volumes/.../home/ とかでコピーした。

    • -V は verbose オプション。おこのみで
    • コピー先である 3 つ目の引数だけれど、なんか / つけたほうが良いとかなのでつけています。これで /Volumes/.../home というディレクトリが作成されてそこにコピーされると思われる。
    • ↑されましたけど保証はしないという意味です。

再インストール準備

OS X Lion がプレインストールではない場合の話 (OS X Lion を Mac App Store で購入した人向け) をしています。 OS X Lion がプレインストールだったりする場合は、おとなしく Cmd-R を押しながら起動してリカバリーに入って、Disk Utility でフォーマットして 再インストールメニューに進めばいいと思います。できるかは知らないけど。

こんな事をやっているのはダウンロードを待っている間何もできなくてだるいから。

  • Mac App Store の OS X Lion を開いて、おそらく今お使いであろう Mac に既に Lion が入っていたとしても "Download" 表記になってるはずなので Download を押す。
  • すると Install OS X Lion.app とかいう名前のアプリケーションが落ちてくるので適当にパッケージの中身を表示 (コンテキストメニューからできます) して InstallESD.dmg という名前のファイルを探す。見つけたら Disk Utility.app 使って USB メモリか何かに焼きます。詳細は割愛。ググろう。
  • 最初もしかしたらこのままフォーマットできるんじゃないかと思って普通にアプリケーション実行したんだけど、インストール開始ボタン押しちゃうとリブートした後はなにも選択肢無しにインストール始まるんだったね。忘れてたわ (アーカイブインストールなんだろうか、よくわからん)
  • なのでまぁ、それはさておきメディアが出来上がったらそれで reboot しましょう。StartupDisk.prefpane からだと見えなかったので仕方なく普通に Option (alt) 押しながら起動したんだけど普通に Option (alt) 押しながらでのブートディスク選択からなら見えました。そこは心配しなくて良い。

再インストール

  • Recovery HD からの起動と同じようなインターフェースになってるはず。まずはまっさきに Disk Utility を起動してフォーマットする。"Mac OS Extended (Journaled)" でいいんじゃないかな。Erase タブからでいいと思うよ。
  • そういえば Encrypted なんていう選択肢もあったけど、これは察するに FileVault でのアレと似ているが違うと思われるので、普通に "Mac OS Extended (Journaled)", HFS+ を選んだ。
  • フォーマットが終わったら普通にインストールをすすめる。"Customize" ボタンは存在したがグレーアウトしてたしどうしたら選択可能になるかわからなかった。もしかして OS X 残してたらアーカイブインストールとかを選択できただけなのかな。パッケージ選択はできなくなったのかなぁ。
  • インストールを開始したらしばらく待つ。

初期セットアップ

  • ふつうにセットアップを進めます。
  • とりあえず起動したら FileVault を有効化しておく。インストールしたばかりなのにかなり処理に時間かかるの何故かはわからんけど、待ってるのも面倒臭いので普通にリストアを開始してしまう事にした。
  • あと、諸々 OS 自体の設定を少ししておく。

リストア

  • 手順的には Preferences 等を書き戻した後にアプリケーションを入れる。
  • 外付け HDD をマウントした後、 diskutil enableOwnership ... を忘れずに。

設定類

  • OS X の主な設定ファイルの置き場は 3 つあって、とりあえずここら辺を覗いて新しい環境にコピーしていけば OK。

    • ~/Library/Preferences - plist ファイルが置いてある。まあ一番シンプルな設定ファイル置き場 (NSUserDefault が作ったりする)
    • ~/Library/Application Support - アプリケーションの実行には必ずしも必要ではないがテンプレートや設定などを入れる場所
    • ~/Library/Containers - OS X Lion から入った App Sandbox 機能を使っている場合 PreferencesApplication Support ディレクトリ等は Identifier の名前を持ったサブディレクトリの中に隔離される。詳しくはドキュメントを読もう。
    • ~/Library/SyncedPreferences - たぶん iCloud と同期されるバージョンの ~/Library/Preferences。どうせ iCloud 設定すれば戻ってくるんだしバックアップはいいや。

    説明は Mac App Programming Guide を参考にしました

  • Preferences や Application Support は再設定が面倒臭いアプリケーションに限って書き戻した。

  • Chrome や Safari に記憶させたパスワードなどが書かれた keychain は ~/Library/Keychains にあるので引き続き使う場合はコピペ。

  • その他アプリケーション固有の設定ファイルは以下にある。一部の Apple 製品が Application Support を使ってないのはなにか理由があるんだろうか

    • ~/Library/Xcode - iOS シミュレータのデータが入ってる (?)
    • ~/Library/Eye-Fi - Application Support に入れて欲しいが Eye-Fi の設定ファイルが入ってる
    • ~/Library/Gyazo - Application Support に入れて欲しいが Gyazo の設定 (自動設定される id) が入ってる。履歴とかの管理に使われている模様
    • ~/Library/iTunes - キャリアバンドルとかiOS のアップデートが置いてある
    • ~/Library/Safari - Safari のブックマークとか?

Dropbox

  • Dropbox は Dropbox をインストールする前に ~/Dropbox に書き戻す。 ~/.dropbox も戻しておく。
  • 一応バックアップは保持しておきましょう(うっかりすると全部消える)。保証はしませんよ。

アプリケーション類

  • 予めダウンロードしておいた dmg や zip をどんどん展開してインストールする。それだけ。簡単。

写真とか

  • ~/Music とか ~/Pictures とかも書き戻しておく。

開発環境周辺

  • めんどいので homebrew はそのままコピーして流用します
  • Ruby の環境なのも面倒くさいのでコピーして流用
  • Dropbox 内のディレクトリに向けたシンボリックリンクを ~/git に貼ったりする
  • dotfiles もシンボリックリンクを設定する
  • chsh で zsh に切り替えたりします
  • おわり

おわり

あとは Start at login とか Dock あたりを調整しておわりです。おつかれさまでした。

Published at 2012-03-02 19:19:22 +0900 | Permalink
2012-02-28

Growl が NSInvalidArgumentException で落ちる

Growl 1.3 が以下の例外を吐いて落ちる症状で苦しんでいて、OS X 再インストールしても治らないから困っていた:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSView setPolicyDelegate:]: unrecognized selector sent to instance 0x7fe443a5b200'

twitter に書いてみたら @d6rkaiz が workaround を探してきてくれた。thanks!

なんか Whiteboard と Darkroom の表示スタイルを使ってると出るそうで。 例外の中身的に表示スタイルを疑っていて、Darkroom から Whiteboard に変えたんだけどまさか Whiteboard も同じ持病を持ってるとは思いません! でした!

Growl 1.3.2 crashing regularly

$ sudo mv /Applications/Growl.app/Contents/PlugIns/Whiteboard.growlStyle/Contents/info.plist /Applications/Growl.app/Contents/PlugIns/Whiteboard.growlStyle/Contents/Info.plist
$ sudo mv /Applications/Growl.app/Contents/PlugIns/Darkroom.growlStyle/Contents/info.plist /Applications/Growl.app/Contents/PlugIns/Darkroom.growlStyle/Contents/Info.plist

workaround が載っていたのでやってみたが、同じ例外で落ちる。 やっぱり Darkroom と Whiteboard を使わないようにしたほうがいいのかなあ。使わないでみたらたぶん落ちなくなったと思う。

追記: その後使ってみた Raaarr とかいう表示スタイルも同じ例外で落ちやがる。Growl にバンドルされた表示スタイル不具合多すぎだろう。というわけで今は Brushed に Aqua オプションいれたのと Smoke を併用して使ってる。

Published at 2012-02-28 15:52:34 +0900 | Permalink
2012-02-25

Codeforces Round #109 (Div. 2)

dev

A, B, C, D に挑戦、A, B, D が Pretests を通り、DがSystem Testで落ちた。。

獲得点数は 1202: A=488 (00:06), B=714 (00:34), C=(-2), D=(-2).

A と B はそこそこ読解ゲーだった。

A. I_love_%username%

http://www.codeforces.com/contest/155/problem/A

はじめの読解ゲーがこれ。

まあストーリーな部分から本題を探すのにかなり時間が。

Output を見るに "Amazing performances" の数を出すべきで、 コンテストへの出場履歴の中からそれを数えるみたいな感じらしい。

で、Inputとそのサンプルをみると、1行目がスコアの数 (= コンテスト参加数), 2行目にそのスコアがスペース区切りでくるとある。

そしてまあなにが amazing かというと "amazing in two situations:" という文に続き amazing の条件がかいてある。"more" と "less" が太字になっている。スコアの上下から判断するとみて、とりあえずちゃんと読まずに以下のように解釈した。

  • 前回から成績が下がった
  • 前回から成績が上がった
  • ただし1回目は絶対に amazing ではない。

サンプルをみるにこれだと明らかにおかしいのでちゃんと英文を読むと、 "he earned on each past contest" とあるので、ハイスコアと最低スコアを更新 した時が amazing のようだ。ということで:

  • ハイスコアの更新
  • 最低スコアの更新
  • ただし1回目は絶対に amazing ではない。

これで実装すると sample と正しい動きをするので提出。所要時間6分。

解答: https://github.com/sorah/sorah-codeforces/blob/master/155/a.rb

B. Combination

http://www.codeforces.com/contest/155/problem/B

A は本題を見つけるのが面倒な読解ゲーであったがこちらは 本題がかなりの読解ゲーであった。何が "More formally:" だって感じ。

本題というかやるべき事は 2 段落目に書いてある。3 段落目の More formally らしい文章から先によむと混乱を招いた。

  • プレイヤーはカードを持っている
  • カードの裏表それぞれには 0 を含む正の整数が書いてある
  • カードは使用する事ができ、また同じカードは1度しか使用できない。
  • プレイヤーはまず1枚カードを使用する。
  • カードの表の数値 (a_i) はカードを使用したときにプレイヤーが得られるポイントが書いてある。
  • カードの裏の数値 (b_i) に書いてある分だけ、プレイヤーは追加でカードを引くことができる。

とある。3 段落目をこれを理解したあとによむと「はじめにカウンターが1つで、カードを使用するとカウンターが1つへって、カードの裏面の数値がカウンターに加算され、カードの表の数値がプレイヤーのポイントとなる」みたいな事が書いてあることがわかる。

で、Output はこのルールと指定されたカードだと最大でプレイヤーが取得できるポイントらしい。

解き方としては貪欲法(?)というのか、よくわからんが以下の方法で解いた

  1. カードをまず裏面を優先してソート、裏が等しければ表を利用して昇順ソートする。
  2. 一番最後(一番裏の数値が大きい、または裏の数値が大きくその中でも取得できるポイントが高い)カードを使用する。
  3. カウンターが1以上でかつカードがまだ残っていれば 1 に戻って繰り返す

解答: https://github.com/sorah/sorah-codeforces/blob/master/155/b.rb

C. Hometask

http://www.codeforces.com/contest/155/problem/C

結局解けなかったので解説もうまくできない。 要するに指定された文字列から指定された禁止の二文字を取り除かなければいけない、 文字列からすべての禁止パターンを取り除くには最低で何文字取り除けばいいか、という問題。

ちなみに Ruby でこういうの解くときはなるべく正規表現を使うと高速で素晴らしいです。

D. Colliders

http://www.codeforces.com/contest/155/problem/D

2312 年, n つの加速器が〜、らしいけど飛ばす。

最後の方にある箇条書き、Input などから見ていくと、

  • n つの加速器がある
  • 加速器には1以上n以下の番号がふられている
  • 加速器のオン・オフ命令が Input されてくる
  • オン命令は "+ 番号", オフ命令は "- 番号"
  • オン命令の時、すでに指定された加速器がオンならば "Already on" を出力
  • オン命令の時、 すでにオンになっている加速器の番号と指定された加速器の番号が互いに素 であるときは "Conflist with 指定された加速器の番号" を出力。
  • オフ命令の時、"すでに指定された加速器がオフならば "Already off" を出力
  • オン、オフ命令ともに上記の条件にマッチしない場合は (プログラム内部のオン・オフのフラグを切り替えて) "Success" を出力。

互いに素っていうのが面倒くさい。C++ でもよかったんだけれど Ruby で溶いてしまった。

毎回最大公約数を求めてるのでSystem TestでTLE食らった。仕方ないね...

(問題 C に執着せず、問題 D を C++ で再実装すればよかった。後悔。)

解答: https://github.com/sorah/sorah-codeforces/blob/master/155/d.rb

Published at 2012-02-25 02:59:13 +0900 | Permalink
2012-02-23

tmux に移行した

dev

脱 screen した。

tmux が便利らしいと聞いて OS X 10.7.0 とかの頃使ってみたんだけど OS X のバグで tmux を終了させるとカーネルパニックするという症状が出ていたのでしばらく断念していたのだが、 久々に弄ってみたらカーネルパニックしなかったので移行してみた。

所要時間はだいたい2時間15分くらいだったな。

といっても実はその 10.7.0 の頃にある程度書いた .tmux.conf があるので、それを書く時間を含めたら2h30mくらいか。

やった事はこれくらい

  • .tmux.conf の修正
  • tmux 向けの cdd の導入
  • 上記の cdd に対応するため .zshrc に書いてあるいくつかの ruby スクリプトを修正、というかつけたけど案外不便な部分を切った。
  • いままでやろうとおもってやってなかったSSHの時のホットキーを変えるという事を実現した

tmux.conf はここにあります。loadavg.sh は同じレポジトリの bin/loadavg.sh にあります。

~/.tmux.prefix については .zshrc で生成してます。

まあ、tmux に移行した所で今までとそんなに変わらないと思うけどね。

Published at 2012-02-23 11:31:10 +0900 | Permalink
2012-02-20

Xcode 4.3 を入れました。

dev

Xcode 4.3 を入れました。

Xcode 4.3 または CLI tools を入れた話 , デブサミ2012 の写真 - HsbtDiary(2012-02-18) 等で言及されていたのは行かの点:

  • /Developer がなくなって、/Applications/Xcode.app/Contents/Developer になるらしい
  • /usr/bin/gcc などは別パッケージになる
  • autoconf さようなら

とりあえず自分は Mac App Store で入れるのが嫌いなので dmg を developer.apple.com から引っ張ってこようと思ったら "View in Mac App Store" とか書いてあるの。

その下にある Additional Downloads から "Xcode 4.3 for Lion (xcode_4.3_for_lion.dmg)" と "Command Line Tools for Xcode (command_line_tools_for_xcode_.dmg)" をダウンロードしてきた。

Xcode 4.2 まではパッケージだったが今回から dmg には Xcode.app 一つが入っていた。Applications にコピーして終わる。 起動した後は Xcode に iOS Devices 関係のパッケージを入れろと言われたけれど。

あと、 HDD 容量 7GB ほど節約できるという内容の記事 (XcodeからCommand Line Tools for Xcodeに切り替えたらHDD使用容量が7GB減った - Glide Note - グライドノート) があったので自分でも調べた。

Filesystem      Size   Used  Avail
/dev/disk1      120G   108G   9.1G # Xcode 4.2 削除前
/dev/disk1      120G   108G    12G # Xcode 4.2 削除後
/dev/disk1      120G   112G   8.4G # Xcode.app コピー直後
/dev/disk1      120G   112G   8.4G # Xcode.app 起動後、iOS Devices の接続周りのパッケージをインストールした後
/dev/disk1      120G   112G   7.8G # CLI ツールインストール後

9.1 - 7.8 = 1.3 (GB) と Xcode 4.3 にアップデートしたら使用容量が増えました \(o)/ (iOS の開発とかするから仕方ない。我慢しよう。)

測定と Xcode 4.2 の削除は以下:

  • 容量の測定は df -H
  • Xcode 4.2 の削除は sudo /Developer/Library/uninstall-devtools --mode=all

あと、残念ながら autoconf は無かった。

homebrew-alt から引っ張ってくる。

$ brew install https://raw.github.com/adamv/homebrew-alt/master/duplicates/autoconf.rb
######################################################################## 100.0%
==> Downloading http://ftpmirror.gnu.org/autoconf/autoconf-2.68.tar.gz
######################################################################## 100.0%
==> ./configure --prefix=/Users/sorah/brew/Cellar/autoconf/2.68
==> make install
==> Caveats
This formula is keg-only, so it was not symlinked into /Users/sorah/brew.

The OSX shipped autoconf is more than 5 years old, and missing many
critical bug-fixes compared with the latest upstream.
In order to prevent conflicts with the system autoconf, this formula
is keg-only.

Generally there are no consequences of this for you.
If you build your own software and it requires this formula, you'll need
to add its lib & include paths to your build variables:

    LDFLAGS  -L/Users/sorah/brew/Cellar/autoconf/2.68/lib
    CPPFLAGS -I/Users/sorah/brew/Cellar/autoconf/2.68/include
==> Summary
/Users/sorah/brew/Cellar/autoconf/2.68: 66 files, 2.6M, built in 16 seconds
$ brew link autoconf

そして一応 xcode-switch しておく

$ sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer

これで終わり。

Published at 2012-02-20 17:24:51 +0900 | Permalink
2012-02-15

Desire HD + CyanogenMod 7.1.0 のバッテリー持ち改善

みんな大好き CyanogenMod. ICS な CM9 まだかなー。まだかなー?

それはさておき、2.3 ベースの CM7 系 (現在のところ最新) を使っていて、だいぶ前に 7.0.0 から 7.1.0 にアップデートしたらバッテリー持ちが悪くて仕方がなかった。

いや、7.0.0 でも既に魔法の15行とか入れないとダメだったんだけど、7.1.0 にしたらそれが効かないとかでいろいろ酷かった。だいたい半日持たないレベル。

いい加減ちょっと我慢の限界なので (CM9 出たら治るかなあと思ったけど CM9 まだ出てくれないし。) 公式フォーラムを見たらこんなスレッドがあって:

5 to 6 hours battery life - CyanogenMod Forum

nightly を使えばバッテリーが持つようになった という情報があったので Desire HD 向けの nightly build 一覧 から 2/14 時点で最新の cm_ace_full-260.zip を持ってきて焼いた。

ちなみに radio は 12.28b.60.140eU_26.03.02.26_M です。

焼いた後は魔法の 15 行導入と libhtc_ril.so 入れ替えとかをしました。

$ adb remount
$ adb shell
# cd /system
# vi build.prop

先頭にこれをペースト。先頭じゃないとダメらしい。

(ソフトバンク向け設定になってます)

libhtc_ril.so も入れ替える。

[RIL] Radio Interface Libraries - xda-developers から "RIL for 12.28b.60.140e_26.03.02.26_M" を持ってきて、update.zip 形式になっていたのでリカバリから zip を焼けば OK だった。それ以外でも行けるのかしらんけどとりあえず一番最新っぽいのを焼いたら rild が SEGV してダメだったので、一番今の radio バージョンに近い物を使ったら問題なく動いた(はず)。

後は副作用としてか Android market で有料アプリを購入するときに "Bill my SoftBank account" が表示されるようになりました。Sense 系 ROM だと見えるよ、というのはいろいろ探しまわると CM より Sense 系の ROM のほうが新しい libhtc_ril.so を使っているとかそういう情報があったので、まあそういう事なんだろう。

とりあえずこれで今朝充電器から unplug して、前なら放置していて全く使ってなくてもそろそろ 50% 目前だったのがまだ 97% でわろえる。自己責任でね。

あとついでに Migu 1VS フォントへの入れ替えもした:

$ adb push ~/Downloads/migu-1vs-20111002/migu-1vs-regular.ttf /system/fonts/DroidSansJapanese.ttf

追記

これを焼いていろいろやって、充電したのが2/14, その翌日の2/15の11時くらいにunplugして、12時間経過しても83%だった。効果あるっぽい。

Published at 2012-02-15 14:15:43 +0900 | Permalink
2012-02-10

Banshee に iTunes ライブラリをインポートする時に日本語なファイル名の一部で not found 言われる件

dev

前提

  • netatalk の AFP サーバーに対してファイルを転送した。

現象

Banshee という Linux の iTunes みたいな音楽管理ソフトの iTunes ライブラリ取り込み機能を利用した時に日本語ファイル名の一部で存在するのに存在しないと言われる。

原因

OS X の HFS+ は Unicode の Normalization Form D という方向で符号化された物がファイル名として使われている。

Normalization Form とは何か

Normalization Form とは Unicode は複数の形で一つの文字を表す事ができるので、それをどちらかに一般化 (normalize) する時に使う変換方法等の事。

http://unicode.org/reports/tr15/#Norm_Forms の Table 1. を見ると Normalization Form は 4 種類あって、

  • Normalization Form D (NFD) - Canonical Decomposition, 正準等価 で文字を 分解
  • Normalization Form C (NFC) - Canonical Composition, NFD で文字が一度正準等価で分解された後に正準等価で 結合 される
  • Normalization Form KD (NFKD) - Compatibility Decomposition, 互換等価 で文字を 分解
  • Normalization Form KC (NFKC) - Compatibility Composition, NFKD で文字を一度互換等価で分解した後に互換等価で文字を 結合

文字の分解・結合とは、上記したとおり Unicode はひとつの文字でも複数のバイト列で表面上同じ文字を表すことができる。

  • 分解 はなるべく一つの文字を複数に分ける事
  • 結合 はなるべく複数の文字からなる一つの文字をひとつにする事

たとえば「 」については「 」 + 「 」という風に分ける事ができる。この分ける事が分解で、これを「 」に戻す事が結合。もちろん「 」は実際 Finder 等では一つの文字に結合されて見える。一部のソフトウェア等を使った時にばらけて視えるかもしれないけど。Wine のファイル選択ダイアログとかね。

OS X の HFS+ はこの Normalization Form D を一部もじった物が使われているそうで。 要するになるべく文字が分けられているという。これを UTF-8-MAC と呼ぶらしい。

で、それが何?

Linux に転送するときに netatalk の AFP サーバーを使った。 この時 netatalk はこの UTF-8-MAC なファイル名を NFC で結合してくれているらしい。

しかし iTunes Music Library.xml, ファイル名等を記録しているライブラリファイルに入っているファイル名はまだ UTF-8-MAC のままである。

つまり、ファイルシステムには NFC されたファイル名なのに iTunes ライブラリに記録されているのは UTF-8-MAC なファイル名のままだから Not Found 言われる。

直す

なんというか、最初 Perl の Encode::UTF8Mac とかがラクなのか面倒だなと思ったら Ruby 1.9 の Encoding にあった。ありがとう成瀬さん!

というわけで Ruby 1.9 系では何も考えずに UTF-8-MAC の変換ができるよ! やったね!

URI エスケープ解く時に CGI じゃなくて URI 使ってるのはスラッシュとかまでエスケープしてほしくないから。これでも &#… みたいな記号表記があった時に #%23 にしてエラーがでてしまわないように &%23&# に戻してやる必要があった。

スクリプト

例によって 1.9 系が必要です。1.9.3 未満で動くかしらないけど。

https://gist.github.com/1781204

自己責任でね!

使い方

itunes_nfc.rb にスクリプトを保存したとすると:

$ cp iTunes\ Music\ Library.xml iTunes\ Music\ Library.orig.xml
$ ruby itunes_nfc.rb iTunes\ Music\ Library.xml > iTunes\ Music\ Library.xml

これで OK.

おまけ

Banshee さん iTunes Music Library.xml が異常だとインポート時にフリーズする…

参考文献

Published at 2012-02-10 12:07:51 +0900 | Permalink
2012-02-08

某アメリカに行きたい中学生を見て

https://twitter.com/#!/cloooote

アメリカに行くまで引退したエンジニアの元で特訓したいと思っています。14歳です。よろしくお願いします。Java練習中です。中学卒業後アメリカで力を付けたいと思っています。

こういう方が居てだな。

まず tweet と bio を見てみるとこういう事らしい

  1. 4月から中3 (?) 「今年」が今年度かどうかわからないが、たぶん2ヶ月だけの修行()なわけがないので4月から中3なのだろう。 https://twitter.com/#!/cloooote/status/166924455120076801
  2. 高校受験はせずにアメリカに行きたいらしい https://twitter.com/#!/cloooote/status/166880324133978113
  3. アメリカに行く前に「引退したプログラマ」の元で修行を受けたいらしい https://twitter.com/#!/cloooote/status/166880931360145409

これを見て自分の言いたい事を言ってみます。Facebookにも書いたけど。

まず最初に行っておきたいのは勝ち負けとか気にするなという事。最終的には働いてお金を得ることなのだから、悔しさとか等をバネにするのはいいが「アイツに勝った!!」とかバカみたいな事はやめたほうがいいと思う。負けたところでなんだ、という感じだし。自分が良ければそれでいい人は多いと思うよ。少なくとも自分はそうです。 もちろん確かにスゲーと思う人に憧れるのは悪くないと思いますよ。

アメリカに行きたいらしいが英語力も無いのに技術力より先に英語力をつけなければならず逆に習得が遅くなるんじゃないの? という事。技術力があれば英語力が多少足りなくてもなんとかなるが、英語力も技術力も無いのにUSに行っても金と時間の無駄になるんじゃないの?

というわけで日本のコミュニティでもある程度の技術力は付けられるので、まずは日本で頑張るといいと思います。田舎だとイベントとかには参加しにくいであろうが、今はインターネットとかもあるし積極的にアウトプットしてればなんとかなると思います。github とか blog とか twitter とか。

次に引退したプログラマとかで修行したいとか言っているけど、「ググれカス」とかいう言葉があるように自分である程度は頑張らないとダメですよ。また一人に弟子入りするよりコミュニティに潜り込んで周りの複数人に教えてもらうのが良いのですが、人によっては厳しいのでとりあえずまずは一人で頑張る事になるのかなあ。このへんは自分は恵まれてしまったのでアドバイスできそうにありません。

少なくとも「弟子入りしたい!」とか言ってるだけじゃダメだよなあ。と思う。

またこんな事を言ってる人もいます:

どこにお住まいなのかはわかりませんが高専に入るのも割と良い手だと思います。まあ、アメリカに行けば良い技術が身につくわけでもないので。

というわけで個人的にアメリカに行ったり弟子入りとかしたりはそこまで考えずに独学で頑張り、書いたコードなどはブログなどにアップロードしてアウトプットを続けていくといいと思います。

P.S.: はてなダイアリーとかはてなブログとかオススメです。このブログはそれ使ってないけど

追記

彼はエンジニア志望ではなかったらしい。何のためにアメリカに行ったり修行したいんだろう。 よくわかんないなあ。

Published at 2012-02-08 19:07:09 +0900 | Permalink
2012-02-06

2012誕生日プレゼントまとめ

ほしいものリストから注文された誕生日プレゼントが到着してるので、ここでお礼を。

2/4

新・物理入門, 新・物理入門 問題演習

新・物理入門 (駿台受験シリーズ)
山本 義隆
駿台文庫
売り上げランキング: 4633
新・物理入門問題演習 (駿台受験シリーズ)
山本 義隆
駿台文庫
売り上げランキング: 20606

@mrkn より。ありがとうございます。

今年度中に終わらせることになりました。2月中旬からやりはじめたいと思います。

2/5

KORG monotron

by @peraneko.

ありがとう!

ThinkPad Trackpoint USB Keyboard (US)

by @syuu1228.

今この文章はこのキーボードで書いています。膝の上に置いていても画面が揺れないしトラッキングデバイスもくっついてるし で非常に便利です。

ありがとう!

JETSTREAM 3色ボールペン

納品書には本名があった(なかったかも)、id と一致がつかなかったのでお礼ができない...

どなたかは存じ上げませんがありがとうございます。

ちなみにこのシルキーゴールドはピンクに近い色をしていました(´つヮ⊂)

zsh の本

zshの本 (エッセンシャルソフトウェアガイドブック)
広瀬 雄二
技術評論社
売り上げランキング: 183570

by @beepcap

ありがとう。なんか別の本を贈ってこようとしたみたいだけど困るのでやめさせた。

プログラミング Haskell

プログラミングHaskell
プログラミングHaskell
posted with amazlet at 12.02.06
Graham Hutton
オーム社
売り上げランキング: 20827

これは伝票に本名があったけど id との一致がつかなかったか書いてなかったかで一致がつかない。

誰かは存じ上げませんがありがとうございます。

Haskell やろうやろう詐欺をしていたので、その本が wishlist から贈られる事によってプレッシャー?によりちゃんとやることができる!

(クズだな...)

しかし、ちゃんと時間が取れそうなのは4月以降という。まずは新物理入門をやらねばならんので。

SHURE SE215, WL300NU-AG, iiyama ProLite E2208HDD (自腹)

自腹です。

SHURE 高遮音性イヤホン ブラック SE215-K-J
SHURE (2011-04-21)
売り上げランキング: 87

遮音性はむちゃくちゃ向上したものの、音は今まで使っていた2000円くらいのイヤホンと大して変わらない気がする。耳がバカなだけか。

ただSHURE気に入ったのでSE235とかに手を出したくなってしまいそうで危険…

NEC Aterm WL300NU-AG (USB子機) PA-WL300NU/AG
NEC (2009-02-08)
売り上げランキング: 2790

5GHz 帯 11n 対応の WR9500N にあわせて、5GHz 帯に対応したUSBアダプタとして購入。 これ以外で良いUSBアダプタあるのかなあ。WR9500N が amazon 販売で売ってなかったので 別の所で購入した都合上まだ届いていないが、今の使ってる corega の無線 AP だとアンテナが それまで使っていた BUFFALO のアレより弱い風に見えるとかで、レイテンシが若干前より安定してない。

まあ、無線APの設置場所の問題なんだろうけど...

あわせて読みたい: WL300NU-AG on Gentoo

寝室に置いているゲームマシンのモニタは安い BLUEDOT とかいうところのテレビに HDMI でつないで使っていたのだけど、1336x768 とかいう解像度で残念だったので 購入。フルHD広くて見やすくて良い。画面も明るいし。

ただ父親に何も言ってないのでまた寝室に物がみたいな文句が飛んできそうですね。自室はよ。

Eye-Fi Pro X2 8GB EFJ-PR-8G

Eye-Fi Pro X2 8GB EFJ-PR-8G
Eye-Fi Pro X2 8GB EFJ-PR-8G
posted with amazlet at 12.02.06
Eye-Fi Japan (2010-05-20)
売り上げランキング: 427

by @ayako119

ありがとうございます。

ダイレクトモード便利すぎる! 前まで使ってた古い Eye-fi 2GB (初代?に近い奴) より安定してることを期待しています。 前のデジカメと相性が悪かったのか時折ファイルが壊れてて残念だったので。

Eye-fi manager とか起動するのが面倒なだけですね。現状では。

TIMBUK クラシックメッセンジャー S, Linux カーネル 2.6 読解室

by @rosylily

4月からいろいろ出かけるのが増えるので使おうと思います。

今は同じ TIMBUK の D-lux メッセンジャー M を使ってるのだけど、これだとイベントとかでいろいろ MagSafe や HyperJuice といった荷物でこれくらいでピッタシくらいなんだけど、4月から出かける事になる用途では そんなに荷物がいらないのでこれの一回り小さいのがほしかったのでとてもありがたい。

メモなのですが、D-lux よりクラシックメッセンジャーのほうが荷物わける内ポケットが多いです。

ありがとう!

Linuxカーネル2.6解読室
Linuxカーネル2.6解読室
posted with amazlet at 12.02.06
高橋浩和 小田逸郎 山幡為佐久
ソフトバンククリエイティブ
売り上げランキング: 12887

なんかカーネルいじろうとか思っていて前から欲しかった本 (こないだジュンク堂で手持ちが足りず(足りたんだけど帰りの電車賃なので無理だった)諦めた本)

ありがとう!

2/6

WR9500N (自腹)

今日これから届く予定です。

まとめ

ありがとうございます!

本類についてはすでに積んでいる物を読み終えたら読み始めようと思っています。

2/5 はヤマト運輸さんが 3 回 (同じ人) が朝、昼、夜に訪問してきました。どう思ってたんだろう…

また、メール便の日本郵便もこないだポストに無理やり突っ込んで袋が開いていたりとか破けてたりしたのが続いたので クレーム入れた効果かちゃんとインターホンを鳴らしてくれました。

荷物が追加で届いたらこの記事に追記します。

Published at 2012-02-06 09:32:57 +0900 | Permalink
2012-02-05

WL300NU-AG on Gentoo Linux

自宅においてある Wi-Fi のアクセスポイントが酷いので Aterm WR9500N を購入したのだけど、

今持ってる USB のドングルじゃ 5GHz 帯に対応できないため適当な 5GHz 帯対応の USB ドングルを探したら、WR9500N と同じ Aterm の WL300NU-AG がなんだかんだ定番らしかったのでそれも購入。

NEC Aterm WL300NU-AG (USB子機) PA-WL300NU/AG
NEC (2009-02-08)
売り上げランキング: 3459

何故か WR9500N は amazon.co.jp 発送では無かった(はず)なので、別の所で WR9500N を購入した都合上こいつが先に到着してしまったので Gentoo で動かすためのメモ。

Kernel Config

Linux Wireless で WL300NU-AG を検索してみるとこのページがヒット する。 このページからモジュール名等はわからないのでURLからar9170と推測する。 しかしar9170のページを見ると以下のように書いてある

This driver is deprecated and it was deleted on Linux 3.0, replaced by carl9170.

自分は Linux 3.2.1 を利用しているので、書いてあるとおりに carl9170 を入れる事にする。carl9170 のページのデバイスリストに WL300NU-AG が載っているので大丈夫。

そして Linux のソースツリーで make menuconfig を叩いて carl9170 を有効化させる。

Device Drivers  --->
 [*] Network device support  --->
  Wireless LAN  --->
   [*] Wireless LAN (IEEE 802.11)
   <*> Atheros Wireless Cards
   <*>   Linux Community AR9170 802.11n USB support

お好みで SoftLED 等も入れる。

コレを入れてビルドする。まだ再起動はしないように。

(今回は既存のWi-Fiドングルを再起動時に差し替えるので、先にインターネットに繋がってる間にファームウェアを手に入れておく)

ファームウェアをツモる

Linux Wireless の carl9170 のページにファームウェアがあるのでツモってくる。Linux 3.2 なので "Linux 3.1 or newer" を選んだ。

$ sudo wget "http://linuxwireless.org/en/users/Drivers/carl9170/fw1.9.4?action=AttachFile&do=get&target=carl9170-1.fw" -O /lib64/firmware/carl9170-1.fw

(amd64 なので /lib64 なわけで適当に i386 的な人は置き換えて欲しい)

udev の設定で既存の wlan0 を潰す

udev の設定を弄って既存の wlan0 の設定をコメントアウトする。こうすることで次回起動時には WL300NU-AG を wlan0 と認識するので /etc/conf.d/net を変更せずにすむ。(ただし起動時に WL300NU-AG 一つしか指してない場合の話)

$ sudo vim /etc/udev/rules.d/70-persistent-net.rules

で、 wlan0 的な行を#でコメントアウトして保存してやる。

(ファイル名の70についてはうろ覚え)

再起動

再起動してブートする前に既存の無線ドングルを引っこ抜いてWL300NU-AGに置き換えるか、 一度poweroffして置き換えた後に起動しなおす。

すると普通にWL300NU-AGをwlan0として認識して何もせずともつながると思う。

免責事項

自己責任でね。

Published at 2012-02-05 18:58:29 +0900 | Permalink
2012-02-04

15 歳になった

15歳になりました。

利点としては自分に関係するものだけでこれら

  • VISA デビットカードが持てる
  • 4月から労基法でいう労働?ができる
  • mixi に登録できる

誕生日プレゼントはこちらの amazon.co.jp ほしい物リスト で受け付けています。

砂一トンとか石とか服とか困るのでそれは勘弁してくださいね。

Published at 2012-02-04 00:39:26 +0900 | Permalink