OmniAICreator/Qiita-1.07M huggingface dataset:
Wekaのインストールと使い方

# Wekaとは
http://weka-jp.info/
機械学習の統合環境


# インストール
https://www.cs.waikato.ac.nz/ml/weka/downloading.html
より、自分のOSに合ったものをダウンロードして、インストールする。


# データの用意
Wekaで分類するデータは、arff と呼ばれる形式にする必要がある。
[waikato大学のウェブページより](https://www.cs.waikato.ac.nz/~ml/weka/)

```arff:sample.arff
@RELATION iris

@ATTRIBUTE sepallength  NUMERIC
@ATTRIBUTE sepalwidth   NUMERIC
@ATTRIBUTE petallength  NUMERIC
@ATTRIBUTE petalwidth   NUMERIC
@ATTRIBUTE class        {Iris-setosa,Iris-versicolor,Iris-virginica}

@DATA
5.1,3.5,1.4,0.2,Iris-setosa
4.9,3.0,1.4,0.2,Iris-setosa
4.7,3.2,1.3,0.2,Iris-setosa
4.6,3.1,1.5,0.2,Iris-setosa
5.0,3.6,1.4,0.2,Iris-setosa
5.4,3.9,1.7,0.4,Iris-setosa
4.6,3.4,1.4,0.3,Iris-setosa
5.0,3.4,1.5,0.2,Iris-setosa
4.4,2.9,1.4,0.2,Iris-setosa
4.9,3.1,1.5,0.1,Iris-setosa
```

`@relation <relation-name>`
`@attribute <attribute-name> <datatype>`

\<datatype>には、以下のデータ形式を指定する。

numeric （数字。つまり整数か実数）
<nominal-specification>　（有限の記号。例えば、YESとNOとか。）
string （文字列）
date [<date-format>]　（日時。<date-format>は省略可能。省略した場合は、"yyyy-MM-dd'T'HH：mm：ss"）

nominal-specificationは、中カッコ「{ }」で囲んで、カンマで区切る。例は上記にある通り。
YESとNOなら、{YES,NO} といった感じ。

## 決定木で機械学習
1. Explorerを開く。
<img width="500" alt="Weka_GUI_Chooser.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477221/94aa68ad-b01a-3627-169c-07355f218044.png">

2. `Open file...`から、先ほどのファイルを開く。
<img width="1023" alt="Weka_Explorer.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477221/a6987dce-64fc-0ba0-8be0-c8d893bfd12c.png">

3. Classifyタブを選ぶ
<img width="1019" alt="Weka_Explorer-2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477221/92a06225-378f-2794-7b82-a6899e8e7502.png">

4. Chooseからweka>classifiers>trees>J48を選択
<img width="1023" alt="Weka_Explorer_と_Weka_GUI_Chooser.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477221/c50f4620-a8d1-bb13-3287-7b4c47470680.png">
<img width="1022" alt="Weka_Explorer-3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477221/e784a7b6-5005-e2b4-483c-87d0bae73edb.png">

5. `Test options`でどんな検定をするか設定できる。　デフォルトは10分割交差検定。
<img width="1047" alt="Weka_Explorer-4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477221/21c666b6-ec18-9e11-5430-1daf1f70a65c.png">

6. `Test options`の下に表示されているものが、分類される対象のデータ。
sample.arffの属性の最後の行に記述されているものが表示されるが、タップして変更することも可能。
<img width="1047" alt="Weka_Explorer_と_Weka_GUI_Chooser-2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477221/3447d355-01fe-9bce-59cd-10eda555a6ac.png">

7. `Start`ボタンを押す。
<img width="1046" alt="Weka_Explorer-5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477221/f7178467-54f9-7fb3-e0b8-287402d74612.png">
`Summary`の`Correctly Classified Instances`に書かれているのが、分類精度。
今回のサンプルデータだと 100%！
<img width="1022" alt="Weka_Explorer_と_Weka_GUI_Chooser-3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477221/5761f2c0-2d84-0b22-7e2a-fc3ebb165bca.png">

## まとめ
分類器 `Classifier`を選択する際に他のものを選択するだけで、`SVM`や`Random Forest`なども簡単にできる。
RTGSに関するプログラム発表


- 機能紹介
 - 課題とコンセプトを取り上る
 -  上述の課題とコンセプトにマッチした機能を紹介する。
- 画面遷移図
 - 画面遷移図を取り上げコメントを入れたい。
 - また、あまりきれいに書き上げていないので、時間があれば訂正したい。
- 画面レイアウト
 - 12枚のxlsファイルを表示する。
 - ここの画像ファイルにコメントと説明をつける
- メリットとデメリット
 - 図や表を利用しまとめる
 - 下述のが少し思いついたものである。
- 将来性
- まとめ

---



### メリット
視認性が良く、手続き処理の現状が視覚的に見える
すべてのツールを電子化してるため、紙などが必要なくエコロジーまた、紙を保存する必要がないため小さな場所で行うことができ、検索性能が紙より効率的であると　考える。
電話を利用しないため（語弊がある）、8人で回していたときよりも、電話を取れなくて、対応できないパターンの障害が少ない
画面の数は12と、平均的だが内容が似ているものが多く、実際のコストは低くなると考えられる。

---

### デメリット
新人のサポート機能が弱い
サーバやシステム障害により、データが飛んだとき、対処のしようがない
コミッション（決済手続き）で問題が起きたときの対応が弱い
以降の際に利用していた紙媒体の文書を電子化する必要があり、手間がかかる
紙媒体ではないため、保管の際のセキュリティを最新にする必要があり、その点ではコストはかかると考える。

---
### 将来性
電子化により莫大なデータを集められるため、機械学習やビッグデータ解析を用いて、分析しその結果を反映するのは面白い（最終的に、機械のみに運用させるところを考える）また、運用可能額も流動的に変異するため、複数の案件を抱えていたときのどれを選べば最大の利益を生むかを考えられる。また、データとして存在しているため、様々な分析がしやすい。


クラウド化を利用することにより、自行の銀行員が瞬時に情報を見ることができる。（銀行の買収する際の資料として利用できる）
PyPIにLINE WORKS APIのパッケージを公開してみた

こんばんは、@0yanです。
- LINE WORKSのトークBotをつくるたびに過去のコードを引っ張ってくるのはめんどくさいな
- pip installできたら楽になるんじゃないか
- 他の人も使えるようになれば喜ばれるのではないだろうか
と考え、LINE WORKSのパッケージを作り、PyPIに公開してみました。
（ついでにコードもブラッシュアップしました）


#リンク
PyPI： [lineworks](https://pypi.org/project/lineworks)
GitHub： [0yan/lineworks](https://github.com/0yan/lineworks)



# 感想
自分自身がまだサーバーAPIとトークBot APIの一部しか必要としていないので、それしか入っていないパッケージになりますが、`pip install lineworks`だけで簡単に使えるようになることに凄く感動しました。
こんな環境が用意されているPythonって本当に凄い！
必要に応じて、パッケージを充実させていきたいと思います。



# PyPI公開手順
@shinichi-takiiさんの記事を見ながら公開しました。
>[PyPIパッケージ公開手順](https://qiita.com/shinichi-takii/items/e90dcf7550ef13b047b5)

@shinichi-takiiさん、分かり易い記事を書いて頂きありがとうございました！！
[Updates were rejected because the tip of your current branch is behind] エラー解説、解消法

Gitでバージョン管理をしていると、

```
! [rejected]

hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Merge the remote changes (e.g. 'git pull')
hint: before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
```
こんな感じのエラーメッセージとともにpushが拒まれることがあります。

##エラーの意味
このエラーは `the tip of your current branch is behind` この文章にもあるように、

プッシュしようとしている作業ブランチの最新のコミットが、リモートリポジトリの最新のコミットよりも後ろにある

という意味で、

最新のブランチをpullせずに編集してしまったり、
編集の際に`git reset` などでどこかしらの過去のコミットの場面に戻って修正してしまっていたときに起こり得ます。

##エラー解消法

解消法は２つあります。

###git pullで最新の状態のブランチを取得してからpush
まず１つ目は `Merge the remote changes (e.g. 'git pull')` このヒントメッセージにもあるように、リモートリポジトリにある最新のブランチをpullするという方法です。

`git pull (origin 作業ディレクトリ)`

一旦最新のリポジトリを最新の状態にしてしまえば、このようなエラーが起きることはありません。

###強制push(乱用注意)

非推奨ですが、以下のように今の状態で強制的にpushしてしまう方法もあります

`git push -f リモートリポジトリ 作業ブランチ` 

これは共同開発をしている場合に乱用は避けなくてはいけませんが、 (他の人が、前の状態をpullしてた場合、強制pushの内容をpull出来なくなってしまったりして他の人にも影響が出る可能性もあるので)

1人で開発していて、他に迷惑がかかることがなかったり最新の状態をpullするとコンフリクトを起こすのをわかっていて解消がめんどくさいし不要というときなどに使うのかも
【matplotlib基礎】第2軸を持つグラフを描画する

#概要
複数のグラフを比較したいときに，グラフを重ねて表示すればふつうの場合は比較できますが，比較したいグラフのスケールがあまりにも違いすぎるときは，比較がしづらいですよね．
そんな時に使うのが，第2軸を持つグラフです．
スケールの異なるグラフの他，全く違う量を並べて表示したい時にも使いますね．雨温図とかは典型的な例でしょうか？

今回は，そんな第2軸を持つグラフを描画していきます．

#動作環境
- Windows10(64bit)
- Python 3.7.2

#コード
では，早速実装していきましょう．

```py:graph_2axis.py
"""第2軸をもつグラフを描画するプログラム"""
import numpy as np
import matplotlib.pyplot as plt

# figure()でグラフを描画する領域を確保，figというオブジェクトにする．
fig = plt.figure()

# add_subplot()でグラフを描画する領域を追加する．引数は行，列，場所
ax1 = fig.add_subplot(1, 1, 1) 
ax2 = ax1.twinx()   # x軸を共有

t = np.linspace(0, 10, 1000)
y1 = np.sin(t)
y2 = 10*np.cos(t)

c1, c2 = "blue", "red"  # 各プロットの色
l1, l2 = "sin", "10cos" # 各ラベル

# 1つ目のグラフを描画
ax1.set_xlabel('t') #x軸ラベル
ax1.set_title(r"$\sin(x)$ and 10$\cos(x)$") #グラフタイトル
ax1.grid() #罫線
ax1.plot(t, y1, color=c1, label=l1)
h1, l1 = ax1.get_legend_handles_labels()

# 2つ目のグラフを描画
ax2.plot(t, y2, color=c2, label=l2)
h2, l2 = ax2.get_legend_handles_labels()

ax1.legend(h1+h2, l1+l2, loc='upper right') # ax1とax2の凡例のhandlerとlabelのリストを結合
plt.show()
```

実行結果は以下のようになります．

![graph_2axis.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433790/cf2916c2-69ca-2ca5-0852-db3fb1fc1e61.png)

#解説
ポイントは3つです．

- x軸の共有

まずは，x軸を共有させます．

```py
ax2 = ax1.twinx()
```

- handlerとlabelの取得

凡例を表示するために，handlerとlabelを取得します．

```py
h1, l1 = ax1.get_legend_handles_labels()
h2, l2 = ax2.get_legend_handles_labels()
```

- 凡例の作成

ax1とax2の凡例のhandlerとlabelのリストを結合して，凡例を作成します．

```py
ax1.legend(h1+h2, l1+l2, loc='upper right')
```


#まとめ
いかがだったでしょうか？
第2軸をもつグラフはたまに必要になりますよね．位相差を確認したいときなど？
コードに関して建設的なフィードバックなどあればコメントをいただけると助かります．
【wordpress】Cloud9でwordpress編集環境を構築するには？_Part1(Cloud9での環境構築編)

# AWS Cloud9上でwordpress開発環境を構築する
Part1では
- AWSでCloud9開発環境を作る。
- wordpressで必要なPHPのライブラリ管理ツール"Composer"をインストールする。
- Heroku cliをインストールする。

### 参考サイト:
- https://qiita.com/fuwamaki/items/8684003bb47197336645
- https://www.virment.com/how-to-install-composer-linux/

### 注意点
1. AWSの無料アカウントは作成済み。
1. Google Chromeで作業実施。

## 1.AWSでCloud9開発環境を作る。
- AWSのコンソールからcloud9で検索、遷移
![NoName_2019-8-15_16-29-58_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/3a33a67c-ee75-ffdd-b842-5a82d7bb79bc.png)
- Create environmentを選択。
![NoName_2019-8-15_16-32-51_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/457d5f8a-15df-eb64-6ca8-c7551d69ac66.png)
- 設定項目を入力してNext Stepを選択
![NoName_2019-8-15_16-33-22_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/c1528aa8-3e6f-93b4-579a-4e9cf83c1c6e.png)
![NoName_2019-8-15_16-34-54_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/b56fe71d-4aa7-0d74-65b9-48cc49ce108e.png)
- 設定内容を確認して、Create environmentを選択
![NoName_2019-8-15_16-35-40_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/a04b510f-b868-437d-8d69-dae98cbbfd2a.png)
![NoName_2019-8-15_16-36-1_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/475c7fa7-707e-95f0-75af-ffb3cebef0b6.png)
- Welcome画面とコンソールの起動を確認
![NoName_2019-8-15_16-41-34_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/16d10ba7-a11a-6e87-821d-a8c9c48b5c35.png)

- 以下2コマンドを実行

```
sudo apt update
sudo apt upgrade
```

## 2.PHPのライブラリ管理ツール"Composer"をインストールする。
- PHPのバージョン確認

```
php -v
PHP 7.2.19-0ubuntu0.18.04.2 (cli) (built: Aug 12 2019 19:34:28) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.2.19-0ubuntu0.18.04.2, Copyright (c) 1999-2018, by Zend Technologies
    with Xdebug v2.6.0, Copyright (c) 2002-2018, by Derick Rethans
```
- Composerのダウンロード、インストール、インストーラ削除

```
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php composer-setup.php
php -r "unlink('composer-setup.php');"
```
- Composerのインストール確認 ※実施環境ではコマンドがnot foundになってしまったため、pharファイルの移動も実施

```
composer -v
Command 'composer' not found, but can be installed with:
sudo apt install composer

sudo mv composer.phar /usr/local/bin/composer
composer -v
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 1.9.0 2019-08-02 20:55:32
```
## 3.Heroku cliをインストールする。
- Heroku cliのインストーラDL,実行,インストール確認

```
wget -qO- https://cli-assets.heroku.com/install-ubuntu.sh | sh
heroku --version
heroku/7.27.1 linux-x64 node-v11.14.0
```
MySQLでデータ登録後に文字コードを変更したい場合の対応方法

タイトルの通り、MySQLで`default-character-set=utf8`をmy.cnfに設定せずに、`CREATE TABLE`やデータの挿入をしてしまった後から文字コードを変える手順です。
# まずはじめに
**この文章は本来やらなくてよいことをやっています。**
本来であれば以下のようにmy.cnfを設定したり

```my.cnf
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci

[client]
default-character-set=utf8
```

my.cnfを設定していなかったとしても、以下のように文字コードを宣言してからINSERTを実行すればよいわけです。

```sql
SET character_set_database=utf8;
ALTER TABLE target_table CHARACTER SET utf8;
```

が、たっぷり半角英数字のカラムにだけデータを入れた後に、2バイト文字をUPDATEで入れようとしたらエラーが出た・・・てな時にやる備忘録です。

# 既にデータが入っているテーブルの文字コードを変更するときは`convert`を入れる。

```sql
ALTER TABLE target_table CONVERT TO CHARACTER SET utf8; 
```

これで再度エラーがでたUPDATE文を実行すれば無事に通るはずです。

# 参考URL
MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.1.7 ALTER TABLE 構文
https://dev.mysql.com/doc/refman/5.6/ja/alter-table.html
FirebaseCLIで`firebase: command not found`と怒られた


FirebaseCLIを使ってみた際に怒られてしまったので備忘録として残します。

#### 前提条件
1. ndenv
2. Mac

#### 症状
`firebase login`を入力し、実行すると・・・

```bash
$ firebase login
-bash: firebase: command not found
```
このようなエラーが出て怒られてしまいます。


### 結論
PATHが通っていないため、`firebase`関連のコマンドが参照できていませんでした。

### 解決方法
bash_profileにPATHを通すコマンドを記述する

`~/.bash_profile`に次のPATHを通すコマンドを追記しましょう。
nodeのバージョンは、環境により違ってくるため、使用しているバージョンに合わせて書き換えてください。※ `$ ndenv versions`で確認できます

```bash:.bash_profile
export PATH="$HOME/.ndenv/versions/{nodeのバージョン}/bin:$PATH"
```

追記し終えたら、次のコマンドで変更を適用します。

```bash
$ exec $SHELL -l
```

ここまで来たら、後は`firebase login`を打つだけです。

```terminal
$ firebase login

? Allow Firebase to collect anonymous CLI usage and error reporting information
 Yes ?

~~~ 省略 ~~~

Waiting for authentication...

✔  Success! Logged in as {メールアドレス}
```

`Success! Logged in ~~~`と出たら成功です。

お疲れ様でした！
初心者のためのArchLinuxの素晴らしさと入門する手っ取り早い方法を熱く語る記事

#初めに
Twitterを見ていると、よく「Ubuntu重い」や「ArchLinuxわからん」という話をちらほら見ます。
そういった人はたいてい「仮想マシンにUbuntu入れたことはあるけどなんか合わない」という人や「ArchLinux使ってみたいけどいろんなサイトがあってわけわからん」「サイトによって方法違うの何」といったことを言っています。
この記事はそうした人を助けるために書きました。
この記事はいわゆるリンク集になるのでPCなどのタブ移動しやすいデバイスで見ることをおすすめします。

#この記事の対象

- Ubuntuなどを仮想マシンにインストールしたことがある
- 仮想マシンの使い方がわかる
という人向けです。あまりにも基本的な説明（基本的な用語や仮想マシンの使い方など）はしないので他のサイトをご覧ください。

#まずは仮想マシン
それでは早速ArchLinuxを触っていきましょう。
といっても、いきなり実機にインストールするのはやめたほうが良いです。
なにか問題が発生したときに再インストールが面倒なのでね。
まずは仮想マシンで練習しましょう。

#インストール方法
[ここ](https://qiita.com/Hayao0819/items/1ab6f2984878978d0c3c)にインストール方法をまとめました。
この記事は初心者向けに難しいことは一切せずに簡単にできるようになっています。
（例えばViを使用しない、fdiskやdiskpartを使用しない、ネットワーク接続はコマンド一発 など）

#インストール後
インストールが終わったら[こちらの記事](https://qiita.com/Hayao0819/items/f23c6a6f1e103c5b6a83)にあるコマンドをどんどん打ってGUIやOffice、基本的なツールをインストールします。
ここまでくればUbuntuなどと同じように使用できるはずです。

#自分の好きなパッケージをインストールする
自分の好きなパッケージをインストールしましょう。
例えばGoogleChromeやVLCなどですが、ArchLinuxにはソフトウェアセンターのようなものはありません。
その代わりAURというものがあります。
AURとはArch User Repositoryの略で、ユーザーが誰でも自由にパッケージをアップロードできるリポジトリーです。
その性質上、当然動かないものもあるかもしれませんがパッケージの量はUbuntuの比ではありません。
GoogleChromeやグラフィックドライバなどのプロプライエタリソフトウェアから、最新のlinuxカーネルまでなんでもあります。
[こちらのAURのサイト](https://aur.archlinux.org/)でパッケージを検索し、

```bash
yay -S パッケージ名
```
と打つだけで簡単にパッケージをインストールできます。
これこそがArchLinuxの醍醐味であり素晴らしいところです。
AURを使えばWindows風にもMac風にもなんでもできます。
UbuntuやDebianのパッケージ管理システムであるdpkgですら簡単にインストールできてしまいます。

#トラブルに遭遇したら
ArchLinuxには素晴らしいWikiがあります。
このWikiはArchLinuxに限らず、UbuntuやDebian、CentOSやFedoraなどに流用できる情報も数多くあります。
Archwikiは[こちら](https://wiki.archlinux.jp/)からアクセスできます。
このWikiで問題の起きているパッケージを検索すればほぼ必ずその問題の解決方法があります。
もしWikiに載っていなければGoogleで「ArchLinux hogehoge」で調べればほぼ必ず出てきます。
最初は面倒だと思うかもしれませんが、なれてくるとトラブルの一つ一つが楽しくなり、Linuxのスキルがどんどん身につきます。

#最後に
ArchLinuxは素晴らしいディストリビューションです。
自分の思う通りに環境を構築でき、また、問題に遭遇しても膨大な情報が助けてくれます。
ArchLinuxは素のLinuxに近いため、初心者から中級者になるのにちょうど良いものです。
ArchLinuxで身につけた知識の多くは他のディストリビューションでも流用できます。
Linuxというものの理解するにはArchLinuxは素晴らしい教材になります。
もしわからないことがあれば作者のメールアドレス（shun819.mail アットマーク gmail.com）へ遠慮なく問い合わせてください。（スパム対策のため、@をカタカナにしています）

最後になりますが、[筆者のTwitter](https://twitter.com/Hayao0819)をフォローしてくださると筆者が喜びます。
DMでの質問も大歓迎です。
VisualStudioでImageContentTaskやMeshContentPipelineタスクが予期せずに失敗しました。と出る時の対処法

![ai.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368850/48ab3b20-29a2-4de3-75ce-9ae60a48eb7a.png)
こんなやつですね。

#要因
Visual Studioに追加したファイルの名前が変更されている、削除されている、または移動している可能性があります。
#対処法
![g.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368850/10d4d9db-94a4-f4e0-fe77-cb48b4c64f8f.png)
Visual Studioに追加したファイルをクリックして
![error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368850/7f964d5d-1026-8730-98a9-49df1d58ddaf.png)
こんな表示が出たらそのファイルの場所や名前を確認してみましょう。
[Node.js12系] Error: write EPROTO 4415608256:error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol

## 環境

Node 12.8.0

## 事象

Node.jsでRedmine APIを叩いた時に以下のエラーが発生

> Error: write EPROTO 4415608256:error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol:../deps/openssl/openssl/ssl/statem/statem_lib.c:1922:

## コード

```ts
import axios from 'axios'

class ApiConnectBase {
  async get(url: string, params: object) {
    return await axios.get(url, {
      params: params
    })
  }
}

class ApiInfo extends ApiConnectBase{
  :
  :
}
```

```ts
const hoge = await rApi.get('https://hoge.piyo/projects.json?key=dummydummydummy', {})
console.log(hoge.data)
```

## 原因

多分これ。
https://github.com/nodejs/help/issues/1936

## 対応

Node.jsのバージョンを11系にして対応
[linux] マウスボタンにキーボードのキーを割り当てる




# はじめに
マウスのホイールクリック(ミドルボタン)にキーボードのキーを割り当てたいと思います。滅茶滅茶かんたんなので記事にするか悩みましたが、意外と日本語の記事が無かったのでメモを残しておきます。困っていた人に読んでいただければ嬉しいです。

## インストール
```terminal:terminal
sudo apt install -y xdotool xbindkeys
```

## button番号を調べる。

```terminal:terminal
xev | grep button
```

### 設定
```text:~/.xbindkeysrc
# ホイールクリックにスペースを割り当てる場合
"xdotool key space"
b:2
```
## 再読込
```
killall xbindkeys
xbindkeys
```

# 参考文献
[こちらも参考になります](https://amzn.to/31A6Anr)
同期処理、非同期処理、並列処理のざっくりとした違い

## 同期処理

- 書いた順番に実行されていく
- 重たい処理が間にあると、そこで大きな待ち時間が生まれる

## 非同期処理

- 外部のサーバと通信する関数を呼んだあと、レスポンスが返るまでに一旦関数から抜けて別の処理を進めて
  レスポンスを受け取り次第、呼び出し元に値を返す
- Aという関数が完了次第、実行したい関数(function)を引数として渡して実行させるものをコールバック関数という
- JavaScriptでは、上述のコールバック関数で処理順をコントロールできるが、ネストが深くなる（コールバック地獄）など可読性が損なわれることがあるため、場合によってasync/await/promise/resolve(),reject()を用いる。

## 並列処理

- A、B、Cの処理をよーいどん、で3つ同時にスタートする
- 複数のプロセス上で、複数のスレッドが立ち上がる
- 一つのプロセス上で、複数のスレッドを切り替えながら処理をすることは並行処理という。
- 私が初めて触った言語のJavaやGolang, Pythonなどで並列処理が可能

## おわりに

同期処理、非同期処理についてはJavaScriptを触る上で絶対に避けられないポイントのようだったので
今回調べてみた結果を簡単にまとめておきました。
参考にしたサイトは以下に記します。

[JavaScriptの非同期処理を並列処理と勘違いしていませんか？](https://qiita.com/klme_u6/items/ea155f82cbe44d6f5d88)
[非同期処理ってどういうこと？JavaScriptで一から学ぶ](https://qiita.com/kiyodori/items/da434d169755cbb20447)
[Javaの並行処理を理解する（入門編）](https://qiita.com/bremen/items/b87bff49565fc9abc91b)
[並行処理、並列処理のあれこれ](https://qiita.com/Kohei909Otsuka/items/26be74de803d195b37bd)
[async/awaitで非同期処理はシンプルになる](https://qiita.com/ryosukes/items/db8b45c8ea42f924f02f)
Leetcode #366: Find Leaves of Binary Tree

```swift
func findLeaves(_ root: TreeNode?) -> [[Int]] {
    var answer = [[Int]]()
    helper(root, &answer)
    return answer
}

private func helper(_ node: TreeNode?, _ answer: inout [[Int]]) -> Int {
    if node == nil {
        return 0
    }
    let height = 1 + max(helper(node?.left, &answer), helper(node?.right, &answer))
    if height > answer.count {
        answer.append([])
    }
    answer[height-1].append(node!.val)
    return height
    
}
```
個人的 TypeORM 導入コピペ集

## パッケージを入れる

基本的には、以下を入れる。

```sh
$ npm i typeorm reflect-metadata
$ npm i @types/node typescript ts-node tsconfig-paths --save-dev
```

MySQL を使うなら

```sh
$ npm i mysql
```

PostgreSQL を使うなら

```sh
$ npm i pg
```


あとバリデが必要なら

```sh
npm i class-validator --save-dev
```

あたりを入れる。

## npm scripts に typeorm をつくる

```json
"scripts": {
  "typeorm": "ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli.js"
}
```

とかしておくと

```sh
$ npm run typeorm migration:run
```

とか

```sh
$ npm run typeorm migration:generate -- -n InitialSchema
```

とかできて便利な気がする。

## tsconfig.json

まあ target とかは、よしなに変える。

```json
{
  "compilerOptions": {
    "target": "es2015",
    "module": "commonjs",
    "outDir": "./dist",
    "rootDir": "./src",
    "strict": true,
    "moduleResolution": "node",
    "baseUrl": "./",
    "esModuleInterop": true,
    "experimentalDecorators": true,
    "emitDecoratorMetadata": true
  }
}
```

大事なのは experimentalDecorators と emitDecoratorMetadata が true になっていること。

## ormconfig.js

環境変数は、dotenv とか使うと良いと思う。

```js
module.exports = {
  type: 'mysql',
  host: process.env.DB_HOST,
  port: process.env.DB_PORT,
  username: process.env.DB_USERNAME,
  password: process.env.DB_PASSWORD,
  database: process.env.DB_DATABASE,
  charset: process.env.DB_CHARSET,
  timezone: process.env.DB_TIMEZONE,
  entities: ['./src/models/entities/*.ts'],
  migrations: ['./src/models/migrations/*.ts'],
  cli: {
    entitiesDir: './src/models/entities',
    migrationsDir: './src/models/migrations'
  }
}
```

ちなみに .env.example は、こんな感じ。

```
DB_HOST=
DB_PORT=3306
DB_USERNAME=
DB_PASSWORD=
DB_DATABASE=
DB_CHARSET=utf8mb4
DB_TIMEZONE=utc
```

## 一言

以上、個人的メモでした。
NSDateとDate 比較方法の違い

# はじめに

Objective-CからSwiftへの変換で、日付の比較方法が新しくなっていたのでその覚書です。

Objective-Cでは時刻を比較するのに、NSDateの[compare:](https://developer.apple.com/documentation/foundation/nsdate/1409748-compare?language=objc)を使用し、実行結果であるNSComparisonResultを調べます。
ただこの方法は、昇順(Ascending)、降順(Descending)という名前で新旧を判断しなくてはならないため、結果を直感的に判断できませんでした（私には💦）。

しかしSwiftでは、Dateクラスを不等号で比較することが可能になったため、直感的に比較できます。


# 比較方法

### Swift (Date)
``` swift
func compare(dateA: Date, dateB: Date) {    
    // 数が大きいほうが新しい時刻
    if dateA > dateB {
        print("DateA is newer!")
    } else if dateA == dateB {
        print("Same")
    } else if dateA < dateB {
        print("DateA is older.")
    }
}
```

### Objective-C (NSDate)

``` objc
+ (void)compare:(NSDate *)dateA dateB:(NSDate *)dateB {    
    NSComparisonResult result = [dateA compare:dateB];
    switch (result) {
        case NSOrderedAscending:
            // 昇順(dateA < dateB) dateAのほうが古い
            NSLog(@"dateA is older");
            break;
            
        case NSOrderedSame:
            // 同じ
            NSLog(@"Same");
            break;
            
        case NSOrderedDescending:
            // 降順(dateA > dateB) dateAのほうが新しい
            NSLog(@"dateA is newer!");
            break;
        default:
            break;
    }
}
```

# 参照
[Swift3で日付（Date）の比較が超簡単になっていた件 - Qiita](https://qiita.com/takashings/items/06b85a427aa560041a91)
[日付の比較 - Qiita](https://qiita.com/kouchi67/items/39341d5e78778b532536)
JavaScript switch文 まとめ

# 目的

- JavaScriptのswitch文について知る。

# 押さえるポイント

- 条件となる変数に入った値によって処理を分岐させるときに使う。
- caseを書いたら必ずbreakで処理を閉じる。
- 信号機を例として説明する。(説明のため実際の道路交通法とは異なります。)
下記のように「信号機の色」に対して「実施する処理」を分岐することができる。
    1. 信号機が赤の時は「とまれ」の処理
    1. 信号機が黄の時は「注意」の処理
    1. 信号機が青の時は「進め」の処理
    
# 書き方の例

- 信号機を用いてswitch文の例を記載する。

``` javascript
switch(信号の色){
  //「信号の色」に「赤色」が格納されているときに入る処理
  case 赤色:
    信号の色が赤色の時、すなわち車を止める処理;
    break;
  //「信号の色」に「黄色」が格納されているときに入る処理
  case 黄色:
    信号の色が黄色の時、すなわち車に注意を促す処理;
    break;
  //「信号の色」に「青色」が格納されているときに入る処理
  case 青色:
    信号の色が青色の時、すなわち車を進める処理;
    break;
  //「信号の色」に「赤色」「黄色」「青色」以外は格納されているときに入る処理
  default:
    信号の色が赤色、黄色、青色以外の時の処理;
    break;
}
```

# より具体的な例

- 信号機の例をより詳しく説明する。
- 信号機の色の表す変数colorを定義、この変数には「red」「yellow」「blue」のいづれかが格納される。
- colorがredの時に「車は止まります」と出力する。
- colorがyellowの時に「車は注意します」と出力する。
- colorがblueの時に「車は進みます」と出力する。
- colorにそれ以外の値が入った時「信号機は故障しています。」と出力する。
- 上記の処理を下記に記す。


``` javascript
switch(color){
  //「color」に「red」が格納されているときに入る処理
  case red:
    console.log("車は止まります");
    break;
  //「color」に「yellow」が格納されているときに入る処理
  case yellow:
    console.log("車は注意します");
    break;
  //「color」に「blue」が格納されているときに入る処理
  case blue:
    sonsole.log("車は進みます");
    break;
  //「color」に「red」「yellow」「blue」以外が格納されているときに入る処理
  default:
    console.log("信号は故障しています");
    break
}
```
JavaScript の 定数 まとめ ～const 変数名 = 格納する値～

# 目的

- JavaScriptの定数のふるまいを知る。

# 押さえるポイント

- 定数を定義してから値や文字列を格納する。
- 同一ステップで定数定義と値や文字列の格納を行う。
- 定数名は英数字大文字のみ使用すること。
- 2語以上の英単語から成る定数名のとき、1語目と2語目の間にアンダーバーを入れる。(user nameと定数名を命名したいときの定数名は`USER_NAME`となる)
- 数字で始まるものは定数名にできない
- 一度定数に格納した値は更新することができない

# 書き方の例

- 下記に汎用的な定数の定義と格納方法を記したJavaScriptファイルの内容を記載する。

``` javascriipt
const 定数名 = 数値;
const 定数名 = "定数に格納する文字列";
```

- 下記に定数に格納された文字列をコンソールに出力する処理を記したJavaScriptファイルの内容を記載する。

``` javascript
console.log(定数名);
# ※console.log("定数名");としないこと。定数に格納された値や文字列ではなく、定数名がコンソールに出力されてしまう
```

# より具体的な例

- 「MY_NAME」という名前の定数を定義して、文字列「miriwo」を格納する。
- 下記に定数定義と定数への格納方法を記したJavaScriptファイルの内容を記載する。

``` javascript
const MY_NAME = "miriwo";
```

- 定義された定数「MY_NAME」に格納された文字列をコンソールに出力する。
- 下記に定数に格納された文字列をコンソールに出力する処理を記したJavaScriptファイルの内容を記載する。

※>に続く記載はコンソールの出力

``` javascript
console.loc(MY_NAME);
>miriwo
```
JavaScript の 比較演算子

# 目的

- JavaScriptの比較演算子について知る。

# 押さえるポイント

- `<` `>` `=` `!`の記号を用いて値を比較する。
- `<` `>`と`=`を組み合わせて使用するときは必ず不等号が先、イコールが後。
- `=`と`!`を使用する等しい、等しくないの比較は文字列でも使用可。
- 主に分岐処理で使用する。

# 比較演算子のまとめ

|比較演算子  |具体的な使用方法  |意味  |
|---|---|---|
|<  |A < B  |AはB未満  |
|<=  |A <= B  |AはB以下  |
|>  |A > B  |BはA未満  |
|<=  |A >= B  |BはA以下  |
|===  |A === B  |AとBは等しい  |
|!==  |A !== B  |AとBは等しくない  |
|&&  |A && B  |AかつB(AとB両方が真なら真を返す)  |
|&#124;&#124;  |A &#124;&#124; B  |AまたはB(AかBどちらかが真なら真を返す)  |

# 具体的な例(何個かかいつまんで説明)

- 定数NUMBERには任意の数値が格納されている。  
※>に続く記載はコンソールの出力

- NUMBERが5未満の時にtrueと出力する処理

``` javascript
console.log(NUMBER < 5);
```

- NUMBERが5以上の時にtrueと出力する処理

``` javascript
console.log(NUMBR >= 5);
```

- NUMBERが5の時にtureと出力する処理

``` javascript
console.log(NUMBER === 5);
```

- NUMBERが5ではないときにtrueと出力する処理

``` javascript
console.log(NUMBER !== 5);
```

- NUMBERが10以上かつ、100未満の時にtrueと出力する処理
※数学的に表記すると10≦NUMBER＜100

``` javascript
// 書き方1
console.log(NUMBER >= 10 && 100 > NUMBER);

// 書き方2
console.log(NUMBER > 100 && 10 >= NUMBER);
```

- NUMBERが10以上または、100以上の時にtrueと出力する処理

```javascript
// 書き方1
console.log(NUMBER ≧ 10 || 100 ≦ NUMBER);

// 書き方
console.log(NUMBER ≧ 100 || 10 ≦ NUMBER);
```
Java Script の 変数 に 値 を 足して 結果 を 最初 の 変数 に 格納 する

# 目的

- JavaScriptの定義済みの変数Aに対して値を足し、合計の値を変数Aに格納し直す方法を知る。  
※変数の基本的な記載方法は[こちら](https://qiita.com/miriwo/items/248e0cef61479e96b621)

# 押さえるポイント

- [変数に格納されている値を更新](https://qiita.com/miriwo/items/214a43d0b7e2aa8d1008)する方法を応用する。

# 書き方の例

- 下記に汎用的な変数に格納されている値に値を足し、同じ変数に格納する方法を記したJavaScriptファイルの内容を記載する。

``` javascript
let 変数名 = 数値1;
変数名 = 変数名 + 数値2;
```

# より具体的な例

- 「number」という名前の変数に3を格納する。
- 「number」に格納されている値に2を足す。
- 足した後の値を「number」に格納する。
- 下記に上記の処理を記したJavaScriptgファイルの内容を記載する。

``` javascript
// 「number」変数に3を格納
let number = 3;

// 「number」変数の中の値に2を足し、結果を「number」に格納
number = number + 2;
```
JavaScript if 文 の まとめ

# 目的

- JavaScriptのif文の書き方を知る。

# 押さえるポイント

- 条件式には比較演算子を使用する
比較演算子についてまとめた投稿は[こちら]()
- if自体に`;`(セミコロン)は必要ない。  
※ただし、if分岐で真だった時の処理に`;`(セミコロン)は必要。

# 書き方の例

- 下記に汎用的なif文の記載方法を記す。

``` javascript
if(条件式){
  条件式が真の時の処理;
}
```

- 下記に汎用的なif文(偽の時の処理あり)の記載方法を記す。

``` javascript
if(条件式){
  条件式が真の時の処理;
}else{
  条件式が偽の時の処理;
}
```

- 下記に汎用的なif文(一つのif文で複数の分岐)の記載方法を記す。

``` javascript
if(条件式1){
  条件式1が真の時の処理;
}else if(条件式2){
  条件式1が偽で条件式2が真の時の処理;
}else{
  条件式1、条件式2がともに偽の時の処理;
}
```

# より具体的な例

- 変数ageに格納された値が20以上だった時、「私は成人しています。」と出力する。 
- 下記に上記の内容のif文の記載方法を記す。

``` javascript
if(age >= 20){
  console.log("私は成人しています。");
}
```

- 変数ageに格納された値が20以上だった時、「私は成人しています。」と出力する。
- 前述の条件に当てはまらない時、「私は未成年です。」と出力する。
- 下記に上記の内容のif文(偽の時の処理あり)の記載方法を記す。

``` javascript
if(age >= 20){
  console.log("私は成人しています。");
}else{
  console.log("私は未成年です。");
}
```

- 変数ageに格納された値が20以上だった時、「私は成人しています。」と出力する。
- 前述の条件に当てはまらないが、ageの値が18以上だった時、「私は未成年ですが、選挙権はあります。」と出力する。
- 前述の二つの条件に当てはまらない時、「私は18歳未満の未成年です。」と出力する。
- 下記に上記の内容のif文(一つのif文で複数の分岐)の記載方法を記す。

``` javascript
if(age >= 20){
  console.log("私は成人しています。");
}else if(age >= 18){
  console.log("私は未成年ですが、選挙権はあります。");
}else{
  console.log("私は18歳未満の未成年です。")
}
```
Project Euler 55,56をPythonでやってみる

特に工夫もなく終わったので2つ同時に

#問題 55
英語
https://projecteuler.net/problem=55
日本語
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2055

#解答 55

```Python:ProjectEuler55.py
def check_palindromic(num):
    num_str = str(num)
    num_reverse = int(num_str[::-1])
    if num == num_reverse:
        return 0
    else:
        return num + num_reverse


def check_Lychrel(num):
    num_str = str(num)
    num_reverse = int(num_str[::-1])
    num_sum = num + num_reverse
    for i in range(0,49):
        num_sum = check_palindromic(num_sum)
        if num_sum == 0:
            return False
    return True


count = 0
for i in range(1,10001):
    if check_Lychrel(i):
        count += 1
print(count)
```
0.142 seconds

#問題 56
英語
https://projecteuler.net/problem=56
日本語
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2056

#解答 56

```Python:ProjectEuler55.py
def digits_sum(num):
    num_str = str(num)
    num_sum = 0
    for i in range(0,len(num_str)):
        num_sum += int(num_str[i])
    return num_sum



digit_max = 0
for a in range(2,100):
    for b in range(2,100):
        ab = a**b
        digit = digits_sum(ab)
        if digit > digit_max:
            digit_max = digit
print(digit_max)
```

0.48 seconds
ChromeのWindow間を移動できますか？

#はじめに
ほどんどの（Macユーザの）人は、ChromeのTab間を`Ctrl + Tab`のショートカットキーで移動していると思いますが、**Window間をショートカットキーで移動**している人は、はたしてどれだけいるでしょうか？

私の場合は、例えば、
記事の執筆の時などには、Chromeウィンドウを二つ開いて、左にブログ、右に参考ページを複数準備して、こまめに移動することが多いので、ショートカットで移動できることは、かなり作業効率に繋がります。

#イメージ
**1. ウィンドウを左右に配置**
[![Image from Gyazo](https://i.gyazo.com/417f07125e11637c2d975fad49c16c39.gif)](https://gyazo.com/417f07125e11637c2d975fad49c16c39)

**2. ウィンドウを前後に配置**
[![Image from Gyazo](https://i.gyazo.com/ec68c1b0b67b1050804e1cd97f13fdb9.gif)](https://gyazo.com/ec68c1b0b67b1050804e1cd97f13fdb9)

#設定
<img width="663" alt="Keyboard.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269862/1176f0c6-ad0e-f9d1-9798-1c11880832ed.png">

**2ステップ**

- System Preferences --> Keyboard --> Shortcuts tabs --> **`Move focus to next window`** を確認。
- **`command + (バッククォート)`**に設定する。

私の場合は、設定前は、`command + Fn1`がウィンドウ間の移動に割り当てられていた。これは、タブを移動するキーとコンフリクトしていたため、上記のように設定を変更した。

**ここがポイント**
これは、Chrome以外のアプリケーションでも機能する。
ただし、私の経験では、Chrome以外に2ウィンドウを開くことはあまりない。。

#参考
[How to switch between different Chrome windows with keyboard shortcuts?](https://apple.stackexchange.com/questions/93835/how-to-switch-between-different-chrome-windows-with-keyboard-shortcuts)
Leetcode #951: Flip Equivalent Binary Trees

```swift
func flipEquiv(_ root1: TreeNode?, _ root2: TreeNode?) -> Bool {
    if root1 == nil && root2 == nil {
        return true
    }
    if root1 == nil || root2 == nil {
        return false
    }
    if root1!.val != root2!.val {
        return false
    }
    return (flipEquiv(root1?.left, root2?.left) && flipEquiv(root1?.right, root2?.right)) ||
        (flipEquiv(root1?.left, root2?.right) && flipEquiv(root1?.right, root2?.left))
}
```
MacbookProを初期化した話(OSクリーンインストールからHomebrewインストールまで)

#初期化の経緯
　夏休みを謳歌している私は、[doodle](https://www.google.com/doodles/halloween-2018)でハロウィンゲームを楽しんでいました。このゲームのマッチング中に、天下のgoogle様の開発した言語、Go言語ってどんな感じだろう…使ってみようかな？と考え始めました。安直です。すみません。

　まずは環境構築をしようと思い、リサーチを開始しました。ふむふむ、macならHomebrewを使ってパッケージ管理をした方が良いのか…。これまでの私は動けばいいやろ精神でパッケージを適当に展開し、PATHを通して…と、とにかく適当にやっていたので、私はこれを機にhomebrewで管理しようと思い立ちます。

Homebrewの導入は簡単で[Homebrew公式サイト](https://brew.sh/index_ja)のスクリプトをターミナルに貼って実行するだけです。しかし私はここで挫折を味わいます。インストール画面が出て、いい感じに進んでいるように見えたが、```brew help```コマンドを叩くとまあ大変。ファイルがないですって！？まあ原因はPATHが通っていないことだとわかり、色々試しましたが解決策がわからん…。ここで挫折しました。

　まあこのMacbookProも4年間使っているし、初期化してもいいかな？と考え始めました。考えたら即行動の私、重要データはクラウドに移していたため、初期化に踏み切ることができました。最高。

#MacOSクリーンインストール

　私は重要データをクラウドに投げてるから問題なかったが、皆さんは**バックアップとりましょうね。**ここからハードディスクの中身を全部吹っ飛ばす作業に入ります。一番すっきりしたよ。

　さてMacOSをクリーンインストールをしていきましょう。まずは一度端末をシャットダウンし、再起動します。

　今回は最新版のOSをインストールするため、起動ボタンを押した後に```option + command + R```を押します。macOSユーティリティが表示されるので、ディスクユーティリティをクリックし、ハードディスクを消去し、再構成します。これにより、ハードディスクがまっさらな状態に…！！いいね、断捨離だ。

　その後、メニューバーからディスクユーティリティを終了し、macOSユーティリティに戻ります。あとは「macOSを再インストール」を押して待つだけ！！パスワードを要求されたら入力しましょう。少し待つとセットアップの指示が出てきます。セットアップが完了すればMacをまっさらな状態で使うことができます。

#Homebrewインストール
　セットアップも完了したことだし、問題のHomebrewをインストールしていきましょう。

　ターミナルを開き、[Homebrew公式サイト](https://brew.sh/index_ja)に書かれているスクリプトを貼って実行してみましょう。少し待つとパスや何かボタンを押すことを要求されるので、指示に従います。そうすれば

```
==> Next steps:
- Run `brew help` to get started
- Further documentation: 
    https://docs.brew.sh
```

という表示がなされ、インストール終了となります。ちゃんとインストールできているかを確認するために指示通り```brew help```コマンドを叩きます。

```
Example usage:
  brew search [TEXT|/REGEX/]
  brew info [FORMULA...]
  brew install FORMULA...
  brew update
  brew upgrade [FORMULA...]
  brew uninstall FORMULA...
  brew list [FORMULA...]

Troubleshooting:
  brew config
  brew doctor
  brew install --verbose --debug FORMULA

Contributing:
  brew create [URL [--no-fetch]]
  brew edit [FORMULA...]

Further help:
  brew commands
  brew help [COMMAND]
  man brew
  https://docs.brew.sh
```
という表示がなされば成功です。クリーンインストール前は出なかったんですよ…。

　よし、ここまで出来れば私のGo言語の未来も明るいなと自分を褒め称えておきます。次はGo言語の環境構築を終わらせねば。また進捗が生まれれば投稿しようと思います。それでは。
AngularからMattermostにWebSocketで接続して投稿内容を取得する

タイトルのことがやりたかっただけなんですけど。
Mattermostに投稿があった時に、Angularでもその内容をリアルタイムで表示したくてですね。[API](https://api.mattermost.com/#tag/posts)に定期的にアクセスしてもいいんですけど、せっかくなのでWebSocketで接続したい。
というわけで、"Angular WebSocket"あたりで検索してみたところ、[Socket.IO](https://socket.io/)を使うだのObserverやら使うだの、かなり難度の高い方法ばかりでてくるんですが……
最終的に、下記のコードだけで実現できました。

```app.component.ts
import { Component, OnInit } from '@angular/core';
import { webSocket } from "rxjs/webSocket";
const subject = webSocket('wss://mattermost-server/api/v4/websocket');

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.scss']
})
export class AppComponent implements OnInit {

  constructor() { }

  ngOnInit() {
    subject.subscribe(
      (message: any) => {
        if(message.event == 'posted') console.log(JSON.parse(message.data.post).message);
      },
      err => console.log(err),
      () => console.log('complete')
    );
  }
}
```

んもー、すごく簡単じゃないですか。いやー、[RxJS](https://rxjs-dev.firebaseapp.com/api/webSocket/webSocket)便利。
ここにたどり着くまでにあれこれ遠回りしましたよ。

ちなみに、素のJavaScriptだとこんな感じ。

```js
const socket = new WebSocket("wss://mattermost-server/api/v4/websocket");
socket.addEventListener("message", event => {
  let message = JSON.parse(event.data);
  if(message.event == 'posted') console.log(JSON.parse(message.data.post).message);
});
```

そう、こんな風にシンプルに書きたかったんですよ。んもー。

----
追記。サービス化するとこんな感じ。

```websocket.service.ts
import { Injectable } from '@angular/core';
import { Subject } from 'rxjs';
import { webSocket } from "rxjs/webSocket";
const subject = webSocket('wss://mattermost-server/api/v4/websocket');

@Injectable({
  providedIn: 'root'
})
export class WebsocketService {

  data = new Subject<any>();
  data$= this.data.asObservable();

  constructor() {
    subject.subscribe(
      (message: any) => {
        this.data.next(message);
      },
      err => console.log(err),
      () => console.log('complete')
    );
  }
}
```

```app.component.ts
import { Component, OnInit } from '@angular/core';
import { WebsocketService } from './websocket.service';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.scss']
})
export class AppComponent implements OnInit {

  constructor(
    private websocket: WebsocketService,
  ) {}

  ngOnInit() {
    this.websocket.data$.subscribe(
      (message: any) => {
        if(message.event == 'posted') console.log(JSON.parse(message.data.post).message);
      }
    );
  }
}
```

サービス側で、イベント種別毎だとかチャンネル毎だとかで分けて`next`に流すと便利なんだろうな……
気が向いたら実装してみよう。
Multiplicative Persistence

[Multiplicative Persistence 11を求めた](https://twitter.com/KeikoUTorii/status/1161322092165337088) の関連記事

参考: [Python](https://twitter.com/KeikoUTorii/status/1161322092165337088), [Haskell](https://qiita.com/yutasth/items/e7c45372c8f8c062f39d) Haskell で書きたかったけどやめた。

少し違うメソッドで、「求めるだけ」のコードを書いた。実質は、Multiplicative Persistence が1小さいものを、素因数分解された形式で探し、繋げて求めている。

```MultiplicativePersistentNumber
#! ruby

class MultiplicativePersistentNumber
  attr_accessor :producted_mpn_examples
  attr_reader :max_multiplicative_persistent, :concatenated_max_multiple_persistent_number_string, :base
  
  def initialize(base: 10)
    @base = base
    @producted_mpn_examples = {}
    @max_multiplicative_persistent = -1
  end

  def multiple_persistent(n)
    if (! n.is_a?(Integer)) || n < 0
      return 0
    end
    cnt = 0
    while n > base
      n = product_digits(n)
      cnt += 1
    end
    return cnt
  end

  def product_digits(n)
    if (! n.is_a?(Integer)) || n < 0
      return 0
    end
    prod = 1
    while n >= 1 do
      n, mod = n.divmod(base)
      prod *= mod
    end
    return prod
  end

  def genpow(n)
    for i in n.downto(0) do
      for j in (n - i).downto(0) do
        k = n - i - j
        # 2,3,7
        a = 2**i * 3**j * 7**k
        if candidate_check(a)
          @concatenated_max_multiple_persistent_number_string = 2.to_s * i + 3.to_s * j + 7.to_s * k
        end
        # 3,5,7
        a = 3**i * 5**j * 7**k
        if candidate_check(a)
          @concatenated_max_multiple_persistent_number_string = 3.to_s * i + 5.to_s * j + 7.to_s * k
        end
      end
    end
  end

  def candidate_check(n)
    cur_mp = multiple_persistent(n)
    if ! producted_mpn_examples.has_key?(cur_mp)
      if cur_mp > @max_multiplicative_persistent
        @max_multiplicative_persistent = cur_mp
      end
      producted_mpn_examples[cur_mp] = n
      p n.to_s + " has persistence " + cur_mp.to_s + "."
      return true
    end
  end

  def max_mpn_number
    concatenated_max_multiple_persistent_number_string + " has persistence " + multiple_persistent(concatenated_max_multiple_persistent_number_string.to_i).to_s + "."
  end
end

mpn = MultiplicativePersistentNumber.new
for i in 0..100 do
  if i.modulo(10) == 0
    p i
  end
  mpn.genpow(i)
end
p mpn.producted_mpn_examples
p mpn.max_mpn_number
```
nodeが奇妙な動きをしたのでメモ

# nodeが奇妙な動きをしたのでメモ

## 起こった現象
``\r``を含む文字列をconsole.log()すると行が融合した感じになる

### 具体例
```
console.log('aaa\r,'); /// ,aaと表示される

```

node 10.15.3で確認。

lengthを取った場合や、console.logではなく宣言時にconsoleに表示される値は大丈夫なので、
内部的には正しく結合されている模様。

バグなんだろうか…？
macにnodejsの開発環境作るときにとりあえずやっておいたほうがいいこと

# macにnodejsの開発環境作るときにとりあえずやっておいたほうがいいこと

### homebrew が入っていなければ実行して下さい
homebrew が入っていなければ実行して下さい。homebrewはmacを使う上で一生使うと思います

```
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

## nodejsのインストール
[この辺を参考に](https://qiita.com/bigplants/items/2d75bf552e0da4a7e822)インストールしましょう
エラーとか起きたら、スクショや文書の貼り付けしてくれたら、教えると思います。

``` bash 

## brew install node だけでもいいらしい
brew install node npm 
npm install -g n 
n stable
```

## yarnもインストール
[これを参考に](https://qiita.com/pypanman/items/ab786402ed3cdf626ce9)yarnをインストールしましょう。

```
brew install yarn --ignore-dependencies
```

###### 絶対にやってはいけないこと
`npm install -g yarn`はダメです。

## できればfishもインストールしましょう
fish fisher fzfなど色々インストールします。

```
brew install fish fzf
echo /usr/local/bin/fish | sudo tee -a /etc/shells
chsh -s /usr/local/bin/fish
/usr/local/opt/fzf/install
curl https://git.io/fisher --create-dirs -sLo ~/.config/fish/functions/fisher.fish
fisher add oh-my-fish/theme-bobthefish
```

## xcode 
xcodeをappstoreからダウンロードします

## ide
ideをダウンロードします
これは好きなのがいいと思います
学生は無料なので `php storm` がおすすめです
visual studio code　とかでもいいです！
開発ド素人がVisual Studio Code を使ってSPA+Spring Boot2なアプリケーションをローカルで稼働させるまで

初めての投稿になります。
そのくせ仕事の経験談なのであまりキャプチャを使えず、かといって自分で再現画面を作る技術や時間がないため基本的に文章のみの記事となってしまいますがよろしくお願いします。面倒な方は3-4まで飛んで頂ければ正しい手順が書いてあります。


#1.なぜVisual Studio Codeなのか
タイトルにも書いているようにSpringBootを使っているわけなので当然Javaの開発環境として最もメジャーなEclipseが第一の選択肢になるかと思いますが、ネット情報を見る限りVisualStudioCode(以下VSC)が今最もホットなIDEなのは明らかだったのでやってみることにしました。軽薄ですね。
VSCのインストールにはQiitaの諸先輩方をはじめ、様々なネット記事を参考にさせて頂きました。ありがとうございます。

#2.とりあえずF5してみた。
とりあえずJava11だか12をインストールして、環境変数に入れて、VSCに連携させて...(※1)、Springboot2とJavaの開発に必要なExtentionをモリモリ入れて...ちょくちょくF5ボタンを押して何とかDEBUG CONSOLEでSPRINGのロゴが流れる所までは行きました。ただ、これだとSPA部分は全く動いてないのでまだスタートラインとも言えないようなレベルです。

#3.デバッグ成功に至るまでの長い道のり
##3-1. どうやったらデバッグできるのか？
SPA+Springboot2で開発した事例がレアすぎるのかは分からないけどネット情報を見ても日本語では殆んど事例が発見できなかったので仕方なく英語記事を中心に探しました。そこでようやくMavenがカギを握っているっぽいということには気付けました。（遅い）

##3-2. 足りないのはwarだった？
何でmaven使っていると分かったのかというとpom.xmlというところにmavenと書いてあったからです。色々調べてみた結果JAVAのアプリケーションをビルドするのにはメジャーなOSSだということでこれまたネット検索してみましたが、これまた日本語情報少なくて苦労しました。最終的に「mvn clean package」でwarファイルを作成してTomcatでデプロイすれば何とかなると思ってやってみました。（※2）
ただ、これもリンク先にあるようなVSCの「Deploy to Web App」からやるのか、はたまたできあがったwarファイルを自分でインストールしたTomcat（8? 9?）に入れるのかとかパターンが結構あった割には結局全部ダメでした。Tomcat の画面が出るのですが、application.propertiesで設定したportにアクセスしても404でアクセスできなかったです。

##3-3. 振り出しに戻る...からの大逆転
そろそろ気持ちが折れてしまうかと思われましたが引き続きGoogole先生に「java maven visual studio code deploy build」みたいな感じで英語ページを検索していると、今までなかったやり方で解決方法を紹介しているページがありました。（※3）
またダメかなーと思ってやってみたところ、これで解決できました!
なお、メモリは結構食ってましたが、debug consoleには受け渡ししたパラメータとかリアルタイムで流れるので実際の動作確認とかでも結構使えるのでは？と思いました。

##3-4. 手順まとめ
①VSCから該当プロジェクトのフォルダを開く。　
※このソースが実際に動くものでないと以下手順はどうなるかわかりません。
②コマンドパレット（ctrl＋shift＋P）を押してTasks: Configure task ⇒Create tasks.json from template (mavenを選択する)
④task.json に以下を追加
{
    "label": "compile",
    "type": "shell",
    "command": "mvn -B compile",
    "group": "build"
},
⑤コマンドパレット（ctrl＋shift＋P）を押してTasks: Run Build Task⇒compile⇒Continue without scanning the task output
⑥必要があればapplication.propertiesの中身をいじる。
※私は開発用のIPアドレスからlocalhostに切り替える必要があったので手順に入ってます。
⑦VSCでtargetフォルダの中にできたコンパイルファイルの一部を適当に選択してF5もしくはctrl＋shift＋D ⇒JAVAを選択⇒launch.jsonができる
⓼VSCでtargetフォルダの中にできたコンパイルファイルの一部を適当に選択してF5もしくはctrl＋shift＋D 

application.propertiesで指定したアドレスにアクセスしてログイン画面が出たら成功！
ここまで読んでくれた方、ありがとうございました！

#4.そして再度闇の中へ...
成功に気を良くして2週間ほど触らずにいたところ、久しぶりに上記手順を試したら、「method 〇〇 is undefined 」みたいなエラーで全くデバッグ？ビルド？できない事態になってしまいました。直前まで動いていたのであまり気にしていませんでしたが、壮絶にドはまりしました。
解決策をサクッと言ってしまうと、ソースが更新されたことにより使用しているOSSのバージョンが上がったからでした。VSCのTERMINALで「npm outdated」とすると、UPDATEが必要なOSSが赤く表示されていたので、続けて「npm update」するとJavaのエラーは消えました。プログラマーの人たち、ちゃんと最新版にしてて偉いなあ、基本手順をしっかり確認しないといけないなあと気づかされました。



（※1）https://qiita.com/kare/items/11309fef5822788501b5
（※2）https://code.visualstudio.com/docs/java/java-webapp
（※3）https://stackoverflow.com/questions/46671308/how-to-create-a-java-maven-project-that-works-in-visual-studio-code?rq=1
docker をVM的に使う

1行目でdockerのCentosイメージをダウンロードする。
2行目の　/sbin/initでコンテナを起動する。（ポートフォワーディングでホストの80番とコンテナの80番ポートをリンクさせる）
3行目でコンテナが起動しているかどうかを確認。
4行目の　/bin/bashでコンテナ内に入る。


```
docker pull centos:latest
docker run --privileged -it -d -p 80:80 --name mycent centos:latest /sbin/init
docker ps
docker exec -it mycent /bin/bash
```

Ubuntu1804のコンテナイメージでは/sbin/initは無いみたいで
起動しませんでした...
GAE/Go が 1.12 でだいぶ簡単になったみたいなので echo を使った普通のウェブアプリケーションを作ってみる

# はじめに

- GAE/Go でウェブアプリケーションを作ろうとすると専用のライブラリを使う必要があったり専用のブートストラップ処理を実装する必要があったりとちょっと面倒だったのですが、Go 1.12 のランタイムからコンテナの実装が変わったということで普通のウェブアプリケーションと同じ感じで簡単につくれるようになったみたいです。
- この記事ではその GAE/Go 1.12 環境で web application framework の echo を使い go modules で依存関係管理をする普通のウェブアプリケーションを作ってみます。

# できたものがこちらです

- 作ったアプリケーションは[こちら](https://github.com/nirasan/go-echo-gae-mod-boilerplate)です。
- サンプルとして HTTP ハンドラがひとつあるだけのアプリケーションになります。

# ファイル構成

```
app.go        # アプリケーションのメイン処理
app.yaml      # GAE 設定ファイル
go.mod        # go modules 設定ファイル
app/
  handler.go  # アプリケーションの HTTP ハンドラ
  template.go # アプリケーションのテンプレート処理
template/
  index.html  # テンプレートファイル
public/
  favicon.ico # 静的ファイル
```

# アプリケーションのメイン処理

- GAE/Go のメイン処理であるサーバーを立ち上げる部分ですが、以前は `init()` とかでやっていてちょっと特殊な感じでした。
- Go 1.12 では `main()` で普通にウェブサーバーを立ち上げるだけで良くなったので気持ちいいです。
- 特殊な点として環境変数 `PORT` で引き渡されたポートでウェブサーバーを起動する必要があります。

```go
func main() {
	e := echo.New()

	e.Renderer = app.NewTemplate("templates/*.html")

	e.GET("/", app.IndexHandler)

	port := os.Getenv("PORT")
	if port == "" {
		port = "8080"
		e.Logger.Printf("Defaulting to port %s", port)
	}
	e.Logger.Fatal(e.Start(fmt.Sprintf(":%s", port)))
}
```

# GAE 設定ファイル

- 設定ファイルである app.yaml も項目が整理されてだいぶスッキリしたようです。
  - 公式ドキュメントは[こちら](https://cloud.google.com/appengine/docs/standard/go112/config/appref)です。
  - Deprecated になった項目は[こちら](https://cloud.google.com/appengine/docs/standard/go112/go-differences?authuser=0&hl=ja#app-yaml)から確認できます。

```yaml

runtime: go112

handlers:
  - url: /favicon.ico
    mime_type: image/x-icon
    static_files: public/favicon.ico
    upload: public/favicon.ico

  - url: /public
    static_dir: /public

  - url: /.*
    secure: always
    script: auto
```

# 依存関係の管理

- 依存関係の管理は go modules を使うようです。

## go modules の利用準備

- go 1.12 をインストールします

## 依存関係管理の初期化

- 依存関係管理の初期化をするためにプロジェクトのルートで以下のコマンドを実行します

```
go mod init {MODULE_NAME}
```

- go modules はプロジェクトルートが GOPATH 以下であるかや環境変数 GO111MODULE の値によって挙動が変わります。
- 細かいことはおいておいて常に初期化を成功させたい場合は以下のコマンドを実行してください。
- 詳細は[こちら](https://qiita.com/propella/items/e49bccc88f3cc2407745)などが参考になりました。

```
GO111MODULE=on go mod init {MODULE_NAME}
```

## 依存関係を解決する

- `go build` など各種 go コマンドを実行するごとに自動で依存関係が解決され `go.mod` ファイルに記録されます

## 依存関係を反映させる

- GAE/Go 1.12 は go modules に対応しており `go.mod` ファイルを置いておくとデプロイ先で依存関係を解決してくれるようです。

# デプロイ

- デプロイは `gcloud` コマンドで行います。

```
gcloud app deploy ./app.yaml --project PROJECT_NAME
```

# 他サービスとの連携

- Cloud Datastore とのデータの読み書きをなどの他サービスとの連携をする場合、従来は http.Request から appengine.NewContext して認証情報を取得するというような面倒な手順がありました。
- GAE/Go 1.12 ではサービスアカウントに権限を付けておくと `golang.org/x/oauth2/google` を使って認証できるようになるということで、ここのモック化が簡単であればだいぶ開発しやすくなっているはずだと思いますが、今検証できていないので後で時間があれば確認してみます。
- 関連ドキュメントは[こちら](https://cloud.google.com/docs/authentication/production?authuser=0&hl=ja#obtaining_credentials_on_app_engine_standard_environment)です。

# おわりに

- GAE/Go は便利だけどクセが強いのが微妙だと思っていたんですが、1.12 でだいぶ普通に使えるようになっているみたいなのがうれしいです。
今回さわりだけ見てみましたが、もうちょっとちゃんと時間使って使いこなせるようになろうと思います。
[WIP]Python digdag.env メモ

# はじめに
Digdagのドキュメントだけではわからないことが多かったので、[ソースコード](https://github.com/treasure-data/digdag/blob/master/digdag-standards/src/main/resources/digdag/standards/py/runner.py)を読んだ時のメモ書きを残したいと思います。(間違っていることも多いと思うので、ご容赦ください)  

# メモ
## メンバ
直接変更するのはやめた方が良さそう

- params: dict
    - [built-in variables](http://docs.digdag.io/workflow_definition.html#using-variables)が入っている
    - 前taskでexportしたりstoreしたりしたものも入っているように見える
- export_params: dict
    - exportメソッドで更新される
    - 用途は不明
- store_params: dict
    - storeメソッドで更新される
    - storeしておくと同一digファイル内の${}でも参照できるようになる（スコープは不明）
- state_params: dict
    - set_stateメソッドで更新される
    - 用途は不明
- subtask_index: int
    - subtaskが増えるごとにincrementされる
- subtask_config: OrderedDict
    - self.subtask_config["+subtask" + str(self.subtask_index)] = config


## メソッド
- set_state
    - Parameters
        - params: dict
            - state_paramsに追加するparameter
        - **kwds
            - 同じく追加するparameter
- export
    - export_paramsに追加する以外は同上
- store
    - store_paramsに追加する以外は同上
- add_subtask
    - Parameters
        - function: method?
            - subtaskとして実行されるもの
                - methodでもいいし、dictでも良い？
        - **params
            - functionの引数として渡されるもの
    - subtaskとして実行できるようにまとめて、self.subtask_indexをincrementした後self.subtask_configに追加する
IoT×RTOS調査

# 背景・目的
 RTOSを使った開発に興味があり、勉強中のエンジニアです。
 IoTの普及に伴い、RTOSを使った開発もこれからどんどん増えていくのではという期待があります。
 本記事では、IoT用途の組み込みソフト開発を念頭に置きつつ、各種RTOSの調査した結果を紹介します。

# 組み込みソフトのプログラミング手法

大まかに３つの手法に分類でき、各種手法の概要は以下の通りです。

- ベアメタル(OSなし)
    - シングルタスク（main関数）＋割り込みで設計・実装されたプログラム。
    - OSを搭載するリソース(ROM,RAM)がない場合や、そもそもOSが必要ない場合に採用されます。
- 汎用OS
    - 組み込みLinuxOSが搭載されたもの
    - 携帯やカーナビなど、組み込み機器の中では比較的高機能な製品に採用されているようです。
    - UNIX系のミドルウェアを流用でき、開発環境が充実しているため、開発効率が高い。
- RTOS
    - その名の通り、リアルタイム性を重視したOS。
    - 汎用OSと比べ、比較的低リソースで利用可能です。（物によりますが）
    - マルチタスクなプログラミングが可能で、時間制約の厳しいタスクを優先度を高く設定することで、リアルタイム性を担保できます。
    - 時間制約の厳しい処理（例えばモータ制御など）が必要とされる一方で、他の機能も並行して処理しなければならない（外部通信など）場合に有用です。

組み込み開発において、どの手法が最適解かを検討することは大変興味深いトピックであり、慎重に検討すべきですが、
安価なIoTデバイスの普及を考えた場合、直感的にRTOSの採用率は今後増えていきそうです。

# 各種RTOSとその動向

本記事では、「IoT」にフォーカスし、個人的に気になったトピックを紹介することとします。
（RTOSそのものの性能比較等は別途調査したいと思います。）

## TRON系

### 概要
国産のOSで、1984年より活動が開始し国内の家電製品や自動車製品などに広く採用されています。
2018年の調査では、シェア率は６０パーセントにも及ぶとのこと。
第一世代であり、最も広く普及している「μITRON」と、第二世代の「T-Kernel」があり、
TRON系の派生OSとして有名なものに「TOPPERS」があります。

### IoT関連トピック
- [IoT機器標準用のプラットフォーム「IoT-Engine」を開発](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428951/56d76a00-ffb1-c14c-37a5-c461d8a85779.png)
    - IoTエッジノードとして利用することを想定
    - T-Kernelの省リソース版に当たるμT-Kernel2.0 OSを搭載
    - LoWPAN対応
    - 高度な機能はクラウドに任せ、エッジデバイスのリソースを最小限にする構成
    - エッジデバイスは特定のクラウドに直結することを前提とすることで、セキュリティコストを下げる
    - クラウド上でエッジデバイスを総体的に管理する。
    - 複数の半導体メーカーと手を組み、様々な製品との相互連携を実現

## FreeRTOS

### 概要
RealTimeEngineers社にて開発、運営されているオープンソースのOS。
ライセンス形態がGPLのため、商用利用に難がありましたが、
2017年に[Amazonに買収され](https://monoist.atmarkit.co.jp/mn/articles/1712/28/news011.html)、MITライセンスとなったことで利用しやすくなりました。

### IoT関連トピック

AWSとの連携を容易にする、各種ミドルウェアが標準搭載された[「AmazonFreeRTOS」](https://aws.amazon.com/jp/freertos/)がリリースされています。特徴は以下の通り。

- TLS v1.2
- MQTT通信プロトコル
- BLE通信によるモバイル端末との接続
- OTA(無線アップデート）機能

IoTデバイスとして必要なコンポーネントは一通り揃っており、開発者はアプリケーションの開発に集中することができそうです。

## MbedOS
### 概要
ARM社が運営している開発プラットフォーム、「mbed」上で搭載されているOS。
「CMSIS-RTOS-RTX」と呼ばれる、標準仕様に準拠し実装されたOSです。
（そもそもCMSISはARMが決めている規格なので、ARM社が開発したOSがそれに準拠するのは必然ですが）
MbedOSの他に「CMSIS-RTOS_RTX」に準拠したOSとして、[「Keil RTX」](https://www.keil.com/pack/doc/CMSIS/RTOS2/html/rtx5_impl.html)があります。
ライセンス形態は、Apache2.0です。

### IoT関連トピック
AmazonFreeRTOSと同様、IoTに必要となるミドルウェアが一通り提供されており、
IoTデバイスを開発する上での優位性はかなり高そうです。
- TLS v1.2
- BLE
- Wi-Fi
- LoWPAN

また、IoTデバイス管理向けのクラウドプラットフォーム[「Pelion」](https://www.pelion.com/docs/)と連携することで、HTTP通信を介した、デバイスの接続管理や、データ取得、OTAを実現できるようです。

## ThreadX
### 概要
ExpressLogic社にて開発されたOS。
オープンソースではないため、ライセンス契約の上での利用となります。
フットプリントが最小構成で２kBとかなりコンパクトで、省リソースのCPUでも利用が可能。

### IoT関連情報
2019年4月に[Microsoft社に買収されており](https://japan.zdnet.com/article/35136002/)、今後はAzureとの連携に注力していくことが予想されます。

# まとめ
- IoTに必要な通信系のミドルウェアは充実しつつある
- RTOSとクラウドプラットフォームの１パッケージ化が進んでいる
- 各社クラウドプラットフォームのシェア拡大のために、RTOSもどんどん拡充されていきそう
Spinner.onItemSelectedをユーザーがセレクトした時にだけ動かしたい

備忘録。タイトル通り

普通にonItemSelectedに書いた処理が、初期表示された時にリストのトップのものに対して自動的に行われているのを発見。

ユーザーが自分の手で選択した時にだけonItemSelectedが動いてほしい。

調べてみた。
https://android.tecc0.com/?p=124
これでとりあえず思ってたことは実現できたけど、このメソッド何？ということで
Developersで調べてみる。
https://developer.android.com/reference/android/widget/AbsSpinner.html#setSelection(int,%20boolean)
positionは普通にリストの番号のこと。animationをfalseにすることに意味があるのかな？と思ってtrueでもやってみたけど行けた。関係ないらしい。
因みに、元記事で触れられてた通り、setSelection(int position)を使うとダメだった。
作業用ブランチだと思って作業してたらmasterブランチにcommitしてて、作業用ブランチにcommit内容を保存したままmasterブランチのcommitをなかったことにする方法

masterでcommit しちゃった後に、

```
git branch [作業用ブランチ名]
```
これでmasterにcommitしてしまった変更が作業用ブランチに保存されるので、あとは、masterブランチで

```
git reset --soft HEAD^
```
すれば、masterのcommit履歴が1つ前に戻る。