OmniAICreator/Qiita-1.07M huggingface dataset:
自然言語処理（NLP）用語集（論文）


論文等を読んでいる時などによく出てくる単語で、馴染みがないと読みにくい単語をまとめたものです。
自分がなんだこれって思ったものを載せていくので、拡張予定です。
NLPを学び始めた学生などの役に立てば幸いです。

### ワンホット（one hot）表現
単語の表現方法の1つ。
各次元が `その単語か否か` を表している。単語数次元。
例えば apple をワンホット表現で表すと、 apple の次元だけ1で、他の次元が0のベクトルとなる。
<img width="300" alt="one_hot.png" src="https://qiita-image-store.s3.amazonaws.com/0/80088/c2f47fa6-f363-443d-1e8c-2bc1f8917fd0.png">

**補足**
未知語はゼロベクトルになってしまう。
ゼロベクトルになってしまうと、学習時に出てきていない単語をうまく扱えないので、これをそのまま使うことはしない。

### 分散表現（単語埋め込み（word embedding））
単語のベクトル。数百次元。
論文で出てくる word embedding は同じ意味。
代表的なのが、 word2vec で、近い意味の単語のベクトルは近いベクトルになるように学習される。

どのようにこの分散表現を得るかなどは以下のスライドなどに譲ります。
http://www.slideshare.net/naoakiokazaki/ss-55494101

**補足**
近年自然言語処理の研究で用いられる Neural Network のモデルを学習する際に embedding も更新されていく。初期値として word2vec を使うことが多い。

### oracle
全正解を知ってる神みたいな存在。本当はわからない情報を与えて解いた場合の精度。
例えば意味役割付与とかで品詞タグとか構文木とか、本当は解析して付与する情報を与えてそこの誤りの影響を無視して精度の上限を見たりする。

### lexicon
語彙。辞書。

### syntactic
構文。
syntactic analysis: 構文解析

### entity
名詞とかを表す。
named entity: 固有表現

### knowledge base (KB)
日本語では[知識ベース](https://ja.wikipedia.org/wiki/%E7%9F%A5%E8%AD%98%E3%83%99%E3%83%BC%E3%82%B9)と言い、知識を組織化してデータベース化したもの。

#### Freebase
knowledge base の一種。
実験のデータで使われることがある。
以下2010年の参考記事( https://osdn.jp/magazine/10/07/20/1114240 )による記述。
> 映画、本、TV番組、セレブ、企業など1200万以上のエントリを含む大規模な情報データベース。誰もが貢献・共有できるオープンな共有型知識データベースで、開発者はFree APIを利用して、Freebaseの構造データを自分たちのアプリケーションやサービスに統合できる

### ontology
明確な定義はないが entity や concept に関する知識ベースだと思っておけば良さそう。上位下位関係とか属性/値知識とかそういうのをまとめたもの。

### distant supervision
 * ラベル付きデータの情報を手がかりに全く別のラベルなしデータからラベル付きの学習データを生成し、モデルを学習する手法。
http://d.hatena.ne.jp/a_bicky/20150309/1425856724
<!-- 
 * paradigm of relation extraction where training data is created by aligning facts in a database with a large unannotated corpus. ( http://aclweb.org/anthology/D/D14/D14-1208.pdf ) 
 * Distantly supervised relation extraction, which can automatically generate training data by aligning
facts in the existing knowledge bases to text, has gained much attention.
-->
KadenzeのCADLコース session1 で normalized.png が真っ黒になる

# はじめに
kadenzeの[CREATIVE APPLICATIONS OF DEEP LEARNING WITH TENSORFLOW](https://www.kadenze.com/courses/creative-applications-of-deep-learning-with-tensorflow/info)を受けています。

session1の[課題](https://github.com/pkmital/CADL/blob/master/session-1/session-1.ipynb)でつまづいたところがあったので共有します。

# normalized.pngが真っ黒になってしまう

Part Four - Normalize the Dataset　で画像の標準化を行ったところ、normalized.pngが真っ黒となってしまいました。


# 原因

norm_imgsの最大値、最小値がともに`nan`になってしまっていました。

```
norm_imgs = sess.run(norm_imgs_op)
print(np.min(norm_imgs), np.max(norm_imgs))
print(imgs.dtype)

> nan nan
> float32
```

これは、今回私が使用したデータ100枚全てについて、同じ外枠の部分がRGBで`[0,0,0]`となっていた事が原因のようです。
このために、平均も`0`、標準偏差も`0`となり、標準化の計算をした際にその部分が`nan`となってしまっていたようでした。


# 解決策

nanを0に置き換える事で対応しました。
(解決策が間違えていたら、ご教授いただけますと幸いです。)

```
norm_imgs = sess.run(norm_imgs_op)

# 欠損値が出てしまうため、0に置き換え
norm_imgs[np.isnan(norm_imgs)] = 0

print(np.min(norm_imgs), np.max(norm_imgs))
print(imgs.dtype)

> -0.994954 0.99499
> float32
```

無事、normalized.pngが表示できました。
ありがとうございました。
CicleCIからでCodeDeployを回すときに30分以上かかるときの対策


CircleCIからDodeDeployを実行するときに30分以上かかると `watch_application_deployment` でエラーになる。
サポートに問い合わせてもいい回答得られなかったので自分でシェル作った

```bash
#!/bin/bash

set -eu

usage()
{
	cat <<EOF
$(basename ${0}) is deploy tool on CodeDeploy

Usage:
	$(basename ${0}) <parameters>

Parameters:
	--application-name		application name
	--deployment-group-name	deployment group
	--bucket				bucket name
	--key					file key
	--region				aws region (default: ap-northeast-1)
	--debug					debug
Options:
	--help, -h print this
EOF
}

watch_deployment()
{
	deployment_id="$1"
	region="$2"
	deploy_info=`aws deploy get-deployment --region ${region} --deployment-id "$deployment_id"`
	deploy_status=`ruby -e "require 'json'; d = JSON.parse('$deploy_info'); puts d['deploymentInfo']['status']"`

	case "$deploy_status" in
		Succeeded)
			echo "status is Succeeded"
			exit 0
			;;
		Created|Queued|InProgress)
			ruby -e "require 'json'; d = JSON.parse('$deploy_info'); puts Time.now.strftime('%Y-%m-%d %H:%M:%S') + ' ' + d['deploymentInfo']['deploymentOverview'].to_s"
			sleep 5
			watch_deployment $deployment_id $region
			;;
		Failed)
			echo "status is Failed"
			exit 1
			;;
		*)
			echo "get unknown status ${deploy_status}"
			exit 1
			;;
	esac
}


APP_NAME=''
BUCKET=''
DEPLOYMENT_GROUP_NAME=''
KEY=''
REGION='ap-northeast-1'
DEBUG=''

while [ $# -gt 0 ];
do
	case ${1} in
		--application-name)
			APP_NAME=${2}
			shift
		;;
		--bucket)
			BUCKET="${2}"
			shift
		;;
		--key)
			KEY="${2}"
			shift
		;;
		--deployment-group-name)
			DEPLOYMENT_GROUP_NAME="${2}"
			shift
		;;
		--region)
			REGION="${2}"
			shift
		;;
		--debug)
			DEBUG='--debug'
		;;
		--help|-h)
			usage
			exit 0
		;;
		*)
			echo "[ERROR] invalid option ${1}"
			usage
			exit 1
		;;
	esac
	shift
done

# デプロイ実行&ステータスを確認する
if [ -z "$APP_NAME" -o -z "$BUCKET" -o -z "${KEY}" -o -z "$DEPLOYMENT_GROUP_NAME" ]; then
	echo "[ERROR] parameter invalid"
	usage
	exit 1
fi

S3_LOCATION="${BUCKET}/${KEY}"
echo "${APP_NAME} deploy to ${S3_LOCATION}"

aws deploy push ${DEBUG} --ignore-hidden-files \
	--region ${REGION} \
	--application-name ${APP_NAME} \
	--s3-location s3://${S3_LOCATION}

response=`aws deploy create-deployment ${DEBUG} \
	--region ${REGION} \
	--application-name ${APP_NAME} \
	--deployment-group-name ${DEPLOYMENT_GROUP_NAME} \
	--s3-location bucket=${BUCKET},bundleType=zip,key=${KEY}`
deployment_id=`ruby -e "require 'json'; d = JSON.parse('$response'); puts d['deploymentId']"`

watch_deployment $deployment_id $REGION

```
macOSでJenkinsを動かす

#はじめに

一見簡単そうに思えるでしょ？。他に比べれば簡単なほうだとは思いますが、ちょっと面倒なところがあるのでメモっておきます。(OS X El CapitanからmacOS High Sierraくらいまでで確認)

#Jenkins

ここからダウンロードします。
http://jenkins.io
![スクリーンショット 2016-11-26 22.04.19.png](https://qiita-image-store.s3.amazonaws.com/0/141731/da3d67ba-b0b2-d082-02c3-0d0721f898cf.png)

そのままだとJavaのwarファイルだけをダウンロードしてしまって途方にくれるので(JenkinsはJavaで書かれているのです)、"Mac OS X"と書かれたメニューを選択してインストーラーをダウンロードしてください。

で、インストールもあっさり終了して、Safariで見ようとすると、これです。
![スクリーンショット 2016-11-26 22.07.46.png](https://qiita-image-store.s3.amazonaws.com/0/141731/55b16f0d-3d45-4103-dca4-b92251a9baf7.png)

#Java

そう。実は、最近のmacOS(OS X Lion以降)にはJavaの実行環境が入っていないんですねー。iOSでもJavaは動きませんし、深刻なAppleのJava離れ。WebObjectsとか、あんなに仲が良かったのに…。

ということで、JavaのJDKをインストールする必要があります。JREではダメです。こちらに移動してダウンロード。バージョンはどれでもいいですが、縁起物なので最新にしておきます。
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
![スクリーンショット 2016-11-26 22.07.11.png](https://qiita-image-store.s3.amazonaws.com/0/141731/a4101c7e-c423-1a12-0081-4acf7d492e8d.png)

#Permission denied

これで大丈夫だろうということでJenkins操作用の以下のアドレスにアクセス。
http://localhost:8080
![スクリーンショット 2016-11-26 21.57.48.png](https://qiita-image-store.s3.amazonaws.com/0/141731/7f873af1-4ad3-de54-837a-420312f74bf7.png)

ふむ、「Jenkinsをアンロックするためのパスワードをここに書いといたから見てね」ということで見てみると…

![スクリーンショット 2016-11-26 21.58.25.png](https://qiita-image-store.s3.amazonaws.com/0/141731/c82b9e1e-95d9-5720-7880-9cddd4993ffa.png)

あかんやん。Adminのはず(自宅用だから自分一人しか使ってない)だし、これはどうしたらいいものか…と思ったら、sudoを使うか、普通にFinderでアクセス権限を付ければいいみたいです。
![スクリーンショット 2016-11-26 21.56.55.png](https://qiita-image-store.s3.amazonaws.com/0/141731/19feedea-04d7-353b-f04f-373c5f5f57fb.png)

Finderで当該のフォルダを右クリックして「情報を見る」。右下の鍵アイコンをクリックしてパスワードを入れて、適用なアクセス権を付けてください。特に中身をいじることはないと思うので、読み出しのみでOKだと思います。で、フォルダだけでなく、パスワードが描かれている"initialAdminPassword"というファイルのアクセス権も変更する必要があります。

もしくは、ターミナルでこうやって覗きます(要・管理者パスワード)。この方が楽だな…。

```
sudo cat /Users/Shared/Jenkins/Home/secrets/initialAdminPassword
```

そしてパスワードを入れて、なんやかんやすると、見事に起動するのでありました。
![スクリーンショット 2016-11-26 22.02.19.png](https://qiita-image-store.s3.amazonaws.com/0/141731/c431f67f-746d-9c01-5788-b4e04c25af9e.png)

#まとめ

さして面白い話でもないんですが、酔ったついでに書いてみました。細かい情報でも、蓄積することに価値があるのであります！！
小ネタ Mac裏コマンド

##マークをだす！！
【Option】キー　+ 【Shift】 +　【K】
##Macを強制再起動する。
【command】　+ 【control】　+ 【電源ボタン】
##音量設定を細かくする
【Shift】 + 【Option】　+ 【音量ボタン】
PaSoRiを使ってpythonでNFCタグを読み書きする

# 概要
USB接続のNFC/FelicaリーダーライタであるSONYのPaSoRi(RC-S380)を使って、Mac上のpythonから、安価なNFCタグ(NTAG)を読み書きする方法をまとめます。
基本は [nfcpy](http://nfcpy.org/) で一発です。

試していませんが、Raspberry Piでも同じ方法で使える模様。
（追記）Raspbian でも、インストール手順としては、sudo apt-get install python-pip; sudo pip install nfcpy だけで OK でした。
ただし、一般権限で usb にアクセスするためには、[Raspberry Pi に nfcpy をインストールする手順 - 2016年3月 私家版](http://devadjust.exblog.jp/23018234/)の後半に書かれた手順が必要です。

# 環境セットアップ手順

## 前提
brew の python 2.7 を用いています。システム側の python でもできるはずですが、openssl のバージョンがどうなっているのか微妙なところですので、うまく動かなかったら試行錯誤してください。

## nfcpy
bzr で nfcpy を持ってくる手順が紹介されていることが多いですが、pip で一発です。

```
> brew install libusb
> pip install nfcpy
```

## openssl 関連でハマったら
python の REPL で import nfc と打って問題なくロードできれば良いですが、openssl に含まれる libcrypto のロードに失敗するケースがあります。

```
>>> import nfc
(中略)
AttributeError: dlsym(0x7fbc82c404a0, EC_KEY_set_public_key_affine_coordinates): symbol not found
```

対策として、brew で新しい openssl をインストールして link すれば OK と書いてある記事が多いのですが、

```
> brew link openssl --force
Warning: Refusing to link: openssl
```

と言われて link できません。

/usr/local/opt/openssl/lib 以下に最新の libcrypto.1.0.0.dylib がインストールされていますので、ここをダイナミックリンクライブラリのロードパスに指定すればとりあえず動きます。正しい対処方法はどうすればいいのか……。

```
export DYLD_LIBRARY_PATH=/usr/local/opt/openssl/lib:$DYLD_LIBRARY_PATH
```

# NFC タグの読み書き

## nfcpy の公式サンプル
公式の[get-started](https://nfcpy.readthedocs.io/en/latest/topics/get-started.html)を読むか、[examples](https://github.com/nfcpy/nfcpy/tree/master/examples) にあるサンプルを見れば、だいたい使い方はわかります。サンプル単体でコマンドとしても使えます（[使い方](https://nfcpy.readthedocs.io/en/latest/examples/index.html)）

例えば、以下のコマンドで NFC タグの情報を表示できます。

```
> python tagtool.py show
```

YouTube 動画を開くデータを NTAG に書き込むには以下の通り。

```
> python ndeftool.py make smartposter -t PPAP https://youtu.be/0E00Zuayv9Q | python tagtool.py load -
```

## 自力で書く

nfcpy を使って自力で必要な処理を書く場合は以下のようなコードとなります。

```python
import nfc
import nfc.ndef

def startup(targets):
    print "waiting for new NFC tags..."
    return targets


def connected(tag):
    if not tag.ndef or not tag.ndef.is_writeable:
        print("not a writeable nfc tag")
        return False
    print("old message:")
    print(tag.ndef.message.pretty())

    smartposter = nfc.ndef.SmartPosterRecord("https://youtu.be/0E00Zuayv9Q")
    smartposter.title = "PPAP"
    new_message = nfc.ndef.Message(smartposter)

    if len(str(new_message)) > tag.ndef.capacity:
        print "too long message"
        return True

    if tag.ndef.message == new_message:
        print "already same record"
        return True

    tag.ndef.message = new_message
    print("new message:")
    print(tag.ndef.message.pretty())

    return True


def released(tag):
    print("released:")
    if tag.ndef:
        print(tag.ndef.message.pretty())
    

clf = nfc.ContactlessFrontend('usb')
print(clf)
if clf:
    while clf.connect(rdwr={
        'on-startup': startup,
        'on-connect': connected,
        'on-release': released,
    }):
        pass
```

Ctrl-C で止めるまで、ひたすら NFC タグを YouTube 動画を開くものに書き換えます。

# 参考URL
[nfcpy で複数の System Code を持つ NFC タグを扱う方法](http://uchan.hateblo.jp/entry/2016/11/18/190237)
[Raspberry Pi に nfcpy をインストールする手順 - 2016年3月 私家版](http://devadjust.exblog.jp/23018234/)
interactive/read-variableはカスタム変数しか補完できない

Emacsでコマンドを定義するとき、`(interactive)`で入力補完を利用することができる。

`(interactive "f")`で実在するファイル名、`(interactive "a")`で函数名が補完できる、といった具合だ。Helmなどの補完インターフェイスを利用すると、さらに入力しやすくなる。([君は誰とEmacsる？ (補完インターフェイス紹介篇)](http://qiita.com/tadsan/items/33ebb8db2271897a462b)を参照)

この機能の概要は、Emacsの`describe-function`で`interactive`を引くと、どんな文字を利用できるのかが一覧できる。([GNU Emacs Lisp Reference Manual: Interactive Codes](https://www.gnu.org/software/emacs/manual/html_node/elisp/Interactive-Codes.html))

さて、では変数名を補完入力させようと思ったら、どうすればいいのか。

> **v** -- Variable name: symbol that is `custom-variable-p`.

`v`がその文字にあたるようだ。しかしその後に不穏なことが書いてある。「**`custom-variable-p`にあたるシンボルこそが変数なのだ**」と。

私は変数`default-directory`を補完対象にしたかったのだが、なるほど、うまくいかないようだ……？

![interactive-v.gif](https://qiita-image-store.s3.amazonaws.com/0/4121/ba336d39-6a0d-1efa-25ea-649b12a5b734.gif)

ちなみに、`(interactive "v")`に相当する単独の函数は`read-variable`で、およそ同じ動作をする。

## 解決

`custom-variable-p`で判定するって言ってるんだから、函数を一時的に上書きしてやればいいよ。

そう、**[`cl-letf`](https://www.gnu.org/software/emacs/manual/cl.html#Modify-Macros)**だね。

```el
(cl-letf (((symbol-function 'custom-variable-p) #'boundp)) (read-variable "Variable: "))
```

実際に動かしてみる。

![read-variable-letf.gif](https://qiita-image-store.s3.amazonaws.com/0/4121/38feca69-fb4d-5654-0869-79ae62535cbd.gif)

予想的中！ 別の条件で変数を絞りこみたいときにも、これを応用できますね ヾ(〃＞＜)ﾉﾞ☆

## おまけ

いろんなものがコピーできる[copyit](https://github.com/zonuexe/emacs-copyit)に変数の値をコピペする機能をつけたんですよ。

みなさんも使ってみて、おともだちにも紹介してくださいね☆
オープンソースWAF ModSecurity

## ModSecurity
ModSecurity はオープンソースの WAF (Web Application Firewall) である。

## インストール
### EPEL リポジトリーからインストール
CentOS 6 以前では EPEL リポジトリーに、CentOS 7 では標準リポジトリーにパッケージが存在する。

```bash
yum install mod_security*
systemctl restart httpd
```

EPEL でインストールされるファイルは以下の通り。

```
/etc/httpd/conf.d/mod_security.conf
/etc/httpd/conf.modules.d/10-mod_security.conf
/etc/httpd/modsecurity.d
/etc/httpd/modsecurity.d/activated_rules
/usr/lib64/httpd/modules/mod_security2.so
/usr/share/doc/mod_security-2.7.3
/usr/share/doc/mod_security-2.7.3/CHANGES
/usr/share/doc/mod_security-2.7.3/LICENSE
/usr/share/doc/mod_security-2.7.3/NOTICE
/usr/share/doc/mod_security-2.7.3/README.TXT
/var/lib/mod_security
```

### Atomic リポジトリーからインストール
CentOS 6 以前では EPEL リポジトリーに、CentOS 7 では標準リポジトリーにパッケージが存在するが 2.7.3 以前と古いので、最新版をパッケージでインストールするには Atomic リポジトリーからインストールする。バージョンは 2.9.1 になる。
ただし EPEL リポジトリーと違い、設定を自身で用意する必要がある。

```bash
curl -s http://www.atomicorp.com/installers/atomic | sh
yum install mod_security
```

Atomic でインストールされるファイルは以下の通り。

```
/etc/httpd/conf.d/00_mod_security.conf
/etc/httpd/modsecurity.d
/usr/lib64/httpd/modules/mod_security2.so
/usr/share/doc/mod_security-2.9.1
/usr/share/doc/mod_security-2.9.1/CHANGES
/usr/share/doc/mod_security-2.9.1/LICENSE
/usr/share/doc/mod_security-2.9.1/README.TXT
/usr/share/doc/mod_security-2.9.1/doc
/usr/share/doc/mod_security-2.9.1/doc/README.txt
/usr/share/doc/mod_security-2.9.1/doc/doxygen-apache.conf
/usr/share/doc/mod_security-2.9.1/doc/doxygen-iis.conf
/usr/share/doc/mod_security-2.9.1/doc/doxygen-logo.png
/usr/share/doc/mod_security-2.9.1/doc/doxygen-nginx.conf
/usr/share/doc/mod_security-2.9.1/doc/doxygen-standalone.conf
/usr/share/doc/mod_security-2.9.1/modsecurity.conf-recommended
```

Atomic での設定方法は検証中…

```bash
curl -L https://github.com/SpiderLabs/owasp-modsecurity-crs/archive/v3.0.0.tar.gz -o owasp-modsecurity-crs-3.0.0.tar.gz
tar xf owasp-modsecurity-crs-3.0.0.tar.gz
```

## 設定
modsec_audit.log に偽陽性の id が出力されるので `SecRuleRemoveById` として指定してやると除外される。

```bash
fgrep '[id "' /var/log/httpd/modsec_audit.log
```
```text:出力例
Message: Access denied with code 403 (phase 2). Pattern match "^[\\d.:]+$" at REQUEST_HEADERS:Host. [file "/etc/httpd/modsecurity.d/activated_rules/modsecurity_crs_21_protocol_anomalies.conf"] [line "98"] [id "960017"] [rev "2"] [msg "Host header is a numeric IP address"] [data "192.168.56.101"] [severity "WARNING"] [ver "OWASP_CRS/2.2.6"] [maturity "9"] [accuracy "9"] [tag "OWASP_CRS/PROTOCOL_VIOLATION/IP_HOST"] [tag "WASCTC/WASC-21"] [tag "OWASP_TOP_10/A7"] [tag "PCI/6.5.10"] [tag "http://technet.microsoft.com/en-us/magazine/2005.01.hackerbasher.aspx"]
```
```bash
cat << "_EOF_" >> /etc/httpd/conf.d/mod_security_rule_remove.conf
SecRuleRemoveById 960017
_EOF_
systemctl restart httpd
```

正規の操作を繰り返しながら、つまずくたびに以下を実行するのでもいいかもしれない。

```
grep -o 'id "[0-9]*' /var/log/httpd/modsec_audit.log | uniq | sort | sed -e 's/id "/SecRuleRemoveById /' > /etc/httpd/conf.d/mod_security_rule_remove.conf
```
iOSシミュレータ　旧iOSバージョンでのシミュレート

#iOSの古いバージョンでシミュレータを動かす方法

Xcodeのデフォルトは最新のiOSバージョンしか設定されておらず、
古いバージョンで検証するためには、イメージのダウンロードとシミュレータの設定が必要。

##シミュレータダウンロード方法
<img width="1395" alt="スクリーンショット 2016-11-26 21.52.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/47901/4616ac50-5f3d-5d95-cc6d-c0556514834f.png">

シミュレータを選択するリストから【Download Simulators】を選択。

<img width="862" alt="スクリーンショット 2016-11-26 21.52.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/47901/1ad6ffea-a08f-46c1-458a-a20f13c083ac.png">

ダウンロードしたいバージョンを選択。
割りとサイズ食うので気をつけてください…

##シミュレータ設定方法

<img width="922" alt="スクリーンショット 2016-11-26 22.10.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/47901/7967b3a4-8a26-0080-9fa8-898f192b4baf.png">

シミュレータをダウンロードしてXcodeを再起動するとシミュレータのダウンロードが反映されるので、シミュレータ設定を開き任意の名前とデバイスタイプ、iOSを選択して終了。
Homebrewで入れたnghttp2のPythonモジュールをpyenvのPythonから使う

# 前提

pyenvでpython2をメインで使っているものの、python3の環境も用意している。

# nghttp2をPythonモジューツ付きで入れるには

```shell-session
brew install nghttp2 --with-python3
```

すでにモジュールなしで入れていた場合

```shell-session
brew reinstall nghttp2 --with-python3
```

# pyenvで指定したpythonで使う


以下のコードは、

- [Python で HTTP/2 サーバーを書こう - Qiita](http://qiita.com/tatsuhiro-t/items/4b45eddf82cfe8a12dcd)

でnghttp2作者直々のコードを今時のnghttp2に合わせて動くようにしたコードになります。


```py3
import ssl
import nghttp2

class Handler(nghttp2.BaseRequestHandler):

    def on_headers(self):
        res = b'nghttp2 FTW\n'
        self.send_response(status=200,
                           #headers = [('content-length', str(len(res)))],
                           headers = [('content-type', 'text/plain')],
                           body=res)

# SSL/TLS を有効にするには, 証明書を server.crt, プライベートキーを server.key ファイルに
# 保存して, 以下 3 行を有効にし, nghttp2.HTTP2Server の ssl パラメータに ctx を指定します.
# ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
# ctx.options = ssl.OP_ALL | ssl.OP_NO_SSLv2
# ctx.load_cert_chain('server.crt', 'server.key')

server = nghttp2.HTTP2Server(('127.0.0.1', 8080), Handler, ssl=None)
server.serve_forever()

```

```shell-session
PYTHONPATH=/usr/local/lib/python3.5/site-packages python server.py &
nghttp http://127.0.0.1:8080/
```
【小ネタ】OpenStack用のRancher OSイメージ

Rancher OSは[Rancher](http://rancher.com/)が出している、Docker Hostingに特化した軽量ディストリビューションです。
各IaaS用のイメージは[ここ](https://github.com/rancher/os/releases)で配布されていて、OpenStack用のQCOW2イメージもあるのですが、[公式doc](http://docs.rancher.com/os/running-rancheros/cloud/openstack/)に
> When launching an instance using the image, you must enable Advanced Options -> Configuration Drive and in order to use a cloud-config file.

とあって、あまりHorizon使わない私はなんのこっちゃと思ったのですが、 `nova boot --config-drive true` が必須、って話でした。このオプション付けないとcloud-initを食ってくれないのでssh-keyが渡りません。
あとデフォルトのログインユーザは`rancher`です。
以上、ごく一部の人にしか役立たないネタでした。
Androidでユニットテストを始めるメモ２

前回の続き
http://qiita.com/kojimamasahiro/items/bc65d1a39075ccc1e87b

相変わらずこちらを読んで燃え尽きる
https://developer.android.com/training/testing/unit-testing/local-unit-tests.html

前回はesspressoを使って、viewの操作に関するテストでした。
今回はmockitoを使って、スタブを作りロジックが正しく値を返却するかのテストです。

# インストール

```
depences {
    // mockiot
    testCompile 'org.mockito:mockito-core:1.10.19'
}
```

テストファイルはtestディレクトリ以下に置きます。

# 使い方
こちらを読むといいかと思います。
https://static.javadoc.io/org.mockito/mockito-core/2.2.25/org/mockito/Mockito.html

verifyメソッドで確認

```
// リストをつくって
List mockedList = mock(List.class);

// 追加して
mockedList.add("one");

// oneを追加したか確認
verify(mockedList).add("one");

// one以外だとエラー
verify(mockedList).add("two");
```

このとき、こうする

```
// オブジェクトをつくって
LinkedList mockedList = mock(LinkedList.class);

// 0番目を取得したとき、
when(mockedList.get(0))

// firstを返す（.でつなぐ）
    .thenReturn("first");

// assertでテスト
assertThat(mockedList.get(0), is("first"));
```

既存のobjectのmethodを一部だけ変更

```
// listのmethodを変更する
List list = new LinkedList();

// spyを使う
List spy = spy(list);

// size()のmethodを100が返るように変更
when(spy.size()).thenReturn(100);

// 100が返る
System.out.println(spy.size());

// addなどのmethodはそのまま使える
spy.add("hoge");

// addが表示される
System.out.print(spy.get(0));
```

# おわりに
次回はそろそろRobolectricに手を出してみたい。
SurfaceViewを使用するために２

#はじめに
SurfaceViewを使用する方法は
EclipseのGraphical Layoutで配置する
SurafaceViewを継承したクラスを実装する
の２通りの方法がありましたが、
タッチイベントの通知を受け取る方法に違いがありました。

#画面のタッチイベント処理
SurfaceViewをEclipseのGraphical Layoutで配置する場合、
タッチイベントを受けるためにはOnTouchListenerを
implementsする必要があります。

画面のタッチイベントは
@Override
public boolean onTouch(View v, MotionEvent event)
で受け取ります。

SurafaceViewを継承したクラスを実装する場合は、
ViewクラスのonTouchEventをオーバーライドすることで、
タッチイベントを受け取ることができます。
**OnTouchListenerをimplementsする必要はありません。**
@Override
public boolean onTouchEvent(MotionEvent event)

#なぜクラスを作成しているのか
EclipseのGraphical Layoutで配置する場合、
MainSurfaceViewクラスは作らなくても問題ないと思います。
ではなぜ温度計アプリケーションではMainSurfaceViewクラスを作成したかといいますと
SurfaceView内でタッチイベントを処理したり描画用のThreadを使用するため、
分かりやすくなるようにクラスを作成しました。

```java:MainActivity.java
import android.view.SurfaceView;

public class MainActivity extends Activity implements Runable, OnTouchListener {

	private SurfaceView surfaceView;

	@Override
	public void onCreateView() {

		super.onCreateView();

		this.surfaceView.setOnTouchListener(this);
	}
}
```

#まとめ
ちょっとした違いでしたが同じことをするにも手順が異なり悩まされました。
turnip使おうとしたら、gherkinがエラーを吐いた

# 背景
自分でWebアプリ作ろうとしたら、いつの間にかテストの地代は移り変わりrspec+cucumberからrspec+turnipになっていました。テストファーストにということで、早速featureファイルを書いてテストをしてみました。
環境はMac OSX 10.12.1でRails 5.0です。

# エラー内容
```
WARNING: cannot load such file -- gherkin_lexer_en.so
Couldn't load gherkin_lexer_en.so
The $LOAD_PATH was:
{ライブラリのパスがずっと...}
```

gherkinのライブラリがどこにもないよということらしく、これ自体はgherkinで既知の問題でした。
対処法は`gherkin-2.12.2/lib/gherkin/c_lexer.rb`にあるPOSIXを空にしておくそうです。ただ、これを行ってもエラーが解消されませんでした。

# 対処法
gherkinのver2を使っていてもらちがあかなかったので、gerhkinをver4にすることにしました。
turnipは2.0ではgherkin4をサポートしていましたが、この組み合わせでも上手くいきませんでした。
結局、turnipのbeta版を使う事にしました。
```
gem 'turnip', '3.0.0.pre.beta.5'
```

# まとめ
同じ事をWindowsで事前にした時は上手くいっていたので、過信していました。エラー分を見た上で、きちんと内容を理解しないといけないと思いました。
開発のしやすさを無視した仕様は失敗する

「最終的な製品実装では、○○は不要だよね。」という言葉によって、開発しにくい仕様が作成されて
開発に苦労をすることがある。

ここでは、そのような苦労をする人が減るように、開発のしやすい仕様が重要であることを述べたいと思う。

以下に示す想定例は、別に私の経験したことではありません。

・「最終実装のCPUボードはこれだから、全ての開発はそのボードでいいよね」

・「製品には画像の表示はないから、開発中でも画像の表示ができないCPUボードでいいよね」

・「実装はC言語と決まっているから、プロトタイピングでもC言語でお願いするよ」、「僕は○○言語なんてわからないから、C言語でお願いするよ」

・「どうせ、それは開発時点でしか使わないんだから、そんなものにお金をかけられないよ。最終製品に使うもの以外に金をかけるのは言語道断だ。」

・「昔はそんなのがなくたってちゃんと開発していたんだ。それがないと開発できないなんて言うな。」

・「製品として残るコード以外書くな。デバッグをしやすくするためなどいうコードを書いている暇があったら、さっさと製品のコードを書け。」

・「どうせ自分たちで書かなければならないコードなんだから、市販のライブラリを買ってみるなんて言うな。」

・「成果物としてのライブラリのインタフェースには、そんなのないんだから、『単体テストをするためのインターフェース』だって、いい加減にしろ。」

・「とにかく、うまく動きゃいいんだ。『設計がおかしい』だなんて抜かすな。」


このサイトを見ている人にとっては、それぞれの発言が理にかなっていないことを十分承知だと思います。

不幸なことに、開発の実務に長けている人は、「開発の実務に専念してください。」という状況の中で、組織のマネジメントに対して影響力を発揮しえなくなるという事例がないわけではない。そのような中で、適切な設計や方向性を導くことが軽視された組織運営になることがある。

きちんと開発のしやすさを考慮して開発すれば
性能のあるマシンでしっかりとしたプロトタイピングをこなすこと、
あるいは、開発を進めることで、次のようにできます。

- 実装すべきアルゴリズムの詳細を明確にできます。
- 性能がでているのかどうかを十分な数のデータで検証することができます。
- 計算量を減らすためにどうアルゴリズムを変えればよいのかテストすることができます。
- ストレスの少ない開発環境で開発できます。

そのようにして、十分に検証した仕様、もしくはソースコードを、ターゲットマシンに持ち込むことです。
そうすれば、ターゲット環境の限られたリソースで動作するプログラムを効率的に開発できます。


---------------------------------------------
「ネットも無ェ　X（エックス）も無ェ
メモリもそれほど入って無ェ
GPUも無ェ　コア数も無ェ
ファンが毎日ぐるーぐる
朝起きてビルドして
2時間ちょっとの中休み
情報も無ェ　パッチも無ェ
updateは1年に一度来る

俺らこんなボードいやだ　俺らこんなボードいやだ
○○へ行くだ。
○○いったら銭コア貯めで
GPUのサーバー使うだ。」
俺のzshrc

cat /etc/shells
exec $SHELL
chsh
chsh -s /usr/local/bin/zsh

```
setopt hist_reduce_blanks # スペース排除
setopt share_history # 履歴ファイルを共有
setopt EXTENDED_HISTORY # zshの開始終了を記録

# history 操作
setopt hist_reduce_blanks # スペース排除
setopt share_history # 履歴ファイルを共有
setopt EXTENDED_HISTORY # zshの開始終了を記録

# history 操作
autoload history-search-end
zle -N history-beginning-search-backward-end history-search-end
zle -N history-beginning-search-forward-end history-search-end
bindkey "^P" history-beginning-search-backward-end
bindkey "^N" history-beginning-search-forward-end
HISTFILE=~/.zsh_history
HISTSIZE=10000
SAVEHIST=10000
setopt hist_ignore_dups

# alias
zstyle ':completion:*' list-colors 'di=34' 'ln=35' 'so=32' 'ex=31' 'bd=46;34' 'cd=43;34'
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias vi=vim # vi で vim 起動
alias -g G='| grep'
alias -g L='| less'
alias -g H='| head'
alias -g T='| tail'
alias -g S='| sort'
alias -g W='| wc'
alias -g X='| xargs'
alias sudo='sudo -E env PATH=$PATH '
alias rs='rails server'
alias rc='rails console'
alias sudo='sudo -E env PATH=$PATH '
alias du="du -h"
alias df="df -h"
alias la='ls -la'
alias ll='ls -la'

alias redis.start="launchctl load ~/Library/LaunchAgents/homebrew.mxcl.redis.plist"
alias redis.stop="launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.redis.plist"
alias redis.restart='redis.stop && redis.start'

alias ctags="`brew --prefix`/bin/ctags"

# 予測
autoload predict-on
predict-on

# リダイレクト機能　複数ファイル対応
setopt multios

# 数値処理関数を使う
zmodload -i zsh/mathfunc

# ハイライトを消す
# set hlsearch
# nnoremap <ESC><ESC> :nohlsearch<CR>

# jjでインサートモードから戻る
# inoremap <silent> jj <ESC>

#zshエディタ機能
autoload zed

export PGDATA=/usr/local/var/postgres

#gitのコマンド補完
source /usr/local/etc/bash_completion.d/git-prompt.sh
# source /usr/local/etc/bash_completion.d/git-completion.bash
source /usr/local/share/zsh/site-functions/git-completion.bash

#プロンプトの設定

#s_infoロード    
autoload -Uz vcs_info    
# PROMPT変数内で変数参照する    
setopt prompt_subst    

# vcsの表示    
zstyle ':vcs_info:*' formats '%s][* %F{green}%b%f'    
zstyle ':vcs_info:*' actionformats '%s][* %F{green}%b%f(%F{red}%a%f)'    
# プロンプト表示直前にvcs_info呼び出し    
precmd() { vcs_info }    
# プロンプト表示    
PROMPT='[${vcs_info_msg_0_}]:%~/%f '  

[ -f ~/.zshrc.include ] && source ~/.zshrc.include # 設定ファイルのinclude
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"

```
RSSの違いを意識せず使えるパーサーをPHPで作った


RSSは大きく分けると、RSS1.0(RDF),RSS2.0,Atomの三種類存在します。
有名なところでいうと

- RSS1.0: ライブドアブログ
- RSS2.0: アメブロ
- Atom: Googleのブログ

です。

RSSのパーサーを作る場合、RSSの種類ごとに違いを意識しながら作らなければならず、非常に面倒だったので、RSSの違いを意識せず使えるパーサーをPHPで作りました。
取得する項目は必要最低限におさえました。画像はよく使ったりするので、取得項目に画像を加えたのがポイントです。

https://github.com/YuzuruS/parse-rss


### インストール方法
[packagist](https://packagist.org/packages/yuzuru-s/parse-rss)に登録したので、composerで簡単にインストールできます。

```composer.json
{
    "require": {
       "yuzuru-s/parse-rss": "1.0.*"
    }
}
```

```
composer install
```


これでインストール完了です。

### 使い方

以下がサンプルプログラムになります。

```php
<?php
require __DIR__ . '/../vendor/autoload.php';
use YuzuruS\Rss\Feed;

$url = 'http://blog.livedoor.jp/dqnplus/index.rdf';
$ua = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36';
$res = Feed::load($url, $ua);

echo 'Title:' . $res['channel']['title'] . "\n";
echo 'Link:' . $res['channel']['link'] . "\n";

foreach ($res['item'] as $r) {
    echo "\t" . 'Article Title:' . $r['title'] . "\n";
    echo "\t" . 'Article Description:' . $r['description'] . "\n";
    echo "\t" . 'Article Date:' . $r['date'] . "\n";
    echo "\t" . 'Article og:img:' . $r['image']['ogimg'] . "\n";
    foreach ($r['image']['img'] as $i) {
        echo "\t\t" . 'Desc:img:' . $i . "\n";
    }
}
```

取得できる項目は以下の通りです。
1. サイト名
2. サイトURL
3. 記事タイトル
4. 記事description
5. 記事投稿日
6. 記事中の画像(og:imgとdescriptionに含まれる画像(複数))

認証が必要なURLから取得する場合は下記のように指定します。

```php
$res = Feed::load($url, $ua, $username, $password);
```

キャッシュを有効にする場合は下記のように指定します。

```php
Feed::$cacheDir = __DIR__ . '/tmp';
Feed::$cacheExpire = '5 hours';
```
Xcodeを画面分割(Assistant Editor)モードで使う時に便利なショートカット集

## はじめに
Xcodeを利用していると、Editorウインドウを分割させて複数のファイルを対比させつつ開発を行うことがよくあるかと思います。
xibファイルのUIパーツとコードの紐付けを行う時にも重宝しますね。
そんな時に便利なのが画面分割(Assistant Editor)モードです。
XcodeのAssistant Editorで使う時に便利なショートカットたちをTipsとしてまとめました。

![IMG_4175.PNG](https://qiita-image-store.s3.amazonaws.com/0/128422/1b9e104b-71ac-9fdd-52ec-7a08770207e0.png)


## 画面分割（Assistant Editor）モードへの切り替えを瞬時に行う
通常の一画面(Standard Editor)モードで、左ペイン(Navigator)のファイルを
**Optionを押しながらタップする**と、
瞬時にAssistant Editorモードに切り替わり、右画面にタップしたファイルを表示することができます。
Interface Builder(.xib, .storyboard)を開きつつ、右画面にソースを表示させるといった操作を比較的簡単に実現できるのでおすすめです！
![optiontap.gif](https://qiita-image-store.s3.amazonaws.com/0/128422/54867635-5f44-a5f6-a648-e858e2c0f444.gif)


また、通常の画面(Standard Editor)モード・画面分割モード・差分・ログ(Version Editor)モードにそれぞれ切り替えるショートカットもあるので、覚えておきましょう。
Standard Editor（一画面）のショートカット：
```Command + Enter```
Assistant Editorのショートカット：
```Command + Option + Enter```
Version Editorのショートカット:
```Command + Option + Shift + Enter```

## Open Quicklyから左画面および右画面を指定して開く
言わずと知れた便利なOpen Quickly（ファイルジャンプ）機能ですが、さらに画面分割時の使い方も覚えておくと、なかなか役に立ちます。

ファイル・クラスなどへのジャンプや検索に便利なOpen Quicklyのショートカット:
（これは知っている方も多いと思いますが）
```Command + Shift + O```

Assistant Editorモードで、Open Quicklyの検索結果を選択しEnterを押すと、デフォルトでは左画面が切り替わりますが、右画面の切り替えも可能です。
Open Quicklyでジャンプするファイルを右画面で開くには、```Option + Enter```でいけます。
![openquickly.gif](https://qiita-image-store.s3.amazonaws.com/0/128422/a478ba56-76b6-eae1-363a-9c1a6ef81863.gif)


## その他のTips
### 左右のペインを閉じるショートカット
画面分割しながらコーディングしようとすると左右のペインは非常に邪魔になることが多いですが、このショートカットを多用すれば、開閉がスムーズに行えます！
左ペイン(Navigator)の開閉： 
```Command + 0```

右ペイン（Utilities）の開閉： 
```Command + Option + 0```

### 下ペインを閉じるショートカット
せっかく左右のペインを閉じたので、下部のデバッグエリアの開閉も覚えておくとbetterです。
下ペイン(Debug area)の開閉:
```Command + Shift + Y```

### 画面分割したファイルのカーソルの行き来（追記: 12/8）
USキーの人は使いやすいですが、JISキーだとちょっとデフォルトの設定だと押しにくそうですね。。。
```Control + ｀(quote)```

また、現在開いている画面を矢印キー選択しながら行き来するには、
```Command + J```
で可能なようです！！
<img width="412" alt="スクリーンショット 2016-12-08 19.04.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/128422/992edf4f-45a3-8fc0-fd7a-2f56cb4a042e.png">


@uc18uc さんコメントありがとうございました！
LogstashをElasticsearchと連携させる時の設定ファイルの書式が5.0で変更になった

設定ファイルが間違っていて、起動できなかったので。

エラーメッセージは `Error: Something is wrong with your configuration.` で、どこが間違っているのか分からなかった。

5.0から書式が変わったようだ。

```bash:変更前
output {
  elasticsearch {
    host => elasticsearch
    port => 9200
  }
}
```

```bash:変更後
output {
  elasticsearch {
    hosts => ["elasticsearch:9200"]
  }
}
```


# 参考
https://github.com/elastic/logstash/issues/2482
CentOS7のシェル上でPythonのバージョン(2.7.5など)だけを取得する

# 環境
* [centos/7](https://atlas.hashicorp.com/centos/boxes/7)

# やりたいこと
以下のような結果が得られる場合に、2.7.5という出力が欲しい。（pyenv installでsystemと同じバージョンをインストールしたかったのです。）

```bash
$ python -V
Python 2.7.5
```

# 結論（コメントいただいたもの）

```bash
python -V 2>&1 | cut -d' ' -f2
```

# 何にはまったか
スペース区切りに見えるので、まずはcutコマンドで取り出せると思っていたのですが。。。

```bash
$ python -V | cut -d' ' -f2
Python 2.7.5
```

いろいろコマンドをいじったところ、コマンドの出力は標準エラー出力に出ているようでした。

コメントをいただく前は中間ファイルを作って、それをcatで出力していましたが、"2>&1"のリダイレクトを使えば不要でしたね。
hubot環境構築手順

MacOSX EI Capitan, CentOS7で構築した。

# 各環境の準備

## nvmのインストール

```
% wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.32.1/install.sh | bash
% nvm install node
% nvm use node
```

## nvmのバージョンアップ

```
% cd ~/.nvm && git pull origin master && git checkout `git describe --abbrev=0 --tags`
```

## Node.jsのインストール

```
% nvm ls-remote
% nvm install 7.1
```

## Hubotのインストール

```
% npm install -g hubot coffee-script
```

# Hubotの雛形を作成

https://github.com/github/hubot/blob/master/docs/index.md
を参考にプロジェクトの雛形を作成する。

```
% npm install -g yo generator-hubot
% mkdir myhubot
% cd myhubot
% yo hubot
適宜質問に答えていく。
途中のBot adapterには「slack」と入力する。
```

# Hubotの起動

```
% bin/hubot
myhubot> ping
myhubot> myhubot ping
myhubot> PONG
``` 

## デバッグできるように起動する

bin/hubotの中身を見て以下のような感じ

```
% coffee --nodejs --debug node_modules/.bin/hubot --name “{botの名前}”
```

# Hubotを本番環境で実行する

## foreverをインストール

```
% npm install -g forever
```

## foreverコマンドの使い方

### 起動

```
% forever start app.js
```

### 停止

```
% forever stop app.js
```

### 再起動

```
% forever restart app.js
```

### foreverで実行しているリスト

```
% forever list
info:    Forever processes running
data:        uid  command       script forever pid   id logfile                 uptime
data:    [0] ioGt /usr/bin/node app.js 39066   39068    /root/.forever/ioGt.log 0:0:0:13.174
```

### ログ

```
% forever logs
info:    Logs for running Forever processes
data:        script logfile
data:    [0] app.js /root/.forever/ioGt.log
```

### 設定確認

```
% forever config
data:    {
data:      root: '/root/.forever',
data:      pidPath: '/root/.forever/pids',
data:      sockPath: '/root/.forever/sock',
data:      loglength: 100,
data:      logstream: false,
data:      columns: [
data:          'uid',
data:          'command',
data:          'script',
data:          'forever',
data:          'pid',
data:          'id',
data:          'logfile',
data:          'uptime'
data:      ]
data:    }
```

# nvmについてその他コマンド(メモ)

インストール済みバージョンの確認
```
% nvm ls
```

バージョンの切り替え
```
% nvm use {バージョン番号}
```

デフォルトバージョンの指定
```
% nvm alias default {バージョン番号}
```
Mackerelプロセス監視設定をする時の注意点

## 公式資料
- プロセス監視の仕様
  - https://mackerel.io/ja/docs/entry/howto/check/process
- Github README
  - https://github.com/mackerelio/go-check-plugins/blob/master/check-procs/README.md

## 設定手順
- mackerel-agentをインストール
    - https://mackerel.io/ja/docs/entry/howto/install-agent
    - /etc/mackerel-agent/mackerel-agentのapikey欄にキー追加を忘れずに
- mackerel公式チェックプラグインをインストール
    - https://mackerel.io/ja/docs/entry/howto/mackerel-check-plugins
- プロセス監視設定
    - https://mackerel.io/ja/docs/entry/howto/check/process
    - vi /etc/mackerel-agent/mackerel-agent.confで以下を追加
- agentの再起動
    - service mackerel-agent restart
     
> [plugin.checks.任意の監視ルール名]
command = "/(check-procsのパス)/check-procs --pattern 検索パターン"

  > ※以下設定例
  > \# Plugin for MongoDB
[plugin.checks.check_alive_mongodb]
command = "/usr/bin/check-procs -u mongo --pattern mongod"

## 設定時の注意点
- **検索パターンに他プロセスがひっかからないようにする**
    - --pattern(-p)はプロセスの実行コマンドに対してパターン検索を行うオプションです。基本的な所ですがここでは確実に対象プロセスが特定できるものにしましょう。
    - 実体験で言うと以下のような事がありました、、、
        - 「/usr/bin/check-procs --pattern mongod」(実行コマンドの中に「mongod」を含むプロセスが1件以上存在する)という設定をしていたら、mongod停止時に、他プロセス「/usr/bin/mackerel-plugin-mongodb」等が残っていて監視にひっかからない。
    - 以下のような方法で回避しています。
        - 起動用ユーザーを作成してユーザー指定(-u)で検索する  
        例)/usr/bin/check-procs -u mongo --pattern mongod
        - 起動時に実行パスを含むようにし、パス名込みでパターン検索を行う
        例)/usr/bin/check-procs --pattern /usr/local/mongodb/bin/mongod
QuartzComposerのインストール

QuartzComposerのインストールで迷ったので書く

下記のURLからダウンロードする
https://developer.apple.com/download/more/

developerに登録してからでないとならない。

ネットで調べると「Graphics Tools」を選べと言われたが、Xcode7までしかない。
Xcode8以降ではAdditional Toolsからインストールできる。
DjangoでHello World

DjangoでHello World | まめも 
http://torokeru.tv/mameblog/?p=35

動かなかったので書き直してみる

```txt
>django-admin startproject myproject
>cd myproject
>python manage.py startapp myapp
```

```py:myproject/settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'myapp',
]
```

```py:myapp/views.py
from django.http import HttpResponse
def main(request):
    return HttpResponse("Hello World!!")
```

```py:urls.py
from django.conf.urls import url
from django.contrib import admin
from myapp import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^$', views.main)
]
```


# 参考

"view must be a callable or a list/tuple in the case of include"
TypeError: view must be a callable or a list/tuple in the case of include() - Google グループ 
https://groups.google.com/forum/#!topic/django-users/Bt8afN3Sd0E
AWS Lambdaで CloudWatch Logsから送られるログデータをデコードする

CloudWatch Logsのログデータは下記のようなJSON形式でLambdaに転送されます。
具体的なログデータはevent['awslogs']['data']で取得できますが、このエンコードされたデータのデコードに少々戸惑ったので記事にしておきます。

```event.json
{
  "awslogs": {
    "data": "H4sIAAAAAAAAAHWPwQqCQBCGX0Xm7EFtK+smZBEUgXoLCdMhFtKV3akI8d0bLYmibvPPN3wz00CJxmQnTO41whwWQRIctmEcB6sQbFC3CjW3XW8kxpOpP+OC22d1Wml1qZkQGtoMsScxaczKN3plG8zlaHIta5KqWsozoTYw3/djzwhpLwivWFGHGpAFe7DL68JlBUk+l7KSN7tCOEJ4M3/qOI49vMHj+zCKdlFqLaU2ZHV2a4Ct/an0/ivdX8oYc1UVX860fQDQiMdxRQEAAA=="
  }
}
```

#動作環境
AWS Lambda (Node.js 4.3)

#実装

結論から言うとbase64によるエンコードのみならずgzipでさらに圧縮がなされているので、Node.js側ではevent['awslogs']['data']に対してbase64でのデコードとgunzipをしてあげれば解決します。
公式ドキュメントにもさらっと書いてあったりもしますが。
http://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/Subscriptions.html

コードは下記の通りです。

```Node.js

const zlib = require('zlib');

//略

function processEvent(event, callback) {
    const base64Logs = new Buffer(event['awslogs']['data'], 'base64');
    zlib.gunzip(base64Logs, function (err, binary) {
        var uncompressedLogs = binary.toString('ascii');
        const slackMessage = {
            channel: slackChannel,
            text: ${uncompressedLogs}
        };
        //略
    });
}
```

ほぼLambdaで既に用意されているCloudWatch Logs用のテンプレートの使い回しになってます。
なので[//略]の部分にはslackにログを通知するための別の記述をしています、今回はデコードのためのコードを説明したいのでここについては省略させてください。

base64によるデコード、gunzipによる解凍もdataを16進数表現で取り扱っているので、gunzipしたデータはtoString('ascii')で文字列に変換する必要があります、もしログに英数字以外が入りうる場合は適宜utf8等に変更してください。

以上になります、参考になれば幸いです。
reform で テーブルのカラムに無い項目をproperty にする方法

# Reform でテーブルのカラムに無い項目をproperty にする方法
reform: https://github.com/apotonick/reform

```ruby
class BarFom < ActiveModel
  attr_accessor :foo
end
```

てきなことを reform でちゃんとやるために

```ruby
...
property :foo, virtual: true
...
```
PPAP with Ruby

# PPAP with Ruby
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">標準出力に「ペン」「アッポー」「パイナッポー」をランダムに出力していって「ペンパイナッポーアッポーペン」が出力されたら終了するプログラム（ズンドコきよし的な</p>&mdash; ふみを (@foooomio) <a href="https://twitter.com/foooomio/status/802397726050635776">2016年11月26日</a></blockquote>
<blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/foooomio">@foooomio</a> ✒、🍎、🍍をだそう</p>&mdash; いわたん@高血圧見習い (@iwata_n) <a href="https://twitter.com/iwata_n/status/802397906074357761">2016年11月26日</a></blockquote>

何番煎じと言われようとかまわない。

## ループ
```rb
PPAP = ["\u2712\ufe0f", "\u{1f34d}\ufe0f", "\u{1f34e}\ufe0f", "\u2712\ufe0f"]

ppap = []

until ppap.last(4) == PPAP do
  ppap << PPAP.sample.tap(&method(:print))
end

puts "ペンパイナッポーアッポーペン"
```

## 再帰
```rb
PPAP = ["\u2712\ufe0f", "\u{1f34d}\ufe0f", "\u{1f34e}\ufe0f", "\u2712\ufe0f"]

def pikotaro(ppap=[])
  return "ペンパイナッポーアッポーペン" if ppap == PPAP
  pikotaro(ppap.last(3) << PPAP.sample.tap(&method(:print)))
end

puts pikotaro
```

## 遅延評価
```rb
PPAP = ["\u2712\ufe0f", "\u{1f34d}\ufe0f", "\u{1f34e}\ufe0f", "\u2712\ufe0f"]

loop
  .lazy
  .map {PPAP.sample.tap(&method(:print))}
  .each_cons(4) {|ppap| break puts "ペンパイナッポーアッポーペン" if ppap == PPAP}
```

# 実行結果

```bash
$ ruby ppap.rb 
🍎️✒️✒️🍎️🍎️✒️🍍️✒️🍍️✒️🍎️✒️✒️🍎️🍍️🍍️✒️🍎️✒️✒️🍎️✒️🍎️✒️✒️🍎️🍎️🍍️✒️🍎️✒️✒️✒️✒️✒️🍎️✒️✒️🍎️🍍️🍍️🍎️✒️🍍️🍍️✒️✒️🍍️✒️✒️✒️✒️✒️✒️🍎️🍍️🍎️✒️✒️✒️✒️🍎️🍍️🍎️🍎️🍎️🍍️🍍️🍎️✒️✒️🍍️✒️🍎️🍎️✒️✒️🍎️✒️🍍️🍍️🍎️🍍️🍎️🍍️✒️🍎️🍍️🍎️✒️🍎️🍍️✒️✒️🍍️🍍️✒️✒️✒️✒️🍎️✒️🍍️✒️✒️🍎️✒️🍍️🍍️✒️🍍️✒️🍍️✒️🍍️🍎️🍍️✒️✒️✒️🍎️✒️✒️✒️✒️✒️✒️🍍️🍍️✒️🍎️🍎️✒️✒️🍎️✒️🍍️✒️🍍️🍎️✒️ペンパイナッポーアッポーペン
```

# 参考
- [ズンドコキヨシ with Ruby - Qiita](http://qiita.com/yancya/items/1167e9764719151d0c80)
- [ズンドコキヨシ with Ruby - Qiita](http://qiita.com/ucmsky/items/8a520dd8be324389bf6e)
- [Rubyのソースコードに絵文字を16進数で書く方法](http://qiita.com/yoshiokatsuneo@github/items/05149c08e768530e8bee)
rbenvでrubyをインストールしようとしたらエラーになった


## 環境
macOS Sierra (10.12.1)

## rbenv installでエラーに
エラーログは次の通り。

```
$ rbenv install 2.3.3
Downloading ruby-2.3.3.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.3.tar.bz2
Installing ruby-2.3.3...

BUILD FAILED (OS X 10.12.1 using ruby-build 20161121)

Inspect or clean up the working tree at /var/folders/6v/qz5j7l351rn85l17gz3v0c6r0000gn/T/ruby-build.20161126183610.19308
Results logged to /var/folders/6v/qz5j7l351rn85l17gz3v0c6r0000gn/T/ruby-build.20161126183610.19308.log

Last 10 log lines:
/var/folders/6v/qz5j7l351rn85l17gz3v0c6r0000gn/T/ruby-build.20161126183610.19308/ruby-2.3.3 /var/folders/6v/qz5j7l351rn85l17gz3v0c6r0000gn/T/ruby-build.20161126183610.19308 ~
checking for ruby... /usr/local/bin/ruby
config.guess already exists
config.sub already exists
checking build system type... x86_64-apple-darwin16.1.0
checking host system type... x86_64-apple-darwin16.1.0
checking target system type... x86_64-apple-darwin16.1.0
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
configure: error: clang version 3.0 or later is required
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun

```

## xcode-selectをインストールしたらOK
xcode-selectをインストールしたらインストールしたらrbenv installもできるようになった。

```
$ xcode-select --install
$ rbenv install 2.3.3
```
Go色々な機能実装(自分用メモ)

#実際に使った機能を忘れないように書き残す

##func random
```go

func random(length int) string {
	const base = 36
	size := big.NewInt(base)
	n := make([]byte, length)
	for i := range n {
		c, _ := rand.Int(rand.Reader, size)
		n[i] = strconv.FormatInt(c.Int64(), base)[0]
	}
	return string(n)
}
```
###使い方
```go
randomNum := random(10)
```

##func contains
```go
func contains(arr []string, str string) bool{
  for _, v := range arr{
    if v == str{
      return true
    }
  }
  return false
}
```
###使い方
```go
arry := []string{"a", "b", "c", "d"}
if contains(arry, "a") {
   fmt.Println("配列にaがある")
}else {
   fmt.Println("配列にaはない")
}
```
***※containsはstring型のみにしか使えない***

今後も調べて使ってみたfuncを追加していこう！

もっといい書き方がありましたら教えてください！
SQLのインサートとバルクインサート

# インサート
1件のみデータをインサートする場合、下記のようなクエリになります。

```sql
INSERT INTO user(name) values('test1');
```

この書き方で複数インサートするには、複数回インサート文を記述すればできます。

```sql
INSERT INTO user(name) values('test1');
INSERT INTO user(name) values('test2');
INSERT INTO user(name) values('test3');
```

# バルクインサート
複数行のデータをインサートする際、1回のsql文でインサートしたいって時に使えます。
バルクインサートでは1回のトランザクションでインサートすることができるため、
トランザクションを発行して何回もインサート処理をループさせるよりもコンテキストスイッチの回数が減るため実行速度が速いです。

```sql
INSERT INTO user values('test4'), ('test5'), ('test6');
```

### コンテキストスイッチ
wikiによると、コンテキストスイッチとは

```
複数のプロセスが1つのCPUを共有できるように、CPUの状態(コンテキスト)を保存したり復元したりする過程のことである
```
実行中のプロセスから他のプロセスを実行するため、プロセスの切り替えを行うときにコンテキストスイッチが発生する。

## プログラムを書くときに意識をした方が良い
細かい文法などはわからなくて良いのですが、下記のようなプログラムをかくと `$users` が100件あれば100回のインサート、1000件あれば1000件のインサートが行われます。

```php
foreach ($users as $user) {
    // 1件ずつuserを作成してインサートをしている
    Users::create([
        'name' => $user->name,
        'hoge' => $user->hoge
    ]);
}
```

上記のコードを下記のように変更すれば、foreachの計算量は変わりませんが、インサートは1回ですみます。

```php
$data = [];
// まとめてインサートをするデータを先に作成している
foreach ($users as $user) {
    $data[] = [
        'name' => $user->name,
        'hoge' => $user->hoge
    ];
}

// インサートは1回でOK
DB::table('users')->insert($data);
```

基本的に1件ずつ処理をしないといけない理由がない場合には、まとめてできないかを考えると良いと思います。

### 計算量を意識する
下記の記事が参考になります。
[開発新卒に捧ぐ、基本のアルゴリズムと計算量](https://www.techscore.com/blog/2016/08/08/%E9%96%8B%E7%99%BA%E6%96%B0%E5%8D%92%E3%81%AB%E6%8D%A7%E3%81%90%E3%80%81%E5%9F%BA%E6%9C%AC%E3%81%AE%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%81%A8%E8%A8%88%E7%AE%97%E9%87%8F/)

## csvファイルのデータをインポートする
例えばcsvファイルのデータをすべてデータベースのテーブルにインポートする際にもバルクインサートを使用することができる。

```sql
BULK INSERT テーブル名
FROM 'ファイルのパス'
WITH (FIELDTERMINATOR = '区切り文字',
    ROWTERMINATOR = '改行文字列'
);
```

##ちなみに
csvファイルのデータをインポートする方法として、バルクインサートの他にbcp(bulk copy program)というコマンドが存在する。
bcpではSQLServerのテーブルにインポートしたり、データをテーブルからデータファイルにエクスポートしたりすることができる。
あとバルクアップデートもありますので、まとめてできそうなのに1件ずつ処理をしていることがあれば検索してみてください。
帯域制限モジュール mod_qos

## mod_qos
http://mod-qos.sourceforge.net/
QoS (Quality of Service) の制御を可能とするモジュール。
Slowloris 攻撃の対策に Lynis にサジェストされる。

## インストール
```
yum install epel-release && yum update
yum install mod_qos
```

### 公式のサンプル
```bash
cat << "_EOF_" >> /etc/httpd/conf.modules.d/10-mod_qos.conf

QS_ErrorPage                  /error-docs/qs_error.html

# restricts max concurrent requests for any location which has no
# individual rule:
QS_LocRequestLimitDefault                              200

# limits access to *.gif files to 100 concurrent requests:
QS_LocRequestLimitMatch       "^.*\.gif$"              100

# limits concurrent requests to the locations /images and /app/a:
QS_LocRequestLimit            /images                  100
QS_LocRequestLimit            /app/a                   300
# limits download bandwidth to 5Mbit/sec:
QS_LocKBytesPerSecLimit       /app/a                   640

# two locations (/app/b and /app/c) representing a single application:
QS_LocRequestLimitMatch       "^(/app/b/|/app/c/).*$"  300


# allows the application to nominate VIP users by sending a
# "mod-qos-vip" HTTP response header:
QS_VipHeaderName              mod-qos-vip
QS_SessionKey                 na&5san-sB.F4_0a=%D200ahLK1

<Location /qos>
   SetHandler qos-viewer
</Location>
<Location /qos/console>
   SetHandler qos-console
</Location>
_EOF_
```

## コマンド
/usr/bin 配下に以下のコマンドがインストールされる。

* qscheck
    * Monitor programm testing the TCP connectivity to servers.
* qsfilter2
    * access/audit ログから QS_Permit* ディレクティブとルールパターンを作成するルールジェネレーター

* qsgeo
    * Adds the country code for the client IP address within a log file.
* qsgrep
    * Searches a file for a pattern and prints the data in a new format.
* qshead
    * an utility reading from stdin and printing all lines to stdout until reaching the defined pattern.
* qslogger
    * Shell command interface to the syslog(3) system log module.
* qspng
    * Creates graphics (png images) from the output of qslog.
* qssign
    * A log data integrity check tool. It reads log data from stdin (pipe) and writes the signed data to stdout adding a sequence number and signatur to ever log line.
    * qssign.rb is a Logstash  filter plugin which may be used to verify the signatures of log messages in real time.

* qstail
    * Shows the end of a log file beginning at a defined pattern.
スカラ・サブクエリ


サブクエリに対してスカラ・サブクエリは、「必ず 1 行 1 列だけの戻り値を返す」という制限をつけたサブクエリのことです。スカラ・サブクエリの戻り値が単一の値ということは、この戻り値を比較演算子による値の比較に利用できます。

※スカラは単一という意味。

スカラ・サブクエリを書ける場所は、WHERE 句などでの比較演算子の入力部分だけに限りません。基本的に、スカラ値が書けるところにはどこにでも書けます。ということは、定数や列名を書くことの出来る場所全てとなり、SELECT 句でも GROUP  BY 句でも HAVING句でも ORDER BY 句でも、ほとんどあらゆる場所に書くことが可能です。

- 例1 :主キーでしぼったスカラサブクエリ

```sql
select d.DEPARTMENT_NAME from hr.DEPARTMENTS d
where d.DEPARTMENT_ID = 10
```

- 例2 :rownum=1を指定したスカラサブクエリ

```sql
select d.DEPARTMENT_NAME from hr.DEPARTMENTS d
where rownum = 1
```

上の検索結果はどちらも以下。1列だけの値を1行だけ返しているのでこれらはスカラサブクエリであります。



|DEPARTMENT_NAME|
|:-:|
|Administration|

### スカラ・サブクエリを使うときの注意点

スカラ・サブクエリを使うときに最も注意しなければならないことは、「絶対にサブクエリが複数行を返さないようにする」ことです。というのも、サブクエリが複数行を返す時点で既にそれはスカラ・サブクエリではなく、ただのサブクエリになってしまいます。すると、=、<>といったスカラ値を入力する演算子も利用出来ませんし、SELECT 句などに書くことも出来なくなります。

スカラサブクエリというのは… 少し妙な表現かもしれませんが，「デリケートな」技術です。必ず単一の値（つまり1行だけ）を返すようにサブクエリ内の条件を設定しなければ，エラーになります。それは195ページからの「存在の階層」節で見たとおりです。

Itemsテーブルにおいて，たまたまピーマンの値段が200円だったとしたら― たまたま商品グループ単位で最高値の商品が1つになる，という状況になります。こういうケースだけを想定してサブクエリを使っていると，それまでは偶然動作していたSQL文が，ある日突然「このサブクエリは複数行を返します」というエラーを引き起こすことになります。だから，スカラサブクエリを使うときは，戻り値が本当に，いつでも，常に，1行であることを，入念にチェックしてください。でないと，システムのカットオーバー後しばらくして，間違いなくクライアントから一報を受けることになるでしょう。

スカラサブクエリについてのもうひとつの注意点は，パフォーマンスに関するものです。一般的に，SELECT句においてスカラサブクエリを使うのは，かなりコストの高い方法です。したがって，相関サブクエリとして使う場合は，サブクエリ内の結合条件でなるべくインデックスを利用できるよう配慮することが重要です。
機械学習関連ブックマークなど

機械学習関連ブックマークなど
============================

[機械学習関連情報の収集と分類(構想)](http://qiita.com/suchowan/items/459062590f7134dfc138)のⒹに相当するブックマークなどをGitHubに置いてみました(→ https://github.com/suchowan/bookmarks )。

[ショートカット・ディレクトリとプレインテキストの変換](http://qiita.com/suchowan/items/6556756d2e816c7255b7)にあるスクリプトで扱う前提のプレインテキストです。

## 機械学習関連 - compueter.url.txt

より大きなブックマークツリーから

```computer.filter.txt
Computer/トピック
```

でフィルターして得られたものです。

このためツリーの幹に近い“Computer/トピック”が冗長になっています。

![こんなふうにして作ったもの](https://qiita-image-store.s3.amazonaws.com/0/144985/95d8f8f2-831c-19b8-7c67-de2973a7b0f6.png)

## その他 - sig.url.txt

より大きなブックマークツリーから

```sig.filter.txt
Computer/OS
Computer/ハードウェア
Entertainment/ゲーム
Entertainment/ハードウェア
Science
SIG/暦
SIG/単位・進法
Social
```

のようなフィルターでフィルターして得られたものです。

こちらのほうは機械学習とは直接関連していませんのであしからず。

# スクリプト

下記のようなデータフローで情報を加工していくツール群です。

![データフロー](https://github.com/suchowan/bookmarks/raw/master/scripts/data_flow.png)

[機械学習関連情報の収集と分類(構想)](http://qiita.com/suchowan/items/459062590f7134dfc138)作成時点とはかなり変わっているのでご注意ください。

・キーワードを管理するという概念が追加されています。これにより例えばサービスの名称とその提供会社を関連付けられるようにしました。

・❻ crawl が ⒺElasticsearch を参照しないのは、Fess が古いコンテンツを Expire させてしまう仕様のためです。

・❼～❾の処理が細分化されているのは、ハイパーパラメータのチューニング時に逐次中間成果物を残す方が効率が良いからです。

・❾ digest はまだうまく動きません。扱う形態素の最少出現頻度を20にしないとメモリが足りないのですが、そうすると扱う形態素を含まない文が大量に出てしまうからです。

各ツールの詳細はこちらの[pdf](https://github.com/suchowan/bookmarks/raw/master/scripts/tools.pdf)をご覧ください。
MarkdownをGFMでプレビュー in VSCode

VSCodeでマークダウンを編集するとデフォルトでプレビューもできて便利ですよね。

しかし、GitHubのREADMEなんかを書いている時に悲しみが。
そう、VSCodeはGFM(GitHub Flavored Markdown)に対応していないのです。
普段は気にならないレベルですが、タスクリストなどを書いているときにモヤっとします。

### そこで
GFMでプレビューする拡張機能を作りました。
[vscode-gfm-preview](https://marketplace.visualstudio.com/items/tomoki1207.vscode-gfm-preview)
![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/111100/a7ebc95d-4353-959f-c8cc-3b88c621db3e.png)
基本的にはビルトインのMarkdownプレビューと同じように動くはずです。(~~ソースコピペしているので~~)

### 注意点
内部で GitHub API を使用していますので、オフラインでは使えません。
このAPIは、認証なし状態で60回/h、認証した状態で5,000回/h のリクエストを投げられます。(2016/11月現在)
拡張機能の設定で認証情報を入れられるので、頻繁にプレビューしたい方はユーザ名とパスワードを設定してください。
未認証で使いたい方や、リクエスト回数を節約したい方向けに、ファイル保存時のみプレビューを更新する設定を用意してありますので必要に応じて。

※未認証で使っていて回数が危なそうだからと言って途中で認証しても、残り回数はリセットされない様子です。その場合はリセットされるまでおとなしく待ちましょう。

### 参考
https://developer.github.com/v3/markdown/
https://developer.github.com/guides/getting-started/#authentication
https://developer.github.com/v3/#rate-limiting