OmniAICreator/Qiita-1.07M huggingface dataset:
自社WEBサービス開発の現場から


このエントリーは[DevLOVE Adevent Calender 2013 「現場」](http://devlove.doorkeeper.jp/events/7039)の36日めのエントリーです。

# 自己紹介

私はWEB業界で自社サービスの開発を行っている開発6年目のエンジニアです。たまに、DevLOVEの裏方としてイベントの運営に携わったりもしています。

# 現場のお話
今年のDevLOVEアドベントカレンダーのお題なのですが、皆さん、現場とは何かということについていろいろなご意見を書かれてい面白いな〜、と思うと同時に、自分にとっての現場とは？なんて考えたこともなく、非常に難しいテーマだなー、と思っていました。そこで、現場とはなんぞや、という話からは離れて、私の現場の楽しさについて書きたいと思います。

# 自社WEBサービスの開発の現場

## 楽しさ
自分たちの作ったものに対してのユーザーからのフィードバックを得やすい、というところにあると思います。自分が作ったある機能がユーザーに受け入れられるか、受け入れられないか、その機能によってサイト全体の利用数が増えたか、減ったか、満足度は上がったか、下がったか、ということが様々なツールの成長でとても簡単に見られるようになってますので、作り甲斐というところがとてもあります。

このような感覚は、一般的にWEB業界では言われることだと思います。が、自分自身がこのような感覚を持つようになったのはつい最近のことでした。

その原因は、サイトの企画は企画者の領分で、プログラマである自分は作ることの専門家という意識の壁があったことではないかな〜、と思います。それが最近変わってきた結果、上記のような楽しさを感じるようになってきました。（自分自身がアクセス解析ツールを使ってユーザー行動を分析したりすることを意識的にやるようになったことがきっかけだったと思います）

もちろん、このような意識の指向性については、開発者と企画・ディレクターとの組織的・役割的な部分がはっきり分けられているというような組織的な要因によることも多分にあるとは思うのですが、それだけではなくて、最終的には開発者の考え方によるところが大きいかな〜と思っています。

もちろん、これは自分にとっての価値基準であって、サービスの内容やユーザーそのものよりも、大きなトラフィックをいかに障害なく捌くかといった純粋なエンジニアリングの興味のある方や、ビッグデータを活用したデータサイエンティフィックなことにやりがいを見出しているような方もいらっしゃるかと思いますし、そのすべてを興味の対象として、実践している素晴らしい方々もたくさんいらっしゃると思いますのであくまで上記は私にとっての楽しさです。

### エンジニアとして

とかく参入障壁が低く、移り変わりが早い業界ですので、変わり続けないと、進化し続けないと、あっという間に淘汰されてしまう業界です。そんな現場では、エンジニアはユーザーが求めるものを、無駄なく素早く作れることがエンジニアには求められるのだと思います。

そのためには、ユーザーが求めるものは何か、何が無駄で、何が無駄でないか、ということを正しく判断し、製品を高品質に作りこむすることが、エンジニアとして求められることなのか、と思います。もちろん、正しく判断すること、そして品質高く作ることこそが、難しいことなので、自己鍛錬して、日々日々成長していきたいな〜、と思う次第です。

## 明日は
DevLOVE現場甲子園の守トラックで大活躍だった坂部さんです。よろしくおねがいします！
ドメインをまたいだXMLHttpRequest

使い方としては、自社で共通のAPIが用意してあって、そこを別ドメインの自社サイトからつつきたいとかで、どうしてもドメインをまたいだXMLHttpRequestが必要なケースがままある
これまでJSONPとかで無理くりやってやれないこともない、という感じではあったけど、サーバもクライアントのアプリも自分サイドで管理してますって場合はこういう方法もあるよってメモ

リクエストの受け取り側で

Access-Control-Allow-Origin

というヘッダを出力する

Access-Control-Allow-Origin: *

なら全てのドメインから受け付ける

Access-Control-Allow-Origin: www.example.com

ならwww.example.comからのみ受け付ける

*.example.comみたいなワイルドカード的な使い方は今のところない、複数エントリは書けないってのが罠だけど、httpd.confや.htaccessに書くとかPHPだとheader()関数1回で対応できる
ちなみに、.htaccessにも書いて、PHPでも書いて・・・とやると1回しか書いちゃダメって怒られてリクエスト失敗するんで注意
PHPStorm で @noinspection を広範囲に適用する

PHPStorm はコードを静的解析していろいろなバグの可能性を警告してくれます。

例えば、存在しないメソッドを警告してくれる PhpUndefinedMethodInspection とかですが、マジックメソッドを多用すると警告の嵐になります。これだと PHPStorm と言うよりむしろ Warning Stormです。

```php
<?php
class Magic
{
    function __call($name, $args)
    {
        return $name;
    }
}

$obj = new Magic();
echo $obj->ore() . PHP_EOL; // Method 'ore' not found in class Magic
echo $obj->are() . PHP_EOL; // Method 'are' not found in class Magic
```

クラスの docomment で @method を書いておけば大丈夫ですが、任意のメソッド名やプロパティ名を受け入れる実装もよくあるので docomment に書くことが不可能なケースもあります。

```php
<?php
/**
 * @method string ore()
 * @method string are()
 */
class Magic
{
    function __call($name, $args)
    {
        return $name;
    }
}

$obj = new Magic();
echo $obj->ore() . PHP_EOL;
echo $obj->are() . PHP_EOL;
echo $obj->ure() . PHP_EOL; // Method 'ure' not found in class Magic
```

こんなときは @noinspection で警告を抑止できるのですが・・・

 - [PhpStormのInspection警告を制御する - Qiita [キータ]](http://qiita.com/tanakahisateru/items/1367cc0412b4b31ae29c "PhpStormのInspection警告を制御する - Qiita [キータ]")

すごい多用しているとすべてに @noinspection を書くのはしんどいです。

```php
<?php
class Magic
{
    function __call($name, $args)
    {
        return $name;
    }
}

$obj = new Magic();

/** @noinspection PhpUndefinedMethodInspection */
echo $obj->ore() . PHP_EOL;

/** @noinspection PhpUndefinedMethodInspection */
echo $obj->are() . PHP_EOL;

/** @noinspection PhpUndefinedMethodInspection */
echo $obj->ure() . PHP_EOL;
```

プロジェクトの設定で特定のインスペクションを無効にすることもできます（豆電球から Add method -> disable inspection を選択）。

が、それだとプロジェクト全体で無効になってしまいます。

マジックメソッドを多用しているのが一部のコードだけであれば（例えば特定のクラスでだけマジックメソッドを多用するライブラリを使っているとか）、その一部だけで無効にしたいです。

---

公式な方法かどうかわかりませんが、次のように波括弧で囲めばそのブロックでまとめて警告が抑止されます。

```php
<?php
class Magic
{
    function __call($name, $args)
    {
        return $name;
    }
}

$obj = new Magic();

/** @noinspection PhpUndefinedMethodInspection */
{
    echo $obj->ore() . PHP_EOL;
    echo $obj->are() . PHP_EOL;
    echo $obj->ure() . PHP_EOL;
}

echo $obj->pre() . PHP_EOL; // Method 'pre' not found in class Magic
```

クラスやメソッドの docomment に @noinspection を書いておけばそのクラスやメソッド単位で無効にできるかと思いましたがそんなことはありませんでした。
Vim Working with multiple files


[vim cheatsheet](http://www.worldtimzone.com/res/vi.html)


```
# Open all files
vim .

# To open all files in a dir in tabs
$ vim * -p

# To open all files in a dir in horizontally splitted windows
$ vim * -o

# To open all files in a dir in vertically splitted windows
$ vim * -O

```

### Tabs

```
# Open files in tabs
vim -p file1 file2 file3

# Close a tab
:tabc

# Edit a file in a new buffer
:e filename 

# go to next buffer
:bnext (or :bn)

# go to previous buffer
:bprev (of :bp) 

# delete a buffer (close a file)
:bd

# To open another tab
:tabe file.rb

# Move to the next tab
gt # or gT

```

### Windows

```
# Open a file in a new buffer and split window
:sp filename 

# Vertically split window
:vs filename

# Quit a window
<C-w>q 

# Split windows vertically
<C-w>v 

# :new horizontal split (editing a new empty buffer)
<C-w>n

# :split window horizontally (editing current buffer)
<C-w>s 

# :vsplit window vertically (editing current buffer)
<C-w>v 

#  :close window
<C-w>c

# close all windows, leaving :only the current window open
<C-w>o

# go to next window
<C-w>w

# go to previous window
<C-w>p

# go to window above
<C-w><Up> 

# go to window below
<C-w><Down>

# go to window on left
<C-w><Left>

#  go to window on right
<C-w><Right>

```
エントロピー符号(2013.2.13の過去問)

1日1個 @nabetani さんの作った問題を解くAdventCalendarの15日目です。

今日の問題は http://nabetani.sakura.ne.jp/hena/ord8entco/ にあります。

```hs
module Doukaku.Entropy (solve) where
import Numeric.Lens (hex, binary)
import Control.Lens (review, preview)

solve :: String -> String
solve = decrypt . concatMap parse

data BDD = Leaf Char | Done | Undefined | Node BDD BDD deriving (Eq, Show)

define :: [Char] -> Char -> BDD -> BDD
define [] c Undefined = if c == '\0' then Done else Leaf c
define ('1':bs) c bdd = case bdd of
  Undefined -> Node Undefined (define bs c Undefined)
  Node f t -> Node f (define bs c t)
define ('0':bs) c bdd = case bdd of
  Undefined -> Node (define bs c Undefined) Undefined
  Node f t -> Node (define bs c f) t
define _ c _ = error ("Bad definition of " ++ [c])

codebdd :: BDD
codebdd = define "000"     't'
        $ define "0010"    's'
        $ define "0011"    'n'
        $ define "0100"    'i'
        $ define "01010"   'd'
        $ define "0101101" 'c'
        $ define "010111"  'l'
        $ define "0110"    'o'
        $ define "0111"    'a'
        $ define "10"      'e'
        $ define "1100"    'r'
        $ define "1101"    'h'
        $ define "111"     '\0'
        $ Undefined

decrypt :: String -> String
decrypt is = maybe "*invalid*" answer $ decrypt' codebdd is
  where
    answer (n, s) = s ++ ':' : show n

decrypt' :: BDD -> String -> Maybe (Int, String)
decrypt' Done _ = Just (0, [])
decrypt' (Leaf c)  xs = do
  (n', cs) <- decrypt' codebdd xs
  return (n', c:cs)
decrypt' (Node f _) ('0':xs) = do
  (n', cs) <- decrypt' f xs
  return (n' + 1, cs)
decrypt' (Node _ t) ('1':xs) = do
  (n', cs) <- decrypt' t xs
  return (n' + 1, cs)
decrypt' _ _ = Nothing

parse :: Char -> String
parse c = reverse . tail . review binary $ n
  where n = maybe 0 id . preview hex $ '1':c:[] :: Int
```

最初はパターンマッチでゴリ押しした解答を書いたのですが、せっかく休日なのでちょっと手直ししました。この問題の符号は2分決定木になるよう定められてますので、定義を素直に決定木`codebdd`に翻訳しています。`0`が`Node`の左側、`1`が右側となります。後は素直にこの木を辿り続ければ復号できます。結果だけでなく消費したビット数が必要なのが面倒ですが、こちらは素直に戻り値に含めました。例外処理が必要なのも地味に面倒で、こっちは`Maybe`で対応しています。

パース時に`1`を付加して`tail`をかけているのは変換後に上位の`0`が飛ばないようにするためで、@kei_q さんに教わった手法です。

http://qiita.com/Nabetani/items/24b9be4ee3bae4c89a95 に他の方の回答もありますので、見ると参考になるでしょう。
Cocos2d-xでのコンテンツ暗号化(お手軽)

<h1>Cocos2d-xでのコンテンツ暗号化(お手軽)</h1>

上手い事すると、アプリ化したファイルから画像素材は抜け出せるんですね。
「これは困ります!!!ぐひゅひゅふ!!!（ఠ︹ఠ）」という方には是非使って欲しい小技です。
(抜き出し方法については、お察し下さい)
「cocos2d-Xmas Special」でお話した内容そのまんまですwww

![a001.jpg](https://qiita-image-store.s3.amazonaws.com/0/9823/8564223a-51de-eca9-25ce-c429d3327df7.jpeg)

<h2>全体の流れ！</h2>
１、Texture Packerで素材の暗号化
２、暗号化されたファイル「hogehoge.plist」、「hogehoge.ccz」をResourceフォルダに保存
３、Cocox2d-xでファイルの複合化して利用
になります。

![a002.jpg](https://qiita-image-store.s3.amazonaws.com/0/9823/75840e37-bfb8-dbd0-670d-b621c593a74f.jpeg)

<h2>[１、Texture Packerで素材の暗号化]</h2>
暗号化ファイルは、『Texture Packer』を使ってお手軽に作成する事が出来ます。
http://www.codeandweb.com/texturepacker

<h3>書き出しファイルのフォーマットを指定する</h3>
出力ファイルの「Texture format」を、zlib compr.PVR(.pvz.ccz, Ver.2)に指定します。
![003.jpg](https://qiita-image-store.s3.amazonaws.com/0/9823/bdaaf370-c765-8336-89f2-780d571546a2.jpeg)

<h3>コンテンツの暗号を指定する</h3>
鍵のマークから、Content protectionをクリックします。
Encription keyを指定(必要があれば、Create new keyでランダムな文字列を用意)します。
ここでは、8桁の英数を4セット「aaaaaaaabbbbbbbbccccccccdddddddd」とします。
(コピーや、メモしておく事)
後の複合化で、この鍵を使う事になります。
![004.jpg](https://qiita-image-store.s3.amazonaws.com/0/9823/e419f67d-fe35-3cba-d5cc-ddf3708d1d6c.jpeg)

<h2>生成されたファイルをResourceフォルダへ</h2>
ファイルを所定のフォルダへポイします。(ファイルの格納等については、お察し下さい)
![005.jpg](https://qiita-image-store.s3.amazonaws.com/0/9823/d1727e45-ddef-8c99-e828-1a73019d247a.jpeg)

<h3>ファイルの復号化</h3>

あとは簡単です。
<h4>１、ZipUtils.hヘッダーを用意します</h4>

```cpp:hoge.cpp
#include "support/zip_support/ZipUtils.h"
```

<h4>復号化キーの指定</h4>
先ほど暗号化で使用したキー「aaaaaaaabbbbbbbbccccccccdddddddd」を、
ccSetPvrEncryptionKeyPartメソッドでで8文字セットで順番に4行づつ下記の様に指定します。

```cpp:hoge.cpp
ZipUtils::ccSetPvrEncryptionKeyPart(0, 0xaaaaaaaa);
ZipUtils::ccSetPvrEncryptionKeyPart(1, 0xbbbbbbbb);
ZipUtils::ccSetPvrEncryptionKeyPart(2, 0xcccccccc);
ZipUtils::ccSetPvrEncryptionKeyPart(3, 0xdddddddd);
```

<h4>ファイルの利用</h4>
スプライトシートをいつもの様に使います。

```cpp:hoge.cpp
SpriteFrameCache::getInstance()->addSpriteFramesWithFile("hogehoge.plist", "hogehoge.pvr.ccz");
auto eSprite = Sprite::createWithSpriteFrameName("gacya.png");
this->addChild(eSprite);
```

メリークリスマスでよいお年を！
RubyMotionとRubyのバージョン

開発環境側の Ruby のバージョンを変えても生成されるアプリ側のRuby のバージョンには影響しないという小ネタです。

詳細は [RubyMotionとRubyのバージョン](http://blog.n-z.jp/blog/2013-12-15-rubymotion-ruby-version.html) です。
Maven + Android で Emma のカバレッジを取得するときにソースコードのパスを指定する

元ネタ↓
> https://code.google.com/p/maven-android-plugin/wiki/EmmaMaven

上記には、ソースコードをレポートに含めたいときは、Java で直接 Emma.jar を呼び出せとか書いてあるのですが、それはちょっと悲しいので、調べてみました。

```xml:pom.xml
  <build>
    <plugins>
      <plugin>
        <groupId>org.sonatype.maven.plugin</groupId>
        <artifactId>emma4it-maven-plugin</artifactId>
        <version>1.3</version>
        <executions>
          <execution>
            <id>default-cli</id>
            <configuration>
              <sourceSets>
                <sourceSet>
                  <directory>${project.basedir}/src</directory>
                </sourceSet>
              </sourceSets>
              <formats>
                <format>xml</format>
                <format>html</format>
              </formats>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
```

テスト対象のプロジェクトに上記の仕込みをしておき、

```shell-session
$ mvn org.sonatype.maven.plugin:emma4it-maven-plugin:1.3:report
```

とすると、site\emma のレポートにソースコードも含まれます。
ソースコードディレクトリが複数になっているときは sourceSet を複数並べればOK。

レポートファイルのソースコードのコメントが文字化けするときは、下記のように、文字コードを Java に -D オプションで渡したりしてください。

```shell-session
$ java -Demma.report.html.out.encoding=UTF-8 -Dfile.encoding=UTF-8
```

Jenkins の場合は、Maven の「高度なオプション」で、JVM に渡してあげるとよいでしょう。
Ceylonでのファイル読み込み

Ceylonでのファイルからのデータ読み込みをしてみます。

module.ceylonに下記のモジュールを追加します。

```ceylon

	import ceylon.file "1.0.0";
````

そして読み込みソースコード。
hoge.txtの中身を読み込んでコンソール出力してます。

```ceylon

void fileReadExample() {
	
	Resource file = parsePath("hoge.txt").resource;
	if(is File file) {
		try(reader = file.Reader()) {
			while (exists line = reader.readLine()) {
			 	print(line);
			}
		}
	}
}

````

> if(is File file) 

この行で型をチェックしています。
Pathのリソースはディレクトリを表していたりNilだったりするので
ちゃんと型チェックしないとFile型として使えないです。
そしてFile型としてfile変数を扱えるのはこのifのブロックスコープの中だけですね。

> try(reader = file.Reader()) {

今回新しい要素としてはこのtry文です。
このtry開始のときのreader変数は最後にcloseが呼ばれます。

普通にtry-catch-finallyを書くことも出来ますが、
ストリームなどの閉じ忘れを無くすためにこちらの書き方が推奨です。
Javaで言うと、Java7からサポートされた構文と同じ感じですね。


そんな感じでIOの閉じ忘れをしないいつもの構文や
Ceylonの型チェックの厳しさがちょっと伝わるコードかなと思いました。
MySQLのAlterの進捗を確認するシェルスクリプト

## MySQLでALTERの進捗を確認する

その方法が以下の記事に紹介されており、記載されてるシェルを実際に使わせてもらった   
[MySQLでALTER TABLE文の進捗状況を確認する](http://d.hatena.ne.jp/sh2/20110615)

```
#!/bin/bash

while true
do
  cat <<_EOF_
SHOW GLOBAL STATUS LIKE 'Handler_write';
_EOF_
  sleep 10
done | mysql -u root -p -N
```

使い方や意味は記事を読んでいただきたいのだが、このシェルだけではちょっとめんどうな部分がある

 - 一番最初に数をメモっておかないとだめ(あとで数を引いて計算するため)
 - 上記理由と大体一緒だが、出力される結果の数字と一番最初の数を毎回電卓等で計算しないとだめ

というわけで、一番最初の数字から今の数字を引いて出力するようにしたら楽だと思って改変した

```
#!/bin/bash
shopt -s expand_aliases
alias mysql-master='mysql -uroot -p'

begin=`echo "SHOW GLOBAL STATUS LIKE 'Handler_write';" | mysql-master -N | awk '{print $2}'`
                                                                                                                                                                                          
while true
do
    tmp=`echo "SHOW GLOBAL STATUS LIKE 'Handler_write';" | mysql-master -N | awk '{print $2}'`;
    result=`expr $tmp - $begin`
    echo ${result}
    sleep 10
done
```

もっとキレイ書き方あると思うので、ツッコミお待ちしております!!!
IntelliJ の Database Tools の不具合について

IntelliJ には Database Tools があり、テーブルの閲覧や操作ができ、大変便利です。
私がこの Database Tools を使っていて最近見つけた不具合らしきものを共有します。

利用DBはMySQLです。AWSのRDSのMySQLを使っています。
MySQL のバージョンは `5.5.20` です。

サンプルとして以下のようなテーブルを作成してみました。さまざまな型を含むテーブルとなります。

```sql:DDL
CREATE TABLE type_test (
	ID INT unsigned NOT NULL AUTO_INCREMENT,
	A1 TINYINT,
	A2 SMALLINT,
	A3 MEDIUMINT,
	A4 INT,
	A5 BIGINT,
	A6 FLOAT,
	A7 REAL,
	A8 DOUBLE PRECISION,
	B1 DATETIME,
	B2 DATE,
	B3 TIMESTAMP,
	B4 TIME,
	B5 YEAR,
	C1 CHAR(1),
	C2 VARCHAR(1),
	D1 BINARY,
	D2 VARBINARY(1),
	E1 TINYBLOB,
	E2 BLOB,
	E3 MEDIUMBLOB,
	E4 LONGBLOB,
	F1 TINYTEXT,
	F2 TEXT,
	F3 MEDIUMTEXT,
	F4 LONGTEXT,
	G1 ENUM('1', '2'),
	H1 SET('one', 'two'),
	PRIMARY KEY (ID)
) ENGINE=InnoDB
```

Database Tools ではテーブルのツリービューからテーブルを右クリック選択して表示されるコンテキストメニューに`Copy DDL` という項目があります。その名のとおりDDLをクリップボードにコピーしてくれる機能です。

![a1.png](https://qiita-image-store.s3.amazonaws.com/0/34168/2317ca48-b6e9-45fe-010c-974ea45067bf.png)

実際に上記DDLでつくったテーブルを選択し、`Copy DDL` 実行後に貼り付けてみると、上記のDDLと比べて **型が正確でないケースがあることがわかります（コメントの部分です）。**

```sql:コピーされたDDL
CREATE TABLE type_test
(
	ID INT UNSIGNED NOT NULL AUTO_INCREMENT,
	A1 TINYINT,
	A2 SMALLINT,
	A3 MEDIUMINT,
	A4 INT,
	A5 BIGINT,
	A6 REAL,     -- 本当は FLOAT型
	A7 DOUBLE,  -- ここは問題ないっぽい（REALとDOUBLEは同義）
	A8 DOUBLE,
	B1 DATETIME,
	B2 DATE,
	B3 TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
	B4 TIME,
	B5 DATE,    -- 本当は YEAR型
	C1 CHAR(1),
	C2 VARCHAR(1),
	D1 BINARY(1),
	D2 VARBINARY(1),
	E1 TINYBLOB,
	E2 LONGBLOB, -- 本当は BLOB型
	E3 MEDIUMBLOB,
	E4 LONGBLOB,
	F1 VARCHAR(255), -- 本当は TINYTEXT型
	F2 LONGTEXT,     -- 本当は TEXT型
	F3 LONGTEXT,     -- 本当は MEDIUMTEXT 型
	F4 LONGTEXT,
	G1 CHAR(2),      -- 本当は ENUM 型
	H1 CHAR(7)       -- 本当は SET 型
);

```

`tinytext` は格納できるサイズが 255 byte なので、まあ同じようなものに見えますが、`varchar` と `text` ではマルチバイトの扱いに差があるようです。（詳しくは http://ngyuki.hatenablog.com/entry/20110804/p1）

`text` や `blob` のように **格納できるデータのサイズが大幅に異なる** ような型に対して誤表示があるため注意が必要です。

こちらの表示も同様ですね。

![a2.png](https://qiita-image-store.s3.amazonaws.com/0/34168/44adadc6-f315-f467-123a-1e2a1d7093df.png)


この不具合が修正されるまでは、面倒ですが、

```sql:
show create table table_name
```

というクエリを発行し、データ型を確認するのがよいと思います。型を見ずにカラム名だけを確認する場合は`Copy DDL`を使ってもよいと思います。

この不具合を確認した IntelliJ のバージョンは `12.1.6` ですが、最新の `13` でも同様の現象が発生するようです。

みなさんも注意しましょう。
そしてもし関係者の方がご覧になっていたら、修正をお願いします。

### 追記
```
本家にちゃんとバグレポートをしろとお叱りをいただきましたので、レポートいたしました。
http://youtrack.jetbrains.com/issue/IDEA-118246
```
Windowsの環境変数をPowerShellで書き変える

Windows環境変数を書き変えることが多く、いちいちシステムの詳細設定を開くのがめんどくさい人向け。

* ユーザーの環境変数

```ps1
> [System.Environment]::SetEnvironmentVariable('M2_REPO', 'C:\Users\mmorita\.m2\repository',[System.EnvironmentVariableTarget]::User)
または
> [Environment]::SetEnvironmentVariable('M2_REPO', 'C:\Users\mmorita\.m2\repository', 'User')
```

* システムの環境変数

```ps1
> [System.Environment]::SetEnvironmentVariable('M2_REPO', 'C:\Users\mmorita\.m2\repository',[System.EnvironmentVariableTarget]::Machine)
または
> [Environment]::SetEnvironmentVariable('M2_REPO', 'C:\Users\mmorita\.m2\repository', 'Machine')
```

PATHの追加とかもできます。

```ps1
> $path = [Environment]::GetEnvironmentVariable('PATH', 'Machine')
> $path += ';' + 'C:\tools\apache\maven\bin'
> [Environment]::SetEnvironmentVariable('PATH', $path, 'Machine')
```

APIの説明は↓とか参照。

> http://msdn.microsoft.com/ja-jp/library/96xafkes(v=vs.110).aspx

なお、設定しても、既に起動しているプロセスには効かないので、プロセスを起動し直すなどの対応が必要です。
springで爆速rake生活

Gemのバージョンについては[Gemのバージョンを自由自在に変える](http://qiita.com/shogohciai/items/235eaf95c5978d182c3b)を参照

Gemfileに

```ruby:Gemfile

gem 'spring'

```

とか

```ruby:Gemfile

group :development, :test do
  gem 'spring'
end

```

とか

```ruby:Gemfile

gem 'spring', group: [:development, :test]

```

とかしてあげて


```zsh:.zshrc

alias best='bundle exec time spring'

```

とエイリアスを貼って

```zsh:zsh

source .zshrc

```

で変更を読み込んで

```zsh:~/Rails_root

best rake routes

```

これでひとまず幸せになれます。


---
追記

[spring/bin/spring L4~7](https://github.com/jonleighton/spring/blob/master/bin/spring)
これを見ていただくと

```ruby:spring/bin/spring

 if Gem::Version.new(Gem::VERSION) < Gem::Version.new("2.1.0")
    warn "Warning: You're using Rubygems #{Gem::VERSION} with Spring. " \
         "Upgrade to at least Rubygems 2.1.0 and run `gem pristine --all` for better " \
         "startup performance."

```

というコードがあります。

gem本体のバージョンが低いときにもっと早くできるよと教えてくれるのですが、
このgemのバージョンというのが前述したローカルでのgemではなく、railsプロジェクトが定義するgemのバージョンに成ります。

当方rails3.2.14で運用しており、rails newで新しいプロジェクトを立ち上げて

```zsh:zsh

gem -v #=> "2.1.0"
pry(main)> p Gem::VERSION #=> "2.0.3"

```

となることを確認しました。

railsのバージョンに依存してgem本体のバージョンも変わるのならspringは4系で使うとより早く、警告も出ないということかもしれません。調査を続けます。

---

追記２
調べました。（[Rails4で使用されているRubyGemのバージョンを調べてみた。](http://qiita.com/sgtn/items/9fde2e8c0936fc00de14)）
gemでバージョンを自由自在に変える



```zsh:zsh
sudo gem update --system
```

したんですが gem 2.1.11が入っちゃいました。


```zsh:zsh

gem list rubygems-update
sudo gem install -v 2.1.0 rubygems-update
sudo gem uninstall -v 2.1.11 rubygems-update
sudo update_rubygems

```

これで晴れてgem2.1.0環境です
Android SDKのコマンドのパスを通す (Windows)

環境変数画面を開く(開きかたがWindowsバージョンにより違うので省略します)

![環境変数.png](https://qiita-image-store.s3.amazonaws.com/0/17192/74865a8c-60fa-9dd1-b746-66fec5f37974.png)

システム環境変数の「Path」を選択し、「編集」を押す。

![環境変数設定.png](https://qiita-image-store.s3.amazonaws.com/0/17192/8c4eb17e-b283-e36f-80c7-424cfc19701b.png)

ここの末尾に以下値を追加します。値の間には「セミコロン」を忘れずに。私はCドライブの下にandroidというフォルダをつくってそこにsdkをインストールしましたが、適宜変更してください。
C:\android\sdk\tools;
C:\android\sdk\platform-tools

なんか前はtoolsだけいい気がしたんですが、どっかのバージョンからplatform-toolsも必要になったんですね。adbコマンドが通らなくてあせりました。
ScalaCLを使ってみる


# はじめに

http://d.hatena.ne.jp/chimerast/20110828/1314536925

のサイトをみて、ScalaでOpenCLをいじれる[ScalaCL](http://code.google.com/p/scalacl/)というものを知ったので、ちょっといじってみようと思ったが、インストールして簡単なソースをコンパイルするまで、思ったより苦労したのでメモ。

# インストール

## sbazは存在しません

ScalaCLは、sbaz（というScalaのパッケージマネージャー？）を使うと簡単にインストールできる…ということなのだが、まず、sbazがない！？
もともと、sbazはscalaをインストールすれば一緒にインストールされていたものらしいのだが、現在のバージョンには含まれていないようだ。
参考： http://d.hatena.ne.jp/xuwei/20120418/1334761536

## jarを直接取ってくる

仕方がないので、scalaclの.jarファイルを直接ダウンロードしてライブラリフォルダに突っ込む方針に変更。

>参考： http://code.google.com/p/scalacl/wiki/Usage#With_Eclipse

http://oss.sonatype.org/content/groups/public/com/nativelibs4java/scalacl-compiler-plugin/0.3-SNAPSHOT/
のサイトから、最新のバージョンをダウンロード。
筆者の場合、[scalacl-compiler-plugin-0.3-20120418.092333-17.jar](scalacl-compiler-plugin-0.3-20120418.092333-17.jar)という名前のファイルをダウンロードしました。

そして、これをscalaのライブラリフォルダにコピー。
scalaのインストールにHomebrewを使っている場合は、以下のような感じでコピーする（ほかの環境は知らない）

```bash:
$ sudo cp scalacl-compiler-plugin-0.3-20120418.092333-17.jar /usr/local/Cellar/scala/2.10.3/libexec/lib/
```

## Scala-IDEの設定

ScalaCLのコンパイルには、Scala-IDEを使うのが比較的楽そうだったのでScala-IDEを使うことにする。
ただし、いくつか設定が必要になる。

Scala-IDE上でScalaCL用のプロジェクトを新規作成したら、
プロジェクトのプロパティを開いて、”Scala Compiler”->”Advanced”タブを開く。
１．”Use Project Settings”にチェックを入れる。
２．Xplugin欄に、scalaclの.jarファイルまでのフルパスを入れる。
３．Xplugin-require欄に、”scalacl”と入れる。

![スクリーンショット 2013-12-15 12.41.26.png](https://qiita-image-store.s3.amazonaws.com/0/20722/7d0ac9ff-03d4-4c9d-d175-0d3b83c8cbfe.png "スクリーンショット 2013-12-15 12.41.26.png")

試しに、一番最初にあげたサイト（スライド）にあったコードをコンパイルしてみる。

```scala:Test.scala
import scalacl._

object ScalaCL {
	implicit val context = Context.best
	(0 until 1000).cl.map(math.cos(_)).sum
}
```

Scala-IDEの”Run”ボタンを押すと、エラーがでる…orz

## エラーに対処する

```shell:
java.lang.NoClassDefFoundError: scala/tools/nsc/settings/MutableSettings$SettingValue
```

というエラーがでるのだが、ぐぐると解決法が見つかる。

https://www.assembla.com/spaces/scala-ide/wiki/known_issues

上記↑のサイトによると、Scala-IDEプラグインをアップデートするといいらしい。ただし、そのときに、”Contract all update sites during install to find required software”のチェックを外してやる必要があるようだ

### updateの方法（マックの場合）

Scala-IDE（ようはEclipse）で”Help”->”Install New Software…”を選ぶ。

![スクリーンショット 2013-12-15 12.51.50.png](https://qiita-image-store.s3.amazonaws.com/0/20722/573440a7-ec83-65c2-11b4-ca1004faf697.png "スクリーンショット 2013-12-15 12.51.50.png")


・Work with: 欄の右端の三角▼をクリックして、Scala IDEのサイトを選ぶ。
・“Select All”ボタンを押してすべて選択。
・”Contract all update sites during install to find required software”のチェックを外す。

![スクリーンショット 2013-12-15 12.53.39.png](https://qiita-image-store.s3.amazonaws.com/0/20722/71c68ab2-1f31-6bab-8a32-ce8ce1cc1fd4.png "スクリーンショット 2013-12-15 12.53.39.png")


あとは、”Next”ボタンで次の画面にいき”Finish”ボタンでオッケー。


## あらためてコンパイル

ここまでで、うまくいえばコンパイルが通るようになっている（はず）。
HyperCard(HyperTalk)について

>基準は本が出てない or 邦訳書が出てない ぐらいで

↑に書いてますが、HyperCardの本は日本語で沢山でてますし、全然マイナーじゃないですね・・・。Mac持っている人ならHyperCard誰でも知ってますし・・・。

HyperCardはMacで動作するハイパーテキスト作成ソフトウェア（と、http://kotobank.jp/word/HyperCard   にかいてました。）です。HyperTalkという言語を使って、ゲームなんかもつくれます。

MacOS XではClassic環境が無いと動作せず、今僕が使っているMacOSX 10.9ではそのClassic環境は廃止されてて使えないという状況。旧Macも無かったので、仕方なくこちら↓のSuperCardを使うことにしました。有料ですが、トライアル版で使えるみたいです。ちょっと試すのならよいかも。

http://www.supercard.us/index.html

#Hello World
開発ツールのSuperEditを使って、カードにボタンを配置し、そこにスクリプトをかいてみます。

```
on mouseUp
  put "hello world!"
end mouseUp
```
![Screen Shot 2013-12-15 at 11.25.09.png](https://qiita-image-store.s3.amazonaws.com/0/806/b5472468-11f8-788c-caf2-c64131a0bebe.png)

HyperTalkはRubyと同じく、文末にセミコロンを入れる必要は無いです。 jQueryの「イベント」よろしく、ボタンでmouseUp(マウスのボタンが押されたら）されたら、on mouseUp ~ end mouseUpのスクリプトが実行される、という具合です。

実行する際はインストール時に一緒に入っていた「SuperCard」を使用します。

![Screen Shot 2013-12-15 at 11.29.27.png](https://qiita-image-store.s3.amazonaws.com/0/806/1113a1d3-d0dc-451f-11ae-ea49a9bbadc2.png)


下になんか変なウインドウ（メッセージボックスといいます）がでて「HelloWorld」とでました。このメッセージボックスはRubyのirbっぽく、このボックスで入力したスクリプトはすぐ実行され、結果を返してくれます。
put というのは 代入先をしていすることで、変数に値を代入できます。先ほどのHello Worldだと

```
on mouseUp
  put "hello world!" into message
  put message
end mouseUp
```

と書けます。英語の様に読みやすくて素晴らしいですね！！

#数あてゲーム的なものを作ってみる

```
on mouseUp
  put random of 100 into n
  repeat 6
    ask "please input number(1-100)?"
    if it < n then
      answer "more than" && it
    else if it > n then
      answer "less than"  && it
    else  if it is n then
      answer "HIT!!! CONGRATULATIONS!!!"
    exit mouseUp
    end if
  end repeat
  answer "YOU LOSE. MY ANSWER IS" && n 
end mouseUp
```

名著「ハイパーカードでゲームを作ろう」のほぼ引用なのですが、簡単な数あてゲーム作りました。
説明しなくてもなんとなくどんな感じなのかわかると思います。　何度もいいますが、英語っぽくて解りやすいですね。
自分好みのAAをコマンドラインを開くたびに表示


こちらの記事[コマンドラインにイラストを](http://qiita.com/b4b4r07/items/1a53862e3ee857b8888e)を活用していたのですが、あまりなじみの無いAAばかりだったので自分好みのAAが表示されるように設定。

こんな感じになります。

![5afba16e170cd2a4a38a798d2220d208.png](https://qiita-image-store.s3.amazonaws.com/0/6406/37572f7d-756d-db54-ea73-88f20b694171.png)

```bash

# ---------------------------------------------------------------------------
# 立ち上げ時にAAと名言
# ---------------------------------------------------------------------------

function random_cowsay() {
#COWS=$(ls -1 `brew --prefix`/Cellar/cowsay/3.03/share/cows/)
COWS="$COWS $(cd ~/dotfiles/cows ;find `pwd` -type f -print)"
NBRE_COWS=$(for f in $COWS; do echo $f; done | wc -l)
COWS_RANDOM=$(expr $RANDOM % $NBRE_COWS + 1)
COW_NAME=$(for f in $COWS; do echo $f; done | awk -v COWS_RANDOM_AWK=$COWS_RANDOM 'NR == COWS_RANDOM_AWK {print $1}')
cowsay -f $COW_NAME "`Fortune -s`"
}
if type -P fortune cowsay >/dev/null && test "$TMUX"; then
  while :
  do
    random_cowsay 2>/dev/null && break
  done
fi

```

これを`.bashrc`に書き込めば、`~/dotfiles/cows/`以下のファイルがAAの表示対象になります。
こんな感じで記述しておきましょう。

```~/dotfiles/cows/arupaka.cow
$the_cow = <<EOC;
∩~~~∩
ξ･×･ξ
ξ ~ ξ
ξ   ξ
ξ   “~～~～〇
ξ          ξ
ξ ξ ξ~～~ξ ξ
ξ_ξξ_ξξ_ξξ_ξ
EOC
```

自分の場合はtmuxを使っていて、この記述だとtmuxのペインが開かれるたびにAAが表示されます。
bashで256色表示するスクリプト用意しておくと便利

便利
![c33fb274b2def839ab2fd69d81118861.png](https://qiita-image-store.s3.amazonaws.com/0/6406/d7979d68-dd63-6b74-2b15-3f4b7029894b.png)

```bash
#!/bin/bash

echo '
256色
前: 38;05;色番号
背: 48;05;色番号
'
for i in {0..255} ; do
  printf "\x1b[38;05;${i}m 38;05;${i} "
done
echo ''
for i in {0..255} ; do
  printf "\x1b[48;05;${i}m 48;05;${i} "
done
echo ''
```

関連: [bashで16色表示するスクリプト用意しておくと便利](http://qiita.com/soramugi/items/46117274419665e601fa)
bashで16色表示するスクリプト用意しておくと便利


それぞれのターミナル環境で色の設定違うと思われるので色の確認できるスクリプトあると便利。自分の場合は強調表示がオレンジ色付いたりとかすぐ解る。

![0377ee54f871668cf16b401293b93ba6.png](https://qiita-image-store.s3.amazonaws.com/0/6406/f5e066dd-d847-d461-aeb8-4d14fdf4c3a0.png)


```bash
#!/bin/bash

echo -e "
# Attribute codes:
# 00=none 01=bold 04=underscore 05=blink 07=reverse 08=concealed
# Text color codes:
# 30=black 31=red 32=green 33=yellow 34=blue 35=magenta 36=cyan 37=white
# Background color codes:
# 40=black 41=red 42=green 43=yellow 44=blue 45=magenta 46=cyan 47=white

状態番号
\033[00m デフォルト状態 00 \033[00m
\033[01m 強調           01 \033[00m
\033[04m 下線           04 \033[00m
\033[05m 点滅           05 \033[00m
\033[07m 色反転         07 \033[00m
\033[08m 塗りつぶし     08 \033[00m(塗りつぶし     08)

色番号
\033[30m 黒               30 \033[00m \033[40m 40 \033[00m \033[31;40m 31;40 \033[00m \033[32;00;40m 32;00;40 \033[00m
\033[31m 赤               31 \033[00m \033[41m 41 \033[00m \033[32;41m 32;41 \033[00m \033[33;01;41m 33;01;41 \033[00m
\033[32m 緑               32 \033[00m \033[42m 42 \033[00m \033[33;42m 33;42 \033[00m \033[34;04;42m 34;04;42 \033[00m
\033[33m 黄(または茶)     33 \033[00m \033[43m 43 \033[00m \033[34;43m 34;43 \033[00m \033[35;05;43m 35;05;43 \033[00m
\033[34m 青               34 \033[00m \033[44m 44 \033[00m \033[35;44m 35;44 \033[00m \033[36;07;44m 36;07;44 \033[00m
\033[35m 紫               35 \033[00m \033[45m 45 \033[00m \033[36;45m 36;45 \033[00m \033[37;00;45m 37;00;45 \033[00m
\033[36m シアン           36 \033[00m \033[46m 46 \033[00m \033[37;46m 37;46 \033[00m \033[30;01;46m 30;01;46 \033[00m
\033[37m 白(またはグレー) 37 \033[00m \033[47m 47 \033[00m \033[30;47m 30;47 \033[00m \033[31;04;47m 31;04;47 \033[00m
"
```

関連: [bashで256色表示するスクリプト用意しておくと便利](http://qiita.com/soramugi/items/ab82f30a5906851472cc)
GAE/Gの"Hello, World!"をHTTPサーバーに書き換える手順

Google App Engine for Go(GAE/G)の"[Hello, world!](https://developers.google.com/appengine/docs/go/gettingstarted/helloworld)"をHTTPサーバーに書き換える3つの手順+α。

1.package名を「main」に変更。
2.init()関数名を「main()」に変更。
3.名称変更したmain()関数の最後に、リクエストを待ち受けるための一行を追加。

```go
	// 動作しない人はメソッド名の最後に"r"が付いていないか確認！
	http.ListenAndServe(":8080", nil)
```

ListenAndServe()関数にて、ポート番号を":80"で待ち受けたい場合はroot権限で起動する必要があります。

```bash
sudo go run hello.go
```
**HTTPサーバー用に書き換えたソース**

```go
package main

import (
	"fmt"
	"net/http"
)

func main() {
	http.HandleFunc("/", handler)
	http.ListenAndServe(":8080", nil)
}

func handler(w http.ResponseWriter, r *http.Request) {
	fmt.Fprint(w, "Hello, world!")
}
```
make2回でVPC環境を構築

# お題：下記のVPC環境をmake2回で構築する
![VPC構成図.png](https://qiita-image-store.s3.amazonaws.com/0/19911/3514e015-8393-052c-69fa-12a42643a50b.png)

## 利用するもの

 * aws-cli
 * php
 * shell
 * Makefile
 * json template

### aws-cliって？

知っている人も多いと思うけれど念のため。
Amazonが公式に提供しているCLIツール。
詳しくは[公式ドキュメント](http://aws.amazon.com/jp/cli/ "AWS Command Line Interface")を見てください。

### aws-cliで何ができる？

Amazon Web Serviceで提供されているサービスの操作はほとんどできる、と思います。
こちらも詳細は公式ドキュメントをry

# お題に戻って、Let's create vpc environment!

 *今回使用するMakefile,PHP,JSONのファイルは下記のリポジトリにコミットしてあります*
 *サンプルテンプレート内のサブネットマスク、鍵、AMI-ID、allocated_idは適時自分のものとおきかえてください。*

[サンプルリポジトリ](https://github.com/johnsmith0707/qiita_advent_calender_2013)

## VPC Network & Security Groupを作成

`make create_base`

## インスタンス作成

`make create_app`

以上、です
これで、VPC内にセキュリティグループが設定されたインスタンスが作成されます。
すごくお手軽、特にManagement Consoleでポチポチやらなくていいのが非常に良い。

やっていることはCloudFormationはリソース情報をOutputできるので、SecurityGroupやサブネット構築時の各リソースidをOutputしておきます。

後は、構築したStackのOutputから必要な情報を抜き出し、パラメータを構築します。
これらのパラメータをインスタンス作成時に渡せば、インスタンスのTYPEとAMIを指定するだけでVPC内にセキュリティグループに属したインスタンスが構築されます。

ただし、ここまでだと外からこのインスタンスに入ることはできません。VPCはデフォルトでは外から見えない、Privateな状態が基本です。
ですので、実際にこのインスタンスを使う時は外から入れるようにEIPを付与します。

## EIP付与

`make assoc_eip`

ということで、make2回でVPC環境を構築する方法でした。
実際はEIPの付与まで入れると3回でした。
Rails AssetsでBundler経由でBowerのcomponentsを管理する


[Rails Assets](https://rails-assets.org/) というツールが、最近の悩みを解決してくれそうだったので試してみた。

## できること
> Rails Assets is the frictionless proxy between Bundler and Bower.
It automatically converts the packaged components into gems that are easily droppable into your asset pipeline and stay up to date.

公式に書いてあるとおり。

## 使い方
#### 1. Componentを検索
[https://rails-assets.org/components](https://rails-assets.org/components)

なければ、追加する
![スクリーンショット 2013-12-15 2.22.23.png](https://qiita-image-store.s3.amazonaws.com/0/4545/fb15f476-7f8b-2112-7cf3-3e3cb39717b7.png "スクリーンショット 2013-12-15 2.22.23.png")

#### 2. Gemfile にsource 'https://rails-assets.org' を追加、’rails-assets-BOWER_PACKAGE_NAME’という名前でgemを追加して、bundle install

```ruby:Gemfile
source 'https://rubygems.org'
source 'https://rails-assets.org'
・・・
gem 'rails-assets-BOWER_PACKAGE_NAME'
```

#### 3. ’BOWER_PACKAGE_NAME’で、JS,CSSにrequire

```js:application.js
//= require ’BOWER_PACKAGE_NAME’
```
```css:application.css
/*
 *= require ’BOWER_PACKAGE_NAME’
 */
```

簡単！

> You can now require BOWER_PACKAGE_NAME in your stylesheets and JavaScript files—all assets exposed as main in bower.json will be automatically included.

※ただし、bower.jsonのmain定義にあるファイルをassetsに読み込む仕組みなので、ライブラリによってはうまくワークしない。


## これまでの悩み
今まで、JSのライブラリもgemパッケージ化することでbundlerで使うことができていたのだけど、

- ライブラリ本体に追随して更新されるのが遅い（放置される）場合も多い
- JSだけなのに、わざわざgem化してまでBundlerで管理したくない（Rails用にrakeタスクが用意されている等、追加機能がある場合は良いとして）

というのが問題だったと思う。
JSライブラリはBowerで管理したくなるんだけど、二重管理になるし、herokuデプロイするときに気を使う必要がある。

参考：
> [RailsプロジェクトにBowerを導入してHerokuへデプロイする - QNYP Blog](http://blog.qnyp.com/2013/05/30/say-hello-to-bower/)

私はカスタムbuildpackを使うのには多少抵抗があったので、[42dev/bower-rails](https://github.com/42dev/bower-rails) でvendor配下にライブラリ配置した上で、必要ファイルだけ.gitignoreで制御してレポジトリに含めておくという方法を使っていた。

- bower updateの度にgit差分出てしまうのが難点
- カスタムbuildpackで、bower installするとbowerレポジトリの余計なファイルもたくさん引っ張ってきてしまうので、slug size増加してしまうのでは？という懸念もあった。（未検証）

## 結論
上記のもやもやを上手く解決してくれるナイスなアプローチだと思う。
Herokuみたいにデプロイしたくて

デプロイは神経を使う作業です、安全なはずのコマンドでも結構ドキドキしながら実行するはず。

Capistranoとかfleetとか使ってデプロイされている方にはこの記事は読む価値がないかもしれないです、

リモートサーバに入って`git pull`とか、ましてやローカルで色々前処理した上でrsyncでリモートにデプロイしている方にはこの記事は価値あるかもしれません。

要は手元のPCから、

```bash
$ git push production master
```

の1コマンドでデプロイを実現してみようってはなしです。

Node.jsアプリベースで記述していますが、RubyでもPHPでも何でも読み替えられると思います

## デプロイの構成

デプロイの構成は下図です、

![Untitled drawing.png](https://qiita-image-store.s3.amazonaws.com/0/14712/e4681bdf-5142-628d-3904-ada8c0fd6348.png)

デプロイ先のサーバには`post-receive`フックを仕掛けたbareリポジトリを用意しておきます。`post-receive`フックの中身は同じサーバ内のpublicディレクトリでのチェックアウト + 前処理 + アプリの再起動です。ローカルのPCから`git push`すると`post-receive`フックにより最新の状態でアプリが動き出します。(Upstart使っていますが、pm2とかでも同じ話です)

## サンプルアプリ

以下に今回のサンプルアプリをおいてあります:

https://bitbucket.org/p_baleine/sample-app

このアプリは`/`にアクセスすると「Hello, world」と環境依存の変数を出力してみる素敵にシンプルなアプリですが、幾つかのモジュールに依存しており、またbootstrapを利用していてlessのコンパイルの作業を踏まないと正常に動きません、ローカルでの開発はこんなかんじです:

```bash
$ cd ~/git
$ git clone https://p_baleine@bitbucket.org/p_baleine/sample-app.git
$ cd sample-app
$ npm install # 依存関係ある(npmとbowerの)モジュールをインストール
$ grunt less  # lessのコンパイル
$ npm start   # 起動
```

デプロイ時もこの作業を繰り返す必要があります。

## リモートでの準備

リモートサーバにてbareリポジトリを作成します、

```bash
$ mkdir ~/git/sample-app.git && cd ~/git/sample-app.git
$ git init --bare
```

さらに実際にアプリのソースを置くディレクトリを作成します、

```bash
$ mkdir /var/www/sample-app
```

Upstartスクリプトを作成します、

```bash
$ cat /etc/init/sample-app.conf
author "Tajima Junpei"
description "sample-app"
setuid "nonrootuser"

start on (local-filesystems and net-device-up IFACE=eth0)
stop on shutdown

respawn
console log
env NODE_ENV=production

chdir /var/www/sample-app
exec npm start
```

`post-receive`フックを作成します、チェックアウト、lessのコンパイル、サーバの再起動を行なっています、

```bash
$ cat hooks/post-receive
#!/bin/sh
export SAMPLE_APP_DIR=/var/www/sample-app
GIT_WORK_TREE=$SAMPLE_APP_DIR git checkout -f
(cd $SAMPLE_APP_DIR; npm install && grunt less && sudo restart sample-app)
$ chmod a+x hooks/post-receive
```

## いざデプロイ

リモートのbareリポジトリを追加します、

```bash
$ cd ~/git/sample-app
$ git remote add production <リモートリポジトリ>
```

実際のデプロイは(ローカルPCより)以下コマンドで行います、

```bash
git push production master # パスワードを求められたら入力
```
クッキーのdomainとpathについて

## domain
クッキーが届くドメインを指定する無指定の場合は、書き込んだサーバのドメインが指定される。
ドメインのマッチングは後ろから行われる。つまりwww1.foo.comとwww2.foo.comの二系統で運用
している場合には「.foo.com」と指定することによりwww1サーバとwww2サーバでクッキーを共有できる。

## path
クッキーを読み込めるディレクトリを指定する。無指定の場合にはdomainと同じく書き込んだプログラムの
pathになる。指定したディレクトリの下位ディレクトリは読み込める対象に入るので「/」と指定すると
そのドメインに属する全ページで読み込める。
フィボナッチにeval(a,b)使ってみたけどはやいわけじゃなかった


はい。
参考先サイト様のものよりやや早く終わるのですがよく分からなかったけどメモ書きは残して置かなければで。
参考先さま
[http://d.hatena.ne.jp/sakurai_youhei/20130107/1357568535](http://d.hatena.ne.jp/sakurai_youhei/20130107/1357568535)

```python:op.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#from __future__ import print_function
import sys
import io
import re
import math

#### メモリ使用量と動作時間チェック仕込み
from guppy import hpy
import time
start = time.clock()
h = hpy()
#### 仕込みここまで
# 掲載らしい
def fib(n):
    if n < 2: return n
    return fib(n-2) + fib(n-1)

#print fib(50)

def fib2(n):
    a,b=0,1
    return reduce(lambda x,y: x+[x[-1]+x[-2],], xrange(n-1), [a,b])[n]
print fib2(10000)

def fib3(n):
    a,b=0,1
    for i in range(n):
        a,b=b,eval('a+b')
    print a

#print fib3(500000)

#def fib4(n):
#    n+=3
#    f=[(seq.append(seq[i-2] + seq[i-1]), seq[i-2])[1] for seq in [[0, 1]] #for
#            i in range(2, n)]
#    print f[-1]
#print fib4(500000)

def fib5(n):
    a,b=0,1
    for i in range(n):
        a,b=b,a+b
    print a

#print fib5(500000)


#if __name__ == 'main':
#    print(fib(100))


#### メモリ使用量と動作時間出力
end = time.clock()
print (h.heap())
print (end - start)
```

fib(n)とfib2(n)が先さまで、fib3(n)が私がevalで試してみたパターンです。
eval使っているのは計算結果の取り出し方も違いますし、よくわかりません。わからないのです。
####比較結果のようなもの
| 関数 | 処理時間 | F(3)の値 |
|:-----------|------------:|:------------:|
| fib() | 0.008658秒 | 2 |
| fib2() | 0.011694秒 | 2 |
| fib3() | 0.011055秒 | 2 |

| 関数 | 処理時間 | F(10)の値 |
|:-----------|------------:|:------------:|
| fib() | 0.010526秒 | 55 |
| fib2() | 0.008879秒 | 55 |
| fib3() | 0.011909秒 | 55 |

| 関数 | 処理時間 | F(35)の値 |
|:-----------|------------:|:------------:|
| fib() | 5.782845秒 | 9227465 |
| fib2() | 0.011936秒 | 9227465|
| fib3() | 0.010569秒 | 9227465|



パターンその1は時間が結構かかってしまうように。。。
まぁ、アレです。計算結果って書く意味ないですし、アホみたいに大きな数字になるので以降は処理速度だけメモします。

| 関数 | 処理時間 | F(50)の値 |
|:-----------|------------:|:------------:|
| fib() | 7997.16923秒 | ー |
| fib2() | 0.009155秒 | ー|
| fib3() | 0.010594秒 | ー|




パターン1はもう試さなくていいよね。。。。

| 関数 | 処理時間 | F(10000)の値 |
|:-----------|------------:|:------------:|
| fib2() | 0.376591秒 | ー|
| fib3() | 0.111379秒 | ー|
| fib5() | 0.012429秒 | ー|


| 関数 | 処理時間 | F(100000)の値 |
|:-----------|------------:|:------------:|
| fib2() | 215.197792秒 | ー|
| fib3() | 1.23247秒 | ー|
| fib5() | 0.176561秒 | ー|

| 関数 | 処理時間 | F(500000)の値 |
|:-----------|------------:|:------------:|
| fib3() | 10.064515秒 | ー|
| fib5() | 3.950023秒 | ー|





おまけ
･n=777777　の場合
fib5()
処理速度　9.299923

書式や比較方法が公正でない可能性もあるような。まぁ何パターンか書き方を覚えておいて処理速度を気にしないといけない時にどのパターンが早いかを試してみたりかな。

13/12/15
はい。コメントにもいただきました```a,b=b,a+b```での計測値をfib5()の欄で表へ追記いたしました。
RStudioをいじってみる．もしくは十数年ぶりのS/R言語．

入社直後にネットワーク計測データの山を相手に箱ひげ図を書くように言われてS言語の青本とCD-Rを渡されてから早十数年．新チームで測定データが貯まってきたので，久々にR言語でもいじってみるかと現状調査してみたところ，RStudio廻りでGUI環境が結構整っていることを知る．

よって，perlで処理してgnuplotやexcelでグラフ化していたところからRメインに持って行くべくお勉強開始してみるのメモ．

最終的にはチーム内展開して，今までエクセルでやってた作業をデータセットとスクリプトごと共有して再現性を高めるところまで持って行きたい．

いろいろいじってわかったのは，データの加工部分の難易度が高いということ．うまいデータ形式に変換さえしてしまえば，あとはいろいろな可視化分析化手法を適用できる楽しいフェーズに突入できると．

というわけで，まずはデータフレームを使いこなすところから．

```CSVデータ読み込み
data<-read.csv("csvfile")
names(data)=c("fieldA", "fieldB",...)
```

こんな感じでcsvファイルを読み込んで，各フィールドに名前をつけることができる．名前をつければ，data$fieldA という形でアクセスができると．もちろんフィールドの何番目かで指定することも可能．
zsh を使って簡単に URL や HTML ファイルをブラウザで開く

zsh には pick-web-browser という関数があって、それを使うとコマンドラインから Web ブラウザが起動できるようになる。いろいろ細かく設定できて便利なので説明する。

### 基本的な使い方

```zsh:.zshrc
autoload -Uz pick-web-browser
alias -s html=pick-web-browser
```

使い方はこんな感じ。

```
# HTML ファイルがあったとして ...
% ls
index.html
# それを直接指定する
% index.html
# index.html が Firefox で開かれる

# または明示的に関数を指定してもOK。
% pick-web-browser index.html

# ファイルとして存在しなくても、URLを開くこともできる。
% pick-web-browser "https://www.google.co.jp/search?q=zsh"
```

### カスタマイズする
いろいろと細かく設定できるようになってるので紹介する。

どのブラウザを起動するか変更したい場合は、 `x-browsers` という設定を変更する。

```zsh:.zshrc
zstyle ':mime:*' x-browsers opera firefox
```

こんな感じで書くと、opera と firefox を使う、という意味になる。順番も関係あって、先に書いたものが優先順位が高い。この場合は opera と firefox 両方使用可能だったら opera が優先される。

それと `browser-style` という設定で、起動中のブラウザで開くかどうかも指定できる。

```zsh:.zshrc
zstyle ':mime:*' browser-style running x
```

`running` が起動中のブラウザの新しいタブで開く、`x` が新しいブラウザで開く、という意味になる。

例えばこんなふうに設定したとすれば、

```zsh:.zshrc
zstyle ':mime:*' x-browsers opera firefox
zstyle ':mime:*' browser-style running x
```

この場合は以下のように上から順に探して、あったらそれでブラウザが起動する。

+ Opera が起動中だったら、それの新しいタブで開く
+ Firefox が起動中だったら、それの新しいタブで開く
+ Opera がインストールされていたら、新しく Opera を起動してそれで開く
+ Firefox がインストールされていたら、新しく Firefox を起動してそれで開く

それ以外にも、ブラウザを起動するときの引数を変えたり、テキストブラウザを使うようにしたりもできる。そのあたりの詳細は man を参照。

### 僕が使ってる設定

今僕が使っている設定を紹介する。

```zsh:.zshrc
autoload -Uz pick-web-browser
alias -s html=pick-web-browser
alias web=pick-web-browser

zstyle ':mime:*' browser-style running x
zstyle ':mime:*' x-browsers firefox opera
# opera '-newpage' option is deprecated
zstyle ':mime:browser:running:opera:' command 'opera -newtab %u'

function wiki() {
    if [ -n "$1" ]; then
        pick-web-browser "http://ja.wikipedia.org/wiki/$1"
    else
        echo "usage: $0 word"
    fi
}

function google() {
    if [ -n "$1" ]; then
        pick-web-browser "https://www.google.co.jp/search?q=${1}&ie=utf-8&oe=utf-8&hl=ja"
    else
        echo "usage: $0 word"
    fi
}
```

Wikipedia とか Google 検索がすぐできるように関数も作ってる。

こんな感じで pick-web-browser を使うと便利になると思うのでぜひ使ってみてください!

### 参考
man zshcontrib(1)  FUNCTIONS pick-web-browser
Finderでドットファイルを表示


ターミナルから以下を実行

```
defaults write com.apple.finder AppleShowAllFiles true && killall Finder
```

戻すときはfalseに

```
defaults write com.apple.finder AppleShowAllFiles false && killall Finder
```

#コメント
`killall Finder`を忘れがちなので注意。
こうしてワンライナー化しておけばシェルの入力履歴から辿りやすいというメリットも。

# 参考
[Macの隠しファイルや隠しフォルダを表示する裏技 / Inforati](http://inforati.jp/apple/mac-tips-techniques/system-hints/how-to-show-hidden-file-or-folder-of-macos.html)
今からでも遅くないWebpay入門

## はじめに
　WebpayのPython用ライブラリ[webpay-python][1]リリースにあたり、コードレビュを担当させていただいたaircastleです。
　皆さん、昨日の@keikuboの[記事][2]は読まれましたか? rubyを殆ど触ったことのない私でも、短時間でWebpayを利用したショッピングサイトのプロトタイプを作ることができました。是非記事の内容を実行して、その手軽さを体感してくださいね。
　さて、今日は、振り返りの意味も込めてWeb決済とWebpayのとても基本的な部分について簡単に説明したいと思います。

## この記事の対象者について
まず、この記事の対象者は以下のとおりです。

- 技術に関する知識はあるが、Webpay自体についてまだそれほど知らない方

私はコードレビュを担当させていただくまでWebpayについてあまり知りませんでした。
「同じような人にこそWebpayを知ってほしい」というのがこの記事のモチベーションです。
※コードの記載は極力避けました。

## Web決済導入の課題
　近年Web上でクレジットカードなどを用いたWeb決済を導入する企業が増えてきましたが、自社サービスに導入するためには何が必要なのでしょうか?

- Web決済を実現するための機能を実装しなければならない
- ユーザの決済情報を自社でセキュアに保存しなければならない
- クレジットカード会社の審査に伴うリードタイムがかかる

上記の3点が大きな課題であり、導入は一朝一夕では難しいことがイメージできると思います。これら課題を解決し、個人や小中規模の企業でもWeb決済を導入できるサービスがWebpayです。

## Webpayについて
上記では、Webpayを利用することで解決できる課題を挙げました。解決方法を順番に説明したいと思います。

### Web決済を数行のコードでシンプルに実現できる
Webpayでは、Ruby/PHP/Java/Python用のライブラリを提供しており、Web決済を導入するサービスの開発言語に合わせて数行のコードを追加するだけで、簡単に決済機能を実現することができます。

- [webpay-ruby][3]
- [webpay-php][4]
- [webpay-java][5]
- [webpay-python][6]

@hmskの[少しのコードでWebPayを導入する][7]を例に挙げれば、たった20行程度のコードで決済が実現できています。

### ユーザの決済情報を自社で管理する必要がない
Webpayでは、Webpay加盟店が決済情報を保持する必要がないトークン決済を実現しています。
トークンとは、各種決済情報示す一意なIDです。Webpayへデータを保存した際に返されるトークンを加盟店のサーバサイドに保存しておけば、決済情報自体を加盟店がもつ必要がありません。トークンを利用した決済の例として、Webpayのページから図を引用して説明したいと思います。

- Webpay, 加盟店(Webpayのユーザ)、加盟店のユーザの3つの登場人物がおり、
- 加盟店のユーザがブラウザを通じて決済を行う

状況を想定したいと思います。

![payments_with_token.png](https://qiita-image-store.s3.amazonaws.com/0/14629/4f1be199-081d-8176-8b73-6e491a7dec9b.png)

上の図の状況では、加盟店のユーザがブラウザから決済を実行した後、
1. 加盟店のユーザのブラウザからクレジットカード情報がWebpayへ送信される。
2. Webpayはクレジットカード情報に紐づくトークンを加盟店のユーザのブラウザへ送信する。
3. 加盟店のユーザのブラウザがトークンを加盟店へ送信する。
4. 加盟店は __トークンを用いて__ Webpayへ決済を実行する。
5. Webpayは決済結果を加盟店へ送信する。

という流れがあり、加盟店は、加盟店のユーザのカード情報をサーバサイドに保持することなく、トークンのみを利用して決済ができました。

### クレジットカード会社の審査に伴うリードタイム
Webpayは通常であれば、通常数週間かかる審査期間を、最短3日にすることができます。
また、テスト環境は審査期間中も利用することができ、加盟店サービスの開発を止めることもありません。

## 終わりに
　Web決済導入にあたる課題と、Webpayがそれらの課題をどのように解決するのかを簡単に説明しました。ご存知の方もいるかもしれませんが、ここで紹介した内容は、以下の *参考* に挙げた各種リソースを参照することで、より詳細な情報を得ることができます。この記事がWebpay入門へのキッカケとなれば幸いです。
　またWebpayを利用したサービス開発について興味がある方は、これまでの記事だけでなく、これからの記事にもご期待ください。私も次回は技術的な記事を書かせていただきたいと思います。

## 参考
- [Webpay:開発者向けクレジットカード決済サービス][101]</br>Webpayの公式サイトです。決済方法からAPIドキュメントなどの情報があります。ユーザ登録してサービスも利用してみてください。
- [BPStudy #74 ウェブ決済入門][102]</br>Webpayの特徴と他社との比較に関する情報です。10分程度で読むことができるので、この記事を読んで興味をもった入門者の方にオススメします。
- [WEB+DB PRESS Vol.76][103]</br>Webpay社の皆さんが、Web決済とWebpayについて記事を書いています。より進んだ入門者にオススメします。

[1]: https://github.com/webpay/webpay-python
[2]: http://keikubo.webpay.co.jp/post/69898857359/ruby-oss-spree-webpay
[3]: https://github.com/webpay/webpay-ruby
[4]: https://github.com/webpay/webpay-php
[5]: https://github.com/webpay/webpay-java
[6]: https://github.com/webpay/webpay-python
[7]: http://qiita.com/hmsk/items/744f9a7e37638340a992
[101]: https://webpay.jp/
[102]: https://speakerdeck.com/keikubo/bpstudy-number-74-uebujue-ji-ru-men
[103]: http://www.amazon.co.jp/WEB-DB-PRESS-Vol-76-%E4%BA%94%E5%8D%81%E5%B5%90/dp/4774158747
シェルでコマンド履歴に残らないようにコマンドを実行する

# 用途
* 複数回繰り返してはいけないようなコマンドを使用するときに使う．

# 方法
1. ~/.zshrcに```setopt hist_ignore_space```を設定する
2. 先頭に半角スペースを入れる
Cross Platform MIDI Tools Advent Calendar #8: 簡単なプレイヤー制御機能と演奏時間の表示

1週間ばかりブランクがあったのにしれっと続きを書いているわけだけど、前回までで技術的に参考になりそうな話はだいぶ書いてしまって、xmdspにかかる作業も後は細かい実装だけという雰囲気になった。そんなわけで今回から多少細かいネタを書く。

ここまでのバージョンでは演奏制御機能が何も無かったのでので、一旦演奏を開始したら演奏終了を待つかアプリケーションを終了するしか無かった。MidiPlayerのAPIとしては、その他にも一時停止、再開、変速再生(!)の機能が備わっている。とりあえずpauseとresumeはmust to doだ。

これらの機能は簡単に実装できた。変速機能については、後で説明する。

次に、各種の時間経過に伴うステータスのテキスト表示部分を実装することにした。具体的には、(1)時間による演奏位置の表示、(2)トータル演奏時間、(3)ティックカウント、(4)テンポ、(5)拍子 の5つだ。(2)はSMF全体を眺めて、テンポの変化の流れと、そこに至るまでのティックカウント数から、計算で求めることが出来る（MidiPlayerのAPIにはこれが既に含まれている）。(4)と(5)はMETAイベントを追跡していれば分かる（これらもMidiPlayer上に「現在の値」を取得できるように実装した）。

(3)は割と面倒くさい。(3)は面倒というか、設計を決めるのが悩ましい。MidiPlayerには、現在位置までのティックカウントが保存されていて、簡単に取得できる。内部的には単にMIDIイベントのデルタタイムを演奏しながら加算しているだけだ。View側では、そのティックカウントを表示するだけで足りる…はずである。実際に「それだけ」にして何が起きるかというと、ティックカウントはしばしば「止まったまま」になる、ということだ。時間は進んでいるのに、ティックカウントは次のイベントが来るまで変更されないので、イマイチ美しくない。

しかしこれはこれで実用性がある。このヴィジュアル プレイヤーの目的のひとつは、SMFの作成しやすくすることだ。単に時間を追いかけるだけでなく、長い沈黙の間に、イベントが適宜送信されているかどうかを、これで確認できることがあるなら、それは好ましいことだ。そういうわけで、このティックカウントはそのままの値を表示することにした。

(1)には2つ面倒な側面がある。ひとつは、これは完全に「時間」という独立したイベントループに基づいて、描画イベントが発生するということだ。他の描画イベントの端緒は、MIDIメッセージの受信、または演奏状態の変化を伴うユーザーの操作、に限られていた。この現在時間の表示のためだけに、別のループが発生することになる。

もうひとつ、さらに面倒な側面の話だが、ここで変速再生の話を混ぜることにしよう。

変速再生はいわゆる早送りの機能を実現するためにあって、使うと面白いと思えることもあるのだけど、MIDIファイルをオーサリングしている時に実用的かどうかは分からない。テンポを（SMF上の指定値からユーザー入力に応じて）変更するという機能は、割と複雑な処理を要求する。演奏時に、「今の演奏位置は時間でいうとどの辺だろう?」という情報（つまり(1)である）を知りたい場合、テンポがユーザーによって変更されなければ、演奏開始時間から現在時間までの差分のみで計算できる。しかし途中でテンポが変更されると、変更されたテンポに基づく時間の補正計算が必要になる（「テンポ変更が無ければこの時間になるはずだった」値と実際の演奏時間とのデルタ値を保存しておく必要がある）。これは少々面倒だ。

とは言え…実際にはpause / resume機能を実装すると、この「現在の演奏時間位置」の表示はいずれにしろ再計算されなければならなくなるので、どうせならこの倍速処理を実装してしまっても大して問題ない。

というわけで、(1)の実装にあたっては、「現在までにごちゃごちゃとユーザー操作によって操作された時間（TimeSpan）」と「最後に時間周りの操作が完了した時間（DateTime）」を合わせて計算することになる。早送り中は、テンポが補正されることによる時間の名目上の時間補正も必要になるので、それも考慮に入れられている。

というわけで、表示上は地味だが、内部ではいろいろな考慮事項が働いているのである。

![the latest xmdsp sshot](https://dl.dropboxusercontent.com/u/493047/2013/xmdsp-r21-sshot.png)

https://github.com/atsushieno/xmdsp/commit/f5eae9634b5509a9c6fd85448e79127abdc6551c
https://github.com/atsushieno/xmdsp/commit/0b0b781df303759cdb45b93ee633c49acffef5f6
Rubyでコンソールに色つきで出力

```rb
class String
  # colorization
  def colorize(color_code)
    "\e[#{color_code}m#{self}\e[0m"
  end

  def red
    colorize(31)
  end

  def green
    colorize(32)
  end

  def yellow
    colorize(33)
  end

  def pink
    colorize(35)
  end
end

puts "赤色で出力".red
puts "黄色で出力".yellow
FuelPHPで Class 'Auth' not found in

oil consoleでAuthインスタンスを作成しようとした際に、

```php
Fatal Error - Class 'Auth' not found in PKGPATH/oil/classes/console.php(117) : eval()'d code on line 1
```
というエラーが出ました。


##解決方法

このエラーは、app/config/config.phpで設定を行なうことで解決できます。

```php
'always_load'  => array(
    'packages'  => array(
        'auth',
    ),
),
```

'auth'を追加し、
'always_load'がコメントアウトになっているので、
コメントアウトを外します。

これでAuthを使用できるようになります。
HHKBの設定

## 自宅のキーボードをHHKB Lite2にしたのでその際にした設定をメモしておく。

兎にも角にもDriverをインストール。

デフォルトではDeleteキーは動作しない？ので、背面にあるDIPスイッチの3をオンにしてBackSpaceとして使用するようにした。

Command+Spaceで日本語切り替えが出来なかったのでMacの環境設定の【キーボード】【ショートカット】【入力ソース】から【前の入力ソースを選択】【入力メニューの次のソースを選択】をONにした。

## 参考リンク
http://www.pfu.fujitsu.com/hhkeyboard/macdownload_lite2.html
http://www.pfu.fujitsu.com/hhkeyboard/leaflet/hhkb_backview.html
定番！Rubyでワンライナー書く時の基本テク


`ruby -e script`を使うことで、ワンライナーを書くことができます。

http://docs.ruby-lang.org/ja/2.0.0/doc/spec=2frubycmd.html#cmd_option

アドホックな調べ物やフィルタ用途に便利なので日頃からよく使っています。
ただ、そのわりに案外書き方をド忘れてしがちなので、改めてまとめておきたくなりました。

## 標準出力に吐き出す

お馴染み、`Kernel.#puts` を使います。

http://docs.ruby-lang.org/ja/2.0.0/method/Kernel/m/puts.html

## エラー出力に吐き出す

`Kernel.#warn` を使います。

http://docs.ruby-lang.org/ja/2.0.0/method/Kernel/m/warn.html

## requireほげほげって書くの面倒臭い

-rオプションを使います。複数指定できます。

例えば、jsonとopen-uriをrequireして使う場合。

```sh
ruby -rjson -ropen-uri -e 'puts open("http://example.com").read.to_json'
```

## 引数を取る

`Object::ARGV`を使います

http://docs.ruby-lang.org/ja/2.0.0/method/Object/c/ARGV.html

## 標準入力から読み込んで1行ずつ順繰りに処理する

例えば、標準入力から読み込んで1行ずつ順繰りにputsする場合

```ruby
STDIN.each {|line| puts line }
```

Object::STDIN定数については http://docs.ruby-lang.org/ja/2.0.0/method/Object/c/STDIN.html を参照してください。

## どうしても複数行書きたい。ワンライナーとは何だったのか。

;で区切る

```ruby
puts 'hoge'; puts 'huga'; puts 'piyo'
```
Allow MySQL user to drop & create specific databases

Sometimes we'd like to rebuild the database during development, for example, drop the whole test database. To do this, we have to grant `CREATE` and `DROP` permissions for that user, and limit these operations to specific databases, so that it won't drop the wrong table.

To do this, run these SQL queries:

```mysql
# Normally the whole privilege will be granted so that Rails can take full control of it
GRANT ALL PRIVILEGES ON 'app_development.*' TO 'app'@'localhost';
GRANT ALL PRIVILEGES ON 'app_test.*' TO 'app'@'localhost';
```

That's it. Now `app@localhost` can only create and drop databases named `app_development` and `app_test`.
Riakを知るための情報源

どうしてもMySQLなどメジャーなDBに比べて情報源が少なくなりがちなRiak。
そんなRiakを知るために有用だと思われる僕の知る限りの情報源を、まとめてみた。

## [公式ドキュメント](http://docs.basho.com/riak/2.0.0pre5/)
なんといってもこれだ。
基本中の基本だが、用語説明やコンセプト、応用事例まで幅広く載っている。
ちなみに、ドキュメントの検索機能はYokozunaを使って実現しているらしいので、試してみよう！

## [Bashoブログ](http://basho.com/blog/)
Riakに関するイベントやその詳細、立ち入るきっかけの少ないRiakを支えるアルゴリズムなど、様々な話題が目白押しの公式ブログだ。
ブログ自体の内容はもちろん有用だが、「何から調べたら良いか分からない」という時はその取っ掛かりとしても良いだろう。
ちなみに[日本語版](http://blog.basho.co.jp/)もあるので安心してほしい。

## [Qiita](http://qiita.com/tags/riak)
別に僕はインクリメンツの回し者ではないが、日本語で活きた貴重な情報源といえる。
Riakの運用にフォーカスした実用的な内容が多く、利用イメージを掴むため最初に調べても良いかもしれない。
余談だが、最初は自分のブログに書いたほうが良いかなと思った。
しかし、Riakについて調べるときにQiitaのタグ機能などは非常に有効であり、情報の受け取り側にとっては楽なようにできているのだと感心した。

## 和書
実際のところ、Riakについての専門誌は無い。と思う。
取り上げられていたとしても、紙面の一部をriakコーナーとして、という程度だ。
例えば、以下の書籍は一部がRiakの話題になっている。

* [7つのデータベース7つの世界](http://www.amazon.co.jp/7%E3%81%A4%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9-7%E3%81%A4%E3%81%AE%E4%B8%96%E7%95%8C-Eric-Redmond/dp/4274069087/)
* 雑誌:[ソフトウェアデザイン](http://www.amazon.co.jp/Software-Design-%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2-%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3-2013%E5%B9%B4/dp/B00GA9ADNE)

7つのデータベース7つの世界は、ページ数こそ大したことないものの、Riakを使う上で必要な知識はひと通り書いていると思う。

## ソースコード
実際の挙動を深く追うためには避けては通れない。
Riakは多数のBasho製コンポーネントを組み合わせて作られている。
Riakをcloneしてmakeすると関連するソースコードをdepsディレクトリにダウンロードしてくるので、後は読めばいい。
1コンポーネント1機能で綺麗に分割されているので、興味がある機能から始めれば良いだろう。
Erlangの日本語情報源が少ないことが欠点なのかもしれない。
敷居が高いと感じる人は、Riak Source Code Readingに参加すれば良いと思う。

## 論文
難易度は高い。
でもいつかは読みたい。
Riakを支える根幹である。
Dynamo論文を始め、CRDTやConsistent Hashingなど、たくさんある。

## まとめ
以上が、僕が目にした情報源だ。
まだ全てには目を通していない（特に論文は…今後きっと読む）。
この他にも良い情報源があったら、Qiitaのコメントなどで是非教えて下さい！