OmniAICreator/Qiita-1.07M huggingface dataset:
Raspberry PiでBUFFALOのWLI-UC-GNを使う私的メモ

Raspbian環境を再構築したのでメモ。

# 用意したもの
- RasPi3 modelB
- Raspbian jessie 2016-05-27(インスコしといてね)
- 5V USB(PC)
- BUFFALO WLI-UC-GN
- 有線LAN(キーボードと画面つなぐならいらない。私はSSH使用のため)

# 方法
### 参考ページ
- http://ryoyamauchi.blogspot.jp/2015/05/raspberry-pi-2-wli-uc-gn.html
- http://www.xmisao.com/2014/01/16/how-to-connect-wpa2-wireless-lan-using-wpa-supplicant.html  
ありがとうございました。

### 手順

1. lsusbコマンドで認識してるかどうか確認 
```pi@raspberrypi:~ $ lsusb
Bus 001 Device 004: ID 0411:015d BUFFALO INC. (formerly MelCo., Inc.) WLI-UC-GN Wireless LAN Adapter [Ralink RT3070]
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub```

1. 以下2つのファイル作成
```pi@raspberrypi /etc/udev/rules.d $ sudo nano 99-wireless.rules```
中身:```#BUFFALO WLI-UC-GN
ACTION=="add",SUBSYSTEM=="usb",ATTR{idVendor}=="0411",ATTR{idProduct}=="014f",RUN+="/sbin/modprobe -qba rt2800usb"```
と
```pi@raspberrypi /etc/modprobe.d $ sudo nano wireless.conf```
中身:```#BUFFALO WLI-UC-GN
install rt2800usb /sbin/modprobe --ignore-install rt2800usb $CMDLINE_OPTS;/bin/echo "0411 014f" > /sys/bus/usb/drivers/rt2800usb/new_id```

1. リブートしませう
`sudo reboot`

1. `sudo iwconfig`でwlan0が認識されてるか確認。
2. `iwconfig wlan0 essid "your-ssid"`と`iwconfig wlan0 key s:your-pass`を実行(「your-pass」はパスワード入れなくていいよ)
1. ```$sudo sh -c "wpa_passphrase SSID パスフレーズ >> /etc/wpa_supplicant/wpa_supplicant.conf"```で接続設定
を/etc/wpa_supplicant/wpa_supplicant.confに書き込む。   

2. もいっかいリブートしませう
3. 接続完了のはず。`iwconfig`で確認
```pi@raspberrypi:~ $ iwconfig
wlan0     IEEE 802.11bgn  ESSID:"あなたのSSID"
          Mode:Managed  Frequency:2.417 GHz  Access Point: アクセスポイントのMACアドレス
          Bit Rate=65 Mb/s   Tx-Power=20 dBm
          Retry short limit:7   RTS thr:off   Fragment thr:off
          Power Management:off
          Link Quality=53/70  Signal level=-57 dBm
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:3  Invalid misc:117   Missed beacon:0```
と返ってくれば成功!!

# 注意
ステップ5はなぜかこのドングル特有?の問題らしい。
要するにダミーのパスを設定しといてから本物設定するのね。
詳しくは参考ページの2番目「ぺけみさお」さん参照。
Bluemixのブロックチェーンサービスを起動

2016年3月からBluemixでブロックチェーンサービス(β版)が開始しました。
本記事ではBluemixのブロックチェーンサービスを起動するまでの手順を解説します。
β版のためか、まだ不安定でおかしな挙動をすることもありますがそのうちのいくつかは対処可能なのでそれについても記述してあります。

サービス起動後の基本操作はこちら↓
http://qiita.com/ko-he-8/items/0788d6c8becef75ebc51

# 前提条件
 Bluemixのアカウントを所持している。
 組織、地域、スペースを作成しダッシュボードが表示されている。
 
# ダッシュボードでの操作
Bluemixにログインしましょう
以下のような画面が表示されるのでネットワークをクリックしてください
※　左上に「Try The new Bluemix」と表示されている場合古いタイプのダッシュボードが表示されています。「Try The new Bluemix」をクリックして新しいタイプのダッシュボードを使用してください。

![スライド05.jpg](https://qiita-image-store.s3.amazonaws.com/0/86684/a48ab0d3-4693-f166-e72c-fa593c5a0bd2.jpeg "スライド05.jpg")

次は右上のボタンをクリック

![スライド06.jpg](https://qiita-image-store.s3.amazonaws.com/0/86684/e6876f1d-030d-95b1-6206-135bfff4e8d2.jpeg "スライド06.jpg")

ネットワークの中にBlockchainのサービスがあるのでクリックしましょう。

![スライド07.jpg](https://qiita-image-store.s3.amazonaws.com/0/86684/c07bbfac-b090-633b-13e2-12c30157fedd.jpeg "スライド07.jpg")

少し下にスクロールすると「作成」ボタンがあるのでクリックしましょう。

![スライド08.jpg](https://qiita-image-store.s3.amazonaws.com/0/86684/c9afde86-df68-bf71-dfa5-2e6a70ea2deb.jpeg "スライド08.jpg")

まれに「Whops」と表示されることがあります。
これは障害が起きている時に表示されます。
地域を変更(例えばシドニーから米国南部)すると別地域では動作していることもあります。


![スライド09.jpg](https://qiita-image-store.s3.amazonaws.com/0/86684/f595063c-c272-44d5-b331-9046b0e8c985.jpeg "スライド09.jpg")

正常にブロックチェーンサービスが起動している場合
以下の画面が表示されます。
緑の「LAUNCH」をクリックしてください。
これでBlockchainサービスが別タブで起動します。


![スライド10.jpg](https://qiita-image-store.s3.amazonaws.com/0/86684/e65fb0f0-d5f6-e9d8-ec19-9dd233f41b5f.jpeg "スライド10.jpg")


以下のような画面が別タブで開くと思います。
以上でブロックチェーンサービスの準備は終了です。

![bluemix_bc.png](https://qiita-image-store.s3.amazonaws.com/0/86684/2c8fa52d-c523-ebaa-3fc1-8ebb9a2e59ee.png)

※　まれにAPIs、Deployのタブが表示されないことがあるようです。その場合URLを https://obc-service-broker-prod.au-syd.mybluemix.net/v2/monitor に変更してください


実際の操作はこちら
http://qiita.com/ko-he-8/items/0788d6c8becef75ebc51
[nginx] Mime タイプごとに expires 設定

```http```ディレクティブに ```map``` ディレクティブを追加

```text:nginx.conf
map $sent_http_content_type $expires {
    default                off;
    ~image/                max;
    ~audio/                max;
    ~video/                max;
    text/css               30d;
    text/javascript        30d;
    application/javascript 30d;
    application/pdf        max;
}
```

mime タイプは正規表現でも書ける。
```server``` ディレクティブに以下を追加

```text:nginx/conf.d/server.conf
server {
 expires $expires;
 # :
}
```

これで安心
laravel5 個人メモ

#MVCパターン
- Model
    - データ管理
- View
    - 表示管理
- Controller
    - 処理の制御

#用語メモ
- ヘルパー関数
- ファサード
- サービスプロバイダー
- コンポーザー
- staticメソッド


#blade関連
- @extends('xxx')
    - 適応するレイアウトフレームを指定する
- @yield('xxx')
    - xxxのコンテンツを表示する。
- @section('xxx')、@endsection
    - そこに囲まれた範囲が、レイアウトフレームの@yield('xxx')に表示される
    - @section('xxx','任意の文字'）で@yield('xxx')に任意の文字を表示することもできる
- {{$xxx}}
    - {{}}ないのphpをechoする。自動的にサニタイズされる。{!! !!}の場合はサニタイズなし。
[nginx] リバースプロキシキャッシュから返ってきてるか確認する方法

```server``` ディレクティブに以下を追加

```text:nginx.conf
add_header X-Cache-Status $upstream_cache_status;
```

キャッシュヒットしてる時は ```X-Cache-Status``` ヘッダとして ```HIT```、キャッシュヒットしてない時は ```MISS``` が返ってくる

```bash
$ wget -S --spider https://lets.ninja/
Spider mode enabled. Check if remote file exists.
--2016-06-20 20:02:13--  https://lets.ninja/
Resolving lets.ninja... 54.92.34.103
Connecting to lets.ninja|54.92.34.103|:443... connected.
HTTP request sent, awaiting response... 
  HTTP/1.1 200 OK
  Server: nginx
  Date: Mon, 20 Jun 2016 11:02:13 GMT
  Content-Type: text/html; charset=UTF-8
  Connection: keep-alive
  Vary: Accept-Encoding
  X-Cached: Mon, 20 Jun 2016 08:40:33 GMT
  X-Cache-Status: HIT
Length: unspecified [text/html]
Remote file exists and could contain further links,
but recursion is disabled -- not retrieving.
```
numpyのlinalg.lstsqとpolyfit/poly1dについて

# 疑問
pythonで数値処理を始めて、まだ慣れておらず、ひとつ疑問に思ったことがあるので調べてみました。

pythonの数値計算ライブラリを使えば線形回帰直線を引くことが可能なのですが、
線形回帰直線の係数の導出に複数のやり方があるように思えました。


`linalg.lstsq`と`polyfit/poly1d`です。

以前紹介した記事中で

```py
from matplotlib import pyplot as plt
import numpy as np

def main():
  data = np.genfromtxt("airmiles.csv",delimiter=",", skiprows=1)

  x = data[:,1]
  y = data[:,2]
  A = np.array([x,np.ones(len(x))])
  A = A.T
  m,c = np.linalg.lstsq(A,y)[0]

  plt.scatter(x, y)
  plt.xlabel('year')
  plt.ylabel('airmiles')
  plt.plot(x,(m*x+c))
  plt.show()

if __name__ == '__main__':
    main()
```

データはこちらhttps://vincentarelbundock.github.io/Rdatasets/csv/datasets/airmiles.csv
のCSVファイルを利用。

このコード上では変数mとcにそれぞれ、係数と切片が計算されて代入されます。

一方pythonのnumpyを使っていくと、

```py
from matplotlib import pyplot as plt
import numpy as np

def main():
  data = np.genfromtxt("airmiles.csv",delimiter=",", skiprows=1)

  x = data[:,1]
  y = data[:,2]
  z = np.polyfit(x, y, 1)
  p = np.poly1d(z)

  plt.scatter(x, y)
  plt.plot(x, p(y), '.')
  plt.xlabel('year')
  plt.ylabel('airmiles')
  plt.show()

if __name__ == '__main__':
    main()
```

こちらの書き方でも回帰直線の数値を求めることが可能であることに気づきました。

両者を出力してみると、

```py
('m: %d', 1350.2817391303561)
('c: %d', -2620496.1353621646)
('p: %d', poly1d([  1.35028174e+03,  -2.62049614e+06]))
```

となり、書き方が違うだけのようでした。

さて後者の方がどういう関数を利用してるか見てみますと、

`polyfit`

詳細はこちらhttp://docs.scipy.org/doc/numpy/reference/generated/numpy.polyfit.html
これは多項式に関して最小二乗法により近似式を求める関数のようです。

```py
polyfit(x, y, n)
```
という形で使用し、x,yには説明変数を、nにはそれらに近似させたい式の最大次数を入力します。

次に

`poly1d`

こちらですが、実例を見ると早いです。

```
p = np.poly1d([1, 2, 3])
print(np.poly1d(p))
   2
1 x + 2 x + 3
```
参照)http://docs.scipy.org/doc/numpy/reference/generated/numpy.poly1d.html

上記のように、`[1, 2, 3]`を多項式の係数をして変換してくれるわけです。

以上より、

`poly1d(polyfit(x,y,1))`

のような形式で、利用します。


---

詳しくはこちらに違いが載っておりましたので、共有させてもらいます。
http://qiita.com/HirofumiYashima/items/7e18970d68a5c83084e7





Electronのレンダラーでうっかりメイン側node.jsのrequestを使っちゃったら

# <i class="fa fa-graduation-cap" aria-hidden="true"></i> 結論

**本質**
わざわざメインプロセスからラッパーを呼び出さず、`XMLHttpRequest`書きましょう。

**一言で**
レンダラー側が終了するときは、`request`を中止しなければならない。

**事前知識**
レンダラーウィンドウが切り替わる(終了・更新・遷移)ときは、メインプロセスとのイベントをクリアしなければならない

**以下動作からの憶測**
`node.js`の`request`も、メインプロセスから呼び出している以上、メインプロセスと関係がある。
なので、リクエストが完了し、レンダラープロセスで完了時の処理を行うとき、既に開放されていれば、メインプロセス側から参照先がなくなりエラーとなる。


# <i class="fa fa-cogs" aria-hidden="true"></i> 環境

* Electron 0.37.2
* Windows 7

# <i class="fa fa-cubes" aria-hidden="true"></i> 事象

定期的に外部に`get`を行うページから別ページに移動したとき、不定期に
![eerror.JPG](https://qiita-image-store.s3.amazonaws.com/0/62354/e3dbca63-e3a5-1470-d1bd-99af19cacbc4.jpeg)
のエラーがでる。
対象コードは

```js
var request = require("remote").require('request')
request.get({url: url + tag, json:true} ,function (error, response, body) {
```

# <i class="fa fa-code" aria-hidden="true"></i> 解決

レンダラー側が終了したのにリクエストが残り、完了してしまうのが原因なので、呼び出したjsが終了するときに、通信も中断する。
発生が不定期なのでまだ確証が得られていないが、未だエラーには遭遇していない。

[javascript - node.js: how to stop an already started http request - Stack Overflow]

```js
// 移動時にリクエストを中止するためのrequestの返り値
var watchRequest
var request = require("remote").require('request')
watchRequest = request.get({url: url + tag, json:true} ,function (error, response, body) {
// 中略

// リロードではcloseが呼ばれないのでだいたいこちらに書いている
window.addEventListener('beforeunload', function() {
	// 通信を中断してメインプロセスがこちらを呼びだそうとさせない
	watchRequest.abort()
})

```

# :question: なぜ`XMLHttpRequest`使わなかった？

多分、理解することと書くこととが面倒で、`request.get()`のほうが簡単だったから…
横着の報いが無駄なイベント登録となりました。

[javascript - node.js: how to stop an already started http request - Stack Overflow]:http://stackoverflow.com/questions/15747632/node-js-how-to-stop-an-already-started-http-request
VisualStudio2015のデバッグ中に「最適化されている可能性があります。」と表示されてしまって変数が参照できないときは…

# 概要
VisualStudioでデバッグ中、```ローカル変数または引数はこの命令ポインターで利用できないため、値を取得することはできません。最適化されている可能性があります。```と表示され、VisualStudioの自動変数ウィンドウで変数の中身が参照できなくなったことはありませんか？
それを解除して、変数を参照できるようにする方法です。


# 本題
下記の手順で参照できるようになります。

## 手順
1. VisualStudioの**プロジェクト**タブを選択
2. **[プロジェクト名]のプロパティ(E)**を選択
3. **ビルド**を選択
4. 全般の**コードの最適化(Z)**のチェックボックスを外す

## なぜ参照できなくなる？
MSDN（[方法 : 最適化されたコードをデバッグする](https://msdn.microsoft.com/ja-jp/library/606cbtzs.aspx)）の記述によると、こういう理屈だそうです。

> コンパイラは、ソース コードを最適化するときに命令を再配置したり再構成したりします。これにより、コンパイル後のコードの実行効率が向上します。しかし、この命令の整理が原因となり、一連の命令に対応するソース コードをデバッガーが識別できなくなる場合があります。

そういうわけで単に最適化をせずにビルドすることで参照できるようになったのでした。

ちなみに、最適化する・しないのステータスはプロジェクトのソースコードに影響を与えます。ソースコードをgit管理している場合はご注意ください。

```[ProjectName].csproj
<Optimize>true<Optimize>
// ↑
// ↓
<Optimize>false<Optimize>

```


## 「参照できる」ものは何？
こちらのMSDN（[[自動変数] ウィンドウと [ローカル] ウィンドウ](https://msdn.microsoft.com/ja-jp/library/bhawk8xd.aspx)）が詳しいです。



# 参考
* [方法 : 最適化されたコードをデバッグする](https://msdn.microsoft.com/ja-jp/library/606cbtzs.aspx)
* [[自動変数] ウィンドウと [ローカル] ウィンドウ](https://msdn.microsoft.com/ja-jp/library/bhawk8xd.aspx)
DynamoDBを利用したTomcatセッションレプリケーションのやり方

1からやり方を教えてくれる記事が無かったので、自分でまとめる。

# 1. ライブラリを入手
[ライブラリ入手サイト](https://github.com/aws/aws-dynamodb-session-tomcat/releases)
サイト内「aws-dynamodb-session-tomcat-2.0.1.jar.zip」をクリックしてダウンロード。(2016/06/20時点)

※ソースも落とせるけど、Jarが楽チン。

# 2. Tomcatのlibディレクトリに、1のライブラリを配置
libの場所は環境によって異なるが、「/opt/tomcat8/lib/」あたりにあることが多い。

注意点

1. **WEB-INF/lib** ではなく、Tomcatのlibに配置する。
1. どこかのサイトに、併せてAWS関連のjarも必要と書いてあったが、結果的に不要だった。

# 3. Tomcatのcontext.xmlの編集
context.xmlの場所は環境によって異なるが、「/opt/tomcat8/conf/context.xml」あたりにあることが多い。

東京リージョンのDynamoDBで、EC2にDynamoDBを操作するロールが設定されている場合は、以下の設定で良い。
ロール？？って人は、以下の設定に「awsAccessKey」と「awsSecretKey」を追加してください。

```
<?xml version="1.0" encoding="UTF-8"?>
<Context>
  <WatchedResource>WEB-INF/web.xml</WatchedResource>
  <Manager className="com.amazonaws.services.dynamodb.sessionmanager.DynamoDBSessionManager"
           regionId="ap-northeast-1"
           endpoint="dynamodb.ap-northeast-1.amazonaws.com"
           createIfNotExist="true"/>
</Context>
```

※その他の設定値は、[こちら](http://docs.aws.amazon.com/ja_jp/AWSSdkDocsJava/latest/DeveloperGuide/java-dg-tomcat-session-manager.html)を参照

# 4. Tomcatの再起動
サービス登録してるなら、```service tomcat restart```とかで。

以上までで、上手くいっていれば、対象のアプリケーションにアクセスしたときにDynamoDBに
「Tomcat_SessionState」テーブルが作成され、セッション管理できているはず。

テーブル名を変えたいときは、context.xmlに「table」パラメータを追加する。(table="hogehoge")

# 注意！
[ここ](http://dev.classmethod.jp/cloud/amazon-dynamodb-tomcat-session-management/)のサイトにも書いてあるけど
**スティッキーセッション**を使用しないと、値のまき戻りが発生することがある。

この件に関して、 AWSサポートに問い合わせたところ、以下の回答だった。

> 結論から申しますとセッション情報が最新状態とならないことはありえます。

> aws-dynamodb-session-tomcat では Tomcat の PersistentManagerBase というクラスを継承して作成されております。
> PersistenManager は Tomcat のメモリで持っているセッション情報永続化のために利用されますが、 同期的に書き込みをせず、最低値を設定した場合でも1秒経過しなければ、セッション情報を永続化しません。

> 上記より、スティッキーセッションを利用できない場合、1秒以内に同じクライアントからそれぞれ別のインスタンスへアクセスした場合にはセッション情報が最新状態とならない挙動となります。

> 本事象は既に記載しておりますように DynamoDB 利用による問題ではなく、Tomcat の PersistentManager に依存した挙動となっております。

上記を考慮した上での使用をお勧め致します。
そろそろQiitaのスライドについて一言いっておくか

Qiitaでスライドも書けるようになったのは実に素晴らしい。これはかなり重宝されるだろう。だがリリースされたばかりでいけてない所も多々あるので取り上げてみる。

## 配色

まず配色。これまでは上部ヘッダにコーポレートカラーが塗られているだけだったので比率がよくさして気にならなかったがスライドによって下部にも同色が追加されしかもベタ塗りなのでかなり鬱陶しくなった。そろそろセカンダリカラーなりセパレーションカラーなりを追加してメリハリをつける時期だ。色が飽和している。最低限、スライド下部の配色に枠か影をつけるくらいの応急処置はしていいだろう。

## スクロール

スライドにスクロールバーが出てくる。100歩譲ってそれはいいとして、スライドを越えてそのままページもスクロールしてもっと読みやすいソーステキストが出てくる。これ最悪。スライド見なくていいじゃん縦横の移動考えなくていいしスクロールだけで見たほうが楽むしろスライド見るために苦労させられただけ損。画面を自動縮小するなりして何が何でもスライドのスクロールバーは消さなければならない。

## 比重

ついでにこれはスライドとテキストを同じページで同等に選んで読めるようにしてるUX設計が悪い。同じページで両方が視界に入るとスライドとテキスト両方あるけどもう片方の方が読みやすいだろうかと読む前読んでる最中に悩んで無駄なストレスになる。読むたびにストレスが溜まる。このページを開いたらスライドを読むというビジターの意思決定をページのデザインが支援してコンテンツに集中できるようにしなければならない。そのためにはコンテンツの比重をページデザインによって明確にしなければならず、スライドとテキストの比重が等しい現在のデザインは明確に間違っていると言える。これをスライドにコンテンツの比重に傾けるには単純にテキストのフォントを小さくしてサブコンテンツであることを明確にすればよい。とここまで考えてSlideShareと同じことをしていることに気づきあの小さくて読みにくいテキストに意味があることを知った。

## 選択

さらによい選択肢としてスライドとテキストの表示をタブで分ける方法が考えられる。タブでコンテンツを完全に分離すれば表示方法の決定後にやはりもう片方で見ようかと惑わされることもない。表示方法を自分で決定した満足感も得られるしスライドとテキスト両方から選べる記事は充実度、ひいては高級感を感じさせ執筆側も高級感のある記事を書こうとスライド対応の記事を書く。実際スライドとテキスト両方で読めるコンテンツはクオリティを感じさせるのでデザインの安っぽさをなくせば競合サービスへのアドバンテージになるだろう。なおタブは事前に表示方法を決定できるようスライドの上部に設置すべきだ。

このようにスライドはよいサイクルを生む有望な機能だ。

## 追記

テキストで読みにくいところをいくつか。

スライド1枚ごとのmin-heightを設定してある程度高さを揃えたほうがいい。視線移動がガタガタで非常につらい。高さが揃っていればリズムに乗ってテンポよく読める。
スライドの区切り線ももっと薄くしなければならない。視線移動が濃い区切り線で遮られてこれもまたガタガタになる。
いずれも目の負担が大きいので早めに直してもらいたい。プログラマの目の健康、大事だよな？
tar.gz ファイルから直接grep取り出し

# tar.gz されてるファイルから 直接grepして抽出する
tar.gzに圧縮されているファイルから特定の文字列(を含む)列を別ファイルに書き出す。
大量の過去ログからこのデータだけ！ってときに便利

- hoge.tar.gz というファイルから「taro」と書かれた行を grep_taro.txt というファイルに書き出す

```
tar zxOf hoge.tar.gz | grep taro > grep_taro.txt
```
php exception catchについて

# 存在しないtypeもcatch文に書ける！

#### 良い点: php5とphp7共に対応できるexception handing書ける

```php
try {
    throw new \Exception();
} catch (\Exception $e) {
} catch (\Throwable $e) { // php5には存在しない
}
```

使用例： [framework/Pipeline.php#L35 at 2a38ac - laravel/framework](https://github.com/laravel/framework/blob/2a38acf7ee2882d831a3b9a1361a710e70ffa31e/src/Illuminate/Routing/Pipeline.php#L35) 

#### 悪い点: タイプミスに注意しないと！

```php
try {
    throw new \Exception();
} catch (XX $e) { // 存在しないXXを普通に使えるなって
} catch (\Exception $e) {
}
```
JavaScriptでCloudFrontをHTTP->HTTPSリダイレクトに対応させる


流れとしては以下の通り。

- CloudFrontの現在の設定情報を取得（getDistributionConfig）
- CacheBehaviorsの全アイテムで、ViewerProtocolPolicyを「redirect-to-https」に変更
- 変更したDistributionConfigを使ってCloudFrontを更新（updateDistribution）

```typescript
import { CloudFront } from 'aws-sdk'

export const enableHttpsRedirection = async(distributionId: string) => {
  const client = new CloudFront()
  const { DistributionConfig, ETag } = await client.getDistributionConfig({
    Id: distributionId
  }).promise()
  // config取れてないのでエラーをなげる
  if (!DistributionConfig) throw new Error('No DistributionConfig')
  // cache behaviorsがないなら何もしない
  if (!DistributionConfig.CacheBehaviors || !DistributionConfig.CacheBehaviors.Items) return true
  DistributionConfig.CacheBehaviors.Items = DistributionConfig.CacheBehaviors.Items.map(
    (Item) => {
        Item.ViewerProtocolPolicy = 'redirect-to-https';
        return Item;
    }
  );
  const updateParams = {
      DistributionConfig: DistributionConfig,
      Id: distributionId,
      IfMatch: ETag
  }
  return client.updateDistribution(updateParams).promise()
}
```


同じ要領で設定の追加とか変更もできるのでぜひ。
cocos2dx2.xで作ったAndroidアプリのlibpngのバージョンを上げる方法

先日、GooglePlayStoreからlibpngに脆弱性が見つかったからバージョンを上げるようにとメールが来たので対応。

[参考] http://www.bengigi.com/cocos2d-x-2-x-android-libpng-vulnerability-fix/

上記サイトと内容がほとんど同じだがメモとして残しておく。

今回対応したのはcocos2d-x-2.2.6のアプリ。

他のバージョンでは未確認。


まず、以下をダウンロードする。
http://bengigi.com/wp-content/uploads/libpng_fix.zip

以下の２つのフォルダがダウンロードされる。
・libpng
・libzlib

２つのファルダを以下のところに置く。
（libpngは置き換える）
cocos2d-x-2.2.6/cocos2dx/platform/third_party/android/prebuilt/libpng
cocos2d-x-2.2.6/cocos2dx/platform/third_party/android/prebuilt/libzlib


次にcocos2dxのフォルダの中のAndroid.mkファイルを変更。

これを
LOCAL_WHOLE_STATIC_LIBRARIES := cocos_libpng_static

以下に書き換える
LOCAL_WHOLE_STATIC_LIBRARIES := cocos_libzlib_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocos_libpng_static


この行の下に
$(call import-module,libjpeg)


以下を追加
$(call import-module,libzlib)


編集を終えたら保存して再ビルド、apkを作成。

ターミナルを開いて以下のコマンドで確認。

unzip -p hoge.apk | strings | grep "libpng"


libpng version 1.6.16 - December 22, 2014
 libpng version 1.6.16 - December 22, 2014


Googleからの警告はlibpng v1.0.66、v.1.2.56、v.1.4.19、v1.5.26以降にしろということなので、 

バージョンが1.6.16になっていればOKのはず。


いろんな情報がでてたけど簡単そうなのがこれだった。
【Linux】ファイルの所有者を再帰的に変更する

#【Linux】ファイルの所有者を再帰的に変更する
***メモ：***

・スーパーユーザになる
```sudo su - 
```
・以下のコマンドを実行する
```chown -R 変更したユーザ名:変更したいグループ名 ディレクトリ
```
・コマンド例
```chown -R testuser:testuser /var/www/htdocs/test/
```
上記の例を実行すると、/var/www/htdocs/test/以下のファイルの所有者が全て「testuser」となる。
ノーツビューを GetDocumentByKey などで検索できないときの確認事項

Domino / Notes の LotusScript による [GetDocumentByKey](http://www.ibm.com/support/knowledgecenter/ja/SSVRGU_9.0.0/com.ibm.designer.domino.main.doc/H_GETDOCUMENTBYKEY_METHOD.html), [GetAllDocumentsByKey](http://www.ibm.com/support/knowledgecenter/ja/SSVRGU_9.0.1/com.ibm.designer.domino.main.doc/H_GETALLDOCUMENTSBYKEY_METHOD.html), [GetEntryByKey](http://www.ibm.com/support/knowledgecenter/ja/SSVRGU_8.5.3/com.ibm.designer.domino.main.doc/H_GETENTRYBYKEY_METHOD_3846.html), [GetAllEntriesByKey](http://www.ibm.com/support/knowledgecenter/ja/SSVRGU_9.0.0/com.ibm.designer.domino.main.doc/H_GETALLENTRIESBYKEY_METHOD_9837.html) を使用したビューエントリの検索でなかなかヒットせず、原因がやっと判明しましたので、記しておきます。

#確認事項
- 検索キーに使うビュー列のフィールド（アイテム）と型（変数型）は合っていますか？
私がダメだったときは、ビュー列のもとにしているフィールド（アイテム）が「数値」型で（[@Text](http://www.ibm.com/support/knowledgecenter/ja/SSVRGU_9.0.0/com.ibm.designer.domino.main.doc/H_TEXT.html) で変換したりはせず）そのまま、一方でスクリプト側で指定した検索キーは文字列型でした。数値型と文字列型相互の自動変換はしてくれないようですので、ビュー列側かスクリプト側かどちらかの型を他方に合わせる必要があるようです。

- 検索キーに使うビュー列はソート指定されていますか？
ソート（昇順でも降順でも動きました）されていれば、カテゴリ化されている必要はありません。
めざせpythonライブラリマスター （62）glances

#【ライブラリ説明】
　CPUやメモリ、ネットワークの使用率がリアルタイムで計測できる

#【実行方法】
　dockerで実行しました。
　コンテナを取得
　　`docker pull nicolargo/glances`

　実行
　　`docker run -v /var/run/docker.sock:/var/run/docker.sock:ro --pid host -it docker.io/nicolargo/glances`


<img width="424" alt="glance.png" src="https://qiita-image-store.s3.amazonaws.com/0/121997/16d2b26d-ff74-ea4b-2c43-c273095c0419.png">

#【参考サイト】
　[github](https://github.com/nicolargo/glances)
TabとCtrl-iどちらを入力されたか区別する(Linux限定)

動作環境

- Debian
- Vim 7.4.1944 (+python/dynと+python3/dynが有効)
- Python 2.7
- Python 3.5

X11の機能を利用します。
WindowsとMacでは動作未確認です。

ノーマルモードでtabを押したらTab()を実行し、Ctrl-iを押したらCtrli()を実行するサンプルを書きました。

## できない方法

```vim:sample1.vim
function! Tab()
   echo 'Key:tab'
endfunction

function! Ctrli()
   echo 'Key:Ctrl-i'
endfunction

nnoremap <buffer> <tab> :<C-u>call Tab()<CR>
nnoremap <buffer> <C-i> :<C-u>call Ctrli()<CR>
```
tabを押してもCtrl-iを押してもCtrli()が呼び出されて**Key:Ctrl-i**と出力されました。
このやり方ではtabとCtrl-iを区別できませんでした。

## できた方法

X11の機能を利用して入力したキーを判断しています。

```python:sample2.py
# -*- coding: utf-8 -*-


def tab_ctrli():
    import vim
    import ctypes
    from ctypes.util import find_library

    x11 = ctypes.cdll.LoadLibrary(find_library('X11'))
    display = x11.XOpenDisplay(None)
    keymap = (ctypes.c_char * 32)()

    keys_tab = [0] * 2 + [128] + [0] * 29
    keys_ctrli = [0] * 3 + [128, 32] + [0] * 27

    while True:
        x11.XQueryKeymap(display, keymap)
        keys = [ord(x) for x in keymap]
        if keys_tab == keys:
            vim.command('call Tab()')
            x11.XCloseDisplay(display)
            break
        if keys_ctrli == keys:
            vim.command('call Ctrli()')
            x11.XCloseDisplay(display)
            break

tab_ctrli()
```

```vim:sample2.vim
function! Tab()
   echo 'Key:tab'
endfunction

function! Ctrli()
   echo 'Key:Ctrl-i'
endfunction

function! Main()
    pyfile sample2.py
endfunction

nnoremap <buffer> <tab> :<C-u>call Main()<CR>
```

tabを押したらTab()が実行され、Ctrl-iを押したらCtrli()が実行されました。

## その他

tabとCtrl-iのように、異なるキーだけど同じキーのように扱われるキーの一覧は**:h key-notation**で確認できます。
describe-instances の --filtersと --query

describe-instances には --filtersと --queryという便利な機能がある。

たくさんあるリソースの中から特定の情報を引っ張ってこれる。

aws ec2 describe-instances --filters   "Name=tag:Name,Values=*test*" "Name=tag:Name,Values=*system*" --query "Reservations[].Instances[].PrivateIpAddress" --output text

##--filters
タグのand検索
<pre>
--filters   "Name=tag:Name,Values=*test*" "Name=tag:Name,Values=*system*"
</pre>

タグのor検索
<pre>
--filters   "Name=tag:Name,Values=*test*","Name=tag:Name,Values=*system*"
</pre>

##--query
プライベートIPだけ表示する。
--query "Reservations[].Instances[].PrivateIpAddress"

--output jsonで表示すると以下な感じだから上記のように引っ掛ける。
<pre>
{
    "Reservations": [
        {
            "OwnerId": "xxxxxx",
            "ReservationId": "xxxxxxx",
            "Groups": [],
            "Instances": [
                {
                    "Monitoring": {
                        "State": "xxxxxx"
                    },
                    "PublicDnsName": "",
                    "State": {
                        "Code": xxxx,
                        "Name": "xxxxx"
                    },
                    "EbsOptimized": true,
                    "LaunchTime": "xxxxxx",
                    "PrivateIpAddress": "10.xxxxxxxxx",
</pre>
Tomcat上のjavaアプリケーションでCPUが異常に高くなったときの対処

#1.事の発端
Tomcat上で動いているjavaアプリケーションで、CPUがずっと80%とかにくっついている現象が発生。
「うぇーまじか」となった。
ともあれ調査せねば。となった時にやったこと。

#2.手順

#2.1 topコマンドで状況確認（当時のものとは違っています）

```shell:コマンド
$ top
top - 18:27:24 up 285 days,  3:05,  3 users,  load average: 5.33, 5.36, 4.93
Tasks:  70 total,   1 running,  69 sleeping,   0 stopped,   0 zombie        
Cpu(s): 10.1%us,  0.9%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si, 89.0%st
Mem:    617044k total,   522324k used,    94720k free,     4812k buffers
Swap:        0k total,        0k used,        0k free,    79684k cached 
                                                                                                                                    
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND    
 1722 root      20   0 1422m 394m 6004 S 96.5 65.5  53:50.89 jsvc       
    6 root      20   0     0    0    0 S  3.4  0.0  11:35.37 events/0   
 1929 hoge      20   0  2592 1000  784 R  0.3  0.2   0:24.33 top        
    1 root      20   0  2892  868  664 S  0.0  0.1   0:01.76 init       
    2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd   
--- (以下略) ---
```

#2.2 プロセスでヤバそうな奴を見つける
$ ps -L aux
そうすると、tomcat上で動くプログラムのうちいくつかにおける（TIME）が永遠と増え続けていることに気付く。

```shell:コマンド
     USER       PID   LWP %CPU NLWP %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
    tomcat    3487  1111  25.1   39 14.1 10233084 2222644 ?    Sl   09:03   25:10 jsvc.exec -user tomcat -home /usr/lib/jvm/java 
```
こんな感じ（イメージです）。

PIDとLWPを控える。

#2.3スレッドダンプを取得
rootユーザで
su - tomcat -s /bin/bash
jstack PID（先ほど控えた奴）

そうすると以下みたいな情報が出てくるので、控えるなり、目を背けるなりする

```shell:スタックトレース(例)
"RMI TCP Accept-0" #10 daemon prio=5 os_prio=0 tid=0x0000000000c29800 nid=xxxx runnable [0x00007f2f36728000]
   java.lang.Thread.State: RUNNABLE
        at java.net.PlainSocketImpl.socketAccept(Native Method)
--- (以下略) ---
```

16進数にしたLWPのIDがスレッドダンプ内の"nid=xxxxx" と対応する
なのでスレッドダンプしたファイルをそのIDで検索してやれば、対象のスタックトレースが見つかる

* LWP: Linux上のプロセスよりも小さい実行単位、スレッドのようなもの

#2.4 終わってみて
調査してみたところ、再帰処理で死亡していたことが判明。修正し一段落
How to Show Date of "git log" as ISO Format

"Friday" って2月だっけ……。みたいに英語が苦手なので……。

```shell-session
% git config --global log.date iso
```

こう設定すると、日付の表示が以下のようになります。

```shell-session
% git log
commit c625884070c943f3badf3ee6f853c9bf6fb8e41d
Author: maangie <maangie@example.com>
Date:   2016-06-20 18:23:49 +0900

    First Commit
```

## 追記(2021/01/12)
git のバージョンが上がったせいかな？

日付の出力が GMT になってたので、以下のようにしました。

```shell-session
% git config --global log.date iso-local
```

以下のページを参考にしました。

- [[Git] git log の日時を見やすくする - Qiita](https://qiita.com/QUANON/items/fe774f4ac2a3278ee5b7)
「Ready-Set-Go」で考えるオブジェクト設計

何年か前に`Read Set Goパターン`というのをウェブのどこかで見かけた記憶があって、いま検索しても見つからないので存在するかどうか怪しいのですが、これをネタにオブジェクトの設計について考えて見ます。

### `Ready-Set-Goパターン`って？

オブジェクトの使い方を、こういう順番で考えます。

1. `Ready`: オブジェクトを構築する。
2. `Set`: 必要な情報をセットする。
3. `Go`: 実行！

とまぁ、これだけなんですが…

> ### そもそも「Ready Set Go」って何？
「Ready, Set, Go」とは、アメリカンフットボールの掛け声から来ていると思います。攻撃側のQBが大声を張り上げて、自チームの攻撃のタイミングを取ります。


`Ready-Set-Go`で設計
======


なぜか逆順のGo→Set→Readyで説明…

`GO`！
----

### オブジェクトに`Go`はひとつ

「`Go`」に当たる処理は、**一つのオブジェクトで一つだけ**、にします。

いくつも違う処理がある場合は、**オブジェクトに機能が多すぎる**のかもしれません。

例としてクレジットカードのチャージを考えます。例えば、こんなAPI。売上を上げる場合のオブジェクトを考えます。

```php
$credit->charge($amount); // 実売り
```

ま、シンプルですよね。これなら使い方に悩むこともないですし、コードもすっきりするのではないでしょうか。

### パラメーターをメソッドで表す

同じ処理だけれど、少し違う条件や値で実行する場合があります。パラメーターで渡すことが多いですが、バッサリと分かりやすいメソッドを作ってしまう手もあります。

例えば、クレジットカード処理で、最初に実売りか仮売りをするかを指定できるとします。

```php
$credit->charge($amount, ['capture'=>false]); // 仮売り
$credit->charge($amount, ['capture'=>true]);  // 実売り
```

falseが仮売りだったかどうか、覚えるのは面倒ですし、コードが間違っていても、見つけるのは難しい気がします。そんな場合は、

```php
$credit->authorize($amount); // 仮売り
$credit->capture($amount);   // 実売り
```

とメソッドを増やして、処理内容を明確にします。

### `Go`は動詞

`Go`のメソッド名には動詞が一番。

> PHPなら日本語でも使えます。使ったことないけど。

```php
$credit->仮売り($amount);
$credit->実売り($amount);
```

`Go`のメソッド名としてピッタリとハマる動詞が見つかったら、オブジェクトの設計としては上出来だと思います。


`SET`！
----

### `Set`は無い方がいい

Ready-Set-Goパターンと書いておいてなんですが、`Set`は無いのが一番。

例えば、先のオブジェクトをsetterで書き直すと…

```php
$credit->setAmount($amount);
$credit->setCapture(true);
$credit->transfer();
```

`Set`があると、オブジェクトに色々な状態が出きやすくなります。例えば合計を設定してない場合や、呼び出す順番とかでの微妙な対応でバグの可能性が増えます。

なるべく引数で必要な情報を渡すほうが、オブジェクトが単純になって使いやすいと思います。

### 必須のパラメターは`Ready`か`Go`で

そもそも、全ての情報は同じ重要度なのでしょうか？無いと動かない、意味がわけわからなくなる情報というのはあります。

クレジットカードなら、カード情報は必須でしょうし、金額がないというのも考えられません。そういう情報は、`Ready`の時（オブジェクトの構築時）、あるいは`Go`の実行時に渡すとすると、確実に設定できます。

```php
$credit = new CreditCard($card_information); // クレジットカード情報
$credit->setMeta($order_id); // 注文IDをメタ情報として設定
$credit->capture($amount); // 実売りをあげる
```

オプションの情報だけ`Set`してあげる、とすると分かりやすくなると思います。

### DTOを導入してみる

とは言え、大量の引数が必要な場合もあります。引数が長過ぎると、これも使いづらくなります。

そんな時は、**DTO（データ転送オブジェクト）**を導入してみるのはどうでしょう。例えばSQLビルダーだと、SQL設定とSQL文生成のオブジェクトを分離する、とかで対応します。

```php
$transfer->setAmount($amount);
$transfer->setCapture(true);
$credit->transfer($transfer);
```

この例だと有り難みを感じませんが、設定する情報が増えた場合は設計がすっきりとする、はず。

`READY`！
----

### `Ready`するときはDIで

最初に戻って`Ready`のとき。オブジェクトを構築するときは、依存するサービス（要は別のオブジェクト）を引き取ります。依存性の注入（DI）です。

注入するのはサービスだけでなく、アカウント情報といった設定値の場合もあります。

### factoryとか

例として使ってきたクレジットカードですが、絶対に必要な情報として、アカウント情報、クレジットカード情報、そして金額、があると思います。

アカウント情報はアプリ構築時に決まっている情報の場合が多いと思います。一方、クレジットカード情報はフォームから入力される、あるいは合計金額はDBから値段を読みだしてから計算して求める、などなど情報が決まるタイミングが異なる場合があります。

こういう場合の対応方法として、ファクトリを上手に使うことを考えてます。それぞれの情報をファクトリに注入してゆきます。

```php
$factory = new CreditFactory($my_account_information); // アカウント情報
$credit  = $factory->createFromCard($card_information); // クレジットカード情報
$credit->capture($amount); // 実売りをあげる
```

どうでしょう。使うときに悩まないと思うのですが…

> 本当に使いやすくなったのか、実は試行錯誤中…


使いドコロ
====

`Ready-Set-Go`を考えながら設計すると、オブジェクトがシンプルで分かりやすくなって気に入ってます。

特にドメインと呼ばれるビジネスロジックだと、オブジェクトは自分で設計する、なんて場合が増えてきます。で、気が付くと、機能を追加しすぎて複雑怪奇なオブジェクトにしがちなのですが、そんなときは、`Ready-Set-Go`と唱えながらオブジェクトを分割してます。
Laravel5でhasManyThroughを使うと仲介するテーブルのIDが取得データに追加される

hasManyThroughを使った際に思わぬ動作で対処方法が思いつかずQiitaに投稿

```
users 投稿者
 id

posts 記事
 id
 user_id

comments コメント
 id
 post_id 記事ID
 user_id 投稿者ID
```

このTable構成でユーザーが作成した記事のコメント一覧を取得する時
users->posts->commentsのデータを
hasManyThroughを使えば一気に取得することができました・・・が

comments内のuser_idについてpostsのuser_idで上書きされるという現象が・・・

ソースコードの中を探していくと
get,paginate,simplePaginate中のselectを設定するところで下記の関数を使っている為
末尾にどうしても仲介するテーブルのIDが付与される形に

```php:/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/HasManyThrough.php
protected function getSelectColumns(array $columns = ['*'])
{
    if ($columns == ['*']) {
        $columns = [$this->related->getTable().'.*'];
    }
    return array_merge($columns, [$this->parent->getTable().'.'.$this->firstKey]);
}
```

もともとの親自体はqueryを発行する前に取得できているだろうと思うので
なぜわざわざデータ取得時にフィールドを末尾に追加しているのかわかりませんでした。
とりあえずこいつがあるせいで
上記のテーブルではcommentsないのuser_idがpostsのuser_idで上書きされてしまいます。


とりあえずの現状の対応として
1.listsでidだけ一度取得して
そのidを元に各データ(comments)を取得しなおす

2.getSelectColumnsの末尾にidを追加しているところさえ消せば
不要な情報が追加されず動作するので該当部分を消す？

他に方法を知っている方が入れば教えて頂きたいです。
spring-mybatis Log stdout出力

application-context.xml

```xml
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
...
<property name="configLocation" value="classpath:/META-INF/mybatis/mybatis-config.xml" />
...
</bean>
```

mybatis-config.xml

```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd" >

<configuration>
	<settings>
		<setting name="logImpl" value="STDOUT_LOGGING"/>
	</settings>
</configuration>
```


参考:
http://www.mybatis.org/mybatis-3/logging.html
http://www.mybatis.org/mybatis-3/configuration.html
http://www.mybatis.org/spring/factorybean.html
http://stackoverflow.com/questions/21718097/how-to-configure-logback-for-mybatis-to-print-my-sql
新たに Docker for AWS / Azure のPrivate Beta 申込みはじまる

本日（日本時間6月20日午後）より、AWS / AzureのDocker Private Beta の
申し込みが開始されたようです。
詳細は不明ですが(>> [公式サイトのblogにアップされていました](https://blog.docker.com/2016/06/azure-aws-beta/))、気になる方は早めに申し込みをした方が良いかもしれません。
なお、AWSについては申し込み時にAWSアカウントが必要のようです。

https://beta.docker.com/

![docker_private_beta.png](https://qiita-image-store.s3.amazonaws.com/0/117986/f5271827-3623-9af8-4db2-46369b7e2187.png)
C#で階乗の計算（再帰処理）



## 階乗の定義
nの階乗とは、1からnまでの整数の積です。nの階乗をn!と表すと、


    n! = n * (n-1) * (n-2) * ... * 3 * 2 * 1    (n > 0 のとき)
       = 1                                      (n = 0 のとき)

と表せます。n = 0 の時は、0!は、定義上1とします。

n > 0 の場合を考えると、

    (n-1) * (n-2) * ... *  3 * 2 * 1

の部分は、 (n-1)! を計算していることになりますから、

    n! = n * (n-1)!

となります。

つまり、以下のように定義できます。

    n! = n * (n-1)!    (n > 0 のとき)
       = 1             (n = 0 のとき)


## C#での階乗の計算

上の定義を素直にC#のコードで記述したのが、以下のFactorialメソッドです。
 
   
```csharp:Factorial.cs
public static long Factorial(int n) {
    if (n == 0)
        return 1L;
    return n * Factorial(n - 1);
}
```
        

Factorialメソッドの中で、Factorialメソッドを呼び出しています。つまり再帰処理を行っています。

C#6.0の機能を使うと、以下のようにも書けます。


```csharp:Factorial60.cs
static long Factorial(int n) =>
    n == 0 ? 1L : n * Factorial(n - 1);
```

## オーバーフローを検知する

コメント欄のshiracamusさんがお示しになったようなコードでオーバーフローを検知する方法をもありますが、以下のように書けば、オーバーフロー時にOverflowException例外が発生するようになります。



```csharp
public static long Factorial(int n) {
    checked {
        if (n == 0)
            return 1L;
        return n * Factorial(n - 1);
    }
}
```

[GitHub](https://github.com/gushwell/CSharpAlgorithmCollection/tree/master/FactorialSample)で上記コードを公開しています。

C#6.0の機能を使うと以下のようにかけます。

```csharp
static long Factorial(int n) =>
    checked (n == 0 ? 1L : n * Factorial(n - 1));
```            

---------------------------------------------
この記事は、Gushwell's C# Programming Pageで公開したものを加筆・修正したものです。
AeroSpikeのluaコード（件数取得、ttl確認）

#1.AeroSpike
KVSの一つ。KVSのKVSといった感じ。ドキュメント型ではない。

件数取得したり、ttl取得したりするときがあるのでチョットLuaコードを残しておく。
ttlは最近のAeroSpikeClientだと、getTtlとかで取得できてしまうが、これを作ったのは
結構前（そういうのが無かった時代のお話）。

show setで件数見れるじゃん。と思ってサポートに聞いたらそれは一致しているか怪しい。
とのことだった。後は、複数台運用していたら合計しないといけないから面倒。

#2.test.luaを作る

```lua:test.lua
function count(s)
    function mapper(rec)
            return 1
    end
    local function reducer(v1, v2)
        return v1 + v2
    end
    return s : map(mapper) : reduce(reducer)
end


function getttl(rec)

        if aerospike:exists(rec) then
                ttl = record.ttl(rec)
                return string.format("rec ttl = %d", ttl)
        end

end

```

件数を取得する関数と、ttlを取得する関数を定義

#3.aqlコマンド打つ。
aql
set LUA_USERPATH  'lua_code'
register module '/home/xxxxxxx/test.lua'
set TIMEOUT 100000

#4.実行

##4.1件数取得したい場合
AGGREGATE test.count() ON xxxx.hogehoge
xxxx:スキーマ
hogehoge:テーブル名

##4.2TTLを確認したい場合
EXECUTE test.getttl() on xxxx.hogehoge where PK='1'
PKはKeyを指定

#5.moduleをremoveする場合
remove module test.lua
[AWS] goofys 使って AutoScaling 時の web ドキュメントルートを S3 マウント

AutoScaling 時の WordPress の Web ドキュメントルートの扱いは結構めんどくさいです。
メディアアップロードすると ```wp-content/uploads/``` にファイルがアップロードされたり、WordPress 管理画面からテーマやプラグインのアップロードとか、コア・テーマ・プラグインのアップデートができちゃうんで辛いことになります。
NFS マウントでしのいだりもするんですが、みんなの救世主 [Amazon EFS](https://aws.amazon.com/jp/efs/) は発表からずいぶん経ってるのに東京リージョンに来るどころか、まだプレビューが外れません....

そんなわけで [goofys](https://github.com/kahing/goofys) 使って web ドキュメントルートを S3 バケットにマウントしてみました。

## 構成

![AWS Design.png](https://qiita-image-store.s3.amazonaws.com/0/25964/013f340c-93aa-149d-a065-07fddd410494.png)

ローンチ時の UserData は、こんな感じ

```bash
#!/bin/bash
web_docmentroot='/var/www/html'
s3_region='us-east-1'
s3_bucket='lets.ninja'
if [ ! -e /usr/local/bin ]; then
  mkdir -p /usr/local/bin
fi
yum -y install nginx golang fuse wget
wget https://github.com/kahing/goofys/releases/download/v0.0.6/goofys -P /usr/local/bin
chmod +x /usr/local/bin/goofys
if [ ! -e ${web_docmentroot} ]; then
  mkdir -p ${web_docmentroot}
fi
/usr/local/bin/goofys -o allow_other --uid "$(id -u nginx)" --gid "$(id -g nginx)" --region ${s3_region} ${s3_bucket} ${web_docmentroot}
```

IAM ロールに S3 へのアクセス権限与えることも忘れずに
ちゃんと、動いたっぽいです。

なお、今回検証に使った環境は以下の通りです。

- EC2 : t2.small [AMIMOTO HVM](https://amimoto-ami.com/plans/ami-list/)
- RDS : db.t2.small MariaDB

## Loader.io での負荷検証

以下の URL を参考にして wp-login.php からの wp-admin/edit.php へのアクセスを [Loader.io](https://loader.io/) で試してみました。
参考URL: [Loader.ioを使ってWordPressのバックエンド構成を変えつつ性能を測ってみる、php-fpmとHHVM](http://qiita.com/sawanoboly/items/e422b366439f67bfb01c)

0 - 250 同時接続まで実行してみました。

### EC2 1台の時の検証結果

同時接続数が 130超えたあたりから 500 Error が頻発してます。

<img width="1195" alt="Screen Shot 2016-06-20 at 16.03.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/25964/80302bd8-053c-7b46-1a3e-2658b6c8f23e.png">
<img width="1188" alt="Screen Shot 2016-06-20 at 16.03.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/25964/daace68f-cc7c-7a21-6c44-1a6202224a49.png">

### EC2 10台の時の検証結果

最後まで完走してますね。
500エラーも2回しか発生しなかったようです。

<img width="1234" alt="Screen Shot 2016-06-20 at 16.02.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/25964/d927edef-9277-d50a-fdde-b0189bc222d5.png">
<img width="1206" alt="Screen Shot 2016-06-20 at 16.02.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/25964/d0151ab4-1ca9-59ab-7b1c-83216a3c84a2.png">

## 雑感

先日書いた [OS X に goofys 入れて S3 をマウントする](http://qiita.com/wokamoto/items/e62034d8bb1c81dcdd78) を使えば、Mac から AutoScaling 環境にサクッとデプロイすることもできそうですね。
ちょっと夢が広がってきました。

この構成考えた時にある人から「古いバージョンの goofys は、時々マウント切れるので要監視ですよ」って言われました。
今回使った goofys は ver.0.0.6 ですが、とりあえずテスト中にマウントが切れることはなかったです。

ただ、goofys マウントしたディレクトリ上ではファイルの新規作成が失敗することがあるみたいで vim で直接修正しようとするとバックアップファイルできなかったよってエラー出てました。
他のディレクトリで作成したファイルをコピーすれば問題ないです。
これは EC2 にマウントしたディレクトリでも OS X でマウントしたディレクトリでも同様の状態でした。

今回、検証に使った環境は [lets.ninja](https://lets.ninja) なんですが、今は CloudFront 外して EC2 1台の状態に戻してますが goofys マウントはそのままにしてあります。
しばらく、このままで動かしてみて goofys マウントの状況とか検証しようと思います。

スポットリクエストで AutoScaling 環境立ち上げれば、かなりのコストダウンになりそうです。
AutoScaling では台数を時間指定で増減させることもできるので、とりあえず自社の開発環境で使ってるインスタンスで試してみようかなぁ。

現場からは以上です。
MySQL の GROUP_CONCAT の応用例（検索結果を Json array型にする）

こんにちは。
MySQL で、検索結果を Json の array型で得る方法を考えてみました。```GROUP_CONCAT()```[^1]の応用でaggregation 処理に当たります。

```mysql
mysql> SELECT JSON_TYPE(CAST(CONCAT('[', GROUP_CONCAT(my_id), ']') AS JSON)) as json_array FROM my_table;
+--------------+
| json_array   |
|--------------|
| ARRAY        |
+--------------+
```

なお、```GROUP_CONCAT()```の出力自身は文字列です[^2]。下記のような検索実行もできます。

```mysql
mysql> CREATE TABLE my_table (id integer not null);
mysql> INSERT INTO my_table (id) VALUES (1), (2), (3), (4);
mysql> SELECT id_excluded as id, (SELECT GROUP_CONCAT(id) FROM my_table WHERE id != id_excluded) as other_ids
  from (SELECT id as id_excluded from my_table) tab_dummy;
+------+-----------+
|   id | other_ids |
|------+-----------|
|    1 | 2,3,4     |
|    2 | 1,3,4     |
|    3 | 1,2,4     |
|    4 | 1,2,3     |
+------+-----------+
```

[^2]: 出力文字数の上限（group_concat_max_len 、標準値 1024）を超えた場合にはエラーが出ます（例 ```Row 99 was cut by GROUP_CONCAT()```）。

[^1]: こちらにも紹介がありました：「[MYSQLの関数 GROUP_CONCAT](http://qiita.com/mikakane/items/5bb62a6bf0e46b7d7226)」

Postgresql では、ARRAY型を出力する ```array_agg()```[^3] という関数が用意されているので、上記のような手間は不要ですね。

[^3]: こちらにも紹介がありました：「[PostgreSQLのあまり知られていない型3種](http://qiita.com/choplin/items/9d5e2ff8721fb9509bf8)」

-----------
Docker for Windows beta はWindows Server 2012R2にはインストールできない

## Windows10 pro,Enterprise or Education じゃないとダメでした
[いまさらですが、Docker for Mac betaを試してみました！インストールからdocker runまで (画像多数)](http://qiita.com/tbuchi888/items/3e2b482aaaf412d17d41)に続いて、
`Docker for Windows beta`も試してみようと思い、
周りにWindows10の環境がなかったので、
要件にはありませんがHyper-Vが動くWindows2012R2ならいけるかもと
淡い期待をいだきつつ試してみましたが、
セットアップインストーラーではじかれてインストールできませんでした。

![02_docker.png](https://qiita-image-store.s3.amazonaws.com/0/117986/f8a59486-1149-aced-40d7-80388f287dc9.png)

![03_docker.png](https://qiita-image-store.s3.amazonaws.com/0/117986/a4db0402-3280-19df-3511-9d1e016503e5.png)

## その他
さきほど（日本時間の6月20日午後？）、Docker for Macとwindowsのprivate betaが終了したようです。
beta版のドキュメントが404で見れなくなっていました。今度のbetaは[AWSとAzure](http://qiita.com/tbuchi888/items/896907f13f77e5d49363)のようです。
Amazon SESでメールを受信する設定をJavaScriptでやってみた


CloudFormationにテンプレートがなかったのでAWS SDKで組んでみた。

### 前提
- ドメインはRoute53で管理している
- 受信用S3バケットは作成済み
- SESのdefault-rule-setが作成済み

### コード

```index.js
// Input
var domain = "EXAMPLE.COM";
var s3BucketName = 'S3_BUCKET_NAME';
var mailAddress = "admin@" + domain;
var region = 'us-east-1';

//module
var AWS = require('aws-sdk');
var ses = new AWS.SES({
	apiVersion: '2010-12-01',
    accessKeyId: "ACCESS_KEY_ID",
    secretAccessKey: "SECRET_ACCESS_KEY",
	region: region
});
var route53 = new AWS.Route53({
  apiVersion: '2014-05-15',
  accessKeyId: "ACCESS_KEY_ID",
  secretAccessKey: "SECRET_ACCESS_KEY",
  region: region
});

//Params
var domainVerificationToken = '';

var params = {
  Rule: {
    Name: 'mail.' + domain,
    Actions: [
      {
        S3Action: {
          BucketName: s3BucketName,
          ObjectKeyPrefix: domain
        },
      },
    ],
    Enabled: true,
    Recipients: [
      mailAddress,
    ],
    ScanEnabled: true,
    TlsPolicy: 'Optional'
  },
  RuleSetName: 'default-rule-set'
};

// Promise
ses.createReceiptRule(params).promise()
  .then(
	  (data) => {
			var domainParams = {
				Domain: domain
			};
			return ses.verifyDomainIdentity(domainParams).promise();
		}
  ).then(
	(data) => {
		console.log(data);
		if ( ! data.VerificationToken) {
			throw 'undefined Verification Token.';
		}
		domainVerificationToken = '"' + data.VerificationToken + '"';
	    var params = {
	      DNSName: domain,
	      MaxItems: '1'
	    };
	    return route53.listHostedZonesByName(params).promise();
	}
  ).then(
	(data) => {
		var HostedZoneId = data.HostedZones[0].Id;
		HostedZoneId = HostedZoneId.split('/')[2];
		var params = {
		  ChangeBatch: {
			Changes: [
			  {
				Action: 'UPSERT',
				ResourceRecordSet: {
				  Name: '_amazonses.' + domain,
				  Type: 'TXT',
	              TTL: '1800',
				  ResourceRecords: [
					  {
						  Value: domainVerificationToken
					  }
				  ]
				}
			  },{
				Action: 'UPSERT',
				ResourceRecordSet: {
					Name: domain,
					Type: 'MX',
					TTL: '1800',
					ResourceRecords: [
						{
							Value: "10 inbound-smtp.us-east-1.amazonaws.com"
						}
					]
				}
			  }
			],
		  },
		  HostedZoneId: HostedZoneId
		};
		return route53.changeResourceRecordSets(params).promise();
	}
  ).then(
	  (data) => {
		  console.log(data);
	  }
  ).catch(
	  (err) => {
		  console.log(err);
	  }
  );

```

このコードを走らせると、「var mailAddress」で設定したアドレス宛に送信されたメールが、SES経由でS3バケットに保存されます。

[使い道（ACMの承認URLをインターセプトするスライド）](https://speakerdeck.com/amimoto/ri-ben-yu-amazon-cloudfront-with-aws-certificate-manager)

他のリージョンで使いたい場合、SESが使えるリージョンが限定されていることや、MXレコードのパラメーターがus-east-1決め打ちになってるところらへん要注意です。

### おまけ：SESのルールセット登録をJSでやる
```
var params = {
  RuleSetName: 'STRING_VALUE' /* required */
};
ses.createReceiptRuleSet(params, function(err, data) {
  if (err) console.log(err, err.stack); // an error occurred
  else     console.log(data);           // successful response
});
```
http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/SES.html#createReceiptRuleSet-property

「'default-rule-set'」からこれのRuleSetNameに設定した値に書き換えれば上のスクリプトでも動くはずです。（未検証）
ChromeDevToolのZoom & UnZoom

chromeのdevtoolを使っていてでどこか変なキーを押してしまい、画面がこんな感じになってしまうことがあります。
![Screen Shot 2016-06-20 at 4.45.51 PM.png](https://qiita-image-store.s3.amazonaws.com/0/71154/84f92ed5-c5b5-ca71-8a75-98a0e13298c9.png)
なんかちっちゃくなってグチャッとなってしまっています。
あーこれは多分縮小してしまったからだなーと思い、"cmd" + "shift" + "+" キーを押しますがwebページの方が拡大されてしまいうまくいきません。

なんと
###webページ
focusをwebページ側に載せた上で

 * 拡大 : "cmd" + "shift" + "+"
 * 縮小 : "cmd" + "-"

###devtool
focusをdevtool側に載せた上で

 * 拡大 : "cmd" + "^"
 * 縮小 : "cmd" + "-"

となっていて何故か縮小が同じキー割り当てで拡大が異なるキーが割り当てられています。
devtoolにカーソルがあたっている状態で縮小を押してしまし、"cmd" + "shift" + "+"で拡大が出来ないので見事にハマってしまうということのようです。
なんでこんなことになってるのかよくわかりませんが、とりあえず"cmd" + "^"でdevtoolは拡大されて問題は解決します。
結構これでイライラする人も多いんじゃないかと思うので載せておきます

(環境)
Mac(Yosemite)
Version 51.0.2704.103 (64-bit)
jQueryで使った関数のメモ

勉強中に使った関数を忘れてまた調べることが多いのでメモとして残すことにした

# $.map( object, callback( value, key ) )
objectの各要素をcallback関数で変換して配列にして返す。
valueはループ処理中のobjectの各値、keyはインデックス番号またはキー。

[js STUDIO](http://js.studio-kingdom.com/jquery/utilities/map)

#split([separator])
stringをseparatorで区切って文字列の配列にして返す。
separatorが空文字の時は一文字ごとの配列になる。

[js STUDIO](http://js.studio-kingdom.com/javascript/string/split)

# join(separator)
配列内の全ての要素を連結して文字列とする。
要素間にseparatorがつく。separatorがない時はカンマになる。
どうしても必要でない時は　"+="で済ませたほうが早い。

[js STUDIO](http://js.studio-kingdom.com/javascript/array/join)
[参考](http://d.hatena.ne.jp/uupaa/20090828/1251418928)

随時更新。
CakePHP2のコントローラテストで$this->generate()するとClassRegistryが初期化される


気がつかなくてしばらくハマったのでメモ(^^;

コントローラのテストでモデルをモックに差し替えてテストしたくなったので、すでにあったテストコードにモック生成コードを追加してはまりました。

```php
		// Mock生成
		$this->UploadFile = $this->getMockForModel('Files.UploadFile', ['getRealFilePath']);

		// ここでMockにあれこれする

		// 元々あったコンポーネント差し替えのコード
		$this->generate(
			'Cabinets.CabinetFiles',
			[
				'components' => [
					'Download'
				]
			]
		);

		// このあとコントローラテスト実行
```

こんな感じで書いてたらコントローラでモデルがさっぱり差し替わらない。
Xdebug使って処理追っかけてたら ```getMcokForModel()```でモック生成時にClassRegistry::$_objectsにちゃんとモックがはいってるのに、コントローラの実行時にはClassRegistry::$_objectsは初期化されたようにまっさら…

でテストコード中にもClassRegistry::init('Files.UploadFile')でモデルを取得してクラス名確認してて分かったんですが、どうやら```$this->generate()```すると```ClassRegistry::$_objects```はきれいさっぱりリセットされるみたいですね。

考えてみると```$this->generate()```でもモックへの差し替えとかやってるんで、testAction前に一旦まっさらにしてからモック生成と差し替えって流れなんでしょうね…

# まとめ
コントローラテストでモデルをモックに差し替えたいときは ```$this->generate()``` してから```$this->getMockForModel()```して差し替えましょう。
Digdag serverでH2やPostgreSQLのデータベースにデータを格納する


## はじめに

Digdagのサーバは、H2(Java組み込みデータベース)やPostgreSQL内にプロジェクトなどの情報を格納することができる。

Digdagのサーバの設定は次の三つの場所に格納できる(ようだ)

* H2オンメモリ
* H2パス指定 (組み込みJavaのデータベースでパスを指定して永続化)
* PostgreSQL

## 設定ファイルの形式

サーバの設定はJavaのシステムプロパティ形式で記述する([参考](http://qiita.com/toru-takahashi/items/a7253dec31cb5f36c196))。``key = value``という形式です。
将来的にはHOCON形式で記述できるようになるかもしれないとのこと。[use HOCON configuration format](https://github.com/treasure-data/digdag/issues/79)

:で区切った形式でも大丈夫なようですが([参考](http://docs.oracle.com/javase/jp/7/api/java/util/Properties.html#load(java.io.Reader)))、各種サイトを見ると=で書いているほうが多いので、=で統一することにしました。

## H2オンメモリの場合

``digdag scheduler -m``とすれば良いようだ。([参考](http://blog.techium.jp/entry/2016/06/20/090000))

オンメモリなのでサーバを停止すると、データは削除されます。

## H2パス指定の場合

H2でも次のようにパスを指定すれば、データを永続化することができるようだ。(サーバを立ち上げてみただけで永続化できているかは未確認　）

```
database.type = h2
database.path = ./test.db
```

``digdag server -c h2.conf``で指定したパス上にデータベースが作成される。

```
tree test.db
test.db
|-- digdag.mv.db
`-- digdag.trace.db

0 directories, 2 files
```

## PostgreSQLの場合

```
database.type = postgresql
database.user = user
database.password = passwd
database.host = 127.0.0.1
database.port = 5432
database.database = digdagdb
```

``digdag server -c postgresql.conf``でテーブルが自動的に作成される。

Digdagが指定されたデータベースの初期化を行う際に、`CREATE EXTENSION IF NOT EXISTS "uuid-ossp";`を実行します。権限の設定によっては実行に失敗することがあります。その場合はあらかじめスーパーユーザで`CREATE EXTENSION IF NOT EXISTS "uuid-ossp";`を実行すると良いようです。

PostgreSQL 9.6以上がオススメ

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">partial indexのwhere条件がindex-only scanに反映されるのは、PostgreSQL 9.6からだけども…digdagの内蔵分散キューは性能的にはPostgreSQL 9.6から本領発揮すると言うべき</p>&mdash; Sadayuki Furuhashi (@frsyuki) <a href="https://twitter.com/frsyuki/status/771616820633546752">2016年9月2日</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>


## ER

こんなテーブルがつくられるようだ。

![digdag.png](https://qiita-image-store.s3.amazonaws.com/0/61464/d266310f-b7f0-d73b-89ac-c02526ccddb2.png)([PDF版をダウンロード](https://gist.githubusercontent.com/hiroyuki-sato/d6a343a4716ec35359f7afac9b275c04/raw/f88637fd4716f2863f4d322929cc0d813241ef78/digdag_er.pdf))
iOS 10でついに通知許可ダイアログの操作をハンドリングできるようになったよ


## 概要

- エンドユーザーが通知（特にRemote Push Notification）を許可してくれたかどうかはサービスにとって死活問題
- 
それなのに通知の許可ダイアログでの選択を素直にハンドリングする方法がこれまでなかった

- iOS 10でそれを簡単にハンドリングできるようになったよ！

**2016/6/28 追記**

コメントで @mono0926 さんからいただいたとおり、じつはiOS 8/9でもdelegateでハンドリング可能ということが発覚しました。

http://qiita.com/tokorom/items/6c6864fa8e841e50e37b#comment-b07920917a7edfb87775

iOS 8/9 でのハンドリングについては別途まとめさせていただきますが、取り急ぎ、こちらで訂正させていただきます。

## iOS 9 以前

```swift
let notificationSettings = UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil)
UIApplication.sharedApplication().registerUserNotificationSettings(notificationSettings)

```

でiOSが必要なら

![notification_dialog.png](https://qiita-image-store.s3.amazonaws.com/0/7883/7fe075a1-eab0-6078-d04c-7ae9b2c1ea19.png "notification_dialog.png")


とエンドユーザにこのアプリが通知機能を使うことを許可するかどうかを確認するダイアログを表示していました。

しかしこのrequestは投げっぱなしのため、実際にそのダイアログが表示されたタイミングもプログラム的には検知できませんし、このダイアログに対してユーザーが実際に許可（Allow）をしたのかしなかったのかも、その瞬間にハンドリングすることが難しいという問題がありました。

（やるとすると少し間をおいて通知設定を確認するなどスマートでない方法...）

## iOS 10 でこうなる

しかしiOS 10で導入された`User Notifications Framework`により、これを正確にハンドリングすることができるようになったんです。
具体的には、

```swift
UNUserNotificationCenter.current().requestAuthorization([.alert, .badge, .sound]) { (granted, _) in
    // got granted :)
}
```

でこれまでと同じくiOSの判断で確認ダイアログが表示されます。

ただ素晴らしいことに（というかようやく）この`requestAuthorization`の第2引数のclosureは、この許可ダイアログでエンドユーザが`Allow`もしくは`Don't Allow`を選択したタイミングでコールバックされるんです！そしてその引数（上の例だと`granted`）に`Allow`と`Don't Allow`のどちらが選択されたかが渡されます。

## コールバックされるタイミングとgrantedの値のまとめ

なお、すでに許可の判断が済んでいて、この許可ダイアログが表示されない場合もコールバックされますので、正確にはユーザーの選択がコールバックされるというよりは、その時点での許可の状況がコールバックされるというのが正確な言い方かと思います。
（で、嬉しいのは、許可ダイアログが表示された場合は、許可の判断が終わるまでコールバックを待ってくれるところ）

| タイミング | granted |
|---|---|
| 許可ダイアログでAllowを選択 | true |
| 許可ダイアログでDon't Allowを選択 | false |
| request時に既にAllow済み（ダイアログは表示されない） | true |
| request時に既にDon't Allow済み（ダイアログは表示されない） | false |

ちなみに第2引数は `An object containing error information or nil if no error occurred. ` とのことだが今のところerrorが発生したことはない。

## ロギングや解析が捗る！

これにより、

```swift
UNUserNotificationCenter.current().requestAuthorization([.alert, .badge, .sound]) { (granted, _) in
    // Analyticsサービスにこのユーザーの状態を伝える
    amplitude.identify(AMPIdentify().set("notification_granted", value: granted))
}
```

とするなどし、適切なタイミングで正確な状態を把握できるようになりました。

ユーザーが通知を許可してくれるかどうかはサービス運営上の重要な課題のひとつですので、通知を許可してもらうための施策をうって、その効果を正確に測りたい場合などに助かりますね♪ （もっと早く欲しかった...）

## Ref: User Notifications Frameworkについて

- WWDC2016の[Introduction to Notifications](https://developer.apple.com/videos/play/wwdc2016/707/)
- koogawaさんの[iOS 10 時代の Notification](http://qiita.com/koogawa/items/0dff2f59096b292571db)