OmniAICreator/Qiita-1.07M huggingface dataset:
sbt-aws-serverlessプラグインのGiter8を作りました

Giter8なるテンプレートコマンドラインツールが再燃している様子なので、作ってみました。

https://github.com/yoshiyoshifujii/sbt-aws-serverless.g8

# 参考

http://www.foundweekends.org/giter8/ja/index.html
http://tototoshi.hatenablog.com/entry/2016/09/18/120936


# 使いかた

## Giter8のインストール

Giter8を [セットアップ](http://www.foundweekends.org/giter8/ja/setup.html) いただく必要があります。

Macなら、

```sh
$ brew update && brew install giter8
```

でGiter8のセットアップできます。

もしくは、RC版のsbtを使えば、 `new` コマンドで読み込めるらしい。
が、試してません。

## テンプレートからプロジェクトを作成

以下のコマンドを実行するとできちゃう。

```sh
$ g8 yoshiyoshifujii/sbt-aws-serverless.g8
```

すると、 `name` とか `version` とか `organization` が聞かれるので、それぞれ答えてください。

デフォのままでやると、なんか、変な感じになりますし、ちゃんと答えていただくのが良いかと…。

## compile

[sbt-aws-serverlessのサンプルプロジェクトを作りました](http://qiita.com/yoshiyoshifujii/items/b67a3c599cfc535a8d46) に書いてあるとおりに、いろいろとコマンドを実行いただくと、使えます。

また、build.sbtを書きかえたり、Scalaコードを増やしたり、swagger.yamlにAPIを追加したりと、なんやかんやしていただけると良い感じに育てられるかと思います。

# まとめ

sbt-pluginを作って、導入するにあたり、Giter8でテンプレートにしていくと、便利ですね。

`sbt new` で実行できるようになるとのことですので、育っていきそうな予感がします。

今後ですが、 [yoshiyoshifujii/sbt-aws-serverless.g8](https://github.com/yoshiyoshifujii/sbt-aws-serverless.g8) は、とりあえず作ってみただけですので、もうちょい、librariesとか追加して、 API Gateway や Lambda の Serverlessアプリを作るときの障壁を下げるように育ててみたいと思います。
flowtypeでStateless Functions Componentsを使う

Stateless Functions Components(SFC)とは、インスタンスも状態も持たないただの関数である。
界隈的には、コンポーネントの組み立てには基本SFCを使うとのこと。
利点については、以下のスライドがくわしい。

[Reactの最新動向とベストプラクティス // Speaker Deck](https://speakerdeck.com/koba04/reactfalsezui-xin-dong-xiang-tobesutopurakuteisu)

flowtypeで、SFCの型推論を利用するには、普通の関数に型を付けるのと同様にするのでよい。それで、コンポーネント使用時に型推論が効くようになる。
どうやら今年の2月には利用可能だったようだが、ドキュメントに反映されたのが6月だったので気づかなかった。

```js
type Props = {
  name: string
};

const Hello = ({name}: Props) => (
  <div>Hello {name}</div>
);

ReactDOM.render(<Hello name="World"/>, mountNode);
```

これでPropsのチェックができる。
例えば、

```js
<Hello/>
```

とPropsを渡さなかった場合、flowtypeが型エラーを起こす。

````
 20:           <Hello/>
               ^^^^^^^^ React element `Hello`
 10: const Hello = ({name}: Props) => (
                            ^^^^^ property `name`. Property not found in
 20:           <Hello/>
               ^^^^^^^^ props of React element `Hello`
```

基本的には、エディタのプラグインの支援でリアルタイムにチェックする。

![スクリーンショット 2016-09-24 15.39.18.png](https://qiita-image-store.s3.amazonaws.com/0/15319/6b9cc641-a7e9-21c5-fdfb-158075d7f663.png)

![スクリーンショット 2016-09-24 15.40.09.png](https://qiita-image-store.s3.amazonaws.com/0/15319/df69b57c-9905-8b6b-db8f-f38868cf7d10.png)

上記のスクリーンショットは、atomで`linter-flow`を使用時のもの。詳しい環境が知りたければを[Atomにflowtype環境をつくる - Qiita](http://qiita.com/akameco/items/a1319faa7c86b129c685)を参考にしてほしい。

## おわりに
それにしても、`Flow`の正式名称がよくわからない。
ロゴは`flow`、urlは`flowtype`、ドキュメントでは`Flow`、公式のtwitterは`flowtype`。
単に「フロウ」というとヒップホップ感が出てぱないので、やはり`flowtype`と呼ぶのがいいのだろうか。
[CentOS]ユーザ追加, SSH鍵の作成, 実行権限付与[コマンド]




ユーザ一覧を確認
cat /etc/passwd

ユーザ一覧から名前だけを表示
cat /etc/passwd|sed -e 's/:.*//g'

グループの一覧を確認
cat /etc/group
or
getent group

ユーザアカウントのパスワードを確認
getent shadow [ user name ]
※ パスワードの欄が半角びっくりマーク２個のみの場合、Linuxにおいて「アカウントがロックされている」という状態

パスワードなしに設定する（アカウントロックを解除する）
passwd -u -f [ user name  ]

パスワードをロックする
passwd -l [ username ]

★事務局ユーザ作成・SSH鍵作成コマンド

// これまでのユーザ追加時のコマンドを確認
history|grep user

// ユーザ（secretariat ）の追加
useradd -u 2002 -g 1000 secretariat
※trenders作成時は2001のため2002

// sudoersは使用しないでsudoの設定を行う
cd /etc/sudoers.d/
cf.)http://qiita.com/ngyuki/items/88d0f71601e05f239750

// モデルケースと同様の権限で良いのでコピーする
cp modelcase secretariat

// ユーザ名をsecretariatへ変更のみ行う
vi secretariat

// secretariatでログイン
su - secretariat

// 鍵の作成
cd ~/.ssh/
ssh-keygen
※パスフレーズは設定しない

// 秘密鍵を確認、ローカルに保存する
cat .ssh/id_rsa

// 公開鍵ファイルを設置、パーミッションの変更
cat id_rsa.pub >authorized_kets
chmod 600 authorized_keys

# これまでのユーザ追加時のコマンドを確認
history|grep user

# ユーザ（secretariat ）の追加
useradd -u 2002 -g 1000 secretariat
※trenders作成時は2001のため2002

# sudoersは使用せず、sudoの設定を行う
cd /etc/sudoers.d/

# モデルケースと同様の権限で良いのでコピーする
cp modelcase secretariat

# 第1フィールドのユーザ名をsecretariatへ変更のみ行う
vi secretariat

# secretariatでログイン
su - secretariat

# 鍵の作成
cd ~/.ssh/
ssh-keygen
※パスフレーズは設定しない

# 秘密鍵を確認、ローカルに保存する
cat .ssh/id_rsa

# 公開鍵ファイルを設置、パーミッションの変更
cat id_rsa.pub >authorized_kets
chmod 600 authorized_keys
値渡しと参照渡しについて思いを馳せる

連休中の暇つぶしで「値渡しと参照渡しの違いについて、シンプルにかつ首尾一貫して説明する方法はないか」を考えていました。そこで自分なりにこんな説明を考えてみました、という話です。

なお、文中で「参照」という言葉を使っていますが、ぼくはC言語しか知らない（のと、C++は最近勉強はじめた）ため、「参照」という言葉は他の言語ではまた別の意味を持つかもしれません。

##値渡しについて
「Cには値渡ししか存在しない」は周知の事実ですが、例えば以下のコードにおいて、関数呼び出しの第一引数に`m(==10)`を指定した場合、関数`f()`には`10`というスカラー値を渡します。
また、第二引数にポインタ`&n`を渡した場合、式`&n`を評価した結果得られるポインタ（スカラー値）を関数`f()`に渡します。

```c:C
#include <stdio.h>

void f(int m_, int *n_)
{
    m_++;
    (*n_)++;
}

int main(int argc, char **argv)
{
    int m=1;
    int n=1;

    f(m, &n);
    printf("m=%d n=%d\n", m, n);  /* m=1 n=2 */

    return 0;
}
```

上記コードでは、関数に渡されたポインタ（`n_`）を関数内部で間接参照して被参照オブジェクト（`n`）にアクセスしていますが、それは渡されたオブジェクトを関数内部でどのように使うかの「用途の話」であって、引数の渡し方とは関係ないです。整数値だろうがポインタ値だろうが、オブジェクトを渡していることには変わりは無いです。

##別名を使う
関数にポインタを渡す意図として、データコピーのオーバーヘッドを抑止したい理由もありますが、変数スコープの制約上、呼び出し先の関数内からは呼び出し元で宣言された実引数のオブジェクトにアクセスできないので、その制約を回避したいためもあると思います（バイナリハックとかはナシで）。

そこでC++の参照型の登場ですが、呼び出し元の実引数のオブジェクト（`n`）に関数内でローカルスコープを持つ別名`n_`を紐付けることで、呼び出し先の関数内では「`n_`」というシンボル名を使ってオブジェクト`n`を（あたかも`n`を扱うかのごとく）ハンドリングすることができます。

```c++:C++
#include <iostream>

void f(int m_, int &n_)
{
    m_++;
    n_++;
}

int main(int argc, char **argv)
{
    int m=1;
    int n=1;

    f(m, n);
    std::cout << "m=" << m << " n=" << n << std::endl;
    // m=1 n=2

    return 0;
}
```

上記のような引数渡しについて、本来なら「参照渡し」と言うべきなのでしょうが、「参照」というとポインタの間接参照とごっちゃになってしまうため、「参照」という言葉の使用はなるべく避けたい（ポインタ説明のためにとっておきたい）のです。

そこで僕は個人的に「オブジェクトの別名束縛」と呼んでいます。対して、俗に言う「値渡し」は「オブジェクトの値渡し」と呼んでいます（ポインタの値渡しはこれの一種）。

ただ、上記`n`と`n_`のように対応関係にある実引数と仮引数はそもそもスコープが異なるのだから同一シンボル名を付与できるとか、あるいは配列の部分配列、定数、配列型配列の配列要素など名前の無いオブジェクトに名前をつけることも可能なので、「別名」というのもまたビミョーに名が体を表してないのですが…難しいですね。
Jupyter Lab事始め

## はじめに
Jupyterは次のVersionより **Jupyter Lab** として大きくUIや機能が進化する予定です。ここでは、AWS EC2上でJupyter Labの環境を構築方法、簡単な使い方を自分用にチラシの裏しておきます。細かい設定はさておき、手っ取り早くEC2上にJupyter Lab環境を構築し、どんな風に進化したかを試して見る所までを目標とします。

Jupyter LabはまだPreview版で、最新情報は[Jupyter Lab Github](https://github.com/jupyter/jupyterlab)を参照下さい。
また、旧来のJupyter Notebookの環境構築方法は[こちらを参照下さい。](http://qiita.com/taka4sato/items/2c3397ff34c440044978)


#### **Jupyter Labの機能概要**
Jupyter Labの開発の背景、機能紹介は、SciPy 2016での[JupyterLabの紹介動画](https://www.youtube.com/watch?v=Ejh0ftSjk6g)と、[その時の説明Slide](http://archive.ipython.org/media/SciPy2016JupyterLab.pdf)がわかりやすいですが、ポイントとなる資料は以下の2枚です。

* Browser上でありながら、IDEに近い編集機能を持つ。([UIなどの新機能はこの記事](http://nonbiri-tereka.hatenablog.com/entry/2016/07/16/233703)がまとまっています)
* JS baseになったので、plugin開発が楽になった
* 各種Inspector機能がついた

<img width="400" alt="hadoop1.png" src="https://qiita-image-store.s3.amazonaws.com/0/67592/129b5dd6-8804-2efc-a8f2-662a6bfd254b.jpeg"> <img width="400" alt="hadoop2.png" src="https://qiita-image-store.s3.amazonaws.com/0/67592/916be8b7-6b8c-d2fd-1c0c-c26a3f3d8876.jpeg">

## Jupyter Labの環境構築手順
AWS EC2上にJupyter Lab環境を構築する手順です。旧来のJupyter Notebookの環境構築方法とほぼ同じです。

### EC2の作成
Jupyterを動かすEC2を起動して、sshでloginします。

* Ubuntu 14.04を前提 (Amazon Linuxを使う場合には、aptをyum等に置き換えて下さい)
* EC2はm4.largeぐらいは合った方が良い
* EC2のSecurity GroupでPort `8080`を開けておく


### 必要なmoduleのinstall
`atp-get`で必要なmoduleを入れて、pipをupdateして、jupyterlabをinstallします。 

```bash
$ sudo apt-get update && sudo apt-get -y upgrade
$ sudo apt-get install -y python-pip libpq-dev python-dev
$ sudo pip install -U pip
$ sudo pip install jupyterlab widgetsnbextension
$ sudo jupyter serverextension enable --py jupyterlab --sys-prefix
```

MatplotlibでChartを書きたい場合には、更に追加でnumpyやmatplotlibなどの必要なmoduleを入れます(が、installに数分かかります)。 

```bash
$ sudo apt-get install -y libpng12-dev libjpeg8-dev libfreetype6-dev libxft-dev
$ sudo pip install numpy pandas matplotlib seaborn scikit-learn
```

### Jupyter Labの環境設定

以下のコマンドを実行すると、Jupyterの設定ファイルの雛形(`~/.jupyter/jupyter_notebook_config.py`)を作成してくれます。

```bash
$ jupyter notebook --generate-config
```

続いて、`~/.jupyter/jupyter_notebook_config.py`を編集します。全てComment outされたデカイfileなので、fileの先頭など好きな場所に以下4行を入れて保存します。

```
c = get_config()
c.NotebookApp.ip = '*'
c.NotebookApp.open_browser = False
c.NotebookApp.port = 8080
```

### Jupyter Labの起動

以下のコマンドを実行すると、Jupyterが起動します。

```bash
$ jupyter lab
```

この状態でBrowser上で`ec2-53-239-93-85.ap-northeast-1.compute.amazonaws.com:8080`など、EC2にアクセスに行き、以下のJupyter Labの初期画面が出れば成功です(portの`8080`をお忘れ無く)。

![jupyterlab.jpg](https://qiita-image-store.s3.amazonaws.com/0/67592/d1c0ea26-36b8-2654-bb23-86ad94cdf629.jpeg)

Background実行させたければ、`nohup jupyter lab > /dev/null 2>&1 &`としておくと、sshを切断してもJupyterが動き続けます。


### Jupyterの自動起動の設定
Jupyter labを自動起動させたい場合は、以下の手順でAWS EC2起動時に`jupyter lab`が実行される様にすることが可能です。

* `touch ~/start_jupyter.sh`
* `start_jupyter.sh`を編集し、中に`/usr/local/bin/jupyter lab`、と書いておく
* `chmod 777 ~/start_jupyter.sh`
* root権限で`/etc/rc.local`を編集し、`su - ubuntu /home/ubuntu/start_jupyter.sh &`の1行を`exit 0`の前に入れる
* root権限で`shutdown -r now`でEC2を再起動させる
* Browserから、EC2にアクセスに行き、jupyterのlogin画面が出たら成功です

## 最後に

良いJupyter生活を！
Swift3 バックグラウンド処理

        let backgroundQueue = DispatchQueue(label: "com.app.queue",
                                            qos: .background,
                                            target: nil)
        backgroundQueue.async {
            print("Dispatched to background queue")
            DispatchQueue.main.async {
                print("main thread dispatch")
            }
            DispatchQueue.global(qos: .userInitiated).async {
                print("user initiated task")
            }
        }
Sierraにアップデート後、ENVでバージョンインストール時に失敗する対策

SierraにアップデートしたMacで、pyenvを使ってPythonの環境を作ろうと思いました。
しかし

```
$ pyenv install 3.5.1
```

と打ち込んでも

```
Downloading Python-3.5.1.tar.xz...
-> https://www.python.org/ftp/python/3.5.1/Python-3.5.1.tar.xz
Installing Python-3.5.1...

BUILD FAILED (OS X 10.12 using python-build 20160602)

Inspect or clean up the working tree at /var/folders/q0/xjdlx15d18l2ljx4_924z5vc0000gn/T/python-build.20160924145129.25939
Results logged to /var/folders/q0/xjdlx15d18l2ljx4_924z5vc0000gn/T/python-build.20160924145129.25939.log

Last 10 log lines:
  File "/private/var/folders/q0/xjdlx15d18l2ljx4_924z5vc0000gn/T/python-build.20160924145129.25939/Python-3.5.1/Lib/ensurepip/__main__.py", line 4, in <module>
    ensurepip._main()
  File "/private/var/folders/q0/xjdlx15d18l2ljx4_924z5vc0000gn/T/python-build.20160924145129.25939/Python-3.5.1/Lib/ensurepip/__init__.py", line 209, in _main
    default_pip=args.default_pip,
  File "/private/var/folders/q0/xjdlx15d18l2ljx4_924z5vc0000gn/T/python-build.20160924145129.25939/Python-3.5.1/Lib/ensurepip/__init__.py", line 116, in bootstrap
    _run_pip(args + [p[0] for p in _PROJECTS], additional_paths)
  File "/private/var/folders/q0/xjdlx15d18l2ljx4_924z5vc0000gn/T/python-build.20160924145129.25939/Python-3.5.1/Lib/ensurepip/__init__.py", line 40, in _run_pip
    import pip
zipimport.ZipImportError: can't decompress data; zlib not available
make: *** [install] Error 1
```

このようなエラー文が出て、インストールに失敗します。

対策として

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

を打ち込みます。



![xcode.png](https://qiita-image-store.s3.amazonaws.com/0/60014/46de26c8-8851-dd05-fa23-1ba7ddbeebd8.png)

ポップが立ち上がるので、Xcodeをインストール済みの方は、インストールを押します。

インストール終了後に、

```
$ pyenv install 3.5.1
```

をもう一度打ち込むと

```
Downloading Python-3.5.1.tar.xz...
-> https://www.python.org/ftp/python/3.5.1/Python-3.5.1.tar.xz
Installing Python-3.5.1...
Installed Python-3.5.1 to /Users/username/.pyenv/versions/3.5.1

username% pyenv versions
* system (set by /Users/username/.pyenv/version)
  3.5.1
```

無事にインストールできました。
他のENVでも、インストールが失敗されてるようでしたら試してみてください。
OS X Dashboard Widgetsをいじる


今更Dashboard使ってる人なんてどこにもいないのが明白で哀しい。Qiitaにタグはないし、検索しようものなら消し方ばかりいくつも見つかる有様。
それでも私はF5キーで一発起動できるようにした上でTea Timer WidgetだのDayCounterだの小物を愛用していて、時代に取り残されたところや自分の使い方に特化させるところは度々改造している。

場所は以下：
```/Users/<username>/Library/Widgets/```

みなさんご存知の通り大概のOSX/NeXTSTEPアプリはバンドルという単なるフォルダ。Dashboardのウィジェットは基本的にJavaScriptでできているので、TerminalなりFinderなりで中を覗くとその場で編集できるものばかり。私がそうであるようなJS全然わからないへっぽこエンドユーザでも、Growlに出すアイコンを変えるだsayさせる文言を差し替えるだといった単純なコンパチであればどうにか可能。

一応、Dashboardウィジェットはクリックして```⌘R```で再読み込みが利く。ぐにょん。
ただ、私は編集後には一度削除してからダブルクリックでインストールするようにしているので、その再読み込みでJSに対する変更を反映させられるかは要検証。

すると勉強する気になれば教材が目の前にある環境にもなるので、……いや、人に勧める前に自分がやらねば。いずれはnode.jsをバックエンドにしたウィジェットなど作ってみたいが、現実には当分は手がつきそうにない。
geometry > link > droxtal 

UnityにてMeshを使って100万個の粒子からなる形状のビューワを作るにはどうするか。

Mesh使用を検討中。

粒子を真面目に球形で扱うと三角形の数が半端なくなりそう。
球形の近似形状を使うのがいいだろう。

ふと思いついたのはDroxtalという形状。

https://www.arm.gov/science/highlights/RNTAz/view
の画像のbがその形状。
余談だが、この論文ではQMCが使われていて、300台のスーパーコンピュータで研究した結果QMCにより3000時間の節約ができた、という記載があったりする。

www.ssec.wisc.edu/~BAUM/Papers/AO_Zhang_2004.pdf
の式1から3までから頂点を、式4から6までがnormalを計算できそうだろうか。

面の数は (用語は適当)、20面。三角形44個分。

- 上面 (1:六角形)
- 上側面 (3 x 2: 四角形)
- 中側面 (3 x 2: 四角形)
- 下側面 (3 x 2: 四角形)
- 下面（１:六角形）
unity > mesh使ってみた

```txt:動作環境
Unity 5.3.5f1 on MacOS X El Capitan
```

100万個の粒子から構成される形状のビューワを作るにはどうするか。
GameObjectを100万個は出せないようだ。

パーティクルで120万個を生成している例がある。ただし、パーティクルで指定の場所に粒子を配置できるかは未消化。
http://tips.hecomi.com/entry/2016/05/08/160626

メッシュを使って、上限６４Kのものをたくさん配置していることになるだろうか。

とりあえずmesh使ってみた。

参考 https://www.youtube.com/watch?v=R_kV3YiJqEw

code 

```csharp
using UnityEngine;
using System.Collections;

public class MeshCreateSC : MonoBehaviour {

	public float width = 50f;
	public float height = 50f;

	void Start () {
		MeshFilter mf = GetComponent<MeshFilter> ();
		Mesh mesh = new Mesh ();
		mf.mesh = mesh;

		// Vertices
		Vector3[] vertices = new Vector3[4] {
			new Vector3 (0, 0, 0), new Vector3 (width, 0, 0),
			new Vector3 (0, height, 0), new Vector3 (width, height, 0)
		};

		// Triangles
		int[] tri = new int[6];

		tri [0] = 0;
		tri [1] = 2;
		tri [2] = 1;

		tri [3] = 2;
		tri [4] = 3;
		tri [5] = 1;

		// Normals (only if you want to display object in the game).
		Vector3[] normals = new Vector3[4];

		normals [0] = -Vector3.forward;
		normals [1] = -Vector3.forward;
		normals [2] = -Vector3.forward;
		normals [3] = -Vector3.forward;

		// UVs (How textures are displayed).
		Vector2[] uv = new Vector2[4];

		uv [0] = new Vector2 (0, 0);
		uv [1] = new Vector2 (1, 0);
		uv [2] = new Vector2 (0, 1);
		uv [3] = new Vector2 (1, 1);

		// Assign Arrays
		mesh.vertices = vertices;
		mesh.triangles = tri;
		mesh.normals = normals;
		mesh.uv = uv;
	}
	
	// Update is called once per frame
	void Update () {
	
	}
}
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/d0ddfb5b-8ace-39d7-a681-073415a74577.png)

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/ccc86582-61be-35c2-63be-a60914d6c9ea.png)

平面を作れた。
Theanoにおけるクラスの使い方

# Theanoにおけるクラスの使い方

deeplearning.netなどでは、Theanoを使って共有変数と式シンボルをクラス変数に持つクラスを定義しています。

このクラスの挙動について確認していきましょう。

ここはシンプルに、ひとつずつの共有変数と式シンボルを持つクラスを定義して、クラス変数を活用してみます。

```py3:
import numpy as np
import theano
import theano.tensor as T

class simple(object):
    
    def __init__(self, input):
        
        self.vector = theano.shared(np.array([1, 2, 3], dtype="float64"))
        
        self.formula = self.vector * input

x = T.iscalar('x')

s = simple(x)

func = theano.function(inputs=[x], outputs=s.formula)

func(5)
```

```py3:出力結果
array([  5.,  10.,  15.])
```

クラスを定義してからの挙動が少し複雑なので、まとめてみます。

1. 変数のシンボルを定義
2. インスタンスを作成する。初期化時にシンボルを引数に取って、クラス変数の式シンボルに渡す
3. クラス（インスタンス）変数の式シンボルを呼び出して、関数を定義する
4. 関数を実行

クラス内の記述に式シンボルを含んでいるのがポイントというか、複雑さの原因でしょうか。

式シンボルは直接呼び出して値を確認することも出来ません。

関数化して具体値を入れてやらないと挙動がわからないあたりも、難しいところです。

このような形で、Theanoのクラスを使うことが出来ます。
MatchCollectionクラスでLinqを使うおまじない

#はじめに
　基本的には、「Linqを使いたいけど、IEnumerable\<T>じゃなくてIEnumerableで宣言されているから使えない！」という場合の話です。
　あとクエリ構文でなくメソッド構文の話です。

#ソースコード
```csharp
        static void Main(string[] args)
        {
            string input = "abc123 bbb222 abc789";
            string pattern = @"(..)c(\d{3})";

            MatchCollection matches = Regex.Matches(input, pattern);

            var matches2 = matches.Cast<Match>().Select(x => x.Groups.Cast<Group>());
            
            foreach(var str in matches2.SelectMany(x => x))
            {
                Console.WriteLine(str);
            }
        }
```

##出力結果
>abc123
>ab
>123
>abc789
>ab
>789

#解説

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/135472/38614766-4169-4198-292b-3fcde3807872.png)

　MatchCollectionクラスは図のようにリストのリストを持つ階層構造になっています。さらに、MatchCollectionとGroupCollectionはIEnumerable型のためこのままではLinqを用いることができません。
　そのため以下のような変換を行います。

> var matches2 = matches.Cast\<Match>().Select(x => x.Groups.Cast\<Group>());

　MatchCollectionクラスは複数のMatchクラスのインスタンスを持つため.Cast\<Match>()を用いることにより、IEnumerableからIEnumerable\<T>に変換できます。　同様にx.GroupsもIEnumerableからIEnumerable\<T>に変換できます。
Windowsパソコンからraspberrypi3にリモートデスクトップで接続する

Windowsパソコンとraspberrypi3でディスプレイの入力切替等が面倒なため、リモートデスクトップ環境を構築する。
# 環境
接続元：Windows10
接続先：raspberrypi3 raspbian

# xrdpインストール
  - TERMINALに下記コマンドを入力する。

  ```
  $ sudo apt-get update
  $ sudo apt-get install xrdp
  ```

# 日本語キーボードの配列を追加
  - TERMINALに下記コマンドを入力する。

  ```
  $ cd /etc/xrdp/
  $ sudo wget http://w.vmeta.jp/temp/km-0411.ini
  $ sudo ln -s km-0411.ini km-e0010411.ini
  $ sudo ln -s km-0411.ini km-e0200411.ini
  $ sudo ln -s km-0411.ini km-e0210411.ini
  ```
  - xrdpを再起動させる。

  ```
  $ sudo service xrdp restart
  ```

# Windowsから接続
  - win + R でファイル名を指定して実行画面表示する。
  - `mstsc` を入力する。
  - 表示されたリモートデスクトップ接続画面でraspberrypi3のipアドレスを入力し接続する。  (raspberrypiのipアドレス固定方法は[こちら](http://qiita.com/t114/items/20d8825120b2b910c6d0#ip%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E5%9B%BA%E5%AE%9A))

  - Moduleはそのまま（sesman-Xvnc）
  - username：pi
  - password：raspberry
  - raspberrypiのデスクトップが表示されれば成功です。
GoogleスプレッドシートのQuery関数で結果が空になる謎仕様と回避策

## Query関数とは
Googleスプレッドシートのワークシート関数に[Query](https://support.google.com/docs/answer/3093343?hl=ja)というのがあって、これが[SQL風の記述](https://developers.google.com/chart/interactive/docs/querylanguage)で他のセルや配列から条件に合った者を抽出できて超便利。[HLOOKUP](https://support.google.com/docs/answer/3093375),[VLOOKUP](https://support.google.com/docs/answer/3093318?hl=ja)とかより遙かに柔軟性がある。もちろん[IMPORTRANGE](https://support.google.com/docs/answer/3093340?hl=ja)とも組み合わせて使える。

## 結果が空になる問題
しかし、時々絶対存在するはずのクエリ結果が空になる謎現象に悩まされてた。
なかなか原因が判明しなかったが、色々調べた結果、[この記事](http://stackoverflow.com/questions/29735765/google-sheet-query-function-returns-blank-result-from-cell-with-data)にたどり着いた。
> QUERY will convert columns with mixed data types into one data type. If the data is mostly numerical values, then text strings (eg 1-2 in your data) will be converted to blank cells.

なんと！
**文字列と数値の混在する列で、文字列が少数派だと勝手に空白セルに変換してしまう**らしい。
なにそれ！？バグなの？

## 対策
ではどうするか？
元のセルの表示形式を全部「書式なしテキスト」にしてしまえば、この問題は起きない。
とはいえ、それでは困るというケースの方が多いだろう。

件のStackOveflowの記事でも書かれてるが、一度全部文字列に変換するという手がある。
ただ、記事のなかで例示されてる関数式は複雑すぎて読むのも苦痛で読んでない。

代わりに考えた解決策がこれ。

```js
=QUERY(ARRAYFORMULA(TO_TEXT('シート1'!A:X)),"select Col1... where Col1...")
```

まあ、見ての通り文字列変換してるだけです。

あと、Query式で同じシートのRangeを参照する場合は**'A'**とか**'B'**とか列名がそのまま使えますが関数変換した場合**'Col1'**,**'Col2'**,**'Col3'**...という列名になります。

これで文字列と数値の混成データは特に問題ないですが、**日付データが混じっているとwhereで日付による条件指定が困難になる**という弱点があります。

その解決策は…必要に迫られたら考えてみます。スミマセン。

## おまけ(Queryの使い方Tips)

**ImportRangeでのカラム名**
同じスプレッドシートのRangeの場合、Query式では**'A'**とか**'B'**とか列名がそのまま使えるがImportRangeで読み込んだ範囲の場合**'Col1'**,**'Col2'**,**'Col3'**...という列名になる。TO_TEXTやTRANSPOSEなどで変換した場合も同様。

**先頭の見出し行を除去**
クエリの結果で、先頭に見出し行が入るのが邪魔な場合がある。`label ＜列名＞ ''` で消せる。列名の右はクォーテーション( ' )を二つ並べたもの。

```js
"select Col1, Col2, Col3 where ... label Col1 '', Col2 '', Col3 ''..."
```

※selectしてない列のlabelを設定しようとするとエラーになるので注意

`max(A)` とか `A+B` みたいな式も、そのまま繰り返してやればOKです。

```js
"select max(Col1), Col2+Col3 where ... label max(Col1) '', Col2+Col3 ''..."
```
※実際は同じQuery内で `max(Col1)` と `Col2+Col3` を同時には select 出来ないけどあくまで label の例として見て下さい。 

**行でselect & where したい**
`"select 'Row1' where 'Row1'..."` みたいなことは出来ないっぽい。
[TRANSPOSE関数](https://support.google.com/docs/answer/3094262?hl=ja)を使おう！
Pythonにパイプ演算子と関数合成を導入する（仮）

前提

```Python
class F:
    def __init__(self, f):
        self.f = f

    def __call__(self, *args, **kwargs):
        return self.f(*args, **kwargs)

    def __mul__(self, other):
        def _f(*args, **kwargs):
            return self.f(other(*args, **kwargs))
        return _f

    def __ror__(self, other):
        return self.f(other)


@F
def f(x):
    return x + 1

@F
def g(x):
    return x * x
```

帰結

```Python
>>> 1 | f
2

>>> 2 | g
4

>>> 1 | f | g
4

>>> (f * g)(1)
2

>>> (g * f)(1)
4
```
PHPとCurlを使ってSFTPでファイルアップロードと削除をする

# 何がしたかったか
ユーザーからmultipart/form-dataでPOSTされてきたファイルをSFTPでストレージサーバに送る
ファイルのバリデーションは実装してるけど今回はSFTPする部分について。

# 実現方法
* 使っているフレームワークに頼る
* ssh2のライブラリを使う
* curlを使う
* systemやexecでコマンドを叩く 

フレームワークを利用しているならフレームワークのライブラリを使うのが多分1番簡単です。
composerなどが使える環境ならさくっとライブラリを入れてしまうのも手だと思います。
systemやexecでコマンドを叩くのはエラーハンドリングも面倒だし、コマンドを直接発行するという怖さがあるのでオススメしません。
今回は僕が実装した環境がこれらの手段が使えなかったため、curlで実装してみたという話です。

# 実装
記事用なのでコメント多め。
## アップロード
```php
<?php
$curl = curl_init();
//プロトコルをSFTPに設定
curl_setopt($curl, CURLOPT_PROTOCOLS, CURLPROTO_SFTP);

// 認証方法の設定
curl_setopt($curl, CURLOPT_SSH_AUTH_TYPES, CURLSSH_AUTH_PUBLICKEY);        

// ポートを指定する
curl_setopt($curl, CURLOPT_PORT, **);

// 実行ユーザーの公開鍵と秘密鍵のパスを指定する
curl_setopt($curl, CURLOPT_SSH_PUBLIC_KEYFILE, 'pub_key_path');
curl_setopt($curl, CURLOPT_SSH_PRIVATE_KEYFILE, 'pri_key_path');

// アップロードを指定
curl_setopt($curl, CURLOPT_UPLOAD, 1);

// URL設定
// パスワードを指定する場合は user:pass@～の形式にする
$url = "sftp://user@server/~/UploadPath";
curl_setopt($curl, CURLOPT_URL, $url);

// 送信するファイルをオープンして設定する
$fp = fopen($file, 'rb');
curl_setopt($curl, CURLOPT_INFILE, $fp);
curl_setopt($curl, CURLOPT_INFILESIZE, filesize($file));

//実行
$res = curl_exec($curl);

//エラーハンドリング
if(curl_errno($curl) !== 0) {
    fclose($fp);
    curl_close($curl);
    //例外を投げるなりよしなにする
    echo 'failed.';
    exit;
}
//終わったら後処理
fclose($fp);
curl_close($curl);
echo 'success';
exit;
```
## ファイルの削除
```php
<?php
$curl = curl_init();
// アップロードと同じ設定
curl_setopt($curl, CURLOPT_PROTOCOLS, CURLPROTO_SFTP);
curl_setopt($curl, CURLOPT_SSH_AUTH_TYPES, CURLSSH_AUTH_PUBLICKEY);        
curl_setopt($curl, CURLOPT_PORT, **);
curl_setopt($curl, CURLOPT_SSH_PUBLIC_KEYFILE, 'pub_key_path');
curl_setopt($curl, CURLOPT_SSH_PRIVATE_KEYFILE, 'pri_key_path');

// URL設定　削除のときは対象のファイルパスは不要
$url = "sftp://user@server";
curl_setopt($curl, CURLOPT_URL, $url);

// 削除コマンドを発行するように設定する
curl_setopt($curl, CURLOPT_QUOTE, array('rm deleteFilePath'));

//実行
$res = curl_exec($curl);

//エラーハンドリング
if(curl_errno($curl) !== 0) {
    curl_close($curl);
    //例外を投げるなりよしなにする
    echo 'failed.';
    exit;
}
//終わったら後処理
curl_close($curl);
echo 'success';
exit;
```

# 詰まった個所
```php
curl_setopt($curl, CURLOPT_SSH_AUTH_TYPES, CURLSSH_AUTH_PUBLICKEY);     
```
これがPHP5.2環境だとWarningを吐いて設定されなかった。
公式ドキュメントを見たがPHPのバージョン依存はなく、使っているcurlのバージョンにも問題なかったので結局理由が解らなかった。
今時PHP5.2なんて環境を使うのが悪い。

# 所感
やっぱフレームワーク無いとこういうのを自前で実装しないといけなくなって面倒なので、フレームワーク使いましょう。
C#の非同期メソッドの戻り値のvoidとかTaskがよくわからなかったので動かしてみた


#はじめに
　MSDNのAsyncのページを読んでいて、「戻り値がTask？voidでもいい？ワカ分からん」となったので実際に動かしてどのような挙動になるかを確認しました。
　MSDNによると非同期メソッドにするには

+ メソッドのシグネチャにasyncをつける。
+ できればメソッド名の後ろに"Async"をつける。
+ 戻り値の型を、void、Task、Task\<TResult>のどれかにする

　とすれば良いみたいです。
　今回は戻り値の型の違いによるそれぞれの動作を見ていきたいと思います。検証したのは戻り値がvoidの場合、Taskの場合の2つです。Task\<TResult>は戻り値を返す以外はTaskとほとんど同じ動作をするため記載を省略しています。
　今回のソースコードはVisual Studio 2015で実行しています。
　
参考：Async および Await を使用した非同期プログラミング (C# および Visual Basic)
https://msdn.microsoft.com/ja-jp/library/hh191443(v=vs.110).aspx

#非同期メソッドの戻り値がvoidのとき

　以下のコードで動作を確認しました。
　非同期処理の戻り値による動作の違いを見たかったため、Thread.Sleep()とConsole.WriteLine()を入れ、処理の順序が分かるようにしています。
　また、例外処理を行なうかを確認したかったためAsyncVメソッドで例外を投げています。
　本当は非同期メソッドが入れ子になったときの状態を確認するためにbutton1_Clickでawaitしたかったのですが、Visual Studio 2015では戻り値voidの非同期メソッドはawaitできないみたいです(Visual Studio 2013では書けた気がする)。




```csharp
        private async void button1_Click(object sender, EventArgs e)
        {
            Console.WriteLine("ボタン開始");
            button1.Enabled = false;

            try
            {
                // 本当は await AsyncV();としたかった
                AsyncV();
            }
            catch
            {
                Console.WriteLine("例外発生");
            }

            Console.WriteLine("ボタン終了");
            button1.Enabled = true;
        }

        private async void AsyncV()
        {
            Console.WriteLine("非同期処理開始");

            Thread.Sleep(1000);

            await Task.Run(SomeMethod);

            Console.WriteLine("非同期処理終了");
            throw new Exception();
        }

        private async Task SomeMethod()
        {
            await Task.Run(() => { Thread.Sleep(5000); });
        }
```

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/135472/9540eebc-e1cf-c45a-2551-baf38a01a716.png)　　　![無題1.png](https://qiita-image-store.s3.amazonaws.com/0/135472/4b509292-6f6c-fd0d-f4f5-3da7396741f1.png)

##出力結果
>ボタン開始
>非同期処理開始
>ボタン終了
>非同期処理終了

+ 1秒間ボタンが使用不可になる
+ さらにハンドルされていない例外が発生する


#非同期メソッドの戻り値がTaskのとき

　AsyncVメソッドの戻り値をTaskに変更したのが下記のコードです。
　今度は呼び出しの際にawaitを行えるようになっています。

```csharp
        private async void button1_Click(object sender, EventArgs e)
        {
            Console.WriteLine("ボタン開始");
            button1.Enabled = false;

            try
            {
                await AsyncT();
            }
            catch
            {
                Console.WriteLine("例外発生");
            }

            Console.WriteLine("ボタン終了");
            button1.Enabled = true;
        }

        private async Task AsyncT()
        {
            Console.WriteLine("非同期処理開始");

            Thread.Sleep(1000);

            await Task.Run(SomeMethod);

            Console.WriteLine("非同期処理終了");
            throw new Exception();
        }

        private async Task SomeMethod()
        {
            await Task.Run(() => { Thread.Sleep(5000); });
        }
```

##出力結果

>ボタン開始
>非同期処理開始
>非同期処理終了
>例外発生
>ボタン終了

+ 6秒間ボタンが使用不可になる

#まとめ

戻り値voidの場合、

+ 呼び出し元でawaitが行えない
+ 非同期処理が終了する前に、呼び出し元のメソッドが実行される
+ 呼び出し元で例外をキャッチできない

戻り値Taskの場合、

+ 呼び出し元でawaitを行える
+ 非同期処理が終了してから、呼び出し元のメソッドが実行される
+ 呼び出し元で例外をキャッチできる
素人の言語処理100本ノック:12


[言語処理100本ノック 2015](http://www.cl.ecei.tohoku.ac.jp/nlp100/)の挑戦記録です。環境はUbuntu 16.04 LTS ＋ Python 3.5.2 \:\: Anaconda 4.1.1 (64-bit)です。過去のノックの一覧は[こちら](http://qiita.com/segavvy/items/fb50ba8097d59475f760)からどうぞ。

## 第2章: UNIXコマンドの基礎
>hightemp.txtは，日本の最高気温の記録を「都道府県」「地点」「℃」「日」のタブ区切り形式で格納したファイルである．以下の処理を行うプログラムを作成し，hightemp.txtを入力ファイルとして実行せよ．さらに，同様の処理をUNIXコマンドでも実行し，プログラムの実行結果を確認せよ．

###12.1列目をcol1.txtに，2列目をcol2.txtに保存
>各行の1列目だけを抜き出したものをcol1.txtに，2列目だけを抜き出したものをcol2.txtとしてファイルに保存せよ．確認にはcutコマンドを用いよ．


出来上がったコード：

```python:main.py
# coding: utf-8

fname = 'hightemp.txt'
with open(fname) as data_file, \
		open('col1.txt', mode='w') as col1_file, \
		open('col2.txt', mode='w') as col2_file:
	for line in data_file:
		cols = line.split('\t')
		col1_file.write(cols[0] + '\n')
		col2_file.write(cols[1] + '\n')
```

実行結果：

```text:col1.txt
高知県
埼玉県
岐阜県
山形県
山梨県
和歌山県
静岡県
山梨県
埼玉県
群馬県
群馬県
愛知県
千葉県
静岡県
愛媛県
山形県
岐阜県
群馬県
千葉県
埼玉県
大阪府
山梨県
山形県
愛知県
```

```text:col2.txt
江川崎
熊谷
多治見
山形
甲府
かつらぎ
天竜
勝沼
越谷
館林
上里見
愛西
牛久
佐久間
宇和島
酒田
美濃
前橋
茂原
鳩山
豊中
大月
鶴岡
名古屋
```


UNIXコマンドの確認は、シェルスクリプトで行いました。

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

# col1の抽出と比較
cut --fields=1 hightemp.txt > col1_test.txt
diff --report-identical-files col1.txt col1_test.txt

# col2の抽出と比較
cut --fields=2 hightemp.txt > col2_test.txt
diff --report-identical-files col2.txt col2_test.txt
```

実行結果：

```console:端末
ファイル col1.txt と col1_test.txt は同一です
ファイル col2.txt と col2_test.txt は同一です
```

無事、同じ結果になりました。

### UNIXコマンドの短いオプションと長いオプション

UNIXコマンドのオプションは、短いものと長いものがペアになっていることが多いです。長い方が意味が分かりやすいので、このノックでは長い方を使っています。ただ、よく使うものは短いものを覚えた方が入力が楽ですね。

今回使ったコマンドの短いオプションは次の通りです。詳細は`man`でご確認ください。

| コマンド | 今回使ったオプション | 短いオプション | 意味 |
|:------:|:-------|:-------|:-------|
| cut | --fields | -f | 切り出すフィールドの番号 |
| diff | --report-identical-files | -s | 比較結果が同じ場合も報告 |

　
13本目のノックは以上です。誤りなどありましたら、ご指摘いただけますと幸いです。
DDD 読書メモ　目次

[エリック・エヴァンスのドメイン駆動設計](https://www.amazon.co.jp/%E3%82%A8%E3%83%AA%E3%83%83%E3%82%AF%E3%83%BB%E3%82%A8%E3%83%B4%E3%82%A1%E3%83%B3%E3%82%B9%E3%81%AE%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88-Architects%E2%80%99Archive-%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E9%96%8B%E7%99%BA%E3%81%AE%E5%AE%9F%E8%B7%B5-%E3%82%A8%E3%83%AA%E3%83%83%E3%82%AF%E3%83%BB%E3%82%A8%E3%83%B4%E3%82%A1%E3%83%B3%E3%82%B9/dp/4798121967) の読書メモの目次。

- [まえがき](http://qiita.com/opengl-8080/items/a5ee78c6710a16f9bb25)
Vue.js の 2.0 の新機能をみていこう（１

久しぶりに勉強します。
ソース：https://github.com/vuejs/vue/issues/2873

#Vue.js 2.0の変更点

* テンプレートのパーサーがDOMに依存しなくなったので1系であった制限がなくなりました。
* テンプレートを関数にするコンパイラとランタイムを分離しました。現在２つのビルドが存在します。
    * スタンドアローン
        * １系と同様、コンパイラとランタイムの両方を含みます。
    * ランタイムのみ
        * コンパイラを含まないためテンプレートを事前コンパイルするか、レンダー関数を自作してください。npmパッケージから入手する場合、デフォルトではこちらになります。これはBrowserifyなどが事前コンパイルステップを含み、そのなかでvueifyなどが使用され、コンパイルされることを想定しているからです。
* ConfigやAPIに新規・非推奨があります

# v-for イテレーションの変更
* \$indexと\$keyの非推奨
* ネストループに限界があるため非推奨です
* 新構文：Array
    * value in array
    * (value, index) in array
* 新構文：Object
    * value in obj
    * (value, key) in obj
    * (value, key, index) in obj

# ディレクティブの変更
* 役割を大幅に減らしました。
* 現状、ディレクティブはDOMの直接操作のためだけにあります。
* これからはコンポーネントを使ってください。
* ディレクティブはインスタンスを持たなくなりました。つまりthisは存在せず、bindなどはデータを引数から渡されます。
* bindingは不変であり、値をセットしたりプロパティを追加したりできません。どうしても必要な場合はelを使ってください。（上記リンク先にコード例あり）
* updateフックの変更
    * bindの後に自動的には呼ばれません
    * 値に変更があったかどうかに関わらず、再描画時に常に呼ばれます。
* パラメータやオプションの類は全て非推奨になりました。

# フィルターの変更
* フィルターは{{ }}内でのみ使えるようになりました。
* ビルドインのフィルターはありません。moment.jsやaccounting.jsなどを使うか自作してください。
* スペースデリミタはやめJavascriptの関数のようになりました。
    * {{ date | formatDate('YY-MM-DD') }}

# アニメーション (Transition)

## Transition CSSクラスの変更
* v-transitionクラスは設定されなくなりました
* AngularやReactにクラス名を合わせました

## API の変更

### \<transition>
* 単一タグに対するアニメーションは、そのタグを\<transition>タグで囲むことで実現できるようになりました。
* このタグはレンダリングされず、アニメーションとしてのみ現れます。
* プロパティ
    * name: String (Default: v)
        * CSSクラスをつくります。
        * name = 'fade' -> .fade-enter, fade-enter-active, etc.
    * appear: Boolean (Default: false)
        * 最初の描画時に適応するかどうか
    * css: Boolean (Defaut: true)
        * CSSクラスを適応するかどうか
        * falseの場合、イベントのみ発生
    * type: String (Default: 自動）
        * transitionイベントの種類を指定
        * 値："transition"/"animation"
        * デフォルトではより長い時間がかかるほうを選ぶ
    * mode: String (Default:同時）
        * leaveとenterクラスを切り替えるタイミング
        * 値: "out-in"/"in-out"
    * enterClass/leaveClass/etc.: String
        * 独自に設定できるクラス
* イベント
    * １系のenterなどのフックイベントを属性としてかけます
    * <code>\<transition @enter="func"\>
    * leave-cancelledは使えません。ただし、v-showでは使えます。

### \<transition-group>

* 複数の子要素に対してアニメーションできます
* \<transition>と異なり実際にタグがレンダリングされます
* tag属性でタグを指定できます。デフォルトはspanです。
* is="transition-group" 属性が設定されます。
* modeプロパティ以外の\<transition>のプロパティが使えます。
* 全ての子要素にはユニークなキーが必要です。
* CSS transform による Moving Transitionsが可能です
* [demo](https://jsfiddle.net/yyx990803/yfpLvjxx/)

### 再利用性

* Vue.transition()とtransitionオプションは非推奨になりました。
* コンポーネントのプロパティとイベントで設定してください。
* 再利用できるtransitionを作成する場合、transitionコンポーネントを作成してください。
* これはFunctional componentの一種になります。


いろいろ非推奨になってたりして結構変わってますね・・・

結構長いですね。いったん休憩。[次回](http://qiita.com/kazusa-qooq/items/36e2a5d2de3616a7865a)はv-modelの変更から。
[ PHPUnit ] ボーリングから考えるテスト駆動開発 1テスト目

これからはじめるTDD テスト駆動開発入門 ThinkIT Books より

↑はrubyでとのことだが僕はphperなのでphpでやってみた

流れとしては
①設計や行う処理を定義する
②テストを書く(失敗する)
③テストが通る処理を書く
.
.
繰り返し

# ボーリングの点数計算プログラムを作る

### 最初の設計
- BowlingGame.phpに点数計算をさせることにする

### テストを書く

```php
<?php
use PHPUnit\Framework\TestCase;
use App\BowlingGame;

class BowlingGameTest extends TestCase
{

    public $BowlingGame;

    public function setUp()
    {
    }

    public function tearDown()
    {
        unset($this->BowlingGame);
    }

    public function testCreateInstance()
    {
        $this->BowlingGame = new BowlingGame();
    }
}
```
### 実行する
```bash
$ vendor/bin/phpunit tests/BowlingGameTest.php 
```
### 怒られる
```bash
$ vendor/bin/phpunit tests/BowlingGameTest.php 

PHPUnit 5.5.4 by Sebastian Bergmann and contributors.

E                                                                   1 / 1 (100%)

Time: 19 ms, Memory: 4.00MB

There was 1 error:

1) BowlingGameTest::testCreateInstance
Error: Class 'App\BowlingGame' not found

/var/www/html/test/UnitTest/tests/BowlingGameTest.php:21

ERRORS!
Tests: 1, Assertions: 0, Errors: 1.
```
### テストを通るようにする
クラスがないと言われているのでクラスファイルを作る

```php
<?php

namespace App;

class BowlingGame
{ 
}
```

### テスト実行

```bash
$ vendor/bin/phpunit tests/BowlingGameTest.php 
PHPUnit 5.5.4 by Sebastian Bergmann and contributors.

.                                                                   1 / 1 (100%)

Time: 15 ms, Memory: 4.00MB

OK (1 test, 0 assertions)
```
クラスがあるのでもちろん通る

## 感想

まだ1テスト目だが、まず最初に失敗するテストを書くため
ドMなプログラマー諸君には向いている手法なのではないか。

今後入り組んだことをやっていくにつれてどうなるのかが楽しみ。
emacsで編集中のmarkdownファイルをGitHubライクにプレビューする方法

## 概要
emacsでmarkdownファイルを編集する際、`markdown-mode`を使用している。
`markdown-mode`では`markdown-preview`コマンドでmarkdownファイルをプレビューできるが、見た目がそっけない。
そこでGitHubライクなmarkdownプレビューができる`grip`を使用する。

## ググった結果
[EmacsでGithub flavorなMarkdownをプレビューできるようにする - cloverrose's blog](http://cloverrose.hateblo.jp/entry/2014/11/03/220452) に方法が紹介されているが、これには以下の問題がある。

- 外部にshell scriptを作成しなければならない（設定がemacs内に閉じていない）
- markdownファイルを編集する度にプレビューしなおさなければならない
- プレビューの表示が遅い気がする（気のせい？）

そこで以下を満たす設定を作成した。

- 設定が`init.el`に閉じている
- ファイル保存の度にプレビュー内容が自動更新される（`--export`オプションなしで`grip`を実行すれば良い）

## 設定内容
```el
(setq github-user "Your GitHub username")
(setq github-pass "Your GitHub password")

(defun my-markdown-preview ()
  (interactive)
  (when (get-process "grip") (kill-process "grip"))
  (when (get-process "grip<1>") (kill-process "grip<1>"))  ;; プロセスが二重に起動していた場合、そちらもkillする
  (start-process "grip" "*grip*" "grip" (format "--user=%s" github-user) (format "--pass=%s" github-pass) "--browser" buffer-file-name)
  (when (get-process "grip") (set-process-query-on-exit-flag (get-process "grip") nil))
  (when (get-process "grip<1>") (set-process-query-on-exit-flag (get-process "grip<1>") nil))    ;; プロセスが二重に起動していた場合、そちらもフラグを設定する
  )
(define-key global-map (kbd "C-c p") 'my-markdown-preview)
```

## 使い方
markdownファイルを開いて `M-x my-markdown-preview` または `C-c p` でプレビューできる。
elixir on phoenix セットアップ


#セットアップ

##Elixerをインストール

```
brew update
brew install elixir
```

##Hex（パッケージマネージャ）のインストール

```
mix local.hex
```

##Phoenixのインストール

```
mix archive.install https://github.com/phoenixframework/archives/raw/master/phoenix_new.ez
```
※nodeとDBはインストールされている前提

#Elixer

##対話環境

```
iex
```

##ライブラリのインストール

```
mix deps.get
```
mix.exsのdepsに記述する


##デバック

```
IO.write "foo" # => 改行なし
IO.puts "foo"  # => 改行あり
IO.inspect 123 # => リストとかも出力できる
```

#リンク

1.elixir on phoenix セットアップ
[2.elixir on phoenix Mix Tasksについて](http://qiita.com/su_mi/items/d5d25a10a3d967f7b1a0)
[3.elixir on phoenix ectoを使っていろいろなSELECT文](http://qiita.com/su_mi/items/10b1c40e9c1f97f72a7f)
[4.elixir on phoenix ルーティングの書き方についてまとめてみた](http://qiita.com/su_mi/items/1ec1df829a2325ff71bc)
[5.elixir on phoenix changesetでのValidates](http://qiita.com/su_mi/items/feb97e62aa24c73b3eb0)
Windowsで作られたZipファイルをMacで文字化けせずに解凍する方法

Unarを使う。[http://unarchiver.c3.cx/commandline](http://unarchiver.c3.cx/commandline)

homebrewを使ってインストール。

```
brew install unar
```

解凍。

```
unar hogehoge.zip
```

めっちゃ便利。
マウスドラッグのハンドリングに関するアイデア

## 概要

マウスドラッグのハンドリングに関するアイデア

## 提案

- mousedown で mousemove, mouseup を登録する関数を渡す

## 背景

ツール系アプリに鉛筆ツールや範囲選択ツールなど複数の機能を実装するにあたって、それぞれのツールをクラスとして作っていましたが、複雑だし `this` がカッコ悪いなぁと思いました。
JavaScript ではなるべく普通の変数、関数を使うのが良いと最近思うので、そのように書き直してみました。

## 元々のクラス

```js
export class PencilMouseHandler {
  constructor(emitter) {
    this.emitter = emitter
  }

  onMouseDown(e) {
    const {offsetX, offsetY} = e
    this.startPosition = {x: offsetX, y: offsetY}
    this.emitter.trigger("start-pencil-drawing", this.startPosition)
  }

  onMouseMove(e) {
    const {offsetX, offsetY} = e
    this.emitter.trigger("move-pencil", {movement: {
      x: offsetX - this.startPosition.x,
      y: offsetY - this.startPosition.y
    }})
  }

  onMouseUp() {}
}
```

## 関数版1

イベントを登録する関数 `onMouseDown`, `onMouseMove` を渡すことで
`this.emitter` と `this.startPosition` を普通の変数にできました。

```js
function handlePencilMouse(emitter, onMouseDown, onMouseMove, onMouseUp) {
  let startPosition
  
  onMouseDown(e => {
    const {offsetX, offsetY} = e
    startPosition = {x: offsetX, y: offsetY}
    emitter.trigger("start-pencil", startPosition)
  })

  onMouseMove(e => {
    const {offsetX, offsetY} = e
    emitter.trigger("move-pencil", {movement: {
      x: offsetX - this.startPosition.x,
      y: offsetY - this.startPosition.y
    }})
  })
}
```

(`onMouseDown`, `onMouseMove`, `onMouseUp` で登録した関数は mouseup 後に破棄されることにします)

## 関数版2

このアプリではマウスダウン中のドラッグしか扱わないので、onMouseDown で onMouseMove, onMouseUp を渡します。(提案する部分です) 

これで onMouseMove, onMouseUp が onMouseDown の後に呼ばれることがハッキリするのと、`let startPosition` を const にできました。

```js
function handlePencilMouse(emitter, onMouseDown) {
  onMouseDown((e, onMouseMove, onMouseUp) => {
    const {offsetX, offsetY} = e
    const startPosition = {x: offsetX, y: offsetY}
    emitter.trigger("start-pencil", startPosition)
  
    onMouseMove(e => {
      const {offsetX, offsetY} = e
      emitter.trigger("move-pencil", {movement: {
        x: offsetX - this.startPosition.x,
        y: offsetY - this.startPosition.y
      }})
    })
  })
}
```

## 関数版3

そもそも動作が onMouseDown から始まるので、関数自体を mousedown イベントに登録します

```js
function handlePencilMouseDown(emitter, e, onMouseMove, onMouseUp) => {
  const {offsetX, offsetY} = e
  const startPosition = {x: offsetX, y: offsetY}
  emitter.trigger("start-pencil", startPosition)

  onMouseMove(e => {
    const {offsetX, offsetY} = e
    emitter.trigger("move-pencil", {movement: {
      x: offsetX - this.startPosition.x,
      y: offsetY - this.startPosition.y
    }})
  })
}
```

## まとめ

- クラスよりも関数を使いたい
- mousedown 時に mouseup, mousemove を登録させると短くできる

## オチ

読みづらいので実際のアプリでは関数版1を使いました
mrubyで赤外線リモコン

# 赤外線リモコン

ビット・トレード・ワンさんのUSB接続の赤外線リモコンをmrubyで制御してみました。

http://bit-trade-one.co.jp/product/assemblydisk/ad00020/

![写真（2018-02-21 19.59）.jpg](https://qiita-image-store.s3.amazonaws.com/0/104066/1e45f87a-cef3-2306-a205-e6dcd5a8d8d4.jpeg)

----
# mrbgem

FreeBSD上でLinux用に書かれたlibusbのコードを使ってmrubyの拡張ライブラリのmrbgemを作ってみました。

https://github.com/yamori813/mruby-remocon

```ruby
  conf.gem :github => 'yamori813/mruby-remocon'
```

環境変数のMRUBY_CONFIGで指定したbuild_config.rbに追加してZRouterでmruby入りのイメージを作成。

Mac OS Xでも使えるようにしてあります。Linuxでも使えるかもしれません。

---
# 使い方

```ruby
# Sony CD Player Play
play = [0x33, 0x4d, 0x10]

t = Remocon.new()

if t.open then
  t.send(play)
  usleep 45*1000
  t.send(play)
end
```

モジュールの仕様が、あまり見た事の無いタイプだったので、データのビットの並びを逆転しています。

radi_SHさんのSONY機種追加対応ファームウェアで12ビット系と20ビット系を確認しました。

http://a-desk.jp/modules/forum_hobby/index.php?cat_id=8

---
# イメージ

[ZRouterのmruby](http://qiita.com/yamori813/items/038027275d21e87388cd)に追加してビルドしてFreeBSD/mips(AR9132)で試してみました。

![IMGP0229.JPG](https://qiita-image-store.s3.amazonaws.com/0/104066/04760908-296e-be0e-45ae-b2e77de9ffba.jpeg)

WZR-HP-AG300H(AR7161)ではgpioctl 2 1しないとUSB使えません。

---
# おまけ

秋月のソリッドステートリレーでAC100VをON/OFFしてみました。

![IMGP0186.JPG](https://qiita-image-store.s3.amazonaws.com/0/104066/71de75b7-8472-7632-448e-0f35aefe6028.jpeg)
helm-miniのsourceにhelm-projectileとhelm-etags-plusを設定する方法

## 目的
helmを使って以下を検索できるようにする。

- バッファ一覧
- 最近使用したファイル
- プロジェクトフォルダ内のファイル一覧（`helm-projectile` を使用）
- etagsの一覧（`helm-etags-plus` を使用）

## 設定方法

```el
;; el-getを使ってパッケージを導入
(el-get-bundle helm)
(el-get-bundle helm-projectile)
(el-get-bundle helm-etags-plus)

;; helm-miniのsourceを設定
(when (and (require 'helm-projectile)
           (require 'helm-etags+))
  (custom-set-variables
   '(helm-mini-default-sources '(helm-source-buffers-list
                                 helm-source-recentf
                                 helm-source-projectile-files-list
                                 helm-source-etags-select))))

;; キーバインドを設定
(define-key global-map (kbd "C-c h") 'helm-mini)
```

## 使い方
`C-c h` で `helm-mini` を開くと、設定したsourceがバッファに表示される。
あとは通常のhelmと一緒。
cordovaでネイティブプラグイン作ろうとして、iOSのバージョンで怒られる時の対処法

# 怒られた内容

```txt
ld: warning: object file (/Users/junichi/work/cordova/cmdtest/platforms/ios/CmdTest/Plugins/com.example.hello/HelloMrubyPlugin/libmruby.a(array.o)) was built for newer iOS version (10.0) than being linked (8.0)

```

# 対処方法

platforms/ios/cordova/build.xconfigを編集する。

```txt
IPHONEOS_DEPLOYMENT_TARGET = 10.0
```

IPHONEOS_DEPLOYMENT_TARGETを変更する。

# 追記

リンクエラーが出て、これに対処していたが、
どうやら、この警告だけでは、ビルド自体完了して、
実機でも動く模様。

# 関連記事

- [iOSでもCordovaプラグインを作ってmrubyを動かした](https://abrakatabura.hatenablog.com/entry/2016/10/08/072147)
- [cordovaのプラグインを作ってkindle fireでmrubyを動かしてみた](https://abrakatabura.hatenablog.com/entry/2016/09/21/070123)
- [久しぶりにCordovaを動かしてみたら動かなかった](https://abrakatabura.hatenablog.com/entry/2017/07/29/072941)
jquery datepicker

#Datepicker Widget  wiki
https://api.jqueryui.com/datepicker/#option-beforeShowDay

#code
	   <script>
		//	$( "#datepicker" ).datepicker();
			$("#datepicker").datepicker({
		// The hidden field to receive the date
		altField: "#dateHidden",
		// The format you want
		altFormat: "yy/mm/dd",
		// The format the user actually sees
		dateFormat: "yy/mm/dd",
		onSelect: function (date) {
			$("#check_day").val(date);
			updatePreferentialScheme();

		}<?php
		$executeStr="";
		if(count($disableDateList["disableWeekDayList"])>0){
			
			foreach($disableDateList["disableWeekDayList"] as $key=>$value)
			{
					if($executeStr=="")
					{
						$executeStr="date.getDay() != $value";	
					}
					else
					{
						$executeStr.=" && date.getDay() != $value";	
					}
			}
			}
			if(count($disableDateList["disableDateRangeList"])>0){
			
			foreach($disableDateList["disableDateRangeList"] as $item)
			{
					if($executeStr=="")
					{
						$executeStr="!(date.Format(\"yyyy-MM-dd\")>='".date("Y-m-d",$item[0])."' && date.Format(\"yyyy-MM-dd\")<='".date("Y-m-d",$item[1])."') ";	
					}
					else
					{
						$executeStr.=" && !(date.Format(\"yyyy-MM-dd\")>='".date("Y-m-d",$item[0])."' && date.Format(\"yyyy-MM-dd\")<='".date("Y-m-d",$item[1])."') ";	
					}
			}
			}
			if($executeStr!=""){
			?>,beforeShowDay: function(date){ 
				
				return [<?php echo $executeStr;?>,""];}
		<?php }
		if(count($disableDateList["ableDateRangeList"])>0){
			echo ",";
			$configStr="";
			foreach($disableDateList["ableDateRangeList"] as $item)
			{
				$time1=strtotime(date("Y-m-d",strtotime(date("Y-m-d",$item[0])." -1 month")));
				$time2=strtotime(date("Y-m-d",strtotime(date("Y-m-d",$item[1])." -1 month")));
				$item[0]=$time1;
				$item[1]=$time2;
				?>
					minDate: new Date(<?php echo date("Y",$item[0])?>, <?php echo date("m",$item[0])?>, <?php echo date("d",$item[0])?>),
			 maxDate:new Date(<?php echo date("Y",$item[1])?>, <?php echo date("m",$item[1])?>, <?php echo date("d",$item[1])?>)
				<?php
			}	
			 }?>

	});
		  </script>
"nc -z"の代替コマンド


CentOS7からncがncatのエイリアスになってしまったようで、「-z」オプションが忽然と消えてしまっています。
様々な代替コマンド（スクリプト）が提案されていますが、下記のものが一番スッキリしているように思います。「$?」でステータスをとって分岐すればポートの死活監視に利用可能です。

```
timeout 1 bash -c 'cat < /dev/null > /dev/tcp/192.168.0.1/1234'
```

http://stackoverflow.com/questions/4922943/test-from-shell-script-if-remote-tcp-port-is-open
技術英語 > rather than its indiscriminate use.

@ Code Complete (No. 13193 / 36077)

gotoの使用の賛成について

> rather than its indiscriminate use.

http://ejje.weblio.jp/content/indiscriminate
> 無差別の、見境のない、乱雑な、ごちゃまぜの

http://ejje.weblio.jp/content/racial+discrimination
> 人種差別

などに使われるdiscriminationの前に否定のinがついてindiscrimination

<hr>
Code Completeの関連文は以下

> The argument for the goto is characterized by an advocacy of its careful use in specific circumstances rather than its indiscriminate use.
IntelliJでプロジェクトの開き方を後から変えたいときの対処方法


プロジェクトを開くときに現れる "Remember this decision and don't ask again" のダイアログで "Open project in the same window" などを選択しちゃったときの対処。複数のプロジェクトを別のウィンドウで開くことができなくなって地味に困ってた。

## 対処方法

設定画面の `Appearance & Behavior` > `Systems Settings` > `Project Opening` で変更できる。


![snapshot.png](https://qiita-image-store.s3.amazonaws.com/0/17122/2532140f-89f1-db77-f2cf-4e40f4387c93.png "snapshot.png")

## 参考

[Open a project in a new window in Intellij after “accidentally” clicking remember decision](http://stackoverflow.com/questions/22057641/open-a-project-in-a-new-window-in-intellij-after-accidentally-clicking-remembe)
Raspberry Pi 2(Raspbian)からAzure Storage Serviceにfileをuploadしてみた

Azureには様々なサービスがあることは知られていますが、どれも日本語の解説記事は少ないので大変ですね。
そういった場合、たいていはMicrosoft公式のリファレンスを見れば活用方法は書いてあるのですが、難しい言葉で長々と書いてあったりするので、ここではまとめて簡単に書いてみます。

今回はタイトルの通り、Azure CLIを使って Azure Storage Serviceと連携しました。

##➀必要なもののインストール

今回はRaspbianを使っているので、Azure CLIを使用します。
Azure CLIはコマンドラインシェルからオープンソースのコマンドを使ってAzure上のリソース管理をすることができるものです。

Azure CLIはnpmパッケージからインストールするので、まずはNode.jsとnpmをインストールしましょう。
(注:Raspberry piにデフォルトでインストールされているNode.js(v0.10.29)はかなり古いものなので、Node.js LTSver(4.x)をインストールしてください)

ここでは「uepon日々の備忘録」様の記事を参考にさせていただきました。(URL:http://uepon.hatenadiary.com/entry/2016/06/06/234224)

これができたらAzure CLIパッケージをインストールしましょう。
けっこう時間がかかるかと思います。気長に待ちましょう。
`npm install azure-cli -g`

終わったら上手くいってるかどうか確認するために次のコマンドを入力してみましょう。上手くできていればすぐわかると思います。
`azure help`

##②Azureログインとコマンドモード
個人のMicrosoftアカウントでログインするなら
`azure login`
と入力し、画面の支持に従ってください。

僕は今回学校のアカウントを使用するので、
`azure login -u アカウントメールアドレス`
を入力してから、パスワードを入力します。

あとはコマンドモードを選択しましょう。
デフォルトではService Managementモードといい、クラシックデプロイモデル、つまり旧AzurePortalで作成されたAzureリソースの操作用に使います。設定するには、
`azure config mode asm`
を入力します。
新AzurePortalで作成されたResource ManagerデプロイモデルでのAzureリソース操作は、
`azure config mode arm`
を実行します。

##➂ストレージアカウントの設定
新しいストレージアカウントを作成するなら
`azure storage account create <account_name>`
によって作成できます。<account_name>は3~24文字で、数字と小文字のみ使用できます。

次に、環境変数で規定のAzureストレージアカウントを設定します。
`    export AZURE_STORAGE_ACCOUNT=<account_name>
    export AZURE_STORAGE_ACCESS_KEY=<key>`

`<account_name>`は先程指定したものや、既存に作ってあるものの名前を指定します。
`<key>`はAzureサービス内でよく使われるconnectionstringという接続文字列であり、ポータルサイトから確認できます。

あるいは、次のコマンドで接続文字列を取得し、
`azure storage account connectionstring show <account_name>`

`<connection_string>`の部分を変更して環境変数に設定することもできます
`    export AZURE_STORAGE_CONNECTION_STRING=<connection_string>`

注意として、この接続文字列のなかに ; が2箇所入っているのですが、
";" と書き換えないと全文が環境変数に書き込まれません。

##➃Azure File ストレージでの管理
Azure Storage serviceの中には４つの種類に分かれていますが、今回はfileストレージを使ってみます。

ストレージアカウント - ファイル共有 - ディレクトリ - 各ファイル という階層構造になっています。

ファイル共有の作成は以下のコマンドでできます。(nameに任意のファイル共有名を追加)
`    azure storage share create <name>`

ディレクトリの作成は以下のコマンドです。(nameに任意のファイル共有名を指定、name1に任意のディレクトリ名を追加)
`    azure storage directory create <name> <name1>`

それでは、ディレクトリにファイルをアップロードしましょう。
以下のコマンドで可能です。(nameに任意のファイル共有名を指定、name1に任意のディレクトリ名を指定)
`    azure storage file upload 'ファイル.txt' <name> <name1>`
はじめてのAzureサーバ構築

##Microsoft Azure(マイクロソフト・アジュール)とは
いわゆるクラウドサービスになります。その他にもいくつかあります。
・Amazon EC2
・IBM Bluemix
・Google Compute Engine

#Azureに仮想サーバを構築
####Azure管理ポータルにアクセス
下記のURLからAzure管理ポータルのスタート画面にアクセスします。
https://portal.azure.com

※管理ポータルのスタート画面になります。
![ポータル画面.png](https://qiita-image-store.s3.amazonaws.com/0/130097/33c12885-e42f-0af0-55dd-58a47931aa6b.png)

###リソースグループ作成
リソースグループとは今後作成する仮想マシンや仮想ネットワークをまとめて管理するグループになります。

まず、管理ポータルのスタート画面から
　【新規】➡️【管理】➡️【リソースグループ】を選択
![リソースグループ作成.png](https://qiita-image-store.s3.amazonaws.com/0/130097/6da83574-b784-cb88-627c-16549fdf3f1d.png)


**・リソースグループ名 ->任意**
**・サブスクリプション ->任意**
**・リソースグループ場所 -> 日本（東日本 or 西日本）**
【作成】を選択しグループを作ります。

![リソース設定画面.png](https://qiita-image-store.s3.amazonaws.com/0/130097/b8693c48-f0e2-538c-f6ab-7e666665cdcc.png)

###仮想ネットワークを作成
【新規】➡️【ネットワーキング】➡️【仮想ネットワーク】を選択
![ネットワーキング.png](https://qiita-image-store.s3.amazonaws.com/0/130097/24da4556-594f-9d2f-3fa9-78587d4363fe.png)

デプロイモデルで、従来のものを選択したいのであれば、クラシックを選択します。
基本的にはリソース マネージャーを選択した方がよいです。

　【リソース マネージャーを選択】➡️【作成】
![viratualnetwork.png](https://qiita-image-store.s3.amazonaws.com/0/130097/076b1a75-b412-0218-27b9-ed7c81b7611e.png)

**・名前 ->任意**
**・サブネット ->　複数のネットワーク作成したい場合アドレス範囲を広げる**
**・リソースグループ -> 既存のものを使用で先ほど作成したグループを選択**
**・その他 ->そのままでおk**

![作成.png](https://qiita-image-store.s3.amazonaws.com/0/130097/3ba43408-123b-ea11-2e6c-f9dca845556d.png)

###仮想マシンをUbuntu Server 16.04で構築
【新規】➡️【Compute】➡️【Ubuntu Server 16.04 LTS】を選択
![ubuntuserver.png](https://qiita-image-store.s3.amazonaws.com/0/130097/3a61bbe8-3394-139d-71fd-63dfb69c152a.png)

リソースマネージャを選択し、作成後
**・名前 ->任意**
**・VM disk type -> 普通に使う分にはStandardの方がよい**
**・ユーザー名 -> 任意**
**・認証の種類 -> セキュリティの安全上SSHを選択すべき！**
**・その他 -> 今までと同様の設定でおk**

![設定１.png](https://qiita-image-store.s3.amazonaws.com/0/130097/bd720d8e-8c9f-7ee4-377a-7957f1cd669b.png)

とりあえず、私は一番安いのを選択しました。
![設定２.png](https://qiita-image-store.s3.amazonaws.com/0/130097/22217acb-2103-c221-76cc-2043af6cd0da.png)

細かいオプション機能を設定する必要があれば変えます。
　**診断 -> 有効 (1分ごとにサーバの状態を解析してくれます。)**
![設定3.png](https://qiita-image-store.s3.amazonaws.com/0/130097/68187c7a-8026-5c9d-e10f-ccc84a9d215c.png)

最後に確認して終了です！
![設定４.png](https://qiita-image-store.s3.amazonaws.com/0/130097/2dc751fc-3515-7c50-1f1d-432654e92a60.png)

##最後に
管理ポータルの【スタート画面】➡️【Virtual Machines】から構築した環境を確認できます。