OmniAICreator/Qiita-1.07M huggingface dataset:
Apache2.4でリバースプロキシ

* [SSH proxy via Apache - QuartzWiki](http://quartz-net.co.uk/quartzwiki/index.php/SSH_proxy_via_Apache)ということもできる様子

## 参考

* [Apache 2.4 で リバースプロキシの設定 - Qiita](http://qiita.com/gingi99/items/83c1fb07644cd232d91e)
* [2.10 プロキシ機能](http://software.fujitsu.com/jp/manual/manualfiles/M100003/B1WN9491/07Z201/ihs02/ihs00016.htm)

## 準備

* ubuntu 16.04で確認

```bash:モジュールを有効にする
sudo a2enmod proxy
sudo a2enmod proxy_http
```

## 簡単な例

```apache:/etc/apache2/conf-enabled/node.conf
ProxyRequests Off
ProxyPass /node/ http://localhost:4000/
ProxyPassReverse /node/ http://localhost:4000/
```

* `/node`ではなく`/node/`と書くところに注意！

### アクセス元制限

```apache2:/etc/apache2/conf-enabled/node.conf
ProxyRequests Off
ProxyPass /node/ http://localhost:4000/
ProxyPassReverse /node/ http://localhost:4000/

<Proxy *>
  Order deny,allow 
  Allow from 192.168.0.70/32
</Proxy>

<Location /node/>
  Order allow,deny 
  Allow from 192.168.0.70/32
</Location>
```
SCPコマンドでローカルのファイルをサーバにアップ＆サーバ上のファイルをDL


## はじめに

これまで、サーバで何か開発してる時に、たとえばjqueryをダウンロードして、それをまたサーバにアップロードして。。。
という作業がとても億劫でした。
自分はmac使ってるのでcyberdugというアプリで出来てはいましたが、基本CUIで作業しててファイルアップロードの時だけまた別アプリ起動するのが面倒でした。


で、今まで特に使ってなかったSCPコマンドの便利さに出会ってしまったので忘れないように書いておきます。

## SCPとは

そもそもSCPというのは、sshを使ってネットワーク間でファイルを転送する仕組みの事です。

特徴は、scp(Secure CoPy)は、SSHを使っているので通信が暗号化されるため安全にファイルの転送が出来る点です。

## 基本的な使い方

```
scp [オプション][転送したいファイル名][転送先のパス]
```

### ローカルのファイルをサーバに転送 - (リモートホストへの転送)

Desktopにあるhoge.txtを自分のサーバ上のホームディレクトリに転送する例

```
scp ~/Desktop/hoge.txt riki@[サーバのIPアドレス]:/home/riki/
```

* ディレクトリを転送する場合

ディレクトリを転送するには、`-r`オブションを使えばOKです。

```
scp -r ~/Desktop/hoge riki@[サーバのIPアドレス]:/home/riki/
```


### サーバ上のファイルをローカルに転送 - (リモートホスト上のファイルのDL)

サーバ上のファイルをダウンロードしてくる時は上記とは逆に指定すれば良いだけです。

```
scp riki@[サーバのIPアドレス]:/home/riki/hoge.txt ~/Desktop/
```

こんな感じ。

### リモートからリモートに転送

例えば、サーバを2つ持っていて、そのサーバ間の転送という事もscpなら可能です。

```
scp riki@[転送元サーバのIPアドレス]:/home/riki/hoge.txt riki@[転送先サーバのIPアドレス]:/home/riki/
```

## 便利なオプション紹介

オプション|機能
---|---
-p(小文字)|ファイルの更新時間やアクセス時間・パーミッションも維持して転送
-P(大文字)|ポート番号を指定する(sshでポート番号を22番から変更している場合なんかは使います
-c(小文字) [暗号化方式]|暗号化の方式を指定して転送を高速化します
-C(大文字)|転送を圧縮して高速化
-l [リミット(kBit/s]|scpに帯域制限をかける(メリットよく分かってない)
Pentahoで面白そうなページ


【Pentaho Lab】トレーニング１日目(Kettle:ケトル)の復習
http://www.compiere-distribution-lab.net/2013/06/25/pentaho-kettle-%E3%82%B1%E3%83%88%E3%83%AB-%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B/

オープンソースBI「Pentaho」徹底解説
http://thinkit.co.jp/book/2010/03/05/632

Pentaho Data IntegrationでETL(Extract/Transform/Load)を体験する
http://qiita.com/ariarijp/items/7f3820d569202804c8d0

後で読みたいもの。
【Pentaho Lab】トレーニング１日目(Kettle:ケトル)の復習
http://www.compiere-distribution-lab.net/2013/06/25/pentaho-kettle-%E3%82%B1%E3%83%88%E3%83%AB-%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B/

Pentaho x Docker
http://forums.pentaho.com/showthread.php?165218-Pentaho-Rapid-Deployment-with-Docker

Pentaho BI Server インストール
http://pentaho-bi-suite.blogspot.com/2014/01/installation-of-pentaho-bi-server-501.html
Ubuntuへのjavaインストール

Lubuntu 15.04にOpen JDKをインストールしてみた。
下記のコマンドを実行。
sudo apt-get install openjdk-8-jdk

続いて JAVA_HOMEの設定。
下記のURLによると、/etc/environmentを書き換えるらしい。本当か？　とりあえずやってみる。
http://askubuntu.com/questions/175514/how-to-set-java-home-for-openjdk

/etc/environmentにJAVA_HOMEを追加。sourceコマンドを実行して echo $JAVA_HOME。
確かに追加されているようだ。
unity > unity reference search engine


[Unity Reference Search Engine](
https://cse.google.com/cse/home?cx=001712401338047450041:csfhqk-trfa)

Unityに特化した検索結果が返ってくるようだ。

通常のgoogle検索で"Unity"とつけた時と比べると
- 日本語ページが検索候補にあがらない
- "prefab"で検索時、RSEだと142,000件、通常のgoogleだと383,000件の検索結果

などの違いはある。

日本語のページも見たい場合は、通常のgoogle検索の方を使いことになる。
英語のページだけ読みたい場合(最新の情報を見つけやすいのだろうか？）は、RSEを使うといいかもしれない。
c++ > POD型の構造体であることを示すために、クラスではなく構造体を使うエンジニアもいる。

引用: C++のためのAPIデザイン by マーティン・レディ
2.2 実装詳細の隠蔽

> POD型の構造体であることを示すために、クラスではなく構造体を使うエンジニアもいる。

一方で、そこまで考えずにPOD型でない場合も構造体を使うエンジニアもいるかもしれない。
c++11 > コンパイラ生成関数の制御 > NonCopyable() = default / NonCopyable(const NonCopyable&) = delete;

引用: C++のためのAPIデザイン by マーティン・レディ
6.2 コンストラクタと代入演算子

> また、特定の関数を無効にするようコンパイラに指示して、自動的に生成しないようにできる。

```cpp
class NonCopyable
{
public:
  NonCopyable() = default;
  NonCopyable(const NonCopyable&) = delete;
  NonCopyable & operator=(const NonCopyable) = delete;
};
```

`= delete`というのをつけることで自動生成をしないようにしている。

>当然ながら、これはC++0xのみの機能だ。

C++0xというのはC++11のこと。
クラス設計 > 実装の詳細を隠蔽する名前を付ける

引用: ゲームプログラマのためのコーディング技術 by 大圖衛玄(Moriharu Ohzu)さん
2.2 クラス設計のコツ

```cpp:
bool getDeadFlag() const {
  return isDead_;
}
```

> もし、死亡条件の判定方法を変更した場合には、実装手段とメンバ関数名が一致しなくなり、不自然な実装となります。メンバ関数名を変更すると、クラスの利用者側のコードも変更しなくてはなりません。

```cpp:
bool getDeafFlag() const {
  return hp_ <= 0; // HPがなくなったら死亡する
}
```

> メンバ関数の目的をそのまま関数名としていれば、実装手段に変更があっても問題はありません。

```cpp
bool isDead() const {
  return isDead_;
}
```

> ヒットポイントによる実装になっても不自然さはありません。

```cpp
bool isDead() const {
  return hp_ <= 0;
}
```

メンバ関数名というのは変更するとAPI使用者にソースの変更を強要することになるので、詳細中身を変えそうな処理については名前付けは気をつけた方がいいということになる。
You can't switch "normal-mode"(by Esc key) when you using "CODE PEN" with vim..

# You can't switch "normal-mode" when you using "[CODRE PEN](http://codepen.io/kenjimorita/)" with vim..
![スクリーンショット 2015-08-21 6.32.36.png](https://qiita-image-store.s3.amazonaws.com/0/64377/9739ff67-d33b-ade0-c68c-ab1d725c3f41.png)

Are you using [vimium](https://chrome.google.com/webstore/detail/vimium/dbepggeogbaibhgnhhndojpepiihcmeb) of **Chrome Extends with using Codepen vim**???


![スクリーンショット 2015-08-21 6.41.48.png](https://qiita-image-store.s3.amazonaws.com/0/64377/ebd32789-1b97-a468-6471-4e90d5dd4b21.png)

if you using this, It's Conflict 「Esc」key,

Stop chrome Extends of vimium, or change key map this

When I notice first, I think bug cause of [CODRE PEN](http://codepen.io/kenjimorita/).. 

now is morning on 6:20..

thank you,
【Unity 基本操作】 マップ・ダンジョン制作時の便利なVキーやスナップ

#**マップを作るのに重要な操作　（「V」キー）**
マップやダンジョンを作る際に置くオブジェクト（position０，０，０）
をスナップしても、微妙にずれるオブジェクトとかありませんか？
オブジェクトのサイズをUnityに合わせてない状態でインポートした奴とか
それをスナップフィットさせてくれる基本操作の紹介です。

まずオブジェクトを選択します「V」キーを押すと
![a.jpg](https://qiita-image-store.s3.amazonaws.com/0/85037/3248227e-45e7-6211-818f-f87ce285ca8c.jpeg)
ギズモの真ん中が白い四角![aaaaa.jpg](https://qiita-image-store.s3.amazonaws.com/0/85037/f66d36f0-8e20-7ff1-03a8-cb4fe0a498c2.jpeg)に変わります。

ここで自分が微妙だなと思ったのが、何時もならX,Y,Zの矢印を選択して「Ctrl」キーでスナップ移動しますがこのモードでは出来ません。
「V」キーを押して尚且つスナップさせるには中心の四角![aaaaa.jpg](https://qiita-image-store.s3.amazonaws.com/0/85037/f66d36f0-8e20-7ff1-03a8-cb4fe0a498c2.jpeg)の部分をドラッグして動かします。
因みにこれは頂点を選択する機能ですので写真のように真ん中を選択しても
隣のブロックに上手くスナップできません。
なので「V」を押した状態、または「Shift＋V」でモードを切り替えて
接するオブジェクトの頂点を選択します。
![aa.jpg](https://qiita-image-store.s3.amazonaws.com/0/85037/23ceb436-dc96-4c03-6b56-0d4572b348f3.jpeg)
この状態で真ん中の中央4角![aaaaa.jpg](https://qiita-image-store.s3.amazonaws.com/0/85037/f66d36f0-8e20-7ff1-03a8-cb4fe0a498c2.jpeg)をドラッグして左のタイルに寄せます。

![aaa.jpg](https://qiita-image-store.s3.amazonaws.com/0/85037/be98445b-3f73-0268-85b6-983bc8460ded.jpeg)

***わーい、綺麗にフィット。***
頂点選択モードの解除は「Shift＋V」です。

##**いちいち頂点選択するのが面倒な時**

**スナップセッティングを変える**
これはあくまでオブジェクトの標準スケールより何倍サイズなのか分かる時に有効な手段かと思います。
（細かな設定にするくらいなら上の方が汎用性高いと思うので）
**Edit→Snap settinggs**
![aaaa.jpg](https://qiita-image-store.s3.amazonaws.com/0/85037/014d1df4-c32f-22f9-dd31-4a38f05ae8d0.jpeg)
これが標準設定です、これを0.5もしくは0.25などにします。
上で紹介したタイルは0.5でぴったりでした。
このようにスナップを細かくするだけで解決する事も多いのです。

レベルデザインしてる人はもっと便利なアセット等を使っていると思いますが、
Unityの基本的な機能で早く知っておけば良かったシリーズとして紹介しました。
クラス設計 > 初期化はコンストラクタ、後始末はデストラクタで行う > ファイル出力の例

引用: ゲームプログラマのためのコーディング技術 by 大圖衛玄(Moriharu Ohzu)さん
2.2 クラス設計のコツ

> 初期化処理と終了処理が必要なAPIやクラスがある場合に、コンストラクタとデストラクタを利用して、初期化処理と終了処理を確実に実行するテクニックがあります。

```cpp
class TextFileWriter {
public:
  TextFileWriter(const std::string& fileName) : file_(NULL) {
    file_ = fopen(fileName.c_str(), "w");
  }
  ~TextFileWriter() {
    fclose(file_);
  }
  void write(const std::string& text) {
    fputs(text.c_str(), file_);
  }
private:
  FILE *file_;
};
```

(余談) コンストラクタで`file_ = `としているため`: file_(NULL)`とするのは不要と思ったが、(例ではいれていないが)try catchなどでfopenが失敗した時の対応なのだろうか?

上記を使って

```cpp
int main() {
  TextFileWriter file("test.txt");
  file.write("message");
  return 0; // 終了時に自動的にデストラクタがfcloseしてくれる
}
```

> 実際に、C++標準ライブラリのfstream系のクラスは、ファイルのオープンとクローズをコンストラクタとデストラクタで行います。
...
> コンストラクタとデストラクタを使ったリソース管理のテクニックをRAIIと呼びます。
技術英語 > Or better yet, maybe we could get ...

@ Star Trek Voyager > EMANATIONS

キム「xxxができるだろう」と言ったのに対してトレスが
> Or better yet, maybe we could get ....

<hr>
http://eow.alc.co.jp/search?q=better+yet&ref=sa
> better yet
> できたら、（しかしながら）もっといいことには
>
> or better yet
> いっそのこと

トレスの言葉の意味は「もっといいことには」の方だと思う。

<hr>
https://github.com/Georgge/autonomy-browser-ardrone
> Control the parror ar-drone with the browser. Or better yet, make autonomus routes.
NFSのプロトコルをTCPにするとリードエラー

# 困ってること
今お世話になってる研究室で使ってるPCがMandriva 2010という古いLinuxで，NFS上の容量の大きいテキストファイルを開こうとするとたまにリードエラーします。

再マウントするとうまく見れるようになったりもします。

#今日やったこと
NFSのマウントオプションをいろいろ変えて再マウントしてましたが，プロトコルをTCPからUDPに変更したらリードエラーがでなくなりました。マウントオプションにnoacとかいろいろつけたり消したりしましたが，結局プロトコルだけしか聞いてない感じになりました。

TCPのほうがデータの整合性がちゃんと取れてエラー出なさそうなのに，UDPにしたらエラーしなくなるというのがよく分かりません。

なんだかよくわからない投稿になって恐縮です。
【ライブラリ】スマホのタップ対策済みのクリックイベントリスナ（スワイプやフリックは除外）

JavascriptでPCならクリック、SPならタップに対してイベントハンドリングをする実装。
ポイントは下記。

- `element.onclick`は使わずに`element.addEventListener`か`element.attachEvent`を使う
- スマホでclickイベントを使うとダブルタップ判定待ちのラグが発生するため、touchXXX系のイベントを使う
- スワイプやフリックは除外

`touchstart`発生後に`touchmove`があればスワイプ／フリックとみなして除外、`touchmove`がないまま`touchend`が来たならタップとみなす。

というふうに実装しています


```js
// ページのDOMツリー構築後に実行（要するにwindow.onload）
function ale(fn){
	if (window.addEventListener) {
		window.addEventListener('load', fn, false);
	} else if(window.attachEvent) {
		window.attachEvent('onload', fn);
	} else {
		window.onload = fn;
	}
}

// 要素にクリックイベントリスナーを付加
function ace(el, fn){
	if (el.addEventListener){
		if(window.ontouchstart === undefined){
			el.addEventListener('click', fn, false);
		}else{
			var fTapped = false;
			el.addEventListener('touchstart', function(){fTapped = true}, false);
			window.addEventListener('touchmove', function(){fTapped = false}, false);
			window.addEventListener('touchend', function(){if(fTapped){fn()} fTapped = false}, false);
		}
	} else if(el.attachEvent){
		el.attachEvent('onclick', fn);
	}
}

// クリック／タップ時に実行する関数
function fn(){alert('clicked');}

// 1個の要素を指定して実行
ale(function(){ace(document.getElementById('room1'), fn)});

// 複数の要素をまとめて指定して実行
(function(){
	var els = document.getElementsByClassName('menu');
	ale(function(){
		for (var i = 0; i < els.length; i++) 
			ace(els[i], fn);
		}
	});
})();
```

## Javascriptの便利なライブラリ

- [JavascriptでYahoo!などのタグマネージャに渡すためのイベントを発生させる](http://qiita.com/gigamori/items/ec7542b19244c6776cd5)
- [Javascriptで正規分布の実装まとめ（乱数、累積分布関数など）](http://qiita.com/gigamori/items/e17e6f9faffb78822c56)
- [超簡単（手抜き？）cookie操作用のJavascript](http://qiita.com/gigamori/items/8a7d0cd29c05716bc2da)
- [超シンプルに、イベントハンドリング用の関数](http://qiita.com/gigamori/items/d0c5f5842671ec634f4a)
- [スマホのタップ対策済みのクリックイベントリスナ（スワイプやフリックは除外）](http://qiita.com/gigamori/items/5cdc91817564be66c2e6)
【ライブラリ】超シンプルに、イベントハンドリング用の関数

**IE8以前のための実装。IE9以降なら不要**

Javascriptで任意のイベントに対して処理の付加と削除をする関数。イベントハンドラではなくイベントリスナーを使ったもの

- `element.addEventListener()`か`element.attachEvent()`を使う
- `element.onXXX`は上書き問題があるので使わない

IE8以前をサポートしなくていいのであれば`element.addEventListener()`系のみでいいので不要。

```js
// イベントに対して処理を付加
function ae(el, ev, fn){
	if (el.addEventListener) {
		el.addEventListener(ev, fn, false);
	} else if(el.attachEvent) {
		el.attachEvent('on' + ev, fn);
	}
}

// イベントに対して処理を削除
function re(el, ev, fn){
	if (el.removeEventListener) {
		el.removeEventListener(ev, fn, false);
	} else if(el.detachEvent) {
		el.detachEvent('on' + ev, fn);
	}
}

// ページのDOMツリー構築後に実行（要するにwindow.onload）
function ale(fn){
	if (window.addEventListener) {
		window.addEventListener('load', fn, false);
	} else if(window.attachEvent) {
		window.attachEvent('onload', fn);
	} else {
		window.onload = fn;
	}
}
```

## Javascriptの便利なライブラリ

- [JavascriptでYahoo!などのタグマネージャに渡すためのイベントを発生させる](http://qiita.com/gigamori/items/ec7542b19244c6776cd5)
- [Javascriptで正規分布の実装まとめ（乱数、累積分布関数など）](http://qiita.com/gigamori/items/e17e6f9faffb78822c56)
- [超簡単（手抜き？）cookie操作用のJavascript](http://qiita.com/gigamori/items/8a7d0cd29c05716bc2da)
- [超シンプルに、イベントハンドリング用の関数](http://qiita.com/gigamori/items/d0c5f5842671ec634f4a)
- [スマホのタップ対策済みのクリックイベントリスナ（スワイプやフリックは除外）](http://qiita.com/gigamori/items/5cdc91817564be66c2e6)
ESP-WROOM-02をArduinoにしてとりあえずLチカする

## 何をするか
こちらの記事 http://qiita.com/azusa9/items/264165005aefaa3e8d7d で解説してくださっていることを実際に自分でもやってみる。
OS: OSX 10.10.4 Yosemite

## 必要なもの
### ESP-WROOM-02
#### ブレイクアウトボードとセット
* 直販 http://cerevo.shop-pro.jp/?pid=91592223 <- 未実装で届く
* スイッチサイエンス <- 実装済みのもの
 * すべての端子が引き出されているもの https://www.switch-science.com/catalog/2347/
 * シンプル版 https://www.switch-science.com/catalog/2341/

![DSC_1704.jpg](https://qiita-image-store.s3.amazonaws.com/0/29029/47cbfe26-4ec5-cc04-de86-b4189f108128.jpeg)

#### モジュールのみ
* 直販 http://cerevo.shop-pro.jp/?pid=91608654
* スイッチサイエンス https://www.switch-science.com/catalog/2346/
* 秋月 http://akizukidenshi.com/catalog/g/gM-09607/

変換基板が無くてもリード線をそのままハンダ付けすれば使えなくもない。

![DSC_1702.jpg](https://qiita-image-store.s3.amazonaws.com/0/29029/b63c8e4a-6432-53f3-97da-086e8bb03496.jpeg)

こうするとすぐにパターンが剥がれてしまうので良くない例。
こちらの人のようにユニバーサル基板に載せるべきだった↓
http://qiita.com/ikesato/items/92f4cb143e7aeb5e0f9b

### usb-シリアル変換基板
こういうようなもの
http://www.marutsu.co.jp/pc/i/137791/

### その他部品
これを見て集める
http://tech-blog.cerevo.com/archives/859/

## 動作モード
* IO0ピンをプルアップ　-> Flash Boot Mode
 * 直販のブレイクアウトボードでは「B」側にジャンパピンを移動した状態。
 * 内蔵Flashに書き込まれたプログラムを実行するモード
* IO0ピンをプルダウン -> UART Download Mode
 * 直販のブレイクアウトボードでは「D」側にジャンパピンを移動した状態。
 * シリアル通信を使ってFlashにプログラムを書き込むモード
* リセットは？

## 配線
これを見て頑張る
http://tech-blog.cerevo.com/archives/859/

![DSC_1708.jpg](https://qiita-image-store.s3.amazonaws.com/0/29029/8293170d-09f5-d6eb-ab51-e4ce067c498f.jpeg)

LEDは300Ωくらいの抵抗を介してpin13につないでおく。
ピン番号はここ http://tech-blog.cerevo.com/archives/859/ をみればわかる。

## 書き込み
こちらの記事を参考に http://qiita.com/azusa9/items/264165005aefaa3e8d7d Arduinoを準備しておく
「ファイル」->「スケッチの例」->「02.Digital」->「BlinkWithoutDelay」を開く。

1. ジャンパピンを移動して「UART Download Mode」にする
2. 電源を切入するなどしてリセットする
3. Arduinoの書き込みボタンを押す

もし

```
error: failed reading byte
warning: espcomm_send_command: cant receive slip payload data
warning: espcomm_send_command(FLASH_DOWNLOAD_BEGIN) failed
```
こういうエラーが出たら？
このブログを参考になんとかする。
http://hpclab.blogspot.jp/2015/06/esp8266-arduino-ide-on-mac-os-x.html

```
Writing at 0x00000000... (0 %) 
Writing at 0x00000400... (0 %) 
Writing at 0x00000800... (1 %) 
Writing at 0x00000c00... (1 %) 
Writing at 0x00001000... (2 %) 
Writing at 0x00001400... (2 %) 
Writing at 0x00001800... (3 %) 
Writing at 0x00001c00... (3 %) 
Writing at 0x00002000... (4 %) 
Writing at 0x00002400... (4 %) 
Writing at 0x00002800... (5 %) 
Writing at 0x00002c00... (5 %) 
Writing at 0x00003000... (6 %) 
...
```
こんなんが出て書き込みをしてくれる。

## 動きましたか？僕は動きました
先人たちに感謝
Raspberry PiでLIRCをインストールする

Raspberry PiでLIRCをインストールする手順です。
LIRCを動かすためにはいくらか電子工作のようなことが必要なのでそれも同時に行います。

#前提
* 使用するRaspberry Pi: Raspberry Pi 2
* IR(赤外線)受信モジュール: PL-IRM2161-XD1
* IR LED: 手持ち(OSI5FU5111C-40 かな?)
* その他用意するもの：ブレッドボード、100Ωとかの抵抗、ジャンパワイヤ

#LIRCとは
LIRCは、Linux Infrared Remote Controlの略でLinux上からIRコントロールを簡単にできるようにするデーモンです。
いわゆる学習リモコンのような機能が実装されています。

#LIRCのインストール
まず、Raspberry PiにLIRCをインストールします。
```apt-get install lirc```
でパッケージがインストール出来ます(簡単!)
インストールしたら赤外線向けの回路を作るので一旦シャットダウンします
```shutdown -h now```

# 回路の作成
とりあえずソフト側は出来たのでさっくり回路を作ります。
今回は3.3VのIOですので、LEDについては[LED計算機](http://diy.tommy-bright.com/)で適当に計算します。今回は100Ωを挟みました。
また、PL-IRM2161-XD1についてはデータシートにサンプル配線がありますが、当方でテストした限りでは抵抗を挟むとRaspberry Piが落ちたり認識しなかったりするので直結にしてあります。
皆さんはとりあえず抵抗を挟んで、動かなければ少しずつ抵抗を外していってください。
今回はFritzingで回路図を作りました。（楽でいいですね）
![Sample](https://qiita-image-store.s3.amazonaws.com/0/89883/39c69f2f-ad6a-dc8f-d976-041adda5f6aa.png)
注意点としては3.3Vの供給とGNDの入れ違えなどがよくあります。
ジャンパーワイヤーの色をあらかじめ決める(3.3Vは赤、GNDは黒、信号線は白)などして、回路が問題無いことを確認してからRaspberry Piに接続しましょう。

#配線の確認
次にとりあえずLEDが光るか確認します。
```sudo echo 18 > /sys/class/gpio/export```
とすると```/sys/class/gpio/```にgpio18というフォルダができています。
```sudo echo out > /sys/class/gpio/gpio18/direction```
でこのGPIOが出力方向であると明示します。
そして、```sudo echo 1 > /sys/class/gpio/gpio18/value```とするとLEDが点灯し、
```sudo echo 0 > /sys/class/gpio/gpio18/value```とすると消灯します。
IR LEDの場合にはスマートフォンやデジタルカメラで確認すると良いかと思います。
（iPhoneなど一部機種はリアカメラはIRカットがされているようなので、フロントカメラで見ましょう）
#LIRCの設定
まず、Raspberry Pi 2のGPIOポートのどれを使用するか決めます。
Raspberry Pi 2のピンアサインは[Raspberry Pi2 GPIO Header](http://www.element14.com/community/docs/DOC-73950/l/raspberry-pi-2-model-b-gpio-40-pin-block-pinout)にあります。
1番ピンがある列はmicroUSB側で、Video/Audio側が2番ピンの列、microSD側が1,2pinです。
今回はGPIO17(11Pin)をIN側(受信側)とGPIO18(12Pin)をOUT側(送信側)にします。

```/etc/modules``` を編集し、以下のモジュールを追加します。
```lirc_dev```
```lirc_rpi gpio_in_pin=17 gpio_out_pin=18```
この時、物理ピンの番号を指定すると動きませんのでご注意ください。

```/etc/lirc/hardware.conf``` を編集します。
変更する項目はこれくらいです。
```LIRCD_ARGS="--uinput"
LOAD_MODULES=true
DRIVER="default"
DEVICE="/dev/lirc0"
MODULES="lirc_rpi"```

ここで一旦再起動します。
再起動するとlircサービスが自動で起動します(ここは大事)

# 動作確認
動作確認をします。
```sudo mount -t debugfs debugfs /sys/kernel/debug
sudo cat /sys/kernel/debug/gpio```
と入力すると、
```
GPIOs 0-53, bcm2708_gpio:
 gpio-17  (lirc_rpi ir/in      ) in  lo
 gpio-18  (lirc_rpi ir/out     ) in  lo
 gpio-47  (led0                ) out lo
```
などと出力されます。
出力されない場合には、```/etc/modules```の書き間違え、配線ミス、Device Treeが原因のケースがあります。
前2個が問題無ければ、[以前書いた記事](http://qiita.com/Library/items/adcd66694e3068bd672b)を参考にDevice Treeを無効にしましょう。

次にLIRCがロードされているか確認します。
```ls -l /dev/lirc*```でlirc0が居ることを確認しましょう。
居たら、IR受信センサの動作を確認するためにLIRCを一旦停止します。
```/etc/init.d/lirc stop```
次に適当な赤外線リモコンを用意して、以下のコマンドを実行します。
``` mode2 -d /dev/lirc0```
実行した後、IR受信センサに向けてリモコンを操作してみると、何か出てくるかと思います。
出てこない場合、IR受信センサの配線に何らかの問題があると思いますので、確認してみてください。

ここまでくればLIRCはインストールされました。
後はLIRCを設定するだけですが、それはまた別の機会に。
/users/passwordみたいな、URLのネストしたリソースに親IDを入れないroutesの書き方

なんか毎回忘れたころに書くことになってその度にググってるので、書き留めておく。

`resources`に`resource`を直接ネストさせると、親の`user_id`がURLに入る。

```routes.rb
resources :users, only: %i() do
  resource :password, only: %i(update)
end
```

```sh
% rake routes
user_password PATCH /users/:user_id/password(.:format) passwords#update
              PUT   /users/:user_id/password(.:format) passwords#update
```

`User`と`Password`のようなリクエストユーザが自身のリソースのみにアクセスできるような親子パターンでは、リクエストしたユーザ自身の`user_id`以外を指定できるようなURLはパラメータが無意味になるだろうし、`user_id`はURLパスから取り除きたい。


アクションメソッドを`users_contorller.rb`に書いてしまうパターン。

```routes.rb
resources :users, only: %i() do
  patch :password, on: :collection
end

# or

resources :users, only: %i() do
  collection do
    patch :password
  end
end
```

```zsh
% rake routes
password_users PATCH /users/password(.:format) users#password
```

しかし、この方法だと`user`リソースのためのメソッドとコンフリクトしないために、大抵のパターンで`:edit_password`や`:update_password`などのルートを作ることになりアクションの名前にいびつさが出てくる。


別のコントローラファイルを作って親と同じく`scaffold`パターンのアクションを追加したい。

```routes.rb
resources :users, only: %i() do
  collection do
    resource :password, only: %i(edit update)
  end
end
```

```zsh
% rake routes
edit_password GET   /users/password/edit(.:format) passwords#edit
     password PATCH /users/password(.:format)      passwords#update
              PUT   /users/password(.:format)      passwords#update
```


コントローラファイルのパスもURLと合わせたいので、さらに`controller`もしくは`to`オプションを追加する。

```routes.rb
resources :users, only: %i() do
  collection do
    resource :password, only: %i(edit update), controller: 'users/password'
  end
end
```

```zsh
% rake routes
edit_password GET   /users/password/edit(.:format) users/password#edit
     password PATCH /users/password(.:format)      users/password#update
              PUT   /users/password(.:format)      users/password#update
```
jQuery-Validation-Engineの「submitボタンをクリック後、エラーメッセージが再表示されないバグ」への対応


フォームの入力内容をリアルタイムでチェックできるプラグイン「jQuery-Validation-Engine」の軽微なバグが気になったので、簡単な方法で対応しました。

## jQuery-Validation-Engineのダウンロードと基本の使い方
ダウンロードおよび基本の使い方については以下のリンクをご参照ください。

■jQuery-Validation-Engine
https://github.com/posabsolute/jQuery-Validation-Engine

■フォームの入力内容をリアルタイムにチェックする方法
http://allabout.co.jp/gm/gc/420327/

## バグの内容
このプラグインはとても便利なのですが、導入してみて以下の点に気づきました。
初期仕様では、必須項目が未入力のままsubmitボタンを押すと、未入力欄の上にエラーメッセージが表示され、該当箇所まで自動スクロールし、入力欄にフォーカスがかかります。

![例1](https://qiita-image-store.s3.amazonaws.com/0/62022/ccefab5a-3638-4ff6-30d0-43f219d233f8.png)

このエラーメッセージはクリックすることで消えるのですが、消した後に再度未入力のままsubmitすると、今度はエラーメッセージが表示されず、さらに上下に行ったり来たりとスクロールしてしまうこともあります。

エラーメッセージをフェードアウトしたあとフェードインする処理を施していないためです。
未入力が二度以上続く想定はしていないということですかね。

## 対処方法
これに対応するために、フェードアウトではなくスタイルシートの display:none; で表示・非表示を切り替えるようにしました。

#### jquery.validationEngine.jsの修正

■jQuery-Validation-Engineのダウンロード
https://github.com/posabsolute/jQuery-Validation-Engine

まずは、jsディレクトリ内のjquery.validationEngine.jsをテキストエディタ等で開き、29行目あたりの以下4行を削除もしくはコメントアウトします。

**削除するコード**

```javascript
$(this).fadeOut(150, function() {
	// remove prompt once invisible
	$(this).closest('.formErrorOuter').remove();
});
```

これがフェードアウトにするコードなのでこの4行を消し、代わりにスタイルシートで非表示にするため任意のclass名を追加します。

**追加するコード**

```javascript
$(this).addClass('hide');
```

二度目のsubmitボタンで再表示するため、↑で追加したclassを削除します。
270行目の以下のコード

**修正前**

```javascript
_onSubmitEvent: function() {
	var form = $(this);
	var options = form.data('jqv');
    
// 以下略
```

こちらに一行追加します。

**修正後**

```javascript
_onSubmitEvent: function() {
	var form = $(this);
	var options = form.data('jqv');

	$('.formError').removeClass('hide');    //←この一行を追加
    
// 以下略
```

これでclassの追加・削除が完了しました。

#### validationEngine.jquery.cssを変更
cssディレクトリ内のvalidationEngine.jquery.cssをテキストエディタ等で開き、さきほど追加したclassとスタイルを追加します。
最後の行に加えるのが無難です。

```css
.formError.hide {
	display: none;
}
```

以上で、
submitボタンをクリック
→エラーメッセージ表示
→エラーメッセージをクリックして消す（"hide"class追加）
→submitボタンをクリック
→再度表示（"hide"class削除）
という処理が完了し、不自然な上下スクロールもなくなりました。
VBAHaskellの紹介 その23（ジャグ配列をフラットな配列に展開する再帰）

(2016/3/7)
この関数はHaskell_6_iterator.bas の廃止と vh_stdvec.cls の追加に伴い、実装を書き換えた。ほとんど形を変えずに同じ機能が実現できた。

* * *

VBAは前方宣言なしで関数を呼べるため、少し奇妙に見える再帰呼び出しができる。

#例題
ジャグ配列、たとえば `Array(1, Array(2, Array(3, Array(4, Array(5), 6))), 7)` をフラットな配列`Array(1, 2, 3, 4, 5, 6, 7)` に展開する。

#方針
次のような関数`curiouslyRecursive` を作る。

1. 出力用の配列（実際にはイテレータ[^1]） を受け取り、その末尾に対象配列の各要素を順に追記していく。要素自身が配列である時は再帰的に処理する。
2. 上記の繰り返し処理は畳み込み関数`foldl`で表現する。accumulatorは出力用配列。
3. **この関数自体を`foldl`の引数に渡して再帰する**

#コード
```vbnet
' 少しだけ奇妙な再帰
Function curiouslyRecursive(ByRef it As Variant, ByRef x As Variant) As Variant
    If IsArray(x) Then  ' 配列の場合
        curiouslyRecursive = foldl(p_curiouslyRecursive, it, x)  ' ← ここ
    Else  ' 単一変数の場合
        curiouslyRecursive = iterator_push_ex(it, x)     ' 単純に末尾に追加
    End If
End Function

    ' この関数を関数ポインタ化したもの
    Function p_curiouslyRecursive(Optional ByRef firstParam As Variant, Optional ByRef secondParam As Variant) As Variant
        p_curiouslyRecursive = make_funPointer(AddressOf curiouslyRecursive, firstParam, secondParam)
    End Function

' テスト関数
Sub curiouslyRecursiveTest()
    Dim arr As Variant
    arr = Array(1, Array(2, Array(3, Array(4, Array(5), 6))), 7) ' ジャグ配列
    Dim ret As Variant: ret = Array()    ' 結果出力用配列
    Dim it As Variant:  it = make_iterator(ret)
    it = curiouslyRecursive(it, arr)
    ret = release_iterator(it)
    ReDim Preserve ret(0 To iterator_pos(it))
    printS ret  ' サイズ表示
    printM ret  ' 配列の内容表示
End Sub
```
**「ここ」**とコメントした箇所で、自分自身を`foldl`の引数に渡している。配列ではない単一の変数に到達するまで再帰的に呼び出され、単一変数になったらそれを末尾に追加することになる。

（イテレータに新規に導入した関数）
配列の末尾に追記するときはサイズを拡張しなければならないので、イテレータに処理効率を考慮した新しい関数`iterator_push_ex`を追加した。イテレータが指す位置が配列の`UBound`を超えていたらサイズを2倍にする。

```vbnet
' 範囲拡張しながらiterator_push
Function iterator_push_ex(ByRef it As Variant, ByRef x As Variant) As Variant
    Dim m As Long: m = max_fun(it(1), 2 * UBound(it(0)) - LBound(it(0)) + 1)
    If UBound(it(0)) < it(1) Then
        Dim tmp As Variant
        swapVariant tmp, it(0)
        ReDim Preserve tmp(LBound(tmp) To m)
        swapVariant tmp, it(0)
    End If
    iterator_push_ex = iterator_push(it, x)
End Function
```
#モジュール
イテレータ → [Haskell_6_iterator.bas](https://github.com/mYmd/VBA/blob/master/Haskell_6_iterator.bas)
テストコード → [test_module.bas](https://github.com/mYmd/VBA/blob/master/test_module.bas)
* * *
[VBAHaskellの紹介 その22（イテレータ）](http://qiita.com/mmYYmmdd/items/e0a7313c1cc680905f19)
[VBAHaskellの紹介 その1（最初はmapF）](http://qiita.com/mmYYmmdd/items/c731edf943acc0a0ebe9)

[^1]: [VBAHaskellの紹介 その22（イテレータ）](http://qiita.com/mmYYmmdd/items/e0a7313c1cc680905f19)
Bosnadev/Repositories を使って $someRepo->lists('name', 'id'); すると Collection ではなく array が返ってくるようになったので要注意

https://github.com/Bosnadev/Repositories を使って $someRepo->lists('name', 'id'); すると Collection ではなく array が返ってくるようになったので要注意です。

というメモ。

## 何が不明なのかのメモ

http://laravel.com/api/5.1/Illuminate/Support/Collection.html#method_lists を見ると、 Collection::lists は Collection が返ってくるので、 Repository でも Collection が返ってきた方がわかりやすい気がする。

が、 https://github.com/Bosnadev/Repositories/commit/95e6c41854c9d0471f86c96a96fef963425d7a6d にて、変更が入ったようで。

で、`Updated the lists function for Laravel 5.1`ってなってるけど、これが、何でこうしたんやろか？、ってのがイマイチ理解できてない。

※確かに、 `$someRepo->lists('name', 'id')->toArray()` として使うケースが多いわけですが、なんだか腑に落ちない。
Crystal - Array - Instance Method - update #crystal


## <i class="fa fa-diamond" style="font-size:1em;"></i> 概要
CrystalのArrayクラスのインスタンスメソッド`update`について

## <i class="fa fa-check-circle" style="font-size:1em;"></i> シグネチャ
`update(index : Int, &block)`

任意のindexの要素を&blockの戻り値で上書きます。

## <i class="fa fa-flask" style="font-size:1em;"></i> サンプル
### <i class="fa fa-code" style="font-size:1em;"></i> プログラム
~~~ruby
hoges = %w(hoge hige hage)

pp hoges.update(1){ |e|e.upcase }
pp hoges
pp hoges.update(0){ |e|e.upcase }
pp hoges
# 暗黙のto_proc
pp hoges.update(0, &.downcase)
pp hoges
# 同等の操作
pp hoges[0] = hoges[0].upcase
pp hoges
~~~

### <i class="fa fa-file-text" style="font-size:1em;"></i> 出力
~~~ruby
hoges.update(1, &.upcase) = "HIGE"
hoges = ["hoge", "HIGE", "hage"]
hoges.update(0, &.upcase) = "HOGE"
hoges = ["HOGE", "HIGE", "hage"]
hoges.update(0, &.downcase) = "hoge"
hoges = ["hoge", "HIGE", "hage"]
hoges[0] = (hoges[0]).upcase = "HOGE"
hoges = ["HOGE", "HIGE", "hage"]
~~~

## <i class="fa fa-book" style="font-size:1em;"></i> 外部資料
* <i class="fa fa-external-link" style="font-size:1em;"></i> [Array - Crystal API Library](http://crystal-lang.org/api/index.html#http%3A//crystal-lang.org/api/Array.html)
ansibleでoracle jdkをインストールする

playbookはこんな感じ
ポイントは、ライセンスのaccept（逆に、それ以外はPPAからaptでインストールするから、何の苦もないだろうと言われるかも知れないけど、その通り）

```:yaml
- hosts: 127.0.0.1
  connection: local
  become: yes
  tasks:
      - apt_repository: repo='ppa:webupd8team/java'
#     - name: Autoaccept license for Java7
#      debconf: name='oracle-java7-installer' question='shared/accepted-oracle-license-v1-1' value='true' vtype='select'

    - name: Autoaccept license for Java8
      debconf: name='oracle-java8-installer' question='shared/accepted-oracle-license-v1-1' value='true' vtype='select'
    
    - name: Install Java
      apt: name={{item}} state=latest
      with_items:
        - oracle-java8-installer
        - ca-certificates
        - oracle-java8-set-default
```
rsyncで外付けHDDに定期バックアップするシェルスクリプト

１週間分＋αのバックアップをしてくれるシェルスクリプトです。
昔使ってたヤツですが動作保証ナイデス。

```sh:daily_backup.sh
#!/bin/bash

# bkuprootには外付けHDDなどのマウントディレクトリを、backuptoにはblkidなどで調べた外付けHDDのUIDを指定
bkupdir=`date +%y%m%d`
bkuproot="/tmp/backup"
bkupto="-U qiitadot-com0-15rs-23yn-c1567bk2788a"

mkdir -p $bkuproot

# unmount for safe
umount /mnt 2>&1 > /dev/null
umount $bkuproot 2>&1 > /dev/null

# mount backup drive
mount $bkupto $bkuproot || exit 1

# 日曜日には過去一週間以前のデータを消す
if [ 0 -eq `date +%w` ]; then

  # 最新７つ以外は削除
  declare -a backups=(`ls -1t $bkuproot`)
  backups=("${backups[@]:7}")
  for x in ${backups[@]}; do rm -rf $x; done

  # 最新のバックアップを新しいフルバックアップとして扱う
  newroot=`ls -1t $bkuproot | head -1`
  if [ -d $bkuproot/root -a "root" != $newroot ]; then
    rm -rf $bkuproot/root
    mv $bkuproot/$newroot $bkuproot/root
  fi
fi


# フルバックアップがまだならフルバックアップを、済みなら差分を
# /, /home, /rootが別パーティションである場合…
mount -r --bind / /mnt
if [ -d $bkuproot/root ]; then
  rsync -av --delete --link-dest=$bkuproot/root /mnt/ $bkuproot/$bkupdir
  rsync -av --delete --link-dest=$bkuproot/root/home /home/ $bkuproot/$bkupdir/home/
  rsync -av --delete --link-dest=$bkuproot/root/boot /boot/ $bkuproot/$bkupdir/boot/
else
  rsync -av /mnt/ $bkuproot/root
  rsync -av /home/ $bkuproot/root/home/
  rsync -av /boot/ $bkuproot/root/boot/
fi
umount /mnt

# バックアップ終わり、接続解除
umount $bkuproot
rmdir $bkuproot
```

新規／更新ファイルは普通にコピー、バックアップ済ファイルはハードリンクで省スペース設計な感じ。

バックアップ先を

```sh:daily_backup.sh
rsync -av --delete \
  --link-dest=$bkuproot/root /mnt/ $bkuproot/$bkupdir
```

ではなく

```sh:daily_backup.sh
rsync -av --delete \
  --link-dest=$bkuproot/root /mnt/ $bkuproot/daily/$bkupdir
```
とかにしとけば

```sh:hourly_backup.sh
rsync -av --delete \
  --link-dest=$bkuproot/root /mnt/ $bkuproot/hourly/$bkupdir
```

とかに設定したヤツと共存出来るかもデスね。
Mac OS XのTime Machineみたい。
vue.jsのカスタムコンポーネントをちゃんと使う

カスタムコンポーネントを使おうとして、公式ドキュメントをはじめとしていろんな情報を漁っても、
親から子にdataを渡して子ではテンプレートに表示してるだけ、みたいなシンプルすぎてよくわからないサンプルばかり見つかるので、自分で試しながら理解した点をまとめます。

親からデータを渡された後はコンポーネント側で自立して状態保持・変更を行うようなサンプルを書いてみました。


``` index.html
<script language="javascript" src="http://cdnjs.cloudflare.com/ajax/libs/vue/1.0.24/vue.js"></script>

<div id="app">
    <pattern-component v-for="pattern in partterns" :pattern="pattern" track-by="$index"/>
</div>

<script>
    var patternComponent = Vue.extend({
        data: function(){
            return { 
                list: ["◯", "△", "×", "□"]
            }
        },
        props: [ 'pattern' ],
        methods: {
            change: function(){
                this.pattern++;
                if(this.pattern >= this.list.length){
                    this.pattern = 0;
                }
            },
        },
        computed: {
            mark : function(){
                return this.list[this.pattern];
            },
        },
        template: '<li @click="change">{{mark}}</li>'
    });

    var app = new Vue({
        el: '#app',
        data: {
            partterns: [ 0, 0, 0, 0 ]
        },
        components: {
            'pattern-component': patternComponent
        }
    })
</script>
```

## カスタムコンポーネントの基本的な使い方
公式ドキュメントはなんかつらつら書いてありますが、`Vue.extend({})`で定義して、`Vue.component()`で登録して使います。`Vue.component()`で定義しても動きますが、別ファイルに切り出せるようになるというのはカスタムコンポーネントの利点の一つなので、わざわざ固めてしまうモチベーションはよくわかりませんでした。
参考:http://jp.vuejs.org/guide/components.html#コンポーネントの使用

## v-forから渡ってくるデータについて
```
<my-component v-for="childProp in parentList" :childProp="childProp"/>
```
みたいな書き方をすると、`patentList`の1つの要素が`my-component`の`childProp`に渡されます。
サンプルでは各子コンポーネントに渡すプロパティが同一値であるため、`track-by`パラメータを指定するようにと`[Vue warn]`がでました。同一のプロパティで初期化する場合は注意しましょう。
```
vue.js:1018 [Vue warn]: Duplicate value found in v-for="pattern in partterns": 0. Use track-by="$index" if you are expecting duplicate values.```

参考： https://jp.vuejs.org/guide/components.html#コンポーネントと-v-for

## templateについて
もっと大きく複雑になる場合は、`<template>`を使って別ファイルに切り出して、JSコード側からはidで指定するようにすべきだと思います。
また、いろんなところで子コンポーネントのテンプレート内に親のデータをアサインしているような使い方がされているのを見かけましたが、カスタムコンポーネントとして使うならちゃんと分離しておく方が見通しも再利用性もよくなりそうな気がします。

## methods, computedについて
普通に `new Vue({...})`する時と全く同じように使えました。
カスタムコンポーネント内に定義することによって、親のVMでは実際に表示されるマークについて全く意識する必要がなくなり良い感じです。

## バインディングについて
何も考えずに使うとデフォルトがone-wayバインディングで、子から親への伝搬が行われないので注意が必要です。子から親へ伝搬させたい場合はプロパティを渡す時に `.sync`を指定してやる必要があります。
参考：http://jp.vuejs.org/guide/components.html#Prop-バインディングタイプ


## 感想
- カスタムコンポーネントをちゃんと活用するとファイルが分けられる/責務が分割できる/見通しがよくなるなど一般的なクラス分けの恩恵を受けられそうです。ガンガン使いましょう。
- 今回書いたサンプルの`list`の部分をmixinで拡張すれば、コンポーネントの使い勝手が上がりそうだなと思ったんですが、今回はそこまで手が回らなかったのでmixin拡張しやすいインタフェースについてもそのうち考えます
守秘すべき内容をコード埋め込みしない対応

System.Environment.GetCommandLineArgs()を使った事例として。

守秘性の高い情報は誰もが閲覧できないようにしたい・コードの中に埋め込みも避けたい、ので…

```lang:batchbuild.cs
public static class BatchBuild
{
    private static bool androidBuild()
    {
        string keystoreName = "default";
        string keystorePass = "default";
        string keyaliasName = "default";
        string keyaliasPass = "default";

        string[] args = System.Environment.GetCommandLineArgs();
        for (int i = 0; i < args.Length; ++i) {
            switch (args[i]) {
                case "-androidkey":
                    {
                        string androidkey = args[++i].TrimEnd('\n','\r');
                        string [] keys = androidkey.Split(',');
                        keystoreName = keys[0];
                        keystorePass = keys[1];
                        keyaliasName = keys[2];
                        keyaliasPass = keys[3];
                    }
                    break;
            }
        }
        PlayerSettings.Android.keystoreName = keystoreName;
        PlayerSettings.Android.keystorePass = keystorePass;
        PlayerSettings.Android.keyaliasName = keyaliasName;
        PlayerSettings.Android.keyaliasPass = keyaliasPass;
        :
```
こんな感じに書いて、以下のようにバッチ実行。

```
-quit -batchmode -executeMethod BatchBuild.androidBuild -androidkey keystorename,keystorepass,keyaliasname,keyaliaspass
```

多分おそらくjenkinsに設定を書きますが、jenkins自体誰もが見れないようにすれば、閲覧できる人を絞れることはできそう、です。
MySQL(MariaDB)で複数行が返ってきた結果を、1つのカラムに展開（縦を横に）

# 概要
SQLで結果は縦だけど、横にまとめたい時があります。タグのデータとか。
具体的に、郵便番号のデータでやってみます（これは別に横に展開したいわけではないですが、、、）。
[全国の郵便番号データを最速でMySQL(MariaDB)に入れてみる](http://qiita.com/kesuzuki/items/6d6c89a876d7b8ea820c) のデータです。

## サンプルデータ
```lang:mysql
MariaDB [sampledb]> select id, zipcode, pref, city, street from zipcode where zipcode = '0288405';
+-------+---------+-----------+--------------------------+-----------+
| id    | zipcode | pref      | city                     | street    |
+-------+---------+-----------+--------------------------+-----------+
| 12700 | 0288405 | 岩手県    | 下閉伊郡田野畑村         | 大芦      |
| 12708 | 0288405 | 岩手県    | 下閉伊郡田野畑村         | 切牛      |
| 12726 | 0288405 | 岩手県    | 下閉伊郡田野畑村         | 浜岩泉    |
| 12729 | 0288405 | 岩手県    | 下閉伊郡田野畑村         | 真木沢    |
| 12732 | 0288405 | 岩手県    | 下閉伊郡田野畑村         | 南大芦    |
+-------+---------+-----------+--------------------------+-----------+
5 rows in set (0.00 sec)
```

同じ郵便番号で複数の地名が存在する↑の**street**のところですね。

## SQL実行(group_concat)
MySQLの関数である**group_concat**を使います。group_concatではDISTINCT、ORDER BY、SEPARATORが使えます。
group byに**zipcode**を指定して、**3つ**の郵便番号で検索してみます。

```lang:mysql
MariaDB [sampledb]> select zipcode, pref, city, group_concat(DISTINCT street ORDER BY id SEPARATOR '<>') from zipcode where zipcode in ('0288405', '0288406', '0288407') group by zipcode;
+---------+-----------+--------------------------+----------------------------------------------------------+
| zipcode | pref      | city                     | group_concat(DISTINCT street ORDER BY id SEPARATOR '<>') |
+---------+-----------+--------------------------+----------------------------------------------------------+
| 0288405 | 岩手県    | 下閉伊郡田野畑村         | 大芦<>切牛<>浜岩泉<>真木沢<>南大芦                       |
| 0288406 | 岩手県    | 下閉伊郡田野畑村         | 猿山<>年呂部<>七滝<>室場<>目名                           |
| 0288407 | 岩手県    | 下閉伊郡田野畑村         | 川平<>菅窪<>田野畑<>和野                                 |
+---------+-----------+--------------------------+----------------------------------------------------------+
3 rows in set (0.00 sec)
```

おお、なんて便利な。
hover() が動的に後から生成された要素にきかないから


hover()が後から動的に追加した要素にきかない
on()しようと思った
$(".hoge").on("hover", function(){...});　←ダメな例
これは反応しない

下記で解決

```js:filename
$("#ターゲットの親要素").on({
    "mouseenter": function(){...},
    "mouseleave": function(){...}
}, "#ターゲット");
```




https://www.seeds-std.co.jp/seedsblog/1586.html
ありがとうございます。
Karma+Jasmine-jQueryでHTML fixtureをロードする

Karmaでjasmine-jqueryを使ってHTML fixtureをよみこもうとして少しハマったという話。ちなみにテストフレームワークはJasmine。


## 1. fixtureの置かれたパスを設定する

Karmaから読み込む場合は`base`というディレトリがKarmaからみたルートディレクトリになる。そのため、`$APP_ROOT/test/fixtures`にフィクスチャーとなるhtmlを置いた場合は下記のようにテスト内で指定する

```
jasmine.getFixtures().fixturesPath = 'base/test/fixtures';
```

が、これだけだと読み込みできない

```
Error: Fixture could not be loaded: /Users/foo/Work/my_app/test/fixtures/baz.html (status: error, message: undefined)
```

## 2. Karmaでサーブするようkarm.conf.jsに書く

下記のようにincludedは`false`にした上でサーブする対象として指定する

```karma.conf.js
    files: [
        'public/assets/js/*.js',
        'test/js/*js',
        {
            pattern: 'test/fixtures/*.html',
            watched: true,
            included: false,
            served: true
        }
    ],
```


とのように2点気をつけると`loadFixture`が動作するようになる
Minecraft 1.8のmod導入可能なサーバを建ててみる

## むかしばなし
マインクラフトは環境は比較的どんなやつでも建てられると思います。
Javaで書かれているのでその点はちょっと強いです。
ただサードパティ製のマイクラ鯖にライセンス問題だとかややこしー問題が発生したせいで、mod入りのマイクラで遊ぶにはちょっと面倒な行程を経る必要が出てきちゃいました。
今から１年くらい前のことです。
## いま
マインクラフトのmod対応鯖には幾つか種類がありますが、一番新しいのだと [Spongepowered](https://www.spongepowered.org) のとかでしょうか。ただコレは新しすぎてmod自体が少ないのと、まだdev版しか出てないのでオススメはできません。大体候補が総じて潰れたときのために定期的に情報を追っておくのは良いかもしれないですけど。
最も使われてるヤツだと今はCraftbukkit（Bukkit, Claudron, Spigot,...）とかでしょうか。Bukkit 1.8（現行のマインクラフトの最新バージョンが1.8）でググると資料がいろいろ見つかります。昔は起動するだけでよかったコンパイル済みの実行ファイルが配布されてたんですが、今は上のライセンス問題だとかを回避するためにソース取得＆コンパイルを手前でやらなければなりません。そこがちょっと面倒ですけど、modも豊富だし慣れれば簡単なので一番オススメの手段ですね。
## ごちゅうい
ちなみにマインクラフトは鯖側の必要スペックが結構高いです。CPUはそうでもないですけど、メモリが。１キャラクターにつき半径Ｒの球内をメモリに展開する必要があって、人が増えるほどそのコストが嵩むからです。僕はマイクラ専用鯖に８ＧＢのＲＡＭを乗せてますが、これで漸く動く感じですね。
## つくりかた
話を戻して。マインクラフト鯖のビルドツールは [ここ](https://hub.spigotmc.org/jenkins/job/BuildTools/) から手に入ります。最新のビルドからBuildTools.jarをダウンロードしてください。もしあなたがLinuxユーザで、gitを含むDevelopment Toolsをインストール済みであるなら、

```sh
java -jar BuildTools.jar
```

でビルドが始まります。ゴミがでるので、新規ディレクトリ内で実行するのが良いと思います。
新たにインストールしたばかりのLinuxではDevelopment Toolsがインストールされていないかもしれないです。CentOSという、RedHat LinuxのクローンOSの最新版（CentOS7）を利用していた場合、コンソール画面で以下のコマンドを入力すればインストール出来ると思います。

```sh
sudo yum groupinstall -y "Development Tools"
sudo yum install -y curl git screen
mkdir ~/bukkit
cd ~/bukkit
curl -O https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar
java -jar BuildTools.jar
cp CraftBukkit/target/craftbukkit*.jar craftbukkit.jar
```

screenとはバックグラウンドでプロセスを起動しておくのに役立つコマンドです。マインクラフトのサーバは起動中にコマンドを入力できたりとインタラクティブな機能があるので（シャットダウンも本来/stopコマンドを入力して行う）、screenを使ってバックグラウンドプロセス化しておけば、必要に迫られたときコマンド入力画面を呼び出すことができるんです。
## きどう
サーバ起動の際は、

```sh
screen -AmdS net java -Djava.net.preferIPv4Stack=true -Xmx7000M -Xms7000M -jar craftbukkit.jar -o true
```

と入力し、画面を呼び出す際は

```sh
screen -r net
```

とすればおっけーです。呼び出した画面から抜け出したいときはCtrl + aのあとCtrl + dを押してください。抜けられます。起動時のオプションの-AmdSは呪文みたいなものだと思ってください。netはscreen名です。好きな名前をつけられます。ところで、今はもうネット対応Javaプログラムは、デフォルトがIPv6のポートで接続待機する形になっちゃってるので、そのままだとIPv4アドレスから接続することができません。これに対応するためのオプションがjavaの後ろ、-Djava.net.preferIPv4Stack=trueで、コレを設定しておくと接続待機ポートにIPv4のポートを使ってくれます。-Xmx7000M, -Xms7000Mはそれぞれ最大メモリと最小メモリです。7GBまで自由に使っていいよって設定してます。とりあえず必要な知識はこんなところかな。
## そのた
プラグインについては [ここ](http://dev.bukkit.org/bukkit-plugins/) にたくさん登録されているので、好きなのを。ちなみに僕はLunaChat, Multiverse-Core, Multiverse-Inventories, Multiverse-Portals, PermissionsBukkit, PluginMetrics, Sentry, TreeAssist, WorldEditを入れてました。
Akka+Scala: Event Streamを使ってメッセージをPub/Subする

Akka Actorでは、`system.eventStream.publish`と`system.eventStream.subscribe`を使うことで、簡単にPublish-Subscriber Modelでメッセージの送受信ができるようになります。お手軽です。

```scala
package playground.actor.example8

import akka.actor._

class Publisher extends Actor with ActorLogging {
  override def receive: Receive = {
    case Publish(message) =>
      log.info("Publish: {}", message)
      // Publishする
      context.system.eventStream.publish(message)
    case any @ _ =>
      log.warning("Unknown message: {}", any)
  }

  override def preStart(): Unit = log.info("Actor is starting")
}

class Subscriber extends Actor with ActorLogging {
  override def receive: Receive = {
    case Text(message) =>
      log.info("Received text: {}", message)
    case Image(filename) =>
      log.info("Received image: {}", filename)
    case any @ _ =>
      log.warning("Unknown message: {}", any)
  }

  override def preStart(): Unit = {
    log.info("Actor is starting")
    // 起動時にSubscribeするメッセージを指定する
    context.system.eventStream.subscribe(self, classOf[Message])
  }

  override def postStop(): Unit = {
    log.info("Actor has stopped")
  }
}

case class Publish(content: Message)

trait Message
case class Text(message: String) extends Message
case class Image(filename: String) extends Message

object EventStream extends App {
  val system = ActorSystem("example")

  val publisher = system.actorOf(Props(classOf[Publisher]), "publisher")
  val subscriber = system.actorOf(Props(classOf[Subscriber]), "subscriber")

  publisher ! Publish(Text("Hello"))
  publisher ! Publish(Image("smile.png"))
  Thread.sleep(10L)

  // Subscriberが死ぬと、PublisherのSubscriberリストから除外される
  subscriber ! PoisonPill
  Thread.sleep(10L)

  // これはSubscriberに届かず、デッドレターにもならない(デッドレターはタイミング次第でなる場合がある)
  publisher ! Publish(Text("Hello again"))
  Thread.sleep(10L)

  system.shutdown()
}
```

実行すると、次のような出力になります。

```
[akka://example/user/publisher] Actor is starting
[akka://example/user/subscriber] Actor is starting
[akka://example/user/publisher] Publish: Text(Hello)
[akka://example/user/subscriber] Received text: Hello
[akka://example/user/publisher] Publish: Image(smile.png)
[akka://example/user/subscriber] Received image: smile.png
[akka://example/user/subscriber] Actor has stopped
[akka://example/user/publisher] Publish: Text(Hello again)
```

こちらのサンプルコードは[suin/scala-playground](https://github.com/suin/scala-playground)をチェックアウトすると試すことが出来ます。

```
git clone https://github.com/suin/scala-playground.git
cd scala-playground
./activator
runMain playground.actor.example8.EventStream
```
EasyMovieTextureのXCodeでのエラーをなおす

まず、CustomVideoPlayer.mmとVideoPlayerPlugin.mmを
Build PhaseのCompile Sourcesで、「-fno-objc-arc」をつけてARCから除外。
次に、CustomVideoPlayer.mmを修正。

```objc:CustomVideoPlayer.mm
AVPlayerStatus status =[[change objectForKey:NSKeyValueChangeNewKey] integerValue];
```

を

```objc:CustomVideoPlayer.mm
AVPlayerStatus status = (AVPlayerStatus)[[change objectForKey:NSKeyValueChangeNewKey] integerValue];
```

にする。

```objc:CustomVideoPlayer.mm
 _lastFrameTimestamp = _curFrameTimestamp;
curTex = CMVideoSampling_SampleBuffer(&_videoSampling, _cmSampleBuffer, (int)_videoSize.width, (int)_videoSize.height);
```

```objc:CustomVideoPlayer.mm
 _lastFrameTimestamp = _curFrameTimestamp;
        size_t w, h;
        w =(int)_videoSize.width;
        h =(int)_videoSize.height;
        curTex = CMVideoSampling_SampleBuffer(&_videoSampling, _cmSampleBuffer, &w, &h);
```

にする。
Mac に Ricty と Ricty Diminished をインストールする

## Ricty

### Ricty とは
Ricty (リクティ) は Linux 環境での研究・開発に適したフリーなプログラミング用 TrueType フォント。  
Inconsolata と Migu 1M を Ricty 生成スクリプトで合成したフォント。 

### FontForge のインストール

#### Command Line Tools for Xcode をインストール及びアップデート

``` terminal
$ xcode-select --install
```

#### MacPorts

``` terminal
$ sudo port install fontforge
```

#### HomeBrew

``` terminal
$ brew install fontforge
```

### Inconsolata のインストール

[Inconsolata](http://levien.com/type/myfonts/inconsolata.html 'Inconsolata')の OpenType file よりインストール。

拡張子.ttf を選択しフォントをインストール。

### Migu 1M のインストール

[M+とIPAの合成フォント](http://mix-mplus-ipa.osdn.jp/migu/ 'M+とIPAの合成フォント')の Migu 1M よりインストール。

拡張子.ttf を選択しフォントをインストール。

### Ricty のインストール

下記のどちらかの方法でインストールを行う。

##### 手動でイントール
[yascentur/Ricty · GitHub](https://github.com/yascentur/Ricty 'yascentur/Ricty')の Download ZIP よりインストール。

##### terminalでインストール
``` terminal
$ git clone https://github.com/yascentur/Ricty.git
$ cd Ricty
$ ./ricty_generator.sh auto
```

拡張子.ttf を選択しフォントをインストール。

## Ricty Diminished

### Ricty Diminished とは
Ricty Diminished (リクティ・ディミニッシュト) は Ricty の姉妹フォントであり、  
Inconsolata と Migu 1M ではなく、Inconsolata と Circle M+ 1m を Ricty 生成スクリプトで合成したフォント。

### Ricty Diminished のインストール

下記のどちらかの方法でインストールを行う。

##### 手動でイントール
[yascentur/RictyDiminished · GitHub](https://github.com/yascentur/RictyDiminished 'yascentur/RictyDiminished')の Download ZIP よりインストール。

##### terminalでインストール
``` terminal
$ git clone https://github.com/yascentur/RictyDiminished.git
```

拡張子.ttf を選択しフォントをインストール。

## 参考サイト

* [yascentur/Ricty · GitHub](https://github.com/yascentur/Ricty 'yascentur/Ricty')
* [yascentur/RictyDiminished · GitHub](https://github.com/yascentur/RictyDiminished 'yascentur/RictyDiminished')
OpenSSLとWgetをsourceからインストールしてみた


普段、yumに頼ってばかりだが、勇気を出してsourceからパッケージをインストールしてみた！！笑
とりあえず、手順とログをまとめます。
エラーうんぬんは、後から確認することに…

-

#1.今回の作業環境
- RHEL6.7（AWS）<br>※ 特別に設定などはせず、デフォルト状態で構築したものを利用

	````
	[ec2-user@ip-xxx-xx-xx-xx ~]$ cat /etc/redhat-release 
Red Hat Enterprise Linux Server release 6.7 (Santiago)
[ec2-user@ip-xxx-xx-xx-xx ~]$ 
	````

- インストールに使用した媒体

	````
	openssl-0.9.8zg.tar.gz
	wget-1.10.2.tar.gz

	````

- 事前にしたこと
	- gccをインストールしました<br>※ OpenSSLのインストールに必要になるため

	````
	[root@ip-172-31-23-100 ~]# rpm -qa | grep gcc
	gcc-4.8.3-9.el7.x86_64
	libgcc-4.8.3-9.el7.x86_64
	[root@ip-172-31-23-100 ~]# 
	````



-


#2.今回の実行コマンド
## 2.1.OpenSSL
### ①ディレクトリの作成

````実行コマンド
# mkdir -p /usr/local/openssl098
````

### ②ファイルの配置＆解凍

````実行コマンド
$ cd /tmp/
$ ll
	★ファイルが存在することを確認
$ tar xvfz ./openssl-0.9.8zg.tar.gz
````

### ③インストール

````実行コマンド
$ cd openssl-0.9.8zg
$ ./config --prefix=/usr/local/openssl098
$ make
$ su
# pwd
# make install

````



## 2.2.Wget
### ①ディレクトリの作成

````実行コマンド
# mkdir -p /usr/local/wget
````


### ②ファイルの配置＆解凍

````実行コマンド
$ cd /tmp/
$ ll
	★ファイルが存在することを確認
$ tar xvfz ./wget-1.10.2.tar.gz
````


### ③インストール

````実行コマンド
$ cd wget-1.10.2
$ ./configure --prefix=/usr/local/wget --with-libssl-prefix=/usr/local/openssl098/lib
$ make
$ su
# pwd
# make install
# rpm -qa | grep open
# exit

````

-

#3.今回の実行結果
正常にインストールでき、Wgetコマンドでファイルをゲット出来た！！


````実行ログ
[root@ip-172-31-23-100 bin]# ./openssl version
OpenSSL 0.9.8zg 11 Jun 2015
[root@ip-172-31-23-100 bin]# 

[root@ip-172-31-23-100 ~]# /usr/local/wget/bin/wget -V
GNU Wget 1.10.2

Copyright (C) 2005 Free Software Foundation, Inc.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

以下は参考訳です。法的には上の英文に従います。

このプログラムは有用と思われますが無保証です。
商業性や特定の目的に合致するかの暗黙の保証もありません。
詳細はGNU一般公用使用許諾をご覧下さい。

Hrvoje Niksic <hniksic@xemacs.org> によって書かれました。

[root@ip-172-31-23-100 ~]# /usr/local/wget/bin/wget http://jmba-tohoku.org/common_img/img_title.png
--06:04:49--  http://jmba-tohoku.org/common_img/img_title.png
           => `img_title.png'
jmba-tohoku.org をDNSに問いあわせています... 60.43.210.59
jmba-tohoku.org|60.43.210.59|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 376,881 (368K) [image/png]

100%[========================================================================================================================================================>] 376,881       --.--K/s             

06:04:49 (3.14 MB/s) - `img_title.png' を保存しました [376881/376881]

[root@ip-172-31-23-100 ~]# 



````
フリー Wi-Fi で Mac をよりセキュアに使う

スタバやホテルなどで WiFi を使うと、たまに共有フォルダが見えていたり、しかも見たらダメそうなファイルが置かれていたりします。

共有フォルダくらいなら都度無効化すればいいかもしれませんが、意外とたくさんのサービスが有効になっています。試しに `netstat -an | grep LISTEN` してみると、意外とポートがオープンになっていると思います。

これらをしらみつぶしに無効化していくのは大変ですし、認証が必要とはいえオープンになっているのはあまり気持ちのいいものではありません。

ところで Mac OS X には OpenBSD 由来の `pf` という高機能なファイアウォールが搭載されています。これを使って Mac に対する攻撃（いたずら）を防ぐ設定をしてみました。

<追記>
WEP などの脆弱性や、AP での盗聴を防ぐため、公衆無線 LAN では VPN は必須であると言われます。しかし VPN を設定していても AP 内の端末同士の通信は無防備なので、適切にコントロールする必要があります。
</追記>

## どのようなルールにするのか

おおまかに以下のようなルールにします。

- インターネットへの通信は許可
- WiFi AP にぶら下がっている他の端末からの通信は拒否
- WiFi AP にぶら下がっている他の端末への通信も拒否


## pf.conf

`/etc/pf.conf` の末尾に以下を追記します。

```
# loopback インターフェースで処理するものは常に許可
set skip on lo0

# DHCP
pass in quick proto udp from port bootps to port bootpc

# DNS
pass quick proto {tcp,udp} from self to port domain keep state

# WiFi 他端末への通信を拒否
block out quick log on en0 from self to en0:network

# 自発のパケットは許可。
# keep state で戻りパケットの許可ルールを動的に作成
pass out all keep state

# in 方向のパケットは全てブロック
block in all
```

# pfctl

反映などの操作は pfctl(1) から行います

- `pfctl -f /etc/pf.conf`: ルールの反映
- `pfctl -nf /etc/pf.conf`: syntax チェック
- `pfctl -d`: pf を無効化する
- `pfctl -e`: pf を有効化する
- `pfctl -sr`: 反映されているルールの確認

## 確認

pf.conf に `log` と記載したルールは tcpdump でそのログを読むことができます。

```
# ifconfig pflog0 create          # 最初の一回だけ
# tcpdump -v -n -e -ttt -i pflog0
```

この状態で他の wifi 端末へ/から ping などを実行してみましょう。ダラダラとログが流れるはずです。