トップ 最新 追記

2012-10-06 [長年日記]

_ MacでFuse使う方法が変わってた

以前

秘密鍵を本体内からUSBメモリに移動した - あーありがち(2011-06-01)

で OSX 10.5 / 10.6 で macfuse を使って ext partition を mount してたんだけど、10.7 になってこの技が使えなくなってしまった。調べたら

Home - FUSE for OS X

という別なプロジェクトが始まっていて、こっちの方が 32bit / 64bit とか考えずに使えるものでしかも 10.5 でも使えることが発覚。

……。

前回の段階でこっち使った方がよかったなぁ。まぁ使うアプリが違うだけでノウハウは完全に同じなんだけど。

インストーラによれば MacFUSE 用に開発された driver も wrap して完全互換で動くらしいし、すでに MacFUSE が入っていたらそれをアンインストールもしてくれるらしい。

というわけで OSXFUSE サイコー。

Tags: OSX Linux

2012-10-07 [長年日記]

_ OpenSSH新機能ヒストリ(6.1〜5.1)

Software Design 10月号の『SSH力をつけよう!』で火がついたのでカッとなってコピペした。

以前

OpenSSH にできること(の一部)ヒストリ - あーありがち(2008-04-08)

ってのを書いてるんだけど、これの続編。例によって全面的に OpenSSH情報 頼みかつ、自分で分かる範囲しかピックアップできてないので漏れまくりかつ間違っている可能性があります!!1

個人的なヒットは

  • 5.4 の netcat mode
  • 5.6 の ControlPersist
  • 5.7 の scp -3
  • 5.9 の ssh_config内でのtty要求, sshd の chroot 対応強化
  • 6.0 の port forward キャンセル

辺りですかね。

netcat modeとControlPersistの個人的まとめ

netcat mode は

ssh -o ProxyCommand='ssh user@dest_host -W %h:%p' gateway_host

こんな感じで使う。これと ControlMaster と scp -3 を組み合わせると割と面倒なネットワークでもそこそこ手軽に作業できそう。

試したところ ControlPersist と netcat mode は両立できないっぽい。netcat mode を使いたい中継 host は限られると思うので、その host でだけ ControlPersist no すればいいのかも。以下のような感じかな。

Host Foo
  ControlPersist no

Host *
  ControlPersist 10

ControlPersist は 全部 pubkey で認証してて ssh agent 使ってれば手間的には要らないっちゃ要らないのでそこまで気にする必要ないかもだけど。(もちろん TCP connection的 には違う)

ProxyCommand も、もちろんいちいち打つのは面倒なので、gateway として使うときの Host と普通にログインするときの Host を分けて設定しておくといいのかも。まとめると以下のような感じか。

Host A-SS
  Hostname foo.example.com
  ProxyCommand ssh user@dest_host -W %h:%p
  ControlPersist no
Host A
  Hostname foo.example.com

Host *
  ControlPersist 10

6.1

  • sandbox有効なsshdをデフォルトに
  • Match で LocalAddress, LocalPort サポート
  • Match で AcceptEnv, Allow Users, Deny Group などをサポート
  • PermitOpen none サポート
  • AuthorizedPrincipalsFile none サポート
  • sshd_config の VersionAddendum でプロトコルバナーに任意の文字列を追加可能

6.0

  • ssh-add -k オプション追加
  • sshd が PermitOpen で * ワイルドカードサポート
  • 多重化された接続での転送のキャンセルをサポート
  • コマンドライン ~C で転送のキャンセルをサポート(多重化されている場合は記法が異なる)

port forward のキャンセルができるのは面白い。

5.9

  • UsePrivilegeSeparation=sandboxモード追加
  • chroot 内の /dev/log が不要に
  • AuthorizedKeysFile は空白区切りの複数パスをサポート
  • ControlPath オプションは %L を接続先ホスト名(の、host portion というのはドメインを除くという意味かな)に展開する
  • ssh_config の Host で否定マッチをサポート
  • ssh_config の RequestTTY で -t/-tt/-T コマンドラインオプションのような tty 要求をサポート
  • ssh-keygen -A オプション追加
  • ssh-add が標準入力をサポート

より chroot-friendly なところと tty 要求が config に書けるのがよさげ。

5.8

bug fix のみ

5.7

  • サポート暗号モードの追加とパフォーマンス強化
  • sftp でのハードリンクサポート
  • sep -3 で remote -> local -> remote コピーをサポート。remote -> remote が直接接続できない場合に有効。
  • sftp クライアントの高速化
  • KexAlgorithms サポート
  • scp での帯域制限コードを sftp にも

scp -3 は遅そうだなというのが最初の感想だけど、ネットワークのポリシーで直通をサポートできないのは方向を含めると意外にありそうなので、便利に使えそうな気もする。

5.6

  • ControlPersist 追加。controlmaster をバックグラウンドに回してくれる機能。
  • sshd および ssh-keygen でのCA鍵のサポート
  • ssh_config 中の Hostname 項目での %h の展開サポート
  • ssh-keygen の import, export 機能でサポートする鍵の追加
  • 認証時の permission チェックの結果を認証成功後に受け取るように
  • 動的な remote forward
  • AuthorizedPrincipalsFile サポート
  • Match ブロック中の AuthorizedKeysFile, AuthorizedPrincipalsFile HostbasedUsesNameFromPacketOnly, PermitTunnel サポート

個人的なポイントは ControlPersist. 詳しくは以下のエントリが参考になります。

OpenSSHのセッションを束ねるControlMasterの使いにくい部分はControlPersistで解決できる - Dマイナー志向

動的な remote forward もたぶんすごいんだろうけど、イマイチよく分かってません。permission チェックのメッセージを成功後にするというのは地味な改善だけどそう言われればそうかという感じ。

5.5

bug fix のみ

5.4

  • ssh protocol 1 をデフォルト無効に
  • (X.509)ではない最小限の証明書フォーマットサポート
  • -W で netcat mode サポート。これまで踏み台で nc を動かしていたようなケースで、手元の ssh が 5.4 以上になれば ssh だけで同様のことが可能に
  • ssh および sshd にて任意の鍵を無効にする機能を追加
  • sftp-server に read-only mode 追加
  • sftp client の各種強化および -P オプションの変更

5.4 の目玉はやはり netcat mode でしょうね。以下が参考になります。

OpenSSH のNetcat modeを使う - TIM Labs

5.3

bug fix のみ

5.2

  • -y オプションで syslog へ
  • sshd_config の ForceCommand が internal-sftp のために引数を取れるようになった
  • -D で SOCKS4A サポート
  • port 0 での remote forward
  • Match ブロックで PermitEmptyPasswords と AllowAgentForwarding サポート

5.1

  • Match address の アドレス/マスク長の指定においてクラシックな * ワイルドカードへのフォールバック付きでサポート
  • sftp が df コマンドサポート
  • MaxSessions サポート。単一TCP接続上のセッション数を 1 や 0 も含めて任意に設定可能。
  • ssh-keyscan が rsa2 をデフォルトに
  • AllowAgentForaward 追加
  • Match ブロック内で MaxAuthTries が設定可能に
Tags: Security

2012-10-13 [長年日記]

_ 開発用Rails serverをthinからWEBrickに戻した

thinの速さを確認しようとしてOSX 10.7のぶっ壊れたabに苦労したにも関わらず、thinの利用をやめた。理由は

なんかよく分からないけど一部の画像が来ないとかCSSが来ないとか、ちょこちょこ変な見栄えになるから。

HTMLは来るのでサーバサイドの確認には十分なんだけど、見栄えを含むデキの確認にはちょっと安心して使えない。development環境を共有してフロントの人と共同作業するときにお互いにドキッとするので、多少のスピードは我慢して安心を優先した。

何か設定などがあるなら教えてもらえると嬉しいです。

Tags: Ruby Rails

2012-10-17 [長年日記]

_ Rails邪道resource定義

背景

Rails 3 デビューのくせに初版のアジャレイルズ本で勉強した過去があったり、いびつな知識を持っていたので

  • routing は昔懐かしい書き方が頭に残っている
  • URI の path が複数系なのがなんかキモイ

という二つのわがままから、単数形の URI を作りたかった。ので、実際にやってみた。

※ 先に結論だけ言うと Rails 使っといて Rail Way からわざわざ外れようとするのはあんまり嬉しくないです。でもやっぱ URI は RESTful とは違う視点でもこだわりたいじゃないですか。

resourcesの基礎

  • routing で resource を定義する helper があり、用意されているメソッドは resource, resources
  • resource(単数形)は一つのresource用? 用途を思いつかなかったので resources(複数形) を試す

とりあえず scaffold user

改めて例は user で、こんな感じに scaffold してみる。

rails g scaffold user nick:string, name:string

このとき migration はこんな感じ。

db/migrate/xxx_create_users.rb
class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :nick
      t.string :name
      t.timestamps
    end
  end
end

routing は

config/routes.rb
resources :users

うん、シンプルそのもの。Model は

app/models/user.rb
class User < ActiveRecord::Base
  attr_accessible :nick, :name
end

Controller は例の感じで CRUD を生成する。

app/controllers/users_controller.rb
class UsersController < ApplicationController
  def index
     ...
  end

  def show
      ...
  end

  ...
end

このときrake routes は以下のようになる。

    users GET    /users(.:format)          users#index
          POST   /users(.:format)          users#create
 new_user GET    /users/new(.:format)      users#new
edit_user GET    /users/:id/edit(.:format) users#edit
     user GET    /users/:id(.:format)      users#show
          PUT    /users/:id(.:format)      users#update
          DELETE /users/:id(.:format)      users#destroy

この routing がどう変わるかが大事。

「resources 単数形」に書き換える

config/routes.rb
resources :user

すると当然 Controller のファイル名と class名に影響が出る。

app/controllers/user_controller.rb
class UserController < ApplicationController
  ...
end

この段階で rake routes すると

user_index GET    /user(.:format)          user#index
           POST   /user(.:format)          user#create
  new_user GET    /user/new(.:format)      user#new
 edit_user GET    /user/:id/edit(.:format) user#edit
      user GET    /user/:id(.:format)      user#show
           PUT    /user/:id(.:format)      user#update
           DELETE /user/:id(.:format)      user#destroy

users がなくなって user_index になっていることが分かる。このままでは先ほど scaffold したコードは動かない。そこで対処方法は2つ。

  1. users_path を使っている部分を全部 user_index_path に書き換える。具体的には link_to と form_for と redirect_to の中。
  2. resources :user, :as => 'users' で users にマップし直す

2 の方が圧倒的に楽だし、scaffold の form_for は create も update も action が同じになっていないと動かないので 2 にすべき。するとこのときの routes はこんな感じ。

    users GET    /user(.:format)          user#index
          POST   /user(.:format)          user#create
 new_user GET    /user/new(.:format)      user#new
edit_user GET    /user/:id/edit(.:format) user#edit
     user GET    /user/:id(.:format)      user#show
          PUT    /user/:id(.:format)      user#update
          DELETE /user/:id(.:format)      user#destroy

これで URI を単数形にしつつ scaffold の動作を維持できた。

id以外でshowしたい

Rails の resources は id を中心にしており、この id は DB の key になっている。

しかしどうだろう。あるサービスで自分のアカウントの情報が例えば

/users/123456

みたいな URI だったら。

ちょっとガッカリだよね。そこでこれを強引に変更してみる。

get '/user/:nick' => 'user#show', :as => 'user'
resources :user,                  :as => 'users'

これで URI を作る際の user_path というメソッドを上書きできる。これは routing は先に書いたものが優先されることを利用している。

Rails routes are matched in the order they are specified, so if you have a resources :photos above a get 'photos/poll' the show action’s route for the resources line will be matched before the get line. To fix this, move the get line above the resources line so that it is matched first.

Ruby on Rails Guides: Rails Routing from the Outside In

ただし、このままでは全体的にはやはり :id を前提にして動く。したがってもう少しいじらないといけない。

Controller で

@user = User.find(params[:nick])

してた部分はこうなる。

@user = User.where(:nick => params[:nick]).first

あるいは

@user = User.find_by_nick(params[:nick])

ただしこれらの方法は find + id での検索と違って見つからなくても例外が起きないため、このあとに

if @user
  ...
else
  render 'public/404.html', :status => 404
end

みたいにしてちゃんと 404 を返すようにしないといけない。

url_forで省略が効かなくなる

また URI 生成の部分で

link_to 'foo', @user
redirect_to @user

になっているところはそれぞれ

link_to 'foo', user_path(:nick => @user.nick)
redirect_to user_path(:nick => @user.nick)

と書き換える必要がある。これは前者の書き方が最終的に url_for(@user) を呼んでいて、url_for は

rails の named route で Symbol を使うことの利点と欠点 - QA@IT

で moro さんが書いているようにとっても便利にいい具合に仕事をしてくれるんだけど、残念ながら :id を前提にして動くため。

ちなみに

url_for(:nick => @user.nick)

とやってしまうと query string になって美しくない。これを避けるには controller から指定する必要があり、それだったら user_path(:nick => @user.nick) の方が短い。

showだけじゃダメ

new も対応していないので routing は最終的にこうなる。

 get '/user/new'   => 'user#new',  :as => 'new_user'
 get '/user/:nick' => 'user#show', :as => 'user'
 resources :user,                  :as => 'users'

このとき new が上になっていないとせっかく定義しても全部 /user/:nick に「食われてしまう」ので、new の定義の方が上になっていないといけない。

※ 逆にこのままでは :nick には new を使えない。結局 namespace のことを考えてないので、まだ実用的ではない。

まとめ

以上、

  • resource の scaffold の動作を満たしたまま
  • 単数形の Controllerに変更し
  • :id 以外のカラムを利用

する目的の動作にたどりついた。

とは言え、やっぱこれは邪道なんでしょうねぇ…。

なんか他にいい方法あったら教えてください。

Tags: Ruby Rails

2012-10-20 [長年日記]

_ UX Kanazawa Vol.4 に参加してきた

UX Kanazawa Vol.4 「プロトタイピングから始めよう」 長谷川恭久さん ― UX Kanazawa

  • ペーパープロトタイピングをとても楽しみにしていた
  • フタを開けたら全部まかなえるはずがないぜ、オレがいちばん得意だと思う「アイディアレベルの共有」を促進する方法として使うぜ
  • そのためにはプロトタイプも大事だけどシナリオが大事だぜ

ということで

ペーパープロトタイプを勉強しに行ったらなぜかシナリオを練っていた

ぜ。

確かに根っこの部分を押さえるためには、道具がペーパーに変わってるとは言えいきなり見た目の話をするのは本末転倒。なるほどな。

であれば、

実はシナリオのメリットとか、そういう話もあったよかったんじゃないかなぁという気がしないでもない。

  1. シナリオを練る段階の注意
  2. レビュー時の注意
  3. ペーパープロトタイプの注意

比重的には 2, 3 が多く、これは今回のテーマには合致しているとは思う。しかしアイディアの共有に有用で、そのためにシナリオ段階から始まるのであれば 1 の段階のレクチャーがもっとあってもよかったんじゃないかなーという気もした。

と言ってもこれだけの段階ですでに時間的には厳しかった。ワークショップはやっぱり時間設計が難しいねー。

ところでなぜか懇親会の一次会では巻き上げレバーのあるデジカメの話とかテストの話をしていた。(いつものことか)。二次会は小林幸子の話をしていた。三次会の終わり頃に「なんでデザイナはIllustratorこそデザインだと思っているのか」みたいな、実はこの日最も大切だったはずの話をちょっとした。この店、めちゃくちゃ安かった。

四次会は久しぶりにお茶漬け食った。

懇親会面白かったなー。(本番はどうした)

Tags: UX Study

2012-10-21 [長年日記]

_ Rails + Jasmine gem 1.2のsrc_filesの与え方

Rails + Jasmine gem 1.2 の環境を新しく作ったところ、なんか変だなと思うところがあったのでメモ。

Comedy is Hard - Jasmine 1.2 released

Jasmine は 1.2 から assets pipeline 環境の自動判別機能が入って、reporter のデザインも変わってなかなか格好よくなりました。

Jasmine gem 1.2でrails g jasmine:installしたときのjasmine.yml

src_files:
  - assets/application.js

って書いてある。なんかこれおかしくないですか。こんなパスは存在しない。

ということで試してみた。

assets環境Rails

OK assets/application.js
OK application.js
NG app/assets/javascripts/application.js
NG assets/javascripts/application.js
NG javascripts/application.js
NG blank

上記の NG はテストを実行して fail になる。

NG *.js
NG **/*.js

そもそもテストが実行されない。ということで個人的には

application.jsのみ

がいいように思う。

いずれにせよ assets 環境下では SprocketsHelper などの働きによって application.js を指定するだけで依存している js すべて読み込んでテスト可能になった。

非assets環境Rails

  • Rails 3.0.x + Jasmine 1.2 は従来通り public/**/*.js で ok
  • assets.enabled = false も従来通り

こっちは簡単ですね。

assets環境下で何が起きてるのか

こっから先はあの assets/application.js という気持ち悪い書き方の話。これは jasmine gem の中の

lib/jasmine/asset_pipeline_mapper.rb

の中で

 def files
   @src_files.map do |src_file|
   filename = src_file.gsub(/^assets\//, '').gsub(/\.js$/, '')
   @context.asset_paths.asset_for(filename, 'js').to_a.map { |p| @context.asset_path(p).gsub(/^\//, '') + "?body=true" }
   end.flatten.uniq
 end

でやってる、

   filename = src_file.gsub(/^assets\//, '').gsub(/\.js$/, '')

が理由。そのあとの

   @context.asset_paths.asset_for(filename, 'js') ...

で js の filename に該当する asset の情報を取得するんだけど、その前になぜか

gsub(/^assets\//, '')

が入っているから、

たまたま assets/application.js は application.js と解釈される

ようになっている。これたぶんなんか勘違いして jasmine.yml に assets/ って書いちゃって、無理矢理動くようにしちゃったんじゃないかなぁ…。まぁこのコードはもう取り除くの難しいけど、

せめてデフォルトは application.js に直してほしい

とは言え、この微妙な話題を英語で pull-req する自信はないなぁ…。


2012-10-27 [長年日記]

_ kanazawa.rb meetup #3に参加してきた

今回は先週の UX Kanazawa Vol.4 に出たいということで開催時期をずらしまして(前回は連休を避けるためにずらしてる)、最終の土曜日になりました。

今回は

プログラム一切なし。オールフリータイム

という形にしてみました。結果、

  • 自由にRailsでペアプロの様子をプロジェクタで流したり
  • 「Rubyで何してんの?」「こんなん」
  • 「こんなキモイ書き方できますよぉおぉ」
  • 「たのしいRubyどこまで進んだ?」「きゃっきゃっ」
  • 「……」(黙々とJavaScriptの勉強)
  • 「……」(黙々と邪悪スクリプトの開発)

みたいなことができた。個人的にはセミナー形式を続けるのはお互いに大変なので、こんな感じでもっと人がごちゃっとしながら時にダラダラ時にキリリッとした空気を継続できればいいんじゃないかと思っている。

けど、ちょっと参加者のテンションや人数が落ちてて、ここら辺はどうしたもんかなぁ、と思ったり。でもあんまりギュウギュウだと動きにくいし、ある程度は余裕あった方がいい。ただ、

もうちょっと参加者の成果や変化、成長が見えるといいかなぁ

という気はする。まぁもうちょっと様子見かな。最後に成果発表みたいな時間があってもいいのかもなぁ。

ま、とりあえずお祭りは終わりました。ここからが「自分たちの」コミュニティである kanazawa.rb の本番だと思います。

でも、次回はとりあえず忘年会です(あれ

次回の案は一つできてて、

全員LT(ぶっちゃけテーマはなんでもよい)

なんてのはどうかなと思ってる。他のコミュニティの人とか、別にRuby興味ない人とか、乱入なんでもアリで。どうだろう。