日時:02月27日 10:00 - 19:00
参加費:無料
開催場所:FJORD, LLC
東京都渋谷区本町1−36−11 ドエルヤマト203Lokkaの本体、テーマ、プラグインをもくもくと開発するイベントです。
最低でも@komagataはいて作業しています。
遅刻早退自由です。
飲み物食べ物持ち込み自由です。
# Gemfile:
gem 'devise'
% bundle
% rails g devise:install
% rails g devise:views
% rails g devise user
% rails g controller home index
% rake db:migrate
# config/environments/development.rb:
Foo::Application.configure do
# ...
config.action_mailer.default_url_options = { :host => 'localhost:3000' }
end
# config/routes.rb:
Foo::Application.routes.draw do
root :to => 'home#index'
# ...
end
# app/views/layouts/application.html.erb:
<p><%= link_to 'Sign in', [:new, :user_session] %></p>
<p><%= link_to 'Sign up', [:new, :user_registration] %></p>
<p class="notice"><%= notice %></p>
<p class="alert"><%= alert %></p>
<%= yield %>
% curl https://github.com/svenfuchs/rails-i18n/raw/master/rails/locale/ja.yml -o config/locales/ja.yml
% curl https://gist.github.com/raw/833169/54d19c523f6a608e732d4e9a6606a6d6cbec7f8e/devise.ja.yml -o config/locales/devise.ja.yml「起業チャレンジ2011、最優秀賞チームは うつからの社会復帰支援「U2plus」 :ベンチャーニュース:Venture Now(ベンチャーナウ)」
最優秀賞チームの「U2plus」は、Webを介した認知行動療法で、うつからの社会復帰を支援するビジネスプランを発表。代表の東藤泰宏さん自身、うつ病歴2年半。勤務中、うつ病に罹患(らかん)して、Webディレクターという職を失ったという。そんな辛い経験から今回の事業にかける想いは強い。選考会では、同事業における社会的意義のほか、事業の実現性、成長性なども評価された。
うつ病治療のWebサービス・・・だと・・・。
ガチ鬱プログラマーとか書いている以上、芸風的に絡まないと嘘かなと思い、twitterでフォローされたのをきっかけにゆううつ部のブログを見て、何かお手伝いできることはないでしょうかとメールしました。そして実際に会って何度か打ち合わせしました。
海外で既に効果が認められていながらイマイチ日本では知られていない認知行動療法をWebで提供するサービスとのこと。
僕は「薬サイコー!」という感じだしまだ体験したことないので分かりませんが、薬物治療と併用できるのと再発率を下げることができるというのが良いなと思いました。
さっそくドメインをHerokuに向けてGoogle Appsを設定し、土日で超簡単なプロトタイプを作ってみました。ただ、僕は土日ぐらいしか作業出来ないのでメインでガッツリ開発することは出来ません。なのでリモートから開発してくださるRailsプログラマーの方を探しています。
お手伝いしていただけるプログラマ、WEBデザイナーの方を募集中 - ゆううつブログ
U2plusではWEBサービス開発へ向け、お手伝いしていただけるプログラマ、WEBデザイナーの方を募集しています。 うつ病問題への関心のある方や、WEBサービスを作り上げること、スタートアップに興味のある方は是非ご連絡ください。
僕のようにうつ病か、元うつ病といったこのサービス自体に共感してくださる方を探しています。まだRuby/Railsの経験があんまり無くてこれから覚えたいという方でも寧ろサービスの趣旨に賛同してくださる方を求めています。
あとうつ病のWebデザイナーの方も探しています。要は全員探しています・・・。
特にWebデザイナー探しは全く見つかる気配も無い気がして、お知り合いでそういった方がいたら@komagataまで教えてください・・・。
プログラマーもデザイナーももし興味がある方がいらっしゃったら@komagata 「うつのRailsプログラマー募集」係までお願いします・・・。(komagata@gmail.comでもいいです)
あと、「応募はできないけど、俺もうつだからなんか手伝おうか?」という方がいれば、このエントリーを転載、RTしていただけるとありがたいです。
同じrouteを2回定義する件。
routesも要はRegexpとブロックの配列。でも最初に定義した方が呼ばれるって何か変。こういうものって後に追加した方が呼ばれる設計にする方が自然な気がする。
そこでもしかして同じroutesとか関係なくて、単にファイル内で上から下に書いてく時の優先順位がそのまんまこの設計に反映されてる的な感じなんじゃないかと思ってpassしてみた。
# public/plugin/lokka-unk/lib/lokka/unk.rb:
module Lokka
module Unk
def self.registered(app)
app.get '/' do
puts 'unk'
pass
end
end
end
end
% bundle exec ruby lokka.rb
unk
localhost - - [17/Feb/2011:10:41:33 JST] "GET / HTTP/1.1" 200 38183
- -> /
普通にページは表示されつつ、標準出力にunk。予想通りだ。これは擬似beforeみたいにも使えそう。(普通にbefore '/' do ... endした方が良いが。)
sinatraはルールがシンプルだから自由度が高いなあ。
何だか感慨深い。Java(僕のJava知識はJ2SE1.4で止まってる)とかその他の大きめなフレームワークだとChain-of-responsibilityパターンとかいってFilterChainみたいな感じで実装すると思うんだよね。こういうの。
sinatraはちっちゃいからRegexpとブロックのオブジェクトを配列にもってるから単にナメればいいでしょ?みたいな雰囲気。
Filterクラスを継承したクラスを作るとか面倒。Objective-Cだとブロック対応してない環境のためにワザワザdelegate作るのでヘッダも必要だしとか・・・だるいよなあ(ただの愚痴です・・・)
Lokkaのデータ構造についてざっくりとした図。クラス図もER図も厳密過ぎちゃうので何となくの図です。

- Post(投稿)
- いわゆる普通のブログの投稿。
- Page(ページ)
- ブログの投稿の様に時系列に並べたりしないもの。(aboutとかprofileとかfaqとか)
- Entry(エントリー)
- PostとPageのこと。
- Category(カテゴリー)
- エントリーをツリー状に分類するためのもの。親カテゴリーの概念が有る。1エントリーに複数カテゴリーはつかない。
- Tag(タグ)
- エントリーをフラットな構造に分類するもの。1エントリーに複数つけられる。
- Comment(コメント)
- Entryにはコメントが付けられます。
- User(ユーザー)
- その名の通り。
- Site(サイト)
- サイト自体の情報。タイトルとかテーマとか。
- Option(オプション)
- 必須ではないサイトの情報。プラグインなどから勝手に項目を増やせる。
- Snippet(スニペット)
- テンプレートの切れ端。URLは持っていない。
これらは全て共通のAPIを持っています。(DataMapper)
*あとで書く* (datamapper.orgを見て・・・)
Entry(PostやPage)はCommentやCategoryやTagやUserと相互に紐づいています。
> Post('about').category.name
mac
> Comment(1).entry.user.name
komagata
分かりにくい部分
PostとPageはEntryのサブクラス。所謂単一テーブル継承ですが持っている機能が同じです。
# entry.rb
class Entry
...
end
class Post < Entry; end
class Page < Entry; end
「おやおやこれはおかしいぞ、機能が同じならなんで特化するんだい?」
「名前が違います。」
今後特化した機能ができるかもね!要はLokkaの"ブログ"の部分がPostで"CMS"の部分がPageです。
(WordPressのカスタムタクソノミーはキモイので同じの作るとしてもclass Foo < Entry; endを動的に増やすとかで対応しようと思っています。)
テーマ作成者にとっては結構違います。Postはそのテンプレートに合わせたPostをLokkaがあらかじめテンプレートに渡してくれます。Pageの方はLokkaは何もしてくれないので自分で取りに行かなければいけません。
# entries.erb
<% @posts.each do |post| %>
<%= post.title %>
<% end %>
# entry.erb
<%= @post.title %>
テンプレートに応じたPostが@postsや@postに最初から入っています。これは下記と同じ意味です。
# entries.erb
<% @posts = Post.recent(10) %>
<% @posts.each do |post| %>
<%= post.title %>
<% end %>
# entry.erb
<% @post = Post.get_by_id_or_slug(params[:id_or_slug])
<%= @post.title %>
@postが最初から設定されてると上記のように書かなくて済むから便利!
何故同じrouteを2回定義したときの動作が気になったかというと、@miminashiさんのtweetが気になったからです。
Lokkaではまずプラグインが読み込まれるのでこの動きは好都合。
# public/plugin/lokka-unk/lib/lokka/unk.rb:
module Lokka
module Unk
def self.registered(app)
app.get '/' do
'unk'
end
end
end
end
% curl http://localhost:9646
unk
プラグインから簡単にトップページを横取りできた。これはいいフリーダム。
# public/plugin/lokka-unk/lib/lokka/shit.rb:
module Lokka
module Shit
def self.registered(app)
app.get %r{^/([0-9a-zA-Z-]+)$} do |slug|
slug
end
end
end
end
% curl http://localhost:9646/1
1
% curl http://localhost:9646/hoge
hoge
個別ページはこんな感じ。選ばれない方のメソッドは単に実行されないので副作用はありません。
require 'rubygems'
require 'sinatra'
get('/') { 'unk' }
get('/') { 'shit' }
% curl http://localhost:4567
unk
先に定義された方が実行される。
Mac版Lokkaの始め方。
仕事を邪魔されない非同期コミュニケーションのやり方を模索中。
ランチャーと簡単なスクリプトを使って受信せずにTwitterとメールを送信する。
前回最低限のテーマの作り方を紹介しました。今回は無くてもいいけど使うと便利なテンプレートタイプについて紹介します。
Lokkaにはデフォルトのentry, entries以外に様々なテンプレートタイプがあります。テンプレートは一覧、個別、その他のどれかに分類されます。
テンプレートタイプ
一覧
- index --- トップページのテンプレート
- category --- カテゴリー別の一覧ページのテンプレート
- tag --- タグ別の一覧ページのテンプレート
- yearly --- 年別の一覧ページのテンプレート
- monthly --- 月別の一覧ページのテンプレート
- search --- 検索結果の一覧ページのテンプレート
- entries --- 一覧ページのテンプレート。上記のテンプレートが無い場合に使われる。
個別
- post --- 投稿(Post)の個別ページのテンプレート
- page --- ページ(Page)の個別ページのテンプレート
- entry --- 個別ページのテンプレート
その他
- partial --- テンプレートの一部分を共有するテンプレート
- layout --- テンプレートの外枠を共有するテンプレート
一覧テンプレート
一覧はentries、個別はentryというテンプレートがありますが、例えば一覧で"検索結果だけに必要なもの"があった場合、entriesの中がごちゃごちゃしてしまうのでsearchという名前でテンプレートを作っておくと、検索結果の場合はそちらが優先して使われます。
個別テンプレート
同じようにentryとpostというテンプレートがあった場合投稿(Post)の場合はpostが優先的に表示されます。投稿とそれ以外で別の内容にしたい時に便利です。
どのテンプレートが選ばれるかはURLで決まります。実際には厳密なルールがありますが長くなるので代表的な例を紹介します。
- index --- /
- category --- /category/foo/
- tag --- /tag/foo/
- yearly --- /2011/
- monthly --- /2011/01/
- search --- /search/foo/
- post --- /1
- page --- /2
(postやpageやcategoryはIDの他にスラッグと呼ばれる自由なURLを持つことができます。そちらでもアクセスすることも可能です。)
上記以外に特殊なテンプレートタイプが存在します。それがpartialとlayoutです。
partialテンプレート
partialは複数のテンプレートで共通の部分等を別ファイルとして作成して共有するためのテンプレートです。好きな名前で作成することができます。
例えば、Copyright部分をpartialテンプレートとして下記のように作成し、別のテンプレートから読み込む事ができます。
copyright.erb:
<p>Copyright FJORD, LLC</p>
entries.erb:
(省略)
<%= partial 'copyright' %>
entry.erb:
(省略)
<%= partial 'copyright' %>
同じ内容が複数のテンプレートで出てくる場合にpartialを使うと楽でしょう。
layoutテンプレート
もう一つのlayoutテンプレートはpartialとは逆に、テンプレートの一部分を共有するのではなく、外枠の殆どを共有するイメージです。
layout.erb:
<h1 id="header">Title</h1>
<%= yield %>
<div id="footer">Powered by Lokka</div>
entry.erb:
<h2>Post Title 1</h2>
<div class="body">body ...</div>
yieldの部分にentryやentriesのテンプレートの結果が全部入るイメージです。layoutテンプレートはWordPressなどには無い機能なので多少取っ付きづらいですが、テンプレートの大部分を共有できる非常に便利な機能で、上手く使うとテーマコーディングが大幅に楽になります。数多くのフレームワークに採用されている機能なので是非とも活用してみてください。


