OmniAICreator/Qiita-1.07M huggingface dataset:
Array の append/pop/insert(0,x)/pop(0) に要する時間(python)

[Array の push/pop/unshift/shift に要する時間(ruby)](https://qiita.com/Nabetani/items/079e95a78e9fd2dab9df) という記事を書いたので、同じことを python でも試してみた。

#まずはソースコード

こんな感じの

```python3:python3.6
import time

def tick(t):
  start = time.time()
  t()
  return (time.time() - start)*1000

r=[0,0,0]
for x in range(10):
  a=[0]*100_000_000
  for ix in range(3):
    r[ix] += tick( lambda:a.append(0) ) # この行の append(0) を「insert(0,0)」「pop()」「pop(0)」に変更する

print( "".join( [ "%.5f|" % (r[ix]/10) for ix in range(3) ] ) )
```

ソースコードで測ってみた。

# 測定結果

結果は下表の通り：

||1回目|2回目|3回目|
|:--|:--|:--|:--|
|append|0.01278|0.00091|0.00041|
|insert(0,0)|102.11890|104.82631|105.90937|
|pop|0.00412|0.00043|0.00041|
|pop(0)|94.54970|96.57269|97.45097|

`append` は初回がちょっと遅いけど、基本的に速い。
`insert(0,0)` は、遅い。2回目も3回目も同じように遅い。
`pop` も初回がちょっと遅いけど、基本的に速い。
`pop(0)` は、遅い。2回目も3回目も同じように遅い。

というわけで、ruby とは異なり、分かり易い結果になった。
matplotlibの使い方

matplotlibの使い方について、使用したものを整理する。

#ヒストグラム
```python:サンプル
import pandas as pd
import matplotlib.pyplot as plt

train = pd.read_csv('../train.csv')

%matplotlib inline #jupyter notebook上にグラフ表示する場合には記載
plt.hist(train.Age)
```
Processing - 08 - バウンドボールの描画(はじめてのベクトル)

<img width="1019" alt="スクリーンショット 2018-02-05 22.26.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/45520/19347dee-55da-9ca7-2934-b175a39f6a5f.png">

```java:
PVector location;
PVector velocity;

void setup(){
  size(1024, 768);    
  frameRate(60);      
  stroke(194,24,91);  
  fill(233,30,99,127);
  location = new PVector(40,40);
  velocity = new PVector(2,5);
}


void draw(){
  background(15);                      
  ellipse(location.x,location.y,20,20);
  location.add(velocity);
  
  if(location.x < 0 || location.x > width){
    velocity.x = velocity.x * -1;
  }
  if(location.y < 0 || location.y > height){
    velocity.y = velocity.y * -1;
  }
}



```
```java:
class PVector{
  float x;
  float y;
  
  PVector(float x_, float y_){
    x = x_;
    y = y_;
  }
  
  void add(PVector pvector){
    x = x + pvector.x;
    y = y + pvector.y;
  }
}
```
Processing - 07 - バウンドボールの描画

<img width="1019" alt="スクリーンショット 2018-02-05 22.26.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/45520/19347dee-55da-9ca7-2934-b175a39f6a5f.png">

```java:
float ellipseX;  //円の中心位置
float ellipseY;  //円の中心位置
float speedX;    //円の速度
float speedY;    //円の速度

void setup(){
  size(1024, 768);    
  frameRate(60);      
  stroke(194,24,91);  
  fill(233,30,99,127);
  ellipseX = 40;      //円の中心位置(初期)
  ellipseY = 40;      //円の中心位置(初期)
  speedX = 2;         //円の速度      
  speedY = 5;         //円の速度
}


void draw(){
  background(15);                      
  ellipse(ellipseX, ellipseY, 20, 20);
  ellipseX = ellipseX + speedX;      //円の中心位置(X座標)を更新
  ellipseY = ellipseY + speedY;      //円の中心位置(X座標)を更新
  
  if(ellipseX < 0 || ellipseX > width){
    speedX = speedX  * -1;
  }
  if(ellipseY < 0 || ellipseY > height){
    speedY = speedY * -1;
  }
}
```
CSSレイアウトの今（概要）

どうも、前職のシステム開発で、いにしえのテーブルレイアウトを一部使ってしまっていた@tomiiii3zです。
![genshijin.jpeg](https://qiita-image-store.s3.amazonaws.com/0/235069/0e9a04e8-c15f-425e-fc8c-2e69116ee3c6.jpeg)
**↑ 氷河期の氷の中から発見された@tomiiii3z（ヒト科　タグ・テーブレウス/tag tableus）**

現職で最近のモバイル開発等ではFlexboxでのレイアウトを知っておくと便利だよと教えていただいたので、
現在のレイアウト方法について調べてみました。

## tableタグを使うのは本当に表を出力したい場合だけにしよう
表要素の出力にはもちろんtableタグを用いてよいのですが
レイアウトに使っていると私のように生きている時代を間違えた人になってしまいます。

今はもう便利な世の中になっています。
FlexboxやGrid Layoutのように便利なものが存在しています。

![egypt.jpg](https://qiita-image-store.s3.amazonaws.com/0/235069/573d851b-934c-06bf-58cf-70c09738e4ae.jpeg)
**↑ tableタグで強引に配置されたレイアウト**

## Flexboxとは
柔軟にボックスレイアウトを行うことができるCSSのレイアウトモードです。(インラインではなくボックス)
よくある横並びのレイアウトなんかを非常に手軽に組むことができるようになります。
React NativeではFlexboxがレイアウト方法として採用されているようです。

```css
.container {
  display: flex;
  max-width: 750px;
  margin: 0 auto;
}

.dogeza-item {
  width: 100px;
  margin: 0;
  padding: 10px;
  box-sizing: border-box;
}
```

![dogeza.jpg](https://qiita-image-store.s3.amazonaws.com/0/235069/da6bd18b-e3ce-33b7-1796-f6eb3b5079a0.jpeg)
**↑Flexboxによって綺麗に横並びに揃えられた土下座**

## Grid Layoutとは
ページを列と行で分割するような、まさにグリッドのようなレイアウトモードです。
ページ全体の配置を決めるような場合に適しています。

```html
<div class="wrapper">
  <div class="header"></div>
  <div class="sidebar1"></div>
  <div class="content"></div>
  <div class="sidebar2"></div>
  <div class="footer"></div>
</div>
```
```css
.wrapper {
  display: grid;
  grid-template-columns: repeat(5, 100px);
  grid-gap: 0px;
  grid-template-rows: repeat(6, 100px);
}
.header {
  grid-column: 1 / 6;
  grid-row: 1;
}
.sidebar1 { 
  grid-column: 1;
  grid-row: 2 / 6;
}
.sidebar2 {
  grid-column: 5;
  grid-row: 2 / 6;
}
.content {
  grid-column: 2 / 5;
  grid-row: 2 / 6;
}
.footer {
  grid-column: 1 / 6;
  grid-row: 6;
}
```

一般的なサイトレイアウトの形も忌まわしきtableを使わずとも、Grid Layoutで配置が可能です。
![layout.jpg](https://qiita-image-store.s3.amazonaws.com/0/235069/35c2cbc8-0915-2092-6ec2-3616d57f44da.jpeg)

## これで私も原始人から卒業です！！
これからはtableタグで二度とレイアウトしません！！
*もし約束を破ったら、360度カメラで撮影した土下座画像を元に作成したVR画像をアップします。*

※どちらも詳しい解説をされているサイトがあります。詳しくはそちらを参考になさってください。

----
今覚えたい！エンジニアのための CSS の基礎講座 〜Flexbox レイアウト編〜
https://nulab-inc.com/ja/blog/nulab/css-basics-for-engineer-flexbox/

これからのレイアウトはGrid Layoutで決まり？特徴で使い分けたいCSSレイアウト手法
https://ics.media/entry/15921

----

<画像素材>
Icon-rainbow 様 (http://icon-rainbow.com/)
ピクト缶 様 (http://pictkan.com/)
シルエットデザイン 様 (http://kage-design.com/wp/)
Ubuntu16.04にGTX1060のNVIDIA DriverとCUDAをインストール



#CLIモードに切り替えます。
```
F1 + Alt + Ctrl
```

#X11を停止します。
```
$ sudo /etc/init.d/lightdm stop
```

#NVIDIAのサイトからDriverをダウンロードします。
つまりNVIDIA製のプロプライエタリなドライバーを利用します。
以下のリンクからダウンロードしてください。

http://www.nvidia.co.jp/download/driverResults.aspx/130940/jp

LINUX X64（AMD64 / EM64T）ディスプレイドライバ
 
バージョン：	390.25
リリース日：	2018.1.29
オペレーティングシステム：	Linux 64ビット
言語：	日本語
ファイルサイズ：	77.48 MB

#実行権限を付与します。
```
chmod +x NVIDIA-Linux-x86_64-390.25.run
```
#NVIDIAのサイトからCUDAツールキット9.1をダウンロードします。
以下のリンクからrunfile(local)をダウンロードしてください。

Linux用インストーラをダウンロードするUbuntu 16.04 x86_64
https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&target_distro=Ubuntu&target_version=1604&target_type=runfilelocal

##※なぜかdev(network)はうまくいかなかったのでrunfile(local)にしました。
```
$ sudo dpkg -i cuda-repo-ubuntu1604_9.1.85-1_amd64.deb
dpkg: アーカイブ cuda-repo-ubuntu1604_9.1.85-1_amd64.deb の処理中にエラーが発生 しました (--install):
 アーカイブにアクセスできません: そのようなファイルやディレクトリはありません
処理中にエラーが発生しました:
 cuda-repo-ubuntu1604_9.1.85-1_amd64.deb
```

#実行権限を付与します。
```
chmod +x cuda_9.1.85_387.26_linux.run
```

#すべてのnVidiaとCUDA関連のパッケージを削除する
```
$ sudo apt-get remove nvidia*
$ sudo apt-get remove cuda*
$ sudo apt autoremove
```

#nouveauドライバーをブロックします。
```
$ sudo sed -e '$ a blacklist nouveau' /etc/modprobe.d/blacklist.conf
$ sudo sed -e '$ a blacklist lbm-nouveau' /etc/modprobe.d/blacklist.conf
$ sudo sed -e '$ a options nouveau modeset=0' /etc/modprobe.d/blacklist.conf
$ sudo sed -e '$ a alias nouveau off' /etc/modprobe.d/blacklist.conf
$ sudo sed -e '$ a alias lbm-nouveau off' /etc/modprobe.d/blacklist.conf
```

#カーネルnouveauを使用しないようにします。
```
$ echo options nouveau modeset=0 | sudo tee -a /etc/modprobe.d/nouveau-kms.conf
```

#カーネルをビルドします。
```
$ sudo update-initramfs -u
```

#システムを再起動します。
```
$ sudo reboot
```

#CLIモードに切り替えます。
```
F1 + Alt + Ctrl
```

#X11を停止します。
```
$ sudo /etc/init.d/lightdm stop
```

#DKMSをインストールします。
```
sudo apt install dkms
```

#NVIDIA Driverをインストールします。
念のためnouveau無効化オプションと--disable-nouveau、x11検出無効化オプション--no-x-checkをつけておきます。
```
$ sudo ./NVIDIA-Linux-x86_64-390.25.run --disable-nouveau --no-x-check
```

#nouveauを無効化するスクリプト「/etc/modprobe.d/」がカーネル起動時に反映されるよう，update-initramfsコマンドを実行した上で再起動します。
```
$ sudo update-initramfs -u
$ sudo reboot
```
勝手に開いた社内読書会のご紹介

　この記事では、ラビットハウス社内で勝手に開いた/開かれた読書会に参加して読んだ本をご紹介します。本によって読み方を変えたりしてます。インターネットで色々な情報を得られるんですが、体系的に知識のまとめられた本を読むのは、知識の穴を埋められたり、意識していないかったものごとの繋がりに気づかせられたりして、ゆるゆると継続してやっていきたいなと思っています。

　以下に書かれたものは私が参加したものだけが記載されていますが、他にも「SRE サイトリライアビリティエンジニアリング」や「純粋関数型データ入門」、「型システム入門」など様々な本の読書会が開かれていたらしく、時間やタイミングが許せばそちらも参加したかったなぁと思っています。

## [Swift 公式ドキュメント](https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/index.html)

* 期間: 2014/09〜2014/12
* ペース: 週1時間
* 読み方
  * 集まって、パートごとに区切って各自読む
  * その後、Playgroud で実際にコードを書いて動かしてみる

　プログラミング言語 Swift が Apple から発表された直後の 2014 年 9 月より、チームの方と週一ペースでドキュメントを読み進めつつ、Playgroud で実際にコードを動かしてみるという会が行われました。2014 年に新卒入社して、研修が終わり配属直後にこういった読書会にお誘いをもらっての参加でした。

　最初、会社で読書会に誘われたとき、逆に、会社で読書会やっていいの？みたいな感想を抱きました。ちゃんとお仕事をしていれば良いらしいので、ちゃんとお仕事をしつつ、読書会に参加。その後、私自身も突然 iOS アプリ開発をやることになったのですが、これやってたのもあり、iOS 開発未経験でしたが特にプログラミング的に困ったことはあまり発生しなかったかなと思います。まあ言語仕様いろいろと変わってしまってる部分もあるんですが。


## [すごいHaskellたのしく学ぼう！](https://www.amazon.co.jp/dp/B009RO80XY)

* 期間: 2015/3 〜 2015/08
* ペース: 週1時間
* 読み方
  * 毎週発表者が担当部分をまとめてきて解説
  * 気になりどころを REPL で実験

Haskell での基本的なプログラミングについてまとめられている本なので、担当者が該当部分をまとめてきつつ、REPL でコードを動かしてみるという雰囲気でやってました。後半のモノイドとかファンクターとかになるとちょっと難しい部分も増えてきたので、実際にコードを動かして振る舞いから理解するという感じで頑張りが必要でした。


## [Scala 関数型プログラミング & デザイン](https://www.amazon.co.jp/dp/B00WM54V5Q)

* 期間
  * 第一部: 2015/9 〜 2015/12
  * 第二部: 2016/01 〜 2016/06
* ペース: 週1時間
* 読み方
  * 集まって音読
  * 演習問題が出てきたら各自その場で解いて Slack に投げる
  * 全員の回答がでそろったら、GitHub に上がっている公式の解答と比較する

　この本に登場する問題は、解答が GitHub 上にあがっているので、読書会の進行がやりやすかったです。誰かひとりが解くみたいなことすると、全員の理解レベルにどうしても大きな差が出てきてしまうので、基本的には各自が解いて、Slack に貼り付けるという形で進めました。時間はかかるのですが、この本はやはり演習問題をきちんと解かないともったいない本なので、こういう形式ですすめました。


## [サーバーインフラを支える技術](https://www.amazon.co.jp/dp/4774135666)

* 期間: 2017/02 〜 2017/04
* ペース: 毎日1時間
* 併読書: [ネットワーク技術&設計入門](http://amzn.to/2rQASDh)
* 読み方
  * 集まって音読
  * 本の内容をもとに現在運用しているサービス構成と照らし合わせ改善点や疑問点を話題にする
  * 理解があいまいなネットワーク関連技術についてはネットワーク技術&設計入門を参照する

　音読していきつつ、現在運用しているサービスと照らし合わせて、改善点を探したり、本に記載されているプラクティスが本当に必要かどうかなどを議論しながら進めました。またネットワークまわりの細かい知識について、これなんだったっけみたいになったときには「ネットワーク技術&設計入門」を用語集として利用して、知識の確認を行いました。


## [ふつうの Linux プログラミング](http://amzn.to/2Ef3E5k)

* 期間: 2017/11 〜 継続中
* ペース: 毎日1時間
* 読み方
  * 集まって音読
  * ところどころに登場する Linux コマンドの実装を写経
  * 演習問題もやる
  * 余力のある人は、他の言語に移植も行う

システムコール、ストリーム、プロセスなどについて、抜けてる穴を埋めるために読んでいる。参加者的にも、半分以上のことはすでになんらかの形で知っている内容ではあるが、時折ここ知らなかったなど、穴が見つかり、良い。実践として動くコードを書くという意味でも良きトレーニングになる。個人的にはこれを読んだ後、Go ならわかるシステムプログラミングの読書会に繋ぎたい狙いがある。


## 次に読書会で取り上げたい本

1. Go ならわかるシステムプログラミング
2. 暗号技術入門
3. アジャイルソフトウェア開発の奥義

## 読書会のすすめ

すぐに業務に役に立つ本、じわじわ効いてくる本など様々ありますが、最終的にやっぱり新しいことを知るのは楽しいし、複数人で読むと誤っていたり歪んだ解釈をしてしまうことを防いだりできるので、読書会おすすめです。特に個人的には全員が順番に音読してくスタイルが気に入ってます（黙読は眠くなる）。ぜひお試しください。
SwingBenchの OrderEntry Wizard （oewizard）をコマンドラインモードで実行する

#oewizardをコマンドラインモードで実行するには？

SwingBenchの 公式サイトの「Command Line Options...」のページにはcharbench などのベンチマークの実行例はありますが、データ生成ウィザードのOrderEntry Wizard （oewizard）をコマンドラインモードで実行する例は書いていません。

http://dominicgiles.com/page3/index.html


oewizard実行時に「-cl」オプション（run in character mode）と必要なパラメータを指定することで可能です。


#実行例

ここでは「-cl」のほかに「-df」オプション（datafile name used to create schema in、データファイルの場所）、「-cs」オプション（connectring for database、接続文字列）、「-dbap」オプション（password for schema creation、作成ユーザのパスワード、デフォルトではSYSユーザ）を指定しています。

```
$ ./oewizard -cl -create  -cs //<hostname>:1521/orcl -dbap oracle -df /u01/app/oracle/oradata/orcl/test.dbf

SwingBench Wizard
Author  :        Dominic Giles
Version :        2.6.0.1076

Running in Lights Out Mode using config file : ../wizardconfigs/oewizard.xml

============================================
|           Datagenerator Run Stats        |
============================================
Connection Time                        0:00:00.002
Data Generation Time                   0:06:36.332

＜中略＞

Schema Created

```

指定可能なオプションは `./oewizard --help`で確認可能です。

```
$ ./oewizard --help
usage: parameters:
 -allindexes             build all indexes for schema
 -async_off              run without async transactions
 -async_on               run with async transactions (default)
 -bigfile                use big file tablespaces
 -c <filename>           wizard config file
 -cf <file>              the location of a crendentials file for Oracle
                         Exadata Express
 -cl                     run in character mode
以下略
```

指定しなかった場合のデフォルト値は構成ファイル「./wizardconfigs/oewizard.xml」にて指定されています。
これを変種するか、別名で編集したものを「-c 」オプションで指定可能です。

```
中略
   <DefaultParameters>
      <Parameter Key="datatablespacesexists" Value="true"/>
      <Parameter Key="password" Value="soe"/>
      <Parameter Key="username" Value="soe"/>
      <Parameter Key="datafile" Value=""/>
      <Parameter Key="userexists" Value="true"/>
      <Parameter Key="connectionstring" Value="//oraclelinux/orcl"/>
      <Parameter Key="connectiontype" Value="thin"/>
      <Parameter Key="onlydropuser" Value="false"/>
      <Parameter Key="operation" Value="create"/>
      <Parameter Key="tablespace" Value="SOE"/>
      <Parameter Key="dbausername" Value="sys as sysdba"/>
      <Parameter Key="dbapassword" Value="welcome1"/>
      <Parameter Key="output" Value="Verbose"/>
   </DefaultParameters>
以下略
```


#参考

Swingbench（公式）
http://dominicgiles.com/swingbench.html

SwingBench　Reference and User Guide
http://dominicgiles.com/swingbench/swingbench21f.pdf

Swingbenchを使ってみる
https://qiita.com/mon_tu/items/9ca9f50b69ca5ea4c18e
100万回コイントスした時の確率分布

昨日、面白い問題を聞きました。

## 問題
> コインを100万回投げたとき、表が出る回数がちょうど50万回出る確率$P(A)$と表が49万5千回以下の確率$P(B)$はどちらが大きいでしょうか?


さて、これはどっちが大きいでしょうか?
確率をそのまま立式すると

```math
P(A) =  \frac{{}_{10^6}C_{5 \cdot 10^5}}{2^{10^6}}  \\
P(B) = \sum_{n=0}^{4.95 \cdot 10^5}\frac{{}_{10^6}C_{n}}{2^{10^6}}
```

となります.
とはいえ、これほど大きい数は計算するのは簡単ではありません。

まず、数を減らして考えてみましょう。ざっと1万で割ってみます。

## 問題2
> コインを100回投げた時、表出る回数がちょうど50回の確率$P(C)$と49回以下の確率$P(D)$どちらが大きいでしょうか.


こうみると自分の直感的には49回以下の方が大きい気がしましたが、どうでしょうか。

49万5千回に比べれば相当少ないですが、49回も計算する気がおきませんね。

そこで、$P(C)$だけうまく計算すればできる方法がないか考えてみます。

### 計算の工夫ポイント
- 対称性から、表が49回以下の確率と表が51回以上(=裏が49回以下)の確率のが等しい
- 表が出る回数は49回以下か50回か51回以上しかないので、$P(D)= \frac{1 -P(C)}{2}$

この2つを使うことで、$P(C) < \frac{1}{3}$と$P(D) > P(C)$が同値になることがわかります。


上の結果はただ$P(D)$を計算せずに済んだだけでなく、
$P(C)$も__具体的な値がわかる必要がなく、不等式で評価できればよい__ことがわかりました。

そこで$n$が2以上の場合

```math
\frac{{}_{2n}C_{n}}{2^{n}} > \frac{{}_{2(n+1)}C_{n+1}}{2^{n+1}}
```
となることに注意すると、(証明は式変形すればよいです)
100回以下のどこか偶数で示せてしまえばいいことがわかります。

### 余談
> 上の不等式の評価は2回コインを投げた時に1回表が出る確率よりも10回コインを投げた時に5回表が出る確率の方が少なさそうという感覚を厳密にしたものです。

実際、6回コインを投げた時に表が3回出る確率が

```math
\frac{{}_{6}C_{3}}{2^{6}} =\frac{5}{16} < \frac{1}{3} 
```
となるので、$P(C) < \frac{1}{3}$が従い$P(C) < P(D)$がわかります。


問題2のこの結果を見ると、問題の答えは、
$P(A) < P(B)$な気がしますが、実際にはどうなるでしょうか。

このままでは簡単には計算できないので、今回は近似を使うことにします。

[高校数学の美しい物語](https://mathtrain.jp/normalkinji)
という素晴らしいサイトを見ると,以下の定理が紹介されています。

### Thm (ド・モアブル–ラプラスの定理)
> コインをn回投げる時の表がk回出る確率は二項分布$Bin(n,\frac{1}{2})$は
十分$n$が大きい時、平均$np$,分散$np(1-p)$の正規分布で近似できる。

上のサイトでもちょうどコインの場合で具体的に計算されているので、詳細は省きますが
100万回コイントスする時の確率分布$X$に対して、

```math
 \frac{X - 0.5 \cdot 10^6}{500}  
```
が標準正規分布で近似できることがわかります。

後は正規分に関する計算だけすればいいわけですが、ちょうどいいようにWikipediaの[偏差値](https://ja.wikipedia.org/wiki/%E5%81%8F%E5%B7%AE%E5%80%A4)の記事に以下の記載がありました。
> 偏差値60以上（あるいは40以下）は、全体の15.866％。
偏差値70以上（あるいは30以下）は、全体の2.275％。
偏差値80以上（あるいは20以下）は、全体の0.13499％。
偏差値90以上（あるいは10以下）は、全体の0.00315％。
偏差値100以上（あるいは0以下）は、全体の0.00002％。

偏差値は標準偏差が10となるようにしたものです。
今回の100万回のコイントスの場合は、上の定理から標準偏差が500となります。

- 49万9501回〜50万499回表が出る場合
偏差値に直すと偏差値40〜60の範囲になる確率で、おおよそ68%となります。
50万回出る確率がこの中で一番高いことに注意すると、
$P(A) > 0.68 / 10^3  = 68 \cdot 10^{-5}$ であることがわかります。
100万回この実験をすると680回以上は表が50万回ぴったりになりそうだということがわかります。

- 表が出る確率が49万7500回以下の場合
つまり偏差値が0以下は0.00002%、つまり500万回に一回しか出ません。
49万5000回以下はおろか、49万7500回以下ですらほとんど出ないことがわかりました。

この2つから、最初の問題の答えは以下となります。

```math
P(A) >>>>>>>> P(B)
```

## 余談
直感と反する原因は標準偏差が$\sqrt{n}$に比例するためです。
標準偏差は散らばり具合を表しているわけですが、上のことから$n$が大きくなるほど$n$に比べて、小さくなることがわかります。
線形に変化すると思って予測すると、完全に違う結果になります。
Beebotte の WEBコンソールを利用した MQTTメッセージの送受信テスト

# Beebotte の WEBコンソールを利用した MQTTメッセージの送受信テスト

Beebotte の設定内容確認や、トラブルシューティングのため、Beebotte の WEBコンソールを利用してメッセージを Publish したり、Subscribe することができます。

## 準備
まず、アカウントの Root Access Keys を取得します。
Beebotte にログインし、［Account Settings］から［Access Management］を選択します。
表示されている「API Key」と「Secret Key」を控えます。
![401.png](https://qiita-image-store.s3.amazonaws.com/0/235420/071a6e33-9874-c5ad-7281-2fc6a83ba7f9.png)


## Console
「Console」では、以下の操作が可能です。
・Subscribe
・Publish
・Read API
・Write API

まず、「Secret Key」に、準備で控えた「Secret Key」を入力します。
そして、対象の項目に必要事項を入力し、実行します。
結果は、右側の Messages や Log に表示されます。

[Beebotte Console](https://beebotte.com/dev/console)

![402.png](https://qiita-image-store.s3.amazonaws.com/0/235420/b58f7695-e681-9a5d-b96c-c9f07a4f3e1c.png)



## API Playground
「API Playground」では、各種 REST API を実行可能です。
準備で控えた「API Key」と「Secret Key」を入力し、対象の項目に必要事項を入力し、実行します。
結果は入力事項の下に表示されます。

[Beebotte API Playground](https://beebotte.com/dev/console)

![405.png](https://qiita-image-store.s3.amazonaws.com/0/235420/82e3060e-8d15-f0df-27a0-3e5e6dfcab52.png)
Visual Studio Codeでキーボードショートカットに外部コマンドを割り当てる

# やりたいこと
VisualStudioCodeでCtrl+Qを押したとき、開いているフォルダにあるhoge.batを実行してほしい。

# 手順
以下の手順で設定できます。バージョン1.57.1で確認しています。

## 1. タスクにhoge.batを登録する
1. Ctrl+Shift+Pでコマンドパレットを開き、「Tasks: Configure Task」を実行する
2. 「テンプレートからtasks.jsonを生成」を選ぶ
3. 「Others」を選ぶ
4. tasks.jsonが開かれるので、以下のように編集する

```javascript:tasks.json
{
  // See https://go.microsoft.com/fwlink/?LinkId=733558
  // for the documentation about the tasks.json format
  "version": "2.0.0",
  "tasks": [
    {
      "label": "runHoge", // タスクの名前
      "type": "shell",
      "command": "hoge.bat" // 実行したいコマンド
    }
  ]
}
```
実行したいコマンドを変更すれば好きな外部コマンドを登録できます。


## 2. 登録したタスクにキーボードショートカットを割り当てる
1. Ctrl+Shift+Pでコマンドパレットを開き、「Preferences: Open Keyboard Shortcuts(JSON)」を実行する
1. keybindings.jsonが開かれるので、以下のように編集する

```javascript:keybindings.json
// 既定値を上書きするには、このファイル内にキー バインドを挿入します
[
  {
    "key": "Ctrl+Q",
    "command": "workbench.action.tasks.runTask",
    "args": "runHoge", // tasks.jsonで設定したタスクの名前
  }
]
```
"key"に割り当てたいキー、"args"に実行するタスクの名前を指定します。
php5.4以降の配列の書き方

とても今更感が満載なのですが、php5.4から下記のような書き方が可能となりました。

```php:array_5_4.php
$arr = [
    1 => "横浜市",
    2 => "大阪市",
    3 => "名古屋市",
    4 => "札幌市",
    5 => "福岡市",
    6 => "神戸市",
];
```

[リファレンス](http://php.net/manual/ja/language.types.array.php)にも書いてる。

#1 何故今更こんなことを？

何故こんなことを今更紹介するのかと言いますと、これまで何年もPHPをやっておきながら自分はこの書き方を知らなかったからなのです......
どこかで無意識に一度くらい書いたことはあるかもしれませんが、とある場で指摘をいただくまでとにかく自分は知りませんでした。(言い訳をすると、初め使っていたのがPHP5.3だったから仕方がなかっ(ry )

#2 ちなみに、php5.3以前では

ちなみになのですが、php5.3以前では下記のような書き方をします。

```php:array_5_3.php
$arr = array(
    1 => "横浜市",
    2 => "大阪市",
    3 => "名古屋市",
    4 => "札幌市",
    5 => "福岡市",
    6 => "神戸市",
);
```
#3 終わりに

いらっしゃらないような気がしますが、もしこの記事を見てハッとされた方は是非ご自身の配列の書き方を見直して見てください＿＿(:3」∠)＿＿

2018/2/7追記
申し訳ございません。冒頭の本文の一部に文法的な誤りがありましたので、修正しました。
ローカル開発環境を作るよ

#ローカル開発環境とは
自分のデスクトップ内に仮想のサーバーを立ち上げる。今回は[VirtualBox](https://www.virtualbox.org/)を用いる。
仮想サーバーにはVMwareやAmazon EC2がある。
サーバーの設定やOSのインストールを簡略化するために[Vagrant](https://www.vagrantup.com/)などを用いる。

#とりあえずやったこと

##仮想マシンを立ち上げる
・VirtualBox入れる
```
brew cask install virtualbox
```
・Vagrant入れる
```
brew cask install vagrant
```
参考：https://qiita.com/shimitei/items/11c072383195e5830b6e

・フォルダ作る

・IPアドレスを設定する
```
sed -i '' -e 's/# config.vm.network "private_network", ip: "---.---.--.--"/config.vm.network "private_network", ip: "---.---.--.--"/' Vagrantfile
```
よくわからん呪文---.---.--.--部分はIPアドレスが入る。あとで勉強する。

・Vagrantを起動する
```
vagrant up
```

##仮想マシンを設定する
・サーバーにログインする
```
vagrant ssh
```

・OSを最新状態にアップデート（時間かかります）
```
sudo yum -y update
```

・スクリプトを入手するためのgitをインストール
```
sudo yum -y install git
```

・Cyberduckをインストール
Cyberduckとはファイル転送用ソフト
```
brew cask install cyberduck
```

##仮想マシンを終了する

```
exit
vagrant suspend
```


##Vagrantとは
ローカル開発環境の設定をいちいちしなくて済むらしい
[Vagrant](https://www.vagrantup.com/)
Rubyで書かれている。
Array の push/pop/unshift/shift に要する時間(ruby)

ruby の `Array` は生のメモリに近いものだから、 `push` と `pop` は速いけど、 `shift` と `unshift` は遅い。

そう思っていたんだけど、思っていただけで測ったことがなかった。

で。測定してみた。

環境は ruby 2.5.0p0

#まずはソースコード。

```ruby:ruby2.5
require "benchmark"

r=Array.new(10) do
  a=[0]*100_000_000
  Array.new(3){  1000*Benchmark.realtime{ 
    a.push 1  # この行を、「a.pop」「a.unshift 1」「a.shift」 に変更する
  }  }
end

puts (0...3).map{ |ix|
  "%.8f|" % ( r.map{ |e| e[ix] }.inject(&:+) / r.size )
}.join
```

# 測定結果

||１回目|2回目|3回目|
|:--|:--|:--|:--|
|push|0.01390|0.00030|0.00150|
|pop|0.00370|0.00040|0.00020|
|unshift|355.36490|0.00140|0.00020|
|shift|0.00370|0.00010|0.00000|


`push` と `pop` は、予想通り速い。
でも `push` の初回はちょっと遅い。なんでだろ。

`unshift` は、一度目だけが遅い。
おそらく、1要素だけの `unshift` でも、3つ以上の要素を先頭に追加できるだけのメモリが確保されるのであろう。
`shift` も速い。メモリの移動はせず、先頭を指すポインタを動かしているのであろう。

というわけで、当初の予想は極一部しか当たっていなかった。

# おまけの実験

せっかくなので

```ruby:ruby2.5
require "benchmark"

r=Array.new(10) do
  a=[0]*100_000_000
  [
    Benchmark.realtime{ a.shift }, #1
    Benchmark.realtime{ a.shift }, #2
    Benchmark.realtime{ a.unshift 3 }, #3
    Benchmark.realtime{ a.unshift 4 }, #4
    Benchmark.realtime{ a.unshift 5 }, #5
    Benchmark.realtime{ a.unshift 6 }, #6
  ].map{ |x| x*1000 }
end

puts (0...6).map{ |ix|
  "%.5f|" % ( r.map{ |e| e[ix] }.inject(&:+) / r.size )
}.join
```

という実験をしてみた。
結果は

|#1(shift)|#2(shift)|#3(unshift)|#4(unshift)|#5(unshift)|#6(unshift)|
|:--|:--|:--|:--|:--|:--|
|0.00460|0.00090|0.00090|453.12790|0.00190|0.00070|

こんな感じ。

あれ？　#5 が遅いんじゃないの？？
Rails creating modals

Instead of writing a JavaScript application for working remote modals in your Rails application, it is a much more simple approach **to render our views on a server and display them as modals**. In this tutorial, we will explain how to implement this by using Bootstrap modals.
## Step 1: Initial setup 
Add *gem 'bootstrap'* and *gem 'popperjs'* to your gemfile.
Also, in your application.js include this in the following order:
```
//= require jquery
//= require popper
//= require turbolinks
//= require bootstrap
//= require_tree.
```
## Step 2: Modify layouts in View
Make sure that this view is partial. Inside it, you will have the content you want to show in the modal.
### _new.html.erb
```
<div class="modal-header">
  <button type="button" class="close" data-dismiss="modal">x</button>
  <h4 class="modal-title" id="myModalLabel">Modal title</h4>
</div>
<div class="modal-body">
  *Modal content comes here*
</div>
<div class="modal-footer">
  <button class="btn btn-primary">Save</button>
</div>
```
**We need to define a place where modals will be rendered:**
### index.html.erb
```
<%= link_to 'Add user', new_user_path,  {:remote => true, 'data-toggle' =>  "modal", 'data-target' => '#modal-window', class: 'btn btn-primary btn-lg'}  %>
<div id="modal-window" class="modal hide fade" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
  <div class="modal-dialog" role="document">
    <div class="modal-content"></div>
  </div>
</div>
```
*Remote* is used to tell jquery to submit this form with ajax, while *'data-toggle' =>  "modal"* is used to tell our script to handle this form as the modal form.  *< div >* loads the partial as a modal window and with *class="modal hide fade"* you can add an extra fade effect to the modal, too!

**To make this all work we need to add some JavaScript:**
### new.js.erb
```
$("#modal-window").find(".modal-content").html("<%= j (render 'new') %>");
$("#modal-window").modal();
```
##Step 3: Modify your Controller
In the controller add the respond_to block to be able to use Ajax:
```
def new
  respond_to do |format|
    format.html
    format.js
  end
end
```
##Step 4: Enjoy!
We have finally reached the end! Now you just need to click on "*Add user*" button and a nice modal will show up with a fade effect! This is your end work result:

![bootstrap-modal](https://storage.kraken.io/kk8yWPxzXVfBD3654oMN/e8f6e760ccb1ca250753852c97345ca5/bootstrap-modal.png)


**Thank you for staying with us until the end!**

Originally published at [kolosek.com](https://kolosek.com/rails-creating-modals/).
Azure Functions(C#)でSlackに投稿する

Azure FunctionsからSlackにIncoming Webhook経由で投稿するコードです。
Timerトリガー使って起動させれば、定期的に情報を取得してSlackでメンバー宛に共有するとかできます。

# コード
Azure FunctionsでTimerトリガー、C#を選んで以下のコードをコピペすれば動きます。
タイムアウトとかエラー処理は考慮してないので、本番運用の際は考慮要です。

```C#:run.csx
#r "Newtonsoft.Json"

using System;
using System.Text;
using System.Net;
using Newtonsoft.Json;

public static void Run(TimerInfo myTimer, TraceWriter log)
{
       
    var slack_text = "Slack本文をここに記載！";
    var wc = new WebClient();

    var WEBHOOK_URL = 
"https://hooks.slack.com/services/XXXXXXXXX/XXXXXXXXX/XXXXXXXXXXXXXXXXXXXXXXXX"; //incoming hookのURL
    var data = JsonConvert.SerializeObject(new
     {
        text = slack_text,
        icon_emoji = ":ghost:", //アイコンを動的に変更する
        username = "テストBot",  //名前を動的に変更する
        link_names = "1"  //メンションを有効にする
    });
    log.Info("json=" + data );
    wc.Headers.Add(HttpRequestHeader.ContentType, "application/json;charset=UTF-8");
    wc.Encoding=Encoding.UTF8;
    wc.UploadString(WEBHOOK_URL, data);
}
```

# おまけ Azure FunctionsのタイマートリガーのCRON式は秒も含む

なので、毎時30分に起動したい場合は ```0 30 * * * *``` になるので注意が必要。

[Azure Functions のタイマー トリガー | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-bindings-timer) から引用
> Azure Functions のタイマー トリガーの CRON 式には、次の 6 つのフィールドが含まれます。
>>{second} {minute} {hour} {day} {month} {day-of-week}
QiitaのMarkdown確認


#見出し 
先頭に「#」 #が多いほど小さく(最大3)

#強調 「**」で囲う
**強調**

#斜体 「*」で囲う
*斜体*

#訂正線 「~~」で囲う
~~訂正~~

#リンク \[表示文字](path)
[リンク](http://...)

#コード  [```]３つで囲う
```xxx:file.zz
Hello,World!!
```

#リスト 頭に「- 」or 「数字 + . 」
- リスト 1
- リスト 2
    - リスト 2-1
0. 番号付きリスト 1
2. 番号付きリスト 2
1. 番号付きリスト 3

#チェックボックス 先頭に「- [ ] 」
- [ ] チェックボックス 1
- [x] チェックボックス 2

# 表 
「|」で囲う
2行目は1項目ごとに「:」で表示位置の設定が必要

|左に:|右に:|両手に:|
|:--|--:|:--:|
|a|b|c|

# ESC 「\」
\`\`\`a\`\`\`
\*\*\*\*
関連モデルを使って検索をかける時

関連モデルはwhereの検索に使えない!
`User.where(id: 1..10)`はできるけど
has_many関連のfavoriteモデルのidから検索したい時
User.where(favorites: 1)?(idはどう指定する？)
User.where(id: 1)? (これだとUserのidをとってしまう)

```rb
users = User.includes(:favorites).references(:favorites)
users.where(Favorite.aral_table[:id].eq(1))
```

idが1のFavoriteモデルと結ばれているUserを検索できる
他にも .not_eq()メソッドがある
時間を把握する、より人間らしい反応をするチャットボットを作ろう IBM Watson Conversation

##はじめに
チャットボットで挨拶を返す時、夜なのに「おはよう」に「おはよう」で返ってくるのは、なんだか違和感ありますよね？

今回は、Watson Conversationを用いて、
入力された時間がいつかを把握して、挨拶を返すBOTを作成しました

※こちらは、以下の記事を参考にさせて頂きました
[IBM Watson Conversationサービスの初心者向け講座 (2) Dialog ノードのresponseの実行条件](https://qiita.com/yamachan360/items/1f9680aa8b4680b8a691)

##前提条件
Watson Conversationが利用できる状態
※ライトアカウントで無料で試すことができます

##実際に作ってみます
###まず始めにIntentの作成です
今回は、「おはよう」「こんにちは」「こんばんは」「おやすみ」
の４つの挨拶をINPUTしています。


こんな感じに入力していきます。
<img width="518" alt="a.png" src="https://qiita-image-store.s3.amazonaws.com/0/215347/88a67b83-0806-7a6f-ec3a-84811c0985bf.png">

<img width="519" alt="b.png" src="https://qiita-image-store.s3.amazonaws.com/0/215347/d1fe56da-8bc4-cda9-979a-abffe83f7825.png">



###次にDialogの設定です
今回は以下の５パターンで、返答方法を変えています

・00時～05時：早朝
・05時～10時：朝
・10時～16時：昼
・16時～20時：夕方
・20時～24時：夜

実際の設定方法は以下の通りです
******
まずは、時間指定するため複数条件を指定できるようにします
Customizeを選択してください
<img width="960" alt="c.png" src="https://qiita-image-store.s3.amazonaws.com/0/215347/5a434f84-182c-fef6-4438-5632c6bb4134.png">

次に、Multiple responsesを「ON」にしてください
（これで時間指定できる環境が整います）
<img width="354" alt="d.png" src="https://qiita-image-store.s3.amazonaws.com/0/215347/447b1bc1-fb19-9f1b-e600-d0adb063fbe2.png">

では、実際にDialogを設定していきましょう
If bot recognizesに時間指定をしていきます

例えば、now().before('5:00:00')と入力すると、
この時の回答は、「今が５時より前の場合」を条件とします
同じ要領で、他の時間帯も入力していきます
<img width="817" alt="無題3.png" src="https://qiita-image-store.s3.amazonaws.com/0/215347/7f3abc89-74e6-9332-94c8-3279a6f750d4.png">

<img width="815" alt="無題4.png" src="https://qiita-image-store.s3.amazonaws.com/0/215347/0582cc65-3c54-e831-30f3-a95e7e22b614.png">

<img width="815" alt="無題5.png" src="https://qiita-image-store.s3.amazonaws.com/0/215347/c4011dc0-3f10-68ef-6fd5-6edab7fe248a.png">

<img width="816" alt="無題6.png" src="https://qiita-image-store.s3.amazonaws.com/0/215347/8404e6bb-bf87-f99e-6331-eeffb50e137a.png">

※入力した時間に、複数の条件が重なるとき
　例えば11時に入力した場合、以下の２つが該当しますが、
　私が動作確認した範囲では①が適用されました
　（設定順なのかは分かりませんが、想定通りには動作してくれています）
　　①now().before('16:00:00')
　　②now().before('20:00:00')


##実際に動かしてみましょう
###今回は21時に操作しています
![kiji.gif](https://qiita-image-store.s3.amazonaws.com/0/215347/89d5f8ce-9a77-5db5-4ff6-465603929907.gif)


いかがでしたでしょうか？
単純に返答するだけでなく、チャットボットが時間も把握して返答してくれることで、より魅力的なボットを作成することができると思います。

是非ともご活用してみて下さい。
doctocを使ってreadmeに目次を作成する

[thlorenz/doctoc: 📜 Generates table of contents for markdown files inside local git repository. Links are compatible with anchors generated by github or other sites.](https://github.com/thlorenz/doctoc#adding-toc-to-all-files-in-a-directory-and-sub-directories)

doctocはreadmeに目次を作れる。
ドキュメントに目次があれば、readmeの移動が楽になる。

デフォルトだと、titleがデカデカで出てしまうので、`--notitle`を付けるとよい。

```
$ npx doctoc --maxlevel 3 --notitle readme.md
```

npxで一気に使っていいが、継続して更新していくつもりなら、`husky`と`lint-staged`を使ってコミット時に走らすのがいいだろう。


## 参考

自分のOSSのプロジェクトに導入した結果が下のような感じ。



![スクリーンショット 2018-02-05 21.09.06.png](https://qiita-image-store.s3.amazonaws.com/0/15319/c70c0b97-3d0e-4081-e148-8f962a5faba1.png)

https://github.com/akameco/s2s
Evol-ColorPicker.js ちょっとだけ幸せになる修正

カラーピッカーのUIとして優秀なEvol-ColorPickerですが、jQuery.UIのDatePickerと比べるとポップアップ位置がちょっと残念です。

そこで、``evol-colorpicker.js``の``_downOrUpPositioning()``の一部をイジイジします。

**evol-colorpickerのポップアップ時**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/102207/a75827ff-c173-da82-f51d-dff3e5e6f592.png)

**jQuery.UI.datePickerのポップアップ時**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/102207/1fbb0620-2a60-025a-0184-f87bc7f90d0f.png)

```javascript:evol-colorpicker.js(line-336あたり)

	_downOrUpPositioning: function() {
		var el = this.element,
			i = 0;
		while (el !== null && i < 100) {
			// Look up the first parent with non-visibile overflow and compute the relative position
			if (el.css('overflow') != 'visible') {
				var bott = this._palette.offset().top + this._palette.height(),
					pBott = el.offset().top + el.height(),
					top = this._palette.offset().top - this._palette.height() - this.element.outerHeight(),
					pTop = el.offset().top,
					openUp = bott > pBott && top > pTop;
				if (openUp) {
					this._palette.css({ bottom: this.element.outerHeight()+'px' });
				} else {
					this._palette.css({ bottom: 'auto' });
				}
				break;
			}
			if (el[0].tagName == 'HTML') break;
			else el = el.offsetParent();
			i++;
		}
		this._palette.css({ left: this.element.offset().left + "px" }); /////追加行/////
	},
```

```javascript:evol-colorpicker.min.jsを以下で検索して
if("HTML"==a[0].tagName)break;a=a.offsetParent(),b++}}
```

```javascript:これで置換
if("HTML"==a[0].tagName)break;a=a.offsetParent(),b++}this._palette.css({left:this.element.offset().left+"px"})}
```

**修正後のポップアップ時の様子**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/102207/db668c0f-3540-5a7f-a4b5-8313f1e5f329.png)

すっきり（\*´ー`\*）
夏休みだしRust入門しようぜ (1) 環境構築〜HelloWorldまで

# TL;DR

- 自分用メモ第1弾
- [プログラミング言語Rust](https://rust-lang-ja.github.io/the-rust-programming-language-ja/1.6/book/README.html)をぼちぼち読んでいきます。

# 前提

僕の環境がMacなので、Linux/Macに限ってやっていきます。

ちなみに僕は普段はPythonしか書いてないので、型については完全に無頓着です。

また、プログラミング経験も浅いので、詳しいことは[公式ドキュメント](https://doc.rust-lang.org/book/2018-edition)を参照してください。

# 環境構築

以下コマンド実行で終了です。

```
curl https://sh.rustup.rs -sSf | sh
```

なんかいろいろ出てくると思いますが、とりあえずすべてdefaultに従えば間違いないです。

# HelloWorld

## とりあえずやってみる

HelloWorldします。

とりあえずは、今後のチュートリアルの過程で作成していくソースコードを保存するディレクトリを作成します。

```
mkdir -p ~/projects/rust_tutorial
cd ~/projects/rust_tutorial
mkdir hello_world
cd hello_world
```

次に、ソースファイルを作ります。

```
touch main.rs
```

`main.rs`をエディタで開いて、以下のように編集・保存します。

```rust:~/projects/rust_tutorial/hello_world/main.rs
fn main() {
    println!("Hello, world!");
}
```

実行。

```
$ rustc main.rs
$ ./main
Hello, world!
```

世界にこんにちはできました。

これで僕も「Rust書いたことがあります」って言えるようになりました。

## もう少し詳しく

Pythonコードと見比べてみます。

```rust:main.rs
fn main() {
    println!("Hello, world!");
}
```

```python:main.py

def main() {
    print("Hello, world!")
}

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

見比べてみるとなんとなく違いがわかる気がします（気がするだけ）

あっ、**インデントはスペース4つ**ですよ。タブじゃないですよ。

### main関数

`fn hoge(){}`とすると関数が定義できるみたいですね？

pythonと異なる点は、Rustは必ず**main関数から実行が開始される**点です。C言語とかと同じっぽいです。

### 関数とマクロ

`println!("Hello, world!")`の部分、実は関数を呼び出しているわけではないそうです。よくわからん。

> 2つ目の重要な部分は println!() の行です。これはRustのメタプログラミング機構、**マクロ**の呼び出しです。 もし関数を呼び出しているのなら、 println() のようになります(! がありません)。 

とりあえず「`!`を見たらマクロと思え」ってことですね。

`println!("Hello, world!")`のやってる事自体は、標準出力に文字を出力するだけなので、pythonの`print()`文と意味は同じみたいです。

### 文末にはセミコロン

式の終わりは`;`（セミコロン）です。C言語とかと同じですね。忘れないようにしましょう。

### コンパイルと実行

Rustはコンパイラ型言語です。そのため、Pythonのようなインタプリタ型言語と違い、コンパイルによって吐き出されたバイナリファイルを実行しなければプログラムは実行されません。

ようは、`rustc hoge.rs`とした後は、`./hoge`としなければならないというわけですね…

CとかC++と同じですね。

# Hello, Cargo!

Rustをやるにあたって、Cargoは切っても切り離せないものです。

Cargoは、Rustを使用したプロジェクトの様々なものを一括管理してくれる超有能な奴です。すごい。

Cargoは、主に以下の3つを行います。

- ソースコードのビルド
- 依存ライブラリのダウンロード
- 依存ライブラリのビルド

※「プログラミング言語Rust」には、[先程のソースコードをCargoプロジェクトに自力で変換するセクション](https://rust-lang-ja.github.io/the-rust-programming-language-ja/1.6/book/getting-started.html#cargoへ変換する)があります。めんどいので端折ります。

## Cargoプロジェクトの作成

以下コマンドで`hello_world`というディレクトリが作成され、必要なファイルがすべて自動的に生成されます。

```
cargo new hello_world --bin
```

ちなみに、`--bin`というフラグは、実行可能アプリケーション（`./hoge`と打って実行できるもの）を作る場合の指示です。

生成されたファイル群は以下のような階層になってます。

- hello_world/
    - src/
        - main.rs
    - Cargo.toml

`Cargo.toml`は、Cargoプロジェクトの設定ファイルです。以下のようになってます。

```toml:hello_world/Cargo.toml
[package]

name = "hello_world"
version = "0.1.0"
authors = ["あなたの名前 <you@example.com>"]
```

ここにプロジェクトに関する設定や情報を入力する感じですね。ふむ。

詳しくは、[公式Cargoガイド](http://doc.crates.io/guide.html)を参照してください、とのことです。

# まとめ

- Rustはコンパイラ型言語
- コンパイラは`rustc`
- Rustは`fn main(){}`から処理が実行される
- `println!()`はマクロ
- 文末にはセミコロン（；）が必要
- Cargoっていうやつでプロジェクト管理してる

この後は、文法を学んでいくボトムアップ式と、実際にサンプルプログラムを書いて勉強していくトップダウン式が紹介されてました。サンプルプログラムのセクションの中に「他言語と共存する」というちょっとおもしろそうなやつがあったので、とりあえずRustに慣れるという意味でもサンプルプログラムを書いていきたいと思います。
CakePHPでMySQLに接続しようとしたら「SQLSTATE[HY000] [2002] No such file or directory」と出た

cakePHPのチュートリアルを進めていたのですが、DB設定のところで、
「SQLSTATE[HY000] [2002] No such file or directory」というエラーが出て接続が確認できなかったので、色々調べて対応しました。

#原因
`mysql.sock`というMySQLソケットに関するファイルがうまく読み込まれてないのが原因のようでした。
(`config/app.php`の接続情報が正しいことは確認済み)

#対応

##`mysql.sock`の場所を確認

```console
# mysqladmin version

mysqladmin  Ver 9.1 Distrib 10.1.26-MariaDB, for debian-linux-gnu on x86_64
Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Server version		10.1.26-MariaDB-0+deb9u1
Protocol version	10
Connection		Localhost via UNIX socket
UNIX socket		/var/run/mysqld/mysqld.sock
Uptime:			2 min 37 sec

Threads: 1  Questions: 88  Slow queries: 0  Opens: 32  Flush tables: 1  Open tables: 26  Queries per second avg: 0.560
```
上記の`UNIX socket`の項目に`/var/run/mysqld/mysqld.sock`とありますが、これが`mysqld.sock`のパスになります。

##`mysql.sock`の場所をphpに教える
`php.ini`に`mysql.sock`のパスを記述します。
そのためにまずは`php.ini`の場所を見つけます。

```console
# php -i | grep php.ini
//php -iでphpに関する情報を表示しつつ、grepでphp.iniの部分だけ検索して表示します

Configuration File (php.ini) Path => /usr/local/etc/php
Loaded Configuration File => /usr/local/etc/php/php.ini
```

次に`php.ini`に記述します。
PDOを使うため以下のように記述します。

```console
# vim /usr/local/etc/php/php.ini
```

```php.ini
pdo_mysql.default_socket=/var/run/mysqld/mysqld.sock
```

##MySQLサーバーを再起動

```console
# service mysql restart
```

#確認

cakephpのビルトインサーバーを起動して、ブラウザからアクセスし、Databaseの項目に緑のコック帽がついていればOKです。

```console
# bin/cake server -H 0.0.0.0 -p 80
```

こんな感じ↓
<img width="374" alt="スクリーンショット 2018-02-05 21.01.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/121811/fe0fafc2-52f0-1696-a177-b77250821568.png">

【参考】
(mysql.sock関連)
https://www.mogumagu.com/wp/wordpress/archives/1198
(php.ini関連)
https://qiita.com/ug23/items/ab76a7104a0d073f1712
(SQL関連)
https://qiita.com/yusk24/items/923305e5acae19f6976d
https://webkaru.net/mysql/mysql-root-password/
Macのターミナルでファイル名内の空白をアンダーバーに置換する。

## Linux系はファイル名に空白があると厄介ですよね

拡張子が.emlで空白を含むファイル名の空白をアンダーバーに置換できます。

```$ find . -name “*.eml” -print0 | xargs -0 rename --nows```

macのターミナルでは、デフォではrenameが使えませんでしたので、
```$ brew rename ```
でインストールする必要があります。
git push origin masterした時にPermission Deniedが出た話

git push origin masterをしてエラーになってまたはまってしまったので、
こちらにメモしておきます。

git cloneについては問題なく実行できました。
その後、ローカル環境でファイルの修正し、git add, git commitをするまでは実行できました。

git push origin masterでpushして完了する予定ができませんでした。

理由は何かを調べていると
・公開鍵の作成とGithubの登録が必要のような投稿が多かったため、以下を行いました。

参考になったソース
公開鍵の作成とGithubの登録
http://monsat.hatenablog.com/entry/generating-ssh-keys-for-github

こちらは問題なくできました。
WebRTCとコーデックの関係

# この資料はなに？

[SkyWay UG Tokyo #2](https://skyway.connpass.com/event/76283/)のLT資料です。

---

# 自己紹介

## なかゆうすけ（@yusuke84）

- Twitter: [@Tukimikage](https://twitter.com/Tukimikage)
- 仕事:
  - [WebRTC Platform SkyWay](https://webrtc.ecl.ntt.com)
      - Technical solutions
      - Technical support
      - Developer relations
- コミュニティ:
  - WebRTC Meetup Tokyo 主催
  - WebRTC Beginners Tokyo 主催

---

# WebRTCで利用される主要なコーデック

## Audio

- Opus
- G.711

## Video

- VP8
- VP9
- H.264
- AV1

---

# 今日は映像コーデックのはなしをします

---

# コーデックの比較

|コーデックの種類|管理組織|ライセンス|備考|
|:--|:--|:--|:--|
|VP8|Google|ロイヤリティフリー|
|VP9|Google|ロイヤリティフリー|VP8の半分程度のビットレートで同品質を実現<BR>CPU使用２０％〜30%高め|
|H264|MPEG LA|ライセンス料がかかるが、Ciscoがライセンス費用を全て負担してOpenH264を出している|iOSデバイスはHW Accelerationに対応<BR>Androidデバイスは機種依存がやばめ…|
|AV1| AOM Alliance for Open Media |ロイヤリティフリー||

---

# 対応ブラウザ

|ブラウザ|コーデック|
|:--|:--|
|Chrome|VP8,VP9,H264,AV1(Canaryのみデコードに対応)|
|Firefox|VP8,VP9,H264,AV1(Nightlyのみ)|
|Safari|H264|
|Edge|VP8,H264UC(Skype用です…),VP9（今後対応される見通し）|

---

# CPU使用率の差

|Caller|Callee|コーデック|CalleeのCPU使用率の変化|
|:--|:--|:--|:--|
|OSX Chrome M64|Android Chrome M64|VP8|約65%|
|OSX Chrome M64|Android Chrome M64|VP9|約70%|
|OSX Chrome M64|Android Chrome M64|H264|(映像表示されず…)|
|OSX Chrome M64|OSX Chrome M64|VP8|約60%|
|OSX Chrome M64|OSX Chrome M64|H264|約50%|

- 通信環境: wifi
- ビデオサイズ: 640x480
- フレームレート 30fps
- 端末: HUAWEI P9

---

# コーデックを選択するには？

- 通常はSDPを書き換える必要があります

```
v=0
(…中略…)
a=group:BUNDLE audio video
m=audio 54321 RTP/SAVPF 111 103 104 0 8 106 105 13 126
(…中略…)
c=IN IP4 100.1.2.3
a=rtcp:54321 IN IP4 100.1.2.3
a=candidate:4022866446 1 udp 2113937151 192.168.0.1 34567 typ host generation 0
a=candidate:4022866446 2 udp 2113937151 192.168.0.1 34567 typ host generation 0
(…中略…)
a=rtpmap:111 opus/48000/2
a=fmtp:111 minptime=10
a=rtpmap:103 ISAC/16000
a=rtpmap:104 ISAC/32000
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
(…以下略…)
```

---

# SkyWayを利用する

```js
// Caller
const call = peer.call('peerID', localStream, {
  videoCodec: 'H264',
});
```

```js
// Callee
peer.on('call', call => {
    call.answer(localStream, {
        videoCodec: 'H264'
    });
});
```

- VP8,VP9,H264使用可能

---

# デモ

https://goo.gl/FWALhV

---
メール投稿システム(仮)

#メール投稿システム(仮)開発再開
ほぼほぼ出来上がってきた感じの写メ日記的なやつ。一旦、ストップしてから3ヶ月ほど経過していたので思い出せるか不安だったけど、単純なことの繰り返しだったので結構思い出せたのと、あとはデータベースに必要な情報を登録するだけで終わりそうだったのでなんとかなりそう。

添付画像かインライン画像かの判定をしているところがあるのだけど、何かやろうと思って一時的に判定してたんだけど何しようとしていたか忘れたので無かったことにするｗ

とりあえず、必要な情報の抜き取りは出来そうなのでなんとかなるかな。

必要な情報

- タイトル
- 送信者のアドレス
    - 送信者のアドレスを元にIDを判別
- 送信日時
- 本文
    - HTMLパート(主にこっちを使う)
    - PLAINパート
- インライン画像
    - 本文中に埋め込まれた画像、デコ絵やデコ画
- 添付画像
    - アタッチメントの画像

データベースにユーザーIDとメールアドレスを登録してメールが来たら送信者アドレスを取得して登録されてあるメールアドレスと比較、一致すればユーザーIDを取得すればいいかな。このIDと送信日時でフォルダ分けして投稿された画像を保存して行けば削除処理も楽かもしれん。`unlink`からの`rmdir`で完全に削除か。データベースに登録したレコードも削除しないとダメなのか。消さない消せないってゆー方向で動かないだろうかｗｗｗ

いつかやらなきゃならないと解っているけどもまだ終わってないのに色々と案件投げてくるんで出来れば1つずつ終わらせてから次に移りたいんだけどなぁ。同時進行は辛い。

とりあえず、一番気になってた案件が進めれそう。手続き型でのみコードを書いてるのでQiitaとかに載せたりするようなものじゃないです。クラス化したら色んな場面で使えそうだけどクラス化とか解らないのでしませんｗ
typesctiptをテストする


# 記事 is 何
テストをしたい。しよう。そう思って色々調べたメモ
取り敢えず `package.json` に入っているものを入れて、 `src` 配下に `***.ts` で書く。
test配下にテストコードを書く。

```
npm run build
```

で変換する。

```
npm run test
```

でテストを動かして

```
npm run coverage
```

でテストカバレッジを測定する



# ディレクトリ構成

```
.
├── .gitignore
├── README.md
├── package.json
├── src
│   └── sample.ts
├── test
│   └── sample.test.ts
├── tsconfig.json
└── tslint.json

```

最終的にこんな感じ

# package.json

```JSON:package.json
{
  "name": "unit-test-sample",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "mocha ./build/test/*.test.js",
    "coverage": "istanbul cover _mocha -- ./build/test/*.test.js",
    "build": "rm -rf ./build/* && tsc"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "@types/chai": "^4.1.2",
    "@types/mocha": "^2.2.48",
    "chai": "^4.1.2",
    "istanbul": "^0.4.5",
    "mocha": "^5.0.0",
    "postinstall-build": "^5.0.1",
    "remap-istanbul": "^0.10.1",
    "tslint": "^5.9.1",
    "tslint-config-airbnb": "^5.5.0",
    "tsutils": "^2.21.0",
    "typemoq": "^2.1.0",
    "typescript": "^2.7.1"
  }
}

```

# tsconfig.json

```JSON:tsconfig.json
{
  "compilerOptions": {
    "module": "commonjs",
    "target": "es5",
    "sourceMap": true,
    "outDir": "./build"
  },
  "include": [
    "src/*",
    "test/*"
  ],
  "exclude": [
    "node_modules"
  ]
}
```

# tslint.json

```
{
  "extends": "tslint-config-airbnb"
}
```

# 参考
http://blog.catalyst-system.jp/useful-001/

ちゃんとテストしていきたい。
git でコミット間の変更ファイルを確認する方法

CUI上でコミット間の変更ファイルを確認する方法。
GUI導入が億劫なのでずっとCUIでやってますが、他の人々は何を使ってるんだろう。。
おすすめのGUIツールあったら教えてくださいませ。。

```
git diff --stat [コミットID1] [コミットID2]
```
求分数的循环节

缓存一个历史余数列表，当发现当前的余数在之前的计算中出现过，那么就是第二个循环的开始。之前出现的余数的位置开始到当前的位置之前的部分就是循环节。

```rb
def recurring_cycle(x)
  r = 1
  m = {}
  a = ""
  while not m.include? r
    m[r] = a.length
    r *= 10
    a += (r / x).to_s
    r %= x
  end
  a[m[r]...a.length]
end
```
Basic認証

## 概要
ユーザがIDとパスワードを入力してサーバ側で検証することで、ユーザを認証する。
認証の中でも最も簡単に実装できるが、平文でIDとパスワードが通信経路に流れるため安全性は低い。
そのため、一般ユーザ向けのサービスとして利用されることはないが、一般公開されていない内部的なWebサービスで使われることも多い。

## 手順
1. IDとパスワードをサーバ側で設定し、ユーザに配布する。
2. ユーザは認証フォームに入力。サーバ側はリクエストのヘッダを見て認証を行う。
3. 一度ログインが確立すると、その後ブラウザはID・パスワードを自動でHTTPのAuthorizationヘッダに埋め込む。

## 参考
[Basic認証とフォームによる認証についてのまとめ](https://qiita.com/toshiya/items/e7dcc7610b15884b167e)
（gapps + babelから）clasp + babelに構造を変えないで移行できるか試してみました

## この記事は？

gapps+babelで構成していたGAS開発環境を、clasp+babelの構成に変えた際に困ったので、対応した内容を残しておきます。


### TL;DR

- `.clasp.json`を設定すれば、カレントじゃなく特定のディレクトリでソース管理できる
- gappsで管理していたsrcディレクトリを設定すれば、同じ構造のまま使える


### 状況

最近、社内利用のWEBアプリケーションの開発基盤に、GoogleAppsScriptを使ってます

- GitHubで管理したい
- ES6で開発したい（→babelでES5にトランスパイルしてupload）
- 好きなエディタで開発したい

といった個人的ニーズがあったので、以下の記事を参考にしてローカル環境を構築していました
https://qiita.com/zaki-yama/items/9a301542137febd8876c

その時の構造は、こんな感じです
`dev`の中にES６で開発し、babelでコンパイルして`src`に出力しています

``` gapps+babel
root
├── .babelrc
├── package.json
│    ~
├── gapps.config.json
├── dev
│   └── コード.js
└── src
    └── コード.js
```

### `clasp`

そんな中、1/11にGoogle公式のCLIとして、`clasp`（とScriptAPI）がリリースされていたという事実に今更気がつきました
困っていたことがいくつか解決できそうなので、`gapps`から`clasp`に移行することに決めて、検証してます
claspに関しては、こちらの記事を参考にしました。
　https://qiita.com/soundTricker/items/354a993e354016945e44

ただ、標準的な利用ではclaspはカレントディレクトリにスクリプトを展開するので、標準的な利用ではgappsの構造のままでは使いにくい状況でした
また、カレントに直接展開されちゃうので開発用のファイルとデプロイ用のファイルが混在してしまいます

``` claspで展開した時
root
.
├── appsscript.json
└── コード.js ←直下に展開されてしまいます
```

### `.clasp.json`

https://github.com/google/clasp
困ったので、~~なんなら自分で作るかと思いながら~~issueを辿ってみると、

> Possible to specify directory for push / pull ?

という記述が
`.clasp.json`ファイルと`pull`/`push`コマンドの組み合わせでディレクトリを特定して連携する機能が追加されているようです！
まだreadmeには書かれてませんが、早速試してみました

### 試してみました

持っている情報が同じなので、gapps.config.jsonを.clasp.jsonに書き換えます

```gapps.config.json
{
  "path": "src",
  "fileId": "XXXX-scriptId-XXXX"
}
```

このファイルをリネームします

```
$ mv gapps.config.json .clasp.json
```

`.clasp.json`の書式に合わせて修正します

- path → rootDir
- fileId → scriptId
- （順番は関係ないと思いますが、issueに乗っている例の順に変えてます。念のため。）

```.clasp.json
{
  "scriptId": "XXXX-scriptId-XXXX",
  "rootDir": "src"
}
```

これだけです

あとは、`pull`と`push`でgappsと同じような使い方が可能です

- ソースを持ってくるとき：`$ clasp pull`
- uploadしたいときは：`$ clasp push`


### おわり

とりあえず機能確認までです

あとでやりたいこと

- `clasp`ではローカルでプロジェクトが作れるらしいので、ES６で構築するためのサンプルテンプレートとかを作ろう
Azure IoT Hub に paho で subscribe

Hub は、iot-aa
Device は pansy
と設定されている Azure IoT Hub に paho で subscribe するサンプルです。

```py3:azure_subscribe.py
#! /usr/bin/python
# -*- coding: utf-8 -*-
#
#	azure_subscribe.py
#
#		                   Feb/05/2018
#
# ------------------------------------------------------------------
import  sys
import  ssl

from time import sleep
import paho.mqtt.client as mqtt

from generate_sas_token import generate_sas_token
# ------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")

uri = "iot-aa.azure-devices.net/devices/pansy"
key = "2eQ2wF5OjZLP7tq6PG123456789RTfAnMJbZ8wtJPu4="
policy_name = None
iexpire = 3600
sas_token = generate_sas_token(uri, key, policy_name, iexpire)
#
path_to_root_cert = "/etc/ssl/certs/ca-certificates.crt"

host = 'iot-aa.azure-devices.net'
port = 8883
topic = 'devices/pansy/messages/devicebound/#'

# ------------------------------------------------------------------
def on_connect(client, userdata, flags, respons_code):
	sys.stderr.write("***on_connect ***\n")
	print('status {0}'.format(respons_code))
	client.subscribe(topic)

# ------------------------------------------------------------------
def on_message(client, userdata, msg):
	sys.stderr.write("***on_message ***\n")
	print(msg.topic + ' ' + str(msg.payload,'utf-8'))

# ------------------------------------------------------------------
client = mqtt.Client(client_id="pansy",protocol=mqtt.MQTTv311)
client.username_pw_set(username="iot-aa.azure-devices.net/pansy", password=sas_token)

client.tls_set(ca_certs=path_to_root_cert, certfile=None,
	keyfile=None, cert_reqs=ssl.CERT_REQUIRED,
	tls_version=ssl.PROTOCOL_TLSv1_2, ciphers=None)

client.tls_insecure_set(False)

client.on_connect = on_connect
client.on_message = on_message

try:
	client.connect(host, port=port, keepalive=60)
	client.loop_forever()
except Exception as ee:
	sys.stderr.write("*** error *** in client.connect ***\n")
	sys.stderr.write(str(ee) + "\n")

sys.stderr.write("*** 終了 ***\n")
# ------------------------------------------------------------------
```

generate_sas_token.py はこちらです。
[Azure IoT Hub に paho で publish](https://qiita.com/ekzemplaro/items/8a2f8ac7bae35a9c91d4)
Native Javascript でリスト絞り込み（条件はテキストのみ）

宮崎在住エンジニアのジョウ(@JotarO_Oyanagi) です。

Javascript のフレームワークを使うことが多くなってきたので、ビルドされたファイルの容量を抑えるために極力ライブラリを使用せず済むよう、リストの絞り込みは Native の Javascript でやっちゃおう、とあれこれした結果をご紹介します。

# TL;DR
- Native Javascript でリストの絞り込みを行う（条件はテキストのみ）
- **IE9 以上** を対象とする
- 使用するのは `Array.filter` 、 `Array.every`

# こんな関数を作ってみた
```javascript
/**
* @param strQuery 絞り込みするためのクエリ
* @param arrData 絞り込み対象リストのデータ
*/

var getFilteredList = function(strQuery, arrData) {

  // 入力されたクエリをスペースで区切って配列に格納
  var arrFilterConditions = strQuery.trim().replace(/　/g, ' ').split(' ');

  // Array.filter の callback
  // 引数の objItem は filter 対象の配列要素
  var hasMatchingParam = function(objItem) {

    // Array.every の callback
    // 引数の strFilterCondition は every 対象の配列要素
    var includesQueryString = function(strFilterCondition) {
      var arrParams = Object.keys(objItem);
      var strTesting = '';

      // 対象のパラメータ値を連結（今回は全パラメータ）
      arrParams.forEach(function(strParam) {
        strTesting += objItem[strParam]
      })

      // 対象のパラメータ値（連結済み）に入力されたクエリが含まれているかを判断
      return strTesting.indexOf(strFilterCondition) !== -1
    }

    // 入力されたそれぞれのクエリに対し、条件に合うリストがあるかを判断
    return arrFilterConditions.every(includesQueryString)
  };

  // リストのデータの中に、入力されたクエリにマッチするリストがあるかを判断
  return arrData.filter(hasMatchingParam);
};
```

[デモはこちら（jsfiddle）](https://jsfiddle.net/jotarO_Oyanagi/bcsqtab8/41/)

`indexOf` を使用していますが、 IE を対象外とするならば `includes` に置き換えられます。

ちなみに今回、入力された文字列、およびパラメータ値を整形（ `Upper => Lower` 、 `ひらがな => カタカナ` など）する処理入れていませんが、実際の使用にあたっては実装することをオススメします。

# 終わりに
IE のない世界を見るまで頑張る。