OmniAICreator/Qiita-1.07M huggingface dataset:
使い勝手のいいLatexのマクロ集

普段Latexを使っていますか?自分は使っています！
LaTeXはいいですよね， LaTeXの記法に慣れちゃえばいいかんじに見えるようにかけるのでとても便利です．

そんな便利なLaTeXをより便利にしてくれるものとして**マクロ**という機能があります．マクロでは自分であらかじめコマンドを作っておくことで複雑な命令を簡単に定義することができます．

今回は自分がよく使うマクロをまとめていきたいと思います．

## はじめに
マクロを宣言する場所は, `\begin{document}`よりも前です．
`usepackage{}`を書いているところ(プリアセンブル）です！


## 参照系

LaTeXでは`\label{ラベル名}`でラベルづけしたものに対して`\ref{ラベル名}`をすると，自動で全体を通しての番号を取得する機能があります．

例えばこんな感じで

```latex
\begin{tabular}{|c|c|}
  \hline
    セル1 & セル2 \\ \hline
    セル3 & セル4 \\ \hline
    セル5 & セル6 \\ \hline
\end{tabular}
\label{tb:table1}

表\ref{tb:table1}では$\cdots$
```

書いてあげると， コンパイルした結果は， 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487681/35980e90-d365-1a27-71f4-e8156e0896ef.png)

みたいな感じで，通し番号の1が自動的に補完されます． `\ref`をよく使う場面としては，式番号，表番号，図番号があると思います．

`\ref`のダメなところとして，数字は自動で保管してくれますが，「図」や「式」などの数字の前の言葉は，自分で書かないといけません．これはめんどくさいですよね？

そこで自分は次のマクロを使っています.

```latex
% 図の参照
\newcommand{\Zu}[1]{図\ref{fig:#1}}

% 表の参照
\newcommand{\Hyou}[1]{表\ref{tb:#1}}

% 式の参照
\newcommand{\Shiki}[1]{式\eqref{eq:#1}}
```

使い方としては，

```latex
\begin{align}
  y = \sin x  \label{eq:sin}
\end{align}

%=====以下，使うときの書き方
\Shiki{sin}はサインカーブです
```

のようにすると, 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487681/e459e7b1-ce79-069f-123e-3c3ffe449960.png)

な感じで「式」も一緒に入るようになります． 図や表の時も同じように使うことができます！
漢字ではなくfig:1，table:1のようにしたいときは，マクロの漢字を変えたいものに書き換えれば良いです．

## 数学系

ベクトルや行列のときにボールドイタリックにしたいときに数式環境にするのめんどくさいですよね？

次のは数式環境下にしなくてもできるようにするマクロです．

```latex
% ボールド
\newcommand{\bi}[1]{\ensuremath{\boldsymbol{#1}}}

% 転置記号
\newcommand{\T}{\ensuremath{^{\text{T}}}}

% argmax, argmin ※argmax, argminは数式環境下!!
\newcommand{\argmax}{\mathop{\rm arg~max}\limits}
\newcommand{\argmin}{\mathop{\rm arg~min}\limits}

% =====以下，使うときの書き方

$x$はベクトルだから\bi{x}にしたい．

行列\bi{A}の転置は，\T{\bi{A}}ってかきたい．

$\underset{x \in\{0,1\}} \argmax{3x}=\{1\}$

$\underset{x \in \mathbb{N}}{\arg \min } \frac{1}{x}=\emptyset$

```

出力結果は，

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487681/12d31965-4cac-f50c-36ac-42febdd35e34.png)

## さいごに

今回挙げたマクロたちが毎回のようにつかっていくので，　テンプレートにとりあえずいれています．
もっとマクロについて興味を持っている方は,https://qiita.com/zr_tex8r/items/5067307890d36c0e4882 に詳しく書いてあるので見るといいと思います．

LaTeXで数式を打ちたくないときは，[mathpix](https://mathpix.com/)がとてもとっても便利です！
cronの使い方（自分用メモ）

仕事でサーバーにcronを設定した。
自分に必要だった情報を最小限に書く。

**やりたいこと:** Perlで作ったスクリプト```/foo/bar/baz.pl```を毎朝5時に実行する
**前提条件：**OSはLinux、シェルはbash

やったことは以下の通り（試行錯誤は除く）。

# EDITORの確認と設定
サーバー（Linux）にログインする。
EDITOR環境変数を確認する。

```bash
$ echo $EDITOR
```

空だった。
ここでcrontab編集をしようとするとviが起動してしまう。
ぼくはEmacsしか使い方が分からない。
Emacsを起動してみる。

``` bash
$ emacs
そんなコマンドありません的なエラーメッセージ
```

ダメだった。
Emacsをインストールしてもいいが、ここはnanoを使うことにする。
nanoはたいていLinuxにインストールされてて、使い方が分からなくても何とかなるエディターなの。

``` bash
$ EDITOR=nano
$ export EDITOR
$ echo $EDITOR
nano
```

無事nanoが設定できた。

# タイムゾーンの確認
現在時刻を知るコマンド```date```を使ってみる。

``` bash
$ date
Fri Aug 14 08:43:43 UTC 2020
```

UTC（世界協定時、ロンドン時刻と同じ）であることが分かる。
時差を調べるサイトで日本の朝５時がUTCで何時か調べる。

https://www.jisakeisan.com/

20:00と分かった。

# crontabの一覧表示
ようやくcrontabの設定。
```-l```オプションで現在設定されているcronの一覧表示（List）。

``` bash
$ crontab -l

```

何も出なかったので誰も何も設定していないと分かった。

# crontabの編集
編集は```-e```オプション（Edit）。
自分自身（ログインしたユーザー）で実行する場合は```-u```オプションは設定しなくて良い。

``` bash
$ crontab -e
```

さっき$EDITORに設定したnanoが起動するなの。


# crontabの設定
毎朝5時に/foo/bar/baz.plを実行するにはこうする。

``` crontab
0 20 * * * /foo/bar/baz.pl
```

nanoの使い方になるが、Ctrl+Oでファイルを書き出し（write Out）、Ctrl+Xでnanoを終了（eXit）する。
nanoの使い方は画面の下端に表示されるから覚えなくても平気なの。

以上。

# 参考資料

cronの設定方法
https://qiita.com/hikouki/items/e744b3a4d356d2af12cf

crontab ファイルの作成と編集
https://docs.oracle.com/cd/E19253-01/819-0379/sysrescron-24589/index.html

**（この項終わり）**
node.jsを使ってみる

node.jsをインストールしてみる。
参考：https://www.sejuku.net/blog/82322
# 1. ダウンロード
- https://nodejs.org/ja/
- https://nodejs.org/dist/v12.18.3/node-v12.18.3.pkg
- node-v12.18.3.pkgを実行してインストール。

実行してみる。

```
% node --version
v12.18.3
```

# 2. Hello, world!
```hello.js
console.log('Hello, world!')
```

```
% node hello.js
Hello, world!
```

と、無事実行できた。
参考：https://qiita.com/loremipsumjp/items/3d32a44fe80c9a2febbe

# 3. npmを使い、expressをインストールしてみる
参考：https://qiita.com/tarotaro1129/items/e02fbb911dc4af412ad0
npmとは、パッケージ管理システム。gemみたいなもの。
expressは、node.js版の簡易なWebサーバ。WEBrickみたいなもの。

```
% mkdir myapp
% cd myapp
% npm init
```

- ここで、10回ほどリターンを押す。package.jsonが作られる。

```
package name: (myapp) 
version: (1.0.0) 
description: 
entry point: (index.js) 
test command: 
git repository: 
keywords: 
author: 
license: (ISC) 
About to write to /Users/eto/dev/Day17_node/myapp/package.json:
```

```package.json
{
  "name": "myapp",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}
```

```
% npm install express --save
- package-lock.jsonが生成される。
```

- app.jsというファイルを作る。

```app.js
const express = require('express')
const app = express()
app.get('/', (req, res) => {
  res.send('Hello World!')
})
app.listen(8000, () => console.log('Example app listening on port 8000!'))
```

起動してみる。

```
% node app.js
Example app listening on port 8000!
```

- http://localhost:8000/ にアクセスしてみる。Webブラウザに、

```
Hello World!
```

と表示されていたら、成功。

done!
Splunk SPL 複数イベントの属性を集約して１イベントにまとめたい

https://qiita.com/Kokin-chan/items/a3b612ab44a5ff429a37
を見て、なんかできそうだったので

```sql:ref.spl
| makeresults
| eval _raw = "FieldA, FieldB
加茂,監督
加茂,選手
トルシエ,監督
ジーコ,選手
ザック,監督
ザック,選手
ザック,コーチ"
| multikv forceheader=1
| table FieldA FieldB
| eval name=case(FieldB="監督","FieldC",FieldB="選手","FieldD",FieldB="コーチ","FieldE")
| xyseries FieldA name FieldB
```


|FieldA|FieldB
|:-:|:-:|
加茂|選手
トルシエ|監督
ジーコ|選手
ザック|監督
ザック|選手
ザック|コーチ
が

FieldA|FieldC|FieldD|FieldE
|:-:|:-:|:-:|:-:|
ザック|監督|選手|コーチ
ジーコ||選手| 
トルシエ|監督|| 	 
加茂||選手	 
となる。

`| xyseries FieldA FieldB FieldB
| rename "監督" as FieldC, "選手" as FieldD, "コーチ" as FieldE`
の方が早いですね。
CPUの命令実行手段とレジスタ、機械語のアドレス指定方式

#CPUの命令実行手段とレジスタ
　CPUが命令を実行するために取り出した情報は、レジスタと呼ばれるCPU内部の記憶装置に保持します。

　レジスタの種類とそれぞれの役割は以下の通り。
![図38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686519/505f554d-a4ee-ee14-a274-0c9c1aacba14.png)


CPUの中がどんな感じになるかというと以下の図の通りになります。
![図39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686519/18c014c8-a318-46b3-0f3c-30181cfa7037.png)



図を見ていもわかりますが、あるレジスタで別のレジスタを代用したりとかもあるので、必ずしも上の表のレジスタが
すべてのっかっているというわけではない。

命令の実行手順は以下の通りになる。

**①命令の取り出し(フェッチ)**
　この手順で命令レジスタ、プログラムカウンタを使用します。
　１.取り出すべき命令がどこにあるかは、プログラムカウンタが知っている
　　　![図41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686519/382da73e-c1fa-8570-48c6-3a442844161c.png)

　2.プログラムカウンタの示すアドレスを参照して命令を取り出し、それを命令レジスタに記憶させます。
　　![図42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686519/61e73b08-e7db-1513-e5e4-52295f110e21.png)
　
　3.取り出しが終わったら、次の命令に備えてプログラムカウンタの値を１つ増加。
　　![図43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686519/ca2f7604-110b-4def-1e47-24e82576af6f.png)

**②命令の解読**
　この手順では命令レジスタと命令デコーダを使用します。
　命令レジスタは以下の構成で出来ている。
　 ![図44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686519/ffc976a7-b3ce-6bf2-be94-d132ce98578a.png)
　命令レジスタの命令部の中身が命令デコーダへと送られて命令デコーダはそれを解読して、必要な装置に制御信号を飛ばします。
　![図45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686519/5d2e2e36-942b-5815-f797-efe39d119e34.png)

**③対象データ(オペランド)読み出し**
 この手順では凡庸レジスタと命令レジスタを使用します。
　※ただしアドレスの指定方式にはいろんな種類があるので、オペランド部に直接<font color="#cc0000">「メモリのアドレス」</font>そのものが期されているとは限りません。
　　![図46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686519/5f9721c2-a320-7cd1-44f0-9746c1ee4967.png)

**④命令実行**
　この手順では凡用レジスタとALUを使用します。
　**※以下の図は命令が演算処理だった場合となっております。**
 ![図47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686519/dfcb1c3e-5ae8-38c9-bd99-253c8e2db75d.png)

④命令実行が終わったら、また実行手順の①命令の取り出し(フェッチ)ン戻って一連の手順を繰り返します。

#機械語のアドレス指定方式
　計算によって求めた主記憶装置上のアドレスを**実行アドレス(もしくは有効アドレス)**と呼ぶ
　指定方式は以下６種類がある

 **即値アドレス指定方式**
  オペランド部に、対象となるデータそのものが入っている方式
![図48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686519/58a66fa6-9368-6179-64bc-f71a7143af42.png)

**直接アドレス指定方式**
 オペランド部に記載してあるアドレスが、そのまま実行アドレスとして使える方式
　![図49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686519/fc043112-acd7-5cef-0dc8-62f7e58068ca.png)

**間接アドレス指定方式**
　オペランド部に記載してあるアドレスの中に**「対象となるデータが入っている箇所を示すメモリアドレス」**が記載されている。
　![図50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686519/0a5c4efa-5a65-50dc-40f0-929c1ce3e7e4.png)

**インデックス(指標)アドレス指定方式**
 オペランド部の値に、インデックス(指標)レジスタの値を加算することで実行アドレスを求める。
  
![図51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686519/63194cef-f239-40d9-3227-fa3386610dd2.png)

　インデックスレジスタとは
　**連続したアドレスを扱うときに用いるレジスタです。**
 
**ベースアドレス指定方式**
 オペランド部の値に、ベースレジスタの値を加算することで実行アドレスを求める。
　![図52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686519/febd0c91-701a-9e93-d4c2-d9478fa2b6f4.png)
　**ベースレジスタとは**
　プログラムがメモリ上にロードされたときの、戦闘アドレスを記憶しているレジスタ。

**相対アドレス指定方式**
　オペランドの値に、プログラムカウンタの値を加算することで実行アドレスを求める。
　　![図53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686519/e7fb4e0b-e290-3c0f-25a8-9896ac0234f3.png)


#以上
【iOS】Pythonista3でQiitaのトレンドを表示してくれるウィジェットを作った。【Python】

#はじめに
iPhone, iPadユーザーの皆さん、iOS端末上でPythonでの開発ができる[Pythonista3](https://apps.apple.com/jp/app/pythonista-3/id1085978097)というアプリはご存知でしょうか？
Pythonを実行するだけであれば個人的には[Carnets - Jupyter](https://apps.apple.com/jp/app/carnets-jupyter/id1450994949)がおすすめですが、
Pythonista3では各種ショートカットやウィジェットなどといったアブリ外から使用可能な機能の開発や、ゲームを作ることも出来ます。

今回はそんなPythonista3を使って
**Qiitaのトレンドを表示してくれて、クリックするとSafariでそのページを開いてくれるウィジェット**
を作成したので紹介したいと思います。
![qwid.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501281/dd91298e-77cb-5dc9-61f7-5881974a686f.png)

#やったこと
今回のウィジェットの場合、`Example/Widget`下にある`Launcher.py`の内容がほとんどそのまま使えるので、それをベースに、

・QiitaのトップページからトレンドのタイトルとURLを取得してくる機能
・取得した情報を一時的に保存しておく機能
・前回の情報の取得から一定時間上経過していたら再度Qiitaにアクセスし情報を更新する機能

を追加しました。

#コード
列数、折り畳んだ状態での行数、フォントサイズの変数をインポート文の後にまとめておいたので、お好みでレイアウトを調節してください。
窮屈＆押しにくくなりますが、行数を5以上にすれば全デイリートレンド（30件）を表示できます。

```python:qiita_trends_widget.py
import re
import requests
import appex, ui
import os
from math import ceil, floor
import webbrowser
import pickle
import time

COLS = 1
ROWS = 3
fontsize = 12

def get_trend():
	trends = []
	text = requests.get('https://qiita.com/').text
	titles = re.findall('class="tr-Item_title" href="(.+?)">(.+?)<', text)
	urls = re.findall('uuid&quot;:&quot;.{10,50}?&quot;,', text)
	for i in titles:
		trends.append({'title':i[0], 'url':i[1]})
	trends.append({'lastUpdate':time.time()})
	with open("trends.pickle", "wb") as f:
			pickle.dump(trends, f)
	return trends


class LauncherView (ui.View):
	def __init__(self, shortcuts, *args, **kwargs):
		row_height = 110 / ROWS
		super().__init__(self, frame=(0, 0, 300, ceil(len(shortcuts[:-1]) / COLS) * row_height), *args, **kwargs)
		self.buttons = []
		for s in shortcuts[:-1]:
			btn = ui.Button(title=' ' + s['title'], name=s['url'], action=self.button_action, bg_color='#73c239', tint_color='#fff', corner_radius=7, font=('<System-Bold>',fontsize))
			self.add_subview(btn)
			self.buttons.append(btn)
	
	def layout(self):
		bw = (self.width - 10) / COLS
		bh = floor(self.height / ROWS) if self.height <= 130 else floor(110 / ROWS)
		for i, btn in enumerate(self.buttons):
			btn.frame = ui.Rect(i%COLS * bw + 5, i//COLS * bh, bw, bh).inset(2, 2)
			btn.alpha = 1 if btn.frame.max_y < self.height else 0
		
	def button_action(self, sender):
		webbrowser.open(sender.name)

def main():
	widget_name = __file__ + str(os.stat(__file__).st_mtime)
	v = appex.get_widget_view()
	if v is None or v.name != widget_name:
		try:
			with open("trends.pickle", "rb") as f:
				SHORTCUT = pickle.load(f)
		except:
			SHORTCUT = [{'lastUpdate':time.time() - 86400}]
			with open("trends.pickle", "wb") as f:
				pickle.dump(SHORTCUT, f)
		SHORTCUTS = get_trend() if time.time() - SHORTCUT[-1]['lastUpdate'] > 1800 else SHORTCUT #前回から1800秒(30分)以上経っていたら更新
		v = LauncherView(SHORTCUTS)
		v.name = widget_name
		appex.set_widget_view(v)

if __name__ == '__main__':
	main()
```

#まとめ
**Pythonista3はいいぞ**（使えるパッケージ増えるといいなあ…）
[C++]DXライブラリ(DxLib)をMinGWで使う

#はじめに
`g++`のバージョンに一番近いものが`8_2_0`だったので、それを使いました。

#環境
 - Windows 10
 - g++ 9.2.0 (MinGW)
 - GNU make 3.81
 - [DxLib (8_2_0)](https://dxlib.xsrv.jp/)

# ディレクトリの構成
`8_2_0`フォルダの中で、静的ライブラリを`lib`フォルダに、ヘッダファイルを`head`フォルダに入れました。
`main.cpp`と同じ階層に`Makefile`及び`8_2_0`フォルダを配置しています。

#Makefile
```Makefile:Makefile

build:
	g++ -o dx_exe main.cpp \
	 -I ./8_2_0/head \
	 -L ./8_2_0/lib \
	 -DDX_GCC_COMPILE -DDX_NON_INLINE_ASM \
	 -lDxLib \
	 -lDxUseCLib \
	 -lDxDrawFunc \
	 -ljpeg \
	 -lpng \
	 -lzlib \
	 -ltiff \
	 -ltheora_static \
	 -lvorbis_static \
	 -lvorbisfile_static \
	 -logg_static \
	 -lbulletdynamics \
	 -lbulletcollision \
	 -lbulletmath \
	 -lopusfile \
	 -lopus \
	 -lsilk_common \
	 -lcelt

run:
	dx_exe.exe

```

#main.cpp

```c++:main.cpp

#include "DxLib.h"

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){

	unsigned int Cr;

	ChangeWindowMode(TRUE);
	SetGraphMode(1280, 720, 32);

	if(DxLib_Init() == -1){
		return -1;
	}

	Cr = GetColor(255, 255, 255);

	DrawString(250, 240 - 32, "Hello DxLib!", Cr);

	WaitKey();

	DxLib_End();

return 0;
}

```

動作としては、ウィンドウモードで文字列を表示するだけです。

#最後に
最近暑くてボケーっとしてます
Railsのテンプレート機能(ERB)をController(Action View)以外で使う

# 概要

Railsは、テンプレートをアクションで紐付けてくれるので便利ですよね。
Action ViewとERB (Embedded Ruby)ってやつです。
たまに、そのテンプレートを、他の箇所で使いたいことがあります。
調べましたがあまり情報が出てこなかったり、見つけたと思ったら動かなかったりしたので解決した方法を備忘として投稿します。

# 動作環境
ruby 2.6.5
rails 5.2.3

# サンプル

例えばJobとかで利用。

app/views下（任意の場所可）にtemplateを作成。

```ERB:sample.html.erb
<%= user_name %>さんへ

これはサンプルです。

```

次にJob。

```ruby:send_template_job.rb
class SendTemplateJob < ApplicationJob
  queue_as :default

  def perform(*args)
    # テンプレートを使う
    content = ActionView::Base.new('app/views').render(file: 'sample',
                                                       locals: { user_name: current_user.name },
                                                       layout: false)
    # テンプレートを利用して生成した文字列をどこかに送る処理を記載
    # 例えばslackとか

  end
end
```

こんな感じで書くと、erb内のuser_nameて定義してある変数が文字列として展開され取得できます。
Qiitaの書き方

このアカウントでは、コードや数式を学習していく上で気づいた事などを書いていくので、 Markdown記法とやらをまず試してみようと思う。

#Code-コードの挿入

①

```main.py
print("Hello World!")
```

↑みたいにするのはバッククオート（```）で挟む

②`print("haha")`
↑網掛け表示はバッククオート（`）で挟む



#テキストの装飾
①
######見出し

↑文字の前に＃をつける
＃の数を増やせば小さい見出しになる

②**強調**・*強調*
↑\**で挟めば太字、\*で挟めばイタリック体

#リスト
①

* タスク１
* タスク２
 
↑文頭に*を入れて半角スペース

②

* [ ] タスク１
* [x] タスク２

↑文頭に* [ ]を入れて半角スペース

#リンク
①[Qiita](http://qiita.com "Qiita")
↑\[リンクテキスト](URL "タイトル")

②[ここ][link-1] と [この][link-1] リンクは同じになります。
[link-1][] も可能です。
[link-1]:http://qiita.com

#数式挿入
①

```math
\left( \sum_{k=1}^n a_k b_k \right)^{!!2} \leq
\left( \sum_{k=1}^n a_k^2 \right) \left( \sum_{k=1}^n b_k^2 \right)
```
↑バッククオート（｀｀｀math 数式　｀｀｀）を使う

②$a=1,2,3$
↑\$を挟むと数式をインラインで表示
タスクスケジューラで定時退社(残業可)

#はじめに
タスクスケジューラなんて機能を使ってみたが、調べてもGUIの情報が多くCUIで行う記述が少なかったり、古かったので投稿してみた。
尚、概ね古い情報でも問題なかったりするので他に見やすいサイトがあればそちらへ。

もしくはcmdで`schtasks /?`でヘルプが出ます。

#要件

- 定期的に定時でPCをシャットダウンさせたい
- 残業するときに突然シャットダウンすると困る
- コストをかけたくない(Windowsデフォルトの機能を用いる)

#タスクスケジューラ
タスクスケジューラとはWindows標準機能としてあり、GUI/CUI両方で作成することができる。
今回はbatに書き込み、それを実行することで作成・停止を一括で行うようにした。

#コマンド
```tsk.bat
set sd_time=19:30
set tsk="schtasks /Create /tn shdwn /tr '%0 sd' /sc once /st %sd_time% /F"

if "%1" == "" (
 schtasks /Create /tn mk_shdwn /tr %tsk% /sc ONLOGON /F
) else (
 shutdown /s /f /t 0
)
```

注：実行環境からコピペしたわけではないので間違いあったらすいません。
#使い方

1. batファイルを適当な場所に置いて実行(ドキュメントとかデスクトップ下のほうが望ましい？)
2. 実行すると「次回」ログオン時から`shdwn`を作成する`mk_shdwn`を作成する。
3. `shdwn`タスクがbatファイルに引数付きで呼び出すことによってシャットダウンを実行する。
4. 残業する等でシャットダウンしてほしくない場合は再度batファイルを使用。
5. batファイルの場所を変更した場合にも再度batファイルを使用

else文を書き換えたり、記述を追加すればシャットダウン時に別処理を入れることも可能。
引数を指定してログオン時の呼び出しも自信にすればbatファイル内に書き込んで複数の処理をかますことも可能。

#解説
いくつか解説必要かな？って思った部分のみ記述
希望次第で追加

##CUIタスクスケジューラで引数を記述する際
CUIのタスクスケジューラで呼び出すファイルはexeファイルの引数無しを想定しているのか、引数を直接書き込めない
誤：`schtasks /Create /tn shdwn /tr shutdown /s /f /t 0 /sc once /st 19:30 /F`
上のように書くと`/sは引数に指定できません`みたいなエラーが出る。
なのでこの場合
正：`schtasks /Create /tn shdwn /tr "shutdown /s /f /t 0" /sc once /st 19:30 /F`
と、`""`で囲まないといけない。

##1回使い捨てのタスクは残ったままになる
`schtasks /Create ～ /sc once /st 〇:〇`　だけで作成するとタスクが残り、同じ名前で作成できないため、`/F`で強制的に作成をつける

##タスクスケジューラ内でタスクスケジューラを作成する
今回は親タスクを作り、子タスクを作成させる。子タスクは日によって削除する。という要件が必要だったために回りくどいことをしてさらに自信を子タスクから呼び出すなんてことをしている。
その際、上の**CUIタスクスケジューラで引数を記述する際**で話たように引数の問題が出るために`""`で囲まないとエラーになる。さらに、その内部に`""`で記述がある場合は`''`に書き換えることで問題なく作成ができる。

#要望・改善点あればコメントください。
今回実装した機能を拡張したりしたら追記したいと思うし、他に解説してほしいものがあればコメントいただきたい。
また、batファイルも今回初めて記述したので記述方法が間違ってたりお作法等あれば教えてほしいです。

**雑記**
他にも作業はいろいろしているものの、さすがに仕事と直接かかわることは書けないのでしばらくは投稿ができない(仕事とは端末違うのでコピペできないからコード類は辛い)。
[100本ノック](https://qiita.com/sola_wing529/items/5fdbd97308dd88da28eb)は環境が変わりデータがすべてなくなった為に実行できる環境ができるまでは保留である。(またもう一度やり直したいとは思ってる)
Python3における基礎的な正規表現のまとめ

Pythonでの正規表現(re)について使用頻度の高いものをまとめました。

**※投稿者がMac環境のため\(バックスラッシュ)で表記されている部分がありますが、Windows環境の方は¥(えん)マークに読み替えてください。**

# 位置関係に関する正規表現
| 記号 | 説明 |
| :-: | :-: |
| ^ | 文字列の先頭からパターンに一致するかを判定 |
| $ | 文字列の末尾からパターンに一致するかを判定 |


# 繰り返しに関する正規表現
| 記号 | 説明 |
| :-: | :-: |
| ? | 0回または1回 |
| * | 0回以上 |
| + | 1回以上 |
| {m} | m回 |
| {m,} | m回以上 |
| {m,n} | m回以上、n回以下 |

# 文字制限に関する正規表現
| 記号 | 説明 |
| :-: | :-: |
| [0-9] | すべての数字 |
| [a-zA-Z] | すべてのアルファベット |
| [a-zA-Z0-9] | すべてのアルファベットと数字 |
| [^a-zA-Z0-9] | すべてのアルファベットと数字以外(特殊記号等) |

集合に^(ハット)をつけると、集合の条件の否定となる。


# ORを表す正規表現
| 記号 | 説明 |
| :-: | :-: |
| a&#124;b | a or b(aかbのいずれか) |
| [ab] | a or b(aかbのいずれか) |


# 特殊シーケンス
| 記号 | 説明 |
| :-: | :-: |
| \d | すべての数字 [0-9]と同じ |
| \D | すべての数字以外 ^[0-9]と同じ |
| \w | すべての英数字と_ [a-zA-Z0-9_]と同じ |
| \W | すべての英数字と_以外 [^a-zA-Z0-9_]と同じ |
| \s | 空白 |
| \S | 空白以外 |
| \A | 文字列の先頭 ^と同じ |
| \Z | 文字列の末尾 $と同じ |
定義済みの正規表現。
バックスラッシュ(または¥キー)を先頭に記述する。


# 参考(より詳しい情報はこちら)
[re --- 正規表現操作 — Python 3.8.5 ドキュメント](https://docs.python.org/ja/3/library/re.html)
[基本的な正規表現一覧](https://murashun.jp/blog/20190215-01.html)
[書きながら覚える！Pythonで正規表現を使う方法【初心者向け】](https://techacademy.jp/magazine/15635)

記事内容とは関係ないけど記事を書く時に便利だったもの
[Markdown表テーブル作成ツール](https://notepm.jp/markdown-table-tool)
Snackbarの文言が複数行の時に上下に大きな空白ができるのを調整する

この記事は material-components 1.2.0 での内容になります

## 遭遇した問題

Snackbar の文言が複数行の時に上下の Padding が広すぎる気がする 🤔

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126298/8609a0b6-8ec1-3449-f04b-3be824814cd7.png" width="200px" />

[Snackbar のガイドライン](https://material.io/components/snackbars) をみてもここまで上下に Padding は設定されていなさそう。


## 解決策
`design_snackbar_padding_vertical_2lines` のリソースをオーバーライドする
 
```
<dimen name="design_snackbar_padding_vertical_2lines">14dp</dimen>
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126298/c84bd34c-f3f9-4fb5-38a2-dbf0f70b2e0f.png" width="200px" />


## 原因

`Snackbar` の文言の上下の Padding は `SnackbarContentLayout` の内部で

- 1 行の時は 14dp (R.dimen.design_snackbar_padding_vertical)
- 複数行の時は 24dp (R.dimen.design_snackbar_padding_vertical_2lines) 

が設定されるようになっていて、これが Padding が広い理由の原因のよう。
https://github.com/material-components/material-components-android/blob/f00cd57f133d394347baf3e75d5ba6cdb41bcf85/lib/java/com/google/android/material/snackbar/SnackbarContentLayout.java#L91-L94

<br />
`SnackbarContentLayout` へ直接アクセスが難しいので、Snackbar 周りを自分で実装しない限りはリソースのオーバーライドが回避策になりそうだが、ライブラリの方でリソース名がリネームされる可能性はある。


この値は FullWidth な Snackbar の時の名残なのかな🤔(個人的な解釈)
【Nuxt.js】Nuxt文法編：created

🎈 この記事はWP専用です
https://wp.me/pc9NHC-z1

# 前置き
ライフサイクルフックの1つcreated()
似ていると言われるmounted()との違いや
使い方を解説していきます🍎🙋‍♀️



# created()
## created()とは

API通信を行うものです🔄
基本はcreated()を使用し、
どうしてもDOMを操作しないといけない時に
mounted()を使います💡

Vuexでいうならactionsにあたる部分です❣️
Vuexを使用する際は
actionsをcreated()内で
dispatchを使って呼び出すこともできます。

## 実行タイミング

インスタンス作成後、
マウンティング前(DOMが作られる前)
https://jp.vuejs.org/v2/api/#created

つまり
$elプロパティや
getElementByIdなどのDOM操作は使えず、
thisコンテキストは使えます🍒



# 比較
まずはAPIを使わず
簡単なコードで比較しましょう👀

🎈 続きはWPでご覧ください👀
https://wp.me/pc9NHC-z1
初心者向けにスマートテレビを紹介

# 概要
* 最近は初めてスマートテレビの開発を触ったので、把握できることをまとめて紹介する
* スマートテレビはいろいろな種類があって、Apple TV, Fire TV, Android TV OSを搭載したモデル、Android OSベースのデバイスなどがある
* この文書にはAndroidベースでスマートテレビを紹介する


# Android TVとは
* Google社提供するTV向けプラットフォーム
* Android OS Version: Android 5.0~
* Google Play StoreにTV向けアプリ公開できる
* グーグルのAndroid TVを搭載したモデルが、ソニーやパナソニック、シャープなどから発売されている
    * 例：[AQUOS 8T-C80AX1](https://jp.sharp/aquos/products/8tc80ax1_internet.html#title12)


# Fire TVとは
* Amazon社が提供するTV向けプラットフォーム
* Fire OS 5 (Based on Android 5.1 - API 22)
* Amazon App StoreにTV向けアプリを公開可能
* [Fire TV デバイス](https://www.amazon.co.jp/Fire-TV-Amazon/b?ie=UTF8&node=3933930051)


# Xiaomi TVとは
* Xiaomi社が提供するTV向けプラットフォーム
* Android 4.2
* Xiaomi App StoreにTV向けアプリを公開可能
* 例：[オリジナルXiaomi Mi TV 4A](https://jp.gearbest.com/desktop-computer-monitor/pp_659716.html)


# Android TV開発に関する資料
* [Googleドキュメント](https://developer.android.com/training/tv?hl=ja)
* [Android TV デザイン](https://designguidelines.withgoogle.com/android-tv/android-tv/introduction.html)
* [デバイス](https://www.androidtv-guide.com/other/remotes)
    * [google docs](https://docs.google.com/spreadsheets/d/1kdnHLt673EjoAJisOal2uIpcmVS2Defbgk1ntWRLY3E/edit#gid=560573931)


# Android TVとスマホアプリ開発との違い
## focus
* スマホアプリにエディットテキストにfocusが表示されるが、TVアプリはtouch padではなくて、コントローラを使っているので、どこでもfocusが表示される
* focusの表示方法は大体的に以下のように
    * 画像や文字が大きくなる ![スクリーンショット 2020-05-26 9.36.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13451/d7f0c9a8-6976-4cd9-463e-f1895c06a172.png)
    * 要素の背景は深い色が表示される ![スクリーンショット 2020-05-26 9.37.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13451/5d63b5c0-48cc-775e-1cdb-52e68c707b5c.png)


## コントローラーとfocusの移動
* スマホのタッチスクリーンと違い、コントローラーで画面を操作しないといけない
* これより開発はスマホと全然違って、focus移動の方向と特定条件よりfocusの処理がとても面倒だ
* leanbackライブラリを利用すると、focus移動の問題を簡単に対応できる

<img width="60" alt="スクリーンショット 2020-06-04 9.28.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13451/081b1b06-31a1-c4de-2775-cb4fdeee60fa.png">



## 音声認識
* コントローラで操作することは、タッチスクリーンよりとても遅くなってしまう
* 音声認識の操作方法で操作が速くなって、開発も便利になる


# leanback
* テンプレートフラグメントを使用して、Android TV デバイス向けのアプリを作成できるライブラリである
ホテルチェーンの新ビジネス戦略－午後

平成31年春期 午後問題2

ファイル：2019h31h_ap_pm_qs.pdf

１、表１中のイ～オのうち、業界外の要因に分類される脅威を二つ選ぶ。
ウ、オ
→
イ、ウ

私は、オを選択してしまうのは、供給業者が業界外と思ったのでです。
ただ、D社の角度からみると、供給業者も、業界内だろうね。

イは、新規参入は他社ので、業界外？かなというふうに理解している。
エは、他社だけど、業界内ですね。


２、表１中のa,bに入れる適切な字句を、１０字以内で答えよ。
a 競合ホテル
b 低価格
→
a 競合他社
b 低価格

まあ、多分、競合ホテルも誤らないですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/71784f91-b16e-67b4-6efa-a4d85f299299.png)


３、本文中の下線②について、観光ホテル事業においては、新規参入の立場であるD社が、所有企業と提携することによって可能になった、参入障壁を超えるための対策、２５字以内で述べよ。
D社が所有企業の保養所を観光ホテルとして運営する
→
開業時の初期投資を賃借料で代替する。

多分、質問に書いている障壁とは、下記の新規参入の脅威で書いている初期投資、運営のノウハウとの障壁だろうね。
運営のノウハウは大丈夫だけど、初期投資の障壁を超えなきゃいけないですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/5f9ea4b6-afbd-a55f-107c-66f83047c643.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/8159bed4-fa8b-33cb-b9d9-8053466f1795.png)


４、本文中の下線③について、提供できる新たな感情的な価値を、２５字以内で述べよ。
自社のを優先的に予約でき、他社のも低価格利用できる
→
他社の魅力的な保養所も利用できる楽しみ

多分質問には、新たな。。。のことですね。
自社の保養所は、そもそもと同じように利用するので、新たな感情的な価値とな言えませんかね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/56fe4081-e396-1e69-7958-d59dbabf81dc.png)


５、本文中の下線④について、D社の飲食関連コストの上昇を抑制すること以外の狙いを、３０字以内で答えよ。
観光地商店街の飲食などは集客のアピールポイントの一つとする
→
地域を活性化することで、ホテルの集客力を高めること

参考答えの「地域活性化」のは、地域は繁栄すると、我々は、そこに旅行に行きたいとのことですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/f9de3ea1-dace-30b9-a7fe-706ff7d7ef72.png)


６、本文中の下線⑤について、スタッフの配置をどのようにしたらよいか。
予約状況により、時間帯ごとで適当に配置する
→
保養所全体でスタッフを最適配置する。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/83c6047e-4022-8ebe-e0a5-1185e3cf5f3e.png)
phpのあとにapacheをインストールした場合ソースが表示されるのを修正

本来はapacheをインストール後にphpを入れればいいのだが、先にphpを入れてしまった場合の対処方法

php -> apache2 をインストール

~~~~
sudo apt install php
sudo apt install apache2
~~~~

apache用のphpモジュールのインストール

~~~~
sudo apt-get install libapache2-mod-php
~~~~

一旦apacheのphp関係の動作を止める

~~~~
sudo a2enmod mpm_prefork

or

sudo a2dismod mpm_event
~~~~
※動作方法を mpm_prefork か mpm_event にするかはチューニングする際に考慮します。php-cgi を使用するときなど。

phpを再度apacheに認識させる

~~~~
sudo a2enmod php7.3
~~~~

apacheサービスの再起動

~~~~
sudo service apache2 restart
~~~~
遺伝的アルゴリズムで関数の最適値を求める（その２）

# 前回
前回作成したコード
https://qiita.com/nmat0031785/items/ceea6f78ab71e9956fce

# 最適化結果の記録
前回使用した```algorithms.eaSimple```は各世代の統計量しか残せない。
全個体の設計変数と適応度が残せるように改良する。

### 初期個体群の生成、評価
まずは初期個体のみ適応度を計算する。
その後、設計変数と適応度、世代（初期世代なので0）、個体番号をpd.DataFrameに保存する。

```python:sample_GA.py
# 初期個体群を生成
pop = toolbox.population_guess()

# 初期個体の適応度の評価
fitnesses = toolbox.map(toolbox.evaluate, pop)
for ind, fit in zip(pop, fitnesses):
    ind.fitness.values = fit
fits = [ind.fitness.values[0] for ind in pop]

# 初期個体をlogbookに格納
logbook = pd.DataFrame([])
t1 = pd.DataFrame(pop)
t1.columns = ["x1", "x2"]
t1 = t1.assign(fits=fits, generation=0, ids=range(len(pop)))
logbook = logbook.append(t1)
```
### 進化ループ
進化ループに入る。```offspring = toolbox.select(pop, POP_SIZE)```で、```POP_SIZE```分の個体を初期個体群```pop```から改めて選択し直している。これにより初期個体群と進化ループの個体群の数を変更する事が可能。
for分で各世代の個体に乱数を与え、```CX_PB```、```MUT_PB```に引っかかった個体を交叉、変異の対象としている。その後、新しい個体について適応度を再評価し、pd.DataFrameに追記していく。

```python:sample_GA.py
# パラメータ
N_GEN = 20       # 繰り返し世代数
POP_SIZE = 100   # 集団内の個体数
CX_PB = 0.8      # 交叉確率
MUT_PB = 0.05    # 変異確率

# 進化ループ開始
g = 0
while g < N_GEN:
    g = g + 1
    
    # 次世代個体の選択・複製
    offspring = toolbox.select(pop, POP_SIZE)
    offspring = list(map(toolbox.clone, offspring))

    # 交叉
    for child1, child2 in zip(offspring[::2], offspring[1::2]):
        # 交叉させる個体を選択
        if random.random() < CX_PB:
            toolbox.mate(child1, child2)
            # 交叉させた個体は適応度を削除する
            del child1.fitness.values
            del child2.fitness.values

    # 変異
    for mutant in offspring:
        # 変異させる個体を選択
        if random.random() < MUT_PB:
            toolbox.mutate(mutant)
            # 変異させた個体は適応度を削除する
            del mutant.fitness.values

    # 適応度を削除した個体について適応度の再評価を行う
    invalid_ind = [ind for ind in offspring if not ind.fitness.valid]
    fitnesses = map(toolbox.evaluate, invalid_ind)
    for ind, fit in zip(invalid_ind, fitnesses):
        ind.fitness.values = fit
    
    # 個体集団を新世代個体集団で更新
    pop[:] = offspring

    # 新世代の全個体の適応度の抽出
    fits = [ind.fitness.values[0] for ind in pop]

    # logbookに格納
    t1 = pd.DataFrame(pop)
    t1.columns = ["x1", "x2"]
    t1 = t1.assign(fits=fits, generation=g, ids=range(POP_SIZE))
    logbook = logbook.append(t1)
    
    # デバッグ
    print(t1)
```
```terminal:terminal
・
・
・
-- Generation 20 --
          x1        x2        fits  generation  ids
0  -1.582142 -3.130247 -106.764537          20    0
1  -1.582142 -3.130247 -106.764537          20    1
2  -1.582142 -3.130247 -106.764537          20    2
3  -1.582142 -3.130247 -106.764537          20    3
4  -1.582142 -3.130247 -106.764537          20    4
..       ...       ...         ...         ...  ...
95 -1.582142 -3.130247 -106.764537          20   95
96 -1.582142 -3.130247 -106.764537          20   96
97 -1.582142 -3.130247 -106.764537          20   97
98 -1.582142 -3.130247 -106.764537          20   98
99 -1.582142 -3.130247 -106.764537          20   99

[100 rows x 5 columns]
```

### 保存
結果をCSVで保存する。

```python:sample_GA.py
logbook.to_csv("result.csv", sep=",", index=None, header=None)
```

# まとめ
各個体の設計変数、適応度の出力。
次回は結果の可視化まで。
localhostで(google_oauth2) Authentication failure! csrf_detected: OmniAuth::Strategies::OAuth2::CallbackError, csrf_detected | CSRF detectedって言われた時の対応

# 結論
今回はlocalhostで試していたので、config/devise/session_store.rbを下記のように変更すればOK。

```
if Rails.env.production?
  Rails.application.config.session_store :cookie_store, key: '_my_session', expire_after: 1.weeks, domain: 'mydomain.com'
else
  Rails.application.config.session_store :cookie_store, key: '_my_session', domain: 'localhost'
end
```


# 原因など
Ruby On Railsのdeviseは本当に優秀であっという間にFacebookのログインは出来るようになったのですが、どうもlocalhostで試した時に「Google OAuthの挙動がおかしいような？」となり調べました。

どうもエラーでググると「provider_ignores_state: true を設定して解決！」みたいな記事がちらほら見つかりましたが、普通に考えてそれって必要だからチェックをしてエラーを吐いているわけですよね？

なので、もう少し調べてみると、[ドンピシャの記事](https://github.com/omniauth/omniauth-oauth2/issues/58)を発見！

[ドンピシャの記事](https://github.com/omniauth/omniauth-oauth2/issues/58)によると、「/config/initializer/session_store.rb」に定義されているドメインとGoogle APIの「origin/redirect_uri」に定義されているドメインが違うと発生するとのこと。

というわけで、冒頭の対応方法で解決できました。
PL-100: Microsoft Power Platform App Makerベータ試験の受験記録

この[記事](https://qiita.com/allforbigfire/items/68dfe2e2a5b682bf70d1)にあるように、受験料が安いベータ試験の存在を知り、[試験 PL-100: Microsoft Power Platform App Maker (beta)](https://docs.microsoft.com/ja-jp/learn/certifications/exams/pl-100)を申し込みました。

このベータ試験の受験料は、4643円でした。

##### Power Platform

>Power Platform は Power Apps、Power Automate、Power BI でデータの収集から解析・予測までロー コーディングで実現するプラットフォームです。Microsoft Office を使い慣れたユーザーであれば、新しい業務アプリケーションの構築を容易に行うことができます。
[Microsoft Power Platform](https://www.microsoft.com/ja-jp/biz/dynamics/power-platform.aspx)

##### 勉強の方法
[焦げlog(kogelog)](https://kogelog.com/)様の[MCP「PL-100 : Microsoft Power Platform App Maker (beta)」が受験可能になりました](https://kogelog.com/2020/07/23/20200723-01/)記事が大変参考になりました。

MS Learnのラーニングパスは、ほとんど日本語化されていましたが、ほとんど取り組む時間が取れなかったです。

##### 受験後の感想
![IMG_4499.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155894/069d3d20-da23-079f-8ae4-016bb69b8bf6.jpeg)
今回のベータ試験は後日に結果を通知してくれるそうです。

素直な英語でちゃんと読んでいたら解答できる問題が多かった印象です。
しかしながら、MS Learnのラーニングパスがほとんど出来ていなかったので、散々な点数になっていると思います。

日本語化された際には、合格できるように少しずつ取り組んでいきたいです。
R.Swift使い方　備忘録

画面遷移を簡潔なコードのみで実行してくれるライブラリ
R.Swiftの使い方について
自分用メモ

1、cocoapodからR.Swiftをインストール

```
pod "R.swift"
```
2、[R.swiftのセットアップ方法(Swift5)](https://qiita.com/uhooi/items/82fbdd94bdc467a22422)これを参考に設定をする

**Run Scriptは「[CP] Check Pods Manifest.lock」と「Compile Sources」の間**

3、シュミレーターを起動させる

4、AddFileからR.generated.swiftを選択、生成されていることを確認



**コピペ用**

//スクリプト

```
"$PODS_ROOT/R.swift/rswift" generate "$SRCROOT/$PROJECT_NAME/R.generated.swift"
```

//InputFiles

```
$TEMP_DIR/rswift-lastrun
```

//OutputFiles

```
$SRCROOT/$PROJECT_NAME/R.generated.swift
```
![スクリーンショット 2020-12-10 10.32.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517291/9a945897-6c2b-1ad2-2c45-9b8a13bae83c.png)


![スクリーンショット 2020-12-10 10.47.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517291/99a546ce-61af-0c10-fa07-9b6e8df32b09.png)
![スクリーンショット 2020-12-10 10.48.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517291/48fd8aa9-3cdf-3c23-a87f-9766a0230b23.png)

**注意**

```swift
import R.Swift //は必要ない
```
3、遷移したい所にコードを記入

```swift
//aaaはMain.storyboard のMainの部分(全て小文字になる)
//bbbはViewControllerのstoryboardID(大文字も含む)
let vc = R.storyboard.aaa.bbb()!
self.present(vc, animated: true, completion: nil)
```
PythonでODBC経由でデータベースからデータを取得（Access編）

# はじめに
先人の記事で十分ですが、自分用に。
あと、[スポーツデータ解析コンペティション](https://estat.sci.kagoshima-u.ac.jp/sports/)とかAccessでデータが来た記憶があるので、参加者のお役に立てば。

# 先人の記事
https://qiita.com/taro373/items/619e3385087279f72279

# 自分の例
## 環境
- Windows 10 1909 64ビット版
- Access 365 2002 32ビット版
    - 2002は(20)20年02月バージョンという意味です。2002年版ではありません😅。
- Python 3.7.1 (Anaconda)
    - pyodbc 4.0.30
        - Anaconda付属のバージョンから、`pip`でアップデートしたものです
- Visual Studio Code 1.48.0


## 下準備
「Microsoft Access データベース エンジン 2010 再頒布可能コンポーネント」をダウンロード&インストール
https://www.microsoft.com/ja-jp/download/details.aspx?id=13255
※ 上に書いたように、OSは64ビット、Accessは32ビットの環境ですが、再頒布可能コンポーネントは64ビット版（`AccessDatabaseEngine_X64.exe`）のほうを入れてうまくいきました

## データベース
以下の内容を持つ、`T_1` という名前のテーブルだけからなるデータベース

| ID  | field1 |
|-----|--------|
|1  |テストの値 |


## ソース
```python:test.py
import pandas as pd
import pyodbc

# PCに入っているODBCドライバー一覧
print(pyodbc.drivers())
print()

# DBコネクションに用いる文字列
# 文字列内に「{}」とか「\」とかあるので、raw文字列を使うとよい
conn_str = (
    r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)}; ' +
    r'DBQ=(ドライブ名):\(フォルダー名)\ ～ \ファイル名.accdb;'
)

# DBを安全に開いたり閉じたりするのにwith文を使用
with pyodbc.connect(conn_str) as conn:

    # DataFrameを使う場合
    print('* DataFrameを使う場合')
    df = pd.io.sql.read_sql(r'select * from T_1', conn)
    print(df)
    print()

    print('* カーソルを使う場合')
    with conn.cursor() as cur:
        # 各テーブルについて
        for table_info in cur.tables(tableType='TABLE'):
            # select文で中身を表示
            # raw文字列とf記法の両方を使う場合は、「rf''」とする
            cur.execute(rf'select * from {table_info.table_name}')
            for row in cur.fetchall():
                print(row)

```

## 実行結果
```
['SQL Server', 'SQL Server Native Client 11.0', 'Microsoft Access Driver (*.mdb, *.accdb)', 'Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)', 'Microsoft Access dBASE Driver (*.dbf, *.ndx, *.mdx)', 'Microsoft Access Text Driver (*.txt, *.csv)']

* DataFrameを使う場合
   ID field1
0   1  テストの値

* カーソルを使う場合
(1, 'テストの値')
```

# おわりに
以上です。
ESP32（M5Cameraとか）でHTTPサーバを立ち上げたときのHTMLの内容を変更する方法

**How to change HTML content when ESP32 (M5Camera etc.) starts HTTP server.**
Click [here](https://github.com/saka-guchi/M5Camera_ChangeHTML "How to change HTML in sketch example "ESP32>Camera>CameraWebServer"") for English commentary and sample code.

#前提
下記については説明を省略します。
- Arduino IDEでのESP32（M5Camera含む）の開発環境の構築
- C言語の基礎知識

#解決する課題
- スケッチ例の「ESP32>Camera>CameraWebServer」を使用したときに表示されるHTMLを自由に変更したい！

**変更前後のイメージ（Qiita風＆日本語化）**
![complete_image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691672/fd577f39-6820-ffc8-ce08-31b0667bb0cd.png "変更前後のイメージ（Qiita風＆日本語化）")

#手順概要
1. ベースとなるHTMLを用意する（初回のみ）
1. 変更したいHTMLをGZIP形式に変換する
1. GZIP形式のデータをコードに移植する

#手順詳細

## 1. ベースとなるHTMLを用意する
1. CameraWebServerのスケッチをロード
2. シリアルモニタに表示されたアドレスにアクセス
3. ブラウザでHTMLを保存

💡 [最新のスケッチ例](https://github.com/espressif/arduino-esp32/tree/master/libraries/ESP32/examples/Camera/CameraWebServer "CameraWebServer")ではM5CameraのVersion.Bに対応しているのでオススメ

```CameraWebServer.ino
//#define CAMERA_MODEL_WROVER_KIT // Has PSRAM
#define CAMERA_MODEL_M5STACK_V2_PSRAM // M5Camera version B Has PSRAM
```

## 2. 変更したいHTMLをGZIP形式に変換する
**※ここではCyberChefというオンラインツールを利用します**
1. [CyberChef (HTML to GZIP)](https://gchq.github.io/CyberChef/#recipe=Gzip('Dynamic%20Huffman%20Coding','ESP32_OV2460.html.gz','',false)To_Hex('0x',0)Split('0x',',0x') "CyberChef (HTML to GZIP)")にアクセス
2. Input欄に変更したいHTMLを貼り付け
3. 右下のOutput欄をコピー
![CyberChef_CopyGZIP.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691672/08183af0-9051-bd6f-2082-e763eba74920.png)
4. 「To Hex」と「Split」の右側の停止アイコンをクリック
5. Output欄のlengthをコピー
![CyberChef_CopyLength.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691672/ea4cab5d-bff9-0279-ccd3-b856db8348e0.png)

## 3. GZIP形式のデータをコードに移植する
1. 「camera_index.h」の配列の値を先ほどのOutput欄のデータに置き換える
![camera_index_Paste.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691672/c75e5d20-bb60-327d-af78-0ed9886b7607.png)
2. 先頭のカンマを取り除いて、配列サイズを先ほどのlengthの値に置き換える
![camera_index_Edit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691672/98606e53-ee4d-dff9-b2ec-a78802df265d.png)


以上です。お疲れさまでした。
慣れれば変更には1分も掛からないと思います。


# 余談
## CyberChefはGZIP圧縮だけでなく解凍もできる
1. [CyberChef (GZIP to HTML)](https://gchq.github.io/CyberChef/#recipe=Find_/_Replace(%7B'option':'Regex','string':','%7D,'',true,false,false,false)Remove_whitespace(true,false,true,false,false,false)From_Hex('0x')Gunzip() "CyberChef (GZIP to HTML)")にアクセス
2. Input欄に「camera_index.h」の配列の値を貼り付け
3. 右下のOutput欄にHTMLコードが表示される

**※スケッチ例の「index_ov2640_html_gz[]」は何故かエラー**
**　「index_ov3660_html_gz[]」の方は正しく出力されるのでバグっぽい**

## CyberChefのダウンロード版
速度が速くて快適ですが、オンライン版と異なる出力が出てきたので使っていません。
numpy で回転対照の画像を生成するメモ

## 背景

numpy で円や回転対照(e.g. r に依存)な図を作りたい.

## 方法

https://stackoverflow.com/questions/44865023/how-can-i-create-a-circular-mask-for-a-numpy-array

ogrid を使う.

ogrid で x, y のグリッドインデックスが生成されるので, これに対して演算を行うと (ny, nx) な画像データを作ることができる.
-webkit-とか-moz-とかこいつら一体何者なんだよ

## はじめに
あるCSSフレームワークのログイン画面を参考にしていると`-webkit-`というプレフィックスで始まるプロパティを見かけました。
このプロパティが一体何なのか知らなかったため、調べたことをまとめてみます。

## この記事の対象者
- `-webkit-`や`-moz-`といったプレフィックスについて知らない人
- これらのプレフィックスが付いているCSSプロパティについて理解を深めたい人

## `-webkit-`や`-moz-`とは何者なのか
`-webkit-`や`-moz-`というプレフィックスは**ベンダープレフィックス**と呼ばれるもので、ブラウザベンダーが試験的に草案（W3Cの勧告プロセスにおける第1段階）の機能を導入したり、独自の拡張機能を追加する際に使われるプレフィックスです。

実際には下記の4種類のベンダープレフィックスが存在し、各ブラウザ独自の機能を利用する場合はこれらのプレフィックスをつけることで利用できるようになります。

| プレフィックス | ブラウザ |
|:-----------|:------------|
| -webkit-       | 基本的にWebKitベースのブラウザーすべて（Chrome、Safariなど）         |
| -moz-     | Firefox      |
| -o-     | WebKit導入前の古いOpera      |
| -ms-      | IE、Edge      |

## ベンダープレフィックスの使い方
ベンダープレフィックス付きのプロパティを使う場合は、ベンダープレフィックスが付いていないプロパティも併用して記述します。

```css:style.css
.centering {
  -webkit-justify-content: center;
  justify-content: center;
}
```

これはそのプロパティが草案から勧告候補（W3Cの勧告プロセスにおける第1段階から第3段階）になったときには外すことが推奨されているためです。

## まとめ
- **`-webkit-`や`-moz-`といったプレフィックスはベンダープレフィックスと呼ばれる。**
- **ベンダープレフィックスは試験的に草案の機能を導入したり、独自の拡張機能を追加する場合に使われる。**
- **ベンダープレフィックス付きのプロパティを使う場合は、ベンダープレフィックスなしのプロパティも併用する。**

今回はベンダープレフィックスについて調べてみたことをまとめてみました。

それではまた。

TomoProg

## 参考
この記事は以下のサイトを参考にさせていただきました。

[ベンダープレフィックス－CSSの基本](http://www.htmq.com/csskihon/603.shtml)
[Vendor Prefix (ベンダー接頭辞) - MDN Web Docs 用語集: ウェブ関連用語の定義 | MDN](https://developer.mozilla.org/ja/docs/Glossary/Vendor_Prefix)
[W3C勧告とはなんぞ？Web標準化とW3Cにおける勧告プロセスについて | WEMO](https://wemo.tech/795)
プロジェクションマッピングノード覚え書き

3D等で　特定の方向からテクスチャや映像を投影することを**プロジェクションマッピング**または　**カメラマップ**等と言ったりします。

Blenderでも　UV展開の**Project_from_view**やモデファイアの**UV_project**等の方法で
UVを制御して投影状態のマッピングを作成する方法がありますが、手順が多かったり痒いところに手が届かない部分があったりするので
補完する形で　シェーダーを使って同様機能を作成してみました
![20080801.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/157ff6a8-fb7f-90d3-47fd-c4bd1b38bf97.gif)
因みに以前に別方式のカメラマップの活用法を解説した記事はこちら
http://yukimi-blend.blogspot.com/2018/10/blender1.html
## 投影のノードへ入出力する情報について
まずは基本的なノードの構成の話し
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/b0df3197-d6c5-3b56-dfa1-c80fd3972e69.png)
シェーダーの入力にある「**テクスチャ座標**」のノード（赤色のタイトルバー）では、
「オブジェクト:」の入力ボックスで**指定した物への相対座標**を「**オブジェクト**」出力に出します。
また、オレンジのタイトルバーの「**画像テクスチャ**」ノードでは画像を指定していて
入力の「**ベクトル**」となっている部分にUV座標を指定することで画像をマッピングできます

カメラから見て左下が0,0 右上が1,1になる座標に変換して画像テクスチャノードへと入力すれば、
カメラからの見た目にぴったりはまった画像のマッピングがされることになるわけです

## 投影ノードの使い方
投影のノードを設定した.blendファイルをこちらにアップロードしました
https://www.dropbox.com/s/v03sea7yaieaukv/ProjectionNode.blend?dl=0

自分のファイルで使用する場合は
ファイル＞アペンドで　ProjectionNode.blend の中のデータを読み込みます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/cdc953ed-49f2-602e-2c8e-0239905544af.png)
アペンドでは.blendファイルの中のデータをフォルダのように見ることができます
ファイル内の　**NodeTree** の下にあるProjectionObjectを選択して**アペンド**を押します

ファイルに読み込んだノードグループはシェーダーエディッタ内の
　追加＞グループ内の項目として登録されています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/98462495-814c-6d89-dc19-ffd57b3b44c2.png)
プロジェクションマッピングをするためには
入力＞**テクスチャ座標**のノードを追加して座標の投影元のオブジェクトを指定して
画像テクスチャのベクトル入力にUVの値を接続します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/32b82a4e-0f43-afcf-196b-79c055b7d56a.png)
ProjectionObjectの設定項目は

- 水平画角:横方向の視野の角度です。度で入力します
- 画像の横　画像の縦：投影する画像の縦横の大きさを入力してください
- 塗り足し範囲：投影する画像に画面からはみ出した範囲も作成している場合に使えます
- シフト：画像の微調整に縦横移動ができます

ノードの計算は**横方向の角度**がフィットするように計算をしています
画面からはみ出した縦長の画像も使用できて 塗り足しの設定もできるため
投影用のカメラと撮影用のカメラを別に用意することでカメラワークをつけることがやりやすくなっています。
(なお、投影用のオブジェクトはカメラオブジェクトである必要はありません)


なお、画像の縦、横の数値にレンダリングする範囲の数値を入れて
塗り足し範囲の数値に**マイナスの数値**を入れると
画面の範囲+塗り足しのピクセル数が画像の全体なように計算するようになっています



参考までにProjectionObjectのノードグループ全体を画像として置いておきます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/ac5414d4-0b94-fded-c5d4-bbd8e57d3fa6.png)
アニメ等の映像の現場で　使いやすいようカスタマイズしてもらえればと思います

別のUVを用意した状態で投影画像を展開図にベイクするというのも面白いかもしれません。
Windows Terminalをインストールするメモ

## 概要

最近はWindowsでも色々と環境が整ってきましたね。WSLとか。
ということで、Windows Terminalをインストール・設定したときのメモを。

なお、[こちらの記事](https://qiita.com/yokra9/items/bdd0882268b308cf22ca)から引用させていただくと、

> Windows Terminal は Build 2019 で発表された Windows 向けの新たなターミナルです。

とのこと。わりと最近ですね。


## Chocolateyでインストールする

Chocolateyを利用する場合は簡単です。以下のコマンドでインストールすることができます。

```console
$ choco install microsoft-windows-terminal -y
```


## Git for Windowsを使えるようにする

今まではこの[Git for Windows](https://gitforwindows.org/)のGit Bashを利用していたのでこれをWindows Terminalでも利用できるように設定します。


### 手順

Power Shellを起動して以下をコピペして実行してください。

```console
$ [guid]::NewGuid()
```

すると以下のような出力が得られます。

```console
PS C:\Windows\system32> [guid]::NewGuid()

Guid
----
4925c6bc-24c6-4ecb-928e-d95ee771616a
```

そしてWindows Terminalの設定で、以下を追加します。

```json
{
    "guid": "{00000000-0000-0000-ba54-000000000002}",
    "acrylicOpacity" : 0.75,
    "closeOnExit" : true,
    "colorScheme" : "Campbell",
    "commandline" : "\"%PROGRAMFILES%\\git\\usr\\bin\\bash.exe\" -i -l",
    "cursorColor" : "#FFFFFF",
    "cursorShape" : "bar",
    "fontFace" : "Consolas",
    "fontSize" : 10,
    "historySize" : 9001,
    "icon" : "ms-appx:///ProfileIcons/{0caa0dad-35be-5f56-a8ff-afceeeaa6101}.png",
    "name" : "Bash",
    "padding" : "0, 0, 0, 0",
    "snapOnInput" : true,
    "startingDirectory" : "%USERPROFILE%",
    "useAcrylic" : true
},
```

この設定は以下を参考にさせていただきました。

- [Windows Terminal で Git Bash を表示する](https://qiita.com/yokra9/items/bdd0882268b308cf22ca)
- [Adding Git-Bash to the new Windows Terminal](https://stackoverflow.com/questions/56839307/adding-git-bash-to-the-new-windows-terminal)


## 背景を透過させる

```json
        "defaults":
        {
            "useAcrylic" : true,
            "acrylicOpacity" : 0.75,
            "fontFace" : "Ricty Diminished Discord",
            "fontSize" : 12
        },
```

## インストール場所を調べる

場合によってはインストール場所を知りたい場合もあるでしょう。
その場合は以下のようにすることで調べることができます。

```console
$ where wt
```

```console
C:\Users\[USER_NAME]\AppData\Local\Microsoft\WindowsApps\wt.exe
```
Railsのflashの使い方をまとめてみた

#プログラミングの勉強日記
2020年8月14日　Progate Lv.226

#flashとは
　ページ上に一度だけ表示されるメッセージのこと。ユーザに対してページを移動したときに簡単なメッセージを表示させることができる。ユーザの登録完了などのサクセスメッセージや、投稿などの操作が失敗したときのエラーメッセージなどを表示するときに使う。

![0814.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/45077326-805b-ea33-7522-7672f774c63c.png)


#flashの書き方
　flashはハッシュのような形で記述する。

```:コントローラ
flash[:キー名]="表示したいメッセージ"
```
　キー名は好きな名前を付けることができる。
　フラッシュメッセージを表示したい箇所には以下のように記述する。

```:ビューファイル
<%= flash[:キー名] %>
```

##scaffoldで自動的に作成した場合

```ruby:posts_controller.rb
def update
  respond_to do |format|
    if @post.update(post_params)
      format.html { redirect_to ("/posts"), notice: 'Post was successfully updated.' }
      format.json { render :show, status: :ok, location: @post }
    else
      format.html { render :edit }
      format.json { render json: @post.errors, status: :unprocessable_entity }
    end
  end
end
```

```erb:views/posts/index.html.erb
<p id="notice"><%= notice %></p>
```

##自分で作成した場合

```ruby:users_controller.rb
def login
  @user = User.find_by(email: params[:email])
  if @user && @user.authenticate(params[:password])
    session[:user_id] = @user.id
    redirect_to("/users/index")
  else
    flash[:alert] = "メールアドレスまたはパスワードが間違っています"
    @email = params[:email]
    @password = params[:password]
    render("users/login_new")
  end
end
```

```erb:views/users/new.html.erb
<p id="alert"><%= alert %></p>
```

#noticeとalertオプション
　キーには好きな名前を付けることができるが、`notice`と`alert`はオプションがある。これらは`<%= flash[:キー名] %>`と書く必要がなく、以下のようにflashを省略して書くことができる。

```:ビューファイル
<%= notice %>
<%= alert %>
```
　noticeは通知に、alertは警告に使うことが望ましい。

#redirect_toと合わせて使うときの書き方
　`redirect_to`でnoticeとalertを使うときはまとめて書くことができる。scaffold時のように以下のように書ける。

```:コントローラ
redirect_to ("パス"), notice: '表示するメッセージ' 
```

他のキー名でもまとめて書くことができ、その場合は以下のようになる。

```:コントローラ
redirect_to ("パス"), flash{キー名: '表示するメッセージ' }
```
　redirect_toはアクションが実行されてからビューが表示される。
【2020年7月-8月】 chromeでpage expiredになって困ったちゃんの解決策

#突然、ログイン画面などがPage Expiredになって困っちゃった。

## 原因
Sessionのsame_siteをnoneに指定しているのに、secureの属性をつけていない。（chromeのupdateにより、same_site=noneの場合はsecure属性にしないとクッキー拒否されます）

config/session.phpの設定
 
```php
'same_site' => "none"
```

になっているのに.envに

```php
SESSION_SECURE_COOKIE=true
```

がない場合。

## 注意
当然ですが、 trueにした場合は**https経由**のアクセスじゃないと、そもそもcookieは有効になりません。
対策としては 自己証明書で https にしてもかまわないのですが、そもそものデフォルト値(same_site="lax")にする事も検討ください。[わかりやすいさいと](https://www.future-shop.jp/magazine/info-samesite)
Deep Learningキーワード

#[識別モデル]CNN
## CNNの歴史
・1982年　**ネオコグニトロン**　福島邦彦
・1998年　**LeNet**　ヤン・ルカン
・2012年　**AlexNet** 　ILSVRC トロント大学　ジェフリー・ヒントン(SuperVision)
・2014年　**VGG**　ILSVRC　Oxford大学
・2014年　**GoogleNet**　ILSVRCで優勝したモデル・・・Inceptionモジュール
## CNNの問題点
・[問題点１]畳み込み／プーリングの増加（深いネットワーク）だけではだめ
・[問題点２]層を深くすると計算量が増加、勾配消失
・[解決法１]小さなサイズの畳み込みフィルターを差し込み**次元圧縮**
・[解決法２]**Inceptionモジュール**
・[解決法３]**ResNet**・・・**Skipconnection**「層を飛び越えた結合」
#転移学習
・巨大なネットワークをイチから学習することはない
・学習済みのネットワークがあればそれを用い新たに学習する必要なし
・ImageNetですでに学習済みモデルが公開
・**学習済みネットワークを利用して新しいタスクの識別に活用すること＝＞転移学習**

#[識別モデル]RNN

#強化学習
##ただの強化学習
・Q学習(Q learning)
##深層強化学習
・DQN(Deep Q-Network)・・・2013年 Deep Mind社　Deep Learning+強化学習
・Double DQN
・Dueling Network
・Categorical DQN
・Rainbow
##深層強化学習の歴史
・2013年 Deep Mind社　DQN
・2015～2017年 Deep Mind社　AlphaGo
・2017年10月 Deep Mind社　AlphaGo　Zero
#[生成モデル]
#その他
・画像認識精度競技会「ILSVRC(Imagenet Large Scale Visual Recognition Challenge)」
・ImageNet・・・**自然画像**認識研究のための研究用標準データセット
・MNIST・・・**手書き文字画像**認識研究のための研究用標準データセット
DynamoDB Local で pythonを使っての採番処理の作成 採番処理編


## 概要

pythonの採番処理を作成するときにDynamoDBを使うときに開発中に実際のDynamoDBを使うのは・・・という場合DynamoDB Local を使っての開発すると思うのでその方法をまとめていきます。
[前回](https://qiita.com/dmikita/items/c23f10c92f0513b1de7e)の続きで実際にpythonのプログラムを作成します。

## 事前準備

* pythonのインストール(記事作成時は3.7です)。
    * JupyterNotebookなどでも可能です。
* boto3

## 実装

* ソースは以下のようになります。
    * 各種設定値は環境変数から取得するようにしています。ここにACCESS_KEYなどをべたに書くと大変なことになります。
    * `sequence_key` は固定にしていますが、実際に使うときは引数で受け取るなどしたほうがよいかと。

```python
import os
import boto3

endpoint_url = os.getenv('DYNAMODB_ENDPOINT', 'http://192.168.99.100:8000/')
aws_access_key_id = os.getenv('DYNAMODB_ACCESS_KEY_ID', 'DummyID')
aws_secret_access_key_id = os.getenv('DYNAMODB_SECRET_ACCESS_KEY_ID', 'DummyKey')
aws_region_name = os.getenv('DYNAMODB_REGION', 'ap-northeast-1')

dynamodb = boto3.resource(
    'dynamodb',
    region_name=aws_region_name,
    endpoint_url=endpoint_url,
    aws_access_key_id=aws_access_key_id,
    aws_secret_access_key=aws_secret_access_key_id
)

sequences = dynamodb.Table('sequences')

res = sequences.update_item(
    Key= {
        'sequence_key': 'TEST_SEQ'
        },
    UpdateExpression="ADD #name :increment",
    ExpressionAttributeNames={
        '#name':'val'
        },
    ExpressionAttributeValues={
        ":increment": int(1)
        },
    ReturnValues="UPDATED_NEW"
)

count=res['Attributes']['val']

print(count)

```

* 実行結果は以下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657697/4309ae30-4f8f-7a83-50b7-0f7a9c055428.png)
MySQLdumpでバックアップ【warning】using a password on the command line interface can be insecure

#MySQLdumpでバックアップ【warning】using a password on the command line interface can be insecure

MySQLdumpでバックアップする基本構文でパスワードが直書きされているとのエラーが。
どうやらSQLコマンドにパスワードを直書きすると注意されるらしい。


mysqldumpの基本構文は以下。

**mysqldump -u[ユーザー名]　-p[パスワード] -h[ホスト名] [データベース名] [テーブル名1], [テーブル名2],...[オプション] > [保存先ファイル名]**


調べたところ、パスワードを外部ファイルに保存するなどの方法もありましたが、次の方法でOK


**mysqldump -u[ユーザー名] -p -h[ホスト名] [データベース名] [テーブル名1], [テーブル名2],...[オプション] > [保存先ファイル名]**
パスワード欄は空欄にして打ち込みENTERを押すと

**ENTER password**という表記になるのでそこでパスワード入力。
保存先ファイル名は保存したい名前を入力。



###参考
https://proengineer.internous.co.jp/content/columnfeature/6793#section100
VPC の CIDR を変更する

https://docs.aws.amazon.com/ja_jp/vpc/latest/peering/invalid-peering-configurations.html#overlapping-cidr
> IPv4 CIDR ブロックが一致または重複する VPC 間で VPC ピアリング接続を作成することはできません。


VPCPeering のために VPC の CIDR の変更をしたいが、既に VPC に紐付いているリソースが作成されていたため編集できない。
以下のリソースを削除することで解決。

- ServiceDiscovery
- EC2
- ALB
- SecurityGroup 
- InternetGateway


## Memo
Terraform でリソースを削除する場合に以下の設定を false にして削除できるようにする。

#### aws_instance
* disable_api_termination

#### ALB
* https://github.com/terraform-aws-modules/terraform-aws-alb
* enable_deletion_protection

#### その他
* lifecycle.prevent_destroy
DockerのMySQLへのinsertでError Code: 1366. Incorrect string value: 'xx' for column 'name' at row 1

## 事象
日本語を含むinsert分で上記エラーが発生。

## 対応
以下を確認すると文字コードが`latin1`になっているのが原因。

```
mysql> status;
--------------
mysql  Ver 14.14 Distrib 5.7.31, for osx10.15 (x86_64) using  EditLine wrapper

Connection id:		174
Current database:	xxx
Current user:		root@xxx
SSL:			Cipher in use is DHE-RSA-AES256-SHA
Current pager:		stdout
Using outfile:		''
Using delimiter:	;
Server version:		5.7.26 MySQL Community Server (GPL)
Protocol version:	10
Connection:		127.0.0.1 via TCP/IP
Server characterset:	latin1
Db     characterset:	latin1
Client characterset:	utf8
Conn.  characterset:	utf8
TCP port:		13307
Uptime:			2 days 3 hours 37 min 13 sec

Threads: 3  Questions: 2106  Slow queries: 0  Opens: 219  Flush tables: 1  Open tables: 212  Queries per second avg: 0.011
--------------
```


以下で確認したところmy.cnfがない。

```
docker container exec -it xxx bash
cat /etc/mysql/conf.d/my.cnf
```

Dockerfileが間違っていた。(mysqlではなくmusql)

```
ADD ./Docker/mysql/conf.d/my.cnf /etc/musql/conf.d/my.cnf
```

上記修正をした上で、以下でコンテナを再作成。
（再起動でも良いのだけど、もう一度マイグレーションをロールバックして、再実行するのが手間だと感じたので）

```
docker-compose down --rmi all --volumes
docker-compose up -d
```

## 参考
* https://qiita.com/suin/items/19d65e191b96a0079417
* https://qiita.com/EigenPort_M/items/46bd1bf386eb56eba97e