OmniAICreator/Qiita-1.07M huggingface dataset:
眺めて覚えるC言語 その1 PythonからC言語を呼ぶ(hello world)

### pythonにできないことをするには、C言語が便利。
#### GO言語は、C言語に比べ便利で速いが十中八九ポインターでハマる。なぜなら値でインターフェイスされるから(by Valueが基本でby referenceが不得意)ポインターで渡してもindexを取ることができない。
 - スピード向上など
 - ライブラリ化
 - 実験設備を制御したい。
 - 直接IOを読み書きしたい。
 - C言語用インターフェイスは、用意されているのにPythonのための用意がない。
 ##では、「眺めて覚える」主旨に基づいて例文を見ていきましょう。
必要なものは、

1.　GCC
**　gcc (x86_64-posix-seh-rev0, Built by MinGW-W64 project) 8.1.0**
2.　Python
**Python 3.7.4**
3.　Visual studio code のような高度なエディタ
**Version: 1.41.1 (system setup)**
**OS: Windows_NT x64 10.0.18362**

# 最初の一歩
適当な名前のホルダを作りましょう。
下記のプログラムをコピーしよう!

```
> mkdir capi
```
**pythonのテスト用ライブラリ呼び出し**

```capi.py
import myModule as capi #適当な名前を付ける(testとかつけるとハマるよ
capi.hello()

```
**ライブラリ本体**

```capilib.c
#include <Python.h>
static PyObject* hello(PyObject* self, PyObject* args)
{
    printf("Hello World 東京\n");
    return Py_None;
}
// 関数名、仕様等の定義
static PyMethodDef myMethods[] = {
    { "hello", hello, METH_NOARGS, "Hello World"},
    { NULL }
};
// Module Definition struct
static struct PyModuleDef myModule = {
 PyModuleDef_HEAD_INIT,"myModule","C API Module",-1,myMethods
};
// 上記の構造体を初期化する
PyMODINIT_FUNC PyInit_myModule(void)
{
    return PyModule_Create(&myModule);
}
```
ライブラリ作成用スクリプト

```setup.py
from distutils.core import setup, Extension
setup(name = 'myModule', version = '1.0.0',  \
   ext_modules = [Extension('myModule', ['capilib.c'])])
```
ライブラリの作成します。

```
python setup.py install
running install
running build
running build_ext
running install_lib
running install_egg_info
Removing C:\ProgramData\Anaconda3\Lib\site-packages\myModule-1.0.0-py3.7.egg-info
Writing C:\ProgramData\Anaconda3\Lib\site-packages\myModule-1.0.0-py3.7.egg-info
```
ライブラリの確認方法

```
\capi>pip freeze
...
myModule==1.0.0
...
```
文字化け対策

```
> chcp 65001
```
実行する

```
capi>python capi.py
Hello World 東京
```
Vivadoを自動化するTclスクリプトをLinuxでも使う

Vivadoの操作を自動化する「NahiViva(なひビバ)」というTclスクリプトがあります。
https://github.com/tokuden/NahiViva

このスクリプトを使うと、「Update IP」や「Synth→Impl→Generate Bitstream」などの操作をTclコマンドで行えるようになるほか、プロジェクトを本当にコアなVHD、V、XCI、TCLファイルだけで管理できるようになるので、アーカイブした時のサイズが、Vivadoの元のプロジェクトフォルダの1%くらいのサイズになります。ほかにもソースファイルをGITで管理できるようになるなどメリットがたくさんあります。

さて、このNahiVivaをLinuxで使いたいというご要望があったので、可能かどうかを試してみました。

# NahiVivaの構造
Windows版のNahiVivaは、いくつかのバッチファイルが提供されていて、
やりたいことに合わせてバッチファイルをダブルクリックして起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542455/7b3f26eb-7a2e-04a6-b4bf-46423af82866.png)

## 普段使うのはこの2つ
まぁ、ファイルはいっぱいありますが、普段使うのは以下の2つです。

- open_project_gui.cmdでプロジェクトを開く
- delete_project.cmdでプロジェクトのVivadoフォルダを削除してすっきりする

## NahiVivaのバッチファイルの中身
open_project_gui.cmdを実行すると、SETTINGS.CMDというファイルを読み込んでVivadoをバッチモードで起動するようになっています。
その中身を見てみましょう。

```bat:SETTINGS.CMD
@SET VIVADO_PATH=D:\Xilinx\Vivado\
@SET VIVADO_VERSION=2018.3
```

```bat:open_project_gui.cmd
call SETTINGS.CMD
%VIVADO_PATH%\%VIVADO_VERSION%\bin\vivado.bat -mode tcl -nolog -nojournal -source nahiviva.tcl -tclargs opengui
```

VivadoをインストールするフォルダやVivadoのバージョンは、環境に応じてそれぞれなので、VivadoのインストールパスとバージョンをSETTINGS.CMDで設定できるようになっています。

## バッチファイルからシェルスクリプトへ
Linuxに移行するには、これらのファイルをbashスクリプトに変えてしまえばよいのでしょう。

```bash:SETTINGS.sh
#!/bin/sh
VIVADO_PATH=/tools/Xilinx/Vivado/;export VIVADO_PATH
VIVADO_VERSION=2018.3;export VIVADO_VERSION
```

```bash:open_project_gui.sh
#!/bin/bash
. ./SETTINGS.sh
$VIVADO_PATH/$VIVADO_VERSION/bin/vivado -mode tcl -nolog -nojournal -source nahiviva.tcl -tclargs opengui
```

のようにします。WindowsのバッチファイルをLinuxのシェルスクリプトに変換する際には、改行コードをCR+LFではなくLFにするのを忘れないようにしましょう。
## Tclファイルの変換
`nahiviva.tcl`の書き換えは不要ですが、Tclの中で表示するメッセージに日本語が含まれており、Shift-JISだとLinux版のVivadoは読み込みでエラーを起こしてしまいます。
UTF-8に変換する必要があるようです。
# 実際にコンパイルしてみる
様子を動画にしました。字幕ONで見てみてください。
↓の画像をクリックすると、YouTubeにジャンプします。

[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/eUJVYi3A_To/0.jpg)](http://www.youtube.com/watch?v=eUJVYi3A_To)
https://www.youtube.com/watch?v=eUJVYi3A_To&feature=youtu.be

無事に論理合成に成功です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542455/7f21e770-3532-ebf8-856c-525d599644f2.png)
## 合成時間
論理合成は最初の1回目はIPのGenerateを行うところが22分、配置配線自体は12分くらいでした。
2回目以降はIPのGenerateがないので早くなります。Windows版だと5分くらいで終わるのですが、仮想マシンのLinuxなのでやはり遅いですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542455/1cf61baf-697c-2d0b-5f27-a64eaafea841.png)

## プロジェクトがいらなくなったら
プロジェクトがいらなくなったら、Tclコンソールに`NahiSave`と打って、`delete_project.sh`を実行してください。vivadoフォルダは消えますが、ソースはすべて保存されています。
NiftyNetで3次元セグメンテーション(DenseVnet)

前の記事でNiftyNetの紹介をしました。
(https://qiita.com/takeajioka/items/84321b7d3f1eebcb4e5d)
今回はそれを使って実際にセグメンテーションをしてみました。
環境は以下です。

Ubuntu 18.04.2 LTS
GPUはGTX1070 (8GB)
メインメモリは16GB
Cuda 10
cuDNN 7.6.3

Anaconda
Python3.6
tensorflow-gpu==1.14.0
niftynet==0.6.0

####その他必要なパッケージについて
tiffのスタック画像を読み込むために、他にもscikit-imageやpyYAMLもインストールする必要があります。(Anacondaにはデフォルトで入っている。)
他にはsimpleITKやopenCVを入れないと警告が出ますが、openCVは入れると逆にエラーで実行できなくなるので入れないでおきましょう。

##使用したデータ
データセットはKaggleのElectron Microscopy 3D Segmentationを用いました。
(https://www.kaggle.com/kmader/electron-microscopy-3d-segmentation)
海馬CA1領域の電子顕微鏡画像におけるミトコンドリアのセグメンテーションです。
ラベルデータが輝度値0と255の2値画像になっていました。輝度値がクラスを表すようにするため、輝度値255を1に置き換えました。これでNiftyNetで読み込めます。

##セグメンテーションを実行する
使用するネットワークですが、NiftyNetでは様々なネットワークを選べます。
(https://github.com/NifTK/NiftyNet/blob/dev/niftynet/network/README.md)
最初はVnetで試しましたが、上手くいかなかったため、DenseVnetで行いました。

またloss関数も重要で、通常用いられるDice係数では全てとラベル0と認識され、反応はありませんでした。クラス不均衡時などに生じるようです。(それに対応したTverskyというロス関数もあるようです。)
選べるloss関数の一覧などはここで確認できます。
(https://github.com/NifTK/NiftyNet/blob/dev/niftynet/layer/README.md)
今回はloss関数はCrossEntropyで上手くいきました。

また重要なのは活性化関数で、デフォルトのreluでは上手くいきませんでした。（dying ReLUしたようです）。対策としてprelu(Parametric ReLU)に変更しました。preluはreluより高度ですが、その分パラメータが増えてGPUを圧迫します。

configファイルは以下のようになりました。

```
############################ input configuration sections
[EM]
path_to_search = ./data/EM3D/vnet
filename_contains = input
spatial_window_size = (128, 128, 128)

[label]
path_to_search = ./data/EM3D/vnet
filename_contains = groundtruth
spatial_window_size = (128, 128, 128)

############################## system configuration sections
[SYSTEM]
cuda_devices = ""
num_threads = 1
num_gpus = 1
model_dir = models/EM3D_vnet/
queue_length = 1

[NETWORK]
name = dense_vnet
activation_function = prelu
batch_size = 1
window_sampling = uniform

[TRAINING]
optimiser = adam
sample_per_volume = 1
lr = 0.01
loss_type = CrossEntropy
starting_iter = 0
save_every_n = 100
max_iter = 1000

[INFERENCE]
save_seg_dir = ./segmentation_output/

############################ custom configuration sections
[SEGMENTATION]
image = EM
label = label
label_normalisation = False
output_prob = False
num_classes = 2

```
実行コマンドは以下です。

```
net_segment train -c <configファイルのパス>
net_segment inference -c <configファイルのパス>
```
spatial_window_sizeはGPUの容量の都合でこれが限界でした。
電子顕微鏡画像は解像度が非常に大きいため、画素数も多く、spatial_window_sizeをもう少し増やしたいところです。
そうなるとサーバーの利用が望ましいと思います。

他には以下の項目などを加えることでData Augmentationもできるようです。
rotation_angle = (-10.0, 10.0)
scaling_percentage = (-10.0, 10.0)

次は３D U-Netで試したものを記事にする予定です。
Windows10にcomposerを手動でインストール

Windows用のインストーラーは用意されているが手動で入れたい場合

https://getcomposer.org/download/
### インストール

```bash
# PHPがインストールされている事が前提です。
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === 'baf1608c33254d00611ac1705c1d9958c817a1a33bce370c0595974b342601bd80b92a3f46067da89e3b06bff421f182') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"
```
このままでは`composer`コマンドが機能しないのでパスの通った場所にバッチを作成(phpが起動しているならPHPフォルダにパスあるはず）

```
C:\php> echo @php "%~dp0composer.phar" %*>composer.bat
```

ここで`composer global require laravel/installer`とかやると変な場所にインストールされる

```
# composerのカレントディレクトリがuser配下になるので変更
c:\> composer global config home
Changed current directory to C:/Users/myuser/AppData/Roaming/Composer
C:/Users/myuser/AppData/Roaming/Composer
```

システム環境変数 `COMPOSER_HOME` 値に `C:\php\composer` 配置したい場所を指定

これで`composer`から`laravel`をインストールできるが`laravel`もパスが通ってないので`laravel new blog`とかは起動しない。

パスを`C:\php\composer\vendor\bin`に通すと`laravel`コマンドも使える。
SELECTとINSERTをいっぺんにやる


PHPからDBにデータを登録する際に、該当のIDを持つデータが既に登録されていなければ新規にINSERTする場合、
一度SELECTクエリを発行し結果を見てINSERTではなく一度で行いたい。
そんなときのメモ

```
$user_id = '12345';
$first_name = '姓';
$last_name = '名';

"INSERT INTO user (user_id, first_name, last_name, del_flg)
 　SELECT ".$user_id.",".$first_name.",".$last_name.","."0". 
"WHERE　NOT　EXISTS(
   SELECT 'X' FROM table_A WHERE user_id = ".$user_id." AND del_flg = 0
)"
```
あとはDBに対してこのSQLを発行すればOK。
MyBatisでLike検索

# 間違った書き方
```sql
LIKE '%#{word}%'
```
では動作しません。
しかも、意味不明なエラーばかり出ているので、かなりハマります。

# 正しくは
'%'と検索対象文字を文字列で連結することです。

```sql
LIKE CONCAT('%', #{word}, '%')
```
これで、正しく動作することになります。
CSRF（クロスサイトリクエストフォージェリ）対策について　

#CSRF(クロスサイトリクエストフォージェリ)とは

Webアプリケーションに存在する脆弱性、もしくはその脆弱性を利用した攻撃方法のことです。掲示板や問い合わせフォームなどを処理するWebアプリケーションが、本来拒否すべき他サイトからのリクエストを受信し処理してしまいます。

わかりやすい説明はこちら
ー 参考　外部からPOSTできない？RailsのCSRF対策をまとめてみた
https://qiita.com/KumatoraTiger/items/cc6a1107374cce500e6d

#実際にCSRF（クロスサイトリクエストフォージェリ）対策を無効にする

## development（検証環境）用

config
  └── environments
      └── development.rb　<--ここ編集

```ruby
# Use an evented file watcher to asynchronously detect changes in source code,
# routes, locales, etc. This feature depends on the listen gem.
config.file_watcher = ActiveSupport::EventedFileUpdateChecker

config.action_controller.allow_forgery_protection = false #追記
```

##production（本番環境） 用

config
  └── environments
      └── production.rb  <--ここ編集

```ruby

# Do not dump schema after migrations.
config.active_record.dump_schema_after_migration = false

config.action_controller.allow_forgery_protection = false  #追記
```

##最後に　DB migrate
データベースのマイグレーションを行います。

```
$ bundle exec rake db:migrate
```

アウトプット用で記事を参考にしながら書きました。
【さくらエディタ】キーマクロでteratermのタイムスタンプを削除する

# はじめに
<バージョン>
サクラエディタ   Ver. 2.2.0.1

teratermの設定で以下のように、行頭にタイムスタンプが入るようにしています。
しかし、タイムスタンプを消したい場合にいちいち手作業で消すのは面倒なので
さくらエディタのキーマクロで消す方法を考えました。

```text:sample.txt
[Mon Mar 04 19:27:00.000 2019] [user@TEST ~]$
[Mon Mar 04 19:28:00.000 2019] [user@TEST ~]$ aaa
[Mon Mar 04 19:29:00.000 2019] [user@TEST ~]$ bbb
[Mon Mar 04 19:30:00.000 2019] [user@TEST ~]$ ccc
[Mon Mar 04 19:31:00.000 2019] [user@TEST ~]$
|　←    この間を消したい     →|
```

# 作業手順
キーマクロの記録を用いて、以下の手順を元に作業をコード化すれば
タイムスタンプを消す作業を自動化できます。
※キーボードによってコマンドが異なる場合があるので、記録する部分を手作業で
　試してからキーマクロの記録を行ってください。
　キーボードによってはHomeやEndはFnと同時押しする必要があります。

(1)タイムスタンプを消したい行の、タイムスタンプ(日時)の部分をクリック
(2)「ツール」タブ→「キーマクロの記録の開始」を選択
----------ここから記録開始----------
(3)「ctrl + shift + x」で「折り返し方法：折り返さない」に変更
(4)「ctrl + F」で検索項目に"]"を入力して「下検索」を選択
(5)→(右矢印)を2回押す
(6)「shift + F6」で矩形選択モードに変更
(7)「HOME」を押してカーソルを行頭に移動(以下の状態)
![sakura_sample1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554812/03fe3664-6a26-ac5b-e83e-b3cfbed9b8fe.jpeg)
(8)「ctrl +shift + End」で最終行へ移動(以下の状態)
![sakura_sample2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554812/0c2c1d83-100f-c899-3018-3460fec0e597.jpeg)
(9)「delete」で削除
----------記録ここまで----------
(10)「ツール」タブ→「キーマクロの記録終了」を選択
(11)「ツール」タブ→「名前を指定してマクロを実行」を選択
(12)「RecKey.mac」という名前のファイルがあるので、コピーして任意の名前に変更
　　(今回は、timestamp_delete.macという名前にします)
(13)「キャンセル」で閉じる

# 記録したコードの確認
VBAなどのマクロの記録と違い、デフォルトで各行の右側に操作内容を記入してくれる
ので、初心者の方でも理解しやすい内容になっています。

```text:timestamp_delete.mac
//キーボードマクロのファイル
S_TextWrapMethod(0);	// 折り返し方法
S_SearchNext(']', 28);	// 次を検索
S_Right(0);	// カーソル右移動
S_Right(0);	// カーソル右移動
S_BeginBoxSelect(0);	// 矩形範囲選択開始
S_GoLineTop(0);	// 行頭に移動(折り返し単位)
S_GoFileEnd_Sel(0);	// (選択)ファイルの最後に移動
S_Delete(0);	// 削除
```

# 動作確認
1行目のタイムスタンプの部分をクリックし、「ツール」タブ→「名前を指定してマクロを実行」
から作成したマクロを指定すると以下のようにタイムスタンプが削除されます。

```text:sample.txt
[user@TEST ~]$
[user@TEST ~]$ aaa
[user@TEST ~]$ bbb
[user@TEST ~]$ ccc
[user@TEST ~]$
```
エンジニア2年目のVim設定ファイルを公開する

# 初期のvim環境
## vimって何やねん
配属されていきなり、vimを使えと言われても、まだ何もわかってないですよ私。
バックスペース押しても文字は消えないし、普通に入力しても編集できないし、何これ。
そんなレベルだもの、もちろんvimの設定ファイル `.vimrc` なんて知らない訳であって。
素のvimを使っていたら、先輩に「このくらいは設定した方がいいよ」と渡された.vimrcがこちらです。

```vim

set number "行番:q号を表示する
set title "編集中のファイル名を表示
set showmatch "括弧入力時の対応する括弧を表示
syntax on "コードの色分け
set smartindent "オートインデント
set ts=4 "タブキースペース
set sw=4 "勝手にずれるスペース
set incsearch " インクリメンタルサーチ. １文字入力毎に検索を行う
set ignorecase "大文字/小文字を区別せず検索
set smartcase " 検索パターンに大文字を含んでいたら大文字小文字を区別する
set hlsearch "検索結果をハイライト
" ESCキー2度押しでハイライトの切り替え
nnoremap <silent><Esc><Esc> :<C-u>set nohlsearch!<CR>
set cindent
set expandtab
```

本当に最低限ってところですね。でも、タブキーの操作など、そこそこ満足して使っていました。

## エディタ入れようかなあ
でも、エディタって見やすいんですよ。[VS Code](https://code.visualstudio.com/ "VS Code")とか[Sublime text](https://www.sublimetext.com/ "Sublime text")とか。
結局フロントのコードを書くときはvimではなくVSCode使うことの方が多いですね。

# まとめ
最後に一挙記載します。快適なVimライフをお過ごしください。

```dein.toml
# 基本は github.com のレポジトリーを指定するだけ
[[plugins]]
repo = 'Shougo/dein.vim'

# git clone 後、実行すべきコマンドがある場合はこんな感じ
[[plugins]]
repo = 'Shougo/vimproc.vim'
hook_post_update = '''
  if dein#util#_is_windows()
    let cmd = 'tools\\update-dll-mingw'
  elseif dein#util#_is_cygwin()
    let cmd = 'make -f make_cygwin.mak'
  elseif executable('gmake')
    let cmd = 'gmake'
  else
    let cmd = 'make'
  endif
  let g:dein#plugin.build = cmd
'''

# ブランチやタグを指定したいとき
[[plugins]]
repo = 'delphinus35/typescript-vim'
rev  = 'colorize-template-strings'

# 特定の条件で読み込みたいとき
[[plugins]]
repo = 'elzr/vim-json'
if   = '''! has('kaoriya')'''

# 依存関係を指定したいとき(下で見やすくするライン)
[[plugins]]
repo    = 'vim-airline/vim-airline'
depends = ['vim-airline-themes']

[[plugins]]
repo = 'vim-airline/vim-airline-themes'

# かっこ閉じ
[[plugins]]
repo = 'Townk/vim-autoclose'

# syntaxエラー表示
[[plugins]]
repo =  'scrooloose/syntastic'

# 末尾の全角と半角空白があれば赤くハイライト
# :FixWhitespaceで全て削除できる
[[plugins]]
repo = 'bronson/vim-trailing-whitespace'

# git関連、変更・追加・削除箇所がわかる
[[plugins]]
repo = 'tpope/vim-fugitive'
[[plugins]]
repo = 'airblade/vim-gitgutter'

# ctrl+pで曖昧検索ができる, 新たにファイル開ける
[[plugins]]
repo = 'ctrlpvim/ctrlp.vim'

# 検索結果の件数を表示
[[plugins]]
repo = 'osyo-manga/vim-anzu'

# ディレクトリ表示に使いたい
[[plugins]]
repo = 'scrooloose/nerdtree'

# vue.js用
[[plugins]]
repo = 'posva/vim-vue'

# nginxの設定ファイル用
[[plugins]]
repo = 'chr4/nginx.vim'
```

# 参考記事
https://qiita.com/zwirky/items/0209579a635b4f9c95ee
https://qiita.com/nabewata07/items/d92655485622aeb847a8
NSX Manager/NSX Controller障害時の影響

# 結論
ここを読むと良い。

- https://docs.vmware.com/jp/VMware-NSX-Data-Center-for-vSphere/6.4/com.vmware.nsx.troubleshooting.doc/GUID-88BA25EC-126B-41EE-9F06-BD6235C9EC77.html
- https://notes.doodzzz.net/2018/01/02/nsx-controller-cluster-failure-what-to-expect/

NSX Controllerに関しては、

- 1つが失われるだけであれば、依然として全ての機能が利用可能
- 2つが失われると、read onlyモードになってしまい変更ができなくなってしまう。データプレーンに関しては最後の情報に基づき利用可能。
- 3つが失われると、管理機能には何もアクセスできなくなる。
タイムゾーンを、日本の標準時に設定する


# はじめに

**date**を実行すると、システムクロックが狂っていた。というよりも、タイムゾーンの設定が行えていないために、**UTC（協定世界時）**よりも9時間遅くなっていたので、日本の標準時に設定する事とする。日本の標準時は、協定世界時よりも、９時間時差があるため、**UTC+09:00**となる。



# 環境
Ubuntu 16.04.5 LTS

#手順

現在の、タイムゾーンの設定を参照する。

````cmd
$timedatectl

      Local time: Mon 2020-01-06 05:04:33 UTC
  Universal time: Mon 2020-01-06 05:04:33 UTC
        RTC time: Mon 2020-01-06 05:04:33
       Time zone: Etc/UTC (UTC, +0000)
 Network time on: yes
NTP synchronized: no
 RTC in local TZ: no
```

日本の標準時が設定できる事を確認する。

```cmd
$timedatectl list-timezones | grep Tokyo

Asia/Tokyo
```

日本の標準時に設定する。

```cmd
$sudo timedatectl set-timezone Asia/Tokyo
```

正しく設定された事を確認する。

```cmd
timedatectl
      Local time: Mon 2020-01-06 14:06:12 JST
  Universal time: Mon 2020-01-06 05:06:12 UTC
        RTC time: Mon 2020-01-06 05:06:12
       Time zone: Asia/Tokyo (JST, +0900)
 Network time on: yes
NTP synchronized: no
RTC in local TZ: no
```

システムクロックが正しく表示される事を確認する。

```cmd
date
```

ハードウェアクロックを確認すると、一緒に直っていた。

```cmd
hwclock -r
```

# 参考記事

https://qiita.com/koara-local/items/32b004c0bf80fd70777c
RDS(SQLServer)インスタンス作成時にQuotaのエラーが出る

# RDSインスタンス作成時にQuotaのエラーが出る

## はじめに

SQLServerの RDSインスタンスを作成する際に、エラーが出た。
その際の対応について記載。
(めっちゃ公式ドキュメントに書いてあるやつやん)

## エラー内容

`DB Instance quota exceeded for LicenseModel of license-included and Engine of sqlserver-se (Service: AmazonRDS; Status Code: 400; Error Code: InstanceQuotaExceeded; Request ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)`

## 原因

SQLServerのライセンス込みモデルだと10インスタンスまでらしい。

>デフォルトでは、最大で合計 40 の DB インスタンスを持つことができます。 これら 40 のうち、「ライセンス込み」のモデルでは、各 SQL Server DB エディション (Enterprise、Standard、Web、および Express) のインスタンスを最大 10 持つことができます。40 すべてが MySQL、MariaDB、または PostgreSQL になります。40 すべてが、「Bring-Your-Own-License (BYOL)」 モデルの Oracle となります。 アプリケーションでそれ以上の DB インスタンスが必要な場合は、この RDS DB インスタンスの制限をリクエストのフォームを使用して追加の DB インスタンスをリクエストできます。

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/CHAP_Limits.html#RDS_Limits.Limits

## 対応方法

Quota申請をする。普通にRDSの `DB インスタンス`で申請したら、問題なく受付された。

**注意事項**
サポートに問い合わせた際に、海外部署での作業となるため、完了まで数日かかる可能性があるって言われた
M5Stick-Cに加速度取得を書き込み

M5StickCに加速度取得を書き込んで見るメモ
ArduinoでM5StickCのSketchライブラリ参考しやした


###加速度取得して画面に表示

``` c
#include <M5StickC.h>

float accX = 0.0F;
float accY = 0.0F;
float accZ = 0.0F;

float gyroX = 0.0F;
float gyroY = 0.0F;
float gyroZ = 0.0F;

float pitch = 0.0F;
float roll = 0.0F;
float yaw = 0.0F;

void setup()
{
  M5.begin();
  M5.IMU.Init();
  M5.Lcd.setRotation(3);
  M5.Lcd.fillScreen(BLACK);
  M5.Lcd.setTextSize(1);
  M5.Lcd.setCursor(40, 0);
  M5.Lcd.println("IMU TEST");
  M5.Lcd.setCursor(0, 10);
  M5.Lcd.println("  X       Y       Z");
  M5.Lcd.setCursor(0, 50);
  M5.Lcd.println("  Pitch   Roll    Yaw");
}

float temp = 0;
void loop()
{
  M5.IMU.getGyroData(&gyroX, &gyroY, &gyroZ);
  M5.IMU.getAccelData(&accX, &accY, &accZ);
  M5.IMU.getAhrsData(&pitch, &roll, &yaw);

  M5.Lcd.setCursor(0, 20);
  M5.Lcd.printf("%6.2f  %6.2f  %6.2f      ", gyroX, gyroY, gyroZ);
  M5.Lcd.setCursor(140, 20);
  M5.Lcd.print("o/s");
  M5.Lcd.setCursor(0, 30);
  M5.Lcd.printf(" %5.2f   %5.2f   %5.2f   ", accX, accY, accZ);
  M5.Lcd.setCursor(140, 30);
  M5.Lcd.print("G");
  M5.Lcd.setCursor(0, 60);
  M5.Lcd.printf(" %5.2f   %5.2f   %5.2f   ", pitch, roll, yaw);

  delay(1000);
}

```

### SH200Qでの不具合
M5StickCの6axisIMUが「SH200Q」だと正常な加速度が取得できないようです
ちょうどその機種だったので、正常に取得できているかは確認できず。。


### Sketchでライブラリのインポート時の画面
![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48015/300afb9c-5b89-60be-3be3-365d24088b86.png)

###参考サイト

M5StickCを動かしてみる
https://qiita.com/itiB_S144/items/7a232c1a31151fcb5e5b
Blueqatで爆弾検査問題やってみる

#爆弾検査問題?

とても敏感な爆弾がある「かもしれない」とします。たった1つの光子でも、当たると爆発する爆弾です。
そんなもん、外乱で既に爆発してるだろうと思うのですが、そういう細かいことは無視します。

たった1つの光子でも爆発する爆弾を、爆発させずにあるかどうかを判定することは非常に難しいです。
何らかの形で光を使って検査することは不可能でしょう。

**そう、古典物理ならね。**

#量子力学なら、爆弾を爆発させずに、爆弾かどうか分かるかもしれない

ビームスプリッタという、ひとつの光子に対してアダマールゲートのような働きをする素子を使い、図のように、爆弾がある「かもしれない」位置を光が通るように、実験系を組みます。

![Screenshot_20200106_134257.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88256/7a7cb92e-89dc-ec66-ce3b-3f947ceeacc2.png)

ミラーは単に光の向きを変えているだけで、ここでは、何も起こらないと考えて構いません。
これは、量子回路で書くと、次のようになります。

![Screenshot_20200106_134517.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88256/b6a4c71a-f3c9-4c0d-fad8-ad6bd67e7b63.png)

爆弾がなければ、測定結果は常に|0>です。

```py
from blueqat import Circuit

Circuit().h[0].h[0].m[0].run(shots=1000)
# 結果: Counter({'0': 1000})
```

爆弾がある場合のことを考えます。

爆弾も量子回路に取り入れてみましょう。
爆弾は、もし0qubit目が|1>だったら爆発するので、CNOTゲートで置くことができます。

また、爆発したかしてないかは、明らかに分かるので、観測も行われていると考えられます。

![Screenshot_20200106_135420.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88256/6a5c7f7c-7324-a8e5-4224-b96c75154ad3.png)

```py
from blueqat import Circuit

Circuit().h[0].cx[0, 1].m[1].run(shots=1000)
# 観測結果が0なら、爆弾に光は当たらなかった。1なら、爆弾に光が当たった。
```

1qubit目の観測結果が1だったなら、爆弾が爆発してしまって、実験は終了です。
ところで、もし観測結果が1にならなかったら、先ほどの量子回路の観測結果はどうなるでしょう?

![Screenshot_20200106_140308.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88256/ac71f258-d8aa-7ae9-06be-b9923d79303f.png)

```py
from blueqat import Circuit

Circuit().h[0].cx[0, 1].h[0].m[1].m[0].run(shots=1000)                                           
# 結果(ランダムに変わります): Counter({'00': 243, '01': 271, '10': 233, '11': 253})
```

まず、1qubit目の観測結果(0から数えるので、1から数えると2番目)が1の場合は、爆発してしまい、終了です。
つまり、'01'と'11'の場合は、爆発エンドです。
今回、1000回試しましたが、271+253 = 524回は爆発エンドでした。

爆発は免れた場合を考えます。

その前に、そもそも爆弾がなければ観測結果は0だったことを思い出してください。
爆発したかしてないか(1qubit目)を観測した場合、爆弾がないと爆発は起こらず(0を観測)、0qubit目と合わせて00が観測されます。
念の為Blueqatで計算しておきます。

```py
from blueqat import Circuit
# 爆弾(CNOTゲート)がなければ、観測結果は00になる
Circuit().h[0].h[0].m[1].m[0].run(shots=1000)
```

爆弾がなければ、観測結果は必ず'00'になることが確認できました。

爆弾があった場合の話に戻ります。
先ほどの結果を見ると、1000回試して、243回は'00'でした。
'00'は、爆弾がなかった場合の結果と同じですので「実験したけど爆弾があるかないかは分からなかった」という結果になります。

しかし、233回だけ'10'が出ています。
これは、爆発していなくて、かつ、爆弾がない場合には絶対に出ない観測結果です。
もしも'10'が出たなら、爆弾を爆発させることなく「爆弾はあった」と結論付けることができます。

ところで、それぞれ、どれくらいの確率で観測されるのでしょうか。
観測前の状態ベクトルを見てみましょう。

```py
from blueqat import Circuit

Circuit().h[0].cx[0, 1].h[0].run()
# array([ 0.5+0.j,  0.5+0.j,  0.5+0.j, -0.5+0.j])
```

観測確率は状態ベクトルの絶対値の2乗なので、00, 01, 10, 11ともに0.25の確率で観測されることが分かります。

つまり、この実験を行うと、爆弾があった場合、

- 50%の確率で、爆弾は爆発してしまう
- 25%の確率で、爆弾があるのかないのか分からない
- 25%の確率で、爆弾を爆発させることなく、爆弾があることが分かる

ということになります。

#まとめ
今回、量子力学を使った、一風変わった問題を取り扱ってみました。

古典だと

- 何も実験をしない。爆弾があるかどうか分からない
- 何か実験をする。爆弾があった場合、100%爆発する

しか選択肢がなかったのですが、量子の世界では、このように、

- 何か実験をする。爆弾があった場合、50%の確率で爆発するが、25%の確率で、爆弾を爆発させることなく爆弾の存在を検知できる

といった選択肢も取ることができます。
SQL Server 特定接続先から処理負荷を制限

# シチュエーション

１つのDBサーバを複数アプリが共有する。各アプリのデータベースは連携するので物理的に別DBサーバにしない。
あるアプリがたまにアバレル君になり、DB性能に大きく影響を与え他アプリが共倒れになる。
改善案で少しでもアプリ設計変更が含まれると却下される。

# SQL Serverにリソース ガバナの導入

ここに書くとほぼコピペになるためリンク
https://matutak.hatenablog.com/entry/20100225/1267127110
古い記事だが、参考になった。
ありがとうございます。

 * ユーザー定義分類子関数例
  * master->プログラミング->関数->スカラー値関数 に作成

```sql
CREATE FUNCTION [dbo].[user_classifier]() RETURNS sysname
WITH SCHEMABINDING
AS
BEGIN

DECLARE @group_name AS sysname
set @group_name = SUSER_NAME()

select @group_name = (case when @group_name in ('app1','app2',...)
 then @group_name else 'default' end
)

return @group_name

END
```


# Zabbixに監視追加

アバレル君を明確にする
テストプール名：app1

* アイテム
 * 名前：Resource Pool Stats (app1)
 * タイプ：Zabbixエージェント(アクティブ)
 * キー：perf_counter["\SQLServer:Resource Pool Stats(app1)\CPU usage %"]
 * データ型：数値（浮動小数）
 * 単位：%

* トリガー
 * 名前：{HOST.NAME}: checkプールが5分間平均で{ITEM.LASTVALUE}を超過
 * 条件式：{share-db:perf_counter["\SQLServer:Resource Pool Stats(app1)\CPU usage %"].avg(5m)}>50

![2020-01-06 13.57.36 zabbix.hoege.com 2ce567e734fb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249425/65135c0c-2b7d-51af-0271-5a6c31d76abe.png)

#メモ
アバレルアプリを特定できたら会議がしやすくなった。

# 参考
 * https://m82labs.com/resource-governor
 * https://docs.microsoft.com/ja-jp/sql/relational-databases/resource-governor/resource-governor-resource-pool?view=sql-server-ver15
Google Cloud Vision API をPHPから使用する場合に出るエラーの対処

Google Cloud Vision API のドキュメント「クライアント ライブラリ」（ https://cloud.google.com/vision/docs/libraries?hl=ja ） の手順でPHPから実行して次のようなエラーが出る場合、

```
Fatal error: Uncaught DomainException: Could not load the default credentials. Browse to https://developers.google.com/accounts/docs/application-default-credentials for more information in /path/vendor/google/auth/src/ApplicationDefaultCredentials.php:168
```

行頭に次を追加する。

```
putenv("GOOGLE_APPLICATION_CREDENTIALS=キー生成時のJSONファイルのパス");
```

上記の他に発生するエラーの対処方法
・次でインストールしたクライアントライブラリのファイルに実行権限がない場合は実行権限を付与する

```
composer require google/cloud-vision
```

・Google Cloud Vision API から次のレスポンスでエラーになる場合、サーバーの時刻がNTPと同期していない可能性がある。

```
"error": "invalid_grant"
```
sshの接続方法をパスワードから鍵認証に変える

scpなどをする時に、パスワード認証だと毎回打つのがめんどくさいが、どこかにテキストとして保存するのも危険ですよね。
その時は、鍵認証に変えてしまうのが早いかと思われます。

## 前提
id_rsa, id_rsa.pubなどは手元にある。→なければ公開鍵と秘密鍵の生成を行ってください。

## 方法

```
scp ~/.ssh/id_rsa.pub user@ip:/home/USER/.ssh
```

として移動します。そこで、すでに
`authorized_keys`が
①存在すれば

```
cat id_rsa.pub >> authorized_keys
```

②存在しなければ

```
mv id_rsa.pub authorized_keys
```

とします。
その後、

```
chmod 600 authorized_keys
```
で権限を変えれば完了です。
R：shinyでwebアプリをつくる

R(RStudio)のshinyパッケージでwebアプリっぽいものを作った時の備忘録\_φ(･\_･

# 環境
- Mac OS X 10.12.6
- RStudio 1.0.136

# 準備
* shinyパッケージをインストール

```r:
install.packages("shiny")
require(shiny)

# URL 'https://cran.rstudio.com/bin/macosx/mavericks/contrib/3.3/shiny_1.0.5.tgz' を試しています 
# Content type 'application/x-gzip' length 2780870 bytes (2.7 MB)
# ==================================================
# downloaded 2.7 MB

# The downloaded binary packages are in
# 	/var/folders/t9/xk2j5yln4_dfmh518_4xvyw80000gn/T//RtmpmH3p3h/downloaded_packages
```



# その1：Hello Shiny!
[Shiny - Gallery](https://shiny.rstudio.com/gallery/)、[Shiny from RStudio（lesson1）](https://shiny.rstudio.com/tutorial/written-tutorial/lesson1/)を参考にしました。

>ここでやっていること

>- `Hello Shiny!` 表示
>- アプリ画面上で指定した階級ヒストグラム

```r:lesson1.R
library(shiny)

# アプリケーションの UI 定義
ui <- shinyUI(fluidPage(
  
  # アプリケーションタイトル
  titlePanel("Hello Shiny!"),
  
  # サイドバー
  sidebarLayout(
   # 階級数(bin)のためのスライダー
    sidebarPanel(
      sliderInput("bins",
                  "Number of bins:",
                  min = 1,
                  max = 50,
                  value = 30)
    ),
    
    # 生成された分布のプロットを表示する
    mainPanel(
      plotOutput("distPlot")
    )
  )
))

# サーバロジックの定義。ヒストグラムを描く
server <- shinyServer(function(input, output) {
  
  # ヒストグラムを描くための式。
  # この式は renderPlot にラップされている。つまり、
  #  1) これは "reactive" であり、入力が変更されると自動的に再実行される
  #  2) この出力タイプは plot である
  
  output$distPlot <- renderPlot({
     x    <- faithful$waiting
    bins <- seq(min(x), max(x), length.out = input$bins + 1)
    
       hist(x, breaks = bins, col = "#75AADB", border = "white",
         xlab = "Waiting time to next eruption (in mins)",
         main = "Histogram of waiting times")
  })
})

# アプリを動かす
shinyApp(ui = ui, server = server)
```
###### 出力結果
![スクリーンショット 2018-04-10 0.15.58.png](https://qiita-image-store.s3.amazonaws.com/0/215142/b7a913df-8f33-0f9c-7a55-7ec1cdc36048.png)

出来ました。


↓　暇なときに更新したいな‥（　＾ω＾）↓
##### その2：ダッシュボードを使ってみる
##### その3：選択された分析コードを実行する
discord.pyでTaskに引数を渡す

# 注意
既にアナウンスされている通り、discord.pyは2021年8月下旬ころ、以降のサポートを停止する旨発表されております。
もし本記事を参考にして不具合が生じた場合、ライブラリのサポート終了による影響である可能性もあります。
詳しくは [the_future_of_dpy.md](https://gist.github.com/Rapptz/4a2f62751b9600a31a0d3c78100287f1) をご覧ください。

# 前提
- discord.py 1.3.0
- python 3.6

# 注意
この記事に出てくるコードは説明用に記載しているため、実運用を想定したものではありません。
用途に合わせて適切に書き換えてくださいね。

# やりたいこと
`Task`に引数を渡したい

# なぜやりたいか
基本的に定期実行するTaskはbotの起動時に開始することが多いと思う。
ただ、時には、コマンドなどで開始タイミングや送信先チャンネルなどを制御したいことがある。
例えば、 **「今から30分間だけ5分ごとに指定のチャンネルで時報をメンションしてほしい」** みたいな。

ところが、現状discord.pyのドキュメント内には、Task (https://discordpy.readthedocs.io/ja/latest/ext/tasks/index.html) が引数をとるような例がない。


# 方法

まずは、定期実行したいTaskに普通に引数を追加しておく。
例えば上記を例にして、コマンドが入力されたチャンネル内でコマンドを送信した人にメンションを送る場合を考える。
この場合だと、コマンド入力時の`Context`を引数として受け取っておけば、チャンネルも送信者も特定できそうだ。

```python
from discord.ext import tasks, commands

class MyCog(commands.Cog):
    def __init__(self):
        pass

    def cog_unload(self):
        self.reminder.cancel()

    @tasks.loop(minutes=5.0, count=6)
    async def reminder(self, ctx, content):
       await ctx.send("<@{0}> {1}".format(ctx.author.id, content))
```
こんな感じでreminderを定義しておけば、後はこれを起動すればいい感じにリマインドが飛んでくれるだろう。
では、この引数`ctx`を渡すにはどうすればよいか。

# Taskの引数はstart()に渡す
タイトル通り。task開始時に使う`start()`に渡せばよい。`start()`に渡した`*args`と`**kawrgs`は、そのまま該当Taskの引数として渡される。
なので、例えば以下のようなreminderコマンドを定義すればよい。


```python
from discord.ext import tasks, commands

class MyCog(commands.Cog):
    def __init__(self):
        pass

    def cog_unload(self):
        self.reminder.cancel()

    @tasks.loop(minutes=5.0, count=6)
    async def reminder(self, ctx, content):
       await ctx.send("<@{0}> {1}".format(ctx.author.id, content))

    @commands.command()
    async def set_reminder(self, ctx, content):
        self.reminder.start(ctx, content) # ここ大事
        await ctx.send("リマインダをセットしました")
```

これで、`set_reminder`コマンドをチャットに送れば、5分ごとにあらかじめ指定した内容がメンションされる。
ポイントは`self.reminder.start(ctx, content)`で、`start()`に渡す引数が、その`start()`によって起動されるTaskの引数にそのままわたることさえ押さえておけばOK。


# 注意
最初にも書いたようにこのコードそのものは実運用を想定していません。
set_reminderを入力後30分以内にほかの人がまたset_reminder打ったらどうなるねんとか興味は尽きませんね。

あくまでTaskに引数を渡す説明を行うための疑似コードであることをご承知ください。
(とはいえ、文法ミスのような致命的な間違いがあれば教えてください)
【Nanonets】ポストの仕方メモ【Python】

#物体検知
```python
import requests
import cv2
import json
import time

url = 与えられたURL

headers = {
    'accept': 'application/x-www-form-urlencoded'
}

path = './testdir/test1.jpg'#自由なパス

#file = {'file': open(path, 'rb')}
data = {'urls' : ['https://goo.gl/ICoiHc', 'https://goo.gl/ICoiHc']}

start = time.time()
#response = requests.post(url, auth=requests.auth.HTTPBasicAuth('与えられる', ''), files=file)
response = requests.post(url, auth=requests.auth.HTTPBasicAuth('与えられる', ''), data=data)
end = time.time()
print("ポスト時間", end-start, "秒")
print(response.text)

jsondata = response.json()
result = jsondata["result"]
image = cv2.imread(path)

sep_score = 0.3

for r in result:
    labells = []
    score_ls = []
    print(r)
    for p in r["prediction"]:
        print(p)
        label, left, top, right, bottom, score = p["label"], p["xmin"], p["ymin"], p["xmax"], p["ymax"], p["score"]

        if score >= sep_score and not label in labells:
            labells.append(label)
            score_ls.append(score_ls)
            cv2.rectangle(image, (left, top), (right, bottom), (255, 0, 0), thickness=3)
            color = (255, 0, 0)
            fontScale = 1.0
            fontFace = cv2.FONT_HERSHEY_COMPLEX
            text = label + " " + str(round(score, 2))
            org = (left, top)
            cv2.putText(image, text, org, fontFace, fontScale, color, thickness=4, lineType=cv2.LINE_8)


cv2.imshow("pic", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

```

#画像分類

```python
import requests
import time

url = '与えられる'

headers = {
  'accept': 'application/x-www-form-urlencoded'
}

nls = ["test1.jpg", "test2.jpg", "test3.jpg", "test4.jpg", "test5.jpg", "test6.jpg"]

for n in nls:
    path = n

    file = {'file': open(path, 'rb')}

    data = {'modelId': '与えられる'}

    start = time.time()

    response = requests.request('POST', url, headers=headers, auth=requests.auth.HTTPBasicAuth('与えられる', ''), data=data, files=file)

    end = time.time()
    print("ポスト時間", end - start, "秒")

    print(response.text)
    jsondata = response.json()
    result = jsondata["result"]
```
#AWS コンソールで IAM ユーザーと S3 にフルアクセス権限を持ったグループを新規作成してアクセスキーとシークレットキーを得る例 

# 手順

- IAMから新規ユーザーを作成する ( https://console.aws.amazon.com/iam/ )
- 新規ユーザーが所属できる良さげなグループはあるか？あればそれを選び、なければグループを新規作成する
- 新規グループに対しては S3 のフルアクセス権限を与えてみる、あくまでこれは動作確認である
- グループが権限を持ち、そこに所属するユーザーが権限を得るという仕組みだ
- タグの設定などはスキップしてユーザー作成成功まで進むと、アクセスキー・シークレットキーを取得できる


# Captures

![image](https://user-images.githubusercontent.com/13635059/71774814-baa3b400-2fb8-11ea-860f-2bd9a8552dd0.png)
![image](https://user-images.githubusercontent.com/13635059/71774815-becfd180-2fb8-11ea-8ad1-c55261d08896.png)
![image](https://user-images.githubusercontent.com/13635059/71774816-c1cac200-2fb8-11ea-834d-c6ad988ad023.png)
![image](https://user-images.githubusercontent.com/13635059/71774818-c4c5b280-2fb8-11ea-9a9e-1a484352963e.png)


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2918








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
[Python入門]lambda式の基本的な使い方

# 記事の目的 #
自分と同じPythonの入門者が、lambda式の基本的な使い方を理解する事です。

先日、先輩からlambda式の使い所について聞かれたのですが、僕自身あまり使用しておらず上手く答えられなかったので、調べてまとめてみました。その時に以下のサイトを参考にさせていただきました。というか、この記事は自分の考えの整理用ですので、リンク記事をご覧になった方がわかりやすいと思います。

[Qiita:Pythonのlambdaって分かりやすい](https://qiita.com/nagataaaas/items/531b1fc5ce42a791c7df)

# lambda式とは #
lambda式は無名関数を作成するのに使用します。無形関数はその名の通り名前の無い関数のことです。２つの値の和を計算する関数を、普通の関数と無名関数で作成して、違いを比較してみましょう。

まずは普通の関数です。関数名をaddとして関数を定義します。

```python
# 普通の関数
def add(a, b):
  return a + b

# 関数名「add」から関数を呼び出します。
print(add(1, 2)) #==> 3が出力されます
```

次に、無名関数で同じことをしてみましょう。無名関数を定義して、その関数オブジェクトを変数(add_lambda)に代入しています。~~無名関数を使用する場合は変数から関数オブジェクトを呼び出します。**無名関数を変数に代入しているのは、無名関数は呼び出すための関数名が無いため、変数に代入しなければ利用できないためです**。~~ 今回は無名関数を変数に代入して使用していますが、変数を利用しないで無名関数を利用することもできます。(@konandoiruasa 様ご指摘ありがとうございます。)

```python
# 無名関数のオブジェクトを変数(add_lambda)に代入します。
add_lambda = lambda x, y: x + y

# 変数から関数オブジェクトを呼び出します。
print(add_lambda(1, 2)) #==> 3が出力されます
```

ご覧の通り、この２つの例は同じ処理をしています。ではなぜ、lambdaなんてものがわざわざあるのでしょうか？これについては次に述べます。

# なぜlambda関数が必要なのか #
**結論から言うと、記述が簡単になる場合があるためです。**

では、どのような場合に簡単に記述できるかを、具体例で説明したいと思います。

Pythonでは関数の引数として、関数を受け取れる関数を作成することができます。例として、受け取った関数の結果を表示する関数(return_result)を考えてみましょう。

```python
### disp_resultの機能 ###
# 引数として、関数(func)とfuncで使用する引数(*args)を受け取る
# func(args)の結果を表示する
def return_result(func, *args):
  return func(*args)
```

このreturn_resultに２つの和を返す関数を引数として与えた場合の、普通の関数で実施する場合と、無名関数で実施する場合とで比較してみます。

まずは普通の関数の方を見てみましょう。

```python
def add(a, b):
  return a + b

print(return_result(add ,1, 2)) #==>3が表示されます。
```

では、無名関数を使用した場合を見てみましょう。

```python
print(return_result(lambda x, y: x + y, 1, 2)) #==>3が表示されます。
```

lambdaで無名関数を作成したほうが、関数の定義を別途しないで良いので記述が簡単になりました。

このように無名関数は、関数(func)と引数(*args)を引数とする関数(return_result)で使用する場合、関数の定義が必要ない分だけ記述を簡略化できます。ただし、funcとして複雑な関数を使用する場合は、lambdaではなく普通に関数を別途定義する必要があります。

# lambda式の使用方法 #
lambdaの使用方法は以下の通りです。

```python
#lambda 引数a, 引数b : 引数aと引数bを使用した処理
func_lambda = lambda a, b: a + b
```


より詳細には以下となります。**これは[Pythonドキュメント](https://docs.python.org/ja/3.7/reference/expressions.html#grammar-token-expression-nocond)の一部をスクリーンショットで切り取って転載しています。**
![スクリーンショット 2020-01-06 13.49.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227731/208a5723-cebd-b523-0379-b3359618388c.png)


# 頻繁に使われると思われる状況 #
map関数やfilter関数で良く使用されている記事を見かけます。

# まとめ #
lambdaは複雑な関数や、通常の関数の利用では使用するメリットはあまり無いが、高階関数などの関数を引数として受け取る関数に、引数として使用する分には記述が簡単になって便利!。。。というのが自分なりの結論です。

# 補足(ご指摘により追加) : 変数を使用しないで無名関数を使用する方法 #

```python
sum_result = (lambda x, y: x+y)(1, 2) # sum_resultには3が代入されます。
```

なぜこんな書き方ができるかというと、lambdaのドキュメントによれば、

>式 lambda parameters: expression は関数オブジェクトになります。

とあります。そうlambda式は関数オブジェクトなのです!!ですので、`(lambda x, y:x+y)`の部分が関数オブジェクトとなるのです。

従って、`関数オブジェクト(実引数)`の形式で関数として使用できるのです!!
この方法であれば、１度なら変数を使用しなくても無名関数が使用できますね!!
知りませんでした。

# 参考 #
[Pythonドキュメント](https://docs.python.org/ja/3.7/reference/expressions.html#grammar-token-expression-nocond)
[Qiita:Pythonのlambdaって分かりやすい](https://qiita.com/nagataaaas/items/531b1fc5ce42a791c7df)
ロボトレーサの円の加速度のFF制御

<h1>理論考察</h1>
加速度円運動の式は、
$$\boldsymbol{a}(t)=\frac{dv}{dt}\boldsymbol{t}+\frac{v^2}{r}\boldsymbol{n}$$
$$|\boldsymbol{a}(t)|^2=(\frac{dv}{dt})^2+(\frac{v^2}{r})^2$$
$\boldsymbol{a}(t)=9.8[m/s^2]$に保ちたい。
vについての一階微分方程式なので、解けるよな？加速度ベクトルを一定にするvが存在すると思っていた。。。
<img width="324" alt="Screen Shot 2019-12-28 at 12.48.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550140/7ed31b43-194d-8bea-a6ab-ecc2b341cd8d.png">
第1種不完全積分となって、不定積分不可能になる事がわかった
（積分範囲が0から1までなら解けるそうです）
vについて知りたかったので、関係なさそう

<h1>テキトー近似</h1>
Δωの半分の角速度でΔt秒間走行していると、近似してみる
<img width="386" alt="Screen Shot 2019-12-27 at 22.32.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550140/b96f5264-84f4-0cd0-614d-4bf534b307d2.png">
$$\boldsymbol{a}(t)=rα\boldsymbol{t}+rω^2\boldsymbol{n}$$
$$|\boldsymbol{a}(t)|=\sqrt{(rα)^2+(rω^2)^2}=9.8[m/s^2]$$
ここで、$ω=α・Δt＋ω_0$なので、
代入して、

$$|\boldsymbol{a}(t)|=\sqrt{(rα)^2+(r((α・Δt+ω_0)^2)^2}=9.8[m/s^2]$$

$$(rα)^2+(r((\frac{α・Δt+ω_0}{2})^2)^2=96.04$$
$$$$
$ω_0=0,r=1,Δt=0.001$の場合について考えてみる


$α=9.79[rad/s^2]$となった
平均の角速度$\frac{ω}{2}=9.79*0.001/2=4.9・10^{-3}$
→T=Jαより、必要なトルクが求まる

→$d(F_R-F_L)=T$より、$(F_R-F_L)$が求まる
よって、F_Rの入力<4.9[N]の時、F_L=0とすれば良く、F_R

その解がFF制御の制御量となる

```math
\begin{cases}
F_R=0.61[N]\\
F_L=0.36[N]\\
ω=0.1[rad/s]\\
v=0.1[m/s]
\end{cases}
```
となる
しかし、、、$F_R=0.61$???これは、右足の静止摩擦力0.49[N]を超える！
滑るね。。。片方の足に0.49[N]以上かかってもダメだという事を考えなければならない。
初心者による ES6 letとconst

#概要
ES6以降のlet、constの特徴についてメモ

#従来のjavascript
従来のjavascriptでは２種類のスコープ、つまり関数およびグローバルスコープしか存在しなかった。そのためブロックの外からであってもアクセスすることができた。これはC言語等を学んだことのある人からすると大変驚くべき仕様である。
次のコードを見てみよう

```javascript:sample.js
if(false){
 var x = "hello"
}
console.log(x)

//出力
undefined
```
エラーではなくundefinedが出力されてしまう。
よりスコープの狭い変数を宣言するためにletキーワードが導入された。

#letキーワード
letを使うことで変数の寿命をブロック単位にすることができる。

```javascript:sample.js
if(false){
 let x = "hello"
}
console.log(x)

//結果
error: x is not defined
```
varではブロックの外からでもアクセスすることは出来ましたが、letを使うことでより安全なコードを書くことが可能になります。

#constキーワード
constキーワードは様々な言語でおなじみの通り、値を変えることができない変数を宣言するときに使います。
次のコードを見てみよう。

```javascript:sample.js
const x = 'Tokyo'
x = 'Kyoto'

//結果
error
```
これは変数の値を上書きすることのできないconst値を上書きしようとしているためエラーとなっている。
しかし、ES6のconstは他の言語のように読み取り専用の値を宣言するわけではない。
次のコードを見てみよう。

```javascript:sample.js
const user = {
 locaton: 'Tokyo',
 name: 'Satou',
 age: '100'
}
user.name = 'Kyoto'

//結果
OK
```
このコードはconstを使っているのに値を変えている。しかし変えているのはオブジェクトそのものではなく、オブジェクト内のプロパティ値である。つまり

```javascript:sample.js
const user = {}
user = 1

//結果
error
```
オブジェクトそのものを変えるのはエラーとなる。
このことを利用して、モジュールをrequireするときにconst変数を使うのが一般的になっている。なぜなら、その変数に再代入する必要がないからである。

```javascript:sample.js
 const request = require("request")
```

##参考資料
オライリージャパン出版「Node.js デザインパターン」
LambdaとS3とRDSと。ハマった話。

## はじめに

スタートアップ系企業に転職し、言語もPHPからPythonに変わった。
基本的にサーバレスアーキテクチャですべて構築していくスタンスなため、イチから勉強中。
Lambdaでは基本的にRDSを使っちゃいけないっていうのが、暗黙の了解っぽいんだけど、言われている通り様々な問題にぶつかっている。

今回Lambda(Python)でS3とRDSを同時に使おうとしたときにハマったのでそのメモ。

## やろうとしたこと
LambdaがS3にあるファイルを取得し、その内容をRDSに保存していくといういたってシンプルなもの。

## 構成
- Lambda(Python3.6)
  - psycopg2
  - boto3

- RDS (public access許可、IP制限)
- S3

構成の都合上RDSをpublicにしたかったので、IP制限（アクセス制限）で限定的に公開する形をとった。
LambdaはIPをもっていないのでVPC配下に置くことでセキュリティーグループに属することができる。
セキュリティーグループに属せれば、そのグループをRDS側で許可するという算段。

## LambdaがS3にアクセスしたあと、RDSにアクセスしようとするとつながらない問題
Lambda <-> S3
Lambda <-> RDS

という単体の動作はチェック済みであり、あとはその処理を一つにまとめるだけだった。
しかし、処理を一つにするとS3から資源を取得したあと、RDSにつながらなくなる。
RDSのinboundに0.0.0.0を追加してもだめ。
すんごくハマって困った。

## 解決方法
もしかしたらAWSを理解している人には当たり前の話なのかもしれないが、

**VPCの設定でS3にエンドポイントを設定することですんなりアクセスできるようになる。**

ネットワーク関係に疎いのでこういう部分が全然わかっていない。。。


## 個人的見解

自分としての見解はいろいろ間違っているかもしれないが恐れずに言うと、



LambdaがS3を見に行ったタイミングで外部参照になるらしく、その後のVPC部分で問題が起きる。
S3に対してVPCのエンドポイント設定すると、Lambdaが内部参照のままになり、その後VPCも問題なく動いてRDS参照できるようになる。

という感じかなー？と今のところ勝手に理解してます。
誤爆防止！WinSCPでサーバーやユーザー毎に背景色を変える方法

![eyecatch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489275/5366d6da-3d4f-ba26-33ab-377d17afb6db.png)

テスト環境にアップするはずだったファイルを誤って本番環境にアップしてしまい、動作確認などが不十分なまま全世界に大公開!!!
想像しただけで背筋が凍るシチュエーションであると同時に、誰にでも起こり得るミスでもあると思います。

WinSCPを使っている方でしたら、接続先のサーバーやユーザー毎にウィンドウの色を変える設定ができるので、こういったミスを防止する為にもお勧めです。

---

#1.設定画面を開く

![設定画面を開く_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489275/b507e12c-86a8-0d77-aab5-844c13200bfd.png)
WinSCPを起動すると最初に出てくるログイン画面で、色を変更したいサーバーを選択し、`編集(E)`をクリックします。

![設定画面を開く_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489275/7bba3f12-50d5-f4c5-ee80-7a6ae0bf2cbd.png)
`設定(D)`がクリックできるようになるので、クリックします。

#2.色を選択する

![色を選択する_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489275/402dae7c-883d-1c72-5d16-f376aa877aa9.png)
`高度なサイトの設定`という画面が出てくるので、左下の`色(C)`をクリックすると、色の選択肢が出てきます。

![色を選択する_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489275/103a39cc-0a04-9c64-ed77-4efa319ecf2d.png)
この中に無い色を指定したい場合は、`色の作成(M)`をクリックすると他の色を選択することができます。

#3.設定を保存

![設定を保存_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489275/6c72e98f-0cef-44f8-039d-4cf99408c404.png)
`高度なサイトの設定`の画面で`OK`をクリックします。
※今回の例では赤を選択しました。

![設定を保存_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489275/de0014c1-5c50-2fc4-a81f-c64169df2eb5.png)
ログイン画面に戻るので`保存(S)`をクリックします。

![設定後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489275/b44319b2-05b9-e9da-727d-cac28321a99b.png)
次回サーバーに接続したときには、このように背景色が設定した色で表示されると思います。

---

#ポイント

色分けは自分なりに分かりやすいルールを決めておくことをお勧めします。
私の場合は、

* サーバー毎にテーマカラーを決める
* 強い権限のユーザーほど濃い色にする
* 注意喚起のため、本番環境は派手な色にする

というルールを決めています。

##設定例

<table>
<tr>
<th bgcolor="#EE0000"></th>
<th>普通の権限</th>
<th>強い権限</th>
</tr>
<tr>
<th>テスト環境 その1(ブルー系)</th>
<td><font color="#00ffff">■■■</font></td>
<td><font color="#00bfff">■■■</font></td>
</tr>
<tr>
<th>テスト環境 その2(グリーン系)</th>
<td><font color="#7fff00">■■■</font></td>
<td><font color="#bdb76b">■■■</font></td>
</tr>
<tr>
<th>本願環境(赤・ピンク系)</th>
<td><font color="#ffb6c1">■■■</font></td>
<td><font color="#ef857d">■■■</font></td>
</tr>
</table>
Mojaveでbundle install/updateが失敗するのを解決したい

iOS開発しているとrubyに依存している箇所が少なからず存在すると思うのですが、その際に詰まったのでメモとして残します。誰かの助けになったら幸いです。

bundle installしたときに以下のエラーが出ました

```
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
```

MojaveにはmacOS SDK Headerが入っていないのがエラーの原因とのことなので

```
$ sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /
```

でinstallすると治りました。同じ問題かどうかわかりませんが、参考になれば幸いです。
ショートカット・オートメーション [ 入門編 ]

# はじめに

今年は効率化を頑張っていきたいと考え、あまり活用できていなかったiPhoneの「ショートカット」アプリについて、ちょっと調べてみました。

# ショートカットとは？
iOS13から標準搭載となった「ショートカット」アプリで提供される機能。
ひとつまたは複数のアクションを登録したもの（バッチ処理 ? マクロ ? ）を定義して、iPhoneでのいつものルーチン作業をワンタッチで実行できます。
アクションは、アプリを起動するだけではなく「〜にメッセージを送信」など、アプリ内の機能を直接実行できます。
ちなみに、サードパーティアプリで様々なアクションを提供するには、[Intents](https://developer.apple.com/documentation/sirikit/creating_an_intents_app_extension) や [NSUserActivity](https://developer.apple.com/documentation/foundation/nsuseractivity) を使ってアプリ側で実装する必要があります。また、既存のURLスキーム（[X-callback](https://techlife.cookpad.com/entry/2014/11/14/143841)も）の機能も呼び出すことができます。

# ショートカットアプリ　大まかな機能（タブ）の説明

### マイショートカット 
基本機能。ショートカットを作ってここに登録しときます

	
### オートメーション
何らかのトリガから起動するアクションやショートカットを登録できます


### ギャラリー
ショートカットの見本がいくつか置いてあります

# アクションの種類

アクションは下記のように分類されています

|分類  |説明  |
|---|---|
|App  |アプリの提供するアクションを選ぶ。前述のIntentsやNSUserActivityなどで実装されたものが選択可能  |
|スクリプティ |アプリを開く、登録済みのショートカットを実行、デバイス・ネットなどの本体機能、x-callback（URLスキームもここで呼べる）条件分岐、通知出す、、など|
|メディア |ストア検索、画像の処理（GIF作成、画像フィルタ）、写真とる など |
|場所 |現在位置取得、マップで開く、移動時間取得、天気関連など|
|書類|QRコード作成、アーカイブ、テキスト処理（音声入力、読み上げ、、）、ファイルに追加、PDF作成、メモに追加　など|
|共有|クリップボード、エアドロップ関連|
|Web|URL開く、Javascript実行、リーダー表示など|
|よく使う項目|今まで紹介したアクションを「よく使う」登録しておけます|


# ショートカット例
### 音声入力して共有

いろんなとこで紹介されてますが、便利なので。以下のショートカットで
音声でメッセージを入力ー＞iOS標準の共有メニューから好きなアプリに送る
ことができます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545858/9aaaf0c1-2417-c597-5583-edba12928613.jpeg" width="400">

### 朝の習慣をオートメーション化
毎朝　天気予報の確認し、ポッドキャストを聴きながら出勤してます。これを自動化するため「オートメーション」を登録します。

#### プラン１ アラーム停止をトリガーに
朝目覚める用のアラームを止めた後、実行させてみる

1. オートメーションタブにて＋ボタン押下
1. 個人用オートメーションを作成 押下
1. 「アラーム」を押下
1. 「停止された」「既存」を選択
1. 朝のめざまし用アラームを選択
1. 「次へ」押下
1. アクションを追加する
 <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545858/b2bdc39e-29d7-a2ca-79bd-148e22fa0e72.jpeg" width="400">
 * 現在の天気を取得、と読み上げを組み合わせることで、天気を音声で読み上げてもらいます。
 ※ 一番下のアクションは、愛用してるpodcastアプリ「[Pocket Casts](https://apps.apple.com/jp/app/pocket-casts/id414834813)」を呼び出し再生を開始するものです ^^


1. 「実行の前に尋ねる」をオフにしておく

 <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545858/9a794f6d-4100-e9b0-8f90-7be619b82f9a.jpeg" width="400">


#### プラン２　NFCタグをトリガーに
トリガーとしてNFCを指定できます。私が普段使ってるIC定期券にも反応してくれるみたいなのでやってみました。
定期券と同じポケットにiPhoneを突っ込むと、天気予報が聞ける、、という計画です。

1. オートメーションタブにて＋ボタン押下
1. 個人用オートメーションを作成 押下
1. 「NFC」を押下
1. 「スキャン」を押下ー＞NFCタグをかざして、名前をつける
1. 「次へ」押下
1. アクションを追加する

 <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545858/9b51c28e-de34-df06-adeb-dbb266200cf7.jpeg" width="400"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545858/a83a1fd3-2e30-d8c0-6780-663ae3ed72fd.jpeg" width="400">

* 定期券と重ねるたびに常に喋り出されても困るので、出勤時間に限定するためちょっと仕掛けをしました。
「現在の日付」を取得し、「日時をフォーマット」で時刻部分を取り出し、出勤時間帯の「7」時と一致する場合だけ、読み上げを行うようにしています。
* こちらも「実行の前に尋ねる」をオフにすることをお忘れなく。


# さいごに
上記定期券と重ねる作戦は、うまく反応しなかったり問題があり、結局アマゾンでNFCタグのシールを購入し、寝室の出口に貼り付けてそれをトリガーにする運用で使ってます。
まだまだ理想の効率化環境には程遠い状況ですので、これからも活用法を追求していきます。

参考：ショートカットの細かい説明は　[ショートカット ユーザガイド](https://support.apple.com/ja-jp/guide/shortcuts/welcome/ios)　にあります。
ロボトレース のショートカット経路


![untitled1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550140/7b0eb27f-abd3-501a-5cc3-a7c7dc51d814.png)
アルゴリズム
1. 直線は次のRの符号と同じにする
2. 円弧で、前回の経路と符号が違う時、法線ベクトルの方向にトレッド幅の２倍ずれる

```matlab:saiteki_keiro.m
        function obj = write_saiteki_keiro(obj,keiro)%keiro[回転角度[rad],R[m]]直線の時:rad=距離
            keiro = optimize_keiro(obj,keiro)
            for gyou = 1:size(keiro,1)
                gyou
                %符号が違う(積がマイナス)時、ずらす
                if (abs(keiro(gyou,2))~=inf)
                    if keiro(gyou-1,2)*keiro(gyou,2)<0
                        if keiro(gyou,2)>0
                            housen_theta = obj.theta + pi/2;
                        else
                            housen_theta = obj.theta - pi/2;
                        end
                        obj.x = obj.x + 2*obj.tred*cos(housen_theta);
                        obj.y = obj.y + 2*obj.tred*sin(housen_theta);
                    end
                end
                obj = write_one_keiro(obj,keiro(gyou,1),keiro(gyou,2));
            end
        end
```
後は、
- 経路をずれるところをぼかす
- タコつぼ、スラローム対策
次に速度、角速度を決定してみる
![untitled1 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550140/330ac231-e8f1-81a0-021e-5ace1c426d75.png)
次に加速度、角加速度を決定してみる
角加速度のトレードオフ
$$\boldsymbol{a}(t)=a(t)\boldsymbol{t}+\frac{v^2}{r}\boldsymbol{n}=a(t)\boldsymbol{t}+rω^2\boldsymbol{n}=a(t)\boldsymbol{t}+vω\boldsymbol{n}$$
なので、速度一定、角加速度一定では、加速度は大きくなるばかりだ
とりあえず、角加速度だけ設定してみる
VSCodeでSQLをフォーマットしたいよ

SQL文をVSCode上でフォーマットかけて綺麗に見たい。
この願いを叶えてくれるツールがあった。~~（他に良いのあったら教えて欲しい。これでも地味に不十分~~
→コメントで新しいものを教えていただきました。完全に自分の希望と合っていて神。

SQLのログから、どんなクエリが発行されているか確認したい時、ただ実行クエリを出力しているだけなので、ログを見ても以下のようにしか見られない。クエリは適当です。

```sql
select * from hoge as h where h.user_id = 1 and h.dep_date = '20200101' and h.area_id = 2
```

自分的に見たいのは以下のようにインデントをちゃんと付けて見たい。

```sql
select
    *
from
    hoge as h
where
    h.user_id = 1
    and h.dep_date = '20200101'
    and h.area_id = 2
```

Web上でフォーマットかけてくれるのもあるけど、いちいち開くの面倒なんじゃー。
[SQLフォーマッターFor WEB](https://atl2.net/webtool/sql%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%82%BF%E3%83%BCfor-web/)

なので普段使用しているVSCode上でできるやつを探したらあった。

## VSCode SQL Formatter

評価ひっくいのは気にしない。（実際そんなに使いやすい訳ではないけど、無いよりマシ。）

[SQL Formatter](https://marketplace.visualstudio.com/items?itemName=cymonk.sql-formatter)

インストールしたら以下のショートカットで実行可能。

・Win: <code>Ctrl+Shift+P</code>
・Mac: <code>Cmd+Shift+p) </code>

![Jan-06-2020 13-15-29.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253969/09b570e4-30d2-c6bf-1bed-6dd38c76108c.gif)

**この拡張機能の微妙なところ**
概ねフォーマットしれくれるので満足なんだけど、フォーマットを実行する際にVSCodeの言語モードを<code>SQL</code>に設定していないと実行されない。

Prettify JSONとかは言語モード指定しなくても綺麗にJSONフォーマットしれくれるんだけどなあ。このSQLverは無いのか。

他に良いのあったら是非教えてくださいませ。

---
**以下、追記**
優しい人が作ってくださいました。

## SQL Formatter Mod
上記の拡張機能から派生して作成した改良型版らしいです。

[(SQL Formatter Mod)](https://marketplace.visualstudio.com/items?itemName=nmrmsys.vscode-sql-formatter-mod)

**上記との拡張機能と違い**
上記は言語モードを`SQL`にしないとフォーマットをかけてくれませんでした。
しかし、今回の改良型版は言語がPlantext（新規ファイル状態）でフォーマットかけてくれます！（楽チン！）

Mac：`Cmd + p` →　`>SQL Format` →　`Enter`でフォーマットかけてくれます。（神か）
![Jan-18-2020 10-30-40.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253969/79b67dd9-9576-5880-2ec2-574f76faabb7.gif)

これでデバッグが捗りますね〜。
SQLのデータを綺麗に見たいって人は是非。