OmniAICreator/Qiita-1.07M huggingface dataset:
OCaml超入門 ― 導入と文法

# OCaml超入門
某大学課題でOCamlを使うことになったので導入から簡単な文法まで

## OCamlとは
強い静的型付け言語です。Oが大文字ぐらいには知識がありますよね？

## 導入
Ubuntu環境ではOCamlと入力したらいけそう。OSXだと[こちら](http://qiita.com/oshuya/items/dd0faa707c5baf54249d)の記事を参照。

```
$ brew install rlwrap
$ echo 'alias ocaml="rlwrap ocaml"' >> ~/.bashrc
```
こうすると`ctrl + l`でコンソールをクリアできたりして便利に使えるようになる。

## 文法
すでにプログラミング言語を1つ以上知っている方を想定します。おそらくそのプログラミング言語と（大きく）異なる点は

#### イコールの処理
OCamlではイコールひとつで真偽値判定をします。たとえば`if n = 0 then A else B`という形をしています。

#### 整数と浮動小数点数についての演算子の違い
浮動小数点数同士の演算では`+`や`/`の代わりに`+.`や`/.`を使います。ただしイコールはどちらも`=`です。

#### 否定
OCamlでは否定は`not A`で表します。

#### 関数の宣言
無名関数の宣言は

```
fun x -> x * x;;
```
のようにすればよいです。これを`f`という名前の関数にしたいのであれば

```
let f = fun x -> x * x;;
```
とすればよいですね。実際`f 10`は`100`を返します。

名前をつけたいのであれば最初から

```
let f x = x * x;;
```
とするのが簡単ですね。この内部構造が上記のように展開されていると考えたらよさげです。

関数型言語（というかラムダ計算）の特性ですが，関数も値と考えるのですべて定義は`let`を用います。`let`で宣言された変数には再代入ができません。

#### 部分適用
Schemeなどと違ってOCamlでは関数の部分適用が可能です。
たとえば

```
let f x y = x + y;;
```
としましょう。これは

```
let f = fun x y -> x + y;;
```
と等価であり，さらに

```
let f = fun x -> fun y -> x + y;;
```
と等価です。

ここで

```
let g = f 100;;
```
としますと，`g`は引数を1つもち，その引数に100を加えた数を返す関数となります。
もともとの`f`の第一引数に100が入ったと考えてください。

#### リスト
関連するものとしてタプルがあります。タプルに関しては省略するので各自お調べください。
リストでは同じ型をもつ複数の要素をまとめます。連結リストです。

```
let list = [1; 2; 3];;
```
のように各要素を`;`で区切って宣言されます。先頭に付け加えたいときは

```
0 :: list;;
```
としてあげればよく，2つのリストを連結させたいときは

```
list @ [4; 5];;
```
としてあげます。

#### パターンマッチ
すごく面白いのですが書くと長くなるので[ここ](http://www.geocities.jp/m_hiroi/func/ocaml04.html)をご参照ください。


## 再帰関数の書き方
ひとつ具体例をあげましょう。
0からnまでの整数の和を返す関数`sum_to n`は次のように書かれます。

```sum_to.ml
let rec sum_to n = if n = 0 then 0 else n + sum_to (n-1);;
```

注意すべきは以下の点でしょう。

* 再帰関数の定義は`let rec`とする。
* `;;`でステートメントが評価される。
* 基本的に引数に括弧は不要。`sum_to n-1`は`(sum_to n)-1`を指すので注意。

 
# 続き
[OCaml超入門 ― 便利な関数たち](http://qiita.com/xuzijian629/items/390c28fd8aac806d2d1d)
javascriptのカリー化？

#経緯
Promiseのcallbackの中で１行で書きたくなった。
理由はcallbackの中の処理がダラダラと続くことが
多くを外に出すことで見やすくなるかなと
思ったため。

####ソシャゲでアイテムをあげたりする処理を書く時
```javascript
let array = [1, 2, 3];
let msg = 'プレゼント';
return Promise.forEach(array, function(itemId){
    let item = findItem(itemId); // itemを探す
    return giveItem(item, msg); // itemをあげる
});
```


#### カリー化？するといけそう
```javascript
let array = [1, 2, 3];
let msg = 'プレゼント';

// itemIdを引数に取る関数を返すメソッド
let giveItemFunc = function(msg){
    return function(itemId){
        let item = findItem(itemId); // itemを探す
        return giveItem(item, msg); // itemをあげる
    }
}
return Promise.forEach(array, giveItemFunc(msg));
```

こうすると１行でかけました。
単なる自己満に近いですね。。。
他にこういうのあるとかあればお待ちしております！
素人の言語処理100本ノック:91


[言語処理100本ノック 2015](http://www.cl.ecei.tohoku.ac.jp/nlp100/)の挑戦記録です。環境はUbuntu 16.04 LTS ＋ Python 3.5.2 \:\: Anaconda 4.1.1 (64-bit)です。過去のノックの一覧は[こちら](http://qiita.com/segavvy/items/fb50ba8097d59475f760)からどうぞ。

## 第10章: ベクトル空間法 (II)
>第10章では，前章に引き続き単語ベクトルの学習に取り組む．

### 91. アナロジーデータの準備
>[単語アナロジーの評価データ](https://github.com/svn2github/word2vec/blob/master/questions-words.txt)をダウンロードせよ．このデータ中で": "で始まる行はセクション名を表す．例えば，": capital-common-countries"という行は，"capital-common-countries"というセクションの開始を表している．ダウンロードした評価データの中で，"family"というセクションに含まれる評価事例を抜き出してファイルに保存せよ．

#### 出来上がったコード：

```python:main.py
# coding: utf-8
fname_input = 'questions-words.txt'
fname_output = 'family.txt'

with open(fname_input, 'rt') as data_file, \
		open(fname_output, 'wt') as out_file:

	target = False		# 対象のデータ？
	for line in data_file:

		if target is True:

			# 対象データの場合は別のセクションになるまで出力
			if line.startswith(': '):
				break
			print(line.strip(), file=out_file)

		elif line.startswith(': family'):

			# 対象データ発見
			target = True
```

#### 実行結果：

結果は「family.txt」に保存します。以下、先頭部分です。

```console:family.txtの先頭部分
boy girl brother sister
boy girl brothers sisters
boy girl dad mom
boy girl father mother
boy girl grandfather grandmother
boy girl grandpa grandma
boy girl grandson granddaughter
boy girl groom bride
boy girl he she
boy girl his her
boy girl husband wife
boy girl king queen
boy girl man woman
boy girl nephew niece
boy girl policeman policewoman
boy girl prince princess
boy girl son daughter
boy girl sons daughters
boy girl stepbrother stepsister
boy girl stepfather stepmother
boy girl stepson stepdaughter
boy girl uncle aunt
brother sister brothers sisters
brother sister dad mom
brother sister father mother
brother sister grandfather grandmother
brother sister grandpa grandma
brother sister grandson granddaughter
brother sister groom bride
brother sister he she
（以下略）
```

### 単語アナロジーの評価データ

問題文で指定されている「単語アナロジーの評価データ」はword2vecに含まれている「questions-words.txt」というファイルのようですが、[問題文](http://www.cl.ecei.tohoku.ac.jp/nlp100/#sec91)ではリンクが切れてしまっています。

word2vecが公開された当時はGoogle Codeというオープンソースプロジェクトのホスティングサービスが使われていたのですが、このサービスは2016年1月に終了してしまい、現在はGitHubの[svn2github/word2vec](https://github.com/svn2github/word2vec)に移っているようです。「questions-words.txt」も[この中](https://github.com/svn2github/word2vec/blob/master/questions-words.txt)から入手できます。

今回の問題は、このファイルの中から「family」のセクションを抽出すればOKです。

　
92本目のノックは以上です。誤りなどありましたら、ご指摘いただけますと幸いです。
<hr>

*実行結果には、[100本ノックで用いるコーパス・データ](http://www.cl.ecei.tohoku.ac.jp/nlp100/#data)で配布されているデータの一部が含まれます。この第10章で用いているコーパス・データのライセンスは[クリエイティブ・コモンズ 表示-継承 3.0 非移植](https://creativecommons.org/licenses/by-sa/3.0/legalcode)（[日本語訳](https://creativecommons.org/licenses/by-sa/3.0/deed.ja)）です。また、単語アナロジーの評価データは[Apache License 2.0](http://www.apache.org/licenses/LICENSE-2.0)で配布されているword2vecの一部です。*
SourceTreeからBitbucketにログインできなくなった（ユーザ名でのログイン禁止になった)


#経緯
こんなブログを書きました。
[SourceTreeからBitbucketにログインできなくなった（ユーザ名でのログイン禁止になった)](http://letsmakebt.blogspot.jp/2017/04/bitbucket.html)

概要だけQiitaに書いときます。

#原因
Bitbucketがユーザ名でログインできなくなった。
#対策
メールアドレスでログインする。

#設定方法
- SorceTreeのメニュー＞ツール＞オプション＞認証＞保存されたパスワード
からbitbucketを削除。

- メニュー＞リポジトリ＞リポジトリ設定＞選択して編集
URL/パスのusername@を削除。
一番下のユーザ名のテキストボックスをメールアドレスに変更。

- フェッチで動作確認。
- Authenticateが出るので、Usernameにメールアドレス入れて、Password入れてLoginをポチ。
Automatically manage signingを使ってもApp IDが追加されない


`Automatically manage signing`にチェックを入れた状態で、`Budle Identifier`を入力してEnterを押しても、Apple Developerサイトで確認してみると`App IDs`にも`Provisioning Profiles`にも該当の`Bundle Identifier`のものが生成されていませんでした。

![HelloDoctor_xcodeproj.png](https://qiita-image-store.s3.amazonaws.com/0/5969/4a910608-28a3-4d16-ea72-d1b21db589a7.png "HelloDoctor_xcodeproj.png")

他のプロジェクトで`Automatically manage signing`を使っていた時には`Bundle Identifier`の値を更新するだけで新しい`App ID`と`Provisioning Profile`が生成されたことを確認できました。

ちなみにこの状態で`Archive`し、ワイルドカード型のProvisioning Profileで`Save for Ad Hoc Deployment`でExportすることはでき、DeployGateで配信することはできました。
![Screenshot_4_11_17__4_57_PM.png](https://qiita-image-store.s3.amazonaws.com/0/5969/61d8a4ae-0814-fe3c-5786-7f3353da241e.png "Screenshot_4_11_17__4_57_PM.png")

しかしこのままではストアにアップロードすることはできません。

ドキュメントを調べても特に記述がなかったのですが、前のプロジェクトとの違いを確認していたら以下のことをすれば`App ID`が`Provisioning Profile`生成されることが確認できました。

1. Xcodeのプロジェクトエディター画面で`Capabilities`ペインを選択
2. `Push Notifications`等なにかしらの項目をONにする
3. プロビジョニングの生成処理が動く
4. 以下の項目が生成されている
	1. Apple Developerサイト -> App ID: `XC`の後にBundle Identifierが続くもの
	2. Xcode -> Accounts -> 該当IDを選択して`View Details...` -> `iOS Team Provisioning Profile`の後にBundle Identifierが続くもの

他に方法があるかもしれませんが、これでひとまずXcode経由で生成することができました。
Etherpad-liteのAPIをPythonで叩く

#はじめに
　会議の議事録を複数人で同時編集できるツールを探していたら[Etherpad-lite](https://github.com/ether/etherpad-lite)にたどり着いた。オープンソース故に社内サーバ上で運用できるのでGoogle Docsと違って社内情報を外部に晒す危険性がない。

　参考: [みんなでノートをとったりできる同時編集対応のメモツールをいくつか紹介](http://qiita.com/ayokura/items/87fc2609e3abdf8227fe)

　しかしながら素のEtherpad-liteではPadの一覧参照などができなかったりUIがやや無骨だったりとイマイチなので、それなりに使えるものとして運用するためにはAPIを叩くWebサービスを自作する必要がある。

　まずは基本的な操作方法を習得するため、PythonからAPIを叩いてみることにした。

# APIの叩き方
　Etherpad-liteのAPIをPythonで叩くためのラッパーは[Changaco/python-etherpad_lite
](https://github.com/Changaco/python-etherpad_lite)で公開されている。

　本説明におけるフォルダ構成は以下に示すものとする。

```
root/
    etherpad-lite/
        APIKEY.txt
          :
          :
    py_api.py

```

　Etherpad-liteが起動している状態で以下のようにしてAPIを叩くことができる。

　c.api_version = '1.2.13'とあるように、APIのバージョンを明示的に指示してやらないと現時点で公開されている最新のAPIの関数を実行できない。

```py:py_api.py
from etherpad_lite import EtherpadLiteClient

f = open('./etherpad-lite/APIKEY.txt')
apikey = f.readline()
f.close()
c = EtherpadLiteClient(base_params={'apikey': apikey})
c.api_version = '1.2.13'

# padの作成
c.createPad(padID='hoge')

# pad一覧の取得
c.listAllPads()
# => {'padIDs': ['hoge']}

# padの削除
c.deletePad(padID='hoge')

```

# DjangoでWebサービスを作ってみた
　[Python Django入門 (1)](http://qiita.com/kaki_k/items/511611cadac1d0c69c54)を参考にしてPadの作成、一覧表示、削除が可能なWebサービスを作ってみた。

　[gkmaro634/etherminutes
](https://github.com/gkmaro634/etherminutes)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/96262/efbec934-2fa1-eba1-7aba-afd094e235f4.png)

　2017/04/12時点では実装できなかったがPad内の全文検索、ユーザー認証などの機能拡張にもトライしたい。
Macにtensorflow, Kerasをインストール

MacにTensorflow, Kerasをインストールしようとして手こずったところをメモします。

Terminalで
`$import tensorflow`
`$import keras`
までは公式通りで動きました。

jupyter notebookで
`$import tensorflow`
`$import keras`
しようとすると、エラーが出て、importできません。

jupyter notebookとTerminal上とで
`$import sys
$sys.executable`
の出力が異なっていました。
`$python2 -m IPython kernelspec install-self`
とすることでnotebook上でもimportできるようになりました。
UbuntuでOneDriveを使う

UbuntuでOneDriveのファイルを使うにはブラウザ越しにダウンロード/アップロードする必要があり使い勝手が悪いです。Windows10ではエクスプローラ上に OneDriveのフォルダが自動的に表示されていて、ネットワークの向こう側だとか全然気にせず使えて非常に便利です。
Ubuntuでも、Windows10と同等の使い勝手を手に入れましょう。

# TL;DR
覚え書きです。SSとってなかったので文字ばっかです…
ググると`onedrive-d`というのが結構出てくるんですが、githubが404でした。
なので [OneDrive Free Client](https://github.com/skilion/onedrive)を使います。
実は、ここの READMEか下記参考リンク先を読めば、このあとは読む必要ありません。
※ コメントでいただいた通り、`skilion/onedrive`は最新版のcurlに対応していないので、[こちら](https://github.com/abraunegg/onedrive)の`abraunegg/onedrive`を使用した方がよいと思います。手順の変更箇所は、`git clone`元を変更すれば大丈夫です。

`abraunegg/onedrive`のREADMEが色々書いてあって詳しいので是非読んでみてください。


# 環境
Ubuntu16.04 64bit版を使いました。

# 必要なソフトのインストール
下記が必要なのでインストールします。
- libcurl
- SQLite3
- Digital Mars D Compiler

コマンドはこんな感じで、Dコンパイラのバージョンは適宜変更して下さい。

```
$ sudo apt-get install libcurl4-openssl-dev libsqlite3-dev gdebi
$ wget http://downloads.dlang.org/releases/2.x/2.073.2/dmd_2.073.2-0_amd64.deb
$ sudo gdebi dmd_2.073.2-0_amd64.deb
```

# OneDrive Clientのインストール
適当なディレクトリにクローンして makeします。

```
$ git clone git@github.com:skilion/onedrive.git
$ cd onedrive
$ make
$ sudo make install
```

# 設定ファイルのコピー
クローンした設定ファイルを、設定ファイル用ディレクトリにコピーします。

```
$ mkdir -p ~/.config/onedrive
$ cp ./config ~/.config/onedrive/config
```
この configファイル内の`sync_dir`を変更してやれば、同期するディレクトリを変更できます。

# サービスの起動
OneDriveのサービスを起動します。

```
$ systemctl --user enable onedrive
$ systemctl --user start onedrive
```

# 初回起動
サービスが起動したら、onedriveコマンドを実行します。

```
$ onedrive
```

ターミナルにメッセージが表示されます。
`Authorize this app visiting:` のあとに URLが表示されるので、これをコピーしてブラウザでアクセスします。
Microsoftアカウントのログイン画面になるので、OneDriveを使用するアカウントでログインします。
`Let this app access your info?`と聞かれるので、OneDriveクライアントから操作できるようにするため`Yes`ボタンを押します。
すると、白紙のページが表示されるので、そのページの URLをコピーします。
ターミナルで先ほどコピーした URLの更に下の方に`Enter the response uri:`と表示されているので、いまコピーした白紙ページの URLを貼り付けます。
すると、OneDriveとの同期が始まります。

# 次回以降の起動
`Startup Applications`に`onedrive -m`を登録しておきます。
**※ 上記は実行する必要がありません。詳しくはコメントを参照下さい。**


# 参考リンク
http://linux-user.hatenablog.com/entry/2016/09/07/110610
SwiftでContainerViewを使ってみる

## Container Viewを使う

StoryBoardにはviewの中にさらにviewを入れ込む事のできるContainer Viewというものが用意されています。

Xcodeの操作になれていないため、自分の備忘用にも使用方法はgifで残しておこうと思います。

まず、Container ViewはObject libraryから探し出すことができます。

![a1.gif](https://qiita-image-store.s3.amazonaws.com/0/62936/1dc51f9f-a8b1-0971-0f44-2cab07def0e6.gif)

Object libraryからContainer Viewを選択し、すでに作っておいたviewの上に載せます。
サイズも適当に合わせてあげましょう。

![a3.gif](https://qiita-image-store.s3.amazonaws.com/0/62936/127275ad-903d-9217-45c7-2447ced725b1.gif)

載せたContainer ViewにViewControllerを設定します。
ViewControllerのコードは以下のようなものを用意します。このViewControllerをContainer Viewに設定するとContainer Viewの部分だけ背景が黄色になります。

```swift:ContainerViewController.swift
class ContainerViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        //背景色を黄色にする
        self.view.backgroundColor = UIColor.yellow
    }
}
```

Container ViewへのViewControllerの設定は右側にできている小さいViewのViewControllerを選択しCustom ClassのClassに作成しておいたContainerViewControllerを設定します。

![a4.gif](https://qiita-image-store.s3.amazonaws.com/0/62936/2e489b01-34b4-3cd0-e4c6-b2a0b19e057d.gif)

シミュレータで動かしてみましょう。

![a5.gif](https://qiita-image-store.s3.amazonaws.com/0/62936/75eb810f-479c-2366-f6c5-4c3cddf509ba.gif)

できた！上下で背景の色が異なっています！

無事Container Viewを使うことができました。

次の投稿では今回行ったContainer Viewの表示部分をコードで実装してみたいと思います。
YOLO9000をけものフレンズで試す

## 概要
9000種類以上の物体を検出可能な物体検出器である、YOLO9000 を動かします。YOLO9000は動物の検出が得意な検出器 [\[Joseph Redmon+, CVPR2017\]] (https://arxiv.org/abs/1612.08242) であり、また、YOLOは二次絵への汎化が得意な検出器 [\[Joseph Redmon+, CVPR2016\]] (https://arxiv.org/abs/1506.02640) であることから、今回は動物やけものフレンズの画像に適用し、精度や汎化性能を確認します。


## YOLO9000環境構築
YOLO9000フレンズになるの、すごく簡単。以下のコマンドを呼んで。

```bash
# Installing Darknet
git clone https://github.com/pjreddie/darknet
cd darknet
make
# Downloading pre-trained weight file for MS COCO (80 classes)
#wget http://pjreddie.com/media/files/yolo.weights
# Downloading pre-trained weight file for YOLO9000 (9418 classes)
wget http://pjreddie.com/media/files/yolo9000.weights
```

※CUDA, OpenCVを使用する場合、Makefileの先頭を修正して下さい。
　http://qiita.com/MOKSckp/items/7b300b1b51e689a0df35
　https://pjreddie.com/darknet/yolo/
　https://pjreddie.com/darknet/install/


正しくインストールされたか確認します。

```
./darknet detector test cfg/combine9k.data cfg/yolo9000.cfg yolo9000.weights data/dog.jpg
```

predictions.png に結果が保存されます（OpenCV不使用時）。
![predictions_dog.png](https://qiita-image-store.s3.amazonaws.com/0/155506/710cfb0f-4fd8-b75f-61f7-6790a14d5fb2.png)
……。
精度はさておき細かく分類しようという心意気を感じます。


## フレンズ検出
さて、フレンズを検出してみます（以下、表示閾値の"thresh"を小さめに指定してあります）。

```
./darknet detector test cfg/combine9k.data cfg/yolo9000.cfg yolo9000.weights data/friends/800px-Serval_in_Tanzania.jpg -thresh 0.05
```

![predictions_serval1.png](https://qiita-image-store.s3.amazonaws.com/0/155506/25fd0a0b-8a09-d139-0c51-2df5ff9e3893.png)
（画像引用元： https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB:Serval_in_Tanzania.jpg ）
サーバルは上手に検出できるようです。

![predictions_shoebill.png](https://qiita-image-store.s3.amazonaws.com/0/155506/b5beebc7-9261-3f70-0546-688f7b6233d7.png)
（画像引用元： https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB:Shoebill_couple2.jpg ）
ハシビロコウ (shoebill) も何とか検出しようとしています。
改めて、9418クラスの物体検出器すごーい！

![predictions_prairie_dogs.png](https://qiita-image-store.s3.amazonaws.com/0/155506/8f6e9fe6-96b8-6a75-7413-9486747c7669.png)
（画像引用元： https://en.wikipedia.org/wiki/File:Kissing_Prairie_dog_edit_3.jpg ）
クラスとしては存在するので、できればオグロプレーリードッグ (blacktail prairie dog) と答えて欲しいところですが、流石にそこまでは難しいようです。


![predictions_12_1.png](https://qiita-image-store.s3.amazonaws.com/0/155506/b0a6120f-6c4b-5a2c-c958-ab4410a5aa4a.png)
（画像引用元： https://www.youtube.com/watch?v=lh_GcdBamD4 ）
referee かどうかはさておき人だと判断しているようです。

9418クラスは細かすぎて精度が悪いので、animal, person に属するクラスは friend に、それ以外のクラスは object に上書きしてみます。
![predictions_12_1_.png](https://qiita-image-store.s3.amazonaws.com/0/155506/263635b9-041b-9219-de14-350b625bdc25.png)
（画像引用元： https://www.youtube.com/watch?v=lh_GcdBamD4 ）
わーい！　たーのしー！
【git】プロジェクトを跨いだグローバルなgitignoreを作成する

#ユースケース
ローカル環境にある.idea/や.DS_storeなどは各個人の環境で生成される。
プロジェクト共通の.gitignoreに、書くのは適切ではない。

#ローカル環境のみ適応する.gitignoreを作成
.gitconfigに、ローカル環境の.gitignoreを読み込ませる。
下記コマンドで、commit時にホームディレクトリにある.gitignore_globalに書かれたファイルをcommit対象から外す。

```ターミナル.
$ git config --global core.excludesfile ~/.gitignore_global
```

.gitignore_globalを編集する。
普段プロジェクトのルートに置く.gitignoreと同じ記述方法

```ターミナル.
$ vi ~/.gitignore_global
```

```~/.gitignore_global
.idea/
.DS_Store
```

設定後、プロジェクトのルートでgit init
これで~/.gitignore_globalのファイルは、gitのcommit対象にはならない。
TSLint5.0で重要度設定

## TSLint 5.0リリース
TSLint 5.0が[リリース](https://github.com/palantir/tslint/releases/tag/5.0.0)されました:metal:メンバーが増えて開発が加速し、既に5.1もリリースされています。5.0の記事を書き遅れた感はありますが、gulp-tslint 8.0が5.0をサポートたので、重要度設定についてだけでも紹介したいと思います。なお、バージョンアップに伴い、TSのバージョンは2.1以上が求められるようになっています。

## Serverity level (重要度設定)
TSLint 5.0から、重要度を設定できるようになりました。それに伴い、tslint.jsonのプロパティに`defaultSeverity`と`severity`が追加されています。`defaultSeverity`は重要度の既定値で、`default | error | warn | warning | none | off`のいづれかを設定できます。一方、`severity`はルールごとに設定でき、`error | warn | warning | none | off`を使えます。つまり、ルールごとに重要度を切り替えられるようになったということです。

```json
{
    "defaultSeverity": "error",
    "rules": {
        "array-type": {
            "options": "array-simple",
            "severity": "warning"
        },
        "arrow-parens": true
    }
}
```

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/67429/ef1f7a65-b2b8-8a58-a31c-535cd170d98d.png)

上記の例では、既定の重要度をerrorに、array-typeはwarningに設定しています。そのためarrow-parensルールに違反した場合はエラーと表示されていますが、array-typeの場合はwarningになっています。
整数計画ソルバーの使い方1


## はじめに
整数計画ソルバーの基本的な使い方を紹介します。
OS別のインストール方法などは
[GLPKによる勤務シフト表の作成1](http://qiita.com/ki073/items/a8b26883e931e4bf6584)
からたどってください。

## 例1
以下に示す重量のジャガイモがあります。1kg入り(1kg以上)を10袋作りたいのですが、どのように詰めれば良いのでしょうか？

46g  17個
47g  20個
48g  22個
49g  16個
50g  21個
51g  22個
52g  25個
53g  21個
54g  16個
55g  21個

GLPKで動くプログラムを書いてみました。今回はモデルとデータを分けてあります。別々のファイルにして
`glpsol -m packing1.mod -d data1.txt `
で実行できます。またそのままつなげて1つのファイルにしても構いません。

```GLPK:packing1.mod
set Package; # 袋の番号
set Weight; # 重量
param n{Weight}; # 重量ごとの個数
var assign{Package, Weight} integer, >=0; # 詰める個数

s.t. limit{w in Weight}: sum{p in Package}assign[p,w]<=n[w]; # それぞの重量の個数の上限
s.t. packing{p in Package}: sum{w in Weight}w*assign[p, w]>=1000; # 袋の中身が1000g以上

solve;

# 出力
printf "Package ";
printf{w in Weight}"%4d", w;
printf "\n";
for{p in Package}{
    printf "  %3d   ", p;
    printf{w in Weight}"%4d", assign[p, w];
    printf "\n";
}
printf "Sum     ";
printf{w in Weight}"%4d", sum{p in Package}assign[p, w];
printf "\n";
```


```GLPK:data1.txt
data;
# 袋の番号
set Package := 1 2 3 4 5 6 7 8 9 10;
# 1個あたりの重量と個数
param : Weight :  n :=
46  17
47  20
48  22
49  16
50  21
51  22
52  25
53  21
54  16
55  21
;
```

しばらくすると、答えが出力されます。私の環境では以下のようになりました。条件を満たす答えが多種類ありますので、同じ結果になるとは限りません。

```GLPK:result
Package   46  47  48  49  50  51  52  53  54  55
    1      0   0   0   0   0   0   0   0   0  19
    2      0   0   0   0   0   0   1   0  16   2
    3      0   0   0   0   0   0   0  19   0   0
    4      0   0   1   0   0   1  17   1   0   0
    5      0   0   1   0   0  13   6   0   0   0
    6      0  13   7   0   0   0   0   1   0   0
    7      0   0   0   3  14   3   0   0   0   0
    8      2   0  13   6   0   0   0   0   0   0
    9      0   0   0   7   7   5   1   0   0   0
   10     15   7   0   0   0   0   0   0   0   0
Sum       17  20  22  16  21  22  25  21  16  21
```

1kg以上になる条件にしましたので、全部を詰めた太っ腹な結果になりました。（多分たまたま）

solve;より上に
`minimize tatal_packing_weight: sum{p in Package, w in Weight}w*assign[p, w];`
この1行を追加すると袋詰めする総重量が最小化されます。

```
+ 87727: mip =   1.011300000e+04 >=   1.000000000e+04   1.1% (43194; 4913)
+ 94668: mip =   1.011300000e+04 >=   1.000000000e+04   1.1% (46780; 5378)
+100669: mip =   1.011300000e+04 >=   1.000000000e+04   1.1% (49826; 5818)
+106053: mip =   1.011300000e+04 >=   1.000000000e+04   1.1% (52275; 6280)
+111379: mip =   1.011300000e+04 >=   1.000000000e+04   1.1% (55292; 6672)
+116711: mip =   1.011300000e+04 >=   1.000000000e+04   1.1% (58408; 7048)
```

こんなメッセージが延々と出てきますが、私の非力なパソコンではしばらく待っても答えを返しくれませんでした。

mip =の後に、2つの数値が表示されている時には、最適解は見つかっていないけれど、条件を満たしてい許容解は見つかってます。

待てない人は、コマンドに
`--tmlim 60`
を追加すると、指定時間後に制約条件を満たした答が出力されます。(この場合は60秒)

また、一番重い袋の重量を最小化する方法もあります。

```GLPK:
var max_package_weight integer;
s.t. max_paking_weigth{p in Package}: sum{w in Weight}w*assign[p, w]<=max_package_weight;
minimize pack_weight: max_package_weight;
```

max_package_weightに一番重い袋の重量が入ります。

「整数計画ソルバーの使い方2」に続く予定
Google OpenRTBをビルドする

Google OpenRTBのビルド方法のメモ

README.mdのBUILDING NOTESの情報ではうまく行かなかった部分もあるため備忘録として

# 準備
* Windows 10
* Maven 3.3.9(すでに入っていたバージョンなのでこの時点での最新ではない)
* JDK1.8.0_121

windowsとpowershellで実行したがlinuxやmacでもそうそう変わらないはず

リポジトリからクローンする

```
> git clone https://github.com/google/openrtb.git
> cd openrtb
```

# ビルド
ビルド時に問題になるのはprotocのバージョンである
それぞれのバージョンが依存しているprotocol bufferに対応したprotocを用意する必要がある
1.10.compatくらいまでのバージョンではprotocのバージョンは**2.6.1**でなければならない
現時点での最新の1.3.0ではprotocは**3.2.0**でないとビルドできない
protocは以下のURLからダウンロードする
https://github.com/google/protobuf/releases

バージョン3.2.0なら以下のもの
https://github.com/google/protobuf/releases/download/v3.2.0/protoc-3.2.0-win32.zip

解凍してbinフォルダに有る`protoc.exe`をパスが遠た場所に配置してコマンドラインから`protoc`コマンドを実行できるようにしておく



## 1.10.compatをビルドする方法

1.1.0.compatに切り替える

```
> git checkout -b 1.1.0.compat refs/tags/1.1.0.compat
```

protocのバージョンを確認する

````
> protoc --version
libprotoc 2.6.1
```

ビルドする

```
> mvn install -e
```

生成物

```
openrtb\openrtb-core\target\openrtb-core-1.1.0.compat.jar
```

## 1.30をビルドする方法

1.30に切り替える

```
> git checkout -b 1.3.0 refs/tags/1.3.0
```

protocのバージョンを確認する

````
> protoc --version
libprotoc 3.2.0
```

ビルドする

```
> mvn install -e
```

生成物

```
openrtb\openrtb-core\target\openrtb-core-1.3.0.jar
```

## jarファイルの利用
生成されたjarファイルは

# 今後の新バージョンに対応するには？

Maven Repositoryから利用したいバージョンの依存関係を見てそれが利用しているprotobuf-javaのバージョンに合わせたprotocを利用してビルドすれば良いはず

https://mvnrepository.com/artifact/com.google.openrtb/openrtb-core
CentOS7.3 に Zabbix Agent 3.0 を導入した話


## 前提
* CentOS7.3.1611
* OSインストール時のソフトウェアの選択は「開発及びクリエイティブワークステーション」
* オンプレミス
* root 権限での操作
* Zabbix サーバは別にて稼働済み

## インストール

### リポジトリを追加
`rpm -ivh http://repo.zabbix.com/zabbix/3.0/rhel/7/x86_64/zabbix-release-3.0-1.el7.noarch.rpm`

### インストール
`yum install zabbix-agent`

### 設定ファイル変更
`vim /etc/zabbix/zabbix_agent.conf`
1. `Server` の行を稼働済みの サーバに変更する。
2. `Hostname` の行を識別可能な名前にする。

### 起動してみる
`systemctl start zabbix-agent`
すると以下のようなログが出力される。

```
Job for zabbix-agent.service failed because a configured resource limit was exceeded. See "systemctl status zabbix-agent.service" and "journalctl -xe" for details.
```

と出て失敗する。

### zabbix_agent のログの確認
そこで `/var/log/zabbix/zabbix_agentd.log` を確認すると、以下のようなメッセージが出ている。

```
19735:20170411:222625.596 Starting Zabbix Agent [ZABBIX-AGENT-TEST]. Zabbix 3.0.8 (revision 65976).
19735:20170411:222625.596 **** Enabled features ****
19735:20170411:222625.596 IPv6 support:          YES
19735:20170411:222625.596 TLS support:           YES
19735:20170411:222625.597 **************************
19735:20170411:222625.597 using configuration file: /etc/zabbix/zabbix_agentd.conf
19735:20170411:222625.597 cannot set resource limit: [13] Permission denied
19735:20170411:222625.597 cannot disable core dump, exiting...
```
pid のファイルつくる権限がないよと言われているようだ。


## 権限の設定
### audit の設定ツールをインストールする
`yum install policycoreutils-python`

### 権限を設定するためのポリシーを生成する
`grep zabbix_agent /var/log/audit/audit.log | audit2allow -M zabbix-policy` を発行する。

```
******************** IMPORTANT ***********************
To make this policy package active, execute:

semodule -i zabbix-policy.pp
```

### コマンドを発行
ログにある通り `semodule -i zabbix-policy.pp` を発行する。
この処理には時間がかかる場合がある。
ログは特に出ないので、コンソールが帰ってきたら反映できてると思ってOK.

### 再度起動してみる
`systemctl start zabbix-agent`
メッセージが出なければ起動できた！

### ついでに常時起動設定する
`systemctl enable zabbix-agent`
こちらは上の権限を付与しなくても普通に通る。

## だがしかし、Zabbix サーバでは認識できてない
ホストを追加しても `Z` マークが灰(赤)色のままである。

### firewall の設定
ポートを解放し、ファイアウォールを再起動する。
`firewall-cmd --add-port=10050/tcp --permanent`
`systemctl restart firewalld`


## メモ
`CentOS7 Zabbix` で検索すると、 Agent だけじゃなくて Server も同時にインストールするページばかりだったので、自分用にメモ。
あちこちみて、何度もインストールやってみて、最小の手順で稼働できるようにしてみた。
Atomでフロー図っぽいのを書く

# 概要

Atom( https://atom.io/ )でテキストからこんな図を書いてみようです。

![class.png](https://qiita-image-store.s3.amazonaws.com/0/20865/9fa42f69-8baa-d15e-c87f-d97ec967ef07.png)
---
![sample.png](https://qiita-image-store.s3.amazonaws.com/0/20865/a40369b4-3f11-244b-201b-92b003778d38.png)

# きっかけ

ちょっと大きな規模の開発になった時に、頭がおかしくなりそうになったので一旦アウトプットしようということで
ドローイングツールを探してたら普段利用しているエディタのAtomでUMLっぽいの書けるじゃんということになりました。

# 導入ツール

## Atom

説明不要のエディターですね => https://atom.io/

## plantuml-viewer

atomプラグインのplantuml-viewerを使用します。
使用するのに

* java
* Graphviz

が必要とのこと。下記の記事が詳しいです。
参考: [テキスト入力でUMLをライブプレビューしてくれるツール（plantuml-viewer:Atomプラグイン） - Qiita](http://qiita.com/mas821/items/7932c983783ffc4f9c83)

## language-plantuml

PlantUMLのサポート用に上記のatomプラグインも入れました。

# 使ってみる

[PlantUML - シーケンス図 | プログラマーズ雑記帳](http://yohshiy.blog.fc2.com/blog-entry-153.html) のサイトをみながら
自分が欲しいっぽい要素をつまみ食いして書いてみたのが上の図です。

## 実際のコード

一つ目の画像のクラスっぽい図のコードです。

```
title クラスっぽい図

class User {
  name
  age
}

class Email {
  address
  user_id
}

class Phone {
  number
  user_id
}

User..Email
User..Phone
```

二つ目の画像のコードです。

```
title 悲しい恋模様

==出会い==

note over man: 渋谷にでかける
note over woman: 渋谷にでかける
man->woman: 街中でたまたま見かけて一目惚れ
woman-->man: 記憶にない

loop 7日間
  man->man: 思い巡らす 
end

note over man: 合わない時間が気持ち高ぶらせる

==再会==

man->woman: 「好きだ」
woman->man: 「だれ？」

alt 頑張る？
  man->woman: デートに誘う
  woman->man: だが、断る
else
  man->man: 次の手を考える
  note over man:諦める
end

note over man: 終了
==失恋==
```

なんかさっきの図と見比べてみると、なんとなくどれがどのあたりかとか検討がつきますよね。
atomではコードシンタックスをPlantUMLにした状態で右クリックすると`Toggle Plantunl-viewer`というメニューが出ます。
それを選択すると以下の画面みたいになり、リアルタイムに反映されるのでめっちゃわかりやすいです。

![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/20865/0adcee10-33c3-46ec-a143-0d01c01177ea.jpeg)

## ちょっとだけ解説

本当先程のリンクをつまみ食いしてみれば簡単に書けるんですが、例えば

### タイトル

特に説明いらないですが下記のとおりです

```
title <設定したいタイトル>
```

### note

![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/20865/fd47f76f-64c9-04b0-8d9f-ebd67177b8ba.jpeg)

```
note <位置> <基準要素>
位置: 要素に対してどこに置くか => over left rightなど
基準要素: 上の例だとman womanみたいなやつ。両方にかぶせるようにとかもできる
```

### 遷移

![3.jpg](https://qiita-image-store.s3.amazonaws.com/0/20865/54d50aaf-0e40-7def-9f47-6f42f40e7f6d.jpeg)

```
<要素> -> <要素>
例: man->woman

--> にすると点線になる
```

これもめちゃくちゃわかりやすいですが、要素から要素に線を引っ張るだけです。
`<-`にすると反対向きに線が引けました。

### 区切り線

![4.jpg](https://qiita-image-store.s3.amazonaws.com/0/20865/d87ba928-72d6-6590-1b06-8c35ecdf1d7e.jpeg)

```
==<テキスト>==
```

こんな悲しい区切り線書かないでしょうけどね。。。そんな感じです。

他にも書き方があって、図の形式によって書き方も変わったりします。
リファレンスのほうが正しく充実していると思うのでそちらを参照してみてください。

参考: http://plantuml.com/

# 保存

トグルしたタブでpngで保存してしまえばOK。
(私の環境だと、umlを書いた方にファイル名をつけてあげてないとエラーが出る)

# 良さ

* 画像で作ると直しがめんどくさい
* 文字列になるので差分とか見れて管理が楽
* 要素とか勝手に増やしてくれるし、配置とかも勝手にやってくれるので楽

# 気になる

* 色変えられるのかな(黄色と赤はちょっと。。。)
* ちょっとだけ配置変えたいとかできるかな・・・
* エラーがポツポツ出る(のを無視してる)

# さいごに

今回作ってみて、自分の頭の整理にもなりますし、人と共有する時に図があるっていうのは
齟齬が無くなりそうですごく良いなと思いました。
WEBサービスでこういうツールが有るにはあるんですが、atomをもし使っているなら
一旦お試しするのは良さそうです。
MastodonにTootするまで(Python)

# Mastodon

Twitterライクなサービスらしい。オープンソース。
とりあえずPythonでToot(TwitterでいうTweet)するまで。

# ライブラリ

PythonとかRubyとかあるらしいので、とりあえずPythonでやります。

```bash
pip install Mastodon.py
```
# レジストレーション

日本鯖としてインスタンス(https://mastodon.nil.nu) ができたのでそこにTootします。インスタンスでアカウントは取得しておく。


```py
from mastodon import Mastodon

Mastodon.create_app("yourapp", # クライアント名
                    api_base_url = "https://mastodon.nil.nu", # アクセス先
                    to_file = "yourapp_clientcred.txt" # 出力先ファイル名
)
```

# ログイン

```py
from mastodon import Mastodon

mastodon = Mastodon(
    client_id="yourapp_clientcred.txt", # レジストレーションでできたやつ
    api_base_url = "https://mastodon.nil.nu")

mastodon.log_in(
    "xxxx@xxxxxxxx.xxx", # ID(登録メールアドレス)
    "xxxx", # password
    to_file = "your_usercred.txt") # 出力先ファイル名
```

# Toot
```py
from mastodon import Mastodon

mastodon = Mastodon(
    client_id="yourapp_clientcred.txt", # レジストレーションでできたやつ 
    access_token="your_usercred.txt", # ログインでできたやつ
    api_base_url = "https://mastodon.nil.nu")
mastodon.toot("Your message")
```

だれかクライアントつくって。
carthageのバージョンを今すぐ上げよう


https://github.com/Carthage/Carthage
carthageはbinaryが用意されてる時はそれを落としてきてくれるのでビルド時間短縮になりますが、importしたbinaryが現在のswift　versionと異なる環境で作られていた場合、下記のようなエラーが出ると思います。

```
Module compiled with Swift 3.0.2 cannot be imported in Swift 3.1
```

carthageのversion0.20以降ではbinaryをチェックして、そのbinaryが作られた環境とlocal環境のswift versionが異なっていた場合には、よしなにビルドしてくれるようになったようです。
https://github.com/Carthage/Carthage/releases
素晴らしすぎる。

実際の例）　
binaryが作られたswift version 3.0.2
localのswift version 3.1

```
$ carthage update --platform ios
*** Fetching SwiftyJSON
*** Downloading SwiftyJSON.framework binary at "3.1.4"
*** Skipped installing SwiftyJSON.framework binary due to the error:
	"Incompatible Swift version - framework was built with 3.0.2 and the local version is 3.1."
*** Checking out SwiftyJSON at "3.1.4"
```


もしまだ古いversionのcarthageを使っている場合はupgradeしておいて損はないと思います。

```
例）
$ brew upgrade carthage
```
OpenAM J2EE Policy Agent for Jetty 導入について

# はじめに
#### 本記事は、[OpenAM/OpenIGを使用したシングルサインオン環境の構築](http://qiita.com/gzock/items/af6f820b5e872366e853)という記事から続く関連記事の一部です


本記事では、既にOpenAMが構築してあることを前提に、OpenIGとの連携をするべく、J2EE Policy Agentの導入を目指す。

OpenAMにはJavaアプリケーションサーバであるTomcatやJettyと連携可能なJ2EE Policy Agentというものが用意されていて、これらを使用することで、例えばApacheやIISにおけるWeb Policy Agentと同じようにOpenAMとの連携が可能になる。
対象サーバアプリケーションとしては以下のものがある。
ただしバージョン指定があるので、最新のバージョンだと対応していないっていうことが有り得る。

* Tomcat
* GlassFish
* Web Sphere
* JBoss
* Jetty
* WebLogic

本記事では、Jettyを対象にして説明を行うが、正直どのアプリケーションに対してもやることは変わらないので、手順は流用可能である。
また、[Apache用のWeb Policy Agent](http://qiita.com/gzock/items/a64940833dbaae9802db)とも手順がよく似ているので、一度経験があるならば容易に作業が完了すると思う。

# 前提
* 既にJettyおよびOpenAMはインストール済であること
* OpenAMがインストールされているサーバはCentOS7.3を想定
* JettyがインストールされているサーバはCentOS7.3を想定
* 検証目的の構成を行う

# 環境
* OpenAM側
  * サーバOS: CentOS7.3
  * ホスト名: sso.test.local
  * IPアドレス: 172.16.1.130
  * JDK Ver: 1.8.0_111
  * Tomcat Ver: 8.0.39
  * OpenAM Ver: 13.0.0

* Jetty側
  * サーバOS: CentOS7.3
  * ホスト名: openig.test.local
  * IPアドレス: 172.16.1.131
  * JDK Ver: 1.8.0_111
  * Jetty Ver: 8.1.21

# 構築作業

## OpenAM側の設定

### OpenAM上でエージェントプロファイルを作成

1. トップページから`Top Level Realm` => `Agents` => `J2EE`の`新規`をクリックしてエージェントプロファイルを作成

2. ここから先はWeb Policy Agentと同じなので、参考にしてください。ただし、`エージェントURL`は、明示的にパスを指定する必要がある。これはJ2EEエージェントは、それ自体が立派なJavaアプリケーションとして動作するため、彼らに接続できるように明示的な指定が必要になる。よく使うのは`/agentapp`


## J2EE Policy Agentをインストール

### 下準備
#### ダウンロード
J2EE Policy AgentもJ2EE Policy Agentと同じような手順で、Forgerock社から入手する必要がある。
下のURLからOpenAM => J2EE Policy Agents => 3.5.0 => Jetty 7 and 8 と辿って、.zipを落としてくる。
OpenAMと同じくダウンロードにはサインインが必要。
[https://backstage.forgerock.com/downloads/OpenAM](https://backstage.forgerock.com/downloads/OpenAM)

#### ユーザの有効化
Web Policy Agentと同じく、J2EE Policy AgentはSPとなるサーバ、今回であればjettyを実行するユーザで、インストールを進める必要がある。
どうやってjettyをインストールしているかによって多少やり方は異なるが、もしyumなどではなく手動でインストールしている場合、
jetty という至って普通のユーザで作成していると思う。また、nologinではなくシェルが扱える状態になっているはずなので、この場合であれば特に問題ない。
もしnologinなどでシェルが触れない状態のときは、下記のようにsuコマンドのオプションとして`-s`を指定すると良い。これで明示的にシェルを指定してユーザーをスイッチすることができる。

```
[root@sso ~]# su - jetty
This account is currently not available.
[root@sso ~]# su - jetty -s /bin/bash
[jetty@sso ~]#
```

あるいは、今後恒久的にjettyユーザで作業を行うのであれば、下記のように変更したほうが楽かもしれない。
※とはいえ、jettyユーザを使う用事があるのはインストール時ぐらいなので su -s使ったほうが楽

```
[root@sso ~]# vim /etc/passwd
※略
jetty:x:48:48:jetty:/home/jetty:/sbin/nologin  <== /bin/bash に変更する
```

### 展開
[Web Policy Agent](http://qiita.com/gzock/items/a64940833dbaae9802db)と全く同じなので、参考にしてください。

#### パスワードファイルの作成
[Web Policy Agent](http://qiita.com/gzock/items/a64940833dbaae9802db)と全く同じなので、参考にしてください。


### インストール
[Web Policy Agent](http://qiita.com/gzock/items/a64940833dbaae9802db)と全く同じなので、参考にしてください。
セットアップウィザードの中で問われる内容も基本的に変わらないです。
ただし、OpenAM側で設定した通り、エージェントURLは合わせること。(例で言うならhttp://openig.test.local:8080/agentapp)
注意点としては、Web Policy Agentと同じく必ず実行ユーザを切り替えて作業を進めること。
いつもの流れでrootとかで作業してはいけません。



## 動作確認

* WebブラウザからSPのURL(http://openig.test.local:8080/) へアクセスしOpenAMのログイン画面へリダイレクトされたらまずはOK

* ログイン後、jettyのトップページが表示されたら、エージェントはうまく動作している

## トラブルシュート
基本的にハマるポイントはWeb Policy Agentと同じかと。
Angularとはちょっと違う。Vueインスタンスのコンパイルが終了するまで表示される変数名{{ message }}を消したい。 

Angularばっか触っていたので脳みそ内でAngularとVueがごっちゃごっちゃしてます。

Angularでもありましたが、Vue.jsでも {{ }} の変数解決が行われるまで、ブラウザの画面上に {{ message }} など変数名が一瞬表示されて気持ちが悪い。

ってなわけで、Angularでいうとこのng-cloak的なものがないか探したところ、Vue.jsにもありました。
ただ、ちょっとだけAngularとは異なる部分があったので、そこについてメモを残しておこうと思います。


この記事は、
[Vue.js v2.2.6](https://github.com/vuejs/vue/tree/v2.2.6)
を使用しています。

# v-cloak と ng-cloakの違い

[v-cloak](https://jp.vuejs.org/v2/api/#v-cloak)を使用すれば、Vue インスタンスのコンパイルが終了するまで表示されていた、 {{ }} を画面に描画させないようにできます。

一点注意が必要なとこは、Angularだと、

```
<div ng-cloak> 
  {{ message }}
</div>
```

とするだけでよかったのですが、
v-cloakだと

```
[v-cloak] {
  display: none;
}
```

と CSS のルールと組み合わせが必要になってきます。
地味にハマった。ちゃんとリファレンス読まな行きませんね(; ;)

# 実際のv-cloakを使った簡単なサンプル

```html:sample.html
<html>
  <head>
    <style>
      [v-cloak] {
        display: none;
      }
    </style>
  </head>

  <body>
    <div id="app" v-cloak>
      {{ message }}
    </div>

    <script src="lib/vue.min.js"></script>
    <script>
      var app = new Vue({
        el: '#app',
        data: {
          message: 'Hello Vue!'
        }
      })
    </script>
  </body>
</html>
```
Python os関連 ファイル,サブディレクトリ操作

# Python ディレクトリ名取得
わかりやすいものがなかったので、だいぶ内容はかぶっていると思いますが一応備忘録的に。

os.walkで手に入るのがgeneratorオブジェクトなので扱いやすいようにリストに変換

```python
dir = list(os.walk("path"))
```
なぜだか、os.walkで表示させたがりますが、私がしたいのはパスの取得なので構造を知りたかったのです。
手に入るのは

('rootディレクトリ',[ディレクトリ（lsした時に表示されるディレクトリ）],[ファイル（同様にファイル）])

というタプル構造が再帰的に含まれているリスト構造です。
dir[0] には引数のpathのタプルが
dir[1] にはディレクトリ１番目のタプル構造が
、、、
という感じです。

ディレクトリやファイル名取得する際、他にもっといい方法があるのかもしれませんがぱっと探しても割と出てこなかったのでとりあえずはこれで行こうかと。

もっと楽な方法があるよという方、コメントいただけると嬉しいです。
PostgreSQLで実行結果をカンマ区切りで表示する

例えばこんなテーブルがあったとして…

```postgres
shop=# SELECT * FROM Shohin;
 shohin_id |   shohin_mei   | shohin_bunrui | hanbai_tanka | shiire_tanka |  torokubi  | shohin_mei_kana
-----------+----------------+---------------+--------------+--------------+------------+-----------------
 0001      | Tシャツ        | 衣服          |         1000 |          500 | 2009-09-20 |
 0002      | 穴あけパンチ   | 事務用品      |          500 |          320 | 2009-09-11 |
 0003      | カッターシャツ | 衣服          |         4000 |         2800 |            |
 0004      | 包丁           | キッチン用品  |         3000 |         2800 | 2009-09-20 |
 0005      | 圧力鍋         | キッチン用品  |         6800 |         5000 | 2009-01-15 |
 0006      | フォーク       | キッチン用品  |          500 |              | 2009-09-20 |
 0007      | おろしがね     | キッチン用品  |          880 |          790 | 2009-04-28 |
 0008      | ボールペン     | 事務用品      |          100 |              | 2009-11-11 |
(8 rows)
``` 

`\a`で位置揃えのON/OFFトグル。

```postgres
shop=# \a
Output format is unaligned.
```

`\pset fieldsep ','`でセパレータをカンマに。

```postgres
shop=# \pset fieldsep ','
Field separator is ",".
```

これでカンマ区切りの表示ができる。

```postgres
shop=# SELECT * FROM Shohin;
shohin_id,shohin_mei,shohin_bunrui,hanbai_tanka,shiire_tanka,torokubi,shohin_mei_kana
0001,Tシャツ,衣服,1000,500,2009-09-20,
0002,穴あけパンチ,事務用品,500,320,2009-09-11,
0003,カッターシャツ,衣服,4000,2800,,
0004,包丁,キッチン用品,3000,2800,2009-09-20,
0005,圧力鍋,キッチン用品,6800,5000,2009-01-15,
0006,フォーク,キッチン用品,500,,2009-09-20,
0007,おろしがね,キッチン用品,880,790,2009-04-28,
0008,ボールペン,事務用品,100,,2009-11-11,
(8 rows)
```

ついでに結果が長くなるときにページャが自動で起動してしまうのは`\pset pager`でON/OFFできる。
sudoの設定で(ALL)と(ALL:ALL)の違いとは

sudoの設定というか、/etc/sudoersの書式の話。

結論としては、(ALL:ALL)は(ユーザ名:グループ名)を意味している。
(ALL)はその省略でユーザ名だけを指定している。

なぜ気になったかというと、手もとのUbuntuで/etc/sudoersをみたら下記のような記述があったため。

```
# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL
```

どう違うんだろう。Manに書いてあった。

```
dgb が /bin/ls を実行するとき、変身対象ユーザとグループのどちらでも operator になれるように、この記述を拡張することもできる。


dgb     boulder = (operator : operator) /bin/ls, (root) /bin/kill,\
        /usr/bin/lprm

注意してほしいが、Runas_Spec のグループの部分は、 コマンドをそのグループとして実行することをユーザに許可しているのであって、 そうすることをユーザに強制しているのではない。 コマンドラインでグループを指定しない場合は、コマンドは、 パスワード・データベースにある変身対象ユーザのエントリに登録されているグループとして実行されることになるのだ。 以下のコマンドはすべて、上記の sudoers エントリによって許可されることになるだろう。

$ sudo -u operator /bin/ls
$ sudo -u operator -g operator /bin/ls
$ sudo -g operator /bin/ls
```

ちなみに、上記の引用内で"boulder"は許可する接続元を示すが、どういうケースで役に立つのだろう。

「便利だよー」という方、ぜひ教えてください。

## 参考文献
　* https://linuxjm.osdn.jp/html/sudo/man5/sudoers.5.html
Visual Studio Code で必要な拡張パッケージを一括でインストールするスクリプト

毎月、[Visual Studio Code](https://code.visualstudio.com/) のアップデートが楽しみになっている @takeru08ma です。

## 経緯

...というほどの内容もないのですが、単純に **コマンドで拡張パッケージをインストールする方法ないかな？**と調べていたところ、@tosier さんが書かれている [VSCodeにオフラインでExtensionを追加する - qiita.com](http://qiita.com/tosier/items/b3b7d42b2580cb63c9ee) という記事を見つけました。（公式で説明しているページもあった気がするのですが、更新されてしまったのか見当たらず）

触発されて、稚拙ながら [Windows環境でセットアップ可能なPowerShell - Setup-VSCode.ps1](https://github.com/busonx/example-golang/blob/master/golang_ide/ps/Setup-VSCode.ps1) も作成したのですが、最近（？）というかいつアップデートされたのか気づかなかったのですが、バージョン情報がなくてもインストール可能になっておりました :sweat_smile: 

## 早速

[公式の説明](https://code.visualstudio.com/docs/editor/extension-gallery#_command-line-extension-management)。

> ```
code --list-extensions
code --install-extension ms-vscode.cpptools  <== これでインストール可能。バージョン情報は不要。
code --uninstall-extension ms-vscode.csharp
code --disable-extensions
```

マーケットプレイスのURI（ https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools ）にある `itemName` をそのまま設定してコマンドを実行すればインストールされます。（なんて楽 :blush: ）

作成したスクリプト（Gist）です。
https://gist.githubusercontent.com/busonx/f0e9644c7685097fe8916546f1a95f5d/raw/78e86b7226e02c627ae937a3ff4a6d85f9092cbb/install-centos7.x-vscode-extensions.sh

```bash:install-centos7.x-vscode-extensions.sh
#!/bin/bash

# execute command
# -------------------
# curl -s https://gist.githubusercontent.com/busonx/f0e9644c7685097fe8916546f1a95f5d/raw/78e86b7226e02c627ae937a3ff4a6d85f9092cbb/install-centos7.x-vscode-extensions.sh | /bin/bash

# Visual Studio Code :: Package list
pkglist=(
abusaidm.html-snippets
akamud.vscode-theme-onedark
alefragnani.project-manager
anseki.vscode-color
azemoh.one-monokai
christian-kohler.path-intellisen
codezombiech.gitignore
DavidAnson.vscode-markdownlint
dbaeumer.vscode-eslint
donjayamanne.githistory
eg2.vscode-npm-script
formulahendry.code-runner
freakone.cursoruler
hnw.vscode-auto-open-markdown-pr
hollowtree.vue-snippets
jprestidge.theme-material-theme
kisstkondoros.typelens
kisstkondoros.vscode-codemetrics
lukehoban.Go
mohsen1.prettify-json
mrmlnc.vscode-csscomb
ms-mssql.mssql
ms-vscode.PowerShell
ms-vscode.Theme-MarkdownKit
mushan.vscode-paste-image
mycelo.shunt
PeterJausovec.vscode-docker
PKief.material-icon-theme
robertohuertasm.vscode-icons
Shan.code-settings-sync
vitorsalgado.vscode-glide
xabikos.JavaScriptSnippets
zhuangtongfa.Material-theme
)

for i in ${pkglist[@]}; do
  code --install-extension $i
done
```

`pkglist` に設定する内容は、使用したいパッケージに合わせて編集すればOKです。（CentOS7.3で動作確認済み。）

## 最後に

横道に逸れますが、yumによるVisual Studio Codeのインストールも簡単になってて驚きの連続でした :grin: 

```bash:bash
rpm --import https://packages.microsoft.com/keys/microsoft.asc
yum-config-manager --add-repo https://gist.githubusercontent.com/busonx/c7196793fdf867481d65051003117299/raw/aa972d76da7cb084551cd8504dc485bc20017e6a/vscode.repo
yum -y install code
```

↓は、↑のコマンドの2行目のrepo内容です。

```text:/etc/yum.repos.d/vscode.repo
[code]
name=Visual Studio Code
baseurl=https://packages.microsoft.com/yumrepos/vscode
enabled=1
gpgcheck=1
gpgkey=https://packages.microsoft.com/keys/microsoft.asc
```
CircieCI の Xcode を 8.3 にしたら Gym で ARCHIVE FAILED になる解決方法

CircleCI が Xcode8.3 に対応したので、 circle.yml の xcode version を 8.3 にしたら ARCHIVE FAILED と出てしまった。

他にも困ってそうな人がちらほら。

* [Xcode 8\.3 build timing out \- Mobile \- CircleCI Community Discussion](https://discuss.circleci.com/t/xcode-8-3-build-timing-out/11721)
* [codesigning fails with "unknown error \-1=ffffffffffffffff" · Issue \#8797 · fastlane/fastlane](https://github.com/fastlane/fastlane/issues/8797)
* ["Running script '\[CP\] Embed Pods Frameworks' " not running and time out \- Mobile \- CircleCI Community Discussion](https://discuss.circleci.com/t/running-script-cp-embed-pods-frameworks-not-running-and-time-out/11791)

# 解決策

match の keychain のパスワード入力で問題が出ていたようで、下記の Bitrise での対応と同じことをしたら成功した。

[Bitrise Xcode 8\.1などのSierra製CIマシンとfastlaneの組み合わせでビルドが固まる問題が解決🎉](https://medium.com/swift-column/fastlane-bitrise-ef1125a1d89a)

具体的には match の実行前に以下を実行する。

```ruby
create_keychain(
  name: ENV["MATCH_KEYCHAIN_NAME"], 
  password: ENV["MATCH_KEYCHAIN_PASSWORD"],
  timeout: 1800
)
```

そのあと、match の引数に keychain の情報を渡す。

```ruby
match(keychain_name: ENV["MATCH_KEYCHAIN_NAME"], 
      keychain_password: ENV["MATCH_KEYCHAIN_PASSWORD"])
```

私の環境ではこれでうまくいきました :tada:

多分ですが、CircleCI が Xcode8.2 までは OSX El Capitan で動いていて、 Xcode8.3 タイミングで Sierra になったことでこの問題が起きたのではと思います。

# Fastfile のサンプル

[classi/fastlane\-example - Fastfile](https://github.com/classi/fastlane-example/blob/master/iOS/fastlane/Fastfile)
ファビコンにプログレスバーを表示させる！

ファビコンを動的に設定することで、プログレスバーやバッジを表示させて、
他のページを開いていても、タブを見るだけで状況がわかるようになります。

**通知系**

![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/175015/5a03c337-b01e-3a1e-20ce-35c353e65224.png)

**進捗系**

<img width="297" alt="スクリーンショット 2017-04-11 21.52.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/175015/62d6b72e-9955-b33a-cd2a-51b9f6edd57d.png">

## tommoor/tinycon

[tommoor/tinycon](https://github.com/tommoor/tinycon)

通知系は、tinycon.jsを使うことで簡単に実装できます。

```js
T.setOptions({
	width: 7,
	height: 9,
	font: '10px arial',
	color: '#ffffff',
	background: '#549A2F',
	fallback: true
});

T.setBubble(7);
```

## lipka/piecon

[lipka/piecon](https://github.com/lipka/piecon)

進捗系は、piecon.jsを使うことで簡単に実装できます。

```js
Piecon.setOptions({
  color: '#ff0084', // Pie chart color
  background: '#bbb', // Empty pie chart color
  shadow: '#fff', // Outer ring color
  fallback: false // Toggles displaying percentage in the title bar (possible values - true, false, 'force')
});

Piecon.setProgress(7);
```
----

[http://タイマー.co](http://xn--ecktcwe6e.co/)

KPTなど、チームで時間を決めてMTGする際、
スクリーンに映すと便利なタイマーアプリです。

本記事の技術を使って、開発しています。
BigQueryのメタテーブル

BigQuery上のテーブル件数をDataStudioで可視化する方法として、メタテーブルを参照する方法がある。
BigQueryではメタデータを含む特別なテーブル(メタテーブル)が提供されており、以下のシンタックスでアクセスできる。

```
SELECT [FIELD] FROM [DATASET].__TABLES__;
```

| FIELD | 備考 |
|:-:|:-:|
| project_id  | プロジェクト名   |
| dataset_id  | データセット名  |
| table_id  | テーブル名  |
| creation_time  | テーブルが作成された時刻（UNIX TIME）  |
| last_modified_time  | テーブルに変更があった最新の時刻（UNIX　TIME）  |
| row_count  | テーブルの行数  |
| size_bytes  | テーブルのトータルサイズ  |
| type  | テーブルタイプ。普通のテーブルが1、viewなら２  |

例）

```
SELECT * FROM publicdata:samples.__TABLES__;
```

```
+------------+------------+-----------------+---------------+--------------------+-----------+--------------+------+
| project_id | dataset_id |    table_id     | creation_time | last_modified_time | row_count |  size_bytes  | type |
+------------+------------+-----------------+---------------+--------------------+-----------+--------------+------+
| publicdata | samples    | github_nested   | 1348782587310 |      1348782587310 |   2541639 |   1694950811 |    1 |
| publicdata | samples    | github_timeline | 1335915950690 |      1335915950690 |   6219749 |   3801936185 |    1 |
| publicdata | samples    | gsod            | 1335916040125 |      1440625349328 | 114420316 |  17290009238 |    1 |
| publicdata | samples    | natality        | 1335916045005 |      1440625330604 | 137826763 |  23562717384 |    1 |
| publicdata | samples    | shakespeare     | 1335916045099 |      1440625429551 |    164656 |      6432064 |    1 |
| publicdata | samples    | trigrams        | 1335916127449 |      1445684180324 |  68051509 | 277168458677 |    1 |
| publicdata | samples    | wikipedia       | 1335916132870 |      1445689914564 | 313797035 |  38324173849 |    1 |
+------------+------------+-----------------+---------------+--------------------+-----------+--------------+------+
```

https://cloud.google.com/bigquery/querying-data#tables-meta-table
より引用
ConEmu で日本語が潰れる！

どうやら、画面幅を超えるテキストをCRLF無しで連続して出力すると、折り返し処理が走るタイミングでフォント幅の見積もり計算がおかしくなるようです。

```foo.cmd
echo echoがずれる問題日本語
echo echoがずれる問題日本語fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
```


![image](https://qiita-image-store.s3.amazonaws.com/0/29454/62d530c5-98b7-472f-2cd7-3f0e5a6b2ed8.png)

＞ **今、先方のサイトに issue 起案したから、ちょっと待ってて！** ＜

https://github.com/Maximus5/ConEmu/issues/1103
プライベートなdockerのレジストリサーバの構築

# プライベートなdockerのレジストリサーバの構築

CentOS7(RHEL7)には、docker-distribution という、docker-registry のパッケージが存在するので、わざわざ docker hubから registry を取得する必要が無かった。(2017/07/10)

環境は CentOS 7.3.1611、docker-1.12.6-11

## パッケージのインストール

```
# yum install docker-distribution
# systemctl start docker-distribution.service
# systemctl enable docker-distribution.service
```

これで、ポート 5000 でサービス待ちを行っている。待ち受けのポート番号やレジストリデータの待避場所を変更したい場合は、定義ファイル config.yml を変更してサービスの再起動を行えばよい。

```yaml:/etc/docker-distribution/registry/config.yml
version: 0.1
log:
  fields:
    service: registry
storage:
    cache:
        layerinfo: inmemory
    filesystem:
        rootdirectory: /var/lib/registry
http:
    addr: :5000
```

リクエスト用のポート(5000)を開放する。

```
# firewall-cmd --add-port=5000/tcp --zone=public --permanent
# firewall-cmd --reload
# firewall-cmd --list-ports
```

_参考_
 
 * [Docker Registry v2 で Azure Blob をバックエンドにする(for RHEL7)](https://blog-kazuhisya.rhcloud.com/2015/11/28/deploying_own_docker_registry/)

## クライアント側の設定

 作成したレジストリに対して、登録を実施する。ホストは docker.internal とする。ホスト名を解決するために /etc/hosts に定義を追加する。

```
192.168.45.131  docker.internal
```

内部への接続はhttpsで無くてもエラーとならないように /etc/sysconfig/docker の INSECURE_REGISTRY にhttpで接続許可するアドレスを登録し、dockerを再起動する。

```text:/etc/sysconfig/docker
INSECURE_REGISTRY='--insecure-registry docker.internal:5000'
```

設定を行わないと、以下のエラーが発生する。

```
Get https://docker.internal:5000/v1/_ping: http: server gave HTTP response to HTTPS client
```

### クライアントのイメージを、レジストリサーバに登録

```
$ docker images
docker.io/nginx               1.13.1                958a7ae9e569        5 weeks ago         109.4 MB
$ docker tag docker.io/nginx:1.13.1 docker.internal:5000/nginx:1.13.1
$ docker images
docker.internal:5000/nginx    1.13.1                958a7ae9e569        5 weeks ago         109.4 MB
docker.io/nginx               1.13.1                958a7ae9e569        5 weeks ago         109.4 MB
$ docker push docker.internal:5000/nginx:1.13.1
(略)
1.13.1: digest: sha256:41ad9967ea448d7c2b203c699b429abe1ed5af331cd92533900c6d77490e0268 size: 948
```

ただし、検索を行うとエラーとなる。

```
$ docker search docker.internal:5000/nginx:1.13.1
Error response from daemon: Unexpected status code 404
$ docker search docker.internal:5000
INDEX     NAME      DESCRIPTION   STARS     OFFICIAL   AUTOMATED
```

原因については不明

## 参考

[OFFICIAL REPOSITORY](https://hub.docker.com/_/registry/)
ブレークポイントに斜線が入って、デバッグで停止しない場合の対処法

表題の件、結構ハマってしまったのですが、
以下の記事に助けられました。感謝！！

ブレークポイントに斜線が入って、デバッグで停止しない場合の対処法
http://foolprogrammer.blogspot.jp/2013/04/blog-post_11.html
ElasticBeanstalk Custom Platformで環境が作成できなかったメモ

ElasticBeanstalkのCustom Platformを作成しようとして、Custom Platform Builderの環境が作成できないという事象に遭遇した。

原因はおそらくAWSのバグなんだけど、platform.yamlの`option_settings`に`value`がbool値になるようなものを設定するとこの事象が発生するらしい。

```yaml:platform.yaml
option_settings:
  - namespace: aws:elasticbeanstalk:application:environment
    option_name: ERROR_BOOL_VALUE
    value: "false" # これだとダメ(他に "true"/true/false/null でもダメ)
  - namespace: aws:elasticbeanstalk:application:environment
    option_name: VALID_BOOL_VALUE
    value: default # true, false の文字列でなければOK, 空文字("")もOK
```

これはしんどい。
数理最適化RPG

# 数理最適化RPG

数理最適化の問題を Role Playing Game (RPG)風に解いていく問題です。
[Code Puzzle - 任天堂](http://cp1.nintendo.co.jp/python.html)みたいなやつです。

# 内容

あなたは、『数理最適化の世界(The World of Mathematical Optimization)』にある『組合せ最適化の迷宮』の冒険者です。
迷宮は5階層からなり、各階層のボスが出す問題を解かないと先に進めません。さぁ、最下層にある秘宝を見つけに行きましょう。

- Python の数理最適化パッケージ PuLP を使って、全5問の 組合せ最適化問題 を解いてください。
- 問題は、簡単なものばかりです。(プログラムで8行以内。手計算だと大変ですが)
- [PuLPチートシート](c0bbf6cf8873ccd7edf3)(PuLP cheat sheet)

![pulp.png](https://qiita-image-store.s3.amazonaws.com/0/13955/b855aea1-70b5-0d12-c488-86e059d7367f.png)

# 追記

herokuで動くようにしました。

- https://github.com/SaitoTsutomu/OptRPG/blob/master/heroku.md

# お試し公開版の結果発表

ボス1|数名
:--|:--
ボス2|0名
ボス3|0名
ボス4|0名
ボス5|0名

全然でした。。。

---

# 今後の実行方法（古いです）
Dockerで下記のようにして、ブラウザで localhost:5000 を開いてください。

```bash:docker
docker run -it --rm -p 5000:5000 tsutomu7/optrpg
```

<a href="http://seaof-153-125-231-145.jp-tokyo-01.arukascloud.io:31779/"><img src="https://qiita-image-store.s3.amazonaws.com/0/13955/3ddfc810-e97c-9006-cb59-a8754c218aab.png"></a>

以上
タップジェスチャをコールバックで（swift3）

会社の人からタップジェスチャをコールバックで書けるpodのframeworkが便利って聞いたので、独自実装メモ。

自分の中で今後UIViewの代わりにUIViewを継承したclassを作成。
で、そこにタップジェスチャの定義とコールバックの定義を追加して、UIViewControllerから利用する。

#### まずはUIViewを継承して自分用のViewクラス

```swift
import UIKit
///
/// ベースビュー
///
class V: UIView, UIGestureRecognizerDelegate {
    
    
    // MARK: ------------------------------ UIGestureRecognizer
    ///
    /// コールバック関数
    ///
    private var _singleTapAction: ((_ g: UITapGestureRecognizer) -> Void)?
    ///
    /// シングルタップ設定
    ///
    func singleTap(_ action: ((_ g: UITapGestureRecognizer) -> Void)?) {
        let singleTapGesture: UITapGestureRecognizer = UITapGestureRecognizer(
            target: self,
            action: #selector(V._singleTapSelector(_:))
        )
        singleTapGesture.delegate = self
        singleTapGesture.numberOfTapsRequired = 1
        singleTapGesture.numberOfTouchesRequired = 1
        self.addGestureRecognizer(singleTapGesture)
        self._singleTapAction = action
    }
    ///
    /// selector用
    ///
    @objc private func _singleTapSelector(_ g: UITapGestureRecognizer) {
        self._singleTapAction?(g)
    }

}
```

#### 利用するUIViewController側

```swift
let view: V = V.init()
view.singleTap { (g) in
    if UIGestureRecognizerState.ended == g.state {
        ///
        /// 何か処理
        ///
    }
}
```

コールバックで書けた方が分かり易いかも。
ダルブタップやロングタップも追加してみようかな。