OmniAICreator/Qiita-1.07M huggingface dataset:
WSL でフォントが変わらないようにする

# 困り事

WSL のフォントを Lucida Console にしているが、vi や tmux を使うと MS ゴシックになる。

- MS ゴシックが見づらい。
- ウィンドウ内のスクリーンのサイズが変わる (フォントの大きさの関係で小さくなる)。


OS のロケールを UTF-8 (65001) にすれば直るが、代わりにあちこちで文字化けが起きる。

- コマンドプロンプトや PowerShell では日本語を表示したい。
- 他の日本語アプリを文字化けさせたくない。
- WSL では ASCII しか使わないから日本語は表示できなくてもいい。

OS のロケールはデフォルト (932) のまま、WSL だけ CodePage を 65001 にできんやろか。

# 解決方法

レジストリをいじったらできた。

1. レジストリエディタを開く。
1. `HKEY_CURRENT_USER\Console\C:_Program_Files_*_ubuntu.exe` を開く。
1. `CodePage` という DWORD (32-bit) 値を作る。
1. 値に 10 進で `65001` を入れる。
1. レジストリエディタを閉じる。
1. WSL を開く。

# 運用

レジストリの `HKEY_CURRENT_USER\Console\C:_Program_Files_*_ubuntu.exe` が増えたり、中身が書き変わったりする場合、再度レジストリエディタで設定し直すことになる。

- キーがパッケージ名とバージョンを含むので、パッケージのバージョンごとの設定っぽい。
- レジストリエディタで一度設定したのに効かない場合はキーが増えている可能性を疑う。

# 参考記事

https://superuser.com/questions/269818/change-default-code-page-of-windows-console-to-utf-8
【Jekyll】ブラウザを更新した際にCSSが反映されなくなる問題と解決法

## 結論
**ファイル名を`style.css`としていた場合、`styles.css`に変更する。**

詳細な原因は分からないのですが`style.css`はJekyll側でnormalizeか何かに使用されているファイル名であり、ブラウザを更新することで自分が作成した`style.css`より、Jekyllの`style.css`が優位となり、その結果スタイルシートは存在してブラウザにも正常に読み込まれているのにスタイルが適用されないという状況が発生したようです。

改めて確認すると、[公式チュートリアル]((http://jekyllrb-ja.github.io/docs/step-by-step/07-assets/))でも`assets/css/styles.scss`でファイルを作成しています。

<hr>

追記:
ざっくりした調査ですが`jekyll new`直後のデフォルト状態では今回の問題の再現を確認出来なかったため、`style.css`はJekyllではなく`gem "github-pages"`で使用しているものであるかもしれません。


## 問題の発生した状況
通常JekyllでSassファイルのコンパイルは`_config.yml`に`sass: sass_dir: _sass`のように記述して行うと思うのですが、インポート用のファイルに1ファイルずつ`@import filename;`を書くのが嫌だったり、`@import`が廃止予定が勧告されDartSassの`@use`への移行が必要だがこの時点ではJekyllが対応していないといった状況から、独自のコンパイル処理を作成していました。
その際、あまり深く考えずに`assets/css/style.css`のように出力していたことで、CSSが反映されない問題に直面することとなりました。

## 参考
>Something in Jekyll is creating Normalize CSS as assets/css/style.css in addition to your own file. When you serve your site, then your custom one comes last and “wins”. On a reload, the Normalize CSS one overwrites the style.css file and “wins”.

>I don’t know what is generating the normalize CSS file. Maybe one of the many gems in the github pages gem listed here Dependency versions | GitHub Pages

>A fix I found locally was to rename the style.css file to styles.css - which any is more inline with convention in CSS.

>[On any edit, CSS stops working](https://talk.jekyllrb.com/t/on-any-edit-css-stops-working/6166)
3.17(易) ガンマ分布 

## 方針

絶対値は場合分するよりもまるまる置き換えた方が単純になる場合がある．また指数部分の中に次数高い項があれば大体置換積分する．

ガンマ関数が出てくる分布は置換してガンマ分布に持っていくことが多い．ガンマ分布Ga(alpha,beta)の確率密度関数は

```math
f_X(x)=\frac{\beta^\alpha}{\Gamma(\alpha)}x^{\alpha-1}\exp(-\beta x),~~~\\ \Gamma(\alpha)=(\alpha-1)!=\int_0^\infty t^{\alpha-1}\exp(-t)dt
```

積率母関数は，

```math
\begin{align}
M_X(t)&=\int_0^\infty\frac{\beta^\alpha}{\Gamma(\alpha)}x^{\alpha-1}\exp\{(t-\beta) x\}dx\\
&= \frac{\beta^\alpha}{\Gamma(\alpha)}{(\beta-t)^\alpha}\int_0^\infty\frac{(\beta-t)^\alpha}{\Gamma(\alpha)}x^{\alpha-1}\exp\{-(\beta-t)x\}dx\\
&= (\frac{\beta}{\beta-t})^\alpha
\end{align}
```


ガンマ関数を導出する．指数分布Exp(beta)とは，「単位時間あたり平均beta回発生する事象が，ある時点から次に発生するまでにX単位時間かかる」確率を示すのだった．今，

```math
X_1,...,X_\alpha:iid\sim Exp(\beta)
```

とすると，その和：

```math
Y=X_1+...+X_\alpha
```

とは，「単位時間あたり平均beta回発生する事象が，ある時点から次にalpha回発生するまでにY単位時間かかる」ことを表す確率変数である．

今，指数分布の積率母関数は，

```math
\begin{align}
M_{X_1}(t)&= \mathbb{E}_{X_1\sim Exp(\beta)}[e^{tX_1}]\\
&= \int_0^\infty\beta\exp\{(t-\beta)x\}dx\\
&= \beta\left[\frac{1}{t-\beta}\exp\{(t-\beta)x\}\right]_0^\infty\\
&= \frac{1}{\beta-t}
\end{align}
```

なので，

```math
\begin{align}
M_Y(t)&= \mathbb{E}_Y[e^{tY}]\\
&= \mathbb{E}_{X_1,...,X_\alpha:iid\sim Exp(\beta)}[e^{tX_1}...e^{tX_\alpha}]\\
&= \mathbb{E}_{X_1\sim Exp(\beta)}[e^{tX_1}]...\mathbb{E}_{X_\alpha\sim Exp(\beta)}[e^{tX_\alpha}]\ \ \ (\because iid)\\
&= (\frac{\beta}{\beta-t})^\alpha
\end{align}
```

より，これはガンマ分布の積率母関数である．

## 答案

Y=|X|と置く．Yの分布関数は，

```math
\begin{align}
P[Y\leq y]&= P[|X|\leq y]\\
&= P[-y\leq X\leq y]\\
&= \int_{-\infty}^y f_X(x)dx-\int_{-\infty}^{-y}f_X(x)dx
\end{align}
```

ゆえ，確率密度関数は

```math
\begin{align}
f_Y(y)&= f_X(y)-f_X(-y)(-1)\\
&= 2C(\alpha)\exp(-y^\alpha),\ \ \ (0<y<\infty)
\end{align}
```

Yの確率密度関数が全確率1を満たすように正規化定数Cを求める．

```math
\int_0^\infty f_Y(y)dy=\int_0^\infty 2C(\alpha)\exp(-y^\alpha)dy=1
```

ここで，t=y^alphaと置換すると，

```math
\begin{align}
\int_0^\infty 2C(\alpha)\exp(-y^\alpha)dy&= \int_0^\infty\frac{2C(\alpha)}{\alpha}t^{\frac{1}{\alpha}-1}\exp(-t)dt\\
&= \frac{2C(\alpha)}{\alpha}\Gamma(\frac{1}{\alpha})\int_0^\infty\frac{1}{\Gamma(\frac{1}{\alpha})}t^{\frac{1}{\alpha}-1}\exp(-t)dt\\
&= \frac{2C(\alpha)}{\alpha}\Gamma(\frac{1}{\alpha})=1
\end{align}
```

より，

```math
C(\alpha)=\frac{\alpha}{2\Gamma(\frac{1}{\alpha})}
```

次に，

```math
\begin{align}
\mathbb{E}_{X\sim f_X}[|X|^\nu]&= \mathbb{E}_{Y\sim f_Y}[Y^\nu]\\
&= \int_0^\infty\frac{\alpha}{\Gamma(\frac{1}{\alpha})}y^\nu\exp(-y^\alpha)dy
\end{align}
```

ここで，t=y^alphaと置換すると

```math
\begin{align}
\int_0^\infty\frac{\alpha}{\Gamma(\frac{1}{\alpha})}y^\nu\exp(-y^\alpha)dy&= \int_0^\infty\frac{1}{\Gamma(\frac{1}{\alpha})}t^{\frac{\nu+1}{\alpha}-1}\exp(-t)dt\\
&= \frac{\Gamma(\frac{\nu+1}{\alpha})}{\Gamma(\frac{1}{\alpha})}\int_0^\infty\frac{1}{\Gamma(\frac{\nu+1}{\alpha})}t^{\frac{\nu+1}{\alpha}-1}\exp(-t)dt\\
&= \frac{\Gamma(\frac{\nu+1}{\alpha})}{\Gamma(\frac{1}{\alpha})}
\end{align}
```

## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
【Linux】VirtualBoxのCentOS7でキーボードをUS配列に設定する

## ことの発端
VirtualBoxを用いてCentOS7の仮想マシンを動かそうとしたところ何かおかしい。
cdコマンドなどで`~/hoge`とパスを入力しようとすると、この`~`が打てない。(何も入力されない..!)
そしてそもそも各種記号が思ったとおりに入力されないことに気づく。。

## 原因
これは最近キーボードをJIS配列からUS配列に買い換えたことが原因。
VirtualBoxで構築した仮想のCentOS7ではJIS配列が初期設定として割り当てられていて、
これにより見た目の物理キーボードと、コンピュータに認識されるキーボードの配列が異なるということが起きていた模様。

## 対策
### 設定を調べてみる
まず現在の設定を調べるには`localectl status`コマンドを実行する。

```sh
$ localectl status

# 出力
System Locale: LANG=ja_JP.UTF-8
    VC Keymap: jp
   X11 Layout: jp
```
このようにKeymapとLayoutに`jp`が設定されていることが確認できる。


### 解決へ
これをUS配列に変更するには`localectl set-keymap us`コマンドを実行すればOK。

```sh
$ localectl set-keymap us

# 出力
System Locale: LANG=ja_JP.UTF-8
    VC Keymap: us
   X11 Layout: us
```
<br>
これでキーボードがUS配列に変更でき、各種記号も打てるようになりました🙌
rotors_gazeboパッケージ実行時の [gazebo-8] process has died [pid , exit code 127, cmd ... の解決

# rotors_gazebo packageの実行時エラー

[ETHのrotors_simulator](https://github.com/ethz-asl/rotors_simulator)リポジトリの実行時エラーの解決に苦労したので備忘録．

## bug
こんなエラーが出る．

```
[gazebo-8] process has died [pid , exit code 127, cmd /opt/ros/melodic/lib/gazebo_ros/gzserver -u -e ode rotors_simulator/rotors_gazebo/worlds/basic.world __name:=gazebo __log:=/
```
下のプルリクエストのCMakelists.txtへと置き換える．
https://github.com/ethz-asl/rotors_simulator/pull/667

なぜマージをしないのか．

## build時のエラー
### 1

```
Errors     << rotors_gazebo:cmake /home/noby/catkin_ws/logs/rotors_gazebo/build.cmake.006.log                                                                                                  
CMake Warning (dev) at /usr/share/cmake-3.10/Modules/FindBoost.cmake:911 (if):
  Policy CMP0054 is not set: Only interpret if() arguments as variables or
  keywords when unquoted.  Run "cmake --help-policy CMP0054" for policy
  details.  Use the cmake_policy command to set the policy and suppress this
  warning.

  Quoted variables like "chrono" will no longer be dereferenced when the
  policy is set to NEW.  Since the policy is not set the OLD behavior will be
  used.
Call Stack (most recent call first):
  /usr/share/cmake-3.10/Modules/FindBoost.cmake:1558 (_Boost_MISSING_DEPENDENCIES)
  /usr/share/OGRE/cmake/modules/FindOGRE.cmake:318 (find_package)
  /usr/lib/x86_64-linux-gnu/cmake/gazebo/gazebo-config.cmake:175 (find_package)
  CMakeLists.txt:12 (find_package)
This warning is for project developers.  Use -Wno-dev to suppress it.
```

Cmakeのバージョン指定を以下のようにへんこうしたら直った

```rotors_simulator/rotors_gazebo/CMakeLists.txt
#cmake_minimum_required(VERSION 2.8.3)
cmake_minimum_required(VERSION 3.10.1) 
```

### その２

```
ImportError: "from catkin_pkg.package import parse_package" failed: No module named 'catkin_pkg'
Make sure that you have installed "catkin_pkg", it is up to date and on the PYTHONPATH.
CMake Error at /opt/ros/melodic/share/catkin/cmake/safe_execute_process.cmake:11 (message):
  execute_process(/home/noby/anaconda3/bin/python
  "/opt/ros/melodic/share/catkin/cmake/parse_package_xml.py"
  "/opt/ros/melodic/share/catkin/cmake/../package.xml"
  "/home/noby/catkin_ws/build/rotors_gazebo/catkin/catkin_generated/version/package.cmake")
  returned error code 1
Call Stack (most recent call first):
  /opt/ros/melodic/share/catkin/cmake/catkin_package_xml.cmake:74 (safe_execute_process)
  /opt/ros/melodic/share/catkin/cmake/all.cmake:168 (_catkin_package_xml)
  /opt/ros/melodic/share/catkin/cmake/catkinConfig.cmake:20 (include)
  CMakeLists.txt:47 (find_package)
```

これで終わり

```
pip install catkin-pkg
```


### おまけ
build時必要な依存パッケージのインストール
octomap

```sh
sudo apt-get install ros-melodic-octomap ros-melodic-octomap-msgs ros-melodic-octomap-ros ros-melodic-octomap-rviz-plugins
```

glog

```sh
sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev
```
vscodeの背景カスタマイズ法（最小限）

setting.jsonのworkbench.colorCustomizationsの項目をいじればvscodeの背景色を変更できますが、項目が多すぎてめんどくさいので特に必要な7項目だけ抜粋

```json
"workbench.colorCustomizations": {
   "editor.background": "コーディングする所の背景",
   "sideBar.background":"エクスプローラーがあるとこの背景",
   "panel.background":"ターミナルがあるとこの背景",
   "tab.inactiveBackground": "アクティブじゃないタブの背景", 
   "tab.border":"タブとタブの間の線",
   "editorGroupHeader.tabsBackground": "分割ボタンとかがあるところの背景",
   "sideBarSectionHeader.background": "エクスプローラーのヘッダー名の背景",
}
```
Swift leetcodeデビュー

SwiftでLeetCodeデビューしたよ🐣という日記
---
ふだんPaizaでコーディング力を鍛えているが、たまにはLeetCodeもね、、、、

問題数がすごい多いのにびっくり。てか全然Easyじゃない

問題
--
数値の配列とターゲットとなる数字が引数に渡されるので、合計がターゲットとなるインデックスを配列として返してください。という問題（ただし、パターンは一つしかないような制約になっている）

答え

```swift
//引数に数字が入った配列と合計が入ってくる。
    func twoSum(_ nums: [Int], _ target: Int) -> [Int] {
	// 空の配列の可能性もあるのでguardでとめる
       guard !nums.isEmpty else { return [-1,-1]}
        
		// 出力する配列
        var answerArray = [Int]()
		// ハッシュを作成　[Int:Int]型　このindex番目の数字を選んだらのこりこれくらいの足りないですよ！を示してくれる。
        var hashTable = [Int:Int]()
        // enumerateをつかってfor文で回す
        for (index, value) in nums.enumerated() {
  
            // 変数にvalue値をキーにもつ値(下記で挿入したindex)をいれる（なければとおらない）
　　　　　　　　　　　　　　　　　　　
            if let rightIndex = hashTable[value] {
                answerArray.append(index)//配列に入れる
                answerArray.append(rightIndex)//配列に入れる
                return answerArray//リターン
                break//処理はこれ以上行わないよ
            }
　　　　　　　　　　　　　　　　　　　　　　　　//合計引くvalueをキ-,インデックスをvalueとしてハッシュテーブルに入れる。
            hashTable[target - value] =  index
        }
                return answerArray//答えをリターン
    }   
```
59日後にITパスポートを受けるFラン私大文系既卒(14日目)

# マイクロコンピュータ
* マイクロコンピュータとは?
 * CPUやメモリなどの超小型コンピュータ

# ウェアラブルコンピュータ
* ウェアラブルコンピュータとは?
 * 身につけて使うコンピュータ

# スマートディバイス
* スマートディバイスとは?
 * スマートフォンやタブレットなどの総称

# 携帯情報端末
* 携帯情報端末とは?
 * 簡単に持ち運びできるコンピュータ
 * スマホ、タブレット、PCなど

# タブレット端末
* タブレット端末とは?
 * タッチパネルの持つ携帯情報端末

# PC
* PCとは?
 * 個人向けのコンピュータ

# サーバ
* サーバとは?
 * ユーザからの要求に応じて、さまざまな処理を行うコンピュータ

# 汎用コンピュータ
* 汎用コンピュータとは?
 * 基幹業務を処理するために利用されているコンピュータ

# スーパコンピュータ
* スーパコンピュータとは?
 * 大量の計算を高速で行うコンピュータ

# クロック周波数
* クロック周波数とは?
 * CPUが動く速さを表す指標

# コア
* コアとは?
 * CPU内にある演算処理を行う装置

# レジスタのデータサイズ
* CPU内にある
* データを一時的に記憶する装置  

# 主記憶装置
* 主記憶装置とは?
 * CPUが直接読み書きする装置
* 特徴
 * データを高速に出し入れできる
 * 主記憶装置に保存されたデータはコンピュータの電源を切ると消滅する

# 補助記憶装置
* 補助記憶装置とは?
 * 主記憶装置を補助するための記憶装置です
 * データを長期的に保存すること
* 具体例
 * ハードディスク
 * SSD
 * CD
 * DVD
 * Blue-ray Disk
 * USBメモリ
 * SDカード

# キャッシュメモリ
* キャッシュメモリとは?
 * CPU内に搭載されている超高速の記憶装置
 * CPUと主記憶装置の処理速度の差を埋めるために使われる

# 半導体メモリ
* 半導体メモリとは?
 * 半導体に電気を通すことで、データを保持する装置

# RAM(Random Access Memory)
* RAMとは?
 * 揮発性メモリ
 * 電源が切れると消滅するメモリ

# ROM(Read Only Memory)
* 不揮発性メモリ
　* 電源を切っても保持されるメモリ

# DRAM(Dynamic RAM)
* DRAMとは?
 * 絶えずリフレッシュされているRAM
 * リフレッシュとは、データが消えないように、1秒間に何度も電荷を加えること
 * 主記憶装置で使われている

# SRAM(Static RAM)
* SRAMとは?
 * リフレッシュする必要のないRAM
 * 高速に動作する
 * 値段が高い

# フラッシュメモリ
* フラッシュメモリとは?
 * 電気的にデータの書き換えができるROM
* 具体例
 * SSD
 * USBメモリ
 * SDカード  

# 入力装置
* 入力装置の種類
 * キーボード
 * マウス
 * タッチパネル
 * ペンタブレット
 * スキャナ

# ポインティングディバイス
* ポインティングディバイスとは?
 * コンピュータ画面の任意の位置を指定するための入力装置
 * マウス、タッチパネル、ペンタブレットなど

# 出力装置
* 出力装置の種類
 * ディスプレイ
 * プリンタ

# dpi(Dot per Inch)
* dpiとは?
 * 1インチあたりのドットの数を表す単位
 * 解像度を表す単位

# ppm(Page Per Minute)
* ppmとは?
 * プリンタが一分間に印刷できるページ数を表す単位

# バスパワー(Bus Power)
* バスパワーとは?
 * ケーブルを通して周辺装置に電力を送る方式
 * バスパワーのない入出力インターフェースをセルフパワーという

# ディバイスドライバ
* ディバイスドライバとは?
 * PCから周辺機器を操作するためのソフトウェア

# プラグアンドプレイ(Plug and Prey)
* プラグアンドプレイとは?
 * PCを周辺機器に接続した時、自動でディバイスドライバをインストールと設定をする機能
【JavaScript】forEachよりもreduceのほうが万能性高くない？


# forEach の模倣

次のような`forEach`は、

```forEach.js
array.forEach(body);
```

`reduce`により一行で模倣できる。

```simulation_forEach.js
array.reduce((_, ...args) => void body(...args), void 0);
```

# reduce の模倣

逆に、次のような`reduce`も、

```reduce.js
const result1 = array.reduce(reducer, init);
```

`forEach`により模倣できる。ただし、一行では模倣できない。

```simulation_reduce.js
let acc = init;
array.forEach((...args) => {acc = reducer(acc, ...args)});
const result2 = acc;
```

# 用法用量を守って畳み込みましょう

`forEach`は万能だけど、`reduce`はそれにもまして万能なので、気をつけて使わないとやたら抽象的なコードになったりする。
`reduce`を使うときは「他のメソッドで代替できないか」、「`for`や`while`で書いたほうがわかりやすくないか」、一度立ち止まって考えたい。
windows使いが初めてMacを使う時にインストールしたいもの一覧

#windowsから初めてMacを使う時にインストールしておきたいもの一覧

初めてMacを使う人向けの記事です。
Pythonをローカルで使用するためにインストールしておいた方が良さそうなツールのインストール方法をまとめました。
ちなみに私はデータサイエンティスト志望の転職活動中の者です。
誰かの参考になればと思い、この記事にインストールしたものをずらっと書いていきます。
他にインストールした方が良いツールがあればコメントいただけると幸いです。


使用環境

* iMac
* CPU:M1

## 目次
* Xcodeのインストール
* Homebrewのインストール
* jupyterのインストール
* Visual Studio Codeのインストール
* pyenvのインストール

## Xcodeのインストール
1. まずApple IDの取得を行います。
1. Apple StoreからXcodeを検索し、「入手」→「インストール」を選択します（まあまあ時間かかります）。
![ç.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186902/c191978d-cdb4-fe4a-388f-80e1144af2f0.png)![スクリーンショット 2021-08-11 8.05.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186902/083ddf44-6a05-4561-156b-f7c2d36b7a12.png)

1. インストール画面が表示されるので、そのまま操作を進めれば問題ないと思います。





## Homebrewのインストール

https://qiita.com/royroy/items/338362362de73a94fc0c

上記の記事を参考にしました。
1. ターミナルを開く
2. 以下のコマンドを実行

```
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```
 3. 以下のコマンドでインストールされているか確認
 
```
brew help
```

![スクリーンショット 2021-08-11 8.52.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186902/0ccefcd3-5fdd-ad41-6340-3463d1a020dd.png)


## jupyterのインストール
1. 以下のコマンドでpipを最新にする

```
pip3 install --upgrade pip --user
```

2.以下のコマンドでjupyterをインストールする

```
sudo -H pip3 install jupyter
```

3.以下のインストールできたか確認する。できていればjupyter notebookが起動する。

```
jupyter notebook
```


## Visual Studio Codeのインストール

以下のサイトの例を参考にインストールする

https://qiita.com/watamura/items/51c70fbb848e5f956fd6


## pyenvのインストール

以下のコマンドでインストール

```
brew install pyenv
```

## 最後に
ひとまずこれでPythonをローカルで使用することができるようになりました。

## 参考文献

https://degitalization.hatenablog.jp/entry/2020/12/07/154628
historyコマンドを使いやすくする

#背景
デフォルトのhistoryコマンドだとTimeStampがないため、どのような時に使用したコマンドかを振り返りにくい。件数が限られていたり、cdやls、historyそのものなど、特に記憶する必要がないコマンドまで表示されるのも不便なので、設定を変更することにしました。

#historyコマンドとは？
・過去に命令したコマンドを一覧で表示してくれます。特に慣れないうちは、覚えることが多いのでコマンドを復習したい場面も多いはずですので、そんな時にとても便利なコマンドです。

#何ができるようになるか
・TimeStampを表示
・件数の上限を増やす
・以下のコマンドを除外
history, cd, ls, top, df
お好みでpwd, whoamiなどを加えてもよいです

#コマンド
```
$ sudo -s
# cat << "_EOF_" > /etc/profile.d/my-history.sh
HISTTIMEFORMAT='%F %T '
HISTSIZE=100000
HISTFILESIZE=100000
HISTIGNORE='history:ls:ls *:ll:w:top:df *'          # ignore
HISTCONTROL=ignoreboth                              # ignore empty, duplex
PROMPT_COMMAND='history -a; history -c; history -r' # realtime update
_EOF_

# source /etc/profile
# exit
$ source /etc/profile
$ set | grep HIST
```

備考
・$は一般ユーザー　#はルートユーザー（コメントアウトの#と混同しないよう注意）
・<< "_EOF_" >で、>なら全部消して書き込む。>>なら最後の行に書き足す。
・_EOF_はcatコマンドの終了を指す
・sourceコマンドは全てのユーザーで行う
・最後のsetコマンドは編集が正しく行われていることの確認

#Ubuntuのタイムゾーンを変更（アップデート対応）
```
$ sudo dpkg-reconfigure tzdata
$ date
$ timedatectl
```
・他にもコマンドはあるが、こちらはアップデート後も設定を保持できる
・Asia/Tokyoで設定する
・date, timedatectlは確認コマンド

#後から不要な履歴を削除する
```
$ nano ~/.bash_history
```
・タイポの対応はこちらで。
JavaScriptを基本からまとめてみた【9】【コールバック関数】

##はじめに

####学習するに至った経緯

2020年より、未経験からエンジニアへの転職を目指し、某プログラミングスクールへ通う。
入学後、『Ruby』を未経験から学ぶ人が多いのと『Ruby』の求人が思っていた以上に少ないので、
卒業後、フロントエンドのエンジニアを目指す事に。
Javascriptの学習した事を言語化し、認識の深化による備忘録として記載。

##コールバック関数とは
コールバック関数（英：callback function）とは、関数を呼び出す際に引数として引き渡される別の関数のこと。呼び出し側が引数として指定した関数を、呼び出し先のコードが「呼び出し返す」（callback）形。この呼び出し側が引数に指定した関数のことを「コールバック関数」という。

```
コールバック関数のイメージ例
関数A（引数A）{
  引数A();
}
関数B（）{
  関数A(関数B);
```

##コールバック関数の流れ
①「関数A」の引数にコールバック関数「関数B」を指定して呼び出す
②「関数A」内で引数として受け取ったコールバック関数「関数B」を呼び出す
③ コールバック関数「関数B」が動き出す


##参考サイト
[ITを分かりやすく解説]
(https://medium-company.com/%E3%82%B3%E3%83%BC%E3%83%AB%E3%83%90%E3%83%83%E3%82%AF%E9%96%A2%E6%95%B0/)
愛知県の市区町村をRと色々なデータを使って可視化してみた①

## はじめに
前回作成した以下の記事で、愛知県を市区町村ごとに分けた地図を描画してみました

https://qiita.com/zumi0/items/4b8df477d9b62008064e

今回はその地図で色々なデータを使って、市区町村ごとに色分けするコロプレスマップを作成し、愛知県がどんなところか調べてみようと思います。

## 今回使うデータ
今回は以下のデータを使ってみようと思います。

- 市区町村の人口
- 市区町村の昼間人口比率
  - 常住人口100人当たりの昼間人口の割合
  - [参照](https://www.stat.go.jp/data/kokusei/2000/jutsu1/00/01.html)

こちらのデータはどちらも、[政府統計の総合窓口（e-Stat）](https://www.e-stat.go.jp/)からダウンロードしました。このデータを整形して、今回は使っていきます。

## 描画

```r
# 各種パッケージの読み込み
library(tidyverse)
library(jpndistrict)

# 愛知県の地図を描くためのデータ
aichi <- jpn_pref(23)

data <- read_csv("./population_data.csv") %>%       # e-StatからダウンロードしたCSVの読み込み
        mutate(area_code = as.character(area_code), # aichiとdataを結合するために、型変換
               population = population * 10^(-4),  # 描画するために型変換
               daytime_population_ratio_up = if_else(daytime_population_ratio >= 100, "100以上", "100未満")) # 昼間人口比率で、100以上か100未満かで分類
        
# 地図データと人口データを結合
aichi_joined <- inner_join(aichi, data, by = c("city_code" = "area_code")) 

# 市区町村の人口のデータを描画
g_population <- ggplot(aichi_joined,aes(fill = population)) + # 人口（population）で色分け
                geom_sf() +
                theme_gray(base_family = "Osaka") + # フォントを指定
                theme(axis.text = element_blank(),axis.ticks = element_blank()) + # 軸をきれいにする
                labs(title = "市区町村別の人口", fill = "人口(万人)") # グラフのタイトルなどを指定

# 市区町村の昼間人口比率のデータを描画
g_daytime_population_ratio <- ggplot(aichi_joined,aes(fill = daytime_population_ratio_up)) +
                              geom_sf() +
                              theme_gray(base_family = "Osaka") +
                              theme(axis.text = element_blank(),axis.ticks = element_blank()) +
                              labs(title = "市区町村別の昼間人口比率", fill = "昼間人口比率")
```

まずは人口の結果です。

![スクリーンショット 2021-08-10 0.29.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581736/305cb776-d9fa-ff91-d98b-6457ec751cae.png)

豊田市や岡崎市、豊橋市、一宮市の人口が多いみたいです。名古屋市全体では約２３０万人の人口がありますが、区ごとに見るとそこまで多い感じは見れないようです。

続いて、昼間人口比率の結果です。
昼間の人口が多い場合は赤色、少ない場合は青色になっています。

![スクリーンショット 2021-08-10 0.29.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581736/567f306d-735c-b041-579a-d2e0195a5c9c.png)

名古屋市の一部の区や豊田市の昼間人口が多いことがわかりました。それらの地域の周りが昼間人口比率は１００未満なことを考えると、そこがベッドタウンになっているのかなと思ったりしました。

## さいごに
今回は以下のデータを使って、愛知県の市区町村の状況を可視化してみました。今後も他のデータを使って、可視化していこうと思います。。
Linux(CentOS/Ubuntu/Kali)のIPアドレスを固定する

頻繁に設定するのでメモ程度に書いておく

環境 CentOS7 Ubuntu20.04 KaliLinux(VirtualBoxでネットワーク設定をブリッジアダプターに設定している)

<!-- more -->

IP,NIC確認

```Console
# nmcli

# ip addr

# ifconfig
```

など

# CentOS 7
```Console
# vi /etc/sysconfig/network-script/ifcnf-enp0s3
```

ifcnf-enp0s3

```Console
ONBOOT = yes # 有効になってなければ変更する

BOOTPROTO = none # 書き換え

IPADDR = 192.168.3.2 # 以下追記

NETMASK = 255.255.255.0

GATEWAY = 192.168.3.1

DNS1 = 192.168.3.1
```

```Console
# systemctl restart network.service
```

;上記でエラーが出た場合は接続していないネットワークカードの ONBOOT を no にすると改善される場合がある。

 

# Ubuntu 20.04
```Console
# vi /etc/netplan/99-netcfg.yaml
```

99-netcfg.yaml

```Console
network:
  version: 2
  ethernets:
    enp0s3:
      addresses: [192.168.3.2/24]
      gateway4: 192.168.3.1
      nameservers:
        addresses: [192.168.3.1]
        search: []
      optional: true
```

```Console
# mv 00-installer-config.yaml 00-installer-config.yaml.dis
# netplan apply
```


# Kali-Linux
DebianベースなのでUbuntu20.04と同じようにできると思いきやできなかった。

```Console
# vi /etc/network/interface
```

interface

```Console
allow-hotplug eth0
iface eth0 inet static
  address 192.168.3.2
  netmask 255.255.255.0
  gateway 192.168.3.1
  dns-nameservers 192.168.3.1
```


```Console
# systemctl restart networking.service
# ifup eth0
```
pip-toolsでバージョン管理する方法まとめ & Pipenvとの比較

pip/requirements.txtを直接操作するではなくさらに上位のツールを使いたかった。ライブラリの先の依存を陽に書かなくてもよくしたい & バージョンの固定をやりやすくしたい。

# 最終的に決まった手順
pip-toolsを使う。Pipenvは後述の通り挫折した。

```
$ sudo apt install -y curl python3-venv python3-distutils
$ python3 -m venv --without-pip venv
$ source venv/bin/activate
(venv) $ curl -kL https://bootstrap.pypa.io/get-pip.py | python
(venv) $ pip install pip-tools
(venv) $ vi requirements.in && pip-compile # ライブラリを追加、バージョン変更する場合のみ
(venv) $ pip-sync
```

`--without-pip`で始める理由は、pipがグローバルに入っていない環境への対応。pipはグローバルに **入ってない方がよい** という意見がある。

- https://qiita.com/tatamyiwathy/items/c673c19202eea260f37e
- https://amano41.hatenablog.jp/entry/wsl-python3-venv-error
- https://qiita.com/suzuki_y/items/3261ffa9b67410803443
- https://qiita.com/ryu22e/items/ad3f8f3df30886d23661

# 開発時の流れ
- **ライブラリの選定、バージョンの選択/lockをする担当者**
  - venv/pip-toolsをインストールする
  - requirements.inを書いてpip-compileをし、requirement.txtを作る。equirements.inでバージョンを特に書かずにpip-compileすればその時に解決できたバージョンがrequirements.txtの方に書き込まれるので便利。requirements.inでバージョンを陽に書けばpip-compileをし直しても特定のバージョンで固定もできるし、定期的に最新版に更新する運用ならin側でバージョンを書かなければよい。
  - requirements.inとrequirements.txtをgit commitする。後者がlockファイルに相当する
- **↑の結果を利用してコードを書くだけの開発者**
  - venv/pip-toolsをインストールする
  - pip-syncを叩く。必要なライブラリがインストールできるほか、不要なライブラリを消すこともできる
- **CI**
  - venvは状況に応じて必要なら入れる。pip-toolsは入れてもよいが、たぶんCIでは不要で`pip install -r requirements.txt`するだけで再現が可能。`pip install -r`と`pip-sync`の主な違いは不要なライブラリを削除してくれる効果があるかどうか。CIでは綺麗な環境から作ると思うので、`pip install -r`でよいことになる。

# その他運用上のポイント
## プライベートリポジトリを登録する
requirements.inファイルに以下のようにgithub privateリポジトリを書く。

```
git+https://github.com/account/library.git@branch
git+ssh://github.com/account/library.git@branch
```

sshの場合は然るべき秘密鍵を事前に設置しておけば対話なしでインストールできるし、httpsの場合は事前の仕込みが何もない場合は対話でusername/passwordを促されるし、環境変数なり.netrcなりを書いて対話不要にすることもできる。pip-toolsを活用するのはどちらかと言うとCIとかではなく自身が開発するときの話なので、「変な仕込みを入れないままで動かしてもちゃんと対話的にパスワード入力できるようになっている」ことがありがたい。

## プライベートリポジトリを改変可能な状態で参照する
上記の代わりに-eを付けた形式でrequirementsを書くとeditable installというものになってそのライブラリのpyファイルも直接いじれるようになるが、なぜかegg名を陽に書かないといけなくなる。「ライブラリのpyファイルも直接いじれる」とは具体的には、venvの下に.gitが付いている状態のリポジトリがcloneされてきて、そこでダイレクトに編集→コミット&プッシュができるようになる。

```
-e git+https://github.com/account/library.git@branch#egg=library
-e git+ssh://github.com/account/library.git@branch#egg=library
```

## Python自体のバージョンを固定する
pip-tools (というかrequirements.txt) でPythonバージョンを固定する方法は無さそうだが、「version x.y以上でないと動かないよ」という事実を何らかの形で記録したいだけなので、ここは諦めてREAMDE等に記すという運用にする。
npmのenginesのようにエラーが出るだけで十分なのだけれど…

# 参考: Pipenvで挫折した理由
- Pipenvもパッケージバージョンのlockができるが、Pipenv.lockファイルの生成に信じられないくらい時間がかかるので、numpyとかlibrosaとかを使う場合は--skip-lockを常用することになる。これだとバージョンのlockができないので困る
- プライベートリポジトリを登録してhttpsで対話的にパスワード入れるのもPipenvだとうまく対話ができなくて、.netrcにアクセスキーを書く必要があった
Pyspark 文字列置き換え

# 内容
```
|    1|  sample1|sample_1|2021/07/14|  A|    null|       null|       null|       11:22:33|
|    2|  sample2|sample_2|2021/07/15|  B|    null|       null|       null|       11時間22分33秒|
```
1が正常系、2が異常
11:22:33としたいが11時間22分33秒となってしまっているので置き換えたい

# やること
```python
from pyspark.sql.types import *
from pyspark.sql import functions as F

def time_format_method(x):
    x = x.replace("時間", ":").replace("分", ":").replace("秒","")
    return x
time_format = F.udf(lambda z: time_format_method(z), StringType())

df_format = df_input \
    .select(
        F.col("--"),
        F.col("--"),
        F.col("--"),
        F.col("--"),
        F.col("--"),
        F.col("--"),
        format(F.col("修正したいカラム名")).alias("付けたい名前")
    )
```

# 参考
[How to Turn Python Functions into PySpark Functions (UDF)](https://changhsinlee.com/pyspark-udf/)
[pyspark.sql.functions.udf](https://spark.apache.org/docs/3.1.1/api/python/reference/api/pyspark.sql.functions.udf.html)
macを意図的に速度制限にする方法

## 概要

ウェブアプリ開発で端末が通信制限になっている状態ではどういった影響が出るのか調べた際に使って結構便利だったので導入方法と使い方を軽くまとめました。

## 必要なもの

- appleID (developer登録)
- xcode
    - additional tools

## 事前準備

`additional tools`のダウンロード

以下のリンクから`xcode`のバージョンと同じものをダウンロードする

https://developer.apple.com/download/all/?q=additional

ダウンロードが完了したら「Hardware → Network Link Conditioner.prefPane」を開く

## 使用方法

1. 鍵マークをクリックして変更できる状態にする
2. トグルボタンをONに切り替える
3. `Profile`から`3G`を選択する
    - 3G: 780kbps/330kbpsくらい
    - 他にも選択できるものがあり画面上に数値が出るので必要に応じて切り替える
4. 変更が完了したら再度鍵マークをクリックして変更を反映させる

<img src="https://i.imgur.com/V29tvei.png" width="600px" >

※ OFF にすると解除でき、必要なときはシステム環境設定から変更することができます。

## その他

> ”Network Link Conditioner”環境設定パネルを読み込めませんでした。

上記のエラーが出た場合はおそらく`xcode`のバージョンと`Additional Tools`のバージョンが違っているので、`Additional Tools`のバージョンを確認して入れなおす必要があります
基礎④〜配列、連想配列〜　php

#はじめに
配列について書いてみた。

#内容

###配列とは

配列には添字配列と連想配列があり、これまでの変数が一つしか値を扱えなかったのに対し、配列を用いると複数の値をまとめて保存することができます。

例：

```php
$a = array('ringo','banana','mikan');

echo $a[0];
//結果：ringo

echo $a[1];
//結果：banana

```

上の例題の説明をすると
・＄a = array('ringo','banana','mikan');
配列のデータには先頭から0, 1, 2...と数えていきます。
この場合
ringoは[0]
bananaは[1]
mikanは[2]
となります。

echoでringoを結果としてだしたかったのでecho $a[0];と書き結果ringoという値がでました。

###連想配列

連想配列は、配列と同じく複数のデータをまとめて管理するのに用いられます。配列との違いは、個々の要素を管理するのにインデックス番号ではなく、「キー」と呼ばれる文字列などの値を指定することができる点です。
「$配列名 = array('キー名' => '値１', ・・・);」といったように、「=>」を用いてキーと値をセットします。

参考：https://prog-8.com/php/study/1/11#/30

例：

```php
$a = array (

   'name' => 'ringo',
   'age' => 17
   'gender' => 'woman'

);

echo $a = ['name'];
//結果：ringo
```


「配列名[キー] = 値;」のようにすることで、連想配列にデータを追加することができます。

上の例題を説明すると
・name,age,gernderはここではキーとなっており、それ以外は値となっております。
「=>」を用いてキーと値をセットします。


#まとめ
連想配列連想配列におけるキーの指定は文字列です。 添字配列と連想配列の違いはキーが数字か文字列かの違いだけです。
SEOについてのおさらい

SEOについての備忘録です

#SEO
SEOとは、Search Engine Optimizationの略で検索エンジンの最適化です。
ここでいう検索エンジンとはほぼGoogleといって問題ありません。
ユーザーにとって有益なコンテンツを提供し、適正に検索エンジンにページ内容を理解・評価されるように技術的にWebページに最適化することのことでGoogleなどの検索結果の上位に表示されることでサイトへの流入を上げていこうというものです。
現在のトレンドとしては、モバイルへの対策を入れることが重要視されています。

#インデックス
Google は認識したすべてのウェブページを「インデックス」に格納します。各ページのインデックス エントリには、そのページのコンテンツと場所（URL）が記述されています。「インデックスに登録する」とは、Google がページを取得し、そのページを読み込んで、インデックスに追加することを意味します。たとえば、「今日、私のサイトのいくつかのページを Google がインデックスに登録しました」のように使います。

#クローラー
クローラーとは、インターネット上に存在するWebサイトなどあらゆる情報を取得し、自動的に検索データベースを作成する巡回プログラムのことです。SEOで上位を取るにはこのクローラーに自社のサイトが認識される必要があります。
クローラーが収集した情報を分析し検索データベースに保存することをインデックスといい、クローラーが情報を収集することを単にクローリングといいます。

#クローラビリティ
クローラビリティとは、クローラーがインターネット上のリンクを辿ってWebサイトを検出する時の、Webサイトの認識のされやすさのことでクローラビリティを向上させるには主に以下の方法があります。
- Googleにクロールリクエストをする
- XMLサイトマップを送信、更新する
- 内部リンクを設定する
- パンくずリストを設定する
- URLを正規化する
- URLの階層を浅くする
- リクエストに対して正しいHTTPステータスコードを返す

参照
https://developers.google.com/search/docs/beginner/seo-starter-guide?hl=ja
データサイエンティストを目指には英語力も必要でしょう

50代にしてデータサイエンティストを目指す男　ごとうです。

データサイエンティストなりデータ分析なりでそれなりに食っていくには
ビジネス力としての英語力も必要だろうと思います。

もちろん技術面で公式ドキュメントを読むためにも必要ですが
ビジネス力としての英語力をつけたいと思います

現在スタサプでレベル１から攻略中です。

https://studysapuri.jp/
Couldn't find database client: mysql, mysql5. Check your $PATH and try again. の対処法



#背景

docker-compose exec app rails db　を実行し、DBへ接続しようとしたところ、以下のエラーが発生しました。


#原因

mariadb-client がないため接続できないようです。


#解決策

Dockerfileに以下を追記します。

```
〜省略〜

RUN apt install -y mariadb-client-10.3 
```

その後、Docker-compose up -d で再起動したらできました。
【一方ロシアは鉛筆を使った】シンプル5ボタンマウス拡張機能のススメ 

[ロジクールのたっっかいマウス](https://pc.watch.impress.co.jp/docs/column/yajiuma-mini-review/1209452.html) が欲しいんですよー(^o^)／
![logicool.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336848/0321e1bb-0e11-1206-8f85-67575d870cad.jpeg)




でも、みんながみんな買える訳じゃないですよね～😄
また、リーズナブルかつ、使い勝手の良いマウスもたくさんあるわけで。

そんなシンプルなマウスでも、全然便利にしちゃうよってソフトを作ったのでシェアします♪♪
[シンプル5ボタンマウス拡張]
https://www.vector.co.jp/soft/winnt/util/se523285.html

自分は、これ＋[マウ筋によるマウスジェスチャー](https://qiita.com/kagehikozaemon/items/afa2aa02fc6f58c6fbe0) によって、快適なマウス環境を整えています☆


## 戻る/進むボタン → PgUp / PgDn
縦に長いWebページやExcelをスクロールするのが大変なのは、みなさん周知の通り。
自分は、10年以上前から戻る/進むボタンにPgUp/PgDnを割り当ててます。
ロジクールさんとかが たくさんの時間とお金をかけて ホイールの回転効率を考えてくれてて 感謝しかないですが、
こういう鉛筆的な回避策も全然アリかと思います。

## じゃあ戻ったり進みたいときは？
ロッカージェスチャーを使います。
戻る：右クリック＋左クリック
進む：左クリック＋右クリック。
初めての出会ったのはFirefoxのアドオンでしたが、そのときの感動は言葉にできません笑

## 横スクロールどうするよ？
左クリック＋ホイールで。
必要になる頻度は高くないですが、やっぱりあると便利。

## 一番上、下まで飛んでくれぃ
左クリック＋戻る進むボタンでできます。
（Ctrl + Home/End を送っています）

### 余談
本当は右クリック＋戻る進むボタンで一番上、下まで飛ぶを実現したかったのですが、
AHKの仕様なのか、なぜか動かなかったので次点策で上記の割り当てにしています。


# 最後に
いかがでしたでしょうか？たったこれだけでも、個人的にはかなり
ストレスフリーにPC操作できるようになるなと感じています。

これからスマホの時代になって、PC使う人少なくなるかもですが、
ちょっとでもみなさんのPCライフがよくなると嬉しいです。

_以上です。Happy PC Life！_
Wordpress MW WP formプラグインの電話番号 半角数字バリデーション不備問題

# Wordpress MW WP formプラグインの電話番号 半角数字バリデーション不備問題
Wordpressでメール送信機能を実装する際に、MW WP formプラグインで簡単に実装できる。しかし、
xxx-xxx-xxxのような電話番号で、半角数字のバリデーションを指定したところ、半角数字を入力したにもかからわず、半角数字と認識されずエラーメッセージが表示される場合がある。
解決方法を示したサイトが他なかったので、ここでその原因と暫定処置ではあるが解決方法を示す。

## 環境の整理
- Wordpress 5.8
- MW WP Form プラグイン 4.4.0

## WP管理画面
1.MW WP Form にて、name="tel"というフォームタグがあるとする。
![スクリーンショット 2021-08-11 070946.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676239/5f3f7302-2bbd-8679-1192-79c2bc3ecef7.jpeg)
2.telのバリデーションは「半角数字」を指定したとする。
![スクリーンショット 2021-08-11 071856.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676239/20a4b37e-6014-14cb-4989-659d7099f6f2.jpeg)

3.ブラウザ画面では以下
![スクリーンショット 2021-08-11 071938.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676239/4f7989be-acfd-bf22-d377-f5cb818e7d73.jpeg)




## 原因
半角数字を判定する箇所は
wp-content\plugins\mw-wp-form\classes\validation-rules\class.numeric.php
ここに以下のような記載がある

```class.numeric.php
	public function rule( $name, array $options = array() ) {
		$value = $this->Data->get( $name );

		if ( MWF_Functions::is_empty( $value ) ) {
			return;
		}

		if ( preg_match( '/^[0-9]+$/', $value ) ) {
			return;
		}

		$defaults = array(
			'message' => __( 'Please enter with a half-width number.', 'mw-wp-form' ),
		);
		$options  = array_merge( $defaults, $options );
		return $options['message'];
	}
```

そうだ。原因は以下の判定にある。

```class.numeric.php
		if ( preg_match( '/^[0-9]+$/', $value ) ) {
			return;
		}
```
今回電話番号はxxx-xxx-xxx、$value = "xxx-xxx-xxx"となる。
なので、if文でfalse結果となる。


## 解決方法
以下のコードにより、
name="tel"の場合のみ、xxx-xxx-xxxの半角数字判定を行うことができる。

```class.numeric.php
    if($name == "tel") {
      $val = $value;
      if (preg_match('/^[0-9]+-[0-9]+-[0-9]+/', $val)) {
        return;
      }
    } else {
      if (preg_match('/^[0-9]+$/', $value)) {
        return;
      }
    }
```
もっと工夫して汎用的に使えるようにするといいでしょう。


OK
AWSソリューションアーキテクトプロフェッショナル（SAP）合格記

# はじめに
先日、**AWSソリューションアーキテクトプロフェッショナル（SAP）**を受験して無事一発合格できたので、合格するまでに勉強したことや、要点をまとめたいと思います。

# 筆者のレベル
約1年前にAWSソリューションアーキテクトアソシエイト（SAA）を合格。

SAA合格後は、SAP合格を目標にしつつも、たまに`Qiita`にAWS系の記事を書くときに調べるくらいであまり集中して勉強はしていませんでした。

仕事はインフラ系設計構築をやっているものの、あまりAWSに関係する仕事もなく、平日の夜や休日も多忙という名目で勉強をサボっていたので真面目にSAPの勉強をし始めたのは1か月前くらいといった状況でした。

# 勉強方法
以下を見たり買ったりして勉強しました。

- [AWS認定ソリューションアーキテクト－プロフェッショナル～試験特性から導き出した演習問題と詳細解説～ Kindle版](https://www.amazon.co.jp/dp/B08F9CQ6LT/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)
- [Udemy AWS 認定ソリューションアーキテクト プロフェッショナル模擬試験問題集（全5回分375問）](https://www.udemy.com/course/aws-53225/)
- [AWS Black Belt Online Seminar](https://aws.amazon.com/jp/aws-jp-introduction/#blackbelt)
- [AWSのドキュメント](https://docs.aws.amazon.com/ja_jp/)


最初はSAAを勉強していた時に使用していた参考書をざっと見て内容を思い出してから、以下を繰り返し行いました。

1. 模擬試験実施
2. 不明な用語等をメモに書き出し
3. Black Belt Online SeminarやAWSドキュメント等見て理解
4. 要点を自分なりにまとめる

試験一か月前からの勉強時間は平日は昼休みの一時間程度、休日は8時間程度だったので、試験のために勉強した時間は合計で100時間程度だったかと思います。

ただ、「[CloudFormationをゼロから勉強する。](https://qiita.com/sakai00kou/items/46e12aa5936b6d6064f2)」や「[インスタンスプロファイルを理解するついでにポリシーとロールを整理する。](https://qiita.com/sakai00kou/items/a4b96dcfa6bb3e656cd9)」などいくつかAWS系の記事を書くときには、調べたり、実機確認したりしていたので、その時間を加えると200～300時間くらいはAWSに関わっていたかもしれません。

## AWS認定ソリューションアーキテクト－プロフェッショナル～試験特性から導き出した演習問題と詳細解説～ Kindle版
現状、本で出版されている唯一の日本語SAP問題集ということでKindle版を購入。

サービス概要の説明、各分野のケース問題、模擬試験（1回分）の構成で、出版物ということもあり図や説明が多く、内容も分かりやすかったです。

各分野のケース問題はSAPでどのようなレベルの問題が出るのかを把握する際のとっかかりとして役に立ちましたが、サービス概要の説明はざっくりとした内容しか書かれておらず、模擬試験も1回分しかないので、今回の私の勉強方法ではあまり使いませんでした。

## Udemy AWS 認定ソリューションアーキテクト プロフェッショナル模擬試験問題集（全5回分375問）
`Udemy`のセールをやっていた時に購入したので1,380円で購入。

問題数も5回分ということもありボリュームも十分で、全問題解説付きで、しかも安い！ということで今回はこの模擬試験とBlack Belt Online Seminarでの勉強で合格できたと思います。

一通り問題を解いてからでないと回答、解説が表示できないため、ちょっとした合間に一問一答形式で問題を解くといった用途には向きませんが、私は休日に1回分解いて、解説を平日何日かに分けて移動中など空き時間に見るようにしていました。

## AWS Black Belt Online Seminar
各サービスの使い方、概要を理解するために視聴。

不明な用語やサービスの概要は、Black Beltの講義を見ると大体出てくるので、不明な用語やサービスを洗い出したらすぐにBlack Beltで確認することを繰り返して覚えました。

ただ、講義は大体1時間ということもあり普通に視聴すると時間がとられるため、1.5倍～2倍の速度で視聴していました。

倍速だとついていけないと思われるかと思いますが、やってみると想像していた以上に聞き取れ、ちゃんと聞き取ろうと集中するので逆に覚えられたと思います。

また、私のコツとしては、Black Belt Online Seminarは資格取得のための講座ではないので、アプリケーションの実装方法等、試験に出題されないような部分は深入りせず、そのサービスを使って何ができるのか、どういうメリットがあるのかという点に絞って視聴するのが良いと思います。

## 自分ノート作成
問題集を解いて分からなかった部分や、Black Belt Online Seminarを見て気になったところなど、サービスごとに分けて書き出し、自分の言葉でまとめ直しました。

まとめ直す際に疑問に思ったところや気になるところは改めて調べ直したり、動作確認を行ったりして、自分の中でサービスのイメージが掴めるくらいまでは落とし込むようにしました。

時間の関係もあり、分からない部分全てをまとめることまではできませんでしたが、ある程度優先度をつけて主要なサービスについては押さえたと思います。

# SAP試験の要点
SAPの試験を受けた感想としては以下のような点を重点的に覚えておく必要があると感じました。

- AWS Organizationsを使った社内統制
- Code〇〇やCloudFormationなどを使ったCI/CD
- CloudFrontと連携したサービス提供（API Gateway、ELB、S3など）
- サーバレスへの移行（Aurora Serverless、ECSなど）
- 既存サーバ、アプリケーションの移行方法（AWS SMSなど）

上記を実現するため必要となるサービスは、少なくともAWSマネジメントコンソール上に表示されている内容などはAWSドキュメントやBlack Beltなどを見て覚えておく必要があると感じました。

SAPの試験はSAAと比べると各サービスを連携させて使用したソリューションを求められる問題が多いため、連携を前提に勉強すると良いと思います。

# おわりに
仕事ではあまりAWSを使う仕事はやっていませんが、長年インフラ設計構築をやってきた経験があったからこの程度の勉強時間でできたと思うので、勉強時間は目安程度で自分の状況に応じてしっかり勉強すれば取得できると思います。

誰かが試験を受ける際に参考になれば幸いです。
プラットフォームイベントに基づくSalesforceCDC

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめA～M](https://qiita.com/Keiji_otsubo/items/f3ddedee6793bf1576f8)



これができて何がうれしいのか、さっぱり分かりませんでした。（今も分からん）

+ [is Salesforce CDC based on platform events [duplicate]](https://salesforce.stackexchange.com/questions/327248/is-salesforce-cdc-based-on-platform-events)

まず、CometD/Bayeux プロトコルがあります。これは、サーバーからクライアントにデータをストリーミングするための汎用プロトコルです。標準を持つということは、すべてが十分に文書化され、多くの言語で実装され、標準技術を活用することを意味します。

Salesforce 固有の次のレイヤーは、ストリーミング API です。これは、サーバーが継続的な更新をクライアントにプッシュすることが期待されるアプリケーションに使用され、プロトコルとして CometD を使用します。たとえば、特定の変更や特定のレコードを監視するクエリを設定できます。

次はプラットフォーム イベント (PE) です。これはエンタープライズ サービス バス (ESB) を可能にしますが、一般的なストリーミング API とは異なり、さまざまなソースからサブスクライブしている任意のクライアントにイベントをプッシュできます。

最後に、CDC は、サブスクライバーに新しいレコードと既存のレコードの変更を通知するために使用される特定の PE チャネルであり、この機能に関連付けられた Salesforce の特定の機能を備えています。

CDC は既存の PE アーキテクチャを利用し、さらに既存のストリーミング API アーキテクチャを利用します。このアーキテクチャは、さまざまなプログラミング言語のライブラリを持つ標準プロトコルに基づいています。このすべての再利用により、新機能の迅速な開発と展開が可能になります。

+ [Change Data Capture, Platform Events and Asynchronous Apex Triggers](https://www.themightyworld.com/post/change-data-capture-and-asynchronous-apex-triggers)
C++ Standard Template Library のライセンス

# はじめに
"C++でビット演算を簡単に実装する方法" を斜め読みして気になったため書きます.

過去の私の記事でStandard Template Library (STL)を引用している部分が法律を犯しているのでは？と心配になったため調べます. glibcxx, libc++, Visual Studio同梱STLが対象です.

## Microsoft's C++ Standard Libraryのオープンソース化
[Microsoft's C++ Standard Library](https://github.com/microsoft/STL) は現在"Apache 2.0 License"の下配布されています. Visual Studio同梱STLとしては, **Visual Studio 16 2019** 以降がオープンソースのコードになります.

**Visual Studio 15 2017** 以前は, 使用許諾契約 (EULA)に従います.コードは公開されていないため再配布・引用はダメという理解で大丈夫なはずです.
どのバージョン同梱のSTLにも, ファイルの先頭に **著作権表記が記載されています**.

# Standard Template Libraryを使用する際のライセンス
ソースコードそのものを再配布する場合, 各ライセンスに従います. 
プロダクトにリンクしてバイナリを配布する場合,

- GCC
    - [GCCランタイム・ライブラリ例外 (RLE)](https://www.gnu.org/licenses/gcc-exception-3.1.ja.html) によってプロダクトのライセンスがGPLである必要はない
- Clang (LLVM)
 - ツールがインクルード・生成・リンクした部分について, 再配布条件の一部に従わなくてよい

"LLVM Exceptions to the Apache 2.0 License"より,
>As an exception, if, as a result of your compiling your source code, portions
of this Software are embedded into an Object form of such source code, you
may redistribute such embedded portions in such Object form without complying
with the conditions of Sections 4(a), 4(b) and 4(d) of the License.

- Visual Studio 16 2019
    - LICENSE.txtに, "LLVM Exceptions to the Apache 2.0 License"の記載があります

# まとめ
私の過去の記事は, "Visual Studio 16 2019"のSTLを参照しており, 引用の条件は満たしているため大丈夫となります.
[シリーズ] Elasticsearch 7.14で『📘 データ分析基盤構築入門』を写経してみた

Kibana (Elasticsearch, Fluentd) の学習のために、
Elasticsearch 7.14.0 環境で次の御著書を写経してみた.

📘 データ分析基盤構築入門［Fluentd，Elasticsearch，Kibanaによるログ収集と可視化]

https://gihyo.jp/book/2017/978-4-7741-9218-5


ただし、御著書は前提とする Elasticsearch バージョンが v5.4.3 であり、
v7.14.0 では動作しない(と思われる)部分があったので、動いたときの記録を書き出しておく.
**(当然ながら、本文を転載するようなことはしない)**

|コンテンツ|関連ソフトウェア|
|:--|:--|
|[Elasticsearch 7.14で『📘 データ分析基盤構築入門』を写経してみた (11章)](https://qiita.com/robozushi10/items/7dd87df8e338286c2d04)|Elasticsearch|
|[Elasticsearch 7.14で『📘 データ分析基盤構築入門』を写経してみた (16章)](https://qiita.com/robozushi10/items/4238600dcb0231d227d4)|Kibana|
|[Elasticsearch 7.14で『📘 データ分析基盤構築入門』を写経してみた (17章)](https://qiita.com/robozushi10/items/af758ab2a314700ead25)|Kibana|
Elasticsearch 7.14で『📘 データ分析基盤構築入門』を写経してみた (16章)

|本シリーズのトップページ|
|:--|
|https://qiita.com/robozushi10/items/09a088b183127cefa51a|

# はじめに

Kibana (Elasticsearch, Fluentd) の学習のために、
Elasticsearch 7.14.0 環境で次の御著書を写経してみた.

📘 データ分析基盤構築入門［Fluentd，Elasticsearch，Kibanaによるログ収集と可視化]

https://gihyo.jp/book/2017/978-4-7741-9218-5


ただし、御著書は前提とする Elasticsearch バージョンが v5.4.3 であり、
v7.14.0 では動作しない(と思われる)部分があったので、動いたときの記録を書き出しておく.
(当然ながら、本文を転載するようなことはしない)

**本項では、御著書の 16章について書き出す.**

なお、私は Elasticsearch, Kibana, Fluentd 初学者のため認識誤りの部分もあるかと思う.



# 検証環境

次のコマンドで構築した. (詳細は [こちら](https://qiita.com/robozushi10/items/9cf4cbdbad613cff4f72) を参照)

```bash
$ git clone -b Qiita-02 git@github.com:robozushi10/qiita-efk.git
$ cd qiita-efk
$ docker-compose build --no-cache
$ docker-compose up -d
```

なお、当方はポートを次のように割り当てている.
・Elasticsearch ... 29200
・Kibana .......... 29601

また、X-Pack による認証は使用していない.

　

# 第16章　Kibanaのインストールと設定

## 16-4 インデックスの設定

### サンプルデータの入力 (P264)

シェイクスピアのサンプルデータ置き場の URL が異なる.

私は [公式チュートリアル](https://www.elastic.co/guide/en/kibana/7.0/tutorial-load-dataset.html) に従い次の通り入手した.

```bash
$ curl -O https://download.elastic.co/demos/kibana/gettingstarted/7.x/shakespeare.json
```



次に、Elasticsearch への登録コマンドについても次の変化点があった.

・curl コマンドの -X には PUT ではなく、POST を使う.
・curl コマンドに「-H "Content-Type: application/x-ndjson"」を付与する.

```bash
$ curl -X POST -H "Content-Type: application/x-ndjson" \
    localhost:29200/_bulk --data-binary @shakespeare.json 
```

　


### インデックスパターン設定の作成 (P265)

画面構成が変化しており、7.14.0 では次の(1)〜 の順で進めた.

(1) 左ペインで「Kibana」-「Index Patterns」をクリックする.
　　　あるいは http://<IP>:<PORT>/app/management/kibana/indexPatterns へのアクセスをする.
(2) 右ペインの「Create Index pattern」をクリックする.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246056/8d85d3b3-bd6d-9d2d-4596-4dbe596125c9.png)

(3) 「Index pattern name」欄に「shakespeare」と入力する.
(4) 「Next step >」をクリックする.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246056/5fd8d620-684c-2934-5fc1-6ffc9e997794.png)

### インデックス内容の確認 (P266)

画面構成が変化しており、7.14.0 では次の(1)〜 の順で進めた.

(1) 左ペインで「Analytics」-「Discover」をクリックする.
(2) 右ペインでドキュメント数が「111,396」件と表示されていることを確認した.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246056/8207266d-dab6-2f5c-4922-7369dea9717a.png)
Elasticsearch 7.14で『📘 データ分析基盤構築入門』を写経してみた (11章)

|本シリーズのトップページ|
|:--|
|https://qiita.com/robozushi10/items/09a088b183127cefa51a|

# はじめに

Kibana (Elasticsearch, Fluentd) の学習のために、
Elasticsearch 7.14.0 環境で次の御著書を写経してみた.

📘 データ分析基盤構築入門［Fluentd，Elasticsearch，Kibanaによるログ収集と可視化]

https://gihyo.jp/book/2017/978-4-7741-9218-5


ただし、御著書は前提とする Elasticsearch バージョンが v5.4.3 であり、
v7.14.0 では動作しない(と思われる)部分があったので、動いたときの記録を書き出しておく.
(当然ながら、本文を転載するようなことはしない)

**本項では、御著書の 11章について書き出す.**

なお、私は Elasticsearch, Kibana, Fluentd 初学者のため認識誤りの部分もあるかと思う.



# 検証環境

次のコマンドで構築した. (詳細は [こちら](https://qiita.com/robozushi10/items/9cf4cbdbad613cff4f72) を参照)

```bash
$ git clone -b Qiita-02 git@github.com:robozushi10/qiita-efk.git
$ cd qiita-efk
$ docker-compose build --no-cache
$ docker-compose up -d
```

なお、当方はポートを次のように割り当てている.
・Elasticsearch ... 29200
・Kibana .......... 29601

また、X-Pack による認証は使用していない.


# 第11章　Elasticsearchのはじめ方

## 11-4 インデックスとデータの操作

### データの取り込み (P210)

Elasticsearch への登録コマンドについても次の変化点があった.

・curl コマンドに「-H "Content-Type: application/json"」を付与する.

ここでは次のように a.sh というシェルスクリプトを作成して PUT を実施した.

**a.sh**

```bash
#!/bin/bash
 
H="Content-Type: application/json"
   
B=$(< <(cat <<EOF
{
"host": "localhost",
"timestamp": "06/May/2014:06:11:48 +0000",
"verb": "GET",
"request": "/category/finance",
"httpversion": "1.1",
"response": "200",
"bytes": "51"
}
EOF
))
   
curl -i -X PUT -H "$H" -d "$B" http://localhost:29200/test_index/apache_log/1

```


## 11-6 マッピング定義

### Index Template (P220)

御著書のテンプレート登録を実行したところ、次のエラーが発生してしまった.

```json
{
  "error": {
    "root_cause": [
      {
        "type": "mapper_parsing_exception",
        "reason": "Root mapping definition has unsupported parameters:  [apache_log : {properties={request={type=text, fields={keyword={ignore_above=1000, type=keyword}}}}}]"
      }
    ],
    "type": "mapper_parsing_exception",
    "reason": "Failed to parse mapping [_doc]: Root mapping definition has unsupported parameters:  [apache_log : {properties={request={type=text, fields={keyword={ignore_above=1000, type=keyword}}}}}]",
    "caused_by": {
      "type": "mapper_parsing_exception",
      "reason": "Root mapping definition has unsupported parameters:  [apache_log : {properties={request={type=text, fields={keyword={ignore_above=1000, type=keyword}}}}}]"
    }
  },
  "status": 400
}
```

どうやら下記「関連サイト」を見たところ、マッピングの「タイプ」の指定が廃止された影響の模様.

そこで次のように「apache_log」を削除して PUT すれば成功した.

```bash
#!/bin/bash

H="Content-Type: application/json"
   
B=$(< <(cat <<EOF
{
  "template": "test_*",
  "mappings": {
    "properties": {
      "request": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 1000
          }
        }
      }
    }
  }
}
EOF
))
   
curl -s -X PUT -H "$H" -d "$B" http://localhost:29200/_template/apache_log_template

```

### 関連サイト

https://teratail.com/questions/309509
https://www.elastic.co/jp/blog/moving-from-types-to-typeless-apis-in-elasticsearch-7-0
キャストに触れてみた！

今回はキャストについて説明していこうと思う。

**キャストとは**
型を変換すること。例えばint型をdouble型に変換など。
※int型→整数まで扱える
※double型→整数〜少数まで扱える

整数までしか扱えないものを整数〜少数まで扱えるものに変換するのは🙆‍♂️
扱える範囲が狭いものから範囲が広いものに変換。
**これを拡大変換という**

コードだと下記のようなものになる。

```Java
public class Main {
    public static void main(String[] args){
       double doubleA = 1234.5678;
       int intA = 12345;
       doubleA = intA;
       System.out.println(doubleA);
    }
}
```

3行目でdouble型の変数をdoubleAに代入。
4行目でint型の変数intAに代入。
5行目でintAの値をdoubleAに代入。

では扱える範囲が広いものから狭いものに変換することができるのか結論このままだとできない。
しかしこの場合は少数点以下を削除すれば入れられそう。
**そこでキャスト変換を使う。**

実際のコードの記述だと以下のようになる。

```Java
public class Main {
    public static void main(String[] args){
       double doubleA = 1234.5678;
       int intA = 12345;
       intA = (int)doubleA;
       System.out.println(intA);
    }
}
```
つまり以下のような式で表すことができる。
範囲が狭いもの　＝　（変換する型）範囲の広いもの;
NVIDIA GEFORCE ドライバをバージョンアップする。（只今、絶賛失敗中！！）

# NVIDIA Geforce ドライバをバージョンアップする。
AIとか関連で、cudaのバージョンを上げるため。

# 方法
Geforce Experienceというのがインストールされているはず。
それを使って、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635156/45f8e7e3-5c85-add8-7eff-bf2187d19af1.png)

で、実行する。

# ところが、、、

## 只今、絶賛、失敗中！！！
↓　只今、絶賛、失敗中！！！（一回、空き容量不足みたいなのが出た気が。。。その後、完全にやる気をなくしている。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635156/5e64cfe7-3eb7-ac23-d9e9-709b9387830f.png)

# まとめ
コメントなどあればお願いしますっ！！
Laravelでストアドプロシージャを実行させる

## はじめに
これまで、クエリビルダやEloquentを使ってCRUD処理を行ってきたが、ストアドを呼び出しても同様の処理が行えるのか、
そもそもストアドを呼べるのか、ふと疑問に思ったので試してみた。
今回はMySQLで作成したストアドプロシージャをLaravelから実行させてみる。

## 環境
・Laravel　7.30.4
・MySQL　5.7.32

## .envファイルの変更

```
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=hoge
DB_USERNAME="ユーザー名"
DB_PASSWORD="パスワード"
```
>変更内容を反映させるために「php artisan config:clear」を忘れずに…

## マイグレーションファイルの変更
今回は既存のUsersテーブルを使用し、カラムは必要最低限の「id」と「name」のみにします。

```php:xxxx_xx_xx_xxxxxx_create_users_table.php
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            // $table->string('email')->unique();
            // $table->timestamp('email_verified_at')->nullable();
            // $table->string('password');
            // $table->rememberToken();
            // $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('users');
    }
}

```

## 疎通確認（マイグレーションの実行）
下記のコマンドを実行し、DB上にテーブルが生成されていればOKです。

```php
php artisan migrate
```

テーブルの生成に成功したらデータを数件登録しておきましょう。

```sql
mysql> select * from users;
+----+------+
| id | name |
+----+------+
|  1 | hoge |
|  2 | huga |
|  3 | piyo |
+----+------+
3 rows in set (0.00 sec)
```

## ストアドプロシージャの作成
MySQLで簡単なストアドプロシージャを作成します。
ただの単体のUPDATE文です。

```sql
mysql> delimiter //
mysql> create procedure hoge_procedure(in param1 int, in param2 varchar(50))
    -> begin
    -> update users set name = param2 where id = param1;
    -> end //
Query OK, 0 rows affected (0.01 sec)

mysql> delimiter ;
```

## ストアドプロシージャの実行
DBファサードのstatementメソッドを使います。
プロジェクトのディレクトリに移動し、以下のコマンドを実行します。
今回は、id=1のhogeをhogehogeに更新させたいと思います。

```php
>>> DB::statement('CALL hoge_procedure(?, ?)', [1, 'hogehoge']);
=> true
```

```sql
mysql> select * from users;
+----+----------+
| id | name     |
+----+----------+
|  1 | hogehoge | -- hogeからhogehogeへ更新されている
|  2 | huga     |
|  3 | piyo     |
+----+----------+
3 rows in set (0.00 sec)
```
上手くいってますね。

## まとめ
ダラダラと書いて行きましたが、要するにDBファサードのstatementメソッドを使えばストアドが実行できるようです。

余談ですが、ストアドを関数インポートでモデルとして扱えたらSQLを直書きすることは無くなるのですが、Laravelでは難しいのかな。。。
【Flutter】BottomAppBarで画面最下部にボタン作成

## 背景

アプリ開発中に画面の最下部にbar全体を押下できるボタンが欲しかったが、検索方法が悪いのかなかなか見つからなかったのでメモとして投稿。
画像の様なボタンが欲しい。
![スクリーンショット 2021-08-11 3.47.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660544/d4859dd8-2c74-35f9-93b6-68c5ac394ba3.png)

## コード

```dart
import 'package:flutter/material.dart';

class TestPage extends StatelessWidget{

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('テスト'),
      ),
      // body: ,
      bottomNavigationBar: bottomButton(),
    );
  }

  Widget bottomButton(){
    return BottomAppBar(
      color: Colors.blue,
      child: TextButton(
        child: Text(
          "ボタン",
          style: TextStyle(
            color: Colors.white,
          ),
        ),
        style: TextButton.styleFrom(
          primary: Colors.blue,
        ),
        onPressed: (){},
      ),
    );
  }
}
```

## 画面
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3636303534342f31323361363437392d306265662d636264642d373530342d3065396266383230376561312e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660544/6e6b93fe-3545-398d-800b-0e2d91c526bb.png)
【R】メモ: 積み上げグラフの凡例の順番を指定する

Rのggplot2による積み上げグラフ（棒グラフや面グラフ）において凡例順序を指定したいときのメモです。
今回は事例として`WorldPhones`のデータセットを取り扱いました。

```r
library(tidyverse)

df <- data.frame(WorldPhones) %>% 
  rownames_to_column("year") %>% 
  gather(key="Country", value="Users", -year) %>% 
  mutate(year = as.integer(year))

# 凡例の順番を調整する前
g1 <-
  ggplot(df, aes(x=year, y=Users, fill=Country)) + 
  geom_area() +
  scale_fill_brewer("blues")
```
<img width="500" alt="g1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641876/527cad91-f35b-572f-5c98-0618011961a5.png">

これを例えば`Asia`, `Europe`, `Mid.Amer`, `Oceania`, `S.Amer`, `Africa`, `N.Amer`
の順番で表示させたい時はこう書けば出来ます。

```r
fill_order <- c('Asia', 'Europe', 'Mid.Amer',
                'Oceania', 'S.Amer', 'Africa', 'N.Amer')

g2 <-
  ggplot(df, aes(x=year, y=Users, fill=factor(Country, fill_order))) + 
  geom_area() +
  scale_fill_brewer("blues")
```

<img width="500" alt="g2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641876/7d32d40d-a0a0-107e-52d1-7d981464f043.png">

- 参考にさせていただきた記事  
[色々なビジュアライゼーションを描いてみた by R](https://qiita.com/tomiyou/items/ffb1bcffe1f9a537929a "色々なビジュアライゼーションを描いてみた by R")