OmniAICreator/Qiita-1.07M huggingface dataset:
TypeScriptとBlocklyとnpmと

## 自己紹介
そのへんほっつき歩いてる高専生。
普段は課題に追われながらラーメン食っている。
GitHub: [isso0424](https://github.com/isso0424)
Twitter: [kousou4129](https://twitter.com/kousou4129)

## 何があったか
* TS + Blockly + ElectronWebpack + Electron + Reactで開発してた
* `Blockly.JavaScript`が使えない!!!
* 直すぜ!!!

簡単な話`Generator`が見つからなくて怒られた。
いつの間にか僕がキレてた。

## 注意
* 今回の記事はScriptタグを使用できない状況の話です。
* 普通ならScriptタグで読み込めば終わります。
* ~~筆者はWebpackの再設定で諦めました~~
* 7時間かけて解決したので最後の方はヤケクソです。

## というわけで原因究明
まずは原因を辿ることから開始。
とりあえず以下を実行

```ts
console.log(Blockly.JavaScript)
```

結果: `undefined`

はい、見つからん。

## Generator捜索
`Blockly.JavaScript`はJavaScript用のBlocklyのGeneratorです。
という訳で私はGeneratorの定義元を探しにアマゾン(node_modules)の奥地に向かいました。

### Blockly.Generator.JavaScriptとの出会い
アマゾンを捜索していると`javascript.js`というファイルを発見!!!

というわけで中を読んでみる

```ts:javascipt.js(一部抜粋)
Blockly.JavaScript = new Generator("JavaScript");
```

***おおおおおお!!!!!全世界が求めたコードが!!!!***
早速importしてみる

```
Uncaught ReferenceError: goog is not defined
```

あ゛あ゛あ゛あ゛あ゛あ゛あ゛あ゛あ゛あ゛!!!!!!
でもこれ解決すればいけそう!!!
***INSTALLLLLLL***

```bash
yarn add goog
```

よし!!!通れ!!!

```
Uncaught ReferenceError: goog is not defined
```

え...

### 問題点
`blockly/generators/javascript`で`goog`というライブラリが使われているのだが、こいつがなんか駄目らしい。

## 再びアマゾンの奥地へ
さて`goog`に対して明確な殺意を持ったところで解決策を探していく。
ggっているとこんな記述を多く見た。

```html
<script src="javascript_compressed.js"></script>
```

**な　ん　だ　こ　の　ふ　ぁ　い　る**
### javascript_compressed.jsの正体
どうやら[リファレンス](https://developers.google.com/blockly/guides/modify/web/building)によるとこいつがjavascript用のgeneratorを担っているらしい。

***ということはこいつ、使えるのでは?***

## 新たなる問題
さてここで新たな問題が発生。
今回`Blockly.JavaScript`の形で今までのコードが書かれているのでなんとかこいつをBlockly配下に持っていきたいのである。
しかし、それをしようにもBlocklyにTypeScriptにおける.JavaScriptへの型定義が用意されていないので書くのが面倒だ。

### 黒魔術
TSには実は黒魔術が存在する。
それは`(Hoge as any)`だ。
これを利用することでどんなオブジェクトでもanyにみなしていじくり回せるのである。

これ、importしてきたものも例外ではなく、**型定義を無視して**、**好き勝手なプロパティを生やす**ことができる。

### 黒魔術2
またもやTSの黒魔術の話になる。
お次の黒魔術は`require`である。
これ、***何でもかんでもany***でimportできるのである。

## と　い　う　わ　け　で
これにより解決策が見いだせた。
javascript_compressedに黒魔術を振りかけるとこうなる。

```ts
import * as Blockly from "blockly/core";
(Blockly as any).JavaScript = require("blockly/javascript_compressed");
```

***黒魔術通り越してクソコード***

## 検証タイム
### 検証方法
以下のコードを用いて実験した。

```ts
(Blockly as any).JavaScript.Hoge = (block: any) => {
  return "console.log("hoge");"
}

console.log((Blockly as any).JavaScript.Hoge());
// blockly/generators/javascript.jsで定義されている定数を実験に使用
// デフォルト値は1.1
console.log((Blockly as any).JavaScript.ORDER_NEW);
```

### 結果
```
console.log("hoge");
1.1
```

***!!!!!***
***これは!!!!!待ちに待った成功というやつか!!!!***

## まとめ
* npmパッケージのBlocklyはちょっと不親切なところがあるので注意する
* コードリーディングは最強
* anyは程よく使えば都合良いヤツ ~~型定義は面倒~~
* そもそもwebpack勉強してScriptタグで解決したほうが生産的


知見を得たり、役に立ったりしたら、LGTMお願いします!!!
マテリアルデザイン（Material Design）のCSSフレームワークの使い所（CSS Onlyの軽量フレームワークとの対比）

# ある程度デザインされているので、そのまま使い易い

　マテリアルデザインを使ったCSSフレームワーク・ライブラリ）は、色や影などがついているので、そのまま利用しても見栄えがそれなりに良い。
　社内だけで使う業務アプリや管理画面などには、こうしたライブラリを使えばコンポーネント単位で柔軟に使えて良いと思う。
　代表的なのは以下。

- [Materialize](https://materializecss.com/about.html)：動的効果も含め、デザインはピカイチ。
- [Material Components for the web](https://github.com/material-components/material-components-web)：ReactやSvelteなどSPAライブラリと共に使われることもある。


# マテリアル系のCSSフレームワークはオリジナルでデザインするときは不向き

　前掲の裏返しで、デザイナーさんがオリジナルでデザインしたものをコーディングする際には不向き。
　この場合、デザイン性のない、レイアウト（配置）、アニメーション（動的効果）だけを利用できるCSSフレームワークがよい。
　例えば、以下のような軽量フレームワーク（CSSだけを使っている）。

- [SPECTRE.CSS](https://picturepan2.github.io/spectre/index.html)：凄くシンプル。逆にデザイン性はない。
- [Milligram](https://milligram.io/)、[](https://minicss.org/)：Node.jsの公式で使われている。
- [Picnic CSS](https://picnicss.com/)：ドキュメントのデザインが良い（見やすいかは別）
- [Pure.css](https://purecss.io/)：標準的。
- [HiQ](https://jonathanharrell.github.io/hiq/)：ビルドがPostCSS。


# 余談：JSをできるだけ排除し、小さい単位で使えるコンポーネント指向のCSSフレームワークがよい
　
　最近は、React、Vue、Svelte、Angularなどコンポーネント指向でのフロント開発が多い。その場合、これらでつくったコンポーネントに対してスタイルを適用していくことになる。
　そうなると、できるだけ**JSの依存性はなく、細かく利用できる**ものがよい。
　
　この観点から**軽量フレームワーク**であったり、「Material Components for the web」のような**コンポーネント指向のCSSフレームワーク**が使いやすい。
　仮に、Javascriptを使っていても、**webpackなどでのビルドがしやすい、名前空間の衝突とかのないもの**がよい。

　**Materializeは、デザインやエフェクトは一番良い**のだが、コンポーネント指向、ビルドという点では、jQueryでの依存があったりするので、少しおすすめできない。
　とはいえ、コンポーネント指向とかあんまり関係なく、見た目だけとりあえずいいなら、Materializeが一番だろう。
Radeon VII を powerlimit 運用するメモ

## 背景

Radeon VII を powerlimit 運用し, 電力効率よくマイニングやレンダリングや機械学習したい

## 環境

* Ubuntu 18.04
* amdgpu-pro 20.30
  * ROCm も使えると思うが, 現時点では 3.5.0, 3.5.1 問題でカオスになっているため推奨しない
   
## powerlimit

amdgpu の場合は rocm-smi の git を clone してくれば動きます.

https://github.com/RadeonOpenCompute/ROC-smi

`--setpoweroverdrive 120` と, nvidia-smi のようにワット指定のオプションがありますが, 2020 年 8 月時点では experimental feature です. 使っているとたまにリミットが外れたりします(VEGA の場合は暴走するときもある).

--setsclk 2 などと, クロックのレベルの方を設定しましょう.

## メモリ

Radeon VII のメモリは hynix or samsung です.

`--showmemvendor` でメモリベンダの情報が出ます.

定格 or 弱め powerlimit では samsung のほうが性能いい感じです.


## 測定

ethash miner(Phoenix Miner)で試します.

```
sudo rocm-smi --setsclk 2 --setfan 50%
```

setfan の指定 + 10 が実際のファンスピードになるようです(`%` つけないと 255 レベル? でのファン速度と解釈されてしまうので注意).

fan 60% で open air で, 夏の猛暑日室温 35 度で GPU 温度 60 ~ 68C でした.
fan 60% はそんなにうるさくないです(扇風機やクーラーのほうがうるさい)

今回は GPU のファンだけでしたが, 外部ファンで GPU に送風してあげるとより温度減ると思われます.

Eth 62 Mh/s 出ました(2020/08/13 時点 0.3 mBTC/day(~350 円/day)ほど).


rocm-smi で見るかぎりでは, 85W(HDMI ポート指している場合は 105W)と, かなりいい感じです.

1 枚 100W ですと, 4 枚指し Radeon VII でレンダリングや機械学習運用も 1000W PC 電源で足りてよいですね.

## 寿命は?

寿命はどれくらい？グラフィックボードの耐用年数
http://blog.livedoor.jp/i80286/archives/50430445.html


マイニング上がりの中古グラボを狙う
https://minkara.carview.co.jp/userid/186746/blog/42892590/


世界初の7nmプロセス採用ゲーミンググラフィックス、AMD「Radeon VII」検証
https://www.gdm.or.jp/review/2019/0207/292897/3

Radeon VII はタンタルコンデンサを使っているようですので, コンデンサの寿命は半永久と考えてよさそうです.

故障の要員としては GPU メモリの故障などが考えられますが(ちなみに Radeon VII は SRAM(L1 キャッシュ?) は ECC 化されているっぽい),  powerlimit で GPU 温度 70 度以下運用でしたら, 24 時間運用しても 4~5 年(法定耐用年数)は問題なく使えそうです.

また, タンタルコンデンサは故障すると発火の危険性があるようですので注意ですね
(GPU の場合は, タンタルコンデンサ故障の場合は基盤がうまく対処してくれるのかしらん?)

https://industrial.panasonic.com/jp/ss/technical/b3


## 問題点

10 万円以下(発売時)でメモリ 16GB あって倍精度 3 TFlops あって, 100W で GPU 温度 70 度以下で, タンタルコンデンサ使っていて耐久性たかそうでとてもよい Radeon VII ですが, 残念ながらすぐに discon になりました. :cry:

今後の Big Navi に期待でしょうか.
Python3でマイクロ秒表示、日本時間で

- プログラム

```Python3
# coding: utf-8

from datetime import datetime, timedelta, timezone
import time

for i in range(0, 7):
    date = datetime.now(timezone(timedelta(hours=+9), 'JST')).strftime("%Y-%m-%d %H:%M:%S.%f")
    print(date)
    time.sleep(0.17)
```

- 実行結果

```text
2020-08-13 04:03:58.874931
2020-08-13 04:03:59.045158
2020-08-13 04:03:59.215385
2020-08-13 04:03:59.385582
2020-08-13 04:03:59.555776
2020-08-13 04:03:59.725971
2020-08-13 04:03:59.896166
```
WindowsでMagentaがインストールできないエラー(2020.08.12)の対策 

##WindowsでMagentaがインストールできないエラーの対策
Googleの音楽機械学習ライブラリ Magenta
https://magenta.tensorflow.org/

２０２０年８月現在2.1.0までがリリースされていますが、最近のアップデートの後Windowsへインストールを試みると

````
ERROR: Could not find a version that satisfies the requirement jaxlib>=0.1.51 (from dopamine-rl->tensor2tensor->magenta==2.0.1)(from versions: none)
ERROR: No matching distribution found for jaxlib>=0.1.51 (from dopamine-rl->tensor2tensor->magenta==2.0.1)
```
の様にエラーが表示されインストールができません。
エラーに表示されている通り、tensor2tensorの依存ライブラリであるdopamine-rlの依存ライブラリ

jaxlib

がWindowsにインストールできないための様です。
Magentaではdopamine-rlも含め使用しないはず？、、、
にも関わらず何故依存ライブラリに含まれてしまったのか？、、、
と疑問は色々ありですが、Googleさんが修正アップデートを行ってくれるまでの一時的な対策をまとめてみます。
（とは言えオープンソースなので修正を行ってくれるかは不明です。必要な事は自分たちでプログラミングするというスタンスもオープンソースでは必要と思っています。）

##対策
**１・Magenta用の仮想環境の作成**
作らなくても良いと言えば良いのですが、作成を推奨します。

**２・tensorflowをインストール**

```
pip install tensorflow
```
TensorFlowは通常通りインストールしていただいて構いません。
2020年8月現在2.3がインストールされるはずです。

**３・依存ライブラリを含まずに単独でmagentaをインストール**

```
pip install --no-deps magenta==2.0.1 
```

通常のpipインストールを行うと依存ライブラリとして
tensor2tensor→dopamine-rl→jaxlib
とインストールが実行されてしまいますのでそれを避けるため、magentaを単独でインストールします。
依存ライブラリなしのpipインストールは上記コード通り--no-depsというオプションをつけます。
なお、2020.08.12現在の最新版2.1.0はWindowsではエラーがでるので2.0.1以下のバージョンを指定しインストールを行ってください。

**４・tensor2tensor をインストール**

```
pip install --no-deps tensor2tensor
```
３と同様です。
依存ライブラリなしに単独でtensor2tensorをインストールします。

**５・requirements.txtを作成**
その他の必要なライブラリだけをインストールするため、カスタムでライブラリインストール用のrequirements.txtを作成します。
テキストの中身は以下です。
このテキストでは、通常Magentaでエラーが出るライブラリのバージョンダウン変更・指定なども行っているのでエラー回避の対策もされています。
作成後、６で読み込んで実行しますので作業ディレクトリに保存をしてください。

```txt:requirement.txt
absl-py
apache-beam[gcp] >= 2.14.0
attrs
bokeh >= 0.12.0
dm-sonnet
imageio
intervaltree >= 2.1.0
IPython
joblib >= 0.12
librosa >= 0.6.2
matplotlib >= 1.5.3
mido == 1.2.6
mir_eval >= 0.4
numba <= 0.43.0
numpy
pandas >= 0.18.1
Pillow >= 3.4.2
pretty_midi >= 0.2.6
protobuf >= 3.6.1
pygtrie >= 2.3
python-rtmidi >= 1.1, < 1.2
scikit-image
scipy >= 0.18.1
six >= 1.12.0
sk-video
sox >= 1.3.7
#tensor2tensor
tensorflow-datasets
tensorflow-probability==0.7.0
tf_slim
wheel
bz2file
flask
future
gevent
gin-config
google-api-python-client
gunicorn
gym
h5py
kfac
llvmlite==0.32.1
mesh-tensorflow
oauth2client
opencv-python
pypng
requests
sympy
tensorflow-addons
tensorflow-gan
tqdm
```

**６・残りのライブラリのインストール**
requirements.txtに記述したライブラリのインストールを行います。
前述した通りrequirements.txtは現在作業ディレクトリに置いてください。

```
pip install -r requirements.txt
```

以上です。
これで実行できるはずです。
開発環境を作成している方は、さらにクローンしてきたレポジトリのsetup.pyも書き換える必要があります。

##最後に
Magentaは、それなりに環境構築が大変かもしれません。
特にWindows環境では、アップデート後にエラーが出る事が多いです。
通常はバージョンダウンのインストールで解決するのですが、今回は対策がなかなか大変でした。
インストールを試していただいて、何か更に対策・修正必要な事などありましたらコメントください。
【初学者向け】【Rails】 命名規則の理解の仕方を纏めてみた

※Qiita初投稿

どうも Toda Masaoです。

Railsを学習中 __"モデル名は単数形 / コントローラー名は複数形"__
といった単数形/複数形の命名規則に出会いました。

「どういう基準で単数・複数形を分けているんや…」
「そもそもこのヘンテコルールは何のために…」
と理解できない部分が多かったため、自分なりに調べてみました。

結果、初学者向けに分かりやすく解説されている記事がなかったので
自分なりの解釈(と調べた結果)を纏めてみました。

他初学者の方の理解を深める手助けになればと思います。
※解釈に誤りがあれば随時修正します

# 単数形と複数形にする理由

__　・コントローラー名は末尾に"s"を付けて複数形にする
　・モデル名は末尾に"s"を付けずに単数形にする__

という風にRailsには単数形複数形に関する命名規則があり、
これを遵守しない場合はエラーが発生するという強い制約があります。
まず「何のためにそんな制約を設けているの？」という点について疑問に思ったので調べてみました。

結果：
Railsには__「設定より規約」__というの基本理念があり、これに準ずるために設けられたようです。

>wikipediaより引用:
設定より規約（せっていよりきやく、英: convention over configuration; CoC）とは、開発者の決定すべきことを減少させ、単純にするが柔軟性は失わせないソフトウェア設計パラダイム。
この言葉の本質的な意味は、開発者が指定しなければならないのはアプリケーションの慣例に従わない点だけだ、ということである。例えば、モデルの中にSalesというクラスがあれば、データベース中の対応する表の名前はデフォルトでsalesである、という規約を定める。この規約から逸脱するときだけ、例えばその表を "products_sold" という名前にする場合だけ、その名前を使ったコードを書く必要が生じる。
使用しているツールが実装した規約が開発者の望む動作と一致していれば、設定ファイルを書く必要もない。実装規約と望みの動作が違っている場合だけ、必要な動作を設定すればよい。

僕の解釈でイメージを補足すると
「M・V・Cの紐付けとか面倒くさい処理は基本Railsが行う方針とするよ。一意に判断できない処理だけエンジニアが書いてね。
　規則性のない名前付けられるとどう紐付けていいか分からなくなるから命名規則を設けるよ。」
ということらしいです。

僕自身、過去にJava言語でWebアプリケーションを作った経験があるのですが、
MVCを紐付けようとすると定型文的なコードが必要になりました。
コード量が増える上に、記述の手間がかかるので、自動で紐づけてくれるなら確かに開発効率が大幅にアップすると思います。
この自動化に重きを置くために、単数/複数形を始めとした強制力の強い命名規則を設けているようです。


# モデル名について

|種類|例|説明|
|:---:|:---:|:---:|
|モデル名|user|単数形|
|ファイル名|user.rb|単数形
|モデルクラス名|User|単数形、頭文字は大文字
|テーブル名|users|複数形

モデル名は__単数形__になります。
モデルは「モデルオブジェクトのクラス(*)」を指します。
クラスであり、何かしらの集合体ではないということから単数形になるようです。
(*)前述の例では「一人一人のユーザを表すモデルオブジェクトのクラス」

テーブル名は複数形になります。

モデルとテーブルの定義を混同しがちですが、
__・モデルはクラス
・テーブルはレコード(user)の集合体__
なので、モデル名は単数形、テーブル名は複数形になるんだそうです。
そう聞くとなんとなく納得できますね。

# コントローラー名

|種類|例|説明|
|:---:|:---:|:---:|
|コントローラ名 |users|複数形|
|ファイル名|users_controller.rb|複数形|
|コントローラクラス名|UsersController|複数形、頭文字は大文字|

コントローラー名は__複数形__になります。
コントローラーは「クライアントからのリクエストを受け取り、model/viewと連携してレスポンスを返す役割を担う部分」を指します。

~~モデルに対する操作(アクション)が複数あるから複数形になるらしいです。~~
前述の例を用いると「User全体(Users)をコントロールするためのもの」だから複数形になるようです。

MVCの関係は図に表すと以下のようなイメージになるそうで
このイメージを聞いたら腑に落ちました。

![mvc関係.001.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682496/930bc8e7-6454-115e-88d5-46eff83bfc27.jpeg)






# ビューフォルダ名について

|種類|例|説明|
|:---:|:---:|:---:|
|フォルダ名|users|複数形|

ビューフォルダ名は__複数形__です。
ビューフォルダは該当のコントローラーと基本対の関係になっているのですが
コントローラ名と同じ名前を使っているので複数形になっているらしいです。まぁこれは納得ですね。

ちなみにViewファイル名(HTML)は基本アクション名と同じになりますので複数形にはなりません。


# 最後に
命名規則について色々調べた後、Railsで開発を行っていますが、
前述の認識で開発に支障出ていないので、認識に特に問題ないと思っています。

最初に書きましたが、認識誤っていると気づいた場合は
随時本記事を更新する予定でいますので、その点はご理解/ご了承頂きますようお願いします。

以上です。
最後までお読みいただきありがとうございました。

# 参考
[Railsにおける「命名規則」とは？](https://diveintocode.jp/blogs/Technology/NamingRole)
[Ruby on Railsの命名規則：好きに命名するのか、Railsが予想して命名したのか分からない話](https://qiita.com/kitsunecat/items/c136d43ae70165f14643)
[設定より規約について](https://qiita.com/itoken00/items/1bde0ce37013cfb6fcbb)
[設定より規約](https://ja.wikipedia.org/wiki/%E8%A8%AD%E5%AE%9A%E3%82%88%E3%82%8A%E8%A6%8F%E7%B4%84#:~:text=%E8%A8%AD%E5%AE%9A%E3%82%88%E3%82%8A%E8%A6%8F%E7%B4%84%EF%BC%88%E3%81%9B%E3%81%A3%E3%81%A6%E3%81%84%E3%82%88%E3%82%8A,%E3%82%8F%E3%81%9B%E3%81%AA%E3%81%84%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E8%A8%AD%E8%A8%88%E3%83%91%E3%83%A9%E3%83%80%E3%82%A4%E3%83%A0%E3%80%82)
今日学んだこと（8月12日）

#ルーティングからの行動

１、rails routesで行先確認（GETなのかPOSTなのかetc、URLは？コントローラー名は？アクション名は？を確認する）
↓
２、確認した上記項目に従ってmodelやcontrollerを作成する
　ターミナルでrails g model（controller） モデル名（コントローラー名）
↓
３、modelにはバリデーションとアソシエーションを記入する
　　↓
　　バリエーションとはカラムに対しての制限
　　大体最初にwith_options presence: true do(空白はダメよって意味の文)を書く
　　その下にvalidates :カラム名, format(そこら辺): {with/正規表現/, message: "エラー文"}て感じ
　　
　　アソシエーションはテーブル間の繋がりを表す
　　使うのはhas_many、has_one、belongs_toなどなど（ってかこれしか知らねえわ笑）
　
　controllerにはルーティングで確認したり、定義したメソッドを記入する
　ここはもっかい復習しないとわかんねえ

４、modelとcontrollerが終われば特定のviewファイルを作る
　これはHTMLとCSSの役目、でもrailsも入れるけどね
　form_withの文はrailsで情報を送信するためのヘルパーメソッドらしい
　<%= form_with model: modelで定義したインスタンス url: routesで見れるPATH local: true do |form| %>
 ↑これには入れてないけどHTML表記でのクラス名の定義だったりも入れられる

こんな感じ

#入れといたほうがいいgem
いっちゃん下に書く系のgem
１、devise
こいつはマジで有能だった。ユーザー管理関連のこと大体これで終わる、コントローラーもモデルも全部作りやがる。
２、pry-rails
テストコード書いて、なんかエラー起こってんなってなったらこいつの出番。エラー起こりそうなところのコード記述にbinding pryって入れたらそこで処理が止まってくれるからどこでヤベェことが起こってるのかわかる

#テストコード
とりあえずテストコード書くのは嫌い
何が嫌いって
起こる事象はわかるんだよ
何が起こってその事象が成功するか失敗するか

でもさ、成功と失敗の比率を考えると失敗することが多いわけじゃん
ってことはその失敗の全ての事象を書き出すとか途方もないわけで
ぶっちゃけ数学の背理法してるような感覚

失敗がこれだけあります、だからこれを避ければ成功しますよね？みたいな
背理法もそんな感じ
これ全部違うから、これの反対が正解だよね？って感じ

あ、でも数学だと思えば全然苦痛じゃなくなったわwwww


#マークダウン

初めて書くんでマークダウン方式の書き方わからん
ってか覚えてねぇ
もし、俺以外の誰かがこれを見た時にはごめん
チンパンジーだからマークダウン方式で書けないの

ってかこんなチラ裏みたいな記事誰も読まねぇってタカくくってる


#雑記

マキオン楽しいわ、家庭用神
リボガンでかちゃかちゃすんの楽しい

昨日から始まったhyper scapeだけど
やっすい鯖使ってんのかワカンねぇけど死ぬほど重かった
鯖安定するまで退散
面白そうなバトロワfpsだから何とかして欲しい

で、退散した先で結局Apex
Ajaxじゃないよ（震え声）
何やかんやキルできるあたり、それなりに離れてもできるっぽい

あーそうだ
ゲーム関連で思い出した
モンストの連続ログイン日数途切れたんだった
萎え

あと最近、おかんと共謀して
Disney＋に加入した
目当てはスターウォーズのドラマ、マンダロリアン
単純にカッコ良くて面白い

で、せっかく入ったんだからと思って
Disney関連の映画だったり見まくってやろうと思う
アナ雪２からやな



さー次の更新はいつかな
毎日書くわけじゃないと思う、ってか毎日書けない
昔からこういう日記みたいなん苦手

習慣だったりルーティンだったり大事だと思う
そこに関しては異を唱えることはしない

でも個人的には
毎日同じ日々は面白くない
何か違うことがあってこそ
人生は面白い

ルーティンを崩された時にどういう反応、アクションを取れるかによって
その人の器量が試されるんだとも思ってるし
そういうのって人生経験が生かされるところでもあると思う

俺は焦ると本当によくない
テンパるし、何してるかわからなくなったり頭が動かなくなってくる
だから余裕を持たせるのが自分的には大事だと思ってるし
例えそれがぬるま湯だったとしても、そこが人生的には最高なんじゃないかとも思う

お前はやればできる
これって悪魔の言葉だと思う
やれば、ってやることを強制してるような言い方だもん
そのタイミングでこっちに勝手に期待して
できなかったら期待が裏切られたみたいに離れていく
誰も期待してくれなんて頼んでないのに

完全にこれは詭弁だし、甘えたこと言うなって言われると思う
期待されてるだけマシって考えるひともいると思う

でもね、隣の畑は青いんだよ
綺麗に見えるんだよ

はい、終わり
おやすみなさい
Cartopyでコンターラベルを書かせるとコンターが地球を逆向きに一周してしまう場合の回避

（2020/10/20追記）
Cartopy 0.18.0　では上記バグは修正されているようです．

# 環境
Python 3.7.4
Matplotlib 3.1.1
Cartopy 0.17.0

# 何が起きた？
なんと表現したらいいかわからないので，まず問題の図を紹介します．
データはとある気象データ(JRA-55, 200hPaジオポテンシャル高度[gpm])です．
![t-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544845/b4f0a37d-ea3c-d1ce-d464-484ac3ed1983.png)
コンター(等値線)が正常に描画されず，経度0度の付近で一斉に逆向き？に同じ緯度を回転してしまいます．図のように，極点を含む投影図（ここではccrs.AzimuthalEquidistant()）で発生する問題と認識しています．

あるStackoverflowの[記事](https://stackoverflow.com/questions/43238645/strange-behavior-with-contours-in-cartopy-polar-stereographic-plot?rq=1)によると，経度の配列も忘れずに東西にcyclicさせよとありますが，元々してるんだよなぁ．
（add_cyclic_pointはこちらの[記事](https://qiita.com/earth06/items/8c5ee8538dc7c94206c8)でも視覚的に説明されています．）

```python3:
import numpy as np
from cartopy.util import add_cyclic_point

#色々省略

lon = np.arange(0, 360, 1.25) #ここでは358.75まで
f_cycle, lons = add_cyclic_point(f, cood=lon) #360まで拡張，経度情報はlonsへ格納，fは描くデータ
```

逆にadd_cyclic_pointをせずに描画すると，
![t-0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544845/d9721dd8-42ed-3efd-bbd6-3f58d86c5df1.png)
”逆向き一周”の問題は回避されましたが，経度0度付近でコンターに隙間が生まれます．

ラベルを書かなければそもそもこの問題は発生しません．
![t-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544845/9cf69ced-13d7-55a2-811c-463ed4110fae.png)

自分なりに調べたものの，現在この問題を回避する方法を見つけられていません．
2018年のStackoverflowの[記事](https://stackoverflow.com/questions/49048411/cartopy-north-pole-stereographic-contour-plot-does-not-plot-correctly-even-with)ではこの問題にCartopyのデベロッパも協力しているようですが，その後どうなったのでしょうか．．（最新版では解決されているかもしれません）

# 妥協案
として考えたのが，ラベルをつけるコンターを限定的にしてそのコンターはadd_cyclic_pointさせない，という方法です．
必要最低限のラベルをつけることができますが，ラベルのついたコンターはやはり経度0度付近で途切れてしまいます．

```Python3
# ラベル用の数列
lev1 = np.arrange(0, 200001, 100) #狭めの間隔
lev1n = lev1 #lev1を残す場合のための複製
lev5 = np.arrange(0, 200001, 400) #広めの間隔
for l in lev5:
    lev1n = lev1n[~(lev1n==l)] #lev1(lev1n)からlev5と同一な要素を取り除く

''' 中身を列挙すると
lev1:  0, 100, 200, 300, 400, 500, 600, ...
lev5:  0,                400,           ...
lev1n:    100, 200, 300,      500, 600, ...
'''

# lev1nを使ったコンター，add_cyclic_pointあり，ラベルなし
c1 = ax.contour(lons, lat, f_cycle, lev1n, linewidth=0.8, transform=ccrs.PlateCarree())
# lev5を使ったコンター，add_cyclic_pointなし，ラベルあり
c5 = ax.contour(lon, lat, f, lev5, linewidth=1.3, transform=ccrs.PlateCarree())
c5.clabel(fmt='%5.0f', fontsize=9)
```

こうなります．まさに妥協案，と言った感じです．．
![t-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544845/c93f12f5-1edc-7dc8-32a1-504643f4d176.png)
lev1nのリスト内包表記は誰かの記事を参考にさせていただいたのですが，思い出したら書き加えます．
やり方は他にもあると思いますが，とにかくこの処理を加えないとラベルの裏に狭い方のコンターが描画され読みづらくなります．

参考になれば幸いです．
webstormでeslintとprettierを保存時に自動反映させる

## はじめに
WebStormを利用してプロジェクトごとに設定された`.prettierrc`や`.eslintrc.json`ファイルを元に保存時にコードを自動整形する設定方法を記載しています。
一度設定しておくと、開発効率が爆上がりするのでとてもおすすめです！

## prettier設定
prettierは`.js, .ts, .tsx, .css, .less, .scss,  .json`などのファイルをフォーマットしてくれます。

プロジェクトのルートに`.prettierrc`という設定ファイルを配置しておきます。

導入手順は以下の通りです。
0. 事前設定
    Node.jsのインストール

1. prettier導入
   プロジェクトかグローバルにprettierを導入する
    - プロジェクト用prettier
    
    ```
npm install --save-dev --save-exact prettier
```
    - グローバル用prettier
  
    ```
npm install --global prettier
```

2. WebStormの設定 
WebStormメニューの`Settings/Preferences (⌘,)`から
`Languages and Frameworks`タブの`JavaScript`＞
`Prettier`を選択 （下図の赤線参照）

`Node interpreter:`はデフォルト
`Prettier package:`はプロジェクトでprettierをインストールした場合はプロジェクトのprettierのパスを指定

最後に`On code reformat`と`On save`のチェックボックスにチェックをいれます。（下図の緑線参照）
これによって保存時にprettierの整形が実施されます。

![prettier.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271854/67444714-b390-32cb-4600-afc23450b6fd.png)


[Prettier - Help | IntelliJ IDEA - JetBrains](https://www.jetbrains.com/help/idea/prettier.html#ws_prettier_reformat_code)

## eslint設定
eslintはコードが設定ファイルのルールに従っているか文法チェック（リント）してくれます。コマンド実行時に`--fix`オプションをつけると修正までしてくれます。

プロジェクトのルートに`.eslintrc.json`という設定ファイルを配置しておきます。

導入手順は以下の通りです。
0. 事前設定
 Node.jsのインストール

1. eslint導入
   プロジェクトかグローバルにeslintを導入する
    - プロジェクト用eslint
    
    ```
npm install --save-dev eslint
```
    - グローバル用eslint
  
    ```
npm install --g eslint
```

2. WebStormの設定 
WebStormメニューの`Settings/Preferences (⌘,)`から
`Languages and Frameworks`タブの`JavaScript`＞`Code Quality Tools`＞
`ESLint`を選択 （下図の赤線参照）

`Node interpreter:`はデフォルト
`ESLint package:`はプロジェクトでeslintをインストールした場合はプロジェクトのeslintのパスを指定

`Configuration File`は`Automatic search`を選択します。
*デフォルト（Automatic search）でプロジェクトのnode_modulesフォルダーのESLintパッケージと、現在のファイルが保存されているフォルダーの.eslintrc.*構成ファイルを使用します。*

最後に`Run eslint --fix on save`のチェックボックスにチェックをいれます。（下図の緑線参照）
これによって保存時にeslintのリントと修正が実施されます。

![ eslint.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271854/e948c638-dcf7-cefe-f4aa-119897eeafbe.png)


[ESLint - 公式ヘルプ | IntelliJ IDEA](https://pleiades.io/help/idea/eslint.html)

## （番外編） editorconfig設定
WebStormの場合はデフォルトでプロジェクト直下の`.editorconfig`の内容はエディターに反映されます。そのため、特段設定はいりません。
`.editorconfig`を使って設定していることもあるので知識として知っておくといいと思います。

## 終わりに
雑にコードを書いていってもprettierとeslintによって規定されたコード形式で保存されていくので、コミット作業がとても楽になります。

ただ、eslintの実行が少し重たいのが難点かなとも感じています。。

## 参照
[Prettier - Help | IntelliJ IDEA - JetBrains](https://www.jetbrains.com/help/idea/prettier.html#ws_prettier_reformat_code)
[ESLint - 公式ヘルプ | IntelliJ IDEA](https://pleiades.io/help/idea/eslint.html)
エラー「この接続のための電話帳エントリが見つかりませんでした」対処法

<font color="red">【2021/5/18 追記】ユーザープロファイルを削除して解決した！</font>

ある日突然、Windows10のVPNがエラーで接続できなくなった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/d1b502b7-5dba-0612-4cbe-a8ace60d6b93.png)
VPN接続を再作成しても解消せず。。。ダイヤルアップ接続は使っていないのだけど。:expressionless:
同じVPN接続を使う他のPCでは正常なので、サーバの問題ではない。
Administratorでは接続できたようなので、アカウントごとの環境が何かの拍子で破壊されたのかもしれない。
なお、連絡のあった前日の8月12日は Windows Update の月例パッチが配信された日とも一致するが、現象自体は８月初めからあったと言い、今のところ因果関係は認められない。

# 対処
取り敢えず、次のコマンドで接続／切断できた。

```:接続
C:\Windows\System32\rasphone.exe -d "VPN接続名"
```

```:切断
C:\Windows\System32\rasphone.exe -h "VPN接続名"
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/6a6eb152-ada2-2cbf-88a6-6df63d850a09.png)
あとは、このコマンドのショートカットなりバッチファイルなりをデスクトップにでも置いて、凌ぐことにした。
抜本的なトラブルシューティングとは言えないが、「業務を止めない」という意味では解決したのでクロージング。

# ユーザープロファイルを削除して解決
AD環境では移動ユーザープロファイルをローカルストレージにキャッシュしていると思うが、このキャッシュを次の手順で削除したところ、抜本的に解決した。（要管理者権限）

## [システムの詳細設定] をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/cc3fb093-417f-c341-cde8-0e9666c433af.png)

## ユーザープロファイルの [設定] をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/4e7ba42f-bfe8-4d91-a982-a1ed48dfb61e.png)

## 該当するアカウントを選択し [削除] をクリック
退職者のユーザープロファイルもついでに削除した。
「不明なアカウント」となっているのは、「C:\Users」に実体がありながらドメインコントローラと通信できないなどの理由で表示されるものなので、これも削除して構わない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/2875b4ce-cfc4-00b6-15b6-96232db47b82.png)

ユーザープロファイルを削除すると色々と影響が出るので、あくまで自己責任で。
Unity2019.4.8f1でどのライセンスでもダークテーマが使えるようになりました

今までUnityProの特権だったダークテーマ。
この制限が、Unity2019.4.8f1で解除されたようです。

>Editor: Dark theme editor preference is no longer restricted by licence entitlements

[What's new in Unity 2019.4.8 - Unity](https://unity3d.com/unity/whats-new/2019.4.8)より

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328771/8dc2ae06-d5b6-0416-cf72-c208eb434e4a.png" width=500 />
確認するとPersonalライセンスでもダークテーマが使えるようになっていました。

というだけの記事です。

## ただスキン変えられるようになっただけやん？

というご意見は最もなのですが、今までPersonalライセンスだとダークテーマは使えませんでした。一種のあこがれ的なものがあったのを覚えています(仕事ですぐにダークテーマが使えるようになりましが)。

Unity3系くらいから触っていた身としましては結構大きな事件でしたが、今まで有料だったものが無料になるという事は**Unityにはよくある事**でございます。

## 追記

>Editor: Dark Theme editor preference is now available to all users.

[What's new in Unity 2020.1.2 - Unity](https://unity3d.com/unity/whats-new/2020.1.2)より

Unity2020の場合は、Unity2020.1.2でダークテーマ解除された模様です。
FirestoreのTimestampとDateの相互変換

Android SDKでの話です。
特にDateからTimestampへの変換を忘れがちなので、備忘録として。

- https://firebase.google.com/docs/reference/android/com/google/firebase/Timestamp

```kotlin
// Date -> Timestampの変換
val timestamp = Timestamp(Date())

// Timestamp -> Dateの変換
val date = timestamp.toDate()
```
Railsで検索機能を実装する方法

今回はRailsで検索機能を実装する方法をご紹介いたします。
# 環境
- Ruby 2.5.7
- Rails 5.2.4

# 前提
- ブログサイトの記事を検索する機能として説明する
- 記事のテーブルはposts
- postsのカラムはtitle、body
- 記事一覧画面(index.html.erb)に検索フォーム、検索結果を表示

# 検索のルーティングを設定する

```ruby:routes.rb
get 'search' => 'posts#search'
```
# 記事一覧画面に検索フォームを作成

```html:index.html.erb
<div class="search-form">
  <%= form_with url: search_path, method: :get, local: true do |f| %>
    <%= f.text_field :keyword, value: @keyword %>
    <%= f.submit "検索" %>
  <% end %>
</div>
<div class="post-list">
  <% @posts.each do |post| %>
    <%= post.title %>
  <% end %>
</div>
```

# searchメソッドを作成
post.rbに以下を記述します。

```ruby:post.rb
def self.search(keyword)
  where(["title like? OR body like?", "%#{keyword}%", "%#{keyword}%"])
end
```
OR は title と body、どちらか一方にでも検索キーワードが部分一致すれば、その記事を出力する。
(title と body、両方にヒットした場合のみ、出力したい場合は AND を用いる。)

# searchアクションを追加
```ruby:posts_controller.rb
def search
  @posts = Post.search(params[:keyword])
  @keyword = params[:keyword]
  render "index"
end
```

これで検索機能の完成です。

# 参考文献
- 【Rails】１つの検索フォームで複数カラムをまたいで検索する方法<br>
https://qiita.com/bSRATulen2N90kL/items/6a7c99bf3641ac6838fb
[WIP]Discord Bot で Yggdrasill radioを流したい

#  24/7 🔊 discord music botで解決してしまった。
[24/7 🔊 - nonstop music in discord](https://www.24-7music.com/)


#      Discord Bot を作るところから
- [Discord Bot 最速チュートリアル【Python&Heroku&GitHub】 - Qiita](https://qiita.com/1ntegrale9/items/aa4b373e8895273875a8)
- [【discord Bot開発】pythonが色々簡単すぎるので、爆速で天気予報Botをデプロイしたよ！ - Qiita](https://qiita.com/drumath2237/items/de92bea97080891ce6c6)

### Ruby
- [discordrbでbotを作ってみた - 技術系備忘録](https://lilac-xi.hatenablog.com/entry/2019/04/12/062848)


### C# 
- [Discord で音声通話ができるボットを作る - chiepomme](https://chiepomme.gitbook.io/chiepomme/tips/other/discord-degadekirubottoworu)
- 


# 音声ファイルを流す
- [Discord.py×Herokuで音声ファイルを流した - Qiita](https://qiita.com/coolwind0202/items/542761a1701c1176bc93)
- [discord botで、音声ファイル再生するものを作った - Qiita](https://qiita.com/papparappara/items/5a300fbff90ba1f11938)
- [Discord Bot Python ffmpegエラー - 初心者向けチュートリアル](https://tutorialmore.com/questions-1350544.htm)
- [Discord.pyで音声を流すbotを作る - Qiita](https://qiita.com/hugashy/items/38c5d53fd3ff55d2b0e3)


# FFMPEGで再生したものをVoiceChatに流せる？
# FFMPEGはPLSファイルに対応してる？
# PLSファイルはリンク先を指してるけど、ダイレクトに叩けない？
# MP3形式だからそのままVoiceChatに流せるんじゃない？

# https://www.24-7music.com/ で解決してしまった。
Qiita記事の見出しで#を使いたい

#見出しに記号のシャープが入らない。エスケープしてるはずなのに！
バックスラッシュを使ってちゃんとエスケープしてるのに！
って思った寂しい私の備忘録。

# C#後ろになにか文字を入れればちゃんと表示される

# C# 
後ろにスペースを入れても表示されます。


#おわり
めっちゃどうでもいいとは思ったのですが、
もし戸惑ってる人がいたらその人のための記事です。
RMS で登場する証明書について

# この記事は？
RMS で出てくる SLC/RAC/CLC などについて、書いてみます。

[https://techcommunity.microsoft.com/t5/microsoft-security-and/ad-rms-under-the-hood-client-bootstrapping-part-1-of-2/ba-p/247464]
(https://techcommunity.microsoft.com/t5/microsoft-security-and/ad-rms-under-the-hood-client-bootstrapping-part-1-of-2/ba-p/247464)

[https://docs.microsoft.com/ja-jp/archive/blogs/information_protection/licenses-and-certificates-and-how-ad-rms-protects-and-consumes-documents]
(https://docs.microsoft.com/ja-jp/archive/blogs/information_protection/licenses-and-certificates-and-how-ad-rms-protects-and-consumes-documents)

# 関係図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94849/ccdd7a14-0862-9722-dcbd-2f8d088c774b.png)
これらのファイルは XrML という、XMLベースのファイルとして提供されます。

## マシン証明書 SPC
マシン固有の秘密鍵と公開鍵のペアです。初回にクライアントで生成され、ローカルで管理されます。
この処理ではリモートとの接続を行いません。
秘密鍵は lockbox の中で生成され、安全に管理されます。

## ユーザー証明書 RAC (GIC)
* RMS サーバーから発行されるユーザー固有の秘密鍵と公開鍵のペアです。
* RAC の秘密鍵は SPC の公開鍵で暗号化されます。
* この RAC は AzureRMS では 30日間有効で、期間を変更することが出来ません。
  AIP で 条件付きアクセスを構成する際、この RAC 取得が制御されます。
  キュメント閲覧時に都度制御されるわけではありません。

## クライアント ライセンサ証明書 CLC
* RMS サーバーのキーペアのうち公開鍵を持ちます。
* CLC の公開鍵は、RAC の公開鍵で暗号化されます。

## 使用ライセンス EUL
* 初めて文書を解読するにはサーバーへのアクセスが必須となります。これをライセンシングといいます。
* オフラインアクセスが許可されている場合は この EUL が端末に保存・利用されることで、RMS サービスとの接続無しに閲覧が可能となります。
* SPC/RAC/CLCと異なり、ドキュメント毎に存在するため、複数存在します。
* 有効期限は、権利ポリシーテンプレートにより制御可能です。

### 保護時
RMSサービスとの接続は行われません。そのため、RMS の利用状況ログ (Get-AipServiceUserLog) にも記録が残りません。

### 開封時
RMS サービスとの接続が行われ、EUL 取得の動作が発生します。
OCIでRadiko録音

#はじめに
自宅iMacでRadikoの録音をしてiPhoneで聴いていましたが、当然録音中はiMacの電源をつけたままにしなければならず、不便でした。
せっかくなのでクラウド上で録音できるようにしてみました。現時点、永久無料でVMが作れるのは、Google Cloud Platform(GCP)かOracle Cloud Infrastructure(OCI)のいずれかになりますが、諸々見ると圧倒的にOCIがお得です。なんと、OCIは2つのVMとDB、100GBのストレージ、ロードバランサなどが永久無料で使えます。また、GCPで無料なのは米国リージョンのみですが、OCIは日本のリージョンも選択可能です。Radikoは日本からのアクセスしか許可されていないので、OCIで決まりですね。

#OCIのサインアップ＆環境構築
サインアップはとても簡単、クレジットカードを登録する必要がありますが、勝手に引き落とされることはありません。下記リンク先から登録するだけです。１つだけひっかかったのは、モバイル番号で頭の０を取る必要があります。待てど暮らせど何の連絡も来ず、気がつくのに時間がかかりました。

https://www.oracle.com/jp/cloud/free/

登録完了後は、以下チュートリアルに従って、仮想ネットワーク作成、インスタンス作成を行います。とてもシンプルで分かり易いのですぐに作成できます。リージョンは東日本、OSは個人的趣味でubuntu 20.04にしました。

[チュートリアル : Oracle Cloud Infrastructure を使ってみよう](https://community.oracle.com/docs/DOC-1019313?fbclid=IwAR3_pJG0F3BXInlx_f4Jsx0H7F3KMBMwjHWoYWEUshjpigfpKf0EEfBrIfw)
[クラウドに仮想ネットワーク(VCN)を作る - Oracle Cloud Infrastructureを使ってみよう(その2)](https://community.oracle.com/docs/DOC-1019114)
[インスタンスを作成する - Oracle Cloud Infrastructureを使ってみよう(その3)](https://community.oracle.com/docs/DOC-1019204)

#sshによるアクセス
VMが出来てグローバルIPが割り当たれば、外部からSSHでアクセスできます。macにはsshが既にインストールされてますので、キーを生成、OCIに公開鍵（id_rsa.pub）を登録するだけで即アクセスできます。

```
% mkdir ~/.ssh
% chmod 0700 ~/.ssh
% cd ~/.ssh
% ssh-keygen -t rsa
```
configに記載しておけば、省略コマンドでアクセスできるようになります。ちなみにmacのFinderでドットファイルを表示するには、shift + command + . を押せば表示／非表示となります。

```~/.ssh/config
Host oci
        HostName xxx.xxx.xxx.xxx
        User ubuntu
```

```
% ssh oci
Enter passphrase for key '/Users/vfr/.ssh/id_rsa':
ubuntu@vm1:~$ uname -a
Linux vm1 5.4.0-1015-oracle #15-Ubuntu SMP Fri Jun 5 01:39:12 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
```
#Radiko録音スクリプト
自作スクリプトは2021年1月に動かなくなってしまったため、以下を使わせて頂きました。

https://github.com/uru2/radish

#OCI ubuntuへのパッケージインストール
パッケージインストールはaptを使います。

```
$ sudo apt update
$ sudo apt install ffmpeg
$ sudo apt install libxml2-utils
$ sudo apt install jq
```

#cronの登録
TimezoneをJSTにしましょう。

```
$ sudo timedatectl set-timezone Asia/Tokyo
$ date
Sun Jul 19 02:10:16 JST 2020
$ sudo /etc/init.d/cron restart
Restarting cron (via systemctl): cron.service.
```

録音したい番組をcrontabで登録します。

```
$ crontab -e
# Power Rock Today
0 1 * * 0 cd /home/ubuntu/radio/mp3; /home/ubuntu/bin/radi.sh -t radiko -s BAYFM78 -d 240 1>/home/ubuntu/log/PRT.log 2>&1
```

#最後に
ついでにosxfuseも紹介。ssh経由でファイルシステムをマウントできます。Finderでファイルのやり取りが出来るのでとても便利です。

https://techracho.bpsinc.jp/hachi8833/2019_02_05/66454

```
% sshfs ubuntu@xxx.xxx.xxx.xxx:/home/ubuntu ~/oci
Enter passphrase for key '/Users/vfr/.ssh/id_rsa': 
% mount|grep ubuntu
ubuntu@xxx.xxx.xxx.xxx:/home/ubuntu on /Users/vfr/oci (osxfuse, nodev, nosuid, synchronous, mounted by vfr)
```

Oracle Cloud Free Tieは、VMだけでなくAuonomous DBやAPEX等も期限なくFreeで使えます。太っ腹ですね。色々楽しめそうです。
Template Methodパターン

###ざっくりTemplate Method
スーパークラスで処理の枠組みを定め、サブクラスでその具体的内容を定めるようなデザインパターンをTemplate Methodという。
登場役はAbstractClass(抽象クラス)の役とConcreteClass(具象クラス)の役の2役。


###AbstractClass(抽象クラス)の役
AbstractClass役はテンプレートメソッドを実装する。
また、そのテンプレートメソッドで使っている抽象メソッドを宣言する。

````java
package templateMethod;

public abstract class AbstractDisplay {
	public abstract void open();
	public abstract void print();
	public abstract void close();

	public final void display() {
		open();
		for(int i = 0; i < 5; i++) {
			print();
		}
		close();
	}
}
````

###ConcreteClass(具象クラス)の役
AbstractClass役で定義されている抽象メソッドを具体的に実装する。
ここで実装したメソッドはAbstract役のテンプレートメソッドから呼び出される。

````java
package templateMethod;

public class CharDisplay extends AbstractDisplay {
	private char ch;

	 public CharDisplay(char ch) {
		 this.ch = ch;
	}

	@Override
	public void open() {
		System.out.print("<<");
	}

	@Override
	public void print() {
		System.out.print(ch);
	}

	@Override
	public void close() {
		System.out.println(">>");
	}
}
````

````java
package templateMethod;

public class StringDisplay extends AbstractDisplay{
	private String string;
	private int width;

	 public StringDisplay(String string) {
		 this.string = string;
		 this.width = string.getBytes().length;
	}

	@Override
	public void open() {
		printLine();
	}

	@Override
	public void print() {
		System.out.println("|" + string + "|");
	}

	@Override
	public void close() {
		printLine();
	}

	private void printLine() {
		System.out.print("+");
		for (int i = 0; i < width; i++) {
			System.out.print("-");
		}
		System.out.println("+");
	}
}
````

###呼び出し元

````java
package templateMethod;

public class Main {

	public static void main(String[] args) {

		AbstractDisplay cd = new CharDisplay('c');
		cd.display();

		AbstractDisplay sd = new StringDisplay("Hello,World");
		sd.display();

	}
}
//結果
//<<ccccc>>
//+-----------+
//|Hello,World|
//|Hello,World|
//|Hello,World|
//|Hello,World|
//|Hello,World|
//+-----------+
````

###ロジックの共通化
Template Methodパターンを使うと、ロジックを共通化することができる。
今回のサンプルでは、スーパークラスのテンプレートメソッドにアルゴリズムが記述されているため、サブクラス側ではアルゴリズムをいちいち記述する必要がなくなる。

Template Methodを使わずコピペで複数のConcreteClassを作成した場合、
後にConcreteClassでバグが見つかった場合、全てのConcreteClassにバグの修正を行う必要がある。
Template Methodパターンを使用している場合、テンプレートメソッドにバグが見つかった場合でも
テンプレートメソッドさえ修正すれば良いということになる。

こちらを参考にさせていただきました。
<a href="https://www.amazon.co.jp/%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8%82%E7%89%88Java%E8%A8%80%E8%AA%9E%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E5%85%A5%E9%96%80-%E7%B5%90%E5%9F%8E-%E6%B5%A9/dp/4797327030/ref=sr_1_1?ie=UTF8&qid=1454743284&sr=8-1&keywords=java%E8%A8%80%E8%AA%9E%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E5%85%A5%E9%96%80">増補改訂版Java言語で学ぶデザインパターン入門</a>
Google Play In-App Review APIを簡単に使うためのライブラリを作成してみた

[Google Play In-App Review API](https://developer.android.com/guide/playcore/in-app-review) によって、Androidでもアプリ内からレビューの投稿ができるようになったので、レビューUIの表示をサポートするライブラリを作成しました。

[GitHub - ReviewPromptManager](https://github.com/hitting1024/ReviewPromptManager)

## 要件

Android 5.0 以上

## 使い方

### インストール

moduleのbuild.gradleに以下の依存を追加してください。

```gradle
implementation 'jp.hitting.review-manager:review-manager:0.0.1'
```

### 設定

Applicationクラスにて `daysUntilPrompt` と `usesUntilPrompt` を設定してください。

- `daysUntilPrompt`: レビューUIを表示するまでに必要な経過日数
- `usesUntilPrompt`: レビューUIを表示するまでに必要な起動回数
- `IS_DEV`: Google Play In-App Review APIの仕様で、Play Storeに公開したアプリでないとレビューUIを表示できないため、開発中は `IS_DEV` をtrueにしてください。
   - テスト方法は[こちら](https://developer.android.com/guide/playcore/in-app-review/test)を参考にしてください。
- `DEBUG`: trueにすると `daysUntilPrompt` や `usesUntilPrompt` に関わらず、必ずレビューUIが表示されます。

```kotlin
class MyApplication: Application() {
    override fun onCreate() {
        super.onCreate()

        ReviewPromptManager.daysUntilPrompt = 1
        ReviewPromptManager.usesUntilPrompt = 10
//        ReviewPromptManager.IS_DEV = true
//        ReviewPromptManager.DEBUG = true
    }
}
```

### 起動情報の記録

一番初めに表示されるActivityのonCreateで `launched(Context)` を呼び出してください。

```
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    ReviewPromptManager.launched(this)
}
```

### レビューUIの表示

レビューUIを表示したいところで、 `showReviewPrompt(Activity, PromptListener?)` を呼び出してください。

以下の条件をすべて満たす場合にレビューUIが表示されます。

- 初回起動からの経過日数 >= `daysUntilPrompt`
- 起動回数 >= `usesUntilPrompt`

また、PromptListenerを引数に渡せば、レビューUI表示フロー完了時、成功時、失敗時にそれぞれのメソッドが呼び出されます。

```kotlin
interface PromptListener {
    fun onComplete()
    fun onSuccess()
    fun onFailure(e: Exception)
}
```

## 今後

今後は重要イベントのカウントに応じてレビューUIを表示できるようにする等の実装をしていきたいと思います。

## 参考

- [【Android】In-App Review APIを使ってレビュー機能をサクッと作ろう](https://qiita.com/HaSuzuki/items/ec27a12c3969a51ac409)
React Native + Amplify + Cognitoのソーシャルログインでカスタムドメインを使う

## はじめに
仕事でReact NativeでamplifyとCognitoを使ってソーシャルログイン機能(Facebook/Google/Apple)を実装しています。
当初、Cognitoとソーシャルプロバイダー側でアプリ用のドメインをカスタムドメイン設定にすることで、ユーザーに違和感のないログインUXを提供しようと思っていたのですが、amplifyを使ってブラウザからアクセスする認証URLのドメインがデフォルトの値 (`your-user-pool-domain.auth.ap-northeast-1.amazoncognito.com`みたいなもの) から変更することが簡単にできなかったため、これをカスタムドメインに変更する方法を調べた結果をまとめました（先に言っておきますが、あくまでワークアラウンドです）。

## 前提条件
Cognitoの[カスタムドメインの設定](https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/cognito-user-pools-add-custom-domain.html)についてはすでに設定済みの上で話を進めて行きます。
Cognito > ユーザープール > アプリの統合 > ドメイン名 がこんな感じになっていれば大丈夫です。
<img width="720" alt="cognito.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266914/b3ef74a5-1d98-2c8d-0fda-3a7eba461bfc.png">

## Amplifyの接続先について
amplify/cliでauthの設定をすると `aws-exports.js`が生成されると思います。
このファイルの`oauth.domain`がソーシャルログインの認証URLのドメインになります。今回はこれを変更できれば一瞬で解決するのですが、このファイルは自動生成されるので直接変更しても意味がありません。

```javascript

// WARNING: DO NOT EDIT. This file is automatically generated by AWS Amplify. It will be overwritten.

const awsmobile = {
    "aws_project_region": "ap-northeast-1",
    "aws_cognito_identity_pool_id": "ap-northeast-1:your-pool-id",
    "aws_cognito_region": "ap-northeast-1",
    "aws_user_pools_id": "ap-northeast-1_your_id",
    "aws_user_pools_web_client_id": "1234567890",
    "oauth": {
        "domain": "your-user-pool-domain.auth.ap-northeast-1.amazoncognito.com",　// ← これ
        "scope": [
            "phone",
            "email",
            "openid",
            "profile",
            "aws.cognito.signin.user.admin"
        ],
        "redirectSignIn": "myapp://",
        "redirectSignOut": "myapp://",
        "responseType": "code"
    },
    "federationTarget": "COGNITO_USER_POOLS",
    ~
    ~
};

export default awsmobile;
```

また、amplify/cliが`oauth.domain`を生成する時の処理は以下のようになっているため、そもそもamplifyにカスタムドメインを設定できる方法自体がなさそうです。

```javascript

if (cognitoResource.output.HostedUIDomain) {
    domain = `${cognitoResource.output.HostedUIDomain}.auth.${projectRegion}.amazoncognito.com`;
  }
```

## 解決策（ワークアラウンド）
以下のように、`aws-exports.js`を読み込むためのモジュールを作成して、その中で認証URLのドメインをカスタムドメインに無理やり書き換えることで対処しました。

```javascript

import config from "./aws-exports";

config.oauth.domain = "your-app.com";
Amplify.configure(config);
```

基本的に、この[issue](https://github.com/aws-amplify/amplify-cli/issues/1880#issuecomment-626331305)のコードそのままです。
さらに、Production環境以外ではドメインはデフォルトで構わないので、開発環境によってドメインを切り替えられるようにしてあります。

## 後書き
たぶんほとんどのユーザーが気にもしない部分の対応ですが、ライブラリの余計な制約から解放されて少しでもコントロールできるようになるのは良いことですね。
「pythonでヤコビアンや偏微分をやってみた」を参考に、wolframalphaで実行してみた。

積分の確認をお願いします。

(オリジナルポスト)

https://qiita.com/strict39275/items/6aaac7c51e150fb92eaa

#プログラムコード　基本的なライブラリ
 
https://ja.wolframalpha.com/input/?i=sin+x

d/dx(sin(x)) = cos(x)



https://ja.wolframalpha.com/input/?i=exp%28x%29

d/dx(exp(x)) = e^x


https://ja.wolframalpha.com/input/?i=x**4%2Bx**3%E3%81%AE2%E9%9A%8E%E5%BE%AE%E5%88%86

d^2/dx^2(x^4 + x^3) = 6 x (2 x + 1)


https://www.wolframalpha.com/input/?i=x**2%2Bx*y%2B2*y**2%E3%81%AE%E5%81%8F%E5%BE%AE%E5%88%86&lang=ja

d/dx(x^2 + x y + 2 y^2) = 2 x + y

？？？？？？？？２重積分

https://ja.wolframalpha.com/input/?i=%EF%BC%92%E9%87%8D%E7%A9%8D%E5%88%86&assumption=%7B%22F%22%2C+%22DoubleIntegral%22%2C+%22rangestart2%22%7D+-%3E%222%22&assumption=%7B%22F%22%2C+%22DoubleIntegral%22%2C+%22rangeend1%22%7D+-%3E%222%22&assumption=%7B%22F%22%2C+%22DoubleIntegral%22%2C+%22rangestart1%22%7D+-%3E%220%22&assumption=%7B%22F%22%2C+%22DoubleIntegral%22%2C+%22integrand%22%7D+-%3E%22x%2B2*y%22&assumption=%7B%22F%22%2C+%22DoubleIntegral%22%2C+%22intvariable2%22%7D+-%3E%22y%22&assumption=%7B%22MC%22%2C+%222%E9%87%8D%E7%A9%8D%E5%88%86%22%7D+-%3E+%7B%22Calculator%22%7D&assumption=%7B%22F%22%2C+%22DoubleIntegral%22%2C+%22intvariable1%22%7D+-%3E%22x%22&assumption=%7B%22F%22%2C+%22DoubleIntegral%22%2C+%22rangeend2%22%7D+-%3E%223%22
integral_0^2 integral_2^3 (x + 2 y) dy dx = 12

https://live.sympy.org/

print(integrate(x+2*y,(x,0,2),(y,2,3)))
12

#二変数関数のグラフ表示


https://ja.wolframalpha.com/input/?i=3*x**2%2B6*x*y%2B3*y**2%2Bx**3%2By**3

極大値:
(x, y) = (-4, -4) のとき, max{3 x^2 + 6 x y + 3 y^2 + x^3 + y^3} = 64


https://www.wolframalpha.com/input/?i=Plot3D%5BSin%5Bx%5D+Cos%5By%5D%2C+%7Bx%2C+0%2C+5%7D%2C+%7By%2C+1%2C+10%7D%5D&lang=ja



以降、難しくてわかりませんでした。
DockerのLAMP環境でPHPからMySQL接続に詰まった話

# Dockerで環境作るの一瞬で便利だよね

下のブログを参考にLAMP環境を作りました。厳密には、Linux使わずDockerだからDAMPだね。
[Docker で Apache \+ PHP \+ MySQL 環境構築 – WebSpaceBlog](https://webspace.jp/blog/229/)

ブログよりも簡略化しています。

## Docker-compose.yml

参考ブログと同じにしたので割愛

## フォルダ構成
    /
    ├─mysql
    │  ├─data
    │  │  ├─mysql
    │  │  ├─performance_schema
    │  │  ├─sys
    │  │  └─test
    │  └─init
    ├─php
    │  ├─Dockerfile
    │  └─php.ini
    └─www
        └─html

## php/Dockerfile

もう最小限です。

```
FROM php:7.1.5-apache
RUN apt-get update && docker-php-ext-install mysqli pdo_mysql
```

## php/php.ini

```module mysqli```だけコメントを解除して入れました

# 意気揚々とPHPのソース作ってたら詰まった

で、以下のソースを作ったところ、エラーが出ました。

## www/html/index.php

```
<!DOCTYPE html>
<html>
    <head><title>テストだ</title>
    <?php
        $link = mysqli_connect('localhost','root','password','test');
        mysqli_set_charset($link,'utf8');
        $result = mysqli_query($link, 'SELECT * from link');
        $row = mysqli_fetch_assoc($result);
    ?>
    </head>
    <body>
       ※省略
    </body>
<html>
```

## エラー

```
Warning: mysqli_connect(): (HY000/2002): No such file or directory in /var/www/html/index.php on line 5
```

*No such file or directory*とは？

SQLサーバーがうまく指定できていないのかな？というところは行き着いたので、docker-compose.ymlで指定しているMySQLのポートを指定。次のように変えたけれどうまく行かず。

## index.php（修正）
```
mysqli_connect('localhost:3306','root','password','test');
```

## エラー2回目
```
Cannot assign requested address in /var/www/html/index.php on line 5
```

*Cannot assign requested address*だなんて、もうアドレスとして認識されてないじゃないですか、ヤダー。

# 結論

どうもMySQLサーバーに対する指定の仕方が間違っているのは間違いない。これは、仕方あるめえと小一時間調べたところ、以下の記事に行き着く。

[Dockerで動かしているMySQLに作成したユーザーでPHPから接続できないときの対処方法 – CodeAid（コードエイド）](https://codeaid.jp/blog/docker-mysql-php/)

> エラーの発生する原因を結論からいうと、ユーザー作成時に’localhost’を指定しているからです。
> Docker以外で構築されたLAMP環境（例えば：VMのLinux、XAMPP、MAMPなど）ではドメインのlocalhostでMySQLと接続できるためエラーは発生しません。
> しかし**DockerのMySQLは外部アプリなどからlocalhostで接続することができません。**
> （中略）
> MySQLと接続するときに指定するhostはローカル環境だと一般的には「localhost」となります。
> ですが**Dockerの場合はlocalhostでは接続できず、サービス名で接続する必要があります。**
> この場合、DockerのMySQLは「mysql」というサービス名で動作しているのでこのような記述となります。
> サービス名で接続したあとでDockerではローカルアドレスを自動で割り振ります。
> それが、エラーメッセージで表示されていた「172.19.0.3」です。
> **つまりlocalhost（172.0.0.1）では接続できないのです。**
> なのでデータベースにユーザーを作成するときにホスト名をlocalhostとすると上記エラーが発生してしまいます。

~~そんなDockerの仕組みわかんねーよー！~~

勉強不足なだけですねー。ということで、mysqli_connectをmysqlに指定することとして、最終的にphpを以下のように修正しました。

## www/html/index.php

```
<!DOCTYPE html>
<html>
    <head><title>テストだ</title>
    <?php
        $link = mysqli_connect('mysql','root','password','test');
        mysqli_set_charset($link,'utf8');
        $result = mysqli_query($link, 'SELECT * from link');
        $row = mysqli_fetch_assoc($result);
    ?>
    </head>
    <body>
       ※省略
    </body>
<html>
```

# 結論

Dockerの仕様はなかなか沼がありそうですねえ…。ちゃんと勉強すればすぐに分かるのかもしれませんが、インターネットで調べながらの付け焼き刃ではいけませんねえ。

日々勉強いたしましょう。
condaコマンドチートシート

## 概要
Pythonのパッケージなどを管理したい！
condaで仮想環境を作りたい！
作った環境を新しいPCなんかで再現したい！

という方に向けて、そして自分の備忘録として、condaのコマンドをまとめました。
他にもいろいろコマンドはありますが、特に使いそうなものだけ集めています。

コマンドの詳しい説明等はしていないので、condaって何それ、おいしいの？という方は、一度チュートリアル的な記事を探したほうがいいかもしれません。
あくまで、チートシート的な目的で使っていただけたら嬉しいです。

あと、condaを使っていく流れとして

- 一覧表示
- （仮想環境作成）
- 環境に入る
- パッケージ管理
- （環境再現のためのリストを出力）
- 環境から出る
- （環境の削除）

みたいな流れになると思うので、そんな流れを意識して書きました。

## condaコマンド

### conda環境の一覧表示

```
conda info -e
```

### パケージ一覧表示

- 現在のconda環境のパッケージ一覧表示

```
conda list
```

- 指定したconda環境のパッケージ一覧表示

```
conda list -n py38
```

### 仮想環境作成

- pythonバージョンを指定して作成

```
conda create --name py38 python=3.8
```
```
conda create -n py38 python=3.8
```

- 仮想環境をコピーして作成

例：baseをコピーしてpy38を作る

```
conda create -n py38 --clone base
```

- 環境再現のためのリストから環境を再構築

```
conda create -n py38 --file package-list.txt
```

### conda環境有効化

```
conda activate py38
```

### パッケージの検索

```
conda search tensorflow
```

### パッケージインストール

- インストール

```
conda install tensorflow
```

-  バージョン指定してインストール

```
conda install tensorflow=1.15
```

### パッケージの更新

- パッケージを最新に

```
conda update tensorflow
```

- すべてのパッケージを最新に

```
conda update --all
```

### パケージの削除

```
conda remove tensorflow
```

### 環境再現のためのリストを出力

```
conda list --export > package-list.txt
```

### conda環境の終了

```
conda deactivate
```

### 仮想環境の削除

```
conda remove -n py38 --all
```

## 参考
https://qiita.com/yasushi-jp/items/7ce0975db7a7e9ac7991
https://qiita.com/WestRiver/items/cce9c99076d59abd3f69
Linuxコマンドのお勉強と挫折

# つまり
* Linuxを日々使っているけど、知らないコマンドたくさんあるな、と思った。
* `Ubuntu 20.04` で最初から入っているコマンドたちについて調べようと思った。
* 挫折した。

# 環境

`Ubuntu 20.04` をMicrosoft Storeから入手、インストール後に、`sudo apt update`と`sudo apt upgrade`実施済みの、WSL2上の環境。

```
> cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04.1 LTS"
```

# コマンド

まず、パスの通っているところにあるコマンド(実行ファイル)の数を数えてみた。(同名異バイナリもありそうだけど、ひとまず同一カウント)

```
> echo $PATH | sed "s/:/\n/g" | grep -v "^\/mnt" | while read d; do ls -1 "$d"; done | sort | uniq | wc -l
1339
```

1339、、知らないコマンドを一日1個ずつ覚えても数年はかかりそうなので、コマンドを全て把握するのは諦めることにした(挫折1)。

# パッケージ

コマンドは諦めたとしても、どんなパッケージがインストールされているのかは知っておきたい。

```
> apt list --installed | wc -l
608
```

608!?。無理っす(挫折2)。そこで、パッケージの依存関係から、様々なパッケージから参照されているパッケージは重要度が高いんだろうと考え、パッケージのreverse dependencyをざっくりカウントして、ランキングを見てみた。

```
> apt list --installed | sed "s:\/.*::" | while read p; do n=`apt-cache rdepends "$p" | wc -l`; echo -e "$n\t$p"; done | sort -rn -k1 | head
22107   libc6
6633    libstdc++6
5683    libgcc-s1
4427    perl
3140    libglib2.0-0
2508    zlib1g
2126    python3
1956    libgmp10
1596    libx11-6
1198    dpkg
```

`libc6`がトップだったが、パッケージで展開されるファイルを`dpkg-query -L libc6`で確認すると、libディレクトリに展開されるスタティックなオブジェクトばかりで、bin関係のディレクトリは無かった。そもそも、`lib`で始まるパッケージの多くはbinディレクトリへ展開されないようだ(除く`libc-bin, libpam-modules-bin, libglib2.0-bin, libcap2-bin, libperl5.30, libpam-runtime`)。では、ランキング上位の`perl`パッケージから見ていきたい。

```
> dpkg-query -L perl | grep "bin"
/usr/bin
/usr/bin/corelist
/usr/bin/cpan
/usr/bin/enc2xs
/usr/bin/encguess
/usr/bin/h2ph
/usr/bin/h2xs
/usr/bin/instmodsh
/usr/bin/json_pp
/usr/bin/libnetcfg
/usr/bin/perlbug
/usr/bin/perldoc
/usr/bin/perlivp
/usr/bin/perlthanks
/usr/bin/piconv
/usr/bin/pl2pm
/usr/bin/pod2html
/usr/bin/pod2man
/usr/bin/pod2text
/usr/bin/pod2usage
/usr/bin/podchecker
/usr/bin/podselect
/usr/bin/prove
/usr/bin/ptar
/usr/bin/ptardiff
/usr/bin/ptargrep
/usr/bin/shasum
/usr/bin/splain
/usr/bin/xsubpp
/usr/bin/zipdetails
```

、、、わりと見たことのないものが多い。必要になってから学ぶ、でも良いのではと思い直すことにした(挫折3)。

# 今後

もう少しminimal installな状態でやるべきだったかもしれない。そもそも、自分が何を目指していたのか見失ってしまった。
`coreutils`とか`bsdutils`とか`util-linux`のパッケージに入っているコマンドを学ぶところから始めた方がよさそうな気がしてきた。
GCPサービス一覧（名称：内容）

# サービスまとめ
参考（本）： https://amzn.to/3gRxm0m
GCPを理解する上で、まずはサービス名称とその内容について理解していく必要がある。
本「GCPの教科書」の内容に記載されているサービスを表形式でまとめたものです。

## コンピューティング
|名称|内容|
|:--|:--|
|ComputeEngine|基本となるIaaS、仮想マシンを簡易に操作|
|AppEngine|GCP上最古のPaaS、開発だけに集中でき、サバのメンテナンスが必要ないトラフィックの増減に応じてアプリの自動スケールアウト・インを行う。|
|KubernetesEngine|数分でコンテナクラスタおをセットっぷし、デプロイの準備を整えられる|
|CloudFunctions|イベント単位の関数プログラムを起動するためのサーバーレスな環境。様々なサービスと連携可能|

## ストレージ
|名称|内容|
|:--|:--|
|Bigtable|スケーラブルなNoSQL、ほぼ無限にスケールアウトすることが可能でデータ量の増大によって速度の低下が発生しない|
|Datastore|Bigtableの上位レイヤーに位置するNoSQL、インデックスなども貼ることが可能で、GAEからはAPIとして標準に利用可能|
|Firestore|NoSQL、Firebaseとの親和性が高い|
|Storage|オブジェクトストレージで用途に応じてストレージの種類を選択可能。１ファイルあたり５TBまでアップロード可能|
|SQL|フルマネージドRDBMS（MySQL|PosgreSQL）|
|Spanner|分散RDB、スケーラビリティと可溶性の両方を併せ持ち、データに対してStrongConsistency（強い一貫性）を保証する|
|Memorystore|フルマネージRedis|
|Filestore|フルマネージドNAS|

## ネットワーキング
|名称|内容|
|:--|:--|
|VPCネットワーク|仮想ネットワーク|
|ネットワークサービス|負荷分散（ロードバランサ）、DNS、CDNなどの付加サービス|
|ハイブリット接続|VPNなどの閉域接続|
|NetworkServiceTiers|プレミアムからGoogle網を使わないことで価格を抑えたネットワーク費用に変更可能|
|ネットワークセキュリティ|クラウドアーマーやSSLなど|

## Stackdriver
|名称|内容|
|:--|:--|
|Monitoring|GCPやAWSで動作するアプリに対してモニタリングを行う|
|Debugger|稼働中のアプリのフォウ斎場に対してソースコードからバグの調査を行える|
|トレース|リクエストのレイテンシ情報からアプリのパフォーマンスにおけるボトルネックを検知する|
|ロギング|GCPやAWSで動作するアプリに対して路銀を行う|
|エラーレポート|GCPやAWSで動作するアプリに対して診断を行い、問題を通知する|
|プロファイラ|アプリで使用するCPUやメモリのパフォーマンスを継続的に分析する|

## ツール
|名称|内容|
|:--|:--|
|CloudBuild|コンテナイメージのビルドを実行|
|ContainerRegistry|プライベートなコンテナレジストリを提供|
|SourceRepositories|プライベートGitリポジトリを作成できる|
|DeploymentManager|クラウドリソースを添付テーとで管理できる。YAMLを知用することで必要なリソースを定義可能|
|Endpoints|MObileBackend as a Serviceソリューション。Jaca/Pythonにアノテーションを付与するだけでRESTfulなAPIを構築できる|

## ビッグデータ
|名称|内容|
|:--|:--|
|BigQuery|低コストのビッグデータ解析用、SQLを使いデータ集計を実行でき、リアルタイム分析のために秒間数百万行のスピードでBigQueryに流し込める|
|Pub/Sub|フルマネージドのリアルタイムメッセージングサービス、秒間100万以上のメッセージの送信が可能|
|Dataproc|Hadoop、MapReduceなどの分散処理フレームワーク向けのマネージドサービス。代償様々な規模のクラスタを瞬く間に作成可能|
|Dataflow|ビッグデータに対してストリーミング・バッチ処理をフルマネージドサービス|
|IoTCore|IoTデバイスとGCPの各サービスを連携するサービス。IoTEdgeというエッジコンピューティングも含めたIoTサービス|
|Composer|フルマネージドApache Airflowサービスでタスクスケジューリング、モニタリングが可能|
|Genemics|ペタバイトのゲノムデータを解析することができるサービス|
|Dataprep|分析用データの検索、可視化、クレンジング、分析のための準備を容易にする。TrifactaツールをGCPで提供|
|MLEngine|機械学習向けマネージドプラットフォーム。TensorFlowフレームワークを利用することで様々な機械学習モデルが構築可能|

## 人工知能
|名称|内容|
|:--|:--|
|NaturalLanguage|自然言語のための機械学習サービス|
|TalentSolution|仕事・職業を探すためのサービス作成用のAPIなど|
|Translation|Googleにより学習済みのモデルを活用した機械学習のAPIサービス。言語ペアの間で翻訳を行い、対応言語ペアは数千に及ぶ|
|Vision|Googleにより学習済みのモデルを活用した機械学習のAPIサービス。画像の種類を高速に分別したり、物体や人物の解析など、画像認識に特化|
Carthage Error: Falling back to building from the source の対処法

### Cartahge Update Error

UIWebView の除去作業をする過程で久しぶりに RxSwift のバイナリをアップデートする必要があったので、
いつもの通り `carthage update --use-ssh RxSwift --platform ios` のような形でアップデートすると
こんな Error が出ました。

```
***  Skipped installing RxSwift.framework binary due to the error:
	"Incompatible Swift version - framework was built with 5.2.2 (swiftlang-1103.0.32.6 clang-1103.0.32.51) and the local version is 5.1.3 (swiftlang-1100.0.282.1 clang-1100.0.33.15)."

    Falling back to building from the source
```

これは

> このフレームワークは Swift5.2.2 を使ってビルドされてるから、お前が使ってる Swift5.1.3じゃ使いものにならんよ

 的なことを言っているので必然的に Swift5.1.3 でビルドした Framework が必要になります。

### 解決方法

Update の際に `--no-use-binaries` を使用することで Framework がローカル(今回の場合 Swift5.1.3)でコンパイルされ
プロジェクトで使用可能なバイナリとして生成されます。ただ、`--no-use-binaries` はそのプロジェクトをコンパイル
し直すためその分時間が多少かかります。

```
carthage update --use-ssh RxSwift --platform ios --no-use-binaries
```
javascripitのconstとは？

##JavaScriptにおけるconstとはなんでしょうか？

constで宣言された変数は、<B>再代入が不可能</B>になります。

他のプログラミング言語では`const`というキーワードはコンパイル時定数になることがほとんどですが、
JavaScriptでは単に<B>再代入不可になるだけ</B>です。
つまり、JavaScriptにおける`const`は、他のプログラミング言語における<B>final</B>と同じ動きをします。
`const`を使うのは<B>変数への再代入が不要な場合</B>、あるいは<B>再代入されたくない場合</B>になります。

つまり、JavaScriptでは<B>再代入が必要な場合</B>は`let`、<B>不必要な場合</B>は`const`を使用すればいいということになります。