OmniAICreator/Qiita-1.07M huggingface dataset:
Scalaで動的計画法

思いつきでコード書いちゃってるし

var とか使っちゃってるのでいけていない。꒰⁎×﹏×⁎꒱ ༘ؓ ँั๊ྃ 

val のみのイミュータブルな感じで行きたい。。。٩꒰･ัε･ั ꒱۶

けど、上手いことコードを生み出せない( ･ὢ･ ) ﾑﾑｯ

もっとスマートなコードを

**諸兄方にご教示願いたし。**

# <i class="fa fa-code" style="font-size:1em;"></i> ソースコード

```scala
/**
 * Created by FScoward on 2015/02/14.
 */
object Main {
  val ZERO = 0
  val ONE = 1
  val SIZE = 10


  def main(args: Array[String]) {

    /**
     * 11111
     * 10111
     * 11111
     * 11111
     * 11111
     **/

    // 2次元配列を用意
    val input: Array[Array[Int]] = Array.ofDim(SIZE, SIZE)
    input(0)(0) = 1
    input(0)(1) = 1
    input(0)(2) = 1
    input(0)(3) = 1
    input(0)(4) = 1

    input(1)(0) = 1
    input(1)(1) = 0
    input(1)(2) = 1
    input(1)(3) = 1
    input(1)(4) = 1

    input(2)(0) = 1
    input(2)(1) = 1
    input(2)(2) = 1
    input(2)(3) = 1
    input(2)(4) = 1

    input(3)(0) = 1
    input(3)(1) = 1
    input(3)(2) = 1
    input(3)(3) = 1
    input(3)(4) = 1

    input(4)(0) = 1
    input(4)(1) = 1
    input(4)(2) = 1
    input(4)(3) = 1
    input(4)(4) = 1



    /* 処理 */
    val array: Array[Array[Int]] = Array.ofDim(SIZE, SIZE)

    // 部分適用
    val p = base(input = input, _: Int, _: Int, array = array, 1)

    var max = 0
    for {
      x <- 0 until SIZE
      y <- 0 until SIZE
    } {
      if (x == 0 || y == 0) {
        p(0, y)
        p(x, 0)
      } else {
        max = oneMatcher(input, x, y, array, max)
      }
    }

    println(max)
  }

  /**
   * 基本処理
   *
   * @param input 入力の2次元配列
   * @param x x座標
   * @param y y座標
   * @param array 結果を入れる2次元配列
   * @param method Int型を返す関数
   * @return Int
   **/
  def base(input: Array[Array[Int]], x: Int, y: Int, array: Array[Array[Int]], method: => Int) = {
    array(x)(y) = input(x)(y) match {
      case ZERO => 0
      case ONE => method
      case _ => throw new IllegalArgumentException()
    }
  }

  /* todo 再帰にしたい */
  /**
   * 動的計画法により、最大正方形を求める
   *
   * @param input 入力の2次元配列
   * @param x x座標
   * @param y y座標
   * @param resultArray 結果を入れる2次元配列
   * @param maxWidth 最大値
   * @return 最大値を返す
   **/
  def oneMatcher(input: Array[Array[Int]], x: Int, y: Int, resultArray: Array[Array[Int]], maxWidth: Int): Int = {
    base(input, x, y, resultArray, min(resultArray(x - 1)(y - 1), resultArray(x - 1)(y), resultArray(x)(y - 1)) + 1)
    Integer.max(maxWidth, resultArray(x)(y))
  }

  /**
   * 3つのIntを引数に取り、最小値を返す
   * */
  def min(x: Int, y: Int, z: Int) = {
    Integer.min(x, Integer.min(y, z))
  }
}
```
Bashのプロンプトに色を付けてサーバやユーザを区別する

Bashの場合`PS1`変数でプロンプトのフォーマットを指定しているため、そこに色を指定するエスケープシーケンスを混ぜ込むという話です。

# 実施例

```bash
vi ~/.bashrc
```

```bash:追記内容例
PS1="\[\e[36m\e[42m\][\u@\h \W \d \t]\[\e[0m\]\n\\$ "
```

```bash
source ~/.bashrc
```

# 表示例

![20150215-bash-sumire.png](https://qiita-image-store.s3.amazonaws.com/0/67857/6baceb30-3f56-aa06-5d20-e3cb88ca7f3e.png)

# エスケープシーケンスの構造

記号ばかりでややこしいため図にしてみました。

![20160221-bash-escape.png](https://qiita-image-store.s3.amazonaws.com/0/67857/9eb91603-8e34-0985-fc11-7cdc9700f09e.png)


色以外の `\u` などについては以下のページが参考になります。
[bashのプロンプトを変更するには (atmarkit)](http://www.atmarkit.co.jp/flinux/rensai/linuxtips/002cngprmpt.html)

# 他の色のサンプル

![20150215-bash-colors.png](https://qiita-image-store.s3.amazonaws.com/0/67857/76ee670f-dccc-6e58-d084-e71604cff545.png)



# 改行について

元々、エスケープシーケンスがあると入力コマンドに折り返しが発生するあたりで表示がおかしくなったので改行を入れて対策していましたが、コメントで教えて頂いた通り、これは先頭の `\[` を入れ忘れてたのが原因でした。
違和感あるかも知れませんが、プロンプトに出す情報を増やしても画面が狭くならなくなったのでこれはこれで気に入ってます。

# 使い所

* `grep`などで１つ前と２つ前のコマンドの出力の境界を見逃さなくなりました。  
* 開発環境とプロダクション環境の区別や特権ユーザかどうかの区別にも良いと思います。

複数人がログインする可能性のあるサーバは、あんまり好き勝手に弄りたくないので、壊れてもいい自分しか使わないような環境のみ色付けてます。
なのでデフォルトのプロンプトを見つけたら身構える感じです。

プロンプトをいじる事に関しては以下のページではもっと面白そうなことやってます。
[Color Bash Prompt (日本語)](https://wiki.archlinux.org/index.php/Color_Bash_Prompt_%28%E6%97%A5%E6%9C%AC%E8%AA%9E%29)
プログラマのためのGulp入門


LT駆動開発11でLTする予定だった内容を文章に書き下しています。

* http://blog.eiel.info/blog/2015/02/16/ltdd-11-gulp/

Gulpはタスクランナーです。
タスクランナーの中でも良いもののような気がしている。

Gulpは最近Web界隈で流行っています。
そんなわけでウェブにあるGulpの説明は利用者向けのものが多いです。
しかし、自分が知りたいことはだいたいよくわかりませんでした。

そんなわけで自分の試行錯誤などを残しています。

ちなみに、私は NodeJS のことをまだあまり知らない。

# 関連記事

1. [Gulp = Vinyl + Stream + Orchestrator](http://qiita.com/eielh/items/d5e10d5f05df60621d15)
1. [gulpとvinyl。gulp.srcを使わずgulpしてみる](http://qiita.com/eielh/items/dea9fd85d5389fd44174)

[関連記事はまだ途中です随時更新中]

# Web界隈でもタスクランナー

SassとかコンパイルするようになってWebページの作成にHTMLコーダもタスクランナーが必要になってきたようです。
プログラマからするとタスクランナーはそもそも必須ですよね。

makeとかrakeとか。

そこにファイルの更新を検知して自動実行をする機能もあるみたいです。

rubyだとGuardがありますね。

Gulpはそれだけじゃなくて、NodeJSらしさであるストリームになってるのがポイントのようです。
「 **ストリームを制するものはNodeJSを制す** 」らしいです。

* http://jxck.hatenablog.com/entry/20111204/1322966453

Gulpは「Vinylのストリーム」を扱います。ストリームなので実にNodeJSらしいのです。
ストリームを自由に扱えるNodeJS使いであればGulp自由自在に扱えるわけです。

# 参考になる文献など

* [stream-handbook](https://github.com/substack/stream-handbook)
エレベータに乗る


## 前説

鍋谷さんのpplogより。
※pplogは最終記事しか読めない仕様のため、パーマリンクを記載することは不可能です。

```
(前略)
ソスウノカイニハトマリマセンノデ、ツウカシマス」

「ナオ」
「ルイジョウスウノカイニハトマリマセン」
「コウドゴウセイスウノカイニハトマリマセン」
「カジョウスウノカイニハトマリマセン」
「ハンソスウノカイニハトマリマセン」
「カンゼンスウノカイニハトマリマセン」

次に止まる階はどこだか考える。
半素数ってなんだっけ。
```

## コード

とりあえず、 止まる階を下から<del>5つ求めると、`675, 1125, 1323, 2312, 2888`階だそうです。寒気しかしません。</del>
求めると、`44, 45, 50, 52, 63, 68, 75, 76, 92, 98`のようになるようです。かなりバグっていてすみませんでした。おかしいとは思ったんですよね…。

```rb:nabetani_elevator.rb
#!/usr/bin/ruby
require 'prime'
class Integer
	def check(m)
		a=self.prime_division
		return :prime if a.size==1 && a[0][1]==1
		return :half_prime if a.size==2 && a[0][1]==1 && a[1][1]==1
		divisornum=a.reduce(1){|s,(n,p)|s*(p+1)}
		return divisornum if divisornum>m
		divisorsum=a.reduce(1){|s,(n,p)|s*(n**(p+1)-1)/(n-1)}
		return :perfect_number if divisorsum==self*2
		return :abundant_number if divisorsum>self*2
		power_min=a.select{|n,p|p>1}.map{|n,p|p}.min
		return :perfect_power if power_min && a.all?{|n,p|p%power_min==0}
		return nil
	end
end
p Enumerator.new{|y|
	m=0
	i=2
	loop{
		r=i.check(m)
		m=[m,r].max if r.is_a?(Integer)
		y<<i unless r
		i+=1
	}
}.take(10) # [44, 45, 50, 52, 63, 68, 75, 76, 92, 98]
```

ところで、[chan gem](http://github.com/cielavenir/ruby-chan/)は(golangと同様)read onlyなchanの作成ができるので、`Enumerator.new{...}`は`Chan.new{...}.gen_enum(Enumerator.new{})`と変形できることになりますが、特に意味はないですね--;

## perfect_powerについて
私の最初の実装は

```
power_min=a.map{|n,p|p}.min
a.all?{|n,p|p%power_min==0}
```

だった。これは勿論

```
power_min=a.select{|n,p|p>1}.map{|n,p|p}.min
power_min && a.all?{|n,p|p%power_min==0}
```

の間違いなのだが(現在は訂正済み)。
鍋谷さんが

```
a.inject(a[0][1]){|acc,x|acc.gcd(x[1])}>1
```

なる実装を提案してくださった。これならpower_minは不要になりますが…。パフォーマンス的にはどちらが良いのでしょうね。
Composerに自分の作ったクラスを追加してみる。

Composer、全然使いこなせてませんでした、すみません。
自分のクラスを追加する場合、composer.jsonにautoloadという項目を追加して、そこに色々書いていきます。

```json:composer.json
{
    "autoload": {
        "psr-4": {
            "MyNamespace\\": "Folder/"
        }
    }
}
```

psr-4というのは、名前空間の検索方式・・・といえばいいでしょうか。
要は、psr-4で決められた規則にそって、ディレクトリと名前空間を構成していく必要があります。
ここが理解できてなかった・・・。
他にもpsr-0、classmap、filesという方式があるようですが、これは古い設計になっているプロジェクトでも使えるように存在するだけで、今から新しく始める場合はpsr-4を使うと良い・・そうです（[Composer公式サイト](https://getcomposer.org/doc/04-schema.md#autoload)）。

composer.jsonを修正したら、それを反映させます。

```bash
composer dump-autoload
# もしくは php composer.phar dump-autoload
```

今回はpsr-4を使いました。
この場合、Folderという名前のフォルダの中にnamespaceがMyNamespaceとなっているクラスを作っていけば大丈夫です（psr-0とpsr-4の違いとかは[ComposerでPSR-4仕様のオートロードを設定する](http://tec-blog.beaglee.com/?p=406)とかを参照してください）。

```php:Folder/ClassA.php
<?php
namespace MyNamespace;

class ClassA
{
// ...
}
```

名前空間をMyNamespace\SubNamespaceと拡張していきたい場合は、Folderの中に、SubNamespaceというフォルダを作り、その中にnamespaceをMyNamespace\SubNamespaceとしたクラスを作っていきます。

```php:Folder/SubNamespace/ClassB.php
<?php
namespace MyNamespace\SubNamespace;

class ClassB
{
// ...
}
```

MyNamespaceの部分をMyName\Spaceのように分割したいときは、composer.jsonを下記のように直します。

```json:composer.json
{
    "autoload": {
        "psr-4": {
            "MyName\\Space\\": "Folder/"
        }
    }
}
```

修正したら反映。

```bash
composer dump-autoload
```

MyNamespaceという名前空間を使っていたファイルも、全て書き直します。

```php:Folder/ClassA.php
<?php
namespace MyName\Space;

class ClassA
{
// ...
}
```

```php:Folder/SubNamespace/ClassB.php
<?php
namespace MyName\Space\SubNamespace;

class ClassB
{
// ...
}
```

#### --以下、勉強中--

ちなみに、下記のような書き方もできるらしいんですけど、psr-4をどう設定していいかわからず、挫折しました。。。（[[PHP] composer と spl_autoload の設定](http://qiita.com/hshimo/items/6367db84b776a4c51426)）

```php
$loader = require_once './vendor/autoload.php';
$loader->add("MyNamespace\\": __DIR__ . "/Folder/");
```

あと、SplEnumのようなグローバルクラスの呼び出しも上手くいかなかったなぁ・・・。

```php
<?php
namespace MyNamespace;

class MyEnum extends \SplEnum
{
// ...
}
```

まだまだ勉強不足です。。。
Gulp = Vinyl + Stream + Orchestrator


この記事は[プログラマのためのGulp入門](http://qiita.com/eielh/items/0ed141c0bda3663872b7)の一部です。

Gulpについて調べていると出会う記事が下記です。

* [gulp — Medium](https://medium.com/@contrahacks/gulp-3828e8126466)

Gulpは「Vinyl + Stream + Orchestrator」なのである。

それはGulpのindex.jsを見れば明らかだった。

確認してみよう。

* https://github.com/gulpjs/gulp/blob/v3.8.11/index.js

GulpのAPIには

* task
* src
* dest
* watch

がある。

## gulp.task

gulp.taskはタスクを定義するためのメソッドです。
このメソッドはOrchestratorのaddメソッドだ。

下記はソースコードの抜粋です。

```
var Orchestrator = require('orchestrator');

function Gulp() {
  Orchestrator.call(this);
}
util.inherits(Gulp, Orchestrator);

Gulp.prototype.task = Gulp.prototype.add;
```

`Gulp.prototype.task`は`Orchestrator.prototype.add`の別名となっています。

GulpはOrchestratorを継承しているので、`Gulp.prototype.add`は`Orchestrator.prototype.add`なのです。

Orchestratorはタスクを定義するためのライブラリであることがわかりました。

## gulp.src & gulp.dest & gulp.watch

gulp.src は VinylのReadableなストリームをつくります。

gulp.dest は VinylのWritableなストリームをつくります。

gulp.watchはローカルファイルストリームの変更を検知します。

このメソッドたちのソースを見てみよう。

```
var vfs = require('vinyl-fs');

Gulp.prototype.src = vfs.src;
Gulp.prototype.dest = vfs.dest;
Gulp.prototype.watch = function (glob, opt, fn) {
  // (中略)
  return vfs.watch(glob, opt, fn);
};
```

gulp.src自体がvinyl-fsのsrcメソッドの別名であることがわかる。
gulp.destも同様である。

watchは少しラップされていますが、結局vinyl-fsのwatchを呼び出すことがわかります。

# まとめ

OrchestratorはGulpのタスクをつくるライブラリです。

Vinylはファイルを抽象化したライブラリらしいです。
そのローカルファイルシステム用のアダプタであるvinyl-fsというライブラリがgulpのAPIを提供しています。
ec2 create-imageはインスタンスが"stopping"状態だと失敗する

AWS CLIで、ec2を停止してからcreate-imageしようとしたら失敗しました。

```
$ aws ec2 stop-instances --instance-ids i-xxxxx
{
    "StoppingInstances": [
        {
            "InstanceId": "i-xxxxx",
            "CurrentState": {
                "Code": 64,
                "Name": "stopping"
            },
            "PreviousState": {
                "Code": 16,
                "Name": "running"
            }
        }
    ]
}

$ aws ec2 create-image --instance-id i-xxxxx --name "my_image"

A client error (InvalidParameterValue) occurred when calling the CreateImage operation: Invalid value 'i-xxxxx' for instanceId. Instance is not in state 'running' or 'stopped'
```

え？インスタンスが停止状態だからcreate-imageしても問題ないはずでは？
と一瞬混乱したのですが、よく見ると

* "stopping"(停止しようとしている)状態
* "stopped"(すでに停止している)状態

という2種類の状態があるようです。


"stopped"になるまで待ってからcreate-imageしたら成功しました。
即興で作るHTML5 Canvasを用いたスマホ用お絵かきツール

動けばいいという気持ちで作ったので、とても適当です。
テスト用というかお遊び程度に。
動作確認：iOS7

##作り方

まず`canvas`要素が必要なので書き出します。
大きさは、後に座標を扱う際`body`の`margin`によるズレを軽減するのと、`viewport`設定を紛らわすために、ある程度大きくします。大体`1000`くらいでいいでしょう。

```html
<canvas width="1000" height="1000"></canvas>
```

次にいきなり`script`を書きます。
要素取得して`getContext`するあたりまではお決まりです。

```js
var a = document.querySelector("canvas"),
    c = a.getContext("2d");
```

最後に、`touch`イベントを書いて終わりです。
`beginPath`がどうこうとかは省きます。
座標は`pageX`でも`clientX`でも`screenX`でもなんでもいいです。

```js
a.ontouchstart = function (e) {
  e.preventDefault(); //固定用
  c.moveTo(e.touches[0].pageX, e.touches[0].pageY); //パスをタッチした地点へ
};

a.ontouchmove = function (e) {
  c.lineTo(e.touches[0].pageX, e.touches[0].pageY); //動いたところまで線を引く
  c.stroke(); //描画
};
```

以上で大体動きます。つなげると以下のようになります。

```html
<canvas width="1000" height="1000"></canvas>

<script>
var a = document.querySelector("canvas"),
    c = a.getContext("2d");

a.ontouchstart = function (e) {
  e.preventDefault();
  c.moveTo(e.touches[0].pageX, e.touches[0].pageY);
};

a.ontouchmove = function (e) {
  c.lineTo(e.touches[0].pageX, e.touches[0].pageY);
  c.stroke();
};

</script>
```
Capybaraでfill_inを使わずにテキストボックスに入力する

# 概要

idもlabelもないテキストボックスはfill_inメソッドが使えないようなのですが、
入力したかったので試してみました。
capybaraのfill_inメソッドが、inputタグに対してset("入力")しているだけだったので、
fill_inを使わずにテキストボックスに入力しました。

# 実装
```class="hoge"``` 下の最初の ```type=text``` の最初のinputタグに対して、「piyo」を入力する。

```html
<div class="inputs">
  <input class="radio" type="radio" value="hoge">
  <input class="radio" type="radio" value="fuga">
  <input type="text">
</div>
```

```rb
first("div.inputs > input[type='text']").set("piyo")
```
# 参考文献

+ [capybara/actions.rb / fill_in · jnicklas/capybara](https://github.com/jnicklas/capybara/blob/51414560294cc257922fad44f6c4b40e0f664f23/lib/capybara/node/actions.rb#L52)
+ [How to use fill_in with find in Capybara (if possible) - Stack Overflow](http://stackoverflow.com/questions/8534365/how-to-use-fill-in-with-find-in-capybara-if-possible)
Capybaraでchooseを使わずにラジオボタンにチェックする

# 概要

idもlabelもないラジオボタンはchooseメソッドが使えないようなのですが、
チェックしたかったので試してみました。
capybaraのchooseメソッドが、inputタグに対してset(true)しているだけだったので、
chooseを使わずにラジオボタンをチェックしました。

# 実装
```value="hoge"``` のinputタグに対してチェックする。  

```html
<div class="radios">
  <input class="radio" type="radio" value="hoge">
  <input class="radio" type="radio" value="fuga">
  <input class="radio" type="radio" value="piyo">
</div>
```
```rb
find("input[value='hoge']").set(true)
```

# 参考文献

[capybara/actions.rb / choose · jnicklas/capybara](https://github.com/jnicklas/capybara/blob/51414560294cc257922fad44f6c4b40e0f664f23/lib/capybara/node/actions.rb#L68)
AndroidのMediaCodecでFLVファイルを再生する

Android で ffmpeg 等を使わずに端末標準のデコーダでflvを再生してみました．

flvのフォーマットや MediaCodec API の基本的な使い方は下記のURLを参照してください．

- http://developer.android.com/reference/android/media/MediaCodec.html
- http://www.adobe.com/jp/devnet/f4v.html

flvの仕様のPDFファイルは，いまadobeからダウンロードできる10.1より，10のもののほうが目次がちゃんとしてたりして読みやすい(？)．

# コーデック

flv のコーデックのうち，AAC, mp3と H.264, H.263 あたりは，Androidがコーデック持ってるので再生できそうです．
VP6とかもよく見かけるけど， Stagefright に入ってないようなので難しそうです．


## 音声コーデック(AAC,mp3)

音声データは特に難しいところはありませんが，Audio tagの最初のバイトに SoundRate, SoundSize 等が入っているので，最初のAudio tagを見つけた時点で，AudioTrackやDecoderを初期化します．

また，AACのみパケットのタイプがデータの先頭に1バイト付いてるので処理する必要があります(無視してもデコード出来ると思いますが)．

## H.264

デコーダに渡すNAL unitのスタートコードはAnnex-B形式の [0x00,0x00,0x00,0x01] でなければいけないようです．
flvは4バイトのサイズが付いているので，そこをすべて[0,0,0,1]に書き換えるだけです．

わかりにくい箇所は，コンフィグレーションレコードの扱いで，flvにはmp4のavcCと同じ形式でH.264のコンフィグレーションが入っていますが，そのままMediaDecoderに渡してもデコード出来ません．

http://stackoverflow.com/questions/25160710/decode-mp4-h-264-using-mediacodec-without-mediaextractor-expected-access-unit-f

mp4をMediaExtractorでパースした場合にどうなっているのかも疑問だったのですが，MediaFormatに"csd-0"，"csd-1"という名前のキーで書き込まれているようです．
同様に，MediaFormatに入れても良いし，または，NAL形式に変換してBUFFER_FLAG_CODEC_CONFIG フラグを付けて
デコーダに渡せばデコードできます．

## H.263

FLVはH.263を格納出来ますが，通常のH.263ではなく，Sorenson Sparkです．よく似たフォーマットですが，互換性は無いのでビットストリームをパースして組み立て直す必要があります．

(目処はついてますが，まだ上手くデコードできてません)

Sorenson Spark は H.263 のサブセットなので，再エンコードせずに変換可能なはずです．Group of Block(GOB) Layerが存在しませんが，Macro Block(MB)は1つしかMBがないGOBと等しいので，Picture Layerだけ上手く作ればデコードできます．

- https://lists.libav.org/pipermail/ffmpeg-user/2010-August/026450.html

ffmpegを読めば，どうにか出来そうです．

- http://tech-blog.cerevo.com/archives/332/

CEREVOの稲垣さんが，今回とは逆の，H.263からSparkへの変換をやっている記事．H.263からSparkへは一般的には変換出来ないのですが，エンコード時のパラメータさえ気をつければ可能なようです．

- http://www.itu.int/rec/T-REC-H.263-200501-I
- http://hkpr.info/flash/swf/index.php?%E3%83%93%E3%83%87%E3%82%AA%2FSorenson%20H.263%20%E3%83%93%E3%83%83%E3%83%88%E3%82%B9%E3%83%88%E3%83%AA%E3%83%BC%E3%83%A0%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88


# いろいろメモ

最初，ffmpegのコードを読もうとしていたけど，つらくなって諦めました．

ビデオのデコード時にMediaFormatにColorFormatは指定できません．リファレンスにも指定できるとは書かれてないし，指定しても無視されます．デバッグ時に，RGBで出力して欲しくて試行錯誤して少し嵌りました．H.264の場合はFormatYUV420PackedSemiPlanar等で出てきます．

コーデックに変なデータ渡したりして，久しぶりにOSごと固まったりするのを見ました．

H.264は端末によってサポートしてるプロファイルが違うので，再生できなくて間違ってるのかなーと思ったら別の端末では再生できたりも．


# まとめとか

Androidで AAC, mp3と H.264 はデコードできるのを確認しました(当たり前ですが．．．)．

標準のデコーダを使うのでハードウェアデコーダが有効になるのが良いです．

## 書いた実験用アプリ

https://github.com/binzume/android-flv-player

この記事も含めて，MIT Licenseです．
VoxelMapとかJourneyMapとかの機能を無効化する方法

# まとめた経緯
ミニマップMODの機能制限方法について書かれた日本語のページがなかったため、まとめてみました。

# 仕組み
各ミニマップMODにはある特定のコードを送信することで機能を制限することが可能です。
それを利用して今回はレーダーなどの機能を無効化しています。
またカラーコードを送信するだけなのでクライアントには空行が表示されるだけです。

# 適当にプラグインを作ってみよう
イベントリスナーの登録とか色々省いていますが大体こんな感じです。
10Tickほど遅延させているのは参加してすぐだと無効化されない場合があるためです。
ワールドが変わるごとに送信する必要があります。
他に自分で制限したいものがあれば必要に応じて追加を行ってください。
Googleで調べればすぐにコードは出てきます。

```java:AntiMap
    private static final List<String> miniMapCodeList;

    static {
        List<String> list = new ArrayList<>();
        list.add("§r§f §r§f §r§2 §r§0 §r§4 §r§8 §r");
        list.add("§r§f §r§f §r§4 §r§0 §r§9 §r§6 §r");
        list.add("§r§3 §r§9 §r§2 §r§0 §r§0 §r§2 §r");
        list.add("§r§3 §r§6 §r§3 §r§6 §r§3 §r§6 §r");
        list.add("§r§f §r§f §r§1 §r§0 §r§2 §r§4 §r");
        list.add("§r§3 §r§9 §r§2 §r§0 §r§0 §r§1 §r");
        list.add("§r§3 §r§9 §r§2 §r§0 §r§0 §r§3 §r");
        list.add("§r§3 §r§6 §r§3 §r§6 §r§3 §r§6 §r");
        list.add("§r§f §r§f §r§1 §r§0 §r§2 §r§f §r§f §r§2 §r§0 §r§4 §r§3 §r§9 §r§2 §r§0 §r§0 §r§3 §r§9 §r§2 §r§0 §r§0 §r§3 §r§9 §r§2 §r§0 §r§0 §r");
        list.add("§r§3 §r§6 §r§3 §r§6 §r§3 §r§6 §r§e §r");
        list.add("§r§3 §r§6 §r§3 §r§6 §r§3 §r§6 §r§d §r");
        list.add("§r§f §r§f §r§2 §r§0 §r§4 §r§8 §r");
        list.add("§r§f §r§f §r§4 §r§0 §r§9 §r§6 §r");
        list.add("§r§f §r§f §r§1 §r§0 §r§2 §r§4 §r");
        list.add("§r§3 §r§9 §r§2 §r§0 §r§0 §r§2 §r");
        list.add("§r§3 §r§9 §r§2 §r§0 §r§0 §r§1 §r");
        list.add("§r§3 §r§9 §r§2 §r§0 §r§0 §r§3 §r");
        miniMapCodeList = Collections.unmodifiableList(list);
    }

    @EventHandler
    public void onPlayerJoin(PlayerJoinEvent event) {
        final Player player = event.getPlayer();
        Bukkit.getScheduler().runTaskLater(YOUR_PLUGIN_INSTANCE, new Runnable() {
            @Override
            public void run() {
                for (String code : miniMapCodeList) {
                    player.sendMessage(code);
                }
            }
        }, 5L);
    }

    @EventHandler
    public void onPlayerChangedWorld(PlayerChangedWorldEvent event) {
        final Player player = event.getPlayer();
        Bukkit.getScheduler().runTaskLater(YOUR_PLUGIN_INSTANCE, new Runnable() {
            @Override
            public void run() {
                for (String code : miniMapCodeList) {
                    player.sendMessage(code);
                }
            }
        }, 5L);
    }
```

# 最後に
他のミニマップMODとか機能制限できるものがありましたら、コメントにお願いします。
Skriptとかでもできるみたいですが書きかたわからないです。
Windows におけるスレッド同期


細かいこと、例外的なことなどいろいろあると思いますが、簡単にまとめてみました。

# スレッド同期とは？
マルチスレッド処理においてスレッド間の処理を同期させるために、スレッドにタイムスライスを与えないこと。（スレッドを眠らせること）

# そもそもスレッドって？

## プロセス
* アプリケーションの実行中のインスタンス。
* プロセス中には 1 つ以上のスレッドが存在する。
* プロセス起動時に同時に生成されるメインのスレッドをプライマリスレッドという。
* プライマリスレッドの終了 ＝ プロセスの終了。
* メモリはプロセス単位で管理されるので、プロセス内のスレッドは同一メモリ空間を共有する。

## スレッド
プロセスの実行の単位。
プロセス空間で、コードを実行する。

# マルチスレッド処理で問題になること
スレッドは実行の単位と書きました。
プロセス内に複数のスレッドがある場合、どのスレッド処理も非同期的に実行されます。
このような状況において、複数のスレッドが同一の変数（メモリ領域）に同時にアクセスする場合に問題が起こりえます。
単に複数のスレッドが値を読み出すだけなら、問題は発生しません。
一方、どれかのスレッドが値を変更している最中に、別のスレッドが値を読み出したり、変更しようとすると、アクセス違反が発生します。
このような問題に対処するために、スレッド間で処理の同期をとる必要があり、それをスレッド同期と呼びます。


# マルチスレッドを考える
シングルスレッドのプロセスを 2 つ動かしても、１つのプロセスで 2 つスレッドを動かしても、スレッドの数は 2 つ、つまりマルチスレッドですね。
それぞれにどのような違いがあるかを考えてみます。

## 複数プロセスを起動する
プロセスを 2 つ以上動かす。
スレッド間の連携が必要ないか疎で、プロセスの利用コストが相対的に低い場合はこちらを利用します。
プロセスの利用コスト（メモリのような OS のシステムリソース）はスレッドに比べて高いですが、連携が疎だと同期制御は相対的に簡単です。

## プロセス内マルチスレッド
プロセス内で 2 つ以上のスレッドを動かす。
スレッド間でメモリを共有するなど、複数のスレッドが密接に連携する場合はこちらを利用します。
スレッドの連携が密だということは、同期制御は相対的に難しいものになります。

# スレッド同期オブジェクト
スレッドの同期を目的としたオブジェクトには以下のようなものがあります。

## 共有データへのアクセスを直接的に制限するためのもの

### クリティカルセクション
* ある共有データに対するアクセスを単一スレッドに制限する。
* 最も使いやすく理解しやすいので、簡単に扱える。
* 同一プロセス内のスレッドの同期しかとれない。

利用例：

* プロセス内のスレッド間での変数（メモリ領域）アクセスの同期をとる。

### ミューテックス
* ある共有データに対するアクセスを単一スレッドに制限する。
* 自分を所有するスレッドを覚えている。
* 複数プロセス内のスレッドの同期がとれる。

利用例：

* ミューテックスを使って重複起動のチェックを行う。

## ある条件になるまでスレッドを待機させる類のもの

### セマフォ
* ミューテックスと似ているが、ある共有データに対して、複数スレッドのアクセスが可能。
* 参照カウンタを持つ。
* 所有権を持つスレッドが管理されていないため、あるスレッドがセマフォを待ちながら、他のスレッドがセマフォを解放できる。

### イベント
* 前述のオブジェクトはデータアクセス管理に使われるが、イベントは何らかの処理の通知に使われる。

利用例：

* 前処理が終わるまで（イベントがシグナル状態になるまで）、スレッドを待機させる。


# 参考リンク


## 標準 C++
[スレッドセーフという幻想と現実](http://yohhoy.hatenablog.jp/entry/2013/12/15/204116)

## Windows 関連
[日経ソフトウェア @ マルチタスクに不可欠な同期の仕組みを学ぶ](http://itpro.nikkeibp.co.jp/article/COLUMN/20070603/273403/?ST=develop)

[Microsoft @ マルチスレッドコードでよく見られる 11 の問題を解決する](http://msdn.microsoft.com/ja-jp/magazine/cc817398.aspx)


同期と直接関連はないけど、SleepEx から制御を戻すためのサンプル
[Win32API ユーザーモード非同期プロシージャ呼び出し QueueUserAPC, SleepEx](http://d.hatena.ne.jp/s-kita/20100206/1265422276)


## POSIX 関連
[Oracle @ 同期オブジェクトを使ったプログラミング](https://docs.oracle.com/cd/E19455-01/806-2732/6jbu8v6om/index.html)
IoT

##IoT = internet of things
モノがインターネットにつながる。今はIoT、ちょっと前はユビキタス？。PCとかスマフォ、ゲーム機が当たり前にインターネットにつながってる。TVにもLAN端子があって、繋げてるけど、そんなに恩恵を受けてないような気がする。エアコン・バスタブはつながると便利そう。冷蔵庫は役立たず？ 玄関はつながると嬉しい。鍵の締め忘れとか気になるし。離れた親や子の状況を把握するってのも需要あるか。カバン・リュックサックとか、なんか便利な面が期待できそうな気がする。でもつながる怖さは無視できない。
gulpとvinyl。gulp.srcを使わずgulpしてみる。



この記事は[プログラマのためのGulp入門](http://qiita.com/eielh/items/0ed141c0bda3663872b7)の一部です。

とりあえず、先にまとめておくと、「 **GulpはVinylのストリーム** 」だ。

Gulpの処理はストリームを繋いで作成する。
このストリームの中を流れるのはVinylオブジェクトです。
Vinylオブジェクトはファイルを抽象化したもので、ファイルシステム内のファイルも表現できるし、S3にあるオブジェクトも表現できたりするようだ。

NodeJSのユーザでないプログラマがGulpで遊ぼうとするとストリームを扱いなれていなくて苦戦することがわかった。

Gulpの処理部分の例はgulp.srcからはじまり、gulp.destで終わることが多い。

gulp.srcはglobをつかって複数のファイルを選択し、dulp.destでは「選択した複数のファイルをなにやら処理したもの」が流れてくるので、流れきたファイルを指定したディレクトリに保存する。

今回はgulp.srcを使わずにVinylオブジェクトを自分でつくってみた。

中身が`hoge`のhoge.txtと中身が`goro`のgorot.txtをmapで作成して、それを入力にしてglup.destに繋いでいる。

```
npm install vinyl event-stream gulp
```

```sample.js
var Vinyl = require('vinyl');
var es = require('event-stream');
var gulp = require('gulp');

files = ["hoge","goro"].map(function (n) { 
  return new Vinyl({path:n+".txt",contents: new Buffer(n+"\n")});
});

es.readArray(files).pipe(gulp.dest("."));
```

```
$ cat hoge.txt
hoge
$ cat goro.txt
goro
```

`files`はVinylオブジェクトの配列で、event-streamのredayArrayを利用すると、配列をストリームに変換することができる。

Vinylのストリームが、Viniylの配列のようなものであることが確認できた。
エンティティとリレーションシップ

##ER図
ER図は特にデータベースを設計する際に用いられている。これらは四角形を用いて表現される。

参考
http://itref.fc2web.com/technology/entity_relationship_diagram.html

##エンティティ
対象物のまとまりデータベースを設計する時に、人・物・場所・事象・概念・サービスといった対象物を同一のカテゴリーでまとめたもの。

参考
http://itpro.nikkeibp.co.jp/article/COLUMN/20070226/263243/

http://www.dab.hi-ho.ne.jp/sasa/hyoryuki/er/

「1対多」または「1対1」のリレーションシップでは、片方のエンティティを親エンティティ、もう片方のエンティティを子エンティティと呼びます。
####「1対多」の場合
「1対多」のリレーションシップにおける親エンティティと子エンティティの定義は、次の表のようになります。

|　　分類|定義　　　　　|
|:-----------|------------:|
|親エンティティ|「1」の側のエンティティ|
|子エンティティ|「多」の側のエンティティ|
####「1対1」の場合
「1対1」のリレーションシップを「1対多」のリレーションシップの特殊形と考え、片方を親エンティティ、もう片方を子エンティティと見なします。

##リレーションシップ
親エンティティと子エンティティの間のリレーションシップは、依存リレーションシップと非依存リレーションシップに分類されます。

|　　分類|定義　　　　　　　　　　　　　　　　　　　　　　　|
|:-----------|------------:|
|依存リレーションシップ|子エンティティの主キー属性が、親エンティティの全ての主キー属性を含んでいるようなリレーションシップ|
|非依存リレーションシップ|エンティティが親子関係を持つが、依存リレーションシップの定義にあてはまらないリレーションシップ|

依存リレーションシップの例
![kobito.1424009217.178040.png](https://qiita-image-store.s3.amazonaws.com/0/59354/16327612-8002-548a-216d-b2829ce40a25.png "kobito.1424009217.178040.png")
「受注」が親エンティティ、「受注明細」が子エンティティです。「受注明細」の主キーに、「受注」の主キーである「受注ID」が含まれています。このため、このリレーションシップは依存リレーションシップとなります。
非依存リレーションシップの例
![kobito.1424009300.434532.png](https://qiita-image-store.s3.amazonaws.com/0/59354/ed8ce3ef-792a-35c4-d5a6-b8e610ac808f.png "kobito.1424009300.434532.png")
「受注明細」の主キーは、「受注」の主キーである「受注ID」を含みません。(「受注ID」は単なる外部キー) このため、このリレーションシップは非依存リレーションシップとなります。
Scala


## 基本型

|型|説明|
|---|---|
|String|文字列|
|Char|文字|
|Boolean|真偽値|
|Byte|8bit整数|
|Double|倍精度浮動小数|
|Float|単精度浮動小数|
|Long|64bit整数|
|Int|32bit整数|
|Short|16bit整数|

## リテラル

文字列

```
val msg = "World"
val hello = s"Hello, ${msg}"
val longMsg = """
こんにちは
"aiu"
"""
println(hello)
```

## 関数定義

```scala
def msg(str:String): String = "Hello, "+str

msg("world") // "Hello, world"
```

### 関数リテラル

Ruby の ```->``` に近い

```Scala
val printMsg = (msg: String) => println(s"Hello, ${msg}")
printMsg("World") // Hello, world
```

## クラス定義

```scala
class Hoge {
  val constant:Boolean = false
  var member:Int = _
  var member2:Option[String] = _
}

new Hoge
```

### キャスト

```scala

Any#asInstanceOf[型]
```
## object

クラスの定義とインスタンスの作成を行う(シングルトンオブジェクト)

```scala
object HelloWorld {
  def msg {
    println("Hello, World")
  }
  def main(args: Array[String]) {
    msg
  }
}
```

main メソッドがエントリポイント。
インタプリタを実行すると次のとおり。

```shell-session
$ scala HelloWorld.scala
Hello, World
```

### if

3項演算子として使う

```scala
if (x) 1 else 0
```

### パターンマッチ

```scala
var x = "a"
x match {
   case name: String => println("name = " + name)
   case num: Int => println("num = " + value)
   case _ => println("any = " + x)
}
```

## コレクション

### List

immutable なリスト

```scala
List("foo", "bar") // List[String] = List(foo, bar)
List("1", 2, 3.0)  // List[Any] = List(1, 2, 3.0)
"1"::2::3.0::Nil // List[Any] = List(1, 2, 3.0)
```

head, tail, init, last, ::, +: , :+, apply

```scala
val sc = List(1, 2)
sc.head // 1
sc.tail // List(2)
sc.init // List(1)
sc.last // 2
3::sc // List(3, 1, 2)
3+:sc // List(3, 1, 2)
sc :+ 3 // List(1, 2, 3)
sc.apply(1) // 1
sc(1) // 1
```

:::, reverse

```scala
sc ::: sc // List(1, 2, 1, 2)
sc.reverse // List(2, 1)
```

sum, product, max, min

```scala
sc.sum // 3
sc.product // 2
sc.min // 1
```

### Array

muttable なリスト

Ruby の ```Array``` と同じイメージ	

```scala
val array = Array(1, 2, 3) // Array[Int] = Array(1,2,3)
array(1) = 0
array // Array[Int] = Array(1, 0, 3)
```

### Range

Ruby の ```1..10``` と同じ

```scala
1 to 10 // Range(1, 10)
for ( v <- 1 to 3 ) {
  println("v = " + v)
}
```

### filter

リストから条件に合致した値のリストを作成する

Ruby の select に近い

```scala
val list = List(1, 2, 3, 4, 5)
list.filter(n => n % 2 == 1) // List[Int] = List(1, 3, 5)
```

### map

map内の関数値を含むコレクションを返す

```scala
var list = List("1", "2", "3")
list.map(_.toInt)  // List[Int] = List(1, 2, 3)
```

### foreach

値は返さない

```scala
(1 to 10).filter(n => n % 2 == 1).foreach(n => println(n))
```

## Options

値を持つか持たないかをわからない状態を管理するもの。
ORマッパーの型定義として使われることがおおい

Option[型]

```
Option[型] = Some(値)
Option[型] = None = Option[Any](null)
```

```scala
foo match {
   case Some(v) => v
}
```

変数vにSomeの中身が束縛されて取り出せる

もしくは getOrElse を使う。

```scala
scala> val foo = Option[Int](1)
foo: Option[Int] = Some(1)
scala> foo.getOrElse(0)
res0: Int = 1
```

Noneは値が設定されていない状態をしめす
Some(x) は値が設定されている状態をしめす。

```scala
scala> None.getOrElse(1)
res2: Int = 1

scala> Option[Any](null)
foo2: Option[Any] = None

scala> Some(1000).getOrElse(1)
res3: Int = 1000
```
Laravelの4.x系をcomposer経由でインストール


いつの間にか5.x系、本リリースされてたんですね。
普通にcomposerで突っ込むと、5.x系が選択されてファッ！？ってなるので、まだ5.x系情報少ないしちょっとなー、っていう人は以下で。

```shell
$ composer create-project laravel/laravel your-project-name "4.*" --prefer-dist
```

これで、4.x系の最新版(2015/02/15時点でv4.2.11)でプロジェクトが作成されます。

5.x系はなんか色々変わってて、個人的にはうーん…？って感じでした。
Boxの素の作り方メモ

# はじめに
Boxの素となる環境を自作した時のメモ。
LinuxMint 17.1 64bit xfceで試しました。

# 手順

1. OSをインストール。
    * vagrantユーザーのパスワードはvagrant

2. rootユーザーのパスワードをvagrantに設定

    ```
    sudo su -
    passwd
    ```

3. パスワードなしでsudoできるように。

    ```
    echo "vagrant ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
    ```

4. 公開鍵を追加

    ```
    mkdir ~/.ssh
    wget -O ~/.ssh/authorized_keys https://raw.githubusercontent.com/mitchellh/vagrant/master/keys/vagrant.pub
    chmod 0600 ~/.ssh/authorized_keys
    ```

5. sshインストール

    ```
    sudo apt-get install openssh-server
    sudo service ssh restart
    ```

6. Guest Additionsインストール

    ```
    sudo ./VBoxLinuxAdditions.run
    ```

7. 仮想マシンの設定は終了。シャットダウンしとく。

    ```
    shutdown -h now
    ```

# まとめ
これを素にすれば、GUIが使えるBOX完成。
Linuxに慣れてないからGUIが使える使い捨て環境がほしかった。
これでLinuxでいろいろと遊べそう。
Starling用の回転テクスチャ入りスプライトシートをFlashから書き出す

Starling1.5以降では、画像を回転させてスプライトシートに格納する処理に対応している。
のだが、Flash側が対応してくれない。

![image](https://qiita-image-store.s3.amazonaws.com/0/7085/6d6751c1-bacb-8ce4-ee58-6df434835077.png)

スプライトシートの書き出し処理は、インストールしたFlashのCommon/Configuration/Sprite Sheet Pluginsフォルダのjsflファイルで管理されているので、これを編集すれば手動で対応することができる。

まずStarling.plugin.jsflを開いて、pluginInfo.capabilitiesのcanRotateをtrueにする。
これだけで回転のチェックボックスが有効化して、Flash側で再配置してくれるようになる。

```js,Starling.plugin.jsfl
	pluginInfo.capabilities = new Object();
	pluginInfo.capabilities.canRotate = true;
	pluginInfo.capabilities.canTrim = true;
	pluginInfo.capabilities.canShapePad = true;
	pluginInfo.capabilities.canBorderPad = true;
	pluginInfo.capabilities.canStackDuplicateFrames = true;
```

各セルの配置についての情報はframeExport関数のframeに返ってきて、プロパティを見ながらそれぞれのファイルフォーマットに変換される。
Starling1.5以降では\<SubTexture\>要素のrotated属性が設定されているものを回転済みテクスチャとして扱うので、他の属性追加処理と同じ要領で追加しよう。

```js,Starling.plugin.jsfl
	if (frame.rotated != false) {
		s += '" rotated="' + frame.rotated;
	}
```

これでFlashからも回転テクスチャ付きのStarling用スプライトシートが書き出せるようになりました。よかったね。
あまり大した恩恵ではないけど、やって損はないので有効にしておくのがオススメ。
Windows8.xで日本語入力が毎回ONになる問題解決編

症状：ブラウザなど入力エリアに移動するたびに毎回日本語入力状態になってしまう。
ログインフォームのユーザIDなどで起こるとたいへんイライラしますね。

ここに来た人はおそらく「アプリ ウィンドウごとに異なる入力方式を設定する」などの設定を試していることと思います。
それをやってもダメだったのでいろいろ試していたところ次の方法でうまくいったので共有します。

対策：タッチキーボードの標準キーボードを有効にして、半角/全角キーをタッチ・クリックして日本語OFF状態にしておく。

手順：下記リンクを引用します。
＞
Windows 8の場合
「PC設定の変更」→「全般」→「タッチキーボード」欄の「ハードウェアキーボードに準拠したレイアウトを使えるようにする」

Windows 8.1の場合
「PC設定の変更」→「PCとデバイス」→「入力」→「ハードウェアキーボードに準拠したレイアウトをタッチキーボードオプションとして追加する」

標準キーボードが追加されたら、一度入力欄で、タッチキーボードを開き、標準キーボードを選択します。
日本語入力状態になっている場合は半角・全角キーを押下します。
これでタッチキーボードをいじらない限りは再現しなくなるはずです。

参考リンク
121ware.com > サービス＆サポート > Q&A > Q&A番号 014211
http://121ware.com/qasearch/1007/app/servlet/relatedqa?QID=014211
sed力を0からせめて１に上げる


## ゴール

ワンライナーで使えそうなsed技術を身につける

## 基礎学習

sed入門 - ドットインストール
http://dotinstall.com/lessons/basic_sed/


## sedの基本フォーマット

sed [option] command

- sed -e 's/old/new/g'みたいな感じで置換すると思うが's/old/new/g'部分がまさにコマンド部分
	- /を区切り文字に使う必要はない(\又は改行以外なら使えるっぽい)
	- パスを置換するような時に/以外を区切り文字に使う事でエスケープの手間を省ける
- commandには置換のsコマンド以外にも色々ある

## 使いそうなオプション

|オプション|説明|
|:-:|:-:|
|-i[拡張子]|sedによって加工した変更を入力ファイルに反映する. -iがない場合は標準出力に書かれる.拡張子を指定すると指定した拡張子でバックアップをとっておける|
|-E又は-r|[拡張正規表現](http://ja.wikipedia.org/wiki/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE#Extended_Regular_Expression)を使用する|

## 使いそうなコマンド

|コマンド|説明|
|:-:|:-:|
|s|文字列の置換|
|y|文字の置換|
|d|文字の削除|
|i|文字列の挿入|

- その他にも色々ある

## コマンド使用例

- yによる文字の置換

```bash
$ cat alpha.txt 
abcdefg
hijklmn
opqrstu
vwxyz
$ sed 'y/az/AZ/' alpha.txt 
Abcdefg
hijklmn
opqrstu
vwxyZ
```

- dによる列削除

```
# 3行目だけを削除
$ sed '3d' alpha.txt
abcdefg
hijklmn
vwxyz
```

## アドレス機能

- アドレスを使ってコマンドの操作対象を指定できる
- 指定しなければ全ての行に対してコマンドが作用する

```
# 3行目だけを削除
$ sed '3d' alpha.txt
abcdefg
hijklmn
vwxyz
```

- $は最後の行を表す
- !は指定したアドレス以外にコマンドを実行する際に利用する

```
# 3行目以外を削除
$ sed '3!d' alpha.txt
opqrstu
```

## 正規表現にマッチした部分を参照する

- &は正規表現にマッチした部分全体として参照出来る

```bash
$ echo 1236 | sed -E 's/[1-3]+/[&]/g'                
[123]6
```

- &を二つ使ったりも出来る

```bash
$ echo 1236 | sed -E 's/[1-3]+/[&][&]/g'
[123][123]6
```

- 正規表現にマッチした一部分を\1, \2といった形で参照出来る

```bash
echo 123678 | sed -E 's/([1-3]+)([6-8]+)/[\1][\2]/g' 
[123][678]
```

## 手を動かす

sedに限ったものではないけど、演習問題が沢山あるので手を動かす題材に使える
[シェル芸勉強会スライド一覧 - 上田ブログ](http://blog.ueda.asia/?page_id=684)

## こんな時どう書くか

特定の範囲の行を削除する

```
$ sed '2,3 d' alpha.txt
abcdefg
vwxyz
```

特定のパターンにマッチする行を削除する

```
$ sed '/^hij/ d' alpha.txt
abcdefg
opqrstu
vwxyz
```

- sed力があがったらまた追加する

## 引用/参考URL

[共通テーマ: 実例でわかる sed 第 1 回](http://www.ibm.com/developerworks/jp/linux/library/l-sed1/)
[共通テーマ: 実例でわかる sed 第 2 回](http://www.ibm.com/developerworks/jp/linux/library/l-sed2/)
[SED マニュアルページ](http://linuxjm.sourceforge.jp/html/GNU_sed/man1/sed.1.html)
[sed コマンド](http://hydrocul.github.io/wiki/commands/sed.html)
[Sed - An Introduction and Tutorial by Bruce Barnett](http://www.grymoire.com/Unix/Sed.html)
[シェル芸勉強会スライド一覧 - 上田ブログ](http://blog.ueda.asia/?page_id=684)
WebRTCをFireFoxで使うときに、いちいちチェックしなくてよくなるやつ。

about:configして
media.navigator.permission.disabledで設定するピヨ。


SADAME:
![150225-0001.jpg](https://qiita-image-store.s3.amazonaws.com/0/26030/bfbfabd3-7b60-0faf-5aee-f4ea041ea951.jpeg)
VMware vCenter 6からは分散インストールがサポートされないらしい！？

VMware Blogの2015/2/9の記事"[vSphere 6 – Clarifying the misinformation](http://blogs.vmware.com/vsphere/2015/02/vsphere-6-clarifying-misinformation.html)"でとっても気になる記述を発見したのでメモ。

> Separating functions or distributed installations. Starting with vSphere 6 all vCenter Server services such as the vSphere Web Client, Inventory Service, Auto-Deploy, Syslog Collector, Network dump collector, etc. are installed on the same server as the  vCenter Server. During an upgrade if any of these services are installed on different servers the upgrade will pull the configuration from these services and apply it to the service installed on the vCenter Server. There is no longer a way to run these components on a different server from vCenter Server. The exception to this is vSphere Update Manager (VUM), it is still a separate installation and can be installed on a different server, in the case of the vCenter Server appliance VUM must be installed on a windows server and registered with the vCenter Server appliance as VUM is a windows only service.

つまり、5.xで実施できたようなvCenterの各種サービス（Inventory Service, Auto Deploy, Syslog, Dump Collectorなど）をvCenter Serverサービスがインストールされたサーバーと別のサーバー（OS）にインストールする分散インストールは、vCenter 6.xではサポートされないということです。
さらに、もし5.xからアップグレードすると、分散インストールされた各種サービスはvCenter Serverサービスがインストールされたサーバーに集められるとのこと。

さて、来週からインストールするvCenter Server 5.5は全部のサービスを1台にインストールしておこうかな。アップグレードしやすいように。
ฅ(・ω・ฅ) { ⏳ Ruby と figlet コマンドでカウントダウン ⏳ }

## :hourglass_flowing_sand: 概要
Ruby と figlet でカウントダウン

## :hand: 前提

figlet コマンドをインストール。大抵は標準的なパッケージ管理でインストールするだけです。

### Ubuntu
~~~
$ apt-get install figlet
~~~

### Cygwin
~~~
$ apt-cyg install figlet
~~~

## <i class="fa fa-clock-o" style="font-size:1em;"></i> サンプル

~~~ruby:count_down.rb
second = ARGV[0] || 10
second = Integer(second)
second.times do
  system("clear")
  system("figlet #{Time.now.strftime("%H:%M:%S")}")
  sleep 1
end
system("clear")
system("figlet Finish")
~~~

## <i class="fa fa-video-camera" style="font-size:1em;"></i> 試行

![count_down.gif](https://qiita-image-store.s3.amazonaws.com/0/43480/0190c0c4-d7eb-5f2a-9015-543958905834.gif)

## :memo: 補足
`ฅ(・ω・)つシェル芸`
という意見は残念ながら受け付けません
bash-completionで ssh コマンドなどの補完を強化してみる

## Qiitaを眺めていたら
http://qiita.com/kiida/items/3beb1bf718cdc2f0798a さんの記事で bash-completion が紹介されていたので入れてみたｗ

## bash-completion って？
名前から察し…な感じですが bashコマンドの補完をできるようになるパッケージです。つかたとえば ssh でホスト名を指定するとき（/etc/hosts 定義してあるとする）、いちいち /etc/hosts みてホストを…なんて面倒なを ssh + tab ってやると /etc/hosts にあるホスト名がずらずらってでます。※tar コマンドも補完できるぜ

## インストール
yum で入れるだけ（epelレポジトリが必要です）。

```
$ sudo yum -y install bash-completion
```

## 使ってみる
```ssh ```とコマンドを打ってtabを押下とか、``` ls --```とコマンドを打ってtabを押下とか。
まあ便利そうな感じでござる。

## 参考にさせて頂きました
> [bash-completionでserviceコマンドなどの補完を強化しよう](http://heartbeats.jp/hbblog/2013/06/bash-completion.html)
rlwrap を使って SQL*Plus を KAITEKI にする方法（mysqlもいけるぜｗ）

## [rlwrap](http://linux.die.net/man/1/rlwrap) って？
readline をラップしてコマンド履歴や補完を使えるようにするコマンドです。要するにbash（とか）使っていてコマンド履歴（↑↓）使いたいけど sqlplus を起動すると使えなくなって寂しい思いしているのを使えるようにできるのです。

こんな感じで、↑ 押下するとなるよねｗ
![rlwrap-01.png](https://qiita-image-store.s3.amazonaws.com/0/44540/2b69ad94-3c00-fcdf-069c-d2e1c26fe10f.png)

## インストール
yum で入れるだけ（epelレポジトリが必要です）。

```
$ sudo yum -y install rlwrap
$ yum list | grep  rlwrap
rlwrap.x86_64                              0.42-1.el6                   @epel  
```

## 使い方
```rlwrap -pRed sqlplus /nolog``` とコマンドを打って、↑押下してみる。

いい感じに使えるねｗ
![rlwrap-02.png](https://qiita-image-store.s3.amazonaws.com/0/44540/4fdfd42e-d7bb-8aaf-eb37-2a6cbcda5302.png)

なので .bash_profile とかにでも alias 設定をしておきます。

```
alias sqlplus='rlwrap -pRed sqlplus'
```

## 辞書も使えるらしい。
sel と入力して tab で補完できるrlwrap_extというsqlplus用の辞書をいれてみる。
http://www.linuxification.at/rlwrap_ext.html.en から最新(Version 12.1.0)の辞書をインスコします。

```
$ mkdir rlwrap-extensions
$ cd rlwrap-extensions
$ wget http://www.linuxification.at/download/rlwrap-extensions-V12-0.01.tar.gz
$ tar xvfz rlwrap-extensions-V12-0.01.tar.gz 
```

で、

```
$ rlwrap -pRed -if ~/rlwrap-extensions/sqlplus sqlplus /nolog
```

と実行し、sel と入力して tab を押下してみる。

![rlwrap-03.png](https://qiita-image-store.s3.amazonaws.com/0/44540/34734178-d81b-6958-9af8-141ac7ab68fe.png)

## MySQL でも rlwrap を使ってみる
```rlwrap -a -pGREEN mysql -uroot``` とうってみる。
Docker Private Registry を AWS Elastic Beanstalk で動かす

現在、一部のイメージファイルのアップロードで失敗しています。
多分、ファイルサイズの大きなイメージアップロード時にコケていると思うのですが…

コイツかな?(調査中) → https://github.com/docker/docker-registry/issues/916

---

# Docker Private Registry for AWS Elastic Beanstalk

## これは何？
Docker Private Registry を [AWS Elastic Beanstalk](http://aws.amazon.com/jp/elasticbeanstalk/) に簡単に開始できる
インストールするもの: [docker/docker-registry](https://github.com/docker/docker-registry)


## どんな時に使うと良い？
* 毎回buildは面倒なので、イメージを格納する場所が欲しい
* DockerHubにイメージ置けるけど、公開したくない内容がDockerfile始めプロジェクトに含まれる
* DockerHubのプライベートリポジトリーを利用しようにも、オンプレでないと社内のセキュリティ部門を通せない
* DockerHub Enterpriseもあるけど、お金が…
* S3にイメージを置いておけば、AWS内通信であれば高速にDeployできる！？（まだやってません。その内、試す予定です。）


## デプロイ方法
### 1. S3に接続可能なIAM Userを用意する
IAM Userの作成については、[コチラ](http://qiita.com/mikoto/items/699e94b4a342f03935d4)を参照。
AmazonS3FullAccessなどのS3にアクセス可能なポリシーが付与されていればOK
アクセスキーを下記で使用するので、アカウント作成時に生成するようにチェックし、保存しておくこと。

### 2. イメージなどの情報保存先のS3 Bucketを作成
1. [S3 Management Console](https://console.aws.amazon.com/s3/home)へ移動する
2. **Create Bucket**を選択する
3. 任意の名前を入力し、バケットを作成する（ここで設定したバケットネームを以下で使用します）


### 3. AWS Elastic Beanstalk アプリケーションの立ち上げ
1. [Elastic Beanstalk Management Console](https://console.aws.amazon.com/elasticbeanstalk/home)へアクセスする
2. **Create New Application**を選択する
3. アプリケーション名を入力して「次へ」
4. Environemtn tire = Web Server, Predefined configuration = Docker を選択  
  （Environment typeは何でも良いが、ここでは Single instance を選択）  
  ![Create_Environment.png](https://qiita-image-store.s3.amazonaws.com/0/40983/add8599c-bc52-46a7-2751-5dfc25b9eb6b.png)
5. Dockerfileのアップロード  
下記の内容で、Dockerfileという名前のファイルを作成し、Amazon Elastic Beanstalk にアップロードする

```sh:Dockerfile
FROM registry

ENV SETTINGS_FLAVOR s3
ENV STORAGE_PATH /registry
ENV SEARCH_BACKEND sqlalchemy

EXPOSE 5000
CMD ["docker-registry"]
```

### 4. 環境変数の設定
![etr-docker-registry-env_-_Configuration.png](https://qiita-image-store.s3.amazonaws.com/0/40983/61e46275-8296-10b7-746c-a60625ea6678.png)

* 左メニューの**Configuration**を選択
* **Software Configuration**を選択
* 下記の環境変数を入力
    * ***AWS_ACCESS_KEY_ID***: 1.で作成したIAMアカウントのAccess Key Idを入力
    * ***AWS_SECRET_KEY***: 1.で作成したIAMアカウントのSecret Access Keyを入力
    * ***AWS_BUCKET***: 2.で作成したバケットの名前を入力

完了！
勝手にインスタンスの再配置が実行されます。


### 注意点
* 通信状況と選択したインスタンスサイズによっては、初回起動時にタイムアウトで終了することがある
* タイムアウトしてしまった場合は、**Configuration** > **Updates and Deployments**からタイムアウト時間を伸ばして再度Deploy


## 使ってみよう
イメージのpushの方法は[コチラのQiita記事](http://qiita.com/megmogmog1965/items/0c9a95bcf7f054f5c065)を参照

## 参考
* docker-registry | GitHub
    * https://github.com/docker/docker-registry
* docker-registry | DockerHub
    * https://registry.hub.docker.com/_/registry/
* Dockerデーモンによる通信がデフォでHTTPSなので、push時に怒られる
    * http://qiita.com/esmjp/items/3e6a59ab5e5dfaa91494
テストレベル

#テストレベル

ソフトウェアの開発工程モデルや、テストの目的、テストの対象、
参照するテストベース(インプットとなるドキュメント等)などにより、
テストのレベルを設定する。

V字開発モデルでは主に以下のレベルでテストを分類する。
・単体テスト
・結合テスト
・システムテスト
・受け入れテスト

##1.単体テスト

ユニットテスト(UT)、コンポーネントテスト、プログラムテスト、モジュールテストとも呼ばれる。
テストが可能な最小部品単位(ソフトウェア、モジュール、クラス、メソッドなど)に分割し、
一つ一つの部品が期待通りに動作することを確認するテスト。
システムの他の部分から切り離したテストが可能であり、
その場合、スタブやドライバ、シミュレータなどを使う。

また、自動化ツールを用いて自動化されたテストのことを指す場合もある。

##2.結合テスト

インテグレーションテスト(IT)、統合テスト、連結テストとも呼ばれる。
単体テストで確認した部品を、システム内の他の部品、OS、ファイルシステム、
ハードウェアなどと組み合わせた場合の相互処理や、
他システム間とのインターフェースを確認するテスト。

結合テストは適用範囲の分類により、以下のように分類できる。
・インターフェースに特化したテスト
・結合した状態でのブラックボックステスト

また、結合テストは実施方法により、以下のように分類できる。
・トップダウンテスト
・ボトムアップテスト

###2.1.インターフェースに特化したテスト
単一モジュールの確認は単体テストで完了しているので、
インターフェースのプロトコルやメッセージのやりとりに特化して確認するテスト。
シーケンス図などに従った入出力において、正しいパターンやあり得ないパターンの通信を
受けた時の動作が妥当かどうかを確認する。

###2.2.結合した状態でのブラックボックステスト
単一モジュールを、他のモジュールとの連動や組み合わせによって表現される機能に対してのテスト。
あるモジュールが出した命令を受けて、期待通りに次のモジュールが動くこと、
正しい通信を返すこと、期待通りの性能を発揮することなどを確認する。

###2.3.トップダウンテスト
上位モジュールからテスト対象を呼び出して動作を確認するテスト。
下位モジュールには必要な値を返すだけの仮モジュール(スタブ)を使用する。
メインモジュールやモジュール間インターフェースに対して、早い段階でのテストが可能となる。

###2.4.ボトムアップテスト
モジュール構造において、上位にあたるモジュールを仮生成して下位モジュールから呼び出すテスト。
上位のモジュールにはテスト対象を呼び出す仮モジュール(ドライバ)を使用する。


##3.システムテスト
最終的なシステム構成や運用、構成データと可能な限り同じ環境で、
操作マニュアルや機能要件、非機能要件などの要求仕様の確認をするテスト。
システムテストには、リスク、または ビジネスプロセス、ユースケース、その他システム動作を高レベルで記述したテキストもしくはモデル、オペレーティングシステムとの相互作用、システムリソースなどの要求仕様に基づいたテストがある。


##4.受け入れテスト
受け入れテストは、システム全体または一部や、非機能的な特性が正しいことを確認するテストで、
システムを使う顧客やユーザが実施することが多い。

受け入れテストは以下の形がある。
・ユーザ受け入れテスト
・運用受け入れテスト
・契約による受け入れテスト
・アルファテスト
・ベータテスト(フィールドテスト)
AVFoundation が対応する拡張子を集合形式で取得する


AVFoundation が対応する種類は `[AVURLAsset audiovisualTypes]` で取得できるが、UTI 形式なのでこれを拡張子として取得するコードを書く

## 実装

`UTTypeCopyPreferredTagWithClass` で UTI から拡張子を取得できるので、`[AVURLAsset audiovisualTypes]` からそれぞれ UTI を拡張子に変換して集合にする

```objc
/* ARC 前提 */
static NSSet *supportedExtensionsByAVFoundation() {
    NSArray *supportedUTITypes = [AVURLAsset audiovisualTypes];
    NSMutableSet *supportedExtensions = [NSMutableSet setWithCapacity:[supportedUTITypes count]];
    for (NSString *supportedUTI in supportedUTITypes) {
        /* UTI 形式から拡張子を取得 */
        NSString *extension = (__bridge_transfer NSString *) UTTypeCopyPreferredTagWithClass((__bridge CFStringRef) supportedUTI, kUTTagClassFilenameExtension);
        if (extension != nil) {
            [supportedExtensions addObject:extension];
        }
    }
    return supportedExtensions;
}
```

この場合音声形式と動画形式両方取得出来てしまうので、どちらか片方のみにしたい場合は `UTTypeConformsTo` を使う

```objc
/* 取得した UTI は動画形式であるか？ */
UTTypeConformsTo((__bridge CFStringRef) supportedUTI, kUTTypeVideo);
/* 取得した UTI は音声形式であるか？ */
UTTypeConformsTo((__bridge CFStringRef) supportedUTI, kUTTypeAudio);
```

iOS で使う場合は `MobileCoreServices.framework` をリンクする必要がある

## Apple が提供する UTI について

UTI (Uniform Type Identifiers) とは Apple が採用する MIME の代替として作られた識別子の形式であり、`UTTypeConformsTo` からわかる通り継承の概念を持つ

 - [Introduction to Uniform Type Identifiers Overview](https://developer.apple.com/library/ios/documentation/FileManagement/Conceptual/understanding_utis/understand_utis_intro/understand_utis_intro.html)
 - [System-Declared Uniform Type Identifiers](https://developer.apple.com/library/ios/documentation/Miscellaneous/Reference/UTIRef/Articles/System-DeclaredUniformTypeIdentifiers.html)
 - [Uniform Type Identifier](https://developer.apple.com/library/ios/documentation/General/Conceptual/DevPedia-CocoaCore/UniformTypeIdentifier.html)
nodejsでI/O blockがあるnative addonを作る

# 目的

nodejsはC++でnative addonを作成できます。今回作成したかったのはネットワークパケットをキャプチャしてそれを分析した結果を返すモジュールでした。要件を落としこむとこんな感じです。

- I/O blockが発生する。かなり頻繁で多い時は100k/sec以上と見積もるが、一方で数秒間何も起きないという状況もありえる
- 分析自体にもそれなりに負荷がかかるので分析結果を得るまではC++で計算したい
- I/Oで読み込むたびにコールバックするわけではい。おおよそ1 call/1000入力ぐらい
- 分析結果はコールバックでJavaScriptの世界に戻す

結論から言うと、`uv_queue_work`を再帰的に呼び出すという方式を使いました。

# 戦略

この機能要件を考えると以下の様な戦略が思いつきました。

1. C++で作成した別プロセスを起動してパイプ処理で随時結果を受け取る
2. I/OのファイルディスクリプタをJavaScript側で監視して読み込み可能になったらnative moduleに処理を戻す
3. native module内部でblockして必要なときだけJavaScript側にコールバックする

どれも実装としては可能ですが、今回は3を選びました。1, 2の不採用理由は以下のとおり。

1. Nodeのaddonフレームワークに実行可能形式のバイナリを作成方法が見当たらなかった
2. I/Oが100k/secとか発生するので、そのたびにいちいちJavaScript側とnative module側を行き来したくなかった

# 実装方法

Nodeではnative moduleを作成する際に `uv_queue_work` という非同期処理用の関数が用意されています。これを使うと別スレッドで処理が実行されますが、基本的には `uv_queue_work` は非同期処理の関数と処理終了後に呼び出される関数の2つしか登録できず、非同期処理の関数からJavaScript世界に干渉しようとする（例えばコールバックを呼び出す）ことができません。

なので、方針としてはコールバックを呼び出すために毎回非同期処理を抜ける必要があります。

1. コールバックを登録する
2. `uv_queue_work`を非同期処理関数 `run_work`、終了後処理関数 `after_work` を指定して呼び出す
3. `run_work`内でI/O待ちの処理および分析をする
4. イベントとして上げるべき結果がでたら `run_work` を抜ける
5. `run_work`終了後に呼び出される`after_work`でコールバックを呼びだし、その直後に再度 `uv_queue_work` を呼び出して非同期処理に入る
6. 3に戻る

部分的なコードは以下のとおりです。

```cpp
  void NodeIoAsync::run_work (uv_work_t *req) {
    // 本来はここでI/Oブロックや分析の処理を書く                                                                                                              
    NodeIoAsync *sw = static_cast<NodeIoAsync*>(req->data);
    usleep(100000);
    sw->c_++;
  }

  void NodeIoAsync::after_work (uv_work_t *req, int rc) {
    v8::HandleScope scope;

    NodeIoAsync *sw = static_cast<NodeIoAsync*>(req->data);
    v8::Local<v8::Value> argv[1];
    argv[0] = v8::Number::New(sw->c_);                                                                                                                        
    v8::Local<v8::Function> cb = v8::Local<v8::Function>::New(sw->callback_);
    cb->Call (v8::Context::GetCurrent()->Global(), 1, argv);
    cb.Clear();

    // 再帰的に呼び出す                                                                                                                                       
    uv_queue_work(uv_default_loop(), req, run_work, after_work);
  }

  // 開始                                                                                                                                                     
  v8::Handle<v8::Value> NodeIoAsync::Start (const v8::Arguments &args) {
    v8::HandleScope scope;
    NodeIoAsync * sw = node::ObjectWrap::Unwrap <NodeIoAsync> (args.This ());
    uv_work_t *req = new uv_work_t;
    req->data = sw;
    uv_queue_work(uv_default_loop(), req, run_work, after_work);
    return scope.Close(v8::Undefined());
  }
```

コード全体はgistに貼ってあります。
https://gist.github.com/m-mizutani/dd39b53eca1992647ba6
JS50行で書けるSlideShareリモコン

![アプリ側](https://qiita-image-store.s3.amazonaws.com/0/26475/1dce483f-2ea0-791b-8345-aba926e7364c.png)
コントローラーアプリの画面

![スライド側](https://qiita-image-store.s3.amazonaws.com/0/26475/100dd950-819e-afb1-3e4f-f64c9dbb929d.png)
動かす対象になるスライド系サービス

# 前略
1. [アプリからページめくりができるOSS](https://github.com/shogochiai/slidemilk)を作った
2. [専用ガジェット](http://www.amazon.co.jp/gp/product/B00D63BIAO/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=B00D63BIAO&linkCode=as2&tag=hase0023-22)は最低3000円するし失くすから作った
3. [頭良さそうにTED風プレゼンをする方法](https://www.youtube.com/watch?v=ToJD5r2SmwI)でドヤ顔するときに便利

# 材料
- nodejs
- milkcocoa-node
- Monaca(Apache Cordova)
- selenium-webdriver

# 仕様
## クライアントアプリ(コントローラー)
- Monacaから吐き出したアプリに「進むボタン」「戻るボタン」を設置
- ボタンを押すとmilkcocoaのrightBtnServer/leftBtnServerにsendAPIを実行

## サイトを操作するエージェント
- milkcocoa-nodeでsendイベントを受け取って、selenium-webdriverで矢印キーの左右イベントを強制的に発火

# 作り方

## アプリ側
![スクリーンショット 2015-02-15 21.31.08.png](https://qiita-image-store.s3.amazonaws.com/0/26475/2a136b00-0371-e898-49c2-f84a95758ecd.png)

(32行)

- こんな感じのViewとイベントリスナーを設置
- ほとんどMonacaのコードなので実際に書いたのは

```:html
    <div id="r" class="pull-right">▶︎</div>
    <div id="l" class="pull-left">◀︎</div>
    <script>
        var milkcocoa = new MilkCocoa("https://io-ai02l9tke.mlkcca.com");

        $("#r").click(function(e){
            milkcocoa.dataStore("rightButtonServer").send({});        
        });
        
        $("#l").click(function(e){
            milkcocoa.dataStore("leftButtonServer").send({});        
        });
    </script>

```

ぐらいですかね

## エージェント側

```:slidemilk.js

var webdriver = require('selenium-webdriver'),
    argv = require('argv'),
    MilkCocoa = require('./milkcocoa-node'),
    By = webdriver.By,
    milkcocoa = new MilkCocoa("https://io-ai02l9tke.mlkcca.com"),
    chromeDriver = new webdriver.Builder().usingServer('http://localhost:4444/wd/hub')
                        .withCapabilities( webdriver.Capabilities.chrome() )
                        .build();

chromeDriver.get(argv.run().targets[0]);

milkcocoa.dataStore("rightButtonServer").on("send", function(e){
    ( new webdriver.ActionSequence(chromeDriver) ).sendKeys(webdriver.Key.RIGHT).perform();
});

milkcocoa.dataStore("leftButtonServer").on("send", function(e){
    ( new webdriver.ActionSequence(chromeDriver) ).sendKeys(webdriver.Key.LEFT).perform();
});

```
[slidemilk.js](https://github.com/shogochiai/slidemilk/blob/master/slidemilk.js)

(18行)

- webdriverを起動
- ターゲットURLをChromeで開く
- sendイベントが来たらキーボードイベントを発火

※slidebean, reveal.jsベーススライド, google slideも全部これで操作可能

# 感想
- 初めは物理ボタンが必要かと思ってEdisonとか調べてた
- iWatchやAndroidGearが楽しみ
- WEB標準技術でプロトタイピングが済んでしまう
- エンジニアはどんどんサービスを価値検証して出資を受けたらいい

[shogochiai/slidemilk](https://github.com/shogochiai/slidemilk)