OmniAICreator/Qiita-1.07M huggingface dataset:
【備忘録】Azureストレージ作成についてのまとめ

Azure Storageを作成する時にいつも資料を見返してしまうので、設定項目やオプションについてまとめました。
##Azure Storageは下記の4つのデータサービスがあります。

- BLOB
- Files
- キュー
- テーブル

###Azure BLOB
BLOBとは、非構造化データ（ドキュメント、ログ、写真、ビデオ、ソーシャルメディア、Webアプリデータ、バックアップデータなど）

|種類 |説明 |
|---|---|
|ブロックBLOB|ドキュメント、ソーシャルメディア、バックアップデータの格納に適している。|
|追加BLOB|ログの格納に適している。新しいブロックを最後に追加更新できる。|


###Azure Files
Windows標準のファイルサービスプロトコル「SMB」を使用する。
クラウドでのファイル共有を実現する。共有フォルダのようなもの。

###Azure キュー
ワークフロー処理やコンポーネント間で通信するメッセージング機能を提供。
通信は1対1でやるため、送信側が受信側の受け取りが確認取れるまで次の送信処理は待機になります。その待機となるメッセージングを格納します。
原則、先入先出（FIFO）ですが、非同期だと受信連絡を受けなくても次の送信ができます。
負荷平準化では、受信側でピーク時を避けれる。
負荷分散では、受信側を増やして多く処理できる。

###Azure テーブル
アプリのデータ（ユーザー情報とか）、デバイス情報、メタデータなどの構造化データを格納する。
その実態はNoSQLデータベース（キー属性）。リレーショナルデータベースと異なるところはスキーマ設計が不要で自由にデータを修正でき、大容量の構造化データに最適。

##ストレージアカウントの設定
###ストレージアカウント名
|使用可能文字|長さ|
|---|---|
|小文字、数字|3～24

###パフォーマンス
データ保持に使用するディスクストレージの種類を選びます。

|選択肢 |種類 |
|---|---|
|Standard |従来のハードディスク |
|Premium |ソリッドステートドライブ（SSD） |


###アカウントの種類
ポリシーのセットと価格に差がでてきます。

| 種類|概要 |
|---|---|
| StorageV2(汎用 v2)|すべてのストレージの種類とすべての最新の機能をサポートしている |
| StorageV1(汎用 v1)|すべてのストレージの種類はサポートしているが、すべての機能はサポートしていない場合がある |
|BLOBストレージ|ブロックBLOBと追加BLOBのみ使用可|

###レプリケーション
耐久性と高可用性を確保するためのオプションです。

|種類 |概要 |
|---|---|
|ローカル冗長ストレージ（LRS）|プライマリリージョンの1つの物理的な場所でデータ同期を3回。コスト最安。 |
|ゾーン冗長ストレージ（ZRS）|プライマリリージョンの3つの可用性ゾーン間でデータ同期。 |
|geo冗長ストレージ（GRS） |LRSを使用して、プライマリリージョンの1つの物理的な場y祖内でデータ同期を3回、その後、セカンダリリージョンの1つの物理的な場所にデータを非同期でコピー。 |
|読み取りアクセス地理冗長ストレージ（RA-GRS） |GRSを使用するが、セカンダリリージョンへの読み取りアクセスが有効。 |
|geoゾーン冗長ストレージ（GZRS） |GZRを使用して、プライマリリージョンの3つのゾーン間で同期。その後、セカンダリリージョンの1つの物理的な場所にデータを非同期でコピー。 |
|読み取りアクセスgeoゾーン冗長ストレージ（RA-GZRS） |GZRSを使用するが、セカンダリリージョンへの読み取りアクセスが有効。 |

GRSやGZRSのセカンダリリージョンはフェールオーバーがない限りは読み取れません。
セカンダリリージョンへの読み取りアクセスするには、RA-GRSまたはRA-GZRSを使用します。

###アクセス層
|種類 |概要 |
|---|---|
|ホット |頻繁にアクセスされるデータに最適 |
|クール |アクセスの頻度の低いデータに最適 |

###ネットワーク接続
|種類 |
|---|
|パブリックエンドポイント（すべてのネットワーク）
|パブリックエンドポイント（選択したネットワーク）
|プライベートエンドポイント|

###Data Lake Storage Gen2
ビッグデータ分析のための非常にスケーラブルで費用対効果が非常に高いです。
作成するストレージアカウントをData Lake Storage Gen2として使用したい場合に「階層構造の名前空間」にチェックを入れます。

##参考
[Azure 管理者向けのストレージの実装と管理](https://docs.microsoft.com/ja-jp/learn/paths/azure-administrator-manage-storage/)
[Swift]UIImage型とData型の相互変換

# はじめに
Swift4からUIImage型とData型の変換をシンプルに書けるようになったので紹介します。
特にUIImage型→Data型への変換はしばしばextensionを作っていましたが、それらと同じことが公式にできるようになりました。

# UIImage型→Data型
`image`をData型に変換したいUIImage型のインスタンスとします

```swift
// pngに変換する
image.pngData()

// jpegに変換する
// compressionQualityには0~1の範囲で圧縮率を指定する
image.jpegData(compressionQuality: 1)
```

# Data型→UIImage型
`data`をData型に変換したいUIImage型のインスタンスとします

```swift
// UIImage?型になるので、必要に応じてアンラップをする必要がある
UIImage(data: data)

// 強制アンラップしてUIImage型にする
UIImage(data: data)!
```

# 参考リンク
https://developer.apple.com/documentation/uikit/uiimage/1624096-pngdata
https://developer.apple.com/documentation/uikit/uiimage/1624115-jpegdata
https://developer.apple.com/documentation/uikit/uiimage/1624106-init
Jetson NanoでDockerを動かす

# はじめに

Jetson NanoのJetPack 4.2には最初からDocker環境が入っているようなので試してみることにしました。今手元にJetson Nanoしかなかったので触ってみた程度ですが…というか普通にデスクトップ環境と何ら変わらない（笑）
わざわざ記事にするほどのことでもないけど、一応メモということで。

# root権限なしでDocker利用可能とする

```bash
# ユーザーをDockerグループに追加
$ sudo gpasswd -a $USER docker
# Dockerグループに追加されていることを確認
$ cat /etc/group | grep docker
# 権限の付与
$ sudo chmod 666 /var/run/docker.sock
# 権限の確認
$ ls -l /var/run/docker.sock
srw-rw-rw- 1 root docker 0  6月 15 17:06 /var/run/docker.sock

```

詳しくは[こちら](https://qiita.com/M-jan/items/fce9c25f797cad0dd76f#root%E6%A8%A9%E9%99%90%E3%81%AA%E3%81%97%E3%81%A7docker%E5%88%A9%E7%94%A8%E5%8F%AF%E8%83%BD%E3%81%A8%E3%81%99%E3%82%8B)を参考にしてください。

# 基本動作の確認

こちら「[Dockerの基本動作 - Qiita](https://qiita.com/M-jan/items/0d5fa60e92bc0cb26e60)」を参考にDocker基本動作の確認をしていきます。

今回利用するサンプルは、
Go言語のコードで、以下ような挙動をするサーバアプリケーションとして作動します（サンプル：[hello_docker - GitHub](https://github.com/fumihachi94/hello_docker)）。

- 8080ポートにhttpリクエストを送ると"Hello Docker!!"とレスポンスする

## dockerイメージのビルド

Desktop環境（Ubutnu18.04）では、10秒くらいでビルド完了しましたが、高性能とはいえマイコン…2分くらいかかりました。

```bash
$ git clone https://github.com/fumihachi94/hello_docker.git

$ cd hello_docker

$ docker image build -t sample/echo:latest .
```

## 動作確認

**ポートフォワーディング設定**

ホストマシンのポートをDockerコンテナポートに紐付け、コンテナの外から来た通信をコンテナポートに転送させます。この例では、

- ホストマシンポート : `9000`
- コンテナポート : `8080`

に設定しています。

```
docker container run -d -p 9000:8080 sample/echo:latest
```

**コンテナの実行を確認**

```bash
$ docker container ls
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS                    NAMES
49c69a5f1f78        sample/echo:latest   "go run /echo/main.go"   49 seconds ago      Up 48 seconds       0.0.0.0:9000->8080/tcp   infallible_davinci
```

**アプリケーション動作の確認**

```bash
$ curl http://localhost:9000
Hello Docker!!
```

以上で、Jetson Nanoでも基本的なサーバーアプリケーションをDockerで動かすことができました！


# その他 参考サイト

- [Jetson NanoでDockerを動かす(前編) - Qiita](https://qiita.com/yamamo-to/items/33f57f9a059cc95b9c08)
競技プログラミング練習記 No.11【ABC146練習】

初回 -> [はじめに](https://qiita.com/easychoco/items/a9ae28aca97cfe47091f)

[ABC146](https://atcoder.jp/contests/abc146)を解きました。
3完です。

D問題はこちら→
[競技プログラミング練習記 No.22【ABC146-D練習】](https://qiita.com/easychoco/items/29dd6b7f2700a1233ba7)

|問題|時間|アルゴリズム|実行時間
|:-:|:-:|:-:|:-:|
| A |  1min |-|1ms|
| B |  3min |-|1ms|
| C | 28min |二分探索|1ms|



## A - Can't Wait for Holiday
```c++
	string s;
	cin >> s;

	unordered_map<string, int> ans;
	ans["SUN"] = 7;
	ans["MON"] = 6;
	ans["TUE"] = 5;
	ans["WED"] = 4;
	ans["THU"] = 3;
	ans["FRI"] = 2;
	ans["SAT"] = 1;

	cout << ans[s];
```
全組み合わせを列挙しました。
`unordered_map`はハッシュテーブルのことですね。
ちなみに`map`は平衡二分探索木になります。
どっちにしても解けるのには変わりないです。

## B - 	ROT N
``` c++
	int n;
	string s;
	cin >> n >> s;
	
	for(auto& c : s)
	{
		char ch = (((c + n) - 'A') % 26 + 'A');
		cout << ch;
	}
```
`char`は内部では文字コードを数値として持っているので、それを利用しました。
`A~Z`、`a~z`、`0~9`あたりは連番になっていてよく使います。

## C - Buy an Integer
``` c++
ll a, b, x;

ll calc(ll n)
{
	ll ret = a * n;

	ll log10 = 1;
	while(n /= 10, n > 0)
	{
		log10++;
	}

	return ret + b * log10;
}

void solve()
{
	cin >> a >> b >> x;

	ll le = 0, re = x / a;
	while(re - le > 1)
	{
		ll mid = (le + re) / 2;
		if ( x < calc(mid) ) re = mid;
		else le = mid;
	}

	cout << min(le, 1000000000LL);
}
```

二分探索です。`O(log2(x/a))`っぽいです。
自力で実装したのは初めてです。出てよかった。
答えが`10^9`を越えた時の処理を忘れないようにしましょう。

以上です。ありがとうございました。
MATLABのfevalをpythonで使いたい

#pythonの関数の定義

MATLABでは関数の中で使用したい関数をまとめて末尾にまとめて置けばよあったのだが，pythonでは関数の中の関数を使用する前に定義しておく必要がある．

MATLABのfeval (ハンドル関数?) みたいなものを使いたくてpython用に書き換えた．
なんとなく見た目は汚いが，同じ変数を異なる関数に繰り返し入れたい時に便利だと思う．


```python:test_function.py
fx=0
fp=10000
fL=10
fW=60
fq=20
fdip=5
fnu=0.25

def chinnery(fu,x,p,L,W,q,dip,nu):
        
    def feval(funcName, *args):
        return eval(funcName)(*args)

    u=feval(fu, fx, fp, fq, fdip, fnu)\
        - feval(fu, fx, fp-fL, fq, fdip, fnu)\
            - feval(fu, fx, fp, fq-fW, fdip, fnu)\
                + feval(fu, fx, fp-fL, fq-fW, fdip, fnu)
    return u            

          
def myfunc(a,b,c,d,e):
    dp=a+b*c+d-e
    return dp
    
def myfunc2(a,b,c,d,e):
    dp3=a*b-c*d-e 
    return dp3
    
up=chinnery('myfunc', fx, fp, fL, fW, fq, fdip, fnu)

print(up)
#output: 600.0

```


関数chinneryの第1変数（関数内関数?の名前）を変えるだけで，いくつかの変数の組み合わせをそのままに，関数だけ変えることができる．
現在ではmyfunc, myfunc2のみだが，いくらでも増やせる．

```python

 def feval(funcName, *args):
        return eval(funcName)(*args)
```
fevalでは第1変数に関数名をとって，第2変数以降の変数の数が可変である．

もしかしたらもっと便利な方法があるかもしれません．
パラメータと引数の見分け方

覚えやすい方法を見かけたのでメモ

### 手短に言うと
実際の値を渡すのがargument(引数)
プレースホルダーとして名前自体に意味がないのがパラメータ

### 英語で覚えます。
パラメータ...英語でそのままparameters
引数...arguments

### パラメータ parameter
ParameterはPlaceholderのPと覚える。
place holderなので場所を確保しているだけなので、名前は何でも良い。

```js:
function sum(first,second) {
  return first + second;
}
```

### 引数 arguments
呼び出し時に渡す値。
Actual Values(実際の値)のAから始まるargumentsと覚える。
実際の値なので実際に渡したい値そのものが入ります。

```js:
sum(2,4);
```
### 参照
place holder, actual valueという覚え方はwes bosのJavascriptコースで知りました。
その他の説明もめちゃめちゃわかりやすいです。
https://beginnerjavascript.com/
AtCoder Beginner Contest 170 D - Not Divisible (ABC170D)をpythonで解く（エラトステネスの篩）

こんにちは。コンテスト中には計算量が$O(N^2)$となる解法しか思いつかずTLEしました。(表現を訂正しました。)まだ基本アルゴリズムも覚えていないのでちゃんと使いこなせるようにしたいところです。この問題はエラトステネスの篩と同じ原理を使うとかなり計算量が節約できるようです。

```code.py
N = int(input())
A = list(map(int, input().split()))
A.sort()                  #エラトステネスの篩にかけるためソート
Amax = A[-1]
dp = [1]*(Amax+1)         #Aの最大値までのエラトステネスの篩を作る。
ans = 0
for i in range(len(A)-1):
  p = A[i]
  if dp[p] == 1:          #A[i]がA[j]の倍数でないかをエラトステネスの篩でチェック
    for q in range(Amax//p+1):
      dp[p*q] = 0         #A[i]の倍数をすべて0にする
    if A[i] != A[i+1]: 
      ans += 1            #A[i]が重複していなければカウント
if dp[Amax] == 1:         #重複チェック時にレンジオーバーするためAmaxだけ別で判定 
  ans += 1
print(ans)
```

dpは初期状態では
dp = [1 1 1 1 1 1 1 ...] となっています。

たとえば、
A[0]=3なら、一回操作後のdpは
dp = [0 1 1 0 1 1 0 ...] となります。
LaravelでのUnitテストでコンソールにログを出す

- Windows 10
- PHP 7.4.5
- Laravel Framework 7.9.2

Unitテストの設定はこちらを参照：[LaravelでのUnitテストざっくり入門]
(https://qiita.com/nozaki-sankosc/items/4f20a4a30e6b730ec211)

ここでは、Unitテスト実行時の設定を`.env.testing`で設定するようにしている。
そうでない場合は、`.env`で設定する。

## logging.phpに標準出力用の設定を追加
標準エラー出力用の設定は最初からあるので、それを使う場合は追加しなくてもいいかも。

```php:config/logging.php
        'stdout' => [
            'driver' => 'monolog',
            'handler' => StreamHandler::class,
            'formatter' => env('LOG_STDOUT_FORMATTER'),
            'with' => [
                'stream' => 'php://stdout',
            ],
        ],
```
## .env.testingで指定
```php:.env.testing
LOG_CHANNEL=stdout
```

## テストケースにてログ出力

```php:テストケース
\Log::debug("test log");
```

テストケースが、**`Tests\TestCase`**を継承している必要がある
Flutter入門[1]: Flutterの概要

# 前提情報
これからFlutterについて入門していって、ブログではそれを自分なりにまとめていきます

今回初めて触りますが、個人的にはAndroidの開発を趣味でやったことがあるレベルです
読んでいって何か気になるところがありましたら是非コメント下さい！

開発環境についてですが、毎回書いていくのも冗長なのでここに書いて今後はリンクで済ませようかと思います。

- OS: macOS Catalina 10.15.4
- PC: MacBook Air(13-inch, 2020)
- RAM: 16GB
- IDE: VSCode1.45.1(←あんまり触ったことないので、これを期に)

# 概要
## 1. 歴史
今回は技術的なことよりも、周辺とか歴史とかについて調べた結果をまとめていきます。

初版の公開日についてちょっと比較してみます。

| 技術 | 初版 or 登場時期 |
|:---------|:----------|
| Flutter | 2017/05/11 |
| ReactNative | 2015/03/26 |
| Docker | 2013/03/13 |
| Elm | 2012 |
| Rust | 2010/07/07 |
| Go | 2009/11/10 |
| Python | 1991 |
[Wikipedia](https://ja.wikipedia.org/wiki/Flutter)より

こう見るとやっぱりかなり新しめではありますね。(Python様は流石に古い)

## 2. アーキテクチャ
>Flutterのエンジンは主にC++で書かれており、GoogleのSkiaを使用した低レベルのレンダリングをサポートしている。
>基本ライブラリはDartで書かれており、エンジンと通信を行うためのAPIなど、Flutterを利用してアプリケーションを構築するために必要な基本的なクラスと関数を提供している
[Wikipedia](https://ja.wikipedia.org/wiki/Flutter)より
※Skia: Googleの2次元コンピュータグラフィックライブラリ

## 3. 学習難易度

Flutterで調べると日本語でも結構ブログとかヒットするし、学習はし易いかもしれませんね。
以前は、新しい技術を選定する際にはいつもブログをみていたんですが、最近はYoutubeを探すことが増えました。
実際に開発している人のちょっとした知見とかが得られるのは大きいと思います。
Youtubeだと[Flutter大学](https://www.youtube.com/channel/UCReuARgZI-BFjioA8KBpjsw)なるものがあって、良さそう。

ただ、今回のブログでは私が仕事で技術選定をする際の手順に従って学習を進めていきたいため、[公式のチュートリアル](https://flutter.dev/docs)から進めていきます。
都度都度、他のソースから得た情報も載せていきたいと思ってます。

## 4. 案件数
某エージェントサイトにおける案件数
(2020/06/15現在、各エージェントにおいて"Flutter"で検索した際に引っかかる募集中の案件数)

|エージェントA|エージェントB|エージェントC|エージェントD|
|:---:|:---:|:---:|:---:|:---:|
|2|2|2|1|

少ないですね。
因みに"Vue"についても同様に検索して見たところ

|エージェントA|エージェントB|エージェントC|エージェントD|
|:---:|:---:|:---:|:---:|:---:|
|18|18|39|13|

単純に9倍以上の差がありますね。
Vueに関して妙に件数が多いところが1つありましたが、パッと見は同じ案件が重複してるようにも見えませんでした。
時期にもよるのかもしれませんが、案件探す際にはエージェントを複数見た方がいいのかもしれませんね。

# まとめ
個人的には思ってたよりも新しい技術ですが、学習難易度はそんなに高くなさそうに見えました。
初めて開発する言語に良いかどうかの判断はまだつきませんね。
案件数に関しては今後伸びていってくれることを期待したいです。

では、この辺で。
javascript超入門(2020/06/15)

###条件分岐（else if）
if文の条件式がfalseになるとelse以降が実行される。else後ろにまた別のif文を繋げることができる。

```javascript:sample.js
if(answer=== 'yes'){
　　処理１
} else if(answer==='no'){
　　処理２
} else {
　　処理３
}
```


###文字列を整列に変換する
```javascript:sample.js
parseInt(変換したい文字列);
```
プロンプトに入力されたテキストはそれが仮に「3」であっても数値ではなく文字として認識される。parseIntメソッドを使えばプロンプトの入力内容を整数に変換できる。

###比較演算子
| 演算子     |       意味 |        
|:-----------------|------------------:|
| a === b           |     aとbが同じときtrue   |     
| a !== b           |  aとbが同じでないときtrue|     
| a < b             |             aがbより小さいときtrue |      
| a <= b            |          aがb以下のときtrue |      
| a > b             |   aがbより大きいときtrue |      
| a >= b            |   aがb以上のときtrue | 



###論理演算子
| 演算子             |  意味                          |        
|:-------------------|-------------------------------:|
| 条件式a && 条件式b  | aとbが両方trueのとき、全体の評価結果がtrue   |     
| 条件式a ll 条件式b  | aかbの少なくともどちらか1つがtrueのとき、全体の評価結果がtrue|     
|   ! 条件式a                 |aがtrueでないとき、評価結果がtrue |  


###while文
```javascript:sample.js
while(条件式){
　　//条件式がtrueのときここが繰り返し実行される
}
```

同じような処理を実行するのが繰り返し。while文は()内の条件式がtrueである限り、{}内の処理を繰り返し実行する。


###文字列連結
| プログラム                       | 　+の機能          |   結果     |     
|:--------------------------------|------------------:|------------:|
| console.log(16 + 70);           | 足し算            |      86     |
| console.log(name + 'さん');     | 文字列連結         |   田中さん  | 
| console.log((16 + 70) + '個');  |足し算、文字列連結 |    86個      |  


###ファンクション
ファンクションとは()内のパラメータを受け取り、何らかの加工をして、その結果を呼び出し元に返すもの。

パラメータを受け取り→何らかの加工をして→結果を呼び出し元に返す

###ファンクションの呼び出し
```javascript:sample.js
ファンクション名（要求されたパラメータ）

例：total(8000)
```
　　


###ファンクションの作成
```javascript:sample.js
function　ファンクション名(要求するパラメータ)｛
　　 具体的な処理内容
｝
```
Djangoの管理画面でautocomplete機能を実装する

Djangoの管理画面で1対多や多対多などのモデルを構築すると、デフォルトではプルダウン形式で表示されます。
少なければ問題ないですが、量が増えてくると探すのが面倒に...
<img width="807" alt="pulldown.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95862/a9565f2a-6a3d-be09-ae2c-a390863934ce.png">

こういう場合はautocomplete機能を実装できる[django-autocomplete-light](https://django-autocomplete-light.readthedocs.io/en/master/)をインストールすることが多いようですが、Djangoの公式ドキュメントをよく読んでみたところ、autocompleteを実装できる`autocomplete_fields`が機能として用意されていることがわかりました。

##モデルを用意
今回はDjango3.0.7、Python3.7.2を使用しています。
わかりやすく、犬の名前と犬種を登録する`dog`と`breed`という2つのアプリを作り、それぞれのモデルを用意します。

```
$ python manage.py startapp dog
$ python manage.py startapp breed
```
```dog/models.py
from django.db import models

from breed.models import Breed


class Dog(models.Model):
    name = models.CharField("Name", max_length=255, default="", blank=True)
    breed = models.ForeignKey(Breed, on_delete=models.CASCADE)

    def __str__(self):
        return self.name

```
```breed/models.py
from django.db import models


class Breed(models.Model):
    name = models.CharField("BreedName", max_length=255, default="", blank=True)

    def __str__(self):
        return self.name
```
これでbreedをいくつか登録し、dogを登録しようとすると、最初の画像のように大量のプルダウンが表示されます。

##autocompleteを実装
autocompleteを実装するために、それぞれのadmin.pyを編集します。

```breed/admin.py
from django.contrib import admin

from .models import Breed


@admin.register(Breed)
class BreedAdmin(admin.ModelAdmin):
    search_fields = ('name',)
```
`search_fiedls`に検索対象にしたいフィールド名を入れます。今回は1つしかないためnameを入れました。

```dog/admin.py
from django.contrib import admin

from .models import Dog


@admin.register(Dog)
class DogAdmin(admin.ModelAdmin):
    autocomplete_fields = ('breed',)
```
dogの方では、autocompleteを実装したいフィールドを`autocomplete_fields`で指定します。
これだけです！めちゃくちゃ簡単。

管理画面を確認してみると
<img width="814" alt="autocomplete.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95862/f38adfae-d2eb-d558-fb4f-294c1a6bb7ab.png">
入力欄が用意されて、しっかりとフィルタリングができるようになりました。

ちなみに今回はForeignKeyを指定しましたが、ManyToManyFieldでも問題ありません。

```dog/models.py
from django.db import models

from breed.models import Breed


class Dog(models.Model):
    name = models.CharField("Name", max_length=255, default="", blank=True)
    breed = models.ManyToManyField(Breed)

    def __str__(self):
        return self.name

```
<img width="813" alt="autocomplete2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95862/99bfea75-a41c-ad99-a6a3-692b179845e8.png">

##参考情報
[Djangoドキュメント - ModelAdmin.autocomplete_fields](https://docs.djangoproject.com/en/3.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin.autocomplete_fields)
Rails gem 'geocoder'を使って入力した住所をGoogleMapに表示させる

###「東京都千代田区」のような住所であれば緯度経度を取得してGoogleMapに表示されるが、「東京都千代田区丸の内2-4-1」のように番地まで指定すると、緯度経度を取得できずにマップが表示されなかったが解決できたので投稿。

##前準備
・googlemapを使用するためにまずはAPIを取得する。APIの取得はこちらを(https://qiita.com/nagaseToya/items/e49977efb686ed05eadb)

・住所を保存するカラム、緯度経度を保存するカラムを作成。
latitude・longitudeが緯度経度。

```schema.rb
create_table "tours", force: :cascade do |t|
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.string "address", null: false
    t.float "latitude"
    t.float "longitude"
  end
```




##登場するファイル
・Gemfile
・tour.rb
・.gitignore
・.env
・geocorder.rb
・show.html.erb



###Gemfile
geocorderを`bundle install`

```Gemfile
gem 'geocoder'
```


###tour.rb
以下を書き加える

```tour.rb
geocoded_by :address
after_validation :geocode, if: :address_changed?
```
geocoded_byが入力した住所から緯度経度を保存。
after_validation :geocodeは後に住所変更があっても、変更後の緯度経度を保存してくれる。



###.gitignore ・ .env
.envを.gitignoreに追加。これでgithub上に上がらない。

```.gitignore
/.env
```
.envに以下を書き足す。YOUR_API_KEYの部分を取得したAPIキーにする。

```.env
GOOGLEMAP=YOUR_API_KEY
```


###geocorder.rb
`rails g geocoder:config`でconfig/initialize/geocorder.rbを作成し、以下を書き足す。
api_keyの部分に取得したAPIが入る。

```geocorder.rb
Geocoder.configure(
  lookup: :google,
  always_raise: [
    Geocoder::OverQueryLimitError,
    Geocoder::RequestDenied,
    Geocoder::InvalidRequest,
    Geocoder::InvalidApiKey
  ],
  api_key:  ENV['GOOGLEMAP'] ,
  use_https: true
)
```


###show.html.erb
最後にshow.html.erbにgooglemapを貼り付け

```show.html.erb
<div id="map"></div>
<style>
     #map {
     height: 500px;
     width: 70%;
    }
</style>
<script>
  function initMap() {
	var uluru = {lat: <%= tour.latitude %>, lng: <%= tour.longitude %>};
	var map = new google.maps.Map(document.getElementById('map'), {
	zoom: 16,
	enter: uluru
	});
	var marker = new google.maps.Marker({
	  position: uluru,
	  map: map
	});
       }
	</script>
	<script src="https://maps.googleapis.com/maps/api/js?key=<%= ENV['GOOGLEMAP'] %>&callback=initMap"async defer></script>
```

あとは大きさの好みによって、heightやwidthを調整すればいい。
AdMobをiOSに組み込んでみよう（Video広告編）

AdMobをiosに組み込んでみようという事で覚書

「AdMobをiOSに組み込んでみよう（環境設定編）」の続きです。
https://qiita.com/sanoh/items/2c99918fe7c9ba01821c

■Setp1.画面のレイアウトを設定しよう
---
・ストーリーボードを立ち上ボタンを作成しよう（Layoutの仕方は省きます）
![image0303.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122121/6956f5d9-1aba-37c9-f58b-1714ab45f9f3.png)
■Step2.ボタンをソースに追加
---
Buttonを右クリックで「ViewController.m」の@endの上にドロップします。
![image0304.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122121/08d4394c-0c2f-4f70-1e30-80de7e505127.png)
名前を聞いてくるので今回は「doSomethig」として「Connect」を選択します。
![image0305.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122121/54c6dbd0-4061-653d-cb06-0ded0fc5562d.png)
すると以下のような状態になります
![image0306.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122121/01e27bb3-56f7-9006-1394-7e78fbfa845d.png)
■Step3.プログラム
---
ViewController.mを編集します

```objective_c:
#import "ViewController.h"
@import GoogleMobileAds;

@interface ViewController ()<GADRewardedAdDelegate>
@property(nonatomic, strong) GADRewardedAd *rewardedAd;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    self.rewardedAd = [self createAndLoadRewardedAd];
}
//
- (GADRewardedAd *)createAndLoadRewardedAd {
  GADRewardedAd *rewardedAd = [[GADRewardedAd alloc]
      initWithAdUnitID:@"ca-app-pub-3940256099942544/1712485313"];
  GADRequest *request = [GADRequest request];
  [rewardedAd loadRequest:request completionHandler:^(GADRequestError * _Nullable error) {
    if (error) {
      // Handle ad failed to load case.
    } else {
      // Ad successfully loaded.
    }
  }];
  return rewardedAd;
}
//  見終わった
- (void)rewardedAd:(GADRewardedAd *)rewardedAd userDidEarnReward:(GADAdReward *)reward {
}
//  始まった
- (void)rewardedAdDidPresent:(GADRewardedAd *)rewardedAd {
}
//  失敗
- (void)rewardedAd:(GADRewardedAd *)rewardedAd didFailToPresentWithError:(NSError *)error {
}
// 終了後再読み込み
- (void)rewardedAdDidDismiss:(GADRewardedAd *)rewardedAd {
  self.rewardedAd = [self createAndLoadRewardedAd];
}
// ボタンが押された
- (IBAction)doSomething:(id)sender {
    if (self.rewardedAd.isReady) {
      [self.rewardedAd presentFromRootViewController:self delegate:self];
    }
}

@end
```
![image0307.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122121/3a0081f9-053d-1eac-0006-1d978b29f7e6.png)
■Step4.実行
---
実行すると
![image0308.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122121/a8df7b51-32d5-f140-8cdd-4392054061f2.png)
ボタンを押すと広告が現れます
![image0309.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122121/eb28e928-3c5b-1bbd-8da9-45de6472a401.png)
スクリーンリーダーを使ってのVisual Studio CodeおよびAndroid StudioでのAndroidアプリ開発_Flutter編

コマンドとメモ帳でも開発はできますが、コードエディタを使うほうが何かと便利です。
[NVDA](https://www.nvda.jp/) でも表題のエディタが使用できるので、私のメモを兼ねて投稿します。
 ----

## 準備
それぞれ下記を参考に設定をします。
[WindowsでFlutter入門(開発環境構築～デバッグ実行まで) │ Web備忘録](https://webbibouroku.com/Blog/Article/flutter-win)
[Visual Studio Codeで日本語化する方法[Windows] - Qiita](https://qiita.com/nanamesincos/items/5c48ff88a4eeef0a8631)
Visual Studio Codeで拡張機能を検索するときには
コントロール+シフト+X
からすることができます。
開発に必要な拡張機能とバージョンは以下の通りです。
私が確認したところ、この組み合わせでないと通知の読み上げなどが安定して行われません。
Flutter 2.21.0
Dart 3.1.0
【追記】
Flutter 1.23.0-18.1.pre • channel beta
Flutter 3.16.0
Dart 3.16.0
でも問題なく読み上げがされていることを確認しました。


## Visual Studio Code について
ファイルを編集して保存をするだけでホットリロードされます。
パッケージのインストールもコマンドなしでファイルに書き込んで保存でOKです。

### 基本的なコマンド
作業に役立つコマンドを紹介します。
<ul>
<li>デバッグの開始　→　コントロール+F5</li>
<li>デバッグの再起動　→　コントロール+シフト+F5</li>
<li>デバッグの停止　→　シフト+F5</li>
<li>行を上または下に移動　→　オルト+上カーソルまたはオルト+下カーソル</li>
</ul>

### コマンド変更のすすめ
メニューには表示されない便利なコマンドが多くあります。
オルトメニューから
ファイル　↓　ユーザー設定　→　キーボードショートカット
より確認とコマンドの変更ができます。
作業に合わせてカスタマイズをするのがおすすめです。
コマンドを選びアプリケイションキーから
キーバインドの変更
をエンターし、
希望のコマンドを入力して
エンターで変更できます。
私が変更した物を紹介します。
<ul>
<li>行削除　→　シフト+デリート</li>
<li>上または下に行の挿入　→　シフト+エンター・コントロール+エンター</li>
<li>カーソルの左または右を行削除　→　コントロール+デリートまたはオルト+デリート</li>
<li>次または前の問題個所に移動　→　コントロール+F1またはコントロール+シフト+F1</li>
</ul>


## Android Studioについて
以前はスクリーンリーダーでインストール直後の操作ができませんでしたが、ver3.5になってからは使用可能になりました。
ただ、動作が重い点と、画面間の移動が不便なため、開発はVisual Studio Codeですることをおすすめします。
ただプロジェクトの作成とパッケージ名の設定が容易なため、スタートはこちらで行うとよいです。
またメニューはオルトではなくF10で開く点に注意です。
そもそもプレイストアでアプリを公開する予定でなければ不要です。
スクリーンリーダーを使ってのAndroidアプリ開発_Flutter編

これまで何度かトライしてきたスクリーンリーダーを使ってのAndroidアプリ開発。
2018年春にGoogleが第3の開発言語としてDartを加えました。
余り期待はしていませんでしたが、興味はあったので環境を整え、HelloWorldまで触ってみました。
今回も使用したスクリーンリーダーは [NVDA](https://www.nvda.jp/) です。
 -----

## 必要な物
jdk
android sdk
flutter
を準備します。
Android SDKは API29が必要でした。
flutter以外の準備は [スクリーンリーダーを使ってのAndroidアプリ開発_Monaca編](https://qiita.com/yama_1983/items/0cbfd73a9912009288f6) をご覧ください。
必須ではありませんが、Android Studio と Visual Studio Code があると、作業効率が上がります。


## Flutterのインストール
[Flutter SDK releases - Flutter[(https://flutter.dev/docs/development/tools/sdk/releases) からSDKをダウンロードして適当なフォルダに解答します。
いくつかのチャンネルがありますが、2020年6月15日現在betaを推奨します。
詳しくは後述します。
解凍後pathも通しておきます。
C:\Android
の場合は
C:\Android\flutter\bin
と設定します。


## 環境のチェック
$ flutter doctor
コマンドで確認ができます。
私の端末では下記のように表示されます。
### 実行結果
Doctor summary (to see all details, run flutter doctor -v):
[√] Flutter (Channel beta, 1.18.0-11.1.pre, on Microsoft Windows [Version 10.0.19041.329], locale ja-JP)
[!] Android toolchain - develop for Android devices (Android SDK version 29.0.2)
    ! Some Android licenses not accepted.  To resolve this, run: flutter doctor --android-licenses
[√] Android Studio (version 3.5)
[√] VS Code (version 1.46.0)
[√] Connected device (1 available)

! Doctor found issues in 1 category.


1項目
    !Some Android licenses not accepted.  To resolve this, run: flutter doctor --android-licenses
となっていますが、お試しをする分には問題ありません。


## プロジェクトの作成
プロジェクトを作成するディレクトリに移動し
$ flutter create [プロジェクト名]
を実行します。

## プロジェクトの実行
$ flutter run
で実行します。
てっきりお馴染みの
Hello World
とだけ表示されるアプリができるのかと思いきや、ボタンを押すと値が増えるアプリが表れて少々驚きました。


## 変更が即座に反映
Flutterの目玉機能がホットリロードです。
コードを変更後、 f5 を押すと即座に内容が更新されます。
初めの実行は時間が掛かりますが、ホットリロードはコードの長さにも寄るのかもしれませんが、それ程の時間を要しません。



## 最後に
以前チャレンジしたMonacaと比べるとWiFi経由でのデバッグはできません。
実機をUSBケーブルで接続してのデバッグにはなりますが、コードの変更がホットリロードで即座に反映される点は魅力的です。
出来上がったアプリはウェブベースでなくネイティブアプリなので、動きに違和感が感じられませんでした。
ただし、Flutterがbetaでないと
TalkBackを有効にした場合に、画面下部に触れるとアプリが落ちる問題があります。
試してはいませんが、同じコードでiOSアプリも作成できます。
ただコマンドから実行する場合はMacが必要です。
Android StudioではWindowsでも実機での実行ができるようです。
Processingで三密もじぴったん作ってみた。

今回は、大学の授業でProcessingで自由にプログラムを作ってきて発表するという課題があったのでその際に作ったものです。githubで公開しているので、記事の最後のURLから遊んでみてください！

<img width="902" alt="スクリーンショット 2020-06-15 15.55.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418833/c019a2c9-1b5b-d0dd-b06a-fcab11a333b5.png">
<img width="899" alt="スクリーンショット 2020-06-15 15.56.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418833/f7df308c-0333-60d5-8604-0dc9d8b1a153.png">



#開発背景
小池百合子都知事（2020年6月15日現在）の素材を使ったフリーゲームが話題になりました。

@motulo 
<img width="604" alt="スクリーンショット 2020-06-15 16.15.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418833/d59acc8b-3259-bca6-a642-3c66af1a09ae.png">


@dice_maru
<img width="600" alt="スクリーンショット 2020-06-15 16.18.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418833/d222be04-05f5-aad0-c381-68b34b33af34.png">

乗るしかない、このビッグウェーブに...！！と思い至り、勢いとノリで都知事マシマシのフリーゲームを作りました。

#開発環境
Processing3.5.3

#ゲームについて
・対戦型ゲームです。
・交互に４種類の文字（密・集・接・閉）を出します。
・密接・密集・密閉」の3種類の文字を作ると、相手の文字を自分のものにできます。
・先に自分の文字を１９個集めた方の勝ちです。
・しゃべります。

#まとめ
<img width="902" alt="スクリーンショット 2020-06-15 15.55.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418833/c019a2c9-1b5b-d0dd-b06a-fcab11a333b5.png">
個人的に、とても満足した出来になりました。
ぜひ、下記URLから遊んでみてください！！
https://github.com/matsuyan/mitsudesu...
[https://github.com/matsuyan/mitsudesu...](https://github.com/matsuyan/mitsudesu...)

#追記
音楽を再生するために、minimライブラリをprocesssingにインポートする必要があります。
ご注意ください。
GitlabをJenkinsのOpenAPI Provider として使う

## GitlabにはOpenAPI Provider としての機能がある
実はあまり知られていないことだと思うのですが、GitlabにはOpenAPI Providerとしての機能を持っています（[doorkeeper gem](https://github.com/doorkeeper-gem/doorkeeper) を使っているそうです）

公式にも以下のような記述があり、便利に使えます。

- [GitLab as OpenID Connect identity provider]( https://docs.gitlab.com/ee/integration/openid_connect_provider.html)

使い道はいろいろあるのですが、よく一緒にインストールされがちなJenkinsとの連携ができると、ユーザー管理も統一できて、なかなか良いのではと思います。

しかしながら、公式の情報だけを見ているとURLの設定とかちょっとよく分からないことが多く、Jenkinsと統合させるのはちょいと手間がかかりそうです。

その辺をスムーズにしてくれるのが、以下に紹介する[Gitlab Authentication Plugin](https://plugins.jenkins.io/gitlab-oauth/)です。

## Gitlab Authentication Plugin で楽々導入
導入方法はここで語るまでもない感じですが、以下のような手順になります。

### 1. Gitlab側でアプリケーションの追加を行う
まずはGitlab側、Admin Area > Applications から認証済みアプリケーションの一覧に進むことができます。

そこで"New Application"ボタンをクリックし、アプリケーションを追加します。
必要なscopeは`api` のみでOKです。

Callback URLは `/securityRealm/finishLogin` をJenkinsのURL末尾につけたものになります。

ここで生成されたトークンは再度閲覧できないのでメモっておきましょう。

### 2. Jenkins側でプラグインを導入する
Jenkins側で Gitlab Authentication Plugin を導入します。普通にプラグインマネージャからインストールできるはずです。

インストールが終わると、Jenkinsの管理 > グローバルセキュリティの設定 から `Authentication` の項目を変更し、`Gitlab Authentication Plugin` を選択します。設定項目は以下の通りです。

- Gitlab Web URI: GitlabのトップURL
- Gitlab API URI: Enterprise版以外は同一のURLでOK
- ClientID/ClientSecret: Gitlab側でコピーした値をそのまま利用する。

設定がうまくいくと、JenkinsのトップページからGitlabの画面へとリダイレクトされるようになります。そこでログインするとJenkinsからもGitlabのユーザーでログインした状態になります。Jenkins側からユーザー名とグループは参照可能になっていますので、グループごとのセキュリティの設定などは適宜実行していけるはずです。
AdMobをiOSに組み込んでみよう（全画面広告編）

AdMobをiosに組み込んでみようという事で覚書

「AdMobをiOSに組み込んでみよう（環境設定編）」の続きです。
https://qiita.com/sanoh/items/2c99918fe7c9ba01821c

■Setp1.画面のレイアウトを設定しよう
---
・ストーリーボードを立ち上ボタンを作成しよう（Layoutの仕方は省きます）
![image0203.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122121/37f979cc-19b9-6568-d22a-0bc5ceef8cd9.png)
■Step2.ボタンをソースに追加
---
Buttonを右クリックで「ViewController.m」の@endの上にドロップします。
![image0204.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122121/cf0b10f8-f5c6-6905-3df8-fe024f171d73.png)
名前を聞いてくるので今回は「doSomethig」として「Connect」を選択します。
![image0205.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122121/c4caa1af-2e02-e9b1-ce64-9397d5ef591b.png)
すると以下のような状態になります
![image0206.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122121/40e40fdc-c949-26d6-ec8f-dbbceaf6a91b.png)
■Step3.プログラム
---
ViewController.mを編集します

```objective_c:
#import "ViewController.h"
@import GoogleMobileAds;

@interface ViewController () <GADInterstitialDelegate>
@property(nonatomic, strong) GADInterstitial *interstitial;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    self.interstitial = [self createAndLoadInterstitial];
}
//  広告の読み込み設定
- (GADInterstitial *)createAndLoadInterstitial {
  GADInterstitial *interstitial =
      [[GADInterstitial alloc] initWithAdUnitID:@"ca-app-pub-3940256099942544/4411468910"];
  interstitial.delegate = self;
  [interstitial loadRequest:[GADRequest request]];
  return interstitial;
}
/// 広告を閉じるときに呼ばれる
- (void)interstitialDidDismissScreen:(GADInterstitial *)ad {
  self.interstitial = [self createAndLoadInterstitial];
  NSLog(@"interstitialDidDismissScreen");
}
//  ボタンが押されたよ
- (IBAction)doSomething:(id)sender {
    if (self.interstitial.isReady) {
      [self.interstitial presentFromRootViewController:self];
    }
}

@end
```
![image0207.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122121/7eaa46c6-5f3b-f4c1-b1c8-90dbfdba700e.png)
■Step4.実行
---
実行すると
![image0208.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122121/d8ad9460-f3af-bcbd-47cb-d3530b9d2168.png)
ボタンを押すと広告が現れます
![image0209.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122121/af295070-6de3-ef04-a596-fe76c35dd7f6.png)
VirtualBox＋VagrantでLaravel開発環境を構築その参

環境を作る度に色んなサイト見て調べてって・・・大変なので、コピペできるように纏めて、更にミドルウェアを入れ替えました。
更に、Nginxのバーチャルホストを設定したくなりました。

# マシンスペック
* Mac mini 2018
* macOS Catalina（10.15.x）
* Intel Core-i7 3.2GHz 6コア
* メモリ 32GB
* SSD 512GB

# VM環境
* CentOS 7.x
* Nginx 1.x
* PHP（PHP-FPM）7.1.x
* MySQL5.7.x
* Laravel5.x
* IPアドレス
 * 192.168.56.104
* ユーザー/パスワード
 * root/vagrant
 * vagrant/vagrant
* VM名
 * CentOS7

# やること
* Nginxのバーチャルホスト設定

# 前提
まずは下記従って環境構築する
[VirtualBox＋VagrantでLaravel開発環境を構築その弐](https://qiita.com/_bobtabo_/items/40f4e1625e34980df37a)

# バーチャルホスト用のLaravel環境を用意
```
$ cd ~
$ ls
laravel5
$ cp -R laravel5 laravel5_2
$ ls
laravel5  laravel5_2

$ cd laravel5_2
$ chmod -R 777 storage
$ chmod -R 777 bootstrap/cache
$ chmod 755 bin/clear-laravel.sh

★コピー先のWelcomeページを編集する
$ vi resources/views/welcome.blade.php
★下記を点線内に編集
<div class="content">
    <div class="title m-b-md">
        Laravel
    </div>
↓
---
<div class="content">
    <div class="title m-b-md">
        Laravel5_2
    </div>
---
:wq

$ bin/clear-laravel.sh
```

# Nginxのバーチャルホスト設定
```
$ cd /etc/nginx/conf.d
$ sudo mv default.conf default1.conf
$ sudo cp default1.conf default2.conf
$ ls
default.conf.org  default1.conf  default2.conf
$ sudo vi default2.conf
★laravel5をlaravel5_2に置換
:%s/laravel5/laravel5_2/g
:wq

$ cd /etc/nginx
$ sudo cp -p nginx.conf nginx.conf.old
$ vi nginx.conf
★このままでも良いし
include /etc/nginx/conf.d/*.conf;
★変更しても良い
include /etc/nginx/conf.d/default*.conf;
:wq

$ sudo systemctl restart php-fpm
$ sudo systemctl restart nginx
```
※参考
https://qiita.com/curacao/items/c85cf04c7236e4959e43

### 動作確認（Macのhosts編集）
```
sudo vi /private/etc/hosts
★下記を点線内を追記
---
192.168.56.104 laravel5_2.local
---
:wq
```
ブラウザで確認
http://laravel5.local/
http://laravel5_2.local/
「ゼロから作る Deep Learning」 を読んだ学習記録

# 「ゼロから作る Deep Learning」 を読んだ学習記録

とりあえず、クローンしてゴニョゴニョした。
それぞれの章に Markdown で書いたのでリンクを参照のため張っておく。

* [[github] note-nota/deep-learning-from-scratch](https://github.com/note-nota/deep-learning-from-scratch)

## ch01

## ch02

## ch03

## ch04
* [[github] ch04/study_note.md](https://github.com/note-nota/deep-learning-from-scratch/blob/master/ch04/study_note.md)

## ch05
* [[github] ch05/study_note.md](https://github.com/note-nota/deep-learning-from-scratch/blob/master/ch05/study_note.md)

## ch06
* [[github] ch06/study_note.md](https://github.com/note-nota/deep-learning-from-scratch/blob/master/ch06/study_note.md)

## ch07
* [[github] ch07/study_note.md](https://github.com/note-nota/deep-learning-from-scratch/blob/master/ch07/study_note.md)

## ch08
* [[github] ch08/study_note.md](https://github.com/note-nota/deep-learning-from-scratch/blob/master/ch08/study_note.md)
Azure CLI チートシート

## はじめに

自分用のAzure CLIチートシートです。随時更新します。

Git Bashで動作確認をしています。

Azure CLIのバージョンは下記の通りです。

```bash
az --version
azure-cli                          2.7.0

command-modules-nspkg              2.0.3
core                               2.7.0
nspkg                              3.0.4
telemetry                          1.0.4
```

## Azureへサインイン

```bash
az login
```

ブラウザが起動して認証画面に遷移する。

## サブスクリプション切り替え

切り替え可能なサブスクリプションを表示する。

```bash
az account list \
  --query "[?state=='Enabled'].{Name:name, User:user.name, Default:isDefault}" \
  --output table
```

切り替えたいサブスクリプションを変数セットする。

```bash
subscriptionName=<Name>
```

既定サブスクリプションを切り替える。

```bash
az account set --subscription $subscriptionName --output table
```

既定サブスクリプションを表示する。

```bash
az account show --output table --query "{Name:name, User:user.name}"
```

## 既定リージョン設定

利用可能リージョンを表示する。

```bash
az account list-locations \
  --query "[].{Name: name, DisplayName: displayName}" \
  --output table
```

切り替えたいリージョンを変数セットする。

```bash
locationName=<Name>
```

既定のリージョンを設定する。

```bash
az configure --defaults location=$locationName
```

既定のリージョンを表示する。

```bash
az configure --list-default \
  --query "[?name=='location'].{DefaultLocation:value}" \
  --output table
```

## リソースグループ作成

リソースグループ名を変数セットする。

```bash
resourceGroupName=<Name>
```

リソースグループを作成する

```bash
az group create --name $resourceGroupName \
  --query "{Name:name, Location:location, State:properties.provisioningState}" \
  --output table
```

## リソースグループ削除

既定サブスクリプション内のリソースグループを表示する。

```bash
az group list \
  --subscription `az account list --query "[?isDefault].name" --output tsv` \
  --query "[].{Name:name, Location:location}" \
  --output table
```

削除したいリソースグループ名を配列変数にセットする。

```bash
arrayResourceGroupName=("Name1" "Name2" "Name3" ..)
```

リソースグループを削除する。

```bash
for i in "${arrayResourceGroupName[@]}"
do
  az group delete --name $i --no-wait --yes
done
```





## Tips

### --outputの引数

| --output | 説明                                              |
| :------- | :------------------------------------------------ |
| `json`   | JSON 文字列。 既定値                              |
| `jsonc`  | 色付けされた JSON                                 |
| `yaml`   | YAML                                              |
| `table`  | 列見出しとしてキーが使用されている ASCII テーブル |
| `tsv`    | タブ区切りの値 (キーなし)                         |
| `none`   | エラーと警告以外は出力されない                    |

### --queryの使い方

- 最上位キーからプロパティにアクセスする。
- 子キーは**.（ドット）**の後に指定する。
- 複数のプロパティの配列形式の取得は**[key1, key2, key3]**の様に指定する。
- 複数のプロパティの辞書形式の取得は**{Name1:key1, Name2:key2.key21, Name3:key3[0].key31}**の様に指定する。

## 参考文献

[複数の Azure サブスクリプションの使用](https://docs.microsoft.com/ja-jp/cli/azure/manage-azure-subscriptions-azure-cli?view=azure-cli-latest)

[Azure CLI コマンドの出力のクエリ](https://docs.microsoft.com/ja-jp/cli/azure/query-azure-cli?view=azure-cli-latest)
MySQL5.7のインストール

これがめちゃくちゃ参考になった。
https://weblabo.oscasierra.net/mysql-57-homebrew-install/

```
asatokensei@MacBook-Air memopy % brew install mysql@5.7
Updating Homebrew...
==> Auto-updated Homebrew!
Updated 1 tap (homebrew/core).
==> Updated Formulae
benthos        broot          clojure        exploitdb      freetds        inxi           jc             mutt           phpstan        terragrunt     wtf            yq

==> Downloading https://homebrew.bintray.com/bottles/mysql%405.7-5.7.29.catalina.bottle.tar.gz
==> Downloading from https://akamai.bintray.com/bf/bf0cdc294df996455c8abad3e03b6691f2145a4036085ad2570ec6c993e6b9c0?__gda__=exp=1592203912~hmac=7b0c7f804ecbf5c35cb08f36b76cf74de21f31f
######################################################################## 100.0%
==> Pouring mysql@5.7-5.7.29.catalina.bottle.tar.gz
==> Caveats
We've installed your MySQL database without a root password. To secure it run:
    mysql_secure_installation

MySQL is configured to only allow connections from localhost by default

To connect run:
    mysql -uroot

mysql@5.7 is keg-only, which means it was not symlinked into /usr/local,
because this is an alternate version of another formula.

If you need to have mysql@5.7 first in your PATH run:
  echo 'export PATH="/usr/local/opt/mysql@5.7/bin:$PATH"' >> ~/.zshrc

For compilers to find mysql@5.7 you may need to set:
  export LDFLAGS="-L/usr/local/opt/mysql@5.7/lib"
  export CPPFLAGS="-I/usr/local/opt/mysql@5.7/include"

For pkg-config to find mysql@5.7 you may need to set:
  export PKG_CONFIG_PATH="/usr/local/opt/mysql@5.7/lib/pkgconfig"


To have launchd start mysql@5.7 now and restart at login:
  brew services start mysql@5.7
Or, if you don't want/need a background service you can just run:
  /usr/local/opt/mysql@5.7/bin/mysql.server start
==> Summary
🍺  /usr/local/Cellar/mysql@5.7/5.7.29: 319 files, 232.3MB
```

パスを見てみる。↓

```
asatokensei@MacBook-Air memopy % which mysql           
/usr/local/opt/mysql@5.7/bin/mysql
```

パスが合ってなかったらパスを通す。
今回は合ってたのでスルー。
詳しくはこの記事↓
https://weblabo.oscasierra.net/mysql-57-homebrew-install/

バージョン見ると、、、

```
asatokensei@MacBook-Air memopy % mysql --version
mysql  Ver 14.14 Distrib 5.7.29, for osx10.15 (x86_64) using  EditLine wrapper
```

ちゃんとできてる！

# 以下のエラーが出る人へ

```
asatokensei@MacBook-Air memopy % mysql.server start
Starting MySQL
. ERROR! The server quit without updating PID file (/usr/local/var/mysql/MacBook-Air.pid).
```

この記事を↓
https://qiita.com/kenkeeeenbbt/items/bf7045c5ca433a4ac342
AdMobをiOSに組み込んでみよう（バナー広告編）

AdMobをiosに組み込んでみようという事で覚書

「AdMobをiOSに組み込んでみよう（環境設定編）」の続きです。
https://qiita.com/sanoh/items/2c99918fe7c9ba01821c

■Setp1.画面のレイアウトを設定しよう
---
・ストーリーボードを立ち上げよう
「Main.storybord」を選択します。
![Image0101.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122121/4f845b63-75ba-d987-7a40-8d76beb6d6d5.png)
・バナーを表示するViewを登録
「View」の「ShowLibrary」を選択するとライブラリWindが現れますので、その中にある「View」をドラッグ＆ドロップします。
![image0103.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122121/bfda6785-3465-7be4-4b84-65b07ef8fbdc.png)
できたViewのClass名を「GADBannerView」に変更します。
![image0105.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122121/47899711-1bbf-c7d8-aaf1-a928a935c94a.png)
すると「View」が「BannerView」に代わることがわかります。
・「AddNewAlignmentConstraints」の設定
「Horizontally in Container」をOnにしてから「Add 1 Constraint」を選択します。
![image0106.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122121/b59d49f7-1f73-251d-b901-4bd17f9ccb1e.png)
・「Add New Constraints」の設定
下方向に0に設定
Widt、Heightを有効にし320ｘ50を設定します（バナーの大きさによって変わります）
最後に「Add 3 Cpmstraints」を選択
![image0107.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122121/dc46f911-f783-20b3-4004-0307aaf1b81e.png)
・うまくいけばこのように、下にBanner Viewが設定されます。
![image0108.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122121/72abbb54-a666-4347-6cba-fde63d37c7fa.png)

■Stap2.バナービューをソースに追加
---
「Baner View」から右クリックで「ViewComtroller.m」の「@interface ViewController()」の下にドロップします。
![image0109.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122121/06091ee2-4e71-e30c-3da6-841c91e5c463.png)
するとNamaを聞いてくるので、今回は「bannerView」と設定し「Connect」します。
![image0110.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122121/4e61592c-f2cf-e2a4-bb9a-0b814793b3d8.png)
すると、いかのようなエラーのある画面になります。
![image0111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122121/43d2c9d1-125a-3b1e-213b-7ab22f849c1b.png)

■Step3.プログラム
---
最後に「ViewXontroller.m」を改造します。

```objective_c:
@import GoogleMobileAds;
```
と

```objective_c:
self.bannerView.adUnitID = @"ca-app-pub-3940256099942544/2934735716";
self.bannerView.rootViewController = self;
GADRequest *request = [GADRequest request];
[self.bannerView loadRequest:request];
```
を追加します。
![image0112.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122121/3c0a7faa-ce32-6a29-fae0-0e7e44a7b2ab.png)

■Step4.実行
---
実行すると、こんな感じで下にバナーが出ます。
![image0113.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122121/fe8896bf-1045-a4df-7f85-e7509bdb7626.png)
Vim で Git を使う

# Vim で Git を使う

[lambdalisue/gina.vim](https://github.com/lambdalisue/gina.vim) を使っています。

まだまだ試行錯誤中。

## さくっと

- ログ表示: `<Leader>gl`
- バッファでログ表示: `<Leader>gL`
- diff表示: `<Leader>gd`
- ステータス表示: `<Leader>gs`
- ブランチ表示: `<Leader>gbb`
- push (ブランチ名に応じて master を変更): `<Leader>gp`
- 開いているファイル、選択行を Github で開く: `<Leader>oG`
- 差分から検索: `<Leader>gg`

```Vim:vimrc
nnoremap <silent> <Leader>gl :!git gl -100<CR>
nnoremap <silent> <Leader>gL :Gina log --graph -100<CR>
nnoremap <silent> <Leader>gd :!git diff<CR>
nnoremap <silent> <Leader>gs :!git status<CR>
nnoremap <Leader>gbb :call popup_atcursor(systemlist('git branch'), #{ moved: "any", border: [], minwidth: &columns/3, minheight: &lines/4 })<CR>
nnoremap <Leader>gp :!git push origin master
nnoremap <Leader>oG :Gina browse :<CR>
xnoremap <Leader>oG :Gina browse :<CR>
nnoremap <Leader>gg :Gina log -p -G""<Left>
```

## 変更内容を全コミット

- 単純なコメント: `<Leader>gn`
- 詳細なコメント:
  1. `<Leader>gu`
  2. `<Leader>gc`

```Vim:vimrc
nnoremap <Leader>gn :!git commit -a -m ""<Left>
nnoremap <silent> <Leader>gu :silent !git add -u<CR>
nnoremap <silent> <Leader>gc :!git commit -v<CR>
```

## 変更内容の一部をコミット

- 比較的単純な場合
  1. `<Leader>ga`
  2. `<Leader>gc`

```Vim:vimrc
nnoremap <silent> <Leader>ga :call popup_create(term_start(['git', 'add', '-p'], #{ hidden: 1, term_finish: 'close'}), #{ border: [], minwidth: &columns*9/10, minheight: &lines/2 })<CR>
nnoremap <silent> <Leader>gc :!git commit -v<CR>
```

- 比較的複雑な場合
  1. `<Leader>gS`
  2. 対象のファイルで `pp`
  3. 当該コミットに取り込む対象を `dor` で反映、 `dol` で除外
  4. `:w`
  5. `qt`
  6. `cc`
  7. コミットメッセージを書いて `:wq`
  8. 2. からの繰り返し
  9. `:bdeletle` で終わり。

```Vim:vimrc
nnoremap <silent> <Leader>gS :Gina status -s<CR>
call gina#custom#mapping#nmap('status', 'cc', ':<C-u>Gina commit -v --group=status<CR>', {'noremap': 1, 'silent': 1, 'buffer': 1, 'nowait': 1})
nnoremap qt :tabclose<CR>
```

## 直前のコミットを master ブランチにする

1. ブランチ名変更: `<Leader>gbr`
2. 直前のコミットのブランチ名を master へ: `<Leader>g-`

```Vim:vimrc
nnoremap <Leader>gbr :!git branch -m<Space>
nnoremap <Leader>g- :!git switch -c master HEAD~<Left><Left><Left><Left><Left><Left>
```

## 履歴を辿って変更内容を確認

1. リポジトリのファイルを開いて `<Leader>bl`
2. `<CR>`, `<BS>` でコミットを辿って `e`, `s` でコミットメッセージを表示
3. `qt` で終わり。

```Vim:vimrc
nnoremap <silent> <Leader>gbl :Gina blame<CR>
call gina#custom#mapping#nmap('blame', 's', ':<C-u>Gina show<CR>', {'noremap': 1, 'silent': 1, 'buffer': 1, 'nowait': 1})
call gina#custom#mapping#nmap('blame', 'e', '<Plug>(gina-blame-echo)', {'noremap': 0, 'buffer': 1, 'nowait': 1})
nnoremap qt :tabclose<CR>
```
VB6のソースをVisualStudio2019対応にする方法

VB6のソースをVisualStudio2019対応にする方法を以下に書きます

1.VB6ランタイムのインストール
　(1)以下のサイト(Vector)からVB6ランタイムのインストーラ(vb6sp6rt4.exe)をダウンロードします
　　　https://www.vector.co.jp/soft/dl/win95/util/se188840.html

　(2)ダウンロードしたvb6sp6rt4.exeを実行します。
　　 もし実行途中に「エラー 2709 オフライン参加完了情報が見つかりませんでした。」にメッセージが表示された場合には次の対応を行います。

　　　(a)[スタート] ボタンをクリックし、[ファイル名を指定して実行] をクリックします。[名前] ボックスに「regedit」と入力し、[OK] をクリックします。
　　　(b)レジストリで次のサブキーを見つけてクリックします。
　　　　　　HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Installer
　　　(c)[編集] メニューの [新規] をポイントし、[DWORD 値] をクリックします。
　　　(d)DWORD 値の名前として「SecureRepairPolicy」と入力し、Enter キーを押します。
　　　(e)[SecureRepairPolicy] を右クリックし、[修正] をクリックします。
　　　(f)[値のデータ] ボックスに「2」と入力し、[OK] をクリックします。
　　　(g)レジストリで次のサブキーを見つけてクリックします。
　　　　　　HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Installer
　　　(h)[編集] メニューの [新規] をポイントし、[キー] をクリックします。
　　　(i)キーの名前として「SecureRepairWhitelist」と入力し、Enter キーを押します。
　　　(j)[SecureRepairWhitelist] キーをダブルクリックして開きます。
　　　(k)[編集] メニューの [新規] をポイントし、[文字列値] をクリックします
　　　(l)[キー]には、vb6sp6rt4.exeを実行してできた解凍先フォルダ下にあるVB6SP6RT4.msiの改訂番号を入力します
　　　　 改訂番号を確認するには以下の操作を行います。
　　　　　(Ⅰ)VB6SP6RT4.msiを右クリックし[プロパティ」を選択します
　　　　　(Ⅱ)[詳細]タブを選択します。
　　　　　(Ⅲ)[改訂番号]に記載されている{XXXX-XXXX-XXXX-XXXXX}が改訂番号となります。({}を含む文字列)

2.VisualStudio2008のインストール
　(1)以下のサイトからVisualStudio2008のインストーラ(vbsetup.exe)をダウンロードします
　　　　http://nonsoft.la.coocan.jp/Chinamini/20110001/20110307.html

　(2)ダウンロードしたvbsetup.exeを実行してVisualStudio2008をインストールします

3.VB6からVB.NETへの変換
　(1)VisualStudio2008を起動します
　(2)[ファイル]>[プロジェクトを開く]からVB6のプロジェクトファイル(.VBP)を選択します。
　(3)[Visual Basicアップグレードウィザード]が表示するので、指示に従って変換処理を行います。

4.3.で生成したVB.NETプロジェクトをVisualStudio2019に対応する
　(1)VisualStudio2019を起動し、VB.NETプロジェクトを開く
PHP エスケープシーケンスについて

## エスケープシーケンスとは
エスケープシーケンス「\」は、文字列として入力できない特殊な文字を入力することができます。
例えば「\n」は改行の意味を持つ特殊な文字となるため、文字列の改行したい位置で「\n」を入力すると、直後の位置から改行されて表示されるようになります。
また、エスケープシーケンスを使う場合は、ダブルクオーテーション「"」で文字列を囲う必要があります。

## エスケープシーケンスの種類
エスケープシーケンスの代表的な記述方法は以下のようなものがあります。

| コード | 意味 |
|:-:|:-:|
| \n  | 改行  |
| \r  | キャリッジリーターン  |
| \t  | タブ  |
| \\\  | バックスラッシュ  |
| \\$  | $文字  |
| \'  | シングルクオーテーション  |
| \"  | ダブルクオーテーション  |

実際に入力してみます。

```test1.php
<?php
    echo "次の位置で\n改行します\n";
    echo "次の位置で\tタブを使います\n";
    echo "バックスラッシュ「\\」を表示します\n";
    echo "ダラー「\$」を表示します\n";
?>
```

出力結果は次のようになります。

```
次の位置で
改行します
次の位置で	タブを使います
バックスラッシュ「\」を表示します
ダラー「$」を表示します
```

また、シングルクオーテーションで囲われた文字列でシングルクオーテーションをエスケープしたいときは、以下のように書きます。

```test2.php
<?php
    echo 'シングルクオーテーション「\'」を表示します';
?>
```

出力結果は以下のようになります。

```
シングルクオーテーション「'」を表示します
```

逆にダブルクオーテーションはダブルクオーテーションで囲われていないとエスケープシーケンスの記述ができないので注意しましょう。

```test3.php
<?php
    echo "ダブルクオーテーション「\"」を表示します";
?>
```

出力結果は以下のようになります。

```
ダブルクオーテーション「"」を表示します
```

シングルクオーテーションとダブルクオーテーションをエスケープさせたいときは注意が必要です。
WUPC 2012 会場への道

##問題
https://atcoder.jp/contests/wupc2012-closed/tasks/wupc2012_5
##見た感じ
N<1000とちっちゃいから何でもできそう。
まず最初に考えたのは、$0からn-1$までの長さ順に路長をゲットして、そこから条件に合うやつを探せばいいじゃんと思ったけど、それやと何個求めておけばいいのかわからないし、第一どうやって計算するかもわからない。
結論としては、グラフを拡張して、各ノード$a$を$a_0,..,a_3,a^0..a^6$に増やして、$a_i$はノード$a$に4で割ったあまり$i$で到着したときのノード、$a^i$はノード$a$に7で割ったあまり$i$で到着したときのノードとして、普通にdijkstraすれば、とけます。
グラフGについての制限付き最短距離は、Gを拡張して制限を吸収した$G^\prime$の最短距離を求める問題に帰着できるという、数学でよくある感じで解けた。
##解法
拡張したグラフ$G^\prime$の上でdijkstra
##ソースコード
```c++
struct edge{
    edge(pair<int,pint> i,ll c=1){
        to=i;
        cost=c;
    }
    pair<int,pint> to;
    ll cost;
};
typedef vector<edge> vedge;
typedef pair<ll,pll> ppll;

const int N_MAX=1005;
vedge v[N_MAX][4][7];
int n,m;

ll solve(){
    vector<vector<vll>> dp(n+1,vector<vll>(4,vll(7,INF18)));
    priority_queue<pair<ll,ppll>,vector<pair<ll,ppll>>,greater<pair<ll,ppll>>> que;
    que.push({0,{0,{0,0}}});
    dp[0][0][0]=0;

    while(que.size()){
        ppll now=que.top().second;
        ll dis=que.top().first;
        que.pop();
        if(dp[now.first][now.second.first][now.second.second]<dis)continue;

        for(auto w: v[now.first][now.second.first][now.second.second]){
            if(minin(dp[w.to.first][w.to.second.first][w.to.second.second],w.cost+dp[now.first][now.second.first][now.second.second])){
                if(w.to.first!=n-1)que.push({dp[w.to.first][w.to.second.first][w.to.second.second],w.to});
            }
        } 
    }
    ll ans=INF10;
    rep(i,7){
        minin(ans,dp[n-1][0][i]);
    }
    rep(i,4){
        minin(ans,dp[n-1][i][0]);
    }
    return ans;
}

int main(){
    int x=0,y=INF10,z=1;
    //入力
    cin>>n>>m;
    rep(i,m){
        cin>>x>>y>>z;
        rep(j,4){
            rep(l,7){
                v[x][j][l].pb(edge({y,{(j+z)%4,(l+z)%7}},z));
                v[y][j][l].pb(edge({x,{(j+z)%4,(l+z)%7}},z));
            }
        }
    }
    //処理
    auto ans=solve();
    //出力
    cout << ans <<endl;
}
```
【メモ】SpringBoot_スマホ判別(Intercepter)

# Intercepterを使う
preHandle:コントローラの処理が始まるの処理
postHandle:コントローラの処理が終わったあとに処理
afterCompletion:Viewによるrender処理後

```java:SampleIntercepter
public class SampleIntercepter implements HandlerInterceptor{
//省略
@Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String ua = request.getHeader("User-Ageny");
        boolean mobile = ua.contains("iPhone") || ua.contains("iPad") || ua.contains("Android");
        request.setAttribute("mobile", mobile);
        return true;
    }
//省略
  }
```
DevOps

ここのところ、良くDevOpsという単語を聞く機会が増えた。
一因には、microsoft社が、自社の展開していた、Visual studio team service を Azure DevOps にリブランドなんぞしたからなんだろうけど

まあいい、DevOpsは悪くない。
ただ、いま語られているDevOpsには強い違和感を持っている

そもそも論問えば
ここ
https://www.slideshare.net/jallspaw/10-deploys-per-day-dev-and-ops-cooperation-at-flickr
10+ Deploys Per Day: Dev and Ops
なのである

もちろん、DevOpsは継続的デリバリーで、アジャイルな開発を行うんだ
そして、ロールを分割せず、行動するんだ。

なのに、スプリント、PM、スクラムマスター、ジョブアサイン？

そんなの、DevOpsじゃない

あえて言おう。
間違っているのは、日本のスクラム開発！
少なくとも、あんなものアジャイルでない。
ユーザーへの価値の提供ではなく、ステークホルダーへの納得できる数字の提供が中心なんだから。