おもしろwebサービス開発日記

Ruby や Rails を中心に、web技術について書いています

はてなダイアリーでkwout

はてなダイアリーで、kwoutで使われるmapタグが利用できるようになったらしいのでテスト。

[http://d.hatena.ne.jp/hatenadiary/20080410/1207821427:title=Webページを画像化して引用できる「kwout」の貼り付けに対応しました - はてなダイアリー日記]

追記

あれ?mapタグ効いてなくない?

うーん

mapタグがエスケープされなくなっただけに見えるなあ

javascriptの初歩

javascriptはまだまだ素人同然ですが、とりあえず今日勉強したことを書いときます。

javascriptでページを開くには

別ウィンドウで、あるページを開くときはwindowオブジェクトのopen()メソッドを使う。

window.open("http://level20.jp/);

同じウィンドウで開くときはlocationプロパティを使う

location = "http://level20.jp/";

こんな方法もある。でもこれは履歴に残らない

location.replace("http://level20.jp/")

ページのurlが格納されているところ

  • location.href
  • document.location
  • document.URL

基本的にはどれも同じだが、リダイレクトされた時に異なる値を持つ。

window.location.href
最初にロードしたURLが格納される
document.locationとdocument.URL
実際にロードしたURLが格納される

location.hrefとdocument.locationは混同しやすいので、document.URLを使うのが推奨されているらしい。

その他

firebugのコンソールにちょこちょこっと書いてすぐ実行できるのが楽しい!
早くjavascriptの勉強に本格的に取り組みたいなー

rails de REST

railsでRESTを実現するための方法についてまとめ。

RESTとは

  • Representational State Transferの略
  • URI(名詞)とmethod(動詞)で振る舞いを決める

RESTにするメリット

  • 変わりにくいURI「Cool URI」が実現でき、ユーザビリティがあがる
  • インタフェース構築手法が統一されるため、作るのが楽になる

railsでRESTするには

ここからが本題。RAILS_ROOT/config/routes.rb内に下記のような文を追記する

map.resources :articles

そうすると、下記のようなRESTなルーティングが自動的に生成される。*1らくちん。

メソッド URLのパス アクション ヘルパー "index")と同じ。">*2
GET /articles index articles_url
POST /articles create articles_url
GET /articles/new new new_article_url
GET /articles/1 show article_url(:id => 1)
PUT /articles/1 update article_url(:id => 1)
GET /articles/1/edit edit edit_article_url(:id => 1)
DELETE /articles/1 destroy article_url(:id => 1)

単数系と複数

controller名の単数形複数形、map.resourceの単数形複数形で振る舞いがいろいろ変わってくる。なのでcontrollerを作るときは単数系と複数形をきちんと意識した方がいいみたい。少なくともRESTを使うcontrollerの名前は複数形したほうがいい。もしかしたらcontrollerの名前は全部複数形に統一したほうがいいのかもしれない。*3


以下どのように変わるかのメモ。

map.resources :article

controller名を単数形にすると、indexアクションのヘルパーが変化する。controller名が全部単数形になる。他は同じ

メソッド URLのパス アクション ヘルパー
GET /article index article_index_url
POST /article create article_index_url
GET /article/new new new_article_url
GET /article/1 show article_url(:id => 1)
PUT /article/1 update article_url(:id => 1)
GET /article/1/edit edit edit_article_url(:id => 1)
DELETE /article/1 destroy article_url(:id => 1)
map.resource :article

resourcesの方を単数形にすると、idを取り扱わないアクションとしてルーティングが作られる。

メソッド URLのパス アクション ヘルパー
POST /article create article_url
GET /article/new new new_article_url
GET /article/edit edit edit_article_url
GET /article show article_url
PUT /article update article_url
DELETE /article destroy article_url

この時、パスは単数形(article)でもルーティング先のcontrollerの名前は複数形(articles)になる*4

map.resoucesの拡張

map.resoucesでルーティング定義したcontrollerに、newとかupdateとかデフォルトで定義された以外のアクションのルーティングを定義する場合。

/article/1/recentのように、各IDごとに作用するアクションのルーティングを定義する場合

map.resources :articles, :member => { :release => :put }

/article/releaseみたいな場合

map.resources :articles, :collection => { :recent => :get }

/articles/new/shortformのように、既存のアクションnewアクションに上乗せしたルーティングを定義する場合

map.resources :articles, :new => { :shortform => :post }
修正
2008/06/12
memberとcollectionが逆なのを修正、newオプションの説明を修正

map.resouces以外でRESTしたい場合

map.resourcesを使わないでRESTを実現したい(editとかupdateとかのアクション名が嫌いとか)
人は以下のようにしてひとつづつルートを設定する必要がある。面倒。

map.connect 'articles/:id',
  :conditions => { :method => :put },
  :action => 'updatedayo'

参考資料

RailsによるアジャイルWebアプリケーション開発 第2版

RailsによるアジャイルWebアプリケーション開発 第2版

WEB+DB PRESS Vol.38

WEB+DB PRESS Vol.38

*1:あとformatの分もあるけどそれは省略

*2:名前付きルートのこと。articles_urlはurl_for(:controller => "articles", :action => "index")と同じ。

*3:でもcontrollerによっては複数形がそぐわない場合もあるので、そういう時だけ単数形がベストかな?

*4:だからやっぱりcontrollerの名前は複数形がいい

mac de office

mac使いになって約半年。これまでoffice系のソフトは入れずに、previewの閲覧だけでなんとかしてましたがそろそろ本格的に
officeを使う手段が必要になってきました。で、どうやってmac de officeしようかともやもや考えています。


以下もやもやログ。

mac版のoffice使う

これが一番簡単な解決策。ファミリー版なら約2万ちょい。
不安材料としては、最新のoffice2008の評判が悪いこと。レビューを見たところ

  • 不安定
  • excelでマクロが使えない

というような書き込みがあり、踏み込めない。

Office 2008 for Mac ファミリー&アカデミック

Office 2008 for Mac ファミリー&アカデミック

iworkの互換機能

keynoteとか使ってみたいなーというのがあり選択肢の一つにしてみた。価格は約1万。officeより安い。
でも体験版を試してみた時にexcelの表示が少し崩れたので、本気でofficeを使いたいなら対象外かな。

iWork '08 ファミリーパック

iWork '08 ファミリーパック

openoffice

windows時代はこれ使ってた。価格は0円。一番安価な解決策。
でもmacopenofficeはα版で不安定なよう。

Please make sure that you backup any documents used in OpenOffice.org Aqua. Time Machine is a backup system built into Leopard that you can use.

porting: OpenOffice.org for Mac OS X : Download Aqua

こんなの書かれてたら入れる気なくすよ。

windows環境を入れる

macでのoffice環境を調べている際に、互換性の問題は何を使うにしろ残るなと感じたのでwindows環境を導入することも選択肢に。
エミュレータソフト価格は1万前後(parallels or vmware)+windowsの料金2万強+officeの料金4万
互換性の問題を考えなくていいのと、ついでにIEでのレンダリングチェックもできるのがメリット。だけど高いし面倒。

Vmware Fusion 日本版 アクト・ツー版

Vmware Fusion 日本版 アクト・ツー版

Parallels Desktop 3.0 for Mac

Parallels Desktop 3.0 for Mac

Microsoft Windows XP Home Edition Service Pack 2 通常版

Microsoft Windows XP Home Edition Service Pack 2 通常版

Microsoft Office 2007 Standard

Microsoft Office 2007 Standard

まとめ

  • 価格
  • 手間
  • 安定性

などを総合的に考えると、今のところmac版officeが一番な気がしています。これ以外に誰かいいアイデアがあったら教えてください。

ウェブ時代5つの定理

発売日直後に買ったものの読むためのまとまった時間がとれず今日まできてしまいましたが、ようやく「ウェブ時代5つの定理」を読みきりました。

ウェブ時代 5つの定理―この言葉が未来を切り開く!

ウェブ時代 5つの定理―この言葉が未来を切り開く!

感想

この本を通じてオプティミズムのシャワーを浴びたような気がしました。日本にいると、基本的にネガティブだったりシニカルだったりする言葉ばかりが耳についてしまい、気持ちが萎縮してしまい守りに入ってしまいがちになります。梅田さんのセレクトした「金言」及びその解説は、「守りの姿勢なんていらないぜ!」と言っているよう。僕は割合神経質な性質なので、物事の悪い面を見つけるのは得意なのですが、これからはなるべく物事のいい面を見つけて、オプティミズムなシャワーを出せるような存在になってゆきたいですね。定期的に読み直して、自分の方向性を見失わないようにしたいと思います。

インクリメンタル検索中のバックスペース

通常、C-hは以下のようにしてバックスペースにしてます。

(define-key global-map "\C-h" 'delete-backward-char)

C-sのインクリメンタル検索中、検索文字列の入力を間違えたときに修正したいなーと思いC-hとすると、検索モードから抜けてバックスペースしてしまいます。それでずっと「インクリメンタル検索使えない!」と思っていたのですが、下記の一行を付け足したら解決。すごく快適になりました。

(define-key isearch-mode-map "\C-h" 'isearch-delete-char)

subversionをざっくり勉強してみた

subversionの知識が中途半端なのでsvnbook日本語訳のPDF版を作成してみましたをざっくりと1章〜3章まで読んでみた。
3章までで力つきたので、4章以降はまた後日。

勉強になったところのまとめ

import

import a b としたときに、aのディレクトリはそのまま作業コピーとして使える?

  • >使えない。svn checkoutが必要。
リビジョンキーワード
  • HEAD -> リポジトリ内の再審理ビジョン
  • BASE -> 作業コピーのリビジョン
  • COMMITTED -> 変更された最後のリビジョン
  • PREV -> COMMITEDの一つ前のリビジョン

BASEとCOMMITTEDってリビジョン番号は違っても、中身は一緒だよね?あえて二つに分ける必要ってあるんだろうか?

リビジョン日付
  • リビジョン番号の代わりに{"2008-03-28 15:00"}みたいに時間が指定できる。
  • {"2008-03-28"}のように日付だけ指定すると、28日の0時以前を指定したことになるため28日のリビジョンは含まれないので注意。
check out

svn checkout http://hoge.net/repos/svn/trunk hoge
の様にすると、hogeディレクトリに作業コピーを作る。
hogeを付けないと、trunkディレクトリに作業コピーを作る

update
R
Replaced 同じ名前だけど別のファイル
G
merGed マージ。なんでMじゃないんだろう。

Conflictがおこったら、以下の三つのファイルが作成される

filename.mine
update前の作業コピー中のファイル
filename.rOLDREV
update前のBASEリビジョンにあったファイルの内容
filename.rNEWREV
HEADリビジョンの内容

svn resolved filenameで三つのファイルは消える。commitできるようになる。

diff

svn diff > patchfile
みたいにファイルにリダイレクトするとパッチが作れる

cat

svn cat -r1 hoge.txt
でリビジョン1のhoge.txtの内容が見れる

list

svn list http://hogehoge.net/repos/svn
リポジトリのディレクトリ構成を表示

cleanup

Lが表示されたらsvn cleanupで解決