「今度のプロジェクトは"あの機能"の実装がキモだなー。難しそう・・・」

「このバグがどうしても治らん・・・」

というのをとりあえずHelp me, hackers!に書いといたらマジでそっこう(7時間ぐらい)で解決した・・・。

なんぞこれ。なんでこんなにありがたいことが起こるのか、考えてみた。

仮想開発部

Aはプログラマー。今回のプロジェクトはJavascriptでのリッチなUI実装がキモだ。しかしAはクライアントサイドプログラムには明るくない。

A:「ここでこのイベントが取れれば・・・。あれ?ここでのthisは一体何を指しているんだ?」

BはAの隣の席のプログラマー。Aのプロジェクトは佳境を迎えているがBは別のプロジェクトが終わったばかりで暇だ。

B:(ちょうど未読RSSが無くなったところだしAをひやかすか)

B:「Aさんどうすか、JS。」

A:「キモイ。Java書きたいよ。thisがthisじゃないんだよ。どういうこと、これ?」

B:「ッハハ。大変っすねー。ちょwww、AさんFirefoxのAddon入れ過ぎじゃないすかwww」

CはAの向かいの席のプログラマー。Javaのプロジェクトに参加中。AやBとはあまり親しくは無い。

C:(向かいの席がうるさくて集中できん。どうせベタベタなJava風クラスを書いてるんだろ。JQueryのClickイベントハンドラ内だったらthisはそのボタンだろ。ボケが!)

Dはプログラマー。新人だがJavascriptは学生時代から書き慣れている。

D:(勉強のためにAさんのプロジェクトをチェックアウトして見てみたけどこれはひどいwww。冗長でソースの見通しが悪すぎる。136行目、これ動かないだろう、常識的に考えて・・・)

D:(まあ僕には関係無いから黙っとこう。下手なこと言ってあのデスマプロジェクトに入れられたらたまらないからな。)

隣の席のプログラマーが超いっぱいいる状態

通常、隣の席のプログラマーは数人しかいない。しかし、ネットにタスクがアップされていると沢山の人が冷やかしにくる。

タスクをアップした本人は自分の責任であるコードがバグってて本当に困っているんだけど、見に来る人にとっては、直らなくてもまったく困らない。ちょっと覗いてみて、もしなおっちゃったらラッキーぐらい。

なおらなくても、「ハハー、たいへんだねぇ〜」程度。

友人や同僚で「それわかるかもしれないので僕もちょっと見てみますね」といって問題を解決してくれる人がいるでしょう?そういう隣の席のひやかし同僚が超いっぱいいる状態になってるから1日もたたずに問題が解決されるんじゃないだろうか。

Heroku用Redmine簡単セットをforkしときました。バージョンは0.9.6で日本語用の初期データが入っている状態です。

% sudo gem install heroku rails -v=2.3.5 sqlite3-ruby taps
% git clone git://github.com/komagata/redmine.git -b 0.9.6-for-heroku
% cd redmine
% heroku create issues-fjord
% heroku db:push
% git push heroku 0.9.6-for-heroku:master

Redmine on Heroku

admin / adminで入れます。

やっていることはこちらを参考にしただけなので下記を見て自分でやっても同じです。

参照:Herokuでredmineを動作させる。 - コンピュータわ難しくて分からない!!

複数タブを閉じるときに警告を出す

あっさり解決しちゃうんだね。仕方ないね・・・。

解決しねえ!C-qで終わる!

locale_railsの最新は2.0.5。rails2.3.8には対応してない。

でもgithubの先っちょは対応してるのでbundlerの場合はGemfileに下記のように書けばいい。

gem 'locale_rails', '2.0.6', :git => 'git://github.com/mutoh/locale_rails.git'

2.0.6なんて無いのに何故動くんだろう?

vendor/bundle/bundler/gems/locale_rails-xxxxxxxxx-masterの下に入ってるので、submoduleとして扱ってるのかも。gemspecは何処にも無いのでgemを作ってる訳ではなさそう。

普通のRoute

ActionController::Routing::Routes.draw do |map|
map.resources :tasks
end
% rake routes
tasks GET /tasks(.:format) {:action=>"index", :controller=>"tasks"}
POST /tasks(.:format) {:action=>"create", :controller=>"tasks"}
new_task GET /tasks/new(.:format) {:action=>"new", :controller=>"tasks"}
edit_task GET /tasks/:id/edit(.:format) {:action=>"edit", :controller=>"tasks"}
task GET /tasks/:id(.:format) {:action=>"show", :controller=>"tasks"}
PUT /tasks/:id(.:format) {:action=>"update", :controller=>"tasks"}
DELETE /tasks/:id(.:format) {:action=>"destroy", :controller=>"tasks"}

APIの場合、newとeditのページは要らないので絞る。

ActionController::Routing::Routes.draw do |map|
map.resources :tasks, :except => [:new, :edit]
end
% rake routes
tasks GET /tasks(.:format) {:action=>"index", :controller=>"tasks"}
POST /tasks(.:format) {:action=>"create", :controller=>"tasks"}
task GET /tasks/:id(.:format) {:action=>"show", :controller=>"tasks"}
PUT /tasks/:id(.:format) {:action=>"update", :controller=>"tasks"}
DELETE /tasks/:id(.:format) {:action=>"destroy", :controller=>"tasks"}

NESTしたRouteでも絞ろうとすると、

ActionController::Routing::Routes.draw do |map|
map.resources :project, :has_many => :tasks, :except => [:new, :edit]
end
% rake routes
project_tasks GET /project/:project_id/tasks(.:format) {:action=>"index", :controller=>"tasks"}
POST /project/:project_id/tasks(.:format) {:action=>"create", :controller=>"tasks"}
new_project_task GET /project/:project_id/tasks/new(.:format) {:action=>"new", :controller=>"tasks"}
edit_project_task GET /project/:project_id/tasks/:id/edit(.:format) {:action=>"edit", :controller=>"tasks"}
project_task GET /project/:project_id/tasks/:id(.:format) {:action=>"show", :controller=>"tasks"}
PUT /project/:project_id/tasks/:id(.:format) {:action=>"update", :controller=>"tasks"}
DELETE /project/:project_id/tasks/:id(.:format) {:action=>"destroy", :controller=>"tasks"}
project_index GET /project(.:format) {:action=>"index", :controller=>"project"}
POST /project(.:format) {:action=>"create", :controller=>"project"}
project GET /project/:id(.:format) {:action=>"show", :controller=>"project"}
PUT /project/:id(.:format) {:action=>"update", :controller=>"project"}
DELETE /project/:id(.:format) {:action=>"destroy", :controller=>"project"}

projectの方しか絞れない。

こっちの書き方なら両方絞れる。

ActionController::Routing::Routes.draw do |map|
map.resources :projects, :except => [:new, :edit] do |project|
project.resources :tasks, :except => [:new, :edit]
end
end
% rake routes
project_tasks GET /projects/:project_id/tasks(.:format) {:action=>"index", :controller=>"tasks"}
POST /projects/:project_id/tasks(.:format) {:action=>"create", :controller=>"tasks"}
project_task GET /projects/:project_id/tasks/:id(.:format) {:action=>"show", :controller=>"tasks"}
PUT /projects/:project_id/tasks/:id(.:format) {:action=>"update", :controller=>"tasks"}
DELETE /projects/:project_id/tasks/:id(.:format) {:action=>"destroy", :controller=>"tasks"}
projects GET /projects(.:format) {:action=>"index", :controller=>"projects"}
POST /projects(.:format) {:action=>"create", :controller=>"projects"}
project GET /projects/:id(.:format) {:action=>"show", :controller=>"projects"}
PUT /projects/:id(.:format) {:action=>"update", :controller=>"projects"}
DELETE /projects/:id(.:format) {:action=>"destroy", :controller=>"projects"}

スッキリ!

Githubが会社向けに機能充実!・・・と思ったら月100ドルとか意外と高ぇ・・・。

と、思ってたらすぐさまこんなリリースが!

Organizations for Small Businesses - GitHub

Bronzeで月25ドルから。ちょっとこれはいいかもしんないですねー。

リポジトリは開発会社にとって落ちたら業務が出来ないので社内に置くと維持にちょっとドキドキ。社外にサーバー借りるにしても面倒+そこそこ費用がかかる。メンテナンスフリーで使い勝手の良いGithubがこのお値段で使えるならお得じゃないでしょうか。

そうそうそう!

config/routes.rb

ActionController::Routing::Routes.draw do |map|
map.posts 'posts', :controller => 'posts', :action => 'create',
:conditions => {:method => :post}
end

POST

% telnet localhost 3000
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying fe80::1...
telnet: connect to address fe80::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
POST /posts HTTP/1.0
Content-Length: 21

hoge=fuga&hoge2=fuga2
HTTP/1.1 200 OK
Etag: "d1a0c9e0358e819fd093bc7ddd19caeb"
Connection: close
Content-Type: text/html; charset=utf-8
Date: Thu, 01 Jul 2010 08:54:17 GMT
Server: WEBrick/1.3.1 (Ruby/1.8.7/2010-06-23)
X-Runtime: 2
Content-Length: 72
Cache-Control: private, max-age=0, must-revalidate
<h1>Posts#create</h1>
<p>Find me in app/views/posts/create.html.erb</p>
Connection closed by foreign host.

GET

% telnet localhost 3000
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying fe80::1...
telnet: connect to address fe80::1: Connection refusedTrying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET /posts HTTP/1.0

HTTP/1.1 405 Method Not Allowed
Allow: POST
Connection: close
(以下略)

Module: ActionController::Routing

Route conditions

With conditions you can define restrictions on routes. Currently the only valid condition is :method.

  • :method - Allows you to specify which method can access the route. Possible values are :post, :get, :put, :delete and :any. The default value is :any, :any means that any method can access the route.

Introducing Organizations - GitHub

Today we're introducing Organizations. Organizations simplify management of group-owned repositories (for example: your company's code), expand on our permissions system, and help focus your GitHub workflow for business and large open source projects.

githubに会社や大規模オープンソースプロジェクト用のOrganizations機能が入ったそうです。

今までは個人が他人をコラボレーターに追加するしかなかったので大きな会社では使い辛かったかもしれません。Organizations機能でグループ共通のダッシュボードや支払いやユーザー管理も一元化出来るそうです。もう会社でGithub使う準備が出来たって感じですね。

Wifi

$ dmesg | grep Wireless
[ 6.520647] ipw2200: Intel(R) PRO/Wireless 2200/2915 Network Driver, 1.2.2kmprq
[ 6.665137] ipw2200: Detected Intel PRO/Wireless 2915ABG Network Connection

ipw2200ってヤツだそうです。sid main contrib non-freeで下記。

% sudo aptitude install firmware-ipw2x00