OmniAICreator/Qiita-1.07M huggingface dataset:
Macでgit pullする前にブランチ名つけてバックアップするスクリプト


## 仕様

- your_projectでファイルを実行するとプロジェクトをバックアップする
    - デフォルトで生成されるファイルのパスの例　your_workspace/git_backup/your_project/ **現在のブランチ名**_15-01-06-11-03-18.zip
- 7日前から10日までの日付名を含むデータを削除
- 大きなプロジェクトになると毎回圧縮するのは辛い


## 準備

1. 「your_workspace/your_project/bu」にファイルを保存
1. 「your_project」に移動し``chmod a+x ./bu``

```bash:bu
#バックアップ先フォルダの作成
mkdir -p ../git_backup/${PWD##*/}/
zip -qr ../git_backup/${PWD##*/}/`git rev-parse --abbrev-ref HEAD`_`date +%y-%m-%d-%H-%M-%S`.zip ../${PWD##*/}/
#自己責任で・・・7日前から10日までの日付名を含むデータを削除
rm -fr ..pwd/git_backup/${PWD##*/}/`date -v-7d +%y_%m%d`_*
rm -fr ../git_backup/${PWD##*/}/`date -v-8d +%y_%m%d`*
rm -fr ../git_backup/${PWD##*/}/`date -v-9d +%y_%m%d`*
rm -fr ../git_backup/${PWD##*/}/`date -v-10d +%y_%m%d`*
#git pull or fetchする
#git pull
```


## 実行
``./bu``


# 参考にしたサイト

gitで現在のブランチ名を取得する
http://sugamasao.hatenablog.com/entry/2013/11/02/174311
Mac の bash で date を使って先月の今日の日付を取ろうとしたらハマった
http://weble.org/2010/09/21/mac-bash-date
Fluentdの2015年の展望


Fluentd Advent Calendar 2014最後の記事は，Fluentdやその周辺の今後について書きます．

## [Fluentd](https://github.com/fluent/fluentd)

v1を来年出す予定です．v1そのものは大きく後方互換性を損なう予定はないです．今月出したv0.12，そして来年の冬/春に出す予定のv0.14で導入される新しいAPI群が固まったら，v1がリリースされます．
v0.12ではFilter/Labelが入りイベントルーティングが改善されましたが，v0.14では他のコア部分を改善します．今のところ大きめなものとして以下の機能追加・変更を予定しています:

- 各プラグインの改善
  - Actor(名前変わるかも？)の導入・スレッドハンドリング周りの改善
  - Bufferプラグインでより細かな制御が出来るように
- イベント時間のミリ秒 or ナノ秒のサポート
- ServerEngineでスーパーバイザー/エンジン部分を置き換え

これらはv0.14で入れる予定です．その他使われていないプラグインの削除とか，より簡単に動くようデフォルトの設定を弄ったりとかもします．

## [fluentd-forwarder](https://github.com/fluent/fluentd-forwarder)

リリースしたあと少し落ち着いている感じになってますが，来年は残っているTODOを消化していく予定です．とくにコアのパフォーマンス改善など見えている課題はあるので，その部分はどうにかして行きたい所です．

## [fluentd-ui](https://github.com/fluent/fluentd-ui)

v0.3.11で設定の履歴管理などが入り更に使いやすくなりました．一番の課題はプラグイン設定画面の自動生成周りだと思うので，この辺はFluentd側とも協調して改善して行く予定です．

td-agent 2はfluentd-uiを同梱しているので，簡単に使うことができます．

## [ドキュメント](https://github.com/fluent/fluentd-docs)

v0.12ベースで設定とかを書き直そうと今色々と裏でやっているところです．Filter/Labelが入ったことでイベントハンドリング周りが改善されたのと，プラグインの書き方も後方互換性は保たれているとはいえ少し変わったので，その辺はばっさりと書き直したい所です．
導入部分とかも，一部はfluentd-uiベースで説明したいと思っています．

## Treasure Agent

### [td-agent 1](https://github.com/treasure-data/td-agent)

同梱しているRuby 1.9.3が来年2月でメンテナンスが終わることもあり，新規に始めるのであればtd-agent 2を使ってください．もちろんまだユーザはいるのでメンテナンスは行いますが，セキュリティfixがメインになります．

### [td-agent 2](https://github.com/treasure-data/omnibus-td-agent)

来年リリースする次のバージョンで，同梱するfluentdのバージョンをv0.12にする予定です．今現在のtd-agent 2.1.3でも，fluentdを直接アップデートすることでv0.12は利用することは出来ますが，もう少しお待ちください．

## コミュニティ

今年[Google関係のプロダクトで使われたり](http://qiita.com/kazunori279/items/8554cb8eccef05d2d4e5)，その他カンファレンスなどでユーザから話を聞いている限り，海外でもじわじわとユーザが増えているので，今後もこの取り組みは続けて行きたい．個人的には，MLで質問に答えてくれるユーザを増やしたい所…
予定との兼ね合いもありますが，イベントとかあれば話したりとかは出来るので，何かあれば是非相談してもらえればと思います :)

ということで，今年一年ありがとうございました！来年はv1含めもっと使いやすくもっとパフォーマンスが出せるようにする予定なので，今後もFluentdをよろしくお願いします！！
【Windows】Web制作で役立ちそうなbatファイル色々

#効率化に役立つかもしれないbatファイル


##プロジェクトのテンプレートになるファイルをコピー

```bat:project_files.bat
echo d | xcopy /e /i D:\xxxx\yyyy\zzzz %~dp0\zzzz
```
batファイルをクリックしたディレクトリにファイルをコピーします。
コピー元がサーバでも可能。

##日付のディレクトリを作成

```bat:auto_date_dir.bat
set dirname=%DATE:/=%
mkdir %~dp0%dirname%
```
batファイルをクリックしたディレクトリに、日付のディレクトリを自動作成。
データを整理したり、zipで送るときに便利です。

##npm install

```bat:package_install.bat
cd /d %~dp0
npm install
```
grunt,gulpなどに。batファイル同じ階層にpackage.jsonを置いておく。
batファイルをクリックでnpm installが開始。
他にもsassのcompile/watchやliveReload等のコマンドを叩くのが面倒なときに使えます。


##.htaccess,.htpasswdに変換

```bat:rename_htfiles.bat
cd /d %~dp0
rename htaccess.txt .htaccess
rename htpasswd.txt .htpasswd
```
batファイルをクリックしたディレクトリにあるhtaccess.txt,htpasswd.txtを.htaccess,.htpasswdに変換。
.から始まるファイルに変更できない際に役に立ちます。

##Remarks
他にもファイルの差分を取ったり、FTPとして使ったりも出来ますが、色々と面倒なので専用ツールを使ったほうが良いと思います。
iOS7以降、UITextViewの動きがおかしかったら【メモ】

UITextViewで、キーボードを閉じた時に勝手にトップにスクロールされたり、最終行で改行するとおかしな位置にカーソルがずれたり、かれこれ1週間くらい悩まされていたのですが、以下のようにコードを入れたところ無事に解決しました。

※どうしてみんな困っていないのだろう。。。


```swift:swift
self.textView.layoutManager.allowsNonContiguousLayout = false
```



```objc:objc
self.textView.layoutManager.allowsNonContiguousLayout = NO
```

参考（感謝です）：
http://blog.mugunthkumar.com/coding/radar-15159094-uitextview-nsattributedstring-is-hopelessly-broken-on-ios-7-3/
http://hayatomo.com/2014/09/26/1307
td-agentをv1からv2にバージョンアップした話

td-agentをv1からv2にしてみました。
td-agentを含めて3つ、バージョンが分かれている部分があります。

* td-agent (v1 => v2)
* 設定ファイル (v0 => v1)
* fluentd本体 (0.10.x)

`td-agent --version`で出力されるバージョンはfluentd本体のものなので注意。

##インストール

yumを例に、手順にしたがって
1. td-agent v1のアンインストール
`sudo yum remove -y td-agent`
2. リポジトリパスをv2のものに修正
3. td-agent v2のインストール
`sudo yum install -y td-agent`
4. プラグインのインストール
`sudo /usr/sbin/td-agent-gem install my-plugins #コマンドが変更に`

## 設定ファイル修正
td-agentをv2にすると、設定ファイルがv0からv1になります。(デフォルトでは)
` /etc/td-agent/td-agent.conf`などを修正する必要があるか確認します。

`[`や`{`で始まる値はシングル/ダブルクオートで囲うようにします。
例えばメールプラグインのメールの件名が
`[error]アプリ`となっていた場合は、
`"[error]アプリ"`に変更します。
修正しないと動作しません。

`include`をしているときは`@include`に変更します。
修正しないとtd-agentのログにwarnが出ます。

最後に`td-agent configtest`でテストしてみて、
問題ないようだったら起動しましょう。

##参考記事
* [Treasure Agent(td-agent)の1と2の今後](http://qiita.com/repeatedly/items/c8107bc8ba5ba01133f8)
* http://docs.fluentd.org/articles/config-file#v1-format
yaml_dbを使った初期データ管理

railsで初期データを投入する手順としては、db/seeds.rbを使った手順が一般的です。
標準的な方法で、とりあえずランダムなデータを放り込んだりする用途には便利なのですが、データ量が増えてきたり、リレーションのあるデータを作成したりしないといけなくなると、だんだん辛くなってきます。

本番環境ではユーザーが注文したらorderからuserにリレーションがはられるのに、seeds.rbやfactoryGirlではどうしてエンジニアがいちいちリレーションを考えなきゃいけないのでしょう。いっそ本番環境のデータまるごと持ってきたら楽じゃね？

<a href='https://github.com/yamldb/yaml_db' target='_blank'>yaml_db</a>というgemをつかうと、既存のデータベースにあるデータをyaml形式でダンプしたり、逆にyaml形式のデータをロードすることが出来ます。

# データを出力

いつもどおり、Gemfileに書いてbundle installします

```
gem 'yaml_db'
```

今あるデータベースのデータを出力させます

```
rake db:data:dump_dir dir=seed_yml
```

yaml_dbにより、db/seed_yml ディレクトリの下に現在のDBデータがyml形式でダンプされます。

# データをロードする

新しく環境を作る時は、git clone, bundle install, rake db:setup のあと

```
rake db:data:load_dir dir=seed_yml
```

を実行することで、初期データが読み込まれます。本番環境からDBをコピーしてきたような状態です。

# データを編集する

この状態では、すべてのテーブルのすべてのデータが出力されていますが、実際のユーザーさんの個人情報をむやみに開発環境に持ち出す訳にはいかないですし、delayed_jobのようなデータは初期データとしてロードされないほうがいいでしょう。

ということで、出力したデータをエディタで開いて、開発用データに作り変えます

出力したデータは db/seed_yml/ 以下にテーブルごとのymlファイルとして保存されています。これを編集することで、データをいじることが出来ます。

不要なテーブルはバッサリ削除。一部不要なデータを含むようなファイルはエディタで編集するなどして、開発で使うyamlファイルを作成します。

* 例）ユーザー情報テーブルのデータは、最初の数人(社内ユーザー)をのぞいて削除
* 例）コメントテーブルのデータは、なくても困らないからファイルごと削除
* 例）タグテーブルのデータは、まるごと残して初期データとして取り込む

出来上がったyamlファイルを、migrationファイルなどと同様にGitにCommitしてしまいます。こうすることで、新しく来た開発者さんでも、必要なデータが導入された状態で開発を始めることができます。既存の開発者さんも、キリの良い所でロードし直すことで本番に近い環境を維持することができるので、リリース後に問題が発覚するリスクが抑えられていい感じですね

※ users.ymlをgitに上げると、暗号化済みとはいえパスワードをgitに公開することになるので、ここはちょっと考えどころです...

# まとめ

 本番DBの環境を元に開発DBのデータを作る流れで説明しましたが、逆のパターンも考えられます。
タグとかカテゴリ名のように、初期データが必要なテーブルに対して、デプロイ時にデータを流しこむような用途でも使えますよね。
自分が今年使った技術まとめ(2014年)


今年いろいろなことをやったので、自分がやったことをまとめておきます。
こんなことできるんだぞーということをアピールして周りが困っているときに助けになれればいいなーと思うのと、来年は何を勉強しようかという参考にする自分へのメモの意味もあります。


# Android
Androidは得意分野ではあるので、安定して仕事をこなしていました。

## Android NDK
C/C++のライブラリをAndroidで動かす的なことをやりました。
ただのJNIだけじゃなく、NativeActivityも使ったりして苦労をした覚えが。
NativeActivityからJavaを呼び出すのは [[android-ndk]NativeActivityからJavaのメソッドを呼ぶ方法](http://qiita.com/sassy_watson/items/6363aeaca76fd7eba23f) にまとめましたね。

## Android Wear
年末に触った程度。[ここ](http://developer.android.com/training/building-wearables.html)読めば良さげな感じなので、あんまりまとめてないけど、あとでまとめておこうと思ってます。

# iOS
## Objective-C
今年はがっつりObjective-C書きました。
[詳解 Objective-C 2.0 第3版](http://www.amazon.co.jp/gp/product/4797368276?ie=UTF8&camp=1207&creative=8411&creativeASIN=4797368276&linkCode=shr&tag=sassyw-22)
は手元においておきました。
あと [エキスパートObjective-Cプログラミング ― iOS/OS Xのメモリ管理とマルチスレッド](http://tatsu-zine.com/books/objc)
も参考。

使ったライブラリは
https://github.com/stomita/ios-imagefile-megapixel
くらいかも

# Cordova

http://cordova.apache.org/
マルチデバイスでアプリを作る必要があったため。
UIはHTMLで、Pluginのしくみでそれぞれのデバイス向けの言語でプラグイン書きました。

# JavaScript
cordovaでUIを書くのにがっつり書きました。
あと、Node.jsをいろいろいじってた。

## jQuery
まあ基本なんですけどね。deferred思いっきり使った。

## Underscore.js
こちらも基本ですね。

## jQueryMobile
SenchaTouchとどちらか使おうとなやんでこっちにしました。
[jQueryMobile](http://jquerymobile.com/)
Sencha touchを調べたメモはQiitaに書いた[Sencha Touch 2でWebアプリを始める](http://qiita.com/sassy_watson/items/5b0d30ee2fcf6c20e13d)

[Sencha Touch](http://www.sencha.com/products/touch/)

## D3.js
http://ja.d3js.node.ws/
グラフ書いたりしたかったので。

## Jasmine
テストはJasmine使いました。
http://jasmine.github.io/2.0/introduction.html

## Grunt
Gruntさんめちゃくちゃ使いましたよ。
[jshint](https://developers.google.com/cast/) とか。


# HTML5関連

## WebSocket
WebSocketなんかよくつかいました。
クライアントはonopenだったり、onmessageだったりを実装するだけなので簡単です。
サーバー側は[socket.io](http://socket.io/)使ってみたり、
C言語使う必要があったので[libwebsockets](https://libwebsockets.org/trac/libwebsockets)で実装したりしました。

## WebRTC
WebRTCも使ってみたり。
[skyway](http://nttcom.github.io/skyway/)使いましたよ。
idの交換はWebSocket。
WebRTC難しいですよね。STUNとかTURNとか。
ちゃんと勉強しようと思って[WebRTC ブラウザベースのP2P技術](http://www.amazon.co.jp/gp/product/4897979587/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=4897979587&linkCode=as2&tag=sassyw-22)を読み始めました。


## Canvas
いろいろとCanvas使いました。
http://www.w3.org/TR/2dcontext/ にあるCanvasのAPIをつかったり、
getImageData()使って画像加工したり。
例えば [canvasで画像処理(ネガポジ変換/グレースケール変換)](http://qiita.com/sassy_watson/items/676af253d8425ce0f8fc)

## SVG
SVGいいやつだよ。


# Windows Azure
触る機会があった。
コンソールでロール作ってC#でコード書いてデプロイして雨後書いてみたり。
はじめてC#をちゃんと書いた気がする。

# ChromeCast アプリ
作る機会があったので。
ReceiverアプリはAndroidでつくりました。
[こちら](https://developers.google.com/cast/)を見ながら格闘した記憶が。


# C++
わけあってC++を書きました。
いろいろなキャスト勉強になりました。

# Java
こちらも書くこともあったので。もちろんAndroid以外で。

# その他
## Firefox OS
ちょっとだけ調査した。
CとかC++の資産使えないかどうかでEmscriptenを調べてました。
[EmscriptenでC言語をJavaScriptに変換する](http://qiita.com/sassy_watson/items/3ec69b19a22a457362a9)

## Scala
Scalaの勉強会行ったりしてちょっと勉強してましたが、
もう少し時間をとって勉強したかったな。



----
なんかもっといろいろやった気がするけど、こんなもんか。
どちらかというとクライアント側のコード書くことが多かったですね。
来年はどんな仕事をすることになるのかしら。
DurovisDiveにリセット機能を付ける

#自作スロットIN系HMDコンテンツの欠点は入力デバイスがPCほどリッチではないことなのだ、ならばどうする。

…というわけで、どうしてます？

#そんなこと言われても

なんの話だよって思われるでしょうが。

なにかとOculus勢と比較される自作スロットIN系HMD界隈ですが。
いや、勝手に目の敵にしていて、あちらさんは目にもくれてない感もありますが。
いや、勝手に目の敵にしているのは僕だけかもですが。

Oculus界隈の話題はそれ単体というより、＋αである操作デバイスに比重が偏りつつある感があるのも一つの事実。

だって、Oculusっていわばディスプレイであって、無理やりやれば出来ないこともないけど決して入力デバイスではないので。
なので、**LeapMotion**や**Kinect**や**Myo**や**Ring（笑）**など、数多の入力デバイスとの連携が研究されているわけです。

#それを踏まえて
自作HMD界隈は正直＋α入力デバイスは現実的ではないのです。
なぜなら、タオバイザーやGoogleCardBoardのようにヘッドマウントはしておらず、手で支える系が主流なので。

そこで使えそうな入力デバイスは

1. 画面をどこでもいいのでタップ（タオバイザーやハコスコにある下から指を入れる卑猥な窓使用）
2. Googleさんによって掘り起こされた マグネットスイッチ

の２つにほぼほぼ絞られてしまう現状。

#うわっ…？　私の入力デバイス少なすぎ…？

イメージでいうと、こんな感じ
![StrongEnter](http://www.zakka-awards.jp/outcome/images/img-manabi-strongenterkey.jpg)

もう、でっかいエンターキーがあるくらいのイメージ。

では、その貴重なスイッチを何に割り当てるのが正解なのか？

#それは誰にもわからない

・・・けど、僕が今考える最適な使い方を紹介したいと思います。

それは、**リセット機能**です。

はい、そこ「えー」とか言わない。

GoogleCardBoardやDurovisDiveのコンテンツを試した方は大体わかると思うんですが、

・スマホでコンテンツ起動してから、スロットインして、覗いたら**あらぬ方向を向いている。**
・飲み会の席なので、コースター系アプリを誰かに試してもらっていて、興味を持ってくれた向かいの人にそのまま渡した**ら逆走（後ろを向いている）事になっている。**
・なにかの拍子でヨードリフトをし始めて、かってに画面グルグル。　収まった頃には**やっぱりあらぬ方向を向いている。**

が多すぎるのです。

なので、**リセット機能**とは言いましたが実はダブルミーニングで

・コンテンツリセット（本当に起動直前に戻る）

か

・端末向きリセット（今向いている方向を初期方向とする）

のどちらかが熱いのです！　今回押したいのはこの**端末向きリセット**です（長い前振りでしたね・・・）

#端末向きリセット(Unity+DurovisDiveSdkの事例)

まず、最低限こんな感じのスクリプトを用意します。

[AngleAdjuster.cs]

```C#
using UnityEngine;

public class AngleAdjuster : MonoBehaviour {
	private OpenDiveSensor openDive;
	private static Quaternion targetRotation = Quaternion.identity;

	void Start () {
		transform.rotation = targetRotation;
		openDive = GameObject.FindObjectOfType<OpenDiveSensor>();
	}

	void Update () {
		if(Input.anyKey)RotReset();
		transform.localRotation = Quaternion.Lerp(transform.localRotation, targetRotation, 0.1f);
	}

	public void RotReset(){
		if (openDive == null) return;
		targetRotation = Quaternion.Euler(0, -openDive.gameObject.transform.localRotation.eulerAngles.y, 0);
	}
}

```

そして、
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/37184/25ad4454-9093-6597-d578-b8db51019cf1.png)
のように空GameObjectを作って、先ほどのスクリプト（AngleAdjuster）をアタッチ

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/37184/33a1642a-47b9-36a5-3884-668a4450f491.png)

のように、Dive_Cameraプレハブを先ほど作ったGameObject(Player)の子にして、
1. **Add_rotation_gameobject**にチェック
2. **Rotation_gameobject**に親GameObject(ここではPlayer)を指定

です。

やっていることは何かタッチされたらOpenDiveSensorが向いている方向を取って、それが相殺するようにy軸を回転させているだけで
（既に45度の方向を向いていたら、その親Objectを-45度向かせて0度（正面）を向かせる感じ）正直、それくらい最初から用意しておいてくれよって思うんですがねー。

そういえばふと思ったんだけど、マグネットスイッチってダブルタップ（？）や長押しって取れるんですかね。　それだけでも大分助かるんですが。今度試します。

#まぁそんなことよりも
そしてもっとみんなコンテンツ作ろうぜ！　そして僕を楽しませておくれ！
zleを使わないでコマンドラインに値を入力した状態にする

# tl;dr

`print -z` をつかう。

## きっかけ

`percol`/`peco`ってすごく便利なので、絞り込みを行うshellの関数をたくさん定義したい。
けど、コマンドラインに値を設定するために`zle -N`と`bindkey`を使ってショートカットキーを登録することが前提になっている。

* http://weblog.bulknews.net/post/89635306479/ghq-peco-percol

たくさんの人が参照していそうなところからサンプルをいただくとこんな感じ。


```zsh
function peco-src () {
    local selected_dir=$(ghq list --full-path | peco --query "$LBUFFER")
    if [ -n "$selected_dir" ]; then
        BUFFER="cd ${selected_dir}"
        zle accept-line
    fi
    zle clear-screen
}
zle -N peco-src
bindkey '^]' peco-src
```

ショートカットキー一発で起動できるのは便利。でも、ちょっとしたソースを絞り込む関数を定義するにも、ソースの数だけショートカットキーが消費されて辛い部分もある。

## `print -z` をつかう

`zle`は主にコマンドラインに値を設定するために利用されているので、別の方法で値を設定すればなんとかなりそう。zshの組み込みコマンドを眺めてみると、どうやら`print -z`が使えるらしい。

`print -z`を使うとこんな風にできる。

```zsh
function _percol_junkfile_source() {
  find $HOME/Dropbox/memo/junk -type f | sort -r
}

# emacsのopen-junk-file.elで作ったファイルを閲覧する。
function junkfile() {
  local selected_file=$(_percol_junkfile_source | percol --query '$*')
  if [ -n "$selected_file" ]; then
    if [ -t 1 ]; then
      print -z "less ${selected_file}"
    else
      print $selected_file
    fi
  fi
}
```

この例だと、シェル関数を呼び出したときは`less <file>`がコマンドラインに入るし、pipeでつないだときは選択したファイルが出力される。

## 参考

* [man zshbuiltins](http://linux.die.net/man/1/zshbuiltins)
エッジ検出


ActionScript 3.0によるエッジ抽出の実装です。
ConvolutionFilterクラスを使います。

> ConvolutionFilter クラスを使用すると、マトリックス畳み込みフィルタ効果を適用できます。
畳み込みでは、入力イメージ内のピクセルを、隣接するピクセルと組み合わせて、イメージを作成します。
畳み込みを使用すると、ぼかし、エッジ検出、シャープ、エンボス、ベベルなど、幅広いイメージ効果を実現できます。

```as3:sample.as
package
{
  import flash.display.*;
  import flash.events.*;
  import flash.filters.*;
  import flash.media.Camera;
  import flash.media.Video;
  import flash.geom.*;

  public class CameraEx extends Sprite
  {
    private var bitmapData:BitmapData;
    private var bitmap:Bitmap;
    public function CameraEx()
    {
      bitmapData = new BitmapData(stage.stageWidth, stage.stageHeight, false, 0xffffff);
      bitmap = new Bitmap(bitmapData);
      addChild(bitmap);
      var camera:Camera = Camera.getCamera();
      camera.setMode(stage.stageWidth, stage.stageHeight, 10, true);
      if(camera != null) {
        this.addEventListener(Event.ENTER_FRAME, function(e:Event):void
        {
          bitmapData.draw(video);
          var edge:Array = [0, -1, 0, -1, 4, -1, 0, -1, 0];
          var conv:ConvolutionFilter = new ConvolutionFilter(3, 3, edge, 1);
          bitmap.filters = [conv];
        });
        var video:Video = new Video(stage.stageWidth, stage.stageHeight);
        video.attachCamera(camera);
      }
    }
  }
}
```

![スライド.jpg](https://qiita-image-store.s3.amazonaws.com/0/3862/9328e10d-d527-dd62-2ae0-372259606789.jpeg)
鏡面反射

ActionScript 3.0による鏡面反射の実装です。


![スライド.jpg](https://qiita-image-store.s3.amazonaws.com/0/3862/343bec49-026b-6059-af16-9b8d4f362bf5.jpeg)


```as3:sample.as
var urlReq:URLRequest = new URLRequest("AutumnLeaves.jpg");
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,completeHandler);
loader.load(urlReq);
function completeHandler(e:Event):void {
        var gmask:Sprite = new Sprite();
        var bmpSprite:Sprite= new Sprite();
        var _bmpSprite:Sprite= new Sprite();
        var _bmp:Bitmap = Bitmap(loader.content);
        _bmp.scaleY=-1.0;
        _bmp.y=_bmp.height*2;
        var fillType:String = GradientType.LINEAR;
        var colors:Array = [0x000000, 0x000000];
        var alphas:Array = [0.4, 1];
        var ratios:Array = [0, 255];
        var matrix:Matrix = new Matrix();
        matrix.createGradientBox(_bmp.height,_bmp.width,Math.PI/2,_bmp.width);
        gmask.graphics.beginGradientFill(fillType, colors, alphas, ratios, matrix);
        gmask.graphics.drawRect(0,0,_bmp.width,_bmp.height);
        gmask.y = _bmp.height;
        _bmpSprite.addChild(_bmp);
        _bmpSprite.addChild(gmask);
        addChild(_bmpSprite);
}
```
zshrc に環境変数書くときにスマートに

...したいけどうまく行かないのでアドバイス頂きたいです


```zsh:.zshrc
local -a PA
PA=("/usr/local/sbin")
PA=($PA:"/usr/local/bin")
PA=($PA:"/usr/bin")
PA=($PA:"/opt/grass/bin")
PA=($PA:"/opt/grass/scripts")
PA=($PA:"/opt/java/bin")
PA=($PA:"/opt/java/db/bin")
PA=($PA:"/opt/java/jre/bin")
PA=($PA:"/usr/bin/site_perl")
PA=($PA:"/usr/bin/vendor_perl")
PA=($PA:"/usr/bin/core_perl")

export PATH=$PA
```

配列にした意味が無い気がする

改行区切りで配列初期化の書き方ができれば

そもそも環境変数の設定はここじゃないところですべき？

##追記 12/28 15:00
mollifier さんにコメント頂き改良しました

```zsh:.zshrc
path=(
    $path
    "/usr/local/sbin"
    "/usr/local/bin"
    "/usr/bin"
    "/opt/grass/bin"
    "/opt/grass/scripts"
    "/opt/java/bin"
    "/opt/java/db/bin"
    "/opt/java/jre/bin"
    "/usr/bin/site_perl"
    "/usr/bin/vendor_perl"
    "/usr/bin/core_perl"
)
```

これは綺麗ですね
【C++】std::bindの使い方

C++のstd::bindの使い方。
使おうと思った時に忘れてるのでメモ。

```cpp:main.cpp
#include <iostream>

void test_function(int a, int b) {
    printf("a=%d, b=%d\n", a, b);
}

int main(int argc, const char * argv[]) {
    auto func1 = std::bind(test_function, std::placeholders::_1, std::placeholders::_2);
    func1(1, 2);
    // -> a=1, b=2

    auto func2 = std::bind(test_function, std::placeholders::_1, 9);
    func2(1);
    // -> a=1, b=9

    return 0;
}
```

std::bindは何をしてくれるかというと、
**指定した関数をラップしたstd::functionを作る**
ということです。

``std::placeholders::_n``というのがわかりづらいですが、これは
**作ったstd::functionを呼び出す時の引数**
を表しています。

上の例の場合、こんな感じの関数(std::function)が作られると考えると良いと思います。(あくまでイメージ)

```cpp
auto func1 = std::bind(test_function, std::placeholders::_1, std::placeholders::_2);
  ↓ // こんなイメージの関数(std::function)ができる
void func1(?1, ?2) {
    test_function(?1, ?2);
}

auto func2 = std::bind(test_function, std::placeholders::_1, 9);
  ↓ // こんなイメージの関数(std::function)ができる
void func2(?1) {
    test_function(?1, 9);
}
```

*?1, ?2* と書いたのは ``std::placeholders``を表しています。
func2の例の場合は、2つ目の引数を固定値にしているので、実行時に固定値が渡されます。

``std:: placeholders``は最初は理解しづらいですが、プログラムからSQLを実行する際の、
 "**?**" をイメージすると良いかもしれません。

```sql
select * from table_name where id=?;
```
と書いた時のバインド変数 "**?**" が``std::placeholders::_1``にあたります。  
この定義したSQLがstd::bindの戻り値(std::function)で、SQL(std::function)を実行する時に、
 "**?**" (``std::placeholders``)に引数を渡して呼び出すという感じです。


ちなみにインスタンスメソッドを指定したい場合は、std::bindの第2引数にインスタンスを渡します。

```cpp:main.cpp
#include <iostream>

class Test {
public:
    void test_function(int a, int b) {
        printf("a=%d, b=%d\n", a, b);
    }
};

int main(int argc, const char * argv[]) {
    auto test = Test();
    auto func1 = std::bind(&Test::test_function, test, std::placeholders::_1, std::placeholders::_2);
    func1(1, 2);
    
    return 0;
}
```

自分自身のメソッドを呼び出す場合は``this``を指定すればOK。

```cpp:main.cpp
#include <iostream>

class Test {
public:
    void test_function(int a, int b) {
        printf("a=%d, b=%d\n", a, b);
    }
    
    void bind_test() {
        auto func1 = std::bind(&Test::test_function, this, std::placeholders::_1, std::placeholders::_2);
        func1(1, 2);
    }
};

int main(int argc, const char * argv[]) {
    
    auto test = Test();
    test.bind_test();
    
    return 0;
}
```


以上です。
プロジェクト単位で git hooks をソース管理したい

そういう時ってどうすればいいのかよくわからないので、少し検索した感じをメモします。

## 1. チェックする本体をソース管理して、そこへ symbolic link 貼る
http://stackoverflow.com/questions/427207/can-git-hook-scripts-be-managed-along-with-the-repository/427269#427269 とか

## 2. チェックする本体をソース管理して、それを呼び出すだけにする
http://labs.gree.jp/blog/2011/03/2885/#hs_5b7584fe8cb2795509a54288bb30c797_header_8 とか

それの派生で

https://github.com/icefox/git-hooks 

こういうツールもあるみたい。
`git_hooks/` の中に hook script 入れてソース管理して、
`git hooks --install`すると、実態はそっちを呼び出すだけになる
ZABBIXインストールメモ（したがき）

ZABBIXインストールメモ


CentOS 5.11

```
- CentOSバージョン確認
[webadmin@vps1-web ~]$ cat /etc/redhat-release
CentOS release 5.11 (Final)
```

CentOS5.9にZabbix2.0.6をyumインストールする手順メモ
http://blog.watercloud.net/article/360365606.html


```
# yum -y install zabbix-agent
# yum -y install zabbix-server-mysql zabbix-web-mysql
# yum -y install zabbix-get
```

- mysqlソケットエラー解決法
 - http://d.hatena.ne.jp/TamaC/20090330/1238418696


- zabbixリポジトリ
 - http://repo.zabbix.com/zabbix/2.4/rhel/5/x86_64/

```
rpm -ivh http://repo.zabbix.com/zabbix/2.0/rhel/5/x86_64/zabbix-release-2.0-1.el5.noarch.rpm
rpm -e http://repo.zabbix.com/zabbix/2.0/rhel/5/x86_64/zabbix-release-2.0-1.el5.noarch.rpm
rpm -ivh http://repo.zabbix.com/zabbix/2.4/rhel/5/x86_64/zabbix-release-2.4-1.el5.noarch.rpm
yum -y install zabbix-agent
yum -y install zabbix-server-mysql zabbix-web-mysql
yum -y install zabbix-get
```


- http://lab.unicast.ne.jp/2011/06/13/centos-5-6-%E3%81%AE-php-%E3%82%92-5-3-%E7%B3%BB%E3%81%AB%E3%82%A2%E3%83%83%E3%83%97%E3%82%B0%E3%83%AC%E3%83%BC%E3%83%89%E3%81%99%E3%82%8B/

```
mysql -uroot -p [pass] < /usr/share/doc/zabbix-server-mysql-2.4.2/create/schema.sql
mysql -uroot -p [pass] < /usr/share/doc/zabbix-server-mysql-2.4.2/create/images.sql
mysql -uroot -p [pass] < /usr/share/doc/zabbix-server-mysql-2.4.2/create/data.sql
```
fluentdのプロセス名を変更するプラグインを書いた

fluentd(やtd-agent)を運用しているとプロセス名が長くてmultiprocessプラグインを利用している際にパッ見どのプロセスがどのconfを読んでるのかわかりづらい。

```
12236 td-agent  20   0  693m 374m 3200 S 78.4  1.2  92:29.95 /opt/td-agent/embedded/bin/ruby /opt/td-agent/embedded/lib/ruby/gems/2.1.0/gems/fluentd-0.10.57/l...
12223 td-agent  20   0  486m 263m 3064 S 64.5  0.8  34:25.63 /opt/td-agent/embedded/bin/ruby /opt/td-agent/embedded/lib/ruby/gems/2.1.0/gems/fluentd-0.10.57/l...
```

なので起動時に`Process.setproctitle`呼ぶだけのプラグインを書いた。

https://github.com/cubicdaiya/fluent-plugin-setproctitle

設定はインプットプラグインとして記述する。

```fluentd.conf
<source>
  type setproctitle
  proctitle cubicdaiya-fluentd
</source>
```

というわけでピクシブ在籍時はfluentd関連業務をほぼ@harukasanに丸投げしていた僕もとうとうFluentd plugin author(大げさ)になりました。最近の仕事はElasticsearch、Fluentd、Kibana、Norikra、BigQueryと格闘しながらnginx.confとPHPとRubyとGoを書くことです。
`multipart/alternative`なメールを `plain/text`形式で見たい場合

何らかの理由で `multipart/alternative` なメールを `plain/text` で確認したい場合

## thunderbird
`mailnews.display.prefer_plaintext` を `true`にする

## Mac の Mail.app
`$ defaults write com.apple.mail PreferPlainText -boolean true`
ただし marvericks から無理っぽい
See: https://discussions.apple.com/message/23526803#23526803
CMake でのメタプログラミングとその応用

## はじめに

みなさん、こんにちは。今回は CMake でのメタプログラミングとその応用について書いていきます。

## eval()

CMake には、文字列をコードとして評価する機能――いわゆる eval に相当するものがありません。しかし、以下の手法を用いることにより、eval と同等の機能を持つコマンドを作成することができます[[参考](http://stackoverflow.com/questions/6370283/how-to-make-temp-directory-in-cmake/13708234#13708234)]。

```cmake
function(eval code)
  set(path ${CMAKE_CURRENT_LIST_DIR}/.temp.cmake)
  file(WRITE ${path} "${code}")
  include(${path})
  file(REMOVE ${path})
endfunction()

eval("message(1)") # 1
```

上記では、受け取ったコード`code`をファイルに書き込み、それを`include()`することで、eval を実現しています。これによって、CMake スクリプトで CMake スクリプトの生成と実行が行えるようになます。これは、CMake でメタプログラミングが可能になったということを意味しています。

## コマンドのリフレクション

さて、`eval()`コマンドを用いると、CMake では出来ないコマンドのリフレクションが可能になります。以下の例では、変数`command_name`に格納されているコマンド名を元にコマンドを呼び出しています。

```cmake
set(command_name message)
eval("${command_name}(a b c)") # abc
```

## 無名関数

また、`eval()`コマンドを用いると無名関数を作ることもできます。

まず、引数に Bracket Arguments を使用してみます。このようにすると無名関数のような見た目になり、エスケープや変数参照が無効となるので、無名関数内でのローカル変数を表現できます。

```cmake
set(value 1)

eval([[
  set(value 2)
  message("value: ${value}") # value: 2
]])
```

つぎは、無名関数に引数を導入してみましょう。これは以下の様なシンタックスとします。

```cmake
[[(a b c)
  ...
]]
```

そして、これを解釈して実行する`eval_lambda()`というコマンドを作成します。

```cmake
function(eval_lambda)
  list(GET ARGV -1 lambda)
  list(REMOVE_AT ARGV -1)
  unset(names)
  
  if(lambda MATCHES [[^\(([^)]*)\)(.*)$]])
    set(names ${CMAKE_MATCH_1})
    set(lambda ${CMAKE_MATCH_2})
  endif()
  
  eval("
    function(eval_lambda_impl ${names})
      ${lambda}
    endfunction()
  ")
  eval_lambda_impl(${ARGV})
endfunction()
```

動作として、無名関数を表す文字列の引数部分とコード部分を分離し、それをもとに実際にコードを実行する`eval_lambda_impl()`というコマンドを`eval()`コマンドにて生成し、実行するという流れです。さっそく使用してみます。

```cmake
eval_lambda(1 2 3 [[(a b c)
  message("a: ${a}") # a: 1
  message("b: ${b}") # b: 2
  message("c: ${c}") # c: 3
]])
```

無名関数に引数を導入するのに成功しました。

## 無名関数の応用

この無名関数によって得られる実益は、例えばコードの前後に処理を入れたい場合でしょうか。以下は実行の際に作業用のディレクトリを作成し、コードの実行が終わると削除するコマンドです。

```cmake
function(in_working block)
  get_filename_component(name ${CMAKE_CURRENT_LIST_FILE} NAME_WE)
  set(working_dir ${CMAKE_CURRENT_LIST_DIR}/.${name}-working)
  
  message("## create working")
  file(REMOVE_RECURSE ${working_dir})
  file(MAKE_DIRECTORY ${working_dir})
  
  eval_lambda(${working_dir} ${block})
  
  message("## delete working")
  file(REMOVE_RECURSE ${working_dir})
endfunction()
```

```cmake
in_working([[(dir)
  set(path ${dir}/hoge.txt)
  file(WRITE ${path} a b c)
  
  file(READ ${path} content)
  message("content: ${content}")
  
  file(READ ${path} content HEX)
  message("content: ${content}")
  
  file(READ ${path} content LIMIT 2 OFFSET 1)
  message("content: ${content}")
]]) #[[
  ## create working
  abc
  616263
  bc
  ## delete working
]]
```

## おわりに

以上、CMakeでのメタプログラミングとその応用についてでした。この手法を使うと、CMake の使いにくいところをカバーすることができるようになります。

明日は、mrk_21 さんの『CMake の情報と 3.1.0 での変更点』です。
cakephpでxkhtmltopdfをVPS（CentOS）で実行できるようにする

CakePHPを利用しているとき、PDFを出力できるようにしたいとき、htmlからPDFを作成するプラグイン「wkhtmltopdf」を利用します。

- VPSのOSをチェック
`cat /etc/ \`ls /etc -F | grep "release$\|version$"\``

- OSがLinuxのサーバーで、xkhtmltopdfを利用する

- 以下のURLページで、Linux（CentOS6）の64bitをダウンロードすると以下が保存される
	http://wkhtmltopdf.org/downloads.html
	wkhtmltox-0.12.1_linux-centos6-amd64.rpm
- その後、解凍アプリケーションで、wkhtmltox-0.12.1_linux-centos6-amd64.rpmを解凍。
- 実行ファイル「wkhtmltopdf」と「wkhtmltoimage」をサーバーの「/usr/local/bin/」直下にアップロードする
- 以下のコマンドで、「/usr/local/bin/」の「wkhtmltopdf」ファイルの権限を変更する
	chmod a+w wkhtmltopdf
- 解凍した他のファイルも、サーバーの各ディレクトリに配置する

usr/local/lib/
->libwkhtmltox.so.0.12.1、libwkhtmltotox.so.0、libwkhtmltox.so、libwkhtmltox.so.0.12

usr/local/include/
->/wkhtmltox/
->dllend.inc、pdf.h、image.h、dllbegin.inc

usr/local/share/
->.fonts、fonts、IPAexfont00201、man

- 以下のコマンドを実行し、ライブラリをインストールする
sudo yum install libjpeg libpng libXrender libXext fontconfig
参考URL：https://github.com/zakird/wkhtmltopdf_binary_gem/issues/19

- bootstrap.phpに以下のコードを追加

Cache::config('default', array(
	'engine' => 'File',
	'mask' => 0666	//本番環境に合わせる
));

CakePlugin::load('CakePdf', array('bootstrap' => true, 'routes' => true));
Configure::write('CakePdf', array(
    'engine' => 'CakePdf.WkHtmlToPdf', // 使用するPDFエンジン
    'binary' => '/usr/local/bin/wkhtmltopdf', // WkHtmlToPdfバイナリファイルのパス
    'options' => array(
        'print-media-type' => false,
        'outline' => true,
        'dpi' => 96
    ),
    'margin' => array(
        'bottom' => 0,
        'left' => 0,
        'right' => 0,
        'top' => 0
    ),
    'orientation' => 'landscape', // landscape（横）指定もできる
    'download' => false // 表示のみかダウンロードか
));

- route.phpには以下を追加。
これで、.pdfの拡張を利用できるようになる

Router::parseExtensions('pdf');

- PDFを出力したいコントローラー内で、以下を追加する

	public $components = array('RequestHandler');

- そして、Viewは以下のように用意する

View/モデル名/pdf/view.ctp
View/Layout/pdf/default.ctp

- これで、http://xxxx.com/controller/view/1.pdfにアクセスすると、view.ctpに入力したデータがPDFとして表示される。
S2JDBCのトランザクション分離レベルを変更する

## トランザクション分離レベルとは

複数のトランザクションで処理する際に、お互いに与える影響にレベルを指定してコントロールすることができます。
英語では Transaction isolation level と言います。
ANSI標準では、下記の 4つの分離レベルが定義されています。

- READ UNCOMMITTED
- READ COMMITTED
- REPEATABLE READ
- SERIALIZABLE

READ UNCOMMITED がレベルが 1番低く、下に行くほどレベルが高くなります。
レベルが低いと、他のトランザクションの影響を受けやすくなる反面、「待ち」が発生しにくくなるため、バッチ処理などで有利です。逆にレベルが高いと、影響を受けにくくするために、ロックなどによる影響が強くなり、「待ち」が発生しやすくなります。

## Seasar の S2JDBCでトランザクション分離レベルを指定する方法

diconファイルの "connectionPool" の定義で指定することが可能です。
デフォルトでは -1 になっていますが、ここに java.sql.Connection の定数を指定します。

## diconファイル (サンプル)

```xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" "http://www.seasar.org/dtd/components24.dtd">
<components>

    :    :    :

  <component name="connectionPool" class="org.seasar.extension.dbcp.impl.ConnectionPoolImpl">
    <property name="transactionIsolationLevel">@java.sql.Connection@TRANSACTION_READ_COMMITTED</property>
    :    :    :
  </component>

    :    :    :

</components>
```
#FreeBSD + xorg-server-1.14 で vmmouse を復活させる

Xmasに[pkgが更新]されていたので、クリスマスプレゼントとばかりVMWare Fusion の FreeBSD-10.1-RELEASE-ad64 を更新したら、マウスの動きがキョドるようになったので。

[pkgが更新]: http://pkg.freebsd.org/freebsd:10:x86:64/
xorg-server-1.14.7_1,1

原因
====

xorg-server が 1.12 から 1.14 に上がり、それにともなってデバイス検知が HAL から devd になったのはいいのだけど、これが vmmouse ではなく普通の mouse を load してしまうため。

* http://blogs.freebsdish.org/graphics/2014/11/19/xserver-1-14-update-ready/

対策
====

0. `xorg.conf`を作成しなおし

````
# Xorg -configure
# mv /root/xorg.conf.new /etc/X11/xorg.conf
````

1. `/etc/X11/xorg.conf.d/input.conf`を以下のとおり作成

````
# mkdir /etc/X11/xorg.conf.d
# cat > /etc/X11/xorg.conf.d/input.conf
````

````
Section "InputClass"
        Identifier              "Mouse Defaults"
        Driver                  "vmmouse"
        MatchIsPointer          "on"
EndSection
````

これ、`xf86-input-vmmouse`のインストール時に自動生成するべきだよなあ…

私からは以上です。

Dan the FreeBSD Desktop user
初めてのC初心者限定#4


###投稿の動機
専門学校でPG教えてます。時間の制約の為、c++もさらっとしか教えられないので、学生さん向けにまとめようと思います。
ついでにcがわからんと思い込んでる方々の参考になれば幸いです。
プロには不要なまとめです。あくまで、初心者むけです。
ご指摘は大歓迎です。積極的に取り入れていきます。

###環境
####Linux,Unix,Mac
ターミナルからコマンドを発行。
gcc -v
インストール済みなら、何らかリターンがあります。

####Windows
VmWare Playerをインストール
Linuxの仮想環境を作りましょう。

bcc32 .netのコンパイラを勧めない理由。
結局Unix、Linuxを勉強しなきゃならんのです。

###配列
```c:Array.c
#include <stdio.h>

int main(void)
{
    int a[] = {0, 100, 200, 300, 400};
    printf("Ascending　order\n");
    int i;
    for(i = 0; i < 5; i++){
        printf("%d\n", a[i]);
    }
    printf("Descending order\n");
    for(i = 4; i >= 0; i--){
        printf("%d\n", a[i]);
    }
    return 0;
}

```
整数型の配列aに値をセットしています。
for文の書き方も、色々と試しましょう。
1から始まる言語もあるけど、多くの言語が0始まりです。
従って要素数がn個なら、インデックスは0からn-1となります。

###コンパイル
```
gcc -o Array Array.c
```

###Run
```
./Array
```
![kobito.1419592360.288345.png](https://qiita-image-store.s3.amazonaws.com/0/33317/f6000d62-c94d-0215-55d5-49a076e31598.png "kobito.1419592360.288345.png")


はい簡単です。

###おまけ
Macならsayコマンドを使って 
./Array | say

してみると、ちょっと楽しい。
Riak CSにAWS SDKを使ってアクセスする場合の注意点

#Riak CSへのアクセス方法

Riak CS にアクセスする場合、CSをs3.amazonaws.comにアクセスするためのProxyとして使うアクセス方法と
、CSに直接アクセスする方法がある。
http://docs.basho.com/riakcs/latest/cookbooks/configuration/Configuring-Riak-CS/#Proxy-vs-Direct-Configuration

##Riak CSにAWS SDKを使って直接アクセスする場合の問題点

Riak CSにAWS SDKを使って直接アクセスすると、以下のような例外が発生する。

```
com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: Access Denied), S3 Extended Request ID: null
```


Riak CSにAWS SDKを使って直接アクセスする場合、`AmazonS3Client.setEndpoint()` でエンドポイントを指定する。
エンドポイントを指定すると、AWS SDK内部のリクエスト署名アルゴリズムがversion 4の形式に変更される。
Riak CSがversion 4の署名アルゴリズムに対応していないため、認証が失敗することになる。


##対処方法

AmazonS3Client のコンストラクタに渡す ClientConfiguration で、以下のように署名アルゴリズムタイプを指定する。
```
ClientConfiguration.withSignerOverride("S3SignerType")
```
'S3SignerType' を指定すると、エンドポイントを設定しても署名アルゴリズムがv2のままになるので、認証が成功する。
AnsibleでRuby 2.2.0をインストール

[Ruby 2.2.0 リリース](https://www.ruby-lang.org/ja/news/2014/12/25/ruby-2-2-0-released/) おめでとうございます!
今回は，Ansibleを使ってRuby 2.2.0をコンパイルするPlaybookを紹介します．

## Ruby 2.2.0用Playbook

私は研究で，Rubyの最新版をソースコンパイルして使っています．
また，複数サーバにインストールするためにAnsibleを使っています．

使っているPlaybookがこちら．
Ruby 2.1.2の頃に作ったのですが，2.2.0に合わせて少し修正しています．

  - aptの依存パッケージに`libffi-dev`を追加．
  - ソースコードのURLを`2.1`から`2.2`に修正．

#### ruby.yml

```yaml
---
- hosts: ruby
  sudo: yes
  gather_facts: no
  tasks:
    - shell: ruby --version | grep {{ ruby_version }}
      register: ruby_version_check
      ignore_errors: yes

    - include: tasks/compile.yml
      when: ruby_version_check|failed
```

#### tasks/compile.yml

```yaml
---
- name: install dependent packages
  command: apt-get -y install libssl-dev zlib1g-dev libreadline6-dev libffi-dev make

- name: download source code
  shell:
    wget http://cache.ruby-lang.org/pub/ruby/2.2/ruby-{{ruby_version}}.tar.gz && tar xf ruby-{{ruby_version}}.tar.gz
    chdir=/tmp

- name: compile & install
  shell:
    ./configure && make && make install
    chdir=/tmp/ruby-{{ruby_version}}
```

#### hosts

```
[ruby]
localhost  ansible_ssh_host=127.0.0.1

[ruby:vars]
ruby_version=2.2.0
```

## まとめ

RubyをソースコンパイルするAnsible Playbookでした．
修正点として挙げた2点は，実際に昨晩ハマったポイントでした…．

ソースコードのURLは，`split`と`join`を使って上手く設定できるようにしたいですね．
git-flowを導入済みの開発環境に参加する

はじめに
--------
git-flowを導入されていない環境にgit-flowを導入して
開発フローをつくる方法についての情報は多くありますが
すでにgit-flowを導入して開発を進めているリポジトリに、
後から新しいメンバが参加する方法についてはあまり情報が
ないようでしたので、投稿します。

ここでは既にgit-flowを導入して開発をすすめている`testsite`というリポジトリのプロジェクトにAさんが参加する場合を想定して
解説しています。

git-flowのインストール
---------------------
* インストール先: Aさんの開発用PC

Macの場合:
```bash
$ brew install git-flow
```

Linux(Ubunts)の場合:
```bash
$ sudo apt-get install git-flow
```

リポジトリをクローンする
----------------------
* クローン先: Aさんの開発用PC

```bash
$ git clone git@github.com:hoge/testsite.git

$ cd testsite
```

git-flowの初期設定
-------------------
* Aさんの開発用PCで作業をして下さい。

失敗例:

```bash
$ git branch -a
* develop <- すでにdevelopブランチがある
  remotes/origin/HEAD -> origin/develop
  remotes/origin/develop
  remotes/origin/master

$ git flow init -d
Using default branch names.

Which branch should be used for bringing forth production releases?
   - develop
Branch name for production releases: []
Local branch '' does not exist.
```

まだgit-flowをつかっていない環境では通常はmasterブランチしかないのでこのタイミングで`git flow inti -d`コマンドを実行するだけでOKなのですが、git-flowをすでに使っている環境ではうまくいきません。

少なくとも、masterリポジトリとdevelopリポジトリはリモートリポジトリから取り込んでおく必要があるようです。

masterリポジトリとdevelopリポジトリがすでに存在している場合の手順:

```bash
$ git branch -a
* develop <- すでにdevelopブランチがある
  remotes/origin/HEAD -> origin/develop
  remotes/origin/develop
  remotes/origin/master

$ git checkout -b master origin/master
Branch master set up to track remote branch master from origin.
Switched to a new branch 'master'

$ git branch -a
  develop
* master
  remotes/origin/HEAD -> origin/develop
  remotes/origin/develop
  remotes/origin/master

[kshatriya@bbtsite]$ git flow init -d
Using default branch names.

Which branch should be used for bringing forth production releases?
   - develop
   - master
Branch name for production releases: [master]

Which branch should be used for integration of the "next release"?
   - develop
Branch name for "next release" development: [develop]

How to name your supporting branch prefixes?
Feature branches? [feature/]
Release branches? [release/]
Hotfix branches? [hotfix/]
Support branches? [support/]
Version tag prefix? []

[kshatriya@bbtsite]$ git branch -a
  develop
* master
  remotes/origin/HEAD -> origin/develop
  remotes/origin/develop
  remotes/origin/master
```
OAuth2::Client#request と raise_error について


普段はあんまり OAuth2::Client を直接操作することはないんですが。
ちょっと必要があって辿ったので、そのメモ。

## やりたいこと

Net::HTTP レベルでの例外と、5XX系レスポンスについては、リトライしたい。
⇒ 5XX レスポンスを捕捉したい。

## raise_error オプション

`OAuth2::Client` の初期化オプションで `raise_error` を渡せる。
[この辺り](https://github.com/intridea/oauth2/blob/master/lib/oauth2/client.rb#L24)とか見てください。

```rb:
    # @option opts [Boolean] :raise_errors (true) whether or not to raise an OAuth2::Error
```

そういうこと。

## OAuth2::Client#request

[この辺り](https://github.com/intridea/oauth2/blob/master/lib/oauth2/client.rb#L88)ね。
`OAuth2::Client#request` 呼び出しの時にも raise_error オプションを渡せる。
`#request` にオプションを渡さなければ、初期化時の値が使われる。

`OAuth2::Client#request` 内では `OAuth2::Client#connection` を経由して `Faraday#run_request` を呼び出す。
そのレスポンスは `OAuth2::Response` でラッピングされる。

さて、レスポンスのステータスが 301, 302, 303, 307 の場合は、リダイレクトを辿ってくれる。
それ以外の 2XX, 30XX ステータスは、何もせずに OAuth2::Response を返す。

4XX, 5XX ステータスの時には、先ほどの `raise_error` が true であれば OAuth2::Error 例外を返す。
false なら例外にはならない。
`OAuth2::Response#error` に Oauth2::Error をセットした上で、そのレスポンスを返す。

ちなみに、それ以外のステータスの時は raise_error の値に関わらず、必ず `OAuth2::Error` になる。

## OAuth2::Error

`StandardError` を継承している。
`message` には `OAuth2::Response#body` が渡される。

`OAuth2::Error#response` で `OAuth2::Response` が取得できる。
なので、一旦 `OAuth2::Error` で rescue した後にレスポンスの内容で分岐などは可能。

## 結論: 特定のステータス時のみリトライしたい場合

raise_error を true (デフォルト) にしておいて rescue で `OAuth2::Error` を捕捉、 rescue の中でステータスコードを見て retry or 再度例外発生。
が良いかなー。
UbuntuからSQL Serverを操作する

UbuntuからSQL Serverを操作する場合
========

sqshを使う。

インストール方法
--------

apt-get でインストールする。
x11-commonとか入れられてしまってちょっと気持ち悪い。

```shell-session
$ sudo apt-get install sash
```

使い方
--------

コマンドライン引数で覚えるのは以下かな。
 -S でサーバー名
 -U でユーザー名
 -P でパスワード

```shell-session
$ sqsh -S 192.168.1.2 -U sa -P password
```

プロンプト（行> という形式。1>のような）が出たらSQLを入力する。
実行させるにはgo。

```sql
1> use test
2> go
1> select * from test_table
2> go
```
count変数のインクリメントとenumerateの速度比較

Pythonにおいて、シーケンスでfor文を回す際、カウンタが必要になることがあると思います。 :smiley: 
その際、for文の外でカウンタを定義してfor文内でインクリメントするか、enumerateを使用してカウンタを取得するかが簡単な方法になるそうです :relaxed: 
その話を聞いて、どちらの方が早く処理ができるのか、疑問に思いました :confused: 
そこで、速度を計測してみることにしました :grin: 
計測用コードはこちらになります。

```py3:sptst.py
import time

def count(test):
    count=0
    start=time.time()
    for item in test:
        a=count
        b=item
        c=test[count]
        count+=1
    diff=time.time()-start
    return diff

def enumer(test):
    start=time.time()
    for count,item in enumerate(test):
        a=count
        b=item
        c=test[count]
    diff=time.time()-start
    return diff

test=[]
for i in range(100000):
    test.append("test")

loopNum=1000
summation=0
for i in range(loopNum):
    summation+=(count(test))/(enumer(test))

print(summation/loopNum)
```

countをつかったfor文とenumerateを使ったfor文で、100000個の要素からなるリストを回して、適当な処理をさせてみました。 :neckbeard: 
それぞれのfor文を1000回ずつ回し、countの方は平均何倍の時間になったか表示します。 :neckbeard: 
その結果、だいたい1.2くらいに落ち着きました。 :anguished: 
この場合は処理が軽かったので1.2倍もの差がでてしまった面はありそうです :no_mouth: 
for文でカウンタが必要になった際は、変数を外で定義してインクリメントするよりも、enumerateを使用した方がよさそうですね :wink:
シェルソート

『[基礎から学ぶデータ構造とアルゴリズム](http://www.amazon.co.jp/dp/4320122437/chintara-22)』「4.2 シェルソート」の勉強メモです。自分なりに咀嚼したソート手順とサンプルコード（Ruby）をまとめています。

1. h だけ離れた数字で組を作る
2. この組の中で数字を[挿入ソート](http://qiita.com/iwamot/items/8b884dbcd9eda358503e#%E6%8C%BF%E5%85%A5%E3%82%BD%E3%83%BC%E3%83%88)で整列する
3. h の値を小さくして、1 に戻る

```rb
def insertion_sort(a)
  n = a.size
  1.upto(n - 1) do |j|
    temp = a[j]
    i = j
    while i > 0 && a[i - 1] > temp
      a[i] = a[i - 1]
      i -= 1
    end
    a[i] = temp if a[i] != temp
  end
end

def shell_sort(a)
  n = a.size
  h = n / 2
  while h > 1
    0.upto(h - 1) do |i|
      b = []
      i.step(n - 1, h) do |j|
        b.push a[j]
      end

      insertion_sort b

      i.step(n - 1, h) do |j|
        k = b.shift
        a[j] = k if a[j] != k
      end
    end

    puts "h = #{h}"
    p a

    h /= 2
  end

  insertion_sort a

  puts "h = 1"
  p a
end

shell_sort [28, 37, 2, 26, 7, 48, 23, 15]
```

```
h = 4
[7, 37, 2, 15, 28, 48, 23, 26]
h = 2
[2, 15, 7, 26, 23, 37, 28, 48]
h = 1
[2, 7, 15, 23, 26, 28, 37, 48]
```

# リンク

* [バブルソート、選択ソート、挿入ソート](http://qiita.com/iwamot/items/8b884dbcd9eda358503e)
* [クイックソート](http://qiita.com/iwamot/items/a13e4e1a73960ff0c4e7)
* [マージソート](http://qiita.com/iwamot/items/7f83e6c7f368839a3429)
書籍「リーン開発の本質」にみる探索的テストの有効性

# はじめに

前回の投稿『[テストにも「リーン・スタートアップ」を取り入れたら効果的！って話](http://qiita.com/flexfirm/items/38224e1a36808dc812cc)』ではリーン開発において、ユーザーにさわってもらって問題を発見する、いわゆる「探索的テスト」がいかに有効であるかを紹介しました。
今回は書籍「リーン開発の本質」に書かれているリーン開発の原則と照らし合わせて、特にスタートアップにおいて探索的テストが有効であることを書籍の引用を見ながら紹介したいと思います。

![lean.JPG](https://qiita-image-store.s3.amazonaws.com/0/32732/60687017-8c2c-9fa5-a0d5-7f2f699ff882.jpeg)

# ムダを省く

リーン開発ではいかに速く開発するかが重要です。そのためには、いかにムダを省くかがポイントになってきます。書籍ではソフトウェア開発におけるムダとして、以下の7つが挙げられています。

> * 未完成の作業のムダ
* 余分な機能のムダ
* 再学習のムダ
* 引き継ぎのムダ
* タスク切り替えのムダ
* 遅れのムダ
* 欠陥のムダ

「探索的テスト」を用いることで上記の「遅れのムダ」と「欠陥のムダ」を削減できます。

# テストをしないという選択

そもそもスタートアップではスピード優先のためテスト工程を設けていないというチームもあるでしょう。とくにスマホアプリの開発では顕著かもしれません。
すると、致命的な問題をかかえたままリリースする可能性が高まります。その場合、リーンキャンバスとして検証するべき要素にユーザーが到達するまえに離脱してしまう可能性も高まります。

したがって、ここは少しだけ遠回りした方が賢明です。

# 20%の労力で80%を実現する

では、テストを行うという前提で、なぜ「探索的テスト」で「遅れのムダ」と「欠陥のムダ」を削減できるのでしょうか。
その前に、書籍ではコーディングにおける原則として以下のように書かれています。

> 私たちが必要としているのは80パーセントの価値を提供する20パーセントのコードをまず開発し、その後初めて、次に重要な機能の開発に取りかかれるようなプロセスである。

これは、テストにおいても言えることだと思うのです。たとえば、キチンとテスト設計を行って想定される観点を元にテストパターンを洗い出しテストを実施したとします。これでバグはなくなるのでしょうか？　経験豊富なみなさんならきっとご存知ですよね。それでもバグはなくならないって。

いくらテスト設計に時間をかけても、それに見合った成果を得ることは非常に難しいのです。したがって、スタートアップの初期段階では、おもいきってテスト設計を行うことをやめてしまい、20%のコストで80%の成果を得る方法を考えましょう。

書籍では自分達で行うテストについて以下のように書かれています。

> それらのテストは、コードが私たちの考えどおりに動いているということと、事前に想定したやり方では失敗しないということを証明しているにすぎない。ソフトウェアはときどき、思いもよらない失敗のし方をする。

# 重大な問題をいかに効率的に発見するか

テストにおいて 20%のコストで80%の成果を出す方法の１つが「探索的テスト」です。

### 探索的テスト

> 事前・直前のテスト結果に応じて、次のテストを適宜に施していくソフトウェアテストの方法をいう。探りを入れながら臨機応変にテスト項目を決めていくテストスタイルといえる。[[IT Media 情報マネジメント用語辞典](http://www.itmedia.co.jp/im/articles/1111/07/news203.html)]

探索的テストはテストケースを作成しない、すなわちテスト設計を行わずにテストを行う方法です。いいかえるとテスター任せのテストともいえます。そのため、一般的にはテスト設計を行う網羅的テストと双方を実施し、相互補完することでバグを少なくできるとされています。

ですが、リーン開発においては必ずしもそこまでの品質は必要ありません。それよりもスピードです。したがって、探索的テストだけを行い主要な機能における致命的な問題だけを検出できれば、リーンキャンバスで検証するべき項目「解決策」の検証には十分です。
あまり発生しないニッチな問題にはコストをかけるのをやめましょう。

## 実施のタイミング

では、いつ「探索的テスト」を実施すべきでしょうか。テストしようにもバグだらけで主要な機能の動作すらもままならない状態では、さすがにテストになりません。「主要な機能はひととおり問題なく動作する」という状態でなければなりません。
したがって、単体テストをキチンと行っているのであれば単体テスト後、そうでないのであれば結合テスト後がよいと思います。

## 探索的テストを手軽にできるサービス

「探索的テスト」を手軽に実施できる「あれれサーチ」を立ち上げました。ただいまサービス体験キャンペーン（無料）を実施中です。

### >>> [あれれサーチ](http://finaleyes.flexfirm.jp/) <<<
zathuraチートシート

[zathura](https://pwmt.org/projects/zathura/) という Linux 用の PDF ビューワーがいい感じ。

## 特徴

- キーボード操作が中心
- メニューバーとか検索バーとか無駄なものがない。 feh のような感じで PDFを閲覧できる
- ブックマークとか検索とかひと通り機能がそろっている
- カスタマイズ性が高い
- SyncTeX 対応 (僕はLaTeX書かないけど)

## キーバインドチートシート

`man zathura` でデフォルトのキーバインドが表示されるので、自分がよく使いそうなのをまとめました。

|キー|機能|
|-----|-----|
|矢印カーソル|スクロール|
|PageUp, PageDown|次/前のページ|
|Tab|目次表示|
|gg|最初のページ|
|escape|終了|
|+|拡大|
|-|縮小|
|=|等倍に戻す|
|/,?|検索|
|n|検索でヒットした次の場所へ移動|
|N|検索でヒットした前の場所へ移動|
|a|縦幅に合わせる|
|s|横幅に合わせる|
|d|見開き表示の有効/無効切り替え|
|r|90度回転|
|^r|色反転|
|F5|フルスクリーンモード|
|^n|ステータスバーの表示/非表示|

## ブックマーク

ブックマークはコマンド入力で行う (`m` キーとかでも出来そうなんだけどうまく動かなかった。)
`:` を押すとコマンド入力モードになるので、次のように使う。

|コマンド|機能|
|:bmark N|Nページ目をブックマークする|
|:blist N|Nページ目に移動する|
|:bledete N|Nページ目のブックマークを解除する|

ブックマークしているページの一覧が見えると嬉しいのだけれどそういう機能はないのかな??

## 参考

- https://pwmt.org/projects/zathura/
- `man zathura`
- `man zathurarc`
Treasure Dataで働くRuby

中村です。最近はセキュリティ方面のお世話だけでコードの貢献はしていませんが、CRuby、JRubyコミッタもやっています。

Treasure Dataを支えている各種システム、バックエンドのコアはJava中心、追加でScala/C/Pythonですが、多くの場所でRubyも使われています。12/25にRuby/2.2がリリースされたのに合わせて、Rubyの使われ方をご紹介しましょう。（本記事は12/26に執筆しています）

# Client side

まずはTreasure Dataのシステム側でなく、クライアント側で動くRubyです。

## Treasure Agent (Fluentd) package (td-agent)

Treasure Agentは、OSSであるRuby製ログ収集インフラFluentd: [http://www.fluentd.org/](http://www.fluentd.org/)の各種OS用パッケージ版です。Treasure Dataにログを入れるのに必要なプラグインが同梱されていますが、インストールすると出てくるのは環境設定済みfluentdなので、パッケージ版Fluentdとして使われています。動作環境はMacOS X 10.8, 10.9、RHEL/CentOS 5, 6、Ubuntu 10.04, 12.04 ~~（, 14.04）~~ 。

またtd-agentはサーバ側でも動いていて、JavaScript、iOS、Android、Unityの各SDKが投げてくるイベント群を受け付けています。

パッケージとしてはRuby 1.9.3を同梱していますが、そろそろ上げるタイミングですね。

**（追記: 上記はtd-agent 1の話で、すでにtd-agent 2がリリースされています。すいません。そちらはRuby 2.1.3が同梱されています。詳しくはこちら: [Treasure Agent(td-agent)の1と2の今後](http://qiita.com/repeatedly/items/c8107bc8ba5ba01133f8) 移行手順もあります）**

## TD Toolbelt (td, td-client)

Treasure Dataの各種機能をコマンドラインから利用するためのツールです。一部、ファイルアップロードの前処理性能のため、Javaを使っているところもありますが、そこ以外はすべてRubyで書かれています。動作環境はMac OS X 10.8.5以後、Windows 64bit、RubyGemsの動く各種Linux。（つまり全部OSSです）

Mac OS X版とWindows版はこちらもRuby 1.9.3を同梱しているので、そろそろ上げるタイミングです。

# Server side

続いてサーバ側。Treasure Data内部で使われるRubyです。

## Console & API

ConsoleとAPIは共通（デプロイ先は別）のRailsアプリです。共通コンポーネントがHeroku、EC2、[IDCFクラウド](http://qiita.com/muga_nishizawa/items/579dbfb61e32bbee770a)環境で動いています。APIは特にリクエスト数、処理負荷とも大きいので、非正規化して破壊的チューニング。。。よりは、プロセス/ノードを並べてスケールさせるRubyおよびRailsらしい作りになっています。

## Task Scheduler、Coordinator

ConsoleとAPI、またはスケジューラが登録したタスクを管理しているのもRubyです。タスクにはHadoopジョブ、Prestoサーバ連携、外部データエクスポート、Consoleへのエコーバックなどがあり、それらをスケジュール、つなぎ、リトライなどのフロー制御を行います。コア部分はOSSとして公開されています。

 * [PerfectQueue](https://github.com/treasure-data/perfectqueue) - at-least-once、ポリシーベースのフェアな優先度付きキュー、ワークフロー制御サービス
 * [PerfectSched](https://github.com/treasure-data/perfectsched) - at-least-onceのスケジューラサービス

## その他

インフラ構築、運用もRuby（chef）で動いています。これについては別途専任のプロがいるので、記事を書いてくれるかもしれません。その他汎用的に利用できるコンポーネントはOSS化の流れができていて、今後新プロダクトで、JRubyも採用するかもしれません。

# まとめ

Treasure Dataを支えているRubyコンポーネント群を紹介しました。OSS化されているものが多いので、興味があればぜひコードを覗いてみてください。
mysqldumpでダンプするrakeタスク


```rb
# ./lib/tasks/db.rake

require 'active_record'

namespace :db do
  desc "Dumps the database to db/dbname.dump"
  task dump_all: [:environment,:load_config] do
    cmd = nil 
    environment = Rails.env
    configuration = ActiveRecord::Base.configurations[environment]
    cmd = "mysqldump -u #{configuration['username']} -p#{configuration['password']} #{configuration['database']} > db/#{configuration['database']}.dump"
    puts cmd
    exec cmd 
  end   
end
```

使い方

```rb
rake db:dump_all # developmentのdbをdumpする
RAILS_ENV=production rake db:dump_all # productionのdbをdumpする
```

----
参考


https://coderwall.com/p/2e088w/rails-rake-tasks-to-dump-restore-postgresql-databases

上記のwith_configがよく分からなかったので、database.ymlの内容の参照方法は、active_record内のdatabase.rakeを参考にしました。

https://github.com/rails/rails/blob/master/activerecord/lib/active_record/railties/databases.rake
homebrewのupdateに-vオプションを付けとくと何となく安心

#`brew update` ちゃんと動いてる？
`brew update` すると、最終結果として New Formulae, Updated Formulae, Deleted Formulae だけが表示されます。ただ、途中で止まってるんじゃないかと心配になったり。
#`-v` オプションで途中経過が見れるとちょっと安心
`brew update -v` すると途中経過が見れます。フリーズしてないと分かって安心できますね（何となく
#デフォルトにしちゃいましょう
zsh などだと `alias "'brew update'=brew update -v"` みたいな書き方ができるようですが、 bash ではできません。
.bashrc に以下を追加しておきます。

```bash:.bashrc
brew() {
  if [ "$1" = update ]; then
    shift
    set -- update -v "$@"
  fi
  command brew "$@"
}
```
これで `brew update` しただけで `brew update -v` したことになります。
（`brew update 〜` というコマンドは無いので、上記シェルスクリプトの後半は不要かもしれませんが）

参考：[bash - How can I create an alias for a git [action] command (which includes spaces)? - Unix & Linux Stack Exchange](http://unix.stackexchange.com/questions/48862/how-can-i-create-an-alias-for-a-git-action-command-which-includes-spaces/48869#48869)
My  urls


* [animations with python](http://zulko.github.io/blog/2014/11/29/data-animations-with-python-and-moviepy/)
* [Git pro chinese version](http://git-scm.com/book/zh/v1)
* [rework](http://v2ex.com/rework/index.html)
* [Gitの忘れがちだけど絶対に使うであろうコマンド達](http://tech.basicinc.jp/Git/2013/06/15/git_command/)
* [a free chinese programming book index ](https://github.com/renbangjie/books)
* [railscasts-china](http://railscasts-china.com/)
* [the bible of rails4 in traditional chinese](https://ihower.tw/rails4/index.html)
* [the blog from tw](http://blog.xdite.net/)
* [the ruby learning book from gengrui](http://learnrubythehardway.org/book/) 
* [git reset のいろいろ](http://d.hatena.ne.jp/murank/20110327/1301224770)
* [railstutorial](http://railstutorial.jp)
Gradle で initタスクをカスタマイズする方法

Gradleで[Build Init Plugin](http://www.gradle.org/docs/current/userguide/build_init_plugin.html)を使うとプロジェクトのひな形を簡単に作れます。

しかしもって、こいつが役に立つ様で実際には全然ダメなやつなのです、ハイ。
OSのユーザ名がゴリゴリ入ったコメントがあったりとか、無くても動くsettings.gradleが入ってたりとか、すげぇ使い辛い。

# 俺俺initタスクを定義しよう
という訳で役に立たないinitタスクを上書きします。
しかしもって、そもそもプロジェクトが無い所にプロジェクトを生み出すわけでプラグインって訳にもいきません。

どうするのかというと、[Initialization Scripts](http://www.gradle.org/docs/current/userguide/init_scripts.html)という仕組みを使ってデフォルトでプロジェクトに定義されているタスクを上書きします。

雑に説明すると、

* USER_HOME/.gradle/init.gradle
    * 初期化スクリプトが1つだけの場合に使う
* USER_HOME/.gradle/init.d/*.gradle
     * ディレクトリの中に拡張子が`.gradle`なファイルを雑に放り込みたい時に使う
     * ファイル名順に処理される

辺りにファイルを配置しておくとGradleが実行してくれますよって話です。

という訳で、こんなスクリプトを書いて、USER_HOME/.gradle/init.d/newproject.gradleとして保存します。

```groovy
def root = file("templates").getAbsolutePath()

allprojects {
	if(parent != null) {
		return
	}
	def copyTo = { src, dest ->
		def p = rootProject.file(dest)
		p.parentFile.mkdirs()
		p.text = file("${root}/${src}").text
	}
	
	def cp = { copyTo(it, it) }
	
	task settings << {
		def jdt_ui = 'org.eclipse.jdt.ui.prefs'
		copyTo(jdt_ui, ".settings/${jdt_ui}")
	}
	
	task init(dependsOn: ["wrapper", "settings"]) << {
		["main", "test"].each {
			rootProject.file("src/${it}/java").mkdirs()
			rootProject.file("src/${it}/resources").mkdirs()
		}
		file("gradle.properties").text = ""
		cp(".gitignore")
		cp("build.gradle")
		cp("LICENSE")
		cp("README.md")
	}
}
```

## スクリプトの解説
一番外側のスコープで`root`を定義しています。この時点ではスコープ上にプロジェクトが存在しないため、`file`メソッドでの相対パスの基準はスクリプトのディレクトリと同じになります。

`allprojects`スコープ内ではこれから作成しようとしているプロジェクトを参照できるようになります。
このスコープでは変数を宣言できますが、メソッドを宣言することはできないので処理を使い回すならクロージャを変数として宣言します。

新しく作ろうしているプロジェクトからの相対パスでファイルやディレクトリを参照したい時には`rootProject`経由で`file`メソッドを使うと変な事が起きづらい感じになります、ええ。

後は普通にGradleのタスクを定義しているだけですね。

ちなみに、このコードは[taichi/init_scripts](https://github.com/taichi/init_scripts)に公開してあるので、みんなｵﾚｵﾚinitタスクを作れば良いとオモウヨ。