OmniAICreator/Qiita-1.07M huggingface dataset:
Visual Studio / WPF > コントロール > DockPanel

```txt:動作環境
Windows 7 Pro (32bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

@ WPF 4.5入門 by 大田一希さん
No.1918 / 9985

> DockPanelコントロールは、コントロールを上下左右と残りの部分にわけて配置するコントロールです。

ということは[連分数](https://ja.wikipedia.org/wiki/%E9%80%A3%E5%88%86%E6%95%B0)の表示に最適ということか。
(間違っている可能性あり）。

```xml:XAML
<Window x:Class="_170423_t1935_border.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:_170423_t1935_border"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <DockPanel>
            <TextBox DockPanel.Dock="Left">x = </TextBox>
            <TextBox DockPanel.Dock="Left">a0 + </TextBox>
            <TextBox DockPanel.Dock="Top">1</TextBox>
            <TextBox DockPanel.Dock="Left">a1 + </TextBox>
            <TextBox DockPanel.Dock="Top">1</TextBox>
            <TextBox DockPanel.Dock="Left">a2 +</TextBox>
            <TextBox DockPanel.Dock="Top">1</TextBox>
            <TextBox DockPanel.Dock="Left">a3</TextBox>
        </DockPanel>
    </Grid>
</Window>
```

![work.png](https://qiita-image-store.s3.amazonaws.com/0/32870/977ff1cd-9a9b-7446-dae0-55fb332f5065.png)
Visual Studio / WPF > コントロール > StackPanel > コントロールの整列に使う

```txt:動作環境
Windows 7 Pro (32bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

@ WPF 4.5入門 by 大田一希さん
No.1805 / 9985

> StackPanelコントロールは、子要素を縦方向または横方向に一列に並べるコントロールです。

試してみた。

```xml:XAML
<Window x:Class="_170423_t1935_border.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:_170423_t1935_border"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <StackPanel HorizontalAlignment="Left" VerticalAlignment="Top"
                    Height="229" Margin="27,29,0,0"  Width="345" Background="#FF84A4F7">
            <Button Content="Button" Height="33" Margin="10,0,30,0" Width="90" 
                    HorizontalContentAlignment="Center" HorizontalAlignment="Left"/>
            <Button Content="Button" Height="33" Margin="10,0,30,0" Width="90" 
                    HorizontalContentAlignment="Center" HorizontalAlignment="Right"/>
            <Button Content="Button" Height="33" Margin="10,0,30,0" Width="90" 
                    HorizontalContentAlignment="Center" HorizontalAlignment="Left"/>
        </StackPanel>
    </Grid>
</Window>
```

![work.png](https://qiita-image-store.s3.amazonaws.com/0/32870/457864e3-2837-d6da-7ca6-d5e3eedc91c9.png)

HorizontalAlignmentとVerticalAlignmentでコントロールの配置を扱うようだ。
Marginで設定したものが端になる。

### orientaion

orientationを設定することで、配置を横方向にすることもできる。

@ WPF 4.5入門 by 大田一希さん
No.1853 / 9985

buttanで試してみた。

```xml:XAML
<Window x:Class="_170423_t1935_border.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:_170423_t1935_border"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <StackPanel Orientation="Horizontal"
                    HorizontalAlignment="Left" VerticalAlignment="Top"
                    Height="229" Margin="27,29,0,0"  Width="345" Background="#FF84A4F7">
            <Button Content="Button" Height="33" Margin="0,0,0,0" Width="90" 
                    HorizontalContentAlignment="Center" VerticalAlignment="Top"/>
            <Button Content="Button" Height="33" Margin="0,0,0,0" Width="90" 
                    HorizontalContentAlignment="Center" VerticalAlignment="Bottom"/>
            <Button Content="Button" Height="33" Margin="0,0,0,0" Width="90" 
                    HorizontalContentAlignment="Center" VerticalAlignment="Center"/>
        </StackPanel>
    </Grid>
</Window>
```

![work.png](https://qiita-image-store.s3.amazonaws.com/0/32870/8eb3cd86-39ab-14dd-343b-95e1d49c3bb3.png)
可読性の高いコードを書くために心がけたいメモ

### はじめに
プログラミングを始めてから春で3年目になるエンジニアです。
1年目の夏からiOS開発に携わらせていただき、今に至ります。
初めて学ぶ事や自分の力量を遥かに上回っているような案件にもアサインしていただいて、
学ぶ事が多い2年だったと感じております。
しかし、新しい事や、難しい事に挑戦する事により、足元が疎かに。。。
可読性を考慮したコーディングができていないと感じたり指摘されるような事が最近増えたなと感じています。
独りよがりなコードを書いて、あとから保守する人の地獄を回避するために、そしてこれからエンジニアになる人たちが同じような状態に陥らないように、そして備忘録として私がこれから意識していこうと考えている可読性を向上するためのメモを残そうと思います。


####ここからメモ
##### 1.初歩的だけど大事！インデントを正しく合わせよう
基本的に自分が0から書いたコードはインデントって合わせられてると思うのですが、
既存のコードに手をいれる時にインデントが崩れてしまっている時が多いです。
自分が手を入れたコードには逐一チェックをかけるようにする！！！

#####2.変数や関数の命名に気をつけよう！
変数や関数の命名には一定のルールがあります。
またプロジェクト毎に定められたコーディングルールもあると思います。
これらのルールに準拠するのが基本的守らないといけないことです。
プロジェクト毎に決められたコーディングルールを準拠するのはコーディングルールが記載されている資料などを見ればいいですが、一般的に言われルールって？？って人もいるかと思います。
そういう人は**リーダブルコード※1**という書籍を読みましょう。
リーダブルコードはコードを理解しやすくするための様々な原則を具体例とコードを交えて解説してくれています。
(正直この記事を読まなくてもリーダブルコードを読めば。。。という話はなしで。)
リーダブルコードの中には変数や関数の命名規則についての解説もあるので必読です！！

#####3.コードレビューをしてくれる人の気持ちを考えよう
コードレビューは非常に重要な時間の一つです。
コーディング規約に則っているか、適切な命名規則を行っているか、冗長的な処理の書き方をしていないか等、
レビュアーの方が確認しなくてはならない事はたくさんあります。
確認しなくてはならない事はたくさんあるのに、そこに使える時間は限られています。
そのためコードレビューに出す前には、最低限のチェックは行いましょう。
Gitなどで差分を確認しながら関数や変数の命名はおかしくないか？メソッド化することはできないか？
ほんの少しの思いやりがお互いの仕事の効率を上げる事になり、チームとしての一体感を高められるのではないでしょうか。

#####4.他の人が書いているコードを積極的に読もう
自分のプロジェクトの先輩が書いているコードやOSSのコードを読む習慣をつけましょう。
真似したほうがいい所これはダメだという所、様々な知識を吸収することができます。
上質なアウトプットは上質なインプットから生み出されるのです。(どこかで聞いたことがあるような。。。)


### おわりに
どれもどこかでよく聞くよ！！！って話だったかもしれませんね。。。
でもよく聞くということはそれだけ重要なことなのです。
そして新しくエンジニアとしての道を踏み出す新人の子達も同じような事を語り継いでいくのでしょう。
初心を忘れずにというのは本当に大事なことだと思いますので、
自分が書いているコードをじっくり読み直してみてはいかがでしょうか。

###備考
※1
『リーダブルコード――より良いコードを書くためのシンプルで実践的なテクニック』
Dustin Boswell，Trevor Foucher 著，角征典　訳，オライリー・ジャパン（2012）
ISBN 978-4-87311-565-8
https://www.oreilly.co.jp/books/9784873115658/
Visual Studio / WPF > コントロール > Canvas / 添付プロパティ

```txt:動作環境
Windows 7 Pro (32bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

@ WPF 4.5入門 by 大田一希さん
No.1763 / 9985

Canvasの例が紹介されている。

作ってみた。

```xml:XAML
<Window x:Class="_170423_t1935_border.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:_170423_t1935_border"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Canvas HorizontalAlignment="Left" Height="153" VerticalAlignment="Top" Width="179" Margin="21,21,0,0" Background="#FFBB1515">
            <Button Content="Button" Canvas.Left="24" Canvas.Top="24" Width="75"/>
        </Canvas>
        <Canvas HorizontalAlignment="Left" Height="153" VerticalAlignment="Top" Width="179" Margin="236,21,0,0" Background="#FF30AFD4">
            <Button Content="Button" Canvas.Left="24" Canvas.Top="24" Width="75"/>
        </Canvas>
    </Grid>
</Window>
```

上記において、`Canvas.Left`と`Canvas.Top`はともに「添付プロティ」。

> TopとLeftとRightとBottomは添付プロパティなので、XAMLで説明したようにクラス名.プロパティ名の形で設定を行います。

添付プロパティについては以下。
@ WPF 4.5入門 by 大田一希さん
No.1577 / 9985


上記のXAMLで生成されるのは以下。

![work.png](https://qiita-image-store.s3.amazonaws.com/0/32870/b7d271e4-7f92-404f-4a69-b3dc7df014c8.png)
さくらでmastodonを立ち上げたときの構成

mastodon を立ち上げるのには超便利なさくらクラウド。ウィザードに従って起動すると、すごく楽なんだけど、どういう構成で起動したかが分かりにくい。

何もしないでもインストールから起動まで終わってしまうので、今どういう構成なのかを追いかけてみる。

まずは、起動時のTOPコマンドがこれ。

![SS 2017-04-23 18.43.37.png](https://qiita-image-store.s3.amazonaws.com/0/53489/f946c6af-1e0f-b2d2-a779-57edf88fc612.png)

## Railsはpumaで起動している
unicorn じゃなくてpumaね。プロセスじゃなくて、スレッドで並列処理するからいいらしい。ポート3000で起動している。

## rubyは 2.4.1

インストールスクリプトでは、rbenvで2.4.1が入ってる。

## sidekiq でRedisの何かしてるっぽい

Redisで何かしらの非同期処理をしてるっぽいのだが、何をしているかはまだ良くわかってない。

## postgresはローカルに立ってしまってる

これちょっと厄介。一台構成なので仕方ないけど、WebとDBが一台に共存すると、スコーンと負荷が高まる。WebとDBで同じメモリを奪いあってガツーンと止まる。さくらクラウドにはAmazonRDSみたいなアプライアンスサービスあるからそっちに持っていった方がいいかも（これは試算してみての話）。

ただ、DBはちょこっとメンテ時間があれば、ユーザ影響なく移管しやすいものではあるので、あとで引っ越しって手もある。

## nodeで参照系のAPIをさばいているっぽい

元々nodeが必要なのは分かるが、何をしているかがまだ良くわからない。nginxの設定をみると

```
/api/v1/streaming
```
というパスがあってそれはrailsとは別のところにproxy_passしている。たぶんそれがnodeのやつ。nodeはポート4000でexpressフレームワーク。WebSocketsでも通信してるみたい。APIのget系をnodeでやってて、更新系の処理はなさそう。Railsでログインやら更新やらをやって、参照頻度の多いところはnodeという組み合わせ。 かっこいー。

## sslはletsencrypt

nginxのconfをみるかぎり、letsencryptを使っているもよう。自動更新が機能しているかどうかはまだ分からない。

## 画像はローカルにおいているっぽい

画像がWebサーバーローカルに置いてるので、すぐに容量が足りなくなるし、静的なでかいファイルを配信する機能と、Rubyが動くサーバが共存しているってのもわざわざボトルネックを作ってるようなもの。マストドンには、画像をAmazonS3に配置する機能があるので、それを使えばOK。

オブジェクトストレージは、さくらクラウドにもその機能があるので、そっちを使うのも手かも知れないけど、S3自体のコスパは悪くないので、無理にS3もどきを使う必要はなさそう。

一旦そんなところで。
Visual Studio / WPF > コントロール > Borderを試した

```txt:動作環境
Windows 7 Pro (32bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

@ WPF 4.5入門 by 大田一希さん
No.1644 / 9985

レイアウトというカテゴリの下に「Border」というものがあるようだ。

いくつかのプロパティがある。
BorderThicknessとCorderRadiusを試してみた。

```xml:XAML
<Window x:Class="_170423_t1935_border.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:_170423_t1935_border"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Border BorderBrush="Red" BorderThickness="5" CornerRadius="50"
                HorizontalAlignment="Left" Height="100" Margin="57,36,0,0" VerticalAlignment="Top" Width="100"/>
        <Border BorderBrush="Yellow" BorderThickness="5" CornerRadius="50"
                HorizontalAlignment="Left" Height="92" Margin="59,39,0,0" VerticalAlignment="Top" Width="94"/>
        <Border BorderBrush="Blue" BorderThickness="42" CornerRadius="30"
                HorizontalAlignment="Left" Height="86" Margin="60,40,0,0" VerticalAlignment="Top" Width="86"/>

    </Grid>
</Window>
```

![work.png](https://qiita-image-store.s3.amazonaws.com/0/32870/84786981-e893-35d6-9488-4e93f302ff3c.png)
ES2015の備忘録

ES2015の記法、機能のメモ

# constとlet
`const`：再代入しない変数を宣言する時に使用する。上書きされたくないものを代入する。
`let`：　再代入が必要となる変数を宣言する時に使用する

``` js
let number = 1;
const foo = "bar";
foo = "bar2"; //エラー！！！
```

# オブジェクト設定
オブジェクトのプロパティ名が同じ場合、省略できる。

``` js
conbst bax = {foo:foo, zoo:zoo};
conbst bax = {foo, zoo}; 
```

オブジェクトの値に関数を定義するときfunctionを省略できる

``` js
const foo = {
  bar(){
    console.log("xxx");
  }
}
foo.bar();
```

オブジェクトのプロパティ名に変数を利用できる

``` js
const foo = "foo";
const bar = {
  [foo + "01"]:"ok"
};
console.log(bar.foo01); //"ok"
```


# アロー関数
ES2015からの関数の表記法。thisの参照先が変わるので注意！

## 表記の基本形。
``` js
関数名　= 引数　=> 関数の中身;
```

## functionという単語を省略できる

``` js
const f1 = () => "hello";　 //const f1 = function() {return "hello";} 
console.log("あいさつ："　+ f1()); //あいさつ：hello
```

## 引数が一つなら()を省略できる

``` js
const f2 = name => "hello:" + name; //const f2 = function(name) {return "hello" + name;}
console.log(f2("世界")); //hello:世界
```

## 関数内が一行ならば{}とreturn文を省略できる

``` js
//const f3 = function(a,b) {return a + b;}
const f3 = (a,b) => a + b;
console.log("合計値："　+ f3(3,4));
```

## 引数が複数あるとき

``` js
const function = (x, y, z) => {console.log(x, y, z);};

//function：関数名
//(x, y, z) 引数
//console.log(x, y, z); 関数の中身
```

## 引数の初期値を設定できる

``` js
const foo = (bar = 3) => {
  console.log(bar);
}
foo(4); //4
foo(); //3
```

# スプレッド演算子
- 可変長な引数を配列として取得できる

``` js
const bar = (...arg) => {
  console.log(arg); //1,2,3,4
  console.log(Array.isArray(arg)); //true
};
bar(1,2,3,4);
```


# 配列
## 配列の結合

``` js
const foo = [1,2,3];
const bar = [...foo,4,5,6]; //fooの配列内に4,5,6の値を格納する
console.log(bar);

const array = [1,2,...foo,3]; //配列内の好きな位置に配列を入れることができる
```

## filter 
配列の中から条件に一致する要素をフィルタリングして、新しい配列として生成する。

例：偶数の値のみを残した配列を生成

``` js
const even = value => { 
  return value % 2 == 0; 
}
var array = [1, 2, 3, 4, 5];
var evens = array.filter(even);
console.log(evens); //[2, 4]
```

## map
配列の要素すべてに同じ処理を適用して、新しい配列を生成する。

例：配列内の要素の値を2倍にした配列を新たに生成する

``` js
const twice = value => {
  return value * 2;
}

var array = [1,2,3,4];
var arrayTwice = array1.map(twice);
console.log(arrayTwice); //[2, 4, 6, 8]
console.log(array); //[1, 2, 3, 4]
```
ATtiny85をArdiuno IDEで開発し複数UART機器の制御をRS485で行う

己の備忘のためのみ。先人の方々への感謝忘れず。

### ATtiny85をArdiuno IDEで開発し複数UART機器の制御をRS485で行う
少ピンATtinyをArduino化しIDE開発できることはわかった。
Arduinoならソフトウェアシリアルも手軽に使えることも。

しかし果たしてソフトウェアシリアル2chが実現できるのか？
書き込みの時は既に6ピン使用しているからね。
差し替えかスイッチでいちいち動作確認することになるんだろうけど・・・
ここ↓ではソフトウェアシリアルに使用できるピンの制限がある記事があるなあ。
http://arms22.blog91.fc2.com/blog-entry-501.html
やっぱり8ピンでつうのは無理があるのか？

まずAttiny85でソフトウェアシリアルが使用できるのはわかった。Jonkiさんの記事。
http://www.jonki.net/entry/20131109/1384012020

動作はUART2本とLED1本=3本使用している。
書き込み時はVCC、GND、MISO、MOSI、RST、SCKで6本使用するから、動作確認でチップ
の挿し替えはどうしても。

あとは2ch同時に使えるのか否か。

- 開発環境の導入
「kosakalab」Arduino IDEへATTiny用開発環境導入
http://make.kosakalab.com/make/electronic-work/arduino-ide/attiny-dev/
![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/165578/d2de7f54-321a-23b7-2fa4-d73bed6d8e54.jpeg)


- クロックを8MHzへ変更「kosakalab」
http://make.kosakalab.com/make/electronic-work/arduino-ide/test_arduinoisp/

- 開発環境の導入とLチカ「THe Jonki」
http://www.jonki.net/entry/20131109/1383977233

- ソフトウェアシリアル「k99 Techブログ」
http://k99-tech.com/blog/archives/139

- 複数のソフトウェアシリアル「試行錯誤な日々」
http://asukiaaa.blogspot.jp/2016/03/arduinosoftwareserial.html?m=1

- ライブラリ　リファレンス
http://www.musashinodenpa.com/arduino/ref/index.php
![pin.jpg](https://qiita-image-store.s3.amazonaws.com/0/165578/73b04da4-c54d-fecc-4d94-fead5799b0ae.jpeg)
（各画像、無許可掲載です。怒られたら即時削除）


### 自宅での開発にデジオシ導入したい
http://rabbit-note.com/2015/06/27/rigol-ds1054z/
ワークフローに再現性をもたせるための Luigi の Task の拡張

[Luigi で作成するワークフローの再利用性・メンテナンス性を高めるために](http://qiita.com/ngr_t/items/b928bc13457571e25519) という記事を昔書きました。
その中で、結果の一貫性を保つために[complete メソッドでは入出力のタイムスタンプをチェックする](http://qiita.com/ngr_t/items/b928bc13457571e25519#complete-%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%81%A7%E3%81%AF%E5%85%A5%E5%87%BA%E5%8A%9B%E3%81%AE%E3%82%BF%E3%82%A4%E3%83%A0%E3%82%B9%E3%82%BF%E3%83%B3%E3%83%97%E3%82%92%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%81%99%E3%82%8B) とか [complete では依存タスクの complete がすべて True を返すかをチェックする](http://qiita.com/ngr_t/items/b928bc13457571e25519#complete-%E3%81%A7%E3%81%AF%E4%BE%9D%E5%AD%98%E3%82%BF%E3%82%B9%E3%82%AF%E3%81%AE-complete-%E3%81%8C%E3%81%99%E3%81%B9%E3%81%A6-true-%E3%82%92%E8%BF%94%E3%81%99%E3%81%8B%E3%82%92%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%81%99%E3%82%8B)とかいったことの重要性を書きました。

Luigi はデフォルトではタスクの終了判定が「出力が存在しているかどうか」のみとなっており、これが整合性のある計算結果を出すという観点からは不都合であることから上記のような点に注意を払う必要が生じます。
そういったことから、結果の再現性とかをより重視して「データサイエンス向けに」 `Task` を拡張したものを作ってみました。以下のリポジトリに置いています。

https://github.com/ngr-t/luigi_for_data_science

セットアップスクリプトは書いていませんが、現状では Portalocker モジュール(とあと もちろん Luigi)に依存しているのでこれを pip なりで突っ込んでください。


## 使い方

使い方としては

1. `hash_checking_tasks.TaskWithCheckingInputHash` を継承してタスクを作成する。
2. タスクの入出力全てを `hash_checking_tasks.HashableTarget` を適切に実装したタスクにする。
3. 実行する。

となります。

## どうやって動いてるの？

`TaskWithCheckingInputHash` は `Task` を以下のように拡張しています。

  - 依存タスク全ての `complete()` メソッドが `True` を返すかチェックする。
  - ターゲットが存在する場合、そのターゲットの生成に用いたタスクと入力ターゲットのハッシュ値が一致するかどうかをチェックする。
  - タスクの実行が成功した場合、自分自身のクラスと入力ターゲットのハッシュ値を保存する。

具体的なハッシュ値の生成などの処理は `HashableTarget` に任せてしまっています。`HashableTarget` は以下のような動作を行えるように実装します。

  - `hash_content()` の値の比較によってターゲットの同値性がチェックできる。
  - `get_current_input_hash()` によって(もしもターゲットが存在した場合)ターゲットを生成したタスクのハッシュ値を取得できる。
  - `store_input_hash()` によってターゲットを生成したタスクのハッシュ値を保存できる。

「タイムスタンプをチェックせよ」ということを以前の記事では書いたのですが、大事なのは日付ではなくて入出力の同値性です。ハッシュ値チェックの方が良いんじゃないか？　ということをあの記事を書いてから思いなおしました。
ただハッシュ値チェックをするとなると必然的にハッシュ値をどこかに保持しておく必要があり、これはちょっとややこしい問題です。`HashableLoaclTarget` ではターゲットとなるファイルに接尾辞 "input.pickle" をつけたパスに保存していますが、この名前が衝突した場合の処理などをちゃんとしていません。

まだまだ色々突っ込みどころのある状態ではあるかと思いますので、是非ともマサカリを投げてください。
Vim,QuickFixの結果が1つの場合表示しないようにする

## はじめに
gtagsでタグジャンプしたときに結果が1つでもQuickFixが表示されてしまうので、
結果が1つの場合は、非表示にしてくれる関数を用意しました

## QuickFixHidden
- `getqflist()`
    - quickfixエラーのリスト[^1]
- `cclose`
    -  QuickFixウィンドウを閉じる[^2]

```VimL
function! QuickFixHidden() abort
  if (len(getqflist()) <= 1)
    cclose
  endif
endfunction
```

ジャンプ後関数を呼ぶように設定しておけばOKです

## おわりに
vim scriptのドキュメントはvimから見れたり、日本語化がされていたりと
非常に読みやすく、扱いやすくて良いと思います
http://vim-jp.org/vimdoc-ja/index.html

[^1]: http://vim-jp.org/vimdoc-ja/usr_41.html#quickfix-functions
[^2]: http://vim-jp.org/vimdoc-ja/quickfix.html#:cclose
[iOS] 電話やSiriによる割り込み時の制御

アプリ内で音楽再生や録音中に通話やアラーム、Siriなどによる割り込みがあった場合の制御方法です。
これを行う事でAudioPlayerで音楽の再生中に割り込みが発生した後に、再度再生させるなどの処理を実装することが可能です。

# 実装方法
以下のNotificationを登録することで、割り込み時に通知を受け取る事ができます。

```
// 割り込みが発生した場合の通知を登録
[[NSNotificationCenter defaultCenter] addObserver:self                                          
                                         selector:@selector(audioInterrupted:)
                                             name:AVAudioSessionInterruptionNotification
                                           object:nil];
```

割り込み発生時の処理内で、割り込み開始か終了かを取得し処理を行います。
割り込みの開始/終了はAVAudioSessionInterruptionTypeKeyから取得することができます。

```
- (void)audioInterrupted:(NSNotification*) notification{
    NSNumber *interruptType = [notification.userInfo objectForKey:@"AVAudioSessionInterruptionTypeKey"];
    if ([interruptType unsignedIntegerValue] == AVAudioSessionInterruptionTypeBegan){
        //割り込み開始
    }else if([interruptType unsignedIntegerValue] == AVAudioSessionInterruptionTypeEnded){
        //割り込み終了
    }
}
```
Realmで暗号化して、中身を確認するまで。

## 暗号化

Realmで暗号化するには、公式のサンプル通り、以下のような感じでやればよい

https://realm.io/docs/java/latest/#encryption

このサンプルの通りだと、毎回ランダムな文字が割り振られてしまうので、一旦文字列をキーにして、byte列に変換して入れる事にする。
実際に使う時はコードに直接書いちゃうと意味ないのでいい感じに見れないところに置く必要がある。

```kotlin
val key = “fadfasdfdsfdassfasdfa…" // 64文字

RealmConfiguration config = new RealmConfiguration.Builder()
  .encryptionKey(key.toByteArray())
  .build();

Realm realm = Realm.getInstance(config);
```

## 中身を確認する

さて、実際にどんなデータが入ってるのか中身を確認したい。
中身を確認するには以下の３つの方法がある。

1. stetho-realmを使う
2. Realm Browserを使う
3. Realm Object Serverを使う


順に書いていく

#### 1. stetho-realmを使う

https://github.com/uPhyca/stetho-realm

これを使う。

https://github.com/uPhyca/stetho-realm#integration

この辺のサンプル通りにやれば、普通に使える。（雑

。。。はずなんだけど、僕が作ってるアプリだと見れなかった。。。
https://github.com/realm/realm-java/issues/3700

この辺が関係しているのかも？ゼロから自分で作って試してみたら、普通に見ることが出来たので何かしらの何かが影響して見れなくなっているんだと思う。

#### 2. Realm Browserを使う

https://itunes.apple.com/jp/app/realm-browser/id1007457278


ざっくりした使い方は以下を参照
http://blog.techium.jp/entry/2016/07/03/231722


ただし、realmファイルを取得するためには、一工夫必要だった。↑の方法では、端末のインストールしたパッケージのデータ置き場に保存しているファイルを、一度どこからでもアクセス可能な領域にコピーする。と書いてあったけど、これがうまくいかなかった。

なので、以下のコマンドでrealmファイルの保存場所から直接自分のMacに落としてきて、開いてる。
Windowsだとどうなるかわからない。。

```
adb -d shell run-as com.mapyo.sample cat /data/data/com.mapyo.sample/files/default.realm | perl -pe 's/\r\n/\n/' > default.realm
```

`com.mapyo.sample`と`default.realm`は自分の環境に合わせてよしなに修正してください。


そして、落としてきたrealmファイルをいざ開こうとすると、

```
The encryption key must be entered as a 128-character string of hexadecimal values.
```

こういうメッセージが出た。まあ、暗号化した時のやつを入れればいいんだな。という事はわかったのだけど、128文字？？16進数？？どういう事？？という感じでよくわからなかった。

いろいろググると答えを見つけた。

https://teratail.com/questions/52401

暗号化キーのバイト列を16進数で表せばいいだけだった。
Kotlinだとこんな感じ

```kotlin
val key = "3fdafad...." // 64文字

val encryptionKey = key.toByteArray().map {
    String.format("%x", it)
}.joinToString(separator = "")

println(encryptionKey)
```

ということで、ここで確認出来たキーを入れれば見れた！


#### 3. Realm Object Serverを使う

僕は試してないけど、

http://exception-think.hatenablog.com/entry/20170129/1485700200#realm%E3%81%AERemoteDebug

こんな感じでやれば出来るっぽい（雑
Twitterでstetho-realmで見れないー。。。とつぶやいてたら紹介してもらった！！
ありがたや！！


## 所感
stetho-realmが使えると一番便利そうなんだけど、見れなくて切ない。。。
プログラム勉強１日目。アドバイスをください.....

位置情報を使ったWEBサービスを作りたいと思いmacbookを買い、ドットインストールで勉強していたのですが、phpの勉強でローカルサーバーを立ち上げるという箇所で、vagrantのコマンドを入力しても動画のとうりにならず沈んでいたのですが、そんな時XAMPP MAMPがいいという記事を見かけたのですが、どちらが使いやすいですか？
ファイル行数のみを "wc -l" で取りたければ cat するのが簡単？

ファイルの行数を知るに wc を使っています。
たとえば、a.txt という３行のファイルがあるとします。

``` a.txt
a
b
c
```

wc -l を使うと「行数」とともに「ファイル名(a.txt)」も出力されます。

```
$ wc -l a.txt 
3 a.txt
```

**ここで、シェルスクリプトで行数だけを数字としてとりたい場合を考えます。**
明らかに "a.txt" は邪魔です。

この対策として、一度、cat にかませて、その出力をパイプで wc -l に与えます。

```
$ cat a.txt | wc -l 
3
```

数字だけ取れました (^o^)V

他に考えられる方法としては、cut を使うとか。

```
$ wc -l a.txt | cut -d " " -f 1
3
```

awk を使っても数字だけをとりだせます。

```
$ wc -l a.txt | awk '{print $1}'
3
```


wc 以外に使うコマンドとして、
　cat, cut, awk のどれがいいですか？
という選択になるわけですが、cat が最も単純だからよいかと思います。


しかし、「単純とは何か？」と考えなおして、実行形式のサイズが小さいことだろうと踏んで、手元のシステム(Ubuntu 16.04.2 LTS)で調べてみました。

```
$ ls -l /bin/cat /usr/bin/cut /usr/bin/mawk
-rwxr-xr-x 1 root root  52080  2月 18  2016 /bin/cat
-rwxr-xr-x 1 root root  39728  2月 18  2016 /usr/bin/cut
-rwxr-xr-x 1 root root 117768  3月 24  2014 /usr/bin/mawk
```
(補足) awk はリンクをたどると /usr/bin/mawk が実体でした。


"cut" が最も小さいので、最も単純で良いのだろうか…
素人なのでこれ以上は分かりません m(_ _)m
Visual Studio / WPF > XAML > マークアップ拡張構文

```txt:動作環境
Windows 7 Pro (32bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

@ WPF 4.5入門 by 大田一希さん
No.1501 / 9985

> 本来は大量のXMLを書かなければいけないところを簡潔に記述できるようにする機能が提供されています。

.NETな日々 -EX-さんの説明もわかりやすい。
http://d.hatena.ne.jp/kazutoex/20100427/1272373197

[Visual Studio / WPF > DataGridView > DataGridComboBoxColumn > sys:String型として定義した文字列をXAMLで指定して使う](http://qiita.com/7of9/items/d12402f543400a5de0e1)
で使った`ItemsSource="{Binding Source={StaticResource myGenderSource}}"`という記述もマークアップ拡張構文の一種のようだ。
Amazon Polly

機械学習に関する基本的な内容をまとめてみたものです。機械学習に関する、Web上にすでにある解説コンテンツをまとめたサイトの抜粋です。
[Amazon Polly] (https://www.techcrowd.jp/amazonai/amazon-polly/)

# [Amazon Pollyの概要] (https://www.techcrowd.jp/amazonai/amazon-polly/)

Amazon Polly は、文章をリアルな音声に変換するサービスです。Polly を使用することにより、会話機能を搭載したアプリケーションを簡単に作成することが可能になります。Polly は高度な深層学習テクノロジーを使用した Amazon AI サービスの 1 つで、人間の声のような音声を合成するサービスです。

・Polly には 24 の言語と 47 の音声が含まれているため、用途に最適な音声を選んで、多くの国で使える音声対応のアプリケーションを簡単に構築できます。

・Amazon Polly は安定して応答時間が短いため、リアルタイムの対話が実現できます。

・Polly の音声はキャッシュして保存できるため、オフライン再生や再配布が可能です

・Polly は簡単に使用できます。音声に変換するテキストを Polly API に送ると、すぐに Polly からオーディオストリームがアプリケーションに返され、アプリケーションでそれを直接再生することや、MP3 などの標準オーディオファイルとして保存することが可能です

・標準的な音声合成マークアップ言語 (SSML) を使用して、発音、ボリューム、ピッチ、話す速度など、音声のさまざまな面を制御できます

・カスタム辞書を使用することで、”P!nk”、”ROTFL”、”C’est la vie” (フランス語以外で発声する場合) のような企業名、頭字語、外来語、新語など、特定の単語の発音を修正できます。


# [Amazon Pollyの主な特徴] (https://www.techcrowd.jp/amazonai/amazon-polly/)

###自然な音声を再生
Amazon Polly は、深層学習テクノロジーを利用して、47 種類の声を 24 の言語で人間の声のように高品質に再生します。これには、さまざまなアクセントの男性と女性の声が含まれています。Polly はテキストを複数の言語で流暢に発音するため、高品質の音声出力を配信することや、世界中のユーザー向けのアプリケーションを作成することが可能になります。

例えば、”I live in Seattle”と”Live from New York”というフレーズにおける”live”という単語の異なる発音を考慮してくれます。Pollyはこの同形異義語が、同じ綴りだけど全く違う発音をされることを知っています。

###応答が速い
Amazon Polly は安定して応答時間が短いため、リアルタイムの対話が実現できます。Polly の API に送信する文章が長くても、音声をアプリケーションにストリームとして返すため、直ちに声を再生できます。

###クラウドベースのソリューションのメリット
テキスト読み上げソリューションでは大量のコンピューティングリソースが必要です。特に、デバイスの CPU 能力、RAM、ディスクスペースが必要です。これらの種類の動的な音声による応答は、ユーザーのデバイスで一般的に保存できるものよりもはるかに大量の音声オーディオへのアクセスを必要とします。Amazon Polly はクラウド上にあるため、多種多様な合成音声にアクセスすることが可能です。Polly を使用すると、お客様のアプリケーションは、リアルタイムデータを含むさらに多くの価値ある応答を提供できるとともに、クラウドでテキスト読み上げ変換を実行すると、ローカルで必要なリソースが劇的に減ります。

###統合が簡単
Amazon Polly を使用すると、ウェブサイト、モバイルアプリケーション、デバイスに簡単に声を追加できます。Polly では、スピーチに変換する文章を書いて Polly API に送信するだけで、すぐに Polly が音声ストリームを返します。


# [ユースケース] (https://www.techcrowd.jp/amazonai/amazon-polly/)


###Webコンテンツへの音声の追加
Amazon Polly を使用すると、ビデオ、プレゼンテーション、またはオンラインのトレーニングコースに音声を簡単に追加することができます。Polly を使用すると、RSS フィード、ニュース、E メールを読んだり、合成された音声をオーディオファイルの形式で保存したりすることができます。

###カスタマーセンター
Amazon Polly を使用することにより、自然な声で応答するカスタマーコンタクトセンターを実現することができます。Polly の音声出力を音声自動応答 (IVR) システムを通して再生することもできます。さらに、Polly の API を活用して、サービスステータス、アカウントや請求書に関する問い合わせ、住所、連絡先情報のような自動化されたリアルタイムの情報をBOTなどで配信することができます。

###学習コンテンツ
新しい言語の話し方を教えるアプリケーションに Amazon Polly を使用することができます。例えば、エンドユーザーが外国語のフレーズをアプリケーションに入力すると、ネイティブスピーカーによる音声を聞くことができます。

###スマホアプリへの音声の追加
Amazon Polly を使用すると、モバイルアプリケーションとモバイルゲームに簡単に音声を追加することができます。Polly では、標準の音声応答をデバイスに保存できるほか、ゲーム内のキャラクターの会話、順位表のランキング、ゲームの招待などの動的でリアルタイムの応答にも利用できます。


# [料金について] (https://www.techcrowd.jp/amazonai/amazon-polly/)

Amazon Polly は従量課金制で、文字あたりの変換のコストが低く、無制限に再生できるため、実質的にどのアプリケーションでも音声の合成を可能にする費用対効果の高い方法です。

AWS 無料利用枠の一環として、Amazon Polly を無料で開始できます。サインアップしていただくと、Amazon Polly を初めて使用するお客様は、最初の 12 か月間は 1 か月あたり最大 500 万文字を無料で利用できます。
Amazon Rekognition API 

機械学習に関する基本的な内容をまとめてみたものです。機械学習に関する、Web上にすでにある解説コンテンツをまとめたサイトの抜粋です。
[Amazon Rekognition API] (https://www.techcrowd.jp/amazonai/amazon-rekognition-api/)

# [APIでは何ができるのか] (https://www.techcrowd.jp/amazonai/amazon-rekognition-api/)

Amazon Rekognition では、強力で正確な画像分析をシンプルな API で利用可能にすることで、画像認識機能をアプリケーションに構築する複雑さを排除しています。

Rekognition の API は Amazon S3 のイベントに応じて AWS Lambda から直接呼び出すことができます。S3 と Lambda はアプリケーションの要求に応じて自動的にスケールするため、スケーラブルかつ信頼性の高い画像分析アプリケーションを手頃な価格で構築できます。例えば、訪問者がお客様の居住地に到着するたびに、ドアカメラはその人物の写真を S3 にアップロードし、Rekognition の API を使用してゲストを識別する Lambda 関数をトリガーできます。


# [物体とシーンの検出] (https://www.techcrowd.jp/amazonai/amazon-rekognition-api/)

物体とシーンの検出は、画像を分析して、視覚的な内容に基づいてラベルを割り当てるプロセスですがAmazon Rekognition では DetectLabels API でこのプロセスを実行します。この API では、数千の物体、シーン、および概念を自動的に特定して、各ラベルに対して信頼スコアを返します。DetectLabels では信頼スコアのデフォルトのしきい値は 50 です。

信頼スコアは 0 から 100 までの数字で、特定の予測がどの程度正確であるかを示します。


# [顔分析] (https://www.techcrowd.jp/amazonai/amazon-rekognition-api/)

Amazon Rekognition の DetectFaces API は、画像を取り込み、属性 (性別、サングラスの有無、顔の特徴など) とともに、検出された顔の境界ボックスを返します。顔分析を使用して人口統計学的な情報や感情を分析したり、検出された顔の境界ボックスを使用してさらに別の処理を行ったりできます。

DetectFaces APIでは、顔ポーズと呼んでいる、顔のピッチ軸、ロール軸、ヨー軸における、検出された顔の回転を表すパラメータも返します。これらのパラメータはそれぞれ -180 度から +180 度の間の角度として返されます。顔ポーズを使用すると、顔の境界ポリゴン (長方形の境界ボックスとは対照的) の方向性を検出し、変形の測定や、顔の正確なトラッキングなどを実行できます。


# [顔の比較] (https://www.techcrowd.jp/amazonai/amazon-rekognition-api/)

Amazon Rekognition では、CompareFaces API を使用して 2 つの画像内の顔が同一人物である可能性を測定します。この API は、ソースの入力画像にある顔を、ターゲットの入力画像で検出されたそれぞれの顔と比較し、各比較について類似性のスコアを返します。また、検出されたそれぞれの顔の境界ボックスと信頼スコアも取得します。顔の比較を使用すると、ほぼリアルタイムで、ファイルにある人物の写真と比較して個人のアイデンティティを検証できます。


# [顔認識] (https://www.techcrowd.jp/amazonai/amazon-rekognition-api/)

顔認識は、顔コレクションの中から個人の顔を探すことで、特定の個人のアイデンティティを特定、または検証するプロセスですが、Amazon Rekognition の、SearchFaces および SearchFacesByImage の API を使用することにより、アプリケーションに顔認識機能を追加することができます。SearchFaces APIは、FaceIDを使用しての検索、SearchFacesByImageは、画像による検索APIです。

顔コレクションとは、顔の特徴ベクトルの検索可能なインデックスです。CreateCollection API を使用することで、顔画像を指定するだけで、サポートされている AWS リージョンでコレクションを容易に作成することができます。

また既存の顔コレクションに顔を追加するには、IndexFaces API を使用します。この API は、S3 オブジェクトまたは画像のバイト配列の形式で画像を受け取り、検出された顔のベクトル表示を顔コレクションに追加します。
[DB2] Loadコマンドに関する自分用メモ(基本文法・進捗状況・Pending)


仕事中に調べたメモを簡単にまとめなおしたものです。そのため時間をかけて調べてまとめあげたという質のものではありません。__要するに自分用のメモです。__その手の性質のメモをQiitaに挙げるべきかどうか悩んだのですが、DB2のLOADコマンドについてドキュメントが少ないのも事実。ちょっとしたとっかかりになればうれしいです(´・ω・｀)

# 基本文法

```sql
load from xxxxx.csv of del
modified by codepage=1208
replace into xxxxx_table
```

__「とあるcsvファイル(文字コードはUTF-8)を特定のテーブルに読み込ませたい」__という個人的によく遭遇する場面を実現するのが上記のサンプルです。なおLOADには多様なオプションや機能があるので、それを利用する場合には次のリンクを利用するのがよいでしょう: https://www.ibm.com/support/knowledgecenter/ja/SSEPEK_10.0.0/ugref/src/tpc/db2z_loadsyntax.html

# LOADの進捗を監視したい

LOADコマンドはログを残さないという特質上、大量のデータをテーブルに投入する際利用されることが多いと思います。そこで気にかかるのが進捗具合。LOADコマンドがきわめて高速だとはいえ、数百万件数千万件単位のデータを投入するとなると時間がかかり、「いつ終わるのか」「途中で失敗していないか」「いったいどのぐらい進んでいるのか」ということが気になります――よね?

```sql
list utilities show detail
```

LOADの進捗状況は`list utilities`により確認することができます。またリアルタイムで監視したいというような場合にはシェルスクリプトと組み合わせることも可能です。

```bash
# 5秒ごとにLOADの進捗状況を確認したい。
while true; do
    db2 "list utilities show detail"
    sleep 5 
done
```

# LOAD Pendingの確認と解消方法

参考: [[DB2 LUW] ロード・ペンディングの回復方法](http://www-01.ibm.com/support/docview.wss?uid=swg21575037)

LOADを実行したテーブルに対して操作を行うと、[SQLエラー「SQL0668N」](https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_9.7.0/com.ibm.db2.luw.messages.sql.doc/doc/msql00668n.html)が返却され、操作に失敗することがあります。これはそのテーブルがPending状態にある、__要するにLOADコマンド中にエラーがあり、テーブルが事実上ロックされてしまっている__ということを示します。

まずはこの確認方法ですが、次のようなコマンドをたたくことによりPending状態かどうかを確認することができます。個人的な体感ですが、このコマンドを実行して結果が返るまで時間がかかるので、実行した場合は気長に待ちましょう。

```SQL
select 
    tabschema,
    tabname, 
    load_status, 
    no_load_restart 
from sysibmadm.admintabinfo 
where load_status <> 'NULL'
```

上記のコマンドの結果により、対象のテーブルがPendingにあることが分かった場合はLOADコマンドのterminateオプションを利用して、これを解消します。

```SQL
load from test.del of del 
messages msg.txt 
terminate into xxxxx
```

このとき`xxxxx`はPending状態にあるテーブルを示します。また__from句に指定するファイル名(サンプルでは`test.del`)は何を指定しても構いません。__Pendingの原因になったLOADコマンド実行時に指定したファイル名を指定する必要はなく、そもそも実在しないようなファイルを指定しても正常に動作します。

# 2017/07/19 追記:

この記事にはいくつかサンプルコードが提示されていますが、以下はそのサンプルをそれぞれ1行にまとめたものになります。なぜそのようなまとめを作っておくかというと――__コピペしやすいから(´・ω・｀)__

Qiitaの記事は見知らぬ他にに向けて発信するのが本来ですが、この記事に関しては筆者本人がお仕事中に参照することが多く、しかもそのような場合には__「サンプルコードをコピペして、ターミナルに直接貼り付けたい」__ということがほとんど。要するに自分の需要を満たしたいということです。

```sql
load from xxxxx.csv of del modified by codepage=1208 replace into xxxxx_table
```

```bash
while true; do db2 "list utilities show detail";  sleep 5 ; done
```

```sql
select tabschema, tabname,  load_status,  no_load_restart from sysibmadm.admintabinfo where load_status <> 'NULL'
```
```sql
load from test.del of del messages msg.txt  terminate into xxxxx
```
Amazon Rekognitionによる画像認識

機械学習に関する基本的な内容をまとめてみたものです。機械学習に関する、Web上にすでにある解説コンテンツをまとめたサイトの抜粋です。
[Rekognitionによる画像認識] (https://www.techcrowd.jp/amazonai/computervision/)

# [物体およびシーンの検出] (https://www.techcrowd.jp/amazonai/computervision/)

Rekognition では、車、ペット、家具などの数千もの物体を画像の中から識別することができます。検出結果としては、画像内の位置および検出したものが何であることを示す「ラベル」だけでなく、検出の確からしさを「スコア」として出力してくれます。また夕焼けやビーチのような画像内のシーンも検出することができます。これらの機能により、Rekognitionを利用すれば大規模な画像ライブラリを検索、フィルタリング、および管理する機能を簡単に追加することができます。


# [Rekognitionでサポートされるラベルの種類] (https://www.techcrowd.jp/amazonai/computervision/)

ラベルは、コンテンツに基づいて画像内で検出された物体、シーン、または概念を表します。例えば、南国のビーチで複数の人が写っている写真の場合、「人」、「水」、「砂」、「ヤシの木」、「水着」 (物体)、「ビーチ」 (シーン)、「アウトドア」 (概念) などのラベルが含まれる場合があり、Rekognition では、一般的なカテゴリに属する数千のラベルがサポートされます。


# [顔分析] (https://www.techcrowd.jp/amazonai/computervision/)

Rekognition では、画像内の顔を見つけて、笑っているか、瞳が開いているかどうかなどの顔属性を分析できます。画像を分析すると、Rekognition は、検出された顔それぞれの位置と長方形のフレームを返します。Rekognition の顔分析を使用して、ユーザーの感情を簡単に追跡できます。

Amazon Rekognition では、検出された顔ごとに次の顔属性が返されます。
・性別　・笑顔 	・感情
・メガネ　・サングラス　・目を開いているか
・口を開いているか　・口ひげ　・あごひげ
・姿勢 	・顔の質 	・顔の特徴

顔の質とは、鮮明度と明るさを示す二つのパラメータであり、顔の特徴とは目、鼻、口などの顔の主要な構成要素のふち、先端、中心の位置です。


# [顔の比較] (https://www.techcrowd.jp/amazonai/computervision/)

Rekognition を使用すると、2 つの画像の顔が同一人物である可能性を測定できます。Rekognition では、類似性スコアを使用して、ユーザーをほぼリアルタイムで参照写真と照合することができます。

Rekognitionでは、ソース画像に含まれる一つの画像を、ターゲット画像で検出された最大15の画像と比較することができます。


# [顔認識] (https://www.techcrowd.jp/amazonai/computervision/)

Rekognition により、大規模な画像のコレクションの中から似た顔を見つけることができます。画像から検出された顔のインデックスを作成することもできます。Rekognition の高速かつ正確な検索により、参照している顔と最も一致している顔が返されます。顔認識を使用することで、銀行の支払いにおける多要素認証、従業員の入館自動化などのアプリケーションを簡単に構築できます。
Visual Studio / WPF > XAML > コンテンツ構文

```txt:動作環境
Windows 7 Pro (32bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

@ WPF 4.5入門 by 大田一希さん
No.1400 / 9985

「コンテンツ構文」の例がButtonに対して紹介されている。

> System.Windows.Markup.contentPropertyAttribute属性でコンテンツプロパティが指定されている場合に限りプロパティ名を省略して書くことが出来ます。

作成済みのComboBoxで試してみた。

```xml:XAML
<Window x:Class="_170423_t1630_combobox.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:_170423_t1630_combobox"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <ComboBox HorizontalAlignment="Left" 
                  Margin="37,29,0,0" 
                  VerticalAlignment="Top" Width="120">
            <ComboBox.Items>
                <Label>
                    <Label.Content>
                        AAA
                    </Label.Content>
                </Label>
                <Label>
                    BBB
                </Label>
                <Label Content="CCC"/>
            </ComboBox.Items>
        </ComboBox>

    </Grid>
</Window>
```

AAAが省略してない場合、BBBは省略した場合。

大田さんの本の中では`[ContentProperty("Children")]`のようにしてcontentPropertyAttributeを変更する例もある。

### 関連リンク

MSDN: https://msdn.microsoft.com/ja-jp/library/system.windows.markup.contentpropertyattribute(v=vs.110).aspx

以下もシンプルでわかり易いです。
http://d.hatena.ne.jp/Yamaki/20061222/1166756248
Amazon Rekognitionの概要

機械学習に関する基本的な内容をまとめてみたものです。機械学習に関する、Web上にすでにある解説コンテンツをまとめたサイトの抜粋です。
[Amazon Rekognitionの概要] (https://www.techcrowd.jp/amazonai/summary-9/)

# [Amazon Rekognitionとは] (https://www.techcrowd.jp/amazonai/summary-9/)

Amazon Rekognition は、深層学習(ディープラーニング)を利用したフルマネージド型の画像認識サービスで、画像の分析をアプリケーションに簡単に追加できるようになります。Amazon Rekognition では、画像内の物体、シーン、および顔を検出できます。顔を検索および比較することもできます。またAmazon Rekognition の API を使えば、深層学習に基づく高度な視覚検索やイメージ分析をアプリケーションにすばやく組み込むことができます。

Amazon Rekognition の APIで用意されている機能は、以下の4種類です。
・(画像の中からの)物体とシーンの検出
・(画像の中からの)顔の検出と分析
・(人物の認証のための)顔の比較
・(画像の中からの特定の人物の顔を探す) 顔の検索

Amazon Rekognition は、大規模に画像を分析し、Amazon S3、AWS Lambda、その他の AWS のサービスとシームレスに連携するように作られています。


# [深層学習(ディープラーニング)とは] (https://www.techcrowd.jp/amazonai/summary-9/)

深層学習(ディープラーニング)とは、機械学習および人工知能の一分野で、生のデータから自動的に「特徴抽出」を行う技術分野を指し、画像認識の検出率を大幅に向上させたとして近年注目されています。

深層畳み込みニューラルネットワーク (CNN) やリカレントニューラルネットワークなどのいくつかの深層学習アーキテクチャが、コンピュータビジョン、音声認識、自然言語処理、およびオーディオ認識に適用され、さまざまなタスクで最先端の成果が実現しています。

Amazon Rekognition は、Amazon AI の一連のサービスの一部ですが、Amazon AI の各サービスは深層学習を利用して、画像の認識、テキストからリアルな音声への変換、直感的な会話型テキストおよび音声インターフェイスの作成を行っています。


# [Amazon Rekognitionを開始するには] (https://www.techcrowd.jp/amazonai/summary-9/)

まずはAmazon Rekognition ページの [AMAZON REKOGNITION をお試しください] をクリックし、サインアッププロセスを完了する必要があります。これにはアマゾン ウェブ サービスのアカウントが必要です。

サインアップしたら、Amazon Rekognition マネジメントコンソールを使用して自分の画像で Amazon Rekognition を試してみるか、Amazon Rekognition SDK をダウンロードして独自のアプリケーションの作成をすることができます。詳細については、入門ガイドの手順を参照してください。


# [ユースケース] (https://www.techcrowd.jp/amazonai/summary-9/)

###1.  検索することが可能な画像ライブラリ
Amazon Rekognition では画像の中から物体を検索することが可能です。新しい画像が S3 にアップロードされたときに、新しく検出された画像のラベルを Elasticsearch の検索インデックスに直接また自動的に追加する AWS Lambda 関数を作成することにより、S3上の画像ライブラリを検索可能とすることができます。

###2.  顔ベースのユーザー認証
Amazon Rekognition では、実際の画像を参照画像と比較して認証することができます。ユーザーの顔画像を登録しておくことにより、アプリケーションが顔画像からユーザー ID を確認することができます。

###3.  顔認識
SearchFaces関数を使用することにより、画像の中から人物の顔を見つけることが高い信頼性で行うことができます。また、IndexFaces API関数を使用することにより、顔のメタデータを保存しておくことにより、自分の登録済みの友人の顔画像を画像コレクションの中から検索することもできます。


# [料金について] (https://www.techcrowd.jp/amazonai/summary-9/)

Amazon Rekognitionでは、処理を実行させた「画像」の数をベースとした課金体系となっています。課金の対象となる処理は、Amazon Rekognition の、DetectLabels、DetectFaces、IndexFaces、SearchFaceByImage、CompareFaces、SearchFaces、および ListFaces の各 API です。

AWS 無料利用枠の一環として、Amazon Rekognition を無料で使用開始できます。サインアップすると、Amazon Rekognition を初めて使用するお客様は、最初の 12 か月間、毎月最大 5,000 の画像を無料で分析できます。この無料利用枠では、すべての Amazon Rekognition API を使用できます。また、最大 1,000 の顔を無料で保存できます。
【書評】オブジェクト指向でなぜつくるのか 第2版 

「オブジェクト指向でなぜつくるのか 第2版 」
https://www.amazon.co.jp/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E3%81%A7%E3%81%AA%E3%81%9C%E3%81%A4%E3%81%8F%E3%82%8B%E3%81%AE%E3%81%8B-%E7%AC%AC2%E7%89%88-%E5%B9%B3%E6%BE%A4-%E7%AB%A0/dp/4822284654)


##概要

オブジェクト指向(OOP)について書かれた入門書です。
入門書といっても実際に仕事や趣味でプログラムを書いている人向けだと思います。

OOPを説明する入門書の特徴として、
・動物がスーパークラスで犬がそのサブクラスでポチがインスタンス
・現実をそのままソフトウェアに表現する手段
といった例え話でとっつきやすさを重視した説明が強調されている本が少なくない中で、本書は
__「OOPは現実を全て反映するものではなく、PCに仕事の一部を肩代わりさせる手段の一つ」__
__「プログラムの仕組みと、現実世界をプログラムに落とし込むための考え方(汎用の整理術)は別物」__
といったスタンスで冷静にOOPの説明をしています。

前半は、機械語→アセンブリ言語→高級言語→構造化言語と変遷してきた歴史と、それらで大規模開発を行う限界について触れながら、
OOPによるクラスライブラリやフレームワークといった「再利用部品群」作成機能によって、構造化プログラミングでカバー出来なかった弱点を補った点について書かれています。
その機能の具体的な役割としては、
・変数とサブルーチンを__まとめる__
・それらをクラス内部だけで使えるように__隠す__
・1つのクラスからインスタンスを__複数作る__
であると表現されています。


中盤は、OOPにおけるメモリとインスタンスの仕組みについて1章割かれていて、静的領域、ヒープ領域、スタック領域などわかりやすく説明されていました。
その後、OOPがもたらした部品やアイデアの再利用について書かれており、ここで
・クラスライブラリ
・フレームワーク
・コンポーネント
・デザインパターン
の説明がされていました。
ここまでは割と「プログラム」寄りの解説がなされていましたが、この辺りから業務分析や要件定義といった
「上流工程」とOOPの繋がりを意識した話になってきます。
なぜなら
・クラス化
・ポリフォーフィズム
・継承
といった考え方はプログラム設計には適用出来ても、現実世界にそのまま適用出来ないためです。
そこで現実世界とソフトウェアの世界を上手く繋ぐ手段として、__集合論__が利用されました(高校数学でやりましたね)。これはクラスとインスタンスの関係が集合と要素であるためです。
また、OOPのクラスと集合論は厳密には異なるけども自然と適用されていった流れについても短いですが書かれています。
次の章では、現実世界の整理を表現する手段、ソフトウェアを2次元で表現する手段としてUMLの概要について説明されています。


終盤は、ハードウェアの能力向上によりアプリケーションの寿命が延び、
保守性と再利用性が重要になったという点を念頭に、ソフトウェア全体の構造定義について説明されています。
そのためには強い凝縮度と弱い結合度により、独立性の高い部品で構成する必要があり、
上流工程での整理術と下流工程でのプログラミング技術という2つの技術が必要だと書かれています。
ここまではOOPについて書かれていましたが、
次の章ではOOPを取り巻く開発環境についてその変遷が書かれています。
ウォーターフォール型開発からはじまり、反復型開発プロセス(代表例としてRUPやXP)が生まれ、
後者の性質を持つ似たような開発手法をアジャイル開発と名付けて推進する、
といった歴史などです。
そして、それらを推進するための実践手法として、
・テスト駆動開発
・リファクタリング
・CI
が整備され、広まったようです。


最後は、OOPの次に来る技術としてアスペクト指向(AOP)やエージェント指向やサービス指向など、バズワード化したものを少し紹介し、近年関心を集めだしている、関数型言語の概要と基本的な説明について紹介していました。


##感想

著者は「ソフトウェアは現実世界をそのまま反映するモノではない」と本の中で何度も言っています。
それだけ「現実世界をそのまま反映する」とイメージしている人が多い?のかもしれないですし、感違いに注意しましょうという主張を強く感じました。

途中、メモリーとインスタンスについて解説されている章がありましたが、個人的にとても分かりやすく、少し深く調べるとっかかりとして、とても良いと思いました。

昔「オブジェクト指向は集合論である」という話は先輩から聞いたことがありましたが、
その時はそこまでピンとは来ていませんでした。
しかし、「世界のあらゆるモノ(Object)が集合論によってクラスとインスタンスに整理される対象となり、オブジェクト指向が認識論や哲学にまで発展していった」という本書の説明が分かりやすく、__集合論__が__現実世界__を__オブジェクト指向プログラムの仕組み__へ落とし込むポイントなんだなと腑に落ちてきました。

一方で、中盤以降のUMLや上流工程に関しては実際にやった事がないとそこまでピンと来ないかもしれません。
終盤の関数型言語の章に関してもそうです。逆に
軽くでもやった後に読むと非常に腑に落ちてくる感じがしました。
なので、一通り仕事として触れてみた人が、改めて振り返り、表面的理解から一歩深い世界へ踏み入るきっかけとして良書だと思います。
かといってレベル的には初心者でも読みやすく、必ずしも上流工程に入ってからでないと理解出来ないという事はないです。バランスの良さを感じました。

また、あくまで、読み物として歴史的変遷や概念を始めて知る上では有効ですが、具体的にプログラミングの事やUMLの書き方などについて書かれているハウツー本ではないです。
GASを使ってSlackのStatusを自動で変更する

# はじめに

SlackにSatus機能が追加されました。
自分がどこにいるか、何をしているかを表示できる機能です。
これをGAS(Google Apps Script)で利用してみたいと思います。

# 概要

status_textとstatus_emojiを定期的にPOSTします。
以下のファイルを保存し、トリガーとして

* 週タイマー
* 毎週月～金曜日
* だいたいの時刻

を設定してください。
TOKENは自分のものに置き換えてください。

## 会社にいるとき

```js:office.gs
var TOKEN='';

function setStat(){
  var url='https://slack.com/api/users.profile.set?token='+TOKEN+'&profile=%7B%22status_text%22%3A%22%E4%BC%9A%E7%A4%BE%22%2C%22status_emoji%22%3A%22%3Aoffice%3A%22%7D&pretty=1';
  UrlFetchApp.fetch(url,{"method" : "post",});
}
```


## 学校にいるとき

```js:school.gs
var TOKEN='';

function setStat(){
  var url='https://slack.com/api/users.profile.set?token='+TOKEN+'&profile=%7B%22status_text%22%3A%22%E5%AD%A6%E6%A0%A1%22%2C%22status_emoji%22%3A%22%3Aschool%3A%22%7D&pretty=1';
  UrlFetchApp.fetch(url,{"method" : "post",});
}
```

## 自宅にいるとき

```js:house:gs
var TOKEN='';

function setStat(){
  var url='https://slack.com/api/users.profile.set?token='+TOKEN+'&profile=%7B%22status_text%22%3A%22%E8%87%AA%E5%AE%85%22%2C%22status_emoji%22%3A%22%3Ahouse%3A%22%7D&pretty=1';
  UrlFetchApp.fetch(url,{"method" : "post",});
}
```

# まとめ

現状は、かなり簡易的なものです。
今後は日時を取得して休日かどうかの判定を行ったり、自宅から出たら自動で実行するようにしてみたいです。

# 参考サイト

こちらの記事を参考にさせていただきました。
[Slack の Status emoji を API で変更する - Qiita](http://qiita.com/tanjo/items/63fef4b66c020a067449)
Amazon Lexのボット構造

機械学習に関する基本的な内容をまとめてみたものです。機械学習に関する、Web上にすでにある解説コンテンツをまとめたサイトの抜粋です。
[Amazon Lexのボット構造] (https://www.techcrowd.jp/amazonai/bot/)

# [Amazon Lexのボット構造] (https://www.techcrowd.jp/amazonai/bot/)

Amazon Lex は、音声やテキストを使用した会話型インターフェイスを構築するためのサービスです。Amazon Lex を使用すると、モバイルデバイスや複数のチャットサービス (Facebook Messenger など) に音声またはテキストのチャットボットを簡単に公開できます。

ボットを作成するためには、まず、そのボットで実行するインテントを定義します。各インテントに対して、発話とスロットを追加します。発話は、インテントを呼び出すフレーズです。スロットは、インテントを実現するために必要な入力データです。最後に、アクションの実行に必要なビジネスロジックを設定します。Lex ボットは、コンソールおよび API の両方から作成できます。

Amazon Lex ボットでは、複数回の対話のやり取りを行うことができます。意図が特定されると、ユーザーは、その意図を実行するために必要な情報の入力を求められます (例えば、”ホテルの予約” が意図である場合、ユーザーは場所、チェックインの日付、宿泊日数などの入力を求められます)。Amazon Lex を使用すると、チャットボットとの複数回の対話のやり取りを簡単に構築できます。ボットユーザーから収集するスロットやパラメータ、およびそれに対応するプロンプトを指定するだけで、適切なスロットの入力を求めるメッセージが自動的に選択され、会話が編成されます。


# [インテント] (https://www.techcrowd.jp/amazonai/bot/)

Amazon Lex ボットを構築するためには、ボットに達成させる意図、すなわち “インテント” のセットをする必要があります。インテントは、飛行機のチケットを買う、アポイントメントを調整する、天気予報を取得する、等のbotのユーザーが達成したいゴールを表します。

ボットには複数のインテントを設定できます。例えば、”チケット予約” ボットには、予約、予約キャンセル、および予約確認のインテントを設定できます。各インテントに対して、発話とスロットを設定することにより、インテントの内容を定義します。

Amazon Lex ボットでは、複数回の対話のやり取りを行うことができます。インテントが特定されると、ユーザーは、そのインテントを実行するために必要な情報の入力を求められます (例えば、”ホテルの予約” が意図である場合、ユーザーは場所、チェックインの日付、宿泊日数などの入力を求められます)。

Amazon Lex を使用すると、チャットボットとの複数回の対話のやり取りを簡単に構築できます。ボットユーザーから収集するスロットやパラメータ、およびそれに対応するプロンプトを指定するだけで、適切なスロットの入力を求めるメッセージが自動的に選択され、会話が編成されます。


# [発話とスロットとプロンプト] (https://www.techcrowd.jp/amazonai/bot/)

###発話 (Uttercase)
“発話” は、インテントを呼び出す音声またはテキストのフレーズです。例えば、予約のインテントを呼び出すために、「予約できますか?」のような発話を定義します。

###スロット
インテントを実現するためには、Amazon Lex ボットにはユーザーからの情報が必要です。この情報は “スロット” に取得されます。例えば、予約のインテントに対してはショーの名前と時間を定義します。

###プロンプト
スロットをユーザから引き出すための質問文です。  例えば、”時間” というスロットの値を引き出すために、「何時の便を予約したいですか?」のようなプロンプトを定義します。Amazon Lex では、マルチターン会話機能によって複数のスロット値を引き出すことができます。


# [ビジネスロジックの設定] (https://www.techcrowd.jp/amazonai/bot/)

Amazon Lex では、AWS Lambda との統合によって、アクションまたはビジネスロジックを “実行” します。また、解析済みのインテントとスロット値をクライアントに戻してアクションを実行するように Amazon Lex を設定できます。

Lambdaのサーバーレスコンピューティング性能により、ボットの開発に注力しながら、大規模なビジネスロジックを簡単に実行できます。Lambda からは、Amazon DynamoDB で会話の状態を維持する、Amazon SNS でエンドユーザーに通知を行うなど、AWS のさまざまなサービスを利用できます。
Visual Studio / WPF > XAML > コレクション構文

```txt:動作環境
Windows 7 Pro (32bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

@ WPF 4.5入門 by 大田一希さん
No.1313 / 9985

コレクション構文の例が掲載されている。

> 具体的には、コレクションのプロパティを設定する際に、コレクション型を明に指定せずに、コレクションの要素を複数指定します。

同じ形ではないが、ComboBoxを使った例を考えてみた。
以下をコレクション構文と言うのは正しいかは不明。

```xml:XAML
<Window x:Class="_170423_t1630_combobox.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:_170423_t1630_combobox"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <ComboBox HorizontalAlignment="Left" 
                  Margin="37,29,0,0" 
                  VerticalAlignment="Top" Width="120">
            <ComboBox.Items>
                <Label Content="AAA"/>
                <Label Content="BBB"/>
                <Label Content="CCC"/>
            </ComboBox.Items>
        </ComboBox>

    </Grid>
</Window>
```

![work.png](https://qiita-image-store.s3.amazonaws.com/0/32870/8dd5c4d4-ed9f-5703-9295-e41c69dd9562.png)


### 関連しそうなリンク

以下がシンプルでいいです。
http://so-zou.jp/web-app/tech/xml/xaml/
> 特定のプロパティがコレクション型を受け取るとき、そのプロパティの子要素として宣言することで、そのコレクションの一部となります。
Spring Boot の設定を環境毎に切り替える

本番と開発環境で設定を切り替える

その0: 環境変数や Java 引数
====
納品しない Web App なら、これが一番良いと思いますが、それが使えない時に2パターンほど。


その1: application-dev.yml を常に参照して、ビルドシステムで本番用の jar/war には入れない
=====
メリット： application-dev.yml にセンシティブな情報が入っていても、お客さんの手元の jar には含まれない
デメリット： リリース版の jar で何かがおかしいときに、簡単に `-Dspring.profiles.active=dev` にして動かしてみるということができない。

→ ISV 向け

やり方
----
まずこんな感じで二つファイルを設置

```
src/main/resources/
├── application-dev.yml
└── application.yml
```

application.yml では `spring.profiles.include: dev` を追加しておく

gradle で exclude の設定

```groovy:build.gradle
sourceSets.main.resources.excludes << '**/application-dev.yml'
```

ビルド後のファイルに、開発用ファイルが含まれていないことを確認。

```
% gradle clean assemble
:compileJava
:classes
:findMainClass
:jar
:bootRepackage

BUILD SUCCESSFUL

Total time: 2.065 secs

% jar -tvf build/libs/*.jar | grep yml
157 Sun Apr 23 16:41:50 JST 2017 BOOT-INF/classes/application.yml
```


その2: 本番には devtools を入れずに、devtools 有無で本番 war かどうかを判定
=====
メリット： 基本的に全部 Java の世界で話しが終わる。
デメリット： 本番 jar にも、参照されない application-dev.yml が含まれる。環境変数利用して、開発用のプロファイルで動かしてみることができる。

→ 社内でサーバーが動く Web 向け

やり方： http://qiita.com/kazuki-ma/items/56d696d23e59e569c8c7
Amazon Lexのデプロイ

機械学習に関する基本的な内容をまとめてみたものです。機械学習に関する、Web上にすでにある解説コンテンツをまとめたサイトの抜粋です。
[Amazon Lexのデプロイ] (https://www.techcrowd.jp/amazonai/deploy/)

# [IAM RoleとLambda Functionの作成] (https://www.techcrowd.jp/amazonai/deploy/)

Lexを作成する前に、「LexからLambda Functionを操作するRole」と「Lambda FunctionによるアクションのRole」の2つを作成します。

最初にLexからLambda Functionを操作するRoleを作ります。LexはまだプレビューのためIAMにAssumeRoleの選択肢がありませんので一旦Lambdaを指定しておいて後で手で書き換えます。ポリシーもカスタムで書くので空のまま作ります。

次に「信頼関係の編集」をクリックして、AsuumeRoleをLambdaからLexに書き換えます。アクセスコントロールポリシードキュメントも編集して信頼関係をカスタマイズしてLambdaのInvokeアクションを許可します。

Roleを２つ作成したら、Lambda Functionを作成します。Lambda FunctionのRoleとしては、さきほど作成した「Lambda FunctionによるアクションのRole」を選択します。


# [Lexの作成] (https://www.techcrowd.jp/amazonai/deploy/)

Lexコンソールからbotを定義し、全てのコンポーネントをセットアップすることができます。サンプルからはじめる事もできますし、カスタムbotをいちから作成することも出来ます。

Lexの作成は、名前をつけて、Roleを指定したら、次の画面に遷移して発話とスロットを定義していきます。Roleとしては、さきに作成した「LexからLambda Functionを操作するRole」を指定します。その後、SettingとChannelでFacebookを利用するためのコールバックURL(Facebook messengerとAmazon Lexのデータをやりとりをするために必要) などを設定します。


# [検証方法] (https://www.techcrowd.jp/amazonai/deploy/)

コンソールのテストウィンドウから Amazon Lex ボットをテストできます。AWS Lambda で実装されたビジネスロジックもすべて、このコンソールでインタラクティブにテストでることができます。

Amazon Lex は AWS Lambda と密接に統合されているため、初期化および検証の codeHook を使用してユーザー入力を検証することができます。このコードは、会話の 1 ターンごとに実行されます。codehook を使用すると、セッションパラメータの設定、ユーザー入力の検証、および応答のカスタマイズを実行できます。


# [デプロイとモニタリング] (https://www.techcrowd.jp/amazonai/deploy/)

Amazon Lex を使用すると、ボットを Amazon Lex コンソールから直接チャットサービスに簡単にパブリッシュできるため、マルチプラットフォーム開発に必要な労力を削減できます。リッチフォーマット機能により、Facebook Messenger などのチャットプラットフォーム用にカスタマイズされた直感的な操作感が実現します。

Amazon Lex コンソールの “モニタリング” ダッシュボードでボットのメトリクスを追跡することもできます。現時点で追跡できるのは、失敗した発話数、リクエストのレイテンシー、およびボットのチャネル別トラフィックです。
AMLのシステム構成

機械学習に関する基本的な内容をまとめてみたものです。機械学習に関する、Web上にすでにある解説コンテンツをまとめたサイトの抜粋です。
[AMLのシステム構成] (https://www.techcrowd.jp/machinelearning/system-configuration/)

# [完全マネージドの機械学習サービス] (https://www.techcrowd.jp/machinelearning/system-configuration/)

Amazon Machine Learning(AML)は、機械学習を行うためのインフラストラクチャやワークフローなどが不要の完全マネージド型機械学習サービスです。

そのため、
・ハードウェアのプロビジョニング
・コンピュータの負荷の分散やスケーリング
・リソース間の依存関係の管理
などに配慮する必要はありません。

ユーザーは使用するデータを用意するだけで、機械学習を行う事が出来ます。


# [システム構成] (https://www.techcrowd.jp/machinelearning/system-configuration/)

Amazon Machine Learningを使った機械学習システムは、
・データソースなどの入出力をするために使うS3、RedShift、RDS
・学習モデルの構築を構築して予測を行うAmazon Machine Learning
から構成されます。
シンプルなシステム構成となっているので、手軽に利用する事が出来ます。

複数の予測を一度に行うバッチ予測をするために、AWS APIを使ったクライアントアプリケーションを利用する事も可能です。


# [可用性の高いシステム構成] (https://www.techcrowd.jp/machinelearning/system-configuration/)

・モデルのトレーニング、評価、予測などは、Amazonのデータセンターで実行
・AWSのリージョン別に、サービススタックレプリケーションが複数の施設に分散
・メンテナンスなどによるダウンタイムはない

などの工夫がされています。

そのため、サーバーの障害やアベイラビリティーゾーンの機能停止に対しても、万全の対策が施されています。
AML二種類の予測方法

機械学習に関する基本的な内容をまとめてみたものです。機械学習に関する、Web上にすでにある解説コンテンツをまとめたサイトの抜粋です。
[AML二種類の予測方法] (https://www.techcrowd.jp/machinelearning/predictions/)

# [学習結果に基づいた予測] (https://www.techcrowd.jp/machinelearning/predictions/)

用意にしたデータを使って訓練した結果が満足の行くものであった時は、実際に予測を行います。

Amazon Machine Learningでは学習結果に基づいた予測が、
・バッチ予測
・リアルタイム予測
の二種類の方法で得られます。


# [バッチ予測] (https://www.techcrowd.jp/machinelearning/predictions/)

バッチ予測は、複数の予測を一度に取得したい時に使う方法です。

バッチ予測を利用するには、予めデータをデータソースに変換し、予測結果を格納するためにS3のロケーションを確保しておく必要があります。

予測するための用意が出来ましたら、訓練モデルを評価した時と同じようにデータソースを選択して、予測を行います。


# [リアルタイム予測] (https://www.techcrowd.jp/machinelearning/predictions/)

リアルタイム予測では低レイテンシの環境において、一つずつ予測を行う事が可能です。

AWS CLIなど使ってAPIを利用して、予測を取得します。

学習モデルに入力データを送ってから、予測結果を問い合わせる事で、予測を得る事が出来ます。
Atomのnarrowパッケージが素晴らしくって単語検索から編集、置換までスムーズにできるようになった話

# narrow素晴らしいですね！

[t9mdさん](http://qiita.com/t9md)が作られた[narrow](https://atom.io/packages/narrow)は実に素晴らしいパッケージです。ご本人が[narrow つくった](http://qiita.com/t9md/items/b719e8cb98627f4b6263)という記事で紹介しておられますので、是非ごらんください。

# で、この記事は何？

ここでは、AtomエディタをWindows環境かつEmacsキーバインドで使ってる私が、narrowを使って

1. 単語検索！
1. 検索結果の一覧表示、、からの～単語まとめて編集！[^1]
1. 編集結果を元のファイルに適用！

ということができるようになって、キャッキャするための操作や設定内容を書きます。誰かの役に立つと嬉しいです。。

[^1]:`Emacs`で`moccur-edit`を使って「単語検索結果をまとめて編集！適用」するみたいな感触です。

# こいつを見てくれ

百聞は・・ということで操作動画とりましたので、まずはご覧ください。

![narrow_scan_and_replace.gif](https://qiita-image-store.s3.amazonaws.com/0/166225/6e34b4a6-86d9-988f-e994-e06d69e94647.gif)

# こんな操作をしてるの

1. 検索したい単語にフォーカスを当てます。
2. そしたら、コマンドパレットを開いて`Scan`と入力、`Narrow: Scan By Current Word`を選択します。
3. 検索結果一覧がNarrow UIで開くので、そちらで単語にフォーカスを当てます。
4. 単語を全選択するコマンドを実行します。
    * コマンドパレットから実行するなら`Find And Replace: Select All`
    * Atom for Windowsなら`Alt + F3`でいけるはず！
5. Narrow UI上で編集を可能にします。
    * コマンドパレットから実行するなら`Narrow Ui: Start Insert`
    * 後述する`keymap.cson`を参考に設定して使いましょう！私は`Ctrl-i`にしました。
6. ザクッと編集して元ファイルに適用します。
    * コマンドパレットから実行するなら`Narrow Ui: Update Real File`
    * 私は`Ctrl-m`にキーバインドしました！

# おれおれキーバインド

Atomだけど[emacs-plus](https://atom.io/packages/emacs-plus)使ってキーバインドはEmacs風で使ってるので、もう何がAtom標準のキーバインドかさっぱりわからなくなってます(´・ω・`)　自分の設定で押しやすく且つ空いてるキーバインドにしてみました。

```keymap.cson
'atom-text-editor.narrow.narrow-editor[data-grammar="source narrow"]':
    'ctrl-i': 'narrow-ui:start-insert'
    'ctrl-m': 'narrow-ui:update-real-file'
```

`keymap.cson`ファイルは、自分用のAtomキーバインドを書くファイルです。
Windowsユーザーなら、`%UserProfile%\.atom\keymap.cson`にありますね。