OmniAICreator/Qiita-1.07M huggingface dataset:
Fertile Forest Model (11/n) 実数列化ツリーモデル

# 実数列化ツリーモデル (Linearized Tree Model)

「入れ子集合モデル」の左右カラムを実数化した「入れ子区間モデル」と同じく、 FF モデルにも 序列カラムを実数化した「実数列化ツリーモデル（ Linearized Tree Model ）」があります。 QUEUE を実数にすれば、その間が無限に区切れます。これを利用すれば、ノード追加時のコストが軽減できるというわけです。

「実数列化ツリーモデル」は理論上は成立しますが、実用した際に問題が発生することが分かっています。その根拠も入れ子集合モデルと同じで、実数の精度が有限なので無限に区切れないというものでした。

## 結論に至った経緯

FFモデルのライブラリは、当初は「肥沃な森林モデル」と「実数列化ツリーモデル」を同時に公開する予定で進めていました。ところが、実装中に上記の問題に行き当たり、それが解決不能であることが分かりました。実際にライブラリを作成してみた人でないと気づきにくいかと思います。

現時点では解決不能と結論づけていますが、将来その問題がクリアできるアイディアが得られる可能性はあります。もし見つかったなら、改めて実数列化ツリーモデルのライブラリを作成する予定でいます。
C++標準ライブラリをdebug modeで使う

標準ライブラリは効率のために最適化されていたりするので，fail safeではなかったり，あるいはassertが無かったりして，デバッグが大変．
GCCとClangの標準ライブラリには，debug modeがあるとのこと．

|コンパイラ|debug modeを使うためのマクロ|参考情報|
|----|----|----|
|GCC|`_GLIBCXX_DEBUG`|[Chapter 17. Debug Mode](https://gcc.gnu.org/onlinedocs/libstdc++/manual/debug_mode.html "Chapter 17. Debug Mode")|
|Clang|`_LIBCPP_DEBUG`|[libc++ debug mode status](http://libcxx.llvm.org/debug_mode.html "libc++ debug mode status")|

例えば，上のマクロを`-D_GLIBCXX_DEBUG`という風に，コンパイラのコマンドラインオプションを利用して定義して使う．
試しに使ってみたところ，パフォーマンスへの影響が結構出た．
RxSwift 2.0.0-rc.0 にアップデートしたときの Variable is deprecated ワーニングに対処する

おととい RxSwift の 2.0.0 RC がリリースされたので さっそくアップデートしてみました。
ところが たくさんのビルドワーニングが出てしまったので その対処をまとめます。

# 追記(2016-01-02)

さきほど 2.0.0 がリリースされました。
2.0.0 では `Variable` から `ObservableType` の実装自体が取り除かれており、同プロトコル由来のメソッドを使うとビルドエラーになります。

> Removes deprecated APIs.
> https://github.com/ReactiveX/RxSwift/commit/aca3b2821339654f936dabf7b201f112e0e8a780#diff-0e55b16927fa1b61df214216489f0599L19

# ビルドワーニング詳細

ワーニングの内容としては `Variable` が `ObservableType` でなくなるというものです:

> 'Variable' is deprecated: Variable will remain in the 2.0.0 API, but just use `variable.asObservable()` because it won't be `ObservableType` (no way to warn about deprecated interface implementation). Just do, `variable.asObservable().map { _ in ...}` and ignore this warning.

CHANGELOG にも記載がありました:

> Deprecates Variable implementing ObservableType in favor of asObservable().
> https://github.com/ReactiveX/RxSwift/blob/83bac6db0cd4f7dd3e706afc6747bd5797ea16ff/CHANGELOG.md#deprecated

# 対処方法

対処方法としては `Variable`オブジェクト をいちど `asObservable` メソッドで `Observable` に変換したのち `ObservableType` のメソッドを使います。

注意点として、`Observable` は `Variable` と異なり `.Completed` を出力します: 

> Now variable also sends .Completed to observable sequence returned from asObservable when deallocated.
> https://github.com/ReactiveX/RxSwift/blob/83bac6db0cd4f7dd3e706afc6747bd5797ea16ff/CHANGELOG.md#deprecated

# 参考資料

- [Deprecates `Variable` implementing `ObservableType` in favor of `asOb…] (https://github.com/ReactiveX/RxSwift/commit/8b2984e4e28e27da33476dc17db94166d072afc0#diff-3e60cec73204dcf051118fed9641c4f1)
virtualenvでよく使うコマンド

virtualenvでよく使うコマンドを記載


pythonのバージョン指定で仮想環境を作成。
~/hogeは仮想環境の作成ディレクトリの指定

```
$ virtualenv hoge_env --python=/usr/bin/python2.6　~/hoge
```

仮想環境をactiveにします

```
$ source ~/hoge/bin/activate
```


仮想環境をdeactiveにします

```
$ deactivate
```


以上
Travis CIに最新のGoogle Chromeをインストールする

[Travis CI + Karma + ChromeでCIしてた](http://niwaringo.tumblr.com/post/108075124504/karma-chrome%E3%81%A7travisci%E3%81%99%E3%82%8B)らChromeが古過ぎてテストがこけた。
travis.ymlを下のようにしたら最新のChromeでテストを行ってくれるようになった。

```yaml:travis.yml
language: node_js
node_js:
    - 4.2
before_install:
    - sudo apt-get update
    - sudo apt-get install --assume-yes fonts-liberation libappindicator1
    - wget -O /tmp/chrome.deb https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
    - sudo dpkg -i /tmp/chrome.deb
    - export CHROME_BIN=google-chrome-stable
    - export DISPLAY=:99.0
    - sh -e /etc/init.d/xvfb start
```

[sudoを使うのは本当は良くない](https://docs.travis-ci.com/user/migrating-from-legacy/)らしいんだけどとりあえず動いてるのでsudo未使用にする作業は保留中。
Unity5.3でシーン追加読み込みをやる時に気をつけるメモ


Unity5.3から`Applictation.LoadLevelAsync`などが非推奨になり、
代わりに`SceneManager.LoadSceneAsync`などの使用を求められるようになりました。
アプデ後に既存のコードを修正するにあたり、１点見落としていて思い通りの挙動にならずちょっと焦ったのでメモ。

前バージョンでいう`Appliation.LoadLevelAdditiveAsync`と同様の挙動を行わせるには、
`SceneManager.LoadSceneAsync`の第二引数に`LoadSceneMode.Additive`を渡す必要があります。

```csharp
UnityEngine.SceneManagement.SceneManager.LoadSceneAsync( sceneName, UnityEngine.SceneManagement.LoadSceneMode.Additive );
```

これやらないと追加読み込みにならず`Application.LoadLevelAsync`と同じ挙動になってしまいます。
最初気づかなくて「どうした、なぜ動かん！？」状態に…

# 読み込んだ後の話

「読み込んだシーンからゲームオブジェクト外してシーン統合する」みたいなことをやっていた場合、前バージョンのやり方そのままだとたぶん
「統合はできたけど読み込んだシーンオブジェクトだけ残りっぱなし」
となり、ヒエラルキ上に何もゲームオブジェクトの入ってないシーンオブジェクトが並ぶという見た目になります。
ちゃんとゲームオブジェクトの移動自体はされているので動作自体は大丈夫なのですが、ここで問題になるのは
`SceneManager.UnloadScene`でシーンを破棄しないと**次の同じシーンを読み込んだらシーンオブジェクトが重複する**という点です。
見た目が大変よろしくありませんしそもそも残りっぱなしなのはいけません。
解決方法をまだきっちり調べたわけではないので「コレ！」というものは書けませんが、
とりあえず自分の場合は書き手側で破棄関数を呼び出す必要のあるシステムを作っていたので
読み込み直後のシーンオブジェクト本体はそのままにしておきつつ、破棄関数が呼び出されたら一緒にシーンオブジェクトを`SceneManager.UnloadScene`で破棄するという手法を取りました。

「普通は`SceneManager.MergeScene`とか使うんじゃないの」と思ったのですが
前述の方法でだいたいなんとかなってしまったせいもあって
やるのにシーンオブジェクトの取得が必要だというところまで調べて急にめんどくさくなってやめました（ごめんなさい必要になったら調べます…）
（続）なぜベンチャーで docker を使うのか

タイトルの通り、『なぜベンチャーで docker を使うのか』の続編です。

弊社の代表が NHK の某番組に出演させていただく機会がありまして、実はこんなことをしていました。

- [gatling による負荷試験とテレビ露出見積り](http://qiita.com/chase0213/items/b5ecd4377f60605332e1)
- [GCP で Autoscaling Groups を使う](http://qiita.com/chase0213/items/6cad4475a5b57895aca1)

前者はあまり関係ないのですが、後者に関して docker を使っていると便利そうだな、というケースがあったので、ごく短い記事ですが続編として投稿します。

さて、後者の記事で、[Managed instance group の作り方](http://qiita.com/chase0213/items/6cad4475a5b57895aca1#managed-instance-group-%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9) という節を書きました。
記事中ではイメージからインスタンスグループを作成する、という方法を紹介していますが、実はここで docker形式のイメージをマウントすることができます。
ここで考えたいのは、dockerイメージを使用しない場合の autoscaling の運用です。

記事中で紹介している方法では、スナップショットを基にイメージを作成しています。
この状態で、アプリケーションの更新を行った場合に何が起こるかを考えます。
オートスケーリングの際に作成するインスタンスのイメージには、更新前のアプリケーションがデプロイされているため、改めてアプリケーションをデプロイする必要が生じます。
従って、アプリケーションを最新の状態に保つためには、

1. 既存のインスタンスが規定の負荷を超える
2. オートスケーリング機能によってインスタンスが立ち上がる
3. 立ち上がったインスタンスに対して新しいアプリケーションをデプロイする

というステップが必要になります。
それが嫌ならば、アプリケーションに更新がある度に、[決して簡単とはいえない手順](http://qiita.com/chase0213/items/6cad4475a5b57895aca1#%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%81%AE%E4%BD%9C%E6%88%90%E6%97%A2%E5%AD%98%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%81%8B%E3%82%89%E4%BD%9C%E6%88%90)でイメージを作成しなければいけません。

あれっ？これって dockerイメージをデプロイした方が直感的だし、簡単じゃない？というのが、本記事で書きたかったモチベーションです。

メディアへの露出は、比較的大きなサービス（例えば MAU が 1億を超えるような）を運営しているところではあまり気にすることでもないですが、普段小さなインスタンス数台で運用しているようなスタートアップにおいては、このような自動化は重視されるべきことかと思います。
急なスパイクに明示的に対応しなければいけないベンチャーこそ、docker を使うべきだ、という主張が僕の中で強くなってきましたが、それは観測された事実ではなくて僕の意見なのでこの辺りで。
为 Nginx 添加 http2 支持

今年5月份吧...好像是, HTTP/2 的协议正式版出来了. 替代了之前一直是测试的spdy的协议

下面我们来为nginx添加这个协议的支持.
 本文章是使用 Tengine的这个nginx的mod 版本来做的.
  首先从 [github](https://www.github.com) 上下载源码
```
git clone https://github.com/alibaba/tengine.git
```
然后在 configure的时候需要加2个配置参数

```
./configure --with-http_ssl_module --with-http_v2_module
```

编译完成后执行如下命令确认是否包含http2的模块

```
objs/nginx -V
```

如果`ngx_http_v2_module (static)` 这么一行内容那就说明已经成功了.  

最后需要在虚拟主机的配置文件里把原来的
``` 
listen 443 ssl
```
改成
```
listen 443 ssl http2 fastopen=3 reuseport
```
就可以了. 注意 `http2` 这个关键字只需要在所有 `linsten 443 ssl` 里出现一次即可 负责会报 配置重复.
最后 
```
service nginx reload 
```
就可以了.
然后尝试访问下 你的 https的网站吧.

PS: 如果 Chrome 出现了 `ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY` 的错误的话,

- 请检查 配置文件的 `ssl_ciphers` 节点. 可能需要修改为如下的值

```
ssl_ciphers 'CHACHA20:EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH:ECDHE-RSA-AES128-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA128:DHE-RSA-AES128-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-GCM-SHA128:ECDHE-RSA-AES128-SHA384:ECDHE-RSA-AES128-SHA128:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES128-SHA128:DHE-RSA-AES128-SHA128:DHE-RSA-AES128-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA384:AES128-GCM-SHA128:AES128-SHA128:AES128-SHA128:AES128-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4;';
ssl_prefer_server_ciphers on;
```

- 可能是weak dhparam 的问题.需要生成一个 2048 位的 dhparam 然后配置下.

```
openssl dhparam -out dhparams.pem 2048
```

然后 在nginx配置文件里添加 

```
ssl_dhparam {path to dhparams.pem}
```

最后重新加载下 nginx 就可以大功告成了

>参考文档
> - https://weakdh.org/sysadmin.html
> - https://en.wikipedia.org/wiki/HTTP/2
MAC OS環境で、Arduinoを起動確認：LED

MAC OS環境にてArduinoを使ってLEDを制御する手順と注意点です。
Arduinoを初めて使用する場合は、Arduinoエントリーキットがオススメです。
USBケーブル、ブレッドボードを始め、LEDや温度センサーなどの部品が揃っていて勉強を開始するには十分な素材がまとまってセット購入できます。（インターネットで購入できます）

![IMG_2805.JPG](https://qiita-image-store.s3.amazonaws.com/0/107391/ffac831f-d797-dc65-65de-9743b7ac69bc.jpeg)

今回はLEDの制御をする手順を説明します。必要なのは、次の写真のようにArduino、LED、USBケーブの３つで確認できます。
13と書かれた端子にLEDの長い方を、GNDと書かれた端子にLEDの短い方を差し込んでください。これだけでハード実装は完了です。（運用時は今回のようにLEDを直接刺してしまうと電流が多く流れて長時間経つとLEDが壊れてしまいますので注意が必要です。）

![IMG_2803.JPG](https://qiita-image-store.s3.amazonaws.com/0/107391/bb8ec01f-362c-7871-19fc-05129f7c630d.jpeg)

次に制御ソフトをプログラミングします。今回は次のように１秒ごとにLEDを点滅させるプログラムを書きます。setup()とloop()の中に記述するとコールバックでこの関数が呼ばれるようになります。setup()は初期化処理。loop()はループ処理でOSから無限ループで呼び出されます。今回は13と記述された端子にLEDを接続したので、setup()で13を指定しました。

![IMG_2804.JPG](https://qiita-image-store.s3.amazonaws.com/0/107391/fb8b6be5-a8cb-bb09-da75-3a7ae9049c76.jpeg)

以上の処理を行った後にArduinoのIDEから実行ボタンを押下するとソフトウエアがArduino上へダウンロードされ実行されるようになります。
LEDが点滅されましたら以上でLEDの制御は成功となります。

Arduinoを使っていると色々なトラブルに遭遇しますが、初期のトラブルシューティングとしてまとめたいと思います。一番起こるエラーが可能性が高いのはアップロードの失敗です。
失敗しましたら、まずはシリアルポートが認識されていないことを疑いましょう。
（アップロードのトラブルシューティングのチップス）
https://www.arduino.cc/en/Guide/Troubleshooting#upload

シリアルポートがアクティブになっているか確認
アクティブになっていない場合は、Arduinoを認識していません
![スクリーンショット 2016-01-02 1.04.40.png](https://qiita-image-store.s3.amazonaws.com/0/107391/ef87379a-e0fe-62a5-46c8-ad4d9528bbb0.png)

次のように新しく認識されていれば成功です。実行するとソフトウエアがダウンロードされて実行できます。

![スクリーンショット 2016-01-02 1.05.06.png](https://qiita-image-store.s3.amazonaws.com/0/107391/1a3b075a-c43e-1989-b8bb-b76bb7df743f.png)
Flash CC HTML5 canvasでのテキストフィールドの扱いに関して

# まえがき
flashプラットフォームでゲームコンテンツを作成した際にスコア表示やステータス表示にテキストフィールドを使うと思うのですが、そのときテキストフィールドの配置の仕方によって表示がうまく出来ない事がある。少し癖があります。でも、javascriptなのでパブリッシュされたソースを確認する事で原因が分かりやすくなります。よって、吐き出されたソースを元にした解決方法。
# 実施例
２フレームに渡って同じインスタンス名のテキストフィールドを配置した時
## 配置画面
![qiita_text.png](https://qiita-image-store.s3.amazonaws.com/0/70116/8cfe36c0-5b62-6554-bc09-37a0b47c0b93.png)

## 該当部分のソース
<pre>
	this.frame_2 = function() {
		this.stop();
		
		this.score.text = "RESULT";
		this.winScore.text = "勝率" + Math.floor(winCount/26*100) + "％";
		//this.winScoreText.text = "勝率";
		console.log("勝率[winCount]" + winCount + "winCount");
		console.log("勝率" + Math.floor(winCount/26*100) + "％");
		/* もう一度ゲームする */
		
		this.btn_result.addEventListener("click", fl_ClickToGoToAndStopAtFrame_2.bind(this));
		
		function fl_ClickToGoToAndStopAtFrame_2()
		{
			this.gotoAndStop(0);
		}
	}

	// actions tween:
	this.timeline.addTween(cjs.Tween.get(this).call(this.frame_0).wait(1).call(this.frame_1).wait(1).call(this.frame_2).wait(1));

	// score
	this.winScore = new cjs.Text("0勝", "bold 20px 'M+ 1c heavy'", "#FFFFFF");
	this.winScore.name = "winScore";
	this.winScore.textAlign = "right";
	this.winScore.lineHeight = 22;
	this.winScore.lineWidth = 76;
	this.winScore.setTransform(81,355);

	this.score = new cjs.Text("000", "bold 30px 'M+ 1c heavy'", "#FFFFFF");
	this.score.name = "score";
	this.score.textAlign = "center";
	this.score.lineHeight = 32;
	this.score.lineWidth = 335;
	this.score.setTransform(266.5,17.5);

	this.timeline.addTween(cjs.Tween.get({}).to({state:[]}).to({state:[{t:this.score},{t:this.winScore,p:{x:81,y:355,text:"0勝",font:"bold 20px 'M+ 1c heavy'",textAlign:"right",lineHeight:22,lineWidth:76}}]},1).to({state:[{t:this.score},{t:this.winScore,p:{x:266.5,y:113.5,text:"--%",font:"bold 60px 'M+ 1c heavy'",textAlign:"center",lineHeight:62,lineWidth:335}}]},1).wait(1));
</pre>
## 解決方法
javascriptの記述の順番をみると後のフレームのテキストの表示がthis.timeline.addTween()の設定で上書きされてしまいます。なので、前と後のフレームにはデフォルトの文字の設定は同じにする事で、p:{}のtext:"string"の設定が記述されなくなります。
デフォルトの文字の設定を削除するだけでは、何もデータが入っていない時の文字の表示がおかしくなる場合があるので、初期値として設定をするのが良さそうです。
### 初期値設定の例
どのような方法でも良いとは思うのですが、あくまでも一例まで・・・
フレーム１では勝った数の表示
フレーム２では全体を通しての勝率の表示
<pre>
this.frame_1 = function() {
     this.winScore.text = "0勝";
         ・
         ・
         ・
     winCount++; //等・・・のカウントの処理
     this.winScore.text = winCount + "勝";
     }

this.frame_2 = function() {
     this.winScore.text = "勝率0%";
         ・
         ・
         ・
     this.winScore.text = "勝率" + Math.floor(winCount/26*100) + "％";
         ・
     }
</pre>
Boostnote(Windows版)入れてみた

# Boostnote入れてみた

Macではなかなか使い勝手が良かったらしいBoostnoteアプリのWindows版が、ついにリリースされたよう（2015/12/26）。

http://b00st.io/jp/

↓こんな感じの

![ui.png](https://qiita-image-store.s3.amazonaws.com/0/16889/b552ed2b-5068-2e5c-0758-9503d87af4f1.png)

---

~~現状ではちょっと・・
早速入れてみたのだが、ショートカットキー「shift+ctrl+tab」がアプリに取られてしまう。
機能としてはとても良さそうなのだが、他のアプリ（ChromeとかAtomとか）でも使用しているショートカットキーを上書きしてこのアプリが呼び出されてしまうため、現状ではとても不便。
ざっと見た感じでは設定変更も見当たらなそうだし。。。
いったんバージョンアップまで待ちかなぁ・・・楽しみにしてたのに。~~

と思ってたのですが、ちゃんと設定ありましたね。すみませんでした。

左上のユーザ名表示横のアイコンから、いろいろ設定変えられました！
なかなかいい感じのツールなので、これから使い倒していこうと思います。
Windows Explorer のアドレスバーは、"ファイル名を指定して実行"を超える

Windows Explorerの「アドレスバー」は、ほぼほぼ「ファイル名を指定して実行」と同じ機能、場合によってはアドレスバーの方が機能豊富だよ、というお話。

テスト環境
===
Azure上に作成したWindows Server 2012で試しています。
Windows 7/8/10, Windows Server 2008R2/2012/2012R2で出来ます。

例１：コマンドプロンプトを開く
===

「ファイル名を指定して実行する」場合
---
コマンドプロンプトを開きたい時よく紹介されるのは、「ファイル名を指定して実行」という画面で```cmd```と打つこと。
![image](https://qiita-image-store.s3.amazonaws.com/0/48911/31707145-9cd5-4e9d-d8d8-6563634ff064.png)

と、こうなる。
![image](https://qiita-image-store.s3.amazonaws.com/0/48911/e7c2d829-2791-752d-4bf2-849693c80045.png)

ここまではよく知られた話かと。でも…

エクスプローラだからこそ出来ること
---
エクスプローラである程度階層を辿ったあと、ここをカレントディレクトリにしてコマンドを打ちたいんだけど…ってことはよくある。
![image](https://qiita-image-store.s3.amazonaws.com/0/48911/74600d36-6e58-a001-7bbb-98cdb0fe68d5.png)

そんな時、おもむろにアドレスバーに```cmd```と打つと…
![image](https://qiita-image-store.s3.amazonaws.com/0/48911/ee377e88-9223-0e73-e021-44d69a132418.png)

今開いているフォルダをカレントディレクトリにした状態でコマンドプロンプトが開く。
![image](https://qiita-image-store.s3.amazonaws.com/0/48911/001f5a3e-eccd-97b0-af26-ec7fdc95714d.png)

例２：PowerShellを開く
===
上記方法をUNCパスでやると、コマンドプロンプトだとうまくいかない。

こんなパスだと…
![image](https://qiita-image-store.s3.amazonaws.com/0/48911/08ff0a26-4fd9-c66c-9776-69aa49d9ac69.png)
怒られる。
![image](https://qiita-image-store.s3.amazonaws.com/0/48911/66019ee1-401c-9b3f-5de9-43b350219ed9.png)

でも、大丈夫。私たちにはPowerShellがある。
```cmd```の代わりに```powershell```と入れると…
![image](https://qiita-image-store.s3.amazonaws.com/0/48911/c35744f9-7537-bb0a-fb3d-4ed347ec6044.png)
UNCパスがカレントディレクトリになり、PowerShellが起動する！
![image](https://qiita-image-store.s3.amazonaws.com/0/48911/35317cae-a59f-ff89-824e-1a238dc693ab.png)
これを使うとWin7/WS2008R2だと、PowerShellが青い画面にならないのがちょっと残念。Win8/WS2012以上は確か、青い画面になってくれたはず

これが便利なのがSharePoint。
リストをエクスプローラで開いたら、エクスプローラのアドレスバーに```powershell```と入れると、SharePointをPowerShellで弄ることができる。ファイルリストが取りたければ```dir -recurse```とか、煮るなり焼くなりお好きにどうぞ。

その他いろいろ
---
アドレスバーが「ファイル名を指定して実行」そのままなのであれば、もはやアドレスバーはちょっとしたコマンドプロンプトと見ることも出来るのでは。それならば…

- ```ncpa.cpl```と打てば、「ネットワーク接続」が開く

![image](https://qiita-image-store.s3.amazonaws.com/0/48911/889bb254-1e9a-0c83-3eca-907fdaa0b11b.png)

↓
![image](https://qiita-image-store.s3.amazonaws.com/0/48911/0fa7ba1a-4931-991f-870e-f16ceac8a62b.png)

- ```services.msc```なら、「サービス」が開く

![image](https://qiita-image-store.s3.amazonaws.com/0/48911/ae8343c1-9d99-3001-b7f2-f49bcc34de6f.png)

↓
![image](https://qiita-image-store.s3.amazonaws.com/0/48911/b3432b76-3610-1d52-13ba-ed9a26a316c2.png)

同じ要領で、下記にあるコマンドはどれも実行できてしまいます。
「ファイル名を指定して実行」から利用できるコマンド一覧
(http://www.k-tanaka.net/windows/app/wincmd1.html)

それから…

- ```notepad sharedoc.txt```と引数まで入れられる。

当然、カレントディレクトリはこのフォルダにあるので、フルパスを与えなくてOK。（残念ながらオートコンプリートは効かない）
![image](https://qiita-image-store.s3.amazonaws.com/0/48911/a4cb42d0-acfc-1df5-85c3-18bd8f377e2f.png)

↓
![image](https://qiita-image-store.s3.amazonaws.com/0/48911/66ba963d-385a-bf38-28ec-721d820b4627.png)


同じパターンで、このアドレスバーに```git init```→```git add .``` →```git commit -m 'first commit'```と連続で入力するとgitのリポジトリを作れます。

まとめ
===
Windows Explorerのアドレスバーは、ちょっとしたコマンドプロンプトとして使える。「ファイル名を指定して実行」的な動きが出来る。というお話でした。

注意
===
「管理者として実行」の状態で起動するかどうかは、環境によって異なるよう。あとで調べとこう…
flyで画像減色プラグインを書いてみる

# はじめに
flyのプラグインを適当に書いてみました。
flyってなんだよという方は
[FlyでES6/7時代のJavaScriptビルドシステムとやらを体験してみた](http://qiita.com/keitarou/items/ae4d647440dff3e8fb4b)
[Gruntやgulp等に続くタスク自動化ツール「Fly」の導入手順](http://qiita.com/kitaro729/items/79a51e427ca6fe72d46d)
などの分かりやすい記事があるので読んでみるとだいたい分かると思います。

公式の[ドキュメント](https://github.com/bucaran/fly/blob/master/docs/README.md#)にプラグインに関しての記述があります。(日本語版より英語版の方が詳しいので英語版をおすすめします)
あとyeomanで[テンプレート](https://github.com/bucaran/generator-fly)も提供されています。

# 実際に作ったもの
pngquantを使って任意の画像を減色するプラグインを書いてみました。

``` js:index.js
const execFile = require('child_process').execFile;
const pngquant = require('pngquant-bin');
const imagemin = (options, cb) => {
  execFile(pngquant, ['-ext', '.png', options.color, options.src, '--force'], (err) => {
    cb(null);
  });
};

// プラグインの定義
// imageがflyfile側で呼び出すメソッド名になる
// optionsにはsrc, colorが渡される
module.exports = function () {
  this.image = (options) => {
    return this.defer(imagemin)(options);
  };
};
```

``` js:flyfile.js
export default function* () {
  yield this
    .image({
      src: 'img/test.png',
      color: 256
    })
}
```

# 感想
特に何も設定せずにES6で書けるのいいですね。
```Fly.prototype.watch```とか使えば任意のディレクトリを監視して画像が追加されたら減色とか出来そう？
今回はoptionに全て値を渡してしまったので、次はflyから提供されているメソッドをもう少し使って何か書きたいと思います。
あと```imagemin```関数に```cb```が渡されているのに気付かず```finish log```が出力されずハマりました。
プラグインはまだ5,60ぐらいしかなさそうなので色々作るチャンスだと思います(・∀・)
Docker概要

# ■ Dockerとは
Docker社が開発したオープンソースのコンテナ型仮想ソフトウェア。
仮想技術を用いて、コンテナと呼ばれるアプリケーションの実行環境を複数、簡単に、高速に作成することができる。

恐らく、Vagrantと呼ばれるアプリケーション配備自動化ソフトの仮想技術版?みたいなものと思われる。

## ● 仮想化技術とは
仮想技術とは、物理的には1台しかないPCを、複数のPCが起動しているかのように見せる技術である。
仮想化技術は大きく分けて、以下の2つがある。

 + ハイパーバイザ型仮想技術(ハードウェアレベル仮想技術)
 + コンテナ型仮想技術(OSレベル仮想化技術
 
### ○ ハイパーバイザ型仮想技術
PCのシステム資源(メモリなど)の一部を使用して、現在使用しているOS(ホストOS)とは別個に、仮想マシン上に新たなOS(ゲストOS)を作成する仮想技術である。
例えば、WindowsがインストールされているPC上で、Linuxを動作させるなどといったことが可能となる。

### ○ コンテナ型仮想技術
ホストOSにコンテナといわれる「サーバと同様の振る舞いをする独立した区画」を作成する。
ホストOS上仮想マシンに新たなOSを作成するわけではなく、コンテナはホストOS上のプロセスとして扱われる。各コンテナは、Namespaceとcgroupsと呼ばれる資源管理の仕組みによって各コンテナの資源を相互参照できないように独立しており、見かけ上は複数のOSが起動しているように見える。

ハイパーバイザーとの違いとして、
コンテナごとに個別にシステム資源を割り当てる必要がないので、軽量に動作することができる。
また、各コンテナはホストOSから直接実行されるため、ホストOSと同等の性能を発揮できる。
ただし、各コンテナはホストOSと同じ種類のOSしか使用することができない。

### ○ 参考

[Linuxコンテナ](https://cloudpack.media/30811)
[コンテナ型仮想技術とハイパーバイザ型仮想技術](http://www.itmedia.co.jp/enterprise/articles/1506/08/news015.html)
[サーバ仮想化とコンテナの違い](http://www.school.ctc-g.co.jp/columns/nakai/nakai41.html)
[サーバ仮想化](http://iot-jp.com/iotsummary/iotevents/%E4%BB%AE%E6%83%B3%E5%8C%96%EF%BC%88%EF%BC%92%EF%BC%89%EF%BC%9A%E3%82%B5%E3%83%BC%E3%83%90%E4%BB%AE%E6%83%B3%E5%8C%96/.html)

## ● Dockerの特色

+ 同じ環境を複数、簡単に作成できる
設定ファイル(Dockerファイル)に基づいて実行環境を作成し、実行環境から環境構築に必要なイメージファイルを取得できるので、同じような実行環境を簡単に作成できる。
アプリケーション開発において、テスト用の環境、実用環境などを差分なく作成することが可能。

+ 多様な環境を構築できる
Docker Hubなどのレジストリサービスに各ユーザが作成した多様なイメージファイルが登録されており、これらのイメージファイルを利用することで、他のユーザが作った環境を使用できる。

+ 異なるサービスの組み合わせを試すことができる
複数の異なる環境を作成し、それらの組み合わせを試すことができる。

+ 効率的にイメージファイルを使用できる
イメージファイルは階層的に管理されており、複数のイメージファイルを積み上げて、環境を作成できる。
例：
既存イメージ1 : CentOS
作成したいイメージ2 : CentOS + Apache
この場合、Apacheを動かす環境のイメージファイルのみを用意すればよいので、
ストレージの節約になる。

+ メンテナンスが楽
設定ファイルに設定情報が記録されているので、記録漏れがない。

+ マルチネットワーク利用可能
異なるホストOSで動くコンテナを同じ仮想ネットワークに入れることができる。
ホストのIPアドレスやポート番号転送設定などと無関係に、コンテナ同士が直接通信できるようになる。分散型KVSの導入など諸々必要。

### ○ 参考
[Docker社公式 : マルチネットワークの利用](https://docs.docker.com/engine/userguide/networking/get-started-overlay/)

## ● リンク
相手のコンテナの情報(IPアドレスやポート番号)を設定し、相手との通信を可能にするDockerの機能。
リンクを設定する場合、相手のコンテナは先に起動している必要がある。

## ● flannel
マルチホストでのコンテナ間の通信路を提供するソフト。

# ■ Docker Compose
複数のコンテナをまとめて、起動、停止、状態表示などを行うツール。
docker-compose.ymlに諸々の設定を記述する。
DragonBoard 410cにWindows10 IoT Coreをインストールしてみる

明けましておめでとうございます。本年１本目の投稿です。
昨年１２月にDoragonBoard410cの販売が始まりました。このボードはCPUにSnapdoragon410を搭載しています。RPi2よりも高性能なボードです。

##仕様
CPUコア：ARM Cortex A53 4Core
クロック：最大1.2GHz
メモリ：1GB LPDDR3 533MHz
ストレージ：8GB eMMC,MicroSD
無線：Wifi 11b,g,n 2.4GHz Bluetooth 4.1 GPS
USB：USB2.0x2,MicroUSB2.0
拡張バス：UART,SPI,I2S,I2Cx2,GPIOx12,DC power
電源：DC6.5V～18V
OS：Android,Linux,Windows10 IoT Core

##Windows10 IoT Coreのインストール
DragonBoard410cにWindows10 IoT Coreをインストールする場合にはMicroSDは使用せずにeMMCに書き込むことになります。
またPCのOSはWindows10を使用します。

・最初に[このサイト](https://developer.qualcomm.com/hardware/dragonboard-410c/tools)からツールをダウンロードします。OSによって32ビット用、64ビット用に分かれています。ダウンロードしたら解凍してインストールしておきます。

・次にWindows10IoTCoreのインストールイメージを[このサイト](http://ms-iot.github.io/content/en-US/Downloads.htm)からダウンロードします。
ダウンロードしたISOファイルをマウントして、インストーラーを起動してインストールします。このときHelperアプリは使用しませんのでそのまま終了します。

・DragonBoard410cの裏側にあるDIPスイッチの1番をOnにします。![db410c.jpg](https://qiita-image-store.s3.amazonaws.com/0/62606/a779fb36-dca1-cf5d-8ceb-d27116ea880f.jpeg)

・DragonBoard410cのMicroUSB端子とPCをケーブルで接続します。DragonBoard410cに電源アダプタを接続して起動します。

・[すべてのアプリ]-[Qualcomm]-[DragonboardUpdateTool]をクリックします。ボードが認識されているときはConnection Statusが緑色で表示されます。
![updatetool.PNG](https://qiita-image-store.s3.amazonaws.com/0/62606/90d39509-285f-8b6d-73fb-7bc5be5e2618.png)

・[Browse]ボタンをクリックしてイメージファイルを選びます。イメージファイルの場所は「C:\Program Files (x86)\Microsoft IoT\FFU\QCDB410C\flash.ffu」です。

・イメージを選択後[Program]ボタンをクリックすると書き込みが開始されます。
![writing.PNG](https://qiita-image-store.s3.amazonaws.com/0/62606/19d5a31b-678d-ad6f-ecaa-418c7dabf0d3.png)

・書き込みが完了すると次のように表示されます。
![finish.PNG](https://qiita-image-store.s3.amazonaws.com/0/62606/4863e3a9-fbfd-2a6f-0f0e-31ca13024e43.png)

・一度DragonBoard410cの電源を切って、裏側のDIPスイッチの1番をOffにしてから、電源を入れます。このときPCと接続しているUSBケーブルは外しておきます。

・問題がなければ初期設定画面が表示されます。言語の設定、ネットワークの設定が完了すればインストールは完了となります。
3.3. ペインタアルゴリズム


3Dの基本的な知識を理解したくて、『３次元CGの基礎と応用［新訂版］（ http://goo.gl/GKoQ4y ）』という書籍を購入しました。薄くて読みやすそうな本なのですがサンプルソースがないので、勉強がてらサンプルを作りながら読み進めようと思います。誰でもすぐに追試ができるよう、HTML + Javascriptでサンプルを作っていきます。

完全なサンプルはこちら
https://github.com/nakaken0629/3dstudy

# 3.3. ペインタアルゴリズム

ペインタアルゴリズムは、遠くのものから順番にポリゴンを書いていくというシンプルなアルゴリズムです。手前のポリゴンが奥のポリゴンを上書きするので、結果隠れてしまうということです。
このサンプルでは、ペインタアルゴリズムを無効にする（チェックを外す）と、手前にあるようなポリゴンより先に、その後面にあるように見えるポリゴンが消えてしまっています。

![session3_3.gif](https://qiita-image-store.s3.amazonaws.com/0/75307/d09eccc4-7c78-767f-585d-95e13af7abf5.gif "session3_3.gif")


# サンプルソース

```javascript:session3_3.htmlより
var main = function() {
    /* p -> polygon（多角形） */
    var p = new Array(POLYGON_COUNT);
    for (var i = 0; i < POLYGON_COUNT; i++) {
        p[i] = makeTriangle();
    }

    var draw = function() {
        cls();
        p2 = sort(p);
        loop: for (var j = 0; j < POLYGON_COUNT; j++) {
            fillTriangle(p2[j]);
            /* 180km/hで近づく */
            for(var i = 0; i < p2[j].v.length; i++) {
                p2[j].v[i].z -= 3000;
            }
            for(var i = 0; i < p[j].v.length; i++) {
                if (p2[j].v[i].z > 600) {
                    continue loop;
                }
            }
            /* 全ての頂点が前方クリッピングの外に出たら、新しいポリゴンを作成 */
            p[j] = makeTriangle();
        }
    };
    var proc = setInterval(draw, 20);

/* ポリゴンを距離順にソートする */
var sort = function(list) {
    if (!document.forms[0].enabled.checked) {
        return list;
    }
    list.sort(
        function(p0, p1) {
            z0 = (p0.v[0].z + p0.v[1].z + p0.v[2].z) / 3.0;
            z1 = (p1.v[0].z + p1.v[1].z + p1.v[2].z) / 3.0;
            if (z0 < z1) return 1;
            if (z0 > z1) return -1;
            return 0;
        }
    );
    return list;
};
```
Qiitaで数式やソースコードを使うときの注意

# はじめに

Qiitaは[MathJax](https://www.mathjax.org/)をサポートするMarkdownの処理系ですが、何点か知っていないと苦労する部分があるので、僕が知っているテクニックを公開しようと思います。

# エスケープシンボルを使うとき

TeXで$\\{$や$\\#$を使う際は`\{`や`\#`なとすればよいのですが、Qiitaですとこのままでは何も表示されなくなるなどしてしまいます。Qiitaでは、`\`がMarkdownを無効にする特殊な文字とされていますので、`\\{`や`\\#`などバックスラッシュを二つ重ねて使う必要があります。

# 下付き文字を使うとき

TeXでは下付き文字を使う際にアンダースコアを用いて$x_1$を`x_1`などと書きますが、Qiitaで時々これがおかしなことになってしまうことがあります。次のようになります。

> $PCH_{{i-b}_j}$を裏のまま計算する（これの結果を${PCH - b_j}_i$とする）

```
$PCH_{{i-b}_j}$を裏のまま計算する（これの結果を${PCH - b_j}_i$とする）
```

これが発生する理由は、推測になりますが恐らくMarkdownの強調を表すアンダースコアと数式のパーズが乱れてこのようなことになってしまったものを思われます。これを解決するためには、アンダースコアの前に適当に`\`（バックスラッシュ）を置けばよいです。

> $PCH\_{{i-b}\_j}$を裏のまま計算する（これの結果を${PCH - b_j}_i$とする）

```
$PCH\_{{i-b}\_j}$を裏のまま計算する（これの結果を${PCH - b_j}_i$とする）
```

# 番号付き箇条書きの中にディスプレイ数式を埋め込むとき

番号付き箇条書きの中に数式などをそのまま入れると、番号が次のように1へ戻ってしまいます。

> 1. あああああああああああ
> 2. いいいいいいいいいいい
> 
> ```math 
> f(x) = x + 2
> ```
> 3. ううううううううううう

<pre>
1. あああああああああああ
2. いいいいいいいいいいい
 
```math 
f(x) = x + 2
```
3. ううううううううううう
</pre>

これを解決するためには、<code>```</code>の前にスペースを**4つ**置く必要があります[^ps1]。

[^ps1]: スペースが2つではダメですし、ディスプレイ数式やソースコードの前に一行空行が必要です。

> 1. あああああああああああ
> 2. いいいいいいいいいいい
> 
>     ```math 
>     f(x) = x + 2
>     ```
> 3. ううううううううううう

```
1. あああああああああああ
2. いいいいいいいいいいい

     ```math 
     f(x) = x + 2
     ```
3. ううううううううううう
```

どうしてこれで上手くいくのか謎です。

# 番号付き箇条書きの中に表を埋め込むとき

先ほどと同じように、スペースを4つでインデントするとこちらも埋め込むことができます。

> 1. あああああああ
>
>     |マスク|対応するカード|
>     |:----:|:-----------:|
>     | $0000 \dots 1001$ | $K_1$ |
>     | $0010 \dots 0010$ | $K_2$ |
> 2. いいいいいいい

```
1. あああああああ

    |マスク|対応するカード|
    |:----:|:-----------:|
    | $0000 \dots 1001$ | $K_1$ |
    | $0010 \dots 0010$ | $K_2$ |
2. いいいいいいい
```

# バッククォート（<code>`</code>）をインラインハイライトするとき

バッククォートをインラインハイライトする目的で<code>```</code>と書いてもうまくいきません。
このような場合は直接_code_タグを使って次のようにするしかありません。

```
<code>`</code>
```

# 3つのバッククォート（<code>```</code>）をリスティングに入れるとき

ソースコードの中に<code>```</code>を入れる際には、これも_pre_タグを使うしかありません。

# `\newcommand`を使うとき

TeXでは`\newcommand`というマクロを使って新しいマクロを定義できます。MathJaxでもサポートされているのですが、`\newcommand`はQiitaの自動プレビュー機能と相性が悪く、時々壊れることがあります。これを回避するためには、マクロの定義を`\def`コマンドで行うのがよいです。

# まとめ

このように、Qiitaは独自（？）のMarkdown拡張でとても便利な反面、ちょっとした落とし穴がいくつかあります。この記事では紹介されていないが、落とし穴を知っているという方は、自分のQiitaでそのことに関する記事を執筆し、この記事にURLをコメントして教えていただければ嬉しいです。
Mithril 0.2から0.2.1の変更点

先月に0.2.1がリリースされてました。0.2.0からちょくちょくコミットは継続的に行われていたのですが、基本的にバグ修正とかドキュメントのTypoの修正が多くて、下記のエントリーにあるように、0.2からリリースまで時間が結構あいた割りには変更点は極めて小さいです。後方互換性は維持されています。O'reillyのMithril本のアップデートも必要無さそうなレベル。

* [(翻訳)Mithril.jsの将来の計画](http://qiita.com/shibukawa/items/54208a1877192b1cd2f8)

[ドキュメントの日本語訳(http://mithril-ja.js.org/)](http://mithril-ja.js.org/)の方も最新に更新しました。

機能的な変化は下記の2点のみです。

m()をm.component()の短縮形として使えるようになった
===================================================

* [ドキュメントへのリンク](http://mithril-ja.js.org/mithril.component.html#shorthand-syntax)

``m()`` の先頭に引数に限定してですが、 ``m.component`` と書かずに使えるようになりました。

```js
m.render(document.body, [
    //以下の2行は等価です
    m(MyComponent, {data: "world"}),
    m.component(MyComponent, {data: "world"})
])
```

[mithril-mdl](https://www.npmjs.com/package/mithril-mdl)を使うのがちょっと楽になります。

テンプレートの事前コンパイルはSweetJSではなくて、mithril-objectifyを使う
=============================================================================

* [ドキュメントへのリンク](http://mithril-ja.js.org/optimizing-performance.html)

タイトルで説明が終わってしまうのですが、そんな感じです。
Subversion のリビジョンの日時指定を勘違いしていた

備忘録。

目的はリポジトリ内のパスに対して、指定日時の直前のリビジョンを取得すること。
そのためにリポジトリ内のパスに対して `svn log` でリビジョンに日時を指定すると、「そのパス」の指定日時の直前のリビジョンのログを返すと思っていた。
実際にはそうではなくて「そのリポジトリ」の指定日時の直前のリビジョンのログを返そうとする感じ。

Subversion のログを例に示しておく。
Subversion のソースコードは http://svn.apache.org/repos/asf リポジトリの subversion パスで管理されている。下記参照。

```
~$ svn info http://svn.apache.org/repos/asf/subversion
パス: subversion
URL: http://svn.apache.org/repos/asf/subversion
リポジトリのルート: http://svn.apache.org/repos/asf
... 省略 ...
```

リポジトリルートに対して `svn log` で 2015-12-24 を指定するとリビジョン 1721549 が得られる。下記参照。

```
~$ svn log -q -r '{2015-12-24}' http://svn.apache.org/repos/asf
------------------------------------------------------------------------
r1721549 | anshum | 2015-12-23 23:59:12 +0900 (水, 23 12月 2015)
------------------------------------------------------------------------
```

しかし subversion パスに対して実施すると出力されない。下記参照。

```
~$ svn log -q -r '{2015-12-24}' http://svn.apache.org/repos/asf/subversion
------------------------------------------------------------------------
```

リビジョン 1721549 は lucene パス内のもの。下記参照。

```
~$ svn log -q -r '{2015-12-24}' http://svn.apache.org/repos/asf/lucene
------------------------------------------------------------------------
r1721549 | anshum | 2015-12-23 23:59:12 +0900 (水, 23 12月 2015)
------------------------------------------------------------------------
```

2015-12-24 の直前のリビジョンは 1721549 で、subversion パス内のものではないので出力されなかったと理解。

調べた結果、リビジョンの範囲指定と `--limit` (`-l`) オプションを使えば目的は達成できた。下記参照。

```
$ svn log -q -l 1 -r '{2015-12-24}':1 http://svn.apache.org/repos/asf/subversion
------------------------------------------------------------------------
r1721538 | julianfoad | 2015-12-23 21:53:40 +0900 (水, 23 12月 2015)
------------------------------------------------------------------------
```
シェルスクリプトで黒魔術もどき（その１）関数の自動呼出し

# 以下の投稿、根本的な間違いがあったのであとで直します。（shと思ってたものが、実はbashだったとは、、）

# 目的
必要に迫られてシェルスクリプトを書くわけですが、どうしてもコマンドの羅列になってしまいがちです。汎用のプログラミング言語並みとはいかなくても少し改善できるアイデアのようなものをメモしていきます。
# 関数の自動呼出し
declareコマンドで現在定義されている変数名を取得ことができます。-Fオプションを付ければ関数名の一覧が取得できるのでevalと組み合わせれば関数を片っぱしから実行することが可能です。
##コード
```bash:auto_exec_function.sh
#!/bin/sh
func_1(){ echo "func_1"; }
func_2(){ echo "func_2"; }
func_3(){ echo "func_3"; }

auto_exec()
{
  for func in `declare -F|awk '{print $3}'|grep ^func_`
  do
    eval $func
  done
}
auto_exec
```
## 実行結果
```
[sample@hostname ~]$ ./auto_exce_func.sh
func_1
func_2
func_3
[sample@hostname ~]$
```
## 説明
auto_exec関数でdeclare -Fコマンドで定義されている関数名を全て取得し、func_で始まる関数を呼び出しています。ただし、ここでは各関数はパラメータなしという前提です。（シェルスクリプトには関数の型という概念がないので、パラメータの数や型を取得することができません。ただし、evalで引数を渡せないわけではないので、関数名に規則を持たせる等で引数つきの関数を呼びわけることは可能です。）

# 応用
関数を片っぱしから全て呼び出したくなる場面の身近な例としては、テストの自動実行というのがあるかと思います。他の言語と同様にシェルスクリプトにも単体テスト自動実行のためのライブラリ（リンク：[shunit2](https://sites.google.com/site/paclearner/shunit2-documentation)）はありますが、ここでは簡易な実装をしてみましょう。

## コード
```bash:auto_test.sh
#!/bin/sh

test_normal_1()
{
  local TEST_CASE="normal 1"
  do_test echo "aaa"
}

test_error_1()
{
  local TEST_CASE="error 1"
  do_test xxyyzz "aaa"
}

#
# 以下はテスト実行のための関数

do_test()
{
  local STDOUT=/tmp/stdout.$$
  local STDERR=/tmp/stderr.$$

  echo ========================
  echo テストケース：${TEST_CASE^^}
  echo 実行：${*:1}
  eval ${*:1} >$STDOUT 2>$STDERR
  local RC=$?
  echo 戻り値　　：$RC
  echo 標準出力　："`cat $STDOUT`"
  echo 標準エラー出力 :"`cat $STDERR`"
  rm $STDOUT $STDERR 2>/dev/null
}

auto_exec()
{
  for func in `declare -F|awk '{print $3}'|grep ^test_|sort`
  do
    eval $func
  done
}
auto_exec
```
## 実行結果
```
[sample@hostname ~]$ ./auto_test.sh
========================
テストケース：ERROR 1
実行：xxyyzz aaa
戻り値　　：127
標準出力　：
標準エラー出力 :./auto_test.sh: line 25: xxyyzz: command not found
========================
テストケース：NORMAL 1
実行：echo aaa
戻り値　　：0
標準出力　：aaa
標準エラー出力 :
[sample@hostname ~]$
```
## 説明
関数auto_execからtest_という名前で始まる関数を順番に呼び出します。各関数内ではテストケース名を設定して、テスト実行用の関数do_testを使用して目的となるコマンド（この場合ではecho "aaa"やxxyyzz "aaa"）を呼出し、do_test内で実行結果を表示しています。
ここではシンプルな例ですが、関数の実行結果の期待値と実際の結果を比較することも難しくありません。開発したシェルスクリプトをテストするためのスクリプトを作ってCIツールに組み込むことも可能です。
[Python]Regular Expressions 正規表現

## 文字列検索
### re.search(pattern, string)
文字列の中から最初に一致する部分を探す

patternの先頭のrはraw stringの意味で、backslashをそのままsearchに渡してくれる。

```python
In [11]: import re

In [12]: str = 'Less but better'

In [13]: match = re.search(r'\s\w\w\w\s',str)

In [14]: print 'found:', match.group()
found:  but 
```
一致した文字列がない場合はNoneで返ってくるのでif文でチェックするといい。

```python
str = 'Less but better'
match = re.search(r'\s\w\w\w\s',str)
if match:
    print 'found:', match.group()
else:
    print 'Not found'
```


### re.findall(pattern, string)
一致したものを全部返す

```python
str = 'He who moves not forward, goes backward.'
matches = re.findall(r'\w{3}', str)
```

３文字を取り出す。一致した次から検索する。

```python
In [15]: print matches
['who', 'mov', 'not', 'for', 'war', 'goe', 'bac', 'kwa']
```
単語だけ抜き出したければ下記のようにする。

```python
In [16]: matches = re.findall(r'\w+', str)

In [17]: matches
Out[17]: ['He', 'who', 'moves', 'not', 'forward', 'goes', 'backward']
```

### re.match(pattern, string)
文字列の先頭から正規表現と一致するかしらべる

```ptyhon
In [133]: str = 'Information is not knowledge.'

In [134]: match = re.match(r'I',str, re.M|re.I)

In [135]: print match
<_sre.SRE_Match object at 0x0000000018D774A8>

In [136]: print match.group()
I

In [137]: match = re.match(r'i',str)

In [138]: print match
None
```

## 正規表現

|正規表現|意味 |
|:---:|:---|
|a,A,9|指定した文字に一致するか|
|.|改行以外の一文字|
|\w|文字(a-zA-Z0-9)|
|\W|文字以外|
|\s|空白文字(space,tab,return)|
|\S|空白文字以外|
|\d|数字(0-9)|
|\t|タブ|
|\n|newline|
|\r|return|
|\b|文字の区切り文字 "xxxx"のダブルクォート。文字を囲んでいるものでないと一致しない|
|^|文字列の先頭|
|$|文字列の最後|
|\|特殊文字のキャンセル|

### [ ] 
[]は文字セットを表す。[abc]だとa又はb又はcという意味。 

### 繰り返し

|正規表現|意味 |
|:---:|:---|
|*|0回以上の繰り返し|
|+|1回以上の繰り返し|
|?|0回又は１回の繰り返し|
|{n}|n回の繰り返し|

### group
()で囲むとグールプ化でき、一致した部分の一部を取り出すことができる。

```python
str = 'Change before you have to.' 

match = re.search(r'(\w+)\s(\w+)\s(\w+)\s(\w+)\s([\w.]+)',str)
if match:
    print 'found:', match.group()
else:
    print 'Not found'
```

group() ... 一致した部分
groups() ... グループに分けたもの
group(n) ... n番目のグループを取り出す。一番最初はgroup(1)になる。

```python
In [15]: print match.group()
Change before you have to.

In [16]: print match.groups()
('Change', 'before', 'you', 'have', 'to.')

In [17]: print match.group(1)
Change
```

findallでgroupを使った場合

```python
In [18]: matches = re.findall(r'(\w+):(\d+)',str)

In [19]: matches
Out[19]: [('aaa', '111'), ('bbbb', '2222'), ('ccccc', '33333')]
```


[ここ](https://docs.python.org/2/library/re.html#)とか[ここ](https://developers.google.com/edu/python/regular-expressions)とか[ここ](http://www.tutorialspoint.com/python/python_reg_expressions.htm)とかを参考にした
[Python]関数引数の*(star)と**(double star)                                                                                                                                                                                          

Pythonでは任意個の引数を受け取る関数を作る時に\*か\*\*を引数の前につける。

関数側から見ると\*をつけるとTupleになり、\*\*をつけるとDictionaryで受け取ることになる。
呼び出し側から見ると、Tupleで渡すときはKeyword無し、Dictionaryで渡すときはKeywordありにする。

```python
def func1(*param1):
    print(param1)
def func2(**param1):
    print(param1)
```

```python
In [3]: func1(1,2,3,4,5)
(1, 2, 3, 4, 5)

In [4]: func2(a=1,b=2,c=3,d=4,e=5)
{'a': 1, 'c': 3, 'b': 2, 'e': 5, 'd': 4}
```

## Unpacking Argument
tupleの中身をばらばらで渡したい時
`func1(*t1)`と`func1(0,1,2)`の結果が同じになる。
Dictionaryの場合は**を使う。

```python
In [13]: t1 =  (0,1,2)    

In [14]: func1(*t1)
(0, 1, 2)

In [15]: func1(0,1,2)
(0, 1, 2)

In [16]: func1(t1)
((0, 1, 2),)
```

詳細は[ここ](https://docs.python.org/dev/tutorial/controlflow.html#keyword-arguments)に書いてある。
[Python]List Comprehension リストの作り方いろいろ

## List Comprehension
List Comprehensionを使うとListの作成が簡単にかける。
Comprehensionは「理解」ではなく「含む」という意味で、日本語ではリストの内包表現などと言うらしい。

###例）０～２９までの値のリストを作る
####List Comprehensionを使用しない場合

```python
In [1]: L1 = []
   ...: for x in range(30):
   ...:     L1.append(x**2)    
   ...: 
   ...: print(L1)
   ...: 
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361, 400, 441, 484, 529, 576, 625, 676, 729, 784, 841]
```
####List Comprehensionを使用した場合
いちいち空のListを作ってappendしなくても下のように１行でかける。

```python
In [2]: L2 =[x**2 for x in range(30)]
In [3]: print(L2)
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361, 400, 441, 484, 529, 576, 625, 676, 729, 784, 841]
```
for文のあとにif文を続けることができる。

```python
In [4]: L3 = [x for x in range(30) if x % 2 == 0]
In [5]: print(L3)
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28]
```
for文のあとにfor文を続けることもできる。

```python
In [6]: L4 = [(x,y) for x in range(10) for y in range(x,10)]
In [7]: print(L4)
[(0, 0), (0, 1), (0, 2), (0, 3), (0, 4), (0, 5), (0, 6), (0, 7), (0, 8), (0, 9), (1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (1, 8), (1, 9), (2, 2), (2, 3), (2, 4), (2, 5), (2, 6), (2, 7), (2, 8), (2, 9), (3, 3), (3, 4), (3, 5), (3, 6), (3, 7), (3, 8), (3, 9), (4, 4), (4, 5), (4, 6), (4, 7), (4, 8), (4, 9), (5, 5), (5, 6), (5, 7), (5, 8), (5, 9), (6, 6), (6, 7), (6, 8), (6, 9), (7, 7), (7, 8), (7, 9), (8, 8), (8, 9), (9, 9)]
```

## Generator Comprehension

[]を()にするとGeneratorが作成できる

```python
In [8]: G4 = ((x,y) for x in range(10) for y in range(x,10))

In [9]: G4
Out[9]: <generator object <genexpr> at 0x000000000A395D80>

In [10]: L5 = list(G4)

In [11]: print(L5)
[(0, 0), (0, 1), (0, 2), (0, 3), (0, 4), (0, 5), (0, 6), (0, 7), (0, 8), (0, 9), (1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (1, 8), (1, 9), (2, 2), (2, 3), (2, 4), (2, 5), (2, 6), (2, 7), (2, 8), (2, 9), (3, 3), (3, 4), (3, 5), (3, 6), (3, 7), (3, 8), (3, 9), (4, 4), (4, 5), (4, 6), (4, 7), (4, 8), (4, 9), (5, 5), (5, 6), (5, 7), (5, 8), (5, 9), (6, 6), (6, 7), (6, 8), (6, 9), (7, 7), (7, 8), (7, 9), (8, 8), (8, 9), (9, 9)]
```

詳細は[ここ](https://docs.python.org/2/tutorial/datastructures.html#list-comprehensions)を参照
テトリスをつくってみました　説明８　for文をかんたんに　tetris2.js

check関数は、ブロックの重なりを調べます。
マス（10x20）からはみ出ているか？
ブロックがあって動かせないとか


```js
function Check ()	 {


		for (var i = tmpPB.x, j = tmpPB.y , k = 0;  
		k < tmpPB.tetrisBlock.blockShape.length ; 
		i ++, k++ ) {
															//0123456789
			var a = Math.floor (k/4);		//0000111122223333
			var b = i - a*RECT_W;			//012301230123
			var c = j + a;							//
			
```

プレイヤーのテトリスブロックは、4x4マスで表現されます。
（おったち野郎さんのページに図があります）
左上からX軸方向へ右端まで4マス調べ、Y軸方向に一段さげ、
またX軸方向まで4マス調べます。
この、for文がいつも疲れました。

ーfor文を簡単にする

x座標 配列　0123012301230123
y座標 配列　0000111122223333

Board [ x [ i ] ] [ y [ i ] ]

こんな感じにするのもいいのではないでしょうか？
エキスパートの方のコメント募集します。
テトリスをつくってみました　説明７　　ディプコピーはどうやるの？tetris2.js

blockGenerate関数
グローバル変数playerBlockオブジェクトに対し、ランダムにブロックをセットします。


```js



function blockGenerate () {
	var i = Math.floor ((Math.random() *10 )% SHAPES.length );
	var CopyOfROTATE_CHANGE = deepCopy ( ROTATE_CHANGE) ;
	playerBlock.rotatePattern = CopyOfROTATE_CHANGE [ COLOR [ i ] ];
	var CopyOfTETRIS_BLOCK = deepCopy ( TETRIS_BLOCK [i ] );
	
	//tweak: make one time rotation
	var itsShapes = playerBlock.rotatePattern.shift();
	playerBlock.rotatePattern.push (itsShapes );

	return CopyOfTETRIS_BLOCK;	// if it isn't copy but original, occurs bug.
																//start block got wrong shape
}
```
```js


	var CopyOfROTATE_CHANGE = deepCopy ( ROTATE_CHANGE) ;
```



ROTATE_CHANGEオブジェクトをディープコピーしています。objCopy_lib.jsに書いてある関数です。

shallow（シャロウ:「浅い」の意味）コピーと、deepディープコピーがあります。

おそらく、
shallow:値の場合、値をコピー。
参照なら参照をコピー（参照をたどらない）

deepcopy:値の場合、値をコピー。
参照なら参照をたどる。ずっとたどり、値に行き着くまでたどり、最後値をコピー

これが定義と思います。

コピーには、objCopy_lib.js　を使ってください。どこかでパクったものですけどね。（deepcopy関数のコードはよくわかってません。どなたか説明求む）
underscoreコードリーディング（flatten）




underscoreに詳しくないので、勉強半分でソースコードを読む。


##利用するバージョン
[underscore.js(v1.8.3)](https://github.com/jashkenas/underscore/tree/1.8.3)


##flattenとは



###[underscorejs.orgのflatten](http://underscorejs.org/#flatten)

こんな説明。
>####_.flatten(array, [shallow]) 
>Flattens a nested array (the nesting can be to any depth). 
>If you pass shallow, the array will only be flattened a single level.


```javascript

_.flatten([1, [2], [3, [[4]]]]);
=> [1, 2, 3, 4];

_.flatten([1, [2], [3, [[4]]]], true);
=> [1, 2, 3, [[4]]];

```

------------- 
ネスト化された配列をフラットにします。（ネスト化されている深さはどれだけでもです）
もしshallowを渡された場合、フラット化されるのは1階層のみです。


###[underscore.flatten](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L509)

コード的にはこのあたり。


```javascript

  // Internal implementation of a recursive `flatten` function.
  var flatten = function(input, shallow, strict, startIndex) {
    var output = [], idx = 0;
    for (var i = startIndex || 0, length = getLength(input); i < length; i++) {
      var value = input[i];
      if (isArrayLike(value) && (_.isArray(value) || _.isArguments(value))) {
        //flatten current level of array or arguments object
        if (!shallow) value = flatten(value, shallow, strict);
        var j = 0, len = value.length;
        output.length += len;
        while (j < len) {
          output[idx++] = value[j++];
        }
      } else if (!strict) {
        output[idx++] = value;
      }
    }
    return output;
  };

  // Flatten out an array, either recursively (by default), or just one level.
  _.flatten = function(array, shallow) {
    return flatten(array, shallow, false);
  };

```
_.flattenはflatten関数にarrayとshallow,falseを渡すのみ。
flattenはinput(array)に対してinput.lengthまでfor文を回す。
配列の中の値(value)がisArrayLikeに合致していて、かつisArrayもしくはisArgumentsに当てはまる場合は
shallowがtrueでない場合は再帰的にflatten関数に値を受け渡す。
outputのlengthにvalueのlengthを足し合わせる。
その上で現在のoutputの位置であるidxをインクリメントしながらoutputのidx番目にvalueを格納する。
配列の中の値(value)がisArrayLikeに合致していて、かつisArrayもしくはisArgumentsに当てはまらない場合（かつstrictがない場合）は、outputのidx番目にvalueを格納する。後置なので、格納後にidxをインクリメントする。
クライアントHyper-Vを利用する方法

Windows8以降のクライアントOSでは、Windows Server2008以降のサーバOSに搭載されているHyper-Vの機能制限版[^1]であるクライアントHyper-Vを利用できる。
VirtualBoxやVMWare playerなどの無償のソフトを使ってもいいのだが、せっかくなので自分のPCでクライアントHyper-Vを利用できるようにしてみた。

[^1]: ライブマイグレーションやレプリケーション機能が削られている程度で、個人で利用するには十分な機能が提供されている。

#前提条件

##対象OS
クライアントHyper-Vを利用するには、ProまたはEnterpriseの以下のOS(64bit)が必要。

- Windows8
- Windows8.1
- Windows10

※自分のPCはもともとWindows7(Home)だったので、Windows10(Home)→Windows10(Pro)にアップグレードした。7→10へのアップグレードやHome→Proへのアップグレード方法はここでは省略。

##CPU
その他の条件はシステム情報から確認できる。システム情報を見るには、Cortanaに「**msinfo32**」を入力する。
右ペインの下のほうを見ると以下の項目があるので、すべて「**はい**」となっていれば、クライアントHyper-Vを利用が利用できる。

- Hyper-V - VMモニターモード拡張機能
- Hyper-V - 第2レベルアドレス変換拡張機能
- Hyper-V - ファームウェアで仮想化が有効
- Hyper-V - データ実行防止

#Hyper-Vの有効化

クライアントHyper-Vは、「**Windowsの機能の有効化または無効化**」から有効化できる。
[コントロールパネル] → [プログラム] → [Windowsの機能の有効化または無効化]

「**Windowsの機能の有効化または無効化**」のポップアップが表示されたら、「**Hyper-V**」のチェックボックスにチェックを入れる。

- [x] Hyper-V
 - [x] Hyper-V プラットフォーム
 - [x] Hyper-V 管理ツール

あとは、「**OK**」を選択して再起動すれば、クライアントHyper-Vが利用できるようになる。
Eclipse Cプログラム実行で 「バイナリが見つかりません」

どのサイトを見ても記述が自分の状況に当てはまらず、解決にならなかったのですが
やっと解決してくれるサイトを見つけました。

http://nade.wktk.so/?page_id=112


要するに

１．「左のプロジェクト名を右クリックして、[実行]→[実行の構成]と進み、左の[C/C++ Application]→[新規]」という手順で
C/C++ Applicationの下に「「(プロジェクト名)　デバッグ」という名前の項目」を作る

２．「C/C++ アプリケーションの項目にDebugフォルダ内の(プロジェクト名).exeを指定」

という２つの手順が必要だということですね。
Laravel 5.5のアプリをhomestead上で動かした

----

5.2で書いた設定だけど、5.5でも動いたので、タイトルは5.5に買えました。

ローカルで適当に構築してあるlaravelがうまく動かなかったので環境周りの問題を切り離したかったから、homesteadを使ってみることにした。[Laravel公式のhomesteadドキュメントはここ](https://laravel.com/docs/5.5/homestead)。

* homesteadは開発用の仮想環境の準備を便利にしてくれるツール。
* homesteadはLaravel公式が用意してくれている。
* Laravelのバグを疑うときは、homestead環境で疑うといい。

## 仮想マシンのライブラリ

仮想マシン(VM(VirtualMachine))のプラットフォームは、[VirtualBox](https://www.virtualbox.org/)か[VMWare](http://www.vmware.com/jp/)を選べるがVMWareはダウンロードと行ってもどれをダウンロードしたらいいのかわかりにくいので、自分にとってはVirtualBox一択。

## 自分の前提条件

* PCはMacでやっています。Mac OS X Yosemiteです。
* githubのアカウントとかは持っています。Xcodeの開発用ライブラリもインストールすんでいます。
* composerのインストールもすんでる。
* phpもローカルにインストールはすんでる。
* Vagrantはrubyで動くのでrubyのインストールが必要。
* Laravelで作るアプリはすでに``laravel new``して作ってある。

## VirtualBoxのインストール

VirtualBox 5.xのバージョンが利用できるとのことなので、
https://www.virtualbox.org/wiki/Downloads
このページからVirtualBox binariesの「VirtualBox 5.0.12 for OS X hosts  amd64」ってのを選んでダウンロード。

ダウンロードしたdmgファイルを開いてinstall.pkg（だったかな）をダブルクリックしてインストールしていくだけ。設定とか無いのではいはいってインストールするだけ。

簡単。

## vagrantのインストール

Hasicorpのvagrantのページ https://www.vagrantup.com からDownloadページに行って、「MAC OS X Universal (32 and 64-bit)」をダウンロードしてdmgファイルを開いて、install.pkg（だったかな）をダブルクリックして、設定とか無いのではいはいってインストールするだけ。

簡単。

## boxのダウンロード

仮想環境のテンプレみたいなもの。テンプレとなるboxをダウンロードしておく。データでかくて2,3GB使うからディスクに余裕と、お家か会社のネットワークでやりましょうね。

```
vagrant box add laravel/homestead
```

## ローカルにあるLaravelプロジェクトをhomesteadで立ち上げる

公式ドキュメントだとまだ何もしてない場合みたいな感じでやってるけど、すでにLaravel installとかしてるときのことが後ろの方に書いてあるので、英語読めない自分にはちょっと気づきにくかった。

## コンポーザーでhomesteadをローカルプロジェクトにインストール

```
composer require laravel/homestead --dev
```

これでvendor/laravel/homesteadにファイルがダウンロードされてインストールされる。

## 設定ファイルの生成

homestead makeというコマンドがあって、プロジェクトのルートディレクトリでこのコマンド打つと、このプロジェクト用のVagrantfileとhomestead.yamlの設定を自動生成してくれる。


自分のアプリは、``/Users/yourname/development``の場所で、``laravel new blog``って最初に作った。
アプリは、``/Users/yourname/development/blog``にある。
そのディレクトリに移動して。

``php vendor/bin/homestead make``

ってすると設定ファイルできた。

## 環境の設定ファイルの中を見てみる。
Homestead.yaml

ファイルの中身はこんな感じ。
foldersとsitesの設定がどこに何かくのか英語じゃわからなかったけどこれならわかる。

```Homestead.yaml
---
ip: "192.168.10.10"
memory: 2048
cpus: 1
hostname: blog
name: blog
provider: virtualbox

authorize: ~/.ssh/id_rsa.pub

keys:
    - ~/.ssh/id_rsa

folders:
    - map: "/Users/yourname/development/blog"
      to: "/home/vagrant/blog"

sites:
    - map: homestead.app
      to: "/home/vagrant/blog/public"

databases:
    - homestead
```

この設定ファイルだと、IPアドレス``192.168.10.10``に、``homestead.app``ってドメイン名で設定しましたってなってます。

## homestead.appをhostsファイルに追加

``sudo vi /etc/hosts``して``192.168.10.10 homestead.app``の行を足す。

## 起動して動くかチェック

```
vagrant up
```

プロジェクトがhomesteadで仮想環境が立ち上がった。
vagrant upではネットワークの環境設定とかも勝手にやってくれるみたいね。

```
vagrant ssh
```

ssh接続してなかみるなら↑。
[python]Cythonでnumpy使おうとする時のメモ

##はじめに
今回やりたいことは、
`ctypedef numpy.float64_t DOUBLE_t`
と定義したい。
これをやるためには、
`cimport numpy`をやる必要がある。
この二つの`ctypedef`と`cimport`をやりたいということです。

※英語が読めない自分が英語のdocument見ながらやったので間違ってる場合があります。途中のエラーとか見たくない人は最後だけみてください。

環境はこんな感じです。
OS X, Yosemite
Cython 0.23.4
Python 3.4.3


#cythonコンパイル時に次のようなエラーが発生。
[Cython 0.23.2 documentation: Building Cython code](http://docs.cython.org/src/quickstart/build.html)のページを参考にし、下記の二つのスクリプトを作成してみる。

```test.pyx
import numpy
cimport numpy
ctypedef numpy.float64_t DOUBLE_t
```

```setup.py
from distutils.core import setup
from Cython.Build import cythonize

setup(
    name = 'test',
    ext_modules = cythonize('test.pyx')
    )
```

これを使って、`python setup.py build_ext --inplace`を行うと、下記のようなエラーが発生。

```error.
sample.c:250:10: fatal error: 'numpy/arrayobject.h' file not found
#include "numpy/arrayobject.h"
         ^
1 error generated.
error: command 'clang' failed with exit status 1
```

ファイルが見当たらないってエラーが出ました。
パスが違うようですね、ってことでもう少し先ほどのサイトを見てみると、
こんなものが、[Cython 0.23.2 documentation: Compilation](http://docs.cython.org/src/reference/compilation.html?highlight=get_include#)
>Often, Python packages that offer a C-level API provide a way to find the necessary include files, e.g. for NumPy:
>>include_path = [numpy.get_include()]

よくあることっぽかったですね。
とりあえず、これを`setup.py`に入れてみます。

```setup.py
from distutils.core import setup
from Cython.Build import cythonize
import numpy

setup(
    name = 'test',
    ext_modules = cythonize('test.pyx')
    include_path = [numpy.get_include()]
    )
```
これ使ってみるとなんかまたエラー出る

```error.
Unknown distribution option: 'include_path'
```

なんぞこれ、こんなオプションないって言われた。
stackoverflowとか色々見てみると、みんな`include_path`なんか使ってなくて、`include_dirs`を使ってるっぽい。
とりあえず`s/include_path/include_dirs`してみる。

```setup.py
from distutils.core import setup
from Cython.Build import cythonize
import numpy

setup(
    name = 'test',
    ext_modules = cythonize('test.pyx')
    include_dirs = [numpy.get_include()]
    )
```
実行してみると、通った(o・ω・o)
なんかわからんけどできたっぽい。


##まとめ
`include_dirs = [numpy.get_include()]`使うといいっぽい。
新しいものだと日本語で書かれているものが少ないので、英語がわからないと辛いものがある。
今回一応はコンパイル通ったが、`unused function`のwarningがいっぱい出てたのでなんか直さないといけないかも？(unused functionだから放置しても良いかも)
Error ld: library not found for -lPods

エラーハンドリングのメモ

```
ld: library not found for -lPods
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Library not found for -lPods
Linker command failed with exit code 1 (use -v to see invocation)
```

原因は多岐に及ぶようで、ネット上の解決法をいくつか試しても参考にならず...。


## 原因と解決法

自分の場合は`Build Phases > Link Binary With Libraries`の中に`libPods.a`が残っていたのが原因のようです。

これをその一覧から除外したところビルドが通りました。
ソースコードを汚くするには

# ソースコードを汚くするには？

汚いプログラム（ものによってはバグを引き起こすプログラム）にするためにはどうすればいいのかを書きました


情報集約のため以下ページに内容を移動させました

http://blog.y-yuki.net/entry/2016/09/03/210156
Electron + Livereloadの環境の雛形を作った

現在、ブラウザアプリを作ってるタカシです。開発を便利にしてくれるものはいくつかあります。Livereloadもその一つ。Meteorのようなイカしたフレームワークならまだしも、大抵は自前でgulpを書いたりwebpackにpluginを仕込んだりしなければなりません。

そこでElectron用の雛形を作りました。cloneした瞬間からLivereloadが有効になってます。

##導入

```
git clone https://github.com/endotakashi1992/electron-kickstarter
cd electron-kickstarter
npm i && gulp serve
```
完了です。自動でelectronの画面が立ち上がると思います。あとは```app.js```なり、```main.js```なり。```index.html```を編集しても再起動orリロードします。

それでは楽しいelectronライフを。どうぞ。

##P.S.
Twitterアカウントを作り直しました。プログラミングしてる方からのフォローお待ちしています。１２時間以内にフォロバします。
https://twitter.com/takashi_ed