% wget "http://localhost:10010/rpc/collection/opml" -O remedie.opml

便利ー。sqlite3だからremedie.dbを直接コピーでもいいかも。

参照:コマンドラインでRemedieのRPC叩いて登録チャンネルリストをOPMLファイルに取っておく - otsune's SnakeOil - subtech

tridentをGem化してリリースしました - Hello, world! - s21g

tridentは、 tail -f log/development.logと autotest、script/console を一枚の端末上で同時に実行するRailsプラグインでした(trident: tail -f, autotest and script/console at once参照)

便利すぐる。使わない人には宗教上の理由が必要ですね?

% trident
Rendered cemeteries/_cemetery (0.00263)
Rendered shared/_page_header (0.00083)
Rendered shared/_header_other (0.00068)
Prefecture Load (0.000395) SELECT * FROM `prefectures` WHERE (`prefectures`.`id` IN (10,11,12,13,14,19,22,23,26,27,28,29))
CACHE (0.000000) SELECT * FROM `costs`
Character Load (0.000364) SELECT * FROM `characters`
Character Columns (0.001453) SHOW FIELDS FROM `characters`
Rendered cemeteries/_finder (0.01049)
Rendered shared/_page_footer (0.00073)
Completed in 0.19417 (5 reqs/sec) | Rendering: 0.12335 (63%) | DB: 0.02105 (10%) | 200 OK [http://tsuisumi/cemeteries]
Loading development environment (Rails 2.0.2)
loading autotest/rails_rspec
./vendor/rails/activesupport/lib/active_support/core_ext/enumerable.rb:17: warning: method redefined; discarding old group_by
./vendor/rails/activesupport/lib/active_support/core_ext/string/starts_ends_with.rb:8: warning: discarding old start_with?
./vendor/rails/activesupport/lib/active_support/core_ext/string/starts_ends_with.rb:9: warning: discarding old end_with?
SQL (0.000168) SET NAMES 'utf8'
SQL (0.000089) SET SQL_AUTO_IS_NULL=0
SQL (0.097719) SELECT version FROM schema_info
>> Cemetery.find(1).name
Cemetery Columns (0.028357) SHOW FIELDS FROM `cemeteries`
Cemetery Load (0.000333) SELECT * FROM `cemeteries` WHERE (`cemeteries`.`id` = 1)
=> "駒形霊園"

Railsで都道府県のfixtureをcsvで作ってあったんだけどymlにしたかったのでpythonの勉強のためにpythonで書いてみた。

#!/usr/bin/env python
import sys
import csv

if (len(sys.argv) < 2):
print 'Usage: %s ' % sys.argv[0]
quit()

csv_file = sys.argv[1]

filename, suffix = csv_file.split('.')
reader = csv.reader(file(csv_file, 'r'))

i = -1
res = []
for row in reader:
i += 1
if i == 0:
column = row
continue

s = filename + str(i) + ":\n"
for j in range(len(column)):
s += " " + column[j] + ": " + row[j] + "\n"
res.append(s)

f = open(filename + ".yml", 'w')
f.write("\n".join(res))
f.close()

基本的な構文もわかってないので時間がかかりました。ただ、quickrun.vimを入れたら¥rで即座に実行してくれるので、「こんな感じかな?」と気軽に実行できるのが便利でした。

糞ダサイコードになってると思うのでどなたか添削いただければ幸いです・・・。

一番知りたかった事

このブログ更新したらエラーが。

SQLite3::BusyException (database is locked):

timeoutをどんだけ増やしてもダメ。

% sqlite3 production.sqlite3 vacuum
SQL error: disk I/O error

passengerが掴んでるのか知らんけど、ロックしてるプロセスはどうやって探せば良いんだろう?

% cp production.sqlite3 foo
% rm -f production.sqlite3
% mv foo production.sqlite3

とりあえずコピーして削除したらロック消えた・・・。

% stat -c '%s' production.sqlite3
2905088
% sqlite3 production.sqlite3 vacuum
% sqlite3 production.sqlite3 reindex
% stat -c '%s' production.sqlite3
2865152

ついでにvacuumしたけどあんまりサイズ減らないなあ・・・。

「クラウドって何?」

と聞かれてすっぱり答えられなかったので自分でも良く理解してないんだろうということで調べてまとめてみる。(絵を描いたり文章にしないと理解できない残念な頭になっている・・・)

クラウドとは

ビジネス的にはクラウド(大体はクラウドコンピューティングの意味で使われる)とはソフトを自分のPCにインストールするのではなく、Gmailみたいにインターネット上のサービスを使うコンピューターの利用形態のこと。

技術的にはクラウド(大体はクラウドコンピューターの意味で使われる)とは仮想化技術や大規模分散技術のこと。

メリット

  • コスト安
  • どこからでも同じデータにアクセスできる利便性

デメリット

  • カスタマイズ性が低い
  • UIがヘボイ
  • 遅い

Google App Engine入門:実行効率を犠牲にせずに開発効率だけを上げるテクニック

memoize (デコレータ)

これはPythonを使う人たちの間では良く使われるデコレータのパターンで、関数の戻り値をクロージャを使ってキャッシュすることにより、実行効率を上げる仕組みである。Google App Engineの場合、サーバーが一度メモリーにロードしたモジュールは、アプリへのアクセスが途絶えてアプリそのものがサーバーから追い出されない限りはメモリーに常駐していてくれるので、memoizeとはとても相性が良い。

kwargs(デコレータ)

これは、HTTPリクエストをプロセスするRequestHandlerのメソッドを実装する際に、getやpostに渡されたパラメータを、関数へのnamed argumentとして渡された形でのコーディングを可能にするデコレータである。

イイね!イイね!(何様だ > 俺)

めもいずって糞面倒臭いイメージがあったんだけどデコレータでこんなにシンプルに実装できるんですね!

こういう、"大きな仕事はしないけど、ちょっと便利にしてくれて、マイナス面はほとんど無くて、嫌なら別に使わなくても問題無い"みたいな、プログラムに幸せだけを振り掛けてくれるような、きざみパセリみたいなモジュールとても好きです。(最近のRubyだと"g"みたいな)

露骨

質問!

GAEのwebappでCRUDはどういう名前使うんでしょうか。世間のコードにはjava風、rails風、我流といろいろあって迷う。

BookmarkのCRUD

モデルのクラス名はBookmarkで良いとして、actionの良い命名規約が欲しい。

名称 URL クラス メソッド
一覧 /bookmarks BookmarksHandler get
詳細 /bookmarks/1 BookmarkHandler get
登録フォーム /bookmarks/new BookmarkNewHandler get
登録 /bookmarks BookmarksHandler post
編集フォーム /bookmarks/1/edit BookmarkEditHandler get
編集 /bookmarks/1 BookmarkHandler put
削除 /bookmarks/1 BookmarkHandler delete

とりあえずはこんな感じで行こうかなあ・・・。(みんなどうやってる?)

まずHTTPのメソッドについてはREST厨的にはこれしか無い気がする。そうなるとgetが4個あるので最低でも4個のクラスが必要になる。suffixはAction, Handler, Page, Controllerなど色々な例を見るけど、どうもどれもしっくりこない。

Actionはその後に動詞が来るので"XxxActionがgetする"っていうのは何か変な感じがする。Handlerは無難な感じがするけど逆にあってもなくても良いものをわざわざ付けてるという雰囲気が気になる。Pageはページだけじゃないし、Controllerはリソースに対して一つのControllerが対応しないとおかしい気がする。

NewとかEditもちょっとなぁ・・・。

スランプ