OmniAICreator/Qiita-1.07M huggingface dataset:
:afterなのか::afterなのか問題


## はじめに
何度か忘れて、あれ？どっちだったっけ？ってなることがあったのでメモがわりに書いておきます

## 擬似要素について
選択された要素の、特定の部分を整形できるようにするものです。例えば、今回タイトルに出した::afterや::beforeなどがこれに当たります。

## とりあえず、答え
端的に言えば、現在は擬似要素の前に二重コロン（::）をつけることが正解です。
なので、

```css
.target::after { }
```
これが正解です。

ただし、注意点があります。IE8.0未満にも対応させる時など、CSS3対応していないOSで使用する場合は、単一コロン（:）を使用しないといけません。そのため、多くのブラウザでは単一コロン（:）でもしようできるようになっています。
これは、CSS2とCSS3で仕様が異なるためです。なぜ、CSS2とCSS3で違いができたのでしょうか

## CSS2とCSS3で仕様が異なる理由
CSS３からは、擬似クラスと区別をつけるため、
擬似要素には二重コロン（::）を、擬似クラスには単一コロン（:）をつけることになりました。
CSS2ではこの二つに区別をつけていなかったため、どちらも単一コロン（:）で記述していました。

## 擬似クラスとは
選択された要素に対して、特定の状態を指定することができるものです。擬似要素とは違って、対象となる要素全体に関わるスタイルを指定できます。例えば、マウスカーソルが要素の上にいた際のスタイルを指定する:hoverなどがこれに当たります。

## まとめ
- 擬似要素には二重コロン（::）
- 擬似クラスには単一コロン（:）
- ただし、CSS3が対応していないOSでの使用を考えるならどちらも単一コロン（:）
MMD4MecanimのUnity on OSXでのエラー解決

MMD4Mecanimを使って、Unityにミライアカリの.pmxファイルをインポートして3Dモデル表示した際につまづいたのでメモ。

#この記事の要約
Unity on MacでMMD4Mecanimを使って.pmxファイルを.fbxファイルに変換する際にxmlファイルしか生成されない問題が起こった。pmx2fbx_275がversion 8.0.0以上のlibiconv.2.dylibを参照するようにパスを指定すると解決する。

#環境
Mac OS X High Sierra 10.13.3
Unity 2018.1.0b8
[MMD4Mecanim Beta](http://stereoarts.jp/)
ミライアカリのモデルはニコニ立体で配布されています→
http://3d.nicovideo.jp/works/td31639
#UnityにMMD4Mecanim、MMDモデルをインポート
@ngron さんの[Qiita記事](https://qiita.com/ngron/items/cdd3248c7ff96a1bc5b0)などを参考にしてください
#問題
####「上の記事を参考にMiraiAkari_v1.0.MMD4MecanimのInspectorからProcessをクリックするも、fbxファイルが生成されず、xmlファイルしか生成されない」
<img width="1552" alt="スクリーンショット 2018-03-21 17.03.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/106785/49a3be26-56f5-552a-5075-bc9729956ff0.png">

秋田大学プログラミングサークルTNPのガナリヤさんが「MMD4MecanimのMacでのエラーについて」というタイトルで、[同じ問題についての記事](http://akitatnp.wp.xdomain.jp/2017/12/21/mmd4mecanim%E3%81%AEmac%E3%81%A7%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/)を書いてくださっていますが、自分の環境ではこれだけでは解決しませんでした。

#解決の流れ
##①UnityのEditorログを見る
[公式](https://docs.unity3d.com/ja/540/Manual/LogFiles.html)によるとmacでは
~/Library/Logs/Unity/Editor.log
にあるそうです。
開いて見ると、ガナリヤさんの記事にある通り、確かに

```
dyld: Library not loaded: /opt/local/lib/libiconv.2.dylib
  Referenced from: /Users/Shared/Unity/MiraiAkariTest/Assets/MMD4Mecanim/Editor/PMX2FBX/pmx2fbx_275
  Reason: Incompatible library version: pmx2fbx_275 requires version 8.0.0 or later, but libiconv.2.dylib provides version 7.0.0
```

との表記が。

pmx2fbx_275（自分の環境では/Users/Shared/Unity/MiraiAkariTest/Assets/MMD4Mecanim/Editor/PMX2FBX/pmx2fbx_275にありました）がversion 8.0.0ではなくversion 7.0.0のlibiconv.2.dylibを参照してしまっているため問題が起こっています。
##②iconvをアップデートする
ガナリヤさんの記事、@lapun さんの[記事](https://qiita.com/lapun/items/65039e59ac483c8dfd80)を参考に

```
brew update
brew install libiconv
```

でlibiconvをアップデートして見るも、問題は解決せず。
##③pmx2fbx_275の参照ライブラリを変更する
ターミナルで

```
$otool -L {pmx2fbx_275へのパス}
```

と叩くと

```
/opt/local/lib/libiconv.2.dylib (compatibility version 8.0.0, current version 8.1.0)
```

とあります。しかし、自分の環境では/opt/local/libにlibiconv.2.dylibがありませんでした。/usr/local/opt以下を見るとlibiconvディレクトリがあり、

```
$ otool -L /usr/local/opt/libiconv/lib/libiconv.2.dylib
```

と叩くと

```
/usr/local/opt/libiconv/lib/libiconv.2.dylib:
	/usr/local/opt/libiconv/lib/libiconv.2.dylib (compatibility version 9.0.0, current version 9.0.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.0.0)
```

と返ってきたので、こちらを参照するように変更しました。

```
$ install_name_tool -change /opt/local/lib/libiconv.2.dylib /usr/local/opt/libiconv/lib/libiconv.2.dylib {pmx2fbx_275へのパス}
```

改めて

```
$otool -L {pmx2fbx_275へのパス}
```

と叩くと

```
/usr/local/opt/libiconv/lib/libiconv.2.dylib (compatibility version 8.0.0, current version 8.1.0)
```

とあり、参照するパスが確かに変わっています。

#結果
以上の修正をした上でUnityエディタに戻り、processをクリックすると、ミライアカリの.fbxが生成され、Sceneに配置できました。
<img width="1552" alt="スクリーンショット 2018-03-21 17.37.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/106785/0457ee52-7fa2-62a8-79d2-0546b700e977.png">

#ライセンス
(c)Mirai Akari Project
初めてChainerCVを触ったときに困惑したこと

# 本日は 

最近はChainerに関する本がでていたり，ハンズオンがでてきたりとChainerに対する敷居も下がってきているように思えます（主観）．

慣れてきたころに改めて

[Chainer v3 ビギナー向けチュートリアル](https://qiita.com/mitmul/items/1e35fba085eb07a92560)

をみるととても分かりやすいし得られることも多いです．この記事の後半でChainerCVでData Augmentationをすることを紹介していたのでChainerCVを触ってみようと思いました．

そこで引っかかったことを紹介します．

# install 

`pip` を使って一発です．

```shell-session
> pip install chainercv
```

# 困惑した現象

適用するケースによりますがData Augmentationの手法の一つとして画像の回転，反転をすることがあります．

![image.png](https://qiita-image-store.s3.amazonaws.com/0/135978/3bc261be-11a5-eb43-3cf7-06444306ecaf.png)

たとえば上の `letterF.png` という名前で保存している画像を読み込んで画像の反転をしたいとします．

```python
>>> from imageio import imread
>>> letter = imread('letterF.png')
```

Numpy を使う場合は `flipud` を使うことで上下反転できます．

[numpy.flipud](https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.flipud.html)

```python
>>> import numpy as np
>>> flip_np = np.flipud(letter)
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/135978/057d84ab-8c42-8034-e1db-2c1fb15ab085.png)

一方 ChainerCV で行う場合は `chainercv.transforms.flip` を使います．

[chainercv.transforms.flip](http://chainercv.readthedocs.io/en/stable/reference/transforms.html#flip)

```python
>>> img=transforms.flip(letter, y_flip=False, x_flip=True, copy=True)
>>> plt.imshow(img)
```

ちなみに出力画像は次のようになります．

![image.png](https://qiita-image-store.s3.amazonaws.com/0/135978/d09283e7-24d7-ffe3-5377-56a28719713a.png)

まっしろ！！！

# 原因

原因は使い方に問題がありました．

ChainerCVのリポジトリのReadmeには次のようた但し書きが入っていました．

![image.png](https://qiita-image-store.s3.amazonaws.com/0/135978/cc368939-a29d-55cd-423c-3062920bc126.png)

`Shape is CHW` という部分が大事でデータを `(channel, height, width)` の形に整形しなければいけないようです．

```python

>>> letter = imread('letterF.png')
>>> letter.shape
(256, 256, 4)
```

ほほー・・・．

こんなときは Numpyの配列を変更する [numpy.transpose](https://docs.scipy.org/doc/numpy-1.14.0/reference/generated/numpy.transpose.html) で軸を変更します．


```python
img=transforms.flip(letter.transpose(2,1,0), y_flip=False, x_flip=True, copy=True)
plt.imshow(img.transpose(2,1,0))
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/135978/a67f411f-3aed-7b41-446d-4024e1050ae0.png)

できました． plt.imshow を使うときはまた `transpose` で戻さなければいけません．
# 結論
- 自分の勘違いだった（ChainerCVの仕様です）．
- （普段はグレースケールを扱っているため）カラー画像のハンドリングにはデータの構造に注意が向いていなかった．
- ドキュメントは読もう・・・．

# ちなみに

Chainerが提供しているデーターセットを提供しているAPIで得た画像はどうなってるのかをみてみましょう．

```python
>>> from chainer.datasets import cifar
>>> train_dataset, test_dataset = cifar.get_cifar10(scale=255.)
>>> example=train_dataset[0][0].astype(np.uint8)
>>> example.shape
(3, 32, 32)
```

すでにCHWの形に整形されているようですね．
サーバにGitのリポジトリ作成

# 概要
同じネットワーク配下のサーバにGitリポジトリを作成し、そこでソースを管理したい。
プロジェクトの途中からGit管理したくなったため、ローカルにある既存のソースをサーバのGitリポジトリにあげたい。

# 前提
サーバのOS：CentOS
クライアントのOS：Windows 10 Home

# 手順
## 事前準備
- WindowsであればTeraTermは必要かと（それ以外知らん）
- もちろんクライアントにもGitは必要

## インストール
TeraTermとかでサーバに接続
もともとサーバにGitとか入っていればこの手順は不要

```bash:サーバ
$ su - root
$ yum install git
$ yum install openssh-server
```

## Gitリポジトリの作成

```bash:サーバ
$ mkdir /var/foo.git        # 格納する場所はどこでも良いのかと
$ cd $_                     # $_は直前のコマンドの引数
$ git init --bare --shared  # 管理専用かつ共有のリポジトリ作成
```

## クライアント側から`push`

他の人からリモートリポジトリに何か入れてもらいたいときは、`pull`してもらってから`commit` &  `push`してもらいましょう。

```bash:クライアント
$ cd ソースを管理しているディレクトリ
$ git init
$ git commit --allow-empty -m "first commit"
$ git remote add foo ssh://[USER (今回だとroot)]@[IPaddress]/var/git/foo.git
$ git push
```
結構なプロジェクトの大きさだったので、必要なソースと不要なソースの仕分けが大変でした。。。

# まだわかっていないこと
- sshで通信しているみたいだけど、鍵とかいらないの？？
    - そもそもsshに対する理解が低い、勉強しよー
centos7にvnc接続するとアプリケーションメニューやデスクトップ背景が表示されないバグ

centos7のサーバにvnc接続する際、いつもうまくいかなくて困るので備忘として。

yumでtigervncサーバをインストールして、設定ファイルを書き直し、いざwindowsからつないでも一部表示が限られてしまう。
以下のようにアプリケーションメニューバーが表示されなかったり、デスクトップの背景が真っ黒になってしまう。

![vnc.jpg](https://qiita-image-store.s3.amazonaws.com/0/46791/35f0e2a2-b6c1-0acd-0223-8551f6b529ee.jpeg)

#tigervncの設定ファイルを書き変える

`/lib/systemd/system/vncserver@:1.service`
のServiceのところで
PAMName=login
を足すと直る。

```
...（前略）

[Service]
Type=forking
User=username
PAMName=login #←追記

...（後略）
```

として

```
# systemctl daemon-reload
# systemctl restart vncserver@:1
```

とする。

以下参考にしました：
https://www.centos.org/forums/viewtopic.php?t=65156
MMLを読んでみた。

#概要
MMLを読んでみた。

#コマンド

```
t     テンポ
l     音符
o     オクターブ
r     休符
a     ラ
b     シ
c     ド
d     レ
e     ミ
f     ファ
g     ソ
.     付点音符
<     オクターブを上げる。
>     オクターブを下げる。
```


#サンプル１

```
t110l4
r1c4d4e4f4e4d4c4
r4e4f4g4a4g4f4e4
r4c4r4c4r4c4r4c4
r4c8c8d8d8e8e8f8f8e4d4c4 
```

テンポ110音符4
休符ドレミファミレド
休符ミファソラソファミ
休符ドドレレミミファファミレド

#サンプル２

```
t190l4o4 ccggaag2 ffeeddc2 ggffeed2 ggffeed2 ccggaag2 ffeeddc2 r
```
テンポ190音符4オクターブ４
ドドソソララソ　ファファミミレレド　ソソファファミミレ
ソソファファミミレ　ドドソソララソ　ファファミミレレド　休符


#サンプル３

```
t110 l8
r4rcf4.ffedcd4.cc
r>a<cd4dddfde>a2
r4a<cd4dfg4fef4edd4
rcd4rddafg2.
```

テンポ110音符8
休符休符ドファ付点音符ファファミレドレ付点音符ドド
休符オクターブ下げ　ラ　オクターブ上げ　ドレレレレファレミ　オクターブ下げ　ラ
休符ラ　オクターブ上げ　ドレレファソファミファミレレ
休符ドレ休符レレラファソ付点音符

#tiny mml perser

|Control|	Commands|	Arguments|	Examples|
|:--|:--|:--|:--|
|Note|	C, D, E, F, G, A, B|	1, 2, 23(1/2 Note Triplet), 4, 43(1/4 Note Triplet), 8, 83(1/8 Note Triplet), 16, 163(1/16 Note Triplet), 32, 323(1/32 Note Triplet), 64, 643(1/64 Note Triplet), .(Dotted Note) +(for sharp note), -(for flat note)	|C8 D8 E-16 E16 F8. F+8.|
|Rest|	R|	1, 2, 23(1/2 Note Triplet), 4, 43(1/4 Note Triplet), 8, 83(1/8 Note Triplet), 16, 163(1/16 Note Triplet), 32, 323(1/32 Note Triplet), 64, 643(1/64 Note Triplet), .(Dotted Note) |	R2|
|Default Length	|L|	1, 2, 23(1/2 Note Triplet), 4, 43(1/4 Note Triplet), 8, 83(1/8 Note Triplet), 16, 163(1/16 Note Triplet), 32, 323(1/32 Note Triplet), 64, 643(1/64 Note Triplet), .(Dotted Note) |	L8|
|Octave|	O	|0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10|	O4|
|Octave Shift|	<, >	|	|CDEFGAB>C|
|Repeat Sign|	[, ]	|	|[[CDE]GFEDC]|
|Volume	|V|	Volume Value	|V32|
|Tempo|	T|	Tempo Value	|T120|
|User Event|	@{Event Name}	|Event Name	|@{MYEVT1} @{MYEVT2}|


以上。
PHPの配列の参照とコピーの挙動（WEB+DB PRESS Vol.103の「事業を支えるPHP」の値渡しに対する突っ込み）

https://www.amazon.co.jp/WEB-DB-PRESS-Vol-103-%E8%A5%BF%E6%9D%91/dp/4774195545/ref=pd_sim_14_2?_encoding=UTF8&psc=1&refRID=BTDQPWNWFY136VE48HCK
「WEB+DB PRESS Vol.103」の連載、「事業を支えるPHP」を読んでの突っ込みです。

※記事の内容は全体的に素晴らしいと思います。筆者と記事を貶めるような意図はありません。誤解が広まってしまうのは良くないな〜＆自分の知識を確認するのが目的です。


# 指摘したい箇所
「配列の代入や関数へ引数で渡すときには参照は渡されず、すべて配列がコピーされる挙動になります。」

```php
$array1 = ['hoge' => 'fuga'];
$array2 = $array1; // 配列がコピーされる
$array2['hoge'] = 'piyo'; // 変更は$array2に対してのみ行われる
```


# 指摘内容
問題としているのは、「コピー」についてです。
PHPにおいては、コピーオンライトという仕組みがあって、値が変更されるタイミングで初めて値がコピーされる、という仕組みがあります。

これを理解しないと、以下のような誤解が生まれがちです。

```php
// 巨大な配列
$array1 = [];
for ($i = 0; $i < 1000000; $i++) {
    $array1[$i] = $i;
}

$array2 = $array1; // 巨大な配列がコピーされるのでメモリをたくさん食う

```

実際に計測してみます。
PHPのバージョンは7.1.11です。


```php
<?php
echo "first:".memory_get_usage() / (1024 * 1024)."MB\n";

// 巨大な配列
$array1 = [];
for ($i = 0; $i < 1000000; $i++) {
    $array1[$i] = $i;
}
echo "second:".memory_get_usage() / (1024 * 1024)."MB\n";

$array2 = $array1; // 巨大な配列がコピーされるのでメモリをたくさん食う？
echo "thrid:".memory_get_usage() / (1024 * 1024)."MB\n";

```

結果
```
first:0.34778594970703MB
second:32.35179901123MB
thrid:32.35179901123MB
```
値がコピーされてない事がわかります。

次に配列の値を変更してみます。


```php
<?php
echo "first:".memory_get_usage() / (1024 * 1024)."MB\n";

// 巨大な配列
$array1 = [];
for ($i = 0; $i < 1000000; $i++) {
    $array1[$i] = $i;
}
echo "second:".memory_get_usage() / (1024 * 1024)."MB\n";

$array2 = $array1; // 巨大な配列がコピーされるのでメモリをたくさん食う？
echo "thrid:".memory_get_usage() / (1024 * 1024)."MB\n";

$array1[0] = "test";
echo "fourth:".memory_get_usage() / (1024 * 1024)."MB\n";
```
結果
```
first:0.34822082519531MB
second:32.352233886719MB
thrid:32.352233886719MB
fourth:64.356216430664MB
```
値が変更されたタイミングで配列がコピーされている事がわかります。


# 指摘修正版
というわけで、以下が正しいと思います。

「配列の代入や関数へ引数で渡すときには参照は渡されず、値が渡されます。コピーオンライトという仕組みにより、値が変更されたタイミングで配列がコピーされる挙動になります。」

```php
$array1 = ['hoge' => 'fuga'];
$array2 = $array1; // 値はまだコピーされない
$array2['hoge'] = 'piyo'; // 配列がコピーされ、変更は$array2に対してのみ行われる
```

# 所感等
マニュアルみても明示的に書いてないのと、他の言語ではあまり見られない特徴なので、誤解されがちだな〜と思います。
結論の、「参照を渡したくなるケースはほとんどないでしょう。プログラムを複雑にする原因にもなり得るので可能な限り避けると良いです。」には完全同意です。↓の記事にあるように、扱いを間違えるとパフォーマンス的にもデメリットが発生しますし、、、、
http://tanakahisateru.hatenablog.jp/entry/2013/12/12/012728

###  PHP5とPHP7
今回は配列の扱いなので関係ないですが、整数等の場合はPHP5とPHP7で挙動が違います。
PHP5までは全ての値について、今回検証した配列のような動き（コピーオンライト）をしますが、PHP7では普通に値がコピーされます。
https://www.slideshare.net/hnw/php7



###  参考
http://php.net/manual/ja/features.gc.refcounting-basics.php
http://keicode.com/cgi/object-in-php-5.php


# 2018/03/31追記
公式で捕捉いただけました
http://gihyo.jp/magazine/wdpress/archive/2018/vol103/support#supportInformation
Alexaに時間を伝えてみる

# 結論

* Alexaに時間（期間）を伝えるときは素直にAMAZON.DURATIONを使おう。
* ドキュメントとサンプルをちゃんと読もう。

# Alexaに時間を教えてみる

最初あまりドキュメント見ずにスロット増やして行けるかな？と思ったのでやってみました。

# スロットを増やして{AMAZON>NUMBER}を使ってみる

Intentのサンプル発話に↓のようなものを用意します

~~~
{hour} 時間です
{hour} 時間 {minute} です
{hour} 時間 {minute} 分 {second} 秒です
{minute} 分 です
{minute} 分 {second} 秒です
{hour} 時間 {second} 秒です
{second} 秒です
~~~

Lambda側ではとりあえず発話した時間を言ってもらうようにします。

~~~js
'TimeIntent': function () {
    const hour = this.event.request.intent.slots.hour.value;
    const minute = this.event.request.intent.slots.minute.value;
    const second = this.event.request.intent.slots.second.value;

    let hourMsg = '';
    if (!hour) {
        hourMsg = hour + '時間';
    }
    let minuteMsg = '';
    if (!minute) {
        minuteMsg = minute + '分';
    }
    let secondMsg = '';
    if (!second) {
        secondMsg = second + '秒';
    }
    this.emit(':tell', hourMsg + minuteMsg + secondMsg + 'です。');
},
'DistanceIntent': function () {
    const duration = this.event.request.intent.slots.Duration.value;
    this.emit(':tell', duration +  'キロメートルです。');
},
~~~


# しかしダメだった

テストシュミレータでいざ実行してみると

私「○○スキル開いて〜」
A「時間を教えてください」
私「1時間2分3秒です。」
A「1時間2分3秒です。」
私「1時間2分3秒」
A「1時間2分?秒です。」

こんな感じで語尾に「です」をつけなかったりするとうまくいかなくなったりします。
テストシュミレータだけではなく実機でやっても？になったりします。
そのうちこういうのもうまくできるようになると思いますが、
現状よくわからなかったので、ちゃんとドキュメント読んでAMAZON.Durationを使うことにします。

# [AMAZON.DURATION](https://developer.amazon.com/ja/docs/custom-skills/slot-type-reference.html#duration) 

このAMAZON.DURATIONは時間（期間）を発話（「1時間」とか「30分」とか）というとISO-8601の表記で認識します。
このAMAZON.DURATIONを使えば「1時間20分30秒」とかも"PT1H20M30S"と認識してくれます。
さらに「3時間半」とかいってもちゃんと"PT3H30M"と認識してくれるのはありがたいところです。
※ただし小数点は認識してくれないので１．５時間とかはダメ

とりあえず時間だけが欲しかったので、↓のような正規表現を使えば値は取得できます。

[String.prototype.match()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/match)

~~~js
function parser(m, length) {
    if (m.length < length) {
        return '';
    } else if (!m[length - 1]) {
        return ''
    } else {
        return m[length - 1].slice(0, -1);
    }
}

const duration = this.event.request.intent.slots.Duration.value;
const m  = duration.match(/(^PT)(\d+H)?(\d+M)?(\d+S)?/);

const hour = parser(m, 3);
const minute = parser(m, 4);
const second = parser(m, 5);
~~~

正規表現の"PT"以降が時刻になるため、例えば「1時間2分3秒」だと1と2と3が取れます。
ただし、「1年2ヶ月3日4時間5分6秒」とか言われると"P"が先頭になるので日時が欲しい場合は正規表現を変える必要があります。
word2vecのベクトルを回転させて要素に意味を持たせる

# はじめに
word2vecで有名になったように、単語のベクトル空間への埋め込みは様々な分野で広く使われています。
しかし、多くの手法で埋め込んだ先のベクトルの各要素の意味付けは特に意識されていません。
例えば、「日本」を300次元のベクトル空間み、173番目の要素の値が大きくなっていたとします。しかし173番目の軸が何を意味するか分からないので、そこから「日本」という単語に対する何の洞察も得ることが出来ません。

ということで今回は

+ [Rotated Word Vector Representations and their Interpretability](http://aclweb.org/anthology/D17-1041)

という論文を紹介します。

単語ベクトルを回転させて、単語ベクトルの各要素に解釈しやすい意味を持たせるという手法です。

日本語の単語ベクトルを使用して簡単な実験を行い、ベクトルの要素の意味がどれほど分かりやすくなるか観察してみました。

# 手法概略
## 定式化
手法は極めてシンプルです。

```math
n:単語数 \\
k:単語の埋め込み先の次元 \\
A:単語ベクトル群 (n × k の行列 ) \\
T:学習対象の回転行列 (k × k の行列) \\
```
として

```math
B = AT
```
という形で新しい単語ベクトル群$B$を作ります。
この時、新しい単語ベクトルの各要素が「分かりやすく」なるように次のような誤差関数$f(B)$を考え、この$f(B)$を最小化するように$T$を学習します。

```math
f(B) = (1 − κ) \sum_{i=1}^n\sum_{j=1}^k\sum_{l=1, l\neq j}^k b_{ij}^2 b_{il}^2 + \\
κ \sum_{i=1}^k\sum_{j=1}^n\sum_{l=1, l\neq j}^n b_{ji}^2 b_{li}^2 
```
ここで$b_{ij}$は$B$の各要素で$κ$はハイパーパラメータです。
$f(B)$の第1項の$b_{ij}^2 b_{il}^2$は、$b_{ij}^2$または$b_{il}^2$のどちらかが0に近ければ小さくなります。つまり、この部分を最小化するには **各単語ベクトルで絶対値の大きい要素をできるだけ少なくする** ことになります。また、同様に第2項は **ベクトルの同じ要素の絶対値が大きくなる単語をできるだけ少なくする** と小さくなります。
つまり、$f(B)$を最小化すると、

+ 単語ベクトル内で絶対値の大きい要素は少なくなり
+ 同じベクトル要素が大きい単語は意味的に似た単語のみ

であるような単語ベクトルが得られることが期待できます。
ベクトルのある軸の値が大きい単語を集めてくれば、その軸の意味が推定できることになります。

## この手法の利点
PCAなどを利用しても、有用な軸を見つけて、似たような単語のマッピングなどはできますが、本手法の利点は

+ 単語ベクトルの次元
+ 単語ベクトルのノルム

を変更せずに、意味が分かりやすい軸をとって単語をマッピングできることにあります。

## 英語での実験結果
論文では次のような実験結果が紹介されていました。
単語ごとに単語ベクトルの要素をヒートマップ化したものです。

### 回転前の単語ベクトル
![before.png](https://qiita-image-store.s3.amazonaws.com/0/183955/014e98c8-4479-eeca-ab9c-75886cbc5655.png)


### 回転後の単語ベクトル
![after.png](https://qiita-image-store.s3.amazonaws.com/0/183955/2cbeb084-4e87-4a67-83d2-bbe446f69615.png)

本手法によって単語ベクトルの回転を行うと、「国家」を現す軸と「役職」を現す軸が分かりやすく強調されるのが観察できます。

# 日本語での実験
日本語の単語ベクトルでも同じようなことが出来るのか実験してみました。
回転前の単語ベクトルとして、[fasttext](https://github.com/facebookresearch/fastText)の学習済みモデルから700000単語分サンプリングしてきて使用しました。
回転行列の学習は[著者らのコード](https://github.com/SungjoonPark/factor_rotation)を若干修正して実行しました。

## 実験結果
![ja2.png](https://qiita-image-store.s3.amazonaws.com/0/183955/3415f6c9-e1cb-f8fc-b741-2fc2a764ee39.png)

論文に紹介されていた英語の結果ほどきれいな結果は出ませんでした。
しかし、上の図のように、意味が分かりやすい軸もいくつか確認できました。
（「中国」という単語には「国家」「アジア」「大国」など複数の意味的要素があるはずで、上で紹介した論文の結果は若干きれいすぎる気がします。陽には記載されていませんでしたが、もとの単語ベクトルとして、図に記載されている10単語のみしか使用していないのかもしれません。）

# まとめ
各軸に意味を持たせるような、単語ベクトルの回転方法を紹介しました。
日本語の単語ベクトルで簡単な実験を行い、回転後のベクトルのいくつかの軸に意味が見出せそうであることを確認しました。
本手法を用いれば、単語ベクトルを用いる種々の手法の解釈性がより高まると期待できます。
PypeRを使ってみた

データ分析、機械学習はできるだけpythonを使いたいが、Rにもpythonにはない便利なライブラリがたくさんありそうなので、pythonからRをコールできるPypeRなるものを使って見ました。
(当方はRを全く使ったことがありません...)



## インストール
```
pip install pyper
```

## さっそく使ってみる
(以下は全てjupyter上で実行しています。)
使い方は下記のように `pyper.R()` でRと連携するためのインスタンスを生成する訳ですが、

```python
import pyper
r = pyper.R()
```
ここで、`FileNotFoundError: [Errno 2] No such file or directory: 'R'`とエラー発生。
当たり前ですが、PypeRはRがインストールされてないと使えません。

以下のRの公式から自分のOSにあったものをインストールします。
https://cran.r-project.org/

インストール後に上記の `r = pyper.R()` が実行できました。

基本的な使い方は `r` インスタンスにRのコードを文字列として渡せばよさそうです。

```python
import pyper
r = pyper.R()
r("a <- 10")
print(r("a"))
# 結果
#　try({a})
#[1] 10

r("b <- 5")
print(r("a + b"))
# 結果
# try({a + b})
# [1] 15
```

### pythonとRの連携
python側で作ったデータをR側に渡してみたり、R側で作ったデータをpython側に渡してみたりしてみました。

```python
%matplotlib inline
import pyper
import numpy
import pandas as pd
import pylab

# テキトーに乱数生成
n = 500
x = numpy.random.normal(0, 10, n)
y = numpy.random.normal(0, 10, n)

# DataFrameにする
df = {"X":x, "Y":y}
df =pd.DataFrame(df)

# pandasのオブジェクトをRで扱えるようにするためには、Rのインスタンス生成時に use_pandas='True'とすればよい
r = pyper.R(use_pandas='True')

# assignでR側に渡せる。R側でp_dfという名前の変数に格納する
r.assign("p_df", df)

# Rのsummary関数を使ってみる
print(r("summary(p_df)"))

# 出力結果
# try({summary(p_df)})
#       X                  Y           
# Min.   :-32.0217   Min.   :-29.2819  
# 1st Qu.: -6.8550   1st Qu.: -5.6983  
# Median :  0.4881   Median :  0.6689  
# Mean   : -0.2023   Mean   :  0.4956  
# 3rd Qu.:  6.4794   3rd Qu.:  6.7526  
# Max.   : 30.3544   Max.   : 35.7937


# R側で一様分布で乱数生成
r("rx<-runif(500)")
r("ry<-runif(500)")

# データ確認
print(r("rx"))
# 出力結果
# try({rx})
#  [1] 0.353890137 0.615198821 0.010748096 0.478154085 0.544522429 0.325331500
#  [7] 0.241592549 0.406167952 0.545199827 0.572310302 0.168604882 0.058046145
# [13] 0.817028393 0.889809545 0.079517531 0.115438325 0.645908994 0.145381259
# [19] 0.078100969 0.681751758 0.942462240 0.853835860 0.125521639 0.457782591
# 〜省略〜

# getでR側のデータを持ってこれる
px = r.get("rx")
py = r.get("ry")

# データ確認
print(px)

# 出力結果（配列で受け取れる）
# [7.93217696e-01 5.71642368e-01 5.36547413e-01 7.68226223e-01
#  6.99345491e-01 9.46375013e-01 8.22113833e-01 3.74321974e-01
#  7.93484389e-02 8.19715370e-01 2.72596319e-01 3.05332547e-01
#  2.40291854e-01 7.22588932e-02 8.99772479e-01 8.73717549e-01
# 〜省略〜

# R側で生成したデータをpython側でプロットして表示
pylab.scatter(px, py, marker=".", linewidths="0")
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/240999/01b8bae2-e922-6b40-b023-ae676cc8bfe0.png)

なんとなく使い方がわかったような気がしました。

## 参考
ほとんど以下の方達の写経でした。とてもわかりやくまとめられています。

Python と R で連携する
https://qiita.com/ynakayama/items/f84dc659f1337d71dd9e

Python + PypeRでPythonからRをつかってみる
http://mia-0032.hatenablog.jp/entry/2013/08/30/000000
【機械学習】パラメータチューニングについて

<br>
今回はパラメータチューニングについてまとめます。

# パラメータチューニングとは
パラメータとは機械学習モデルにおける設定値や制限値のこと（ハイパーパラメータとも）。
モデルが最適解を出せるパラメータを走査し、設定することをパラメータチューニングという。


# パラメータチューニングの種類
ここでは代表的なチューニング方法として２種についてまとめます。

## グリッドサーチ
あらかじめパラメータの候補値を指定し、その候補パラメータを組み合わせて学習を試行することにより最適なパラメータを走査する方法。

## ランダムサーチ
パラメータの設定範囲および試行回数を指定し、指定値範囲内から無作為に抽出したパラメータにより学習を試行することにより最適なパラメータを走査する方法。


# パラメータチューニングの実践
sklearnのサンプルデータセットを用いて、パラメータチューニングを実践する。
使用モデルはランダムフォレスト。

ランダムフォレストモデルにおける n_estimators パラメータの初期値は10。
そのパラメータについて、

①　10,20,30,...100 までの数値の中で最も優れたパラメータを使用する（グリッドサーチ）
②　1~100 までの数値からランダムに抽出した10の数値の中で最も優れたパラメータを抽出する（ランダムサーチ）

という２種のチューニングを行う。 


```python:パラメータチューニングの実践
import pandas as pd
import numpy as np
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import RandomizedSearchCV
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score


# データの準備、および分割
dataset = load_breast_cancer()
X = pd.DataFrame(dataset.data, columns=dataset.feature_names)
y = pd.DataFrame(dataset.target, columns=['target'])
train_x, test_x, train_y, test_y = train_test_split(X, y)


# グリッドサーチ(パラメータ候補指定)用のパラメータ10種
paramG = {'n_estimators':[1, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100]}
# ランダムサーチ(パラメータ範囲指定)用のパラメータ 1~100
paramR = {'n_estimators':np.arange(100)}

# モデル生成。上から順に、通常のランダムフォレスト、グリッドサーチ・ランダムフォレスト、
# ランダムサーチ・ランダムフォレスト。
RFC_raw  = RandomForestClassifier(random_state=0)
RFC_grid = GridSearchCV(estimator=RandomForestClassifier(random_state=0), param_grid=paramG, \
                        scoring='r2', cv=3)
RFC_rand = RandomizedSearchCV(estimator=RandomForestClassifier(random_state=0), param_distributions=paramR, \
                        scoring='r2', cv=3)

# 各モデルに学習を行わせる。
RFC_raw.fit (train_x, train_y.as_matrix().ravel())
RFC_grid.fit(train_x, train_y.as_matrix().ravel())
RFC_rand.fit(train_x, train_y.as_matrix().ravel())

# 各モデルの n_estimators パラメータの確認。
print('通常のランダムフォレストモデルにおける n_estimators         :  %d'  %RFC_raw.n_estimators)
print('グリッドサーチ・ランダムフォレストモデルにおける n_estimators   :  %d'  %RFC_grid.best_estimator_.n_estimators)
print('ランダムサーチ・ランダムフォレストモデルにおける n_estimators  :  %d'  %RFC_rand.best_estimator_.n_estimators)

###出力結果###
通常のランダムフォレストモデルにおける n_estimators           :  10
グリッドサーチ・ランダムフォレストモデルにおける n_estimators     :  100
ランダムサーチ・ランダムフォレストモデルにおける n_estimators    :  66

# 各モデルにより算出される予測値
print('通常のランダムフォレストモデルによる予測値         :  %.3f'  %r2_score(test_y, RFC_raw.predict(test_x)))
print('グリッドサーチ・ランダムフォレストモデルによる予測値   :  %.3f'  %r2_score(test_y, RFC_grid.predict(test_x)))
print('ランダムサーチ・ランダムフォレストモデルによる予測値  :  %.3f'  %r2_score(test_y, RFC_rand.predict(test_x)))

###出力結果###
通常のランダムフォレストモデルによる予測値           :  0.762
グリッドサーチ・ランダムフォレストモデルによる予測値     :  0.881
ランダムサーチ・ランダムフォレストモデルによる予測値    :  0.851
```

上記プログラムにより、グリッドサーチでは n_estimators=100　が最も優れたパラメータだと判定し、ランダムサーチでは n_estimators=66 が最も優れたパラメータだと判定したことがわかる。


このようにパラメータをチューニングすることで、より優れたモデルを生成することができるようになる。

以上。
[Ruby]配列オブジェクトには配列も入るようだ

#配列には配列も入る
配列オブジェクトがようやく理解できてきたと思ったら、、こんなややこしい配列があるのを知ってショックなのでメモっとく。

```
arr = [1, 2, 3, [4, 5], [6, [7, 8]]]
```

なんてこった、やっと理解できてきたのにこんなややこしいのがあるのか。。

***

ちなみに、
4,5を読み出したいなら、こう書く

```
p arr[3]
=>[4, 5]
```

6,7,8なら、こう書く

```
p arr[4]
=>[6, [7, 8]]
```

7,8なら、こう

```
p arr[4][1]
=>[7, 8]
```

8なら、こうって

```
p arr[4][1][1]
=> 8
```

今、オレの配列理解度は何合目なんだろう。。
【初学者向け】Python 基礎2  ブロックとfor文if文

#これまで

[・インストール方法](https://qiita.com/ryo_xsjsj/items/673d284cc360a7dde02c)
[・Pythonプログラムの作成＆実行](https://qiita.com/ryo_xsjsj/items/edc7331db907072e7fec)
[・【初学者向け】Python 基礎1 関数定義と呼び出し](https://qiita.com/ryo_xsjsj/items/c0b64f3679da9d168aaa)

初学者向けのためのご参考。
間違いやもっと良い方法などありましたらご指摘頂けると嬉しいです。

▽環境
Python 3.6.4

#ブロックについて

PythonではJavaなどで書く{}はインデントで表す。
他の言語ではインデントはあくまで人間が理解し易いようにする為であるが、Pythonでは意味がある事に注意。

```java:main.java
public static void main(String[] args){
    System.out.println("考える前に");
}
```

```python:main.py
def main():
    print('行動')
```

**インデントとはタブ？空白4文字？2文字?**
空白が全くないと「IndentationError: expected an indented block」エラーが発生するが1文字でも空白があるとPGM上は動作するようだ。

Pythonのコーディング規約[PEP8](http://pep8-ja.readthedocs.io/ja/latest/)では空白4文字を推奨している。

#for文

```python:for1
for i in 'する!':
    print(i)
```

```:結果
す
る
!
```

```python:for2
for i in range(5):
    sys.stdout.write('i=%s ' %(i))
```

```:結果
i=0 i=1 i=2 i=3 i=4
```
range関数についてはここが詳しい
[【Python入門】range関数で繰り返し処理をする方法とは?](https://qiita.com/Morio/items/36237f0cdd8749aac20f)

#if文

```python:if1
for i in range(10):
    if (i == 1) or (i == 3):
        i = 0
    elif (i == 2):
        i = 9
    elif (i == 6):
        break # 直近のループを抜ける
              # continue で次のループへ
    else:
        i = '*'
    sys.stdout.write('i=%s ' % i)
```

```:結果
i=* i=0 i=9 i=0 i=*
```

| 論理演算子    |   意味      |
|:-------------|:------------|
| and          | かつ        |
| or           | または      |
| not          | 真偽値反転   |
Apple clang の include path 

こんにちは。
Apple clang のデフォルトの include path は、バージョンによって(?)、```/usr/local/include``` を見に行かないようです。その場合、環境変数を設定すれば良さそうです（調査中）。なお、clang-9.0.0 はデフォルトで見に行きます。

```console
$ export C_INCLUDE_PATH=/usr/local/include
$ export CPLUS_INCLUDE_PATH=/usr/local/include
$ gcc -v
Apple LLVM version 8.0.0 (clang-8.0.0.8000042)
```
railsのmodel編集中に出たNoMethodError

モデルの編集中に起きたエラーです。
新しくpost_commentというモデルを作成し、user.rbにhas_manyの定義を加えたところ…

![スクリーンショット 2018-03-21 16.36.36.png](https://qiita-image-store.s3.amazonaws.com/0/213284/79de17b2-713d-5413-ed36-f3105b997a09.png)

/var/lib/gems/2.3.0/gems/activerecord-5.1.5/lib/active_record/associations/builder/association.rb:54:in `build_scope': undefined method `arity' for :post_comments:Symbol (NoMethodError)

定義をコメントアウトし、さらにrails sすると…


Migration Pending Error




単にマイグレーションのし忘れで、新しく書いたモデルを読み取ってもらえなかったようです。。
AWS用語集

# この記事の目的

AWSを使うにあたって調べた用語の意味をまとめる場所。

# VPC

Virtual Private Cloud (VPC)の略でAWSで何かをする際の自分の領域。IPv4アドレスの範囲を Classless Inter-Domain Routing (CIDR) ブロックの形式で指定する必要がある。IPv4はIPアドレスのことでCIDRはその表記方法ぐらいに把握していればok。

# アベイラビリティーゾーン

障害が起こった際に影響を限定するためにAWSでは影響範囲をアベイラビリティーゾーンというもので区切っている。

# サブネット

アベイラビリティーゾーンにつき一つあるものでVPCの小さい区切り。

# インターネットゲートウェイ

>インターネットゲートウェイは、VPC のインスタンスとインターネットとの間の通信を可能にする VPC コンポーネントであり、冗長性と高い可用性を備えており、水平スケーリングが可能です。そのため、ネットワークトラフィックに課される可用性のリスクや帯域幅の制約はありません。

>インターネットゲートウェイは 2 つの目的を果たします。1 つは、インターネットでルーティング可能なトラフィックの送信先を VPC のルートテーブルに追加することです。もう 1 つは、パブリック IPv4 アドレスが割り当てられているインスタンスに対してネットワークアドレス変換 (NAT) を行うことです。

https://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/VPC_Internet_Gateway.html

# ルートテーブル

サブネットやVPCに対してルートを設定する

# セキュリティーグループ 

>セキュリティグループは、インスタンスの仮想ファイアウォールとして機能し、インバウンドトラフィックとアウトバウンドトラフィックをコントロールします。VPC 内でインスタンスを起動した場合、そのインスタンスには最大 5 つのセキュリティグループを割り当てることができます。セキュリティグループは、サブネットレベルでなくインスタンスレベルで動作します。このため、VPC 内のサブネット内のインスタンスごとに異なるセキュリティグループのセットに割り当てることができます。起動時に特定のグループを指定しないと、インスタンスは VPC のデフォルトのセキュリティグループに自動的に割り当てられます。

https://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/VPC_SecurityGroups.html
VSCodeに古いバージョンのExtensionをインストールする方法

VSCodeを使っているとExtensionを最新版アップデートをした後、以前のバージョンに戻したくなることもあるかと思います。この記事では古いバージョンのExtensionをインストールする方法について書きます。

# 方法
VSCodeのExtensionインストールからは最新バージョンしかインストールできません。そのため、ソースコードをビルドしてローカルでインストールする方法をとります。

## 前提条件
古いバージョンのExtensionのソースコードをダウンロードするので、ソースコードがGithubなどで公開されている必要があります。大抵のExtensionはGithubで公開されていると思います。

## 前準備
ソースコードをビルドする際に `npm` を使うので、[Node.js](https://nodejs.org/ja/)をインストールしておいてください。

## ダウンロード
ここからは `vscode-ruby` の `v0.16.0` (執筆時点で最新版は`v0.17.0` )のインストールを例に解説していきます。まず Github の [リリースページ](https://github.com/rubyide/vscode-ruby/releases) から各バージョンのソースコードをダウンロードします。(zipとtar.gzがありますが、どちらでも問題ないです。念のため)

ダウンロードしたソースコードは解凍して、 extension用フォルダに配置します。extension用フォルダはOSごとにパスが違います。

- macとLinuxの場合は `$HOME/.vscode/extensions` 
- windowsの場合は `%USERPROFILE%\.vscode\extensions`

となります。私はmacを使っているので `$HOME/.vscode/extensions` に配置します。

```sh
mv ~/Downloads/vscode-ruby-0.16.0 ~/.vscode/extensions
```

## ビルド
ソースコードのフォルダに移動してビルドを行います。ソースコードのビルドは基本的に `vscode:prepublish` というnpm-scriptsを実行することでできます。
(一部のExtensionはビルドが必要ありません。その場合はソースコードをExtension用フォルダに配置した後、VSCodeを再起動すればインストール完了です。 `package.json` の `scripts` に `vscode:prepublish` が定義させれていなければビルドが必要ないとみなして良いと思います。)

まずはビルドを行うために必要な node_modules をインストールします。

```sh
cd ~/.vscode/extensions/vscode-ruby-0.16.0
npm install
```

次にビルドを実行します。

```sh
npm run vscode:prepublish
```

## 完了
ビルドが終わったら VSCode を再起動するとExtensionのインストールが完了です。

`vscode-ruby` の 0.16.0 がインストールできました。
![Screen Shot 2018-03-21 at 16.27.35-2.png](https://qiita-image-store.s3.amazonaws.com/0/59150/7f2ef873-098e-c41d-0e76-58815d2713bb.png)

# おまけ

VSCodeはデフォルトではExtensionのアップデートが自動で行われますが、意図せずExtensionが最新バージョンに上がってしまうのを防ぐために `extensions.autoUpdate` を `false` にしておくと良いです。Changelogを確認した上でバージョンをあげましょう。
RaspberryPi2/3 Raspbian Stretchでlircを使って赤外線受信する

#概要
RaspberryPi2で赤外線受信してプログラム実行したくて色々しらべていたところ、どうもLIRCの古いver由来なのか情報に混乱があったので、自分の備忘録をかねて記録。
赤外線リモコンのボタンでWebカメラのシャッターを切ってみる。

##想定環境

```
$ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description:    Raspbian GNU/Linux 9.3 (stretch)
Release:        9.3
Codename:       stretch
```
LIRC : 0.9.4c
受信機 : [OSRB38C9AA](http://akizukidenshi.com/catalog/g/gI-04659/) 
送信機 : 秋月電子でうっていた300円の13キーリモコン [OE13KIR](http://akizukidenshi.com/catalog/g/gM-07245/) 

ウェブカメラ: Logicool C920r
撮影用プログラム fswebcam : 20140113


#インストールと初期設定
```
sudo apt install lirc
```
OSRB38C9AA は正面左から1:VOUT, 2:GND, 3: Vccなので、2,3をGNDおよび5Vに配線。
ブレッドボード用T型コネクタの位置関係的に使いやすかったので IO21 を VOUTとした。

##config.txtへの設定記述
```:/boot/config.txt
dtoverlay=lirc-rpi
dtparam=gpio_in_pin=21
```

/boot/config.txtに上記を追記し、lircの使用を宣言する。
**※ググった際にconfig.txtの記述が「dtoverlay=lirc-rpi,gpio_in_pin=21」のようになっていたり、/etc/lirc/harware.confの記述のある記事はLIRC古いverやOSがRaspbian Jessie以前のものだとおもわれるので注意して読んだ方がいい**

ここまで書いたところで一旦 reboot する。
再起動後に、mode2 -d /dev/lirc0 としてリモコンのボタンをおし、何らかの反応が返ってくれば、とりあえず動作しはじめているはず。

#リモコンコマンドの登録
irrecordコマンドでリモコンボタンの内容を設定ファイルとして書き出せる。
こちらもverによって記述がちがうこと、押し方のタイミングなどで何度かのリトライが必要だった。

設定ファイル群は/etc/lirc内に点在しているが、最初に/etc/lirc/lircd.conf.d/のなかにあるdevinput.lircd.confを真っ先に使えない状態にしておくのがよい。
devinput.lircd.disableというファイル名にした。
lircd.confの中の記述で、/etc/lirc/lircd.conf.d/*.conf がincludeされるようになっているが、devinputセクションは1つしか許されてない様子(未検証)。

##lircd.confへボタンのコードを追加する
irrecord -n -d /dev/lirc0 hoge.confなどとすることでインタラクティブに設定ファイルを作ってくれるが、手元ではできたファイルをコピーしただけでうまく動かなかったので先人の記録をもとに手修正した。

```/etc/lirc/lircd.conf
include "lircd.conf.d/*.conf"

begin remote
  name  OE13KIR
  bits           32
  flags SPACE_ENC|CONST_LENGTH
  eps            30
  aeps          100

  header       9061  4474
  one           603  1649
  zero          603   528
  ptrail        597
  repeat       9071  2217
  gap          108140
  toggle_bit_mask 0x0
  frequency    38000
      begin codes
          a                        0x08F71FE0
          b                        0x08F71EE1
          c                        0x08F71AE5
          #(ry
      end codes
end remote
```

##登録したボタンが正しく認識されているか確認
ここまでの設定をして、lircを再起動し irw を実行すると何ボタンを押したのかをコンソールで確認できるようになる。

```
~ $ irw
0000000008f71fe0 00 a OE13KIR
0000000008f71fe0 01 a OE13KIR
```

#リモコンボタンにコマンドを割り当てる
lircrcなるファイルに記述するとあるが、どこで設定すればいいかわからないので調べたところ下記ファイルがあった。

```
$ ps aux|grep irexec
root       335  0.0  0.2   4208  2096 ?        Ss   15:23   0:00 /usr/bin/irexec /etc/lirc/irexec.lircrc
```

というわけで /etc/lirc/irexec.lircrc  に下記のような記述を追加。

```: /etc/lirc/irexec.lircrc
begin
  prog = irexec
  button = a
  config = fswebcam -r 640 /images/1.jpg
end

begin
  prog = irexec
  button = b
  config = fswebcam -r 1600 /images/2.jpg
end
```

再起動し、リモコンでボタンを押したら撮影できた。
CERT C入門(2) Rule 02. Declarations and Initialization (DCL)

# 基本事項
CERT C入門(1) Rule 01. Preprocessor (PRE)
https://qiita.com/kaizen_nagoya/items/8d2cb4158ed53d5a0a28
参照のこと。

CERT Cは、頻繁に構造が変わることがある。ここに記載したURLは、
2018年3月22日（水）現在のものだる。URLが繋がらなければ、見出しの文字で検索してください。

# Rule 02. Declarations and Initialization (DCL)
https://wiki.sei.cmu.edu/confluence/pages/viewpage.action?pageId=87152215

## DCL30-C. Declare objects with appropriate storage durations
https://wiki.sei.cmu.edu/confluence/display/c/DCL30-C.+Declare+objects+with+appropriate+storage+durations

### dlc30非適合例

```dlc30n.c
#include <stdio.h>
  
const char *p;
void dont_do_this(void) {
  const char c_str[] = "This will change";
  p = c_str; /* Dangerous */
}
 
void innocuous(void) {
  printf("%s\n", p);
}
 
int main(void) {
  dont_do_this();
  innocuous();
  return 0;
}
```
誤り(error)も警告(warning)も出ず、そのままコンパイル・実行できる例

```
$./cert.sh dlc30n
clang dlc30n.c
This will change
gcc-6 dlc30n.c
```
$記号は入力促進記号(prompt)です。＄の文字を入れる必要はありません。

LLVM/clangとgcc6とで実行結果が違う。

なお、ここで利用しているシェルスクリプトは
コンパイル用shell script
https://qiita.com/kaizen_nagoya/items/74220c0577a512c2d7da

###dlc30適合例

```dlc30c.c
#include <stdio.h>
 

void this_is_OK(void) {
  const char c_str[] = "Everything OK";
  const char *p = c_str;
  /* p is inaccessible outside the scope of string c_str */ 
  printf("%s\n", p);
}
 
int main(void) {
  this_is_OK();
  return 0;
}
```

```shell
$ ./cert.sh dlc30c
clang dlc30c.c
Everything OK
gcc-6 dlc30c.c
Everything OK
```
### DLC30適合例2

```dlc30c2.c
#include <stdio.h>

const char *p;
void is_this_OK(void) {
  const char c_str[] = "Everything OK?";
  p = c_str;
  /* ... */
  printf("%s\n", p);
  p = NULL;
}
 
int main(void) {
  is_this_OK();
  return 0;
}
```

```shell
$ ./cert.sh dlc30c2
clang dlc30c2.c
Everything OK?
gcc-6 dlc30c2.c
Everything OK?
```

###dlc30非適合例2

```dlc30n2.c
#include <stdio.h>
  
char *init_array(void) {
  char array[10];
  /* Initialize array */
  return array;
}

int main(void) {
  char * p = init_array();
  printf("%s\n", p);
  return 0;
}
```

```shell
$ ./cert.sh dlc30n2
clang dlc30n2.c
dlc30n2.c:6:10: warning: address of stack memory associated with local variable 'array' returned [-Wreturn-stack-address]
  return array;
         ^~~~~
1 warning generated.

gcc-6 dlc30n2.c
dlc30n2.c: In function 'init_array':
dlc30n2.c:6:10: warning: function returns address of local variable [-Wreturn-local-addr]
   return array;
          ^~~~~
(null)
```
警告はclang/llvm, gccで類似だが実行結果が違う。
＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
# 文書履歴(document history)
ver. 0.01 初稿 　20180311
ver. 0.02 ありがとう追記　20230513
## 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
Unity Hubの機能

# はじめに
[Unityインストール手順(2018年3月版)](https://qiita.com/cs1000/items/b902c8012033756d3964) にてUnity Hubを使用したUnityのインストール方法を記載しましたが、今回はUnity Hubの機能について説明します。

# Beta版のインストール
Beta版インストーラは[Unity Beta Program](https://unity3d.com/jp/unity/beta)からダウンロードできますが、Unity Hubを使用してインストールすることができます。

[Installs] - [Beta Releases]からインストールしたいBeta版の「Download」ボタンをクリックしてインストールします。
![Beta版インストール](https://qiita-image-store.s3.amazonaws.com/0/242340/746982ce-60d3-4a48-2ee6-e2f47627a95a.png)
(バージョンに「b」が付いているものがBeta版です)
画面の指示に従ってインストールを進めます。

# Unityのアンインストール
[Installs] - [On my machine]からアンインストールしたいバージョンの「･･･」をクリックし、表示されたダイアログの「Uninstall」をクリックします。
![アンインストール](https://qiita-image-store.s3.amazonaws.com/0/242340/57080ee8-210b-d388-dcae-9bbc77885328.png)
画面の指示に従ってアンインストールを進めます。

# デフォルトバージョンの切り替え
デフォルト(優先)バージョンを設定するとプロジェクトの新規作成時にそのバージョンで作成されたり、そのバージョンでチュートリアルが開始されます。
バージョン名の後ろに「preferred」と付いているものがデフォルトのバージョンです。

[Installs] - [On my machine]からデフォルトにしたいバージョンの「･･･」をクリックし、表示されたダイアログの「Set as preferred」をクリックすると切り替えることができます。
![preferred切り替え](https://qiita-image-store.s3.amazonaws.com/0/242340/f1b31718-a427-3dda-b7ed-ddf899b7caed.png)

# プロジェクトを開く際のバージョン指定
プロジェクト一覧の各プロジェクト名の下にそのプロジェクトを作成or最後に保存したプロジェクトのバージョンが表示されます。
![プロジェクトのバージョン](https://qiita-image-store.s3.amazonaws.com/0/242340/d6ddfaa9-ec14-f27d-6af9-d77b3d8a6d60.png)
(Unity Hubアプデしたら広告出るようになった...)

プロジェクト名をクリックするとそのバージョンのUnity Editorが起動しますが、Unity Hubから起動させたいUnityのバージョンを指定することができます。

[プロジェクト]から開きたいプロジェクトの「･･･」をクリックし、表示されたダイアログから開きたいバージョンの「Open with バージョン番号」をクリックするとそのバージョンのUnity Editorが起動します。
(インストール済みのバージョンのみ表示されます)
![開くバージョンの指定](https://qiita-image-store.s3.amazonaws.com/0/242340/3629f0ca-1da3-099d-0ad0-98a3a34cffec.png)
※プロジェクトの保存バージョンと指定したバージョンが一致していない場合、以下の様な警告が表示されます。
「Continue」ボタンを選択すると指定したバージョンで開きますが、そのバージョンでサポートされていない機能が含まれているとエラーが発生したり正常に動作しないことがあるので注意が必要です。
![バージョン不一致の警告](https://qiita-image-store.s3.amazonaws.com/0/242340/214e3b42-3bd5-78dc-159a-7264a14615bd.png)

# ビルドサポート系Componentの追加
各プラットフォームのビルドサポートComponentを追加していない場合、そのプラットフォーム向けのビルドができません。
Unityインストール時に追加するComponentの指定したり、Unity Editorからダウンロードできますが、Unity Hubからも追加することができます。

[Installs] - [On my machine]からComponentを追加したいバージョンの「･･･」をクリックし、表示されたダイアログの「Add Component」をクリックすると追加するComponentを指定するダイアログが表示されます。
![Add Component](https://qiita-image-store.s3.amazonaws.com/0/242340/dedc1502-1e43-65d0-8f37-e5661862a685.png)
![Componentの選択](https://qiita-image-store.s3.amazonaws.com/0/242340/178c0945-06a4-4812-5445-9d3b8402f908.png)
追加したいプラットフォームにチェックを入れて「Done」ボタンをクリックするとビルドサポートComponentが追加されます。

ビルドサポートComponent以外にもMonoDevelop(Unity2017まで)やStandard Assets、サンプルプロジェクトを追加することもできます。

# 最後に
Unity Hubは記事投稿時点でBeta版ですので、今後は機能が追加されたり削除される可能性があります。
と言ってもインストールやアンインストール、バージョン指定などがUnity Hubだけで行えるようになったのは便利だと思いますので、今後の機能追加に期待したいです。

おわり
[jQuery] イベントが走らない？（動的生成でハマったこと）

## onChangeイベントが走らないぞ…
「input要素にちゃんとclass指定してjQueryでonChangeイベントの処理書いてるのに何も動かんぞ…？」
と最近ハマったので備忘録まで。

### その1. cloneした要素
「追加」「削除」ボタンで、ある要素を増やしたり減らしたりするような処理を書いていたケース。
「追加」の場合は元要素を`clone`していました。

```js:clone処理
var baseObj = $('.hogehoge:last');
if ( baseObj.length == 0 ) return;

//クローン作成
var cloneObj = baseObj.clone();
```

ところが、元々表示されていた要素ではイベントが発生するのに、「追加」した要素ではイベントが発生しません。
調べたところ、[イベントもコピーするには`clone`の引数に`true`を指定する必要がありました](http://semooh.jp/jquery/api/manipulation/clone/true/)。

```js:clone処理改
//クローン作成
var cloneObj = baseObj.clone(true);
```

### その2. 新たに生成した要素
動的な表示切り替えのため、例えば`class="fugafuga"`を持った要素をつくりなおすような処理を書いていたケース。
いつものようにclass指定でonChangeイベントを記述していました。

```js:onchange処理
$('.fugafuga').on('change', function(){
    //....
}
```

ところが、こちらもイベントが発生しません。
やはり調べた結果、[動的生成した要素のイベントは以下のように記述する必要がありました](http://hayeta.hatenablog.com/entry/2017/09/29/%E3%80%90Javascript%E3%80%91%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9%E3%81%AEonchange%E3%81%A7%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%81%8C%E7%99%BA%E5%8B%95%E3%81%97)。

```js:onchange処理改
$(document).on('change', '.fugafuga', function(){
    //....
}
```
react native memo (Mac High Sierra)



# Getting Started

[cd AwesomeProject](https://facebook.github.io/react-native/docs/getting-started.html)




Install Node, Watchman

```
brew install watchman
```

## install react-native-cli

`npm install -g react-native-cli`



## install  Xcode

Xcodeが入ってない場合には入れる

## Creating a new application

```
react-native init AwesomeProject
```


## Running your React Native application


```
cd AwesomeProject
react-native run-ios

```


シミュレーターが無事に起動しました。

![Kobito.BQjTnq.png](https://qiita-image-store.s3.amazonaws.com/0/49910/a75280ee-9164-7b5d-bf94-39b1ec003555.png "Kobito.BQjTnq.png")


app.jsをちょっと変えて保存、Ctrl+Rで再読み込みしてみる。

```js:app.js
    return (
      <View style={styles.container}>
        <Text style={styles.welcome}>
          Welcome to React Native!! Year!!

```


変わりました

![Kobito.gU33dT.png](https://qiita-image-store.s3.amazonaws.com/0/49910/976aa9f4-5d2a-3b29-7270-0720946d20fd.png "Kobito.gU33dT.png")
モデルの作成とRailsで指定可能なデータ型

#Railsで指定できるデータ型一覧

| データ型 | 
|:-----------|
| binary
| boolean
| date
| datetime 
| decimal
| float
|integer
|primary_key
|string
|text
|time
|timestamp

#参考文献
https://www.rubylife.jp/rails/model/index4.html
Mysqlのコマンド


■ 起動
mysql.server start
mysql -u (ユーザー名)
 
mysql -u user -p ※パスワード設定している場合

■ データベースを切り替えるコマンド
use (データベース名) 

■ データベースの中身の確認
show databases;

■ テーブルの中身の確認
show tables;

select * from test;

■ インサート
INSERT INTO test (test1, test2) VALUES (value1, value2);
【初学者向け】Python 基礎1  関数定義と呼び出し

#これまで

[・インストール方法](https://qiita.com/ryo_xsjsj/items/673d284cc360a7dde02c)
[・Pythonプログラムの作成＆実行](https://qiita.com/ryo_xsjsj/items/edc7331db907072e7fec)

初学者向けのためのご参考。
間違いやもっと良い方法などありましたらご指摘頂けると嬉しいです。

▽環境
Python 3.6.4

#コメント
\# 一行コメント

**ブロックコメントについて**
Pythonでは厳密な意味でのブロックコメントは無い模様。
'''または"""で囲む事で文字列扱いとなり、プログラムに影響を及ぼさないので結果的にブロックコメントとなる。（メモリを消費する為、非推奨。用途は一時的にブロック単位でコメントしたい場合か）
`shiracamusさんありがとうございます！`

```
"""
これはコメントだが推奨されないやり方
print("byebye world")
"""
# コメント
print("Hello world")
```

#関数定義と呼び出し
```python:testdate.py
# 日付取得のために別モジュールを読み込む
from datetime import datetime

# 関数定義
def printToday():

    # 今日の日付を取得
    dt = datetime.today()
    # 文字をコンソール出力　%sで埋め文字をセット
    print('今日は%s年%s月%s日' % (dt.year, dt.month, dt.day))

# 関数呼び出し
printToday() 
```
#他ファイルの関数呼び出し

> 階層
root/
　├ com/
　│　└ tdate.py
　└ main.py

```python:tdate.py
from datetime import datetime

def getToday():

    # 今日の日付を返却
    return datetime.today()
```

```python:main.py
# comフォルダに配置したtdate.pyを読み込む
from com import tdate

def main():

    # 別ファイルで定義した関数を呼び出して今日の日付を取得
    dt = tdate.getToday()

    print('今日は%s年%s月%s日' % (dt.year, dt.month, dt.day))   

# main関数呼び出し
if __name__ == "__main__":
    main() 
```

```:実行結果
C:\Python>py main.py
今日は2018年3月21日
```

ん？importした"datetime"もどこかにあったりする？
インストールしたフォルダ配下に"datetime.py"があった。
中身も普通に見れるので書き方とか勉強になる。

> 階層
Python36
　├ Lib/
　│　├　・・・
　│　└ *datetime.py*
　├　・・・
　└ python.exe

```python:datetime.py
    @classmethod
    def today(cls):
        "Construct a date from time.time()."
        t = _time.time()
        return cls.fromtimestamp(t)
```
AWS CodeBuildで失敗したときに確認するポイント

# 概要
AWS CodeBuildを使ってソースコードのビルドをして、ECRにプッシュしようとしたときにハマったのでメモ。

# 確認ポイント
1. ECRへアクセスする権限が付与されているか
2. S3へアクセスする権限が付与されているか
3. buildspec.ymlのフォーマットは正しいか
ymlファイルのパースに失敗すると、DOWNLOAD_SOURCEフェーズで失敗します。
`YAML_FILE_ERROR Message: did not find expected key at line 41`とエラーログが出ていたのでbuildspec.ymlの42行目を見たところインデントのずれがありました。。。
```
[Container] 2018/03/21 03:41:52 Waiting for agent ping
[Container] 2018/03/21 03:41:52 Waiting for DOWNLOAD_SOURCE
[Container] 2018/03/21 03:42:04 Phase is DOWNLOAD_SOURCE
[Container] 2018/03/21 03:42:05 CODEBUILD_SRC_DIR=/codebuild/output/src586790933/src
[Container] 2018/03/21 03:42:05 YAML location is /codebuild/output/src586790933/src/buildspec.yml
[Container] 2018/03/21 03:42:05 Phase complete: DOWNLOAD_SOURCE Success: false
[Container] 2018/03/21 03:42:05 Phase context status code: YAML_FILE_ERROR Message: did not find expected key at line 41
```

4. 環境変数は正しいか
buildspec.ymlもIAMの設定も完璧なはずなのに、なぜかビルドが失敗する。
しかも、CodebuildのBUILDフェーズのしかも`docker tag`コマンド実行時に失敗するという状況が発生したとき。
環境変数を見直したら解消されました。

```
[Container] 2018/03/21 04:39:31 Running command echo Tagging the Docker image...
Tagging the Docker image...

[Container] 2018/03/21 04:39:31 Running command docker tag demo:latest $REPOSITORY_URI:latest
"docker tag" requires exactly 2 arguments.
See 'docker tag --help'.

Usage: docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE

[Container] 2018/03/21 04:39:31 Command did not exit successfully docker tag demo:latest $REPOSITORY_URI:latest exit status 1
[Container] 2018/03/21 04:39:31 Phase complete: BUILD Success: false
[Container] 2018/03/21 04:39:31 Phase context status code: COMMAND_EXECUTION_ERROR Message: Error while executing command: docker tag demo:latest $REPOSITORY_URI:latest. Reason: exit status 1
```

原因は、buildspec.ymlで定義していた変数($REPOSITORY_URI)内に半角スペースが紛れ込んでいたことでした。

```buildspec.yml
version: 0.2
 
phases:
  pre_build:
    commands:
      - echo Logging in to Amazon ECR...
      - $(aws ecr get-login --no-include-email --region ${AWS_DEFAULT_REGION})
      - REPOSITORY_URI_SERVER=${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/${IMAGE_NAME}

（中略）

  build:
    commands:
      - echo Build started on `date`
      - echo Building the Docker image...
      - docker-compose build
      - echo Tagging the Docker image...
      - docker tag demo:latest $REPOSITORY_URI:latest

```
しかも、その半角スペースはCodeBuildの環境変数設定時に混入していました。
とほほ。。。
Nim と C の連携でエラー

# エラー
C で書いた関数を Nim で使うとき

``` C:add.c
int addInts(int a, int b) {
    return a + b;
}
```

``` Nim:add.nim
{.compile "add.c".}
proc addInts(a, b: cint): cint {.importc.}

when isMainModule:
    echo addInts(3, 7)
```

みたいにすると

``` shell:
$ nim c -r add.nim
Hint: used config file '/etc/nim.cfg' [Conf]
Hint: system [Processing]Hint: add [Processing]
CC: add
CC: add
CC: stdlib_system
Hint:  [Link]/home/username/Develop/Nim/nimcache/add.o: In function `PreMainInner':
add.c:(.text+0x1b): multiple definition of `PreMainInner'
/home/username/Develop/Nim/nimcache/add.o:add.c:(.text+0x1b): first defined here
/home/username/Develop/Nim/nimcache/add.o: In function `addDatInit000':
add.c:(.text+0x26a): multiple definition of `addDatInit000'
/home/username/Develop/Nim/nimcache/add.o:add.c:(.text+0x26a): first defined here
/home/username/Develop/Nim/nimcache/add.o: In function `PreMain':
add.c:(.text+0x2c): multiple definition of `PreMain'
/home/username/Develop/Nim/nimcache/add.o:add.c:(.text+0x2c): first defined here
/home/username/Develop/Nim/nimcache/add.o: In function `NimMainInner':
add.c:(.text+0x7c): multiple definition of `NimMainInner'
/home/username/Develop/Nim/nimcache/add.o:add.c:(.text+0x7c): first defined here
/home/username/Develop/Nim/nimcache/add.o: In function `NimMainModule':
add.c:(.text+0x1b1): multiple definition of `NimMainModule'
/home/username/Develop/Nim/nimcache/add.o:add.c:(.text+0x1b1): first defined here
/home/username/Develop/Nim/nimcache/add.o: In function `NimMain':
add.c:(.text+0x88): multiple definition of `NimMain'
/home/username/Develop/Nim/nimcache/add.o:add.c:(.text+0x88): first defined here
/home/username/Develop/Nim/nimcache/add.o: In function `main':
add.c:(.text+0xd8): multiple definition of `main'
/home/username/Develop/Nim/nimcache/add.o:add.c:(.text+0xd8): first defined here
/home/username/Develop/Nim/nimcache/add.o: In function `NimMainModule':
add.c:(.text+0x225): undefined reference to `addInts'
/home/username/Develop/Nim/nimcache/add.o: In function `NimMainModule':
add.c:(.text+0x225): undefined reference to `addInts'
collect2: error: ld returned 1 exit status
Error: execution of an external program failed: 'gcc   -o /home/username/Develop/Nim/add  /home/username/Develop/Nim/nimcache/add.o /home/username/Develop/Nim/nimcache/add.o /home/username/Develop/Nim/nimcache/stdlib_system.o    -ldl'
```
エラーが出る。

# 解決策
`*.nim` と `*.c` の名前は同じにできないらしい。
`add.c` の名前を `logic.c` に、
`add.nim` を `calc.nim` に変え、

``` Nim:calc.nim
{.compile: "logic.c".}
proc addInts(a, b: cint): cint {.importc.}

when isMainModule:
    echo addInts(3, 7)
```
のように修正すると

```shell:
$ nim c -r calc.nim
Hint: used config file '/etc/nim.cfg' [Conf]
Hint: system [Processing]
Hint: calc [Processing]
CC: logic
CC: calc
CC: stdlib_system
Hint:  [Link]
Hint: operation successful (11721 lines compiled; 0.821 sec total; 22.008MiB peakmem; Debug Build) [SuccessX]
Hint: /home/username/Develop/Nim/calc  [Exec]
10
```
動いた。

# 参考
- Nim Backend Integration - https://nim-lang.org/docs/backends.html
- Multiple definition errors #1059 - https://github.com/nim-lang/Nim/issues/1059