OmniAICreator/Qiita-1.07M huggingface dataset:
js 配列を二次元配列のグループにわける

##お題
・配列(第一引数)を指定された数字（第二引数）で二次元配列のグループに分ける。


```js
function chunkArrayInGroups(arr, size) {
//write your code.
}
chunkArrayInGroups(["a", "b", "c", "d"], 2);
```


##出力結果　例

```js
(["a", "b", "c", "d"], 2) // [["a", "b"], ["c", "d"]]
([0, 1, 2, 3, 4, 5], 3)   // [[0, 1, 2], [3, 4, 5]]
([0, 1, 2, 3, 4, 5], 2)   // [[0, 1], [2, 3], [4, 5]]
([0, 1, 2, 3, 4, 5], 4)   // [[0, 1, 2, 3], [4, 5]]
```

##使った関数
[push()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/push)
[slice()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/slice)


##一番最初に試したコード

```js
function chunkArrayInGroups(arr, size) {
  var newArray = [];
  for(var i = 0; i<arr.length; i+=size){
    var j = arr.slice(i,i+size);
    newArray.push(j);
  }
  return newArray;
}
chunkArrayInGroups(["a", "b", "c", "d"], 2);
```


##考え方
・必要なツールを考える
配列の要素を切り出す　　→　slice()
切り出した要素を配列に格納する　→　push()
複数回繰り返す　→　for文　while文

・slice()の引数の取り方を考える
chunkArrayInGroups(["a", "b", "c", "d"], 2);の場合に欲しい引数
一回目(0,2)→　a b　が切り出される 
二回目(2,4)→　c d　が切り出される
この数値をfor文でどのようにとるか考える。
一回目
0→　変数iの初期値で設定
2→　sizeの値で取れる
二回目
2→　iにsizeを代入すると取得できる
(増減式にsizeの分だけ増えて行くように設定する →i+=size)
4→　増減式で増えたi(2)に再度size(2)を足すことで取得

最後に、変数jに切り分けた数字を入れて、push()でnewArrayに格納する。


##while文のコード

```js
function chunkArrayInGroups(arr, size) {
  var newArr = [];
  var i = 0;
  while (i < arr.length) {
    newArr.push(arr.slice(i, i+size));
    i += size;
  }
  return newArr;
}
```

###他にもコードが浮かんだ方、コメントお待ちしてます。
進捗をgit logとpandasで可視化する

# 背景

そろそろ卒論/修論/博論の季節ですね。
自分の頑張りの可視化をするために、gitで管理しているtexファイルのコミットログをpandasで可視化してみます。

[gist](https://gist.github.com/xeno14/b4c4705f670b967ba3544b1f114251f2)にnotebookを置いたので詳しくはそちらを。


# ざっくりしたやり方

## gitのログの出力

```
git log --numstat --pretty="%ad" --date=iso *.tex > thesis_log.txt
```

こんな感じのが出てきます。

```
2016-01-08 14:16:21 +0900

61      141     masterthesis/method.tex
18      1       masterthesis/thank.tex
```

## DataFrameにする

頑張ってこんな感じにします。
![スクリーンショット 2016-12-17 14.38.17.png](https://qiita-image-store.s3.amazonaws.com/0/35173/b4603825-d44a-1abd-f54e-1b4774265fd3.png)


## 集計する
```py3
# 日ごとにリサンプリング
per_day = table.unstack().resample("d").sum().stack()

# 日毎の合計
tot = per_day.sum(axis=1).unstack()

# 累計（すなわり、頑張り）
tot["total"] = tot["plus"].cumsum() - tot["minus"].cumsum()
```

これで**頑張り**の時系列データが出来ました


# オマケ
コミケの原稿の進捗（本当はこれをプロットしたかった）
![comike_progress.png](https://qiita-image-store.s3.amazonaws.com/0/35173/16c78fc7-52ec-14ae-fab8-df77faeccdc2.png)
[Mac]普段日本語仕様キーボードを使っているが、US仕様キーボードも使う場合

職場では日本語仕様キーボードだが、個人ではUS仕様キーボードを使っている、
あるいはその逆のパターンでMacを使っている、
という人向けの話です。

## 修飾キーの設定
![image](https://qiita-image-store.s3.amazonaws.com/0/73615/8100c408-9513-0edf-6e97-e83c2395bd1f.png)

"caps lock"キーは必要ない気がします。
AZ/05M（あずにゃん）でU-Bootから起動する何かを作ろう

# AZ/05Mとは
ロシアの愛したTOSHIBA製Androidベースのクラウドブック。元々はAndroid 2.1ベースでタッチUIなし、ストアも使えないっていう微妙な立ち位置なんだけど、不思議とみんな大好き。勝手に移植されたKitKatベースのカスタムファーム入れたり、Ubuntu入れたり。これだけ愛されているのに、なぜかNetBSDは未だに動かない。

どんなに失敗しても文鎮化しない良い子。海外での型番はAC100、ボードの愛称はPAZ00（Linux kernel上のconfiguration名も）。

# Das U-Boot
元々はU-Boot使ってないんだけど、カスタムROMやUbuntuを入れる事を目的としてU-Bootが[移植されている](https://github.com/ac100-ru/u-boot-ac100-exp)。

# U-Boot standalone applications
U-Bootが提供するAPIを使ってU-Bootから起動してU-Bootに返るアプリケーションが書ける。オフィシャルなドキュメントは[こちら](http://www.denx.de/wiki/view/DULG/UBootStandalone)。

特定のアドレス（ARMなら0x0c100000）に読んで、先頭にジャンプしたら動くようなバイナリイメージを作れば良い。U-BootのAPIはU-Bootをbuildする際に生成されるexamples/standalone/stubs.o経由で呼ぶ。

その他、各種build flagをU-Bootのbuild時に指定した物に揃える必要があるので注意。フラグはわりとversionによって違ったりする。例えば先ほどのAC100向けにforkされたバージョンでは-ffixed-r8が指定されてるけど、trunkでARM versatile向けにbuildすると-ffixed-r9が指定されていたり、などなど。

# API
## 種類
Console I/Oくらいしかないんですが、逆にConsoleを扱う分には（UEFIと比べて）シンプルでわかりやすいAPIが提供されています。Consoleは最低限度の環境だとUARTだけだったりするのですが、ファームが対応していればLCD+Keyboardで動くstandaloneなConsoleが利用可能です（例えばAZ/05M向けのファームは対応済み）。

## 実例
getc()、putc()、puts()、printf()などは名前から推測される通り。その他、入力バッファにデータがあるかを確認するtstc()という便利な関数があります。

# cp-mega88の移植
## cp-mega88とは
拙作のCP/M動作環境です。元々はAVRマイコン上で動作していたのですが、デバッグ用のPOSIX buildがあったり、[以前のエントリ](http://qiita.com/toyoshim/items/7961fc3d776133348660)で紹介したUEFIから直接ブートするように作られたUEFIアプリなどがあります。コードはGitHubにて[toyoshim/cp-mega88](https://github.com/toyoshim/cp-mega88)として管理されています。

## コンソールI/O
tstc()のお陰でコンソール周りの実装は各種portの中で[一番シンプル](https://github.com/toyoshim/cp-mega88/blob/master/src/uart_uboot.c)になりました。UEFIなんかだとtstc()的な事をするために同期イベント作ってタイマーをセット、コンソールの入力と同期イベントを多重化して待つ……みたいな[仰々しいコード](https://github.com/toyoshim/cp-mega88/blob/master/src/uart_uefi.c)が必要になりますし、POSIXで書いてもfcntlやtermiosとお友達になる必要があり[結構面倒](https://github.com/toyoshim/cp-mega88/blob/master/src/uart_posix.c)。そういう意味では個人的には理想的なAPIです。

## ファイルアクセス
UEFIみたいなファイルシステムを提供するようなインフラは整備されていないようだったので、Linuxのinitramfs的な事を行いました。つまりU-Boot自体はext2を認識するので、ext2loadコマンドでディスクイメージをメモリ上の固定アドレスに配置し、アプリ側からはRAM fsのように扱います。

```
# ext2load mmc 0:1 0x0c100000 /boot/cp-mega88.bin
# ext2load mmc 0:1 0x0c200000 /boot/sdcard.img
# go 0x0c100000
```

具体的にはU-Bootからこのようなコマンドでcp-mega88.binを起動させ、ここで指定した0x0c200000をRAMディスクの先頭だと思って[ブロックデバイスをサポート](https://github.com/toyoshim/cp-mega88/blob/master/src/sdcard_uboot.c)しています。

# 雑感
繰り返しになりますが、UEFIよりずっとシンプルで、コンソールベースのアプリなら比較的簡単に書けました。ただグラフィックなどを触ろうとするとUEFIやBIOSより遥かに難しく、グラフィックカードやLCD毎にドライバ的な物を自前で書く必要があり現実的ではありません。そういう意味では本来の役割をわきまえているとも言えます。
ArrayBuffer関連の備忘録

WebGLでバッファやテクスチャなどを扱うと、ArrayBufferとArrayBufferViewを扱わなければなりません。この際、ArrayBufferとArrayBufferViewの適切な理解をしなければ多くのメモリを使ってしまったり、パフォーマンスを落としてしまったりすることがあります。

# ArrayBufferとArrayBufferView

まず、**ArrayBufferは、途中で容量を拡張したりすることができない要素が連続した配列**つまりは、C++やJavaにおける標準的な配列です。C++で扱うときは、配列の途中のポインタを取れば、その途中のインデックスが0のように扱えるように、連続していることができます。

```c
int* arr = new int[100];
int* arr2 = arr + 10;
int a = arr2[0]; // arrの10番目
```
(Cで書いたような例(最近ふれていないので何か間違っているかもしれない))

このように、**配列の途中からの要素をあたかも別の配列のように見えるようにするポインタ的存在**がArrayBufferViewです。

# TypedArray

`UInt8Array`や`UInt16Array`など型名が入っている配列は`TypedArray`と言います。 これは、実は`ArrayBuffer`のように見えて`ArrayBufferView`のような存在です。

つまり、以下のようなことをしても実際にメモリに確保されてるのは、`ArrayBuffer`の100バイト分になります。

```js
const arr = new ArrayBuffer(100);
const arr2 = new UInt8Array(arr,10);
const a = arr2[0];
```

要するに、ただ単にオフセットを指定して、あたかも配列のように扱わせる、ポインタのようなものかつ、型を指定して値を取れるためのものが`TypedArray`です。

`TypedArray`はサイズをコンストラクタにとってそのサイズ分の配列を作成することができます。

```js
const arr = new UInt8Array(100);
```

しかし、これはあくまで以下の別記法にすぎません。

```js
const arr = new UInt8Array(new ArrayBuffer(100),0);
```

したがって、コンストラクタにサイズを指定したとき以外、`TypedArray`では実際の配列が確保されることはありません。

# ArrayBuffer#slice()

sliceをすると、`ArrayBuffer`の指定した部分だけコピーすることができます。しかし、これは`TypedArray`などの役割とは異なり、実際に`ArrayBuffer`がコピーされます。したがって、その分だけ利用しているメモリは増えます。

# おわり

以上、雑でしたが無駄に配列をコピーしてしまうことのないよう、素晴らしいパフォーマンスをWebGLで実現したいですね!
GoogleDriveのファイルがなくなる！

本日は情シス分野から。

弊社ではG Suite(旧Google Apps for Work)を利用しています。
Gmailを利用したりカレンダーでスケジュールを共有したり、GoogleDrive内でのファイルの共有をしたりと大変便利ですね。
便利な半面、使い方を間違うと利便性を損なうので注意が必要ですね。

ドライブ内のファイルが突然なくなる
===
自ら削除してしまった場合、いつの間にか消えてしまった場合でも、自分がファイルのオーナーであれば、ゴミ箱に残っているので復元できます。
ただし、完全に削除した場合は戻すことができません。
その場合は諦めて管理者かGoogleさんに問い合わせましょう。
個人アカウントの場合は25日間、ファイルの復旧ができるようです。


ユーザ削除の際には
===
情シスとして気をつけなければいけないのが、退職者アカウントを削除するときです。
アカウントを削除する際には、そのユーザが所有しているファイル等を他のユーザに譲渡するか確認されます。
![スクリーンショット 2016-12-17 4.38.07.png](https://qiita-image-store.s3.amazonaws.com/0/154013/3c43a5cb-e524-1513-1b87-032b174b3af5.png)

ここで共有されているファイルがあるにもかかわらず、権限譲渡を行わないままユーザを削除すると悲劇が起きます。
該当ファイルを使用していた他のメンバーからファイルがキレイになくなります。
そして情シス担当のところに問い合わせが来て復旧を試みるのですが、ファイルの復元には5日しか猶予がありません。。
それ以上時間が経ってしまうと復旧できず冷たい目で見られることになるので要注意です。

また、権限譲渡を行った先のユーザにも注意が必要です。
特にデザイナーさんのような大きいサイズのファイルを扱っている場合、権限譲渡を行ったユーザが容量オーバーになってしまうケースがあります。
容量オーバーになったユーザはメールも受信できなくなってしまうので要注意です。
ただ、ここで削除ユーザの所有しているファイルを選択できたり、何人かに分けて譲渡できればいいのですが、そんな気の利いた機能はありません。
容量オーバーになったときには、ファイル毎にオーナー権限を他のユーザに譲渡して自分の要領を空ける必要があります。
フォルダ内のすべてのファイルの権限を譲渡したいところですが、現状ファイルごとに設定しないといけません。
このあたりに改善をお願いしたいところですね。

ローカルPCへの同期
===
GoogleDriveはWindowsやMac版のドライブがダウンロードでき、エクスプローラーやファインダー内に同期して利用できます。
とても便利なのですが、ローカルPCには同期したフォルダ分の容量が使われます。
また、便利な半面かんたんに削除ができてしまうので要注意です。

おわりに
===
一部分について簡単に振り返りましたが、とても便利なGoogleのサービス群ですので権限設定や保護設定など、使い方次第で利用方法に幅が広がります。
今後も利用方法など考えていきたいと思います。
iPhone7でビデオにノイズが発生する問題について

#<i class="fa fa-lightbulb-o"></i> 問題 <i class="fa fa-lightbulb-o"></i>

Q. 新しく購入した新品のiPhone7で動画を撮ると、最初の方に「ガッ！ザザザー...」というノイズが発生します。なんとかなりませんか？

A. なんとかなります。以下の手順を試してみてください。

# <i class="fa fa-hand-stop-o"></i> 手順 <i class="fa fa-hand-stop-o"></i>
1. **新品のiPhone7についているフィルム（ホームボタンの部分がびらびらしているもの）を剥がしてみる。**
2. iPhone7を再起動してみる。
3. Appleコールセンターに相談してみる。 <i class="fa fa-phone"></i>
 0120-277-535
卒業論文要旨の書き方

この記事は [岩手県立大学 Advent Calendar 2016](http://qiita.com/advent-calendar/2016/ipu) の17日目の記事です．
何を書こうか迷ったんですがせっかく大学のAdvent Calendarなので卒業論文要旨をイイカンジに書く方法について書きたいと思います．
Mediumで書こうと思ってたけど，研究タグがあったのでとりあえずQiitaにしときます．

# スケジュール
今年度のスケジュールはこんな感じです．

> 提出開始　：　2017年1月06日（金）13:00
 締め切り　：　2017年1月12日（木）16:00

だいたい例年こんな感じですね．
年末年始は休みたい人が多いと思うのでなんとかクリスマス前には書き終えて，年が明けてからは文章の推敲だけにしたいところです．

# 書式
> （1） 用紙
原稿サイズ：A４版
枚数：２枚
マージン：上下左右とも25mm程度
（2）原稿の体裁
1. 標題（和英両方；２行；文字を若干大きく；センタリング；この後１行あける）
2. 講座名 学籍番号 氏名（１行；「○○講座 0311998200 ○○」；右寄せ．区切りは空白）
3. 指導教員氏名（１行；右寄せ；「指導教員：○○○ ○○○...」と表記；この後１行あける．区切りは空白）
4. 本文（ここから２段組）
（3）本文を表記する上での注意事項
1. 句読点は"．"および"，"を用い，それぞれ1画（1字分）を用いる．
2. 図・表には，図１および表１のような通し番号と名称を和文でつける．
（4）参考文献の表記について
本文中の引用箇所には，1) 2)のように片括弧で上付き半角で表記し，末尾にその文献を参照順にまとめて記述する．

ここも例年通りです．
気をつけなければならないのが参考文献の表記方法です．
`[1][2]`ではなく`1) 2)`なことに注意です．
どんなに研究の進捗がなくても書式だけは守りましょう．

# 何を使って要旨を書くか
以下の3つが考えられるんじゃないでしょうか．

1. TeX
2. Microsoft Word
3. Adobe InDesign

## TeX
文章用のマークアップ言語です．
数式が綺麗とよく言われている気がします．
あとメリットとしては好きなエディタで書けることやgitなどのバージョン管理がしやすいことが挙げられます．
とは言っても今のB4はTeXは講義で扱ってないので難しいかな．
修士や博士を考えている人は書けるようになってもいいかもしれない．

## Microsoft Word
これでいいと思う．

## Adobe InDesign
WordはMS明朝やMSゴシックならうまくいくけどヒラギノやら黎ミンを使おうとすると体裁がうまくいかないことが多いです．
その点InDesignはDTPで使われているので1行の文字数とか行間の距離とかどんなフォントでもちゃんとやってくれるのがメリット．
図もWordと違ってillustratorのファイルもD&Dで挿入できるのでいちいちemfで出力しなくてもいいのが便利です．

# 作図
illustratorを使おう！！
とはいえPowerPointで作図している人がほとんどですかね．
それならば少なくともPowerPointから出力するときにemfというベクタ形式で出力するようにしましょう．
グラフをExcelで作った時も同様でemfで出力するように．
pngやjpgなどのラスタ形式で出力すると図内の文字とかは最悪な状態になります．

# 文章構成
要旨は2ページなのでそんなに多く書くことはできません．
とりあえず項目は以下の感じでいいんじゃないでしょうか．

- はじめに
- システム概要
- プロトタイプシステム
- 評価実験
- おわりに

## はじめに
研究の背景や問題点，目的を書きます．
「〜〜〜が問題だと""思った""」というのは背景や問題と言えません．
感想文ではないので客観的に書きましょう．
なぜその研究が必要なのか，研究するに至った問題点を整理しましょう．
関連研究を上げる際はただdisるのではなく，関連研究では研究目的のこの部分が不足している……のように書きます．
また，問題点から研究の目的を明確に示します．

## システム概要
システム概要図やシステムアーキテクチャを用いて提案手法の概要を示します．
システムの利用者がどのようにシステムを利用するのかを分かりやすく書きます．
また，アーキテクチャの図を示しながら端末や提案機能がどのように構成されているのかを書きます．
提案手法や機能のアルゴリズムもここで示します．

## プロトタイプシステム
タイトル通りプロトタイプシステムについて書きます．
基本はシステム概要で述べているので，提案機能をプロトタイプシステムではどのように実現するのかを具体的に示します．
例を上げるとプロトタイプシステムで使用する機材/OS/ライブラリなどを示します．

## 評価実験
プロトタイプシステムを使用した評価実験の方法や結果・考察などを書きます．
「”はじめに”で述べた目的がどの程度達成できたのか」というのが評価です．
研究の目的と評価実験の目的の整合性をとりましょう．
よく要旨に評価が載っていない先輩がいますが，参考しないようにしよう．

## おわりに
研究のまとめを書きます．
「この論文で述べたこと」をまとめるということを意識します．

# フォント
書式でフォントを指定していないので好きなフォントを使うことが出来ます．
とはいえ通例に従うのがいいと思います．

## タイトル・見出し
通例ではゴシック体を使います．
悩んだらMSゴシックでOKです．
それ以外だと選択肢としては以下の感じでしょうか．

- 見出ゴMB31
- 中ゴシックBBB
- ヒラギノ角ゴシック

## キャプション
通例ではゴシック体を使います．
悩んだらMSゴシックでOKです．

## 数式
斜体が基本です．
フォントはTimes New RomanでOKです．
TeXの数式をラスタ形式で出力して画像で貼り付けてもいいかもしれない．

## 本文
通例では明朝体を使います．
悩んだらMS明朝でOKです．
間違ってもMS P 明朝は使わないでください．
MS明朝以外だと以下のフォントあたりが選択肢になるとおもいます．

- リュウミン
- 黎ミン
- ヒラギノ明朝

## 注意点
日本語はMS明朝，英数字はArialというのはやめましょう．
フォント大好きマン以外は本文のフォントは全部MS明朝でやる！ぐらいでいいです．

# まとめ
要旨をイイカンジに書く方法について書いてみました．
とはいえ私もまだ修士なので気をつける点はもっとあると思います……
本学の要旨は全世界に公開されます．
ゴミを公開したくはないですよね．
この記事がすこしでも参考になれば幸いです．

明日の担当は [n0bisuke](http://qiita.com/n0bisuke) さんです．
実際に講義を受けたうちの1人なので楽しみです！！
Jsoupで簡単ウェブスクレイピング

## はじめに
[Jsoup](https://jsoup.org/)というライブラリを使うと簡単にウェブスクレイピングできちゃいます。つかいこなせばWeb Automationなどもできちゃいますね。Jsoupで出来る簡単な処理をAPIにしたのであわせて紹介します。

## 注意事項
スクレイピングの可否は先方の規約に依存します。例えば、Amazonのようにスクレイピングを禁止しているサイトへのスクレイピングは禁止です。場合によっては法的な措置を取られますのでルールはちゃんと守りましょう。

## 使ってみる
公開したAPIです。

- [URL2HTML](https://apitore.com/store/apis/details?id=12)
- [URL2TEXT](https://apitore.com/store/apis/details?id=13)
- [URL2HREF](https://apitore.com/store/apis/details?id=14)
- [URL2SRC](https://apitore.com/store/apis/details?id=15)

それぞれ「URLをHTMLにして出力」「URLからテキストを抜き出して出力」「URLからURL内部のHrefリンクを全部抜き出して出力」「URLからURL内部のimgタグのsrcリンクを全部抜き出して出力」します。

ためしに[Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%A6%E3%82%A3%E3%82%AD%E3%83%9A%E3%83%87%E3%82%A3%E3%82%A2)についてのwikipedia記事をURL2TEXTしてみます。途中を中抜しましたが、このように本文のテキストを取れます。

```
{
  "log": "",
  "startTime": "1481723361899",
  "endTime": "1481723362888",
  "processTime": "989",
  "text": "ウィキペディア - Wikipedia ウィキペディア 出典: フリー百科事典『ウィキペディア（Wikipedia）』 移動先: 案内、 検索 本項目は、百科事典の記事としてウィキペディアを説明したものです。
...
最終更新 2016年10月2日 (日) 09:22 （日時は個人設定で未設定ならばUTC）。 テキストはクリエイティブ・コモンズ 表示-継承ライセンスの下で利用可能です。追加の条件が適用される場合があります。詳細は利用規約を参照してください。 プライバシー・ポリシー ウィキペディアについて 免責事項 開発者 Cookie statement モバイルビュー"
}
```

つづいて、[Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%A6%E3%82%A3%E3%82%AD%E3%83%9A%E3%83%87%E3%82%A3%E3%82%A2)についてのwikipedia記事をURL2SRCしてみます。途中を中抜しましたが、このように本文内のimgのURLを取れます。

```
{
  "log": "",
  "startTime": "1481724733607",
  "endTime": "1481724734550",
  "processTime": "943",
  "links": [
    "https://upload.wikimedia.org/wikipedia/commons/thumb/f/fc/Padlock-silver.svg/20px-Padlock-silver.svg.png",
    "https://upload.wikimedia.org/wikipedia/commons/thumb/5/5a/Wikipedia%27s_W.svg/20px-Wikipedia%27s_W.svg.png",
    "https://upload.wikimedia.org/wikipedia/commons/thumb/5/5f/Disambig_gray.svg/25px-Disambig_gray.svg.png",
    "https://upload.wikimedia.org/wikipedia/commons/thumb/8/80/Wikipedia-logo-v2.svg/100px-Wikipedia-logo-v2.svg.png",
...
}
```

## APIコールサンプル

- [Javaサンプル](https://github.com/keigohtr/apitore-response-parent/tree/master/jsoup-response)

## 元ネタ

- [【API】URLからHTMLを抽出する（URL2HTML、URL2TEXT）](http://blog.apitore.com/2016/12/15/api-url-to-html/)
- [【API】URLからURL内のリンクを取る（URL2HREF、URL2SRC）](http://blog.apitore.com/2016/12/16/api-url-to-links/)


## おわりに
ウェブスクレイピングができると色々と週末ハッカソンが捗ります。もちろんルールを守って迷惑かけずに使いましょう。
vim: タブインデント（スペース8個分）を一気にスペース2個分に変えたい

作業をしていて「vimrcでscssのファイルタイプにあった細かい設定をしていなかったのでタブインデント（スペース8つ分）になっていた。これどうにかして一気にスペース二つに変えられないかな」と思ったのでちょっと調べてみた。
そこで`retab`を使ってインデンテーションをタブをスペースに変えてから`:%s /[スペース8こ]/[スペース2個]  /gc`で変えていくことにした。
![vimmer7.gif](https://qiita-image-store.s3.amazonaws.com/0/87666/08bf8255-8b74-8562-f77d-7bc028976e9b.gif)

恐らくもっとてっとり早い方法はファイルごとに設定を書いておくことだと思うし、この作業一つとってももっと効率の良い方法があるのだと思うのですが、vim初心者の僕が瞬時に思いついた方法でもあったので。。。

#参考にしたリンク
- [How to replace tabs with spaces?](http://vi.stackexchange.com/questions/495/how-to-replace-tabs-with-spaces)
Macportsのeasy_installでバージョンを自動解決して実行する


Macportsでバージョンの異なる複数のPythonをインストールしてしまい色々とやらかしている環境で、うっかり`easy_install`を叩いた時にport selectで選択しているPythonのバージョンに対応したeasy_installを自動的に選択して実行して欲しかったので、ラッパースクリプトを書いてみました。(日本語が長すぎ)

バージョン切り替えの手法が色々あるのがPython入門者にとってはカオスです...

```bash
#!/bin/bash
###
### Macports easy_install wrapper
###   Created by H.Ishiura 2016-12-17
###

SELECT=`port select --show python`
if [[ "$SELECT" =~ ^The\ currently\ selected\ version\ for\ \'python\'\ is\ \'python(.)(.)\'\.$ ]]; then
    MAJOR_VERSION=${BASH_REMATCH[1]}
    MINOR_VERSION=${BASH_REMATCH[2]}
    COMMAND="easy_install-${MAJOR_VERSION}.${MINOR_VERSION}"
else
    COMMAND="/usr/bin/easy_install"
fi
${COMMAND} $@
```

このスクリプトを実行権をつけて/usr/binや/opt/local/binよりも優先的に検索されるディレクトリに配置します。
以下は導入の例です(動作は確認していません)

```bash
$ sudo port install python27
$ sudo port install py27-readline
$ sudo port install py27-setuptools
$ sudo port install py27-pip
$ sudo port install python35
$ sudo port install py35-readline
$ sudo port install py35-setuptools
$ sudo port install py35-pip
$ sudo port select --set python python35
$ sudo port select --set pip pip35
$ curl https://gist.githubusercontent.com/ura14h/6742ae07036dcf74b30de5d2ff8931a9/raw/f30e3887421e93a26df5553eb5c425cb7d7407e2/easy_install -o easy_install_wrapper
$ mkdir ~/bin/
$ mv easy_install_wrapper ~/bin/easy_install
$ chmod 755 ~/bin/easy_install
$ export PATH="${HOME}/bin:${PATH}"
```

あとは普通にコマンドを叩きます。

```bash
$ easy_install --version
setuptools 30.3.0 from /opt/local/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages (Python 3.5)
```

ちなみに、バージョンを特定して実行する場合はこんな感じです。

```bash
$ /usr/bin/easy_install --version
setuptools 18.5 from /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python (Python 2.7)
$ 
$ easy_install-2.7 --version
setuptools 30.3.0 from /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages (Python 2.7)
$ 
$ easy_install-3.5 --version
setuptools 30.3.0 from /opt/local/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages (Python 3.5)
```

本当は、`port select --set easy_install easy_install-3.5`っぽいことができればいいんですけどね...。いや、そもそもMacportsをやめればいいのか...。
業務でよく使ったHadoopコマンドについて

開発時に手動やshellでよく使ったHadoopコマンドの覚え書きです。
[公式サイト](https://hadoop.apache.org/docs/r2.7.2/hadoop-project-dist/hadoop-common/FileSystemShell.html)では他にも紹介されています。

# ディレクトリ内のディレクトリ/ファイル列挙

```
hadoop fs -ls /target/dir/
```

# ディレクトリ作成
```
hadoop fs -mkdir /target/dir/001
```


# ファイル削除
```
# 基本 
hadoop fs -rm /target/dir/abc.txt
# 削除ファイルをワイルドカード指定可
hadoop fs -rm /target/dir/*.txt
```

# ディレクトリ削除
```
hadoop fs -rmr /target/dir/
```

# HDFSからローカルにファイル転送
```
# 基本
hadoop fs -get /hdfs/target/from/abc.txt /target/to/
hadoop -copyToLocal  /hdfs/target/from/abc.txt /target/to/
## 10回リトライ
hadoop fs -D dfs.client.block.write.locateFollowingBlock.retries=10 -copyToLocal  /hdfs/target/from/abc001.txt /target/to/
# 転送ファイルをワイルドカード指定可
hadoop fs -D dfs.client.block.write.locateFollowingBlock.retries=10 -copyToLocal  /hdfs/target/from/abc*.txt /target/to/
```


# ローカルからHDFSにファイル転送
```
# 基本
hadoop fs -put /target/from/abc.txt /hdfs/target/to/
hadoop -copyFromLocal  /target/from/abc.txt /hdfs/target/to/
# 10回リトライ
hadoop fs -D dfs.client.block.write.locateFollowingBlock.retries=10 -copyFromLocal  /target/from/abc001.txt /hdfs/target/to/
# 転送ファイルをワイルドカード指定可
hadoop fs -D dfs.client.block.write.locateFollowingBlock.retries=10 -copyFromLocal  /target/from/abc*.txt /hdfs/target/to/
```

# その他
HDFS上の圧縮ファイルをローカル転送後に解凍してまた転送する以外で方法ないか考えた時に
@yu-iskwさんの[HDFS 上の Gzip のような圧縮ファイルを HDFS 上で解凍する方法](http://qiita.com/yu-iskw/items/a74533e0d6bc0e864448)記事を見つけた。
それに加えて、圧縮ファイルが複数あり一度のコマンドで同じようなことしようと思ったが、思いつかなかったので備忘録としておく。
かわいいは作れる！？ 3分で-6kgの顔が作れるPhotoshopCC2017の新機能がすごすぎる！


dots.女子部のアドベントカレンダー、17日目はタミーがお送りします。
普段女子っぽいこと全然しないのですが、せっかく女子部のカレンダーなので女子っぽいネタを投稿してみました！

エンジニアなのでPhotoshopは時々しか開きませんが、ちょっと社内でインタビュー記事のせてもらうことになり、撮ってもらった写真を加工していたらPhotoshopCC2017がやべーよっていうのを教えてもらったのでこの衝撃を共有したいと思います。
（※正確にはPhotoshopCC2015.5からあった機能で、2017でさらに強化されたようです）

## とりあえず3分整形の結果から

![hikaku.jpg](https://qiita-image-store.s3.amazonaws.com/0/53303/1d004e71-c4ff-66bc-864f-6977deda7a0c.jpeg "hikaku.jpg")

わかります？これ輪郭ほっそーりしてるのわかります？？
「ゆがみ」って機能使ってるんですが、ずっと比較してみてるとオリジナルの方がゆがんでみえt .. ゲフンゴフン
これ以上は悲しくなるのでやめましょう。
（ちなみに私は今ダイエット中で、この写真の時より4キロくらい減っているから今はAfterに近いはず・・たぶん・・）

## つくりかた

対象の写真を開いて、
フィルター > ゆがみ を選択します。

![スクリーンショット 2016-12-17 11.03.48.png](https://qiita-image-store.s3.amazonaws.com/0/53303/60bb74f5-d82a-76a2-91ce-16dfcff4575b.png "スクリーンショット 2016-12-17 11.03.48.png")

あとはいじって遊んでみれば大体わかるんですが、一応機能を紹介するとこんな感じです。

### 目の大きさを変える
![eye.gif](https://qiita-image-store.s3.amazonaws.com/0/53303/0e37f3a1-ecf2-02f8-a11e-9ac9b597139c.gif "eye.gif")
女の子はぱっちりおめめに憧れるよね。でもやりすぎはダメ。絶対。
真ん中のリンク(鎖みたいな)ボタンをONにしていると、両目一緒に調整できます。

### 鼻の高さ・幅を変える
![nose.gif](https://qiita-image-store.s3.amazonaws.com/0/53303/85987d45-fad0-318a-e39b-cc21dba26727.gif "nose.gif")

あれ？なんかブサイクになってない？
戻そう戻そう。

### 口元を笑顔に！
![mouse.gif](https://qiita-image-store.s3.amazonaws.com/0/53303/cab70a09-2b25-9e66-8e09-302f0603eda1.gif "mouse.gif")

笑うのが苦手な人もスマイルに！

### 輪郭を変える！
![face.gif](https://qiita-image-store.s3.amazonaws.com/0/53303/e140d6fa-2315-57f4-77f7-3293a3f5a15e.gif "face.gif")

ゲージ振り切って全力で小さくしました。
目の間隔が変になるので、ちょっと調整してあげます。

### 直接マウスでいじることも！
![choku.gif](https://qiita-image-store.s3.amazonaws.com/0/53303/90653009-35c2-77a1-a3ef-e170a2683c67.gif "choku.gif")

これらを使っていい感じにするだけですね。簡単！
2017でパフォーマンスも改善されているらしく、プレビューの反応が高速になっているらしいです。

「ゆがみ」機能は以前からありましたが、2015.5まで顔認識はなかったため加工の手間はひとクセあったようです。
これなら誰でも簡単に ~~詐欺写真~~ かわいい写真を作ることができますね！！


## PhotoshopCC2017のその他の新機能
ついでにいろいろと見てみました。よくまとまってるので参考URLを。
[公式アップデート情報](http://www.adobe.com/jp/products/photoshop/features.html)
[PhotoshopCC 2017の新機能を一気にチェックしよう！【まとめ】](http://www.seleqt.net/design/photoshop-cc-2017-new-features/)

特に気になるのは、このあたり。

### AdobeStockテンプレートをスタートアップ画面に
新規作成時に選べるようになったようです。デザインが豊富でわくわくしますね。
![スクリーンショット 2016-12-17 12.43.51.png](https://qiita-image-store.s3.amazonaws.com/0/53303/f74a0b92-28fb-7c78-efdc-01dfbe9b67a1.png "スクリーンショット 2016-12-17 12.43.51.png")

### Adobe Experience Design CCとの連携強化
Photoshopのアセットを直接Xdの方に移すことができるようになりました。

### 選択とマスクのワークスペース(2015.5~)
切り抜きがめっさ簡単になったらしいです。（これも2015.5~だけど知らなかった・・）
参考：[ベテランほど知らずに損してるPhotoshopの新常識（3）“ふわふわ/もこもこ”も、どんと来い！［選択とマスク］で実現するスピーディな切り抜き](https://blogs.adobe.com/creativestation/dtp-photoshop-kihon-tips-03)

## あとがき
こんな体(顔?)を張った記事になってしまうとは思いませんでした。みなさんがいいね！してくれるほど自分の太い顔がさらされると思うと複雑ですが、フォトショの恩恵を授かれる人がより増えるならば本望です。

・・・ダイエット頑張ろう。
Unity プロジェクトビューのPrefabの構造を簡易的に全階層表示するエディター拡張

#はじめに
Unityのプロジェクトビューでプレファブは2階層までしか表示できないのはちょっとだけ不便なので、
プロジェクトビューのプレファブを選択したときに別のエディターウィンドウに全階層を表示してみるようにしてみました。

ササっとプレファブの3階層以上先の中身のゲームオブジェクト名を確認できるようにしてみました。


![image](https://qiita-image-store.s3.amazonaws.com/0/148284/5ea33cb4-4c3d-d5d2-2c64-d707281c9139.png)

プロジェクトビューでプレファブを選択し、
![Project.png](https://qiita-image-store.s3.amazonaws.com/0/148284/3ff6d35f-235f-2556-73f8-8ee0dbeeb77e.png)

今回作成したPrefabViewerエディターウィンドウに全階層が自動で表示されているところ
![PrefabViewer.png](https://qiita-image-store.s3.amazonaws.com/0/148284/91fc6e21-420e-c346-a166-87a48036d675.png)

そもそもプレファブは階層を深くしないように作るのが望ましいですが。。


#環境
Unity 5.4.0f3

#コード

```csharp

using UnityEngine;
using UnityEditor;

public class PrefabViewer : EditorWindow {
	
	[MenuItem ("Window/PrefabViewer")]
	static void Show () 
	{
		EditorWindow.GetWindow<PrefabViewer>();
	}

	void OnGUI()
	{
		if( Selection.activeGameObject != null &&
			PrefabUtility.GetPrefabType(Selection.activeGameObject) == PrefabType.Prefab )
		{
			var root = PrefabUtility.FindRootGameObjectWithSameParentPrefab(Selection.activeGameObject);
			// Unity2017.2.1以上ではコメントアウトを外して代わりにこちらをご使用ください。
			// var root = PrefabUtility.FindPrefabRoot(Selection.activeGameObject);
			FoldOutRecursive(root.transform);
		}
		Repaint();
	}

	void FoldOutRecursive(Transform t)
	{
		EditorGUI.indentLevel++;
		EditorGUILayout.Foldout(true,t.name);
		foreach(Transform c in t)
		{
			FoldOutRecursive(c);
		}
		EditorGUI.indentLevel--;
	}
}

```

#プロジェクトビューの中のプレファブだけに限定する

PrefabUtility.GetPrefabType(Selection.activeGameObject) == PrefabType.Prefab
という比較で、PrefabViewerに表示できるものをプロジェクトビューの中のプレファブだけに
限定してます。

PrefabTypeは
https://docs.unity3d.com/ja/current/ScriptReference/PrefabType.html
によるとほかにも
>PrefabType.ModelPrefab:3D モデルをインポートして作成されたプレハブです

などがありますが、とりあえず、普通のプレファブだけとします。

#ヒエラルキービューの折り畳みを描画する
EditorGUILayout.Foldout
で三角形とオブジェ名を表示できるので、EditorGUI.indentLevel++でインデントレベルをあげてから
描画しつつ、子のTransformにアクセスして、再帰的に呼び出しています。

子の描画が終わったらインデントレベルを1段階戻しています。(indentLevel--)

あるTransformをforeachでイテレートすると、その子どものTransformたちにアクセスできます。

#PrefabUtility.FindRootGameObjectWithSameParentPrefab
プレファブの親（Root)をとれます。
これで、プレファブの2番目の階層（GameObjectプレファブでいうChild1、Child2、Child3）が
選択されているときも親が選択されていることにして描画しています。
## 追記です。2018/03/01
Unity2017.2.1以上では

```
PrefabUtility.FindRootGameObjectWithSameParentPrefab
```

はプレファブのインスタンスに対してのみ有効な結果が返るため、Unity2017.2.1以上ではPrefabViewerに正しく表示がされていなくなっていました。

##PrefabUtility.FindRootPrefab
こちらのメソッドが、インスタンスにせよ、アセットにせよ使用できるため、代わりにこちらを使用することで親が正しく選択されるようになります。

#まとめ

簡易的にプレファブ階層を表示できるようになりました。

以上です。
Webhookとは？

Webhookを利用した記事はよく見かけますが、そもそもWebhook自体が何なのか、何を指しているのかよくわからなかったため、それに関しての備忘録です。

# Webhookとは？
- アプリケーションの更新情報を他のアプリケーションへリアルタイム提供する仕組みや概念のこと。
- イベント（リポジトリにプッシュなど）発生時、指定したURLにPOSTリクエストする仕組みのこと。

Webhookの説明を見ると**「通知する、Webhookを送る」**などの言葉が用いられているが、
これは**POSTリクエストのことを指している**。

## Webhookを利用すると何ができるのか？
GitHubやSlackなどのサービスのWebhookを利用すると、ユーザーはサービス側がPOSTリクエストするURLを指定できる。
つまり**サービスがPOSTリクエストしたパラメータに対しての処理（パラメータをSlackに通知など）を自由に指定できる。**

例えばGitHubのWebhookはリポジトリにプッシュ時、コミット情報をパラメータとしてPOSTリクエストする。
そのため、プッシュ時にコミット情報をSlackに通知をしたり、メールに通知できる。

上記の通り、サービスは特定のイベント発生時にPOSTリクエストするだけなので
「GitHubのWebhookを利用して、コミット情報をSlackに通知する」
ではなく
「GitHubのWebhookを利用して、**GitHubのPOSTリクエスト先にコミット情報をSlackに通知するURLを指定する**」
と言った方が厳密には正しい。

## GitHubのWebhookを利用してみる
GitHubのWebhookを利用して、Commit AuthorをSlackに通知するURLをPOSTリクエスト先に指定してみる。
※あくまでWebhookの説明記事のため、具体的な説明は割愛します。

リポジトリの「Settings」を開き、左メニューの「Webhooks」を開く。
「Payload URL」がPOSTリクエスト先のため、そこにCommit AuthorをSlackに通知するURLを指定する。

![webhook.jpg](https://qiita-image-store.s3.amazonaws.com/0/69667/9a5de685-0b5b-f4a1-3015-685274485158.jpeg)

GitHubはPOSTリクエスト時にcommit情報などのパラメータを送信してくれるため、
以下のような処理が実行されるURLを指定すると

```py
import slackweb

def lambda_handler(event, context):
    slack = slackweb.Slack(url="https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX")
    commiter = event['commits'][0]['committer']['username']
    text = "{0} pushed".format(commiter)
    slack.notify(text=text)
```

リポジトリにプッシュ時、SlackにCommit Authorが通知される。
![push.jpg](https://qiita-image-store.s3.amazonaws.com/0/69667/21a18c7c-8a37-2dab-bd09-8bd31fca4b8e.jpeg)

# 終わり
長々と書きましたが、**やってることはただのPOSTリクエストです。**

 「SlackのWebhook使おうぜ！」
 と言われたら
 「ユーザーが投稿などをした際に、Slackが指定したURLにPOSTリクエストしてくれるから、それ使おうぜ！」
と言っているものだと思えば良いと思います。

## お知らせ

Udemy で webpack の講座を公開したり、Kindle で技術書を出版しています。

Udemy:
[webpack 最速入門](https://www.udemy.com/course/practical-webpack/?couponCode=B6D5AE3897554CBBDAD7)（**~~10,800 円~~ -> 2,000 円**）

Kindle（Kindle Unlimited だったら無料）:
[React Hooks 入門](https://www.amazon.co.jp/gp/product/B08JTXQ2M6)（500 円）

興味を持ってくださった方はご購入いただけると大変嬉しいです。よろしくお願いいたします。
【Unity】EditorWindowのファイル名とクラス名が異なるとUnity起動時に "Error while reading window layout" が出る

#環境
Unity **5.5.0f3** (Windows 10)

#はじめに
EditorWindowを作っていたら、こんなエラーが出ました。

![image](https://qiita-image-store.s3.amazonaws.com/0/44288/2bfd90ea-1439-bed8-66f4-fa95e39bddda.png)

なんだこれ.

# エラーの原因
EditorWindowクラス名とcsファイル名が**一致しない場合に**発生するエラーのようです

# エラーを再現してみる
以下のEditorWindowを開いたままUnityエディターを再起動するとエラーが発生します。

```HogeWindow1.cs
using UnityEditor;

public class HogeWindow : EditorWindow
{
    [MenuItem("EditorWindow/HogeWindow")]
    static void Open()
    {
        GetWindow<HogeWindow>();
    }
}
```
csファイル名とクラス名が**異なる**文字列になっているところがポイントです

#エラー解決
EditorWindowクラス名とファイル名を同じものにすればエラーが出なくなります。(完)
ファジィ理論とは何か

#ファジィ理論が生まれた理由
人間の言語をコンピュータへの入力として使いたかった

#ファジィ
ファジィとは「曖昧（あいまい）」という意味である。
人間の感覚的な部分、例えば温度を表現する場合、「ちょうどよい」「なんとなく」など明確な数値が難しい曖昧なものを表現する理論である。
通常、1か0で表わすものを、0.7や0.3など中間の値で表わすことで、曖昧さを表現するのである。

#推論とは
いろいろなルールを結合して矛盾のない答えを導き出すための手法です
最も基本になるのはアリストテレスの三段論法というものです
これは「ソクラテスは人間である。人間は死ぬ。よって、ソクラテスは死ぬ」という三段階で結論を出すものです
知識をもとに、新しい結論を得ること

#ファジィ概念
概念を表現する際に数値を用いる表現と数値を用いない表現がある
数値を用いる表現 **=** 境界のはっきりした概念→**クリスプ概念**
数値を用いない表現 **=** 境界がぼんやりとはっきりしない→**ファジィ概念**
ファジィ(fuzzy)という言葉は1965年にザデー教授が提唱した「ファジィ集合論」に基づく

##例

「大人になったら自分の行動に責任をもちなさい」など子供から成長していって大人になるという意味を表す表現として
【満20歳以上である】と【大人である】という言い回しがある
僕たちは状況に応じてこれらを使い分けている

###ファジィ概念のグラフによる表現
**満20歳以上である**
![満20歳以上である.PNG](https://qiita-image-store.s3.amazonaws.com/0/130026/d9aed30e-d80e-c7ff-3a12-6f2f12ad41d7.png)

**大人である**
![大人である.PNG](https://qiita-image-store.s3.amazonaws.com/0/130026/43503b31-232c-e153-0f1a-d7cb01234186.png)
上の図のようなグラフであらわされる関数のことをメンバーシップ関数と呼んでいる

これらの概念は大まかに次の3種に分類される
①クリスプ概念だけ
②クラスプ、ファジィの両方の概念が存在する
③ファジィ概念だけ

|クリスプ概念|ファジィ概念|
|:----------|:----|
|人間である||
|犬である||
|植物である||
|満20歳以上である|大人である|
|満65歳以上である|老人である、 年老いている|
|身長175cm以上である|背が高い|
|気温セ氏28℃以上である|暑い|
||美しい|
||なめらかだ|
||おいしい|


○○であるの○○に当てはまる内容で概念を判断できる
①はモノを外観や構造によって分類し、つけられたモノの名前(名詞)が入っているという特徴がある
③はモノの性質・属性を表す言葉、一般的には形容詞、形容詞的な語句がくる特徴がある


#メンバーシップ関数
ファジィ理論は主観なので、背の高い人の基準を決めるとき100人に聞いて平均値を出す統計(客観的)に出すことは間違っている。
では、メンバーシップ関数をどう決めれば良いのだろうか

1. 現在のところ与えられたファジィ概念を表すメンバーシップ関数を決定する一般的な方法はない
2. メンバーシップ関数に標準的なメンバーシップ関数というものはない
 1. メンバーシップのグレードが何かの何かに対数割合を表しているのではない
 2. メンバーシップのグレードが基本的には個人主観によって決まる

2.1.の解決は個人的主観に基づく信念や確信の度合いをグレード値として出す。これにより大小比較が可能になる
2.2.の解決は主観の背後には一種の客観性、共通性が存在する。
よって、ファジィ概念は主観と客観の両方によって決まる

**ファジィ概念** = **客観的部分** + **主観的部分**

客観性と主観性の比重は一定ではない
客観性が強い→「背が高い」「年老いている」**物理的尺度を持つ**
　　　　　　　「美人」**物理的尺度を持たない**
主観性が強い→「美味しい」「好き」**物理的尺度を持たない**

#ファジィ数とは
大学や企業は入学試験や入社試験の際に募集人数を公表する
募集要項に３０人募集と書いてある場合
大学の場合はちょうど３０人を合格・入学させる予定であることを意味する
企業の場合は、必ずしも３０人ちょうどとは限らない
気に入った受験生が多ければ予定よりオーバー、気に入った受験生が少なければ予定より少ないかもしれない
こういったときのだいたい３０ぐらいや約３０をファジィ数という

#ファジィ数の計算
クリスプの世界とファジィの世界では四則演算のルールが少し違う


#ヒューマンインターフェース
人間が、より簡単にコンピュータなどの装置を操作できるようにするための研究

#参考サイト
[第1回：ニューラルネットワークとは](https://thinkit.co.jp/article/30/1/2.html)
ファイル取得と、コマンド実行出力後のファイル取得のロール

簡単に使える**ファイル取得**と、**コマンド実行出力後のファイル取得**のロールを作りました。

Linux/Windows で対応できるようにしています。それぞれ**Ansible Galaxy**にあげています。

* [fetch-files](https://galaxy.ansible.com/tksarah/fetch-files/)
* [fetch-command-out](https://galaxy.ansible.com/tksarah/fetch-command-out/)
* [fetch-wcommand-out](https://galaxy.ansible.com/tksarah/fetch-wcommand-out/)

これらをラップするように、対話形式で出来るよう下記のPlaybookを作りました。（少し作り切れていないところがありますが）

https://github.com/tksarah/fetch_files

少し手を加えているところは、``setup``で取ってくるところの情報をJSONなので、使えそうなのをCSVで落としてくるところです。ここはしょぼいPythonスクリプトをツールとして呼び出して使っています。

# 苦労したところ
各ロールは、なるべく事前に準備するものを**最小限の手間**で行うことを前提に作ったところです。最悪ターゲットとして使うユーザの想定として「**Ansible触ったことがない人**」も入れています。

fetch-filesはシンプルすぎるほどなのでいいとして、fetch-command-out,fetch-wcommand-outは取得元となるINPUTのCSVファイルからリストを得て回すところ（以下参照）です。当然コードを書く際もできるだけ短くしたいという思いもあり、今回使った手は、lookup による列の抽出と with_lines によるループです。このあたりはこれがベストともまだ思っていないので、よりシンプルに楽な方法があれば、コメントいただけると幸いだったりします。

ユーザが用意するファイル

```text:csv
1,<command>,<output file>
2,<command>,<output file>
3,<command>,<output file>
```

```yaml:fetch-ommand-out/tasks/main.ymlより
    - include: run_out_fetch.yml
      vars:
        command: "{{ lookup('csvfile', '{{ item }} file={{ inputcommand }} delimiter=, col=1') }}"
        savefile: "{{ remtemp }}/{{ lookup('csvfile', '{{ item }} file={{ inputcommand }} delimiter=, col=2') }}"
      with_lines:
        - awk -F, '{ print $1 }' "{{ inputcommand }}"
```
Railsのバージョンによってfindの挙動が違う件

Rails 5.0.0.1で`Model.find(nil)`とやると、
> ActiveRecord::RecordNotFound in ...
> Couldn't find Model without an ID

とエラーが返ってくる。

古いRailsでは`Model.find(nil)`で例外がraiseされないようなのだが、どのバージョンで切り替わったのかが知りたい。今度先輩に聞いてみよう。
SQLアンチパターン：ポリモーフィック関連

[SQLアンチパターン](https://www.amazon.co.jp/dp/4873115892/)を読み始めたので、1つ１つ書いてのメモです

# 目的

- 目的:複数の親テーブルを参照する
- コメントが、bug と 要求機能について、という2つの親を持つ

# アンチパターン

- ポリモーフィック関連を定義する
 - issue_id の外部キーが定義できない
 - issue との 参照整合性制約 が定義できない

```sql
CREATE TABLE Comments_6 (
  comment_id  SERIAL PRIMARY KEY,
  issue_type  VARCHAR(20),
  issue_id  BIGINT UNSIGNED NOT NULL,
  author  BIGINT UNSIGNED NOT NULL,
  comment_date  DATETIME,
  comment  TEXT,
  FOREIGN KEY (author) REFERENCES Accounts(account_id)
);
```

Rails だと ポリモーフィック関連 の機能がある（ ActiveRecord にある）

## 用いてもいいパターン

- フレームワークにポリモーフィック関連の機能があるとき
 - 車輪の再発明をしてはいけない
- ORM を使った設計を行う際に、子側のテー ブルを設計 / 作成する時点でまだ存在しない親テーブルとの関連を作成できる


# 解決策

## 関連を単純化する

- ポリモーフィック関連では、本来あるべき関連が逆になっている
 - 今回であれば、コメントが親で、バグや要求機能についてが子

## 交差テーブル（中間テーブル）を使う

# まとめ

テーブル間の関連(リレーションシップ)には、参照元テーブルと参照先テーブルが常にそれぞれ 1 つ しかないことを忘れないようにしましょう。

# 感想

- ポリモーフィック関連を使うと、関連が「？」となってしまうことが多くて、使わないでいた。でも、テーブル設計としても、外部キーが設定できない課題があることに気づけた

- 中間テーブルは、課題解決していいものなんだなあ、としみじみ思う

[![](https://images-na.ssl-images-amazon.com/images/I/41qHKrFZi0L._SX389_BO1,204,203,200_.jpg)](https://www.amazon.co.jp/dp/4873115892/)
SCPを多段で実行する


普段sshをトンネルで行っているが、同じようにscpをトンネルして一発でできないか調べてみた。

以下のようなコマンドでできる

踏み台サーバー remote1
ターゲットサーバー remote2

ローカル -> ターゲットコピーの場合

```
scp -o 'ProxyCommand ssh [remote1アカウント]@[remote1ホスト] nc %h %p' [ローカルファイル] [remote2アカウント]@[remote2ホスト]:[ターゲットディレクトリ]
```

ターゲットからの取得は普通のscpと同じように逆に記述すればよい。proxycommandをncと使うところがポイントかな。

いちいちコマンドを全て打つのは面倒なので、決まったホストならシェルコマンドを作っておけば問題ない。

参考元：
http://stackoverflow.com/questions/9139417/how-to-scp-with-a-second-remote-host
Digitsを使ってWebで電話番号認証

2017/06/19 追記
DigitsはFirebaseの電話番号認証機能に統合
http://get.digits.com/blog/introducing-firebase-phone-authentication

# Digitsとは
Twitterが開発した、電話番号認証を行うライブラリ。iOS、Android、Webで使える。
https://get.digits.com/
https://docs.fabric.io/web/digits/overview.html

# 導入
## FabricからTwitterアプリを追加してCONSUMER KEYを取得

## HTMLにDigitsのSDKを埋め込む
```html
<head>
  <script id="digits-sdk" src="https://cdn.digits.com/1/sdk.js" async></script>
</head>
```

## Digitsの初期化処理
```js
/* Initialize Digits for Web using your application's consumer key that Fabric generated */
document.getElementById('digits-sdk').onload = function() {
  Digits.init({ consumerKey: 'yourConsumerKey' });
};
```

## ボタンをクリックした時の挙動を作成する
```js
/* Launch the Login to Digits flow. */
function onLoginButtonClick(event){
  Digits.logIn()
    .done(onLogin) /*handle the response*/
    .fail(onLoginFailure);
}
```

# 実行結果
<img width="484" alt="ログイン.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/109450/503df0d3-4d5d-a6c4-9bc3-bcf93e5e0bdb.jpeg">

<img width="482" alt="ログイン_and_chatcenter_io_and_新規投稿_-_Qiita.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/109450/6b4d670c-3448-ec5e-e05b-112fdc6645e5.jpeg">
x86-64 mov命令における上位bitの扱い

以下のマニュアルの情報を抜粋。
http://www.agner.org/optimize/optimizing_assembly.pdf

```
1.  mov rax, 1111111111111111H ; rax = 1111111111111111H
2.  mov eax, 22222222H         ; rax = 0000000022222222H
3.  mov  ax, 3333H             ; rax = 0000000022223333H
4.  mov  al, 44H               ; rax = 0000000022223344H
```

1のmovを実行した後のraxの値は、もちろん「1111111111111111H」。
2のmovを実行するとraxの上位32bitは0で埋められるため、raxの値は「0000000022222222H」
しかし、3、4のmovを実行しても上位bitの値は変更されない。
なので、raxの値は3を実行すると「0000000022223333H」、4を実行すると「rax = 0000000022223344H」。

32bitレジスタへのmov命令で上位32bitに0を埋めるのは、以前のレジスタの値との偽の依存をなくす？ためらしい。一方、8、16bitレジスタへのmov命令で上位bitの値を変更しないのは、16/32bitモードとの下位互換のためらしい。
Excelで線分上の最も近い点

'線分上の最も近い点/Excelの行列関数を使った（スマートな?）解法　
'(参考)図形情報を扱うのに大事なことは、全部高校で教わった
'http://qiita.com/yuba/items/2f35d1e5e162f44fc1b3
'(参考)Excelの計算式をテキストファイルに出力してみた
①変換行列の正式名称を教えて下さい。(日本語英語)
②もっと短くなりますか

'関数の入力時,Ctrl+Shift+Enterが必要です。
'座標系1(0,0)→座標系2(0,0)--------------------------------------------
  1行  1列目: 0
  1行  2列目: 0
  1行  3列目: 0
  1行  4列目: 0
'座標系1(1,1)→座標系2(2点間の距離,0)
  2行  1列目: 1
  2行  2列目: 1
  2行  3列目: =SQRT((A2-A1)^2+(B2-B1)^2)
  2行  4列目: 0
'cos,sin,tx,tyの計算------------------------------------------
  4行  1列目: =A1
  4行  2列目: =-B1
  4行  3列目: 1
  4行  4列目: 0
  4行  6列目: =MINVERSE(A4:D7)
  4行  7列目: =MINVERSE(A4:D7)
  4行  8列目: =MINVERSE(A4:D7)
  4行  9列目: =MINVERSE(A4:D7)
  4行 11列目: =C1
  4行 13列目: =MMULT(F4:I7,K4:K7)
'
  5行  1列目: =B1
  5行  2列目: =A1
  5行  3列目: 0
  5行  4列目: 1
  5行  6列目: =MINVERSE(A4:D7)
  5行  7列目: =MINVERSE(A4:D7)
  5行  8列目: =MINVERSE(A4:D7)
  5行  9列目: =MINVERSE(A4:D7)
  5行 11列目: =D1
  5行 13列目: =MMULT(F4:I7,K4:K7)
'
  6行  1列目: =A2
  6行  2列目: =-B2
  6行  3列目: 1
  6行  4列目: 0
  6行  6列目: =MINVERSE(A4:D7)
  6行  7列目: =MINVERSE(A4:D7)
  6行  8列目: =MINVERSE(A4:D7)
  6行  9列目: =MINVERSE(A4:D7)
  6行 11列目: =C2
  6行 13列目: =MMULT(F4:I7,K4:K7)
'
  7行  1列目: =B2
  7行  2列目: =A2
  7行  3列目: 0
  7行  4列目: 1
  7行  6列目: =MINVERSE(A4:D7)
  7行  7列目: =MINVERSE(A4:D7)
  7行  8列目: =MINVERSE(A4:D7)
  7行  9列目: =MINVERSE(A4:D7)
  7行 11列目: =D2
  7行 13列目: =MMULT(F4:I7,K4:K7)
'変換行列の表示(AとAの逆行列)------------------------------------------
  9行  1列目: =M4
  9行  2列目: =-M5
  9行  3列目: =M6
  9行  6列目: =MINVERSE(A9:C11)
  9行  7列目: =MINVERSE(A9:C11)
  9行  8列目: =MINVERSE(A9:C11)
'
 10行  1列目: =M5
 10行  2列目: =M4
 10行  3列目: =M7
 10行  6列目: =MINVERSE(A9:C11)
 10行  7列目: =MINVERSE(A9:C11)
 10行  8列目: =MINVERSE(A9:C11)
'
 11行  1列目: 0
 11行  2列目: 0
 11行  3列目: 1
 11行  6列目: =MINVERSE(A9:C11)
 11行  7列目: =MINVERSE(A9:C11)
 11行  8列目: =MINVERSE(A9:C11)
'(座標変換1)----------------------------------------------
 13行  1列目: 1
 13行  2列目: 0
 13行  3列目: 1
 13行  6列目: =TRANSPOSE(MMULT(A9:C11,TRANSPOSE(A13:C13)))
 13行  7列目: =TRANSPOSE(MMULT(A9:C11,TRANSPOSE(A13:C13)))
 13行  8列目: =TRANSPOSE(MMULT(A9:C11,TRANSPOSE(A13:C13)))
'(座標変換2:線分上)------------------------------------------
 15行  1列目: =F13
 15行  2列目: 0
 15行  3列目: 1
 15行  6列目: =TRANSPOSE(MMULT(F9:H11,TRANSPOSE(A15:C15)))
 15行  7列目: =TRANSPOSE(MMULT(F9:H11,TRANSPOSE(A15:C15)))
 15行  8列目: =TRANSPOSE(MMULT(F9:H11,TRANSPOSE(A15:C15)))
'
javascriptでカウントダウンタイマー作るときに時間が終わったら、音が鳴るようにするにはどうすればいいでしょうか？

javascriptでカウントダウンタイマー作るときに時間が終わったら、音が鳴るようにするにはどうすればいいでしょうか？

教えてください。
while-readの区切り文字を空白以外に設定したい


シェルスクリプトにおいて、要素の区切りは「空白文字」に設定することが一般的です。ただし現実問題として「空白文字」が要素のひとつとして扱わねばならない場合があり、その際には「空白文字」以外をデリミタとして設定する必要があります。

`while`とともに利用することが多い、標準入力を変数に代入する`read`コマンドもまたデフォルトでは「空白文字」を区切り文字としています。これを「空白文字」以外にする場合は`IFS`を利用します。

たとえば次の例は区切り文字を`@`にしています。

```bash
echo "perl@python@php" | while IFS=@ read x y z; do 
    echo "x => $x"
    echo "y => $y"
    echo "z => $z"
done;

# x => perl
# y => python
# z => php
```
meshbluのツール

#概要
mythingsのmeshbluのapiを叩く、ツールズです。
jqueryのajaxを使います。
#生存確認

```
$.ajax({
	type: 'get',
	url: 'http://meshblu url/status',
	success: function(json) {
		echo(dump(json));
	},
	error: function(XMLHttpRequest, textStatus, errorThrown) {
		alert(textStatus);
	},
});
```
#デバイスリスト

```
$.ajax({
	type : 'get',
	url : 'http://meshblu url/devices',
	headers : {
		'meshblu_auth_uuid': 'trigger-1 uuid',
		'meshblu_auth_token': 'trigger-1 token'
	},
	success : function(json) {
		echo(dump(json));
	},
	error: function(XMLHttpRequest, textStatus, errorThrown) {
		alert(textStatus);
	},
});
```
#発火

```
$.ajax({
    type: 'post',
    url: 'http://mesh blu/data/trigger-1 uuid',
    data: {
        "text1": "300"
    },
    headers: {
        'meshblu_auth_uuid': 'trigger-1 uuid',
        'meshblu_auth_token': 'trigger-1 token'
    },
    success: function(json) {
        echo(dump(json));
    },
    error: function(XMLHttpRequest, textStatus, errorThrown) {
        alert(textStatus);
    }
});
```
#発火の確認

```
$.ajax({
    type : 'get',
    url : 'http://meshblu url/data/trigger-1 uuid?start=2016-12-14T10:25:01.766Z&finish=2016-12-24T10:40:01.766Z&limit=10',
    headers : {
        'meshblu_auth_uuid': 'owner uuid',
        'meshblu_auth_token': 'owner token'
    },
    success : function(json) {
        echo(dump(json));
    },
    error: function(XMLHttpRequest, textStatus, errorThrown) {
        alert(textStatus);
    },
});
```
Docker Compose でMySQLが起動するまで待つ

# やりたいこと
MySQLのコンテナがちゃんと立ち上がるまで任意のコンテナの実行を待ちたい

# 試したこと
## depends_on
http://docs.docker.jp/compose/compose-file.html#depends-on

>docker-compose up を実行したら、依存関係のある順番に従ってサービスを起動します。

いけるやん

と思ったら
>注釈
>depends_on では、 web の実行にあたり、 db と radis の準備が整うのを待てません。待てるのはコンテナを開始するまでです。サービスの準備が整うまで待たせる必要がある場合は、 起動順番の制御 に関するドキュメントで、問題への対処法や方針をご確認ください。

だめやん…。

## ENTRYPOINT ["entrypoint.sh"]
[ここ](http://docs.docker.jp/compose/startup-order.html)を読むと、結局スクリプトで制御するしかない模様

### MySQLの死活監視
`mysqladmin`コマンドでできる。`mysql-client`的なパッケージを入れておけば使える（jessieにて確認）

# 結論
こういう感じでやりました

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

until mysqladmin ping -h mysql_host --silent; do
	echo 'waiting for mysqld to be connectable...'
	sleep 3
done

./nin-i-no-shori
```
PowerShellでクリップボードの画像をファイルに保存する

### デスクトップに "clip.png" として保存する例
```ps1
Add-Type -AssemblyName System.Windows.Forms
$clipboardImage = [Windows.Forms.Clipboard]::GetImage()
if ($clipboardImage -ne $null)
{
  $outputFilePath = Join-Path (Join-Path $Env:UserProfile "Desktop") "clip.png"
  $clipboardImage.Save($outputFilePath)
}
```
#### 解説
0. まず、`System.Windows.Forms`を`Add-Type`する。

    ```ps1
    Add-Type -AssemblyName System.Windows.Forms
    ```
0. 次に、クリップボードの画像を`[Windows.Forms.Clipboard]::GetImage()`で取得する（`Bitmap`型で返ってくる）。

    ```ps1
    $clipboardImage = [Windows.Forms.Clipboard]::GetImage()
    ```
    - ここでの注意点: 
        - クリップボードに画像が入っていないと、`[Windows.Forms.Clipboard]::GetImage()`は`$null`を返す。
            - このため、この例では`$null`かどうかのチェックを入れている。
        - **追記:** 画像の存在判定は`[Windows.Forms.Clipboard]::ContainsImage()`でも可能。

            ```ps1
            if ([Windows.Forms.Clipboard]::ContainsImage())
            {
              $clipboardImage = [Windows.Forms.Clipboard]::GetImage()
              ...
            }
            ```
0. 最後に、これを`Save()`する。

    ```ps1
    $outputFilePath = Join-Path (Join-Path $Env:UserProfile "Desktop") "clip.png"
    $clipboardImage.Save($outputFilePath)
    ```
Socket.ioでコンソールベースのチャットを作ってみる

Socket.IOの勉強がてら、よくある簡単なチャットを作ってみた。
Socket.IOのドキュメントや色々な記事ではブラウザベースのチャットの例が多いが、今回はコンソールベースのチャットを作った。

![terminal.png](https://qiita-image-store.s3.amazonaws.com/0/81715/34c5ce91-cfcd-1a20-69c7-40c35ca419b9.png)

サーバの実装

```
const io = require('socket.io')();
io.listen(3000);

io.on('connection', (socket) => {
  console.log(`connected, id: ${socket.id}`);

  socket.on('chat message', (user, message) => {
    data = `${message} from ${user}`;
    console.log(data);
    socket.broadcast.emit('chat message', data);
  });

  socket.on('disconnect', () => {
    console.log(`disconnected, id: ${socket.id}`);
  });
});
```

クライアントの実装

```
const readline = require('readline');
const socket = require('socket.io-client')('http://localhost:3000');

const user = process.argv[2];

rl = readline.createInterface(process.stdin, process.stdout);
rl.setPrompt('');

rl.on('line', (line) => {
  socket.emit('chat message', user, line);
})
.on('close', () => {
  process.exit(0);
});

socket.on('connect', () => {
  console.log(`connected, id: ${socket.id}`);
});

socket.on('chat message', (data) => {
  console.log(data);
});

socket.on('error', (err) => {
  console.log('Error:', err);
});

socket.on('disconnect', () => {
  console.log('disconnected');
});
```

サーバ起動

```
$ node index.js
```

クライアント起動

```
$ node client.js $USER_NAME
```

サーバはメッセージをブロードキャストするようにしているので、クライアントを複数起動すれば、チャットみたいなことができる。
F# リストを使ってみる

#始めに
F#のリストを使って色々遊んでみました

#サンプルソース
```fsharp
module File1
//リストを使ってみる
//リストを宣言する
let strs= ["dogs";"cats";"bird"]

//printfnでフォーマットを宣言してみる
printfn "%A" strs //["dogs"; "cats"; "bird"]が表示される
printfn "%O" strs //[dogs; cats; bird]が表示される

//パターンマッチを使ってリストにアクセスする
//パターンマッチ　その１
let rec accessList strs =
    match strs with
    |x::xs->printfn "%O " x;printfn "%O " (accessList xs);x+" a"
    |[]->printfn "おしまい";"b"

//パターンマッチ　その２
let rec accessList2 strs =
    match strs with
    |x::xs->printf "%O " x; accessList2 xs
    |[]->printfn "おしまい";

in
//戻り値があるので、letで結果を束縛する必要がある
let a=accessList strs
//dogs
//cats
//bird
//おしまい
//b
//bird a
//cats a
//が表示される

printfn  "letで束縛された結果を表示する"
printfn "%s" a
//letで束縛された結果を表示する
//dogs a
//が表示される

accessList2 strs
//dogs cats bird おしまい が表示される
```

#メモ
## その１「パターンマッチ　その１」の実行イメージについて
プログラムの出力結果を見た感じ、図で書くと下の通りになりそう
![image](https://qiita-image-store.s3.amazonaws.com/0/136860/a2953d73-cdd0-59aa-5296-6f20bc5e3633.png)
[]->でマッチする部分を起点すれば、再帰処理の実行イメージがつかみやすいのかもしれない
## 関数型言語のリストについて
JavaのListとDeque(Stack)の両方の性質を持っているようなイメージですね
関数型言語のリストはJavaのListよりリスト操作がなめらかな感じがしましたが、Deque(Stack)の性質も持っているなら、それも当然かもしれません
よく使うgitコマンド一覧

よく使うgitコマンドメモ


#運用系

### 1) リモートリポジトリをローカルにクローン

`git clone [リモートリポジトリURL] [ローカルディレクトリ]`

### 2) 通常ワークフロー： 編集〜コミット〜push

①ローカルリポジトリを最新状態に更新

```git pull```

### ②編集用ブランチを作って遷移

```
git branch [ブランチ名]
git checkout [ブランチ名]
```

※デフォルトではmasterブランチ（統合ブランチ）だが、追加機能やissue単位でブランチを作成して（トピックブランチ）作業をするのが基本

### ③ファイル編集後にコミット

```
git status
git add [編集ファイル名]
git commit -m "[コメント(編集内容など)]"
```

status で変更のあったファイル一覧を確認できる。
commit用の対象ファイル追加は add だが、ファイル削除の場合は rm。
add . で一括追加できる。（rm .　はできない）

### ④リモートリポジトリにpush

```
git push origin [ブランチ名]
```

ローカルのmasterブランチをリモートのmasterブランチにPushすると、ローカルの編集がそのまま反映されてしまう。
通常はブランチを分け、第３者にチェック依頼（Pull Request）して、第３者がチェック後にマージする流れが基本。

### ⑤リモートリポジトリでマージ

GitHubやbacklog、gitbucketなどのリポジトリ管理ツールでは、GUIベースでPull Requestやコード差分のチェック、マージなどの操作ができる。
第３者がトピックブランチの内容をチェックして、問題なければ統合ブランチ（master）にマージする。
マージされたコードはサーバ環境でPullすることで反映できる。

### 3)その他

### git logのツリーを見る

```
git log --graph --all
```

### remoteリポジトリを確認

```
git remote -v
```

### remote branchを確認

```
git remote -a
```

### 3) ハマり系

### ①remoteの内容でlocalを強制上書き

conflictでハマって一からやり直したい時
※remoteリポジトリがupstreamの場合の例

```
git fetch upstream master
git reset --hard upstream/master
```

### ②remoteに強制上書き(push)

結構危険な最終手段

```
git push -f origin master
```

### ③変更内容を全てチャラに

前commit状態へ強制巻き戻し

```
git reset --hard
```

### ④過去のコミットに戻る
mergeしちゃったけど、チャラにしたい場合

```
git checkout [commit id]
```
commit id はgit logコマンドで確認

### ⑤upstreamに間違ってPushしちゃったので取り消したい

git logでcommitidを調べてrevertすると、
対処コミットをなかったことにできる。
その状態でpushして上書きすれば元通り。

```
git revert [commit id]
```

### ⑥特定のcommitへ戻る

```
git reset --hard [ハッシュ値]
```


# 初期設定系

### 1) ユーザコンフィグ設定(名前とメアド)

`git config --global user.name [ユーザ名]`
`git config --global user.email [メールアドレス]`

### 2) 短縮コマンドオプション(エイリアス）設定　※任意

`git config --global alias.[短縮コマンド] [通常コマンド]`

例
`git config --global alias.co checkout`
git checkout　を　git co　に短縮できる

### 3) リモートリポジトリを登録

`git remote add [リポジトリ名] [リポジトリURL]`

ローカルからのpushやpullの際に指定できる

### 4) リポジトリを新規作成（初期化）

`git init`

ディレクトリ内で実行
GPD WINするなら

# ５秒でわかるGPD WIN界隈
![GPDWIN20161217.001.png](https://qiita-image-store.s3.amazonaws.com/0/3600/b9f140b1-ce8b-bf67-8d6e-1ffe71a4fe5c.png)
**姫が出てくると思った？　残念！ちくわ大明神ちゃんでした！**

これだけじゃあんまりやから、ゲームを作って遊べるUnityの紹介をついでにするで。
UnityにはAssetStoreという素材売り場があっての。
中には完成版のゲームも無料で配布されてたりするんやで。
https://www.assetstore.unity3d.com/jp/#!/content/59187

これはスマホで流行したColorSwitchっていうゲームのクローンや。みたことあるやろ？
![38b60d64-4d79-4740-a932-72ab16d841e4_scaled.jpg](https://qiita-image-store.s3.amazonaws.com/0/3600/b9efda4a-88b6-a0a0-531b-df08a89cb135.jpeg)

ただ、こいつはスマホ向けに作られとるんで画面タップ中心で物理キーはマウスぐらいにしか対応しとらんのや。
せやからわいがGPDW WIN向けにワンキーで遊べる様にコードを追加してビルドしといたで。
http://www.teammosa2.com/zetsu-ichi-mon/colorswitch/ColorSwitchMOSA2.zip

#【遊び方】
**ESCキー**:前画面に戻る
**パッド(Y、A)、カーソル↑↓、スペースキー、マウスのLボタン**：ゲーム進行、ボールをぽんぽんする

ゲーム買って遊ぶのもええけど、プログラミングするのも楽しいで！
Jupyter / matplotlib > 2Dの数値を画像化

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 14.04 LTS desktop amd64
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v8.0
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
```

Jupyter + matplotlibで2D配列を画像化したくなった。

参考 http://stackoverflow.com/questions/6323737/make-a-2d-pixel-plot-with-matplotlib
を実行しようとした。
'data.txt'が必要となる。

### data.txt(2d.csv)の準備

```make_plot_2d.py
import numpy as np

for xidx in range(100):
	for yidx in range(100):
		val = xidx + yidx
		print '%d %d %f' % (xidx, yidx, val)
```

```txt:file_preparation
$python make_plot_2d.py > 2d.csv
```

### Jupyterコード

```py
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm

x,y,temp = np.loadtxt('2d.csv').T #Transposed for easier unpacking
nrows, ncols = 100, 100
grid = temp.reshape((nrows, ncols))

plt.imshow(grid, extent=(x.min(), x.max(), y.max(), y.min()),
           interpolation='nearest', cmap=cm.gist_rainbow)
plt.show()
```
![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/7173d0dc-61e5-0be4-181b-97bde3119aa7.png)
ADDA > stop / resume the numerical simulation using checkpoint file

```txt:My_Environment
Ubuntu 14.04 LTS Japanese Remix
on VMWare Fusion v8.5.2 (4635224)
on OS X El Captian v10.11.4

GNU bash, version 4.3.11(1)-release

gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4 
(also for g++)
ADDA v.1.3b6
```

This article is related to [ADDA (light scattering simulator based on the discrete dipole approximation)](https://github.com/adda-team/adda/).

Related: http://qiita.com/7of9/items/9537252c79f5318d8f55
Related: http://qiita.com/7of9/items/4966f131d405cd89ee07

### Checkpoint file

used to stop/restart the simulation

See Section 12.5 Checkpoints of the manual.
https://github.com/adda-team/adda/blob/master/doc/manual.pdf


### Stop simulation (save checkpoint)

```
$ ./adda -grid 25 -chp_type normal -chpoint 1s
```
where `-grid 25` is arbitrarily added (so that the simulation should not finish within 1s). 

### Restart simulation (loading checkpoint)

add `-chp_load` parameter

```
$ ./adda -grid 25 -chp_type normal -chp_load -chpoint 1s
```

where `-grid 25` is arbitrarily added (so that the simulation should not finish within 1s). 

### Errors in 1st/resumed simulation 

```txt:1st_run
$ ./adda -grid 25 -chp_type normal -chpoint 1s
...
RE_158 = 3.2576107253E-01  -+
RE_159 = 3.2536855335E-01  -+
RE_160 = 3.2481980329E-01  -+
RE_161 = 3.2428023219E-01  -+
RE_162 = 3.2369514141E-01  -+
RE_163 = 3.2327797275E-01  -+
```

```txt:resumed_run
$ ./adda -grid 25 -chp_type normal -chp_load -chpoint 1s
...
RE_360 = 2.6048015704E-01  -+
RE_361 = 2.6011168142E-01  -+
RE_362 = 2.5952229833E-01  -+
RE_363 = 2.5892752389E-01  -+
RE_364 = 2.5832770551E-01  + 
```

As you can see, the relative error (RE_XXX) becomes smaller for the resumed run which means that the checkpoint file is loaded at the resumed run.
closeしたchannelでループを停止する2つの方法

channelの戻り値を2つ取って、2つ目で判定してbreakする方法を使っていました。

```go
func(channel chan int) {
	for {
		c, open := <-channel
		if !open {
			break
		}
		// 仕事
		fmt.Println(c)
	}
	// close後の後片付け
}
```
実行例:https://play.golang.org/p/m3OcAeynaC

channel自体に、`for c :=range channel`とすることで、この機能が働くことを最近知りました。とってもシンプル。

```go
func(channel chan int) {
	for c := range channel {
		// 仕事
		fmt.Println(c)
	}
	// close後の後片付け
}
```
実行例:https://play.golang.org/p/p-vEpLFKFH

複数のchannelをリスンする場合は駄目だけど、1つのchannelの場合はこれを使おう。