OmniAICreator/Qiita-1.07M huggingface dataset:
続・SentencePieceを形態素解析のように使えるWebAPIを公開した

## はじめに
先日リリースしたSentencePieceを形態素解析のように使えるWebAPIですが、SentencePiece作者の工藤さんから色々とアドバイスを頂きました。[前回の投稿](http://blog.apitore.com/2017/04/13/api-sentencepiece/)は一部適切でない実装があったので、それを修正しました。[こちら](https://apitore.com/store/apis/details?id=37)から無料で使えます。

<img src="http://blog.apitore.com/wp-content/uploads/2017/04/amarec-20170412-235607.png" alt="" width="760" height="344" class="aligncenter size-full wp-image-975" />

<!--more-->

## API
- [SentencePiece API](https://apitore.com/store/apis/details?id=37)

## サンプルコード
- [Javaサンプル](https://github.com/keigohtr/apitore-sdk-java/tree/master/sentencepiece-response)

## 関連記事
- [本家Github](https://github.com/google/sentencepiece)
- [工藤さんによる解説](http://qiita.com/taku910/items/7e52f1e58d0ea6e7859c)
- [私のブログ](http://blog.apitore.com/2017/04/13/api-sentencepiece/)
- [Qiitaでのやりとり](http://qiita.com/keigohtr/items/7baee0d72bef5c5de2de)

## やったこと
前回との違いだけ記述します。

まず、SentencePieceでのモデル計算はいくつかモードがあります。今回はUnigramとBPEを試しました。

### Unigramモード
工藤さんから以下のコメントをもらいました。

> unigram だと、語彙テーブルの対数尤度に -1 かけて整数コストにし、未知語処理を切れば原理的には一緒になります。

というわけで、そのとおりにしました。
私がやったことを正確に伝えると、語彙テーブルの対数尤度に-100をかけてroundして整数コストにし、kuromoji/mecabの辞書に追加しました。未知語のところはkuromojiをextendモードで実行するとしました。未知語の単語コストはSentencePieceの語彙テーブルよりも十分高かったので、基本的にSentencePieceの語彙テーブルで形態素解析されます（たぶん）。extendモードで実行したのは、未知語が出てきたときに文字区切りにするためです。

### BPEモード
こちらも工藤さんからコメントをもらいました。

> BPE での分割は、ナイーブな実装でよければそれほど難しくありません。2つの文字を連結してみて辞書にあれば、その2文字を新しいシンボルに置換していきます。置換する箇所が複数ある場合は、優先度(最初に登録されている方が優先)順に置換します。
> https://ja.wikipedia.org/wiki/%E3%83%90%E3%82%A4%E3%83%88%E5%AF%BE%E7%AC%A6%E5%8F%B7%E5%8C%96
> 2文字の連続を連結して、辞書引きをします。みつかれば、その2文字をつなげてつなげたものを1文字とみなします。
> それを辞書引きができなくなるまで繰り返します。ナイーブな実装は、毎回2文字連続をスキャンするので、O(n^2) ですが、ヒープを使えば O(n log n）になります。

ヒープを使ううまいやり方が私にはわからなかったので、愚直にやりました。「語彙テーブルをルールとみなし、上から順番にルールを適用する」というものです。例えば、ルールが以下のように定義されているとします。

```
あい
うえ
あいう
```

入力が「あいうえお」だとしたら、この場合は出力は「あい うえ お」になります。過剰な説明かもしれませんが、下に示す別のルールの場合は、

```
あい
あいう
うえ
```

出力は「あいう え お」になります。


## で結果はどう変わったのか？
ほぼ同じでした。

前回の例はUnigramだろうとBPEだろうとどちらも結果は変わりませんでした。UnigramとBPEの語彙テーブルを見比べてみましたが、かなーり近いです。Unigramの方はつっこんだデータも多いことがあり、一応BPEとの違いはあります。

ただ、正確に実装できた（と思うので）、安心して使ってもらえると思います。


## おわりに
余談ですけど、UnigramモードはBPEモードに比べると省メモリなので、Wikipedia全文を学習につっこめました。その結果、12日間も計算しつづけました。。。電気代が・・・。というわけで、12日分の演算結果をApitoreでは無料で使えるので是非使ってみてください。
(期限通知があったので) Bluemix Infrastructure での従来 ID を IBMid へ切り替える

#0. はじめに
[Bluemix Infrastructure(旧SoftLayer) で、従来IDをIBMidに切り替える](http://qiita.com/y_tama/items/9d3f53b50f885966098f) に良くまとまった記事があるので、内容的には今更ですが「30日後にはログイン時に切り替えだよ」と言われてから、ログイン時の[二要素認証](http://qiita.com/conservativerad/items/64a1331b8e207c37c612#6-%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%83%BC%E3%83%9D%E3%83%BC%E3%82%BF%E3%83%AB%E3%81%A7%E3%81%AE-google-authentication)もそのまま切り替えられましたので、経緯を記録します。

#1. 30日間の猶予期間のお知らせ
以下のチケット作成のお知らせメールが届きました。
![スクリーンショット 2017-04-26 8.42.07.png](https://qiita-image-store.s3.amazonaws.com/0/74185/d880594e-270c-2979-faf1-d3c195da9e71.png)

ポータルにログインすると「IBMid に切り替えて下さい。切り替えないと 30日間の猶予終了後の初ログイン時に IBMid へ切り替えが必要です」（超訳）というチケットが作成されています。
![スクリーンショット 2017-04-26 8.54.28.png](https://qiita-image-store.s3.amazonaws.com/0/74185/886c8c5d-da07-6f9d-9b2e-033f090b9495.png)
ちなみにこのチケット中で言及している KnowledgeLayer の記事は、こちら「[Switching to IBMid](http://knowledgelayer.softlayer.com/procedure/switching-to-ibmid)」です。

#2. IBMid への切り替え
ギリギリまで粘っても良いことは無い? ので、切り替えを促すメッセージの 「User Profile」リンクもしくは画面上のユーザー名をクリックして「ユーザー・プロファイルの編集」画面へ移動します。じっくり目を凝らすと移行して欲しい気持ちがボタンのテキスト表記に現れたりしていますが、ここから先は [Bluemix Infrastructure(旧SoftLayer) で、従来IDをIBMidに切り替える](http://qiita.com/y_tama/items/9d3f53b50f885966098f) の記載とほぼ同一です。
![スクリーンショット 2017-04-26 9.37.32.png](https://qiita-image-store.s3.amazonaws.com/0/74185/32aa3338-2413-9f44-db75-a5134b610f09.png)

#3. Google の二要素認証を有効にしているとどうなるか？
「Bluemix Infrastructure(旧SoftLayer) で、従来IDをIBMidに切り替える」の [届くメールのリンクをクリックして有効化の項](http://qiita.com/y_tama/items/9d3f53b50f885966098f#%E6%97%A2%E5%AD%98ibmid%E3%81%BE%E3%81%9F%E3%81%AF%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%81%AE%E5%85%A5%E5%8A%9B) の手順に従って IBMid とそのパスワードの入力後、以下の画面が追加表示されます。画面デザインこそ違いますが、これまでと変わらず 「(Google)認証システム」アプリに表示される番号を入力すると先に進めます。結論から言えば特に心配する必要も無く、追加となるような手順はありませんでした。
![スクリーンショット 2017-04-26 9.53.08.png](https://qiita-image-store.s3.amazonaws.com/0/74185/f935824d-15be-b859-399b-bb1f1ee1b64b.png)

ポータル画面が表示されたら、一旦ログアウト後、通常のログイン画面下側の 「Log in with IBMid」ボタンから IBMid でポータルにログインできることを確認して切り替え作業を終えました。


残りわずかな期間でこの記事の内容を必要とする方も居なくなるはずですが、二要素認証を有効にしている方の助けになればと思います。
book > いかにして資料を読むか

（いかにして問題をとくか by G. ポリア）からのタイトルの拝借。

現在僕が読む資料の形態

- 紙 (プリンタ出力、本)
- PDF
- 人のブログ
- Kindle

### 紙

- 利点
  - 書き込みできる
  - フォーマット変化による継続利用性の喪失がない
     - 大工道具の歴史 by 村松 貞次郎さん、1973年の本をいまだに読むことができる
- 欠点
  - 書き込んだものを消すことができない (フリクションペンを使わない場合)
  - 持ち運びに難あり
  - 検索性に難あり
  - 重い(質量)
  
### PDF

- 利点
  - フォーマットが安定している
     - 最新版を追わない限り
  - ハイライトなどの追加事項
  - ハイライト同期機能がない
     - ハイライト消失問題が発生しない
- 欠点
  - 図の追記は手間がかかる
  - 複数端末でのハイライトの同期などにはDropboxなど経由での作業が必要

### 人のブログ

- 利点
  - ブラウザですぐに読むことができる
- 欠点
  - ハイライトをつけることができない
    - 別のツールが必要になり、気軽に読めない 
  - ブログ自体が消える場合がある
  - ブログシステムによっては検索性が悪い
  - 余分な情報がついてくる
  - ネット環境が必要

### Kindle

- 利点
  - 色々な端末で読むことができる
  - よほどのことがない限り、「利用の継続性」はなくならない、と思う、多分、おそらく
- 欠点
  - **同期処理の不具合でハイライトが消える可能性がある** 👹 👺👹 👺👹 👺
  - 重い (処理: on Kindle Paper White)

### 現状の選択

電子書籍としてはPDFがよさそうに思う。
Kindle版だけでなくPDF版の出版も希望する。

数年かけてつけたハイライトが消えた日には、ショックがでかい。
2年ためたビデオがレコーダ故障でとんだ状況を再度味わいたくはない。
  
### 電子版の注意点

本から電子媒体にするときに、スキャンしたものを自動テキスト化する過程で数式の変換間違いが発生することがある。
50ページのなかに49個の数式間違いという例も経験している。
間違いを指摘しても2年たっても修正はされず。

数式が多い資料だけは紙媒体で買うということも検討する方がよい。

電子データから本とPDFを両方作っている場合は、こういう心配はない。

### その他

YoutubeでのTutorial動画などは割愛。
Atom php-debugのデバッグ画面が表示されない


赤い部分がいつの間にか表示されなくなっていた。
![スクリーンショット1.png](https://qiita-image-store.s3.amazonaws.com/0/170537/fcf46f0d-4667-8182-4de0-b5a7189d1e32.png "スクリーンショット1.png")

config.csonの設定を変更すれば良いらしい。

/Users/ユーザ名/.atom/config.cson


```
  "php-debug":
    AutoExpandLocals: true
    DebugXDebugMessages: true
    PhpException: {}
    currentConsoleHeight: "139px"
    currentPanelHeight: "0px" → 100pxに変更
    currentPanelMode: "bottom"

```

設定変更後、Atomを再起動すれば表示されているはず。



## 参考
https://stackoverflow.com/questions/41742999/php-debug-console-not-showing-in-atom/43005474
React VRやってみた

#React VRってなに？
Oculusが開発したWebVR向けライブラリで、
類似するライブラリとしてはA-FrameやSolufaがあるという認識。
正式公開された模様なので触ってみる。

![スクリーンショット 2017-04-26 11.43.45.png](https://qiita-image-store.s3.amazonaws.com/0/16981/08e4396b-e22f-9535-b8ec-750cf011eaab.png)

#おおまかな手順
1.nodeJSインストール
2.ReactVRインストール
3.プロジェクト作成
4.起動して確認

うん、簡単そうだ。

#やってみる
##1.nodeJSインストール
既に入ってたので省略。(Mac: https://brew.sh/ Win: https://nodejs.org/en/download/)

##2.ReactVRインストール
```
npm install -g react-vr-cli
```
##3.プロジェクト作成
```
react-vr init WelcomeToVR
```
##4.起動して確認
```
cd WelcomeToVR
npm start
```
確認URL: http://localhost:8081/vr/index.html
![thKhG99uOe.gif](https://qiita-image-store.s3.amazonaws.com/0/16981/46ac520f-199b-92d9-f782-e5c9b5e405db.gif)

##コメント
おおー、すごい気合入ってるサンプルだなーと思ったら全天球画像と平べったい板の組み合わせだったｗ
![スクリーンショット 2017-04-26 12.14.40.png](https://qiita-image-store.s3.amazonaws.com/0/16981/34102236-8855-2f82-73c1-b233f6ddd5d1.png)
![スクリーンショット 2017-04-26 12.16.19.png](https://qiita-image-store.s3.amazonaws.com/0/16981/fc09e0ae-9499-3652-8766-a5ba1e51edaa.png)
タグをJavaScriptに内包してる分、DOMの負担が少なくてA-Frameよりは軽いのかしら？

外部モデリングデータの対応が今のところobjだけのようで、
A-Frameの用にdaeとか、a-mmd使った.pmxファイルの読み込みとかができない分
カジュアルに"やってみた"系のコンテンツを作るにはまだ向いてないような気はした(´・Д・)」
※fbxが一番扱いたいんですががが
Visual Studio / WPF > コントロール > ProgressBar

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

@ WPF 4.5入門 by 大田一希さん
No.4818 / 9985
> ProgressBarコントロール
> IsIndeterminateプロパティ

関連: [c++ builder > TProgressBar > 処理中の表示 > MarqueeInterval: 100 / Style: pbstMarquee / Step: 10](http://qiita.com/7of9/items/29af7af3c7b4bd47e909)

VSの方で「処理中」のProgressBarを表示するにはIsIndeterminateプロパティを設定するとのこと。

```xml:XAML
<Window x:Class="_170426_t1205_progressBar.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:_170426_t1205_progressBar"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <ProgressBar HorizontalAlignment="Left" 
                     IsIndeterminate="True"
                     Height="33" Margin="70,32,0,0" VerticalAlignment="Top" Width="386"/>

    </Grid>
</Window>
```

```MainWindow.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

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

変化の速度を変更できないか探したが、プロパティでそういうのはなさそうとのこと。

http://stackoverflow.com/questions/7396044/wpf-progress-bar-animation-speed

![work.png](https://qiita-image-store.s3.amazonaws.com/0/32870/e35d0216-888e-ad8c-2596-638b1324313a.png)

ScreenPressoでキャプチャしたためか、色表示がおかしい。
iOSアプリでfacebookログインを実装してみた

# はじめに
これは遠い昔に書くはずだった [dots.女子部 Advent Calendar 2016](http://qiita.com/advent-calendar/2016/dots_girls) の23日目の記事にします！
みんな書いてなくて本当にごめんなさい！

PHP一筋のサーバーサイドエンジニアだった私が
最近swiftデビューしてiOSアプリを作っているのでその過程でできたメモを公開します。
今回はfacebookログインを実装した話。

# Cocoadodsを使えるようにする
http://qiita.com/fksk/items/9e5fdc201af4f03f2dec
↑を見て作業

##Podfile
swift用FBSDKを利用する
https://developers.facebook.com/docs/swift/getting-started

```
use_frameworks!

target 'my_ios' do
    pod 'FacebookCore'
    pod 'FacebookLogin'
end
```
※CocoaPods使うときは<プロジェクト名>.xcworkspaceから開いて編集しないといけない
↑気付かずそのままxcodeprojファイルから開いて編集してたらライブラリが認識されなかった

# FacebookにiOS用アプリを作成しいてログイン機能を実装
普通にFacebook for Developersのページからアプリを作成
アプリメニューの設定→ベーシックのiOS欄
バンドルIDをいれておく(xcodeで確認)

## 【クイックスタート】を見ながら設定していくyo
>Track App Installs and App Opens

がObjective-Cでつらい・・と思ってぐぐったらswiftのコード出てきました。ありがとうございます。
http://studyswift.blogspot.jp/2016/01/facebook-sdk-and-swift-create-facebook.html
（Objective-Cも学んでおかないと今後こういうことあったときつらたん・・・:frowning2:）

### Thread 1:signal SIGABRTのエラー
AppDelegate.swiftのclass宣言のところで`Thread 1:signal SIGABRT`という謎のエラー・・
ぐぐったらシュミレーターを再起動ってでてきました。
https://wayohoo.com/mac/apps/developer-tools/iphone-strange-error-when-testing-on-simulator.html
再起動。
消えません。
↑の記事の人も消えていませんでしたので、同じようにMacを再起動。
なんか直らない・・

エラーを見たらFacebookAppID設定してないよと出ていた（エラー内容を残しておくのを忘れた）
「なんでよ！さっき.plistで指定したはずだもん！:tired_face:」
と思ったら.plist違いをしていた。
プロジェクト配下の.plistに追記するべきところを、Podsディレクトリ配下の.plistに追記していた
ので、プロジェクト配下の.plistに修正してあげたら無事動きました

### Pods配下の.plistって何なのよ
Pods配下の.plistと書いたけど実際は↓

```
Pods
┣ Target Support Files
  ┗ Pots-my_ios
    ┣ *Info.plist* <- コレ
    ┣ fugafuga...
┣　hogehoge...
```
Pods配下のものはCocoaPodsが使うものだから、アプリで使う設定はプロジェクトは以下の.plistに書きましょう。

# カスタムのログインボタンを設置するよ
https://developers.facebook.com/docs/swift/login

>Custom Login Button

に沿って設置

※ドキュメントの誤り
`myLoginTitle.setTitle("My Login Button" forState: .Normal)`
は
`myLoginButton.setTitle("My Login Button" forState: .Normal)`
に読み替え

# おしまい
ドキュメントを色々読み込んで実装しました:dancers:
アドベントカレンダーとは別に私のiOS開発過程メモを今後もリリース予定です。
Visual Studio / WPF > Label > アクセスキーを設定して、ターゲットコントロールにフォーカスを移す | 下線文字表示はLabelでなくTextBlockを使う

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

@ WPF 4.5入門 by 大田一希さん
No.4818 / 9985
> Labelコントロールは、「_アルファベット」でアクセスキーを提供して、Targetプロパティに設定したコントロールにフォーカスをうつす機能があります。

試してみた。

```xml:XAML
<Window x:Class="_170426_t1150_label.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:_170426_t1150_label"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <StackPanel>
            <Label Content="_NextGenration" Target="{Binding ElementName=T_1}"/>
            <TextBox x:Name="T_1"/>
            <Label Content="V_oyager" Target="{Binding ElementName=T_2}"/>
            <TextBox x:Name="T_2"/>
        </StackPanel>
        
    </Grid>
</Window>
```

```MainWindow.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

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

Altキーを押した状態。

![work.png](https://qiita-image-store.s3.amazonaws.com/0/32870/74bc8053-2cf3-4c45-b2fe-f72f77db4541.png)

### Labelの下線文字

`Next_Generation`のような文字をLabelに表示しようとすると、アクセスキーと判断されてしまう。

複数の下線("_")を入れた場合、最初の下線がアクセスキーになってしまう。

下線入りの文字列を表示するにはLabelでなくTextBlockを使うというのが現在の理解。

http://stackoverflow.com/questions/21104280/underline-a-label-in-c-sharp
> You can not use a Label with underline. Use a TextBlock instead.

装飾の下線と文字列中の下線がどちらもunderlineのような表記なのは検索性が悪い。

```math:
\underline{NextGeneration}
```

```math:
Next\_Generation
```
【ネタ】Java で Sleep Sort

http://qiita.com/lovee/items/9701151633d61e7ed4e3
http://qiita.com/takustaqu/items/412d6c36534b1145a024

というのがあったので、Java版です。

```java
int[] array = {5, 3, 6, 3, 6, 3, 1, 4, 7};

 new ForkJoinPool(array.length).submit(() -> {
	IntStream.of(array).parallel().forEach(n -> {

		try {
			TimeUnit.SECONDS.sleep(n);
			System.out.println(n);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	});
}).get();

/* 出力：
1
3
3
3
4
5
6
6
7
*/
```

*＃parallelStream のスレッド数に上限あるの気付かんで少し苦戦した...*
技術書読書会 #9 Infrastructure as Code

# 技術書読書会 #9 Infrastructure as Code

## 読書会とは
「もし生活が貧しくて物を売らなければならないとしたら、まず金、宝石、家、土地を売りなさい。最後まで売ってはいけないのは本である。」ユダヤ人の格言です。

技術書を最後まで読み切る事は意外と大変です。一人なら無理だけどみんなの力があればできるかも・・・。
そんなことを誰が思たのか、ともあれそんな気持ちに賛同したメンバーが１冊の技術書を読み込むという結構ハードルの高いことにチャレンジをしていきます。

## 技術書読書会の進め方
eXtreme Readingの方式で進めていきます。

### 実施方法
以下の流れで読書をしていきます。

```
1. 0分～5分間で、今回読み進める章/節を発表する
2. 15分～30分間で、読書
3. 5分～10分間で、ディスカッション
4. 1～3を時間分繰り返す
5. まとめ
```

今回の読書会は、所要時間30分で以下の配分で行いました。

```
1. 5分間で、今回読み進める章/節を発表する
2. 15分間、読書
3. 5分間、ディスカッション
4. 10分間、まとめ
```

### 利点
eXtreme Readingの利点です。

- 事前の準備がいらない。
- ディカッションをすることにより理解を深める事ができる。参加者全体の理解度の底上げが期待できる。
- 時間を区切って進行するので、読書の進捗が一定となり本の読み終わり時期を予測することができる
- みんなでやればなんとかなる


## 今回読む書籍
[Infrastructure as Code ―クラウドにおけるサーバ管理の原則とプラクティス](
https://www.amazon.co.jp/Infrastructure-Code-%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%82%B5%E3%83%BC%E3%83%90%E7%AE%A1%E7%90%86%E3%81%AE%E5%8E%9F%E5%89%87%E3%81%A8%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B9-Kief-Morris/dp/4873117968/ref=sr_1_1?ie=UTF8&qid=1491455639&sr=8-1&keywords=Infrastructure+as+Code)

## 参加人数
6人

## 所要時間
30分

## 進捗
4 .2.4- 4.4

## ディスカッション

### 4.2.4 サーバー上でコマンドを実行するためのツール 
岡　対話的にツールを使っているなら、自動化しましょう。
飯　いいこと言ってますね。
岡　やっぱり、四角の中
岡　結果、バランスっていっている。まあ、そうですよね。
岡　後、VCS使ってね。
飯　VCSについては、結構でてくるよね。
岡　これ絶対だよって！！毎回出てきている気がする

### 4.3.1 随時変更
浜　これは、アンチパターンということですよね

### 4.3.2 構成/設定の同期
峯　このアプローチの最大の限界は、サーバーの多くの部分がまだ管理されていない。って
宮　うちだと管理モデルはどれにあたるんですかね？

　　・・・。
  
 峯　サーバーチームが頑張ってるよね。
 岡　耳が痛いっていつも言ってるよね。
 
### 4.3.3 イミュータブルインフラストラクチャ
峯　これをめざしている
浜　洗練って、具体的にどのようにって書いてないですよね。

### 4.3.4 コンテナ化されたサービス
岡　ここまで持っていくのがね。

### 4.4 コンテナ
飯　ほとんど知らないですね。
岡　Dockerしか見てない。
飯　Wardenってなんですか？
飯　また出てきてます。VCSで管理でき。
岡　絶対なんですよ。
峯　そういえば、Puppetとか使ってましたか？
浜　Chefを使ってましたが、いちいち文句言ってました。何かの変更をかけるのにChefのマニュアルを見ないといけない。シェルでやるやり方は知っているのにChefでの設定の仕方を調べないといけない。
飯　そうなりますよね。
浜　その点、Dockerfileは、コマンドを並べるだけなのでわかりやすい。
峯　流れ的には、こういった流れになっているよね。目指すは22番ポートを閉じること
飯　それ、Ansible動くんですか？
峯　あ、動かないね。Ansibleのために開けるのもね。だから昨日セキュリティーのお話しが出たんだね。

## 気づき
読書会では、リモートの人でも参加できるように[appear.in](https://appear.in/)を利用しているのですが、こちらの不手際でPCの音声がミュートになっていました。というわけで、最初に音声の確認をすべきです。

## まとめ
Node.jsで外部コマンドの同時実行数を制御する

外部コマンドが大量に同時実行されるとシステムが不安定になるので同時実行数を制御するサンプル

# インストール

```
npm i execa semaphore
```

# モジュール定義

```:command.js
const execa = require('execa');
const semaphore = require('semaphore');

class Command{
  constructor(num){
    this.sem = semaphore(num || 1);
  }
  cmdAsync(cmdpath, cmdlist){
    return new Promise((resolve, reject) => {
      this.sem.take(() => {
        execa(cmdpath, cmdlist).then(result => {
          this.sem.leave()
          resolve(result)
        }).catch(e => {
          this.sem.leave()
          reject(e)
        })
      })
    })
  }
}
module.exports = Command
```

# サンプル

```
const Command = require('./command.js')
const com = new Command()
com.cmdAsync("sleep", ["1"]).then(console.log)
com.cmdAsync("sleep", ["1"]).then(console.log)
com.cmdAsync("sleep", ["1"]).then(console.log)
com.cmdAsync("sleep", ["1"]).then(console.log)
com.cmdAsync("sleep", ["1"]).then(console.log)
com.cmdAsync("sleep", ["1"]).then(console.log)
com.cmdAsync("sleep", ["1"]).then(console.log)
com.cmdAsync("sleep", ["1"]).then(console.log)
```
goroutineで複数無限ループ処理を行う


Go言語まだまだ勉強中です。
ご指摘いただけると嬉しいです。

# やりたいこと

- 無限ループ処理を複数goroutineで立ち上げて動かしたい
- 死んだ処理を再帰的に立ち上げたい

mastodonのstreaming-apiでnotificationsを監視する処理を、
インスタンス（アカウント）の数だけ立ち上げるということをやって見て
goroutine理解度の低さから、そもそも無限ループしないなどハマってしまったので動作コードをアップしました。


# 簡易版動作コード

3つの無限ループgoroutineを立ち上げて一定時間ごとにprintlnする。
落ちた処理は再度立ち上げる。
テスト用に一定確率で処理を落とす。

```go
package main

import (
	"fmt"
	"math/rand"
	"time"
)

func main() {
	// 処理対象（この数だけgoroutineを立てる）
	target := []int{1, 2, 3}

	inf := make(chan bool)

	go func(inf chan bool) {
		for i := range target {
			fmt.Println("goroutine up : ", i)
			go ctr(target[i], make(chan int))
		}
	}(inf)

	// 永遠に返ることがない
	<-inf
}

func ctr(n int, c chan int) {
	go loop(n, c)

	select {
	case <-c:
		fmt.Println("die and up:", n)
		ctr(n, c)
	}
}

func loop(no int, c chan int) {
	defer func() { c <- no }()
	for {
		fmt.Println("loop:", no)
		time.Sleep(1 * time.Second)
		if rand.Intn(10) == 1 {
			// テスト用に一定確率で落とす
			return
		}
	}
}
```
Visual Studio / WPF > ダイアログ > SaveFileDialog > FileNamesとFileNameで選択ファイルを取得できる | MultiSelectプロパティはない

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

@ WPF 4.5入門 by 大田一希さん
No.4717 / 9985
> SaveFileDialog
> OpenFileDialog

SaveFileDialogを使ってみた。

SaveFileDialogには`MultiSelect`プロパティはない。複数ファイルに書き込みをする、ということは普通はしないから。
一方で、OpenFileDialogには`MultiSelect`プロパティがある。複数ファイルを処理することはする場合があるから。

```xml:XAML
<Window x:Class="_170426_t1115_SaveFileDialog.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:_170426_t1115_SaveFileDialog"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Button x:Name="button1" Content="Save" 
                Height="50" Click="ShowDialog"></Button>
    </Grid>
</Window>
```

```MainWindow.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Microsoft.Win32;

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

        private void ShowDialog(object sender, RoutedEventArgs e)
        {
            SaveFileDialog sdlg = new SaveFileDialog();
            Nullable<bool> res = sdlg.ShowDialog();
            if (res == false)
            {
                return;
            }

            string msg = "";
            foreach(var elem in sdlg.FileNames)
            {
                msg += ",";
                msg += elem;
            }
            MessageBox.Show(msg);
        }
    }
}

```

![work.png](https://qiita-image-store.s3.amazonaws.com/0/32870/23a930bf-d6d7-8f6c-c26d-e1640f4bf136.png)

![work.png](https://qiita-image-store.s3.amazonaws.com/0/32870/ef0a8636-6a79-4e0d-4c62-ead60d3a9eea.png)

![work.png](https://qiita-image-store.s3.amazonaws.com/0/32870/0c474f1f-7576-bb4d-a93f-de682540b3d1.png)

![work.png](https://qiita-image-store.s3.amazonaws.com/0/32870/e823e52d-bc31-97ee-2e4e-6ade31b03e82.png)

SaveFileDialogの場合、既存のファイルを選択時に「XXは既に存在します。置き換えますか?」という確認ダイアログが表示される。
IntelliJのIDEでRspecのデバッグを効率的にする

Rubyでテストを書き始めて、お作法になれないためにいっぱい怒られる。
とりあえず、効率的にテストできないと辛いと思い、ボタン一つで特定のファイルのRspec走らせるぐらいは効率化したいと思いました。
結果、それもできたし、ブレークポイントで止めるって事もできるような環境になり、大満足。

試行錯誤の結果なので、たぶんこんな手順を踏んでできるようになったというのを書き残す。
※私はIDEAでRubyMineの同僚はちょっと設定が違ったようでした・・。

## Railsプロジェクトとして認識させる
file => Project Structure => Project Settings => Modules

私の場合IDEAを使っていたのでJAVAのModuleが初期設定されていたので削除。
**Ruby on Railsを追加する。**

Module name: 好きな名前
Content root: プロジェクトルートパス
Module file location: 人に影響及ぼしていいならContent rootでもいいんだろうが、まだよくわからない身分のため/.ideaに格納

## Rspecの設定をする
公式ドキュメント読んでとりあえずツッコみたいのがどうやってこのコンフィグに行くかパッとわからん。
そんな時はcommand + shift + a で「Rspec」をすると「Setup Rspec」を発見。
OKボタンをポチッと押したらそれで設定が完了までできました。
https://www.jetbrains.com/help/ruby/2017.1/run-debug-configuration-rspec.html


## Rspecを実行する
右クリックを押した場所で下記のテストのみを実行できる
- フォルダ単位
- ファイル単位
- テストケース単位
https://www.jetbrains.com/help/ruby/2017.1/run-debug-configuration-rspec.html

## ブレークポイント
走らせるときにDebugにすると、ブレークポイントをしこめばそこで止まってくれる。
debuggerと打っても止まるのかな？未確認です
実行初回にgemが必要なのでインストールするよとIDEが聞いてくるので、入れます。


　
以上で個人の環境ではできるようになりました。
Visual Studio / WPF > C# > bool? | Nullable<bool>: NULL許容型

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

http://gushwell.ldblog.jp/archives/52334178.html
のコードを見ていて、以下の記述が気になった。

```csharp
bool? result = openFileDialog.ShowDialog();
```

boolの後ろに`?`がついている。
これは
https://msdn.microsoft.com/ja-jp/library/bb384091.aspx
によると
> Null 許容 bool? 型

というものらしい。

Null許容型の記事は過去に書いている。
http://qiita.com/7of9/items/8eb2acca99db19c4193f

MSDNのページでは`bool?`でなく下記のような記載を使っている。
こちらの方がコードの可読性が高いように思う。
https://msdn.microsoft.com/ja-jp/library/microsoft.win32.savefiledialog(v=vs.110).aspx
> `Nullable<bool> result = dlg.ShowDialog();`
Visual Studio / WPF > ダイアログ > SaveFileDialog > using Microsoft.Win32; が必要

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

SaveFileDialogを使うには以下が必要のようだ。
`using Microsoft.Win32;`

OpenFileDialogは上記がなくてもデフォルトのusing文だけで使うことができた。

```MainWindow.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Microsoft.Win32;

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

        private void ShowDialog(object sender, RoutedEventArgs e)
        {
            OpenFileDialog odlg = new OpenFileDialog();
            SaveFileDialog sdlg = new SaveFileDialog();
        }
    }
}
```
Carthageを使ったフレキシブルな開発環境の構築


# tl;dr
Carthageを使って高速なビルド環境を手に入れたいけど、ライブラリ側のコードをデバッグしたいこともある、そんなあなたのための豆知識です。
https://github.com/toshi0383/CarthageWorkspaceSample

# 普通にCarthageでライブラリをインストールする
まずは普通に `carthage update` して、 `carthage copy-frameworks` をBuild Phaseに設定します。詳細は、[Carthageのドキュメント](https://github.com/Carthage/Carthage)に譲ります。

# `Carthage/Checkouts/` 以下に展開されたxcodeprojをプロジェクトに追加する
![library-added](https://qiita-image-store.s3.amazonaws.com/0/35008/757e5df6-b05f-d23a-3e93-35f5456254c9.png "ss.png")

こうすると、追加したxcodeprojをアプリと一緒にビルドしてくれるようになり、ライブラリ側のコードにデバッガを当てることができるようになります。追加する先はxcworkspace, xcodeproj, どちらでも構いません。

xcodeprojに追加する場合は、こんな感じになると思います。
![nested-xcodeproj.png](https://qiita-image-store.s3.amazonaws.com/0/35008/76f8668a-8ba3-4920-1885-0705f04ac4ad.png "nested-xcodeproj.png")


# ライブラリのデバッグをする必要がない時
上の手順を踏んだ状態だと、毎回ライブラリのxcodeprojをビルドしてしまいビルドに時間がかかります。気になる場合は `Carthage/Checkouts/` を削除して対応しましょう。参照が切れて赤くなりますが、Linkしているframeworkは `Carthage/Build/` にあるため、ビルドはちゃんと通ります。
![library-removed](https://qiita-image-store.s3.amazonaws.com/0/35008/8cf74675-4d06-847d-c1ac-fc11c31427fb.png "Screen Shot 2017-04-26 at 10.53.06.png")

普段はこの状態にしておいて、必要な時に `carthage checkout MyLibrary` として `Carthage/Checkouts/` に展開する形が良いかと思います。

ライブラリの数が増えてくると赤いのが目障りかもしれないので、Groupでまとめてしまってもいいかもしれません。
![grouped-xcodeproj.png](https://qiita-image-store.s3.amazonaws.com/0/35008/0057421a-84cc-8441-6f13-83ca219c09b4.png "grouped-xcodeproj.png")


# そもそもなぜこういう解説が必要なのか？
ビルドした人のPC上でしかデバッグシンボルが紐づかないというXcodeの問題があるためです。[Carthageのissueでも議論されていました](https://github.com/Carthage/Carthage/issues/924)。

この問題はAppleによってずっと放置されています。

> Dupe [rdar://23551273](http://www.openradar.me/23551273) if you want Apple to fix the root cause of this problem.

とCarthageのREADMEにもある通り、ぜひみんなで同じ内容のバグレポートを登録してAppleに改善を促しましょう！
意外と知らない『攻撃と防御』-基本の攻撃例3つ

##対象読者
- セキュリティ初心者で、『システムが攻撃される仕組み』『システムを攻撃から守る手段』の一例すらちゃんと説明できない人
 

## 1. 攻撃のステップの一例
あくまで一例。

**情報収集**
↓
**アクセス権を取得**
↓
↓　*失敗*
┝ーーーーーー→・**Dos攻撃**
↓　　　　　　　・**ウィルス・メール送信**
↓　*成功*　　　　　　↓　
↓　　　　　　　　　↓
**盗聴or改竄**　　　　←↓
**不正プログラム注入**
↓
**痕跡消去**

今回は上流の情報蒐集・アクセス権を取得に関わる基本的な攻撃を3つ紹介。

#2. 攻撃例

## 2-1. SQLインジェクション
Webページの入力フォームを通じて、RDBMS等のDBを使用しているプログラムに対して、任意のSQLを送信し、開発者の予期しないDB操作を行う行為

ex) 
`select * from student where student_id = 1`

このフォームのKeyパラメータに、"`1 OR 1=1`"を入力すると、意図と反して、**全件検索となってしまう**。
`select * from student where student_id = 1 OR 1=1`
即、情報漏洩。

【対策】
インターネットから入ってくる情報を鵜呑みにしない。（超基本）
**入力データを完全に「データ」として扱う**。ステートメントとして扱わないようにプログラムを記述するようにする（=**バリデーション**）。

ex) Perlの開発の場合、プレースホルダーを使用する。

我々が普段用いる、ほとんどのフレームワークではデフォルトで対策が導入されている。



##2-2. クロスサイト・ スクリプティング(CSS, XSS)
信頼されているが、セキュリテイ的に落ち度のあるサイトの中に、悪意のある人物がJavaScriptや入力フォームなどのコードを埋め込み、プライバシー情報を盗む手口。

相当セキュリテイがガバガバなサイトしかこの手口は使うことができないので、これが起きることはほとんどないし、自動で対策がなされているものがほとんど。

対応策例：
**サニタイジング・スクラビング**
送信されてくるデータを調べ、コンテンツとして、ブラウザーに送信してはならない文字を無害化、洗浄する処理。

ex1) 
JavaScriptなどの実行文などに使用される文字をエスケープ文字に変換する。

ex2) 
サニタイジング文字対象例

| 文字       |       エズケープ文字    |
|-----------------|------------------|
| <             |       \&#60, \&lt;  |
| &           |      \&#38; , \&amp;       |

##2-3. クロスサイト・リクエスト・フォージェリー(CSRF, XSRF)
攻撃用のWEBサイトに、スクリプトやCGIを動作させるリンクをあらかじめ仕込んでおいて、
そのサイトに何も知らない利用者を誘導してアクセスさせ、攻撃者が用意したデータを利用者の意図に関わらず特定のサイト（攻撃対象）に送信させる攻撃。

攻撃側は、攻撃対象にデータを送信するフォームを用意するだけなので、**非常にこの仕組みを作りやすい**のが特徴。




【対策】
◯基本
**不特定多数からのリクエストを受け付けないような仕組みを「鍵」を用いて作る。**

鍵の内容は、サーバー側でしか知らない文字列や、ユーザーのIPアドレスをなどを暗号化したもの。

鍵を持っていないリクエストは認めず、その鍵は容易に偽造できないようなものとすること。
Python2.7 + CentOS7 + OpenCV3

# お品書き
Python2.7でOpenCV3を利用したいので、CentOS7上に環境を用意します。

# 環境
* CentOS7
* OpenCV3
* Python2.7


# 必要そうなパッケージをインストール
```
# yum -y groupinstall base "Development tools"
# yum -y install cmake
# yum -y install numpy python-devel python-imaging
```

# OpenCVのインストール
## ソースをclone
createLBPHFaceRecognizer() を使いたいので opencv_contrib も一緒にclone

```
# cd /usr/local/src
# git clone https://github.com/opencv/opencv.git
# git clone https://github.com/opencv/opencv_contrib.git
```
安定版をcheckout

```
# cd /usr/local/src/opencv
# git tag | tail
2.4.9.1
3.0-ocl-tech-preview
3.0-ocl-tp2
3.0.0
3.0.0-alpha
3.0.0-beta
3.0.0-rc1
3.1.0
3.2.0
3.2.0-rc
# git checkout 3.2.0

# cd /usr/local/src/opencv_contrib
# git tag | tail
3.0.0
3.0.0-beta
3.0.0-rc1
3.1.0
3.2.0
3.2.0-rc
# git checkout 3.2.0
```

# ビルド
```
# mkdir /usr/local/src/opencv/build
# cd /usr/local/src/opencv/build

# cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D BUILD_opencv_python2=ON \
-D BUILD_NEW_PYTHON_SUPPORT=ON \
-D PYTHON_EXECUTABLE=$(which python) \
-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules \
..

# make -j$(nproc)
# make install
```
Pythonから参照できるようにシンボリックリンクを貼っておく

```
# ln -s /usr/local/lib/python2.7/site-packages/cv2.so /usr/lib/python2.7/site-packages/cv2.so
```

## 確認

```
# python -c 'import cv2; print cv2.__version__'
3.2.0
```
[Scala] 12. Generic Classes

> Scalaをつかうプロジェクトが始まる予定があり、簡単にScalaの勉強をしようと。
> 
> 特に話がない内容は[Scala公式ホームページ](http://www.scala-lang.org)の内容を基に作成。

# Generic Classes

Collect Classの開発に利便性がある。


## 例

```scala
// Stack.scala
class Stack[T] {
  var elems: List[T] = Nil
  def push(x: T): Unit = { elems = x :: elems }
  def top(): T = elems.head
  def pop(): Unit = { elems = elems.tail }
}
```

## テスト

```scala
// StackTest.scala
object StackTest extends App {
  val stack = new Stack[Int]
  stack.push(1)
  stack.push('a')
  println(stack.top)
  stack.pop()
  println(stack.top)
}
```

## 結果

```scala
97
1
```
[Scala] 11. Sequence Comprehensions

> Scalaをつかうプロジェクトが始まる予定があり、簡単にScalaの勉強をしようと。
> 
> 特に話がない内容は[Scala公式ホームページ](http://www.scala-lang.org)の内容を基に作成。

# Sequence Comprehensions

Scalaには簡単なSequence ComporihensionのSyntaxがある。

Comprehensionは`for(enumerators) yield e`の形。



## 例 & テスト

```scala
// Comprehensions.scala
object Comprehensions extends App {
  def foo(n: Int, v: Int) = {
    for(i <- 0 until n; j <- i until n; if i+j == v) yield (i, j)
  }

  foo(20, 32) foreach {
    case (i, j) => println(s"($i, $j)")
  }
}
```

## 結果

```scala
(13, 19)
(14, 18)
(15, 17)
(16, 16)
```
[Scala] 10. Pattern Matching

> Scalaをつかうプロジェクトが始まる予定があり、簡単にScalaの勉強をしようと。
> 
> 特に話がない内容は[Scala公式ホームページ](http://www.scala-lang.org)の内容を基に作成。

# Pattern Matching

Scalaは汎用性のあるPattern Matchingをサポートしている。

## 例 & テスト

```scala
// Matching.scala
object Matching extends App {
  var m = (x: Any) => x match {
    case i: Int if i == 1 => "I one"
    case i: Int if i == 2 => "I two"
    case d: Double if d == 1.0 => "D one"
    case d: Double if d == 2.0 => "D two"
    case s: String if s == "1" => "S one"
    case s: String if s == "2" => "S two"
    case _ => "UNKNOWN"
  }
  
  println(m(1))
  println(m(1.0))
  println(m("2"))
}
```

## 結果

```scala
I one
D one
S two
```
[Scala] 09. Case Classes

> Scalaをつかうプロジェクトが始まる予定があり、簡単にScalaの勉強をしようと。
> 
> 特に話がない内容は[Scala公式ホームページ](http://www.scala-lang.org)の内容を基に作成。

# Case Classes

基本、変化なしのクラス。

Pattern Matchingを通じて分解可能。

構造的なEquality(Not Reference)。

初期化、使用が簡単。



## 例

```scala
// Notification.scala
abstract class Notification

// Email.scala
case class Email(sourceEmail: String, title: String, body: String) extends Notification
```

## テスト

```scala
// CasesClassTest.scala
object CasesClassTest extends App {
  def showNotification(o: Any): String = {
    o match {
      case Email(email, title, _) =>
        "You got an email from "+email+" with title: "+title
      case _ => "Error occured: Unknown Type"
    }
  }
  
  val emailFromJohn = Email("john.doe@mail.com", "Greeting from John!", "Hello, World!")
  val emailFromJohnCopied = emailFromJohn.copy()
  // emailFromJohn.title = "Goodbye From John!"
  val editedEmail = emailFromJohn.copy(title="I am learning Scala!", body = "It's so cool!")

  println(emailFromJohn)
  println(emailFromJohnCopied)
  println(editedEmail)
  
  val title = emailFromJohn.title
  println(title)
  println(emailFromJohn == emailFromJohnCopied)
  println(showNotification(emailFromJohn))
}
```

## 説明

初期化時、newキーワードがない。

Case Classの変数はpublic&Immutable。

「CaseClass.copy」メソッドを使って、コピーすることができる。

暗黙的に`toString`と`equals`のメソッドが生成される。

Pattern Matchingと同様に使うことが多い。


## 結果

```scala
Email(john.doe@mail.com,Greeting from John!,Hello, World!)
Email(john.doe@mail.com,Greeting from John!,Hello, World!)
Email(john.doe@mail.com,I am learning Scala!,It's so cool!)
Greeting from John!
true
You got an email from john.doe@mail.com with title: Greeting from John!
```
windowsでTensorFlow その3

#概要
windowsのTensorFlowで、手書き数字の分類やってみた。

#写真
![tegaki.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/be9708af-64f6-3d4f-25a6-66b292218c41.jpeg)

#環境
windows 7 sp1 64bit
anaconda3
tensorflow 1.0

#参考
http://qiita.com/jintaka1989/items/28885fe806fd68eb2b3b

#インストール
opencv3
pyqt5

#成果物
https://github.com/ohisama/tensorflow-tegaki
[Scala] 08. Currying

> Scalaをつかうプロジェクトが始まる予定があり、簡単にScalaの勉強をしようと。
> 
> 特に話がない内容は[Scala公式ホームページ](http://www.scala-lang.org)の内容を基に作成。

# Currying

メソッドには複数のパラメータを指定することが可能である。

受け取るべきのパラメータより少ないパラメータを入れて関数を実行する方法がCurrying。



## 例

```scala
// Currying.scala
class Currying {
    def filter(xs: List[Int], p: Int => Boolean): List[Int] = {
        if(xs.isEmpty) xs
        else if(p(xs.head)) xs.head :: filter(xs.tail, p)
        else filter(xs.tail, p)
    }
    def modN(n: Int)(x: Int): Boolean = ((x % n) == 0)
}
```

## テスト

```scala
// CurryingTest.scala
object CurryingTest extends App {
  val l = List(1, 2, 3, 4, 5, 6, 7, 8)
  var c = new Currying
  println(c.filter(l, c.modN(2)))
  println(c.filter(l, c.modN(3)))
}
```

## 説明

クラス`Curry`のmodNメソッドには2つのパラメータが必要。

しかし、Curryingしたので、呼び出すときに1つのパラメータで呼ぶことができる。

## 結果

```scala
List(2, 4, 6, 8)
List(3, 6)
```
[Scala] 07. Nested Method

> Scalaをつかうプロジェクトが始まる予定があり、簡単にScalaの勉強をしようと。
> 
> 特に話がない内容は[Scala公式ホームページ](http://www.scala-lang.org)の内容を基に作成。

# Nested Method

ScalaはNested Methodをサポートする。

## 例

```scala
// Filter.scala
class Filter {
    def filter(xs: List[Int], threshold: Int) = {
        def process(ys: List[Int]): List[Int] = {
            if (ys.isEmpty) ys
            else if (ys.head < threshold) ys.head :: process (ys.tail)
            else process(ys.tail)
        }
        process(xs)
    }
}
```

## テスト

```scala
// FilterTest.scala
object FilterTest extends App {
  var f = new Filter
  var l = List(1, 3, 4, 5, 7, 9, 2)
  
  println(f.filter(l, 6))
}
```

## 説明

関数「filter」のパラメータは`List[Int]`と`Int`。

関数「process」のパラメータは`List[Int]`。

「List.isEmpty」はリストの値がない場合。

「List.head」はListの最初の変数。

「List.tail」はList.headを除いたListを返す。

「Int::List[Int]」はListのpushに該当する。

## 結果

```scala
List(1, 3, 4, 5, 2)
```
[Scala] 06. High Ordered Function

> Scalaをつかうプロジェクトが始まる予定があり、簡単にScalaの勉強をしようと。
> 
> 特に話がない内容は[Scala公式ホームページ](http://www.scala-lang.org)の内容を基に作成。

# High Ordered Function

ほかの関数をパラメータとして受け取るか、実行の結果が関数。

```scala
def apply(f: Int => String, v: Int) = f(v)
```

上記は別の関数fと、値vを受け取る。

処理後、関数f(v)をReturnする。



## 例

```scala
// Decorator.scala
class Decorator(left: String, right: String) {
    def layout[A](x: A) = left + x.toString() + right
}
```

## テスト

```scala
// DecoratorTest.scala
object DecoratorTest extends App {
    def apply(f: Int => String, v: Int) = f(v)
    val dec = new Decorator("[", "]")
    println(apply(dec.layout, 7))
}
```

## 説明

`Decorator`クラスは文字列2つをパラメータとして受け取る。

`layout`関数は値xを受け取って、文字列を返す。

`apply`関数は関数「f(int)=>String」と値「v: Int」を受け取る。

結果として関数「f(v)」を返す。

メソッド`dec.layout`は「Int => String」になる。

Decoration.layoutのxがIntで、Return TypeはStringになるっていう意味。

## 結果

```scala
[7]
```
[Scala] 05. Anonymous Function

> Scalaをつかうプロジェクトが始まる予定があり、簡単にScalaの勉強をしようと。
> 
> 特に話がない内容は[Scala公式ホームページ](http://www.scala-lang.org)の内容を基に作成。

# Anonymous Function

Anonymous関数の例

簡単なSyntaxでAnonymous関数を作成することができる。

```scala
Int => Int
(Int, Int) => String
() => String
``

上記の簡単な表現で、下記のようなAnonymous関数が作成される。

```scala
Function1[Int, Int]
Function2[Int, Int, String]
Function0[String]
```
[Scala] 04. Mixin Class Composition

> Scalaをつかうプロジェクトが始まる予定があり、簡単にScalaの勉強をしようと。
> 
> 特に話がない内容は[Scala公式ホームページ](http://www.scala-lang.org)の内容を基に作成。

# Mixin-class Composition

多重相続を実装するため、一般的な目線でクラスを再使用する。

## 例

```scala
// AbsIterator.scala
abstract class AbsIterator {
    type T
    def hasNext: Boolean
    def next: T
}

// RichIterator.scala
trait RichIterator extends AbsIterator {
    def foreach(f: T => Unit) { while(hasNext) f(next) }
}

// StringIterator.scala
class StringIterator(s: String) extends AbsIterator {
    type T = Char
    private var i = 0
    def hasNext = i < s.length()
    def next = { var ch = s charAt i; i += 1; ch }
}
```

## テスト

```scala
// StringIteratorTest.scala
object StringIteratorTest extends App {
    var s: String = "This is a StringIterator's Test"
    class Iter extends StringIterator(s) with RichIterator
    var iter = new Iter
    iter foreach println
}
```

## 説明

### AbsIterator

`type T`はIteratorを実装する対象のType

`hasNext`は次の値があるかどうかを確認するための関数

`next`は次の値がある場合、次の値

### RichIterator

Iteratorを通じてReturnされる値に適応される関数を定義する

`foreach`: 各値に何かを適応してくださいとの意味

`(f: T => Unit)`: Tは各値を意味、fは適応する関数、Unitは**Return void**

### StringIterator

`type T`: Char

`hasNext`: 文字列のLengthに比べて次の値があるかを確認

`next`: hasNextがTRUEの場合、次に位置する文字をnextにする

## 結果

```scala
T
h
i
s
 
i
s
 
a
 
S
t
r
i
n
g
I
t
e
r
a
t
o
r
'
s
 
T
e
s
t
```
[Scala] 03. Trait

> Scalaをつかうプロジェクトが始まる予定があり、簡単にScalaの勉強をしようと。
> 
> 特に話がない内容は[Scala公式ホームページ](http://www.scala-lang.org)の内容を基に作成。

# Trait

JavaのInterfaceのような感じ。

メソッドの基本的な内容を記載する。

`mixin-class composition`を通じて別のクラス、別のTraitと統合される。

## 例

```scala
// Similarity.scala
trait Similarity {
    def isSimilar(x: Any): Boolean
    def isNotSimilar(x: Any): Boolean = !isSimilar(x)
}

// Point.scala
class Point(xc: Int, yc: Int) extends Similary {
    var x: Int = xc
    var y: Int = yc

    def isSimilar(obj: Any): Boolean = {
        obj.isInstanceOf[Point] && obj.asInstanceOf[Point].x == x
    }
}
```

## テスト

```scala
// PointTest.scala
object PointTest extends App {
  var p1 = new Point(2, 3)
  var p2 = new Point(2, 4)
  var p3 = new Point(3, 3)
  
  println(p1.isNotSimilar(p2))
  println(p1.isNotSimilar(p3))
  println(p1.isNotSimilar(2))
}
```

## 説明

クラス`Point`は初期化の時、xc, ycの2つのパラメータを受け取る。

`Point`には2つのIntegerをパラメータとして受け取って、`Point`内のxとyの位置を変更させる。

toStringメソッドをOverridingして、コンソールにて表示できるようにしよう。


## 結果

```scala
false
true
true
```
[Scala] 02. Class

> Scalaをつかうプロジェクトが始まる予定があり、簡単にScalaの勉強をしようと。
> 
> 特に話がない内容は[Scala公式ホームページ](http://www.scala-lang.org)の内容を基に作成。

# クラス

ScalaのクラスはRuntime時、多数のオブジェクトにインスタンス化できる静的なテンプレートである。

## 例

```scala
// Point.scala
class Point(xc: Int, yc: Int) {
    var x: Int = xc
    var y: Int = yc

    def move(dx: Int, dy: Int) {
        x = x + dx
        y = y + dy
    }
    override def toString(): String = "(%d, %d)".format(x, y)
}
```


## テスト

```scala
// PointTest.scala
object PointTest extends App {
    var p = new Point(1, 2)
    println(p)
    p.move(10, 10)
    println(p)
}
```

## 説明

クラス`Point`は初期化の時、xc, ycの2つのパラメータを受け取る。

`Point`には2つのIntegerをパラメータとして受け取って、`Point`内のxとyの位置を変更させる。

toStringメソッドをOverridingして、コンソールにて表示できるようにしよう。

## 結果

```scala
(1, 2)
(11, 12)
```
[Scala] 01. Getting Start

Scalaに対して勉強した内容の整理。

> Scalaをつかうプロジェクトが始まる予定があり、簡単にScalaの勉強をしようと。
> 
> 特に話がない内容は[Scala公式ホームページ](http://www.scala-lang.org)の内容を基に作成。

# オンライン学習

## Coursera

[Coursera](https://en.wikipedia.org/wiki/Coursera)にはプログラミングに関する様々な講義があり、無料でプログラミングを学ぶことができる。

(ほとんどが英語の講義ということが問題だけど、、)

1. [Functional Programming Principles in Scala](https://www.coursera.org/learn/progfun1)

2. [Functional Programming in Scala Specialization](https://www.coursera.org/specializations/scala)

## Kojo

[Kojo](http://www.kogics.net/kojo)ではInteractiveな環境でプログラミングをはじめ、数学、芸術、音楽、アニメーション、ゲームなどが学習できる環境である。

# 初めてのScala

## `Hello, world!`プログラム

```scala
object HelloWorld {
    def main(args: Array[String]): Unit = {
        println("Hello, world!")
    }
}
```

もし、Appオブジェクトを`extends`して、Objectを作成すると、`main`関数を作成する必要はない。

```scala
object HelloWorld extends App {
    println("Hello, world!")
}
```
[PlayFramework] 04. Manipulating Results

> Scalaの一番有名なフレームワークはPlay Frameworkである。
> 
> Play Frameworkに対して簡単に勉強しようと。
> 
> 特に話がない内容は[PlayFramework公式ホームページ](https://www.playframework.com/)の内容を基に作成。

# Manipulating Results

## 基本的に`Content-Type`は自動で変わる

```scala
def actionText = Action {
    implicit request => Ok("Hello, World!")
}

def actionXml = Action {
    implicit request => Ok(<message>Hello World!</message>)
}
```

Okのパラメータをパーシングして、actionTextは`text/plain`に、actionXmlは`application/xml`に処理する。

これに関するAPIは`play.api.http.ContentTypeOf`クラスに書いてある。


Content-Typeを指定して、Responseを処理したい場合は下記のように作成。

```scala
def actionExplicitOne = Action {
    request => Ok(<h1>Hello World!</h1>).as("text/html")
}

def actionExplicitTwo =  Action {
    request => Ok(<h1>Hello World!</h1>).as(HTML)
}
```

## HTTP Headerの操作

```scala
def actionManipulatingHeader = Action {
    implicit request => Ok("Hello World!").withHeaders(
        CACHE_CONTROL -> "max-age=3600",
        ETAG -> "xx"
    )
}
```

## Cookieの生成、削除

CookieはHTTP Headerの特別なフォームである。

Helperを利用して簡単に操作ができる。

```scala
def createCookie = Action {
    implicit request => Ok("Create Cookie").withCookies(
        Cookie("customCookie", "this is cookie")
    )
}

def removeCookie = Action {
    implicit request => Ok("Remove Cookie").discardingCookies(DiscardingCookie("customCookie"))
}

def createRemoveCookie = Action {
    implicit request => Ok("Create And Remove Cookie").withCookies(
        Cookie("CreatedCookie", "OK")
    ).discardingCookies(
        DiscardingCookie("customCookie")
    )
}
```

## HTTP Responseの文字のエンコーディングを変える

```scala
import play.api.mvc.Codec
class CustomController extends Controller {
    implicit val myCustomCharset = Codec.javaSupported("iso-8859-1")
}
```
[PlayFramework] 03. HTTP Routing

> Scalaの一番有名なフレームワークはPlay Frameworkである。
> 
> Play Frameworkに対して簡単に勉強しようと。
> 
> 特に話がない内容は[PlayFramework公式ホームページ](https://www.playframework.com/)の内容を基に作成。

# HTTP Routing

## 内装のHTTPルータ

RouterはActionに来るHTTP Requestを訳すコンポーネントである。

MVC Frameworkで、HTTP RequestはEventに扱われる。

Eventは2つの情報のパートを含めている。

1. クエリ文字列を含めたRequest Path(e.g. `/clients/1542`, `/photos/list`)

2. HTTP Method(e.g. `GET`, `POST`)

Routesは`conf/routes`ファイルに書いてある。

## routesファイルのSyntax

`conf/routes`はルータに使われる設定ファイルである。

各ルーツは`HTTP Method`と`URI pattern`で構成されている。

2つのパートで構成されているルーツで`Action`が呼ばれる。

```
GET     /clients/:id        controllers.Clients.show(id: Long)
->      /api                api.MyRouter
```

一般的にはHTTP `Method`、`URI`、`Controllerの関数`の指定でルーツを書く。

しかし、別のroutesファイルを作成した場合には`->`、`URI`、`Controllerの関数`を書く。

> **Note** 
> 
> * URIのパターンは1つ以上のDynamicパートで構成可能
> 
> * Regular Expressionの適応も可能。

## HTTP Method

PlayはHTTPがサポートするすべてのメソッドの使用が可能。

`GET`、`PATCH`、`POST`、`PUT`、`DELETE`、`HEAD`のすべてが使用可能。

## Reverse Routing

```scala
def helloBob = Action {
    implicit request => Redirect(routes.<Controller>.<method>(<params>))
}
```

## Default Controller

PlayにはDefault Controllerが内装されている。

```
// 303 See Other
GET     /about      controllers.Default.redirect(to = "http://~")

// 404 Not Found
GET     /orders     controllers.Default.notFound

// 500 Internal Server Error
GET     /clients    controllers.Default.error

// 501 Not Implemented
GET     /posts      controllers.Default.todo
```
[PlayFramework] 02. Actions, Controllers and Results

> Scalaの一番有名なフレームワークはPlay Frameworkである。
> 
> Play Frameworkに対して簡単に勉強しようと。
> 
> 特に話がない内容は[PlayFramework公式ホームページ](https://www.playframework.com/)の内容を基に作成。

# Actions, Controllers and Results

## routes

```scala
// routes
GET / controllers.HomeController.index
```

`http://localhost:9000`に接続すると`routes`によって、HomeControllerの`index`関数が実行される。

## Action(Controllers)

ほとんどのRequestは`Action`によってハンドルされる。

`play.api.mvc.Action`は基本的に`(play.api.mvc.Request => play.api.mvc.Result)`関数である。

Requestをハンドルした後、処理の結果をClientに返す。

```scala
// HomeController.scala
def index = Action {
    implicit request => Ok(views.html.index())
}
```

`index`関数はRequestに対して、200OKと`index.scala.html`を返す。

## Templates(Views)

```scala
// index.scala.html
@()
@main("title") {
    <h1>Index Page</h1>
    This is a index page.
}

// main.scala.html
@(title: String)(content: Html)
<!DOCTYPE html>
<html>
    <head><title>@title</title></head>
    <body>@content</body>
</html>
```

`index.scala.html`は、`mail.scala.html`のテンプレートに書く内容が書いてある。


## Simple Result

HTTPのResultはSTATUS CODEと一緒に出る。

HTTPのHeaderとBodyを作成して、Clientに返してみようと。

Resultは`play.api.mvc.Result`に定義されている。

```scala
import play.api.http.HttpEntity
import akka.util.ByteString

def index = Action {
    implicit request => Result(
        header = ResponseHeader(200, Map.empty),
        body = HttpEntity.Strict(ByteString("Hello world!"), Some("text/plain"))
    )
}
```

様々なResultがあるので、確認を。

```scala
val ok = Ok("Hello world!")
val notFound = NotFound
val pageNotFound = NotFound(<h1>Page not found</h1>)
val badRequest = BadRequest(views.html.form(formWithErrors))
val oops = InternalServerError("Oops")
val anyStatus = Status(488)("Strange response type")
```

## Redirect

```scala
def index = Action {
    implicit request => Redirect("/", MOVED_PERMANENTLY)
}
```
[PlayFramework] 01. Getting Start

Play Frameworkに対して勉強した内容の整理。

> Scalaの一番有名なフレームワークはPlay Frameworkである。
> 
> Play Frameworkに対して簡単に勉強しようと。
> 
> 特に話がない内容は[PlayFramework公式ホームページ](https://www.playframework.com/)の内容を基に作成。

# Installing Play

## 事前に必要なこと

### JDK

PlayにはJava1.8以上のバージョンが必要である。

[OracleのJDKサイト](http://www.oracle.com/technetwork/java/javase/downloads/index.html)にてダウンロード&インストール。

### SBT

[SBTダウンロードページ](https://www.scala-sbt.org/download.html)にてダウンロード&インストール


# Creating a new Application

```sh
$ sbt new playframework/play-scala-seed.g8
$ cd play-scala-seed
$ sbt run
```

[http://localhost:9000](http://localhost:9000)にて確認可能

# Using the Play Console

## コードの実行

```sh
$ cd play-scala-seed
$ sbt
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=256m; support was removed in 8.0
[info] Loading project definition from C:\Programming\WORKS\SCALA\play-scala-seed\project
[info] Set current project to play-scala-seed (in build file:/C:/Programming/WORKS/SCALA/play-scala-seed/)
[play-scala-seed]$ 
```

## Developモードでサーバを実行

```sh
[play-scala-seed]$ run
--- (Running the application, auto-reloading is enabled) ---
[info] p.c.s.NettyServer - Listening for HTTP on /0:0:0:0:0:0:0:0:9000
(Server started, use Ctrl+D to stop and go back to the console...)
```

## コンパイル

```sh
[play-scala-seed]$ compile
[success] Total time: 0 s, completed 2017/04/25 17:21:00
```

## Test実行

```sh
[play-scala-seed]$ test
[info] Compiling 1 Scala source to C:\Programming\WORKS\SCALA\play-scala-seed\target\scala-2.11\test-classes...
[info] HomeControllerSpec:
[info] HomeController GET
[info] - should render the index page from a new instance of controller
[info] - should render the index page from the application
[info] - should render the index page from the router
[info] ScalaTest
[info] Run completed in 2 seconds, 901 milliseconds.
[info] Total number of tests run: 3
[info] Suites: completed 1, aborted 0
[info] Tests: succeeded 3, failed 0, canceled 0, ignored 0, pending 0
[info] All tests passed.
[info] Passed: Total 3, Failed 0, Errors 0, Passed 3
[success] Total time: 8 s, completed 2017/04/25 17:21:30
```
UI勉強会: インターフェースデザインの実践教室 III部 インプリメンテーション


## 27章 ゲリラユーザビリティテスト

- いつでも・気軽に・3～5人・5分
- 観察・記録する
- 行き詰ってなければ口を挟まない

## 28章 ユーザビリティテスト

ペーパープロトタイプ(11章)でやったようなことを実際のアプリで行う

- 凝らなくてもよい。少しやるだけで有意義な結果が得られる
- 全くやらないのは問題
- ユーザー層にあまりこだわらず広くテスターを集める

> 全くやらないか、あれもこれもやろうとするかの両極端をやめよう

## 29章 対面テスト

ユーザビリティテストを対面で行う

- 調査者介入型  行き詰ったり質問があったとき以外は黙って観察
- 調査者不在型  テスト開始したら一旦部屋を出る(キャプチャなどしておく)
- 自由形式 作業を決めない

## 30章 リモートテスト

画面共有などしながら

- テスターの慣れた環境でできるのと、調査者の影響が少ないのがメリット
- 観察しづらいのがデメリット
- 調査者不在型もありうる(キャプチャーを後でもらう)

## 31章 ユーザビリティテスト「べからず集」

- UI表示通りの表現で作業を表現しない
- テスターに影響を与えない
- テスターにストレスをかけない


## 32章 ユーザーエラーはデザインエラー

- エラーメッセージでユーザーを責めない
- エラーをなくす
 - 現在のモードをわかりやすくする
 - 入力例の説明をしたり、様々な入力形式に対応する

> ここは割りと意識できている。続けよう

## 33章 A/Bテスト

- 修正後によくなっているか確認したいとき
- 解決策を見極めたいとき
- 局所的な最適化。限界はある

> 開発だとやらないよなあ。時に有用性を考えるのもいいかもしれない

## 34章 利用データの収集

リリース後に収集して問題を見つける

- パフォーマンス
- 出口点(使うのをやめるのはいつか？)
- 不具合
- ユーザーの行動

> これも開発だとパフォーマンス統計以外やらない。いつかやった方がいい時がありそう

## 35章 ユーザーからのフィードバック

選択肢
- 無視する
- 適合するよう機能を追加する
- 製品を分割する(別のバージョンにする)

否定的フィードバックもチャンスととらえる

> 一番ダメなのは振り回されてごちゃごちゃ追加してしまうこと