Navigation Barの戻るボタンのタイトルを変える

ナビゲーションバーの左側に出す、前の画面に戻るボタン、デフォルトでは前画面のView Controllerのタイトルがボタンのラベルとして使われる。
これを別のものに変えようと思った。


UINavigationBarクラスのリファレンスに、NavigationItemのbackBarButtonItemプロパティに自分でアイテムを設定するとそれが表示されるよーと書いてあるので、自作のViewControllerサブクラスで次のようにしてみた。

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"戻る"
                                                                             style:UIBarButtonItemStyleDone
                                                                            target:self
                                                                            action:@selector(popViewController)];
}

- (void)popViewController
{
    [self.navigationController popViewControllerAnimated:YES];
}


戻るボタンに好きなタイトルを設定するため、UIBarButtonItemのinitWithTitleでボタンを作成する。
引数にtargetやactionというのがあって、ボタンが押されたときtargetに対してセレクタactionが実行されるとのことだったので、ボタンが押されたら前の画面に戻るようViewControllerのスタックをpopするようにしておく。


しかし、いろいろ試してみてたら、actionに渡しているpopViewControllerが呼ばれていないことがわかった。popViewControllerをactionに指定しなくても、ボタンを押したら前の画面に戻る。
こちらの記事 http://d.hatena.ne.jp/KishikawaKatsumi/20091120/1258679168 によれば、targetやactionは設定しても無視される、とのこと。
ドキュメントへのリンクも張ってあるけど、ドキュメントが更新されたみたいでその記述は見当たらない…


わざわざleftBarButtonItemとは別にbackBarButtonItemを用意してあるくらいだから、前の画面に戻るためだけに使うものなのは当たり前でしょ、てとこか。
忘れてまたはまりそうなのでメモっておく。

Mechanizeでエンコーディングの推測に失敗するとき

Shift-JISのページをMechanizeでスクレイピングしようとしたら、日本語が上手く扱えてなくてちょっとはまった。


文字列の中身としてはShift-JISのバイト列っぽいのだけど、エンコーディングUTF-8なものが取れてきてしまう。
HTMLのmetaタグでcharsetが指定されてなくて、エンコーディングの推定に失敗している?

agent = Mechanize.new
agent.get(url)
text = agent.page.at('div[...]/span[...]').inner_text
puts text.encoding                                    # => UTF-8
puts text                                             # => ŠG–{E’n–


Ruby1.9で導入された外部エンコーディングを指定するとよいのかなと思ったけど違った。
Mechanizeはそのへん関係ないらしい。


pageオブジェクトのencodingを適切に指定するとうまくいった。
http://w.livedoor.jp/ruby_mechanize/d/Mechanize%3a%3aPage#encoding=

agent = Mechanize.new
agent.get(url)
agent.page.encoding = 'Shift_JIS'                     # この行を追加
text = agent.page.at('div[...]/span[...]').inner_text
puts text                                             # => 絵本・地獄

ターミナルでのショートカットキー

ターミナルでの操作に使えるショートカットキーについて調べたのでまとめておく。
注意:Mac OS X(10.7.3)のターミナル.appの挙動を書いただけのものです。キーバインドは、OSがやってることなのかターミナル.appがやってることなのかそれともbashがやってることなのか、そのあたり区別していません。

キー 動作
Ctrl-A 行の先頭へ移動
Ctrl-E 行の末尾へ移動
Ctrl-F 右へ移動
Ctrl-B 左へ移動
Ctrl-U カーソル位置から行頭までを削除
Ctrl-K カーソル位置から行末までを削除
Ctrl-H カーソル位置の前の文字を削除
Ctrl-D カーソル位置の次の文字を削除
ただしテキストがないときに押すとログアウトになってしまうので注意
Ctrl-W カーソル位置の前の単語を削除
Ctrl-T カーソル位置とその前の文字を入れ替え
コマンド履歴を古い方に移動
Ctrl-Pも同じ
コマンド履歴を新しい方に移動
Ctrl-Nも同じ
Ctrl-R コマンド履歴からインクリメンタル検索
Tab 途中まで入力したコマンドやパスを補完
Ctrl-Iも同じ
Ctrl-L 画面をクリア

Amazon EC2にRedmineをインストール

Amazon EC2の無料枠が遊休状態だったのでRedmineを入れてみた。


幸運なことに、ほぼ同じようなことをやって手順を記録してくださっている方がいたので、これをほぼそのまま使わせてもらった。 http://il-all.blogspot.com/2012/02/amazon-ec2redmine.html
何カ所かで引っかかったり手順を改変したりしたのでメモっておく。

  • Ruby Enterprise Editionは使わなかった
  • sudo gem install rmagic で、ruby.h が見つからないというエラーが出た
    • sudo yum install ruby-devel をしてもう一度試すと解決
    • たぶんRuby Enterprise Editionにせずに最初から入っているRubyを使おうとしていてヘッダファイルが足りなかったせい
  • mysql起動後にrootのパスワード設定するところで、"No database selected" というエラーが出た
    • その直前で "use mysql;" を入れたら解決
  • 記事ではRedmine1.3.0を使ってあるが、1.3.1が出ていたのでそちらをインストールした(ダウンロードするファイルは同じところにある)
  • bzrやhgは使わないのでインストールしてない
  • configuration.yml の「### SCM、LDAPの鍵暗号化したい場合これを追加 database_cipher_key: "v3rys3cr3t"」はよくわからないのでとりあえず省略した
  • sudo rake generate_session_store は一発で成功した。gemのバージョンは1.3.7
  • sudo openssl rsa -in *.pem -out *_nopass.pem(鍵ファイルのパスワードを除去してるところ?)で、*.pemが存在しないというエラーになった
    • *.pem じゃなくて *.key と指定したらうまくいった
  • /etc/httpd/conf.d/ssl.conf への編集内容で、次のところを改変しないと動かなかった
    • SSLPrivateKeyFile を SSLCertificateKeyFile に
    • それに指定する鍵ファイルを *.pem から *_nopass.keyに


これとは別に、とりあえずな感じでローカルマシンで動かしていたRedmineがあって、それからデータを移行した。
手順はこの記事にあるとおり。 http://www.binword.com/blog/archives/000285.html
64bit->32bitの移行だったけど問題なくできた。さすがにダンプのフォーマットはそこに依存しないようにはなってるか。


マイクロインスタンスだけどいまのところ快適に動作してます。メモリ使用量は200MBくらい。
データが増えてきたときにどうなるかは分からないけど…

EC2をsshfsでマウントするには鍵ファイルは絶対パスで指定する

Mac OS X(10.7.3)からsshfsでAmazon EC2インスタンス上のディレクトリをマウントしようとしてはまった話。


まず、sshfsはこれを参考にして導入した。
http://www.makies.com/2011/10/274/


次のようにしてマウントしようとしてみるも、すぐエラーが返されて接続に失敗する。

$ sshfs -o IdentityFile=secret_key.pem ec2-user@X.X.X.X:/home/ec2-user ./remotehost
remote host has disconnected
$

sshコマンドでは接続できるのだけど。


UbuntuVirtualBoxゲストとして入れてる)から試しても、

$ sshfs -o IdentityFile=secret_key.pem ec2-user@X.X.X.X:/home/ec2-user ./remotehost
read: Cononection reset by peer
$

となって、エラーの内容は違えど接続できない。


検索でも同じ問題に出くわしているような事例がヒットせず困った。
いろいろ試してみてたら、IdentiryFileオプションで指定する秘密鍵ファイルを相対パスじゃなく絶対パスで書いたらマウントできた。

$ sshfs -o IdentityFile=/Users/username/path/to/secret_key.pem ec2-user@X.X.X.X:/home/ec2-user ./remotehost
$ ls remotehost
dir1 dir2 dir3
$


これ別にEC2固有の話じゃないよね…

Scalaを始めてみた

前から気にはなっていたScalaが、Advent Calendarを完走するくらいに盛り上がってきていて、最近新しい言語を覚えるのもあんまりやってないので始めてみた。
これまでJavaはよく使ってたけども、その資産を活かしつつもっと楽に書けるみたいで良さそうだし。
そのメモ。

インストール

Homebrewでインストールできる。

$ brew install scala
$ scalac -version
Scala compiler version 2.9.1.final -- Copyright 2002-2011, LAMP/EPFL

開発環境

EmacsScala-mode
http://d.hatena.ne.jp/tototoshi/20100925/1285420294

Eclipseプラグインもある(とりあえずまだ入れてない。IDE使うのはもう少し仕組みわかってからで)

周辺ツール

http://dropped-rice-grain.tumblr.com/post/14396568068/scala-hello-world
に沿ってツールをインストールする。


最初に、打ち消し線になってるけど一応

$ curl https://raw.github.com/n8han/conscript/master/setup.sh | sh

とやってみた。ここでは特に問題なかったのでその後の

$ ~/bin/cs harrah/xsbt --branch 0.11.2

をやったら案の定 Error during sbt execution: Invalid section(s): organization というエラーが出た。ので書いてあるとおり

$ git clone git://github.com/sett4/conscript.git
cd conscript
./setup-from-local.sh 

を実行してもう一度

$ ~/bin/cs harrah/xsbt --branch 0.11.2

→やっぱり Error during sbt execution: Invalid section(s): organization になる。
~/binにsbt,scalas,screplの各コマンドは生成されてるから良いのか…? ひとまずこのままで先に進める

$ ~/bin/cs n8han/giter8

→これは成功


次にscreplを実行してみる

$ ~/bin/screpl
Error during sbt execution: Invalid section(s): organization

やっぱりそれかー
エラーメッセージで検索しても情報は出てこない。困った


xsbtのgithubページ見て、conscriptと無関係にsbtをインストールする

$ brew install sbt

そしてsbtコマンドを実行したら、やっぱり Error during sbt execution: Invalid section(s): organization


わけがわからんので、brew uninstall sbt でsbtを一旦アンインストールして、ディレクトリ漁ってconscriptでインストールされたらしいものを手作業で削除
もう一度 brew install sbt したら、今度はsbtコマンドがエラー無く実行できるようになった!

最初にconscriptをインストールしたときのが何か変だったんだろうなあ。


というわけでとりあえずconscriptは無視して、sbtのGetting Started Guideを進めていってます。

2011年と2012年

2011年はかなり停滞の年でした。
新しいことほとんど何もできてないし、仕事の方でも大きな動きはなく、ずっとダルーな気分で過ぎていってしまった。
ここの更新頻度の低さがそれを物語っています。


このままでは技術者として死ぬ!社会的に死ぬ!みたいな焦りがだんだん強くなってあわわわ何から手を付けよう、という感じだったのですが、ちょうど良いことに年末年始となり、気持ちに区切りを付けられました。
2012年はきっと大きな転機になる一年に違いないので、それを目一杯活かせるよう、このような行動指針でいきます。

ミーハー気味でも良いので新しい技術や手法は試して記録に残す

仕事とは関係なく重要だと思うのなら独自にやるのが理想の技術者というものだろうけど、残念ながら使うあてがないのにあえてやってみようとするほど意思は強くない。
しかしこれからは、自分の手数を増やしておくことが世の中に提供できる価値の大小にすぐ影響するという状況になりそうなので、いろいろな技術を知っておくことが必要に違いない。
必要に迫られないとやらないというのは他の人から見るとつまらない態度かもしれないが、まあいずれにせよやる気になってるのだからいいじゃないの。
というわけで、話題になったような技術はチュートリアル程度で良いので触ってみて、記事にする。週1回は。

エンターテイメント、というか世の中で起きていることに触れる

最近あまりにも世の中のことから離れすぎちゃってます。テレビも映画も漫画もアニメも新聞も雑誌も見てない。
これはアイディア考えるのにも悪い影響だと思うので、意識して触れるようにせねば。
漫画喫茶にこもる日を作るとか。

体を動かす

走らなくなったせいか外食中心になったせいか、1年で5kg以上体重が増えてしまいました。
ベストの60kgに戻したい。
これも、週1回はジョギングする。

その他

  • コンテスト系の"練習"はしない
    • あまりそれに時間使ってもなあ、という感じになってきたので。実際に今ももう練習してなくて結果は悪くなってきてるけど、楽しく参加できればそれで良いです
    • ただしMarathonMatch系に取り組む時間は別。世界大会に招待される可能性が現実的なものとして存在する、ということは、人生における大目標の一つにしてよいものだと思う。あとけっこう実用性もあるし
  • まとめblog系は読まない(読んでもリンクたどらない)
    • こいつがかなり時間喰いなので、これを削ればだいぶ時間が作れるはず
  • 家計簿つける(何年言ってきたことか)
    • これまでよりも経済的に厳しくなることが予想されるので…
  • 勉強会的なところで2回以上発表する
    • 去年1回はできたので今年は2回以上
  • いいかげんEmacsをもっと便利に使えるようにする
    • せっかく使ってるのに未だにカーソル移動とコピーペーストくらいで止まってしまっている
    • たぶん職場で使っていないというのが大きいので切り替えよう