OmniAICreator/Qiita-1.07M huggingface dataset:
【バッチの仕組み】

こんにちは。志御です。

バッチを作る時に結構困るのが、パフォーマンスです。
パフォーマンスを上げるために、アルゴリズム的な最適かや、SQLなどの最適化を行うのは勿論なのですが、他に多重化なども考えると思います。
扱うデータの種類や、データの構造などやモジュール化によって、多重化の可否が変わるのですが、そういったことが問題ない前提で、多重化を考慮するなら、どのような作りにするでしょうか。
もう少し突っ込んでいうと、例えばサーバーをスケールアップした場合に、何も手を加えずとも、自動的に多重化されていったら、楽では無いでしょうか。

通常は、多重化するとなると、特定のキーで対象のデータを抽出し処理するようにして、キーのパターン毎にバッチが起動する、そんな作りにするのではないでしょうか。

例えば、都道府県ごとに家族構成を集計し、次に全国の家族構成を集計するような、バッチ処理を考えたとします。
前提として、家族がどの都道府県に住んでいるか判断ができるデータベースになっているとします。
単純に、都道府県別にgroup byして、処理するような事を考えると、日本の人口は１億数千万人いますから、その分のレコードを処理することになります。

多分、都道府県（コードとか識別できるキー）に基づいて処理するバッチを作り、そのバッチを（実行できるなら）４７プロセス同時に起動するようにジョブを組むのではないでしょうか。
しかし、CPUのコア数や、メモリ、I/O性能、ネットワークなどの要因で、簡単には、多重化できないと思います。

更に、そのバッチの集計結果を何処かに保管して、全国で集計するバッチを実行するような気がします。
このような場合に、CPUコア数や、メモリ、I/O性能、ネットワーク性能によって、リニアに多重度を調整して、実行できるバッチが作れたら、結構楽ではないでしょうか。

以前、筆者が関わったプロジェクトで、（家族構成ではないですが）バッチで都道府県別に処理しなければならない要件があった際に、結構、インフラ性能に振り回されて、苦労した事がありました。
当時は、物理サーバーだったのですが、今ではクラウド・サーバーもあり、処理要件に従って、簡単にスケールアップ／スケールダウンが可能になっています。
クラウド・サーバーでスケールアップ／スケールダウンする際に、一々、多重度を再設計するのも、時間の無駄な気がします。

■思い付き

思いついたのは、
・バッチの処理をタスクのような形で管理して、キューに溜めておきます。
・タスクを処理するためのエンジンが、キューを監視するようにします。
・インフラのパワー具合（CPUコア数や空きメモリ、I/Oの余力、ネットワーク・トラフィックなど）を判断して、タスク実行エンジンが、キューに溜まっているタスクを処理します。
・タスク同士は、依存関係を持っているようにして、依存される側のタスクが終わるまで、依存する側のタスクは実行されないなど、タスク実行エンジンが制御します。
・依存関係がなければ、そのタスクは同時並行的に実行されても、当然、影響はありません。
　つまり、このタスクは多重化できます。
・タスク実行エンジンは、全てのタスクが完了するまで、ひたすら、タスクを実行し続けます。
・欲を言えば、タスク実行エンジンがサーバー間で繋がっていて、自動的に分散処理できると良いかな...。
と、このような仕組みがあれば、インフラ性能に従って、自動的に多重化されるのではないでしょうか。

これを思いついたのは、ant（Java製のビルドツール）を見た時です。
あと、WinyのようなP2Pシステムと、サーバー監視ツール。
既にある技術ばかりなので、なんとかすればできるような気がします。

Webのサーバーサイドの処理でも、応用が効くのかなっとも思います。

皆さんいかがでしょう。
MacMiniにUbuntuをインストールする

MacMiniのHDDが手狭になって入れ替えたらはまったのでメモ。
#前提
MacMini(2011)
MacOSは使わない。Ubuntuのみ
ubuntu 15.10
ブートディスク用の外付けHDDも用意

こちらを参考にした
http://christina04.blog.fc2.com/blog-entry-162.html
#手順
MacMiniに入れる内蔵用HDDをまっさらにする。gpartedを利用
ubuntu15.10-desktop-amd64.isoをダウンロード。外付けHDDにLiveCDを作る。

内蔵用HDDをMacMiniに組み込む
外付けHDDをMacMiniに接続して起動する
(ALTキーを押しながら起動でブート選択ができる)
が、“i8042 no controller found”と出て起動せず

ブート選択でeを押してコマンドを変更する。
linuxで始まる行のsplashの次に`nomodeset`を追加する。
するとエラーが出ながらもエラーが出る。
インストールする。

インストール後の再起動でまたubuntu色の単色画面のままカーソルも出ない。
電源ボタンを押すとシャットダウン処理が走るので動いてるようだ。

起動時にESCを押してブート選択画面を出す。
同じようにeを押してコマンドに`nomodeset`を追加する。
しばらくubuntu色の単色画面のまま時間が掛かるがxが起動する。

terminalを開いて
sudo gedit /etc/default/grub
で
`GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"`
を
`GRUB_CMDLINE_LINUX_DEFAULT="nomodeset"`
に書き換えて保存する
quiet splashは残してもいいんだけど、起動メッセージが出たほうが安心。
sudo update-grub2
で反映させる。

再起動すると普通に起動する

むかしMacMiniでUbuntuを使うのにドライバとかいろいろ入れた気がするのだが
最新のUbuntuではMacMiniでも標準で問題なく動いている。
#まとめ
ブートオプションにnomodesetが必須。
ほかは特に何もしなくても動くようだ。
#補足
他のPCのWindows8.1が入ったHDDはそのままMacMiniで動いてしまう。
Windowsで消そうにも自分のHDDを消すことができない。ディスク管理ツールではリカバリ領域を消せなくて、システム領域を消しても勝手にリカバリされてしまう。（リカバリプロンプトでできるのかも。）
knife コマンド

# knife cookbook

## knife cookbook create cookbook名 -o ディレクトリパス
指定したディレクトリへ cookbook の雛形を作成する。

## knife cookbook test cookbook名
cookbookの文法をチェックする。

## knife cookbook upload -a -o ディレクトリパス
指定したディレクトリの配下に存在する全 cookbook をchef server へアップロードする。

## knife cookbook list
登録済み Cookbook を表示する。

# knife node

## knife node list
登録済み node を表示する。

## knife node show node名
nodeの情報を表示する。

## knife node create node名
node を作成する。

## knife node run_list add node名 'recipe[cookbook名]'
cookbook を node へ関連付ける。

## knife node run_list remove node名 cookbook名
cookbook の node への関連付けを解除する。

## EDITOR=vi knife node edit node名
node の attributes を編集する。

# knife role

## EDITOR=vi knife role create role名
role を作成する。

# cookbookの適用
```
sudo chef-client
```
Riot.js向けのSyntax Highlightをプラグインにしました (Atom用)

# Atom用のRiotjsのSyntax Highlightを作りました

[language-riot-tag](https://atom.io/packages/language-riot-tag)
JS/CSSのpreprocessorに対応したものがなかったので作りました。以下このプラグインの限界です。

- `<script></script>`タグは必須
- Jadeには非対応（リクエストがあれば頑張ります！たぶん！）
- タグ内の`{}`表記は放置
- `.tag`ファイルのみ自動適用対象。`.tag.html`とかも対象に追加して欲しいなどあればご連絡ください！

JS, CSSに加えて、CoffeeScript, Sass, Scss, Less, Stylusのハイライトが有効になるはずです。それぞれ、`<script type="coffee">`という感じで、type属性で指定してあげてください。

中途半端なプラグインですが、多少は快適になると思うので是非使ってみてください。PRや要望をいただければ望外です！

## AtomのSyntax Highlightについてのメモ

- grammarsフォルダの中に`xxxx.cson`ファイルを作れば自動で読み込まれる
- 形式はTextMate／Submileと同様。Atom側でドキュメントが用意されていないので、http://manual.macromates.com/en/language_grammars が頼り。csonに読み替えて書く。
- 公式のlanguage-htmlとかでも、`<script>`タグや`<style>`タグを拾うpatternのnameが`source.js.embedded.html`等になっているが、そうすると`<script>`タグ自体もsourceだと判断されてコメントアウトの挙動がおかしくなる気がする。nameではなくてcontentNameを使うと正しい挙動に近づくが、正解がわからない。
- パクリ元の正規表現がいくつか理解できない。
  - `(?i:style)`の`?i:`
  - `(?<=</(script|SCRIPT))`の`?<=`
  - 何度も出てくるのでミスではない気がする。詳しい方がいらっしゃったら教えて下さい！
Apple MusicのAndroid版で使われているライブラリ

ベータ版ではありますが、Apple MusicのAndroid版がリリースされましたね。
https://play.google.com/store/apps/details?id=com.apple.android.music

そこで、Appleの人は、どんなライブラリを使ってAndroidアプリを開発するのだろうと気になったので、
簡単ではありますが調べてみました。

（※）使用しているライブラリに関しては、
`ナビゲーションドロワー内の設定 > 謝辞`
に記載されているものを参照致しました。(Version: 0.9.0)
![2015-11-11 12.28.09.jpeg](https://qiita-image-store.s3.amazonaws.com/0/995/c032c020-4d18-08c7-88bb-e57f72de5dce.jpeg)




#JavaCPP
https://github.com/bytedeco/javacpp
いきなり初見なライブラリ。
ネイティブ（c++）へのアクセスが効率よくできるとか書いてあります。
ネイティブ連携がしやすくなったりするのかなぁ。

#EventBus
https://github.com/greenrobot/EventBus
定番の。

#jbox2d
https://github.com/jbox2d/jbox2d
これも初見。
物理エンジン的なやつのようです。どこで使ってるのやら。

#RxJava
https://github.com/ReactiveX/RxJava
これも最近定番ですね。

#SystemBarTint
https://github.com/jgilfelt/SystemBarTint
github見るとDEPRECATEDって書いてあるけど、ステータスバーとかの色を変更できるようになるみたい。

#Picasso
https://github.com/square/picasso
これも定番ですね。

#SlidingUpPanel
https://github.com/umano/AndroidSlidingUpPanel
下からぐいっと出てくるUI。たまに見るやつ。
Elixirの Enum の主な関数の使い方の覚え書き


`Enum`で`collection`を引数に取る主要な関数を下記に記載してみる。


### Collectionの指定した位置の値を返す
```
iex(1)> Enum.at([1,2,5,4],0)
1
iex(2)> Enum.at([1,2,5,4],1)
2
iex(3)> Enum.at([1,2,5,4],2)
5
iex(4)> Enum.at([1,2,5,4],3)
4
iex(5)> Enum.at([1,2,5,4],4)
nil

```

### Collectionの指定した位置の値を返す(タプルでステータスも返る)
```
iex(1)> Enum.at([1,2,5,4], 2)   
5
iex(2)> Enum.fetch([1,2,5,4], 2)
{:ok, 5}

iex(3)> Enum.at([1,2,5,4], 4)   
nil
iex(4)> Enum.fetch([1,2,5,4], 4)
:error
```

### Collectionの値をソートする
```
iex(1)> Enum.sort([1,2,5,4])
[1, 2, 4, 5]
```


### Collectionの数を返す
```
iex(1)> Enum.count([1,2,5,4])
4
```

### Collectionの最大値/最小値を返す
```
iex(1)> Enum.max([1,2,5,4])                          
5
iex(2)> Enum.min([1,2,5,4])
1
```

### Collectionにセパレータを付加する
```
iex(1)> Enum.join([1,2,5,4],"/")
"1/2/5/4"
iex(2)> Enum.join([1,2,5,4],"-")
"1-2-5-4"
```

### Collectionの先頭から指定した数の値を削除する
```
iex(1)> Enum.drop([1,2,5,4], 0)
[1, 2, 5, 4]
iex(2)> Enum.drop([1,2,5,4], 1)
[2, 5, 4]
iex(3)> Enum.drop([1,2,5,4], 3)
[4]
```

### Collectionの値をランダムに返す
```
iex(1)> Enum.shuffle([1,2,5,4])
[1, 5, 4, 2]
iex(2)> Enum.shuffle([1,2,5,4])
[4, 1, 2, 5]
iex(3)> Enum.shuffle([1,2,5,4])
[1, 2, 5, 4]
```

### Collectionが空かどうかを返す
```
iex(1)> Enum.empty?([]) 
true
iex(2)> Enum.empty?([1,2,5,4])
false
iex(3)> Enum.empty?([nil])
false
```

### Collectionの先頭に挿入する
```
iex(1)> Enum.into([1,2,5,4], [9,8,7])                
[9, 8, 7, 1, 2, 5, 4]
```
【Rails】ポリモーフィック関連の作り方と使い方



# 状況設定
user has_many messages.
admin has_many messages.


user / admin に対してポリモーフィック関連を作りたい。

# 手順1 : rails g model 

```
rails g model message messagable:references{polymorphic}  message:text
rake db:migrate
```

# 手順2 : modelにオプションを付加

 
## Userモデル


```ruby

class User < ActiveRecord::Base
  has_many :messages, :as => :messagable
end

```


## Adminモデル

```ruby

class Admin < ActiveRecord::Base
  has_many :messages, :as => :messagable
end

```

## Messageモデル

※ 既に以下のbelongs_toは出来ているので、書き加える必要なし。
```ruby

class Message < ActiveRecord::Base
  belongs_to :receivable, polymorphic: true
end



# 手順3 :  ポリモーフィック関連使い方


## Messageをcreateする時


```ruby

user = User.first
user.messages.create(message: "ユーザーです")

admin = Admin.first
admin.messages.create(message: "アドミンです")

```

結果↓ 

![スクリーンショット 2015-11-11 21.35.18.png](https://qiita-image-store.s3.amazonaws.com/0/71616/52aeb47c-1414-bbc4-707e-9a1887b229ce.png "スクリーンショット 2015-11-11 21.35.18.png")


## Messageを取得

普通に　user has_many messages. で行ける。
返ってくるのはActiveRecordRelations。

```ruby
user.messages 

```
![Kobito.0fH0Xc.png](https://qiita-image-store.s3.amazonaws.com/0/71616/b41701d7-7415-f713-f4d4-633dc2fb106d.png "Kobito.0fH0Xc.png")


```ruby 
admin.messages
```

![Kobito.KrLFFN.png](https://qiita-image-store.s3.amazonaws.com/0/71616/81bf5678-64c1-01d8-ac61-85b4313b7f81.png "Kobito.KrLFFN.png")





## Messagable(User or Admin)を取得

message belongs_to messagable. 少し特殊。
返ってくるのは、ActiveRecord。

```ruby

message = Message.first
message.messagable 

```

![Kobito.GTOqrM.png](https://qiita-image-store.s3.amazonaws.com/0/71616/bdd4d608-8ee1-b424-936d-62b7757d1644.png "Kobito.GTOqrM.png")





後は応用可能ですね!
chef 用語覚書

# Cookbooks
システムのあるべき形を定義する。

# Roles
サーバ(Client / Node)の役割を定義する。

# Recipes
サーバへ実際に適用する設定内容を定義する。

# Template
サーバへ配置する設定ファイルのテンプレート。

# Attributes
サーバの役割(Roles)の応じて適用する設定値を定義する。
Windows 7環境、PackerでVagrant Box作成

開発環境をごにょごにょしていて今更ながらVagrantを使うことにしたのですが、PackerでVagrant Boxを作成する手順について最近の事例があまり見つけられなかったので覚書として書いてみました。

#環境
Windows 7 Professional
Vagrant 1.7.4
Packer 0.8.6

#Packerのインストール

Downloads - Packer
http://www.packer.io/downloads.html

Windowsの64-bitをクリック（バージョンは0.8.6）
packer_0.8.6_windows_amd64.zip

ダウンロードした packer_0.8.6_windows_amd64.zip を適当なフォルダに解凍。
フォルダを環境変数 PATH に追加します。

Windows 7で、Administratorとして実行した場合の設定方法です。

1. コントロールパネル→システムとセキュリティ→システム→システムの詳細設定
2. 「環境変数」ボタンをクリック

ユーザー環境変数のところで「PATH」がある場合はその末尾に;とともに追加。
ない場合は新規で登録

    変数名　PATH
    変数値　C:\packer_0.8.6_windows_amd64

で登録

コマンドプロンプトからバージョンが確認できればインストールは完了。

    >packer --version
    0.8.6

#Packerのテンプレートを用意する

Packerのテンプレートは世の中に色々転がっていますので、
検索するなどしてテンプレートを取得します。


今回は、CentOS 5.11-x86_64 の環境を構築する必要があったので、
https://github.com/kaorimatz/packer-templates
からテンプレートをcloneさせていただきます。


Gitが入っていない場合は、Git for Windows(msysgit) をインストールしてください。
https://git-for-windows.github.io/
インストール中に聞かれる「Adjusting your PATH emvironment」は「Run Git from the Windows Command Prompt」を選ぶと環境変数PATHにGitを追加してくれます。


コマンドプロンプトで希望のディレクトリに移動しcloneします。
ここでは、C:に移動して、その直下にcloneしました。

    >cd C:\
    >git clone git://github.com/kaorimatz/packer-templates


#Box作成の準備

cloneしたファイルを少々変更。

配布されているテンプレートでは言語設定やキーボード設定などがUSなので以下のファイルを変更。

C:\packer-templates\http\centos-5.11\anaconda-ks.cfg

    lang ja_JP.UTF-8
    keyboard jp106
    timezone Asia/Tokyo

編集後、保存する際の改行コードに注意する必要があるかも。
当初CR+LFで保存していたら、Boxの作成に失敗する現象が発生。
LFで保存すると成功しました。

作成するBoxのメモリやディスク容量などは以下のファイルで変更します。

C:\packer-templates\centos-5.11-x86_64.json

変更する場所はそんなにないと思います。

#Boxを作成

ではBoxを作成します。

    >cd C:\packer-templates
    >packer build centos-5.11-x86_64.json

作成に要する時間は、当方の環境で20分ほどでした。
Proxy環境下でのGit for Windows設定


Android Studioを会社のWindowsで使いたかったので、入れてみたところ、Cygwinに適当に入れていたgitでは動作しなくて、調べてみました。
なんとなくGit for Windowsを入れたので、Cygwinのgitがどうして動かなかったかは調べていません。多分下記と同じ設定をすれば動くのでしょう。

OS : Windows 7
Git : Git-2.6.3-64-bit.exe

まずはProxyを設定する

```
git config --global http.proxy http://proxy.xxx.co.jp:8080
git config --global https.proxy http://proxy.xxx.co.jp:8080
git config --global url."https://".insteadOf git://
```

.gitconfigを編集しても同様。
.gitconfigはユーザディレクトリ配下にある


参考サイト
http://qiita.com/HibiU1/items/76ac6edb43cffd9da081

試しにbitbucket.orgに登録している自分のソースをgit cloneしてみると、下記のようなエラーが出た。
error setting certificate verify locations

Gir for Windowsインストール時にデフォルトで入るca-bundle.trust.crtを指定するため、.gitconfigに下記を追加

```
[http]
        sslcainfo = C:/Users/[UserName]/AppData/Local/Programs/Git/etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt
```

参考サイト
http://promamo.com/?p=1680
centos の古いバージョンをダウンロードする

#CentOSのダウンロードサイトはメジャーバージョンの最新版しかないのね
6系だと 6.7しかダウンロードできないみたい。
んで、古いバージョンが落とせるサイトのURLをメモ

http://vault.centos.org/
ここから探して
USA:
http://archive.kernel.org/centos-vault/ 
rsync://archive.kernel.org::centos-vault/


http://mirror.symnds.com/distributions/CentOS-vault/
rsync://mirror.symnds.com::CentOS-vault-full/

http://bay.uchicago.edu/centos-vault
rsync://bay.uchicago.edu/centos-vault
ftp://bay.uchicago.edu/centos-vault

Europe:
http://mirror.nsc.liu.se/centos-store/
rsync://mirror.nsc.liu.se::centos-store/

ここらあたりからダウンロード
RPi / python > udp > ブロッキング受信: 成功 > ノンブロッキング受信: 成功

```txt:動作確認
UDP受信側: RaspberryPi2 + raspbian
UDP送信側: MacOS X 10.8.5
```

RPi側のpythonでのUDP受信が成功したようだ。

敗因は、「CentOSでやれば楽」と思いファイアウォールをONのまま実行して失敗していた。
RPiは初期状態でファイアウォールによるクローズがないようで、以下の処理がすんなり実行できた。

## try1 (ブロッキング受信)

以下はRPi側のコード。

```151111d.py
import socket

UDP_IP = ""
UDP_PORT = 6000

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((UDP_IP, UDP_PORT))

while True:
	data, addr = sock.recvfrom(1024)
	print "rcvd:", data
```

RPi2側で以下を実行しておく。

```
pi@raspberrypi ~/lineMonitor $ python 151111d.py 

```

MacOSX側で以下を実行する。`-w 1`をつけることで、1秒後にターミナルに処理が戻ってくる。

```
$ echo "test" | nc -w 1 -u 192.168.10.5 6000
$ echo "test" | nc -w 1 -u 192.168.10.5 6000
$ echo "test" | nc -w 1 -u 192.168.10.5 6000
```

RPi2側の結果。

```
pi@raspberrypi ~/lineMonitor $ python 151111d.py 
rcvd: test

rcvd: test

rcvd: test
```


CentOSでUDP通信の実装をする場合は、ファイアウォールで使うポートを開けましょう。

## try2 (ノンブロッキング受信)

ノンブロッキング受信がやりたかった。

参考　[SO](http://stackoverflow.com/questions/3960680/missing-messages-when-reading-with-non-blocking-udp)

以下でできた。

```151111e.py
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(('',6000))
s.setblocking(0)
data=''
address=''
while True:
	try:
		data,address = s.recvfrom(120)
	except socket.error:
		pass
	else:
		print "rcvd:", data

```
Jenkinsでsbt assemblyを使ってビルドするときにテストをignoreする方法

# 大前提
### __テストはちゃんと書いてからコミットしましょう__
`development` 環境に `Jenkins` によるデプロイを行う場合にテスト失敗してしまって、 `jar` の動作確認がスムーズにできないことがある場合もあるかと思います。
`sbt assembly` でデプロイする場合、__必ずテストが走ります。__なので、テストを直してもらうまで動作確認ができなくなってしまいます。

# sbt assembly でテストを走らせない方法
## sbt assembly でもテストをやらない方法はあるんだよ！
`sbt assembly` でテストを走らせない方法があります。

```sbt:sbt-assemblyのテストをignore
test in assembly :={}
```

です。こちらは結構有名かと思います。
実際にターミナルなどから `sbt assembly` をする場合は、

```sbt:コマンドからのビルド
sbt clean "set test in assembly := {}" assembly
```

というようなコマンドになります。

## では、 Jenkins ではどうやる？？
`Jenkins` から行う場合は、
- `Build using sbt` のビルド項目
    - `Action` の入力項目に `clean "set test in assembly := {}" assembly` と記述してください。

（都合上、画像はアップロードできません。申し訳ございません。）

え、一緒じゃない？
そう、一緒なんです。でもぐぐっても出くわさなかったので、投稿してみました。

何かの助けになれば幸いです。
PythonでHermite行列とその固有値を求めてみる

やりたいこと：

- 線型代数のHermite行列を作ってPythonでckすることと
- その固有値が実数であることをPythonでckすること

## Hermite行列って？
行列$A$に対して、転置を取り、さらに各成分の複素共役をとったものを随伴行列と呼び$A^{\dagger}$で表します。このときHermiteであるとは

```math
A^{\dagger}=A
```
が成立すること

## (サンプル)行列の定義

```math
A=\left(
\begin{matrix}
1 & 2+\sqrt{-1} \\
2-\sqrt{-1} & 4 
\end{matrix}
\right), B:=A^{\dagger}
```
としてみます(つまり$B$を$A$の随伴行列と置いてみます)：

```py
> import numpy as np
> A = np.array([[1,2+1j],[2-1j,4]])
> B = np.conjugate(A.T) #転置とって、複素共役！
```

### 一応、中身のck

```py
> A
array([[ 1.+0.j,  2.+1.j],
       [ 2.-1.j,  4.+0.j]])
> B
array([[ 1.-0.j,  2.+1.j],
       [ 2.-1.j,  4.-0.j]])
```

## Hermite行列であることのチェック

$B=A^{\dagger}$なので、$A=B$が言えればいいですね。

```py
> A-B
array([[ 0.+0.j,  0.+0.j],
       [ 0.+0.j,  0.+0.j]]) #OK!ま、見りゃわかるか、って感じカモですが、、、
```

## では、固有値を求めてみますか

Hermite行列$A$の固有値は実数ですが、それのチェックです。固有方程式は$$\det(\lambda I_2-A)=0$$ですよね。

```math
\begin{eqnarray}
\det(\lambda I_2-A) &=& (\lambda-1)(\lambda-4)-(2+\sqrt{-1})(2-\sqrt{-1})\\
&=& \lambda^2-5\lambda+4-5 \\
&=& \lambda^2-5\lambda-1
\end{eqnarray}
```
なので、理論的にはこうなりますね：

```math
\lambda = \frac{5\pm\sqrt{25-4\times(-1)}}{2}=\frac{5\pm\sqrt{29}}{2}
```
実数ですね！実装的には

```py
> eigen_value, eigen_vector = np.linalg.eig(A)
> eigen_value
array([-0.1925824 -3.07382855e-18j,  5.1925824 -2.18970776e-16j])
> (5-np.sqrt(29))/2
-0.19258240356725187
> (5+np.sqrt(29))/2
5.1925824035672523
```
ということで、虚部がチビっと出てしまってますが、例によって数値的なアレというやつでしょうか。
Arduino UNOで作る一番簡単なMIDI音源

# 自分で作るMIDI音源 Hello World

> 2015.11.12 某イベント向けチュートリアル

MIDI音源という、ちょっと古めかしい言い方にピーンと来たあなた！
Arduinoを使えば簡単に作れちゃいますよ！
というわけで、作ってみましょう。

こんなのが簡単に作れます。

[ヘタクソな演奏例w](https://instagram.com/p/98XyC3nCsZ/?taken-by=tadfmac)

# 用意するもの

- Arduino UNO Rev.3 (mocoLUFAを焼き込んだもの)
- しょぼいスピーカー
- USBケーブル (ArduinoとPC/Macを繋ぐやつ)
- PC/Mac
- ISP端子をショートするためのジャンパーピン

> mocoLUFAの焼き方は [かわいさんの手順書](https://webmusicdevelopers.appspot.com/codelabs/arduino-mocolufa/index.html?ja-jp)あたりを参考にしてください！

# 作り方

## ハード！

Arduinoの11番ピンにスピーカーのプラス側を、ArduinoのGNDピンにスピーカーのマイナス側を繋いでください。

以上！！

## スケッチ！

下記スケッチをArduinoに書き込んでください

```c
// MIDI to Tone Sounder
// 2015.11.11 D.F.Mac.

#include <avr/pgmspace.h> 
#include <MIDI.h>

MIDI_CREATE_DEFAULT_INSTANCE();

// Note Number -> Frequency
PROGMEM const int freqs[] = {
  8,8,9,9,10,11,11,12,13,14,15,15,16,17,18,19,
  21,22,23,24,26,28,29,31,33,35,37,39,41,44,46,49,
  52,55,58,62,65,69,73,78,82,87,93,98,104,110,117,123,
  131,139,147,156,165,175,185,196,208,220,233,247,262,277,294,311,
  330,349,370,392,415,440,466,494,523,554,587,623,659,698,740,784,
  831,880,932,988,1047,1109,1175,1245,1319,1397,1480,1568,1661,1760,1865,1976,
  2093,2217,2349,2489,2637,2794,2960,3136,3322,3520,3729,3951,4186,4435,4699,4978,
  5274,5588,5920,6272,6645,7040,7459,7902,8372,8870,9397,9956,10548,11175,11840,12544
};

const int SPEAKER = 11;      // Speaker PIN 
const int LED = 13;
int isplay = 0;

void setup() {
  pinMode(SPEAKER,OUTPUT);  // Speaker
  pinMode(LED,OUTPUT);      // LED
  MIDI.begin();             // Start MIDI
  MIDI.turnThruOff();       // MIDI Thru Off
}

void loop() {
  if(MIDI.read()) {
    int kind = MIDI.getType();
    if(kind==midi::NoteOn){
      digitalWrite(LED,HIGH);
      isplay ++;
      int playnote = MIDI.getData1();
      int freq = pgm_read_word(freqs + playnote);
      tone(SPEAKER,freq);
    }else if(kind==midi::NoteOff){
      digitalWrite(LED,LOW);
      isplay --;
      if(isplay == 0){
        noTone(SPEAKER);
      }
    }
  }
}
```

# 鳴らすには！？

MIDIキーボードを繋いで、MIDIデバイスから「MIDI/MOCO for LUFA」を選んで弾くだけ！

しょぼいビープ音（単音）が鳴ったら成功！

# MIDIキーボード持ってきてねー！

ノ https://ryoyakawai.github.io/x-webmidi/src/

# 次は！？

こちらも是非！

[[WIP] Arduinoで音を出したい（メモ）](http://qiita.com/tadfmac/items/7fb26596fe6240959c48)
RPi > firewall > Raspbian on the RPi itself does not come with any firewall rules in place

RaspberryPi2のUDPのファイアウォール設定について

https://www.raspberrypi.org/forums/viewtopic.php?f=29&t=24237
> Raspbian on the RPi itself does not come with any firewall rules in place, so the RPi should not be dropping the packets I don't think.

ファイアウォールでクローズしているのではないようだ。

<hr>
実際にnetstatで確認してみた。

```txt:動作確認
RaspberryPi2 + raspbian
```

```
# netstat -a | grep UDP
pi@raspberrypi ~ $ netstat -a | grep udp
udp        0      0 *:bootpc                *:*                                
udp        0      0 192.168.10.5:ntp        *:*                                
udp        0      0 localhost:ntp           *:*                                
udp        0      0 *:ntp                   *:*                                
udp        0      0 *:48357                 *:*                                
udp        0      0 *:mdns                  *:*             
```

関連　http://security.stackexchange.com/questions/13724/what-do-the-udp-entries-in-my-netstat-output-stand-for
デフォルトを数字キーボードにしつつ文字も入力したい



#### [1] 数字キーボードを表示させる
AndroidのIMEで表示するキーボードは、[TextView#setInputType](http://developer.android.com/intl/ja/reference/android/widget/TextView.html#setInputType(int))で変更することができます。

```xml
<EditText
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        android:inputType="number"
        />

```

もしくは、javaで

```java
editText.setInputType(InputType.TYPE_CLASS_NUMBER);
```

問題点 : inputTypeをnumberにしてしまうと、数値以外の入力が出来ない。


####  [2] 数字キーボードにしつつ日本語入力も可能にする

[TextView#rawinput](http://developer.android.com/intl/ja/reference/android/widget/TextView.html#setRawInputType(int))を利用をすると数値以外も入力できるようになります

```java
editText.setRawInputType(Configuration.KEYBOARD_QWERTY)
```

問題点 : 日本語の入力はできるようになりますが、残念ながら変換機能が有効になりません。


デフォルト表示が数字キーボードで、日本語入力も可能にしつつ、変換も可能な状態にしたいけどどうすればいいんだ..
Functorについてメモ


# 概要

Functorとは構造内の値に関数を適用できるもので、
`Functor: (a -> b) -> f a -> f b`
である。とはどういうことか。

# 圏論について

圏論とは、数学的な構造を持った「対象」と、対象間の「射」からなる。
関数 `f` が `Int` を引数に取り `String` を返すとすると、 `f: Int -> String` と表記できる。この場合、`Int`, `String` など（一般的に型と呼ばれるもの）は「対象」であり、 `f` は「射」である。


# a -> b -> c とは

HaskellやLISP, OCaml などの関数型言語を考える。関数型は、関数が第一級であり、関数が射であると同時に対象でもある。また、Haskellなどにおいて、関数は、引数（対象）をひとつ取り、返り値を1つ返す。

では、引数を2つ以上取りたい場合はどうするか。具体的には、 `f(x, y) = x + y` なる関数を定義したいという欲求が出てくる。ここで登場するのが `f: a -> b -> c` （関数のカリー化）である。

分かりやすいように、`f: Int -> Int -> Int` とする。これは、`f: Int -> (Int -> Int)` という意味である。 `f` に `Int` を渡すと、 `g: Int -> Int` という関数が返ってくる。これに対してさらに `Int` を渡すと、 `Int` が返ってくる。

```
f(x: Int) = g(y: Int) = x + y
g = f(2) // = g(y: Int) = 2 + y
g(3) // = 5
```

`f` に `2` を渡すと、`yを受け取って+2をする関数` が返ってくるので、そいつに更に `3` を渡します。これで足し算を実現しています。つまり、


```
f(2)(3) // = 5
```


# 構造体とは

Scalaの `List[String]` とかを考える。（Scalaは純粋関数型ではなく、クラスが関数 - 正確にはメソッド - を持つので特殊だが）

```
list = List("first", "second", "third")
list(0) // => "first"
```

Scalaにおいて、 `list(0)` は `list.apply(0)` のことである。
`list.apply` は `Int -> String` となる。
この apply のような、構造体から値を取り出すような操作を extract と言う。

`Map[String, String]` の extract は `String -> String` である。


# Functor とは

Functorとは構造内の値に関数を適用できるもので、`Functor: (a -> b) -> f a -> f b` である。

FunctorはScalaでいう `map` である。Scalaのmapの実装を見てみると

```
trait Functor[F[_]] {
  def map[A, B](fa: F[A])(f: A => B): F[B]
}
```

いかにも Functor っぽい感じになっている。

`(a -> b) -> f a -> f b` とは `(a -> b) -> (f a -> f b)` となる。ここにおける、 `f` というのが List であり、Functorは、関数 `a -> b` を受け取り、構造体の中身に `a -> b` を適用し、構造体を返す。


# 次

次は `Applicative`

# 参考

* http://qiita.com/suin/items/0255f0637921dcdfe83b
AndroidStudio Plugin作成時に group with id "AndroidToolsGroup" isn't registered が出た時の対処法

Actionクラス作成時に `Android.MainToolBarActionGroup` や `AndroidToolsGroup` などを指定した際、実行してみるとToolWindowに追加されるはずのメニューが表示されないことがあります。

エラーログに次のようなエラーが出ていた場合の対処法です。

```
[   4162]  ERROR - nSystem.impl.ActionManagerImpl - com.konifar.sample.actions.ActionToolsGroupSample (ActionToolsGroupSample): group with id "AndroidToolsGroup" isn't registered; action will be added to the "Other" group [Plugin: com.konifar.android-studio-plugin-sampler] 
com.intellij.diagnostic.PluginException: com.konifar.sample.actions.ActionToolsGroupSample (ActionToolsGroupSample): group with id "AndroidToolsGroup" isn't registered; action will be added to the "Other" group [Plugin: com.konifar.android-studio-plugin-sampler]
```

原因は、Androidに依存したActionを作ろうとしていることです。
AndroidStudioのプラグインはIntelliJで開発するので、AndroidStudioに依存したActionを作る場合は plugin.xml に `depends` を追記しなければなりません。

上述のエラーの場合、次のタグを追加し、build.gradle に以下の設定をすれば直るはずです。

```plugin.xml
<depends>org.jetbrains.android</depends>
```

```build.gradle
plugins {
    id "org.jetbrains.intellij" version "x.x.x"
}

intellij {
    plugins 'android'
}
```

その他IDEごとに必要な `depends`は[Plugin Compatibility with IntelliJ Platform Products](http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/plugin_compatibility.html)に記述されています。

次のタグも書いておいた方が変にハマることがないので無難そうです。

```plugin.xml
<depends>com.intellij.modules.androidstudio</depends>
```

参考 : [Determine or configure plugin load order](https://devnet.jetbrains.com/message/5533820)
[Maven] m2eでローカルリポジトリにライブラリをインストールする方法


# 前提

Maven のローカルリポジトリに独自のライブラリをインストールしたくなったとします。

でもその環境は、Eclipse+m2e プラグインで Maven を使っていて、Maven のコマンドがインストールされていないし、する予定もないとします。
（理由は「インストールが面倒だ」でも「他人の環境の設定を依頼されただけだから」でも、なんでもいいです）

もちろん、system スコープで依存関係を足して解決でもいいのですが、あえてローカルリポジトリに入れることを考えます。

# 環境

今回の環境は以下のとおり。あまり関係ないと思いますが。

- Windows 7 SP1
- Java 8u65
- Eclipse 4.5.1
- m2e 1.6.2 (Maven 3.3.3)

# 方法

ローカルリポジトリにライブラリ(Jar)を追加する方法は、一般的に以下のようなコマンドを実行することだと思います。

```
mvn install:install-file \
    -Dfile=【Jarの絶対パス】 \
    -DgroupId=【GroupID】 \
    -DartifactId=【ArtifactId】 \
    -Dversion=【バージョン】 \
    -Dpackaging=jar \
    -DgeneratePom=true
```

でも、その環境は Eclipse+m2eプラグインでMavenを使っているらしく、mvn コマンドが見つからない。
（どこかにあるのかもしれないけど、よくわからない）

仕方ないので、m2eプラグイン上からライブラリを追加する方法を検討しました。
とりあえず、以下の手順で動作確認をしてみました。

1. Eclipse のコンソールビューの右端の「Open Console」アイコンから「Maven Console」を選択して開いておく
2. 適当な pom.xml を右クリックして、"Run As" ⇒ "Maven build..." を選択
3. Goals に `-v` を入力して実行
4. 通常の Console にバージョン情報、Maven Console に実行したコマンドが表示される(今回は `mvn -B -v` が実行されていた）

どうやら、ゴールに指定したものは、単純に引数に追加されているだけっぽい。引数を２つで試してみても動いているみたい。

なので、Goals に引数を無理やり全部書けば動かせそうな気がしますね。試してないけど。ただ、引数が長すぎるのは面倒。

Maven の install プラグインのマニュアルを見ると、pom.xml で定義したプロパティを使ってくれると書いてありました。

参考： [Apache Maven Install Plugin - install:install-file](https://maven.apache.org/plugins/maven-install-plugin/install-file-mojo.html)

そこで、適当な Maven プロジェクトを作って、以下のように pom.xml を書いてみました。

```xml:pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>test.maven.lib.installl</groupId>
  <artifactId>test.maven.lib.installl</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <properties>
    <file>【Jarの絶対パス】</file>
    <groupId>【GroupId】</groupId>
    <artifactId>【ArtifactId】</artifactId>
    <version>【バージョン】</version>
    <packaging>jar</packaging>
    <generatePom>true</generatePom>
  </properties>
</project>
```

そして、この pom.xml を右クリックして "Run As" ⇒ "Maven build..." を選択、Goals に `install:install-file` を入力して実行。
成功したら、念のため Maven Repositories ビューで、ローカルリポジトリを rebuild しておきます。

すごく便利な方法というわけではありませんが、とりあえず忘れないうちにメモしておきます。
DebianでCUI起動に切り替え

# DebianでCUI
Windows PCではよくVirtualBoxを使います。
その時にゲストOSにDebianを選ぶことが多いです。
そしてGuest Additionsを入れる為にGUIでインストールして最後にCUIにするのですが、JessieでCUIにするのに手こずったのでここに備忘録。

## Jessie
CentOS等のようにランレベルを３にしたらCUIになると思ったら、そもそも```/etc/inittab```がない(笑)
個人的にはまだ```Jessie```は使いづらい印象。

```get-default``` で現在の設定、```set-default```で設定です。はい。

```
# systemctl get-default
# systemctl set-default -f multi-user.target
```

## wheezy
```/etc/inittab``` は存在するのだけど変えてもGUIで起動してくる(笑)
インストールによっては```gdm3```の部分は変わりますが大体こんな感じ。

```
# chkconfig gdm3 off
```

## GNU/Linux(debian 11)

### GUI -> CUI
```
sudo systemctl set-default multi-user.target
```

### CUI -> GUI
```
sudo systemctl set-default graphical.target
```



# 参考サイト
- [Why is my Debian jessie always in runlevel 5?](http://unix.stackexchange.com/questions/170555/why-is-my-debian-jessie-always-in-runlevel-5)
- [GNU/LinuxでのGUIとCUIログインの切り替え方法](https://senooken.jp/post/2020/12/05/)
xbuildでrubyをインストールしてsudoで使えるように


```
yum install -y openssl-devel readline-devel zlib-devel
git clone https://github.com/tagomoris/xbuild.git
./xbuild/ruby-install 2.1.1 /opt/ruby-2.1
echo 'export PATH=/opt/ruby-2.1/bin:$PATH' > /etc/profile.d/ruby.sh
```

# visudo

```
-Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin
+Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/opt/ruby-2.1/bin
```
【Mac】クリップボードをファイルに保存、ファイルの中身をクリップボードにコピー【ターミナル】

# 概要

　クリップボードの中身をファイルに保存したい時、いちいちエディタ開いてペーストして保存するのは面倒ですよね。

　この投稿ではそのような煩雑なことをしないで良くなる、Macのターミナル操作で、

* クリップボードの内容をファイルに保存する方法
* ファイルの内容をクリップボードにコピーする方法

を紹介します。

# クリップボードの内容をファイルに保存する方法

　ターミナルで[pbcopy](https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/pbcopy.1.html)を使います。

```terminal:
pbpaste > example.txt
```

# ファイルの内容をクリップボードにコピーする方法

　ターミナルで[pbpaste](https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/pbpaste.1.html)を使います。

```terminal:
pbcopy < example.txt
```



# 参考

* [pbcopy(Mac OS Xマニュアル)](https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/pbcopy.1.html)
* [pbpaste(Mac OS Xマニュアル)](https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/pbpaste.1.html)
* [【ひとりStartMac】 ターミナルで使える「pbcopy」「pbpaste」って知ってました？](http://www.ideaxidea.com/archives/2011/04/macosx_terminal_tips.html)
* [Macのターミナル上のコピペpbcopy,pbpasteが便利](http://qiita.com/LOUIS_rui/items/ef70eeb2e373df91d025)
DDD Alliance ドメイン駆動設計をやってみた　６つの現場からの報告


後半バッテリーが終了してメモれてないです…
ごめんなさい！

## 第1部 ビッグローブでの2年間の取り組み

### 1. DDDを組織で始めるための考え方

Cloud works 入社したら人事部長ｗ
今回はBIGLOBEの話

2，3年で10数チームできた
スクラムでやった

15年分の独自言語のシステムをコンテキストマップとか作ってみたけどカオス

独自言語→人が成長しない

業務ロジック書くのが人によってマチマチになる。`あるある`

スクラムを始めたときのように小さなチームを作って初めて見た。
守破離

研究だけだと日の目を見ない。`あるある`

実際の案件でやった→一回失敗した→もう一回やった！！！
楽しかったという思い出

のれん分けで広げていった

広げるときは一気にやっても難しい。
ノウハウは人に貯まる。暗黙知。

#### 組織に導入するポイント

やったことないところに導入するためには

- 小さくやる
- 知ってる人に教えてもらう
- のれん分け

**もっと重要なのは結果を出す！！！**

強い意志が必要。
責任から逃げちゃダメだ

#### なぜDDD?

抽象的な話。

「クリストファー・アレグザンダーの思考の軌跡」から言葉を拝借

- デザインはニーズを認識すること
- デザインの究極的な目標は形だ
- コンテキストはほにゃらら

設計の同期は自分たちの外にあるべき
会社変わって普段デザインやってる人達の話し聞いてたら課題は何かをずっと話している
なぜを考えている。
何を作るかはあくまで手段。

DDD本も具体的なコードの話は出てこないことからそういうことなんだろう、と。

事業目的もどんどん変化していくんだからそれと一緒にグルグルリファクタリングしていく。

#### システム全体としての考え方

サービスとコードを繋ぐとサービスについて考えるようになる
変化へのしなやかな対応で変えることが当たり前になる

コンセプトは人。

現実的にはすぐに解決できない問題だらけ。
何するのも人がやってる。そこを考える。

道具（DDD）を変えることで人は成長する。

アジャイル、スクラムとの相性はいい。
組織として戦略的に取り組む必要がある。

施策を考える人と開発する人が一緒にやっていく塊は今やってるからこれからも維持していきたい。
総合的に組織を作る。

経営層と繋がっていく。

エンジニアの地位を上げていく！

### 2. 開発現場から学んだドメイン駆動設計中心のサービス開発

BIGLOBEでDDD導入して早2年
主要なところは大体DDDでやれてる

- 全開発者でDDDの価値を共有
- 現状の課題分析と課題解決に向けての行動
- 人材育成計画（現在30名くらい）
	- どういう人に今後引っ張ってもらうかなど考える
- 新たな技術にチャレンジ
- 開発環境基盤の高度化もチャンとやる
	- デプロイとかもしっかりやる

#### DDDの価値

コアドメインは何か？
開発メンバーも一緒に考えようぜ。

サービス継続←変更し続ける←人も変わっていく

5年10年を見据えたサービスを考えるのは難しい。

- コスト削減
- 変更コスト
- 俗人か低減

#### スクラム

アプリケーション層の設計に近い

方向付けレベルの設計に止める
サービスをシンプルにできるならシンプルにしましょう。

全ての実装を満足にできるわけではないので、コアドメインを重点的にやる。

WIPプルリクして効率的にレビューしてる。

でかくなるとわけのわからんものになるから注意。

違和感に敏感になる。
書き言葉と話し言葉がずれたら警告！

コアドメインはほったらかしにしたら絶対にアカン

#### チームビルディング

チームビルディング大事。

「チームが機能するとはどういうことか」

学習しながら実行する＝DDDで必須の考え方！
DDD採用してるのは長い目で見たコスト削減にもなるので、当てはまるところが多い。

全員で設計→ファシリテーションが大事。

会議中にPCいじってる人がいるのはNG。
みんなで考える。
意見を引き出す→ファシリテーターの仕事
ギャップをなくす

ノウハウを伝授するためには…
過程も含めて伝える

メンバー自身にモデリングさせる。
リーダーとかが書いたら意味ない。

#### モデリング

肥大化を防ぐために外側に出したりする。
Immutable Data Model

ひたすらInsert

NULLの項目が激減する！

#### 失敗談

リーダークラスで集まって出してもらったら20コくらい出てきたｗ

- ドメインモデルが古くてメンテされてない
- Policy乱立問題
- Repositoryのsaveメソッド

## 第2部 受託開発の現場から

### ドメイン駆動設計を実践するプログラマーの悩み

プログラミングの面で悩んでること、解決策が見いだせてないものの話

### ドメイン駆動設計におけるシナリオテストの活用

BDDやってみたらいい感じだったという話

## 第3部 内製の現場から

### ECサイトのリプレイスをDDDでやってみた

### ガチDDDを経てDDDって何？って現場に行ったあるプログラマーのお話し

## 最後に ドメイン駆動設計のススメ
新しいプロジェクトを作る時に悩まされることまとめ

##文字化け
>[Android] Android Studio での encoding 設定
https://akira-watson.com/android/android-studio-encoding.html

##Rに赤波
>R.javaが自動生成されない
http://qiita.com/JunSuzukiJapan/items/3dd3b0bffb0db7f55356

>Android Studio で問題なくビルドできるのに cannot resolve symbol が急に荒ぶった時対処
http://qiita.com/motodimago/items/727a3b98848a6901365d


##AppCompatのversion
エラー　`Failed to resolve: com.android.support:appcompat-v7:23.+`

>com.android.support:appcompat-v7:22.0.1 が見つからない
http://woshidan.hatenadiary.jp/entry/2015/09/28/233823


>Android StudioでAndroid SDK Managerを開いて、ライブラリをアップデートする
http://qiita.com/labeneko/items/f6c46f9a21f321827d88

##感想
久しぶりに作ろうとすると、やったことはあるけどなんだったっけ、ということが何個かありましたのでそのまとめです。覚えてないもんですね。
【自分用】Ciscoのルータの設定やるので使えそうなサイトメモ


近日中にCiscoのルータの設定をいじるので使えそうなサイトとかメモメモ。
今までCiscoいじったことないな…大丈夫かな…。。。

## 参考になりそうなサイト
[ネットワーク入門サイト_main](http://beginners-network.com/cisco-catalyst-command/)

[ネットワーク入門サイト_logging](http://beginners-network.com/cisco-catalyst-command/logging.html)
Bluemix DevOpsのプロジェクトを複数メンバーで共有する

Bluemix DevOpsサービスで新プロジェクトをprivateで作成し、メンバーで共有してみました。
目的はDevOpsのチケット(Trac)がどの程度のことが出来るのかの実験です。

bluemix DevOpsサービスから新プロジェクト作成。リポジトリはjazzを選択してみました。
（今回チケット運用が目的なのでBluemix Projectは作成していません）
![image](https://qiita-image-store.s3.amazonaws.com/0/99329/2d6f551c-cc93-bad3-3ee3-d08d4596754a.png)

作成したプロジェクトからメンバーの追加要望を出します。
![image](https://qiita-image-store.s3.amazonaws.com/0/99329/03f81e2a-68b6-913e-442b-063f8f73b322.png)

メンバーにメールが飛ぶのでそれを受け入れるとメンバーに追加されます。
（続きはメンバーが追加されてから）
golang の channel のブロックがよくわからん


# golang の channel のブロックがよくわからん

っていう人(2日前の自分とか)は、これビルドして実行して `Ctrl+C` 連打してみるといいと思う。

`SIGINT` 拾っちゃってるので、停めるときは `SIGTERM` 送るとよい。

```main.go
package main

import (
	"fmt"
	"os"
	"os/signal"
	"sync"
	"syscall"
	"time"
)

func main() {

	var wg sync.WaitGroup
	ch := make(chan int, 10)

	wg.Add(1)
	go func(c chan int) {
		for {
			i := <-c
			fmt.Println(fmt.Sprintf("rcv: %d", i))
			time.Sleep(500 * time.Millisecond)
		}
	}(ch)

	signal_chan := make(chan os.Signal, 16)
	signal.Notify(signal_chan,
		syscall.SIGINT,
	)
	go func() {
		cnt := 0
		for {
			sig := <-signal_chan
			switch sig {
			case syscall.SIGINT:
				cnt++
				fmt.Println(fmt.Sprintf("send: %d", cnt))
				ch <- cnt
			}
		}
	}()

	wg.Wait()
}
```
EC-CUBE 2.13 で、トップページだけはドメイン直下でアクセスできるようにする


# 動機
__html/ の中に data/ を入れるのが気持ち悪かった。__

ネットに散見されるこの手のハック、そのままhtmlをドキュメントルートに持って行くという対処が多かった。

が、ロジック部とデザイン部が別れてないの、不安じゃありません？
ちゃんとMVWの概念に従って、この辺は別れていて欲しいと想い、色々頭をひねってみた。
```
そもEC-CUBEがMVWになってないという意見は言うもんじゃあない
```


# 前提
- URL欄にドメイン叩けばトップページが閲覧できる環境にしたい。/html/を付与したくない。
- トップページ以外は/html/が付与されていても問題なし。
- サーバで.htaccessが書ける。mod_rewriteがある程度使える。


# 実装

インストール後、編集するファイルは２つ。

1. ドキュメントルートの.htaccess
2. data/config/config.php

## .htaccess

``` .htaccess
<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteBase /
  RewriteCond %{REQUEST_URI} !^/html/.*$
  RewriteRule ^(.*)$ /html/$1
</IfModule>
```

## data/config/config.php

``` php
define('ROOT_URLPATH', '/');
define('HTTP_URL', 'http://{ドメイン}/');
define('HTTP_URL', 'http://{ドメイン}/');
↓
define('ROOT_URLPATH', '/html/');
define('HTTP_URL', 'http://{ドメイン}/html/');
define('HTTP_URL', 'http://{ドメイン}/html/');
```

# 雑感
実は.htaccessだけでも対応可能なんだと思うけれど、config.php側で制御してあげた方が問題起きづらいのかなーとも。
実はまだモヤッとしてる部分があるので、ご意見頂ければ幸い。
fastlane が地獄のように遅くなった時にするべきこと

## 環境

- MacBook Pro (Retina, 13-inch、Early 2015)
- OSX 10.10.5
- Xcode 7.1.1
- Ruby 2.1.0 (rbenv 使ってる)
- gem 2.2.0
- fastlane 1.38.0

## 現象

iOS アプリ開発時に非常に便利な [fastlane](https://fastlane.tools/) の起動に死ぬほど時間がかかるようになりました。

具体的には `fastlane --help` とやるだけで CPU を 100% 使い、3分後ぐらいに結果が出力されるような感じです。

help 出すのに 3分待つって明らかにおかしい (((;꒪ꈊ꒪;)))

昨日まではすぐに結果が返ってきていました。

## やったこと

`gem cleanup` したら fastlane が今までどおりの反応速度で動作するようになりました。

gem のことはあんまり詳しくないのですが、昔のバージョンとかのゴミがたくさん貯まると動作が遅くなるのですか？？？

fastlane は4バージョン昔のから使っていてアップデートの度にインストールしていました。

fastlane を入れると gym や deliver など様々なツールが同時に入るのでそれらも含めるとそれなりの数のゴミが溜まっていたと思います。

原因はよく分かりませんでしたが、とりあえず激重な状態ではなくなったので良かったです。
JAVA equals()メソッド　メモ

■Main23.java

```java
Hero2 h7 = new Hero2();
		h7.setName("あむ");
		h7.setHp(70);
		Hero2 h8 = new Hero2();
		h8.setName("あむ");
		h8.setHp(70);
		if (h7.equals(h8) == true) {
			System.out.println("同じ内容です");

		} else {
			System.out.println("違う内容です");
		}

		if (h1.equals(h2) == true) {
			System.out.println("同じ内容です");

		} else {
			System.out.println("違う内容です");
		}
```

■実行結果
Hero2のコンストラクタが動作
Hero2のコンストラクタが動作
あむ
Hero2のコンストラクタが動作
Hero2のコンストラクタが動作
あむ
違う内容です
違う内容です


<FONT color="#ff0000">_________________________________________________________</font>
そのクラスのインスタンスについて、「何を持って、意味的に同じと見なすか」を**equals()メソッドのオーバーライド**という形で指定しなければなりません。
■Hero2.javaに
equals()メソッドのオーバーライドをした

```java
public boolean equals(Object o) {
		if (this == o) {
			return true;
		}
		if (o instanceof Hero2) {
			Hero2 h7 = (Hero2) o;
			if (this.name.equals(h7.name)) {
				return true;
			}
		}
		return false;
	}
```

■Main23.javaをコンパイルした実行結果
Hero2のコンストラクタが動作
Hero2のコンストラクタが動作
あむ
Hero2のコンストラクタが動作
Hero2のコンストラクタが動作
あむ
同じ内容です
違う内容です
syntastic: error: checker ruby/rubocop: can't parse version string

When check ruby syntax, some errors shown on console.

![Screen Shot 2015-11-11 at 5.58.56 PM.png](https://qiita-image-store.s3.amazonaws.com/0/2179/4d51b737-fda8-4ada-b2d4-8879a64d5dc7.png)

```
"~/one/test.rb" 3L, 36C written
syntastic: error: checker output:
warning: parser/current is loading parser/ruby22, which recognizes
warning: 2.2.3-compliant syntax, but you are running 2.2.0.
0.34.2
syntastic: error: checker ruby/rubocop: can't parse version string (abnormal termination?)

```

## Reason

There is some warnings when get rubocop's version:
![Screen Shot 2015-11-11 at 6.09.34 PM.png](https://qiita-image-store.s3.amazonaws.com/0/2179/ad4fcd8f-ed90-002c-2e51-39a5290680c3.png)


```
17:50:13-liubin~/one\ -> rubocop --version
warning: parser/current is loading parser/ruby22, which recognizes
warning: 2.2.3-compliant syntax, but you are running 2.2.0.
0.34.2
17:53:41-liubin~/one\ -> rubocop --version 2>/dev/null
0.34.2
```


## Workaround

Disable warning when get rubocop's version:

![Screen Shot 2015-11-11 at 6.00.04 PM.png](https://qiita-image-store.s3.amazonaws.com/0/2179/96773294-d071-26e2-9499-b6de79eaa227.png)

```
# ~/.vim/bundle/syntastic/plugin/syntastic/checker.vim
-        let command = a:0 ? a:1 : self.getExecEscaped() . ' --version'
+        let command = a:0 ? a:1 : self.getExecEscaped() . ' --version 2> /dev/null'
```

## Reference

- https://github.com/scrooloose/syntastic/issues/1145
- https://github.com/scrooloose/syntastic/pull/1403
- https://github.com/whitequark/parser/issues/189
CentOS6.5にMySQL5.5.38をインストールする手順

*半年間、MySQLを基礎からやり直すことにしたので、その間に勉強したことをQiitaに投稿していきます。*
# CentOS6.5にMySQL5.5.38をインストールする手順
## 必要なパッケージをローカルにwgetで取ってくる
```
# root権限になる
$ sudo -s

# ディレクトリを移動しておく
$ cd /usr/local/src

# wgetコマンドで必要なrpmパッケージを取ってくる
$ wget http://dev.mysql.com/get/Downloads/MySQL-5.5/MySQL-client-5.5.38-1.linux2.6.x86_64.rpm
$ wget http://dev.mysql.com/get/Downloads/MySQL-5.5/MySQL-server-5.5.38-1.linux2.6.x86_64.rpm
$ wget http://dev.mysql.com/get/Downloads/MySQL-5.5/MySQL-shared-compat-5.5.38-1.linux2.6.x86_64.rpm
```

## ファイルの確認
```
$ ls -l
-rw-r--r-- 1 root root 17713894 May 12  2014 MySQL-client-5.5.38-1.linux2.6.x86_64.rpm
-rw-r--r-- 1 root root 50535068 May 12  2014 MySQL-server-5.5.38-1.linux2.6.x86_64.rpm
-rw-r--r-- 1 root root  5179375 May 14  2014 MySQL-shared-compat-5.5.38-1.linux2.6.x86_64.rpm
```

## インストール
```
$ yum localinstall MySQL-shared-compat-5.5.38-1.linux2.6.x86_64.rpm
$ yum localinstall MySQL-server-5.5.38-1.linux2.6.x86_64.rpm
$ yum localinstall MySQL-client-5.5.38-1.linux2.6.x86_64.rpm
```

## MySQLのバージョン確認
```
$ mysql --version
mysql  Ver 14.14 Distrib 5.5.38, for Linux (x86_64) using readline 5.1
```

## とりあえずMySQLプロセスを立ち上げてみる
```
$ /etc/init.d/mysql start
Starting MySQL.. SUCCESS!
```

## MySQLへログインする
```
$ mysql -uroot
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.5.38 MySQL Community Server (GPL)

Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 
```

無事インストールと起動が確認できたので、とりあえずお疲れ様でした(｀･ω･´)ゞ
iOS XIBファイルをコンパイルせずに動作確認する


XIBファイルで画面を作成している場合限定ですが、XIBファイルをローディングする仕掛けを作成しました。AutoLayoutの動作確認で、いちいちコンパイルしなくて済むかもしれません。（XXXViewControllerを編集した場合は、残念ながら今まで通りコンパイルが必要です。)

---

追記
コメントでご指摘をいただきましたが、AutoLayoutの動作確認であれば、Xcode標準のプレビュー機能で十分そうです。[参考:Xcode:シミュレータなしでViewをプレビューする](https://www.google.co.jp/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=Xcode+%E3%83%97%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC)

実データを読み込んだ上で確認したい、アニメーションと合わせて確認したい、動的にビューを変えたいという場合に、参考になれば幸いです。

---

# Demo

![lxd.gif](https://qiita-image-store.s3.amazonaws.com/0/37443/82e0e348-cf47-aac4-8d38-eb7aacc44e8f.gif)

# Install

```rb

pod 'LoadXIBDynamically', git: 'https://github.com/hmuronaka/LoadXIBDynamically.git'

```

# 使い方

[GithubのREADME](https://github.com/hmuronaka/LoadXIBDynamically/blob/master/README_jp.md)参照.

# 仕掛けについて

仕掛けは単純で、

1. iOS上にGCDWebDAVServerでWebDAVサーバーを立ち上げて、
2. XIBファイルを編集後、手動でXIBファイルをiOSにアップロード(ダサいですが）
3. iOS上の画面を再表示

で実現しています。


勢いで作成したので、不備があるかもしれませんが、多少でも開発速度の改善につながれば幸いです。
SQL: show columns を 13文字分 短く打つ方法

```sql
SHOW COLUMNS FROM table_name;
```

と同じことが DESC で出来る。

```sql
DESC table_name;
```

動作は全く同じだ。13文字も短い！



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
pyenvでインストールしたpython3からOpenCV3を利用できるようにする

  
anacondaではOpenCV3がインストールできなかったので(2015年11月11日時点でopencv 2.4.10)．
opencv3にこだわりがない方は以下のコマンドで導入できます．

```shell
conda install -c https://conda.binstar.org/jjhelmus opencv
```

---

###環境
Mac OS X 10.10.1
homebrew
pyenv
anaconda3-2.4.0 (installed by pyenv)

###OpenCV 3の導入
```shell
brew tap homebrew/science
brew install opencv3 --with-python3
brew link opencv3 --force
```

###python3からOpenCV3を利用できるようにする
```shell
% cd /Users/(ユーザー名)/.pyenv/versions/anaconda3-2.4.0/lib/python3.5/site-packages
% ln -s /usr/local/Cellar/opencv3/3.0.0/lib/python3.5/site-packages/cv2.cpython-35m-darwin.so cv2.so
```
パスはanacondaやpythonのバージョンに合わせて適宜変更してください．また，"cv2.cpython-35m-darwin.so"についても，各自の環境によってそれっぽいものを探してください．

###テスト
```
% python
Python 3.5.0 |Anaconda 2.4.0 (x86_64)| (default, Oct 20 2015, 14:39:26)
[GCC 4.2.1 (Apple Inc. build 5577)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'3.0.0'
>>>
```
import時にエラーが出なかった場合は導入成功です✨
ブラウザバックでどうしてもリロードを行いたい時

ブラウザバックした時にどうしてもリロードしたかったときにとった方法。

```html
<input type="hidden" id="refresh" value="no">
<script>
$(document).ready(function() {
    var $input = $('#refresh');
    $input.val() == 'yes' ? location.reload(true) : $input.val('yes');
});
</script>
```

そもそも```Cache-Control```で上手くやれって感じなのかもしれないですが、案件の特性上いろいろと難しいこともあるかと思いますので、一方法としてメモしておきます。

もっとスマートに出来ないものか。いい方法あれば教えて下さい。
[firewalld][CentOS][RHEL][RedHat][Linux] レンサバ(CentOS7)のファイアウォール設定。not iptables, but firewalld


# 概要

iptablesばっちこーいな気分でいたら、CentOS 7(RHEL7)からはfirewalldというものを使うそうです。新しくて面倒気分ですが、たぶんほとんどのシーンでは今までより簡単に使えそうです。

信頼するIPアドレスは「trusted」ゾーンへ、悪さするIPアドレスは「block」ゾーンへ、「public」ゾーンには公開するサービスだけを登録、こんな感じでいけます。

# 環境

 - CentOS 7.1

```text:
$ cat /etc/redhat-release
CentOS Linux release 7.1.1503 (Core)
```

# はじめにfirewalldのこと

firewalldを設定する上で肝要なのは、ゾーンという考え方です。「Home」とか「Public」という名前を見るとWindowsみたいですが、ちょいと違います。

その他にもいくつか新しい用語があります。

## ゾーンとは

あるネットワーク接続の信頼レベルの定義です。 ← 直訳すぎてわかんないですね。

まず、ネットワーク接続を分類します。分類方法は、どのネットワークインターフェースを使っているか、差出元IPアドレスがなんであるか、ポート番号がなんであるかです。そのネットワーク接続をゾーンという単位でまとめます。

初期状態で以下のようなゾーンが存在します。

 - drop 有無を言わさずパケットを落とします。IDENT要求なんかはこのゾーンに入れてあげるといいかも。
 - block アクセス全拒否したいIPアドレスは、このゾーンに入れてあげます。
 - public
 - external
 - dmz
 - work
 - home
 - internal
 - trusted アクセス全許可するIPアドレスは、このゾーンに入れてあげます。

\# dmzゾーンって、頭痛が痛いですね。。。

## サービスとは

公開するプロトコル/ポート番号/宛先IPアドレスをまとめたものです。

/usr/lib/firewalld/services ディレクトリの下にxmlファイルとして設定されています。

## リッチルールとは

iptablesに設定するルールの簡易版です。読みやすい(?)代わりに機能が少ないです。

次のオプションを指定できます。

 - 差出元IPアドレス
 - 宛先IPアドレス
 - firewalldが提供するサービス、ポート番号、プロトコル、ICMPタイプ、IPマスカレードするかどうか、フォワードするかどうか
 - ロギング
 - アクション（action、reject、drop）

## ロックダウンとは

ファイアウォールがユーザやアプリケーションから変更できないようにします。
ホワイトリスト形式で変更を許すユーザやアプリケーションを指定できます。

# 設定方針

こんな感じの方針で設定します。

 - trustedゾーンに接続を許すIPアドレスを登録
 - 公開するネットワークインターフェースをpublicゾーンにする
 - publicゾーンから不要なサービスを削除
 - publicゾーンに公開するサービスを追加

# 設定手順

## firewalldを有効化して起動

何はともあれ起動します。

```
# systemctl enable firewalld
ln -s '/usr/lib/systemd/system/firewalld.service' '/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service'
ln -s '/usr/lib/systemd/system/firewalld.service' '/etc/systemd/system/basic.target.wants/firewalld.service'
# systemctl start firewalld
```

## trustedゾーンに接続を許すIPアドレスを登録

```
# firewall-cmd --zone=trusted --add-source=xxx.xxx.xxx.xxx
success
# firewall-offline-cmd --zone=trusted --add-source=xxx.xxx.xxx.xxx
success
```

## インターフェースをpublicゾーンへ追加

```
# firewall-cmd --zone=public --add-interface=eth0
success
# firewall-offline-cmd --zone=public --add-interface=eth0
success
```

## publicゾーンから不要なサービスを削除

```
# firewall-cmd --zone=public --remove-service=dhcpv6-client
success
# firewall-cmd --zone=public --remove-service=ssh
success
# firewall-cmd --permanent --zone=public --remove-service=dhcpv6-client
success
# firewall-cmd --permanent --zone=public --remove-service=ssh
success
```

## publicゾーンに公開するサービスを追加

httpとhttpsを公開するようにしました。

```
# firewall-cmd --zone=public --add-service=http
success
# firewall-cmd --zone=public --add-service=https
success
# firewall-cmd --permanent --zone=public --add-service=http
success
# firewall-cmd --permanent --zone=public --add-service=https
success
```

# 設定の確認

## 使用しているゾーンの確認

インターフェースやソースアドレスを登録したゾーンを一覧表示します。

```
# firewall-cmd --get-active-zones
public
  interfaces: eth0
trusted
  sources: xxx.xxx.xxx.xxx
```

## 公開しているサービスの確認

ソーンに追加されているサービスを一覧表示します。

```
# firewall-cmd --zone=public --list-services
# firewall-cmd --zone=trusted --list-services
```

ゾーン名を指定しないと、デフォルトゾーン（`firewall-cmd --get-default-zone`で確認できます）が対象となります。
Mac版のMonoSnapのフォントを変更する

2018年現在ではMonosnapのPreferencesから、フォントの設定ができるようになっています。
<img width="322" alt="Monosnap | Fonts    2018-11-07 12-42-23.png" src="https://qiita-image-store.s3.amazonaws.com/0/34573/3cb52a05-d9da-9a39-57ba-3cd9ac5d8a40.png">

やったねよかった！


----
### 以下は古い情報ですー


MonoSnap を Mac に入れると、フォントがなんとも言えない中華風になってしまいます。



![デスクトップ 2015-11-11 17-52-55.png](https://qiita-image-store.s3.amazonaws.com/0/34573/e80b6138-b244-9455-d438-3f88e0555a71.png)
まるでフォントがバグってるかのよう。



つ、つらい・・・。
そこでフォントを入れ替えましょう。


## 入れ替えるフォントを用意

なんでも良いですが、日本語対応の .ttf フォントである必要があります。

今回はわかりやすくするため、[たぬき油性フォント](http://tanukifont.com/tanuki-permanent-marker/) を使用します。


![Tanuki Permanent Marker 2015-11-11 17-58-28.png](https://qiita-image-store.s3.amazonaws.com/0/34573/54f9681a-59f6-15b7-ead2-49105f04a49c.png)



## フォントをリネーム

ダウンロードしたフォントを `DroidSansFallback.ttf` にします。


## フォントを置換

コマンドプロンプトで

```
open /Applications/Monosnap.app/Contents/Resources/
```
と打ちます。
開いたフォルダに、 `DroidSansFallback.ttf` があるので、 `DroidSansFallback__.ttf` とかにリネーム。
（管理者パスワード求められます）

さっきダウンロードしてきたほうの `DroidSansFallback.ttf` を、同じフォルダに入れます。



## 確認

これだけでフォント変更が完了です！
特にmonosnapを再起動することもなく、キャプチャすると・・・

![デスクトップ 2015-11-11 18-03-24.png](https://qiita-image-store.s3.amazonaws.com/0/34573/62dad5b2-1476-5640-1fc2-3e0f771e66ec.png)

新しいフォントで出ましたね。ぱちぱちー。


DroidSansFallback.ttf はAndroidで日中韓のフォントが入ってなくても動くように、Googleが作ったフォントのようで、海外版Androidを買うとよく見るやつです。日中韓の書き順の差とかはあんまり考えられてないんですよね。



## おまけ

これだと英数字のフォントは変わっていません。英数字のフォントも修正したい場合は、差し替え先を `DroidSans-Bold.ttf` にしてください。

（※ `DroidSans-Bold.ttf` と `DroidSansFallback.ttf` の両方がないと、monosnapは正常にキャプチャできませんので無くさないようにご注意を）
書籍「オブジェクト指向でなぜつくるのか」


◆学習対象
書籍名	オブジェクト指向でなぜつくるのか: 知っておきたいOOP、UML、設計の基礎知識
著者	平澤章
出版社	日経BP社, 2004
ページ数	317 ページ
![ダウンロード.jpg](https://qiita-image-store.s3.amazonaws.com/0/100247/e8e712a1-684d-d467-9717-0ce92d06c754.jpeg)


オブジェクト指向(Object Oriented)とは？
 - ずばり、「ソフトウェアの保守や再利用を目的とした技術」である
 - オブジェクト指向の活用範囲は広い

![オブジェクト指向の全体図と発展過程.png](https://qiita-image-store.s3.amazonaws.com/0/100247/0153eadd-cea0-7e56-546c-480cefa75e0d.png)

~~~
(pros)
・独立性を高められる
・再利用ができる
・ソフトウェア開発のほとんどの領域をカバーする
~~~
~~~
(cons)
・優れた技術の集大成であるが、習熟が難しい
・用語が複雑
・比喩による弊害
・オブジェクト症候群（オブジェクトは現実世界の何物にも置き換え可能　→　共通点は万物流転になってしまう？）

~~~


▽自分の経験に基づくエピソード

自分自身がオブジェクト指向を学ぶ上で、用語がとても多くて混乱した。

~~~
 (e.x.) 
　継承、汎化、スーパークラス、インターフェース、オーバーロードetc…
~~~
耳慣れぬ「用語」ばかりなので、ひとまず調べてみる。
が、それも現実世界とリンクさせたような「比喩」ばかり。
納得できたような…できていない様な。
混乱しつつも読み進める。

いや、納得はできない。というか、しっくりこない。
その説明だとあれもこれもその比喩に当て嵌まるじゃないか？と、別のオブジェクトを持ってきて悩むという繰り返し。その結果、「オブジェクト症候群」になるというわけだ。

おお、自分の経験に当て嵌まる。

こういった人たちのためにこの本があるとのこと。

ふむふむ。読み進める価値はありそうだ。

end
Microsoftの機械学習の顔認識 API 試してみる

#はじめに

少し前に流行った[How-old.net](http://how-old.net/)のバックで使われているというなんとなく高度そうな機械学習APIを試してみました。
概要と、感想を書いてみます。

#APIの概要
こんな感じのAPIらしいです

- Microsoft Project OxfordというイギリスのMSの人たちが作ったAPI集の１つ。Face系以外にも色々ある。
- AzureのMarket Placeで購入して利用する。値段も1分間に20回以下、月5000回以下ならFreeです。それを超えてもあまり高くないですね。あまり儲ける目的じゃなさそうです。
- 顔認識と一口にいってもこんな種類がある。
    - 顔取り調べ（Face Detection）
    - 顔比較（Face Verification）
    - 顔認証（Face Identification）
    - 似てる顔表示（Similar Face Searching）
- 顔比較と顔認証の違いは、顔比較が２つの顔を比較するのに対して、顔認証は多くの人の顔情報の中から探してくる機能。顔認証の方が高度
- 精度は2次元の写真で判断できる程度。Windows Helloのように3次元で判断していないので、残念ながら精度がは高くないように感じた
- 結果は、パーセンテージで返される。同じ人である確率80％みたいな。
- REST APIで提供されており、C#などでのサンプルプログラムもそろっているので実装難易度は非常に低い
- 写真をAzureに預けて認証できる人のグループを作り、認証時にはターゲットの人の写真をアップロードして「この人はグループにいる？」と確認する方式。つまり、写真はAzureに保持される（そのままではなく必要な情報だけ取り出してデータ化されていると思われるが）。


# 感想
3次元ではなく、2次元の写真での顔認識なので、厳格な顔認証が必要な業務では使えないと思われる。間違っていもそれほど問題ではなさそうな業務、しかも顔写真とってもOKな業務って限られてくるのではないかと考えられる。
例えばレストランで客が入ってきた時に写真をとって、前回来店時の顧客関連情報を出すとかに使えるかと最初考えたが、勝手に撮るとNGだし、客に承認を求めるのも嫌がられるだろう。となると自社内のような閉じたグループでの利用になるが、お互いの身元がわかっているような閉じたグループだと、調べる方法が他のツールでありそうなので需要がなさそうに思う。

ということで、3次元で厳格な顔認証が可能にならないとほとんどの業務では使えないように感じる。

個人的に面白い機能だなと思ったは、顔取り調べ（Face Detection）機能。これは、例えば口の右端と左端の長さなどを測定してくれる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/74428/34a72fc3-a482-5dc7-33dc-684442a7f0e4.png)

測定してくれるといっても、写真の中でのピクセル座標を出してくれるという意味ではあるが、その情報から縮尺を作って顔の横幅を15センチと仮定すれば、顔の各パーツの長さが割り出せる。
最近の人の顔をモデリングするMayaやDazStudioやPorserなどのツールだと、きっとこの情報から再現できるんじゃないかなーと思う。ただ現状は顔パーツの位置情報が少なすぎるし、2次元でしかとれないので、再現性が悪すぎるが、将来的にはそういうツールができるんだろうなと可能性を感じた。

現状の３Dスキャナって、スキャンしても顔を1個のオブジェクトとして扱ってしまうから、Unityなどで動かせるようなモデルにならないけど、こうやってスキャナで長さを細かく測定して、顔モデルに反映すれば、それなりに再現性の高い動く３Dモデルが作れそうだなと感じた。

これは今ある基礎技術でできそうなので、2年以内くらいにこういうツールがでてきて、顔を数秒間撮影するだけで、超リアルなアバターが作れるようになるんだろうな。
それをアバターとして、VR空間でバーチャルおしゃべりができるようになるんだろうか。
ホロレンズのようなARを使ってリアル世界で、テーブルの対面の椅子に座らせておしゃべりするようにもできそう。

最後は妄想でした。。。。