OmniAICreator/Qiita-1.07M huggingface dataset:
【FileMaker】タイマーを仕掛ける　その2


FileMaker Advent Calendar 2015、11日目です。
さて、タイマー仕掛け、その２です。

タイマーの仕掛けはゲームや試験実行時の入力などで使用できますが、例えば座席を決めるのに制限時間を設ける、というのはどうでしょうか？
あーでもないこーでもないと言いながら座席を決めるのも楽しいですが、オンライン処理ではそんなに長く待てないものです。

こんな仕掛けを考えてみました。
![スクリーンショット 2015-12-06 15.21.30.png](https://qiita-image-store.s3.amazonaws.com/0/60538/33a82c08-6cc7-ef88-afc8-fab97baf8e76.png)
「座席決定」ボタンを押すと、カンファレンスの執筆者席を30秒以内に入力しないとメッセージがでる、という感じです。

もたもたしていると、、、
![スクリーンショット 2015-12-06 15.22.07.png](https://qiita-image-store.s3.amazonaws.com/0/60538/999445f4-3260-c5e2-32f1-bc22d8950708.png)
メッセージが出てきます。

そして入力内容がメインの画面に反映されます。
![スクリーンショット 2015-12-06 15.22.15.png](https://qiita-image-store.s3.amazonaws.com/0/60538/6bc385b2-dc3e-528c-cd0c-09ec3cefbc1a.png)

スクリプトは、ウィンドウを表示させてタイマーかけているだけなので数行です。
![スクリーンショット 2015-12-06 15.28.43.png](https://qiita-image-store.s3.amazonaws.com/0/60538/d5442bd1-5dba-1c76-fe78-3bf3810b6f27.png)

チケット取得とか複数人で運用する場合に応用できますね^^
ぜひ、タイマー仕掛けをいろいろ考えてみてください〜。
SECCON 2015 Online予選 Connect the serverの再調査

当日はブラウザにURLを貼り、落ちてきたファイルからflagをコピペし整えるだけで終了してしまったので、後日再調査しました。

まずは公式が公開していた[サーバプログラムのソース](https://github.com/SECCON/SECCON2015_online_CTF/blob/master/Web_Network/100_Connect%20the%20server/build/mylogin.c)を見てみます。


```c:mylogin.c
int main()
{
	int ch;
	FILE *fpw = stdout;

	sleep(1);

	printf("CONNECT");
#if BPS > 0
	printf(" %u", BPS);
#endif
	printf("\r\n");
	fflush(stdout);

	sleep(1);

	show(fpw, "\n");
	show(fpw, "Welcome to SECCON server.\n");
	show(fpw, "\n");
	show(fpw, "The server is connected via slow dial-up connection.\n");
	show(fpw, "Please be patient, and do not brute-force.\n");
	flag(fpw);
```
ここは通信相手に文字を送信する部分、show()関数を使って文字を送信していて、最後のflags()がflag送信部分になっています。ということでflags()の中身を見てみます。

```c:mylogin.c
void flag(FILE *fpw)
{
	const char *the_flag = "SECCON{Sometimes_what_you_see_is_NOT_what_you_get}";
	const char *p;

	for (p = the_flag; *p; p++) {
		fputc(*p, fpw);
		fputc('\b', fpw);
		fputc(' ', fpw);
		fputc('\b', fpw);
	}
}
```
fputcを使って一文字づつflagを吐き出しています。それだけではなく、flag一文字ごとに何らかの制御文字とスペースを書き込んでいます。\bってなんだったっけ…調べたらカーソルを左に動かすだそうな。
フラグを書き込む→カーソルを左にずらす→空白で上書きする→カーソルを左にずらすを繰り返すことによって、一文字書き込んで一文字消す処理を行っていたわけですね。
ファイル内の謎のスペース部分はこの制御文字で、一文字づつの処理はこの処理のヒントだったということでした。

wiresharkなどでパケットをキャプチャし、観察することによってflagを見つけ出すというのがこの問題の正規解なのでしょう。

![VirtualBox_Kali_11_12_2015_00_23_46.png](https://qiita-image-store.s3.amazonaws.com/0/104398/5189df56-b872-832b-e688-e4dba397ddc0.png)
(契約まだの人向け)クーポン取得方法

本記事はIDCF Cloud Advent Calendar 2015の11日目の記事です。

* 2015/12/2 IDCFクラウドの契約しました。

# IDCFクラウドの特徴

* 豊富な特典
    * Tポイント300pt+1200pt
    * 無料クーポン540円+3000円

----

# Tポイント

* Yahooのアカウントが事前に必要。

## 300pt

* 新規アカウント作成で300pt
    * 電話 or SMS認証がある。
    * クレジットカード登録(もしくは銀行振込)が必要

![tpoint.png](https://qiita-image-store.s3.amazonaws.com/0/25728/7683db08-0f44-4d45-a452-177c70fd85ad.png)

## 1200pt

* 仮想マシン作成で1200pt

![vm.png](https://qiita-image-store.s3.amazonaws.com/0/25728/34b289fd-b4e5-2181-1ed5-d1f15ff0c0c5.png)

# 無料クーポン

## 540円分クーポン

![クーポン.png](https://qiita-image-store.s3.amazonaws.com/0/25728/37b85c98-51a6-1a67-12fc-2835158b080c.png)

## 3000円分 クーポン

* LINE友だち登録。QRコード確認方法
    * http://www.idcf.jp/cloud/ 一番下にLINEのアイコンがあるのでクリック
    * LINE友だち登録すると3000円分の無料クーポンが付与される

![line.png](https://qiita-image-store.s3.amazonaws.com/0/25728/a20768d9-debd-dbc1-d222-a04076051585.png)

## クーポン登録状況確認

* 500円(税抜き)クーポンを登録した後3000円クーポンを続けて登録したところ登録エラー(detect::csrf)になった。
   * 一度リロードすればよい。

![クーポン確認.png](https://qiita-image-store.s3.amazonaws.com/0/25728/a8c08385-2c7f-097b-0b34-c8ac03d53309.png)

----

# おわりに

IDCFクラウドは使いやすくて良いですね。

* クーポンは有効期限があるので惜しみなく使いましょう。
* リージョンが国内
* コントロールパネルがわかりやすく、すぐに理解できた。グローバルIPが目立つ位置に表示されて良い
* サポート窓口の対応が良かった。（そして日本語で応対してくれる）
tigを使って簡単にfixupやsquashコミットを作る

少しずつ市民権を得てきた感のある interactive git rebase 時の autosquash オプションですが、いくら git commit で --fixup や --squash で自動生成できると言っても、そもそも対象となるコミットを選択するのがめんどくさいという問題があると思います。

- 参考: [git rebase -i のための rebase.autosquash オプション](http://qiita.com/kyanro@github/items/818012c1b1827ed48277)

最近だと [peco](https://github.com/peco/peco) を使ってコミットを絞り込むなどの方法があるかも知れませんが、すでに [tig](https://github.com/jonas/tig) を使っているならtigを使うのが楽です。

```text:~/.gitconfig
[tig "bind"]
diff = F ?!git commit --fixup %(commit)
diff = S ?!git commit --squash %(commit)
main = F ?!git commit --fixup %(commit)
main = S ?!git commit --squash %(commit)
```

git config にこんな感じで tig のキーバインディングを追加します。これがあると、 main-view と diff-view で shift+s で現在選択されているコミットに対して --squash が実行されます。 shift+f なら --fixup です。

ちなみに `?!git` の `!` は外部コマンドを実行するという意味です。 `?` があるとそのコマンドを実行する前に本当にそれを実行するのか聞いてくれるようになります。今回のように何かしらを変更するコマンドを実行する場合は付けておくといいと思います。

## その他のキーバインディング

せっかくなので設定している他のキーバインディングも紹介します

### blob/commit/tree を github で開く

```text:~/.gitconfig
[tig "bind"]
blob = B @hub browse -- tree/%(commit)/%(file)
diff = B @hub browse -- commit/%(commit)
tree = B @hub browse -- tree/%(commit)/%(directory)
```

これを設定した状態で blob/diff/tree-view で shift+b を押すと、ブラウザが起動して github 上で対応するページが表示されます。使用するには [hub](https://github.com/github/hub) が必要です。

`@hub` の `@` があるとコンソール出力が表示されなくなります。

### 上下に素早く移動する

```text:~.gitconfig
[tig "bind"]
diff = <Ctrl-n> :/^@@
diff = <Ctrl-p> :?^@@
log = <Ctrl-n> :/^commit
log = <Ctrl-p> :?^commit
stage = <Ctrl-n> :/^@@
stage = <Ctrl-p> :?^@@
```

diff/log/stage-veiew で ctrl-n ctrl-p を押した時に、ファイル単位もしくはコミット単位で上下移動してくれるようになります。jkで行単位の上下移動ができるので、これと組み合わせると好きな場所に移動するのが結構楽になります。
Google Tag Manager for Android

# はじめに

たまたま業務でGTMを触っていたのと枠が空いていたので参加させてもらいました。

Google Analytics Advent Calendar 2015 の11日目です。

# Google Tag Manager で何ができるか

1. 簡易データ配信
  - 色の値や文言等の（カジュアルに変更したい）テキストデータを外部制御できる
     - A/Bテスト
     - APIでも制御できるけど、永続化やオフライン対応まで考えると面倒だなーという値（に使うといいかも）
2. Google Analytics (Universal Analytics) へのプロキシ（のような動作）
  - TrackingIdを外部（GTMのWebコンソール）から切り替えたり、複数設定できたり（このイベントはTrackingId_Aへ、みたいな）

※ 1.に関しては使ったことありません

いずれも、コンテナと呼ばれるバイナリファイルを各端末と同期することにより実現されています。

1. GTMのWebコンソールから最新のコンテナ（設定ファイルみたいなもの）を公開
- 各アプリが最新のコンテナを取得
  - ネットワーク環境ない状態で初回起動したらapk内に配置されているデフォルトのコンテナが使用される（リモート、ローカルどっちを優先するかとかは設定可能）
- コンテナ内の値を使ったりして好きなことをやる

# 何が嬉しいか

- コンテナの同期をGTMに任せられるのでオフライン時のことを（あまり）考えなくていい
- 些細な送信パラメータ修正での再リリースが不要になる
 - JS版はそうかもしれない（使ったことない）
 - Android版はそうでもない気がした（実際に使ってみて）

# 導入

https://developers.google.com/tag-manager/android/v4/
↑に従ってやれば大体OK

- Google Play Service SDKを使えとしか書いてないけど依存するのは以下

```groovy
compile 'com.google.android.gms:play-services-analytics:[version]'
```

# Google Analyticsの計測処理をGTMで行う

初期化処理についてはドキュメントに詳しく書かれている為割愛

## スクリーンの送信

- Google Analytics SDK v4

```java
void sendScreen(String screenName) {
  Tracker tracker = /* trackerの取得 */;
  tracker.setScreenName(screenName);
  tracker.send(new HitBuilders.AppViewBuilder().build());
}
```

- Google Tag Manager SDK v4

```java
void sendScreen(Context context, String screenName) {
  TagManager tagManager = TagManager.getInstance(context);
  DataLayer dataLayer = tagManager.getDataLayer();
  // "openScreen", "screenName" はGTMのWebコンソールで
  // 設定するパラメータと合っていればOKで別に何でもいい
  dataLayer.pushEvent("openScreen", DataLayer.mapOf("screenName", screenName));
```

以下をGTMのWebコンソールから設定

### 変数の設定

| 項目 | 設定値 |
|:-----------|:-----------|
| 変数のタイプ | データレイヤーの変数 |
| デフォルト値 | 偽 |
| データレイヤーの変数名 | screenName |

### トリガーの設定

| 項目 | 設定値 |
|:-----------|:-----------|
| トリガーのタイプ | カスタム |
| フィルタ | Event 等しい openScreen |

### タグの設定

| 項目 | 設定値 |
|:-----------|:-----------|
| タグタイプ | ユニバーサル アナリティクス |
| トリガー | [↑で設定したトリガー] |
| 設定するフィールド1 フィールド名 | screenName |
| 設定するフィールド1 値 | [↑で設定した変数] |
| トラッキングタイプ | アプリビュー |
| トラッキングID | [自分のトラッキングID] |

# ハマリどころ

- コンテナのバージョンアップのタイミングが12時間おき
  - 公開後すぐに動作確認したい場合は一度アプリのデータ消さないとダメ
  - プレビュー（公開前に動作確認できる機能です）では動作してて公開後動作しないとか言われたら多分このパターン


# AndroidにおけるGTM,GAの理想的な運用
1. 計測する可能性のあるポイントで（もれなく）DataLayerにpushしておく
2. 送信パラメータをマーケティング側と共有する
3. 担当者がWebコンソールから必要なやつだけフィルタするなりなんなりして計測する

のが計測処理追加（とか削除）のためだけの再ビルドが発生しないので良い気がします。

※ もっといい方法があったら教えて欲しいです

# 現実
1. Webコンソールの設定が非エンジニアには難しいかもしれない
2. 想定していなかったイベントを取得したいと言い出される（＝結局修正・リリース必要）

とかで結局開発者が原因の調査や修正しないといけなくなったり。

# 個人的な感想

- コンテナの恩恵を最大限受けたいなら導入した方が良い
- Google Analyticsの計測しかやってないならわざわざ移行する必要ない
Angular 1.x のmodule まわりの構文をまとめてみた

[AngularJS Advent Calendar 2015](http://qiita.com/advent-calendar/2015/angularjs) 11日目の投稿です。

AngularJS 機能の数は多いし、なによりそれぞれの構文が違うのが結構しんどかったりしますね。
そんな `angular.module` まわりの構文を改めて書き連ねてみようかと思います。

### .module()

```
// AngularJS モジュールを作成
angular.module('myApp', [])
```

```
// 作成したモジュールの取得 
angular.module('myApp')
```

### .config()

```
// minify しない or ngMin 使用
.config(function(xxxProvider){
    ...
});
```

```
// minify 対策
.config(['xxxProvider', function(xxxProvider){
    ...
]});
```

### .run()

```
// minify しない or ngMin 使用
.run(function(DI){
    ...
});
```

```
// minify 対策
.run(['DI', function(DI){
    ...
}]);
```

### .value()

```
// key, value (値はfunctionでもOK)
.value('key', value);
```

```
// { key, value, key2, value2 } (値はfunctionでもOK)
.value({'key': value, 'key': value2})
```

### .constant()

```
// key, value (値はfunctionでもOK)
.constant('key', value);
```

```
// { key, value, key2, value2 } (値はfunctionでもOK)
.constant({'key': value, 'key': value2});
```

### .provider()

```
// minify しない or ngMin 使用
.provider('MyProvider', function(DI1){
  this.xxx = yyy;
  this.$get = ['DI2', function(DI2)];
    ...
});
```

```
// minify 対策
// minify しない or ngMin 使用
.provider('MyProvider', ['DI1', function(DI1){
  this.xxx = yyy;
  this.$get = ['DI2', function(DI2)];
    ...
}]);
```



### .factory()

```
// minify しない or ngMin 使用
.factory('MyFactory', function(DI){
  var MyFactory;
    ...
  return MyFactory;
});
```

```
// minify 対策
.factory('MyFactory', ['DI', function(DI){
  var MyFactory;
    ...
  return MyFactory;
}]);
```

### .service()

```
// minify しない or ngMin 使用
.service('MyService', function(DI){
  this.xxx = yyy;
    ...
});
```

```
// minify 対策
.service('MyService', function(DI){
  this.xxx = yyy;
    ...
});
```

### .controller()

```
// minify しない or ngMin 使用
.controller('MyController', function(DI){
    ...
);
```

```
// minify 対策
.controller('MyController', ['DI', function(DI){
    ...
]);
```

```
// $inject で DI
var MyController = function(DI) {
    ...
};
MyController.$inject = ['DI'];
.controller('MyController', MyController);
```

### .directive()

```
// minify しない or ngMin 使用
.directive('MyDirective', function(DI){
  return {
    require: *1,
    restrict: *1,
    transclude: *1,
    scope: *1,
    link: function(scope, element, attrs, controllers) {
      ...
    },
    templateUrl: *2,
    template: *2
  };
);
```

1. 任意オプション

2. 'restrict' が default or 'E' 含む場合、どちらかは必須
 
.  ~~どちらかは必須~~ （コメント頂いて修正）


```
// minify 対策
.directive('MyDirective', ['DI', function(DI){
    ... // 内容は上と同じ
]);
```

### .component()

```
.component('MyComponent', {
  bindings: *3,
  controller: *3,
  controllerAs: *3,
  restrict: *3,
  transclude: *3,
  isolate: *3,
  templateUrl: *4,
  template: *4
});
```

3. 任意オプション

4. *2と違って任意オプション。デフォルトは `''`

## 感想
他にもあれば教えてください。
お前らもさっさとハマって泣くべきCentOS7の落とし穴4つ

CentOSの6から7への移行時、何度かつまづいた箇所があったので紹介します。

## 前提知識
6と7のミドルウェアの違いやSystemdの基本的な使い方はこのあたりを参考にしてください。 

- [CentOS6とCentOS7の比較表](http://qiita.com/sion_cojp/items/115e1671fcbc8f214aee)  
- [保存版 CentOS7とCentOS6との違いまとめ](http://urashita.com/archives/1538)

## 落とし穴1: 消える/tmp
CentOS7にtmpwatchは入っていません。
だからといって何も考えずに/tmp下にキャッシュ等の一時ファイルを吐き出していると、
いつの間にか消去されていて泣くハメになります。

CentOS7にはtmpwatchはありませんが、その代わり
systemdの **systemd-tmpfiles-clean.timer** がその役割を担っています。
このサービスはtmpwatchと同じように、/tmp下に使われていないファイルを一定期間経つと削除します。

消されたくないファイルがあるのなら`/etc/tmpfiles.d/`に設定ファイルを配置しましょう。

```
$ cp /usr/lib/tmpfiles.d/tmp.conf /etc/tmpfiles.d/
$ vi /etc/tmpfiles.d/tmp.conf
```

除外設定を追記

```/etc/tmpfiles.d/tmp.conf
~~
x /tmp/cache*
```

## 落とし穴2: アクセス出来ない/tmp
使っているFWによっては、セッションファイルを/tmpに吐き出すこともあるでしょう。
もちろん/tmp/hoge_app/sessionディレクトリを作ってそこに吐き出します。
＿人人人人人人人人人人人人人人人人人人＿
＞　対象のディレクトリが存在しません　＜
￣Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y￣


SystemdのServiceにはPrivateTmpというオプションがあります。
そのService専用の/tmpと/var/tmpの領域を用意する機能です。
**デフォルトで有効になっています。**

/tmp/hoge_app/sessionディレクトリはService専用の/tmpには存在しません。

PrivateTmpを無効にするには、Serviceの設定を変更する必要があります。
例えばphp-fpmの設定ファイルは`/usr/lib/systemd/system/php-fpm.service`です。
このファイルを`/etc/systemd/system/`下にコピーし、それを修正します。

```
$ cp /usr/lib/systemd/system/php-fpm.service /etc/systemd/system/
$ vi /etc/systemd/system/php-fpm.service
```

以下のように修正

```/etc/systemd/system/php-fpm.service
# PrivateTmp=true
PrivateTmp=false
```

Service設定ファイルの修正後は以下のコマンドで設定をリロードします。

```
$ systemctl daemon-reload
```


## 落とし穴3: 消える /var/run
CentOS7では、/runディレクトリがtmpfsファイルシステムでマウントされています。
つまり、 **OSを再起動すると/run (=/var/run)に置かれたファイルは全て削除されてしまいます。**

`/var/run/hoge_app/hoge_app.pid`のように
/var/runにアプリごとのディレクトリを掘ってpidを配置していたりすると、
再起動時に作ったディレクトリが消えてしまっているので起動に失敗したりします。

対応として、`/etc/tmpfiles.d`に設定ファイルを作り、
OS起動時に作っておきたいディレクトリを指定する必要があります。

```
$ vi /etc/tmpfiles.d/hoge.conf
```

以下のように記述します。

```/etc/tmpfiles.d/hoge.conf
 d /var/run/hoge_app 0755 hoge hoge
```



## 落とし穴4: 消えるシステムログ
CentOS7では、システムログはjournaldで管理されています。
参考: [CentOS 7のログ管理「journald」](https://thinkit.co.jp/story/2014/12/18/5389)

デフォルトのログファイル置き場は`/run/log/journal`です。  
先ほど書いたように、CentOS7では`/run`はOS再起動すると消えます。
~~つまり、 **障害発生時に一番見たいシステムログが、再起動すると消えている**わけです。~~
**(2016/1/4追記: 消えません。詳細は後述)**
悲しい。

それを防ぐために、journaldの設定で
ログの配置場所を`/var/log/journal`に変更します。

```
$ vi /etc/systemd/journald.conf
```

以下のように変更します。

```/etc/systemd/journald.conf
[Journal]
# Storage=auto
Storage=persistent
```

### 2016/1/4追記
システムログはjournald経由でrsyslogにも送られるため、
再起動によってjournaldのログが消えても、rsyslogで管理されているシステムログは消えません。

上記の現象は、仮想環境上のCentOS7で発生する
rsyslogの不具合が原因のようです。
参考: [rsyslogが出力してくれなかった話(CentOS 7)](http://qiita.com/t_Signull/items/7d557ae3b272bd1ae78f)

## おわりに
新しいOSを使うときには、思わぬ落とし穴にハマって泣かないよう
充分に検証しましょう。
Xamarinでマルチプラットフォーム用のプロジェクトを作る

# Xamarinでクロスプラットフォーム用のプロジェクトを作ってみる

…思いっきりかぶりました。
しかも前日と :cry: 
ネタもないし、仕方ないのでこのまま行きます。
（書き出し時点で公開前日19時…）

## 環境とか

iOS対応させるのに結局Macは必要になります。
そこで、以下の環境を使います。

- Mac
- Xcode
- VirtualBox
- Windows10
- VisualStudio 2015 Community
- Xamarin iOS/Android

Mac上でVirtualBox使ってWindowsを動かし、その上でVisualStudioを動かします。

## AndroidとiOSとUWPと

上記を対応してしまえばたいがいの環境で動くアプリが作れてしまいます。
（この際Macはごめんなさい）
まずはUWPのプロジェクトを作り、ざっくりと動くところまで作っていきます。

さて、サンプルでどんなものを作ろうか、と思いましたが、とりあえず
VisualStudio Onlineにログインするアプリを、APIを使って書いてみようと思います。
（マジで作るならAPI使わずにライブラリ使いましょう）

### VisualStudio Online関連のリンク

VisualStudio Online関連のAPIは[ここ](https://www.visualstudio.com/en-us/integrate/api/overview)にまとまっていて、もうこれだけでお腹いっぱいいっぱいです。
しかし、これはOnlineのAPIです。
クライアント用のライブラリは[ここ](https://www.visualstudio.com/en-us/integrate/get-started/client-libraries/dotnet)にあって、このライブラリを使うとオンラインもスタンドアロンでインストールするTFSでも両方使えるようなので、こちらを使う方が全然いいでしょう。

### Solutionを作る

VisualStudioから空のSolutionを作ります。
この中にすべてのプロジェクトを収めていきます。
![xac01.PNG](https://qiita-image-store.s3.amazonaws.com/0/59270/0b3b5d8f-8eaf-823d-471a-d9f30baefbd7.png)
名前はアプリ名で。

### UWPのプロジェクトを作る

プロジェクトを作る前に、Solutionのディレクトリ内にプロジェクト用のディレクトリを作っておきます。
Solutionを右クリックしてメニューを出し、エクスプローラーでフォルダを開きます。
![xac02.PNG](https://qiita-image-store.s3.amazonaws.com/0/59270/90ea7302-c1fe-a116-002b-f5873a9e5122.png)

このフォルダの中にプログラム名_uwpというディレクトリを作り、その作ったディレクトリの中にプロジェクトを作ります。
![xac03.PNG](https://qiita-image-store.s3.amazonaws.com/0/59270/f12b55de-3400-9bf0-0e44-7627034ddf67.png)

### iOSやAndroidも

同じようにiOSやAndroidのプロジェクトもSolutionディレクトリ内にディレクトリを作ってその中にプロジェクトを作ります。
こうすることで、プロジェクトファイル（.csproj）を同じ名前にでき、出来上がるアプリ名を同じものにすることができます。

### 共通で使うもの

各プラットフォーム共通のデータ構造や処理はまとめた方が二度手間になりません。
そのため、PCLや共有プロジェクトにして使い回すようにしましょう。

自分のやり方としては、

| 中身 | 形式 | 備考 |
|:--:|:--:|:--:|
| MVVMの中のMとVM | 共有ライブラリ |  |
| MVVMの中のV | 共有ライブラリ | Xamarin.Forms |
| 言語リソース | PCL | .reswファイル |

と分けます。
MVM + Vにする理由は、Xamarin.Formsが使えないプラットフォームがあるかもしれないからです。
例えば、ほら。Macとか。

共有ライブラリにする理由は、System.Net.Httpとかを使いたくなるからです。
特に、Mを取得するのに `HttpClient` を使いたくなりますし。
そうなると、PCLではちょっと、となるんですよね。

また、これは単に少し前のバージョンのXamarin.Formsで起きてたことなのですが、共有プロジェクトにするとXAMLがうまく使えませんでした。
その経緯もあり、VはXAMLを使わないXamarin.Formsで書きます。
（あくまでも自分のやり方です）

### バージョン管理

ここはXamarinとは関係ないのですが、自分が使うバージョン管理システムは、

- 公開する場合はGitHub
- 非公開の場合はVisualStudio Online

に置きます。
結局どちらもGitでバージョン管理をするのですが。

VisualStudio Onlineはプロジェクト数が事実上無限になってたり、自動ビルドもあったり、自動ビルドもXamarinに対応してたりでかなり依存しています。
VisualStudioからも使いやすいですし。
…あ、少し前に名前変わってVisualStudio Team Serviceになったんでしたっけ。

## 最後に

いろんなところで書かれていることですが、C#で書くことで非常に少ない手数でプログラムを書くことができます。
また、C#6になって `?.` とか `$"〜{id}〜"` とか `{get;set;} = new xxx` とか書けたりするので、ますます手数を減らせるようになっていて幸せになってます。

Xamarin、もっとみんなで使いましょう。
（少し高いのがなぁ…）

あ、サンプルはまたGitHubにでも登録します。

（書き終わり時点で22時50分…なんとか…）
結婚式 x vvvv


私事ですが、先日結婚式を執り行いまして、
お色直しで着れなかった色や柄、さらに映像をドレスとして着るため
ウェディングドレスにプロジェクションマッピングをしたので、
機材の設置、スケジュール感、パッチなどを公開したいと思います。

#当日の写真
![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/37495/f789624a-6fad-e1f4-bdc3-43577a1642c6.jpeg)
![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/37495/69c423df-694b-d749-4de2-00de8ee2d689.jpeg)
![3.jpg](https://qiita-image-store.s3.amazonaws.com/0/37495/366603cf-0762-7666-2882-9b85c9c34b37.jpeg)


#当日の映像
Wedding Dress Projection Mapping
https://m.youtube.com/watch?v=hX-MrqFsA68

#使用機材
・Kinect v2
・Mac book pro 
・vvvv 64bit
・単焦点プロジェクター
※Kinect v2の導入は下記参考に。
http://qiita.com/yhy_jp/items/83dbb1a092cc466ef3fa

#パッチの構成
1)Depthの閾値を指定、マスクを作成
2)映像などを入れ込む
3)位置調整用のプログラム

#スケジュール
8:00-9:00   設置
9:00-10:00  着替えなど準備
10:00-11:00 結婚式
12:00-14:00 披露宴

#設置手順
1)テーブル・電源などの確保
2)プロジェクター、センサーの画角をざっくり合わせ、目張り
3)プログラム側でのキャリブレーション
4)投影テスト、音響とのタイミング合わせテスト

実質設置・キャリブレーションは1時間半程。
投影先からプロジェクター・センサーまでは4m程。
機材などを託し、着替えなどの準備へ。
当日の中座のタイミングで実施しました。

#パッチ
https://drive.google.com/file/d/0B-aWXftvAHSxdko1c3BDcnpxMVU/view?usp=sharing

#Tips
・Playerだとドレスだと足が判定されないのでDepthでプログラムを組み直した
・新郎自らやるのは色々焦る
・新婦は当日の状況わからないので、映像で確認
・サポート、会場の理解、周知が必要
・vvvvJPサポートチームがいたので、安心して実施できた
・担当のプランナーさんの度量が必要
(今回はホテルで初の取り組みでしたが、実現可能性を信じてくれました）

#おわりに
Rhizomatics x Perfumeのカンヌライブをみて、
その時からずーっとやってみたいと思っていたことを実用レベルまでもっていきました。
vvvvをはじめたきっかけを周りの方々のサポートを受けながら実現できました。
サポートしてくださった方、そして一緒に作ってくれた嫁さんに本当に感謝です。
[*Monaca*] Onsen UIについて調べる

# はじめに
Onsen UIメモ。

# 概要
[Onsen UI](http://ja.onsen.io/)はMonacaと同じ会社が作っているCSSフレームワークで、
Monacaでアプリを開発する場合は簡単に利用できる。
もちろんMonacaではないプロジェクトでも利用できる。

公式から概要引用↓
>・PhoneGap / Cordovaアプリに最適なJavaScript、CSSフレームワーク
>・アプリ開発プラットフォームMonacaに標準搭載
>・豊富なUIコンポーネントが提供
>・スマホもタブレットも！レスポンシブデザインで同時対応

# 導入方法
Monacaの新規プロジェクト作成時に**Onsen UI最小限のテンプレート**を選択すると一番簡単。
その他にもOnsen UIと頭についているテンプレートがいくつかあるのでそれの利用でも可能。
また、Monacaでない場合も利用可能ですが推奨環境はMonaca、Cordova、PhoneGapになっている。

# 色の変更
[Onsen UI CSS Component](http://components.onsen.io/)で色をカスタマイズしてCSSに書き出しできる。

Monacaプロジェクト/www/components/monaca-onsenui/loader.css
のonsen-css-components-blue-basic-theme.css部分を変えることで読み込むCSSを変更可能。

# まとめ
Onsen UI、今日は触るまでの時間が無いのが残念。まだちょっとした画面づくりにしか使ったことないです。
CrystalでHit&Blow

この記事は<a href="http://www.adventar.org/calendars/800">Crystal Advent Calendar 2015</a>の10日目の記事です。

-----

どうも、<a href="http://www.kut-ww.com/crystal-entrance">サークルの記事</a>にCrystalについて書いたらpineたんに捕まってしまった者です。
Rubyすらドットインストール見たきりの雑魚ですが、初心者向けの簡単な記事を書かせていただきます。

といっても、
ほとんどRubyのリファレンス見ながら書いたので、ほぼRubyですorz

今回作成したのは、Hit&Blowです。
以下がソースコードになります。

```
class HitAndBlow

  NUMBERS_LENGTH = 4

  def initialize
    @numbers = (0..9).to_a.sample(NUMBERS_LENGTH)
  end

  # Hitをカウント
  def decide_hit(input)
    hit = 0
    i = 0
    while i < NUMBERS_LENGTH
      if @numbers[i] == input[i].to_i
        hit += 1
      end
      i += 1
    end

    return hit
  end

  # Blowをカウント
  def decide_blow(input)
    blow = 0

    i = 0
    while i < NUMBERS_LENGTH
      j = 0
      while j < NUMBERS_LENGTH
        if i == j
          j += 1
          next
        end
        if @numbers[i] == input[j].to_i
          blow += 1
        end
        j += 1
      end
      i += 1
    end

    return blow
  end

  # 判定
  def decide(input)
    hit = decide_hit(input)
    blow = decide_blow(input)

    if hit == 4
      puts "正解です"
      puts "おめでとうございます"
      exit()
    else
      puts hit.to_s + "Hit! " + blow.to_s + "Blow!"
    end
  end

end

def main()
  loop do
    puts "4桁の整数を入力して下さい"
    puts "※ 途中で終わるときはCtrl+cで"

    input = gets
    input = input.to_s

    # エンター連打してたら戻る
    if input == "\n"
      next
    end

    # 数字かどうか判定
    begin
      input.to_i
    rescue
      puts "数字のみを入力してください"
      next
    end

    # 桁数を判定
    # 改行含むので5文字で判定
    if input.size != 5
      puts "4桁入力して下さい"
      next
    end

    puts "Number"
    $hit_and_blow.decide(input)

  end
end

$hit_and_blow = HitAndBlow.new
main()

```

見るに耐えないコードだと思いますが、一応動いたのでお許し下さい...。

#Rubyとの違い
Rubyと違った部分は、

- is_a?で数値を判定するときはis_a?(Integer)じゃなくてis_a?(Number) (結局使わなかった...)
- 文字列の長さを取得するときは.lengthじゃなくて.size

の2点くらいでした。

そもそも、ほとんどRuby触ってないからよくわからないorz

-----

雑ですが以上になります。
ありがとうございました！

明日は白瀬蒼さんのターンです！
GitBucket入れてみた

# GitLabが入らなかった
最初は[GitLab](https://about.gitlab.com/)を入れようと思っていた．だめでした．
原因はubuntuが32bit版だったこと．([参考](http://feedback.gitlab.com/forums/176466-general/suggestions/5968082-32-bit-packages))
なので[GitBucket](https://github.com/gitbucket/gitbucket)を入れてみた．

# 入れるもの/使うもの
- tomcat7
  + `apt-get`から入れるとtomcat7ユーザのホームディレクトリが作られない．  
    ので，手動で作る． ([参考](http://hiu302.net/ktblog/2015/06/28/gitbucket%E3%82%92tomcat%E4%B8%8B%E3%81%A7%E5%8B%95%E4%BD%9C%E3%81%95%E3%81%9B%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%AE%E6%B3%A8%E6%84%8F%E7%82%B9/))  
  `chown -R tomcat7:tomcat7 /home/tomcat7`  
  + 最初のままだとManager画面を見られない．  
    tomvat-users.xmlをいじる． ([参考](http://server-helper.doorblog.jp/archives/6926813.html))

- GitBucket
  + [Github](https://github.com/gitbucket/gitbucket/releases)からwarを落とす．
  + `chown tomcat7:tomcat7 gitbucket.war`
  + `mv gitbucket.war /var/lib/tomcat7/webapps`
  + tomcatをリスタート

- nginx
新しく入れるわけではなかったのでインストールなどは割愛  
  + localhostの8080ポートで動いているtomcatのポートフォワードをする．  
    `/etc/nginx/site-enable/default`に追記 ([参考](http://qiita.com/sudahiroshi/items/78b7cf006d07db44f62c#2-4))
  + nginxをリスタート
  + これで外部から，`http://example.com/gitbucket` でアクセスできるようになる．


# GitBucketを使う
+ user:root, pass:rootでログイン
  - パスワードはログイン後に右上から変えるべし．
  - ただし，Full NameはUserネームではないので注意．なんか設定ミスった時は`/home/tomcat7/.gitbucket` ([参考](http://coelacanth.jp.net/gitbucket%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%82%92%E3%83%AA%E3%82%BB%E3%83%83%E3%83%88%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88/)) を消してリセットしました(雑)
  - Userネームは変えられないようなので`System Administration`から新しいユーザを管理者で作ったらいいかな・・？
+ sshでアクセスにもできる．ただしポート開けないとだめそうだったので後回し．

# 元々使ってたGitリポジトリをGitBucketに移す
- まじめにやるならこれ ([参考](http://tanacasino.hatenablog.com/entry/2013/08/03/233427))
- 元のリモートリポジトリが同マシン上にあったので，ズボラした．  
  (※あぶないので非推奨)
  + GitBucketのリモートリポジトリ内を全消し
  + 元のリモートリポジトリで`chown -R tomcat7:tomcat7 *`
  + GitBucketのリモートリポジトリへ丸コピ
CentOS7の時刻をChronyを使ってNICTと同期する

#はじめに
CentOSのisoでminimal版をダウンロードしてくると、何も入っていなくて色々勉強になる。

時刻が狂ってることに気付き、ntpdで同期しようとしたけど、
興味本位で今っぽくChronyを使い、同期先は日本の標準時を作っているNICTにしてみた。

#そもそもChronyってなんだ？
CentOS7から導入されたntp兼サーバ。
OS上にntpdもchronyも共存させることは可能だが、
排他的な関係になっていて、どちらか一方が起動すると、もう片方は停止する。

#Chronyのインストール

~~~
# yum install -y chrony
~~~

##NICTと同期する設定

~~~/etc/chrony.conf
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst

# 以下を追記する
server ntp.nict.jp iburst

# Ignore stratum in source selection.
stratumweight 0

# Record the rate at which the system clock gains/losses time.
省略
~~~
尚、iburstを指定すると、短い間隔で4回問い合わせをするので、
妥当性の判断と同期が早くなるとのこと。

#自動起動設定

```
# systemctl enable chronyd
```

##起動, 同期確認
~~~
[root@localhost ~]# systemctl start chronyd
[root@localhost ~]# systemctl status chronyd
chronyd.service - NTP client/server
   Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled)
   Active: active (running) since 火 2015-12-08 10:11:15 JST; 3s ago
  Process: 817 ExecStartPost=/usr/libexec/chrony-helper add-dhclient-servers (code=exited, status=0/SUCCESS)
  Process: 814 ExecStart=/usr/sbin/chronyd -u chrony $OPTIONS (code=exited, status=0/SUCCESS)
 Main PID: 816 (chronyd)
   CGroup: /system.slice/chronyd.service
           └─816 /usr/sbin/chronyd -u chrony

12月 08 10:11:15 localhost.localdomain chronyd[816]: chronyd version 1.29.1 starting
12月 08 10:11:15 localhost.localdomain chronyd[816]: Linux kernel major=3 minor=10 patch=0
12月 08 10:11:15 localhost.localdomain chronyd[816]: hz=100 shift_hz=7 freq_scale=1.00000000 nominal_tick=10000 sl...ll=2
12月 08 10:11:15 localhost.localdomain chronyd[816]: Frequency 380.740 +/- 3.765 ppm read from /var/lib/chrony/drift
12月 08 10:11:15 localhost.localdomain systemd[1]: Started NTP client/server.
Hint: Some lines were ellipsized, use -l to show in full.
[root@localhost ~]#
[root@localhost ~]# date
2015年 12月 10日 木曜日 23:11:48 JST
~~~

##参考
[Chrony本家](http://chrony.tuxfamily.org/index.html)
新しく Fabric に加わった Appsee を試す


![Appsee](https://dashboard.appsee.com/images/logo_small.png)

# ユーザーの振る舞いを解析する Appsee

先日 Fabric のメールで Appsee というサービスが Fabric ファミリーに加わったとアナウンスがありました。

> Appsee: Building an exceptional user experience requires both in-depth qualitative and quantitative understanding of your customers’ behavior. With Appsee's experience analysis platform, you can see exactly how people are using your apps with features like user recordings and touch heatmaps.

アプリ上でのユーザー操作が解析できるサービスとのことです。

## セットアップ

まずはセットアップをしてみます。Fabric の指示に従って作業を進めるだけ。このあたりは他と変わりません。

#### Appsee を選択
![スクリーンショット 2015-12-10 9.00.15.png](https://qiita-image-store.s3.amazonaws.com/0/27210/1d1f6489-088e-09d4-eead-377959a14fb5.png "スクリーンショット 2015-12-10 9.00.15.png")

#### Appsee アカウントの作成

アカウントは別のようで、新規でアカウントを作ります。
   
![スクリーンショット 2015-12-10 9.06.27.png](https://qiita-image-store.s3.amazonaws.com/0/27210/95128591-2746-23b1-2437-5236d7f3957c.png "スクリーンショット 2015-12-10 9.06.27.png")

#### Build, Framework の追加

対象のプロジェクトを開いたら command + B でビルドし、

![スクリーンショット 2015-12-10 9.06.41.png](https://qiita-image-store.s3.amazonaws.com/0/27210/807d0028-6746-e522-07d4-d0a2e925af08.png "スクリーンショット 2015-12-10 9.06.41.png")

Appsee framework を追加します。(Copy のチェックボックスは外しておく)

![スクリーンショット 2015-12-10 9.08.40.png](https://qiita-image-store.s3.amazonaws.com/0/27210/57633b4c-359b-6f29-2ad8-19837664fafd.png "スクリーンショット 2015-12-10 9.08.40.png")

#### コードの追加

ここも指示の通りコピペします。

```
import Fabric
import Appsee

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        Fabric.with([Crashlytics.self, Twitter.self, Appsee.self])
        ...
}
```

#### 準備完了

これで準備完了です。簡単ですね。

準備が終わったら command + r で実行してアプリをいろいろ操作してみましょう。Appsee でその振る舞いが記録されています。

## ユーザーの振る舞いをチェックする


＃ちなみに今回試した[アプリ](https://itunes.apple.com/jp/app/chi-li-su-bao-puro-ye-qiu/id884671156?mt=8)はこちらです。野球好きの方は[こちら](https://itunes.apple.com/jp/developer/takeshi-fujiki/id869781887)から自分の好きな球団のアプリをインストールしてくれるとうれしいです(宣伝)

ある程度操作したら Appsee のダッシュボードにアクセスしましょう。

https://dashboard.appsee.com/

#### ユーザーの振る舞い

ここが Appsee の特徴になると思いますがユーザーが各画面のどの部分をタップしたかがヒートマップで表示されます。
さらに
* どのボタンをタップしたか
* TableView から何か選んだか
* どの画面から遷移して、どの画面に遷移したか(またはアプリを閉じたか)
という情報が表示されます。

![Screenshot 2015-09-04 15.24.png](https://qiita-image-store.s3.amazonaws.com/0/27210/32d61452-ee17-7350-f7c6-8b0d1a92c342.png "Screenshot 2015-09-04 15.24.png")

これらの情報から改善施策の検討ができそうです。

#### DAU もとれる

アナリティクス系のサービスによくある DAU やクラッシュ数などのレポートが確認できます。

![スクリーンショット 2015-12-10 23.09.06.png](https://qiita-image-store.s3.amazonaws.com/0/27210/07dde126-5573-416a-0326-bc04e80b37ec.png "スクリーンショット 2015-12-10 23.09.06.png")

## まとめ

以上のように簡単に導入、レポートの確認ができる Appsee、すごく便利です。

ただ無料プランというものはないようで(トライアル期間はある)、金額次第で本格導入するか考えたいと思います。

## 追記(12/10 23:20)

料金プランは公表されておらず、トライアルから有料プランにアップグレードしようとすると、

・利用するプラットフォーム(iOSかAndroidか両方か)
・月間の想定セッション数

を選択させられます(下図)。

![スクリーンショット 2015-12-10 9.17.16.png](https://qiita-image-store.s3.amazonaws.com/0/27210/22ed6bc5-8c05-e38c-f8e2-ee1f4dd77345.png "スクリーンショット 2015-12-10 9.17.16.png")

その後中の人から料金プランの提示があります。
＃だいたい１日くらいで返事がありました。金額はここに書くのはダメだと思うので興味のある方は中の人に問い合わせてみてください。
Google for Mobile

<p>Google for Mobileに参加してきたので、興味があった点についてレポートする。</p>

<p>サブタイトルは『Develop. Engage. Earn』。これはセッションカテゴリにもなっていて、各セッションはこれのどれかに属しているものとなっている。そして会場はDevelop TrackとEngage & Earn Trackの２つ用意して、そのカテゴリに沿ったセッションが開催された。</p>

<p>この場で発表される新しいことはなく、Googleから日本の状況に対応した情報が伝えられる場という印象を持った。その中で気になったのが、アプリ申請の審査について。以下の点について気にして欲しいということのようだ。</p>

<ul>
<li>レビューしやすい環境を用意するのは問題ないが、レビューの内容を誘導するのはNG。</li>
<li>ストアでアプリを検索する場合に影響を与える、適切でないキーワード。</li>
<li>性的表現についてはグローバルな場なので、グローバルな基準となっている。それ家族に見せれますか？という視点で判断して欲しい。</li>
<li>知的財産侵害には気をつけているが、正当な権利があっても審査側ではわからない状況があると思う。審査チームに伝える手段を用意しているので活用して欲しい。</li>
<li>ポリシー違反の場合、メールでも連絡しているので、アカウント作成時に登録したメルアドを確認して欲しい。要するに社長などのメルアドを登録していと思うが、そこに届けられている可能性があるよだと思う。</li>
</ul>

関連情報
<a href="http://qiita.com/advent-calendar/2015/cocoa/">Cocoa Advent Calendar 2015</a><br />
<a href="https://events.withgoogle.com/google-for-mobile-tokyo/">Google for Mobile</a><br />

【Cocoa練習帳】
<a href="http://www.bitz.co.jp/weblog/">http://www.bitz.co.jp/weblog/</a><br />
<a href="http://ameblo.jp/bitz/">http://ameblo.jp/bitz/</a>（ミラー・サイト）<br />
<a href="https://t.co/6P3h2jtbRk</a>note<br />
PHP7を触ってみた

#PHP7をサラッと触った感想

12/4に PHP 7 がメジャーアップデートされましたので早速触ってました。

出来るようになったことを簡単に紹介する前に…PHP7はPHP5.x系に比べると速度がかなり早くなっているとの事、どの程度早くなったか…。

```
<?
$time_start = microtime(true);

$count = 0;
for ($i = 0; $i < 10000000; $i++) {
    $count++;
}

$time_end = microtime(true);

$time = $time_end - $time_start;
var_dump($time);

```
(☞´◉ ਊ ◉)☞ﾄﾞｫｵﾝ

```
// PHP5.1
// float(0.700210809708)

// php 5.4
// float(0.4266359806221)

// php 7
// float(0.15863871012235)
```

単純な計算でもだいぶ早くなった。
また、ブラウザからPHP7を使ったページの表示も数値以上のスピードが出ている印象です。実際に見る側にとってはありがたい話です。

## 追加された機能とか

全てのPHPerがよく使うであろうものをササッとピックアップ。

### 戻り値の型指定

関数の戻り値の型が指定できるようになりました。()以降に`:`+型を指定で設定します。

```
<?
function poipoi($a, $b){
    return $a + $b;
}


function hoge($a, $b): float {
    return $a + $b;
}

var_dump(poipoi(1,1));
// int(2)
var_dump(hoge(1,1));
// froat(2)

```

弱い型付けだと自動で指定した型に変換されてしまうみたいですね。

オブジェクトを指定することも出来ます。その場合はクラス名を指定するだけです。便利。
こっそりスカラ型（int, float, string, bool）も指定できるようになっています。まあ便利。

### 宇宙船演算子

より大きい、小さい、等しいを判定する演算子`<=>`が増えました。
実際の動作はこんな感じになります。

```
echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1
```

### Null合体演算子

かゆいところに手が届くうれしい実装です。ようやく実装されたなという感じです。

```

$value = $_GET['val'] ?? 'no_value';

```
フォーエバーisset()

`$_GET['val']`が存在したらその値を。存在しなかったら'no_value'を与えます。`$_GET['val']`が存在しない場合でもエラーが出ないのがいいですね。

これが出来なくて安全に値を取得する便利メソッドを書いたりしていましたが卒業出来そうです。

その他いろいろな機能が追加されたり変化しましたが特に大きな変化だったなと思う部分は

**殆どのエラーが例外としてCatchできるようになった**ということ

### エラーを例外としてCatchする

さくっとテスト

```
<?

$hoge = null;
try {
    $hoge->moge();
} catch (Error $e) {
    var_dump($e->getMessage());
}

// string(39) "Call to a member function moge() on null"
```
SUGOI

~~ぶっちゃけFatal errorを出すコードはイカンでしょ~~
今までのPHPならFatal errorだったのですが…これはユニットテストが捗りそうです。


##参考

PHP: rfc https://wiki.php.net/rfc
PHP マニュアル：https://secure.php.net/manual/ja/index.php
firstWhereのパフォーマンス

コードを書いていると、このコードは内部的にどの程度オプティマイズされるのだろうかと疑問に思うことがあります。
そこで最適化されそうなコードを書いたら実際に最適化されるのか試してみようと思います。
#お題
idをキーに大量の行同士（下記クラスを一万個ランダムに並べたリスト）を結合するスピードを計測します。
（SQLのJOINです。）

```dart:class
class Row {
  int id;
  double number;

  Row(this.id, this.number);
}
```

##ルール
1. １万行のRowを二つ用意
    2. idは1~9999
    3. numberは0.0<n<1.0のランダムな小数
    4. 表はランダムにソート
5. 二つの表の同じidのRowを見つけ出しnumber同士を掛け算
6. １万個の2.をすべて加算する
7. 1.-3.をそれぞれ100回ずつ変わりばんこに実施する

##試したコード
1. 手作りfor文を使う
2. list.firstWhereを使う
3. 一度Mapに展開する

狙いとして

- 1.と2.は本質的に同じコードだが、2.はプリミティブなメソッドを使っているため1.より良いスコアを出して欲しい
- 3.は僕でも思いつく最適化方法だが、コンパイラがこれに思い至るか見たい

があります

```dart:main.dart
import 'dart:math';

const max = 10000;

void main() {

  var t1 = 0 , t2 = 0 , t3 = 0;
  for(var x = 0 ; x < 100 ; x ++) {
    t1 += time(firstWhere);
    t2 += time(forStatement);
    t3 += time(createMap);
    print("$x $t1 $t2 $t3");
  }
}

int time(Function f){
  var t1 = new DateTime.now();
  print(f());
  var t2 = new DateTime.now();
  return t2.millisecondsSinceEpoch - t1.millisecondsSinceEpoch;
}


double firstWhere() {
  var l1 = getSampleList();
  var l2 = getSampleList();

  for (var r1 in l1) {
    r1.number = cal(r1.number, l2
        .firstWhere((r2) => r1.id == r2.id)
        .number);
  }


  return getResult(l1);
}

double forStatement() {
  var l1 = getSampleList();
  var l2 = getSampleList();

  for (var r1 in l1) {
    for (var r2 in l2) {
      if (r1.id == r2.id) {
        r1.number = cal(r1.number, r2.number);
        break;
      }
    }
  }
  return getResult(l1);
}

double createMap() {
  var l1 = getSampleList();
  var l2 = getSampleList();

  var map = <int, Row>{};
  for (var r1 in l1) {
    map[r1.id] = r1;
  }

  for (var r2 in l2) {
    var r1 = map[r2.id];
    r1.number = cal(r1.number, r2.number);
  }
  return getResult(l1);
}

double getResult(List<Row> l1) {
  var result = 0.0;
  l1.forEach((r) => result = result + r.number);
  return result;
}


List<Row> getSampleList() {
  var r = new Random(new DateTime.now().millisecondsSinceEpoch);
  var list = <Row>[];

  for (var x = 0; x < max; x ++) {
    list.add(new Row(x, r.nextDouble()));
  }

  list.sort((r1, r2) => r.nextDouble().compareTo(r.nextDouble()));

  return list;
}

double cal(d1, d2) {

  return d1 * d2;
}

class Row {
  int id;
  double number;

  Row(this.id, this.number);
}
```

#結果

||1.手書きfor文|2.firstWhere|3.Map|
|:-----------------:|--:|--:|--:|
|WebStorm上で実行|98539ms|100232ms|1697ms|
|jsに変換してChromeで実行|19005ms|16856ms|9158ms|
|ターミナル上で実行|44408ms|16484ms|1083ms|

ちなみに「ターミナル上で実行」を試した理由として、
何も考えずにWebStorm上で実行したらChromeの方が圧倒的に速かったことにビビったからです。

#考察
##WebStorm上で実行
なぜか1.の方が早いという結果になりました。ラムダ式に入る時にファンクションコールオーバーヘッドというものが発生するのかなと思いました。
また、3.は他のやり方に比べてかなり速く、まだまだコンパイラの改善の余地があると思いました。コントリビュートチャンスかもしれません。
##jsに変換してChromeで実行
JSでは3.がとても遅くなっています。JSのMapは遅いのでしょうか。
また、予想通り1.より2.が速くなっています。Dartはまだコンパイラの最適化が進んでいないが、V8は最適化チャンスに敏感なのかもしれません。
##ターミナル上で実行
こちらも1.より2.が速くなっています。
じゃあWebStormは何だったのか。

#結論
手書きでfor文を書くよりfirstWhereを使った方が速い。
速さが必要な場所では、まだまだ最適化用のコードを書くベネフィットは大きい。
VisualStudioCodeでElectronデバッグメモ



# VisualStudioCodeのデバッグ

このへんの記事を見て気づいたのだが、

*Creating Desktop Applications With AngularJS and GitHub Electron*
https://hansrwindhoff.wordpress.com/2015/05/05/debugging-task-runner-tasks-like-gulp-with-visual-studio-code-editordebugger/

*Debugging task runner tasks (like Gulp) with Visual Studio Code editor/debugger*
https://hansrwindhoff.wordpress.com/2015/05/05/debugging-task-runner-tasks-like-gulp-with-visual-studio-code-editordebugger/

VisualStudioCodeは今のところ(Ver 0.10.3)、Node.js と C# mono のデバッグができる。
で、Electronについてだが、Node.js同様に、``--debug`` を付けることによってデバッグモードで起動するっぽい。

# 手順
1. Electronアプリを ``$ electron --debug ./`` と、デバッグモードで起動しておく。
2. VisualStudioCode で、``app``フォルダを開く。
3. 左ペインから、デバッグを選択し、設定を押す。``Node.js``を選択し、``launch.json``を作成する。
4. ``Attach``を選択して起動すると、既に起動済みのElectronアプリと連携する。

ちなみに連携できるのはメインプロセス側で、フロントのBrowserWindow側プロセス(JavaScript)とは連携しない。
メインプロセス側処理はremoteで呼び出せるのだけど、利用方法としてはやや限定的かも。
あなたはJavaScriptで「'6000' -  ('40' + '10') * '50'」の答えが分かります？？

競技プログラミングで３分ほどハマった。検証が楽しくてさらに１０分ほどハマった。

 

'6000' -  ('40' + '10') * '50' の結果ですよ。

パット見で分かりますか？？？ ' ' は文字列を表します。

 

ふつうに数値として計算したら、3500ですよね。

ところが答えは -194500です。これがJavaScriptの罠であり魅力です。

 

## 文字列と数値の変換

例えば、以下の算術はうまくいきます。

```js
'60'  - '10'  => 50
'6'   * '4'   => 24
'100' / '4'   => 25
```
 

マイナス、かける、割るという演算子は、数値の演算だからです。データ型が文字列でも、数値型へと自動変換してくれます。

 

## プラス演算子

ところが、プラス演算子は別です。これは数値の演算以外にも、文字列の結合もします。

 
```js
'10' + '5' => '105'
```
 

おっと！これはビックリですね。

 

どちらか片方が数値でも、文字列結合になります。

```js
'10' + 5 => '105'
10 + '5' => '105'
```
 

両方が数値のとき初めて、数値加算が行われました。

```js
10 + 5 => 15
```
 

冒頭の演算は、まず最初に文字列結合が行われていたんですね。。。

```js
'6000' -  ('40' + '10') * '50' 
```

カッコ内がまず' 4010 'となっていたようです。

```js
'6000' - '4010' * '50' => -194500
```
 

## 応用

では、以下はそれぞれどうなるでしょうか。

```js
'hello' + 10 + 5
10 + 'hello' + 5
10 + 5 + 'hello'
```
 

結果はそれぞれ、'hello105', '10hello5', '15hello'となります。

\+ 演算子は左から実行されるので、最後のケースのみ、数値どうしの加算が行われます。

逆に言うと、他の２つは10 + 'hello'の時点で文字列結合が行われ、その後の + 5も文字列結合となります。

 

このようにすると、数値演算が行われます。

```js
'hello' + (10 + 5) => 'hello15'
```
最終的には文字列になってしまいますが。。。

 

## 対策

とは言え、'10' + '5' ならば数値同士の加算がしたいと分かります。

では、以下の場合はどうでしょうか。

a + b

a, bには何が入るかわかりません。ただ、何が来たとしても、まずは数値加算を優先したいとします。（プラス演算子は文字列を優遇します。きっと文系ですね）

 

そんな時、 自分で関数を書けば良いのです。JavaScriptたのしいですね。

 

関数の作成は、また次回にしようと思います。

 

参考：

www.ajaxtower.jp
mb_strimwidthの罠

# 罠

全角を2，半角を1として数え、指定した幅で切り取ってくれる便利な`mb_strimwidth()`ですが、以下のように数え間違えに見える罠が存在します。

```php
mb_strimwidth("123456", 0, 5, "…", "UTF-8"); // 1234…
mb_strimwidth("…123456", 0, 5, "", "UTF-8"); // …1234
```
それぞれ「123…」「…123」になって欲しいのです。

`mb_strwidth`単体で確認すると3点リーダが半角1文字として数えられてることがわかります。

```php
mb_strwidth("A", "UTF-8"); // 1
mb_strwidth("あ", "UTF-8"); // 2
mb_strwidth("…", "UTF-8"); // 1
```

# 何故？

これは[Unicode附属書#11](http://www.unicode.org/reports/tr11/)で3点リーダ(U+2026)の幅はコンテキストによって[A(Ambiguous; 曖昧)と定義](http://www.unicode.org/Public/UNIDATA/EastAsianWidth.txt)され、さらにコンテキストが分からない場合は狭い文字として扱えと指示されています。
PHPでもそれに従おうという[経緯](https://bugs.php.net/bug.php?id=28220)があり、3点リーダなどは1として数えられるようになったようです。

実際自分の環境ではQiitaでの表示も「A」と同じ幅になっており間違いと言い切れないことが分かります。

# でも困る

こういった文字長で切る処理はWebの場合はCSSで対応すれば楽ですが、そうでない帳票などの場合に困ります。
しかもそういった場合は大抵MSゴシックといった「…」を全角で表現するフォントが使われ、件の数え方では不都合が生じます。

# 代替案

その場合の代替案として`mb_strcut`をSJIS文字列に対して適用するのが簡単だと思います。
`mb_strcut`は全角半角の幅ではなくマルチバイト境界を認識しつつバイト数で切ってくれます。
そこで「…」など全角になって欲しい文字が2バイト、半角カナが1バイトになるSJISエンコーディングを使えば都合が良いというわけです。

その理屈を使ってmb_strimwidthを実装しなおすとこんな感じでしょうか。

```php
function mb_strimwidth2($str, $start, $width, $trimmarker="", $encoding=null) {
    if (is_null($encoding)) {
        $encoding = mb_internal_encoding();
    }
    $str = mb_substr($str, $start, null, $encoding);
    $str_ = mb_convert_encoding($str, "SJIS-win", $encoding);
    $trimmarker_ = mb_convert_encoding($trimmarker, "SJIS-win", $encoding);
    if (strlen($str_) > $width) {
        $result = mb_strcut($str_, 0, $width - strlen($trimmarker_), "SJIS-win") . $trimmarker_;
        return mb_convert_encoding($result, $encoding, "SJIS-win");
    } else {
        return $str;
    }
}
```

`mb_strimwidth`の動きに合わせてみましたが、実際の場面ではSJISだったりすると思うので`mb_convert_encoding`などは使わないかも知れません。
また、`$start`パラメータの扱いが`mb_strcut`ではバイト、`mb_strimwidth`では文字数だったので合わせるため`mb_substr`使ってますがこれも0を指定するなら要らない所です。
(`mb_strimwidth`の`$start`が文字幅じゃないというのはそれはそれで罠かも知れません。)

# ちなみに

1とか2ではなくプロポーショナルフォントにも対応した本当の文字幅が欲しい時はTTFフォントで文字描画する機能を持った画像orPDFライブラリを使うことになると思います。
「bounding box」「metrics」「measure」的な単語の入ってるメソッドが大抵あります。
Apache Directory Serverのインストール

CentOS 6.7にApache Directory Serverをインストール、セットアップしてみたので、その記録を残しておきます。

# インストール要件

## サポートしているOS
2015年12月6日現在、以下のインストーラが提供されています。

* Windows (exe)
* Mac OS X (dmg)
* Debian package (deb)
* RPM package (rpm)
* Linux Binary (bin)

## Java要件

Oracle JRE 6.0以降が推奨です。

# インストール
rpmファイルを取得して、インストールコマンドを実行します。

```bash
wget http://ftp.riken.jp/net/apache/directory/apacheds/dist/2.0.0-M20/apacheds-2.0.0-M20-x86_64.rpm
rpm -ivh apacheds-2.0.0-M20-x86_64.rpm
```
サーバーは、以下のコマンドで起動することができます。ポート番号10389がデフォルトで使用されます。

```bash
/etc/rc.d/init.d/apacheds-2.0.0_M20-default start
```

# 動作確認

LDAPクライアントツールでアクセスすると、以下のようなDITでデータが登録されていることが確認できます。
デフォルトの管理者ユーザーはuid=admin,ou=systemでパスワードはsecretです。![ApacheDS.png](https://qiita-image-store.s3.amazonaws.com/0/43869/55f798d0-0274-4b6d-b80c-4093e55b3ed0.png)

同じくApache Directoryチームが開発しているApache Directory Studioを使うと、Apache Directory Serverの設定の変更もできます。

Apache Directory Studio
https://directory.apache.org/studio/

![Screenshot-LDAP - localhost_apache_ds - Configuration - Apache Directory Studio .png](https://qiita-image-store.s3.amazonaws.com/0/43869/14e56388-4b12-844b-2be5-86d50183c4e0.png)

Apache Directory Serverは、以下のコマンドで停止します。

```bash
/etc/rc.d/init.d/apacheds-2.0.0_M20-default stop
```

# 参考資料
ApacheDS v2.0 Basic User's Guide
1.3 - Installing and starting the server
https://directory.apache.org/apacheds/basic-ug/1.3-installing-and-starting.html
Perl6でDBに接続する

こんばんは :whale2: 
[Perl 6 Advent Calendar 2015](http://qiita.com/advent-calendar/2015/perl6)の10日目です。

`DBIish` でDBに接続してみようと思います。

## ローカルに mariadb のインストール

手元のMacにhomebrewでmariadbをインストールします。

```
# インストール
$ brew install mariadb

# 起動
$ mysql.server start

# セキュリティ設定
$ mysql_secure_installation
## root のパスワードを root にしました(セキュリティ設定とは一体)

# データベース作成
$ mysql -uroot -proot -e'create database perl6test'
```

| 項目 | 値 |
|:-----------|:------------|
| データベース名 | perl6test |
| ユーザ名 | root |
| パスワード | root |

今回はこれを使います。

## DBIish you a merry Christmas

##### 接続

```pl
use v6;
use DBIish;

my
$dbh = DBIish.connect(
  "mysql",
  :database<perl6test>,
  :user<root>,
  :password<root>,
  :RaiseError
  );
```

##### テーブル作成

```pl
my
$sth = $dbh.do(q:to/STATEMENT/);
  DROP TABLE IF EXISTS idol ;
STATEMENT

$sth = $dbh.do(q:to/STATEMENT/);
  CREATE TABLE idol (
    id          SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    family_name VARCHAR(12),
    last_name   VARCHAR(12),
    age         TINYINT UNSIGNED
  ) ;
STATEMENT
```

#### プリペアドステートメント

```pl
$sth = $dbh.prepare(q:to/STATEMENT/);
    INSERT INTO idol (family_name, last_name, age)
    VALUES ( ?, ?, ? ) ;
STATEMENT

$sth.execute('星宮', 'いちご', 16);
$sth.execute('霧矢', 'あおい', 16);
$sth.execute('紫吹', '蘭',    17);
$sth.execute('大空', 'あかり', 13);
```

#### fetchall_arrayref

```rb
my
$sth = $dbh.prepare(q:to/STATEMENT/);
    SELECT id, family_name, last_name, age FROM idol ;
STATEMENT

$sth.execute;

my
$arrayref = $sth.fetchall_arrayref();

# 要素数
$arrayref.elems.say; #=> 4

# $arrayref の中身を dump ...
$arrayref.perl.say; #=> $[["1", "星宮", "いちご", "16"], ["2", "霧矢", "あおい", "16"], ["3", "紫吹", "蘭", "17"], ["4", "大空", "あかり", "13"]]

# family_nameとlast_nameだけとりだし
for @( $arrayref ) -> $idol {
  @( $idol ).[1,2].join.say;
}
```

#### fetchrow-hash

```pl
my
$sth = $dbh.prepare(q:to/STATEMENT/);
    SELECT id, family_name, last_name, age FROM idol ;
STATEMENT

$sth.execute;

loop {
 my $hash = $sth.fetchrow-hash ;
 last unless $hash ;

 # $hash の中身を dump 
 $hash.perl.say;

 # family_nameとlast_nameだけとりだし
 $hash.{'family_name', 'last_name'}.join.say;
}
```

メソッドは他にもたくさん。

#### 切断

```pl
$sth.finish;
$dbh.disconnect;
```

##### (おまけ)ドキュメント参照のコマンド

```
$ p6doc DBIish

$ p6doc DBDish::Role::ErrorHandling
$ p6doc DBDish::Role::Connection
$ p6doc DBDish::Role::StatementHandle
```

おわりです。

## 参考や注釈

* [perl6/DBIish](https://github.com/perl6/DBIish)
* [perl6/DBIish/examples/mysql.p6](https://github.com/perl6/DBIish/blob/master/examples/mysql.p6)
* [perl6/DBIish/lib/DBDish/Role/StatementHandle.pm6](https://github.com/perl6/DBIish/blob/master/lib/DBDish/Role/StatementHandle.pm6)


* [Mac へ MySQL を Homebrew でインストールする手順 - Qiita](http://qiita.com/hkusu/items/cda3e8461e7a46ecf25d)
* [Perl6 の DBIish わりと本当に動いていた - tokuhirom's blog](http://blog.64p.org/entry/2015/04/30/205658)
* [Perl6でデータベースを扱いたいとき - Charsbar::Note](http://d.hatena.ne.jp/charsbar/20150214/1423881583)
ソートに見るアルゴリズムの比較

1つのことを行う上で、いくつもアルゴリズムがあるということはよくあります。それでは、どのような基準で比較すればいいのでしょうか。

# 各種のソートアルゴリズム
ここでなぜソートを例にしたかというと、

* アルゴリズムが多数存在する
* そして、よく知られている
* 比較した時の差もわかりやすい

などの事情があります。なお、各ソート手法については、別途で調べてください（投げやり）。

# 速度の評価
アルゴリズムの速度は、よく、$O(f(n))$のような記法で表されます。これは、「$n\to\infty$となる場合に」処理時間はどう変化するか、というものです。つまり、**nが充分大きな場合**についての考察です。ものによっては、「充分大きな」$n$が、現実的な規模の問題では考慮しなくていいほど果てしなく大きい、ということもあります。また、ソートについても、個数が10個ぐらいのごく小規模な場合、クイックソートより挿入ソートのほうが速く終わることも多いです。

以下に、どのような規模のアルゴリズムがあるか、例を挙げてみます。

* $O(1)$…規模にかかわらず同じ時間（定数時間）。たとえば、配列から1つの値を選ぶ、ような操作が該当します。
* $O(\log n)$…規模の対数に比例するもの。例えば、ユークリッドの互除法による最大公約数の計算があります。
* $O(n)$…規模に比例するもの。例えば、「バラバラに並んだ配列から最大値を探す」ような場合が該当します。
* $O(n \log n)$…クイックソートなどがこのあたりです。
* $O(n^2)$…選択ソート・挿入ソート・バブルソートなど、シンプルなソート法はこのあたりに相当します。
* $O(n!)$、$O(2^n)$…こういった、多項式ですらない時間がかかるようになると、問題の規模が大きくなれば「実質解けない」ことになってしまいます。

## 最速の場合・最遅の場合
マージソートやヒープソート・選択ソートなど、どんな配列を入れても同等の時間でソートされるアルゴリズムもありますが、挿入ソートは最初からソートされた配列なら$O(n)$で終わってしまいますし、逆にクイックソートに妙な配置にした配列を投入すると$O(n^2)$かかってしまうこともありえます。

# 消費メモリ量（内部ソート・外部ソート）
挿入ソートは元の配列以外には、配列の長さにかかわらず一時的に配列から外した要素の分のメモリ（$O(1)$）しか消費しません。このようなソート法を、**内部ソート**といいます。クイックソートの場合、スタックとして$O(\log n)$だけの領域が必要となりますが、これも内部ソートに分類することが多いです。

一方、ナイーブに実装したマージソートは$O(n)$だけのメモリを必要としますが、そのようなソートを**外部ソート**といいます。

また、回路として実装するようなソーティングネットワークや、並列処理を前提としたバイトニックソートのように、事前に対応したシステムの必要なアルゴリズムもあります。

# 速度以外の面について
以上に述べた速度やメモリ消費以外にも、アルゴリズムにはそれぞれに属性があります。

## 安定性
単純な数字や文字列だけのソートでは関係ないのですが、Excelのシートを並べ替えるような場合を考えると、並べ替えに使うキーが全く同じものについて、並べ替えた後にどうなるかという問題があります。挿入ソートやマージソートは、正しく実装すれば同じキーに対応したものの順序がソート後も保たれることになります（安定ソート）。一方、ヒープソートやクイックソートでは結果の順序がどうなるかは状況次第です（不安定ソート）。

なお、「元の順番」をあわせてソートすることで安定化させることも可能ですが、そうすると$O(n)$の領域を使う外部ソートとなります。

## オンラインアルゴリズム
挿入ソートやマージソートのように、データが徐々に増えていくような状況でも、すでにあるデータから始めることができるアルゴリズムを、「オンラインアルゴリズム」といいます。

## 元データの条件
元データが「0〜9までの10通りしかない」とわかっているような場合、「0がいくつ、1がいくつ…」というように数えてから配列に詰め直す「分布数えソート」というアルゴリズムがあって、これは$O(n)$で終わります。また、桁数が決まっているようなデータであれば、この分布数えソートを桁ごとに適用する、「基数ソート」という手法もあります。

あと、bzip2の圧縮では「ブロックソート」という手法が使われていますが、同じ文字列をローテートさせたもの、ということを前提とした高効率なアルゴリズムでソートを行なっています。

# 巨大なデータについて
理論上は、どれだけ大きなデータでも1要素の読み書きは同じ時間、という前提になっていますが、実際のマシンで仮想記憶にデータが行くような事態になれば、この前提は成り立ちません。こういう場合は、「どれだけ同じ領域を固めてアクセスするか」のほうが問題になってきます。
Atomセットアップ手順

Atomの自分向けセットアップ手順メモです。

# インストール

パッケージ管理ツールでAtomをインストールします。

* Windowsの場合(Chocolatey)
    * cinst atom -y
* OS Xの場合(Homebrew)
    * brew cask install atom

ショートカットを作成します。

# テーマを変更

* UI Theme
    * One Light
* Syntax Theme
    * One Light

# パッケージをインストール

* ~~japanese-wrap~~
    * Atom v1.2で不必要になった。
* markdown-toc
* markdown-pdf
* minimap

# 設定を変更

* Auto Indent On Paste
    * オフ
* Font Family
    * "Mifu 1M"
* Preferred Line Length
    * 999
* Show Indent Guide
    * オン
* Show Invisibles
    * オン
* Soft Wrap
    * オン
* Soft Wrap At Preferred Line Length
    * オン
* Tab Length
    * 4
* Tab Type
    * soft
Apache Zeppelinでデータ分析を分散処理する - Part 3: ZeppelinでHiveを使うためのAmbariの設定

## このシリーズ

* [Apache Zeppelinでデータ分析を分散処理する - Part 1: データ分析のライフサイクル](http://qiita.com/masato/items/b66930a2ab8d888df5ff)
* [Apache Zeppelinでデータ分析を分散処理する - Part 2: Ambari on DockerにZeppelinをセットアップする](http://qiita.com/masato/items/911e06fd31202181f0fd)
* [Apache Zeppelinでデータ分析を分散処理する - Part 3: ZeppelinでHiveを使えるようにする](http://qiita.com/masato/items/78a45cf9b6984552d4d9)
* [Apache Zeppelinでデータ分析を分散処理する - Part 4: Ambari on Dockerのambari-functionsを使ってみる](http://qiita.com/masato/items/b879b84486aeb7d3d6d8)


## Hiveがエラーになる

　[前回](http://qiita.com/masato/items/911e06fd31202181f0fd)セットアップしたデフォルトの[Zeppelin](https://zeppelin.incubator.apache.org/)は[Hive](https://hive.apache.org/)の実行に失敗してしまいます。サンプルの Australian Dataset (Hive example)のエラーです。

<img width="512" alt="hive-drop-error.png" src="https://qiita-image-store.s3.amazonaws.com/0/43745/924319ab-3ba0-7d42-ab13-344292a57bbb.png">


　認証エラーです。Hortonworksのフォーラムを見るとちょうど[Error while running hive queries from Zeppelin on HDP 2.3.2](https://community.hortonworks.com/questions/4905/error-while-running-hive-queries-from-zeppelin.html)と言うスレッドがあります。結論は出ていないのですが、`hadoop.proxyuser.hive.groups = *`とすると良いみたいです。

## Ambariの設定

　AmbariからHDFSの設定を変更します。Advancedタブから
`Custom core-site`の`hadoop.proxyuser.hive.groups`を`users`から`*`に変更します。

<img width="512" alt="hdfs-config-user.png" src="https://qiita-image-store.s3.amazonaws.com/0/43745/1fb80372-3d8b-503d-ff3d-cb0f33c66068.png">

　コメントを入力してSaveします。

<img width="512" alt="hdfs-config-user-save.png" src="https://qiita-image-store.s3.amazonaws.com/0/43745/0913b499-4f96-677f-dd24-cd468a8c61e1.png">

　HDFSの変更後にリスタートします。その他のアラートが出ているコンポーネントがあればリスタートします。

<img width="512" alt="hdfs-config-user-restart.png" src="https://qiita-image-store.s3.amazonaws.com/0/43745/56392722-b9cd-47ba-b9b5-3e9194d23ae9.png">


## Australian Dataset (Hive example)を再度実行する

　もう一度Australian Dataset (Hive example)を実行します。`drop table if exists health_table`が成功しました。

<img width="512" alt="hive-drop-success.png" src="https://qiita-image-store.s3.amazonaws.com/0/43745/5a7f52d2-6fc8-23df-9b4e-3f95aa29c4a5.png">

　続いてその下のhiveクエリーも正常に実行できるようになります。

<img width="512" alt="hive-query-success.png" src="https://qiita-image-store.s3.amazonaws.com/0/43745/54516668-db23-fd2b-ea58-032fa874a77c.png">