Monday, November 30, 2009

NatsuLiphoneとRead It Laterとの連携 (1)

NatsuLiphoneを使っている際に,TimelineにURLが付いているのを読み返したいとき,無闇にふぁぼったりして,favoriteなのか,ただ単なるreminderなのか,よくわからない状況で使っていました。

折角,NatsuLiphoneのsourceが公開されているので,Read It LaterのAPIを連携させて,「web siteを後で読む」(Read It Laterとの連携機能)を実装してみました。

Read It LaterのAPI Keyの関係上,まだdiffを公開できませんが,ここ数日でNatsuLiphoneの作者様や,Read It Laterと連絡してみて,何とか公開できるようにしてみます。

見せられる部分のキャプチャ画面。

 
下のツールバーに+ボタンつけました。 UIActionSheetでRead It Laterに登録するボタンを出しました(キャンセルもできます)。  
Read It Laterのアカウント設定画面入り口 Twitterと同じようにRead It Laterのアカウントを設定します。 アカウントが間違っていると,Alertで警告されます(アカウント登録キャンセル機能も実装しないといけないことに今気付いた)。

さて,NatsuLiphoneのsourceは,Model,View,Controllerとの概念をしっかり分けていて,比較的楽に読むことができたのですが,一点だけ気になる点。

ntlniph/NatsuLion/models/network/NTLNHttpClient.mの
- (void)requestSucceeded {
 // implement by subclass
}

- (void)requestFailed:(NSError*)error {
 // implement by subclass
}
の箇所。やはり,これらの2つの関数をdelegate protocolで定義し,このdelegate protocolをsub classは実装するという形にすれば,もっと綺麗になるかなと思いました。Objective-Cに慣れるための練習問題として,やってみるのも面白いかと思います。

Friday, November 27, 2009

Rails Integration Test (2) - restful_authentiaction plugin を導入した際の integration test の書き方

Railsでrestful_authentication plugin を導入したら,今までのintegration testが 通らなくなった。理由は,login sessionが確立されていないかだが,どのように login sessionを integration test内で確立させるか?

% script/generate authenticated user sessions
で,sessions_controllerを作成したとき,test/functional/sessions_controller_test.rbが作成され,
  def test_should_logout
    login_as :quentin
    get :destroy
    assert_nil session[:user_id]
    assert_response :redirect
  end
というのがあるので,login_as methodが利用できると考えられる。しかし,単純にlogin_asを呼びだしても,
  1) Error:
test_comming_and_going_editing_acount_view_and_creating_new_category(AccountCategoryFlowsTest):
NoMethodError: You have a nil object when you didn't expect it!
The error occurred while evaluating nil.session
    /lib/authenticated_test_helper.rb:4:in `login_as'
    test/integration/account_category_flows_test.rb:17:in `test_comming_and_going_editing_acount_view_and_creating_new_category'
と怒られる。そこでlogin_as methodがどのように定義されているかを確認すると,
lib/authenticated_test_helper.rb
  def login_as(user)
    @request.session[:user_id] = user ? (user.is_a?(User) ? user.id : users(user).id) : nil
  end
とあるように,@requestを事前に準備していなければならない。その答えは,Rails forumの次のdiscussionにあった。 how to get a user in a functional test, with AuthenticatedSystem? より,
  def setup
    @request    = ActionController::TestRequest.new
  end
setupで,ActionController::TestRequestのインスタンスを@requestに作成しておけば login_as を実行しても怒られなくなった。

Tuesday, November 17, 2009

UbuntuでのHOME directoryの暗号化(インストール後)

Mac OS Xには,FileValut機能によって,ホームフォルダを暗号化する機能がありますが,同様にThinkPad X60s上に導入したubuntuの/home/$USERも暗号化させたいもにです。そこで, Ubuntu's Encrypted Home Directory: A Canonical Approach to Data Privacy を参考にして,やってみました。ハマった点が2箇所あるので,手順を引用しながら説明します。

該当箇所は "Ubuntu 9.10 Live Migration to an Encrypted Home Directory" の箇所です。


rm -rf $HOME.old

を実行する前まではやりなおすことができるので,慎重に実行してください。こういう作業を行う際には紛失してもかまわないように,データのバックアップを実行して,外部に保存してください。

以下の作業はTTY端末で実行した方が安全です。gnomeセッションが残っていると,一部のファイル.gvfs/にアクセスする際に問題が発生します。Login画面の所でにCTRL-ALT-F1を同時押しして,TTY端末に落としましょう。

作業開始前,または途中作業がわからなくなって最初からやり直す場合に,$HOME/.Private,$HOME/Private, $HOME/.ecryptfs を削除しておきます。


% sudo rm -rf $HOME/.Private $HOME/Private $HOME/.ecryptfs

セットアップを開始します。

% encryptfs-setup-private
2010年5月8日訂正。h12o様より,ご指摘いただきました。「encryptfs-setup-private」ではなく「ecryptfs-setup-private」です。
% ecryptfs-setup-private

login passphrase,mount用pass phraseが聞かれますので,適切に入力します。

一度,log outしlog inしなおして,$HOME/Private がmountされていることを確認しておきます。


% exit
... log in again
% mount | grep "$USER.*ecryptfs*" <- ここで $HOME/Privateがmountされているかどうか確認できます。


これで,$HOME/Privateの中が暗号化されているわけです。これを何とか$HOMEを対象にしたいのが目的です。

encryptするHOMEの内容を$HOME/Privateにsyncしておきます。


% rsync -aP --exclude=.Private/ --exclude=Private --exclude=.ecryptfs $HOME/ $HOME/Private


sync しておいて,$HOME/Private を umount して,一旦 logout します。

% sync
% ecryptfs-umount-private
% exit

再login後,eCryptfsのconfiguration directoryを設定します。


% ecryptfs-umount-private
% cd /
% sudo mkdir -p /home/.ecryptfs/$USER
% sudo mv $HOME/.ecryptfs /home/.ecryptfs/$USER

ここから,新しいhome directoryを設定します。


% sudo mkdir -p -m 700 /home/$USER.new
% sudo chown $USER:$USER /home/$USER.new <- user/groupは適切な値にしておいてください。
% sudo mv $HOME/.Private /home/.ecryptfs/$USER
% sudo ln -s /home/.ecryptfs/$USER/.ecryptfs /home/$USER.new/.ecryptfs

一旦,$HOMEをbackupします,


% sudo mv $HOME $HOME.old

新しいHOME directoryに移行します。


% sudo mv /home/$USER.new $HOME
% echo $HOME > $HOME/.ecryptfs/Private.mnt
% sudo ln -s /usr/share/ecryptfs-utils/ecryptfs-mount-private.txt $HOME/README.txt
% sudo chmod 500 $HOME

一旦,log outして再log in後,configuration direcotry (.ecryptfs) と .Private に対してsymbolic linkを貼ります。


% exit
... log in
% ln -s /home/.ecryptfs/$USER/.ecryptfs $HOME/.ecryptfs
% ln -s /home/.ecryptfs/$USER/.Private $HOME/.Private <- これがないとマウントできない。

最後に,元のHOMEを削除します。


% sudo rm -rf $HOME.old

これで,ThinkPad X60sを持ち歩いても大丈夫になったかなと思います。