OmniAICreator/Qiita-1.07M huggingface dataset:
java のクラスを scala で継承 (typesafe-activator編)


前回の[javaのクラスをscalaで継承](http://qiita.com/takezo/items/c9c01a3744181eca04d3)では，ビルドツールを使わない説明でしたので，こちらはsafetype-activatorを利用するときの方法

typesafe-activatorの導入と簡単な使用例
--

### 環境
* OS : OS X El Capitan 10.11.5
* package manager : homebrew
* インストール方法 : `brew install typesafe-activator`

### typesafe-activator のコマンド
```sh
# 新規プロジェクト作成など色々 (Webインターフェイス)
activator ui
# テンプレート一覧
activator list-templates
# 新規プロジェクト作成 (コマンドライン)
activator new 
# プロジェクトコンパイル
activator compile
# プロジェクト実行
activator run 
# インタラクティブモード
activator shell
```

テストファイル
--
前回の[javaのクラスをscalaで継承](http://qiita.com/takezo/items/c9c01a3744181eca04d3) で使用した3つのファイルのパッケージを `package com.example`， インポートを `import com.example.<クラス名>`とした

プロジェクト生成
--

```sh
activator new

# Fetching the latest list of templates...
#
# Browse the list of templates: http://lightbend.com/activator/templates
# Choose from these featured templates or enter a template name:
#   1) minimal-akka-java-seed
#   2) minimal-akka-scala-seed
#   3) minimal-java
#   4) minimal-scala
#   5) play-java
#   6) play-scala
# (hit tab to see a list of all templates) ##<= テンプレート番号を入力 (今回は4)
# > 4
# Enter a name for your application (just press enter for 'minimal-scala') ##<= enter を入力
# > 
# OK, application "minimal-scala" is being created using the "minimal-scala" template.
# 
# 以下略

## 上記の3つのファイルをそれぞれ package を意識して， src ディレクトリ以下に適切に配置 ##

tree -L 1 && tree src
# .
# ├── LICENSE
# ├── bin
# ├── build.sbt
# ├── libexec
# ├── project
# ├── src
# └── target
# 
# src
# ├── main
# │   ├── java
# │   │   └── com
# │   │       └── example
# │   │           └── Super.java
# │   └── scala
# │       └── com
# │           └── example
# │               ├── Main.scala
# │               └── Sub.scala
# └── test
#     └── scala
#         └── HelloSpec.scala
```

プロジェクト実行
--
```sh
activator run

# [info] Loading project definition from <path>/minimal-scala/project
# [info] Set current project to minimal-scala (in build file:/<path>/minimal-scala/)
#
# 途中略
#
# background log: info: Running com.example.Main
# background log: info: Hello from A in Super
# background log: info: Hello form B in Sub
# [success] Total time: 1 s, completed Jul 4, 2016 6:17:54 AM
```
2 つの異なる GitHub アカウントの SSH を使い分けたい場合のやり方

# 状況 (仮定)

- いろいろな経緯で 2 つの GitHub アカウントを持っている。
  - それぞれ異なる用途があり、どちらかに統一することができない。
- どちらにも 1 つのマシン上でアクティブに push し続けたい。
  - なるべく意識せずリポジトリ単位でアカウントをスイッチしたい。
- できれば **`git remote -v` で表示されるホストは GitHub 上で見えるものと同じにしたい**

# 方針

- `~/.ssh/config` で各アカウントの別名を定義する。
  - うっかりとメインのアカウントで push する事故を防ぐため別名のない `github.com` は無効化する。
- ローカルリポジトリ毎の gitconfig で `url.<alias>.insteadOf = <target>` で、上で設定した別名を参照するよう定義する。

# 例

ユーザ名は `foo` ユーザと `bar` ユーザになっているので、試したい場合には適宜自分の名前にすると良い。

`foo` ユーザの秘密鍵は `~/.ssh/foo.id_rsa` 、 `bar` ユーザの秘密鍵は `~/.ssh/bar.id_rsa` とする。
それぞれ対応する公開鍵を GitHub のそれぞれのアカウントに登録しておく。

`github.com` に対しては秘密鍵を `/dev/null` を指定した。 (無効化したい意図)

```ssh_config:~/.ssh/config
Host github.com
     IdentityFile /dev/null

Host foo.github.com
    User git
    HostName github.com
    IdentityFile ~/.ssh/foo.id_rsa

Host bar.github.com
    User git
    HostName github.com
    IdentityFile ~/.ssh/bar.id_rsa
```

```console:アカウントfooのリポジトリ
$ git config --add url."ssh://foo.github.com/".insteadOf 'git@github.com:'
```

```console:アカウントbarのリポジトリ
$ git config --add url."ssh://bar.github.com/".insteadOf 'git@github.com:'
```

これらの設定はリモートリポジトリを設定した後に行うようにすれば良い。

# ついでに

アカウントによってユーザ名や連絡先のメールアドレスも変えたいことは多々あると思う。 (変えないで `--global` で設定しているとコミット時のユーザ名が結局同じになってしまう。)
あらかじめ上のような操作をするスクリプトを用意しておけば、手間はかからなくなる。
(GPG など諸々もついでに設定してしまおう。)

```bash:~/.bin/git-config-foo
#!/usr/bin/env bash

set -eu
USERNAME='foo'
EMAIL='foo@example.com'
SSH_ALIAS='ssh://foo.github.com/'
GPG_KEY='XXXXX'

upsert_config(){
  local key="$1"
  local val="$2"
  if git config --get "$key" >/dev/null 2>&1 ; then
    git config --replace "$key" "$val"
  else
    git config --add "$key" "$val"
  fi
}

upsert_config user.name "$USERNAME"
upsert_config user.email "$EMAIL"
upsert_config url."$SSH_ALIAS".insteadOf 'git@github.com:'

# ↓ GPG の設定が必要な場合はアンコメントアウト
# upsert_config user.signingkey "$GPG_KEY"
# upsert_config gpg.program 'gpg1'
# upsert_config commit.gpgsign true
```

## さらに

何度もこれを実行する予定があるなら `git config-foo` みたいに呼べるともっと楽だ。
先ほどのスクリプトを適当なパス (自分の場合は `~/.bin/git-config-foo` ) に設置して、 `chmod +x` で実行権限を付与し

```console
$ git config --global alias.config-foo '!~/.bin/git-config-foo'
```

のようにエイリアスを設定すると良い。

そうすれば

```console
$ git config-foo
```

のように実行できるようになる。

# 他

- もちろん同じやり方で 2 つ以上も使い分けできる。
- 同じようなやり方で Bitbucket 等なども使い分けることが可能。
- 本来は例示につかうアカウント名は、例示に使うことが保証されたアカウントにしたかったが、分からなかった。 (example.com みたいに)
java のクラスを scala で継承


scala で java のクラスを継承するときに気をつけること

* package と import, コンパイル時のクラスパス
* java 側のクラスと scala 側のクラスのコンストラクタ引数の一致 

以下のようなディレクトリ構造，ファイルで検証

```zsh
tree
# => 現在のディレクトリ構造
# .
# ├── class
# ├── lib
# │   ├── java
# │   │   └── Super.java
# │   └── scala
# │       └── Sub.scala
# └── src
#     └── Main.scala
# 
# 5 directories, 3 files
```

```./lib/java/Super.java
package lib.java;

public class Super {
  private String name;

  public Super(final String name) { this.name = name; }

  public String getName() { return this.name;  }
  public String greet() { return "Hello from " + this.getName() + " in Super"; }
}
```

```./lib/scala/Sub.scala
package lib.scala

import lib.java.Super

final class Sub(val name :String) extends Super(name :String) {
  override def greet() :String = "Hello form " + this.getName + " in Sub"
}
```

```./src/Main.scala
import lib.java.Super
import lib.scala.Sub

object Main {
  def main(args: Array[String]) {
    val a :Super = new Super("A")
    val b :Sub   = new Sub("B")

    println(a.greet)
    println(b.greet)
  }
}
```


package と import, コンパイル時のクラスパス
--
コンパイルすると package に記述したディレクトリ構造でクラスファイルが生成される. 
また，import するクラスが存在するソースをコンパイルする時は，適切にクラスパスを指定する必要がある．
libファイルやsrcファイルなど存在するディレクトリが異なる依存関係の時は，javac, scalac のコマンドオプションを使えばきれいに解決．

```
-classpath <path> : ユーザのクラスファイルを <path> から探索
-d <directory>    : 生成したクラスファイルを置くディレクトリを <directory>  に設定
```

java 側のクラスと scala 側のクラスのコンストラクタ引数の一致
--
引数が上記の `./lib/scala/Sub.scala` のように一致していないとコンパイル時にエラー

```zsh
# scalac ./lib/scala/Sub.scala

# final class Sub extends Super の時

<path>/lib/scala/Sub.scala:5: error: not enough arguments for constructor Super: (x$1: String)lib.java.Super.
Unspecified value parameter x$1.
final class Sub(val name :String) extends Super {
                                          ^
one error found

# final class Sub extends Super(name :String)　の時

<path>/lib/scala/Sub.scala:5: error: not found: value name
final class Sub extends Super(name :String) {
                              ^
one error found
```

コンパイル＆実行
--
```zsh
root=`pwd`

# 依存順にコンパイル
javac -d ${root}/class ${root}/lib/java/Super.java &&
scalac -classpath ${root}/class -d ${root}/class ${root}/lib/scala/Sub.scala &&
scalac -classpath ${root}/class -d ${root}/class ${root}/src/Main.scala

tree
# .
# ├── class
# │   ├── Main$.class
# │   ├── Main.class
# │   └── lib
# │       ├── java
# │       │   └── Super.class
# │       └── scala
# │           └── Sub.class
# ├── lib
# │   ├── java
# │   │   └── Super.java
# │   └── scala
# │       └── Sub.scala
# └── src
#     └── Main.scala
# 
# 8 directories, 7 files


scala -classpath ${root}/class Main
# Hello from A in Super
# Hello form B in Sub
```

余談
--
~~手動ビルドだったので，sbt やら typesafe-activator を用いてやる方法もそのうち．~~
[java のクラスを scala で継承 (typesafe-activator編)](http://qiita.com/takezo/items/be8c26d4f4d4df1e3a43) をあげました
Macに形態素解析エンジンMeCabをインストール

#環境
 - OS X El Capitan
 - iMac (21.5-inch, Mid 2011)
 - python2系

#用意するもの
 - mecab-0.996.tar.gz
 - mecab-ipadic-2.7.0-20070801.tar
 - mecab-python-0.996.tar (pythonからｍecabを使いたい方のみ)

ダウンロード元：[MeCab: Yet Another Part-of-Speech and Morphological Analyzer](http://taku910.github.io/mecab/#download)


#MeCabのインストール
 - インストール先(任意)：/opt/local/
 - mecab-0.996.tar.gzを予め解凍すること

```
$cd mecab-0.996
$./configure --enable-utf8-only --prefix=/opt/local/
$make
$sudo make install
```

#IPA辞書のインストール
 - インストール先(任意)：/opt/local/
 - mecab-ipadic-2.7.0-20070801.tarを予め解凍すること

```
$cd mecab-ipadic-2.7.0-20070801
$./configure --with-charset=utf8 --prefix=/opt/local/
$make
$sudo make install
```

#mecabコマンドの確認
`mecab`コマンドを叩く

```
$mecab
すもももももももものうち
すもも	名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も	助詞,係助詞,*,*,*,*,も,モ,モ
もも	名詞,一般,*,*,*,*,もも,モモ,モモ
も	助詞,係助詞,*,*,*,*,も,モ,モ
もも	名詞,一般,*,*,*,*,もも,モモ,モモ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
うち	名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
EOS
```

#mecab-pythonのインストール
 - インストール先(任意)：/opt/local/
 - mecab-python-0.996.tarを予め解凍すること

```
$cd mecab-python-0.996
$python setup.py build
$sudo python setup.py install --prefix=/opt/local
```


#mecab-pythonの動作確認
./mecab-python-0.996/以下の`test.py`を実行する。

```
$python test.py
0.996
太郎	名詞,固有名詞,人名,名,*,*,太郎,タロウ,タロー
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
この	連体詞,*,*,*,*,*,この,コノ,コノ
本	名詞,一般,*,*,*,*,本,ホン,ホン
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
二	名詞,数,*,*,*,*,二,ニ,ニ
郎	名詞,一般,*,*,*,*,郎,ロウ,ロー
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
見	動詞,自立,*,*,一段,連用形,見る,ミ,ミ
た	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
女性	名詞,一般,*,*,*,*,女性,ジョセイ,ジョセイ
に	助詞,格助詞,一般,*,*,*,に,ニ,ニ
渡し	動詞,自立,*,*,五段・サ行,連用形,渡す,ワタシ,ワタシ
た	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。	記号,句点,*,*,*,*,。,。,。
EOS

 	BOS/EOS,*,*,*,*,*,*,*,*
太郎 	名詞,固有名詞,人名,名,*,*,太郎,タロウ,タロー
は 	助詞,係助詞,*,*,*,*,は,ハ,ワ
この 	連体詞,*,*,*,*,*,この,コノ,コノ
本 	名詞,一般,*,*,*,*,本,ホン,ホン
を 	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
二 	名詞,数,*,*,*,*,二,ニ,ニ
郎 	名詞,一般,*,*,*,*,郎,ロウ,ロー
を 	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
見 	動詞,自立,*,*,一段,連用形,見る,ミ,ミ
た 	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
女性 	名詞,一般,*,*,*,*,女性,ジョセイ,ジョセイ
に 	助詞,格助詞,一般,*,*,*,に,ニ,ニ
渡し 	動詞,自立,*,*,五段・サ行,連用形,渡す,ワタシ,ワタシ
た 	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。 	記号,句点,*,*,*,*,。,。,。
 	BOS/EOS,*,*,*,*,*,*,*,*
EOS
EOS
filename: /opt/local/lib/mecab/dic/ipadic/sys.dic
charset: utf8
size: 392126
type: 0
lsize: 1316
rsize: 1316
version: 102
mecab-python-0.996
```


#参考ページ
 - [Mecabのインストールメモ](http://qiita.com/ShingoOikawa/items/175be8a472ec8ed8a707)
awkでcsvに任意の列を追加する

#例
あああ,いいい,ううう,えええ,かかか,ききき

「えええ」と「かかか」の間に「おおお」を追加したい。
＝awkで$4の後に「,おおお」を追加すればOK

####コード
```
echo "あああ,いいい,ううう,えええ,かかか,ききき" |
awk -F, 'BEGIN{OFS=","}{$4=$4",おおお";print}'
```

####結果
```
$ echo "あああ,いいい,ううう,えええ,かかか,ききき" | awk -F, 'BEGIN{OFS=","}{$4=$4",おおお";print}'

あああ,いいい,ううう,えええ,おおお,かかか,ききき
```


# 2018年8月更新：↑こんな方法を使ってはいけない
たまにアクセスがあるようなので更新します…
上記のように投稿していたのですが、CSVをawkで更新するのは__筋が悪い__のでやめましょう。

確かにawkで「-F,」または「FS=","」を指定すると、カンマ区切りのテキストを扱えるようになります。
しかし、単純にカンマで区切るとまずい場合（例えば、ダブルクオーテーションの中にカンマが存在する場合や、改行が含まれる場合）が結構あります。

そういう「まずい場合」が含まれないことが保証されていればよいですが、
現代でcsvを扱う人間はそんな保証が受けられないことが大半です。

### UNIXでCSVを扱うコマンドはないの？
「csvを手軽にUNIXコマンドで操作したい」と思ってこの記事にたどり着いたのかと思いますが、
csvを仕様通りに正確にパースしてくれる（csvの構造を適切に認識してくれる）コマンドは
あまり多く存在しませんし、「これ」といった決定版はありません。

csvを操作するための「csvawk」というコマンドがあればいいのですが、ありません。
※あるにはあるのですが、pythonやPerlで実装されており、速度面で現実的ではありません。
現代のCSVは数GBあることが普通なので…扱うデータが軽いなら使ってみてください。

### UNIXでCSVを扱うコマンドはないの？→ある
私の__強い__おすすめは、NYSOL(MCMD)（ https://github.com/nysol/mcmd/wiki ）です。
このコマンド、全く有名じゃなくて寂しいのですが、
csvを完璧に扱うことができ、しかもとても高速に動作します。GB単位のcsvでも余裕です。
列の抜き出しや集計、ソート、列同士の計算、__列の追加__など、基本的なことを高速に行えます。
SASやSPSSを回したり、BigQueryのようなデータベースに突っ込んだりする必要がなくなります。

カラムの指定方法が「f=column1,column2」など、「f=」を付ける必要があったり、
その他パラメーターの指定方法がUNIXの標準的な仕様と合ってないのは悲しいのですが、
ビジネスでも使える有用なコマンドです。ぜひ使ってみてください。
（回し者ではありません）
グリッドトレード戦略でFXシステムトレード

http://qiita.com/ryo_grid/items/a3163ac50806f8494a53
の続きといえば続き。

友人がシストレしていた戦略を真似してコード化してみた。
戦略は以下。

- 決められた価格範囲の決められたpips間隔でポジションが無ければ買っていく(プログラムの都合上かならずしもその間隔ぴったりにはならないが)
- 持っているポジションで一定以上の利益の出ているものがあれば利確
- 要は決められた価格範囲内で、相場が下落したら無限ナンピンするような感じ
- シミュレーションはUSDJPYでやった。もちろん他の通貨でも利用可能。
- レンジ相場や相場が上昇している局面(円高進行)だと勝てるが、円安が進み、さらに定めた価格範囲を超えて進行すると死ぬ
- http://jp.dynamictrade.eu/forex-grid-trading

コードは以下。
https://github.com/ryogrid/fx_systrade/blob/2d247480a02ba6546edbc393c318eaf5f720dc9d/trap_repeat_trade.py

八年間ぐらい動かすと、160%ぐらいまで増える (ただし別途含み損もあり)。元手は50万。
一番右がその時点で保持しているポジションの評価損益と証拠金を反映する前の資産、右から2番目が1番目に先述の評価損益を反映させて、併せて、使用している証拠金を減算したもの(FX口座で言えばいつでも引き出せるお金に相当)。右から3番目が使用している証拠金。設定レンジは80円-120円で1円間隔。レバレッジは25倍。購入通貨単位は1000通貨固定(なので複利は効いていない)。やってることの性質上、レンジ内に収まっていて、かつ減少し続けていない相場であれば、安定して勝てるみたい。手仕舞いしにくいのは課題だけれど。
>(省略)
2008-12-19 13:10:00 89.47 105470.8 294059.2 799925.0
2008-12-19 20:10:00 89.34 105470.8 291124.2 800240.0
2008-12-23 09:50:00 90.32 101870.8 319224.2 800545.0
2008-12-23 22:35:00 90.35 101870.8 320269.2 800870.0
2008-12-30 04:10:00 90.39 101870.8 321534.2 801175.0

■追記（2016.07.31）
ここ最近の一か月間で試すとUSDJPYがずっと下落していて死ぬが、同時に売りポジ保有のEURJPYを回すようにしたら良い感じのパフォーマンスが得られるようになった。
https://github.com/ryogrid/fx_systrade/blob/bf63ae88f12e84eae9a8d2b71d8aff3021248181/trap_repeat_trade_double.py

■追記（2016.08.28）
OANDAのリアル口座で動くようにした。
なお、5通貨でロング、ショートを割り振って同時並行に動作するようになっている。
https://github.com/ryogrid/fx_systrade/blob/master/trap_repeat_trade_oanda.py
家のポストに郵便物が届いたら通知するBot作ってみた(ブレッドボードでの動作確認まで)

***まだ書き途中というか作り途中です***
# 使うもの
- Arduino 好きなもの * 1 (Uno と Pro mini を使いました)
- さくらIoTのアルファ版 * 1
- マイクロスイッチ
- 抵抗47kΩ * 2, 1kΩ * 1

# 作業
最近 arduino を触り始めたばかりの自分でも
さくらIoTの[チュートリアル通り](https://github.com/sakura-internet/SakuraIoTAlphaDocs/blob/master/tutorial.md)で基本迷わないです。

- サンプル通りに配線してプログラムを動かすと「連携サービス」の詳細画面にログ様のものが増えていきます。
- 参考にしてこちらのやりたい内容で実装。 [Postman](https://github.com/HiromiShikata/Postman) サンプルより短くなった
![20160704_012231.jpg](https://qiita-image-store.s3.amazonaws.com/0/40230/25837517-4054-d7ea-cb16-08c55424101e.jpeg)
- 今日はブレッドボードまで。
- あとははんだづけしてサーバーのアプリを作って完成


# 経緯
以前申し込んでいたさくらIoTのアルファ版が届きました。
せっかく通信が3Gなので、我が家のWifiが届かないところにあるうちのポストから通知をもらいます。
前から欲しかった、郵便物が届いたら通知するBotです。

ポストの確認が面倒で1週間くらい急ぎの郵便物を放置してしまった反省から毎日のぞくようにしているのですが、
感覚値で半分くらいは空振って残念な気分になるのでその対策です。

通知はメールです。
いろんなプロジェクトでいろんなチャットツールをめぐってどれも常にそれぞれの仕様があってそれぞれ確認しないといけない状況に陥り、
最終的に一番自由なのはメールだと思ったのでこれで。

# 仕様
- スイッチをポストの蓋で抑えておいて、蓋が離れたら郵便物が入ったとみなす
- 郵便物が入ったら固定のメールアドレスに固定値を送信
- 一度蓋が離れたら数秒 delay する
- 電池は多分すごく食うけどあまりチューニングしないで一旦大容量電池で頑張ってみる


# 躓いた所
よくわかってない初心者の私が躓いたところを...
本当によくわかってないので変なところをご指摘いただけたらありがたいです。

- 管理画面上のステータスがなかなかオンラインにならない
    - 5分くらいと書いてあるのに10分くらいでもダメ
    - 電源抜いて再度試してもダメ
    - arduinoからとった電源が4v位だったので直接5vとってみてもダメ
    - 結局アンテナをつけていないことが原因でした。(初心者具合に泣けます)
    - アンテナを繋いだら数分でオンラインになりました
    - ![20160703_220943.jpg](https://qiita-image-store.s3.amazonaws.com/0/40230/23002e0c-1b76-3f42-1359-7891ac667b9a.jpeg)
    - [クラスメソッドさんの記事](http://dev.classmethod.jp/hardware/sakura-iot-ataglance/)見ると、「CN2」の所につけてあったので真似しました

- 4.7kΩの抵抗がない
    - 良いのかわからないけど、5.1kΩがあったのでそれを使いました。
- どうもサンプルの「if ( sakura.getNetworkStatus() == 1 ) break;」で落ちてる
    - 最初抵抗を付け忘れ、次抵抗経由でGNDに繋いでしまってました。
    - GNDでなく5vに繋ぎ直して正常に
Macでバックスラッシュを入力する


ターミナルとかだとキーボードの¥だけでいけるが、\を入力したいとき。
Kobitoで投稿用に編集しているときに使用したのでメモ。


## 環境
MacBook Proの標準キーボード
<br/>

## 入力方法
MacBookProでバックスラッシュを入力するには、、、
	// \
	option + ¥

で入力できる。
<br/>
## 参考
下記の記事を参考にさせていただきました。
http://qiita.com/miyohide/items/6cb8967282d4b2db0f61
PostgreSQL 基本コマンド忘備録(createdb ~ psql ~テーブル作成)


基本的なコマンドをメモ。

## DBの作成
	// shouhinn というDBを生成 エンコードにutf-8を指定
	createdb shouhinn -E utf-8

## DBの削除
	dropdb shouhinn

## PostgreSQLへの接続
	// shouhinnというDBに接続する
	psql shouhinn

## PostgreSQLからの切断
	// DBを切断する
	\q

## テーブルを作成する
	// uriage テーブルを作成
	create table uriage

## テーブル名を変更する
	alter table uriage rename to myuriage
	
## テーブルの削除
	drop table uriage
（書きかけ）Ruby+SinatraでWebアプリを作る

#何の記事？
Ruby + SinatraでWebアプリを作ります。


#Sinatraってなに？
Rubyの軽量Webアプリケーションフレームワークです。

#対象読者
Sinatraってどんなかんじって人？
RubyでWebアプリ作りたいけどなんかいいFWあるって人？

#環境
* Windows 10 x64
* Ruby 2.2.4p230 x64
* Google Chrome

Rubyはインストール済みかつパスを通してあるものとします。

#Sinatraのインストール

コマンドプロンプトからgemをインストールします。

`gem install sinatra`
`gem install sinatra-reloader`

`sinatra-reloader`はアプリをホットスワップするためのgemです。

#Webアプリの作成

プロジェクトのディレクトリ構成は以下のようにします。

root/
 ┠ views/
 ┠ public/
 ┗ app.rb

以下のコードを作成します。

```ruby:app.rb
require 'sinatra'
require 'sinatra/reloader'
```

#Viewの作成

ビューは.erb形式で記述することができます。
views以下に配置します。
とりあえずトップ画面を作成してみましょう。

```erb:views/top.erb
<!DOCTYPE html>
<html>
  <body>
    <h1>top</h1>
    <span>this is top.</span><br>
    <span><%= @message %></span>
  </body>
</html>
```

app.rbに以下の記述を追加します。
これでトップ画面が見れるようになります。

```ruby
get '/top' do
  @message = "hello sinatra!"
  erb :top
end
```

この状態でブラウザから localhost:4567/top にアクセスすると先ほど作成したトップ画面が表示されます。
もしapp.rbを編集しても、sinatra/reloaderをインストールしてrequireしているため、アプリを再起動する必要はありません。


# formを使う

※書きかけです。

# ajaxを使う

※書きかけです。
カラムを結合するembulk-filter-concatを作った。

Embulkの勉強がてらに、filter pluginを作ってみた。
https://github.com/toru-takahashi/embulk-filter-concat

# 目的

たまにむかーし作ったデータベースなどであるのが、日付と時刻が別なカラムに入っているというものだ。
これがCSVでログとして残っていて、あとからどこかのDBに入れたいとかというときがある。
そのときに、これらをtimestampとして一つのカラムにして扱いたい。

embulk-filter-concatはこういうときのために利用する。
concatとはSQLであるconcat関数と似たようなものになっていて、複数のカラム＋結合子を指定して、新しいカラムとして追加する。


# 利用方法

インストールは、

```
embulk gem install embulk-filter-concat
```

入力データが下記のようになっているとする。

``` input.csv
date,time,id
2015-07-13,00:00:00,0
2015-07-13,00:00:00,1
2015-07-13,00:00:00,2
```

このとき、dateとtimeが別カラムなので、結合してから出力したい。

```example.yml
in:
  type: file
  path_prefix: ./input.csv
  parser:
    charset: UTF-8
    newline: CRLF
    type: csv
    delimiter: ','
    quote: '"'
    escape: '"'
    trim_if_not_quoted: false
    skip_header_lines: 1
    allow_extra_columns: false
    allow_optional_columns: false
    columns:
    - {name: date, type: string}
    - {name: time, type: string}
    - {name: id, type: long}
filters:
- type: concat
  name: datetime
  columns:
  - {name: date}
  - {name: time}
out: {type: stdout}
```

filtersにconcatを登録し、結合後の名前をnameで設定する。
columnsで登録されたnameのカラムを結合する。ここでは指定した順に結合されるようになっている。

また、上記では書いていないが、delimiterというオプションもあり、これを利用することで結合子を指定できる。デフォルトでは" "（半角スペースになっている）

上記の設定ファイルで実行すると、最後にカラムが追加されて二つの値が結合できていることがわかる。

```
$ embulk run example.yml
2016-07-04 01:25:04.184 +0900: Embulk v0.8.9
2016-07-04 01:25:05.995 +0900 [INFO] (0001:transaction): Loaded plugin embulk-filter-concat (0.1.0)
2016-07-04 01:25:06.045 +0900 [INFO] (0001:transaction): Listing local files at directory '.' filtering filename by prefix 'input.csv'
2016-07-04 01:25:06.052 +0900 [INFO] (0001:transaction): Loading files [input.csv]
2016-07-04 01:25:06.172 +0900 [INFO] (0001:transaction): Using local thread executor with max_threads=8 / output tasks 4 = input tasks 1 * 4
2016-07-04 01:25:06.183 +0900 [INFO] (0001:transaction): {done:  0 / 1, running: 0}
2015-07-13,00:00:00,0,2015-07-13 00:00:00
2015-07-13,00:00:00,1,2015-07-13 00:00:00
2015-07-13,00:00:00,2,2015-07-13 00:00:00
2016-07-04 01:25:06.290 +0900 [INFO] (0001:transaction): {done:  1 / 1, running: 0}
2016-07-04 01:25:06.295 +0900 [INFO] (main): Committed.
2016-07-04 01:25:06.295 +0900 [INFO] (main): Next config diff: {"in":{"last_path":"input.csv"},"out":{}}
```

制限としては、timestamp型とjson型には対応してないので、注意が必要。

## まとめ。

concatっぽいpluginを作った。
EmbulkのJava pluginを作るのはまだちょっと大変なきがする。
RustでC++のiostreamみたいなものを作ってHello worldしてみた

初投稿です。

稚拙ながら、Rustで演算子オーバーロードの習作としてC++のiostreamを模倣してみました。
iostreamをRustに移植するのが目的ではないので、標準出力のみの実装となっています。

https://gist.github.com/tamamu/7ec2242d95a81990be129cd9ed7bcdc9

```rust:helloworld.rs
use std::ops::Shl;

struct Rsout;
struct Endl;

impl<'a> Shl<&'a str> for Rsout {
    type Output = Rsout;

    fn shl(self, _rhs: &'a str) -> Rsout {
        print!("{}", _rhs);
        self
    }
}

impl Shl<i32> for Rsout {
    type Output = Rsout;

    fn shl(self, _rhs: i32) -> Rsout {
        print!("{}", _rhs);
        self
    }
}

impl Shl<Endl> for Rsout {
    type Output = Rsout;

    fn shl(self, _rhs: Endl) -> Rsout {
        print!("\n");
        self
    }
}


fn main() {
    Rsout << "Hello, " << "world!" << Endl;
    Rsout << "1 + 2 = " << 1 + 2 << Endl;
}
```

ちなみにC++で書いた同じプログラムがこちら。

```cpp:helloworld.cpp
#include <iostream>

using namespace std;
 
int main()
{
    cout << "Hello, " << "world!" << endl;
    cout << "1 + 2 = " << 1 + 2 << endl;
}
```

まだライフタイムの部分の書き方がよく分かっていないため、&str型の実装に時間をかけてしまいました……。
概念は理解出来ていると思うのですが、やはり量を書かないと慣れませんね。


Rustでの演算子オーバーロードのやり方については以下を参考にしました。
[The book - Operators and Overloading](https://doc.rust-lang.org/book/operators-and-overloading.html)
ライフタイムについては以下を参考にしました。
[The book - Lifetimes](https://doc.rust-lang.org/book/lifetimes.html)
SAP Business Intelligence をコマンドラインから操作する

# はじめに
SAP Business Objects Business Intelligence(BI) はエンタープライズの現場では非常によく使われている（らしい）BI 製品です。私の現場では SAP BI の管理作業に GUI(web) を使うことが多く、運用フェーズにおける繁忙期には作業負荷が高いように感じています。GUI が悪いというわけではなく（あまり実施しない作業をするときには直観的で便利だと思います）、運用フェーズにおける定型作業の場合はゴテゴテ装飾されたインターフェースはあまりにも冗長です。作業記録をエクセルにペタペタ残すのも手間がかかります。そこで、コマンドラインから SAP BI を操作することができれば作業負荷の軽減につながるのではないかと考えて、そのような方法がないか調査しました。
その結果、SAP BI は、少なくとも BI4 以降で REST API を公開していることが判りました。REST API は、HTTP を使った標準的なインターフェースであり、Powershell 3.0 以上では REST API を扱うためのコマンドレット `Invoke-RestMethod` が用意されています。
この記事では、Powershell の `Invoke-RestMethod` から SAP BI の REST API を利用し、Business Objects ユーザの作成・削除する手順をまとめます。

# 注意
筆者は SAP 製品の有識者ではありません。１ユーザ（運用管理者）として作業負荷を軽減する方法を検討しているところです。誤った理解があればご指摘頂きたく、、、
また、個人的な調査であるため検証環境が用意できませんでした。従って以下のコマンドは未検証です。

# REST API について(前提知識)
標準的な技術であるため、詳細な解説は別の記事に譲ります。簡単には、決まった URI に対して HTTP リクエストを投げるという操作だけで、データの作成(Create)、取得(Read)、更新(Update)、削除(Delete)という操作を実現できる技術です。これらの操作は HTTP の GET, POST, PUT, DELETE メソッドとそれぞれ対応します(以下の表を参照)。

データの操作 | HTTP メソッド
-----|------
作成 | POST
取得 | GET
更新 | PUT
削除 | DELETE

Powershell の `Invoke-RestMethod` は HTTP リクエストを作成して URI に投げるコマンドレットです。

# 手順

```ps1
# ベースURLの定義(biprws = business intelligence platform restfull web service)
$baseURL = "http://localhost:6405/biprws"

# HTTP リクエストヘッダの作成
$header = @{}
$header["Accept"] = "application/json" # 受け取るメディアタイプ
$header["Content-Type"] = "application/json" # 送信するメディアタイプ

# HTTP リクエストボディの作成(認証情報)
$body = @{}
$body["userName"] = "Administrator"
$body["passWord"] = "pass1"
$body["authType"] = "secEnterprise"
$body = ConvertTo-Json $body # JSON(テキスト)形式に変換する

# HTTP リクエスト実行（ログオントークンの取得）
$response = Invoke-RestMethod -Method POST -Uri "${baseURL}/logon/long" -Headers $header -Body $body
$token = $response.logonToken
$header["X-SAP-Logontoken"] = $token # ログオントークンをヘッダに入れておくと以降は認証された状態で通信できる

# HTTP リクエストボディの作成（ユーザ情報）
$body = @{}
$body["isPasswordToChangeAtNextLogon"] = true
$body["isPasswordChangeAllowed"] = true
$body["fullName"] = "hoge fuga"
$body["newPassword"] = "pass1"
$body["connection"] = 0
$body["isPasswordExpiryAllowed"] = true
$body["title"] = "UserID"
$body = ConvertTo-Json $body

# ユーザの作成（レスポンスは作成したユーザエントリ）
$response = Invoke-RestMethod -Method POST -Uri "${baseURL}/users/usr" -Headers $header -Body $body
$userID = $response.entries.id

# ユーザの削除
Invoke-RestMethod -Method DELETE -Uri "${baseURL}/users/$userID" -Headers $header

# ログオフ（ログオントークンが破棄される）
Invoke-RestMethod -Method POST -Uri "${baseURL}/logoff" -Headers $header
```

# おわりに
なんか簡単っぽいです（適当）。完全なリファレンスは SAP の ID がないと参照できないようなので、後ほど取得してみようと思います。よくある作業としては「ユーザ作成」「グループ登録」「ユーザ削除」「パスワード初期化」があるので、全てコマンドから操作できれば実際に導入できると思います。「グループ離脱」もできると完璧かと。
定型作業を手作業でやるのリスクしかないので最終的には全てジョブ化したい。
AWS Lambda を使って LINE ボット「ランボー３」を作ろうじゃないか

## 概要
2016/04/07 に LINE の 「BOT API Trial Account」 が無償提供開始。
AWS Lambda で LINE ボット (オウム返し) を作成する。
参照する from を間違えやすいので、注意のこと。

## はじめに
以前、Lambda で Slack ボット 「ランボー」を作成しました。

 - [AWS Lambda を使って Slack ボット (命名: Lambot [ランボー]) を低予算で作ろうじゃないか](http://qiita.com/exabugs/items/e868df55333d0805acb2)
 - [AWS Lambdaで 形態素解析 できる賢いSlackボットを低予算で作ろうじゃないか (2)](http://qiita.com/exabugs/items/f399451fd14ded21f777)

LINE でも API が公開されたとのことで、「ランボー３」を作ろうじゃないか、という主旨です。



## LINE

以下の手順で、ご自身の LINE アカウントで developer 登録をします。

#### 登録方法
 1. https://developers.line.me/ にアクセス
 1. 右上のChannelsをクリックし、ご自身の LINE アカウントでログイン
 1. Channel ID、Channel Secret、MID が取れていることを確認する




## AWS Lambda

Lambda コードは以下になります。


 - 先頭3行の // Your ID は、適宜、ご自身の ID に置き換えてください。
 - to に from の値を設定するのですが、ここが一番の LINE ボット のハマりどころです。  
   引数で渡されてくるjsonオブジェクトの、外側と内側の2箇所に from があるのですが、【内側 (content) の from が正解】 です。それを to に設定して下さい。
 - toChannel, eventType は指定されていますので変更しないで下さい!!!。詳細はドキュメント参照してください。
 - LINE からの コールバック は Application/json 形式なので、Slack の時のような面倒な フォーム→json 変換は不要です。  
 (API Gatewary で POST を受けて、Lambda に流してやるだけで OK です。)
 - ~~いい忘れてましたが、モジュール (request) を使うので、npm install した後、全体を zip してから Lambda にアップロードして下さい。~~ Lamba でインライン編集できるように、request モジュールを使わないように変更しました。

API ドキュメントはこちら
https://developers.line.me/bot-api/api-reference

```js:index.js
'use strict';

var ChannelID = 1470000000; // Your ID
var ChannelSecret = "def889cei00000000000000000000000000000"; // Your ID
var MID = "u0e0450000000000000000000"; // Your ID


var https = require('https');

function send(data, callback) {
  var body = JSON.stringify(data);

  var req = https.request({
    hostname: "trialbot-api.line.me",
    port: 443,
    path: "/v1/events",
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      "Content-Length": Buffer.byteLength(body),
      'X-Line-ChannelID': ChannelID,
      'X-Line-ChannelSecret': ChannelSecret,
      'X-Line-Trusted-User-With-ACL': MID
    }
  });

  req.end(body, function (err) {
    err && console.log(err);
    callback(err);
  });
}

exports.handler = function (event, context, callback) {
  var result = event.result && event.result[0];
  if (result) {
    var content = result.content || {};
    var message = {
      "to": [content.from],
      "toChannel": 1383378250, // 1383378250 Fixed value
      "eventType": "138311608800106203", // “138311608800106203” Fixed value.
      "content": {
        "contentType": 1,
        "toType": 1,
        "text": content.text
      }
    };
    send(message, function () {
      callback();
    });
  } else {
    callback();
  }
};
```

GitHub はこちら
https://github.com/exabugs/Lambot-Line/blob/master/index.js

## 完成

![IMG_27492.png](https://qiita-image-store.s3.amazonaws.com/0/69410/a8711768-b62b-9f97-274e-0407afc96f3f.png)


## おわりに

 - LINE は API 公開が遅い。期を逃した感がありますね。
 - Slack ボット はチャネルを相手にするのに対して、LINE ボット は基本的には一人を相手にする感じですね。その点で、LINE は物足りなさを感じます。
 - API そのものも、使いやすいとは言えない感じ。う〜ん、どうでしょう。
 - エラーコード酷いです。「500 内部エラー」 はさっぱりわかりませんでした。
 - まだ、プレビューですもんね。正式公開までには、きっと良くなると思います。
 - 動画やスタンプを送ったり受けたり出来るようですが、また次回。
プログラマしぐさ

プログラミング全般のお作法や良いプラクティスについての本、たくさん出ていた気がしたので整理してみました。

3ヶ月の研修を終えて新人さんが現場に配属、という会社もみられる時期でしょうが
あえて先輩各位向け。 (というか自分向け)


# プログラミング作法の本
ざっくり書籍と扱っている領域の一覧です (Amazon/出版社ページの説明や目次をまとめただけ)

| 書籍 | 出版年 |  設計 | コーディング | 品質 | テスト | サンプルコード |
|:-----|:-------|:------|:-------------|:-----|:-------|:---------------|
| Code Complete 第2版 上 | 2005年 | ✔ | ✔ |    |    | C++、C#、Java、Visual Basicなど  |
| Code Complete 第2版 下 | 2005年 |    |    | ✔ | ✔ | C++、C#、Java、Visual Basicなど  |
| クリーンコード   | 2009年 |    | ✔ |    | ✔ |    |
| リーダブルコード | 2012年 |    | ✔ |    | ✔ |    |

改めて見るとあれ～そんなたくさん出てなかったのか…？ という感想です。
カバー範囲は Code Complete は広くコーディング作法を超えて全般で、
クリーンコード・リーダブルコードがコーディングについてより細かくフォローしている感じでしょうか。


# 番外編
コーディングについての本だと思って確認してみたら「あ、違ったんだ…」という本です。
別ジャンルでの良書ということで。

| 書籍 | 出版年 | 説明 |
|:--|:--|:--|
| クリーンコーダー                     | 2012年 | プログラムではなくプログラマを扱った書籍 |
| コーディングを支える技術             | 2013年 | コーディング作法ではなく、プログラム言語を理解するための書籍 |
| ビューティフルコード                 | 2008年 | プログラミング作法ではなくエッセイ集 |
| ビューティフルアーキテクチャ         | 2009年 | エッセイ集。ビューティフルシリーズ多い... (以下略) |
| ビューティフルテスティング           | 2010年 |  |
| ビューティフルセキュリティ           | 2010年 |  |
| ビューティフルデータ                 | 2011年 |  |
| ビューティフルビジュアライゼーション | 2011年 |  |




# 結論

カタログを作って満足しがちなんですが、ちゃんと買って読む＆布教したいと思います。
作業スピードUPによく効くBGM


皆さんはどうなのかと思って投下！

作業時にイヤホンで聴いている曲（アルバムなど）はなんですか？

よく聞いている曲をリストアップしてみました。

Best of Van Halen Vol1
Led Zeppelin IV
The Essencial TOTO
ABBA Gold
Guns And Roses Greatest Hits
宝曲〜T-SQUARE
Micheal Jackson Number Ones
Conscriptでgiter8インストール時にエラーが出てしまう

# 概要
- [http://terurou.hateblo.jp/entry/2014/02/21/190503](http://terurou.hateblo.jp/entry/2014/02/21/190503)を参考にConscriptでgiter8をインストールしようと思った時にエラーが出た
- 自分のメモ書き程度で書留めておきます

## 環境
- windows10

## エラー文
```
cs n8han/giter8
An unexpected error occurred: Please check your internet connection.
You may need to generate a github access token.
see https://help.github.com/articles/creating-an-access-token-for-command-line-use/
Exception message: Unexpected response status: 301
```

## 対処法
- [https://github.com/foundweekends/conscript/issues/69](https://github.com/foundweekends/conscript/issues/69)を見てみると`n8han/giter8` -> `foundweekends/giter8`にすればよいとのこと
- `cs foundweekends/giter8`で無事インストールすることが出来ました
試作したコンピュテーション式と関数モナド

StateモナドとMaybeモナドを合成すれば、状態を変化させながら失敗したときに打ち切ることが可能です。モナド変換子まで実装するのは大変なので、モナドに拘らずに目的に特化したコンピュテーション式を作ってみようと考えました。

この記事は次の続編です。

* [不揃いなデータをコンピュテーション式で処理](http://qiita.com/7shi/items/567e92474681a38de86a) 2016.06.30

上に掲載したコンピュテーション式を、どうやって作ったかという過程を説明します。あまり定義には深入りせずに、少しずつ変形して得ました。

また、修正して頂いたコードについても考察します。関数モナドに近いのではないかと思いました。

# 発端

Stateモナドでは状態を取得するのに`get`を使用します。動作決め打ちのコンピュテーション式を作れば、`get`のようなアクションが不要になるのではないかと考えました。

```fsharp
type GetBuilder() =
    member this.Bind(_, f) = fun s -> (f s) s
    member this.Zero() = fun _ -> ()
let get = GetBuilder()

let test = get {
    let! a = () in printfn "%d" a
    let! a = () in printfn "%d" a }

test 1
test 2
```
```text:実行結果
1
1
2
2
```

## 改造

値を取得する度に`+ 1`することを試してみました。

```fsharp
type IncBuilder() =
    member this.Bind(_, f) = fun s -> (f s) (s + 1)
    member this.Zero() = fun _ -> ()
let inc = IncBuilder()

let test = inc {
    let! a = () in printfn "%d" a
    let! a = () in printfn "%d" a }

test 1
test 2
```
```text:実行結果
1
2
2
3

```

`Bind`の実装で、`s`は`f`への引数、`(s + 1)`は次のブロックに渡す状態です。

※ 状態系モナドでは次のブロックに状態を渡すという解釈が、細かいトレースに煩わされずに形式的に扱うためのコツのような気がしています。

## リスト

リストの先頭から1つずつ取り出すように修正します。

```fsharp
type ListReaderBuilder() =
    member this.Bind(_, f) = fun (x::xs) -> (f x) xs
    member this.Zero() = fun _ -> ()
let listReader = ListReaderBuilder()

let test = listReader {
    let! a = () in printfn "%d" a
    let! a = () in printfn "%d" a }

test [1;2;3]
printfn "---"
test [4;5;6]
```
```text:実行結果
1
2
---
4
5
```

※ パターンマッチの不備で警告されます。

## 脱出

途中でリストが尽きたら脱出するように修正します。（Maybe風味）

```fsharp
type ListReaderBuilder() =
    member this.Bind(_, f) = function x::xs -> f x xs | _ -> ()
    member this.Zero() = fun _ -> ()
let listReader = ListReaderBuilder()
 
let test = listReader {
    let! a = () in printfn "%d" a
    let! a = () in printfn "%d" a }
 
test [1;2;3]
printfn "---"
test [4]
```
```text:実行結果
1
2
---
4
```

# 修正

[@pocketberserker](https://twitter.com/pocketberserker)さんによる修正です。

* [Twitterで流れてきたListReaderコンピュテーション式の解説 - pocketberserkerの爆走](http://qiita.com/7shi/items/567e92474681a38de86a) 2016.06.30

`Bind`の第1引数を捨てずに評価すれば、`do!`で簡単に書けるというご指摘です。

```fsharp
type ListReaderBuilder() =
  member this.Bind(g, f) = function (x::xs) -> (f (g x)) xs | _ -> ()
  member this.Return(_) = fun _ -> ()
let listReader = ListReaderBuilder()
 
let test = listReader {
  do! printfn "%d"
  do! printfn "%d"
}

test [1;2;3]
printfn "---"
test [4]
```
```text:実行結果
1
2
---
4
```

値が取れなくなるのではないかと懸念しましたが、`id`で普通に取れました。

## 関数モナド

修正していただいたコンピュテーション式の意味を考えましたが、関数モナドが出発点なのではないかと気付きました。確認するために関数モナドを作ってみた副産物が次の記事です。

* [doブロックとコンピュテーション式](http://qiita.com/7shi/items/92139286a4e9b5620d69) 2016.07.01

実際、関数モナドを使えば、値こそ変化しないものの似たことができます。

```fsharp
type FuncBuilder() =
    member __.Bind(m, f) = fun x -> f (m x) x
    member __.Return(x)  = fun _ -> x
let func = FuncBuilder() 

let test = func {
    do! printfn "%A"
    do! printfn "%A"
}

test [1;2;3]
printfn "---"
test [4]
```
```text:実行結果
[1; 2; 3]
[1; 2; 3]
---
[4]
[4]
```

これをリストが変化するように改造すれば、修正して頂いたコードが得られます。

# まとめ

アクションを消そうという発想で出発しましたが、関数モナドに揺り戻されました。何だかんだ言っても、やはり定石は手堅いです。
Raspberry Pi Zero のヘッドレス セットアップと MinecraftをVNC経由で出来るようにするメモ

# **概要**

* 使用機材確認
* Raspbian Jessie SDディスク作成
* 初期設定
* VNC for Raspberry Pi alpha install
* VNCserver  service enable
* ヘッドレス時の解像度問題対応
* VNC Client 接続設定
* MineCraft Pi Edition 動作確認

### **使用機材確認**

* Raspberry Pi Zero
* MicroSD (8G以上推奨)
* USB Ethernet アダプター(+MicroUSB 変換ケーブル)
* MicroUSB 電源

### **Raspbian Jessie SDディスク作成**
* 最新版は以下URL
	*  [RASPBIAN JESSIE] (https://www.raspberrypi.org/downloads/raspbian/)

* 作成手順については省略。

### **初期設定**
* raspberryPi Zero 起動
* DHCP貸し出しIP等から IPを割り出し、ssh接続。
    * ※固定IP等に変更する手順は省略。
* `$ sudo raspi-config` で初期設定。
    *  1 Expand Filesystems
    *  5 Internationalisation Options
		* I1 Change Locale : ja_JP.EUC-JP EUC-JP と ja_JP.UTF-8 UTF-8 も選択
		* I2 Change Timezone :Asia -> Tokyo
	* 9 Advanced Options
		* A2 hostname :変更
		* A3 Memory Split :64 → 128

```sh
　$ sudo apt-get install fonts-vlgothic
　$ sudo apt-get install ibus-anthy
　$ sudo apt-get update
　$ sudo apt-get upgrade
　$ sudo reboot
```
### **VNC for Raspberry Pi alpha install**
* 基本以下の通り。 
* https://www.raspberrypi.org/blog/minecraft-pi-and-more-over-vnc/ 
* https://github.com/RealVNC/raspi-preview#startVnc

##### VNC Server install

```sh
 $ curl -OL https://github.com/RealVNC/raspi-preview/releases/download/5.3.1.18206/VNC-Server-5.3.1-raspi-alpha1.deb
 $ sudo dpkg -i VNC-Server-5.3.1-raspi-alpha1.deb
```

##### service modeで起動

```sh
 $ sudo systemctl start vncserver-x11-serviced.service
```

### **VNC Server service enable**
* 自動起動設定

```sh
 $ sudo systemctl enable vncserver-x11-serviced.service
```

### **ヘッドレス時の解像度問題対応**
* VNCサービスモード時、スクリーンが小さい問題
    * ※モニター接続されているなら起きない？(未確認)  
    * https://support.realvnc.com/knowledgebase/article/View/523

```sh
 $ sudo vi boot/config.txt

+ hdmi_force_hotplug = 1
+ hdmi_ignore_edid = 0xa5000080
+ hdmi_group = 2
+ hdmi_mode = 16

 $ sudo reboot
```

### **VNC Client 接続設定**

1. とりあえず最新のVNC Viewer をダウンロード
	* https://www.realvnc.com/download/vnc/
2. 5900port でraspberryPiへ接続。

### **MineCraft Pi Edition 動作確認**

* VNC Viewer設定
	* https://github.com/RealVNC/raspi-preview に説明があるとおりに設定
	* VNC Viewer Options > Advanced... > Expert tab.
		* PreferredEncoding :JPEG
		* AutoSelect :False
		* ColorLevel :Full
	* Minecraft 起動
		* F8 を押し、 Relative Pointer Motion にチェック
		* 終わるときはF8 からRelative Pointer Motion のチェックを外す




※ Windows10、Ubuntu16.04LTS にて確認
iOSライブラリをまとめてるサイトのまとめ

暇なときに眺めてる、
iOSライブラリを見つける、検索できるサイトをまとめてみました。

眺めているだけでも、流行っているライブラリやUIが確認できるのでオススメなサイト・記事たちです。。。

※各OSバージョンごとの、リポジトリのまとめは、紹介リポジトリが増えたので、別記事に分離しました。
[各iOSバージョンで追加された新機能を速攻で試せる アプリRepository まとめ](https://qiita.com/homyu/items/f5a966c3928f247cdeab)

## [2018年これだけは知っておきたいiOSライブラリ31選](https://qiita.com/kohei1218/items/275fcee7406395919885)

これだけは知っておきたいiOSライブラリが紹介されています。
すごくいいです！

## [fantastic-ios-animation](https://github.com/onmyway133/fantastic-ios-animation)

各UIごとのアニメーションライブラリが、カテゴリー付けされてgithub上にリストアップされています。
Alert/Transition/View/LabelなどやMaterialDesignのライブラリまで、綺麗にまとまっている感じです。


## [Cocoa Controls](https://www.cocoacontrols.com/)

定番のUIライブラリサイトです。
ライブラリによってはアニメーションの動作サンプルを見るとこが出来るので、ビルドしなくても動作が見れて便利です。

## [vsouza/awesome-ios](https://github.com/vsouza/awesome-ios)

Payments/Charts/Core Data/Date & Time/Games/解析ツール/xcodeプラグイン
のようにiOSカテゴリーごとに有用なライブラリや、ツールがリストアップされているリポジトリです。
多くて数えてませんが、おおよそ400本以上まとめられてます。

## https://github.com/Ramshandilya/iOSRepo
アプリのアーキテクチャ、UIカスタムライブラリ、コード規約など、iOS開発であると便利なものが、まとめられてるリポジトリです。

## [33 iOS open source libraries that will dominate 2017](https://medium.com/app-coder-io/33-ios-open-source-libraries-that-will-dominate-2017-4762cf3ce449)
2017年のiOS開発に欠かせないライブラリをまとめらてている記事です。
基本的によく見かける定番ライブラリが記載されていました。

使ったことは無いですが、ネットワーク抽象化ライブラリの[Moya](https://github.com/Moya/Moya)、カラー管理?[Chameleon](https://github.com/ViccAlexander/Chameleon)とか気になりました。


## [iOS Library List 100+](http://smsurf.app-rox.com/iosl/)
iOSライブラリを簡単な説明を含めて100本以上掲載しているサイトさんです。

## [iOS Developer Library](https://developer.apple.com/library/ios/navigation/)
Appleが管理しているサンプルライブラリリストです。
使い方が気になるクラスがあれば、適応に検索するとサンプルプロジェクトを入手することができて便利です。


## [色んなiOSアプリが使っているオープンソースライブラリを調べた](http://qiita.com/inoue0426/items/d97a0bca18ec5f91d839)
有名アプリが使用しているOSSのまとめ記事です。

## [5 Amazing Open Source Calendar Libraries](https://medium.com/boostnote/5-amazing-open-source-calendar-libraries-653738d00cd)
カレンダーを作成するときに、使用できそうなライブラリをまとめてくれている記事です。

## [20 iOS Tab Bar Open Source UI Animation Libraries](https://uxplanet.org/20-ios-tab-bar-open-source-ui-animation-components-libraries-swift-objective-c-43c0039dff0d)
TabBarのライブラリをまとめられている記事です。
TabBar系のライブラリだけで20種類、gifアニメーション付きで紹介されているので、気に入ったものを探すことができます。

# おまけ

ライブラリをまとめて（カタログ化?）いるアプリを番外編として記載しておきます。
電車の中などちょっとした時間で見てみると新たな発見があって面白いです！！

## [OSS Sampler](https://itunes.apple.com/jp/app/oss-sampler-iosopunsosuraiburari/id602927970?mt=8)

iOSのOSSライブラリを紹介しているアプリです。
Storeから購入する必要がありますが、実機ですぐにライブラリの動作Demoを見ることができます。
Live2Dキャラの瞳に姿を映そう

先日2016/7/2にLive2Dカンファレンス、alive2016がありました
そのなかで[栗坂こなべ氏](https://twitter.com/kurisaka_konabe)が「瞳の反射」についてLTと展示を行っていて
「背後空間の光源が瞳の奥に映る」という部分で
この部分がリアルタイムに変化するとより表現が広がんじゃないか？ということで

#モデルの準備
まずはモデルを用意します
テクスチャーが一個まるまる変質するので映す映像のテクスチャーは専用でつくらなければなりません
![追加.PNG](https://qiita-image-store.s3.amazonaws.com/0/117475/dd75292b-d121-2fb4-be2a-3cee2973c05a.png)
画像は2の倍数でないと認識しないので注意が必要です
おまけに写った時の位置関係も重要ですからカメラ画像から整形したものを使用したほうがいいでしょう
そして別段変形の予定がなければ三角形は2個で大丈夫ですが瞳に合わせて変形するのでそこそこ割っておきます
![wari.PNG](https://qiita-image-store.s3.amazonaws.com/0/117475/917387b5-83e9-245c-857c-b298629d0158.png)
瞳に入れるときは黒目か白目でクリッピングして加算。そして大体５０％ほどに透過する
![目.PNG](https://qiita-image-store.s3.amazonaws.com/0/117475/d77a0d5d-75dd-1cee-c537-e37b55435d0d.png)
お好みで細かい連動処理をいれてもいいでしょう。

#Webカメラの取り込み
Unity側のプログラムです
動作としてはWebCamTextureを起動してUpdateで
毎回SetPixle32とGetPixle32で受け渡しをしてやります
対応するテクスチャーは大きさが合わないのでWebCamから生成したテクスチャーを
setTextureで差し替え

```csharp:hitomi.cs
using UnityEngine;
using System;
using System.Collections;
using live2d;
using System.Text.RegularExpressions;

[ExecuteInEditMode]
public class SimpleModel : MonoBehaviour 
{
	public TextAsset mocFile ;
	public Texture2D[] textureFiles ;

	// Webカメラ取り込み
	public WebCamTexture camTex;
	// とり込み結果反映用
	private Texture2D camTex2D;
	
	private Live2DModelUnity live2DModel;
    private Matrix4x4 live2DCanvasPos;

	private EyeBlinkMotion ebm;
	
	void Start ()
    {
        if (live2DModel != null) return;
        Live2D.init();
		ebm = new EyeBlinkMotion();
		ebm.setEyeMotion(100, 50, 100);
		ebm.setInterval(5000);

		//　Webカメラ処理　今回はFaceRig探してる
		WebCamDevice[] devices = WebCamTexture.devices;

		foreach ( var ele in devices)
		{
			if(Regex.IsMatch(ele.name,"Face"))
			{
				camTex = new WebCamTexture(ele.name);
				camTex.Play();
				camTex2D = new Texture2D(camTex.width, camTex.height);
			}
		}

		live2DModel = Live2DModelUnity.loadModel(mocFile.bytes);
        for (int i = 0; i < textureFiles.Length; i++)
        {
            live2DModel.setTexture(i, textureFiles[i]);
			textureFiles[i].hideFlags = HideFlags.None;

		}

		//Webカメラの処理結果に最終テクスチャを差し替え
		live2DModel.setTexture(3, camTex2D);

		float modelWidth = live2DModel.getCanvasWidth();
        live2DCanvasPos = Matrix4x4.Ortho(0, modelWidth, modelWidth, 0, -50.0f, 50.0f);
    }
	
    void Update()
    {
        if (live2DModel == null) return;
        live2DModel.setMatrix(transform.localToWorldMatrix * live2DCanvasPos);

        if (!Application.isPlaying)
        {
            live2DModel.update();
            return;
        }
		
		//Webカメラから反映用のテクスチャに移す処理
		camTex2D.SetPixels32(camTex.GetPixels32());
		camTex2D.Apply();　//コレを呼ばないと処理が完了しないとかなんとか

		ebm.setParam(live2DModel);

		live2DModel.update();
	}
	
	void OnRenderObject()
	{
        if (live2DModel == null) return;
        live2DModel.draw();
    }
	
	void OnApplicationQuit()
	{
		camTex.Stop();
	}
}
```

#結果サンプル
https://twitter.com/Ganeesya/status/749578527033270272
Amazon ECR にログインなしで接続する

Amazon ECR はとても便利ですが、ECS 以外でのデプロイとなると
適切なインスタンスプロフィールが与えられた EC2 であっても
例えば CLI の `aws ecr get-login` で得られる値をもって
`docker login` しないと接続ができません**でした**。

最近素晴らしいツールが公開されたので、改めて Qiita に記事を残します。

# Amazon ECR credential helper

公式のツールとして
GitHub にソースコードとインストール方法、使い方が公開されています。
https://github.com/awslabs/amazon-ecr-credential-helper

Docker v1.11 で実装された [credential-helper](https://github.com/docker/docker-credential-helpers) のインターフェースを実装した
プラグインという形になっており、利用方法もこれに準じています。

## インストール

* 対応クライアントは Docker v1.11 以降
* git と make が必要
* Go1.5 以降、または Docker そのものを利用してビルド
* ~/.docker/config.json に `credsStore` を指定

## 使い方

以下のどれかを満たしておく。

* EC2 上なら、適切な権限のインスタンスプロフィールを設定
* 環境変数 `AWS_ACCESS_KEY_ID` と `AWS_SECRET_ACCESS_KEY` を設定
* 設定ファイル `~/.aws/credentials` を用意

その上でツールがインストールされていれば、**リポジトリが
ECR かどうかを意識する必要なく、docker login もせずに
docker pull や push が行えます。**


# Dockerized ECR credential helper

上述のツールはとても素晴らしいのですが、CoreOS や RancherOS などで
できれば git も make も使いたくない場合でも **Docker さえあれば**
このツールが動作するように、ツールそのものを Dockerize しました。

https://github.com/pottava/dockerized-ecr-credential-helper

## インストール

* `docker pull pottava/amazon-ecr-credential-helper`
* PATH の通った場所に `docker-credential-ecr-login` [シェル](https://github.com/pottava/dockerized-ecr-credential-helper/blob/master/README-ja.md#インストール)を書く
* ~/.docker/config.json に `credsStore` を指定

## 使い方

[ツールと同じ](https://github.com/pottava/dockerized-ecr-credential-helper/blob/master/README-ja.md#使い方)です。

## その他

* [Dockerfile](https://github.com/pottava/dockerized-ecr-credential-helper/blob/master/versions/latest/Dockerfile) を真似してもらえればローカルでもビルドできます
* 本家のリポジトリにもそのうち PR 送ろうかとは思います
* Mesos 環境下ではうまく動作せず。[これ](https://mesosphere.github.io/marathon/docs/native-docker-private-registry.html) ならもちろん ECR もいけるけど・・
セキュリティソフト自体の脆弱性 2016

1. [エンタープライズのエンドポイントに侵入する方法](http://googleprojectzero.blogspot.jp/2016/06/how-to-compromise-enterprise-endpoint.html)を読んで Symantec の実装が酷いと感じた
    1. メールを受け取っただけで（開かなくても）勝手にウィルススキャンしてくれるが、そこに簡単なバッファーオーバーフローの脆弱性があったり
    2. 7 年以上も前のオープンソースコードを使い続けてて、元プロジェクトでは修正されてる脆弱性を放置してたり
2. 少し前に Trend Micro に対しても似た話題があった
3. [セキュリティソフトの売れ筋ランキング](http://bcnranking.jp/category/subcategory_0019.html) で上位に来るベンダーの成績を調べてみた
    1. ゼロデイアタックを調査してる Google の [Project Zero](http://googleprojectzero.blogspot.jp/) の DB で検索
        1. [Trend Micro](https://bugs.chromium.org/p/project-zero/issues/list?can=1&q=trendmicro) 3 件
            1. 2016-01: デフォルトでインストールされる Password Manager が 49155 ポートで任意のコマンドを受け付けて実行してしまう
            2. 2016-05: ポートは毎回変わるがデバッグ用の Node.js が任意のコマンドを受け付けて実行してしまう
            3. 2016-05: 警告ページを表示する HTTP サーバーにバグがあって、任意のファイルにアクセスできてしまう
                1. 任意のパスが指定できないように「../..」（ Mac/Linux 風）は使えないようになっているが「..\\..」（ Windows 風）が使えてしまう
        2. [ESET](https://bugs.chromium.org/p/project-zero/issues/list?can=1&q=eset) 3 件
            1. 2016-06: 任意のコマンドを実行できる（[youtube](https://www.youtube.com/watch?v=Sk-CuFMXods))
            2. 2016-06: 言語設定で使う言語番号の上限設定がされてなくて、ヒープオーバーフロー
            3. 2016-06: MSVCR90 の _encode_pointer シンボルを使って[インポートアドレステーブル](http://i53.hatenablog.jp/entry/2015/07/18/234447)を改変するとウィルススキャンがクラッシュ
        3. [Symantec](https://bugs.chromium.org/p/project-zero/issues/list?can=1&q=symantec) 8 件
            1. 多すぎて書く気になれない...
        4. [McAfee](https://bugs.chromium.org/p/project-zero/issues/list?can=1&q=mcafee) 1 件
            1. 2016-05: LiveSafe で外部入力のパーサーのバグでクラッシュ
    2. 各ベンダーの対応も、丁寧だけど技術的にはお粗末な印象
4. 各社比較をするには母数が少なすぎるけれど、McAfee (Intel) 以外はプログラマに素人が混じってると言われても仕方ない
    1. McAfee (Intel) は、たまたま報告が少ないだけの可能性あり
Amazon ECR に特定 IAM ユーザからのみのアクセスを許可

Amazon ECR 最高です。あ、個人的な要望ですが、東京リージョンよりも Docker Datacenter のセキュリティ機能切望してます。よろしくお願いします。

さて
会社 / プロジェクトで共通の Docker イメージどう管理してますか？
AWS アカウントを分けて運用したくなる方も多いと思います。

そんなとき、ECR ではどうするかというと、こうします。

# 仮定

Docker イメージの所有者（= ECR 管理者）と
その利用者は以下のものだったとして。

| 所有者 | |
|:------|:----------------|
| AWS Account ID | 1234-5678-9012 |
| Docker Image | 123456789012.dkr.ecr.us-east-1.amazonaws.com/app/web |
| **利用者** | |
| AWS Account ID | 9876-5432-1098 |
| IAM User | ecr |

# 所有者側の設定

特定 IAM ユーザへの許可は AWS コンソールからはできない[^1] ため
CLI から許可してみます。

## 1. ECR ポリシーの定義

`987654321098` アカウントの `ecr` という IAM ユーザ[^2] に対して**のみ**
アクセス許可するなら、以下のような policy.json ファイルを定義します。

```json:policy.json
{
    "Version": "2008-10-17",
    "Statement": [
        {
            "Sid": "allow-iam-user",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::987654321098:user/ecr"
            },
            "Action": [
                "ecr:GetDownloadUrlForLayer",
                "ecr:BatchGetImage",
                "ecr:BatchCheckLayerAvailability"
            ]
        }
    ]
}
```

このとき、`Principal` に `arn:aws:iam::987654321098:root` を指定すると、ポリシー的に許可された **すべての IAM ユーザ** からのアクセスが許可されます。
また、ここで許可している `Action` は **`docker pull` のみ**を許可するものです。`push` も許可する場合は [公式ドキュメント](http://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/ecr_managed_policies.html) を確認してください。

## 2. 利用者からのアクセスを許可

CLI からリポジトリにポリシーをセットします。

```sh:change-ecr-policy
POLICY=`cat policy.json`
REPOSITORY="app/web"
aws ecr set-repository-policy --repository-name $REPOSITORY --policy-text $POLICY
```

# 利用者側の設定

## 1. IAM ポリシーの設定

IAM ユーザ `ecr` に以下の `Action` を許可します。
ECR に設定したポリシーとひとつ違うことに注意してください。
**`ecr:GetAuthorizationToken`** が多いですね！

```json:iam-user-policy
 {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "allow-ecr-read",
            "Effect": "Allow",
            "Action": [
                "ecr:GetAuthorizationToken",
                "ecr:GetDownloadUrlForLayer",
                "ecr:BatchGetImage",
                "ecr:BatchCheckLayerAvailability"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
```

## 2. クロスアカウントな ECR にログインする

2.1. 所有者の AWS アカウント ID を指定してログイン

```sh:get-login
eval "$(aws ecr get-login --registry-ids 123456789012)"
```

2.2. または生のトークンを利用してログイン

```sh:get-authorization-token
AUTH_DATA=$(aws ecr get-authorization-token --registry-ids 123456789012)
TOKEN=$(echo $AUTH_DATA | jq -r ".authorizationData[0].authorizationToken" | base64 --decode | awk -F":" '{ print $2 }')
ENDPOINT=$(echo $AUTH_DATA | jq -r ".authorizationData[0].proxyEndpoint")
docker login -u AWS -p $TOKEN $ENDPOINT
```

2.3 pull なり push なり

ログインが成功すれば、あとは許可されたリポジトリを操作できます。

```sh
docker pull 123456789012.dkr.ecr.us-east-1.amazonaws.com/app/web
```

　

[^1]: 2016/07/03 現在、いまのところ。
[^2]: EC2 など IAM ロールへの許可は [こちらの記事](http://qiita.com/winebarrel/items/bbfe4bf06039f7831af3) にありました。
Agile Japan 2016 北陸(富山)サテライトに行ってみました

# 基調講演のビデオを視聴。
ハードもソフトもスクラムで作ると半分の時間で倍の成果がでるって話。
モノも情報もJust In Time で届かなければ、不良在庫! 余計なコストを食うのを減らしたり、専門化が悪い方向に進みサイロ化させない、無駄を生まない仕組みがスクラムにはあるのかな。
いい習慣を作るためのリズム :notes: で、スプリントをこなせるといいな。

30人ほどが入ればいっぱいの会議室ならMBPのスピーカー音量Maxで外付けスピーカーがなくてもなんとか足りるらしい。

----

# つづいてソラコムさんの基調講演ビデオ視聴。
IoT。もの向けのモバイル回線。SDNで低コストでニーズにあったサービスを提供する。
回線のセキュリティ確保はSIMでできている。
着眼点が素晴らしすぎて、ただただ次元が違うなぁと関心するばかり。

----

# 最後は富山独自企画。
北陸の企業でアジャイルを広めようとしている方々の発表。
わからなくてもうまくいかなくても現実はきびしいことばかりでも一人でも始めてみよう。
仲間を作ろう。そんなエネルギーが得られるパワースポットでした。 :satisfied: 

----

# じゃんけん大会で勝ち取った　アジャイルの魂2016
![P_20160702_103441.jpg](https://qiita-image-store.s3.amazonaws.com/0/111481/2535392d-8383-1ef4-58f5-2f89ce462ac9.jpeg)

こういうのでははずれなことが多い自分ですが、同じ会社なので回し読みします! と言って譲ってくださった方のおかげで読了することができました。 :checkered_flag: 

----

## 個人的に印象的だったのは、
アジャイルの成功を工学的にみたい。
ウォーターフォールなプロジェクトでもバーンダウンチャート、バーンアップチャートで生産性分析するのは有効。
教育心理学で言うところの素朴理論はひとそれぞれだから、コミュニケーションは大切にしないと伝わらない。
ウォーターフォールはプッシュ型、アジャイルはブル型。

----

## 参加者全員に配られた EM-ZERO も読み応えがあった。
ハードウェアは経年劣化して故障率が右肩上がりになる。
ソフトウエアは機能追加、カスタマイズ、バグ対応を繰り返すなかで劣化していく。
その劣化を元に戻す力、レジリエンスを高めるにはトラックナンバーは少ないほうがいい。
ただトラックナンバーを減らすにはいくらか開発速度を落とす必要がある。

アジャイル視点で読む 失敗の本質
学際 専門の効力、権威の薄れ。思考停止 選択的無知での応用につなげるにはなにができるか。

----

## 近似値でもいいから伝えようとする努力

自分のこの未熟な文書では、誤解させたり、なにも伝えられないかもしれないが感動、感謝を伝えたられたらいいな。
パイプからの入力 1 行ごとに、逐次コマンドを実行する


タイトルのような挙動をするプログラムを作ってみたという記事です。

[![shu-go/lbyl](https://img.shields.io/badge/GitHub-shu--go%2Flbyl-brightgreen?logo=github)](https://github.com/shu-go/lbyl)

# 概要

lbyl というプログラムを作りました。(名前は line-by-line の略です)

↓こんな風に使います。

```bash
> ./long-lasting-script | lbyl growlnotify.exe ?
```

この例では、long-lasting-script からパイプされた標準入力を行単位で分割し、growlnotify の引数に渡しています。
末尾の「?」が引数の位置を指示するマーカーです。

lbyl の引数に渡されたプログラムは、標準入力の行ごとに**入力を受け取った都度、個別のプロセスとして起動します。**

* オプション ```-throttling=xxx``` でスロットリングしている場合は、指定のミリ秒ごとに入力を蓄積したうえでプロセスを起動します。
* オプション ```-async``` を使えば、プロセスを同時起動することもできます。
* オプション ```-pipe``` を指定すれば、引数ではなく、起動させたプロセスの標準入力に流し込みます。

# 背景
## ユースケース

例えば、長時間かかるメンテナンス用のスクリプトを流していて、自分に都合の良いタイミングで状況を確認したいとします。

別の作業をしながら、ちらちらコンソールを見るというのも面倒です。
そこは、通知アプリを使って通知できるようにしたいものです。

ちなみに、メンテナンススクリプトは標準出力や標準エラー (コンソール画面) に状況を逐次出力しています。
また、コマンドラインから通知アプリにポストするコマンドは持っているものとします。(例: growlnotify.exe)

## 問題点

lbyl なしで単純にやろうとすると、こんな感じになるかもしれません。

```bash
> ./long-lasting-script | growlnotify.exe
```

ここで問題点が 2 つ。

1. :disappointed: growlnotify はパイプ (標準入力) からのメッセージの流し込みに対応していない。
2. :confused: パイプ (標準入力) を常に監視して都度処理をしてくれるプログラムって意外と少ない。

前者は xargs というものを使えば解決しそうです。私は Windows 使いですが、Windows でも類似のことはできそうです。
ただし…

後者については、以下を試してみてください。(Windows)

```bash
> ping 0.0.0.0 | more #これは逐次出力される
> ping 0.0.0.0 | msg * #最後まで処理されてから、まとめて表示される
> ping 0.0.0.0 | iconv -t utf-8 | more #要iconv  まとめて表示される
```

要は、プログラムによって挙動がまちまち、ということです。

# lbyl では

上の例は以下のように変わります。

```bash
> ping 0.0.0.0 | lbyl -pipe more
> ping 0.0.0.0 | lbyl -pipe msg *
> ping 0.0.0.0 | lbyl -pipe iconv -t utf-8 | more
```

lbyl から呼び出すことで行ごとの出力になります。
出力の開始から終了までに時間がかかるようなコマンドでも、逐次出力を得られるようになります。

# 開発

やっていることは結構単純です。
標準入力をバッファにためて、1行毎 (-throttle=0 の場合) もしくは指定時間後の読み込み時に (-throttle != 0 の場合) 引数に渡されたプログラムを起動するだけです。

ただし、ただ起動しただけでは、起動したプロセスの出力が lbyl の出力に流れません。
そのため、exec.Command() の戻り値の Stdout, Stderr に os.Stdout, os.Stderr を渡す形で出力を共有しています。

# その他

lbyl は Go で作りました。
必要なライブラリが十分にそろっていて、ほとんど標準ライブラリで事足りました。
オプションの実装も、文字列操作も、プロセス起動も簡単に組み込めています。

また、Go の恩恵として、簡単にクロスコンパイルができました。
(Windows 以外の環境は、あまり使っていませんけどね)