OmniAICreator/Qiita-1.07M huggingface dataset:
WSLでdoxygenのコンパイル

# 概要

* Windows Subsystem for LinuxのUbuntuでdoxygenをmakeした記録です。
* 主にiconv周りでもちゃもちゃしました。
    * cmakeは3.10です

## 参考

http://www.doxygen.jp/install.html など

# やったこと

## git clone

> git clone https://github.com/doxygen/doxygen.git

いろいろ考えて？バージョンを最新の一つ前に戻します。

> git checkout Release_1_8_15

## 依存ライブラリのinstall

公式ドキュメントに書いてありますが、flex, bisonなどが必要です。
またiconvのライブラリも必要のはず。ubuntuは直接libiconvとかが入らないらしく、libc6でなんとかとググると出てきますが……下記でiconvのファイルを入手してコンパイルしておけば後々悩みが少なくなるかもしれません。

> wget https://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.16.tar.gz

（バージョンは適当に変えてください）
（これのコンパイルはあっさりできたはず）

#### Qtのインストール

> apt-get install qtcreator
> apt-get install qt4-default

## cmake

いちおうこれでいいはず！でcmakeを開始します。
私は下記により出オチしました。

```
CMake Error at cmake/FindIconv.cmake:130 (MESSAGE):
  Unable to determine iconv() signature
```

どうやらIconvを見つけるのに苦労してるなって感じで、ここで経緯は省きますが、しかし下記を使えばどうにかなるやん……なのです。

> https://github.com/Kitware/CMake/blob/master/Modules/FindIconv.cmake

上記のファイルを```/usr/share/cmake-3.10/Modules```に入れ、doxygenのソース一式にあるFindIconv.cmakeは使用されないように消すか変名します。

## make
さてcmakeできたぞ、というところでmakeしますがまたコケました。

```
../lib/libdoxycfg.a(portable_c.c.o): In function `portable_iconv_open':
portable_c.c:(.text+0x1f): undefined reference to `libiconv_open'
../lib/libdoxycfg.a(portable_c.c.o): In function `portable_iconv':
portable_c.c:(.text+0x5c): undefined reference to `libiconv'
../lib/libdoxycfg.a(portable_c.c.o): In function `portable_iconv_close':
portable_c.c:(.text+0x76): undefined reference to `libiconv_close'
collect2: error: ld returned 1 exit status
src/CMakeFiles/doxygen.dir/build.make:99: recipe for target 'bin/doxygen' failed
```

自分で作ったlibiconvにこれらのシンボルは存在するので、libiconvが見つからないかリンクされないか……という状態のようです。
cmakeするときにiconvを無理やり見つけられるようにしたのが悪影響しているのかわかりませんが、もう力業で解決します。

* src/CMakeFiles/doxygen.dir/link.txt の
* 末尾に`-liconv`を書き足す
* いま作業しているフォルダのlibフォルダにlibiconv.soを放り込んでおく

これをする理由はMakefileとかエラーログを見ていると何となくわかります。

----

これでコンパイルは完了です。
Dotのあれがないのでよくわかりませんが、とりあえずhtmlは無事作れるものを作れました。
Google Colaboratoryインストールメモ（JUMAN/KNP）

#0.環境等
Google Colaboratoryへのインストール記録。
インストールしたのは、
- JUMAN7.01
- KNP 4.19
- pyknp(バージョン不明、2019/06/16時点でインストール)


#1.JUMAN


```py
# JUMAN
# 参考　https://teratail.com/questions/186997

!wget "http://nlp.ist.i.kyoto-u.ac.jp/nl-resource/juman/juman-7.01.tar.bz2"
!bzip2 -dc juman-7.01.tar.bz2 | tar xvf -
%cd juman-7.01/
!./configure
!make
!make install
%cd ..
!ldconfig
```

#2.KNP

- 所要時間30数分。
- knp-4.12以降はCRF++が同梱されるようになったので別途インストールする必要はなくなりました 

```py
# KNPのインストール
# https://www.utali.io/entry/2016/10/20/202744
# http://nlp.ist.i.kyoto-u.ac.jp/index.php?KNP%2F%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E6%96%B9%E6%B3%95

! wget http://nlp.ist.i.kyoto-u.ac.jp/nl-resource/knp/knp-4.19.tar.bz2
! tar jxvf knp-4.19.tar.bz2
% cd knp-4.19
!./configure
!make
!make install
```

#3.pyKNP
- Pythonバインド
- 本当に必要なのかは不明。理由は、上記１，２をインストールした段階で、下記４の結果を得られたため。しかし、念のためインストールしておく。
- 
https://pyknp.readthedocs.io/en/latest/

```py
! pip install pyknp
```

#4.インストール確認
次のサイトより引用
http://cr.fvcrc.i.nagoya-u.ac.jp/~sasano/knp/install.html

> ```py
! echo "麻生太郎はコーヒーを買って飲んだ。" | juman | knp -anaphora
```

> (解析結果)
麻生─────┐　　　　　	<体言><EID:0>
太郎は─────┐　	<体言><NE:PERSON:麻生太郎><Wikipediaエントリ:麻生太郎><EID:1>
コーヒーを─────┤　	<体言><EID:2>
買って─────┤　	<用言:動><EID:3><項構造:ガ/O/麻生太郎/1;ヲ/O/コーヒー/2>
飲んだ。	<用言:動><EID:4><項構造:ガ/N/麻生太郎/1;ヲ/C/コーヒー/2>
EOS
Autowareサンプルデータセットアップ/初期設定(自分用)

Dockerのイメージ・コンテナを使いこなせていないせいかPCの起動毎にサンプルデータの
セッティングが必要になってしまうのでとりあえずメモ。

#前提
・Docker/NVIDIA-Docker/Autoware-Docker/Autowareの準備は完了
・サンプルファイル一式は下記"~/shared_dir"に保管済み。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336848/691a718d-cc5f-12f8-b73c-ddd98b35d5e7.png)

#手順
1.Autoware Docker起動

```
　cd ~/Autoware/docker/generic
　bash  run.sh
```

2.サンプルファイルをコピー

```
　cd ~/shared_dir
　cp my_launch.sh /home/autoware/.autoware
  cp sample_moriyama_data.tar.gz /home/autoware/.autoware
  cp sample_moriyama_150324.tar.gz /home/autoware/.autoware
```
3.サンプルファイル解凍

```
　cd /home/autoware/.autoware
  tar xfz sample_moriyama_data.tar.gz
  tar xfz sample_moriyama_150324.tar.gz
  bash my_launch.sh
```
4.おまけ―nanoエディタインストール

```
　sudo apt-get install nano
```
5.Autoware起動

```
　cd ~/Autoware/ros
 ./run
```
6.bagファイル起動
　①bagファイル選択
　②Play押下
　③Pause押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336848/8d8a19c3-639b-ac89-360f-f535df15ca97.png)

7.Mapタブ設定
　①PointCloud：/home/autoware/.autoware/data/map/pointcloud_map内のファイルをすべて選択
　②VectorCloud:/home/autoware/.autoware/data/map/vector_map内のファイルをすべて選択
　③TF:/home/autoware/.autoware/data/tf/tf.launchを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336848/25e33977-3bb0-2d41-b0c2-aed4dfde7916.png)

8.Setupタブ設定
　①TF押下
　②VehicleModel押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336848/9dfb400c-4ffd-a212-99e1-e4b5bd62069a.png)

9.Sensigタブ
 ①「Serial GNSS」、「voxel_grid_filter」をチェック
   ※「voxel_grid_filter」→「app」→「Points topic」→「/points_raw」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336848/cac5ffa4-32e8-84e5-24cc-41a360712795.png)

10.Computingタブ
　①「nmea2tfpose」、「ndt_matching」をチェック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336848/e7f6e26e-5e86-cd87-ea6e-3557bc07fbdb.png)

11.QuickStartタブ
　①/home/autoware/.autoware/my_launchからそれぞれlaunchファイルを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336848/3f31f81c-a27b-cc79-4e3b-66b97ca72b34.png)

12.RViz起動
　①「File」→「Open Config」から/home/autoware/Autoware/ros/src/.config/rviz/default.rvizを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336848/a0a77f2b-f2d7-301e-1b76-67fd144c1a18.png)

準備完了

#参考
。Autoware自動運転ソフトウェア入門

#次
Dockerの作業の保存・読出し方法を確認する
画像屋は夢想する　「虫や鳥が見ている世界 紫外線写真が明かす生存戦略　- 紫外線写真が明かす生存戦略 -」

画像屋は夢想すると題して、画像認識や機械学習に関連する書籍を紹介しています。

<img src="http://www.chuko.co.jp/book/102539.jpg" width="50%">
[「カラー版 虫や鳥が見ている世界―紫外線写真が明かす生存戦略」浅間茂 著](http://www.chuko.co.jp/shinsho/2019/04/102539.html)


### 今までに私の連載でも繰り返し述べてきたように、私たち人間の視覚体験は、人間の脳が創りだしているものです。

色の混色・三原色・補色、色立体などの色彩感覚は、「３色型色覚」に固有の色彩感覚です。
物体そのものに色があるわけではありません。
三原色とか、補色とかの色に関わる属性は、物体そのものや、普遍的な物理現象として存在するものではありません。
すべては、ヒトの色覚に起因する現象です。

### 哺乳類の多くは「２色型色覚」です。原猿類の場合も「２色型色覚」です。
人の場合にも「２色型色覚」の人がいます。

短波長の紫と長波長の赤が、色相の上は近接した色として認識されているのは、「３色型色覚」に基づくものです。緑の光と赤の光とを混ぜて生じた「黄色い光」と単色光の「黄色い光」とをヒトの視覚特性では区別することができません。

「3色型色覚」は、遺伝的な変異によって生じたものです。ヒトの場合、「3色型色覚」が多数派だから、少数派の「２色型色覚」の人は、理不尽な制約を課せられることがありました。

しかし、繰り返し言いますが、哺乳類の多くは「２色型色覚」です。
「恐竜の時代に誕生した我々の祖先の哺乳類は小さく、恐竜を恐れ、夜活動をしていた。夜は紫外線を見ることは必要ではなかったため、紫外線を見る能力を失ってしまった。こうして長い歴史の中で私たちヒトは、現在の可視光領域に適した視覚を持つようになったと考えられる。」（同書より）



### 昆虫や鳥では紫外線が見える。

この本には、紫外線カメラで撮影した写真が多数含まれています。
そのことがどういう意味なのかを、この本は詳しく語ってくれる。

被子植物と昆虫、被子植物と鳥は、共進化をして、花を咲かせる植物、実をつける植物が繁栄する世界を作り上げてきた。

虫媒花は、自らの花に優先的に訪れて花粉を同じ種類の別な花に届けさせることで、繁栄することができる。
そのためには、花が葉っぱとは違った色にすることで見つけてもらいやすくなっている。

複眼を持つ昆虫の中でも個眼の数が多いトンボでも、個眼の数は２万前後だそうである。その数の画素数で行動している。ましてや個眼の数が少ない昆虫の場合には、上手に目的の種類の花を見つけてその蜜を吸い、花粉を媒介するには、何かしらの見つけやすさが要る。花弁の大きさは、昆虫にとってはじゅうたん程度の大きさかもしれない。その際に、どちらの側に蜜があるのかを簡単に見分けられることは、意味が大きい。

表紙の帯にある花の紫外線画像は、その答になっている。

---
この本の中で述べていることから、その先に少し妄想を進めてみよう。

### 紫外線を含む「４色型色覚」では、どの色とどの色が似ているとか、そういったものが、「３色型色覚」とはまったく違ったものになることは容易に想像される。
「３色型色覚」の場合には、[色立体](https://ja.wikipedia.org/wiki/%E8%89%B2%E7%AB%8B%E4%BD%93)があるが、おそらくは「４色型色覚」には、４次元の色超立体になっているのだろうと想像する。

さらに妄想ならば、昆虫や鳥にとっての色覚はどのようであるのかを想像するには、紫外線、青、緑、赤の色特性を持つイメージセンサで、物体の認識をさせていったときに、どのような色覚を作り上げていくのかを、深層学習や強化学習などで実験していくのはどうだろうか。

白色という概念も、４種の光を均等に感じた時だけの感覚となるのでしょうか。

####  紫外線を含む「４色型色覚」で観察し、機械学習してみたらどうだろう

この本は述べるカラスは紫外線で他のカラスの個体を見て個体識別していると。
個体識別を４色のカラー画像で見た時に、何がどの程度判別に寄与しているのかを明らかにできるだろう。


---
参考記事

サルの色覚が教えてくれること

河村正二（東京大学） 
http://www.nikkei-science.com/page/magazine/0610/monkey.html


なぜ人間と高等サル類のみで色覚は進化したのか
http://www.kyoto-u.ac.jp/static/ja/news_data/h/h1/news6/2011/110901_1.htm

---
追記
### 昆虫と植物（花）、鳥と植物（果物）の共進化
これらの共進化の中で
- 昆虫が花を見つけやすいこと、花の蜜のありかを見つけやすいことは、植物にとって受粉を成功させるうえで重要。
- 鳥が熟した果実と熟していない果実とを区別できることは、種を運んでもらいたい植物の側にとっても重要

そのような共進化が、昆虫の視覚、鳥の視覚と関係している。
ドットマトリックスディスプレイをMD_MAX72xxで駆動

ライブラリMD_MAX72xxはArduinoIDEのライブラリを管理　からインストール可能．

ライブラリ・インストール後， スケッチ例－MD_MAX72xx－MD_MAX72xxPrintTextを選択．
以下，設定に関係する部分を抜粋する．


```c++:MD_MAX72xx_PrintText
#define HARDWARE_TYPE MD_MAX72XX::PAROLA_HW    //使用するデバイス種類に合わせて設定
#define MAX_DEVICES 8    //使用する1088ASの数

#define CLK_PIN   13  // or SCK　マトリックスディスプレイとマイコンを接続するピンの設定
#define DATA_PIN  11  // or MOSI
#define CS_PIN    10  // or SS

// SPI hardware interface　デバイス・オブジェクトのコンストラクタ
MD_MAX72XX mx = MD_MAX72XX(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);

// Text parameters
#define CHAR_SPACING  1 // pixels between characters 文字間のスペース幅(ドット単位)

// Global message buffers shared by Serial and Scrolling functions
#define BUF_SIZE  75
char message[BUF_SIZE] = {"Hello!"};    //表示したい文字
```

HARDWARE_TYPEを使用するデバイスに合わせて適切に設定する
選択肢：PAROLA_HW, GENERIC_HW, ICSTATION_HW, FC16_HW
詳しくは＄HOME/Arduino/libraries/MD_MAX72XX/src/MD_MAX72xx_lib.hに書いてある．テキストファイルだが図入りでMAX72xxと1088ASの結線種類が説明されているので参照し，デバイスにあったものを選択する．
用意されている4つのどれにも当てはまらない場合は，ヘッダファイルに実際の結線に合わせてマッピングを書く．
Greekcrietの製品の場合，幸いICSTATION_HWが合致した．

このライブラリはフォントがプロポーショナルなので限られたスペースでも結構な文字数が無理なく表示可能という利点がある．
アルファベットは大文字，小文字とも利用できる．

引用サイト
https://github.com/MajicDesigns/MD_MAX72XX
https://majicdesigns.github.io/MD_MAX72XX/
ElasticBeanstalkでPHPをv7.1からv7.2へメジャーバージョンアップする

# これは何
Elasticbeanstalk（以下EB）のOSやPHPのバージョンを上げるための手順。特にMajor versionのアップグレードの場合。
Minor version の場合にはEBのWebコンソールで設定すれば良い。

可能な限り無停止でやるためのBlue/Greenな方法だけど、多少停止していいなら後述する`update-environment`コマンドを叩けば終わり。

# 手順
## 手元とテスト環境のPHPのバージョンを変更して確認
このドキュメントの本質的なところではないですが、動くことを確認してからバージョンアップする方が良いでしょう。
手元開発環境のPHPバージョンと、自動テストの環境のバージョンを変更する。

## EB環境をクローンする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144064/3cd08ea1-19e3-388b-bfc5-956215e09966.png)

単にClone Environmentの方でも良い。ここで”Clone With Latest Platform” と書かれていてもMinorの中での最新だったので意味がなかった。ちょっとしたハマりどころなのでここに記録しておく。

## Security Group（以下SG） を付け替える
EBが勝手に作ったSGにポリシーを設定している場合のみ。この場合には新しいSGが別途発行されるようで、DBなどにアクセスできなくなっているので、古いSGを新しくCloneで作った環境にも付ける。

自分で手動で作ったSGの場合には旧環境から引き継いでくれそう。なので不要な手順かも。

## 新環境に対して CLIの update-environment コマンドでバージョンを指定してアップグレード
今回の話のキモである。

```
aws elasticbeanstalk update-environment --solution-stack-name "64bit Amazon Linux 2017.09 v2.6.2 running PHP 7.1" --environment-id "x-xxxxxxxxxx" --region "xxxxxx"
```

environment-id はEB Application のコンソールの上部に小さく書かれていた。
region についてはここら辺を参考に　https://docs.aws.amazon.com/ja_jp/general/latest/gr/rande.html

solution stack はこちらのコマンドでリストを得られる。

```
$ aws elasticbeanstalk list-available-solution-stacks
```

## 動作確認
新しいEBのエンドポイントに対してアクセスして通常動作しているか確認する。ざっくりでOK。SGの設定がミスってないかくらいの意味合い。

## URLの張り替え
swapしておしまい。2つの環境のEBのURLが置き換わる。
Route53からCNAME張っていればTTLの時間の後、旧環境に向いていた参照が新環境に向くはず。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144064/f58e9f15-589e-242c-acd3-5076dc183d55.png)

動作確認は`dig`コマンドででも行う。
例えば、ユーザに露出しているドメインが example.com で、新環境のEBのエンドポイントが hogehoge.ap-northeast-1.elasticbeanstalk.com だった場合に、

```
$ dig example.com +short 
```
で得られるIPと

```
$ dig hogehoge.ap-northeast-1.elasticbeanstalk.com +short 
```

で得られるIPが一致していれば良い。
Babel 7.4でcore-js系の「Module not found」が出た場合の対策(babel7.4,webpack4)


# 概要

Babel 7.4系で core-js@3 由来エラーが出た場合の対策

## 環境

関連パッケージのバージョン

```
"@babel/core": "^7.4.5"
"@babel/preset-env": "^7.4.5"
"core-js": "^3.1.4"
"webpack": "^4.34.0"
```

## **Babel 7.4**系を使ったビルドで以下のようなエラーメッセージが出た場合

<font color=red>Module not found: Error: Can't resolve 'core-js/modules/es6.symbol'
Module not found: Error: Can't resolve 'core-js/modules/es7.symbol.async-iterator'
Module not found: Error: Can't resolve 'core-js/modules/web.dom.iterable'
</font>

以下のようなコードで簡単に踏める

```js
const data={key1:"val1",key2:"val2"};

for(let key of data){
    console.log(data[key]);
}

```

(``for...of`` をつかっている)

## 対策

**[babel7.4系は core-js@3 が使えます](https://babeljs.io/blog/2019/03/19/7.4.0)**ということで、 **core-js@3** をインストールする

```shell
npm install --save-dev core-js@3
```

**webpack.config.js**内にbabelの設定をしている場合は、
以下のような**preset-env**設定に**core-js**のバージョンを**corejs:3**のように記載する


```js:webpack.config.js抜粋
        module: {
            rules: [
                {
                    test: /\.js$/,
                    exclude: /(node_modules|bower_components)/,
                    use: [
                        {
                            loader: 'babel-loader',
                            options: {
                                presets: [
                                    [
                                        '@babel/preset-env',
                                        {
                                            'modules': 'false',//commonjs,amd,umd,systemjs,auto
                                            'useBuiltIns': 'usage',
                                            'targets': '> 0.25%, not dead',
                                            'corejs': 3
                                        }
                                    ]
                                ]
                            }
                        }
                    ],
                },
```

↓の部分。

```js
   'corejs': 3
```

# まとめ

- 古い記法だけをつかっていた場合、core-js不要な場合があります
- 以下、本家記事が詳しいです  
https://babeljs.io/blog/2019/03/19/7.4.0
ReactとNode.jsを使用して画像アップロード機能を実装する ①

# 概要

ReactとNode.jsを使用して画像アップロード機能を実装します！
今回はNode.jsでAWS上にある自分のS3バケットを表示させるところまでを実装します。

# AWS SDKをインストールする
```
yarn add aws-sdk
```

# アクセスキーを取得する

1. AWSコンソールにログインして`IAM`を検索する
2. アクセスキーの作成をクリックし、CSVファイルをダウンロードする

# .envファイルの作成

先ほどダウンロードしてきたCSVファイルにあるアクセスキーの情報を入力します。

```
//認証情報を提供する
AWS_ACCESS_KEY_ID= XXXXXXXXXXXX
AWS_SECRET_ACCESS_KEY= XXXXXXXXXXXXXXX
```
[環境変数から Node.js への認証情報のロード](https://docs.aws.amazon.com/ja_jp/sdk-for-javascript/v2/developer-guide/loading-node-credentials-environment.html)

# AWS上にあるS3バケットを一覧表示する
indes.jsファイルを作成し、AWS上にあるS3バケットを一覧表示させてみましょう。

```javascript

const AWS = require('aws-sdk');
const s3 = new AWS.S3();

//.envに入力した認証情報を使用
const AWS_ACCESS_KEY_ID = process.env.AWS_ACCESS_KEY_ID;
const AWS_SECRET_ACCESS_KEY = process.env.AWS_SECRET_ACCESS_KEY;

AWS.config.update({
 accessKeyId: AWS_ACCESS_KEY_ID,
 secretAccessKey: AWS_SECRET_ACCESS_KEY,
});

s3.listBuckets((err, data) => {
 if (err) {
  console.log('Error', err);
 } else {
  //バケット一覧表示
  console.log('Success', data.Buckets);
 }
});

```


上記を入力しターミナルで`node index.js`を実行してみましょう。

<img width="711" alt="スクリーンショット 2019-06-16 20.19.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278650/6c801330-ae99-ac76-a85e-48e8540a7394.png">

画像のようにS3バケットが表示されれば成功です！

# さいごに

今回、AWSの認証情報を使用してS3バケットの一覧を確認しました。

次回はメソッドを使用してS3バケットに画像を保存できるようにしていきます！
GitをCentOS7にインストールする手順

# 作業環境
| OS・ミドルウェア | バージョン                              |
|:------------|:-------------------------------------|
| CentOS      | CentOS Linux release 7.6.1810 (Core) |
| Virtual Box | 6.0.8 r130520 (Qt5.6.3)              |
| Vagrant     | 2.2.4                                |

# 導入方法
centOSにGitをインストールする最も簡単な方法は`yum`を利用する方法になるが、それでは古いバージョンのGitがインストールされてしまう。
今回は`yum`は使わずにソースコードからインストールを行う。

# 最新バージョンのGitをダウンロードする
最新版GitのURLは [こちら](https://mirrors.edge.kernel.org/pub/software/scm/git/) から最新バージョン(git-○○○.tar.gz)を調べる。
※今回は「git-2.9.5.tar.gz」で進める。

```
# ダウンロードする場所へ移動
$ cd /usr/local/src/

# ダウンロード
$ wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.9.5.tar.gz
```
※`wget`がない場合はインストールする。

```
$ sudo yum install wget
```

# ビルドに必要なパッケージをインストール
・openSSL
　　暗号をサポートするためのツールキット。
・cURL
　　FTP,HTTP,Gopher,TelnetおよびDictの各サーバからそれぞれサポートされているプロトコルを使用してファイルを取得するツール。
・expat
　　XMLを解析するために使われる高速XMLパーサライブラリ。
・gcc
　　GNUプロジェクトが開発および配布している、さまざまなプログラミング言語のコンパイラ集。
・perl-ExtUtils-MakeMaker
　　Makefileを自動で生成するスクリプトを動かすためのモジュール。

```
$ sudo yum install openssl-devel curl-devel expat-devel gcc perl-ExtUtils-MakeMaker
```
※`devel`というのは`developmentバージョン`で無印のものは正式バージョンになる。
　`devel`には開発に必要なヘッダファイルが含まれている。
　ヘッダファイルがないと自分でソースコードからアプリケーションをインストールしたい場合に困ることがある。

# ソースコードのビルド
makeコマンドでビルドする。
※prefixを使うことでインストール先を指定する。

```
# ファイルを解凍する
$ tar xvzf git-2.9.5.tar.gz

# 解凍したファイルでビルド
$ cd git-2.9.5
$ make prefix=/usr/local all
$ sudo make prefix=/usr/local install
```

# エラーが出る場合
ここまででインストールしたもの以外に足りないものがある場合は都度インストールしていく。

```
# make prefix=/usr/local all
GIT_VERSION = 2.9.0
    * new build flags
    CC credential-store.o
/bin/sh: cc: command not found
make: *** [credential-store.o] Error 127
```
この場合は`gcc`が入っていない。
新たにインストールする。

```
$ sudo yum install gcc
```

# インストールできたか確認

```
$ git --version
```
『達人に学ぶSQL徹底指南書』について

■記事を書く目的
・自分の理解を整理すること
・自分が理解してない内容を明確にすること

■この本で自分が理解したこと
①SQLはタプルの集合を相手取る言語であること
②集合には順序という概念がないが、Window関数が、順序つきの集合の取り扱いを容易にしたということ
③相関サブクエリを使わぬ限り、EXISTS句自体は入力に用いた集合が空集合か否かを返す句であること
④HAVING句を使えば、サブセットに対する集約関数を条件に指定できる(ex.提出日にNULLが含まれる学生を探す)
⑤相関サブクエリは、サブクエリで指定しているテーブルと主SQLで指定しているテーブルを結合させてSQLを実行することができる(またレコード毎にサブクエリ内の結果が変わる、、はず)。
⑥SQLの内部結合は積集合をとることができる(ただし、厳密には異なりそう。https://sql55.com/t-sql/t-sql-intersect.php)
④差集合は不一致クエリの考え方と同じで、キー同士で外部結合してNULLになるレコードをとればよい

■具体的に学んだ内容
p5.js勉強用資料 〜環境構築編〜

# はじめに

社内のデザイナーさんやディレクターさんなど、普段プログラミングをしない人向けに楽しくプログラミングを学んでもらうため、Processingやp5.jsの勉強会を開いています。せっかくなのでその資料をQiitaにも投稿します。

多様な開発環境が選択できますが、社内に利用者が多いVSCodeと、プロジェクトの管理に便利な[p5-manager](https://www.npmjs.com/package/p5-manager)を使った環境を想定しています。他の環境で開発を行いたい方は適宜読み替えて下さい。

## 環境
- macOS High Sierra 10.13.6
- Node v12.1.0
- npm 6.9.0

## エディタ
今回使うVSCodeとWeb上で使えるエディタを紹介します。
### VSCode
下記のパッケージを使うと便利です。

- p5js Snippets
    - コード補完を行ってくれます
- live-p5
    - 変更内容の動作確認をリアルタイムにできます

### [webエディタ](https://editor.p5js.org/)
すぐに始められ、サインアップする事で保存やシェアなどが簡単にできます。

## 使用する用語など
| 名前 | 説明 | 備考 |
| --- | --- | --- |
| p5ディレクトリ | コレクションを格納します | ~/p5jsとします |
| コレクション | p5のライブラリやプロジェクトを格納します | コレクション名をpracticeとします |
| プロジェクト | ソースコードを格納します | プロジェクト名は00_helloworldなど、それぞれの特徴に合わせて名付けていきます |
| スケッチ | Processingはプロジェクトをスケッチと表現しています | 公式のリファレンスなどでスケッチと出てくる事がありますが、プロジェクトと同じようなものと思って問題ないと思います |

- この記事を進めると下記のような構成となります。

```
~/p5js
└── practice
    ├── 00_helloworld
    ├── 01_tutorial
    └── libraries
```

# インストールとデフォルトページの確認までの手順
- p5マネージャーをインストールして、ライブラリの読み込みを行います。

```
npm install -g p5-manager
mkdir ~/p5js && cd ~/p5js
p5 new practice

```
- practiceコレクション内でプロジェクトを生成します。

```
cd ~/p5js/practice
```

- ローカルサーバの起動と確認

```
# コレクションディレクトリ直下でおこなって下さい(今回は~/p5js/practice)
# sはserverの略
p5 s
```
http://localhost:5555/ にアクセスすると「Hello p5.js!」というページが表示されます。
また、左上のアイコンをクリックするとコレクションに登録したプロジェクトのリンクがサイドナビで確認できます。
![スクリーンショット 2019-06-16 17.34.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237009/ddcb1219-3693-ad53-c802-c380ce95ea17.png)

今後プロジェクトが増えた場合、http://localhost:5555/#/プロジェクト名 でアクセスを振り分けられます。

- ローカルサーバの停止

p5 s を行っているプロセスにフォーカスした状態で **Ctrl + C** を入力します。

# Hello Worldプロジェクト

- プロジェクトの雛形を生成

```
# コレクションディレクトリ直下でおこなって下さい(今回は~/p5js/practice)
# gはgenerateの略
# --es6 オプションでES6を利用できます

p5 g 00_helloworld --es6
```
- 「Hello World」という文字列の位置がマウスについてきて、画面下の方に向かうにつれて文字が大きくなるプロジェクトです。

```~/p5js/practice/00_helloworld/sketch.js
function setup() {
	createCanvas(windowWidth, windowHeight);
}

function draw() {
	background(255)
	textSize(mouseY)
	text("Hello World", mouseX, mouseY, windowWidth, windowHeight)
}
```
p5 s を実行している状態で http://localhost:5555/#/00_helloworld にアクセスすると確認できます。デフォルトでホットリロードの機能が用意されているため、変更したコードを保存するとブラウザ側も自動でリロードが走り即時確認が可能になります。

# チュートリアル
```
p5 g 00_tutorial --es6
```
https://p5js.org/learn/ のProgramming topicsに挑戦してみましょう。
# 他、基礎を学べる資料など
- https://www.youtube.com/watch?v=8j0UDiN7my4
英語の動画が多い中、p5.jsの概要について日本語翻訳付きで説明してくれているのでおすすめします
- https://github.com/processing/p5.js/wiki/Processing-transition JavaベースのProcessingからどのように変わったかがまとまってます
【Vue Router】$route.params取得のタイミングとライフサイクルの理解

```vue
<template>
  <div class="room">{{ roomId }}</div>
</template>
```
`roomId`にクエリストリングの値を使いたいとする。

Vue Routerでクエリストリングの値を取得するときは`this.$route.params.{変数名}`を使用する。ところが普通に取得するとエラーになってしまう。
##失敗例

```vue
<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator'

@Component
export default class Room extends Vue {

  roomId: string = this.$route.params.room_id

}
</script>
```
メンバ変数に普通に代入すると、`Cannot read property '_route' of undefined"`などのエラーが出てしまう。Vue Devtoolsを使うとdateにrouteは存在するのになぜ・・・。

##成功例
```vue
<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator'

@Component
export default class Room extends Vue {

  roomId: string = ''

  //↓変更箇所
  created(): void {
    this.roomId = this.$route.params.room_id
  }

}
</script>
```
結論としては`created`または`mounted`内でメンバ変数に代入してあげないといけない。

どうやらインスタンス生成後（created後）以降にdataが存在しているため`this.$route.params`を使えるようになるわけだ。逆にインスタンス生成前では失敗例のようにパラメーターが無いと怒られてしまう。
##ライフサイクルの参考リンク
[公式ドキュメント]
(https://jp.vuejs.org/v2/guide/instance.html#%E3%83%A9%E3%82%A4%E3%83%95%E3%82%B5%E3%82%A4%E3%82%AF%E3%83%AB%E3%83%80%E3%82%A4%E3%82%A2%E3%82%B0%E3%83%A9%E3%83%A0)←本家
[Vueのライフサイクル](https://qiita.com/htkzhtm/items/ab4bb687f47c74b4e4ec)←例もあるので分かりやすい
UnityとGitHub With SorceTreeを使用したチーム開発

###注意
チーム開発開始段階でGitHub素人が検索をして内容をまとめたものです。
一応メンバーに向けたものになっています。
実際に開発に使って気づいたことも追記していこと思います。

###使用環境
**GitHub** (https://github.com/)
**SorceTree** 参考URL(https://proengineer.internous.co.jp/content/columnfeature/6983#37)
**Unity2018.4.2f1** (https://unity3d.com/jp/unity/qa/lts-releases?version=2018.4)

**※ここより下GitHub垢作成、SorceTree、Unityのインストールが終了している前提の解説**

##リポジトリ管理者が事前にやること
**1.GitHubで新しいリポジトリを作る。**
![githubrepo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418484/d02a2682-a4ed-e2ee-c06a-eb29a625d9f8.png)

**2.メンバーを招待して参加してもらう。**
![GitHubsanka.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418484/b9090a4c-d508-3619-d0f4-f3efde692c93.png)

###SorceTreeを使っていく
**3.リポジトリをクローンでローカルに保存する。**
![sorcedlone.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418484/6ebff69b-bffc-0fc1-a003-1e39d3d1abdf.png)

**4.クローンのフォルダに空のUnityプロジェクトを入れる。**
Edit>Project Settingsから
Version ContlorをVisible Meta Filesへ変更
Asset SerializationをForce Textへ変更

**5.コミットメッセージを書きコミットする。**
![sorcepush.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418484/127e662b-d9b5-bf56-7414-8ab4bf506050.png)

**6.プッシュして反映させます。**

**ここまでがリポジトリ管理者が最初にやっておくべきことです。**

##Git用語
用語がよく出てくるのでわからない方はこのサイトを参考にしながら読んでもらいたいです。
分かりやすくまとめてくださっています。
https://qiita.com/toshi_um/items/72c9d929a600323b2e77

##開発スタート
**0.SorceTreeの設定**
Unityのマージお助けツールを有効にできるらしいです。
DiffコマンドとマージコマンドそれぞれUnityYAMLMerge.exeのアドレスを入力してください。
引数には`merge -p $BASE $REMOTE $LOCAL $MERGED`を入力してください。
![sorceconfi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418484/a6b80cb5-953b-8d87-430e-8f63af3b01c1.png)


**1.SorceTreeでGitFlowを有効にする。**
※GitFlowとは偉い人が作ったブランチモデルを使えるようにするものです。

**2.featureブランチを切る**
GitFlowでは
・**master**　リリースするタイミングで使う。
・**develop**　開発するところ。これが完成までの最新版。
・**feature**　機能を追加するところ。できたらdevelopにマージする。
・**hotfixes** リリース後にバグを治すところ。
・**release**　リリース準備をするところ。
の段階に分けて作業をする。

一番よく使うものは機能を追加するときに切るブランチの**feature**です。
SorceTree上ではGitFlowをクリックして「**新規フィーチャーを開始**」で始めることができる。

**3.機能を作成**
書いていたfeatureが完成したと思ったらコミットとプッシュをします。
コミットのときには何をしたかがわかるようにコミットメッセージを書きましょう。

**4.プルリクエスト**
必ずマージ（統合）先は**develop**に変更しましょう。
誤って**mastar**にしていたらレビューするまでもなく突っぱねられてしまうでしょう。

**5.フィーチャーブランチを完了**
プルリクエストをだし承認されたらそのフィーチャーブランチは完了したことになります。
GitFlowの「フィーチャーブランチを完了」を押しブランチを削除しましょう。

**このあとは2～5を繰り返して制作していくことになります。**

##今後
制作が進んだらまた続きを書いていきたいと思います。
<Git>ブランチの作成と移動

ブランチの作成と移動の仕方をまとめる。


まずは、ブランチを作成

```shell
$git branch ブランチ名
```

そして、チェックアウトをする。
Gitのチェックアウト(checkout)とは、「ブランチを切り替えたいとき」に使用するコマンド。

```shell
$git checkout ブランチ名
```

これで、「ブランチを作成し、移動する」ということができるようになったが、
これを一発でやってくれるのが、「-b」オプションである

```shell
$ git checkout -b ブランチ名
```

ここで、

```shell
$ git checkout -b 新たに作成したいブランチ名 起点となるブランチ名
```
のように第二引数に起点となるブランチ名を指定することで、分岐元を設定することができる。
これを指定しないと、現在いるブランチからブランチを作成し、checkoutすることになる。
最短経路問題

# 最短経路問題
- グラフの二頂点間を結ぶ道のうち，辺の重重みの総和が最小になるものを求める問題
- 出発点と終点の取り方によって分類できる
    - 出発点を一つ$S$に固定して，$S$から他の全ての頂点への最短経路を求める問題
    - 全ての二頂点間の最短経路を求める問題
    - 他にもいろんな問題設定がある

# 単一始点最短経路問題
- SSSP = Single Source Shortest Path
-  Dijkstraアルゴリズムが有名
-  始点からの最小距離が確定している頂点集合を拡張していくような挙動で各頂点の最短距離を決定していく

```
procedure dijkstra;
    V := 空集合;
    U := 全ての頂点からなる集合;
    vertex[始点].distance = 0;
    for x := 始点以外の全ての頂点について do
        vertex[x].distance = INF;
    while Uが空集合でない do
        p := Uの中でフィールドdisntanceの値が最も小さい頂点;
        pをUから取り除きVに加える;
        for pを始点とする辺それぞれについて do
            x := 辺の終点
            if xがUに属している then
                vertex[x].distance = min(vertex[x].distance, vertex[p].distance + 辺の重み);
```

- ダイクストラ法の正しさは，**「頂点集合$U$（最短経路が未確定）に属している頂点のうち，`distance`が最小の頂点$P$について，始点から$P$に至るまでの経路上の頂点は，頂点集合$V$（最短経路が確定）に属している頂点のみである」**ことから示される
- これは背理法を用いれば簡単に示せる
- もし，「$U$に属している頂点のうち`distance`が最小の頂点$P$に始点から至るまでの経路上に$V$に属していない（つまり$U$に属している）頂点$Q$が含まれる」と仮定すると，$Q$-$P$間の経路長を考慮すれば，「始点-$Q$」の経路の方が「始点-$P$」の経路より経路長が短いので，「$P$が$U$の中で`distance`が最小である」という仮定に矛盾する
- つまり「始点からの最小距離が確定していない頂点集合の中で，`distance`が最小な頂点$X$」に至るまでの経路は，始点からの最小距離が確定している頂点のみを通る経路であるから，実は$X$は最小距離が確定した頂点集合$V$に入れることができて，$V$に新しい頂点$X$が入ったので$V$に属している頂点たちの最短距離をさらに小さくできる可能性があるので，更新する
- $V$に属している頂点の`distance`には「$V$に属している頂点だけを通った時の最小距離」が記録されている
- 初期状態で「$U$に属している集合のうち始点だけ`distance`を0にして，残りを$\infty$にする」ことで，上を自明に満たすようにしている
- ダイクストラ法を適用するためには「頂点集合$U$（最短経路が未確定）に属している頂点のうち，`distance`が最小の頂点$P$について，始点から$P$に至るまでの経路上の頂点は，頂点集合$V$（最短経路が確定）に属している頂点のみである」ことが正しい必要があって，そのためには**辺の重みが正である**という仮定が必要
- 「$U$が空集合でない間，一つ頂点を取り出して，$V$に入れる」とは「全ての頂点を一つづつ見る」ことと同じ
- 密なグラフなら隣接行列でグラフを表現する
- 疎なグラフなら隣接リストでグラフを表現する
- 下記の実装だと，頂点の個数を$n$とすると，最も内側の`for`が$O(n)$でそれを$n$回まわすことになるので全体で$O(n^2)$になる

```go
func Dijkstra(graph [][]int, start int) {
	n := len(graph)
	nodes := make([]node, n)
	for i := 0; i < n; i++ {
		nodes[i] = node{
			id:         i,
			distance:   INF,
			hasVisited: false,
			last:       nil,
		}
	}
	nodes[start].distance = 0
	for step := 0; step < n; step++ {
		var p int
		mindis := INF
		for x := 0; x < n; x++ { // ここでUに属している`distance`の最小な頂点を探して`p`に記録
			if !nodes[x].hasVisited && nodes[x].distance < mindis {
				p = x
				mindis = nodes[x].distance
			}
		}
		if mindis == INF {
			log.Fatalln("Given graph is not connected one")
		}
		nodes[p].hasVisited = true // `p`を集合Vに入れる
		for x := 0; x < n; x++ {
			if nodes[p].hasVisited && nodes[p].distance + graph[p][x] < nodes[x].distance {
				nodes[x].last = &nodes[p]
				nodes[x].distance = nodes[p].distance + graph[p][x]
			}
		}
	}
	for _, node := range nodes {
		if node.last == nil {
			log.Printf("Node[%d]: %d, last: %d\n", node.id, node.distance, start)
		} else {
			log.Printf("Node[%d]: %d, last: %v\n", node.id, node.distance, node.last.id)
		}
	}
}

type node struct {
	id         int
	distance   int
	hasVisited bool
	last       *node
}
```

- 辺の本数が頂点数に対して同じオーダーであるならば，グラフを隣接リストの形で持つ方が効率がいい
- ダイクストラ法で肝心なのは「集合$U$から`distance`が最小の頂点を見つけ出す」ところ
- 最小値を効率的に求められるようなデータ構造ってなんかあったけな？？？
- あ，ヒープってのがあったな
- ヒープ：優先順位つき待ち行列（を配列上で表現したもの）
- Goにはヒープの実装が標準ライブラリで提供されてるよな？？？

```go
// いんぷり
```

# 全対最短経路
- ダイクストラ法を全ての頂点に対して適用する
- これでも悪くない
- 他にもFloydのアルゴリズムがある

# 気が付いた時に追記
【Houdini】vexでwiggleぽい位置の移動をする

Houdini の sop で色々動くものを作っていると AfterEffects の wiggle がいかに便利だったかという事に気づく。

この辺（10年前の投稿だけど）にノイズで近いことをしている例があるが、そのものではないっぽいので、
https://www.sidefx.com/forum/topic/14910/?page=1#post-70402

適当に vex ででっち上げたのでメモとして qiita に貼っておく。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">wiggleぽい動きテスト <a href="https://t.co/4SUa58HjbZ">pic.twitter.com/4SUa58HjbZ</a></p>&mdash; harayoki (@harayoki) <a href="https://twitter.com/harayoki/status/1140212694420611072?ref_src=twsrc%5Etfw">2019年6月16日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

```c
float freq = ch("freq"); // 1秒間に値の変わる回数
float amp = ch("amp"); // 値の大きさ

float delta_t = 1.0 / freq; // freq から求めた時間間隔
float key_time1 = floor(@Time / delta_t) * delta_t; // 基準時間１
float key_time2 = key_time1 + delta_t; // 次の基準時間
vector val1 = rand(key_time1); // ランダム位置１
vector val2 = rand(key_time2); // ランダム位置２
float ratio = (@Time - key_time1) / delta_t; // ２つの基準時間の合間、今はどのあたりの割合か
vector val = lerp(val1, val2, ratio); // 線形補完による中間の位置
val -= {0.5, 0.5, 0.5}; // 0.0 ~ 1.0 -> -0.5 ~ 0.5

@P +=  val * amp;
```

vexのコードハイライトってないもんかな。とりあえずCコードとして張った。


実際のAEは線形補完ではないっぽいので、そこは直さないといけない。
あと、そもそもこういうノードがあるかもしれない。ないなら位置以外も対応できるように汎用化してHDAにするといいかもしれない。

以下、適当なキャプチャ。

![hou_wig_net.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8302/ad3bd38b-d23a-2582-74d0-a8bc08f6141c.jpeg)

![hou_wig_param.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8302/c23c5661-0169-c21d-237f-4165effe8b24.jpeg)
MyBatisのInterceptorを使ってSQL実行時間をログ出力

# 概要
- mybatisを使用したアプリケーションでSQLの実行時間を取得したいと思った
- mybatisのInterceptorを使えばできそうだったので実装してみた

# コード

- Interceptorを実装したクラスをBean登録したらOK！

```java:MyInterceptor
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Plugin;
import org.apache.ibatis.plugin.Signature;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
import org.springframework.stereotype.Component;

import java.util.Properties;

@Intercepts({
        @Signature(
                type = Executor.class,
                method = "update",
                args = {MappedStatement.class, Object.class}
        ),
        @Signature(
                type = Executor.class,
                method = "query",
                args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}
        )
})
@Component
@Slf4j
public class MyInterceptor implements Interceptor {
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        MappedStatement statement = (MappedStatement)invocation.getArgs()[0];
        long start = System.currentTimeMillis();
        Object result = invocation.proceed();
        long end = System.currentTimeMillis();

        String[] items = statement.getId().split("\\.");
        log.info("{} ms. class: {}, method: {}", end - start, items[items.length - 2], items[items.length - 1]);

        return result;
    }

    @Override
    public Object plugin(Object target) {
        return Plugin.wrap(target, this);
    }

    @Override
    public void setProperties(Properties properties) {
    }
}

```

※そもそもMybatisの機能として実行時間くらい取得できそうな気もするが、
これができればいろんな処理が注入できるので、勉強にはなったかな！
Nandはすごい（コンピュータシステムの理論と実装）

Nand(a=in,b=in,out=out)
でNotになる
110
001
反転

Nand(a=a,b=b,out=w)
Nand(a=w,b=w,out=out)
でAndになる
Nandの結果をNot
0011
0101
1110
0001
Nandして反転

Nand(a=a,b=a,out=w1)
Nand(a=b,b=b,out=w2)
Nand(a=w1,b=w2,out=out)
でOrになる
入力値をNotして、Nand
0011>1100
0101>1010
1110>0111
入力を反転してNand

- 総当たりでこの組み合わせを見つけたが、方法はこれでよかったのだろうか。。
- 読んでる時は、できそう！て感じだったけど、やってみると理解しきれていないことに気づいた。
Web3.jsでエラー：TypeError: Cannot read property 'sendTransaction' of undefined

# 原因
- Web3.jsのバージョンとコードの記法が異なる。

# 対策
`Token` コントラクトの `mint` というメソッドを利用する場合、Web3.jsの `1.x.x` 系では↓のように書く。

```javascript
Token.methods.mint(...);
```

↓のように書くとエラーとなる。

```javascript
Token.mint.sendTransaction(...);
```
オンライン support vector regression (SVR)

こんにちは。
"[awerries/online-svr](https://github.com/awerries/online-svr)" (GitHub) というものを見つけたので動かしてみました。なお sklearn.svm.SVR （オフライン）の結果と差がある原因は不明です。

![plot.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54617/196f81d3-55a6-43a8-b8e0-78a0cb40c704.jpeg)

```svr.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import numpy as np
import random
import matplotlib.pyplot as plt
from sklearn import svm

import online_svr

N = 100
X = np.linspace(0, 8, N)
y = np.sin(X*np.pi/4) + [random.gauss(0, 0.1) for _ in range(N)]
X = X[:, np.newaxis]

OSVR = online_svr.OnlineSVR(numFeatures=1, C=1, eps=0.1, kernelParam=1, bias=0, debug=False)
for i in range(N):
	OSVR.learn(X[i], y[i])
plt.plot(X, OSVR.predict(X), color='red', label='on-line')

svr = svm.SVR(kernel='rbf', gamma=1, C=1.0, epsilon=0.1, shrinking=False, verbose=True)
svr.fit(X, y)
plt.plot(X, svr.predict(X), color='purple', label='off-line')

plt.scatter(X, y, s=5)
plt.legend()
plt.grid()
plt.show()
```
Web3.jsでエラー： "TypeError: Cannot read property 'clearSubscriptions' of undefined"

# 原因
- Web3.jsのバージョンとコードの記法が異なるのが原因の一つ。

# 対策
- エラーをきっちり追ってコケてる箇所を特定し、そこがWeb3.jsの利用しているバージョンの記法と合っているか確認。
HDWalletProviderでmnemonicの代わりに秘密鍵を利用する

# 結論
単純に `mnemonic` の代わりに引数に秘密鍵を渡す。

```javascript
const pkey = "12345.......89";
new HDWalletProvider(pkey, "https://ropsten.infura.io/v3/xxxxxxx");
```

# メモ
- [公式のREADME.md](https://github.com/trufflesuite/truffle/blob/827d1f89df33f9984d7da9a6f5eecca3ac7a2491/packages/truffle-hdwallet-provider/README.md)

> Instead of a mnemonic, you can alternatively provide a private key or array of private keys as the first parameter.
【Unity(Shader)】VR空間で違和感なく透過する手のシェーダー

##Shaderなんもわからん
本当に何もわかりません。
なので結果的にいい感じになりましたというメモです。

##デモ
左手が今回いい感じになったShaderです。
透過しつつ、いい感じに立体感もあり、指が重なって二重に見えることはありません。


ちなみに右手は`Oculus Integration`の中に入っている`Hands_Transparent`です。
左手はそれをちょっと変えただけです。

![Hand_Transparent.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/4096b0b7-2ddc-c3c6-cc08-4b100f534b03.gif)


##Shader

```C++
    Shader "Custom/SemiTransparent" {
    Properties { 
        _MainColor("_Color",Color) = (0,0,0,0)
        _RimColor ("Rim Color", Color) = (0.26,0.19,0.16,0.0)
        _RimPower ("Rim Power", Range(0.5,8.0)) = 3.0
    } 

	SubShader {
		Tags { "Queue" = "Transparent" }
		LOD 200

        Pass{
            ZWrite On
            ColorMask A
        }

		CGPROGRAM
		#pragma surface surf Standard alpha:fade 
		#pragma target 3.0

		struct Input {           
           float3 viewDir;
		};

        fixed4 _MainColor;    
        float4 _RimColor;
        float _RimPower;   

		void surf (Input IN, inout SurfaceOutputStandard o) {
			o.Albedo = _MainColor;
            o.Alpha = _MainColor.a;
            half rim = 1.0 - saturate(dot (normalize(IN.viewDir), o.Normal));
            o.Emission = _RimColor.rgb * pow (rim, _RimPower);
		}
		ENDCG
	}
	FallBack "Diffuse"
}

```

##float?  half?  fixed?
まず変数に見たことがないものがあって混乱しました。
Scriptリファレンスには下記のようにありました。

>できるかぎり低い精度を使用します。これは iOS や Android などモバイルプラットフォームでは特に重要です。経験則から以下のようにします。
**・ワールド空間の位置とテクスチャ座標には、float 型を使用してください。**
**・上記以外 (ベクトル、HDR カラーなど) には、half で始めます。必要なときだけ、増加します。**
**・テクスチャデータのとても簡易な操作には、fixed を使用します。**
実際には、正確にはどの数の型を使用すべきかは、プラットフォームや GPU に依存します。

深く調べるとさらに難しいことが書いてありそうだったので、
現段階では**返す数値の精度が違う**とだけ覚えておきます。

##Pass
Passは簡単に言うと**こんな感じに描画しますよ**ってことらしいです。
複数回に分けて書くことができる(複数回に分けて描画することができる)みたいです。


`Surface shader`はデフォルトではPassと書かれていないですが、
内部でPassとして展開されるそうです。

今回のshaderに当てはめると下記のようなイメージです。

```C++
SubShader {
        Tags { "Queue" = "Transparent" }
        LOD 200

        Pass{
            ZWrite On
            ColorMask 0
        }
       
        /*本来は内部ではPassとして展開される処理*/
        Pass{
            CGPROGRAM
            /*~省略~*/
            ENDCG
        }
     }
```
つまり、**今回書いたシェーダーにはPassが2つある**ということになります。

主に追加したのは1パス目だけです。
なので、その説明をしていこうと思います。

##ZWrite[^1]
ZWriteは**Depth Buffer**を書き込むかどうかOn,Offできます。

最初は意味不明でしたが、
**Depth Buffer = 深度情報 = どっちが前にあるか(後ろにあるか)判別するための情報**
という理解で着地しました。

Depth Buffer(深度情報)が与えられていない手のShaderを見るとよくわかります。
![HandOculus.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/5e3520a9-6f20-cff0-c9c3-07bade5a25b0.png)

どの指が手前にあるのかを判別するZWriteをShader上でOnにしていないので、
人差し指より前側に他の指が描画されてしまっているということです。


##ColorMask
**ColorMaskは使用するカラーチャンネル(RGBA)を指定**することができます。
`0`を指定するとすべてのチャンネルを無視することができるので何も書き込まれません。

つまり、1パス目は**Depth Buffer(深度情報)を書き込むためだけのコード**ということです。

```C++
    Pass{
       ZWrite On
       ColorMask 0
    }
```

2パス目にZWrite On書いとけばいいんじゃないか？
と思って試しましたが、ダメでした。先にDepth Buffer(深度情報)を書き込んであげる必要があるようです。


##Shaderなんもわからん
本当に何もわからないので間違い、アドバイス等ありましたらよろしくお願いします。

[^1]: [みんな大好きおもちゃラボ](http://nn-hokuson.hatenablog.com/entry/2018/01/23/202530)
PowerShellの基礎の基礎

#はじめに
勉強用の備忘録です。
随時更新していきます。
文法項目をさっと流し読みしたい時に参考になるかもしれません。

$PSVersionTable -> PSVersion 5.1にて動作確認。

#変数
```powershell
# コメント
$a = "Hello"
$b = "World!"
$c = $a + ", " + $b
Write-Host $c
```

#文字列演算子
```powershell
#文字列置換
"powerShell" -replace "power", "Power" 

#正規表現マッチ
"PowerShell" -match "S...l"

#ワイルドカードマッチ
"PowerShell" -like "Power*"
```

#比較演算子
```powershell
#等しい
1 -eq 1

# 等しくない
1 -ne 10

#より大きい
2 -gt 1

# 以上
2 -ge 1

#より小さい
1 -lt 2

#以下
1 -le 2
```

#包含
```powershell
#左側に右側が含まれる
"PowerShell", "Python" -Contains "PowerShell"

#右側に左側が含まれる
"PowerShell" -in "PowerShell", "Ruby"
```

#論理演算子
```powershell
#論理積
$true -and $true

#論理和
$true -or $false

#否定
-not $false
!$false
```

#要素のループ処理
```powershell
Get-ChildItem C:\ | ForEach-Object {$_.GetType()}
Get-ChildItem C:\ | % {$_.GetType()}
```

#条件による絞り込み
```powershell
Get-ChildItem c:\ | Where-Object {$_.PSIscontainer}
Get-ChildItem c:\ | ? {$_.PSIscontainer}
Get-ChildItem C:\ -Directory
```

#文字列をコマンドとして実行
```powershell
$command = "ping localhost"
Invoke-Expression $command
```

#配列
```powershell
$lang = @("PowerShell", "Python", "Ruby")
$lang[0]

#スライス
$lang[1..2]

#長さ
$lang.Length

#インデックス
$lang.IndexOf("Python")

#要素の追加
$lang += "Perl"

#配列から要素を取り除くのは面倒
$newLang = $lang | ? {$_ -ne "Perl"}
```

#配列はRemoveでは削除できないのでArrayListを使う
```powershell
[System.Collections.ArrayList]$lang = "PowerShell", "Python", "Ruby", "Perl"
$lang.Remove("Perl")
```
#連想配列(Hash)
```powershell
$abbr =@{ps="PowerShell"; py="Python"; rb="Ruby"}
$abbr["ps"]
$abbr.Keys
$abbr.Values
$abbr.Add("pl", "Perl")
$abbr.Remove("pl")
```
#定数
```powershell
Set-Variable -Name pi -Value 3.14 -Option Constant
```

#入力
```powershell
$value = Read-Host "文字の入力"
```

#If文
```powershell
[int]$i = Read-Host "input number:"
If($i -eq 0) {
    Write-Host "zero."
} ElseIf($i % 2) {
    Write-Host "odd number."
} Else {
    Write-Host "even number."
}
```

#Swich文
```powershell
$lang = Read-Host "好きな言語は？"
Switch ($lang) {
    "PowerShell" {Write-Host "パワーシェル"}
    "Python" {Write-Host "パイソン"}
    "Ruby" {Write-Host "ルビー"}
    default {Write-Host "知らない言語です"}
}

```

#ForEach文
```powershell
$lang = @("PowerShell", "Python", "Ruby")
ForEach ($l in $lang) {
    Write-Host $l
}
```
#For文
```powershell
For ($i=1; $i -le 10; $i++) {
    Write-Host $i
}
```

#While文
```powershell
$i = 5
While ($i -ne 11) {
    Write-Host $i
    $i++
}

$j = 0
While ($true) {
    if($j -eq 3) {
        break
    }
    Write-Host $j
    $j++
}
```

#スクリプトブロックの実行
```powershell
$exec = {"プロセス情報を表示"; Get-Process | ? ProcessName -ne "svchost"}
&$exec
```
#関数
```powershell
Function AddArg {
    $sum  = 0
    foreach ($arg in $args) {
        $sum += $arg
    }
    return $sum
}

AddArg 10 90
```
fc_remote_port_add契機のSCSIデバイススキャン処理

linuxのSCSIはUpper,Middle,Lowの3層から成っている。参考: [Linux SCSI サブシステムの徹底調査](https://www.ibm.com/developerworks/jp/linux/library/l-scsi-subsystem/index.html)
SCSIのシステムを構成する要素の一つにscsi_transportという層がある。（これがどの層にあたるかは不明。Middleかな？）その中でもFibreChannel用のscsi_transport_fcというモジュールがある。
scsi_transport_fcがなにをするものかというとソースを見るにFibreChannel特有の処理をsysfsインターフェースから行えるようにするもののようだ。

```
FiberChannel transport specific attributes exported to sysfs.
```

主要なFCドライバはscsi_transport_fcをサポートしており、初期化時のLUスキャン処理などもscsi_transport_fc経由で行われる。本記事では調査した備忘録を兼ねてscsi_transport_fc経由のスキャン処理を記述する。シーケンス図および説明を以下に示す。

![remote_port_add.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319100/3a6b25db-e4c4-ba90-b70b-148ca2176c93.png)

1. FCドライバがターゲット(remote fc port)を見つけると、fc_remote_port_addを呼び出し、scsi_transport_fcにターゲットの存在を通知する
2. scsi_transport_fcはremote_portに対応する構造体の作成と、WorkQueue経由でKernelにSCSIのスキャン処理を依頼する。作成した構造体はFCドライバに即返す。
3. Kernelはevents/XからWorkQueueに積まれたscan_workを実行し、SCSIドライバのスキャン処理を実行する
4. SCSIドライバはscsi_scan_targetから連なる一連のSCSIスキャン処理を実施しLUを認識する
システムとアニメーションの理想の関係



## 本記事について



この話は、サーバーエージェント様で開催された平成最後のハッカソン

でアプリ作った時の反省とか、改善点とかをまとめたものです。



## 何が問題になったか

まず、私たちが作ったのは、「平成を振り返る人生ゲーム」という物でした。

私は、人生ゲームのシステム担当・後の二人がUI・アニメーションを担当していました。



#### まず起こった問題

しばらくバラバラに開発を進めており、さあくっつけるか！となった時に

以下のような問題が発生しました。



```swift
class GameController {
  ...
  func spinRoulette(min:Int, max:Int) -> Int
  ...
}
```



ゲームシステム側にこのような定義がされていたのですが、

この関数を実行すると、プレイヤーの場所の変更・アイテムの獲得などが一度に行われてしまい、

その間にアニメーションが実行できないという問題です。



なので、以下のような関数を`GameController`に追加しました。

```swift
func animationDidEnd()
```

アニメーションが終わったら読んでね、的なやつです。

この間 `GameController` は実行を中断し、その間にViewがアニメーションを行えるようにしました。



#### 次に起こった問題



さらに止まったマスがアクションマス（2マス進む）などがあった場合は、

`GameController` は2回に分けてプレイヤーの位置を更新する必要があります。

なので、以下のようにしました。



```swift
/// 移動が終わったら毎回呼んでください。
func animationDidEnd()
```



#### さらに起こった問題



今度は、止まったマスでアイテムがゲットできる場合があることがわかりました。

この場合はさらにアニメーションを行います。

なので、以下のようにしました。



```swift
/// 移動が終わったら毎回呼んでください。
/// アイテムがゲットアニメーションが終わったら呼んでください。
/// ...
func animationDidEnd()
```



## 結局何が問題か



まず、ここまで進めてきて起こった問題は、

意図しないタイミングで、イベントが発火してしまうというものです。



この問題はルーレットとマップの両方から、 `animationDidEnd()` という簡単なものだったのですが、

以降も似たような問題が多発しました。



### なぜ起こったか



この問題が起こった理由は `animationDidEnd()` を呼ぶタイミングが

呼び出し元にとって明確でないことです。

アニメーションと言ってもゲームの中には多種あり、

複数人で開発している場合には、この認識の違いが問題になりました。





## どうすべきだったか？

この問題はアニメーションのような、非同期処理一般に言えることだと思います。



#### 呼び出し元からわかりやすい名称をつける



まずはこれが重要になってくると考えます。（命名規則の基本ですね...）

特に今回はルーレットからの呼び出しなのか、マップからの呼び出しなのか

などを分ける必要がありました。



```swift
func rouletteAnimationDidEnd()

func mapAnimationDidEnd()
...
```

のようにするだけで、かなりわかり易くなるはずです。



#### 特殊な処理はシステムを分ける

また、今回システムが複雑になった理由として、

「2マス進む」などのアクションがあります。



ドメイン設計を念頭にこのシステムと、プレイヤーの位置などの管理は

クラス分けすべきだったと考えます。



非同期処理では、これをやると後処理は勝手にやってくれるのではなく、

実はいちいち呼び出して実行した方が良さそうです。
CyberduckでS3からファイルをアップロードするCloudFormation Template

# やりたいこと

- S3へのファイル操作をCyberduckからやりたい
- 権限は制限したい
- 実行する操作
    - バケット
        - my-data-bucket
    - 操作
        - ファイルアップロード
        - ファイル削除
- 特定のIPアドレス以外からの操作は拒否したい
    - 許可するIPアドレス
        - xxx.xxx.xxx.xxx
        - yyy.yyy.yyy.yyy

# Cloudformation Template

```yaml

AWSTemplateFormatVersion: '2010-09-09'
Description: Create users who use s3.
Resources:
  DataUploadUser:
    Type: AWS::IAM::User
    Properties:
      UserName: DataUplodaUser
  DataUploadUserGroup:
    Type: AWS::IAM::Group
    Properties:
      GroupName: DataUploadUserGroup
  DataUploadUsers:
    Type: AWS::IAM::UserToGroupAddition
    Properties:
      GroupName: !Ref 'DataUploadUserGroup'
  DataUploadUserPolicies:
    Type: AWS::IAM::Policy
    Properties:
      PolicyName: DataUploadUsers
      PolicyDocument:
        Statement:
        - Effect: Allow
          Action:
          - 's3:GetBucketLocation'
          - 's3:ListAllMyBuckets'
          Resource: '*'
          Condition:
            IpAddress:
              aws:SourceIp:
              - "xxx.xxx.xxx.xxx/32"
              - "yyy.yyy.yyy.yyy/32"
        - Effect: Allow
          Action:
          - 's3:ListBucket'
          Resource:
          - 'arn:aws:s3:::my-data-bucket'
          Condition:
            IpAddress:
              aws:SourceIp:
              - "xxx.xxx.xxx.xxx/32"
              - "yyy.yyy.yyy.yyy/32"
        - Effect: Allow
          Action:
          - 's3:*Object'
          Resource:
          - 'arn:aws:s3:::my-data-bucket/*'
          Condition:
            IpAddress:
              aws:SourceIp:
              - "xxx.xxx.xxx.xxx/32"
              - "yyy.yyy.yyy.yyy/32"
      Groups: [!Ref 'DataUploadUserGroup']
  DataUploadUserKeys:
    Type: AWS::IAM::AccessKey
    Properties:
      UserName: !Ref 'DataUploadUser'
Outputs:
  AccessKey:
    Value: !Ref 'DataUploadUserKeys'
    Description: AWSAccessKeyId of DataUploadUser
  SecretKey:
    Value: !GetAtt [DataUploadUserKeys, SecretAccessKey]
    Description: AWSSecretAccessKey of DataUploadUser

```

## 説明
- CyberduckでS3にアクセスする場合、Cyberduckが最初にバケット一覧を表示するので、本来は必要ないが、GetBucketLocationとListAllMyBucketsのActionを許可する必要がある。
- 対象バケットには、ListBucketを許可し、 /* を指定してバケット内へのオブジェクトの操作を許可する。
- CyberduckでS3にアクセスする場合、アクセスキーとシークレットキーをCyberduckに設定する必要があるので、Outoutsにアクセスキーとシークレットキーを出力する。
- AWS::IAM::Policy は、許可の足し算であるため、IP制限はそれぞれのEffectにConditionで指定する。
- AWS::IAM::Policy は以下のように最初にDenyでIPを制限すればそのほかのEffectにIP許可設定は不要になる。

```yaml
  DataUploadUserPolicies:
    Type: AWS::IAM::Policy
    Properties:
      PolicyName: DataUploadUsers
      PolicyDocument:
        Statement:
        - Effect: Deny
          Action: 's3:*'
          Resource: '*'
          Condition:
            NotIpAddress:
              aws:SourceIp:
              - "xxx.xxx.xxx.xxx/32"
              - "yyy.yyy.yyy.yyy/32"
```
Raspberry Piに管理ツール"Cockpit"を入れてみる

# Cockpitとは
Webブラウザーから操作できる軽量なシステム管理ツール。
![Cockpit_screenshot.png](https://cockpit-project.org/images/site/screenshot-network.png)

### 良さそうなところ
* 余計なリソース消費がないように注意して作られており、ユーザーがログインしようとして初めてUIサービスが立ち上がる
* システム監視ツールやシェル端末機能がWebベースで提供されているので、タブレットなどでもある程度システムのメンテナンスができる

# インストールしてみる
```shell
# 後でdirmngrが入ってないと怒られるのでインストール
sudo apt-get install dirmngr

sudo su -

# パッケージリストを追加する
echo 'deb http://deb.debian.org/debian stretch-backports main' > /etc/apt/sources.list.d/backports.list

# 後でdeb.debian.orgの認証ができないと怒られるので鍵を追加
gpg --keyserver pgp.nic.ad.jp --recv-keys 8B48AD6246925553 7638D0442B90D010
gpg --armor --export 7638D0442B90D010 | apt-key add -
gpg --armor --export 8B48AD6246925553 | apt-key add -

exit

# Cockpitのインストール
apt-get update
sudo apt-get install cockpit
```

https://{Raspberry Piのアドレス}:9090 にアクセスしてみる。
![Cockpit_login.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439140/a2622610-9c94-ccf0-72c6-ff62fec05bf2.png)

オレオレ証明書だと怒られるけれど、とりあえずそのままアクセス。後でLet's Encryptで証明書を作った方が良いんでしょうが、自宅用なのでとりあえずこのまま。

ログインするとこんな感じ。
![Cockpit_system.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439140/fc2a3156-3371-9f51-040a-173ca0ad2b4d.png)


### 参考文献

* https://cockpit-project.org
* https://rolfje.wordpress.com/2017/06/09/installing-gpg-keys-for-debian-backports/
* https://gihyo.jp/admin/serial/01/ubuntu-recipe/0480
makeblockのHaloCodeで簡単IoT

# はじめに
私は3ヶ月くらい前から[CoderDojo](https://coderdojo.jp/)という子どもを対象にしたプログラミングコミュニティのメンターを[五反田](https://coderdojo-gotanda.doorkeeper.jp/)の方でやっています。その話が今回の[HaloCode](https://www.makeblock.com/steam-kits/halocode)とどう関係しているのかというと、実はこのHaloCodeを[makeblock](https://www.makeblock.com/jp)さんがCoderDojoCoderDojoのためにボードを**無償提供**してくれたということが今回のお話の背景にあります。詳細は[こちら](https://news.coderdojo.jp/2019/05/10/makeblock-halocode-and-coderdojo-japan/?fbclid=IwAR0scoLSZk0KN7M1jU3pYrKv944uQSLaJxo55ipnw6PaFS8VUcZ3yaSON_M)をクリックしてください。そしてこのmakeblockを使ったことをブログやSNSで発信することがこのHaloCode提供の条件らしいので今回はそのレポートについて書きます。

# HaloCodeについて
見た目は↓のような感じです。
![iOS の画像 (2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209689/980bce26-67ba-35de-c8ba-ee3d4657d067.jpeg)
![iOS の画像 (3).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209689/95b214a5-6f3a-8b67-eb04-c4b16634007c.jpeg)
どうやら[ESP32](https://www.espressif.com/en/products/hardware/esp32/overview)がメインチップになっていますね。この系統のマイコンはESP8266の方で昔に[記事](https://qiita.com/ufoo68/items/2c5a2d7e427b46ff0c88)を書いたことがあります。ESP32だとこの[記事](https://qiita.com/ufoo68/items/63dc64958cddd6bfb36a)の内容で触ったりしました。ESPは安いわりに色々と使い勝手が良くて便利ですね。最近はこのESP32をベースにしたお手軽マイコンを色んな会社が作ってきているという印象を感じます。
すこし話を戻して、このHaloCodeは**mBlock**というソフトを用いて開発します。ダウンロードは[こちら](https://www.makeblock.com/steam-kits/halocode-2#Software)から。オンラインエディタもあるので必ずしもローカル環境を使う必要もないみたいですね。

# mBlockを使った開発
開発画面はこんな感じです↓
![2019-06-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209689/ac97b178-64d8-6371-cb13-73d450c925f3.png)
ほとんど[Scratch](https://scratch.mit.edu/)のブロックエディタと同じですね。一応Pythonでもできるらしいです。まずはこのmBlockの左下の`デバイス`の追加をクリックしてデバイスライブラリを起動します。
![2019-06-16 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209689/a00c9a02-3892-e1c8-1052-7adb9f3add83.png)
どうやら普通のArduinoでも使えるらしいですね。これを使えば「Scratchでゲーム作りもいいけど、何かハード的なものもやってみたい」という子にオススメできますね。

# とりあえず光らしてみる
HaloCodeはRGB点灯のLEDがあるみたいなので、虹色に光らせるブロックを組んでみました。
![2019-06-16 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209689/340c236e-59d6-c1b7-6de4-1a1c1086c8ae.png)
たったこれだけです(笑)。さっそく書き込みましょう！ちなみに書き込みには**mLink**が必要なので[ここ](http://www.mblock.cc/mblock-software/)からダウンロードしてください。
![iOS の画像 (4).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209689/9a95affd-ff50-ebe3-3d5e-b2d507364b3e.jpeg)
とりあえずこんな感じで光りました。

# さいごに
この記事ではLEDを光らせるということだけしかしませんでしたが、このHaloCodeにはいろんな機能があります。

- WiFi接続
- 音声認識（マイクが搭載）
- 加速度や回転角度の取得
- タッチセンサ

今回は取り上げられなかった機能がまだまだあるので、色々と遊べそうですね！！
CLIのインストール(AWS)

# AWS CLIとは
AWSの操作をコマンドライン上で実現できるツールです。
pythonで作られているため、`pip`でインストールします。

# インストール方法
Macの場合

```
pip install --upgrade --user awscli
```

# configの設定

```
$ aws configure
AWS Access Key ID [None]: 
AWS Secret Access Key [None]: 
Default region name [None]: ap-northeast-1
Default output format [None]: 
```

userの確認

```
$ aws iam list-users
{
    "Users": [
        {
            "UserName": "",
            "PasswordLastUsed": "2018-08-07T09:57:53Z",
            "CreateDate": "2018-08-07T04:56:03Z",
            "UserId": "",
            "Path": "/",
            "Arn": "arn:aws:iam:::user/"
        }
    ]
}
```
【メモ】市区町村データ、市区町村コード付きでデータベースに入れる



テスト用の市区町村データの突っ込み方

```
psql -h localhost  -U residential_map -p 5432 residential < ~/Downloads/2019-03-24-full-buckup.sql
```

sqlの中身はこんな感じ stdinは知らなかった。

```sql
COPY public.mst_city (city_id, pref_id, name, furi, lat, lng) FROM stdin;
01215	1	美唄市	ビバイシ	\N	\N
01216	1	芦別市	アシベツシ	\N	\N
01217	1	江別市	エベツシ	\N	\N
01218	1	赤平市	アカビラシ	\N	\N
01219	1	紋別市	モンベツシ	\N	\N


...


01211	1	網走市	アバシリシ	44.0206058999999996	144.273483700000014
\.

```