OmniAICreator/Qiita-1.07M huggingface dataset:
Swift で Tuple より Array を生成する方法

Tuple から `Array` を使いたい場面に遭遇しました。ざっくり言うと以下のようなイメージです。

```.swift
let tuple = (1, 2, 3, 4)
let array = // 変換
print("\(array)") // [1, 2, 3, 4]
```

ググってみると熊谷さんのページ *1 にヒットしましたが、Swift の互換性の問題かビルドエラーになってしまいます。このまま頑張ってみる手もあるかもしれませんが、tuple を `let` でなく `var` で用意しないといけないところや、`count` をハードコードしなくてはいけないところが少し残念に思ったので、他の方法を考えてみる事にしました。

```.swift
var tuple = (1, 2, 3, 4) // 'var'
let buffer = UnsafeBufferPointer(start: &tuple, count: 4)
let array = Array<Int>(buffer) // error
```

試行錯誤の末に、以下のような関数にたどり着きました。

```arrayFromTuple.swift
func arrayFromTuple<T, U>(tuple: T) -> [U] {
	return Mirror(reflecting: tuple).children.map { $0.value as! U }
}
```
簡単に説明すると tuple を `Mirror` に食わせてあげると、各タプルの要素を拾うことができるので、これを `map` で配列に作り直してあげます。 `as! U` を使っているので、想定外の型の値が紛れ込むと落ちますので、ご注意ください。

これを以下のように使えば…と言いたいところですが、これではエラーになってしまいます。 `U` の型が決定していないからです。

```.swift
let tuple = (1, 2, 3, 4)
let array = arrayFromTuple(tuple) // error
```
そこで 以下のいずれかの書き方をすれば、`U` の型が決定するのでビルド可能となります。タプルの型さえ揃っていれば、いくつ連続していても構いません。

```.swift
let tuple = (1, 2, 3, 4)
let array1 = arrayFromTuple(tuple) as [Int]	// [1, 2, 3, 4]
let array2: [Int] = arrayFromTuple(tuple)	// [1, 2, 3, 4]
```
一応、将来の Swift の互換性の問題があるかもしれないので、この記事の執筆の時点の Swift のバージョンを記しておきます。

```
$ swift --version
Apple Swift version 2.1.1 (swiftlang-700.1.101.15 clang-700.1.81)
Target: x86_64-apple-darwin15.3.0
```

----
*1 Swift でタプルを配列に変換する
https://ez-net.jp/article/D9/m3Nv4a1J/tJo7H-D4ydQ2/
Ansible hostname

#hostname
ホスト名を管理する。
バージョン1.4で追加。

##概要
システムのホスト名をセットする。
現在、Debian、 Ubuntu、 Fedora、 RedHat、 openSUSE、 Linaro、 ScientificLinux、 Arch、 CentOS、 AMIのOSで使用可能。「systemd」をinitのシステムで使うディストリビューションで使用可能。
このモジュールでは「/etc/hosts」を変更しないという点で注意が必要。
hostsを書き換える場合は、「template」や「replace」といったモジュールを使う必要がある。

##前提条件
hostnameが必要。

##オプション

|引数|必須|デフォルト|値|備考|
|:---------|:---------|:---------|:---------|:---------|
|name|yes|||ホスト名|

##使用例

```yaml:
- hostname: name=web01
```

###Ansibleコアモジュール
このモジュールはコア・アンシブルチームによりメンテナンスされます。
VirtualBox のインストーラが安全にダウンロードできたか検証する

注意: この記事の内容は執筆時 (2016-02-11) のものに基づいており、変更されている恐れもあります。

# 前提

VirtualBox は https://www.virtualbox.org/wiki/Downloads からダウンロードできます。このページは https で接続できるので、インストーラの .exe ファイルや.dmg ファイルも https でダウンロードされるかと思いきや、それらは download.virtualbox.org から http でダウンロードされます。

しかも、この download.virtualbox.org は Akamai の CDN を使っているようで、URL を編集して https で繋ぎ直しても正しく証明書が構成されていないせいでエラーになってしまいます。

これでは一見 VirtualBox のインストーラを安全にダウンロードする方法はないように思えてしまいますが、ファイルの SHA256 ハッシュ値を検証することで、ファイルが正しいものかどうか簡単 [^1] に検証できることに気が付きました。

[^1]: 簡単、というのはやるのが簡単というわけでなく、簡易な、というニュアンスです

# 実践

まずは普通にインストーラをダウンロードします。

次に、ダウンロードしたファイルの SHA256 ハッシュ値を検証します。正しい SHA256 ハッシュ値は、先ほどのダウンロードページからリンクされています。

インストーライメージの SHA256 ハッシュ値は、先ほどのダウンロードページのこの位置にあります:

![2016-02-11 02_45_22-Downloads – Oracle VM VirtualBox.png](https://qiita-image-store.s3.amazonaws.com/0/32911/aee2f21e-c629-c8e6-7d49-110b58c0509d.png)

この SHA256 ハッシュの一覧ページは https で配信されているので、インストーラファイルが改ざんされていないかチェックできるというわけです。

## ダウンロードしたファイルの SHA256 ハッシュ値を取得する

### Windows

Windows 8.1 以降であれば、PowerShell から簡単にファイルの SHA256 ハッシュ値を取得できます。それ以前のバージョンの Windows を使っているならば他の手段を適当に見繕ってください。

```ps1
PS C:\Users\hoge> Get-FileHash -Path C:\path\to\VirtualBox-5.0.14-105127-Win.exe

Algorithm       Hash                                                                   Path
---------       ----                                                                   ----
SHA256          63B4AC2C308300406A9FA04470B69606C430AC9F62690A9243E36D22F991296E       C:\path\to\Vir...
```

### OS X

OS X の場合は `shasum(1)` が標準でインストールされています。coreutils をインストールしているなら `sha256sum(1)` でも同様の結果が得られます。

```shell-session
user@host$ shasum -a 256 /path/to/VirtualBox-5.0.14-105127-OSX.dmg
4de41068712eb819749b5376c90dca47f9a1d6eecf4c516d83269ac12add2aa4  VirtualBox-5.0.14-105127-OSX.dmg

user@host$ sha256sum /path/to/VirtualBox-5.0.14-105127-OSX.dmg
4de41068712eb819749b5376c90dca47f9a1d6eecf4c516d83269ac12add2aa4  VirtualBox-5.0.14-105127-OSX.dmg
```

ちなみに、OS X 用の VirtualBox のインストーラファイル (`/VirtualBox.pkg`) は Code Signing が行われているので、説明したような手順を踏まずともそれなりに安全性は担保されているはずです。

<img width="620" alt="scr 2016-02-11 at 05.07.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/32911/2836ef5b-e99f-aa5b-3b71-cef107e49837.png">

この画面は、VirtualBox.pkg から起動したインストーラのタイトルバーの一番右にある鍵アイコンをクリックすることで表示できます。また、以下のようにコマンドラインから検証することが出来ます:

```shell-session
user@host$ pkgutil --check-signature /Volumes/VirtualBox/VirtualBox.pkg 
Package "VirtualBox.pkg":
   Status: signed by a certificate trusted by Mac OS X
   Certificate Chain:
    1. Developer ID Installer: Oracle America, Inc.
       SHA1 fingerprint: ED 99 8E 48 56 BE ED D8 ED E0 60 C2 07 4F 12 E4 E9 E0 B0 FE
       -----------------------------------------------------------------------------
    2. Developer ID Certification Authority
       SHA1 fingerprint: 3B 16 6C 3B 7D C4 B7 51 C9 FE 2A FA B9 13 56 41 E3 88 E1 86
       -----------------------------------------------------------------------------
    3. Apple Root CA
       SHA1 fingerprint: 61 1E 5B 66 2C 59 3A 08 FF 58 D1 4A E2 24 52 D1 98 DF 6C 60

```

余談ですが、コマンドプロンプト、PowerShell や Terminal.app では、エクスプローラーや Finder などからファイルをドラッグ & ドロップするだけでカーソル位置にそのファイルのフルパスが入力されます。
numpy & scipy 備忘録

# numpy & scipy 備忘録

## 概要

- メモ程度ですが，簡単にまとめていきます
- 随時更新していきます(たぶん)

## numpy 備忘録
#### 自己共分散行列

```
>>> x = np.array([[0, 2], [1, 1], [2, 0]]).T
>>> y = np.cov(x)
>>> y
array([[ 1., -1.],
       [-1.,  1.]])
>>> y = np.cov(x,rowvar = 0)
>>> y
array([[ 2.,  0., -2.],
       [ 0.,  0.,  0.],
       [-2.,  0.,  2.]])
```

#### 平均
```
>>> a = np.array([[1, 2], [3, 4]])
>>> np.mean(a)
2.5
>>> np.mean(a, axis=0)
array([ 2.,  3.])
>>> np.mean(a, axis=1)
array([ 1.5,  3.5])
```

#### 行列の固有値固有ベクトル
```
eigVals,eigVecs = np.linalg.eig(np.mat(Mat))
```

#### 行列の連結
```
>>> a = np.array([[1, 2], [3, 4]])
>>> b = np.array([[5, 6]])
>>> np.concatenate((a, b), axis=0)
array([[1, 2],
       [3, 4],
       [5, 6]])
>>> np.concatenate((a, b.T), axis=1)
array([[1, 2, 5],
       [3, 4, 6]])
```
#### 行列の次元変換
```
>>> x = np.arange(4).reshape((2,2))
>>> x
array([[0, 1],
       [2, 3]])
```
```
>>> np.transpose(x)
array([[0, 2],
       [1, 3]])
```
```
>>> x = np.ones((1, 2, 3))
>>> np.transpose(x, (1, 0, 2)).shape
(2, 1, 3)
```

#### サイズ1の次元の削除
```
>>> x = np.array([[[0], [1], [2]]])
>>> x.shape
(1, 3, 1)
>>> np.squeeze(x).shape
(3,)
>>> np.squeeze(x, axis=(2,)).shape
(1, 3)
```

#### クロネッカー積
```
>>> np.kron([1,10,100], [5,6,7])
array([  5,   6,   7,  50,  60,  70, 500, 600, 700])
>>> np.kron([5,6,7], [1,10,100])
array([  5,  50, 500,   6,  60, 600,   7,  70, 700])
```

#### 単位行列作成(identityは正方行列，eyeはオプションで色々指定できる)
```
>>> np.identity(3)
array([[ 1.,  0.,  0.],
       [ 0.,  1.,  0.],
       [ 0.,  0.,  1.]])
```
```
>>> np.eye(2, dtype=int)
array([[1, 0],
       [0, 1]])
>>> np.eye(3, k=1)
array([[ 0.,  1.,  0.],
       [ 0.,  0.,  1.],
       [ 0.,  0.,  0.]])
>>> np.eye(3, 2)
array([[ 1.,  0.],
       [ 0.,  1.],
       [ 0.,  0.]])
```

#### 重複するものを除く
##### インデックスを返す
```
>>> a = np.array(['a', 'b', 'b', 'c', 'a'])
>>> u, indices = np.unique(a, return_index=True)
>>> u
array(['a', 'b', 'c'],
       dtype='|S1')
>>> indices
array([0, 1, 3])
>>> a[indices]
array(['a', 'b', 'c'],
       dtype='|S1')
```
##### 再構成用にインデックスを返す
```
>>> a = np.array([1, 2, 6, 4, 2, 3, 2])
>>> u, indices = np.unique(a, return_inverse=True)
>>> u
array([1, 2, 3, 4, 6])
>>> indices
array([0, 1, 4, 3, 1, 2, 1])
>>> u[indices]
array([1, 2, 6, 4, 2, 3, 2])
```

##### arrayをある範囲に指定する
```
>>> a = np.arrange(1,2,3,4,5)
>>> np.clip(a,a_min=2,a_max=4)
array([2,2,3,4,4])
```

## scipy 備忘録
 
#### 特異値分解
full_matrices=True:U,V正方行列，False:s正方行列

```
>>> U,s,V = scipy.linalg.svd(A, full_matrices=False, check_finite=False)
```
Pythonでプログレスバー表示するやつ


#データの前処理とか解析回したりとかすごい時間かかる上にいつ終わるかわかんなくてつらい
つらい
#プログレスバー表示したい
[===>　　]50%
こんなの欲しい。
#作った
https://gist.github.com/wassen/3f559de866415472b9b2
作りました。解析そっちのけで。
既に[こんなの](https://github.com/WoLpH/python-progressbar)があることに作ってから気づいたけど、もう遅い。

#使い方
##その1
回したいリストなりなんなりを突っ込んでインスタンスを作ってfor文内でdisplay_progressbar呼び出す。

```lang:sample1.py
from ProgressBar import ProgressBar as pb
import time

list1 = "いてらぶる"
list2 = range(3)
list3 = [0,1]

pb1 = pb(list1,list2,list3)
for _ in list1:
	for _ in list2:
		for _ in list3:
			time.sleep(0.1)
			pb1.display_progressbar()
```
##その2
同様にインスタンスを作って、メソッドからそのリストを返してもらう。

```lang:sample2.py
#同上

pb2 = pb(list1, list2, list3)
for _ in pb2.generator(0):
	for _ in pb2.generator(1):
		for _ in pb2.generator(2):
			time.sleep(0.1)
```
##その3
インスタンスを作成せずにリストをラップするだけ。一番お手軽だけど、大雑把な進捗しか見れないのが難点。

```lang:sample3.py
#同上

for _ in pb.single_generator(list1):
	for _ in list2:
		for _ in list3:
			time.sleep(0.1)
```

#メモとか雑感とか
・インスタンス初期化はlistじゃなくてリストの長さでもOK、しかしその2の使い方するとバグる。ので使いみちは不明
・display_progressbarを呼び出し時に明示的にインデックス指定ができる。display_progressbar(i,j,k)みたいな感じで。使いみちは不明
・リスト内にリストがある・・・とかのときに、for文の途中でリストを追加できるようにしたい
・addメソッドに突っ込んだら途中からlistを追加できるが、for文の途中でaddするとバグる
・経過時間はインスタンス初期化をした時点で測定開始されてるので注意
・色は適当に目に優しそうな色をつけときました
・不具合とか改善案とかあったら是非に

#参考
ありがとうございます。
http://www.yunabe.jp/docs/terminal_progress_bar.html
bashの代わりにFish shellを使ってみる on CentOS6.x

###Fish shellのインストール手順

- CentOS6.xの場合

rootで下記コマンドを実行する。

```bash:
cd /etc/yum.repos.d/
wget http://download.opensuse.org/repositories/shells:fish:release:2/CentOS_6/shells:fish:release:2.repo
yum install fish
```

他のバージョンまたはOSの場合は【[Fish Shellのサイト](http://fishshell.com/)】から

インストール終了後、

```bash:
fish
```

でfish shellスタート。

###所感

色鮮やかなのが楽しそうな雰囲気かもしだしてる。

![image](https://qiita-image-store.s3.amazonaws.com/0/98085/442e7fea-45f7-6455-ee72-81d24ef4670f.png)

一度入力したものは覚えてくれて、途中まで入力するとサジェストしてくれる。
暗くてちょっと分かり辛いけど、先ほど

```bash:
echo konbanwa
```

したので、「e」を売った時点で残りの文字をサジェスト。

![image](https://qiita-image-store.s3.amazonaws.com/0/98085/2b299ddd-74db-d074-9852-dc6e99a752e1.png)

この段階で、右矢印を押すと

![image](https://qiita-image-store.s3.amazonaws.com/0/98085/2a28926a-8d13-8798-131f-1a68b9335a87.png)

コンプリートしてくれる親切さん。

まだまだbashとの違いはあるけどさわりだけ。
Groovyで標準入力を繰り返し受け取る

# 目標

- 標準入力から文字を受け取りたい
- 正しい形式の入力が来るまでリトライしたい

# 結論
標準入力から読み取った後に

- eachブロックで受けるのはダメ(eachから抜けられなくなる)。
- anyブロックにて受ければOK。

# コード
## 環境
Java 8
Groovy 2.4.5

## 判定用メソッド

```groovy:Utility.groovy
@Singleton
class Utility {
	/**
	 * ユーザに続行するかを問う
	 * 標準入力:Y  続行する
	 *         :n  続行しない(exitする)
	 *         :他 再入力
	 * @return true  続行可能
	 */
	def askContinue() {
		print "continue? [Y/n]"
		def stdin = new BufferedReader(new InputStreamReader(System.in))

		stdin.lines().any{ line -> 
			if(line.equals("Y")) {
				return true
			} else if(line.equals("n")) {
				System.exit(1)
			} else {
				println "incorrect word."
				print "continue? [Y/n]"
			}
		}
	}
}
```

## 呼び出し用スクリプト
 
```groovy:test.groovy
Utility.instance.askContinue()
```


## 実行例

```bash
$ groovy test.groovy 
continue? [Y/n]a
incorrect word.
continue? [Y/n]b
incorrect word.
continue? [Y/n]c
incorrect word.
continue? [Y/n]d
incorrect word.
continue? [Y/n]Y
$ echo $?
0

$ groovy test.groovy 
continue? [Y/n]n
$ echo $?
1
```

## 参考
http://stackoverflow.com/questions/3049790/break-from-groovy-each-closure
一回のUpdateで複数行更新

UPDATE TABLE1 A
SET COL1=B.COL1, COL2=B.COL2
FROM (
SELECT 1 as PK, 2 as COL1, 3 as COL2
UNION
SELECT 2 as PK, 12 as COL1, 31 as COL2
UNION
SELECT 3 as PK, 22 as COL1, 32 as COL2
) B
WHERE A.PK = B.PK;

たぶんダメなSQLなんだと思う。 :weary:
mbed HRM1017 互換機を安価に作成する方法

#概要
[mbed HRM1017](https://www.switch-science.com/catalog/1755/) 互換機を [HRM1017 BLEモジュールピッチ変換基板](https://www.switch-science.com/catalog/1814/) と [トラ技ARMライタ](http://www.marutsu.co.jp/pc/i/238834/) を使用し作成する方法です。

![P_20160210_222008.jpg](https://qiita-image-store.s3.amazonaws.com/0/110181/3daa4858-f0b9-09f8-fed0-21d481231cb2.jpeg)

下記の表の様に、1台のみですと割高ですが、ARMライタは使いまわしが可能なため、複数台では合計金額が逆転します。
※ 2016年2月10日時点での税込み価格です。

|台数|mbed HRM1017|ピッチ変換基板 + ARMライタ|ピッチ変換基板|ARMライタ|差額|
|:----|:-------|:---------|:---------|:----------|:--|
|1    |**5,400円**|**5,919円**|3,240円|2,679円|-510円|
|2    |**10,800円**|**9,159円**|6,480円|2,679円|+1,641円|
|3    |**16,200円**|**12,399円**|9,720円|2,679円|+3,801円|

#背景
mbed HR1017 は Nordic Semiconductor製の nRF51822 に対して、NXP製の LPC11u35 を介し（mbed interfaceとして使用し）、HEXファイルを書き込んでいます。
対して HRM1017 BLEモジュールピッチ変換基板は nRF51822 のみ実装されています。この環境に LPC11u35 を加えれば、 mbed HRM1017 と全く同じものが作れると考えました。
今回は トラ技ARMライタ が LPC11u35 を使用し、また、ファームウェアの書き込みも容易な環境であるため、これを利用しました。
![スライド1.PNG](https://qiita-image-store.s3.amazonaws.com/0/110181/5c1d4155-8bd2-fabd-1a03-e2c03bc4d3cb.png)
なお、mbed HRM1017 と HRM1017 BLEモジュールピッチ変換基板 はピン互換です。

#手順
##トラ技ARMライタ側の準備（初回のみ必要）
![スライド2.PNG](https://qiita-image-store.s3.amazonaws.com/0/110181/8aece474-fc66-a1e7-6365-dfc69dbcbd02.png)
1. [こちら](https://developer.mbed.org/teams/Switch-Science/wiki/Firmware-HRM1017)のwebサイト下部より、Interface Firmware （.binファイル）をダウンロードします。
2. トラ技ARMライタをPCに接続します。
3. トラ技ARMライタ上の ISP ボタンを押し続けながら RESET ボタンを押します。 RESET ボタンを離した後、 ISP ボタンを離します。
4. 外付けドライブ CRP DISABLED が認識されるので、その中にある firmware.bin を削除します。
5. 外付けドライブ中に先ほどダウンロードした Interface Firmware をドラッグ＆ドロップします。
6. 書き込み完了後に、トラ技ARMライタ RESET ボタンを押下します。
7. （正常書き込みの確認）外付けドライブ MBED が認識されます。ドライブ内部の MBED.HTM を開き [mbed HRM1017](https://developer.mbed.org/platforms/mbed-HRM1017/) のページが表示されれば、書き込みは正常に行われています。

##接続
![スライド3.PNG](https://qiita-image-store.s3.amazonaws.com/0/110181/e077d761-0f60-c844-3c43-066088ee5e05.png)
1. トラ技ARMライタ をPCに接続します。外付けドライブ MBED が認識されます。 
2. HRM1017 BLEモジュールピッチ変換基板 をPCに接続します。
3. トラ技ARMライタ と HRM1017 BLEモジュールピッチ変換基板 を10ピンコネクタで接続します。
　（ページトップの写真を参考に、1ピンの向きを間違えないようご注意ください）

##書き込み
mbed HRM1017 用にコンパイル＆ダウンロードした HEX ファイル（[例：体温計](https://developer.mbed.org/teams/Switch-Science/code/BLE_HTM_HRM1017/?platform=mbed-HRM1017)）を、（通常の mbed HRM1017 に対して行うように）外付けドライブ MBED にドラッグ＆ドロップしてください。書き込みが実行されます。
HRM1017 BLEモジュールピッチ変換基板 は、書き込み完了後自動的にリセットされます。

##実行
![スライド4.PNG](https://qiita-image-store.s3.amazonaws.com/0/110181/52919db3-e671-13f9-79e0-bfbeeaca2a69.png)
正常に書き込みが行われれば、HRM1017 BLEモジュールピッチ変換基板に電源供給するのみで、書き込んだプログラムの実行が開始されます。

#参考
##回路図
mbed HRM1017 の [回路図](https://developer.mbed.org/media/uploads/ytsuboi/mbed-hrm1017.pdf)
HRM1017 BLEモジュールピッチ変換 の [回路図](http://doc.switch-science.com/schematic/HRM1017_breakout/HRM1017-breakout.pdf)
※ SWDがInterfaceと接続されていれば、ほぼ同じ回路。
##サイト
[Firmware HRM1017](https://developer.mbed.org/teams/Switch-Science/wiki/Firmware-HRM1017)
[トラ技ARMライタを mbed interface にする（LPC1114FN28編）](https://developer.mbed.org/users/MACRUM/notebook/toragi_11u35_if/)
cloud9で初めてMySQLに触れた人がハマる日本語設定

#最初に
別に今回のネタはclound9に限った話ではない。またMySQL側の設定確認が面倒なので、事前に[phpMyAdminをインストール](/hisashi629/items/1567ee18a825595cd890)しておくものとする。

#一般的な日本語設定手順

1. /etc/mysql/my.cnfを開き、下記セクションに設定を追記する。
    1. [mysqld]セクション末尾に`character-set-server=utf8`を追加する
    2. [client]セクションに`default-character-set=utf8`を追加する

2. mysqlを再起動する。`mysql-ctl restart`
3. phpMyAdminを開き、`show variables like "chara%";`を実行して下記の設定になっていることを確認する。

```
+-------------------------+--------------------------+
|Variable_name            |Value                     |
+-------------------------+--------------------------+
|character_set_client     |utf8                      |
|character_set_connection |utf8                      |
|character_set_database   |utf8                      |
|character_set_filesystem |binary                    |
|character_set_results    |utf8                      |
|character_set_server     |utf8                      |
|character_set_system     |utf8                      |
|character_sets_dir       |/usr/share/mysql/charsets/|
+-------------------------+--------------------------+
```

#ハマりポイント
- my.cnf編集時にsudoせずに開き読み取り専用になってしまって保存ができない。
- utf8をutf-8と書いてmy.cnfに記述してしまい、mysqlのrestartに失敗する。
- すでにテーブルを作成した状態で上記設定変更を行う。結果既存テーブルは文字化けのままで途方にくれる。
- 既存のテーブルの文字化けを直そうとするもDBとテーブルのcharsetは変えたが、varchar型カラムのcharsetを変え忘れる。
Windows PCの画面ロックを防ぐ

```ps1
## 概要 ##
# キーボード操作を定期的に自動で行うことにより、
# Windows PCが画面ロックされることを防ぐ
# メモ帳が起動し、60秒ごとに、指定したメッセージを、キーボードを通じて書き込む
# Powershell ver1.0 以上で動作確認済み


## 前提条件 ##
# "## ※記載願う ##"の箇所を記入して実行
# 全選択してコピーし、Powershellのプロンプトに右クリックで貼り付けても実行可能


## 注意 ##
# アクティブなウインドウに対してキーボード打鍵を自動実行するため、
# 端末操作をする際には、まず、スクリプトの実行を中断させること




## ※記載願う ##
# ロック回避時間をセットしてください(分)
$jikan = 300

# メモ帳への書き込みメッセージを端的に
$message = "Ser, Do Not Lock please.."




#### 関数定義 ####

function WinLock {
param($jikan,$message)

# カウント変数初期化
$i=0

# WSHをオブジェクト化
$WSH = New-Object -Comobject wscript.shell

# メモ帳の起動
$WSH.Run("notepad")



  # 0から1ずつカウントアップして300回までループ
  for ($i=0; $i -lt ${jikan}; $i++) {

  # 1分待機する
  sleep 60

  # 時刻取得
  $date = Get-Date -Format "yyyy-MMdd-HHmm_ss"

  # キーボードを通じて、メモ帳にメッセージを書き込み
  $WSH.sendkeys("rem# ${message} #`n")
  $WSH.sendkeys("rem# $date #`n")
  $WSH.sendkeys("`n")
  $WSH.sendkeys("`n")

  # `n は改行
  # rem と # は、誤ってPowershellやCmdをアクティブウインドウにしたとき用の誤打防止


  # ループ終了
  }


# 関数終了
}




#### 処理開始 ####

WinLock $jikan $message
カスタムディレクティブで&を使ってみよう

## はじめに

カスタムディレクティブのscopeプロパティにオブジェクトリテラルを指定した場合、そのオブジェクトリテラルのメンバとディレクティブの属性とを関連付けることができます。

関連付けるためには3つの記号(`=`, `@`, `&`)を使います。

今回はディレクティブの属性にコントローラのメソッドを指定して、オブジェクトリテラルのメンバとカスタムディレクティブの属性(コントローラのメソッド)を関連付けてみたいと思います。

まず、カスタムディレクティブの属性に引数なしのメソッドを指定してみます。
その後、カスタムディレクティブの属性に引数ありのメソッドを指定してみます。

## カスタムディレクティブの属性に引数なしのメソッドを指定

```index.html
<!DOCTYPE html>
<html lang="en" ng-app="myApp">

  <head>
    <meta charset="UTF-8" />
    <title></title>
    <script data-require="angular.js@1.4.5" data-semver="1.4.5" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.5/angular.min.js"></script>
    <script src="script.js"></script>
  </head>

  <body>
    <div ng-controller="myController as ctrl">
      <my-directive property="ctrl.myProperty" method="ctrl.myMethod()"></my-directive>
      {{ctrl.myProperty}}
  </div>
  </body>

</html>
```

```script.js
var app = angular.module('myApp', []);

app.controller('myController', function() {
  this.myProperty = "";
  this.myMethod = function() {
    console.log('hello');
  };
});

app.directive('myDirective', function() {
  return {
    template: '<input ng-model="myProperty" ng-change="myMethod()">',
    scope: {
      myProperty: '=property',
      myMethod: '&method'
    }
  };
});
```

## カスタムディレクティブの属性に引数ありのメソッドを指定

カスタムディレクティブの属性でメソッドを指定して、そのメソッドの引数にキーを渡す感じです。

```index.html
<!DOCTYPE html>
<html lang="en" ng-app="myApp">

  <head>
    <meta charset="UTF-8" />
    <title></title>
    <script data-require="angular.js@1.4.5" data-semver="1.4.5" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.5/angular.min.js"></script>
    <script src="script.js"></script>
  </head>

  <body>
    <div ng-controller="myController as ctrl">
      <my-directive property="ctrl.myProperty" method="ctrl.myMethod(arg)"></my-directive>
      {{ctrl.myProperty}}
  </div>
  </body>

</html>
```

templateプロパティでは、メソッドの引数にペア(キーと値の対)を渡す感じです。

```script.js
var app = angular.module('myApp', []);

app.controller('myController', function() {
  this.myProperty = "Hello";
  this.myMethod = function(arg) {
    console.log(arg);
  };
});

app.directive('myDirective', function() {
  return {
    template: '<input ng-model="myProperty" ng-change="myMethod({arg: myProperty})">',
    scope: {
      myProperty: '=property',
      myMethod: '&method'
    }
  };
});
```

## 動作確認

[plnkr](http://plnkr.co/edit/KA01e3MH5xq5sUOuIKRx?p=preview)に実行環境を用意しました。

inputタグの値を更新すると、開発者ツールのコンソールにログが出力されます。

一応、引数なしのバージョンと引数ありのバージョンを用意しました。

## 参照URL

[AngularJS - Isolate Scope "&" - Thinkster](https://thinkster.io/egghead/isolate-scope-am)
[AngularJS: Developer Guide: Directives](https://docs.angularjs.org/guide/directive)
Hexo ブログを Basic 認証つきで Heroku にデプロイ

Hexo は静的ブログとしてデプロイできてとても便利です。
ですが個人的な日記などを人様に公開したくない。だけどブログ記事をローカルに持つのは嫌。という人もいるかと思います。
Github にデプロイすると静的ファイルとしてデプロイできますが、認証機能などサーバー側の機能は使えません。そこで Heroku にデプロイし、動的サーバーとして起動することで Hexo ブログに HTTP の Basic 認証機能を追加することができます。
この記事では Heroku に Basic 認証つきの Hexo ブログをデプロイする方法を紹介します。


## Basic 認証を有効にする方法

必要な環境 : Node.js

#### Hexo のインストール

```bash
$ npm install hexo-cli -g
```
#### ブログ作成と起動確認

```bash
$ hexo init blog
$ cd blog
$ npm install
$ hexo server
```

ブラウザで http://localhost:4000/ にアクセスすると Hexo ブログが起動していることを確認できます。


#### Basic 認証機能の追加
basic-auth-connect という npm を使わせていただきます。

```bash
$ npm install basic-auth-connect --save
```

次に basic 認証の実装をします。

```bash
$ mkdir scripts
$ vi scripts/index.js
```

以下コードを貼り付けます。

```js:scripts/index.js
var basicAuth = require('basic-auth-connect');

hexo.extend.filter.register('server_middleware', function(app) {
  app.use(basicAuth(function(user, pass) {
    return 'hoge' == user && 'fuga' == pass;
  }));
});
```

hexo を起動しなおしてブラウザを更新すると Basic 認証が有効になります。
ユーザ名 : hoge
バスワード : fuga
を入力すると認証成功してブログが見えるようになります。

![installed-basic-auth.png](https://qiita-image-store.s3.amazonaws.com/0/26783/5be3887f-5f94-0a5e-4609-2b8edd82521f.png)


## Heroku に deploy する

必要な環境 : Git, Heroku Toolbet
あらかじめインストールしておいてください。
Heroku Toolbet は以下からインストールできます。
https://toolbelt.heroku.com/


#### Procfile の作成

Heroku 起動時に実行するコマンドを登録します。

```bash
$ cd blog    #=> 上記ブログをインストールしたディレクトリ
$ vi Procfile
```

以下を貼り付けます。

```text:Procfile
web: hexo server -p $PORT
```

### git commit します

```bash
$ git init
$ git add .
$ git commit -m "First commit"
```

#### ブログ用リボジトリを Heroku に作成します

今回は hoge-blog-20160210 という名前のリポジトリを作成します。

```bash
$ heroku login
Enter your Heroku credentials.
Email: ikesato@xxx.xxx
Password (typing will be hidden):
Logged in as ikesato@xxx.xxx
$ heroku apps:create hoge-blog-20160210
Creating hoge-blog-20160210... done, stack is cedar-14
https://hoge-blog-20160210.herokuapp.com/ | https://git.heroku.com/hoge-blog-20160210.git
$ heroku git:remote -a hoge-blog-20160210
set git remote heroku to https://git.heroku.com/hoge-blog-20160210.git
```

#### Heroku にデプロイ

```bash
$ git push -u heroku master
Counting objects: 109, done.
Delta compression using up to 3 threads.
Compressing objects: 100% (97/97), done.
Writing objects: 100% (109/109), 520.82 KiB | 0 bytes/s, done.
Total 109 (delta 1), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
remote: 
remote: -----> Node.js app detected
remote: 
...
remote: -----> Launching...
remote:        Released v3
remote:        https://hoge-blog-20160210.herokuapp.com/ deployed to Heroku
remote: 
remote: Verifying deploy.... done.
To https://git.heroku.com/hoge-blog-20160210.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from heroku.
```

ブラウザで https://hoge-blog-20160210.herokuapp.com/ を見ると Basic 認証のかかったブログが完成です。

![blog-top.jpg](https://qiita-image-store.s3.amazonaws.com/0/26783/dc268fba-0126-f7e7-dada-f749b3e4cfa2.jpeg)


### この記事を書いた時のバージョン

Node.js: 5.6.0
hexo-cli: 0.2.1
heroku-toolbelt: 3.42.33
シェルでファイルの先頭行のみを削除するには

## 実現したいこと

データファイルのクレンジング作業のため、データファイルの先頭行のみを削除したい

## 実現方法および解決方法

sed コマンドを利用する

## 実行コマンド

```
sed -e '1d' masahide.txt 
```

## 情報源

man sed

## 補足
Excelから保存したUnicodeテキストを読み込む

#CSVではなくUnicodeテキストを読み込みたい
ExcelでShift_JIS外の文字を扱っている場合、Excelからcsv書き出しした時点で文字が?に置換されて消えてしまいます。保存形式を「Unicodeテキスト」にすると、文字が消えずUnicodeのタブ区切りテキスト（tsv）で書き出されます。

これをPHPで読み込むのに、意外とハマったのでメモです。

#ソースコード

```php
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Excelから保存したUnicodeテキストのアップロード</title>
</head>

<body>
<p>Excelから保存したUnicodeテキストのアップロード</p>
<form action="" method="post" enctype="multipart/form-data">
	<input type="file" name="tsvfile">
	<button type="submit">送信</button>
</form>
<p>
<?php
$err_msg = '';

//データを格納する配列
$tsvdata = array();

if (is_uploaded_file($_FILES["tsvfile"]["tmp_name"])) {
	$file_tmp_name = $_FILES["tsvfile"]["tmp_name"];
	$file_name = $_FILES["tsvfile"]["name"];
	//文字コード指定
	setlocale(LC_ALL, 'ja_JP.UTF-8');
	//拡張子を判定
	if (pathinfo($file_name, PATHINFO_EXTENSION) != 'txt') {
		$err_msg = '拡張子txtのUnicodeテキストファイルのみ対応しています。';
	} else {
		//UTF-16からUTF-8へ変換
		$buffer = file_get_contents($file_tmp_name);
		file_put_contents($file_tmp_name, mb_convert_encoding($buffer, 'UTF-8', 'UTF-16'));
		unset($buffer);
		//変換がおわったら、ファイルを読み込む
		$fp = fopen($file_tmp_name, "r");
		//区切り文字にタブを指定して配列に格納していく
		while (($data = fgetcsv($fp, 0, "\t")) !== FALSE) {
			if(count($data)==4){
				//カラム数が4列の場合のみデータに追加する
				$tsvdata[] = $data;
			}
		}
		fclose($fp);
	}
	//---処理終了---
	if($err_msg == ''){
		//簡易表示チェック
		echo '<table border="1">';
		for($cnt1=0;$cnt1<count($tsvdata);$cnt1++){
			echo '<tr>';
			for($cnt2=0;$cnt2<count($tsvdata[$cnt1]);$cnt2++){
				echo '<td>'.nl2br($tsvdata[$cnt1][$cnt2]).'</td>';
			}
			echo '</tr>';
		}
		echo '</table>';
	}else{
		//エラーメッセージ表示
		echo $err_msg;
	}
}
?>
</p>
</body>
</html>
```

##ポイント
- Excelから書き出す「Unicodeテキスト」の文字コードは「UTF-16」である。そして、UTF-16は、 `mb_detect_encoding()` では判別できない。
- `setlocale(LC_ALL, 'ja_JP.UTF-8');` をしないと、一部の文字が表示されない現象があった。

##参考にさせていただいた記事など
[Qiita : PHPでCSVファイルをアップロードする(そして配列に変換)](http://qiita.com/katsukii/items/1b7e95723d0070cfc5b9)
[Qiita : CSVアップロードからのMySQLへのデータ挿入](http://qiita.com/mpyw/items/caa2568284b69d270f8b#1-3)
[PHPマニュアル : mb_detect_order](http://php.net/manual/ja/function.mb-detect-order.php) ※UTF-16はエンコーディング検出できない

##さいごに
- たぶんエラー処理など甘い気がしますが、何か気づいた点などがあればご指摘ください。
zsh のあまり知られていなそうな機能


自分が使っている便利な機能を紹介

## $ rm **/*(-@)

ファイル修飾子は使っている人も多いはず。
[zsh で find を使わずに簡単にファイルを絞り込む](http://qiita.com/mollifier/items/1c4a4930a89aa75e5ced)


* `*(@)` でシンボリックリンク
* `*(-@)` でリンクが切れたシンボリックリンク 
* `rm **/*(-@)` で下位階層含めたリンク切れのシンボリックリンクの削除

修飾子で他に便利なのは

* `*(-ch-1)` シンボリックリンクのリンク先が1時間以内に作られたファイル
* `*(U)` 自分のファイル
* `*(u:hoge:)` ユーザ hoge のファイル
* `*(/^F)` 空のディレクトリ


## $ tkdiff =(zcat xxx.gz | cut -f 1) =(zcat xxx.gz | cut -f 2)

プロセス置換
`<(zcat xxxx.gz | grep yyyy | cut -f 2 )` みたいな形でわざわざ一時ファイルにしなくても、ファイル指定でそのまま渡せるので便利。
出力ファイル指定のオプションにも`a.out -o >(grep xxxxx | gzip > xxxx.gz)`みたいな形で出力ファイル指定すれば、無圧縮の大きいファイルができることもなくなる。
先頭が `=` の場合には /tmp に一時ファイルとして実体ができる。
tkdiff とか `<(xxx aaa)` ではうまく処理できないみたいなので、そういう時は `=(xxx aaa)` を使う。




## $ cd old new
良く使うコマンドの一つである cd。
zsh builtin の cd は実は引数を2個取れる
`cd old new` で current directory の path から old を new に変えた dir に移動できる。

```bash:zsh
$ pwd
/path/to/release/src/dir
$ cd release test
/path/to/test/src/dir
```

release とか test とか同じようなディレクトリ構成で階層が深くなっている時に、`cd ../../test/src/dir` で上に戻らなくても同じ階層に移動できる
`cd ${PWD/old/new}` と同等
【環境構築】CodeIgniter 3をComposer使ってコマンド一行でインストール

公式ではzipからしかインストールできないCodeIgniterですが、Composer使いたいですよね？
調べたら非公式ですがありましたので手順を書いていきます。作者のkenjis様ありがとうございます。

#前提条件

- Composerがインストール済み

#CodeIgniter3インストール

プロジェクト一式を配置したいディレクトリに移動し、
以下でインストールできちゃいます。

```
composer create-project kenjis/codeigniter-composer-installer codeigniter
```

これで現在のディレクトリにCodeIgniterディレクトリが作成されまして

-  codeIgniter/vendor/がCodeIgniter本体
-  codeIgniter/public/がIndex.php（ここをドキュメントルートに指定して上げればOK)
-  codeIgniter/application/がプロジェクトトップ

になります。


# 日本語言語ファイルのインストール

```
cd codeIgniter/to/codeigniter
php bin/install.php translations develop
```

これでcodeIgniter/application/languageに日本語ファイルが追加されます。

# CodeIgniterのバージョンアップ

composer.jsonのあるディレクトリに移動します。

```
cd codeIgniter
composer update
```



#参考

- [CodeIgniter 3.0をコマンド一発でインストールするCodeIgniter Composer Installer](http://blog.a-way-out.net/blog/2015/04/24/codeigniter-composer-installer/)

- [GitHub - kenjis/codeigniter-composer-installer](https://github.com/kenjis/codeigniter-composer-installer#install-third-party-libraries)
【sourcetree】commitしてpushする手順

【手順】

◇commit(ローカルPCのリポジトリ更新)

1.ファイルを更新すると、「ファイルステータス」>「作業コピー」の下部にある
　 「作業ツリーのファイル」に更新されたファイル一覧が表示される

2.コミット対象のファイルを選択し、「↑」ボタンでインデックスに追加できる
　 インデックスの登録から外す時は「↓」ボタン。

3.インデックス欄に追加後、上部バーの「コミット」ボタンを押す

4.コミットウィンドウが表示されるので、コミットメッセージを記入

5.ファイルの差分など問題なければ、右下の「コミット」ボタンで完了

◇push(ローカルPCのリポジトリ更新をGitHubへアップロード)

1.コミットしたなら、上部バーの「プッシュ」ボタンに数字が表示される
  - GitHubとローカルPCの差分があるということ

2.「プッシュ」ボタンを押すとプッシュウィンドウが表示される

3.プッシュ先リポジトリが「origin」(GitHubのURL)になっていること

4.プッシュ対象のブランチを選択する


5.「OK」ボタンでプッシュ完了
【Tableau】トライアル版環境設定手順

・環境情報：Windows7（実装メモリ8.00GB、システムの種類64ビット）
・導入日：2016年2月6日
【手順】

１.以下にアクセス
http://get.tableau.com/ja-jp/trial/tableau-software.html?cid=70160000000YmmJ&ls=Paid%20Search&lsd=Google%20AdWords%20-%20Tableau%20-%20APAC%20-%20JP%20-%20Free%20Trial&adgroup=Tableau%20-%20Exact&kw=tableau&adused=54853536050&distribution=search&gclid=Cj0KEQiAxMG1BRDFmu3P3qjwmeMBEiQAEzSDLtIMfRaCZcZIpSyyMV5Cb2-0M4hmXN_V_1UhfKdiVFYaAjCH8P8HAQ

2.「無料トライアルを開始する」をクリック

3.必要事項を入力し、TableauDesktop-64bit-9-2-4.msiをダウンロード

4.msiファイルを起動し、インストール

5.「今すぐ試用を開始する」をクリック

6.メールアドレスを入力して終了
brew update


# 今日の brew update

update してみたら、新しい formulae が来ていた。
今日は三つです。

* assh
* docker-cloud
* rtags

それぞれどんなものか調べてみる。

## assh

まずはインストール前に想像してみる。たぶん、shell なのかな？名前的には。説明を読んでみると ```Advanced SSH config``` とある。どうやら、ssh config(~/.ssh/config) に色んな表現ができるようになるもののようだ。
mac は基本的には個人用なので、今のところ SSH は使う予定がないのでスルーwww

## docker-cloud

infra as a code には興味があるので、これは興味をそそる。docker は linux コンテナの技術を使った仮想化技術の一つだ。これがクラウドってことは、どういうことだろう？
cloud 上に docker イメージを元にした環境を構築するためのコマンドかな？

こちらも説明を見てみる。。。

```docker-cloud: SaaS to build, deploy and manage Docker-based applications```

本当にそのままだった。時々予想は当たる。
今は環境が色々不足しているので、これはこのままにします。後日試してみます。

## rtags

tags の親戚っぽいな。
今のメインエディタは emacs なので、etags はそこそこ使う。けど、rtags かぁ。ruby 関連かな？
と思ったけど、ruby は関係ないらしい。実際には C++ 用 tag 生成用のツールらしい。

中途半端だけど、こんな感じでした。
後日 docker-cloud についてはインストールしてみたりしようかな。
autoreleasepoolで例外を投げられるようにする



一時的にメモリの消費が増える部分で、autoreleaseを使うのに加え、do〜try〜catchでエラーハンドリングをするといった場面があって、

```swift
autoreleasepool {
    do {
        try process()
    } catch (let e) {
        //
    }
}

```

こうではなくて、、、

```swift:雑多な例ですが...

func doSomeTask() {
   do {
       for i in (0..<100) {
           autoreleasepool {
               // 大きい画像を扱うので結構メモリを消費するからautoreleasepoolを使いたい
               let largeImage = UIImage(contentsOfFile: "image\(i).png")
               // 何らかの処理
     		    try ~~~~~~~~ //これができない!! ★
		    }
       }
   } catch (let e) {
       print(e) // ★の例外をここで拾いたい
   }
}
```

このように使いたい場合に、`autoreleasepool`が例外をthrowできないので上記のように書くことができません。
なので、上記の例ができるように、以下の用に実装してみます。

## 実装してみる

```swift
public func autoreleasepool(@noescape code: () throws -> ()) rethrows {
    try {
        var error: ErrorType?
        autoreleasepool {
            do {
                try code()
            } catch (let e) {
                error = e
            }
        }
        if let error = error {
            throw error
        }
    }()
}
```


あまり綺麗に書けないですが、予めErrorTypeが入る変数を`autoreleasepool`の外に宣言し、
内部で`code()`を実行し、エラーをキャッチしたら先に用意した変数にいれ、それを`autoreleasepool`を抜けたあとにthrowします。

同じ関数名ですが、エラーもなく宣言ができます。
これで、先ほどの例で、`autoreleasepool`の前に、`try`を付けてあげることで、実現することができます。

## 使用してみる

```swift

func doSomeTask() {
   do {
       for i in (0..<100) {
           try autoreleasepool {
               let largeImage = UIImage(contentsOfFile: "image\(i).png")
               // 何らかの処理
     		    try ~~~~~~~~ // ★
		    }
       }
   } catch (let e) {
       print(e) // ★の例外をここで拾うことができる!
   }
}
```

## 何故同名の関数なのに問題ないのか

`autoreleasepool`オリジナルの宣言を見てみると、

```swift:定義
public func autoreleasepool(@noescape code: () -> ())

```

となっていて、引数の型が

`() -> ()` (オリジナル)
`() throws -> ()` (今回実装したもの)
となっているので違う引数の型と判断され、結果としてオーバーロードした事になります。

`autoreleasepool`に渡すクロージャーの内部で`try`で例外を投げる可能性がある場合は、今回実装した方の`autoreleasepool`が適応され、クロージャーの内部で例外が投げられることがない、通常の使い方の場合は、オリジナルの方が適応されます。

```swift

autoreleasepool {
    // 通常の autoreleasepool
}

try autoreleasepool {
    try ~~~~~
    // 例外をthrowできるautoreleasepool
}


```
ELB経由のアクセスがなぜか定期的にIP制限されてハマった

# はじめに
あるアプリケーションをAWSのELBを使ってアクセスを分散していたのだが、ある定期的にアクセス制限されるといった自体が起きていた。

原因としては初歩的なことだったのだが、少々はまっていたので備忘録として残しておきます。

# 要約
* ELBは作成時に指定のregionの全availabity-zone分のロードバランサを作成する
* 対象のavailabity-zoneのインスタンス数が0の場合、別のavailabity-zoneのインスタンスへとアクセスが割り振られる
* 当たり前だけど問題発生時はエラーログをすぐにちゃんと確認する

# 原因解明とその経緯
## nginx.confの設定ミス？
その時のnginxの設定は以下の通りである。

```nginx:/etc/nginx/nginx.conf
  set_real_ip_from   172.31.16.0/16;
  real_ip_header     X-Forwarded-For;
```
インスタンスのavailabity-zoneに対応したCIDRがきちんと設定されていた。
そのため設定をみる限りはなにも間違いがなかった。
そこで設定されても反映されてないのかな？と思い、nginxを再起動するも変わらず、
CIDRの入力ミスでは？となんど見直しても間違っておらず、
依然、繋がったり繋がらなかったりと謎は深まるばかり。

## エラーログを見てみると？
なんでだ、なんでだー。
と思いログの存在を思い出したので確認してみると、以下のようなメッセージが。

```
2016/02/10 05:20:32 [error] 1948#0: *3458 access forbidden by rule, client: 172.31.0.x, server: localhost, request: "GET /hoge HTTP/1.1", host: "example.com"
```
ん？`172.31.0.x`ってなんだ？`172.31.16.x`じゃないの？？

## インスタンスは0なのに？なぜ？
ELBのIPを確認してみると、アクセス元がインスタンスが配備されているap-northeast-1cではなく、ap-northeast-1aであることが判明。

でもなぜ、ap-northeast-1aから？
と思って、コンソールを見てみると、インスタンスが0のap-northeast-1aがロードバランサに設定されていました。
0なら問題ないのでは？と思いつつも、ap-northeast-1aの設定を削除してみると無事アクセス制限に引っかからなくなりました。

どうやらインスタンス数が0の場合は、別のap-northeast-1aへアクセスを割り振っている模様。


本来、各availability-zoneごとにインスタンスを配備してあるのが普通だと思うのだが、
開発用の小規模なサーバだったために、このへんケチってインスタンス１個でやってたため、このような自体に。

それに作成時の流れでは特に設定する画面もなかったので、
生成時に指定regionで利用可能な全availability-zoneのロードバランサが設定されるという自体にも気付かずハマってしまいました。

# 最後に
原因わかってみれば大したことじゃなかった気もしますが、わかるまではさっぱり何が起きてるのかもわからず結構はまってました。
というのも現象がわからず、ただただなんでだろうといろいろ試していたためでした。
この時エラーログをちゃんと確認する癖をつけてれば原因発見も早かったのになと、当たり前なんですが改めて身をもって知ることとなりました。
名前空間の下で変数を使って動的にクラス名を指定するには修飾が必要


検証環境

- PHP 5.5.30
- PHP 5.6.16
- PHP 7.0.3
 
```php
<?php
namespace ns1;

class Foo
{
    public static function bar()
    {
        return __METHOD__;
    }
}

namespace ns2;

use ns1\Foo;

echo Foo::bar() . "\n"; // -> ns1\Foo::bar

//非修飾(エラーになる)
$className = 'Foo';
$className::bar() . "\n"; // -> Fatal error: Class 'Foo' not found

//修飾
$querifiedName = 'ns1\\' . $className;
echo $querifiedName::bar() . "\n"; // -> ns1\Foo::bar

//完全修飾
$fullyQuerifiedName = '\\ns1\\' . $className;
echo $fullyQuerifiedName::bar() . "\n"; // -> ns1\Foo::bar
```
[一発芸] GNU Make で相対パスを動的に生成する [無駄知識]


**◆ 御注意 ◆**
この記事で紹介したスクリプトは、タイトルどおりの受け狙いパフォーマンスです。
おおむねは期待したとおりに動作しますが、少し詳しく検証するとポロポロと穴が見つかります。
重要なビルドシステムに組み込んだりすることは、間違ってもお勧めしません。
**◆ 御注意 ◆**

一身上の都合により GNU Make の Makefile で、とあるふたつのディレクトリ A から B への相対パスを動的に生成しなければならなくなりました。
Make のスクリプトはチューリング完全なプログラミング言語だと噂に聞いたことはありましたが、これはさすがに難しいでしょう。

……と思っていたら、できてしまいました。

```Make:Makefile
comma := ,
empty :=
space := $(empty) $(empty)

# exsample path
FROM_PATH := ../a/../b/c/d/c
#FROM_PATH := ../b/x/y
TO_PATH := ../b/x/y
#TO_PATH := ../a/../b/c/d/c

# function relpath_from
relpath_from = $(subst $(space),/,$(strip \
                 $(foreach dir,$(basename $(foreach dir,$(join $(subst /,$(space),$(abspath $(1))),$(addprefix .,$(subst /,$(space),$(abspath $(2))))),$(filter-out $(basename $(dir)).$(basename $(dir)),$(dir)))),$(patsubst %,..,$(dir))) \
                 $(foreach dir,$(suffix $(foreach dir,$(join $(subst /,$(space),$(abspath $(1))),$(addprefix .,$(subst /,$(space),$(abspath $(2))))),$(filter-out $(basename $(dir)).$(basename $(dir)),$(dir)))),$(subst .,$(empty),$(dir)))))

# step trace
F_ABS := $(abspath $(FROM_PATH))
T_ABS := $(abspath $(TO_PATH))

F_WORD := $(subst /,$(space),$(F_ABS))
T_WORD := $(subst /,$(space),$(T_ABS))

PAIRING := $(join $(F_WORD),$(addprefix .,$(T_WORD)))
CROSSOFF := $(foreach dir,$(PAIRING),$(filter-out $(basename $(dir)).$(basename $(dir)),$(dir)))

UPPER := $(foreach dir,$(basename $(CROSSOFF)),$(patsubst %,..,$(dir)))
DOWNER := $(foreach dir,$(suffix $(CROSSOFF)),$(subst .,$(empty),$(dir)))
CONCAT := $(subst $(space),/,$(strip $(UPPER) $(DOWNER)))

all:
	@echo from_path: $(FROM_PATH)
	@echo to_path: $(TO_PATH)
	@echo $(call relpath_from,$(FROM_PATH),$(TO_PATH))
	@echo ===== step trace =====
	@echo from_path: $(FROM_PATH)
	@echo to_path: $(TO_PATH)
	@echo -----
	@echo from_abs_path: $(F_ABS)
	@echo to_abs_path: $(T_ABS)
	@echo -----
	@echo from_words: $(F_WORD)
	@echo to_words: $(T_WORD)
	@echo -----
	@echo pairing: $(PAIRING)
	@echo cross-off: $(CROSSOFF)
	@echo -----
	@echo upper: $(UPPER)
	@echo downer: $(DOWNER)
	@echo $(CONCAT)
```

あ、ディレクトリ名自体に .(ピリオド) を含んでいるケースは想定していないです、面倒くさいので。
パスは違うけれどたまたま同じ階層に同じ名前のディレクトリがあったりすると、動作がおかしくなります。
それから、たぶん独自拡張の関数を使っているので GNU Make 以外では動かないんじゃないでしょうか。

```bash
$ make 
from_path: ../a/../b/c/d/c
to_path: ../b/x/y
../../../x/y
===== step trace =====
from_path: ../a/../b/c/d/c
to_path: ../b/x/y
-----
from_abs_path: /Users/b/c/d/c
to_abs_path: /Users/b/x/y
-----
from_words: Users b c d c
to_words: Users b x y
-----
pairing: Users.Users b.b c.x d.y c
cross-off: c.x d.y c
-----
upper: .. .. ..
downer: x y
../../../x/y
```
Certificates, Identifiers & ProfilesでAppIDsを新規登録時に「-」が使えなくなった

表題通り使えなくなった。
既存のAppIDsには-が入ってるので使えてた（はず）。
しかし、先ほど試したらダメだった。

<img width="979" alt="スクリーンショット 2016-02-10 22.33.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/93918/26194292-daaf-f84a-0ff5-fd0c1254cdfa.png">


```
You cannot use special characters such as @, &, *, ', "`
Please enter a valid Name
```
と表示される。
（@でも&でも*でも'でも"でもないのに！）

おかげでAppIDsの表記が統一されないため違和感が凄い。
何か情報をお持ちでしたら教えてください。



## 追記
上記の結果は、Chromeで動作確認しています。Safariでも同様でした。

![あスクリーンショット_2016-02-10_22_49_30.jpg](https://qiita-image-store.s3.amazonaws.com/0/93918/50fa8af5-ed1a-58d2-467a-3b98d0ff9043.jpeg)
FBSDKCoreKit（Facebook SDK）によるAppEvent送信をデバッグする方法

# 概要

## 何を書いてるか

FacebookSDKを使ってイベントをロギングするように開発する際、デバッグしようと思っても[Analyticsツール](https://www.facebook.com/analytics/)に表示されるまでに非常に長い時間がかかることがある。

より簡単にデバッグできるようなツールと手順を書く。

# デバッグ方法

## アプリ上でDebugログを出しながら確認

```objc
[FBSDKSettings enableLoggingBehavior:FBSDKLoggingBehaviorAppEvents];
```

上記のコードを呼んでおくと、以下のようにSDKのeventロギングの挙動をconsole上に吐き出してくれるようになる。

```
2016-02-10 18:22:10.452 SampleApp[671:142860] FBSDKLog: FBSDKAppEvents Persist: Read 1 event states. First state has 1 events
2016-02-10 18:22:10.452 SampleApp[671:142860] FBSDKLog: FBSDKAppEvents Persist: Clearing
2016-02-10 18:22:10.454 SampleApp[671:142860] FBSDKLog: FBSDKTimeSpentData Restore: {"numInterruptions":0,"lastSuspendTime":1455096103,"secondsSpentInCurrentSession":243}
2016-02-10 18:22:10.993 SampleApp[671:142860] FBSDKLog: FBSDKAppEvents: Flushed @ 1455096130, 1 events due to 'PersistedEvents' - {
    "advertiser_tracking_enabled" = 1;
    "anon_id" = "AAAAAAAAA-BBBB-CCCC-DDDD-0000000000000000";
    "application_tracking_enabled" = 1;
    event = "CUSTOM_APP_EVENTS";
    extinfo = "[\"i2\",\"jp.co.mixi.SampleApp\",\"0\",\"1.0.0\",\"9.2\",\"iPhone7,1\",\"ja_JP\",\"JST\",\"\U30bd\U30d5\U30c8\U30d0\U30f3\U30af\",414,736,\"3.00\",2,12,4]";
    "url_schemes" = "[\"mixi-sample\",\"fb999999999999999\"]";
}
Events: [
  {
    "event" : {
      "_logTime" : 1455096101,
      "_ui" : "MainViewController",
      "_eventName" : "fb_mobile_complete_registration"
    },
    "isImplicit" : false
  }
]
Flush Result : Success
```

## Developer向けサイト上でのデバッグ

Facebook Developer向けにApp Ads Helperというツールがある。
登録しているアプリを選択してツールを開く。これを利用するとリアルタイムにSDKのインストール状況やイベントの送信状況を把握できるのでデバッグが捗る。

https://developers.facebook.com/tools/app-ads-helper/

### SDKのセットアップ状況など

<img width="708" alt="スクリーンショット 2016-02-10 22.11.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/30355/cb174903-f64c-8cf8-fd48-2935a17944b8.png">


### イベント送信をリアルタイムに確認

App Ads Helperの最下部に App Events Tester というツールがあるのでこれを開く。

![スクリーンショット 2016-02-10 12.08.28.png](https://qiita-image-store.s3.amazonaws.com/0/30355/42a0ded0-30c1-d9fa-6694-4c62ac69b707.png)

開いたダイアログ上で例えばIDFA（Advertising ID）に紐付いたクライアントのイベント送信をリアルタイムに確認したい場合、「Device with Advertising ID」を選択し、IDFAを入力して「submit」する。

IDFAを取得する方法はObj-Cでは以下のようなコードをかけば確認可能。

```objc
NSLog(@"%@", [[ASIdentifierManager sharedManager] advertisingIdentifier]);
```
![スクリーンショット 2016-02-10 12.13.17.png](https://qiita-image-store.s3.amazonaws.com/0/30355/378cdd5f-fd5f-2651-2021-76dd400fb022.png)

イベント送信をアプリ上で実行すると、flushされてサーバーにイベントが通知されるタイミングですぐに送られてきたイベントが表示される。

# ちなみに

## FBSDK 4.8以前では一部バグがあった（4.9.0以降で解決済み）

アプリをバックグラウンドに移行した際に、SDKがサーバーに未送信のイベント情報をにオブジェクトアーカイビングでディスクに一時的に書き込むのだが、それらイベント情報を次回起動し復元した時に一部条件でうまく送信されないバグがあった。

以下のコミットで修正されているようなので、うまくイベントが確認できない場合などは最新の4.9.1を利用すると良い。

https://github.com/facebook/facebook-ios-sdk/commit/7d240ee9342a401b82c664dc4fc24aa7e4fe8a47#diff-8abeec5a00b8d1820288e81dea744382R128
SourceTreeの無料登録をする際のエラー

SourceTreeの１ヶ月の試用期間が過ぎたので、無料登録をしようと思ったら躓いたのでメモします。

SourceTreeはアプリをダウンロードしたら１ヶ月試用できるのですが、試用期間中は何度も登録のメッセージが表示されます。
そして試用期間が過ぎると急にアプリが使えなくなってしまい、アプリを起動すると登録のメッセージだけが表示されるようになります。

そのメッセージ画面の「今すぐ登録-無料登録!」のボタンをクリックすると、メールアドレスの登録画面に飛ぶみたいなのですが、何故かクリックしても何も起こりませんでした。
アプリを強制終了しても何も変化は起こらず。

なので、今回はSourceTreeの公式サイトから登録することで解決しました。

SourceTreeの公式サイト
https://www.sourcetreeapp.com/

こちらのサイトの一番下に「Register」とあるのでクリック。
https://www.sourcetreeapp.com/register/

「Register SourceTree now»」をクリックし、メールアドレスを登録します。

登録したアドレスにメールが届くので、認証する。

そうすると「New SourceTree License」と出るので、そこで無料ライセンスを生成し、ライセンスファイルをダウンロードします。

SourceTreeアプリの登録メッセージに、「ライセンスを読み込む...」があるので
そこから先ほどダウンロードしたライセンスファイルをアップロードします。

これでSourceTreeが使えるようになりました！
React＋CSSフレームワークを検討してみたよ

React使いつつも、既存のCSSフレームワークを何か載せようと思っていろいろ調べたメモ。
あくまでもReactとの親和性などに絞って選んでます。
Bootstrapは何か「__出、出〜〜〜！！Bootstrap奴〜〜〜！__」ってなりそうだったので、最後の砦として触れてません。

# Material-UI
http://www.material-ui.com/

一番Reactに寄り添って出来ている。
以下のように必要なコンポーネントを`import`して`render()`内で使うだけ。
実際触ってみると非常にお手軽で、動きのクォリティも高かった。
余計な外部ファイルも読む必要がなくて綺麗。

その分かなりカッチリと仕様が決まっているので、少し手を加えたい場合は
さらにMaterial-UIコンポーネントをラップするオリジナルコンポーネントを作れば拡張はできる。

```js
// タッチ・クリックの挙動のために必要っぽい
import injectTapEventPlugin from 'react-tap-event-plugin';
injectTapEventPlugin();

import DropDownMenu from 'material-ui/DropDownMenu';
import MenuItem from 'material-ui/MenuItem';

...

return (
  <div>
    <DropDownMenu value={default} onChange={this.fnChange}>
      <MenuItem value={data.id} primaryText={data.name} />
    </DropDownMenu>
  </div>
);
```

# Semantic UI
http://semantic-ui.com/

デザインが可愛くて良かったけれど、jQuery依存しているせいでドロップダウンなどを動作させるときにjQueryオブジェクトに対してメソッドを走らせないといけない仕様っぽかった。

せっかくReactで書くのに、またバッティングしないようにビクビクしながらclass名を定義するのはつらすぎるので微妙。

```js
componentDidMount() {
    $('.ui.selection.dropdown').dropdown({
        onChange: (value) => {
            this.setState({
                value
            });
        }
    });
}
```
### react-semantify
http://jessy1092.github.io/react-semantify/

同じような悩みを抱えた人がいたらしく、こんなのも見つけました。
前述のMUIのように、Reactコンポーネントとしてimportして`componentDidMount`で処理を記述する必要は無いっぽい（試してないので予想）

```html
<div class="ui selection dropdown"></div>
```
```js
$('.ui.selection.dropdown').dropdown();
```
これを

```html
<Dropdown init={true}></Dropdown>
```
こういう風に書けるらしい
だいぶReactっぽく書けるようになるけれど、結局大元がjQuery依存していることに変わりはないので、別途jQuery本体を読み込む必要があります。

# Semantic-UI-React
（※2016.10.14追記）
http://react.semantic-ui.com/introduction
Semantic UIに公式のReact準拠ライブラリが登場しました。（ばんざーいばんざーい！）

### jQuery Free
>all jQuery functionality has been re-implemented in React.

どうやら問題は解決したようです。
仮想DOMでのレンダリングに対応するために、頑張って全部再実装したっぽいです。

```js
import {Dropdown} from 'semantic-ui-react';

...

<Dropdown text='File'>
  <Dropdown.Menu>
    <Dropdown.Item text='New' />
  </Dropdown.Menu>
</Dropdown>
```


# MUI
https://www.muicss.com/

Material-UIのクローンみたいな感じ？
公式にReactがサポートされていて、以下のように書けばコンポーネントを設置できる。
別途MUIのcssファイルを読み込む必要があるっぽい。
従来の構成を大きく損なわずに、UIコンポーネントだけを薄く使いたいような場合だったら有りかもしれない。

```js
import Button from 'muicss/lib/react/button';

...

return (
  <div>
    <Button>button</Button>
    <Button color="primary">button</Button>
    <Button color="danger">button</Button>
    <Button color="accent">button</Button>
  </div>
);
```

# Material Design Lite
https://www.getmdl.io/

Reactに寄り添っていないMaterialUI系フレームワーク。
ただしこちらはjQuery依存が無さそうなので、class名のつらさは無いかも。
ただReact以外の環境の方が良さを発揮できるかもしれない。

### material-design-react
https://www.npmjs.com/package/material-design-react
一応これもラッパーライブラリっぽいものがあった。


# そのほか
結構いいデザインのものはいくつかあるけれど、案外jQuery依存しているものが多かった。
深く見ていないけれど、Semantic UIと同じような問題を抱える気がするので使用には注意。

### Bootflat
http://bootflat.github.io/

### Materialize
http://materializecss.com/

### uikit
http://getuikit.com/
Mac上にWindows8.1を構築

参考: http://www.vagrantbox.es

# Vagrantで環境を作る

```
$ vagrant box add win81 http://aka.ms/vagrant-win81-ie11
$ vagrant init win81
$ vagrant up
# ここでエラーが発生するが、気にしなくていい
```

# VirtualBoxを使って、Win81を表示する

VirtualBoxアプリを起動し、上記で作成した「win81」を電源オフにしたあと、上部の「表示」ボタンを押下。

![win81.png](https://qiita-image-store.s3.amazonaws.com/0/9875/07ce930b-ef90-e12b-b38d-eeec0870d6a3.png)
BIG-IP SMTP設定

#BIG-IPでのSMTP設定について
monitor監視とFAILOVER検知のために、SNMPで監視サーバからアラートを出す予定が、
SNMPサーバの構築が間に合わない！ ＞＜
と言われたので、直BIG-IPからメールで出せないかと試してみた。

**GUIのSystemにSMTP設定できる項目があるけど、
あれは偽物っぽい。というか違う用途で使うのかな？**

簡単な流れをいうと２つのconfファイルに設定追加をすればメールが飛ぶ
・ssmtp.conf → SMTPサーバ指定
・alert.conf → メールを出す条件を指定

##[ssmtp.conf] の設定変更
コンソールからBIG-IPにログイン

1.1. バックアップ
``# cp -p /etc/ssmtp/ssmtp.conf{,.bak}``

1.2. 権限変更 
``# chmod 644 /etc/ssmtp/ssmtpt.conf``

1.3. ファイルの修正
メモ帳で下記の行にSMTPサーバを追記
`mailhub=192.168.XXX.XXX`
`FromLineOverride=YES`
名前解決できるなら、ドメイン名とかでもOKだと思います。
→BIG-IPにDNS設定したことないからわからないけど……。
書いたらセーブは忘れずにね。
※FromLineOverrideは、#のコメントアウトを外すだけ。
　この設定を有効化しないと、FromAddressが書き換わらない

1.4. 権限修正(元に戻す)
``# chmod 444 /etc/ssmtp/ssmtpt.conf``

これでSMTPサーバ指定が完了



##[alertd.conf] の設定変更
SNMP-Trapを飛ばすところが書かれているconfigファイルを書き換える。
つまりSNMP-Trapが飛ぶタイミングで、SMTPも飛ばす設定を追加しちゃいます。

2.1. バックアップ
``# cp -p /etc/alertd/alert.conf{,.bak}``

2.2. 権限変更 
``# chmod 644 /etc/alertd/alert.conf``

2.3. conf修正
SMTP-TrapのOIDが書かれているところに下記を追加する

```
;
 email toaddress="toaddress@XXXX.com"
 fromaddress="fromaddress@XXXX.com"
 body="";
```

monitor断検知と、FAILOVER検知をしたい場合は下記に追加。

```
　　# monitor 実際はこんなコメントアウトはないよ
   alert BIGIP_MCPD_MCPDERR_POOL_MEMBER_MON_STATUS { 
           snmptrap OID=".1.3.6.1.4.1.3375.2.4.0.10" 

   }
　　# failover  実際はこんなコメントアウトはないよ
   BIGIP_SOD_SODERR_SOD_STANDBY { 
   snmptrap OID=".1.3.6.1.4.1.3375.2.4.0.14"; 

   BIGIP_SOD_SODERR_SOD_ACTIVE { 
   snmptrap OID=".1.3.6.1.4.1.3375.2.4.0.15"; 

   BIGIP_SOD_SODERR_SOD_UNIT { 
   snmptrap OID=".1.3.6.1.4.1.3375.2.4.0.16" 

```

実際に追加してみる

``# vi /etc/alertd/alert.conf``

```alert.conf
   alert BIGIP_MCPD_MCPDERR_POOL_MEMBER_MON_STATUS { 
           snmptrap OID=".1.3.6.1.4.1.3375.2.4.0.10";
           email toaddress="toaddress@XXXX.com"
           fromaddress="fromaddress@XXXX.com"
           body="";
   }

   BIGIP_SOD_SODERR_SOD_STANDBY { 
   snmptrap OID=".1.3.6.1.4.1.3375.2.4.0.14"; 
   email toaddress="toaddress@XXXX.com"
   fromaddress="fromaddress@XXXX.com"
   body="";
   lcdwarn description="CPU Temp too high." priority="3"
   }
   BIGIP_SOD_SODERR_SOD_ACTIVE { 
   snmptrap OID=".1.3.6.1.4.1.3375.2.4.0.15"; 
   email toaddress="toaddress@XXXX.com"
   fromaddress="fromaddress@XXXX.com"
   body="";
   lcdwarn description="CPU Temp too high." priority="3"
   }
   BIGIP_SOD_SODERR_SOD_UNIT { 
   snmptrap OID=".1.3.6.1.4.1.3375.2.4.0.16";
   email toaddress="toaddress@XXXX.com"
   fromaddress="fromaddress@XXXX.com"
   body="";
   }
```

2.4. 権限修正(元に戻す)
`` # chmod 444 /etc/alertd/alert.conf``

2.5. alertdサービスの再起動
`` # bigstart restart alertd ``

再起動で断はなかった。Virtual Addressにpingを打ちながら再起動した結果により。


##障害試験
FAILOVERをしたり、
monitor検知が失敗するようサーバの調整をしたりして、
実際にメールが飛ぶかを検証する。
メール送信が失敗したら /var/log/maillog
→ SMTPサーバに25番ポートで接続失敗ログが出た

あと、もしmgmtポートからSMTP通信をしたい場合は、management-routeの設定を追加かな。
→できませんでした。うーん、無理なのかな。


##メモ
・config syncしない
 → HAを組んでいたら、両機ともに設定変更が必要
・Archive で作られるucsファイルには保存されない


## 追記
20160324追記
・FromLineOverrideのコメントアウト
・ssmtpも権限変えて更新する手順に変更
【VBS】ArrayListで①1行代入②ArrayListで戻り値にできますか？

参考【VBS】ArrayList http://qiita.com/OneK/items/2445fcf6ac454425bae6
---------------------------------------------------------------
Set myArrayList = CreateObject("System.Collections.ArrayList")
myArray = Array("AK-47","M4","G3")
call Array2List(myArray)
Wscript.echo myArrayList.Count
For Each elem In myArrayList
Wscript.echo elem
Next
Function Array2List(mmArray)
For i = 0 To UBound(mmArray)
myArrayList.add mmArray(i)
Next
End Function

---------------------------------------------------------------

怪しいところ
1.関数をcall文で呼んでいます。
2.グローバル変数を使わず、戻り値で対応したい。
現在、byVal,byRefの意味を理解していません。よろしくお願いします。
Ansible モジュール selinux

#selinux
SELinuxの設定や状態を変更する。

##概要
SELinuxのモードや設定を変更する。実行後、再起動が必要な場合がある。
Ansibleは再起動を自ら実行しないが、必要な際に促す。

##前提条件
libselinux-pythonが必要。

##オプション

|引数|必須|デフォルト|値|備考|
|:---------|:---------|:---------|:---------|:---------|
|conf|no|/etc/selinux/config||デフォルトでない場合のSELinux設定ファイルへのパス|
|policy|no|||state=disableでない場合、SELinux設定の名称(例：targeted)が必須となる|
|state|yes||・enforcing<br>・permissive<br>・disabled|SELinuxのモード|


##使用例

```yaml:
- selinux: policy=targeted state=enforcing
- selinux: policy=targeted state=permissive
- selinux: state=disabled
```

##注意点
- Debianベースのシステムでは未検証である。

###Ansibleコアモジュール
このモジュールはコア・アンシブルチームによりメンテナンスされます。
Wikipediaボットを作ってみた


# コード
```:explain.coffee
apiUrl = "https://ja.wikipedia.org/w/api.php?action=query&format=json&prop=extracts&redirects=1&exchars=200&explaintext=1"

module.exports = (robot) ->
  robot.respond(/explain (.*)/i, (msg) ->
    request = robot.http(apiUrl)
      .query(titles: msg.match[1])
      .get()

    request((err, res, body) ->
      if err
        msg.send("なんかエラーが起きました...")
        return

      data = JSON.parse(body)
      for id, value of data.query.pages
        if value.extract?
          respond = "Wikipediaによりますと！\n"
          respond += value.extract
          msg.send(respond)
        else
          msg.send("すみません、Wikipediaにありませんでした...")
    )
  )
```

# 実行した感じ
![スクリーンショット 2016-02-10 21.25.36.png](https://qiita-image-store.s3.amazonaws.com/0/72360/76969631-0f2a-e912-78dd-af3bc9e32099.png "スクリーンショット 2016-02-10 21.25.36.png")

簡単そうなので作ってみました。めちゃくちゃ役に立つ感じではないですが、パッとSlackで調べられるのであってもいいかなと思います。