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もちょっとなぁ・・・。

スランプ

花京院の続き。

"プログラマーとして困る"というのはみみっちい話だけど2点ある。(両方個人的な話で、「俺は関係無いな」という人も沢山いると思う。)

プログラマーの価値が下がる

超大雑把に言うと、IT業界のエンタープライズ系・コンシューマ系は、

  1. 垂直統合型の時代
  2. 水平分業型の時代
  3. オープンソースの時代
  4. Googleの時代

って感じだと思う。1、2の時代はある程度鉄板ソリューションがあったんだけど、オープンソースが仕事にも使える様になってきて、プログラマにコーディングだけじゃなく、カオスな中からソリューション自体を選ぶ目利き的な事も期待されるようになった。

それが全部Googleでいいんでしょ?ということになるとIDEやフレームワーク、ミドルウェアなどもGAEに特化してきて今よりプログラマーの差異は小さくなる。(カオスな中をHackして一刀両断に問題解決するのが醍醐味だったわけだ)

多様性が減るとつまらない

プログラムは仕事と同時に趣味でもあるわけだけど、オープンソースが上手い具合にGoogleに誘導・操作されると多様性が無くなってつまらない。

同じジャンルに沢山のプレーヤーがひしめいて、パクりパクられ、鎬を削って、時には"誰得"的なものもあって、煮詰まりつつじりじりと全体のレベルが上がってきてある時、ポンッ!みたいのが面白い。

わがまま

要は業界が成熟してきたっつーことなんでしょう。黎明期を回顧する典型的おっさんなんですが、オープンソースでその成熟が思い切り予想外の方向にすっ飛んでいったのを見ると軌道修正されてGoogleに集約されずに行く方向は何か無いのかなあと思っちゃうわけです。

真面目に考えると、インフラをどうにかしないと変わりそうにないですな。SETIやFONみたいにP2Pか相互幇助なハードウェアリソースの上で動くレイヤーを開発する?難しそうだなー・・・。

関連:

Hpricotで良いなと思ってたのが、"クラス名と同名の関数にデフォルト動作をさせる"というやつ。

class Foo
  def initialize
    puts "new"
    # code...
  end

  def fetch
    puts "fetch"
    # code...
  end

  def send
    puts "send"
    # code...
  end
end

def Foo
  foo = Foo.new
  foo.fetch
  foo.send
end

こんな感じでFooクラスにFoo関数を作っておく。

% irb -r foo
>> Foo()
new
fetch
send
=> nil

普通こういう場合Foo.run!とかを用意するけど、クラス名をとりあえず実行してみればいいというのは楽。変数と関数の2値を持てるところを利用してるんだけどシンプルで好きだ。

このパターンの名前みたいのあるのかな?