OmniAICreator/Qiita-1.07M huggingface dataset:
Typical colors to suit the Lion Dance Costume are red

Children in China, and around the world, have their own versions of the Lion Dance for New Year and other celebrations, such as weddings, graduations, family reunions, etc. <a href="http://www.liondancecostume.com/shop/">Lion Dance Shop</a> and Dragon are more commonly associated with martial arts schools. If you are interested in participating or just watching a performance, checks associations Kung Fu and Martial Arts in your neighborhood.The dance is traditionally accompanied by a drum, one or more pairs of cymbals and a gong; the owners of the houses or premises that comparsa of dancers visit accustomed to burning firecrackers, representing the next good luck. In the days of the Chinese Lunar New Year practitioners from different schools of Chinese martial arts take to the streets to greet with their dances the neighbors, which are visited lion standing at the door of your home or commercial establishment include a red envelope with money inside, accompanied by a lettuce. This symbolizes long life and wealth, augurs well for the year as its Cantonese pronunciation Sang Choy, has a sound very similar to these words.
<img src="http://www.liondancecostume.com/wp-content/uploads/2016/08/southern-lion-dance-costume-red-gold-04.jpg" alt="Lion Dance Costume">
Here -> http://www.liondancecostume.com/ you will find an excellent assortment of costumes for the Lion Dance for both children and adults. Lion costumes include the heads and tails and come in different sizes

Typical colors to suit the <a href="http://www.liondancecostume.com/">Lion Dance Costume</a> are red, representing courage, green, representing friendship and goodwill, and gold, which represents vitality and a dynamic spirit.
In the guise of the lion’s head is no levers with which the dancer controls the eyes, mouth and ears of the Lion. On his forehead, the Lion normally carries a mirror, in order that evil spirits panic and withdraw seeing his own image reflected.
<img src="http://www.liondancecostume.com/wp-content/uploads/2016/08/southern-lion-dance-costume-redgold-3.jpg" alt="Chinese Lion Costume">
Lion heads can also be used as cute decorations for the New Year.
ethereumを試してみる

ethereumをgo言語のクライアント(geth)で試してみる。
仮想環境（vagrant利用）を利用します。

## 必要なソフトウエェア

+ Vagrant

Vagrantの[公式HP](https://www.vagrantup.com/ "")よりインストール。

+ VirtualBox

VirtualBoxの[公式HP](https://www.virtualbox.org/ "")よりインストール。

+ Vagrant Cloudのアカウント登録

## Boxのダウンロード

ネットよりgethがセットアップされたBoxイメージをセットアップ

```bash
### Vagrant Cloudへログイン
$ vagrant login
### Vagrant Cloudへpushした、Ethereumのイメージで仮想化環境設定ファイル初期化
$ vagrant init takeshi_hirosue/geth
### 仮想環境起動
$ vagrant up --provider virtualbox
```

## 仮想環境へ接続して、作業フォルダに移動

ブロックチェーンの設定ファイルが配置されています。

```
$ vagrant ssh
Welcome to Ubuntu 15.04 (GNU/Linux 3.19.0-15-generic x86_64)

 * Documentation:  https://help.ubuntu.com/
Your Ubuntu release is not supported anymore.
For upgrade information, please visit:
http://www.ubuntu.com/releaseendoflife

New release '15.10' available.
Run 'do-release-upgrade' to upgrade to it.

Last login: Fri Apr 14 02:20:36 2017 from 10.0.2.2
$ cd ethereum/
$ cat genesis.json
{
  "nonce": "0x0000000000000042",
    "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "difficulty": "0x01",
    "coinbase": "0x0000000000000000000000000000000000000000",
    "timestamp": "0x00",
    "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "extraData": "Genesis Block",
    "gasLimit": "0xffffffffffff"
}
```

## ブロックチェーン初期化

```
geth --datadir ./private init ./genesis.json
```

## クライアント起動

```
geth --datadir ./private --networkid 123456 --nodiscover --maxpeers 0 --rpc --rpcapi eth,net,web3,personal,admin,miner --minerthreads 1 --rpccorsdomain "*" console
```
## 初期アカウント作成

コンソールで以下コマンドでアカウントを作成します。
"pass1"はパスフレーズです。

```
> personal.newAccount("pass1")
```

## コンパイラ設定（Solidify）

Solidityをコンパイラとして設定します。
取得したイメージには以下パスにバイナリファイルが配置されています。

```
> admin.setSolc("/usr/local/bin/solc")
"solc, the solidity compiler commandline interface\nVersion: 0.4.10+commit.9e8cc01b.Linux.g++\n"
> eth.getCompilers()
["Solidity"]
```

以上でブロックチェーンの初期設定は終了です。

## クライアント起動（二度目以降）

+ トランザクション送信の際のロックの解除（--unlock）
+ マイニングを同時にスタートさせています(--mine)
+ コンソール表示したい際は console を末尾に指定してください。

```
geth --datadir ./private --networkid 123456 --nodiscover --maxpeers 0 --rpc --rpcapi eth,net,web3,personal,admin,miner --minerthreads 1 --rpccorsdomain "*" --unlock 0 --mine
```
WIP commit の消し忘れを教えてくれる君を作った

作業ブランチ切ったら，最初に `git commit --allow-empty -m "[WIP]"` してプルリク作ってから作業を始めたい
でもこのWIPコミットを消し忘れると後々はずかしいおもいをするので，教えてくれる君をつくった

# tl;dr
```bash:~/.git_template/hooks/pre-commit
#!/bin/bash
if git log -1 --oneline --pretty=format:'%s' | grep -q -e '^\[WIP\]'
then
  last_commit=`git log -1 --date=raw --pretty=format:"%ad"`
  current_commit=$GIT_AUTHOR_DATE
  if echo "$current_commit" | grep -q -v "$last_commit"
  then
    echo "last commit is wip commit!!"
    exit 1
  fi
fi
```
# ぜんてい
[Git Hooks](https://git-scm.com/book/en/v1/Customizing-Git-Git-Hooks) の pre-commit にコミットを hook した時の処理を記述する
参考: [gitのhooksを管理する(自分用テンプレートを使う)](http://qiita.com/quattro_4/items/59fdf8b9aa9ef48ecbdf)

# ほうしん
1. 直前のコミットのコミットメッセージが `[WIP]` ではじまってて
2. hook したコミットが amend してなかったら
3. アラートだして `exit 1` する

## 1. 直前のコミットのコミットメッセージ
```bash
$ git log -1 --oneline --pretty=format:'%s' | grep -e '^\[WIP\]'
```
`--prety=format` のあたりは [git logのフォーマットを指定する](http://qiita.com/harukasan/items/9149542584385e8dea75) を参考に

## 2. amendしてるかどうか
amend すると， hook したコミットの author date は直前のコミットの author date になるので，2つが一致しているかどうかをみます
### 直前のコミットの author date
前項を参考に

```bash
$ git log -1 --date=raw --pretty=format:"%ad"
1491989538 +0900
```
### hook したコミットの auther date
[GIT_AUTHOR_DATE](https://git-scm.com/book/gr/v2/Git-Internals-Environment-Variables#_committing) でもってこれます
が，これをechoしてみると，

```bash:.git/hooks/pre-commit

#!/bin/bash

echo $GIT_AUTHOR_DATE
exit 1
```
```bash
$ git commit --allow-empty -m "hoge"
@1491995878 +0900
```
文頭に `@` がついてしまっているので， 比較ではなく `grep` をつかいます

```bash
last_commit=`git log -1 --date=raw --pretty=format:"%ad"`
current_commit=$GIT_AUTHOR_DATE
echo "$last_commit" | grep -q -v "$current_commit"
```

## 3. `exit 1` する
します

```bash
if echo "$current_commit" | grep -q -v "$last_commit"
then
  echo "last commit is wip commit!!"
  exit 1
fi
```
【JavaScript】join基礎

JavaScriptの勉強の備忘録として書き留めておきます。

#join
配列の各要素をまとめてひとつの文字列を作りたい時に使う。
第1引数はセパレータで、デフォルトは「,」になっている。

例えば下記のようにliを生成できます。（参考：オライリー「初めてのJavaScript」）

```js
const team = ["Jin", "Ryuta", "Rysk"];
const html = '<ul><li>' + team.join('</li><li>') + '</li></ul>';
console.log(html); //<ul><li>Jin</li><li>Ryuta</li><li>Rysk</li></ul>
```

イタリア語の慣用句を使って、文字列をつなげるバージョンも試してみました。

```js
const formula = "cafe, sigaretta, caca";
const array = ["cafe", "sigaretta", "caca"];
const arrayJoined = array.join(', ');
if (arrayJoined === formula) console.log("vai al bagno!"); //vai al bagno!
```
【JavaScript】reduce基礎：配列に入ってる数値を順に引いていく

JavaScriptの勉強の備忘録として書き留めておきます。

#reduce

配列全体を変換する。例えば全要素の合計を出したり、平均値を出したり出来る。
結果がアキュムレータに入り、それが戻り値となる。
配列の第一要素がアキュムレータの初期値になる場合は、第二引数は省略できる。

(a,w) => の部分はアロー関数で、書き換えるとfunction(a,w){}。

```
//100から1-9までの数字を順に引いた結果を出す。
//for文で1-9を足して１００から引いた結果を計算し、それと等しければtrueと表示。

const arrMinus = [1,2,3,4,5,6,7,8,9];
const resultR = arrMinus.reduce((a,m) => a -= m, 100);
console.log(resultR);

let count = 0;
for(i = 1; i < 10; i++) count = count + i;
console.log(count);
const resultC = 100 - count;
console.log(resultC);

if(resultR === resultC) console.log(true);
```
Tsungを積んだDockerで負荷テストを行う


Tsungをローカルに入れるのがめんどくさかったので、有志が作ったTsungのDockerイメージを利用して負荷テストを行う


環境
---

* ローカル(Mac）
	* Docker（17.03.1-ce）

Tsungを使ったテストで利用したDockerイメージ
---

* DockerHub
	* https://hub.docker.com/r/ddragosd/tsung-docker/
* Github
	* https://github.com/ddragosd/tsung-docker

以下で導入

```
$ docker pull ddragosd/tsung-docker
```


必要なもの
---

* テスト記述ファイル


早速実行
---


```
docker run \
   -v テストファイルが置いてあるホストのパス:/usr/local/tsung ddragosd/tsung-docker:latest \
   -f /usr/local/tsung/テストファイル名 \
   start
   
```

もっと詳しいことは、Githubページ参照、もしくはDockerHubページを参照


テストを実行するとマウントしたホストのディレクトリに結果が出力される

HTMLファイルも出力されるので、簡単に結果を確認できる

![スクリーンショット 2017-04-14 11.06.59.png](https://qiita-image-store.s3.amazonaws.com/0/18331/48c16cf0-87cf-fefa-42a7-e309c2125088.png "スクリーンショット 2017-04-14 11.06.59.png")



（例）テスト記述ファイル
---

```
<?xml version="1.0"?>
<!DOCTYPE tsung SYSTEM "/opt/erlang/R16B03-1/share/tsung/tsung-1.0.dtd">
<tsung loglevel="notice" version="1.0">
  <clients>
    <client host="localhost" cpu="1" use_controller_vm="true" />
  </clients>
  <servers>
    <server host="テストサーバー" port="80" type="tcp"></server>
  </servers>
  <load>
   <arrivalphase phase="1" duration="180" unit="second">
     <users interarrival="2" unit="second"></users>
   </arrivalphase>
  </load>
  <options>
    <option type="ts_http" name="user_agent" >
      <user_agent probability="100">Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.152 Safari/537.36</user_agent>
   </option>
   <option name="connect_timeout" value="5000" />
  </options>
  <sessions>
    <session name="attack" probability="100" type="ts_http">
      <request>
        <http url="URL（クエリーがある場合は&を変換しておくこと）"
          method="GET" version="1.1" >
        </http>
      </request>
    </session>
  </sessions>
</tsung>

```

特定のパスに負荷をかけることがしたかったので、とても簡単な記述（割と適当）
測定データの選択

# これなに
あなたは、メーカーの検査技師だ。あるセンサーから得られた、100個の計測データを持っている。
諸事情により、この計測データが、**「ばらつく可能性があること」**を示したい。
100個の中から10個を選び、分散を最大化したい。
ただし、センサーが正常であることは言いたいので、**「平均値は正確」**になるようにしたい。

# Pythonでやってみる
## 測定データ作成
乱数で測定データを作成する。

```py3;python3
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np, pandas as pd
np.random.seed(1)
測定データ = np.random.normal(50,1,100)
plt.hist(測定データ)
print('標準偏差', 測定データ.std())
>>>
標準偏差 0.885156213832
```

![image](https://qiita-image-store.s3.amazonaws.com/0/13955/d0375850-3369-3322-9fbf-e67d2ba04d0a.png)

## 数理最適化で解く
分散を最大化しよう。通常だと、2次整数最適化になり解きづらい。
平均値は正確だと仮定すると、$(値ー平均)^2$は、固定値になるので、モデルは、線形すなわち混合整数最適化となる。

```py3;python3
from pulp import *
from ortoolpy import addbinvars
選択数 = 10
eps = 0.0001

m = LpProblem(sense=LpMaximize)
x = addbinvars(len(測定データ))
m += lpDot((測定データ-50)**2, x)
m += lpSum(x) == 選択数
e = lpDot(測定データ, x) / 選択数
m += 50-eps <= e
m +=           e <= 50+eps
m.solve()
%time m.solve() # 求解
r = np.vectorize(value)(x).astype(int) # 結果
print(LpStatus[m.status])
>>>
Wall time: 181 ms
Optimal
```

```py3;python3
print('平均', 測定データ[r>0].mean())
print('標準偏差', 測定データ[r>0].std())
>>>
平均 49.9999119632
標準偏差 1.82811635001
```

平均は正確で、標準偏差は元の倍以上のデータを選択できた。

以上
Proverifを導入(MacとWindows編)

# 自動検証ツール ProVerifを導入する

インストールするのに結構時間がかかってしまったのでメモ

## ProVerif とは

[こちら](http://qiita.com/yyu/items/f35f24516fd1776c19d9)の記事に書いてありますが，セキュリティプロトコルを形式検証するツールとなっております．

## Windowsへのインストール

インストールについては[ドキュメント](http://prosecco.gforge.inria.fr/personal/bblanche/proverif/manual.pdf)の"Instalation"を確認するとすぐにできると思います．

ダウンロードは[ここから](http://prosecco.gforge.inria.fr/personal/bblanche/proverif/)どうぞ

あとはファイルを解凍して，インストールでok

## Mac OS へのインストール

本編

[ドキュメント](http://prosecco.gforge.inria.fr/personal/bblanche/proverif/manual.pdf)

こちらは少し苦労したので，メモを兼ねてます．
ここでドキュメントの通りに終了すれば問題ないですが，私は

```
ocamlyacc command not found
ocamllex command not found
```
のようなエラーが出力されました．

どうやらProVerifに利用するソフトウェア群を自動インストールするためのパッケージマネージャーがインストールされていないようです．

私は"ocamllex"をインストールするだけで解決できてしまったので，
以下に方法を示します(実は[ここ](https://github.com/camlspotter/ocaml-zippy-tutorial-in-japanese/blob/master/t/install.md)に書いてあったり..)．

### ocamllex導入編

1.  まずは[本家](http://ocaml.jp/%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E6%96%B9%E6%B3%95#content_1_2)からバイナリファイルをダウンロード

2.  解凍&実行

```
$ tar -xzf ocaml-4.03.0.tar.gz
```

解凍後のフォルダへ移動しスクリプトを実行

```
$ cd ocaml-4.03.0
$ ./configure --prefix <プリフィクス> 
...
$ make world.opt
...
$ make install
...
```

### ProVerif Build編

解凍

```
$ tar -xzf proverif1.96.tar.gz
```

Build

```
$ cd proverif1.96
$ ./build
```

実行

サンプルファイルとして，hello.pvを作成します．

```
free c : ch annel .
free Cocks : b i t s t r i n g [private ] .
free RSA: b i t s t r i n g [ private ] .

process
out ( c ,RSA ) ;
0
```

proverifで実行

```
$ proverif hello.pv 
```

以上!
あとはお好みでPATH通しましょう!

###### 余談
ocamllexはhomebrewからでもインストールできるようです．参考は[こちら](http://qiita.com/oshuya/items/dd0faa707c5baf54249d)

### Ubuntu 編

[ここ](http://qiita.com/SUZUKI_Masaya/items/cf861f07281a51ca7a4a#_reference-7638b55f79c46d9db3d9)
ogpの設定

ogpを書くことがあったのでメモ

##ogpとは
「Open Graph protocol」の略称
snsでシェアされた時の写真や、説明の表示方法を指定する仕組み。

##設定
(ogpというより、head内書き方)

```
<head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# twitter: http://ogp.me/ns/twitter#">
        <meta charset="utf-8">
        <title>サイトタイトル</title>
        <meta property="og:type" content="website" />
        <meta property="og:url" content="https://shikumi-zukuri.com" />
        <meta property="og:image" content="https://shikumi-zukuri.com/img/ogp.png" />
        <meta property="og:site_name" content="サイトの名前" />
        <meta property="og:description" content="サイトの説明" />
        <meta property="fb:app_id" content="fb_app_ID" />
        <meta name="twitter:card" content="summary" />
        <meta name="twitter:site" content="@yourtwitteraccount" />
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <link rel="stylesheet" href="css/normalize.css">
        <link rel="stylesheet" href="css/main.css">
 </head>
```

###prefix

```<head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# article: http://ogp.me/ns/article#">```

このprefixのいまいち分かっていない。
おそらく、ogや、fb、twitterというタグをhead内で使えるようにする為じゃないかなと。
これにより、ogpのサーバに問い合わせるという。

http://girigiribauer.com/archives/860/

###参考
https://ferret-plus.com/610

facebook app idの取得方法
https://blog.sixapart.jp/2012-04/fb-app-id.html

ogp本家
http://ogp.me
thisは呼び出しコンテクスト（invocation context)と呼ぶのが正しい。（読書メモ）

&nbsp;&nbsp;目下、とある業務にフロントエンジニアとして関わっており、日々、ReactやらReduxやらにお世話になっており、こういうトンデモなく便利で強力なものを使えば使うほど、基礎力強化の必要性を感じている今日この頃。
&nbsp;&nbsp;そこで、[「開眼！JavaScript」を読了](http://qiita.com/junh68/items/5aee04682f95f2354398)したら、その次に読むといいらしい[「JavaScript Ninjaの極意」]
(https://www.amazon.co.jp/dp/4798128457)を読みはじめ、さっそく覚えておきたい箇所があったのでメモ。
&nbsp;&nbsp;以下、同著 3-3 関数の呼び出し　P.52 からの引用

> this パラメータが指し示すものは、実際には（Javaのように)その関数が宣言された方法によって定義されるのではなく、その関数が呼び出された方法によって定義される。だから thisは **呼び出しコンテクスト（invocation context)**と呼ぶのが正しい。※

> ※[訳注] 事実、David Flanagan の「JavaScript 第６版」（村上列訳、オライリー・ジャパン、2012年）では、原著の英文も訳文も、このように書かれている（同著の第８章の冒頭部分を参照）。本書でも、「関数コンテクスト」（function context)という呼び方を排して、「呼び出しコンテクスト」という訳語で統一した。

&nbsp;&nbsp;うおぉぉ。Reactの前にさんざん世話になったJQueryの作者にそう言われたら、「御意」と答えるしかない。
VC++で'std::_Copy_impl': Function call with parameters that may be unsafe と言われたときの対処

VC++でこんな感じのコードをコンパイルしたとき

```
void Func(int* dest, int size)
{
  std::vector<int> src(size);
  std::copy(src.cbegin(), src.cend(), dst);
}
```

以下のような警告文が出てきたときの対処方法。

```
'std::_Copy_impl': Function call with parameters that may be unsafe 
- this call relies on the caller to check that the passed values are correct.
```

`std::copy`にイテレータではなくポインタを渡していたことが原因でした。
配列であり、そのサイズもわかっているなら以下のようにすることでイテレータに変換できるようです。

```
std::copy(src.cbegin(), src.cend(), stdext::checked_array_iterator<int*>(dst, size));
```

#参考サイト
[Microsoft Developer Network - checked_array_iterator クラス](https://msdn.microsoft.com/ja-jp/library/aa985928.aspx)
GoogleCloudPlatform上でスケールするJupyter環境を構築する

下記公式ページにDataProcを利用したJupyter環境について手順があるので、それを元に実際にGCP上でスケールするJupyter環境を構築してみた。公式ページではSOCKSを利用しているが、今回は単純にポートフォワードでJupyter環境に接続し動作確認を行った。
https://cloud.google.com/dataproc/docs/tutorials/jupyter-notebook?hl=ja

# CloudDataprocクラスタを作成する
CloudShellから以下のコマンドを実行し、CloudDataprocクラスタを作成する。

```
$ gcloud dataproc clusters create jupyter-cluster --project $PROJECT --bucket $MYBUCKET --initialization-actions gs://dataproc-initialization-actions/jupyter/jupyter.sh
```

以下のコマンドでクラスタが正常に起動していることを確認。

```
$ gcloud dataproc clusters list
NAME             WORKER_COUNT  STATUS   ZONE
jupyter-cluster  2             RUNNING  us-central1-a
```

クラスタのホスト名を確認

```
$ gcloud dataproc clusters describe jupyter-cluster
...
  masterConfig:
  ...
    instanceNames:
    - jupyter-cluster-m
  ...
  workerConfig:
  ...   
    instanceNames:
    - jupyter-cluster-w-0
    - jupyter-cluster-w-1
...
```

#Jupyter notebookに接続する
sshポートフォワードを使ってJupyterに接続する。

```
ssh -L 8123:jupyter-cluster-m:8123 {アカウント名}@{jupyter-cluster-mの外部アドレス}
```

<img width="945" alt="Screen Shot 2017-04-14 at 9.10.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/95399/d5640ec8-acef-4cd9-70cd-460ae2d78821.png">
macでmd5sumがしたい！

# 目的

ソースのダウンロードをする時に横に「SHA256 Checksum」とかあるので、
ダウンロードしたファイルが壊れていないかせっかくなのでちゃんとチェックしたい。

# 環境

+ mac
    + macOS Sierra Version 10.12.4

+ brew
    + Homebrew 1.1.12

# 準備

brewのformulaの中にmd5sha1sumというのかがあります。

```
$ brew search md5sha1sum
md5sha1sum
```

名前がいかにもsha1しか対応していないっぽいですが、
実はオプションでsha256も確認出来るみたい。

+ インストール

```
$ brew install md5sha1sum
==> Downloading https://homebrew.bintray.com/bottles/md5sha1sum-0.9.5.sierra.bottle.2.tar.gz
######################################################################## 100.0%
==> Pouring md5sha1sum-0.9.5.sierra.bottle.2.tar.gz
🍺  /usr/local/Cellar/md5sha1sum/0.9.5: 7 files, 40.8KB
```
+ ちゃんと入ったか確認

```
$ brew list -v | grep md5
md5sha1sum
```


+ versionの確認

```
$ shasum -v
5.84
```

# 実際にチェックしてみる

### 基本コマンド

+ sha1のチェックをしたい場合

```
$ shasum -a 1 test_file
```

+ sha256のチェックをしたい場合

```
$ shasum -a 256 test_file
```

### 試しに使ってみる

googleのクラウドプラットフォームであるGCPをコマンドラインから制御するSDKがあるので、試しにチェックしてみます。

[Google Cloud Platform/Quickstart for Mac OS X](https://cloud.google.com/sdk/docs/quickstart-mac-os-x)


+ ダウンロード

```
$ cd /tmp
$ wget https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-151.0.0-darwin-x86_64.tar.gz
$ shasum -a 256 google-cloud-sdk-151.0.0-darwin-x86_64.tar.gz
450a3361e9769f3a10d1ee5e4f07b19c8b17b14f3222f1556c4817501e702d16  google-cloud-sdk-151.0.0-darwin-x86_64.tar.gz
```

上記の値がURL上の「SHA256 Checksum」と等しくなっているので、ダウンロードに関しては欠損無く出来たという認識です。


参考
[Homebrew使い方まとめ](http://qiita.com/vintersnow/items/fca0be79cdc28bd2f5e4)
[Macにmd5sumが無い【brew】](http://otiai10.hatenablog.com/entry/2014/08/08/154128)



# おまけ


そもそもチェックサムって何？

[「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典/チェックサム (checksum)](http://wa3.i-3-i.info/word1240.html)
gem installで『read server certificate B: certificate verify failed』と表示された時の対処法

Gemを使って、Rubyのライブラリーをインストールしようとしたとき、次のようなエラーメッセージが表示されました。

```shell-session
read server certificate B: certificate verify failed
```

どうやら、SSLのサーバー証明書が古くなってしまったもよう。次のコマンドで、更新することができます。

```shell-session
gem install rubygems-update --source http://rubygems.org/
update_rubygems
```

これで、更新することができました。
python超入門 - 3分でpython3.5を使えるようにする

## 概要

本稿では、自分のPCにいち早くcentosの仮想環境を作り、
その中にpython3.5をインストールして遊ぶのが目的です。

## まずはvagrantの準備

vagrantを使ってcentosを立ち上げる方法は依然「[こちら](http://qiita.com/ritukiii/items/9933e1497237bdac9500)」で紹介してたので、興味があれば見て下さい。

### step1. 事前準備

vagrantを使う為に、下記2つを用意する必要があります。

1. [VirtualBox](https://www.virtualbox.org/)のインストール
2. [vagrant](https://www.vagrantup.com/)のインストール

ここまで1分です。

### step2. vagrantを使ってcentos7を手に入れる

適当なディレクトリを作り、そこにcentos7を入れちゃいましょう。

```
$ mkdir test_centos
$ cd test_centos
$ vagrant init CentOS7
$ vagrant up
# これでcentos7の環境が手に入ったのでsshで入って確認してみます
$ vagrant ssh
Last login: Fri Apr 14 00:32:50 2017 from 10.0.2.2
Welcome to your Vagrant-built virtual machine.
[vagrant@localhost ~]$ cat /etc/redhat-release
CentOS Linux release 7.1.1503 (Core)
# 入ってるみたいですね
```

### step3. python3をゲッチュする

yumのデフォルトのリポジトリでは、pythonは2.7しか入りません。
そこで、iusというリポジトリを追加してあげます。

```
[vagrant@localhost ~]$ sudo yum install -y https://centos7.iuscommunity.org/ius-release.rpm
[vagrant@localhost ~]$ sudo yum install -y python35u python35u-libs python35u-devel python35u-pip
```

よし入ったなともって、バージョンを確認してみると・・

```
[vagrant@localhost ~]$ python -V
Python 2.7.5
```

おやおや。。

どうやらbinエイリアス関係らしいので、下記変えてあげれば良さそうです。

### step4. pythonのシンボリックをpython3に変える

現状

```
[vagrant@localhost ~]$ ll /bin/py*
-rwxr-xr-x. 1 root root    78  6月 17  2014 /bin/pydoc
lrwxrwxrwx  1 root root     8  4月 14 00:35 /bin/pydoc3 -> pydoc3.4
-rwxr-xr-x  1 root root    78 11月  9 17:26 /bin/pydoc3.4
-rwxr-xr-x  1 root root    78  1月 17 21:36 /bin/pydoc3.5
lrwxrwxrwx  1 root root    12  4月 14 00:38 /bin/python -> /bin/python2
lrwxrwxrwx. 1 root root     9  7月 16  2015 /bin/python2 -> python2.7
-rwxr-xr-x. 1 root root  7136  6月 17  2014 /bin/python2.7
-rwxr-xr-x  2 root root 11312 11月  9 17:27 /bin/python3.4
-rwxr-xr-x  2 root root 11312 11月  9 17:27 /bin/python3.4m
-rwxr-xr-x  2 root root 11312  1月 17 21:37 /bin/python3.5
-rwxr-xr-x  2 root root 11312  1月 17 21:37 /bin/python3.5m
-rwxr-xr-x  1 root root   173  1月 17 21:36 /bin/python3.5m-config
-rwxr-xr-x  1 root root  3398  1月 17 21:34 /bin/python3.5m-x86_64-config
lrwxrwxrwx  1 root root    10  4月 14 00:35 /bin/pyvenv -> pyvenv-3.4
-rwxr-xr-x  1 root root   230 11月  9 17:26 /bin/pyvenv-3.4
-rwxr-xr-x  1 root root   230  1月 17 21:36 /bin/pyvenv-3.5
```

まとめると

コマンド|向き先|さらにそれの向き先
---|---|---
python|pythn2|python2.7

これをpythonの向き先をpython3 > python3.5に出来れば良さそうですね。

```
## まずはpython3の向き先をpython3.5にするエイリアスを作成
[vagrant@localhost ~]$ sudo ln -s /bin/python3.5 /bin/python3
## 既存のpythonのエイリアス消しちゃいます
[vagrant@localhost ~]$ sudo unlink /bin/python
## pythonの向き先がpython3になるように
[vagrant@localhost ~]$ ln -s /bin/python3 /bin/python
[vagrant@localhost ~]$ python -V
Python 3.5.3
```

良さそうですね。

pipも一緒にやっとくと良さそうです。

```
[vagrant@localhost ~]$ sudo ln -s /bin/pip3.5 /bin/pip
```

ここまでわずか3分で、手元の環境にcentos7とpython3.5を手にすることが出来ました。
私はスクレイピングが目的ですが、本当に簡単で便利な世の中です。
Kubernetes でプライベートリポジトリのコンテナイメージを使うには

# Kubernetes でプライベートリポジトリのコンテナイメージを使うには

docker-registry タイプの secret を作成し、pods.spec.imagePullSecrets にその secret を指定すればOK。

## 例

例えば、 GitLab.com の場合であれば次のコマンドで secret を作成する。( *reggitlab* はリソース名を示す任意の文字列を指定して良い)

```
# 変数は適宜設定する
$ kubectl create secret docker-registry reggitlab \
          --docker-server=https://registry.gitlab.com/ \
          --docker-username=$GLUSER \
          --docker-password=$GLPASSWD \
          --docker-email=$GLEMAIL
```
これを利用する Pod の manifest からは pods.spec.imagePullSecrets に secret 名を指定して参照する。例えば、次のようにする。

```
spec:
  containers:
    - image: registry.gitlab.com/example/nginx:latest
      name: nginx
      ports:
        - containerPort: 8080
  imagePullSecrets:
    - name: reggitlab
```

## 参考

[Pulling an Image from a Private Registry](https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/)
Python > 2つのfloat値の比較 > sys.float_info.epsilonを使う

2つのfloat値が「ほぼ同じ値か」のチェックとして、Cでは[FLT_EPSILON](http://qiita.com/7of9/items/872762e16a5ebd5e4527)を使ってきた。
それと同等のものをPythonでは sys.float_info.epsilon を使うようだ。

参考 http://stackoverflow.com/questions/9528421/value-for-epsilon-in-python

試してみた。

http://ideone.com/ewmYek

```py
import sys

def check_similarity(aval, bval):
	if abs(aval - bval) < sys.float_info.epsilon:
		print("similar")
	else:
		print("different")
		
aval = 3.141592653589797
bval = 3.141592653589796

check_similarity(aval, bval)

bval = 3.1415926535897971
check_similarity(aval, bval)
```

```txt:run
different
similar
```

http://stackoverflow.com/questions/9528421/value-for-epsilon-in-python
に記載の注意点としては

> But don't forget the pitfalls of using it as an absolute error margin for floating point comparisons. E.g. for large numbers, rounding error could exceed epsilon.
技術英語 > there are [myriads of ways] to build everything

http://thecodist.com/article/the-six-goals-of-every-programming-project

> there are **myriads of** ways to build everything, and making choices is not always easy.

https://www.merriam-webster.com/dictionary/myriad

> a myriad of developments
...
> the myriads of tiny colored dots

「単数形 + of」の形もしくは「複数形 + of」の形で使う例がある。

<hr>
https://www.merriam-webster.com/dictionary/Myr

> million years

むりくり「数百光年先までのA社による広告プラットフォーム([iAd](https://ja.wikipedia.org/wiki/IAd))が準備されている」>> 「たくさんの」
CircleCIでAndroidアプリをビルドする(2017年4月)


こんにちはsekitakaです。
アプリもCIしっかりまわしたいですよね。
今回はCircleCIでAndroidアプリをビルドする方法を紹介します。
CircleCIでビルドできた[サンプルプロジェクト](https://github.com/sekitaka/CircleCIExample)も公開しているので、初めての方はforkして試してみるとわかりやすいと思います。

特に重要なのはcircle.ymlとAndroid SDK関連の利用規約への同意をコマンドラインでやることです。

# GitHubでプロジェクト作成
予めCIしたいAndroidプロジェクトをGitHubのプロジェクトにしておきます。PrivateでもPublicでも構いません。
リポジトリちょっかに`gradlew`がある構成の方が、`gradlew`の実行を`./gradlew`で出来るので少し楽です。

# CircleCIでプロジェクトをフォローする
- 既存のプロジェクトがない場合、insightメニューからAdd Projectを選択する
![circleci_1.png](https://qiita-image-store.s3.amazonaws.com/0/18273/37a200c9-b1c8-3cab-c7a9-26b8aa13aa5b.png "circleci_1.png")

- ビルドしたいリポジトリを追加する
![circleci_2.png](https://qiita-image-store.s3.amazonaws.com/0/18273/4180f989-d2bf-8d5a-008d-67a05c9ac2e4.png "circleci_2.png")

これでリポジトリにpushされるとCircleCIでビルドを試みるようになります。

# circle.ymlを作成
CircleCIがヒルドするには`circle.yml`というファイルが必要です。このファイルはリポジトリ直下に配置しましょう。

```yaml:circle.yml
machine:
  pre:
    # デバッグ用に情報を出力
    - env
    - pwd
    - ls

# チェックアウト関連
checkout:
  post:
    - echo CheckoutPost
    - git submodule sync
    - git submodule update --init

# 依存関係解決
dependencies:
  pre:
    # ライセンスへの同意
    - echo y | android update sdk --no-ui --all --filter "tools,build-tools-25.0.2,platform-tools,android-25,extra-android-m2repository"
    - mkdir -p $ANDROID_HOME/licenses
    # ローカル開発環境で同意した情報を使用する
    # OSXの場合このファイルは`~/Library/Android/sdk/licenses/android-sdk-license`
    - echo "8933bad161af4178b1185d1a37fbf41ea5269c55" > ${ANDROID_HOME}/licenses/android-sdk-license

  override:
      - ./gradlew dependencies || true

# テスト実行
test:
  override:
    - ./gradlew test

# コンパイル
compile:
  override:
    - ./gradlew assembleDebug
    - cp -r app/build/outputs $CIRCLE_ARTIFACTS

```

## dependencies
dependenciesではライセンスへの同意をしています。`echo -y`から始まる行と `echo "8333..."の行の両方が必要かよくわからないのですが、このcircle.ymlでビルドできました。

## compile
`./gradlew assembleDebug`でデバッグビルドのapkを作成しています。
生成されたディレクトリを$CIRCLE_ARTIFACTSにコピーすることで、CircleCIの成果物として管理画面からダウンロードできるようになります。
わーい たーのしー

![circleci_3.png](https://qiita-image-store.s3.amazonaws.com/0/18273/db59ce43-16db-797b-5fe8-be23806862ed.png "circleci_3.png")

# まとめ
いかがでしたでしょうか。CircleCIでAndroidアプリをビルドする方法を紹介しました。CIはエンジニアを幸せにしてくれると思います。積極的に取り入れていきたいですね。

使用した[サンプルプロジェクト](https://github.com/sekitaka/CircleCIExample)を公開していますので、自由に使用してください。
可変引数テンプレートのパラメータパック展開

可変引数テンプレートを使って任意の個数の引数を`ostream`に出力する関数を作る。
再帰処理では引数の数が多くなったときにコンパイルに時間がかかるかもしれないので
パラメータパックを一気に展開したい。

```cpp
template <typename... ARGS>
void output(ostream& out, ARGS&&... args) {
    (out << forward<ARGS>(args))...;
    out << endl;
}
```

とは書けない。コンパイルエラーになる。
パラメータパックを展開できる場所は限定されているためだ。

- 関数の引数
- テンプレートの引数
- 初期化子
- 継承時の基本クラスリストの指定
- コンストラクタのメンバ初期化子
- 動的例外仕様

今回の場合、関数の引数か初期化子以外は型の展開なので無関係である。

よってまずは関数の引数から試していく。
しかしわざわざもう一つ新しい関数を作るのも馬鹿らしいのでlambda関数を使う。

```cpp
template <typename... ARGS>
void output(ostream& out, ARGS&&... args) {
    [] (auto&&...){} ((out << forward<ARGS>(args))...);
    out << endl;
}
```

これも何故かコンパイルエラー。
だめだこりゃ、次いってみよう。

これがエラーになる理由は実はよく分かってない。
エラーメッセージでは参照がどうのといっていたので
参照を止めてポインタにしてみる。

```cpp
template <typename... ARGS>
void output(ostream& out, ARGS&&... args) {
    [] (auto*...){} (&(out << forward<ARGS>(args))...);
    out << endl;
}
```

おお、今度は通った。[[Wandbox]三へ( へ՞ਊ ՞)へ ﾊｯﾊｯ](https://wandbox.org/permlink/WzTRzzshQUOWJoRf)
でも順番が想定していたものと逆になっている。
実装依存なんだろうけど、引数の評価順序は規定されていないから仕方が無い。

次だ次。関数の引数は諦めて初期化指定子にいこう。
初期化指定子は最初から順に評価されると決まっていたはず。

```cpp
template <typename... ARGS>
void output(ostream& out, ARGS&&... args) {
    auto& dummy[] = {(out << forward<ARGS>(args))...};
    out << endl;
}
```

うん、知ってた。コンパイルエラー。
参照の配列なんて聞いたことないよね。
って[ググったら禁止されてる](https://www.google.co.jp/search?q=%E5%8F%82%E7%85%A7%E3%81%AE%E9%85%8D%E5%88%97+c%2B%2B&ie=utf-8&oe=utf-8&gws_rd=cr&ei=TLfvWP3-A4Sz0ASqkpzYAQ)のか。

```cpp
template <typename... ARGS>
void output(ostream& out, ARGS&&... args) {
    ostream* dummy[] = {&(out << forward<ARGS>(args))...};
    out << endl;
}
```

関数の引数のときやったのの応用。参照ではなくポインタにする。
コンパイルは通って想定通りの順序で出力されたけど警告出てる。 [[Wandbox]三へ( へ՞ਊ ՞)へ ﾊｯﾊｯ](https://wandbox.org/permlink/7jB8u49k0mgDynDO)
そりゃdummy宣言してるのに使ってないからなぁ。

```cpp
template <typename... ARGS>
void output(ostream& out, ARGS&&... args) {
    [] (initializer_list<auto*>){}({&(out << forward<ARGS>(args))...});
    out << endl;
}
```

初期化指定子は関数の引数にもできる。ということで合わせ技。
エラーにもならず、警告も出ず、想定通りの出力。[[Wandbox]三へ( へ՞ਊ ՞)へ ﾊｯﾊｯ](https://wandbox.org/permlink/XrlNZQwz5ORqdDVu)

でも引数の型とその型に対応する`operator<<`の実装によってはエラーになりそう。

```cpp
template <typename... ARGS>
void output(ostream& out, ARGS&&... args) {
    [] (initializer_list<auto>){}({(out << forward<ARGS>(args), 0)...});
    out << endl;
}
```

ってするのが無難かな。[[Wandbox]三へ( へ՞ਊ ՞)へ ﾊｯﾊｯ](https://wandbox.org/permlink/CQvgPcD2nZlRD3dG)
なんか呪文のごとくなってしまった。
C++で`template`使ってたら呪文化は仕方が無い、のかなぁ。

(2017/04/16 追記)

```cpp
template <typename... ARGS>
void output(ostream& out, ARGS&&... args) {
    using swallow = initializer_list<int>;
    (void) swallow {(out << forward<ARGS>(args), 0)...};
    out << endl;
}
```

もっと簡単に書けました。[[Wandbox]三へ( へ՞ਊ ՞)へ ﾊｯﾊｯ](https://wandbox.org/permlink/YlRJns2nyFAUlyHD)
swallow Idiomというらしいです。([いなむ先生の記事](http://qiita.com/_EnumHack/items/677363eec054d70b298d#swallow))
@rinse_ さん、情報ありがとうございます。



とにもかくにもこれでログ出力が楽になる。

```cpp
  output(clog, __FILE__, '(', __LINE__, ')', ':', __FUNCTION__, ':', "exception(", ex.what(), ')');
```

とか

```cpp
  output(clog, dateString, ':', path);
```
とか。

`printf`のようにいちいち書式文字列書いて対応する順番に引数並べて、ってしないで済む。
引数の順番間違って訳分からんログになったり、酷いときにはセグメントエラーで落ちたりしない。
Sublime Textで特定拡張子とシンタックスハイライトの紐付け

Sunblime Text でファイルを開いたときに、拡張子に合わせてデフォルトで適用するシンタックスハイライトを設定する方法の備忘。

フレームワーク毎にやや異なる拡張子でシンタックスの設定をするのが面倒だったので確認しました。

特定の拡張子のついたファイルを開いている状態で ```View -> Syntax -> Open all with current extension as … ```から適用したい Syntax を選択するだけです。

<img width="813" alt="スクリーンショット 2017-04-14 2.35.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/145861/7e34d71e-d4ab-b7b8-530b-fef310d74f6e.png">


設定が保存されている場所は```Preferences -> Setting - Syntax Specific```
<img width="427" alt="スクリーンショット 2017-04-14 2.36.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/145861/71087dcc-7904-a5a2-dfc7-5537ac48b46d.png">

<img width="1027" alt="スクリーンショット 2017-04-14 2.36.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/145861/7849c60e-f04c-8cb5-f4da-0404e5d7ca13.png">
Rubyのクラスで`==`を独自定義するとArray#uniqが期待通りに動かない


クラスを定義したとき、作成したインスタンス同士が等しいかどうかを判定するために`==`を定義することは多いかと思いますが、`==`のみを定義してもArray#uniq等の一部比較が意図したとおりに行われません。

# 失敗するバージョン

## クラス定義
このクラスではunique_idが等しいかどうかを比較して同一性を決定するようにしています。

```ruby
class Hoge
  attr_accessor :unique_id

  def initialize(uid)
    @unique_id = uid
  end

  def ==(other)
    @unique_id == other.unique_id
  end

  # 出力結果をわかりやすくするためにオーバーライド
  def to_s
    @unique_id
  end
end
```

## 通常比較(成功する)
特に特別なことはありませんね。`==`を定義したことにより、hoge1とhoge4は同じものとみなされるようになりました。

```ruby
hoge1 = Hoge.new('aaa')
hoge2 = Hoge.new('bbb')
hoge3 = Hoge.new('ccc')
hoge4 = Hoge.new('aaa')

hoge1 == hoge2
=> false

hoge1 == hoge3
=> false

hoge1 == hoge4
=> true
```

## uniq/uniq!(失敗する)

`hoge1`と`hoge4`は同じ`unique_id`なので、uniqしたら重複排除されるともーじゃん？

```ruby
hoge1 = Hoge.new('aaa')
hoge2 = Hoge.new('bbb')
hoge3 = Hoge.new('ccc')
hoge4 = Hoge.new('aaa')

array = [hoge1, hoge2, hoge3, hoge4]

array.uniq!
puts array # 期待する結果はhoge1, hoge2, hoge3の3つ
------------------------------------------
# 出力: なんで４つあるんや！
# aaa
# bbb
# ccc
# aaa
------------------------------------------
```

されねーんです。


# 成功するバージョン

## クラス定義

結論から言うと、`==`の他に`eql?`と`hash`メソッドもオーバーライドしないといけません。


`hash`メソッドについては`@unique_id`を元にハッシュ値を生成することで、同じ`@unique_id`なら必ず同じハッシュ値が生成されるようになります。
`eql?`メソッドについてはメソッドだけ用意して、中身は単にオーバーライドした`==`のエイリアスとして動作するようにします。

```ruby
class Hoge
  attr_accessor :unique_id

  def initialize(uid)
    @unique_id = uid
  end

  def hash
    @unique_id.hash
  end

  def eql?(other)
    self == other
  end

  def ==(other)
    @unique_id == other.unique_id
  end

  def to_s
    @unique_id
  end
end
```

追記@scivolaさん、@jnchitoさん コメントありがとうございます。こういうことですね！

~~(uniqはインスタンスのハッシュ値が等しいかどうかでオブジェクトが等しいかどうかを判定しているのかな？でもそれなら`==`と`hash`だけオーバーライドすればいいと思うんだけど、`eql?`を定義しないとやっぱりうまくいかない。この辺詳しい人いたら教えて下さい。)~~

- `uniq`の判定には`eql?`が使用される
公式リファレンスマニュアル [Array#uniq](https://docs.ruby-lang.org/ja/2.4.0/method/Array/i/uniq.html)   
> 要素の重複判定は、Object#eql? により行われます。

- `eql?`をオーバーライドするときは、`hash`をセットでオーバーライドする必要がある
公式リファレンスマニュアル [Object#eql?](https://docs.ruby-lang.org/ja/2.0.0/method/Object/i/eql=3f.html)
> このメソッドを再定義した時には Object#hash メソッ ドも再定義しなければなりません。

## uniq/uniq!(成功する)

`hoge1`と`hoge4`は同じ`unique_id`なので、uniqしたら重複排除されるともーじゃん？

```ruby
hoge1 = Hoge.new('aaa')
hoge2 = Hoge.new('bbb')
hoge3 = Hoge.new('ccc')
hoge4 = Hoge.new('aaa')

array = [hoge1, hoge2, hoge3, hoge4]

array.uniq!
puts array # 期待する結果はhoge1, hoge2, hoge3の3つ
------------------------------------------
# 出力:
# aaa
# bbb
# ccc
------------------------------------------
```

されるやん！！！いけるやん！！！


というわけで、uniq/uniq!でハマった話でした。
Jenkins Blue Ocean 1.0 がリリースされたので試してみた

#Jenkins Blue Ocean 1.0
JenkinsのBlue Oceanプラグインが1.0になっていた。
JenkinsのUXがモダンかつシンプルになるとかなんとか。
公式サイトの動画を見るに、パイプラインがいい感じにできるらしい。

Publickey様のニュース
https://jenkins.io/blog/2017/04/05/say-hello-blueocean-1-0/
Jenkins.ioの発表ページ
http://www.publickey1.jp/blog/17/jenkinsuxblue_ocean10gui.html

↑ のサイトにある動画を見るとこの記事より詳しい内容が書いてある。

#導入
[Jenkinsの管理]から Blue Ocean で検索すれば出てくるので、そのままインストール。
いつも思うけどJenkinsのプラグインは導入が本当に簡単で良い。

#使ってみた
パイプラインの作成を開始するとリポジトリの選択とかを行うみたい。
Githubのアクセストークンを入力するだけで、自分が持っているリポジトリ一覧を表示してくれるのは便利。
![pipeline.png](https://qiita-image-store.s3.amazonaws.com/0/153339/2b81ec86-7374-0f57-160b-619af1d9813d.png)

リポジトリを選択するとステップの作成に移る。
Jenkins2.0のパイプラインよりは随分直観的に作れるようになってる気がする。
![staging.png](https://qiita-image-store.s3.amazonaws.com/0/153339/c5509f09-1279-e3a9-e059-c64aad01dfb6.png)


設定が完了して保存するとSave&Runでパイプラインの実行も行われる。
パイプラインが実行されたらJenkinsfileが保存時に選択したリポジトリに自動的にPUSHされる。
![executed.png](https://qiita-image-store.s3.amazonaws.com/0/153339/d2644215-8602-5139-d574-e3cbaf927e95.png)


#所感
今回はここまでやって終了。
Jenkins2.0のパイプラインはとっつきにくい印象があったので、Blue Oceanになって色々試してみるモチベーションが沸いてきた。
ユーザーガイドも出ているようなので、今度目を通してみようと思う。
[GitHub] 完全に個人的なもの

**Git hub 上げ方**
cd (ファイルをDD)
git init
git add .
git commit -m ‘コメント’
git remote add origin~~~ (真ん中の段の上)
git push -u origin master

**Git hub branch 切り方**
git branch ブランチの名前
git checkout ブランチの名前
git push
DOM操作がしたかった

## 事前の環境構築

WebAssemblyがchromeで簡単に動かせるようになったということで、とりあえず手元で試してみるかとrustからwasmをビルドするため環境を準備。

https://github.com/Yasu-umi/rust-wasm-docker

## そして本題

タイトルにある通り、どうにかRustからDOMを操作するexampleを作ってみたかったのですが…
まずはjsを呼びましょう。

https://kripken.github.io/emscripten-site/docs/porting/connecting_cpp_and_javascript/embind.html#embind-val-guide

この辺りを見るとどうもC++からjsを文字列で呼び出すための諸々が、emscripten/val.hにあるらしい、ということがわかります。

https://github.com/kripken/emscripten/blob/master/system/include/emscripten/val.h#L22

"Implemented in JavaScript.  Don't call these directly."

やめておけと。
ここまで調べたところで、先駆者様を発見しました。

https://github.com/hajifkd/emval-rs

val.hのラッパを書かれているどころか、もうjsのメソッドが実行でき可変長引数対応も行われていますね、すごい。
簡単にDOM操作がしたければ、さらにここからさらにもう一枚ラッパーを書く必要がありそう、という辺りでemval-rsのexampleを追加してみて本日は終了。

## 補記

https://github.com/tcr/rust-webplatform も参考になりそうなので、いずれソースを眺めたいと思います。
CircleCI 1.0 で Ruby の pcaprub のインストールに失敗するとき

## TL;DR

`libpcap-dev` をインストールすれば良い。

```
dependencies:
  pre:
    - sudo apt-get install libpcap-dev
```

## 背景

`bundle install` が以下のようなエラーでコケるようになってしまった。
Ubuntu 12.04 から Ubuntu 14.04 に切り替えたタイミングでエラーが起きるようになった。

```
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

current directory:
/home/ubuntu/dns/vendor/bundle/ruby/2.4.0/gems/pcaprub-0.12.4/ext/pcaprub_c
/opt/circleci/ruby/ruby-2.4.1/bin/ruby -r ./siteconf20170413-11999-vviegb.rb
extconf.rb

[*] Running checks for pcaprub_c code...
platform is x86_64-linux
checking for ruby/thread.h... yes
checking for rb_thread_blocking_region()... no
checking for rb_thread_call_without_gvl()... yes
checking for pcap_open_live() in -lpcap... no
checking for pcap_setnonblock() in -lpcap... no
creating Makefile

current directory:
/home/ubuntu/dns/vendor/bundle/ruby/2.4.0/gems/pcaprub-0.12.4/ext/pcaprub_c
make "DESTDIR=" clean

current directory:
/home/ubuntu/dns/vendor/bundle/ruby/2.4.0/gems/pcaprub-0.12.4/ext/pcaprub_c
make "DESTDIR="
compiling pcaprub.c
pcaprub.c:11:18: fatal error: pcap.h: No such file or directory
 #include <pcap.h>
                  ^
compilation terminated.
make: *** [pcaprub.o] Error 1

make failed, exit code 2

Gem files will remain installed in
/home/ubuntu/dns/vendor/bundle/ruby/2.4.0/gems/pcaprub-0.12.4 for inspection.
Results logged to
/home/ubuntu/dns/vendor/bundle/ruby/2.4.0/extensions/x86_64-linux/2.4.0-static/pcaprub-0.12.4/gem_make.out

An error occurred while installing pcaprub (0.12.4), and Bundler cannot
continue.
Make sure that `gem install pcaprub -v '0.12.4'` succeeds before bundling.

bundle check --path=vendor/bundle || bundle install --path=vendor/bundle --jobs=4 --retry=3  returned exit code 5

Action failed: bundle install
```

調べたところ libpcap をインストールせよとのことだった。
https://github.com/pcaprub/pcaprub/issues/49
[python]30行でセル・オートマトン


# 概要
pythonでセル・オートマトンを手抜きして書きます。
arch linux, python3.5で作成しました。

# ライフゲーム
[ライフゲーム \- Wikiwand](https://www.wikiwand.com/ja/%E3%83%A9%E3%82%A4%E3%83%95%E3%82%B2%E3%83%BC%E3%83%A0)
![Screenshot_2017-04-14_00-41-42.png](https://qiita-image-store.s3.amazonaws.com/0/167909/1fc6f40c-9274-cdf5-6a98-bcc7c752f63e.png)


セルオートマトンをグレー画像のように処理しますと、scipyの畳み込み計算、matplitlibの画像表示機能で楽ができます。
画像として表示しているので小さくするとセルが潰れたりします。

```python
import numpy as np
import scipy.signal
import matplotlib.pyplot as plt

h = np.array([[1, 1, 1],
              [1, 0, 1],
              [1, 1, 1]])
def update(U):
    '''
    Update rule:
    current_state＼N_neighbors | 0   1   2   3   4   5   6   7   8
    ---------------------------+----------------------------------
                             0 | 0   0   0   1   0   0   0   0   0
                             1 | 0   0   1   1   0   0   0   0   0
    '''
    N_neighbors = scipy.signal.convolve2d(U, h, boundary='wrap', mode='same')
    U_next = np.zeros_like(U)
    U_next[N_neighbors == 3] = 1
    U_next[np.logical_and(N_neighbors == 2, U == 1)] = 1
    return U_next

size = (256, 256)
U = np.random.randint(2,size=size)

fig = plt.figure()
ax = fig.add_subplot(111)
img = ax.imshow(U, interpolation="nearest", cmap=plt.cm.gray)

i = 0
while True:
    U = update(U)
    img.set_data(U)
    i += 1
    ax.set_title("t = {}".format(i))
    plt.pause(0.01)

```

# チューリング・パターン
[チューリング・パターン \- Wikiwand](https://www.wikiwand.com/ja/%E3%83%81%E3%83%A5%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%B0%E3%83%BB%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3)
![Screenshot_2017-04-14_00-55-14.png](https://qiita-image-store.s3.amazonaws.com/0/167909/869fdff2-a4c3-432b-45a6-92adaf6c5710.png)

セル・オートマトンの定義からは外れるかもしれませんが、拡散反応系も同じようにできます。
更新式は下記チューリング・パターンを使用。

```math
\begin{align}
\frac{\partial u}{\partial t} &= D_u \nabla u + u ( 1 - u^2) - v \\
\frac{\partial v}{\partial t} &= D_v \nabla v + 3 u - 2 v 
\end{align}
```
$u(x,y)$を画素値として表示します。$v(x,y)$は計算に使うだけ。
$D_u$, $D_v$は拡散係数になります。
この係数によって、パターンが形成されるか、されないか、発散するかが決まります。
今回は$D_u=0.2, D_v=1.8$でパターンを形成させました。（トライ＆エラーで決めた）

今回は$\nabla$をscipyのラプラシアンフィルタで計算します。

```python
import numpy as np
import scipy.ndimage.filters
import matplotlib.pyplot as plt

lap = lambda X: scipy.ndimage.filters.laplace(X)
def update(U, V, Du=0.2, Dv=1.8):
    return (Du*lap(U) + U*(1.-U*U) - V,
            Dv*lap(V) + 3.*U - 2.*V)

size = (64, 64)
U = np.random.random(size)
V = np.random.random(size)
dt = 0.1

fig = plt.figure()
ax = fig.add_subplot(111)
img = ax.imshow(U, interpolation="nearest", cmap=plt.cm.gray)

view_interval = 10
for i in range(10000):
    dU, dV = update(U, V)
    U += dt*dU
    V += dt*dV
    if i % view_interval == 0:
        img.set_data(U)
        ax.set_title("t = {}".format(i))
        plt.pause(0.01)
plt.show()
```
更新式として代わりにフィッツフュー-南雲方程式を使うと、画像が安定化せずに振動し、生き物のように蠢きます。面白いです。
csrf_token, Authorization token を curl で指定する練習

rails の URL を curl でたたく練習をしてみた。  
csrf token や、 authetication token を curl で指定することができる。  

https://github.com/katoy/rails4_apiTokenAuthentication

↓には、 データを登録する POST メソッドを curl で呼ぶ例を抜粋した。

    $ curl  -c cookie http://localhost:3000/products | grep csrf
    % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                   Dload  Upload   Total   Spent    Left  Speed
    100  2467  100  2467    0     0  45815      0 --:--:-- --:--:-- --:--:-- 46547
    <meta name="csrf-param" content="authenticity_token" />
    <meta name="csrf-token" content="Bco9w8T7NKcFZTNWuFDvET8iZrp+GQ3rAoNpQwiWQiCsi3NV/wL+KIa4dwGVwK0S9wXBC0umyBXq5V62sM5E1g==" />
    
    $ curl  -c cookie http://localhost:3000/products.json
    [{"id":1,"name":"test","age":10,"email":"test@example.com","created_at":"2017-04-13T15:35:19.995Z","updated_at":"2017-04-13T15:35:19.995Z","url":"http://localhost:3000/products/1.json"},{"id":2,"name":"test","age":10,"email":"test@example.com","created_at":"2017-04-13T15:37:35.906Z","updated_at":"2017-04-13T15:37:35.906Z","url":"http://localhost:3000/products/2.json"}]
````
CircleCI 1.0 で Go の context パッケージが見つからずに go get できないとき

## TL;DR

CircleCI で使う Ubuntu を 12.04 から 14.04 に変えると Go 1.7 以降なので context パッケージが使えるようになる。

![image](https://qiita-image-store.s3.amazonaws.com/0/208/8faebfa6-e353-6433-d564-e7606694ab93.png)

## 背景

[circle-gh-tee](https://github.com/yuya-takeyama/circle-gh-tee) と言う、CircleCI でのコマンドの実行結果を GitHub の Pull Request にコメントするツールを作ってるんですが、いつの間にか動かなくなっていて、調べてみると依存している [github.com/google/go-github](https://github.com/google/go-github) のインターフェイスが引数に `context` を要求するように変わっていた。

そして `go get -v` 時に出ていたのが次のエラー。

```
github.com/google/go-github (download)
import "context": import path does not begin with hostname
package context: unrecognized import path "context"
```

12.04 では Go のバージョンが古かったが、14.04 に変えたところうまく通った。
デバッグ用にバウンディングボックスを表示する


unityでオブジェクトの大きさ（絶対値）を知りたい時があるのだが、transformのスケール（相対値）しかわからないっぽいので、以下のようなスクリプトでバウンディングボックスの大きさを確認できるようにしてみた。（ほかに方法があるのか？）

![image](https://qiita-image-store.s3.amazonaws.com/0/17747/2ac3caec-3d5f-66ee-1abd-8ebdb71808b6.png)


```csharp

using UnityEngine;
using System.Collections;

public class BoundingBoxChecker : MonoBehaviour
{

    [SerializeField] private Vector3 size;
    [SerializeField] private Vector3 center;

    void OnDrawGizmosSelected()
    {

        if (GetComponent<MeshFilter>()==null) return;

        var mesh = GetComponent<MeshFilter>().mesh;
        mesh.RecalculateBounds();

        var bounds = mesh.bounds;

        Gizmos.color = new Color(1, 0, 0, 0.5F);
        Gizmos.DrawCube(bounds.center, bounds.size);

        size = bounds.size;
        center = bounds.center;

    }
}
```
rubyのyield使うときの書き方の組み合わせ

rubyでyield、lambda(proc)を使うとき、書き方の組み合わせがいろいろあってこんがらがるので思いつく範囲でまとめてみました。

#渡したブロックをdef内のyieldで呼び出すパターン
```huga.rb
def huga(arg)
  yield(arg)
end
func = lambda{|arg| p arg}
huga("hoge",&func)         #=> hoge
huga("hoge"){|arg| p arg}  #=> hoge
```

#渡したブロックを&引数で受け取ってcallで呼び出すパターン
```hoge.rb
def hoge(arg,&b)
  b.call(arg)
end
hoge("hoge"){|arg| p arg}  #=> hoge
```

#事前にProc オブジェクトを作っておいて、それを渡すパターン
```boo.rb
def boo(arg,b)
  b.call(arg)
end
func = lambda{|arg| p arg}
boo("hoge",func)                    #=> hoge
boo("hoge",lambda{|arg| p arg})     #=> hoge
```
【Unity】SocialWorkerでLINEにテキスト投稿ができない問題の対応【SocialWorker】

# はじめに
Unityで各種SNSへのテキストや画像の投稿機能を提供する無料Assetと言えば [Social Connector](https://github.com/anchan828/social-connector) が有名です。

が、LINEのアイコンを差し替えないといけなかったり直接LINEやTwitterに投稿できない（一旦共有先を選ぶUIを挟む必要がある）など機能的に不足を感じたので、LINEやTwitterなどに直接投稿が可能な [Social Worker](http://okamura0510.jp/%E9%96%8B%E7%99%BA%E3%83%96%E3%83%AD%E3%82%B0/socialworker/)  というAssetを使っていました。

機能的には完全上位互換なのになぜ Social Connector の記事ばかり見つかるのかが不思議。

とはいえ最近まで一旦共有先を選んでから投稿させる機能しか使っていなかったので、LINEに直接投稿するAPIを使ってみることに。

# LINEに直接テキスト投稿できない問題が発生
iOSにて Social Worker の

* `CreateChooser(string message, string imagePath, Action<SocialWorkerResult> onResult = null)`
* `PostLine(string message, string imagePath, Action<SocialWorkerResult> onResult = null)`

を使用。

* 共有先を選ぶUI→画像・テキスト同時投稿：OK
* 直接画像のみの投稿：OK
* 直接テキストのみの投稿：<font color="red">なぜかできない</font> ←？？？

# エラー内容
Xcodeに吐かれていたエラーの内容が以下。

```
ios -canOpenURL: failed for URL: "(null)" - error: "Invalid input URL"
```

テキスト内容はちゃんと渡してるはずなのになぜか`null`になっていました。
なぜURL？？？

# エラーの原因
Objective-Cが全然わからないので調査にだいぶ時間がかかりましたが、結論から言うとURLのパースに失敗していました。

具体的にはLINEへの直接投稿は内部で投稿用のカスタムURLスキーム（`line://msg/text/{投稿内容}`）を使用していて、内容に日本語を含んでいたりスペースが混ざっていると`NSURL *urlData = [NSURL URLWithString:url];`の箇所でURLとしてパースできずに`null`になっていました。

# 対処方法
`SocialWorker/Plugins/iOS/SocialWorker.mm`に直接修正を加えるのは気が引けたのでUnityからAPIに渡すテキストをエンコードする方法を取ってみました。

以下の２つの方法でテキストをエンコードしてからAPIに渡せば期待通りに動作しました。

* `System.Uri.EscapeUriString(string stringToEscape)`
* `WWW.EscapeURL(string s).Replace("+", "%20")`

`var str = ";, +, &, = ?, %, $, #, 日本語";`という文字列を渡して両方共ちゃんと投稿＆表示できたので大丈夫かなと思います。

`System.Web.HttpUtility.UrlPathEncode(string str)`というのもあるらしいですが、どうやら今のUnityでは使えないようなので却下。

# 参考資料
* [Encode String to URL friendly format](http://answers.unity3d.com/questions/341147/encode-string-to-url-friendly-format.html)
* [How do I replace all the spaces with %20 in C#](http://stackoverflow.com/questions/1517586/how-do-i-replace-all-the-spaces-with-20-in-c-sharp)

# ちなみに
ソースを読んだらInstagramへの投稿でも同じようにカスタムURLスキームを使っているようだったので、同じ問題が起きるかもしれません。

あと`onResult`コールバックは投稿後に呼ばれると思ってたらそうではなくて投稿しようとAPI呼んだときに呼ばれるようでした。思ってたのと違って残念。
２０１７年度東京大学入試問題数学（理系）第１問をだいたいsympyを使って解く

オリジナル

http://www2.sundai.ac.jp/yobi/sv/sundai/sokuhou/sokuhou_D/1337447069765.html

# sympyで

①もっと短くなるような気もします。
②グラフをかっこよくする方法を教えて下さい。

```python
#2017年度東京大学（理系）第１問
from sympy import *
def MYprint(h):
  print('#{0} = {1}'.format(h, eval(h)))
print('#(1)----------------------------------')
var('t a b x')
f=cos(3*t)+a*cos(2*t)+b*cos(t)
g=expand_trig(f).replace("cos(t)","x")
p = Poly(g, x)
import re
ft=re.search('^Poly\((.+?),', str(p)).group(1)
MYprint('ft')
h=p-f.subs(t,0)
q=re.search('^Poly\((.+?),', str(h)).group(1)
r=simplify(h/(x-1))
gt = Poly(r, x)
gt=re.search('^Poly\((.+?),', str(gt)).group(1)
MYprint('gt')
print('#(2)----------------------------------')
var('r')
f=4*x**2+(2*a+4)*x+2*a+b+1
g=collect(f,x+(a+2)/4)
p = Poly(g, x)
q=collect(p,x+(a+2)/4)
s=f.subs([(x,r-(a+2)/4)])
t = Poly(s, r)
import re
u=re.search('^Poly\((.+?),', str(t)).group(1)
Gx=u.replace("r","(x+(a+2)/4)")
MYprint('Gx')
v=simplify(Gx)
w=solve(diff(simplify(v),x),x)
z=simplify(w[0])
print('#x=',z)
p=v.subs(x,z)
s=solve(p,b)
q=z.subs(v,s[0])
q1=float(solve(q-1,a)[0])
q2=float(solve(q+1,a)[0])
q=expand(simplify(s[0]))
print('#グラフ b=',q, 'かつ',q1,'< a <',q2)
plot(q,(a, q1, q2),xlim=[-20,20], ylim=[-20,20])
#(1)----------------------------------
#ft = 4*x**3 + 2*a*x**2 + (b - 3)*x - a
#gt = 4*x**2 + (2*a + 4)*x + 2*a + b + 1
#(2)----------------------------------
#Gx = 4*(x+(a+2)/4)**2 - a**2/4 + a + b
#x= -a/4 - 1/2
#グラフ b= a**2/4 - a かつ -6.0 < a < 2.0
```

# 参考

http://qiita.com/sak_2/items/149efb1d015b88e88328

http://qiita.com/HigashinoSola/items/1a052b1f36d65ad1ffa1
buildrootでブータブルCDを作成する

aptならbuild-essential、ncurses-dev、gcc-multilibあたりが必要です。
RPMな人は適当に読み替えてください。

最新版を持ってきて
> wget https://buildroot.uclibc.org/downloads/buildroot-2017.02.1.tar.bz2
> bzcat buildroot-2017.02.1.tar.bz2 | tar x
> cd buildroot-2017.02.1/

qemu_x86_defconfigを基にして
> make qemu_x86_defconfig
> make menuconfig

まず Bootloaders の syslinux をチェック。
> Bootloaders --->
> [ * ] syslinux

それからFilesystem imagesのcpio the root filesystemとiso imageをチェック。
> Filesystem images --->
> [ * ] cpio the root filesystem (for use as an initial RAM filesystem)
> [ * ] iso image

圧縮はしなくても構いません。
Bootloadersをsyslinuxだけにしておけばiso imageの詳細はよしなに設定されます。

makeするとoutput/images/rootfs.iso9660が出来上がります。
拡張子はisoに変えたほうがゲイツ君とかに嫌われなくて済みますが本当はiso9660の方が正しいですね。

---

最初pc_x86_64_bios_defconfigを使って随分トラブルが発生しました。
ブートローダがsyslinuxだけだとビルドがコケるとかisolinux.cfgを書き換えなきゃいけないとか。
qemu_x86_defconfigは上記の通りスムーズでした。
ユーザーレビューにおけるレジュメの活用

##1 はじめに
ユーザーレビュー（要件定義、基本設計）を行う場合、レジュメ（またはレジメ）を活用することで会議を円滑に進めることができます

##2 レジュメとアジェンダ
レジュメと似たようなイメージの用語としてアジェンダがあります。レジュメとはフランス語で「要約」、またアジェンダは英語で「予定表」という意味になります。

会議の要約を記載したレジュメの一部にアジェンダが含まれるような感じです。（実際にはレジュメとアジェンダは別の用途で使うものかも知れませんが、この２つを合体させると分かり易い資料になります）

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/125857/f5e055ab-4979-7f5d-4293-c7c92bf5c53a.png)


##3 想定時間と宿題
アジェンダで各議題ごとに想定時間を設定しても、議論が白熱したり、ユーザー側が考え込んでしまったりすると、たちまち時間オーバーになってしまいます。
このような場合は、ユーザーに遠慮することなく、一瞬の隙をついて「次回までの宿題事項」としてしまいましょう。

##4 休憩時間
最後に、2時間を超える会議の場合は、会議の途中に休憩時間を取るようにするとよいでしょう。できれば、アジェンダの中に休憩時間を盛り込むようにしてください。
そうすることで、長時間の会議であっても休憩時間という中間目標を目指して、集中して議題に取り組むことが可能になります。