OmniAICreator/Qiita-1.07M huggingface dataset:
Scalaローカルインストール

## 環境
OS:Windows 7 64bit
Java:1.7

## インストール方法
Windowsでのインストール方法を記載します。
※今回scalaのバージョンは 2.11.6 でインストールを行いました。

1. javaがインストールされていることを確認する。コマンドプロンプトを開きjavaコマンドが実行てきることを確認する。
`c:\> java -verson`
2. [公式のダウンロードページ](http://www.scala-lang.org/download/)から*scala-2.xx.x.zip*をダウンロードする。
3. 適当なフォルダ`c:\xxxx\`に展開する。
4. 展開したフォルダの`c:\xxxx\scala-2.xx.x\bin`にPATHを通す。
5. コマンドプロンプトで*scala.bat*と入力し、正しく動作するか確認する。

```lang:確認コマンド
C:\xxx\> scala.bat
Welcome to Scala version 2.11.6 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_21).
Type in expressions to have them evaluated.
Type :help for more information.

scala>
```

## 実行方法
無事インストールできたので、REPLとコンパイラの2通りで実行できるか試してみる。

* REPL

```lang:コマンドライン
C:\xxx\> scala.bat
Welcome to Scala version 2.11.6 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_21).
Type in expressions to have them evaluated.
Type :help for more information.

scala> 1+2
res0: Int = 3
```

* コンパイラ

```lang:Sample.scala
object Sample {
	def main (args: Array[String]) {
		println("Hello World!")
	}
}
```

```lang:コマンドライン
C:\xxx\> scalac.bat Sample.scala

C:\xxx\> dir

2015/XX/XX  xx:00               586 Sample$.class
2015/XX/XX  xx:00               561 Sample.class
2015/XX/XX  xx:00                84 Sample.scala

C:\xxx\> scala.bat Sample
Hello World!

C:\xxx\> 
```

以上
## 参考文献
[公式](http://www.scala-lang.org/what-is-scala.html)
[Scalaプログラミング入門](http://bach.istc.kobe-u.ac.jp/lect/ProLang/org/scala.html)
pptpd(今のところ接続できない。)


## 参考

* [RaspberryPI(というかUbuntu)上にVPNサーバー構築(PPTP) - Qiita](http://qiita.com/sumyapp/items/b7300a9ffa316d676aa1) @sumyapp さん

# 比較表

* [VPN Protocol Comparison List - PPTP vs L2TP vs OpenVPN ™ vs Chameleon ™ | VyprVPN](http://www.giganews.com/vyprvpn/compare-vpn-protocols.html)
* 素晴らしい表だったので拝借。

![スクリーンショット 2015-06-19 7.54.21.png](https://qiita-image-store.s3.amazonaws.com/0/25728/d482bb28-60f9-8062-791f-44a67b9d6fee.png "スクリーンショット 2015-06-19 7.54.21.png")

速度面やCPU負荷、iPhone対応ということで、PPTPで設定を試みることにする。

* PPTPはgre+1723に対応。(pptpd)
  * gre	 IPプロトコル番号	 :　47 
  * TCPポート番号	 :　1723 

* IPSecは複数のプロトコルに対応。(strongswan)
  * AH	 	IPプロトコル番号　	:　51
  * ESP	 	IPプロトコル番号　	:　50
  * IKE	 	UDPポート番号　	:　500,4500
* l2tp(xl2tpd
  * UDPポート番号　	:　1701



# インストール

```bash:
sudo apt-get install pptpd
```

## IP割り当て設定

```diff:/etc/pptpd.conf
+ localip 10.0.1.2
+ remoteip 10.0.1.234-238
```

* localip: pptpdサーバのIPアドレスを指定。
* remoteip: pptp接続時，10.0.1.234-.238の範囲で割り当て。

## DNS割り当て設定

```bash:/etc/ppp/pptpd-options
ms-dns 10.0.1.1
```

## 接続ユーザ・パスワード設定

```diff:/etc/ppp/chap-secrets
# User名  サーバ名  パスワード  割り当てIP
+ client    pptpd    Aegh6oiy    *
+ client2   pptpd    Oojau3mo    10.0.1.130

```

* サーバ名は `pptpd` 固定。
* IPは`remoteip`の範囲で自動割り当ての場合`*`


## MTU設定

* これをしないとモバイル端末は通信がよく途切れる

```diff:/etc/ppp/options
+ mtu 1280
+ mru 1280
```

## port開放

* TCP1723
* GRE(47)

* AirMacの場合
  * [AirMac ユーティリティ 5.5.3 (Windows)](https://support.apple.com/kb/DL1391?locale=ja_JP)
  * [PPTP on ubuntu 11.04 through AirMac Extreme | bibineko](https://bibineko.wordpress.com/2011/05/26/pptp-on-ubuntu-11-04-through-airmac-extreme/)

![スクリーンショット 2015-06-19 8.04.28.png](https://qiita-image-store.s3.amazonaws.com/0/25728/74b1d51a-86f0-c3f7-04e0-b559ba207033.png "スクリーンショット 2015-06-19 8.04.28.png")


## GREカーネルモジュール読み込み

> CTRL: PTY read or GRE write failed (pty,gre)=(6,7)

というエラーが出る場合、greモジュールが読み込まれていない。

```bash:モジュールの存在確認
$ find /lib/modules -name gre.ko
/lib/modules/3.19.0-16-generic/kernel/net/ipv4/gre.ko
```

```bash:
sudo modprobe gre
```

```diff:/etc/modules
+ gre
```


## IP forwarding

```diff:/etc/sysctl.conf
+ net.ipv4.ip_forward=1
```

```bash:
sudo sysctl -p
```

## 一度OS再起動しておく

* これ重要。

## サービス起動

```bash:
sudo systemctl start pptpd
```

# トラブルシューティング

iphoneにて

> 通信装置によって接続を解除されました。接続し直してみてください。それでも問題が解決しない場合は、接続を確認してください。

* [マイIPでエラーが表示され接続できません。](https://faq.interlink.or.jp/faq2/View/wcDisplayContent.aspx?id=179)

詰んだ。  * [[ubuntu] PPTP Server and PPTP Client](http://ubuntuforums.org/showthread.php?t=1794838)
c++ builder XE4, 10.2 Tokyo > TDateTime > SecondsBetween() > msecの違い

```txt:動作確認
C++ Builder XE4
```

DateUtils.hppにはSecondsBetween()という関数がある。これは2つのTDateTime変数を比較する時、msec程度の違いであれば0になる (以下のdif)。

```cpp
TDateTime dt1 = StrToDateTime(L"2015/06/19 08:59:59.001");
TDateTime dt2 = StrToDateTime(L"2015/06/19 09:00:00.000");
int dif = SecondsBetween(dt1, dt2);
```

ヘルプには以下のようにあった
> 9:00:00 A.M. と 9:00:00:999 A.M. の間の差を 0 としてレポートします。この差が 1 秒としてカウントされるには 1 ミリ秒足りないからです。 


### Tokyo
(追記 2017/12/26) 

```txt:動作環境
Rad Studio 10.2 Tokyo Update 2
```

Tokyoでの動作が同じであることを確認した。
Swift用語の日本語訳調査


Apple公式でSwiftの日本語資料があればそれに準拠させるのが筋だと思うのですが、今のところ、そういったものが出る気配はないので、日本語の解説本がどうなってるのかを軽く調べてみました。

## まとめ

|原語						|詳解 Swift改訂版|詳解 Swift|たのしいSwiftプログラミング|
|---						|---|---|---|
|default initializer		|既定イニシャライザ|
|designated initalizer	|指定イニシャライザ|
|convenience initalizer	|簡易イニシャライザ|
|required initalizer		|必須イニシャライザ|
|failable initializer		|失敗のあるイニシャライザ|
|deinitalizer				|デイニシャライザ|
|memberwise initializer (*1)	|全項目イニシャライザ|
|stored property			|格納型プロパティ||保持プロパティ|
|computed property		|計算型プロパティ||算出プロパティ|
|type property				|タイププロパティ|タイププロパティ／静的プロパティ|
|lazy stored property		|遅延格納型プロパティ|
|property observer		|プロパティオブザーバ|
|optional					|オプショナル型||オプショナル型|
|implicitly unwrapped optional	|有値オプショナル型|暗黙的開示オプショナル型|
|unwrap						|開示／アンラップ|開示|アンラップ|
|optional binding			|オプショナル束縛|
|optional chaining		|オプショナルチェーン||optional chaining／オプショナル連鎖|
|nil coalescing operator	|nil併合演算子|
|external parameter name	|外部引数名|
|local parameter name		|内部引数名|
|type inference			|型推論||型推論|
|string interpolation		|文字列埋め込み||文字列の補間|
|subscript					|添字付け|
|associated type (*2)		|付属型|
|trailing closure			|接尾クロージャ|接尾クロージャ／トレイリングクロージャ|

* [*1] memberwise initializer
	イニシャライザの指定が無い構造体で使えるイニシャライザ。

* [*2] associated type
	protocol内でtypealiasを使って宣言する型パラメーター。


## 感想

『たのしいSwiftプログラミング』はSwiftの解説本というより、Swiftを使ったiOSプログラミング全般の入門書といった内容の本なので、そういう意味ではあまりふさわしくなかったか。

基本的に『詳解 Swift』の用語に合わせておくのが無難な気がするけど・・・　いくつか、微妙な訳もあるような。迷ったら、全部カタカナにしてしまう方が無難かも？

『詳解 Swift 改訂版』で微妙に用語が変わってたりするのが面白い。『暗黙的開示オプショナル型』は意味がわからなすぎたか。改訂版は改訂版で『エラーのある関数（throwing function）』なんて謎用語を生み出したりしてるけど。


## 情報元

* 詳解 Swift 改訂版
	電子版第1刷（2016年3月1日発行）

* 詳解 Swift
	初版1刷（2014年12月20日発行）

* たのしいSwiftプログラミング
	初版1刷（2014年10月26日発行）
DeviceOwnerによるアプリのサイレントインストール・アンインストール

[過去に書いた](http://qiita.com/machortz/items/5206773c6ece286e52a3)PackageInstaller.sessionによるサイレントインストール（ユーザ操作不要のバックグラウンドインストール）が、AndroidMからDevicePolicyManagerで利用できるようになった。ただし、利用するにはDeviceOwnerである必要がある。

[Android M; API Overview](http://developer.android.com/preview/api-overview.html#afw)
>Silent install and uninstall of apps by Device Owner: A Device Owner can now >silently install and uninstall applications using the PackageInstaller

# DeviceAdmin

AndroidではいわゆるMDM機能の実現のためにDeviceAdminという概念が存在する。
DeviceAdminの権限では端末のリモートワイプや強制ロック、カメラ等のデバイス利用制限が実行でき、
標準ではAndroidDeviceManagerというアプリがインストールされている。
これは設定>セキュリティ>端末管理アプリから確認可能であり、ここでチェックを入れるとそのアプリがDeviceAdminアプリになる。

DeviceAdminアプリのつくりかたは他に譲るとして、ここではDeviceOwnerの説明をする。

# DeviceOwner
DeviceOwnerは、特権DeviceAdminとでもいうべき存在で、DeviceAdminよりも多くの、そして強力な端末操作APIが利用できる。その一つがサイレントインストールなのだ。

ただし、DeviceAdminが一端末に複数存在しうるのに対し、DeviceOwnerは端末に一アプリのみが許されている模様。
（DeviceOwnerと似た概念でProfileOwnerというものも存在するが、ここでは割愛する）

DeviceOwnerになるためには、端末初回起動時にAndroidBeamによるプロビジョニング作業が必要であり、いまのところ一般ユースではほとんど関係なさそうである。
（今後各キャリアプリインされれば関係するかもしれない）
方法は気が向いたら別途ポストする。

開発時は以下のdpmコマンドを利用することで可能。
ComponentNameにはインストール済みのDeviceAdminのコンポーネント名を入れる。
このとき、端末にGoogleアカウントなどのアカウントが登録されていると失敗するので要注意。

```
adb shell dpm set-device-owner <ComponentName>
```

DeviceOwnerの情報は、端末の/data/system/device_owner.xmlに記載されている。
このファイルを自分で作成し端末を再起動することでもDeviceOwnerになることが可能である。

# サイレントインストール・アンインストール

http://qiita.com/machortz/items/5206773c6ece286e52a3
DeviceOwnerでこれを実行するだけである。

サンプルをGithubに置いておく。

https://github.com/machortz/MDeviceOwner

サイレントインストール・アンインストールが完了すると、以下のNotificationが表示される。
ここでの対象はfirefoxである。


![ssinstall.png](https://qiita-image-store.s3.amazonaws.com/0/64349/98efe775-312e-cb9f-6ea9-cba0ae5f6bc5.png)

![ssuninstall.png](https://qiita-image-store.s3.amazonaws.com/0/64349/b79fdceb-8473-cdd0-5886-5013ed2cc068.png)
技術英語 > others of [the same kind] / kind / type

「同じ種類の」という時「of the same kind」と使える。

http://www.dailywritingtips.com/particular-vs-specific/
> Both particular and specific mean “distinguished in some way among others of the same kind

<hr>
「種類」を表す時に使う言葉としてはkindやtypeなどがある。

kindとtypeの違いについては以下の様な意見もある
http://english.stackexchange.com/questions/15075/whats-the-difference-between-kind-and-type
> In short, type is used to differentiate one group from the rest and kind is used to link an individual to a group. They are sometimes interchangeable, but not always.
...
<font color=red>Type</font> refers to clearly distinguishing and essential characteristics or traits shared by members of a group. Its root meaning is "impression."
...
<font color=red>Kind</font>, on the other hand, usually refers to a group trait that is shared innately by the members (see "mankind" above). Its root meaning is "race" or "offspring."

リンク先には用例もありわかりやすい。
mosh使ってみた

## インストール

```bash:macの場合
brew install -y mobile-shell
```

```bash:Ubuntuの場合
apt-get install -y mosh
```

## ポート開放について

* 1ポートだけ開けるには UDP 1024 より大きいポート番号を指定。
* もしくはUDP 60000-61000を開ける。

1ポートだけの場合、以下のようにポート番号を指定できる。

```bash:
mosh -p 10000 servername
```

## LANGについて

moshサーバとクライアント側で同じロケール(ja_JP.UTF-8)が用意されていないと接続ができないことに注意。

```diff:/etc/locale.gen
- #ja_JP.UTF-8 UTF-8
+ ja_JP.UTF-8 UTF-8
```

```bash:
locale-gen
```

## sshdについて

moshで接続するにはsshdが起動しており、またポートも開放されていることが必要。

## iTerm2について

![スクリーンショット 2015-06-19 6.26.51.png](https://qiita-image-store.s3.amazonaws.com/0/25728/3d3c9298-1e16-653f-2783-3163045e373b.png)

iTerm2起動時に mosh すれば、接続元のデバイスを意識しなくなるでしょう。
Self-extracting Shell Script

シェルスクリプトとアーカイブをくっつけて自己解凍できるやつ。
Unixのインストーラでこういうのありますよね。
こういう技は素晴らしいですね。しかもお手軽だし。
http://stackoverflow.com/questions/20758981/self-extracting-script-in-sh-shell

スクリプトを作成。perlでもpythonでもshでもなんでもいいです。
スクリプトの最後だという識別子を入れておきます。ここでは#__EOF__#という識別子を書いています。

```bash:header.sh
#!/bin/sh
num=0
sed '1,/^#__EOF__#$/d' $0 | zcat - | tar xvf - 2>&1  |\
while read  mod
do
  num=`expr $num + 1`
  echo -ne "$num : $mod\r"
  sleep 0.1
done
echo ""

exit
#__EOF__#
```

スクリプトと展開したいアーカイブをくっつけます。

```bash
$ cat header.sh data.tgz > self-extract.tgz.bin
```

アーカイブに実行権限を付けて実行

```bash
$ chmod +x self-extract.tgz.bin
$ ./self-extract.tgz.bin
```
ほんとによく使うEclipseの機能・ショートカットまとめ

備忘録も兼ねて、これはよく使う！というEclipseの機能やショートカットをまとめました。
主にWindowsでJavaを書く人を対象にしています。
随時追加していく予定。
## メソッドなどを補完する
メソッド名や変数名等を途中まで入力し、`Ctrl + Space`を押すと補完してくれます。
## System.out.println()を補完する
`sysout`と入力し、`Ctrl + Space`と入力すると`System.out.println();`を補完してくれます。
似たような補完で、`syserr`や`systrace`があります。
## コメントアウトする
`Ctrl + /`で選択している行をコメントアウトしてくれます。
## ファイルを探す
`Ctrl + Shift + R`でファイルを検索するダイアログが表示されます。
## ファイル内で文字列を検索・置換する
`Ctrl + F`でファイル内の文字列を検索・置換するダイアログが表示されます。
![ファイル内の検索と置換.png](https://qiita-image-store.s3.amazonaws.com/0/17731/698e11d4-3482-e5ac-70c4-476bab93c0d5.png)
## メソッドなどの呼び出し元を探す
呼び出し元を検索したいメソッドにカーソルを合わせて、`Ctrl + Alt + H`を押すと呼び出し元のメソッドが検索されます。
## メソッドなどの宣言場所・実装場所を探す
`Ctrl`を押した状態でクラス名やメソッド名にカーソルを合わせると、そのクラスやメソッドの宣言場所・実装場所に飛ぶことができます。
![宣言場所等の検索.png](https://qiita-image-store.s3.amazonaws.com/0/17731/71d5f162-8b89-8027-a785-1c75acc27e18.png)
## ファイルを横断して文字列を検索・置換する
`Ctrl + H`を押すと検索ダイアログが表示されます。
その中のFile Searchのタブで、ファイルを横断した任意のスコープで文字列を検索・置換できます。
![ファイルの横断検索.png](https://qiita-image-store.s3.amazonaws.com/0/17731/dfea7ddf-c705-2763-2f37-fca08ce9ff37.png)
## タブ検索
`Ctrl + E`を押すと開いているタブの検索ができます。
よくタブをたくさん開いて仕事するので便利です。
## 実行する
`Ctrl + F11`でプログラムを実行できます。よく`Fn + F12`のスクリーンショットと間違えますが。。
## ブレークポイントを設定する（or 解除する）
`Ctrl + Shift + B`でブレークポイントの設定・解除ができます。
マウスでダブルクリックするより楽。
## デバッグ実行する
`F11`でデバッグ実行できます。
## 指定の行にジャンプする
`Ctrl + L`で指定の行にジャンプできます。
![指定行にジャンプ.png](https://qiita-image-store.s3.amazonaws.com/0/17731/037faaf0-0885-df2e-6575-52c1e7eac2aa.png)
## 矩形選択
`Shift + Alt + A`で矩形選択ができるようになります。もう一度押すと元に戻ります。
VBAHaskellの紹介 その18（reverseをfoldで実装）

「reverseをfoldlで実装する」、というネタを仕入れたのでやってみる。
これは簡単だ。

```vbnet
printM iota(1,10)
  1  2  3  4  5  6  7  8  9  10
printM foldl1(p_cons(ph_2, ph_1), iota(1,10))
  10  9  8  7  6  5  4  3  2  1
```
`cons`関数は Haskellの : 演算子と同じで配列の先頭に要素を追加するもので、プレースホルダ`ph_1`と`ph_2`を逆順にして`foldl1`すれば配列が逆順になる。
ただしこれは効率が悪く、ちょっと配列が大きくなると使いものにならない。土台がVBAなので、配列のサイズを動的に変える`cons`関数の効率を大きく改善するのは無理だ。
そこでこういう作戦とする。
・　最初に対象配列と同じ大きさの配列を作って、それに繰り返し操作をする。サイズは変えない。
・　fold関数内での返り値の取り回しを効率的にする（配列をコピーしない）。

最初に対象配列`a`と同じものを作り、逆順に N, N-1, N-2, ... , 2, 1, 0 の位置に書き込んでいくのだが、書き込み位置を保持する変数が必要になる。その変数と`a`を一緒につめ込んだジャグ配列を`foldl`の初期値に与えることにした。
`foldl`に与える関数`reverse_imple`および`reverse2`関数の実装はこうなる。

```vbnet
Function reverse_imple(ByRef a As Variant, ByRef b As Variant) As Variant
    ' a(0) : 書き込み位置
    ' a(1) : 書き込み対象配列
    a(1)(a(0)) = b      ' 値を書き込む
    a(0) = a(0) - 1     ' 書き込み位置を動かす
    swapVariant reverse_imple, a      ' コピーしないswapで返す
End Function
    Function p_reverse_imple(略...

'reverse関数
Function reverse2(ByRef a As Variant) As Variant
    Dim ret As Variant
    ' 書き込み位置と対象をつめ込んだ配列　VBA.Array(UBound(a), a) が初期値
    ret = foldl(p_reverse_imple, VBA.Array(UBound(a), a), a)
    swapVariant reverse2, ret(1)
End Function
```
これを使ってみる。

```vbnet
a = iota(1,1000000)
m = reverse2(a)
printM m, 5
  1000000  999999  999998  999997  999996
printM m, -5
  5  4  3  2  1
```
期待通りの結果となった。
パフォーマンスについては、VBAHaskellにはもともと普通のループによる`reverse`関数がユーティリティとして存在しており、それとの比較だとだいたい4.5倍程度の時間がかかった。配列長100万では手元のマシンで140ms対640msくらいだ。
* * *
[VBAHaskellの紹介 その17（大きな関数オブジェクト）](http://qiita.com/mmYYmmdd/items/8c862adfcf7e9c98ac82)
[VBAHaskellの紹介 その1（最初はmapF）](http://qiita.com/mmYYmmdd/items/c731edf943acc0a0ebe9)
ソース  https://github.com/mYmd/VBA
dllバイナリ：
https://github.com/mYmd/VBA/blob/master/bin/mapM (32bit-Office用)
https://github.com/mYmd/VBA/blob/master/bin/mapM64 (64bit-Officey用)
VBAコード添付済みExcelブック
[VBAHaskellほぼ全部入り.xlsm](https://github.com/mYmd/VBA/blob/master/bin/VBAHaskell%E3%81%BB%E3%81%BC%E5%85%A8%E9%83%A8%E5%85%A5%E3%82%8A.xlsm)
PlayFramework 2.4：Ebeanがプラグイン化されたのでくっ付ける

#発端
Play 2.4 Migration Guide
https://www.playframework.com/documentation/2.4.x/Migration24

Ebean dependencyの項
Ebeanを外部プロジェクト化することで、
Playのライフサイクルとは独立したライフサイクルを持たせ、
互いに依存しないようにする……らしきことが書いてある

さらに、Play2.3まではplay.db.ebean.Modelを継承してModelクラスとしていたが、
このパッケージは非推奨になり、com.avaje.ebean.Modelに置き換えられた

#編集したファイルと追記内容
公式ドキュメントとほとんど一緒

* **project/plugins.sbt**<br>
以下を追記<br>
`addSbtPlugin("com.typesafe.sbt" % "sbt-play-ebean" % "1.0.0")`
* **build.sbt**<br>
libraryDependenciesにjavaEbeanを書いてはいけなくなった<br>
プラグインとして有効化する<br>
`lazy val myProject = (project in file(".")).enablePlugins(PlayJava, PlayEbean)`<br>
* **application.conf**<br>
どのパッケージ以下をモデルにするのかを設定<br>
`ebean.default = ["models.*"]`

終わったらactivator updateで更新
その後はいつものように使うことができる

#play.db.ebeanからcom.avaje.ebeanに移行して変わること
* **Finderが非推奨になった**<br>

Finderの代わりにFindを使うと良いらしい

`public static Finder<Long,String> finder = new Finder<>(Long.class, String.class);`
↓
`public static final Find<Long,String> finder = new Find<Long,String>(){};`

https://github.com/ebean-orm/avaje-ebeanorm
https://github.com/ebean-orm/avaje-ebeanorm/issues/282

※ Finderのままこう書いても良いらしい
`public static final Finder<Long, User> finder = new Finder<Long, User>(User.class);`

#番外 activator eclipseコマンドが動かないとき
何も考えずこのコマンドを打ったら以下のようなエラーが出た
![eclipse_error.png](https://qiita-image-store.s3.amazonaws.com/0/77685/8c3f4411-065b-4824-9a50-49e2853e7df8.png)

###対策（2015/06/25更新）
Setting up your preferred IDE
https://www.playframework.com/documentation/2.4.x/IDE

上記によるとsbteclipseプラグインの4.0.0以上が必要らしい

~~しかし現時点でsbteclipseのreleasesにバージョン4.0.0は存在せず、
そのままコピペしてもライブラリを見つけられない（いずれ出てくるものとして予めこう書いてあるのだろうか……）
→https://github.com/typesafehub/sbteclipse~~

~~とりあえずバージョン4.0.0-RC2を使えば良さそう
以下をproject/plugins.sbtにコピペして解決
`addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "4.0.0-RC2")`~~

4.0.0リリース！
`addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "4.0.0")`
TeXの組み込み命令/ユーザ定義命令を確認する


> 環境：
> ・OS X Yosemite (10.10.3)
> ・TeXLive 2015 + YaTeX


TeXで文章を書いていると，定義済みの命令などの空白や記号などが気にくわないことが多々あります．多々．

そんなときは，その命令の定義を見ながら何らかの値を調整したり，にた命令を見ながら自分の命令を定義したいですよね．


とはいえ，その命令が定義されているファイルをいちいち見に行くのは面倒... ~~そもそもどこで定義されているのかもよく分からない~~


ということで，以下の方法で確認しましょう．

## .texファイル内で確認する方法
以下の二つは.texファイル等に直接記述し，実際にタイプセットすることで定義を表示するものです．
### \meaningを用いる場合

```tex:meaningでitemizeを見てみる
\meaning\itemize
```

#### 結果
タイプセットして得られるdvi(またはpdf)に出力されます．
![スクリーンショット 2015-06-18 12.35.25.png](https://qiita-image-store.s3.amazonaws.com/0/61270/ac6434ac-48d6-26ad-a082-2130d757a95d.png "スクリーンショット 2015-06-18 12.35.25.png")
">"が化けてますね．後，"\\"はダブルクオーテーションに置き換わっているようです．

### \showを用いる場合

```tex:showでitemizeを見てみる
\show\itemize
```

#### 結果
タイプセットする際にコンソールに出力されます． ~~水色好きです~~
![スクリーンショット 2015-06-18 12.42.07.png](https://qiita-image-store.s3.amazonaws.com/0/61270/4d3d2977-1553-191b-4b1b-698c92d6fcec.png "スクリーンショット 2015-06-18 12.42.07.png")

こちらの方が\\meaningより読みやすいですね．

### \theを用いる場合（値を確認
\\headsep等の **値** を確認するには，\\theを用いましょう．
というのも，\\showなどで確認しても，定義である\\dimen77が返ってきます．

## texdefを用いる方法
さて，いよいよ本命の登場です．
> texdefはTeXLiveに含まれているようなので，TeXLiveを使っている方は導入済みだと思われますが，そうでない方は[こちら](http://www.ctan.org/pkg/texdef)から

詳しい使い方は

```bash:texdef
texdef -h
```

を見て頂ければ良いのですが，よく使うものだけ挙げておきます．

```bash:いくつかの例
#itemizeの定義を確認
texdef -t latex itemize

#itemizeの定義をソース通りに確認
texdef -t latex -s itemize

#headsepなどの定義と値は同時に確認可能
#-c でclassを指定
texdef -t latex -c book headsep

#nrubyパッケージに含まれる命令を列挙する
texdef -t latex -l -p nruby
```

こんなもんでしょうか？
複雑なものはソース通りに確認する方がインデント有って読みやすくて良いですね．


では，良いTeXLifeを
Swift 丸アイコン内、テキストセンター描画

#Swift 丸アイコン内、テキストセンター描画
UIViewのカスタムクラスにて、overrideしたdrawRect内で、

```swift
// 丸描画
let roundRect = UIBezierPath(roundedRect: CGRectMake(1, 1, 28, 28), cornerRadius: 10)
UIColor.blueColor().setStroke()
roundRect.lineWidth = 2
roundRect.stroke()

// フォント属性
let fontAttr = [NSFontAttributeName: UIFont.systemFontOfSize(10)]
// テキスト
let str = self.initial_txt! as NSString!
// サイズ取得
let size = str.sizeWithAttributes(fontAttr)

let x_pos = (roundRect.bounds.size.width - size.width) / 2
let y_pos = (roundRect.bounds.size.height - size.height) / 2

// テキスト描画
str.drawAtPoint(CGPointMake(roundRect.bounds.origin.x + x_pos, roundRect.bounds.origin.y + y_pos),
    withAttributes: fontAttr)

```


#結果
![initial.png](https://qiita-image-store.s3.amazonaws.com/0/8972/af5fd0dc-a1c8-613c-5134-ac295bfc837e.png)



##参考
How to use NSString drawInRect to center text?
http://stackoverflow.com/questions/477509/how-to-use-nsstring-drawinrect-to-center-text
文章から特定のドメインのURLを抽出してリンクとして表示させる

基本的にURLはリンクとして扱わないようにしてあるメッセージを表示するときに、そのメッセージ内の特定ドメインのみ、そのURLをリンクに書き換えたかったので調べてみた。

```app/helpers/mobile/message_helper.rb
# coding: utf-8
require "uri"
module Mobile::MessageHelper
  
  def text_url_to_link(text)
    URI.extract(text, ['http','https']).uniq.each do |url|
      if (URI.parse(url).host == "www.hogehoge.com")
        sub_text = ""
        sub_text << "<a href=" << url << " >" << url << "</a>"
        text.gsub!(url, sub_text)
      end
    end
    return text
  end

```

URIライブラリというのがありそのなかのextractメソッドがこういうときに使用できるらしい。便利だーー、これがなかったら正規表現？くらいしか方法が思いつかなかったので非常に助かりました笑
viewsではこんな感じで使用しました。

```app/views/mobile/messages/message.html.erb

  <%= text_url_to_link( simple_format( sanitize @message.body ) ).html_safe %>

```

最初.html_safeを書き忘れててリンクにならなくて詰まっていましたが解決しました、詳しくはこちらを参考にしてください　ー＞ [[Rails]ERBのエスケープを自在に扱おうぜ](http://qiita.com/satoken0417/items/df4098a122d05d69a3e6)

ちなみにお気付きの人もいると思いますが、今回スマホで対応したかったんですよね。。。ただURLに/mobile/をjoinしてもリンクにならなかったんでそこらへんはサーバーに任せてしまいました笑。方法があるなら教えて欲しいです。。。。
メモ：Device tree blob (.dtb)をDevice tree source (.dts)に戻す

Device Tree Compiler (DTC)は、通常はDevice tree source (.dts)からDevice tree blob (.dtb)に変換するものだが、逆変換もできるらしい。

Ubuntu 15.04にDTCをインストールして、確認してみる。

```
$ sudo apt-get install device-tree-compiler
```

手持ちのRaspberry Piのdtbファイルを変換してみる。

```
$ dtc -I dtb -O dts -o bcm2708-rpi-b.dts bcm2708-rpi-b.dtb 
$ cat bcm2708-rpi-b.dts
/dts-v1/;

/ {
	#address-cells = <0x1>;
	#size-cells = <0x1>;
	compatible = "brcm,bcm2708";
	model = "Raspberry Pi Model B";
	interrupt-parent = <0x1>;

(以下省略)
```
random French number generator with python


# 基本の定義

```py:数字生成関数
# discussion http://codegolf.stackexchange.com/questions/35435/spell-out-numbers-in-french
# code from http://repl.it/WLD/2
def f(a):b=int(a/60)*10+10;d[a]=d[a-a%b]+(' et ','-')[a%10!=1or a>80]+d[a%b]
d=dict(zip([i for i in range(17)]+[i for i in range(20,70,10)]+[80,100],'zéro un deux trois quatre cinq six sept huit neuf dix onze douze treize quatorze quinze seize vingt trente quarante cinquante soixante quatre-vingt cent'.split()))
[f(v)for v in range(100)if(v in d)<1]
d[80]+='s'
# now d[] contains 0 to hundred
d[0] = ''


def get10(a):
    return d[a]

def getNum(a,b):
    m = ['', '', 'deux', 'trois', 'quatre', 'cinq', 'six', 'sept', 'huit', 'neuf']
    if 2 <= a <= 9:
        return m[a] + ' ' + b + 's '
    if 1 == a:
        return b + ' '
    return ' '

def get1000(a): return getNum(a,'mille') # mille doesn't have "s" actually...
def get100(a): return getNum(a,'cent')
```


# 作る

ランダムな数字のフランス綴り

```py3:random_French_number_generator
import random
for i in range(5):
    m = [random.choice(range(3)), random.choice(range(10)), random.choice(range(100))]
    mm = m[0] * 10 + m[1]
    print(int(mm) if mm > 0 else '' , "{0:02d}".format(m[2]), ',', get1000(m[0]) + get100(m[1]) + get10(m[2]), sep='')
```

結果例

```text:output
2752,deux milles sept cents cinquante-deux
1616,mille six cents seize
298, deux cents quatre-vingt-dix-huit
1658,mille six cents cinquante-huit
2138,deux milles cent trente-huit
```

ランダムな価格のフランス綴り

```py3:random_French_prices_generator_in_Euros
for i in range(5):
    m = [random.choice(range(100)), random.choice(range(100))]
    print(m[0], '.', "{0:02d}".format(m[1]), ',', get10(m[0]) + (' euros ' if m[0] > 0 else '') + get10(m[1]) + (' centimes' if m[0] == 0 else ''), sep='')
```

結果例

```text:output
19.15,dix-neuf euros quinze
32.33,trente-deux euros trente-trois
72.24,soixante-douze euros vingt-quatre
81.45,quatre-vingt-un euros quarante-cinq
52.48,cinquante-deux euros quarante-huit
```

# 何に使うの？

フランス語の学習．

https://quizlet.com/86236567/random-french-numbers-from-1-to-2999-flash-cards/

https://quizlet.com/86236880/random-french-price-numbers-in-euros-from-001e-to-9999e-flash-cards/
Nagiosのプラグイン開発にsensu-pluginを使うと捗る

社内のNagiosの監視スクリプトはお手製Perlスクリプトかcommunity pluginを使っているのだけど、この度訳あってrubyでnagios pluginを書くことにしたので楽に書く方法を調べてみた。

結論から先に述べるとNagiosのプラグイン開発でも[sensu-plugin](https://github.com/sensu-plugins/sensu-plugin)使うとよい。

監視ロジックを除くと以下3点がどの監視スクリプトでも共通の処理になる。

1. CLIのオプションパース
2. 1行標準出力
3. 終了コード選択しexit (0 => OK, 1 => WARN, 2 => CRITICAL, 3 => Unknown)

何個か作ってるとこれらを楽にしたくなる。1については楽に書きたい。2と3については1行で書きたいのと数字覚えずに`ok("message")`こういうメソッドでexitできるようにしたい。

一方、Sensuという監視ツールがある。SensuのプラグインはNagiosコンパチブルな仕様だ。Sensuには[sensu-plugin](https://github.com/sensu-plugins/sensu-plugin)というSensuのプラグインをrubyで作るためのCLIフレームワークを提供してくれる。

sensu-pluginを使った例は以下のとおりで、`Sensu::Plugin::Check::CLI`を継承するクラスを作り、run()メソッドに監視ロジックを書いて監視結果がOKならok()メソッドを1行メッセージ付きで呼べばよい。CLIのオプションはクラス中にDSL的に記述すればよい。便利!!

```rb:mycheck.rb
require 'sensu-plugin/check/cli'

class MyCheck < Sensu::Plugin::Check::CLI

  check_name 'my_awesome_check' # defaults to class name
  option :foo, :short => '-f' # Mixlib::CLI is included

  def run
    ok "All is well"
  end

end
```

Nagiosのプラグインでもこれ使いたい! rubygemsで探してみた。

**[ruby-nagios-plugin](https://github.com/jhstatewide/ruby-nagios-plugin)**

* 悪くないけど、option parser に OptionParserを使っている。OptionParserはAPIがプリミティブなのでx。あと-wと-cが予約されてるのがx


**[nagiosplugin](https://github.com/bjoernalbers/nagiosplugin)**

* メッセージの出力とexitコードの制御だけラップしてくれる
* オプションパーサの機能は無い。継承先でパースしないといけない。

見つかったのはこの2個で、残念ながら自分がほしいgemではなかった。

そこでおもったのは**sensu-pluginそのまま使えばいいか**。プラグインの外部仕様同じなのでNagiosで使うプラグインもsensu-pluginで書ける。

### sensu community plugins

[sensu-plugins](https://github.com/sensu-plugins)はSensuのコミュニティプラグイン集だけどNagiosでも使える。

また、rubyでプラグイン書いたからにはテストも書きたい。[sensu-plugins](https://github.com/sensu-plugins)のRSpecテストを参考にするとよい。

### まとめ

sensu-pluginを使うとRubyでNagiosプラグインを書くのが捗る。
TypeScript 1.5 + ES6 を今すぐ使う方法を調べた


# TypeScript + ES6 が使いたい!

JavaScript には ES6 (ES2015) になって多彩な便利機能が追加され、babelなどのトランスパイラを使えば今すぐES6を使った快適生活が実現できる。
また、TypeScriptも、JavaScriptをベースにしながらも静的型付きプログラミングを実現しており、実行時の下らない型エラーなどから解放されてこちらも非常に快適だ。
TypeScript の最新版 (もうすぐリリースされるといいなあ) 1.5では、[ES6の機能のサポートが多く追加されており] (https://github.com/Microsoft/TypeScript/wiki/Roadmap#15) 、TypeScript と ES6 の快適さを両方享受することができる。

しかし、1.5 はまだ正式リリースされておらず、実際ES6と組み合わせて使おうとすると問題がいくつか起こるようだ。そこで、現時点で TypeScript 1.5 + ES6 を合わせて使ううまい方法を試してまとめてみた。

# インストール

TypeScript 1.5 はまだ正式リリースされていなので、とりあえずGitHubから最新版を入れる。

```
npm install --save-dev git://github.com/Microsoft/TypeScript
```

# tsconfig.json

`target` を `es6` に設定する。
`es5` でもある程度 ES6 の機能を ES5 としてコンパイルしてくれるようだが、

* `Map`/`Set` などの型定義がない
* [CommonJS/ES6 module の interop がうまくいかない](https://github.com/Microsoft/TypeScript/issues/2719)

などの問題があるようなので、TypeScript側ではES6を出力して、ES6 -> ES5 の変換は Babel などに任せたほうがよさそう。

```json:/tsconfig.json
{
    "version": "1.5.0-beta",
    "compilerOptions": {
        "target": "es6",
        ...
    },
    ...
}

```

# DefinitelyTyped の型定義が動かない

現在の TypeScript 1.5 + ES6 output の組み合わせだと、`export =`や`import hoge = require("hoge");` のような、旧来のCommonJSモジュールを扱う方法でエラーが出る。代わりに、ES6 module を使用しなければならない。

しかし、TypeScriptの型定義がが集まっていて重宝されている[DefinitelyTyped](https://github.com/borisyankov/DefinitelyTyped) の型定義では、当然旧来のCommonJS方式が使われているため、 **DefinitelyTyped からインストールしてきた型定義ファイルがことごとくエラーになる**。([問題は報告されているようだ](https://github.com/Microsoft/TypeScript/issues/2929))

### 例: `node.d.ts` を読み込んだ場合

こんな感じのエラーが延々と出る。

```
typings/node/node.d.ts(395,5): error TS1202: Import assignment cannot be used when targeting ECMAScript 6 or higher. Consider using 'import * as ns from "mod"', 'import {a} from "mod"' or 'import d from "mod"' instead.
```

## 解決策

とりあえず、DefinitelyTypedからインストールしてきた`d.ts`のCommonJSスタイルの部分を、ES6 moduleスタイルに手動で修正するのが一番ましな解だと思う。

```
-    import foo = require("foo");
+    import foo from "foo"
```

```
-    export = foo;
+    export default foo;
```

現時点ではこんな感じで延々と解決していくしかなさそう…?

# まとめ

TypeScript 1.5 + ES6 は非常に快適だが、現時点ではいくつか問題があるようなので、上のような方法で解決していくのが良さそうだと思った。
(他のより良い方法があったら教えていただけるとすごくありがたいです。あと他の人がどのようにやっているのか知りたい)

ここで挙げたような方法を実際に使って TypeScript 1.5 で開発してみた repository はこれ:

* https://github.com/seanchas116/macaron
gsubで正規表現を用いた置換を行う際、$1でグループの参照がうまくいかない場合は'\1'を使え、またはブロックを使え


# 結論
`$1, $2, ..., $n`のかわりに`\1, \2, ..., \n`を使え。

2015/06/30追記
`String#gsub(regex, substring)`の代わりに`string#gsub(regex){ substring }`を使う方を推奨。
理由はバックスラッシュのエスケープがトラブルの元となり得るため。

# `$1`で良い場合
`Regexp#match`, `String#match`, `Regexp#=~`, `String#=~`を使う場合は`$1`で参照できる。

```ruby
cool = 'coooooooooooooool'
regex = /.(o+)./

regex.match(cool)
puts $1
  # => "ooooooooooooooo"

cool.match(regex)
puts $1
  # => "ooooooooooooooo"

cool =~ regex
puts $1
  # => "ooooooooooooooo"
  
regex =~ cool  
puts $1
  # => "ooooooooooooooo"  
```

# `$1`でダメな場合
`String#gsub`では使えない。

## どうだめなのか？
思っているように置換をしてくれない。しかし、`puts $1`で書き出すと正しく抽出できている。


```ruby
# ※$1には値が既に入ってしまっているため、ここでpryを再起動し$1.nil? == trueにしてあります

cool = 'coooooooooooooool'
regex = /.(o+)./

cool.gsub(regex, "s#{$1}up")
  # => "sup"
puts $1
  # => "ooooooooooooooo"  
```

## どうすれば良いのか

### `$1`の代わりに`\1`を使う方法
`$1`の代わりに`\1`を使いましょう。さらに[式展開](https://docs.ruby-lang.org/ja/latest/doc/spec=2fliteral.html#exp)せず、普通の文字列として与えて下さい。

```ruby
# ※`$1`には値が既に入ってしまっているため、ここでpryを再起動し`$1.nil? == true`にしてあります

cool = 'coooooooooooooool'
regex = /.(o+)./

cool.gsub(regex, 's\1up')
  # => "soooooooooooooooup"
puts $1
  # => "ooooooooooooooo"  
```

### ブロックを使う方法

```rb
# ※`$1`には値が既に入ってしまっているため、ここでpryを再起動し`$1.nil? == true`にしてあります

cool = 'coooooooooooooool'
regex = /.(o+)./

cool.gsub(regex){"s#{$1}up"}
  # => "soooooooooooooooup"
puts $1
  # => "ooooooooooooooo"  
```

# 参考

- http://blog.ethanvizitei.com/2010/06/using-regex-groups-for-rubys-gsub.html
- http://ruby-doc.org/core-2.2.0/Regexp.html

# Link
Original: [gsubで正規表現を用いた置換を行う際、$1でグループの参照がうまくいかない場合は'\1'を使え](http://blog.dogwood008.com/2015/06/UseBackSlash1InsteadOfDollar1WhenUseStringGsub.html)
AccessVBAでサブフォームの実体の参照を捕まえる

#AccessVBAでサブフォームの実体の参照を捕まえる

帳票フォームをLoadする時にサブフォーム部品の中のFormのインスタンスの参照を取りたいと思った事はないだろうか。
私はよくある。
何故なら、サブフォームに定義したイベントを監視したり、プロシージャをCallしたりしたいからだ。
画面部品の『サブフォーム』をそのまま使うのでは、リンク項目で従属テーブルをぶら下げて表示したり、Requeryプロシージャで再表示したりするくらいしかできず、やきもきさせられる。

そんな時は型を明示してサブフォームの実体を取り出せばよい。そのやり方を以下に示す。
レポートでも同じように出来るのかは検証していないが、多分上手く行くだろう。

##間違った方法１：デザインしてあるサブフォームから取り出そうとする
普通の手順では、デザインビューを使ってサブフォーム部品を貼り付け、ソースオブジェクトを設定する。従属テーブルであればここでリンク項目も設定しておけば、大体上手くいく。
サブフォームには最初から目当てのフォームが表示出来ているので、後はこれを取り出してやればよさそうだ。
この時のコードは以下のようになる。

```vbnet:Form_Main
Private WithEvents m__SubFoo As Form_SubFoo

Private Sub Form_Load()
  Set m__SubFoo = Me.subform.Form '<- Nothing
End Sub
```

メンバ変数の参照がNothingのままなので、操作しようとするとエラー（ぬるり）になる。
As Newで宣言すればエラーは回避されるが恐らく望んだ動作にはなるまい。

Loadイベントの実行順を知っている人なら、何が起こっているのか分かるかと思う。
サブフォームの中身のインスタンスの生成は親フォームのOpenが終わるまで遅延されるので、このタイミングではFormプロパティを見ても参照を取る事ができない。

##間違った方法２：Newしてからサブフォームにはめ込もうとする
方法１ではサブフォームの中身が出来上がってないのが悪いのだった。
そうであるならば、自分でインスタンスを作ってやれば解決しそうにみえる。
別ウィンドウとして開く時みたいに目的のフォームを明示的にNewするだけだし、簡単そうだ。
この時のコードは以下のようになる。

```vbnet:Form_Main
Private WithEvents m__SubFoo As Form_SubFoo

Private Sub Form_Load()
  Set m__SubFoo = New Form_SubFoo
  Set Me.subform.Form = m__SubFoo '<- RuntimeError. ReadOnly Property!
End Sub
```

なんてこった。万事休すだ。
サブフォームのFormプロパティは読み取り専用なので、外からSetできない。
Openイベントの完了まで待たないと取れないとなるとイベントを監視するためのインスタンスを取り出す機会がない。
Timerでタイミングをずらして上手くいくように祈るしかないのだろうか。

##正しい方法：たった一つの冴えたやり方
もちろん、解決策はある。しかもシンプルなやつだ。
普段使わないであろうTimerなんぞに登場してもらう必要もない。
正解のコードは以下のようになる。

```vbnet:Form_Main
Private WithEvents m__SubFoo As Form_SubFoo

Private Sub Form_Load()
  Me.subform.SourceObject = "SubFoo" '<- include:New Form_SubFoo
  Set m__SubFoo = Me.subform.Form
End Sub

Private Sub m__SubFoo_Notify(ByVal msg As String)
  Call MsgBox(Prompt:=msg, Buttons:=vbOkOnly)
End Sub
```
```vbnet:Form_SubFoo
Public Event Notify(ByVal msg As String)

Private Sub Command1_Click()
  RaiseEvent Notify("SubFoo.Command1_Clicked!")
End Sub
```

サブフォームのSourceObjectプロパティはFormモジュールの名前を設定する項目だが、
コード内でSetしてやると、その場でFormのインスタンスが生成される。
つまり、すぐ次の行でFormプロパティをGetして参照を得ることができる。

これでめでたくイベントを監視できるし、必要であればプロシージャをCallすることができる。
（ここではプロシージャCallの例は割愛している）
Docker Remote APIのためにnginxでSSLクライアント認証

# Docker Remote API

HTTP経由でDockerを利用できるようにするAPIです。
そもそもDockerのコマンドはこれを利用して動いてるみたいです。

思いつきだけでこれを外部から使えるようにします。
ただし、管理者権限で動作してるので安全に気を配る必要があります。

# SSL クライアント認証

というわけでセキュリティ面を担保するのにSSLのクライアント認証を利用して行きます。
証明書を持っていないクライアントからの接続は出来なくなるので安心！

# 環境

Ubuntu 14.04.2 LTS
Docker 1.6.2
nginx 1.8.0

# 手順

## 概要

* （各種インストール）
* CA証明/サーバー認証鍵/クライアント認証鍵の生成
* nginxの設定
* グループ設定（要らないかも？）

## 認証鍵・証明書の作成

```bash

# openssl コマンドきっとこんな感じ
# genrsa: 秘密鍵の生成
# req -x509: 自己証明書の生成（？）
# req -key: 証明要求の生成
# x509: CAを使い証明書を生成

# 証明書を生成するさいの入力項目で要求されるCommon NameはFQDNの入力が必要です。
# ここで違うと最終的に認証エラーになってしまうので注意

# CAの証明書を作ります（鍵→証明書）
openssl genrsa -aes256 -out ca.key 4096
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt

# サーバーの鍵・証明書を作ります
# またサーバーの鍵はパスフレーズを解除しておきます（nginxで読み込むたびに入力する手間を省くために）
openssl genrsa -aes256 -out server.key 4096
openssl rsa -in server.key -out server_nopass.key
openssl req -new -key server_nopass.key -out server.csr
openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out servre.crt

# クライアントの鍵・証明書を作ります
# サーバーの証明書とは別のシリアルを割り当てます（同じだとだめなようです）
# また、クライアント側の証明書にCAの証明書を含めます
openssl genrsa -aes256 -out client.key 4096
openssl req -new -key client.key -out client.csr
openssl x509 -req -days 3650 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 02 -out client.crt
cat client.key client.crt ca.crt | openssl pkcs12 -export -clcerts -out client_bundle.p12

```

## nginx 設定ファイルの編集

```nginx

upstream docker_api {
  server unix:/var/run/docker.sock;
}

server {

  # SSL接続なのでPort:443 のSSL指定
  listen 443 ssl;
  ssl on;

  # サーバー側の鍵と証明書を設定
  ssl_certificate server.crt;
  ssl_certificate_key server.key;

  # クライアント認証の設定
  ssl_client_certificate ca.crt;
  ssl_verify_client on;
  ssl_verify_depth 2; # よくわかってない

  location / {
    proxy_pass http://docker_api;
  }
}
```

## nginxユーザーをdockerグループに追加

```bash

gpasswd -a nginx docker

```
Crystalの型を限定した配列と多機能な暗黙のto_proc #crystal #ruby

## :sparkles::gem::sparkles: 概要
Crystalの型を限定した配列と多機能な暗黙のto_procを紹介します
## <i class="fa fa-child" style="font-size:1em;"></i> Playground
環境構築せずにPlaygroundでサンプルコードを試せます。
当ページのサンプルコードを実行してみたい方は、以下URLからどうぞ。

<i class="fa fa-external-link" style="font-size:1em;"></i> [playground- crystal](http://play.crystal-lang.org/#/cr)
## <i class="fa fa-cube" style="font-size:1em;"></i> 型
### 型付き配列
~~~ruby
a = Array(Int32).new
a << 1
a << 2
print a, "\n"
# a << 'a' # Int32以外を指定するとエラーが発生する
~~~

* 出力

~~~ruby
[1, 2]
~~~

※ Rubyと同様に複数の型を扱うことも可能

~~~ruby
[1, 'a', 1.1].each{|e|p e.class}
~~~

* 出力

~~~ruby
Int32
Char
Float64
~~~

## <i class="fa fa-cube" style="font-size:1em;"></i> 暗黙のto_procがより高機能
Rubyでは暗黙のto_procを利用して、以下のような簡潔な記載が可能です。
暗黙のto_procについては下記リンクを参照

<i class="fa fa-external-link-square" style="font-size:1em;"></i> [Ruby | 暗黙の to_proc で遊ぶ - Qiita](http://qiita.com/tbpgr/items/bf2df9df2ecf75cc3d2e)
### :gem: Rubyの場合
`&:method_name`で暗黙のto_procを呼び出す。

~~~ruby
print ('a'..'e').map{|e|e.upcase} #=> ['A', 'B', 'C', 'D', 'E']
print ('a'..'e').map(&:upcase) #=> ['A', 'B', 'C', 'D', 'E']
# メソッドチェーンできない
# print ('a'..'e').map(&:upcase.succ) # => ['B', 'C', 'D', 'E', 'F']
# 引数付メソッドは利用できない
# print ('a'..'e').map(&:to_i(16)) # => [10, 11, 12, 13, 14]
~~~

### :sparkles::gem::sparkles: Crystalの場合
`&:method_name`の代わりに`&.method_name`になっています

~~~ruby
print ('a'..'e').map{|e|e.upcase} #=> ['A', 'B', 'C', 'D', 'E']
print ('a'..'e').map(&.upcase) # => ['A', 'B', 'C', 'D', 'E']
# メソッドチェーンできる！
print ('a'..'e').map(&.upcase.succ) # => ['B', 'C', 'D', 'E', 'F']
# 引数付メソッドを利用できる！
print ('a'..'e').map(&.to_i(16)) # => [10, 11, 12, 13, 14]
~~~

ちなみにcrystalはreduceがない模様。injectのみ。
## <i class="fa fa-file-text" style="font-size:1em;"></i> メモ
`Enumerable#map` と `Enumerable#collect`, `Enumerable#inject` と `Enumerable#reduce`
のようなエイリアスによるシンタックスシュガーですが、Crystalでは1つだけを残しているようです。
Crystalは`Enumerable#map` , `Enumerable#inject`を残し、
`Enumerable#collect`, `Enumerable#reduce`を削除しています。

以下、Enumerableのドキュメントをみると片方のメソッドしか存在しないことが分かります。
（実際に実行すると、` undefined method 'collect'`のようなエラーが発生します）

* [Enumerable - Crystal Docs](http://crystal-lang.org/api/Enumerable.html)
PHPで２分木構造のinsert

#PHPで２分木構造のinsert

##コード

```php:TreeNode
class TreeNode {
    public $value;
    public $leftNode;
    public $rightNode;
}
```

```php:BinaryTree
require_once 'TreeNode.php';

class BinaryTree {
    public static function createNewNode($value) {
        $node            = new TreeNode();
        $node->value     = $value;
        $node->leftNode  = null;
        $node->rightNode = null;
        return $node;
    }

    public static function insertNode($value, $node) {
        if ($node->value == $value) {
            return false;
        }

        if ($node->value > $value) {
            //ノードの値より小さい時。左の子の木に
            if ($node->leftNode != null) {
                //既に左の木にデータがある時、次の子に進む
                self::insertNode($value, $node->leftNode);
            } else {
                //左の木にデータを挿入
                $node->leftNode = self::createNewNode($value);
                return true;
            }
        } else {
            //ノードの値より大きい時。右の子の木に
            if ($node->rightNode != null) {
                //既に右の木にデータがある時、次の子に進む
                self::insertNode($value, $node->rightNode);
            } else {
                //右の木にデータを挿入
                $node->rightNode = self::createNewNode($value);
                return true;
            }
        }
    }
}
```

```php:binaryTreeTest
/* 
2分木のテスト
 */

require_once './../part/TreeNode.php';
require_once './../part/BinaryTree.php';

$tree = new TreeNode();
$tree->value = 1000;
BinaryTree::insertNode(2000, $tree);
BinaryTree::insertNode(300, $tree);
BinaryTree::insertNode(4000, $tree);
BinaryTree::insertNode(5000, $tree);
BinaryTree::insertNode(100, $tree);
BinaryTree::insertNode(50, $tree);
BinaryTree::insertNode(10, $tree);
BinaryTree::insertNode(3000, $tree);
BinaryTree::insertNode(400, $tree);
echo '<pre>';
var_dump($tree);
echo '</pre>';

```
##参考書籍
プログラミングの宝箱 アルゴリズムとデータ構造 第2版 

##GitHub
https://github.com/Khanashima/algorithm
2次元 Poisson disc（点集合）

こんにちは。
2次元 Poisson disc 点集合を生成してみました。ランダムに分布する点の集合ですが、定めた距離以下には互いに接近しない制約付きです。（なお、ここ： [Random Points on a Sphere Topology-Preserving ] (https://www.jasondavies.com/maps/random-points/) では球面上の Poisson disc 点分布も扱っています。）

![poissondisc.png](https://qiita-image-store.s3.amazonaws.com/0/54617/e247fe2a-32d8-81d5-0c4a-56716555e0d3.png)

```poissondisc2d.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from __future__ import print_function
import sys
import scipy
import numpy as np
import matplotlib.pyplot as plt

def addrandom(p, scale):
    theta = np.random.uniform(0, 2) * scipy.pi
    r = scipy.sqrt(np.random.uniform(1, 4)) * scale
    return [p[0] + r * scipy.cos(theta), p[1] + r * scipy.sin(theta)]

def dist2(x, y):
    return sum([(a - b)**2 for a, b in zip(x, y)])

def near(p, candid, scale):
    for q in candid:
        if dist2(p, q) < scale**2:
            return True
    return False
    
def idxpnt(p, scale):
    return [int(np.floor(x/scale/3.0)) for x in p]

def getproximity(points, idx):
    pnts = []
    for k in range(-1,2):
        for l in range(-1,2):
            pnts += points.get((idx[0]+k,idx[1]+l), [])
    return pnts

def pointsappend(points, p, scale):
    idx = tuple(idxpnt(p, scale))
    pnts = points.get(idx, [])
    pnts.append(p)
    points[idx] = pnts
    return 0

def poissondisc2d(scale, ntry, nmax):
    npnt = 1
    candid = [[0.0 for _ in range(2)]]
    points = {}
    points[tuple(idxpnt(candid[0], scale))] = list(candid)
    for _ in range(nmax*2):
        i = np.random.randint(0, len(candid))  
        created = False
        p0 = candid[i]
        pnts = getproximity(points, idxpnt(p0, scale))
        for _ in range(ntry):
            p = addrandom(p0, scale)
            if not near(p, pnts, scale):
                candid.append(p)
                pointsappend(points, p, scale)
                created = True
                break
        if created:
            npnt += 1
            if npnt >= nmax:
                break
        else:
            del candid[i]
    return sum(points.values(), [])  # flatten

def plotpoints(points):
    psiz = 8
    plt.scatter([x[0] for x in points], [x[1] for x in points], s=psiz, c='r', edgecolor='none')
    plt.grid()
    plt.axes().set_aspect(1)
    plt.show()
    return 0

def main():
    scale = 1.0
    ntry = 18
    nmax = int(sys.argv[1]) if len(sys.argv) >= 2 else 1000
    points = poissondisc2d(scale, ntry, nmax)
    plotpoints(points)
    exit(0)

if __name__ == '__main__':
    main()
```
phpでvar_dumpした時の表示を整える3つの方法

## はじめに

`php`で`var_dump`で変数の値を確認するデバッグ手法があると思いますが、それをそのまま`html`上で表示すると
![スクリーンショット 2015-06-18 22.23.10.png](https://qiita-image-store.s3.amazonaws.com/0/67471/226fc0f3-ece9-0c74-7b75-2f24bf4d6264.png)
こんな感じになってしまいます。
このままでは中の構造が追いにくく分かりにくいので形を成形して表示する方法を3つ紹介します。

## サンプルコード

```php:var_dump.php
<?php
$sample = array('first' => array('first_children1' => 'a', 'first_children2' => 'b', 'first_childeren3' => 'c'), 'second' => 'd', 'third' => array('third_children1' => 'e', 'third_children2' => array('grandchildren1' => 'f', 'grandchildren' => 'g')));

var_dump($sample);
```

## 1つ目: `pre`タグで囲む

```php:var_dump.php
<?php
$sample = array('first' => array('first_children1' => 'a', 'first_children2' => 'b', 'first_childeren3' => 'c'), 'second' => 'd', 'third' => array('third_children1' => 'e', 'third_children2' => array('grandchildren1' => 'f', 'grandchildren' => 'g')));

echo('<pre>');
var_dump($sample);
echo('</pre>');
```
![スクリーンショット 2015-06-18 22.27.39.png](https://qiita-image-store.s3.amazonaws.com/0/67471/0e45ac18-9e53-1fe7-82bf-498556ff7a67.png)

`pre`タグで囲んだ中で`var_dump`すれば、コードがそのまま表示されるので改行やインデントが行われた状態で表示できます。

## 2つ目: ログに出す

```php:var_dump.php
<?php
$sample = array('first' => array('first_children1' => 'a', 'first_children2' => 'b', 'first_childeren3' => 'c'), 'second' => 'd', 'third' => array('third_children1' => 'e', 'third_children2' => array('grandchildren1' => 'f', 'grandchildren' => 'g')));

ob_start();
var_dump($sample);
$out = ob_get_contents();
ob_end_clean();

// FILE_APPENDを指定することでログファイルに追記の形になる
file_put_contents('var_dump_log.txt', $out, FILE_APPEND);
```

![スクリーンショット 2015-06-18 22.44.23.png](https://qiita-image-store.s3.amazonaws.com/0/67471/58494002-6576-6c61-e658-6aebb3906dda.png)

これは画面には出さずにログに吐き出してそのテキスト上で見るという方法です。
ファイルを生成するしてそれを確認するのがやや手間ですが`tail`等でサブディスプレイにでも常に置いておけば画面更新時にログの結果が見れるので慣れればこれもそこそこ使えると思います。
`tail -f var_dump_log.txt`

## 3つ目: デベロッパーモード上で見る

```php:var_dump.php
<?php
$sample = array('first' => array('first_children1' => 'a', 'first_children2' => 'b', 'first_childeren3' => 'c'), 'second' => 'd', 'third' => array('third_children1' => 'e', 'third_children2' => array('grandchildren1' => 'f', 'grandchildren' => 'g')));

var_dump($sample);
```

![スクリーンショット 2015-06-18 22.54.34.png](https://qiita-image-store.s3.amazonaws.com/0/67471/786c7e56-216a-17ce-b02a-8f4921641e27.png)

多分これが一番早いと思います。
プログラム上はただ`var_dump`するだけで、ブラウザ側でデベロッパーモードを起動して`Elements`内を見るとその中では成形されているのでそこで確認する方法。
画像は`Google Chrome`のデベロッパーモードですが各ブラウザにデベロッパーモードは備わっているので同様のことができるはずです（確認はしていませんが…）

## おわりに

`var_dump`デバッグは初心者から上級者までお世話になるデバッグ方法だと思いますので、上記のお好きな方法で快適な`var_dump`デバッグライフをお過ごし下さい。
画像ファイルをダウンロードして保存する




```scala:Downloader.scala
import java.io.{FileOutputStream, BufferedOutputStream}
import java.net.URL
import scala.language.postfixOps

object Main {
  def main(args: Array[String]) = {
    val image_url = "http://pic.prepics-cdn.com/fuualbum0408/19574639.jpeg"
    val file_name = "hato.jpg"
    download(image_url, file_name)
  }

  def download(url: String, file_name: String) = {
    val stream = new URL(url).openStream
    val buf = Stream.continually(stream.read).takeWhile( -1 != ).map(_.byteValue).toArray
    val bw = new BufferedOutputStream(new FileOutputStream(file_name))
    bw.write(buf)
    bw.close
  }
}
```
Rails4で性能ログを出力する

ローカルでRailsで動かしているとき、コンソールからはViewのレンダリングとActiveRecordのそれぞれで何msかかったが表示されますよね。
<pre>
Completed 200 OK in 309ms (Views: 247.3ms | ActiveRecord: 40.8ms)
</pre>

このレスポンスタイムの部分を性能ログとして切り出して、解析などに利用したいときには、ActiveSupport::Notificationsを利用します。

```rb:config/application.rb
config.perf_logger = ActiveSupport::Logger.new(Rails.root.join('log', 'perf.log'), 'daily')
```

```rb:config/initializers/notifications
ActiveSupport::Notifications.subscribe "process_action.action_controller" do |name, start, finish, id, payload|
  Rails.application.config.perf_logger.info(
    "#{Time.now} [#{payload[:controller]}##{payload[:action]}] #{payload[:method]} #{payload[:status]} #{payload[:path]} #{((finish - start) * 1000).round}ms(V:#{payload[:view_runtime].to_f.round(1)}ms,A:#{payload[:db_runtime].to_f.round(1)}ms)")
end
```

これでperf.logには、下記のようにローカル開発時に出力されるものと同じ値でログ出力することができます。

```text:log/perf.log
2015-06-18 22:44:55.777  [WelcomeController#index] GET 200 / 309ms(V:247.3ms,A:40.8ms)
```

なお、ActiveSupport::NotificationsはRails3から導入されてますので、Rails3,4のどちらでも動作するかと思います。
Ubuntu12.04でApache2.4.7を設定するまで

1 Apacheのダウンロードおよびインストール

```
sudo apt-get install apache2
```

***

2 サーバー名の設定

```
echo ServerName $HOSTNAME | sudo tee /etc/apache2/conf-available/fqdn.conf
```

***

3 設定ファイルの反映

```
sudo a2enconf fqdn
```

***


4 Apacheの各種コマンド

コマンド|説明
---|---
sudo /usr/sbin/apachectl start 	|起動 
sudo /usr/sbin/apachectl stop 	|停止 
sudo /usr/sbin/apachectl graceful 	|停止中の場合は起動，起動中の場合は再起動
sudo /usr/sbin/apachectl graceful-stop 	|処理完了後に停止
sudo /usr/sbin/apachectl restart 	|再起動
sudo /usr/sbin/apachectl configtest 	|設定ファイルのテスト
sudo /usr/sbin/apachectl status 	|ステータス表示
sudo /usr/sbin/apachectl fullstatus 	|ステータス表示
sudo /usr/sbin/apachectl help 	|ヘルプの表示



***

5 index.htmlの場所

```
/var/www/html/index.html
```

***

おまけ


***


* Ubuntuのバージョン確認方法


```
cat /etc/lsb-release
```


***

* アーキテクチャの確認

```
arch
```
Objective-CプロジェクトにSwift mix してハマったこと（随時更新）


最近Objective-Cで書かれたプロジェクトにSwift (1.2)を突っ込んでいっています。
知見が溜まってきたので、共有しようと思います。

なおSwiftとObjective-Cの互換性については下記などに情報があります。

- [Using Swift with Cocoa and Objective-C](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html)
- [Swift and Objective-C Interoperability](https://developer.apple.com/videos/wwdc/2015/?id=401)

# Objc側で.hで宣言した定数が見えない
下記のようにヘッダで宣言しても、ビルドのlinkerでコケます。

```objective-c
// Foo.h
static NSString * kSomeConstant = @"hello";
@interface Foo : NSObject
@end
```

下記のようにしましょう。

```objective-c
// Foo.h
extern NSString * const kSomeConstant
@interface Foo : NSObject
@end

// Foo.m
NSString * const kSomeConstant = @"hello";
@implementation Foo : NSObject
@end
```

# objc側のdefineマクロが見えない
これはまあ、そうですよね、という。

# objcからCommand + Clickで宣言部にジャンプすると、{Product}-Swift.h に飛んで、実装が見えない。
これは元の.swiftに飛んでくれてもいいんじゃないかな！と思ったり。

# #if DEBUG が効かない？
```objective-c
#if DEBUG
    NSLog(s)
#endif 
```
という感じのコードを移植して

```swift
#if DEBUG
    println(s)
#endif 
```

のようにしたのですが、ログが出力されませんでした。
よく考えたらOther Swift Flagに何も値を入れてないだけでした。

# インラインdefine関数定義が移植できない
結構みなさんロガーにこういうのを使ってることもあるかと思いますが、

```
#ifdef DEBUG
#define DEBUGLOG(...) NSLog(__VA_ARGS__)
#else
#define DEBUGLOG(...)
#endif
```

これはSwiftから全く見えません。
でも、例えばprintlnとかはインライン定義で使われていますよね。

```swift1.2
@inline(never) func println<T>(value: T)
```

もしやこれを真似して定義すればそのまま置き換えられる？と思って試してみました。

```
@inline(never) func DEBUGLOG(s:String) {
	#if DEBUG
		println(s)
	#endif
}
```

Swift側はこれでよかったんですが、Objective-Cから使う時にC99のエラーが出ました。
![c99.png](https://qiita-image-store.s3.amazonaws.com/0/35008/1d862caf-ccea-c29f-026a-c1284a76358f.png "c99.png")

よくわからんですが、ひとまずインラインで同じものを作るのは諦めて、こんな感じで対応しました。

```swift
struct Logger {
    static func debug(s:String) {
        // このDEBUGはマクロではなく、Other Swift Flagの設定値であることに注意！
        #if DEBUG
            println(s)
        #endif
    }
    static func info(s:String) {
        println(s)
    }
}
```

ロガーについてはいろいろオープンソースのライブラリも出ているので、導入を検討してもいいかもしれません。
この辺りはSwiftで書かれています。

- https://github.com/DaveWoodCom/XCGLogger
- https://github.com/hubertr/Swell
- https://github.com/matteocrippa/awesome-swift#logging

いずれにしてもマクロが使えないため、info,debug,error,warningなど出し分けるにはplist等で設定してね、ということになっているようです。

ちなみに、NSLogよりprintlnの方が高速なようです。

- [Swift: print() vs println() vs NSLog()](http://stackoverflow.com/questions/25951195/swift-print-vs-println-vs-nslog)
- [SwiftのprintlnはNSLogの10倍くらい高速](http://qiita.com/mono0926/items/8cb44b55ad3ffb4300e8)


# メソッドチェーン

Objective-Cはnilに対して寛容な仕様なので、例えばメソッドチェーンの途中でオプショナルが返っているところがある場合、```if let``` でオプショナルを展開してあげないとダメです。
例えば、こんな感じですね。

```
if let url = NSBundle.mainBundle().appStoreReceiptURL?.path {}
```


以上です！