OmniAICreator/Qiita-1.07M huggingface dataset:
Gauntltによるセキュリティテスト #SWTestAdvent

#始めに
このエントリは [ソフトウェアテストあどべんとかれんだー 2014](http://connpass.com/event/9500/) の 7 日目のエントリです。

前日は a_suenami さんの[テストとは開発プロセスそのものである #SWTestAdvent](http://a-suenami.hatenablog.com/entry/2014/12/06/125532) でした。

現在、開発プロセスとテストという部分において現場でどのように促進していこうか悩んでいるところでしたのでとても参考になる記事で楽しく読ませていただきました。

# 事の始まり
現場より「過去と未来の全てのセキュリティに対応して欲しい」と言われました。
その祈りは！？そんな祈りが叶うとすればそれは時間干渉なんてレベルじゃない。因果律そのもに対する反逆だ！っと思ったかは定かではありませんが、よくよく話を聞いてみると実際にはセキュリティ問題が発生した場合の早急な対処をできる環境を用意できれば良いようでした。

**対話大事！**

# そこでGauntltですよ！
Gauntltは様々なセキュリティツールを動かすことができ、堅牢なソフトウェアを作るためにDevとOpsのグループ間でテストを容易にするためのツールです(意訳
Gauntltは下記のようなオープンソースのセキュリティテストツールをベースとした，セキュリティテスト自動化フレームワークを提供してくれます。

* curl
* nmap
* sslyze
* sqlmap
* Garmr
* generic command line
* more coming soon

公式サイトは ⇒ [Gauntlt](http://gauntlt.org/)

# インストール
Gauntltを使うために gem をインストールします。

```
gem install gauntlt
```

# サンプル実行
公式のサンプルシナリオを実行してみます。
ディレクトリを作成し、ディレクトリの直下にテスト用のコードを記載します

```
mkdir my_attack
vim my_attack/simplest.attack
```

テスト用のコードはCucumberと同じように記載ができますので、Cucmberでテストコードを記載したことがある方ならばすぐに読み解けるのではないでしょうか。

```simplest.attack
Feature: simplest attack possible
  Scenario:
    When I launch a "generic" attack with:
      """
      ls -a
      """
    Then the output should contain:
      """
      .
      """
```


gauntletを実際に実行してみます。
実行すると見知ったテスト結果が表示されます。

```
gauntlt my_attack/simplest.attack

Feature: simplest attack possible

  Scenario:                                # my_attack/simplest.attack:2
    When I launch a "generic" attack with: # gauntlt-1.0.9/lib/gauntlt/attack_adapters/generic.rb:1
      """
      ls -a
      """
    Then the output should contain:        # aruba-0.5.4/lib/aruba/cucumber.rb:147
      """
      .
      """

1 scenario (1 passed)
2 steps (2 passed)
```

偉い人に見せる時は上記の結果をそのまま出しても拒絶反応を示してくれるでしょう。
そこでHTMLで出力もしてくれるようです。
結果も色分けしてくれるので、ぱっと見ただけで分かるので安心ですね。

```
gauntlt --format html my_attack/simplest.attack >> output.html
```

![]()


# サンプルコード
Githubにサンプルコードがあります
[gauntlt/gauntlt](https://github.com/gauntlt/gauntlt/tree/master/examples)

# 所感
generic command line 系のテストに関しては、Gauntlt自体が別のサーバにアクセスするような機能がないため別途用意する必要があります。
ツールのバージョンなどを検査する場合は、serverspec の方に軍配があがるでしょう。
直近に発生した Shellshock の脆弱性があるかどうかを継続的に確認したい！っという場合には良いのかもしれません。
またセキュリティツールを使用して検査を行っていきますので、すでに持っている知見を参考にしながら継続的にセキュリティチェックを行えますので一手間加えてテストしていくには良いと思います。

# 最後に
次は urasandesu さんです。現在作成中のテストライブラリとのことで楽しみです！
iOS・Android向けにアイコンを量産したいとき


iOS・Android両方のアプリを作るとなると、現在全部で **10種類**のサイズのアイコンが必要になります。めんどうですね！

本当にただリサイズしただけの画像をいっぱい用意したい場合は、 **ImageMagick**とか使うと便利です。

```
# オリジナルのアイコン画像を original.png とする
# iPhone・Android通して最大のアイコンサイズは180x180なので、original.pngはそれ以上のサイズで用意

# ios
$ convert -resize 120x120 original.png ios/example/Images.xcassets/AppIcon.appiconset/example_icon_app\@2x.png 
$ convert -resize 180x180 original.png ios/example/Images.xcassets/AppIcon.appiconset/example_icon_app\@3x.png 
$ convert -resize 80x80 original.png ios/example/Images.xcassets/AppIcon.appiconset/example_icon_spotlight\@2x.png 
$ convert -resize 120x120 original.png ios/example/Images.xcassets/AppIcon.appiconset/example_icon_spotlight\@3x.png 
$ convert -resize 58x58 original.png ios/example/Images.xcassets/AppIcon.appiconset/example_icon\@2x.png 
$ convert -resize 87x87 original.png ios/example/Images.xcassets/AppIcon.appiconset/example_icon\@3x.png 

# android
$ convert -resize 72x72 original.png android/res/drawable-hdpi/ic_launcher.png 
$ convert -resize 48x48 original.png android/res/drawable-mdpi/ic_launcher.png 
$ convert -resize 96x96 original.png android/res/drawable-xhdpi/ic_launcher.png 
$ convert -resize 144x144 original.png android/res/drawable-xxhdpi/ic_launcher.png 
```

こんなのを手元に潜ませておけば、一枚大きめのアイコン画像を作るだけで、一発変換できます！やったね！

もちろん、絵の最適化などしない単純リサイズで、デザイナさんが怒ったりしない状況のときのみ使いましょう。
Blenderのすすめ

# はじめに
みなさんBlender使ってますか？ ３DCGに興味があってinstallして立ち上げてみたことはあっても、あまりの難解さに諦めた人も多いのではないでしょうか。たしかにクセの強いInterfaceで日本語の情報も少ないということもあって、日本のユーザは少ないように感じます。そこで、この素晴らしいソフトの良さをわかってもらい、一人でも日本のユーザが増えたらと思いこの文章を書きました。

#Blenderと私
初めてBlenderに触れたのは2011年だったと思います。3DCGの知識のかけらも持たない私は手も足も出ず一蹴されました。なにやらパワフルなソフトではあるけれど私には使いこなせないと思いました。原付しか乗ったことの無い者がハーレーにまたがったようなもので、恐怖のあまりエンジンを掛けることもなく飛び降りたわけです。それでもBlenderは私の心の奥に何かを残しました。Uninstallすることはなく、思い出したようにBlenderを立ち上げました。そのたびに小さな進歩はあったけれど、いつも打ちひしがれて、そっとQuitを繰り返しました。

そんなことを1年以上続けたころにYoutubeで、あるTutorialを見つけました。英語もゆっくり喋ってくれて、操作も丁寧に説明してくれていました。数えきれないほど一時停止を繰り返し、コーヒーカップができました。それ以来、暇さえあればBlenderで遊んでいます。ただし、未だにNewbiesの域を出ず、全ての機能の20%ぐらいしか使えてないし、Tutorialでベテランが30分で出来るものも、3時間はかかってしまいます。それでも楽しくてしょうがありません。

Blenderはオープソースソフトウェアです。使用するのにお金は必要ありません。WindowsでもMacでもLinuxでも使えます。同様のソフトで世界中でスタンダードとなっているソフトは数十万円します。いまだBlenderを使っているプロは少ないようですが、その機能の差は日々縮まっており、機能によっては超えている部分も多くあります。ちなみに今年、Blenderで作成された短編アニメーションが米国アカデミー賞のノミネート候補となりました。残念ながらノミネートはされませんでしたが、その日は近いと思っています。

これほど素晴らしいソフトウェアに無償でチャレンジできることは大変な幸運だと思います。確かにクセのあるソフトであるし、日本語の情報も少ないことは確かですが、費やした時間と苦労以上のものを返してくれることも確かです。日本でも、もっともっとユーザが増えて才能ある人たちが素晴らしい作品をどんどん生み出す日が来ればと願います。
（もちろん今でも素晴らしい作品を制作している人も、Blenderの開発に参加している日本の方もいらっしゃいます）

他の素晴らしいOSSと同様にBlenderにも素晴らしいコミュニティがあります。牽引するのはオランダのTon Roosendaalという人です。Blenderの開発者であり、Blender Foundationの代表でもあります。私は単なるフォロワーですが、その強いリーダーシップと人間的な魅力には大変敬服しています。彼が良く使う
>Blenderは私の人生を変えた。Blenderはあなたの人生を変える。

という言葉が非常に印象に残っています。実際にBlenderに出会ったことで3DCGにかかわる仕事をするようになった人はたくさんいるようです。これはプロの使用に耐える機能を持ったソフトウェアが無償で誰でも気軽に使ってみることができて初めて可能になることです。たまたまBlenderに出会った人が、その魅力に取り憑かれて数年後に多くの人を感動させる短編映画を作り、そのままプロになった。というようなことが起こりうるということです。残念ながら、私はプロになれる才能は無いのですが、みなさんのうち誰かがそうなる可能性はあります。年齢は関係ありません。60才で始めて70才でプロになるかも知れない。

毎年アムステルダムで開催されるBlender Conferenceにいつの日か参加して、Tonに直接「ありがとう」と言うことが私の夢です。

最後にこの文章を書く機会を与えてくれたQiitaチームとdaxanya1さんに感謝します。
構造を定義したJSONを安全に扱うSwiftコードを自動生成する


はじめに
=========

Swiftで任意の形式のJSONを扱うには [Swiftで面倒なJSONの取り扱いをさらに10倍便利にするclass JSON](http://qiita.com/dankogai/items/e3d9882f4d25bc44cc03) がかなり便利です。

しかし、大抵のAPIなどで得られるJSONは既に構造が決まっていて、そのやりとりやその後の処理を記述する部分では、可能ならば型安全の恩恵を受けたいと思うことがあります。

Json Schema というのはそういう方向性なのかもしれませんが、無駄に大きいというか、現状ちょっと扱いづらい。

ということで、↓こういうオレオレコードジェネレータを作ったのでご紹介します。
https://github.com/mokemokechicken/ObjectJsonMapperGenerator

使い方
======

次のStepです。

* JSONの構造を定義する
* それからSwiftコードを自動生成する
* 使う


JSONの構造を定義する
-----------------

JSONの構造をYAMLで定義します。
例えば、こんな感じです。

```yaml:book.yml
Book:
  authors: [Author]
  title: String
  year: Int
  note?: String
  price: Double
  option?:
    hoge?: String
    hara?: Bool

Author:
  name: String
  others?: [Book]
```

* Entityを定義していきます。定義したEntityも構造に含むことができます。
* そのKeyがOptionの時は Key名の後ろに ? を付けます。Swift風ですが、この書き方は簡潔で気に入っています。
* Arrayは Swift的に `[型]` で表します。
* ただ、 **ArrayのArrayは作れません**。
	* 何故か？実装がややこしくて… 使わないだろうしドンマイです。
	* どうしてもというときは、ダミーのEntityでも間に挟むということで…

それからSwiftコードを自動生成する
-----------------

上記のProjectをCloneして、 `bin/make_ojm.rb` を実行します。こんな感じです。

```sh
git clone https://github.com/mokemokechicken/ObjectJsonMapperGenerator.git
cd ObjectJsonMapperGenerator
ruby bin/make_ojm.rb -l swift -c book.yml > Book.swift
```

この Book.swift に 上記の構造のJSONをシリアライズ・デシリアライズするコードが生成されます。

ちなみに、現時点では↓こんなコードになります。
https://gist.github.com/mokemokechicken/2fae3969dcfaeb09aa18

使う
-----------------

こんな感じに使います。


```swift
let data = NSData(contentsOfFile: "path/to/json")!

if let book = Book.fromData(data) {   // 読み込み
    println("Title: \(book.title), Price: $\(book.price)")
    println(book.toJsonString())    // JSONにする
} else { 
	// 定義された構造として読み込みできなかった
    println("JSON Parse Error")
}

```

今回の仕様として、定義された構造としてJSONをParseできない場合は、nil を返します。
Swiftには例外機構がない（ないですよね？）ので、Parseの深い部分でエラーがあるときに、そこから延々とnilをChainして戻していく必要がありました。なので生成されたコードは結構野暮ったいです。
ん〜もっと良い書き方は無かったのかな。。。

余談
======

* 日付や時刻型欲しい！ という場合は、 extensionなどで拡張してもらう方向で考えています。
* Validation とかも extension で記述していく方向で良いのかな。
* EntityのBaseとなるClassにNSObjectを継承させるかは迷っています。
* 簡単な動作検証用Xcode Project → https://github.com/mokemokechicken/ObjectJsonMappingSwiftTest 

さいごに
======

この続きでAPI通信する部分も自動生成したいな、と思っています。
Java版もいつか作りたいですが、Swift版がある程度落ち着いてからかな。
Atom Markdown Previewのhtmlファイル出力にcssを埋め込む

* おすすめのMarkdownエディタは何？ときかれたらAtomをおすすめします。
* markdown自体での編集・配布はとても快適です。ただ、htmlファイル保存はプレビュー画面で表示されるcssが適用されなくて悲しい気持ちになるので、機能追加されるまでの対処方法をまとめておきます。
  * 追記：[2015/03/05にマージされました！](https://github.com/atom/markdown-preview/pull/205)

## CSS作成
### lessファイルダウンロード
* 依存関係のあるlessを含めてダウンロード 

```bash
$ curl https://raw.githubusercontent.com/atom/markdown-preview/master/stylesheets/markdown-preview.less > markdown-preview.less
$ curl https://raw.githubusercontent.com/atom/template-syntax/master/stylesheets/colors.less > colors.less
$ curl https://raw.githubusercontent.com/atom/template-syntax/master/stylesheets/syntax-variables.less > syntax-variables.less
```

### Less Compiler入手
* npmでインストールできるlessに含まれているのでインストールする。 

```bash
$ npm install less
```

### CSS変換
* lesscコマンドでlessをcssに変換する。

```bash
$ ~/node_modules/less/bin/lessc markdown-preview.less > markdown-preview.css
```

## 埋め込みスクリプト
### スクリプト作成
* ```markdown-preview.css```と同じフォルダにシェルスクリプト(```md-html-with-css.sh```)を作成する。
* ブラウザによっては日本語が文字化けするのでついでに対応。  

```bash
#!/bin/sh

body=`cat $1`
css=`cat $(dirname $0)/markdown-preview.css`
html="<!DOCTYPE html>
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>
<style type='text/css'>
${css}
</style>
</head>
<body class='markdown-preview'>
${body}
</body>
</html>"
echo "${html}"
```

### スクリプト実行方法
* Markdown PreviewのSave As HTMLで保存したhtmlファイルを指定すると、埋め込んだ結果を出力する。

```bash
$ md-html-with-css.sh test.md.html
```
VisualStudioから直接AzureWebsitesにデプロイするお話

#VisualStudioから直接AzureWebsitesにデプロイできるお話

こんにちは！　AdventCalenderなんてもちろんQiitaに記事を投稿することすら初めてで、なんだかちょっと緊張してます。
読みづらかったら、@kurosuke_coinsに文句言ってください。

VisualStudioでウェブサイトを自分で建てたサーバー等にデプロイするとき、通常はURLですとかパスワードなどのデプロイ情報をを手動で入力しなければならないのですが、Azureと連携することによって、サーバーを建てる（？）ところからデプロイするところまで完全にVisualStudioのみで操作を完結することができます。

##まずはプロジェクトをつくる

まずはもちろん、VisualStudioを起動します。
![1and2.png](https://qiita-image-store.s3.amazonaws.com/0/42823/717ac60c-5799-5bb5-bcf2-3f3a9bd8812f.png)
少しだけ興奮してきましたね。


「ファイル」→「新規作成」→「プロジェクト」から新しいプロジェクトのダイアログを表示します。
![4.png](https://qiita-image-store.s3.amazonaws.com/0/42823/5574413e-d97b-baea-7fb4-23834179fd84.png)
「Visual C#」→「Web」→「ASP.NET Web アプリケーション」を選択。プロジェクト名は適当につけましょう。今回は「KurosukeTest」です。


OKを押すと、こんどはWebアプリケーションの種類を選択するダイアログが表示されます。
![5.png](https://qiita-image-store.s3.amazonaws.com/0/42823/67a3fab3-a889-612d-4e9f-cc8126e53e3c.png)
ここで重要なのは、ダイアログ内右下の「クラウド内のホスト(H)」というチェックボックス。ここにチェックを入れることで、自動的にAzureWebsitesと関連付けされ、デプロイ情報を手動でインポートする必要が無くなります。\*1 \*2

![6.png](https://qiita-image-store.s3.amazonaws.com/0/42823/b6ff1f00-4db3-137e-408c-a75cf4f386ae.png)
サイト名欄には、先ほど入力したプロジェクトめいが自動的に入力されています。ここでサイト名を変更することにより、サイトのアドレスを変更することができます。
リージョンを選択し、OKをクリック！

さあ、これで準備は終了です。思う存分開発にいそしみましょう(/・ω・)/


##デプロイする

嗚呼、楽しかった開発も、もう終盤です。プロジェクトを作成した際に関連付けしたAzureWebsites上のサイトに、開発したサイトをデプロイし、動作を確認したくなりました。

VisualStudioならワンタッチでデプロイが完了します。（少し盛った）

![8.png](https://qiita-image-store.s3.amazonaws.com/0/42823/486527a9-dfbc-0551-02e5-0d0d89633559.png)

いつもお世話になりっぱなしの「ビルド」から「(Webサイト名)の発行(H)」を選択。

![9.png](https://qiita-image-store.s3.amazonaws.com/0/42823/e9ed67a6-8300-90d5-75a1-63c198c15494.png)
すると、「Webを発行」ダイアログが表示されるのですが、なんともうすべての欄が入力されています。素晴らしいです。さすがです。エクセレントです。
あとは右下の「発行」を押すだけ。
デプロイが終了すると、自動的に発行先のURLが既定ののブラウザで開かれます。

![10.png](https://qiita-image-store.s3.amazonaws.com/0/42823/57a6bc67-2d28-12e3-a480-6235b82dd8e6.png)
なんだか、初めて自分のMVCウェブサイトをデプロイしたときのことを思い出します。

お疲れさまでした！('ω')ノ

##最後に
アドベントカレンダーなんてかっこいいもの、参加するのは初めてでした。ちょっと緊張したまま、当日の朝を迎えたのですが、記事がなかった＼(^o^)／
というわけで、朝の6時半から作成し始め、無事に書き上げることができました。
こういうの、本当に慣れていないので、読みにくかったらごめんなさい。
でも楽しかったですよ(笑)

ちなみに、同じ方法でコンソールアプリケーションをAzureWebJobに発行して、定期的にバッチ処理を走らせるなんてこともできちゃいます。
べつにAzureのポータルを使ったって対して手間は変わらないんですが、いつも使っているIDEから直接デプロイできると、手軽さが違いますよね。
個人的にあまりウェブアプリが好きじゃないってのもありますけど。
GUIからたどっていろいろな機能を使えるのが、VisualStudioのいいところなのかなって思います。
ここまで読んでいただけて嬉しいです。ありがとうございました！



***
\*1 ここでチェックを入れない場合でも、後から関連付けを追加することができます。
\*2 まだVisualStudioからAzureにログインしていない場合、ここにはサインインオプションが表示されます。
Connections: blacklisted: の対処方法

VNCサーバに接続が成功する時と失敗する時がある。

* windowsからの接続失敗例

![スクリーンショット 2014-12-08 5.07.24.png](https://qiita-image-store.s3.amazonaws.com/0/25728/75fcf1c0-ecba-7a0a-3b02-1e94c21d1a5b.png)

> Too many security failures

* macからの接続失敗例

![スクリーンショット 2014-12-08 5.51.34.png](https://qiita-image-store.s3.amazonaws.com/0/25728/0d5e7a7d-be6a-3778-bfe0-0b00f341d333.png)

> リモートコンピュータのソフトウェアが、このバージョンの画面共有と互換性がないようです。

## vncサーバのログ確認

```bash:
$ tail -f ~/.vnc/server\:1.log
```

失敗するときは以下出力

> Connections: blacklisted: 127.0.0.1

* vncserverをリスタートする


## vncserverをリスタートする君

```bash:~/cron/vnc_restarter.sh
#!/bin/sh

LASTLOG=`tail -n 1 ~/.vnc/server\:1.log`
ERRLOG=" Connections: blacklisted: 127.0.0.1"
if [ "$LASTLOG" == "$ERRLOG" ];then
  $HOME/cron/vncstart.sh
fi
```

```bash:~/cron/vncstart.sh
#!/bin/sh

vncserver -kill :1
vncserver \
  -geometry 1280x1024 \
  -dpi 96 \
  -alwaysshared \
  -depth 16 \
   :1

echo `date '+%c'` " cron/vncstart.sh" >> ~/.vnc/server\:1.log
```

## cronに登録

```bash:
@reboot $HOME/cron/vncstart.sh
* * * * * $HOME/cron/vnc_restarter.sh
```
Ubuntu 14.04.1 LTS に phpenv で PHP 5.4.30 を入れようと思ったらハマったのでその解消録

================

大前提 (記事アップ後追記)
--------
ごめんしてつかぁさい。

[Ubuntu に phpenv を入れて複数バージョンのPHP管理しようとした - Qiita](http://qiita.com/Qurage/items/70f3341a18a5172288f7)

に私が知りたかったことが書かれていました。

**上記を見れば下記を見る必要はございませぬ。**

はい。


ちなみに元の環境に戻す方法
--------
探しても見つからなくて結局、以下の方法で OK だったみたい。

```console
rm -rf ~/.phpenv
```

して、

`~/.bashrc` または `~/.bash_profile` から、
当該 *phpenv* 関係の2行を削除して環境を再読込する。

では、以下、読まなくても良い元の文章。


前提
--------
*Laravel4* をローカルの開発環境から *Ubuntu14.04.1 LTS* で動いてる本番サーバーにアップ。
*Laravel4* に登録してある *artisan* 自作コマンドを動かそうとしたらエラーが出て動かない。

*mcrypt* などは有効にしてある。

ローカル環境と本番環境の違い…？ → PHP のバージョンが違った。

* ローカル: **PHP 5.4.30**
* 本番: **PHP 5.5.9**

それで、とりあえず PHP のバージョンを揃えて動作を確かめて、問題の切り分けを行おうと思った。

**phpenv** というツールで複数の PHP バージョンの管理が可能と聞いたので、それを試そうと思った。
(*phpenv* 自体のインストール工程については後述の *参考* セクションで当該リンク先を参照すること。)


やったこと
--------
1. どこかのページを見てシンボリックリンクの処理をした。
2. 必要そうなパッケージをインストールした。

```console
$ ln -s ~/lib ~/lib64;
$ apt-get install -y libxml2 libxml2-dev re2c \
 libssl-dev libsslcommon2-dev bison build-essential \
 apache2-prefork-dev libcurl4-openssl-dev \
 libmcrypt-dev libreadline-dev libxslt-dev \
 libjpeg8 libjpeg8-dev \
 libpng12-dev zlib1g-dev \
 libtidy-dev;
$ phpenv rehash;
```

これで、 `phpenv install 5.4.30` するとビルドが通った。
PHP 5.4.30 への切り替えも通った。

```console
$ phpenv global 5.4.30
$ php -v
PHP 5.4.30 (cli) (built: Dec  7 2014 02:54:22) 
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2014 Zend Technologies
    with Xdebug v2.2.5, Copyright (c) 2002-2014, by Derick Rethans
```

出てたエラー
--------
連結すると下記のような形。本当はエラーが2行ずつぐらいのステップで試行錯誤してた。

```console
-----------------------------------------
configure: WARNING: bison versions supported for regeneration of the Zend/PHP parsers: 1.28 1.35 1.75 1.875 2.0 2.1 2.2 2.3 2.4 2.4.1 2.4.2 2.4.3 2.5 2.5.1 2.6 2.6.1 2.6.2 2.6.4 (found: none).
configure: WARNING: You will need re2c 0.13.4 or later if you want to regenerate PHP parsers.
configure: error: xml2-config not found. Please check your libxml2 installation.
configure: error: Cannot find OpenSSL's libraries
configure: error: jpeglib.h not found.
configure: error: png.h not found.
configure: error: Cannot find libtidy
-----------------------------------------
```


参考
--------
phpenv のインストールについては、

[phpenvの導入して複数バージョンのPHPを管理する - Qiita](http://qiita.com/uchiko/items/5f1843d3d848de619fdf)

を参照した。

他、

* [phpenv without php-build - mumumu の日記](http://mumumu.github.io/blog/2013/06/28/phpenv-without-php-build/)
* [MavericksにphpenvでPHP5.5を入れる - IT探検記](http://itexp.hateblo.jp/entry/install-php55-with-phpenv-on-mavericks)

も参考にした。
この場を借りて感謝いたしまします。


どうでもいいこと
--------
これでローカルと本番の PHP のバージョンはめでたく揃った。

ただ、 *Laravel4* の *artisan* 自作コマンドエラーは解決しなかった…(凹)

他の問題のようだ。がんばろうニッポン。


### 追記 2014/12/15
アッパーキャメルケースで指定するクラス名の途中で大文字になるべき文字が小文字になってた…。なんでローカルだと動いたんだろ…。キャッシュかな。キャッシュはさんざんクリアしたんだが…。いや、 **プログラムは書いたとおりに動く** しオレが悪いんだろう。

アベノミクス解散と言われた総選挙も決着着いたし、がんばれニッポン (オレモナー)
peco で git branch -a から checkout 

似たようなのは色々あるんだけど、ローカルもリモートもよしなにして checkout してくれるのが見当たらなかったので書いた。

[dameleon/dotfiles/.zsh/peco/peco-git-branch-checkout.zsh](https://github.com/dameleon/dotfiles/blob/master/.zsh/peco/peco-git-branch-checkout.zsh)

```zsh
function peco-git-branch-checkout () {
    local selected_branch_name="$(git branch -a | peco | tr -d ' ')"
    case "$selected_branch_name" in
        *-\>* )
            selected_branch_name="$(echo ${selected_branch_name} | perl -ne 's/^.*->(.*?)\/(.*)$/\2/;print')";;
        remotes* )
            selected_branch_name="$(echo ${selected_branch_name} | perl -ne 's/^.*?remotes\/(.*?)\/(.*)$/\2/;print')";;
    esac
    if [ -n "$selected_branch_name" ]; then
        BUFFER="git checkout ${selected_branch_name}"
        zle accept-line
    fi
    zle clear-screen
}
zle -N peco-git-branch-checkout
```

`.zshrc`に

```zsh
bindkey '^g' peco-git-branch-checkout
```

などとすると動く。

シェル芸は不得意なので優しくフィードバックをお待ちしております。
Unityの勉強に良いチュートリアル

#はじめに
Unityブログで紹介されていたチュートリアルなのですが、少し覗いただけで良いチュートリアルだと思ったので記録。

#紹介されていたブログ
そのブログがこちら↓
[Unityをオンラインで学んじゃおう！](http://japan.unity3d.com/blog/?p=1310)

>digital-tutorsはアメリカで人気のあるオンライン形式の有料チュートリアルサイトです。有料会員になると、プロジェクトなどのサンプルファイルも利用しながらオンラインでトレーニングを受けられます。
digital-tutorsのUnityチュートリアルは、比較的新しいトピックも扱っていることが特長で、Oculus Rift向けコンテンツの作り方なども紹介されてます。
ムービーは英語ですが、英語字幕がきちんと出ますので、ついて行くのはそれほど難しくはありません。
Unity以外の様々なツールのチュートリアルも一緒に学べるのもお得です！
【[Unityをオンラインで学んじゃおう！](http://japan.unity3d.com/blog/?p=1310)より引用】

#digital-tutors
上記のサイトへのリンクはこちら↓
[digital-tutors Unityチュートリアル](http://www.digitaltutors.com/software/Unity-tutorials)
fortran90でコマンドライン引数を取得

```fortran:getarg(k,arg)
integer :: k !入力: 引数の索引 (0 = 最初の引数 = コマンド名) 
character :: arg*n !出力: k番目の引数
```

```fortran:iargc()
integer :: iargc !返り値: コマンドラインの引数の個数
```

```fortran:実行ファイル名のすぐ後の引数をoptionalに取得
integer :: i
character :: arg*10

if(iargc()>0)then !実行ファイル名以外の引数がある時
   call getarg( 1, arg ) !文字列として取得
   read(arg,*) i !整数に変換
else
   i=7 !無ければ適当な値
end if
```

fortran2000とかなら別のやり方があるらしい
CMake: ループ

## はじめに

みなさん、こんにちは。今回はループについて書いてきます。

## ループの種類

CMakeのループには、`foreach()`と`while()`の2種類存在し、以下に示すようにそれぞれ用途が異なっています。

### `foreach()`

`foreach()`は、リストもしくは範囲のイテレーションを行うためのもので、次のような構文になっています。

> ```cmake
> foreach(loop_var arg1 arg2 ...)
>   COMMAND1(ARGS ...)
>   COMMAND2(ARGS ...)
>   ...
> endforeach(loop_var)
> ```
> <cite>[foreach — CMake 3.0.2 Documentation](http://www.cmake.org/cmake/help/v3.0/command/foreach.html#foreach)</cite>

`foreach()`は、以下の4つの機能を提供します。

#### `foreach(loop_var IN LISTS [variable_name ...])`

引数`variable_name ...`の各値をリストの変数名と解釈して、変数の値でイテレーションします。

```cmake
set(list1 a;b)
set(list2 c;d)

# loop_var: a
# loop_var: b
foreach(loop_var IN LISTS list1)
  message("loop_var: ${loop_var}")
endforeach()

# loop_var: a
# loop_var: b
# loop_var: c
# loop_var: d
foreach(loop_var IN LISTS list1 list2)
  message("loop_var: ${loop_var}")
endforeach()
```

#### `foreach(loop_var IN ITEMS [value ...])`

引数`value ...`の各値をリストと解釈して、イテレーションします。また、`IN ITEMS`を省略したものも同様の動作を行うようです。

```cmake
# loop_var: a
# loop_var: b
foreach(loop_var IN ITEMS a b)
  message("loop_var: ${loop_var}")
endforeach()

# loop_var: a
# loop_var: b
# loop_var: c
# loop_var: d
foreach(loop_var IN ITEMS a b c;d)
  message("loop_var: ${loop_var}")
endforeach()

# loop_var: a
# loop_var: b
# loop_var: c
# loop_var: d
foreach(loop_var a b c;d)
  message("loop_var: ${loop_var}")
endforeach()
```

#### `foreach(loop_var RANGE total)`

`0..total`の範囲の各値をイテレーションします。

```cmake
# loop_var: 0
# loop_var: 1
# loop_var: 2
foreach(loop_var RANGE 2)
  message("loop_var: ${loop_var}")
endforeach()
```

#### `foreach(loop_var RANGE start stop [step])`

`start..stop`の範囲の値をイテレーションします。このとき値の増分を`step`で指定できます。これには負の値も指定できます。

```cmake
# loop_var: 1
# loop_var: 2
# loop_var: 3
foreach(loop_var RANGE 1 3)
  message("loop_var: ${loop_var}")
endforeach()

# loop_var: 1
# loop_var: 3
# loop_var: 5
foreach(loop_var RANGE 1 6 2)
  message("loop_var: ${loop_var}")
endforeach()

# loop_var: 9
# loop_var: 8
# loop_var: 7
foreach(loop_var RANGE 9 7 -1)
  message("loop_var: ${loop_var}")
endforeach()
```

### `while()`

`while()`コマンドは指定された条件式を満たすまでの繰り返しを行うもので、次のような構文になっています。

> ```cmake
> while(condition)
>   COMMAND1(ARGS ...)
>   COMMAND2(ARGS ...)
>   ...
> endwhile(condition)
> ```
> <cite>[while — CMake 3.0.2 Documentation](http://www.cmake.org/cmake/help/v3.0/command/while.html#while)</cite>

`while()`コマンドの条件式には、`if()`コマンドと同じものが利用できます。

```cmake
set(filename "")

# 変数filenameの値が指定のパターンにマッチするまで繰り返す
while(NOT filename MATCHES "[0-9][A-Z]")
  string(RANDOM filename)
endwhile()
```

## `break()`による中断

これらのループでは、`break()`コマンドを用いて途中で中断することができます。

```cmake
# loop_var: a
# loop_var: b
foreach(loop_var a;b;c;d)
  if(loop_var STREQUAL "c")
    break()
  endif()
  message("loop_var: ${loop_var}")
endforeach()

while(true)
  string(RANDOM filename)
  if(filename MATCHES "[0-9][A-Z]")
    break()
  endif()
endwhile()
```

## おわりに

以上、ループでした。実際には、`file(GLOB)`コマンドで取得したソースファイルのイテレーションなど`foreach()`を利用することがほとんどだと思います。しかし、条件を満たすまで試行し続ける、など`while()`コマンドを使用したほうが便利な場合もあります。この場合、`if()`コマンド同様に条件式の仕様に気を付ける必要があります。

明日は、mrk_21 さんの『CMake: 変数のスコープ』です。
fortranで変数の値をファイル名に入れる


```fortran
integer :: i !ファイル名に入れたい変数
character :: filename*20

!なんかの処理

write(filename,*) i !i->filename 変換
!read(filename,*) i !ちなみに逆変換も可能

filename='output_'//trim(adjustl(filename))//'.dat' !adjustlで左寄せにしてからtrimで末尾の空白除去，拡張子等をくっつける

print *, filename !表示してみる
open(20,file=filename, status='replace') !使う
```
Laravelでクエリパラメータ取得方法

```php
Request::query();
```

これで取得できる。  
ページネーションとかの際に、

```php
$users->appends(Request::query())->links();
```

で自動的にクエリ付けてくれる。いい感じ

セキュリティ的に問題だよねって話があれば教えてくだしい
Android Wearで音声入力を受け取る方法

IntentでRecognizerIntent.ACTION_RECOGNIZE_SPEECHを指定します.

通常のAndroidと同じやり方ですね。
onActivityResultで受け取れるのでその後アプリで活用します。


```
    private static final int SPEECH_REQUEST_CODE = 0;
    private void displaySpeechRecognizer() {
		Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
		intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
				RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
                // 音声入力画面が開く
		startActivityForResult(intent, SPEECH_REQUEST_CODE);
	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode,
									Intent data) {
		if (requestCode == SPEECH_REQUEST_CODE && resultCode == RESULT_OK) {
			List<String> results = data.getStringArrayListExtra(
					RecognizerIntent.EXTRA_RESULTS);
			String spokenText = results.get(0);
			///受け取った文字列を使う
		}
		super.onActivityResult(requestCode, resultCode, data);
	}
```
Promise.all での大量の並行処理を安定させる

※この問題をNode Streamの平行処理で解決する [pipeline-pipe](https://dev.to/piglovesyou/pipeline-pipe-fun-way-to-get-batching-done-with-node-stream-42cb) というモジュールを作ってみました。良ければ試してみてください。

~~※本実装はQモージュールで却下されました。代替策を別途調査してください。https://github.com/kriskowal/q/issues/621~~

Promise の実装は q モジュールを使用します。

```js
var Q = require('q');
/**
 * @param {Function} task 何度も実行したい処理を関数で渡します
 * @param {Array} pool task に渡す引数を配列で渡します
 * @param {number} concurrent 同時にタスクを実行する数を指定します
 * @return {Object} pool が全て消化されたことを示す promise を返します
 */
function doConcurrent(task, pool, concurrent) {
  var workers = [];
  var results = [];
  var needle = 0;
 
  while (workers.length < concurrent) {
    workers.push(Q.invoke(workIfAny));
  }
 
  return Q.all(workers).then(function() {
    return results;
  });
 
  function workIfAny() {
    if (needle < pool.length) {
      return Q.fcall(task, pool[needle++])
      .then(results.push.bind(results))
      .then(workIfAny);
    }
  }
}
```

## 問題

Promise でたまに困るのは、Promise.all に渡す配列の数が多すぎると `FATAL ERROR: CALL_AND_RETRY_2 Allocation failed - process out of memory` が出たり、一度に飛ばすHTTPリクエストが多すぎたりすると相手のサーバに負荷をかけすぎて以下のようなエラーを出してしまうことです。

```
Error: socket hang up
    at createHangUpError (http.js:1476:15)
    at CleartextStream.socketCloseListener (http.js:1526:23)
    at CleartextStream.emit (events.js:117:20)
    at tls.js:693:10
    at process._tickCallback (node.js:419:13)
```

## 解決方法

Producer-Consumer パターンを応用し、一度に平行して仕事をする数を限定して、高速かつ安定してタスクを消化します。

以下冒頭の doConcurrent 関数を使って100万枚の画像を8平行でダウンロードする例を示します。

```js
var Q = require('q');
var files = [];
for (var i = 0; i < 1000 * 1000; i++)
  files.push('photo' + i + '.jpg');

doConcurrent(fetchImage, files, 8)
.then(console.log.bind(null, 'done'))

function fetchImage(file) { … }
```
json を pretty print するPythonワンライナー。日本語をエスケープしない。

「ensure_ascii=False」がミソ。

```bash:Terminal
$ echo '{"one":1, "two":2, "日本語":"あああ"}' | python -c 'import sys,json;print(json.dumps(json.loads(sys.stdin.read()),indent=4,ensure_ascii=False))'

{
    "日本語": "あああ", 
    "two": 2, 
    "one": 1
}
```


本当は以下のように python -mtool.json ですませたいけど、日本語部分がエスケープされてしまう。

```bash:Terminal
$ echo '{"one":1, "two":2, "日本語":"あああ"}' | python -mjson.tool                                                                                    
{
    "one": 1,
    "two": 2,
    "\u65e5\u672c\u8a9e": "\u3042\u3042\u3042"
}
```
[Unity][NGUI] UIButtonのonClickイベントに引数を設定する


##環境
- Unity 4.5.5
- NGUI 3.7.4

##イベントを設定するコード
```
// hogeMonoBehaviour の OnTapIcon メソッドに通知したい場合
EventDelegate onClickEvent = new EventDelegate(hogeMonoBehaviour, "OnTapIcon");

// OnTapIcon メソッドに渡すパラメータ
EventDelegate.Parameter param = onClickEvent.parameters[0];
param.obj = this;

// button は UIButton です
button.onClick.Add(onClickEvent);
```

##イベントを受け取るコード
```HogeMonoBehaviour.cs
public void OnTapIcon(Object obj)
{
    // do something...
}
```

`Object` と書いていますが、もちろん任意の型を渡せます。
cocos2d-xでAndroidのバックキーに対応する

Cocos2d-x Advent Calendar 7日目です。

# バックキー対応してますか？

ほとんどのcocos2dxで開発してる方はXcodeで開発＆iPhoneシミュレータで動作確認してると思いますが、「じゃあAndroidで動かすか」ってなった段階で慌てて対応しがちなのがAndroidのバックキーです。
GoogleはAndroidのバックキーに対応していないアプリをGoogle Play上でフィーチャーしないので、アプリをフィーチャーさせてユーザーを集めたい場合は嫌でも対応する必要があります。

これまで仕事で何度か似たようなコードを書いてきたので、今回は再利用しやすい形でゼロから書きなおしてみました。

# そもそもバックキー対応って何すればいいの？（iOSしか触ったことない人向け）

Android端末にはデバイス自体にバックキーが存在します（2.xではハードウェアキー、4.xではソフトウェアキー）。
このキーを押した時にユーザーが期待する挙動は、ざっくり言うと「ひとつ前の状態に戻る」です。

具体的には、

* ひとつ前の画面に戻る
* ダイアログが開いている状態だと、ダイアログを閉じる
* レースゲーム中は、ポーズメニューを表示する

などが挙げられます。

# つくった

で、作ったバックキー対応クラスがこちら

https://github.com/kobakei/CocosAndroidBackKey

ライセンスはpublic domainです。ご自由に持ってってください。

# 使い方

## 基底クラスをインポート

上のリポジトリから、

* BaseScene.h
* BaseScene.cpp
* BaseLayer.h
* BaseLayer.cpp

を持ってきて、プロジェクトに追加します。
あとは、cocos2d::Sceneやcocos2d::Layerを継承しているところを、BaseSceneとBaseLayerに置き換えればOK

## BaseScene

BaseSceneは、cocos2d::Sceneのサブクラスです。
使い方は通常のSceneと同じなので省略。
DirectorのpushScene, popSceneでシーン遷移してください。

## BaseLayer

BaseLayerは、cocos2d::Layerのサブクラスです。
シーンの上に重ねるBaseLayerはバックキーでキャンセルが可能になってます。
ダイアログのようなUIを作るのに使用してください。
簡単な使い方は以下の通り。
addChild, removeChildのかわりにshow, dismissを使用してください。

```cpp
// MyLayerはBaseLayerのサブクラスです

// 現在のシーンの上に、MyLayerをのせます
auto layer = MyLayer::create();
layer->show();

// MyLayerを取り除きます
layer->dismiss();
```

## バックキーを押した時の挙動を変更する

場合によっては、バックキーを押した時にレイヤーやシーンを消す以外の動作をさせたいことがあると思います。
例えば、レースゲーム中にバックキーを押したらポーズメニューを表示したい、などのケースです。
そんなときは、onAndroidBackKeyPressedをオーバーライドしてください。

```cpp
void MyScene::onAndroidBackKeyPressed() {
  // シーンを戻す代わりに、ポーズメニューを開く
  auto pauseLayer = PauseLayer::create();
  pauseLayer->show();
}
```

## バックキーで戻せないようにしたい場合

特定のレイヤーやシーンではユーザーにキャンセルさせたくないこともあると思います。
その場合は、setAndroidBackKeyEnabled(bool)でバックキーの有効・無効を指定してください。

```cpp
bool MyScene::init() {
    if (!BaseScene::init()) {
        return false;
    }
    // このシーンはバックキーで戻せません
    setAndroidBackKeyEnabled(false);

    // ここでUIを初期化（省略）

    return true;
}
```

```cpp
bool MyLayer::init() {
    if (!BaseLayer::init()) {
        return false;
    }
    // このレイヤーはバックキーで戻せません
    setAndroidBackKeyEnabled(false);

    // ここでUIを初期化（省略）

    return true;
}
```
"オブジェクト指向、原則、コンセプト"のソフトウェアの品質について。

# "オブジェクト指向、原則、コンセプト"のソフトウェアの品質について。

## はじめに

この記事は、単純にオブジェクト指向、原則、コンセプトをまとめただけです。

http://www.amazon.co.jp/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E5%8E%9F%E5%89%87%E3%83%BB%E3%82%B3%E3%83%B3%E3%82%BB%E3%83%97%E3%83%88-Architect%E2%80%99Archive-%E3%82%AF%E3%83%A9%E3%82%B7%E3%83%83%E3%82%AF%E3%83%A2%E3%83%80%E3%83%B3%E3%83%BB%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0/dp/4798111112


## ソフトウェアの品質について

オブジェクト指向の目標は、品質のソフトウェアを生産することである。

ソフトウェアの品質は、いくつか性質があり、大きく2つに分けられる。外的品質と内的品質だ。


## 外的品質

外的品質とは、ユーザが認識できる品質のことである。それ以外は、内的品質である。ソフトウェアの最終的に求められるのは、外的品質である。

## 外的品質の要因について

### 正確さ

ソフトウェアは恒に正しく、動作することである。つまり、仕様で定義された通りに、プログラムが仕事をこなすことである。

### 頑丈さ(ロバストネス)

ソフトウェアが異常に対応することである。

これは、仕様に書かれていない条件に対しての振舞いである。もし、異常な状態があらかじめ分かるのであれば、仕様に含まれ、「正確さ」を意味するのかもしれない。

### 拡張性

ソフトウェアは仕様の追加や変更に柔軟に適応しやすいことである。


### 再利用性

ソフトウェアは、似たようなパターンに対して、別個に解決するのではなく、再利用すべきだ。

### 互換性

他のソフトウェア要素との組合せやすさである。

### 効率性

ソフトウェアは効率的でないといけない。

この項が特に面白い内容であったので、簡単にまとめる。
効率性に対して、2つの人間がいる

* プログラマーの中には、速度に固執し、最適化に過剰な労力を費やす人。
* 一方、「速くする前に、正しいものを」「来年、性能の良いコンピュータが出るのだ!」と、速度を軽視する人。

これに対して

* 正しくなければ、細かい効率はあまり意味が無い。
* 拡張性や、再利用性などの他の品質とのバランスが大事
* 「プログラムを実行するためにメモリを喜んで購入する人はいない」
* 「性能に無関心でいるためには、それなりの覚悟が必要である。」

と述べてあった。

### 可搬性

さまざまなプラットフォームに移植しやすさである

### つかいやすさ

言うまでもないだろう。

### 機能性

ソフトウェアの適用できる、サービスの範囲の広さである。

### 適時性

ユーザが必要とするときに、ソフトウェアがあるべき。

## 品質にはトレードオフがある

品質には対立する条件がある。


### あとは読め

http://www.amazon.co.jp/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E5%8E%9F%E5%89%87%E3%83%BB%E3%82%B3%E3%83%B3%E3%82%BB%E3%83%97%E3%83%88-Architect%E2%80%99Archive-%E3%82%AF%E3%83%A9%E3%82%B7%E3%83%83%E3%82%AF%E3%83%A2%E3%83%80%E3%83%B3%E3%83%BB%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0/dp/4798111112
【第2回】dockerって何？体で覚えるdocker入門


いかがお過ごしでしょうか。どうも、千葉です。
今回は、docker入門ということで、体で覚えるdockerをテーマに、触って雰囲気を掴みたいと思います。

たぶん[docker チュートリアル](https://www.docker.com/tryit/)をやれば、分かるはずとたかをくくってやってみます。10分かかるみたいです。

webでも入力できるみたいですが、うまく入力できないのでローカルにインストールしてやってみます。
インストール方法は[こちら](http://qiita.com/iron-breaker/items/192561cf6eb7134350c8)

# Step0
dockerのバージョンを表示

````
$ docker version
Client version: 1.3.2
Client API version: 1.15
Go version (client): go1.3.3
Git commit (client): 39fa2fa
OS/Arch (client): darwin/amd64
2014/12/01 23:48:05 Get http:///var/run/docker.sock/v1.15/version: dial unix /var/run/docker.sock: no such file or directory
````

# Step1
Docker Hub Registryからdockerイメージを検索

````
$ docker search centos
````

# Step2
Docker Hub Registryからイメージをダウンロード
````
$ docker pull centos
````

# Step3
コンテナを起動してhellow worldを表示させる

````
$ docker run centos echo "hellow world"
````

# Step4
コンテナにapacheをインストールする

````
$ docker run centos yum install -y httpd
````

# Step5
インストールを実施したコンテナを保存する

````
$ docker ps -l
$ docker commit [CONTAINER] learn/httpd
````

# Step6
commitしたコンテナを起動してpingを実施する

````
$ docker run learn/httpd ping google.com
````

# Step7
コンテナの情報を確認する

````
$ docker ps -l
$ docker inspect [CONTAINER ID] 
````

# Step8
commitしたイメージをDocker Hub Registryにアップロードする

````
$ docker push learn/httpd
````
※[ここで](https://www.docker.com/)作成したユーザでログイン

# 最後に
おすすめ動画を紹介です。
合わせて[ドットインストール](http://dotinstall.com/)
もやると理解が深まります！
Adobe Illustrator Draw を触ってみる


この記事は [Adobe Advent Calendar 2014](http://qiita.com/advent-calendar/2014/adobe) 7日目の記事です。

Adobe Illustrator Draw は iPad 向けのベクトル描画ツールです。

![Adobe Illustrator Draw](http://gyazo.com/1a1aac8ce346b85b98427a57b942289d/raw)

[Adobe Illustrator Draw](http://www.adobe.com/jp/products/draw.html)

使い方の説明については以下を見ればだいたいのことがわかります。

[Creative Cloudモバイルアプリチュートリアル](http://helpx.adobe.com/jp/mobile-apps/how-to/illustrator-draw-get-started.html)

この記事では Illustrator Draw を触ってみてここはおっ！と思った点を共有していこうかと思います。

## タッチ操作に最適化されたインターフェース

起動画面はこんな感じになっています。

![](http://gyazo.com/3192f7324af599900cb4c597d7106596/raw)

左にスワイプすると「一つ前に戻る」、右にスワイプ「一つ先に進む」
ブラシのサイズや不透明度は、左のそれぞれの項目にタッチしてそのまま指を上下に移動させるだけで変更できるようになっていたりかなり快適に操作できるようになっていると感じました。

## Touch Slide を使って直線や曲線を思いのままに描ける

Adobe Illustrator Draw では画面上に仮想定規を置いて直線や曲線を描くことができます。

![](http://gyazo.com/a0077d54b16e5eee1c054e245d46bd4a/raw)

右上の二重丸が塗りつぶされていれば Touch Slide がオンになっていて、画面に定規のようなものが表示されます。

上の画像では直線用の Slide が表示されています。
2つの直線の間にある ◎ に触れながら動かすことで Slide の角度や位置を調整することができます。

これが表示されている間は Slide が表示されている場所以外には絵が描かれないようになります。

Slide の上を正確になぞらなくても、大体の位置からうまいこと描写してくれるので、手で隠れたりしてうまく描けない…といったことがないようになっているようです。

◎ の部分をタップするか、右上の二重丸のメニューから Slide を別の種類のものに変更することができます。

![](http://gyazo.com/88117390f424d588c9fe4617263014ce/raw)

雲型や人型も用意されています。

Slide 上をピンチイン・ピンチアウトで大きさ変更、長押しすることで Slide で置く円の比率変更などが行えます。

![](http://gyazo.com/b3d01c0e1fd040e4d6279ed062ef65e5/raw)


## Shapes との連動

[Adobe Shape CC](http://www.adobe.com/jp/products/shape.html)

Adobe Shape は iOS 専用アプリで、写真からその撮ったものの輪郭をうまいこと抽出してベクトルデータ化してくれるアプリケーションです。

ここで保存したデータをスタンプとして Draw でも利用することができるようになっています。

Slide のメニューを開いて、マイライブラリを選択すると Shape で保存したデータが表示されるので、ここで使いたいデータを選択して、Slide を使って位置を調整、拡大したい場合はオブジェクトの上でピンチイン・ピンチアウトを行います。

ボールペンでノートに書いた落書きを Shape で取り込んで配置してみます。

![](http://gyazo.com/817c0daf0f7957658b06316558f30687/raw)

Slide を使うと 0度,90度,180度,270度の時には色がオレンジ色に変わってくれるので、誤って角度がずれたまま配置してしまうのを防げます。

位置を決めたら配置する要素の上をダブルタップします。

![](http://gyazo.com/48357fc6721f077781032e71d6522511/raw)

簡単な手書きの文字やシェイプのトレースなら iPad だけでもできてしまいそうな感じがしますね。

## Illustlator や Photoshop へスムーズに作業移行

とはいえ Draw では最低限の機能しか用意されていないので、仕上げは Illustlator や Photoshop を使いたい場合もあるかと思います。

右上のメニューから Photoshop に送信や Illustlator に送信 を選択すると同じアカウントでログインしている PC で Photoshop や Illustlator が立ち上がり、今編集しているものと同じものが表示されます。

![](http://gyazo.com/376d61d54dd8055ece66c57dbb16f214/raw) 

![](http://gyazo.com/d195778a0ac6ef8b6179877f50002609/raw)

パスとして扱えるようになっているので、色を塗ったり変更したりも楽ですね。

個人的にはとても強力な制作ツールの一つになりそうだな…と感じたのと同時に、Photoshop Touch などのリリースの流れから PCやタブレットなどの端末性能に依存しない制作が行える時代が来るのもそう遠くもないのかな、と感じたり….

次回は cigalecigales さんの「Edge Animateでなんかやる」です。
node-cronで、cron処理にパラメータを渡す


cronJobを作成するときに持っている値を、cron処理で呼ばれるコールバック関数の中でも使いたい。
そんなときは、cronJobのコンストラクタで、`context`パラメータを設定する。

```hoge.coffee
cronJob = require('cron').CronJob

for idx in [0...5]
  cronjob = new cronJob(
    cronTime: "#{idx} * * * * *"
    start:    true
    context:  {num: idx}
    onTick:   ->
      console.log "cron No.#{this.num} : #{new Date}"
  )
```

実行結果

```
cron No.0 : Sat Dec 06 2014 23:59:00 GMT+0900 (JST)
cron No.1 : Sat Dec 06 2014 23:59:01 GMT+0900 (JST)
cron No.2 : Sat Dec 06 2014 23:59:02 GMT+0900 (JST)
cron No.3 : Sat Dec 06 2014 23:59:03 GMT+0900 (JST)
cron No.4 : Sat Dec 06 2014 23:59:04 GMT+0900 (JST)
cron No.0 : Sun Dec 07 2014 00:00:00 GMT+0900 (JST)
cron No.1 : Sun Dec 07 2014 00:00:01 GMT+0900 (JST)
cron No.2 : Sun Dec 07 2014 00:00:02 GMT+0900 (JST)
cron No.3 : Sun Dec 07 2014 00:00:03 GMT+0900 (JST)
cron No.4 : Sun Dec 07 2014 00:00:04 GMT+0900 (JST)
```
boot2dockerで複数のmysqlを実行

mysqlmultiよりDockerの方が楽

##インストール
```brew install boot2docker
boot2docker init
boot2docker up```


##DockerのIPを確認
```boot2docker ip```
このIPでホスト側OSから接続する

##mysqlをrun。今回はportで使い分けている。
```docker run -p 3306:3306 --name "db1" -e MYSQL_ROOT_PASSWORD="1234" -d mysql:5.6
docker run -p 3307:3306 --name "db2" -e MYSQL_ROOT_PASSWORD="1234" -d mysql:5.6
docker run -p 3308:3306 --name "db3" -e MYSQL_ROOT_PASSWORD="1234" -d mysql:5.6
```


##２回目実行時
```boot2docker start```

コンテナIDの確認
docker ps -a

コンテナの起動(a83d5e425193以下はそれぞれのID名。複数指定可)
docker start a83d5e425193 b4fb919fc696 268d0271985e e97573b45eba e9d188102538 f87be757fc3d 889cd84266a5
iOS / SwiftでXMLをパース


こんばんは。寒くなりましたね〜

最近、以前（iOS5頃）に開発したアプリのiOS8対応をチョコチョコと進めています。
そこでXMLのパース処理もSwiftで書き直してみたのでメモ。。

### 読み込むXMLのサンプル
```
<?xml version="1.0" encoding="UTF-8"?>
<Items>		
	<Item>			
		<ItemName>AAA</ItemName>
		<Price>100</Price>
	</Item>
	<Item>			
		<ItemName>BBB</ItemName>
		<Price>200</Price>
	</Item>
</Items>
```

### XMLのパースにはNSXMLParserを使いました
```
var parser : NSXMLParser? = NSXMLParser(data: data)
if parser != nil {
	// NSXMLParserDelegateをセット
    parser!.delegate = self;
    parser!.parse()

} else {
	// パースに失敗した時
    println("failed to parse XML")
}
```

#### NSXMLParserDelegateを設定したクラスのプロパティ
```
var _ParceKey: String! = ""
var _Items: [Item]? = nil
var _Item: Item? = nil
```

#### XML読み込み開始時に呼ばれます
```
func parserDidStartDocument(parser: NSXMLParser!)
{
    // Itemオブジェクトを格納するItems配列の初期化など
}
```

#### XML読み込み完了時に呼ばれます
``` 
func parserDidEndDocument(parser: NSXMLParser!)
{
    // XMLから読み込んだ情報より画面を更新する処理など
}
```

#### タグの最初で呼ばれます
例えばItemsタグやItemタグ、ItemNameタグの読み込み開始時に呼ばれる 

```
func parser(parser: NSXMLParser!, didStartElement elementName: String!, namespaceURI: String!, qualifiedName qName: String!, attributes attributeDict: NSDictionary!)
{
    _ParseKey = elementName

    if elementName == "Items" {
        // Itemオブジェクトを保存するItems配列を初期化
        _Items = []
          
    } else if elementName == "Item" {
        // Itemオブジェクトの初期化
        _Item = Item()
    }
}
```

#### タグの最後で呼ばれます
例えばItemsタグやItemタグ、ItemNameタグの読み込み完了時に呼ばれる 

```
func parser(parser: NSXMLParser!, didEndElement elementName: String!, namespaceURI: String!, qualifiedName qName: String!)
{
    if elementName == "Item" {
        _Items!.append(_Item!)
    }
    
    _ParseKey = ""
}
```

#### 各項目を読み込み
```
func parser(parser: NSXMLParser!, foundCharacters string: String!)
{
    if _ParseKey == "ItemName" {
        _Item!.itemName = string
    
    } else if _ParseKey == "ItemPrice" {
        _Item!.itemPrice = string.toInt()

    } else {
        // nop
    }
}
```

#### 最後に・・
ざっとこんな感じでXMLが読み込めますが、ちょっと面倒クサイ感がありますね。。
XMLのAttributeを特に使わない場合は、Jsonを使った方が簡単にDictionaryに格納できて便利そうです。
_ParseKeyや_Items, _Itemの使い方もこんな感じでよいのかちょっと気になりますが、一旦これで。。

Optional変数の"?"や"!"の使い方が怪しいところがありますがご容赦ください。。勉強します！
Haxeのマクロの技法について1、アナフォリックマクロについて。

どもです,@nobkz

# Haxeのマクロ技法その1

## はじめに。

さてさて、Haxeには強力な言語機能としてマクロがあります。しかし、マクロの技法を知らず、言語機能として良く分からないものとして避けている人が多いのではないでちしょうか?

僕は、マクロむしろ適切なところで、使えば、すごく強力だと思っています。構文が短かくなったり、読みやすくなり、リファクタリングがしやすくなったりすることがあるとは思います。

それで、これから、マクロの様々な技法を紹介していきたいと思います。

基本的に僕のマクロの発想の多くは、Lispからやってきています。そして、この記事は、Lispのマクロについての良著である、OnLispから着想を得ています。というか、OnLispでは、さまざまなマクロが紹介されています。それをHaxeでやるとどなるか?というものをやってみようという記事です。

## アナフォリックマクロ

### アナフォリックマクロとは?

OnLispでは、沢山のマクロの技法が紹介されていますが、そのなかでアナフォリックマクロというのがあります。それをやってみましょう。

さてさて、日常会話で、前のもを示すことありますよね? 「Lispやったことあるかい?」「あるある! 『それ』良いよね」という「それ」っといったものです。このようなのは、アナフォラ(前方照応)というものです。

さて、プログラミングは言語です。それをhaxeのマクロでやろうというわけです。

### アナフォリックなカウンター

さて、まずは、アナフォリックな事例を上げようかと思います。サンプルとして次の、マクロを作ってみたいと思います。

```Test.hx
class Test {
    static function main() {
        loop("I am a lisper and haxer".split(" "),{
             trace(element);
             trace(counter);
             });
    }
    
}
```

このプログラムは、変数elementと、変数counterの宣言がありませんね? しかし、変数名なんとなく、やりたいことが見えてきませんか?

変数elementは、ループの要素の値が、変数counterは、ループのカウンタであってほしいのです。つまり、このプログラムを実行すると次の出力が得られるように、したいのです。

```
Test.hx:4: I
Test.hx:5: 0
Test.hx:4: am
Test.hx:5: 1
Test.hx:4: a
Test.hx:5: 2
Test.hx:4: lisper
Test.hx:5: 3
Test.hx:4: and
Test.hx:5: 4
Test.hx:4: haxer
Test.hx:5: 5
```

普通、こういったループを書くのであれば、このように書くと思います。

```Test.hx

class Test {
    static function main() 
    {
        var counter = 0;
        for( element in "I am a lisper and haxer".split(" ") ){
           trace(element);
           trace(counter);
           counter++;
        }
    }
}

```

さて、この変数宣言や、forの構文をマクロに任せれば良いのです。つまり、このような、マクロの実装になります。

```Test.hx
class Test {
    static function main() {
        loop("I am a lisper and haxer".split(" "),{
            trace(element);
            trace(counter);
        });
    }


    macro static function loop(iterator, block){
        return macro {
            var counter = 0;
            for( element in $iterator ){
                $block;
                counter++;
            }
        };
    }
}
```

一応、counterの変数の影響範囲も考え、ブロックを作り、スコープを作っています。

はい、簡単ですね? 何が難しいのでしょう?

## 今日はここまで


今後も、マクロを使った、技法をいろいろ紹介していきたいと思います。
SidenでHello Worldとテスト

#Siden（紫電かな？）
これ凄い。
http://qiita.com/taichi@github/items/680e7beb6e2cc97e0895
ってことでやってみた。

##mainメソッド
```java:Application.java

import ninja.siden.App;

public class Application {
	public static void main(String[] args) {

		App app = new App();
		
		new HelloResource(app).defineRoute();
		
		app.listen();	
	}
}

```


##Resouceクラス
```java:HelloResource.java


import ninja.siden.App;

public class HelloResource {

	private App app;
	
	public HelloResource(App app){
		this.app = app;
	}
	
	public void defineRoute(){
		app.get("/hello", (req,res)->"Hello World");
	}
}

```

##テスト
```groovy:HelloResourceSpec.groovy
import groovyx.net.http.RESTClient
import ninja.siden.App
import ninja.siden.App.Stoppable
import spock.lang.Shared;
import spock.lang.Specification

class HelloResourceSpec extends Specification {

	 @Shared stop

	 def setupSpec(){
		def app = new App()
		new HelloResource(app).defineRoute()
		stop = app.listen()
	}

	def "簡単な起動のテスト"(){
		setup:
		def endpoint = new RESTClient( 'http://localhost:8080/' )
		when:
		def resp = endpoint.get([ path: 'hello'])
		then:
		with(resp) { 
			status == 200
			data.text == "Hello World"
		}
	}

	def cleanupSpec(){
		stop.stop()
	}
}
```

##ビルドスクリプト
```groovy:build.gradle
apply plugin: 'java'
apply plugin: 'groovy'


sourceCompatibility = 1.8
version = '1.0'

repositories {
    mavenCentral()
	jcenter()
}

dependencies {
	compile 'ninja.siden:siden-core:0.2.0'
    testCompile 'org.codehaus.groovy:groovy-all:2.3.8'
	testCompile 'org.spockframework:spock-core:0.7-groovy-2.0'
	testCompile 'org.codehaus.groovy.modules.http-builder:http-builder:0.7+'
}

```

次は、RestサービスとDBアクセス書く。
【Rails】slimでf.selectの書き方


よく書き方がわからなくて困るのでメモ的に。
あまりバージョンとか関係ないと思いますが一応。

* Rails4.1.4
* Ruby2.1.4p265
* slim-ralis(2.1.5)

--

要件としては

* classを使いたい
* promptで初期値を用意したい
* selectedも用意したい 

下記でいけます。

```ruby
= f.select :number_of_people, options_for_select((1..20).map{|n| ["#{n}人", n]}, selected: @hoge.try(:number_of_people)), {prompt: t('placeholder.number_of_people')}, {class: 'form-control'}
```

```html
<select class="form-control" id="number_of_people" name="number_of_people">
  <option value="">何人で？▼</option>
  <option value="1">1人</option>
  <option value="2">2人</option>
  					  .
					  .
  <option value="7">7人</option>
  <option value="8">8人</option>
  <option value="9">9人</option>
  <option selected="selected" value="10">10人</option>
  <option value="11">11人</option>
					  .
					  .
  <option value="20">20人</option></select>
```

という感じです。
slimの方を簡単に解説すると重要な点は

* 第2引数にoptions_for_selectを書く。その中にselectedも用意
* 第3引数にpromptを書く
* 第4引数にclassを書く

以上です。
Sublime Text3

#環境
MacOS 10.9.5

#環境設定
* テーマやテキストモードの変更

メニューからPreference > Settings Userを選択して、以下を入力

```lang:Preference-sublime-settings
{
    // テーマ
	"color_scheme": "Packages/Color Scheme - Default/Pastels on Dark.tmTheme",
    // フォントサイズ
	"font_size": 12,
    // viキーバインド
	"ignored_packages":[],
    // ファイルを開いた際、コマンドモードで起動
	"vimtage_start_in_command_mode": true,
    // 上下左右キーを押してる間移動する
    "move_to_limit_on_up_down": false

}

```

#ショートカット
・行削除：⌘ + X
・前に行挿入：⌘ + ↩
・後ろに行挿入：⌘ + ⇧ + ↩
・現在行を上に移動：⌘ + ⌃ + ↑
・現在行を下に移動：⌘ + ⌃ + ↓
・行を選択（繰り返す度に下行を選択）：⌘ + L
・カーソル上の単語と同一の単語、または選択した文字列と同一の文字列を選択（マルチカーソル）：⌘ + D
・カーソル上の単語と同一の単語、または選択した文字列と同一の文字列を全選択（マルチカーソル）：⌃ + ⌘ + G
・カーソル位置から上を全選択：⌘ + ⇧ + ↑
・カーソル位置から下を全選択：⌘ + ⇧ + ↓
・対応するカッコにジャンプ：⌃ + M
・対応するカッコの中身を全選択：⌃ + ⇧ + M
・カーソル位置から行末まで削除：⌘ + K, ⌘ + K
・カーソル位置から行頭まで削除：⌘ + K + ⌫
・選択行をインデント（複数行可）：⌘ + ]
・選択行をインデント解除（複数行可）：⌘ + [
・現在行を下にコピー：⌘ + ⇧ + D
・下行を現在行の末尾に結合：⌘ + J
・指定行にジャンプ：^ + G
・読み込んだフォルダ内からファイルを検索：⌘ + P
・シンボル（メソッドなど）に移動：⌘ + R
・現在行をコメント/コメント解除：⌘ + /
・選択範囲をブロックコメント（/** */)：⌘ + ⌥ + /
・リドゥ：⌘ + Y
・アンドゥ：⌘ + U

### 検索・置換・Grep
検索：⌘ + F
置換：⌘ + ⌥ + F
grep：⌘ + ⇧ + F

### スクロール
1ページ下に移動：⌃ + V
ファイルの末尾に移動：⌘ + ↓
ファイルの先頭に移動：⌘ + ↑

###タブ
・新規タブ：⌘ + n
・左から右のタブに移動（サイクル）：^ + tab
・左から数えて１〜9番目のタブに移動：⌘ + [NUM]
・現在のタブを閉じる：⌘ + W

###画面分割
・横に2分割：⌘ + ⌥ + 2
・縦に2分割：⌘ + ⌥ + ⇧ + 2
・画面を4分割：⌘ + ⌥ + 5
・カーソルを指定した画面に移動（１〜４）：⌃ + [NUM]
・現在ファイルを指定した画面に移動（1〜４）：⌃ + ⇧ + [NUM]

#コマンドパレット
Sublime Textで使用できるコマンドの一覧を表示して使用することができる。
自作のスニペットを挿入したり、シンタックスハイライトを変更するコマンドなどがある。
呼び出し方は、**⌘ + ⇧ + p**

#スニペット
定型文を作成・保存して、いつでも呼び出して入力することができる。

**作成方法**
メニューからTools > New Snippet
するとスニペットを入力するファイルが開くので、編集して保存する。
保存する際には、必ず拡張子を.sublime-snippetとする。また、保存したファイル名がスニペットの名前となり、コマンドパレットから実行できる。

```lang:任意の名前.sublime-snippet
<snippet>
<content>
<![CDATA[
<!-- ここに任意のコードなどを入力する。 -->
<!-- 例 -->
hi, ${1:Mike}!
<!-- ${1:任意の値}とすることで、スニペット入力時に1の箇所、つまりMikeに自動でフォーカスを当ててくれる-->
]]>
</content>
	<!-- Optional: Set a tabTrigger to define how to trigger the snippet -->
	<tabTrigger>myHtml5</tabTrigger>
	<!-- Optional: Set a scope to limit where the snippet will trigger -->
	<!-- <scope>source.python</scope> -->
</snippet>
```

#Project
プロジェクト化することで、編集対象のファイルを限定させたり、任意のフォルダ内のファイルのみに限定させることができる。
メニューからProject > Save Project As..を選択し、読み込ませたいフォルダを指定。
そして、Project > Edit Projectを選択すると、●●.sublime_projectというファイルが開くので、このファイルに対象のフォルダのパスや、編集対象としないファイルを正規表現で制限する。

```lang:保存したプロジェクト名.sublime_project
{
	"folders":
	[
		{
			"follow_symlinks": true,
            // プロジェクトに含めるフォルダのパス
			"path": "/Users/hoge/workspace/src/logic",
            // jspのファイルは対象としない
			"file_exclude_patterns":["*.jsp"]
		},
                {
			"follow_symlinks": true,
            // プロジェクトに含めるフォルダのパス
			"path": "/Users/hoge/workspace/src/model",
            // ファイル名にLogicを含むファイルは対象としない
			"file_exclude_patterns":["*Logic*"]
		}
	]
}
```

#プラグイン

###Emmet
###Python AutoComplete
Mac(OSX)のホスト名変更(GUIとCLI(scutil))

# Macのホスト名
円安の影響でiPhoneが値上がりしたので、MacBook Pro (Retina, 13-inch, Mid 2014)（以下、MBP）に波及する可能性があるので、以前より購入を検討していたMBPを購入しました。
購入後は自分色に染めて行きますよね。
設定していく順序はあると思いますが、MBPの場合はホスト名の変更を実施しあす。
初期設定後、Macのホスト名は、”HOKARI の MacBook Pro”のように設定され、ターミナルやネットワーク上などでは、”HOKARI-no-MacBook-Pro"と表示されます。
気持ち悪いぃ〜〜ですね。

「システム環境設定」->「共有」
![スクリーンショット 2014-12-06 1.05.10.png](https://qiita-image-store.s3.amazonaws.com/0/26668/53a036f0-3bc2-39a8-082d-84c7aae2bc62.png)
ターミナル表示
![スクリーンショット 2014-12-06 1.03.21.png](https://qiita-image-store.s3.amazonaws.com/0/26668/bf0d2896-5e81-4338-609c-f63b7c3421b7.png)
余りにも恥ずかしい感じなので変えたいですね。
これを変えるには、GUIとCLIの２種類の方法があります。
よく書かれているのはGUIですね。

## GUIによる変更
簡単にホスト名が変更できます。
![スクリーンショット 2014-12-06 20.54.33.png](https://qiita-image-store.s3.amazonaws.com/0/26668/b2018163-19bc-9fd6-f2e1-32986d208948.png)

「アップルメニュー」から「システム環境設定」を選択。
![スクリーンショット 2015-01-04 10.18.58.png](https://qiita-image-store.s3.amazonaws.com/0/26668/3b756053-037e-6e93-0a47-272ef768b6c9.png)

「共有」を選択。
![スクリーンショット 2014-12-06 20.54.56.png](https://qiita-image-store.s3.amazonaws.com/0/26668/cd225f3d-2558-f0b7-ff38-b3d944580226.png)

「コンピュータ名：」に現在のコンピュータ名が表示されています。
これを変更。
![スクリーンショット 2014-12-06 1.05.10.png](https://qiita-image-store.s3.amazonaws.com/0/26668/eedad786-ceed-27c0-f776-201dcbb5fb6d.png)

変更したホスト名が表示され、.localの表示も変更されています。
![スクリーンショット 2015-01-04 10.26.57.png](https://qiita-image-store.s3.amazonaws.com/0/26668/41acee3a-a1cb-496e-1d1c-29bcdf5c1b2c.png)


## CUI(scutil)による変更
先ずは、MacBook Pro (Retina, 13-inch, Mid 2014)のホスト名を確認しましょう。
###ホスト名確認

```
$ scutil --get ComputerName
HOKARI-no-MacBook-Pro
$ scutil --get LocalHostName
HOKARI-no-MacBook-Pro
$ scutil --get HostName
HostName: not set
```

ということなので、ComputerNameとLocalHostNameの設定をします。

```
$ sudo scutil --set ComputerName mbp2014mid
$ sudo scutil --set LocalHostName mbp2014mid
$ 
```

再度、確認すると…

```
$ scutil --get ComputerName
mbp2014mid
$ scutil --get LocalHostName
mbp2014mid
$ scutil --get HostName
HostName: not set
```

GUIを見てみても…
![スクリーンショット 2014-12-06 1.08.25.png](https://qiita-image-store.s3.amazonaws.com/0/26668/82c779c2-0d91-fc5c-d472-336448d1fa02.png)
変わってますねぇ〜〜