OmniAICreator/Qiita-1.07M huggingface dataset:
Stash(Atlassian)からコミットがあった際にSlackへフックする設定


![stashToSlack.png](https://qiita-image-store.s3.amazonaws.com/0/19316/8df6eb3b-cb28-bb2f-41da-bf14201c9a87.png "stashToSlack.png")


# はじめに
すごく特殊な環境なのですが、バージョン管理にstashを利用し、チャットにslackを利用している場合、slackにpushがされたことを通知したりするような、
Integrationが簡単ではないのです。

しかし、チャットに状況が送られてこないと、

* 誰が何をしているかわからない
* 作業した達成感とかも味わえない
* モチベ下がる

のような負の要素がたまるため、
今回デフォルトのプラグインではできない、
StashからSlackへフックする設定をしていきます。


# Slackの設定

## Incoming WebHooksを設定

Slack側でStashのリポジトリにpushされたタイミングで通知がくるようにするAPIを設定していきます。

### 1. 部屋名のリンクから「Add a service integration..」のリンク押します。

![slack.png](https://qiita-image-store.s3.amazonaws.com/0/19316/1bae7830-436d-cf5f-6e58-9f718114aedb.png "slack.png")

### 2. 「Incoming WebHooks」を「Add」します。

![スクリーンショット 2015-01-24 17.54.55.png](https://qiita-image-store.s3.amazonaws.com/0/19316/a2b3c31a-2822-5ca7-e3ee-69be1c795215.png "スクリーンショット 2015-01-24 17.54.55.png")

### 3. チャンネルを選んで追加！
APIが叩かれた際に、どこの部屋に通知を送るかを設定します。

![kobito.1422089742.995238.png](https://qiita-image-store.s3.amazonaws.com/0/19316/15178b02-2f8d-0ee3-c997-6cf8440096e6.png "kobito.1422089742.995238.png")

### 4. Web hook URLをゲット！

![kobito.1422089793.525744.png](https://qiita-image-store.s3.amazonaws.com/0/19316/ec031a00-6b4e-9a8f-4210-a72290fb0852.png "kobito.1422089793.525744.png")

### 画像や名前も変えることができます！

![スクリーンショット 2015-01-24 17.57.07.png](https://qiita-image-store.s3.amazonaws.com/0/19316/1a531f33-645d-9657-9e85-fe14e13cbb65.png "スクリーンショット 2015-01-24 17.57.07.png")

## StashをインストールしたサーバにslackのAPIを叩くshellを用意

### stash_slack.sh
ココのGistをコピペです。
> https://gist.github.com/linjer/2ee6146d3b320cbe9225

任意のリポジトリへおいてください。
今回はstash-homeと同じディレクトリにstash-slackというフォルダを用意し、格納しました。

``` 
$sudo su 
$su stash
$ mkdir /opt/atlassian/stash/stash-slack
$ vim /opt/atlassian/stash/stash-slack/stash_slack.sh 
#先ほどのGistを貼り付けます

$ chmod +x /opt/atlassian/stash/stash-slack/stash_slack.sh 
#stash での実行権限を与えて完了です
``` 



# Stashの設定

## External Hooksアドオンの追加・設定
### 1.リポジトリにpushがあった際に反応するフックのアドインを追加します

![slack2.png](https://qiita-image-store.s3.amazonaws.com/0/19316/2bae0c64-afe6-d0f2-98e7-7240ba883ebc.png "slack2.png")

### 2.External Hooks を追加します

![スクリーンショット 2015-01-24 17.59.35.png](https://qiita-image-store.s3.amazonaws.com/0/19316/f4499310-4ce8-e15c-0e67-bd929a95ac18.png "スクリーンショット 2015-01-24 17.59.35.png")

### 3.External Hooksの設定

シェルの実行とパラメータの設定を行います。

#### Executableに先ほど作成したshellフルパスを記載
```
/opt/atlassian/stash/stash-slack/stash_slack.sh
```

#### Positional parameters
* $1 Slackのweb hookのURL
* $2 SlackのルームID
* $3 stashのリポジトリURL

``` param
https://hooks.slack.com/services/XXXXXXXXXXXXXXXX
#dev6
http://XXXXXXXXXXXX/stash/projects/XXXXX/repos/XXXXXX
```

![stash_1.png](https://qiita-image-store.s3.amazonaws.com/0/19316/906005bb-9660-6dd1-892d-4db25ccc1714.png "stash_1.png")

# 試してみる

こんな感じでpushしてslackに通知がきましたら設定完了です〜

![stash_2.png](https://qiita-image-store.s3.amazonaws.com/0/19316/c6ca3447-9b39-4d38-9337-c86510c9928b.png "stash_2.png")



# 最後に

検索したら便利なGistがあって本当によかったです。
これでなんとか快適な開発ライフを送れそうです。
OpenCV コントラストを調整する


以下のサイトを参考にして、python版を作成してみました。
http://gori-naru.blogspot.jp/2012/11/blog-post_8647.html

```python
# imageはGRAYSCALEである必要があります
def contrast(image, a):
  lut = [ np.uint8(255.0 / (1 + math.exp(-a * (i - 128.) / 255.))) for i in range(256)] 
  result_image = np.array( [ lut[value] for value in image.flat], dtype=np.uint8 )
  result_image = result_image.reshape(image.shape)
  return result_image
```
モジュールの代替レイアウトを作成する方法

templateフォルダの中にモジュール名のフォルダを追加して
そこにファイルを追加する
パスは、
templates/<your template>/html/<module name>
です。

ファイル名は、デフォルトの追加は、default.phpで
他の場合は、違う名前にする。
ただし、アンダーバーはダメ見たい。

正規サイトのドキュメントは、
https://docs.joomla.org/Layout_Overrides_in_Joomla
（英語サイトです。）
VPC＋ELB＋EC2で割とセキュアなSMTP中継サーバを構築する

# 目的
VPC＋ELB＋EC2という定番アイテムでセキュアなSMTP中継サーバ（リレーサーバ）を構築する

# 構成を決定した理由
・Webからの自動送信に関する迷惑メール対策にかける工数を減少させたい
・アプリケーション改修はあまりやりたくない
・SESは海外発のサービスで遅延もあり、設定もまだめんどくさい
・SESの青天井な料金体系が気に入らない、しかも自由度は少ない
・既にそれなりの規模のサービスに実装したいため、まだまだ成長途中のAWSの機能はできれば使いたくない

**要するに、横着です。**

# 構成詳細
* t2.micro〜t2.small程度のCentOSのEC2インスタンス2つ
* ELB
* VPC（デフォルトじゃないほうがやりやすいかも）

# 構成図
さっきの構成詳細にある要素をこんな感じで設置します。
![kkh_relay_adjusted.jpg](https://qiita-image-store.s3.amazonaws.com/0/52676/660d0fb6-d0a0-ff6f-5a1c-7112ad3b7fa2.jpeg)

# 設置手順概要
**1. VPC作成**
特記することはありませんが、サブネット（プライベートIP）は後で使うのでメモしておきましょう。

**2. インスタンス作成**
Public向けElasticIPは、念のため方が便利です。
ただし必須ではありません。
セキュリティグループはTCP25とTCP80とSSH用の3つが空いていれば最低限十分です。
サブミッションを使うかもって場合のみTCP587などを開けましょう。
ちなみに、うちの案件ではTCP25とTCP80だけで十分でした。
また、TCP80はVPC内サブネット（プライベートIP）からのアクセスのみ許可でOKです。
これは後でも説明しますが、ELBからの生死（ヘルス）チェック用です。
25と587は想定している送信元サーバのPublicIPからのみ許可するようにしましょう。
設定次第では千客万来のスパム専用踏み台サーバになってしまいます。

**3. yumでpostfixとnginxをインストール**
特記事項無しです。

**4.postfixを設定**
詳細は省略します。
ざっくりとやることは以下の通りです。

* main.cfの「mydomain」「mydestination」を設定
* main.cfの「mynetworks」にVPCのPrivateIPのCIDRまたは生成したnetwork_tableを設定
* 起動してchkconfigをonにする

正直やることは少ないですが、1個でも矛盾や間違いがあると動きません。
あと、設定は環境ごとに大きく異なるので、これをコピペしたらどこでも動く！ってものはまずありません。

**5.nginxを設定** 
nginxはELBからの生死（ヘルス）チェックのみに用いるものなので、仮想ホストの設定は不要です。
ElasticIPまたは自動割り当てIPでELBが80ポートにアクセスして200を返せる最低限の設定をします。

**6.ELBを設定**
これも詳細は省略します。
ざっくりとやることは以下の通りです。

* ELBを作る（必ずVPCの下に作る）
* SMTP送信用ポート（25や587）を必要に応じて通過ポートに指定する
* ヘルスチェックはTCP80へのリクエストにする
* セキュリティグループはEC2と同じものか、同じポートの空いた同じVPC内の別のものに設定する
* 【任意】ELBのAliasまたはCNAME宛のDNSを引く
* 中継サーバ用EC2を配置する

ざっくりとしてますが、この6つは割と重要です。
3つめをバカ正直に「TCP25」にしてしまうと、syslogをいじらない限り全てのリクエストがmaillogに吐き出されます。
最大の旨味であるmaillogが生死チェックで埋もれてしまっては悲しい限りですので、忘れてはいけません。
4つめを忘れると、せっかく後で設定してもアクセスできず泣きます。
5つめは省いても全く問題ありませんが、後でアホみたいに長いELBのCNAMEを送信元サーバのrelayhostに書くのは嫌なので、短いものをここで先に設定しておくと非常に便利です。

**7.送信元サーバのMTAの設定**
送信元サーバのMTA（うちはこっちもPostfix）の中継サーバをELBに設定します。
postfixでは「relayhost = ＜ELBのCNAMEまたは設定したドメイン＞」を追記して再起動するだけでOKです。

手順はこんなところです。

# 困ったときは？
困ったときは以下の点に注意してみるとサクッといけます。
### 送信元からリレーサーバに接続できない（Timeout）になる
以下の点が疑われます。

* ELBのセキュリティグループでそのサーバからの接続を許可していない
* EC2のセキュリティグループでそのサーバからの接続を許可していない
* VPCのセキュリティグループ（ACL）でそのサーバからの接続を許可していない

「応答がなかなか返ってこないな・・・あ、死んだ」の場合は大体セキュリティグループを疑うのがAWSの定石ですよね。

### 中継サーバに「Relay access denied」というログが出て中継ができない
ほぼ間違いなく「4.Postfixの設定」の「mynetworks」がうまく設定できていません。
接続元IPがログに併記されているはずなので、それを書き込んで再起動した後に改めて中継ができるか確認して下さい。
それでも中継できない場合はmain.cfの他の記述が誤っていて、Postfixの送信設定自体できていない可能性があります。

### 中継されたメールがどうしても迷惑メールに入ってしまう
必要に応じて**中継サーバ**の迷惑メール対策をしてください。
送信元サーバやELBについての対策は特に必要ありません。

# Tips
### Q.中継・送信元の各サーバを同じドメインで運用したらNDN（不達通知）メールが届かないよ！
仕様です。
どうしても見たいという方は、relay_domainsにそのドメインを設定し、transport.dbを生成して読み込んでください。
transport.dbの生成の仕方はググってください。

### Q.VPC使えない時はどうするの？
なくても運用できないわけではありません。
クラシックの場合との一番大きな違いは、ELBにセキュリティグループが付くかどうかとプライベートIP縛りが使えるかどうかです。
前者はともかく、後者を使えば、インターネット越しの盗聴の可能性が大幅に減少します。
逆に後者が使えないとインターネットや広範囲のプライベートネットを経由するため、盗聴のリスクが大幅に上昇します。
従って、VPCの使えないクラシックオンリーの環境の場合は、素直にSESを使うほうがいいと思われます。
プログラマになること#14 奨学金


#記述する動機
私、とある専門学校でPGを教えています。はや８年。いまだにSEもやってます。
学生さんたちに読んでもらうために書いているのですが、悩めるプログラマ、悩めるSE、悩める教育関係者にも何かのヒントにはなると思い、あえて公開していきたいと思います。全て実例です。個人名は秘密！！

#奨学金＝自己投資
先行投資です。
私が教えている学校の例で説明しましょう。
学費＝120万円✕２年＝240万円
地方から来た場合、月額10万円の生活費＝240万円
∴最低480万円
このバイクはカワサキ Ｎｉｎｊａ　ＺＸ－１４Ｒ　ＯＨＬＩＮＳ　ＥＤＩＴＩＯＮ　ＢＬＡＣＫＬＩＭＩＴＥＤ
概ね200万円です。
２台買っても、80万円残りますね。

![スクリーンショット 2015-01-26 18.31.42.png](https://qiita-image-store.s3.amazonaws.com/0/33317/bc12761f-2341-78f3-e70d-01a5d08043ee.png "スクリーンショット 2015-01-26 18.31.42.png")


#奨学金の免除
先生になれば、免除されます。
但し、常勤。これは、現在かなり困難です。
大学の教育学部でも、何の保証もありません。
コネが全てを決します。これは嘘ではない。

#払わないとどうなるのか？
厳しい取り立てが来ます。
第三者機関に債権常渡の結果です。
彼らは正当な権利を有しているので、ビシビシ取り立てます。
更にペナルティがついてきます。

![スクリーンショット 2015-01-26 18.48.22.png](https://qiita-image-store.s3.amazonaws.com/0/33317/7039e44a-feab-ebce-508d-e6f9c7144fa4.png "スクリーンショット 2015-01-26 18.48.22.png")

#返済期間
３万円／月が精一杯。ゆえに100万円は３年間
500万円は15年間。750万円は20年間。
不定期のアルバイトで月額3万円は非常に厳しい。
稼げるようになって、きちんと返しましょう。
難しい時は、とにかく連絡。これが大事。
返済意思があることだけは伝えにゃならんよ。
古いBootstrapとGoogle Maps JavaScript API v3を一緒に使うとデザインが崩れる

# あいさつ


* Bootstrap < 3.0.0（アップデートする元気はない）
* Google Maps JavaScript API v3

を併用すると

![Screenshot 2015-01-26 01.52.30.png](https://qiita-image-store.s3.amazonaws.com/0/30440/bfbd34a9-67c8-e050-ff94-e25584ca1ed2.png)


ドヒャー


最初は自分のスタイルの組み方のせいかなと思っていたのですが、

余計なものを除いても崩れるし調べてみたら

https://github.com/twbs/bootstrap/issues/1506

みんな「ドヒャー」って言ってる.

3.0.0にパッチが入ったぽい.

デザインのフレームワークを使うとこいう事多いし、結局自分のデザインに寄せるためにパッチをあてるから工数の削減量も微妙だし悩ましいっすな.


# 解決方法

```css
#googlemapdiv img{
  max-width : none;
}

#googlemapdiv label{
  width : auto;
  display : inline;
}

.gm-style img{
  max-width : none;
}

.gm-style label{
  width : auto;
  display : inline;
}
```

![Screenshot 2015-01-26 01.57.23.png](https://qiita-image-store.s3.amazonaws.com/0/30440/f171c500-7f06-a4bd-710b-09755e0acb42.png)


とりあえずいいね！
sbt-assembly(0.12.0)を使ってみる


**sbt 0.13.6**以前は *plugin.sbt* に

```scala:plugin.sbt
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.10.1")
```

を追加して、

*build.sbt* に

```scala:buid.sbt
import AssemblyKeys._
assemblySettings
```

を追加するみたい。

だけど、 **sbt 0.13.6** からは[auto plugin](https://github.com/sbt/sbt-assembly#usage)のようなので基本的には

`addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.12.0")`

を追加するだけでいいみたい。

### 使い方

*project/assembly.sbt* にpluginを追加する。

```scala:project/assembly.sbt
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.12.0")
```

`sbt assembly`実行時に重複したファイル名を参照している部分があると、途中で`java.lang.RuntimeException: deduplicate: different file contents found in the following`が出てエラーになってしまうので、 *build.sbt* に[Merge Strategy](https://github.com/sbt/sbt-assembly#merge-strategy)を追加する。

```scala:build.sbt
assemblyMergeStrategy in assembly := {
  case PathList("javax", "servlet", xs @ _*)         => MergeStrategy.first
  case PathList(ps @ _*) if ps.last endsWith ".properties" => MergeStrategy.first
  case PathList(ps @ _*) if ps.last endsWith ".xml" => MergeStrategy.first
  case PathList(ps @ _*) if ps.last endsWith ".types" => MergeStrategy.first
  case PathList(ps @ _*) if ps.last endsWith ".class" => MergeStrategy.first
  case "application.conf"                            => MergeStrategy.concat
  case "unwanted.txt"                                => MergeStrategy.discard
  case x =>
    val oldStrategy = (assemblyMergeStrategy in assembly).value
    oldStrategy(x)
}
```

あとはprojectのroot directoryで`sbt assembly`すると無事successになる。

#### ハマリポイント

例として下記のようなerrorが出る場合、 *io.netty.versions.properties* の重複が問題になっているので、Merge Strategyに` case PathList(ps @ _*) if ps.last endsWith ".properties" => MergeStrategy.first`などのようにルールを加える必要がある。

```
[error] (*:assembly) deduplicate: different file contents found in the following:
[error] /<your_home>/.ivy2/cache/io.netty/netty-all/jars/netty-all-4.0.24.Final.jar:META-INF/io.netty.versions.properties
[error] /<your_home>/.ivy2/cache/io.netty/netty-tcnative/jars/netty-tcnative-1.1.30.Fork2-linux-x86_64.jar:META-INF/io.netty.versions.properties
[error] /<your_home>/.ivy2/cache/io.netty/netty-tcnative/jars/netty-tcnative-1.1.30.Fork2-windows-x86_64.jar:META-INF/io.netty.versions.properties
[error] /<your_home>/.ivy2/cache/io.netty/netty-tcnative/jars/netty-tcnative-1.1.30.Fork2-osx-x86_64.jar:META-INF/io.netty.versions.properties
```

Merge Strategyを記述して問題を解決しましたが、もしかしてMerge Strategyを書かなくても解決できる？？
Railsでstylusを使う



###Gemfileに追記

Gemfileに下記を追記して、bundleインストール。


```Gemfile
gem 'stylus'
```

```
$ bundle install
```

※`$ npm install -g stylus`　も必要？らしい。

###initializerファイル作成

下記のファイルを作成。（ファイル名は任意）その中でstylusをrequlre。

``` /config/initializers/stylus.rb 
require 'stylus'
Stylus.compress = true
```

※`/config/initializers`以下に置かれたファイルは自動で読み込まれるらしい


###stylus作成

試しにstylusファイルを新規作成。適当に背景色を変えてみる

``` /assets/stylesheets/application.css.styl
body
	background-color #999 #
```


で、

```
$ rails s
```


###プレビューでなんかエラー出る

すると、`localhost:3000` プレビューで下記のようなエラーがでるようになった

`Sprockets::Rails::Helper::AssetFilteredError in 〜〜〜〜`


###とりあえずの解決法？

下記ファイルのなかにある該当部分を`false`に書き換えると、とりあえずエラーはでなくなり、無事背景色が変わった。

```/config/environments/development.rb
  config.assets.raise_runtime_errors = false
```



###参考
[Rails4.1プロジェクトにteaspoon入れたらエラー出たので調査した - 一から勉強させてください(￣ω￣;)](http://dangerous-animal141.hatenablog.com/entry/2014/05/18/000000)


###最後に
間違いorもっといい方法などありましたら指摘いただけるとありがたいです。
gitで過去のコミットに戻る

# 過去のコミットに戻る

    git reset --hard <commit>

そしてチェックアウト。

    git checkout -f


いらないファイルを消す。

    git clean -f

# 取り消したコミットがプッシュ済みだった場合<a id="sec-2" name="sec-2"></a>

    git push -f origin HEAD:master
各言語でのMD5ハッシュの作り方

PHPでは

```php
md5('hogehoge');
```

Rubyでは

```rb
require 'digest'
Digest::MD5.hexdigest('hogehoge')
```

Java(Androidも)では

```java
String str = "hogehoge";
String md5_str = "";
try {
    byte[] str_bytes = str.getBytes("UTF-8");
    MessageDigest md = MessageDigest.getInstance("MD5");
    byte[] md5_bytes = md.digest(str_bytes);
    BigInteger big_int = new BigInteger(1, md5_bytes);
    md5_str = big_int.toString(16);
}catch(Exception e){
    // 略
}
```

JavaScriptでは[hex_md5.jsを使用](http://tech.artizan.co/archives/29)して

```js
hex_md5('hogehoge');
```

mongodbでは初めからhex_md5()が使えるので

```js
hex_md5('hogehoge');
```

Objective-Cではちょっと長いので[Stackoverflowの回答](http://stackoverflow.com/a/1994690)を参考に。

他の言語は触らないので知りません。
mobmap2　メッシュデータの読み込み

mobmapでメッシュデータを読み込む方法についてまとめました。
※メッシュデータのアニメーション機能は現在、ついておりません（2015.1.25現在）

![Screen Shot 2015-01-26 at 5.18.20 PM.png](https://qiita-image-store.s3.amazonaws.com/0/63798/c50e1adb-1635-2415-d144-c94f1a125fd5.png)

[サンプルファイル](https://www.dropbox.com/s/5ozoyvz2vh404cm/Census-MeshTest2005_3.csv?dl=0)：　東京都3次メッシュ人口データ（2005）


#手順
###1.読み込み用のメッシュデータ（CSV）のデータフォーマットを整備
###2.mobmapを立ち上げ、Layerタブにある「Add」から「MESH CSV」を選択し、データを読み込み

#データフォーマット
mobmapでは下記のようにヘッダをつけてデータを作成します。
![Screen Shot 2015-01-26 at 4.20.22 PM.png](https://qiita-image-store.s3.amazonaws.com/0/63798/dacf2fad-ad98-61c7-90be-76a45fca2864.png)

###ヘッダ
ファイル冒頭に下記２行を追加します。

```ruby:qiita.rb
@static-mesh
@use-mesh-code,3
```
※「@use-mesh-code,3」にある「3」はメッシュサイズを表しています。この例の場合、3次メッシュ（1km）を意味しています。メッシュは1次メッシュから4次メッシュまで対応しています。

###フォーマット
フォーマットは「メッシュコード:属性値」というように記述します。この例ではメッシュ内の総人口が該当します。
例）

```ruby:qiita.rb
36533748 ,0 
49395673 ,0 
```
javascriptで指定時間後にwindowを閉じるアレ

思いの外調べるのにてこずったのでメモ。

```js
setTimeout(function () {
    window.open('about:blank', '_self').close();
}, 1000);
```

window.closeだとブラウザ依存で閉じれない場合があります。
http://kojikoji75.hatenablog.com/entry/2013/12/15/223839

setTimeoutの第二引数で第一引数実行までの時間を指定できます（単位はミリセコンド）
mobmap2 カスタムマッピングの方法

mobmapで属性値に応じてカラーリングしたいとき、手動で色を指定してカラーリングするカスタムマッピング機能（Custom mapping）についてまとめました。

![Screen Shot 2015-01-26 at 4.41.36 PM.png](https://qiita-image-store.s3.amazonaws.com/0/63798/3d9020e8-3d2f-3dd1-b5e3-9557c1352e9b.png)

#手順

###1.mobmapを立ち上げ、Layerタブにある「Add」から「Moving objects CSV」を選択し、属性を指定してデータを読み込み

###2.Layersタブに読み込んだ「Moving Objects」レイヤ内にある「Marker > varying」の「By attribute」にチェック
　※デフォルトだと「None」にチェックされている

###3.その後、「Marker > Vary by attribute」において、「Attribute」にカラーリングしたい属性名が設定されていることを確認後、「Custom mapping」にチェックを入れる

###4.Custom mappingフォームに条件を記入

![Screen Shot 2015-01-26 at 4.53.08 PM.png](https://qiita-image-store.s3.amazonaws.com/0/63798/69be5b72-2929-6df2-36dd-edd7b35deead.png)

#####記入方法

<dl>
<dt>属性値 : 色<br></dt>
<dd>コロン（：）区切りで情報を指定します。</dd>
<dd>左：属性値を入力します。上記の例では9種類の属性にそれぞれ色をつけています。<br>
　　※属性値は整数のみ対応しています。</dd>
<dd>右：色番号を入力します。色番号は0はじまりで、「Marker presets」で指定したカラーセットの一番左からの順に番号が振られます。</dd>
<dd>ex) 1:0の場合（上記画面例に従って例）<br>
　　属性「cat」の属性「1」には、「0」番目の色を割当（この例だと青色）</dd>
 
</dl>

※「*（アスタリスク）」を入力すると、それ以外の属性値を指定するという意味になります。
　ex)上記の「*:8」の場合
　　　既に指定されている属性値「1~8」を除いた値が該当します。仮に属性値のレンジが「1~32」の場合、「9~32」が該当します。
「0からのWEBディレクション講座：設計編」に行ってきたよ！【1/2】講座編

# この講座をうけたきっかけ
一応会社でなんとなく「ディレクター」なるものに任命されているけれど…

いったいこれでいいの？
っというか、上から言われるがまま作っちゃったりしてるけど、もっとウマくやれるんじゃないの？

そんな漠然とした不安を解消したくて受けました。
あと、後輩が毎年入ってくるわけですが、自分も教えられたわけでなく独学なのでこれでいーのか感がすごい。
せっかくなら体系的に教えられるなにかが作りたいな、と思ってた。

あとはディレ協関連のみなさんの寄稿記事よくチェックしてたから！
そんなきっかけで受けました。


# この講座のターゲット
ディレクション初心者。企画部の1年目～3年目程度が良いと思う。
制作中心のエンジニアにも、企画側がどんなことを考えているのかざっくり理解する助けになるのでは。

# 講座（座学）
## ディレクションとは
* ディレクターの役割とは、進行管理。要件、リソース、スケジュールの管理
    * SierとWEB屋さんで異なるが、イメージとしては現場監督やオーケストラの指揮者で、自分が手を動かすのとは異なる役割

## 情報設計…戦略面
こんなポイントで企画や提案をまとめましょう

* ターゲット
* ポジション
* KPI/KGI
* マーケティングの要素。スローガンにしておくと、後から入ったメンバーへの共有がラク

## 仕様設計…具体的な設計。いわゆる外部設計
ぶっちゃけ情報設計によってここは左右されるので、フレームワーク的な、定型化はしにくい。とのこと。
コアとなるのがこの部分なので、まず軸になるこれを、情報設計で考えたことと考えていきましょう↓

* システム開発ではなくてWEBサイト制作なのであれば、SEO、SEM、コンテンツ
* メタ情報
* ナビゲーションのグルーピング
* コンテンツのグルーピング

<pre>ここが今一番課題に思っているところなのだが、数をこなすしかないのだろうか…
なにか手がかりが欲しいところ。今回はどちらかというとWEBサービス開発としての仕様設計でなく、WEBサイト制作寄りの内容で説明されているように感じた</pre>

以下、ワークショップ編に続く。

ワークショップ編→http://qiita.com/t_saeko/items/e7ff4417d72666f74caf
非ログイン時に検索窓を追加するユーザースクリプト

http://qiita.com/tbpgr/items/c853c0c6359103a9cd38

テスト不十分＆無骨な作りです.自己責任でお願いいたします.

```js:qiita_toppage_search.user.js
// ==UserScript==
// @name        Qiita TopPage Search
// @namespace   com.cielavenir
// @description Add search button in top page.
// @include     https://qiita.com/
// @version     0.0.0.2
// ==/UserScript==

(function(){
	var before=document.getElementsByClassName('landingHeaderCatchCopy')[0];
	if(!before)return;
	var div=document.getElementsByClassName('col-sm-7')[0];
	var form=document.createElement('form');
	form.action='https://qiita.com/search';
	form.method='GET';
	var input=document.createElement('input');
	input.type='text';
	input.placeholder='Search';
	input.id='toppage-search';
	input.name='q';
	input.size=50;
	input.tabIndex=0;
	form.appendChild(input);
	document.addEventListener('keydown',function(e){
		if(window.event)e=window.event;
		var keycode=e.keyCode||e.which;
		console.log(keycode);
		switch(keycode){
			case 83: case 115:
				document.getElementById('toppage-search').value='';
				document.getElementById('toppage-search').focus();
				e.preventDefault();
				break;
			case 84: case 116:
				document.getElementById('toppage-search').value='tag:';
				document.getElementById('toppage-search').focus();
				e.preventDefault();
				break;
			case 85: case 117:
				document.getElementById('toppage-search').value='user:';
				document.getElementById('toppage-search').focus();
				e.preventDefault();
				break;
		}
	});
	div.insertBefore(form,before);
})();
```
XcodeのCodeSiningエラー（ The identity used to sign the executable is no longer valid ) 鍵の期限切れ

Xcodeで、ある日から、ビルドが成功しない。エラーが出る。

昨日（この前）までできていたのに。。。


エラー内容：
Code Sining Error

The identity used to sign the executable is no longer valid
Please verify that your device's clock is properly set,
and that your signing certificate is not expired.

というエラー。

PROJECTのCode Signing Identity と　Provisioning Profile
および
TARGETSのCode Signing Identity と　Provisioning Profile
は、正しく設定している。

有効期限が切れていたようなので、
新しいキーを取得して、
それをPCにインストールする。

でもなぜか、それがXcode上であたってないようだ。。

Clean して、昔の古いキーを削除して、再度Buildしても、エラー。

そんなとき、以下の方法でエラーを解決できました。

Xcode上の上部、Xcode　＞　Preferences　の　Accounts　タブ

左下の＋ボタンをおして、
Apple　ID　を登録して、ビルドしたら、なんと Success!!!
Pythonでカーネル密度推定

# カーネル密度推定(Kernel Density Estimation: KDE)とは
[Wikipedia](http://ja.wikipedia.org/wiki/%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E5%AF%86%E5%BA%A6%E6%8E%A8%E5%AE%9A)あたりご参考願います。
状況によっては（データ数が多い、滑らかな分布関数に従っている、etc.）、ヒストグラムよりデータの概要を把握するのに役立ちます。

# 適当なデータを作る

まずは必要なパッケージを読み込み、正規分布を重ねあわせた双峰性のデータセットを5個ほど作ります。

```py
import numpy as np
from scipy.stats import gaussian_kde
import matplotlib.pyplot as plt

N = 5

means = np.random.randn(N,2) * 10 + np.array([100, 200])
stdev = np.random.randn(N,2) * 10 + 30
count = np.int64(np.int64(np.random.randn(N,2) * 10000 + 50000))

a = [
    np.hstack([
        np.random.randn(count[i,j]) * stdev[i,j] + means[i,j]
        for j in range(2)])
    for i in range(N)]
```

# データから分布を推定してグラフを書く。

とんでもない外れ値があると面倒なので、0.1%から99.9%までの百分位点でデータを切ってしまいます。
（余談ですがnumpyでは`percentile(array, x)`で0..100の範囲で指定なのに、pandasでは`Series.quantile(x)`で0..1で指定です。ややこしい。）

続いて`scipy.stats.gaussian_kde()`にデータを渡せば、ガウシアンカーネルで推定された密度関数を返してくれるので、`numpy.linspace`と組み合わせればサクッとプロットできます。

```py
limmin = min(np.percentile(x, 0.1) for x in a)
limmax = max(np.percentile(x, 99.9) for x in a)
ls = np.linspace(limmin, limmax, 100)

for n in range(N):
    x = a[n]
    x = x[(x > limmin)&(x < limmax)]
    kde = gaussian_kde(x)
    plt.plot(ls, kde(ls), label='data %d' % n)

plt.xlim([limmin, limmax])
plt.legend()
plt.title('data distributions')
plt.show()
```

![kde.png](https://qiita-image-store.s3.amazonaws.com/0/54842/93f3c3cd-9bf5-be41-50ae-09f42c47ae00.png)

kdeオブジェクトの`resample()`メソッドとか使えば、測定データに近い分布のシミュレーション用のデータ生成とか捗ります。詳しくは[公式ドキュメント](https://docs.scipy.org/doc/scipy-0.15.1/reference/generated/scipy.stats.gaussian_kde.html)で。
【C++】warning C4345: 動作変更 : 形式 () の初期化子で構築される POD 型のオブジェクトは既定初期化されます。

#何か昔同じタイトルの記事を見たことあるって人へ
この記事は昔やってたブログの記事の移植です。
昔の内容で有用そうなものをQiitaに少し修正を加えて移植してます(現在進行形で)。

#概要
コンパイラの警告として

```warning
warning C4345: 動作変更 : 形式 () の初期化子で構築される POD 型のオブジェクトは既定初期化されます。
```

って奴が出る事がある。
自分の場合は殆どのケースでboost::variantを使用してこの警告が出る。

これは何を意味するのかって話。

#上記警告を出す為のコード例

```main.cpp
void main()
{
    struct AAA{ int a; };
    AAA test;
    AAA* pTest = new ( &test ) AAA(); // ここでC4345.
}
```

#【前提知識１】プレースメントnew(配置new)
この警告が出るということはプレースメントnew使ってるんだから説明不要に見えるけどboost::variantの場合内部で使ってて警告がそこで出るので一応解説する(プレースメントnewを使ってない場合でも出るかに関しては未調査)。

コード例の5行目の初期化方法は見慣れていない人もいると思う。

```main.cpp
AAA* pTest = new ( &test ) AAA();
```

この初期化方法をプレースメントnewというんだけど「配置new」と言えばそれなりに判りやすいかもしれない。
丁寧に解説するの面倒だからざっくり言うけど、ようはnewする際に割り当てるポインタを自分で指定できる。ようは先に確保しておいたメモリに対して配置するnewって事。

今回は[ pTest ]に[ &test ]のポインタを[ new ]で割り当ててる。


「普通にpTest = &testでよくね？」


ごもっともです。上記のコードは例なのでそこは勘弁。

本来の使い方はメモリプールを別途用意しておいて、そのメモリプールをブロック毎に区切って配置する事でメモリ確保のオーバーヘッドを減らしたりする。
あんまり使わないね(ゲームのタスクリストとかで高速化に使ったことあるけど最近のPCは早すぎて効果無かったよ)。

#【前提知識２】POD型

昔Cの参考書とか読んで構造体は次のように初期化できると見たことがあると思う

```main.cpp
void main()
{
	struct AAA { int a; char b; };
	// この{}で括った初期化方法
	AAA const test = { 100, 'A' };
	return 0;
}
```

コンストラクタの存在しない構造体を宣言する際にconstを付けようとするとこの初期化方法が便利でよく使うんだけど、
この初期化方法ができる構造体の事をPOD(プレーンオールドデータ)と呼ぶ。
厳密な定義ではないけど、ようはコンストラクタやpublic,privateなどの指定が一切無いC言語で書かれたノーマルな構造体の事をPODと呼ぶと言ってしまったほうが説明が楽かな、当然正しい知識を知りたいなら別途調べて。

#原因の詳細
んでやっとこ警告の説明に入れる。

ようはこのPOD型の構造体に対して配置newを呼び出すコードに対してコンパイラが警告を出しているという話。
そもそもの問題は5行目の次のコードが「コンストラクタの定義されないPOD型でコンストラクタを呼び出している」事にある。

```main.cpp
AAA* pTest = new ( &test ) AAA();
```

実はこれを次のようにコンストラクタ呼び出しをやめるよう書き換えれば警告は出なくなる。

```main.cpp
AAA* pTest = new ( &test ) AAA; // ()を外した.
```

じゃあこれで良いじゃんって思うかもしれないけど、例えばテンプレートでは指定された型がPODかどうか見てない場合次のようなコードになる。

<code>
T* p = new ( &t ) T();
</code>

これだとPOD型を渡した際に結局警告が出る。(is_podとかは本稿の主題とずれるのでスルーしてください)

んでそもそもこの警告は何を意味しているのかと言うと、
どうも昔と現在でPOD型の構造体を配置newで初期化し、更に上記のようにコンストラクタを呼び出した場合の初期化方法が違うらしい。

https://msdn.microsoft.com/ja-jp/library/wewb47ee.aspx
> この警告は、POD (plain old data) オブジェクトを () で初期化する場合に、Visual Studio .NET に付属している Visual C++ コンパイラの動作変更を報告します。コンパイラは、既定でオブジェクトを初期化します。

ようは昔を知ってる人に対して動作が変わったって話なので、直せる場合は直しても良いけど基本的には無視安定。
library()が既存の関数を上書きしたという警告を非表示にする。


dplyr はデータ処理を簡潔に書けて便利。しかし、Rscript でバッチ処理ときなど、毎回警告がでるのはうっとうしい。

```R
> library(dplyr)

Attaching package: 'dplyr'

The following object is masked from 'package:stats':

    filter

The following objects are masked from 'package:base':

    intersect, setdiff, setequal, union
```

warn.conflicts=FALSE でOK。

```
library(dplyr, warn.conflicts=F)
```

http://stackoverflow.com/questions/20319826/silence-messages-about-masked-functions/26168734#26168734
ActiveAdminの検索条件から、has_manyとhas_oneを除外する

管理ページを簡単に追加できる [ActiveAdmin](https://github.com/activeadmin/activeadmin) はとても便利なんだけれど、ここはちょっとね？と思わせる仕様がたまにあります。
現時点（2015/01/26）で最新の1.0.0preのサイドバーの検索条件もそのひとつ。

ここの検索条件には、デフォルトでモデルのアソシエーションが追加される仕様になっています。
たいていそこそこアソシエーションの多い user モデルなどの場合、N+1 問題か？ってくらいページが重くなり、まともに開けないレベルになったりするんですね。

```filter``` メソッドを使って必要な条件だけを追加したり、```remove_filter``` で不必要な条件を削除したりは出来るのだけど、そもそも ```has_many``` や ```has_one``` はどのモデルでも基本的に検索条件としては必要ないので、モンキーパッチを当ててデフォルトの検索条件そのものを変えることにしました。

```rb:config/initializers/active_admin_cancan.rb

module ActiveAdmin
  module Filters

    # lib/active_admin/filters/resource_extension.rb
    # サイドバーの検索条件から、default_association_filters を対象外にする。
    # has_manyやhas_oneがプルダウン条件になって恐ろしく重くなる現象の回避策。
    module ResourceExtension
      # Returns a default set of filters for the associations
      def default_association_filters
        if resource_class.respond_to?(:reflect_on_all_associations)
          poly, not_poly = resource_class.reflect_on_all_associations.
            select{ |rr| rr.macro == :belongs_to }.partition{ |r| r.options[:polymorphic] }

          # remove deeply nested associations
          not_poly.reject!{ |r| r.chain.length > 2 }

          filters = poly.map(&:foreign_type) + not_poly.map(&:name)
          filters.map &:to_sym
        else
          []
        end
      end
    end
  end
end

```

```belong_to``` はそのまま検索条件としてほしいので、アソシエーションのうちこれだけはデフォルトで追加されるようにしています。
もちろんこのモンキーパッチで定義された検索条件はただのデフォルトなので、 個々のモデルに対して ```filter``` メソッドで条件を後から定義し直したりすることもできます。
上記のイニシャライザを追加したら、サーバを再起動すると反映されます。


参考にしたのはこちらのissueです。
[Large associations cause long load times with default filters #2738](https://github.com/activeadmin/activeadmin/issues/2738)
一応対策はされるようなので、早く公式に設定が追加されると良いですね。
AndroidのCustomViewでタッチ領域を円にする

# Androidでタッチ領域をカスタマイズしたい

こういう状況を想定しています。

![custom view detect](https://qiita-image-store.s3.amazonaws.com/0/42282/2616b35a-5a74-d070-b8cd-bbe246f37181.png)

こういう風に、CustomViewでのタッチ判定領域をカスタマイズするときにどうすればいいのかを調べてみた結果をまとめておきます。

円状のボタンを作った時とか、独自の形をしたViewを作った時に、タッチ領域が四角のままというのをなんとかしたいという要望が出たので作りました。(需要は少なそう)

# View#dispatchTouchEventを使用する
結果として、ViewクラスにあるdispatchTouchEventをOverrideすればいいらしい。

```CircleDetectView.java
public class CircleDetectView extends View {
    //... 中略

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        float touchX = event.getX(), touchY = event.getY();
        float r = getWidth() / 2;

        // 中心からタッチ点までの距離(の2乗)を計算
        // float lenght = (float)Math.pow(touchX - r, 2) + (float)Math.pow(touchY - r, 2);
        // 追記(2015/2/26):
        // 距離を測る Math.hypot という大層便利なメソッドがありました。
        double length = Math.hypot(touchX - r, touchY - r);

        // (中心からタッチ点までの距離)^2 <= (円の半径)^2
        if (length <= r * r) {
            // 円の内部
            // (superを呼び出すことによってonTouchやonClickを呼び出すようにする)
            return super.dispatchTouchEvent(event);
        } else {
            // 円の外部(falseにすると、onTouchやonClickなどが呼ばれない)
            return false;
        }
    }
}
```

dispatchTouchEventがタッチイベントの起点として使われてるようなので、こいつを少しいじってやれば解決するようです。

今回は円の内側をタッチ領域としたいので、タッチした点から円の中心(今回はViewの中心)までの距離が半径よりも小さくなれば円の内側をタッチしたことが表せますね。

# 展望
領域判定の部分をinterfaceにして、領域を自分でカスタマイズ出来るようになったらちょっとおもしろそう。
星形の判定とか、同じ円でも中心をずらして半円のタッチ領域とか、いろいろ可能性はありそうですね。

# 参考サイト様
Android のタッチイベントを理解する(その1)
http://blog.lciel.jp/blog/2013/12/03/android-touch-event/
画像をグループごとにランダムで出し分ける


例えば、海、山、川っていうグループごとに画像を用意していて、読み込むたびに海の一覧、山の一覧、川の一覧ってな感じで表示させたかったので、調べたメモ。

## グループごとに配列に入れて、ランダムで出し分ける
海、山、川のグループごとに配列に入れて、出し分けます。

```javascript
var gruoup = new Array;
    group[0] = 'a'; // 海
    group[1] = 'b'; // 山
    group[2] = 'c'; // 川
```

配列をランダムで出します。

```javascript
var no = Math.floor(Math.random() * group.length);

var groupId = group[no];
```


## 画像の名前をグループごとに分ける
画像の名前をグループごとに分けます。
こんな感じ。

img_group_a1.jpg 〜 img_group_a5.jpg
img_group_b1.jpg 〜 img_group_b5.jpg
img_group_c1.jpg 〜 img_group_c5.jpg

## あとはforで繰り返し、表示させるだけ。

```jQuery
  for (var i = 0; i < 5; i++) {
    $('.slideMovie').append('<li style="background-image: url(img/img_group_' + groudId + (i +1) + '.jpg);"></li>');
  };
```

全部まとめて書くと、こうなります。

```jQuery
$(function(){
  var gruoup = new Array;
      group[0] = 'a'; // 海
      group[1] = 'b'; // 山
      group[2] = 'c'; // 川

  var no = Math.floor(Math.random() * group.length);

  var groupId = group[no];

    for (var i = 0; i < 5; i++) {
      $('.slideMovie').append('<li style="background-image: url(img/img_group_' + groudId + (i + 1) + '.jpg);"></li>');
  }
};
```

これでグループごとに画像を出すことが出来ました。
要求分析についての雑記

要求分析方法

要求分析は、要求抽出の次のフェーズです。
主な目的としては、抽出された要求を分類して要求間の競合を解決する事にあります。
要求の優先順位が正確に割り当てられていれば、要求間の競合の解消や、開発コストの見積もりが楽になります。
この２つだけはどうしても進めたいではだめ。まずこちらを第一優先に進めるという考え方でなくてはいけません。
※仮に優先順位に優劣が付けられない複数の機能がある場合は、視点を大きくとれば一つの要求になることもあります。


要求分析後、各要求はランク付けされると共に、以下の４つにレベル分けされます。
・必須（mandatory）
・強く望ましい（highly desirable）
・望ましい（desirable）
・任意（optional）


分析する上で必要な観点は以下の4点です。
・要求の必要性
→目標に対して、この要求はどれだけ必要なのか、明確に定義されている事。
・要求間の類似性
→抽出された要求間で、類似性は存在しないかを確認する。
・要求間の一貫性
→抽出された要求同士の一貫性は保たれているか？互いに矛盾しあっていないかを確認する。
・要求の完全性と実現可能性
→要求が正確に抽出されており、全ての要求は現在のリソースで作成可能かを確認する。

上記の観点を持って、以下のプロセスを歩んでいきます。
1.要求の分類を行い、種類ごとに整理する。
2.要求の確認を行い、類似性、一貫性、完全性、必要性を確認する。
3.関係者の合意を得る。


いわゆるお仕事を進める上で、当たり前と言えば当たり前なプロセスです。
概念自体は実体験に基づけるので、イメージしやすいと思います。

最後に、要求分析で用いられる概念モデルの方法を羅列します。
たくさんある概念モデルの中から、適材適所で選択出来るかどうかが要求分析のキモなので、頭の片隅に入れておいても損はしないかと思います。

1.データフローモデル
システムの外部環境やプロセス間で入出力されるデータの流れに基づいて構成要素間の関係をモデル化する方法です。
データをモノとして捉えられるため、認識のすり合わせに最適な手法です。

2.制御フローモデル
プロセス間の制御の流れに基づいて構成要素間の関係をモデル化する方法です。
条件分岐に焦点が当てられる手法のため、有識者同士のすり合わせ向けです。

3.状態モデル
イベントによる状態遷移に基づいて構成要素間の関係をモデル化する方法です。
頻繁に通信を行ったり、リアルタイム更新性のあるシステムにおいて有用です。

4.イベントシーケンスモデル
イベントとその応答の時間的な順序系列に基づいてモデル化する方法です。
使用用途は状態モデルと被るケースが多い。イベント視点かオブジェクト視点かで使い分けましょう。

5.オブジェクト指向モデル
オブジェクトを構成する属性とその操作に基づいて構成要素間の関係をモデル化する方法です。
プログラマーが最も好む手法かと思われますが、オブジェクトの数が増えてくるにつれ作成難易度が上昇します。
システムの堅牢性に自身があるのであればオブジェクト指向モデル一択かと思います。

6.ゴール指向モデル
システムの完成を全体のゴールと捉えて、要所をサブゴールと捉えてモデル化する方法です。
要所と要所間で見積もりを取ることが出来、各目標値の遅れが全体にどう影響するかを把握しやすい事が利点です。

7.概念データモデル
システムが処理対象とするデータの構造を論理的に分析する方法です。
平たく言うとDB設計書に近いです。作成する上で重要な点はエンティティ間の関係であり、
1：1、1：多、多：多なのかを明確に定義しなければいけません。

8.形式的モデル
オブジェクト指向モデルをより厳格化したものです。要求機能や振る舞いを表現するだけでなく、意味も数学的観点から定式化する必要があるそうです。
形式的モデルに基づいてコードを自動生成することを狙いとしている分野もあるらしく、
「ソースコード is 仕様書」となりがちな一般論のアンチテーゼである、「仕様書 is ソースコード」を推進している模様です。
作成難易度は最高レベルかと思われます。

9.ビジネスモデル
ビジネスに関するプレーヤ間の取引関係をモデル化する方法です。オブジェクト指向モデルはシステムに重きを置いてますが、こちらはシステムを使用する人に重きを置いています。
性質上BtoB向きかと思われます。

10.ビジネスプロセスモデル
ビジネスモデル + ゴール指向モデルです。
システムリリース後の事まで視野にいれた考えであり、このモデルを採用する場合は立派なシステムができてもシステムを使いこなすビジネスプロセスがなければ経営課題は解決できないだろうという考えが必要です。
ある程度先見の明が必要となってくるため、難易度は高めかと思われます。
drone.io を手前ビルドする

止ん事無き理由（具体的には https://github.com/drone/drone/pull/847 の確認）で自分でドロ〜ンをビルドする必要が出た。手順を雑にメモする。やったのは Ubuntu trusty です。

### チェックアウト

```bash
export GOPATH=~/.go
export PATH=~/.go/bin:$PATH
mkdir -p ~/.go/src/github.com/drone
cd ~/.go/src/github.com/drone
git clone https://github.com/udzura/drone.git
```

### Go のインストール

きょうびは、 [godeb](http://blog.labix.org/2013/06/15/in-flight-deb-packages-of-go) と言うのを使うのがナウでヤング。公式には go 1.3.3 でビルドされてる気がする。

```
wget https://godeb.s3.amazonaws.com/godeb-amd64.tar.gz
tar xzf godeb-amd64.tar.gz
./godeb install 1.3.3
```

### ビルド

便利な手順ファイルがある: https://github.com/drone/drone/blob/master/.drone.yml#L8-L16

```bash
cd ~/.go/src/github.com/drone/drone
sudo apt-get -y install zip libsqlite3-dev sqlite3 rpm
gem install fpm
make deps
make test
make packages
```

これで `packaging/output/drone.deb` にdebができる。ちなみにrpmもできている。

### インストール

```bash
sudo dpkg -i packaging/output/drone.deb
```

オレオレビルドです、と言うのを明示するには `VERSION` と言うファイルをいじってsuffixを付けると良いのでは。
CocoaPods 小技巧 - Library 設定 (1/2)

[CocoaPods](http://cocoapods.org/) 是 iOS 的一個函式庫相依管理的工具，在日常開發中或是撰寫函式庫都有用到，今天來對 library 在 Podfile 中可用的設定方法做個筆記。

<!-- more -->

今天 library 以最常用到的 AFNetworking 為例。

# 最基本的使用方式

``` ruby
pod 'AFNetworking'
```

最基本的使用方式，`pod` 加上 library name 即可搞定

## 版本指定

版本指定是最基本的指定方式之一，由於 CocoaPods 的是用 ruby 寫成，因此他用了 RubyGem 的方式來指定版本

``` ruby
pod 'AFNetworking', '2.0' # 指定使用 2.0 版本
```

### >, >=,  <, <=

除了最基本的指定版本，可以運用邏輯運算元來指定版本：

- `'> 0.1'` - 大於 0.1 的版本
- `'>= 0.1'` - 大於等於 0.1 的版本
- `'< 0.1'` - 小於 0.1 的版本
- `'<= 0.1'` - 小於等於 0.1 以下的版本

### ~>

CocoaPods 還有一個邏輯運算元 ~> 可以有比較不一樣的比較方式，是根據 semantic versioning 的方式去比較版本號並控制範圍。

- `'~> 0.1.2'` - 包含 0.1.2 到 0.2 之間的版本，不含 0.2 及以上
- `'~> 0.1'` - 包含 0.1 到 1.0 之間的版本，不含 1.0 及以上

### 版本設定參考

- [Semantic Versioning](http://semver.org/)
- [RubyGems Versioning Policies](http://guides.rubygems.org/patterns/#semantic-versioning)

# 參考資料

- [CocoaPods Guides - The Podfile](http://guides.cocoapods.org/using/the-podfile.html)

## 同步發佈

- [CocoaPods 小技巧 - Library 設定 (1/2) - 熊屋 | 技術小記](http://blog.kumaya.co/2015/01/26/cocoapods-tips-library-setting-1-of-2/)
スマホで目的地のリンクを、現在地からの経路付きでGoogle mapアプリに渡す


こんな経験があると思います。
1. スマホでお店を検索
2. お店の位置情報を選択してコピー
3. マップアプリを開いて、コピペ
4. 現在地からの経路を検索

ハッキリ言ってめんどくさいですよね。UX的にどうなのよ？

## それ、URLスキームでできるよ？
と思ったら、URLスキームで簡単に実装できたので、それのメモ

```html
<a href="comgooglemaps://?daddr=目的地の緯度,目的地の軽度">目的地</a></li>
```

`comgooglemaps://`でGoogle mapアプリを立ち上げて、`?daddr=`で目的地の緯度経度を指定してあげます。
これだけで、リンクをクリック（タップ）すると、アプリが立ち上がって、経路選択画面が表示されます。
簡単！すてき！

## ちょっと一工夫
これだと、間違ってタップしてしまった場合でもアプリに飛んでしまうので、ここをちょっと工夫します。

```jQuery
$(function(){
  $('a[href^=comgooglemaps://]').on('click', function(e){
    e.preventDefault();
      if(confirm('mapアプリへ移動します。よろしいですか？')) {
        location.href = $(this).attr('href');
      }
  })
})
```

`a[href^=comgooglemaps://]`でhrefが `comgooglemaps://`から始まるリンクを対象に、リンククリック時にアラートを出すようにしています。

ここで「はい」を押した場合、マップアプリに飛ぶようにしています。

これなら間違えて押してしまっても大丈夫ですね！

良かったら使ってみてください。
Qiitaのユーザーページの投稿タイプから検索できるユーザースクリプト

http://qiita.com/tbpgr/items/10df8c74cb699059b969
http://qiita.com/suzuki86/items/1d0426d5b24ef5404c16
の、別実装。この実装はonclickを使いません。
どちらを使うかは、好みでどうぞ。

```js:qiita_userpage_search.user.js
// ==UserScript==
// @name        Qiita UserPage Search
// @namespace   com.cielavenir
// @description Tag Type in user page is searchable.
// @include     http://qiita.com/*
// @version     0.0.0.2
// ==/UserScript==

(function(){
	var span=document.querySelector('.userPage_heading > span');
	if(!span)return;
	var user_name=span.textContent;
	var tspan=document.getElementsByTagName('tspan');
	for(var i=0;i<tspan.length;i++){
		var tag=tspan[i].textContent.replace(/.*? - /,'');
		if(tag=='Others')continue;
		var a=document.createElementNS('http://www.w3.org/2000/svg','a');
		a.setAttributeNS('http://www.w3.org/1999/xlink','href','https://qiita.com/search?q=user%3A'+encodeURIComponent(user_name)+'+tag%3A'+encodeURIComponent(tag));
		a.textContent=tspan[i].textContent;
		tspan[i].textContent='';
		tspan[i].appendChild(a);
	}
})();
```
サーバーを中継し更に中継する 多段SSH



```.ssh/config

Host fumidai1
  User <1個目の中継サーバーユーザー>
  HostName <1個目の中継サーバー>

#ssh fumidai2と打てばfumidai2まで入れる
Host fumidai2
  User <2個目の中継サーバーユーザー>
  HostName <2個目の中継サーバー>
  IdentityFile <必要であれば>
  ProxyCommand ssh fumidai1 nc %h %p

#ssh Goalと打てばGoalまで入れる
Host Goal
  User <Goalのユーザー名>
  HostName <Goalのサーバー>
  IdentityFile <通る必要のある鍵が必要>
  ProxyCommand ssh fumdai2 nc %h %p
```

ほんで、トンネルを開けたい場合
(sshするだけでなく、他のアプリなどで該当サーバーに接続したい場合

```
#サーバーGoalの1個前のサーバーの設定に
Host fumidai2
  User <2個目の中継サーバーユーザー>
  HostName <2個目の中継サーバー>
  IdentityFile <必要であれば>
  ProxyCommand ssh fumidai1 nc %h %p
#以下を追記
  LocalForwad <使いたいLocalPort> <Goalのサーバー>:<Goalのポート>
```

で ssh -N -f Goalでトンネルが開くので、使いたいLocalPortに向けて接続設定を行えば、
他のアプリなどでも接続出来るようになる。
クラス名からリリースノートまで、英語で迷わないために参考にできるサイト一覧

# [codic](http://codic.jp/)
http://codic.jp/
日本語を入力するとプログラミング用語を英語で返してくれる和英辞書です。
たとえば「削除する」で検索すると、

* unlink
* erase
* remove
* delete
* trim

を返してくれます。
ちょっと迷ったときに検索するだけでニュアンスがぴったりな単語を探せるので便利です。

[codicの開発者ブログ](http://blog.codic.jp/)や[codic開発者のTwitterアカウント](https://twitter.com/codic_project)にも不定期（？）に英語ネタを書いてくださっています。

# [The Java Programmer's Phrase Book](http://phrasebook.nr.no/phrasebook/index.html)
http://phrasebook.nr.no/phrasebook/index.html
Einar W. Høstという方が、[Meaningful Method Names](https://www.duo.uio.no/handle/10852/8842)という博士論文を書いています。
著名なJava製OSSを調べて、メソッドの処理内容とメソッド名との関係性を調査しています。

このページはEinar W. Høstさん自身が論文の内容の一部をまとめたものです。

メソッド名から、そのメソッドがどのような処理を行っているかのパターンを記述しています。

たとえば`resolve`なら

	These methods often contain loops, use local variables, create objects, do runtime type-checking or casting, have branches and have multiple return points, and comparatively often are static, return parameter values and call themselves recursively.

という具合に、メソッド名から、ループの有無やreturnのタイミングなどを記述してあります。

さらに、単なる動詞1単語のみならず、動詞に続いて名詞がくっついている場合や`max`という単語が続く場合などでも、分類して記述してあります。

論文の本文は[Meaningful Method Names](https://www.duo.uio.no/handle/10852/8842)からPDFファイルで開けます。

* メソッド名にはパターンがあることを明らかにする
* メソッド名と実装との間の関係性を明らかにする
* OSSでどのようなメソッド名が使用されているかを調べることで、メソッド名のネーミングの重要なポイントを調査する

ということを目的としている論文だそうです。

# [JSTQBソフトウェアテスト標準用語集](http://jstqb.jp/syllabus.html#glossary_download)
http://jstqb.jp/syllabus.html#glossary_download
テストの用語集です。日本語に対応する英語が載っています。
テストコードを書くときにたまに参考になります。

# [githubのコード検索](https://github.com/search)
https://github.com/search
意外と便利なことに最近気が付きました。
クラス名や変数名で複数の命名案があるときに、コードを検索して、どの案が多数派かを調べることができます。

たとえば例外が発生した時に実行されるメソッドの名称で

* `onCatchException`
* `onException`
* `onExceptionOccur`

という案があるときに多数派を探せます。
ちなみに`onException`が多数派でした。

Issueも検索できるので、Issueを英語で書かなければいけないときにも参考にできるかもしれません。

# Qiitaで「英語」で検索
* [クラスの命名のアンチパターン](http://qiita.com/magicant/items/8134edf969f9629fa66e)
* [英語コミットコメントに使えるオシャレフレーズ集](http://qiita.com/ken_c_lo/items/4cb49f0fb74e8778804d)
* [ネイティブと働いて分かった英語コミットメッセージの頻出動詞10つ](http://qiita.com/gogotanaka/items/b65e1b081fa976e5d754)

が私にとって特に参考になりました。

# その他
* [Changelogのための英文テンプレート集](http://d.hatena.ne.jp/pyopyopyo/20070920/p1)
* [Release note のための英文テンプレート集](http://d.hatena.ne.jp/pyopyopyo/20070922/p1)

どちらも同じ方のブログです。
例文まで書いてくださっているのでコピペで使えそうです。
jqueryのgetとかfirstとか


以下、私的メモ。

```html
<div class="foo">FOO</div>
<div class="foo">FOO</div>
<div class="foo">FOO</div>
```


```javascript

var foo = $(".foo");

var html = foo.get(0);
// html.text("BAZ"); こいつは動かない。

var jq_object = $(html);
jq_object.text("BAZ"); // これは動く

var first = foo.first();
first.text("BAZ"); // これも動く
```

get(0)するときは、返ってくるのはobject?じゃないよということは忘れないこと。

ついでにいうと、firstは
prevObject: b.fn.b.init[3]
とかデータ持っている。
XCTest ターゲットのビルドでリンカーエラー

昔から開発してゐる iOS 用アプリのビルドターゲットに対して XCTest のビルドターゲットを追加してテストケースを書いたのですが、いざ ⌘U でテストを実行しようとしてみると、リンカーがエラーを吐いて止まってしまひました。

> ```
Undefined symbols for architecture x86_64:
  "_OBJC_CLASS_$_Foo", referenced from:
      objc-class-ref in FooTest.o
     (maybe you meant: _OBJC_CLASS_$_FooTest)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
```

どうやらテストケースのコードからテスト対象であるアプリ本体のコードがうまく参照できてゐない様子。
"Build Settings" で "Symbols Hidden by Default" の設定を "No" にしたら直りました。 ![symbolshidden.png](https://qiita-image-store.s3.amazonaws.com/0/38244/07d8e8dd-3fce-9bf4-a4df-0ea1701830c2.png)

アプリ本体のソースコードも XCTest ターゲットの "Target Membership" に加へてしまふという解決策もある様ですが、アプリ本体の各ソースファイルが二重にコンパイル・リンクされることになるのでよろしくないと思はれます。

----

cf. [ios - When do app sources need to be included in test targets? - Stack Overflow](http://stackoverflow.com/q/21911168)
DNS BINDバージョン確認コマンド

DNS BINDのバージョンを確認するコマンドです。

BINDサーバにログイン出来る場合は、BIND(named)のパスを確認します。

```
%ps awux | grep -v grep | grep named
*****    XXXXXXX  0.0  7.8 XXXXX XXXXX  ??  Ss    XXXXXX XXXXXXX /usr/local/bind-test/named -c /*******/*******/named.conf -t /var/named -u *****
%
```

BINDサーバ上でBINDバージョンを確認する場合は、先ほど確認したnamedに-vを付けて、以下のコマンドを実行します。

```
%/usr/local/bind-test/named -v
BIND 9.X.X-PX
%
```

BINDサーバ以外からBINDバージョンを確認する場合は、以下のコマンドを実行します。
ただし、セキュリティ的に、BINDサーバ側のnamed.confで表示するバージョン文字列を意図的に変更している場合が多いと思いますので、バージョン情報は確認出来ない場合があります。

```
$ dig +noall +ans @BINDサーバ chaos txt version.bind
version.bind.           0       CH      TXT     "9.X.X-PX"
$
```
共通の式をたくさんadd hookするときのTIPS

add-hookをいくつも並べるのはかっこ悪いなと思ったときに重宝する。
例えばこのようにする。

```el:
(require 'cl-lib)
(cl-dolist (hook (list
                  'lisp-mode-hook
                  'emacs-lisp-mode-hook
                  'lisp-interaction-mode-hook
                  'c-common-mode-hook
                  'perl-mode-hook
                  'text-mode-hook))
  (add-hook hook (lambda ()
                   (whitespace-mode 1))))
```

ここでは共通の(whitespace-mode 1)という式をいくつかのhook変数にひっかけている。
hook変数のリストや無名関数の中身を自由に変えればなかなか汎用的に使えるのではなかろうか。
MySQLのDBからテーブルの平均カラム数を計算する

MySQLのDBからテーブルの平均カラム数を計算する
===========

尚、以下のワンライナーはEC-CUBE用のため、grepでテーブル名を限定しているところは読み替えていただきたく。

```shell-session
echo 'show tables' | mysql -u $DBUSER -p$DBPASS $DBNAME | grep dtb | grep -v 'seq$' | awk '{print "desc " $1 ";"}' | while rea
d LINE;do echo $LINE | mysql -u $DBUSER -p$DBPASS $DBNAME | wc -l ;done | awk 'BEGIN{cnt=0}{cnt+=1;sum+=$1}END{print sum/cnt}'
```
AntigenでPreztoを導入


# 概要

見聞きした様々な Tips を継ぎ足していった結果、
フランケンシュタイン状態になってしまった .zshrc を整理したいと思い立ち、
Zsh の設定フレームワークを利用してみることにしました。

[oh-my-zsh](https://github.com/robbyrussell/oh-my-zsh) がよく利用されている様子ですが、
[Prezto](https://github.com/sorin-ionescu/prezto) という、よりコンパクトなものが紹介されていましたのでこちらを導入してみます。

また、導入の際は Zsh のプラグインマネージャ [Antigen](https://github.com/zsh-users/antigen) を利用します。
将来的に、 Prezto の機能を他のプラグイン導入で補う、ということもできそうです。

# 導入

事前に Zsh をインストールし、ログインシェルとして設定しておきます。
Mac で Homebrew を導入している場合は、以下の通りです。

```shell-session
brew install zsh
sudo vi /etc/shells
```

```diff
+ /usr/local/bin/zsh
```

```shell-session
chsh -s /usr/local/bin/zsh
```

また、古い .zshrc などがある場合は退避しておきます。

```shell-session
# Antigen を導入
git clone https://github.com/zsh-users/antigen.git /path/to/antigen
source /path/to/antigen/antigen.zsh

# Antigen から Prezto を導入
antigen bundle sorin-ionescu/prezto

# Prezto から参照させるため、シンボリックリンクを設置
ln -s ~/.antigen/repos/.zprezto ~/.zprezto

# Prezto の Zsh 設定ファイルへのシンボリックリンクを設置
setopt EXTENDED_GLOB
for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do
  ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
done

# Antigen を読み込むように設定
vi ~/.zshrc
```

```diff
# Customize to your needs...
+ source /path/to/antigen/antigen.zsh
+
+ antigen bundle sorin-ionescu/prezto
```

再度コンソールを立ち上げると、 Prezto の設定が有効になっているはずです。

# テーマ・プラグイン

`prompt -p` で、各種テーマをレビューできます。
お好みですが、 paradox を設定してみます。

paradox テーマを利用するには、 powerline 対応のフォント導入が必要です。
今回は Ricty を利用しました。

```shell-session
brew tap sanemat/font
brew reinstall --powerline --vim-powerline ricty
# 導入時は 3.2.4 でした
cp -f /usr/local/Cellar/ricty/3.2.4/share/fonts/Ricty*.ttf ~/Library/Fonts/
fc-cache -vf
```

テーマ・プラグインの設定は `.zpreztorc` で行います。

```shell-session
vi ~/.zpreztorc
```

```diff
-  zstyle ':prezto:module:prompt' theme 'sorin'
+  zstyle ':prezto:module:prompt' theme 'paradox'
```

また、 Prezto の git プラグインを入れておくと、
Git リポジトリの状態を表示してくれます。

```shell-session
vi ~/.zpreztorc
```

```diff
# Set the Prezto modules to load (browse modules).
# The order matters.
zstyle ':prezto:load' pmodule \
  'environment' \
  'terminal' \
  'editor' \
  'history' \
  'directory' \
  'spectrum' \
  'utility' \
  'completion' \
+ 'git' \
  'prompt'
```

他の Prezto のモジュールに関しては、リポジトリの[modules](https://github.com/sorin-ionescu/prezto/tree/master/modules)を見て確認します。
自分の場合は、以下のようにモジュールを追加しました。

```diff
zstyle ':prezto:load' pmodule \
  'environment' \
  'terminal' \
  'editor' \
  'history' \
  'directory' \
  'spectrum' \
  'utility' \
  'completion' \
  'git' \
+ 'homebrew' \
+ 'osx' \
+ 'rails' \
+ 'syntax-highlighting' \
+ 'history-substring-search' \
  'prompt'
```

# 参考

* [Ricty for Powerline を homebrew で簡単インストール](http://qiita.com/znz/items/e94b7377f201e7b1683e)
* [oh-my-zshを使っていて重いと感じている方、preztoはいかが？](http://qiita.com/kei_q/items/814ec412b3c28f580927)
ライブラリを探す際に使うURL集


何か便利なライブラリ・ツール・技術がないかを探す際に使用するURLを集めました。

# Common
* [Github](https://github.com/explore)
  * 使用する言語で検索
  * 人気、勢いのあるOSSをチェック
* [TechnologyRadar](http://www.thoughtworks.com/radar)
  * 注目されている技術に関して

# Tool
* [Braumeister](http://braumeister.org/)
  * Homebrewで導入できるパッケージに関して
* [HomebrewCask](http://caskroom.io/search)
  * HomebrewCaskで導入できるアプリに関して
* [DiscoverVagrantBoxes](https://atlas.hashicorp.com/boxes/search)
  * Vagrantで利用できるBoxに関して
* [AnsibleGalaxy](https://galaxy.ansible.com/explore#/)
  * AnsibleGalaxyで利用できるプレイブックに関して
* [VimAwesome](http://vimawesome.com/)
  * Vimのプラグインに関して
* [AlternativeTo](http://alternativeto.net/)
  * アプリやツールの代替・競合を調査
* [WikiMatrix](http://www.wikimatrix.org/)
  * Wikiエンジンを検索
* [Queues](http://queues.io/)
  * メッセージキューライブラリに関して

# iOS
* [CocoaPods](http://cocoapods.org/)
  * CocoaPodsで導入できるライブラリに関して
* [CocoaPodsSearch](http://cocoapods.wantedly.com/)
  * 同上
* [CocoaControls](https://www.cocoacontrols.com/)
  * UIライブラリの調査

# Android
* [AndroidArsenal](https://android-arsenal.com/)
  * ライブラリ検索
* [AppBrain](http://www.appbrain.com/stats/libraries/dev)
  * ライブラリ一覧、そのライブラリを使用しているアプリの一覧
* [DevAppsDirect](https://play.google.com/store/apps/details?id=com.inappsquared.devappsdirect)
  * ライブラリのデモアプリ

# Web
* [npm](https://www.npmjs.com/)
  * JavaScriptのパッケージに関して

# Ruby
* [RubyGems](https://rubygems.org/)
  * Gemの検索
* [TheRubyToolbox](https://www.ruby-toolbox.com/)
  * 用途、利用頻度でライブラリ調査
* [BestGems](http://bestgems.org/)
  * 利用頻度でGem調査

# PHP
* [Packagist](https://packagist.org/)
  * Composerで導入できるパッケージに関して
* [PHP Toolbox](http://www.php-toolbox.com/)
  * 用途別にライブラリ調査

# 参考

* [コードを書かずに実装しよう、ruby-toolbox.com](http://sideci.hatenablog.com/entry/2014/03/25/080000)
* [iOSのライブラリ探しはCocoaControlsとCocoaPodsSearchが便利](http://umememo.com/archives/85)
* [Androidのライブラリを探す](http://qiita.com/STAR_ZERO/items/619676bb1af935bf0bc0)
* [Androidアプリでよく使われているライブラリを調べる方法
](http://qiita.com/fslasht/items/b375ad62efd64c11d032)
「Lisp型」NoSQL DBMS Briqsのソースコードを公開しました

##URL

以下のURLよりご覧下さい。
https://github.com/Aurola/briqs

##注意点など

- makefileとソースコードのみです。コメントもほぼゼロです。
- 64bitじゃないと動かないかもしれないです（未確認）。

##ドキュメントはこちら

概要・作成の背景などをはじめ、チュートリアルなどがあります。
http://qiita.com/Aurola_Japan/items/596ecc17fc4c8f9f7c3e
Windowsでプログラミング学習を行う

# 概要

Mac を購入するか、 Linux を導入すれば良い…というのはごもっともですが、
止むに止まれぬ事情により[^1]、 Windows[^2] でプログラミング学習を進めたい、という際の道しるべです。

# コード実行環境

開発環境の整備に関して、
Mac や Linux と比べるとその労力がネックとなります。
そこで、オンライン上でコード実行できるサービス「[Coding Ground](http://www.tutorialspoint.com/codingground.htm)」を利用します。

Coding Ground では様々な言語を実行できます。
また、シェルも提供されているため、
gem などライブラリを導入して動かすといったことも可能です。

作成したプロジェクトは GitHub や Dropbox などに保存することができますので、
Windows 環境で勉強だけでなく、作業もこなせる形になります。

GitHub アカウントを作り、気になる言語やフレームワークのコードを検索して読み、
気になった部分を Coding Ground に移していろいろ実験し、
得られた知見を Gists に溜め込んでいく、という流れがお勧めです。
Web 上で完結していますので、Windows でも不自由なく学習できます。

# 仮想環境構築

とはいえ、サーバー自体を作って実験してみたいことがあるかと思います。
以下のソフトウェア導入により、仮想環境構築を行います。

* VirturalBox
* Vagrant

また、標準のコンソール・シェルは操作し辛いところがありますので、
先に MSYS2 を導入して改善を図ります。

# MSYS2

http://msys2.github.io/

64bit版の場合は「msys2-x86_64」の方をダウンロードしてください。
インストーラの流れにしたがって導入します。

インストールしたディレクトリにある、以下のバッチから起動できます。

* msys2_shell.bat
* mingw32_shell.bat
* mingw64_shell.bat

基本的には `msys2_shell.bat` を利用する形ですが、
導入するパッケージによっては `mingw??_shell.bat` 経由でないと利用できないようです。
環境に合ったものを使うようにした方が良さそうですね。

スタートメニューに MSYS2 のフォルダが生成され、
そこにショートカットが用意されていますので、
タスクバーに登録したい場合はそちらを利用できます。

## mintty

MSYS2 であらかじめ導入されているコンソールです。
フォントや透過度など、設定の調整を行っておきます。

mintty 上で`右クリック -> Options`より設定ウィンドウが開きます。
設定はお好みで大丈夫ですが、文字コードは `ja_JP.UTF-8` にしておきます。

個人的には、「[RictyDiminished](https://github.com/yascentur/RictyDiminished)」のフォントを導入して使っています。
mintty 上のフォント一覧に表示されない場合は、
「コントロールパネル -> フォント -> フォント設定」より
「入力言語の設定に基づいて一部のフォントを非表示にする」のチェックを外します。

## pacman

MSYS2 であらかじめ導入されているパッケージマネージャ[^3]です。
今回は Vagrant を動かすことを目的にしているためそれほど操作しませんが、
Windows 上で色々やりたくなった際はお世話になりそうです。
パッケージの更新をかけた後、コンソールを再起動します。

```shell-session
# ヘルプの表示
pacman -h
# パッケージ一覧
pacman -Sl
# パッケージ更新
pacman -Suy
```

### winpty

mintty のコンソール入出力に事情があり、うまく動作しないコマンドがあります。
winpty を導入することで、この問題に対処することができます。

```shell-session
pacman -S winpty-git
```

### openssh

Vagrantで作成した仮想環境に入るために使います。

```shell-session
pacman -S openssh
```

手元の環境では、一部依存ライブラリの導入時に接続エラーが発生しましたが、
curlを再インストールすると動作しました。

```shell-session
pacman -S curl
```

### vim

Vagrantfile の編集に使います。
Vim でなくても良いですが、何かしらテキストエディタを入れておくと便利です。

```shell-session
pacman -S vim
```

# VirturalBox

Vagrant で利用します。
インストーラの流れにしたがって導入します。

https://www.virtualbox.org/wiki/Downloads

# Vagrant

Vagrant も、インストーラの流れにしたがって導入します。

https://www.vagrantup.com/downloads.html

## 起動

'chef/centos-6.5' のboxを利用し、
プライベートIPを '192.168.33.10' に設定して起動します。

```shell-session
cd /path/to/workspace
vagrant init chef/centos-6.5
vim Vagrantfile
--
config.vm.network "private_network", ip: "192.168.33.10"
--
vagrant up
vagrant ssh
```

以降は仮想環境上で、
ライブラリの導入やプログラムの動作確認など行っていく形になります。

# 参考

* [様々なプログラミング言語を試しに使ってみたいときにCoding Groundが便利](http://qiita.com/mmizutani/items/7b9b72c95409baf7fdad)
* [WindowsにMSYS2を導入して、Node.js を動作させるまでの手順](http://qiita.com/magichan/items/81fc400a9bf2c94c135b)
* [MSYS2でWindowsにzsh環境を導入する](http://qiita.com/magichan/items/7702d7865deaaca2ad44)
* [MinGW の mintty で対話モード、ついでに vim 設定](http://dogwood.skr.jp/blog/2013/11/406/)

[^1]: 自宅のゲーム用メインマシンで勉強したいとか…。
[^2]: 今回はWindows7 64bit版を使用しています。
[^3]: Arch Linux の pacman から来たものです。「packman」ではありません…。