Hatena::ブログ(Diary)

garbagetown

 

2011/12/18

[] Twitter Bootstrap モジュール

Play! framework Advent Calendar 2011 jp #play_ja : ATND の 18 日目です。

playframework で Twitter Bootstrap を利用する手順を紹介します。

Twitter Bootstrap とは

f:id:garbagetown:20111218100657p:image

Twitter 社が 2011 年 8 月に発表 した、Web サービスのフロントエンドを作成するためのツールキットです。GitHub で公開されており、誰でも無料でダウンロードして使用することができます。

主な内容は LESS で書かれた CSS のセットで、グリッドレイアウトやかっこいいフォーム、角丸ボタンなど、Web サービスの画面を作成するために必要なひと通りのデザインが用意されています。

詳しくは以下の記事を参照してください。

twitterBootstrap モジュール

playframework には、この Twitter Bootstrap を 簡単に利用する twitterBootstrap モジュール があるのですが、どういうわけか GitHub にソースコードが公開されているのみで、playframework のリポジトリにモジュールがアップロードされていません。

このため、twitterBootstrap のドキュメント に記載されている内容をそのまま実行しても、モジュールのインストール時にエラーが発生します。

いろいろと試してみたところ、これを回避するためにはアプリケーションにモジュールを直接 git clone してしまえば良いようです。以下に手順を示します。

play アプリケーションの作成

まずは sample という名前で play アプリケーションを作成します。途中でアプリケーション名を訊ねられるので、デフォルトで良い場合はそのまま Enter を叩きます。

/Users/garbagetown/temp% play new sample
~        _            _ 
~  _ __ | | __ _ _  _| |
~ | '_ \| |/ _' | || |_|
~ |  __/|_|\____|\__ (_)
~ |_|            |__/   
~
~ play! 1.2.4, http://www.playframework.org
~
~ The new application will be created in /Users/garbagetown/temp/sample
~ What is the application name? [sample] 
~
~ OK, the application is created.
~ Start it with : play run sample
~ Have fun!
~
less モジュールの設定と取り込み

Twitter Bootstrap は LESS で書かれているので、作成した sample アプリケーションで less モジュール を利用するよう設定します。

/Users/garbagetown/temp% cd sample/
/Users/garbagetown/temp/sample% vi conf/dependencies.yml 
# Application dependencies

require:
    - play
    - play -> less 0.3

続いて、play dependencies コマンドを利用して less モジュールを取り込みます。

/Users/garbagetown/temp/sample% play dependencies
~        _            _ 
~  _ __ | | __ _ _  _| |
~ | '_ \| |/ _' | || |_|
~ |  __/|_|\____|\__ (_)
~ |_|            |__/   
~
~ play! 1.2.4, http://www.playframework.org
~
~ Resolving dependencies using /Users/garbagetown/temp/sample/conf/dependencies.yml,
~
~ 	play->less 0.3 (from playContributedModules)
~
~ Installing resolved dependencies,
~
~ 	modules/less-0.3
~
~ Done!
~

これで sample アプリケーションで LESS が利用できるようになりました。

twitterBootstrap モジュールの clone と設定

いよいよ twitterBootstrap モジュールを取り込みます。sample アプリケーションの modules ディレクトリ配下に twitterBootstrap プロジェクトを clone します。

/Users/garbagetown/temp/sample% git clone https://github.com/sclasen/twitterBootstrap.git modules/twitterBootstrap
Cloning into conf/twitterBootstrap...
remote: Counting objects: 113, done.
remote: Compressing objects: 100% (71/71), done.
remote: Total 113 (delta 31), reused 105 (delta 23)
Receiving objects: 100% (113/113), 29.90 KiB, done.
Resolving deltas: 100% (31/31), done.

続いて、twitterBootstrap のドキュメント に記載されているとおり、.less ファイルへのリクエストを twitterBootstrap モジュールへ引き渡すよう routes ファイルを編集します。

catch all ルートよりも前に設定する必要がある点に注意してください。

.less ファイルの prefix は自由に設定できるので、業務で利用する際など twitter という名称が不適切な場合は、適宜変更すると良いでしょう。

/Users/garbagetown/temp/sample% vi conf/routes 
(snip)
GET     /twitter                                module:twitterBootstrap

# Catch all
*       /{controller}/{action}                  {controller}.{action}

最後に、.less ファイルを利用するよう html ファイルを編集します。どの html に書いても動作しますが、main.html に書くのが適当でしょう。

/Users/garbagetown/temp/sample% vi app/views/main.html 
<!DOCTYPE html>

<html>
    <head>
        <title>#{get 'title' /}</title>
        <meta charset="${_response_encoding}">
        <link rel="stylesheet" media="screen" href="@{'/public/stylesheets/main.css'}">
        <link rel="stylesheet" media="screen" href="/twitter/bootstrap.less">
        #{get 'moreStyles' /}
(snip)
</html>

以上で twitterBootstrap を利用する準備が整いました。

Twitter Bootstrap

それでは app/views/Application/index.html を編集して、Twitter Bootstrap で用意されたデザインをいくつか利用してみましょう。

Twitter Bootstrap のレファレンスサイト は、それ自体が Twitter Bootstrap を利用しているので、このサイトのソースコードを眺めてみると Twitter Bootstrap が非常に簡単に利用できることが分かります。*1

Layouts

div に container クラスを指定すると、センタリングされた固定幅 940px の表示領域を定義することができます。

#{extends 'main.html' /}
#{set title:'Home' /}

<div class="container">
    <h1>Twitter Bootstrap</h1>
</div>

f:id:garbagetown:20111218100658p:image

Grid

デフォルトでは幅 940px を 16 個のセルに分割するグリッドシステムを利用することができます。

(snip)
<div class="container">
    <h1>Twitter Bootstrap</h1>
    <div class="row">
        <div class="span4">
            <h2>span4</h2>
        </div>
        <div class="span12">
            <h2>span12</h2>
        </div>
    </div>
</div>

f:id:garbagetown:20111218134052p:image

Tables

行毎に背景色を塗り替えるテーブルも class に zebra-striped を指定するだけで利用できます。

(snip)
        <div class="span4">
            <h2>span4</h2>
            <table class="bordered-table zebra-striped">
                <thead>
                    <tr>
                        <th>#</th>
                        <th>A</th>
                        <th>B</th>
                    </tr>
                </thead>
                <tbody>
                    <tr>
                        <td>1</td>
                        <td>A1</td>
                        <td>B1</td>
                    </tr>
                    <tr>
                        <td>2</td>
                        <td>A2</td>
                        <td>B2</td>
                    </tr>
                    <tr>
                        <td colspan="3">colspan3</td>
                    </tr>
                </tbody>
            </table>
        </div>
(snip)

f:id:garbagetown:20111218142241p:image

Forms

xlarge, large, medium, small, mini と、様々な大きさの input 項目が用意されています。

(snip)
        <div class="span12">
            <h2>span12</h2>
            <form>
                <fieldset>
                    <div class="clearfix">
                        <label for="xlInput">X-Large input</label>
                        <div class="input">
                            <input type="text" id="xlInput" class="xlarge">
                        </div>
                    </div>
                    <div class="clearfix">
                        <label for="lInput">Large input</label>
                        <div class="input">
                            <input type="text" id="lInput" class="large">
                        </div>
                    </div>
(snip)

ソースコードは省略しますが、disable 項目やチェックボックス、ラジオボタン、テキストエリアのスタイルも用意されています。

また、カラフルなボタンも用意されています。

(snip)
                </fieldset>
                <div class="actions">
                    <button class="btn primary">Primary</button>
                    <button class="btn">Default</button>
                    <button class="btn info">Info</button>
                    <button class="btn success">Success</button>
                    <button class="btn danger">Danger</button>
                </div>
(snip)

f:id:garbagetown:20111218142242p:image

この他にも固定位置のナビゲーションバーやタブメニュー、パンくずリスト、メッセージ表示領域など、非常に豊富なスタイルが用意されています。

LESS

Twitter Bootstrap は LESS で書かれているので、変数やミックスイン、入れ子ルール、関数や演算子などを使用することができます。

ここでは modules/twitterBootstrap/public/preboot.less を編集して文字色を全体的に赤色にしてみます。

/Users/garbagetown/temp/sample% vi modules/twitterBootstrap/public/preboot.less 
/* Preboot.less
 * Variables and mixins to pre-ignite any new web development project
 * ------------------------------------------------------------------ */
(snip)
// Grays
@black:             #f00; // #000 から #f00 に変更
@grayDark:          lighten(@black, 25%);
@gray:              lighten(@black, 50%);
@grayLight:         lighten(@black, 75%);
@grayLighter:       lighten(@black, 90%);
(snip)

h1 要素の文字色は、modules/twitterBootstrap/public/type.less において変数 @grayDark として設定されています。

/Users/garbagetown/temp/sample% vi modules/twitterBootstrap/public/type.less 
/* Typography.less
 * Headings, body text, lists, code, and more for a versatile and durable typography system
 * ---------------------------------------------------------------------------------------- */
(snip)
// HEADINGS
// --------

h1, h2, h3, h4, h5, h6 {
  font-weight: bold;
  color: @grayDark;
  small {
    color: @grayLight;
  }
}
(snip)

変数 @grayDark は上記の preboot.less において、lighten 関数で @black を 25% 明るくした色として定義されているので、@black の値を #000 から #f00 に変更すると、@grayDark の値は #404040 から #ff8080 に変更されます。

f:id:garbagetown:20111218144404p:image

LESS は、煩雑になりがちな CSS を簡潔に管理することができる強力なツールです。

同様のツールに Sass があり、今後どちらが主流となるか見極めが難しい状況ではありますが、両者の違いは細かな文法の差異程度であり、基本的な概念はほぼ同じなので、いずれか一方をマスターしておくと良いでしょう。

最後に

Twitter Bootstrap を使うことで、全体的なデザインや CSS に定義する class 名の検討など、定型的な作業を省略することができます。また、Twitter Bootstrap をくり返し適用することで、プロジェクト間における情報の共有やノウハウの蓄積を効果的に行えるようになります。さらに、この Twitter Bootstrap が内蔵する LESS を使うことで、例えばコーポレートカラーに変数名を付けて共有するなど、CSS を統一的かつ簡潔に管理することができるようになります。

Twitter Bootstrap が LESS を使用していることで、プロジェクトへの適用の敷居がわずかながら高まっていることもまた事実ですが、今回ご紹介したとおり、twitterBootstrap プラグインは非常に簡単に利用することができます。

playframework には、twitterBootstrap プラグインの他にも Javascript の記述を簡易にする CoffeeScript 用の プラグイン など、少しだけ先の技術を容易に利用することのできるプラグインが多数作成されています。playframework は Heroku を始めとするクラウドサービスへのデプロイも容易ですし、はじめからステートレスアーキテクチャとして設計されているため、セッションレプリケーションなどの重苦しい仕掛けも不要です。

ご興味を持たれた方は、是非とも重い腰を少しだけ持ち上げて、コマンドプロンプトから play new sample と入力してみてください。そして twitterBootstrap や LESS, CoffeeScript などのプラグインを設定してアプリケーションを開発してみてください。そこそこ見栄えの良いアプリケーションを簡易な文法で開発したら、未完成でもいいので思い切って Heroku にデプロイ してみてください。

そして、次はあなたが playframework の楽しさを周りの人に教えてあげてください。

最後まで読んで頂き、ありがとうございました。

Play! framework Advent Calendar 2011 jp #play_ja : ATND の 19 日目は @yosuke_furukawa さんです。

*1:現在の twitterBootstrap モジュールは Twitter Bootstrap 1.2.0 を利用しているので、最新版の Twitter Bootstrap で定義されたデザインは利用できないことがあります

2011/10/12

[] 第二回 #Playframework 勉強会 in Tokyo で発表しました #play_ja

第二回 #Playframework 勉強会 in Tokyo #play_japlaydocja のこれまでとこれからについて発表してきました。

ぼくの発表資料は slideshare にアップロードしてあります (実際に使用したのは無駄なエフェクトや実験的な動画を埋め込んだ keynote 版で細部が異なります) 。

当日の模様や各発表者の方の概要は主催者 @ikeike443 さん のブログにまとまっているので、そちらをご参照頂くとして、以下には個人的な振り返りをつらつらと書き留めておきます。

KEEP

まずは良かった点、今後も継続したい点。

  • keynote remote を使って iphone から mac の keynote をリモート操作して発表した
  • 動画を組み込んだスライドというあまり見かけないスタイルの発表ができた
  • playframework に関する突っ込んだ話がいくつか聞けた
    • 特に siena-mongo がアツかった
  • 翻訳サイト利用者の声がたくさん聞けた
    • 翻訳サイトがあったからプロジェクトで playframework を使うことにした、という話がちらほら
    • 数名の方から翻訳を手伝いたいとお声掛け頂いた
  • 技術書の翻訳などを多数手がけられている @tamagawaryuji さんとお話しすることができた
    • 翻訳があると原文を読まなくなるから日本人の英語下手を助長するみたいでイヤなんです、とグチったら色々とアドバイスしてくださった
    • もうひとつ面白い話も聞かせて頂いた。これは是非とも実現したい

PROBLEM

続いて悪かった点、今後は改善したい点。

  • keynote remote を使って iphone から mac の keynote をリモート操作して発表したけど誰にも気付いてもらえなかった
  • せっかく立って発表したのに ustream 録画では見切れていてちゃんと聴衆に向かって話せているか確認できなかった
  • 「何を話したいのか」「どのように話したいのか」は分かっていたけど「誰に話したいのか」が分かっていなかった
    • みんながみんな playframework についてある程度の知識を持っているものと勝手に思い込んでいた
    • みんながみんな playdocja を読んでいるものとどこかで勝手に思い込んでいた
  • マイクが遠いっぽいとか ustream が切れたっぽいとかのトラブルにいちいち動揺してしまった

TRY

最後に今後は挑戦したい点。

  • keynote remote を使って iphone から mac の keynote をリモート操作することを気付いてもらえるようにする
  • 「誰に」「何を」「どのように」話したいのかをよく考える
    • スライドと動画と原稿の内容ををきっちりと組み立てる
  • ustream 録画が入る場合はマイクの位置、立ち位置などを事前にしっかり確認する
    • インフラ周りのトラブルが起きても動揺しない
  • 個人名刺を用意する
  • 企画、運営をお手伝いする

謝辞

スポンサー企業の 株式会社イージフ様株式会社シャノン様、企画・運営の @ikeike443 さん@fujya さん@yosu さん@twintaro さん、発表者の方々、懇親会でお話しさせて頂いた方々、ありがとうございました。

2011/09/26

[] play.ruble

みんな大好き eclipse で playframework の開発を快適に行えるように playframework 向け ruble を作ってみました。

f:id:garbagetown:20110926220151p:image

ruble とは

aptana studio で使えるコードスニペットの集まりで、textmate で言うところの bundle のようなものです。

以下、 aptana (いまは titanium studio ですが) のドキュメント より抜粋。

Ruble (short for RUby BundLE) is a runtime environment that allows for the extensibility of IDEs and text editors using Ruby. Compatibility with TextMate bundles is a priority--we want to make it reasonably straightforward to convert an existing TextMate bundle into a Ruble bundle, while still allowing commands and snippets to be more concise and more powerful.

To begin, you might wish to start with Modifying an existing Ruble, and then move on to Creating a new Ruble to hold your own custom code.

要するに textmate の bundle とできるだけ互換性を持たせた ruby 製の ide 拡張で、既存の ruble をそのまま使うも良し、カスタマイズするも良し、新しい ruble を作るも良し、ということみたいです。

ちなみにぼくは「ルーブル」と発音していますが、正解かどうかは分かりません。

インストール

aptana studio のインストール

まずは eclipse に aptana studio プラグイン をインストールしてください。

f:id:garbagetown:20110926220149p:image

os や eclipse, aptana のバージョンには依存しないはずです。mac os x または windows xp に eclipse ide for java developers 3.7, aptana studio 3.0.4 という環境で動作を確認しています。

git リポジトリからのインストール

aptana studio をインストールしたら、ホームディレクトリ配下に git://github.com/garbagetown/play.ruble.git を git clone してください。

ホームディレクトリのパスは os によって異なるので注意が必要です。mac os x の場合は "/Users/ユーザ名/Documents/Aptana Rubles/", windows xp の場合は "C:\Documents and Settings\ユーザ名\Aptana Rubles\" です。windows 7 は環境がないので分かりません。

$ cd ~/Documents/Aptana\ Rubles/
$ git clone git://github.com/garbagetown/play.ruble.git
Cloning into play.ruble...
remote: Counting objects: 10, done.
remote: Compressing objects: 100% (8/8), done.
remote: Total 10 (delta 1), reused 10 (delta 1)
Receiving objects: 100% (10/10), done.
Resolving deltas: 100% (1/1), done.
$ ls
play.ruble
$ ls play.ruble/
README.md	bundle.rb	snippets

「ディレクトリ名にスペース含めるんじゃねえよキモいだろカスが」という真っ当な感性をお持ちの方には Bundle 用ディレクトリをカスタマイズする方法 もあるようです。

アーカイブファイルからのインストール

git をインストールされていない方は play.ruble の github から tar.gz または zip ファイルをダウンロードすることも可能です。

f:id:garbagetown:20110926234032p:image

ダウンロードしたファイルを展開して上述のホームディレクトリ配下にコピーしてください。

大きなお世話だとは思いますが git は入れておいた方が楽しいのでインストールすることをお勧めします。

今後は簡単インストール

aptana の中の方に連絡して 新規 budle リストに取り込んでもらった ので、aptana の次のバージョン以降はメニューから Commands -> Bundle Development -> Install Bundle と進めば、新規 bundle リストに Play framework が表示されることになるはずです。

使い方

適当な html ファイルを aptana の html エディタで開いて "list" などのキーワードに続けて tab キーをタイプすれば、スニペットが補完されます。

登録されているスニペットの一覧はメニューの Commands -> Play framework で確認してください。

f:id:garbagetown:20110926234259p:image

一応 logger や controllers, models のスニペットも play の vim bundle からポーティングしていますが、対象ファイルを java エディタで開いた場合は aptana スニペットによるコード補完が有効にならないのであまり意味はありません。この辺りの補完は eclipse の補完機能を使ったほうが便利だと思います。

playframework のタグ、java extension はひと通り網羅しようと思っています。

バグその他要望など

このブログのコメント欄か、 github の issues にポストしてください。

参考URL

2011/09/15

デザイン変更

長らく放置していたゴミブログのデザインを少し変えました。

今後は playframework を中心に、技術系の情報を備忘録として掲載していく予定です。

twitter 連携はしませんので、新規投稿を追いかけたい方は rss を活用してください。

2011/05/10

[] Uphill City / I Am Robot and Proud

なんだかブログを書かずに放っておくと広告が入るようなので適当に更新。近頃こんなの聴いています。

Uphill City

Uphill City

レイ・ハラカミさんとか竹村延和さんあたりが好きなら聴けると思います。かわいらし系エレクトロニカ。

英語読んだりコード書いたりしているときは歌モノだと邪魔になるのでこーいうぴこぴこしたやつをよく聴きます。