OmniAICreator/Qiita-1.07M huggingface dataset:
動作検証やプラグイン開発に便利！Emacsを複数起動したり最小構成で起動する方法


`-Q`や`-l`オプションを上手く使って快適なEmacsライフをおくりましょう。

![emacs-options-q-l](http://cdn-ak.f.st-hatena.com/images/fotolife/t/tuto0621/20131208/20131208154942.gif)

[[本文へ]](http://ongaeshi.hatenablog.com/entry/emacs-options-q-l)
.zshrcの自動再コンパイル

zsh のスクリプトは `zcompile` コマンドでコンパイルすることができます。
`.zshrc` も大きくなって読み込みに時間がかかるようになったらコンパイルすれば良さそうですが、変更したときに手動でコンパイルし直すのは面倒なので、自動で再コンパイルする設定を紹介します。

続きは [.zshrcの自動再コンパイル](http://blog.n-z.jp/blog/2013-12-10-auto-zshrc-recompile.html) です。
社内にGITを持ち込むために上の人を納得させるセリフ集


Gitアドベントカレンダー10日目です。
10日目で区切りもいいので少しネタ臭い内容を。

## 攻め文句

>「継続的リリースを支える運用フローに、gitflowは最適」

現場でgitを押す理由としては、ほんとにコレに付きます。学習コストを差し置いてでも導入したい、という点にまずコレが挙がるんじゃないでしょうか?

機能ブランチとチケット駆動開発の流れ、それにSVNのチェリーピックを露骨に危険&手間とアピールしていけばgitの重要性は認識してもらえるはず。

> 「世界中で採用されているgithubで、ソーシャルライクな社内開発コミュニケーションを」

お金に余裕のあるところでは、是非ともgithub enterpriseを検討してもらいましょう。開発はコミュニケーション命、的な話でコミュニケーションの重要性を説くといいと思います。

開発者としても、Web上でソーシャル的にコードレビューなどを行えるのは非常に助かるものです。

いきなり費用が...というのもアレなので、あくまで将来像の一つとして提示する程度が現実的かと思います。

> 「オープンソースコミュニティを支える技術として、プラットフォームを問わない利便性」

この辺りはいささか微妙なところですが、まぁWindowsでも最近は大分使えるようになってきたみたいなので。

技術分からない上層部でもオープンソースとか言うとなんかビビッと反応シてくれるような人種もいるようです。

## 守り

> 「でも新しい技術覚えるのは、現場の負担が高そうで…」

まぁ間違いなく来る文句です。このあたりへの返しは、言われる前に自分で予防線貼っておきたいものです。

学習コストに対する返しとしては、

- 動作が軽快
- マージが賢い
- 中央リポジトリの管理が楽
- 継続的にリリースを行う場合にはgitflowの利点を

などを利点として挙げる感じでしょうか。SVNがぶっ壊れたタイミングとかで話を持ち出すといい感じに通るかもしれません。

> 「勉強するのとか大変そうだし、めんどくさい…」

現場からの文句も湧いてくるかもしれません。定期的にGIT勉強会を開くのがいいでしょう。社内Wikiなどにいろいろ学習サイトのリンクを貼ったりしておくのもいいかもしれません。

このあたりも事前に導入フローとして組み込んで提示しておけば上の人は安心するみたいです。何事も先手必勝です。

## 保身

この辺大事。言い出しっぺはなんかあった時に責任問われかねないので。

### SVNとの違い

セキュリティ周りの違いはかなり重要。

SSHとか中央サーバのrootパス管理とか適当にしてるところだとまずいかも。
Gitosisとか入れる余裕があるならいいのだけれども。

### 所詮はツール

所詮はツールですので、GITを導入した所で劇的に何かが変わるというわけではないです。

品質管理なんてものは根本は運用の問題ですので、GITを導入して楽になる「可能性」はあっても、運用体制を合わせて変えていかなければ何も変わらならないです。

何も変わらないどころか無駄に「学習コスト」の支払いをして、そのままおじゃんという可能性も。

### SVNでやってた以上の事を求めない

GITに移行したら劇的に改善する、みたいな勘違いでよくあるパターン。何か無理が出た時は「SVNでそれできてたかな?」みたいな事を良く考えましょう。

運用を改善するのは必要な命題ですが、「改善できない」をGITのせいにされるのはたまったもんじゃないです。

あとやっぱりなんでもかんでも技術に求め過ぎない事。運用でカバー出来る所は運用でカバーしてもらうのが一番楽です。

## あとがき

継続的開発を行う企業ではGIT移行は確かに魅力的ですが、そうでない企業ではできるだけ慎重になりたいところです。

あと、SVN=GIT相互運用みたいなパターンはなし崩し的にコケる可能性が高いので、タイミング見計らってガラッと変えてしまった方がいいです。
クロスコミット支援ツールとか導入できるなら別ですけど。

まぁ何にしてもそういうGIT関連ツールを扱い慣れてるとやっぱり強いです。社内でそういう人材いればいいんですけどねぇ…

以上、SVN=GIT移行の現場から、でした。

\# Qiitaでやる内容じゃねぇなぁと後から反省しました…
Riakの内部構造について

ネタが無くなってきたよ！saisa6153です！！
泥酔後のハイテンションで贈る、みんなでやるRiak Advent Calendar ９日目。
今日はRiakの内部構造について知ってることとかを書きます。

## ソフトウェア・スタック
Riakはたくさんの部品を組み合わせて構成されている。
公式ドキュメントの絵ではこんな感じだ。
![riakソフトウェアスタック.png](https://qiita-image-store.s3.amazonaws.com/0/11737/75f17aad-55d7-9434-4c16-dffd54973613.png)
順に説明していこう。

### Riakクライアント
様々なプログラミング言語向けのクライアントライブラリが提供されている。
Erlangはもちろん、Java, PHP, Ruby, Python, Perl, OCamlやClojureなどBasho公式やコミュニティ・有志によるものを合わせると、仕事で使う大抵の言語では問題が無いことがわかる。
現在は2.0への過渡期であり、全クライアントで全機能が網羅されているとは言いがたいが、時間の経過と共に充実していくだろう。
充実していなければPull Requestを出そう。

### webmachine
端的に言うとHTTPサーバである。多分。
Basho作でErlang製。
つまり、馴染み深いRiakのRESTインタフェースを担っている部分だ。
> Webmachine is an application layer that adds HTTP semantic awareness on top of the excellent bit-pushing and HTTP syntax-management provided by mochiweb, and provides a simple and clean way to connect that to your application’s behavior.

### プロトコルバッファ
Protocol Buffers(プロトコルバッファー)はインタフェース定義言語(IDL)で構造を定義する通信や永続化での利用を目的としたシリアライズフォーマットであり、Googleにより開発されている。 by Wikipedia。
webmachine、つまりRESTより早い。
とは言えRESTの方が扱いが簡単。
ライブラリがないとか特殊な事情だったらREST、そうでなければ大抵プロトコルバッファを選ぶと思う。
Riak関連ソフトウェアをインストールするとき"pb"とかあったら大抵これ。

### Riakレプリケーション、Riak SNMP/JMX
よくわからない。課金装備。
使いたければBashoにお布施しましょう。
Riakは同じクラスタ内で自動レプリケーションするんだけど、有償ライセンスではデータセンター間でのレプリケーションが取れるらしい。
例えばメインのDCにミサイルが落ちてきても、遠隔地に同データのクラスタを作っておけばシステムは止まらないということだ。
ネットワークがある程度遠くなると必要なのだろうか。
Riak SNMP/JMXは、字面的にエンプラ水準の監視機能を提供してくれるんだと思う。
あったらオペレーターは安心できるんだろうなあ。

### [Riak KV](https://github.com/basho/riak_kv)
いよいよコアの機能に入っていく。
まずはKVSとしての機能を実現しているriak_kv。
「これがkey-value提供してるんならriak_coreってなんなんだよ」っていう気持ちになるかもしれないが、しかし実際これがKVSの機能を提供しているらしい。
2i及びMapReduceも含むようだ。

### Riak Search
valueに対する検索機能を提供している。インデックスも作る。
しかし日本語が検索できなかったり制限があったようで、2.0ではこれをYokozunaで置き換える流れになるのだと思う。

### [Riak Pipe](https://github.com/basho/riak_pipe)
Readme読んでないのでよく分からないが、Unix Pipeのような機能を提供しているようだ。

### [Riak Core](https://github.com/basho/riak_core)
メインです。
riak_coreは、"分散"という機能を担っている。
Riakで重要なことはKVSであることではなく、高度な分散機能だ。
それがあってこそ、Riakの高可用性は現実のものになっている。
ソースは覚えていないが、「Riak Coreは一種のフレームワークであり、この上で分散アプリケーションを作ることもできる」と聴いた事があるようなないような。
文字通り「Riakを支える技術」そのものである。

### Bitcask, LevelDB, Merge Index
ストレージエンジンに相当する。
Bitcaskは早く、格納可能容量に限度がある。
LevelDBはそれよりは遅いが、大量のデータを格納することができ、2iを使うこともできる。
fluent-plugin-riakではLevelDBを使わなければならない。
Merge Indexはよくわからない。Riak Searchや2iなどインデックスの永続化を担っているらしい。
実は[Memory Backed](http://docs.basho.com/riak/1.3.0/tutorials/choosing-a-backend/Memory/)というものもある。

## まとめ
Riak Source Code Readingが1回2時間で継続開催できているのは、コードの読みやすさに起因するのだと思っている。
それは、

* Erlangを使っているので本質でないコードが排除されやすい
* 適度に抽象化されており、読むに堪える分量におさまっている

などの恩恵によるものなのだろう。
Riak Coreは曰くフレームワークらしい。
コールドリーディングを進めてErlangやRiakへの理解が深まった暁には、Riakの活用に加えて、応用への見聞を深める事ができたらいいなーと思う。
GoogleAppsScriptメモ：スプレッドシート（セル操作の基礎）

##### スプレッドシートはエクセルによく似ているが、スクリプトを適用させればかなり自由にカスタマイズができる。 #####

なんとなく覚えておくと強そうなので、いちおう基礎だけは固めておこう。

### 値の取得と挿入 ###

###### forSs.gs ######

```js
function sheetControl(){
  var Ss = SpreadsheetApp.getActiveSheet();  // ところでActiveの定義がいまいち分かっていない
  var range = sS.getRange(1,1);  // セルを指定 getRange('A1')と書いてもOKらしいがたぶん使いにくい
  
  var content = range.getValue();  // セルの値を取得
  if(!content){  // 値が空だったら
    Browser.msgBox("no Data....");  // msgBoxはスプレッドシート用のアラートみたいなもの
    range.setValue("I am new Data!!");  // setValueの中身を挿入
  }else{
    Browser.msgBox(content);
}
```

書き方は難しくない。それにしてもSpreadsheetとSheetがあるみたいだが、これらは何が違うのだろうか？
PlayframeworkのActionからscala文法を紐解く

scalaはツンデレらしいが多少触っただけではさっぱりデレない。
scalaといえばplayframework。RailsにインスパイアされたEoDなフレームワークのはずだが詰まる詰まる。
主にはscalaの文法的なトコロに？と思ってしまうのだ。
scalaはrubyのようにDSLを書けることを意識しているためか、簡潔に書くための省略形が色々ある。

例えばジェネレーターで作られる以下のコード。

```scala:Controller
def index= Action {
    Ok("Hello scala")
}
```

慣用句として見れば意味はわかる。シンプルだ。

だが、初学者で「とにかくイディオム覚えろ」だとモヤモヤする自分のようなタイプは「意味はわかるんだけど文法的にどういう意味なんだ？」と悩んでしまう。

```def index =``` はまぁ、普通のメソッド定義ということでOK。
よくわからなかったのは Action {...}の構文だ。
これは複数の要素が絡んでいる。

#### 1. コンパニオンオブジェクト

まず[Actionのソース](https://github.com/playframework/playframework/blob/2.2.1/framework/src/play/src/main/scala/play/api/mvc/Action.scala)を見てみよう。

Actionはtraitである。

```scala
trait Action[A] extends EssentialAction {
```

そしてActionはコンパニオンオブジェクトである。

```scala
object Action extends ActionBuilder[Request] {
  def invokeBlock[A](request: Request[A], block: (Request[A]) => Future[SimpleResult]) = block(request)
}
```

ActionBuilderもtraitなのでwithじゃねーの、と思うが一個の場合はextendsで良いらしい。
気持ち悪っ。

#### 2. applyメソッド

ActionBuilderにapplyメソッドが定義されている。

```scala
  final def apply(block: R[AnyContent] => Result): Action[AnyContent] = apply(BodyParsers.parse.anyContent)(block)
```

applyメソッドは特別扱いされていて

```Action.apply(hoge)``` は ```Action(hoge)``` と書けるようになる。

#### 3. ブロック

rubyと同じく {} で囲ってコードブロックを定義できる。

#### 4. メソッド呼び出しのカッコは省略できる

だそうだ。


以上を総合してControllerのソースをもう一度見てみよう。

```scala:Controller
def index= Action {
    Ok("Hello scala")
}
```

* ```Action.apply({Ok("Hello scala")})```  の省略形
* コンパニオンオブジェクトのapplyメソッドをcallしている
* 引数にブロックを渡している

ということになる。んー覚えること多すぎだな。。。


しかしまだ謎が残っていて、Okの存在だ。
これもコンパニオンオブジェクトのapplyなのはわかる。

これは [Results.scala](https://github.com/playframework/playframework/blob/2.2.1/framework/src/play/src/main/scala/play/api/mvc/Results.scala#L891)に定義されている。

```scala
val Ok = new Status(OK)
```

それはいいんだけど気になるのは名前解決のところで、本来的には```  play.api.mvc.Results``` のメンバーなので```Results.Ok(...)```と書かなきゃいけないのでは？？　なんで ```Ok(...)```でいいのかからくりがわからないのであった。。。

↓

あー、[Controller.scala](https://github.com/playframework/playframework/blob/2.2.1/framework/src/play/src/main/scala/play/api/mvc/Controller.scala#L21)見たら分かった。。ControllerがResultsをextendsしてるのか。

```scala:Controller.scala
trait Controller extends Results with BodyParsers with HttpProtocol with Status with HeaderNames with ContentTypes with RequestExtractors with Rendering {
```
Web開発でIntelliJ IDEAを使うべきNつの理由

Nが何個かはまだ考えていませんが、Web開発でIntelliJ IDEAを使うべき理由について、いくつか書いていきます。

# HTML部門

## Live Edit

IntelliJ IDEAには、Live Editという機能があります。
IntelliJ IDEA上で修正したHTMLおよびCSSを、リアルタイムでブラウザ側に反映させる機能です。
使用できるブラウザや反映できる箇所などに制限はありますが、画面を見ながらHTMLやCSSを調整する場合には重宝します。
(本当はスクリーンショットを入れるつもりでしたが、IntelliJ IDEA 13にしてから動かず…)

## Emmetサポート
[Emmet](http://docs.emmet.io/)はZen Codingの後継で、少ないキー入力でHTMLに展開してくれます。
このEmmetをIntelliJ IDEAは標準でサポートしています。
機能的にはLive Templatesの一環で提供されている模様。
例えば `ul#my-list>li.list-item*3>{list-$}` と入力してTabキーを押すと、下記のように展開されます。

```html
<ul id="my-list">
    <li class="list-item">list-1</li>
    <li class="list-item">list-2</li>
    <li class="list-item">list-3</li>
</ul> 
```

長文を入力したい場合には、`lorem`と入力してTabを押せばOK。あんまり使わないけど。
詳細はEmmetのサイトおよび、設定のLive Templates → Zen HTMLをご参照ください。
![スクリーンショット 2013-12-09 22.15.56.png](https://qiita-image-store.s3.amazonaws.com/0/19943/51ae9aa7-daa0-674d-28ed-22e227d3fcba.png)


# CSS部門
## スタイルの使用場所の検索
個人的に好きな機能は、HTMLとCSSを行ったり来たりする際に使う、スタイルの使用場所の検索です。
具体的には、HTMLで使っているclassがCSSのどこで使われているか、逆にCSSで使っているスタイルがHTMLのどこで使われているかを検索することができます。しかも一瞬で。

下記の例は、CSSでスタイルを書いている部分にて`Alt+F7 (Find Usage)`を押すことにより、HTMLのどこでヒットしたかが分かります。しかもスタイルが適用されない箇所はヒットしません(HTML中のnot hitがそれ)。

![スクリーンショット 2013-12-09 22.35.18.png](https://qiita-image-store.s3.amazonaws.com/0/19943/4d334f50-5834-7e6b-dc91-cf7c9d21cb3f.png)

逆にHTMLの`<li class="list-item">`と書かれているところのうち`list-item`の部分で`Ctrl+B or Cmd+B` (Declaration)を押すことにより、CSSのスタイルの箇所にジャンプします。

## 色の調整
CSSファイルのうち `color: #1234f2` と書かれている部分の左側に、青い四角形が見えるかと思います。これをクリックすると、下記のようなカラーパレットが表示されます。
このカラーパレットのスポイト機能が強力で、自分が表示している画面のほとんどの箇所で色の取り込みが行えます。試しにQiitaのfaviconの色をブラウザから取ってみると、 `#5EA129` であることがわかります。

![スクリーンショット 2013-12-09 22.39.58.png](https://qiita-image-store.s3.amazonaws.com/0/19943/29e8b13e-3c37-168d-1508-e3b4673de4ea.png)

# JavaScript部門
## JsDocと連携した補完機能
IntelliJ IDEAと言えばコード補完機能。
コード補完機能は上記のHTML, CSSにもありますが、もちろんJavaScriptにもあります。
ただ単にコード補完をすることもできるのですが、一手間JsDocを書いてあげるだけで、補完の精度が高まります。

例えば(適当すぎる例ですみませんが)下記のような関数の引数に対して補完を行った結果が以下になります。
![スクリーンショット 2013-12-09 23.02.29.png](https://qiita-image-store.s3.amazonaws.com/0/19943/24819b26-c90d-f4c3-9c47-487b1103b567.png)

ここにJsDocを書き、引数の型を指定してあげると、補完の結果が変わってきます。
![スクリーンショット 2013-12-09 23.02.56.png](https://qiita-image-store.s3.amazonaws.com/0/19943/77d5cbca-e9ee-56c8-0699-f748efd27f72.png)

もちろんJsDocを書いてあげることで、その関数を利用する側から関数の説明分や引数にどのような型のデータを渡すべきかがわかります。

その他にも、CoffeeScriptやTypeScript, DartなどのAltJS対応も積極的に行われているのですが、残念ながら私はまだ使ったことがありません。

# 全体的に
ある程度HTML/CSS/JavaScriptのソースが揃ってくると、補完が更に強力になってきます。
例えばCSSでセレクタを書くときにHTML側を解釈して適切なクラス名を提示してくれたり、jQueryでaddClassする際にクラス名を出してくれたり…説明がクラスばっかりになってしまいましたが、補完を行う際には、HTML/CSS/JavaScript間で必要な情報を提供しあって精度の高い補完ができるようになっています。


各ファイルの編集だけでも十分強力なのですが、各ファイル間の情報も使って強力に補完していけるIntelliJ IDEAを使うことで、Web開発は更に効率的になるかと思います。

なお、IntelliJ IDEAは高い！私はクライアントサイドのコーディングだけするんだ！という方には[WebStorm](http://www.jetbrains.com/webstorm/)がお勧めです。サーバサイドの開発はNode.jsしかできませんが、クライアントサイドの開発については、基本上記で書いていることはひと通りできるはずです。


# 最後に
時間や自分のローカル開発環境の都合で書けなかった部分については、以下もご参照ください 
* [HTML/XHTML/CSS Editor](http://www.jetbrains.com/editors/html_xhtml_css_editor.jsp?ide=idea)
* [JavaScript Editor](http://www.jetbrains.com/editors/javascript_editor.jsp?ide=idea)
黒い画面に不慣れな同僚にGitを使ってもらう為のGitクライアントGitHub for Mac (and Windows) 

Gitアドベントカレンダー9日目を担当します。Qiita中の人@camelmasaです。
今日はこれからGitを始める方向けにGitHub for Mac(and Windows)について書きました。

![GitHub_for_Mac-2.jpg](https://qiita-image-store.s3.amazonaws.com/1/996/358f1265-13b7-8c56-c391-0b165eafbdf1.jpeg "GitHub_for_Mac-2.jpg")

とりあえず、まずダウンロードしたいという方は[こちら](http://qiita.com/camelmasa/items/cd759b95edc69df58e1e#1-4)。

# 昨今のGitクライアントたち

メジャーところだとこの辺りでしょうか。

- SourceTree
- Tower
-  TortoiseGit(Windows)
- GitHub for Mac

幾つかありますが、私の周りではSourceTreeを使われている方が多いです。

[サルでもわかるGit入門](http://www.backlog.jp/git-guide/)を始めとした初心者向けのGit解説サイトなどでおすすめしてますが、個人的には後述するおすすめポイントによりGitHub for Macをおすすめしています。


# GitHub for Macのおすすめポイント3つ

## シンプルなUI

ナビゲーションバーがシンプルなのが分かると思います。
不必要なボタンが表示されていないため、操作が直感的に分かりやすいため、"どこ押したらいいか分からない..."という状態になりにくいです。

### SourceTree

![git-training__Git__と_ブックマーク.jpg](https://qiita-image-store.s3.amazonaws.com/1/996/15c5e3b0-78b7-0269-3228-9290fbba32d4.jpeg "git-training__Git__と_ブックマーク.jpg")


### GitHub for Mac

![git-training__Git_.jpg](https://qiita-image-store.s3.amazonaws.com/1/996/7ebf2c99-1045-a012-fe44-62552872949f.jpeg "git-training__Git_.jpg")


## GitHub連携が容易

当たり前かもしれませんが、GitHubのリモートリポジトリは簡単にcloneすることができます。

![スクリーンショット_2013_12_09_22_37.jpg](https://qiita-image-store.s3.amazonaws.com/1/996/6f1e6788-4bfe-009f-9f5a-39138c4dc5a0.jpeg "スクリーンショット_2013_12_09_22_37.jpg")


(もちろん、GitHub以外のリポジトリも管理することができますのでご安心を)

## サクサク動く

コミットが10,000+でも軽快に動作します！さすがはGitHub製ですね。


# 出来ること

GitHub for Macで出来ることをまとめる、以下の操作がGUIでできます。

- git add
- git commit
- git branch
- git checkout
- git merge
- git revert
- git clone
- git push
- git pull
- git status (Changesタブ)
- git log (Historyタブ)
- git pull --rebase && git push (Sync)

# まとめ

以上がGitHub for Macの紹介になります。
Gitが苦手と言っていた同僚の方に是非おすすめしてみてください！

Macの方はこちら。
[GitHub for Mac](http://mac.github.com/)

Windowsの方はこちら。
[GitHub for Windows](http://windows.github.com/)

# 他の記事

日本語で書かれた記事になります。

[github for macのここが便利](http://qiita.com/take/items/29fb6adaec230022fe89)
[GitHub for Mac入れた](http://www.shirokuro331.net/cobalt/?p=273)
[GitHubについてもう少し知ってみる。その３（GitHub for Macでやってみよう）](http://www.paka3.net/github03/)
[デザイナーのためのGithub for Mac の使い方「リポジトリ作成編」](http://kuroigamen.com/48)
[Github for Mac を使ってデザイナーがブランチ作る、怖話の開発レポート](http://fjord.jp/love/890.html)
Mojoliciousアプリをmod_perlでデプロイする


## mod\_perlってまだいけるの？

PlackベースのStarmanやStarlet、そしてMonocerosなどの優秀なウェブサーバ全盛時代、そしてApacheよりもNginxのほうが流行な昨今、Apache mod\_perlが良い場合ってあるの？と聞かれることがあります。

- mod\_perl は今も開発が進められている
- とても安定している
- Apacheのノウハウがある技術者がそのノウハウを活用できる
- リバースプロキシをしたりしない分、 __ミドルウェアとして起動されるデーモンが一種類減ることになり、ある種の案件では喜ばれる__ 場合がある

## mod\_perl環境でMojoliciousアプリをデプロイする

これは簡単な話で、MojoliciousはPSGI環境に対応しているので、`Plack::Handler::Apache2` でデプロイしてやると良いです。

今回は Apache2.x と mod\_perl2 のみの話です。v1も同じような感じですが、あまり Apache1.3 と mod\_perl1 での Plack の活用事例がないので、逆に枯れていないのではないかという欠点もあります。

Apacheの設定ファイルに以下のように、Mojoliciousの設定ファルを指定してやるだけです。まさにplackup感覚。

```
  <Location />
  SetHandler perl-script
  PerlResponseHandler Plack::Handler::Apache2
  PerlSetVar psgi_app /path/to/app.psgi
  </Location>
```

`app.psgi` の作り方は、Mojoliciousアドベントカレンダー1日目の[Mojoliciousの様々な立ち上げ方](http://qiita.com/yusukebe/items/c9fb34096e61976f062f)を参照ください。

拙作ですが[ModPerl::PSGI](https://github.com/xtetsuji/p5-ModPerl-PSGI/) というものもあり、これはPlackとは違うApache mod\_perl上のPSGI実装となっています。設定も上記とほぼ同様に可能となっております。

私の手元ではテストが足りていないのですが、フルスタックで全てを搭載したMojoliciousではModPerl::PSGIが作るPSGI環境でも使えると考えています。Plackが依存するモジュールの多さがネックとなる特集な案件や環境では、Perl5.8コアとmod\_perl2コアのみにしか依存を持たないModPerl::PSGIの採用を検討してみるとよいかもしれません。質問などありましたらTwitter @[xtetsuji](https://twitter.com/xtetsuji) などでお知らせください。

## mod\_perl環境のMojoliciousアプリの注意点

Apache の prefork MPM を使っている場合、Mojoliciousのhypnotoadとは違って、1プロセスは同時に1リクエストしか同時に処理することができません。なのでApacheの設定である`MaxSpareServers`などの設定値を適切に設定する必要があります。

## プロセスが肥大化する場合の対策法

巨大なファイルを扱ったりしたあとの場合、解放されないメモリがあったり、mod\_perlと一体となっているApacheのpreforkした子プロセスのメモリが肥大化してサーバのメモリを食いつぶしたりする場合があります。

常套手段ではありますが一つの対策として、Apacheの`MaxRequestsPerChild`に最大リクエスト処理数を設定する方法があります。たくさんのリクエストを処理すればするほどプロセスサイズが肥大化しているだろうという仮定によります。

その他にmod\_perl2に標準付属している`Apache2::SizeLimit`を使う手があります。Apacheのpreforkされた子プロセスがリクエスト処理ごとに、自らのサイズを計って規定以上の大きさの場合は自分自身のプロセスを終了します(child terminate)。Apacheの親プロセスは、子プロセスが足りなくなれば新しい子プロセスを充当します。詳細は`Apache2::SizeLimit`のperldocを参照ください。
FuelPHP1.7でDB設定

FuelPHPでのDB設定についてです。


FuelPHPをインストール後、/app/config/development/db.phpにて
以下の用に設定していました。

```php
return array(
	'default' => array(
		'connection'  => array(
			'dsn'        => 'mysql:host=localhost;dbname=hoge;',
			'username'   => 'yourname',
			'password'   => 'yourpassword',
		),
	),
);
```

しかし、この設定では繫がらず、
調べてみるとdsnの部分でunix_socketを指定してあげる必要があるとのことでした。

なので、 dsnの部分に少し追加。

```php
'dsn'        => 'mysql:host=localhost;dbname=hoge;unix_socket=/tmp/mysql.sock'
```

ちなみにunix_socketの調べ方はターミナルにて以下のコマンドです。

```php
mysql_config --socket
```
4chanにはAPIがある。jqで投稿されてる画像URLのフィルタリングしてみっか...

ワイン美味しい！:wine_glass:

# 4chan API

[4chan](http://www.4chan.org/)というふたばっぽい海外の掲示板サイトがある。
そして4chanにはjson APIがある...ここに[document](https://github.com/4chan/4chan-API)がある。

foot cooking板のスレッド一覧であれば、
以下の形でAPIを叩けばスレッド一覧が取得できる。

```
curl https://a.4cdn.org/ck/0.json | jq '.' | head -15
```

![スクリーンショット 2013-12-09 22.12.47.png](https://qiita-image-store.s3.amazonaws.com/0/3985/365cd951-f552-ca08-accf-7abfc167f746.png)

# jqで成形

(既にjq使ってるけど...)
[jq](https://github.com/stedolan/jq)を使ってAPIを成形すると良さそうだと思ってる。
早速クエリを書こう！

クッキング板の画像一覧をAPIからフィルタするjqクエリを書いてみる。

## jqコマンド、クエリ、意気込み

```
curl https://a.4cdn.org/ck/0.json | jq '.threads[].posts[] | if .tim != null then [.tim , .ext] else empty end | map(tostring) | "http://i.4cdn.org/ck/src/" + .[0] + .[1]'
```

## 結果

![スクリーンショット 2013-12-09 22.09.08.png](https://qiita-image-store.s3.amazonaws.com/0/3985/2b4fd46b-1079-1042-b95b-2a67ab03473e.png)

画像イメージURL一覧がが取れる！食べ物画像が一杯だ！ワイワイ！

# 結論

[jq](https://github.com/stedolan/jq)は神(また言っちゃった)
mailto リンクの落とし穴（Android編）

Android のブラウザで mailto リンクを開くときに、subject の頭が大文字だと認識されず空になります。件名ではなく、subject という文字自体の話です。以下サンプル。

 * [mailto:?subject=abc&body=def](mailto:?subject=abc&body=def)
 * [mailto:?Subject=abc&body=def](mailto:?Subject=abc&body=def)
 * [mailto:?subject=abc&Body=def](mailto:?subject=abc&Body=def)

こんなしょーもないことで時間取られてしまったー
RubyMotionのためのScreencastsとか動画まとめ

まず最初に
[公式のDeveloper Center](http://www.rubymotion.com/developer-center/)にBooksやScreencastsが紹介されています

## RubyMotion動画

※動画はすべて英語

**motioncasts** http://motioncasts.tv/

* $12.99 USD/月
* 月1本 5分〜15分程度 (2012/07から)
* ページ内でなくmp4ダウンロードになった
* 解像度は良い・訛ってる・割高だと思う

:beginner: **Pragmatic Studio** - [RubyMotion Screencast](http://pragmaticstudio.com/screencasts/rubymotion) :8ball:

* 無料 50分 (2012/05ごろ)
* 聞きやすい
* まだ買ってない人やほとんど触れてない人は見ても良いかも

:seedling: **MotionInMotion** http://upcoming.motioninmotion.tv/

* 公開前、週一予定？
* とりあえずEmail登録しておくと良いと思う

:earth_americas: **YouTube カンファレンス等**

* [HipByte - RubyMotion: Introduction Video etc.](http://www.youtube.com/user/hipbyte)
* [Ruby Conf 12 - Inside RubyMotion by Rich Kilmer](http://www.youtube.com/watch?v=r4F4ZW8Go5o)
* [Rails Conf 2013 TDDing iOS Apps for fun and profit with RubyMotion](http://www.youtube.com/watch?v=7v3_t5SK8DM)
* [RubyMotion for Faster Client/Server Development](http://www.youtube.com/watch?v=n4S968Xln7o)
* :mag: [RubyMotionで検索](http://www.youtube.com/results?search_query=RubyMotion&search_sort=video_date_uploaded)

:european_castle: **RubyMotion #inspect 2013 Conference** http://www.rubymotion.com/conference/

* 動画 http://vimeo.com/groups/199097

**Big Binary - Learn RubyMotion**

http://bigbinary.com/videos/rubymotion

## Objective-C関連動画

:calling: **NSScreencast** http://nsscreencast.com/

* $9.00 USD/月
* 週1本 主に10分〜20分 (2012/02から)
* 頻度も動画の長さも扱ってるトピックもちょうど良い

:school: **CodeSchool** https://www.codeschool.com/paths/ios

* インタラクティブに問題を解く形式
* $29/月(他のRubyのコース等も含む)
* 無料コースやキャンペーンもよくやっている
* 説明の流れはとにかく分かりやすい
  * 出題はブラウザ内のコンソールやXCode上で解くものなど
  * 問題文の読解が難しい
  * iOS自体の仕組みとか（パターンとか座標の考え方とかレイヤーとか）よく説明している
  * スライド(PDF)が良い
* Screencastsもある [Code TV](https://www.codeschool.com/code_tv)

**AzamSharp channel** http://www.youtube.com/user/azamsharp/videos

* Learning iOS Development
* 月1、2本 10〜15分程度

## まとめ

一番のおすすめはNSScreencast :thumbsup:

ある程度iOSが分かってくると、RubyかObjective-Cかという点はあまり重要ではなくなってくる
結局はiOS
iOS7で大きく変わったように、定期的にAppleの変更に振り回されることにもなるし、
iOSの新しい機能なんか使いたければgemなどがあるわけではないので、自然とiOSのAPIをそのまま使うようになる

有料のものはやる気や時間がある時に、1、2ヶ月だけ支払いして一気に見るのも可能
サンプルコードを動かしてみたり、コードの流用をするのも良い


月に数回RubyMotion触ろうかなという感覚になるものの進まない人は
勉強会がベストと思う

#### RubyMotionのメリット

普段まとめる機会がないので考えてみた

* 簡単に書ける
  * メタプログラミング
  * 分かりやすく書きやすい（気軽に小さいメソッドに抽出できるとか）
* gitで管理しやすい
* クライアント/サーバー(Rails)が両方Rubyで書ける
  * 1つのプロジェクトで管理すると、名前の変更とか一貫してやりやすいとか
  * コマンドラインとエディタがあれば良い
* OSXアプリも作りやすい

RubyMotionを誰が使うべきかについては、やはりRubyをはじめとする軽量言語を主にやっている人かなと思う

そもそもObjective-C, XCodeであまり手を動かしてないので、個人的にあまりデメリットは感じない
Objective-Cで長くやっている人はけっこう意見があるらしい（静的チェック、補完、メモリ管理など）

個人的には、RubyMotionをきっかけにiOS, Objective-C, XCodeなどへの抵抗が減っていると感じる
普通にしてたら手を出さなかったであろうiOS, OSXアプリの開発ができるようになった点が良かった点と思う
Eclipseでの相対パスの設定

開発環境Eclipseで相対パスというか親ディレクトリを参照したいときの話です。
プロジェクトの外側にソースやらライブラリやらがある場合です。

例えば、
${PROJECT_LOC}
がプロジェクトの場所を表す変数だとして、
${PROJECT_LOC}/../../hoge
などと書くと思うのですが、いろいろ試してみたのですが環境などによってはうまく設定できないようです。
(条件がよくわかってないので実験不足かもしれません。)

そういうときは以下のように書くと同じ意味になるようです。
PARENT-2-PROJECT_LOC/hoge
なんだかちょっと違和感を覚える記法なんですけど普通なんでしょうか?

同じEclipse系のFlashBuilder4.7で試してみると
${PARENT-2-PROJECT_LOC}/hoge
だとうまくいきました。
微妙に違います(^_^;)

あとこのようなパスのライブラリの追加はFlashBuilderではプロジェクトプロパティのビルドパスから設定できますが、Eclipseはファイルの追加>拡張>ファイルにリンクで設定してからプロジェクトプロパティ>ビルドパスに設定という遠回りをしないといけませんでした。

しかしFlashBuilderはビルドパスから設定するとリンクされたリソース扱いにならないようです。
機能が制限されますというようなメッセージが出たのでファイルから設定したほうがいいかもしれません。

うーん。動いたんだけど、いまいち正解がわからない。
RecSys Handbook Chapter1 1.4~1.5

前回分はこちら↓↓
Chapter1 1.3　http://qiita.com/ru_pe129/items/9b024a4ac5cfa119e2fc

##1.4 Recommendation Techniques
　RSの役割を果たすためには、推薦するアイテムが推薦するに値する重要なアイテムであることを予測することが必要不可欠となる。つまり、RSはユーザーごとに各アイテムのユーティリティを予測する必要がある。

ここで、アイテムのユーティリティ決定モデルに関して提案された手法について説明する。今から述べる手法は一般的に協調フィルタリングに用いられている手法である。ユーザーuについてアイテムiが持つユーティリティをR(u,i)と表す。協調フィルタリングを用いたRSの基本的なタスクはR(u,i)を求めることに帰着される。つまり、あるユーザーuにはR(u,i)の大きいアイテムを推薦するということである。
　　
もちろん、アイテムのユーティリティをRSが完全に予測することはできない。また、ユーザーのユーティリティはcontextualによって分かる場合もある。例えば、ユーザーが初心者の場合と専門家の場合では推薦アイテムが異なる。また、ユーザーが推薦を要求したタイミングや場所によってもユーザーのニーズは変化する。このような情報を推薦に用いる場合、適切な推薦はさらに難しくなる。
　　
本書では適応分野、用いられる知識、アルゴリズムなどそれぞれが異なったいくつものRSを紹介するが、概要として以下にいくつか示す。

**内容ベース**：ユーザーが以前に好んだアイテムと似たアイテムを推薦を行う方法。たとえば、ユーザーが以前にコメディ映画によい評価を与えた場合、コメディ映画を推薦する

**協調フィルタリング**：あるユーザーと似た好みを持つユーザーがよい評価を与えたアイテムを推薦する方法。推薦システムの中ではもっとも人気かつ広く用いられている手法であると言われている。Chapter4やChapter5に記述される内容の説明が書かれてあるが、今回は省略する。

**デモグラフィック**：ユーザーのプロフィールなどのあらかじめ入力された情報を用いて推薦を行う方法。住んでいる地域、年齢、言語、職業など。

**知識ベース**：推薦を行う分野の詳細な知識を用いて推薦を行う方法。この手法では、ケースベースでの推薦となる。（ある種の特別な場合に扱う推薦手法ということだろうか…）

**コミュニティベース**：ユーザーの友達の好みを用いて推薦する方法。人は、類似しているが知らない人からの推薦よりも友人からの推薦を選択する傾向がある。ソーシャルネットワークの広がりによって関心が高まっている推薦方法である。推薦の精度については、協調フィルタリングと比較した場合、ケースバイケースという研究結果が出ている。たとえば、コールドスタート問題が存在するようなケースではコミュニティベースの推薦がうまくいくが、十分に情報が集まっている場合は既存の手法を上回る結果は得られていないようである。

**ハイブリッドRS**：複数の推薦手法を用いて互いの欠点を補うような推薦手法。

reduction-based, contextual post filtering, context modelingの3つの方法に関する違いが書かれていますが、英語力の不足により省略します…（いずれは追加します。）
　　

##1.5 Application and Evaluation
　RSの研究は商用利用や実際の運用に重点を置いて実施されてきたため、RSの研究には実際の運用を含んでいることが多い。ゆえに、RSの研究には、運用、メンテナンス、機能向上の3つのステージに分かれている。

RSを構築する上で最初に考えるべきことは、RSを利用するドメインである。ドメインの大まかな区切りは以下のとおりである。

<li>**エンターテイメント**・・・音楽や映画、IPテレビ（インターネットで見るテレビのこと？）など
<li>**E-コマース**・・・本やカメラ、パソコンなど
<li>**サービス**・・・旅行、住居の賃貸など
<li>**コンテンツ**・・・ニュースなど
もちろん、RSに対する関心の高まりとともに新たな分野への応用が期待されることも容易に予想され、その場合は上記のカテゴリー分けでは網羅できないだろう。

　RSの開発者には、RSの対象となるドメインに対する十分な理解が必要となる。なぜなら、対象ドメインの十分な理解なくしては効果的な推薦アルゴリズムを考えることは難しいからである。RSに用いることができる情報源をしっかり分析した上でアルゴリズムを考えるべきである。

RSの運用上の問題についてさらにピックアップしていく。RSを運用していく上で忘れてはならないのは推薦の「評価」である。そして、評価についてもRSを複数のステップに切り分けて考える必要がある。システムをローンチする前であればオフラインでの評価が中心となる。例えば、推薦したアイテムの評価（アルゴリズム）、ユーザーとのインタラクションとRSの比較、複数のアルゴリズムを使って推薦結果を比較するといった評価が挙げられる。もちろん、システムがローンチされてからも評価は不可欠である。システムのローンチ後はオンラインで評価を行う。オンラインで評価を行うことが不可能もしくはリスキーである場合には、小規模のユーザーグループにタスクを振ってテストを行って評価する場合もある。

* * *

お疲れさまでした。さて、いかがだったでしょうか？
イントロダクションということもあって技術的なことは少ない分、推薦システムに興味のある経営サイドの人も読んでおいて損はない内容だと思います。Chapter1は1.8まであります。イントロダクションだけはまとめて読んだほうが良さそうなので今週中に読みきりたいです。次回もよろしくお願いいたします。
新・三大JavaScript タッチ対応ライブラリ比較(Hammer.js/QuoJS/ TouchSwipe)

モバイルデバイス全盛の昨今、サイトのデザインだけでなく動きも対応しなくては！というケースがあります（私はありました）。

そんなわけで、JavaScriptのタッチ対応ライブラリについて評価を行ってみました。ライブラリの一覧については[こちらのサイト](http://www.queness.com/post/11755/11-multi-touch-and-touch-events-javascript-libraries)が詳しく、ここから対応イベント・更新頻度を基に評価対象を表題の３つに絞り、その動作を比較してみました。

各ライブラリによるタッチの挙動は、以下で比較可能です(おまけでTouchyも入ってます)。

**[Gesture Detector](http://jsfiddle.net/icoxfog417/uQBvP/embedded/result/)** 

今スマホやタブレット的な何かでこの記事を読まれているあなた！はぜひ実際に動かしてみて下さい。
私はAndroid4.0デバイスしか持ってないので、xxで動かんぞ、ということがあるかもしれないです。そんな時はコメントなどで連絡いただけたらうれしいです。また、コードは[こちら](http://jsfiddle.net/icoxfog417/uQBvP/)。

## 結論
**結論としてはHammer.jsをお勧めしたい。**ただ、１つに絞るならという話で、QuoJSも遜色ない。
デバイス・ブラウザの数は今後も増えていくはずで、そうなるとこうしたライブラリを選択する際「メンテナンスの継続性」は一番考慮すべきポイントと思う。そうなると、開発者以外の人の手で機能拡張プラグインなどがリリースされているHammer.jsにやはり軍配かなと。

以下は、簡単な所感。

| ライブラリ | 所感 |
|:-----------|:------------|:------------|
| [Hammer.js](http://eightmedia.github.io/hammer.js/) |対応イベントは豊富で精度もいい。カスタムジェスチャー・プラグインなどを追加可|
| [QuoJS](http://quojs.tapquo.com/)       | 必要十分なイベントを十分な精度で検知してくれる。優秀。 |
|[TouchSwipe](http://labs.rampinteractive.co.uk/touchSwipe/demos/) | 不安な実装だが、指の数やジェスチャーの時間など結構細かいパラメーターをくれる。|

**＜他ライブラリについて＞**
[jQuery.pep.js](http://pep.briangonzalez.org/)
ドラッグ＆ドロップ特化だが、特化している分惚れ惚れするほど動きが滑らか。ぜひリンクからサンプルを試してもらいたい。ドラッグ＆ドロップの実装が必要なら、これ＋不足分を上記のライブラリでカバー、というスタイルをおすすめしたい。

[Touchy](http://touchyjs.org/)
Exampleが面白い。タッチイベント全般というよりは特定のジェスチャー(FlickやWheel)に特化している感じで、そうしたジェスチャーがまさに必要なら上記のようなライブラリで対応するより滑らかに動いてくれるはず。ただ、mouseイベントに一切反応してくれないのでPCサイトと共用したいならちと面倒。

[jQuery UI Touch Punch](http://touchpunch.furf.com/)
一言で言えば動かない。jQuery UIをタッチ対応させるというコンセプトは非常に良くjQuery touch で検索しても結構ヒットするのだが、Exampleは動かずissueも放置されている。もう更新は止まっている？

以下、詳細。

## Hammer.js
単体として使うだけでなく、jQuery Pluginとしても導入できる。ジェスチャー検知時のオプションも豊富で、環境によってのチューニングもできそう。また、カスタムのジェスチャーも実装可能。ただ、rotateについてはQuoJSのようにLeft/Rightがないので注意。
機能拡張用プラグインも幾つかありより高度なタッチ機能を実装していきたいなら発展性があるHammer.jsは魅力だと思う。

## QuoJS
対応しているイベント、検知精度、共に十分。ライブラリはjQueryライクな実装で使いやすく、jQueryでサポート外となってしまったbrowserなどが取れるのもモバイル対応時にはありがたい。
ただ、タッチイベント対応時に必須なpreventDefaultを行う機能がライブラリ標準でないので、これは自分で行っておく必要がある(いつか対応される気もするが)。これをやっておかないと悲惨なのでその点は要注意。

## TouchSwipe
ExampleのPinch In と Outが逆な気がしたり(ソースを見るかぎりほんとに逆？)、動作が不自然だったりと不安なオーラを放っている・・・が、イベント発生時取得できる情報が多いためカスタマイズの幅は広いと思う（独自ジェスチャーを作るなど）。
CappedCollectionのススメ


Gunosyではログ解析周りや推薦エンジンでMongoDBを使っています。
ちょっと前に[勉強会でMongoDBのMapReduceでログ解析やってるよ](https://speakerdeck.com/ymatsuwitter/gunosyfalseshu-zi-zhu-yi-wozhi-eruji-shu)って話をしたところ、

* MongoDBのMapReduceって遅くない？
* データ量増えるとリソース相当使わない？

とのツッコミを頂きました。
指摘自体は正しいと思っていて、データ増えるとすぐ計算時間やサーバのリソース使用量が大変なことになります。

それを避けつつ、節約して運用するためにGunosyのログ解析周りではCapped Collectionを使ってます。

## Capped Collectionって？
ご存知の方も多いと思いますが、念のため[本家](http://docs.mongodb.org/manual/core/capped-collections/)から引用すると、

```
Capped collections are fixed-size collections that support high-throughput operations that insert, retrieve, and delete documents based on insertion order.
```
要はサイズ固定で高速に使えるcollectionだと思っていただければ結構です。

**長所**

* サイズ固定なので不用意にリソースを使用し過ぎることがない
* 割と高速

**短所**

* 後からcapサイズが変更しづらい。（できなくもないです）

----

Capped Collectionを利用する場合は以下のコマンドで確認できます。

```js:
// 新しくコレクションを作る場合
db.createCollection( "mycol", { capped: true, size: 100000 } )

// すでにコレクションが存在する場合
db.runCommand({"convertToCapped": "mycoll", size: 100000});
```

コレクションのstatsを見れば、cappedになっているか確認できます。

```js:
> db.mycol.stats()
{
	"ns" : "test.mycol",
	"count" : 0,
	"size" : 0,
	"storageSize" : 12288,
	"numExtents" : 1,
	"nindexes" : 1,
	"lastExtentSize" : 12288,
	"paddingFactor" : 1,
	"systemFlags" : 1,
	"userFlags" : 0,
	"totalIndexSize" : 8176,
	"indexSizes" : {
		"_id_" : 8176
	},
	"capped" : true,
	"max" : NumberLong("9223372036854775807"),
	"ok" : 1
}
```

## どう使っているか
以下の2点に注意してログ解析部分に使っています。

* 解析項目に合わせてログフォーマットを毎度用意している
* 計測に必要なログの保存日数に合わせてCapサイズを決定している。

解析では生のアクセスログを殆ど使っていません。
ログ解析もサーバのコードも同じ人間が担当するので、解析項目に合わせて新しく必要最低限のデータのみ送信するロガーを適宜実装して、同時にログ集計用スクリプトも用意する形になっています。（このへんはFluentd使っている）

アクセスログだとどうしてもpathだとかリクエストのパラメタだとかが入ってしまうので、collectionサイズが肥大化してしまいますが、解析項目に対して本当に必要なデータのみMongoDBへ保存するとそれほど容量は使いません。

ちなみに生のアクセスログも一応MongoDBへCapかけて保存していますが、ほとんどはS3へ保存→Redshiftへ、という流れになってます。

この運用だと、解析自体もそれほど大きなリソースを使わず今のところ維持できています。

## この運用の欠点
長期間のデータを後から解析したくなったときは、Collection内にそれほど長期のデータが保存できていないので、ここは社内だとRedShiftを利用しています。

## まとめ
Capped Collectionをうまく使うとそれなりの規模でもリソースを節約しながら性能を維持してMongoDBを運用できますよという話。
MRI(CRuby)とJRuby用のgemをGemfileで管理したい

Norikraを使い始めた所為でJRubyを使わなければならなくなってしまった、世間には良くある光景である。同じリポジトリで設定を管理したいので、次の様なディレクトリ構成にした。

```
.
├── Gemfile
├── Gemfile.lock
├── lib
│   ├── fluentd
│   │   ├── .ruby-version
│   │   └── fluent.conf
│   └── norikra
│       └── .ruby-version
└── scripts
    ├── fluentd
    └── norikra
```

fluentdとnorikraはそれぞれscriptsディレクトリに置いたスクリプトをたたくことで実行している。各Ruby処理系はrbenvで管理されていて、`.ruby-version`でスイッチして運用している（別にスクリプトの中でスイッチしても良い）。最初はそれぞれのディレクトリにGemfileを置いていたけど`platforms`を使えば1つにできることを知った。

```rb
source "https://rubygems.org"

platforms :ruby do
  gem "fluentd"
  gem "fluent-plugin-typecast"
  gem "fluent-plugin-forest"
  gem "fluent-plugin-mongo"
  gem "fluent-plugin-flatten-hash"
end

platforms :jruby do
  gem "norikra"
end
```

このように書くと`bundle install`を実行した処理系に応じてgemがインストールされる。1つにまとめられて便利だ。
Mroonga (Groonga)のメモリリークを簡単に確認するには

# はじめに

MySQLで高速に全文検索するためのオープンソースのストレージエンジンとして[Mroonga](http://mroonga.org/ja/) (むるんが)を公開しています。
最新のバージョンは2013年11月29日にリリースした[3.10](http://mroonga.org/ja/docs/news.html#release-3-10-2013-11-29)です。

今回は、Mroonga(もしくはGroonga)のメモリリークが疑わしいときに確認する方法を紹介します。

# 最近のメモリリークの話題

去年の4/29にリリースしたMroonga 2.02から1ヶ月ちょい前の10/29にリリースしたMroonga 3.09まで、全文検索をする（MATCH AGAINSTを使う）たびに336バイトずつメモリリークするバグがあるということが明かになりました。

これ実はメモリリークしてない?と思ったときに簡単に確認する方法があると良いですね、ということになるわけですが、実はすでに用意されています。

# メモリリークを確認しよう

## Mroongaの場合

Mroongaの場合、mroonga_command("status")を実行して、alloc_countの値を確認しましょう。
それが際限なく増えていくと Mroonga または Groonga に メモリーリークの疑いがあります。

```
SELECT mroonga_command("status");
```

```sql
mysql> SELECT mroonga_command('status');
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| mroonga_command('status')                                                                                                                                                             |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| {"alloc_count":573,"starttime":1386574922,"uptime":8322,"version":"3.1.0","n_queries":0,"cache_hit_rate":0.0,"command_version":1,"default_command_version":1,"max_command_version":2} |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.10 sec)

```

## Groongaの場合

Groongaの場合はstatusコマンドを実行します。

GroongaのHTTPサーバ機能を使っているなら、http://サーバーIP:10041/d/statusにアクセスすることでも確認できます。

```
curl http://localhost:10041/d/status    
```

次のような結果が得られます。同じようにalloc_countを確認しましょう。

```
[[0,1386583179.92117,0.110098361968994],{"alloc_count":149,"starttime":1386574937,"uptime":8243,"version":"3.1.0","n_queries":0,"cache_hit_rate":0.0,"command_version":1,"default_command_version":1,"max_command_version":2}]
```

# メモリリークを確認できたら?

メモリリークについてメーリングリスト groonga-dev@lists.sourceforge.jp まで報告してもらえると、不具合修正をしてMroonga (もしくはGroonga)を安心して使えるように改善していけるので嬉しいです。
Yubikey でHOTP

持ってれば別に誰もがやってることなんだが軽くメモっとく。

 * Yubikeyのツール (マルチプラットフォーム) で設定できる
 * 6digits入力するだけの場合は OATH Token Identifier は切る
 * TOTP対応はない。まぁ時計がないので仕方ない
 * Secret Key (20 bytes Hex) を字面通りusersファイルに突っ込む (プロトコルは"HOTP")
 * カウンタの開始位置はオプション。多分Fixed Zeroが簡易で良い。

わかっていれば、一番めんどくさいのはSecret Keyの入力。

以前の方法と絡めてsshも出来たしYubicoが提供してるIdPのプラグインとも普通に連携した。
これだからOATHは良い。大好き。おくら！

ただ、私が開発用マシンでやるTOTPのSecret Key使い回しという暴挙がHOTPでは出来ない。
つまり安易にもっそもといろんな端末でYubikey一個でうっはうは、が出来ない。ぐすん。

デバイスという観点で見ると何か汚いところに置いとくと死にそう。これは主に実験用。
わぁいTOTP。あかりTOTP大好き。

なお、NeoはNFCがついてる。わぁいNFC。
Phalcon PHPの翻訳チームにジョインした話



日頃お世話になっているプロダクトに少しでも貢献できればいいな
ということでPhalconの翻訳チームにジョインしました。

参加も翻訳もとても簡単に始められます。
興味がある人、一緒にやってみませんか？

#目次
1. 英語できなくても翻訳できるの？
2. 翻訳チームにジョインする
3. 翻訳の流れ


#1. 英語できなくても翻訳できるの？

できます。
工夫次第でやり方はたくさんあると思います。

下記で２つほど紹介いたしました。ご参考までに。

[英語が苦手でもできるドキュメント翻訳、2つの方法](http://qiita.com/nntsugu@github/items/38e1cebd23efe99a0317)


#2. 翻訳チームにジョインする

##2-1. Transifexにアカウントを作る
Phalcon PHPのドキュメント翻訳は[Transifex](https://www.transifex.com)というサービスで管理されていますので、アカウントを作成してください。

　　[Transifex](https://www.transifex.com)

##2-2. Phalcon翻訳チームに参加申請する

　　[Phalcon翻訳プロジェクトページ](https://www.transifex.com/projects/p/phalcon/)

赤線で囲んだ"join team"ボタンからチームへの参加申請ができます。

![Screen Shot 2013-12-09 at 6.17.12 PM.png](https://qiita-image-store.s3.amazonaws.com/0/14859/20434026-2d60-b155-89f5-7913d3915a6f.png)


特に問題なければ、翻訳チームのCordinatorのnidenさんが承認してくれます。
nidenさんはあまりチェックしていないのか、しばらく時間がかかります。
僕の場合は参加申請してから10日ほど経ってから承認していただきました。


#3. 翻訳の流れ

　ほぼTransifexの使い方紹介です。

##3-1. どこで翻訳するの？

　　[日本語への翻訳チームのリポジトリ](https://www.transifex.com/projects/p/phalcon/language/ja/)

　　の"website"リンクを押下したら表示されるポップアップにある"Translate now"というボタンを押下すると、翻訳用のページに入れます。
　　チームにジョインした後でないと入れません。

##3-2. 翻訳するアイテムを探す

![Screen Shot 2013-12-09 at 7.02.36 PM.png](https://qiita-image-store.s3.amazonaws.com/0/14859/16e5db67-c06e-bfff-b0d3-d6b51ab213dd.png)

##3-3. 翻訳する

![Screen Shot 2013-12-09 at 7.05.48 PM.png](https://qiita-image-store.s3.amazonaws.com/0/14859/155a890f-c558-e3d8-7531-5b97e490521a.png)

##3-4. レビュー依頼を出す

翻訳し終わったら、Saveボタンを押下して、監訳者にレビュー依頼をだします。
![Screen Shot 2013-12-09 at 7.16.28 PM.png](https://qiita-image-store.s3.amazonaws.com/0/14859/d69922ec-ddfb-6095-1ef6-0e648810b418.png)


##3-5. フィードバックに対応する

実はまだレビューしてもらった事がないので
ここから先はレビューのフィードバックを受けた後に書きますねー。

#終わりに

ざっとですが、Phalcon PHPの翻訳チームに参加した話をご紹介させていただきました。
プロダクトに貢献できるし、(このチームではまだですが、)監訳者を通してニュアンス込みの英文法を学ぶ事も出来ます。
興味がある方、一緒にどうですか？

----

明日は @Hiraku さんのIteratorとかまとめます話です。お楽しみに！
DJangoメモ：はじめから（管理画面を使う編）　　myハマりポイント

今回からチュートリアル２に突入
http://www.djangoproject.jp/doc/ja/1.0/intro/tutorial02.html#intro-tutorial02

### ちなみにもうハマってはいませんが、あえて当時の内容のままで残しておきます。 ###
ちなみに自分の環境ではpythonが2.7.5、DJangoは1.6です。
#### adminページを使用する ####

まずはsettings.pyを確認

###### settings.py ######

```py
# この部分
INSTALLED_APPS = (
     'django.contrib.admin',   # これが必要。自分の場合デフォルトで入っていたが
     'django.contrib.auth',
     'django.contrib.contenttypes',
     'django.contrib.sessions',
     'django.contrib.messages',
     'django.contrib.staticfiles',
     'django.contrib.sites',
     'polls'
 )

```

追加した場合は再度

```
python manage.py syncdb
```

を実行。アプリケーションを追加したらデータベースも追加するのがセオリーっぽい。
次にurls.pyを編集。ここでちょっと困ったことになった。

###### urls.py ######
チュートリアルでは

```py
from django.conf.urls.defaults import *

from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    # Example:
    # (r'^mysite/', include('mysite.foo.urls')),

    # Uncomment the admin/doc line below and add 'django.contrib.admindocs'
    # to INSTALLED_APPS to enable admin documentation:
    # (r'^admin/doc/', include('django.contrib.admindocs.urls')),

    # Uncomment the next line to enable the admin:
    (r'^admin/(.*)', admin.site.root),
)
```

という風に記述しているのでとりあえずその通りにして、

```
python manage.py runserver
```

この後 http://127.0.0.1:8000/admin/ に行けばログイン画面が表示されるはずだった。
しかし、結果はエラー。メッセージは
>ImportError at /admin/
>
>No module named defaults

バージョンの違いのせいかもしれないと思い（チュートリアルは1.0を想定しているが自分は1.6なので）、編集前の状態に戻してみる。実は編集する前から以下のようなそれらしい記述があった。

```py
from django.conf.urls import patterns, include, url   # デフォルトで入っていたimport文
 
from django.contrib import admin
admin.autodiscover()
 
urlpatterns = patterns('',
    # Examples:
    # url(r'^$', 'myDj.views.home', name='home'),
    # url(r'^blog/', include('blog.urls')),

    url(r'^admin/', include(admin.site.urls)),   # どの例も()の前にurlが付いている
)
```

やっていることは同じに見えるのでおそらく書き方が変わったのだろうと考え、起動してアクセス。
が、またしても駄目。ただしエラーメッセージはさっきと違う。
>ImproperlyConfigured at /admin/
>
>You're using the Django "sites framework" without having set the SITE_ID setting. Create a site in your database and set the SITE_ID setting to fix this error.

よく分からない。
「サイトIDを設定しろ」と言われているのは何となく理解できるものの、それって一体どうやるの？
エラーメッセージでググっても今ひとつピンと来ないし

苦肉の策で今度は間を取った書き方をしてみた。

```py
from django.conf.urls import patterns, include, url   # ここは失敗しないほうを採用 

from django.contrib import admin
admin.autodiscover()
 
urlpatterns = patterns('',
    # デフォルトの記法　url(r'^admin/', include(admin.site.urls))
    # チュートリアルの記法　(r'^admin/(.*)', admin.site.root)
    url(r'^admin/(.*)', include(admin.site.root))
```

すると、
>AttributeError at /admin/
>
>'AdminSite' object has no attribute 'root'

以上が当時の内容です。

現在はコメントのおかげで解決しました（投稿してよかった）。
【JavaScript】配列(のようなオブジェクト)から最大値を取り出す(argumentsの利用)

こんにちは。

```js
function max(){

  //変数の宣言
  var result = 0 ;

	for(var i = 0; i<arguments.length; i++){
		if(arguments[i] > result){
			result = arguments[i];
		}
	}
	//最大値を返す
	return result;
};

var maxValue = max(8, 100, 20, -6, 8000, 29, 68);
output(maxValue);

```

なんとかしっくり着たので、メモ。

今回は配列の中から、最大値を取り出そうというもの。

まず ```js arguments ``` ですが
Argumentsクラスのオブジェクトは関数が呼び出されるときに自動的に作成され、
呼び出された関数の中でだけ使われる。

そのため ```js arguments.length ``` で
その要素の分だけ、取り出すことが可能になります。

```js
	for(var i = 0; i<arguments.length; i++){
		if(arguments[i] > result){
			result = arguments[i];
		}
	}
```

これで言ってしまうと、要素の数がいくつかわからなくても、
格納されている分だけ、ループを行うことが可能。

```js
		if(arguments[i] > result){
			result = arguments[i];
		}
```

そしてここで、もしresultの中身がargumentsに格納された値よりも大きい場合
resultに値を格納。

こんな感じですね。
もし何か間違いなどありましたら、ご指摘願います。

それでは、これからもよろしくお願いいたします。
before_validate でbooleanにtrueをいれたら常にtrueになった

before_validate :set_defaults

def set_defaults
  hoge ||= 'fuga'
end

というのをrailsのmodelクラスで書くのだが、これがhogeの型がbooleanの場合

before_validate :set_defaults

def set_defaults
  hoge ||= true
end

とかくと、hogeがfalseの場合、問答無用でtrueが入るため、必ずtrueになるという悪魔の値になってテストがこけて俺が死ぬ。
cmderの日本語フォントの幅を治す

## 参考

* [cmder](http://cmder.net/)
* [cmder - 洗練されたUIのWindows用コンソール| moongift](http://www.moongift.jp/2013/12/cmder-%E6%B4%97%E7%B7%B4%E3%81%95%E3%82%8C%E3%81%9Fui%E3%81%AEwindows%E7%94%A8%E3%82%B3%E3%83%B3%E3%82%BD%E3%83%BC%E3%83%AB/)さんの紹介をみて入れてみた。

## 日本語表示幅を直す

* `settings -> Font -> Monospace` のチェックを外せばOKです。
GVMを使って複数バージョンのGoを便利に切り替える


GVMは、RubyのRVMのGo版のようなものです。

GVMをインストールすると、自動的にGOROOTとGOPATHが定義されます。後述していますが、GOPATHの管理は面倒なので、GVMにやってもらうと楽です。

[GitHub:moovweb/gvm](https://github.com/moovweb/gvm)

## インストール

```bash < <(curl -s https://raw.github.com/moovweb/gvm/master/binscripts/gvm-installer)```

読み込ませる

```source ~/.gvm/scripts/gvm```


## Linux環境の前提

下記のパッケージが必要です。

* curl
* make
* binutils
* git
* mercurial
* bison
* gcc

## Mac環境の前提

* mercurial
* Xcodeコマンドラインツール

## FreeBSD環境の前提

* bash
* git
* mercurial

## 使い方

### バージョン指定してgoをインストール

```gvm install go1.2```

### 切り替え

```gvm use go1.2```

### インストールされているgoの確認

```gvm list```

```
gvm gos (installed)

   go1
=> go1.2
```

=> この印が現在アクティブになっているgoですね。

## GOROOTと、GOPATH

標準では、

```
/home/user/.gvm/gos/go1.2
/home/user/.gvm/pkgsets/go1.2/global
```

ここになっています。

GOPATHを作ったりするには、gvm pkgsetを使います。

```
$ gvm pkgset create mygopath
$ echo $GOPATH
/home/user/.gvm/pkgsets/go1.2/global

$ gvm pkgset use mygopath
Now using version go1.2@mygopath
$ echo $GOPATH
/home/user/.gvm/pkgsets/go1.2/mygopath:/home/user/.gvm/pkgsets/go1.2/global
```

pkgsetを消すには、```gvm pkgset delete mygopath```のようにします。
Jenkinsでgitリポジトリ上の特定のファイルが変わってたら何かしたいとき

下記のようなスクリプトをビルドのシェル実行に書きます。

```bash
FILE=/path/to/file
CHANGED=`git diff --name-only $GIT_PREVIOUS_COMMIT $GIT_COMMIT -- $FILE`
[ -z "$CHANGED" ] && exit 0

echo "do it! do it!"
```

## メモ

- git絡みの環境変数ってどこに記載ある？
  - [ページの一番下](https://wiki.jenkins-ci.org/display/JENKINS/Git+Plugin#GitPlugin-Environmentvariables)にあります。
【JavaScript】オブジェクトの作成

こんにちは。

いつも通りドツボにはまっていました。


最初に定義して、個数*値段をだすプログラムです。
最初に書いたコード

```js
function Calc(name, price, number) {
  this.name = name ;
  this.price = price ;
  this.number = number ;

}

var calc = new Calc("じゃがいも", 30, 16);

calc.data = function(totalPrice) {
  var totalPrice = totalPrice
  this.price * this.number ;
  totalPrice = this.price * this.number ;
  return totalPrice ;
}

calc.result = function() {
  return "１個" + this.price + "円の" + this.name + "を" + this.number + "個買ったので、合計" + this.totalPrice() + "円になりました。";
}

output(calc.result());
```

エラー内容

```
Object # has no method 'totalPrice'
```

なかなか答えにたどり着かず...
そしてようやくたどり着きました。
メソッドがないとか、定義されていないetc...
いろいろと調べていくうちに気づきました。

calcを呼び出した後、totalPriceを呼んでないからメソッドを持っていないんじゃないかなぁと。
下記文で解決。

```js
function Calc(name, price, number) {

  this.name = name ;
  this.price = price ;
  this.number = number ;

}

var calc = new Calc("じゃがいも", 30, 16);


calc.totalPrice = function(totalPrice){
  var totalPrice = totalPrice ;
  totalPrice = this.price * this.number ;
  return totalPrice ;
}

calc.result = function() {
  return "１個" + this.price + "円の" + this.name + "を" + this.number + "個買ったので、合計" + this.totalPrice() + "円になりました。";
}

output(calc.result());
```

こう何回か書いていく中で、returnの使い方も理解してきて

```js
calc.totalPrice = function(){
  totalPrice = this.price * this.number ;
  return totalPrice ;
}
```

returnでtotalPriceを返しているので
（）にtotalPriceを入れる必要はなさそうですね。

それでは、これからもよろしくお願いいたします。
git pushしたときのエラー


pushしたときに、下記のようなエラーでできない場合
参考サイトまんまですが。。。

```
git -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree push -v origin develop:develop 
Pushing to hoge@xxx.xxx.xxx.xxx:/path/to
remote: error: refusing to update checked out branch: refs/heads/develop        
remote: error: By default, updating the current branch in a non-bare repository        
remote: error: is denied, because it will make the index and work tree inconsistent        
remote: error: with what you pushed, and will require 'git reset --hard' to match        
remote: error: the work tree to HEAD.        
remote: error:         
remote: error: You can set 'receive.denyCurrentBranch' configuration variable to        
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into        
remote: error: its current branch; however, this is not recommended unless you        
remote: error: arranged to update its work tree to match what you pushed in some        
remote: error: other way.        
remote: error:         
remote: error: To squelch this message and still keep the default behaviour, set        
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.        
To hoge@xxx.xxx.xxx.xxx:/path/to
 ! [remote rejected] develop -> develop (branch is currently checked out)
error: failed to push some refs to 'hoge@xxx.xxx.xxx.xxx:/path/to'
Completed with errors, see above
```

設定確認

```
$ git config --get-all core.bare
false
```

変更

```
$ git config --bool core.bare true
```

再度確認

```
$ git config --get-all core.bare
true
```

`git config --add receive.denyCurrentBranch ignore` で対応するのは良くないらしい。

さらに、下記のようなエラーの場合、

```
git -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree push -v origin develop:develop 
Pushing to hoge@xxx.xxx.xxx.xxx:/path/to
To hoge@xxx.xxx.xxx.xxx:/path/to
 ! [rejected]        develop -> develop (non-fast-forward)
error: failed to push some refs to 'hoge@xxx.xxx.xxx.xxx:/path/to'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Merge the remote changes (e.g. 'git pull')
hint: before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
Completed with errors, see above
```

`git pull`したら、なおる。


おしまい。

***
参考サイト

* [リモートリポジトリへの git push に失敗した場合 (remote rejected)](http://nilfigo.hatenablog.com/entry/2013/08/09/145435)

* [git config --add receive.denyCurrentBranch ignoreはどう危険なのか](http://d.hatena.ne.jp/nishiohirokazu/20120416/1334548800)
Rubyのクラス変数、インスタンス変数

インスタンス変数同様に、クラスでも`@`を使ってクラス変数を操作することができる。

```rb
class Foo
	class << self
		attr_reader :hoge
		attr_reader :moge
		def c_method
			@hoge = 'hoge'
		end
	end

	attr_reader :hoge
	attr_reader :moge
	def i_method
		@moge = 'moge'
	end 
end

Foo.c_method
foo = Foo.new
foo.i_method

p Foo.hoge  #=> "hoge"
p Foo.moge  #=> nil
p foo.hoge  #=> nil
p foo.moge  #=> "moge"
```
SCM Creatorで作ったgitリポジトリにpushする時(一人用)

バッドノウハウです。

[SCM Creator](http://projects.andriylesyuk.com/projects/redmine-svn)を使うと`/var/opt/alminium/git/`以下にリポジトリが作成される。

```bash:testrepo作ったのでローカルにclone
git clone server:///var/opt/alminium/git/testrepo
```

したのはいいですが、
`git push`の時apacheのユーザ権限でpushする必要がある。

webdavを使って公開すればよいですが面倒だったのでパーミッションを変更した。

```bash:
sudo chown $USER /var/opt/alminium/git/testrepo
```

これでgit push出来ます。
CoffeeScriptで日本語の桁区切り (例 123456789 -> 1億2345万6789)

CoffeeScriptで数字を
1億2345万6789
などと日本語の桁区切りで表示する関数 Beautify.jpn です。

```coffeescript:beautify.coffee
class Beautify
    @jpn: (val) ->
        unit = ['', '万', '億', '兆', '京', '垓']
        num_arr = String(val).replace(/(\d)(?=(\d\d\d\d)+$)/g, "$1,").split(",").reverse()
        num_arr2 = (
            num.replace(/^[0]+/g, '') + (if num is "0000" then "" else unit[i]) for num, i in num_arr
            )
        return (
            num_arr2.reverse().toString().replace(/,/g, '')
            )

console.log Beautify.jpn(123456789) # 1億2345万6789
console.log Beautify.jpn(120000789) # 1億6789
```
iBeacon 関連ニュースをツイートする bot つくった

iBeacon 関連ニュースをツイートする bot をつくりました。
Googleアラート(日本語と英語)で "iBeacon"  を引っ掛けて、そのRSSを dlvr.it というサービスを使ってTwitterに投稿してます。

フォローよろしくお願いします。
https://twitter.com/iBeacon_bot

ちなみに Google アラートの RSS はこちら。
日本語 http://www.google.com/alerts/feeds/15591318094035783482/6940602426247804619
英語 http://www.google.com/alerts/feeds/15591318094035783482/1542393454825090376

以上。
Mojoliciousの内部のnamespace/pathについて確認

例えば

```
$ mojo generate app MyApp::Web
```

としてつくった時にControllerは `MyApp::Web::Example.pm` などのように配置されます。より細かくディレクトリを構造化したい場合にはそうじゃなくって `MyApp::Web::Controller::Example.pm` に置きたいかもしれませんね。そんな時はRoutingするところのnamespaceをいじります。

```pl:lib/MyApp/Web.pm
$r->namespaces([qw/MyApp::Web::Controller]);
```

この ` Mojolicious::Routes ` オブジェクトの `namespaces` は配列リファレンスを格納していてデフォルトだとこの場合 `MyApp::Web` が入っているので、そのままだとそれ以下のモジュールをControllerとみなしているのです。「配列に格納」ってことは上記のように一つだけのnamespaceの名前空間を値として一個だけ入れるんじゃなくて複数入れることも出来ます。そして配列の先頭から優先的にControllerをみつけていく流れになります。

この辺り簡単に以下のようなwarnダンプでも確認出来ます。

```pl:lib/MyApp/Web.pm
unshift $r->namespaces(), 'MyApp::Controller';
use YAML;
warn Dump $r->namespaces();
```

```
- MyApp::Controller
- MyApp
```

実はControllerのnamespace以外にも諸々ロードするパスなどを `lib/MyApp/Web.pm` ファイル内を変更することで可能です。これらも基本的に配列で保持され先頭の値を優先的に読む仕様になっている（はず！

例えばスタティックファイルを置いているパスを追加するには

```pl:lib/MyApp/Web.pm
unshift @{$self->static->paths}, '/home/yusuke/public';
```
とすればよいし、テンプレートを置く場所も

```pl:lib/MyApp/Web.pm
unshift @{$self->renderer->paths}, '/home/yusuke/templates';
```
と書けばパスを追加出来ますね。

ってことで、namespaceやパスを変更する方法とそしてダンプすればだいたい分かるよ！ってことを書きました。
案: HTMLを遅延生成するCMSとか

mod_rewriteを使ってこういうのどうだろうか。mod_rewiteのコストが気になるところ。

## 初回アクセス時

1. ID 123の画面を表示するリクエスト: `GET /items/123`
2. ファイルがないなら、CGI的なプログラムを起動
3. ID 123の情報とテンプレートを組み合わせてHTML生成
4. `DocumentRoot/items/123`に静的HTMLを保存
5. HTMLを返す

## 二回目以降

1. ID 123の画面を表示するリクエスト: `GET /items/123`
2. ファイルがあるなら、返す

## 更新

1. ID 123の情報を更新、DBに格納
2. ファイル`/items/123`を削除
手軽に構造体を使いたい時にOpenStruct

* [OpenStruct](http://docs.ruby-lang.org/ja/2.0.0/class/OpenStruct.html)

> 要素を動的に追加・削除できる手軽な構造体を提供するクラスです。
> OpenStruct のインスタンスに対して未定義なメソッド x= を呼ぶと、 OpenStruct クラスの BasicObject#method_missing で捕捉され、そのインスタンスに インスタンスメソッド x, x= が定義されます。 この挙動によって要素を動的に変更できる構造体として働きます。

# 手軽に使える
```rb
require "ostruct"

config = OpenStruct.new
config.level #=> nil
config.level = :debug
config.level #=> :debug
```
ぉー。確かに手軽かも。

# 初期値はハッシュ
```rb
require "ostruct"

config = OpenStruct.new(level: :debug, file: "log/test.log")
config.level #=> :debug
config.file  #=> "log/test.log"
```
初期値はハッシュ形式で渡せるそうです

# OpenStructの子クラスを作る

何となく『初期値は最初から持っといてよ』って思ったので。
例を書くと下記のような感じかな？

```rb
def start(config = MyApp::Config.new)
  config.level
end
```

というわけで、次からサブクラスの初期化に含めてみます

```rb
require "ostruct"

module MyApp #他のアプリと当たらないように
  class Config < OpenStruct
    def initialize
      self.level = :debug #レシーバを指定しないとローカル変数になるので
    end
  end
end

def start(config = MyApp::Config.new)
  p config.level
end

start
```

## 実行

```bash
/ruby-1.9.3-p392/lib/ruby/1.9.1/ostruct.rb:172:in `method_missing': undefined method `[]=' for nil:NilClass (NoMethodError)
	from test.rb:6:in `initialize'
	from test.rb:11:in `new'
	from test.rb:11:in `start'
	from test.rb:15:in `<main>'
```
おや？

### 少し調べる

『何か初期化でしているのかな？』と思い、とりあえずインスタンス変数を出してみる

```rb
p OpenStruct.new.instance_variables #=> [:@table]
```
こいつで実際に管理しているっぽいですね。

### 親クラスの初期化を呼んでおく

```rb
require "ostruct"

module MyApp
  class Config < OpenStruct
    def initialize
      super
      self.level = :debug
    end
  end
end

def start(config = MyApp::Config.new)
  p config.level
end

start
```

そして実行

```bash
$ ruby test.rb 
:debug
```
ぁ。動きましたね。

# まとめ
* 手軽に構造体が利用出来る
* オプション目的では、[optparseやtrollop](http://qiita.com/ionis_h/items/519f3ecceb739e71b43d)を使ったり、yamlを使っている事が多いと思うので、微妙かもしれないですねｗ
 * でも、こういうのも便利ですよね〜（＾＾