OmniAICreator/Qiita-1.07M huggingface dataset:
Google Cloud Platform (GCP)サービスの正式名称・略称・読み方まとめ#5(コンテナ)

Google Cloud Platform (GCP)のサービスで正式名称や略称はともかく、読み方がわからずに困ることがよくあるのでまとめてみました。


クラウド コンピューティング サービス  |  Google Cloud
https://cloud.google.com/?hl=ja


## Amazon Web Services (AWS)のまとめはこちら！

Amazon Web Services (AWS)サービスの正式名称・略称・読み方チートシート - Qiita
https://qiita.com/kai_kou/items/cb29d261c8acc49fd22a

Amazon Web Services (AWS)サービスの正式名称・略称・読み方まとめ #1 (コンピューティング) - Qiita
https://qiita.com/kai_kou/items/a6795dbab7e707b0d1a6


## まとめルール

まとめルールについては下記を参考ください。

Google Cloud Platform (GCP)サービスの正式名称・略称・読み方まとめ#1(AI と機械学習/AI ビルディング ブロック) - Qiita
https://qiita.com/kai_kou/items/fa930eef23470c2f8f0b


## 概要について

サービス一覧ベージの概要を引用しています。

プロダクトとサービス  |  Google Cloud
https://cloud.google.com/products?hl=ja#product-launch-stages


間違いや、こんな呼び方あるよーなどありましたらコメントお願いします！


## Containers - コンテナ

### Google Kubernetes Engine (GKE)

コンテナ化アプリケーションを効率的かつ安全な方法で確実に実行できます。

- 正式名称: Google Kubernetes Engine
- https://cloud.google.com/kubernetes-engine/
- 読み方: グーグル クーべネティス エンジン
- 略称: GKE
- 俗称: なし


### Container Registry

Docker コンテナ イメージを保存、管理、保護します。

- 正式名称: Container Registry
- https://cloud.google.com/container-registry/
- 読み方: コンテナ レジストリ
- 略称: なし
- 俗称: GCR


### Container Security

GCP 上のコンテナ環境を保護します。

- 正式名称: Container Security
- https://cloud.google.com/containers/security/
- 読み方: コンテナ セキュリティ
- 略称: なし
- 俗称: なし


### Cloud Build

Docker コンテナ内でビルドステップを実行します。

- 正式名称: Cloud Build
- https://cloud.google.com/cloud-build/
- 読み方: クラウド ビルド
- 略称: なし
- 俗称: なし


### Deep Learning Containers (beta)

ディープ ラーニング環境向けに事前構成、最適化されたコンテナ。

- 正式名称: Deep Learning Containers
- https://cloud.google.com/ai-platform/deep-learning-containers/
- 読み方: ディープ ラーニング コンテナ
- 略称: なし
- 俗称: なし


### Kubernetes applications

コンテナ化されたアプリケーションをデプロイします。

- 正式名称: Kubernetes applications
- https://cloud.google.com/kubernetes-applications/
- 読み方: クーべネティス アプリケーション
- 略称: なし
- 俗称: なし


### Batch (beta)

Kubernetes を使用してバッチジョブを効率的に実行します。

- 正式名称: Batch
- https://cloud.google.com/batch/
- 読み方: バッチ
- 略称: なし
- 俗称: なし
M5StickVのmicroSDカード

M5StickVすごいですね、このサイズ、値段で楽しく遊べます。
でもSDカードとの相性があって...

先駆者の方々が下記に情報を載せていただいているのですが、
[M5StickV動作確認済み microSD - Google Docs](https://docs.google.com/spreadsheets/d/10Vv8ZQkbXX59aT_GkoolTMHf83zroIT21uNjvQMaGng/edit#gid=0)
該当のSDカードが店頭になく、似た型番のカードを買ったのですが、使えませんでした。
家に余っていたカードが使えたのですが、USBで給電中しか動作しないので、ちょっと不便でした。

先のリストにあったカードがヨドバシで売っていたので、購入したのですが、すんなり動かなかったのでここに書いておきます。

購入したのは、Transcendの300S TS64GUSD300S容量は64GBです

- 購入した状態で、boot.pyをコピーし、M5StickVを起動しましたが、起動しません、本体のboot.pyが動かないのでカードは認識はしているようです。
- Windows10で、フォーマット（exFAT）しましたが、現象変わらず。（リストにもexFATはダメと書いてあります）

**FAT32でフォーマットしたいのですが...**

- SD Associationの[SDメモリカードフォーマッター](https://www.sdcard.org/jp/downloads/formatter/)を使用しましたがFAT32の指定がありません、一応試したが、現象は同じです

- [I-O DATA ハードディスクフォーマッタ](https://www.iodata.jp/lib/product/i/2107.htm)を使用しましたが、SDカードドライブが表示されません、Windows上では見えているのですが...
もしかしてと思い、ノートPC本体のSDカードスロットを使わずに、USBのSDカードリーダーを使用したらドライブ表示されました。
このフォーマッタではFAT32のフォーマットが可能で、boot.pyの起動ができました。


### 参考にしたサイト
- M5StickVのmicroSDカード相性問題
https://hrkz.tokyo/m5stickv-microsd-issues/
- 第587回　RISC-Vベースの“AIoTカメラ”であるM5StickVをUbuntuで使う
https://gihyo.jp/admin/serial/01/ubuntu-recipe/0587?page=3
Automation Anywhere v11のユーザーインターフェイスの呼び方 まとめ

RPAツールであるAutomation Anywhereのユーザーインターフェイスの名称について調べてみたのでメモ。
バージョンによって公式ドキュメントも表現に多少のゆれがあるみたいですが、これが最も一般的な名称であろうというものを記載してみました。

# Control Room

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/c45e2a07-69b0-c9b3-2188-fdbfdadb4bf7.png)

**参考記事**

* [Enterprise Control Room インターフェースの概要 - 製品ドキュメント](https://docs.automationanywhere.com/bundle/enterprise-v11.3/page/enterprise/topics/control-room/getting-started/control-room-interface.html?_LANG=jpjp)

# Enterprise クライアント
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/e24c7f6c-a061-66b0-a5e3-332ef0ee031d.png)

### ワークベンチ (タスクエディター) 通常モード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/c2c30bbc-ccce-aa64-1cd5-96372d7c6e92.png)

**参考記事**

* [ワークベンチのツアー - 製品ドキュメント](https://docs.automationanywhere.com/bundle/enterprise-v11.3/page/enterprise/topics/aae-client/bot-creator/using-the-workbench/workbench-components.html?_LANG=jpjp)
* [タスク アクション リストを使用 - 製品ドキュメント](https://docs.automationanywhere.com/bundle/enterprise-v11.3/page/enterprise/topics/aae-client/bot-creator/using-the-workbench/using-the-task-actions-list.html?_LANG=jpjp)
* [Bot の作成 - 製品ドキュメント](https://docs.automationanywhere.com/bundle/enterprise-v11.3/page/enterprise/topics/aae-client/bot-creator/using-the-workbench/create-bot.html?_LANG=jpjp)

### ワークベンチ (タスクエディター) デバッグモード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/6568d88f-e51f-d60d-229a-23866638bf99.png)

### MetaBot Designer

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/2cf78839-0ad4-93f0-cf58-2fccb2da8830.png)

# レコーダー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/7b880803-0d38-d07b-031d-f3806423c507.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/d7e0533b-9109-a151-d1ff-142c55089547.png)

**参考記事**

* [スクリーンレコーダーまたは標準レコーダーを使用](https://docs.automationanywhere.com/bundle/enterprise-v11.3/page/enterprise/topics/aae-client/bot-creator/creating-an-automation-task/using-the-standard-recorder.html?_LANG=jpjp)
* [テーブル データの抽出](https://docs.automationanywhere.com/bundle/enterprise-v11.3/page/enterprise/topics/aae-client/bot-creator/creating-an-automation-task/extracting-table-data.html?_LANG=jpjp)


# その他の参考記事

* [Automation Anywhere - 【ボット構築初級編 vol.1】Automation Anywhere Enterprise Clientを使ってみよう！ - C&S Engineer Voice](https://licensecounter.jp/engineer-voice/blog/articles/20190819_AutomationAnywhere-BotCreationVol.1.html)
【RubyonRails】メッセージごとに異なるflashを表示する【Bootstrap】

ポートフォリオを作る中で、bootstrapを利用したflashを実装したのでメモしておきます。

#flashとは
そもそもflashとは何ぞやという人のために簡単に説明すると、Webサービスによくある「ログインに成功しました！」みたいなメッセージです。

railsではあれを簡単に実装できます。
さらにbootstrapを使えばデザインもいい感じに実装できます。

#前提
- deviseを導入している
- bootstrapをgemで導入している

#ヘルパーの設定
app/helpers/devise_helper.rbを作成し、以下のように記述してください。

```app/helpers/devise_helper.rb
module DeviseHelper
    def bootstrap_alert(key)
        case key
        when "alert"
            "warning"
        when "notice"
            "success"
        when "error"
            "danger"
        end
    end
end
```
deviseに使われてるkeyをbootstrapのアラートごとに割り当てます。

#app/views/layouts/_flashes.html.erb
app/views/layouts/_flashes.html.erbを作成して以下を記述。

```erb:app/views/layouts/_flashes.html.erb
<% flash.each do |key,value| %>
    <div class="alert alert-<%= bootstrap_alert(key) %>">
        <strong>
            <%= value %>
        </strong>
    </div>
<% end %> 
```
「 _ 」から始まるファイルは他ファイルでも共有できるようになっていますので、application.html.erbなどに

```erb:app/views/layouts/application.html.erb
<%= render layauts/flash %>
```
と記述してください。

これでflashが表示されたらOKです。

#まとめ
webサイト作成時flashはなかなか切り離せないので、こんな風にbootstrapを利用して簡単に設定できるのは良いですね。
UnityのStandardShaderってダサい気がする人へ贈る言葉

# 概要
**Unityの「StandardShader」ってダサいイメージありませんか？**
最初からあるし無料だし、カードゲームならスタンダードセットっていうと初心者が買う基本パーツを手に入れる為のものだし、絵を綺麗にする時ってStandardShaderの話よりPost Processing Stackの方が出てくるし、**ポスプロでブルームと被写体深度と色収差で助走付けて殴った方がよさそう**って感じするし…

そんな事ない？分かる？
分かる！って人はこの記事読むといいかもしれないです。

# StandardShaderの正体
UnityのstandardShaderは**「物理ベースレンダリング」**に基づいて設計されたShaderである。
っていうとよく分からないので**「ピクサーがシュガーラッシュ作る時に考えたヤツ(に基づいて実装されたShader)」**っていうと（オッ？）ってなるんじゃないでしょうか。

そもそもCGのレンダリングは何かの法則をシミュレーションして絵を出してます。
ただ、厳密にシミュレーションすると非常に時間がかかってしまうので、疑似的な方法や近似する手法がとられています。ある程度の精度は犠牲にして高速化しているわけです。
そんなこんなで**色々なShaderが生まれた**わけです。

で、色々なShaderがあると便利なように見えますが、**その分パラメータや調整項目も増えるので「アーティストが狙った絵を出すにはどないすればええねん」**ってなるわけですね。

そこで、ピクサーの偉い人は**「世の中の物質って金属と非金属、表面の粗さでだいたい分類できるよね」**っていう物理法則に気づいて、この法則に従ったShaderを作りました。
これが**物理ベースレンダリング(PBR)**と呼ばれている概念です。

(めちゃくちゃざっくり言うと)**「その物質が金属であるか・非金属であるか？」「表面がツルツルか？ざらざらか？」**の質問に答えると、そういう物質の絵を出してくれるShaderです。
これで**アーティストは狙った絵を出せるようになりました！**やったね。

<a target="blank" href="https://ja.wikipedia.org/wiki/%E7%89%A9%E7%90%86%E3%83%99%E3%83%BC%E3%82%B9%E3%82%B7%E3%82%A7%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0">物理ベースシェーディング フリー百科事典『ウィキペディア（Wikipedia）』</a>

# 物理ベースレンダリングを詳しく

<a target="blank" href="https://youtu.be/4H5W6C_Mbck">How to Use Blender's New "Ultimate" Shader: The Principled BSDF</a>
こちらの動画が参考になります。
英語なのでこの記事では字幕の出し方だけ捕捉しておきます。

![2020-02-21_08h00_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149449/6a6c40e8-d333-f718-b314-cdcf46ff8145.png)

![2020-02-21_08h01_48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149449/99bcbe19-6737-a387-ee98-4ecd9eaf2217.png)

# Unityでやるにはどうするの？

<a target="blank" href="https://docs.unity3d.com/ja/2018.4/Manual/shader-StandardShader.html">Standard Shader Unity DOCUMENTATION</a>
↑のリンクにアクセスする

![2020-02-21_08h09_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149449/62dd8ac7-586d-ea83-a68e-32afc937f597.png)
左側のバーから見たい項目を選べばOK

# おわり
**CGや3Dつよつよな人にとっては当たり前の超常識**なんですが、意外と**体系的に学ぶパス**が少ない気がする…
CGって意外と歴史が浅くて、そもそも物理ベースレンダリングの考え方は2012年(約8年前)に出たものだし、おしゃれなノイズのアルゴリズムも意外と最近出たんだなってものも多い。

毎年シーグラフをおっかけるのが手っ取り早そうだけど、英語だし論文を読めないといけないし、数式も理解する必要があって一定のハードルがある。
で、そこらへん分かりやすくしたCG関係の書籍に関しても、ニッチなのでドカドカ情報が出るわけでもない。
というわけで **知ってる人にとっては当たり前だけど、知らない人が知るキッカケが少ない** みたいなのは漠然と感じる。

VRChatとかで**リアリスティック**なワールドをセットアップしたい場合、StandardShaderを使いこなしてゆくのがいいかもしれない。
AWS CLI v2 (awscliv2.zip) でkubectlを使ってみる

# 目的
AWS CLI v2をインストールして、EKS上の情報をkubectl get svcで取得できるようにする。

# 背景
AWS CLI v2でkubectlが使えない？ということがあったので、実際にやってみる。

# 環境
- mac os　：  Mojave 10.14.16
- 現在のawscli バージョン：　aws-cli/1.16.292

# AWS CLI v2をインストールする

[AWS公式手順](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2-linux-mac.html)にしたがって作業する。

まずは以下のコマンドでインストールし、awscliv2.zipファイルとして保存する。

```
curl "https://d1vvhvl2y92vvt.cloudfront.net/awscli-exe-macos.zip" -o "awscliv2.zip"
```

保存したzipファイルを解凍する。

```
unzip awscliv2.zip
```

上記でawsというディレクトリが作成されるので、インストールコマンドを実行する。

```
sudo ./aws/install
```

パスワードを入力し、You can now run: /usr/local/bin/aws2 --version　と返って来ればOK。
バージョンを確認してみる。

```
hoge:~ fuga$ aws2 --version
aws-cli/2.0.0dev4 Python/3.7.4 Darwin/18.7.0 botocore/2.0.0dev3
```

保存されたパスも確認してみる。

```
hoge:~ fuga$ which aws2
/usr/local/bin/aws2
```

これでkubectl get svcをすると普通に実行できる。


```
hoge:~ fuga$ vim ~/.kube/config
hoge:~ fuga$ kubectl get svc
NAME              TYPE           CLUSTER-IP      EXTERNAL-IP                                                                    PORT(S)        AGE
kubernetes        ClusterIP      xxx.xx.x.x      <none>                                                                         443/TCP        88d
```

AWS CLI v1がまだインストールされてる状態だったことを思い出したので、
v1をアンインストールしてもう一回実行してみると

```
hoge:~ fuga$ kubectl get svc
Unable to connect to the server: getting credentials: exec: exec: "aws": executable file not found in $PATH
```

取得できなかった。

# kubectlを使えるようにする

先ほどのエラーに
`getting credentials: exec: exec: "aws": executable file not found in $PATH`
と出力されていたので、awsとどこかに書いているのか、、？と思い、kubeconfigを確認してみる。

```
hoge:~ fuga$ kubectl config view
- name: arn:aws:eks:us-west-2:xxxxxxxxxx:cluster/hoge-eks-cluster
  user:
    exec:
      apiVersion: client.authentication.k8s.io/v1alpha1
      command: aws
      env:
      - name: AWS_PROFILE
        value: fuga
```

commandで使用するコマンドを指定しているが、awsと記述されている。
AWS CLI v2はaws2と実行するので、これをaws2に修正する。

```
hoge:~ fuga$ kubectl config view
- name: arn:aws:eks:us-west-2:xxxxxxxxxx:cluster/hoge-eks-cluster
  user:
    exec:
      apiVersion: client.authentication.k8s.io/v1alpha1
      command: aws2
      env:
      - name: AWS_PROFILE
        value: fuga
```

kubectl get svcを実行してみると

```
hoge:~ fuga$ vim ~/.kube/config
hoge:~ fuga$ kubectl get svc
NAME              TYPE           CLUSTER-IP      EXTERNAL-IP                                                                    PORT(S)        AGE
kubernetes        ClusterIP      xxx.xx.x.x      <none>                                                                         443/TCP        88d
```

ちゃんと取得できるようになった。

# その他わかったこと
- 上記の手順でインストールした場合は、awscli v1と共存させる形になる。AWS CLI v1のパスは/usr/local/bin/aws。

- homebrewでのインストールも可能。brew install awscliで、AWS CLI v2がインストールされる。



# 参考
▼以下AWS公式ドキュメント
[Linux または macOS での AWS CLI バージョン 2 のインストール](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2-linux-mac.html)
[重要な変更 – AWS CLI バージョン 1 からバージョン 2 移行](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cliv2-migration.html)
Vue.jsのカスタムディレクティブについて

## まずディレクティブとは
v-textとかv-modelとかv-ifとか

これ、自分で作れる！
それが**カスタムディレクティブ**という

###どんな時に使うかというと🤔
- コードを抽象化したい
- コードを再利用したい

時に使います

再利用したいときは基本的には**コンポーネント**を使いますが、もっと複雑なものを作りたい時に**カスタムディレクティブ**を使います。



```App.vue
<template>
  <p v-border>Home</p>
  <!-- bindのタイミング・・・v要素が初めてpタグに結びついた時 -->
</template>
```

```main.js
//コンポーネントと同じように、引数は2つとる。
//1つ目は名前。border(v-●●の●●の部分)
Vue.directive("border",{
	//2つ目の引数はオブジェクト
	//５個のメソッドをとる
  //フック関数ともいう
  
  bind(el,binding,vnode){},
  //⬆️ディレクティブが初めて対象の要素に紐づいた時(最初の一回のみ)
  inserted(el,binding,vnode,oldVnode){},
  //⬆️実際の親DOMnodeに挿入された時
  //mounted的な
  updated(el,binding,vnode){},
  //コンポーネント(Home.vue)が更新された時  (コンポーネントのVNodeの状態で)
  componentUpdated(el,binding,vnode,oldVnode){},
  unbind(el,binding,vnode){}
});
```

主にこんな感じで書きますが、
二つ目の引数でよく使うものは、
`bind`と`updated`で基本的に同じような内容を書きます。

同じような内容を書くので、省略記法があります。

カスタムディレクティブの二つ目の引数は
オブジェクトとmain.jsの方に書きましたが、オブジェクトである必要はなく、そのまま関数を書いていっちゃいます。


```main.js
//functionの引数は、oldVnodeとかもかける
//{}内に書いたものは、bindとupdatedに適用される
Vue.directive("border",function(el,binding){
	//elとは紐づく要素を示す(どのHTML要素とつながるか)
  //今回はv-borderはpタグのとこに入ってるのでpタグと繋がる
	el.style.border ="solid black 2px";
  
  //el.style.borderWidth = '5px'
  //⬆️これを動的に渡すとすると、以下のように書く
  el.style.borderWidth = binding.value;
});
```

この`border`と`width`を一緒に書く場合は、**オブジェクト**で書きます！

```App.vue
<template>
<!-- 
二つ以上のデータを渡すときは渡すデータをオブジェクトにしちゃう　-->
  <p v-border="{width:'5px',color:'red'}">Home</p>
</template> 
```

ほんで

```main.js
Vue.directive("border",function(el,binding){
	  el.style.borderWidth = binding.value.width;  
	  el.style.borderColor = binding.value.color;  
});
```

こんな感じで


### 引数をとる場合
カスタムディレクティブの後に引数を取り、
jsの方でargと書きます
※引数は一つしか取れない

```App.vue
<template>
<!-- :の後に入るのは引数 -->
  <p v-border:dotted="{width:'5px',color:'red'}">Home</p>
</template> 
```

```main.js
Vue.directive("border",function(el,binding){  
    //arg = argument = 引数
    el.style.borderStyle = binding.arg；
});
最も低コストでプロダクトを公開したい

はじめまして。
普段はWebサービスの開発とかしてます。

# はじめに
彡(ﾟ)(ﾟ)「**サービス**を作って公開してみたいなあ〜」
彡(ﾟ)(ﾟ)「けど、レンタルサーバー借りるの**手間**だし...」
彡(ﾟ)(ﾟ)「**サーバー代**払いたくないなあ...」

こんな気持ちになったことありませんか？
きっとあるはずです。

そんなときは**Heroku 無料プラン**を使いましょう。
本記事では、作ったアプリケーションをHerokuの無料プランで公開する方法について書きます。

 ▷ Heroku公式サイトは[こちら](https://jp.heroku.com/)

# 無料プランって何が出来るのん？
大体のことは出来ます。
サーバーにアプリケーションをデプロイして運用するくらいなら**問題なく使えます**。

Herokuの無料プランで気にすべき制約は以下の二つです。

 - 無料 Dyno 時間(稼働時間)が 550 時間／月 
 - 30分アクセスが無いとアプリがスリープしてしまう

### 無料 Dyno 時間(稼働時間)が 550 時間／月

Herokuの無料プランはデフォルトのままだと月に550 時間分の Dyno 時間しか与えられません。

30 日 × 24 時間 = 720 時間 なので、1ヶ月フル稼働させようとすると無料プランでは足りません。

ただ、これは**クレジットカードを持っていれば解決できます**。

無料プランでもクレジットカードをアカウントに登録すると
450 時間／月 の 無料 Dyno 時間が加算され、合計 **1,000 時間**／月 まで使えるようになります。


### 30分アクセスが無いとアプリがスリープしてしまう

無料プランでは 30分アクセスが無いとアプリがスリープしてしまい、
次回アクセス時にアプリが立ち上がる時間分、**レスポンスが遅く** なってしまいます。

ただ、これは **Heroku Scheduler** で解決できます。

Heroku Scheduler とは、指定したコマンドの定期実行を可能にする機能です。
Linuxのcronのようなものですね。

Heroku Scheduler でアプリのURLに対して**curlコマンド**を実行することで
アプリを落とすことなく稼働し続けることが出来ます。

 ▷ Heroku Scheduler の設定方法は[こちらの記事](https://qiita.com/Taro_man/items/2eab3e3acad88c5b759e)にまとめました。


# サーバーへのデプロイ方法
※ 当記事はDjangoプロジェクトのデプロイを前提にしています。
※ Railsプロジェクトの場合、Gemfile修正などの手順が必要になりますが、実行するHerokuコマンドは同じです。

### 1. 必要なライブラリのインストール
プロジェクトがHeroku上で稼働するために必要なライブラリをインストールします。

```
pip install gunicorn django-heroku
```


### 2. 実行環境ファイルの追加
プロジェクトの実行環境をHerokuに伝えるファイルを**プロジェクトディレクトリ直下**に作成します。

### runtime.txt

Pythonバージョンを記載するファイルです。

```text:runtime.txt
python-3.6.6
``` 

### Procfile

Herokuプロセスの起動コマンドを記載するファイルです。
`<your-project-name>`は自身のプロジェクト名に読み替えて下さい。

```text:Procfile
web: gunicorn <your-project-name>.wsgi --log-file -
```

### requirements.txt
依存パッケージのリストを記載します。
`pip freeze`コマンドの出力結果をそのままファイルにしましょう。

```shell:コマンドライン
pip freeze > requirements.txt
```


### 3. プロジェクトの設定ファイルの修正
`settings.py`の`DEBUG = Ture`の部分を本番運用向けに変更します。

```python:your-project/settings.py
DEBUG = False
```


### 4. Gitでコミット
Gitでローカルリポジトリの作成 & コミットを行います。

```shell:
git init                                
git config user.name "Your Name"        
git config user.email you@example.com   
git add .                            
git commit -m "first commit"     
```


### 5. Herokuコマンドでデプロイ
HerokuコマンドでHerokuにデプロイします。
`heroku login`コマンド実行時にブラウザが立ち上がり、Herokuの認証を求められます。
ログインした後、**ブラウザを落とさずに**ターミナルに戻ると後続の作業が行えます。

```shell:
heroku login
heroku create <your-app-name>
git push heroku master
heroku ps:scale web=1
heroku run python manage.py migrate
```

# さいごに
一人でも多くのエンジニアが自身のプロダクトを世界に公開出来ることを願っております。
言語処理100本ノック-32(pandas使用):動詞の原形

[言語処理100本ノック 2015](http://www.cl.ecei.tohoku.ac.jp/nlp100/)[「第4章: 形態素解析」](http://www.cl.ecei.tohoku.ac.jp/nlp100/#ch4)の[32本目「動詞の原形」](http://www.cl.ecei.tohoku.ac.jp/nlp100/#sec32)記録です。
今回も前回に引き続き、pandas使っているので１文で処理でき、拍子抜けするほど簡単です。独立した記事にするまでもないような・・・

# 参考リンク

|リンク|備考|
|:--|:--|
|[032.動詞の原形.ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/04.%E5%BD%A2%E6%85%8B%E7%B4%A0%E8%A7%A3%E6%9E%90/032.%E5%8B%95%E8%A9%9E%E3%81%AE%E5%8E%9F%E5%BD%A2.ipynb)|回答プログラムのGitHubリンク|
|[素人の言語処理100本ノック:32](http://qiita.com/segavvy/items/64920712cc4b12e8ce51)|多くのソース部分のコピペ元|
|[MeCab公式](https://taku910.github.io/mecab/)|最初に見ておくMeCabのページ|

# 環境

|種類|バージョン|内容|
|:--|:--|:--|
|OS|Ubuntu18.04.01 LTS|仮想で動かしています|
|pyenv|1.2.16|複数Python環境を使うことがあるのでpyenv使っています|
|Python|3.8.1|pyenv上でpython3.8.1を使っています<br>パッケージはvenvを使って管理しています|
|Mecab|0.996-5|apt-getでインストール|

上記環境で、以下のPython追加パッケージを使っています。通常のpipでインストールするだけです。

|種類|バージョン|
|:--|:--|
|pandas|1.0.1|

# [第4章: 形態素解析](http://www.cl.ecei.tohoku.ac.jp/nlp100/#ch4)
## 学習内容
> 夏目漱石の小説『吾輩は猫である』に形態素解析器MeCabを適用し，小説中の単語の統計を求めます．
>> 形態素解析, MeCab, 品詞, 出現頻度, Zipfの法則, [matplotlib](http://matplotlib.org/), [Gnuplot](http://www.gnuplot.info/)

## ノック内容
> 夏目漱石の小説『吾輩は猫である』の文章（[neko.txt](http://www.cl.ecei.tohoku.ac.jp/nlp100/data/neko.txt)）をMeCabを使って形態素解析し，その結果をneko.txt.mecabというファイルに保存せよ．このファイルを用いて，以下の問に対応するプログラムを実装せよ．

なお，問題37, 38, 39は[matplotlib](http://matplotlib.org/)もしくは[Gnuplot](http://www.gnuplot.info/)を用いるとよい．

### [32. 動詞の原形](http://www.cl.ecei.tohoku.ac.jp/nlp100/#sec32)
> 動詞の原形をすべて抽出せよ．

# 回答
## 回答プログラム [032.動詞の原形.ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/04.%E5%BD%A2%E6%85%8B%E7%B4%A0%E8%A7%A3%E6%9E%90/032.%E5%8B%95%E8%A9%9E%E3%81%AE%E5%8E%9F%E5%BD%A2.ipynb)

```python
import pandas as pd

def read_text():
    # 0:表層形(surface)
    # 1:品詞(pos)
    # 2:品詞細分類1(pos1)
    # 7:基本形(base)
    df = pd.read_table('./neko.txt.mecab', sep='\t|,', header=None, 
                       usecols=[0, 1, 2, 7], names=['surface', 'pos', 'pos1', 'base'], 
                       skiprows=4, skipfooter=1 ,engine='python')
    return df[(df['pos'] != '空白') & (df['surface'] != 'EOS') & (df['pos'] != '記号')]

df = read_text()
df[df['pos'] == '動詞']['base']
```

## 回答解説
前回の「動詞の表層形」が「動詞の原形」に変わっただけです。pandasだと条件をちょっと書き換えるだけ。

```python:
df[df['pos'] == '動詞']['base']
```

### 出力結果(実行結果)
プログラム実行すると以下の結果が出力されます。

```bash:出力結果
13        生れる
19         つく
31         泣く
37         する
39         いる
         ... 
212527     死ぬ
212532     得る
212537     死ぬ
212540     得る
212541    られる
Name: base, Length: 28119, dtype: object
```
メソッドのオーバーライドとsuper

```py
class Car(object):
    def __init__(self,model=None):
        self.model=model

    def run(self):
        print('run')


class ToyotaCar(Car):
    def __init__(self, model,enable_auto_run = False):
        #self.model = modelとも書けるが、superを使って親メソッドを読み出せる
        super().__init__(model)
        self.enable_auto_run = enable_auto_run

    #メソッドのオーバーライド
    def run(self):
        print('fast run')


car = Car()
car.run()

toyotar_car = ToyotaCar('Lexus')
toyotar_car.run()
print(toyotar_car.model)
```

```text:出力
run
fast fun
Lexus
```
初心者によるプログラミング学習ログ 245日目

#100日チャレンジの245日目

twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。

すでに100日超えましたが、継続。

100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。

245日目は、

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>245日目<br>・youtubeで、webサイト模写<br>・udemyで、javascript講座<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1230583545380233216?ref_src=twsrc%5Etfw">February 20, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
Macでシリアルコンソールを使う

# 例えばYAMAHAのルータにつなぐとき

ケーブル：RJ45 CRケーブルとUSBシリアルケーブルをくっつけたやつ

```
$ ls -l /dev/tty.*
crw-rw-rw-  1 root  wheel   18,   4  2 17 00:47 /dev/tty.Bluetooth-Incoming-Port
crw-rw-rw-  1 root  wheel   18,   2  2 17 00:47 /dev/tty.MALS
crw-rw-rw-  1 root  wheel   18,   0  2 17 00:47 /dev/tty.SOC
crw-rw-rw-  1 root  wheel   18,  10  2 21 01:04 /dev/tty.usbserial〜
```

```
$ sudo cu -l /dev/tty.usbserial〜
Password:
Connected.

Password: 

RTX1210 Rev.14.01.34 (Fri Jun  7 09:32:51 2019)
〜
```

# YAMAHAの場合は文字コードの変更も忘れずに

http://shomi3023.com/2017/11/23/post-1365/
コンストラクタとデストラクタ

```py
class Person(object):
    #コンストラクタ
    def __init__(self, name):
        self.name = name
        print(self.name)

    #メソッド
    def say_something(self):
        print('hello.{}'.format(self.name))
        self.run(10)
    def run(self, num):
        print('run' * 10)

    #デストラクタ
    def __del__(self):
        print('good bye')

person = Person('Mike')
person.say_something()
print('######')
#オブジェクトが使われなくなると自動的にデスクトラクタが呼び出されますが、下記のように明示的に呼び出すこともできます。
#del person
```

```
Mike
hello.Mike
runrunrunrunrunrunrunrunrunrun
######
good bye
```
ルートコミットを複数持つ git リポジトリの GitHub 上での見え方

（[自blogの記事](http://umezawa.dyndns.info/wordpress/?p=7448)の転載です）

ルートコミットを複数持つ git リポジトリを無理やり作ることができることは[（blogの方で）以前書きました](http://umezawa.dyndns.info/wordpress/?p=6940)。一方、GitHub には Network Graph としてリビジョン間のグラフを表示する機能があります。で、どう見えるか気になったので試してみました。

[結果](https://github.com/umezawatakeshi/multiple_root_commits/network)

![multiple_root_commits.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395443/20d7e1bf-f9a6-a0f8-bcc6-7fbab56261be.png)

まあそうだよね、という感じになりました。
Good Design Pages

感動したウェブページを羅列していく

- [https://tobiasahlin.com/](https://tobiasahlin.com/): デザイナーブログ記事のクオリティも高い
- [http://maxisam.github.io/](http://maxisam.github.io/): シンプルなアニメーションのブログ
- [https://www.reactionjs.io/](https://www.reactionjs.io/): ReactIONのランディングページ。参考にしたい
- [https://ics.media/](https://ics.media/): ダークモード対応、three.js利用など、フロント力が強い
- [https://www.lekoarts.de/](https://www.lekoarts.de/) この人の製作するgatsbyテンプレートがとても良い。
uniqコマンドで「指定したフィールドで重複をチェック」したい

## uniq とは

```uniq``` は、ある入力から行を読み込み、重複した行を取り除いて出力するコマンドです。 例えば以下のようなinput.txtがあったとします。

```bash
$ cat input.txt
aaa
aaa
bbb
```

こいつにuniqをかけると重複行(aaa)が取り除かれます。ただしあらかじめソートされている必要があります。

```bash
$ cat input.txt | uniq
aaa
bbb
```

## やりたいこと

このようなinput2.txtがあったとします。

```bash
$ cat input2.txt
tanaka taro
tanaka ichiro
sato taro
```

CSV的な感じですね。スペース区切りで氏名が載っているようです。今、```uniq```を使って名字が重複している行を取り除き、以下のような出力を得たいとします。

```bash
$ cat input2.txt | uniq --なんらかのオプション
tanaka taro
sato taro
```

また、下の名前でも重複をチェックしたり、もっと言うと項目がたくさんあるCSVファイルなどで指定したフィールドでの重複チェックができたら便利そうです。

## 指定したフィールドで重複チェックをするオプション

さて、これをやるにはどのようなオプションをつければいいのでしょうか。マニュアルを見てみます。<b>ありません。</b> 結構調べたけどやっぱりないっぽい。意外。

一応、「(最大で)指定した文字数までで重複チェック」なら -w。でもこれだと一つ目の項目でしかできないし、そもそも文字数にばらつきがあると使えません。

有志によるパッチが作成されているがおそらく本家にマージはされない模様。

http://lists.gnu.org/archive/html/coreutils/2013-02/msg00016.html
http://lists.gnu.org/archive/html/coreutils/2013-02/msg00019.html

sortの-kオプションと同じものを実装したいと2006年に書いてあるがどうなっていることやら… 

http://lists.gnu.org/archive/html/bug-coreutils/2006-06/msg00211.html

## どうすればいいのか

ワークアラウンドとしては、```awk``` でできます。この場合、重複行のうち残したいものが一番上にくるようにソートしたのちに以下。

```bash
awk '!colname[$1]++{print}'
```

input2.txtの例だとこうなります。

```bash
# 名字で重複削除
$ cat input2.txt | awk '!colname[$1]++{print}'
tanaka taro
sato taro

# 下の名前で重複削除
cat input2.txt | awk '!colname[$2]++{print}'
tanaka taro
tanaka ichiro
```

参考：
[awkで重複行を高速削除する。 - 忘れないようにメモっとく](http://akiniwa.hatenablog.jp/entry/2014/04/04/203256)
[linux - Is there a way to 'uniq' by column? - Stack Overflow](https://stackoverflow.com/questions/1915636/is-there-a-way-to-uniq-by-column)
[漏洞通告]CVE-2020-8840/jackson-databind JNDI注入导致远程代码执行

###  漏洞描述
近日,亚信安全网络攻防实验室跟踪到`jackson-databind`更新了jndi注入的黑名单类,并发布了新版本,版本号为`2.8.11.5`.如果在项目包中存在该类的jar包且JDK版本满足注入版本,则可以使用JNDI注入的方式导致远程代码执行

###漏洞编号
CVE-2020-8840
### 漏洞威胁等级
中危
###不受影响范围
2.8.11.5
### 漏洞验证
这里选用`2.10.1`这个较新的版本

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/b724b7ba-2bff-5886-3a15-98155034c110.png)

主要增加了`org.apache.xbean.propertyeditor.JndiConverter`这个类

说到`jackson-databind`,我们就会想起阿里巴巴开源的`fastjson`

随即使用这个类对`fastjson`进行JNDI注入尝试

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/074086e6-87be-2566-cb4c-161fb9d9e92f.png)

成功在开启autotype的情况下,bypass fastjson 1.2.62(最新版)
### 修复建议
- 1.更新到最新版本
- 2.使用高版本JDK

### 时间轴
[0] 2020/02/19 NVD发布安全通告
[1] 2020/02/21 亚信安全网络攻防实验室分析&复现该漏洞并发布漏洞通告

### Reference
https://nvd.nist.gov/vuln/detail/CVE-2020-8840
NW.jsでHTMLをWindowsデスクトップアプリにする

#NW.jsとは？

ざっくりとした理解としては、Chromiumエンジン使ってhtmlを表示するデスクトップアプリを作れるフレームワークです。

Electronとの違いなど、詳しい記事は、こちら
[NW.jsでデスクトップアプリの夢を見る！](https://qiita.com/Yanase-Takuma/items/b28b528a9c34ad21599e)

#１分でWindowsデスクトップアプリをつくる

いろいろ複雑なことやっている記事が多いですが、本当に簡単なので、１分でアプリ起動できます！

##手順
1. 公式サイト（ https://nwjs.io/ ）から、左側の「NORMAL」をダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24420/e48497be-f9b0-624e-d478-75c13d634c94.png)

2. zip展開し、src というフォルダを作成。そこに起動するHTMLファイル一式を格納します。
3. package.json を作成して同フォルダに入れます。最低限の設定は以下。

```json:package.json
{
  "name":"test.application",
  "version":"1.0.0",
  "main":"src/index.html"
}
```

4.nw.exeを実行！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24420/6fa04c0d-b0ba-6d5d-5ba2-fb25749498f3.png)


以上。超簡単です。

#NW.js Tips

##package.json

###ウインドウの最低サイズとアイコンの指定

```json:package.json
{
  "name":"test.application",
  "version":"1.0.0",
  "main":"src/index.html"
  "window":{
    "min_width":1200,
    "min_height":760,
    "icon":"assets/icon32.png"
  }
}
```

##JavaScript

いろいろな情報の寄せ集めですが、動いたコードを紹介。

###exeをキックする

```javascript
	var spawn = require('child_process').spawn,
	child    = spawn('C:\\windows\\notepad.exe', ["C:/Windows/System32/Drivers/etc/hosts"]);

	child.stdout.on('data', function (data) {
		console.log('stdout: ' + data);
	});

	child.stderr.on('data', function (data) {
		console.log('stderr: ' + data);
	});

	child.on('close', function (code) {
		console.log('child process exited with code ' + code);
	});
```

###エクスプローラーでフォルダーを開く
```javascript
	require('child_process').exec('start "" "c:\\windows"');
```

###htmlと同フォルダーにあるファイルを関連付けられたアプリケーションで開く
```javascript
	var path = require('path');
	var startDir = path.dirname(process.execPath);

	var gui = window.require( 'nw.gui' );
	gui.Shell.openItem( startDir+'\\src\\test.pdf' );
```

###標準のブラウザでURLを開く
```javascript
	var gui = window.require( 'nw.gui' );
	gui.Shell.openExternal( 'https://google.com/' );
```
Windows→linux データ持ち込みの勘所

# はじめに

一般人がWindowsマシン上でエクセルやらワードやらで作ったファイルをもらって、linux上で情報処理を行うシチュエーションは少なからずあるだろう。その際に必要となるであろうデータ変換手順の基本的なところをまとめてみた。

## 日本語名ファイルをwindowsからlinuxに持ってくる

ここで日本語名ファイルとは、いわゆる全角文字がファイル名に使われているファイルのことである。

### windows環境下で作ったzipファイルをLinux環境下で展開

```
unzip -O cp932 日本語名ファイルを含むアーカイブ.zip
```

cp932とは、シフトJISにmicrosoftによって拡張が施された文字コード規格である。


参考:
[本当は怖くないCP932](https://qiita.com/kasei-san/items/cfb993786153231e5413)

### シフトJISで書かれたファイル名をUTF-8に変換

```
convmv -f cp932 -t utf-8 * --notest
```

ubuntuの場合`convmv`コマンドはデフォルトでは導入されていないので、事前に`apt install convmv`しておく必要がある。

日本語名のファイルがzipからlinux上で「標準的な」手順で展開されてしまうと、不適切に文字化けした状態でUTF-8化されてしまうようで、そのあとでconvmvしようとしても「処理済み」と素気無く断られてしまう。あきらめて元zipファイルから上記手順で展開をやり直すしかない。

# 文字コードと改行を変換する（シフトjis→UTF-8およびCRLF→LF）

シフトjisのテキストをUTF-8に変換し、さらに改行コードをwindowsの標準であるCR/LFからLFに変換し、結果を新しいファイルに書き出す。

```
iconv -f cp932 -t utf-8 対象ファイル名 | sed 's/\r//g' > 出力先ファイル名
```

カレントディレクトリ中の全ファイルを一度に処理する方法も考えてみた。変換後の内容はサブディレクトリ`utf8`に同名のファイルを作って書き出すことにしよう。bashのループ処理を利用する。

```
#!/bin/bash
[ -d utf8 ] || mkdir utf8
for a in *
  do iconv -f cp932 -t utf-8 $a | sed 's/\r//g' > utf8/$a
done  
```
[漏洞通告]CVE-2020-1938/Apache Tomcat 文件读取/文件包含漏洞

### 漏洞描述
Apache Tomcat是由Apache软件基金会属下Jakarta项目开发的Servlet容器.默认情况下,Apache Tomcat会开启AJP连接器,方便与其他Web服务器通过AJP协议进行交互.但Apache Tomcat在AJP协议的实现上存在漏洞,导致攻击者可以通过发送恶意的AJP请求,可以读取或者包含Web应用根目录下的任意文件,如果配合文件上传任意格式文件，将可能导致任意代码执行(RCE).该漏洞利用AJP服务端口实现攻击,未开启AJP服务对外不受漏洞影响（tomcat默认将AJP服务开启并绑定至0.0.0.0/0）.
###漏洞编号
CVE-2020-1938
CNVD-2020-10487
### 漏洞威胁等级
高危
### 影响范围
Apache Tomcat =  6
7 <= Apache Tomcat < 7.0.100
8 <= Apache Tomcat < 8.5.51
9 <= Apache Tomcat < 9.0.31
### 漏洞验证
文件读取验证

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/4789721d-cd8c-8098-1451-8eef409ebcca.png)

文件包含导致RCE验证

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/f213a9e5-834d-6a7a-cc96-17e3b122e08c.png)
### 修复建议
- 1.尽快更新Tomcat到安全版本
- 2.如果不能升级,请关闭 AJP 服务：
打开 Tomcat 配置文件 `Service.xml`,注释掉如下行：

```
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
```

### 时间轴
[0] 2020/01/03 长亭科技向Apache Tomcat官方提交漏洞
[1] 2020/02/11  Apache Tomcat 官方发布9.0.31、8.5.51 安全更新版本，修复漏洞
[2] 2020/02/14  Apache Tomcat 官方发布7.0.100安全更新版本，修复漏洞
[3] 2020/02/20 CNVD发布安全通告
[4] 2020/02/21 亚信安全网络攻防实验室分析&复现该漏洞并发布漏洞通告
### Reference
https://github.com/threedr3am/learnjavabug
https://www.cnvd.org.cn/flaw/show/CNVD-2020-10487
https://mp.weixin.qq.com/s/GzqLkwlIQi_i3AVIXn59FQ
メソッド終了時に「FIN メソッド名」と表示するデコレータ

```python:python
def print_fin(func):
    def wrapper(*args, **kwargs):
        output = func(*args, **kwargs)
        print(f'FIN {func.__name__}')
        return output
    return wrapper
```

使い方：

```python:python
@print_fin
def greet():
    print('Hello!')

greet()
```

```:結果
Hello!
FIN greet
```

---

参考：[Pythonのデコレータについて - Qiita](https://qiita.com/mtb_beta/items/d257519b018b8cd0cc2e#%E3%81%A4%E3%81%BE%E3%82%8A%E3%83%87%E3%82%B3%E3%83%AC%E3%83%BC%E3%82%BF%E3%81%A7%E4%BD%95%E3%81%8C%E3%81%A7%E3%81%8D%E3%82%8B%E3%81%AE%E3%81%8B)
Androidアプリ開発時にWiFi接続で無線デバッグ

Androidアプリの開発をしていると、実機確認する際にPCとAndroid端末が繋がっているのって邪魔じゃないですか？
私は邪魔でした！無線化しましょう！
環境はmac想定です。

# まずはadbを使えるように

Android端末をコマンドラインで操作するために、[Android Debug Bridge（adb）](https://developer.android.com/studio/command-line/adb)を使います。
Android Studioを入れている場合はすでにadbが入っていると思うので、まずはパスを通します。

bash_profileを編集しましょう。

```sh
vi ~/.bash_profile
```
パスを追加します。

```sh
# 下記を追加
export PATH=$PATH:/Users/[ユーザー名]/Library/Android/sdk/platform-tools
```

source の再読込を行い適用。

```sh
source ~/.bash_profile
```
これでオッケー！
パスが追加されているかは下記コマンドで確認できます。

```sh
echo $PATH
```

# Android端末を接続

Android端末とPCを同じWi-Fi環境に置いてください。

事前にAndroid端末のIPアドレスを確認しておきます。
[設定] -> [システム] -> [端末情報] -> [機器の状態] -> [IPアドレス] などで確認できます。

Android端末とPCをケーブルで接続した状態で、下記を実行します。

```sh
adb tcpip 5555
adb connect xxx.xxx.xxx.xxx #ここにIPアドレス
```

これでケーブルを抜いても、デバッグできるようになります！
便利。

接続を解除する場合は下記を実行。

```sh
adb disconnect
```

# せっかくなのでスクリプトも作るか

接続をひとつのコマンドで出来るようにしましょう。
てきとーにスクリプト入れる用のディレクトリを作ってパスを通しておきます。

```sh
mkdir /User/[ユーザー名]/scripts
```
パスを追加

```sh
# 下記を追加
export PATH=$PATH:/Users/[ユーザー名]/scripts
```

source の再読込

```sh
source ~/.bash_profile
```

次にスクリプトを書くファイルを作成します。
ここで作成したファイル名が実行するコマンドになります。
ファイル名は `adb connect` の略で `adbc` としましたが、好きに決めてもらって大丈夫です。

```sh
touch /User/[ユーザー名]/scripts/adbc
vi /User/[ユーザー名]/scripts/adbc
```

作成した `adbc` ファイルの内容は下記のようにします。

```sh
#!/bin/sh

set -e

# サーバー再起動
adb kill-server
adb start-server

# android端末に接続
adb tcpip 5555
adb connect xxx.xxx.xxx.xxx #IPアドレスを指定
```

行頭に `#!/bin/sh` を付ける必要があるため注意してください。
また、スクリプトを実行可能にするため、ファイルの権限編集を行います。

```sh
chmod u+x /User/[ユーザー名]/scripts/adbc
```

ここまでで完了です！
Android端末をPCにつないで、ターミナルで下記を実行すれば接続されます！

```sh
adbc
```

ちなみに、IPアドレスを動的に指定したい場合は、スクリプトを下記のように修正します。

```sh
#!/bin/sh

set -eu

IP="$1"

# サーバー再起動
adb kill-server
adb start-server

# android端末に接続
adb tcpip 5555
adb connect $IP
```

これで実行時にIPアドレスを渡せるようになります。

```sh
adbc xxx.xxx.xxx.xxx #IPアドレスを指定
```
これでどこでも無線デバッグ！
AGC022-C Remainder Game 解説

[AGC022-C Remainder game](https://atcoder.jp/contests/agc022/tasks/agc022_c)の解説です。

# 問題概要
数列 $a$ に次の操作が行える。

- 正の整数 $k$ を選び、$a$ の任意の数の要素を $k$ で割ったあまりに変更する。このとき、コスト $2^k$ がかかる。

$a$ に操作を繰り返して $b$ にできるか。また、できるときコストの総和の最小値はいくらか。

# 考察
要素ごとに考えると、$x<=y$ を満たすとき、$x$ で操作を行った後に $y$ で操作を行っても意味がありません。
そこで、要素ごとには、選ぶ $k$ は降順であると分かります。
また、すべての要素でこれが成り立つため、全体的にも、 $k$ は降順に選んでいくことになります。
同じ $k$ を2度選ぶことが無駄なのも分かるので、これで問題が少し単純化できました。
次はコストの最小化を考えます。
ここで、$\sum_{i=1}^{n-1} 2^i<2^n$ が成り立つことを踏まえると、$n$ 以下の整数で操作が実現できれば、$n+1$ 以上は決して選ぶ必要がないと分かります。
逆に、$n$ 以下で操作が実現できなければ、次は $n+1$ で試すべきです。
こうして昇順に選ぶ数を決めてゆくと、選ぶべき最大の整数が求まります。
同様に、選ぶべき2番目に大きい整数、3番目、というように選ぶべき整数を決めていくことができ、これでコストが最小化できます。
適当に実装してもざっくり $O(max(a)^3n)$ とかになります。

# 実装
[提出リンク](https://atcoder.jp/contests/agc022/submissions/10232622)

# おわりに
700点にしてはかなり簡単めです。ぜひ解きましょう。
naive -> aware

* 夏時間とか考慮しなくて良いならdatetimeだけでいけるのは良い
* **str -> naive -> aware(UTC)** にしてからあつかう
* `datetime.replace` の `tzinfo` とか `datetime` の `tzinfo` には `pytz.timezone("Asia/Tokyo")` を食わせてはいけない

まず `import` ，UTC/JSTの定義，日付文字列の用意

```python

    from datetime import datetime, timedelta, timezone

    UTC = timezone.utc
    JST = timezone(timedelta(hours=+9), "JST")
    val = "2020/02/15T13:59:27Z"
```

string -> naive
================================================================

```python

    # 末尾のtimezone情報削るかただの文字列として扱う．strptimeに%zとか%Zとか渡さない
    naive = datetime.strptime(val, "%Y/%m/%dT%H:%M:%SZ")
```

naive -> aware
================================================================

```python

    aware_utc = naive.replace(tzinfo=UTC)
```

aware -> naive
================================================================

```python

    naive = aware_utc.replace(tzinfo=None)
```

違うtimezoneでの時間にする
================================================================

```python

    aware_jst = aware_utc.astimezone(JST)
```

違うtimezoneに書き換える
================================================================

```python

    aware_jst = aware_utc.replace(tzinfo=JST)
```

これらをダラダラと書きなぐったのが[これ](https://g.b13t.net/2020/022101)
Rails5 テキストを一発でコピーできるボタンを実装する

# 目的

- テキストを一発でコピーできるボタンの実装方法をまとめる

# 作業をする前に

- 今回の作業方法は公式のGithubのREADMEに沿って説明する。
- [clipboard-rails](https://github.com/sadiqmmm/clipboard-rails)

# 実施方法

1. Gem`zeroclipboard-rails`をインストール
    1. Gemfileに下記を追記する。

        ```
        gem 'jquery-rails'
        gem 'clipboard-rails'
        ```

    1. 下記コマンドを実行してGemfileを元にGemをインストールする。

        ```terminal
        $ bundle update
        ```

1. 設定ファイル記載
    1. 下記に存在するファイルをエディタで開く。
        - `アプリ名/app/assets/javascripts`
            - /application.js
    1. 下記の内容を`application.js`に追記する。

        ```javascript
        //= require jquery
        //= require jquery_ujs
        //= require clipboard

        $(document).ready(function(){  
  
        var clipboard = new Clipboard('.clipboard-btn');
        console.log(clipboard);
      
        });
        ```

    1. 下記に存在するファイルをエディタで開く。
        - `アプリ名/app/views/layouts`
            - application.html.erb
    1. `<head>`の一番最初に下記を追記する。

        ```html
        <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
        ```

1. ボタンを実装
    1. 任意のビューファイルに下記の記載を行う。

        ```html
        <div>
          <!-- Target -->
          <textarea id="bar" name="" rows="7" cols="100">
          <p>コピーターゲット</p>
          </textarea>
          <!-- Trigger -->
          <button class="clipboard-btn" data-clipboard-action="copy" data-clipboard-target="#bar">
              Copy to clipboard
          </button>
        </div>
        ```
ツイートでリマインダー登録 #PowerAutomate

何を言っているのかと思われるかもしれませんが、**メモ帳とかリマインダーに登録するよりツイッターでつぶやくほうが生活に馴染んでいるんです！**
ということで、Twitterでツイートしたら、リマインダーに登録し、帰宅時にプッシュ通知を送ってくれるFlowを作ってみました！


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/476ace11-1215-3332-ce3a-2bd75d45eb21.png)
こういうツイートをしたら、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/ccdfdbb3-3285-d804-1d57-8801a0acfaa4.png)
メモの内容がリストに記録され、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/fa7c6b1e-2217-cff8-b54e-c2e553a359e8.png)
帰宅時にこんな感じでリマインダーが届きます。

# Flowの中身
この仕組みは2つ (+リスト掃除用に1つ) のFlowで構成されています。
1. 自分の新しいツイートに反応して、リストに登録するFlow
2. 場所/時間をトリガーにして、リストからリマインダーの内容を取得して通知するFlow
です。
どちらもそれほど難しくない(スマホで作れました)ので、ご紹介します。

## リマインダーに登録するFlow
リマインダー登録のFlowは以下のようなものです。
Twitterコネクターのトリガーで、*from:@ XXXXX*で自分のアカウントを指定しておきます。
全部のツイートを登録したいわけではないので、抽出するための条件として、何らかの文字列を設定しておきましょう。(ここでは"メモ登録")
文字列に反応して、あとはリストに登録するだけで完了です。
ここではSharePointリストにしていますが、Excelファイルのテーブルでもよいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/979bc6d1-c54b-f91f-7c1d-de34cb2d7817.png)

## リマインダーを送るFlow
リマインダーを送るほうもとてもシンプルです。
ここでは場所は見せられませんが、会社の付近を場所に登録してあります。
出社前に登録することもあるでしょうが、それでリマインダー送られても別に困らないので、特定の区画への出入り、どちらでも発火するようになっています。

会社の付近を出入りすると、まずはリストからアイテムを全取得します。(特別にフィルターを入れたくなかったので、夜間に全アイテムを削除するようにしています)
アイテムが1件以上登録されていれば、その中のメモ部分(ツイートの本文)を文字列結合して、あとはPush通知するだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/3ae893fb-fd56-5503-6a52-56f3fa605699.png)

# まとめ
すごく簡単なFlowの組み合わせですが、ツイッターに常駐している方にはとても役立つんじゃないかと思います。
もちろん、書くだけで少し記憶にとどまりますが、そこから自動的にTodo登録してくれたら便利ですよね。

ぜひご活用ください！

## 謝辞
このアイデアは友人の[目代さん](https://twitter.com/mokudai)のツイートをきっかけにしています。ありがとうございました！
superって一体なんなんだ？？(Ruby on Rails)

# superとは
 ***子クラスのインスタンスに対して、同名の親クラスのメソッドをそのまま呼び出すことが出来る***
...と言われても、何だか分かりにくいので簡単なコードを書いてみました。

# 親クラスは`Hoge`

```ruby

class Hoge  
  def hogetyan
    "ほげちゃん"
  end
end
```

# `Hoge` を継承している子クラスは`Piyo`と`Moke`
```ruby

class Piyo < Hoge
  def hogetyan
    "ピヨピヨ"
  end
end

class Moke < Hoge
  def hogetyan
    super
  end
end
```

# `Piyo` に対して`hogetyan`を呼び出してみる
```ruby
piyo = Piyo.new
piyo.hogetyan -> #ピヨピヨ
```
-  親クラスの`def hogetyan`はオーバーライドされてされている。

# `Moke` に対して`hogetyan`を呼び出してみる
```ruby
moke = Moke.new
moke.hogetyan -> #ほげちゃん
```
- Mokeクラスのmokeというインスタンスに対してsuper(親クラス`Hoge`の`hogetyan`)が実行される。
初めてのLinearRegressionモデル作成

モデル作成から数値予測までの過程の概要をざっとつかみたい！
#回帰分析とは？
**説明したい量**（目的変数）を**他の量**（説明変数）を用いて表現すること
その際の方程式が必ずしも直線にはならないので、**回帰分析**と呼ぶ！(直線の場合は、**線形回帰**)

#ピザの直径25cmの時、ピザの値段は？
環境：Google Colaboratory

```python
x=[[12],[16],[20],[28],[36]] #ピザの直径
y = [[700],[900],[1300],[1750],[1800]] #ピザの値段
```

```python
from sklearn.linear_model import LinearRegression
model = LinearRegression()#1.モデルの指定
model.fit(x,y)#2.学習
```

```python
import numpy as np
#n×1ベクトルに変換する必要があるらしい...
#その時、reshape()の中身を-1とすると、自動的にnumpyが判断してくれるらしい（便利だ）
price = model.predict(np.array([25]).reshape(-1, 1)) # 3.予測（25㎝を代入）
print('25 cm pizza should cost: $%s'%price[0][0])
```
```出力.
25 cm pizza should cost: $1416.9181034482758
```

#この出力結果の精度がどれだけ正確か知りたい！

```python
# テストデータを作成
x_test = [[16],[18],[22],[32],[24]]
y_test = [[1100],[850],[1500],[1800],[1100]]

score = model.score(x_test, y_test)
print("r-squared:",score)
```

```出力.
r-squared: 0.6620052929422553
```

#結果
モデルの精度は**0.662**と出たが、初めてにしては満足のいく結果となった。
次回は、精度をあげるために単回帰ではなく説明変数を増やして**重回帰**によって回帰分析していきたい！
huskyを使ってgit hookを楽に扱う

## 前提

* Node.js限定です
* prettier, eslintは導入済みとする
* ~~gitコマンドを使わないと走らないので注意~~  
SorceTreeでcommitしたら動きました

## やること

pre-commitで`prettier --write`,`eslint --fix`,`jest`を走らせる。  

## 方法

huskyを入れてpackage.jsonにちょろっと書いて終わり。便利。

### huskyとlint-stagedをインストール

```sh
~$ npm i -D husky lint-staged
```

### package.json編集

nameやversionと同階層に以下を追加。対象コードが格納されてるディレクトリは環境に合わせて修正。

```json
"husky": {
  "hooks": {
    "pre-commit": "lint-staged; jest"
  }
},
"lint-staged": {
  "*.{js,jsx}": [
    "prettier --write './src/**/*.js'",
    "prettier --write './__tests__/**/*.js'",
    "eslint --fix './src/**/*.js'",
    "eslint --fix './__tests__/**/*.js'"
  ]
}
```

## おわり

後は適当に編集して`git add -A`して`git commit`すればlint-stagedに書いた内容が実行されてからjestが実行されます。
sh書かなくても良いのは楽ですね。ReactやVue.js環境でももちろん動きます。
VSCode環境ならprettierもeslintもAutoSaveで走らせればあまり必要はない気もしますが。
Node.jsでSQLServerにWindows認証で接続する（msnodesqlv8）

#Node.jsでSQLServerにWindows認証で接続する
Node.jsでSQLServerに接続するパッケージとしてmssqlがありますが
何故かSQLServer認証で接続できないことがあります…
（私はPC変えて同じように設定したつもりが接続できず…備忘のため）

その場合には[msnodesqlv8](https://www.npmjs.com/package/msnodesqlv8)を使うとWindows認証で接続できます。

```
SQLServer認証を行う場合の接続情報
{
    "user": "(ユーザー名)",
    "password": "(パスワード)",
    "server": "localhost(またはサーバー名)",
    "database":"(DB名)",
    "options": {
        "encrypt": true
    }
}
```

```
Windows認証する場合の接続情報
{
    "server": "(サーバー名)",
    "database":"(DB名)",
    "options": {
        "trustedConnection": true
    }
}
```

あとはmsnodesqlv8のサンプルでは
const sql = require("msnodesqlv8");
となっていますが、それで接続ができなかった場合、
const sql  = require('mssql/msnodesqlv8');
とすれば接続できます。
DB設計

DB設計をしマークダウン記法でREADME記述した。
GitHubでマスターブランチにPushしてしまいその修正で時間がかかってしまった。
他にも中間テーブルの記述の抜け、複数形にしていなかったりした。
user_group → users_groups
has_many :users_groupsがuserテーブル、groupテーブルになかった。
GitHubの使い方は何回も使い、慣れていくしかないかな。

# chat-space DB設計
## userテーブル
|Column|Type|Options|
|------|----|-------|
|name|string|null: false|
|emall|string|null: false|
### Association
- has_many :groups, though: :users_groups
- has_many :users_groups
- has_many :messaages

## groupテーブル
|Column|Type|Options|
|------|----|-------|
|name|string|null: false|
### Association
- has_many :users, though: :users_groups
- has_many :users_groups
- has_many :messages

## messagesテーブル
|Column|Type|Options|
|------|----|-------|
|body|string||
|image|string||
|user_id|integer|null: false, foreign_key: true|
|group_id|integer|null: false, foreign_key: true|
### Association
- belongs_to :user
- belongs_to :group

## users_groupsテーブル
|Column|Type|Options|
|------|----|-------|
|user_id|integer|null: false, foreign_key: true|
|group_id|integer|null: false, foreign_key: true|
### Association
- belongs_to :user
- belongs_to :group
【Kotlin-CodeLabs】1/7 〜 Kotlinとは 〜


2019年にGoogleから，Web上でKotlinを学べるコースが提供されました．([Kotlin-BootCamp](https://developer.android.com/courses/kotlin-bootcamp/overview/))
この記事では，そのコースを実際にやってみてアウトプットしてみるといった内容です．
何かツッコミなどあれば編集リクエストかコメントかTwitterでいただければ修正いたします:pray:



#今回学ぶこと
・Kotlinコードの基本的な構文

#知っておくべきこと
・JavaやC＃などの、オブジェクト指向で静的に型付けされたプログラミング言語の基本
・クラス、メソッド、および例外処理を使用してプログラミングする方法
・IntelliJ IDEA、Android Studio、Eclipse、またはVisual StudioなどのIDEを使用する

#ステップ
###1.  Kotlinのメリット
Kotlinには次のようなメリットがあります．

・強いコード
Kotlinはnullableデータ型とnon-nullableデータ型を区別します．(NullPointerExceptionを回避)
これによりコンパイル時により多くのエラーをキャッチできます．

・簡潔で読みやすいコード
例えばゲッターやセッターなどの定型コードをなくすように設計されています．

・成熟したプラットフォーム
2017年からKotlinはAndroidアプリのビルド用に公式にサポートされた言語

・Javaと相互運用が可能
KotlinはJVM言語なので，お気に入りのJavaライブラリを引き続き使用できます．

###2. HelloWorldを実行

KotlinでのHelloWorldはこのようになります．

```
fun main(args: Array<String>) {
    
    printHello()
    
    fun printHello() {
        println ("Hello World")
    }
}
```


#まとめ
・Kotlinは長年使われてきたJava言語と相互運用できる
・Kotlinはコードが冗長でない


#クイズ
>1問目
次のうち，Kotlin言語を使用するメリットがないのはどれですか？

null許容データ型と非null許容データ型を区別する
Androidアプリを構築するためにサポートされている言語
少ないバグで少ないコードを記述できるように設計されている
Kotlinで高速にコンパイルされる

>2問目
次のうち，KotlinとJavaコードについて当てはまらないものはどれですか？

KotlinコードとJavaコードは並行して実行できる
既存のJavaプログラムにKotlinコードを追加できる
既存のJavaコードをKotlinに移行できる
KotlinコードはJavaコードよりも高速に実行される


###クイズの正解

1問目    Kotlinで高速にコンパイルされる
2問目    既存のJavaコードをKotlinに移行できる


#参考資料
###CodeLabs by Google
https://codelabs.developers.google.com/codelabs/kotlin-bootcamp-introduction/#0
![スクリーンショット 2020-02-05 4.07.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249786/3ad2d3c9-d57f-1b4b-85cf-1c92a57b464b.png)
javascript(node.js)のrequest.on()を解説

reqest.on(イベント名, 関数);

#dataイベント

→　dataイベント
クライアントからデータを受け取ると発生するイベントです。

```javascript
var body = '';

request.on('data',(data) => {
    body +=data;
}
```

この引数のdataは、送られてきたデータの事です。

#endイベント

→ endイベント
データの受け取りが完了すると発生するイベントです。

endイベントは、全てデータを受け取った後なので、引数は指定しません。
言語処理100本ノック 00~09 解答

#

## 00
```python:00.py
s = "stressed"
print(s[::-1])
````
実行結果

```
desserts
```

## 01
```python:01.py
s = "パタトクカシーー"
print(s[::2])
````
実行結果

```
パトカー
```

## 02
```python:02.py
ret = ''
s1 = 'パトカー'
s2 = 'タクシー'
s = ''.join([a + b for a, b in zip(s1, s2)])
print(s)
````
実行結果

```
パタトクカシーー
```

## 03
```python:03.py
s = "Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."
s = s.replace(',','')
s = s.replace('.', '')
l = s.split()
ret = [len(s) for s in l]
print(ret)
````
実行結果

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

## 04
```python:04.py
s = "Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."
i = 1
n = (0, 4, 5, 6, 7, 8, 14, 15, 18) 
d = {i: word[0:1] if i in n else word[0:2] for i, word in enumerate(s.split())}
print(d)
````
実行結果

```
{0: 'H',
 1: 'He',
 2: 'Li',
 3: 'Be',
 4: 'B',
 5: 'C',
 6: 'N',
 7: 'O',
 8: 'F',
 9: 'Ne',
 10: 'Na',
 11: 'Mi',
 12: 'Al',
 13: 'Si',
 14: 'P',
 15: 'S',
 16: 'Cl',
 17: 'Ar',
 18: 'K',
 19: 'Ca'}

```

## 05
```python:05.py
def ngram(s, n):
    return [s[i:i+n] for i, _ in enumerate(list(s))]

print(ngram("I am an NLPer", 2))

````
実行結果

```
['I ', ' a', 'am', 'm ', ' a', 'an', 'n ', ' N', 'NL', 'LP', 'Pe', 'er', 'r']
```

## 06
```python:06.py
def ngram(s, n):
    return {s[i:i+n] for i, _ in enumerate(list(s))}

s1 = "paraparaparadise"
s2 = "paragraph"
X = ngram(s1, 2)
Y = ngram(s2, 2)
print("X | Y :", X | Y)
print("X & Y :", X & Y)
print("X - Y :", X - Y)
print("se" in X)
print("se" in Y)

````
実行結果

```
X | Y : {'ra', 'h', 'gr', 'pa', 'ph', 'ap', 'ar', 'ad', 'di', 'is', 'se', 'ag', 'e'}
X & Y : {'pa', 'ap', 'ra', 'ar'}
X - Y : {'ad', 'di', 'se', 'is', 'e'}
True
False

```

## 07
```python:07.py
def template(x, y, z):
    return str(x) + "時の" + y + "は" + str(z)

print(template(x=12, y="気温", z=22.4))
````
実行結果

```
'12時の気温は22.4'
```

## 08
```python:08.py
def cipher(s):
    return ''.join([chr(219-ord(s1)) if s1.islower() else s1 for s1 in s])

s = "Are you sure?"
s_encrypted = cipher(s)
print(s_encrypted)
````
実行結果

```
Aiv blf hfiv?
```

## 09
```python:09.py
import random

def typoglycemia(s):
    return ' '.join([s1 if len(s1)<=4 else shuffle_string(s1) for s1 in s.split()])

def shuffle_string(s):
    return s[0] + ''.join(random.sample(s[1:-1], len(s[1:-1])))+ s[-1]

s = "I couldn't believe that I could actually understand what I was reading : the phenomenal power of the human mind ."

print(typoglycemia(s))
````
実行結果

```
I c'odulnt bievele that I colud aatcluly uasdnnertd what I was rdeaing : the poenhaenml poewr of the hamun mind .
```
Kodi YouTube Plugin が開けない問題 (2020-02)

# はじめに
ラズパイ4B (RAM4G) にてLibreELEC運用で快適動画生活を送って(？)いる。
ところが最近、YouTubeのプラグインがエラーにより開けなくなった。
#とりあえず環境
・Raspberry Pi 4B (RAM 4G)
・LibreELEC 9.2.0 (Kodi v18.5)

これでYouTube、アマプラを視聴している。快適。
# エラーログ
こんなエラーがトースト

```
YouTube
LoginException: [401] deleted_client 
The OAuth client was deleted.
```
401エラー。
どうやら、OAuth認証が無いよーというエラー。
てかAPIキーが消された。
エラーで大体対処法が分かったのでAPI発行すればオッケーだと思った。

Kodiフォーラムにも同じようなエラーに遭遇してる方がやはり。
https://forum.kodi.tv/showthread.php?tid=348464&pid=2925301#pid2925301

リプだとaccess_manager.json削除からのAPI設定してねって書いてある。

もう少し調べた所
>kodi YouTubeアドインにサインインできない問題 https://qiita.com/god19/items/aaab2b86fa08de5ac9d5

と、＠god19 さんの記事があったので参考にした。ありがたや。

#注意
YouTubeプラグインの設定ファイルの場所は
`/storage/.kodi/userdata/addon_data/plugin.video.youtube/~`にxmlとjsonがある。SSHで接続して変更するとき注意。
#まとめ
APIキー発行して設定したらまた正常に見れるようになった。
これで駄目だったらある意味絶望だと思う。
google.com/device に登録2段階するのがまた面倒くさいが。。
自分も最近起きた事項なので、発生してない環境もあると思う。
見れなくなるエラーは結構多いみたいなので、APIキーは自分で発行して設定したほうがいいかもしれない。
早く気付けばよかった。。
#最後に
良い子はFireTV Stick を買おう。