2010-12-01
■ [ruby][rails] Hamlを越えるシンプルさを実現したテンプレートエンジン、Slim
今日から始まるRuby Advent Calendar jp: 2010参加記事です。
Rails界隈ではHTML(ERB)よりシンプルなテンプレートエンジンとしてHamlが人気ですが、SlimはHamlからさらに記号を減らしたようなテンプレートエンジンです。
! doctype html
html
head
title Hello Slim
body
h1 Hello, Slim!
div id="main"
| これはSlimのサンプルです。
| シンプルでしょう?
p.note
| Hamlのように「#」や「.」を使うこともできます。
Rails 3で使う場合、
gem 'slim', :require => 'slim/rails'
と書くだけでOKです。簡単ですね。
久しぶりに公式サイトを見たら、logic-less modeという謎機能が追加されてたりして、活発に開発が進んでいるようです。
■ [ruby] YARV(Ruby 1.9)の中間言語の命令一覧サイトを作りました
命令一覧サイトって何だっていう話ですが、見れば分かると思います。
insns.defをもうちょっと見やすくできるといいなーと思って作業していたらこんなことに…。全てのバイトコード好きに捧ぐ!*1
目的はいくつかありますが:
- 自分の勉強のため
- Ruby本体の開発者を増えるといいですね
- 言語処理系の開発に興味がある人に
- 全ての中間命令にpermalinkを用意する
とか?
実際に中間言語へのコンパイルを試してみる機能とかもあるのでぜひ遊んでみてください。*2
解説はinsns.defから取ってきたそのままなのでかなり簡潔ですが、日本語ならるびまの記事がとてもまとまっているのでおすすめです。(英語は…)
ところで最適化用命令の一覧(つまり、Rubyプログラムを動かすのに最低限必要な命令の一覧)が欲しいんですが、opt_が付いているのがそうだと思えばいいんでしょうか。
実装について
Heroku + Sinatra + Slimという感じです。個人的に、複雑なフォームがあるものはRails使った方が楽だと思ってるんですがこれくらいなら全然大丈夫でした。
Slimは本当に素晴らしいです。Shiftキーを押す回数(%, <, >, ..)が少ないところとか。 試行錯誤がすごい速さでできるので、もう生HTMLには戻れないかも…。
2010-12-03
■ [reposh] Reposh 0.1.10をリリースしました
今年、僕以外にも少なくとも1人のユーザがいることが分かったreposhを更新しました。
ruby_promptという設定項目が使えるようになり、プロンプトにgitのブランチとか出せるようになりました。
% reposh loaded config file: /Users/yhara/.reposh.yaml Welcome to reposh 0.1.10 (mode: git) master>
.reposh.yamlにこんな感じに書きます。YAMLにRubyスクリプト書くのすごい難しかったのでいい加減YAML捨てたいです*1。これが若さ故の過ちというものか…
system:
git:
ruby_prompt: '"#{`git branch`[/\* (.+)/, 1]}> "'
*1 Ruby DSLにしたい
■ [rails] yarvinstructions.heroku.comをRails3に移植しました
先日公開した http://yarvinstructions.heroku.com/ に対し「コメント欄とかあるといいかも」というご意見をいただいたので、コメント欄→DBとかフォームとか→そろそろRailsか、という思考で SinatraからRails3に移植してみました。
移植は1時間弱でできたのでわりと簡単でした。
SinatraとRails
Sinatraはわりとトップレベルになんでも置く感じになりがちで、それ故に開発速度が速かったです。Railsだと同じメソッドでもコントローラに定義するか、ヘルパーに定義するか、ApplicationHelperに定義するか…みたいな選択肢があって、そこでちょっと悩むという。逆に言うと、Railsに移植してより綺麗なコードになった気がします (Sinatraでも、規模が大きくなったらクラス定義してその中に書いていくModularスタイルを選んだ方が良いと思います)。
僕はわりと設計上のどっちでもいいことで悩みがちなので、Sinatraでとりあえず動くものを作ってからRailsに移植するのはいいのかも知れない。
コメント欄の例:
移植中にDisqus使えばいいじゃんということに気づいたので、実はDBもフォームも要らなかったという…。
■ [rails] SlimのTipsとか
SlimはHTMLをこんな風に書けるテンプレートエンジンで、Railsでもちゃんと動きました。
- 「|」内の大なりとか小なりとかはエスケープされない。自分で<とか書く必要がある
- 行末に半角スペースを入れたいときは「| foo 」みたいに末尾にスペースを入れるんだけど、それだとエディタ上で分かりにくいので、「|」の代わりに「' foo」と書くと末尾にスペースが入る。
- コメントは「/」から始めるが、もちろんC++風に「//」でもいい。「//」はcommentout.vimで簡単に入れられるのでもっぱらこっちを使っている。
- Slimに惹かれるなら、CSSもSlimっぽく書きたくなると思う。そんなときはSassを使えばOK。
- 「javascript:」でJSタグを書ける。「markdown:」でMarkdownマークアップの文書を書ける(要gem install rdiscount)。サイトの特定ページだけ長文を書きたいときに便利。
- Sinatraの時期リリースはデフォルトでSlimがサポートされる(!)。
こんなところかな?
最後に:
- Slimにはいろんな便利記法があるけど、あまり使いすぎると暗号になるから注意。最初は基本的な記法だけ覚えるのが楽でいいと思う。
2010-12-09
■ [ruby] Heroku買収
- http://www.itmedia.co.jp/enterprise/articles/1012/09/news018.html
- http://blog.heroku.com/archives/2010/12/8/the_next_level/
なんと!
"買収完了後もHerokuは独立サービスとして運営し、従来の顧客へのサービスに変更はないとしている。" とのことなので、心配はないかな。
2010-12-16
■ [javascript] JavaScriptでメソッド名にnewを使うのはOKなのか?
var foo = new Foo();
的なことを
var foo = Foo.new();
のように書くとRubyっぽいなと思ったのだが。
■ [javascript] node.jsのinspectには階層を指定するオプションがある
node.jsのsys.inspectは、デフォルトでは深いところの配列とかが[Object object]になってしまってinspectできない。
こういうときは、
require('sys').inspect(obj, false, null)
のようにすると無制限にinspectするようになる(Rubyのように)。
逆に深いところのオブジェクトを見なくて済むことが役に立つ機会もありそう (twitter apiのjsonのinspectとか)。
2010-12-24
■ [rails] Railsアプリの携帯・iPhone対応についてWEB+DB PRESSに書きました
昨日発売のWEB+DB PRESS Vol.60に、jpmobileの記事を書きました。Ruby連載の第4回です。
Rails3で携帯電話・iPhone/Androidに対応したサイトを作りつつ、絵文字や位置情報の扱いについて解説するという感じです。
4774144606
雑誌掲載版のサンプルコードはこちらです。
これを拡張したものが http://chizumemo1.heroku.com/ で動いています。携帯やiPhone/Androidで見ると別デザインになります。主な変更点はdeviseを使うようにしたことで、編集・削除はログイン時のみ可能です。
これで分かったんですが、なんかauの一部機種にSJISのフォームなのにUTF-8でPOSTしてくる奴があるらしくて、その場合はjpmobileで絵文字がうまく変換できなくなります。あとで調べてパッチ送らないと…
絵文字
絵文字はキャリア各社でセットが違いますが、jpmobileがそれなりに相互変換してくれます。
PCでは絵文字は表示できないので*1、今回はTypeCastの絵文字画像に変換することにしました。*2
こちらのアイコン画像を使うといいよというのはこの本からの情報です。Rails 2.xの本ですが、携帯でのメールの扱いなどすごく濃いところまで載っています。
4797358785
位置情報
GPSや基地局の情報から、現在地の緯度経度を取る方法です。携帯とiPhone/Androidで取り方が違います。
原稿に書ききれなかったこと:
- Android 2.xはGeolocation APIが使えるのでiPhoneと同じで良いですが、Android 1.6はGears経由で取得することになります。
- というコードがこちら。https://github.com/yhara/chizu_memo/blob/master/app/views/memos/new_smart_phone.html.erb
- navigator.geolocationがあるかないかで分岐しています。gearsはレイアウトの方で読み込んでいます。
- 紙面ではgetCurrentPositionでやっていますが、上のコードのようにwatchPositionを使うと精度が良かったりするみたいです。
iPhone専用画面
紙面ではiWebKitというライブラリを使って、HTML+CSSでiPhone風な画面を作っています。 同様のライブラリにiUIやjQTouchがありますが、iWebKitは比較的シンプルなので動作が把握しやすいと思います。
jQueryを使うつもりなら、まだα版ですがjQuery Mobileが期待大です。
あとiPhone/iPod touchでは、特定のタグを入れることで「ホーム画面に追加」したときのアイコンとか起動画面を設定できるんですが、さすがに書ききれませんでした。
というわけで
書店で見かけたら手にとってみてください。今回は10周年記念号ということで、他の記事も気合いが入っているようです。
- プログラマが知るべき言語設計の基礎知識
- jQuery実践入門
- 本番プロジェクト 運営ノウハウ大公開
- これからの10年,どうサバイブするか
「圏外からのWeb未来観測」のゲストはWinny作者の金子さんです。47氏というハンドルネームで書き込んでいたのは実は金子さんだけではない、という話がちょっと面白かった。
4774144606
2010-12-25
■ [biwascheme] BiwaScheme 0.5.5.1をリリースしました
前リリースからの変更点:
- R6RS 構造体(Records)を実装しました。苦労話はそのうち…(functionが4重にネストしたコードはこちら: record.js)
- 公式サイトのデモが、BiwaSchemeコントリビュータのjcubicさんのJQuery Terminal Emulatorを使うようになりました。
- iPhone/iPad用画面ができました→http://www.biwascheme.org/i.html
- 公式サイトからzickさんのホッケーゲームへのリンクを張りました。
このリリースは「大人になったからそろそろプレゼントする側にならないとな」という気持ちの提供でお送りしました。
今後やりたいこと
- Node.JS対応
- JQueryへの移行
- R6RS 例外(condition)
- R6RS ライブラリ
- dynamic-wind
□ トオルスガルモノノ [Heroku | No such app ってでてつながりませぬ。]
□ yhara [URLが間違ってました。ありがとうございます。]