OmniAICreator/Qiita-1.07M huggingface dataset:
駅すぱあとAPIを使ってみた

[駅すぱあと](https://roote.ekispert.net/ja/)は、無料で利用できる乗り換え案内webサービスです。

そんな駅すぱあとですが、駅情報に関するデータを取得できるAPIを提供しています。
公式HP: https://ekiworld.net/service/sier/webservice/free_provision.html
によると、「経路探索」や「駅情報」を利用できる<b>フリープラン</b>と、「バスデータ」や「時刻表情報」などが取得できる<b>スタンダードプラン</b>があるようです。

今回はフリープランのAPIを使って、「駅名」を入力すると「県名」を出力する簡単なスクリプトをRCurlを使って実装してみました。

# APIの利用申請
駅すぱあとAPIは、フリープランでも利用申請が必要となります。
利用申請は、[このページ](https://ekiworld.net/free_provision/index.php)から行うことが出来ます。
申請を行うと、申請したメールアドレス宛に、APIの説明とアクセスキーが記されたメールが届きます。APIの利用にはこのアクセスキーが必要です。
今のところフリープランの利用には期間制限が無いようなので、一度申請すれば何日でも使用する事ができます。

# APIの仕様
APIの仕様書は、http://docs.ekispert.com/v1/le/ で公開されています。

今回は「駅名」から「県名」を特定するのが目的なので、<b>駅情報API</b>を使用しようと思います。

駅情報APIは

```
http://api.ekispert.jp//v1/xml/station/ + "ACCESS_KEY"
```
で使用することが出来ます。

```
http://api.ekispert.jp//v1/json/station/ + "ACCESS_KEY"
```
の形式で使用すると、jsonでデータを取得することが出来ます。

APIの末尾に<b>「&name=(文字列)」</b>を追加することで、その文字列を含む駅を検索することが出来ます。
例えば、「&name=神奈川」としてAPIを打ってみると

```
<ResultSet apiVersion="1.27.0.0" engineVersion="201804_02a">
　<Point>
　　<Station code="23111">
　　　<Name>神奈川</Name>
　　　<Type>train</Type>
　　　<Yomi>かながわ</Yomi>
　　</Station>
　　<Prefecture code="14">
　　　<Name>神奈川県</Name>
　　</Prefecture>
　</Point>
　<Point>
　　<Station code="23112">
　　　<Name>神奈川新町</Name>
　　　<Type>train</Type>
　　　<Yomi>かながわしんまち</Yomi>
　　</Station>
　　<Prefecture code="14">
　　　<Name>神奈川県</Name>
　　</Prefecture>
　</Point>
</ResultSet>
```
というxmlが得られました。
「神奈川」駅のみならず、"神奈川"という文字列を含む「神奈川新町」駅もデータに含まれていますので、注意が必要です。

#　実装
「駅名」を入力すると「県名」が出力するスクリプトをRCurlで実装してみました。

```ekiscr.R
library("jsonlite")
library("RCurl")

# ここに検索したい駅名を入力
station = "駅名"

# ここにアクセスキーを入力
Access_key = "駅すぱあとから送られたアクセスキー"

# API
BaseAPI <- paste("http://api.ekispert.jp//v1/json/station/light?key=", Access_key, sep = "")

# BaseAPI+station
API <- paste(BaseAPI, "&name=", station, sep = "")

# get JSON
data <- getURL(API)
data <- fromJSON(data)

# get Prefecture name
if(length(data$ResultSet$Point$Station$Name)==1){
  output <- data$ResultSet$Point$Prefecture$Name
}else{
  output <- data$ResultSet$Point$Prefecture[data$ResultSet$Point$Station$Name==station,]$Name
}

print(output)
```

## 結果

```
# station = "川崎"の場合
> source('~~/ekiscr.R', encoding = 'UTF-8')
[1] "神奈川県"

# station = "荻窪"の場合
> source('~~/ekiscr.R', encoding = 'UTF-8')
[1] "東京都"
```

# まとめ
<b>駅名から県名を取得するスクリプトを簡単に実装する事が出来ました！</b>
個人的にはjsonliteが使いやすいと思っているので、取得形式はxmlよりjsonの方がオススメです。
今回は県名抽出のみ行いましたが、このAPIから取得できる駅コードを用いれば、乗換情報なども取得する事が出来ます。
様々なwebサービスに応用できると思うので、ご参考までに。
GCI データサイエンティスト養成講座_第2回の問題

GCI データサイエンティスト養成講座の第2回問題の回答例です。
第1回といい微妙にひねりのある問題なのが楽しいです。

#第2回の問題
モンテカルロ法で円周率を求めよ。
モンテカルロ法というのは、パソコンの力を使ってランダムで大量に点をプロットし、そのうち幾つが条件をみたすか、というふうにごり押しをして割合を求める方法だと解釈しています。


```python
import matplotlib.pyplot as plt
import matplotlib as mpl
import seaborn as sns
import math
import matplotlib.patches as patches

# (1)
np.random.seed(0)
random_last1 = np.random.uniform(0,1,10000)
random_last2 = np.random.uniform(0,1,10000)
random_last1
in_circle = {'x' : [], 'y' : []}
not_in_circle = {'x' : [], 'y' : []}
                      
# (2)
for x,y in zip(random_last1, random_last2):
    norm =math.hypot(x,y)
    if norm > 1:
        not_in_circle['x'].append(x)
        not_in_circle['y'].append(y)
    else:
        in_circle['x'].append(x)
        in_circle['y'].append(y)

plt.plot(not_in_circle['x'], not_in_circle['y'], "o")
plt.plot(in_circle['x'], in_circle['y'], "o")

plt.grid(True)

len(in_circle['x']) /10000 * 4
```
1回1回が結構ヘビーだけど、だからこそこれをきちんとやれば基礎はきちんと身につくはず…！
iOS 実機で Expo から QR スキャンができない(2018/04/22 時点)

漢なら React Native + iOS でオシャンティなブロックチェーンフロントエンドアプリ開発を極めたいですよね!

とりあえず getting started を試そうと思いましたが,

https://facebook.github.io/react-native/docs/getting-started.html

Expo app 側で QR スキャンする機能がなくて連携できず困っていました.
 
調べると, 最近(2018/03/30 ごろ)のリリースで, Expo app からの QR スキャンができなくなっています.

Scan QR Code Missing!
https://forums.expo.io/t/scan-qr-code-missing/8252/16

## 解決策

とりあえずカメラアプリで QR 読み取りや, メール送信などで解決します.
【MySQL】めちゃくちゃ遅いselect文を速くする方法【暗黙の型変換】

# はじめに
100件ちょいのレコードを取得するのに30分以上かかっていたselect文がありました。
このselect文を10秒ちょっとにまで速度改善したお話です。

# データの内容
※実際に使用したデータは書けないので、説明用のデータです。

テーブル名：member

| id | name | sex(varchar) | memo |
|:-:|:--|:-:|:--|
|1|山田太郎|1||
|2|田中花子|2||
|3|木村次郎|1|プロジェクトリーダー|
ここから男性だけを抽出します。

# 遅いselect文
```SQL
select * from member
where sex = 1
```
一見、何の問題もないように見えるselect文ですが、where句に落とし穴があります:scream:
sex_cdはvarchar型で定義しているので、数値の1をvarcharの"1"へ変換しなくてはならないのです:exclamation:
もちろん、このままでも正しく取得できるのですが、内部でこっそりと型変換処理を行っているため、めちゃくちゃ処理が重くなります。

# 速いselect文
```SQL
select * from member
where sex = '1'
```
先ほどのselect文で、where句の「１」をシングルクォートで囲み、varchar型であることを明示しました。
これで、内部でこっそり行われていた型変換がなくなります:star2:

# 業務で試してみた結果
冒頭で書いた通り、100行ちょっとのレコードの取得が30分以上→10秒へと劇的な改善を遂げました:hatching_chick:
実は、left joinやinner joinを多用し、case whenなども使用していた、入れ子がハンパないことになっていたselect文だったんです。
joinの仕方やcase whenのやり方を考え直さなければ・・・と思い悩んでいたので、シングルクォートだけでここまで改善できたことにめちゃくちゃ驚きました:open_mouth:

# まとめ
where句などで数値を条件に使用しているときは、varcharやintの型がテーブル定義とずれていないか確認すること。
[mac]192.168.0.1はわたしのIPアドレスなので使用しないでください

# 参考URL
* [Mac OSXで現在のIPアドレスを確認する最速コマンド - それマグで！](http://takuya-1st.hatenablog.jp/entry/2014/11/06/204903)
    * この方法でもいいのだがインターフェース名を覚えたくないなという衝動に駆られた
    * デフォルトルート用のインターフェース名を調べた上でそのアドレスが知れたらいいよねという気持ち

# ワンライナー
* もっといい方法ないんかい

```bash
ifconfig $(route -n get 0.0.0.0|grep interface|awk -F' ' '{print $2}') | 
grep 'inet '                                                           |
awk -F' ' '{print $2}'
```
RaspberryPi のGPUを活用する話へのリンク

（この記事は、「RaspberryPi の産業用途」の一部として書いたものから切り出したものです。）

Deep Learning が画像認識技術の分野を書き換えているが、CUDAだけが唯一の手段ではない。

ARM系のチップでもGPUを使う話がある。


Raspberry Pi の利用例 [エッジで安価にディープラーニング活用、Ideinが1.8億円を調達](http://jp.techcrunch.com/2017/07/10/idein-raises-180m-yen/)

> Ideinの強みは、汎用のRaspberry Pi上で高速にディープラーニングを使うソフトウェア環境を整えたこと。Ideinが使っているのはプロセッサもソフトウェアも汎用のものだ。Raspberry Piはスマホと似たプロセッサだし、ディープラーニングにはChainerやCaffeといったオープンソースのライブラリを使う。難しいのはRaspberry Pi搭載のGPUであるVideoCore IVを使うために、アセンブラ、コンパイラ、数値計算ライブラリなど一通りのツールチェーンを自分たちで作った部分という。これによって10倍から30倍の高速化となり、以下の動画にあるように、30ドル程度の汎用デバイスでGoogleNet（Googleが配布している画像認識の学習モデル）による認識時間が0.7秒という実用的な速度になっている、という。


VideoCore IV を使う話 [Raspberry PiでGPGPU](http://qiita.com/9_ties/items/2e85318989170f967e4b)

Youtube [Ideinによる画像認識のデモ](https://www.youtube.com/watch?v=5GaI6qXAZNM)


[Idein](https://idein.jp/) 創業者で代表の中村晃一氏　は　[qiita の　中村 晃一　さん](http://qiita.com/9_ties) であるらしい。

東京大学 中村晃一氏(当時)による「パターン認識と機械学習入門勉強会 全23回」の動画が
Youtubeにあります。
[「パターン認識と機械学習入門勉強会 全23回」(]https://www.youtube.com/playlist?list=PLl1oX4Yc8CJaeKmvcKYwJMuLT8dcWzGVo)


[5ドルのラズパイでAIが高速動作、IdeinがMWC2018で初展示](http://tech.nikkeibp.co.jp/atcl/nxt/event/18/00004/030100038/)
[アイシン精機株式会社とIdein株式会社が資本業務提携 ](https://prtimes.jp/main/html/rd/p/000000004.000026271.html)

[安価な組み込みAIを世界へ！ Ideinが「高火力」を選んだ理由](http://ascii.jp/elem/000/001/726/1726225/)
[Unity] iOS実機にてAssetBundle経由でTilemapを含むSceneを読み込んでクラッシュする

# ⚙実行環境
- Unity2017.3.1f1

# 📝現象
- SceneをAssetBundleに格納して実行時に読み込む運用を行っている
- iOS実機にて特定のシーンを読み込んだ際にクラッシュした

# 🤔仮説
下記から **Tilemapを含むSceneをAssetBundle経由で読み込み実行しようとした際にクラッシュする** という仮説が立てて調査する

- Tilemapを含まない汎用的なシーンにおいてクラッシュしない
- AssetBundleから読み込まず、Sceneを含めてビルドして検証するとクラッシュしない

# 💡原因
**アプリ側でTilemapを未使用かつ `Strip Engine Code` が有効な時、ビルド時にTilemapに関する実行コードは削除される。これによりAssetBundleで動的に Tilemap を含むSceneを取得した時に実行することが出来なかった。**

(逆にアプリ側でTilemapを使用しているのであれば、ストリップされないのでこの問題は発生しない)

## 🗑Strip Engine Codeについて
 `Strip Engine Code` はモバイル向けの最適化オプションの1つで、ビルドする際Unityエンジンから未使用コードを削除することでビルド容量の軽量化を図ることができる。`Strip Engine Code` は以下の条件で適応することができる。

- IL2CPPを使用している
- `PlayerSettings => Other Settings` にある `Strip Engine Code` が有効である

<img width="395" alt="StripEngineCode.png" src="https://qiita-image-store.s3.amazonaws.com/0/102664/40851afb-9047-25d7-018c-d312c14417ef.png">

# 🛠解消
## Strip Engine Codeを無効にする
Strip Engine Codeを無効にしたビルドで検証し、クラッシュしないことを確認した。この状態だと容量が増えた状態になるので、別の対処法を取る。

## link.xml に使用するコードを記載する (推奨)
[Unity - Manual: Managed bytecode stripping with IL2CPP](https://docs.unity3d.com/Manual/IL2CPP-BytecodeStripping.html)

上記に記載されているが `link.xml` というファイルを作成し、Assetsフォルダの直下に配置することで、ストリップされないコードリストを定義することが出来る。
今回は `UnityEngine.Tilemaps.Tilemap` / `UnityEngine.Tilemaps.TilemapRenderer` を定義する。

```link.xml
<linker>
	<assembly fullname="UnityEngine">
		<type fullname="UnityEngine.Tilemaps.Tilemap" preserve="all"/>
		<type fullname="UnityEngine.Tilemaps.TilemapRenderer" preserve="all"/>
	</assembly>
</linker>
```

<img width="357" alt="link.png" src="https://qiita-image-store.s3.amazonaws.com/0/102664/9de500e4-53dd-03fe-54db-123c535ded6d.png">

上記のような `link.xml` を配置した状態で `Strip Engine Code` を有効にしビルドして検証したところ、クラッシュが発生しないことを確認した✨

# 📗参考
- [【Unity】Unity 5.3からAssetBundleはどう変わるのか…まとめ - テラシュールブログ](http://tsubakit1.hateblo.jp/entry/2015/12/16/233336)
- [【Unity】Stripping Levelについて - エフアンダーバー](http://www.f-sp.com/entry/2016/02/23/180816)
【Ruby on Rails】ハッシュのキーをシンボル化してみた。ネストしたのも含めて。

先日以下の記事を書いた。

https://qiita.com/maeko/items/a9f1ace4dde8accd2ebd

キーワード引数を使って、多くなった引数をまとめようってやつ。

キーワード引数を使うときに、ハッシュのキーはシンボルじゃないといけないんです。
じゃあ、ハッシュのキーをシンボル化したいときはどうすりゃええねん！
ってことがあると思うので、そのやり方を書いてみました。

まぁ簡単です。

```rb

[1] pry(main)> hoge = {'a'=> 'あ', 'b'=> 'い'}
=> {"a"=>"あ", "b"=>"い"}
```

このハッシュのhogeに対して

```rb

[2] pry(main)> hoge.symbolize_keys
=> {:a=>"あ", :b=>"い"}
```

symbolize_keysを使えば、キーをシンボル化できるようになります。

次に、ハッシュがネストしていた場合に、このsymbolize_keysを使ったらどうなるかみてみます。

```rb
[3] pry(main)> fuga = {'a'=> 'あ', 'b'=> 'い', 'c'=>{'d'=>'う'}}
=> {"a"=>"あ", "b"=>"い", "c"=>{"d"=>"う"}}
```

```rb
[4] pry(main)> fuga.symbolize_keys
=> {:a=>"あ", :b=>"い", :c=>{"d"=>"う"}}
```

なるほど。ネストした部分は、シンボルの形になってませんね。
ってときに、ネストした部分のハッシュのキーもシンボル化したいときに使うのがこれ。

```rb
[5] pry(main)> fuga = {'a'=> 'あ', 'b'=> 'い', 'c'=>{'d'=>'う'}}
=> {"a"=>"あ", "b"=>"い", "c"=>{"d"=>"う"}}
[6] pry(main)> fuga.deep_symbolize_keys
=> {:a=>"あ", :b=>"い", :c=>{:d=>"う"}}
```

deep_symbolize_keysってのを使えば、ネストした先にキーも全部シンボル化してくれます。
CSS 左右中央揃え と 左右中央揃え&横並び

#したいこと


## 左右中央揃え
<img width="389" alt="スクリーンショット 2018-04-22 13.00.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/20635/721e32f6-2b0b-729d-c605-7607e9d4b8aa.png">

### text-align: center;
```slim:sample01.html.slim
.wrapper01
  ul
    li sample01
    li sample01
    li sample01
```
```sass:sample01.scss
.wrapper01 {
  width: 400px;
  height: 400px;
  background-color: #ccc;
  ul {
    text-align: center;
    li {
    }
  }
}
```


### margin: 0 auto;
#### widthの指定が必須
```slim:sample02.html.slim
.wrapper02
  ul
    li sample02
    li sample02
    li sample02
```
```sass:sample02.scss
.wrapper02 {
  width: 400px;
  height: 400px;
  background-color: #ccc;
  ul {
    margin: 0 auto;
    width: 18%;
    li {
    }
  }
}
```
### display: flex;
#### 中央に寄せたい要素の親にflexをかける。

```slim:sample03.html.slim
.wrapper03
  ul
    li sample03
    li sample03
    li sample03
```
```sass:sample03.scss
.wrapper03 {
  width: 400px;
  height: 400px;
  background-color: #ccc;
  display: flex;
  justify-content: center;
  ul {
    li {
    }
  }
}
```

## 左右中央揃えで、横並び
<img width="381" alt="スクリーンショット 2018-04-22 13.00.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/20635/f9251d6c-867e-f3de-905b-d96f92abd643.png">

### text-align: center; + display: inline-block;

```slim:sample01-1.html.slim
.wrapper01-1
  ul
    li sample01-1
    li sample01-1
    li sample01-1
```
```sass:sample01-1.scss
.wrapper01-1 {
  width: 400px;
  height: 400px;
  background-color: #808080;
  ul {
    text-align: center;
    li {
      display: inline-block;
    }
  }
}
```


### margin: 0 auto;　+ display: inline-block;
#### widthの指定が必須

```slim:sample02-2.html.slim
.wrapper02-2
  ul
    li sample02-2
    li sample02-2
    li sample02-2
```
```sass:sample02-2.scss
.wrapper02-2 {
  width: 400px;
  height: 400px;
  background-color: #808080;
  ul {
    margin: 0 auto;
    width: 71%;
    li {
      display: inline-block;
    }
  }
}
```

### display: flex;
#### 中央に寄せたい要素の親にflexをかける。

```slim:sample03-3.html.slim
.wrapper03-3
  ul
    li sample03-3
    li sample03-3
    li sample03-3
```
```sass:sample03-3.scss
.wrapper03-3 {
  width: 400px;
  height: 400px;
  background-color: #808080;
  ul {
    display: flex;
    justify-content: center;
    li {
    }
  }
}
```

#コメント
左右中央揃え/横並びは、flexを使用するのがとても便利
GoogleCloudSorage+CloudflareでHTTPSなwebサイトを構築する


## 背景

[GCPUG in Okinawa!#5-GCPは意思決定が加速するよ](https://okipug.connpass.com/event/80264/)で行ったLTの続きのようなものです．

## ドメイン購入と静的ホスティングまで

ドメインを購入してHTTPな静的サイトを構築するまでの手順はこちらを御覧ください．

[雰囲気で構築するオレオレ静的サイト](https://www.anatofuz.net/work/gcpug/5/slide.html)

## HTTPS化

HTTPS化にあたり，CloudFrareでの作業が必要となりますが
@noraworld さんのGitHubPagesでの記事が参考になります．
https://qiita.com/noraworld/items/89dd85a434a7b759e00c

## GitHubPagesとの違い

GoogleCloudPlatformはトップレベルドメインに対応していないため
`www` などのサブドメインを利用しています．
GithubPages+CloudFlareではipv4を設定していましたが，今回は直接CNAMEに設定することが可能です．

その為，初期のドメイン設定の際に `www.anatofuz.net` などと申請すると
自動的に `www` に `c.storage.googleapis.com` が設定されます．

<img width="960" alt="Screen Shot 2018-04-22 at 12.48.37.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/84139/6d3cd6b6-7f69-e6e2-7f5f-fe1ab1fd4246.jpeg">

また必要はないかと思うのですが，念のためにNSを追加しておきます

<img width="962" alt="Screen Shot 2018-04-22 at 12.54.57.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/84139/58e80365-2727-cb5a-3b78-700a7fa61154.jpeg">


SSL以降の設定は @noraworld さんの記事の通りでOKですが，最後のCNAMEの設定に該当するものは特に記述しなくてokです．

## Googleドメインでの設定

Googleドメインでは初期に追加したCNAMEなどを削除し
使用しているネームサーバーをカスタムネームサーバーとして，CLoudFlareから指定されたものを設定します．

<img width="843" alt="Screen Shot 2018-04-22 at 12.52.24.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/84139/81e7a839-eb02-4f59-66ca-5d4a74d3c803.jpeg">
<img width="879" alt="Screen Shot 2018-04-22 at 12.52.32.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/84139/accba476-a290-7faa-9895-b6569ad41520.jpeg">

## CloudDNSの設定

ここが個人的にはハマりポイントでしが，CloudDNS側で `www.anatofuz.net` に対してCloudFlareの設定を記述する必要があります．
<img width="942" alt="Screen Shot 2018-04-22 at 12.54.26.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/84139/b72c5b9c-3aab-fff9-718b-209343f697f9.jpeg">

ここまで記述すれば後はDNS設定が反映されるのを待ちましょう!!お疲れ様でした!!
Cordova 7.1プロジェクトでのCordovaプラグインの利用について

現在Monacaでは、Cordova7.1でのアプリ開発が可能になっています。

Cordova7.1では、ビルド時のCordovaプラグインの処理方法が変更されています。
Cordova7.1でビルド時にCordovaプラグインを組み込む場合は、Cordovaプラグインのルートフォルダ内に `package.json` ファイルが必要になります。


# ビルドエラー

Cordovaプラグインのルートフォルダ内にpackage.jsonファイルが含まれていない場合、ビルド時に下記のエラーが発生し、ビルドが失敗します。

```
npm ERR! Could not install from "../output/plugins/プラグインID" as it does not contain a package.json file.
```

現在、GitHub等に公開されているCordovaプラグインの中には、package.jsonファイルが含まれていないものも多数存在していますので、上記のビルドエラーが表示された場合は、package.jsonファイルが含まれているか確認してください。


# package.jsonファイルを追加する

GitHubに公開されているCordovaプラグインにpackage.jsonファイルが含まれていない場合は、CordovaプラグインのZipファイルをダウンロードして解凍し、package.jsonファイルを追加したものを再びZipファイルにしてMonacaプロジェクトにインポートすることで、ビルド時の上記のエラーを回避することができます。

package.jsonの記述例は、下記になります。

```json:記述例
{
  "name" : "SamplePlugin", 
  "version" : "0.0.1"
}
```

#おわりに

Cordovaプラグインのpackage.jsonエラーでビルドが失敗した場合は、一度、上記のように作成した package.jsonを追加したカスタム版のCordovaプラグインを作成してお試しください。
Djangoで最初のmigration時に絶対にやるべきこと

Python / Django でWebアプリケーションを作成する際に、最初にやっておかなければならないこと、それはUserモデルの拡張です。

#まずはこれ
https://torina.top/detail/350/
こちらを参考に、というかそのまま使ってまずはmodels.py、admin.py、settings.pyをカスタマイズします。

その際に、

```settings.py
ALLOWED_HOSTS = ['xxx.xxx.xxx.xxx']
（省略）
INSTALLED_APPS = [
（省略
    'accounts',
]
```

もお忘れなく。



また、上記参考サイトにないのですが、admin.pyには、次の記述も必要です。

```admin.py
import accounts
```

これをファイルの最初に書いておきます。
ちなみに、accountsというのはアプリ名ですので、ご自身のアプリ名に読み替えてください。


これをやってから、migrateします。

その後にSuperUserを作ります。

#最初にやらねばならない理由

https://qiita.com/sheep96/items/752acbda64898f20aab2
こちらをご覧ください。
PythonでSeleniumを実行するための導入

## Selenium導入  

自動テストツールSeleniumの導入を説明するページです。  

## テスト環境

  - OS  
    Windows10(64bit)
  - Selenium実行ツール  
    Python(3.6.5)

## Pythonの準備  

Pythonの準備を行います。

  - Python  
Pythonの準備を行います。  
https://www.python.org/  
上記からPythonをダウンロードし、インストールします。
  - 環境変数  
インストールが完了したら、  
「python.exe」と「pip.exe」を環境に変数に設定します。  
それぞれのパスは下記になります。
    - python.exe  
    C:\Program Files\Python36
    - pip.exe  
    C:\Program Files\Python36\Scripts

## Seleniumの準備

Seleniumの準備を行います。

  - Seleniumのインストール  
コマンドプロンプトを起動し、下記のコマンドを実施。

```
pip install selenium
```

  - ドライバーの準備  
  今回はIEのドライバーで実施します。  
  下記からIE用のドライバーをダウンロード  
  https://www.seleniumhq.org/download/

## Seleniumの実施  
Pythonを使用し、Seleniumを実行します。

任意のディレクトリにPythonファイルを作成し、下記コードを記載。  

```
from selenium import webdriver
browser = webdriver.Ie("ダウンロードしたIE用のドライバーのパス\\IEDriverServer_x64_3.11.1\\IEDriverServer.exe")
```

作成したファイルの拡張子は「.py」となります。

コマンドプロンプトを開き下記を実行。

```
cd 作成したpythonファイルのディレクトリ
pythonファイル名(拡張子込み)
```

上記を実施すると、IEが開きます。
Image Magic 覚書

## はじめに
Ver7になって、使えていたコマンドの打ち方がちょっと変わってあたふたしたので覚書。
## メモ
大量の画像データを処理することが多いので、軽い確認のためだけにphotoshopで１枚ずつ開くのは動作も重いし、ちょっと面倒なため、画像データの詳細を見るのに"identify"を使っているのですが、今までは以下のようで動きました。

```
$ identify image.png
```

Ver7からは以下のようになります。

```
$ magick identify image.png
```

他にも同じように使い方が変わったコマンドがあります。
コマンドのチュートリアルを確認しながら使うしかなさそうです。
https://www.imagemagick.org/script/command-line-tools.php

## 参考URL
teratailの過去記事に助けられました。
https://teratail.com/questions/92619
ありがとうございます。
社内向け学習（その他 001）

# 社内向け学習（その他 001）  

## 自動テストとヘッドレスブラウザ（画面なしブラウザ）

---

最近はchromeのヘッドレスモードが標準で使えるということなので、  
少し弄ってみることにしました。  

---

### seleniumしてみます。  

```selenium.py
# ブラウザを開く。
driver = webdriver.Chrome()

# Googleの検索TOP画面を開く。
driver.get("https://www.google.co.jp/")

# 検索語として「selenium」と入力し、Enterキーを押す。
driver.find_element_by_id("lst-ib").send_keys("selenium")
driver.find_element_by_id("lst-ib").send_keys(Keys.ENTER)

# タイトルに「Selenium - Web Browser Automation」と一致するリンクをクリックする。
driver.find_element_by_link_text("Selenium - Web Browser Automation").click()

# ブラウザを終了する。
driver.close()
```

```chrome_headless.py

# ヘッドレスモードを有効にする
options = Options()
options.add_argument('--headless')
options.add_argument('--disable-gpu')
options.add_argument('--no-sandbox')
# ChromeのWebDriverオブジェクトを作成する。
driver = webdriver.Chrome(chrome_options=options)

# Googleのトップ画面を開く。
driver.get('https://www.google.co.jp/')

# 検索語として「selenium」と入力し、Enterキーを押す。
driver.find_element_by_id("lst-ib").send_keys("selenium")
driver.find_element_by_id("lst-ib").send_keys(Keys.ENTER)
# タイトルに「Selenium - Web Browser Automation」と一致するリンクをクリックする。
# なぜか触れないのでスクロール。
# driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
driver.find_element_by_link_text("Selenium - Web Browser Automation").click()

# 証拠のスクリーンショットを撮る。
driver.save_screenshot('search_results_ebi.png')

# スクレイピング
elm = driver.find_element_by_xpath('//*[@id="mainContent"]/p[1]')
print(elm.text)

driver.quit()  # ブラウザーを終了する。
```

### 所感

私がPhantomJSなどのヘッドレスブラウザを使ったことがないので単純に比較はできないのですが、おもったよりも使いやすい印象を受けました。  

#### 良いところ。  
1. 自動実行できるように準備しておけば1台の端末でテストを動かしながら、  
 作業が継続できる。（当初の目的）
2. 少し処理が早い。（気がする）

#### 気をつけること。
1. 画面を見ながらじゃないので、画面の挙動でおかしい箇所がよくわからない。  （なれれば大丈夫かと。）

みんなもいじってみましょう。
[*WildFly*] org.dom4j.DocumentFactory cannot be cast to org.dom4j.DocumentFactory 対策

# はじめに
環境は以下。

* WildFly: 12.0.0.Final
* Java: 1.8.0_161
* NetBeans: 8.2
* CentOS: 7

# 発生したエラー
特に明示的にライブラリで`dom4j`というものは使ってないが内部の何かが使っているのか、
WildFlyにデプロイしようとすると以下のエラーが発生する。

```
"java.lang.ClassCastException: org.dom4j.DocumentFactory cannot be cast to org.dom4j.DocumentFactory 
Caused by: java.lang.ClassCastException: org.dom4j.DocumentFactory cannot be cast to org.dom4j.DocumentFactory"
```

# 対応

```bash
$ cd wildfly-12.0.0.Final/modules/system/layers/base/org/dom4j/main/
$ ls
# dom4j-1.6.1.jar  module.xml
$ sudo wget http://central.maven.org/maven2/org/dom4j/dom4j/2.1.0/dom4j-2.1.0.jar
$ sudo vim module.xml 
```

```xml
<module name="org.dom4j" xmlns="urn:jboss:module:1.5">
  <resources>
    <resource-root path="dom4j-2.1.0.jar"/> <!-- ここのバージョンを上げる -->
  </resources>

  <dependencies>
      <module name="javax.api"/>
      <module name="com.sun.xml.bind"/>
      <module name="javax.xml.bind.api"/>
      <module name="org.jaxen"/>
  </dependencies>
</module>
```

```bash
$ sudo systemctl restart wildfly
# 再起動後デプロイできた
```

# 参考

* [wildfly 10: java.lang.ClassCastException: org.dom4j.DocumentFactory cannot be cast to org.dom4j.DocumentFactory]()
Blobを使って（jQueryを使わずに）JavaScriptでデータをファイルに保存

# はじめに
JavaScript使ってBLEペリフェラルからのセンサーデータを受信して保存する環境を作ろうとしてるとこ。
BLEとの通信はできるようになったので、ファイルに保存する方法を調べた。
jQueryのことわからないので、JavaScriptだけでやる方法調べた。
ブラウザ上に表示されるボタンを押したらデータをテキストで保存できるようになった。
データが増えるたびに書き出す方法はよくわからない。

# 環境
- ChromeOS: 65.0.3325.184（Official Build） （64 ビット）

# 事前調査
## Blob
調べると、Blobオブジェクトを使った事例がでてくる。
どうやらこれを使えばいいらしい。

[Blob - Web API インターフェイス | MDN](https://developer.mozilla.org/ja/docs/Web/API/Blob#%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89)

## jQuery + Blob
検索では、jQuery使った方法が多い。
試したら動いたし、雰囲気わかるけど、修正するには勉強が必要そうなので、めんどくさい。

[Webページ作成覚書: javascript：ファイルの出力](http://s104bntmp.blogspot.jp/2013/10/javascript_8953.html)


他にも調べてたら、jQuery使わない方法があった。ありがたや。

[JavaScriptだけでファイルの保存機能を実装する - 新人Webエンジニアの記録。](http://blog.fagai.net/2014/08/09/javascript-only-save/)

# したこと

## HTML
ボタンをおくだけ。

```write.html
<!DOCTYPE html>
<html lang="ja">
<head>
<title>Blob</title>
</head>
<body>
<button id="download" class="button">download</button>
<script src="write.js"></script>
</body>
</html>
```

# JavaScript
Blobのオブジェクトを作って、```<a>```タグでリンクしてダウンロードできるようにする。
addEventListenerでボタンを押したらダウンロードできるようにする。

```write.js
download = function (data){
  var blob = new Blob(data, {type: "text/plain"});
  var a = document.createElement("a");
  a.href = URL.createObjectURL(blob);
  a.target = '_blank';
  a.download = 'hoge.txt';
  a.click();
}

document.getElementById('download').addEventListener('click', function() {
  var dat = [[1, 2, 3, '\n'], [1, 1, 1, '\n']];
  download(dat);
});
```

## 結果
ブラウザでみたところ。
![Screenshot 2018-04-22 at 10.28.27.png](https://qiita-image-store.s3.amazonaws.com/0/184221/1c1a174e-cab1-f65c-d688-9a9dcf754f66.png)

出力されるファイル
![Screenshot 2018-04-22 at 10.40.35.png](https://qiita-image-store.s3.amazonaws.com/0/184221/89463a17-ef44-a08d-4bd4-4815f1a2484f.png)


# その他
ファイルに追記する方法が見つからなかった。
新しくファイル作らなあかんかもやけど、とりあえずはデータを追加してblobオブジェクト作り直したら良さそう。
[Javascript. Append to blob - Stack Overflow](https://stackoverflow.com/questions/28281586/javascript-append-to-blob)

# おわりに
そこそこやりたいことできてよかった。
ただ、普段MATLABとかpythonとかCとか使ってるので、ファイルに保存するだけなのに…とめんどくさく感じた。
Webの技術だとセキュリティとか色々考えると仕方ないんかな？
ローカルで使いたいだけだから、JavaScriptじゃなくて他のでやれよって話なのかも。
回帰分析手順

#回帰分析手順
以下の仮説が成り立つと仮定して分析を行う

「説明変数$ x $のときの目的変数$ y $」は、
平均が$ Ax+B $で標準偏差が$ \sigma $の正規分布に従う

$ Ax+B $：母回帰

##単回帰式

```math
 y = ax + b　
```

## グラフ化
$ x $と$ y $をグラフ化する

## 回帰式を求める
$ y = ax + b $の $ a $と$ b $を求める
例）最小二乗法

###最小二乗法
残差平方和$ \sum(y-\hat{y})^2 $が最小になる$ a $と$ b $を求める
$ y $は実測値、$ \hat{y} $は予測値

```math
\begin{align}
a &= \frac{S_{xy}}{S_{xx}}\\
b &= \bar{y}-\bar{x}a
\end{align}
```

$ S_{xx} $は$ x $ の偏差平方和
$ S_{xy} $は$ x $と$ y $の偏差積和
$ \bar{y} $、$ \bar{x} $はそれぞれ$ y $と$ x $の平均値

```math
\begin{align}
S_{xx} &= \sum^n_{i=1}(x_i-\bar{x})^2\\
S_{xy} &= \sum^n_{i=1}(x_i-\bar{x})(y_i-\bar{y})
\end{align}
```

## 回帰式の精度確認
### 重相関係数

```math
R = \frac{S_{y\hat{y}}}{\sqrt{S_{yy} \times S_{\hat{y}\hat{y}}}}
```
$ S_{y\hat{y}} $は$ y $と$ \hat{y} $ の偏差積和
$ S_{yy} $は$ y $の偏差平方和

```math
\begin{align}
S_{y\hat{y}} &= \sum^n_{i=1}(y_i-\bar{y})(\hat{y_i}-\bar{\hat{y}})\\
S_{yy} &= \sum^n_{i=1}(y_i-\bar{y})^2\\
S_{\hat{y}\hat{y}} &= \sum^n_{i=1}(\hat{y_i}-\bar{\hat{y}})^2
\end{align}
```

### 決定係数
重相関係数の二乗($ R^2 $)
寄与率ともいわれる
0から1までの値をとり、1に近づくほど精度が高い

以下の式も成り立つ

```math
R^2 = 1 - \frac{S_e}{S_{yy}}
```

## 回帰係数の検定
## 母回帰を推定
## 予測
LibreOffice用Pythonマクロ　ライブラリの作成（超初心者向け）

注意)
このページのマクロは、Libreofficeの「マクロの実行」で動作させます。

LibreOfficeでPythonマクロを実行するには、
UbuntuのLibreOffice(MS Office互換性あり)でPythonマクロを使用する方法（超初級者向け）
https://qiita.com/ty21ky/items/2c8b001363c8293198e2
を参照ください。

実行した環境

Ubuntu Stdio 17.10
LibreOffice 6.0.0.3
Python 3.5.4(LibreOfficeバンドル)

#####ライブラリの保存場所
/opt/libreoffice6.0/program/python-core-3.5.4/lib/site-packages
これはVerによっても異なります。

「site-packages」フォルダは後から追加するパッケージ用のフォルダです。パッケージを追加する方法がわからないのですが？

実は、/opt/libreoffice6.0/program/python-core-3.5.4/lib/site-packagesはWindows用のフォルダで、Ubuntuでは/opt/libreoffice6.0/program/python-core-3.5.4/lib/python3.5/site-packagesになります。
せっかくあるものは利用しないともったいない。

ここは、普通のユーザーでは保存出来ないので、端末から「$ sudo　ｖｉ」等でエディタを起動して使うと思いますが、私のような初心者は「$ sudo gedit」等の使い慣れたエディタを使います。

```python:test_test.py
def test(a,b):
    return a*b
```

次にPythonマクロを
/home/ユーザ名/.config/libreoffice/4/user/Scripts/python/
フォルダに作成します。
「.config」は隠しフォルダですから、ファイルマネージャー等で「表示　ー＞　隠しファイルを表示にチェックを入れる」
または、端末で
~$ ls -a
とやると表示されます。

```python:import_test.py
import test_test

def test():
    oDoc = XSCRIPTCONTEXT.getDocument()
    oText = oDoc.getText()
    oText.String = str(test_test.test(100,200))
```

次にLibreOffice Writerを起動し
ツール　ー＞　マクロ　ー＞　マクロを実行　ー＞　マイマクロ　ー＞　import_test　ー＞　test　ー＞　実行　
とすると、Writerに20000と表示されます。
引数 100と200を掛けて20000の戻り値が帰ってきて、表示しています。
【備忘録】SourceTreeで「fatal: unable to access 'https://github.com/XXX': error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version」となった件

# はじめに

こんにちは、mucunです。

久しぶりにSourceTreeを動かして、オープンソースをCloneしようとしたら、「fatal: unable to access 'https://github.com/XXX/': error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version」というエラーが出ました。
色々やっていたら解決したので、備忘録として対策方法を書いておきます。

# 結論「内臓Gitを更新」すればOK

色々と調べた結果、手順としては以下のステップを踏んで、私は解決しました。

> 
① Gitのバージョンを新しいものに更新（https://gitforwindows.org/）
② SourceTreeもバージョン更新（https://www.sourcetreeapp.com/download-archives）
③ 「内臓Gitを更新」

以上です。

③の「内臓Git」については、SourceTreeを起動して、メニューから「ツール→オプション→Git」と進んだ先に、以下のウィンドウに行った先にある「内臓Git」ボタンを押すことで実施できます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/126499/368d4d67-b497-2f9b-c0ad-8390fdbbae0d.png)

# 最後に

オープンソース文化にて、最新のアルゴリズムが簡単に入手できるのは、本当に有難いのですが、媒介ソフトのバージョン更新などには結構苦労しますね。
自らコーディングする方が早い場合は、そうすべきと思いました。

以上、読んで下さった方、ありがとうございました。m(_ _)m
自動運転OSSのApolloの監視システムについて

## はじめに
最近、IoT関連に携わることになり、いろんなデバイスが繋がる仕組みを安心して使うために必要な監視機構が気になっている. そこでROSを使っている自動運転OSS Apolloの監視の仕組みについて調べることにした.

## 自動運転OSSのApollo
[Apllo][link-apollo]は、バイドゥが中心に開発している自動運転のソフトウェアで、先日2018/04/18にversion 2.5がリリースされた. 現在、自動運転OSSで一番人気のあるソフトウェアである. ROSをベースに作られており, 様々なデバイスと連携してる複雑なシステムである.
[link-apollo]:https://github.com/ApolloAuto/apollo

## ROS (Robot Operating System)
[ROS][link-ROS] とは、ロボットなど様々なセンサーが複雑に絡み合うようなシステムの構築をサポートするミドルウェアで、各センサーデータやアルゴリズムの処理結果をpub/sub形式でやりとりできる仕組みである.
このようなミドルウェアに乗っかって開発することで、ハードウェアエンジニア、ソフトウェアエンジニアともに多数の独自インターフェースに悩まされることがなくなる.
[link-ROS]:http://www.ros.org/

## Apolloの監視機構
それでは、本題のApolloの監視(`modules/monitor`)の仕組みを見ていく.
ApolloのMonitorには...

1. Hardware Monitor
2. Software Monitor
    1. Process Monitor
    2. Topic Monitor
    3. Summary Monitor
3. Reporters
    1. Static Information Reporter
    2. Vehicle State Reporter

の機能がある. 
これらの監視がそれぞれ別々のスレッドで行われるようになっており、それぞれ個別に設定されたインターバル毎に監視(`monitor/common/recurrent_runner.cc`)が行われるようになっている. 
それぞれ監視の内容を見ていく.

## Hardware Monitor
自動運転車両は、車(CAN), GPS(GNSS), LiDAR(距離計測センサー)やカメラなどいろんなデバイスとつながっているので、ハードウェアが必須である.
ApolloのHardware MonitorにはCANとGPSの監視が備わっている.
基本的には、監視名(string)、監視ステータス(int)、監視メッセージ(string)を返す.

### CAN (Controller Area Network)
CANは車載ネットワークで、車両状態や車両の制御信号が流れている[1]. ブレーキやステアリングの信号を流すためにもCANと安定的に繋がっていることを監視することは非常に重要である.

**監視内容**
ESDとSocketに対応していて、それぞれ別の監視を行っている.
ESDは専用SDKを用いて、Socketは `ioctl` を用いて、CANのドライバーから取得できる情報が安全かバリデーションを行っている.

**監視間隔**
デフォルトでは3秒置きとなっている.

### GNSS(GPS)
位置特定には、スキャンマッチングやデッドレコニングというGPSを用いない手法もあるが、もちろんGPSも非常に重要な位置特定センサーである.

**監視内容**
緯度経度、高さの分散が50cm以上でWARNとなり、それが5秒続くとERRORにステータスが変化する. (50cmと5秒というのはデフォルト値であり、設定することが可能)

**監視間隔**
GPSもCANと同様に3秒置きという設定がデフォルトとなっている.

## Software Monitor

### Process Monitor
**監視内容**
プロセスの死活監視. プロセスの実行コマンドに文字列マッチでひっかけて見つかれば問題ないというようになっている. 
同じ実行コマンドで複数プロセス動いているときに、何個以上生きていて欲しいといった設定はできない.

**監視間隔**
1.5秒置きというのがデフォルトの設定.

### Topic Monitor
**監視内容**
各トピック毎にメッセージが届いているかどうか、各トピック毎に設定できる `acceptable_delay` をチェックし、遅延時間を記録.

**監視間隔**
5秒置きというのがデフォルトの設定で、すべてのトピックが同じ頻度で監視される.

### Summary Monitor
ハードウェア監視とソフトウェア監視(プロセスとトピック)の結果を集約しシンプルなステータス"OK", "WARN", "ERROR", "FATAL"で表現し、システムステータスのトピックにパブリッシュしログを残す.

**監視間隔**
8秒置きにブロードキャストする.

## Reporters
### Static Information Reporter
**レポート内容**
[車両情報やユーザー情報、ハードウェア・ソフトウェア情報など静的な情報][link-2]を記録.
[link-2]: https://github.com/ApolloAuto/apollo/blob/master/modules/data/util/info_collector.cc#L75-L83

**レポート間隔**
40秒置きにレポートする.

### Vehicle State Reporter
**レポート内容**
位置や向きなど刻々と変化する情報をエンドポイントに送信する. 詳しくは[プロトコルバッファの定義][link-1] を参照. 
[link-1]:https://github.com/ApolloAuto/apollo/blob/master/modules/common/vehicle_state/proto/vehicle_state.proto

**レポート間隔**
5秒置きにレポートする.

## まとめ
自動運転OSSのApolloの監視機構について見てきた.
どの監視も頻度がデフォルトでは低いことがわかった. 実際の運用がどれくらいの頻度に設定され行われているか不明だが、仮に5秒置きの監視だと、低速である時速30km (自動運転で時速30kmはボチボチ早い) でも監視の間に約40mも進んでしまうことになる.
多数のモジュールが複雑に連携しており、リアルタイム性が求められるシステムの割には監視の頻度や柔軟性が乏しいと感じた.
wemos d1でanalogread

#概要
wemos d1でanalogreadして、digitalWriteしてみた。

#写真

![MVC-005F.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/a206e092-df7c-fe39-ed3b-9684d47fa2c1.jpeg)

#回路図


![esp.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/6d7c9b43-6c0b-f209-8c01-6bbb25e42e4f.jpeg)


#サンプルコード

```
void setup()
{
	pinMode(2, OUTPUT);
	pinMode(0, OUTPUT);
	pinMode(16, OUTPUT);
	Serial.begin(115200);
	while (!Serial) delay(250);
	Serial.print("ok");
	Serial.println();
}
void loop()
{
	int val = analogRead(A0);
	int range = map(val, 0, 1024, 0, 6);
	switch (range) 
	{
	case 1:
		Serial.println("1");
		digitalWrite(0, LOW);
	break;
	case 2:
		Serial.println("2");
		digitalWrite(0, HIGH);
	break;
	case 3:
		Serial.println("3");
		digitalWrite(16, LOW);
	break;
	case 4:
		Serial.println("4");
		digitalWrite(16, HIGH);
	break;
	case 5:
		Serial.println("5");
	break;
	case 6:
		Serial.println("6");
	break;
	}
	delay(1);
	digitalWrite(2, LOW);
	delay(500);
	digitalWrite(2, HIGH);
	delay(500);
}

```

以上。
規格書で比較するプログラミング言語の複雑さ

言語仕様が一番複雑なプログラミング言語は何だろうか？主観的な意見として、○○の機能があるとか、ないとか、そういう話になるだろう。しかし、客観的に判断するとしたら、どうするべきだろうか？

一つは[BNF](https://ja.wikipedia.org/wiki/%E3%83%90%E3%83%83%E3%82%AB%E3%82%B9%E3%83%BB%E3%83%8A%E3%82%A6%E3%82%A2%E8%A8%98%E6%B3%95)を用いた比較だろう。しかし、BNFは文法の複雑さの指標になっても、それらが意味するところの解釈の複雑さについては指標にならない。そこで、解釈を含めたその言語仕様を全てカバーしたもの、つまり、規格書を比較すればいいのではないかと考えた。

プログラミング言語によっては国際的な規格書が存在しないものもある。特にオープンソースで開発されている言語では、コミュニティーの合意によって作成された複数の文献によって仕様が形作られているというのもある。なかには、実装がそのまま仕様であり、明文化されていないものもあるだろう。また、仕様自体がHTMLである場合、それがどれぐらいの量であるかを把握するには難しい(各ページの文字数カウント等が必要であろう)。そこで、今回はPDF化・書籍化されたものに限定し、ページ数を数えることにした。規格書についてはWikipediaの下記ページを参考にした。

[Comparison of programming languages - Wikipedia](https://en.wikipedia.org/wiki/Comparison_of_programming_languages)

以下、主な言語についてまとめた表である。内容やページ構成の違いによって大きくページ数が異なることがあるため、**絶対的な指標とはならない**ことに注意して欲しい[^1]。

[^1]: 詳しくは@take_cheezeさんのコメントを参照。

|言語|規格書|ページ数|
|---|---|---|
|Fortran|[ISO/IEC 1539-1:2010](https://www.iso.org/standard/50459.html) + [ISO/IEC 1539-2:2000](https://www.iso.org/standard/26934.html)|603 + 20|
|COBOL|[ISO/IEC 1989:2014](https://www.iso.org/standard/51416.html)|927|
|C11|[ISO/IEC 9899:2011](https://www.iso.org/standard/57853.html)|683|
|C++17| [ISO/IEC 14882:2017](https://www.iso.org/standard/68564.html)|1605|
|C#2.0|[ISO/IEC 23270:2006](https://www.iso.org/standard/42926.html)|531|
|Ruby1.8|[ISO/IEC 30170:2012](https://www.iso.org/standard/59579.html)|313|
|ECMAScript8|[Standard ECMA-262](https://www.ecma-international.org/publications/standards/Ecma-262.htm)|885|
|C#5.0|[Standard ECMA-334](https://www.ecma-international.org/publications/standards/Ecma-334.htm)|516|
|Java10|[Java SE Specifications](https://docs.oracle.com/javase/specs/)|772|
|SQL:2016|[ISO/IEC 9075-1:2016](https://www.iso.org/standard/63555.html) 1,2,3,4,9,10,11,13,14|78+1707+391+188+471+376+327+151+444 = 4133|

※ C#、Rubyについては国際規格の方が後付けであるため、最新のバージョンよりも低い。そのため、その後のバージョンでで追加された機能は記載されていない。
※ 規格化に当たり、全ての言語仕様が記載されていない場合がある。Rubyは1.9以降を考慮したサブセットでの記述になっているし、ECMAScriptにはブラウザのJavaScriptで標準搭載されているDOM周りのAPIは含まれていない。

C++はRubyの5倍以上である。他言語と比較してもほとんどの言語に対してダブルスコアをたたき出している。よくC++は言語仕様が複雑という話があるが、客観的な指標のひとつとしてこの表をみれば納得できるか面もあるかと思う。
HTML/CSS 基本フォントサイズについて考える


フォントサイズ検証時のメモ。
「変数名なんだっけ？」→ 探す は避けたい。
フォントファミリーによって"大きさ感"や"ジャギー感(特にWindows)"が変わるので、実ブラウザでのチェックは必要。


## 前提

ブラウザ間の相違を無くす [normazire.css](https://necolas.github.io/normalize.css/) を導入

CSS が読み込まれる順序は以下の通り

1. ブラウザのデフォルト値
2. normazire.css
3. 自分のスタイルシート style.css

normazire.css を適用、自分のスタイルシートが白紙の時のフォントサイズ/行高 は以下の通り。

デフォルト = `font-size: medium`
16px/18.4px (1.15)

フォントファミリーはブラウザで異なる (Safari はヒラギノ明朝、Chrome や Firefox はゴシック体など)


## フォントサイズのキーワード指定 (サイズと行間の一覧)

ブラウザデフォルトで xx-small 〜 xx-large までの７つの絶対サイズ + 2つの相対サイズをキーワード指定できる。
行高は指定なしなら line-height: 1.15 を引き継ぐ

### 相対サイズ

現在適用されているフォントサイズの相対で大きさが決まる。
以下、ベースフォント16pxの場合

* `font-size: larger` 19.2px (120%)/22.0833px
* `font-size: smaller` 13.3333px (10/12 = 83.333125%)/15.3333px


### 絶対サイズ

ベースフォントや現在のフォントサイズに影響されず、常に一定の大きさ。
昔の `<font size="1">` 〜 `<font size="7">` と同等の効果。
ブラウザで文字を大きくした際も影響を受けない。
※ 自分は使うことはないと思う

* `font-size: xx-large` 32px (200%)/36.8px
* `font-size: x-large` 24px (150%)/27.6px
* `font-size: large` 18px (112.5%)/20.7px
* `font-size: small` 13px (81.25%)/14.95px
* `font-size: x-small` 10px (62.5%)/11.5px
* `font-size: xx-small` ※ 10px 以下は 10px に自動調整するブラウザがあるので使わない


## 小さい文字を指定するのに small 要素を使う？

> HTML の `<small>` 要素は、テキストのフォントサイズをブラウザーの最小フォントサイズを限度として、一段階縮小します（例えば large から medium へ、 small から x-small へ）。
> HTML5 において、表示上のスタイルとは関係なく、この要素は著作権表示や法的表記のような、注釈や小さく表示される文を表すために再提案されました。
> [small - HTML | MDN](https://developer.mozilla.org/ja/docs/Web/HTML/Element/small)

HTML5 に従い、著作権や法的表記のような注釈等の小さく表示する文に使うこととする。
注釈なら使うシーンは多くある。


## 実際の使用例 (Sass のサンプル)

SCSSの変数、HTMLタグのクラスの両方でフォントサイズを指定できるようにする。

* 覚えやすいので、上記の"絶対サイズ"のキーワードに合わせたものとした。
* 必ずサイズが続くので、クラス名前半は "font-size-" でなく "font-" と短くした。
* 単位は常にベースフォント(html 要素のフォントサイズ)を基準とする rem とした。
* 比率は変えれない larger, smaller でこと足り、HTMLのクラス指定で使わなくていいなら、変数/クラスを減らすなどの調整も可。

```scss
$font-xx-large: 2rem;
$font-x-large : 1.5rem;
// larger: 1.2rem
$font-large   : 1.125rem;
// smaller: .83333125rem
$font-small   : .8125rem;
$font-x-small : .625rem;

.font-xx-large { font-size: $font-xx-large; }
.font-x-large  { font-size: $font-x-large;  }
.font-large    { font-size: $font-large;    }
.font-small    { font-size: $font-small;    }
.font-x-small  { font-size: $font-x-small;  }

// 使用例 1 (変数を使用)
.note {
  font-size: $font-x-small;
}

// 使用 2 (larger, smaller を使用)
.read {
  font-size: larger;
}
```

HTMLのクラスで実装する場合は、

```html
<p class="font-x-small">小さい文字</p>
```

## 参考記事

* [font-size - CSS: カスケーディングスタイルシート | MDN](https://developer.mozilla.org/ja/docs/Web/CSS/font-size)
Railsでcssをコントローラー単位で読み込む

rails g controller hogeでviewは自動でcontroller毎にフォルダ管理されるけど、cssはされず、全てのcssファイルを読み込んでしまいます。

せっかく、viewはcontroller毎に管理してあるのだから、stylesheetもcontroller毎に管理したい。

- まずは、//= require_treeを削除する

```scss:application.scss
/*
 * This is a manifest file that'll be compiled into application.css, which will include all the files
 * listed below.
 *
 * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
 * or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
 *
 * You're free to add application-wide styles to this file and they'll appear at the bottom of the
 * compiled file so the styles you add here take precedence over styles defined in any styles
 * defined in the other CSS/SCSS files in this directory. It is generally better to create a new
 * file per style scope.
 * 
 *= require_self
 */
```

この時、require_selfは残しておいて良い

- stylesheetのフォルダを作成する

> viewsでのフォルダ管理と同じように、
cssに関してもフォルダを作成し、その中に適用したいファイルを保存するようにします。
今回は、usersControllerとTopControllerがあると仮定して、下記のようなディレクトリ構造にしました。

```
app/
  ├ assets/
  |  └ stylesheets/
  |       └ application.scss
  |       ├ user
  |       ├ top
  |
  ├ views/
     └ layouts
     ├ user
     ├ top

```

- viewファイルにstyleSheet_link_tagを記述

> viewのtopフォルダにindex.html.erbがあるとして、styleshhetのtop/index.scssを読み込みたいとすると、下記の様に記述します

```erb:index.html.erb
 <%= stylesheet_link_tag "top/index", :media => "all" %>
```

- プリコンパイルに追加する。

> これはcssならしなくて良いのですが、scssを使うならプリコンパイルに追加する必要があります。

```rb:config/initializers/assets.rb
Rails.application.config.assets.precompile += %w( top/index )
```

これをしないとエラーが出るので、注意です。

一応、任意のスタイルシートだけを適用できる様になったけど、もっとよくて簡単な方法ある気がする、、、
【Swift】defer文

# 実行環境
- Swift4
- Xcode9.3

# defer文
スコープを抜ける際に実行したい処理を定義する。
複数のdefer文を記述した場合は逆順で実行される。
## 単体のdefer文
```swift
func deferTest() {

    defer {
        print("defer文実行")
    }

    print("Hello, World.")
}
deferTest()

// 【結果】
// Hello, World.
// defer文実行
```
## 複数のdefer文
下に宣言したほうが先に実行される。

```swift
func deferTest() {

    defer {
        print("defer文実行_1")
    }

    defer {
        print("defer文実行_2")
    }

    defer {
        print("defer文実行_3")
    }

    print("Hello, World.")
}
deferTest()

// 【結果】
// Hello, World.
// defer文実行_3
// defer文実行_2
// defer文実行_1
```

# 使用例
## 関数のスコープの場合

```swift
func deferTest(param: String) {

    defer {
        print("defer文実行")
    }

    if param == "blue" {
        print("スコープを抜けます")
        return
    }
}
deferTest(param: "blue")

// 【結果】
// スコープを抜けます
// defer文実行
```
## 関数以外のスコープの場合
```swift:繰り返し文
func deferTest() {

    let arrayData = ["red", "blue", "yellow", "pink"]
    
    for data in arrayData {
        defer {
            print("defer文実行")
        }

        if data == "blue" {
            print("スコープを抜けます")
            break
        }

        print(data)
    }
}
deferTest()

// 【結果】
// red
// defer文実行
// スコープを抜けます
// defer文実行
```
# 注意点
あくまでdeferは処理をスコープが終わるまで待つというものであり、deferが待ち始める前にbreakやreturnなどでスコープを抜けてしまうと実行されない。

```swift
func deferTest(param: String) {

    if param == "blue" {
        print("スコープを抜けます")
        return
    }
    // このdeferは実行されない
    defer {
        print("defer文実行")
    }
}
deferTest(param: "blue")

// 【結果】
// スコープを抜けます
```
Rustのクレート・ツールを探すための情報源

Rustのstdライブラリは、最小限の機能しか持っておらず、なにか実用的なコードを書くのであれば他の様々なクレート(ライブラリ)を利用する必要があります。ただし、知らないものを利用することはできないので、どういうクレートが存在するかを調べなければなりません。以下に、Rustのクレートやツールを調べるのに役立ちそうな情報源のリストを載せておきます。

# [crates.io](https://crates.io/)

コミュニティが開発した各種のクレートが登録されている場所で、Cargo.tomlに依存クレートを記述した場合、基本的にはここに公開されているクレートを探してダウンロードしてきます。自作のライブラリを利用してもらいたければ、ここに登録しておきましょう。

ページ上部の検索窓に入力すれば、関連しそうなクレートを検索してくれます。また、大雑把なカテゴリ分けもされています。ただし数が多いので、ここから自分の目的に合致したクレートを探すのは難しいかもしれません。

# [Awesome Rust](https://github.com/rust-unofficial/awesome-rust)

Rust製のプロジェクト・ツール・ライブラリ等を細かいカテゴリ別にまとめたものです。興味があるカテゴリをざっと眺めるだけでも、こういうクレートがあるのか、と勉強になると思います。人気のあるライブラリ・ツール類はたいていここに載っているはずです。

# [This Week in Rust](https://this-week-in-rust.org/)

週刊でRustの最新情報を提供してくれます。Rustについてのニュースやブログ記事の紹介が主ですが、"Crate of the Week"というクレートを紹介する欄があります。

# [stdx - The missing batteries of Rust](https://github.com/brson/stdx)

Rustでプログラミングするうえで、必須となるようなクレートを集めたリストです。実際、Rust以外の言語、例えばPythonであればstdに含まれていたであろう機能を提供するものばかりです。ここのリストに載っているクレートは、名前ほどは覚えておいて損は無いはずです。役立つリストですが、残念ながら2017年7月から更新されていないようです。
[Go] 一定時間特定の処理を繰り返し行う

特定の処理をひとまとめにした関数を `block` とします。

**１秒後に特定の処理をしたい**とき、非同期処理でなければ `time.Sleep(time.Second)` を普通に使えば良いし、非同期処理であれば `time.After(time.Second)` を使って、

```go
done := time.After(time.Second)
// todo
<-done
block()
```

とすれば良いでしょう[^1]。  
[^1]: この書き方だと `// todo` が１秒以内に終了しなければいけません。もし終了しない場合は
 `time.AfterFunc(time.Second, block)` で頑張ってください。

しかし、**１秒間に特定の処理を繰り返し行いたい**ときに使う関数が標準ライブラリの中に見当たらなかったので今回作ってみました。

```go
func DuringFunc(d time.Duration, f func()) {
	flg := true
	go func() {
		for flg {
			f()
		}
	}()
	time.Sleep(d)
	flg = false
}
```

特に説明はいりませんね。
使い方は、

```go
DuringFunc(time.Second, block)
```

といった感じです[^2]。

これにより例えば、最初にアクセスがあってから１秒間は連続するアクセスを受け付けるが、１秒経過後はアクセスを受け付けない、といったときに使えます。

[^2]: 一般的に `DuringFunc` で実行した `block` の合計処理時間は１秒以上になります。つまり、最初の `block` を実行し始めてから１秒経過したときに実行している `block` の処理が完了するまで `DuringFunc` は return されません。

もしかしたら自分の調査不足で標準ライブラリの中にそれらしい関数があるかもしれないので、知ってる方がいたらコメント欄でこっそり教えてください！

言うまでもないですが、１秒のところ（`time.Second`）を１以上の `time.Duration` 型の値に変えれば任意の一定時間特定の処理を繰り返し行うことができます。

- 非同期で１秒後に特定の処理をするサンプル: https://wandbox.org/permlink/txn4tJAlERsrFEMa
- １秒間に特定の処理を繰り返し行うサンプル: https://wandbox.org/permlink/v1Km9sIYoNlAXcUl

### 【追記】2018/4/24

goroutine を 明示的に使わずに `DuringFunc` を作りたい場合は、

```go
func DuringFunc(d time.Duration, f func()) {
	done := time.After(time.Second)
	for cond := true; cond; {
		select {
		case <-done:
			cond = false
		default:
			f()
		}
	}
}
```

のようにもできますね。ただ `select` で受けない分、最初に示した `DuringFunc` のほうが早そうです。
https://wandbox.org/permlink/Uqe412Q7Fq8JqurS
Google Colaboratory を試してみる

# はじめに
　同僚からGoogle Colaboratoryを教えてもらったので、早速試して見ました。
https://colab.research.google.com/

　下記の記事を参考にさせていただきました。
https://www.codexa.net/how-to-use-google-colaboratory/
https://qiita.com/kouki_outstand/items/cd24dccbaa92274be39e
http://itsukara.hateblo.jp/entry/2018/02/05/214949

# 所感

- Jupyter notebook に慣れていれば、すぐに使い始められる。
- 同じnotebookを2台の端末でconnectすると、変更はほぼリアルタイムに伝わる。リモートでのペアプログラミングやコーチングに十分使えそう。
- Chromeさえあればすぐに使い始められるので、ハンズオントレーニングなどに活用できそう。
- !記法で普通にLinuxのコマンドが使えるのもありがたい。
- iPadのChromeはまだ未対応？なのか、ちょっと使いづらい。キーボードを繋げば改善するかも。

# おわりに
　Google Colaboratory の使い方を考察して見ました。個人の開発環境としてはもちろん、名前の通り複数人でのコラボレーション＝共同作業に活用できるところが利点と感じました。
イテレータの実装(例:フィボナッチ数列)

Javaの拡張for文がとても便利
自作クラスもイテレータとして与えられることを知ったので自分メモ
(基礎すぎるからかあまり記事がなかった気がする....)

使い方


``` Main.java
package fibonacci;

class Main{
  public static void main(String[] args){
    for(int i:Fibonacci.to(10)){
      System.out.println(i);
    }
  }
}
```


拡張for文の説明
for(イテレータが返してくれる値を格納する変数の定義: イテレータ)


では実際のFibonacciクラスの実装

```Fibonacci.java
package fibonacci;

import java.util.Iterator;

public class Fibonacci implements Iterator<Integer>, Iterable<Integer>{
	private int num1;
	private int num2;
	private int num3;
	private int count;
	private int to;
	
	public Fibonacci(int to){
		this.num1 = 0;
		this.num2 = 1;
		this.to = to;
		this.count = -1;
		
	}
	
	public static Iterable<Integer> to(int num){
		return new Fibonacci(num);
		
	}
	
	@Override
	public Iterator<Integer> iterator(){
		return this;
	}
	
	@Override
	public boolean hasNext(){
		if(count < to){
			count++;
			return true;
		}
		return false;
	}
	
	
	@Override
	public Integer next(){
		if(count < 2){
			return count;
		}

		num3 = num1 + num2;
		remove();
		
		return num3;
	}
}
```

まずは実装しているインターフェース
Iterable<T>インターフェースとIterator<T>インターフェース

先程拡張for文の:(コロン)の後はイテレータを指定すると書きましたが、少し違うようですね。
拡張for文で使えるようにするにはIterableインターフェースを実装しているクラスである必要があります。

Iterable<T>インターフェースのiteratorメソッドがIterator<T>のオブジェクトを返すのでそいつが1つづつ返す値をfor文の中でループさせる感じですかね。

Iterator<T>インターフェースで実装する必要があるメソッドは
`boolean hasNext()`
`T next()`

とりあえずこいつらを実装すればforで回せます。
両方共その名の通りです。
`boolean hasNext()`は「次の値があるかないか」を判定するメソッド
`T next()` はT型の次の値を返すメソッド

拡張forでIterable<T>を実装したクラスが指定されるとまずは
Iterator<T>を返すメソッド(今回の場合は`to(int num)`)が呼ばれる。
`boolean hasNext()`が`true`を返した場合`T next()`が実行される感じですね。

あと気になったことは`void remove()`と`void forEachRemaining(Consumer<? super E> action)`メソッド。
両方共default句が付いているので実装しなくてもエラーにはなりませんし、今回のケースに限っては困りません。(わかる方がお読みになりましたら是非教えていただきたいです)

実行例

```
% java Main
0
1
1
2
3
5
8
13
21
34
55
```
CUDA・docker・docker-compose・nvidia-dockerのセットアップメモ

CUDA・docker・docker-compose・nvidia-dockerのセットアップメモ
# ① Ubuntu 16.04, GeForce GTX TITAN X, CUDA 9.1 @ 2018年4月上旬

## CUDA
ここ (https://developer.nvidia.com/cuda-downloads) からファイルをダウンロードして，そこに書かれている手順でインストールします．ここは失敗しない．

```shell:
$ wget http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-repo-ubuntu1604_9.1.85-1_amd64.deb
$ dpkg -i cuda-repo-ubuntu1604_9.1.85-1_amd64.deb
$ apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/7fa2af80.pub
$ apt-get update
$ apt-get install cuda
```

## Driver
ここ (http://www.nvidia.com/Download/index.aspx) からダウンロードしたいのですが，TITAN X, Ubuntu 16.04 を選択するとなぜか存在しないと言われます．そこで以下の手順でdriverをインストールします．

```shell:
$ add-apt-repository ppa:graphics-drivers/ppa
$ apt-get update
$ apt-get install nvidia-390
```

動作確認: `nvidia-smi`

## docker

```shell:
$ wget -qO- https://get.docker.com/ | sh
```
動作確認: `docker run --rm hello-world`

ただし，nvidia-dockerが入らなかったのでダウングレードしました (`18.04.0` -> `18.03.0`)．

```shell:
$ apt-get install docker-ce=18.03.0~ce-0~ubuntu
```

**私が勘違いしていたようで，事前にdockerをインストールする必要はなく，nvidia-dockerするだけで良かったようです．**

## nvidia-docker
~~上記のようにダウングレードしておけば`apt-get`でインストールできます．~~
事前にdockerをインストールする必要はなく，下記のコマンドでdockerも含めてインストール可能なようです．

https://nvidia.github.io/nvidia-docker/ を参考にRepositoryを追加します．

```shell:
$ curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | \
  sudo apt-key add -
$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
$ curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | \
  sudo tee /etc/apt/sources.list.d/nvidia-docker.list
$ sudo apt-get update
```

そしてインストール．

```shell
$ apt-get install nvidia-docker2
$ pkill -SIGHUP dockerd
```

動作確認: `nvidia-docker run --rm nvidia/cuda:9.1-cudnn7-devel-ubuntu16.04 nvidia-smi`

## docker-compose

```shell
$ pip install docker-compose
```

# ② Ubuntu 18.04, Quadro K2200, CUDA 9.1 @ 2018年5月上旬

## CUDA
現時点では18.04をサポートしていません．（すぐにサポートされると思われますが）
そこで，公式からダウンロードした17.04の用のRunfileを用いてインストールしました．

```shell:
$ apt-get install g++-6
$ apt-get install nvidia-cuda-toolkit

$ wget https://developer.nvidia.com/compute/cuda/9.1/Prod/local_installers/cuda_9.1.85_387.26_linux
$ ./cuda_9.1.85_387.26_linux --override
```

インストール中に「サポートしていないsystemにインストールするか？」と聞いてくるので`yes`と答えます．次に「Driverをインストールするか」と聞かれますが後で入れるので`no`と答えます．
あとは適当に答えるとインストールできます．
(参考: https://askubuntu.com/questions/1028830/install-cuda-on-ubuntu-18-04)

## Driver 

```
$ apt-get install nvidia-driver-390
```

## nvidia-docker
Dockerは事前にインストールしなくても，①の手順で`nvidia-docker2`をインストールできました．
全てのディレクトリからnode_modulesを削除する

全てのプロジェクトをバックアップするには、それぞれに散らばってる`node_modules`が邪魔なので削除するためのコマンドです。

```bash
find . -name 'node_modules' -type d -prune -exec rm -rf '{}' +
```

# 参考
https://stackoverflow.com/questions/42950501/delete-node-modules-folder-recursively-from-a-specified-path-using-command-line
テストする際に気を付ける点

## テストし易いコードを書く為にやっていること

### 関数、メソッドの引数、返り値の型を制限する
例

```php
public function formatPrice(int $price):string
{
return number_format($price) . "円";
}
```
このように引数に型を宣言することで、宣言した型の引数のみテストすれば良くなり、テストパターンを減らす事ができる。ただしPHP7からの機能です。
※関数、メソッドの引数、返り値の型を制限のテストは別で行っておく必要はあると思います。

### 1つのメソッドには1つの機能だけ持つようにする。
メソッド名が長くなりすぎたり、○○○And○○○みたくなってたりした場合は1つのメソッドに機能をもたせすぎている場合がある。2以上の機能があるとテストしにくい。

###　DBテスト用のDBを用意する
これについては別で記事を書いたので以下のURLを見ていただければと思います。
[laravelでDBテストコードを書く前の設定すべきこと](https://qiita.com/kuriya/items/4c9dbefc19514f415374)

### DBに対しての処理はRepositoryクラスにまとめる
DBに対しての処理をRepositoryクラスにまとめることで、何度もDBに対しての処理のテストを書く必要がなくなる。またテストコードも見やすくなる。

### テストコードを書きすぎない
テストコードを増やし過ぎると、1回1回のテストの処理が重くなって開発速度が下がってしまう。
また、テストを追加するのは簡単だが、テストを減らすのはそのテストを書いた人でないと出来ないケースが多いので、テストを書く段階で本当にそのテストが必要か考えてから書くべきです。

### テストのメソッド名を日本語で書く
日本語の分かるチームで開発を行っている場合は、テストのメソッドの名前を日本語にすることで、何のテストなのかが分かりやすくなり、テストコードがそのまま仕様書の機能を果たしたりもするようになる。

## まとめ
### どこまでテストするかの判断
カバレッジを100%にするには、1つのメソッドに対して複数のテストをしなくてはいけない場合がよくある。
しかし大概の場合、全てをテストしている時間は無いのでテストすべき箇所と、そうでない箇所との切り分けをしなければならない。これはプロジェクトの状況に応じて、どこまでテストするかを決めなければならない。
たとえばキャンペーンなど期間限定のものであれば、手動でテストして動けば、テストコードを書く必要はない場合もある。
逆に銀行系のシステムなどでは、ミスが許されないので、十分にテストする必要がある。