OmniAICreator/Qiita-1.07M huggingface dataset:
Windows2019のインストール

評価版もでたとのことでWindows2019のインストールをします。

一応１８０日間使えるので、ちょっと遊んでみるにはいいかと思います。

以下のページからファイルをダウンロードします。
https://www.microsoft.com/en-us/software-download/windowsinsiderpreviewserver

![FireShot Capture 7 - Download Windows Server Insider Previe_ - https___www.microsoft.com_en-us_sof.png](https://qiita-image-store.s3.amazonaws.com/0/115935/f9559e0c-5477-6e87-a782-670ad38c8e9f.png)

プルダウンを選択してISOファイルのダウンロード
![FireShot Capture 9 - Download Windows Server Insider Previe_ - https___www.microsoft.com_en-us_sof.png](https://qiita-image-store.s3.amazonaws.com/0/115935/6d4a24e6-6510-9781-15fb-cbb853d66716.png)

あとVirtualBoxでもなんでもインストールしてみてください。
https://www.virtualbox.org/wiki/Downloads

インストール時にシリアルが求められますので、公式ブログよりシリアルを手入力します。
https://blogs.windows.com/windowsexperience/2018/08/28/announcing-windows-server-2019-insider-preview-build-17744/

また、アップグレードを選択するとインストールがまた最初からになりまたシリアルを求められるので新規インストールを選択しましょう。

![名称未設定.png](https://qiita-image-store.s3.amazonaws.com/0/115935/97316421-4dae-fcff-7a02-c6adf31d253a.png)

個人的にはWindows2019よりもWindows Admin Centerのほうが気になったり。
https://docs.microsoft.com/ja-jp/windows-server/manage/windows-admin-center/understand/windows-admin-center

参考リンク
http://www.alphr.com/operating-systems/1000350/how-get%20windows-10-and-burn-to-iso-disc
超初心者のAngular学習〜2日目〜

#前回のおさらい
[1日目](https://qiita.com/RYO-HIRA63/items/4389acf45571a9b9b813)を参照してください（爆）
では今回の二日目ではAngularをインストールして公式サイトの[はじめに](https://angular.jp/guide/quickstart)をやっていきましょう。
#構築環境
手持ちのメインPCのUbuntuで実行します。nodeとnpmのバージョンはこんな感じです。

```
test@test-ThinkStation-E30:~$ node -v
v10.12.0
test@test-ThinkStation-E30:~$ npm -v
6.4.1
```
では、Angularをインストールしていきます。

```
test@test-ThinkStation-E30:~$ npm install -g @angular/cli
```
Angular CLIインストールはこれでOK
※開発環境がUbuntuでインストールの際にエラーが発生する場合は[この手順](https://qiita.com/okoysm/items/ced3c3de30af1035242d)を実施するとエラーが解消されます。自分は対策１の手順でエラーが解消されました。書かれてる内容でエラーが改善されない場合はエラー内容をググって検索してください（爆）
一応、[公式サイト](https://docs.npmjs.com/getting-started/fixing-npm-permissions)にも改善方法がありますので参考にしてください。
#プロジェクト作成
公式に書かれてるとおりに実行

```
test@test-ThinkStation-E30:~$ ng new my-app
```
#アプリケーションのサーブ
要はサーバーを起動するということです。この場合は当然ローカルホストでデフォルトのlocalhost:4200になります。openコマンドを追加することで起動後にブラウザで表示することができます。

```
test@test-ThinkStation-E30:~$ ls  //一応ディレクトリ（さっき作ったプロジェクト）があるかの確認
test@test-ThinkStation-E30:~$ cd my-app
test@test-ThinkStation-E30:~/my-app$ ng serve --open

```
これでWelcome to app !!と表示されればオッケー

#表示されてる文章を書き換える
これはコンポーネント(component)を書き換えます。
書き換えるに僕はVSCodeを使用しました。VSCodeのインストールの仕方はかなりありますが、僕は公式からパッケージをダウンロードしてインストールしました。各々のやりかたはググってください（爆）また、VSCodeをインストールした際は多様なアドオンが使えるのでインストールしておくと便利かもしれません。
僕がインストールしたアドオンは、

- Angular 6 Snippets
- Japanese Language Pack for Visual Studio Code
- GitLens

gitと日本語パッケージについては好みと用途なんでインストールは不要だと思います。(そもそもVSCodeよりもATOMの方が好きな人は多いかも)
書き換える内容は、~/src/app/app.component.tsの、title = 'my-app';の**my-app**の部分です。
ここを公式サイトのように書き換えるとあれなので"**あんぎゃらちゃん**"とかにでもしちゃいましょう。
こんなかんじで。

```ts
export class AppComponent {
  //title = 'my-app';
  title = 'あんぎゃらちゃん';
}
```
では動かして確認しましょう。**my-app**が**あんぎゃらちゃん**になってれば成功

では、次にCSSの編集を始めましょう。~src/app/app.component.cssを

```css
h1 {
  color: #369;
  font-family: Arial, Helvetica, sans-serif;
  font-size: 250%;
}
```
にすれば完成と、ここまでははじめに書いてることですね！！
では、三日目はチュートリアルと各種Angularの機能を分解していこうかなと思います。
TextInputコンポーネントのkeyboardType別のスクリーンショット（一部）

`keyboardType` ごとの違いがよく分からなかったのでまとめました。

# default
<img width="414" alt="20181014_214730000_iOS.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/96286/cdf70a42-d63e-ef40-c35e-d28a2a606645.jpeg">

#number-pad
![20181014_215052000_iOS.jpg](https://qiita-image-store.s3.amazonaws.com/0/96286/fc645ea3-773c-d36c-688e-7f86fb5183db.jpeg)

#decimal-pad
![20181014_215116000_iOS.jpg](https://qiita-image-store.s3.amazonaws.com/0/96286/ab66b2c9-7c28-74c8-0247-6c2f35e36291.jpeg)

#numeric
![20181014_215136000_iOS.jpg](https://qiita-image-store.s3.amazonaws.com/0/96286/7c36fa46-9885-237f-9392-c41c8bd543f4.jpeg)


#email-address
<img width="414" alt="20181014_214708000_iOS.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/96286/ee6f1e31-c7ea-6183-67bb-6ce85ba8381c.jpeg">

#phone-pad
![20181014_215154000_iOS.jpg](https://qiita-image-store.s3.amazonaws.com/0/96286/a9fc0e31-782d-2596-fa84-7b6e7b2905a3.jpeg)

#ascii-capable（iOS）
日英で切り替えてもASCII文字しか入力できません。
<img width="414" alt="20181014_214834000_iOS.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/96286/a20e6ef6-d170-545b-5058-56c266dd94b1.jpeg">
<img width="414" alt="20181014_214837000_iOS.png" src="https://qiita-image-store.s3.amazonaws.com/0/96286/1e15a68e-62aa-61d4-4a29-0b87ca77fff3.png">
ESLint v5.6.0

前 [v5.5.0] | 次 [v5.7.0]

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">ESLint v5.6.0 has been released: <a href="https://t.co/BpsmAQrVxj">https://t.co/BpsmAQrVxj</a></p>&mdash; ESLint (@geteslint) <a href="https://twitter.com/geteslint/status/1040786875831726080?ref_src=twsrc%5Etfw">September 15, 2018</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ESLint 5.6.0 がリリースされました。
小さな機能追加とバグ修正が行われました。

質問やバグ報告等ありましたら、お気軽にこちらまでお寄せください。

> 🏢 [日本語 Issue 管理リポジトリ](https://github.com/eslint/eslint-jp)
> 👫 [日本語サポート チャット](https://gitter.im/eslint/eslint-jp)
> 🏢 [本家リポジトリ](https://github.com/eslint/eslint)
> 👫 [本家サポート チャット](https://gitter.im/eslint/eslint)

# 🚀 本体への機能追加

特になし。

# 💡 新しいルール

特になし。

# 🔧 オプションが追加されたルール

## [#10697]: [func-names] generators

Generator 関数のみ設定を分けるためのオプションが追加されました。

Generator 関数は Arrow 関数で置き換えることができないため、無名関数を許可したい場合に使います。

```js
/*eslint func-names: [error, always, { generators: never }] */

//✘ BAD
{
  const f = function() {}
  const g = function* generator() {}
}
//✔ GOOD
{
  const f = function doSomething() {}
  const g = function* () {}
}
```

> [Open demo](https://eslint.org/demo/#eyJ0ZXh0IjoiLyplc2xpbnQgZnVuYy1uYW1lczogW2Vycm9yLCBhbHdheXMsIHsgZ2VuZXJhdG9yczogbmV2ZXIgfV0gKi9cclxuXHJcbi8v4pyYIEJBRFxyXG57XHJcbiAgY29uc3QgZiA9IGZ1bmN0aW9uKCkge31cclxuICBjb25zdCBnID0gZnVuY3Rpb24qIGdlbmVyYXRvcigpIHt9XHJcbn1cclxuLy/inJQgR09PRFxyXG57XHJcbiAgY29uc3QgZiA9IGZ1bmN0aW9uIGRvU29tZXRoaW5nKCkge31cclxuICBjb25zdCBnID0gZnVuY3Rpb24qICgpIHt9XHJcbn1cclxuIiwib3B0aW9ucyI6eyJwYXJzZXJPcHRpb25zIjp7ImVjbWFWZXJzaW9uIjo4LCJzb3VyY2VUeXBlIjoibW9kdWxlIiwiZWNtYUZlYXR1cmVzIjp7fX0sInJ1bGVzIjp7fSwiZW52Ijp7fX19)

# ✒️ `eslint --fix` をサポートしたルール

特になし。

# ⚠️ 非推奨になったルール

特になし。

[v5.5.0]: http://qiita.com/mysticatea/items/313f306c8b6352c391b6
[v5.7.0]: http://qiita.com/mysticatea/items/dd3b6464a01d542d00ac
[#9999]: https://github.com/eslint/eslint/issues/9999
[#10697]: https://github.com/eslint/eslint/issues/10697
[xxxx]: http://eslint.org/docs/rules/xxxx
[func-names]: http://eslint.org/docs/rules/func-names

<!-- 
![JSCS Icon](http://jscs.info/favicon.ico) JSCS 互換ルールです。
-->
Javascriptのbare words

昔ソファーで休んで子供の時の面白い映画を覚えた。名前はWATだ。rubyの例でbare wordsのことが初めて見つけた。
![obaa chaan omae wa mou shindeiru](https://qiita-image-store.s3.amazonaws.com/0/193325/be889138-5fbb-42c9-85a2-3b8b2ce1eedd.jpeg)
でもJavaScriptでそんなことが無くてJavaScriptにそんなことを入れた。

```javascript:コードはこちら
with(bareWords) {
    console.log(お前, は, もう, 死んでいる)
    alert(何)
}
```
コードは全部の言葉を見せる

```javascript:理由は
try {
    let self = this
    window.bareWords = new Proxy({}, {
        has: function(target, name) {
            return !(name in self)
        },
        get: function(target, name) {
            return name
        },
    })
} catch(e) {
    console.error('お前は生きている')
}
```
見るようにProxyとwithを使えてbare wordsのことができた。
https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Proxy
https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/with
![oie_zKkzfJCTTjcD.png](https://qiita-image-store.s3.amazonaws.com/0/193325/778baba5-c305-01cd-56d6-67f131ee4c07.png)
勉強記録 20181015 AWS ソリューションアーキテクト – アソシエイト

# Amazon S3 イベント通知の設定
- Amazon S3 通知機能により、バケット内で特定のイベントが発生したときに、通知を受けることができます。
- 通知を有効にするには、まず通知設定を追加して、Amazon S3 で発行する必要のあるイベントと、Amazon S3 がそのイベント通知を送信する宛先を指定します。
- AWS Lambda を Amazon S3 に使用する
  - Amazon S3 は AWS Lambda にイベントを発行し (オブジェクトがバケット内に作成されたときなど)、パラメータとしてイベントデータを渡すことで Lambda 関数を呼び出すことができます。この統合により、Amazon S3 イベントを処理する Lambda 関数を記述できます。Amazon S3 で、Amazon S3 によって発行されるイベントのタイプと、呼び出す Lambda 関数を識別するバケット通知設定を追加します。

# Elastic BeanStalk
- ワーカー環境枠用に作成された AWS リソースには、Auto Scaling グループ、1 つ以上の Amazon EC2 インスタンス、および IAM ロールが含まれます。
- - また、ワーカー環境枠で Amazon SQS キューがない場合、Elastic Beanstalk によってAmazon SQS キューが作成され、プロビジョニングされます。ワーカー環境枠を起動すると、選択したプログラミング言語に必要なサポートファイルとデーモンが、Elastic Beanstalk によって Auto Scaling グループの各 EC2 インスタンスにインストールされます。デーモンは Amazon SQS キューからリクエストを取得し、そのデータをワーカー環境枠で稼働しているウェブアプリケーションへ送信します。このメッセージはこのウェブアプリケーションで処理されます。ワーカー環境枠に複数のインスタンスがある場合、各インスタンスに独自のデーモンがありますが、すべて同じ Amazon SQS キューから読み取られます。
- デフォルトでは、Elastic Beanstalk によって 1 つのセキュリティグループが定義されます。この場合、全員がポート 80（HTTP）を使用して接続できます。複数のセキュリティグループを定義することもできます。例えば、データベースサーバーに対してセキュリティグループを定義できます。

# Amazon EBS ボリュームの種類
- 汎用 SSD (gp2)
 - 最大 IOPS**/ボリューム	10,000
 - 最大 スループット/ボリューム	160 MiB/秒

# AWS EFS
- Amazon EC2 と併用できる拡張可能なファイルストレージを提供します。EFS ファイルシステムを作成し、ファイルシステムをマウントするためにインスタンスを設定できます。
 - NASみたいな

# Amazon Glacier アーカイブの取得
- Expedited
 - 最大規模のアーカイブ (250 MB 以上) を除くすべてのアーカイブについては、迅速取り出しでアクセスしたデータは通常 1〜5 分以内で使用可能になります。
- 標準
 - 通常、標準取り出しは 3〜5 時間で完了 
- Bulk
 - 通常、大容量取り出しは 5〜12 時間で完了します。

# プライベートVPCにあるRDSとPublic Subnet にあるWEBサーバのためのSecurity Group
- sourse 0.0.0.0/0 any address に WEBサーバへのInbound httpアクセスを許可
- sourse 0.0.0.0/0 any address に WEBサーバへのInbound httpsアクセスを許可
- sourse 管理用端末など に インスタンスへのInbound sshアクセスを許可
- sourse 管理用端末など に Inbound RDPアクセスを許可(3389)
JuliaでLSAの実装

###LSAの説明
LSAの説明と言ってもコードを見てもらえば一発なのですが，説明すると
与えらたXという行列があります．これは各要素の文章i（i=4）における単語の頻度をが入った行列です．
これを特異値分解します．特異値分解の説明はググってください．

そして図のように近似行列を求めるのですが，特異値分解されたU,S,VのうちS行列が対角に特異値が並んでいます．
今回はｋ＝2として2の幅で行列を取得します．
UとVも同様です．そうすると$\widetilde{U},\widetilde{S},\widetilde{V}^T$を求めることが出来ます．

それを掛ければ近似行列$\widetilde{X}$が求まります．

もっと詳しい情報はウィキペディアか参考文献を参照してください．

![LSAの説明.png](https://qiita-image-store.s3.amazonaws.com/0/33329/4b3be71d-9b64-4327-cba7-4c531e3bbf89.png)



```LSA.jl
X = [2 3 0 0 0;2 0 2 0 0;0 0 0 2 2;0 0 0 3 1] 
U,S,V = svd(X)
"""
U 
4×4 Array{Float64,2}:
 0.0       0.874642  -0.484769   0.0     
 0.0       0.484769   0.874642   0.0     
 0.661803  0.0        0.0       -0.749678
 0.749678  0.0        0.0        0.661803


"""
# Sを対角行列にする．
S =diagm(S)
"""
S
4×4 Array{Float64,2}:
 4.13065  0.0     0.0      0.0     
 0.0      3.9009  0.0      0.0     
 0.0      0.0     2.40479  0.0     
 0.0      0.0     0.0      0.968371

V
5×4 Adjoint{Float64,Array{Float64,2}}:
  7.10101e-17   0.696974   0.324248   3.19545e-16
 -4.73401e-17   0.672647  -0.604754  -2.1303e-16 
 -7.10101e-17   0.248542   0.727417  -3.19545e-16
  0.86491      -0.0        0.0        0.501927   
  0.501927      0.0        0.0       -0.86491    

"""
#  低ランク近似行列を求める
k = 2
U2 = U[:,1:k]
S2 = S[1:k,1:k]
V2 = V[:,1:k]

X2 = U2*S2*V2'

"""
U2
4×2 Array{Float64,2}:
 0.0       0.874642
 0.0       0.484769
 0.661803  0.0     
 0.749678  0.0 

S2
 4.13065  0.0   
 0.0      3.9009

V2
5×2 Array{Float64,2}:
  7.10101e-17   0.696974
 -4.73401e-17   0.672647
 -7.10101e-17   0.248542
  0.86491      -0.0     
  0.501927      0.0  
# Xの近似行列
X2
4×5 Array{Float64,2}:
 2.378         2.295         0.847998     0.0      0.0   
 1.318         1.272         0.470001     0.0      0.0   
 1.94118e-16  -1.29412e-16  -1.94118e-16  2.36438  1.3721
 2.19894e-16  -1.46596e-16  -2.19894e-16  2.67833  1.5543

```

###参考文献
[トピックモデルによる統計的潜在意味解析](https://amzn.to/2CIMqNj)
著者：佐藤一誠
nvm-windowsでNode.jsバージョン管理

## Node.jsバージョン管理
Node.jsバージョン管理をネット検索すると日本語の記事はnodistが多いようですが、githubを見たところ現在はあまりメンテされていないようなので、一番メジャーっぽいnvmのwindows版であるnvm-windows を導入してみることにしました。

## インストール

https://github.com/coreybutler/nvm-windows/releases
任意のバージョン nvm-setup.zip をダウンロード。
解凍して「nvm-setup.exe」をダブルクリック、
インストーラーに従いインストール。

完了したらインストールできているか確認。
コマンドプロントを開き

```
nvm version
```

でバージョンが表示されればOK。(今回は現時点最新の 1.1.7)

## Node.jsをインストール

インストール可能なNode.jsバージョンを表示

```
nvm list available
```

このコマンドで表示されるのは一部だけなので、
全てのバージョン確認は下記URLから見ることができる。
https://nodejs.org/ja/download/releases/


通常は下記のようにバージョン指定することで64bit版がインストールされる

```
nvm install 6.9.1
```

32bit版の場合はバージョンと併せて指定する必要がある

```
nvm install 6.9.1 32
```

アンインストールする場合

```
nvm uninstall 6.9.1
```

## Node.jsの切り替え

下記コマンドで選択可能(インストールされている)なNode.jsバージョン一覧を表示

```
nvm list
```

使用バージョンに切り替える

```
nvm use 6.9.1 32
```
※インストールしただけではNodejsが選択されないのでインストール後、useコマンドで使用するNode.jsを指定する必要がある

Node.jsのバージョンを確認してみる。

```
node -v
```

切り替えで指定したバージョンが表示されてればOK。

## 参考
https://qiita.com/idani/items/53567d92f936846e111c
https://blog.clock-up.jp/entry/2018/02/10/nodejs-manager-on-windows
https://www.tech-tech.xyz/archives/node-nvm-install.html
http://jsstudy.hatenablog.com/entry/functionaljs-9-nvm-windows
https://diwao.com/2017/06/nvm-node-uninstall.html

以上、ありがとうございました。
KotlinにおけるSetterのOverload

# KotlinにおけるSetterのOverload

### 投稿の経緯

- Kotlinにおけるプロパティとアクセサの記述

  ```Kotlin:Model.kt
  // 単位はInch
  var height : Int
    get() {
      println("heightのGetterが呼ばれました")
      return field
    }
    set(inches : Int) {
      println("heightのSetterが呼ばれました")
      field = inches
    }
  ```

- 単位がInchのheightに、FeetとInchesの２つの引数をもつSetterをOverloadしなさい、と言われたとき
  - こうしたくなるけどsetの行で構文エラー（環境はIntelliJ 2018.2.4）

    ```Kotlin:Model.kt
    // 単位はInch
    var height : Int
      get() {
        println("heightのGetterが呼ばれました")
        return field
      }
      // 構文エラー（feet : Intの後のカンマのところで"Expecting ')'"と怒られる）
      set(feet : Int, inches : Int) {
        println("heightのSetterが呼ばれました")
        field = inches
      }
    ```

  **->　Kotlinのインスタンス変数定義において、Setterの引数は１つしか取れない！**

## では、どうすべきか

- 結論から示すとこう

  ```Kotlin:Model.kt
  // 単位はInch
  var height : Int
    get() {
      println("heightのGetterが呼ばれました")
      return field
    }
    set(inches : Int) {
      println("heightのSetter1が呼ばれました")
      field = inches
    }

  fun setHeight(feet : Int, inches : Int) {
    println("heightのSetter2が呼ばれました")
    this.height = 12 * feet + inches
  }
  ```

- かゆいところに手が届かなかった。。

- ちなみにこう書くとこう怒られます（画像ですみません）

![Screen Shot 2018-10-14 at 9.40.25 AM.png](https://qiita-image-store.s3.amazonaws.com/0/243007/6e76c19d-bab1-9c3f-32d2-a9624a5b2b91.png)

- "setプロパティ名"のSetterメソッドが暗黙的に宣言されていることが分かって安心しました。読んでくださりありがとうございます！
Clickで実装したGit関連コマンドを実行するツールの紹介

### はじめに
多くの開発現場，昨今では大学の研究室などにおいても`git`の利用が拡大しているそうです．
`git`を用いることで，多数のソースコードを管理するだけでなく，論文などの添削にも活用できることが知られています． 
OSSの世界ではGitHubなどで公開すれば，多くの人に使ってもらえたり，
あるいは，GitLabサーバなどを自前で構築し完全にクローズドな環境でバックアップ・共同作業をすることも可能です．

しかしながら，`git`は出来ることが多いことの代償として，覚えることも多いです．
そのため，いざ研究室などに導入しようと思い立っても学習コストの面で進まなかったりします．
公式のドキュメントを参照しようにも全てが詳細に書かれており，
ある程度`git`に慣れた人でなければしりすごみしてしまうでしょう．

そこで，今回は`Click`という`Python`のライブラリを用いて簡単に`git`を体験できるツールを作成しました．
本稿はそのツール，GCH (Git Commit Handler)[^1]の紹介になります．

### ソースコード

ソースは全てGitHubの[このレポジトリ](https://github.com/Scstechr/gch)で公開しています．
Pull RequestやIssue大歓迎です．

## 使い方
詳しくは[ドキュメント](https://github.com/Scstechr/gch/blob/master/doc/gch_doc_jp.md)をみてください．
また，コマンドのどの段階でも`Ctrl-C`で抜け出せます．

### インストール

```bash
$ brew tap scstechr/gch
$ brew install gch
```

### オプション

```sh
$ gch --help
Usage: gch [OPTIONS]

Options:
  -i, --init           Run initializer                       >Default:False
  -v, --verbose        Verbose option.                       >Default:False
  -l, --log            Git log with option.                  >Default:False
  -r, --remote TEXT    Choose which remote repo.to push.     >Default:origin
  -g, --gitpath PATH   Path of dir that contains `.git`.     >Default:.
  -f, --filepath TEXT  Path/Regex of staging file/dir.       >Default:.
  -b, --branch TEXT    Commiting branch.                     >Default:master
  -c, --commit         Commit
  -p, --push           Push.
  -s, --save           Save settings                         >Default:False
  -d, --diff           Open diff tool                        >Default:False
  --version            Check version of gch                  >Default:False
  --reset              Reset all changes since last commit.  >Default:False
  --pull               Fetch + Merge from <origin> <master>. >Default:False
  --help               Show this message and exit.
```
  
### 基本的なコマンド

コミットするには`gch -c` あるいは `gch --commit`と実行します．
このとき，全てのファイルがステージングされ (`git add .`と同様の処理)，メッセージを入力するとコミットします． 

#### 短縮系
また，`gch -c`/`gch --commit`のように引数によっては短縮系が存在します．
そのほかにもログを確認する(`git log`)には`gch -l`, プッシュする(`git push`)には`gch -p`と入力します．
デフォルトの場合，エディタが立ち上がる場合は`Vim`ですので，必要に応じて`q`で抜け出してください．
もしターミナルがおかしくなった場合はshellで`reset`コマンドを実行してください．

### 複合コマンド

コマンドは複合して実行することができます．
例えば，コミットしてそのままプッシュしたい場合は`gch -cp`とすれば良いです．
同じようにコミットする際に前回のコミットとの差分を見たい場合は`gch -cd`とすることも可能です．
(差分確認後にコミット，プッシュするなら`gch -cdp`とすればよい）
この辺りは`Click`で実装してる恩恵ですね．

以下に複数のコマンド例を示します．

##### 例1. リモートレポジトリ`localhost`の`test`ブランチにコミットしてプッシュしたい

```sh
$ gch -cp -r localhost -b test
```

##### 例2.  親ディレクトリの`.git`ディレクトリを用いて`A.txt`をコミットをしたい

```sh
$ gch -c -g .. -f A.txt
```

### 設定の保存
例示したようなコマンドを毎回入力するのは面倒なので，設定を保存できるコマンドがあります．

```sh
$ gch -c -g .. -f A.txt -s
```

このように`-s`/`--save`をつけることで，その次からは上記のコマンドを実行するには下記で済みます．

```sh
$ gch -c
```

### `ISSUE!`が発生した時

多くの場合，任意のオプションを選択してもらえればよいです．
ただ，`merge`する際にはコンフリクトする可能性があるので気をつけてください[^2]．


### これから

少しいじっていただくとわかる通り，`git`に精通すればするほど物足りなくなるツールです．
`git rebase`であったり，よく使うけど実装されていない機能も多数あります．
なのでぜひ手を加えてください！ 

(あわよくばプルリクしてくれると嬉しいなって）

[^1]: `Haskell`界隈で著名な`ghc`に似てるなって命名した後に気づきました．
[^2]: 一応コンフリクト回避してくれるように書いたはずが機能せず...
ファボ数のカウント実装

１時間ほど苦しんでしまったので残しておく。

```ruby:index.html.erb
<% @favorite_posts.each do |post| %>
--- 省略
  <%= post.favorites.count %>
---　　省略
<% end %>
```

postはfavoriteを複数持ち(has_many)、favoriteは一つのpostに属している(belongs_to)

```ruby:post.rb
has_many :favorites
```

```ruby:favorite.rb
belongs_to :post
```

html内でcountを使用すれば上記の書き方でファボ数を数えてくれた。
最初はコントローラーにpostのidを渡してSQLで同idのファボをCountしてそれを表示・・・とかやろうとしていた。かなり簡単に実装できて驚き。
JenkinsでUniy iOSプロジェクトのTestFlight配信を行う(輸出コンプライアンスも対応)

Unity iOSプロジェクトでTestFlight配信をJenkinsで行う方法です

# 動作環境
Xcode9.2, Xcode10.0
Unity2017
Jenkins2.70

# 前提

JenkinsでAdHocビルドはできている状態を想定します
AdHocビルドのJobからTestFlightのJobへの変更点の説明になります

# おおまかな流れ

1. `exportOptionsPlist.plist`を変更する
2. `Info.plist`に輸出コンプライアンスの返答を記述する
3. `altool`でバリデーションする(必須ではない)
4. `altool`でアップロードする

# 1.exportOptionsPlist.plistのmethodをapp-storeに変更する

`xcodebuild -exportArchive`のオプション`exportOptionsPlist`で指定するplistファイルを変更します
下記のように`method`の値を`ad-hoc`から`app-store`にします

```diff:
<plist version="1.0">
    <dict>
        <key>method</key>
-        <string>ad-hoc</string>
+        <string>app-store</string>
```


# 2.Info.plistに輸出コンプライアンスの返答を記述する

ここまでの状態でTestFlightにアップロードすると, 輸出コンプライアンス情報がありませんという状態で配信はされません
暗号化機能を含まない場合, いいえを選択する必要があります

この手順を自動化するため, Info.plistにキー`ITSAppUsesNonExemptEncryption`を追加し値を`No`とします
![528aaffb3d20e263accca692cf9240ad.png](https://qiita-image-store.s3.amazonaws.com/0/45974/1a28245d-1625-1401-69ff-7fcb2e8bb6ca.png)

参考までに, Unityの`PostProcessBuild`で`Info.plist`に上記の値を追加するコードは下記のようになります


```csharp
[PostProcessBuild]
public static void OnPostprocessBuild(BuildTarget buildTarget, string path)
{
    var plistPath = Path.Combine(path, "Info.plist");
    var plist = new PlistDocument();
    plist.ReadFromFile(plistPath);
    plist.root.SetString("ITSAppUsesNonExemptEncryption", "false");
    plist.WriteToFile(plistPath);
}
```

# 3.altoolでバリデーションする(必須ではない)

JenkinsのJobでipa作成より後の箇所にシェルの実行を追加し, 下記シェルを実行しバリデーションを行います
TestFlightにアップロードできるApp Store Connectユーザを作成し指定します

| altoolオプション|説明|
|---|---|
|-f|ipaファイルパス|
|-t|タイプここではios|
|-u |App Store Connectユーザ名|
|-p |App Store Connectユーザパスワード|

参考までに, 私はパスワードはJenkinsの`Mask Passwords Plugin`を使ってログ表示されないようにしています
(APPSTORE_CONNECT_PASSの箇所)


```bash
/Applications/Xcode.app/Contents/Applications/Application\ Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Support/altool \
--validate-app \
-f Unity-iPhone.ipa \
-t ios \
-u hoge@ hoge.com \
-p ${APPSTORE_CONNECT_PASS}
```

# 4.altoolでアップロードする

バリデーションの次に下記のようなシェルの実行を追加し`altool`でアップロードします
アップデート後しばらく経つと, 内部テストユーザーにTestFlight配信がされます

なお, 外部テストの申請や外部テスト公開はブラウザで手動で行う必要があります

```bash
/Applications/Xcode.app/Contents/Applications/Application\ Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Support/altool \
--upload-app \
-f Unity-iPhone.ipa \
-t ios \
-u hoge@ hoge.com \
-p ${APPSTORE_CONNECT_PASS}
```

# 参考
https://wiki.jenkins.io/display/JENKINS/Mask+Passwords+Plugin
Java有償化私的メモ

来年の1月にJavaのOracleによるサポートが有償化されることに関連して、今更ながらに内容の確認。
OpenJDKとOracleJavaによる双方のアップデートスケジュールに対して、開発側としてどう考えて行くのか、スタンスを決める必要がある
結局のところ、Javaのサポートが必要になった自体は今の所ないんだけれど、もしものことがあった場合にどうすんの？ってこと。
特にEnterpriseの文脈ではサポート切れに対して契約で縛っているケースもあるので、注意が必要となる。

JDK: 新しいリリースモデル解説（ver.2.1）
https://www.slideshare.net/oracle4engineer/jdk-ver21

10月度のOracleからの資料が上記になる。
OpenJDKは6ヶ月毎のリリースで、無償サポート期間に重複はない。OpenJDKを選択した場合でサポートが必要となる場合は、常に更新をし続ける必要がありそうだ。
アプリケーション次第だが、6ヶ月毎に更新し続けるというモデルは結構手間がかかるので、実際のところ問題があった際にのみ更新を行う形なのだろうか。先に書いたように、サポート切れのものを利用することが禁じられているケースでは正直厳しい。
その場合はやはりOracleJDKになる。
当初は価格的に厳しい見通しだったが、6月に発表されたサブスクリプションモデルの価格（スライド22）では、サーバー利用の場合にはCPUあたり¥3,000/月というところ。
これらを顧客に利用料や保守費という形で転嫁することが可能であればこちらの選択肢が有力。
サーバーが1CPUってことはないと思うので、2〜4CPUとすると¥72,000〜¥144,000くらいか・・・。
アプリケーション次第ではあるけれど、一悶着起きてしまうアプリケーションもありそうだ。

というか、Oracleのライセンス料って年々上昇する傾向にあるのが何よりの不安材料だ。
そういう意味では、アップデート検証が可能な状態にして起きつつOpenJDKを使うという選択肢か。

OpenJDKを検討する場合、AdoptOpenJDKも考慮に入れて見る。

https://adoptopenjdk.net/index.html

コミュニティによるOpenJDKバイナリの提供だが、調べているとOpenJDKよりもこちらを推奨する声が散見される。
コードベースはOpenJDKだが、コミュニティによるテストも実施。
サポートもLTSという形で4年見てくれそう(https://adoptopenjdk.net/support.html)
ただ、こういうコミュニティによるサポートがどこまで効力を持った形で受け入れられるか。

※2018/11/21追記
AWSからもLTS付きのOpenJDKビルド提供のアナウンスが出たようだ
https://dev.classmethod.jp/cloud/aws/amazon-corretto/

コミュニティやAWSクラウド上だけのサポートという位置づけではなく、幅広くサポートしてくれたりAmazonという位置づけだったりと、期待が持てる。
AdoptOpenJDKは知っている人には知っているという位置づけだろうけれど、Amazonであれば知名度は高い。
クラウド環境でのサービス提供であれば十分ではないだろうか。
客先オンプレミス環境に関しては、選択肢としても十分だろう。

何れにしても、各社で自社としてのスタンスを明らかにして置く必要がある話ですね。
【Unity】UnityのuGUIボタンを配置し、Qubeを配置する

<b><font color="HotPink">環境メモ</font></b>
⭐️Mac OS Mojave バージョン10.14
⭐️Xcode version 10.0(10A255)
⭐️Unity 2018.2.11f1
⭐️iPhone7  IOS11.4.1

<img width="375" alt="IMG_0013.png" src="https://qiita-image-store.s3.amazonaws.com/0/93155/80632812-610e-047b-76f3-fb919a3184c1.png">
【Unity】UnityのARKit ユニティちゃん（Unity Chan）を表示する

<b><font color="HotPink">環境メモ</font></b>
⭐️Mac OS Mojave バージョン10.14
⭐️Xcode version 10.0(10A255)
⭐️Unity 2018.2.11f1
⭐️iPhone7  IOS11.4.1

Asset から「Unity chan」をインポートする

![001.png](https://qiita-image-store.s3.amazonaws.com/0/93155/aa51a815-65e3-dc91-c3ed-8be29ff21f30.png)


Unityを起動する
<img width="375" alt="IMG_0014.png" src="https://qiita-image-store.s3.amazonaws.com/0/93155/18dcfa76-bf0e-cb85-64ef-55e7a14f3846.png">
Eclipse & MavenでJava11を認識してくれなかったときの話

# はじめに

　最近、ふと思い立ってHttpRequestを投げるプログラムを書いたときのこと。
　「そういえばJava9からincubatorとしてHttpClient入ったんだっけ」とJava9で開発をスタートしたものの、ダラダラ作ってるうちにJava11がリリース。
　Java11ではJava9のincubator.httpのHttpClient等がjava.net.httpになったため、当然のように使用しているJavaのバージョンも11に変更。

　で、HttpResponseのbodyを処理するのにGsonを使用していて、管理はMaven使っていた。
　EclipseでMavenプロジェクトを作成するとpomに何も変更をしていない状態ではJ2SE-1.5がJRE System Libraryに指定されるので、pom.xmlでバージョンを指定する必要があり下記のように指定していた。

```
  <build>
  	<plugins>
		<plugin>
  			<groupId>org.apache.maven.plugins</groupId>
 			 <artifactId>maven-compiler-plugin</artifactId>
			  <version>3.8.0</version>
			  <configuration>
			  	<source>11</source>
			  	<target>11</target>
			  </configuration>
		</plugin>
  	</plugins>
  </build>
```

※pomは雰囲気でコピペしたりして使ってるので書き方がおかしいとかインデントが糞とかあったらごめんなさい

　この時にJava10までは普通に指定して認識してくれたのに「11を指定すると何故か認識されずにJ2SE-1.5になる」というのが本題。

# 解決編

　普通に書く分には全く問題ないしInstalled JREsにはちゃんとjdk-11入ってるのになー、と思ってググっていたら下記を発見。

 [Java 11 Support for Eclipse 2018-09 (4.9)](https://marketplace.eclipse.org/content/java-11-support-eclipse-2018-09-49)

> This marketplace entry provides Java 11 support for Eclipse 2018-09 (4.9). To install the feature, please make sure you have the 4.9 version of Eclipse IDE installed

　Java11 Support for Eclipseという名前だしこれをインストールすれば良いのかな、と思いインストール。
　しようと思ったら使ってたEclipseのバージョンが4.8だったのでIDEをまずは更新することに。

　というわけで[EclipseのFAQ](https://wiki.eclipse.org/FAQ_How_do_I_upgrade_Eclipse_IDE%3F)の下記項目に従って更新を試す。

> Upgrading existing Eclipse IDE and Installed Features to newer release
> To upgrade Eclipse IDE to the next major release
> 
> 1. You first need to add the new release's repository as follows:
>     1. Window > Preferences > Install/Update > Available Software Sites
>     2. Click 'Add'
>     3. Enter the URL of the new repository (for example, http://download.eclipse.org/releases/2018-09/ ).
>     4. Click 'Ok'
> 2. Help > Check for Updates
> 3. If updates are found, proceed through the install wizard and restart the IDE when prompted. Otherwise, read carefully the error message to find out which component is conflicting and establish your resolution strategy.

　ちゃんと4.9に更新された、と思ったら微妙にどこかしくじったようで再起動すると4.8に戻る。
　何度か試したものの一向にうまくいかないので諦めてEclipse4.8を削除して4.9を新しく入れ直し。
　で上記のプラグインをインストールしたところ無事にJava11で認識されるようになった。

　が、今度はEclipse側でコメント内の日本語だけが文字化け & 日本語を含む行の「*」「"」などのフォントがデフォルトの以外に変わる(?)バグに遭遇。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">最新版のeclipseにしたらコメントの日本語だけ文字化けするとか色々面倒な感じになってつらい<br>Oxygenのときは普通にデフォルトのままいけた気がするのだが……<br><br>フォントを別のに変更すれば行けるっぽいけどしっくり来るフォントがなかなか見つからぬ <a href="https://t.co/5LhRziLf8V">pic.twitter.com/5LhRziLf8V</a></p>&mdash; 夏梅 (@t_01201) <a href="https://twitter.com/t_01201/status/1050951102143717377?ref_src=twsrc%5Etfw">2018年10月13日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


　これ自体は4.8入れたときにも発生したことがあって、その時はフォント変えたり戻したりしたらいつの間にか直っていた。
　というわけで同じようにフォントをいじったもののうまくいかず。

　結局pom.xmlでJava11を認識するようになった代わりにデフォルトフォントが使えなくなったというのが今回のオチ。
　こっちの解決方法は分からなかったのでとりあえずデフォルトの代わりに下記のフォントを使用することにした。

[プログラミング用日本語等幅フォント Cica\(シカ\)](https://github.com/miiton/Cica)
プログラミングとの向き合い方

10月にプログラミングを習い始めて、約2週間経ちました。
その間私の頭の中では、色んな考えが飛び交っていました。
ある時は楽しかったり、ある時は辞めてしまおうかと思ったり…。

しかし、一度は手放そうと思ったプログラミングを、今はやり続けようと改めて決意するまでに至りました。
今回は、そう思った理由を書こうと思います。

プログラミングをして挫折して辞めたいと思っている方は、辞める前に見てください（笑）
参考になるかと思います。


#プログラミングに手を伸ばした理由
私がプログラミングを始めた理由は、とてもシンプルです。

「面白そうだったから」

これだけです。
論理思考を身につけたい、プログラミングが必要だと世間で言われているからなど、細かい理由はたくさんあります。
しかし、それらをまとめて言うと、結局「面白そうだったから」に辿り着いたのです。

プログラミングを学んでいる方も、恐らく最終的には「面白そう」と思って始めたのではありませんか？

そう思って始めたわけなのですが、やはり世の中甘くありませんね（笑）
「挫折」という壁にぶつかってしまったのです。


##初めての「挫折」
プログラミングは最初にHTML&CSSを学びますが、私はここでいきなりプログラミングが嫌になりました。
正しく入力したはずなのにホームページに反映されない、といった日々が続いたのです。
間違いを見つけなければ後々にも影響するため、立ち止まっては振り返る行為を繰り返しやっていました。

当然、全く前に進みません。
おまけに、計画を後押しさせてしまって焦るばかりです。
しかし、焦っていたらミスは増えてしまう…。

このような状態だったので、嫌になる一方でした。
「なんで、プログラミングなんかやっているのだろう」とも、思っていました。


###でも、やっぱり…
嫌々になっていく中、私はある行動に出ました。
「もういいや」と思って、手放したのです。
ミスを1日探してもわからなかったので、どうにでもなれ！と思ったのです。

しかし、不思議なことにあの「ミス」が気になってしまうのです。
まだ確認していないところがあるのではないのかと、考えてしまうばかりなのです。

あまりにもムズムズするので、もう一度プログラミングに手を伸ばしました。

すると、なんと1分で原因が見つかったのです。
あの時の悩んでいた時間は一体何だったのだろうかと、自分に呆れてしまいました。

しかし、その途端、私はプログラミングに「綺麗さ」を感じました。

だって不思議ではありませんか？
文字と記号だけで、ホームページやアプリが作れるのですよ？
こんなシンプルな構造で、世界中が身近に見れるようなものが他にあるのだろうかと思いました。

そう思った瞬間、学ぶ速度が一気に速まりました。
知りたい、もっと知りたいという好奇心も、同時に高まっていきました。

貴重な学びをしているのに、捨てるのはもったいない。

そう思いながら、私はプログラミングの奥深さを今でも徹底的に追求しているのです。


####最後に
さて、この2週間で私は「プログラミングとの向き合い方」を学びました。
その方法とは、一旦身を引くことです。

躓いたら自分の好きなことをする。

そして、後日もう一度手を伸ばしてみてください。
プログラミングの間違いなんて、とても単純なものです。

頭をリフレッシュさせて、もう一度向き合うことが「プログラミングの向き合い方」だと思います。

プログラミングを始めたばかりの方は、是非参考にしてみてください。
ブロックチェーン技術：ユースケース

ブロックチェーンは多目的な技術です。現在、様々な産業において多くのアプリケーションはブロックチェーン技術を応用できる可能性があります。この記事でいくつか例を紹介します。


#### [オーガー (Augur)](https://www.augur.net/) | 将来予測
オーガーは予測市場です。「Wisdom of the Crowd」という特性を生かすために開発されたプラットフォームです。仲介者が存在しない公平な予想市場を作っています。

<sub>ビデオ紹介（クリックください）:</sub>
<a href="http://www.youtube.com/watch?feature=player_embedded&v=yegyih591Jo
" target="_blank"><img src="http://img.youtube.com/vi/yegyih591Jo/0.jpg" alt="IMAGE ALT TEXT HERE" width="480" height="360" border="10" /></a>

#### [ゴーレム （Golem)](https://golem.network/home/)｜分散コンピューティング
ゴーレムは余分なコンピューティングパワーをP2Pで取引する分散型コンピューティングプラットフォームです。リクエスターはプロバイダーからコンピュータリソースを購入できます。これにより、自分の能力以上の計算を実行できます。

<sub>ビデオ紹介（クリックください）:</sub>
<a href="http://www.youtube.com/watch?feature=player_embedded&v=_Q888b0VRx8
" target="_blank"><img src="http://img.youtube.com/vi/_Q888b0VRx8/0.jpg" alt="IMAGE ALT TEXT HERE" width="480" height="360" border="10" /></a>

#### [エンジンコイン (Enjin Coin)](https://enjincoin.io/)｜ゲーム産業、アセットマネージメント
エンジンコインはゲーム専用の暗号通貨です。「ERC-721」や「ERC-1155」を使って作ります。ゲームの資産の管理をより簡単に安全な形で交換できます。そして、暗号通貨にゲームの資産を変換できます。このアプリケーションは分散型ゲーム産業における革命をもたらす可能性があります。

<sub>ビデオ紹介（クリックください）:</sub>
<a href="http://www.youtube.com/watch?feature=player_embedded&v=OCeg_i782f0
" target="_blank"><img src="http://img.youtube.com/vi/OCeg_i782f0/0.jpg" alt="IMAGE ALT TEXT HERE" width="480" height="360" border="10" /></a>

ブロックチェーン技術を使ったら、暗号通貨をつくるだけではとどまらない、たくさんの可能性があります。何が正解かはまだ議論中ですが、素晴らしい技術です。

もっと読む：
* [Augur Documentation](https://docs.augur.net/)
* [Golem: Moving Toward A Decentralized Supercomputer](https://blog.xtrabytes.global/general-crypto/golem-moving-toward-a-decentralized-supercomputer/)
* [Enjin Coin - Smart Cryptocurrency for Gaming](https://enjincoin.io/about/)
* [19 Industries The Blockchain Will Disrupt](https://futurethinkers.org/industries-blockchain-disrupt)
Rubyでsimpleにhttp requestを送る

## Rubyでシンプルにhttp Requestを送ってresponseで条件分岐

* ちょっとリクエストを試してみようみたいな時にコピペで使える情報です。
* URIに日本語とか混じると意外とどうするんだったか忘れてしまうのでそれも一緒に載せました。

## 目標
1. `net/http`, `uri`, `json`などのrubyの基本的なmoduleを深く考えずとりあえず使えるようになること。
2. statusコードとかで条件分岐出来るようになる。


①Get(レスポンス => json)

```ruby
require 'net/http'
require 'json'
class Map
  def geocode(address)
    # domain+pathをuriとする
    uri = URI("https://maps.googleapis.com/maps/api/geocode/json")
    # (日本語が混じっていたりする場合 => URI.parse(URI.escape("https://ほげ/)) )

    # queryはわかりやすいように分けて設定する(uriにそのまま含めることも可能)
    query = {address: address.gsub(" ", ""), key: "YOUR_API_KEY" }
    uri.query = URI.encode_www_form(query)

    # 実際にgetリクエストを飛ばす
    res = Net::HTTP.get_response(uri)

    # statusコードを確認
    puts res.code

    data = JSON.parse(res.body.to_s)
    lat = data["results"][0]["geometry"]["location"]["lat"]
    lng = data["results"][0]["geometry"]["location"]["lng"]
    [lat,lng]
  end
end

# 実行
a = Map.new
puts a.geocode("東京都世田谷区")
# => 35.6465721, 139.6532473
```

responseについてはNet::HttpResponseオブジェクトが帰ってくる。具体的には以下のような値を得ることが出来る。


```ruby
# Headers
res['Set-Cookie']            # => stringで返ってくる
res.get_fields('set-cookie') # => Array
res.to_hash['set-cookie']    # => Array
puts "Headers: #{res.to_hash.inspect}"

# Status
puts res.code       # => '200'(integer)
puts res.message    # => 'OK'(string)
puts res.class.name # => 'HTTPOK'(string)

# Body
puts res.body if res.response_body_permitted?
 ```

参考： https://ruby-doc.org/stdlib-2.5.1/libdoc/net/http/rdoc/Net/HTTP.html
AWS勉強 -HTTPの動きを確認する-

# HTTPの動きを確認する

前回までで,Webサーバーを構築してWebブラウザでアクセスできるところまで確認した.
この章ではHTTPプロトコルについて学んでいく.

## HTTPとは

https://itsakura.com/network-http-get-post

内容的には上記参考でOK!

## ブラウザの開発者ツールでHTTPのやり取りを覗く

HTTPのやり取りはいくつかのツールを使うと実際に目で見ることができる.
僕はChromeでやって見るよ...

### ネットワーク通信を見る

検証モードで行う(MacはCommand+Option+I)

<img width="771" alt="スクリーンショット 2018-10-14 20.05.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/180668/91cad67e-7897-88d4-5e57-c6831f272179.png">

からの,

![スクリーンショット 2018-10-14 20.06.47（2）.png](https://qiita-image-store.s3.amazonaws.com/0/180668/59961155-ac65-d5e4-7573-8b9e11081365.png)

これが一覧.

### HTTPのやり取りをのぞいて見る

#### ヘッダー部分を確認

<img width="942" alt="スクリーンショット 2018-10-14 20.11.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/180668/5bdd71d1-b4c5-9a97-2531-85684df42964.png">

からの,

<img width="928" alt="スクリーンショット 2018-10-14 20.19.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/180668/8fe071d2-7a01-7c57-f03e-21df464c1e49.png">

#### ボディ部を確認する

<img width="791" alt="スクリーンショット 2018-10-15 0.20.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/180668/452d0aaa-9249-78f1-d918-950d4ae1e89c.png">

### リクエストとレスポンスの詳細

#### HTTPメソッド

https://qiita.com/Ryutaro/items/a9e8d18467fe3e04068e

#### HTTPステータスコード

https://developer.mozilla.org/ja/docs/Web/HTTP/Status

#### リクエストヘッダー

https://developer.mozilla.org/ja/docs/Glossary/Request_header

#### レスポンスヘッダー

https://developer.mozilla.org/ja/docs/Glossary/Response_header

## Telnetを使用してHTTPを喋って見る

自らの手を動かしてHTTPプロトコルで通信することもできる.
そおために必要なのはTelnetクライアントだけだ.

僕はMACでやりまーす!

ターミナルを使用して,以下のコマンドを入力.

```shell
$ telnet www.nikkeibp.co.jp 80
```

...どうやら標準だとtelnetコマンド使用できないので,

```shell
$ brew install telnet
```

上記コマンドでインストール!
ちょっと時間かかるなぁ

<img width="610" alt="スクリーンショット 2018-10-15 0.41.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/180668/433785c8-0ed6-8943-0408-3ae416f9f403.png">

### 感想

リクエストとレスポンスの内容は普段そんなに意識してなかったので,今回勉強になった.
Pythonでfire and forget

# Pythonでfire and forgetする


```python
import time
import asyncio

async def wait(sec: int):
    time.sleep(sec)
    print('I woke up')

async def main():
    asyncio.ensure_future(wait(3))
    print('Hey, wake up!')

if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())
```

# 実行結果
```
Hey, wake up!
I woke up
```
VSCodeからMaya上をリモートデバッグする

# VSCodeからMaya上をリモートデバッグする
[以前記載されていた方法](http://iwonderwhatjoeisworkingon.blogspot.com/2017/04/debugging-maya-using-visual-studio-code.html)で出来なくなっていたので新しい導入手順を紹介。


## 準備手順
1. [ptvsd-4.1.3.zip](https://pypi.org/project/ptvsd/#files)をダウンロードし、解凍。
2. 解凍したフォルダにある ptvsdフォルダを Mayaの Scriptsフォルダにコピー。
3. VScode側で Ctrl + Shift + P -> Debug: Open launch.json に以下を追加。

    ```json
        {
            "name": "Maya: Attach",
            "type": "python",
            "request": "attach",
            "pathMappings":[{
                "localRoot": "${workspaceFolder}",
                "remoteRoot": "${workspaceFolder}",
            }],
            "port": 3000,
            "host": "127.0.0.1"
        }
    ```

4. usersetup.pyに以下を追加。

    ```python:usersetup.py
    import ptvsd;ptvsd.enable_attach(address=('127.0.0.1', 3000), redirect_output=True)
    ```

## 実行手順
1. コードにブレークポイントを打つ。
1. vscodeのデバッグシナリオを Maya: Attach に設定する。
    ![Maya_attach.jpg](https://qiita-image-store.s3.amazonaws.com/0/294868/3d9c5567-4bbd-72e0-2a38-da9fb735ae1c.jpeg)
2. vscodeでF5をデバッグ実行。
3. Maya上でコードを走らせる。
4. ブレークポイントで停止し、Vscode上に情報が出る。
    ![Maya_attach_2.jpg](https://qiita-image-store.s3.amazonaws.com/0/294868/486af163-6bad-7e49-a347-eaaa6c82cccf.jpeg)


## 雑感
* 8月のアップデートでptvsd周りを更新したため、以前の方法が使えなくなった？
   * 参考: [Python in Visual Studio Code – August 2018 Release – Python at Microsoft](https://blogs.msdn.microsoft.com/pythonengineering/2018/09/05/python-in-visual-studio-code-august-2018-release/)

## 参考
* [Debugging Maya using Visual Studio Code](http://iwonderwhatjoeisworkingon.blogspot.com/2017/04/debugging-maya-using-visual-studio-code.html) 
* [Python debugging configurations in Visual Studio Code](https://code.visualstudio.com/docs/python/debugging)
* [Python in Visual Studio Code – August 2018 Release – Python at Microsoft](https://blogs.msdn.microsoft.com/pythonengineering/2018/09/05/python-in-visual-studio-code-august-2018-release/)
Arduino IDEでcollect2.exe: error: ld returned 1 exit statusが出た場合の対処法

# はじめに
最近流行りのM5Stackの波に乗りたいと思い、余り使ったことがなかったArduino IDEを触っていてハマった点の1つを共有します。
解決したら大したことない、むしろ超初歩体で恥ずかしいぐらいのことだったかもしれないですが、意外と知らないと何が起きているかわからない？と思っていたので記事にしてみました。

# 何のエラーが出ていたか
結論に近い話から書きます。
私がArduino IDEで出たエラーは
```collect2.exe: error: ld returned 1 exit status```
です。

# 原因
原因は、.inoファイルにライブラリと同じファイルが置いてあったことでした。

ライブラリは設定にもよるかもしれませんが、
```C:\Users\UserName\Documents\Arduino\libraries```
に配置されています。

ここにある.ccp, .hと同じファイルをスケッチと同じディレクトリに置くと悪さをします。

# 気をつける点

## スケッチに置くファイルとライブラリのファイル確認
原因で書いた通り、ライブラリにあるものはスケッチ(.ino)のディレクトリには置く必要はありませんので削除します。


## ヘッダフィアルの参照
ライブラリのヘッダを参照する場合は<>で囲みます。

```
#include <hoge.h>
```

スケッチ(.ino)のディレクトリ以下のファイルは参照する場合は""で囲みます。


```
#include "piyo.h"
```

## ビルドファイルの削除
これが結構ハマった点ですが、すぐにこれはファイル構成が悪いと気づき、スケッチディレクトリのファイルを削除しましたが、改善されず混乱しました。
これは一度作成したビルド済みのファイルが残っていたことが原因のようです。

私の場合は、事前にIDEのファイル/環境設定の
```C:\Users\UserName\AppData\Local\Arduino15\preferences.txt```
を編集し、
```build.path=C:\Users\UserName\AppData\Local\Temp\arduino_build```
を追加していました。

この中の
```build.path=C:\Users\UserName\AppData\Local\Temp\arduino_build\sketch```
に以前のファイルが残っているとビルドエラーが改善されないことがあります。
なのでその場合はsketch以下のファイルを削除した方が良いです。

Arduino IDEはビルドクリーン的なものは存在しないんでしょうか。

## コンパイルログを全て表示
なぜ失敗しているか把握するために、先程と同じ環境設定から```コンパイラの警告```を```全て```に選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/302503/90b02183-5410-47d6-918a-4fb59377ad85.png)

そうすると詳細なコンパイルエラーが表示されるので原因が推測出来ます。


# 具体的に何でエラーが出たか
実際に私がやろうとしていたことは、M5StackでAvatar＋AquesTalkTTSを使ってしゃべらせることです。
Exampleはライブラリマネージャで`M5Stack`で検索すると出てくる`M5Stack_Avatar`をInstall済みの状況です。

スケッチ例のM5Stack_Avator/talkではしゃべることは確認出来ていたので、次にほぼ同じ内容のコードでinoファイルを作成し、AquesTalkTTS.ccp/.hをinoと同じディレクトリに配置してビルドしました。

AquesTalkTTS.ccp/.hは以前Exampleを動かすときにlibrariesに配置していたため今回の問題が発生しました。

# 参考サイト
こちらにArduino/ESP32系の注意点が多数出ているので参考になります。
[ESP32 ( ESP-WROOM-32 , M5Stack )自分的 トラブルシューティング まとめ](https://www.mgo-tec.com/blog-entry-trouble-shooting-esp32-wroom.html/3)
Spring+HikariCP+MySQLで接続時、SQL実行時のタイムアウトをどう設定するか確認する

# やりたいこと

Spring+HikariCP+MySQLで接続時、SQL実行時のタイムアウトをどう設定するか確認する。

## 環境

動確をとる環境
※"やりたいこと" を確認する環境

Spring関係：5.0.9
HikariCP：2.7.9
MySQL：5.7

## DB接続時にタイムアウトさせる

### 設定する項目（JavaでDataSourceの設定を記述する場合）

HikariDatasourceのインスタンスに対して setConnectionTimeout() で設定する。

```
@Bean
HikariDataSource datasource() {
    
    HikariDataSource ds = new HikariDataSource();
    ds.setJdbcUrl("jdbc:mysql://localhost:3306/test?useSSL=false&socketTimeout=10");
    ds.setConnectionTimeout(250); // ★ここ
    ds.setUsername("user");
    ds.setPassword("password");
    return ds;
}
```

### 設定する項目（Spring-bootの自動設定を使う場合）
application.propertiesの↓の設定

```
spring.datasource.hikari.connection-timeout=タイムアウト（ミリ秒）
```

## DB接続後、SQLの結果が返ってこない場合にタイムアウトさせる
JDBCのURLにsocketTimeoutのパラメータをつける。

### 設定する項目（JavaでDataSourceの設定を記述する場合）

```
@Bean
HikariDataSource datasource() {
    
    HikariDataSource ds = new HikariDataSource();
    ds.setJdbcUrl("jdbc:mysql://localhost:3306/test?useSSL=false&socketTimeout=10"); // ★ここ
    ds.setConnectionTimeout(250);
    ds.setUsername("user");
    ds.setPassword("password");
    return ds;
}
```

### 設定する項目（Spring-bootの自動設定を使う場合）

```
spring.datasource.url=jdbc:mysql://localhost:3306/test?useSSL=false&socketTimeout=タイムアウト（ミリ秒）
```

## 試してみる

windows環境でネットワークの遅延を再現する方法は↓参照。
[windowsローカルでネットワーク遅延を再現する方法](https://qiita.com/k_hoso/items/2d58db58c5b738fcd7c4)

サンプルとして書いているコードは、
接続タイムアウト：250ms
接続後の通信タイムアウト：10ms
としているので、下記の手順で想定通り例外が出るのを確認します。

以下、手順。

1. 接続が確立する前の状態で、ラグを400msにしてSQLの実行を伴う処理を実行すると、出力される例外でタイムアウトが確認できると思います。（**接続タイムアウト**）
2. 次に、一旦、遅延の発生をstopさせ、SQLの実行を伴う処理を実行（コネクションプールをDB接続させる）します。
3. その後、ラグを100ms※にして遅延をstartさせ、SQLの実行を伴う処理を実行すると、出力される例外でタイムアウトが確認できると思います。（**接続後、SQLが返ってこない場合のタイムアウト**）  
※250msを超える値を設定すると接続タイムアウトの設定でタイムアウトしている訳ではないことが確認できなくなるので注意
4. で、最後にタイムアウトの設定を外すと遅延状態で実行してもタイムアウトしないことを確認しておくと良いと思います。

## ただ、、

ログの実行時間見てると、指定したミリ秒通りに例外のログが出ないですよね。
タイムアウトの設定値、遅延の設定値で意図した通りにタイムアウトしてると思うのでタイムアウトの判定自体はできてると思うのですが、、
謎。
BeautifulSoupのgetTextでエラーが頻発する

# スクレイピングが不定期に失敗する
以前の記事[Kindle Paper Whiteにニュース記事を自動転送してみた](https://qiita.com/WakoRin/items/329c44b2f49be84f351d)
この中で記事のタイトルと内容をスクレイピングする箇所があるのですが
３回に１回くらいの割合でAttributeエラーが頻発するのです・・・．
はじめに書いていたソースはこんな感じ．

```python:スクレイピング
        with urllib.request.urlopen(url) as response:
            html = response.read()

        # Decode to utf-8. Exceptions will be replaced
        html = html.decode('utf-8','replace')

        # Parse it to elements
        soup = BeautifulSoup(html, "html.parser")

        # Get title and content of article
        self.title = soup.find("h1").get_text()
        self.article = soup.find("div", {"itemprop":"articleBody"}).get_text()

```

BeautifulSoupの記述方法がおかしいのか
いや，フェッチするたびに内容は変わらないだろうと右往左往・・・・・

# レスポンスヘッダーを比べてみる
そこで，成功したときと失敗したときのレスポンスのヘッダーを比べて見ました．

**失敗したとき**

```
200
OK
Server: nginx/1.15.5
X-Cache-Status: HIT
Cache-Control: max-age=0, public, s-maxage=180
Content-Type: text/html; charset=UTF-8
Content-Encoding: gzip
Date: Sat, 13 Oct 2018 02:05:29 GMT
Expires: Sat, 13 Oct 2018 02:03:31 GMT
Transfer-Encoding: chunked
Connection: close
Set-Cookie: X-Mapping-fjhppofk=D375F6D40F5119E7EE3B8D6F2D84ED5F; path=/
Last-Modified: Sat, 13 Oct 2018 02:03:31 GMT

```

**成功したとき**

```
200
OK
Server: nginx/1.15.5
Cache-Control: max-age=0, public, s-maxage=180
Content-Type: text/html; charset=UTF-8
Date: Sat, 13 Oct 2018 02:05:28 GMT
Expires: Sat, 13 Oct 2018 02:05:28 GMT
Transfer-Encoding: chunked
Connection: close
Set-Cookie: X-Mapping-fjhppofk=EBCD18ED55EF4AE9B8B1DC281AE205B0; path=/
Set-Cookie: japantoday=977tqlh5ob1ebc9fffikjoskq0; expires=Sun, 14-Oct-2018 02:05:27 GMT; Max-Age=86400; path=/; domain=japantoday.com
Last-Modified: Sat, 13 Oct 2018 02:05:28 GMT
```

多分，この辺が違う

```
Content-Encoding: gzip
X-Cache-Status: HIT
```
失敗しているときはgzip形式で圧縮されて送られて来ている．
多分これが原因．

キャッシュされたものを受け取るときはgzipになるのかな？
（詳しい人教えてください）

リクエストヘッダーでgzipで受け入れ可能ということを伝えて
受信した内容をデコードすれば一件落着．

```python:スクレイピングgzip　(JapanTodayArticle.pyから抜粋)
import gzip
    def fetch(self):
        """
        fetch html data and parse title and content
        """
        headers = {'Accept-Encoding': 'gzip'}
        request = urllib.request.Request(url=self.url, headers=headers)

        with urllib.request.urlopen(request) as response:
            html = response.read()

        # Decompress gzip-fetched html
        html = gzip.decompress(html)
```
[Kindle Paper Whiteにニュース記事を自動転送してみた](https://qiita.com/WakoRin/items/329c44b2f49be84f351d)
上のソースコードはすべて[GitHub](https://github.com/WakoRintaro/jpntdy)に載せています．
第36話 立法数の和

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

```math
1^3+2^3+3^3=(1+2+3)^2=36
```

立方数の和と、自然数の和の二乗は同じ数になります。
総和を求める式を見れば一目瞭然です。

```math
\sum_{k=1}^n k=\frac{n(n+1)}{2}\\
\sum_{k=1}^n k^3 =(\frac{n(n+1)}{2})^2
```

1～nまでを足し算した結果はこのように求められます。

```math
S=1+2+3+4+5\\
2S=(1+5)+(2+4)+(3+3)+(4+2)+(5+1)\\
=6+6+6+6+6=6×5\\
S=\frac{6×5}{2}=15
```

こうやって考える他に次のように式を変形して証明しても良いでしょう。
S(n)を1からnの合計とします。

```math
S(n)+(n+1)=\frac{n(n+1)}{2}+(n+1)\\
=\frac{1}{2}n(n+1)+(n+1)=(\frac{1}{2}n+1)(n+1)\\
=\frac{n+2}{2}(n+1)=\frac{(n+1)(n+2)}{2}=S(n+1)
```

立方数の和も同様の式を作って計算すると冒頭の式が正しいことがわかります。
ブロックチェーンは安全

理由 #1: データを追跡するために方法がある。
ブロックチェーンは順序によって情報を貯めます。もし情報を編集したいなら、書き換える代わりに、新しいブロックを追加することによって変更があることが示します。だから、ブロックを編集していることが残りのブロックと一貫性のないになります。

理由 #2: 信頼を作ります。
誰もがデータのコピーを持っているので、ブロックチェーンは誰にも所有されていません。 このコピーのネットワークは、仕事の証明からの検証として機能し、新しいブロックが真になる前にネットワークの50％以上が同意しなければなりません。 これは民主主義を確立する。


理由 #3:　仲介者を取り去ります。
ブロックチェーンは分散化されており、独自のコピーがあるので、すべてのトランザクションを自分で検証することができます。 仲買人の助けがなければ、これは多くの時間、お金、そしてあなたの脆弱性を節約します。
スマホのセンサデータをmatlab mobileで取得

#概要
スマホでmatlabを使える、夢のようなアプリ[matlab mobile](https://play.google.com/store/apps/details?id=com.mathworks.matlabmobile&hl=ja)。
コマンドを書いたりするだけでなく、スマホのセンサデータ
（加速度・角加速度・磁場・方向・位置）を取得可能。
取得データは、matlab mobile内で処理するだけでなく、本家matlabに渡すことも可能な優れもの。

使い方について、公式のドキュメントがいまいち分かりにくかったのでまとめました。
<b>注
下記はmatlab mobileでデータ取得、matlab mobile内でデータ処理する場合のフローです。本家matlabに渡す場合はやり方が異なるので注意。
</b>

##①matlab側の準備
matlab mobileをインストールして起動、mathworksアカウントにてログイン。
センサデータ取得用のオブジェクトを下記定義。

```matlab:sample.m
m = mobiledev;
```

##②センサデータの取得
#####1.左上ウィンドウから「センサー」を選択。
各センサのアイコンをタップすることで有効化できます。
![Screenshot_20181014-225739~01~01~01.jpg](https://qiita-image-store.s3.amazonaws.com/0/302506/7ce3b8f3-6c1c-41b6-1033-596051a3f5bd.jpeg)
注意すべきが下のチェックボックスで、
「matlabにストリーム」にチェック。この場合、取得したデータはmatlab mobileのワークスペースに保存されます。

ちなみに「ログ」の場合、取得したデータは[matlab drive](https://jp.mathworks.com/products/matlab-drive.html)なるクラウドにmatファイルとして保存され、matlab mobile または[matlab online](https://jp.mathworks.com/products/matlab-online.html)からからアクセス可能です。 また「ログ」の場合、mobiledevオブジェクトの作成は不要です。

こちらの方法を選択してももちろんＯＫですが、ファイル保存→ワークスペース読み込みと手間が増えるため、ここでは「matlabにストリーム」を使います。

#####2.データ取得
中央にある「開始」ボタンをタップして取得開始、「停止」で取得終了。
なお、「開始」「停止」はコマンドウィンドウからも設定可能で、コードは下記。

```matlab
m.Logging = 1;%「開始」ボタンのタップに相当

m.Logging = 0;%「停止」ボタンのタップに相当
```
##③取得したデータを配列に書き出し
加速度データを書き出す場合は下記。

```matlab
[a, t] = accellog(m);
```

figureにプロットしてみる。

```matlab
plot(t,a);
```


![Screenshot_20181014-235922~01.jpg](https://qiita-image-store.s3.amazonaws.com/0/302506/38a58f05-6ca0-1399-c4c3-7c3944146906.jpeg)

#まとめ
matlab mobile、いろいろと可能性があると思うのですが利用者の少なさを実感しています。上記参考にまず使っていただければ幸いです。
Scalaのimplicit（暗黙）に関する理解のためのメモ

## 概要
Scalaではimplicit（暗黙）という機能があり、おそらくScala未経験の人はこの機能が使われているソースを見て、かなり戸惑うと思います。（私も戸惑いました）
implicitの動作については@miyatin0212さんの[Scala implicit修飾子 まとめ](https://qiita.com/miyatin0212/items/f70cf68e89e4367fcf2e)にて、詳しくまとめられていますが、自分なりに理解した内容とサンプルコードをメモとして残しておきます。

## 理解＆サンプルコード
### 1_暗黙の引数
implicitの変数を引数に設定することで、メソッド呼び出し時に引数の設定を省略することが出来ます。サンプルコードは以下です、実行結果は「11」になります。

```
  // 1_暗黙の引数メソッド
  def returnInt(implicit param:Int):Int = {
     param + 5
  }
  implicit val param = 6
  println(returnInt)
```

### 2_暗黙のメソッド
引数に暗黙的にメソッドを呼び出したいクラスを設定することで、通常コンパイルエラー等発生する場合でも自動的にメソッドを補完する機能です。サンプルコードは以下です、実行結果は「7」になります。


```
  // テスト用の空クラス
  case class TestEmptyClass(){}

  // 2_暗黙のメソッド
  implicit def returnInt(param:TestEmptyClass):Int = {
    3
  }
  
  // 空クラスの作成
  val test = TestEmptyClass()
  println(4 + test)
```

### 3_暗黙のクラス
引数にメソッド等を拡張したいクラスを設定することで、自動的にクラスを補完してくれる機能です。サンプルコードは以下です、実行結果は「testclass」になります。


```
  // テスト用の空クラス
  case class TestEmptyClass(){}

  // 3_暗黙のクラス
  implicit class ImpClass(param:TestEmptyClass){
    def plintTest= {
      println("testclass")
    }
  }
  
  // 空クラスの作成
  val test = TestEmptyClass()
  test.plintTest
```
【Unity】UnityのcsファイルをVisual Studio のエディタに関連づける

<b><font color="HotPink">環境メモ</font></b>
⭐️Mac OS Mojave バージョン10.14
⭐️Xcode version 10.0(10A255)
⭐️Unity 2018.2.11f1
⭐️iPhone7  IOS11.4.1

![001.png](https://qiita-image-store.s3.amazonaws.com/0/93155/843275df-4dc8-5b2b-7049-05aef190852e.png)

![002.png](https://qiita-image-store.s3.amazonaws.com/0/93155/9f5f39b6-ee46-178e-4b5d-de6b37d5c74d.png)
MVVMについて、ヌケモレの追加と間違い修正

# はじめに

以下の記事でMVVMについて調べた結果を掲載していました。

[MVVMとは?　勉強結果と参考資料の共有](https://qiita.com/FORTE/items/d7b33144b24ef9d1de06)

[【Androidアプリ開発勉強】ViewModelの実態はActivityで良さそう](https://qiita.com/FORTE/items/74faf552e754d7d5621e)
<br>

ですが、以下の本を読んだ結果ヌケモレと間違いに気付いたので訂正記事を上げます。

[Android アプリ設計パターン入門](https://peaks.cc/books/architecture_patterns)
<br>

正直ネットで調べる時間と情報の精度を考えると、
上記の本を買ったほうが良いです。

MVVM以外にもMVPや実際の開発における話、
レガシー(本書内では「秘伝のタレ」と呼んでいる)部分の改善など多岐にわたって言及しています。
<br>

もし私の記事を読まれた方がいて参考にしていたら大変申し訳ありませんでした…。


# 訂正
「ヌケモレ」と「間違いの訂正」をしていきます。

## ヌケモレの追加
以下の記事でも一部言及していましたが、
データバインディングの話についてちゃんと言及できていませんでした。

[MVVMとは?　勉強結果と参考資料の共有](https://qiita.com/FORTE/items/d7b33144b24ef9d1de06)

MVVMではPDS(Presentation Domain Separation)が根底にあると書きましたが、
これを実現するのがデータバインディングです。

私はこのデータバインディングがごっそりと抜け落ちており、
勉強で作成したAndroidアプリでViewの値を変更するコード(抜粋)は以下の様になっています。

`Fugafuga fugafuga = new Fugafuga();
TextView textView = (TextView) findViewById(R.id.hogehoge);
textView.setText(fugafuga.text);`

これではViewModel側でViewの実装を思いっきり意識していることになります。
(View側にTextViewがあるんだよね!という点)

そのため、View側の仕様変更でTextViewが無くなると動かないコードとなります。

MVVMではこれを回避するためにデータバインディングを使用しています。
TextViewに対してデータをセットをするのではなく、
Viewに対してfugafugaというデータをセットするようなイメージとなります。

このfugafugaというデータがViewに対してバインディングされるため、
fugafugaを変更すると自動的にView側に反映されます。

このやり方であればView側の仕様変更でTextViewが無くなってもエラーになりません。


この記事を書いている時点で私もまだ実装していないので、
具体的なコード例は割愛します。

データバインディング自体は「Android Databinding」などでググれば、
いくらでも例が出てくるのでそちらを参考のこと。
[Googleで検索!](https://www.google.co.jp/search?q=Android+Databinding)



## 間違いの訂正
以下の記事で書いている「ViewModelの実態はActivity」というのは間違いでした。

[【Androidアプリ開発勉強】ViewModelの実態はActivityで良さそう](https://qiita.com/FORTE/items/74faf552e754d7d5621e)

>ViewModelはActivity


Activity/FragmentはViewのライフサイクルに依存しています。
そのため、Activity/Fragmentに状態を持たせてしまうと消えてしまいます。
なのでActivity/FragmentはViewModelには出来ません。
(ライフサイクル通りなら別にいいかも…)


なのでViewはXMLとActivity/Fragmentが担当、
ViewModelはAndroidのライフサイクルに関係ないように実装するのが一般的でした。


# おわりに
ライブラリは新しい古いがあるので書籍を参考にするのは難しいですが、
アーキテクチャやデザインパターンはそんなに変わらないので本を読むべきだと思いました。

またAndroidのみ公式ドキュメントに記載があったようなので、
ちゃんと公式ドキュメントを読まないといけないなと猛省しました。

つい英語を翻訳しながら読む労力を避けちゃうんですよね…。