OmniAICreator/Qiita-1.07M huggingface dataset:
MPIプログラムのデバッグ

# MPIプログラムの開発
MPI(Message Passing Interface)のデバッグが難しいというお話。

世のMPIライブラリ利用者ってデバッグをどうやっているのでしょうか…？
MPIを使ったプログラムだとデバッグの基本中の基本、Printfデバッグが一筋縄ではできません。

```C
#include <stdio.h>
#include "mpi.h"

int main(int argc, char *argv[]) {
    int numprocs, myid;
    MPI_Init(&argc,&argv);
    MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
    MPI_Comm_rank(MPI_COMM_WORLD,&myid);

    printf("Hello World.\n");
    MPI_Finalize();
    return 0;
}
```
例えば、上のようなプログラムを実行します。

```shell
$ mpiexec -np 4 ./a.out
Hello World.
Hello World.
Hello World.
Hello World.
```
とか出てくるはずです。
普通にやると複数のプロセスの出力が一つにまとまるせいで、どのプロセスが変な出力を出したのか全く見えません。
かと言って以下のように、毎度毎度ランク番号を出すわけにもいきません。
`printf("[%d], Hello World.\n", myid);`

MPIのOSS実装の一つであるOpen MPIには以下のようなオプションがあり、このオプション付きで実行するとランク番号ごとに出力を行うようになります。

```
$ mpiexec --output-filename hogehoge -np 4 ./a.out
```
これで、各プロセスごとに出力ファイルが別ファイルに出力されるようになり、printfデバッグがしやすくなると思います。

まぁデバッグならプロセスにアタッチするとか、coreファイルデバッグとかあると思いますが、最も単純なデバッグ方法をMPIプログラムでも使える方法を書いてみました。
VSCodeのVimキーバインドでVSCode本体のUndo/Redoを使う

## はじめに

[VSCodeVim](https://marketplace.visualstudio.com/items?itemName=vscodevim.vim)のデフォルトのUndo/Redoは、拡張機能側の独自実装なので、本来のVSCodeのUndo/Redo機能とは挙動が多少異なることがある。

* Undoで変更前の状態に戻しても変更されたファイルとして扱われる
* 外部 (Git等) でファイルの内容が変更された場合、全く戻すことができない

大きな問題にはならないが、違和感を感じたので、ユーザ設定を変更しVSCodeVimでVSCode本体のUndo/Redoを呼ぶように変更する。具体的には、`vim.normalModeKeyBindings`を変更する。

keybindings.jsonで変更することも考えたが、`u`が見つからなかったため断念した。
(`Ctrl+R`はできる)

### 注

`otherModeKeyBindings`はv0.13.0(2018-06-18)で`normalModeKeyBindings`に変更された。
それに伴い、本文中の記述も一部変更した。

## ユーザ設定

以下の内容を、ユーザ設定ファイルに追加する。

```json:settings.json
{
    "vim.normalModeKeyBindingsNonRecursive": [
        {
            "before": [
                "u"
            ],
            "after": [],
            "commands": [
                {
                    "command": "undo"
                }
            ]
        },
        {
            "before": [
                "<C-r>"
            ],
            "after": [],
            "commands": [
                {
                    "command": "redo"
                }
            ]
        }
    ]
}
```

## 説明
`vim.normalModeKeyBindings`は、normalモードでのキーバインドを上書きするために用意されている設定である。上記では`u`で`undo`を、`Ctrl+R`で`redo`を実行させている。

## まとめ
VSCodeVimのUndo/Redoに対する違和感が解消できた。他にも、`vim.handleKeys`で一部のキーを無効にしたり、`vim.insertModeKeybindings`で挿入モード時のキーバインドを変更したりできる。詳細は[VSCodeVim](https://marketplace.visualstudio.com/items?itemName=vscodevim.vim)を参照のこと。
📱Reason + React NativeでiOSアプリを作る

過去に遡って[Reason ML Advent Calendar](https://qiita.com/advent-calendar/2017/reason_ml)の3日目を書く。

今回は、ReasonとReact Nativeを組合せてiOSアプリを書く。

## :camera: 完成図とソースコード

<img width="559" alt="Screen Shot 2017-12-09 at 22.50.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/5920/c10eca29-6d5e-2432-f72a-d32254e3b473.png">

https://github.com/mzp/reason-of-work/tree/awesome-reason

## :coffee: React Nativeのセットアップ
ここは普通のReact Nativeプロジェクトと違いはないはず。

[create-react-native-app](https://github.com/react-community/create-react-native-app)を使うと一瞬で完成した。 しかし、一瞬すぎて何も分かならかったので、個別にパッケージをいれていく。

### プロジェクトの初期化

```shell-session
# 名前などを決める
$ npm init

# 依存するライブラリをいれる。
$ yarn add react-native react
```

### エントリポイント
`index.js` で起点となるコンポンーネントを起く。

```js

import React, { Component } from 'react';
import { AppRegistry, Text } from 'react-native';

export default class App extends Component {
  render() {
    return (
      <Text>Hello world!</Text>
    );
  }
}

AppRegistry.registerComponent('AwesomeProject', () => App);
```
### 設定ファイル
`app.json` でプロジェクト名を設定する。

```json
{
  "name": "AwesomeProject",
  "displayName": "AwesomeProject"
}
```

### 実行
Android/iOSのプロジェクトを生成する。

```shell-session
$ yarn run react-native eject
```

シミュレータを起動する。

```shell-session
$ yarn run react-native run-ios
```

## :camel: Reasonの導入
[bs-react-nativehe](https://github.com/reasonml-community/bs-react-native)を使って、JavaScript部分をReasonに置き換えていく。

### インストール
BuckleScriptとReact Nativeのバインディングを追加する。

```shell-session
$ yarn add bs-platform bs-react-native
```

### 設定ファイル
Reason/BuckleScriptの設定ファイルである `bsconfig.json` を作成する。

```json
{
    "name": "my-awesome-app",
    "reason": {
        "react-jsx": 2
    },
    "bsc-flags": ["-bs-super-errors"],
    "bs-dependencies": ["bs-react-native", "reason-react"],
    "sources": [{
        "dir": "re"
    }],
    "refmt": 3
}
```

### コンポーネント
`re/app.re` にReasonでコンポーネントを記述する。ReasonではJSXが利用できるので、見た目がだいぶJavaScriptというかHTMLに近くなる。

```ocaml
open ReactNative;

let app = () =>
  <View style=Style.(style([flex(1.), justifyContent(`center), alignItems(`center)]))>
    <Text value="Reason is awesome!" />
  </View>;
```

### ビルド
Reasonのビルドはbsbで行なう。

```shell-session
$ yarn run bsb
```

### エントリポイントの書き換え
Reason/BuckleScriptのビルド結果は `lib` 以下に出力される。 これをエントリポイントから読み込んで利用する。

```js
import { app } from "./lib/js/re/app.js";
import { AppRegistry } from 'react-native';

AppRegistry.registerComponent('AwesomeProject', () => app);
```

### 実行
これは先ほどと変わりはない。

```shell-session
$ yarn run react-native run-ios 
```

## :books: 参考資料
 * [ReasonReact · All your ReactJS knowledge, codified.](https://reasonml.github.io/reason-react/)
 * [React Native · A framework for building native apps using React](https://facebook.github.io/react-native/)
 * [FormidableLabs/seattlejsconf-app: ReasonML React Native App for SeattleJS Conf](https://github.com/FormidableLabs/seattlejsconf-app): ReasonML + React Nativeで書かれた実アプリ

## :heartbeat: 雑感
 * Docker内で動作させようとして無駄に苦労した。 素直にmacOS上で直接動かしたほうがよかった。
 * 型のサポートを受けつつiOSアプリを書きたいならSwiftという選択肢があるのでは???
Dockerで作るCodeIgniterローカル開発環境 入門編

こんばんは。公開がギリッギリになってしまいましたが、
この記事は<a href="http://qiita.com/advent-calendar/2017/code_igniter" target="_blank">CodeIgniter Advent Calendar 2017</a>の9日目です。

<a href="http://qiita.com/advent-calendar/2016/code_igniter" target="_blank">去年のアドベントカレンダー</a>は主催しておきながら技術ネタをほぼ何も書かなかったので、今年はゆっくり入門編から技術ネタを書きます。

開発をするにあたって、最初の1歩は開発環境を作る所です。

開発環境は `$ php -S localhost:2017` とコマンドを叩いても良いですし、MAMPでもVagrantでも何でも構わないのですが、今回はDockerを使います。

CodeIngiterはzipファイルを解凍して置けばどこでも動くという簡単さなので、Dockerを触った事が無い方にはちょうど良い入門記事になるのではないかな、と思ってこの記事を書いています。

Dockerを触った事が無い方は、気軽にｻｯと試してみて下さい。

## まずはCodeIgniterを準備


公式から CodeIgniter 3.1.6 のzipファイルを取ってきて展開します

```shell
$ cd ~/Desktop
$ wget https://github.com/bcit-ci/CodeIgniter/archive/3.1.6.zip
$ unzip 3.1.6.zip
$ cd CodeIgniter-3.1.6
```

で、ここからdockerコマンド1発で開発環境を作ります。
（Docker自体のインストールはここでは省きます。）

## dockerコマンド実行

```
$ docker run -p 80:80 -d -v ${PWD}:/var/www/html/ --name codeigniter-local php:7.2-apache
```

`php:7.2-apache` のDockerイメージが手元に無い方は `Unable to find image 'php:7.2-apache' locally` というメッセージの後、ダウンロードが始まります。

このコマンドで何をしているかというと、

- `php:7.2-apache` のDockerイメージを基に、 `codeigniter-local` というDockerコンテナを起動
    - `-d` オプションでバックグラウンド起動
- コンテナの80番ポートと、ホスト（macOS等）の80番ポートを接続
- 今居るホスト側の `~/Desktop/CodeIgniter-3.1.6` とコンテナ側の `/var/www/html` を共有

という具合です。
複雑な事はしていません。
PHP5.6が良ければ、 `php:5.6-apache` のDockerイメージを使って下さい。

コンテナが立ち上がれば、 `docker ps` コマンドで以下の様に状態を確認できます。

```shell
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
44c603b35a00        php:7.2-apache      "docker-php-entryp..."   5 minutes ago       Up 5 minutes        0.0.0.0:80->80/tcp   codeigniter-local
```

http://localhost ( http://0.0.0.0:80 ）がコンテナの80番ポートに繋がっているのが確認できますね。
ブラウザでアクセスすれば、見慣れたCodeIgniterのウェルカムページが見えます。

## Dockerコンテナを使う

コンテナ立ち上げたときに `codeigniter-local` という名前を付けたので、それを使ってコマンドを叩きます。

- `docker stop codeingiter-local` で停止
- `docker start codeingiter-local` で起動
- `docker logs codeigniter-local` でログ確認
    - `docker logs -tf codeigniter-local` でログ監視
- `docker rm codeigniter-local` でコンテナ削除（停止している時のみ）

ここでは簡単な紹介までにしておきます。
Dockerはドキュメントが充実しているので、色々ググってみて下さい。

## おわりに

いかがでしたか？
仕事ではdocker-composeを使ったりData volumeの仕様に頭を捻ったり、結構Dockerを使ってみています。
Vagrantを使った開発環境の頃よりも素早く作って壊す事が出来て、CircleCI2.0等への応用も効くので、なかなか勉強する甲斐があります。

今回はそんな自分が、まだ「Dockerよくわからんけど、入門記事無いかな。出来ればよく知ってる技術を使ったカンタンなやつ」と思ってた頃に欲しかった記事を書いてみました。
再帰関数 初めの一歩

「RubyでつくるRuby」を読んでいて
普通に再帰関数が出てきたので自分なりに
一度整理してみる。

率直に言って私は再帰関数が苦手です。
なんとなく言わんとしていることはわかるのですが、
コードを読むのが凄く疲れるんです。
たぶん、眉間にしわが寄っていると思う。

今まで関わってきたプロジェクトで一度も
再帰関数を見たことがないっていうのもあって
免疫自体がないのかもしれません。

#再帰関数とは
関数の中から自分自身の関数を呼び出す処理を行う関数

自分の中から自分を呼び出すので連続する同じような
処理とかに向いていると思われる。

そのため、個人的には使いどころが難しいと思う。

本ではTree構造のデータに対して使用していたので
条件が合えばJSON、XMLでも使用できるかなと思う。

#例)複利計算

何か単純な例がないか考えた結果・・・
みなさん、お金好きですよね？
お金が湧かないかなと思ったことありますよね？

例として複利計算を行おうと思います。

投資や借金、ローンなどで聞いたことがあるかもしれませんが、
複利とは元金（がんきん）によって生じた利子を次期の元金に
組み入れる方式で、元金だけでなく利子にも次期の利子がつく仕組みです。

例)
元金100円、利率が5%、期間が1年で運用した場合の元金は
100 * 1.05               = 105
元金100円、利率が5%、期間が2年運用した場合の元金は
(100 * 1.05) * 1.05        = 110.25
元金100円、利率が5%、期間が3年運用した場合の元金は
((100 * 1.05) * 1.05) * 1.05 = 115.7625

#while
```ruby
# パーセント
def percent(year_rate)
  year_rate.to_f / 100.to_f
end

# 複利関数(元金,年利(%),年数)
def fukuri(principal, year_rate, year)
  while year > 0
    principal *= (1 + percent(year_rate))
    year -= 1
  end
  principal
end

p fukuri(100, 5, 3)
115.7625
```

#再帰関数
```ruby
# パーセント
def percent(year_rate)
  year_rate.to_f / 100.to_f
end

# 複利関数(元金,年利(%),年数)
def fukuri(principal, year_rate, year)
  return principal if year.zero?
  fukuri(principal * (1 + percent(year_rate)), year_rate, year - 1)
end

p fukuri(100, 5, 3)
115.7625
```

#感想
複利で運用した場合の元金を求める関数を
whileを使った場合、再帰関数を使った場合を
比較のため書いてみました。  

学習の一環として無理やり再帰関数を
使ってみましたがどうですかね？
具体例が悪すぎるという可能性は高いですが、
個人的には単純な処理ほど再帰関数を
使用するメリットは得られませんでした。

今回だと処理の行数が減ったぐらいなのかな。
見やすくなったかは個人的には微妙です。

初めの一歩ですので、こんなものかな。

次回、二歩目があるかわかりませんが、
あればもうちょい複雑な処理を再帰関数に
して、今回よりもメリットを感じられれば良いかなと
思っています。
BitmovinでVR360度コンテンツのストリーミングを行う


#はじめに
VR動画をストリーミングで再生する際に、真っ先に上がるのはYoutubeだろう。
しかし有料配信する場合は別な手段を検討する必要があった。

##実現したいこと
・Webブラウザベースのストリーミング再生
・単眼複眼モードの切り替え
・Andorid5系以降、iOS10以降で動作しジャイロ機能のとの連動
・4Kサイズで配信したい
・DRM

ASPをいくつか調べてみた。
Omnivirt
https://www.omnivirt.com/
→動きはサクサク、DRM非対応。ドキュメント類はもう少し欲しい。
DRM対応の予定は今のところないとの回答。

Visbit
https://www.visbit.co/#/360-web-vr-player-demo
→画質より、低画質で実現できる方法を選択しているため今回は除外。

Vimeo
https://join.vimeo.com/360/
Vimeo Pro
→有料配信の課金がVimeo経由になるため今回は除外。

JWPlayer
https://www.jwplayer.com/
別案件でも使用しているが、なかなか良い。
ただ、VRに関しては複眼モードが使えず、今回は除外。

Bitmovin
https://bitmovin.com
→要件を満たし、サポートのチャットレスポンス、ドキュメントの充実度からも今回はこちらを選択。


##全体の流れ
1. 素材を用意する(4K monoral 3840x1920 H.264, AAC)
2. WebサーバーにまたはAWS S3などのストレージに配置
3. Bitmovin Encoding APIでエンコード
4. Bitmovin Player(MPEG DASH, HLS)に設定


##Bitmovin Encoding
2017/12/9 時点でGUIからのエンコードが出来なくなっている模様。
Bitmovin Encoding APIを使用する。
https://developer.bitmovin.com/hc/en-us/categories/115000139873-Encoding

結構エラー出るのでチャットで問い合わせると大体その日中に回答がくる。
![bitmovin.png](https://qiita-image-store.s3.amazonaws.com/0/46374/8b097225-9fd7-b516-4026-49af67a6a476.png "bitmovin.png")



##Bitmovin Playerの設定
![bitmovin-player.png](https://qiita-image-store.s3.amazonaws.com/0/46374/2ba6f84f-6c6c-52ba-b792-7b091839fb9a.png "bitmovin-player.png")

管理画面からLISENCE KEYを取得して、最新のStable版のJSコードを埋め込み先HTMLへ。
JavaScriptで埋め込むプレーヤーではパラメータで諸々調整可能。

VRで調整可能なパラメータ(抜粋)
cardboard: カードボード用の焦点距離に合わせられる
contentType: single,tab (Top and Bottom), sbs (Side by Side)
startPosition: 再生時の動画再生位置
stereo: true/false (複眼モード許可設定)
initialRotation: true/false 再生開始時に水平位置の調整が可能になる
initialRotationRate: 水平位置の調整レート e.g. 0.25

他にも結構細かい設定が可能。
https://developer.bitmovin.com/hc/en-us/articles/115001689833-Player-Configuration-v7



##まとめ
360度コンテンツの配信は現在技術革新の真っ只中。
今後も活発な開発が繰り広げられるだろう。
端末の高性能化にともなってデータ伝送量も減らせる H.265 もシェアを拡げそう。

高速回線で高画質の配信を実現してもカードボードで拡大してしまうとどうしても粗さが気になってしまうところの改善も同時にできるといいなと感じます。

VR自体の利用シーンやコンテンツの幅は現状まだ狭いが、楽に見れて酔わない見せ方ができるとエンタメとしては成り立つのではと思う。
【ComputeEngine】CentOS6でのMySQLの外部公開

Google Compute EngineでCentOS6のMySQLの外部公開の設定を行ったのでそのメモ。
ComputeEngineは月間無料枠もあるし、最安プランなら月5ドル程度なのでかなり良いと思ってます。


① MySQLで接続ユーザーの権限設定を行う
「Linux（CentOS）のMySQLへ外部接続する | 俺の開発研究所」
http://itmemo.net-luck.com/linux-centos-mysql-remote/


② CentOSでiptablesでポートを公開する
※ portが3306のとき

```
#iptablesの設定を編集
$ sudo vi /etc/sysconfig/iptables

# HTTP
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -jcreate database ACCEPT

#iptablesの再起動

$ sudo  /etc/rc.d/init.d/iptables restart
```


③ ComputeEngineのファイアウォール設定を変更する
「Google Compute Engineのファイヤーウォールを理解する #gcpja ｜ Developers.IO」
http://dev.classmethod.jp/cloud/gce-firewall/

```
ソースIP
0.0.0.0/0
ポート
tcp:3306
```
Laravel初心者から毛を生やす



#はじめに
これはLaravel Advent Calendar 2017 10日目の記事です。
こんにちは、Laravel見習いの @mikkame です。
Laravelのドキュメントに載っているのに（私の周りでは）あまり知られていない機能の紹介をする記事です。
もう知っているよという職人の方はごめんなさい！

## この記事の目的
- とりあえず現場でLaravelを使っている方
- これからLaravel案件にJOINする方
- 昔からLaravelを使っているが新しい機能について調べていない
- ドットインストールとか、Udemyとかをとりあえず見た人


色々な立場の方でも、体系的にLaravelを勉強したこと、ドキュメントを読破した事がない人が対象です。
私も、MVCはわかるからとりあえずやってみよう！という感じでLaravelを使っていますが、基本的な事かもしれないですが知らなかった機能、便利な機能
ドキュメントの下のほうに書いてある機能などを思いつく限り書いてみました。
今まではFatControllerでしたが、Skinny ControllerにすべくTipsを残します。


## 代入からcreate/fillへ

```php

$user = new User();
$user->username = $request->get('username');
$user->email = $request->get('email');
$user->password = Hash::make($request->get('password'));
$user->save();

```
これを

```php

$user = User::create($request->only(['username', 'email', 'password']);

```
こうすることでControllerがスリムになります。
createメソッドをオーバーライドすることによって初期化ステップを挟む事も出来ます。


## whereからscopeへ

```php
$my_items = Item::where('user_id', $user->id)->get();
```

これを


```php
$my_items = Item::own($user)->get();
```

```php:User.php
function scopeOwn($query, User $user)
{
    return $query->where('user_id', $user->id);
}
```
こうすることで、Conteoller側にwhere文を列挙しなくてもすみます。
大抵の場合、where文は使い回されることが多く、複数のコントローラで同じ条件を書いている事があるので
一元化しましょう。

例)
- https://qiita.com/namaozi/items/11b65ccb6b7ecaefc23e
## Mutatorを使う

```php
$user->json = json_encode($data);
$data = json_decode($user->json, true);
```

これを


```php
$user->json = $data;
$data =$user->json;
```


```php:User.php


function setJsonAttribute($arg)
{
    $this->attributes['json'] =  json_encode($arg);
}

function getJsonAttribute()
{
    return json_decode($this->attributes['json'], true);
}
```


こうします。
これも、プロパティの加工はいろいろなところで使い回される傾向があるので
一元化することで、修正の手間を省きます。

例: 
- first_nameとlast_nameをスペースで連結してから返す
- 後述のHtmlStringでタグにしてから返す

## HtmlStringを使う

```php:blade.php
@if ($model->type == 'text')
{{$model->value}}
@elseif(model->type == 'link')
<a href='{{$model->value}}'>リンク</a>
@endif
```


これを


```php:blade.php
{{$model->html}}
```


```php:Model.php
function getHtmlAttribute()
{
    if ($model->type == 'text') {
        return $this->value
    } else {
        return new HtmlString("<a href='$model->value'>リンク</a>");
　　　　　　　　　　　　　　　　　// view('hoge',$hoge)->render();の方が好ましい　セキュリティ的にも
    }
}
```


こうすることで、ｖiewを簡潔にします。
typeの種類が増えてもモデルの修正だけで済むので改修コストが下がります

例)
- 添付ファイルDL
- 一時リンク
- テキストと画像が混合してる時とか
今、gitのGUIクライアント自作が大流行！


# 勧誘

みなさんGitクライアントアプリを作っていらっしゃいます。

+ [自作Gitクライアントアプリを作っています](https://qiita.com/soramimi_jp/items/8425196ddc28bf283333) （@soramimi_jp さんの記事）
+ [今、gitのGUIクライアント自作が大流行！](https://qiita.com/guignol/private/eb6402a30efdb44298a3)（この記事）

自作するひとが増えて、そういう界隈が発生すると楽しいな、と夢見ています。

# 進捗

![進捗_3.gif](https://qiita-image-store.s3.amazonaws.com/0/202327/81b9c2f7-cb96-301c-a65e-2ca009fce781.gif)

# 動機

私の場合、

+ Windows版のSourceTreeがつらくなってきたので、そろそろ何か別のを使いたい
+ 行単位のstage/unstageをサポートしてるアプリが少ない
+ gitが好きなので、いつか自分でGUIアプリを作りたい
+ 無職最高！！！！！

みたいなのが自覚してる動機です。まあ他にもあったかもしれません。
（現在はフリーランスエンジニアとしてiOSやAndroidアプリの開発をやっています。）

また、昨年「[GUIのGitクライアントアプリを作ってみた](https://qiita.com/soramimi_jp/items/4bdffae3f8660b7e6874) 」を読んでいたおかげで、
自分で作ろうとするのが2～3年ぐらい早まったと思います。

# コミットを作る or コミットを操作する

作れそうなところまで作ってみるか、と思い立った後、
自分がgitのGUIクライアントに何を求めているかを考えて、
書き出したり、優先度をつけたりしていると、次のように思うようになりました。

gitを使ってやることは、次の2つのフェーズに分けて考えたほうがいいんじゃないか、と。

+ コミットを作る（`git add`, `git reset`, `git commit`など）
+ コミットを操作する（`git merge`, `git rebase`, `git reset`など）

この2フェーズを必ずしも同じアプリケーションでやる必要は無いんです。
気に入ってるアプリケーションを使いつつ、時にはコマンドラインを直接叩くように。

もちろん行ったり来たりするので同じアプリケーションのほうが楽ですし、
どちらにも区分できない機能もあるかもしれません。
（例えば`git bisect`は専用の何かを用意したほうがいいかもしれません。）
でもgitのアプリケーションを作るなら、ここは分けて考えたほうが良さそうです。

そして、どういう使い方でもコミットは作りますし、
私は何より行単位のstage/unstageを命綱として求めているので、
まずはこれを作ることにしました。

# 行単位のstage/unstageを実装する

これまでqiitaに書いた記事と、これから書く予定の記事です。

## [ \[1\] stage/unstage基礎知識編](https://qiita.com/guignol/items/f19d05b8db5390b9b647)

行単位のstage/unstageのためにやるべきこと5つ

`1. 元になるpatchとしてdiffを出力する`
`2. stage/unstageしたい行を選ぶ`
`3. hunkのボディを編集する`
`4. hunkのヘッダーを再計算する`
`5. 最終的なpatchをapplyする`

##  [ \[2\] stage/unstage不完全攻略編](https://qiita.com/guignol/items/3463d8f569c390be6801)

JGitを使ってみたら無理だったので、git.exeをそのまま使おうというお話でした。
詳しくは書いていませんが、Electronには返り討ちにされました。
いつかリベンジします。

## [ \[3\] stage/unstageパッチ編集編](https://qiita.com/guignol/items/c8d0cea9f6833942eaf2)

`3. hunkのボディを編集する`
`4. hunkのヘッダーを再計算する`

## [ \[4\] diff et al.](https://qiita.com/guignol/items/b59dce0137c4922553eb)

`1. 元になるpatchとしてdiffを出力する`

## [\[5\] 初めてのデスクトップアプリ](https://qiita.com/guignol/items/1f40fbae971606cbbcb8)

`2. stage/unstageしたい行を選ぶ`ための表示 

## [6] stage/unstageの仕上げ(仮)

`2. stage/unstageしたい行を選ぶ`の続き
`5. 最終的なpatchをapplyする`
ローカルの変更を破棄する（未完成）

## [7] テストを書く（仮）

コマンドラインで不可能なことにまで頑張って対応したりしてるのでテストを書かないと死にます。
テスト部分だけ切り出せてライブラリ化できたりすると最高なんですが、
たぶんそれは近いうちには厳しいので、どうやってテストしてるかを書く予定です。
なお、テストコードを書くのは初めてでした。

# 次の開発予定

なんだかんだでコミットするまではできました。
細かい課題や問題はありますが、一段落です。

無職を辞めてしまったので、使える時間が減りましたが、
「仕事で使おうとしたら必要な機能が足りなくて全速力で実装する」
というのもあったりして、良い効果もあります。

次は、大きい絵としては、

+ コミットを操作する

なんですが、まずはそのためにコミット履歴を表示するUIを考えるところからです。
まずは、複雑なグラフの表示を頑張らずに良い感じにしたいと思います。

ちなみに、私がGUIクライアントに求めるもの第二弾は`git rebase -i`です。
ハードルが高いと感じていますが、きっとなんとかなるでしょう。
ところで最近、手元のWindows10環境では
`git rebase`でスタックオーバフローするようになったので泣いています。

# 配布

Javaなのでどこでも動きますが、どうやって配布するのがいいんでしょうね。
まだ何も調べてないんですが、「強いストアがあればいいのに」とわがままを言ってるところです。
お名前ドットコムのドメインをAWSで使う

※ 個人開発でのメモです

# 必要なもの
- お名前ドットコムのドメイン
- AWS
  - EC2インスタンス
  - ElasticIP
  - route53

# 簡単な流れ
1. EC2インスタンスにElasticIPを割りあてる
2. route53にDNSの設定と、ElasticIPの登録
3. お名前ドットコムにroute53の情報を登録 


## EC2インスタンスにElasticIPをわりあてる
Elastic IPで「新しく割り当て」をクリックし、作成
アクション > アドレスの関連付け　からインスタンスを選択し、EC2インスタンスを割りあてる


## route53の設定
route53にログイン
https://console.aws.amazon.com/route53/

![スクリーンショット 2017-12-09 22.46.26.png](https://qiita-image-store.s3.amazonaws.com/0/216967/bf716467-ff99-2af7-1056-a9d3568c8322.png)

Created Hosted Zoneを押すと下の画面になる

![スクリーンショット 2017-12-09 22.46.39.png](https://qiita-image-store.s3.amazonaws.com/0/216967/57d0ebce-20b8-ca0b-82bd-f3e09c0357e3.png)

Domain Nameのところにお名前ドットコムで取得したドメイン名を入力し、createする

サブドメインを使いたかったらここでかく

たとえばドメインがhogehoge.comで、www.hogehoge.comを割り当てたかったら「www.hogehoge.com」ってかく
そのままドメイン使いたかったら「hogehoge.com」てかく

![image.png](https://qiita-image-store.s3.amazonaws.com/0/216967/4f3b637b-dbea-3666-943b-b5c1b6a8dfec.png)

作ったらこんなかんじになる
ns-から始まる4行をお名前ドットコムに登録するので、このページは開いたままにしておくとよいかも

で、さらにcreate Record Setを押すと下の画面になる

![image.png](https://qiita-image-store.s3.amazonaws.com/0/216967/18a7d7ba-d337-ea15-94d7-f8d7e27607a8.png)

ここで、Nameをからにしたまま、Aliasはnoで、valueのところにEC2インスタンスを割り当てたElasticIPをかく

そしてcreate

これでroute53の設定は終了

## お名前ドットコムの設定

![スクリーンショット 2017-12-09 23.05.25.png](https://qiita-image-store.s3.amazonaws.com/0/216967/8b044d55-c96c-53b3-db7f-56b6c7cf911c.png)

ドメイン設定 > DNS関連機能の設定に進む

![スクリーンショット 2017-12-09 23.07.19.png](https://qiita-image-store.s3.amazonaws.com/0/216967/328dd36f-52d4-2451-5ef0-f1793bfab2a0.png)

内部ドメイン一覧でチェックをいれ、「次へ進む」

![image.png](https://qiita-image-store.s3.amazonaws.com/0/216967/1b0b91b9-b03d-0103-d314-362f13ffd152.png)

DNSレコード設定を利用するの「設定する」を押すと下の画面になる

![スクリーンショット 2017-12-09 23.09.29.png](https://qiita-image-store.s3.amazonaws.com/0/216967/d9173e78-ca1d-55ad-70a6-4866117b2484.png)

typeを「NS」にする
ここで、サブドメインをつけてる場合、ホスト名のところにサブドメイン名をかく
「www.hogehoge.com」だったら「www」をかく
TTLとVALUEは、さっきのroute53の設定に出てきたns-から始まる4行の情報を一行ずついれていく

これであとはボタンをぽちぽち押していけば完了

反映に5分くらいかかってた
ETロボコンに3年間参加しての振り返り

初めまして。zoeと申します。
普段はC++で何かをしようとしたりしなかったりしています。
最近はPythonに興味があるので、近いうちに手を出していきたいなと思っています。
技術も経験もまだまだですが、ほんの少しでも名前を覚えていただけたら嬉しいです。

今日は、ETロボコンに関する事を書こうと思います。
技術的な話ではなく、「ETロボコンって何なの？」とか、「参加するとどうなるの？」みたいな話になってます。
技術的な話を期待していた方はごめんなさい。

# 目次

 - ETロボコンって？
 - よかったこと
 - 反省点
 - まとめ

# ETロボコンって？
「Embedded Technology」、つまり組み込み技術を競い合うコンテストです。
教育がメインの目的となっていて、企業の新人研修や、学生チームの参加も多いです。
競技を行う部門としては、

 - デベロッパー部門 （ 決められた走行体で決められたコースを走行し、タイムを競う ）
    - プライマリークラス （ 簡単な方 ）
    - アドバンストクラス （ 難しい方 ）
 - ガレッジニア部門 （ テクノロジーをベースに新しいものを創り、プレゼンと実演を行う ）

の3つがあります。
デベロッパー部門では、走行のタイムだけではなく、事前に提出するモデルシート （ UMLなどでソフトウェアの分析、構造、振る舞いなどを示すもの ）も評価の対象となり、走行とモデルが両方とも良かったチームが上位となるようになっています。
自分が参加したのは、プライマリークラス (2015,2016) と、アドバンストクラス (2017) です。

詳しくは[公式サイト](http://www.etrobo.jp/2017/)を見てください。
[今年のチャンピオンシップ大会（ 全国大会のようなもの ）の生放送のアーカイブ](https://www.youtube.com/watch?v=G8ehrY9V8Tk)も残っているので是非。

# よかったこと、成長できたこと

 - 複数人での開発
 - UMLに関する知識
 - （ 実行委員や他の参加者との交流 ）

などが個人的にやってよかったと思える点です。

### 複数人での開発
何かのためにやるっていう事を殆どしてこなかったので、「完成させないと他人に迷惑をかけてしまう」という中で開発をするという事を早いうちに経験出来てよかったと思っています。
また、進捗状況の管理や、現状の課題などの共有なども「こんな感じでやればいいのか」っていう雰囲気をつかめたので、今後につなげる事ができればなと思います。

### UMLに関する知識
UMLである必要はないのですが、要求→分析→振る舞い、構造の流れを、感覚的なものではなく、書式に従った図に落とし込む事で、実装が楽になるというのがすごくわかりました。
特に、複数人での開発をする際に、こういったもので構造、振る舞いをはっきりさせておくことで、個人の分担をはっきりさせることができ、仕様に対する疑問なども減らせました。
また、これからはコードの自動生成など技術の進歩により、人が実際にソースを書く機会が減ると予想されています。
だからこそ分析や設計などに関する知識などを今得る事はとてもいい事なのではないかと思っています。

# 反省点
毎年春、夏にコンテストに向けて開発を行うのですが、秋、冬に自身のスキルアップのための勉強を怠ったのが反省点だと思っています。
昨年度の秋から冬にかけては、受験すると決めた基本情報技術者試験の対策と、モデルの勉強を少しした程度でした。
実際に動くようなもの、他の言語や方向性など、自分の引き出しを広げるような活動をしておけば、今年度もう少しいい走行、モデルができたかもしれないと思うととても悔やまれます。

あとチーム内でモデルのレビューを繰り返し行えなかった事も反省点としてあげておきます。

# まとめ

総合的に自分が成長することはできたかなと思います。
初めて参加することになった頃はまだ進路や自分のしたい事について全く考えていませんでしたが、参加していた企業の方などとも話をする機会があり、今はある程度自分が何をしたいのか、どういう進路に行くのかについて考える事も出来ました。

来年は自身の都合上参加することはできそうにないですが、来年も参加する後輩たちのサポートは出来る範囲でやりたいなと思っています。

ここまでぐだぐだした話を読んでくださりありがとうございました。
Zabbix IoT で学ぶデータ読影

[先週](http://blog.serverworks.co.jp/tech/2017/12/02/zabbixadventcalendar2017/)はセンサーの設置方法をご紹介しました。

今回はこれらのセンサーデータを読み解きながら、Zabbixでデータを分析する際のコツをご紹介いたします。

# 周期性を見つける
![image.png](https://qiita-image-store.s3.amazonaws.com/0/102020/e599f9e1-b967-5fb5-74b7-96b3c25ee0fa.png)
まずは、単純なグラフをみてみます。
このグラフでは2週間分のデータをを表示しています。日の出からお昼まで温度が上がり、それから次の日の出まで温度が下がるという周期性が見つかるとおもいます。
## 周期性を見つける時の有効な機能
### ズーム機能
Zabbixではスライドバーにあるズームリンクをクリックすることで、簡単に1日は1週間、1ヶ月などの期間を指定することができるので、日単位や週単位、月単位の周期性を見つける時に役立ちます。<img width="935" alt="2017-12-09_21h06_40.png" src="https://qiita-image-store.s3.amazonaws.com/0/102020/be5e7b02-90dd-826c-eaa9-5b186dbdd241.png">

### ワーキングタイム
![image.png](https://qiita-image-store.s3.amazonaws.com/0/102020/7cf6e7e7-37d9-187f-ef08-d289e3f960d7.png)
ワーキングタイムを指定することで、グラフ背景の明期、暗期がかわります。
時間的周期性を見つける際にこの背景の色が変わることは大きな助けとなります。

## 周期性の外れ値を判断する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/102020/e599f9e1-b967-5fb5-74b7-96b3c25ee0fa.png)
周期性を見ていく中で、その周期性が崩れた部分があれば、その部分の意味を解釈します。
今回のデータでは11月30日 12月1日の気温上昇が他の日に比べて上がっていない事に気付くとおもいます。
このことからおそらくこの日は曇りだったと考えられます。

日中の曇りは判断しやすいのですがこの時期は夜間の曇りも温度から判断することが可能です。
11月28日や12月9日の夜間の温度を見ると他の日に比べて温度低下の傾きが小さいことがわかります。
冬は「放射冷却」の影響で温度が下がりますが、曇っていれば温度低下が穏やかになるので、判断することができます。

## 別機器の同じメトリクスを重ねる
温度だけでも天候がわかる事がご覧頂けたと思います。
ただし、気温は日当たりだけでは無く、気団によっても変わります。
そこで、そのようなご判断を避けるために日向と日陰の温度を重ねて見てみましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/102020/708fab73-de67-0c5a-307c-f8ec754bdd07.png)

先ほどの周期性を見るだけでは、暖かい空気が外部から流れ込んだ時などに判断を誤る可能性があります。
日向と日陰の気温を重ねて表示することで、
重なっている場合は差が無いため日照以外の要員での温度変動、
重なりが無い場合は日照による温度変動と言うことが判断できます。
こうすることで、温度だけでその日晴れていたのか、曇っていたのか判断ができるようになりました。
Zabbix IoT で天気がわかるようになりましたね。

この技術は天気にしか使えない分けではありません。
周期性の発見・周期性の判断はCPUやネットワークトラフィックでも重要なテクニックです。

#関連性を見つける
![image.png](https://qiita-image-store.s3.amazonaws.com/0/102020/df8ce206-58d9-0c60-c06d-99fa6990cf8c.png)
今度は気圧のグラフを見てみましょう。
今年は10月22～23日にかけて[台風21号](http://www.tenki.jp/forecaster/diary/anzaihiroko/2017/10/22/85161.html)が直撃しました。
気圧変動で見ると台風なみに大きな嵐があったこともわかります。

台風21号が通過したときの気圧を見てみましょう
![image.png](https://qiita-image-store.s3.amazonaws.com/0/102020/81475a89-3df9-6ec6-f553-4372abb34a25.png)
4時から5時にかけて通過していったことがわかります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/102020/49beb08a-d4e6-091f-f0b1-55c03f3c9189.png)
しかし、通過時刻を特定しようと、気圧グラフの行が範囲を絞ると、傾きがぼやけてしまいました。
長い期間で見れば大きく変化するものの、短時間では大きく変化しないため、気圧だけで判断をするのは難しいのです。

そこで、ここに気温のグラフを重ねて見ましょう
![image.png](https://qiita-image-store.s3.amazonaws.com/0/102020/98bc4ba6-24ab-36f9-a07f-d091da669e7e.png)
非常に特徴的なグラフが出てきました。
台風は通過前と通過後で一気に風向きが変わるため吹き込む空気の温度が一気にかわります。
このため、台風のがいつ通過したのかを判断することができます。

#まとめ
天候測定と言えば日照計や風向風速計などが必要という思い込みがありますが、
気圧センサーと気温センサーを組み合わせるだけでも、台風の通過や晴雨状況を判断することが可能です。
限られた値で状況を判断する能力はIoTの実装では重要になってくるでしょう。
ただし、その時には気象学などの知識が若干必要になります。

また、今回のように複数のデータを組み合わせて時間スケールを変えながら見ていくことは
システム監視でも重要です。
例えばCPUとネットワーク、CPUとメモリ、ストレージとネットワークなど
少ないメトリクスでも知識があればシステムの状態やプログラム特性を判断することもできるようになります。

Zabbix のような可視化の仕組みと測定対象に対する知識によって
その値の意味を読み取れるようになります。

データの意味を読み解く練習にZabbix IoTで自分の判断と実際の天候を比較してみてはいかがでしょうか。
CakePHPで最低限書いた方がいいModelTestの3点セット

# はじめに
普段、業務でCakePHPを書いていてコードレビューいただいた際に、modelのテストについて勉強になる知見をいただきました。
CakePHPでは、1テーブル1Modelを作りますが、Modelによっては何もメソッドを書かないものもあると思います。
そんなときに書いた方がいいテストについて知見をここに残します。

# 概要
CakePHPのModelでは、メソッド以外にValidationやAssociationなどのプログラムを動作させるための設定を行います。
裏を返せば、正しく設定できていない場合は思っている通りに動作してくれません。
そのため、「正しく設定されているかどうか」をテストするために以下の3つのテストを書きたいと思います。

1. Associationが正しく設定されているか
2. Behaviorが正しく読み込まれているか
3. Validationルールが正しく設定されているか

以降、３つのテストを書いていきます。

## 環境
CakePHP2.10系です。
 
# Associationが正しく設定されているか

Associationが設定されていない場合

```php
	public function testAssociation()
	{
		$actual = $this->Model->getAssociated();
		$this->assertSame($expected, []);
	}
```

Associationが設定されている場合

```php
	public function testAssociation()
	{
		$actual = $this->Model->getAssociated();
		$this->assertSame($expected, [
			'OtherModel1' => 'belongsTo',
			'OtherModel2' => 'belongsTo',
		]);
	}
```

# Behaviorが正しく読み込まれているか

``$this->Model->Behaviors->loaded()``でそのModelが読み込んでいるBehaviorの一覧を取得することができます。

```php
	public function testLoadedBehaviors()
	{
		$expected = [
			'Sample'
		];
		$actual = $this->Model->Behaviors->loaded();
		$this->assertSame($expected, $actual);
	}
```

Behavior読み込み時にoptionを指定している場合、上記のテストに追加します。
BehaviorCollectionに定義されている``$settings``にて、Behaviorに渡しているoptionにアクセスすることができます。
``$settings``が期待されたものかどうかassertします。

```php
	public function testLoadedBehaviors()
	{
		// 上記コード
		// SampleBehaviorに渡している設定が正しいか
		$expected = [
			'Model' => [
				'option1' => 'option1',
			]
		];
		$actual = $this->Model->Behaviors->Sample->settings;
		$this->assertSame($expected, $actual['Model']);
```

# Validationルールが正しく設定されているか

validationルールである``$validate``はpublicなので、 ``$this->Model->validate``でアクセスできます。

```php
public function testValidationRule()
	{
		$expected = [
			'field1' => [
				'rule1' => [
					'rule' => ['rule1']),
					'message' => 'message',
					'required' => true,
				)
			),
		);
		$actual = $this->Model->validate;
		$this->assertSame($expected, $actual);
	}
```

# 最後に

フレームワークを利用する場合は上記のような期待している設定になっているかをテストすることは、期待した動作をするかを確認する上で有効なテストになると思います。

以上
ネットワーク自動化開発実践

# はじめに
今年からシスコの同志で Advent Calendar を始めました。私自身も Qiita で情報発信するのは初めてで、とても楽しみにしています。
https://qiita.com/advent-calendar/2017/cisco

(2018/11/30更新: 2018年もやることになりました！) https://qiita.com/advent-calendar/2018/cisco
(2019/12/02更新: 2019年もやっています!) https://qiita.com/advent-calendar/2019/cisco
(2021/12/5更新: 2021年もやっています!) https://qiita.com/advent-calendar/2021/cisco2

私は会社では「自動化」に関係する仕事（広い・・・）をしています。ですが Cisco のキーワードでサイトをご覧になる方の関心は主に「ネットワークの自動化」だと思います。今回の記事をきっかけにネットワーク自動化開発に関する記事をいくつか投稿していこうと考えています。

内容は以下のように考えていますが、気が変わったら内容を変更するかもしれません。なお、内容は初級〜中級レベルを念頭においています。

- [第1回: ネットワーク自動化開発実践 準備編 - Cisco VIRL](https://qiita.com/radiantmarch/items/a3c0685d8a4c7468e878)
- [第2回: ネットワーク自動化開発実践 - Python でルータを操作する](https://qiita.com/radiantmarch/items/936b43f32210e4689179)
- [第3回: ネットワーク自動化開発実践 - Jupyter Notebook で Cool なデモをしよう](https://qiita.com/radiantmarch/items/5dfe040cf620ae49e9ad)
- [第4回: ネットワーク自動化開発実践 - デバイスのモデル化のご利益を感じよう - Cisco NSO を使う](https://qiita.com/radiantmarch/items/80fc1b363ea663e67d66)
- [第5回: ネットワーク自動化開発実践: NSO と PyATS を仲良く使う pyatstool](https://qiita.com/radiantmarch/items/eac416ae5ad735f48315)

初回投稿には容量制限があるようなのでまずは今回は目次だけにして、次の記事から本番にしたいと思います。
WEBDNNのRESNET50チュートリアルをDocker環境で試す（WebAssemblyのみ）

# TL;DR
```
git clone --depth 1 https://github.com/mil-tokyo/webdnn webdnn
cd webdnn
docker run --rm -v "$(pwd):/src" -it lilacs2039/debian_webasm_webdnn
# in container...
cd /src/example/resnet && python convert_resnet_keras.py --backend webassembly
# exit
docker run --rm -p 8080:80 -v "$(pwd):/usr/local/apache2/htdocs/" httpd
```
httpdでローカルサーバを立てたら、 http://localhost:8080/example/resnet/index.html へアクセス！


# はじめに
公式の[Resnet50チュートリアル](https://github.com/mil-tokyo/webdnn/tree/master/example/resnet)をDocker環境で実行する。

kerasでRESNET50モデルを入手して、WebAssembly形式に変換し、ローカルサーバで動作確認する。
WebAssemblyへの変換、ローカルサーバはそれぞれDockerで環境を用意。

[WebAssemblyコンパイル環境は前記事を参照](https://qiita.com/lilacs/items/90c08538283918902d69#%E5%8B%95%E4%BD%9C%E7%A2%BA%E8%AA%8Dkeras-resnet50%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB)

# 環境

- Windows 10 Pro
- Docker for Windows

# 手順
## WEBDNNをclone
- --depth 1　オプションで、最新の１コミットのみ取得

```
git clone --depth 1 https://github.com/mil-tokyo/webdnn webdnn
```

## Resnet50取得・WebAssembly変換用Dockerコンテナ起動

```
cd webdnn
docker run --rm -v "$(pwd):/src" -it lilacs2039/debian_webasm_webdnn
```

## コンテナ内でResnet50取得・WebAssembly変換
- 以下のコマンドはコンテナの中で実行のこと

```
# in container...
cd /src/example/resnet && python convert_resnet_keras.py --backend webassembly
# exit
```

## httpdでローカルサーバ起動

```
docker run --rm -p 8080:80 -v "$(pwd):/usr/local/apache2/htdocs/" httpd
```

## ResNet50モデルを実行
http://localhost:8080/example/resnet/index.html へアクセス
Backendにwebassemblyを指定、FrameworkにKerasを指定してRun

![image.png](https://qiita-image-store.s3.amazonaws.com/0/186338/b079e676-bb41-6d89-14d1-4851e15ae255.png)

↑のような画面になれば成功です。
DataGridViewとデータバインド

# データバインドとは
DataGridViewとデータを紐づけることをデータバインドという。
データバインドすることで、DataGridViewの操作に伴うデータ変更、データ変更に伴うDataGridViewの表示更新に関してのコードを実装する必要がなくなる。
つまり、DataGridViewのセルの値を変更すればデータも自動で変更される。データを変更すればDataGridViewのセル値も自動で変更されることになる。

* WinForms: データバインド
  https://ysk-hacklog.com/index.php/2024/02/20/winforms-databind/

## バインドするデータクラスの作成
DataGridViewにバインドするデータクラスを作成する。
今回は、ToDoアプリを想定し、ToDoを管理するItemクラスを作成した。

```cs:Item.cs
    public class Item
    {
        public bool Done { get; set; }

        public string Name { get; set; }

        public string Detail { get; set; }
    }
```

## ビルド
ここで一度ビルドする。
作成したItemクラスをVisualStudioに認識させる。

## BindingSourceの作成
「DataGridView - BindingSource - データ」の構成とし、BindingSourceを介してDataGridViewとデータ（Itemクラス）を紐づける。

> 1. DataGridView コントロールの右上隅のスマート タグ グリフ (スマート タグ グリフ) をクリックします。
> 2. [データ ソースの選択] オプションのドロップダウン矢印をクリックします。
> 3. プロジェクトのデータ ソースがまだない場合は、[プロジェクト データ ソースの追加] をクリックし、ウィザードに示された手順に従います。

![datasource.PNG](https://qiita-image-store.s3.amazonaws.com/0/64683/14e71a5d-078d-971b-e882-c5289c2ded50.png)

![dataobject.PNG](https://qiita-image-store.s3.amazonaws.com/0/64683/632334fc-38c1-95eb-782c-5cb29ce0f838.png)

※上図でItemクラスが表示されない場合、ビルドを忘れている。

BidingSouceを作成することで、Itemクラスのプロパティが、DataGridViewの列に追加される。（下図参照）

![datagridview2.PNG](https://qiita-image-store.s3.amazonaws.com/0/64683/6d3a0933-3f5b-93e1-b7e0-ed3ad4b6f4e7.png)

## 双方向データバインド
BidingSouceのDataSourceにItemインスタンスを設定する。
双方向データバインド（UI → データ、データ → UI）を実現するために、リストはBindingListを使う。
※ただのListだと、片方向データバインド（UI → データ）になる。

```cs:Form1.cs
    public partial class Form1 : Form
    {
        private BindingList<Item> _tasks;

        public Form1()
        {
            InitializeComponent();

            _tasks = new BindingList<Item>();

            Item taskItem = new Item() { Done = true, Name = "a", Detail = "aaaaaaaaaa" };
            _tasks.Add(taskItem);

            itemBindingSource.DataSource = _tasks;
        }
    }
```

DataGridViewで行を追加すると、自動的に_tasksが更新される。
また、コードで_tasksにItemを追加すると、自動的にDataGridViewの表示が更新される。

![datagridview3.PNG](https://qiita-image-store.s3.amazonaws.com/0/64683/1158ec16-d414-7b4d-549a-c85a440e1cf0.png)


## 参考
* 方法 : デザイナーを使用してデータを Windows フォーム DataGridView コントロールにバインドする
  https://msdn.microsoft.com/ja-jp/library/33w255ac(v=vs.110).aspx
* [Windows Form] データバインドのやり方
  http://kitunechan.hatenablog.jp/entry/2015/04/16/123314
* C# の DataGridView で カスタムデータ を 利用する 方法
  https://garafu.blogspot.jp/2016/09/cs-datagridview-customdata.html
* DataGridView BindingSource List オブジェクト バインド
  https://gist.github.com/serian/2057222
* WindowsFormsでの単項データバインドまわり
  https://tocsworld.wordpress.com/2014/04/14/windowsforms%E3%81%A7%E3%81%AE%E5%8D%98%E9%A0%85%E3%83%87%E3%83%BC%E3%82%BF%E3%83%90%E3%82%A4%E3%83%B3%E3%83%89%E3%81%BE%E3%82%8F%E3%82%8A/
MacBookAirのバッテリーがヘタってきたので代わりにElementaryOSを試す

こんにちは[Nifty Advent Calendar 2017](https://qiita.com/advent-calendar/2017/nifty) 10日目の記事です。

9日目の@motaHackさんに続き、10日目担当の@kazuyaseoです。
よろしくお願いします。

---

自分のMacBookAir、あまりに気に入っているため5年使ってます。
ただ、最近バッテリーがヘタってしまい、今では残バッテリーが80%を切ると謎のシャットダウンをしてしまうようになった。
かなり気に入っているので、買い替えではなくバッテリー交換をしようと思っているのですが、
バッテリー交換に出すと、1週間〜10日かかるというので、
その間は安いノートPCを買って軽いOSを入れて年末を乗り切ろうと思いました。

軽いOSはいくつか考えて、elementaryOSかChromiumOSかで最終的に悩みましたが、
過去にダウロードしたイメージファイルが手元にあったので今回はelementaryOSをチョイスしました。

※余談ですが、MacBookAirのバッテリー交換はAppleStoreに直接持っていくと12,800円ですが、代理店を通すと22,400円になります。

## ElementaryOSって？

<img src="https://qiita-image-store.s3.amazonaws.com/0/69338/10c00bb8-fea8-7458-152e-73f6abc94839.png"  width=50%>

ElementaryOSはUbuntusベースのLinuxディストリビューションで、Macっぽいシンプルかつ結構おしゃれなデザインのGUIを持ったOS。
Ubuntuベースなのでaptも使えるし、あんまり使わないけど動画再生とかも出来るらしい。
日本語にも対応している所が嬉しい。

自分の短期間の開発環境要件は Vimが使えて、Dockerが使えて、Webが見れて、軽くOfficeが使えれば日頃の開発は出来るので、十分だろうと思う。
なんとも安上がりな要件ですね。

## VirtualBoxでインストールしてみる

早速ですが、MacBookAirをバッテリー修理の旅に出す前に、手元のVirtualBoxでElementaryOSをインストールする。

 手順は以下の通り

1. isoイメージファイルを[ElementaryOS](https://elementary.io/ja/)のサイトからダウンロード (価格は今回は検証なので0$で購入。)
   + 軽量OSと言ってもisoイメージは1.3Gbyteあるので注意。
1. 仮想マシンの作成
   + VirtualBoxで仮想マシンを作ります。VirtualBoxを起動して、「新規」ボタンをクリック。名前とOSのタイプを以下の様に設定。
<img src="https://qiita-image-store.s3.amazonaws.com/0/69338/63b40a1b-322e-d3b7-df7e-d31028b8894a.png" width=80%>
   + 次にストレージの設定。ElementaryOSのインストールには最低8.7Gbyteの容量が必要なので、ディスクイメージは10Gは入れておきたい
<img src="https://qiita-image-store.s3.amazonaws.com/0/69338/d5f1b125-b18a-32f1-df18-b4681e7432b3.png" width=80%>
1. ElementaryOSのインストール
   + 作成したイメージを実行すると、以下の様なisoファイル選択画面が表示されるので、先程ダウンロードしたisoファイルを選択
<img src="https://qiita-image-store.s3.amazonaws.com/0/69338/6b8f079d-57f6-d355-83a6-1b8f4f83c7c9.png" width=80%>
  + 言語は「日本語」を選択してインストールボタンを押す
<img src="https://qiita-image-store.s3.amazonaws.com/0/69338/5a699ce2-b26f-b7a5-6179-4dc64b50c4f7.png" width=80%>
  + インストールオプションを選択
<img src="https://qiita-image-store.s3.amazonaws.com/0/69338/e7e7c04d-b034-0cd9-ba11-6544fe09a26f.png" width=80%>
  + ディスクは削除でOK
<img src="https://qiita-image-store.s3.amazonaws.com/0/69338/38af8a94-bdf2-ad3f-cd0a-e8429c52ca0e.png" width=80%>
  + キーボードは日本語キーボードにしました。
  + アカウントの設定をして完了
<img src="https://qiita-image-store.s3.amazonaws.com/0/69338/902f97ad-c13f-301e-32fe-73d971698fbe.png" width=80%>


これでインストール完了！！！
<img src="https://qiita-image-store.s3.amazonaws.com/0/69338/dca93703-afd4-3017-f66d-a45740613f29.png" width=80%>


## 開発環境構築

起動が出来たら、要件を満たしているか確認。
Macっぽいデザインと言うだけあってMacっぽい。

 * ターミナル開けばvimもsshもDockerも快適に動作。
<img src="https://qiita-image-store.s3.amazonaws.com/0/69338/2aa9060a-3dbf-7477-13cb-82db0d40bde5.png" width=80%>

 * Officeが動かせるかどうか見てみたく、LibreOfficeをインストール

ターミナルを起動して以下を実行するだけ。

```
sudo apt update
sudo apt install libreoffice
```

見事起動しました！！！

<img src="https://qiita-image-store.s3.amazonaws.com/0/69338/769a6a7a-93b8-29da-0fe0-d8f91b00c8cc.png" width=80%>



 
elementaryOSはUbuntuベースなので、ほぼUbuntuと同じ手順で構築できるのが良い。

普段使いのOSとしてどうかはもう少し検証が必要ですが、
WindowsかMacかChromeOSやUbuntuの様な有名なOSだけではなく、サブマシンにこう言ったOSを入れて遊んでみては如何でしょうか。

明日の記事は@14kwさんです、お願いします！！！！
ビットコイン&モナコイン決済をしてみようと思ったけど、いろいろ間に合わなかった話

-----------------

完成しました！！

次の記事になります！

https://qiita.com/wamisnet/items/de54418d37a6e702c8ad

-----------------


こんにちわor初めましてわみです。

IoTLTアドベントカレンダー9日目です！昨日の記事はよかったですね、Measurement ProtocolをNefryでも扱えそうなので今後触ってみようと思っています！

いつもはNefryなどのハードウエアの作成が主の私ですが、最近波に乗っているビットコインに手を出してみました！
タイトルの通りいろいろと間に合いませんでしたが、途中報告として今後追記してちゃんと完成させようと思うのでいいねやストックなりで気にしていただけると幸いです。

# なんで仮想通貨決済なの？

今私が住んでいるシェアハウスのギークハウス新宿では共有の冷蔵庫に1本100円で飲めるコーラやドクペが冷蔵庫に入っています。

![IMG_20171106_003911.jpg](https://qiita-image-store.s3.amazonaws.com/0/97208/f8d40433-30b4-4563-4a72-08986380af7b.jpeg)


お金を払わなくても飲めてしまったり、現金がポンと入っていてセキュリティの概念すらないこの前時代的＆性善説でなりたっている感じなので、これを改善したい！

![IMAG0064.jpg](https://qiita-image-store.s3.amazonaws.com/0/97208/7db45311-6039-0b2c-32a0-9c954a276bf1.jpeg)

ドリンク以外にもシェアするんですけどたまご20円とか牛乳一杯30円となっていて、小銭入れに大量の10円が入っているのは大変めんどくさい…
少額決済に仮想通貨決済がいいなと！めんどうなことは電子化しよう！

仮想通貨決済なのは時代の流れですね、あんまり現金が飛び交うのはスマートじゃないですし！(LinePayとかでもいいんですけど、QRコード決済を個人でできれば…)
個人的には日本発の仮想通貨であるモナコインを広めていきたいなと思ってますｗ


# 構成イメージ

決済周り　[Zaif Payment](https://zaif.jp/payment) 
購入確認　[Nefry BT](https://dotstud.io/shop/nefry-bt-single/)

# Zaif Payment

![2017-12-09_13h49_39.png](https://qiita-image-store.s3.amazonaws.com/0/97208/9176d0f4-55dc-9135-bf87-a67c615f56b2.png)


取引所のZaifがやっている仮想通貨決済サービス

Bitcoinと**モナコイン**に対応しているので今回のやつにピッタリなものです。他の取引所でも類似サービスはありますが、個人でも大丈夫でモナコインに対応しているのはさっと探したときにここだけでした。

APIも出てるから、それを叩けば送金アドレスとかQRコードとかの情報をうまく表示させるだけで決済システムがつくれそう！
あと日本円で受け取れるのはメリット！（値動き激しいから
(一応ビットコインやモナコインでも受け取れるっぽい)
# Nefry BT

![](http://nefry.studio/img/top-hero_nefry.png)

フリスクサイズのIoTデバイス。簡単にネットにつながる。

あとは[Nefryアドベントカレンダー](https://qiita.com/advent-calendar/2017/nefry)をみてください。

NFCなどでタッチしたら決済画面が出るような仕組みをつくるつもり…

# 処理の流れ

1. 冷蔵庫の近くにNFCリーダのついたNefryBTを配置して、スキャンさせる
2. スキャンされたデータをトリガーにタブレットに事前に作成＆インストールしたZaif Paymentに繋がったアプリを起動させ決済用のQRコードを表示させる
3. ほしい人がQRコードをスキャンして購入できるようになる！

みたいな手順を思い描いていました。

# 重大な問題が！

Zaifのアカウントを12/1に取って、決済をするために本人確認が必要なので必要な写真を送ったのですがなんと12/9現在まだ届いていません！！！！

本人確認が終わらないとAPI周りの確認ができないため、想定のフローで作成を始めてましたけど、本格的にやるのは本人確認が終わって決済システムが扱えるようになってからと思っていたらアドベントカレンダ当日になってましたｗ

ホントに間に合わなくて申し訳ないです…

はやくZaifの中の方に本人確認を終えてもらいたい…(´・ω・｀)

# APIを叩いてみた！

# NodeRedでフローを作ってみた


# まとめ

なにも形にならないままアドベントカレンダを書きまして申し訳ないです…

日々の生活に仮想通貨の概念が出たらそれはそれで面白いと思ったので今回のものを作ろうかと思いました。
本人確認が終わり次第また追記していくのでぜひよろしくお願いいたします。

IoTLTにほとんど関係のないような形になってしまいましたが、ご容赦を…
名古屋に来られたときはIoTLT名古屋の参加をぜひぜひ！（一応名古屋の主催なので宣伝をｗ

明日は[@yukkin4649](https://qiita.com/yukkin4649)イベントで使ったanyPiのちょっとした紹介です！お楽しみに！


#追記

12/12　本人確認が終わったので郵便を送りましたと通知がきた！
12/16　郵便が届きました！＆APIの動作を確認できました！
Java 9でGradleのエラー「Could not determine java version from '9.0.1'.」が出るときの対処方法

# はじめに
Spring BootでGradleプロジェクトを触っていた時に「Could not determine java version from '9.0.1'.」というエラーに遭遇したので、その対処方法を書いておきます。
なお、エラーが発生した環境は下記の通りです。

- macOS High Sierra(10.13.2)
- Java Development Kit 9(9.0.1)
- IntelliJ IDEA 2017.3(Ultimate Edition)
- Spring Boot 2.0.0M7(Spring Initializr)
- Gradle 4.2

# 障害の状況
IntelliJ IDEAにてSpring Initializrのテンプレートを利用して新規にプロジェクトを作成しました。
その際、Project SDKにはJava 9を、TypeにGradle Projectを選択しウィザードを進めていったのですが、作成されたプロジェクトでは「Could not determine java version from '9.0.1'.」のメッセージが表示されていました。

# 原因
これはビルドに用いるGradle 4.2がJava 9をサポートしていないことに起因しています。Java 8からJava 9に変わった際、バージョン番号の表記方法が「1.8.x」から「9.x.x」に変わったのですが、Gradle 4.2までは古い表記方法で解釈するように作られており、実行環境のJavaのバージョンを正確に特定できないがためにこのようなエラーが発生していたのです。
今回は、IntelliJ IDEA上で障害が発生しましたが、同様の現象はJavaのバージョン9以降とGradleのバージョン4.2以前の組み合わせであれば、上記以外の環境でも発生します。

# 対処方法
実はこの障害はGradle 4.2.1にてすでに修正されており、Gradleのバージョンを4.2.1以降にバージョンアップすれば解消できます。
ローカル・インストールしたGradleを利用している場合は、バージョン4.2.1以降のGradleにバージョンアップすれば解消しますし、Gradle Wrapperを利用している場合は、gradle-wrapper.propertiesのdistributionUrlでバージョン4.2.1以降のGradleを指定すれば解消します。
今回はGradle Wrapperを利用していたので、下記のように設定を変更しました。

```properties:gradle-wrapper.properties
#Fri Jul 28 13:37:07 BST 2017
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.2.1-bin.zip
```

# まとめ
エラー・メッセージを元にネットで検索すると、Java 8を使うように促す回答がいくつか見つかります。でも、せっかくJava 9を使おうとしているのにJava 8に戻るのは少しもったいないですよね。Java 9を使うような新し物好きの方は、ぜひGradleも最新にアップデートしてみてください。
Windows10からのRDP接続（ubuntu16.04 LTS）

# はじめに

Windows10からubuntuへのRDP環境くらい、簡単に作れるだろうって思ってました。
思っていましたが、見事にハマりました。

メモらねば。。。
# 前提条件

ubuntu 16.04 Server にデスクトップ環境をインストールするところから開始。
ubuntu 16.10以降は簡単になっているようですが、

**ワタクシはLTSが使いたいのです！**

# 手順

## desktop環境をインストール

CLIでubuntu desktop環境をインストールします。
X Window Systemだけだといろいろ足りていない様子で、
途中で積みます。

最初のお約束。

```
sudo apt-get update
```
```
sudo apt-get upgrade
```

desktop環境をインストール

```
sudo apt-get -y install ubuntu-desktop
```

7分程度かかるインストールが完了したのち、再起動

```
sudo reboot
```

コンソールにGUIが表示されればOK
<img width="550" alt="desktop.png" src="https://qiita-image-store.s3.amazonaws.com/0/211189/ed3163d4-fb20-bcc5-ded8-50744beaafdf.png">

## XRDPのmake

apt-get使って最新のxrdpをインストールしたいところですが、
16.04の場合は古いバージョン（v0.61）がインストールされます。

**ワタクシはLTSが使いたいのです！**

日本 xrdp ユーザ会様 (https://xrdp.vmeta.jp/X11RDP-o-Matic)
の手順が有名ですが、うまくいきませんでした。
仕方がないので、手動で最新のxrdpをインストールします。

まずは下準備。
SSHで接続しなおしてから、CLIで張り付けることを推奨。

```
sudo apt-get install build-essential devscripts git autoconf libtool pkg-config gcc g++ make libssl-dev libpam0g-dev libjpeg-dev libx11-dev libxfixes-dev libxrandr-dev flex bison libxml2-dev intltool xsltproc xutils-dev python-libxml2 g++ xutils libfuse-dev libmp3lame-dev nasm libpixman-1-dev xserver-xorg-dev
```

最新版のxrdpバージョンを確認。

https://launchpad.net/ubuntu/+source/xrdp

目的のソースをダウンロード。
2017年12月9日現在、0.9.4が最新でした。
対象ファイル2つをダウンロード。

```
wget https://launchpad.net/ubuntu/+archive/primary/+files/xrdp_0.9.4.orig.tar.gz
wget https://launchpad.net/ubuntu/+archive/primary/+files/xrdp_0.9.4.orig-xorgxrdp.tar.gz
```

解凍

```
tar -zxvf xrdp_0.9.4.orig.tar.gz
tar -zxvf xrdp_0.9.4.orig-xorgxrdp.tar.gz
```

インストール

```
cd ~
cd xrdp-0.9.4
./bootstrap
./configure --enable-fuse
make
sudo make install
sudo ln -s /usr/local/sbin/xrdp{,-sesman} /usr/sbin
cd ~
cd xorgxrdp-0.2.4
./bootstrap
./configure
make
sudo make install
```

## ディスクトップ環境設定

描画にどのディスクトップを利用するかの設定。
今回はxfceにチャレンジ。

```
cd ~
sudo apt-get install xfce4 xfce4-goodies
```
.xsessionの設定

```
echo xfce4-session > ~/.xsession
```
/etc/xrdp/startwm.sh の編集

- 参考記事：xrdpでproblem connecting
（https://qiita.com/nobif/items/2a19dc2b6e5757a09333 ）

```
sudo vi /etc/xrdp/startwm.sh
```

変更内容

```
  # suse
  if [ -r /etc/X11/xdm/Xsession ]; then
    # since the following script run a user login shell,
    # do not execute the pseudo login shell scripts
    # . /etc/X11/xdm/Xsession　<-コメントアウト
      xfce4-session <-追加
    exit 0
  fi

```

xrdp 再起動

```
service xrdp restart
```

これでRDP出来るはず。

![RDP.png](https://qiita-image-store.s3.amazonaws.com/0/211189/b094cc43-ff89-4618-bb28-4cdadd391601.png)


お疲れさまでした！

# 総括

次のLTSからはxrdpのバージョンが上がるので、
ここまで苦労しなくて良くなるハズです。
未来に期待！
WPF/C# でバーコードを含むレシートを印刷する

WPF/C# でバーコードを含むレシートをさくっとデザインして印刷する方法です。

# 事前準備
予め ITF.otf をインストールしておきます。

# レシートのデザイン
レシートの見た目を XAML でデザインしていきます。バーコードにする数列を「(」と「)」で囲むのをお忘れなく。

```xaml:Ticket.xaml
<UserControl x:Class="receipts.Ticket"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:receipts"
             mc:Ignorable="d" 
             d:DesignHeight="140" d:DesignWidth="240">
	<FixedPage Name="fixedPage">
		<StackPanel Width="240">
			<TextBlock FontSize="8" HorizontalAlignment="Right" Margin="0,8,64,0">2017/12/09</TextBlock>
			<TextBlock FontSize="20" HorizontalAlignment="Center" Margin="4">整 理 券</TextBlock>
			<TextBlock FontFamily="ITF" FontSize="45" HorizontalAlignment="Center">(1234567890)</TextBlock>
			<TextBlock FontFamily="Consolas" FontSize="16" HorizontalAlignment="Center">1234567890</TextBlock>
		</StackPanel>
	</FixedPage>
</UserControl>
```

![20171209_221023.png](https://qiita-image-store.s3.amazonaws.com/0/14838/4b07352d-6b99-6e7c-1499-deafae2e63f6.png)

# プリンタの指定
Print メソッドが呼ばれたら指定したプリンタで印刷するようにします。

``` C#:Ticket.xaml.cs
using System.Printing;
using System.Windows.Controls;

namespace receipts
{
	/// <summary>
	/// Ticket.xaml の相互作用ロジック
	/// </summary>
	public partial class Ticket : UserControl
	{
		public Ticket()
		{
			InitializeComponent();
		}

		public void Print()
		{
			var printerName = "Microsoft XPS Document Writer";

			new PrintDialog
			{
				PrintQueue = new PrintQueue(new PrintServer(), printerName),
			}.PrintVisual(fixedPage, "ticket");
		}
	}
}
```

ここでは「Microsoft XPS Document Writer」を指定しているので、印刷時には保存するファイル名を尋ねられます。ファイル名を指定して .oxps ファイルとして保存してください。

# レシートの印刷

Print メソッドは MainWindow のボタンが押されたら呼び出すようにしてみました。

```C#:MainWindow.xaml.cs
using System.Windows;

namespace receipts
{
	/// <summary>
	/// MainWindow.xaml の相互作用ロジック
	/// </summary>
	public partial class MainWindow : Window
	{
		public MainWindow()
		{
			InitializeComponent();

			btnPrint.Click += (s, e) => new Ticket().Print();
		}
	}
}
```


そうすると、下記のようなファイルが保存されます。

![20171209_220414.png](https://qiita-image-store.s3.amazonaws.com/0/14838/c1874d68-4b1e-429c-1a1b-5076ba42b6ed.png)

もちろん、実際のプリンタを指定すればファイルが作成されるのではなくプリンタから印字されます。
この方法だと XAML で見た目をデザインできるから楽ちんです。
Word2vecでコーパスを変えたときの出力比較（位置情報関連）

自然言語処理 Advent Calendar 2017の記事です。
Word2vecは目的に合わせたコーパス選びが重要だと思います。この記事ではコーパスを変えたときに出力がどう変わるかという一例を紹介します。私がTwitterの位置情報関連の研究しているので、施設名を入力にしたときの出力の違いを見てみます。

# Word2vec
今回は、 Word2vecの産みの親Mikolovさんが作ったツールで学習させます。論文公開当初はGoogle Codeにありましたが、Google Codeのサービス終了に伴い、今はGithubにコードがあります。
https://github.com/svn2github/word2vec

Mecabなどで日本語を分かち書きしたテキストファイルを用意して、以下のコマンドで学習します。
`./word2vec -train 分かち書きしたテキストファイル名 -output Word2vecのモデルファイル名`
例えば、日本語のWikipedia全記事を分かち書きしたテキストをjawiki_wakati.txtというファイル名で保存した場合はこんな感じ。
`./word2vec -train jawiki_wakati.txt -output jawiki_vec.txt`

今回はデフォルトパラメータで学習しました。Mecabの辞書にはneologdを使いました。

以下のコマンドでcos類似度が高い単語を抽出できます。
`./distance モデルファイル名`

# 日本語Wikipediaで学習した結果
実際の例を見てみます。
「ディズニーランド」の場合
<img width="452" alt="スクリーンショット 2017-12-09 21.59.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/37387/9e815634-940b-f4b3-1bf5-c437c1455ed5.png">
ディズニーランドと関連する施設やアトラクションの名前が上位にきてます。

「横浜アリーナ」の場合
<img width="452" alt="スクリーンショット 2017-12-09 22.00.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/37387/dc8ec105-f20e-c14d-1dd3-a0db06580f32.png">
こちらは日本武道館や大阪城ホールなど、横浜アリーナと同じように大型ライブをする施設が上位にきているように思います。

# ジオタグ付きツイートで学習した結果
今回は2015年7月〜12月の日本語のジオタグ付きツイートで学習しました。
同じ施設に関してTwitterで位置情報が付けられているジオタグ付きツイートで学習した場合を見てみます。

「ディズニーランド」の場合
<img width="453" alt="スクリーンショット 2017-12-09 22.00.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/37387/ca374bfe-b6ca-9a25-7c4b-9ee72dea2ab8.png">
「夢の国」「TDL」など言い換えや略語、「制服ディズニー」「ハピネスイズヒア」「ペアルック」などその場所で何をしているかに関係する単語が多く見られます。

「横浜アリーナ」の場合
<img width="444" alt="スクリーンショット 2017-12-09 22.01.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/37387/e40fd3e3-cd05-a747-9f6d-a6ff578bc3e3.png">
この場合はWikipediaと同様に他の施設名が多くあがっています。3番目に「横アリ」という略語が出ていて、その点ではディズニーランドと同じような感じです。

「横アリ」の場合
<img width="458" alt="スクリーンショット 2017-12-09 22.01.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/37387/b5693554-f7c1-28fa-0fc4-ada7598e2bc6.png">
この場合は「ライブビューイング」「カウントダウンライブ」など、ディズニーランドの場合と同じくその場所で何をしているかに関係する単語が多く見られます。

ちなみにWikipediaコーパスでの「横アリ」の場合
<img width="296" alt="スクリーンショット 2017-12-09 22.01.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/37387/3db4c195-cd62-2dd4-8f49-a15a79897f08.png">
WikipediaではOut of dictionaryになってしまいました。

# まとめ
Word2vecで、コーパスによって出力が大きく変わることを実例で確認しました。目的に合わせたコーパス選び大事！