OmniAICreator/Qiita-1.07M huggingface dataset:
Kudan ARをAndroidで使ってARアプリを作ってみる(セットアップメイン)

#はじめに
こんにちは、初めてのQiita投稿になります。
今回はKudanARをAndroidで用いて ARアプリを作ってみようの記事です。
経緯といたしましては、2/18と2/19で行われたMBSハッカソン(プレバトチームです)でKudanARを用いる機会があり自分がはまってしまったので、同じ境遇の人のためになれたらなと思い投稿しました。

#KudanARとは
AR機能をiOS、Android、Unity等で簡単に実装できるライブラリで、マーカー無しのAR(もちろんありでもOK)であったり、オブジェクトに対して近寄ったり遠くに配置したりすることも可能。個人開発用で使用する場合は無料で使える。(リリース用に使用する際は年間でライセンス料がかかる)
https://japan.kudan.eu/

#初期設定
はじめにAndroidStudioでプロジェクトを今まで通り作成してください。
次に、kudanのサイトからAndroidのSDKをダウンロードしてきます。
https://www.kudan.eu/download-kudan-ar-sdk/
ここで簡単な個人情報(名前、Emailアドレス等々...)を登録する必要があります。
英語での登録になるので誤って日本語で登録しないように気をつけてください。。。
SDKがダウンロードできればいよいよプロジェクトにkudan arを組み込んでいきます！！

#実際にプロジェクトに組み込む
プロジェクトを開いて、
File -> New -> New Module...
と進んでimport .JAR/.AAR packageを選びます。
File nameのところで先ほどダウンロードしてきたkudan arのSDKを選択、それからfinishと進みます。
次にFile -> Project Structure...と進んで、左の欄のModulesのところでappを選択、さらに右の画面でDependenciesを選択します。そうすると今プロジェクトで使用されているライブラリの一覧が出てくるので、左下の+ボタンからModule Dependancyを選択して、kudan arを追加します。これでプロジェクトにkudan arを組み込めたので次は使えるように設定をしていきます。

#使えるように設定する
無事にプロジェクトにkudan arを組み込むことができたら、次はAndroid Manifestを開いてpermissionの設定を行います。これはAndroid6.0以降のAndroid端末で実行する際に必要な項目で、設定しないと**クラッシュ**するので気を付けましょう。(Android permissonについて　https://developer.android.com/training/permissions/requesting.html)
主に追加する項目はこんな感じです。
`<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />`
また追加するだけでなくkudan arを使用する前にこれらの項目を許可されている必要があるので、SplashActivity等でユーザーに対して許可してもらう等の処理も必要になります。
次に、app配下にあるbuild.gradleを開いて以下の項目を追加します。
`android {
     aaptOptions
    {
       noCompress 'KARMarker'
       noCompress 'armodel'
    }
}`
最後にdefaultConfigのapplicationIdを**eu.kudan.ar**に変更して設定完了です。

#実際に使っていく
ここまで設定ができたら実際にARを表示させてみましょう。
使いたいActivityにおいて、
`class HogeHogeActivity extends ARActivity`
と継承させてください。次にonCreateのメソッドで
`ARAPIKey key = ARAPIKey.getInstance();
key.setAPIKey("APIKey");`
と打ち込みましょう。この2行はARActivityを起動させる前に打ってもらっても可能です。
[APIKeyはこちらから入手してください。](https://wiki.kudan.eu/Development_License_Keys)
ここから先はどのようなARを表示させたいのかによって手順がことなるので以下のサイトを参考にしてみてください。
https://wiki.kudan.eu/Main_Page

#最後に
以上でAndroidでkudan arを使うためのセットアップは終了です。間違ってる部分があるかもしれませんがその時はごめんなさい。。。
こちらに自分のサンプルコード(mvvmですが)あげておきます。よければ参考にしてみてください。
https://github.com/Taku24/P-Battle_mvvm
AWS EC2にApache2.4, PHP7環境を構築するメモ


###### yum更新
```
$ sudo yum -y update
```

###### Apache2.4インストール
```
$ sudo yum -y install httpd24
```

###### PHP7.0インストール
```
$ sudo yum -y install php70 php70-mbstring php70-pdo
```

###### PHP7.0利用可能パッケージ確認（必要に応じて）
```
$ sudo yum list available | grep php70
```


###### インストールモジュールの確認
```
$ sudo yum list installed | grep httpd24
$ sudo yum list installed | grep php70
```

###### php.ini編集
```
$ sudo vi /etc/php.ini
```

###### httpd起動設定
```
$ sudo chkconfig httpd on
$ sudo chkconfig --list httpd
httpd           0:off   1:off   2:on    3:on    4:on    5:on    6:off
```

###### httpd.conf編集
```
$ sudo vi /etc/httpd/conf/httpd.conf
```

###### httpd.conf シンタックスチェック&起動
```
$ sudo /etc/init.d/httpd configtest
Syntax OK
$ sudo /etc/init.d/httpd start
Starting httpd:                                            [  OK  ]
```

###### その他参考ページ
- [AWS EC2でWebサーバーを構築してみる](http://qiita.com/Arashi/items/629aaed33401b8f2265c)
- [EC2インスタンス(Amazon Linux)の初期設定](https://www.agilegroup.co.jp/technote/ec2-initial-settings.html)
- [Amazon EC2編～必ずしておくCentOS初期設定～](https://recipe.kc-cloud.jp/archives/7973)
- [AWS EC2 Linux開発環境 構築メモ](http://qiita.com/oshou/items/b9c2de7bbf0116ffca6a)
- [Amazon Linux(AWS)に、MySQLをインストールしよう！](http://ticklecode.com/step15-aws-mysql/)
Docker 備忘録 #02 DockerFile 

# DockerFileとは 
DockerFileはイメージからDokcerコンテナを作る時に . 
必要なパッケージのインストール手順や実行コマンドをスクリプト化して . 
オリジナルのイメージを作成し環境構築、コンテナの再構築を楽にするために書くファイル .

# DockerFileの書き方 
基本は 
`命令 実行するコマンド ` . 
の書き方で書いていく . 
 
## DockerFileで使う命令文 . 
個人的によく使う命令の書き方  

### FROM
イメージを作るときに使うベースのイメージ名を書く
`FROM イメージ名` . 

ex) ubuntu 14.04のイメージを使う . 
` FROM ubuntu:14.04` . 

### MAINTAINER . 
イメージ作成者の名前を記入 . 
`MAINTAINER 723gt_m` . 

### RUN
イメージ作成時に実行するコマンドを書く 
`RUN 実行するコマンド`  

ex) update後にapache2をインストール . 
`RUN apt-get update . 
 RUN apt-get install apache2 -y`

### EXPOSE . 
指定のポートを外部に公開する . 
**外部に公開するだけであってアクセスするにはコンテナ作成時に-pでポートを指定する** . 
`EXPOSE ポート番号` . 

ex) 80番ポートを外部に公開する . 
`EXPOSE 80` . 

### ENV . 
環境変数の設定 . 
`ENV パス名=指定するパス` . 

ex) rbenvのパスを指定 . 
`ENV PATH="$HOME/.rbenv/bin:$PATH"` .   

### ADD . 
ホスト側にあるファイルをイメージにコピーする . 
`ADD ファイル名 コピー先のパス` . 

ex)ファイル hoge を /fooへコピー . 
`ADD hoge /foo`  

### CMD . 
コンテナ作成時に実行されるコマンドを指定 . 
**CMDはDockerFile内で１度のみ** . 
`CMD ["実行バイナリ","パラメータ1",パラメータ２"]` . 
`CMD コマンド` . 
前者が推奨っぽい?  
 ex)Apache2の起動 . 
`CMD ["/usr/sbin/apachectl","-D","FOREGROUND"]` . 

# DockerFileからイメージの作成 . 
docker buildコマンドを使ってイメージを作成する . 
`docker build ファイルパス` . 

イメージ名とタグを付けるには  
-t オプションをつける . 
`docker build -t イメージ名:タグ` ファイルパス . 

# 実際にapache2のイメージを作ってみる . 
DockerFileの名前はDockerfile

```
$ mkdir /dockertest
$ cd /dockertest
$ vim Dockerfile
```

```Dockerfile
FROM ubuntu:14.04

MAINTAINER 723gt_m

RUN echo update開始
RUN apt-get update
RUN echo apacheインストール
RUN apt-get install apache2 -y 

EXPOSE 80

CMD /usr/sbin/apachectl -D FOREGROUND
```

```
$ docker build -t myapache:01 .
$ docker images 
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
myapache            01                  b11b81a4445c        8 minutes ago       225 MB 
$ docker run -d -p 80:80 myapache:01 
```

ブラウザで localhostへアクセスするとapacheの画面が出てくるはず
Vagrant 1.9.2でUbuntu 16.04を使う

あれこれ試したけど、意外と簡単だったので記録しておく。

# 前提

* virtual boxインストール済み(5.1.16)
* vagrantインストール済み(1.9.2)
* sshが使える

※Windowsの場合、sshコマンドはこちらを使うと楽かと https://github.com/PowerShell/Win32-OpenSSH/releases

# Ubuntuを使う

```shell-session
vagrant init bento/ubuntu-16.04-i386
vagrant up --provider virtualbox
vagrant ssh
```

# 他のOSを使うには

こちらから順に辿っていくと、initしてupするためのコマンドが書いてあります。
https://atlas.hashicorp.com/bento/boxes/

ubuntu16.04(をvirtual boxで使う)の場合は最終的にこんなページにたどり着きます。
https://atlas.hashicorp.com/bento/boxes/ubuntu-16.04-i386/versions/2.3.1

# 共有フォルダをマウントできないエラーへの対処

こんなメッセージが出る場合。

```
Vagrant was unable to mount VirtualBox shared folders. This is usually
because the filesystem "vboxsf" is not available. This filesystem is
made available via the VirtualBox Guest Additions and kernel module.
Please verify that these guest additions are properly installed in the
guest. This is not a bug in Vagrant and is usually caused by a faulty
Vagrant box. For context, the command attempted was:

mount -t vboxsf -o uid=900,gid=900 vagrant /vagrant
```

## virtual box側で共有フォルダ設定を見直す

### 一旦vmを止める

```shell-session
vagrant halt
```

### 共有フォルダ追加

* virtual box起動し、該当vmを右クリックする。
* メニューから「設定」を選び、「共有フォルダ」タブに切り替える。
* Windows側で適当なフォルダを作る
* 画面内右端の「＋」を押し、共有フォルダとして指定する。
  * 「自動マウントする」にチェックを入れる
  * 「永続化する」にチェックを入れる
* OKを押して共有フォルダの追加画面を閉じる。
* 既存の共有フォルダを右クリックして「除去」する

### vm起動

```shell-session
vagrant up
```

(参考：「【 Virtual Box 】共有フォルダを介して、ホストOS(Windows 7) と ゲストOS(Debian/ MathLibre)でファイルやりとりするための設定」 http://qiita.com/HirofumiYashima/items/6044cfc64cfa3e84f97c)

これでもエラーが出る場合は次へ

## バージョン不一致の解消

(参考：「Vagrantで共有フォルダのマウントに失敗するときの対処方法」 http://qiita.com/ozawan/items/9751dcfd9bd4c470cd82)

```shell-session
vagrant plugin install vagrant-vbguest
vagrant vbguest --status

#=> [default] GuestAdditions versions on your host (5.1.16) and guest (5.0.26) do not match.

vagrant vbguest

vagrant reload default
```
DispatchGroupを使って複数の処理を待ってメインの処理に戻す

Swift3前提です。

今回僕がやりたかったのは、S3にPUTメソッドで画像をアップロードして、それらが全て完了したらアプリケーションサーバーに投げる、というような処理。
ここではそのGCDにおけるサンプルコードだけ紹介。

Swift3におけるGCDについての詳細は @marty-suzuki さんの記事が良くまとまっているので、そちらを見ると良いかも。
http://qiita.com/marty-suzuki/items/f0547e40dc09e790328f

以下、実コード。

```swift

import Alamofire
import Alamofire_SwiftyJSON

let group = DispatchGroup()
        
        // groupの全ての通信
        for _ in 0...9 {
            group.enter()
            Alamofire.request("https://httpbin.org/ip").validate().responseSwiftyJSON(completionHandler: { (response) in
                if let json = response.value {
                    NSLog("json: \(json)");
                }else{
                    NSLog("error: \(response.error)");
                }
                group.leave()
            })
            
        }
        
        // 全ての通信が終わったらやる処理, .main を .global() に変えるとメインスレッド以外の適当なスレッドでyattekureru.
        group.notify(queue: .main ) {
            if Thread.current == Thread.main {
                NSLog("Continue! in Main Thread!")
            }else{
                NSLog("Oops, in Other Thread! (\(Thread.current))")
            }
        }
```

通信エラーが起きた場合についても考慮するなら、もうちょっと複雑になりますが、ここでは割愛。
方針としては、各Alamofire.requestを一つのArrayに保持しておいて、一個でも失敗したら即座に全てのrequestを`cancel（）`するような形が良いかと思います。 で、一個でもエラーしたものがある場合にtrueになるBoolのフラグ変数でも置いて分岐すれば十分でしょう。
Rubyの環境構築（Rails含む）

Homebrewをインストールする
rbenvをインストールする
`$ brew install rbenv `
必要なバージョンのrubyをインストールする

```
$ rbenv install -l
$ rbenv install 2.3.0
$ rbenv rehash
$ rbenv global 2.3.0
```
## リンクがきちんと切り替わらない
ここまでだと、`rbenv version`と`ruby -v`した時とでバージョンが一致しない。

```
$ rbenv version
#=> 2.3.0 (set by /Users/qiushi/.rbenv/version)
$ ruby -v
ruby 2.0.0p648 (2015-12-16 revision 53162) [universal.x86_64-darwin16]
```
インストールは正しくできているが、読まれるパスにないことがどうやら原因。
https://www.d-wood.com/blog/2016/02/02_7781.html
http://easyramble.com/rbenv-ruby-version-trouble.html
http://qiita.com/yunzeroin/items/33a51c805e60ed5eca0e

```~/.bashrc
#rbenvのバージョンを起動時に反映させるのだとか
eval "$(rbenv init -)"
```

```~/.bash_profile
#~/.bashrc?を反映するための一行
test -r ~/.bashrc && . ~/.bashrc
```
## BundlerをGemでインストール
http://qiita.com/emadurandal/items/a60886152a4c99ce1017

```
$ rbenv exec gem install bundler
$ rbenv rehash
```
## Railsをインストール
Gemfileにrailsをインストールするようにコメントインなり追記するなりする。
その後、ローカルに直接ではなく、作業ディレクトリにRailsをインストールするために`--path`を指定する。
`$ bundle install --path vendor/bundle`
この場合、railsを実行するためにはbundleを通さなければならない。
`$ bundle exec rails server`
【jQuery Masonry】画像にリンクを設定する方法

Masonryについては[こちら](https://allabout.co.jp/gm/gc/402549/)を参照。

画像を手軽に列挙したい際に何かと便利なjQueryのmasonryですが、画像にリンクも設定できます。その際は設定する画像がブロック要素であることを維持しなければいけません。
##インライン要素からブロック要素へ
基本の形

```
<div class="js-masonry">
    <div class="item"><a href="" class="toBlock" target="_blank"><img src="img/1.jpg"></a></div>
    <div class="item"><a href="" class="toBlock" target="_blank"><img src="img/2.jpg"></a></div>
    <div class="item"><a href="" class="toBlock" target="_blank"><img src="img/3.jpg"></a></div>
</div>
```

imgタグをaタグで囲っています。この場合、aタグはインライン要素であるため、Masonryが正常に作動しなくなります。以下のCSSを追加すれば解決です。

```
.toBlock{
    display: block;
}
```

###まとめ
インライン要素、ブロック要素はウェブデザインの基本中の基本なので、jQueryやbootstrapをさらによく理解するために勉強しましょう。

######<追記>
画像にオーバーマウスした際に虫眼鏡のアイコンになるのが気になる方はimgタグに以下のCSSを適用させましょう。

```
.cursor(任意のclass名){
    cursor: pointer !important;
}
```
JavaScriptで生年月日から年齢を計算する簡単ロジック

昔のFlashのTipsをJavaScriptで書き直しました。

# ロジック
`年齢 = floor((今日-誕生日)/10000)`で計算できる

## サンプルコード

```js
// あなたの誕生日
const yourBirthDay = {
  year: 1983,
  month: 2,
  date: 15
};

// Dateインスタンスに変換
const birthDate = new Date(yourBirthDay.year, yourBirthDay.month - 1, yourBirthDay.date);

// 文字列に分解
const y2 = birthDate.getFullYear().toString().padStart(4, '0');
const m2 = (birthDate.getMonth() + 1).toString().padStart(2, '0');
const d2 = birthDate.getDate().toString().padStart(2, '0');

// 今日の日付
const today = new Date();
const y1 = today.getFullYear().toString().padStart(4, '0');
const m1 = (today.getMonth() + 1).toString().padStart(2, '0');
const d1 = today.getDate().toString().padStart(2, '0');

// 引き算
const age = Math.floor((Number(y1 + m1 + d1) - Number(y2 + m2 + d2)) / 10000);
console.log(age);

```


## サンプル

![image.png](https://qiita-image-store.s3.amazonaws.com/0/2544/cb453c76-96d7-e926-c850-9b97024f9dad.png)

※デモは当時はjsdo.itで公開していました


##　参考記事

- [ActionScriptで誕生日から年齢を計算する簡単ロジック \| ClockMaker Blog](http://clockmaker.jp/blog/2009/02/flex_age/)
- [ActionScriptで生年月日から年齢を計算する簡単ロジック \- Qiita](http://qiita.com/clockmaker/items/1c973ab6ba16e8c7c1c0)
- [2018年に見直した現代的なJavaScriptの記法を紹介するぜ \- ICS MEDIA](https://ics.media/entry/17262)
SentencePiece を試してみた

# SentencePiece とは
日本語のようなスペースで単語が区切られていない言語にも対応したトークナイザー。
文章を単語のようなトークンに分割してくれる。

![image](https://qiita-image-store.s3.amazonaws.com/0/61079/6c524bd9-70a1-0557-36e4-e33ed7973f25.png)

https://github.com/google/sentencepiece

# 動かしてみた
<font color=red>追記：作者の taku910 さんからのコメントにもありますが、この実験で設定した語彙数256000は大きすぎるそうです。コメント部分に適切な語彙数での実験結果もありますので合わせて御覧ください。</font>

過去に集めた1000万ほどの Twitter のつぶやきで学習。（ただし、当初集めた目的の関係で短い文章ばかりです。）

- vocab_size: 256000
- model_type: unigram

```
echo "私たちの考えや感情は心の中にあって、それは心の中の言葉を使って表されることも多いけれども、本来言葉・音・視覚その他の 五感のどれでも無い、なにかもやもやとしたかたまりだとおもう。言葉はその表現でしかない。 " | spm_encode --model=twitter.model —output_format=piece

▁私たちの 考え や 感情 は 心の中に あって 、 それは 心の中 の言葉を使っ て 表される ことも多い けれども 、 本来 言葉 ・ 音 ・ 視覚 その他の 五 感 のど れ でも無い 、 なにか もやもや とした かたまり だとおもう 。 言葉は その表現 でしかない 。
```

単語に分けるというタスクとみなすと、 Mecab には流石に勝てない？
ただ、短い文章ばかりで学習したことが性能を悪くしている気がします。

## いろいろ分解した
スペースは ▁ に置き換えられます。

- ▁スーパー / お腹痛くて / 松屋 / に駆け込 / んだ / 。 / ありがとう / 松屋 / 。
- ▁最近 / 知り合った / 人 / の影響か / 、 / ふと / 映画 / を観 / たくなる / 。
- ▁Ke / ras / ▁ / で / 超簡単 / ▁Se / q / 2 / Se / q / ▁ / の学習 / を / してみる
- ▁生 / ドレッシング / なるもの / 、 / 美味しい / 。 / 家の近くの / フランス料理 / 屋さん / で使われてる / やつ / と同じだ / 。 / きっと / 。
- ▁なんだか / よ / くんから / ないけど / 、 / 燃え尽き / 状態だ / 。
- ▁調子乗って / ランジ / 系の / 1 / 級 / を / 打ち込んで / いたら / できて / しまい / 、 / ペ / キ / ペ / キ / で / の初 / 1 / 級 / 頂きました / 。
- ▁本日の / ペ / キ / ペ / キは / 強い人 / オンパレード / だった / 。 / 1 / 球 / 打ってる / 人が / 4,5 / 人いて / 、 / たぶん / 撃たれ / ている / 級 / の平均 / が / 2 / 球 / くらい / 。
- ▁しかし / 夕方に / 会議が / 入っているので / 一瞬 / 出社 / する
- ▁ピンポン / の音 / に驚いた / ら / さ / たん / 、 / 一直線 / に / ベランダ / の / 方面に / 飛んで / いき / 、 / 窓ガラス / に / 正面 / 衝突 / 。 / ゴン / って音が / 。
- ▁鳥は / びっくりする / と / 明るい / 方 / に逃げる / という / 習 / 性 / そのまま / に / 行動 / しました / 。
- ▁レース / カーテン閉め / とかないとね / 。
- ▁今日も今日とて / 滑り / ました / 。 / 標高 / 2000 / m / の / 、 / 色 / や / 形の / 見え / 方 / 、 / やはり / 違う / 。 / とても / くっきり / とした / 世界 / 。


# はまったところ
[p2 インスタンスへの TensorFlow 導入](http://qiita.com/halhorn/items/361008b19b4fcfd618d6) で作った Ubuntu 環境に追加でインストールしました。

## 共有ライブラリ
基本的に https://github.com/google/sentencepiece の指示に従って進めればインストールできました。
が、最後 spm_train を実行すると以下のようなエラーが出ました。

```
spm_train: error while loading shared libraries: libsentencepiece.so.0: cannot open shared object file: No such file or directory
```
こちら、  libsentencepiece.so.0 は /usr/local/lib/ 配下にちゃんとあるようです。
また、 /etc/ld.so.conf をみた感じ /usr/local/lib もちゃんと読み込まれる設定になっているようです。
調べた結果これは共有ライブラリの読み込みのキャッシュが古くなっていたのが原因なようで

```
sudo ldconfig
```
こちらで解決しました。


## メモリ不足
spm_train はどうやらファイルの内容を全てメモリ上にロードするようです。
その為 input のファイルサイズがメモリより大きいと死にます。
メモリの大きなインスタンスを使うなりしましょう。

ちなみにマルチ vCPU のインスタンスを使った場合、それらをフルに使ってくれるみたいです。すばらしい。

```
top
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 1781 ubuntu    20   0 9467968 7.973g   5436 S 798.3 25.4   8:52.91 spm_train
```

# 所感
今回使った Twitter のデータや学習設定ではそこまでおおっという結果にはなりませんでした。
他の model_type での実験などしたり、長文を食わせたりなどするとまたかわるかもしれません。
travisの設定ファイルにSlackとCoverallsのトークンを暗号化して保存するときのメモ


トークンをそのまま `.travis.yml` に記述することもできるが、github等で共有するときにトークンが見えたら困るので暗号化する。


##travisツールを入れる

```
gem install travis
```

##coveralls用トークンを追加

```
travis -r [githubアカウント名]/[レポジトリ名] encrypt COVERALLS_REPO_TOKEN="[coverallsのトークン]" --add env.global
```

##Slack用トークンを追加

```
encrypt -r [githubアカウント名]/[レポジトリ名] "[Slackドメイン]:[Slackトークン]" --add notifications.slack
```


これで `.travis.yml` に暗号化されたトークンが追加される
猿がようやく理解したSwiftのdeferの使いどころ

deferという見慣れないものが出てきて、調べてみたのだけれども、

###「スコープを抜ける時にやってほしい処理を書ける」

という説明が多かった。

その説明では???だったので、なんとなく分かったような気もするが、**使いどころがわからない感じ**で放置していた。


が突然、そうか！そういうことか！と分かった気がしたので、メモしておく。

---

メソッドやfor文などのスコープ内で、**途中でreturnしたりbreakしたり**して抜けてしまうことがあるけれども、

###「途中で抜けようが抜けまいが**必ずやって欲しい処理**をあらかじめ書ける」

というのが**deferの使いどころ**なのだと思った。

---

コードにするとこんな感じ。

```
import UIKit


func hoge() {
    
    defer {
        print("途中でreturnしようがしまいがやって欲しい処理をやりました")
    }
    
    // この値を0にしようがしまいが上のdeferは処理される
    let a = 0
    
    guard a == 0 else {
        print("途中で抜けました")
        return
    }
    
    print("最後まで行きました")
    
}

hoge()
// --プリント結果--
// 最後まで行きました
// 途中でreturnしようがしまいがやって欲しい処理をやりました
```

こうやってdeferでまとめておけば、必ずやって欲しい処理を何度も書く必要はない。

---

使いどころがわかれば使える。

多分僕も使うようになるだろう。
Application Loader で ERROR ITMS-90596

Unityで作ったアプリをApplication Loaderでアップしようとしたら
ERROR ITMS-90596エラーが出た

とりあえず、最新のXcodeと最新のApplication Loader使えば問題ないです

念のため最新のXcode開いて
Xcode→OpenDeveloperTool→Application Loaderを起動してみたほうがいいです

以上です
kintone データビューア

kintone 開発環境で、アプリが数百件以上になると、アプリを探すのも結構面倒です。
簡単にアプリ検索とデータ表示が出来るものが欲しくなり、データビューアアプリを作ってみました。

kintoneアプリで、レコード単位に各アプリのデータ表示・集計を行うものです。

データビューア機能

- 対象アプリと一覧を選択
- フィルター機能
- グループ集計
- 全画面表示
- Excel/Csv/HTML/JSON 出力機能

![2017-03-09_14h22_38.png](https://qiita-image-store.s3.amazonaws.com/0/100572/58ecfeff-b22c-5602-cac7-a1484197151f.png)


# 操作例　ビューデータの追加

編集画面で設定した表示項目や集計設定は、レコードに保存され、詳細画面でその設定で表示されます。


- 新規レコード追加
- アプリを選択
- 一覧を選択
- 不要な表示項目を削除
- 項目の表示幅、表示順を指定
- レコードの保存
- グループ集計
- 全画面モード

![2017-03-09_14h39_18.gif](https://qiita-image-store.s3.amazonaws.com/0/100572/89171566-b9e5-5d56-6148-3869a5245953.gif)


# アプリの検索

アプリの appId または、アプリ名の部分一致で検索できます。

![2017-03-09_15h32_01.gif](https://qiita-image-store.s3.amazonaws.com/0/100572/0fa62fd7-f4d3-1fe1-ee38-6de71c40c280.gif)



# 項目の位置変更

項目をドラッグして、位置変更できます。

![2017-03-09_15h03_28.gif](https://qiita-image-store.s3.amazonaws.com/0/100572/1e7fe646-6fbb-27e1-067f-d96090df3764.gif)


# フィルター機能

数字と日付は、between。それ以外は部分一致検索

![2017-03-09_15h20_27.gif](https://qiita-image-store.s3.amazonaws.com/0/100572/bfd74d99-653a-7c49-dd47-c67eb91e75fc.gif)

# グループ集計

任意の項目で、グループ集計できます。

![2017-03-09_15h42_29.gif](https://qiita-image-store.s3.amazonaws.com/0/100572/e27a85e5-0222-bddf-2982-4f7f2c766089.gif)



# データダウンロード

出力フォーマットを選択して、出力します。

![2017-03-09_15h11_23.gif](https://qiita-image-store.s3.amazonaws.com/0/100572/1fa85c33-547e-d49d-22cb-8ace34c8b7b5.gif)

# サブテーブル表示

サブテーブルは、「＋」ボタンクリックで詳細表示できます。
アプリ内にサブテーブルが２つ以上ある場合は、先頭のサブテーブルのみ表示可能。

![2017-03-09_14h56_07.png](https://qiita-image-store.s3.amazonaws.com/0/100572/480819eb-ba9f-8c36-4271-a2eb60c86107.png)



# 課題

ゲストスペースのアプリを選択すると、権限が無いというエラーになります。
アプリ一覧取得API では、ゲストスペースのアプリか判断できないので、要検討です。
gitでcommitするファイルの構文チェックをする

git pushした後にjenkinsさんに怒られるより、
git commitで簡易チェックしたほうが良くない？のお話。

## git hook
文字通り、commitをhookします

★参考にさせて頂きました。
Git hooks まとめ
http://qiita.com/khlizard/items/dfe1ec9d82c0ed5da7c6

pre-commitに動かしたい処理を書けば、commit直前に実行できる。

```Bash:pre-commitファイルを作る
$ cd {PATH_TO_PROJECT_GIT}/.git/hooks
$ cp -p pre-commit.sample pre-commit
```

## pre-commit
commitするファイルを対象に、構文チェックします

★参考にさせて頂きました。
エラーのあるファイルはコミットしない(git編)
http://sotarok.hatenablog.com/entry/20090223/1235363846

★（余談）Gitのpre-commit.sampleにある4b825dc642cb6eb9a060e54bf8d69288fbee4904とは？
http://qiita.com/fieldville/items/5518ed98ce38eb9df351

pre-commitを編集して、実行権限を付与して、git commitします

```Bash:
$ vi pre-commit

#!/usr/bin/php
<?php

$output = array();
$return = 0;

//直近のcommit hashタグを取得する
exec('git rev-parse --verify HEAD 2> /dev/null', $output, $return);
$against = $return == 0 ? 'HEAD' : '4b825dc642cb6eb9a060e54bf8d69288fbee4904';

//stagingにいる修正ファイル名を取得する
exec("git diff-index --cached --name-only {$against}", $output);

$filename_pattern = '/\.php$/';
$exit_status = 0;

foreach ($output as $file) {
    if (!preg_match($filename_pattern, $file)) {
        // don't check files that aren't PHP
        continue;
    }

    $lint_output = array();

    //構文をチェックする
    exec("php -l " . escapeshellarg($file), $lint_output, $return);
    if ($return == 0) {
        continue;
    }
    echo implode("\n", $lint_output), "\n";
    $exit_status = 1;
}

exit($exit_status);

$ chmod -x pre-commit
```

「構文をチェックする」のところをしたいコマンドに変えれば、なんでもチェックできますね。

```Bash:エラーがあると？
$ git add {任意のファイル群}
$ git commit -m "pre-commitテスト"
-- 構文チェックの内容 --
```

commitが完了しません！
nodeで静的ページを動かす最短メモ

ちょっとnodeを試してみたいときに使用。

###新しいフォルダにnpmの設定ファイルを作る

```
mkdir new_project
cd new_project
npm init
```

###expressをインストール
expressは簡単なアプリが作れるライブラリ。

```
npm install express --save
```


###表示するhtmlファイルを用意する

```
mkdir htdocs
touch htdocs/index.html
touch index.js
```

```:index.js
var express = require('express');
var app = express();
  
app.use(express.static('htdocs'));
  
var port = 3000;
app.listen(port,function(){
    console.log("Expressサーバーがポート%dで起動しました。モード:%s",port,app.settings.env)
});
```

```:index.html
<html>
<head>
    <title>test</title>
</head>
<body>
<h1>テスト</h1>
</body>
</html>
```

###実行

```
node index.js
```

下記にブラウザで接続

```
http://localhost:3000/
```

<hr>

使う3つのコマンド

```
npm init
npm install
npm run
```

#npm installコマンド

個別にインストール

```
npm install パッケージ名
```

dependencies内に入ったライブラリはnpm installでインストール

```
npm install
```

```:package.json
{
  "dependencies": { "jquery": "^2.1.3" }
}
```


#参考

フロントエンド開発の３ステップ（npmことはじめ）
http://qiita.com/hashrock/items/15f4a4961183cfbb2658
wordpress プラグイン MTS Simple Booking-Cの設置ができない

環境はさくらレンタルサーバー
PHP 5.6

MTS Simple Booking-C
という予約システムをwordpressに導入しようとしています。

公式サイト：http://mtssb.mt-systems.jp/


手順に沿ってインストールを行いましたが

カレンダーを表示するためのショートコード
[monthly_calendar id=”●●”]
を入力し、表示しても

「予約品目が見つかりませんでした。」
と表示されます。

プラグイン内部のカレンダー表記のシステムを見てみると


		// 予約品目の取得
		$this->articles = MTSSB_Article::get_all_articles($params['id']);
		if (empty($this->articles)) {
			return __('Not found any articles of reservation.', $this->domain);
		}

ここでどうも弾かれているようです。

スケジュールの設定はちゃんとしているはずで、
報告されている競合するプラグインも導入はしていません。

見当がつかない状態でして、ぜひご助言頂けますと幸いです。
コピペしていた .htaccess を読む

今までコピペしていた `.htaccess` の記述を理解するために調べた覚え書きです。

```txt:.htaccess
RewriteEngine on

RewriteCond %{REQUEST_URI} !/sp/
RewriteCond %{HTTP_USER_AGENT} (iPod|iPhone|iPad|Android|Windows\ Phone)
RewriteRule ^(.*)\.(html|php)$ sp/$1.$2 [R]
RewriteBase /
```

知識 0 なので最初は ﾋｨｰ! ﾑｽﾞｶｼｿ- :scream: って拒絶反応がでますが、
よく見る:eyes:と英語をペンパイナッポーケース:pencil2::pineapple:で記述しているだけです。

とうことで、英語の意味を調べます。

|英語|読み方|意味|
|:--|:--|:--|
|modify|モデファイ|変更・修正|
|rewrite|リライト|書き換え|
|condition|コンディション|条件|
|rule|ルール|ルール|

あとは、パイナップル:pineapple:にペン:pencil2:を刺す要領です。

`rewite` と `condition` で `RewriteCond` となり、意味は「書き換え条件」です。

`rewite` と `Rule` で `RewriteRule` となり、意味は「書き換えルール」です。

これなら、何をしているのかわかります :thumbsup:

最初に記述したコードには、`RewriteCond` が2つあります。

書き換えの条件を2つ指定しているということです。

書き換えの条件を満たす場合に、`RewriteRule` の書き換えのルールに従って、書き換えをしているということですね :grinning:

`%{REQUEST_URI} !/sp/` は、アクセスしてきたURLに `/sp/` がない場合という意味です。

`!` は否定を表していますね。

`RewriteCond %{HTTP_USER_AGENT} (iPod|iPhone|iPad|Android|Windows\ Phone)` は、アクセスしてきたデバイスが `(iPod|iPhone|iPad|Android|Windows\ Phone)` だった場合という意味です。

これらの条件に該当する場合は、`^(.*)\.(html|php)$ sp/$1.$2 [R]` というルールでURLの書き換えているということですね。

`^(.*)\.(html|php)$ sp/$1.$2 [R]` という記述は、謎記号が連射されているので、正規表現です。

`RewriteEngine on` は、定型文のような感じで、書き換えをしたい場合に `on` を指定します。

`RewriteBase /` は書き換えするときのベースのURLです。

何となく理解できました :muscle:
Python のジェネレータを何回もイテレートしたい

Pythonのジェネレータは便利ですが、for文で一度ループに使用したあと、またfor文で使おうとするとカラッポのようになります。

```py
def i(n):
    yield n + 1
    yield n + 2


g = i(10)
print('first time:')
for n in g:
    print(n)

print('second time:')
for n in g:
    print(n)
```

出力は

```
first time:
11
12
second time:
```

となります。2回目の`for`ループでは要素がひとつもイテレートされていません。

２回目以降の`for`ループでも`11`と`12`が帰ってきてほしい、というようなシチュエーションの場合、以下のようなテクニックを使うとうまくいきました。

```python
class ReiteratableWrapper(object):
    def __init__(self, f):
        self._f = f

    def __iter__(self):
        return self._f()

def i(n):
    yield n + 1
    yield n + 2

import functools
f = functools.partial(i, 10)

g2 = ReiteratableWrapper(f)
for n in g2:
    print(n)

for n in g2:
    print(n)
```

## 解説

`ReiteratableWrapper` クラスはジェネレータ関数をひとつ受け取ります。内部では引数を与えずに呼び出すので、引数をともなったジェネレータ呼び出しを行いたい場合は例のように `functools.partial` 関数などを使って引数をバインドした引数なしの関数を作成しておきます。

for文のinのあとのコンテキストで評価された式は `__iter__` メソッドが呼ばれます。
そのため、`ReiteratableWrapper`のインスタンスは毎回あらたにジェネレータを自動的に作ってくれるようになります。

ただし`__iter__`メソッドが評価されるたびにジェネレータ関数を評価し、実行していますのでジェネレータ関数の実行回数に制限があるなどジェネレータ関数呼び出しに副作用がある場合は何回も繰り返し使える、とはならないことがあるかと思います。

ファイルから順番に読み込んでメモリを節約する、DBに毎回クエリを発行して順番にイテレーションする、など繰り返し行える内容には今回紹介したテクニックは有効と思います。

## 参考リンク

- [itertools](https://docs.python.jp/3/library/itertools.html)
- [Pythonのイテレータとジェネレータ](http://qiita.com/tomotaka_ito/items/35f3eb108f587022fa09)
SqlServerで照合順序を変えても反映されない

今日会社の人に照合順序を変えたのにうまく反映がされていないことを相談されたので忘備録として

照合順序は、DB、テーブル、列に**別々に**設定されている。
照合順序はプロパティから変更できるが、DBの照合順序を変更してもテーブルとの各列ごとの照合順序は変更されない。
DBの照合順序を変更してからテーブルを新規作成すればDBに設定した照合順序でテーブルが作られる。・・・だったかな？
VMware Horizon デバッグログの取り方

Horizon 環境でデバッグログを取る方法です。
詳細な調査のためには多くの場合、3点ログが必要です。

・Horizon Client （端末）
・Horizon Agent（SBCやVDIの仮想デスクトップ）
・Connection Server (ブローカー）

デバッグログの取り方は以下の通りです。
最新情報はこちらをご確認を。

＝＝参考＝＝
・Collecting diagnostic information for VMware View
  http://kb.vmware.com/kb/1017939
＝＝

ここではClient、Agentのデバッグログの取得方法をサマリーします。
Connection Serverのデバッグログも操作方法は一緒です。

①
View Agent の環境にて、以下のコマンドを実行し、"View Full"  を選択する

"c:\Program Files\VMware\VMware View\Agent\DCT\support.bat" loglevels

また、再び、以下のコマンドを実行し、"PCoIP debug" を選択する

"c:\Program Files\VMware\VMware View\Agent\DCT\support.bat" loglevels

※２回実施するので忘れずに。。

②
Horizon Client の環境にて、以下のコマンドを実行し、"View Full" を選択する

"c:\Program Files\VMware\VMware View\Client\DCT\support.bat" loglevels

また、再び、以下のコマンドを実行し、"PCoIP debug"  を選択する
    
"c:\Program Files\VMware\VMware View\Client\DCT\support.bat" loglevels

・この後再現テストをする

-実行時刻、ユーザ名の記録を忘れずに。
-ClientとAgentの時刻はずれていないか要チェック

・再現完了したらsupport.batを実行する
Pinterestの埋め込みをJavascriptで動的に生成する

# はじめに

通常の埋め込みであればこの記事に書くことは全く必要ではありません。一度ページをロードした後にPiterestのwidgetを表示しようとする場合何も表示されなかったのでその対応策です。
あまりぶつからない事案のような気はしますが、対応策を見つけるのに少々時間がかかったのでメモしておきます。
(twitterやinstagramはこのような対応はいらなかったのですが、Pinterestは必要でした。）

# 対応策

通常、Pinterstを埋め込むためには以下のようにします。

```html:html
<script
    type="text/javascript"
    async defer
    src="//assets.pinterest.com/js/pinit.js"
></script>
```

```haml:haml
= javascript_include_tag '//assets.pinterest.com/js/pinit.js', charset: 'utf-8'
```

これに以下のように　`data-pin-build` 属性を付与します。値が使用できるメソッド名になります。このメソッドを呼び出すことでwidgetを表示出来るようになります。メソッド名は任意のようです。

```html:html
<script
    type="text/javascript"
    async defer
    src="//assets.pinterest.com/js/pinit.js"
    data-pin-build="parsePins"
></script>
```

```haml:haml
= javascript_include_tag '//assets.pinterest.com/js/pinit.js', charset: 'utf-8', 'data-pin-build': 'parsePins'
```

以下のように `ParsePins` メソッドを使えるようになりました。生成のタイミングでこのメソッドを呼び出します。idで指定した範囲で生成します。

```js
var target = document.getElementById("#target")
window.parsePins(target);
```

[Dynamic embedding](https://github.com/pinterest/widgets/issues/13) に解決策として載っていました。

以下も同様の方法を利用しています。(これの Method one)
[Dynamically Rendering AJAX Pinterest Buttons](http://sourcey.com/dynamically-rendering-ajax-pinterest-buttons/)
JQueryを使ってウィンドウを閉じる

#JavaScriptのお時間だ！！！
JavaScriptは基本外部に置きたいよね(素人)
~~説明するときはhtmlに直接書いた方がいいと思う~~

##まずはhtmlを用意

```html:window.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<!-- JQueryの読み込み(CDN) -->
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
<script src="http://code.jquery.com/jquery-migrate-1.2.1.min.js"></script>

<title> Window </title>
</head>
<body>

  <div id="windowclose">
　  ここにマウスを置くとウィンドウが閉じます
  </div>

</body>
</html>
```

##続いてJavascriptの用意
ウィンドウを閉じる処理を書きます
ほぼJQueryです。

ファイル名:window_close.js
*※window.htmlが置いてあるところに「js」っていうフォルダを作ってそこの中に置こう。*
*※↓こんな感じ*

- window.html
- js
    - window_close.js


```js:window_close.js
$(function(){
  var close = $('#windowclose');

  close.on('mouseover', function(){ //clickにするのもアリ
      window.open('about:blank','_self').close();
      //IE以外(chromeなど)はこう書かないとすんなり閉じてくれない
      //きっとwindow.close()を使わせないフレンズなんだね
      //IEもこう書くとアラートなしで閉じてくれる
  });
});
``` 

###合体、ダーッ！

window.htmlにwindow_close.jsを読み込ませる

```window.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<!-- JQueryの読み込み(CDN) -->
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
<script src="http://code.jquery.com/jquery-migrate-1.2.1.min.js"></script>

<script src="js/windowclose.js"></script>
<title> Window </title>
<!-- 省略 -->
```

完成。

##まとめ
今回はhtmlファイル、jsファイル共に1つで説明しました。分かりやすかったでしょうか。
実際に私がこの機能を利用した時は、「大本のページが別にありそこの処理で新しくウィンドウを開きそれを閉じるため」という動きでした。
*mouseoverやclick等を使わなくても処理が終わったら自動的に閉じることもできるんだろうな...というより、よく見かけますよね。
開いたと思ったらすぐ閉じる的なヤツ。~~ただの強制終了とか言わない~~*

まだまだド素人なのでこれからも頑張ります。
シェルのダブルクォートとバッククォートのエスケープの展開

#やりたかったこと
Bash on Windowsで、プロンプト（`user@hostname:~$ `のやつ）のホスト名の部分を変更したかったのですが、どうもWindows側でマシン名を変えないといけないっぽい。
それは面倒なので、`$PS1`をいじって、ホスト名を変えずにプロンプトの表示だけ変えてみます。
元の`$PS1`はこんな感じ

```console
$ echo $PS1
\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$
```

この`\h`の部分がホスト名になるので、sedで置換すればいいだろう、ということで以下のようにしてみました。PCがLet's Noteなので、ホスト名は`LET'S_NOTE`で。

```console
$ export PS1=`echo $PS1 | sed "s/\\h/LET'S_NOTE/g"`
$ echo $PS1 
\[\e]0;\u@\LET'S_NOTE: \w\a\]${debian_cLET'S_NOTEroot:+($debian_cLET'S_NOTEroot)}\u@\LET'S_NOTE:\w\$
```

はい、見事に失敗です。どうも`\\h`のエスケープが上手くいっていないっぽいです。
というわけで、バックスラッシュを増やしてみたところ、上手くいきました。

```console
$ echo `echo $PS1 | sed "s/\\\\\h/LET'S_NOTE/g"`
\[\e]0;\u@LET'S_NOTE: \w\a\]${debian_chroot:+($debian_chroot)}\u@LET'S_NOTE:\w\$
$ echo `echo $PS1 | sed "s/\\\\\\\\\\\\h/LET'S_NOTE/g"`
\[\e]0;\u@LET'S_NOTE: \w\a\]${debian_chroot:+($debian_chroot)}\u@LET'S_NOTE:\w\$
```

試してみたところ、バックスラッシュ5個〜12個なら上手く行くようです。
でも5個でも12個でも同じ結果って、一体どういう展開がされているのか気になったので、いろいろ試してみました。

#シェルのエスケープの展開
##""と``
まず、`""`の展開の仕方を見てみます。

```console
$ echo "\h"
\h
$ echo "\\h"
\h
$ echo "\\\h"
\\h
$ echo "\\\\h"
\\h
```

次にコマンド展開の``` `` ```。シングルクォートの文字列は展開されないので、それを`echo`してコマンド置換してみます。

```console
$ echo '\\h'
\\h
$ echo `echo '\h'`
\h
$ echo `echo '\\h'`
\h
$ echo `echo '\\\h'`
\\h
$ echo `echo '\\\\h'`
\\h
```

つまり、どちらも`\\`は`\`に変換し、`\h`はそのまま残しているようです。

##sedの正規表現のエスケープ展開
次にsedです。

```console
$ echo 'hoge\h' | sed 's/\h/fuga/g'
fugaoge\fuga
$ echo 'hoge\h' | sed 's/\\h/fuga/g'
hogefuga
$ echo 'hoge\h' | sed 's/\\\h/fuga/g'
hogefuga
$ echo 'hoge\h' | sed 's/\\\\h/fuga/g'
hoge\h
```

こちらはダブルクォートの文字列やコマンド展開とは違い、`\h`を`h`に変換しているようです。
正規表現だから当たり前といえば当たり前かもしれません。

#結果
この結果をもとに先ほどのケースを考えてみると納得できそうです。
以下は、わかりやすいように適宜スペースを入れています。

- バックスラッシュ4個の場合
    - バッククォートの展開：`\\ \\ h`が展開され、`\ \ h`に
    - ダブルクォートの展開：`\\ h`が展開され、`\ h`に
    - 正規表現の展開：`\h`が展開され、`h`に
- バックスラッシュ5個の場合
    - バッククォートの展開：`\\ \\ \h`が展開され、`\ \ \h`に
    - ダブルクォートの展開：`\\ \h`が展開され、`\ \h`に
    - 正規表現の展開：`\\ h`が展開され、`\ h`に
- バックスラッシュ12個の場合
    - バッククォートの展開：`\\ \\ \\ \\ \\ \\ h`が展開され、`\ \ \ \ \ \ h`に
    - ダブルクォートの展開：`\\ \\ \\ h`が展開され、`\ \ \h`に
    - 正規表現の展開：`\\ \h`が展開され、`\ h`に

同様に考えると、6〜11個のときも説明できそうです。

文字列と正規表現の展開のされ方が微妙に違っていることを意識するいい機会になりました。
Ruby 技術者認定試験 Silver模擬試験をGoogle Formで自動採点する

#はじめに

「[RUBY技術者認定試験 公式ガイド (ITpro BOOKs)](https://goo.gl/ZyJA35)」と「[Ruby技術者認定試験合格教本 Silver/Gold対応　Ruby公式資格教科書](https://goo.gl/GaVjfj)」の試験が受けられるようにGoogle Formで作りました。選択肢は選択番号のみで、回答後も点数は確認できますが、解説は入れてません。本と一緒でないと使えませんが、本を既に持っている人、これから買う人は使えるので共有します。


#Google Formへのリンク

次の4回分の試験がリンク先で受けられます。スマホからでも利用できるので、本を開きながらスマホでポチポチやって試験が受けられます(Goldの模擬試験は作っていません)。

- 「[RUBY技術者認定試験 公式ガイド (ITpro BOOKs)](https://goo.gl/ZyJA35)」
    - [模擬試験:問題01- 50](https://goo.gl/P1VXYu)
    - [模擬試験:問題51-100](https://goo.gl/vJRgwY)
- 「[Ruby技術者認定試験合格教本 Silver/Gold対応　Ruby公式資格教科書](https://goo.gl/GaVjfj)」
    - [基礎力確認問題](https://goo.gl/oBE8Go)
    - [模擬試験](https://goo.gl/4Hryg6)

#終わりに
「[RUBY技術者認定試験 公式ガイド (ITpro BOOKs)](https://goo.gl/ZyJA35)」は第1版の紙の本を使っています。このときはRuby 1.8が試験対象でした。Ruby 2.1と違うところはチェックしてませんが、あまり無いと思います。「[Ruby技術者認定試験合格教本 Silver/Gold対応　Ruby公式資格教科書](https://goo.gl/GaVjfj)」は[kindle版](https://goo.gl/WqnufL)もありますが、誤植が多いので、紙の本を買って書き込みした方が使いやすいと思います。kindle版もコメントで直せますが、コメントはタッチしないと開かないので、使いにくいと思います。
AWS ELB remote_ipの採取

#tl;dr

ELBに紐付いているWebブラウザログにリモートIPを表示させたい。
Apacheのバージョンごとに記載する。

## Apache 2.2

<pre>

Apacheモジュールインストール
git clone git://github.com/ttkzw/mod_rpaf-0.6.git
cd mod_rpaf-0.6/
make
make install
モジュール設定ファイル更新
cd /etc/httpd/conf.d
vi mod_rpaf.conf

※下記、転送経路のリバースプロキシIPを追記
RPAFproxy_ips 172.18.11.100 #ReverseProxy IP
httpd再起動
service httpd configtest
service httpd restart

</pre>


## Apache 2.4

<pre>
[Web00]
　ec2-54-238-238-100.ap-northeast-1.compute.amazonaws.com
[Web03]
　ec2-54-178-135-10.ap-northeast-1.compute.amazonaws.com

制御参照
[VPC]
　vpc-0exxxxxx
　10.3.0.0/16
[Subnet(Public)]
　CIDR: 10.3.0.0/24
[Subnet(Private)]
　CIDR: 10.3.254.0/24

設定情報

$vi /etc/httpd/conf.modules.d/00-remoteip.conf

LoadModule remoteip_module modules/mod_remoteip.so
<IfModule remoteip_module>
RemoteIPHeader x-forwarded-for
RemoteIPProxiesHeader Remote_Addr
RemoteIPTrustedProxy 10.3.0.0/24
</IfModule>
httpd再起動

/etc/init.d/httpd restart
WebServerログ追跡

tail -f /var/log/httpd/web-api.hoge.com-access_log.yyyymmdd
</pre>


## 付録

<pre>
.htaccess_mente ファイルの現行記述のうち、下記箇所を書き換えれば要求を満たせました。

[1]アクセス元IPでメンテ除外IPを指定

RewriteCond %{REMOTE_ADDR} !^××.××.××.××
↓
RewriteCond %{HTTP:X-Forwarded-For} !^××.××.××.××
[2]ヘルスチェックファイルは、ELB 503判定除外

RewriteCond %{REQUEST_URI} !^/admin/healthcheck.html
</pre>

### 参照

Apache ver.2.4 版
http://iga-ninja.hatenablog.com/entry/2014/08/19/135131
AWSでのWordPress構成を組んでみたのでまとめてみます

![cloudcraft - Web App Reference Architecture (1).png](https://qiita-image-store.s3.amazonaws.com/0/169482/fbbffbbb-0739-a0d4-9318-f4743dbfa9ad.png)

#前提条件
- AWS上にwordpressサイトを構築したい。
- コーポレートサイト。ポータルサイト。
- 想定PV月間30万PV～。（未検証、現状カンで書いてます。）
- 拡張性のある構成にしたい。
- サイト表示スピードをアップさせたい。

#図表捕捉
- security group―ec2はssl用のポートをmyipで設定。
- s3に関してはネイキッドドメインへのアクセスを転送する設定も行っている。
- ec2内は以下の構成
    - centos7
    - nginx
    - php-fpm
    - wordpress

#今後進めていく予定の物
- RDSのスレイブサーバ立ち上げ同期
- ElasticCache導入
- EC2のオートスケーリング
- セキュリティ対策をcentos,nginx,php,wordpres等で行う

#疑問点、調査している事
- RDSはautoscalingできるのか？
- 上記構成でセキュリティホールになりそうなポイントの洗い出し
- AWS上で似た構成の場合wordpressとその他のフレームワークで組んだ時にサーバ代金コスト、セキュリティ作業コスト、サイトスピードなどで違いがあるか。

---
※突っ込みどころがあると思います。お勧めの方法や、間違っている個所などはご指摘いただけたら非常にうれしいです。
具体的な構築方法なども時間ができたらまとめるかもしれません。（未定）
nfsマウントでクライアントを増やした時に「mount.nfs: requested NFS version or transport protocol is not supported」

##サーバー側の設定追加
```
# vi /etc/sysconfig/iptables
```

```/etc/sysconfig/iptables:
-A INPUT -p tcp --sport 2049 -s 172.168.1.1 -j  ACCEPT
-A OUTPUT -p tcp --sport 2049 -d 172.168.1.1 -j ACCEPT
#この行の後に同じように2行該当IPアドレスを指定して入力して追加

-A INPUT -p tcp --sport 2049 -s 172.168.1.2 -j  ACCEPT
-A OUTPUT -p tcp --sport 2049 -d 172.168.1.2 -j ACCEPT
```

反映

```
# service iptables restart
# vi /etc/exports
```

```/etc/exports:
※他行と同様にIPを変えた行を最後に追加
/data1  172.168.1.2(rw,wdelay,no_root_squash,no_subtree_check,anonuid=65534,anongid=65534)
```

反映

```
# /usr/sbin/exportfs -r
```
##クライアント側の設定

```
# yum install nfs-utils
# mkdir /data1
# service rpcbind start
# mount -t nfs -o nfsvers=3  172.168.1.225:/data1 /data1
```
**エラー！**
```mount.nfs: requested NFS version or transport protocol is not supported```

##解決
なんてことはなく

```
# service nfs restart
```
で、解消。。
既存のクライアントへの影響が若干心配であるが、直後に確認した限りではマウントが外れるようなことはなかった。
[Visual Studio Code][C/C++] C/C++向けMakefile用tasks.json

C/C++向け Makefile 用の tasks.json 設定例です。

実行後は、`F8`/`Shift-F8`で次のエラー/前のエラーにジャンプできます。

# tasks.json 設定例

```json:tasks.json
{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "0.1.0",
    "command": "make",
    "isShellCommand": true,
    "showOutput": "always",
    "suppressTaskName": true,
    "tasks": [
        {
            "taskName": "Makefile",
            "isBuildCommand": true,
            "args": [
                "all"
            ],
            "problemMatcher": {
                "owner": "cpp",
                "fileLocation": [
                    "relative",
                    "${workspaceRoot}"
                ],
                "pattern": {
                    "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$",
                    "file": 1,
                    "line": 2,
                    "column": 3,
                    "severity": 4,
                    "message": 5
                }
            }
        }
    ]
}
```

# 参考
[C/C++ extension for Visual Studio Code | Visual C++ Team Blog](https://blogs.msdn.microsoft.com/vcblog/2016/03/31/cc-extension-for-visual-studio-code/)
[.net - Visual Studio jump to next error shortcut? - Stack Overflow](http://stackoverflow.com/questions/1695040/visual-studio-jump-to-next-error-shortcut)
codecov で altjs (typescript) のカバレッジを報告に手間取った話

# はじめに

[codecov](https://codecov.io/) で typescript のカバレッジを報告しようとしたら、 `no-reports-generated  error=Error` となってグラフが表示されなかった話です。
厳密に言うと、ソースコードは typescript で書いているものの、テストはトランスパイルされた javascript に対して行っている状況です。typescript でテストを書いたらそもそもこの状況は起こらないかもしれません。

## codecov とは

テストするときによく用いられる指標として、カバレッジ（coverage）ってありますよね。CI の過程でこの工程が手動というのはやはり良くないので、カバレッジを自動で計算して github の README にペタッと貼っておいてくれるというのは、エンジニアの自然な欲求なわけです。
そのうち、codecov がカバーしてくれるのは、"github の README にペタッと貼っておいてくれる" という部分です。

### codecov の使い方

まずは codecov のサイトに行きます。
https://codecov.io/

次に、サインアップまたはサインインします。
次に、リポジトリを選択する画面が出てくるので、対象のリポジトリをクリックします。
すると、下図のように、「オッケー！」って感じの画面が出てくるんですけど、ここからちょっと手間取ったので簡単に続きを書きます。

![スクリーンショット 2017-03-09 13.56.09.png](https://qiita-image-store.s3.amazonaws.com/0/52780/ce54da06-741e-aba6-fed0-b1b29b5a8372.png)


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

codecov にレポートを報告するためには、専用のツールを使います。
言語毎に用意されているようなのですが、ここでは node を例に説明します。
インストールは以下のように npm経由でします。

```bash
$ npm i --global codecov
```

#### coverage の計算

codecov自体には coverage を計算する機能（と、もちろんテストを実行する機能）はないので、それぞれ適宜好きなものをインストールします。
テストはともかくとして、coverage の計算には [istanbul](https://github.com/gotwarlost/istanbul) というツールが公式で採用されているので、とりあえずこちらを採用してみます。 

```bash
$ npm i --save-dev istanbul
```

インストールが終わったら、カバレッジの計算をします。
今回は、mocha を使う前提です。

```bash
$ ./node_modules/.bin/istanbul cover _mocha -- -R spec
```

このコマンドを実行すると、何やら小気味よい出力が流れて、最後に coverage/ の下に保存したよ！という旨のコメントが表示されます。
もし coverage/ の下に何もなかったり、そもそも coverage/ がなかったりしたら失敗しています（私は何も出なかったのでエラーメッセージを読んで頑張って解決してください）。

#### codecov への報告

codecov へは先述の通り、 codecov という CLIツールを使って報告します。
とりあえず公式ページに載っている通り、以下のように実行したら失敗しました。

```bash
$ codecov
```

失敗の要因は次の２つでした。

* TOKEN が無い
* coverage.json のマッピングがおかしい

##### TOKEN が無い

これはエラーメッセージに表示されたので、すぐに解決しました。
具体的には、以下のように環境変数に設定すれば大丈夫です。

```bash
$ export CODECOV_TOKEN="..."
```

OSS のリポジトリだとトークンが書き込まれるのはあまり良くないので、travisCI や CircleCI などでも環境変数に設定すると良いかと思います。

##### coverage.json のマッピングがおかしい

これは 30分くらい悩んだのですが、結論から言うとこの issue と同じ問題でした。
https://github.com/codecov/codecov-node/issues/32

つまり、トランスパイルされた生成済みの javascript に対してカバレッジのレポートを作成したけど、ソースコードと違くない？ .mapファイルを同梱してよ！ということです。
なので、冒頭に書いた通り、

> ソースコードは typescript で書いているものの、テストはトランスパイルされた javascript に対して行っている状況です。typescript でテストを書いたらそもそもこの状況は起こらないかもしれません。

という推察になります。

ところで私はというと、mapファイルも生成するようにしていたので、？？となっていたのですが、結局 [remap-istanbul](https://github.com/SitePen/remap-istanbul) というツール（前述の issue で codecov の中の人が提案していたもの）を使うことで解決しました。

```bash
# インストール
$ npm i --save-dev remap-istanbul

# coverage.json のリマップ
$ cat coverage/coverage.json | ./node_modules/.bin/remap-istanbul > coverage/coverage-remap.json

# 報告
$ codecov -f coverage/coverage-remap.json
```

実際に動いているリポジトリがあるので、困ったら参考にしてください。
https://github.com/chase0213/extdate

特に、`.travis.yml` と `package.json` を見れば良いかと思います。

最後に、バッジを README にペタッと貼ったら完成です。強くなった気がします。

![スクリーンショット 2017-03-09 14.21.27.png](https://qiita-image-store.s3.amazonaws.com/0/52780/e50c8ac9-b541-4d2e-53aa-9f2e9adcf4fe.png)


# おわりに

目指せ快適 CI生活。
スタージェスの公式を用いて階級数を決める

# スタージェスの公式（Sturges' rule）
度数分布やヒストグラム作成時の階級数の目安を得られる公式。
nをサンプル数、kを階級数として下記の式で求めることができる。

```math
k = 1 + log_2N
```

# 例
サンプル数40（N=40）のデータがあったとし、それよりヒストグラムを作成する場合の階級の数を求める。

```math
1 + log_240 = 6.3219280948874 ≒ 6
```

これより階級数6を設定する。

# 注意
スタージェスの公式を用いて得られる階級数はあくまでも**目安**でしかない。
（度数分布表・ヒストグラムの作成にあたっての階級数設定について絶対的な答えは存在しない）

# Pythonでのメソッド化

```ptyhon:sturges.py
import math

def sturges_rule(n):
    u"""
    スタージェスの公式
    """
    return round(1 + math.log2(n))
```

※math.log2はPython3 >= 3.3
（それ以前のバージョンであれば、math.log(n, 2)を利用）
https://docs.python.jp/3/library/math.html#math.log2

前述の「例」で確認。

```
>>> from sturges import sturges_rule
>>> sturges_rule(40)
6
```

#参考
* [「ヒストグラムは怖い―スタージェスの公式―」](http://www10.plala.or.jp/mondai/columun/hist.pdf)
VCCWでローカル上にWordPress環境を構築した話

メディア立ち上げのためにWordPressで構築しようと思い、せっかくVagrant環境が既にあったのでそこに作っちゃえという日記的な話。

## VCCWとは
Vagrant、VirtualBox上のWordPress開発環境のことです。
ローカル開発環境だとMAMPの方が有名な感じがあるのですが、今回は複数人で開発を進めると想定されているのでプロジェクト毎に環境を共有しやすいVCCWで立てました。

[VCCW 公式](http://vccw.cc/)

## 導入手順
1. Vagrant, VirtualBox導入(省略)
2. vagant-hostsupdaterのインストール
3. vagrant boxのダウンロード
4. VCCWのダウンロード
5. ホスト情報などカスタマイズ

### vagant-hostsupdaterのインストール
vagant-hostsupdaterは、Vagrant起動時にホスト設定を勝手にごにょごにょしてくれるものです。何のこっちゃという感じですが、仮装マシンごとに`/etc/hosts`にドメインやipアドレスをいちいち記述しなくても、Vagrantfileに書かれた情報を元に設定してくれるので手間が省ける優れものというわけです。

インストールは
`vagrant plugin install vagrant-hostsupdater`

`/ets/hosts`って何それ？という人には
http://www.linux-beginner.com/linux_setei1.html

### vagrant boxのダウンロード
仮装マシンを使うためにはひな型であるboxが必要です。
2017年3月現在ではVCCW v3の`vccw-team/xenial64`というboxを使用しています。

`vagrant box add vccw-team/xenial64`

### VCCWのダウンロード
git cloneで

`git clone https://github.com/vccw-team/vccw.git`

### ホスト情報などカスタマイズ
`provision/default.yml`をコピーしてWordPressユーザー名やホスト名などを設定し直します。

`cp provision/default.yml site.yml`

それぞれ項目が書いてあるので自分に合った内容に編集しましょう。
私はローカル上で`192.168.33.10`を既に使用しているため、`192.168.33.50`を割り当てました。

```
#
# Network Settings
#
hostname: local
ip: 192.168.33.50
.
.
.
#
# WordPress User
#
admin_user: admin
admin_pass: admin
admin_email: vccw@example.com
```

※ yml形式はコロン（:）の後にスペースを付けないとエラーを吐くので注意

カスタマイズが完了したらプロジェクトフォルダ内で`vagrant up`をして起動

自分が設定したホストにアクセスして動作確認
`192.168.33.50/wp-login.php`

表示を確認して構築完了です。


## ※ boxについての注意点
回線状況や時間帯によっては`vagrant add box`がアホみたいに時間が掛かってしまう（想定残り7時間とか表示される時があった）ので、場合によってはWP-CLIで導入するのもアリ。

自分の場合は、朝に改めてaddしたらすんなりいけたので時間帯が悪かったのかも。

[WP-CLIでVCCW環境をほいほい作る](http://qiita.com/miya0001/items/687d142d714b1386a44f)


## 参考
- [WordPressをVagrant環境にらくらくインストールする。 - VCCW](http://qiita.com/naru0504/items/58011181f2c271808c7f#vagant-hostsupdater%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)
Go言語でOracleに接続する（Windows）

Go言語でOracleに接続する方法です。

以下のLinux版の記事を参考に、Windows7でアクセスできることを確認しました。

[go-oci8のセットアップ手順（Linux）](http://qiita.com/qt-luigi/items/fbbe6792a77b493a58f9)

上記記事と同じく、mattnさんのgo-oci8パッケージを使用しています。

* [mattn/go-oci8](https://github.com/mattn/go-oci8)

# 前提条件

* Go言語がインストールされていること
* SQL*Plusクライアントがインストールされていること

WindowsでもLinuxと同じくOracle Databseはインストールされていなくても大丈夫です。

私の環境は、Goのバージョンは1.7.4、SQL*Plusのバージョンは11.2.0.1.0でした。

# Instant Clientのダウンロード

以下のサイトから、SQL*Plusのバージョンに合わせてダウンロードします。

[Instant Client Downloads](http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html)

以下がダウンロードしたzip。

* instantclient-basic-nt-11.2.0.4.0.zip
* instantclient-sqlplus-nt-11.2.0.4.0.zip
* instantclient-sdk-nt-11.2.0.4.0.zip

展開して、instantclient_11_2ディレクトリにまとめます。

ディレクトリの場所は任意ですが、私はC:\appの下に配置しました。

# pkg-configのインストール

pkg-config.exeが必要なのですが、MinGWというツールセットに入っているので、これをインストールします。

以下の記事を参考に、環境変数の設定までを行います。

[MinGW(gcc) の Windows へのインストールと使い方](http://yohshiy.blog.fc2.com/blog-entry-292.html)

私の場合はC:\MinGW\binの中にpkg-config.exeが入っている状態です。

# oci8.pcファイルの作成

こちらも配置は任意ですが、以下のディレクトリを作成したと仮定して進めます。

C:\app\instantclient_11_2\pkgconfig

上記ディレクトリに「oci8.pc」ファイルを作成します。

``` oci8.pc
prefix=C:/app/instantclient_11_2
exec_prefix=${prefix}
libdir=${prefix}
includedir=${prefix}/sdk/include
oralib=${prefix}
orainclude=${prefix}/sdk/include

glib_genmarshal=glib-genmarshal
gobject_query=gobject-query
glib_mkenums=glib-mkenums

Name: oci8
Description: oci8 library
Version: 11.2
Libs: -L${libdir} -loci
Libs.private:
Cflags: -I${includedir}
```

# 環境変数の追加

以下の環境変数を追加します。

変数名：PKG_CONFIG_PATH 
変数値：C:\app\instantclient_11_2\pkgconfig

# go-oci8の取得

go get または glide で入手します。

```
go get github.com/mattn/go-oci8
```

``` glide.yaml
package: .
import:
- package: github.com/mattn/go-oci8
```

# Goの実装

``` go
// 以下のように接続して
connectStr := "{Oracle User}/{Oracle Password}@{IP}:{Port}/{SID}"
db, err := sql.Open("oci8", connectStr)
if err != nil {
    fmt.Printf("DbOpen Error: %s", err)
    return
}
defer db.Close()

// 以下のようにクエリ投げる
rows, err := db.Query("SELECT ID, NAME FROM HOGE_TBL")
if err != nil {
    fmt.Printf("Query Error: %s", err)
    return juchuViews, err
}
defer rows.Close()

// 以下のようにデータを取得する
for rows.Next() {
    var id int
    var name string

    rows.Scan(&id, &name)

    fmt.Println(id)
    fmt.Println(name)
}
```
BIG-IP iRule クライアントのIPアドレスに応じて割り振りPoolを変える

## iRule

iRule の PD には 'log local0.' を使用してログを吐かせると良いです。 
HTTP_REQUES(HTTPがトリガ) は CLIENT_ACCEPTED(TCPがトリガ) にしてもOKです。

サンプルiRule

```
# 10.10.10.10 からの通信は pool1 へ割り振り
# 20.20.20.20 からの通信は pool2 へ割り振り
# その他は Pool3 へ割り振り

when HTTP_REQUEST {
  if {[IP::addr [IP::client_addr] equals 10.10.10.10]}{
  log local0. "[IP::client_addr] is accessing pool1"
    pool pool1
  } elseif {[IP::addr [IP::client_addr] equals 20.20.20.20]}{
  log local0. "[IP::client_addr] is accessing pool2"
    pool pool2
  } else {
  log local0. "[IP::client_addr] is accessing pool3"
    pool pool3
  }
}
```

## ログ

こんな風にログが出ます。(/var/log/ltm)

```
[root@BIG-IP:Active] config # tailf /var/log/ltm
Mar  9 13:45:10 BIG-IP info tmm1[16270]: Rule /Common/irule1 <HTTP_REQUEST>: 10.10.10.10 is accessing pool1
Mar  9 13:47:59 BIG-IP info tmm1[16270]: Rule /Common/irule1 <HTTP_REQUEST>: 20.20.20.20 is accessing poo2
Mar  9 13:58:55 BIG-IP1600-4 info tmm[16270]: Rule /Common/ntn_irule1 <CLIENT_ACCEPTED>: 10.1.30.133 is accessing pool_ntn
創造的なチームを作る

**言い訳**: 一旦考えをまとめて公開、更新の余地があります。

# モチベーション
半年ほど前、職場で組んでいた3人のチームで約1年の間に経験した奇跡的に楽しかった記憶を元に考察したチームマネジメントの要諦を遺して置きたい。メンバーへの感謝の気持ちも込めて大層なタイトルだが、これでお願いします。

# 何が楽しかったか（理想のチーム像）
それぞれの個性、スキルを活かしてメンバーもチーム（での活動）も改善を続け、成長した実感があった。プロジェクト運営も不安は少なく、社内にもいくつかフィードバックをして活動が広がった事もあった。そして、なにより、メンバーの仲が良くて尊敬しあっていた。チームが解散した後も、親しく集まって懐かしめるのが証左かと思う。

# 背景
簡単に仕事内容を書くと、クライアントに常駐しているデータ分析のコンサルタントで主にマーケティング分野の分析を行っている。対象PJTが、クライアント内で新しい部署への常駐開始で、チームメンバーも過去に組んだ事が無かったのでチーム運営はそれぞれの経験を持ち寄った。メンバーは、割と年齢はそれぞれ離れていて自分が30代後半で中途採用で職種も転々、もう1人が30代の中途採用でコンサル出身、最後の1人は20代の院卒プロパーでプログラミングスキルに定評があった。データ分析の文脈の中では有るが、各々のバックグラウンドも多様だった。全員が、比較的、個人の成長に価値を置いている点では同質的でもあった。

# 戦略
 - ルール（習慣）を決める
 - 相互理解を深める
 - 手軽にはじめ、できる事を続ける

# ルール（習慣）を決める
過去に、[Googleの研究](http://gigazine.net/news/20160229-how-to-build-perfect-team/)も出たが、全員が尊重するルールを決める事には注意を払った。隔週で、チーム改善についてのMTG.の時間も設け、様々な会議体やルールを作って実施してみた。

 - 朝会とタスクリストの共有
 - 3分hacking (ミニ勉強会)
 - スプリント更新
 - チームよくする会議
 - 合宿
 - No Talking Day

# 相互理解を進める
実は、「飲み」はあまり無かった。ランチは上記の通り最初は意識的に一緒に行くことにして習慣化した。ツールも利用しながら、お互いの状況を可視化して判るようにすると共に、相談する機会もしきいを低くした。また、ランチ以外にも業務外で話す機会を組み込んでお互いの背景を理解できる機会があった

 - Confluence
 - JIRA
 - Jupyter Notebook
 - Github
 - チャット（Slackライク）
 - バタフライボード
 - 1 on 1 MTG.
 - ストレングス・ファインダー
 - PMBOKを参照したリスク把握
 - ランチログ
 - Campfire

# 手軽にはじめて、できる事を続ける
新しいルールや取り組みは、スプリント更新時や隔週のチームよくする会議で話されて、（ゆるく）担当を決めて開始した。次の会議のタイミング等で定期的に見直して続けられてないものは廃止した。開始前も、手間がかかりそうな事などは極力簡素化した

## 以下は、開始したが早期に終了したもの
- コードシェアリング  
学習目的と（情報共有による）業務効率化の間で目的が不明確になり止めた
- 長期的にメンバーがやりたいテーマを話す会議  
クライアント提案に組み込む意図だったが、日々の分析から発展する形での提案が進み、やる目的が曖昧で準備も煩雑だったので止めた
- ランチタイムアタック  
ランチ時間の注意も楽しむ為、その日の担当が規定時間にピッタリ席に帰って来れたら他のメンバーが奢るルールだったが、一定期間やった後は形骸化したので止めた

END
Apache + Wordpress (MySQL) 参考リンク

### 参考
（*は最も決め手になったもの）
Wordpressをローカルインストールする（工程の大半）
* http://qiita.com/himitech/items/342235828a4c2513dd4d
Wordpressのプラグインを書く権限がないと怒られたとき
http://wpnow.io/how-to-solve-wordpress-could-not-create-directory/
* https://forum.piwik.org/t/local-mountain-lion-os-x-install-permission-problems/9817
ローカルからドメイン名でアクセスできない
* http://www.bflets.dyndns.org/Trouble/LocalDomain.html
ラムダ式を使えば、簡単にコールバック関数に引数を渡せる

## あらまし
コールバック関数に引数を渡すには少し手間が必要ですが、
ラムダ式を利用すれば簡単に書けるよって話です。

## std::sortでの例
例えば、「ある数値に近い順でソートしたい」場合、
std::sortにて実現する際は、関数オブジェクトを用意する必要がありました。
※何故これをするかの理由は、省略します。理解しているという前提で話を進めますm( _ _ )m

```C++:5に近い順でソート（関数オブジェクト）
class AbsDist
{
public:
  AbsDist(int ref) :_ref(ref){};
  bool operator() (int l, int r) const {
    return abs(l - _ref) < abs(r - _ref);
  }
private:
  int _ref;
};

int main(int argc, _TCHAR* argv[])
{
  std::vector<int> numbers1 = { -1, 10, 2, 5, 6, -5, -10, 9, 8, 5 };
  int ref = 5;	
  std::sort(std::begin(numbers1), std::end(numbers1), AbsDist{ref});
  print(numbers1); // 5, 5, 6, 2, 8, 9, 10, -1, -5, -10
  return 0;
}
```

プログラムの中で、このような処理が何度も実行されるならまだしも、
たった数回の場合は、そのためにわざわざクラスを作るのが手間です。
そういうときは、ラムダ式で書くことが出来ます。

```C++:5に近い順でソート（ラムダ式）
int main(int argc, _TCHAR* argv[])
{
  std::vector<int> numbers2 = { -1, 10, 2, 5, 6, -5, -10, 9, 8, 5 };
  int ref = 5;	
  std::sort(std::begin(numbers2), std::end(numbers2),[&ref](int l, int r){
    return abs(l - ref) < abs(r - ref);
  });
  print(numbers2); // 5, 5, 6, 2, 8, 9, 10, -1, -5, -10
  return 0;
}
```

ちなみに、こういう書き方もできます。

```C++:5に近い順でソート（ラムダ式2）
int main(int argc, _TCHAR* argv[])
{
  std::vector<int> numbers3 = { -1, 10, 2, 5, 6, -5, -10, 9, 8, 5 };
  int ref = 5;	
  auto absDist = [&ref](int l, int r) -> bool{
    return abs(l - ref) < abs(r - ref);
  };
  std::sort(std::begin(numbers3), std::end(numbers3),absDist);
  print(numbers3); // 5, 5, 6, 2, 8, 9, 10, -1, -5, -10
  return 0;
}
```
ただこれは、ソート実行時に引数を指定できない&明確でないため、状態がいまいちわかりづらいかなと。

## まとめ
ラムダ式を使えば、簡単にコールバック関数に引数を渡すことができました。
今回はstd::sortを例にしましたが、他の関数にももちろん応用できますので、是非お試しあれ。

## ソース
https://code.hackerearth.com/8aeca1R