OmniAICreator/Qiita-1.07M huggingface dataset:
[Docker+Windows]mysqlのdockerイメージがmy.cnfのマウントのエラーで起動しない時の対処法

# 問題

```
mysqld: [Warning] World-writable config file '/etc/mysql/my.cnf' is ignored.
```

というエラーがvolumeのmy.cnfファイルのマウントで起こっていて人用の備忘録です。
mysql8はmy.cnfの権限設定が適切でない(誰でも書き込みができてしまう）と起動しなません。
なので、my.cnfをイメージ内で適切に設定する必要があるが、
windows環境下ではlinuxのような権限設定はできないので、
一工夫する必要があります。

## 対策 マウントするmy.cnfファイルにwindowsでread-only(読み取り専用）をつける

文字どおりです。

フォルダから対象ファイルを右クリック→プロパティ→属性を読み取り専用

にしてやりましょう。
読み取り専用を設定した状態でvolumeにマウントするとマウント先で書き込み権限が消えます。
なので、この状態でコンテナを起動すればmy.cnfの権限設定が適切になり、エラーが解消されます。

久しぶりの投稿の割にひたすら短いですが、
かなり簡単な解決で感動したので残します。

参考：https://stackoverflow.com/questions/37001272/fixing-world-writable-mysql-error-in-docker

## 追記
記事作成から数年たっていますが、現在でも割と参照されているようなので、
Microsoftのドキュメントでwslでのwindowsとlinuxのアクセス権限について記載されている箇所も追記しておきます。

https://learn.microsoft.com/ja-jp/windows/wsl/file-permissions#drvfs-file-does-not-have-metadata-default
自分の意見を言う前に人の話を聴いてみるのがRespectのコツかもしれない

## サマリ
開発レビューでも、顧客対応でも、「自分の意見を言う前に人の話を聴いてみる」。

## 背景
日本企業で働いています。
私自身は社内では社歴だけは長いので黙っていれば無為に気遣われてしまうため、どう相手にそうさせないかに頭を使うことの方が多くなりました。客観的に見て非合理なことをただ独りよがりに頑張ってしまっているのは、ダサいです。

あと、自分の意見ばかりを推したくなったら良くない信号。

参考: [よい質問とは何か](https://qiita.com/e99h2121/items/cec6328806863f10b439)。

そうした矢先 [セキュリティスキャナー「Tsunami」、名称に関するIssueがクローズ。実は「津波早期警戒システム」が略されたものだったと釈明。ドキュメントで詳細に説明へ](https://www.publickey1.jp/blog/20/tsunamiissue.html) というのを読んで簡単なコツを発見。いきなり意見を言うより「まず意図を聞かせて」っていってみるの、シンプルだし良いかもしれません。

## 詳細

聞き方にも更にコツがありますね。詰問ではなくて、純粋に教えてもらえるように聞く。顧客サポートについても「あれ？どうしました？」の姿勢。


## 参考
有名な「HRT」というやつ。

- [大事な言葉・HRT～「Humility（謙虚）」、「Respect（尊敬）」、「Trust（信頼）」。ああなんて難しい](https://qiita.com/developer-kikikaikai/items/9e08fe0f8ee0eebaccab)
- [Qiitaの記事には絶対コメントを書いてはいけない (わけがない)](https://qiita.com/YumaInaura/items/5532cb4eea013b2f4a4b)
- [拝啓 本当は Qiita を書きたいのに、まだ迷っているあなたへ。](https://qiita.com/YumaInaura/items/4d2c602d59c62daa9344)
Swift UIButtonの使い方

今回は`UIButton`の使い方について書いていきます

`storyboard`からの接続を完了した後のコードです

```swift:ViewController.swift
import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var label: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func tappedButton(_ sender: Any) {
    }
    
}
```

buttonの接続は`outlet`ではなく、`action`にします

`tappedbutton関数`の中に処理を書いていきます
今回はlabelのtextを変更しましょう

```swift:ViewController.swift
import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var label: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func tappedButton(_ sender: Any) {
        label.text = "HelloWorld"
    }
    
}
```

これで`label`の`text`が`HelloWolrd`に変更されます

このままでは`text`が`HelloWorld`のままで終わってしまい面白くないので
`tappedButton関数`の中身を少し変更しましょう

```swift

@IBAction func tappedButton(_ sender: Any) {
        isValue.toggle()
        if isValue {
            label.text = "HelloWorld"
        } else {
            label.text = String(isValue)
        }
}
```

こうすると`isValue`が`true`の時`label`に`HelloWolrd`、`false`の時に`false`が表示されます

今回はこれで終わります
情報収集　～マシンラーニング編～

# 前置き

AI技術に関して、有益な情報が得られそうなサイトをまとめました。
自分に必要な情報を普段から浴びるようにしておきましょう。
ここ一年くらいは、Web系とか、Windows Form Applicationとか、色々勉強をせざるを得ない状況だったのですが。 (仕事なのでしょうがないですね) 
今年こそは、MLエンジニアになります。MLを全力で楽しむぞい!!

# 初学者、ビジネスサイド、ライブラリやモデルを分かりやすく解説
[AINOW](https://ainow.ai/)

企業での活用事例などビジネスサイドで有益な情報がまとまっています。
記事も見やすく、初学者が、機械学習の世界を知るため、良い足掛かりになりそうです。
かなり技術寄りの記事もあり、数式や理論的なことはおいておいて、ひとまずどんなものか知りたいというときには、このサイトを活用させていただいています。

おすすめ
[2019年はBERTとTransformerの年だった](https://ainow.ai/2020/02/25/183082/)
[機械学習エンジニアは10年後には存在しないだろう。](https://ainow.ai/2020/06/09/223778/)

# 海外の意見を日ごろから聞いておこう
[Medium](https://medium.com/)

こちらもコラム的な記事から、専門的なモデルの記事までたくさんそろっている。

おすすめ
[Why is Data Science Losing Its Charm?](https://towardsdatascience.com/why-is-data-science-losing-its-charm-3f7780b443f5)
[Getting Started with GANs Using PyTorch](https://towardsdatascience.com/getting-started-with-gans-using-pytorch-78e7c22a14a5)
[Keeping up with AI in 2019](https://medium.com/thelaunchpad/what-is-the-next-big-thing-in-ai-and-ml-904a3f3345ef)

# Wikipedia -英語-
[AI effect -wikipedia](https://en.wikipedia.org/wiki/AI_effect)

大学の教授の見解ではあるのですが、海外のwikipeidaはいいらしいです。
とにかく、wikipediaで調べるときは、英語のやつを見た方がいいというアドバイスをいただきました。

# 企業ブログ
[Google Blog](https://www.blog.google/technology/ai/)
[Facebook AI](https://ai.facebook.com/)
[Google AI Blog](https://ai.googleblog.com/)
[DeepMind](https://deepmind.com/blog)

# レベチな個人の方
[Sebastian Ruder](https://ruder.io/)

 # --------------------------------------------------- #
ほかにも、はてなブログやGitHunのトレンドなどいろいろありますね。
また、よさげなものが見つかれば、随時更新していこうと思います。
 # --------------------------------------------------- #


参考)
https://storialaw.jp/blog/3408
プライベートIPアドレスでData SafeにDBを登録する

Database Cloud Service、Exadata Cloud ServiceにプライベートIPアドレスしかアクセスできない場合でも、Data Safeを利用することが可能になりました。
ここでは新たに追加されたPrivate Endpointという機能で、それらのクラウドデータベースを登録・監視する方法を紹介します。

## OCI IAMに必要な追加の権限
Database Cloud Servcie、Exadata Cloud ServiceをData Safeに登録するためには、以下の権限をグループに付与する必要があります

allow group グループ名 to inspect db-nodes in tenancy
allow group グループ名 to inspect db-nodes in tenancy
allow group グループ名 to inspect vnics in tenancy	
allow group グループ名 to manage virtual-network-family in compartment コンパートメント名
allow group グループ名 to manage virtual-network-family in compartment コンパートメント名
allow group グループ名 to manage data-safe-family in compartment コンパートメント名

以降は、上記を付与されたグループのユーザーでData Safeを操作します

## Private Endpointを作成する

- Data Safe -> プライベート・エンドポイントの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/9e69c30c-6e8f-1272-8de7-82db2decf270.png)

- 以下の項目を指定し、プライベート・エンドポイントの作成をクリック
    - コンパートメント: プライベート・エンドポイントを作成するコンパートメントを指定
    - 仮想クラウドネットワーク: DBCS/ExaCSと同じ仮想クラウドネットワーク
    - サブネット: DBCS/ExaCSと同じサブネット
    - セキュリティリスト: Ingress/Exgressともポート1521をOPENしておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/2fc97d4d-d07f-9dac-096d-3b86d2464c11.png)

- 作成完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/4aee5e08-0a11-b922-e2a0-6b2109f5e665.png)

##データベースをData Safeに登録

- Data Safeが接続するためのユーザーをデータベースに作成

```
CREATE USER DATASAFE identified by password;
GRANT CONNECT, RESOURCE TO DATASAFE;
```

- Targets -> Registerをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/73c24b71-9c56-cc4e-ce46-fd9a5826e9fe.png)

- 登録するデータベースの情報を入力する。また、Download Privilege ScriptをクリックしてSQLスクリプトをダウンロード、作成したDATASAFEユーザーに必要な権限を付与する
    - Database with Private IP: Yes
    - OCID: Database CloudのOCID
    - Connection Type: 今回はTCP
    - ID Address: ホスト名ではなくPrivate IPアドレス
    - UB User Name:作成したDBユーザー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/08fcc43f-6b5c-8ebd-4ec0-694c05d9816e.png)

- SYSユーザーでスクリプトの実行

```
SQL> @dscs_privileges.sql
Enter value for USERNAME (case sensitive matching the username from dba_users)
-> DATASAFE
Setting USERNAME to DATASAFE
Enter value for TYPE (grant/revoke)
-> grant
Setting TYPE to grant
Enter value for MODE (audit_collection/audit_setting/data_discovery/masking/assessment/all)
-> all
Setting MODE to all
Granting AUDIT_COLLECTION privileges to "DATASAFE" ...
Granting AUDIT_SETTING privileges to "DATASAFE" ...
Granting DATA_DISCOVERY role to "DATASAFE" ...
Granting MASKING role to "DATASAFE" ...
Granting ASSESSMENT role to "DATASAFE" ...
Done.
Disconnected from Oracle Database 19c EE High Perf Release 19.0.0.0.0 - Production
Version 19.7.0.0.0
```

- 登録完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/e2720e6e-8859-696e-6c3a-2ea81e55be6a.png)

Private Endpointでデータベースを登録できるのはOracle Cloud DatabaseとExadata Cloud Serviceです。Autonomous Databaseは、まだPrivate IPでは登録できず、Public IPのみとなっています。(2020/7時点)

Oracle Data Safeの関連情報は[こちら](https://qiita.com/western24/items/4824e4b3799b824197c6)
VirtualBoxでクローンした後に設定し直したほうが良い箇所まとめ（CentOS6系）

# はじめに
クローン元と平行稼働するつもりなら、「すべてのネットワークアダプターでMACアドレスを生成」してクローンするのが無難と思われる

# MACアドレスが振り直される故に発生する問題を解決する

## クローンするとeth*がカウントアップされていく問題
参考URL：https://blog.lowaivill.com/development/eth0_device/

`/etc/udev/rules.d/70-persistent-net.rules`にクローン元の記載があるせい
NICの分だけ新規追加されているので、削除してNAMEのeth番号を振り直そう

※設定後、要再起動

```
reboot
```

## ifcfg-eth*ファイルのMACアドレスを変更
対象ファイル：`/etc/sysconfig/network-scripts/ifcfg-eth*`※NICの数だけあるはず
振り直されたMACアドレスはVirtualBoxのGUIから確認できる
固定IPを使うのであれば、このタイミングでIPも変えておこう
UUIDは振ってない場合自動設定してくれるので、設定されてる場合はコメントアウトとかしておくでOK

※設定後、要ネットワーク再起動

```
service network restart
```

ここまでの設定で、sshクライアントから接続できるようになるでしょう

# サーバー名を変更する
`/etc/sysconfig/network`のHOSTNAMEを変更

※設定後、要再起動

# `/etc/hosts`を設定

```
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
<IPアドレス> <ホスト名>
```

とりあえず現時点で思い浮かぶものはこれくらいかな？
Sequel proでSSHユーザ、SSHパスワード、SSHポートの欄がない時の対処法

# Sequel proでSSHユーザ、SSHパスワード、SSHポートの欄が見つからない
Sequel proを起動させ、SSHから接続しようとするとこの現象になってしまい、下記のようになっていました。この現象の対処法の記事がなかったので、参考になれば幸いです。
<img width="847" alt="スクリーンショット 2020-07-01 15.07.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624073/a2aa4a68-b363-8440-7501-0c39379cbe04.png">

# 対処法
一度、標準かソケットを選択してから再び、SSHを選択
<img width="845" alt="スクリーンショット 2020-07-01 15.07.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624073/a5bd8c9d-bc21-9459-263f-2a108cc1044a.png">
<img width="845" alt="スクリーンショット 2020-07-01 15.07.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624073/27b608fb-3d10-f7a3-799e-20bafadd1c98.png">
変数名に変数を組み込む

## 前提
- ruby on rails 6.0.0 を使用。

## やりたいこと
- 変数を命名する際に他の変数を組み込む。
- times文を繰り返す中で、それぞれに数字をつけてtimeの数だけ変数を作りたい。

## 方法
railsに最初から定義されている *instance_variable_set* というメソッドを使用する。

```
instance_variable_set("変数名", 代入したい値)
```
先につけたい変数名を、後にその変数に代入したい値を記述することで、任意の変数を作ることができる。
イコールで直接変数を作る方が簡単ではあるが、つけたい変数名を""で囲ってあるためにその内部で別の変数を扱うことができるというメリットがある。

```ruby:movies_controller.rb
def index
  Tag.all.length.times do |num|
    tag_point = 0
    Movie.where(tag_id: num + 1).each do |movie|
      tag_point += movie.evaluation
    end
    instance_variable_set("@tag#{num + 1}_point", tag_point)
  end
end
```
このようにすることで、タグの数だけ処理を行いそれぞれで *tag1_point, tag2_point* といった変数を作ることができるようになる。

## 終わりに
ひとつひとつレコードの数だけ処理を書くのは大変かつ効率が悪いため、 *length.times* でまとめようとしたところ、イコールで直接変数を作る方法では変数名に変数を含めることができなかった。
このメソッドを使うことで変数の命名がより自由になるので是非覚えておきたい。
指定したHTML要素にスクロール

JavaScript で指定した HTML 要素にスクロールさせます。自動的にフォーカスを移動させることなどを想定しています。

よくある処理だと思いますが、そのものズバリのサンプルが見当たらなかったので、実装を残しておきます。

<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="js,result" data-user="7shi" data-slug-hash="gOPXxre" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="ensureVisible">
  <span>See the Pen <a href="https://codepen.io/7shi/pen/gOPXxre">
  ensureVisible</a> by 七誌 (<a href="https://codepen.io/7shi">@7shi</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

このサンプルでは [Start] をクリックすると、0.5 秒ごとに選択位置を移動して、それに追随してスクロールします。

# 実装

.NET Framework の `ListView` には `EnsureVisible` というメソッドがあり、指定した項目が画面外にある場合はスクロールして表示することができます。

* [ListView.EnsureVisible(Int32) メソッド (System.Windows.Forms) | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.forms.listview.ensurevisible?view=netcore-3.1)

それを真似て HTML でも `ensureVisible` を実装しました。マージンと HTMLElement を指定します。HTMLElement は複数指定できます。

```javascript
function ensureVisible(margin, ...elems) {
  let rs = elems.map((elem) => elem.getBoundingClientRect());
  let tp = Math.min(...rs.map((r) => r.top   )) - margin;
  let bt = Math.max(...rs.map((r) => r.bottom)) + margin;
  if (tp < 0) {
    let top = pageYOffset + tp;
    scroll({ top, behavior: "smooth" });
  } else if (bt > innerHeight) {
    let top = pageYOffset + bt - innerHeight;
    scroll({ top, behavior: "smooth" });
  }
}
```

# 位置の指定

[getBoundingClientRect](https://developer.mozilla.org/ja/docs/Web/API/Element/getBoundingClientRect) は画面上の位置（相対座標）を取得します。スクロールすると変化します。

[scroll](https://developer.mozilla.org/ja/docs/Web/API/Window/scroll) はドキュメント上の位置（絶対座標）を指定します。そのため表示の開始位置 `pageYOffset` を足すことで補正します。今回の実装ではスムーズスクロールを利用しています。

```javascript
    scroll({ top: top, behavior: "smooth" });
```

スクロール量を指定する [scrollBy](https://developer.mozilla.org/ja/docs/Web/API/Window/scrollBy) もありますが、スムーズスクロールをサポートしていないため利用しませんでした。

# サンプル

サンプルでは 0.5 秒のウェイトを Promise で処理しています。

```javascript
function wait(timeout) {
  return new Promise((resolve, reject) => setTimeout(resolve, timeout));
}

start.onclick = async () => {
  for (let td of Array.from(table.getElementsByTagName("td"))) {
    ensureVisible(20, td);
    td.classList.add("selected");
    await wait(500);
    td.classList.remove("selected");
  }
  ensureVisible(20, moveToTop);
};
```

詳細は以下の記事を参照してください。

* [非同期APIをPromiseでラップしてasync/awaitで使う](https://qiita.com/7shi/items/a2bb35f27cd4a56f7bac)

# 経緯

音声合成の読み上げ位置を追うために実装しました。

* [カミュ『地獄のプロメテウス』（短編集『夏』より） - 七誌の開発日記](https://7shi.hateblo.jp/entry/2020/07/01/000419)
rubyの変数をjavascriptで使う。

色々方法はあるみたいですが、今回実行した方法。

##結論
```
index.html.erb



@test = { 'hoge' => 'huga', 'hogehoge' => 'hugahuga' }

<div id="hoge" data-hoge-id="<%= @test.to_json %>"></div>

<script>
  var test = $('#hoge').data('hoge-id');
</script>
```
たったこれだけでした。

他にも"gon"というgemを使っても実装できるとの事。
Deno v1.1.2でWebAssembly System Interface (WASI)が使えるようになったので試す

[Deno v1.1.2](https://github.com/denoland/deno/releases)で実験的にWebAssembly System Interface (WASI)が使えるようになった
そこでとりあえず適当な.wasmファイルをstd/wasiを介して実行してみる

Rustで書かれた次のようなWebAssemblyコードがあったとする

```rust:main.rs
fn main() {
  println!("hello")
}
```

```bash
rustup target add wasm32-wasi
rustc --target wasm32-wasi main.rs # main.wasm がつくられる
```

つくられた .wasm ファイルを読み込み、 `_start` エントリーポイントを介して実行する

```main.ts
import WASI from "https://deno.land/std/wasi/snapshot_preview1.ts";
const wasi = new WASI({});
const binary = await Deno.readFile("main.wasm");
const module = await WebAssembly.compile(binary);
const instance = await WebAssembly.instantiate(module, {
  wasi_snapshot_preview1: wasi.exports,
});
wasi.memory = instance.exports.memory;
instance.exports._start();
```

```bash
deno run --allow-read main.ts # => hello
```

実行できた
詳細とサポート状況に関しては [std/wasi](https://deno.land/std/wasi) を参照してほしい
Salesforce カスタム設定の【設定種別：リスト】が選べなくなった

１．Salesforce設定 ⇒【スキーマ設定】を選択
２．スキーマ設定画面から、【リストカスタム設定の種別を管理】を有効化
３．カスタム設定画面に戻って、設定種別にリストが選択出来るように
トラブル事案｜WordPressでエラー「返答が正しいJSONレスポンスではありません」

忘れないようにメモとして残します。

# 公開に失敗しました。エラーメッセージ：返答が正しいJSONレスポンスではありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283603/250de93c-dc60-3cf2-827a-b754118d178d.png)

* 投稿ページで新規保存（公開）しようとした際に表示されました

# 解決策
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283603/2e5f52fe-086e-a2d8-4642-aa0499890a4c.png)

* パーマリンク設定で再保存しました

# なぜ起きたのか（どんな場面で起きたのか）

* ローカル上でWordPressを使ってサイト構築　（URLは`http://localhost`）
* FTPでレンタルサーバーへアップロード
* データベースはphpMyAdminを使って、エクスポート＆インポート
* phpMyAdmin上でURLを本URLへ置換

データベースで直接URLを置換したことが原因だったのかしら...

同じエラーが表示された人は、とりあえずパーマリンク設定を再設定してみてください。
Git コマンド一覧

##リポジトリ
###リモートリポジトリを登録
```
git remote add origin URL
```

###リモートリポジトリURL確認
```
git remote -v
```

##ブランチ
###ローカルブランチの一覧
```
git branch
```

###リモートブランチ一覧
```
git branch --remote
```

###ローカル・リモートブランチ一覧
```
git branch --all
```

###ブランチ作成
```
git branch ブランチ名
```

###ブランチを新規作成&チェックアウト
```
git checkout -b ブランチ名
```

###リモートにブランチを登録
```
git push -u origin ブランチ名
```

###対象ブランチにチェックアウト
```
git checkout ブランチ名
```

###マージしたブランチ削除
```
git branch ブランチ名 --delete
```

###マージしたかどうかに関わらず削除
```
git branch -D ブランチ名
```

###リモートブランチ削除
```
git push --delete origin ブランチ名
```

##ワーキングツリーの状態確認
###普通に表示
```
git status
```

###短く表示
```
git status -s
```

##ステージング（インデックスにコミットするファイルを登録）
###指定したファイルを登録
```
git add ファイル名
```

###現在のディレクトリのファイルすべてを登録
```
git add .　
```

###git addを取り消す
```
git reset HEAD
```

##スタッシュ
###待避にコメントをつける
```
git stash save コメント
```

###退避させた変更の一覧
```
git stash list
```

###退避させた最新の変更を戻す
```
git stash apply
```

###指定する退避させた変更を戻す
```
git stash apply 番号(git stash list の番号)
```
###applyしたものを取り消す
```
下記を順に実行
git checkout --ours .
git reset
git checkout .
```

##コミット
###コミット
```
git commit -m コメント(-m コメント)
* -m 2つで2行にできる
```

###前回コミットした時点に戻す
```
git reset --hard HEAD
```

###特定のコミット時点に戻す
```
git reset --hard ハッシュ値(git logで確認できる)
```

###一つ前のコミットメッセージを修正する
```
git --amend -m コメント
```

###プッシュしたコミットメッセージをリモートリポジトリに再プッシュする
```
git push -f origin ブランチ名
```

##プッシュ
###リモートリポジトリにプッシュ
```
git push origin ブランチ名
```

###強制的にプッシュ
```
git push -f origin ブランチ名
```

###プッシュを取り消す
```
git revert コミットID
```

##マージ
###ローカルでマージ済ブランチ一覧表示
```
git branch --merged
```

###対象ブランチをチェックアウト中のブランチへマージ
```
git merge ブランチ名
```

###新しくマージコミットを作成してマージ
```
git merge --no-ff ブランチ名
```

##プル
###リモートの変更を取得
```
git pull origin ブランチ名
```

##フェッチ
###ローカルに無いリモートブランチ をローカルブランチとして作成
```
git fetch
git checkout ブランチ名
```

##ローカルの変更を戻す
```
git checkout ファイル名
```

##タグ
###追加
```
git tag -a タグ -m "コメント"
```

###プッシュ
```
git push origin タグ名
```

##その他
###.gitignore作成
```
touch .gitignore
```
AWS EC2入門 #2: AWSにSSH接続しよう

![aws.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665011/f8381eb4-1b0b-a0ab-f022-c2865dc77e06.png)

#クライアントソフトを使ってSSH接続をする

①インスタンスに接続し、パブリックDNSをコピーする
![img1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665011/0136d813-0a35-7f33-35ad-ea2ea3b03f96.png)

②PuTTYを起動し、Host Name (or IP Adress) にパブリックDNSをペーストする
![img2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665011/e5fcd1e1-df2c-df34-c683-c2cb7a3130a3.png)

③PuTTYgenを起動し、ConversionsからImport Keyを選択、前回ダウンロードしたpemファイルを指定する。
![img3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665011/dd85c6cb-c5d8-98b0-c3b9-f20455e50844.png)


④Save private keyをクリックすると、ppkファイルを保存することができるので、任意のディレクトリに保存する（pemファイルと同じ名前でも構いません）

⑤PuTTYの左側のメニューで、SSHからAuthを選択、Browseをクリックし、ppkファイルを指定する
![img4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665011/9ace7041-83f7-8871-b818-e6332b6b609a.png)

⑥Openをクリックすると、インスタンスにSSH接続できます
![img5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665011/4984eed3-fef5-6bae-97d1-9ef09056c878.png)

⑦ログイン名を聞かれるので、ec2-userと打ちます
![img6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665011/41e68bdf-88b9-9f0c-5292-4b85c9a6e5dc.png)
これで無事、ログインできました。

⑩今のままだとパッケージのバージョンが古いので、sudo yum updateと打ってアップデートします
![img7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665011/5c970f97-4a84-1fdd-62f2-c616956162ee.png)
上の画像のように表示されればアップデートは完了です。

#次回

セキュリティグループを変更してブラウザからアクセスできるようにします。

[AWS EC2入門 #3: AWSのセキュリティグループを変更しよう]
（学習メモ）Java 2級対策：出題範囲

自己学習用メモ
TBE

### 出題範囲
※3級出題範囲含む
※Java SE8で出題・解答する。

#### 演算子
演算子というのは算数や数学で使う、+(プラス)や-(マイナス)、=(イコール)、などの記号のこと
	
###### ①ビット演算子(&、^、|、~)
###### ②シフト演算子(<<、>>、>>>)
対象の値の各ビットを右または左へシフト

###### ③代入演算子(&=、^=、|=、<<=、>>=、>>>=)
変数に数字や文字を代入する時に使う演算子

###### ④instanceof演算子
あるオブジェクトの型を動的に判定するための演算子
・オブジェクトが、あるクラスのインスタンスか
・オブジェクトが、あるクラスの子クラスのインスタンスか
・オブジェクトが、特定のインターフェースを実装したインスタンスか

⑤ダイヤモンド演算子
例えば
List<String> a = new ArrayList<String>();を
List<String> a = new ArrayList<>();
のように省略して書ける


#### 制御文
Java 8で追加された
ラムダ式でプログラムを記述することで、コード量を減・読みやすくなる

#### クラスと継承	
クラスの修飾子　(省略時)、public、final、abstract
継承とは　extends
型変換(キャスト)
thisとsuper
インタフェース　implements

#### 変数とメソッド	
変数とメソッドの修飾子　(省略時)、public、protected、private、final、static

##### オーバーライドとは
親クラスで定義されているメソッドを、子クラスで再度定義すること
オーバーライドは継承関係をもつ2つ以上のクラスで発生

##### オーバーロードとは
同一クラスの中で同じ名前のメソッドを定義すること
名前は同じですが、引数の数、引数の型、並び順は別のものを定義

#### 総称	
Java SE6まで　：「総称」
Java SE7以降：「ジェネリクス」

#### コレクションクラス
- 「List」「Set」「Map」はインターフェースとして用意されている
- 実際に使用する際には、これらのインターフェースを実装したクラスを使用
・よく使われるのはListのArrayList
・List・・・インターフェース
・ArrayList・・・・Listを実装したクラスになります。
・ArrayListのようにコレクション・フレームワークのインターフェースを実装したクラスのことをコレクションクラスという

#### パッケージ	
パッケージとクラスパス
クラスパス
パッケージの定義　package
パッケージの利用　import


#### 例外処理	
例外の定義
例外処理　try～catch?finally
throw
throws


#### スレッド	
スレッドとは
スレッドの作成
PowerShellのGet-ADUser繰り返し処理を高速化

# 背景
PowerShellのGet-ADUserコマンドレットをつかって、Active Directoryから数千件以上の単位でユーザオブジェクトを取得後、ユーザの属性を使って繰り返し処理をすると、非常に遅くなります。

例えばこんな感じです。

```PowerShell:Sample01.ps1
$users = Get-ADUser -Server MyADServer01:3268 -Filter { enabled -eq $true } -Properties SAMAccountName,mail,department,lastLogonDate

foreach ($user in $users) {
    if ($user.lastLogonDate -lt (Get-Date).AddMonths(-6)) {
        # 何かの処理
    }
}
```

繰り返し処理内部の各ユーザのプロパティーは、どうやらそのつどActive Directoryへ問合せが発生するようで、パイプラインを使っても速度は改善されません。

SearchBaseオプションで検索対象のOUを限定しても、戻り値のユーザ数を大幅に減らさない限り処理速度は大きく変わりません。

また、いったん連想配列に代入しても、メモリ上にキャッシュしてくれるわけではないようで、やはり問題は解決しません。

StackOverflowにもこの質問はいくつか見つかりましたが、決定打となる回答はありませんでした。

ところが、非常にシンプルな解決法を偶然見つけました。

# いったんCSVファイルに書き出すだけ

Export-CsvでGet-ADUserの結果をいったんCSVファイルに書出し、Import-Csvで連想配列に読み込みましょう。

```PowerShell:Sample02.ps1
Get-ADUser -Server MyADServer01:3268 -Filter { enabled -eq $true } -Properties SAMAccountName,mail,department,lastLogonDate |
Export-Csv -Path .\temp.csv -Delimiter "," -Encoding UTF8 -Force

$users = Import-Csv Path .\temp.csv -Delimiter "," -Encoding UTF8

Remove-Item -Path .\temp.csv
```

これだけでメモリにキャッシュしてくれるようで、繰り返し処理が場合によっては2桁のレベルで高速化します。

以上
LaravelでMISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk.が出た

## 発生したエラー
```
MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk.
```

## 環境
Laravel 5.6
PHP 7.1
ローカル環境です。

## 何が起きたか
ローカルで開発中に、redisのエラーが発生したようです。
詳細な原因は不明で、決済処理か何かをローカルで実施して失敗後に発生した。

## エラーハンドリングされたコード

`/vendor/predis/predis/src/Client.php`

```php5
    /**
     * Handles -ERR responses returned by Redis.
     *
     * @param CommandInterface       $command  Redis command that generated the error.
     * @param ErrorResponseInterface $response Instance of the error response.
     *
     * @throws ServerException
     *
     * @return mixed
     */
    protected function onErrorResponse(CommandInterface $command, ErrorResponseInterface $response)
    {
        if ($command instanceof ScriptCommand && $response->getErrorType() === 'NOSCRIPT') {
            $eval = $this->createCommand('EVAL');
            $eval->setRawArguments($command->getEvalArguments());

            $response = $this->executeCommand($eval);

            if (!$response instanceof ResponseInterface) {
                $response = $command->parseResponse($response);
            }

            return $response;
        }

        if ($this->options->exceptions) {
            // ここのthrowの処理に入った
            throw new ServerException($response->getMessage());
        }

        return $response;
    }
```

## 対応
PC自体を再起動したらエラーが消えていました。

Laravelの再起動（php artisan serve をやり直した）では解決できませんでした。
なお、Laravelのtinkerでキャッシュクリアの方法はわからず試していません。
windowsでiverilog その41

#概要

windowsでiverilogやってみた。
float32やってみた。
加算やってみた。

#参考にしたページ

https://qiita.com/wcrvt/items/e20b26eafba365056916

#修正


```
			//man_abs_reverse <= {<<{man_abs_buf1}};
			for (i = 25; i >= 0; i = i - 1)
				man_abs_reverse[25 - i] = man_abs_buf1[i];
```

#テストベンチ

0.1 + 0.2
期待値　3e99999a

```
module test();
	wire [31:0] out;
	wire [31:0] a = 32'h3dcccccd;
	wire [31:0] b = 32'h3e4ccccd;
	reg ena;
	reg clk = 0;
	sf_add u(.clk(clk), .ena(ena), .in1(a), .in2(b), .out(out));
	initial
	begin
		$monitor("%h %h %h", a, b, out);
	end
	always #1 clk = ~clk;
	initial
	begin
		ena = 0;
		#10
			ena = 1;
		#100
			$finish();
	end
endmodule
```
#実行結果

```
3dcccccd 3e4ccccd xxxxxxxx
3dcccccd 3e4ccccd 00000000
3dcccccd 3e4ccccd 3e000000


```
以上。
windowsでiverilog その40

#概要

windowsでiverilogやってみた。
float32やってみた。
乗算やってみた。

#参考にしたページ

https://qiita.com/wcrvt/items/e20b26eafba365056916

#テストベンチ

0.2 * 0.5
期待値　3dcccccd

```
module test();
	wire [31:0] out;
	wire [31:0] a = 32'h3e4ccccd;
	wire [31:0] b = 32'h3f000000;
	reg ena;
	reg clk = 0;
	sf_mlt u(.clk(clk), .ena(ena), .in1(a), .in2(b), .out(out));
	initial
	begin
		$monitor("%h %h %h", a, b, out);
	end
	always #1 clk = ~clk;
	initial
	begin
		ena = 0;
		#10
			ena = 1;
		#10
			$finish();
	end
endmodule

```

#実行結果


```


3e4ccccd 3f000000 xxxxxxxx
3e4ccccd 3f000000 00000000
3e4ccccd 3f000000 3dcccccd



```

以上。
【chart.js】X軸の間隔の調整

ラズパイで室温と湿度ラズパイのCPU温度をchart.jsで書いてみたけど、X軸の間隔が微妙すぎる。

![スクリーンショット 2020-07-01 12.44.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136271/3ae4e8de-7328-94be-fc7f-a64c3d91fc44.png)

理想は1時間単位のX軸にしたい。

#取得時の時刻をタイムスタンプにする
取得時の日時をタイムスタンプとすることでX軸でのメモリ幅のオプション`stepSize`に任意な数字を入れて区切ることができるのではないかと思った。


```javascript
...中略...
          ticks: { // 目盛り
            // fontColor: "red", // 目盛りの色
            // fontSize: 14 // フォントサイズ
            begintZero: true,
            minRotation: 0, // ┐表示角度水平
            maxRotation: 0, // ┘
            maxTicksLimit: 24,
            stepSize: 20,
          }
...中略...
```

しかし、Y軸のstepSizeは機能するのにX軸のstepSizeが機能しない。

---
**Y軸の区切りを10単位に変更。X軸区切りは1500000000**
![スクリーンショット 2020-07-01 13.43.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136271/b353724c-73d2-8b38-a6f9-2dd32ef1cff3.png)
**Y軸の区切りが20単位に変更。X軸区切りは1500000000**
![スクリーンショット 2020-07-01 13.44.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136271/9f8ba034-51fd-7e09-e333-076259c11a84.png)
このようにX軸の区切りはなぜか変わらない。
chart.jsの使い方から始めなければいけないのか。。
特定のテストを実行するとChromeがクラッシュ

##Seleniumを使ってエラーの奈落に落ちて解決できたので備忘録

###エラーが出ていた時のdocker-compose.yml
```
version: '3'
services:
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: password
    ports:
      - '3306:3306'
    command: --default-authentication-plugin=mysql_native_password
    volumes:
      - mysql-data:/var/lib/mysql
  web:
    build: .
    command: bundle exec puma -C config/puma.rb
    environment:
      RAILS_ENV: development
    volumes:
      - .:/FANTRA
      - bundle:/usr/local/bundle
      - /app/vendor
      - /app/log
      - /app/.git
    ports:
      - "3000:3000"
    depends_on:
      - db
    tty: true
    stdin_open: true
  chrome:
    image: selenium/standalone-chrome
    ports:
      - "4444:4444"

volumes:
  mysql-data:
    driver: local
  bundle:
    driver: local
```


###とあるテストで訳のわからんレベル100ぐらいのエラー出てきよった


```
Failure/Error: visit tourist_tourist_tours_path(tourist.id)
            
            Selenium::WebDriver::Error::UnknownError:
              unknown error: session deleted because of page crash
              from tab crashed
                (Session info: chrome=83.0.4103.61)
```

###同じエラーを抱えている運命の人を発見（参考URL）
https://patorash.hatenablog.com/entry/2020/03/02/143046

どうやらページクラッシュエラーが出るのはメモリが不足していることが原因だそう。


### もがき苦しんで解決方法を教えてくれた神様（参考URL）
https://github.com/elgalu/docker-selenium/issues/20#issuecomment-414495631

shm_size: 2gをchromeに書き加えてやったらメモリがデカくなってくれるみたい。

```
  chrome:
    image: selenium/standalone-chrome
    ports:
      - "4444:4444"
    shm_size: "2g"      ##追記
```


###まとめ
クラッシュするのは共有メモリが不足しちゃってるから起こっちゃう。
しかし、まだ理解できていない。エラー内容がざっくりしていてクラッシュしたらメモリを疑ってみる。
curl でDBやキャッシュの疎通確認もできる

# これは何

DBへのネットワーク的な疎通確認といえば、MySQLだったら mysql-client、Redisならredis-cliなど専用のコマンドが一般的ですが、単にネットワーク的に疎通を確認したいということであれば curl だけでもできます。

コマンドイメージ

```shell
$ curl -v telnet://hogehoge.com:3306
```


疎通確認をする一般的なコマンドといえば

* ping コマンド
    * メリット： だいたいどんなサーバにも入っている（気がする）
    * デメリット： 
        * icmp を通していないサーバの確認には使えないし、pingだけの確認だと実際には到達できていてもサーバに到達していないと勘違いを起こしやすい
        * トランスポート層のポートまで確認できない
* telnet コマンド
    * メリット： ホスト名とポートを指定できる柔軟なコマンド
    * デメリット： 接続を解除する方法がわかりにくかったりしてやや使いづらい
* curl コマンド
    * 一般的に http や https での接続確認
    * 使いやすい


# よくある curl の使い方（httpやhttpsに対する疎通確認）

```shell
$ curl -v https://hogehoge.com
```

のように http や https プロトコルを使って接続。

プロトコルをつけなかった時にはどうなるのか？
ubuntuで`$ man curl`をすると以下のような記述がありました。

```
If you specify URL without protocol:// prefix, curl will attempt to guess what protocol you  might
       want. It will then default to HTTP but try other protocols based on often-used host name prefixes.
       For example, for host names starting with "ftp." curl will assume you want to speak FTP.
```
プロトコルをつけないと、よく使われるスキーマが適当に試されるようです。

例えばローカルに立っているサーバに対してプロトコルを指定せずにlocalhostに対して叩くと、httpだと解釈されて実行されます。

```
$ curl -I localhost
HTTP/1.1 404 Not Found
Server: nginx
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/7.2.0RC6
Cache-Control: no-cache, private
date: Tue, 30 Jun 2020 09:27:28 GMT
```

# DBやキャッシュへの接続確認

とあるサーバ（ubuntu）からあるDBサーバに接続確認したいケースは以下のようになります。
telnetプロトコルを使用してポートを指定します。telnetはコマンド名だと思っていましたが、実際にはtelnetプロトコルというのがあるようでした。
参考: https://ja.wikipedia.org/wiki/Telnet

```
$ curl -v telnet://hogehoge.com:3306
* Rebuilt URL to: telnet://hogehoge.com:3306/
*   Trying xx.xx.xx.xx...
* TCP_NODELAY set
* Connected to hogehoge.com (xx.xx.xx.xx) port 3306 (#0)
Warning: Binary output can mess up your terminal. Use "--output -" to tell
Warning: curl to output it to your terminal anyway, or consider "--output
Warning: <FILE>" to save to a file.
* Failed writing body (0 != 29)
* Closing connection 0
```

上記出力はちょっとわかりづらいですが、接続自体は成功（Connected to hogehoge.comのところ）していて、出力を書き込むのに失敗しているような形。
ちょっと見ずらかったので使わなかったですが、出力の通りoutputオプションを使って`--output /dev/null` など指定するのもいいかもしれません。
ScalaでDDDのエンティティを表現する

# 前置き
ScalaでDDDを実践してみるにあたって検討したことをメモがてら書いていきます。今回はエンティティです。

# エンティティをイミュータブルにする
エンティティについては他の言語では多くの場合ミュータブルなオブジェクトで表現されるようです。
そして、ドメインモデルとしてのエンティティオブジェクトの生成をプログラム上のインスタンス生成と一致させます。
値の変更はミュータブルに処理されるのでインスタンスは生成されません。

しかしながらScalaの基本はイミュータブルです。必要があれば部分的にミュータブルにも書けますが、ドメインオブジェクトという重要な部分がミュータブルになるのは避けたいものです。

イミュータブルにするということは値の変更があればインスタンスが生成されることになるため他言語での実装とは異なる部分が増えていきます。これからこの点について検討していきます。

# 生成の制限
エンティティをイミュータブルにするとつい `case class` で表現したくなりますが、これは避けます。
DDDでは多くの場合コンストラクタまたはファクトリが生成をし、メソッドが変更を担当します。
`case class` は自動でファクトリや、 `copy` メソッドが生成されますが、これらは使用しないため不要です。

ここでは以下のようにします。

- 自分で定義したコンパニオンオブジェクトの `apply` メソッドか、ファクトリーオブジェクトを用いてエンティティの新規作成をする
- 変更メソッドは変更された新しいインスタンスを生成する
- デフォルトコンストラクタは上記2つとリポジトリからのみ呼び出される

これにより各制約は以下のように書き分けます。

- 常に守らなければならない制約（不変条件)はコンストラクタ（つまりクラス定義本体）
- 新規作成時のみの制約はコンパニオンオブジェクトの `apply`
- 変更時のみの制約は変更メソッド

デフォルトコンストラクタについてはアクセス制御すると良いでしょう。

# 例

上記をまとめると以下のようなコードになります。

```scala

class User private[model](
  val id: UserId,
  val name: Name
) {
  // あるなら不変条件を書く

  def updateName(newName: Name): User = {
    // あるなら更新時の条件を書く
    new User(id, newName)
  }
}

// コンパニオンオブジェクトで生成する場合
object User {
  def apply(id: UserId, name: Name): User = {
    // 新規作成時のみの制約はここに書く
    new User(id, name)
  }
}

// DI等が必要でファクトリーを作る場合
class UserFactory(idProvider: IdProvider[UserId]) {
  def apply(name: Name): User = {
    // 新規作成時のみの制約はここに書く
    new User(idProvider.get(), name)
  }
}
```

2020/7/6 例を追記
2021/4/6 全体的に文章を見直し。ファクトリーに関して追記
Pythonで実装する「RとStanではじめるベイズ統計モデリングによるデータ分析入門」

# Pythonで実装するベイズ統計モデリング
「RとStanではじめるベイズ統計モデリングによるデータ分析入門」はアヒル本よりも手軽にベイズ推定の実装に入門できる書籍です。
<img width="223" alt="スクリーンショット 2020-07-01 13.17.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105768/d0033e3e-d264-c80b-ded6-003e0cd4c79d.png">

アヒル本は統計モデルの座学的章がありますが、こちらはほとんどありません。
まずはやってみよう、というところから入る本です。
また、階層ベイズについての考え方は、アヒル本と合わせて読むことでより理解が深まるかもしれません。

## 何故Pythonで実装するのか
オフィシャルではこちらもRで実装があります。
最近はPythonを使う方が多いので、アヒル本だけでなくこちらもPythonで実装してみました。

## コード
PythoとPyStanで実装しています。

### Github
https://github.com/MasazI/python-r-stan-bayesian-model

何かありましたらプルリクエストをいただけると助かります。
点推定だけでなく、ベイズ推定も一般的に広まっていくといいのかな、と個人的に思っています。
Xcode11以降で、present-modally segue でFull Screen 表示させる方法。 

segue で　全画面表示（フルスクリーン）にするには、
ViewController同志の間の、segueの線をクリックして、
![スクリーンショット 2020-07-01 13.08.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606144/cd9d7dda-a20f-36ed-1691-395cc216c7f9.png)
![スクリーンショット 2020-07-01 13.09.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606144/ffe0e4d0-1537-7af8-b4ae-31a6ad2c4473.png)
フルスクリーンを選択。
border-radiusの一部のみ角を丸くする

# プログラミングの勉強日記
2020年7月1日　Progate Lv.148
ポートフォリオ作成中
`border-radius`を使うと4つ角すべて丸くなってしまう。
1つの角のみを丸くしたい。

##目標物
　1つの要素（左側のところ）は左の上下の角を、もう1つの要素（右側のところ）は右の上下部分の角を丸くさせたい。
<img width="953" alt="0701.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/41d55cf7-38ae-abf1-4635-9c7ff3ef57e7.png">

##一部の角を丸くする方法
　`border-radius`の間に上下左右を指定すれば、その部分の角を丸くすることができる。

```css:左上のみ丸くする場合
border-top-left-radius: 10px;
```

```css:左下のみ丸くする場合
border-bottom-left-radius: 10px;
```

```css:右上のみ丸くする場合
border-top-right-radius: 10px;
```

```css:右下のみ丸くする場合
border-bottom-right-radius: 10px;
```


##サンプルコード

```html:HTMLファイル
<div class="profile">
  <div class="contentLeft">
    ...
  </div>
  <div class="contentRight">
    ...
  </div>
</div>
```

```css:CSSファイル
.contentLeft{
    border-top-left-radius: 20px;
    border-bottom-left-radius: 20px;
}

.contentRight{
    border-top-right-radius: 20px;
    border-bottom-right-radius: 20px;
}
```
【AWS ElastiCache(Memcached)】基本構築とEC2からの接続

##目標
・AWS ElastiCache(Memcached)を構築し、EC2からの接続を確立する。

##ElastiCacheとは
AWSが提供するインメモリデータベースサービスです。
キーバリュー形式でデータが保存され、書き込み・読み込みが高速という特徴があります。
名前の通り、キャッシングに主に利用され、DBクエリ結果やWEBセッションのキャッシングとして主に活用されます。

※より詳しくは以下の記事参考
[AWS キャッシュ活用 ElastiCache](https://qiita.com/avicii2314/items/5cede09f01ee7c3a132e)

##参考AWSドキュメント
[Memcached クラスターの作成 (コンソール)](https://docs.aws.amazon.com/ja_jp/AmazonElastiCache/latest/mem-ug/Clusters.Create.CON.Memcached.html)

##作業の流れ
| 項番 | タイトル |
|:----:|:-------------|
| 1 | [ElastCacheクラスターの作成](#1elastcacheクラスターの作成) |
| 2 | [EC2からElastCacheクラスターへ接続](#2ec2からelastcacheクラスターへ接続)|
| 3 | [簡単なElastiCache(Memcached)コンソール操作](#3簡単なelasticachememcachedコンソール操作)



##手順
###1.ElastCacheクラスターの作成
**①AWS マネジメントコンソールにサインインし、Amazon ElastiCache コンソールへ（https://console.aws.amazon.com/elasticache/)**

**②ナビゲーションペインで`Memcached`を選択し、`作成`をクリック**
![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/0d375ae2-5180-e6a6-e8d3-f29d3c1e40c6.png)

**③作成するElastCacheクラスターの情報設定**
クラスターエンジン：`Memcached`を選択し、任意のクラスター名を入力します（※）
※`ノードタイプ`でメモリ容量の変更、`ノードの数`でクラスター内のノード数変更が可能です（耐障害性の向上に有用）
![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/b635ea4f-0bc8-a0d1-9485-abe30bfb68ef.png)

Elaticacheはサブネットグループ（複数AZを含んだ、サブネットの集合体）に配置されます。
未作成の場合は新規でサブネットグループを作成します。
以下のように値を選択or入力してください。
![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/64c3b329-467f-d453-b310-e907db073780.png)

セキュリティグループは、`11211番ポート`が開いているものを使用しなければならないことに注意します。
設定完了したら`作成`クリック
![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/99593569-7668-ec2b-34cb-86c251fb3ac9.png)

**④作成したElastiCatcheクラスターのステータスが`available`になることを確認**

###2.EC2からElastCacheクラスターへ接続
**①telnetインストール**
接続元EC2へログイン後、`sudo yum install telnet`実行

```bash

# Complete!と表示されること
$ sudo yum install telnet
(中略)
Installed:
  telnet.x86_64 1:0.17-49.9.amzn1

Complete!
```

**②ElastCacheクラスターへtelnet接続**
`telnet <end-point-name> <port>`実行

```bash

# 以下のような出力だったらOK
$ telnet test-cache.k8s3rn.cfg.apne1.cache.amazonaws.com 11211
Trying 172.31.62.249...
Connected to test-cache.k8s3rn.cfg.apne1.cache.amazonaws.com.
Escape character is '^]'.

```

###3.簡単なElastiCache(Memcached)コンソール操作
ほぼAWSドキュメントのコピペですがMemcachedコンソールの簡単な操作をしてみました。

```bash

# キーa（with no expiration and 5 byte value）及びバリュー'hello'セット
set a 0 0 5
hello
STORED
# キーaを取得
get a
VALUE a 0 5
hello
END
# キーbは存在しないのでMISS
get b
END
# 接続終了
quit
Connection closed by foreign host.
```

##次にやったこと
ElastiCacheを利用してRDSへのクエリをキャッシングさせるシステムを構築してみました。
[【AWS ElastiCache】AWS ElastiCache（Memcached）を利用してRDSへのクエリをキャッシング](https://qiita.com/aWdfcfG2jLr73pe/items/f1dfca652b88be4da4c0)
Jupyter NotebookでRを動かす（Windows10）ローカルアカウントでも。

`Jupyter Notebook`なんだから`R`も動かせないとね。
というわけで簡単だけどまとめておきます（古い記事が多かったので）。
手順としてはまずRとAnacondaをインストールします（原理的にはAnacondaでなくても大丈夫だと思うがまだ試してない）。
僕の環境`R 3.6.3`です。ver.4はまだ本格的に使っていないです。
インストールするRは以下のURLで好きなの選んでください。
Rのインストールは[このURL](https://cran.ism.ac.jp/bin/windows/base/old/)から。デスクトップにショートカット作っておいてください（パスとかわかってる人は作らなくてもいいです）。
Anacondaは[ここから](https://www.anaconda.com/products/individual)インストールすればいい。
（基本的に管理者アカウントでを想定しています。ローカルアカウントの場合は最後に。）

それが終わったらいよいよJupyterNotebookでRを動かせるようにしよう。
色んな記事が引っかかるが、大体は、Rを起動してコンソール画面上で、

```R
install.packages(c('repr', 'IRdisplay', 'evaluate', 'crayon', 'pbdZMQ', 'devtools', 'uuid', 'digest'))
devtools::install_github('IRkernel/IRkernel')
IRkernel::installspec()
```
の3行を実行すればいい。と書いてあるが、少なくとも僕の環境ではこの3行を実行しても使えるようにはならなかった。。
いろいろ状況が変わってるようなのでこれをアップデートします。

いろいろ試したり調べたりしていたが、必要なパッケージ（個人的に）は

```R
install.packages('IRkernel')
```
だけかなと。
ん？
そうなんです。`GitHub`じゃなくて`CRAN`にあるんです（格上げ？）。
多分まずはここが更新されたところ。
そしたらさっきのじゃインストールできないわな。

じゃああとは最初にあった3行目を実行して。。すると今度は

```R
> IRkernel::installspec()
IRkernel::installspec() でエラー: 
jupyter-client has to be installed but “jupyter kernelspec --version” exited with code 127.
追加情報:  警告メッセージ: 
system2("jupyter", c("kernelspec", "--version"), FALSE, FALSE) で: 
'"jupyter"' not found
```
のようなエラーが出現。出現しない人はこれで使えるようになってるはず。JupyterNotebook起動してみれば、`Python`の下に`R`が出現してるはず。
エラーが出た人は一度Rを閉じてください。
**最後のコマンドはJupyterNotebook側からRを起動して実行しなきゃいけない**
ということらしい。
というわけでやってみる。
`Anaconda Prompt`を管理者として実行する。
（スタートのAnacondaフォルダの中にあります。）
`system32`とか出てれば管理者として実行できてるはず。
そこからRを起動します（プロンプト画面にドラッグすれば起動するという記事もあったが、僕のはやはりできない）。
というわけでフルパスを指定して実行ファイル（`Rgui.exe`）を実行します。

```
C:\Windows\system32>"C:\Program Files\R\R-3.6.3\bin\x64\Rgui.exe"
```
僕の場合はProgram Filesの中にインストールしたみたいなので上のパスを指定しているが、これはみんな違うはず。
実行ファイルはどこにあるか？
とても簡単そうなやり方は、デスクトップ上にあるRのショートカットを右クリックして「プロパティ」みるとリンク先って場所に実行ファイルのパスが書いてあるからそれをそのままコピペすればいい。
そうするとプロンプトからRが起動します。
そして

```R
> IRkernel::installspec()
```
を実行すれば終わり。
ちゃんとできたかを確かめるにはJupyterNotebookを起動して、「New」をクリックして下の画像のようになってたら大丈夫。カーネルを切り替えるだけでRも動かせるようになります。
![JupyR.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543442/d6f011a9-e2dc-e8e8-73cb-171781ba52a3.png)

### ローカルアカウントの場合

ローカルアカウントとかだとこちらでうまくいかない。
管理者で実行などやるのが無理なので。。
その場合は次のように出来るっぽい。むしろこっちのほうが簡単かも。ちゃんと動くのか確認してないけど。。

- ローカルアカウントでログイン
- Anacondaを「Just me」でインストール（元々これが推奨されてるはず）
- インストールしたJupyterNotebookを起動
- 新規ファイル作成（Pythonでいいです。）
- `conda install r-irkernel`を実行
- JupyterNotebookを再起動

でうまくいく（一応俺のローカルアカウントでは確認済）。
これはconda社のパッケージみたいだね。VSCodeだとこけた。。

他にはウィルス対策ソフトとかが邪魔することもあるみたいだが、その場合はソフトを一旦停止させて10分くらいしてからインストールするとうまくいくとかいうのもあったりするみたい。
コンピュータの中身は大変ね。。
【Swift】ジェネリクスについて改めて調べてみた

業務でSwiftに携わり始めた頃、クラスやメソッド名の隣に書かれている`<>`の意味が分からずに困っていました。しかもなんて調べたら`<>`←この正体に出会えるのかも分からない。
随分後になってこれがジェネリクスという記法だということを知りました。

そんなジェネリクスについてまとめたいと思います。
## ジェネリクスとは
**汎用的な実装をするための技術です。**
通常関数の引数は`Int`や`String`など、型を決めて宣言します。もちろん宣言した型以外は変数に入れることはできません。しかしジェネリクスを使うと、同じ関数の引数に違う型を渡すことができるのです。

Swiftには`ジェネリック関数`と`ジェネリック型`があります。

## ジェネリック関数
型引数（`<>`で囲まれたやつ）をもつ関数のことです。

```swift
func get<T: Equatable>(_ x: T) -> T {
    // 返り値は引数と同じ型になる
    return x
}

get(1) // 1: Int
sum("a") // a: String

// 複数の引数を違う方で受け取りたい場合、型引数を2つ定義する
func get<T, U>(_ x: T, y: U) { }

get(1, "String")
```
`<T: Equatable>`は**Equatableプロトコルに準拠した型**を意味します。これを**型制約**と言います。
`sum(1, 2)`のように、ジェネリック関数またはジェネリック型に具体的な型引数を与えて型を確定することを**特殊化**と言います。

## ジェネリック型
型引数をもつクラスや構造体・列挙型のことです。

```swift
// クラス
class SampleClass<T> {}
// 構造体
struct SampleStruct<T> {}
// 列挙型
enum SampleEnum<T> {}
```


## 型の安全性は保たれるのか？
**ジェネリクスは汎用性と型の安全性を兼ね備えています。**対象にジェネリクスと同様に汎用的な実装を可能にする`Any`は型の安全性を備えていません。`Any`は暗黙的に型推論される為、具体的な型として扱いたい時はダウンキャストが必要になります。

```swift
func get<T: Equatable>(_ x: T) -> T {
    return x
}

get(1) // 1: Int

// ------- 先ほどのこれをAnyを使って実現させたい場合---------

func get(_ x: Any) -> Any { 
   if let intX = x as? Int { return intX }
}

let anyGet = get(1) // Any型
if let intGet = anyGet as? Int { // get(1)のInt型が取れる }

```
`Any`は具体的な引数を渡しても`Any`型のままなので、こんな感じで都度ダウンキャストする必要があります。

ジェネリクスと`Any`を使い分けて活用すればかなり汎用的な実装が可能になりそうですね。

＊2020/7/1 コメント頂きもう少し分かりやすく修正しました。
gitのローカルでステージ前の新規追加ファイルを削除する場合

gitのローカルでファイルの変更点を一度全てキレイにしたい場合や
ステージ前の新規追加ファイルを削除する時のメモです

## バージョン管理内のファイルの変更点をリセットする場合
```
git checkout .
```

## バージョン管理外（未ステージ）のファイルの追加分をリセットする場合
```
git clean -df .
```
AWS EC2入門 #1: AWSをはじめよう

![aws.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665011/3fcf0ab5-8018-f69a-dec8-05e6eb793b4f.png)


AWSに触れたことのない方向けの記事です。
AWSアカウントを作っていない方は、[ここ](https://aws.amazon.com/jp/?nc2=h_lg)で事前にアカウントを作っておいてください。

#インスタンスを作成する

①AWSマネジメントコンソールでEC2を開く
![img1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665011/89654b1b-2f8d-e821-7e0f-27ccc85270c4.png)

②リージョンを「アジアパシフィック(東京)」にする
![img2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665011/f02d4a45-b20e-56da-0c5e-bde5724fb091.png)

③左側のメニューから「インスタンス」を選択し、「インスタンスの作成」をクリックする
![img3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665011/f823c841-6a17-2270-81ec-855076471812.png)


④Amazon Linux2 AMI (HMI), SSD Volume Typeを選択する
![img4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665011/9ee5b4ab-984d-c4b8-f272-91cf306020c8.png)


⑤t2.micro [無料利用枠の対象] を選択し、右下の「確認と作成」をクリックする
![img5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665011/55b515c1-feab-2e4a-6e36-8e59c5973154.png)


⑥右下の「起動」をクリックする
![img6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665011/8075054b-a074-8276-5ea4-6b223d8e041c.png)


⑦キーペアを作成し、「インスタンスの作成」をクリックする
※キーペア名は好きに決めてください。ここではtestとします。キーペアは必ずダウンロードしておいてください。
![img7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665011/95e27fb8-04ac-1e39-3d44-4bbc9f60edc7.png)


⑧インスタンスが作成し終わるまで待ちましょう。
![img8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665011/e1de8f6c-14a6-cf27-c226-66332a250af9.png)
作成し終わるとインスタンスの状態がpendingからrunningに変わります。
![img8-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665011/44bf8f9a-80e6-c066-7018-f5a1d19c8ea7.png)


⑨インスタンスを選択した状態で「接続」をクリックすると、そのインスタンスに接続することができます。
![img9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665011/b7b357ba-1047-124d-b2ce-88162b80eec5.png)
今回はEC2 Instance Connect (ブラウザベースのSSH接続) を選択し、「接続」をクリックします。

⑩インスタンスへの接続に成功しました
![img10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665011/74f9925b-93f1-ac1f-a3db-7d6886f3672e.png)

#次回

EC2にSSH接続しますので、[PuTTY](https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html)がない方は事前にインストールしておいてください。

[AWS EC2入門 #2: AWSにSSH接続しよう](https://qiita.com/takahashitakuya031126/items/edd0bbc16463e45c0ea9)
VSCodeでリモートサーバにSSHしてコーディングする方法

# 構築環境

リモート側

```bash
$ cat /etc/redhat-release
CentOS Linux release 8.1.1911 (Core)
```

クライアント側

```bash
Microsoft Windows [Version 10.0.18362.900]
```

# 設定手順

以下の[公式手順](https://code.visualstudio.com/docs/remote/ssh)に従い、設定した。

## OpenSSHのインストール

OpenSSH互換のOpenSSHクライアントがインストールされている必要があると記載されている。

>System requirements#
>Local: A supported OpenSSH compatible SSH client must also be installed.

[Microsoft公式手順](https://docs.microsoft.com/ja-jp/windows-server/administration/openssh/openssh_install_firstuse)で、OpenSSHをインストールする。PowerShellを管理者権限で起動し、以下のコマンドを実行する。

```bash
// OpenSSHクライアントをインストール
$ Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0


Path          :
Online        : True
RestartNeeded : False

// OpenSSHサーバをインストール
$ Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0


Path          :
Online        : True
RestartNeeded : False

// インストールされたことを確認
$ Get-WindowsCapability -Online | ? Name -like 'OpenSSH*'


Name  : OpenSSH.Client~~~~0.0.1.0
State : Installed

Name  : OpenSSH.Server~~~~0.0.1.0
State : Installed
```

## VSCodeのインストール

VSCode公式ページよりインストーラーをダウンロードし、インストールした。
https://code.visualstudio.com/

## Remote Developmentのインストール

VSCode>Extensions>"Remote Development"と検索する。

![iz04Ktp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266508/16985754-f544-8a96-21d4-4fc7d8634627.png)

"Remote Development"を選択して、インストールする。

## リモートサーバへSSH接続準備

VSCode>View>Command Palette...>"Remote-SSH: Connect to Host...">"Configure SSH Hosts...">"Settings"を選択する。

![yPR8Eih.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266508/cc1b2d1e-c88f-7116-ad46-19204d909738.png)


Remote.SSH: Config Fileの箇所に、設定ファイルの配置パスを設定する。今回は「C:\command\vscode\ssh_config」に設定ファイルを配置した。

配置したssh_configに、下記SSHの設定を保存する。
※ 今回は鍵認証を使用したリモート接続の例である

```ssh_config
Host [接続名]
    User [ユーザ名]
    HostName [IPアドレス]
    Port [ポート番号]
    IdentityFile [鍵パス]
```

※ 初回の接続は、File>Preferences>Settings>User>"Commonly Used">"Remote-SSH">"Remote.SSH: Show Login Terminal"をチェックしておくこと。なお、初回接続成功後は、チェックを外すこと。

## リモートサーバへSSH接続

VSCode>Remote Explorer>SSH Targetsを選択する。

![1vecsTc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266508/ceba4234-3a71-b1ea-5e9d-f400bcddf150.png)

設定した接続名が一覧に表示されているので、押下するとSSH接続が開始される。

![rj0MI7I.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266508/074ff191-d727-8601-5e09-f391d1b3e628.png)


プロンプトが表示されれば、接続に成功！
LocalStackの起動待ちをするシェルスクリプト

CI環境でLocalStackを動かすにあたり検討したものの備忘です🐚

公式に[ヘルスチェック](https://github.com/localstack/localstack#service-health-checks)も提供されているようですが、
実感としてdockerのログに `Ready.` と表示された辺りから安定して動作するように思えたので、ログに吐かれるまで処理待ちすることにしました

これだけだと無限ループの恐れがあるので、タイムアウト等が必要であれば適宜実装してください

```bash
# サービス名
service_name="xxxxx"
# 起動時刻
start_time="$(date -u +%FT%T)"

# バックグラウンドで起動
docker-compose up -d

# 起動時刻以降に `Ready.` が出力されるまで処理待ち
while [ "$(docker-compose logs --no-color --timestamp | awk '$1=="'"$service_name"'"&&$3>="'"$start_time"'"' | grep -c "Ready.")" -eq 0 ]; do
  echo "Waiting LocalStack..."
  sleep 1
done

echo "LocalStack Ready."
```
【AWS SAA】ストレージサービスの特徴を比較

#はじめに
AWS SAA取得のため勉強しております。今回は自分の備忘録も兼ねて、試験でも頻出のストレージサービスの特徴を比較しつつ、簡単にまとめたいと思います。

#EC2
<h2>インスタンスストア</h2>
・ホストコンピュータに内蔵されたディスクでEC2と不可分のブロックレベルの物理ストレージ。
・EC2の一時的なデータが保持され、EC2の停止・終了とともにクリアされる。

<h2>EBS(Elastic Block Store)</h2>
・ネットワークで接続されたブロックレベルのストレージでEC2から独立。
・EC２から独立しており、EC2をTerminateしてもEBSには保持可能でSnapshotをS3に保持可能。

#EBS
・上記の説明同様EC2にアタッチして利用できるブロックレベルのストレージサービス。
・OS/アプリケーションのインストール先、データの保存先などとして利用。
・確保した容量分で課金。
・データは永続的に保存。
・99.99%の可用性。
・サイズは１GB〜１６TB。


|ボリュームタイプの種類 |ユースケース  |
|---|---|
|汎用SSD|仮想デスクトップ。低レイテンシーのアプリケーション。開発・テスト環境。|
|プロビジョンドIOPS|大規模なデータベース。ビジネスアプリケーション。|
|スループット最適化HDD| ビッグデータ。データウェアハウス。ログ処理。|
|コールドHDD|アクセス頻度の低い大量データ。バックアップ。|
|マグネティック|旧世代のボリュームタイプで基本的には使用しない。アクセス頻度が低い場合などに利用。|

#S3
・インターネット経由で利用できるオブジェクトストレージサービス。
・イレブンナイン(99.999999999%)の耐久性。
・結果整合性モデル　データ更新・削除時、読み取りのタイミングによっては古いデータを読み込むことがある。
・容量無制限。
・安価。

|ストレージクラス |特徴  |
|---|---|
|S3 標準|耐久性が非常に高い|
|S3 Intelligent-Tiering|最もコスト効率の良いストレージクラスに自動的にデータを移動させる。|
|S3 標準-低頻度アクセス (IA IA:infrequent Access)| アクセス頻度が低いが、必要となったらすぐにデータを取り出せる。|
|S3 1ゾーン-低頻度アクセス(S3 1ゾーン-IA)|S3 標準-低頻度アクセスと同様にアクセス頻度が低く、かつ単一のアベイラビリティゾーン内でデータを保存でも良い場合に使われる。S3 標準-低頻度アクセスよりもコストをさらに２０％削減できる。|
|S3 Glacier|アーカイブ用ストレージ。コストは安く済む。|

#EFS
・複数のAZにある複数のEC2インスタンスから同時にアクセス可能な、ファイルストレージサービス。
・完全マネージド型のNFSファイルシステム。

#まとめ
AWSは以下の3つの形式のストレージサービスを、提供していることがわかった。

|ストレージタイプ| ユースケース |
|--- | --- |
|ブロックストレージ|EC2にアタッチして活用するディスクサービス。データベースシステムやERP システムといった企業アプリケーションなど、低レイテンシーなストレージが必要な場合に最適。例:EBS、インスタンスストア|
|オブジェクトストレージ|安価かつ高い耐久性を持つ、オンラインストレージ。高い可用性や耐久性を備えている一方で、更新や削除がすぐに反映されない。HTTPSなどでアクセス可能なエンドポイントを提供。ゼロから最新のアプリケーションの構築、分析、バックアップなどに最適。例:S3|
|ファイルストレージ|複数のEC2インスタンスから同時にアタッチ可能な共有ストレージサービス。ディレクトリ(フォルダ)構造という管理のしくみを備えている。大規模なコンテンツリポジトリ、開発環境、メディアストア、ユーザーのホームディレクトリといったユースケースに最適。例:EFS|


参考
[この１冊で合格！　AWS認定ソリューションアーキテクト - アソシエイト テキスト&問題集](https://www.amazon.co.jp/gp/product/B07VFFX6V1/ref=ppx_yo_dt_b_d_asin_title_o00?ie=UTF8&psc=1) 
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ebs-volume-types.html
[これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座（SAA-C02試験対応版）](https://www.udemy.com/course/aws-associate/)
https://aws.amazon.com/jp/what-is-cloud-object-storage/
https://business.ntt-east.co.jp/content/cloudsolution/column-65.html
https://business.ntt-east.co.jp/content/cloudsolution/column-64.html
https://aws.amazon.com/jp/efs/features/