OmniAICreator/Qiita-1.07M huggingface dataset:
Azure WebJobsはトリガーで書こう(たぶんそれが楽だから)

色々勘違いがあったので最初から書きますが[ドキュメント](https://docs.microsoft.com/ja-jp/azure/app-service/web-sites-create-web-jobs)を読んだほうが正確です。

# WebJobsについて

## WebJobsとは

Azure App Serviceのバッチ実行機能です。

## AppServiceとは

AzureのPaaSです。.Net、Java、Python、PHPなどの動作環境をサクッと提供します。

ポータル的にはWebAppsやAPIAppsなどのバリアントに分かれます。WebAppsは普通のウェブサイトを提供するためのサービスになります。

## WebAppsとは

素のWebAppsとfor Containerに分かれます。

素のWebAppsはLB+Windows Server+何か+共有ディスクと思えばだいたい合ってます。「何か」の部分にはIIS+.Net,IIS+PHP,IIS+Python,Node.js,Tomcat/Jettyが入ります。

for Containerの場合はLB+Docker+NET Core、Node.js、PHP、Ruby+共有ディスクという感じです。

## 元の題「continuousバッチをCMD.EXEで書いてはいけない件」について

同時実行を考慮していないバッチはたぶん世の中にそれなりにあると思いますが、その場合はバッチを実行するインスタンスを限定しなければいけません。

WebJobsには継続（continuous）とトリガーの2種類があって、当初トリガーはオートスケールし、継続のみスケールするかしないか選択できると思っており、継続を使う場合についての記事を書いていました。

しかし[ドキュメント](https://docs.microsoft.com/ja-jp/azure/app-service/web-sites-create-web-jobs#webjob-types)を読めば一目瞭然なのですが、トリガーだとそもそもスケールアウトしません。

同時実行を考慮してないバッチの場合、トリガーを使ったほうが楽だと思います。crontab風の記述で実行タイミングを設定できますし。

尚、元はスリープを入れるための記事でしたが、仮に継続を使っていてもバッチは自動的に再開されるので、特にスリープを入れる必要はないと思います。

そういうわけでこの記事にほとんど意味はないのですが、tipsとして過去記事の一部を残しておきます。

## tips

WindowsのCMD.EXEの処理でスリープを入れる方法としてtimeoutコマンドがあります。

```bat
:top
do_something_background_job.exe
timeout 100
goto top
```

これはWebJobsで期待通りの動作をしません。timeoutコマンドは本来入力待ちを行なうためのコマンドなので、TTYがとれないとエラーを吐いて死ぬためです。但し前述の通りバッチは自動的に再開されるのでそんなに心配しなくてもバッチはまた実行されます。

もし時間を決めてスリープしたい場合は他の言語を使ってください。例えばBashのsleepは問題なく動作します

```bash
while :
do
  do_something_background_job
  sleep 100
done
```

（しかしMSYSのBashなのでそもそも微妙に信頼できなかったりする）
共有PCからGitHubを利用する際に気を付けたいGitの設定

学校や会社など、自分以外の人も使用するPCでGitHubを利用する場合、
PC内に**名前**、**メールアドレス**、**GitHubの認証情報**などの個人情報を残したくないので
そのための設定方法をまとめてみました。

#名前・メールアドレス

```sh:基本的な名前とメールアドレスの設定コマンド
$ git config --global user.name "John Smith"
$ git config --global user.email "john.smith@example.com"
```

`--global`というオプションが付いている。
このコマンドで名前とメールアドレスを設定してしまうと
`C:\Users\ユーザー名\.gitconfig`
というファイルに設定が保存され、そのユーザー以下の全てのリポジトリに適用されてしまう。

##ローカル設定

ユーザー名フォルダ直下に情報が残るのは嫌なので
`--local`というオプションに変更する。

```sh
$ git config --local user.name "John Smith"
$ git config --local user.email "john.smith@example.com"
```

こうすることで設定は各リポジトリの
`.git\config`
ファイルに保存され、そのリポジトリ内にしか適用されない。

そして作業終了時にリポジトリごと削除してしまえば情報は残らない。


#GitHubの認証情報

GitHubにPushしようとするときに入力を求められるGitHubのユーザー名とパスワードのこと。
この情報をPCに残さないようにするには`credential.helper`という設定項目を`cache`にする。
こうすると認証情報は一定の時間だけメモリに記憶されるが、ハードディスクに保存されることはない。

[参考：Git公式ドキュメント 認証情報の保存](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%84%E3%83%BC%E3%83%AB-%E8%AA%8D%E8%A8%BC%E6%83%85%E5%A0%B1%E3%81%AE%E4%BF%9D%E5%AD%98)

ちなみに私の環境では初期状態で
`credential.helper = manager`
になっており、一度入力した認証情報がずっと残るようになっていました。


#オプション

##`--system`
システム全体に適用される設定。全てのユーザー、全てのリポジトリが対象。
設定は`C:\Program Files\Git\mingw64\etc\gitconfig`ファイルに保存される。
（※Windows 64bit 環境）
（※Git 64bit 版）

##`--global`
そのユーザーにのみ適用される設定。ユーザー以下、全てのリポジトリが対象。
設定は`C:\Users\ユーザー名\.gitconfig`ファイルに保存される。

##`--local`
そのリポジトリにのみ適用される設定。
設定は`.git\config`ファイルに保存される。
オプションを何も指定しなかった場合、デフォルトでこの設定になる。
cURLのメモ

単なる個人的なcURLの使い方メモです。

# 参考サイト

* http://www.hcn.zaq.ne.jp/___/unix/curl_manpage.html

# レスポンスヘッダーの出力 (-D)

出力先を標準出力にしたい場合は、出力先を「`-`」にすればOK。

```bash
$ curl -D - http://localhost:8080/
```
```text
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: text/plain;charset=UTF-8
Content-Length: 10
Date: Sun, 22 May 2016 04:22:33 GMT

Welcome !!
```

# リダイレクト先へのアクセス (-L)

```bash
$ curl -L -D - http://localhost:8080/redirect
```
```text
HTTP/1.1 302 Found
Server: Apache-Coyote/1.1
Location: http://localhost:8080/
Content-Language: ja-JP
Content-Length: 0
Date: Sun, 22 May 2016 04:28:51 GMT

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: text/plain;charset=UTF-8
Content-Length: 10
Date: Sun, 22 May 2016 04:28:51 GMT

Welcome !!
```

# HEADリクエスト(-I)

```bash
$ curl -I http://localhost:8080/todos
```
```text
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: application/json;charset=UTF-8
Content-Length: 2
Date: Sun, 29 May 2016 10:10:58 GMT

```

# OPTIONSリクエスト(-X OPTIONS)

```bash
curl -D - -X OPTIONS http://localhost:8080/todos
```
```text
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Allow: POST,GET,HEAD
Content-Length: 0
Date: Sun, 29 May 2016 14:46:12 GMT
```
CentOS6.7 virtualBOXでクローンを作成したOSがネットワークへ抜けない場合

#CentOS6.7 virtualBOXでクローンを作成したOSがネットワークへ抜けない場合

virtualBOXでクローンをした場合、ネットワークに接続できない場合以下の方法を実行します。
##1.MACアドレスの調査
・作成したクローンを選択し、[設定(S)]をクリックします。
・ネットワークをクリックし、以下を選択します。
　「割り当て(A)」-ブリッジアダプター
　「名前(N)」-enp3s0
　「高度(D)」-クリック
　「プロミスキャスモード(P)」-すべて許可
　「ケーブル接続(C)」-チェック有
・「MACアドレス(M)」を控え、「OK(O)」をクリックします。
##2.イーサネットにMACアドレスを設定
・ゲストマシンへログインします。
・以下を入力します。

```
sudo vi /etc/sysconfig/network-scripts/ifcfg-eth0
```

```lang:/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
HWADDR=xx:xx:xx:xx:xx:xx    ←先ほど控えたMACアドレスとを入力
TYPE=Ethernet
UUID=c6780298-afae-41a4-a2a5-50cc730a1e15
ONBOOT=yes
NM_CONTROLLED=no
#BOOTPROTO=dhcp
IPADDR=x.x.x.x    ←以下、自分のネットワークに合わせて設定
NETMASK=x.x.x.x
GATEWAY=x.x.x.x
```
##3.イーサネットのMACアドレス修正
・以下を入力します。
```
sudo vi /etc/udev/rules.d/70-persistent-net.rules
```

```
# This file was automatically generated by the /lib/udev/write_net_rules
# program, run by the persistent-net-generator.rules rules file.
#
# You can modify it, as long as you keep each rule on a single
# line, and change only the value of the NAME= key.

# PCI device 0x8086:0x100e (e1000)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="xx:xx:xx:xx:xx:xx", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="xx:xx:xx:xx:xx:xx", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="xx:xx:xx:xx:xx:xx", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"
```

・上記ののように、イーサネットに複数の設定が書かれている場合、
　以下のように、設定します。「ATTR{address}==」は先ほど控えたMACアドレスを入力します。

```
# This file was automatically generated by the /lib/udev/write_net_rules
# program, run by the persistent-net-generator.rules rules file.
#
# You can modify it, as long as you keep each rule on a single
# line, and change only the value of the NAME= key.

# PCI device 0x8086:0x100e (e1000)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="xx:xx:xx:xx:xx:xx", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
```
##4.再起動
・再起動します。
```
reboot
```
以下サイト参考にしました。
https://blog.apar.jp/linux/147/
kintoneとTRANSRECを連携させて、自動電話受付システムを構築する

:::note alert
2023年5月1日を持ちまして、株式会社KDDIウェブコミュニケーションズのTwilioリセール事業が終了したため、本記事に記載されている内容は正確ではないことを予めご了承ください。
:::

# はじめに
TRANSRECとは、月額324円で利用が可能なTwilioを活用した留守番電話のサービスです。個人の留守番電話としても利用できますが、法人の電話受付としてもかなり使われています。
今回は、このTRANSRECをkintoneと組み合わせて、簡単に自動電話受付システムを構築したいと思います。
※ちなみに、kintoneに触ったのは昨日が始めてですので、kintoneの説明は極力少なくしています（すみません）。
## 利用イメージ
050番号に電話がかかると、相手の音声が録音され、さらにそれが音声に変換された後、kintone上に蓄積されていくというものです。Twilioをベースに作られているので、同時に複数の着信が入っても話中になることがありません。今まで電話で受付していた業務を自動化するにはとても便利で安く作れるソリューションです。
# 準備
[Node.js](http://nodejs.org/)のインストール。
[TRANSREC](https://www.transrec.net/)の申し込み。
[kintone](https://kintone.cybozu.com/jp/)の申し込み。
インターネット上で公開可能なサーバ（デモプログラムの実行場所）。
# インストール
## デモプログラムのダウンロード
githubからサーバー上の任意のフォルダにソースコードをダウンロードします。

```lang:command
$ git clone git@github.com:mobilebiz/kintone_transrec.git
$ cd kintone_transrec
$ npm install
```
## TRANSREC側の準備
TRANSRECのAPIキー(SID、Token)を取得し、/config/default.json 内のtransrecセクション内に記載します。 APIキーの取得方法については、[こちら](https://transrec.zendesk.com/hc/ja/articles/201682239)を参照してください。 なお、Ping通知設定欄の「Ping通知先」については、以下の通りに設定します。

- プロトコル: http
- ポート番号: 3000
- メソッド: POST
- 接続先ホスト: このプログラムを実行するサーバ（例:www.hoge.com）
- 接続先パス: /ping
- 発信者通知: OFF
- 着信番号通知: OFF

## kintone側の準備
kintone側でアプリを作成し、録音データを格納するためのフォームを作成します。 フォームの名前と内容は以下のように設定してください。

- 着信日時（データタイプ：日時、フィールドコード：calledDate）
- 発信者番号（データタイプ：文字列（１行）、フィールドコード：phoneNum）
- メッセージ（データタイプ：文字列（複数行）、フィールドコード：message）
- 音声データ（データタイプ：リンク（URL）、フィールドコード：mp3） 作成したアプリのホスト名（例：hogehoge.cybozu.com）とkintoneのIDとパスワードを、/config/default.json内の、kintoneセクション内に記載します。
<img width="1039" alt="kintone01.png" src="https://qiita-image-store.s3.amazonaws.com/0/86046/480911ed-d6b2-e3b3-b570-96b755589d15.png">

# プログラムの起動

```lang:command
$ npm start
```

3000番ポートでWebサーバーが起動しますので、TRANSRECで取得した050番号に対して電話をかけて、何かメッセージを録音してみましょう。
次のようにデータが登録されれば成功です。
<img width="412" alt="kintone02.png" src="https://qiita-image-store.s3.amazonaws.com/0/86046/119b8394-aee3-ff62-6cbd-dceb6bcaefbb.png">
ちなみに、音声データ（mp3）は、public/mp3フォルダ内に作成されています。

# 参考ドキュメント
[TRANSREC RESTful API](https://transrec.zendesk.com/hc/ja/categories/200105579)
GIFアニメーションの先頭フレームと最終フレームだけの待ち時間を変更する方法

ソフトウェアの説明用動画をGIFアニメーション化してREADMEに貼り付けるような場合に、ループして動き続けていると目障りに感じることはないでしょうか。先頭フレームと最終フレームで一定の停止時間を設けることで多少見やすくすることができます。

これにはImageMagickを使います。下記は先頭フレーム表示直後の待ち時間を1秒、最終フレーム表示直後の待ち時間を3秒に変更する例です。

```
$ convert in.gif \( -clone 0 -set delay 100 \) -swap 0 +delete \( +clone -set delay 300 \) +swap +delete out.gif
```

ImageMagickマジ魔法すぎる…

## 元ネタ

* [GIF animation: how to set a delay for a particular frame? - ImageMagick](http://www.imagemagick.org/discourse-server/viewtopic.php?t=20666)
【C#】CsvHelperでCSVをIEnumerable<T>オブジェクトに変換

| CodePage | Name | DisplayName | Note |
|----------|------|-------------|------|
|932|shift_jis|Japanese (Shift-JIS)||
|20932|EUC-JP|Japanese (JIS 0208-1990 and 0212-1990)||
|65001|utf-8|Unicode (UTF-8)||

上記テーブルを表すCSVファイルをencodings.csvという名前でCドライブ直下に保存した場合、下記コードでNameフィールドの値の一覧を表示することができる。

```csharp
using CsvHelper;
using System;
using System.IO;

class EncodingInfo
{
    public int CodePage { get; set; }
    public string Name { get; set; }
    public string DisplayName { get; set; }
}

class Sample
{
    public static void Main(string[] args)
    {
        var path = @"C:\encodings.csv";
        using (var reader = new StreamReader(path))
        {
            var csv = new CsvReader(reader);
            var records = csv.GetRecords<EncodingInfo>();
            foreach (var info in records)
            {
                Console.WriteLine(info.Name);
            }
        }
    }
}
```

* 数値型プロパティのフィールドに英字を含めると、`CsvHelper.TypeConversion.CsvTypeConverterException`例外が発生する。

https://github.com/JoshClose/CsvHelper
https://joshclose.github.io/CsvHelper/
【AccessVBA】ファイル選択ダイアログの作り方

###説明

今回は、MicrosoftAccessのVBAを使った
ファイルオープンダイアログの作り方です。

用途としては、ファイルをパラメータとして指定して動かしたいときに
Windowsのファイル選択ダイアログを出して、ユーザーに選択させます。

例えば、ログファイルを指定させることで、そのファイルを
Accessに取り込んで処理をする、などです。


さっそく見ていきましょう。
以下コードは、ファイル選択ダイアログを出力し、
選択したファイルのフルパス（ファイル名含む）を
アクセスの部品「テキストn」に設定しています。

###コード
```vbnet:AccessVBA
Private Sub コマンドx_Click()

    On Error Resume Next
    '変数定義
    Dim intRet As Integer         'ダイアログ用変数
    Dim GetFileName As String     'フルパスの値
  
    With Application.FileDialog(msoFileDialogOpen)
        'ダイアログのタイトルを設定
        .Title = "ファイルを開くダイアログ"
        'ファイルの種類を設定
        .Filters.Clear
        .Filters.Add "Microsoft Office Excelファイル", "*.xls,*.csv"
        .FilterIndex = 1
        '複数ファイル選択を許可しない
        .AllowMultiSelect = False
        '初期パスを設定
        .InitialFileName = CurrentProject.Path
        'ダイアログを表示
        intRet = .Show
        
        If intRet <> 0 Then
          'ファイルが選択されたとき
          'そのフルパスを返り値に設定
          GetFileName = Trim(.SelectedItems.Item(1))
        Else
          'ファイルが選択されなければブランク
          GetFileName = ""
        End If
    End With
    '選択されたフルパスをテキストボックスへ表示
    Form_F_Form.テキストn.Value = GetFileName
    
End Sub
```

###補足
基本的にはそのまま使えますね。
手を加えるとしたら、以下3点です。


```vbnet:
.Filters.Add "Microsoft Office Excelファイル", "*.xls,*.csv"
```
ここではxls/csvのみ選択できるようにしています。
*にすると、なんでも選択できます。


```vbnet:
.AllowMultiSelect = False
```
複数選択を禁止しています。
許可する場合は、返り値を取得する箇所にも注意が必要です。


```vbnet:
.InitialFileName = CurrentProject.Path
```
ファイル選択ダイアログの初期表示の設定です。
ここではAccessファイルのパスを表示ししていますが、ケースによって
使いやすいパスを設定しておくと良いでしょう。


###おわりに
可変のファイルを扱う場合、Accessにハードコーディングしたり、
ファイルパスをフォームに貼り付けしてもできますが、
ファイル選択ダイアログを使って選択させてあげたほうが、
より柔軟で使いやすいでしょう。

ユーザーも、Windowsの操作感で使えるので、違和感が無いこともメリットです。
jenkinsにpythonのテストを設定

# unittestに関して

## 準備

unittest をインストール。（Pythonの設定は割愛）

```
pip install unittest
```

## unittestの例：

```python:test.py
import unittest

class TestTagAprioriMain(unittest.TestCase):

    def setUp(self):
        print('start')

    def tearDown(self):
        print('finished')

    def test_success(self):
        res = 1 + 2
        self.assertEqual(res, 3)

    def test_success2(self):
        res = 1 + 2
        self.assertEqual(res, 3)

    def this_is_ignored(self):
        res = 1 + 2
        self.assertEqual(res, 1)

if __name__ == '__main__':
    unittest.main()
```

```bash:実行結果
start
finished
.start
finished
.
----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK
```

## これだけは抑えたいポイント：

1. test_で始まるMethodはテストの対象となる。(上の例では、this_is_ignoredは呼ばれず、ran 2 testsとなっている。)
2. setUpとtearDownはそれぞれ、テスト（test_<..>の）メソッドの前に呼ばれる。(startとfinishedを出力するようにして、いつ呼ばれているのかをわかりやすくした)
3. 今回は、`self.assertEqual()`という2者が同じかどうかのチェックを使ったが、他にもいろいろあるので、適切なものを使う

## テストの方法

###基本的なもの：

```python
self.assertEqual() 
self.assertTrue()
self.assertFalse()
```

### エラーチェック
Errorのテストもあり、以下のように書くことでエラーのパターンを具体的に書くこともできる。（以下に載せた公式ページにあったものをそのまま掲載）

```python
s = 'hello world'
self.assertEqual(s.split(), ['hello', 'world'])
with self.assertRaises(TypeError):
    s.split(2)
```


## 公式ドキュメント：
python3: https://docs.python.org/3/library/unittest.html
python2.7: https://docs.python.org/2.7/library/unittest.html


# jenkinsに関して

## jenkinsとは
https://jenkins.io/
jenkinsはCI（継続的インテグレーション）ツールとして有名である。これだけ見ても「継続的インテグレーション」って何？となるかもしれないが、

Wikipedia：
*主にプログラマーのアプリケーション作成時の品質改善や納期の短縮のための習慣のことである。(..略..) 狭義にはビルドやテスト、インスペクションなどを継続的に実行していくことを意味する*


http://e-words.jp/w/%E7%B6%99%E7%B6%9A%E7%9A%84%E3%82%A4%E3%83%B3%E3%83%86%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3.html ：
*ソフトウェア開発において、ビルドやテストを頻繁に繰り返し行なうことにより問題を早期に発見し、開発の効率化・省力化や納期の短縮を図る手法。*


つまりは、簡単に考えると、**継続的にテストとかを通していく**といった感じである。（作者も完全に理解していないので）

イメージとしては、「自動的に、定期的にテストが通ってることを確認できる」といったような感じである。

## Jenkinsの導入に関して

今回は扱わないため他のページを参照：
https://appkitbox.com/knowledge/test/20121112-116

## 新しいitemを立てる

### BitbucketにRepoがあるとして、設定

1. gitレポをbitbucketに設定し、SSHのPubKeyをBitbucketにも登録しておく
2. Build when a change is pushed to BitBucketにチェックを入れる。

### python version設定

pyenv build wrapperがなければ、Jenkinsにインストールする

1. Build Environmentでpyenv build wrapperを選択し、今回は3.4.1を設定
2. preinstall pip listに必要なLibraryを書く。例：`numpy,pyyaml,pandas`

### テストで動かすものを設定
Buildのしたのexecute shellで必要な変数設定と動かすコマンドを書く。(以下はいらないのが入ってるかもしれないが‥)
```
PYENV_HOME=$WORKSPACE/.pyenv/
export PYTHONPATH=$WORKSPACE:"$(dirname "$WORKSPACE")"
python setup.py test
```


これで完了。後は、変更を保存し、Buildして、Successになるのを確かめる。

##テストが落ちた場合は、

Job番号から、Output Consoleというのを見れば、普通のTerminalと同じようにエラーを見ることができる。
ブラウザでよく使うショートカット



## Chrome

### ブックマーク

| キー | 操作 Mac | Windows |
|:------------:|:------------:|:------------:|
| ブックマークマネージャ | command + option + b | - |


### 履歴

| キー | 操作 Mac | Windows |
|:------------:|:------------:|:------------:|
| 履歴 | command + y | - |
IBM WatsonのSpeechToTextで「Androidのマイクから音声を拾って文字を起こす」アプリを作った


前回作成した[Watson関連の記事](http://qiita.com/LyricalMaestro0/items/cb81991ffe1c658a03c7)の続きみたいな位置付けです。きちんとしたAndroid用SpeechToTextライブラリを使った話です。
Watsonについての説明は前回書いた記事を参考にしてください。

# 今回使ったライブラリ
「speech-android-sdk」というAndroid用のライブラリを使いました。前回紹介したSDKだと種々のAPIを呼び出せたのですが、今回はSpeechToText, TextToSpeechに特化したものになります（その代わり、Androidとの親和性はバッチリです！）
さらにこのライブラリの大きなメリットは、何よりこれを使えば「Androidのマイクから音を拾って音声認識を行うことができる」ということです。
https://github.com/watson-developer-cloud/speech-android-sdk

このライブラリはIBM Watsonの公式リポジトリに登録されています。

# 使い方

1. ライブラリの導入
https://github.com/watson-developer-cloud/speech-android-sdk#installation
を参考にしてみてください。ここで日本語に訳したものを記述するよりはわかりやすいと思います。
2. AndroidManifest.xmlの追記
以下のコードをAndroidManifest.xmlに記載してください。(マイクと通信使うから当たり前っちゃ当たり前だが・・・)
```
    <uses-permission android:name="android.permission.RECORD_AUDIO"></uses-permission>
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>
```
3. ISpeechDelegateの実装
ISpeechDelegateはSpeechToTextを呼び出した後のイベントを拾うためのインターフェイスです。後に書く初期化処理のさいに使いますので、その前に実装しといたほうがスムーズにいくと思います。
ISpeechDelegateは以下のようなAPIになっています。

```java:ISpeechDelegate
public interface ISpeechDelegate {

    /**
     * SpeechToTextのサーバとの接続が成功した時に呼ばれます。
     */
    void onOpen();

    /**
     * SpeechToTextサービスとのやり取りの間でエラーが発生した時に呼ばれます。
     */
    void onError(String error);

    /**
     * SpeechToTextのサーバとの接続解除がされた時に呼ばれます。
     */
    void onClose(int code, String reason, boolean remote);

    /**
     * SpeechToTextサービスからの解釈結果を受け取ります。認識処理モード中の間にマイクが音を拾うたびに呼ばれます。
     */
    void onMessage(String message);

    /**
     * 音量と振幅のデータを受け取ります。オシロスコープ的なのを作るのに使える？？？
     */
    void onAmplitude(double amplitude, double volume);
}
```
4.初期化処理<BR>
音声認識を始める前に以下の初期化処理を実行させます。

```
SpeechToText.sharedInstance().initWithContext(
            URI.create("wss://stream.watsonplatform.net/speech-to-text/api"),
            context,
            new SpeechConfiguration());            SpeechToText.sharedInstance().setCredentials("YOUR_ACCOUNT", "YOUR_PASSWORD");
SpeechToText.sharedInstance().setDelegate([ISpeechDelegateの実装]);
SpeechToText.sharedInstance().setModel("ja-JP_BroadbandModel");
// 上記モデルの引数で言語を指定することが可能。
```
個人的なおすすめはinitWIthContextをApplication#onCreate内で実装して、状況に応じて2行目以降をActivityのどこかに実装するというのがいいと思います。(特にsetModelのあたりはアプリによっては言語を変えて試したいというニーズもあるはず)
5. 認識開始
`SpeechToText.sharedInstance().recognize()`を実行します。Java版SDKと違い、ワーカスレッド上で動かす、といった処理を書かなくてもOKです。
6. 認識終了
`SpeechToText.sharedInstance().stopRecognize()`を実行します。

# 実際作ったアプリ
このSDKを使って「Androidのマイクから音声を拾って文字を起こす」アプリを作りました。
アプリケーションのソースはGithubにアップロードしてますので、気軽にDLして試してみてください。

https://github.com/LyricalMaestro/SpeechToTextSample2

![スクリーンショット 2016-05-22 12.01.16.png](https://qiita-image-store.s3.amazonaws.com/0/14989/4365b82b-54b8-29a9-16ec-8015fed76bfa.png)


# 所感
正直、前回紹介したSDKよりはAPI的に使いやすい印象でした。今回紹介したような機能をさくっと実現したい人にとってはとても重宝すべきものだと思います。(もう少し高度なことをしたい場合は・・・もう自分でSDK書くしかないかな、って気はしますが。。。)
mac でbrew がおかしくなった（brew updateができない）のを解決

#問題1


```bash
 /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- utils/popen (LoadError)
from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require'
from /usr/local/Library/Homebrew/utils.rb:6:in `<top (required)>'
from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require'
from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require'
from /usr/local/Library/Homebrew/global.rb:9:in `<top (required)>'
from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require'
from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require'
from /usr/local/Library/brew.rb:16:in `<main>'
```

のようなというエラーが出て、Brewが何もできない

## 解決策

```bash
cd /usr/local/
git status
```
とすると、いろいろおかしくなってるので、

```
git reset --hard && git clean -df
```
これで、GitRepoが綺麗になり、brewができるようになった



##参考ページ
http://stackoverflow.com/questions/24652996/homebrew-not-working-on-osx

# 問題2 brew updateができない

```bash
warning: unable to unlink CONTRIBUTING.md: Permission denied
warning: unable to unlink SUPPORTERS.md: Permission denied
fatal: cannot create directory at '.github': Permission denied
Error: Failure while executing: git pull --quiet origin refs/heads/master:refs/remotes/origin/master
```

というエラーがでた


そこでGoogleと、

https://github.com/Homebrew/legacy-homebrew/issues/49879

このページにたどり着く！

そして、グッドボタンが押されてるのを見てみると

```bash
sudo chown -R $(whoami):admin /usr/local
cd $(brew --prefix) && git fetch origin && git reset --hard origin/master
```
してから、

```bash
brew update
```
すればよいと書いてある！

成功！！！

# おまけ


brew updateすると、最後に

```bash
Error: Could not link caskroom/cask manpages to:
  /usr/local/share/man/man1/brew-cask.1

Please delete these files and run `brew tap --repair`.
```
というのが出ているので、次いでに調べるとQiitaにすでに投稿がある！
http://qiita.com/armorik83/items/de7c5a5a8785de6ea815
こちらを参考にして、一個目の修正を試すと

```bash
brew uninstall --force brew-cask; brew update
```

うまく言った。
Ubunutu OpenStack を試そう（１）-まずは環境を精査

わたくしの自宅サーバー環境では、Hyper-V サーバ（Win2012R2/Win10）を3台運用しています。これらを統合管理させるための定石では、MS System Center VMMになるのですが、ライセンス費用が算出できません。また、Win10 は管理対象外であるためSCVMM では対応できません。

そこで白羽の矢が立ったのが、Openstack になります。同様のサービスとして、Cloudstack などありますが、今回はOpenstack です。

なお、参考図書としましては、以下の本を参考にしています。
http://ur0.work/u1C5

以下の環境で実験を行います。
[1] 物理サーバ（仮想サーバ）
① Windows 10 bulid 1511 on Hyper-V
② Ubuntu 16.04LTS KVM
[2] 仮想サーバ
① Ubuntu 16.04LTS VM
Keystone、Horizon をインストールします。コンポーネントは仮想マシンを別建てします。
② Win2012R2 
場合に応じて

まずはUbuntu KVM のインストールを行います。インストール手順は次記事で！
今更zplugを入れてみる

# zshをもっと快適に！

上記の目標を持ち、ネットサーフィンしているとzplugがおすすめ！っていう記事を見つけたので、入れてみました。

- 下記コマンドで入れられるよってことで入れてみましたが、zplugコマンドが見つからないよ！と怒られます

    - `brew install zplug`

- なので、公式オススメの下記crulコマンドで入れましょう

    - `$ curl -sL zplug.sh/installer | zsh`

- 入れたら公式のサンプルに従って.zshrcを編集。pathだけ気をつけてください
    - [公式](https://github.com/zplug/zplug)

後は他の情報をググって好みのカスタマイズにしてくださいね！
画面遷移時にソフトキーボードを非表示

EditTextにフォーカスがあたると、ソフトキーボードが表示されるが
その状態で画面遷移すると、ソフトキーボードが表示されたままになってしまう。

それを解消するため、画面遷移前にonStop()にて
ソフトキーボードを非表示にしてしまえば、上記が解消される。

    @Override
    public void onStop() {
        super.onStop();

        //ソフトキーボードを非表示
        if ( getView()  != null ) {
            InputMethodManager imm =
                    (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow( getView().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS );
            getView().clearFocus();
        }

    }

※上記はFragmentの場合
python3で3dのgifを作成

#かっこいい3DをPythonで書くブログを見つけた

http://geoffboeing.com/2015/04/animated-3d-plots-python/

このブログがかっこいいので、日本語版を買ってに作って共有！


結論から言うとこのブログだけでは、Python3ではうまくいかない。
そもそも images2gifがpython2である。

そこで、「images2gif python3」とググるとすぐに以下のGithubにたどり着く

https://github.com/isaacgerg/images2gif

これをローカルでとりあえず、`python images2gif.py`してうまく行けばよし。以下のGifができる。


![test.gif](https://qiita-image-store.s3.amazonaws.com/0/7059/014fcb3b-9982-6313-64a2-ffe2a12e58b7.gif)

そして、上のブログのやつのと統合！

もしもすでにpython3でimages2gifをインストールしてしまった人は、`pip uninstall images2gif`かなんかで消す。

そして、直接上のGithubから持ってきたimages2gif.pyをimportする。

## 必要なものをImport(blogからそのまま利用)
```py3
import pandas as pd, numpy as np, random
import matplotlib.pyplot as plt, matplotlib.cm as cm
from mpl_toolkits.mplot3d import Axes3D
import IPython.display as IPdisplay
import glob
from PIL import Image as PIL_Image
from images2gif import writeGif
```

## 3dの画像をAxes３Dで書く(自分で勝手に書いた)

```py3
gif_file_name = '3d_test'

x = np.arange(-3, 3, 0.25)
y = np.arange(-3, 3, 0.25)

x = np.arange(-3, 3, 0.25)
y = np.arange(-3, 3, 0.25)
X, Y = np.meshgrid(x, y)
Z = np.sin(X)+ np.cos(Y)

fig = plt.figure()
ax = Axes3D(fig)
ax.plot_wireframe(X, Y, Z)
```


##アングルの違う100枚の画像を保存(blogをそのまま利用)

```py3
ax.elev = 89.9
ax.azim = 270.1
ax.dist = 11.0

for n in range(100):
    if n >= 20 and n <= 22:
        ax.set_xlabel('')
        ax.set_ylabel('') #don't show axis labels while we move around, it looks weird
        ax.elev -= 0.5 #start by panning down slowly
    if n >= 23 and n <= 36:
        ax.elev -= 1.0 #pan down faster
    if n >= 37 and n <= 60:
        ax.elev -= 1.5
        ax.azim += 1.1 #pan down faster and start to rotate
    if n >= 61 and n <= 64:
        ax.elev -= 1.0
        ax.azim += 1.1 #pan down slower and rotate same speed
    if n >= 65 and n <= 73:
        ax.elev -= 0.5
        ax.azim += 1.1 #pan down slowly and rotate same speed
    if n >= 74 and n <= 76:
        ax.elev -= 0.2
        ax.azim += 0.5 #end by panning/rotating slowly to stopping position
    if n == 77:
        ax.set_xlabel('X')
        ax.set_ylabel('Y')
        ax.set_zlabel('Z')
    fig.suptitle('Practice')
    fig.savefig('images/' + 'img' + str(n).zfill(3) + '.png')
```

##最後に100個の画像からgif作成

```py3
images = [PIL_Image.open(image) for image in glob.glob('images/*.png')]
file_path_name = 'images/3d_test.gif'
writeGif(file_path_name, images, duration=0.1)
```

これで完成したのが、以下になります！（画像が圧縮されてGifが動かないw…）

![3d_test.gif](https://qiita-image-store.s3.amazonaws.com/0/7059/8239e021-7e2b-f3bf-ee96-bc7285275c33.gif)


しかたがないので、5コマバージョン作成↓

![3d_test_sm.gif](https://qiita-image-store.s3.amazonaws.com/0/7059/8672debf-9b94-7c58-4d63-8e9b037fc9f8.gif)
App Extensionsメモ


App ExtensionsをSwiftでサンプル実装しながら、改めて見直しを行いました。

## 共通・エクステンションの追加方法

エクステンションを追加するには、既存のアプリプロジェクトに対して新たなターゲットを追加します。

<img width="732" alt="add_extension.png" src="https://qiita-image-store.s3.amazonaws.com/0/25727/ca50ae7b-9fc6-b385-79ba-8733e829124f.png">

* File > New > Target... から`Today Extension`を選択
* `Product Name`などを入力

エクステンションを追加すると、これをビルド＆実行するためのスキームもされます。
デバッグ時はこれを選択することをお忘れなく。

<img width="332" alt="run_extension.png" src="https://qiita-image-store.s3.amazonaws.com/0/25727/6228c8ec-3522-7510-719f-c18be5773f14.png">

## Today Extension

[詳細とサンプルはこちらの記事にて](http://qiita.com/imk2o/items/805a4177d611c0306ae0)

## Action Extension

[詳細とサンプルはこちらの記事にて](http://qiita.com/imk2o/items/2f555defef097f3a99d9)

## Photo Editing Extension

[詳細とサンプルはこちらの記事にて](http://qiita.com/imk2o/items/e4489b85dd8d832ea002)

## Share Extension

> TODO

## Document Provider

> TODO

## Audio Unit Extension

> TODO

## Content Blocker Extension

> TODO

## Shared Links Extension

> TODO

## Spotlight Index Extension

> TODO

## Custom Keyboard

> TODO
AWS:RDS(MySQL)作成＋接続確認メモ

１．インスタンス作成
AWSログイン後
サービス＝＞RDS
DBインスタンスの起動＝＞MySQL選択＝＞開発/テストのMySQL＝＞次のステップ
DBインスタンスのクラス: db.t2.micro
マルチAZ：いいえ
ストレージ割り当て：20G
dbインスタンス識別子：db1
マスタユーザ:root
パスワード: (８文字以上)
＝＞次

VPC：（既存選択）
パブリックアクセス：はい
VPCセキュリティグループ：既存選択
データベース名：db1
他はデフォルト
＝＞DBインスタンスの作成

２．セキュリティグループ設定
上記で選択したセキュリティグループの画面でインバウンドとアウトバウンドで3306を通す。

３．接続
EC2(RDSと同じVPC)から接続を試す。

```bash:
$ sudo yum install mysql
$ mysql --host=<エンドポイント> -port=3306 -u root -p
（パスワードを入力してプロンプトができてたらOK)
```

RDSは料金がかかるので不要な時は削除（スナップショット取得必須）しておく。
（スナップショットからもどしたときエンドポイントは変わらないので
クライアントから同じ設定で接続可能）
ドラックで並び変えられるListView「DragSortListView」

ドラックで並び変えられるListViewに「DragSortListView」というライブラリがあるらしい。
下記のURLを参照し作成してみる。

http://kittoworks.hateblo.jp/entry/2015/09/27/143308

**2016.06.04追記**
コメントして頂いた「RecyclerView」で
並び変えをさがしたところ、実装方法を発見。

http://yuki312.blogspot.jp/2015/06/recyclerview-itemtouchhelper.html

これで実装できました。
ただ、app\build.gradle　に　
```compile 'com.android.support:recyclerview-v7:22.2.0' ```
を記述するとあったが、
```compile 'com.android.support:appcompat-v7:23.1.1'```
があれば不要のようです。
（というか、エラーになります。）


```build.gradle
apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion '23.0.2'
    defaultConfig {
        applicationId "jp.co.redzero.app.and.recyclerviewitemtouchhelpersample"
        minSdkVersion 18
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    productFlavors {
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile 'com.android.support:design:23.1.1'
}
```
uIPの実装 メモリ管理を読む

uIPの実装 メモリ管理を読む

uIPはlwIPの作者 Adam Dunkels が開発したTCP/IPプロトコルスタックです。lwUPよりも小さい環境で動作します。


# ソース
* https://github.com/adamdunkels/uip
 * https://github.com/adamdunkels/uip/blob/master/lib/memb.c
 * https://github.com/adamdunkels/uip/blob/master/lib/memb.h
 * https://github.com/adamdunkels/uip/blob/master/uip/uip.c
 * https://github.com/adamdunkels/uip/blob/master/uip/uipopt.h

# uIPのメモリ管理
* アプリ側で管理するメモリはメモリプールで管理。
* 受信パケットは1個のバッファを使いまわす。

# メモリプール

## メモリプールの宣言

* MEMBマクロで宣言する
* linemem はメモリプール制御用の構造体
* struct telnetd_line はメモリプールのブロックサイズ
* TELNETD_CONF_NUMLINESはメモリブロックの個数

```
MEMB(linemem, struct telnetd_line, TELNETD_CONF_NUMLINES);
```

## メモリプールの初期化

* m->count は各メモリブロックのリファレンスカウント 0なら未使用 1なら仕様中う
* m->memはメモリプールのポインタ
```c:memb.c
void
memb_init(struct memb_blocks *m)
{
  memset(m->count, 0, m->num);
  memset(m->mem, 0, m->size * m->num);
}
```

## メモリプールからブロックの取得
```c:memb.c
memb_alloc(struct memb_blocks *m)
{
  int i;

  for(i = 0; i < m->num; ++i) {
    if(m->count[i] == 0) {
      /* If this block was unused, we increase the reference count to
	 indicate that it now is used and return a pointer to the
	 memory block. */
      ++(m->count[i]);
      return (void *)((char *)m->mem + (i * m->size));
    }
  }

  /* No free block was found, so we return NULL to indicate failure to
     allocate block. */
  return NULL;
}
```

## メモリブロックの解放
```c:memb.c
char
memb_free(struct memb_blocks *m, void *ptr)
{
  int i;
  char *ptr2;

  /* Walk through the list of blocks and try to find the block to
     which the pointer "ptr" points to. */
  ptr2 = (char *)m->mem;
  for(i = 0; i < m->num; ++i) {
    
    if(ptr2 == (char *)ptr) {
      /* We've found to block to which "ptr" points so we decrease the
	 reference count and return the new value of it. */
      if(m->count[i] > 0) {
	/* Make sure that we don't deallocate free memory. */
	--(m->count[i]);
      }
      return m->count[i];
    }
    ptr2 += m->size;
  }
  return -1;
}
```
# 受信パケットバッファ
* 1個分の静的なパケットバッファを使いまわす。 デフォルトのサイズは400+2バイト

```c:uipopt.h
/**
 * The size of the uIP packet buffer.
 *
 * The uIP packet buffer should not be smaller than 60 bytes, and does
 * not need to be larger than 1500 bytes. Lower size results in lower
 * TCP throughput, larger size results in higher TCP throughput.
 *
 * \hideinitializer
 */
#ifndef UIP_CONF_BUFFER_SIZE
#define UIP_BUFSIZE     400
#else /* UIP_CONF_BUFFER_SIZE */
#define UIP_BUFSIZE UIP_CONF_BUFFER_SIZE
#endif /* UIP_CONF_BUFFER_SIZE */
```

```c:uip.c
u8_t uip_buf[UIP_BUFSIZE + 2];   /* The packet buffer that contains
				    incoming packets. */
```


* uip.c でのパケットバッファアクセス用のマクロ

```c:uip.c
/* Macros. */
#define BUF ((struct uip_tcpip_hdr *)&uip_buf[UIP_LLH_LEN])
#define ICMPBUF ((struct uip_icmpip_hdr *)&uip_buf[UIP_LLH_LEN])
#define UDPBUF ((struct uip_udpip_hdr *)&uip_buf[UIP_LLH_LEN])
```
Google I/O 2016 Firebase Notification


ただのメモです。走り書きなので内容は保証しません

##Notificationを送るときに重要なこと

- どのタイミングでユーザはNotificationをほしいのか
- どのユーザにNotificationを送るべきか
- どんなNotificationをユーザに送るべきか

を考えること。

##Firebase Notification
Firebaseの製品群でNotificationのAnalyticsを提供し、正しいユーザに正しいコンテキストでNotificationを送ることをサポートする。
Firebase NotificationはGCMを使いやすいようにラップするもの。
ユーザのターゲットをデバイス、言語、属性で選択し、メッセージを作って、その場で送る、もしくはユーザのタイムゾーンに合わせて配信予約を刷ることが可能。
Android, iOS, Chrome通知にNotification送信が可能。

- Simple
- Contextual
- Measurable

がキーワード。
https://firebase.google.com/docs/cloud-messaging/#key_functions

##出典
https://www.youtube.com/watch?v=KpTSpVh9SfY
プロトタイプオブジェクトを理解する


## 概要
オライリー シングルWebアプリケーションでJavaScriptオブジェクト、
プロトタイプに関してのデザインパターンのメモ。

##クラスベースの例え
建築士は家の設計図を作成し、その設計図に基づいて
家を建築する

## プロトタイプベースの例え
建築士は家を建築してから、その家のような家を建築する

## プロトタイプベース

```proto.js
// 骨組み
var proto = {
  sentence : 4,
  probation : 2
};

// ここでプロトタイプをつくる
var Prisoner = function(name, id) {
  this.name = name;
  this.id = id;
};
//　宣言
Prisoner.prototype = proto;

// ---

// 上記をもとに生成されていく
var firstPrisoner = new Prisoner('joe', '12A');
var secondPrisoner = new Prisoner('maroru', '2B');
```

## Object.createを使う



```object.js
var proto = {
  sentence : 4,
  probation : 2
};

var firstPrisoner = Object.create(proto);
firstPrisoner.name = 'joe';
firstPrisoner.id = '12A';

var secondPrisoner = Object.create(proto);
secondPrisoner.name = 'same';
secondPrisoner.id = '2BC';

```

## ファクトリ関数を使う

```object02.js
var proto = {
  sentence: 4,
  probation: 2
};

// ファクトリ関数にはmake<Object_name>と名付ける
var makePrisoner = function(name, id) {
  var prisoner = Object.create(proto);
  prisoner.name = name;
  prisoner.id = id;
  return prisoner;
};

var firstPrisoner = makePrisoner('joe', '12A');
var secondPrisoner = makePrisoner('sam', '2BC');


```

## まとめ
基本的にはファクトリ関数を使うことがベストプラクティスらしいです。
標準出力を黙らせるデコレーター


logging使うまでもないけどちょっとデバッグコメント黙らせたい時などに一時的にstdoutをdevnullするデコレーター

```py3:debug.py
def mute(func):
    def _f(*args, **kwargs):
        sys.stdout = open(os.devnull, 'w')
        res = func(*args, **kwargs)
        sys.stdout.close()
        sys.stdout = sys.__stdout__
        return res
    return _f
```

参考: デコレータで楽にcProfileする
http://qiita.com/mojaie/items/e14c3db9f8fdec896f8a
vagrantを用いてゲストOSで起動したmysqlにホストOSから接続する


ゲストOSはCentOS6.5を用いています。

## ホスト側の設定
### Vagrantfileの設定
Vagrantfileに以下の設定を追加してください。（ゲスト側のmysqlポートが3306の場合）
host側のポートは3306以外でも問題ないと思います。

```ruby:Vagrantfile
config.vm.network :forwarded_port,  guest:3306, host:3306
```

## ゲスト側の設定
まずは、mysqlを起動

```shell-session:mysqld起動
service mysqld start
```
もし、mysqldの自動起動の設定をしていない人は以下のコマンドで自動起動されます。

```shell-session:自動起動設定
chkconfig mysqld on
```

続いて、mysqlに接続しますが、ひとまずrootで接続します。

```shell-session:mysql接続
mysql -u root
```
ユーザ一覧を確認する。

```sql:外部接続できるユーザ作成
SELECT user, host FROM mysql.user;
```
初期状態では以下のようなユーザとホストが表示されます。

![mysqlユーザ作成s.png](https://qiita-image-store.s3.amazonaws.com/0/58256/817e5f64-4266-28fa-9415-b899e3ef2b43.png)

外部接続できるユーザを作成する。
今回はどこからでも接続可能な`%`を用いますが、IPを制限したい場合は`%`を適宜IPアドレスに変更してください。
とりあえずパスワードは無しで設定します。

```sql:外部接続できるユーザ作成
CREATE USER 'root'@'%';
GRANT ALL PRIVILEGES ON *.* TO  'root'@'%' WITH GRANT OPTION;
```

## ホスト側からの接続
自分はHeidiSQLというフリーソフトを用いて接続していますが、以下の設定で接続できました。
他のソフトでも同様の設定になるかと思われます。
![HeidiSQL.png](https://qiita-image-store.s3.amazonaws.com/0/58256/c8b16bbc-3784-da1d-3976-7adccc9d3e10.png)

以上です。
これで、ホスト側から接続可能になります。
Watson IoT Platform - Bluemix 小ワザ集

初めてWatson IoT Platformを使ってみよう、というかたのためのガイドです。
[Watson IoT Platformを使ってみる](http://qiita.com/egplnt/items/af867711a7191923b2ff)でIoTアプリを準備しました。
Watson IoT PlatformでBluemixを使うときの小ワザを集めてみました。
特に、従来の「クラシック」表示から、新しいBluemix画面で使用する際の相応する操作などをピックアップしました。

#クラシック表示への切り替え
- 新しいBluemix画面上部の「クラシック・エクスペリエンスへ進む」を押します。

#新しいBluemix画面への切り替え
- クラシック画面上部の「Try to new Bluemix」を押します。

#作成したアプリの表示
- 初期画面の「すべてのカテゴリー」を選択します。（クラシック表示での「ダッシュボード」に相当）

#サービス一覧の表示
- 画面右上の六角形の「＋」を押します。（クラシック表示の「カタログ」に相当）

#IoTアプリ画面からNode-RED画面へ
- 画面右上の「アプリの表示」を押します。（クラシック画面ではURLをクリック）

#IoTアプリ画面でのサービスの接続
- IoTアプリ画面で「接続」メニューを選択します。画面に使用しているサービス（例：Cloudantなど）が表示されます。
- 新たにサービスを接続する場合には、画面右側の「既存に接続」もしくは「新規に接続」を選択します。
Google I/O 2016 Google Play新機能


ただのメモです。走り書きなので内容は保証しません

##Firebase Test Lab for Android

Googleのデータセンターに用意された様々な種類のAndroid端末を操作してテストすることができる。
https://developers.google.com/cloud-test-lab/

##Contextual Search

ユーザのコンテキスト（検索履歴、現在位置など）を判断して、ユーザにアプリをレコメンドする。例えば、Google I/Oに参加しているユーザには、Google Play Awardを取ったアプリを見せる、など。

##Review

レビューに返信、デバイスのメタデータ、などを見れるようになっている。また、レビューのハイライトを参照することも可能。これは英語のみの対応。
###Topic
レビューに頻繁に出てきているワードとレビュー傾向の一覧が見られる。また、この言葉がどのようにレビューに影響しているかわかる。

###Benchmark
Topicを元に他の似たアプリがどのようなレーティングになっているかを見ることができる。

###Review API
レビューを取れるAPI。Zendeskなどと連携
https://developers.google.com/android-publisher/reply-to-reviews#retrieving_a_set_of_reviews

##Google Play for next billion
Emerging Marketのユーザ数が2018年には1.2billionになる見込み。
例えば、2020年には300millionのスマホユーザが3Gで繋がると予測。WiFiも通信が満足にできない。

###Emerging Marketへのアプリの作り方
2020年において、1billion userはまだ2Gのネットワークにいる。よってアプリは、ユーザがどのような回線を使っていても動くようになっているべきである。
インド、アルゼンチン、ブラジルでは、平均して4Mbpsよりも遅いネットワークにつながっている。遅いネットワークにつながっていてもUXが落ちないように最適化する必要がある。
プリペイドの回線を使っている場合、イギリスと比べて、ブラジル、ナイジェリアでは10倍の回線費用がかかる。ユーザにデータコストをかけないようにするべき。

###Building for billions framework
- Connectivity
テキストを優先的にダウンロードするようにしたり、オフラインでも使用できるようにしたり、キャッシュを使えるところはキャッシュしたり、画像読み込みにライブラリを使用したりするべき。

- Device Capability
dpを使う。ldpi/mdpiサイズのスクリーンでアプリをテストする。デバイスのRAMに応じて使うメモリを抑える。長い時間処理するプロセスを作らないようにする。

- Data cost
APKサイズのダイエット。SVGやWebPを使って画像を縮小、Proguardなどを使ってコードの容量を小さくする。Multi-APKを使う検討をする。

ここらへんをもっと詳細に知りたい人はこちらへ
https://www.youtube.com/watch?v=vaEV8bNi1Dw

##Play Console App
Google Playのアプリ。ようやくリリース！一日で約10Kユーザがダウンロード！
レビューを見たり、返信したり、いろいろな指標が見れたり、クラッシュレポートが見れたり。
https://play.google.com/store/apps/details?id=com.google.android.apps.playconsole

##Android Instant App
URLをクリックすると、アプリを持っていなくてもInstantにアプリが起動する。Jelly Bean以上で使用可能。来年にリリース予定。

###どうやってつくるか
- Deeplinking
- Modularize
- Handle restrictions
- Integrate new features

###どんなことができるのか
多少の機能は制限されているが、加速度センサーなどは使用できる。
また、ユーザが明示的にアプリを選択しないので、ユーザの操作コンテキストを阻害しない。例えばチケット購入リンクを送信されてきた時、それをタップすると、インストールされていないアプリが立ち上がり、購入画面までいき(Deep Linkによって）、購入に必要な情報は自動的に入力されている、という状態。デモではAndroid Payとの連携で購入情報も自動的に入力されていて、"Pay"のボタンを押すだけで購入できるようになっていた。

https://developer.android.com/topic/instant-apps/index.html



#出典
https://www.youtube.com/watch?v=eGGwReIE61w
Watson IoT Platform - Node-RED 小ワザ集

Node-REDを使うときの小ワザを集めてみました。

#ノードを整列させる
- Node-RED画面右上の横棒三本線を開き「View」メニューの「Snap to Grid」をチェックするとノードをグリッドに合わせて配置することができるようになります。ちなみに「Show Grid」でグリッド（方眼紙）が表示されます。

![スクリーンショット 2016-05-21 18.25.11.png](https://qiita-image-store.s3.amazonaws.com/0/125842/5cb2bbf5-424b-386b-1687-81aa8afc6aaf.png)

#フロー（タブ）を削除する
- タブをダブルクリックして「Delete」ボタンを押します。

#Debugタブの出力をクリアする
- Debugタブの右上のゴミ箱アイコンをクリックするとDebug出力がクリアされます。
オブジェクト指向とは何か？


オブジェクト指向とは認識の限界である。

人は物を認識するとき、どのように捉えているのであろうか？たとえば、今、あなたの目の前に一つのペンがあるとしよう。あなたは「それ」を『ペン』と認識している。でも、よく見て欲しい、それはただのプラスチックの細長い棒だ。あなたはそれでも「それ」を『ペン』と認識している。

そこで一枚の紙を持ってきて、あなたに名前を書いて欲しいと頼んだとしよう。あなたは「それ」を手にとって、紙に名前を書くだろう。待ってくれ、なぜあなたは「それ」を使って紙に文字を書けることを知っているのか？ただのプラスチックの細長い棒じゃないのか？いやいや、もしかしたらペン型ライターやペン型カメラではないのか？もし、文字が書けなかったら、そういった疑問も持つかも知れないけど、あなたはやっぱり、「それ」を『ペン』だと認識しているから、「それ」を手に取ったのだ。そして、あなたは『ペン』が文字を書くことができる道具であることを知っている。だから、『ペン』である「それ」を使って文字を書こうとしたのだ。もし、あなたが「それ」を『ペン』だと認識してなかったらどうだろう？きっと文字を書く道具を持ってきてくれるよう、依頼者に頼んだであろう。

つまりだ。人は物を捉えるとき、その物が「何であるか」を含めて認識する。そうでなければ、目の前にペンがあっても、そのペンを使って、文字を書こうとすることすらできない。人は物をあるがままを見る事など不可能であり、必ず「これは○○である」というフィルター(色眼鏡)を通してしか、認識することはできないのだ。

さて、ここにStringの変数aがある。あなたは「変数a」は『String』であると認識している。そして『String』が文字列であり、いくつかのメソッドがあると知っている。そう、これは先ほどのペンと同じだ。オブジェクト指向とは物の認識の仕方をプログラミングに当てはめた手法なのだ。物事をカテゴライズするようにクラスを割り当て、カテゴライズに親子関係があるように継承を考え、そのものの性質や能力としてプロパティやメソッドを与える。こうして、人として自然の考えでプログラミングをすることを可能にするのがオブジェクト指向という手法なのである。

---

上の文章は、とあるQ&Aサイトでオブジェクト指向とは何か？問われて回答した時の文章を一部修正したものです。
AvisynthでアニメのOPED差分を抽出する

アニメに限定したのは、解像度が1920x1080でベタ打ちしてるから。
最終的に`Overlay(v1,v2,mode="difference")`で差分を出してるだけ

インタレの解除は限定的 というか、いわゆる24fps化はしてない。
アニメは違う話数でも映像が同じなら完璧に差分が消えるけど、24fps化とかのフィルタを試すと同じ映像ですら差分が出てしまったから。
この辺全然詳しくないからそこは各自改良して。

```text
#ファイル読み込み
offset=61 # 値を小さくすると、左が戻る＝右が進む
a="c:\a.ts"
b="c:\b.ts"

v1=DirectShowSource (a)
v2=DirectShowSource (b)

v1BlankLength = (0<offset) ? offset *  1 : 0
v2BlankLength = (offset<0) ? offset * -1 : 0

v1=AssumeTFF(v1)
v2=AssumeTFF(v2)

v1=AlignedSplice(BlankClip(v1,length=Int(v1BlankLength)),v1)
v2=AlignedSplice(BlankClip(v2,length=Int(v2BlankLength)),v2)

#ファイル読み込みここまで。v1とv2に入れる事

v1=Lanczos4Resize(v1,960,540)
v2=Lanczos4Resize(v2,960,540)
l1=StackHorizontal(v1,v2)

v3=BlankClip(v1,color=$303030)
v4=BlankClip(v1,color=$303030)
v3=Lanczos4Resize(v3,480,540)
v4=Lanczos4Resize(v4,480,540)
offset=Overlay(v1,v2,mode="difference").ColorYUV(off_y=-128) #差分を表示
offset=Lanczos4Resize(offset,960,540)

l2=StackHorizontal(v3,offset,v4)
v1=StackVertical(l1,l2)


return v1

```


おまけ。途中までaviutlの拡張編集で作っていたけど、カスタムオブジェクトだと映像の差分フィルタが使えない事に気がついたのでavisynthで作りなおした…

```text:拡張編集のlua.txt
◇合成モード
	obj.setoption("blend",value[,option])
	value	: 0=通常 / 1=加算 / 2=減算 / 3=乗算 / 4=スクリーン
		  5=オーバーレイ / 6=比較(明) / 7=比較(暗) / 8=輝度 / 9=色差
		  以下は仮想バッファ専用の合成モードです。
		  "alpha_add"=色情報は加重平均してアルファ値は加算します
		  "alpha_max"=色情報は加重平均してアルファ値は大きい方を採用します
		  "alpha_sub"=色情報は何もせずにアルファ値を減算します
		  "alpha_add2"=色情報は重ね合わせしてアルファ値は加算します
	option	: "force"=強制指定モード
	フレームバッファへの描画の合成モードは元々の合成モードが通常の場合のみ反映されます。
	元々が通常以外の場合で反映させるには"force"オプションを指定してください。
```

これの利点は、二つの動画のオフセット調整がGUIのスライダーで出来る事。こっちで作りたかったぞー

```text:OPED比較.obj
@OPED比較-A
--track0:offset,-100.0,100.0,0,0.01

function test(path,ox,oy,offset)
	obj.load("movie",path,obj.time+offset)
	local height = obj.h
	local width  = height / 9.0 * 16.0
	obj.effect("リサイズ","X",width,"Y",height,"ドット数でサイズ指定",1)
	obj.zoom = 0.5
	obj.draw(ox,oy)
end


a="C:\a.ts"
b="C:\a.ts"
if( 0 < obj.track0 ) then
	aOffset = obj.track0
	bOffset = 0.0
else
	aOffset = 0.0
	bOffset = obj.track0 * -1
end

test(a,-480,-270,aOffset)
test(b, 480,-270,bOffset)

test(a, 0,270,aOffset)
test(b, 0,270,bOffset)
```
dropwatchを使ってみた。

# UDPの処理をするサーバのトラブルシューティング

`iptables`のTPROXY機能を使って透過的なパケット処理を行うサーバを開発しているのだが、ある種のトラッフィクに関しては安定的にパケット・ロストが発生する事象が確認された。なお、サーバの環境はLinux(RHEL 7.0)。

`netstat -su`の出力を見たところ、UDPの`packet receive errors`の増加分が失われたパケットの量に一致していることが判明した。

そこで、`dropwatch`を用いた原因究明を試みることに。

# 早速やってみる

手順は以下の通り。

| ステップ | ターミナル | 実行するコマンド                                  |
|:--------|:---------|:-----------------------------------------------|
| 1       | server 1 | `# netstat -su|grep packet`                    |
| 2       | server 2 | `# dropwatch -l kas`                           |
| 3       | server 2 | `dropwatch> start`                             |
| 4       | client   | `# nc -u <dest address> <dest port> < 2MB.txt` |
| 5       | server 2 | `ctrl-C`                                       |
| 6       | server 2 | `dropwatch> exit`                              |
| 7       | server 1 | `# netstat -su|grep packet`                    |

# 結果

```shell-session:server_session_1
# netstat -su|grep packet
    120177184 packets received
    2008 packets to unknown port received.
    132324413 packet receive errors
    113599497 packets sent

# netstat -su|grep packet
    120177272 packets received              # +88
    2008 packets to unknown port received.
    132324587 packet receive errors         # +174
    113599585 packets sent                  # +88
```

```shell-session:server_session_2
# dropwatch -l kas
Initalizing kallsyms db
dropwatch> start
Enabling monitoring...
Kernel monitoring activated.
Issue Ctrl-C to stop monitoring
2 drops at net_tx_action+0 (0xffffffff814cebe0)
1 drops at ip_rcv_finish+16c (0xffffffff815092ec)
1 drops at tcp_v4_rcv+77 (0xffffffff8152efd7)
1 drops at tcp_rcv_state_process+1b0 (0xffffffff81523c10)
1 drops at sk_stream_kill_queues+50 (0xffffffff814c6e60)
474 drops at net_tx_action+0 (0xffffffff814cebe0)
3 drops at ip_rcv_finish+16c (0xffffffff815092ec)
1 drops at __udp4_lib_mcast_deliver+290 (0xffffffff815391f0)
1 drops at icmp_rcv+11c (0xffffffff8153d60c)
25 drops at inet_frag_destroy+76 (0xffffffff8154f986)
174 drops at udp_queue_rcv_skb+218 (0xffffffff81538c78)
1 drops at tcp_v4_rcv+77 (0xffffffff8152efd7)
6 drops at net_tx_action+0 (0xffffffff814cebe0)
^CGot a stop message
dropwatch> exit
Shutting down ...
#
```

# 考察

ぱっと見でわかることとして、`netstat`における`packet receive errors`の増加分と、`dropwatch`の次の1行がぴったり対応している。
`174 drops at udp_queue_rcv_skb+218 (0xffffffff81538c78)`

しかし、それに先立つ
`474 drops at net_tx_action+0 (0xffffffff814cebe0)`
も気になる。

何度か実験してみたが、`udp_queue_rcv_skb`でのdropに先立って必ず`net_tx_action`でのdropがレポートされる。

調査はまだまだ続くが、dropwatchを使ってみたことに関しての記事は以上。

# 参考記事

http://qiita.com/STomohiko/items/ba713543fb02ea2ea5d4
Zybo > Chronicles blog 19 > TTC > Interrupt設定例 > XTtcPs_EnableInterrupts() / XTTCPS_IXR_INTERVAL_MASK / xttcps_hw.h / ISRの例

MicroZed Chronicles リスト http://adiuvoengineering.com/?page_id=285
@ Adam Taylor blog
https://forums.xilinx.com/t5/Xcell-Daily-Blog/Introduction-to-the-Zynq-Triple-Timer-Counter-Part-Three-Adam/ba-p/413105


> There are several interrupts to choose from for each TTC. I have enabled only the interval interrupt in this instance:


```
XTtcPs_EnableInterrupts(TtcPsInt, XTTCPS_IXR_INTERVAL_MASK);
```

> The file xttcps_hw.h, which is called up by xttcps.h, includes definitions for all possible TTC interrupts allowing them to be enabled as desired using the above function. 

ソースコードでISRを設定しているのは以下の通り

```c
XScuGic_Connect(GicInstancePtr, TTC_INTR_ID,
	(Xil_ExceptionHandler)TickHandler, (void *)TtcPsInt);
```

上記でコネクトしているTickHandlerは以下のような実装をしている

```c
static void TickHandler(void *CallBackRef)
{
	u32 StatusEvent;

	StatusEvent = XTtcPs_GetInterruptStatus((XTtcPs *)CallBackRef);
	XTtcPs_ClearInterruptStatus((XTtcPs *)CallBackRef, StatusEvent);

	printf("event\n\r");
}
```
Zybo > Chronicles blog 19 > TTC > typedef struct TmrCntrSetup > Options使用例 > XTTCPS_OPTION_INTERVAL_MODE / XTTCPS_OPTION_WAVE_DISABLE / XTtcPs_SetOptions() / XTtcPs_CalcIntervalFromFreq() / XTtcPs_SetInterval() / XTtcPs_SetPrescaler()

MicroZed Chronicles リスト http://adiuvoengineering.com/?page_id=285
@ Adam Taylor blog
https://forums.xilinx.com/t5/Xcell-Daily-Blog/Introduction-to-the-Zynq-Triple-Timer-Counter-Part-Three-Adam/ba-p/413105


```
typedef struct {
      u32 OutputHz;     /* Output frequency */
      u16 Interval;     /* Interval value */
      u8 Prescaler;     /* Prescaler value */
      u16 Options;      /* Option settings */
} TmrCntrSetup;
```

にて定義したOptionsの設定例。

```
TimerSetup->Options |= (XTTCPS_OPTION_INTERVAL_MODE |
                                          XTTCPS_OPTION_WAVE_DISABLE);
 
XTtcPs_SetOptions(&Timer, TimerSetup->Options);
 
XTtcPs_CalcIntervalFromFreq(&Timer, TimerSetup->OutputHz,&(TimerSetup->Interval), &(TimerSetup->Prescaler));
 
XTtcPs_SetInterval(&Timer, TimerSetup->Interval);
XTtcPs_SetPrescaler(&Timer, TimerSetup->Prescaler);
```
Zybo > Chronicles blog 19 > TTC > xttcps.h / typedef struct TmrCntrSetup 

MicroZed Chronicles リスト http://adiuvoengineering.com/?page_id=285
@ Adam Taylor blog
https://forums.xilinx.com/t5/Xcell-Daily-Blog/Introduction-to-the-Zynq-Triple-Timer-Counter-Part-Three-Adam/ba-p/413105


ヘッダーとしては以下を使う。

`#include "xttcps.h"`

...

> we need to declare a data structure to contain the output frequency, interval, pre-scaler, and TTC options.

```
typedef struct {
      u32 OutputHz;     /* Output frequency */
      u16 Interval;     /* Interval value */
      u8 Prescaler;     /* Prescaler value */
      u16 Options;      /* Option settings */
} TmrCntrSetup;
```

初期値の例

```
static TmrCntrSetup SettingsTable[1] = {
      {10, 0, 0, 0},    /* Ticker timer counter initial setup, only output freq */
};
```
技術英語 > samples of seawater will be filtered and [concentrated]. 

@ LOE > May 2, 2003
http://loe.org/shows/shows.html?programID=03-P13-00018
> For example, samples of seawater will be filtered and <font color=red>concentrated</font>.

<hr>
accumulationとの違いが気になる。

検索したが、これといった情報が見つからなかった。

<hr>
stackexchangeで質問していたらいくつか回答がついた。

http://english.stackexchange.com/questions/326786/concentrate-and-accumulate?noredirect=1#comment744405_326786

> Rain water might "accumulate" in a bucket while it's raining. Only when the sun comes out and causes the water to evaporate is it "concentrated"

...

> concentrate: "to make (something, such as a liquid) stronger by removing water". Merriam-Webster 

...

> Actually they are not the same: accumulation refers to the simple process of gathering but concentrate refers to the result of having a purer liquid.
 
辞書をきちんと調べてから質問すべきだった。
ComposerのtransportOptionsについて

composerには`http://`ストリームラッパの[コンテキストオプション](http://jp2.php.net/manual/ja/context.http.php)を指定できる機能があるように見える。
マニュアル化されておらず、ソースを追っていくしかなくて分かりにくい。

必要なもの(follow_locationとかmax_redirectsとか)はcomposer側で勝手に付与してくれるので、普通は使う必要はない。
ヘッダーを追加したり、tlsのオプションを変更できるとすれば面白いかもしれない。

- http://jp2.php.net/manual/ja/context.http.php
- http://jp2.php.net/manual/ja/context.ssl.php


## packageのtransport-options

パッケージ自体に対しては、`transport-options`という属性名で指定できるっぽい。

```js
{
  "name": "vendor/package",
  // ...
  "transport-options": {
    "https": {
      "method": "POST",
      "user_agent": "Mozilla/5.0"
    }
  }
}
```

## repositoryのoptions

リポジトリに対しては、`options`という属性名で指定できる。ただし、optionsがtransportOptionsの意味になるのは`type: composer`の場合だけだ。`type: path`みたいに通信を必要としないrepositoryタイプもあるからね。

なお、このオプションはリポジトリ配下のパッケージダウンロード時に全て引き継がれる。パッケージ個別にtransport-optionsを指定していないかぎり、優先して使われるらしい。

例えばpackagist.jpに関して自己署名を許可してしかもpeerのチェックをしない、というデンジャラスな設定はこう書く。

```js
{
  "repositories": {
    "packagist": {
      "type": "composer",
      "url": "https://packagist.jp",
      "options": {
        "ssl": {
          "allow_self_signed": true,
          "verify_peer": false
        }
      }
    }
  }
}
```