OmniAICreator/Qiita-1.07M huggingface dataset:
【超初心者】Reactで配列の値を.map()で展開する書き方

このページを参考に配列の値をpropsとしてそれを.map()で展開する書き方をまとめました。
[http://basic-react.axlight.com/html/lesson-07.html](http://basic-react.axlight.com/html/lesson-07.html)

## 環境

- Babel
- React
- ReactDOM

## 書いてみた

``` HTML:HTML
<div id="app"></div>
```


``` javascript:React
const items = [
  { name: 'AAA', color: 'black'},
  { name: 'BBB', color: 'blue'},
  { name: 'CCC', color: 'orange'},
  { name: 'DDD', color: 'green'},
];

const Hello = ({name, color}) => (
  <div>
    <p style={{ color }}>Hello {name}!</p>
  </div>
);

const App = () => (
  <div>
    {items.map((item) => (
      <Hello name={item.name} color={item.color} />
     ))}
  </div>
);

const render = ReactDOM.render(<App />, document.getElementById('app'));
render();
```

まだまだ勉強不足
cronの実行時間を見積もりするツールを作った（+ PyPIデビュー）

ちょっとした野暮用で小一時間で作ったPythonツールです。
せっかくなので、PyPIにも初めて登録したので、Qiitaでも紹介。
2017年になってcron使っている人は少ないかもしれませんが...

## どんなツールか

crontabで設定したクーロンが、指定した時間内にどの様に動くかをテキスト出力するツール。
複数サーバで、複数プログラムを串刺しに簡単に調べられます。 

もともとは、サーバメンテナンスで、cronの状況を確認する必要があり、さっと作りました。

### ソースコード

以下にあります。（スターがつくと喜びます）

* [PyPI](https://pypi.python.org/pypi/cronquot)
* [Github](https://github.com/pyohei/cronquot)

## 使い方

### インストール
```bash
pip install cronquot
```

### 実行方法

以下の様な感じでcrontabのデータをcrontabディレクトリ配下に用意し、`crontab -l`で出力したファイルを配置します。

```bash
$ cat crontab/batch.txt
*/30	*/10	11	*	*	/usr/local/bin/potato.sh
*/10	*/2	2	*	*	echo `date` >> /tmp/log.txt
```

以下の様な感じで実行すれば、result.csvファイルができて、確認できます。
引数で実行期間を指定できます。引数がなければ本日の0時〜24時になります。

* 開始は -sYYYYmmddHHMMSS 
* 終了は -eYYYYmmddHHMMSS

```
(venv)ShoheiMacBookPro:tmp shohei$ cronquot -s20170403100000 -e20170403120000
(venv)ShoheiMacBookPro:tmp shohei$ cat result.csv
date, hour, miniute, second, scrip, server
2017-04-03,10,10,00,echo `date` >> /tmp/log.txt,batch
2017-04-03,10,20,00,echo `date` >> /tmp/log.txt,batch
2017-04-03,10,30,00,/usr/local/bin/potato.sh,batch
2017-04-03,10,30,00,echo `date` >> /tmp/log.txt,batch
2017-04-03,10,40,00,echo `date` >> /tmp/log.txt,batch
2017-04-03,10,50,00,echo `date` >> /tmp/log.txt,batch
2017-04-03,11,00,00,/usr/local/bin/potato.sh,batch
2017-04-03,11,30,00,/usr/local/bin/potato.sh,batch
2017-04-03,12,00,00,/usr/local/bin/potato.sh,batch
2017-04-03,12,00,00,echo `date` >> /tmp/log.txt,batch
```

crontabディレクトリに複数ファイルを入れれば、まとめて見てくれます。
サーバを串刺しで見ることも可能です。
（`-d`でディレクトリを指定することも可能です）

### 注意

* cronの区切りはタブでないと使えません。  
  僕自身がタブで困らなかったので、特別機能追加してないです。  
  必要な方はPR出してもらえると助かります（issue上げてもらうと対応するかも）

## その他

自分用に作ったツールなので、バグってたらごめんなさい...
実行結果を見るツールは世の中に結構あるのですが、コマンドからサクって動くものが欲しかったので作りました。
やっぱり、ちゃんとPyPIに出そうと思って作ると簡単なツールでも神経をつかうなと感じました。
PyPIの使い方も、そのうち書こうかなと。
「test-unitはじめの一歩」というドキュメントを作った。

## test-unit使ってみたいな

[test-unit](http://test-unit.github.io)試してみたいけど、minitestやrspecみたいにbundlerで簡単にテストする手順がよくわからないな、、、初めて使うには敷居が高いぞ。

と思ってこんなドキュメントがあるといいのに、、とメンテナの須藤さんに相談したら

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/hiroysato">@hiroysato</a> よさそうなのでQiitaなんかじゃなくて公式ドキュメントに入れるのがいいんじゃないかと思いました！doc/text/getting-started.mdとかはどうですかねぃ！</p>&mdash; す (@ktou) <a href="https://twitter.com/ktou/status/840575952245547008">2017年3月11日</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

というコメントをいただいたので、作りました。

* [test-unitはじめの一歩](http://test-unit.github.io/test-unit/ja/file.getting-started.html) (日本語版)
* [First step of the test-unit](http://test-unit.github.io/test-unit/en/file.getting-started.html) (英語版)


ドキュメントの基本方針は、`rake test`ってやれば全部のテストを実行してくれる簡易機能の説明です。
須藤さんにはrakeを利用することについて、次のコメントをいただいています。
パラメータ渡しなどをしたくなったらオフィシャルのドキュメントを読んで設定をしてください。

<blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/hiroysato">@hiroysato</a> 自分が作っているライブラリーのtest/run-test.rbをベースに調整しています。Rakefileは単にtest/run-test.rbを呼び出すのがよいと思います。Rakeでテストを実行するのはパラメーターを渡しにくいので使い勝手はよくないですよ。</p>&mdash; す (@ktou) <a href="https://twitter.com/ktou/status/839467317494857728">2017年3月8日</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

## test-unitのいいところ(公式ドキュメントより)

Ruby 1.8に標準添付されていた頃と比べると以下のような機能が追加されています。

* テストが失敗したときに期待値と実測値のdiffを表示して違いをわかりやすく表示する機能
* テストの実行結果を色付けして見やすく表示する機能
* 環境依存のテストなど、必要のないテストを動的に判断して省略する機能
* 複数のsetupとteardownを設定する機能
* テスト毎ではなく、テストケース毎にテスト環境準備・後始末処理を呼び出す機能
* テストに属性を設定する機能
* テストの実行時間が長くなり、テストを実行する気がなくなってしまうことを防ぐために、うまい具合に実行するテスト数を間引いてテストの実行時間を削減する機能

## 参考

* [公式ドキュメント](http://test-unit.github.io/ja/index.html)
* [The history of testing framework in Ruby](https://slide.rabbit-shocker.org/authors/kou/rubykaigi-2015/)
  * RubyKaigi 2015のスライド
* [Rubyのテスティングフレームワークの歴史（2014年版）](http://www.clear-code.com/blog/2014/11/6.html)
【Unity】ビルドするとボタンが反応しない

１度ビルドしてからボタンを押しても反応しなくなりました
EventSystemを消してしまったわけでもありません

結局、Canvasが2つありそれが問題だったようです
役目が終わったほうのCanvasについている「GraphicRaycaster」コンポーネントをオフにしてやるようにスクリプトを組めば動くようになりました

![image](https://qiita-image-store.s3.amazonaws.com/0/69889/0a661268-1f87-413d-b631-f06f226cbdc4.png)

```C#
gameObject.GetComponent<GraphicRaycaster>().enabled = false;
```

ビルドするまで動いていたのは謎のままですが…

##参照
http://blog.alomarron.com/unity/ugui_touch_event
.mov を animated gif に変換する

iPhone や QuickTime などで撮った動画を github にアップロードしたい。が、 github は .mov をサポートしていない。

https://help.github.com/articles/file-attachments-on-issues-and-pull-requests/

じゃあということでサポートしている .gif 、動画なので animated gif に変換する。

なのだが、 ffmpeg 使えば一発。

```sh
brew install ffmpeg
```

で、次のように打つ。

```sh
ffmpeg -i <input movie file>.mov -r <frame rate> <output filename:>.gif
```

例としては次のように。

```sh
ffmpeg -i input.mov -r 24 output.gif
```

拡縮させたい場合
----------------

`-s` オプションを使う。

https://ffmpeg.org/ffmpeg.html#Video-Options

`-s <width>x<height>` という形で幅と高さを指定する。

```sh
ffmpeg -i input.mov -r 24 -s 160x160 output.gif
```

回転させたい場合
----------------

`-vf` オプションと `-metadata` オプションを使う。

https://ffmpeg.org/ffmpeg.html#Video-Options
https://ffmpeg.org/ffmpeg.html#Main-options

`-vf <rotate option> -metadata:s:v:0 rotate=0` という形で `-vf` オプションで回転、 `-metadata` オプションで回転情報のリセットをする。

```sh
# 90 度回転
ffmpeg -i input.mov -r 24 -vf transpose=1 -metadata:s:v:0 rotate=0 output.gif
# 180 度回転
ffmpeg -i input.mov -r 24 -vf vflip,hflip -metadata:s:v:0 rotate=0 output.gif
# 270 度回転
ffmpeg -i input.mov -r 24 -vf transpose=2 -metadata:s:v:0 rotate=0 output.gif
```

指定値の意味は次を参照。

| `<rotate option>` | 意味                      |
|-------------------|---------------------------|
| vflip             | 上下反転                  |
| hflip             | 左右反転                  |
| transpose=1       | 時計回りに 90 度回転      |
| transpose=2       | 反時計回りに 90 度回転    |

結果
----

<img alt="0" src="https://qiita-image-store.s3.amazonaws.com/0/27516/afa3f957-b869-5434-41ba-f49511f15143.gif">
<img alt="90" src="https://qiita-image-store.s3.amazonaws.com/0/27516/b1596dce-bea5-c0cf-9ab7-2599ffdf2666.gif">
<img alt="180" src="https://qiita-image-store.s3.amazonaws.com/0/27516/eb6866f9-fcff-c2f5-35c1-59fff39acd09.gif">
<img alt="270" src="https://qiita-image-store.s3.amazonaws.com/0/27516/f199e32e-c96b-bf16-a47a-f3e027244ac9.gif">
しゃちくマン、そして如何にして私は受託開発で心を燃やすのか

# サービスに当事者意識を持ちたいけど搾取だとも感じる
お客さんのサービスに当事者意識を持ってコミットしたい。
もちろん普段適当に仕事をするつもりはないし、サービスの結果にコミットしたいと思うのだけど、それをしたら上手く搾取されてるんじゃないかと思ってしまう。
だって私は当事者ではないのだから。
もちろん、当事者の定義を広げればそのサービスに関わる人すべてが当事者なのは間違いないと思う。

# そもそもとして望んでこの世に生まれてきていないし
生まれる国も家庭も何も選択して生まれてきていない。
資産家の家に生まれていたら今の仕事をしていただろうか？
していたかもしれないし、していなかったかもしれない。

# この構造の中でどうやって心を燃やして仕事をすればいいんだろうか
別に心を燃やす必要はないのかもしれない。
私は企画という抽象的で自由な仕事が具体的になっていく過程で降ってくる窮屈なタスクの雨を過不足なくこなして、日々の生活のお金を稼げばいいのかもしれない。
（隣の芝は青い的に事業企画を理想化し過ぎだとはわかっているけど・・・）
もちろん、その抽象から具体に落ちて行く一連の流れを感じて、私はその一端を担っているんだ！うおおおお！！と心を燃やすこともできるかもしれない。
むしろ、それがスタンダードな自分の納得のさせ方かもしれない。

# じゃあ自分でサービスを作ればいいだけじゃん
もちろんその通りだけど、日常の大部分を占める労働に何かしら思うところがあってもいいと思う。

# でも構造の中にいる自分を上の視点から見れているし（少なくともそうできていると思いたい
こうやって構造に囚われている自分を主体的（？）に認識できてるじゃん！
それってある意味自分を選択できるじゃん！
メタ認知最高！！
囚われたら囚われた自分を認識する→囚われた自分を認識する自分を認識する→囚われた自分を認識する自分を認識する自分を認識する！！
メソッド探索のようにどんどん上に昇ってどこかに辿り着けばいいんだあああ！！！！
TableViewのセルを２回タップしないと反応しない

# ２回タップしないと反応しない

いやまあ
よくよく見たら・・・

```
func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
     print("select %d", indexPath.row)
     performSegue(withIdentifier: "showDetailViewController",sender: nil)
}
```

didDeselectRowAtIndexPathに書いてた...
正解はdidSelectRowAt。
・・・恥ずかしい

```
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
{
     print("select %d", indexPath.row)
     performSegue(withIdentifier: "showDetailViewController",sender: nil)
}

```

### ちなみに。。。
didDeselectRowAtIndexPathは選択が解除された時に実行されるイベント
PHP ~　簡単なカレンダーアプリを作る(コードメモ)

イメージ
![スクリーンショット 2017-04-03 20.31.04.png](https://qiita-image-store.s3.amazonaws.com/0/152201/60270fe4-4443-9637-6a68-963315ab96b8.png)



```
<?php
  class Print_Calender extends Today_Calender {
      function space_cell($count){
        if ($count != 0){
          for ($i=0; $i <$count; $i++){
          echo "<td></td>";
        }
      }
    }
  }

  class Today_Calender {
    function today($day) {
      if (date("Y/m/d") == date("Y/m/d",mktime(0,0,0, date("n"),$day,date("Y")))){
        return "<b>".$day."</b>";
      } else{
        return $day;
      }
    }
  }

    echo "<h1>".date("F")."</h1>";
    echo "Today:".date("Y/m/d");
    echo "<br>";

    $weeks = array("Sun","Mon","Tue","Wed","Thu","Fri","Sat");
    echo "<table border=1><tr>";
    foreach ($weeks as $value){
      echo "<th>".$value."</th>";
    }

    echo "</tr><tr>";

    for ($i = 0; $i < date("t"); $i++){
      $week_number = date("w", mktime(0,0,0, date("n"), $i+1, date("Y")));
      if ($i == 0){
        echo "<tr>";
        Print_Calender::space_cell($week_number);
      } elseif ($week_number == 0){
        echo "<tr>";
      }
      // echo "<td>".($i + 1)."</td>";
      echo "<td>".Print_Calender::today($i + 1)."</td>";
      if ($i + 1 == date("t")){
        Print_Calender::space_cell(6 - $week_number);
        echo "</tr>";
      }
    }
    echo "</table>";
?>
```
Rubyで引数付きのクラスを作る

C++やJavaなど、静的型付けの言語ではテンプレートやジェネリクスのように、クラスに引数を渡して特殊化したものを作るということがよく行われます。Rubyは動的型付けの言語ですが、クラスに引数を渡すことができます。

# コード例
メジャーなところでは、Rails 5で、マイグレーションにバージョン引数を付けて、そのバージョンでの挙動を再現する、というような仕組みが作られています（[参照](http://y-yagi.tumblr.com/post/137935511450/rails-5%E3%81%8B%E3%82%89%E5%B0%8E%E5%85%A5%E3%81%95%E3%82%8C%E3%81%9Fmigration-versioing%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)）。

```rb
class CreateArticles < ActiveRecord::Migration[5.0]
  # 内容略
end
```

また、個人的に愛用している`ActiveType`（[参照](http://qiita.com/jkr_2255/items/271ed85e03c0ae27d5e5)）でも、特定のモデルクラスから派生した型を作りたい場合には、`ActiveType::Record[BaseClass]`というように書きます。

# 文法的には…どうなる？
これらを初めて見たときには、「こんなのが書けるんだ」や「文法的にどうなっているんだ」という感想を抱く人も多いでしょう。しかしながら、全ては通常のRuby文法の範囲内です。

0. Rubyでは、クラス自身も`Class`クラスのインスタンスという、プログラムで扱える対象となっています。
1. インスタンス生成に`.new`というクラスメソッドを使っているように、クラスメソッドももちろん作れます。
2. Rubyではクラスごとに演算子も定義でき、`[]`演算子もその対象となっています。

ということで、こういうクラスの実態は、`self.[]`を定義したクラス、なのでした。

# 実装にあたって
Railsのマイグレーションのように、「すでにあるクラスの中から選ぶ」という形であれば特に問題ないのですが、引数が完全に可変のクラスを作る場合、いくつか注意したいことがあります。

* まず、特定のクラスを継承したクラスを動的に作るには、`Class.new(基底クラス) { クラスの内容 }`という形になります（[るりま](https://docs.ruby-lang.org/ja/latest/method/Class/s/new.html)）。
* そして、作ったクラスはハッシュに入れて、同じ引数であれば同じクラスを返すようにしておきましょう。そうしないと、以下のようなトラブルのもととなってしまいます[^1]。
 * 同じクラスを使うたびに、クラスごと新しく作られて、不必要にリソースを消費する
 * 同じ引数で作った2つのクラスが一致しないので、型判定などが正しく行えない


[^1]: ActiveTypeはそうなっていないみたいだし、Issueを立てておこうと思いました。
phpldapadmin にuid でログインするための設定

phpldapadmin にuid でログインするためにphpldapadmin/config.php を以下のように設定する。bind_passは仮。

* fallback_dn をtrueにしないとrootDnで何もできなくなる。
* デフォルトではパスワード入力してハッシュ方法を選んでも生テキストのまま保存されるようなので、sshaを選択しておく。

```php
$servers->setValue('login','bind_id','cn=Manager,dc=example,dc=com');
$servers->setValue('login','bind_pass','xxxxxxxx');
$servers->setValue('login','attr','uid');
$servers->setValue('login','fallback_dn',true);
$servers->setValue('appearance','password_hash','ssha');
```

bind_id に rootDnを指定しているが、phpldapadmin専用のエントリーを作成して割り当てた方がよい。
Sequel Proでのデータ管理


##データの結合##
ユーザーのフルネームの一覧を取得したい。

```クエリ
select 文字列1, 文字列2
flom テーブル名
```

これで名前一覧は取得出来たが、取得したいのはフルネーム。これではカラムが分かれてしまっている。これらを結合するために __CONCAT関数__ を使用する。

```クエリ
select concat(文字列1, 文字列2, ...)
from テーブル名
```

いくつかのデータを用いて1つのデータを作りたい場合にCONCAT関数は扱いやすい。

##検索結果のカラム名の変更##
検索結果のカラム名がSQL文そのままとなっており、少し見にくい。これを変更したい。

```クエリ
select concat(文字列1, 文字列2, ...) as 別名
from テーブル名
```

SELECT句でデータを取得するとき、 __AS句__を併用すると、そのカラムに別名を付けることが出来る。

##重複する行の除外##

同じidが複数回表示されてしまっている。重複箇所を除外したい。

```クエリ
select distinct カラム名
from テーブル名
where date = "レコード"
```

__DISTINCTキーワード__ を使用すると、指定したカラムの値が重複する行を除外してデータを取得することが出来る。

##レコードのグループ化##
 __GROUP BY句__ を使用すると、指定したカラムが同じ値を持つデータを1つのグループとしてまとめることが出来る。

```クエリ
select カラム名
from テーブル名
where date = "レコード"
group by カラム名
```

##レコードの数を数える##
グループ化されたデータは、何件のレコードがグループ化されているかというデータを持っており、それを取得出来る関数が __COUNT関数__ 。

```クエリ
select カラム名, count(*)
from テーブル名
where date = "レコード"
group by カラム名
```

![Kobito.USYmMZ.png](https://qiita-image-store.s3.amazonaws.com/0/169530/5e69aea4-fb90-1119-ccf1-b5a330b5610b.png "Kobito.USYmMZ.png")

##count関数を使った上でのカラム名の変更##
列の数字が何を表しているのかが分かりにくい。

```クエリ
select
	カラム名,
	count(*) "コメント"
from テーブル名
where date = "レコード"
group by カラム名
```

##テーブルの結合##
 __JOIN__ を使用すると、指定したそれぞれのテーブルの、カラムの値が一致するデータを結合することが出来る。
 
```クエリ
FROM テーブル名1
JOIN テーブル名2 ON テーブル名1.カラム名1 = テーブル名2.カラム名2
```

![Kobito.kk1nBP.png](https://qiita-image-store.s3.amazonaws.com/0/169530/1432be92-0640-c392-2bae-f6292722bd1b.png "Kobito.kk1nBP.png")
[TouchDesigner] 改訂版、OSC通信の有無を判定するノード

![td_final.png](https://qiita-image-store.s3.amazonaws.com/0/127402/67e227b3-409e-2cf4-9aa3-8126f42fa225.png)

TouchDesginerでは、OSCシグナルの有無を検出する直接的な手法がありません。

しかしながら、連続的にOSC信号が送信されている際、そのシグナルの有無を検出することができます。
これにより、外的要因で通信障害が発生してもTouchDesigner内部で対策をとることが可能です。

参照 : [OSC In CHOP](https://www.derivative.ca/wiki088/index.php?title=OSC_In_CHOP)
>It will show the internal queue size and whether it is dropping or missing data (queue_advanced_total and queue_retarded_total should not be increasing, and queue_length should not be zero).

# 信号受信有無の検出
TouchDesignerでは、受信したOSC信号をキューに追加し、FIFO形式で処理していくシステムを採用しているようです。
そのため、連続的に信号が送られ続けている場合は必ずキューに情報が保存されることになります。
先ほどの**queue_length**チャンネルは、そのキューに格納されている情報の数を示しており、
これがゼロとなると信号が受信できていないと判断することができます。

Logic CHOPを先ほどのSelect CHOPにそのまま接続すると、検出結果をブール値で取得することができます。
**ただし、ネットワークの安定具合では頻繁にqueue_lengthが0となる現象が発生し、**
**また、過剰にOSC信号を受け取っていた場合もオーバーフローを起こしてqueue_lengthが0を繰り返します。**
これによる信号無しの判定を回避するため、
1秒間queue_lengthが0だった場合に受信できていないと判断するようなアルゴリズムでノードを組みなおします。

# 最終的なノード
![2017-04-03_194449.jpg](https://qiita-image-store.s3.amazonaws.com/0/127402/2b05102d-92fa-29bd-e5e8-a20e3b6f38cc.jpeg)

# 解説
OSC In CHOPにより信号を受信しつつ、Info CHOPを追加してOSC Inの状態を見ます。
信号受信の有無を検出する際に使用するチャンネルは**queue_length**になりますので、Select CHOPで抜き出します。

isQueueZero(Logic CHOP)ノードでqueue_lengthの長さが0であるか否かを返します。
その出力先をTimer CHOPのカウントスタートの挿入口に接続し、
もう一つこの結果を反転させるようなisQueueNotZeroノードへ渡します。

isQueueNotZeroノードの出力先はTimer CHOPのInitialize挿入口へ接続します。

これにより、queue_lengthが0であった場合タイマーをスタートさせ、0より大きかった場合にタイマーをリセットするシステムができました。

あとは、Timer CHOPのdoneチャンネルの値を反転してisReceivingとして扱えば、信号の有無が検出できます。
(タイマー終了(done:1) = 信号を受け取れていない = isReceiving:0)
Visual Studio Code上のscriptcsの出力が文字化けする。

![scriptcs2.PNG](https://qiita-image-store.s3.amazonaws.com/0/119431/f7d1d661-5e4c-9694-eb1f-80415c09cfd5.png)

コンソールの出力のエンコードがUTF8じゃないのが問題みたい。
```csharp
Console.OutputEncoding = System.Text.Encoding.UTF8;
```
を書いたら直るよ。

![scriptcs1.PNG](https://qiita-image-store.s3.amazonaws.com/0/119431/511c61eb-793e-31e3-184e-c985cad52205.png)

当たり前な話だよ。
scriptcsの記事少なすぎるよ。
ファイルがバイナリ形式かどうか判別する

# シェルスクリプトの `file` コマンドを利用する

`file` コマンドを利用するといい感じでファイルタイプを判定してくれる。

```:オプションなしで実行
$ file a.sh b.png c.xml d.java e.jar 
a.sh:   Bourne-Again shell script text executable
b.png:  PNG image data, 800 x 534, 8-bit/color RGB, non-interlaced
c.xml:  XML  document text
d.java: ASCII c program text
e.jar:  Zip archive data, at least v1.0 to extract
```

`--mime` オプションで mime-type 形式で出力してくれる。

```:--mimeオプションで実行
$ file --mime a.sh b.png c.xml d.java e.jar 
a.sh:   text/x-shellscript; charset=us-ascii
b.png:  image/png; charset=binary
c.xml:  application/xml; charset=us-ascii
d.java: text/x-c; charset=us-ascii
e.jar:  application/zip; charset=binary
```

この出力に `charset=binary` が含まれているかどうかをチェックするという方法。

```bash:check.sh
isBinary() {
  a=$(file --mime "$1" | grep "charset=binary")
  if [ -n "$a" ]; then return 0; fi
  return 1
}
for f in a.sh b.png c.xml d.java e.jar; do
  isBinary $f && echo $f is binary || echo $f is not binary
done
```

```:check.sh実行結果
$ sh check.sh 
a.sh is not binary
b.png is binary
c.xml is not binary
d.java is not binary
e.jar is binary
```

## 参考リンク

- [shell - How to check if the file is a binary file and read all the files which are not? - Stack Overflow](http://stackoverflow.com/questions/16760378/how-to-check-if-the-file-is-a-binary-file-and-read-all-the-files-which-are-not)
- [Man page of FILE](https://linuxjm.osdn.jp/html/file/man1/file.1.html)


# Git 内部のバイナリ判定ロジックを利用する

Git では diff や merge でバイナリファイルかどうかを判定しており、その判定ロジックを利用しようという方法。
ただし内部の判定処理は明示的に公開されているものではないので、特定コマンドの出力結果パターンをチェックする。

```bash:check.sh
isBinary() {
    p=$(printf '%s\t-\t' -)
    t=$(git diff --no-index --numstat /dev/null "$1")
    case "$t" in "$p"*) return 0 ;; esac
    return 1
}
for f in a.sh b.png c.xml d.java e.jar; do
  isBinary $f && echo $f is binary || echo $f is not binary
done
```

これで `file` コマンドを利用した場合と同様な結果が得られる。

```:check.sh実行結果
$ sh check.sh
a.sh is not binary
b.png is binary
c.xml is not binary
d.java is not binary
e.jar is binary
```

`git diff --numstat` で追加/削除の行数が出力されるが、バイナリの場合は行数とかカウントできないよね、ってことで以下のように出力結果パターンが変わることをチェックしているという。

```
$ git diff --no-index --numstat /dev/null a.sh 
314     0       /dev/null => a.sh

$ git diff --no-index --numstat /dev/null b.png 
-       -       /dev/null => b.png
```

## 参考リンク

- [How to determine if Git handles a file as binary or as text? - Stack Overflow](http://stackoverflow.com/questions/6119956/how-to-determine-if-git-handles-a-file-as-binary-or-as-text)
Wordpressで特定ページに来たら404ページを返す

```php
if(is_singular('do_not_show')){
    // WP_Queryの404フラグを設定
    global $wp_query;
    $wp_query->set_404();

　　　　　　　　// HTTPステータス 404を返す
    status_header(404);

    // ブラウザ側でキャッシュさせないヘッダーを入れる
    nocache_headers();

    // 404.phpを表示
    include( get_query_template( '404' ) );
    exit();

}
```

どれも必須というわけではないので、ページの構成に合わせてお好みで必要な部分を入れる。
404を返したい時に必須といえるのは `status_header(404)` くらいか？
UnityからSlack投稿する

![](https://media.giphy.com/media/3ohze1kwjmznyYMpXi/giphy.gif)

こんな感じでUnityからSlackに投稿することができます。

おおまかな流れは次の通りです。

+ Webhook URLを取得する
+ Unity上でURLにJSON形式の文字列を投げる

# Webhook URLを取得する

[Slack API (Incoming Webhooks) が簡単すぎた](http://docs.hatenablog.jp/entry/slack-Incoming-webhooks)

この記事を参考にして、Webhook URLを取得してください。簡単にできます。

# Unity上でURLにJSON形式の文字列を投げる

以下のようなコードを書いてください

[UnityでGET, POST通信(+JSON)](http://qiita.com/okuhiiro/items/11caa6ffae630b744373)を参考にしました。

```csharp:SlackTest.cs

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Text;

public class SlackTest : MonoBehaviour {
	string url = "Webhook URLをこぴぺしてください";

	public static SlackTest Instance = null;

	void Awake ()
	{
		if (Instance == null) {
			Instance = this;
			DontDestroyOnLoad(this.gameObject);
		} else {
			Destroy(this.gameObject);
		}
	}
	
	// 文字を投稿する
	public void PostText (string input)
	{
		Post-date data = new PostData ();
		data.text = input;
		data.username = "username";
		string json_data = JsonUtility.ToJson(data);
		StartCoroutine(Post(url,json_data));
	}

	IEnumerator Post (string url,string json_data) {
  
		Dictionary<string,string> header = new Dictionary<string,string>();
        // jsonでリクエストを送るのへッダ例
        header.Add ("Content-Type", "application/json; charset=UTF-8");
 
		byte[] postBytes = Encoding.UTF8.GetBytes (json_data);

        // 送信開始
        WWW www = new WWW (url, postBytes, header);
        yield return www;

        // 成功
        if (www.error == null) {
            Debug.Log("Post Success");
        }
        // 失敗
        else{
            Debug.Log("Post Failure");          
        }
    }

}

// レスポンスのJSONを格納するクラス
[Serializable]
class PostData{
	public string text; // 投稿内容
	public string username; // user名
}
```

あとは、好きな場所で

`SlackTest.Instance.PostText("送信したい文字");`

とコードを書けば送信できます！

# 参考Webサイト

[Slack API (Incoming Webhooks) が簡単すぎた](http://docs.hatenablog.jp/entry/slack-Incoming-webhooks)

[UnityでGET, POST通信(+JSON)](http://qiita.com/okuhiiro/items/11caa6ffae630b744373)

https://api.slack.com/incoming-webhooks
エラー Cordova -> Looper.prepare() と

Cordova.frameworkを使用中にThreadで怒られるときがよくあるので、戒めを込めて自分メモです。

###エラー内容
```ruby:adb.logcat
java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
```
バックグラウンドスレッドでViewを作成してしまうときにでてしまいます。

### 原因

CordovaはWeb engineを使用しているので基本的にでないのですが…NativeViewを使用せざるを得ないときがやっぱりあるのでその時にでちゃいます。

たとえば、

```ruby:test.Java
@Override
public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
    cordova.getActivity().runOnUiThread(new Runnable() {
        public void run() {
            ...
            timerView = view.findViewById(R.id.hogeview);

            // だめなポイント！！！
            mHandler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    mRootView.addView(timerView);
                },200);
            }
        }
    });
    return true;
}
```
Viewの生成が重かった+画面移行が挟まっていたので、やってしまった例です。
cordovaのスレッド処理の中にさらに遅延処理を書いています。
Looperは基本、UIスレッドで動作するのでHandlerでスレッドを変えてしまうと、Looperが動きません。

今回はViewの作成が重いためにcordova.getActivity().runOnUiThread()で呼出しているので、mHandler().postDelayed(new Runnable() {
を取っ払ってしまいます。

###かんたんな解決策

```ruby:test.Java
@Override
public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
    cordova.getActivity().runOnUiThread(new Runnable() {
        public void run() {
            ...
            timerView = view.findViewById(R.id.hogeview);
            mRootView.addView(timerView);
        }
    });
    return true;
}
```

それか、Looperを自分で実装する手段があります。
しかし基本的には、Frameworkで呼び出すメソッドなので禁じ手としています。

こんなかんたんな事をよくやってしまう…
Rubyのmodule と classの違い

#はじめに
同じ実行例で
Rubyのclassとmoduleの具体的な使い分けの説明　の　メモ

#moduleの使用例
moduleで定義したメソッドの使い方

```ruby:module.rb
# -*- coding: utf-8 -*-
#moduleとメソッドの作成
module Print_m
  def hello_m
    "hello"
  end

  def world_m
    "world"
  end

  def module_m
     "module"
  end
end

if __FILE__ == $0
 #モジュールをインストール
  include Print_m

 #　モジュール.メソッド　で実行
  puts hello_m
  puts world_m
  puts module_m
end
```

```
> ruby module.rb
hello
world
module
```

#classの使用例
classで定義したメソッドの使い方

```class.rb
# -*- coding: utf-8 -*-

class Print_class
  def hello_c
    "hello"
  end

  def world_c
    "world"
  end
end

if __FILE__ == $0
  print_c = Print_class.new
  puts print_c.hello_c
  puts print_c.world_c
end

```

```
>ruby class.rb
hello
world
```

#module とclassの実行方法の違い
##moduleの実行方法

```ruby:module.rb
include moduleName
method
```

##classの実行方法
```ruby:class.rb
class = className.new
class.method
```

#具体的な違い！
##classにmoduleを呼べるが、moduleからclassを呼べない！！

###classからmoduleを呼ぶ例

```ruby:module2class.rb
# -*- coding: utf-8 -*-
module Print
  def hello_m
    "hello"
  end
  def world_m
    "world"
  end
  def modulePrint_m
    "modulePrint"
  end
end

class Print_class
  include Print

  def hello_c
    hello_m
  end

  def world_c
    world_m
  end
end

if __FILE__ == $0
  print_c = Print_class.new
  puts print_c.hello_c
  puts print_c.world_c
  puts print_c.modulePrint_m
end

```

class.new　を実行すると
classのなかで、moduleをインクルードしているので
class.モジュールのメソッド　が使用できる
Homebrew + lightline.vim で powerline フォント

ネット上の記事を読んでやったら情報が古いのかうまくいかず、ちょっと面倒だったので自分用メモ。

## Ricty をインストール
[sanemat/font](https://github.com/sanemat/homebrew-font) を tap すると brew で Ricty をインストールできるようになるので、powerline パッチを当てつつインストールする

```
$ brew tap sanemat/font
$ brew install ricty --with-powerline
```

成功すると「コピーしてキャッシュ消してね」みたいなことを言われるのでその通りに実行する

```
$ cp -f /usr/local/opt/ricty/share/fonts/Ricty*.ttf ~/Library/Fonts/
$ fc-cache -vf
```

## lightline.vim の設定を変更
[itchyny/lightline.vim](https://github.com/itchyny/lightline.vim) にも書いてることだけど、lightline.vim の設定でセパレータの文字を powerline 用に設定する必要がある

``` vim:~/.vimrc
      \ 'separator': { 'left': "\ue0b0", 'right': "\ue0b2" },
      \ 'subseparator': { 'left': "\ue0b1", 'right': "\ue0b3" }
```

ここが間違って vim-powerline 用の設定になっていたりするとうまく表示されない

## 動作確認
vim を起動してみる

![](https://qiita-image-store.s3.amazonaws.com/0/16369/d124c6f3-fd9f-10ef-4c62-69186eae6298.png)
rails new のオプションによって出来上がるRailsバージョンが違う？


`PostgreSQL`使いたいからオプション指定して`rails new`したんだけど、オプションの使い方によってRailsのバージョンが違う？

```
$ rails new hogehoge -d postgresql
$ rails -v
Rails 4.2.7.1
```


```
$ rails new hogehoge --database=postgresql
$ rails -v
Rails 5.0.2
```

おーできたできた。
ということで、`--database=postgresql`を指定して`rails new`しよー
cloud-initを使ってホスト名を動的に設定する

# cloud-initを使ってホスト名を動的に設定したい
運用上、EC2インスタンスはstart/terminateしかしない。
これは、[以前の記事](http://qiita.com/neko-neko/items/8ad86e733861bb784d2d)で書いた構成のためである。

ホスト名を変えたいのは以下の点で困るから。
- Datadogに表示されるhostnameを分かりやすい物に変えたい
- Fluentdでoutputするレコードにhostnameをappendしているため、分かりやすい物に変えたい

# 何故cloud-initを使うのか
userdataを使わずにスクリプト置いてcloud-initから実行したい。

userdataでも出来る。出来るけど、userdataには極力何も置かない方針としたかった。
userdataに色々書くと追々混沌とするだろうなぁという恐怖があった。

# 設定後のイメージ
`EC2.TagName-EC2.instance_id-EC2.private_ip_address`
こんな形式でホスト名を設定したい。

# cloud-initで設定するには
こうする。

```bash:/var/lib/cloud/scripts/per-boot/00_hostname.sh
readonly AWS_REGION="ap-northeast-1"

ip_address=$(/bin/curl -s http://169.254.169.254/latest/meta-data/local-ipv4 | sed -e "s/\./-/g")
instance_id=$(/bin/curl -s http://169.254.169.254/latest/meta-data/instance-id)
tag_name=$(aws --region ${AWS_REGION} ec2 describe-instances \
               --instance-id ${instance_id} \
               --query 'Reservations[].Instances[].Tags[?Key==`Name`].Value' \
               --output text)

hostname ${tag_name}-${instance_id}-${ip_address}
hostnamectl set-hostname ${tag_name}-${instance_id}-${ip_address}

exit 0
```
※実際にはこれをAnsibleで管理していて、マシンに置いている。
Elasticsearch5.3.0リリース記念 logstash-filter-jdbc_streamingを試す

# 概要

https://www.elastic.co/blog/logstash-5-3-0-released
5.3.0ではPersistent QueuesやX-Packでのモニタリングが大きく注目されているようです。
下の方に書いてあったlogstash-filter-jdbc_streamingが目に留まりましたので、これを試してみます。

# 何ができんのか

https://www.elastic.co/guide/en/logstash/5.3/plugins-filters-jdbc_streaming.html

通常、インプットとなるイベント発生元に対し、何らかの処理をしてデータをきれいにしたり、加工したりするところが
filterの部分だと思います。

たとえば、正規表現でログなどの文字列を分割して、日付やログレベルを取得したりです。

同じように、jdbc_streamingを使うと、inputイベントが発生してfilter処理をするたびに、
何かのJDBCクエリを発行して、値を取ってきて、その結果を次にまわすことことができる（よりデータがリッチになる）、ということのようです。

# では、やってみよう

簡単に試すためにDockerイメージを使います。

```shell-session
docker pull docker.elastic.co/logstash/logstash:5.3.0
```
手元の環境でdocker imagesをした結果によると、548MBです。ヘビーです。

このイメージには、jdbc_streamingプラグインが入っていないため、プラグインをインストールします。

まずは、ベースとなる環境をとりあえず起動。
JDBCドライバや設定ファイルはホストにおいておき、中からは/logstashとしてアクセスできるようにしました。

```
docker run -it --name logstash -d -v 適当なホストのフォルダ:/logstash \
docker.elastic.co/logstash/logstash:5.3.0 bash
```

プラグインをインストールします。

```
docker exec -it logstash logstash-plugin install logstash-filter-jdbc_streaming
```


# 設定ファイルとjdbcドライバの準備

logstashに読ませる設定ファイルを用意しましょう。
標準入力に入力された値に対して、jdbc_streamingフィルタを利用し、outputに出力する、という簡単な例とします。

```
input { stdin { } }
filter {
  jdbc_streaming {
    # この場所にjdbcドライバがあると仮定
    jdbc_driver_library => "/logstash/sqljdbc4.jar" 
    jdbc_driver_class => "com.microsoft.sqlserver.jdbc.SQLServerDriver"
    jdbc_connection_string => "jdbc:sqlserver://xxx.xxx.xxx.xxx;databaseName=hogehoge"
    jdbc_user => "hogehoge"
    jdbc_password => "barbar"
    # コード値に対応するカテゴリ名を取るイメージ
    statement => "select category from CodeMaster WHERE code = :code" 
    # 標準入力はデフォルトでmessageに入っている
    parameters => { "code" => "message"} 
    target => "code_details"
  }
}
output {
  stdout { codec => rubydebug }
}

```

# 実行結果と確認

`logstash -f /logstash/logstash.conf`を実行して、標準入力に29078と入れた場合の結果です。
code_detailsの中に配列でデータべースに対してSQLを実行した結果が格納されています。

実際は配列になっているので、複数件ある場合、ない場合、何か考える必要はありそうです。

![20170403.png](https://qiita-image-store.s3.amazonaws.com/0/111676/4c0d5e8a-6415-c643-dfee-d93e8bee24b5.png)

# 雑感

マスタなどのデータはデータベースで管理されていることも多いでしょうし、
ファイルにはユーザコードしか落ちてないけど、便宜的にユーザテーブルから組織や名前も補完しておきたい、というときには使えそうな感じ。

# その他

## 毎回リクエストしてたら負荷が心配

キャッシュの仕組みがあるようです。
https://www.elastic.co/guide/en/logstash/5.3/plugins-filters-jdbc_streaming.html#plugins-filters-jdbc_streaming-cache_expiration

use_cacheをfalseにしておくと、キャッシュを使わない設定も可とのこと。


## X-Packのモニタリングの警告が出るんだけど

■ logstash:5.2.1 disable ElasticSearch connection checking
https://github.com/docker-library/logstash/issues/85

コンテナだと、以下にlogstashの設定ファイルがあります。

/usr/share/logstash/config/logstash.yml

ここに、`xpack.monitoring.enabled: false` を足すと、警告は回避できます。
単体で動作を確認したいときなどに。
PackerとServerspecを連携させる

# Packerで作ったイメージにserverspecでテストしたい
PackerとAnsibleを実行してAMIを作るビルドジョブを用意していました。
このジョブの最後の処理でserverspecを噛まして、テストを流し込みたい。

# 背景
Ansibleは確かにロール単位で見るととてもシンプルでテスト不要だなぁというのは感じるところだけど、ロールを組み合わせてプロビジョニングしていると、あれとこれの組み合わせでこう動いてくれるよね？っていう確認はやっぱり必要なわけ。
例えば、nginx -> APP serverの疎通確認とか。
そんな観点のテストにserverspec流して自動化してしまおうというのが事の発端。
※[この記事](http://qiita.com/neko-neko/items/8ad86e733861bb784d2d)を書いた時にやっていた事を思い出しながら書いてます。

# Packer with serverspec
先にディレクトリ構成とpacker.jsonを記載する。
## ディレクトリ構成
```
├── packer.json
├── provisioners
├── scripts
│   ├── serverspec.sh
├── serverspec
│   ├── Gemfile
│   ├── Gemfile.lock
│   ├── Rakefile
│   └── spec
│       └── AMI-TYPE
│           └── hoge_spec.rb
│       └── spec_helper.rb
└── variables
    └── packer.json
```

## packer.json
```json
    {
      "type": "ansible-local"
    },
    {
      "type": "file",
      "source": "serverspec",
      "destination": "/tmp"
    },
    {
      "type": "shell",
      "execute_command": "sh {{ .Path }} -t AMI-TYPE-A",
      "script": "{{user `script_dir`}}/serverspec.sh"
    },
```

## どう動かしているのか
Ansibleのプロビジョニングが完了したら、serverspecをプロビジョニング先のマシンで実行しています。
流れはこんな感じ。

1. Ansibleのプロビジョニング実行
2. `serverspec`ディレクトリを丸ごとプロビジョニング先のマシンへ転送
3. serverspec実行シェルを起動

Packerでゴールデンイメージを作っているのですが、くそ時間がかかるのでAMIを分割して作成していく方式を取っているため、`AMI-TYPE`なんていうものを用意しています。

`serverspec.sh`の中身はごくごくシンプルで、`bundle install`と`bundle exec rake spec:hoge`を実行しているだけです。
こんな感じで簡単にserverspecを連携させることが出来るので、滅茶苦茶楽出来ましたとさ。

## 実際運用させてみて
楽だし安心感ある。
ゴールデンイメージ運用しているから、各コミットの安全性が担保されるのは良い、自信を持ってリリースが出来ます。
[Javascript]Canvasの画像重ね合わせとglobalCompositeOperationプロパティ

このサイトがすごく参考になったのでメモ
http://honttoni.blog74.fc2.com/blog-entry-193.html

globalCompositeOperationプロパティ

今回使用したのはdestination-atop。
1. 表示したい画像を書き込む
2. globalCompositeOperationを設定する
3. 重ねる画像を書き込む

結果：重ねる画像の透過になっていない部分を象って表示したい画像が表示される。

簡単に書くとこんな感じ。

```ts

var imageWidth:number = 画像の幅;
var imageHeight:number = 画像の高さ;
var img = new Image();
$(img).off("load").on("load", (event:Event)=>{
    var mask = new Image();
    $(mask).off("load").on("load", (event:Event)=>{
        var ctag: HTMLCanvasElement = <HTMLCanvasElement>document.createElement('canvas');
        var ctx = ctag.getContext("2d");
        ctx.clearRect(0, 0, imageWidth, imageHeight);
        ctx.drawImage(img, 0, 0, imageWidth, imageHeight);
        ctx.globalCompositeOperation = "destination-atop";
        ctx.drawImage(mask, 0, 0, imageWidth, imageHeight);
        ctx.restore();
    });
    mask.src = "重ねる画像のurl";
});
img.src = "表示したい画像のurl";

```
Ansibleを使ってFluentdのプラグインをインストールする

# Ansibleを使ってFluentdのプラグインをインストールしたい
Fluentdのプラグインインストールには`td-agent-gem`を使ってインストールする。
Ansible Moduleの[command](http://docs.ansible.com/ansible/command_module.html)や[shell](http://docs.ansible.com/ansible/command_module.html)からtd-agent-gemプラグインをインストールしても良いのだが、如何せんかっこ悪いし、changed_whenとかの制御が面倒くさい・・・。

# じゃあどうするの
Ansible Moduleに[gem](http://docs.ansible.com/ansible/gem_module.html)といものがある。
こいつを使ってインストールすれば余計な事を考えず、冪等性も担保されるね。

# サンプルコード
```yml
- name: install plugin
  gem:
    executable: /usr/sbin/td-agent-gem
    name: hoge-gem
    state: present
    user_install: no
    version: 1.0.0
```
`executable`を指定すると、実行するgemコマンドのパスをオーバーライドしてくれる。
これを使えば、楽チンダネー。
Swift3でナビゲーションバーにアイコンを表示する

# Swift3でナビゲーションバーにアイコンを表示する

## 今回の目標
ナビゲーションバーにアイコンを表示する

![Qiita用バーガーボタン.png](https://qiita-image-store.s3.amazonaws.com/0/139291/f8ec6fdb-b1bc-d56c-44c5-520ee11c1e7c.png)


## 開発環境
- Xcode：8.2.1
- 言語：Swift 3
- OS：MacOS

## アイコン表示方法
1. アイコンをプロジェクトに登録する
2. ナビゲーションバーにアイコンを追加する

### 1. アイコンをプロジェクトに登録する
Assets.xcassetsに使用したいアイコンを追加します(今回は"MenuIcon"として追加)

### 2. ナビゲーションバーにアイコンを追加する

```swift:ViewController.swift

    override func viewDidLoad() {
      super.viewDidLoad()
      let Menu: UIBarButtonItem = UIBarButtonItem(image: UIImage(named: "MenuIcon"), style:UIBarButtonItemStyle.plain, target:self, action:#selector(ViewController.TapMenu)) // アイコンを追加し、アイコンを押したときに"TapMenu()"が実行されるように指定
      self.navigationItem.leftBarButtonItem = Menu // ナビゲーションバーにアイコンを追加
}
    func TapMenu() {
        print("メニューがタップされました")
    }
```
VirtualBoxでホストOSとゲストOS間のクリップボード機能を有効にする

# VirtualBoxでホストOSとゲストOS間のクリップボード機能を有効にする

## 実行環境
ホストOS：Windows7
ゲストOS：Ubuntu16.04 LTS
VirtualBox：5.0.20

## 手順
1. 「デバイス」→「Guest Additions CD イメージの挿入」し、実行する
2. 実行完了後、VirtualBoxを再起動する
3. 「デバイス」→「クリップボードの共有」をクリック。「双方向」を選択します

## 備考
手順1.を行うとVirtualBoxの画面サイズの調整も行うことができるようになります
ターミナルからopenコマンドでAtomを開く方法


[うちの子がラップをやり始めてしまったので死にたい](http://off.tokyo/blog/2017/04/03/how-to-open-atom-editor-from-command-line-in-os-x/)

# openコマンドでAtomを開きたい

```
$atom . (opens folder)

$atom file.js (opens file)

$atom (opens editor)
```

# 例えば configをAtomで編集したい

```
$ atom . opne config
```

# 参考

[How to open Atom editor from command line in OS X?](http://stackoverflow.com/questions/22390709/how-to-open-atom-editor-from-command-line-in-os-x)
Dockerの基本操作メモ


環境はMac。まあ、他でも同じでしょうけど。

## 基本操作

### インストール

[ここ](https://www.docker.com/community-edition#/download)からダウンロードしてインストールするだけ。

### イメージの取得

目的に報じて取ってくる。centosとかは標準である。例えばsqlserverとかだと、microsoft/mssql-server-linuxといった感じでリポジトリ名/イメージ名という感じ。

```bash
docker pull centos
docker pull ubuntu
```

### イメージの確認

取得したイメージはimagesで取得できる。

```bash
docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              98d35105a391        2 weeks ago         193 MB
ubuntu              latest              0ef2e08ed3fa        4 weeks ago         130 MB
```

centosとubuntuのイメージがある。

### イメージの削除

利用しなくなったイメージはIMAGE_IDを指定することで削除可能。

```bash
docker rmi IMAGE_ID
```

>コンテナが動いていると削除できない。その場合はforceオプションを付ける。

### コンテナの起動

イメージを指定してコンテナを起動します。

```bash
docker run -itd --name centos1 centos
```

>docker run -itd centosとしてもいいが、名前がランダムに付く。
>docker run -itd --name centos1 centos /bin/bashなどとしてシェル指定できる。
>-iはinteractive。ホストの入力をゲストに伝える。
>-tはtty。ホストの入力をゲストのttyに伝える。
>-dはバックグラウンド。-dがないとexitするとコンテナも停止する。
>-pでポートのマッピングもできる。-p 8888:80とすると、ホストの8888をコンテナの80にマップできる。

### コンテナへのログイン

```bash
docker exec -it centos1 /bin/bash
```

>シェルを指定しないとエラーとなる。

### コンテナの停止

```bash
docker stop CONTAINER_ID_or_NAMES
```

### 停止中のコンテナの再スタート

```bash
docker start CONTAINER_ID_or_NAMES
```

### 動いているコンテナの確認

動いているコンテナのみ表示される。

```bash
docker ps
```

### 全てのコンテナの確認（停止等含む）

停止中のコンテナも見たい場合はこちら。

```bash
docker ps -a
```

### コンテナのリソース使用状況の確認

```bash
docker stats
```

### コンテナの削除

```bash
docker rm CONTAINER_ID_or_NAMES
```
mavenのdockerコンテナを使って、mavenプロジェクトを速攻ビルド

# MavenのDockerコンテナを利用して、mavenプロジェクトを速攻でビルドする

## 動機

Jenkins2でPlot-pluginをPipeline(Jenkinsfile)に対応させるため、

https://github.com/MarkusDNC/plot-plugin

をビルドして、hpiファイルからプラグインインストールする必要があった。

mavenの環境が手元になかったので、dockerで探してみたらあった。

## 手順

```
docker run -it maven /bin/bash
```

を実行すれば、maven環境が入ったコンテナにログインできる。
あとは、`git clone`->`mvn install`でコンパイル可能

※バージョン指定したい場合は、イメージタグを指定すれば良さそう。


## まとめ

Dockerコンテナ超便利
gem が更新された時にサクッと更新内容を確認する方法

# 背景
* Rails のアプリ開発で gem の更新を日々行っています。
    * バグフィックスやセキュリティ対応は取り込み必須です。
* 多数の gem を利用していると gem 更新なしの日の方が少なかったりします。
* ルーチンワーク的な部分を極力自動化したい。

# gem更新の検知と取り込み
* 定期的に ```bundle update``` を実行してgem更新を検出する。
    * バージョン固定している gem もあるので ```bundle outdated``` の結果も参考にする。
* 更新に対しては通常の開発と同じく ci test に投入する。
    * ci test の成功は判断材料になる。
* 更新の検知から ci test が成功するかどうかまでの手続きを定期的に実行し、gem 更新の取り込み判断の助けになっている。

# 変更内容調査方法
* (ここからが本題) 上で書いた通り、自動で ci test を行うことでかなり省力化できたが、ci test が失敗する場合、あるいは、gem のバージョンが大きく変わった場合など、変更内容を把握したい場合がある。
* 変更内容の把握のために参照する場所は、全ての gem で同じとはいかないため、最終的にはケースバイケースの調査となる。
* これまでの見たもので変更内容の把握に役立った場所を挙げてみる。
  * 調べた gem は、全て github に置かれていた。

# 変更内容の記載場所(例)
1. 変更履歴記録用のファイルがある場合 CHANGELOG.md, Changelog.markdown,History.md,...(ファイル名は色々、バージョン番号の先頭に'v'があったりなかったり)
  * aws-sdk-ruby(2.7.15  -> 2.7.16)
 [v2.7.16/CHANGELOG.md](https://github.com/aws/aws-sdk-ruby/blob/v2.7.16/CHANGELOG.md)
  * fabrication(2.16.0 -> 2.16.1) [2.16.1/Changelog.markdown](https://github.com/paulelliott/fabrication/blob/2.16.1/Changelog.markdown)
  * childprocess(0.6.1 -> 0.6.2) [v0.6.2/CHANGELOG.md](https://github.com/enkessler/childprocess/blob/v0.6.2/CHANGELOG.md)
  * hashie(3.5.4 -> 3.5.5) [v3.5.5/CHANGELOG.md](https://github.com/intridea/hashie/blob/v3.5.5/CHANGELOG.md)
  * cucumber-rails(1.4.4 -> 1.4.5) [v1.4.5/History.md](https://github.com/cucumber/cucumber-rails/blob/v1.4.5/History.md)
* releases に変更内容が記載してある場合
  * faraday(0.10.1 -> 0.11.0) [tag/v0.11.0](https://github.com/lostisland/faraday/releases/tag/v0.11.0)
  * minimagick(4.5.1 -> 4.6.0) [tag/v4.6.0](https://github.com/minimagick/minimagick/releases/tag/v4.6.0)
  * rb-fsevent(0.9.7 -> 0.9.8) [tag/v0.9.8](https://github.com/thibaudgg/rb-fsevent/releases/tag/v0.9.8)
  * will_paginate(3.1.3 -> 3.1.5) [tag/v3.1.5](https://github.com/mislav/will_paginate/releases/tag/v3.1.5)
* 変更履歴が見つけられず、コード差分を見るしかない場合
    * ffi(1.9.17 -> 1.9.18) [差分(1.9.17...1.9.18)](https://github.com/ffi/ffi/compare/1.9.17...1.9.18)
        * [.travis.ymlの変更内容](https://github.com/ffi/ffi/compare/1.9.17...1.9.18#diff-354f30a63fb0907d4ad57269548329e3R20) から ruby-2.4.0 対応が含まれることが分かります
    * oauth2(1.3.0 -> 1.3.1) [差分(v1.3.0...v1.3.1)](https://github.com/intridea/oauth2/compare/v1.3.0...v1.3.1)
        * [.travis.ymlの変更内容](https://github.com/intridea/oauth2/compare/v1.3.0...v1.3.1#diff-354f30a63fb0907d4ad57269548329e3R21) から ruby-2.4.0 対応が含まれることが分かります
        *  [CHANGELOG.mdの変更内容](https://github.com/intridea/oauth2/compare/v1.3.0...v1.3.1#diff-4ac32a78649ca5bdd8e0ba38b7006a1eR7) から、履歴の更新が都度行われてないことが分かります
    * fb_graph2(0.8.0 -> 0.9.0) [差分(v0.8.0...v0.9.0)](https://github.com/nov/fb_graph2/compare/v0.8.0...v0.9.0)
        * API v2.8対応、ruby-2.4.0 対応されていることが分かります

以上、役に立つレベルまでまとめられず、作業の現状記録といった内容ですが、書いてみました。
定期的に gem 更新をする場合、みなさんどんなやり方(工夫)されているんでしょうか。

追記：
[gemnasium](https://chocoby.jp/blog/2013/03/02/gemnasium/) なるものの存在をおしえて頂きました。
Docker一括削除コマンドまとめ


### 停止コンテナ、タグ無しイメージ、未使用ボリューム、未使用ネットワーク一括削除

\>=1.13

```sh
$ docker system prune
```

### 停止コンテナ一括削除
<=1.12

```sh
$ docker rm `docker ps -f "status=exited" -q`
```

\>=1.13

```sh
$ docker container prune
```

### 全コンテナ一括削除
```sh
$ docker rm -f `docker ps -a -q`
```

### 未使用イメージ一括削除
<=1.12

```sh
$ docker rmi `docker images -q`
```

\>=1.13

```sh
$ docker image prune
```

### タグ無しイメージ一括削除
```sh
$ docker rmi `docker images -f "dangling=true" -q`
```

### 未使用ボリューム一括削除
<=1.12

```sh
$ docker volume rm `docker volume ls -q`
```

\>=1.13

```sh
$ docker volume prune
```

### 未使用ネットワーク一括削除
<=1.12

```sh
$ docker network rm `docker network ls -q`
```

\>=1.13

```sh
$ docker network prune
```
goでmockを使ったテストをする

## モックを使ったテストって?

テストのために本物のオブジェクトを使わず、テスト用に差し替える手法です。

モックを用いたテスト自体、否定派・賛成派あるのでいろいろ意見はありますが
階層型のアーキテクチャを選定していると、一番下のレイヤまで気を配らないと
上位層のテストがかけないのはしんどいですしよね。

例えば

* 他社API処理

通信コケてCIガー、実行時間ガー

* データベースがらみ

並列実行すると、コケるワー、実行時間ガー

テストの障害が増えると、テストを書かなくなりますし、メンテナンスも大変に
なっていくので使える所は使った方が良いのかな、と。

## 一番ストレートなやり方 (例)

goの記事というか基本的なDIの活用例っぽいですが...

* 基本的にinterfaceに依存する。
* DI(Dependency Injection)を活用する。



* テスト対象のサンプルコード

```go

package main

import (
	"errors"
)

type APIClient interface {
	Call(string) (map[string]string, error)
}

type UserRegister struct {
	client APIClient // interfaceに依存させる。
}

type User struct {
	Name string
}

// 引数に受け取ったnameを元に別APIでuserを登録する
func (u *UserRegister) Register(name string) (*User, error) {
	apiResult, err := u.client.Call(name)
	if err != nil {
		return nil, err
	}
	resultName, exist := apiResult["name"]
	if !exist {
		return nil, errors.New("apiResult must have name")
	}

	return &User{resultName}, nil
}
```

* テストコード

```go

package main

import (
	"testing"
)

// mockする構造体を定義する
type APIClientMock struct {
}

// APIClientInterfaceを満たすようにモックを実装する
func (a *APIClientMock) Call(name string) (map[string]string, error) {
	return map[string]string{"name": name}, nil
}

func TestRegister(t *testing.T) {
	// Mockを外部注入する
	target := &UserRegister{&APIClientMock{}}
	expected := "Mike"
	user, err := target.Register(expected)
	if err != nil {
		t.Fatalf("Register error: %v", err)
	}
	actual := user.Name
	if actual != expected {
		t.Fatalf("name Must be %s", expected)
	}
}
```

goには継承の概念がない代わりにembedで実装の再利用を可能に
していますが、型判定は通りません。
オブジェクト指向っぽく書く場合はinterfaceを使う方が良いですね。
(goに限らず...な所もありますが)

## 便利ライブラリ

上記の例では省きましたがより厳密にテストをするのであれば、
UserRegisterの責務である、APIClient.Call()の呼び出しの担保されたかまで考慮しないといけないので、
もう少し実装をかけないといけなくて、それはそれで面倒ですよね。
毎回作るのも面倒臭いし。

他の言語でも大概その手のライブラリはありますし、goにも勿論あります。

* [gomock](https://godoc.org/github.com/golang/mock/gomock)
* [mockgen](https://godoc.org/github.com/golang/)

こちらのライブラリなら以下のような使い心地で簡単にできます。

```go
//trueで呼ばれたら1を返す
mock.EXPECT().Method(true).Return(1)
// 初回は1,"first"で呼ばれることを保証
firstCall := mock.EXPECT().SomeMethod(1, "first")
// 1で呼ばれた後で2,"second"で呼ばれることを保証
secondCall := mock.EXPECT().SomeMethod(2, "second").After(firstCall)
// 2で呼ばれた後に3,"third"で呼ばれることを保証
mockObj.EXPECT().SomeMethod(3, "third").After(secondCall)
```

mockgenでmockのgenerateも出来るのでとても便利です :)

## 関連

* [gomock](https://godoc.org/github.com/golang/mock/gomock)
* [mockgen] (https://godoc.org/github.com/golang/)
Vagrantで立ち上げたWebサーバにiPhoneやAndroidからアクセスする。

## どんな記事？
Vagrant(ゲストOS)上のWebサーバへは、立ち上げているPC（ホストOS）からしかアクセスができない。
これだと、iPhoneやAndroidなどの実機確認を行う際に困るので、その解決策を調べました。

## 参考にした記事
[Vagrant + VirtualBoxで仮想環境側のポートをあける](http://qiita.com/kkam0907/items/4a345cd5e834969d3859)

## 環境
### ホストOS
* Mac OS X EL Capitan 10.11.6

### ゲストOS
* Vagrant 1.8.4
* centos6.7

### LAN
* iPhoneのテザリングでPCから無線で接続し、iPhoneとPCを同一LAN内に置く。（同一LAN内であれば他の環境でもOKと思われます。）

## やること
* ポートフォワードを設定
* ファイアウォールを設定（必要であれば）
* iPhone/Androidで確認！

## ポートフォワードを設定
Vagrantfileにネットワークポートフォワード設定を追記する

`config.vm.network :forwarded_port, host: 3000, guest: 3000`

```rb:Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = "centos6.7"

  # Create a forwarded port mapping which allows access to a specific port
  # within the machine from a port on the host machine. In the example below,
  # accessing "localhost:8080" will access port 80 on the guest machine.
  # config.vm.network "forwarded_port", guest: 80, host: 8080

  config.vm.network :forwarded_port, host: 3000, guest: 3000
```



## ファイアウォールを設定（必要であれば）
**iptablesが動作していない場合はこの項は不要**
iptablesが動いているか確認

```
[vagrant@localhost ~]$ sudo service iptables status
iptables: Firewall is not running.
```

もし動いていて、iptablesを切りたい場合

```
[vagrant@localhost ~]$ sudo service iptables stop
iptables: Setting chains to policy ACCEPT: filter          [  OK  ]
iptables: Flushing firewall rules:                         [  OK  ]
iptables: Unloading modules:                               [  OK  ]
```


iptablesが動作している場合は、以下のように該当のポートを開く。

`/etc/sysconfig/iptables`に
`-A INPUT -p tcp -m tcp --dport #{該当のポート番号} -j ACCEPT`
を追記する。

例）Railsなどデフォルトで3000番ポートのアプリの場合は
`-A INPUT -p tcp -m tcp --dport 3000 -j ACCEPT`
となるため、以下のような記載となる。

```
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 3000 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

```

変更を読み込ませるため、iptablesを再起動

```
[vagrant@localhost ~]$ sudo service iptables restart
iptables: Setting chains to policy ACCEPT: filter          [  OK  ]
iptables: Flushing firewall rules:                         [  OK  ]
iptables: Unloading modules:                               [  OK  ]
iptables: Applying firewall rules:                         [  OK  ]
```

ここまでで設定は完了。

## 確認
MacなどのホストOSのIPを調べる。

```
mac-user:13:18:21 test_dir $ifconfig
```

これで同一LAN内にあるiPhoneのsafariやAndroidのChromeなどで
`ip:{port}`と打ち込めば表示される。

**例**
ホストOSのIPが`192.168.10.0`でVagrant上でWebサーバを`3000`番ポートで立ち上げている場合

`192.168.10.0:3000`

などで確認できるはず！
配列（IEnumerable)の中から条件に当てはまる要素の添え字返却するLinq拡張

# 使わないようで、意外と使うので作っておくと、ちょっと便利？

```csharp
    public static class LinqExtensions
    {
        public static int FirstIndex<T>(this IEnumerable<T> ie, Predicate<T> match)
        {
            return ie.Select((tData, index) => new { tData, index }).First(arg => match(arg.tData)).index;
        }

        public static int? FirstIndexOrNull<T>(this IEnumerable<T> ie, Predicate<T> match)
        {
            return ie.Select((tData, index) => new { tData, index }).FirstOrDefault(arg => match(arg.tData))?.index;
        }
    }
```

# 使い方

```csharp
    class Program
    {
        static void Main(string[] args)
        {
            //               [ 0][ 1][ 2][ 3][ 4][ 5][ 7][ 8][ 9][10][11][12]
            var list = new[] { 1,  2,  3,  4,  5, 10, 20, 31, 32, 33, 34, 35};

            var index1 = list.FirstIndex(i => i == 31);
            Console.WriteLine("31が格納されているのは：" + index1 + "番目の要素でした。");  //出力:31が格納されているのは：7番目の要素でした。

            var index2 = list.Select(i => i * 2).FirstIndex(i => i > 15);
            Console.WriteLine("2倍した値で初めて15を超えるのは：" + index2 + "番目の要素でした。");//出力:2倍した値で初めて15を超えるのは：5番目の要素でした。

            //var index3 = data.FirstIndex(i => i == 0);    // LinqのFirst同様、存在しない場合は "ハンドルされていない例外: System.InvalidOperationException: シーケンスに、一致する要素は含まれてません" の例外発生

            var index4 = list.FirstIndexOrNull(i => i == 0);    //見つからない可能性がある場合はFirstOrDefaultのようにFirstOrNullを使用
            if (index4.HasValue)
            {
                Console.WriteLine("0が格納されているのは：" + index4 + "番目の要素でした。");
            }
            else
            {
                Console.WriteLine("0は見つかりませんでした。");
            }
        }
    }
```

もちろん`IEnumerable<T>`なので

```csharp
            var strList = new[] {"abc", "def", "ghijkl", "mnoprstu", "vwxyz"};
            var index5 = strList.FirstIndex(s => s.Length > 5);
            Console.WriteLine("文字数が5文字を超えるのは：" + index5 + "番目の要素でした。");//出力:文字数が5文字を超えるのは：2番目の要素でした。
```
の様に、stringや自前のクラスでもウッドボール。

# ところがどっこい

ここまで書いて、検証処理ちょっと走らせていたら**Listクラスには最初からFindIndexってメソッドがある**事に気付きました。
なので、

```csharp
            var strList = new[] {"abc", "def", "ghijkl", "mnoprstu", "vwxyz"};
            var index6 = strList.ToList().FindIndex(s => s.Length > 5);
            Console.WriteLine("文字数が5文字を超えるのは：" + index6 + "番目の要素でした。");//出力:文字数が5文字を超えるのは：2番目の要素でした。
```

の様に`ToList()`を挟んであげれば、わざわざ自前で拡張クラス作る必要もないんですね・・・（ToListのコストがあるので優位性が無いわけではない…？ 中で匿名クラスがnewされてるからむしろ不利か…。）

基礎ができてないって辛い。
【ASP.NET】DbContextが見つからない【Visual Studio 2017】


開発環境をVisual Studio 2010 から　Visual Studio 2017　に変えた。
(時代の流れを一気に感じる)

そしてASP.NETに手をつける。
今回はこちらでお勉強させてもらった。
[ASP.NET MVC 🍣 ClockUpTips](http://aspnet.clock-up.jp/contents/bbs/model-db "タイトル")


##DbContextが見つからない
[データベースコンテキストの作成をする](http://aspnet.clock-up.jp/contents/bbs/model-db "タイトル")手順の中で書かれていた通り、
using System.Data.Entity;を追加する。そしてDbContextを追加してもエラーに・・・

そもそもEntityFreameWorkが入っていないようだ。爆笑。

##EntityFrameWork4.2をインストール

早速、ツール＞NuGet パッケージマネージャーから
パッケージマネージャコンソールを起動する。

そして以下のコマンドをうつ。

```
Install-Package EntityFramework -Version 4.2.0
```


これでインストールできれば解決。
ImageViewのtintの対応バージョン表

糞かよってなったのでメモ

## Java

| メソッド | APILevel | XML属性 | 備考 |
|:----:|:----:|:----:|:----:|
| `setColorFilter(ColorFilter)` | 1 |||
| `setColorFilter(int, PorterDuff.Mode)` | 1 | `android:tint` ||
| `setColorFilter(int)` | 8 || SRC_ATOP |
| `setImageTintList(ColorStateList)` | 21 | `android:tint` ||
| `setImageTintMode(PorterDuff.Mode)` | 21 | `android:tintMode` ||


## XML

| 属性名 | format | APILevel | 備考 |
|:----:|:----:|:----:|:----:|
| `android:tint` | color (int) | 1? | SRC_ATOP |
| `android:tint` | ColorStateList | 21 | SRC_ATOP |
| `android:tintMode` | enum | 21 ||

## 注意点

* `android:tint`はバージョンによって振る舞いが変わるので注意です
* ~~`AppCompatImageView`は`tint`属性のバックポートを行ってくれません (25.2.0時点)~~
  * いつ頃追加されたのか把握できてませんが、[appcompatでバックポートされました]
(https://android.googlesource.com/platform/frameworks/support/+/3b04742a1d5209de20b93732e490a354d442294d)
  * DataBindingの属性`android:tint="@{}"`には対応していないです。(`app:tint="@{}"`もない)
* DataBindingでの`android:tint="@{}"` は`ColorInt`、`ColorStateList`いずれも**21以上**のようです(常にColorStateListとして扱われる)
  * `app:tint`ならいけそうだけど、BindingAdapterのマッピングがされてないかも
TeraTermで改行コードを設定する

# TetaTermで改行コードを設定する

## 実行環境
OS：Windows7
TeraTerm：v4.88

## 手順
1. ttermpro.exeでTeraTermを起動する
2. 画面上部のタブにある「設定」→「端末」をクリック
3. 「改行コード」を変更し、OKをクリック
4. 設定完了

## 備考
本記事タイトルとは関係ないが、「設定」→「端末」内にある「ローカルエコー」の項目にチェックをいれることで、TeraTermで入力した文字が表示されるようになる