OmniAICreator/Qiita-1.07M huggingface dataset:
Reactノート5


```
npm install -g create-react-app

create-react-app test
```

#サンプル1

<img width="423" alt="スクリーンショット 2017-12-24 1.10.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/62264/d27371bb-bcab-7980-2143-f18158182bd5.png">

```index.js

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import registerServiceWorker from './registerServiceWorker';

function Hello(props) {
    return (
        <section>
        　　<h1>こんにちは {props.name} さん</h1>
        </section>
    );
}

class Message extends React.Component {
    constructor() {
        super();
        this.state = {
            name: ''
        };
        this.updateName = this.updateName.bind(this)
    }
    updateName(event) {
        console.log("updateNameが呼び出されました。");
        this.setState({
            name: event.target.value
        });
    }
    render(){
        return (
             <section>
             　　<Hello name= {this.state.name}/>
             　　<p>Messageコンポーネントが呼び出されました。</p>
             　　<input type="text" onChange={this.updateName} />
             </section>
        );
    }
}

ReactDOM.render(
    <Message />,
    document.getElementById('root'));
registerServiceWorker();
```

#サンプル2

<img width="417" alt="スクリーンショット 2017-12-24 1.54.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/62264/43263bf4-e1d2-bb67-a58d-60bd69ce22d3.png">


```index.js

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import registerServiceWorker from './registerServiceWorker';

function Hello(props) {
    return (
        <section>
　　        <h1>こんにちは {props.name} さん</h1>
    　　    <input type="text" onChange={props.updateName} />
        </section>
    );
}

class Message extends React.Component {
    constructor() {
        super();
        this.state = {
            name: ''
        };
        this.updateName = this.updateName.bind(this)
    }
    updateName(event) {
        console.log("updateNameが呼び出されました。");
        this.setState({
            name: event.target.value
        });
    }
    render(){
        return (
             <section>
                 <Hello name={this.state.name} updateName={this.updateName}/>
                 <Hello name={this.state.name} updateName={this.updateName}/>
                 <Hello name={this.state.name} updateName={this.updateName}/>
                 <p>Messageコンポーネントが呼び出されました。</p>
             </section>
        );
    }
}

ReactDOM.render(
    <Message />,
    document.getElementById('root'));
registerServiceWorker();
```
C言語にちょっとだけ逆らってみる、他

こんにちは。
とあるエンジニアです。

この記事は [呉高専エンジニア勉強会 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/kure-kosen)の23日目の記事です。

本日はクリスマスによって正帰還され発散しそうな僕のストレスをC言語にぶつける話と、それを現実的に行うべきではないということを再確認する話です。

Cの関数に八つ当たりします。

##八つ当たりの対象

* 環境
gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.5)
64bit

```C
#include <stdio.h>

void f(){
  printf("とっても楽しい！");
}

int main(){

  printf("fの彼女「クリスマス、楽しいよね！」\n");
  printf("f「");
  f();
  printf("」\n");
  putchar('\n');
  
  return 0;
}
```
実行結果

```
fの彼女「クリスマス、楽しいよね！」
f「とっても楽しい！」
```

今からこのf()に少し細工して思ってもないことを言わせます。

##思ってもないことを言わせる。
思ってもいないようなことを言わせる関数を定義してやります。

```C
void y(){
    printf("...と言ったな。あれは嘘だ。」\n");
}
```
そしてf()に代入処理を追加します。(説明は次節で)

```C
void f(){
  int a;//追加
  *((&a) + 5)=&y;//追加

  printf("とっても楽しい！");
}
```
すると、以下のような結果になります。

```
fの彼女「クリスマス、楽しいよね！」
f「とっても楽しい！...と言ったな。あれは嘘だ。」
```
きっとこの後は爆散したことでしょう。めでたしめでたし。

##あの代入処理は何をしているのか
簡単に言うと、関数f()のリターン先アドレスをy()に書き換えてやりました。
![data01.png](https://qiita-image-store.s3.amazonaws.com/0/221779/e2d03b72-11bd-0810-cdb2-3f6738b246f7.png)
だからf()がmain関数に戻ろうとした時に、
間違えてy()に行っちゃったんですね。
なお、main関数に処理は戻っていません。
y()の戻り先は不明の状態なのでその場で強制終了していることでしょう。

##※これを真面目に使う実装は一般的に非現実的である
なぜなら、コンパイラのバージョン、OSの違い等でアドレスはわりと変わるからです。
VC++でやってみたところリターン先アドレスにアクセスするときのインクリメントは2になりました。他の環境でも変わると思います。
これを実際に使おうと思うと、実行環境やコンパイラのバージョンアップに合わせて#ifdefで分岐させたりして対応する必要があります。
ソフトウェアの開発では非効率的すぎです。

##先人たちに感謝するべき
上で非効率的といいましたが、私たちが非効率的と言えるのは、同じ書き方で実行環境の違いを吸収してくれる言語、OS、コンパイラ、インタプリタ、ライブラリ等があるからです。そんなありがたい仕組みがあるのに、今回のような「逆らってみる」ようなことを現実に行うと痛い目を見るのはその人自身です。
仕組みに逆らわずに正しい実装で(環境にバグがあってもクソとは言わずに)、楽しいプログラミングをしていきましょう。
クリスマスに予定のない理系単科大学の文系出身大学1年生がCourseraで機械学習を修了した話

[Coursera/Machine Learning](https://www.coursera.org/learn/machine-learning)

#はじめに
全く右も左もわからない状態から「巷で話題になってる**機械学習**とはなんぞや！」という疑問を解決するために模索していた大学一年生の僕の行動をまとめたいと思います。
同じような悩みを抱えてる人向けに**機械学習への入門（門に入るところ）**の標の一つとしていただけたら嬉しいです！

#Courseraを始める前に
まずはじめにCoursera（コーセラ）を始める前の自分のスペックを書いておきます。

- 文系入試を経て（~~なぜか~~）理系単科大学の大学生になってしまった、高校数学はⅠAⅡBまで。(数学偏差値は70程度)
- 大学の授業では確率・統計、微分積分、線形代数を（一応）受講している。
- HTMLとCSSで自己紹介をしたページを書いたことがある。
- rails tutorialは３章くらいで耐えられなくなってやめた。

こんな感じではじめました。笑

#...でCourseraって？
ここまで当然のような顔をして話を進めてきましたが、「ちょっと待て、さっきから”Coursera”って一体なんの話をしてるんだ」ってなっているような気がするので簡単に説明させていただきます。

> コーセラ（英名：Coursera）は、スタンフォード大学コンピュータサイエンス教授Andrew NgとDaphne Kollerによって創立された教育技術の営利団体である。世界中の多くの大学と協力し、それらの大学のコースのいくつかを無償でオンライン上に提供している。[wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%BC%E3%82%BB%E3%83%A9)

wikipediaの説明にはこう書いてありました。つまり、**試験を受けたり・留学することなく世界でトップの大学の先生の授業を無償で受けられる素晴らしい**オンラインサービスです!!

講座自体は無料で受けられますが、別途お金を払うとコースを終えた時に修了証をもらうことができます。ただ、現在のcourseraのページで受講しようとすると有料の修了書がもらえるコースをゴリ押しされるので、**修了書なんていらねぇ！知識だけよこしやがれ！てやんでぇ！**という江戸っ子の方は画面の下に小さく表示されている*"audit"*の文字をクリックしましょう。ちなみに僕はお金を払って修了証をもらいました。~~これで僕も名門スタンフォード卒業生~~。お金を払うと途中でやめられなくなるプレッシャーがかかるのでいいかもしれません。
<img width="1129" alt="スクリーンショット 2017-12-24 0.55.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/189118/24a38255-d1d5-11b0-4a3f-af7063103a90.png">

#Courseraのながれ
ここで今回僕が受講した機械学習のコースは、Courseraの創立者の一人であるAndrew Ng先生によって行われます。このコースは全11講から構成され、講義は英語で行われます（日本語字幕あり）。僕は1週間に1講で約三ヶ月かけて終えました。もちろん自分のペースで進められるのでもっと早く終えることも可能です。
##内容
このコースで触れる機械学習のアルゴリズムを大まかにまとめると以下のようになります。

- 教師あり学習
 - 線形回帰
 - ロジスティック回帰
 - ニューラルネットワーク
 - サポートベクターマシーン

- 教師なし学習
 - K-means
 - PCA
 - 異常検知

そのほかにもモデルの評価方法や、講座で扱った機械学習アルゴリズムの実用例なども講座で紹介されます。
##課題
この機械学習コースでは授業の週ごとにプログラミング課題が出されることがあります。基本的にはその週に学んだアルゴリズムを実装するものです。僕はOctaveのGUIでコードを書いてターミナル上で提出していました。~~課題の回答がどうしてもわからない場合は[Github](https://github.com/search?utf8=%E2%9C%93&q=coursera+machinelearning&type=)を参考にするという最終手段がありますがどうするかはあなた次第です。~~
##復習
また、このCourseraの機械学習コースの受講生はたくさんいるのでググって見ると講義内容が簡潔に要約されたものが見つかると思うので予習や復習に役立てて見るといいと思います。僕は[こちら](https://qiita.com/katsu1110/items/fac314996f34540da260)の方の記事を参考にしていました。



#必要な学力は...？
上で紹介したアルゴリズムは全て数式を通して紹介されますが、今回の講座を受けるに当たって必要な数学力は、**基本的な行列計算・偏微分**（＋正規分布など統計学の知識）で十分です。僕は大学に入ってから線形代数や微分法を学びはじめましたが、始めて半年経たないくらいの数学力でクリアできました。しかし、これはあくまでこのコースに限った話なので、機械学習のアルゴリズムと呼ばれるものを適切に理解するためにはこれでは不十分だと思います。

#最後に
今回の機械学習の講座を担当されているAndrew Ng先生はその分野における第一人者ですが、受講者のことを非常によく考え・理解して授業を進めてくださるので、ビデオ授業にも関わらず本当に**かゆいとこに手が届く**授業が行われるため11講の講座も飽きずに終えることができました。このコースを受けただけでは**機械学習のエキスパート**とは言い切れないとは思いますが、このコースを受けることで「機械学習とは何か」「そしてそれは何に使われているのか」というような疑問は解決できると思います。これから機械学習を勉強をしてみたいと思ってる人にとって0→１の教材としては最高だと思うのでぜひ利用してみてください。
Vagrant+VirtualBoxのインストール(Mac)

## 「Vagrant」とは？
一言でいうと、「仮想マシンをコマンドラインで簡単に扱えるようにするツール」です。Vagrant自体には仮想化の機能はないため、VirtualBoxやVMwareなどの仮想マシン管理ツールと併せて使用します。
ここでは、無料で使えるVirtualBoxと一緒に使うことにします。

## 環境
- OS：macOS High Sierra 10.13.1
- Vagrant：2.0.1
- VirtualBox：5.2.4r119785

## セットアップ
### VirtualBoxのインストール
公式サイトからインストーラをダウンロードして実行します。
https://www.virtualbox.org/wiki/Downloads

<img width="799" alt="スクリーンショット_2017-12-23_23_21_16.png" src="https://qiita-image-store.s3.amazonaws.com/0/138245/2ef1087c-c797-dc62-e606-5c6189cacf6b.png">

「VirtualBox {バージョン} platform packages」から、OSに応じたインストーラをダウンロードします。
私は「OS X hosts」からダウンロードしました。

### VirtualBoxのバージョンの確認
インストールできたかどうか、バージョンを確認します。

```bash
$ VBoxManage -v
5.2.4r119785
```

バージョンが表示されているため、インストールに成功しています。

### VirtualBox Extension Packのインストール
VirtualBoxの拡張パックです。VagrantでVirtualBoxを操作するのに必要なため、インストールします。

<img width="799" alt="スクリーンショット_2017-12-23_23_21_16_2.png" src="https://qiita-image-store.s3.amazonaws.com/0/138245/d75e2755-3a7c-50f0-00f0-7bf6adcb97e7.png">

「VirtualBox {バージョン} Oracle VM VirtualBox Extension Pack」からダウンロードします。
全OSで共通のファイルなので、どのOSでも「All supported platforms」からダウンロードします。

ダウンロードしたファイルをダブルクリックし、インストール→ライセンスに同意→マシンのパスワードを入力、でインストールされます。

### Vagrantのインストール
公式サイトからインストーラをダウンロードして実行します。
https://www.vagrantup.com/downloads.html

インストール先のマシンのOSとビット数に応じたインストーラをダウンロードします。
私はMacなので、「Mac OS X, 64-bit」をダウンロードしました。

### Vagrantのバージョンの確認
インストールできたかどうか、バージョンを確認します。

```bash
$ vagrant --version
Vagrant 2.0.1
```

バージョンが表示されているため、インストールに成功しています。
10年間、キーボードについて本気出して考え続けた、結論。

お世話になっております。大塚です。

[un-T factory! XA Advent Calendar 2017](https://qiita.com/advent-calendar/2017/unt-xa) 24日目の投稿です。

コーディングをする者ならば、大なり小なり興味・関心があるであろう、キーボード。
２０歳くらいでキーボードに目覚め、１０年間、さまざまな形・配列のものを使ってきました。

１０年間もキーボードのことばかり考えていたので、さすがにそれなりの答えにたどり着つきました。
今回はそんな話をしたいと思います。

どうぞ、お付き合いください。

## １０年間の歩み
まずは、この１０年間でぼくが使ったキーボードの遍歴を、ダイジェストでお送りします。

1台目：__Apple Keyboard（JIS）__
2台目：<a href="http://www.diatec.co.jp/products/det.php?prod_c=394" target="_blank">__Majestouch Mini「マジェスタッチ　ミニ」日本語100キーボード・かなあり・黒__</a>
3台目：<a href="http://www.archisite.co.jp/products/topre/topre_keyboard/#realforce101" target="_blank">__REALFORCE 101__</a>
4台目：<a href="http://www.pfu.fujitsu.com/hhkeyboard/hhkbpro2/standard.html" target="_blank">__Happy Hacking Keyboard Professional2 墨 無刻印__</a>
5台目：大阪の中古パソコン屋さんの店長さんが使ってた、US配列のDellのキーボードを500円で譲ってもらう。
6台目：__Happy Hacking Keyboard Professional2 白 無刻印__
7台目：<a href="http://www.pokemon.co.jp/ex/typing/" target"_blank">__ポケモンキーボード__</a>
8台目：<a href="https://www.diatec.co.jp/shop/UNI/" target="_blank">__Unicomp Spacesaver M__</a>
9台目：<a href="http://www.edikun.co.jp/kinesis/" target="_blank">__Kinesis Advantage USB Contoured Keyboard white__</a>
10台目：<a href="https://ergodox-ez.com/" target="_blank">__ErgoDox EZ__</a>

ほかにもあるかもしれませんが、覚えている分ではこれくらいです。
あ、テンキーや左手用ゲーミングキーボードみたいな特殊なものは除いています。
3台目くらいからUS配列を使い始めています。

ちなみに、ぼくがマークアップエンジニアになった理由は、__「ずっとキーボードを触っていられるから」__です。

## 去年出会ったErgoDoxは、ほぼゴールだった。
某ブログから火がついた、ErgoDox。昨年、一部のエンジニアの間で大流行しました。
都内でmeet upが行われたのも、記憶に新しですね。
ぼくも参加予定でしたが、仕事で行けませんでした。残念。

人間工学に基づいた、左右分離型。軸も選び放題。
オープンソースで、すべてのキーを自由に入れ替えることも可能。
こんな最強のキーボード、他にはありません。

ErgoDox使ってると「あ、ここがキーボードのゴールだな」って、思いますよ、絶対。
１０年かけて、たどり着いた感あります。

それほど素晴らしいキーボードなのですが、実は、__ここは真のゴールではありませんでした__。

## ErgoDoxの弱点
ErgoDoxに限った話ではないのですが、こういったエルゴノミクス系のキーボードには、大きな弱点があります。
それは、__「慣れると他のキーボードが極端に使いづらい」__ということと、__「他の人が使えない」__ということ。

たとえば、ErgoDoxを自分の机で使っているときは、ものすごく快適なのですが、MTG中にラップトップで議事録を書くときとか、同僚のマシンでレビューついでにちょっとコード書くときとか、最初すごくタイピングしづらいです。
まったく打てないわけじゃないですし、すぐに慣れるのですが、スムーズに作業に入れない感じが、けっこう煩わしい。

タイピングは思考の邪魔をしてはいけませんからね。

あとは、風邪をひいたりしてしまって出社できないけど、急ぎ対応が必要な仕事ができてしまい、急遽、同僚のエンジニアが、他人のマシンで作業を代行してくれたりすることもありますよね。

自分の仕事もある中、なんとか時間を作って作業しようとしたとき、目の前がこんなだったらどうです？

![大塚の机](http://un-tech.jp/wp-content/uploads/2015/12/yuhi_desk.jpg)

__絶対に納期守れませんよね。__

以前、ぼくの代理を先輩エンジニアにお願いしたことがありましたが、コミットメッセージが「x」とだけ書かれてプッシュされていました。
先輩曰く、__「それしかできなかった」__とのこと。
まあ、そのときは無刻印のErgoDoxでしたからね。ぼくしかキー配列知りませんし。

## 結論
上記のような経験から、ぼくが導き出した答えは、

__そのへんで売ってる普通のキーボードを、使いこなしているエンジニアが最強。__

です。実に、ユニバーサル。

Merry Christmas for you !

追記
HHKBに戻ってきました。
11台目：HHKB Professional BT
void (*signal(int sig, void (*func)(int)))(int);

C標準ライブラリが提供する関数のうち、最も複雑なプロトタイプ宣言について。ちゃんと解読できますか？

```c:signal.h
void (*signal(int sig, void (*func)(int)))(int);
```

# cdecl.org
複雑な型宣言で困った時は [https://cdecl.org/](https://cdecl.org/?q=void+%28*signal%28int%2C+void+%28*%29%28int%29%29%29%28int%29%3B) に頼ってみましょう... で済ませたかったのですが、少しだけ加工してあげないとダメなようです。

> `void (*signal(int, void (*)(int)))(int);`
>
> declare signal as function (int, pointer to function (int) returning void) returning pointer to function (int) returning void

はい。日本語で書き下すと：

> 引数に『`int`型と「引数に`int`型をとり`void`型を返す関数へのポインタ型」』をとり「引数に`int`型をとり`void`型を返す関数へのポインタ型」を返す関数`signal`の宣言

[ね、簡単でしょう？][bobross]
[bobross]: https://dic.pixiv.net/a/%E3%81%AD%E3%80%81%E7%B0%A1%E5%8D%98%E3%81%A7%E3%81%97%E3%82%87%3F

ちゃんとした解説は下記ページを参考にください：

- [やり直しC言語：複雑な宣言の読み方](http://blog.tojiru.net/article/426537111.html)
- [C言語のポインタを含む複雑な宣言を解読](http://easyramble.com/c-difficult-declaration.html)
- [C言語での複雑な型表記を理解する方法](http://d.hatena.ne.jp/bellbind/20080718/1216407288)
macのターミナルから音量を調節する

#ミュートにする

```
osascript -e 'set volume with output muted'
```

#音量を５０にする

```
osascript -e "set volume 50/100*7"
```


#ログアウトするときにミュートにする
vimでスクリプトを作ります

```
vim muted.sh
```

muted.shに以下の構文を書きます

```
osascript -e 'set volume with output muted'
```

ログアウト時に実行されるようにします
/Users/name/muted.shのところは絶対パスで指定します。macの環境によって絶対パスは異なります。

```
sudo defaults write com.apple.loginwindow LogoutHook /Users/name/muted.sh
```

#muted.shのスクリプトがログアウト時に実行されないようにします

```
sudo defaults delete com.apple.loginwindow LoginHook
```


#参考
https://builder.japan.zdnet.com/os-admin/sp_snow-leopard-09/20423879/
Linux MintでOBSが簡単に動いた話

最近、Windows 10の重さに嫌気が差して、個人的なことをする場合にはLinux環境を使おうと思い立ち、有名なディストリビューションを幾つかインストールしてみて、最も良さそうなLinux Mintを選択した。

Linux Mint 18.3 Cinnamon 64-bit (Ubuntu 16.04.1 base)

平均的にCPU使用率が低くなり、ノートPCのキーボードが熱くなくなって快適である。

さて、Windowsで使用していたOBS（[Open Broadcaster Software](https://obsproject.com/)）がLinuxでも動かないかと調べたところ、以下のドキュメントが見つかった。

https://github.com/jp9000/obs-studio/wiki/Install-Instructions#ubuntu-installation

手順に従って、インストールしたところ、あっさり動いた。

* glxinfo | grep "OpenGL"  
でOpenGL 3.2以上であることを確認することと言うので見てみたが良くわからなかった。  
複数行表示された中に以下の行があったが、結果的にOBSは動作した。  
---  
OpenGL version string: 3.0 Mesa 17.0.7  
---
* sudo apt-get install ffmpeg  
でffmpegをインストール。
* sudo add-apt-repository ppa:obsproject/obs-studio  
でOBSリポジトリを追加。
* sudo apt-get update  
でリポジトリ情報を更新。
* sudo apt-get install obs-studio  
でOBSをインストール。

メニューの「サウンドとビデオ」から「OBS」を実行すると、さくっと OBS Studio 20.1.0 が起動して初期設定が始まった。
試しにWebカメラの映像と音声をYouTube Liveに配信してみたが、Windowsと変わらず簡単に配信することができた。
json.Marshalの中でMarshalJSONを呼ぶのは、バッドプラクティスかもしれない

# きっかけ

[generic](https://github.com/usk81/generic) というジェネリックスもどきな独自型をGoで作っているのですが、~~現在大幅な変更を行っており、~~行いました。そこでベンチマークを取った際にMarshalJSONとUnmarshalJSONのパフォーマンスが悪いことがわかりました。

# 実装の違い

## ベンチマーク

変更前がversion 1.0.0
変更後がversion 2.0.0

| version | requests | /op | B/op | allocs/op |
|---|---|---|---|---|
| 1.0.0  | 5000000 | 240 ns | 185 | 3 |
| 2.0.0  | 200000000 | 6.69 ns | 0 | 0 |

## 変更前（version 1.0.0）

よく紹介されるMarshalJSONのような感じで書いていました。

```go
// Bool is generic boolean type structure
type Bool struct {
	ValidFlag
	bool bool
}

// MarshalJSON implements the json.Marshaler interface.
func (v Bool) MarshalJSON() ([]byte, error) {
	if !v.Valid() {
		return json.Marshal(nil)
	}
	return json.Marshal(v.Bool)
}
```

## 変更後（version 2.0.0）

※ Bool.Boolが、Bool.boolがになったのはこの記事の件とは関係ないので気にしないでください

MarshalJSONでどのようにjsonにencodeしたいのか、はっきりしているので、`json.Marshal`で処理せずに自分で処理を書いて対応しています。

```go
// Bool is generic boolean type structure
type Bool struct {
	ValidFlag
	bool bool
}

// MarshalJSON implements the json.Marshaler interface.
func (v Bool) MarshalJSON() ([]byte, error) {
	if !v.Valid() {
		return nullBytes, nil
	}
	if v.bool {
		return []byte("true"), nil
	}
	return []byte("false"), nil
}
```

# なぜパフォーマンスが改善したのか？

JSONのエンコードの処理はkey/valueが`[]byte`で管理できるようになるまで、interfaceもしくは、reflect.Valueで管理されることになります。
必要に応じて型判定を繰り返し、json.Marshalerを継承していることが判定されると、`marshalerEncoder`という関数が呼ばれ、その中で実装したMarshalJSONを呼ばれる事になります。
この中で、json.Marshalを使った場合、今まで行ってきた処理の後続処理ではなく、上記に書いてきたことを１から行い、[]byteに変換できるか、nilもしくはGoで定義済みの型に変換できるになるまで、これを繰り返すことになります。

TODO: `encoding/json`の実装を後で詳しく書く。

# 参考にしたpackage

goの`time`は様々なMarshaler/Unmarshalerが用意されており、コメントも充実していたのでとても参考になりました。
https://golang.org/src/time/time.go

# UnmarshalJSONは対応しないの？

UnmarhshalJSONも対応を考えたのですが、以下のことを理由に対応を見送りました。

* jsonかどうかの判定
* 入力値/型は不明確

## jsonかどうかの判定

これが一番のボトルネックだと思います。

Go 1.9 には、`encoding/json`に`Valid`というJSONエンコーディングが正しいのか判定する関数がありますが、1.8以下ではこれがありません。
それまで、`encoding/json`にこういった処理がまったくなかったかと言うとそうではなく、privateな関数になってました。
そのため 1.8未満でJSONエンコーディングの判定をしようとすると、`encoding/json`にあった処理と同等な処理を自前で実装する事になります。
OSSで公開していない場合ならそれでもいいのかもしれませんが、そういった都合上で1.8以下を切るといった判定でできないので、`json.Unmarshal`に任せることにしました。

## 入力値/型は不明確

MarshalJSONはstructureが保持している値を変換してあげるだけなので、何をどう変換すればいいかが明確です。
それに対し、UnmarhshalJSONはどんな値がどんな型で渡ってくるかがわかりません。
なので、こちらが想定している値／型が渡ってきていることを判定する必要がありますが、自分が作っていたものが様々な型の値を許容していたので、メンテナンスコストを考えて保留としました。

型や値がある程度絞られるようだったら、UnmarhshalJSONでもjson.Unmarshalした方が良いかと思います。
【shell】シェルスクリプト作成時のtips【Linux】

# はじめに
Linux/UNIX上で作業する際にちょっとしたツールを作成したり、定型的なジョブを実行するための運用ツールを作ったりといったことがあるかと思います。
このようなときに役立つ方法・コマンドを紹介します。

ネタがあり次第、随時更新予定です。

# tips
## basename : フルパスからファイル名のみを抽出する・ファイル名から拡張子を除く
basenameを活用しましょう。

sedやawkを活用して取り出すことも可能ですが、basenameを利用すれば簡単です。
フルパスからファイル名を取りだす、またさらに拡張子を除去する、といった操作ができます。

まず、以下のようなファイルが存在すると仮定します。

```bash
$ find /path/to/targe
/path/to/targe/file1.csv
/path/to/targe/file1.csv
```

下記のスクリプトを作って実行します。

```bash
#!/bin/sh

for file in `ls /path/to/target/*.csv`
do
    echo `basename ${file}`
    echo `basename ${file} .csv`

done
```

実行結果は下記のようになります。

```
file1.csv
file1
file2.csv
file2
```


## mktemp : テンポラリファイルの作成
mktempを活用しましょう。

APIからのレスポンスに対して、2回以上grep等の検索をしたい場合など、一時的にファイル保存が必要なケースがあります。
プロセスIDなどを元に一時的なファイル名を生成することも可能ですが、mktempを利用すれば簡単です。

また既存ファイル名と同一のファイルを作らないため、シンボリックリンク攻撃に対しても安全です。

上記をいろいろと考慮すると結構なコード量になってしまうので、
対象ファイルを簡単にセキュアに保つ必要がある場合は、これを使った方が良いです。

まず、どのような挙動になるか、コマンドラインから実行してみます。

```bash:
### mktempを実行する
$ mktemp
/tmp/tmp.QnbBGwvXJF
$ ls -la /tmp
total 4
drwxrwxrwt.  7 root    root     109 Dec 23 15:34 .
dr-xr-xr-x. 18 root    root    4096 Dec 10 07:02 ..
drwxrwxrwt.  2 root    root       6 Jun 29  2016 .font-unix
drwxrwxrwt.  2 root    root       6 Jun 29  2016 .ICE-unix
drwxrwxrwt.  2 root    root       6 Jun 29  2016 .Test-unix
-rw-------.  1 vagrant vagrant    0 Dec 23 15:34 tmp.QnbBGwvXJF
drwxrwxrwt.  2 root    root       6 Jun 29  2016 .X11-unix
drwxrwxrwt.  2 root    root       6 Jun 29  2016 .XIM-unix

### 現在のプロセスのuid, gidを確認する
$ id
uid=1000(vagrant) gid=1000(vagrant) groups=1000(vagrant),10(wheel)
```

mktempコマンドの実行後、生成されたテンポラリファイルのフルパスが標準出力に出力されます。

対象のファイルを見てみると、owner, groupとも実行プロセスのuid, gidが設定され、パーミッションは600となります。
似たようなことを実装するのは可能ですが、mktempで済ませたほうがスマートです。

スクリプトから実行する場合は、下記のようにmktempをコマンド置換して変数に代入すれば良いでしょう。

```bash:
#!/bin/sh

TMP_FILE=`mktemp`

anycommand > ${TMP_FILE}

grep nnn ${TMP_FILE}
grep sss ${TMP_FILE}

```

## psコマンドの結果からgrepを除外する
例として、プロセス一覧から「python」プロセスのみを抽出してみましょう。
psコマンドの結果に対して「grep -v grep」を実行し、当該行を除去する方法が定番かと思います。

```bash:
$ ps -ef | grep python | grep -v grep
root      1011     1  0 15:11 ?        00:00:00 /usr/bin/python -Es /usr/sbin/tuned -l -P
vagrant   3277  3245  0 15:14 pts/1    00:00:00 python
```

しかし、以下のように実行することでgrepコマンドの実行を減らすことができます。

```bash:
$ ps -ef | grep pytho[n]
root      1011     1  0 15:11 ?        00:00:00 /usr/bin/python -Es /usr/sbin/tuned -l -P
vagrant   3277  3245  0 15:14 pts/1    00:00:00 python
```

何故でしょうか。
まず、当該grepコマンドに渡される引数は、psコマンド上からは下記のように確認できます。
コマンドラインから指定した文字列がそのまま表示されます。

```bash:
[vagrant@stdsv1 ~]$ ps -ef | grep gre[p]
vagrant   3299  3261  0 15:26 pts/2    00:00:00 grep --color=auto gre[p]
```

grepは、引数をマッチングパターンとして認識しますので、
「[]」に囲まれた文字列は、そのうちのいずれかの一文字にマッチするものとみなします。

整理すると、「grep pytho[n]」と実行したとき、以下のような挙動となります。

- psコマンドの実行結果上、grepコマンドのプロセスは「grep --color=auto pytho[n]」となる
- grepコマンド自体は、「python[n]」というマッチングパターンに一致する文字列のみ（＝pythonに一致する文字列のみ）を抽出して出力する。
Ruby de FizzBuzz

#はじめに
この記事は[FizzBuzz Advent Calendar 2017](https://qiita.com/advent-calendar/2017/fizzbuzz)の 12/24 に向けて書いたものです。

もちろん、FizzBuzz Advent Calender に Ruby版が無い!!
ということで書きました。

#Rubyとは
Rubyとは...
オープンソースの動的なプログラミング言語で、 シンプルさと高い生産性を備えています。 エレガントな文法を持ち、自然に読み書きができます。([公式サイト](https://www.ruby-lang.org/ja/)より)

#FizzBuzz
プログラミング能力をみるテストに使われる[FizzBuzz](https://en.wikipedia.org/wiki/Fizz_buzz)は以下のように使われます。

1から順番に数値を出力します。ただし、下記の条件をみたすとき、数値の代わりに指定した文字列を出力します。

- 3で割り切れるとき "Fizz"
- 5で割り切れるとき "Buzz"
- 3と5で割り切れるとき "FizzBuzz"

簡単なんだけど、焦っていると間違えてしまいがちですね〜

#実装
##要求仕様
1 から n までの数値について FizzBuzz して、 fn に書き込むメソッドを作成します。

    fizzbuzz(n, fn)

##テスト
まずはテストを書きましょう。
1 から 100 までの期待する答えを spec/fizz_buzz.answer に作ります。その後、rspec ファイルを作成します。

    # spec/fizz_buzz_spec.rb
    require_relative '../fizz_buzz.rb'
    
    describe :FizzBuzz do
      before :all do
        dir = File.expand_path(File.dirname(__FILE__))
        @_read  = ->(fn){ File.open(fn).map{ |r| r.chomp }}
        @answer = @_read[File.join(dir, 'fizz_buzz.answer')]
      end
    
      it 'should be eauql to anser' do
        fn = 'fizz_buzz.result'
        fizzbuzz(100, fn)
        expect(@_read[fn]).to match_array @answer
      end
    end

下記コマンドでテストします。

    $ rspec spec

##最初の実装
最初の実装なので、とりあえず動かします。

    def fizzbuzz(n, fn)
      File.open(fn,'w') do |f|
        1.upto(n) do |i|
          out = ''
          i % 3 == 0 and out << 'Fizz'
          i % 5 == 0 and out << 'Buzz'
          f.puts out.empty?? i : out
        end
      end
    end

##文字列演算を避ける
文字列演算は重いので、避けてみました。

    def fizzbuzz(n, fn)
      File.open(fn,'w') do |f|
        1.upto(n) do |i|
          f.puts case
          when i % 15 == 0 then 'FizzBuzz'
          when i % 3  == 0 then 'Fizz'
          when i % 5  == 0 then 'Buzz'
          else i
          end
        end
      end
    end

##ハッシュを使う
割り算が3つもあるので、なんとかしたいです。
ということで、ハッシュを使ってみます。

    class FizzBuzz
      CONDITION = { 0 => 'FizzBuzz' }
      { 3 => 'Fizz',
        5 => 'Buzz',
      }.each do |no, key|
        no.step(14,no){ |i| CONDITION[i] = key }
      end
    
      class << self
        public
        def fizzbuzz(n, fn)
          File.open(fn,'w') do |f|
            1.upto(n) do |i|
              f.puts CONDITION[i % 15] || i
            end
          end
        end
      end
    end
    
    # wrapper
    def fizzbuzz(n, fn)
      FizzBuzz.fizzbuzz(n, fn)
    end

wrapper は要求仕様に従うためのものですが、変更が可能であればその方が良いですね。

##ベンチマーク
せっかく作ったので、ベンチマークを取ってみます。
メソッド名を適当に変えます。あと、wrapper も外します。

    require 'benchmark'
    
    n  = 10000000
    fn = 'fizzbuzz.out'
    Benchmark.bm do |r|
      r.report('no 1'){ fizzbuzz1(n,　fn) }; File.delete(fn)
      r.report('no 2'){ fizzbuzz2(n,　fn) }; File.delete(fn)
      r.report('no 3'){ FizzBuzz.fizzbuzz(n,　fn) }; File.delete(fn)
    end

結果は以下の通りでした。

           user     system      total        real
    no 1  5.810000   0.160000   5.970000 (  6.045857)
    no 2  5.120000   0.150000   5.270000 (  5.311798)
    no 3  4.850000   0.130000   4.980000 (  4.990330)

目論見どおり、早くなりました。
よかった...

#おわりに
Testドリブンな開発を FizzBuzz を例にして行った形になりました。
Ruby が好きになってくれると嬉しいです。
エンジニア回顧録

この10年近く、IT業界の界隈で比較的に経営に近い立場で仕事をしてきた。
その間、何人ものエンジニアと仕事やプライベートを通じて交流してきたし、非エンジニアの僕がなぜか技術部隊のマネジメントをやらされたりもした。
そんな過去、現在のエンジニア諸氏との交わりの中でも、やはり何人か強く印象に残っている方々がいる。
そうしたエンジニアについて回顧録よろしく紹介してみたい。
今回は記念すべきその一回目であり、一人目のエンジニア（二回目を書く機会があるかどうか分からんが）。

<h2><span id="Aさんのこと" class="fragment"></span><a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB"><i class="fa fa-link"></i></a>Aさんのこと</h2>

Aさんは、、、年いくつくらいだろう。たぶん30代の半ばくらい。
webサービスやスマホアプリのフロントもサーバーサイドも一通りマルチにこなす。
キャラクターとしてはアニメやゲーム好きの、明るい感じのオタク。
そんなAさんとメシ食ったときの話。

<h2><span id="当時の状況" class="fragment"></span><a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB"><i class="fa fa-link"></i></a>当時の状況</h2>
当時の周辺状況を話しておかねばなるまい。
当時、僕とAさんは同じ会社に属していて、僕は技術部隊をマネジメントする立場として、「エンジニアの評価」がどうあるべきか、みたいな課題に向き合っていた。
多くのエンジニアが、
・技術スピードが速い中、キャッチアップが難しく、今はいいかもしれないけど10年20年先、自分の「旬」が過ぎたときに果たしてエンジニアとしてやっていけるのか
・さりとて「得意不得意」を考えたときにプロマネやSEといった上流エンジニアリングに自分が適しているか分からない
結果、自分のキャリアパスに自信と確信を得られずにいる、といった悩みを持っていたように思う。
Aさんとメシ食ったのはそんな時期のことで、僕としてはいろんなエンジニアにヒアリングをしたいという思いがあった。

<h2><span id="ヨボヨボのじーさんになっても" class="fragment"></span><a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB"><i class="fa fa-link"></i></a>ヨボヨボのじーさんになっても</h2>
なんていうのか、爽快な裏切りだった。
まあAさんも他の皆と同じように悩んでるんだろう、と思って話を聞いていたところ、Aさん曰く。
「そりゃ、いつか技術に置いて行かれるでしょうね。でも僕は使い物にならないかもしれないけど、それでもヨボヨボのじーさんになってもプログラムを書き続けていたいんです」
と。
なんの気負いもなくそう言うAさんと話しながら僕は自分が恥ずかしくなった。

<h2><span id="ただ好きなだけ" class="fragment"></span><a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB"><i class="fa fa-link"></i></a>ただ好きなだけ</h2>
Aさんはただただプログラムを書くことが好きなのだ。
好きなことを一生やっていたい。ただそれだけ。
多くのエンジニアが悩むような、「技術についていけなくなるかも」、「エンジニアとして食っていけなくなるかも」といったことは二の次なのだ。
そんな悩みよりも自分の好きなことをやっていた方が幸せだという、純粋にして最強の哲学！

翻って自分はどうであろうか考えさせられた。
「好きなこと」、、、できてねーなぁ。
まあ、それは人それぞれ。良い悪いの話じゃないけど、Aさんとのこの会話は今もずっと僕の中に強い印象を残している。
ブロックチェーンはどのようなサービスで活用できるのか

ブロックチェーンが実際にどういうことに使えるのか? ということで調べたのでまとめました。

# ブロックチェーンとは

いろんなサイトや本でブロックチェーン入門ということで扱っていますし、それらよりわかりやすく説明できる気もしないので、ここでは簡単に紹介だけします。
すごい簡単にいうと、各取引の内容(またはその一部)を参加者全員が把握でき、参加者の一部がその取引を検証し、安全性を保つというものです。取引において中心となる組織がないというのも大きな特徴です。
また、ブロックチェーンを大きく分けるとパブリックブロックチェーンとプライベートブロックチェーンの二つがあり、それぞれで特徴が大きく異なるので、気になる方は調べてみてください。
パブリックブロックチェーンの例としてはビットコインが有名ですが、それ以外にもイーサリアムというプログラムをブロックチェーン上に載せられるものや、通貨交換の仲介を目的としたリップルというものもあります。
プライベートブロックチェーンは銀行などが利用しようとして、検証実験を行っているそうです。

# 何ができるか

ブロックチェーンの活用方法として、大きく分けると二種類になると思います。
メインのサービスとしてブロックチェーン自体の特徴を生かしたものと、ブロックチェーン自体は単なる送金目的で使い、参加者のマシンパワー等をメインとして扱うものがあります。
前者のサービスが例としては圧倒的に多いです。
以下にそれぞれの例をあげていきます。

## ブロックチェーン自体の特徴を生かしたもの
 * 取引が可視化でき、改ざん困難
 
 信頼性が大切なものに利用可能。
土地の所有件、絵画やダイヤの真贋保証、著作権、選挙、契約、株式取引、貿易
これらに導入することで、今までその価値や信憑性を保証していた中間の組織が不要となり、手数料の面でのメリットがある。

* 公平性の担保

中間組織は存在せず、組織の意図が参加者の不利益につながりづらい。
メディアやカジノと相性が良いと思われます。
特にメディアで活用するという考えが気に入っています。
今はメディアが独断で取り上げるニュースを選んでいるので、メディアの意図が入りまくりです。そではなく、いい記事を書いた人に報酬を付与し、またその書かれたいい記事を早くに見つけた人にも報酬を与えることで、参加者は厳選された良い記事を見れるというものです。

* 信頼性

個人の履歴書に活用しようというもの。
ブロックチェーンの、過去の記録ほど改ざんしにくいという特徴を生かし、自分がしてきたことをどんどんブロック上に記録していき、またそこに第三者の承認も組み合わせていく。
例えばある大学を卒業したという記録をブロックチェーンに自分で書き、大学側もその事実の保証をブロックチェーン上でする。
そうすることでその人の経歴は信頼性のあるものとわかる。


* 複数の組織を介するとりひきにおいての品質保証の確認が簡単

取引が可視化でき、改ざん困難という特徴と被るが、それに加えて保証の確認が簡単にできるということで、貿易や食品流通での運用と相性が良い。

* 非中央集権でない

企業のサービスの一部をパブリックなブロックチェーンに載せることができれば、その企業が潰れようともそのサービスは潰れなくなる。企業の発行するポイントをパブリックブロックチェーンに載せるなど。

* 情報の管理と金の流通が一元化できる

全員がすべての情報を見れると困るが、そこに気をつけた上で、国が管理している個人情報をブロックチェーンで全て管理、給料などもブロックチェーン経由で受け取ることで、税金も全てブロックチェーン上で完了する。
エストニアがこれと似たことをしているらしいです。



## 参加者のマシンパワー等をメインとして扱うもの
多くの人が参加者になるということを生かしたサービスです。

* 参加者にマシンパワーを提供してもらい、その対価として報酬を与える。

ビットコインはマイナーがマシンパワーを使って取引の正当性を保証するかわりに、対価をもらいます。
また、ARやVRなどのマシンパワーを必要とするとき、ブロックチェーンの参加者のマシンパワーを借りて、その報酬をブロックチェーン上で払うというサービスの開発もあります。

* 参加者にストレージを提供してもらい、その対価として報酬を与える。

参加者はストレージをブロックチェーン上で提供し、利用者はそのストレージを分散データベースとして利用できます。参加者はストレージを提供し続けることで、それに対しての報酬を受け取り、その報酬は利用者のストレージ利用料から出ます。


* インターネット広告の代わり

利用者視点だと、広告は邪魔ですよね。ページやアプリの作成者も邪魔と思われる広告をできれば載せたくないはずです。しかし、収入のためには広告は必要です。
そこで、広告ではなくページやアプリの訪問者のマシンパワーを借りて、マイニングしちゃうことで利益を出そうとするものです。
実際に勝手にその仕組みを導入したサイトがあり、物議を醸していましたが、大抵の人にとってはcpuを少し使われたことの影響はないはずなので、セキュリティなどの課題をクリアすればいいアイデアだと思います。

## その他サービス

* 電力システムをブロックチェーンのように管理する

これもブロックチェーンというのかはよくわからないのですが、面白かったので書きます。中央集権をやめるという意味ではブロックチェーンの特徴があるのだと思います。
今までは電力会社から一方的に電力を買っていただけですが、それが太陽光発電など、家庭でも発電できるようになった現代では、家庭と家庭間でも電力を売り買いできるようにできる方が良いよねというものらしいです。また、家の外での携帯の充電なども、今充電にこれだけ電力を使ったから、携帯の持ち主から何円支払われます、とかいう事ができるかもしれないらしいです。盗電の心配が無くなります。

* ICO

これはすでに多大なる影響をもたらしていますね。ICOとは、企業が「これからサービスを作るから、そこで使える仮想通貨を安い値段で売ります」みたいな感じで売り出して、資金調達する手段です。アメリカではかなり盛んに行われていて、ベンチャーキャピタルの投資額を上回っているそうです。ICOの良い点は、株を売るわけではないので、経営を外部に管理されるような事態に陥りにくいとこです。また、現時点では規制はほぼないという状況ですので、VCからの資金調達やIPOなどよりはるかに簡単に行うことができます。しかし、問題はかなり深刻です。現在数多くあるICOの大半は詐欺か、ちゃんとした計画がない状況です。ICOでは悪い情報を公開する義務もなく、プロジェクトの進行状況も報告する義務もないので、そのような状況になるのは当然ですね。ICOという資金調達手段はかなり画期的ですが、何らかの規制や監査機関は必要不可欠です。

# まとめ
ブロックチェーンを使った意味のあるサービスはなかなか難しいです。
これをブロックチェーンでやろう！となっても大体は中央集権的な今までの仕組みでよくない？となります。
しかし、うまく活用すれば今までに無い価値が提供できる可能性を秘めていると思うので、ブロックチェーンのメリットとデメリットをちゃんと捉えていきたいですね。
Cloud ShellとAWS Cloud9を比較してみた


先日AWS Cloud9がリリースされて見てたらCloud Shellでもできるやつだなって思ったので比較してみようと思います。

ちょっとまとめてみました。
基本GCP視点からです。
AWS素人なので的外れなこと言ってるかも知れません。

## Cloud Shellとは？

GCPのクラウド上で実行できるコンソール環境です。
https://cloud.google.com/shell
いつもGCPのハンズオンはここでやるようにしてます。

## Cloud9とは？

AWSのクラウドコードエディタです。
https://aws.amazon.com/jp/cloud9
なんか良さそうな雰囲気を感じます。

## 比較

||Cloud Shell|Cloud9|
|:----|:----|:----|
|コンソール|○|○|
|エディタ|○|○|
|共有|アカウント別|共有|
|マシンタイプ|ある…？|ある|
|ディスク|5GB|8GB?(変更可能っぽい)|
|料金|無料|有料|

○×△で書きましたが、あるないについてだけです。
評価ではありません。

### コンソール

両方ともあります。
Cloud Shellはその名の通り先にコンソール環境だけが存在していました。
あとからコードエディタが追加されました。
tmuxとかも最初から入ってます。
コンソール上のシェルでGCPサービスのプロジェクトは認証済みです。
gcloudコマンドの補完が最初から設定されてます。
コマンドよく知らない人にも優しいです。

当然Cloud9にもコンソールあります。
awsコマンドに補完がきいてないので初心者の自分としては何のコマンドがあるのかよく分からず辛いです。

- コンソール環境は両方ともある
- コマンドの認証は設定済みの状態
- 何か専用の環境変数とかもいくつか設定されてる
- 補完がきいてたりきいてなかったり

### エディタ

Cloud9にはコードの同時編集があるようです。
あとデバッグもできるらしいです。
すごいですね。
後述の共有についても書きますが、EC2インスタンスで動くので他のユーザーとも同じインスタンスに接続して同時編集をすることが可能らしいです。
最大の接続数はわかりませんけど、チームで同じリソースいじろうと思ったらけっこうなパワーが必要になるんじゃないかな。
誰かがビルド始めたせいでエディタ遅くなったとか戦争が起きるような気がしないでもないんですが。

同時にファイルいじってたらコンフリクトしまくってビルド時にエラー吐きまくるとかありそうなので同時編集って嬉しいのかな？ってのが甚だ疑問ではあります。

Cloud Shellにもコードエディタはあります。
後付で追加されました。
といってもけっこう前からあるので知ってる人は知ってるんじゃないかな。
あとファイラーとしても使えます。

- Cloud9はコードの同時編集が出来る
- エディタで実行してデバッグも出来る

### 共有

Cloud Shellは完全にアカウント別です。
共有はありません。
セッションのたびに専用のインスタンスが作成されているような感じです。

Cloud9はEC2インスタンスにClou9が入った状態で作成されます。

- Cloud Shellはアカウント毎に独立
- Cloud9はユーザー同士で同時接続可能

### マシンタイプ

Cloud Shellの△については、Boost Modeというものがありまして、インスタンスのマシンタイプをブーストしてパワーアップできます。
これは24時間持続します。
しかし、数回使ったことあるんですがこれパワーアップしてるのを実感したことがないです。
これは今までにCloud Shell上でゴリゴリコードを書いたり開発したりすることがなかったせいじゃないかと思うので実感してないだけだと思います。

- Cloud Shellはしょぼめ
	- Boost Modeでちょっとパワーアップ出来る
- Cloud9は自分で選べる

## ディスク

Cloud9の方は作成時にディスクサイズの指定は出来ませんが、EC2インスタンスなのであとからディスクサイズ増やせそうです。
デフォルトで作ると8GBでした。

Cloud Shellの方はホームディレクトリに5GBのディスクが割り当てられてます。
セッションを切ってもこの領域だけは保持されます。
それ以外の領域はセッションを切ると初期化されます。
この領域はどうやっても現時点では増やせません。
有料で良いからPersistent Diskのアタッチ出来たら良いのになあ！

- Cloud Shellは5GBのみ
- Cloud9はあとから変えられる

## 環境

### 起動

どちらも動いてない状態からだとそこそこ時間かかります。
Cloud9は初回作成時はけっこう時間かかりました。
あとChromeでAdblock動かしてたら延々ロード中でいつまで経っても画面が表示されずに最初困りました。

Cloud Shellは専用インスタンス作成してるので遅いです。

- Cloud9は初回起動時のみけっこう時間かかる
- 2回目以降のStop状態からは早い
- アイドル状態だと止まるような設定があるので安心
- Cloud Shellは新しく接続すると毎回インスタンス作成するので遅い

### 言語

Cloud9は[40種類の開発言語](https://docs.aws.amazon.com/cloud9/latest/user-guide/language-support.html)が用意されてるみたいです。
たくさんあるのでこまいことは把握してません。
Cloud Shellの方はGCPのサービスで主にサポートしてる言語が用意されてる感じで謳われてる言語の数はもうちょっと少なそうです。

Cloud ShellはタイミングはGoogle次第ですがインストール済みのツールも勝手にアップデートされていきます。

### その他ツール

どちらの環境もgitやらvimやら色々入ってるのでターミナル環境で開発するにはすぐに始められると思います。


## 料金

Cloud9は有料です。
Cloud Shellは無料です。
Boost Mode使っても無料です。
有料で良いからPersistent Diskのアタッチ出来たら良いのになあ！（2回目）

## まとめ

こんな感じで、それぞれ方向性が違いますね。

- やれることは大体一緒
- 共通点
	- コンソールある
	- エディタある
	- それぞれのサービスのコマンドラインとかはシームレスに使えるようになっている
- 違う点
	- Cloud9の方が細かくスペックを指定できる
	- 料金かかる（Cloud9）、料金かからない（Cloud Shell）
	- スペック指定、変更できる

Cloud9で出来ることをGCPでやろうとしたら自分でGCEインスタンス立てる必要がありますね。
ただしそれはフルマネージドではないので自分でメンテする必要がありますね。

Cloud9と似てるって意味ではDatalabの方が近いかも。
こっちはGCEインスタンスを作ってそこでJupyter Notebook動かしてるので、IDEではないですけど同じインスタンスに接続すればみんなでコード共有できます。

どのクラウドを使っているかとか関係ないのなら…

**まあ好きな方使えばええんちゃうか？**
チーム利用に最適なパスワード管理ツール比べてみた

#パスワード管理ツールって？
いろんな便利な複数のWebサービスやアプリが凄まじいスピードでどんどん生まれています。

良いWebサービスやアプリは積極的に利用していきたいのですが、その都度パスワードを覚えるのは面倒ですよね。

かと言って全て同じパスワードにするなど・・・
想像するだけでも恐ろしいです:scream:

しかも、メンバーが共有して頻繁に利用するサービスもたくさんあり、
メンバーが増える度に「これのパスワード何だった？」って事がよくあります。

そんな時に便利なのがパスワード管理ツールです。

各Webサービスやアプリ毎に複雑で推測されにくいパスワードを一括で管理してくれるツールです。

#良さそうなパスワード管理ツールの機能比較
【前提】
・チームで共通で利用できる。
・デバイス間で同期して利用が可能。

##1.1Password
![スクリーンショット 2017-12-23 22.02.27.png](https://qiita-image-store.s3.amazonaws.com/0/210891/b0576a8c-68e5-c99a-0dc7-555b556cdfa4.png)

【メリット】
◎マスターパスワードの1つだけ管理すれば複数のパスワードを管理できる。

◎有名なサービスは事前に管理フォーマットが用意されているので使いやすい。

◎自分でオリジナルの管理項目も作成できるので様々な情報を管理可能。

【デメリット】
▼以前は無料版があったみたいですが、現在は月額有料版(1ユーザー$2.99/月〜)のみ。

▼公式サイト、アプリは全て英語表記なので注意が必要。

【公式サイト】
https://1password.com/
【iOSアプリ】
https://itunes.apple.com/jp/app/id568903335
【Androidアプリ】
https://play.google.com/store/apps/details?id=com.agilebits.onepassword&hl=ja
##2.LastPass
![スクリーンショット 2017-12-23 22.07.21.png](https://qiita-image-store.s3.amazonaws.com/0/210891/1540b38e-44ef-4b4b-8b44-64ae6d239f1a.png)

【メリット】
◎マスターパスワードの1つだけ管理すれば複数のパスワードを管理できる。

◎公式サイト、アプリは基本日本語化されている。

◎有名なサービスは事前に管理フォーマットが用意されているので使いやすい。

◎自分でオリジナルの管理項目も作成できるので様々な情報を管理可能。

【デメリット】
▼無料版もあるがデバイス間で利用する際は有料版(1ユーザー$2/月〜)にアップグレートが必要。

【公式サイト】
https://www.lastpass.com/ja
【iOSアプリ】
https://itunes.apple.com/jp/app/id324613447
【Androidアプリ】
https://play.google.com/store/apps/details?id=com.lastpass.lpandroid&hl=ja
##3.SKUID（スクイド）
![スクリーンショット 2017-12-23 23.49.47.png](https://qiita-image-store.s3.amazonaws.com/0/210891/45b7ba9f-69c6-6127-6a1b-bb5ec2d502e4.png)
![スクリーンショット 2017-12-24 0.04.13.png](https://qiita-image-store.s3.amazonaws.com/0/210891/f7a7cbb4-1ad0-55d6-01da-535628bd334a.png)


【メリット】
◎IT業界で様々なサービスを展開するGMO社製でMADE IN JAPANでわかりやすい。
国内アプリにも強そう。https://sku.id/service/index_list.html

◎基本料金０円で様々な機能を利用可能。
https://sku.id/price/
![スクリーンショット 2017-12-24 0.10.36.png](https://qiita-image-store.s3.amazonaws.com/0/210891/6a3f542b-d863-e664-a21d-2feef61361c4.png)


【デメリット】
▼スマホでの対応が現時点で無し。（順次対応とのこと）
![スクリーンショット 2017-12-24 0.12.00.png](https://qiita-image-store.s3.amazonaws.com/0/210891/4239b74c-51eb-156c-c4f9-eafe7c829fe3.png)

【公式サイト】
https://sku.id/

#まとめ
色々調べましたが、機能はどこも似たようなものだし、有料ばかりでした。

しかし、GMO社のSKUID（スクイド）は圧倒的に良さそうです。なんとSKUIDは2017年11月15日にプレスリリースが出たばかりです。

まだ不確定要素な部分もありますが、無料で利用可能な機能がズバ抜け過ぎてる気がします。

百聞は一見にしかず、基本無料なので早速利用してみます！！
rails migration 生SQL トランザクション

#migration時に生SQLを使ってかつトランザクションを設定したい時の書き方

エラー時にrescueでcatchし、ロールバックするようにする。
migrationでエラーしたことがわかるようにrescueでキャッチした後、raiseを実行している。

```ruby:
# sqlAまたはsqlBでエラーした場合、ロールバックされる。両方とも成功した場合にcommitする。

class ChangeTests < ActiveRecord::Migration
  def up
    begin
      ActiveRecord::Base.connection.execute("start transaction") 

      sqlA = "update tests set price = 1000 where status = 1;"
      ActiveRecord::Base.connection.execute(sqlA)

      sqlB = "update tests set price = 2000 where status = 2;"
      ActiveRecord::Base.connection.execute(sqlB)
    
      ActiveRecord::Base.connection.execute("commit") 
    rescue
      ActiveRecord::Base.connection.execute("rollback")
      raise "エラーが発生したのでロールバックしました"
    end
  end
end

```
JavaScriptで悪戦苦闘

やりたいことはこれ
HTMLにJavaScriptを組み込んで、
工数を入力し、次式で求める標準工数を表示する
標準工期=（工数の３乗根）×2.5

失敗はこれ
①３乗根を求めたいが、結果が１になった。
　原因は、文字列を数値変換するときにparseInsを使っていたので、整数になっていた。浮動小数点parseFloatにした。
②計算ボタンを押しても、結果が表示されなくなった。
　原因　関数の大文字小文字が影響するとは知らなかった
　誤　parsefloat
　正　parseFloat
③計算ボタンを押しても、結果が表示されなくなった。
　原因は、```</script>```が無かった（恥;）
④外部ソースファイルのファイル名を間違った
　原因　はじめのうち、JavaScriptを外部ファイルにしていた。改良していく途中で内部にした。
　```<script type="text/javascript" language="JavaScript" src="課題2.js"></script>```
⑤計算ボタンをクリックしたが、計算結果がアラート表示されないので、JavaScriptかHtmlのどこかが間違ったと思ってデバッグをしていたが、アラート表示がウィンドウの後ろにあり、OKボタンが押されていない状態だった。つまり、計算ボタンが無効のまま押していた。（恥;）

*反省*
ブラウザについているデバッグモードを十分に活用しよう
やっと出来上がったのはコレ。
```html:課題.html
<body>
<h2> 内部スクリプトの実行 </h2>

<h3>標準工期</h3>
	<form name="bekijo">
		<input type="text" value="100">工数(人月)<br> <!-- 基数 -->
		<input type="text" value="0.333333">3乗根<br> <!-- 指数 -->
		<input type="button" value="計算" onclick="beki()">
	</form>

	<script>
	function beki(){

  	//基数と指数をそれぞれ浮動小数点の数値に変換(parsefloat)して変数に格納
  	var num1=parseFloat(document.bekijo.elements[0].value);
  	var num2=parseFloat(document.bekijo.elements[1].value);

  	//べき乗を求めてアラートで表示
  	alert( "工数の3乗根は " + Math.pow(num1,num2) + "\n"
		 			+ "標準工期は   " + 2.5 * Math.pow(num1,num2) + "ヵ月" + "\n"
		 			+ "25%短縮工期は" + 2.5 * Math.pow(num1,num2) * 0.75 + "ヵ月");
	}
	</script>
</body>
```
量子情報科学のイロハのイを書いてみた

#量子コンピュータアドベントカレンダー
[量子コンピュータアドベントカレンダー2017](https://qiita.com/advent-calendar/2017/quantum)
アドベントカレンダ(本来はチョコとかが入っているクリスマスまでの日数カウントダウン可能なアツいカレンダ)風になにかの記事を書く文化が日本のITらへんの業界にはあります。いや、他国にもありそうだしひょっとしたら他国由来かもしれないです。(ググる気力すらない)
も〜うい〜〜くつねーるーと〜〜クリスマス♪みたいな感じでクリスマスまで毎日楽しい記事を1つづつ読むことができます。最高ですね(疲れてくると"最高"などという定量性のかけらもない表現に逃げがち)。
量子情報科学をサークルで輪講(本を章ごととかで分担して講義しあいっこ)していたのですが、ある先輩が「量子コンピュータのアドベントカレンダあるよ、やってみたら？」とお声かけ下さいました。そういうわけで記事をかきました。12/16日分になります。
既にLaTeXで書いてあった記事を移植・修正してサークルのはてなブログに公開したのですが、意外とやり方がわからず、先輩に助けていただきつつアップしました。(ありがとうございました。)
#量子情報科学序論　イロハのイ
[『量子情報科学序論 IBM Qを動かして学ぶ量子コンピュータ』](http://lyncs.hateblo.jp/entry/2017/12/16/000103)
ニューヨークのIBMの研究所に、IBM Qという量子コンピュータがあるのですが、それを操作できるレベルまでかるーくふんわり量子計算について書きました。これは量子回路と一般的に言われる方式の量子コンピュータで、わりかし使える計算の汎用性が高いです。いい感じに「量子コンピュータってどんな計算すんの？」という疑問にふんわり答えられた気がします(自画自賛)

大変ありがたいことに他のアドベントカレンダ参加者の方が読んでくださったようで、記事内で私の記事を紹介してくださいました。こういうことは初めてだったのでビックリしました。
Project OpenQLさん、ありがとうございました。
@openql
[SymPy で量子プログラミングを体験してみましょう](https://qiita.com/openql/items/e5b98bcd13fb4f0b6d59)
SymPyで量子回路のシミュレートをする記事なのですが、QISKIT(IBMQなどで使う量子計算機制御言語。オープンソースで開発チームのslackも簡単に入れる)が直接量子ビットを操作している感が強いのに対して、いわゆる"プログラム"をしている感じがして非常に有用だなと感じました(回路を物理的にいじって"プログラマブル"と言っていた時代は残念なことに経験できていない世代なので”プログラム”に関しての認識が甘いところはあるかもしれない)。
Q#,QISKITなどの量子プログラミング言語が増えて来て量子コンピュータがだんだん高レイヤーに来た感じがしてワクワクしますね！
これからも量子計算理論を楽しくやっていこうと思います。それではまたどこかで。
Dimension + CSS animationでクリスマスっぽいものをつくってみた

#はじめに
こんにちは、LIFULLのデザイナー3年目shinohakです。
本記事はLIFULL Advent Calendarその2の23日目の記事になります。

今回はクリスマスっぽいものをつくって、動かしてみたいなーと思います。

#Dimensionでつくろうと思った理由
Twitterでこのツイートをみかけて、「わたしもつくってみたい！」と思ったのがきっかけです。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Dimensionに最初から入っているモデル（とPsの3D押し出し）で何か作りたくてクリスマスっぽいものを作ってみた🎄<br>モデルの大きさを変えてるだけだからAiやPsで矩形つかってイラストを描くことに近いなーと思いました🎅<br>📅まだまだ登録お待ちしております…🎅<a href="https://t.co/W0pHGiXHUg">https://t.co/W0pHGiXHUg</a><a href="https://twitter.com/hashtag/adobedimension?src=hash&amp;ref_src=twsrc%5Etfw">#adobedimension</a> <a href="https://t.co/cFUleISLqm">pic.twitter.com/cFUleISLqm</a></p>&mdash; まりめぉ太郎👻😈 (@marimelody11) <a href="https://twitter.com/marimelody11/status/942409312252522497?ref_src=twsrc%5Etfw">2017年12月17日</a></blockquote>

#Dimensionでつくる
##アセットを組みあわせてつくる
![02.png](https://qiita-image-store.s3.amazonaws.com/0/146113/eef1c1c9-b825-9346-5223-2b4eb7fd3fb5.png)

##色をつける
![MerryChristmas.png](https://qiita-image-store.s3.amazonaws.com/0/146113/f92ee00a-e105-9c97-168a-9e4d786f6c6e.png)
ここでの注意は、16bitで書き出すということと、発光の設定はいじらない方がいいです。
※あとでホームズっぽいのに替えられたら替えたい

#CSS animationをつける

HTMLはこんな感じ

```HTML
<div class="wrapper">
  <div class="snow01"></div>
  <div class="snow02"></div>
  <div class="snow03"></div>
  <img src="MerryChristmas.png" class="christmasImage">
</div>
```

CSSはこんな感じ

```css
@keyframes snow {
  0% {
    background-position:0 0;
  }
  100% {
    background-position:0 1000px;
  }
}
.wrapper {
  width: 100%;
  background-color: #a6cff6;
  height: 1000px;
  position: relative;
}

.wrapper .snow01,
.wrapper .snow02,
.wrapper .snow03 {
  display: block;
  position: absolute;
  width: 100%;
  height: 1000px;
}

.wrapper .snow01 {
  background-image: url(snow01.png);
  animation: snow 30s linear infinite;
  opacity: 0.2;
}

.wrapper .snow02 {
  background-image: url(snow02.png);
  animation: snow 20s linear infinite;
  opacity: 0.3;
}

.wrapper .snow03 {
  background-image: url(snow03.png);
  animation: snow 25s linear infinite;
  opacity: 0.4;
}

.wrapper .christmasImage {
  position: absolute;
  bottom: 200px;
  left: 0;
  right: 0;
  margin: auto;
}
```

#完成！
![03.png](https://qiita-image-store.s3.amazonaws.com/0/146113/b3542499-6100-602b-4ebd-f66eee8be5e8.png)
デモはこちら→https://codepen.io/shinohak/pen/PEbGza

#おわり
雪のレイヤーを3つくらいにわけてみると、簡単なanimationでもそれっぽく見えますね。
これならメインビジュアルの表現としてもできそうです。

Dimensionの楽しさや可能性に気づかせてくださった、まりめぉ太郎さんに感謝です。
すごく作っていて楽しかったです。これからもDimensionでいろいろ作ってみたいと思いました。

それでは短いですが、最後までお読みいただきありがとうございました。
MerryChristmas!
ウィキデータ x シビックテックの可能性

#はじめに

今年に入って全国でウィキペディアタウンが盛んに開催されている。どのくらい開催されているかは、アウトリーチを読めばわかる。非常に長いリストとなっていてページ分割の話が出ている程だ。

【参考】 [プロジェクト:アウトリーチ‎ | ウィキペディアタウン](https://ja.wikipedia.org/wiki/%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88:%E3%82%A2%E3%82%A6%E3%83%88%E3%83%AA%E3%83%BC%E3%83%81/%E3%82%A6%E3%82%A3%E3%82%AD%E3%83%9A%E3%83%87%E3%82%A3%E3%82%A2%E3%82%BF%E3%82%A6%E3%83%B3/%E3%82%A2%E3%83%BC%E3%82%AB%E3%82%A4%E3%83%96)

大山街道を舞台に開催しているウィキペディア街道「大山道」も、本日で第14回目を開催となり、地元の名所・旧跡を対象にこれまで計37本の新規記事を作成してきた。そんな中で新たな試みとしてウィキデータ勉強会を開催した。

#ウィキデータとは

ウィキデータは「[ウィキデータ：はじめに](https://www.wikidata.org/wiki/Wikidata:Introduction/ja)」によると「自由・共同作業・多言語・二次情報を特徴とする、構造化データのデータベース」だ。

今回の勉強会では、これまで作成してきたウィキペディア記事を対象にウィキデータの登録作業を行った。対象記事に関して項目（item）、属性（property）、値（value）を登録する。例えば「宿場」の記事であれば、宿場周辺の風景画像、位置座標として緯度経度情報、コモンズのカテゴリ等のデータを登録する。

登録内容はデータベースに格納され、SPARQLクエリーによる検索が可能となる。

【参考】 [スライドシェア：記事を書いたらウィキデータに入力しよう！](https://www.slideshare.net/tk01k/ss-84348559)

ウィキデータの登録画面
![スクリーンショット 2017-12-23 23.31.25.png](https://qiita-image-store.s3.amazonaws.com/0/104146/d756eabc-0f86-3bd8-7254-598b605a5d1a.png)


#ウィキデータを活用したアプリケーションの可能性

ウィキデータを活用したアプリケーション作品例（小池さん作）
「[地図と位置情報によるウィキデータビューア](https://kokodata.midoriit.com/)」

自分の現在地付近にあるウィキデータ情報を地図上に表示。ウィキペディア記事と連動させることで付近の記事の存在を知ることも可能だ。

![スクリーンショット 2017-12-24 0.28.31.png](https://qiita-image-store.s3.amazonaws.com/0/104146/b8fe31c8-4dd4-bb7b-4ecb-409a71ad018a.png)

ウィキペディアタウンで、地元の名所・旧跡データを蓄積することに加え、ウィキデータを駆使することで、地域向けアプリケーション作りの可能性が広がっていく。今後これを活用したサービスが次々出てくるのではないと感じた。

ウィキペディア街道は来年も６回の開催を予定している。その中でウィキデータへの取り組みを進めていく予定である。

【参考】 [ウィキペディア街道プロジェクト](https://wikipedia-kaido.github.io/)

以上
あんな書式いいな、できたらいいな

どうもAdventCalendar4回目の専門学校界の旅キチ(自称)です。

unityで新しいC#スクリプトを作ると、最初はこういった内容になっていると思います。

```
using UnityEngine;
using System.Collections;
  
public class クラス名 : MonoBehaviour {

    // Use this for initialization
    void Start () {

    }

    // Update is called once per fram 
    void Update () {

    }
}
```

毎回毎回Awakeの関数を書き足すのは嫌だなあ…それに中かっこの書き方も自分と違うしなあ…最初からそうなっててくれればなあ…

ちょっと待った、**そのテンプレート、変えられます**。

`Unityをインストールしたフォルダ\Unity\Editor\Data\Resources\ScriptTemplates`、そこにやつは居ます。
`81-C# Script-NewBehaviourScript.cs`、こいつの中身を開いてみるとこうなっています。

```
using UnityEngine;
using System.Collections;
  
public class #SCRIPTNAME# : MonoBehaviour {

    // Use this for initialization
    void Start () {

    }

    // Update is called once per fram 
    void Update () {

    }
}
```

おおっとこいつには見覚えがある。そう、まさにこれがC#スクリプトを新規作成した際のテンプレートになるのだ。
あとはこいつを煮るなり焼くなり好きにするといい。きっとコクが増して美味しくなるだろう。

ついでに良いスパイスも教えておこう。

```
#region 名前
(コード)
#endregion
```
	
を挿入すれば、関数でなくとも関数のように折りたたむことが可能になる。(もちろん折りたたみ機能が存在するテキストエディタに限るが。)

環境をより良くして、更に良き開発ライフを。
ドローンプログラミング入門

[TECH PLAY 女子部 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/techplaygirls) の23日目を担当します！
クリスマス・イブ・イブ。

最近のドローンに事情について振り返りつつ、
ドローンプログラミングに興味がある人に[現場](https://www.sensyn-robotics.com/)からお伝えします。

#ドローン市場の温度感
期待度の高さは、毎日ようにリリースされるドローン関連のニュースから感じることができます。
１２月のニュースリリリースの一部です。
[通信機器メーカーの中国HUAWEIが描くドローン戦略](https://www.dronetimes.jp/articles/2370)
[ドローン遭難救助で「釣り具」が生きる　「ダイワ」がノウハウ活用](http://www.itmedia.co.jp/news/articles/1712/21/news102.html)
[ドローン、１８政令市へ追加配備　消防庁、災害情報収集に活用](http://www.tokyo-np.co.jp/s/article/2017121601001620.html)
[American Roboticsが全自動農業用ドローン「Scout」を発表](https://www.borg.media/scoutagriculture-2017-12-11/)
[ドローン専用建物点検アプリ「TERRA DRONE INSPECTION」の開発開始2018年度内　実用化予定](https://prtimes.jp/main/html/rd/p/000000039.000020194.html)
[ＪＲ九州、鉄道設備点検にドローンを導入](https://www.nikkei.com/article/DGKKZO24510940R11C17A2TI1000/)
などなど.....

ちなみに、Qiitaではこれからって感じです。

| 技術要素   | Qiitaヒット件数 |
|:----------|----------:|
| ドローン　　　|　 　　　　　154|
| C#     |　 73,626|
| python | 26,599|
| PHP    |　 22,857|
※2017年12月23日時点
ドローンは機体の普及がこれからなので、爆発的に伸びると予想されている来年に以降に期待ですね。

#ドローンプログラミングのはじめ方
##レベル１：オススメ書籍を読む
[トコトンやさしいドローンの本 (今日からモノ知りシリーズ)](https://www.amazon.co.jp/dp/4526076201/)
入門書ですが、ドローンに関する基礎知識がわかりやく書いてあるのでオススメです。

[ドローンビジネス参入ガイド]
(https://www.amazon.co.jp/dp/479815198X/)
ドローンのビジネス市場について、現在〜これからが詳しくまとめられています。
[ブイキューブロボティクス](https://www.vc-robotics.com/)のDRONEBOXも掲載されてます♪

##レベル2：ドローンに触れてみる。飛ばしてみる。
[2017年版 ドローン講師が選ぶAmazonで買える一万円程度の最強ドローン3選【おすすめドローン】](https://www.droneagent.jp/flights/2017-amazon-10000yen/)
わたしは、[DRONE STAR 01](http://amzn.to/2BFoXN0)で遊びました。
ジャイロが効いているので、ちっちゃいけど飛ばしやすかったです。
まだプログラミングができないので、個人用で遊べるように期待しています。
[誰でも簡単にドローンプログラミングが学べるアプリ、「DRONE STAR™ プログラミング」を発表](https://www.dronestar.jp/20171219/)

ここでご紹介したトイドローンはプログラミングできないモノもあるので、
始めからレベル４を目指しているなら吟味が必要です。

##レベル3：OSSに触れる。
ここはレベル2と悩みましたが、
「楽しく始める」には実機で遊んで「体感」することが大切だと思ってこの順番にしています。
前にも書いたようにレベル４でご紹介する高性能なドローンが必要になりますが、
エミュレータがあるので、プログラミングして、確認することができるのでご安心を！

まさにこんな記事がありました。
分かりやすくリンクがまとめられているので、気になるものを試して見るといいと思います。
[ドローンにもオープンソース化の流れがある](https://qiita.com/nonbiri15/items/d36ba908c8469cc97518)

##レベル4：OSSを実機で検証する。
レベル２に比べると高めの実機が必要になります。（性能を追い求めたら青天井です><）
最近ではお手軽にできるようなので、新しいドローンが欲しくなります。
[ミニドローン Parrot MAMBO を Node.js で飛ばす（Windows 編）](https://qiita.com/mkoku/items/7458239f5bcca88eed49)

場所自体はまとめサイトがあるので便利です。
もちろんドローンの大きさや自動操縦、直線飛行など目的にあった場所の選定は必要です。
[関東地方のドローン練習場 39ヵ所 最強まとめ！](http://viva-drone.com/drone-training-facilities-in-kanto/)
[【ドローン練習】都心から1時間以内のドローン練習場まとめ（関東編）](http://bit.ly/2BHeHUk)
[【千葉】DRONE TECH屋外トレーニング場利用予約](http://bit.ly/2DGbP7K)

##これから
今はいろんなSDKで遊んでいます。（レベル３）
IoT界隈で馴染みの薄い.Net Frameworkを採用している素敵なSDKもあるので楽しみです。
デバイスに縛られないってのも魅力です。
今からでも遅くない、xUnitでテスト駆動開発を実践するためのテストパターン -- Part 1: テスト戦略

## テスト駆動開発っていいよね

プロダクトコードをいじる前に、まずはテストコードを書いてから、プロダクトコードを書きます。
最初のプロダクトコードではテストは落ちるけど、一通りいじり終わってから、テストをもう一回流して、テストが通ったら出来上がり～

テストコードを先に作っているから、テストしづらいプロダクトコードにはならないはずです！
そして、保障したい動作も振る舞いも全部テストコードに書いておけば、境界値周りのプロダクトコードの動きも心配要りません！

テスト駆動開発は素晴らしいですよね！ぜひぜひ開発の現場で実践したいですよね！

あ、プロダクトコードとテストコードが長いので、これからソースとテストを略させてください。テスト駆動開発もTDDと略させてください。

## でもうちじゃ無理だ、と思ったりする？

うちの現場はカッチカチな密結合のレガシコードばかりで、TDDはAPI設計の段階から気をつけてやらないと無理だろう、と思って、実際始める前に諦めていませんか？

実は、いくつのユニットテストパターンを適用することで、密結合なレガシコードでもTDDでやっていけるかもしれません。

以下では、二部構成でその裏にある基本的なテスト戦略と、実際のパターン紹介と適用場面を順に説明していきます。

この記事は主にテスト戦略に着目します。
パターンの方は実際のコード適用例を交えて説明していきたいと思います。

## 本題に入る前にちょっとした用語集

* SUT[^sut]: テスト対象となるコンポーネント
* DOC[^doc]: テスト対象となるものが依存する別のコンポーネント

* 間接入力: SUTが呼び出すDOCのメソッドのうち、その戻り値や例外が、SUTの振る舞いを影響するもの
* 制御ポイント: SUTの振る舞いを制御するため使った間接入力

* 間接出力: SUTが呼び出すDOCのメソッドのうち、その引数または呼び出しそのものが、SUTの振る舞いに影響されるもの
* 観測ポイント: SUTの振る舞いを観測するため使った間接出力

## 基本的な戦略 -- 外堀をうまく使う

密結合しているコードのうち、テストしたい部分(SUT)と、依存されている部分(DOC)をまず見分けます。
本命(SUT)とその周りの親友たち(DOC)をちゃんと区別して、外堀を埋めてから本命を落とす、というのが基本的なコンセプトになります。

うーん、なんか恋愛ゲームっぽい説明ですね。でもしっくり来るから恋愛ゲームを例に説明し続けます。

### SUTの制御 -- 周りをうまく使ってフラグを立てる

SUTの制御は普通、SUTの外部向けメソッドを使って、引数の値で制御します。
外部向けのメソッドだけで制御しきれない場合、もしくは制御するためのメソッドがない場合、DOCの制御ポイントを使います。

恋愛ゲームを例に説明すると、こんな感じになります。

* 攻略キャラとの会話 = SUTの制御用メソッド
* 攻略キャラと直接関係していないイベント・周りのキャラとのイントラクション = DOCの制御ポイント
* エンディング = SUTの実行フローによる観測可能な最終出力
 
攻略キャラとの会話をこなしつつ、周りのイベントをそれっぽい方向に持っていけば、狙いのエンディングに行けるはずです。

### SUTの観測 -- 好感度チェックはヘルプキャラに聞く

SUTの観測も普通、SUTの外部向けメソッドを使って、戻り値が期待した通りかどうかで観測します。
外部向けのメソッドでの観測が不十分な場合、もしくは観測するためのメソッドがない場合、DOCの観測ポイントを使います。

恋愛ゲームを例に説明すると、こんな感じになります。

* 攻略キャラとの会話・会話時の立ち絵 = SUTの観測用メソッド
* 好感度を教えてくれるヘルプキャラ = DOCの観測メソッド
* 好感度の増減 = SUTの振る舞いが期待通りになるかの判断基準

攻略キャラとの会話や立ち絵だけでは分からない好感度増減は、ヘルプキャラに聞けば多少は分かるでしょう。

### DOCの制御と観測 -- 自作自演でそれぽく見せる

上では、外堀を埋めるという表現使ってましたけど、厳密にいうと、**SUTに、外堀は埋まったように見せる**です。
何故かと言うと、DOCに必要な制御用メソッドと観測メソッドが揃っているとは限らないからです。

実際、SUTとDOCとのイントラクションはメソッドベースがほとんどなので、DOCと同じAPIを持つ何かを、SUTから見たDOCのポジションに置けば、DOCによる制御と観測と同じ効果を達成できます。

このDOCと同じAPIを持つ何かを、**Test Double**と呼びます。これはあとで説明するテストパターンの中心となります。

恋愛ゲームを例に説明すると、こんな感じになります。

* 攻略キャラを絡む本物の不良 = DOC
* 不良っぽく攻略キャラを絡むと、主人公に頼まれた善良な市民 = Test Double
* 不良を撃退した主人公が格好良く見える(攻略キャラ視点) = 制御ポイントによるSUTの制御

例えば自作自演でも、格好よく不良を撃退したところを見せたら、攻略キャラの好感度も上がるのでしょう。
若干クズな主人公ですが、ここは気にしないでおこう…

## つづきは明日

テスト戦略を簡単に説明するつもりでしたが、意外と長くなりました。

というわけで、パターンは次回(明日)の記事で説明していきたいと思います。



[^sut]: "System Under Test"の略です。
[^doc]: "Depend-On Component"の略です。
最近Google HomeとPhilips Hueを使ってみて分かったこと

この記事は[CPS Lab Advent Calendar 2017](https://qiita.com/advent-calendar/2017/cps)の23日目です。
22日目は[コーディングで編曲をした話](https://medium.com/@e_ntyo/コーディングで編曲をした話-673d629613be)です。

クリスマスも近いですが、いかがお過ごしでしょうか？予定はありますでしょうか？


##始めに

さて、ここで私がPhilips Hue（以下Hueと呼ぶ）とその音声コントロールとしてGoogle Homeを使った感想を色々と書きます。
技術的な話というよりは、俺個人が「Google HomeとHue凄ぇぇ！！」と思ったという内容です。
このアドベントカレンダーがきっかけでQiitaアカウントを作り、これが始めての記事となるので書き慣れていない点ご了承をm(_ _)m

##Hue
Hueというと色んな色に変えられるとや、普通の電球に比べてかなり高い（1つ約7000円）ということをご存じかもしれません。ですが、私が使っているHueはホワイトグラデーションというモデルは白色〜オレンジ色の通常照明で使う色しか選べない分、電球1個あたりの値段が半額になった（1つ約3500円）、家庭で使うならオススメのモデルです！
![81LH7jKH3iL._SX355_.jpg](https://qiita-image-store.s3.amazonaws.com/0/223871/2f85dced-fe99-b684-3022-1f018f2354df.jpeg)
それを2個、寝室とダイニングルームに置いています。
私が使っているタイミングとしてはダイニングルームで「ご飯を食べる時」、寝室で「夜寝るときの明るすぎない照明」「朝起きる時の目覚ましとして」使っています。
その中で寝室での使い方が便利だな〜と感じているのでそこについて詳細を書いていきます！

##寝室での使い方
私の家の寝室のシーリングライトはリモコンが壊れており、電気を切る時はいちいち布団から出て部屋の電源を消しに行く必要があるのです。寝ようとしているのに布団から出なければいけないのです！！（大事だから2回言った）
そこで、Google Homeに「寝室の照明消して」で電気を消してくれるというや、逆に電気が消えている時に「寝室の照明つけて」で電気をつけてくれるのがシンプルながらありがたい機能ですね〜
また、寝室の私の使っているベッドは窓から離れていて朝太陽の光で起きることができませんでした。Hueのアプリで起床時間をセットすることでうるさいアラームの代わりに、徐々に明るくなる照明をセットすることができるんですね！
これを使えばアラームいらずで快適な朝を迎えられると思います！ただ、僕はそもそも電気をつけただけで起きられる様な人ではないので、他の手段にも頼る必要があるのですが(^^ゞ
特にこの時期は起きられたとしても寒くてふとんから出られないしww
ただ不思議と起きる前から光を浴びていると心なしか寝起きがいいんですよね！！
「朝は太陽光を浴びた方がいい」ってどこかの記事で見たことありますし、多分個人差はあれど他の人もそうなると思います！（責任は負いません）


##その他
ダイニングルームなどでオレンジ色の光を使えば食事が美味しそうに見えますし、勉強の時に白色光を使えば不思議と普段より集中できるはずですので、様々な要素で生活を豊かにしてくれると思います！！
Hueの明かりを1%でつけるには今まで「OK Google, 寝室の照明をつけて」「OK Google, 寝室の照明を1%にして」と2段階言う必要があったが、Google Homeではショートカットが登録できるらしいので「OK Google, 夜の照明をつけて」とかでやると更に便利になりそう。

##最後に
結構文章自体がグダグダしている中、最後まで読んで下さりありがとうございますm(_ _)m
初回投稿の為写真が全然上げられなくて申し訳ないです(T-T)
この記事見てPhilips Hueが良いなと思えば、多分それは間違ってないので使って見るといいと思います！！