OmniAICreator/Qiita-1.07M huggingface dataset:
QEMUで作成可能な仮想ディスクファイルフォーマット 比べてみた

# 始めに
`qemu-img create`や`qemu-img convert`で作れる仮想ディスクファイルの形式は幾つかありますが、どの形式がサイズ面で優れているか比較してみました。

# 手法
1. 「amd64版Debianを、ext4形式・swap領域別ドライブかつ追加パッケージ群を一つも選ばずにネットワークインストーラを用いてインストールし、インストール後にログインせずにzerofreeで未使用領域の初期化を行った物」を作ります。
2. `qemu-img convert`で各形式に変換します。
3. 変換後のサイズを比較します。
4. ついでにWinRARで最大限圧縮した場合の比較もします。

# 結果
こんな感じになりました。サイズの単位はバイトです。

|     形式      | サイズ | 圧縮後のサイズ |
|:-------------:|------------:|-------------:|
| qcow2(圧縮)   | 236,978,176 | 227,667,478 |
| qcow(圧縮)    | 301,258,752 | 229,580,818 |
| qcow(非圧縮)  | 709,541,888 | 143,966,819 |
| qcow2(非圧縮) | 734,855,168 | 143,914,934 |
| vmdk         | 735,969,280 | 143,942,834 |
| qed          | 736,231,424 | 143,918,088 |
| vdi          | 835,781,120 | 144,130,272 |
| parallels    | 836,763,648 | 144,079,905 |
| vpc(通称vhd)  | 950,277,120 | 143,954,692 |
| vhdx         | 1,635,778,560 | 144,223,958 |
| raw          | 17,179,869,184 | 147,856,621 |

# 結論
試してみた結果、以下のことが分かりました。

- 普通に使える形式の中では、QCOW2に-cオプション付きで変換を行ったものが最も小さくなった。
- 圧縮QCOW系を除き、どの形式も圧縮後のサイズに有意な差は見られなかった。
- vhdx形式、vhd形式より悪化してるんですが・・・・・・

なお、圧縮QCOW2ですが、Copy On Writeだけあってログイン画面に進むだけでファイルサイズが膨れたりとかするので「普段使いするにはサイズの膨れ方が気になる」「ただ保管するだけなら非圧縮形式を別途圧縮した方がサイズ的に良い」等、ちょっとイマイチだなぁ思いました。

# おわりに
ポータビリティとファイルサイズのバランスを考えるならVMWareのvmdk形式にしましょう！
Watsonのアクセストークンをcurlで取得する

ElixirのようなWatson向けライブラリが存在しない言語でWatsonを扱うにはトークンの発行等を自力で全て書かないといけない。
とりあえずcurlでトークン取得できれば後はどうにでもなるかなと思ってやってみた。

---

Bluemixでサービスを作成すると下記のようなCredentialが発行される。

```json
{
  "url": "https://stream.watsonplatform.net/speech-to-text/api",
  "password": "ABCDEFGHIJKLMN",
  "username": "11111111-222222-333333-4444444"
}
```

で、次のcurl文の `{username}`,`{password}`,`{url}`を置換する。

```
curl -X GET --user {username}:{password} "https://stream.watsonplatform.net/authorization/api/v1/token?url={url}"
```

今回の例では最終的なcurl文は以下のようになる。

```
curl -X GET --user 11111111-222222-333333-4444444:ABCDEFGHIJKLMN "https://stream.watsonplatform.net/authorization/api/v1/token?url=https://stream.watsonplatform.net/speech-to-text/api"
```

そして取得できたトークンはこんな感じ。

```
SUncNyCgRwPYknXARXzYNbtqMCFgaCIFVfRhtm0l2zXjEaQ335mXqsl5CNhN1EvqOo6Ylj%2BrMdG7UTLPKYDSZP8HW%2B%2FTfJe2OokHkIYAMIY%2FoBhLFAqPid%2FJdTmlgN%2F8BDSzMgFGLjJQ05l4h1sKLt5Ew2feYdQxLzjcZywhJidx7C1vHzANuapYaeV3YogcBCUxku2Goq65OOgdcx9C1HGFSlY0R5HLrJUyJ0T2vkThof3OUVx8A%2BVInr2kcCxSDrMLmXGeAMlR0xxOjlzS%2BAwRbAke3UNbRNCwbIAFALbM4ei2009g6a%2FRh0apbIbCpgbltuzg69758GO4aMa7RWyfZsWoe8IsFQE0nhF9T4a4viKzSlPs8s0H052UUpRuQ1CBHaWHCqb0eOPPg7UuyAA4x6MaBJhFUlGL0qnhQ%2Fk6Y%2FnlR9GppCwfuUAvdIjwzqCEbg7mOFWXTMQM8GqmtvI7rbRc5m%2BHEDCroAFyysJ9A1iopq%2F5LW3sgVe........
```

いいね！ :thumbsup:

参考にしたのは公式の [Tokens for authentication](https://www.ibm.com/watson/developercloud/doc/common/getting-started-tokens.html)
ffmpegを使ってiOS用にmp4ファイルをHLSに変換するシェルスクリプト

iOS向け動画ページの動作確認の必要にせまられて作って作りました。
本番環境で使うならAWSのElastic transcoderが安くていい感じだけど、ちょっとしたテストならこれでいいかも・・・

# シェルスクリプト
```
#!/bin/sh
ffmpeg -i $1 -profile:v baseline -level 3.0 -s 1280x780 -start_number 0 -hls_time 10 -hls_list_size 0 -f hls high.m3u8
ffmpeg -i $1 -profile:v baseline -level 3.0 -s 640x360 -start_number 0 -hls_time 10 -hls_list_size 0 -f hls medium.m3u8
ffmpeg -i $1 -profile:v baseline -level 3.0 -s 320x240 -start_number 0 -hls_time 10 -hls_list_size 0 -f hls low.m3u8

echo '#EXTM3U' > index.m3u8
echo '#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1883000,RESOLUTION=1280x720,CODECS="avc1.4d001f"' >> index.m3u8
echo 'high.m3u8' >> index.m3u8
echo '#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1083000,RESOLUTION=640x480,CODECS="avc1.4d001f"' >> index.m3u8
echo 'medium.m3u8' >> index.m3u8
echo '#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=458000,RESOLUTION=320x240,CODECS="avc1.42001f"' >> index.m3u8
echo 'low.m3u8' >> index.m3u8
```

# 使い方
上記のスクリプトを適当な名前で保存します。`例えばconv.shとか`
それで引数に変換したい動画を指定すればオーケー

```
$ conv.sh input.mp4
```

そうするとhigh、medium、lowの動画が出来上がる。
シミュレータにてiOS10.2で動作することは確認済みです。
HybridAuth(Facebook PHP SDK v3.2.2)でFacebookログインができなくなる問題に対処

## 課題
3/28より、FacebookのID連携をしているサービスで急にログインができなくなった。
ID連携には、HybridAuthというPHPのOAuthのライブラリを使っている。

## 原因
Facebook API ver2.2まではアクセストークンがクエリ文字列で `access_token=xxx` みたいに返ってきていた。
3/28のAPIアップデートにより、ver2.2が廃止され、ver2.3が最低バージョンになった。ver2.3以降は、戻り値がクエリ文字列ではなく、JSONになったのが原因。アクセストークンを取り出せずエラーになってしまう。
(参考) https://developers.facebook.com/docs/facebook-login/manually-build-a-login-flow

```JSON:response.json
{
  "access_token": {access-token}, 
  "token_type": {type},
  "expires_in":  {seconds-til-expiration}
}
```

## 対処
### APIバージョンを指定
エンドポイントの最後に `/v2.8` のようにバージョンを指定。
これをしないと、呼び出しでバージョンを指定しないと、利用できる最も古いバージョンにデフォルトが設定されるということで、予期しない動作をする可能性があるので。

```php:base_facebook.php
  /**
   * Maps aliases to Facebook domains.
   */
  public static $DOMAIN_MAP = array(
    'api'         => 'https://api.facebook.com/v2.8/',
    'api_video'   => 'https://api-video.facebook.com/v2.8/',
    'api_read'    => 'https://api-read.facebook.com/v2.8/',
    'graph'       => 'https://graph.facebook.com/v2.8/',
    'graph_video' => 'https://graph-video.facebook.com/v2.8/',
    'www'         => 'https://www.facebook.com/v2.8/',
  );
```
### アクセストークンをJSONとしてパース
Facebook SDKの、**getAccessTokenFromCode** という関数の中身で、レスポンスをJSONでパースするように変更

```php:(変更前)base_facebook.php
    $response_params = array();
    parse_str($access_token_response, $response_params);
    if (!isset($response_params['access_token'])) {
      return false;
    }

    return $response_params['access_token'];
```
↓

```php:(変更後)base_facebook.php
    $response_params = array();
    $response_params = json_decode($access_token_response);
    if (!isset($response_params->access_token)) {
      return false;
    }

    return $response_params->access_token;
```

## 参考
http://qiita.com/acro5piano/items/514a7dc0e34e067235ad
TCP/UDPのポート番号

SSHとかHTTPとかよく使うプロトコルのポート番号は覚えていることが多いですが、初めて利用するプロトコルのポート番号は調べないとわかりません。

そんなときに役に立つのが下記のサイト。最新のプロトコルのポート番号が掲載されています。
http://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml

ウェルノウンポートといえど、日頃使わないプロトコルのポート番号はわからないものです。
調べたプロトコルの周辺のポート番号を調べてみると面白い発見があるかもしれません。
MacOS sierra のOctaveでplot()できなくて困った話

<a href="http://qiita.com/fukuit/items/1bb41ebb033178c01285">macOS Sierra (10.12.3)にOctaveをインストールできなくて困った話</a>の続きです。

さて、octave(とgnuplot)をインストールしたのですが、```plot()```ができないことに気が付きました。```plot()```すると、以下のようなerrorが出て、グラフが表示されません。

```
Fontconfig error: line 86: not well-formed (invalid token)
Fontconfig error: Cannot load default config file
warning: could not match any font: *-normal-normal-10
```

gnuplotは、```brew install gnuplot --with-aquaterm```でインストールしてある状態で、.octavercは、以下のようになっています。

```
graphics_toolkit("gnuplot");
setenv("GNUTERM", "aqua");
```

octaveとgnuplotのバージョンは、それぞれ次のようになっています。

```
% octave --version
GNU Octave, version 4.2.1
Copyright (C) 2017 John W. Eaton and others.
This is free software; see the source code for copying conditions.
There is ABSOLUTELY NO WARRANTY; not even for MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.

Octave was configured for "x86_64-apple-darwin16.4.0".

Additional information about Octave is available at http://www.octave.org.

Please contribute if you find this software useful.
For more information, visit http://www.octave.org/get-involved.html
	
Read http://www.octave.org/bugs.html to learn how to submit bug reports.
% gnuplot --version
gnuplot 5.0 patchlevel 6
```	

## font config fileの問題？
86行目に問題がある(```line 86: not well-formed (invalid token)```)とのことなので、fonts.confファイルを探してみます。

~/Library/Fonts/ には、fonst.list、fonts.dir、fonts.scaleのファイルがありますが、fonts.confはありません。

/usr/local/Cellar/fontconfig/2.12.1_2/share/fontconfig/conf.avail 以下には.confファイルが沢山ありますが、これらのうちのどれかに問題があるのか、よく分かりません。

## エラーメッセージで検索してみた結果
色々と検索してみたところ、<a href="http://stackoverflow.com/questions/35249881/octave-fontconfig-error">stackoverflowに、答えがありました</a>。

どうやら、環境変数```FONTCONFIG_PATH```が設定されていなかったのが問題だったようです。```FONTCONFIG_PATH```として```/opt/X11/lib/X11/fontconfig```を設定すると、octaveで```plot()```した時に、ちゃんとグラフが表示されるようになりました。

### bash、zshの場合
.bashrc、.zshrcなどに、以下のように記載します。

```
export FONTCONFIG_PATH=/opt/X11/lib/X11/fontconfig
```

### csh、tcshの場合
.cshrc、.tcshrcなどに、以下のように記載します。

```
setenv FONTCONFIG_PATH /opt/X11/lib/X11/fontconfig
```

### fishの場合
.config/fish/config.fishなどに、以下のように記載します。

```
set -x FONTCONFIG_PATH /opt/X11/lib/X11/fontconfig
```

## 今回のサマリ
octave(とgnuplot)で、グラフ等を描画する場合は、環境変数FONTCONFIG_PATHを正しく設定しておく必要があるということが分かりました。

![20170329.png](https://qiita-image-store.s3.amazonaws.com/0/15553/594f2b64-92ce-c05b-8391-0e57e887ea46.png "20170329.png")
Macbook Proを買ってからする設定

忘備録として記します。

* macOSの設定（カッコ内はシステム環境設定での項目）
    * タイムゾーンの設定（言語と地域）
    * 入力ソースを日本語と英語のみに設定（言語と地域）
    * ライブ変換、スペルの自動修正をキル（キーボード → 入力ソース）
    * AppleIDの設定（iCloud）
    * Dockを自動的に隠す（Dock）
    * マシン名の設定（共有）
    * Cmd+スペースで入力ソースを切り替えられるように設定（キーボード）
    * Spotlight検索のショートカットを切る（キーボード）
    * Siriを切る（Siri）
    * Ctrl+ジェスチャでズームできるように設定（アクセシビリティ）
    * 「最新使用状況に基づいて操作スペースを自動的に並び替える」を切る（Mission Control）
    * 操作スペースの追加
    * Rosetta の追加
* Webブラウザ
    * [Firefox](https://www.mozilla.org/firefox)
    * [Firefox Developer Edition](https://www.mozilla.org/firefox/developer/)
    * [Google Chrome](https://www.google.co.jp/chrome/browser/desktop/)
* アプリ
    * iTerm3
    * Kindle
* プログラミング関係
    * command line tool: `xcode-select --install`で入るやつ
    * Homebrew のインストール
    * Visual Studio Codeのインストール
    * GitHub Desktopとコマンドラインツールのインストール
    * Rustの開発環境のインストール
        *  [rustup](/chikoski/items/b6461367e8c3875bb235)
        *  [M1 でのインストール](/chikoski/items/f973e551a71ed0179116)
        *  [Visual Studio Code用の設定](/chikoski/items/53590914cc6aacc8916d)
    * [node-brew](https://github.com/hokaccha/nodebrew)とnode.js
* フォント
    * [源真ゴシック](http://jikasei.me/font/genshin/)
    * 源ノ角等幅
素人の言語処理100本ノック:87


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

## 第9章: ベクトル空間法 (I)
>[enwiki-20150112-400-r10-105752.txt.bz2](http://www.cl.ecei.tohoku.ac.jp/nlp100/data/enwiki-20150112-400-r10-105752.txt.bz2)は，2015年1月12日時点の英語のWikipedia記事のうち，約400語以上で構成される記事の中から，ランダムに1/10サンプリングした105,752記事のテキストをbzip2形式で圧縮したものである．このテキストをコーパスとして，単語の意味を表すベクトル（分散表現）を学習したい．第9章の前半では，コーパスから作成した単語文脈共起行列に主成分分析を適用し，単語ベクトルを学習する過程を，いくつかの処理に分けて実装する．第9章の後半では，学習で得られた単語ベクトル（300次元）を用い，単語の類似度計算やアナロジー（類推）を行う．
>
>なお，問題83を素直に実装すると，大量（約7GB）の主記憶が必要になる． メモリが不足する場合は，処理を工夫するか，1/100サンプリングのコーパス[enwiki-20150112-400-r100-10576.txt.bz2](http://www.cl.ecei.tohoku.ac.jp/nlp100/data/enwiki-20150112-400-r100-10576.txt.bz2)を用いよ．

### 87. 単語の類似度
>85で得た単語の意味ベクトルを読み込み，"United States"と"U.S."のコサイン類似度を計算せよ．ただし，"U.S."は内部的に"U.S"と表現されていることに注意せよ．

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

```python:main.py
# coding: utf-8
import pickle
from collections import OrderedDict
from scipy import io
import numpy as np

fname_dict_index_t = 'dict_index_t'
fname_matrix_x300 = 'matrix_x300'


def cos_sim(vec_a, vec_b):
	'''コサイン類似度の計算
	ベクトルvec_a、vec_bのコサイン類似度を求める

	戻り値：
	コサイン類似度
	'''
	norm_ab = np.linalg.norm(vec_a) * np.linalg.norm(vec_b)
	if norm_ab != 0:
		return np.dot(vec_a, vec_b) / norm_ab
	else:
		# ベクトルのノルムが0だと似ているかどうかの判断すらできないので最低値
		return -1


# 辞書読み込み
with open(fname_dict_index_t, 'rb') as data_file:
	dict_index_t = pickle.load(data_file)

# 行列読み込み
matrix_x300 = io.loadmat(fname_matrix_x300)['matrix_x300']

# 'United States'と'U.S'のコサイン類似度表示
vec_a = matrix_x300[dict_index_t['United_States']]
vec_b = matrix_x300[dict_index_t['U.S']]

print(cos_sim(vec_a, vec_b))
```

#### 実行結果：
```console:実行結果
0.832760703627
```

### コサイン類似度
コサイン類似度は、2つのベクトルがどれくらい同じ向きを向いているのかを表す指標です。単語のままだと似ているかどうかの判定ができませんが、単語をベクトル化したおかげで、コサイン類似度を調べれば似ているかどうかが判定できるようになりました。

ベクトル$ \boldsymbol{A} $、$ \boldsymbol{B} $のコサイン類似度は次の式で計算できます。

$$ \frac{\boldsymbol{A}\cdot\boldsymbol{B}}{|\boldsymbol{A}|\,|\boldsymbol{B}|} $$

ちなみに$ |\boldsymbol{A}| $はベクトル$ \boldsymbol{A} $の長さ（ノルム）で、[`numpy.linalg.norm()`](https://docs.scipy.org/doc/numpy-dev/reference/generated/numpy.linalg.norm.html#numpy-linalg-norm)で求められます。

コサイン類似度は最大が1で、値が大きい方が似ていることを示します。今回の実行結果は0.83くらいでしたので、「United States」と「U.S.」はかなり近い言葉だと推測したことになります。Wikipediaの記事を食わせただけで「United States」と「U.S.」が近い言葉だと推測するのは結構すごいことですね。

コサイン類似度の詳細は、「コサイン類似度」などでググってみてください。

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

*実行結果には、[100本ノックで用いるコーパス・データ](http://www.cl.ecei.tohoku.ac.jp/nlp100/#data)で配布されているデータの一部が含まれます。この第9章で用いているデータのライセンスは[クリエイティブ・コモンズ 表示-継承 3.0 非移植](https://creativecommons.org/licenses/by-sa/3.0/legalcode)（[日本語訳](https://creativecommons.org/licenses/by-sa/3.0/deed.ja)）です。*
H2 databaseインストール Linux




# やること
CentOSにH2databaseをインストールしてブラウザで確認するまで

## 必要なもの
Java


# インストール手順

1. `wget http://www.h2database.com/h2-2017-03-10.zip`
2. `unzip h2-2017-03-10.zip`
3. `cd h2`
4. `echo webAllowOthers=true > ~/.h2.server.properties`
5. `java -jar bin/h2-1.4.194.jar`


`webAllowOthers=true`はremote connectionを有効にするための設定
あとwebPortとwebSSLという項目があるっぽい(調べてない)

# アクセス

`http://localhost:8082`にアクセスするとログイン画面が出てくる

JDBC:URLに
`jdbc:h2:tcp://localhost/~/データベース名`

と入力して接続テストを行い、問題なければ接続

その後はSQL普通に書いて

以上


## 参照

[H2 tutorial](http://www.h2database.com/html/tutorial.html#console_settings "H2 tutorial")
Vueの算出プロパティが依存するデータを把握する仕組み

Vueには算出プロパティという、関数が依存するデータの変更を検知して関数を再実行してビューに反映させる機能があります。

算出プロパティを使ったコードの例

```html
<div id="el">
<!-- 算出プロパティを使用しているところ。foobarと表示される　-->
{{ computedValue }}
</div>
```

```js
new Vue({
  el: "#el",
  data: function () {
    return {value: 'foo'}
  },
  computed: {
    // これが算出プロパティの定義
    function computedValue () {
      return this.value + 'bar'
    }
  }
})
```

算出プロパティである computedValue() が this.value に依存していて、this.value = 'hoge' のようにして値を変更するとcomputedValueは再計算され、foobarだった表示がfoohogeになります。
データを変更するとすべての算出プロパティが再計算されるのではなく、本当に依存している算出プロパティだけが再計算されるのです。
なぜこんなことが可能なのか理解できなかったのでソースを追って調べてみました。

思いつかなかっただけですごく簡単でした。(最初はコードをパースしないと分からなくない？と思いましたが)

算出プロパティが実行される時に依存関係を発見する仕組みになっていました。
算出プロパティはWatcherというクラスで表されます。
また、その他のVueで管理されるデータはObserverというクラスで表されます。
このWatcher、Observerと依存を管理するDepというクラスを読むと仕組みが理解できます。

src/core/observer/index.js  (Observerはここに定義)
src/core/observer/watcher.js
src/core/observer/dep.js

算出プロパティが呼ばれるとWatcher#get()という関数が呼ばれます。
この関数が呼ばれると、自分自身を依存元を示すオブジェクトとしてマークしてから、実際の値を計算する関数を呼び出します。
値を計算するために依存先データのgetterが呼ばれるので、このときにマークしてあったオブジェクトを依存元(自分の変更を通知しなければならない対象)として追加します。
これで依存関係を正しく把握することができます。

すごーくおおざっぱに擬似的なコードを書くとこんな感じになっています。

```js

class Dep {
  constructor () {
    this.deps = []
  }
  add (target) {
    this.deps.push(target)
  }
  notify () {
    // 変更したことを this.deps に含まれるオブジェクトに伝える
  }
}

let depTarget = null
class Watcher {
  get () {
    depTarget = this
    this.getter.call()  // ここで実際の計算を行う
    depTarget = null
  }
}

class Observer {
  constructor (getter) {
    this.dep = new Dep()
    this.getter = getter
  }
  // 計算の中でデータを参照すると呼ばれる
  get () {
    this.dep.add(depTarget)    // 依存対象を追加する
    return this.getter.call()  // 実際の値を取得
  }
  set () {
    this.dep.notify()  // 自分自身の変更を伝える
  }
}
```

わかってしまえば簡単なものですね。
皆さん、なんでswitch文のcaseをインデントするんですか？

**お断り: この記事の内容は、所属先の見解ではありません。**

わりと何でもありのPHP界隈ですが、長年その状態を放置してきたため様々なスタイルのコードが存在することになり、PEARのようにまともにメンテナンスされてないコードを生み出してしましました。
さすがに何かしらの標準が必要では？　ということで、[PHP-FIG](http://www.php-fig.org/)という組織がPHPに関するコーディングスタイル、autoload仕様、インターフェイス仕様を決めており、事実上の標準になっています。

PHP-FIG発足とほぼ同時に制定された[PSR-1](http://www.php-fig.org/psr/psr-1/), [PSR-2](http://www.php-fig.org/psr/psr-2/)はコーディングスタイルに関する標準で、PSR-1が基本的な内容、PSR-2がそれに追加してカッコの位置、スペースの入れ方、インデントのとりかたなど細かい内容になっています。

PSR-1は誰でも割りと受け入れられやすい内容だとは思いますが、PSR-2はコーディングスタイルに深く踏み込んでるので、人によっては異論があると思います。

特に個人的に受け入れがたいのが2つあります。1つ目は

> 制御構造の開始時は、その後に１スペースを開けなければなりません。メソッドや関数の呼び出しはスペースを開けてはいけません。[^1]

というものです。

つまり、`if`や`for`、`while`、`do`、`switch`とその次のカッコとの間にスペースを入れろ。というものですね。

```php:PSR-2-NG
if($var == "abc"){
}
```

```php:PSR-2-OK
if ($var == "abc") {
}
```

スペースを入れる必然性がよくわかりません。実際のコードではスペースを入れるほうがむしろ少数派のように思えます。なんでわざわざスペースを置くことを決めたんでしょうか？　別にそこまで決めなくても良かったのではないかと思います。

そして、もう1つ。こちらが本題。

> switch制御は下記のようになります。 括弧、スペースの位置に注意してください。 case文はswitchからインデントし、break（またはその他の終端キーワード）は、case内本文と同じレベルのインデントで揃えなければなりません。 また意図的に処理スルーさせる場合は「// no break」等、コメントしなければなりません。

という部分です。`case`節は`switch`文からインデントしろ。と言ってるわけですね。

```php:PSR-2-NG
switch($var){
case 'A':
    break;
case 'B':
    break;
case 'C':
    break;
default:
}
```

```php:PSR-2-OK
switch ($var) {
    case 'A':
        break;
    case 'B':
        break;
    case 'C':
        break;
    default:
}
```

こちらについては、PSR-2のスタイルのほうが一般的なスタイルだとは思いますが、個人的に書くコードでは断固`case`をインデントしないスタイルを取っています。

なぜか。`case`をインデントすると**インデントは（制御構文における）分岐の範囲を表すものである。**という原則を壊してしまうからです。

先程のコードを例に取ります。

```php:PSR-2-NG
switch($var){
case 'A':
    break;
case 'B':
    break;
case 'C':
    break;
default:
}
```

この`switch`文によって分岐された各パターンが`case`節で表記されているわけであって、`switch`文の結果が`case`節によってさらに分岐されるわけではありません。

このことは、`if`〜`else if`〜`else`構文で書き換えてみればすぐにわかります。

```php:こうすると、わかりやすいでしょ？
if($var == 'A'){
    
} else if($var == 'B'){

} else if($var == 'C'){

} else {
    
}
```

ほら、見比べてみると`case`節をインデントしない方が自然に見えませんか？

さらに`case`節をインデントするスタイルだと`switch`文の中に`switch`文を置いた場合、一番内側の`case`が3インデント分深くなってしまい、ますます分岐のネストとインデントのネストが乖離してしまいます。[^2]

```php:多段switchすると更にわけわかめ…
switch($foo){
    case: 'A'
        switch($bar){
            case 'a':
                break;
            case 'b':
                break;
        }
        break;
}
```

`case`は文ではなく節であり[^3]（`goto`用の）ラベルに近い存在であるということ考えても、インデントしないほうが自然なんですけど、なんでインデントするとしてしまったのでしょう？

さて、ここで問います。「皆さん、なんで`switch`文の`case`節をインデントするんですか？」

追記: 「その定義だと、何もしない{}もインデントするなってことになるような。」とコメントを頂いたので、「（制御構文における）」という前提を追加しました。


[^1]: 日本語訳は[こちら](http://www.infiniteloop.co.jp/docs/psr/psr-2-coding-style-guide.html)から引用。
[^2]: もっとも`switch`文の中に`switch`文を置くこと自体がアンチパターンであって、リファクタリングされるべきです。
[^3]: PHPのマニュアルには「`case`文」と記述がありますが、他言語では一般には「節」と表現されます。
【Android】gh-pagesを使ってLibrary化したけどgradleがインポートしてくれなくて困った時のメモ

これ参考にしてライブラリ化したんだけどインポートしたいプロジェクトのgradleでコケて困ってたのでメモ。

[【Android】Libraryを作ってprivateなgithubリポジトリにpushして、チームのみんなでgradleに書くだけで使えるようにするまで](http://qiita.com/kgmyshin/items/87f560172c31c2fbd899)

gradleにリポジトリ書くところがダメだったっぽい。
これをgradleに書いた時に無いよ〜と言われて怒られる。

```
repositories {
    maven { url 'http://<githubユーザー名>.github.com/<githubリポジトリ名>/repository' }
}
```

ちょっと調べたら
gh-pagesでブランチを切った時にできるURLがこれらしい。

```
http://<githubユーザー名>.github.io/
```

なのでここをこんな風に書き換えるといけた。

```
repositories {
    maven { url 'http://<githubユーザー名>.github.io/<githubリポジトリ名>/repository' }
}
```
(Mac)nodebrewでディレクトリごとにバージョンを変えたい

## 本題に入る前に

[nodenv](https://github.com/nodenv/nodenv)はディレクトリごとにバージョン変える機能持ってるって。乗り換えできる人は乗り換えたほうが良さげです。

## 概要

プロジェクトごとにnodeのバージョンを変えたい時ってありますよね。ググっても出てこないし・・・。
direnvを用いて解決しました。

## 要約

プロジェクトルートディレクトリで

```
direnv edit .
# vi中-----
# バージョンのところをインストール済みのバージョンに書き換える
PATH_add ~/.nodebrew/node/v7.2.0/bin
```

## 仕組み

nodebrewは `~/.nodebrew/current/bin` のPATHにあるnodeを使用するようになっていて、`current`はシンボリックリンクでuseで指定したバージョンのディレクトリに向いてます。

そのため、direnvでPATHを追加することで `current` よりもそのPATHにあるnodeを優先して使ってくれるようになります。
oFアプリを完全にスタンドアロンでビルドする

　画像とかシェーダーとか使っているoFアプリをデスクトップにコピーして起動すると、リソースファイルがnot foundとなってしまいます。


* `.app/Contents/Resources内`にdataがコピーされていないこと
* .appが`/oFのプロジェクト/bin/data`を参照していること


が原因です。（多分）
これを解決しとかないと、.appとその横にあるdataフォルダも一緒に移動させないといけなく、ちょっと面倒です。


以下、その解決策。

## 1. Xcodeの設定を変更
　Build PhaseのCopy Bundle Resourcesにdataを追加。

![スクリーンショット 2017-03-29 20.57.16.png](https://qiita-image-store.s3.amazonaws.com/0/104234/34e9f094-616b-8f7f-ec22-72c7cfa04d71.png)


## 2. 参照するパスを変更
　ofApp:setup内に以下を追記

```
ofSetDataPathRoot("../Resources/data/");
```

　これでビルドすると、.app/Contents/Resources内にdataフォルダがコピーされ、それが参照されるようになり、.appだけで完結するようになります。（airdropとかで他マシンに渡しやすいのでは）



なんでデフォで設定してないんでしょうかね。。。🍺
GCP SDK使い方メモ

# GCPの使い方メモ
今後ちょいちょい追加していく

## コマンドから
1. コンソール起動
2. ログイン　`$ gcloud auth login`
3. ブラウザでログイン操作
4. 所有プロジェクト確認　`$ gcloud projects list`
5. プロジェクトの設定　`$ gcloud config set project プロジェクト名`
6. 設定の確認　`gcloud config list` →４と同じであれば問題なし。
7. GCSへアクセスチェック　`gsutil ls`


## gcloud コマンド
- アップデート　`gcloud components update`
- 設定　`gcloud config`
SwiftでjsonをphpへPOSTする




#ねらい
- 他でswift+jsonのpostがなかった
- 一番書かれているプログラムもswiftのバージョンが2系だったりphp側の処理がないので、今回は3系で記述しphpも
#実行環境
- swift3
- Xcode:8.4 beta
- macOS:Sierra 10.12.3
- php:7.0.15
- MAMP:4.1.1

#Swift側
一番やりたかったことが[書かれたコード](http://qiita.com/sushichop/items/ac4ae99b905ce523c2fe)があったんですが、２系だったため、今回はこれを３系に書き直しています。

```
override func viewDidLoad() {
        super.viewDidLoad()
        
        let urlString = "http://localhost:8888/test/postTest.php"
        
        let request = NSMutableURLRequest(url: URL(string: urlString)!)
        
        request.httpMethod = "POST"
        request.addValue("application/json", forHTTPHeaderField: "Content-Type")
        
        
        
        let params:[String:Any] = [
            "foo": "bar",
            "baz":[
                "a": 1,
                "b": 2,
                "x": 3]
        ]
        
        do{
            request.httpBody = try JSONSerialization.data(withJSONObject: params, options: .prettyPrinted)
            
            let task:URLSessionDataTask = URLSession.shared.dataTask(with: request as URLRequest, completionHandler: {(data,response,error) -> Void in
                let resultData = String(data: data!, encoding: .utf8)!
                print("result:\(resultData)")
                print("response:\(response)")
                
            })
            task.resume()
        }catch{
            print("Error:\(error)")
            return
        }
 }
```

##コードの説明(適当なところ)
###let urlString = "http://localhost:8888/test/postTest.php"

POST先のURIをここでい指定します。

###let params:[String:Any] = [: , :]
ここで、jsonファイルを作ってます。
swiftだとDictionary型が良いみたい。

###let resultData = String(data: data!, encoding: .utf8)!
ここで、サーバーでのファイル処理結果を表示します。
#PHP
本当に簡単に。

```
<?php

//recieve json from swift code
$json = file_get_contents('php://input');
echo $json;
$data = json_encode($json);
echo $data;
?>
```

##コードの説明(適当なところ)
###file_get_contents('php://input')

``file_get_contents``
->ファイルの中身をすべて文字列に読み込む

なにやら、bodyにくっついてるjsonデータをそのまま読み込む際は、引数に``'php://input'``を指定するとのこと。

#動作結果
Xcodeに次の結果が表示されます。

![Kobito.QiwfRg.png](https://qiita-image-store.s3.amazonaws.com/0/135757/57ee28b5-4fd5-0f9e-45a3-5139515ea198.png "Kobito.QiwfRg.png")


#参考ページ
- http://ivystar.jp/programming/php/what-is-phpinput/
- http://qiita.com/sushichop/items/ac4ae99b905ce523c2fe
Ruby高階関数の実験

RSpecのexpectが

```rb
a = -> { } # 本当のソースはlet使ったけど

expect(a)
expect(&a)
```
というように`a`でも`&a`でもどちらでも渡せたのでどうやるのかと思って、
自分で書いてみた。（RSpecのexpectと同じかどうかは知らない）

下記 `piyo`に注目。`a`でも`&a`でもどちらでも渡せた。さらに`{ }`の形式でも渡せる。
上記サンプルに書かなかったが、`expect`も`{ }`で渡せる。

```rb
a = -> { p 'AA' }

def hoge(procedure)
  procedure.call
end

def foo(&procedure)
  procedure.call
end

def piyo(procedure = nil, &procedure2)
  if block_given?
    procedure2.call
  else
    procedure.call
  end
end

##############################
# ここから呼び出し処理
##############################
hoge(a)
# hoge(&a) #=> 無理
# hoge { 'BB' } #=> 無理
foo(&a) #=> foo(a) はできない
foo { p 'BB' }
piyo(a)
piyo(&a)
piyo { p 'CC' }
```

出力結果

```
"AA"
"AA"
"BB"
"AA"
"AA"
"CC"
```

## piyoをRubyぽく書き直す
ということでpiyo関数をさらに発展させる。
どう発展させるかというとRubyの機能を使ってRubyぽく書き直す。
この発展させた関数をfugaとしたのが下記ソース。

`yield`を使えば第2引数を書く必要がなくなった。

```rb
a = -> { p 'AA' }

def fuga(procedure = nil)
  if block_given?
    yield
  else
    procedure.call
  end
end

fuga(a)
fuga(&a)
fuga { p 'CC' }
```

### .call のシンタックスシュガー .() を使う
.callはシンタックスシュガーがあるので下記のように書き換えれる

```rb
a = -> { p 'AA' }

def fuga(procedure = nil)
  if block_given?
    yield
  else
    procedure.()  # シンタックスシュガー
  end
end

fuga(a)
fuga(&a)
fuga { p 'CC' }
```

### じゃあ明示的に第2引数（最後にブロックを受け取る引数）を書きたいときはどんなとき？
受けっとた手続きをさらに別の引数に渡したいときに明示的に変数に入れたいのでこの場合は第2引数を書くらしい。

```rb
def my_map(procedure = nil, &procedure2)
  r = if block_given?
    (0..2).map(&procedure2) #=> ここでさらに別のメソッドの引数に渡している
  else
    (5..7).map(&procedure)
  end

  p r.to_a
end

a = ->(v){v}

my_map(a)
my_map(&a)
my_map {|v| v * 2}
```

結果:

```
[5, 6, 7]
[0, 1, 2]
[0, 2, 4]
```
Githubでアカウントを使い分ける

通常ユーザとは別のアカウントを使う必要がある場合

#新しい鍵を作成する
```
$ cd ~/.ssh
$ ssh-keygen -t rsa -f new_account
```
new_account.pubをGithubに登録する。

#.ssh/configを設定する

```~/.ssh/config
Host new_account
  Hostname github.com
  User git
  IdentityFile C:\Users\hoge\.ssh\new_account
```

# Gitのユーザ情報を設定
```
$ git config user.name 'new_account'
$ git config user.email 'new@example.com'
```

# remote.origin.urlを設定

```
$ git config remote.origin.url new_account:hoge/hoge.git
```
指定した文字を繰り返す。また数値のゼロ埋めを行う

#指定した文字を繰り返す

短いのでとりあえずサンプルコードを見たら一目瞭然かもしれません。

```javascript:1.指定した文字を繰り返す
var _len = 3; //繰り返し文字の回数（※文字列長ではなく繰り返し数であることに注意）
var _str = "FizzBuzz_"; //繰り返す文字列

console.log( Array(_len+1).join(_str) ); // 出力：FizzBuzz_FizzBuzz_FizzBuzz_
```

##解説

```javascript:1-1.指定長の配列を作る
Array(_len+1)
```

指定長の配列を作ります。値はすべてundefinedになります。
なぜ+1しているかというと……

```javascript:1-2.連結した文字列を返す
join(_str)
```

で文字列連結によって文字の繰り返しを行っているので、繰り返したい回数+1の配列が必要というすんぽう。
undefinedはjoinを行った時に空文字列になるので結合文字列だけが残ります。

#数値のゼロ埋めをする

結果は数値ではなく文字列です。

```javascript:2.数値のゼロ埋めをする
var _len = 6; //0埋めする桁数
var _val = 123; //0埋めしたい数値

console.log( (Array(_len+1).join("0")+_val).slice(-_len) ); // 出力：000123
```

##解説

```javascript:2-1.数値の先頭に"0"をくっつけて文字列化
Array(_len+1).join("0")+_val
```

まず指定文字の繰り返しで連続した"0"の文字列を作って数値と結合します。
この時点で文字列になります。

```javascript:2-2.文字列の切り出し
slice(-_len)
```

負の数を指定すると末尾からの切り出しになるので、余分な "0" は切り取られます。
期間を指定して、GitのコミットログをCSV出力する


# 概要
ちょっと探したら、そういうことの出来る、素敵なWebサービスもありそうではあるのですが。

 * 開発者じゃない人に「今月の開発内容」のようなものを共有したい。
 * 開発メンバーごとに、どのくらい作業をしているかの目安を出したい。
 * 毎月、開発した内容を振り返るのに使える資料を簡単に作りたい。

ということで。

何となくGitのコミットログをCSV出力して、Google SpreadSheetとかExcelとかに貼り付けることを考えました。


# やり方
コンソールでGitレポジトリのディレクトリを開き

```
git --no-pager log --since=2017-03-01  --until=2017-03-31 \
--pretty=format:"\"%ad\",\"%h\",\"%an\",\"%s\"" \
--date=short --no-merges --all --date-order > commits.txt
```

を実行。

(「2017-03-01」と「2017-03-31」の部分は、お好みの期間に書き換えてください)

これで、同ディレクトリに「commits.txt」というファイルが出力されます。

出力内容は

```
"日付","コミットのハッシュ","ユーザー名","コメント"
```

となります。

コマンドの中にある

```
--pretty=format:"\"%ad\",\"%h\",\"%an\",\"%s\""
```

の部分を変更することで、出力フォーマットは変更することができます。

# コマンドの説明

 * --no-pager → ページャーを使わない
 * log → コミットログを表示
 * --since=2017-03-01 → 2017年3月1日から
 * --until=2017-03-31 → 2017年3月31日まで
 * --pretty=format:"\"%ad\",\"%h\",\"%an\",\"%s\"" → 出力フォーマット指定
 * --date=short → 日付を「yyyy-mm-dd」の形式で表示
 * --no-merges → 親のあるコミットを省略
 * --all → 全てのブランチやリモートのコミットを表示
 * --date-order → 時間順にソート 


# 参考
http://qiita.com/harukasan/items/9149542584385e8dea75

http://dqn.sakusakutto.jp/2014/10/git_log_mine_this_month.html

http://blog.inouetakuya.info/entry/20110615/1308138313
jsonをjavascriptで読み込み

以下のjsonをjavascriptで読み込みたいのですが、上手くできないので
良い方法をどなたかお教えいただければ幸いです。

{
    "items": [
        {
            "category": "その他", 
            "pdf": "https://120170322424576.pdf", 
            "publishDate": "2017/03/22", 
            "title": "お知らせ"
        }, 
        {
            "category": "その他", 
            "pdf": "https://4553.pdf", 
            "publishDate": "2017/03/22", 
            "title": "一部変更に関するお知らせ"
        }
    ], 
    "paging": {
        "currentPage": 1, 
        "hasNext": true, 
        "itemCount": 17, 
        "pageSize": 10, 
        "totalPages": 2
    }
}
メソッドを読みやすく維持するいくつかの原則という記事のわからないところまとめ

http://qiita.com/hirokidaichi/items/c9a76191216f3cc6c4b2

この記事を読んで自分なりにわからないところをまとめながら理解していく

##ディスパッチテーブル

ディスパッチテーブル（キーと関数・メソッドの対応表）などを使って次の処理（関数）などを呼び出すこと

##productメソッド

```ruby
tx = %w(1 2 3 4 5)
ty = %w(a b c d e)

for point in tx.product(ty) 
  p(point)
end
```

このように使われていたのでproductメソッドを検索
->検索結果は以下

```ruby
dish1 = ["チキン", "ポーク", "マトン"]
dish2 = ["パン", "ライス"]
sets = dish1.product(dish2).collect {|set| set.join("+") }
puts sets.join(" ")


-> チキン+パン チキン+ライス ポーク+パン ポーク+ライス マトン+パン マトン+ライス
```

引数に複数の配列を指定することも可能
->次にcollectメソッドってなに

##collectメソッド

要素の数だけ繰り返しブロックを実行し、ブロックの戻り値を集めた配列を作成して返す

書き方

```ruby
array.collect {|item| block }
```
例(文字列を16進数に直す)

```ruby
numbers = ["68", "65", "6C", "6C", "6F"]
p numbers.collect {|item| item.to_i(16) }
```
返り値

```ruby
[104, 101, 108, 108, 111]
```




###さらに進めて・・・

今度はこのコードがわからない

```ruby
for point in tx.lazy.flat_map{|x| ty.lazy.map{|y|[x,y]} } 
  p(point)
end
```

##lazyメソッド
->参考
http://melborne.github.io/2012/07/06/enumerable-memo/

よくわからないので、もう少し調べてみようと思う。

##制御構造
->if文とかunlessとか

##データ構造
->データをコンピュータの中で扱う際にデータを格納する一定の形式のこと

http://www.techscore.com/blog/2016/10/05/%E9%96%8B%E7%99%BA%E6%96%B0%E5%8D%92%E3%81%AB%E6%8D%A7%E3%81%90%E3%80%81%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0%E3%81%AE%E5%9F%BA%E6%9C%AC%E3%81%A8%E7%89%B9%E5%BE%B4/

もう少し調べて書くつもり

##Gofの振る舞いに関するデザインパターン
詳しく勉強する必要がありそう…

##クロージャ

自分を囲むスコープにある変数を参照できる関数
以下が非常に参考になった(JSだとすごいわかりやすい！)
http://qiita.com/takeharu/items/4975031faf6f7baf077a

###またさらに進めて・・・

```
var sum = numbers.filter(isOdd).sum();
```
->言語すらわからん…

##selectメソッド
```ruby
.select(&method(:odd?))
```
条件に合う要素を探して集める。ブロック引数itemに要素を入れながらブロックを繰り返し、ブロックの戻り値が真になったときの要素を集め、新しい配列にして返す。
selectメソッド書き方

```ruby
array.select {|item| block }
```
じゃあ`&method(:odd?)`の部分は？
この記事がすごい参考になった！！
http://blog.livedoor.jp/sasata299/archives/51541958.html

##injectメソッド
```ruby
.inject(:+)
```

http://ref.xaio.jp/ruby/classes/enumerable/inject
こちらを参考
->ようは合計を表すということだった


##感想

すごい納得したが、わからないコードがあったので勉強にもなるしよかった。
今回解決できなかった部分とかブロックとかプロックとかそこらへんをしっかり理解したい
kobito-oss のソースの読み方

メインの開発者として、備忘録を残しておく。

https://github.com/increments/kobito-oss

どんなものか試したい人は、 https://mizchi.github.io/kobito-oss/ で、IndexedDBの許す5MBぐらいまでは試せる。

一応言っておくと、これは僕が退職するんでOSS化ってわけではなく、元々あった計画の前倒しです。時期が早まったのはある。

以下、どのようにコードを読むか。

## 念頭に置くこと

- **2年前** の技術選定のスタック
- Mac版Kobitoと仕様が違う。Kobitoと同期しない、Inboxという仮グループがある。
- mizchi/arda
- electron 以前の atom-shell 時代の互換コードが一部残ってる
- 細々とバグ対応はしつつ、あんまり依存パッケージのメンテ出来てなかった
- 公開にあたって、個別のタスクの綺麗さより、ビルドできるの優先した
- とりあえず yarn で固定して yarn upgrade-interactive でバージョンを上げた
- View周りが jade(pug)/coffee, それ以外が typescript

## 直したかったが、既存のものとの互換性を優先したもの

- 今だったら mizchi/md2react より remark-react を使う
- 当時IMEが壊れていたので、codemirror にパッチを当てまくったものを使ってるが、今だったらHEADで動く気がする
- coffeeはやめたいが、coffee => es2015 は検証する量が多くて無理(decaffeinate は完全ではない)
- react-jade も、あんまりメンテされてなくて、不穏
- typescript の module を使ってる箇所と使ってない箇所がある。連結方法も古い。(tsconfig.jsonが仕様になる前に書かれたので後から書き足している)
- コンパイラを更新して検出されるようになったものについては、any で潰した。すまん。

## とりあえず動かしてみる

ベース部分（SPA部分）ビルドする。

```sh
$ git@github.com:increments/kobito-oss.git
$ cd kobito-oss
$ cp config.json.example config.json
$ script/build
```

electorn パッケージを介して起動

```sh
$ npm install -g electron
$ electron electron-packager/browser
```

このとき、ファイル監視してビルドするタスクを走らせておけば、electron をリロードすると自動で適用される。

```js
$ cd application
$ yarn watch
```

## ブラウザ版で確認したい場合

```js
$ cd application
$ yarn build
```

これで application/public/index.html をブラウザで開くと表示されるはず。(yarn watch タスクはブラウザ版で必要なものをビルドしていない。これはすべてを browserify するのが重いから)

ビルドが終わったら、public 以下が完全なSPA。

## Web版の制限

- Qiitaにログインできない
- 右クリックのコンテキストメニューは出ない

ここだけElectron依存になってたため。自分でアクセストークンを入手して設定すれば動く、かも。

## Qiita へのログイン機能を有効化する

https://qiita.com/settings/applications からアプリケーションを登録する。注意点として、QiitaだけでなくQiita:TeamへのRead/Writeも取得すること。リダイレクト先はとりあえず https://qiica.com などを推奨。

あとは kobito-oss の config.json に clientId / clientSecret を埋め込んでからビルドする。自分自身がOAuth のホストにもなるので、 secret も必要。

## バイナリの作り方

```sh
script/build
cd electron-packager

# mac
script/build-mac

# win
script/build-win
```

## Linux ビルドの作り方

は用意してないが、既存のタスクをみて electron-packager のオプションでガチャガチャやればできるはず。

## 今後の開発方針

increments としては、あまり積極的にメンテ出来ない。本家とは切り離されているので、ここにコントリビュートしても適用されるわけではない。

寄ってたかって開発したい人が複数いるなら、kobito-usergroupなどのグループを取って、そこで開発してはどうか。可能な限り、質問に応えるが、4月から別の仕事なので、ベストエフォートで。
Photoshop scriptはUTF-8 with BOMにしておこう

Photoshop scriptで日本語を使うときには、スクリプトのエンコードはBOM付UTF8にしましょう。
BOMって何？って人は、[Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%90%E3%82%A4%E3%83%88%E3%82%AA%E3%83%BC%E3%83%80%E3%83%BC%E3%83%9E%E3%83%BC%E3%82%AF)や[このページ](http://blog.kyanny.me/entry/2016/03/16/040956)を参考にして下さい。

BOMが付いていないと、以下のような現象が発生します。以下の現象が起きたときは、BOMを疑って見て下さい。

* 日本語が文字化けする
* $.evalFileをしたタイミングでエラーが起きる(CS6以前。CCでは起きなくなっています)
[Gem] RMagick をCentOSでインストール

## RMagickって？
Ruby で画像処理ができるGemらしい。
エフェクトとかもかけれる。

詳しい使い方は下記で
http://qiita.com/scleen_x_x/items/14a80fd52e41dfcfb660

## インストール方法
まずImageMagickをyumでインストール

```
$ sudo yum -y install ImageMagick ImageMagick-devel
```

次にgemをインストール

```
$ gem install rmagick
```

## 他の画像処理系Gem
#### mini_magick
* ImageMagickより、機能が少ない（エフェクトかけれないなど）
* ImageMagickより、軽い

弱いサーバーで簡単な画像処理をする際におすすめです。

```
gem install mini_magick
```

詳しい使い方は下記で
http://guyon.hatenablog.jp/entry/20100808/1281230609
はじめてのヤマハルータ ～ローカルゲートウェイ編～

# はじめに

初めてヤマハのルータを触ったので、備忘録的に。
ルータの設定については、今までは家庭用ルータ(バッ〇ァローとか)のWeb UIでしか設定したことがない人です。

# やりたいこと

クローズドなネットワークと、インターネット系ネットワークをセキュアに接続したい。
クローズドなネットワークから、特定のWebサイトだけを見えるようにしたい。

インターネットに接続する端末のみ、デフォルトゲートウェイの設定を変更することで
外に出られるようにできればいいな。


# 動作確認環境、使用ライブラリ等

- YAMAHA RTX810
- シリアルケーブル
- 検証用端末 何台か


# 設定内容

マニュアルもリファレンスも玄人向けな感じでちょっと面食らいつつも、
手探りで作り上げたconfigは以下の通り。

- クローズドなネットワーク: 192.168.11.0/24
 - ゲートウェイ: 192.168.11.254
 - 外に出たいPCのIP: 192.168.11.25
 - ルータのIP: 192.168.11.2(LAN2)
- インターネット系ネットワーク: 192.168.100.0/24
 - ゲートウェイ: 192.168.100.1
 - ルータのIP: 192.168.100.2(LAN1) 
- 接続先IPアドレス: 61.45.247.29 (jp.yamaha.com)

```text:config
# RTX810 Rev.11.01.28 (Thu Sep 29 16:07:20 2016)
# MAC Address : 
# Memory 128Mbytes, 2LAN
# main:  RTX810 ver=00 serial= MAC-Address= MAC-Address=
# Reporting Date: Mar 29 18:44:55 2017
administrator password *
timezone +09:00
console character ascii
ip route default gateway 192.168.100.1
ip lan1 address 192.168.11.2/24
ip lan2 address 192.168.100.2/24
ip lan2 secure filter in 21999
ip lan2 secure filter out dynamic 220001 220002
ip lan2 nat descriptor 1
ip filter 21999 reject * *
ip filter dynamic 220001 192.168.11.25 61.45.247.29 www
ip filter dynamic 220002 * * domain
nat descriptor type 1 masquerade
nat descriptor address outer 1 192.168.100.2
nat descriptor address inner 1 192.168.11.1-192.168.11.254
dns service recursive
dns server 192.168.100.1
```

# 簡単な解説

設定内容については、ヤマハの設定例を参考にした。
[ローカルルーターで複数のLANを接続(片方向の通信 / 動的IPマスカレード) : コマンド設定](http://jp.yamaha.com/products/network/solution/security/lan_side/ip_masquerade/)


## 基本設定

- インターフェイス LAN1(クローズ側)、LAN2(インターネット側)のIPアドレス、デフォルトゲートウェイを設定。
- DNSリカーシブモード(リレーおよびキャッシュ)で動作させる。
- インターネット側(LAN2)にIPマスカレードを設定する。
- 上位のDNSサーバを指定。
- タイムゾーンを指定。
- 管理者パスワードを指定。
- コンソールの文字コードを指定。

## フィルタリング設定

- インターネット側(LAN2)からのインバウンドパケットは全て破棄。
- クローズネット側(LAN1)から、特定のIPアドレスから特定のIPアドレスに対するWebアクセスは通す(ダイナミック)。
- クローズネット側(LAN1)から、任意のDNS問い合わせは通す(ダイナミック)。


# 動作確認

- インターネット系から、自由にインターネットへ出られることを確認。
- インターネット系から、ルータのLAN2インターフェイスにポートスキャンをかけて、ポートが開いていないことを確認。
- クローズネット側の192.168.11.50(外に出したくない端末)のデフォルトゲートウェイをルータに設定した上で…
 - インターネット上のWebサーバに対し、HTTP/HTTPSアクセスできないことを確認。
 - インターネット系のFTPサーバに対し、FTP接続できないことを確認。
- クローズネット側の192.168.11.25(外に出したい端末)のデフォルトゲートウェイをルータに設定した上で…
 - インターネット上の特定のIPを持つWebサーバ(jp.yamaha.com:61.45.247.29)に対し、HTTPアクセスできることを確認。
 - その他のIPを持つWebサーバに対するHTTP/HTTPSアクセスができないことを確認。
 - インターネット系のFTPサーバに対し、FTP接続できないことを確認。


# 所感

Webからも設定ができるけど、コマンド入力で苦しんだ方が身になるかなと。
最初は うぇっ… と思ったけども、なんとなく分かった気がしてる。

これまずいんじゃね？ こうした方がいいんじゃね？ など、アドバイスを頂ければ幸いであります。
Laravel のマイグレーションで、ロールバックしようとすると Class not found

Laravel 5.1 にて。

```
php artisan migrate:rollback
```

>
 [Symfony\Component\Debug\Exception\FatalThrowableError]
 Class'CreateHogeTable' not found

いやいやクラス名正しいし、普通にファイルも存在しているし、命名規則も合ってる。

ぐぐったら解決した。

https://laracasts.com/discuss/channels/laravel/php-artisan-migraterollback-error?page=1

```
php artisan optimize
```

`rollback` 時だけなる、というのがハマりポイントかもしれない。
Terminalで色付きadb logcat

# やりたいこと
Eclipse / Android StudioのようなLog Levelごとに色がついているadb logcatをLinuxのTerminal上でも実現したい．
IDE上のlogcat表示だとエリアも小さいし，操作もしづらいので，別WindowのTerminal上で同様のことをしたい．

2010年ごろに先輩に教えてもらって，カスタムしながらいまでも現役で使っているscriptです．

# Code
## shell script

```sh:logcat.sh
#!/bin/sh

while true; do
    adb logcat -v time | logcat_color.awk
    echo "#### DEVICE DISCONNECTED !"
done
```
adb logcatの出力をlogcat_color.awkに渡し続けています．
USBが切断されたときもメッセージを出して接続待ち状態になります．

CTRL+C で終了．

## awk

```sh:logcat_color.awk
#!/usr/bin/awk -f

# adb logcat -v time
/^.* V\/.*$/ { print "\033[0m" $0 }
/^.* D\/.*$/ { print "\033[0;34m" $0 "\033[0m" }
/^.* I\/.*$/ { print "\033[0;32m" $0 "\033[0m" }
/^.* W\/.*$/ { print "\033[0;31m" $0 "\033[0m" }
/^.* E\/.*$/ { print "\033[1;31m" $0 "\033[0m" }
```
Log Level(V, D, I, W, E)を判定して，Text Styleを指定してprintしています．
//の間がawkの正規表現で，下記の文法を使って各Log Levelを判定しています．

```
"^"     : 行頭
".*"    : 何かの文字が復数個
" E\/"  : " E/" の存在判定
".*"    : 何かの文字が複数個
"$"     : 文字列終端
```
上の例はadb logcat -v timeの出力用で，logcatのoption次第で判定文はカスタム必要です．

{ print xxx } の部分が実際にTerminal上に表示するところで，各Log Levelごとに下記のstyleとcolorを指定しています．

```
ESC[<色コード>m  : これ以降のstyleとcolor指定

print "\033[<色コード変える>m" $0 "\033[<色コード戻す>m"
("\033" = ESC)

\033[0m     : Default
\033[0;34m  : Blue
\033[0;32m  : Green
\033[0;31m  : Red
\033[1;31m  : Bold Red
```

# Logcat出力
上の2つのファイルにPathを通して，Terminalで
$ logcat.sh
を実行すると，下記のような出力になります．Log Levelごとに色が分かれててわかりやすいです．

開発中の一時LogなどをError Levelで出力して，まわりのLogと合わせて確認するときなど便利です．

![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/129035/c0085ae3-0cfb-6efc-2500-9bfdb26d65f2.png)

///---
「killer」 と 「murder」 コマンドを作った

何番煎じかわからないが、やはり設定したら便利だった。

`ps aux | grep chromium` とかやってたのが懐かしい。

```bash:.config/fish/config.fish 
alias killer='ps aux | fzf --tac | awk "{print $2}" | xargs kill'
alias murder='ps aux | fzf --tac | awk "{print $2}" | xargs kill -9'
```
Fish Shell で、現在入力中のコマンドをクリップボードにコピー

もっと早く設定しておくべきだった。

人にコマンドを説明する時などに、 `history` から適当に調べて送ったりする。

その度に `echo '[some command]' | xsel -ib` みたいなことをしていたが、エスケープされると面倒なのでどうにかしたいと思っていた。

`M-e` でVimを立ち上げるという手もあるが、それですら面倒だ。

流石にストレスになったので、下記のキーバインドを作成した。

```vim:.config/fish/config.fish 
function __copy_command
  echo (commandline -b) | xsel -ib
end

bind \ew __copy_command
```

これでコマンド入力中に、 `M-w` でクリップボードにコピーされるので、適当に貼り付けて送ればOK。
bundle install するとlibv8が...noになる


- MacOS EL Capitan 10.11.6
- Ruby 2.3.3

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

.
.
.
siteconf20170329-3176-1qijbxq.rb extconf.rb
checking for main() in -lpthread... yes
checking for main() in -lobjc... yes
checking for v8.h... no
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
	--with-opt-dir
	--without-opt-dir
	--with-opt-include
	--without-opt-include=${opt-dir}/include
	--with-opt-lib
	--without-opt-lib=${opt-dir}/lib
	--with-make-prog
	--without-make-prog
	--srcdir=.
	--curdir
	--ruby=/Users/taku/.rbenv/versions/2.3.3/bin/$(RUBY_BASE_NAME)
	--with-pthreadlib
	--without-pthreadlib
	--with-objclib
	--without-objclib
	--enable-debug
	--disable-debug
	--with-v8-dir
	--without-v8-dir
	--with-v8-include
	--without-v8-include=${v8-dir}/include
	--with-v8-lib
	--without-v8-lib=${v8-dir}/lib
.
.
.

thanks,
The Mgmt

	from /Users/taku/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/libv8-3.16.14.13/lib/libv8.rb:7:in `configure_makefile'
	from extconf.rb:32:in `<main>'

To see why this extension failed to compile, please check the mkmf.log which can be found here:

.
.
.

extconf failed, exit code 1

.
.
.

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

libv8をインストールします

```
$ bundle update libv8
```

えっ通った？

```
$ bundle install

.
.
.
Bundle complete! 97 Gemfile dependencies, 200 gems now installed.
Use `bundle show [gemname]` to see where a bundled gem is installed.
```

でけたーーーーーーーーーーー！
２日もかかった...
rmagickがgem installできない「Can't install RMagick 2.15.4. Can't find MagickWand.h.」


- MacOS EL Capitan 10.11.6
- Ruby 2.3.3

Macをクリーンインストールして、会社のプロジェクトを環境構築した時のお話...

```
$ bundle install
```

```
Installing therubyracer 0.12.2 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
.
.
.
checking for clang... yes
checking for Magick-config... no
checking for pkg-config... yes
checking for outdated ImageMagick version (<= 6.4.9)... no
checking for Ruby version >= 1.8.5... yes
checking for stdint.h... yes
checking for sys/types.h... yes
checking for wand/MagickWand.h... no

Can't install RMagick 2.15.4. Can't find MagickWand.h.
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
	--with-opt-dir
	--without-opt-dir
	--with-opt-include
	--without-opt-include=${opt-dir}/include
	--with-opt-lib
	--without-opt-lib=${opt-dir}/lib
	--with-make-prog
	--without-make-prog
	--srcdir=.
	--curdir
	--ruby=/Users/taku/.rbenv/versions/2.3.3/bin/$(RUBY_BASE_NAME)

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

問題は、rmagick さんが ImageMagick 7系に対応してないんですって。
imagemagickのバージョン確認は、こちら。

```
$ brew info imagemagick
imagemagick: stable 7.0.5-3 (bottled), HEAD
```



# 解決方法

## 手順1
まずは、いったん削除する

```
$ brew uninstall imagemagick
```

# 手順2
6系を再インストール

```
brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/6f014f2b7f1f9e618fd5c0ae9c93befea671f8be/Formula/imagemagick.rb
```

# 手順3
もっかいrmagicをインストールする

```
$ gem install rmagick
```
Mac にAndroidStudioではなく IntelliJ IDEA Community Edition でandroid 開発環境を構築する

なんでAndroid Studio と IntelliJ IDEA と両方入れなアカンねん という人用

java 初心者のため指摘頂けると嬉しいです。

## android-sdk のインストール

```
brew cask install android-sdk
```

環境変数を .zshrcに書く

```
export JAVA_HOME=`/usr/libexec/java_home -v 1.8`
export STUDIO_JDK=${JAVA_HOME%/*/*}
export ANDROID_HOME=/usr/local/Caskroom/android-sdk/25.2.3
```

IntelliJ IDEA 用の環境変数設定
```
launchctl setenv ANDROID_HOME /usr/local/Caskroom/android-sdk/25.2.3
```

使うバージョンのプラットフォーム? をインストール
```
sdkmanager "platforms;android-25"
```

## IntelliJ IDEA側の設定
Project Structure -> Project -> Project SDK で Newから /usr/local/Caskroom/android-sdk/25.2.3 を選択
NetCommons3でプラグインのテンプレートをカスタマイズする方法


# アップデートで上書きされないようにテーマ下テンプレートを利用する

プラグインのテンプレートをカスタムしたいときに、いきなり各プラグインのViewにあるファイルをいじるのはやめましょう。

直接既存のファイルを編集してしまうとNetCommons3のアップデートで変更したファイルが上書きされて編集前の状態にもどってしまいます。

じゃぁどうするのかっていうと、テーマ下にテンプレートを追加する方法が良いと思います。XOOPS, XOOPS Cubeを使ってこられた方にはおなじみ「テーマ下テンプレート」ですね。

# テーマ下テンプレートはどこに追加するの？
NetCommons3（というかCakePHP2の話なんですけどね）のテーマフォルダはapp/View/Themedになります。

インストール直後のThemedには Default, DefaultBlueなどのフォルダがあるはずです。
それぞれがひとつひとつのテーマになってます。

この下にPlugin/プラグインディレクトリ名/プラグイン内のViewフォルダの内側と同じ階層構造　って感じでファイルを追加します。

ためしにDefaultテーマでコメントの表示テンプレートをカスタムしてみましょう。

今回カスタムしたいのは 
```app/Plugin/ContentComments/View/Elements/indexOnce.ctp```
です。

なのでこのファイルを
```app/View/Themed/Default/Plugin/ContentComments/Elements/indexOnce.ctp```
としてコピーします。

あとはコピーしたファイルをすきにいじっちゃってください。このコピー下ファイルをつかってコメントが表示されるようになります。

もちろんいじり方しくじるとエラーになって画面真っ白になるとか画面にエラーメッセージでるとか、セキュリティホールをつくりこんじゃうこともあるので、そこは注意してくださいね。

# アップデート時は自分で差分をチェックしましょう
この方法を使うとアップデートでカスタムしたテンプレートが上書きされなくなるので、アップデートでテンプレートの中身が変わったときは自分でどこが変更されたかを確認してカスタムしたテンプレートに反映する必要があります。

それをしないと場合によってはバグやセキュリティホールを放置することになっちゃうんで要注意です。

まぁこのあたり不安であればお仕事として依頼してください^^;

---
(以下2017/06/14追記)
# 管理画面のテンプレートはDefaultテーマ配下に追加

NetCommons3の管理画面はDefaultテーマ固定のようなので、管理画面のテンプレートをカスタムしたいときは、Defaultテーマ配下で同様のコトをおこなわないとダメなようです。
Safariでブラウザバックしたときに何かしたい

Safariでブラウザバックしたときにリロードが走らず、前画面などで二重サブミット処理を実装していたとき、最送信できない→設定していたフラグを戻すとういう処理を行いたかった。

# 試したイベントなど
## pageshow
```js
window.onpageshow = function() {
    // do
};

window.addEventListener('pageshow', function() {
    // do
}, false);

// jQuery
$(window).on('pageshow', function() {
   // do
});
```
pageshowで実装する方法があるが、これだと1回目のブラウザバックしか検知しなかった。

## popstate
```js
window.onpopstate = function() {
    // do
};

window.addEventListener('popstate', function() {
    // do
}, false);

// jQuery
$(window).on('popstate', function() {
    // do
});
```
popstateを使えば検知できるがhisotoryのstateを先に変更しておかなければならない。

## replacestate
```js
history.replaceState(null, document.getElementsByTagName('title')[0].innerHTML, null);
```
pushstateでよく情報が出て来るが、履歴に追加→履歴が増えてしまうので、replacestateで実装。

# 結論
```js
history.replaceState(null, document.getElementsByTagName('title')[0].innerHTML, null);
window.addEventListener('popstate', function() {
    // do
}, false);
```
hisotoryをリプレイスさせておき、次のページへ遷移→ブラウザバックでpopstateを検知して処理を実行させた。
IE10〜だ。
Cognos Framework Managerで変更されたテーブル定義を更新で取り込む

##概要
Cognos BI&Analyticsで、Framework Managerを用いてモデル生成する時に、データソース上のテーブル定義が変更された際に、その内容をFMモデルに反映する時に、クエリー・サブジェクトを再作成している方を時々お見受けしますので、反映をモデルに更新する方法を投稿しておきます。
操作は簡単なので、知っているか知らないかだけです。

##操作
以下の様な2つのテーブル(TBL1,TBL2)をFMモデルに取り込んでいたとします。
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/2c248259-e3ac-2176-d350-218454c6212b.png)

![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/055f3402-eded-4cb2-87ac-b1446102c8bd.png)

モデルは以下のようになっています。
TBL2のCOL2は、赤枠のようにファクトで、データ型はInt32で認識されています。
![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/f9c28e5c-2b39-62d0-0e55-8b5e7a7711f9.png)

TBL1にVOLUME列を追加してみました。
![004.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/1165168f-37a6-06c6-34ca-f2e495dd5c4c.png)

TBL2のCOL2のデータタイプをVARCHARに変更しました。
![005.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/2fcc105d-87d9-d883-6ad7-20ab52317ba9.png)

これらのテーブル定義の変更をFMモデルに取り込むためには、更新したいオブジェクトを選択後に、図のように「ツール」→「オブジェクトを更新」とやります。
![006.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/276a225d-e24f-6fb4-d2d1-3b9ab1e451fc.png)

このように、TBL1にVOLUME列が追加され、TBL2のCOL2のデータ型はcharacterlength16に変更になっています。
しかしながら、青枠の使用方法は変更にならないので、
![007.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/5c7e5517-9c0f-3ea2-7426-a1d2a7d31460.png)

ここは自分で属性などに変更が必要です。
![008.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/e970b6b4-0df0-f1ca-8122-1240f8bda8c9.png)
VyOSインストールメモ



# Deploy
[公式](http://packages.vyos.net/iso/release/1.1.7/)からOVAをダウンロードしてデプロイ。起動。

メモ:
- デプロイ時、IPアドレスはstaticにアサインできない(DHCPしかない)
- 起動直後に/sbin/ifconfigで確認すると、IPv4のアドレスは振られていない(DHCPサーバいない環境なので当たり前ではある)

# 設定
ログインはvyos/vyos
今回はOVAなので、install imageは不要。コンソールでログインし、まずはIPアドレスだけ。

```shell-session
vyos@vyos:~$ configure
vyos@vyos# set interfaces ethernet eth0 address '10.32.46.243/24'
vyos@vyos# set interfaces ethernet eth0 description 'outside'
vyos@vyos# set service ssh port 22
vyos@vyos# set system gateway-address 10.32.46.1
vyos@vyos# commit
vyos@vyos# save
```
これでSSHでログインできるようになるので、あとはSSHで。

## NIC追加
OVAだとデフォルトでは1つしかNICがないため追加する。単純にVMの設定編集からでOK。
メモ:
- デフォルトのNICはVMXNET3だが、追加時はE1000しか選べなかった。追加後にreboot。

## 残りのネットワーク設定
### eth1へのIPアドレス設定

```shell-session
vyos@vyos# set interfaces ethernet eth1 address '192.168.11.243/24'
vyos@vyos# set interfaces ethernet eth1 description 'inside'
```

### タイムゾーン

```shell-session
vyos@vyos# set system time-zone 'Asia/Tokyo'
```

### NTP

```shell-session
vyos@vyos# del system ntp server
vyos@vyos# set system ntp server '192.168.11.5'
```

### DNS

```shell-session
vyos@vyos# del system name-server

  Nothing to delete (the specified node does not exist)

vyos@vyos# set system name-server '10.254.174.10'
vyos@vyos# set system name-server '192.168.11.5'
vyos@vyos# set system domain-search domain 'ngy.local'
```

### SNATの設定(IPマスカレード)

```shell-session
vyos@vyos# set nat source rule 100 outbound-interface 'eth0'
vyos@vyos# set nat source rule 100 source address '192.168.11.0/24'
vyos@vyos# set nat source rule 100 translation address masquerade
```

ここまでで、192.168.11.0/24にあるマシンは、ゲートウェイとして192.168.11.243を指定すれば外に出ていける。
ただ、外からこのVMへはアクセスできない。
ruleの番号は小さいほうから順にチェックされ、当てはまればそれが、当てはまらなければ次へ、となる。

## DNS forwardingの設定

```shell-session
vyos@vyos# set service dns forwarding cache-size '0'
vyos@vyos# set service dns forwarding listen-on 'eth1'
vyos@vyos# set service dns forwarding name-server '10.254.174.10'
vyos@vyos# set service dns forwarding name-server '192.168.11.5'
```

これで、192.168.11.0/24にあるマシンは、DNSとして192.168.11.243(VyOSのeth1)を指定すれば名前解決可能。

## DNATの設定(ポートフォワーディング)

```shell-session
vyos@vyos# set nat destination rule 10 description 'Port Forward: SSH to 192.168.11.120'
vyos@vyos# set nat destination rule 10 destination port '2201'
vyos@vyos# set nat destination rule 10 inbound-interface 'eth0'
vyos@vyos# set nat destination rule 10 protocol 'tcp'
vyos@vyos# set nat destination rule 10 translation address '192.168.11.120'
vyos@vyos# set nat destination rule 10 translation port '22'
```

これで、外からVyOSのポート2201にアクセスすれば、192.168.11.0/24にあるマシン(ここでは192.168.11.120)のポート22にアクセスできる。
ruleの番号については、同様に小さいほうから。

# 所感
お手軽です。検証環境のIPアドレスがあんまり取れない環境なので、非常に助かります。
時間見つけて、FirewallとかVPNもやりたい。
（メモ） python argparse  で注意すること

自分用の（メモ）として書いておきますが、役立つ人もあったらいいなと思って書いています。
とりあえず、なんちゃってレベルでかきはじめていきますので、つっこみ大歓迎です。
 
python の argparse をつかってクラスに情報を送り込むときの注意点です。

x.py として下記をつくり

```
#!/usr/bin/env python
import sys
import argparse
import unittest

class testtst(unittest.TestCase):
    def setUp(self):
         pass

PARSER = argparse.ArgumentParser()
PARSER.add_argument("--browser")
# MY_ARGS を作って送り込みます。
MY_ARGS = PARSER.parse_args()



if __name__ == "__main__":
    """
    # この部分がないとエラーになります。
    if sys.argv:
        del sys.argv[1:]
    """
    unittest.main()
```

下記を実行するとエラーになります。

```
python x.py --browser Chrome 


usage: x.py [-h] [--broswer BROSWER]
x.py: error: unrecognized arguments: --browser Chrome
```

この部分がないとエラーになりますのところをコメントアウトしてください。