2009年9月 9日アーカイブ

RSSリーダとして、オープンソース版のfastladderを使っている。
fastladder は https のクライアント認証が必要な場所に置いてあって、標準のcrawlerではなくPlagger の Store::Fastladder を使って feed を入力している。
外出中は主にiPhoneを利用しているのだけれど、iPhoneで自前のクライアント証明書を入れる方法がわからなくて使えなかった。
今回、久しぶりに検索してみたら、iPhone 3Gでユーザー証明書を利用してみる - iPhone用連絡先交換サービス(QR Card)& 設定情報等 | iPhone Lab.と言う記事を発見した。
リンク先を見たら、既に「iPhone Configuration Utility 1.0 for Mac OS X」はリンク切れになっていたけれど、検索したらiPhone Configuration Utility 2.0 for Windowsと言うのを見つけたので、早速ダウンロードして使ってみた。
iPhone用のクライアント証明書と、オレオレCAの証明書をiPhone Configuration Utilityにimportして、構成ファイルを作成し、iPhoneにメールする。クライアント証明書をimportするときに、「export可能にする」にチェックしないと構成ファイルに秘密鍵を含めることができない。
iPhone側でメールに添付されたファイルをインストールすると、無事にiPhoneでクライアント証明書が使えるようになった。
しかし、fastladderはデスクトップPCでキーボードを使って操作することを前提に作られているので、iPhoneでは使い物にならない。
以前、fastladder_mobileと言うのを入れていたので、それで見てみたらなんとか見れた。
しかし、cssが適用されないっぽい。どうも、iPhone の Safari はサーバの証明書のホスト名が一致しないと css や javascript を実行してくれないようだ。
なんでホスト名が一致しないかと言うと、以下の理由による。
  • Apache の名前ベースのVirtualHostは、ホスト名ごとに別のサーバ証明書を扱えない(ので、サーバ証明書の名前はwww.wizard-limit.net)
  • fastladder は、コンテキストパスが / でないと実行できないため、メインのWebサーバとは別のホスト名を割り当てている
しょうがないので、https ではなく http 側も fastladder を有効にして、digest認証をかけてみた。
これで、iPhoneから見られるようになったのだが、fastladder_mobile にはいくつか気に入らないところが。
  • itemの並び順が、昇順ではなく降順
  • 設定で1ページの上限件数が指定できるが、一つのfeedに上限件数以上があると、その分は表示されてしまう。
ソースを少しいじって昇順に並ぶようにして、上限件数で切るようにしてみたが、問題が残った。
たとえば、あるfeedに未読が200件あったとして、最初の30件を表示させて、次のページに行くと200件全てが既読になってしまうのだ。
これは、fastladder の未読管理の仕組みに問題がある。
  • subscriptionsと言うテーブルにviewed_onと言う最後に読んだ日時と、has_unread と言うフラグがある
  • items と言うテーブルに stored_onと言う取得日時がある。
  • 既読にする処理は、subscriptionsのviewed_onを現在日時にして、has_unread を false にすると言う処理のため、全てが既読になってしまう
デスクトップのUIでは、When to mark a feed as read と言う設定がImmediately after loading.となっていればほぼ問題は起きないが、それ以外の設定だと問題が置きそうだ。
iPhoneや携帯では、1ページあたりの件数はある程度の数に限定したい。
そこで、今までRailsがわからないからと避けていたのだけれど、iPhone用になんとかしてみることにした。
iPhone対応にすると言うことで、iuiとかiWebKitとか試してみたんだけど、どちらもあまり気に入らなかった(iuiはアニメーションが遅かった、iWebKitはチェックボックスがimageを使ったトグルボタンになってしまう)のでiWebKitをベースに適当に切り貼りして作った。
後にして思えば、rep2 の iPhone 用UIが良くできているので、それを参考にするべきだったかも知れない。
最終的に採用したアルゴリズムは、以下の通り。
  • トップページは、未読があるfeedのリストをメニューとして表示する
  • feedを選択すると、item一覧ページを表示する
  • item一覧ページは、設定にある上限件数までの表示を目指すが、DBの未読管理の問題から同じstored_onを持つitemは全て表示する
  • item一覧ページから次のページに遷移するときに、表示していた最終stored_onでviewed_onを更新し、最終stored_onよりも新しいitemがないときだけhas_unreadをfalseにするようにする
  • 同じfeedに未読があるときは次のページも同じfeed。なければ次のfeed、次のfeedもなければHomeに帰る
複数ページあっても一気に既読にする機能とか、いろいろつけたい機能はあるけど、とりあえず読めるようになっちゃったからしばらくいじらないような気もする。
ソースは、fastladder_mobileに倣ってCodeReposに入れようかとも思ったけど、アカウント取るのが面倒だったのでとりあえずうちに入れておいた。
feeds.jpgitems.jpg

最近open fastladderがやけに遅い。
MySQLのチューニングなんかを見て、少しmy.cnfをいじってみたりしたけど効果なし。
itemsテーブルから古い記事を消すと少しだけ効果があるかな?と言う感じ。
そもそもMySQLは慣れていないので、古い記事を消すとかでも苦労しちゃう。
で、RrailsのActiveRecord?はPostgreSQLに対応しているんじゃないかと思って調べて見たら、いけそうな雰囲気。
まずは、fastladder/config/database.yml を修正。
production:
  adapter: postgresql
  encoding: utf8
  database: fastladder_production
  username: fastladder
  password: password
  host: localhost
変えたのは、adapterをmysqlからpostgresqlにして、socketをhostに変えただけ。
pgsqlユーザでDB fastladder_productionとユーザfastladderを作成して、rake db:migrateしてみたら、なんかpostgresがないみたいなエラーが出たので、
# gem install postgres
としてpostgresをインストールしたら、無事にrakeでテーブルが作られた。
あとは、PlaggerのStore::Fastladderなんだけど、こちらも中身を見たら直接SQLなんて書いてなくて、DBIx::Class::Schema::Loader とか言うのを使ってORマッピングしてるっぽい。
手元の環境を見たら、p5-DBD-Pgと言うのが入っていたので、Plaggerのyamlを修正してみる。
  - module: Store::Fastladder
    config:
      connect_info:
        - dbi:Pg:dbname=fastladder_production
        - fastladder
        - password
      member_id: 1
dbi:mysqlをdbi:Pgに変更して、後は接続パラメータの指定方法が違うのを適当に修正した。
plaggerを実行してみると、membersにid=1の人なんていないってエラーになるので、MySQLからmembersテーブルだけPostgreSQLに移行。MysqlからPostgresへ移行 - かぴぶろぐを参考にしたけど、記事の通りだとデータ中の改行が消えてしまうのでsedを使った。
  1. mysqlで実行(DBの管理者ユーザでやる)
    # mysql -u root fastladder_production -p
    Enter password:
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 1604
    Server version: 5.0.77 FreeBSD port: mysql-server-5.0.77_1
    
    Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
    
    mysql> select * from members into outfile '/tmp/members.csv' fields terminated by ',' optionally enclosed by '\"';
    Query OK, 1 row affected (0.02 sec)
    
  2. ファイルを覗くと、データ中の改行が\+改行になっているので、\を削除する。
    # sed 's/\\$//' < /tmp/members.csv > /tmp/members2.csv
    
  3. PostgreSQL側で実行(こちらもDB管理者ユーザで)
    % psql -U pgsql fastladder_production -W
    Password for user pgsql:
    Welcome to psql 8.1.17, the PostgreSQL interactive terminal.
    
    Type:  \copyright for distribution terms
           \h for help with SQL commands
           \? for help with psql commands
           \g or terminate with semicolon to execute query
           \q to quit
    
    fastladder_production=# copy members from '/tmp/members2.csv' with csv null as '\\N' escape '\\';
    
  4. 再度plaggerを実行すると、今度はDateTime/Format/Pgがないと怒られたので、portsから devel/p5-DateTime-Format-Pg をインストール。
    今度こそうまくPostgreSQLにデータが入った。
    面倒なので過去のデータはそのまま捨てる(と言うかMySQLに入れたまま)にして、これから先のデータだけPostgreSQLを使うことにする。
    しかし、あっけないほど簡単だった。今回対象にした、fastladderとPlagger::Plugin::Store::Fastladderがそれぞれ特定のDBに依存していなかったおかげだ。
    RubyとかPerlは、普通にORマッピングを使ってるのに対して、Javaだとまだまだ閾が高いような気がするのは何故だろうか。

    次は、mongrel捨ててPassengerへの移行だな。
2009年9月
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30      

このアーカイブについて

このページには、2009年9月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2009年8月22日です。

次のアーカイブは2009年9月10日です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 6.1.1