OmniAICreator/Qiita-1.07M huggingface dataset:
multipart/x-mixed-replaceのプロキシを作る

`multipart/x-mixed-replace` というmimeTypeがあります。これはコンテンツをリアルタイムにプッシュできるもので、Webカメラの画像であったり、擬似的なサーバプッシュとして使われたりしています。

multipart/x-mixed-replaceで配信される画像を使ってJavaScriptで処理をしたいと思ったのですが、外部ドメインで配信されているとCORS制限が加わってCanvasなどで使い勝手が悪くなります。

そこでmultipart/x-mixed-replaceのプロキシを立ててみました。

```
var express = require('express');
var http = require('http');
var app = express();
var url = require('url');
app.use(express.static('public'));

app.get('/motion', function(req, res) {
  var u = url.parse(req.query.url)
  var options = {
    host:   u.hostname,
    port:   u.port,
    path:   u.path,
    method: 'GET',
    headers: req.headers
  };

  var creq = http.request(options, function(cres) {
    for (var name in cres.headers) {
      res.setHeader(name, cres.headers[name]);
    }
    cres.on('data', function(chunk){
      res.write(chunk);
    });
    cres.on('close', function(){
      res.writeHead(cres.statusCode);
      res.end();
    });
  }).on('error', function(e) {
    res.writeHead(500);
    res.end();
  });
  creq.end();
})

app.listen(3000, function () {
  console.log('Example app listening on port 3000!');
});
```

これで /motionでアクセスするとクエリのurlで指定したコンテンツをそのまま流してくれます。コツとしてはdataイベントで流れてくる情報が常時発生するということでしょうか。こういう処理はnode.js向きですね。
Android, iOSでGUIテストを自動化するためのAppium [環境構築編] [Windows + Node.js]

本稿では、モバイル端末でGUIテストが行えるAppiumをWindow + Node.jsで環境構築する手順を説明しています。
Appiumの概要に関しては、[こちらの記事](http://qiita.com/HelloPeople/items/6b4f10010467d4aa2291)をご参照ください。
しかし、WindowsだとiOSデバイスのテストが出来ないので、可能な限りMac環境を用意する事が望ましいです。

## 実施環境

- Windows7
- Appium v1.4.16.1
- Node.js v5.2.0

## 環境構築

### Javaインストール

以下のコマンドでJavaがインストールされているか確認する。

```bash
$ java -version
```

Javaがインストールされていない場合は[こちらのサイト](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)からダウンロードする。

[環境変数"JAVA_HOME"を設定](http://www.javadrive.jp/install/jdk/index4.html)する。

### Android SDKインストール

以下のコマンドでAndroid SDKがインストールされているか確認する。

```bash
$ adb
```

Android SDKがインストールされていない場合は、[こちらのサイト](https://developer.android.com/studio/index.html)からAndroid Studioをダウンロードする。

SDK Managerを起動し、以下をインストールする。
※SDK-Managerはデフォルトだと`C:\Users\username\AppData\Local\Android\sdk`に格納されている。

- Tools
 - Android SDK Tools
 - Android SDK Platform-tools
 - Android SDK Build-tools
 - Android 4.4.2(API 19)
- Extras
 - Google USB Driver

`sdk`ディレクトリを変数名"ANDROID_HOME"として環境変数Pathに追加し、さらに`sdk/platform-tools`ディレクトリも環境変数Pathに追加する。

### Appiumインストール

Windowsの場合は、専用のGUIアプリケーション"AppiumForWindows"を使用するため、[こちらのサイト](https://bitbucket.org/appium/appium.app/downloads/)からダウンロードする。

### appium-doctorで環境チェック

[appium-doctor](https://github.com/appium/appium-doctor)を使用すれば、必要な環境・設定が揃っているかをチェックする事ができる。

appium-doctorをインストールする。

```bash
$ npm install -g appium-doctor
```

チェックを実行する。
※Windowsの場合はコマンドプロンプトで実行しないと正しくチェックされない場合がある。

```bash
$ appium-doctor
```

## テストの実行

テストには[Appiumのサンプルコード](https://github.com/appium/sample-code/tree/master/sample-code/examples/node)を使用する事ができるので、ここではサンプルコードを使用してAppiumの動作確認を行う。
サンプルコードを任意のディレクトリにクローンしておく。

### エミュレータでデバッグする場合

エミュレータを使用する場合は、AVD_Managerを起動し、Createボタンから適当な設定を行い、エミュレータを作成することができる。
エミュレータを作成後、Startボタンでエミュレータを起動できる。
起動後、コマンドラインから以下を実行し、adbで認識されている事を確認する。

```bash:example
$ adb devices
List of devices attached
emulator-5554   device
```

### 実機でデバッグする場合

USBケーブルでAndroid端末とPCを接続する。
Android端末側では[デバッグが出来るように設定する](http://www.adakoda.com/android/000242.html)必要がある。
接続後、コマンドラインから以下を実行し、adbで認識されている事を確認。

```bash:example
$ adb devices
List of devices attached
BH905CM223      device
```

### Appium起動

アプリケーションテストを行う場合は"Android Setting > Application Path"でapkファイルを指定。
[サンプルコード](https://github.com/appium/sample-code/tree/master/sample-code/examples/node)を実行する場合は、`\sample-code\sample-code\apps\android-rottentomatoes-demo-debug.apk`を指定する。
因みに、アプリケーションではなく、ブラウザテストを行う場合は、"Android Setting > Use Browser"を選択する。

"Launch the Appium Node Server"ボタンを押下し、Appiumサーバーを起動する。

### テストスクリプト実行

コマンドラインから`sample-code\sample-code\examples\node`直下に移動し、npmモジュールをインストールする。

```bash
$ npm install
```

以下のコマンドを実行するとサンプルのテストスクリプトが実行できる。

```bash
$ npm run android-simple
```

以上で環境構築は終わりです。
今回はサンプルコードを使用して、Androidのアプリケーションをテストしましたが、端末にプリインストールされているブラウザやChromeブラウザを使用して、Webのテストを行う事も出来ます。
不會公開捅你的隊友或上級

包含隊友、上級，或是 mentor

今天早餐時間跟同事聊，
聊到他的上級的事情，於是就拿來當這篇的題材了。

之前也有碰過帶過的人，
在專案會議上反應我在 code review 後要求他調整 coding style 成比較易讀的寫法，
害他的進度 delay 。

我的同事則是在問 mentor 該怎麼做的時候（當時時程很趕），
mentor 告訴他一個不對的方法，反而才在會議上指正這是不對的做法。
本來應該是信任 mentor 的情境，卻得到反效果。

## 防禦

其實 mentor 也是人，
是人有可能犯錯，只是要想辦法降低犯錯的機率。

包括我自己的決策也是，
有時候會想太多、情境不明確方向也有可能會錯誤。

比較好的做法可能會是：

身為被指導的人或隊友，
接到指示之後也應該要再想個一次是不是正確的，
而不是概括承受地做下去。
充分的討論之後，降低會犯錯的機率，才能夠往更好的方向前進。

對自己、對方、專案和公司都會有幫助。
UbuntuでPythonの開発環境を整える


## 概要

python未経験者の自分ですが、機械学習を扱うためにpythonを学習する必要がありました。

しかし、pythonの勝手がわからないせいか、デフォルトだとグローバルにインストールされてキモいのでちゃんと設定しようとして色々ハマリました。
なので一応メモっておきます。

（今だとanacondaを使うのが一般的かもしれませんが、あえて自分でやってみました。）

## 環境

- Ubuntu14.04
- pyenv
- pyenv-virtual

参考になった！ :pray: 
[pyenvとvirtualenvで環境構築](http://qiita.com/Kodaira_/items/feadfef9add468e3a85b)

[python3と科学計算ライブラリ周りをUbuntuにインストール](http://qiita.com/jooex/items/61a9169f2f88580d15ff)

## pythonのインストール

```bash
# 最初の状態を確認
python -V
-> 2.7.6

sudo apt-get install git gcc make openssl libssl-dev libbz2-dev libreadline-dev libsqlite3-dev

# http://qiita.com/sobeit@github/items/eb24bbcc02822223d8eb
# 描画系ライブラリを使うのに必要
sudo apt-get install python3-tk tk-dev python-tk libfreetype6-dev 

# pyenvインストール
git clone https://github.com/yyuu/pyenv.git ~/.pyenv

## 環境変数の設定とか（上手く行くことを確認したら、~/.bash_profileなどに書いておく。）
export PYENV_ROOT=$HOME/.pyenv
export PATH=$PYENV_ROOT/bin:$PATH
eval "$(pyenv init -)"
pyenv --version
-> pyenv 20160509

# 使えるもの一覧を表示する
pyenv install --list

# インストールしてみる
pyenv install 3.5.1

# デフォルトに設定する。
pyenv global 3.5.1

python -V
-> 3.5.1
```

ここまでで、複数のバージョンを使い分けることは出来ました。
ただ、これだと同一バージョンで複数使い分けることはできないので、virtual-pyenvを入れます。

```

git clone https://github.com/yyuu/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv

## 環境変数の設定とか（上手く行くことを確認したら、~/.bash_profileなどに書いておく。）
eval "$(pyenv virtualenv-init -)"

# 3.5.1を対象のディレクトリ専用にする。
pyenv virtualenv 3.5.1 dev1_3.5.1
pyenv local dev1_3.5.1

python -V
-> 3.5.1
```

これでpythonを使い分けることが出来る。
次にライブラリを入れていく

```
pip install pandas
pip install matplotlib
```

動作確認

```py3:sample.py
import tkinter as tk
import numpy as np
import matplotlib.pyplot as plt

x = np.arange(0, 5, 0.1)
y = np.sin(x)
plt.plot(x, y)
plt.show()
```

グラフが表示されれば成功。
Adobe Acrobat Pro でPDFをトリミングする方法

トリミングの仕方が分かり難く、手間取ったので覚書。

Windows7でAdobe Acrobat X Pro 10.1.16 を使用。

##1．トリミングする範囲を選択

「ツール」の「トリミング」を選択し、ドラッグしてトリミングする範囲を選択

![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/42231/903f4663-3455-c903-3b22-a7c9f2bdc762.jpeg)

##2．トリミングの設定

**選択範囲内でダブルクリック**すると「ページボックスを設定」の画面が表示されるので、適宜変更し「OK」を選択すればトリミング完了。

![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/42231/63cfc1ba-1054-e195-d18e-0c1abc3d924a.jpeg)
Microsoft LUISのCulture指定

## LUIS対応状況

Microsoft Cognitive ServicesのLUIS(Language Understanding Intelligent Services)が日本語対応したようです。

LUISでは新しいアプリケーションを作成する際に"Application Culture"という項目を設定しますが、
2016/8/29現在、LUISで利用できるCultureは以下の8種となっています。
Brazilian Portuguese, Chinese, English, French, German, Italian, Japanese, Spanish 

![LUISアプリケーション作成ダイアログ](https://qiita-image-store.s3.amazonaws.com/0/11338/5204985d-b7a0-412c-b19c-ae5da4390cb4.png)

言語コード(language code)ではなくカルチャー(culture)となっているところに、LUISが単に自然言語文章を解析するだけじゃないぞ(※1)という意気込みを感じられていいですね。
※1. 和暦で入力された日付も適切に取得してくれたりします！

今回は、Luis Programmatic API から新しいLUISアプリケーションを作成する場合にカルチャをどう指定すべきかドキュメントに記載がなかったので調べてみました。
なお、Webインターフェースから作成する場合は選択肢から選択するだけ(上記キャプチャ参照)なので特に気にする必要はありません。

Luis Programmatic API: apps - Add App
 https://dev.projectoxford.ai/docs/services/56d95961e597ed0f04b76e58/operations/56f8a55119845511c81de47b

調査は、いったんWebインターフェースから各カルチャーでアプリケーションを作成し、エクスポートした定義の"culture"を確認するという方法で行っています。

![LUISアプリケーション定義(抜粋)](https://qiita-image-store.s3.amazonaws.com/0/11338/68efac09-8924-2418-bbd6-b227484c9a04.png)

## Culture指定一覧

以下、結果です。…普通に言語コード＋国コードですね。

* Brazilian Portuguese: "pt-br"
* Chinese: "zh-cn"
* English: "en-us"
* French: "fr-fr"
* German: "de-de"
* Italian: "it-it"
* Japanese: "ja-jp"
* Spanish: "es-es"
地図サービス料金比較

## お断り
ざっと調べたもので正確ではないかもしれませんが、大体の雰囲気をつかんで頂ければ幸いです。

## 自分で地図サーバと地図データをもつ場合
* GeoServer(地図サーバ) & OpenStreetMapや地理院地図(地図データ)
    * 料金
        * 無料
    * メリット
        * 無料
    * デメリット
        * ライブラリや地図データの更新など管理が面倒くさい
        * 構築に知識と時間が必要
        * 何か地図サーバに問題があれば手を加えなければならない
        * GeoServerに足りないAPIなどがあればGeoServerの開発(Java)が必要
        * ドキュメントが少なく、調査に非常に時間がかかる
    * その他
        * 地図データを保存するPostgreSqlにPostGIS拡張が必要(MySQLは不可)

## 他社の地図サーバ(と地図データ)を使う場合
1. OpenStreetMap(公式サーバ)
    * 料金
        * 無料
    * メリット
        * 自社で地図サーバや地図データの管理をしなくていい
        * 料金
    * デメリット
        * 定期・不定期メンテナンスなどで見れなくなる可能性有

2. Google(無料プラン)
    * 料金
        * 25000[PV/日]が90日間続かないかぎり無料。
        * 超過時は 0.5[USD/1000PV]
    * メリット
        * 自社で地図サーバや地図データの管理をしなくていい
        * ドキュメントが豊富
        * 地図API業界のデファクトスタンダード
    * デメリット
        * __地図を用いたサイトは無料で見れる(一般公開)ような状態でなければならない__
        * 広告が出る可能性 (要調査)

3.  Google(有料プラン)
    * 料金
        * 100~200[万円/年](要調査)
    * メリット
        * 自社で地図サーバや地図データの管理をしなくていい
        * ドキュメントが豊富
        * 地図業界のデファクトスタンダード
    * デメリット
        * 料金

4. いつもNAVI
    * 料金
        * 5000[PV/月]まで無料。超過時は従量課金。
    * メリット
        * 自社で地図サーバや地図データの管理をしなくていい
    * デメリット
        * 無料枠が狭い(一般公開しないのであれば十分かもしれない)
        * 公式ドキュメント以外のドキュメントがあまりない

5. YOLP無料版 (Yahoo)
    * 料金
        * 5万[PV/日]まで無料
    * メリット
        * 自社で地図サーバや地図データの管理をしなくていい
        * 料金
    * デメリット
        * 無料で一般公開しなければならない
        * 広告が出る可能性

6. YOLP有料版 (Yahoo)
    * 料金
        * 課金
            * 1万[PV/月] : 30万[円/年]
            * 3万[PV/月] : 5万[円/月]
            * 10万[PV/月]: 10万[円/月]
    * メリット
        * 自社で地図サーバや地図データの管理をしなくていい
        * 課金状態になっても安い
    * デメリット
        * 料金
IFTTTを使ってセキュリティ情報を通知させる

Amazon Linuxを使っていて、yum-cronをいれていてもkernelのアップデートがある場合はサーバの再起動が必要です。問答無用でyum-cronで再起動させることもできますが、そこは都度判断して手動でやりこともあると思います。

https://alas.aws.amazon.com/ に情報が流れて、RSSフィードも提供されています。
そういった場合、IFTTTを使えば、新しいフィードがあったときに指定のメールアドレスに送信したり、slackに流したすることができます。これで、いちいちサイトを見に行くといったせずにすむようになります。

下記は、criticalがあったときに指定のメアドに送信するためのレシピです。
https://ifttt.com/recipes/443430-alert-mail-from-amazon-linux-ami-security
C# 勉強用メモ 目次


# 文法

* 基本文法
    * コメント
    * namespace
    * 変数
    * 組み込み演算子
    * オーバーフローのチェック
    * [例外](http://qiita.com/inabe49/items/1af782f2a44a86c72e4e)
* 構造化
    * 条件分岐
    * 繰り返し
* オブジェクト指向
    * クラス
    * 継承
    * interface
    * ジェネリック
* 関数型プログラミング
    * ラムダ式とデリゲート
    * 拡張メソッド
* 非同期・並列処理
    * 並列処理
    * 排他制御
    * 実行コンテキスト
    * 非同期処理
    * Task


# 参考資料

## Guidelines

* [MSDN クラス ライブラリ開発のデザイン ガイドライン](https://msdn.microsoft.com/ja-jp/library/ms229042.aspx)
* [ic#code Tech Notes](http://www.icsharpcode.net/TechNotes/)

## 解説ページ

* [++C++; // 未確認飛行 C C# によるプログラミング入門](http://ufcpp.net/study/csharp)
* [DOBON.NET .NET Tips](http://dobon.net/vb/dotnet/index.html)

## Source Code

* [Reference Source](http://referencesource.microsoft.com/)
NativeScriptでplatformによってレイアウトxmlファイルを切り替える

同じxmlでiOSでもAndroidでも同様にレイアウトされるのがNativeScriptのウリではあるんですが、ActionBarについては、どうしてもAndroidのToolBarとiOSのNavigationBarでtitleView的なものの扱いが違うので、レイアウトファイルをそれぞれのOS用に用意したいという場面に出くわしました。

結論からすれば、jsと同様、以下の命名則でOKでした。

hoge.android.xml → Androidで読んでくれる
hoge.ios.xml →　iOSで読んでくれる

なお、一部分のみOSによって変えたい場合は、<android><ios>タグ内に記述すれば、該当のプラットフォームのみタグ内が反映されます。
Git, GitHub の勉強用メモ 目次


# 手順別

1. GitHub への登録
1. ツールのインストール
    * [GitHub Desktop](http://qiita.com/inabe49/items/c2f60ffb38dc9b68abb6)
    * [SourceTree](http://qiita.com/inabe49/items/80be49d6d5a45b94c987)
    * TortoiseGit
1. [リポジトリの作成](http://qiita.com/inabe49/items/9779835ad5664f415da0)
1. ローカル環境にリポジトリを clone する
    * GitHub Desktop
    * [SourceTree](http://qiita.com/inabe49/items/17804456aa5b1aa5ab12)
    * TortoiseGit
1. [Git の管理対象にしないファイルの設定](http://qiita.com/inabe49/items/16ee3d9d1ce68daa9fff)
1. 更新の登録
    * GitHub Desktop
    * SourceTree
    * TortoiseGit
1. ブランチ操作
    * GitHub Desktop
    * [SourceTree](http://qiita.com/inabe49/items/be38f569040aed7d85b0)
    * TortoiseGit
1. [マージ](http://qiita.com/inabe49/items/e7ff697d0675f23b3c36)
    * GitHub Desktop
    * SourceTree
    * TortoiseGit
    * コマンドライン
1. [Pull request の作成](http://qiita.com/inabe49/items/89564672e7284c3c1020)
1. [ブランチを利用した開発](http://qiita.com/inabe49/items/93a3c8e38a197f818211)
1. Git Flow
1. [Subversion リポジトリの引っ越し](http://qiita.com/inabe49/items/1bcd8a15ee398cd39cbe)


# 目次

* Git
    * [Git の基礎](http://qiita.com/inabe49/items/24f0072975602119762b)
    * [.gitignore](http://qiita.com/inabe49/items/16ee3d9d1ce68daa9fff)
    * [Git の使い方 (with SourceTree)](http://qiita.com/inabe49/items/5b6cb018e2b987d6820b)
    * [マージ](http://qiita.com/inabe49/items/e7ff697d0675f23b3c36)
    * branch
        * [branch を利用した開発の指針](http://qiita.com/inabe49/items/93a3c8e38a197f818211)
        * Flow
            * Git Flow
            * GitHub Flow
* GitHub
    * [Markdown の書き方](http://qiita.com/inabe49/items/9c9076a00d2f4cc33c9d)
        * [HTML 特殊文字](http://qiita.com/inabe49/items/303afa114b0204da8a24)
    * アカウント
        * 登録
        * 設定
            * プロフィール
            * 通知
    * Repository
        * [新規作成](http://qiita.com/inabe49/items/9779835ad5664f415da0)
        * インポート
    * Label
    * Milestone（締め切り）
    * Issue（課題管理）
    * Pull request（コードレビュー・マージのお願い）
        * [作成する](http://qiita.com/inabe49/items/89564672e7284c3c1020)
    * Release
    * Hub コマンド
    * GitHub Pages
* ツール
    * [クライアントソフトの比較](http://qiita.com/inabe49/items/e15ab805475668ecb239)
    * GitHub Desktop
        * [インストール手順](http://qiita.com/inabe49/items/c2f60ffb38dc9b68abb6)
    * SourceTree
        * [インストール](http://qiita.com/inabe49/items/80be49d6d5a45b94c987)
        * [ブランチ操作](http://qiita.com/inabe49/items/be38f569040aed7d85b0)
    * TortoiseGit


# 参考資料

* [Git チュートリアル](https://www.atlassian.com/ja/git/tutorial/)
* [サルでもわかるGit入門](http://www.backlog.jp/git-guide/)
* [読みやすいREADMEを書く | Yakst](https://yakst.com/ja/posts/3859)
ErlangでOATHなワンタイムパスワードライブラリ"POT"をElixir から使う

## 概要

* Erlangでワンタイムパスワードを生成するライブラリがあるのでElixirから使ってみた
* [github](https://github.com/yuce/pot)にざっとドキュメントはあるが、実際に動作確認してみたメモ

## 動作メモ

https://hex.pm/packages/pot

### HOTP生成

```Elixir
# secretはencodeしたものを渡す必要がある
iex(1)> raw_secret = "1234567890"
"1234567890"
iex(2)> encoded_secret = Base.encode32(raw_secret, padding: false)
"GEZDGNBVGY3TQOJQ"
iex(3)> counter = 1
1
iex(4)> :pot.hotp(encoded_secret, counter)
"263420"

# 桁を指定することも可能
iex(5)> :pot.hotp(encoded_secret, counter, token_length: 8)
"13263420"

# base32 で encode されていない secret を指定するとエラー
iex(6)> encoded_secret = "1234567890"
"1234567890"
iex(7)> :pot.hotp(encoded_secret, counter)
** (FunctionClauseError) no function clause matching in :base32.std_dec/1
   ...
```

ソースコードを見ると、digest method を指定することもできる模様。
`crypt.hmac` を使っているので、 http://erlang.org/doc/man/crypto.html にある
md5, ripemd160, sha, sha224, sha256, sha384, sha512 あたりが使えそうだが、うまく動かなかったので未確認。

### HOTP検証

```Elixir
iex(1)> encoded_secret = "GEZDGNBVGY3TQOJQ"
"GEZDGNBVGY3TQOJQ"
iex(2)> counter = 1
1
iex(3)> token = token = :pot.hotp(encoded_secret, counter)
"263420"
# :last として最後に検証したカウンタの値を指定
iex(4)> :pot.valid_hotp(token, encoded_secret, [{:last, counter - 1}])
1

# 戻り値はカウンタの値
iex(5)> counter = 3
3
iex(6)> token = token = :pot.hotp(encoded_secret, counter)
"626604"
iex(7)> :pot.valid_hotp(token, encoded_secret, [{:last, counter - 1}])
3

# 検証に失敗したら false 
iex(8)> invalid_token = "000000"
"000000"
iex(9)> :pot.valid_hotp(invalid_token, encoded_secret, [{:last, counter - 1}])
false
```

### TOTP作成

```Elixir
# encode secret を渡すと、現在時刻でTOTP生成
iex(1)> encoded_secret = "GEZDGNBVGY3TQOJQ"
"GEZDGNBVGY3TQOJQ"
iex(2)> :pot.totp(encoded_secret)
"508549"

# interval_length を指定することが可能
iex(3)> :pot.totp(encoded_secret)
"836210"
## デフォルトは30秒
iex(4)> :pot.totp(encoded_secret, interval_length: 30)
"836210"
iex(5)> :pot.totp(encoded_secret, interval_length: 60)
"136108"
```

HOTPで指定できるパラメータはTOTPでも指定可能。
`interval_length` は指定できるのに時刻のタイムスタンプを指定できない。
自分でやろうと思ったら、タイムスタンプを `interval_length` で割った値を `counter` として HOTP 生成すれば可能。

### TOTP検証

```Elixir
# encode secret を渡すと、現在時刻でTOTP生成
iex(1)> encoded_secret = "GEZDGNBVGY3TQOJQ"
"GEZDGNBVGY3TQOJQ"
iex(2)> token = :pot.totp(encoded_secret)
"363352"

# TOTPの検証成功時は true
iex(3)> :pot.valid_totp(token, encoded_secret)
true
```

### 感想

* HOTP/TOTPの生成/検証はほぼドキュメント通り一通りできる
* TOTPでタイムスタンプを指定できないのだけちょっとだけ不満

不満なところのパラメータを指定できるようにしたライブラリを自分で書いているので、いい感じになったら追記予定。
MACの文字入力が遅い、動作が重くなってきた

##問題
MACの文字入力が遅い、動作が重くなってきた。

##解決方法
Launch Pad> その他> アクティビティモニタを開き、「日本語入力プログラム」を強制終了(左上の×ボタン)。
NativeScriptのListViewのテンプレートを動的に変更する

NativeScriptで大変に困るのが、ListViewのテンプレートを１つしか指定できない事です。
タイトルではテンプレートを動的に変更する、と書いたが、正確にはindex毎に異なるViewを表示したいのです。

例えば、１列目に画像、２列目にテキスト、３列目にボタンが入るようなレイアウトがあるとします。
海外のフォーラムを見ていると、皆さん同じ事でお困りのようなのですが、彗星のごとく現れた回答者が、

```xml
<StackLayout>
    <Image visibility="{{showImage?'visible':'collapsed'}}"/>
    <Label visibility="{{showLabel?'visible':'collapsed'}}"/>
    <Button visibility="{{showButton?'visible':'collapsed'}}"/>
</StackLayout>
```
みたいに、全てのUIパーツをテンプレートに入れちゃって、indexによって表示／非表示させればいいじゃんとおっしゃり、賞賛の嵐を受けていたのです。

ケースバイケースだとは思いますが、いやいや、これはメモリの無駄だし、パフォーマンスも低下するだろう、と。

じゃあどうすれば良いかというと解決方法はいたって簡単で、テンプレートを使わなくても、ListViewのitemLoadingコールバック内で、引数（ItemEventData型）のviewプロパティに適当なViewを突っ込んでやれば良い。

```ts
listView.on(listViewModule.ListView.itemLoadingEvent, function (args: listViewModule.ItemEventData) {
    var index = args.index;
    var view;
    // indexによってviewに好きなViewを入れる
    switch(index){
       case 0:
           view = new Image();
           ・・・
           break;
       case 1:
           ＜・・・中略・・・＞
       default:
           view = null;
           break;
    }
    args.view = view
});
```

これだけです。
JavaScriptは連想配列を含めオブジェクトは全て参照渡しなので、NativeScriptはこのコールバックを呼んだのち、args.viewを見てくれて、もしセットされていればそれを使ってくれるというナイスな実装になってたんですね。

でも、ええーここだけコードで書くの？　せっかくNativeScriptはxmlでUIを記述できて便利なのに・・・と思った方もおられると思います。
確実にここに１人います。
これについては別記事で。
SSL Server TestとMozilla SSL Configuration Generator

Qualysという会社が提供している[SSL Server Test](https://www.ssllabs.com/ssltest/)では、Webサーバに設定されているSSLの問題を調べることが出来ます。
また、Mozillaが提供している[Mozilla SSL Configuration Generator](https://mozilla.github.io/server-side-tls/ssl-config-generator/)では、セキュリティに配慮されたSSLの設定を出力することが出来ます。

ここでMozillaのSSL Configuration Generatorで出力した結果が、QualysのSSL Server Testで引っ掛かったため情報を共有します。

<br>
私の環境でSSL Configuration GeneratorのSSLCipherSuiteの値は次のように出力されました。

```
SSLCipherSuite ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS
```

この設定だとSSL Server Testでは次のメッセージが表示され、グレードが下がります。

```
This server supports weak Diffie-Hellman (DH) key exchange parameters
```

試行錯誤した結果、次の設定を行えば良いことが分かりました。

```
SSLCipherSuite ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS
```

削除した設定は次のとおりです。

```
DHE-RSA-AES128-GCM-SHA256
DHE-RSA-AES256-GCM-SHA384
DHE-RSA-AES128-SHA256
DHE-RSA-AES128-SHA
DHE-RSA-AES256-SHA256
DHE-RSA-AES256-SHA
EDH-RSA-DES-CBC3-SHA
```

8/29追記
Apacheのバージョンが[2.2.26より前のバージョン](http://www.apache.org/dist/httpd/CHANGES_2.2)だとECDHに対応していないため、Forward Secrecyに対応できない。そのためグレードが少し下がるようです。
Androidでのみ発生するons-carouselのバグ

# 個人的メモ

今作っているアプリのカレンダー部分をAndroidで動作させた際に発見したバグ

※このバグはOnsen UI 2.0.5で解決されました

OnsenUI開発チームには報告済み
https://github.com/OnsenUI/OnsenUI/issues/1565

## 動作環境

* OnsenUI 2 RC17
* AngularJS 1.5.8
* Android 5.1.1 (6系も確認)

## 問題

ons-carouselを持つページからinput要素を持つページに遷移した際、input要素にフォーカスしてキーボードを表示させると、前のページのons-carouselのインデックスが0に戻る。Android端末でのみ起こる。

## 再現方法

1. ons-carouselを持つページを作る
2. input要素を持つページを作って遷移させる
3. 遷移先のinput要素にフォーカスしてキーボードを表示させる

再現用のコードは以下参照
https://codepen.io/puku0x/pen/XKvVoJ

## 解決方法

幸いにもpostchangeは拾える。
諸事情によりソースは載せられないが、こんな感じで解決した。

* ページ遷移前にgetActiveIndex()で現在のカルーセルの位置を覚えておく
* postchangeが発生したらフラグを立てる
* フラグが立っていたらsetActiveIndex()でカルーセル位置を復元するメソッドをpushPageの引数として渡す
* 遷移後ページのポップ前に上記のメソッドを呼ぶ
 
~~根本的な解決策は今のところ不明~~ Onsen UI 2.0.5で解決済み

※ 実は後日、iOSでも再現されることが判明した。
※ 2.0.1のマイルストーンに上がったのでリリースを待とう。
https://github.com/OnsenUI/OnsenUI/milestone/15
AnacondaのJupyter notebookでnbextensionsを使う

# はじめに
データ分析、機械学習、最適化、可視化で [Jupyter notebook](http://jupyter.org/)を使っている人が多いかと思います。
また、Pythonの実行環境構築のために、[anaconda](https://www.continuum.io/) を利用している人も増えているようです。
Jupyterの拡張機能として、[nbextensions](https://github.com/ipython-contrib/jupyter_contrib_nbextensions)がありますが、最新の anaconda の jupyter では、単純には利用できないようです。
ここでは、anaconda の jupyter でnbextensionsを使う方法を説明します。

# Anaconda cloudを使う
conda コマンドでは、continuum社で稼働確認したパッケージをインストールできます。それとは別に、[PyPI](https://pypi.python.org/)のように、anacondaに特化したコミュニティパッケージサイトがあります。それが、[anaconda cloud](https://anaconda.org/)です。このサイトの先人たちの用意してくれたパッケージを使うと、通常だと苦労するインストールがとてもはかどることがあります。

anaconda の jupyter でnbextensions を使う1つの方法として、下記のようにできます。

```bash:bash
conda install -y -c conda-forge jupyter_contrib_nbextensions
```

インストールできたら、jupyter notebook を起動してみましょう。下記のように nbextensions が使えるようになっています。

![image](https://qiita-image-store.s3.amazonaws.com/0/13955/07a94c7f-6c2d-884b-67d8-5bb607b9c1de.png)

また、"conda list | grep conda-forge" で conda-forge でインストールまたは更新されたパッケージを確認できます。

# 手っ取り早く docker で試す
docker も用意しました。下記のようにして、簡単に試せます。docker 起動後にブラウザを更新してください。

```bash:bash
firefox http://localhost:8888 &
docker run -it --rm -p 8888:8888 tsutomu7/jupyter
```

# Anaconda cloudで探す
上記の方法は、anaconda cloud のコマンドである anaconda で調べました。下記のようにすると、いくつかの候補が出てきますので、いろいろと試した結果、conda-forge がよさそうでしたので、利用しています。

```bash:bash
anaconda search nbextensions
```

以上
Google Cloud Speech APIを試す Part2（Goで書いてみる）


## Part2
[Google Cloud Speech APIを試す](http://qiita.com/tsuchi83/items/c5e40de0201136e8c5ff)
の続きでGoで書いてみる。

## 必要なライブラリ
  
```
$ go get golang.org/x/net/context
$ go get golang.org/x/oauth2/google
$ go get google.golang.org/api/speech/v1beta1
```

## Goで書いてみる
・Clientを生成

```
ctx := context.Background()

b, err := ioutil.ReadFile("<your service account keyfile>")
if err != nil {
	log.Fatalf("Unable to read service account keyfile: %v", err)
}
config, err := google.JWTConfigFromJSON(b, speech.CloudPlatformScope)
if err != nil {
	log.Fatalf("Unable to read service account keyfile: %v", err)
}
client := config.Client(ctx)
```

* ServiceをNew

```
srv, err := speech.New(client)
if err != nil {
	log.Fatal(err)
}
```

* SyncRecognizeRequestをCallout(Do)

```
// for Syncrecognize
res, err := srv.Speech.Syncrecognize(&speech.SyncRecognizeRequest{
	Config: &speech.RecognitionConfig{
		Encoding:     "FLAC",
		SampleRate:   16000,
		LanguageCode: "ja-JP",
	},
	Audio: &speech.RecognitionAudio{
		Uri: "gs://<your bucket name>/demo/sample.flac",
	},
}).Do()
if err != nil {
	log.Fatal(err)
}
```

Configの内容は、[以前の内容:Google Cloud Speech APIを試す](http://qiita.com/tsuchi83/items/c5e40de0201136e8c5ff)と同じです。

## サンプルソース
試した結果については、[GitHub](https://github.com/tsuchi83/GoSpeech)に置いてあります。


## 参考
[GitHub - Speech API/v1bata1](https://github.com/google/google-api-go-client/blob/master/speech/v1beta1/speech-gen.go)
[Unity]ポケモンGOっぽいものを作るための覚書

## 参考記事

[ユニティちゃんＧＯを公開しました　クローンゲーム制作最速のメソッド](http://soysoftware.sakura.ne.jp/archives/734)
[ActionStreetMapを使って自分の住んでいる街をUnityで再現する](http://lanius.hatenablog.jp/entry/
2014/11/27/221607)
[Hatada's Home Page　地図システム](http://home.a00.itscom.net/hatada///_toc/gis.html#gis)

## もしかすると関係ないかもしれない記事（カーナビとかの話か？）

[OpenStreetMap地図をGarminGPSで使えるimgファイルに変換しよう♪](http://ikasono.blog.fc2.com/blog-entry-108.html)
[OpenStreetMapからGarmin GPS用の地図ファイルを作成する](http://femoghalvfems.info/archives/2304)

## 技術関連

[OpenStreetMap Wiki JA:PBFフォーマット](http://wiki.openstreetmap.org/wiki/JA:PBFフォーマット)
[OpenStreetMap Wiki JA:要素](http://wiki.openstreetmap.org/wiki/JA:要素)
[OpenStreetMap Wiki JA:開発](http://wiki.openstreetmap.org/wiki/JA:開発)
[OpenStreetMap Wiki OSM file formats](http://wiki.openstreetmap.org/wiki/OSM_file_formats)

## 地図データ

[OpenStreetMap](https://www.openstreetmap.org/#map=5/51.500/-0.100)
[OpenStreetMap Japan](https://openstreetmap.jp)
[Download OpenStreetMap data for this region: Japan](http://download.geofabrik.de/asia/japan.html)

## ツール関連

[mkgmap](http://www.mkgmap.org.uk/download/mkgmap.html)
[splitter](http://www.mkgmap.org.uk/download/splitter.html)
[mkgmapの使い方](https://osm-for-garmin.org/mkgmap/)
[mkgmapの使い方(2)](https://osm-for-garmin.org/mkgmap-2/)

## 参考プロジェクト

### ActionStreetMap
[ActionStreetMap](https://github.com/ActionStreetMap)
[utymap（ActionStreetMapの後継）](https://github.com/reinterpretcat/utymap)

### MapzenGo

GitHub [https://github.com/brnkhy/MapzenGo](https://github.com/brnkhy/MapzenGo)
Blog記事
[OpenStreetMap in Unity3D](http://barankahyaoglu.com/dev/openstreetmap-in-unity3d/)
[PokemonGo clone using Mapzen – Part 1: Basics](http://barankahyaoglu.com/dev/pokemongo-clone-using-mapzen-api-unity3d/)
[PokemonGo clone using Mapzen – Part 2: 3D Buildings](http://barankahyaoglu.com/dev/pokemongo-clone-using-mapzen-api-unity3d-2/)
[PokemonGo clone using Mapzen – Part 3: Dynamic Tile Loader](http://barankahyaoglu.com/dev/pokemongo-clone-using-mapzen-part-3/)
[PokemonGo clone using Mapzen – Part 4: Water Layer](http://barankahyaoglu.com/dev/pokemongo-clone-using-mapzen-part-4/)
travis login --github-token で Travis CI に login する

# 問題

Travis CI の CLI である `travis` の `login` で `--github-token` を指定してもログインできない。

出力例:

```
$ travis login --github-token XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
405: "request method not allowed"
```

# 解決策

GitHub token に適切な scope を設定する。ドキュメントに明記されていないのだけど、次の Issue によると `user:email` と `repo` をつけると良いらしい。

https://github.com/travis-ci/travis.rb/issues/367

ぼくの試した範囲だと、`repo:public_repo` と `user:email` だけで `travis login` 自体には成功した。
【Laravel】DBに既にある値と同じものは登録できないようバリデーションする方法

Laravelのバリデーションルールは、様々なものが用意されています。
https://readouble.com/laravel/5.1/ja/validation.html

このバリデーションルールを使って、登録フォームに入力された値が、DBにすでにある値と同じだった場合はインサートできないように実装したい…！

そんな時は、バリデーションルールの`unique`を使うと簡単にできちゃいます。

```php
$rules = ['category' => 'required|unique:categories,name'];
```

記述ルールとしては、`unique:テーブル,カラム,除外ID,IDカラム`となっています。
この記述により、「この値はあるテーブルのカラムにおいてユニークである」ということをチェックしてくれます。
上記の例だと、categoriesテーブルのnameカラムに同じ値が無い場合のみ、追加することができます。

ただしこの`unique`、Eloquentモデルのほうでソフトデリートするような設定をしていたとしても、デリートされたレコード(deleted_at=NOT NULL)を無視してくれません。そのため、ソフトデリートされたレコードもチェックする対象に含まれてしまいます。

実はこの仕様は`exists`と同じです。

参考記事
[LaravelのバリデーションでDBのテーブルの値を条件に使用する方法](http://qiita.com/amymd/items/948072859b70ada7a3be)

そのため、`exists`と同様にクエリーの"where"節として追加の検索条件`deleted_at=NULL`を付け加えましょう。
NULLは小文字のnullだと文字列として扱われてしまうため、必ず大文字にしましょう。

```php
$rules = ['category' => 'required|unique:categories,name,NULL,id,deleted_at,NULL'];
```
pacmanの通信速度を100kb/sに制限する

```diff:/etc/pacman.conf
  [options]
  (略)
  #XferCommand = /usr/bin/curl -C - -f %u > %o
  #XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
+ XferCommand = /usr/bin/wget --limit-rate=100k --passive-ftp -c -O %o %u
```
ITサービスマネージャー　午後2 2011年度　問1

#始めに
ＩＴサービスマネージャーの午後２の論文についてあれこれ書いてみようと思います
対象のシステムは[生命保険会社のシステム](http://qiita.com/triple4649/items/56d2b450f2b8b68bdfe5)をベースにしています

#問題文の解析
![ITサービスマネージャー2011‐01.png](https://qiita-image-store.s3.amazonaws.com/0/136860/a6c43b34-a75b-17db-ac52-e6393d39596d.png)

#問題の分析を行う手法
##QCの7つ道具

- [パレート図](http://www.sk-quality.com/qc7/qc702_pareto.html)
- [特性要因図](http://www.sk-quality.com/qc7/qc703_tokusei.html)
- [グラフ](http://www.sk-quality.com/qc7/qc704_graph.html)
- [管理図](http://www.sk-quality.com/qc7/qc705_kanrizu.html)
- [チェックシート](http://www.sk-quality.com/qc7/qc706_check.html)
- [ヒストグラム](http://www.sk-quality.com/qc7/qc707_histogram.html)
- [散布図](http://www.sk-quality.com/qc7/qc708_sanpuzu.html)
- [層別](http://www.sk-quality.com/qc7/qc709_soubetsu.html)
 

#改訂履歴
- 2016年8月30日 問題の解析を更新
Quantum Chemistry - Bohr Hydrogen Model 1: Radius

関連 http://qiita.com/7of9/items/d3a1799928734375f34f

CG分野で使われるSpherical Harmonics。自分の数値シミュレーション計算に用いたいと思い調べると、量子化学の講義にたどり着く。

短く分かりやすそうな159本のビデオを少しずつ消化中。

Quantum Chemistry - Bohr Hydrogen Model 1: Radius
https://www.youtube.com/watch?v=A6YZ32W7_Ms&index=5&list=PLm8ZSArAXicL3jKr_0nHHs5TwfhdkMFhh

- ニールス・ボーアによる水素のモデルにおける半径の話
- AngularとLinearの違いを記載
- I: moment of inertia
- T: kinetic energy?
- 電子が安定して軌道周回しているのはCoulomb ForceとCentrifugal Forceがつりあっているから
- その式が左下の式 (以下、式1とする)
- 1911 ボーアが仮定した「angular momentumは量子化される」
- l = n エイチバー
- エイチバー: hを2πで割ったもの
- n: 太字Z (整数)に属する
- ν(周波数)の式が右中段にある (以下、式2とする)
- 式1と式2、2変数なので解けて、rの値が得られる (52.9pm)
- オングストローム(Aの上に丸がついた記号): 10^-10
- r=0.529オングストローム
- ボーア半径
Quantum Chemistry - Rydberg Formula

関連 http://qiita.com/7of9/items/d3a1799928734375f34f

CG分野で使われるSpherical Harmonics。自分の数値シミュレーション計算に用いたいと思い調べると、量子化学の講義にたどり着く。

短く分かりやすそうな159本のビデオを少しずつ消化中。

Quantum Chemistry - Rydberg Formula
https://www.youtube.com/watch?v=DLmnh74MfSA&list=PLm8ZSArAXicL3jKr_0nHHs5TwfhdkMFhh&index=4

- Rydberg Formulaと言われる式
- 原子を熱すると放射が発生し、それが特定周波数の輝線として見える
- Lyman Series: UV波長
- Balmar Series: 可視波長
- Paschen Series: 赤外波長
- 上記の式はどれもRydberg Formulaにおいてn1が太字Z(整数)に属する時
- これらの計算からRexpは109,677.6 /cmと計算され、水素のRH(Rydberg constant)に近い

Rydberg Formulaはどこかで見たと思ったら、1日前に見た以下の番組。
> 神の数式 第1回 2013年9月21日放送 この世は何からできているのか。～天才たちの100年の苦闘～

3分54秒頃に「オーロラが輝く理由の式」として登場したのがRydberg Formulaに気づいた。

余談。この番組をなぜ今見たかというと。在庫管理ソフトの動作チェック用に電子部品の棚卸をするなか掃除をしていて、偶然見つけたDVDに昔録画した番組があり、なんとなく「見よう」と思ってみたのがこの番組だった。
Quantum Chemistry - Photoelectric Effect

関連 http://qiita.com/7of9/items/d3a1799928734375f34f

CG分野で使われるSpherical Harmonics。自分の数値シミュレーション計算に用いたいと思い調べると、量子化学の講義にたどり着く。

短く分かりやすそうな159本のビデオを少しずつ消化中。

Quantum Chemistry - Photoelectric Effect
https://www.youtube.com/watch?v=7i6toEAZiV0&list=PLm8ZSArAXicL3jKr_0nHHs5TwfhdkMFhh&index=3

- Classicalで解けなかった問題がQuantumで解けたという例
- 光電効果
- 1886年にHertzが見つけたUV光による金属からの電子の飛び出し
- Classical: KE (Kinetic Energy)は密度(rho)が増すと増加する
- Classical: KEは周波数が変わっても一定
- Classicalの結果は実験結果に整合しない
- 1905 EinsteinがQuantum Theoryで発表 KE=hv - hv0 = hv - φ (v:周波数nyu)
- hv0 = φ : work function。これ以上のエネルギーがないとKEはゼロ。
- Quauntumの結果は実験結果に整合する
Quantum Chemistry - Blackbody Radiation

関連 http://qiita.com/7of9/items/d3a1799928734375f34f

CG分野で使われるSpherical Harmonics。自分の数値シミュレーション計算に用いたいと思い調べると、量子化学の講義にたどり着く。

短く分かりやすそうな159本のビデオを少しずつ消化中。

Quantum Chemistry - Blackbody Radiation
https://www.youtube.com/watch?v=_r5TtnjRzaY&list=PLm8ZSArAXicL3jKr_0nHHs5TwfhdkMFhh&index=2

- Classicalで解けなかった問題がQuantumで解けたという例
- 黒体放射
- Classical: Rayleigh-Jeans lawになり、周波数が高くなると発散する
- Quantum: Max Planckが1900に発表した式で、周波数が高くなっても発散しない
- h=6.626*10^-34 Js: プランク定数
- 粒子のエネルギーは量子化されている
  - E = nhν (νはnyuで周波数)
  - Zの太字: 整数を表す (@ 工学における特殊関数 p.10)
  - nはZに属する (つまり整数である)
Quantum Chemistry - Introduction

関連 http://qiita.com/7of9/items/d3a1799928734375f34f

CG分野で使われるSpherical Harmonics。自分の数値シミュレーション計算に用いたいと思い調べると、量子化学の講義にたどり着く。

短く分かりやすそうな159本のビデオを少しずつ消化中。

Quantum Chemistry - Introduction
https://www.youtube.com/watch?v=HC81oYe43DI&index=1&list=PLm8ZSArAXicL3jKr_0nHHs5TwfhdkMFhh

- Classical MechanicsとQuantum Mechanicsの比較
- Classical: 日常でくわす大きさのもの
- Quantum: 非常に小さいもの

| Classical | Quantum |
|:-:|:-:|
| large  | small  |
| heavy  | light  |
| continuous | discrete / quantized  |
| Newton's Eq.  | Schrodinger Eq.  |
| trajectory  | wave function  |
| deterministic | probabilistic  |
| intuitive  | non-intuitive  |

- discrete: 断続的
- quantized: 量子化された
- deterministic: 決定論的
  - 20個のものを同じ条件で扱うと20個すべて同じ結果を持つ
- probabilistic: 確率論的
  - 20個のものを同じ条件で扱っても20個が異なる結果を持つ
- intuitive: 直観的 http://eow.alc.co.jp/search?q=intuitive


deterministic の対として[stochastic](https://en.wikipedia.org/wiki/Stochastic)を使っている例をヘルシンキ大学のM教授の講義で聞いたのは10年以上前のこと。
Stored property と Computed property


格納型プロパティ(Stored property)、計算型プロパティ(Computed property)についてメモ
###そもそもプロパティって
***
クラスや構造体、列挙体等で定義することができる定数/変数のこと。

###格納型プロパティ (Stored property)
***
```swift:Structure
struct ExampleStructure {
    var Variable: Int
    let Constant: String
}
```
インスタンスの一部として定数/変数を格納する。
※構造体定義で例示している理由は、クラスで上記を定義すると
![スクリーンショット 2016-08-29 1.38.55.png](https://qiita-image-store.s3.amazonaws.com/0/135547/f8cfa9af-8484-bce4-0a63-9e1e18d6cc5f.png)
初期化処理がないとエラーが吐かれる。


```swift:Class
class ExampleClass {
    var variable:Int
    let constant: String
    
    init(variable: Int, constatnt: String){
        self.variable = variable
        self.constant = constant
    }
}
```

クラスだと上記のように定義するか、初めから初期値を設定する。

```swift:Class_2
class ExampleClass_2 {
    var variable = 10
    let constant = "Constant"
}
```

こんな感じ
###計算型プロパティ (Computed property)
***
決まった値を保持しておらず、
インスタンスが生成される度に別プロパティから計算されて値を取得、設定されるプロパティで
getter/setterがある
※getterは単独で定義できるがsetterはgetterとセットでないと定義できない。

#####getter
***
```swift
class AreaOfTriangle {
    
    var base: Int
    var height: Int
    
    init(base: Int, height: Int) {
        self.base = base
        self.height = height
    }
    
    var triangle: Int {
        get{
            return base * height / 2
        }
    }
}
```
`return`した値が`triangle`に格納される。
ちなみにgetterのみの場合は`get{}`を省略できる。
getが読み込み専用というのは`triangle`という変数そのものに値を代入(格納)することができないため。
アクセスすることしかできない。

#####setter
***
なぜかこのsetterがわかりづらかった。。。
インスタンス化された後`computed property`に別の値がセットされた時（値が代入された時）に呼ばれる。
※getはインスタンス化された時や、setによってgetで使っている値が変更された時に呼び出され、値が設定される。

```swift
class AreaOfTriangle {
    
    var base: Int
    var height: Int
    
    init(base: Int, height: Int) {
        self.base = base
        self.height = height
    }
    
    var triangle: Int {
        get {
            return base * height / 2
        }
        
        set(t) {
            base = t * 2
            height = t * 2
        }
    }
}

var a = AreaOfTriangle(base: 2,height: 2)
a.triangle = 5
print("\(a.base) , \(a.height)")　//10 , 10
```

インスタンス化された後`computed property`(ここでは`triangle`)に別の値がセットされた時（値が代入された時）に呼ばれる。
※getはインスタンス化された時や、setによってgetで使っている値が変更された時に呼び出され、値が設定される。

動きとしては引数`t`に5が代入される。
そして以下のように、引数の代わりに`newValue`を指定することもできる。

```swift
  set {
       base = newValue * 2
       height = newValue * 2
   }
```

###まとめ
***
計算型プロパティのsetterが自分の中で消化できなかったので調べて書いてみました。
間違いや例示したものが適切でない等ありましたらどしどしご指摘ください。
anacondaでtensorflowをインストールする際の注意点

１.ターミナルを立ち上げたらpyenvは初期化
`eval "$(pyenv init -)"`

2.source activate tensorflowのactivateはフルパスで指定
`source .pyenv/versions/anaconda3-4.1.0/envs/tensorflow/bin/activate tensorflow`

(参考)
http://ill-identified.hatenablog.com/entry/2016/08/11/204205
10分で実装するFluxやってみた

- 10分で実装するFlux
http://azu.github.io/slide/react-meetup/flux.html

Fluxを理解するためにやってみた。
Reactは使わない。
更にfacebook/fluxライブラリも使用してみる。

### Step1

ほぼリンク先通りに実装

- ソース
https://github.com/boushi-bird/sample-flux/tree/step1

### Step２

EventEmitterの代わりにflux.Dispatcher使用

1. flux をインストール

```
  npm install flux --save
```

２． EventEmitterをflux.Dispatcherに

https://github.com/boushi-bird/sample-flux/compare/step1...step2

- ソース
https://github.com/boushi-bird/sample-flux/tree/step2

### Step３

ReduceStore使用

https://github.com/boushi-bird/sample-flux/compare/step2...step3

- ソース
https://github.com/boushi-bird/sample-flux/tree/step3

React以外でもfluxライブラリは使えそう。
サーバー監視ツール Zabbix

# Zabbix
Zabbix は Alexei Vladishev によって1998年頃に開発を始めた監視ツール。

最新安定版は 2016/07/22 リリースの 3.0.4 で、最新評価版は 2016/08/05 リリースの 3.2.0alpha1 になる。

# インストール
## 構成
* CentOS 7.2.1511
* Apache 2.4.6
* PHP 5.6.24
* MySQL Community Server 5.7.14
* Zabbix 3.0.4

EPEL リポジトリーにも zabbix22 という Zabbix 2.2 のパッケージがあるが、如何せん古いので Zabbix 公式のリポジトリーを利用する。 PHP 7 にはまだ未対応とのこと。

## MySQL
```bash
yum install https://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm
yum install mysql-community-server
cp -a /etc/my.cnf{,.org}
echo "character-set-server=utf8" >> /etc/my.cnf
systemctl enable mysqld
systemctl start mysqld
grep "temporary password" /var/log/mysqld.log | awk '{print $11}'
mysql_secure_installation
mysql -u root -p
```
```mysql
mysql> CREATE DATABASE zabbix CHARACTER SET utf8 COLLATE utf8_bin;
mysql> GRANT ALL PRIVILEGES ON zabbix.* TO zabbix@localhost IDENTIFIED BY '<password>';
mysql> EXIT;
```

## PHP
```bash
yum install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
yum install yum-utils
yum-config-manager --enable remi-php56
yum install php php-gd php-bcmath php-xml php-mbstring php-php-gettext php-mysqlnd
sed -i 's|;date.timezone =|date.timezone = Asia/Tokyo|' /etc/php.ini
```

```
yum install OpenIPMI libssh2 fping libcurl iksemel libxml2 net-snmp
```

## Zabbix
```bash
yum install http://repo.zabbix.com/zabbix/3.0/rhel/7/x86_64/zabbix-release-3.0-1.el7.noarch.rpm
yum install zabbix-server-mysql zabbix-web-mysql zabbix-web-japanese zabbix-agent
zcat `find /usr/share/doc/zabbix-* -name create.sql.gz` | mysql -u root -p zabbix
sed -i '/# DBPassword/a \\nDBPassword=<password>' /etc/zabbix/zabbix_server.conf
setsebool -P httpd_can_connect_zabbix on
setsebool -P zabbix_can_network on
systemctl start zabbix-server
systemctl start zabbix-agent
systemctl start httpd
systemctl enable zabbix-server
systemctl enable zabbix-agent
systemctl enable httpd
```
ブラウザから /zabbix にアクセスするとセットアップ画面が開く。
アカウントは `Admin` 、パスワードは `zabbix` でログイン。

# モニタリング関連記事
* [サーバー監視ツール Munin](http://qiita.com/bezeklik/items/c4863c4114e0c339412b)
* [サーバー監視ツール Xymon](http://qiita.com/bezeklik/items/0f1234d8c9a2b54ec986)
* [サーバー監視ツール Zabbix](http://qiita.com/bezeklik/items/1f638727d6485ce9b931)
* [サーバー監視ツール Hinemos](http://qiita.com/bezeklik/items/f24077009f730eadbab1)
ローカルストレージの簡単な使い方

業務とかではあまり使わないかもしれないけど、
ちょっとしたメモアプリを作るときに知っていると
便利なローカルストレージについて簡単な使い方を記載する


**保存**
key、valueの形で保存する

```

 localStorage.setItem(key,value)

```

**取得**
取得したい値のkeyを指定する

```

 localStorage.getItem(key)

```

**削除**
削除したい値のkeyを指定する

```

 localStorage.removeItem(key)

```

**\*全ての要素を取得したい場合**

全ての要素を取得するという関数はなさそうなので、
以下のパターンで取得する。

**①for...inを使う**
for...in でストレージ内のkeyを取得し、
.get(key)で値を取得する

```
 for( var key in localStorage ){
     localStorage.get(key)
 }

```

**②localStorage.key()を使う**
.lengthで要素数がとれるので、for文でループする。
.key(i)でi番目のkeyが取得できるので、
.get(key)で値を取得する

```
 for( int i = 0; i < localStorage.length; i++ ){
     var key = localStorage.key(i)
     localStorage.get(key)
 }

```
🍎が好きすぎてiPhoneで使われているあのUIを再現してみた

ただの自己満足で作ったOSSを紹介。
🍎🍎🍎

## 🍎 What あのUI??
**あのUI** is これです。
![iPhone.gif](https://qiita-image-store.s3.amazonaws.com/0/84459/cb5813d3-249c-d4a3-5a93-ca65b8a7d79b.gif)


`Task manager` や `Task switcher`という具合の名前をちらほら見かけましたが正式名称ははっきりしていないです。
上記のようなUIライブラリ**Kaeru**を作りました。

https://github.com/bannzai/Kaeru/

横に一覧で表示されている`ViewController`をタップすると`UINavigationController.popToViewController`が呼ばれるといったライブラリになっています。

## 🍎 なぜ作ったのか  
https://github.com/marty-suzuki/SAHistoryNavigationViewController
`SAHistoryNavigationController`というライブラリを見つけて良い発想だなと感心を得ました。 
こちらのライブラリも`iOS task manager like UI in UINavigationContoller`を実現しているライブラリです。
上記のライブラリはiOS7〜8の`iOS task manager like UI in UINavigationContoller`だったので
興味本位でiOS9以降の`iOS task manager like UI in UINavigationContoller`を作ってみたのがきっかけです。

## 🍎 作ってみて雑感
iPhone標準の動きはUIKitを使えばある程度再現できるものだなと再認識しました。
たまには`Apple`っぽい、フラットデザインっぽいUIを意識してコードに落とすことで`UIKit`の理解が深まりました。
暇なときに**どうなってるんだろ、これ**と思ったものを作るのは息抜きにもなって楽しかったです。

## 🍎 最後に
もっとこう書いた方が計算に無駄がないね
ここの部分がちゃんと再現できていないからこうした方がいい
といった意見があればPull-Requestお待ちしております。

🍎 https://github.com/bannzai/Kaeru/ 🍎

🍎 \\(^o^)/ 🍎
Bash on Ubuntu on Windows を導入した話

# 導入

bashが使えるようになったのは前々から知っていたのだが、使っていなかった。
そもそもWindowsを使う機会が少なかった。
なので、導入してみようと思う。

***
### 1. Windowsを開発者モードにする。

```text:開発者モード
スタート　→　設定　→　更新とセキュリティ　→　開発者向け　→　開発者モード
```

### 2.Insider Preview Program ビルドの入手　or　Windows 10 Anniversary Update

```text:InsiderPreviewProgram参加
スタート　→　設定　→　更新とセキュリティ　→　Windows Update
→　詳細オプション　→　Insider Previewビルドの入手　→　開始する
```

そのままサイトを進めていき、Programに参加する。　**※要Microsoft用アカウント**

もしくは、
https://support.microsoft.com/ja-jp/help/12387/windows-10-update-history
で、更新する。　　**※Microsoftアカウント不要**
### 3.Windows Update

先ほどのサイトからUpdateを実行出来ます。方法はいくつかありますが、サイトに従えば大抵できると思います。

再起動される
### 4.Windwosの機能を有効

```text:Windowsの機能
スタート（右クリック）　→　プログラムと機能　→　Windowsの機能の有効化または無効化
```
- [x] Windows Subsystem for Linux(Beta)　👈**チェックする**

もう一度再起動

### 5.Bash起動

```text:Bash
Windowsキー　→　"Bash"　→　Enter
```
- 続行するにはy
- 新しいUNIXユーザ
- パスワード

とか、聞かれます。

## これで導入完了

あとは煮るなりaptするなりシェル書くなり、どうぞ。
Swift:NSDateで翌日を得る

OSX El Capitan(10.11.6)
Xcode 7.3.1
Swift version 2.2
を使用しております。

ちょっと前に
[Swift:NSDateの年号を西暦表示](http://qiita.com/t_punch/items/45536138b945197697a5)
というのを書きました。

今回は単純に翌日を得る方法です（改良すれば好きな日に変更できます）。

```text:方法その１
let date:NSDate = NSDate() //当日の日付を得る
let dateFormatter = NSDateFormatter()
//表示のためにフォーマット設定
dateFormatter.dateFormat = "MM/dd" // 日付フォーマットの設定

//当日をunixtime(1970/1/1 00:00:00 からの秒数表現)で得る
var time = date.timeIntervalSince1970
time += 60*60*24 //２４時間後の時間を加算(６０秒*６０分*２４時間)

//新しく日時取得        
let newDate:NSDate = NSDate.init(timeIntervalSince1970:time)

print("今日"+dateFormatter.stringFromDate(date))
print("明日"+dateFormatter.stringFromDate(newDate))

：：結果
今日08/29
明日08/30

```


```text:方法その２
let date:NSDate = NSDate() //当日の日付を得る
let dateFormatter = NSDateFormatter()
let calendar = NSCalendar(identifier: NSCalendarIdentifierGregorian)
//年月日時間を取得するよう設定する
let flags: NSCalendarUnit = [.Year, .Month, .Day, .Hour, .Minute, .Second,]
//設定したフラグに沿ってデータ取得
let currentCalendar = calendar!.components(flags, fromDate: date)
//表示のためにフォーマット設定
dateFormatter.dateFormat = "MM/dd" // 日付フォーマットの設定

currentCalendar.day += 1//+1して翌日にする

//新しく日時取得        
let newDate:NSDate = calendar!.dateFromComponents(currentCalendar)!

print("今日"+dateFormatter.stringFromDate(date))
print("明日"+dateFormatter.stringFromDate(newDate))

：：結果
今日08/29
明日08/30

```

日付を扱う関数に合わせて使いやすいやり方で使用するのがよいでしょう。
gitで良く使うコマンド（自分用メモ）

# 概要
gitで自分が良く使っているメモ。
※この記事は随時更新予定。

# 基本的なコマンド

## ファイルをステージングに追加

`git add [ファイル名]`

変更が加えられたファイルと、未追跡のファイルを全て追加するには ``

## ブランチの新規作成

`git branch [ブランチ名]`

ブランチの切り替えは `git checkout [ブランチ名]` を利用する。

なお、リモートリポジトリに反映する際は `git push --set-upstream origin [ブランチ名]` を実行するとリモートにブランチが作成され、かつ追跡ブランチの設定も行える。

## リモートに変更を反映する

`git push` ただし引数なしのpushは色々と問題があるので必ずブランチ名を指定する。

`git push -v --tags origin feature/issue-14-logger`

※ `feature/issue-14-logger` というブランチ名が存在すると仮定する。

# ブランチをチェックアウト

```bash:リモートリポジトリのブランチをローカルに反映する
# 最初にリモートリポジトリから情報を取得する
$ git fetch origin

# その後はcheckoutでブランチをローカルに反映する
# 下記の例ではリモートリポジトリに"develop"というブランチが存在する想定
$ git checkout -b develop origin/develop
```

# 空コミット

```bash:空コミット
$ git commit --allow-empty -m "コミットメッセージを入れる"
```

-m の後にはコミットメッセージを入れる。
私は[JIRA](https://ja.atlassian.com/software/jira)で課題管理をしている場合が多いのでこのメッセージには[JIRA](https://ja.atlassian.com/software/jira)の課題番号を入れている。

## 「空コミット」のユースケース

[git commit --allow-empty を使った WIP PR ワークフロー](http://qiita.com/keita-nishimoto/items/31e8af9ccb4b3bdd74d0) のようにプルリクエストを早めに出したいが、プルリクエストはコミットがないと出せないという状況を解消する為。

## コミットの取り消し

```bash:直前のコミットを取り消し（ワークディレクトリの内容はそのまま）
$ git reset --soft HEAD^
```

```bash:直前のコミットを取り消し（ワークディレクトリの内容も書き換える）
$ git reset --hard HEAD^
```

## リモートリポジトリoriginURLの変更

```bash:リモートリポジトリoriginURLの変更
git remote set-url origin git@git.example.com:foo/bar.git
```

### 「リモートリポジトリoriginURLの変更」のユースケース

- 単純にリモートリポジトリのURLが変わった時
- 今までHTTPSでリポジトリに接続していたがSSHを利用するように変えた時

ちなみに現在のリモートリポジトリを確認するには以下のコマンドを使う。

```bash:現在のリモートリポジトリを確認
git remote -v
```

## リモートリポジトリの最新状態に合わせたい時

```bash:リモートリポジトリの最新状態に合わせたい時
$ git reset --hard HEAD
$ git clean -fd
$ git pull --rebase -v
```
Android Studioで作成したアプリをWindroyで実行するメモ

1. Android StudioでBuild->Build APKを実行
2. 「xxxx\AndroidStudioProjects\xxxx\app\build\outputs\apk」にAPKが生成される
3. 「C:\Windroy\windroy_root\data\app」にAPKを配置する
4. Windroyを起動
任意のファイルサイズのデータを作成する

試験などで、適当なファイルサイズのデータが必要な場合、
ddコマンドで、任意のファイルサイズのデータが作成できる。

# dd コマンド

dd は入力から出力へデータをコピーするコマンドである。cp はファイルからファイルにコピーするだけであるが、dd はファイルからデバイス、デバイスからファイル、デバイスからデバイスへのコピーも可能なため、ディスクのバックアップやダンプにも使用できる。

ddコマンド1024Byteのテキストファイルを作成↓
<pre>
dd if=/dev/zero of=test.txt bs=1024 count=1
</pre>

## ● オプション

|if=[ファイル]|入力ファイル (デバイス)。指定しないと標準入力。|
|---|---|
|of=[ファイル]|出力ファイル (デバイス)。指定しないと標準出力。|
|bs=[サイズ]|入出力のブロックサイズを指定。ibs と obs の両方に同じ値をセットする場合に使用する。|
|ibs=[サイズ]|入力のブロックサイズを指定|
|obs=[サイズ]|出力のブロックサイズを指定|
|count=[ブロック数]|コピーするブロック数を指定|
|conv=変換オプション|変換オプションを指定 (後述)。conv=hoge,fuga などと複数指定も可能。|
|seek=[ブロック数]|出力の開始位置を指定されたブロックに移動してからコピーする|
|oseek=[ブロック数]|FreeBSD では seek と同じ。Solaris では違うっぽい…?|
|skip=[ブロック数]|入力の開始位置を指定されたブロックに移動してからコピーする|
|iseek=[ブロック数]|FreeBSD では skip と同じ。Solaris では skip より速いと書いてある…?|

|bs=1|1バイト|
|:--|:--|
|bs=1b|512バイト (b はバイトではなくブロック)|
|bs=1K|1KB|
|bs=1M|1MB|
|bs=1G|1GB|

http://x68000.q-e-d.net/~68user/unix/pickup?dd
Vagrant mount errorが出てきた!!

#Vagrantでハマったメモ
参考にしている本
<a  href="https://www.amazon.co.jp/gp/product/4873116651/ref=as_li_tf_il?ie=UTF8&camp=247&creative=1211&creativeASIN=4873116651&linkCode=as2&tag=gamahama-22"><img border="0" src="http://ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4873116651&Format=_SL110_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=gamahama-22" ></a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=gamahama-22&l=as2&o=9&a=4873116651" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

ちなみに、virsionが古いので下の公式サイトと併用することがいいと思います。

vagrant 様
<a href="https://www.vagrantup.com/">
![Vagrant by HashiCorp.png](https://qiita-image-store.s3.amazonaws.com/0/124054/98de2258-5d0b-04e1-cd92-5bcda8ee1f69.png)
</a>

#ディレクトリ構成
$.tree
　|-dev
　|-vagrant
　　|-Vagarantfile
　　|-provision.sh

#中身
##Vagrantfile[$/vagrant/Vagrantfile]

```vagrant/Vagrantfile
config.vm.box = "hashicorp/precise64
config.vm.define 'web' do |web|
    web.vm.synced_folder "../dev" , "/vagrant_dev"
    web.vm.network "forwarded_port", guest:80, host:8080
    web.vm.provision :shell, path: "provision.sh"
    web.vm.network "private_network" , ip:"192.168.33.10"
  end

  config.vm.define "db" do |db|
    db.vm.network "private_network" , ip:"192.168.33.11"
  end
```

```provision.sh
#!/usr/bin/env bash

echo "Installing Apache and setting it up..."
apt-get update >dev/null 2>&1
apt-get install -y apache2 >/dev/null 2>&1
rm -rf /var/www
In -fs /vagrant_dev /var/www
```

#vagrant up時に吐かれた忌まわしきエラー
##error log on terminal

```terminal-log
Failed to mount folders in Linux guest. This is usually because
the "vboxsf" file system is not available. Please verify that
the guest additions are properly installed in the guest and
can work properly. The command attempted was:

mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group vagrant | cut -d: -f3` vagrant /vagrant
mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g vagrant` vagrant /vagrant

The error output from the last command was:

stdin: is not a tty
/sbin/mount.vboxsf: mounting failed with the error: No such device

```

はい、英語わからないから適当に意訳

Linux guest のファルダーにマウントできません。
" vboxsf "ファイルシステムがないこよによう原因がほぼほぼの原因。
guest-additionに関するものいれて動く状況になったらこい！！
mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group vagrant | cut -d: -f3` vagrant /vagrant
mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g vagrant` vagrant /vagrant
上が吐かれた時のコマンドは
stdin: is not a tty
/sbin/mount.vboxsf: mounting failed with the error: No such device

ゲストアディションが原因なのかい？？
ってことでjQueryいじらされてからのプラグイン恐怖症になった自分が
Virtual box　のプラグインいれる。

#vagrant-vbguestのプラグインをいれる
とりあえず解消できたので、プラグインなしの変更手段を整えたいのですがいつか。
ターミナルコマンドを開いてい下記コマンド

```
$ vagrant plugin install vagrant-vbguest
```

おわったら

```terminal
$  vagrant up
```

*動いた!!*

最後にping送って確認。(一応やれといっていたので。)

```terminal
$ vagrant ssh web
$ ping 192.188.33.11
```

*うごいた！！*

って感じでとりあえず動きました！！
VCCWでpotファイルを作成するには - makepot

wordpressのテーマやプラグイン開発用のvagrantfileであるVCCWを利用して、プラグインを開発する際には、国際化ファイル(poファイル)を生成するスクリプトがデフォルトでインストールされています。（Wordpress i18n Tools)

簡単に手順をメモ。

# 1. vagrant ssh
ホストPC上ではなく、vagrantの中で。

# 2. cd /var/www/wordpress/wp-content/plugins/(プラグイン名)/language
作成したプラグインフォルダに、language的な名前の言語ファイル設置フォルダを作成して、そこにcd

# 3. makepot.php wp-plugin ..
ここを `makepot ..` だと動かない（これをメモしたかった）