OmniAICreator/Qiita-1.07M huggingface dataset:
php-master-changes 2018-08-02

# 2018-08-02
## bohwaz: Add \PDO::SQLITE_ATTR_READONLY_STATEMENT
- https://github.com/php/php-src/commit/6f9ebe677bf31d0c64046f18e6b0ac75340cb93e
- ext/pdo_sqlite の機能追加
- PDOStatement::getAttribute() に渡すフラグとして使う
- 結果は sqlite3_stmt_readonly() の返り値からとられ、プリペアドステートメントが DB の内容に直接変更を及ぼさないことを示す

## carusogabriel: Give a reason why the test was skipped
- https://github.com/php/php-src/commit/dc4e47710bbdab061f82d2e1c67a9de53566fc11
- ext/intl のテストケーススキップ時、スキップの理由を出力するようにした
- 以前に他の拡張でも同様の対応を入れていたみたい
    - https://github.com/php/php-src/commit/c93aba042f8923de9d0078a769f14d8c13016476

## carusogabriel: Remove invalid SKIPIF sections
- https://github.com/php/php-src/commit/7f9e10f5396fbe746dd688ad977a3a7a42849bb6
- 無効な SKIPIF セクションの削除
- phpt のテストケースを何らかの条件でスキップする際に、SKIPIF セクションというのが使われる
- https://qa.php.net/phpt_details.php#skipif_section
- 当該テストケースでは一瞬何故不要なのか分からなかったけれど、よく見ると指定クラス名が……

## carusogabriel: Make test run on non zts builds
- https://github.com/php/php-src/commit/1fe59810fe21bff3aaa21eaaa6027fecf3eba2f5
- 非 ZTS でもテストが走るよう修正
- 修正へ特に反対というのではないけれど、https://bugs.php.net/bug.php?id=65947 を見るとこれ ZTS 版だけで起きていたバグ修正へのテストケースで、元コードはその意図を表したものではあった筈、というのは少し気になる

## cmb69: Create and expose php_sys_symlink() and php_sys_link()
- https://github.com/php/php-src/commit/c9861bd7a974ef1555395b879c1035a0bbc12ef1
- 処理系の内部 API として php_sys_symlink() と php_sys_link() をマクロとして用意
- POSIX 環境では単に symlink() と link() に、Windows では Windows 用の同等品実装へ展開
- link.c / link_win32.c を統合したいらしい

## Majkl578: [ci skip] Fix wrong dash character in UPGRADING
- https://github.com/php/php-src/commit/196e5f0e06fa08ded096c3e8ba9470d70a16661e
- UPGRADING で、コマンドラインプションの指定例で通常のハイフンマイナス（U+002D）のかわりに en ダッシュ（U+2013）を入れてしまっていたのを修正
- -– がちゃんと -- になった

## weltling: Enable inline reader cache
- https://github.com/php/php-src/commit/309ae357735ea273c76e5ec4a71c3e13facb0258
- VC++ でのビルド時のコンパイルオプションを追加
- Inline Reader Cache はコレに載ってる奴かな
    - https://blogs.msdn.microsoft.com/vcblog/2018/01/04/visual-studio-2017-throughput-improvements-and-advice/
- VC++ は通常はインライン化の際、最適化後のコードをメモリにキャッシュしてそれをコピーして展開していく作りではなく、ディスクから最適化前のコードを読み直して展開する
- __forceinline 多用でコンパイルが遅くなる
- Inline Reader Cache はこれをメモリにキャッシュする版の挙動に切り替えるもの
- コンパイル時のメモリ消費量が上がるかわり、コンパイル速度は上がる
ssh接続先としてのdockerコンテナ作成

たまにsshが必要なツールを使うときにコンテナに繋ぎたいということありますね
それ用のdockerイメージと接続までの流れのメモ

## dockerイメージの作成

CentOS7でやる

```
FROM centos:centos7


RUN yum -y update && yum clean all
RUN yum install -y which
RUN yum install -y wget
RUN yum install -y tar
RUN yum install -y vim
RUN yum install -y git
RUN yum -y install openssh-server openssh-clients

RUN mkdir  ~/.ssh \
    touch  ~/.ssh/authorized_keys \
    chmod 600  ~/.ssh/authorized_keys


CMD /bin/bash
```

vimとかgitとか入れてるのは趣味、build遅くなるので無くても大丈夫

イメージのビルド　

```
docker build -t centos7ssh ./
```


## docker runからssh設定まで

まずはssh接続先のコンテナを起動

```
docker run --privileged --rm -d -p 2222:22 -p 5000:80 --name centos7sshcontainer centos7ssh /sbin/init
```


次にMacやWinなどのローカルマシン上でsshキー作成
キーの名前とかは好きに付けてください
ssh試したい度に何回も作るのは面倒なので`~/.ssh/local_container_id_rsa`とか作っといて使い回すといいんじゃないでしょうか

```
ssh-keygen -t rsa -b 4096
```

生成された`local_container_id_rsa.pub`の中身をコピーしてコンテナ内の`~/.ssh/authorized_keys`にペーストします

コンテナ接続コマンド

```
docker exec -it centos7sshcontainer bash
```

ローカルマシンのssh configを編集してコンテナへの接続情報を追記

```
vim ~/.ssh/config
```

```
Host centos7ssh
    HostName 0.0.0.0
    User root
    Port 2222
    IdentityFile ~/.ssh/local_container_id_rsa
```

## ローカルマシンからssh接続

```
ssh centos7ssh
```

入れるはず

不要になったらコンテナをstopしておく(削除も同時に行われる)

```
docker stop centos7sshcontainer
```


## 注意
sshした後1度コンテナを破棄して同じようにコンテナを作成して接続しようとするとknown_hostsに同じのあるぞと言われるので`~/.ssh/known_hosts`の`[0.0.0.0]:2222`から始まる行を削除してからsshログインを実行すると入れる

### 参照
https://qiita.com/3104k/items/16102a64fb1bae6665af
VSCodeのDocker接続先をVagrantで起動したDockerサーバにする

Docker Toolbox使った方がいいんだろうけど、あえてやる

# 準備
## vagrant-docker-composeプラグインをインストール
```
vagrant install vagrant-docker-compose
```

## Vagrantfileを用意する
```ruby
Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/trusty64"
  config.vm.network "forwarded_port", guest: 2375, host: 2375, host_ip: "127.0.0.1"
  config.vm.provision :docker
  config.vm.provision :docker_compose
  config.vm.provision "shell", inline: <<-SHELL
    service docker stop
    nohup dockerd -H 0.0.0.0:2375 > /tmp/nohup.out 2>&1 &
  SHELL
end
```

## Dockerサーバーを立ち上げる
```
vagrant up
```

## （確認用に）Dockerコンテナを起動
```
vagrant ssh -- sudo docker -H 127.0.0.1:2375 run hello-world
```


# VSCodeのDocker設定
設定画面を開き`docker.host`で検索。
以下のように設定する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/183819/0e5180df-4f56-6b04-ce1f-396558a77548.png)

Dockerメニューを開くと、先ほど起動したDockerイメージとコンテナが表示される。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/183819/396d0b4c-b9dd-6a07-449c-899d41b18ae6.png)
右クリックで消したりできる
forkしたリポジトリを更新する方法

<h1>背景</h1>
チーム開発でリポジトリをfork(自分のリモートのgithubにリポジトリをコピー)することになりましたので実行したコマンドをまとめました。:disappointed_relieved:

<h1>やったこと</h1>
1. fork対象のgithubのリポジトリを自分のリモートgithubにfork
1. ローカルに、forkした自分のリポジトリをclone(ダウンロード)
1. fork元を自分のgithubのリポジトリに設定
1. 差分をとり自分のリモートリポジトリにpush

<h2>1. fork対象のgithubのリポジトリを自分のリモートgithubにfork</h2>
githubにforkボタンがあるのでそこをクリック。
![HVzKW8orNHjmv641533220896_1533220990.png](https://qiita-image-store.s3.amazonaws.com/0/165196/1cc65279-8ac3-280c-0fe0-f054d7903d12.png)

<h2>2.ローカルに、forkした自分のリポジトリをclone(ダウンロード)</h2>
#### 自分のリポジトリのclone or downloadボタンの urlをコピペしても良い（下記と同じになるはず)
```bash
$ git clone git@github.com:(自分のユーザ名)/(フォークしたいリポジトリ.git)
```

![ruby_quest__and_ZLLRb0PBucRAulz1585578227_1585578366_png.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165196/7de078b2-53ef-e6b0-7ee8-8fc3ddacb915.png)


<h2>3.fork元を自分のgithubのリポジトリに設定</h2>
ここら辺からこちらを参考にしました。:bow_tone1:
https://chaika.hatenablog.com/entry/2015/04/01/175219

fork元リポジトリをgitのremoteコマンドで自身のリモートリポジトリへ登録

```bash
git remote add root_branch git@github.com:(Fork元のユーザ名)/(フォークしたいリポジトリ.git)
```
登録されたか確認

```bash
git remote -v
```

<h2>4.差分をとり自分のリモートリポジトリにpush</h2>
fork元リポジトリの内容を取得する。
今は自身のリモートリポジトリにfork元リポジトリがあるためfetchでリポジトリから変更履歴を取得しましょう。

```bash
git fetch root_branch
```

取得したfork元リポジトリを自身のローカル上のブランチにマージ(今回はmasterブランチに追加しました。)

```bash
git merge root_branch/master
```

最後にリモートのブランチに変更を反映しましょう

```bash
git push origin master
```

<h1>まとめ</h1>
自分のリモートリポジトリ(github上に上がっているリポジトリ)にfork元リポジトリを登録し、ローカル上でmerge（差分修正）することで二つのリポジトリの差分を取ることができる。:thinking:
PythonとUSB-RS485の変換器を用いてDMX信号を制御


# はじめに

~~目的はタイトルの通りですが，タイトルの通りまだうまく行っていないので経験者の方にアドバイスをお願いしたいです。~~
n_takeshiさんのご助言により動作確認しました！ありがとうございました！

- DMX信号をPython（またはC）で制御したい
- Windows環境（Unixでも根幹は同じと思う）

## E社の製品との比較

お金がある人はまず，ENTTEC社などの整備された商品を買うべきです。
あちらはもっと手軽に制御ができます。

https://github.com/c0z3n/pySimpleDMX

後ほど，ENTTEC社の製品を買って試しましたがPython用のLibraryは試せませんでした。
なにかセットアップ手順が欠けてたのかな？

## 関連記事
上記のちゃんとしたパッケージはべらぼうに高く（数万円くらい），これを手作りする需要は結構あります。

https://kizaihan.jp/?p=199
https://qiita.com/Ina3/items/f88a584d2011e99fc7ed

実はDMXはRS485というRS232の上位互換的なシリアル通信の規格の一部であるのでUSB-RS485変換器で自作できるという寸法のようです。
**今回はそれを用いてプログラムで制御したい**というのが悩ましいところなのですが…

# DMX信号とは

DMX信号というものの仕様について述べます。
以下のサイトにあるように，DMX信号はRS485の規格を用いたシリアル通信の亜種だと思って良さそうです。
http://www.tamatech.co.jp/tamada/benkyo04.php

![画像](http://www.tamatech.co.jp/tamada/dmx1.gif)

構成としては，

- 88us以上のBreak（LOW）信号
- 8us以上のMAB（High）信号
- 本体のデータ
- 0～1秒の休止

となっているらしいです。**以上**というのが曲者でこれが明確に仕様として決定されておらず，機器間の相性という問題が生じる原因となっております。

また，本体となる通信データに関しては，

- 250kbpsのBaudrate
- スタート1bit（Low）
- ストップ2bit（High）

と決まっております。

# PySerialを用いたDMX信号もどきを作る挑戦

このように仕様さえわかってしまえばArduinoなどで自作できるわけですが，
https://qiita.com/Ina3/items/56a89c3cf8958bb6a0f8
やっぱり汎用PCで組んで制御したいです。

最近はもっぱらPythonを使ってプロトタイプ作成をしているのでPythonでこれを実現しようとした試みが本記事です。（上手く行っていないが）

プランとしては

- 接続を確立
- 通信を88us以上BreakStateにしてLowを送る。
- その後BreakStateを解除して8usの間Highを送る。
- 512chのデータを整形して送る。

となっています。[レファレンス](https://pyserial.readthedocs.io/en/latest/pyserial_api.html)とにらめっこしながら進めます。

## 8/2 Trial ：失敗
ここでの失敗の原因はスタートビット0x00を忘れていたことでした。
n_takeshiさん，ご助言どうもありがとうございました。

## 8/3 Trial：成功
データを512byteとするとスタートビットを含めて513byte送る必要があるのでデータサイズを変更します。

### １．接続を確立

シリアルポートへの初期接続時にバイトサイズやストップビット，baudrateを設定します。


```python
import serial
import time
import numpy as np

#start serial
ser = serial.Serial('COM8',baudrate=250000,bytesize=8,stopbits=2)
```

### ２．データ作成
みんな大好きnumpyでデータを作成します。（個人的都合もある）
512ch+スタートビット1chなので`uint8`の**513列の配列**を作成します。

```python
# make data
data = np.zeros([513],dtype='uint8')
data[0] = 0 # スタートコードは0
data[0] = 255
data[1] = 20
```

なお，このままだと送信できないので`bytearray()`というコマンドで送信用のバイト列へと変換する必要があります。このへんはシリアル通信あるあるですね。

### ３．DMXとしてデータ送信
鬼門です。

[レファレンス](https://pyserial.readthedocs.io/en/latest/pyserial_api.html)を読むに，`break_condition = True`とすることでLow信号を送れるような記述になっているのでこれと`sleep()`を組み合わせてDMX信号もどきを制作します。


```python
for i in range(1,20): # 繰り返し回数は適当

    ser.break_condition = True # Break 
    time.sleep(176.0/1000000.0)

    ser.break_condition = False # MAB
    time.sleep(16.0/1000000.0)

    ser.write(bytearray(data)) # データ送信

    time.sleep(500.0/1000.0) # 一休み
```

んで，変換器の応答やCOMポートの監視をすると，ちゃんと送信はされてるっぽいんですけど，DMX信号としては認識してくれてないんですよね～。


# 総評
~~8/2現在ではDMX信号の生成に成功していないです。~~


- Pythonでusレベルの制御ができているのか謎（とくにWindowsではどうなんでしょうねぇ？）
- break_conditionを使うべきではない？

など懸念は山盛りですが，とりあえず動作はしております。

** 公開用ソースコード
シンプルなコードですが一応レポジトリを作ってみたり。
https://github.com/YoshiRi/PyDMX

オブジェクト指向でパッケージ化するかは必要に駆られたら考えます。
VSCodeでSpring Bootのプロジェクトを実行する

VSCodeのLiveShare使ってJavaのモブプログラミングしたかったので調べてみた。

# 準備
## Java Extension Packプラグインをインストール
![image.png](https://qiita-image-store.s3.amazonaws.com/0/183819/d0c50646-bf36-e4a6-8dcb-8edac4c5b6c4.png)

## Spring Boot Extension Packプラグインをインストール
![image.png](https://qiita-image-store.s3.amazonaws.com/0/183819/2ed760b2-ac6d-c2d0-4850-7eb3c0556937.png)

## （lombok使うなら）Lombok Annotations Support for VS Codeプラグインをインストール
![image.png](https://qiita-image-store.s3.amazonaws.com/0/183819/366d1dfa-543a-fb13-e33b-e85be7a20ad5.png)

# Spring Bootプロジェクトを作る
以下のgif画像通りにやる
https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-spring-initializr

# Spring Bootアプリケーションを起動する
F5を押すと、 `launch.json`が作られるのでデバッグ用のポート番号を設定する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/183819/677b7781-6ed9-af52-3650-9f151e4740bc.png)

再度F5押すとSpring Bootアプリケーションが起動する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/183819/6d247991-cc15-ac50-54af-6a4ba4652bdf.png)

# テストを実行する
テストメニューを開いてテスト対象を右クリック-> Run Test
![image.png](https://qiita-image-store.s3.amazonaws.com/0/183819/aedd699d-9bb8-1961-4462-e68b16683e64.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/183819/37b7edfb-872f-c465-8b2d-ddde2d37ada3.png)

もしくは、コード上のRun Testを押す
![image.png](https://qiita-image-store.s3.amazonaws.com/0/183819/b2fab440-79e6-48d5-4317-5eac66e6c0d8.png)

テスト結果は以下のように確認できる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/183819/0f86e796-cc08-7bf3-5328-00ee5e47b9b1.png)
.NET の DataTable の行の編集状態（RowState）の変化についてのまとめ

# 概要

.NET の DataTable は、DB を更新しやすいように、トランザクションみたいな概念と、各行の状態（編集あり/編集なし/追加/削除）を保持しています。

## トランザクションみたいな概念

- AcceptChange() で全ての DataRow の RowState が「修正なし」になる。
- それ以降に 追加/修正/削除をした場合は、RowState の状態が対応する値に変化する。
- AcceptChange() をすると、「削除」行は消え、「追加」「修正」行は「修正なし」になる。
- RejectChange() をすると、前回、AcceptChange() した状態に戻る。（※一部例外あり）

## RowState

|RowState|状態|補足|
|:--|:--|:--|
|Detached|未追加|DataRowを定義したけどDataTableにAddされていない。|
|Unchanged|編集なし|編集なし。|
|Added|追加|Addedの行を削除すると行そのものが消える。|
|Modified|編集あり|編集あり|
|Deleted|削除|行としては存在する。AcceptChanges()で消える。|

# 動作確認

## 実行ソース（C#）

```C# 
static void Main(string[] args)
{
  // data
  var data = new DataTable();
  data.Columns.Add("ID");
  for (int i = 0; i < 3; i++)
  {
    data.Rows.Add(i);
  }
  data.AcceptChanges();

  Console.WriteLine("--------------------");
  foreach (DataRow row in data.Rows)
  {
    Console.WriteLine($"ID:{row["ID"]},RowState={row.RowState}");
  }

  // 追加
  var add = data.NewRow();    // add.RowState:DataRowState.Detached
  add["ID"] = 3;
  data.Rows.Add(add);         // add.RowState:DataRowState.Added

  // 修正
  var mod = data.Rows[0];     // mod.RowState:DataRowState.Unchanged
  mod["ID"] = 9;              // mod.RowState:DataRowState.Modified

  // 削除
  // ・削除された行として存在する。
  var del = data.Rows[1];    // del.RowState:DataRowState.Unchanged
  del.Delete();              // del.RowState:DataRowState.Deleted

  // 除外
  // ・DataTableから除外される。
  // ・data.RejectChanges();しても、dataから除外されたままになる。
  var rmv = data.Rows[2];    // rmv.RowState:DataRowState.Unchanged
  data.Rows.Remove(rmv);     // rmv.RowState:DataRowState.Detached

  Console.WriteLine("--------------------");
  foreach (DataRow row in data.Rows)
  {
    if (row.RowState == DataRowState.Deleted)
    {
      // 削除された行の値をアクセスしようとする例外が発生する。
      // →DataRowVersion.Original を付けて、削除前の状態の値を取得する。
      Console.WriteLine($"ID:{row["ID", DataRowVersion.Original]},RowState={row.RowState}");
    }
    else
    {
      Console.WriteLine($"ID:{row["ID"]},RowState={row.RowState}");
    }
  }

  // data.AcceptChanges();
  // data.RejectChanges();
  Console.WriteLine("--------------------");
  foreach (DataRow row in data.Rows)
  {
    Console.WriteLine($"ID:{row["ID"]},RowState={row.RowState}");
  }
}
```

## 出力結果

```
--------------------
ID:0,RowState=Unchanged
ID:1,RowState=Unchanged
ID:2,RowState=Unchanged
--------------------
ID:9,RowState=Modified
ID:1,RowState=Deleted
ID:3,RowState=Added

【data.AcceptChanges(); の場合】
--------------------
ID:9,RowState=Unchanged
ID:3,RowState=Unchanged

【data.RejectChanges(); の場合】
--------------------
ID:0,RowState=Unchanged
ID:1,RowState=Unchanged
```

## 補足

- Console.WriteLinen内の $"xxxxx:{xxxxx}" のような記述については、[『【C#】string.Format() をやめて $"{}"（文字列補間式）を使う - Qiita』](https://qiita.com/sanonosa/items/c2226232b31d7665267f)を参照。

# 編集後記

動作を理解していないと思わぬところで Deleted データにアクセスしようとして例外が発生したり、更新対象を正しく取得できなくなってしまいます。
DBのトランザクション管理と同様に、どのタイミングで AcceptChanges(), RejectChanges() するかは、プロジェクトで徹底させないとえらい目に会います。
Docker上でcomposerを動かしてphpunitを入れる

# はじめに

Windowsだとcomposerを入れるのも微妙に面倒だったりする[^1]ので、Docker上で動かしてみる。

## composer.jsonを用意

```json
{
  "name": "frozenvoicejp/sandbox",
  "description": "",
  "require": {
  },
  "require-dev": {
    "phpunit/phpunit": "*"
  }
}
```

## 公式イメージでcomposerを実行

```bash
docker run --rm -it -v ${pwd}:/app -w /app composer install
```

```
Loading composer repositories with package information
Updating dependencies (including require-dev)
…中略
  - Installing phpunit/phpunit (7.2.7): Downloading (100%)
sebastian/global-state suggests installing ext-uopz (*)
phpunit/php-code-coverage suggests installing ext-xdebug (^2.6.0)
phpunit/phpunit suggests installing phpunit/php-invoker (^2.0)
phpunit/phpunit suggests installing ext-soap (*)
phpunit/phpunit suggests installing ext-xdebug (*)
Writing lock file
Generating autoload files
```

問題なくインストール出来た。

[^1]: 実際は既にインストール済みだったりしますが、今後PC乗り換えた時とかに使えそうかなと。
Jupyter NotebookでSQLiteDBから選択したデータをヘッダ付きで表示するための備忘録

## SQLite3でselectしたデータをData Frameとして表示する

### ライブラリのインポート

```python
import pandas as pd
import sqlite3
```

### sqlite3の使い方

データベースとの接続を行う

```python
conn = sqlite3.connection("sample.db")
cur = conn.cursor
```

カーソルオブジェクトの作成

```python
cur.execute("select * from TABLE;")
pd.DataFrame(cur.fetchall(), columns=[description[0] for description in cur.description()])
```

`cur.description()`によってテーブルのヘッダー部分を取得できるため、それをDataFrameのcolumnsに当ててあげれば良い。
vue-cli のテンプレートを Docker で動かす時の注意

vue-cli、使ってますか？私はそんなに使ってません…

今回、手っ取り早く Vue.js の環境を構築したかったことと、他のメンバーにも環境を共有したかったので、 Docker の中に vue-cli を使って Vue.js の環境を構築したのですが、１点だけデフォルトの設定のまま使用するとハマる注意点があり、そこにだいぶ時間を奪われてしまったのでメモ。

# Docker 起動
```bash
docker run -it -p 3001:8080 -v /Users/akagire/dev/vue:/myapp node:10-alpine ash
```

### ポイント
見てのとおりですが...

1. node:10-alpine
軽いので。

2. ポートフォワード
`-p 3001:8080` で、 `webpack-dev-server` のデフォルトポートの8080を3001にフォワード。

3. マウント
`-v /Users/akagire/dev/vue:/myapp` で、ホストの `/Users/akagire/dev/vue` を、コンテナの `/myapp` にマウント。

4. ash
`alpine` は `bash` じゃなくて `ash`

うまくいけば、node:10-alpine が自動で pull されて、コンテナの中に入ります。

## vue-cli インストール
ここからはコンテナの中です。

```
npm install -g vue-cli
```

## Vue.js のテンプレートを引っ張ってくる
vue-cli は、用意されたテンプレートを元にプロジェクトを作ってくれる便利な機能があるのでこれを使いました。

もちろんこれもコンテナの中。

```
vue init webpack test
```

テンプレートから `webpack` を選び、 `test` という名前のプロジェクトを作ります。対話形式でいろいろ聞かれますが、基本は全部空エンターか `y` でOKです。内容見て自分にあった環境を作ってください。
テンプレートは以下から選べます。
https://github.com/vuejs-templates

## npm install
対話が終わったら、プロジェクトフォルダーに移動して `npm install` 。

## サーバー起動
`npm run dev` で起動。ビルドが始まり、 `Your application is running here: http://localhost:8080` と表示されたらビルド終了。
Docker を使っていない場合は、これで `http://localhost:8080` にアクセスすれば終了なのですが、今回は Docker でポートフォワードしているので、 `http://localhost:3001` にアクセスします。

ですが、これだと繋がりません。

## `webpack-dev-server` の設定を変更
`host:` を `0.0.0.0` にしましょう。

```config/index.js
...
    // Various Dev Server settings
    // host: 'localhost', // can be overwritten by process.env.HOST // ここをコメントアウト
    host: '0.0.0.0' // これを追加
...
```

Dockerfile 方式にして EXPOSE 8080 とかも試しましたがこれでした。。。

# ちなみに
`vue init <template> <project name>` は レガシー扱いなので、慣れたら普通に　`vue create <project name>` とか `vue ui` でプロジェクト作りましょう。vue ui、めっちゃ未来感ありますね。
https://cli.vuejs.org/guide/creating-a-project.html#using-the-gui

あとは、[codesandbox](https://codesandbox.io) もとりあえず動かしたいだけなら爆速で試せて便利なのでおためしあれ。

## 追記
`vue create` を使いたい時は `npm install -g vue-cli` ではなく `npm install -g @vue/cli` でインストールしてくださいね。これで作った scaffold は　Docker の中にインスコしても特に設定せずにホストから localhost:8080 で見れるはずです。
 (しかもサーバーが「お前さん多分これコンテナの中でっせ」ってメッセージを出してくる。嬉しい。）


それでは!
Python+Scipyでランダムに作成した点から凸包を描く

久しぶりに小ネタ。

# やること
- 適当に2次元に点群を取得する
- 点群から凸包を計算する
- 点群と凸包をmatplotlibで描画する

# ソース
```python
# -*- coding: utf-8 -*-

import numpy as np
import matplotlib.pyplot as plt
import scipy.spatial as ssp


def point_in_hull(point, hull, tolerance=1e-6):
  return all(
    (np.dot(eq[:-1], point) + eq[-1] <= tolerance)
    for eq in hull.equations)


def main():
  N = 100
  points = np.random.rand(N, 2)
  idx_bases = np.random.choice(range(N), 5, replace=False)
  bases = points[idx_bases, :]

  # hull
  hull = ssp.ConvexHull(bases)
  idx = [i for i in range(N) if point_in_hull(points[i, :], hull)]

  # vis
  fig = plt.figure(figsize=(5, 5))
  ax = fig.gca()
  ax.scatter(points[:, 0], points[:, 1], c='r', marker='o')
  ax.scatter(bases[:, 0], bases[:, 1], c='b', marker='o')

  # in hull vertex and borders
  pidx = points[idx, :]
  ax.scatter(pidx[:, 0], pidx[:, 1], c='c', marker='x')
  for simplex in hull.simplices:
    plt.plot(bases[simplex, 0], bases[simplex, 1], "k--")
  
  ax.axis("off")
  ax.margins(x=0.015, y=0.015)
  ax.set_position([0.05, 0.05, 0.9, 0.9])
  plt.show()
  plt.close()
  

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

# 実行例

![example.png](https://qiita-image-store.s3.amazonaws.com/0/7181/0e2fff0c-9e41-a3bf-75af-b4396e16536e.png)
個人学習メモ#13　formの種類おさらい


フォームに関しての内容に取り組んだので、少し振り返りと、
知らなかった事に関しては説明も入れてます。

フォーム
form name="" action="" url="" method="" 

テキストボックス
input type="text" name="" value=""

テキストエリア
textarea name="" cols="" rows=""

チェックボックス
input type="checkbox" name="" value=""

ラジオボタン
input type="radio" name="" value=""

ドロップダウンメニュー
select name=""/option value=""

リストボックス
select name="" size=""/option value=""
（選択肢が最初から見えている状態）

ボタン
input type="button" value=""

送信
input type="submit" value=""

リセット
input type="reset" value=""
（フォーム内容を全て削除し、元の状態に戻す）

ファイル
input type="file" value=""
（サーバーに送信するファイルを選択できるようになる）


隠し属性
input type="hidden" value=""
（ブラウザ上で表示されないを非表示データを送信することが出来る、
ただしソースを見るとわかるので注意。）
GitHubでファイルパスの差分が見づらいのでChrome拡張を作った

# なんの話か

GitHubでファイルパスに差分が出た場合、以下のような表示になります。

<img width="866" alt="スクリーンショット 2018-08-02 22.33.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/220908/bd03a481-603c-d3a0-c0ed-b4862e6e7297.png">


* sample/1/2/3/a/b/c/test.txt
* sample/1/2/a/b/c/d/test.txt

縦に並べてみるとどこが変わったのか多少わかりやすくなりますが、個人的にデフォルトの表記で差分をみるのは辛いものがありました。
また、パスが長いと省略されて、初期表示で変更がわからない状態になります。

<img width="995" alt="スクリーンショット 2018-08-02 21.23.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/220908/312934b1-206c-2e61-ec05-5abc439db316.png">


# gh-path-diff

リファクタリングでディレクトリだけ大量に移動するようなPRのレビューが辛いので、

 * パスの差分に色をつける
 * パスの差分表示を省略しない

だけを行うChrome拡張を作りました。

## chromeウェブストア
https://chrome.google.com/webstore/detail/gh-path-diff/nfpmbenkfahmjoildkjhmfafjncgcgec

## GitHub
https://github.com/inabajunmr/gh-path-diff

## イメージ

インストールすると差分が以下のように表示されます。

<img width="861" alt="スクリーンショット 2018-08-02 22.33.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/220908/5086ce95-85cb-daa7-0a33-65018c811c6c.png">


# ちょっと苦労したところ

普通にGitHubを使っている時には以下のタブとか

<img width="1009" alt="スクリーンショット 2018-08-02 22.24.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/220908/e2ab1323-fcb7-5195-d1cb-2c0737caf36c.png">

以下のタブ

<img width="1033" alt="スクリーンショット 2018-08-02 22.25.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/220908/3fbf7e0a-5901-12fb-a4e2-73c790bd9bed.png">

をクリックした時に、非同期での書き換えではないいわゆる画面遷移をしていると思っていました。
しかしそうではないようで、差分のページを表示した時に経路によってcontents_scriptが発火しない場合がありました。

そのため、以下のようにbackground.jsでchrome.tabs.onUpdatedにイベントを登録し、差分のページに対するアクセス時には常にtabにメッセージを送るようにしました。

### background.js
```javascript
const regex = /^https:\/\/github.com\/.*\/pull\/.*\/files.*/;
chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
  if (regex.test(tab.url)) {
    kick();
  }
});

function kick() {
  chrome.tabs.query({ active: true, currentWindow: true }, function(tabs) {
    chrome.tabs.sendMessage(tabs[0].id, "gh-path-diff", function(response) {});
  });
}
```

### contents.js
コンテンツスクリプト側ではbackground.jsからのデータを受け取りスクリプトをキックしています。

```javascript
// GitHub has async compile dom so kick script by ajax http access via background
chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) {
  if ("gh-path-diff" === message) {
    gh_diff.main();
  }
  return;
});
```

 * contents.jsだけで
 * 非同期での**特定のURLへの**アクセスに対して
 * スクリプトを発火

みたいなことができるともうちょっと綺麗なんだけどな、と思いつつ、とりあえず今の所は上記の方法でうまく動いています。

この辺りの構造はこちらを参考にさせていただきました。
https://github.com/Yatser/prettypullrequests/blob/master/background.js

実はこんなことしなくてもGitHubの設定でパスのdiff表示できるよ、とかあったら教えてもらえますと幸いです。
DartでのJSONのエンコードとデコード

[docomo Developer support](https://dev.smt.docomo.ne.jp/)を運用している[@akatsukaha](https://qiita.com/akatsukaha)です．

DartでJSONをエンコード/デコードする方法を記載します．DartではJSONをエンコード/デコードするライブラリが`dart:convert`で提供されています．詳細は，[dart:convert - decoding and encoding JSON, UTF-8, and more](https://www.dartlang.org/guides/libraries/library-tour#dartconvert---decoding-and-encoding-json-utf-8-and-more)を参照してください．以下は[Decoding and encoding JSON](https://www.dartlang.org/guides/libraries/library-tour#decoding-and-encoding-json)を和訳し，DartPadですぐ実行出来るように少し修正した内容になっています．

---

# **1. JSONのデコードとエンコーディング**

## **1.1. JSONのデコード**
`jsonDecode()`を使用してJSONでエンコードされた文字列をDartオブジェクトにデコードします。

```dart
// NOTE: JSONのキーには一重引用符(')ではなく二重引用符（"）を利用します．
var jsonString = '''
  [
    {"score": 40},
    {"score": 80}
  ]
''';

var scores = jsonDecode(jsonString);
assert(scores is List);

var firstScore = scores[0];
assert(firstScore is Map);
assert(firstScore['score'] == 40);
```

```:実行結果
true
true
true
```

[DartPad](https://dartpad.dartlang.org/)で利用する場合は下記をコピペしてください

```dart
import 'dart:convert';

void main(){
  // NOTE: JSONのキーには一重引用符(')ではなく二重引用符（"）を利用します．
  var jsonString = '''
    [
      {"score": 40},
      {"score": 80}
    ]
  ''';

  var scores = jsonDecode(jsonString);
  print(scores is List);

  var firstScore = scores[0];
  print(firstScore is Map);

  print(firstScore['score'] == 40);
}
```

## **1.2. JSONのエンコード**

Dartオブジェクトを`jsonEncode()`でJSON形式の文字列にエンコードします。

```dart
var scores = [
  {'score': 40},
  {'score': 80},
  {'score': 100, 'overtime': true, 'special_guest': null}
];

var jsonText = jsonEncode(scores);
assert(jsonText ==
    '[{"score":40},{"score":80},'
    '{"score":100,"overtime":true,'
    '"special_guest":null}]');
```

```:実行結果
true
```

[DartPad](https://dartpad.dartlang.org/)で利用する場合は下記をコピペしてください

```dart
import 'dart:convert';

void main(){
  
  var scores = [
    {'score': 40},
    {'score': 80},
    {'score': 100, 'overtime': true, 'special_guest': null}
  ];

  var jsonText = jsonEncode(scores);
  print(jsonText ==
      '[{"score":40},{"score":80},'
      '{"score":100,"overtime":true,'
      '"special_guest":null}]');
}
```
Vue 2.5 + TypeScript 3.0 を Parcel でビルドする

# はじめに

[Parcel](https://parceljs.org/) で Vue + TypeScript のビルドをしてみようと試してみたら思いのほか簡単だったので、手順をメモします。

同じようなことを以前試したときはなかなかうまくいかなかったのですが、Parcel 自体のアップデートで改善されたようです。

今回は Windows 7 64bit に node v8.9.3 をインストールしている環境で試しました。おそらく Mac 等他の環境でも同様に動作すると思います。

# package.json を用意する

プロジェクト用のディレクトリを作って `package.json` を作ります。

```bash
$ mkdir parcel-vue-ts
$ cd parcel-vue-ts
$ npm init -y
$ npm i -D parcel-bundler
```

実行すると以下のような `package.json` が出来上がります。

```json
{
  "name": "parcel-vue-ts",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "parcel-bundler": "^1.9.7"
  }
}
```

`scripts` に `start` という名前でスクリプトを登録します。

```json
  "scripts": {
    "start": "parcel index.html",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
```

`index.html` は次の章で作ります。

# HTMLファイルを作る

以下の内容を `index.html` という名前で保存します。

```html
<html>
<body>
  <div id="app"></div>
  <script src="./main.ts"></script>
</body>
</html>
```

`dev#app` の下に Vue のインスタンスをマウントします。

# TypeScriptファイルを作る

以下の内容を `main.ts` という名前で保存します。

```ts
import Vue from 'vue';
import App from './App.vue';

new Vue({
  el: '#app',
  render: h => h(App)
});
```

`App.vue` はこのあと作成する Vue のコンポーネントです。

# Vue ファイルを作る

シンプルなアップダウンカウンタを作りました。

```vue
<template>
  <section>
    <p>{{count}}</p>
    <button @click="addCount(1)">UP</button>
    <button @click="addCount(-1)">DOWN</button>
  </section>
</template>

<script lang="ts">
export default {
  data () {
    return { count: 0 };
  },
  methods: {
    addCount(amount: number): void {
      this.count += amount;
    }
  }
};
</script>
```

# ビルドする

ここまで用意してシェルで以下のように入力します。

```bash
$ npm start
```

初回は必要な依存関係 (Vue.js や TypeScript) をインストールするために時間がかかります。

ウェブブラウザで画面に表示されるアドレス (通常は `http://localhost:1234`) にアクセスすると次のような画面が表示され、ボタンをクリックすると表示される数値の価が上下します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/277993/87cc8cd4-5157-6d75-54ce-4cd6f6202e34.png)

この時点で `package.json` は以下のようになりました。 (執筆時時点)

```json
{
  "name": "parcel-vue",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "start": "parcel index.html"
  },
  "author": "",
  "license": "UNLICENSED",
  "devDependencies": {
    "@vue/component-compiler-utils": "^2.1.0",
    "parcel-bundler": "^1.9.7",
    "typescript": "^3.0.1",
    "vue-template-compiler": "^2.5.17"
  },
  "dependencies": {
    "vue": "^2.5.17",
    "vue-hot-reload-api": "^2.3.0"
  }
}
```

# まとめ

Parcel を使って Vue 2.5 + TypeScript 3.0 のプロジェクトをビルドしてみました。意外と簡単に利用できたので、特にちょっとしたプロトタイプを作りたいと思ったときなど、便利に活用できそうです。
AIは宮崎駿になれるのか

# AIでジブリっぽい絵を生成する
今回はCartoonGANというAIのモデルを使って、写真をジブリの絵っぽく変換してみます。
CartoonGANとは、写真を宮崎駿さんや細田守さんの絵のタッチに変換するというモデルです。
GANの一種で、画像を変換するAIモデルです。GANの仕組みに関しては、[taku-buntuさんのこちらの記事](https://qiita.com/taku-buntu/items/0093a68bfae0b0ff879d)がとてもわかりやすいです。
[論文](http://openaccess.thecvf.com/content_cvpr_2018/papers/Chen_CartoonGAN_Generative_Adversarial_CVPR_2018_paper.pdf)がとても興味深かったので、実際に動かしてみました。

# 写真からジブリの絵が再現できるのか…？
ではさっそく、結果を見てもらいましょう。私が試した画像はこちら。
宮崎監督も細田監督も、森が登場する作品が多いイメージなので、まずはこんな画像で試してみました。
### input
![forest.jpg](https://qiita-image-store.s3.amazonaws.com/0/255506/6d599cca-f61e-7e67-c1a3-a30ab5e55cda.jpeg)

### output
宮崎監督風
![forest_Hayao.jpg](https://qiita-image-store.s3.amazonaws.com/0/255506/6f3aa311-50ee-609a-24a6-a74dd12a9276.jpeg)

細田監督風
![forest_Hosoda.jpg](https://qiita-image-store.s3.amazonaws.com/0/255506/a5cb6077-50d7-6cc4-82cd-37c8cf0251e1.jpeg)


あれ、なんか思ったよりボンヤリしてる…。
両監督の映画では、自然はもっと鮮やかに描かれています。

このあと人物や自然など色んなタイプの写真を試してみましたが、両タイプとも傾向として、
「輪郭を縁取って色彩をぼんやりさせる」
そして宮崎監督風ではそこに「赤みを足す」ものとAIは学習しているようです。
人物画などはまだ弱いですね。

# でもジブリっぽい風景だとかなり似ている
ただ、ネットで「ジブリっぽい」と言われている場所の写真を読み込ませてみると、かなりジブリっぽい絵が生成されました。
![mig_Hayao.jpg](https://qiita-image-store.s3.amazonaws.com/0/255506/ccab0be7-9d5b-fb51-e963-594c60e9a856.jpeg)

![195_Hayao.jpg](https://qiita-image-store.s3.amazonaws.com/0/255506/0837413c-34db-4aab-f90a-f7dac3792de7.jpeg)

![ghibli_museum02_ph15_Hayao.jpg](https://qiita-image-store.s3.amazonaws.com/0/255506/856cb802-06ea-defd-73bd-b95382716e4c.jpeg)

みなさんも、もしジブリっぽい場所が見つかったら試してみてください。

# 自分で試したい方へ
## インストール
[公式](https://github.com/Yijunmaverick/CartoonGAN-Test-Pytorch-Torch)の手順通り進めます。

1. CartoonGANのデータをダウンロードする
2. Pytorchのためにpipとnumpyのアップデート
3. Pytorchをインストール

## CartoonGANのデータをダウンロードする
まずは、ターミナルでデータをダウンロードしたいファイルの場所に移動し、git cloneしてきます。

```
git clone https://github.com/Yijunmaverick/CartoonGAN-Test-Pytorch-Torch
cd CartoonGAN-Test-Pytorch-Torch
```

## Pytorchのインストール
そしてPytorchかTorchで動かすんですが、私はどちらも入れていなかったので、そちらのインストールから。私はPytorchにしました。
### pipとnumpyをアップデート
Pytorchのインストールは、まずpipとnumpyのアップロードが必要だそうです。
>Please ensure that you are on the latest pip and numpy packages. <br>
>*https://pytorch.org/*

入っていない場合は、この２つもインストールしましょう。

公式ではAnacondaが推奨されているようです。
>Anaconda is our recommended package manager
>*https://pytorch.org/*

Anacondaを入れるとどちらもインストールされるのでおすすめです。

アップデートする場合はこちら。

```
# pip
pip install -U pip
pip install -U numpy

# Anaconda
conda update pip
conda update numpy
```
### Pytorchのインストール
Pytorchは[公式](https://pytorch.org/)でconda,pip,githubから選んでインストールできます。
私はmacでgpuを使わないので↓のコマンドを入れました。

```
conda install pytorch torchvision -c pytorch
```

## 実際に動かしてみる
では、YourImgDirというディレクトリを作って変換したい画像を保存してから、以下のコマンドを実行します。gpuを使わない場合は`--gpu -1`にします。

```
python test.py --input_dir YourImgDir --style Hosoda --gpu -1
```

# まとめ
やはりGANの画像変換は面白いですね。
今回はユニークな画像変換を取り上げました。最近は人物の写真もアニメ絵に変換したりもできるので、GANにもまだまだ注目です。
[Power Platform] PowerApps + Microsoft Flow + Power BI の連携方法 Vol.1 ～準備編～

#はじめに
皆さん、こんにちは。清水優吾といいます。Microsoft MVP for Data Platform - Power BI をいただいております。
本記事は、にわかに注目を集めている Business Application Platform や Power Platform と呼ばれる PowerApps, Microsoft Flow, Power BI という３つのサービスの連携方法の一つをご紹介する記事です。

#参考情報
**Business Application Platform** については、米国シアトルにて、2018年7月22日～24日という日程で **Microsoft Business Applications Summit 2018** というイベントが開催されるほどグローバルで注目を集めているところです。

**公式ページ**
https://www.microsoft.com/en-us/businessapplicationssummit
こちらのページでセッションについてはオンデマンドで配信されていますので、ご興味ある方はご覧になってみてください。

また PBC (Pacific Business Consulting) の **吉島さん** がすごくわかりやすくブログにまとめてくださっています。
**Business Application Summit 2018 / Seattle USA**
https://www.pbc.co.jp/blog/business-application-summit-2018/ 

#準備
**それぞれのサービス**
今回使用するのは以下３つのクラウドサービス (SaaS) です。
皆さんが既にアカウントを保持している前提でお話を進めます。もしまだアカウントをお持ちでない方は、ご用意ください。
なお、既にアカウントをお持ちの方も、これから用意される方も一つ注意があります。それは、以下３つのサービスをひとつの組織アカウントでアクティベートして欲しいということです。詳細を説明するとそれだけでこの記事が終わってしまうので、省きますが、ひとつの組織アカウントですべてを使えるようにしておかないと、連携ができません。

もし会社のアカウントが **Office 365 E3** 以上のアカウントで、試用に使っても問題ないという方であれば、そのアカウントで可能です。

既に Power BI Pro のアカウントをお持ちであれば、そのアカウント (メールアドレス) で PowerApps と Microsoft Flow に以下の URL からサインインしてみてください。使えるはずです。

もし**自由に使える組織アカウントがない！**という方は、**Office 365 の試用版**から作成することを**オススメ**します。
Office 365 の試用版でアカウントを作成して、そのアカウント(メールアドレス)を使用して、PowerApps, Microsoft Flow, Power BI をアクティベートすると、すべてがひとつの組織アカウントで使用できます。

**自由に使える組織アカウントがない方 → [Office 365 E5 試用版]**
https://products.office.com/ja-jp/business/office-365-enterprise-e5-business-software


**[PowerApps]**
https://powerapps.microsoft.com
**[Microsoft Flow]**
https://flow.microsoft.com
**[Power BI]**
https://powerbi.microsoft.com

必要なものをまとめると以下です。
1. Office 365 の E3 以上のアカウント (試用版も可)
2. 1 のアカウントで PowerApps, Microsoft Flow, Power BI をアクティベート (サインアップ)
3. Google Chrome または Microsoft Edge (オススメは Chrome)

#本記事のゴール
![image.png](https://qiita-image-store.s3.amazonaws.com/0/152946/241d7c4a-228e-acc8-aa9b-7e1c6992cccf.png)
本記事で構築するシステムのアーキテクチャを簡単に書くと、上記のようになります。
1. **Power BI** のダッシュボードに配置された **PowerApps** アプリを使用して、データを入力
2. **PowerApps** から **Microsoft Flow** にデータを飛ばす
3. **Microsoft Flow** から **Power BI** のデータセットにデータを追加
4. 同時に **Microsoft FLow** からデータが登録されたことを伝えるメールを送信

イメージはこんな感じです。

#続きは Vol.2 へ
まずは準備編でした。既にそれぞれのアカウントをお持ちの方は、読んでおしまいというところだったと思います。自由に使える Office 365 アカウントがないという方は、準備、お疲れ様でした。

余談ですが、アカウント作成から準備された方は、多少なりとも Office 365 の組織アカウントの仕組みが見えたのではないでしょうか？ここを理解していると、これだけでコンサルができたり、今後 Office 365 に新たなサービスが追加されても、そのアカウントでそのまま使用することができます。

それでは次回 (https://qiita.com/yugoes1021/items/7b3d3ee92906eec081d4) からは実際の連携手順に入っていきます。お楽しみに！
docker-compose.ymlでworking directoryを指定する

Dockerfileの `WORKDIR` は知っていたがdocker-compose.ymlの場合の書き方が分からず手が止まった。
当てずっぽうで同じように `workdir:` と書いて動かしたら、

```
Unsupported config option for services.dev-env: 'workdir' (did you mean 'working_dir'?)
```

と親切なメッセージ。
というわけで次のようにすればよい。

```yml:docker-compose.yml
version: '3'
service:
  app:
    image: alpine:latest
    volumes:
      - ./:/worker
    working_dir: /worker
```
pythonのモジュールを使って添字、指数を表示

##HTMLのタグ
HTMLにはsubscriptタグ、superscriptタグが存在し、それぞれ添字、指数を表示するためのタグです。

今回はそれをpythonで出力時に使いたいと思います。
使い道は、添え字、指数を使って文字列をわかりやすく表示することくらいだとは思いますが。

#コード

```python
#モジュールのインポート
from IPython.display import HTML

#HTMLコードを記述
code = """
str<sub>添え字</sub>
str<sup>指数</sup>
"""
#表示
HTML(code)
```

#複数回使う場合

```python
from IPython.display import HTML
def sub(sub):
    sub = "<sub>" + str(sub) + "</sub>"
    return sub
def sup(sup):
    sup = "<sup>" + str(sup) + "</sup>"
    return sup
```

また、上記のように関数を定義すると、

```python
equation = "6 = log" + sub(2) + "8" + sup(2)
HTML(equation)
```

とコードを記述すると
6 = log<sub>2</sub>8<sup>2</sup>
と表示されます。
vimにてpowerlineのエラーの対処(備忘録)

```error:error内容
Traceback (most recent call last):
  File "<string>", line 9, in <module>
ImportError: No module named powerline.vim
An error occurred while importing powerline module.
This could be caused by invalid sys.path setting,
or by an incompatible Python version (powerline requires
Python 2.6, 2.7 or 3.2 and later to work). Please consult
the troubleshooting section in the documentation for
possible solutions.
Unable to import powerline, is it installed?
Press ENTER or type command to continue
```

```解決策:解決策(~/.vimrc内に書き足す)
let g:powerline_pycmd="python3"
```
String.hashCode が同じ文字列なのに違う値になることがある

[追記] このバグはすでに修正済です

Flutter/Dart でアプリを開発していたところ、Map に「同じ文字列が別キーとして入る」という現象に遭遇しました。さらに調査すると、同じ文字列なのに `String.hashCode` が違うのが原因だということが分かりました。

これは、いろいろな要因が重なって Dart のエッジなバグを踏んでいたものですが upstream では解決されています。

- https://dart-review.googlesource.com/c/sdk/+/68042
- https://github.com/flutter/flutter/issues/20122

せっかくですので、経緯を記録として残しておきます。

## おおよその実装

文字列を加工して返す関数があり:

```dart
String foo(String name) {
  return "prefix-${name}";
}
```

Mapにデータを入れる処理があり:

```dart
Map data = new Map<String, String>();

String str1 = foo("test");

// ...

// str1 は "prefix-test" という文字列
data[str1] = "value";
```

Mapからデータを取り出す処理がありました:

```dart
String str2 = foo("test");

// str2 は "prefix-test" という文字列
// str1 と同じ
String value = data[str2];

// "value" を期待するが null になる
print(value);
```

上記のように `Map` に対して「同じ文字列」でアクセスしているのに、期待通りの処理になりませんでした。

## hashCode

`Map` はオブジェクトの `hashCode` を使って格納位置をコントロールしている（いろいろな言語でそういう実装なので、Dart もそうだろうと思った）ので `hashCode` が怪しい……ということで以下のように確認したところ「同じ文字列で、別の`hashCode`」になっていました。

```dart
print("${str1 == str2}"); // true
print("${str1.hashCode == str2.hashCode}"); // false!!!
```

通常の `Object.hashCode` は「同一性を示すもの」をもとにして算出されます。この場合の同一とは、メモリ上のアドレスも同じであることです。

ただし `String`, `Point`, `Rect` のようなクラスでは、同値であれば同じ（`==` が `true` を返す）ものであるとして扱えるように、`hashCode` と `==` 演算子をオーバーライドしています。このため、別の箇所で生成した `String` オブジェクトであっても、同じキーとして `Map` でも使えます。今回は、何らかの理由で、同じ値の `String` で別の `hashCode` になってしまうのが問題の原因です。

なお、この現象は iOS のシミュレーターおよび実機でのみ発生し、Android のエミュレータおよび実機では発生しません。

## identityHashCode

さて、前述のコードで省略されている箇所で、文字列 `str1` に対して `identityHashCode` を呼び出しているコードがありました。この `identityHashCode` を呼び出していることが `hashCode` を変えてしまっている原因でした。

identityHashCode とは？

> Returns the identity hash code of `object`.
> 
> Returns the same value as `object.hashCode` if [object] has not overridden
> [Object.hashCode]. Returns the value that [Object.hashCode] would return
> on this object, even if `hashCode` has been overridden.
>
> This hash code is compatible with [identical].

つまり `hashCode` をオーバーライドしているクラスのオブジェクトに対しても、基底クラスである `Object.hashCode` の値を得ることのできる関数です。同値でイコールになるものでも、別オブジェクトであれば別のものとして扱いたい場合に、この `identityHashCode` や `identical` といった関数を使います。

ところが、この関数によって内部的に呼び出された `Object.hashCode` の値が `String.hashCode` の結果としてもキャッシュされてしまう、という動作になっていました。

`hashCode` の計算にはある程度のコストがかかるので、算出したものをキャッシュするようにしているようですが `String` の場合はこれが問題になりました。

普通にコードを書いていると `identityHashCode` は使わないと思うので、ほとんどのアプリでは問題にならないと思います。

## 対策

`identityHashCode` を使わないようにしました。この関数を使わずとも実装できるコードだった、むしろ同一性よりは「同値かどうか」をベースにしたほうがよい処理だったので、そのように修正しました。

いずれ Flutter が利用している Dart のバージョンがあがり、該当の修正が含まれるようになりますが、それまでに対応が必要な場合は、コードを見直すとよいでしょう。

## おまけ

原因究明までに試したこと

- Flutterのバージョンをいろいろ変える（Dartのバージョンも変わるため）
- 各種キャッシュをクリア（flutter/bin/cache, ~/.pub-cache, /path/to/app/build）
- printをあちこちに埋め込み、どこで値が変わってしまうのか調査
Aurora@MySQL上のパーティションテーブルでオンラインDDLが効かない

~~※ソースは見つかっていません、わかるいたら情報いただけるとありがたいです。~~
ソース見つけました、追記参照。

3行でまとめると

- 10億行オーダーの分析軸が増えたのでインデックスを追加しようとした
- 一応検証環境で試してみたらオンラインで変更できなかった
- ~~細かく検証したら Aurora × パーティション化 がまずいみたい~~
    - MySQL.5.6.10 × パーティション化 がまずいみたい


## 実行環境

```
> select @@aurora_version;
+------------------+
| @@aurora_version |
+------------------+
| 1.14             |
+------------------+

> select @@version;
+-----------+
| @@version |
+-----------+
| 5.6.10    |
+-----------+
```


## 何が起きたか

Aurora@MySQL上でパーティション化テーブルのインデックス作成がオンラインでできなかった。
もうちょっと言うと `lock = none` での更新ができないみたい。

```SQL:対象テーブル
CREATE TABLE `test1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `userId` int(11) NOT NULL,
  `value` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`,`userId`)
) ENGINE=InnoDB
PARTITION BY HASH (userId)
PARTITIONS 4;
```

```SQL:インデックス追加
-- ※実際には数億行入れたから実行したと思ってください。
create index ix_value on test1(value);

-- →流したらシステムが止まったと怒られた(｡>﹏<｡)
```

```SQL:試しにロックなしを明示して実行
create index ix_value on test1(value) lock = none;

-- → ERROR 1845 (0A000): LOCK=NONE is not supported for this operation. Try LOCK=SHARED.
```


## オンラインDDL

[オンライン DDL の概要][mysql-index]

MySQL5.6から `create index` の実行がロックなしでできるようになったはず。
実際にEC2で立てたMySQL上ではちゃんと稼働する。

```:EC2上のMySQL5.6
> select @@version;
+------------+
| @@version  |
+------------+
| 5.6.28-log |
+------------+

> create index ix_value on test1(value) lock = none;
Query OK, 0 rows affected (0.05 sec)
Records: 0  Duplicates: 0  Warnings: 0
```

## パーティションなし

パーティション化していないテーブルではDDLの実行は可能だった。
元々こちらは確認していたのでオンラインで実行可能と高をくくったら痛い目見ました(´・ω・｀)

```
-- パーティションだけ定義されてない別のテーブル
CREATE TABLE `test2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `userId` int(11) NOT NULL,
  `value` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`,`userId`)
) ENGINE=InnoDB;

> create index ix_value on test2(value) lock = none;
Query OK, 0 rows affected (0.06 sec)
Records: 0  Duplicates: 0  Warnings: 0
```

## 結局

数時間がかりのメンテでなんとかしました(゜-゜)
同じような構成作ってる人は注意しましょう。


----

## 原因

2019/07/01追記

[Changes in MySQL 5.6.11 (2013-04-18, General Availability)][mysql-note-5611]

> - **Partitioning:** ALGORITHM = INPLACE, which was disallowed in MySQL 5.6.10 for DDL statements operating on partitioned tables, can once again be used with such statements. (Bug #16216513)

パーティションテーブルでオンラインDDLが5.6.10まで効かないのはMySQLのバグだったとのこと。
試しにAmazon Linux - MySQL5.6.10 で `lock = none` やってみたら怒られれました\_(:3」∠)_
5.6系のauroraは5.6.10なので5.7系に上げるしか対処できないのだろうか(´-﹏-`；)

[mysql-index]: https://dev.mysql.com/doc/refman/5.6/ja/innodb-create-index-overview.html
[mysql-note-5611]:https://dev.mysql.com/doc/relnotes/mysql/5.6/en/news-5-6-11.html
【React】HTML5のaudio要素で音楽を順番に再生する

# Reactでライブラリ使わず、音楽を順番に再生させたいと思ったのでやってみました。

[ソースコード](https://github.com/anharu2394/react-music-player)
`MusicPlayerコンポーネント`に音楽のデータの配列を渡します。

```jsx:App.js
import React, { Component } from 'react';
import MusicPlayer from './components/musicPlayer';

class App extends Component {
  render() {
    const musics = [
      {
        id: 1,
        src: "http://~/~.mp3"
      },
      {
        id: 2,
        src: "http://~/~.mp3"
      }
    ];
    return (
      <div>
          <MusicPlayer musics={musics} />
      </div>
    );
  }
}

export default App;
```

`MusicPlayerコンポーネント`で、音楽のデータの配列から`Musicコンポーネント`にデータを渡す。
そして、順番に音楽が流れるようにする。

```jsx:components/musicPlayer.js
import React, { Component } from 'react';
import Music from './music';
export default class MusicPlayer extends Component {
  constructor(props) {
    super(props);
  }
  playMusic() {
    let musics = document.getElementsByClassName("music");
    musics =  Array.prototype.slice.call(musics);
    const playMusic = (n) => {
      musics[n].play();
      musics[n].addEventListener("ended",() => {
        if (n < musics.length) {
          playMusic(n + 1);
        }
      });
    }
    playMusic(0);
  }
  componentDidMount() {
    this.playMusic();
  }
  render() {
    return this.props.musics.map((music) => <Music {...music} />);
  }
}

```

`Musicコンポーネント`で、audio要素を作る。

```jsx:components/music.js
import React from 'react';

const Music = (props) => {
  return <audio {...props} className="music" />;
}

export default Music;

```

[ソースコード](https://github.com/anharu2394/react-music-player)
Ruby Arrayの組み合わせ系メソッドまとめ

覚えていると便利なArrayの組み合わせ系メソッドのまとめです。
(一部`ActiveSupport`のメソッドもあります)


## combination
組み合わせ（順序なし、重複を許さない）

```rb
# to_a
> [1,2,3].combination(2).to_a
=> [[1, 2], [1, 3], [2, 3]]

# map
> [1,2,3].combination(2).map {|arr| arr.map(&:to_s) }
=> [["1", "2"], ["1", "3"], ["2", "3"]]
```

## repeated_combination
組み合わせ（順序なし、重複を許す）

```rb
> [1,2,3].repeated_combination(2).to_a
=> [[1, 1], [1, 2], [1, 3], [2, 2], [2, 3], [3, 3]]
```

## permutation
順列（順序あり、重複を許さない）

```rb
> [1,2,3].permutation(2).to_a
=> [[1, 2], [1, 3], [2, 1], [2, 3], [3, 1], [3, 2]]
```

## repeated_permutation
重複順列（順序あり、重複を許す）

```rb
> [1,2,3].repeated_permutation(2).to_a
=> [[1, 1], [1, 2], [1, 3], [2, 1], [2, 2], [2, 3], [3, 1], [3, 2], [3, 3]]
```

## product
複数の配列の要素の組み合わせ
配列の配列を作成して返す。

```rb
[1,2].product([3,4], [5,6])
=> [[1, 3, 5], [1, 3, 6], [1, 4, 5], [1, 4, 6], [2, 3, 5], [2, 3, 6], [2, 4, 5], [2, 4, 6]]
```

## zip
複数の配列の要素の組み合わせ
配列の配列を作成して返す。

```rb
> [1,2,6,7].zip([3,4,5])
=> [[1, 3], [2, 4], [6, 5], [7, nil]]
```

## transpose
行列を入れ替える

```rb
> [[1,2,6], [3,4,5]].transpose
=> [[1, 3], [2, 4], [6, 5]]
```

## （ * ）

```rb
5.times.map { [0] * 3 }
=> [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
```

## in_groups_of (ActiveSupport)
指定個数毎に切り分ける

```rb
[1, 2, 3, 4, 5, 6, 7].in_groups_of(2, false)
=> [[1, 2], [3, 4], [5, 6], [7]]
```

## in_groups (ActiveSupport)
指定個数に切り分ける

```rb
[1,2,3,4,5,6,7].in_groups(2, false)
=> [[1, 2, 3, 4], [5, 6, 7]]
```
mochaによるテスト、mongodb初期化


## 前提：下記インストール済み
- nuxt.js v1.0
- mocha v5.2
- mongodb v3.1
- mongoose v5.2

## 目的：テスト前にmongoDB初期化

### Install package

```
> npm install mocha --save-dev
> npm install supertest --save-dev
> npm install expect --save-dev
```

### package.json にコマンド追加
```js:package.json
"scripts": {
    "test-api": "export NODE_ENV=test || SET \"NODE_ENV=test\" && mocha api/**/**.test.js"
  },
```
実行コマンド
>\>npm run test-api

### Seedの作成と初期化関数(populatePlaces)の呼び出し
api/tests/seed/seed.js

```js:seed.js
const { ObjectID } = require("mongodb");
const { Place } = require("./../../models/place");
const places=[{
    _id : new ObjectID() ,
    place_id : '001',
    place_name : 'Software Park',
    location:{ type:'Point', coordinates:[ 100.529730,13.904549,]}
},{
    _id : new ObjectID() ,
    place_id : '002',
    place_name : 'CentralPlaza Changwattana',
    location:{ type:'Point', coordinates:[100.527834,13.903676 ]}
}]

const  populatePlaces = async function()  {
    this.timeout(10000); // change timeout 10sec
    await Place.remove({});
    await Place.insertMany(places);
}

module.exports = {
    populatePlaces,
}

```

```js:server.test.js
const { populatePlaces } = require("./seed/seed");

//placesコレクションの初期化
beforeEach(populatePlaces);

// === 以下テストケース ===
```

##追記予定
Node.jsのrequireの検索パス


# `require('hoge')`で実際にどのファイルが読み込まれるのか調べたいときは
`console.log(require.resolve('hoge'))`とすれば絶対パスが表示される。

また、環境変数 `NODE_DEBUG=module` をセットしてNode.jsを実行してみるとログが表示される。

# requireの検索パス

- `./` や `../` で始まる場合（例: `require('./hoge')`）
    - **requireが書かれているファイル**からの相対パスになる。
- `./` `../` `/`  のいずれでも始まらない場合（例: `require('fs')`）
    - まずコアモジュール（`http`モジュールなど）が探される
    - 次にnode_modulesフォルダが探される。node_modulesフォルダを探す順番は、
        - **requireが書かれているファイルがあるフォルダ**
        - その親、その親…。
        - 次に下記の場所も検索される。
            - 0: `$NODE_PATH` （`$NODE_PATH`を使ってモジュールの位置を指定するのは古いやり方で、現在は推奨されていない。）
            - 1: `$HOME/.node_modules`
            - 2: `$HOME/.node_libraries`
            - 3: `$PREFIX/lib/node` （`$PREFIX`はNode.jsのビルド時に決定された`node_prefix`）

# require('hoge')のように拡張子を省略した場合
次のものが探される。

- hoge.js
- hoge.json
- hoge.node
- hogeという名前のフォルダ（package.jsonを含んでモジュール化されているもの）
- hogeという名前のフォルダ（index.js、index.json、index.nodeのいずれかを含んでモジュール化されているもの）


# 参考
公式ドキュメント。requireの擬似コードも含めてとても詳しく書かれている。
https://nodejs.org/docs/v6.10.3/api/modules.html
[C++] DirectShowのフィルタを自作しようとして軽くハマった話

# 0. TL;DR
以下のエラーが発生.
- LNK2019 未解決の外部シンボル \_\_imp\_\_vsnwprintfが～
- LNK2001 外部シンボル "\_\_imp\_\_vswprintf は未解決です" 

VisualStudio2015以降だと, printf()やscanf()関係がガラッと変わっているらしく, リンカの入力オプションにlegacy_stdio_definitions.libを追加しなければならなかったらしい.


【参考サイト】

[解決に導いてくれた記事](https://qiita.com/tanachiu/items/d20ada532f5d1d2857ec)

# 1. はじめに
[前回](https://qiita.com/Midori_co583826/items/e6d70cc2871f16c3e5a8), DirectShowを使おうとして軽くハマったわけですが, 無事解決し清々しい気持ちでプログラムを書き始めました.
開発を進めるにつれ, どうやら自作のフィルタを作成しなければならないことを知り, 早速取り掛かることに.

そこで事件が起こるわけです...

# 2. strmbased.libなんてないジャマイカ
最初に言っておくとジャマイカは何も関係ありません.

早速 [MSDN](https://msdn.microsoft.com/ja-jp/library/cc352328.aspx) に行ってフィルタの自作方法を検索してみると, (SDK)\Samples\Multimedia\C++\BaseClasses に「strmbased.lib(or strmbasd.lib) があるからそれ使ってね! あ, あと streams.h もちゃんと include するんだぞ!」って書いてあったので, まずそのディレクトリを探してみると見事になかったため, なんのSDKをインストールする必要があるのか調べることに.

[このサイト](http://www.aianet.ne.jp/~asada/prog_doc/directshow/index.htm)によると, [Windows SDK for Windows Server 2008] か [Windows SDK for Windows Vista] をインストールすればいいらしいので落としに行ってみると...

　- We're sorry, this download is no longer available.

え, もう落とせないやん... MSDNのサブスクリプションないとアカンのか(絶望).
「もうダメだぁ～, おしまいだぁ～」などと言っているヒマはないため, 過去プロジェクトをひたすら検索しまくることに.

そうしたら, 奇跡的に発見することに成功!! やったね!!
でも, これ普通に趣味としてやってる人は開発できないよね?　Microsoftさん, どうにかならんの?
まあ, 古の技術じゃなくてMedia Foundationとか使えって話なのかもしれませんが...

# 3. 恐怖のリンカエラー
順調に開発を進め, いざビルドを実行してみるとリンカエラーが...[前回](https://qiita.com/Midori_co583826/items/e6d70cc2871f16c3e5a8)の悪夢が蘇る.
「まーた君かぁ. 壊れるなぁ.」 などと考えているヒマもなくGoogle先生に尋ねてみることに.
しかし, あまりの情報量の多さに四苦八苦. 手当たり次第試してみることに! これが地獄の始まりとは知らずに...

数撃ちゃ当たるだろ戦法は必ず1つの方法で解決できるときには有効ですが, 今回の場合, 色々な原因が考えられる状況ではあまりに無力...

数撃ってるうちに気付きました. これ, 解決方法の組み合わせで解決する場合を考えると無理だよね？と.
そこで今一度, Google先生に聞いてみることに.

サーチすること1時間くらい. ようやく[解決に導いてくれた記事](https://qiita.com/tanachiu/items/d20ada532f5d1d2857ec)に辿り着きました!

サイトの導きの通りに実行することによって, 無事リンカエラーともおさらばできましたとさ!!

# 4. おわりに
実はこの話, これでめでたしめでたしでは終わりません.
なんと今回作成した自作フィルターは...





見事お蔵入りとなりました!!!!泣
結局うまく動かなかったので, 別の手法で実現することとなりましたとさ.
ﾄﾎﾎ...
第26話 離散型単純群

この記事は[仮面ライダービルドの数式](https://qiita.com/izmktr/items/e26a624e79bce3edccc9)の第26話です。

```math
\#\{sporadic\ group\}=26
```

第18話と対になる式で、単純有限群の離散型単純群は26種類ある、という意味です。

第18話の意味は、有限単純群の無限個クラスが18種類、という意味でした。
そもそも、有限単純群は何個あるのか…答えは無限にあります。
この18種類はどれも無限にパターンを作ることができるのです。

ところが、この18種類のどれにも属さない形が26個だけあります。
これが離散型単純群です。
この26個の単純有限群だけは今までのパターンから外れた「はぐれもの」なのです。

この離散型単純群は複雑で巨大ということもあり、よくわかってないものが多いようです。
小さいものは11個の要素を入れ替えたもので、7920個の次数(出てくる数の個数)ですが、
最大のものはモンスター群といって、次数が53桁にもなる巨大なものです。

モンスター群はあまりにも巨大で、2つの数を計算するだけでも4.5GBのメモリが必要になります。
もちろん計算時間もそれなりにかかるので、コンピュータで計算するのは現実的ではありません。

そういうわけで、まだまだよくわからないのがこの離散型単純群です。
個人iOSデベロッパーも search ads に登録してキーワードボリュームを確認しよう


#search ads とは
日本時間で 8/2 から始まった app store 上での広告プログラムです。
自分のアプリに対して特定のキーワードと広告単価を入力すると、
そのキーワードで検索したユーザーに対して最も高い単価を提示したアプリが app store 上で最上部に表示されます。
入札制のアドネットワークに近いものですね。
詳細は[公式サイト](https://searchads.apple.com/jp/)を確認してください。

#広告に興味なくても登録したほうがいいかも
上記の通り入札制のアドネットワークということは、広告費を潤沢に投入できる人たちにしか恩恵はなさそうです。
つまり、基本的に私のような弱小の個人開発者は全く関係ないと思っていました。

たしかにアプリに広告の登録はしてみたものの広告単価は大した値段は出せないので、
登録したキーワードで自分のアプリが広告枠に表示されることは（わかってはいましたが）ありませんでした。

##キーワードボリュームがわかる？
ただし、そのキーワードを登録するときに以下の画面が出てきました。


![searchads.png](https://qiita-image-store.s3.amazonaws.com/0/94194/0cd16010-1504-6a4b-f309-7eacb9c17d91.png "searchads.png")

推奨キーワードとして自分のアプリで登録しているキーワードと、関連のあるキーワードが表示され、人気度の検索のところでキーワードの検索ボリュームが相対的ですがわかります。
（モザイクをかけていますが、出てくるキーワードの人気度の大きさは肌感と離れていないです）
アプリストアのキーワードチューニングに活用できそうな気がしませんか？

##まとめ
search ads は広告出稿のツールですが、
広告費用を潤沢に出せない個人デベロッパでもキーワードチューニングに使うことができそうなので、
登録する価値はありそうです。