OmniAICreator/Qiita-1.07M huggingface dataset:
freer-effectsでIOを扱ってみる

Extensible Effects の実装ライブラリの一つである [`freer-effects`](https://www.stackage.org/lts-9.0/package/freer-effects-0.3.0.1) を触ってみた時に `IO` の扱い方がすぐには分からなかったのでまとめました。結論としてはIOも **めちゃめちゃ簡単に扱えます！**

### :new_moon: Effect Monad の中でIOを使う方法

```hs
example :: Eff '[IO] ()
example = do
  name <- send $ getLine
  send $ putStrLn ("Hello " ++ name)
```

[`send`](https://www.stackage.org/haddock/lts-9.0/freer-effects-0.3.0.1/Control-Monad-Freer.html#v:send) の型は

```hs
send :: Member eff effs => eff a -> Eff effs a
```

のようになっていて `effs` の型レベルリストの中に `IO` が入っていればこれを使って `Eff` の中で `IO` アクションを使うことが出来ます。

`example` を実行するには以下のようにします。

```hs
main :: IO ()
main = runM example
```

[`runM`](https://www.stackage.org/haddock/lts-9.0/freer-effects-0.3.0.1/Control-Monad-Freer.html#v:runM) の型は

```hs
runM :: Monad m => Eff '[m] a -> m a
```

のようになっていて一つだけ効果`m`の残った`Eff`モナドをその効果を表す型に変換してくれます。今回は `Eff '[IO] () -> IO ()` と変換する役割を担ってくれています。

### :full_moon: 実行にIOを伴うハンドラを作成する方法

[freer-effects の GitHub レポジトリの README.md の Example](https://github.com/IxpertaSolutions/freer-effects#example-console-dsl) に載っている

```hs
runConsole :: Eff '[Console] w -> IO w
```

は `Control.Monad.Freer.Internal` の関数を使って実装されており、あまりお行儀がよくありません。 この `Internal` なパッケージを使わずに `Console` のハンドラを作ってみましょう。

```hs
{-# LANGUAGE TypeApplications #-}

runConsole :: (Member IO effs) => Eff (Console ': effs) w -> Eff effs w
runConsole = runNat @IO $ \eff ->
  case eff of
    PutStrLn msg -> putStrLn msg
    GetLine      -> getLine
    ExitSuccess  -> exitSuccess
```

すっきりと実装できました。 [`runNat`](https://www.stackage.org/haddock/lts-9.0/freer-effects-0.3.0.1/Control-Monad-Freer.html#v:runNat) の型は

```hs
runNat :: Member m effs => (forall a. eff a -> m a) -> Eff (eff ': effs) b -> Eff effs b
```

のようになっていて `eff` から `m` への自然変換を使って`Eff`の先頭の効果を剥がしています。
`runNat`の隣の`@IO`は [TypeApplication](https://ghc.haskell.org/trac/ghc/wiki/TypeApplication) です。 `runNat` の型に現れる `m` を `IO` に限定していて、これがないとコンパイル時の型推論に失敗します。

こうして定義した `runConsole` は次のように使います。

```hs
main :: IO ()
main = runM . runConsole $ do
  name <- getLine'
  putStrLn' ("Hello " ++ name)
```

`runConsole` で `Eff '[Console, IO] ()` を `Eff '[IO] ()`に変換した後に`runM`を使って`Eff '[IO] ()` を `IO ()`に変換しています。
Gitterのroom IDを調べる


```
http GET https://api.gitter.im/v1/rooms/ \
  "Authorization: Bearer $ACCESS_TOKEN" q==$QUERY \
  | jq '.results | .[] | {name: .name, id: .id}'
```

* ACCESS_TOKEN 
	* https://developer.gitter.im/apps から取得できる
* QUERY
	* 検索文字列 room idを調べたいチャットルーム名を入れる

# 事前準備

Macの場合の必要ツールのインストール

```
brew install httpie jq
```


# 参考文献

* [Gitter REST API | Rooms](https://developer.gitter.im/docs/rooms-resource)
* [jq](https://stedolan.github.io/jq/manual/)
* [httpie](https://httpie.org/doc)
curl で Header と遊ぶ

```bash
$ curl -v http://localhost:18888
```

```bash:request
> GET / HTTP/1.1
> Host: localhost:18888
> User-Agent: curl/7.51.0
> Accept: */*
```

```bash:response
< HTTP/1.1 200 OK
< Date: Sun, 06 Aug 2017 06:03:48 GMT
< Content-Length: 32
< Content-Type: text/html; charset=utf-8
<
<html><body>hello</body></html>
* Curl_http_done: called premature == 0
* Connection #0 to host localhost left intact
```

----

これが Response Header

```bash
> Host: localhost:18888
> User-Agent: curl/7.51.0
> Accept: */*
```

field name と value で成り立っています。

----

`http://localhost:18888/?foo=bar` へリクエストをするには、以下のような方法があります。`-G` は メソッドを GET に指定するためです。

```bash
curl -G -d "foo=bar" http://localhost:18888
curl -G --data "foo=bar" http://localhost:18888
curl -G --data-urlencode "foo=bar" http://localhost:18888
```
違いは何でしょう？

----

`--data-urlencode` のみが、URLをエンコードしてくれますので、スペースありなどのクエリをおくるときはこれを使います。

```bash
curl -G --data-urlencode "foo=bar baz" http://localhost:18888
```

----

`X-` をプレフィックスとした field name はアプリケーションが自由に使ってよいことになっています。

GitHub の Webhook などでは、`X-GitHub-Event` のような Header があったりします。

----

```bash
X-Foo: bar
```

上の Header を送信する curl はどのようなものでしょうか？

----

```bash
curl -H "X-Foo: bar" http://localhost:18888/
#or
curl --header "X-Foo: bar" http://localhost:18888/
```

とすれば、以下のようなリクエストを送信できます。

```bash
GET / HTTP/1.1
Host: localhost:18888
Accept: */*
User-Agent: curl/7.51.0
X-Foo: bar
```

----

最後に json を送る curl を紹介します。

```bash
curl -d "{\"foo\":\"bar\"}" \
  -H "Content-Type: application/json" \
  http://localhost:18888
```

`-d` オプションのデフォルト Content-Type は `x-www-form-urlencoded` となってしまいますので、`application/json` と指定しています。
インデックスを参照するループをJava8のStreamAPIで書きたい

みんな大好きStreamAPIですが、
拡張for文で書くようなループはキレイにかけますが、
ループ内部でインデックスを参照したいようなループはいまいちどうしたらいいのかわかりません。
(ぐぐっても独自クラス作っちゃうような方法がでてきたり:persevere:)  

ということでちょっと頭をひねってみました。

--------------------

「ループ内部でインデックスを参照したいようなループ」としては以下のようなケースを想定します。

- 2つ以上のリストをまとめて回したい
- 1つのリスト中の隣接する要素(`i`に対して`i-1`とか`i+1`とか)も参照したい

(`i`が参照できて、かつ好きな処理を書けるので、
「リストの最初/最後のときに処理を変えたい」とかのケースでも使えますが、
あんまりキレイじゃないかな、と思います。)

以下がコード例です。

```java
    public static void main(String[] args) {
        // 乱数で作った適当なリスト
        List<Integer> listA = new ArrayList<>(Arrays.asList(12, 23, 66, 45, 10, 48, 21, 25, 68, 65));
        List<Integer> listB = new ArrayList<>(Arrays.asList(98, 96, 4, 33, 30, 38, 39, 25, 32, 64));

        // ケース1：2つのリストをまとめて扱いたい場合
        List<Boolean> isWinnerA = IntStream.range(0, Math.min(listA.size(), listB.size()))
                .mapToObj(i -> listA.get(i) > listB.get(i))
                .collect(Collectors.toList());
        System.out.println("isWinnerAList: " + isWinnerAList);
        // -> isWinnerA: [false, false, true, true, false, true, false, false, true, true]

        // ケース2：リストの中の前後をまとめて扱いたい場合
        List<Double> movingAverage = IntStream.range(0, listA.size() - 1)
                .mapToObj(i -> (listA.get(i) + listA.get(i + 1)) / 2d)
                .collect(Collectors.toList());
        System.out.println("movingAverage: " + movingAverage);
        // -> movingAverage: [17.5, 44.5, 55.5, 27.5, 29.0, 34.5, 23.0, 46.5, 66.5]
    }
```

構成としては、

- `for(int i; i < list.size(); i++)`の部分
    - `IntStream`のファクトリメソッドで作ります
    - 例のような単純な増加なら`range(startInclusive, endExclusive)`でいけます
    - インクリメントの大きさを変えたいなら`iterate(seed, f).limit(maxSize)`とか(参照する方で`i*2`してもいいですが)
    - `generate(s)`を使えば大抵のことはできるはず
- ループ内の処理
    - `mapToObj(/* 変換処理 */).collect(/* 集約処理 */);`
    - 集約しなくて良いなら`forEach()`で済みますが。

--------------------

pro：標準で用意されてるものだけで書ける
con：Stream慣れてる人じゃないと困惑するかも

普通にfor文で書いた方がいいって言われますかね・・・？
まぁ、例に使ってる程度のものなら普通にfor文書いてもいいかもですが、`filter()`とか、集約処理とか、Streamの機能が活きるケースだと使えるかな？と思います。
何番煎じかよ！、rubyでmysql2を使いリモートのmysqlDBにSSH接続する話

# やりたかった事

定期的に行うバッチ処理やメンテナンス作業とかなども

リモート（異なるマシン）に存在するMySQL DBに対し、少しずつ条件を変えながら合致するものを受け取って、それぞれ異なる処理を行う・・・みたいな時。

手動でSQLコマンド打ち込んで処理するのは面倒。
受け取ったデータに対する処理も自動化したい。


# 概要

net-ssh-getway　を使って、MySQLサーバが存在するリモートに接続する。
接続をもとに

# ソース

論より証拠　とか　型から入る　みたいな話ですが

vagrantで作ったホストオンリー環境を参照し、総務省の自治体コードをベースにしたデータを参照し、
千葉市に属する自治体コードを持つのデータをすべて取ってくるというデモ的な処理を行っています

```ruby:接続例
require 'mysql2'
require 'net/ssh/gateway'

gateway = Net::SSH::Gateway.new(
  '192.168.33.10',
  'vagrant',
  password: 'vagrant,
  port: 22,
  keys: ['~/.ssh/ssh-key']
)

gateway.open('127.0.0.1', 3306) do |local_port|

client = Mysql2::Client.new(host: '127.0.0.1', database: 'if_kaigoworks', username: 'normal_user', password: 'normal_user', port: local_port )


  results = client.query(" select * from city_list where state_code = '12' and city_code like('10%') ")
  results.each do |row|
    p row
  end


end
```

## SSH接続の設定部分

```ruby:ssh接続
gateway = Net::SSH::Gateway.new(
  '192.168.33.10',
  'vagrant',
  port: 22,
  keys: ['~/.ssh/ssh-key']
)

```

## 接続部分

```ruby:接続部分
gateway.open('127.0.0.1', 3306) do |local_port|

client = Mysql2::Client.new(host: '127.0.0.1', database: 'if_kaigoworks', username: 'normal_user', password: 'normal_user', port: local_port )


  results = client.query(" select * from city_list where state_code = '12' and city_code like('10%') ")
  results.each do |row|
    p row
  end


end

```

## こういう描き方をしても良い

接続だけ作って、他の部分で使うことも考える


```ruby:接続をよそでも使いまわしたい
@client = nil
gateway.open('127.0.0.1', 3306) do |local_port|

client = Mysql2::Client.new(host: '127.0.0.1', database: 'if_kaigoworks', username: 'username', password: 'password', port: local_port )

@client = client

end

  results = @client.query(" select * from state_city_tags where state_code = '12' and city_code like('10%') ")

  results.each do |row|
    p row
  end

```

# 実施結果

sshのパスワードを求められるので、入力する。
正しければスクリプトが走り、MySQLサーバに接続しSQLが実行され

```bash:実施例
$ ruby mysql_connect.rb 
vagrant@192.168.33.10's password:
{"id"=>611, "state_code"=>"12", "city_code"=>"1002", "state_name"=>"千葉県", "city_name"=>"千葉市"}
{"id"=>612, "state_code"=>"12", "city_code"=>"1011", "state_name"=>"千葉県", "city_name"=>"千葉市中央区"}
{"id"=>613, "state_code"=>"12", "city_code"=>"1029", "state_name"=>"千葉県", "city_name"=>"千葉市花見川区"}
{"id"=>614, "state_code"=>"12", "city_code"=>"1037", "state_name"=>"千葉県", "city_name"=>"千葉市稲毛区"}
{"id"=>615, "state_code"=>"12", "city_code"=>"1045", "state_name"=>"千葉県", "city_name"=>"千葉市若葉区"}
{"id"=>616, "state_code"=>"12", "city_code"=>"1053", "state_name"=>"千葉県", "city_name"=>"千葉市緑区"}
{"id"=>617, "state_code"=>"12", "city_code"=>"1061", "state_name"=>"千葉県", "city_name"=>"千葉市美浜区"}
```

クエリの内容通り、state_codeが"12"（文字）かつ、city_codeが"10"で始まるレコードの一覧が取れた
（この場合、state_code="12"が千葉県で、city_code like('10%') が、千葉市の区分になる）

# 参考

RubyでSSHトンネル経由でサーバにアクセスする
http://qiita.com/yuku_t/items/03e2e507add1cd2e2a40

http://www.soumu.go.jp/denshijiti/code.html
Zshでswapファイル(.swp)をTab補完しないようにしたい

# 方法
とってもかんたん
しらべたら.zshrcにこれを書くだけだった

```shell
zstyle ':completion:*:*files' ignored-patterns '*.swp'
```

# 応用
勘のいいみなさんならお分かりかと思いますが、

```shell
zstyle ':completion:*:*files' ignored-patterns 'ここ'
```

に書いたものがTab補完でサジェストされなくなります
無視したいものをどんどん突っ込んでやってくださいませ


## 参考
[zshのzstyleでの補完時の挙動について](http://voidy21.hatenablog.jp/entry/20090902/1251918174)
瞑想の一つの手段としてのソースコードリーディング

最近、ソースコードリーディングが瞑想の一つの手段として使えるんじゃないかと思っている。

https://cybozushiki.cybozu.co.jp/articles/m000316.html

ここでは、「ソースコードリーディングは座禅に似ている」と書いてある。
もちろん、改修目的での、目的を持ったソースコードを読むの時は違うかもしれないが、例えば、趣味でソースコードを眺める。勉強でソースコードを眺める時は、だんだん瞑想に近い状態に変えていくことが可能かもしれない。
もちろん、「改修フェーズでのソースコード読み」が必要なように、「趣味や勉強でソースコードを眺めること」も必要である。両者は両輪のようになっていて、片方がなくなると、意味がなくなる。
自然言語の場合は、表している意味が誰の目にも明確である。だが、ソースコードの場合は、ソースコードのその部分がなんの意味を持つのか、全体的な構造を頭に入れないと知ることはできない。
言い換えれば、一部分に集中しすぎても行けないし、全体に発散しすぎてもいけない、ある部分に、あまりにも意味を求めすぎると苦しくなるし、全く意味を求めないとこれも逆に苦しくなる。成果を焦るとダメだし、成果を求めなくてもダメだ。
明確に意味がわかっていることは稀なので、曖昧さに耐えないとけない。
今に集中しないと、ソースコードを読むことはできない。
ロジックの流れを感じないといけないし、それは、川の流れを見るようなものだと思う。
読者にはクリスチャンやイスラム教徒もいるかもしれないが、個人的には、ソースコードを読んで理解する、ことが、仏教的な修行になるんじゃないかと思っている。
もちろん科学的な根拠なんてないし、誰かえらい人が研究してほしいなと思う。
バンデューラという、認知行動療法のえらい人は、１９７７年に著した論文の中で以下のように述べています。

「人は単に刺激に反応しているのではない。刺激を解釈しているのである。刺激が特定の行動の生じやすさに影響するのは、その予期機能によってである。刺激と反応が同時に生じたことによって、自動的に結合したためではない」

https://www.amazon.co.jp/%E8%AA%8D%E7%9F%A5%E8%A1%8C%E5%8B%95%E7%99%82%E6%B3%95-%E5%9D%82%E9%87%8E-%E9%9B%84%E4%BA%8C/dp/453556017X

https://www.uky.edu/~eushe2/Bandura/Bandura1977PR.pdf

つまり、ソースコードリーディングが辛くなるのは、それに対する「反応」があんまり正しくないものだったりする。つまり、ソースコードリーディングに対する「正しい反応」を身につけることによって、ソースコードリーディングができるようになるのではということだ。

あと、僕自身の持っている仮説として、「人間が何かを眺めていると、自分では何も考えていないように見えても、処理はちゃんと進んでいる」というものがある。言い換えれば、「僕自身が（あるいはあなたが）ソースコードを眺めている時は、自分では何も考えが進んでいないように見えても、脳は解釈するための処理を進めている」というものである。睡眠中に脳内でソースコードの処理が進んでいるのかもしれない。
言い換えれば、最初は眺めているだけでいい、わけわからなくていい、毎日読むこと。睡眠はちゃんと取ること。飯食うこと。歯を磨くこと。読書百遍義自ら見る。そういう戦略で僕は読んでいる。
この戦略は、おそらくソースコード読み特有の戦略だ。日本語、英語などの自然言語では違う戦略だ。僕の今書いている文章を日本人で理解できないことは稀だろう。それは、日本語が人に明示的に意味を伝えるための言語だからだ。でも、Linxuカーネルが、ほとんどのC言語プログラマーに理解できるであろうか。
だが、コンピュータ言語は、それがプログラマーにとってどういう意味を持つか、コンピュータ内でどう動くかが、明確な言語で書かれておらず、その構造自体に意味があったりする。
その構造を把握する必要があるんじゃないだろうか。
多分、ソースコード読みと、自然言語読みにおいての違いは、「単位時間当たりに取得できる意味の量」という側面もあると思う。
ソースコード読みの場合は、構造の情報はいっぱい入ってくるけど、意味は自分で見出さなくてはいけない。逆にこういう状況は、一度意味を取得できたら、感動するし、忘れないんだと思う。
その取得した、「意味」は、あなたが発見したものだ。そういう意味で、僕はソースコード読みの方が快適に勉強できる。
Googleの総サーバ数/総メモリ容量をフェルミ推定してみた

# きっかけ
[Cloud Functions for FirebaseとFirebase Hostingを連携させる](http://qiita.com/hnw/items/dc0a66e34e2b0ace69ff) より
nodeinfo「total memory	**3.3 EB**」
やちま「ぱなさ極まってる」
hnw氏「それホントに正しい値なんですかね…？」

# tl;dr
推定の結果，
Googleの総利用サーバ数：**3000万**くらい
Googleの総メモリ容量：**3EB**くらい
（フェルミ推定なので桁がズレない程度の誤差は十分あり得る）

# 手順
- データセンターの数を知る
- 1データセンターの面積を求める
- ラックあたりの専有面積，サーバ数を求める
- サーバあたりのメモリ容量を知る

# Googleのデータセンターの数
https://www.google.com/about/datacenters/inside/locations/
上記より，少なくともデータセンターは15箇所ある．
日本など間借りしているところが抜けているので，実際はもっと多い．

https://cloud.google.com/compute/docs/regions-zones/regions-zones
上記（英語版が最新）によれば，現在GCPで利用されているのは11箇所，うち5箇所がGoogle自前．
総数21箇所．

# データセンターの面積
例えばBerkeley Countyのデータセンターの場合
![Screenshot 2017-08-06 at 13.18.38.png](https://qiita-image-store.s3.amazonaws.com/0/17440/de23ed01-d0c9-98eb-fb0a-4c82359afcd4.png)
まぁ右下のスケールバー的に，$40,000m^2$はいけるっしょ（雑）
　
# ラックあたりの専有面積
　
Googleのラックはオリジナルで，一般的なものより少し小さい．
オープンソースになっている[^1]ので確認しようとしたが，ダウンロード遅く断念．
　
一般的なラックはざっくり$500mm*900mm$[^2]
通路やら諸々で多めに見積もり$1000mm*1000mmとする$．
$1000mm * 1000mm = 1m^2$ 

# ラックあたりのサーバ数
https://www.google.com/about/datacenters/gallery/
![Berkeley County](https://www.google.com/about/datacenters/gallery/images/_3000/MNK_005.jpg)
![Douglas County](https://www.google.com/about/datacenters/gallery/images/_3000/IDI_018.jpg)
写真より，平均30程度は重ねている様子．

# サーバあたりのメモリ容量
オープンソースになっている[^1]のが確認できず悔やまれる．
例えばPowerEdge R940では最大 $32GB*24$の構成が可能[^3]だが，Googleはスケールアップよりスケールアウトの方針が得意であるため，そこまでハイスペックではないだろう．
$128GB$と仮定する（雑）．

# 結論
$21 * 40,000m^2 / 1m^2 * 30 = 25,200,000$ （Googleの総利用サーバ数）
$128GB * 25,200,000 = 3.2256EB$（Googleの総メモリ容量）
というわけで，`'Datacenter"s" as a computer'` などという凄まじいシステムが本当に実現できているとすれば[^4]， `total memory 3.3EB` も実際の値として有り得ない話ではないように思う．

# えにーくえすちょん？
ご指摘，ご質問など全裸待機．
ハードは全くの門外漢なので．

　

[^1]: http://www.opencompute.org/wiki/Server/Working
[^2]: http://itpro.nikkeibp.co.jp/article/COLUMN/20070912/281742/
[^3]: http://configure.apj.dell.com/dellstore/config.aspx?oc=r940xv8301jp&model_id=poweredge-r940&c=jp&l=ja&s=bsd&cs=jpbsd1
[^4]: `'Datacenter as a computer'` は以前から公になっている．http://www.publickey1.jp/blog/13/the_datacenter_as_a_computerpdf.html など
Kaggleにユニクロ(ファストリ)株価予測データセットを投稿してみた

2016年のファーストリテイリング(ユニクロ)の株価予測を題材にしたデータセットをKaggleに投稿しました。これから仲間とKernel作って結果を共有していきます。
みなさん、予測モデルもし作ってみて上手くいったら(上手く行かなくても)是非Kernelに投稿してみてください。

<img width="976" alt="スクリーンショット 2017-08-06 14.49.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/76304/5e7aea29-1071-4b7d-a918-19b2ee56d692.png">


https://www.kaggle.com/daiearth22/uniqlo-fastretailing-stock-price-prediction

機械学習勉強会を毎日渋谷でやっているので、そこで仲間を集め問題解決に挑戦します。
これからFinTech Data Hackathon、Medical Data Hackathonを増やしていきます。
https://www.meetup.com/Machine-Learning-Meetup-by-team-ai/
javascriptのプロトタイプオブジェクトについて

#Javascriptのプロトタイプオブジェクトについて調べてみた。

※ご指摘により、色々勘違いしていることがわかりました。
近々きちんと修正したいと思います。


##プロトタイプとは？

まず、javascriptはプロトタイプベースオブジェクト指向言語です
<b>プロトタイプベースオブジェクト指向言語</b>とは、どのオブジェクトもクラスという雛形に属している<b>クラスベースオブジェクト指向</b>(javaとかrubyとか)とは異なり、オブジェクトは別のオブジェクトをベース（プロトタイプ）にして独自の特徴を追加していく方式の言語のことです。

プロトタイプとはこの方式の中のベースになるオブジェクトのことを言います。

###まずオブジェクトを作っていきます(ES6)

```.js
class Animal {
  constructor(name, type) {
    this._name = name;
    this._type = type;
  }
}

const cat = new Animal("cat", "mammals");
```

javascriptのclassは単なる関数のシンタックスシュガーなので
ここでクラスanimalは関数オブジェクトです

次の行
`const cat = new Animal("cat", "mammals");`
でプロパティ__proto__にAnimalのプロトタイプオブジェクトを継承します。
console.log(cat.prototype)でcatのprototypeを参照できます
確認して見てください。

##暗黙の参照
上で作成したオブジェクトについてもう少し考えてみます

プロトタイプベースオブジェクト指向の言語ではオブジェクトは別のオブジェクトをベース(プロトタイプ)に出来ていると考えます。
それを実現するためにjavascriptでは暗黙の参照という形で実現しています。

例えば次のようなコードがあったとしましょう

```.js
class Animal {
  constructor() {
  }
}

Animal.prototype.hoge = "hoge";

const cat = new Animal("cat", "mammals");
console.log(cat.hoge); //"hoge"
```

このコードではオブジェクトAnimalをプロトタイプとしたcatというオブジェクトが作られています。
catはhogeと言うプロパティを持っていませんが、hogeと出力さます。

これはjavascriptが暗黙の参照を行い、Animalのプロトタイプオブジェクトを暗黙的に参照しているのです。
consoleへの出力は
`hoge`
となります。

##prototypeチェーン
通常、オブジェクトのプロパティにメソッドが見つからない場合、そのプロトタイプを探します（暗黙の参照）。
それでも見つからない場合はそのプロトタイプのプロトタイプを参照します。
最終的に一番上のプロトタイプからも見つからなかった場合はエラーを返します。
連鎖となって暗黙の参照をするのでプロトタイプチェインと呼ばれています。

例以下のコードを考えます

```.js
class Animal {
  constructor() {
    this.zoo = [];
  }

  addAnimals(animal) {
    this.zoo.push(animal);
  }
}

class Cat extends Animal {
  constructor() {
    super();
  }

  sayCat() {
    console.log("う＝！にゃー！うー！にゃー！");
  }
}

const cat = new Cat();
cat.addAnimals("チョコ");
console.log(cat.zoo);

```

まず、AnimalとCatというクラスが作られており、
extendsによってCatはAnimalを継承しています。

##まとめ

javascriptはあるオブジェクトをベースにして新しくオブジェクトを作る方式のオブジェクト指向言語である。
プロトタイプとはこのベースとなるオブジェクトのことである。
javascriptのオブジェクトは暗黙にプロトタイプのオブジェクトのプロパティを参照することがある。

参考 http://codezine.jp/article/detail/222
macOS Sierra + Python + Pygameでキー入力出来る環境を構築する

#環境
- macOS Sierra(10.12.6) 
- Python(3.6.2) 
- Pygame(1.9.3)

#初回
pythonのインストール、仮想環境作成、pygameのインストール。
※homebrewはインストール済みであること

```
$ brew install python3
$ python3 -m venv venv
$ source myenv/bin/activate
(venv) $ pip install pygame
(venv) $ deactivate 
```

#毎回
```
$ source venv/bin/activate
(venv) $ python hoge.py
(venv) $ deactivate 
```

# 注意点
pyenvのpythonだと動かない

#参考文献
- [Homebrew — macOS 用パッケージマネージャー](https://brew.sh/index_ja.html)
- [venvを使ったmacOSのPython開発環境2016 - Qiita](http://qiita.com/shinespark/items/1d6ec0de89aa537da505)
- [Python3_PyGame で2Dゲーム制作 - Qiita](http://qiita.com/ken_3982/items/f06a71636ad888af699d)
MySQLでindexを一時的に利用したい


indexの貼り方がa, bの複合キーとなっていて
bに直接index貼られてない状態で
bについて重複しているデータの確認をする必要があったため
下記のようなクエリを流したところ

```
mysql> select b, count(id) count from HOGE group by b having count(id) > 1;
```

bでgroup byしようとしたらめっちゃ時間かかる。
(あまりに遅いので途中でキャンセルした。)

複合インデックスでは順になっていないとインデックス利用できないので
aだけならともかく、bだけだとちゃんと効かない

ちなみにexplainで確認するとこんな感じ

```mysql
mysql> explain select b, count(id) from HOGE group by b having count(id) > 1;
```

| id | select_type | table         | type  | possible_keys                               | key                  | key_len | ref  | rows    | Extra                                        |
|----|-------------|---------------|-------|---------------------------------------------|----------------------|---------|------|---------|----------------------------------------------|
|  1 | SIMPLE      | HOGE          | index | key_a_b, index_a_b                          | key_a_b | xxx     | NULL | xxxxxxx | Using index; Using temporary; Using filesort |

Using temporaryとUsing filesortがついてしまっている。
ちなみにa,bでgroup byすればちゃんとインデックス効いている事は確認済み

```mysql
mysql> explain select a, b, count(id) from HOGE group by a, b having count(id) > 1;
```

| id | select_type | table         | type  | possible_keys                               | key                  | key_len | ref  | rows    | Extra       |
|----|-------------|---------------|-------|---------------------------------------------|----------------------|---------|------|---------|-------------|
|  1 | SIMPLE      | HOGE | index | key_a_b, index_a_b | key_a_b | xxx     | NULL | xxxxxxx | Using index |

とはいえ調査のためだけなのでできれば元のテーブルにインデックス追加はしたくない。

# temporary tableの作成

仕方ないので改めてbだけにindex貼ったtemporary tableを作って確認する。

```mysql
create temporary table `tmp_table` 
(
  a bigint(20),
  b varchar(255),
  index b_index(b)
)
engine = MyISAM
as
(
  select HOGE.a, HOGE.b
  from HOGE
);
```

InnoDBだとテンポラリテーブル作成に時間かかったので
engineにMyISAMを指定している。
調査用に一時的に使うだけのテーブルだし
トランザクションとかは特に使わないので問題はないはず。

で重複しているbがあるかチェック

```
select b, count(b) from tmp_table group by b having count(b) > 1;
```

ちなみにexplainの結果は下記

```
mysql> explain select b, count(b) from tmp_table group by b having count(b) > 1;
```

| id | select_type | table      | type  | possible_keys | key         | key_len | ref  | rows    | Extra       |
|----|-------------|------------|-------|---------------|-------------|---------|------|---------|-------------|
|  1 | SIMPLE      | tmp_table | index | b_index   | b_index | xxx     | NULL | xxxxxxx | Using index |

ちゃんとUsing indexだけになってる。
ちなみに重複はめっちゃありました。

## 参考

[MySQL 5.6 リファレンスマニュアル](https://dev.mysql.com/doc/refman/5.6/ja/create-table-select.html)
Windowsでもカスケードトレーニング時には、TBBを有効にしてビルドしたバイナリを使うとはかどる。

メモです。
チラシの裏です。

表題の通りです。
opencv_traincascade.exeのソースコードを見たらTBBを生で使ってマルチスレッド処理をしてましたので、これだけのためにTBB込みのビルドをしたら、とてもはかどりました。

-precalcValBufSize と -precalcIdxBufSize もデフォルトですと1024なのですが、これを4096とかにすると、さらにはかどりました。

OpenCV3では、パラレルフレームワークはラップされており、特にWindowsでは、TBBはあんまり早くないということで、この頃はCMAKEオプションに入れませんし、デフォルトでOFFですが、こういうコードも残っているのですね。
しかしながら、コード修正したり、PRしたりする実力はないので、場当たり的にTBBを有効にして対処しました。

世の中3.3なのに、HAVE_TBBとかおくれてますねえ。


私が試した感じでは、正解1000枚、不正解230枚くらいで15ステージだと、メモリのサイズを大きくすると時間が半分くらいになり、さらにTBBを使うとその3/4くらいになります。

さらに場当たり的なことを思いつきました。opencv_traincascade.exeだけTBBを有効にしてコンパイルしたら良いかも！(ソースコードは触りたくない男！)

さらにJPEGをTurboJPEGに差し替えたり、ZLIBをアセンブラつかっているバージョンに差し替えればさらに幸せになれそう！

ということで、ZLIBとJPEGを差し替え、opencv_traincascade.exeだけTBBを有効にしてチャレンジしたら、また少し早くなりました。20ステージで32分だったのが24分になりました。
しかし、こんな場当たり的なやり方では、
・ZLIBを差し替えたからPNGの展開が早くなった
・LIBJPEGを差し替えたからJPEGの展開が早くなった
・OPENCVのライブラリは標準のパラレルが効いていて、かつopencv_traincascade.exeではTBBが効いているので早くなった
どれが効いたのか全くわかりませんね。。場当たり的で、なんとなく早くなったという、インドの究極奥義バータリーと言えます。
思いつきでなんとなくウマくいったという話です。


ご参考まで。
Raspberry Pi (Pi3 Raspbian 7.0 Jesssie) でHomebridgeをdaemon化するために、systemdに登録する


# 前提
1 homebridgeのpathが/usr/local/bin/homebridgeである

```bash
which homebridge
```

2 homebridgeのconfig fileを一旦、~/.homebridge/config.jsonに作成した
## Homebridge daemon用のアカウントと設定ファイル用のdirを作成

```bash
# Add a new user for homebridge process
sudo useradd --system homebridge
# Add a new dir fot homebridge process to refer
sudo mkdir /var/homebridge
sudo chown homebridge:homebridge /var/homebridge/
```

## systemd用の設定ファイルを作成する

下記の内容で、/etc/default/homebridgeを作成する

```ini
# Defaults / Configuration options for homebridge
# The following settings tells homebridge where to find the config.json file and where to persist the data (i.e. pairing and others)
HOMEBRIDGE_OPTS=-U /var/homebridge

# If you uncomment the following line, homebridge will log more 
# You can display this via systemd's journalctl: journalctl -f -u homebridge
# DEBUG=*
```

下記の内容で、/etc/systemd/system/homebridge.serviceを作成する

```ini
[Unit]
Description=Node.js HomeKit Server 
After=syslog.target network-online.target

[Service]
Type=simple
User=homebridge
EnvironmentFile=/etc/default/homebridge
# Adapt this to your specific setup (could be /usr/bin/homebridge)
# See comments below for more information
ExecStart=/usr/local/bin/homebridge $HOMEBRIDGE_OPTS
Restart=on-failure
RestartSec=10
KillMode=process

[Install]
WantedBy=multi-user.target
```

## Homebridge daemon用の設定ファイルを作成する

```bash
# Cope existing config file and accesory info files for homebridge
sudo cp ~/.homebridge/config.json /var/homebridge/
sudo cp -r ~/.homebridge/persist /var/homebridge
sudo chmod -R 0777 /var/homebridge
```

## Daemon起動
```bash
sudo systemctl daemon-reload
sudo systemctl enable homebridge
sudo systemctl start homebridge
```

## 参考
https://gist.github.com/johannrichard/0ad0de1feb6adb9eb61a/

EOF
Check! 試用版 Azure Web Apps の WordPress テンプレートのデータベースは？

こんにちは、 @dz_ こと大平かづみです。

Prologue - はじめに
====
試用版 Azure Web Apps で WordPress のテンプレートを使用した場合のデータベースについて観察してみました。

どうやら、Azure Web Apps の MySQL In App を使うようです。(･ω･)ﾉ

試用版 Azure Web Apps の WordPress のデータベースをみてみる
====
試しに、[試用版の Web Apps](https://azure.microsoft.com/ja-jp/try/app-service/web/?language=php) で、 WordPress のテンプレートを選択して作成してみます。作成した WordPress をひらくと、初回の管理者情報を入力した後、データベースの設定ができていないという警告が表示されます。

ですが、その警告を無視して記事を書いてみると、ちゃんと保存されます！

## データベースは？

どういうことかしら？

`wp-config.php` のデータベース設定をみてみましょう。

実は、 MySQL In App と呼ばれる Azure Web Apps に内蔵された MySQL へ接続する処理が差し込まれているのでした。

```php:wp-config.php
// ... <略> ...

$connectstr_dbhost = '';
$connectstr_dbname = '';
$connectstr_dbusername = '';
$connectstr_dbpassword = '';

foreach ($_SERVER as $key => $value) {
    if (strpos($key, "MYSQLCONNSTR_") !== 0) {
        continue;
    }
    
    $connectstr_dbhost = preg_replace("/^.*Data Source=(.+?);.*$/", "\\1", $value);
    $connectstr_dbname = preg_replace("/^.*Database=(.+?);.*$/", "\\1", $value);
    $connectstr_dbusername = preg_replace("/^.*User Id=(.+?);.*$/", "\\1", $value);
    $connectstr_dbpassword = preg_replace("/^.*Password=(.+?)$/", "\\1", $value);
}

// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define('DB_NAME', $connectstr_dbname);

/** MySQL database username */
define('DB_USER', $connectstr_dbusername);

/** MySQL database password */
define('DB_PASSWORD', $connectstr_dbpassword);

/** MySQL hostname */
define('DB_HOST', $connectstr_dbhost);

// ... <略> ...
```

もう少し種明かしをすると、MySQL In App の接続情報は、 `MYSQLCONNSTR_localdb` という環境変数として提供されていて、以下のようなフォーマットの文字列です。

```sql:MYSQLCONNSTR_localdb
Database=localdb;Data Source=127.0.0.1:<ポート番号>;User Id=azure;Password=<パスワード>
```

ですので、 `wp-config.php` では、この環境変数をパースしてそれぞれ設定している、という種明かしでした！

Epilogue - おわりに
====
小ネタですが…、これを応用すると、簡単に MySQL In App を使えそうですね！
とにかく簡単にDockerでRuby on Railsを動かしてみる(初心者向け)

## Railsチュートリアルの環境をサクッと作る

Railsチュートリアルを見ているとCloud9を利用しているが、Dockerでサクッと環境を作りたいと思った。調べているとDockerでRailsを動かすという記事はたくさん見つかるが、DBのコンテナをdocker-composeとかで管理していたり、簡単にとりあえずRailsを試してみたい時に参考にする記事があまりなかった。Dockerfileも利用せずにruby:2.4.0をベースにRailsを動かしてみる。

## 手順

環境: macOS Sierra

- まずDockerをインストールする。Docker for Macで良い。

- 作業ディレクトリに移動する
    - ここでは`/path/to/sample`とする
    - `cd /path/to/sample`としておく

- rubyのイメージを元にDockerのコンテナを作って、そこで`rails new`する
    1. `docker run -it -p 3000:3000 -v "$PWD":/usr/src ruby:2.4.0 /bin/bash`
        - これで新しく作成されたコンテナに入る。以下2~5はコンテナ内で実行する。
        - `-it`と`/bin/bash`をつけるとコンテナ内に入る。
        - `-p 3000:3000`でポート3000を指定。
        - `-v "$PWD":/usr/src`でローカルのカレントディレクトリとコンテナの`/usr/src`が同期される。テキストエディタでローカルでファイルをいじるとブラウザに反映されるようになる。
        - `ruby:2.4.0`でベースイメージを指定。
    2. `cd /usr/src`
    3. `gem install bundler`
    4. `gem install rails`
    5. `rails new sampleAPP` (sampleAPPのところは好きなアプリ名で良い)

- Gemfileを修正してサーバを起動する
    1. 好きなテキストエディタで先程作成されたGemfileを開き、`therubyracer`の行のコメントアウトをはずす
    2. 再びコンテナ内でsampleAPPにて`bundle install`
    3. そのまま`rails s`

## 確認する

- `localhost:3000`で確認する

![image.png](https://qiita-image-store.s3.amazonaws.com/0/122365/96663367-e11f-b862-60cc-12d3baca5d82.png)

## 備考

コンテナからは`exit`で抜けることができる。
そうすると中に入る時は再びコンテナを起動してログインする必要がある。

`docker ps -a`でCONTAINER ID（`HOGEHOGE`だとする）を確認してから、`docker start HOGEHOGE`として`docker exec -it HOGEHOGE /bin/bash`で入れる。

`bundle install`とかのコマンドは中に入って実行すればいい。

実際に運用する時にはDockerfile書いて、docker-composeで管理するべきだが、試しにRailsを動かしてみたい時にはこれで十分だと思う。
bat 日付入りのログファイル出力する

ログファイル出力するにはリダイレクトさせる、リダイレクトには`>` を使う

```bat:
echo hoge > fuga.log
```
追記するには`>>`とする、ログファイルなら普通はこの方法

```bat:
echo hoge >> fuga.log
echo piyo >> fuga.log
```

で、このファイル名に日付や時刻をセットすれば、よりログファイルっぽくなる。

ということで、
環境変数の文字列切り出しなどを使ってやってみる

```bat:
set dt1=%date:~0,4%%date:~5,2%%date:~8,2%
set tm1=%time:~0,2%%time:~3,2%%time:~6,2%
set fname1=%dt1%_%tm1%.log
```
時刻のフォーマットで　空白文字が出て困る場合は、文字変換などを使うなどして、もう一工夫

```bat:
set dt2=%date:~0,10%
set dt2=%dt2:/=%
set dt2=%dt2: =0%

set tm2=%time:~0,8%
set tm2=%tm2::=%
set tm2=%tm2: =0%

set fname2=%dt2%_%tm2%.log
```

あとは

```bat:
echo hoge >> %fname2%
echo piyo >> %fname2%
```
とかまあ

<font color="CadetBlue"><i><a href='http://ameblo.jp/tcexternal/entry-10468927916.html'>別ブログに掲載していた記事</a>をQiitaに掲載</i></font>
WindowsでVPN(IPsec)の設定

#IPsec NATトラバーサルを有効にする

以下のファイルをクリックしてレジストリを書き換えないとIPsec NATトラバーサルが有効にならない。

```NAT-T.reg
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PolicyAgent]
"AssumeUDPEncapsulationContextOnSendRule"=dword:00000002

```

#以下駄文
毎回毎回この設定を忘れて焦る。
今回もGPD pocketが来たので、お外でVPN接続を試みて失敗して”MACで弾いていたかな？”と思って
家に帰ってあれこれ試行錯誤してから思い出すというありさま。
Qiitaに書いておけばもう忘れないだろう。忘れてもQiita見て思い出せ、俺。
jQueryとCSSでシンプルなタブ切り替え

#jQueryとCSSでシンプルなタブ切り替え

##条件
・カレント表示もできるタブ切り替え
・なるべくシンプルな記述
・html構造や装飾が変わっても使いまわせる

##HTML

``` html:html
<div class="ChangeElem_Btn_Content">
  <button class="ChangeElem_Btn">1番目のタブ</button>
  <button class="ChangeElem_Btn">2番目のタブ</button>
  <button class="ChangeElem_Btn">3番目のタブ</button>
</div>
<ul>
  <li class="ChangeElem_Panel">1番目のコンテンツ</li>
  <li class="ChangeElem_Panel">2番目のコンテンツ</li>
  <li class="ChangeElem_Panel">3番目のコンテンツ3</li>
</ul>
```
[補足]
・タブに `class="ChangeElem_Btn"` を、中身に ' `class="ChangeElem_Panel"` を付与します。
・何番目のタブをクリックしたら何番目の要素を表示という考え方なので、タブも中身もちゃんと上から順番に並べます。
・`ChangeElem_Btn_Content`は装飾と可読性の関係で残しています。　無くても機能上支障はありません。html構造についてもbtnでなくてもulでなくても大丈夫です。

##CSS

###タブの中身を初期非表示
``` css:css
.ChangeElem_Panel{
  display: none;
}
```
[補足]
・タブの中身を一旦隠しています。
・これをベースに使い回す前提のため、タブ自体の装飾は割愛しています。初期1番目のタブとカレントタブに `is-active` クラスがつきますので、 `is-active` クラスの有無でカレントと通常時のタブの装飾を切り替えています。
[→サンプルはこちら](http://chinatsu.work/ex_004/)

##jQuery
``` javascript:jQuery
$(function () {
  /*初期表示*/
  $('.ChangeElem_Panel').hide();
  $('.ChangeElem_Panel').eq(0).show();
  $('.ChangeElem_Btn').eq(0).addClass('is-active');
  /*クリックイベント*/
  $('.ChangeElem_Btn').each(function () {
    $(this).on('click', function () {
      var index = $('.ChangeElem_Btn').index(this);
      $('.ChangeElem_Btn').removeClass('is-active');
      $(this).addClass('is-active');
      $('.ChangeElem_Panel').hide();
      $('.ChangeElem_Panel').eq(index).show();
    });
  });
});
```

###最後に
とにかくシンプル。かつ、html構造や装飾が変わってもささっと使いまわせるように作ってます。
[→サンプルはこちら](http://chinatsu.work/ex_004/)
Docker Hubにloginしようとしたら、net/http: request canceled while waiting for connection

ゲストOSからDocker Hubにイメージをpushするために、loginしようとしたら、<code text>net/http: request canceled while waiting for connection''</code>というエラーになって失敗しました。

# 実行コマンド #

```text:
$ sudo docker login
```

# 実行結果 #

```text
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: ******
Password: ******
Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
```

# 解決方法 #

DNSサーバをDHCPサーバ（ホストOS）に任せるのではなく、直接指定するとloginできるようになりました。

```text:修正前
PEERDNS=yes
IPV6_PEERDNS=yes
```

```text:修正後
PEERDNS=no
IPV6_PEERDNS=no
DNS1=8.8.8.8
DNS2=***.***.***.***
DNS3=***.***.***.***
```

# 環境 #

* Windows 10（ホストOS）
* VirtualBox 5.1.26
* CentOS 7.3.1611（ゲストOS）
* docker 1.12.6

# 出典 #

[Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection](https://github.com/moby/moby/issues/30876)
Windows 10 Mobile : How to add japanese keyboard 


## can't add japanese keyboard ?
1. Settings -> Time & Language -> Keyboard
    - [ ]  Japanese 12 Key
    - [ ]  Japanese QWERTY

2. When check on to install :
     *Attention Required,* *retry to download the Text Suggestions*, *Preparing Download* never success

## How to install japanese keyboard ?
1. Setting -> Time & Language -> Speech
2. **Download a speech language -> Add a language**
    - [ ]  Japanese
3. after download reboot
4. Settings -> Time & Language -> Keyboard
    - [x]  Japanese 12 Key
    - [x]  Japanese QWERTY


## Note:
- Once Speech language Installed, cannot be removed except full-reset of Windows 10 Mobile .... :cry:



![wp_ss_20170806_0001.png](https://qiita-image-store.s3.amazonaws.com/0/114634/6113310c-4fe1-bfd2-b178-10924a8dd547.png)
sql group by で複数条件を集約し、そのグループ内の件数を出したい

どうも`count()`の返す答えが分かっていないかも

例えばこのような
[salary_sample]

|name|dept|salary |
|-----|---------|:-----------|
|鈴木|  管理部|    300000| 
|高橋|  管理部|    400000|
|佐藤|  開発部|    500000| 
|小林|  開発部|    500000| 
|山本|  開発部|    200000| 
|青木|  開発部||   
|鈴木|  開発部|    400000| 

というテーブルがあって

```sql:
SELECT
    count(*)
    , count(salary)
    , count(DISTINCT salary) 
FROM
    salary_sample; 
```

としてやると

|  COUNT(*)| COUNT(SALARY)| COUNT(DISTINCTSALARY)|
|---------:| ------------:| --------------------:|
|         7|             6|                     4|
         
という結果が得られる。

複数の条件で集計をしてみると

```sql:
SELECT
    dept
    , salary
    , COUNT(*)
    , COUNT(salary)
    , count(dept)
    , count(name) 
FROM
    salary_sample 
GROUP BY
    dept
    , salary; 
```
|DEPT      |SALARY  |COUNT(*) |COUNT(SALARY) |COUNT(DEPT) |COUNT(NAME) |
|----------|-------:|--------:|-------------:|-----------:|-----------:|
|管理部     |  300000|        1|             1|           1|           1|
|開発部     |        |        1|             0|           1|           1|
|開発部     |  400000|        1|             1|           1|           1|
|開発部     |  500000|        2|             2|           2|           2|
|管理部     |  400000|        1|             1|           1|           1|
|開発部     |  200000|        1|             1|           1|           1|
これらの結果から

```
count(*) nullも含めてその行数を返す
count(カラム名) そのカラムのnull以外の記述のある行数を返す
※ただし、集計するカラム以外も指定することができる
(ここらへんがなぜそうなっているのかが不思議だが)
```
ということで　本題の`group by`で複数条件を集約し、そのグループ内の件数を出したい時は

```sql:
SELECT
    カラム1
    , カラム2
    , count(カラム1)  -----nullが含まれていないカラムを指定
FROM
    テーブル 
GROUP BY
    カラム1
    , カラム2
```
としてやるのが無難なのかな



<font color="CadetBlue"><i><a href='https://ameblo.jp/tcexternal/entry-10753677298.html'>別ブログに掲載していた記事</a>をQiitaに掲載
しかしこの元記事　細々とアクセスされているのだけど、なんでだろう</i></font>
IOUSBのサンプルプログラム

Mac OS XのIOUSBFamilyのサンプルプログラムに[USBNotification Example](https://github.com/opensource-apple/IOUSBFamily/tree/master/Examples/USBNotification%20Example)というものがあります。

このアプリは2003年くらいに作られて、EZ-USB(FX2じゃないオリジナル)をターゲットにしたプログラムです。

EZ-USBは初期のUSB内蔵8051系ワンチップマイコンで、今みたいにフラッシュは無くて、機能させるにはUSBからプログラムをRAMにダウンロードして実行するかI2CのEEPROMにプログラムを入れておいてRAMにロードするかのどちらかになりました。RAMにロードしたプログラムは電源が切れると消えるので、再度ダウンロードする必要があります。

このサンプルプログラムではUSBのデバイスの認識とファームウエアの転送して、ファームウエアのデバイスを再認識して、ファームウエアへのデータ転送をおこなっています。

手元にちょうど通信用ケーブルで使われていたEEPROMをはがしたEZ-USBがあったので試してみました。

![写真（2017-08-06 13.17）.jpg](https://qiita-image-store.s3.amazonaws.com/0/104066/4ec94ce4-727f-4d69-9795-1d6db8cc10c8.jpeg)


Mac OS XのユーザランドのUSBアプリケーションはlibusbを使っている物が多いですが、素のIOUSBってどんな物か確認してみたいと思ったのも動機の一つです。

そのままでは動かなかったので、プログラムの修正は以下の通りです。

* kOurProductIDを8193から8497に変更
* RawDeviceAdded()のGetDeviceReleaseNumber()のチェックを外す

これでビルドしてコマンドラインで実行してEZ-USBを接続すると以下のようなログがでます。

```
bash-3.2$ ./USBNotificationExample 
Looking for devices matching vendor ID=1351 and product ID=8497
Raw device added.
Raw device removed.
Bulk test device added.
Interface found.
Interface class 255, subclass 0
Interface has 14 endpoints.
pipeRef 1: direction out, transfer type bulk, maxPacketSize 64
pipeRef 2: direction out, transfer type bulk, maxPacketSize 64
pipeRef 3: direction out, transfer type bulk, maxPacketSize 64
pipeRef 4: direction out, transfer type bulk, maxPacketSize 64
pipeRef 5: direction out, transfer type bulk, maxPacketSize 64
pipeRef 6: direction out, transfer type bulk, maxPacketSize 64
pipeRef 7: direction out, transfer type bulk, maxPacketSize 64
pipeRef 8: direction in, transfer type interrupt, maxPacketSize 64
pipeRef 9: direction in, transfer type bulk, maxPacketSize 64
pipeRef 10: direction in, transfer type bulk, maxPacketSize 64
pipeRef 11: direction in, transfer type bulk, maxPacketSize 64
pipeRef 12: direction in, transfer type bulk, maxPacketSize 64
pipeRef 13: direction in, transfer type bulk, maxPacketSize 64
pipeRef 14: direction in, transfer type bulk, maxPacketSize 64
Async event source added to run loop.
Async write complete.
Wrote "Bulk I/O Test" (13 bytes) to bulk endpoint
Async bulk read complete.
Read "Bulk I/O Test" (13 bytes) from bulk endpoint
```

EZ-USBのファームウエアはbulktest.cの中に入っていておそらくCypressのSDKに入っていたバイナリをそのまま使っていると思われます。このファームウエアはエンドポイント0x02(pipeRef:2)で受け取ったデータを、バイト毎にビット反転して、エンドポイント0x82(pipeRef:9)で返してきます。

USB Probeでファームが書き込まれてディスクリプタが変わるのが確認できます。

同期と非同期のbulkへの書き込み読み込みコードが入っていてUSE_ASYNC_IOをdefineすると非同期での処理になります。

同じくEZ-USBをターゲットにしたファーム書き込みコードもサンプルで用意されていますが、使い勝手がわるかったので、ちょっといじってここに置いてあります。FX2対応も入っています。

https://github.com/yamori813/Ezloader_OSX

FX2用の類似のテストプログラムはCypressからAN74505として提供されています。

AN74505をlibusbからIOUSBに書き換えてみました。ファームのダウンロード機能も入れてあります。雪豹で確認しました。

https://github.com/yamori813/Bulkloop_Cocoa_Apps_IOUSB
railsでクレジット決済機能をpay.jpで実装する

# pay.jpを実装する流れ
rails初心者ですが、pay.jpのAPIを実装してみました。
以下が簡単な流れになります。今回はテスト用の機能を実装です。色々試行錯誤があったので、もしかしたら工程にモレがあるかもしれません。その際はご指摘いただければと思います。

- pay.jpにて新規作成、テスト秘密鍵とテスト公開鍵をフライングゲット（普通にゲットしてください）
- gem payjp をinstall 
- config/initializer下に鍵を記述
- ルーティング、コントローラ、ビューを編集

viewに「カードで支払う」ボタンが出現するので、ちゃんと作動するか確認して終了です。
大まかには、これだけです。

# pay.jpでテストキーを取得する
https://pay.jp/
上記URLより新規登録後、設定→テスト公開鍵、テスト秘密鍵　を取得してください

#　インストールする
gem fileにて、gem 'payjp'→bundle install

# config/initializer以下に鍵を記述
viewに直接キーを記述する方法もあるのですが、config/initializer/
以下にsetting.rbを作成し、そこに鍵を記述するほうが安全だと思われるので、そのようにしました。

```setting.rb
PAYJP_PUBLIC_KEY = 'pk_test_xxxxxxxxxx'
PAYJP_SECRET_KEY = 'sk_test_xxxxxxxxxx'
```
と記述すると、viewにPAYJP_PUBLIC_KEYという変数がviewで使用できるようになります。

# ルーティングを編集
resourseでルーティングを記述している場合は、クレジット決済機能を実装したいルーティングにネストさせて記述します。
今回は決済機能をpurchaseアクションと名付け記述しましたので、こんな感じなります。

```
resources :products do only: [:index, :new, :update, :create] do
  collection do
    post 'purchase'
  end
end
```

purchaseアクションはresource以外なので、collection doを使って記述します。

# コントローラを編集
（例）

```
def purchase
  Payjp.api_key = PAYJP_SECRET_KEY
  Payjp::Charge.create(currency: 'jpy', amount: 1000, card: params['payjp-token'])
  redirect_to root_path, notice: "支払いが完了しました"
end
```
コントローラに通貨の設定や、金額などの設定を記述します。
https://pay.jp/docs/api/#支払いを作成
ここからその他にいろいろな設定ができることを確認してみてください。
リダイレクト先や、フラッシュメッセージの設定は各自お好みでどうぞ。

# view　を編集

```product.haml
= form_tag(action: :purchase, method: :post) do
          %script.payjp-button{"data-key" => "#{PAYJP_PUBLIC_KEY}", :src => "https://checkout.pay.jp", :type => "text/javascript"}
```

クレジット決済ボタンを設置したいところに、form tagで囲ったscript以下を記述します。

この記述で「クレジットで支払う」というデフォルト状態のボタンが出現するはずです。
このままでもいいのですが、自分のページに合うようにcssを当てたいときは、idを検証し、そのidを上書きするようにcssをあててあげるとうまくいきました。こんな感じです。

```product.scss
#payjp_checkout_box input[type=button]{
background-color: white;
・・・
}
```


また、ボタンも「クレジットで支払う」から¥1000に変更したい場合は"data-text" オプションを使って変更できます。こんな感じです。

```product.haml
= form_tag(action: :purchase, method: :post) do
          %script.payjp-button{"data-key" => "#{PAYJP_PUBLIC_KEY}", :src => "https://checkout.pay.jp", :type => "text/javascript","data-text" => "¥1000"}
```

その他のオプションはこちらが参考になります。
https://pay.jp/docs/checkout


以上の設定で、ボタンを押すとパッとクレジットカード番号を記入する画面がポップアップし、入力すると、pay.jpのダッシュボードで売上が記録されていくのが確認できると思います。
https://pay.jp/d/

ちなみにカード番号はランダムではなく、テストカード番号を打ち込まないと読み込んでくれません。
https://pay.jp/docs/testcard

以上が、pay.jpのAPI実装の工程になります。

今後もご指導ご鞭撻のほど、よろしくお願いいたします。
Neural Networks > over fittingを防ぐ式 > Nh = Ns / (alpha * (Ni + No)) || a maximum of five layers

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.1.0
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
```

TensorFlowにて5次元関数の学習を試みている。

ネットワーク・トポロジーをどうするか。

以下にoverfittingを起こさない式が記載されている。

https://stats.stackexchange.com/questions/181/how-to-choose-the-number-of-hidden-layers-and-nodes-in-a-feedforward-neural-netw
> answered Feb 6 '15 at 7:22
hobs

```math
N_h = \frac{N_s}{\alpha * (N_i + N_o)}
```

$N_h$ = number of hidden neurons
$N_i$  = number of input neurons
$N_o$ = number of output neurons
$N_s$ = number of samples in training data set
α = an arbitrary scaling factor usually 2-10

### 関連

Neural Networks > over fittingを防ぐ式 > (n + 2)M + 1 < m @ 2005年
http://qiita.com/7of9/items/c1501c2c3fb58df0f445

### 備考

こういう式を気にせずdropoutだけ使うとover fittingはきちんと防げるのだろうか。

### リンク先のリンク先

hobsの回答にあるリンク先に以下の記載もある。

https://www.solver.com/training-artificial-neural-network-intro

> There is no theoretical limit on the number of hidden layers but typically there are just one or two. Some work has been done which indicates that a maximum of five layers (one input layer, three hidden layers and an output layer) are required to solve problems of any complexity. Each layer is fully connected to the succeeding layer. 

hidden layerを何層にするかという問題だが、3層までとのこと。
実際に3層から増やしてもlossの経過は良くなかった経験がある。
fopen_sをfopenの代わりに使うときのやりかた

#コードの見本
以下のコードは**fopen_sでファイルを読み込み(read)モードで開き**それを画面に出力するというプログラムです。

```c
#include<stdio.h>

int main(void)
{
  int a;
  FILE  *fp;
  errno_t error;

  error = fopen_s(&fp,"tukauyatu.txt","r");

  if(error != 0)
        printf("ファイルを開けませんでした");
  else{
        while((a = fgetc(fp)) != EOF)
               putchar(a);
        putchar('\n');
        fclose(fp);
      }

  return 0;
 }
```

#fopenとfopen_sの使い方の違い
使い方の違いとして注目すべき点は、開いたファイルのアドレスをどうやって渡しているのかという事ではないでしょうか。
**fopenでは**

```c
fp = fopen("tukauyatu.txt","r");
```
となるように、開いたファイルのアドレスを、戻り値としてファイル型のポインタ変数に渡しますが
**fopen_sでは**

```c
error = fopen_s(&fp,"tukauyatu.txt","r");
```
となり、**戻り値ではなく、第一引数にファイル型のポインタ変数のアドレスを指定する**ことで、第二引数で指定したファイルを 第三引数で選んだモードで開き、その開いたファイルのアドレスを第一引数で指定したポインタ変数に渡します。

また、**fopen_sはファイルを開くのに成功した場合はerrno_t型の0を返してくれる**のでそれを強調するために上のコードの見本では

```c
if(error != 0)
   printf("ファイルを開けませんでした");
```
としていますが、ここは以下のように省略することもできます。

```c
if((fopen_s(&fp, "tukauyatu.txt", "r")) != 0)
   printf("ファイルを開けませんでした");
```
##その他細かなことについて
fopen_sもその名の後ろについている「**\_s**」の印のとおりfopenのセキュリティー強化版です。fopen_sはfopenとは違って排他的モードで開いてくれるらしいのですが、私はまだその恩恵を受けたことがなく、そのことについてはここには書くことができないので、もしそれを利用したい方は申し訳ありませんが、ほかの記事を参照していただけると幸いです。
railsで投稿機能を作成する（form_with、form_tag

# この記事でやること

* formの作成
* formから入力された値をDBに格納
* DBから取得し、表示
* 表示するコンテンツ詳細ページの作成（ページ、URLの作成）

# formから入力された値をDBに格納

## formの作成

### 投稿→表示の流れ

* formにアクションへのルート指定
* ルーティング
* アクション
* DB
* find_byメソッドで取得

### ルーティングの設定

```ruby:routes
post "posts/creat" => "posts#creat"
```
ルーティングは通常はgetですが値の受け渡しがある場合はpost

### formのURL,name設定（form_tagバージョン）

```ruby:view.html.erb

<%= form_tag("/posts/creat") do %>
 <textarea name="contents"></textarea>
 <input type="submit" value="投稿">
<% end %>

```
nameをcontentsと設定することで{conetents:〜〜〜}というハッシュが送信されます。

```ruby:posts_controller.rb
def create
 @post = Post.new(content:params[:content])
 @post.save
end
```

### formのURL,name設定（form_withバージョン）

「【Rails】form_with/form_forについて【入門】」
https://qiita.com/snskOgata/items/44d32a06045e6a52d11c

上記記事がわかりやすかった。またドキュメントは下記

https://railsdoc.com/form

#### そもそもform_withとは？

form_forとform_tagを一緒に使えるもので関連するモデルがある場合とない場合で勝手に分岐してくれる。

- modelがある場合・・・form_forに
- modelがない場合・・・form_tagに

#### form_withでの投稿

```ruby

<%= form_with model: @posts, url: posts_path do |form| %>
  <%= form.text_area :title, id: "title" %>
  <%= form.submit "登録する" %>
<% end %>
```

### paramsの２つの役割

* ルーティングのURLから値の取得
* name=""のついたフォームの入力内容を受け取る


# ストロングパラメーター

```ruby:test
def post_params
  params.require(:post).permit(:title, :user_id)
end
```

- この形でだとpostのハッシュとしてtitleやuser_idが入る。
- 投稿フォームのあるnewページで@post = Post.newでpost自体をセットし、その下のハッシュとして投稿する

# DBから取得し、表示
## find_byメソッド

find_byメソッドは条件にあった情報をDBから取ってこれるメソッドです。例えば

```ruby:test
find_by(id:3)
```
とすればid3のコンテンツを引っ張ってこれます。

# 表示するコンテンツ詳細ページの作成（ページ、URLの作成）

## 各詳細ページのルーティング→表示

```ruby:routes.rb
get "posts/:id" => "posts#show"
```
```ruby:posts_controller.rb
def show
end
```
routesにURLの設定を行い、コントローラーのアクションにつなぐ

## URLにIDを含めよう

```ruby:routes.rb
get "posts/:id" => "posts#show"
```
これでpostsの後にidが入ったURLになる。

## ページ内のコンテンツの出し分け

```ruby:posts_controller.rb
def show
 @post = Post.find_by(id:params[:id])
end
```
* URLにidが含まれているのでそこからparamsでidを取得
* そのidからfind_byメソッドでコンテンツを取得
* @postに代入
* ビューで表示
返り値をバッチファイルで受け取るときの注意点

バッチファイル内であるアプリケーションの戻り値（返り値）を取得したい場合は
そのアプリケーションを実行した後`%ERRORLEVEL%`で取得できる

仮に 何かファイルを渡して、処理が成功すれば`0`が返り、失敗すれば`1`が返る`hoge.exe`というのがあったとして

```bat:
call hoge.exe piyo.txt
if %ERRORLEVEL% == 1 @echo ダメです。
```
という感じで条件分岐だって可能だし

さてさてこれを利用して大量の処理をしたくなったとき（ってかバッチ処理ってそんなもの）

```bat:
for %%f in (*.txt) do (
call hoge.exe %%f
if %ERRORLEVEL% == 1 @echo %%f：ダメです。>> log.log
)
```
的なことをやろうとして、思ったような結果が得られず、（この場合は`ERRORLEVEL`がいつまでたっても0のまま）えらい難儀している人はたくさんいると思う。

```bat:
setlocal
（コマンド文）
endlocal
```
で挟んでやっても・・・・どうにもうまくいきません。

どうやらこれはバッチファイルの中にインタプリタ（？）する過程で、`for do`ループがあると、そのブロック内は一度に評価される。　
そのため「`%ERRORLEVEL%`ほにゃらら」 は、その時点での値がそのまま埋め込まれて実行されるからだとか・・・（少々間違った解釈かも知れんが、とにかくこのままでは動的な変数のごとく使えないってことだ）

これを<font color='blue'>「環境変数の即時展開」</font>というものらしい
じゃあ、環境変数を動的に扱いたい場合どうすればいいのか
その解決策は<font color='blue'>「環境変数の遅延展開」</font>と呼ばれるもの
つまり`setlocal`に`enabledelayedexpansion`のオプションをつけてやる

長いですね

```
遅延：delayed
展開：expansion
有効：enable
```
具体的には
`setlocal enabledelayedexpansion`から始まって`endlocal`までの間はこれが有効となる。
さらにこの中では環境変数の呼び出し方を`%`ではなく`!`で挟むようにしてやれば<b>OK</b>
使用例としては

```bat:
setlocal enabledelayedexpansion
for %%f in (*.txt) do (
  call hoge.exe %%f
  if !ERRORLEVEL! == 1 @echo %%f：ダメです。>> log.log
  if !ERRORLEVEL! == 0 @echo %%f：OKです。>> log.log
)
endlocal
````
初心者（中級者でも）が大ハマリするパターンだろう、
「どう考えても動くバッチに見えて仕方がないのに何で思うように動かないのか・・・・・・」
一度は苦労する点であることには間違いない、
<font color="CadetBlue">*<a href='https://ameblo.jp/tcexternal/entry-10463736986.html'>別ブログに掲載していた記事</a>をQiitaに掲載*</font>
ＵＳＢキーボードだけ ＵＳ配列 にする方法 windows7

いまさらのようだけど win7で ＵＳ配列のＵＳＢキーボードを使う設定です

ほかの 記事みたけど レジストリで 変更する箇所 たりてないみたい

サポートのページ みたら ほかの値も直せってあったよ

https://support.microsoft.com/ja-jp/help/927824/windows-may-not-use-the-correct-keyboard-layout-when-you-connect-a-usb
Link > a feed-forward neural network > Number of hidden nodes > geometric pyramid rule proposed by Masters (1993)

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.1.0
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
```

TensorFlowで5次元関数の補間を試行している。

どういうネットワーク・トポロジーが良いのか不明。

以下を見つけた。

https://stats.stackexchange.com/questions/181/how-to-choose-the-number-of-hidden-layers-and-nodes-in-a-feedforward-neural-netw
> answered Feb 16 '16 at 14:17
prashanth
>
A rough approximation can be obtained by the geometric pyramid rule proposed by Masters (1993). For a three layer network with n input and m output neurons, the hidden layer would have sqrt(n∗m) neurons.
startコマンドで相対パスが指定できない対処



通常　バッチファイルなどで他のプログラムを呼び出すには
`call`コマンドを使う

例としては
起動させる対象のプログラム`fuga.exe`と、それを呼び出すバッチ`hoge.cmd`を同じフォルダに入れておき

```bat:hoge.cmd
call fuga.exe
```
などとやっていて、処理がストップすると、バッチファイルはそこでストップする。
ならば、「`start`にやらせよう」とすると、<font color='blue'>「`start`にはフルパスを入れてやらないとダメ」</font>あるいは <font color='blue'>「`start /d`に作業ディレクトリを指定してやらんとダメ」</font>
てなわけで<font color='blue'>「`fuga.exe` と `hoge.cmd` をセットで　どこのディレクトリに持って行っても
(手直しなしで)きちんと動くように」</font>というのはできないか？　という相談であるが。

結論から言うと`hoge.cmd`は次のように書き換えればよろしい

```bat:hoge.cmd
start /d %~dp0 fuga.exe 
```
さて、上記の start /d に作業ディレクトリを指定する部分で、呼び出し元(つまり自分自身)の存在するディレクトリを指定してやれば、似たような作業になる。
※<i>手直しなしで</i>っていう部分ですな
んで　作業ディレクトリに自分自身のパスを与えてやれば良い(いつでも)

バッチファイル内では、変数`%0`に自分自身のフルパスが格納されている。
また、コレにはいくつかオプションがあって

|変数 |内容                                              |
|:--:|:-------------------------------------------------|
|%~d0|ドライブ名を取得                                    |
|%~p0| パス名を取得(作業ディレクトリのみ　ドライブ名なし)    |
|%~n0| ファイル名のみ取得(拡張子なし　←これ意味あるのかな？) |
|%~x0| ファイルの拡張子を取得(フルパスの最後の.以降)        |
|%~s0| MS-DOSの8.3形式でフルパスを取得                    |
これらは複数組み合わせが可能
従って`ドライブ名+パス`は`%~d0%~p0`でも良いが`%~dp0`で<b>ok</b>
<font color="CadetBlue">*<a href='http://ameblo.jp/tcexternal/entry-10864013088.html'>別ブログに掲載していた記事</a>をQiitaに掲載*</font>
YARN上でSpark Streamingを使うときのクラスのバージョンアップについて

Spark SteamingのアプリケーションをJavaなりScalaなりで書いて、YARNクラスタ上で実行するべくspark submitする。
このとき、すでに実行中のSpark StreamingアプリケーションとFQCNが同一のクラスの新しいバージョンがsubmitしたJARファイルに含まれていると、トラブルに巻き込まれる。

Spark Streamingの場合、DAGを構成する処理をLambdaオブジェクトにしてserializeし、エクゼキュータプロセスの走っているノードにネットワーク越しに転送し、実行させる。エクゼキュータプロセスは、serializeされたLambdaオブジェクトをdesrializeし、メモリ上に復元しようとするわけだが、そこでdeserializeしようとするオブジェクトのクラスのバージョンと、エクゼキュータプロセスのメモリ上にロード済みのクラスのバージョンが衝突することがある。バージョンが違うから、deserializeできないよ、とInvalidClassExceptionが生じるわけだ。

InvalidClassExceptionを回避するだけなら、工夫することは可能だろうが、われわれとしては、新しいアプリケーションには新しいバージョンのクラスを利用したいわけで、メモリのロード済みのクラスは使ってほしくない。

そういうわけで、私は、各アプリケーションの利用しているクラスを把握しておいて、衝突が起きる場合には、先行して稼働中のアプリケーションを止めて、バージョンアップする運用をしている。

しかし...これって、自分で開発したクラスの範疇なら良いけれど、依存関係の中に入っているクラスで起きてしまったら厄介すぎる問題だよね。

特に、そのYARNクラスタを多数のユーザで共有している場合には...
FileMaker Data API with curl

# やりたかったこと

FileMakerServer 16 を使って、REST な API を使う。

# 結論

ログインに成功するためのコマンド。

```
curl -X POST -d '{"user":"USER","password":"PASSWORD","layout":"LAYOUT"}'  -H "Content-Type: application/json" https://FILEMAKER_SERVER_HOST/fmi/rest/api/auth/FILEMAKER_DB
```

# ハマりどころ

FileMaker [公式のドキュメント](https://fmhelp.filemaker.com/docs/16/ja/restapi/#connect-database_log-in)からでは、「HTTP ヘッダ」の値として「Content/Type: application/json」を使用するという説明になっているが、正しくは「Content-Type: application/json」。

「Content」と「Type」の間は「-」が正解。

情報としては知っていた「Content-Type」ですが、公式ドキュメントだからと「Content/Type」をコピペしてそのまま使ってハマりました（私だけですかね？）。

冷静になってよく見ることが大事です。

# ちなみに

FileMakerServer のホスト機の REST API でドキュメントを見ると、正解が書かれています。

```
# 正解
https://FILEMAKER_SERVER_HOST/fmi/rest/apidoc/
```

上記の公式ドキュメント（間違っている記載）は、FileMakerServer ホスト機のコンソール画面から行く方です。

```
# 間違った情報
https://FILEMAKER_SERVER_HOST:16000/

# > 左下の「FileMaker Data API ガイド」クリック。
```

こういった細かなミスが少しでも減ってくれると、エンジニアは無駄な苦労をしなくて済むので、自分の犯した恥を晒して行くことも大事だと思いました。


# 蛇足

ログインだけで時間を使ってしまって、お腹もすいて来たので、本来のデータの操作テストはお預け。

# 参考

- [FileMaker 16 Data API ガイド](https://fmhelp.filemaker.com/docs/16/ja/restapi/)

- [curl を使って JSONデータをPOSTする](http://takuya71.hatenablog.com/entry/2012/11/10/143415)