OmniAICreator/Qiita-1.07M huggingface dataset:
Azure Functionsで npmモジュールを使う

****
2016/11/16 追記
App Service Planを"動的"にして動作させる場合、
比較的大きなnpmモジュールをロードする場合に、上手くロードできない問題がある模様。
プランを動的ではなく、"Classic"にして試したところKuduからCMDで問題なくnpm install出来ている。
****
  
  
  
  

思いの外ハマったのでメモ。
まずここを読んだ。

Azure Functions NodeJS 開発者向けリファレンス
https://azure.microsoft.com/ja-jp/documentation/articles/functions-reference-node/


ここには、

>関数アプリのファイル システムの関数のフォルダーに package.json ファイルをアップロードすることで関数にパッケージを追加できます。

と書かれている。

package.jsonをアップロードして、実行すれば裏でよしなにnpm installしてくれるのかと思ったが、そんなことはない。
Kuduへ飛んで、npm installしてやる必要がある。
手順については、上述の Azure Functions NodeJS 開発者向けリファレンス に以下のように記載がある。

> 関数アプリの SCM (Kudu) コマンド ライン インターフェイスで npm install を使用することもできます。
1.https://<function_app_name>.scm.azurewebsites.net に移動します。
2.[デバッグ コンソール]、[CMD] の順にクリックします。
3.D:\home\site\wwwroot<function_name> に移動します。
4.npm install を実行します。

**ここで、CMDではなく、PowerShellを選んで　npm installする**
**CMDを使うとうまくインストールできなかった**


****
### その他のハマりポイント
Azure Functions developer reference (Azure Functions 開発者向けリファレンス)
https://azure.microsoft.com/ja-jp/documentation/articles/functions-reference/#fileupdate

ここに、
>関数アプリの SCM (Kudu) エンドポイントを使用するには
1.https://<function_app_name>.scm.azurewebsites.net に移動します。
2.[デバッグ コンソール]、[CMD] の順にクリックします。
3.D:\home\site\wwwroot に移動し、host.json または D:\home\site\wwwroot<function_name> を更新し、関数のファイルを更新します。
4.アップロードするファイルをファイル グリッドのフォルダーにドラッグアンドドロップします。ファイルをドロップできるファイル グリッドには 2 つの領域があります。.zip ファイルの場合は、[Drag here to upload and unzip (アップロードして解凍するにはここにドラッグしてください)] というラベルの付いたボックスが表示されます。 他の種類のファイルの場合は、ファイル グリッド内の [unzip (ファイルの解凍)] ボックスの外側にドロップします。

と書かれている。
AWS Lambdaのようにzipを上げてデプロイができるっぽい、と思って試したが、
上げてみると、解凍後、node_modules内部のファイルが不完全になったりする。
zipがうまく解凍できないようだ。
docker-machine で作成した Virtualbox 上の VM の IP を固定する方法

docker-machine で作成した Virtualbox 上の VM の IP を固定したかった。

stop, start を繰り返すと、デフォルトで使われている `192.168.99.n` の IP が重複したりする。

使い捨て環境なんだから、その都度、鍵の再生成等して頑張るのも一つかも知れないが、面倒なので作成した VM ごとに IP を固定したかったので、方法を調べた。

なんでそうなるのかまで調べてないので間違っている点があるかも…(間違いがあれば指摘して下さい…)

## 方法1: `virtualbox-hostonly-cidr` オプションを使う方法

```
$ docker-machine create --driver virtualbox --virtualbox-hostonly-cidr "192.168.55.1/24" NAME
```

これで、 `192.168.55.100` の IP を持った VM となる。

上記の `55` のところを変えていけば、末尾が 100 の VM が出来上がるはず。

ただし、これだと、 `55` の位置で IP を管理する事となってしまうのでちょっと不便。

## 方法2: boot2docker startup script で指定する方法

方法1の IP の管理は不便なので `192.168.99.n` の `n` を自由に設定する方法がこっち。

以下の手順では `dev1` という名前の VM に IP `192.168.99.50` を設定するとして記載。

まずは、適当に VM を作る。

```
$ docker-machine create --driver virtualbox dev1
```

作成した VM に SSH で入り VM の中の `/var/lib/boot2docker/bootsync.sh` に boot2docker startup script を準備する。

```
$ docker-machine ssh dev1
$ sudo vi /var/lib/boot2docker/bootsync.sh
#!/bin/sh
/etc/init.d/services/dhcp stop
ifconfig eth1 192.168.99.50 netmask 255.255.255.0 broadcast 192.168.99.255 up
$ sudo chmod 755 /var/lib/boot2docker/bootsync.sh
$ exit
```

上記を準備した VM に対して docker-machine コマンドから restart, regenerate-certs する。

```
$ docker-machine restart dev1
$ docker-machine regenerate-certs dev1
```

これで `dev1` の IP が `192.168.99.50` になる。

`$ docker-machine ip dev1` とか `$ docker-machine ls` とかで確認できる。

*2016-10-21 19:12 追記*

上記の方法2をシェルスクリプトにまとめてみた。

https://github.com/hokutoasari/docker-machine-static-ip

使い方

```
$ docker-machine-static-ip.sh --id IP_ADDRESS DOCKER_MACHINE_NAME
```
CircleCIでのビルドを解除する

CircleCIを回していたが不要になったときの解除方法です

## 手順

Project Settings > Overview > Stop Building

<img width="169" alt="スクリーンショット 2016-10-21 17.41.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/61095/64ebdfb5-0727-2d70-a245-ffade1c9bb51.png">

## 注意点(というかこれをメモしたかった)

follow状態でないとStop Buildingの選択肢は現れません
複数のリポジトリを管理していて常にfollowしていない場合一度followすればビルド停止することが出来ます

no followだと以下が表示される
<img width="189" alt="スクリーンショット 2016-10-21 17.41.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/61095/a183e90d-a178-164b-ec7d-f6097e8f350d.png">
Zabbix3.xでメール(AmazonSES)を設定する

Zabbix3.xからSMTPでAmazonSESを通してアラートメールを送信する設定を行う。
Zabbix3.xになってメディアタイプにスクリプトパラメータを自分で記述するようになっていて、解決に時間がかかった。
切り分け方法も含めて備忘録として残しておく。

# 前提

* EC2 AmazonLinuxにZabbix-Serverを構築
* Zabbix 3.0.4 を使用。
* メールはSMTPでAmazonSES（Oregonリージョン）から送信

# AmazonSESの準備

* SES用のIAMユーザの作成
* IAMユーザにポリシーのアタッチ
* アクセスキーとシークレットアクセスキーのダウンロード
* メールアドレスの認証

マネジメントコンソールのSES -> SMTP Setting -> Create My SMTP CredentialからIAMユーザの作成を行うと自動で必要なポリシーまで付与してくれる。

# Zabbixサーバ側設定
http://www.zabbix.jp/node/1441
基本的にここの「Zabbixサーバ以外のサーバ上で動作しているSMTPサーバを利用する場合」に沿って進めればよい。
スクリプトを置く場所は、zabbix_server.confを見ること。
AmazonSESを利用する場合は以下のように記載する。

```
$MAIL_FROM = "zabbix@localhost";	「zabbix@localhost」の箇所にSESで認証済みの送信元にするメールアドレスを記述する
$MAIL_SMTP_HOST = 'smtp.example.com:25';	「smtp.example.com:25」の箇所に「SESのServerName:ポート」の形式で記述する
$MAIL_SMTP_USER = 'XXXXXXXX';	XXXXXXXX の箇所にIAMのアクセスキーを記述する
$MAIL_SMTP_PASS = 'XXXXXXXX';	XXXXXXXX の箇所にIAMのシークレットアクセスキーを記述する
```

この時点で、SESとの疎通を確認できる。
以下のコマンドで実施できるが、送信先メールアドレスはSESの認証済みであるアドレスを入力する。
./sendmessage_smtp_php.sh '送信先メールアドレス' '件名' '本文'
successとでれば成功

# Zabbixのメディアタイプ設定
ZabbixWebコンソールで操作する。
管理 -> メディアタイプ から作成する。

```
名前: 名前は任意
タイプ: Script
スクリプト名：zabbix_server.confにあるalertsctiptsディレクトリからの相対パスで書く。
スクリプトパラメータ: 以下の3行を追加する。
{ALERT.SENDTO}
{ALERT.SUBJECT}
{ALERT.MESSAGE}
```

# Zabbixのアクション設定
先ほど作成したメディアタイプを選択する。
トリガーに関連付ける設定を行う。


# この設定をしても上手く動かない場合は・・・

## 思いつく限りで切り分け方法をかく

* サーバ上からsendmessage_smtp_php.shを実行してもSESまでいかない！
 - IAMの権限や、シークレットキー、シークレットアクセスキーが正しいかどうか確認。
 - SESのservernameへ名前解決ができるか確認
 - iptablesの確認 (dns,mailのポート)

* アラートを出してもZabbix側が上手く動かない！
 - 監視データ -> トリガーにあるか？
    - ある
        - 監視データ -> イベントを確認
    - ない
        - トリガー設定を見直す

 - 監視データ -> イベントを確認
    - アクションに数字があるか
        - ある
            - レポート -> アクションログを確認
            - ステータスがどうなっているか確認
        - ない
            - アクション設定を確認


 - レポート -> アクションログを確認
    - ステータスを確認
        - 送信済
            - メディアタイプのスクリプトパラメータを確認
        - 未送信
            - ×印を確認する。
            - メディアタイプのスクリプト名を確認

 - それでもダメなら
    - ユーザグループ、ユーザにホストグループ、ホストの権限があるか確認する

Admin運用せず、ユーザグループを細かく割り当てている場合は思ったように送信されないことはありがち。
現象としてアクションログをみてちゃんと動いているように見えるけれどメールが送信されないときは大体これ。
ユーザグループや、ユーザの権限（ホストグループやホストの閲覧権限）は正しく設定すること。

あまり上手くまとめられませんでしたが、以上備忘録になります。
gulpでFTPのアップロード（gulp-sftp）

すでに情報はいろいろあるけど、実際に自分でやってみたのでメモ。

## 必要なパッケージ

- gulp
- [gulp-sftp](https://www.npmjs.com/package/gulp-sftp)

```bash
$ npm install gulp --save-dev
$ npm install gulp-sftp --save-dev
```

## シンプルにアップロードするだけ

```javascript:gulpfile.js
var gulp = require('gulp');
var sftp = require('gulp-sftp');

gulp.task('upload', function () {
	return gulp.src([
		'html/**/*' // アップロードしたいファイルを指定
	])
		.pipe(sftp({
			// FTP情報を入力
			host: "***.com",
			user: "***",
			pass: "***",
			remotePath: "/home/***/" // リモート側のパス　（デフォルトは "/"）
		})
	);
});
```

### アップロードの実行

```
gulp upload
```


## gulpfile.jsに直接FTP情報を書きたくない場合

### FTP情報を外部ファイルに記述

`ftp.json` を用意したとする。

```json:ftp.json
{
	"host": "***.com",
	"user": "***",
	"pass": "***",
	"remotePath": "/home/***/"
}
```

### gulpfile.js

ftp.jsonを読み込むコードを追加。

```javascript:gulpfile.js
var gulp = require('gulp');
var sftp = require('gulp-sftp');
var fs   = require('fs'); // 追記 （npm installは不要）

// FTP情報を読み込む
var ftp = JSON.parse(fs.readFileSync('ftp.json', 'utf8'));

gulp.task('upload', function () {
	return gulp.src([
		'html/**/*' // アップロードしたいファイルを指定
	])
		.pipe(sftp(ftp)
});
```

ちなみに、外部ファイルの読み込み自体は `require` でもいいけど、キャッシュ関係で問題を起こすことがあるみたいなので、このような `JSON.parse` とかいうコードが出てくる。詳しくは以下の記事を参照。

* [node.jsでjsonファイルを読み込む方法 - まーぽんって誰がつけたの？](http://mpon.hatenablog.com/entry/2014/03/10/001214)

### アップロードの実行

```
gulp upload
```
Swift3で継続モナドを書いてみる

Swift3で継続モナドを書いてみました。

```contMonad.swift

import Foundation

typealias CPSCallBack<R> = (R)->Void
typealias CPSFunction<R> = (@escaping CPSCallBack<R>)->Void


class ContMonad<R> {
    
    let cps: CPSFunction<R>
    
    init(cps:@escaping CPSFunction<R>) {
        self.cps = cps
    }
    
    func run(callBack:@escaping CPSCallBack<R>)->Void {
        return cps(callBack)
    }
    
    func fmap<T>(_ f:@escaping (R)->T) -> ContMonad<T>{
        return self >>= {(r:R) in unit(f(r))}
    }
}

func >>=<R,T>(left:ContMonad<R>, right:@escaping (R)->ContMonad<T>) -> ContMonad<T> {
    
    
    let f = {(cb:@escaping CPSCallBack<T>) -> Void in
         left.run(callBack:{r in
            let c:ContMonad<T> = right(r)
            c.run(callBack:{t in
                cb(t)
            })
        })
    }
    
    return ContMonad<T>(cps:f)
}

func unit<R>(_ x:R) -> ContMonad<R> {
    
    let cps:(CPSCallBack<R>)->Void = {(cb:CPSCallBack<R>)->Void in
        return cb(x)
    }
    
    return ContMonad<R>(cps:cps)
}


func fmap<R,T>(f:@escaping (R) -> T, m:ContMonad<R>) -> ContMonad<T> {
    
    return m >>= {(r:R) in unit(f(r))}
}

func fmap<R,T>(f:@escaping (R)->T) -> (ContMonad<R>) -> ContMonad<T> {
    return {m in fmap(f:f, m:m)}
}


enum CPSResult<X>{
    case just(X)
    case error(Error)
}

```

使用例として、IDを非同期で取得する関数、IDから非同期でレコードを取得する関数、結果の変換をする関数を定義し、最後に>>=つまりバインドでつなげます。

```example.swift


func getRecordCont(uid:SomeUID?) -> ContMonad<CPSResult<SomeRecord>> {
    return ContMonad{cb in
        let cb_ = cb
        DispatchQueue.global().async {
            let r = SomeRecord(title: "\(uid?.uid) - record")
            cb_(CPSResult.just(r))
        }
    }
}

func getUIDsCont()->ContMonad<CPSResult<SomeUID>> {
    return ContMonad { cb in
        DispatchQueue.global().async {
            let r = SomeUID(uid: "PO")
            cb(CPSResult.just(r))
        }
    }
}

func uidFromResult(_ r:CPSResult<SomeUID>) -> SomeUID? {
    switch r {
    case let .just(uid):
        return uid
    default:
        return nil
    }
}


var b = getUIDsCont().fmap(uidFromResult)
let c = b >>= getRecordCont

c.run { r in
    print("ContMonad result = \(r)")
}

sleep(100)

```

まとめたものはこちらに
https://github.com/KatagiriSo/RDMonad/blob/master/RDMonad
Android Nougat MR1 の Back, Home, Recent ボタンと画面回転

Android 7.1 Nougat MR1 は現在ベータプログラム参加者向けに Developer Preview として配布されています。あくまでプレビュー版ですので挙動は今後変更されることもありますが、ぱっとさわってみたところ、しれっと大事なところの動きが変わっていたのでスクリーンショットとともに記録しておきます。

Android 7.0 Nougat までは、横画面にしたときの Back, Home, Recent は常に画面右側に配置されていました。

![device-2016-10-21-171111.png](https://qiita-image-store.s3.amazonaws.com/0/31829/1482a341-b20f-b6ae-a9ef-48df8a953477.png)

この配置が Android 7.1.1 Nougat MR1 では、向きによって変わります。

端末を右に倒すと左側に。

![device-2016-10-21-170911.png](https://qiita-image-store.s3.amazonaws.com/0/31829/9818ddae-e87e-8a6b-9a11-5513280c7319.png)

端末を左に倒すと右側に。

![device-2016-10-21-170925.png](https://qiita-image-store.s3.amazonaws.com/0/31829/fde1fb7f-1bf4-d429-0bcd-d2d0a0a383c8.png)

もし WindowManager で他のアプリに重ねて View を表示する機能がある場合、この Back, Home, Recent の領域に View を描画することができます。

ちなみに、180度回転（上下逆に）するときちんと画面回転してくれます。
Rancher もくもく勉強会 #1 - connpass 記録

Rancher もくもく勉強会 #1 - connpass
http://connpass.com/event/41997/

挨拶


自己紹介


 自己紹介のつもりが、名刺交換会から開始になってしまいました。

・初心者向けチーム
・もくもくチーム
に分かれて開始しました。

![DSC_0070.JPG](https://qiita-image-store.s3.amazonaws.com/0/15176/6a7020fb-8b74-8a74-4c3e-9d3f02e201f6.jpeg)

新藤さんが初心者向けチームにRancherの概要説明中

chiba go さんがRancherとDockerの解説
・Rancherの日本語訳は、Chibaさんがされた
・Rancherのインストールは、コマンド一発 以上　とても簡単
・クラウドのサポートも楽ちん。
・AWSにあるRancherOSのイメージを使えば、ホストの追加もOK。

＃Chiba goさんの深い話がつづく
![DSC_0071.JPG](https://qiita-image-store.s3.amazonaws.com/0/15176/6e1d59b9-ded0-2997-a57e-78d6c0bc1248.jpeg)

ネットワークとかスケジューリングとかは、K8sとかが担当するべき範囲
　docker-compose.ymlは、Dockerのコンテナの関係性を示す。
　rancher-compose.ymlは、Rancherのスケールするとかの設定を示す。

コンテナイメージは、どこからか取ってくるしかない。
CIツールは、別途必要になる。

yo コマンドでRancherのCatalogテンプレートを作ってくれる。

Kubernetesと、Cattleでのインフラの大きいので、カタログでも動く、動かないというのが実はある。
越えられない壁があって。。

Rancherのいいところは、Dockerのコマンドラインではちょっとお。と言う人向けにDockerの民主化の為に必要

@cyberblack28 さんのDocker解説

![DSC_0072.JPG](https://qiita-image-store.s3.amazonaws.com/0/15176/e254dfde-a1da-2ed4-59ff-44b07ddcb033.jpeg)

Dockerの手順は、自分の手で打つと勉強になるよ。
VMで動かす場合は、ネットワークが注意

@Cyberduck28 さんが解説してくれたDockerの資料は、以下です。
「Docker～WordPress環境を作ってみる ハンズオン編」
http://www.slideshare.net/cyberblackvoom/linaction-theme-docker

Dockerのいいところ
1. オーバーヘッドが少ない。
2. OSの部分まで入っているのでデプロイが簡単。
3. インフラ環境によらずに管理が楽になりました。

Docker勉強会になりつつありｗ。

Dockerのダメなところ。

1. ステートレスな形で構成しないとダメです。
2. トラブルをちゃんと解析しない。
3. それなりにマッチする環境や方法を踏まえないとダメです。 

Dockerをエンタープライズに適用することの難しさ。
--->発想が変わらないとなかなか難しい。

Googleとかとかと日本の環境との違いが大きすぎる。

業務系の開発からでは、コンテナの発想が大きくちがうのでワケワカ

IoT などの場合では、サーバーが何万台とある全てのIoTデバイスをコントロールするのは現実的ではないのではと思う。途中IoTのデバイスを中継する中継基地サーバーが必要なのではないだろうか。コンテナーはそういう用途に非常に向いていると思う。

それを受けて、Chiba go さんのIoT 関連話。Resin.io でのドローン内でコンテナが動いている話を紹介。参加者一同驚嘆

Home | Resin.io
https://resin.io/


Rancherでコンテナが100台とかになったら画面がどうなるか気になる。
「そのうちグルーピングできるようになるんじゃないだろうか？」
「検索インターフェースも必要だよね」
「画面は、レスポンシブ対応もありますよ。」

Rancherでのモニタリングとか、シェルとかもGUIから接続できますよ。

新藤さんが、今日の本題 3行でDocker+Rancherを解説

@ynott が DockerとRancherの関係を図で解説
![DSC_0075.JPG](https://qiita-image-store.s3.amazonaws.com/0/15176/bf4df587-1154-1502-c363-ae6191bf16e3.jpeg)


「次回は、12月ぐらいに Meetup しましょう。Google のIan Lewis と会話中」
[Xcode8以降] scrollViewやViewにxibで作ったカスタムViewをaddSubViewするとオートレイアウトが効かなくなる件

## まずはじめに

XCode8対応 Swift3対応皆さん順調ですか？
今回対応にあたりハマったのでメモ程度に書いていこうと思います。

この度業務でXcode8対応のためコンバート・移行作業を行いました。
自分はよくScrollViewにオートレイアウトされたxibを置いて表示するような実装をよく行います。
今回問題の箇所はscrollViewにxibをaddSubViewするとオートレイアウトが効かなくなる
ということで

## 早速始めていきましょう

ViewControllerにScrollViewをオートレイアウトで画面いっぱいに敷き詰めます。

<img width="389" alt="9ea38ad23c7c2f04f331882182728d93.png" src="https://qiita-image-store.s3.amazonaws.com/0/46527/5ac9bd19-781e-ccf3-b3f9-d7efd7fc1843.png">
　
　
次にxibを配置するコードを簡単に書いていきます。
呼び出したいViewControllerに以下のコードを。

```Swift:ViewController
class ViewController: UIViewController {
    @IBOutlet weak var scrollView: UIScrollView!
    override func viewDidLoad() {
        super.viewDidLoad()
        let addView = UINib(nibName: "View", bundle: nil).instantiate(withOwner: self, options: nil)[0] as! UIView
        addView.frame = self.view.bounds
        scrollView.contentSize = CGSize(width: self.view.frame.width, height: self.view.frame.height)
        scrollView.addSubview(addView)
    }
}
```
　



まず単純にオートレイアウトをかけずにViewControllerから呼び出して配置してみます。
シュミレーターでプレビューをしてみるとこんな感じ。オートレイアウトはかかっていませんが問題なく表示されています！

<img width="786" alt="4de7506de935346dd13c83f6334d23d3.png" src="https://qiita-image-store.s3.amazonaws.com/0/46527/c2761d16-eaca-5ade-c4a1-bff40f828f2e.png">  

　　

　

  
  

今度はグレイのViewに200px x 200px の制約をつけ右寄せしてオートレイアウトしてみましょう.....   
<img width="638" alt="605c6efceb8fef427d87245ac6a13535.png" src="https://qiita-image-store.s3.amazonaws.com/0/46527/fd1d80a6-6514-1ba4-5fec-d9316b447c53.png">

なんとシミュレーターで確認しても何も表示されない。
オートレイアウトのErrorもたくさん出現....


## ここからちょっとした設定を行います
まず呼び出したいxibを開きViewを選択肢ます。
右側のメニュー内Simulated MetricsのSizeをFreeformに変更します。

  <img width="999" alt="31b22c5e028a00a03b15fee551093158.png" src="https://qiita-image-store.s3.amazonaws.com/0/46527/57b450da-9b9f-36d4-5faf-223a455d99ac.png">

　
　
　
そしてAutoResizeingを図のように設定します。  
![a86183e1e8af52ca7e16c1f45a1bc1ff.png](https://qiita-image-store.s3.amazonaws.com/0/46527/f1b1b55d-5263-5b5a-fbcc-75267b442e94.png)

　
　

するとめでたく期待通りの制約がついた正しい表示になりました

<img width="985" alt="2ec70b8db82a09f6b47a87b76f353685.png" src="https://qiita-image-store.s3.amazonaws.com/0/46527/33a0df69-9b6e-6fbe-ac87-4004012e646a.png">
XCode8にアップデート後、Qtのライブラリを使ったプロジェクトのビルドでERRORがでるとき

capybara-webkitのビルドで以下のエラーが発生したときの対処

```bash
$ gem install capybara-webkit -v '1.11.1'

...

Project ERROR: Xcode not set up properly. You may need to confirm the license agreement by runningfind 
/usr/bin/xcodebuild.
```

# 環境
macOS Sierra
Ruby 2.2.5
QMake version 3.0

# 手順

1. Qtのインストールしたディレクトリの配下にある`mkspecs/features/mac/default_pre.prf`というファイルを開く

    findコマンドで検索できます。

    ```bash
$ find / -name default_pre.prf
...
/usr/local/Cellar/qt5/5.5.1_2/mkspecs/features/default_pre.prf
/usr/local/Cellar/qt5/5.5.1_2/mkspecs/features/mac/default_pre.prf
/usr/local/Cellar/qt5/5.5.1_2/mkspecs/features/win32/default_pre.prf
/usr/local/Cellar/qt5/5.5.1_2/mkspecs/features/winrt/default_pre.prf
/usr/local/Cellar/qt5/5.5.1_2/mkspecs/macx-ios-clang/features/default_pre.prf
```
2. mkspecs/features/mac/default_pre.prfをエディタで開く
3. 以下の行を検索して

    ```
isEmpty($$list($$system("/usr/bin/xcrun -find xcrun 2>/dev/null"))): \
```

4. 以下の通り編集して保存する
   
    ```
isEmpty($$list($$system("/usr/bin/xcrun -find xcodebuild 2>/dev/null"))): \
```

# 参考ページ
https://forum.qt.io/topic/71119/project-error-xcode-not-set-up-properly/7
http://stackoverflow.com/questions/39492617/xcode-8-error-project-error-xcode-not-set-up-properly-even-though-the-licens
AWS apacheのアクセスログとELBのヘルスチェックのログを分ける

ELB経由でwebサーバー公開するときにapacheのログにELBのヘルスチェックが一緒に入ってしまう。
なのでログを分ける。

```
ServerName example.com
<VirtualHost *:80>
 Servername example.com
 DocumentRoot /var/www/example

 SetEnvIf User-Agent "ELB-HealthChecker.*" nolog
 SetEnvIf User-Agent "ELB-HealthChecker.*" elb
 ErrorLog /var/log/httpd/example-error_log
 CustomLog logs/example-access_log combined env=!nolog
 CustomLog logs/elb_HelthCheck_log combined env=elb

 <Directory "/var/www/example">
  Options FollowSymlinks
  AllowOverride All
  Require all granted
 </Directory>
</VirtualHost>
```
CocoaPods を .gitignore すべきか

iOS のライブラリ管理で一番メジャーな方法として、 [CocoaPods](https://cocoapods.org/) がある。
RubyGems や npm のようにライブラリの依存管理などをやってくれるやつだ。

普通 RubyGems を使うときは vendor/bundle を gitignore するし、 npm では node_modules を gitignore する。
ただし、 Cocoapods は Pods ディレクトリをソース管理することを**推奨**している。

[CocoaPods Guides \- Using CocoaPods](https://guides.cocoapods.org/using/using-cocoapods.html)

> Whether or not you check in your Pods folder is up to you, as workflows vary from project to project. We recommend that you keep the Pods directory under source control, and don't add it to your .gitignore. But ultimately this decision is up to you:

ソース管理することの理由はいくつか書いてあって、

* ライブラリインストールする手間を省ける
* GitHub がサーバダウンしてても開発に影響がない
* ライブラリのレポジトリが消えてても開発に影響がない

などが書かれている。
ソース管理しないメリットも書かれていて、

* ソースコードのレポジトリが小さく保たれる
* Podfile.lock と同一のライブラリをインストールできる (取得元が消えていなければ)
* ライブラリの version 違いによるコンフリクトを防げる

などが書かれている。

しかし、ライブラリをソース管理することで大きなデメリットとなるのが、プルリクエストである。
プルリクにライブラリのコードが入ってしまうため、レビュワーの負担が大きくなる。
レビューすべきファイルか都度確認しなければならない。

対策としては、ライブラリを追加するだけのプルリクを出すくらいしか思い浮かばない。
とはいえ、ライブラリを素振りして、使い心地を確認した上でプロダクトに入れていくか決めたいため、ライブラリを追加するためだけのプルリクはダルい。

Podfile.lock にコミットハッシュがのっているし、基本的には Pods/* は .gitignore しても問題ないと思う。
CocoaPods の推奨とは違うことになるけど、 git clone して `pod install` してから build してもらう運用でやっていこうと思う。

とはいえ、まだ開発始まったばかりなのでやりながら考えます。

---

\* 個人で開発しているアプリはプルリクの必要がないため、 Pods/* もソース管理しています。
CloudMLからgoogle cloud storageのファイルにアクセスする

CloudML上でpython標準のopen()関数を使ってgoogle cloud storageのURI（gs://...）にアクセスしようとするとエラーを吐く。

スタックオーバーフローで調べてみると、次のようなエントリを見つけた。
http://stackoverflow.com/questions/40133223/pickled-scipy-sparse-matrix-as-input-data
CloudML上からgoogle cloud storage上のファイルにアクセスする際には、tensorflowのfile_ioパッケージを使う必要があるらしい。
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/lib/io/file_io.py

```py:file_io_test
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from tensorflow.python.lib.io import file_io

path = "./local_file.txt"
#ファイルポインタを取得
#pathはローカルのファイル、cloud storage上のファイルどちらのも対応している
fp = file_io.FileIO(path,"w")
fp.write("HelloWorld\n")
fp.close()

#with構文にも対応
with file_io.FileIO(path,"w") as fp:
    fp.write("HelloWorld\n")

```
Maya | 回転順番を変換する

Mayaの回転順番を変換するには、OpenMayaのreorderを使用する。

次のコードは(X:70, Y:80, Z:90)の回転を回転順番XYZで作成し、後に回転順番YZXに変換している。

```py
import maya.OpenMaya as om
import math

rot = [70, 80, 90]

r = om.MEulerRotation(math.radians(rot[0]), math.radians(rot[1]), math.radians(rot[2]), om.MEulerRotation.kXYZ)
print "before:"
print math.degrees(r.x), math.degrees(r.y), math.degrees(r.z)

r = r.reorder(om.MEulerRotation.kYZX)
print "after:"
print math.degrees(r.x), math.degrees(r.y), math.degrees(r.z)
```

実行結果

```
before:
70.0 80.0 90.0
after:
10.0 90.0 20.0
```

回転順番の指定には次のものがある。

```
kXYZ
kYZX
kZXY
kXZY
kYXZ
kZYX
```
htmlファイルをpythonでpdfに出力する

Markdownで生成したhtmlファイルをpdfとして保存する方法。
ブラウザで開き、pdfファイルとして保存する方法が簡単だと思いますが、ここではpythonで処理する方法を紹介します。

## 準備
環境：python 3.4.2 / windows 8.1 Pro

まず、[pdfkit](https://pypi.python.org/pypi/pdfkit)パッケージをインストールします。(執筆時点では0.5.0)
`pip install pdfkit`

python IDLEを開いて、インストールがうまくいったかを確認します。
IDLEはターミナルから`python -m idlelib.idle`として立ち上げられます。（IDLEを開かず、単に`python`と打って試すこともできます。）

```
>>>import pdfkit
>>>
```
何事もなくプロンプトがもどれば成功です。`exit()`でpythonを終了します。

この段階でpython scriptを書いて試したところ、wkhtmltopdfをインストールするよう指示がでました。[wkhtmltopdfのページ](http://wkhtmltopdf.org/downloads.html)から0.12.3.2(64 bit)をダウンロードしてインストールし、パスを通しておきます。（私の場合、`C:\Program Files\wkhtmltopdf\bin`）

ターミナルから、`which wkhtmltopdf`と打ってパスが表示されればうまくいっています。

## 使ってみる
使い方は[pdfkitのページ](https://pypi.python.org/pypi/pdfkit)に書かれています。htmlファイルのパスをコマンドラインからargとして渡すとhtmlファイルと同じディレクトリにpdfファイルが生成されるコードを下に示します。

```python
# html2pdf.py
# convert html to pdf with pdfkit

import pdfkit
import sys
import os

html = sys.argv[1]

html_base = os.path.splitext(html)[0]
pdf_out = html_base + '.pdf'

options = {
    'page-size': 'A4',
    'margin-top': '0.1in',
    'margin-right': '0.1in',
    'margin-bottom': '0.1in',
    'margin-left': '0.1in',
    'encoding': "UTF-8",
    'no-outline': None
}

pdfkit.from_file(html, pdf_out, options=options)
```

htmlファイルのほか、URLを受けて同様の処理をするmethod、`.from_url()`も用意されています。こちらも便利に使えると思います。
Google Playへ公開したアプリのレビューをコードから取得する

# 概要

Google Playに公開したアプリへのユーザーからのレビューをコードから取得してみたのでメモです。

# 準備
## サービスアカウントの作成

[Google Cloud Platformのコンソールの認証情報](https://console.cloud.google.com/apis/credentials)からサービスアカウントを作成し、`client_secret.json`をダウンロードしておきます。

## Google Play Developerコンソールとの紐付け

Google Play Developerコンソールの[設定] -> [APIアクセス]で作成したサービスアカウントを紐付けます。また、サービスアカウントを作成したプロジェクトで[Google Play Android Developer API](https://console.cloud.google.com/apis/api/androidpublisher-json.googleapis.com/overview)を有効化しておきます。

# API Clientの利用

今回、APIへのアクセスは[Google API Client Library for Ruby](https://developers.google.com/api-client-library/ruby/start/get_started)を使用します。

# API Clientからの認証処理

`client_secret.json`を使用して認証処理を実行します。認証処理のコードは以下の様になります。scopeには`https://www.googleapis.com/auth/androidpublisher`を指定します。

```ruby
require 'googleauth'

options = JSON.parse(File.read('client_secret.json'))
key = OpenSSL::PKey::RSA.new(options['private_key'])

auth = Signet::OAuth2::Client.new(
  token_credential_uri: options['token_uri'],
  audience: options['token_uri'],
  scope: %w(
    https://www.googleapis.com/auth/androidpublisher
  ),
  issuer: options['client_email'],
  signing_key: key
)
```

# レビューリストの取得

[Google Play Developer APIのドキュメント](https://developers.google.com/android-publisher/getting_started)を確認するとレビューを取得できることがわかります。さらに、[google-api-ruby-clientのdocs](http://www.rubydoc.info/github/google/google-api-ruby-client)を見てみると、[Google::Apis::AndroidpublisherV2](http://www.rubydoc.info/github/google/google-api-ruby-client/Google/Apis/AndroidpublisherV2)を使用することでレビューを取得できそうです。

`Google::Apis::AndroidpublisherV2::AndroidPublisherService.new`でsearviceを作成し、`service.authorization`に認証情報を入れます。そして、`service.list_reviews`にGoogle Playで公開しているアプリのpackage名を引数に指定することでレビューのリストを取得できます。

```ruby
service = Google::Apis::AndroidpublisherV2::AndroidPublisherService.new
service.client_options.application_name = 'Google Play Developer Console Sample'
service.authorization = authorize

response = service.list_reviews('YOUR_PACKAGE_NAME')
```

最終的なコードは以下の通りです。

```ruby
require 'google/apis/androidpublisher_v2'
require 'googleauth'
require 'pp'

def authorize
  options = JSON.parse(File.read('client_secret.json'))
  key = OpenSSL::PKey::RSA.new(options['private_key'])

  auth = Signet::OAuth2::Client.new(
    token_credential_uri: options['token_uri'],
    audience: options['token_uri'],
    scope: %w(
      https://www.googleapis.com/auth/androidpublisher
    ),
    issuer: options['client_email'],
    signing_key: key
  )
  auth
end

service = Google::Apis::AndroidpublisherV2::AndroidPublisherService.new
service.client_options.application_name = 'Google Play Developer Console Sample'
service.authorization = authorize

response = service.list_reviews('YOUR_PACKAGE_NAME')

pp response
```

# 参考
- https://developers.google.com/android-publisher/getting_started
- https://developers.google.com/android-publisher/reply-to-reviews
- https://developers.google.com/android-publisher/authorization
- http://www.rubydoc.info/github/google/google-api-ruby-client/Google/Apis/AndroidpublisherV2
- https://developers.google.com/apis-explorer/#search/play/androidpublisher/v2/androidpublisher.reviews.list
アスペクトを保持したまま、background-imageのサイズを変更


デモ：http://codepen.io/mo4_9/pen/KgALyV

アスペクトを保持したまま、background-imageのサイズを変更する。

```css
@mixin flex-img($w: 16, $h: 9){
  width: 100%;
  height: 0;
  padding-bottom: ($h/$w) * 100%;
  background-size: contain;
  display: block;
}

.item{
  width: 100%;
  span{
    @include flex-img(320, 180);
    background-image: url(http://placeimg.com/320/180/tech);
  }
}
```

追記
PostCSSのパッケージ[postcss-utilities](https://www.npmjs.com/package/postcss-utilities)に同じやつあった
deep generative model memo

## for M1 

${\bf x}_i \in D$の生成モデル

```math
\begin{eqnarray}
p(z) &=& N (z | \theta),\quad p_{\theta}(x|z) = f(x; z, \theta) \\
p_{\theta}(x) &=& \sum_{z} p_{\theta}(x|z)p(z)
\end{eqnarray}
```

- この人がdecoder


$q_{\phi}(z|x)$ がencoderで識別モデルにもなる人

```math
\begin{eqnarray}
q_{\phi}(z|x) &=& N(z| \mu_{\phi}(x), \quad \mbox{diag} \sigma^2_{\phi}(x))

\end{eqnarray}
```

- auto encoderというのは， encoder ☓ decorderで尤度的なものを最大化する．
- Encoder, DecorderそれぞれMLPのパラメータをもつ
- それらを， Auto encoding variational Bayesで最適化
【翻訳】Super Fast Dynamic Websites with CloudFront, ReactJS, and NodeJS - Part 1

# Super Fast Dynamic Websites with CloudFront, ReactJS, and NodeJS - Part 1
 Paul Coady / October 03, 2016

以下のブログを作者(Paulさん)の許可を得て翻訳しています。
http://blog.backspace.academy/2016/10/super-fast-dynamic-websites-with.html

誤訳は申し訳ありません。正しくはオリジナルを参照願います。
ご連絡頂けると幸いです。

----



CloudFront は、ウェブベースのアプリケーションの配備において、必須の構成要素です。非常に低レイテンシでのパフォーマンスを簡単に提供するだけでなく、最大のサーバ稼働でありながら劇的にサーバの費用を下げます。

低レイテンシな静的ウェブサイトを CloudFront で作成することは、比較的簡単なプロセスだ。あなたは、ただ、あなたのサイトを S3 にアップロードして、CloudFront のディストリビューションを作成すればよい。これは HTML5 のウェブサイト、そして、Jeckyl といった静的ブログのサイトにとても良い。しかし、リアルタイムに情報を生成しエンドユーザに届けるダイナミックなサイトの場合はどうであるか？これには異なる戦略が必要です。ダイナミックなサイトにおける様々なキャッシュの手法について、たくさん公表されています。しかし、私はこの目的を達成する最も一般的で信頼性のある技術を紹介します。

## Server Side v Browser Side Rendering

もし、いくつかの Node.js の本を読んだなら、サーバ上で Jade テンプレートを使った多くのレンダリングの例があることは疑わないだろう。もし、まだこれをやっているなら、あなたは価値あるサーバリソースを無駄に消費している。より良い選択は、ブラウザ上でレンダリングすることだ。これに特化したフレームワークはたくさんある。もっとも有名なものは、Facebook の ReactJS と、Google の AngularJS だ ([State of JS report](http://stateofjs.com/2016/frontend/)参照)。私は個人的に ReactJS を使っており、後の例でも ReactJS になるだろうが、どっちを使ってもかまわない。

ReactJS または AngularJS をつかってサイトを作成し、NodeJS の公開ディレクトリにおけば、レンダリングをサーバ側からクライアントのブラウザ側にシフトすることができる。あなたのアプリケーションのユーザは、ボタンのクリックによって、ページが描画され、見れるようになるまで、もう待たされることはない。

ここで、ReactJS と AngularJS を使ったサイトのために、CloudFront ディストリビューションを作成しよう。

ページはブラウザで簡単に描画されるにもかかわらず、描画のための動的なデータは CloudFront にキャッシュされてしまうだろう。私たちはほとんど、動的なデータをキャッシュされることを望まない。このデータをブラウザに届けるために、何か解決策が必要だ。

## Handling Dynamic Data

CloudFront を使って動的データを扱うための、多くの精巧な技法が公開されてきたにもかかわらず、もっとも良い方法は、全てのデータをキャッシュしないことだ。

CloudFrontでは、全ての HTTP メソッドがキャッシュされるわけではなく、GET と HEAD リクエストだけ(OPTIONS リクエスト をキャッシュするかどうか設定することができる)である。もし、別のメソッド、例えば、POST、PUT、DELETE などを使った場合は、CloudFront にキャッシュされない。CloudFront は、これらのリクエストを、単純にバックエンドのサーバにプロキシするだけだ。

私たちの EC2 にある Node.js サーバは、 アプリケーションのための API を作成することにより、動的データのリクエストに応答するために使用することができる。その API は、クライアントのブラウザからの POST リクエストに応答するのだ。

![pptCD4.pptm [Autosaved].png](https://qiita-image-store.s3.amazonaws.com/0/69410/c93a568f-d6e6-2a59-a777-35c12cdb04cb.png)

読者のいくつかは、我々がどうして、AWS Lambda や API Gateway のようなサーバレス技術を使わないのか不思議に思うかもしれない。後でこれらを使用した別の記事を投稿するだろう。しかし、私は、ほとんどのアプリケーションにとって、EC2 は好適な技術だと考えている。まずコストについて、サーバレスの議論ではあまり言及されない。もしあなたのアプリケーションが非常に多くのトラフィックがあるなら、従来型の EC2/ELB アーキテクチャは、最もコスト効果が高いだろう。二番目に、多くのモダンな Web アプリケーションでは Websocket 接続を利用している。このタイプの接続は、(プロキシプロトコルを使った) ELB の背後にある EC2 で実現可能である。しかし、サーバレス技術では、コネクションは短いため、これを実現することはできない。

このシリーズの次の投稿では、EC2 上に NodeJS サーバを構築し、CloudFront ディストリビューションを設置し、動的データを扱うための API を作成しよう。

あなたは、最新のアップデートを取得できるように、ブログを購読してください。

もっと多くの AWS トレーニングやチュートリアルは、[backspace.academy](https://backspace.academy/)をチェックしてください。

[![logo_svg.png](https://qiita-image-store.s3.amazonaws.com/0/69410/55b64c1c-c477-81c6-0868-70e86859a438.png)]
(https://backspace.academy/)
Goのテストコードの書き方の備忘録

# Y?
Goのテストコードの書き方を
何回も忘れるので、
やはりqiitaに投稿します


# もともとのテストされるコード
app#AのテストをしたいがDao#Dはしたくない。
goでは多分後からDao#Dを書き換えることはできない

```:app.go
// Dao
type Dao struct{}

func (this *Dao) D() {}

// App
type App struct {
        dao *Dao
}

func (this *App) SetDao(dao *Dao) {
        this.dao = dao
}

func (this *App) A() {
        this.dao.D()
}

func main() {
        app := &App{}
        app.SetDao(&Dao{})
        app.A()
}
```

# ちょっと変更したテストされるコード
Appに構造体ではなく、
インターフェイスを埋め込む

```:app.go
// Dao
type Dao struct{}

type DaoInterface interface {
	D()
}

func (this *Dao) D() {}

// App
type App struct {
        dao DaoInterface
}

func (this *App) SetDao(dao *Dao) {
        this.dao = dao
}

func (this *App) A() {
        this.dao.D()
}

func main() {
        app := &App{}
        app.SetDao(&Dao{})
        app.A()
}
```


# テストするコード
インターフェイスを定義しておき、それをテスト用のmockの構造体に埋め込み、 
仮想メソッドがインターフェイスに実装されているので、AppのDaoの型チェックは通し、
テストで実際に必要なメソッドのみ実際にmockのメソッドとして実装する。
基底クラス（構造体）の埋め込みは不要なフィールドがついて来そうなので却下。


```:app_test.go
type mock struct {
       DaoInterface
}

// テスト不要なメソッドを書き換え
func (mock) D() {}

func Test_App_D_OK(t *testing.T) {
        var (
            err error  = nil
            exp string = ""
            ret string = ""
        )

        app := &App{}
        app.SetDao(&mock{})
        ret, err = app.A()

        if err != nil  {
                t.Error(err.Error())
        }
        if ret != exp {
                t.Error("Error")
        }
}
```

# 参考文献
https://github.com/luciotato/golang-notes/blob/master/OOP.md
linux / c > link > シェルコマンドの実行結果をCプログラム内で取得する > popen()を使う方法を教えていただいた

```txt:動作環境
CentOS 6.5
```

シェルコマンド(例: who)の文字列をexecl()などで実行して、Cプログラム内で結果を取得できるか疑問に思った。

参考
http://stackoverflow.com/questions/1776632/how-to-catch-the-ouput-from-a-execl-command

試してみた。
上記のリンク先のコードは1行だけの取得だが、以下では複数行を取得するようにしている。

```get_execl.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int cmd_quem(void) {
  int result;
  int pipefd[2];
  FILE *cmd_output;
  char buf[1024];
  int status;

  result = pipe(pipefd);
  if (result < 0) {
    perror("pipe");
    exit(-1);
  }

  result = fork();
  if(result < 0) {
    exit(-1);
  }

  if (result == 0) {
    dup2(pipefd[1], STDOUT_FILENO); /* Duplicate writing end to stdout */
    close(pipefd[0]);
    close(pipefd[1]);

    execl("/usr/bin/who", "who", NULL);
    _exit(1);
  }

  /* Parent process */
  close(pipefd[1]); /* Close writing end of pipe */

  cmd_output = fdopen(pipefd[0], "r");

  while(1) {
    if (feof(cmd_output)) {
      break;
    }
    if (fgets(buf, sizeof buf, cmd_output)) {
      printf("Data from who command: %s", buf);
    } else {
//      printf("No data received.\n");
    }
  }

  wait(&status);
//  printf("Child exit status = %d\n", status);

  return 0;
}

int main()
{
  cmd_quem(); 
}
```

```txt:結果
% ./a.out        
Data from who command: wrf      tty1         2016-10-21 01:26 (:0)
Data from who command: wrf      pts/0        2016-10-21 01:29 (:0.0)
Data from who command: wrf      pts/1        2016-10-21 01:32 (:0.0)
```

```txt:whoの結果
% who
wrf      tty1         2016-10-21 01:26 (:0)
wrf      pts/0        2016-10-21 01:29 (:0.0)
wrf      pts/1        2016-10-21 01:32 (:0.0)
```

コードが非常に長くなってしまうのが難点である。

## popen()を使う改良版
(追記 2016/10/21)

@hurou927 さんにpopen()を使う方法を教えていただいた。

こちらの方がずっとシンプルで見やすい。
VBAで正規表現の関数

存在するか

    Public Function existRegexp(target, matchPattern, Optional ignoreCase = True) As Boolean 'ignoreCaseは大文字小文字区別するかどうか

        Set regexp = CreateObject("VBScript.RegExp")
    
    
        With regexp
            .Pattern = matchPattern
            .ignoreCase = ignoreCase
            .Global = False
        End With
        
        existRegexp = regexp.test(target)
    End Function

正規表現のマッチング取得

    Public Function getRegexp(target, matchPattern, Optional ignoreCase = True, Optional global_ = True) 'ignoreCaseは大文字小文字区別するかどうか global_は複数回マッチングするかどうか

        Set regexp = CreateObject("VBScript.RegExp")

        With regexp
            .Pattern = matchPattern
            .ignoreCase = ignoreCase
            .Global = global_
        End With

        Set getRegexp = regexp.Execute(target)
    End Function
Swift3で正規表現を楽に扱う


## はじめに
Swiftでは正規表現がかなり扱いにくいです。

その扱いにくさを克服するコードをいろいろな人が書いていますが、個人的にはどれもしっくりこなかったので、自分でも作りました。

gistで公開しています。
[Regex.swift](https://gist.github.com/ha1f/1af5d885042183b76e3a96443f827203)


## 使い方

ファイルごとプロジェクトに追加するだけで使えます。


```swift
let regex = try! Regex("([0-9]+?)月([0-9]+?)日")

// 最初のマッチ
let target = "10月3日12月25日1月1日"
if let match = regex.firstMatch(target) {
    print(match.wholeString) // マッチしたすべての範囲
    print(match.groups) // ()で囲まれた中身
} else {
    // どこにもマッチしないときにはnil
}



// すべてのマッチ
for match in regex.matches(target) {
    print(match.wholeString, match.groups)
}

// 置換
print(target.replace(regex, template: "xx月xx日"))
```

> 10月3日
["10", "3"]
10月3日 ["10", "3"]
12月25日 ["12", "25"]
1月1日 ["1", "1"]
xx月xx日xx月xx日xx月xx日

## Matchオブジェクト

```swift
struct Match {
    var wholeString: String
    var groups: [String]
}

```

自作で申し訳ないですが、探索に対して、上のようなMatch構造体が返却されます。

`wholeString` はマッチした範囲の文字列全体が、 `groups` には、正規表現の中の `()` で囲われた部分が順に格納されます。

pythonのreモジュールでの、groups(0)がwholeString、groups(1)以降がgroupsに当たります。

## 実装
短いので、コードを読んでいただけると！

## オプション
引数でrange(探索範囲)やoptionを指定することもできます（デフォルト値を空に設定しているだけです）
Pythonで数独

# Pythonで数独
数独は、[組合せ最適化](http://qiita.com/SaitoTsutomu/items/bfbf4c185ed7004b5721)で簡単に解ける。
まずは、実行の様子。(事前に、「pip install -U ortoolpy」が必要)

```py3:python
from ortoolpy import sudoku
data = """\
4 . . |. . . |1 . . 
. 5 . |. 3 . |. . 8 
2 . . |7 . 8 |. 9 . 
------+------+------
. 4 5 |6 . . |8 . 1 
. . 3 |. 5 . |. . . 
. 2 . |1 . 3 |. . . 
------+------+------
8 . . |. . 5 |. . . 
. . 4 |. . . |. . . 
. 1 . |. 6 4 |3 . 9 
"""
sudoku(data)[0]
>>>
[[4, 7, 8, 5, 9, 6, 1, 2, 3],
 [6, 5, 9, 2, 3, 1, 7, 4, 8],
 [2, 3, 1, 7, 4, 8, 6, 9, 5],
 [9, 4, 5, 6, 7, 2, 8, 3, 1],
 [1, 8, 3, 4, 5, 9, 2, 6, 7],
 [7, 2, 6, 1, 8, 3, 9, 5, 4],
 [8, 9, 7, 3, 2, 5, 4, 1, 6],
 [3, 6, 4, 9, 1, 7, 5, 8, 2],
 [5, 1, 2, 8, 6, 4, 3, 7, 9]]
```

メソッド sudoku は、81個の「数字またはドット(.)」を入力とし、「解とユニークかどうか」を返す。上記の問題が、ユニークかどうか見てみよう。

```py3:python
sudoku(data, checkOnlyOne=True)[1]
>>>
True
```

Trueなので、ユニーク(解が1つしかない)ということがわかる。
sudokuの中身を見てみよう。

```py3:ipython
sudoku??
```

```py3:出力
def sudoku(s, checkOnlyOne=False):
    """
    sudoku(
    '4 . . |. . . |1 . . '
    '. 5 . |. 3 . |. . 8 '
    '2 . . |7 . 8 |. 9 . '
    '------+------+------'
    '. 4 5 |6 . . |8 . 1 '
    '. . 3 |. 5 . |. . . '
    '. 2 . |1 . 3 |. . . '
    '------+------+------'
    '8 . . |. . 5 |. . . '
    '. . 4 |. . . |. . . '
    '. 1 . |. 6 4 |3 . 9 ')[0]
    """
    import re, pandas as pd
    from itertools import product
    from pulp import LpProblem, lpSum, value
    data = re.sub(r'[^\d.]','',s)
    assert(len(data) == 81)
    r = range(9)
    a = pd.DataFrame([(i,j,(i//3)*3+j//3,k+1,c==str(k+1))
        for (i,j),c in zip(product(r,r),data) for k in r],
        columns=['行','列','_3x3','数','固'])
    a['Var'] = addbinvars(len(a))
    m = LpProblem()
    for cl in [('行','列'),('行','数'),('列','数'),('_3x3','数')]:
        for _,v in a.groupby(cl):
            m += lpSum(v.Var) == 1
    for _,r in a[a.固==True].iterrows():
        m += r.Var == 1
    m.solve()
    if m.status != 1:
        return None, None
    a['Val'] = a.Var.apply(value)
    res = a[a.Val>0.5].数.values.reshape(9,9).tolist()
    if checkOnlyOne:
        fr = a[(a.Val>0.5)&(a.固!=True)].Var
        m += lpSum(fr) <= len(fr)-1
        return res, m.solve()!=1
    return res, None
```

10行ほど定式化して solve を呼ぶだけで解ける。計算時間は、一瞬である。
ユニークかどうかも、最初の解を禁止して解きなおし、もう1つの解がなければユニークである。

## 参考

- [数独を通して組合せ最適化を学ぼう](https://qiita.com/SaitoTsutomu/items/bd09190d8a02432b3f16)
- [組合せ最適化を使おう](https://qiita.com/SaitoTsutomu/items/bfbf4c185ed7004b5721)
- [数理最適化によるパズルの解法](https://qiita.com/SaitoTsutomu/items/0c0db8d22979fc9de8f4)
- [最適化におけるPython](https://qiita.com/SaitoTsutomu/items/070ca9cb37c6b2b492f0)
- [パズルでみる組合せ最適化のテクニック](https://qiita.com/SaitoTsutomu/items/f05f4ff05d4ce6099ff3)

以上
マイDocker ✍

# dockerの✍
.gitconfigみたいに⌘のalias作れなさそうだったので、
代わりにここにメモ

# Lifecycle
![image](https://qiita-image-store.s3.amazonaws.com/0/94686/1933cff4-216d-f218-1be3-8adc312ed1e7.png)

# Docker
```console
$ docker version
$ docker info
$ docker login
```

# Dockerfile -> Image
```console
$ docker build --no-cache
$ docker build -t REPOSITORY[:tag] .
```

# Image <-> Registry
```console
$ docker push REPOSITORY[:tag]
$ docker pull REPOSITORY[:tag]
$ docker search KEYWORDS
```

# Images

```console
$ docker images -a
$ docker rmi IMAGE
$ docker history IMAGE 
$ docker inspect IMAGE
```

# Images -> Containers
```:sh
$ docker run  [OPTIONS] REPOSITORY[:TAG] CMD # run=create+start
$ docker run -i -t -d -p 80:80 REPOSITORY[:TAG] CMD
```

# Containers

```console
$ docker ps -a

$ docker create IMAGE
$ docker start CONTAINER
$ docker stop CONTAINER
$ docker kill CONTAINER
$ docker rm [CONTAINER...]

$ docker diff CONTAINER
$ docker top CONTAINER
$ docker events CONTAINER
$ docker logs CONTAINER
```

# Host -> Containers
```console
$ docker attach CONTAINER
$ docker exec CONTAINER CMD
$ docker exec -it CONTAINER CMD
$ export TERM=xterm
```


# Backup Image(Host File<->Image)
```console
$ docker save IMAGE > FILE
$ docker load < FILE
```


# Backup Container(Host File<->Container)
```console
$ docker commit -m "msg" CONTAINER REPOSITORY[:TAG]
$ docker tag IMAGE REPOSITORY[:tag]
$ docker export CONTAINER > FILE
$ docker import FILE
```

# Backup Container File(Host File<->Container File)
```console
$ docker cp CONTAINER:FILE ./
```

# docker-machine
```console
$ docker-machine create --driver virtualbox default
$ docker-machine env default 
$ docker-machine regenerate-certs default # 認証書の再作成
$ docker-machine rm default
$ docker-machine start default
$ docker-machine ls
$ docker-machine ssh
$ docker-machine ip
$ eval $(docker-machine env default) # docker-machineとdockerの連携
```

# Data Volume
```console
$ docker volume create --name HOGE
$ docker volume ls
$ docker run -v /<containerVolumepath> # containerに新しいvolumeを作成
$ docker run -v /<hostDirectorypath>:/<containerVolumepath> # hostのdirectoryをcontainerのvolumesにマウント$ docker run -v /<hostDirectorypath>:/<containerVolumepath>:ro # リードオンリーでマウント
$ docker inspect CONTAINER # Mounts項目で確認
```

# Data Volume Container
```console
$ docker run --volumes-from CONTAINER REPOSITORY[:TAG] CMD # 他のcontainerにCONTAINERをマウント
```

# References
http://qiita.com/curseoff/items/a9e64ad01d673abb6866
https://github.com/tcnksm/docker-alias
https://docs.docker.com/engine/installation/linux/ubuntulinux/
https://docs.docker.com/engine/reference/commandline/
https://docs.docker.com/engine/tutorials/dockervolumes/
http://qiita.com/sokutou-metsu/items/b83b275198fc9594f5a4
http://docs.docker.jp/engine/userguide/dockervolumes.html
【PHP】fscanfを繰り返し実行するときの謎動作

## [前回](http://qiita.com/kachodairi/items/d897064db43ac5a524bc)のおさらい

### PHPのfscanfの戻り値

1. パラメータが２つだけ
`fscanf(STDIN,"%d %d");`
戻り値は**配列**

2. パラメータにオプション指定有り
`fscanf(STDIN,"%d %d",$a,$b);`
戻り値は**代入された値の数**

パターンマッチしないケースも含めて表にまとめるとこうなる

|入力|パターン|正常性|オプ無|オプ有|
|----|----|:----:|----|----|
|HKT 48|`"%d %d"`|:x:|`array(null,null)`|`0`|
|48 HKT|`"%d %d"`|:x:|`array(48,null)`|`1`|
|HKT HKT|`"%d %d"`|:x:|`array(null,null)`|`0`|
|48 48|`"%d %d"`|:o:|`array(48,48)`|`2`|
|(空行)|`"%d %d"`|:x:|`null`|`-1`|

## パラメータにオプションを指定したときの謎動作

たとえば、標準入力を以下の通りとする。

```
HKT 48
48 HKT
HKT HKT
48 48

```

これを[list()](http://php.net/list)を使って、`$a`,`$b`に値を格納して、`$a`と`$b`の状態を確認する。

``` php
<?php
list($a,$b)=fscanf(STDIN,"%d %d");
echo "a=",$a,",b=",$b,PHP_EOL;
list($a,$b)=fscanf(STDIN,"%d %d");
echo "a=",$a,",b=",$b,PHP_EOL;
list($a,$b)=fscanf(STDIN,"%d %d");
echo "a=",$a,",b=",$b,PHP_EOL;
list($a,$b)=fscanf(STDIN,"%d %d");
echo "a=",$a,",b=",$b,PHP_EOL;
list($a,$b)=fscanf(STDIN,"%d %d");
echo "a=",$a,",b=",$b,PHP_EOL;
```

```
a=,b=
a=48,b=
a=,b=
a=48,b=48
a=,b=
```

fscanfの戻り値を踏まえると、期待通りの動作といえる。

さて、いよいよ謎動作。**fscanfのオプションを活用して、`$a`、`$b`の状態を確認すると実に気持ち悪い**。

```php
<?php
fscanf(STDIN,"%d %d",$a,$b);
echo "a=",$a,",b=",$b,PHP_EOL;
fscanf(STDIN,"%d %d",$a,$b);
echo "a=",$a,",b=",$b,PHP_EOL;
fscanf(STDIN,"%d %d",$a,$b);
echo "a=",$a,",b=",$b,PHP_EOL;
fscanf(STDIN,"%d %d",$a,$b);
echo "a=",$a,",b=",$b,PHP_EOL;
fscanf(STDIN,"%d %d",$a,$b);
echo "a=",$a,",b=",$b,PHP_EOL;
```

```
a=,b=
a=48,b=
a=48,b=     ← a=,b=  じゃないの？
a=48,b=48
a=48,b=48   ← a=,b=  じゃないの？
```

上書きしないで値を使いまわしてる！

## これによって困ること

```php
while(!feof(STDIN)){
    fscanf(STDIN,"%d %d",$a,$b);
    if($a>0 and $b>0){
        echo "Yes",PHP_EOL;
    }else {
        echo "No",PHP_EOL;
    }
}
```

```
No
No
No
Yes
Yes <= Noだろが!!
```

## 回避方法

### 1. 初期化してあげる

```php
<?php
while(!feof(STDIN)){
    fscanf(STDIN,"%d %d",$a,$b);
    if($a>0 and $b>0){
        echo "Yes",PHP_EOL;
    }else {
        echo "No",PHP_EOL;
    }
    $a=$b=null;
}
```

### 2. リストを使う

```php
<?php
while(!feof(STDIN)){
    list($a,$b)=fscanf(STDIN,"%d %d");
    if($a>0 and $b>0){
        echo "Yes",PHP_EOL;
    }else {
        echo "No",PHP_EOL;
    }
}
```

### 3. 空行なら処理終了

```php
<?php
while(list($a,$b)=fscanf(STDIN,"%d %d")){
    if($a>0 and $b>0){
        echo "Yes",PHP_EOL;
    }else {
        echo "No",PHP_EOL;
    }
}
```

or

```php
<?php
while(fscanf(STDIN,"%d %d",$a,$b)>-1){
    if($a>0 and $b>0){
        echo "Yes",PHP_EOL;
    }else {
        echo "No",PHP_EOL;
    }
}
```

and so on...
IBM,Google,Microsoft も使っている、jupyter notebook とは

### 対象読者

* 大きなCSV（エクセルで扱えない　１００万行以上）をすぐに扱いたい
* jupyter([発音は、ジュパイターか、ジュピター](http://pythondatascience.plavox.info/python%E3%81%AE%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83/jupyter-notebook%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86/)）notebook　の言葉を知らなかった
* データ分析のプログラムを簡単に共有したい
* [Kaggle](http://www.kaggle.com)の分析(kernel)を手元でも自由に試したい
* 有名どころが使っているツールで、インストールが簡単で、すぐに役立つものをつかってみたい。

### 対象読者の想定スキル

* エクセルで、簡単なVBAをつかったことがある。（マクロの記録を改造程度）
* とりあえず、英語のページは読める

### 記事の趣旨

自分で使ってみて便利だったので、多くの人に使ってもらいたい。

### jupyter notebook とは、

**一言でいうと、コードも動くドキュメント（ノート）です。**

実際にどんなものか見てもらうのがいいでしょう。
kaggle にアップしてある。[貿易統計（税関別）](https://www.kaggle.com/zanjibar/d/zanjibar/japan-trade-statistics/custom-sample/)
を見てください。

ただ、プログラムを解説してあるだけのようにも見えますが、実際に動きます。
ポイントは、分割してプログラムを作動させることができるところです。
特にデータを扱っている場合には、ちょっと動かしてみて、何かするというのが多いので、便利です。

**jupyter notebook は、kaggle の標準仕様**
[kaggle](http://www.kaggle.com) は、データサイエンティストが腕試しをする場でもありますが、このように、誰でもデータをプログラム付きで公開できる場でもあります。jupyter notebook は、kaggle の公開用プログラムの標準仕様です。多くの人が、jupyter notebook でプログラムを公開しています。

**kaggleで、dataと一緒に、簡単に公開可能**
kaggle をつかうと、データ公開ができます。５００メガまでのファイル公開でき、また、結構使いがってがいいです。データサイエンティスト用の無料のサービスは、他にもあります。IBM,Microsoft のが有名です。

* [IBM](https://datascientistworkbench.com/)
* [Microsoft](https://studio.azureml.net/)

ファイル公開は、この２つでもできるようですが、簡単ではないです。もちろん、jupyter notebook を標準で使えます。但し、残念ながら、作成した、notebook をまったく改変せずに手元で動かすことは難しいです。

それに、データ公開することを、[kaggle 自体もすすめています。](http://blog.kaggle.com/2016/08/17/making-kaggle-the-home-of-open-data/)
政府機関のデータ公開の例もあります。[2013 American Community Survey](https://www.kaggle.com/census/2013-american-community-survey)


**jupyter notebook は大手も使っている**

[jupyter公式サイト](http://www.jupyter.org)
を見ればわかりますが、使用ユーザの名前の中に、IBM,Microsoft,Google　があります。この記事を書いている時点では、日本の会社はこの中にはありません。


**windows でも簡単に使える**

Anaconda というパッケージをいれると、windows でも簡単に動きます。
Mac,Ubuntu でももちろん動きます。インストール方法は、jupyter anaconda インストールなどと検索すれば、いくつも見つかります。

kaggle のデータと、スクリプトを変更なしに使いたい場合は、ディレクトリをあわせます。
こんな感じです。

```
適当 --|--input  ここに kaggle から落としてきたデータをおきます。
      |--note (ここに notebook をおきます）
```
ちょっと面倒なのは、
kaggle のデータと、notebook の入手です。kaggle に、アカウントを登録する必要があります。
覚えておきたいviコマンド

　ここでは，基本的なviコマンドについてまとめています．本当に基本的なものだけです(もちろん基本的なコマンドだけではありません)．扱うのは次のコマンドです．シェルの実行とかコマンド出力の書き出しとかは扱っていません．

* モード変更
* 移動コマンド
* 検索・置換コマンド
* 編集コマンド
* 挿入コマンド
* ファイル操作コマンド

# モード変更

|コマンド|意味|使い方|例
|:---:|:---|:---|:---|
|Esc|コマンドモード|-|-|

# 移動コマンド
## 移動(十字)

|コマンド|意味|使い方|例
|:---:|:---|:---|:---|
|h|←(1文字戻る)|数字を添えてn文字戻る|5h|
|j|↓(1行進む)|数字を添えてn行進む|5j|
|k|↑(1行戻る)|数字を添えてn行戻る|5k|
|l|→(1文字進む)|数字を添えてn文字進む|5l|

## 移動(単語)

|コマンド|意味|使い方|例
|:---:|:---|:---|:---|
|w|1単語分進む|数字を添えてn語進む|5w|
|e|単語の終わりまで進む|単語の終わりからは次の語の語頭まで移動|-|
|b|1単語分戻る|数字を添えてn語戻る|5b|

## 移動(ジャンプ)

|コマンド|意味|使い方|例
|:---:|:---|:---|:---|
|0, ^|行頭へジャンプ|0は行頭空白の前，^は後|-|
|$|行末へジャンプ|数字を添えるとn-1行下の行末へ|6$|
|gg|ファイル先頭へ移動|-|-|
|G|ファイル最終行の行頭へ移動|数字を添えてn行目の行頭へ移動|5G|

## 移動(画面内)

|コマンド|意味|使い方|例
|:---:|:---|:---|:---|
|H|画面上部|数字を添えて上からn行目|5H|
|M|画面中央|-|-|
|L|画面下部|数字を添えて下からn行目|5L|

## 移動(ページ)

|コマンド|意味|使い方|例
|:---:|:---|:---|:---|
|Ctrl+f|次のページ|Ctrl+dで半ページ進む|-|
|Ctrl+b|前のページ|Ctrl+uで半ページ戻る|-|

# 検索・置換コマンド
## 検索

|コマンド|意味|使い方|例
|:---:|:---|:---|:---|
|/|前方検索|パターンに正規表現を用いる|`/H.llo*` |
|?|後方検索|パターンに正規表現を用いる|`*[1-9]day*`|
|n|次の検索結果|数字添え可能|-|
|N|前の検索結果|数字添え可能|-|

## 置換

|コマンド|意味|使い方|例
|:---:|:---|:---|:---|
|s/`word1`/`word2`/|word1をword2で置換|区切り文字に;を使うことも可能|s;hello/world/;good/night;|
|:%s/`word1`/`word2`/gc|置換|確認しながらファイル内すべてで置換|-|

# 編集コマンド
## 削除

|コマンド|意味|使い方|例
|:---:|:---|:---|:---|
|x|1文字削除|数字を添えてn文字削除|5x|
|d[コマンド]|削除コマンド|w(単語)，$(行末まで)，^(行頭まで)，d(1行丸ごと)|dd|
|D|カーソルから行末までを削除|d$と同じ|-|

## コピー&ペースト

|コマンド|意味|使い方|例
|:---:|:---|:---|:---|
|yy|行のコピー|数字を添えてn行コピー|5yy|
|p|カーソルの下に行を貼り付け|数字を添えてn回ペースト|5p|
|P|カーソルの上に行を貼り付け|数字を添えてn回ペースト|5P|

## 元に戻す

|コマンド|意味|使い方|例
|:---:|:---|:---|:---|
|u|元に戻す|数字を添えてn回元に戻す|-|

# 挿入コマンド
　挿入コマンドはすべて挿入モードに切り替わります．

## 挿入

|コマンド|意味|使い方|例
|:---:|:---|:---|:---|
|i|直前に挿入|Iで行頭に挿入|-|
|a|直後に挿入|Aで行末に挿入|-|
|o|下の行に挿入|Oで上の行に挿入|-|

## 文字列置換

|コマンド|意味|使い方|例
|:---:|:---|:---|:---|
|s|1文字消して文字列に置換|数字を添えてn文字置換|-|
|c[コマンド]|置換コマンド|カーソル位置からw(単語の終わり)，c(行末),f `文字`(指定した文字)まで置換|cc|
|C|行末まで置換|ccと同じ|-|

## 上書き

|コマンド|意味|使い方|例
|:---:|:---|:---|:---|
|r|カーソル上の1文字を上書き|-|-|
|R|以降の入力をすべて上書き|Escを押すまで|-|

# ファイル操作
## ファイルを開く

|コマンド|意味|使い方|例
|:---:|:---|:---|:---|
|:e FILENAME|ファイルを開く|存在しなければ新規作成|-|
|:args|編集ファイル一覧|引数を指定すると編集ファイル変更となる|:args a.txt b.txt|
|:next，:n|次のファイルを開く|:wnで保存して移動，:n!で保存しないで移動|-|
|:prev|前のファイルを開く|:wpで保存して移動，:prev!で保存しないで移動|-|

## ファイルの情報を見る

|コマンド|意味|使い方|例|
|:---:|:---|:---|:---|
|Ctrl+Shift+g|情報表示|ファイル名，行数，編集中のファイルのインデックスなどが表示される|-|

## ファイルを保存

|コマンド|意味|使い方|例|
|:---:|:---|:---|:---|
|:w|上書き保存|qをつけて終了，!をつけると強制保存|:wq, :w!|
|:w FILENAME|名前を付けて保存|qをつけて終了，!を付けると強制上書き保存|:wq/:w! FILENAME|
|:w >> FILENAME|ファイルの末尾に追加して保存|-|-|
|:`line1`,`line2` FILENAME|名前を付けて保存|line1行目からline2行目を保存|-|

## viを終了

|コマンド|意味|使い方|例|
|:---:|:---|:---|:---|
|:q|終了|!を付けると強制終了|:q!|

---- 以上

# こちらもよろしくお願いいたします．
### [エンリュの迷い森｜トップページ][blogtop]

[blogtop]: http://lost-in-forest.hatenablog.com/entry/toppage
zsh / c > print -lで取得したコマンドを表示 > print -l ${(ok)functions} ${(ok)commands} / argc, argv[]の使用

```txt:動作環境
CentOS 6.5
zsh 4.3.11 (x86_64-redhat-linux-gnu)
gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-17)
```

[関連記事](http://qiita.com/mpyw/items/a4495d476ea9ffe54e16#%E8%BF%BD%E8%A8%982-git%E3%81%AB%E6%8E%A1%E7%94%A8%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8Bc%E8%A8%80%E8%AA%9E%E3%81%A7%E3%81%AE%E5%AE%9F%E8%A3%85%E4%BE%8B)

```readargc.c
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
	int idx;

	for(idx=0; idx < argc; idx++) {
		if (idx==0) {
			continue; // skip command itself
		}
		printf("%s\n", argv[idx]);
	}
}
```

## 使い方

### コンパイル

```
$gcc readarg.c -o readarg
```

### 実行

```
$ ./readarg $(print -l ${(ok)functions} ${(ok)commands} )
module
[
a2p
ab
abrt-action-analyze-backtrace
abrt-action-analyze-c
abrt-action-analyze-ccpp-local
abrt-action-analyze-core
中略
yumdb
yum-debug-dump
yum-debug-restore
yumdownloader
yum-groups-manager
zcat
zcmp
zdiff
zdump
zegrep
zenity
zfgrep
zforce
zgrep
zic
zip
zipcloak
zipgrep
zipinfo
zipnote
zipsplit
zless
zmore
znew
zsh
zsoelim
```
[一番簡単かも]cron起動プロセスの多重起動防止ワンライナー


よくこんな感じで1分おきにジョブを流したい場合があると思う。

```crontab
* * * * * /path/to/your/cron_job.sh
```

ところがこのcron_job.shが1分以内に処理が終わらない場合、1分後には同じスクリプトが2重で起動されてしまうので、その防止方法について考える。

こういう場合ジョブの実行開始時にロックファイルを作成して、ロックファイルがあったら後追いのcronでは実行しちゃだめよーという方法がポピュラーらしいが、なんか面倒に感じる。

## 一番簡単かも？な多重起動防止機構付きのcrontabワンライナー

ということで、簡単な方法を求めていたら、pidofコマンドを使ってジョブの実行状況を確認する方法だとワンライナー的に書けて一番便利そう。これでええやん。

```crontab
* * * * * /usr/sbin/pidof -x cron_job.sh >/dev/null || /path/to/your/cron_job.sh
```


上記のワンライナーの細かい説明と、一応実際に動作するか試してみましたので、詳細見たい方はこちらも併せてご覧ください。

[cron多重起動防止の詳細解説＆テスト結果](http://www.meguroman.com/cron_multiple_run_protection/)