OmniAICreator/Qiita-1.07M huggingface dataset:
機会学習勉強履歴


# 目的

- 1から機械学習を勉強していく上で、モチベーション維持のためにも成果をどこかに記して行きたかった。
- 完全に独学である為、有識者が見たときにここまで進んでいるなら次はこれが良いのでは？というアドバイスを貰えたらという期待
- 後学の方の参考になればよいなと


# 目標（随時更新）
- iphone/WEBアプリから起動して何か処理させる一連のサービスを作る（イメージついてないのでざっくり）


- [x] JDLA Deep Learning for GENERAL 2018 #1 
- [ ] Python 3 エンジニア認定データ分析試験(いつ開催されるのでしょう、、、)
- [ ] 応用情報技術者試験（申し込み忘れた、、、）
- [ ] データベーススペシャリスト試験（今年は落ちました、、来年か）
- [ ] 統計検定
- [ ] IoTシステム技術検定
- [ ] IoT検定
- [ ] AWS認定

なんとなく必要そうなものをとりあえず列挙。
資格に大きな意味があるとは思っていませんが、勉強を進める為の指針として。


# 履歴
[人工知能は人間を超えるか]
(https://www.amazon.co.jp/%E4%BA%BA%E5%B7%A5%E7%9F%A5%E8%83%BD%E3%81%AF%E4%BA%BA%E9%96%93%E3%82%92%E8%B6%85%E3%81%88%E3%82%8B%E3%81%8B-%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%81%AE%E5%85%88%E3%81%AB%E3%81%82%E3%82%8B%E3%82%82%E3%81%AE-%E8%A7%92%E5%B7%9DEPUB%E9%81%B8%E6%9B%B8-%E6%9D%BE%E5%B0%BE-%E8%B1%8A/dp/4040800206)
![41awNvZKJNL._SX354_BO1,204,203,200_.jpg](https://qiita-image-store.s3.amazonaws.com/0/261970/1a8a7cab-f7f6-a81c-9ee8-41de8312d00a.jpeg)


[AI白書 2017]
(https://www.amazon.co.jp/AI%E7%99%BD%E6%9B%B8-2017-%E7%8B%AC%E7%AB%8B%E8%A1%8C%E6%94%BF%E6%B3%95%E4%BA%BA%E6%83%85%E5%A0%B1%E5%87%A6%E7%90%86%E6%8E%A8%E9%80%B2%E6%A9%9F%E6%A7%8B-AI%E7%99%BD%E6%9B%B8%E7%B7%A8%E9%9B%86%E5%A7%94%E5%93%A1%E4%BC%9A/dp/404899607X/ref=pd_lpo_sbs_14_t_1/355-1045179-8448524?_encoding=UTF8&psc=1&refRID=MC8M95NQ073BTHG1GD4P)
![41+qNuZbWeL._SX352_BO1,204,203,200_.jpg](https://qiita-image-store.s3.amazonaws.com/0/261970/ad8bc28b-9227-d995-2ee3-9fd2abac8f00.jpeg)





[YOUTUBE:チームラボ 勉強会]
[2016-05-16 Deep Learning勉強会 #1](https://youtu.be/-KBhaqoRuGs)
[2016-05-23 Deep Learning勉強会 #2](https://youtu.be/p9s0eUUlPpc)
[2016-05-30 Deep Learning勉強会 #3](https://youtu.be/FokAN8kxSmM)
　

---
## JDLA Deep Learning for GENERAL 2018 #1合格

一発合格！
[日本デイープラーニング協会](http://www.jdla.org/business/certificate/#education)

---
　


[Udemy]
[【キカガク流】人工知能・機械学習 脱ブラックボックス講座 - 初級編 -](https://www.udemy.com/kikagaku_blackbox_1/)

[【キカガク流】人工知能・機械学習 脱ブラックボックス講座 - 中級編 -](https://www.udemy.com/kikagaku_blackbox_2/)

[詳細！Python 3 入門ノート]
(https://www.amazon.co.jp/%E8%A9%B3%E7%B4%B0%EF%BC%81Python-3-%E5%85%A5%E9%96%80%E3%83%8E%E3%83%BC%E3%83%88-%E5%A4%A7%E9%87%8D-%E7%BE%8E%E5%B9%B8-ebook/dp/B07171GVWK)
![61JsdFj8HtL.jpg](https://qiita-image-store.s3.amazonaws.com/0/261970/fcb3a26b-fee5-d041-79e7-3f07ae3ee440.jpeg)


[ゼロから作るDeep Learning]
(https://www.oreilly.co.jp/books/9784873117584/)
![picture_large978-4-87311-758-4.jpg](https://qiita-image-store.s3.amazonaws.com/0/261970/84c158f6-d21d-464b-4536-a642fe79b550.jpeg)

[Udemy]
[【キカガク流】現場で使えるChainerによるディープラーニング入門](https://www.udemy.com/kikagaku-chainer/)
xibをロードしようとしたらアプリ落ちる問題に少しハマったのでメモ

```swift
let view:UIView = UINib(nibName: "SkillHeader", bundle: nil).instantiate(withOwner: self, options: nil)[0] as! UIView
```
こんなコードを書いてxibを生成したかったのですが、
Could not load NIB in bundle
というエラーでハマったしまったのでメモ。

結論から書くと、生成したxibがCopy Bundle Resourcesに登録されていませんでした。

![スクリーンショット 2018-07-01 15.20.54.png](https://qiita-image-store.s3.amazonaws.com/0/59336/fbe4dc77-5116-256b-6937-1a186eb02480.png)

xibをここにドラッグ＆ドロップすれば無事に行けました。

https://yuu.1000quu.com/points_to_note_when_acquiring_files_with_swift
こちらのサイトを参考にさせて頂きました。
ありがとうございました。
【初心者向け】プロセスについて【Linux】

# はじめに
プロセスについて学んだことをメモします。
訂正、追記ビシバシお待ちしております。


# プロセスとは

　プロセスとは、**プログラムが動いている状態**のことを表します。プログラムが動いている*実行状態を表す全ての情報*を含めてプロセスと呼びます。

例えば、ターミナルで下記のコマンドを実行したとすると、

```
　　ls コマンド入力　→　[Enter]　→　lsコマンド実行
```

以上を「**lsのプロセスが生成される**」と表現します。
皆さんが普段ターミナルから打ち込んで使っているコマンドはもちろん、シェルであるbashなどもプロセスとして動いてます。

何となく、プロセスのイメージが掴めたでしょうか？
ただ、プロセスをもっと噛み砕いて説明すると下記のように言い換えることができます。

**CPUが、プログラムに記載された順番と命令文にしたがって、あるメモリのデータに対して演算を行なっている状態**。

　実行中のプログラムが利用するデータは、全てメモリに書き出してから使用することになります。演算の結果生じた値、コマンドラインで入力された値、通信して受け取ったデータなどなど..それらのデータはメモリに入れてから使用されるため、CPUはプログラムの実行中にメモリだけを見ていればいいことになります。

プロセスが動作しているとき、上記したような様々な値が複雑に変化しており、それらは一つ一つのプロセスごとに固有のものです。それぞれのプロセスが持つ固有の様々な値を**コンテキス**トと呼びます。Linuxカーネルではプロセス一つ一つに対して、**task_stract構造体**というデータ構造を準備しており、プロセスがもつコンテキスト情報を全てtask_stract構造体で管理しています。Linuxカーネルがプロセスを操作する際は、task_stract構造体に対して操作を行います。
# task_struct構造体
 task_struct構造体は、取り扱うデータの種類によって、内部で2つのセグメントに別れています。

#### テキストセグメント
　プログラムの命令列（実行されるプログラムそのもの）

#### データセグメント
　スタックポインタ（スタック領域のどこを見ているのか）や、プログラムカウンタ（プログラムのどこを実行しているか）などの、プロセス管理用のデータ領域の情報や、実際に用いている変数の値などが格納されています。

# プロセスの生成
　Linuxでは、親プロセスから子プロセスがコピー（fork）されて生成されます。これは要するに、自分のコピーを子供として生成するということです。

　子プロセスが生成されると、その子プロセスには、子プロセス用のメモリ領域が割り当てられます。割り当てられたメモリに、親プロセスのデータセグメントをコピーすることで、プロセスとして動き出します。実行するプログラム自体は親プロセスと共有し、実際に用いる変数の値などは自身の子プロセス専用のものにアクセスすることになります。


![スクリーンショット 2018-07-01 14.41.40.png](https://qiita-image-store.s3.amazonaws.com/0/258471/f1014fea-558a-6bf6-fb5b-e5a043714628.png)

プロセスの親子関係の例をあげるなら、bashの上でlsコマンドが動作する時は、**親プロセスであるbashの、子プロセスとしてlsが生成されている**ということになります。

　単純に親プロセスをコピーしただけでは全く同じ動作をするプロセスが新しく誕生するだけなので、子プロセスとしてbashのコピーを生成した後に、その子プロセスのtask_struct構造体のデータを書き換えることで、lsとして動作させています。


# 引用

【Linuxの「プロセス」って何だろう？ -“応用力”をつけるためのLinux再入門（13)】
http://www.atmarkit.co.jp/ait/articles/1706/23/news010.html

【イケてるエンジニアになろうシリーズ 〜メモリとプロセスとスレッド編〜 -もろずblog】
http://moro-archive.hatenablog.com/entry/2014/09/11/013520#4
変化点分析：変化要因の可視化

ECサイトなどでデータ分析やっていると「売上が下がった原因を調べてくれ」とかよく言われる。

調べてみると確かに売上が減っている。

![Rplot.png](https://qiita-image-store.s3.amazonaws.com/0/2570/1f521e5e-27f2-a443-57db-f3cfb50d8ac2.png)

これを **changepoint** パッケージで変化点を検出してみる。

![Rplot.png](https://qiita-image-store.s3.amazonaws.com/0/2570/70ad51b7-35fa-88a9-83eb-21f3f4f1f7e0.png)

売上の変化点が3つ検出された。

これに対して、売上を男女別に分けてみる。

![Rplot01.png](https://qiita-image-store.s3.amazonaws.com/0/2570/ce75400f-bb50-fd99-de2e-54ce7fc05ab4.png)
![Rplot02.png](https://qiita-image-store.s3.amazonaws.com/0/2570/651277ad-e9bd-55dd-697b-9153dbc04d2d.png)

上が男性、下が女性。

1番目と3番目の変化は男性によるもの、2番目の変化は女性によるものである。

これを可視化したい。

**changepointExt** パッケージというものを作った。

```r:R
# 男女別の売上を作成 -------------------------------------------------------------
set.seed(314)
sales_male <- c(rnorm( 50, mean = 500, sd = 50),
                rnorm(100, mean = 400, sd = 50),
                rnorm( 50, mean = 300, sd = 50))
sales_female <- c(rnorm(100, mean = 200, sd = 50),
                  rnorm(100, mean = 100, sd = 50))
# 合計したものが全体の売上
sales_all <- sales_male + sales_female


# 変化点検出 -------------------------------------------------------------------
library(changepoint)

cpt_all <- cpt.meanvar(sales_all, method = "PELT")
cpt_male <- cpt.meanvar(sales_male, method = "PELT")
cpt_female <- cpt.meanvar(sales_female, method = "PELT")


# 可視化 ---------------------------------------------------------------------
library(changepointExt)

combi <- combine_cpts("男性" = cpt_male, "女性" = cpt_female)
autoplot(cpt_all) + autolayer(combi)
```

![Rplot04.png](https://qiita-image-store.s3.amazonaws.com/0/2570/88d9db8a-0b4a-30a1-29c3-faf0fe84ad99.png)

Enjoy!

- [変化点分析：変化要因の可視化 (2)](https://qiita.com/hoxo_m/items/05c9c78297fd590e91b9)
Armoryゲームエンジンでノードと動作が一致しないとき

Blenderをベースにしたゲームエンジン、Armory3dの勉強中に上記の状況に遭遇したので情報共有。マニュアルとかは特に参照していないので、雑に信用してください。
結構よく遭遇するので、arm.clean_menuをショートカットキー登録しておくとお得です。

# TL;DR
方法1:Source/node内の.hxファイルを削除する
方法2:Armory Player（Playがある場所）の中のCleanをクリックする

# 前提
## Armoryのディレクトリ構成図
FirstGameフォルダの中にfirstgame.blendを置いたと考えてください。また、MyNodeというノードとMyScript.hxというスクリプトをどこかのTraitに加えたと考えてください。


### 開始状態

```
FirstGame
├─firstgame.blend
└─Source/
  └─arm/
    └─MyScript.hx
```

### Play実行後（多分Build実行後も同じ）
```
FirstGame
├─firstgame.blend
├─khafile.js
├─build_firstgame/
  └─...
└─Source/
  ├─Main.hx
  └─arm/
    ├─MyScript.hx
    └─node/
      └─MyNode.hx
```

いうまでもなく、開始状態にないものは自動生成ものです。
ちなみにkhafile.jsはパス通しとかしているっぽいです。

### Clean実行後

```
FirstGame
├─firstgame.blend
└─Source/
  └─arm/
    └─MyScript.hx
```

開始状態に戻りました。

# 本編
## 遭遇した事態
いろいろいじっていたら、ゲーム実行中にフリーズするようになった。

## 解決の道筋
1. firstgame.blendのみを別ディレクトリに移したら、動くようになった。
2. build_firstgame/を消しても、動かなかった。
3. Source/を消すと動くようになった。
4. node/を消すと動くようになった。
5. Cleanを実行しても動くようになった。

なので、

方法1:Source/node内の.hxファイルを削除する
方法2:Armory Player（Playがある場所）の中のCleanをクリックする

のどちらかで解決すると思います。ちなみに根源はたぶんOn KeyboardノードとKeyboardノードを間違えたからです。
【Android】アプリ署名キーを忘れた場合の再公開手順まとめ

#経緯
1年ほど前、Androidアプリ開発の勉強のため1本アプリを作成し、GooglePlayストアにアプリを公開していました。その後しばらく触っていなかったのですが、久々にいじってビルドを試してみたところ、パスワードが一致しない…！一通り試してもダメそうでしたので、潔く諦めて再度アプリを公開することとしました。

#手順
##1. アプリを非公開にする
該当アプリを選択→「ストアでの表示」→「価格と販売 / 配布地域」より
アプリの公開状況を「非公開」に設定します。

##2. アプリ情報を登録する
すべてのアプリ→アプリを作成より、新規アプリを登録し、必要な情報を入力します。
アイコンやスクリーンショットなど、画像がいくつか必要になります。

##3. その他必要情報の設定
「価格と販売 / 配布地域」「コンテンツのレーティング」の項目について、設定必須の項目があるので、アプリに適合した内容を登録します。

##4. パッケージ名を変更する
別アプリとしても、同じパッケージ名で公開することはできませんので、パッケージ名を変更する必要があります。同じパッケージ名でAPKをアップロードしようとすると、以下のようなエラーになります。
![Screenshot-2018-7-1 アプリのリリース - Rapid Choice - Google Play Console.png](https://qiita-image-store.s3.amazonaws.com/0/104983/e7f92a5e-7698-0336-2a0b-cbca53971f33.png)

AndroidStudioの機能に、パッケージ名を一括変更できる機能があるかなと思い探していたのですが、見つからず…。どうやら手で地道に直すしか無いようです。以下の記事を参考に、パッケージ名の変更を行います。
[Androidアプリのパッケージ名を変更する - Qiita](https://qiita.com/m_saeki/items/a66a21a51504446c09fd)

##4. 新しいキーでビルドする
AndroidStudioの「Build」→「Generate Signed APK」を選択し、新しい署名キーを作成したうえで、ビルドを実施します。

##5. アプリのアップロードと公開
「リリース管理」→「アプリのリリース」より、作成したAPKファイルをアップロードし、公開します。

#感想
私の場合、悲しいことにアプリのインストール数が1…つまり自分だけでしたので影響は皆無でしたが、商用で公開しているアプリで同じことが起きたら一大事だと思います。また、アプリ再公開までに要する手間も馬鹿になりません。署名に必要な情報はしっかりとまとめておきましょう（反省）。
RubyでAWS S3のオブジェクトの一覧を取得してみた

某所で似たような記事を見かけたので、軽く書いてみた。

## 環境
Ruby 2.6.0-preview2
aws-sdk gem 3.0.1
irbからでもrbファイルでも。

## コード
```rb
require "aws-sdk"

# 環境に応じて記載
S3_REGION = "us-west-2".freeze
S3_BUCKET_NAME = "bucket-name".freeze
S3_PREFIX = "directory-name/".freeze
AWS_ACCESS_KEY = "".freeze
AWS_SECRET_ACCESS_KEY = "".freeze

Aws.config.update(
  region: S3_REGION,
  credentials: Aws::Credentials.new(AWS_ACCESS_KEY, AWS_SECRET_ACCESS_KEY)
)
s3 = Aws::S3::Client.new

current_bucket_files = Set.new
options = { bucket: S3_BUCKET_NAME, prefix: S3_PREFIX, max_keys: 1000 }
loop do
  res = s3.list_objects_v2(options)
  current_bucket_files |= res.contents.map(&:key)
  options[:continuation_token] = res.next_continuation_token
  break unless options[:continuation_token]
end
```

`current_bucket_files`にオブジェクトの名前の一覧が取得される。
Rapiroを動かすためにRaspberry Pi3 にRaspbianをインストールする

## Raspberry Pi3にRaspbianをインストールする

## ダウンロードから初期設定まで
イメージファイルをダウンロードし、初期設定が終わるまではこんな感じ。

1. [ここ](https://www.raspberrypi.org/downloads/raspbian/)からRaspbianのDesktop版をダウンロードする。
1. マイクロSDカードは、SDカードフォーマッタでフォーマットしておく。
1. ダウンロードしたZipファイルを展開すると、imgファイルが出てくるので、Win32DiskImagerでSDカードに書き出す。
1. マイクロSDをRaspberryPiに入れ、電源を入れると初期設定を行うように促してくるので、パスワードとWifiのパスワードを設定する。
1. 設定が終わると、Updateを行い、再度リブートするよう促してくるのでリブートする。

## 日本語の入力設定
次に日本語を入力できるようにする。
```
$ sudo apt-get install fonts-vlgothic
$ sudo apt-get install ibus-anthy
$ sudo apt-get install jfbterm
```
一度リブートすると次回から日本語変換が出きるようになる。

## sshdを動かす
インストールしただけだとsshdが動作していないので、
```
$ service sshd restart
```
として、sshdを動作させる。でもこのままだとリブートするとsshdが立ち上がってこないので、Raspberry Pi Software Configuration Tool (raspi-config)を使ってRaspberryPiの設定をする。
```
sudo raspi-config
"5 Interfacing Options"を選択
"P2 SSH"を選択
```
これで、ifconfigでIPアドレスを調べておけば、sshでログインできるようになる。
Laravel を Elastic Beanstalk Docker にデプロイ

趣味・業務共にアプリを載せるサーバーは VPS か Heroku しか経験がない。
ということでAWSの中で比較的敷居が低そうなElastic Beanstalkでこんにちはしてみた。
用意されたPHP環境にデプロイすることもできるが、Dockerfileを組むのが好きなのでDockerで。

# 環境
- OSX High Sierra
- eb-cli インストール済
- laravel/installer インストール済

# Laravel プロジェクト作成
```
laravel new myproject
cd myproject
```

# プロジェクト直下にDockerfile作成
```dockerfile:myproject/Dockerfile
FROM dyoshikawa/laravel:latest

RUN apk add nginx
RUN mkdir /run/nginx
COPY nginx.conf /etc/nginx/conf.d/default.conf

RUN sed -i -e "s/www-data/nginx/g" /usr/local/etc/php-fpm.d/www.conf

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

COPY . .
RUN chmod +x start.sh

RUN composer install
RUN chown -R nginx:nginx /usr/src/app

EXPOSE 80
CMD bash start.sh
```

ベースイメージは[Dockerhub](https://hub.docker.com/r/dyoshikawa/laravel/~/dockerfile/)で公開している。

```bash:myproject/start.sh
#!/bin/bash
nginx
php-fpm
```

```nginx:myproject/nginx.conf
server {
    listen  80 default_server;
    listen  [::]:80 default_server;
    server_name  localhost;
    root /usr/src/app/public;
    index index.php index.html;

    location / {}

    location ~ \.php$ {
        root           /usr/src/app/public;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /usr/src/app/public$fastcgi_script_name;
        include        fastcgi_params;
    }

    error_page 404 /404.html;
    location = /40x.html {}
}
```

下のEB用設定ファイルも作成。

```json:myproject/Dockerrun.aws.json
{
  "AWSEBDockerrunVersion": "1",
  "Ports" : [{ "ContainerPort": "80" }]
}
```

# eb init, create, deploy
```
eb init
```

対話で色々聞かれる。

- `Select a default region` → `9) ap-northeast-1 : Asia Pacific (Tokyo)`
- `Do you wish to continue with CodeCommit?` → `n`

```
eb create
```

これも聞かれる。

- `Enter Environment Name` → `Enter`
- `Enter DNS CNAME prefix` → `Enter`
- `Select a load balancer type` → `2) application`

```
eb deploy
```

待つだけ。

# 環境変数
`php artisan key:generate --show` を叩いて出力されるkeyをコピーする。
AWS EBのWebコンソールから `設定` → `ソフトウェア 変更` → `環境プロパティ` で環境変数をセットできる。
ここで `APP_KEY={コピーしたkey}` を設定。

# 最後に
こんにちはを見たかっただけなのでRDSは建てていない。
趣味用途を考えるとHerokuの方が簡単だし安いので環境は消した。
消さないと課金されていくので注意(当たり前だけど一応)。

# 参考
[Rails on DockerをElastic Beanstalkにデプロイする ｜ Developers.IO](https://dev.classmethod.jp/cloud/aws/deploy-rails-on-docker-to-elasticbeanstalk/)
[AWS + Nginx + PHP + Laravel - Qiita](https://qiita.com/yumatsud/items/7093fc9b389070ddecd1)
Gitのmergeとrebaseのコミットログの違い

はじめに
-----

mergeとrebase、2パターンのブランチの統合方法の違いをSourceTreeの画面を使って比較します。

統合前
-----
`master`から`feature`を分岐させた状態で同じファイルにいくつかコミットします。統合すると競合が発生する状態になっています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/66405/ebbc35f0-2b51-412d-339d-cbefcf1335eb.png)



mergeした場合
-----

masterとfeatureのそれぞれのコミットが、時系列で入れ子の状態になっています。コミットのsha値はそのままです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/66405/a68dde88-b39c-e9ba-3e60-cb683eda7d57.png)

rebase(no-ff)した場合
-----

masterの後ろにfeatureがくっついた形です。コミット日付はrebase時点の日付になります。コミットのsha値は元と変わっています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/66405/de326951-a380-30c9-d0c2-8cb8ca4796c0.png)


まとめ
----
作業人数が多かったり、修正が折り重なってくることを考えると、rebaseの方が後から見てわかりやすいのではと思います。

作業的にはrebaseは一つずつコミットをマージしていくため、コミットの数だけコンフリクトが起こる可能性があり、都度解決していく形になります。mergeはまとめて解決することができます。
CINEMA 4D | グラデーションを使ってデプスマップのようなものを出力する方法（プロジェクションマッピング向け） 

![screenshot 2018-07-01 12.56.18.png](https://qiita-image-store.s3.amazonaws.com/0/199903/9a308c19-4b7f-8e7f-8129-91f69cecc436.png)
<br />

![screenshot 2018-07-01 13.00.44.png](https://qiita-image-store.s3.amazonaws.com/0/199903/1419e8d5-7623-547b-6203-7b3b5c123cfd.png)
<br />

![screenshot 2018-07-01 12.58.17.png](https://qiita-image-store.s3.amazonaws.com/0/199903/32c7c1aa-45a1-d4a0-9ef7-1b3040d4520d.png)
<br />

![screenshot 2018-07-01 12.58.48.png](https://qiita-image-store.s3.amazonaws.com/0/199903/75122dbb-3888-83ef-c6ea-24d73aed7446.png)
<br />

![screenshot 2018-07-01 12.59.03.png](https://qiita-image-store.s3.amazonaws.com/0/199903/057cc2c6-77f6-17e4-d1fa-d43b0a72bba9.png)
<br />

Before
![screenshot 2018-07-01 12.59.41 1.png](https://qiita-image-store.s3.amazonaws.com/0/199903/1760ae19-3de5-ea28-1531-3c5123779d77.png)
<br />

After
![screenshot 2018-07-01 12.59.24.png](https://qiita-image-store.s3.amazonaws.com/0/199903/ba6feee0-28e7-c0f2-5490-009c59a2574a.png)
Cloud9上でGit管理(差分比較など)

cloud9の詳しい説明や基本的な操作方法などはこちらを参照すると良いと思います。
https://www.sejuku.net/blog/385#Cloud9Let8217s_HelloWorld
Cloud9とGit連携方法についてはこちらを参照すると良いと思います。(下記手順を行う前に連携しておくと話がスムーズになります)
https://rails-study.net/github/
https://qiita.com/NaokiIshimura/items/b318ebc2daa4ec07a31e
##本題
1. Cloud9を起動する。
2. エディタ画面を開く
3. 画面右上の設定マーク（歯車マーク）を押下する（設定画面が開く）
4. 設定項目の「EXPERIMENTAL」を選択
5. 大項目PanelsのChanges PanelをONにする。
6. Cloud9の画面を更新する。（画面左に「Changes」と書かれたパネル選択ボタンが出てくる。）
![diff.png](https://qiita-image-store.s3.amazonaws.com/0/116515/16e21c70-c8f3-40ee-1896-1c9026954ead.png)

7. Changesパネルを開くとgit管理がGUIで行える画面が表示される。
ファイルに変更を加えるとMODFILED FILESに該当ファイルが表示され、クリックすると、元のそのブランチで編集した内容が表示される。

MODFILED FILESのファイルをドラッグして、ステージングに入れることもできる。
コミットメッセージを入れてコミットすることもできる。
![タイトルなし.png](https://qiita-image-store.s3.amazonaws.com/0/116515/a7443ae8-d43d-077f-c16c-d7e8177bcecc.png)

GUIを使用してpushするのはうまくできなかったが、それはコマンドラインから、git push origin リモートリポジトリ名を入力するなどして行っている。

GUIでできない部分も多いのでそこは上記のようにコマンドラインから行うようにしております。
ほかのIDEで出来てたGithubの差分管理がCloud9上で出来るのはとても便利だ。
AWSで予約されているIPアドレス

よく忘れてしまうので、備忘録として残しておきます。

サブネットが10.0.0.0/24の場合
.1: VPCルータ
.2: 予約（DNS用？）
.3: 予約

先頭3 IPが使用できないと覚えれば問題ないですね。

https://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/VPC_Subnets.html
2018年度のプロ生松山に参加しました

<img src="https://qiita-image-store.s3.amazonaws.com/0/26979/fb1240a7-f1bb-03c7-d516-542c97f0ae1c.jpeg" width=320px>

#はじめに
私の中では恒例行事なのですが、今年もプログラミング生放送松山に参加してきました。
今年は登壇者、しかもトップバッターとして出させて頂きました。

イベント詳細
https://atnd.org/events/96211

当日の様子
https://www.youtube.com/watch?v=6E4SDwaigzw

## セッション内容
#ゼロからはじめるゲームプログラミング(私が登壇したセッションです）
https://speakerdeck.com/kaidouji85/zerokarahazimerugemupuroguramingu

ゲームプログラミング入門のお話をしました。
今回は実際に動くサンプルから作ったので、メチャクチャ大変でした。
あと、用意した内容が発表時間内におさまらないことが分かったので、泣く泣くカットしました。
~~ここの準備が一番時間かかったのに。~~

発表を聴きに来てくれた方の中にゲーム専門学校の学生がいたので、懇親会の時に話が盛り上がりました。
彼に泣く泣くカットした内容を簡単に説明しましたが、面白そうに聞いてくれました。
何年か前にこの勉強会で関数型プログラミングの話をしたのですが、学生には受けが悪くてちょっと凹んでいました。
今回はそのリベンジが出来たと、勝手に思っています。

##Windows 10 の診断データを覗いてみよう
https://speakerdeck.com/msdmairitan/deep-dive-into-windows-10-diagnostic-data

元東京、現四国でWindowsの開発をしている方の話を聞くことが出来ました。
Windows10の診断ツールって、日本のチームが作っていたらしいです。
とあるツールを使うと、Windowsが送信しているデータが全部見れることを初めて知りました。
しかも、データ形式はJSONなので、何となく意味も分かります。
マイクロソフトは年々オープンになってきている印象ですが、それもついにここまで来たかという感じです。

##「かなしきだるやなぎちゃん」
https://www.slideshare.net/youandi060219/ss-102523006?ref=https://blog.daruyanagi.jp/entry/2018/06/18/190653

タイトルは釣りらしいです。
内容は画面テスト自動化＋エビデンス画像の自動生成というものです。
結合テスト自動化は比較的新しい分野というイメージがありましたが、今は比較的枯れている技術なのだと感じました。
あと、画面スナップショットを扱う技術が、数年前に比べて随分敷居が下がったようにも思いました。

##感想
発表の準備が大変でしたが、今年も楽しい勉強会でした。
自分の発表内容に関しては、目新しさが足りなかったかなと感じています。
よく言えば堅実、悪く言えば地味な発表です。
なので、来年は発表内容にフレッシュさが出るように頑張りたいです。
localStorageとJSONの使い方


JSON

```javascript
let string_val = JSON.stringify({age: 26});
let obj_val = JSON.parse(string_val);
```

localStorage

```javascript
localStorage.setItem('name', 'joji');
let name = localStorage.getItem('name');
localStorage.removeItem("name");
```

常に文字列で保存される

```javascript
localStorage.setItem('age', 6);
//文字列で返ってくる
let age = localStorage.getItem('age');
//キャストすると数字になる
let n_age = parseInt(age, 10);
```

ローカルストレージをクリア

```javascript
localStorage.clear()
```
QlikViewのマスタカレンダー作成のベストプラクティス

QlikViewのロードスクリプトはETLツールとしてもとても優れていると思う。
ただ、ひらすらコーディングするしかないからテクニックしだい。
かなり奥深い。

これが定石と思っていた書き方ものが、ある日覆ってしまうことだってある。
今回紹介するマスタカレンダーもそう。

#マスタカレンダー作成のスタンダードなロードスクリプト

Qlik社推奨というか、一般的なマスタカレンダーはこんなふうに書く。

```vimscript:MasterCalendar_old
LET vCustomerCnt =100000;
LET vProductCnt = 10000;
LET vCategoryCnt = 10;
LET vTranCnt = 100000000;
LET vStoreCnt = 10;
LET vDateStart = 43831;
LET vDuration = 365 * 10 + 2;

Transaction:
LOAD RowNo()										as tran_id,
	 Date($(vDateStart) + Floor((Rand() * $(vDuration))),'YYYY/MM/DD') as date, 
	 Ceil(Rand()*$(vCustomerCnt))					as customer_id,
	 Ceil(Rand()*$(vStoreCnt))						as store_id,
	 Ceil(Rand()*$(vProductCnt))					as product_id,
	 Mod(Floor(pow(Rand(),2)*10),3)+1				as unit,
	 Ceil(Sqrt(Rand()*10000000))					as amount
AutoGenerate $(vTranCnt);

tmp_TBL:
LOAD Max(date) as maxdate,
	 Min(date) as mindate
Resident Transaction;

LET varMaxDate = FieldValue('maxdate',1);
LET varMinDate = FieldValue('mindate',1);

MasterCalendar:
LOAD Date($(varMinDate) -1 + IterNo(),'YYYY/MM/DD') as date,
	 Year($(varMinDate) -1 + IterNo())				as year,
	 Month($(varMinDate) -1 + IterNo())				as month,
	 Date(MonthStart($(varMinDate) -1 + IterNo()),'YYYY/MM')				as yearmonth
AutoGenerate 1
While $(varMinDate) -1 + IterNo() <= $(varMaxDate);	 
```
僕はこんなふうに習ってきたし、人にもこの通りに教えてきた。
プリシーディングロードやAutoGenerate、FieldValueなどを教える時にとても良いコードだと思う。

が、データ件数が多い（例えば1億件くらいの）時、

tmp_TBL:
LOAD Max(date) as maxdate,
     Min(date) as mindate
Resident Transaction;

この箇所が、どうしても時間がかかってしまう。
上記のリロード（Transactionが1億件）の場合だと、MasterCalendarの作成に手元のPCでは実に5分28秒もかかってしまう。
内訳は上記のtmp_TBLのLOADのMax(),Min()の処理時間が大半を占めており、MasterCalendar: Load ... は一瞬で終わっている。

#マスタカレンダーのベストプラクティス

先日、素敵なコードに出会った。
[QlikView COOKBOOK: BETTER CALENDAR SCRIPTS](http://qlikviewcookbook.com/2015/05/better-calendar-scripts/)

なんすかこれ？
本当かな？
こんなコード見たことない。

で、実際やってみたら瞬時にMasterCalendarを作成できた。
そのコードがこれ。

```vimscript:MasterCalendar_new
LET vCustomerCnt =100000;
LET vProductCnt = 10000;
LET vCategoryCnt = 10;
LET vTranCnt = 100000000;
LET vStoreCnt = 10;
LET vDateStart = 43831;
LET vDuration = 365 * 10 + 2;

Transaction:
LOAD RowNo()										as tran_id,
	 Date($(vDateStart) + Floor((Rand() * $(vDuration))),'YYYY/MM/DD') as date, 
	 Ceil(Rand()*$(vCustomerCnt))					as customer_id,
	 Ceil(Rand()*$(vStoreCnt))						as store_id,
	 Ceil(Rand()*$(vProductCnt))					as product_id,
	 Mod(Floor(pow(Rand(),2)*10),3)+1				as unit,
	 Ceil(Sqrt(Rand()*10000000))					as amount
AutoGenerate $(vTranCnt);

MasterCalendar:
LOAD tmp_date 										as date,
	 Year(tmp_date)									as year,
	 Month(tmp_date)								as month,
	 Date(MonthStart(tmp_date),'YYYY/MM')			as yearmonth;
LOAD
	Date(mindate + IterNo()) 						as tmp_date,
	maxdate
WHILE mindate + IterNo() <= maxdate;
LOAD min(FieldValue('date',RecNo()))-1 				as mindate,
	 max(FieldValue('date',RecNo())) 				as maxdate
AutoGenerate FieldValueCount('date');
```

結果が素敵、1秒以内で終わった。ほんとに一瞬。
これ考えた人スゴい。
これはマスタカレンダー作成の革命的な出来事だ。
Go言語における構造体とInterfaceの利用

#Go言語における構造体とInterfaceの利用

##環境
go version go1.9.4 
Zorin OS 12.3

##概要
最近、抽象構文木を作るインタプリタの本を読んでいるが構造体にInterfaceを
入れ込んでいる部分で、コードが追いかけられなくなり詰まったので簡単な例を用いて自分のためにここにまとめておく。

###構造体とInterface

作成したのが以下のプログラム。

```golang:testcode
package main

import(
	"fmt"
)

// Animal構造体
// この中にインターフェースのスライスを定義して、その中に他の動物の構造体を入れる
type AnimalStruct struct{
	Animals []Animal
}

//　犬の構造体
type DogStruct struct{
	no int
}

func (d *DogStruct)bark(){
	fmt.Println("わんわん")
}

// 猫の構造体
type CatStruct struct{
	no int
}

func (c *CatStruct)bark(){
	fmt.Println("にゃーにゃー")
}

// Baseインターフェース
type Base interface{
	bark()
}

// Animalインターフェース
type Animal interface{
	Base
}

func main(){
	// ベースとなる構造体を定義
	BaseStruct := AnimalStruct{}

	// 犬の構造体と猫の構造体を生成
	dog := DogStruct{no: 100}
	cat := CatStruct{no: 101}

	// それぞれ追加
	BaseStruct.Animals = append(BaseStruct.Animals, &dog)
	BaseStruct.Animals = append(BaseStruct.Animals, &cat)

	//使ってみる
	BaseStruct.Animals[0].bark()
	BaseStruct.Animals[1].bark()

	// これはできない　Interfaceはメソッドだけ持つ
	// BaseStruct.Animals[0].no
	// BaseStruct.Animals[1].no

	// こうやったら使えるようになる
	fmt.Println(BaseStruct.Animals[0].(*DogStruct).no)
	fmt.Println(BaseStruct.Animals[1].(*CatStruct).no)
}
```

```golang:出力結果
わんわん
にゃーにゃー
100
101
```



構造体の中にInterface型のスライスを定義して、その中に別の構造体のアドレスを入れ込んでいく。
Interface型スライスを定義することによって、ポリモーフィズムを実現している。
また、Interfaceは継承のようなことができる。上のソースコードでいうとBaseとAnimalStructがその関係になる。
Android で近接センサが物体を検出している間だけ画面をオフにする


通話アプリを作成していて、近接センサ (Proximity Sensor) の近くに物体がある時 (電話中にスマホを耳に当てることによって頭が近くにある時など) に画面を消灯させたいという要望があったので、それについて調べてみましたが、案外情報が見つからず苦戦したのでメモします。

検証端末は Android 8.0.0 のみで、アプリの minSdkVersion は 21 を前提としています。

# TL;DR

```kotlin
val powerManager = getSystemService(Context.POWER_SERVICE) as PowerManager
val wakeLock = powerManager.newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, "TAG")
wakeLock.acquire(DURATION_TIMEOUT)
```

`PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK` という Wake lock level を指定して `aqquire` すると、その Wake Lock を握っている間は近接センサが物体を検出すると画面がオフになり、物体がなくなれば画面がオンになるという挙動になります。

通話中にこの挙動を行いたい場合、 DURATION_TIMEOUT にどれくらいの値を指定するかは考えなければなりません。
あまりにも長いと Wake Lock のリリースを忘れていた場合にバッテリーを無駄に消費することになりますし、かといって短ければいいというものでもありません。

数分程度指定しておき、その時間よりも短い時間でタイマーをセットして、その時まだ通話中であれば再度 Wake Lock を取得するという方法がよさそうです。
画面を破棄するタイミングで Wake Lock をリリースするのも忘れてはいけません。

# 試したけどだめだった方法

## Window の LayoutParams を使用する方法

参考: https://stackoverflow.com/q/9561320

```kotlin
window.attributes = window.attributes.apply {
    flags = flags or Window.LayoutParams.FLAG_KEEP_SCREEN_ON
    screenBrightness = 0
}
```

画面が最低限度まで暗くなるだけで、画面はオフにならずまたタッチも無効になりませんでした。

## WakeLock を一瞬取得してすぐに解放する方法

参考: https://stackoverflow.com/a/6757206

```kotlin
val manager = getSystemService(Context.POWER_SERVICE) as PowerManager
val wakeLock = manager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "TAG")
wakeLock.acquire()
wakeLock.release()
```

何も起きませんでした。

# できた方法

## PROXIMITY_SCREEN_OFF_WAKE_LOCK で Wake Lock を取得する

API レベル 21 から使用できる `PROXIMITY_SCREEN_OFF_WAKE_LOCK` という Wake lock level を使用して Wake Lock を取得すると、近接センサが物体を検出している間だけ画面をオフにするという望んでいた挙動を実現できました。
名前もそのままですね。

参照: https://developer.android.com/reference/android/os/PowerManager.html#PROXIMITY_SCREEN_OFF_WAKE_LOCK

> A proximity wake lock does not prevent the device from falling asleep unlike FULL_WAKE_LOCK, SCREEN_BRIGHT_WAKE_LOCK and SCREEN_DIM_WAKE_LOCK. If there is no user activity and no other wake locks are held, then the device will fall asleep (and lock) as usual. However, the device will not fall asleep while the screen has been turned off by the proximity sensor because it effectively counts as ongoing user activity.

リファレンスによると、この Wake Lock は `FULL_WAKE_LOCK` や `SCREEN_BRIGHT_WAKE_LOCK` や `SCREEN_DIM_WAKE_LOCK` とは異なり、デバイスがスリープ状態になることを **妨げません** 。つまりこの Wake Lock を取得していてもデバイスはスリープ状態に入ります。
しかし、後半にあるように、近接センサが物体を検出して画面がオフになっているときは、端末はスリープ状態には **なりません** 。これは近接センサが物体を検出しているということ = ユーザが現在端末をアクティブに使用していると判断できるためです。
dllのconfig


# dllのconfigに関して
調べて分かったことを列挙する。

* dllのconfigの値を変更しても、変更は反映されない。
* dllのconfigを削除しても、exeは実行できる。
* dllにはビルド時の値が設定される。
* 下記の構成の場合には、ビルド時の値 "hello, world." が設定される。

## A (exe)
```csharp: Form.cs
string text = new Lib().GetText();
label1.Text = text;    // hello, world.
```

## B (dll)
```csharp: B.dll.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
            <section name="B.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
        </sectionGroup>
    </configSections>
    <applicationSettings>
        <B.Properties.Settings>
            <setting name="Text" serializeAs="String">
                <value>hello, world.</value>
            </setting>
        </B.Properties.Settings>
    </applicationSettings>
</configuration>
```

```csharp: Lib.cs
namespace B
{
    public class Lib
    {
        public string GetText()
        {
            return Properties.Settings.Default.Text;
        }
    }
}
```

# 変更を反映するには？
exeのconfigにdllのconfigをマージすればよい。
configの値が設定されるようになり、変更が反映される。

AのconfigにBのconfigをマージしたものを下記に示す。

```csharp: A.exe.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
            <section name="B.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
        </sectionGroup>
    </configSections>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.1" />
    </startup>
    <applicationSettings>
        <B.Properties.Settings>
            <setting name="Text" serializeAs="String">
                <value>hello, world. hello, world.</value>
            </setting>
        </B.Properties.Settings>
    </applicationSettings>
</configuration>
```
OculusGoのコントローラーのBackはOVRInput.Button.Backでは取得できない罠

OculusGoコントローラーについている「←」のアイコンが付いたバックボタンですが、これは `OVRInput.Button.Back` **ではありません**。(2018/07/01時点)
実はAndroidの「戻る」ボタンという扱いらしいです。Androidの戻るボタンは`Escape`キーと同じ扱いなので、以下の動くコードのような書き方をしましょう。

環境: Unity 2018.1.5f1 (64-bit) / OculusUtilities(1.26.0 2018/06/20)

### 動かないコード

```C#
if (OVRInput.GetDown(OVRInput.Button.Back)) { /* 戻る処理 */ }
```

### 動くコード

```C#
if (Input.GetKeyDown(KeyCode.Escape)) { /* 戻る処理 */ }
```
CSV を「安全」に Excel に読み込む Go プログラムを書いたー（pipe2excel.exe）

CSV を普通に Excel で開くと下記のような問題が発生する。

* 5/2 が「5/2」でなく、日付と解釈されて「5月2日」になってしまう
* =1+2 が「=1+2」ではなく、計算されて「3」になってしまう
    * 関数まで実行されてしまうので、脆弱性となってしまう

![foo-csv.png](https://qiita-image-store.s3.amazonaws.com/0/29454/0fde3317-17bf-73d5-a64f-2ca7e1a20f10.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/29454/15e759f4-f6ff-1a09-522c-fe19142af693.png)

これを解決するには勝手に変な解釈がされないように、あくまで「文字列」としてセルに貼るプログラムを作ればよろしい。

仕様のイメージとしては「変換プログラムを「送るメニュー」とか、拡張子 CSV に割り当てると、CSVファイルをクリックした時、自動で Excel シートに安全に変換される」というのが望ましい。

拡張子に割り当てる、送るメニューに登録するとなると、スクリプト言語よりは、EXEファイルの方がよい。となると Go言語が適している。

Go言語で開発するとなると、２つのアプローチがある

1. .xlsx ファイルを [xlsx](https://github.com/tealeg/xlsx)、[excl](https://github.com/loadoff/excl)といったライブラリで静的に生成する
2. [go-ole](https://github.com/go-ole/go-ole) を使って、Excel を COM で呼び出して、Excel 経由でシートを作成する

「1.」は速度的に有利だが、テンポラリな .xlsx ファイルを作成してしまう。いきなり独立した .xlsx ファイルではなく、一度内容をチェックしてから、問題ないことを確認してから、ちゃんとした名前で保存する形の方が個人的には望ましく思えた。

ということで「2.」のアプローチを採用した。
（2019.02.24 追記：-o オプションで「1.」のアプローチ、つまり、いきなり独立した .xlsx ファイルを Excel なしに生成が出来るようにした）

で、完成品がこちらに。

* [zetamatta/pipe2excel: Make Pipeline To Excel and send each CSV To Excel cell as a string](https://github.com/zetamatta/pipe2excel)

変換した後、起動した Excel は敢えてそのままに。加工なり、セーブなりはユーザが自分でしてくださいということで（その方が「自分は」使いやすいと思った。もちろん .SaveAs や .Quit も出来るが、余計なお世話感強い）

![foo-xls.png](https://qiita-image-store.s3.amazonaws.com/0/29454/06aff342-d1bb-af7f-3ae3-fb3316143588.png)

* CSV は普通に標準ライブラリ `"encoding/csv"` で読み込む
   * ただし、そのまま読み込むと、１行あたりの項目数が変化した時に、csv.ErrFieldCount エラーになるので、<del>それだけは無視するようにする。</del> `("encoding/csv".Reader).FieldsPerRecord` に -1 をセットして、項目数チェックを無効にした（0.4～）
* CSV が `"unicode/utf8"`.Valid で UTF8 であれば UTF8 で、さもなければ現在のコードページ(日本語環境なら cp932=ShiftJIS)と解釈する
* セルにテキストを貼り付ける時、いきなりセルの `.Value` プロパティーに代入するのではなく、直前に `.NumberFormatLocal`プロパティーに `"@"` を設定して、セルの型を文字列にする。
   * ただし、あきらかに数値として解釈してさしえなさそうなテキストが文字列として設定してあると、Excelの警告マークがうるさいし、Excel自体で数値として扱いたい時に困るので、正規表現 `/^[1-9]\d*(\.\d*[1-9])?$/`と一致する場合は数値扱いとする（`.NumberFormatLocal`プロパティーに `"0_"`を設定する)
* 標準入力経由でも入力できるようにした

```
C:\> type foo.csv | pipe2excel
```

* CSVファイル名は複数指定できて、その場合は１ファイル名→１ワークシートとするようにした（ワークシート名はファイル名由来とした）

```
C:\> pipe2excel foo.csv bar.csv
```

いやー、しかし、Windows の分散オブジェクト(COM)の仕組み、それを操作する [go-ole](https://github.com/go-ole/go-ole) ライブラリ、Go言語の標準ライブラリ群の充実度はすばらしいぞ、デミウルゴス

以上
Linuxでcwnd(輻輳ウィンドウサイズ)、rwnd(受信ウィンドウサイズ)の初期値を変更する

# 概要
『ハイパフォーマンスブラウザネットワーキング』を読んでいて、cwnd(輻輳ウィンドウサイズ)、rwnd(受信ウィンドウサイズ)という単語がでてきた。

気になったので、それぞれについて調べた。Linuxでは初期値（initcwnd, initrwnd）の変更が可能とのことで、その方法を調べ、変更してみた。initrwndについては、それが適用されていることを確認した。initcwndは確認が面倒だったのでやっていない。

# 環境
 * Ubuntu 17.10

# TCPのフロー制御、輻輳制御
cwndとrwndはTCPのフロー制御、輻輳制御と関わる。これについては、『3分間NetWorking』の記事がわかりやすい。


フロー制御
http://www5e.biglobe.ne.jp/~aji/3min/41.html

輻輳制御
http://www5e.biglobe.ne.jp/~aji/3min/42.html

英語だが、この記事も良い。
https://blog.stackpath.com/glossary/cwnd-and-rwnd/

# rwndについて
受信ウィンドウサイズ（receive window size）のこと。TCPのフロー制御で用いられる。

TCPでは通信中、お互いの受信ウィンドウサイズを広告しあっている。

# cwndについて

輻輳ウィンドウサイズ（congestion window size）のこと。輻輳制御に用いられる。

輻輳ウィンドウサイズとは、データ送信側のウィンドウサイズの制限。通信相手のホストには送られず、送信側ホスト内部で管理される。

実際の通信では、rwndとcwndの小さい方の値が、相手からACKを受け取る前に続けて送信できるデータ量として用いられる。

# initrwndとinitcwnd

rwndとcwndの初期値のこと。設定変更が可能なため、変更してみる。

## 確認、変更

`ip route`で確認、変更可能。`ip route`でinitrwnd、initcwndが表示されなければ、デフォルトの設定が使われている。

デフォルトの設定については、ipコマンドのmanを見るのがよい。
https://www.systutorials.com/docs/linux/man/8-ip-route/

変更も`ip route`から行う。

```
# "..."の部分は、ip routeで出てくる設定をいれればよい
ip route change ... initcwnd 10 initrwnd 10
```

まとめて設定するなら、このワンライナー。

```
ip route | while read p; do sudo ip route change $p initcwnd 10 initrwnd 100; done
```

このサイトから借用した。https://blog.cloudflare.com/optimizing-the-linux-stack-for-mobile-web-per/

initcwndの値は、`ss`からも確認できる。

```
$ ss -nli | grep cwnd
	 cubic cwnd:10        
```

# パケットキャプチャで確認する（rwnd）
Wiresharkを使用し、initrwndの設定変更による変化をみる。なお、cwndは相手ホストに広告されずパケットからは観察できない。

## 環境構築と設定
AWSのEC2にApacheをインストールし、通信の相手側のホストにした。クライアントは、手元のPCのWebブラウザ。
EC2のホストにinitrwndを設定する。

```
$ ip route | while read p; do sudo ip route change $p initrwnd 10; done
$ ip r
default via 172.31.0.1 dev eth0 initrwnd 10
169.254.169.254 dev eth0 scope link initrwnd 10
172.31.0.0/20 dev eth0 proto kernel scope link src 172.31.15.20 initrwnd 10 
```

ここでは、initrwndとして`10`を設定している。MSSにこの値を乗算したものがrwndの初期値として使われるようになる。
MSSは、MTUからTCP/IPヘッダ(40byte)をマイナスした値となる。
http://www.infraexpert.com/info/5adsl.htm

MTUは`ip a`や`ifconfig`で確認可能で、今回は1500バイトとなっていた。（一般的に1500バイト）
したがってMSSは1460となり、initrwndは14600となる。（はず。）

この状態で、ブラウザからEC2のApacheにアクセスする。

実際に使われたrwndの初期値は、TCPの3ウェイハンドシェイク時の"SYN ACK"で返されるウィンドウサイズで確認が可能。
Wiresharkでは、Window size value（もしくはCalculated window size）の項目を確認する。

## 結果

initrwndの変更前は、28960だった。そして設定変更を行い実行すると、14480となっていた。
想定は14600のため、`12 * 10`の差がある。

この原因は、深く調べたわけではないが、TCPのオプションフィールドが影響していると考えられる。TCPのオプションフィールドの分だけ、MSSは小さくなる。
（参考：http://tonetsutomu.com/tone/node/88）

以上により、initrwndの変更が、実際に適用されていることがわかった。

## 余談

* initrwndを100に設定しても、実際使われる値は43440となり、意図した結果にならなかった。システムで最大値が設定されていると予想される。
* initcwndの変更についても、いずれ確認したい
仕様変更時に変更量を減らせるアップキャスト（Java）

#アップキャストについて
###アップキャストとは
アップキャストとは、サブクラス（子クラス）が暗黙的にスーパークラス（親クラス）として振る舞うのを可能にする機能のことだ。

###使うことで何が実現できるのか
開発において、仕様変更は付きものである。
そういった仕様変更時に、アップキャストを利用してプログラムを書いていれば、変更に伴うプログラムの書き換えを最小限に止めることができるのだ。

プログラムから例を示そう。

###ソースコード
```Main.java
public class Main{
  public static void main(String[] args){
    Life_form life_form = new Life_form();
    life_form.makeSound();

// アップキャスト　
    life_form = new Cat();
    life_form.makeSound();
  }
}
```

```Life_form.java
//親クラス　
public class Life_form{
  public void makeSound(){
    System.out.println("???");
  }
}
```

```Cat.java
//子クラス
public class Cat extends Life_form{
  @Override
  public void makeSound(){
    System.out.println("にゃあ");
  }

  public void catPunch(){
    System.out.println("ネコパン");
  }

}
```

```Dog.java
//「仕様変更よろしく」の項目で使用します。
public class Dog extends Life_form {
  @Override
  public void makeSound(){
    System.out.println("クゥーン！");
  }

  public void dogAttack(){
    System.out.println("かみつく");
  }
}

```

###Life_formクラスとCatクラスについての説明
・Life_form（いきもの）クラスはmakeSound関数を持っている。
・CatクラスはLifeformクラスを継承しており、makeSound関数を再定義（オーバーライド）している。
・また、Catクラスは親クラスにはない限定の関数、catPunch関数を持っている。

なお、Dogクラスは以下の項目、「仕様変更よろしく」で使用する。作りはCatクラスと同じで、makeSoundをオーバーライドしており、Dogクラス限定のdogAttackを持っている。

###Mainクラスの説明
Mainクラスで注目して欲しいのは
```life_form = new Cat();```
としているところだ。

親クラスへの子クラス代入。
これがアップキャストである。


###実行結果
実行結果は以下のようになる。
<img width="500" alt="スクリーンショット 2018-07-01 10.40.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/219573/89c41c8e-9b39-8069-e2f7-00868dd978f7.png">
少し見にくいが、アップキャストしたことで、CatインスタンスのmakeSound()がlife_formから呼ばれていることがわかると思う。
つまり、```life_form = new Cat();```した後のlife_formの実体はCatのインスタンスなのである。

###仕様変更よろしく
さて、このプログラムのCatインスタンスをDogインスタンスに変えてくれと頼まれた場合、変更箇所は次の一点で済む。

```life_form = new Cat();```
->```life_form = new Dog();```

もしアップキャストが機能として存在していなかったなら、変更は次のようになるだろう。

1個目
```life_form = new Cat();```
->```Dog dog = new Dog();```

2個目
```life_form.makeSound();```
->```dog.makeSound();```

インスタンス生成をDog型でする必要がまずでてきて、さらに使用するところでもdogを使わなくてはいけなくなる。


そんなに変わらないじゃないかと思うかもしれない。
だがそれは、これがきわめて小規模なプログラムだからだ。
大規模な開発になればなるほど、変更点が増え、変更量が増加する。

仕様変更に強いプログラムを作ることは重要だ。そして、javaにはそれを実現するための機能がある。
うまく使っていきたい。
Restart current shell

# Restart current shell
```
$ exec "$SHELL"
```

## ~/.bash_profile上fish起動している場合
例）

```config
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi

# Android setting
export ANDROID_HOME=$HOME/Library/Android/sdk
export PATH=$PATH:$ANDROID_HOME/tools
export PATH=$PATH:$ANDROID_HOME/platform-tools

# local node_modules path
export PATH=$PATH:./node_modules/.bin

# local $LANG
export LANG=ja_JP.UTF-8

# aws-sam-cli pip installer setting
## Find your Python User Base path (where Python --user will install packages/scripts)
USER_BASE_PATH=$(python -m site --user-base)
## Update your preferred shell configuration
export PATH=$PATH:$USER_BASE_PATH/bin

# fish起動 ※最後に実行
fish
```
### Restart current shell
```
$ source ~/.bash_profile
```
相性占いを作ってみた

#相性占い
自分と相手の生年月日を入力すると、相性がわかるWebサイトがよくあるので適当に生年月日をたくさん入れて試してみた。
しかし、テンプレメッセージと高めのパーセンテージしか出てこなかったので自分で作ってみた。
占いは古典的な方がいいと思ったのででC言語で書いた。

https://github.com/itosancom/Synchronize-point

#乱数を発生させて0-100までの値にする
出てきた値の100の剰余を取ると100％の値が出てくる。
ただ乱数を出すのも面白くないので、シード値をお互いの値を足してキリのいい256で割った。

#いいところ
・乱数にすべてを任せるのでマジで運
・クソ短いプログラムなので保守性に優れている
・割と当たる

#よくないところ
・厳しい。10％台とかもザラに出てくる。
・つたない英語だからどこかに文法ミスとかスペルミスがある。
・ふざけてエグい値を入れられるとバッファオーバーフローを起こす。(セキュリティホールになりかねない)

#感想
自分の仲のいい人は割とパーセンテージが高かったので嬉しかった。
生年月日を入力するのがやや面倒だった。
Pandas DataFrame の [] (__getitem__) にリストを与えたときの挙動

Pandas の DataFrame には苦手意識がある。あまりにインターフェイスが複雑すぎてわけがわからない。特に一番複雑なのは `[](__getitem__)` 。ドキュメントがまともにない。

やはり同じようなことを考えていた人が stack overflow にいた。

[Pandas DataFrame: complete spec for \_\_getitem__()?](https://stackoverflow.com/questions/28009873/pandas-dataframe-complete-spec-for-getitem)

結局、ソースコードを読め、ということらしい。普通に Python で書いてあるので読めることは読める。`frame.py` というファイルに書いてある。私が一番気になるのは、 `__getitem__` にリストを与えたときの挙動だ。`__getitem__` から呼び出されている次のメソッドに答えがあった(pandas のバージョンは 0.22.0)。

```python
    def _getitem_array(self, key):
        # also raises Exception if object array with NA values
        if com.is_bool_indexer(key):
            # warning here just in case -- previously __setitem__ was
            # reindexing but __getitem__ was not; it seems more reasonable to
            # go with the __setitem__ behavior since that is more consistent
            # with all other indexing behavior
            if isinstance(key, Series) and not key.index.equals(self.index):
                warnings.warn("Boolean Series key will be reindexed to match "
                              "DataFrame index.", UserWarning, stacklevel=3)
            elif len(key) != len(self.index):
                raise ValueError('Item wrong length %d instead of %d.' %
                                 (len(key), len(self.index)))
            # check_bool_indexer will throw exception if Series key cannot
            # be reindexed to match DataFrame rows
            key = check_bool_indexer(self.index, key)
            indexer = key.nonzero()[0]
            return self._take(indexer, axis=0, convert=False)
        else:
            indexer = self.loc._convert_to_indexer(key, axis=1)
            return self._take(indexer, axis=1, convert=True)
```

`com.is_bool_indexer(key)` で key が bool（真偽値）かどうかチェックしているのが味噌。
要するに、

- bool なら、行のセレクタ
- bool 以外なら、列のセレクタ

として動作しているということだ。

だから、

```python
df[df.x == 1]
```

なら、「カラムx が 1 である行を抜き出して DataFrame として返す」し、

```python
df[['x']]
```

なら、「カラムxだけを抜き出して DataFrame として返す」という動作になる。

同じようなことは、`loc` を使ってもできるので、動作が曖昧な `__getitem__` はあまり使わないほうがいいのかもしれない。ただ、簡潔に書けるのは魅力的なので、用量を守って使用すればいいのかな。
【Ruby】ブロックの小さなサンプルメモたち

# サンプル１

```ruby:test.rb
def test1
  p "test1"
end

test1

test1 do
  p "test1-block"
end

#######
def test2
  p "test2"
  yield
  yield # 複数回も可能
end

# test2  と実行するとエラー `test2': no block given (yield) (LocalJumpError)

test2 do
  p "test2-block"
end

###### 引数をブロックに渡す
def test3
  p "test3"
  yield "こんにちは"
end

test3 do |text|
  p "1"
  p text
  p "2"
end
```

```zsh:実行結果
"test1"
"test1"
"test2"
"test2-block"
"test2-block"
"test3"
"1"
"こんにちは"
"2"
```

# サンプル2（実行順序）

```ruby:test2.rb
class Test

  def initialize
    p "1"
    yield self if block_given?
    p "7"
  end

  def self.test
    self.new() do |core|
      p "2"
      yield core if block_given?
      p "5"
      core.run
      p "6"
    end
  end

  def run
    p "run"
  end
end

#test = Test.new

Test.test do |test|
  p "3"
  p test
  p "4"
end
```

```zsh:実行結果
"1"
"2"
"3"
#<Test:xxxxxxx>
"4"
"5"
"run"
"6"
"7"
```
lodash の debounce や throttle で簡単に負荷対策

JavaScript を使っているなら [lodash](https://lodash.com/docs/) は大変便利なのですが、関数が多すぎてどれ使ったらいいのか解りづらいのが難点です。

ここではその中でも連続する呼び出しを無視してくれる `debounce` と `throttle` という負荷対策用の関数を紹介します。また、この２つの似た関数がどう違うのかも説明します。

連続する呼び出しを無視したい、とはどういうことか
====

たとえば、mouse move イベントはマウスの座標が動くたびにすごい頻度で発生します。これに応じて画面を同期させたり、サーバに問い合わせしてしまうと大変なので一般的には0.2秒とかマウスが止まったら同期や問い合わせが走るように実装するかと思います。

別の例でいえば、textbox のインクリメンタルサーチ実装で、文字打つたびにサーバ問い合わせしたら大変なので、入力がある程度止まった時点で問い合わせするのが一般的です。

この処理をすごく簡単に実装できるのが [debounce](https://lodash.com/docs/4.17.10#debounce) です。

[debounce](https://lodash.com/docs/4.17.10#debounce) の使い方
=============

```js:元の処理
$panel.on('mousemove', function () {
  // 画面同期 or サーバ問い合わせ (ただし高頻度で呼ばれる)
});
```

これを下記のように `_.debounce(関数, wait時間)` で囲むだけで実現できます。

```js:マウスが動いてる限りは呼ばない
$panel.on('mousemove', _.debounce(function () {
  // 画面同期 or サーバ問い合わせ (ただし 0.2 秒動きが止まったら呼ばれる)
}, 200));
```

また、下記のように `maxWait` を指定することで、マウスが動いてても一定秒に 1 回は最低限呼ばれるようにもできます。

```js:1秒に1回は最低呼ばれるように
$panel.on('mousemove', _.debounce(function () {
  // 画面同期 or サーバ問い合わせ
}, 200, { maxWait: 1000 }));
```

`debounce` の注意点
=======================

`_.debounce()` は自身では実行せず、関数を返すということに注意してください。上記のようにコールバックをラップするのにはちょうど良いですが、通常処理の中に `setTimeout()` 的なノリで記述すると実行されなくて悩むことになるかも。
（もし発火させたいなら、`_.debounce(～)()` のように末尾に `()` を付ければよいでしょう。）



似た関数 [throttle](https://lodash.com/docs/4.17.10#throttle) があるけど？
=======================

[throttle](https://lodash.com/docs/4.17.10#throttle) は [debounce](https://lodash.com/docs/4.17.10#debounce) と似ていますが、使い道が若干異なります。`throttle` は、一定時間に１度しか実行されないようにするためのものです。

たとえば、データに変更があるたびに定期的にサーバへと同期させたいとします。とはいえ、スペック的に１秒に１回以上は同期したくないという場合に `throttle` の出番となります。

もしこれを、`debounce` でやってしまうと、更新がある限り永遠にサーバに同期されません。`maxWait` を指定した場合はほぼ同じ動きにはなりますが、`throttle` では最初に１度実行されるという点が大きな違いとなります。

`throttle` は、まず１回実行し、その後一定期間、呼び出しを監視し、呼び出しがあれば最後の呼び出しだけを実行する（呼び出しがなければその後は何もしない）というものです。最初に１回実行するので後続呼び出しが無い場合も効率的です。

```:こういう動きになります
0s 呼び出し1   呼び出し1 を実行する
   ↓
   呼び出し2(実行されない)
   ↓
   呼び出し3(実行されない)
   ↓
   呼び出し4
   ↓
1s            呼び出し4 を実行する
```

`debounce` が一定時間止まったら実行させる、という考え方なのに対して、`throttle` は一定時間に1回というペースを守らせるという考え方です。


[throttle](https://lodash.com/docs/4.17.10#throttle) の使い方
=============

```js:元の処理
function onChangeData (newData) { // データが変更されるたびに呼ばれる
  // サーバへの同期処理
}
```

これを下記のように `_.throttle(関数, wait時間)` で囲むだけで実現できます。

```js:1秒に1回というペースを守らせる
var _changeData = _.throttle(function (newData) {
  // サーバへの同期処理
}, 1000);

function onChangeData (newData) { // データが変更されるたびに呼ばれる
  _changeData();
}
```


まとめ
======

- [debounce](https://lodash.com/docs/4.17.10#debounce): 一定時間止まったら実行させる。
- [throttle](https://lodash.com/docs/4.17.10#throttle): 一定時間に1回というペースを守らせる。


lodash関連の記事
======

- [lodashの配列/オブジェクト系関数の索引を作ってみた](https://qiita.com/waterada/items/62b32930d3c3668ff3d2)
- [lodash の path を使う関数でオブジェクト操作が便利になる](https://qiita.com/waterada/items/8c57f37d3decdbc583fe)
- [lodash の forEach/map/reduce 系の関数を紹介](https://qiita.com/waterada/items/22ef4c618050ea766137)
- [lodash ちょっとマニアックだけど便利な関数](https://qiita.com/waterada/items/63eb186e2150d38bb6ed)
- [lodash の debounce や throttle で簡単に負荷対策](https://qiita.com/waterada/items/986660d31bc107dbd91c)
お約束のLチカ obniz

やっとLEDなど少し手に入ったので、LoTお約束のLチカをやってみる。

こういうのです。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">抵抗入りLEDが届いたので、obnizのサイトのレッスンにある「LEDをつける」をやってみる。<br><br>LEDを刺して、obniz IDをサンプルコードに書いてから「Test Open」ボタンを押すだけ超簡単。 <a href="https://t.co/jFzepVScM0">pic.twitter.com/jFzepVScM0</a></p>&mdash; 高橋登史朗 ( T blockchain T ) (@toshirot) <a href="https://twitter.com/toshirot/status/1012333526757150722?ref_src=twsrc%5Etfw">2018年6月28日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>



Obnizドキュメントにせっかくサンプルがあるので、まったくそのままやってみることにします。

ドキュメントにあるソースの[Test Open]ボタンを押すだけで実機を即座に動かして試せるのです。

このハードルの低さもObnaiz！

LEDは今回は秋月電子の抵抗内蔵５ｍｍ青色ＬＥＤ（５Ｖ用）　ＯＳＢ５ＳＡ５Ｂ６４Ａ－５Ｖ（１０個入）<a href="https://t.co/5dQo5XigWm">https://t.co/5dQo5XigWm</a>というのを買いました。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ここで使った抵抗は秋月のコレ<br><br>抵抗内蔵５ｍｍ青色ＬＥＤ（５Ｖ用）　ＯＳＢ５ＳＡ５Ｂ６４Ａ－５Ｖ（１０個入）<a href="https://t.co/5dQo5XigWm">https://t.co/5dQo5XigWm</a></p>&mdash; 高橋登史朗 ( T blockchain T ) (@toshirot) <a href="https://twitter.com/toshirot/status/1012336060985008128?ref_src=twsrc%5Etfw">2018年6月28日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

抵抗なしだとLEDが簡単に壊れてしまったりするのですが、抵抗入りだとそれを接続する手間も無くなるので便利です。


LEDの刺し方は[本家](https://obniz.io/doc/lessons_turning_on_led)のがわかりやすいので参照しておきますね。 

![](https://obniz.io/sdk/parts/LED/led.jpg)

上記を見ながらLEDを刺し終わったら、

まずこのページの「LEDを点灯」のソースを開いてみます。

https://obniz.io/doc/lessons_turning_on_led

本家のドキュメントの[LEDを点灯](https://obniz.io/doc/lessons_turning_on_led)を開いて下記のようにobniz IDをソースに書いたらボタンを押します。

![](https://ccchart.com/test/obniz/img/led.png?1)

すると点灯します！


<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ももは、フリーWiFiだった。obnizのパスワード入力もいらない極楽テスト環境だった。 <a href="https://t.co/aqiVoJTZti">pic.twitter.com/aqiVoJTZti</a></p>&mdash; 高橋登史朗 ( T blockchain T ) (@toshirot) <a href="https://twitter.com/toshirot/status/1012575168449818628?ref_src=twsrc%5Etfw">2018年6月29日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

これをテストした田舎のカフェはFree WiFiで、パスワード入力がいらない環境でした。それだと、なんと最初のWiFi接続のSSIDを選んだあとパスワードは入れずに[END]を押すだけでつながります。

まぁセキュアなサイトへ接続する場合は全くお勧めしませんが obniz 簡易テスト環境としては超楽かも。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">とりまobnizにLED6個刺してみる。<br>どこに刺してもOK。 <a href="https://t.co/PRQwIic9uS">pic.twitter.com/PRQwIic9uS</a></p>&mdash; 高橋登史朗 ( T blockchain T ) (@toshirot) <a href="https://twitter.com/toshirot/status/1012578883932078081?ref_src=twsrc%5Etfw">2018年6月29日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">この時、obnizのディスプレイにはどのPINが今anodeなのか教えてくれてる。 <a href="https://t.co/76Wi1oCBCw">pic.twitter.com/76Wi1oCBCw</a></p>&mdash; 高橋登史朗 ( T blockchain T ) (@toshirot) <a href="https://twitter.com/toshirot/status/1012579379333873665?ref_src=twsrc%5Etfw">2018年6月29日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>