OmniAICreator/Qiita-1.07M huggingface dataset:
jQueryで特定セルをクリックした時にそのセルの内容で検索する

djangoでjQueryをいじっていたら結構難しかったのでメモ。
よく調べたらcellのdataを受け、searchに突っ込むだけですね。Reference様様。

# スクリプト
``` sample.html
<script>
  // jQueryの関数書くところ。
  $(document).ready(function () {
    // id="dataTable"と付くtableを取得する。
    var table = $('#dataTable').DataTable();

    // クリック時のイベントを定義
    $('#dataTable').on('click', 'td', function () {
      // どの列がクリックされたか、列番号を取得(0から開始)
      var row_number = table.column(this).index();
      // 例えば3列目がクリックされたときに限定
      if (row_number == 2 ) {
        // クリックされたセルの内容を得る
        var data = table.cell(this).data();
        // セルの内容が空の時には処理しない
        if( data != undefined ){
          // 検索バーに文字列を突っ込み(search(data))、それで検索(draw())する。
          table.search(data).draw();
        }
      }
    });
  });
</script>

```

# refs
- セルのデータを得るAPI
    - https://datatables.net/reference/api/cell().data()
- 列番号を得るAPI
    - https://datatables.net/reference/api/column().index()
- 検索に突っ込むところ
    - https://datatables.net/reference/api/search()
    - https://datatables.net/reference/api/draw()
scalaのあれこれ

## 開発元
Lighitbend社(ライトベンド)が言語の開発元。
主催イベントの「Scala Days」を米国や欧州にて積極的に開催していきscalaの人口は拡大した。
設計者はスイス連邦工科大学ローザンヌ校(EPFL)のマーティンオーダースカイ教授

## sbt
現在ではscalaの標準のビルドツールとなっている。
sbtを中心としたライブラリやプラグインのエコシステムがあり、有志によるOSSの開発が進められている。

## フレームワーク
現在よく使用されているのは「Play Framework」
scalaの開発元であるLightbend社から提供されている。

## ミドルウェア
scalaで開発されたものに
Apache Kafka
Apache Spark
がある。これらのライブラリはscalaを使用した開発者以外の層にも利用されている。

## マルチパラダイム言語
scalaは
オブジェクト指向プログラミング
関数型プログラミング
の特徴を併せ持つマルチパラダイム言語である。

## ロゴ
EPFL大学にある螺旋階段をモチーフにデザインされた。

## JVM上で動作する
かつてはマイクロソフトの.NET Framework上でも動作していたが2012年でサポート終了。
現在は基本的にJVM上で動作する
ちなみにJVMはJava Vertual Machineの略

## Twitterもscalaを導入
2009年4月にRuby on railsで実装されているサービスのうちバックエンド部分をscalaに変更したことをブログで発表。これを機にscalaへの関心が高まった。
黎明期のTwitterはこれからのユーザーの増大などに耐えられないことが懸念され、言語を変えて再構築する必要があった。この変更がなければ現在のように莫大なユーザーを抱えることはできなかったとされる。
TwitterはフレームワークのOSS化やライブラリの公開を積極的に行い、scalaコミュニティの発展に寄与した。
Scala School、Effective Scalaと行った教育ドキュメントも公開している。

## Lightbend社
2011年5月Odersky氏はTypesafe社を設立。この会社は今日のscala普及に貢献してきました。
2016年2月に社名変更しTypesafe社はLightbend社になりました。

## 参考書籍
[実践scala入門](https://gihyo.jp/book/2018/978-4-297-10141-1)
Microsoft Teams | 10分でできる Microsoft Teams を使った授業 | 授業日程を登録する #1

関連記事は[**「Microsoft Teams の授業での活用」**](https://qiita.com/hisaho/items/12837a169bd6f1d90d5c)をご参照ください。

# はじめに

本記事では、Microsoft Teams を活用して授業を実施するための方法を解説いたします。
今回は**「授業日程の登録」**についてです。


#授業日程を登録する

Microsoft Teams には、Office 365 の予定表と連携する予定表の機能があります。予定表に授業日程を登録するのと授業の受講生のカレンダーにも自動的に反映されます。

授業日程の登録は以下の手順で行います。

- 画面左の**[予定表]**をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/7c7e9f83-1f67-a011-c563-c3be4adb21a5.png)

- 画面右上の**[新しい会議]** をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/67272db5-fa60-47b5-dfc0-1adea5f2c0ef.png)

- タイトルに授業名を入れ、授業時間を設定します。**[チャネルを追加]**で、自分の授業の**「一般」**チャネルを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/604a06a3-e971-a483-dddc-82f9c15f8bef.png)

- **[繰り返えし]**の設定で**[ユーザー設定]**を選べば、開始日と終了日の間の特定の曜日、時間で設定できます

- 学生の Teams には、このように投稿に授業日程が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/5476e2fb-d98a-d32a-d665-c4ef6a07d10e.png)

- 学生の Teams の予定表にはこのように授業が登録されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/8685a84c-0fb0-9918-37d5-d79a528a5906.png)

- 授業をクリックすると下記の画面が表示されます。**[Join Microsoft Teams Meeting]** をクリックするとオンライン授業に参加できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/ada4f7c0-478c-f435-81db-c3121c38d2a4.png)
Buefyのb-field labelで改行する

buefyの下記のようなlabelを改行させて表示させたかったのですが、ただbrを書くだけでは改行できなかったので調べた。
https://buefy.org/documentation/field

```html
<b-field label="line1<br>line2">
    <b-input value="Kevin Garvey"></b-input>
</b-field>
```

上記のb-fieldのlabel部分は下記のようになる

```html
<label class="label">line1&lt;br&gt;line2</label>
```

## label slotを使用する
label slotというものがあって、これを使うとlabelの文字をhtmlタグが使えるので、これを使ってbrを記載すれば改行ができた。


```html
<b-field>
  <template slot="label">line1<br>line2</template>
  <b-input></b-input>
</b-field
```
質問

表のサイズの部分がうまく反映されません。
どこかミスってる場所がわかりません。教えてください。
![キャプチャ.PNG 12.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614120/b5197000-9f90-7788-4a89-fa0bbe1a7753.png)
![undefined]()
![キャプチャ.PNG 11.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614120/7962f8e2-cfa2-c8f0-ee10-bc1d01fa4156.png)
S3バケット別概算コスト算出ツールを作ってみた

# はじめに

S3って安価なストレージなので、容量気にせずとりあえずなんでも格納して放置なんてことが多いですよね？
将来的に分析するかもってことでデータレイクに蓄積して結果使わないなんてことも多い。（my観測範囲）

で、新型コロナウィルスの影響で先行き不安な状況なので、収束まではどうにか支出を抑えて凌ぎたいという
人も多いと思い、要否判断（＆不要であれば削除）しやすいように、S3バケットごとに使用量／概算コストを
一覧表示するツールを作ったので、紹介します。

# ツール概要

一言で言えば、
`全リージョン／全バケット別にオブジェクト数／使用バイト数／概算月額料金を出力するツール`
です。（誰かが作ってそうなんですが探してもなかったので作りました）

[CloudWatchからバケットサイズなど取得できる](https://dev.classmethod.jp/articles/s3-cloudwatch/)ようになってるので、それを実行すればawscliでも取得できる
のですが、リージョン指定しないといけないとか、メトリクス／ディメンションを指定するのがダルイので
そこらへんうまくやってくれるツールが欲しいなぁと思ったのがモチベーションです。
あと、請求コンソールだとバケット別の使用量はわからないので。

### 補足（&免責事項）
* コスト算出について
    * 実行時点の利用量を１ヶ月間継続した場合の概算請求額であり正確ではありません（ご利用は自己責任で）
    * ストレージ保存量に対して課金される料金が対象であり、それ以外(リクエスト／転送量)のコストは含みません
    * 概算請求額は東京リージョン料金(2020/04時点)で算出します
    * 料金通貨は米ドル
* バージョニングについて
    * 以前のバージョンのオブジェクトやそのサイズもカウントされます
    * ツール結果と`aws s3 ls --recursive`等で得られるオブジェクト数は異なります

**要は`ざっくりでいいのでバケットごとにかかる料金を知りたい`って人がターゲットです**

# 実行方法

## 前提

* AWSクレデンシャル情報(~/.aws/credentials)が設置されていること

### Go言語がインストールされている環境の場合
```terminal
GO111MODULE=off go get -v github.com/miyaz/s3usage
cd $(go env GOPATH)/src/github.com/miyaz/s3usage
go run main.go
```

### それ以外の環境
[こちら](https://github.com/miyaz/s3usage/releases)から環境に応じたzipファイルをダウンロードし
展開後 `s3usage`というバイナリを実行します

## オプション

* -p {プロファイル名}
    * ~/.aws/credentials に記載されているプロファイル名
    * 指定なし時(デフォルト)は`default`
* -v
    * ストレージタイプ毎の使用量／概算コストも表示したい場合に指定

## 実行例

`./s3usage -p prod`
![normal.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51108/abd09c21-a721-a751-e973-9fae72db4a9e.png)

`./s3usage -v -p prod`
![verbose.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51108/c6d266c4-55b3-13ad-1c78-7e701756c954.png)

# おわりに

コロナに負けるな！
【UE4：エディタ拡張】左右にレイアウトを揃える

ue4.24.3

もっといい方法があるかもだけど
左右にそれぞれ複数ウィジェットを揃えたい場合
こんな感じでいけた

```cpp:sample
SNew(SVerticalBox)
+ SVerticalBox::Slot().AutoHeight()
[
	SNew(SHorizontalBox)
	+ SHorizontalBox::Slot().HAlign(HAlign_Left)
	[
		// 左揃え
		SNew(SHorizontalBox)
		+ SHorizontalBox::Slot()
		[
			SNew(SButton).Text(LOCTEXT("LeftButton1", "LeftButton1")).OnClicked_Raw(this, &FSample::OnButtonClicked)
		]
		+ SHorizontalBox::Slot()
		[
			SNew(SButton).Text(LOCTEXT("LeftButton2", "LeftButton2")).OnClicked_Raw(this, &FSample::OnButtonClicked)
		]
		+ SHorizontalBox::Slot()
		[
			SNew(SButton).Text(LOCTEXT("LeftButton3", "LeftButton3")).OnClicked_Raw(this, &FSample::OnButtonClicked)
		]
	]

	+ SHorizontalBox::Slot().HAlign(HAlign_Right)
	[
		// 右揃え
		SNew(SHorizontalBox)
		+ SHorizontalBox::Slot()
		[
			SNew(SButton).Text(LOCTEXT("RightButton1", "RightButton1")).OnClicked_Raw(this, &FSample::OnButtonClicked)
		]
		+ SHorizontalBox::Slot()
		[
			SNew(SButton).Text(LOCTEXT("RightButton2", "RightButton2")).OnClicked_Raw(this, &FSample::OnButtonClicked)
		]
	]
]
```
![ue4_align.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216261/e431b342-5ef1-8156-d9a7-5248780cb4ba.png)
【Github リリース】Githubで静的サイトをリリースするまで

# Githubで静的サイトをリリースするまで
この記事では、GitとGithubを用いて、作成済みの静的サイトをリリースするまでの過程をご案内いたします！

それでは、張り切っていきましょう！

フロー
①Gitのダウンロード
②Githubのアカウント登録
　ーGithubにてレポジトリを作成
　ー作成済みのサイトデータをGitに登録
　ー作成した静的サイトをGithubにcommit&Push！
③GithubPagesを用いて、リリース設定
以上！

## Gitのダウンロード
Gitとは、バージョン管理を行うツールです！
[こちら](https://www.sejuku.net/blog/73444)を参考にしつつダウンロードをお願いします！

設定したユーザー名や、メールアドレスは覚えておいてくださいね！
## Githubのアカウント登録
[こちら](https://qiita.com/okumurakengo/items/848f7177765cf25fcde0)を参考にしつつ、Githubの登録を行ってください！
Gitの登録の際に使用したユーザー名や、メールアドレスを用いて登録すればわかりやすいですね！

２段階認証はつけなくても大丈夫です！
### Githubにてレポジトリを作成
Githubのホーム画面の左上に「New」のボタンがあるかと思います！
そのボタンをクリックしてみましょう！
<img width="336" alt="スクリーンショット 2020-04-05 15.45.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411851/b94eb0b5-21e5-4b71-9374-aacd2115631f.png">

そうすると、以下のような画面が出てくると思うので、
<img width="799" alt="スクリーンショット 2020-04-05 15.48.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411851/88bfed66-22c9-f9cb-c198-c4f2b5f9af35.png">
repository nameの部分に、「homepage」と入力ください！（任意の名前でも大丈夫です！）
Descriptionは、記入せず、
Publicを選択し、
チェックボックスにチェックはつけずに「Create repository」を押下してみましょう

するとこんな画面に遷移するかと思います
<img width="1034" alt="スクリーンショット 2020-04-05 15.53.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411851/9d824e9b-a8b4-ae0d-91a0-459c148c59dd.png">
いったん、このままおいておいてくださいこの画面の二行目のHTTPSのURLをコピーして、どこかにペーストしておいてください

### 作成済みのサイトデータをgitに登録
ターミナルで作成済みのディレクトリに移動していただき、ディレクトリをGitに登録します。

```:terminal
# デスクトップにある「homepage」フォルダをリリースしたいとき

> cd Desktop
> cd homepage
> git init #これにより、リポジトリを新規に作成できます
#Initialized empty Git repository in~~と表示されればOKです！
```

### 作成した静的サイトをGithubにcommit&Push！
上に続いて、

```:terminal
> git add -A #変更をステージング
> git commit -m "Initial Commit" #メッセージをつけてコミット
> git push （先ほどコピペしたURLを貼付） master
```

## GithubPagesを用いて、リリース設定
そして、Githubのhomepageのレポジトリに再度アクセスして頂き、
下の画像のSettingsの部分を押下してください
<img width="1032" alt="スクリーンショット 2020-04-05 16.11.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411851/2fcf25ba-53d7-abb8-946a-40a145d185be.png">
こんなページに遷移すると思いますので、
下スクロールしていって
<img width="1003" alt="スクリーンショット 2020-04-05 16.12.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411851/b2344347-a689-7e24-0c36-0d0c3cd4c582.png">
Github Pagesというセクションまで遷移します
<img width="811" alt="スクリーンショット 2020-04-05 16.13.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411851/1bbc9b68-3393-d32e-0887-ccf3853bc662.png">
そこで、一つ目のメニューを押下して頂き、「master branch」を選択してください

選択すると、再度Settingsのページ最上部に移動しますので、またGithub Pagesのセクションまで遷移してください。
すると、URLが「Your site is published at ~」に表示されているかと思います。
<img width="768" alt="スクリーンショット 2020-04-05 16.15.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411851/02a5ce92-c133-5ad7-053a-8da8718a87b2.png">
それがあなたのサイトの公開用URLです！！
そのURLさえクリックすれば誰でも、あなたの作成したWebsiteを見ることができます！
すばらですね！
あとは最初に表示したい画面のファイル名を最後につければ、完璧です！
例えば「homepage.html」を表示させたい方は、
「https://~.github.io/homepage/homepage.html」と打っていただければ、
望み通りの結果が得られると思います！👌

お疲れ様でした！！！！🎉
[swift]ARkitでsampleデータをiphoneにビルドしようとしたら、ログインているのにアカウントが受け入れられずビルドできなかった解決例

#1.エラー文

メッセージで下記のエラー文が出てきました

`Showing All Messages
The operation couldn’t be completed. Unable to log in with account 'xxxxxxxx@icloud.com'. The login details for account 'xxxxxxxxxxxx@icloud.com' were rejected.`

#2.原因
Xcodeのログイン情報が期限切れ（expired）となっていました

#3.解決方法
windowバーの`Xcode`→`preference`→`アカウント`→再度ログインしますか？ボタンをクリックで解決できます
Gitの基本的なコマンドまとめ

備忘録用に、Gitのコマンドをまとめてみました。
随時追加していきます。



#変更をコミットするまで

##ローカルリポジトリを新規作成する



```
$ git init
```


.gitディレクトリが作成され、ローカルリポジトリも作成されます。


##変更をステージに追加する
```
$ git add <ファイル名 or ディレクトリ名>
```

ワークツリー全体の変更をステージに追加する場合は、以下のように「 . 」を指定します。

```
$ git add .
```

##変更をコミットする

```
$ git commit
```
ローカルリポジトリに変更をコミットします。
また、以下のように -vオプションを付けると、コミット時に変更内容を見ることができます。

```
$ git commit -v
```

また、-mオプションを使うと、gitのエディターを立ち上げずにコメントを入れることができます。

```
$ git commit -m "<メッセージ>"
```
#変更の確認

##現在の変更状況を確認する

```
$ git status
```

##変更の差分を確認する
git addする前の変更分を確認したいとき

```
$ git diff
```

git addした後の変更分を確認したいとき

```
$ git diff --staged
```

##変更履歴を確認する

```
$ git log
```

一行で表示したいとき↓

```
$ git log --oneline
```

ファイルの変更差分を表示したいとき↓

```
$ git log -p <ファイル名>
```

表示するコミット数を指定したい時↓

```
$ git log -n <コミット数>
```
例えば「　git  log  -n  5　」 とコマンドを打つと、5件分のコミットの変更履歴が表示されます

#リモート関連

##リモートリポジトリを新規追加する
GitHub等のリモートリポジトリを登録したいとき

```
$ git remote add origin <リモートリポジトリのURL>
```

##リモートリポジトリの確認

```
$ git remote
```
登録されているリモートリポジトリのURLも確認したいときは、-vオプションをつける↓

```
$ git remote -v
```

##リモート名を変更する

```
$ git remote rename <旧リモート名> <新リモート名>
```

##リモートを削除する

```
$ git remote rm <リモート名>
```

##リモートリポジトリにプッシュする

```
$ git push <リモート名> <ブランチ名>
```
コマンド例↓

```
$ git push origin master
```

##リモートリポジトリからプルする

```
$ git pull <リモート名> <ブランチ名>
```
git fetchとgit mergeを一度に行っている。
コマンド例↓

```
$ git pull origin master
```

##リモートリポジトリからフェッチしてマージする
__①まずリモートリポジトリからローカルリポジトリに情報を取得する(フェッチ)__

```
$ git fetch <リモート名>
```
コマンド例↓

```
$ git fetch origin
```

__②ローカルリポジトリに取得した情報を、ワークツリーに統合させる(マージ)__

```
$ git merge <リモート名/ブランチ名>
```
コマンド例↓

```
$ git merge origin/master
```


#変更をなかったことにする

##ワークツリーのファイルを元の状態に戻す

ワークツリーの状態を、ステージの状態と同じにすることによって、
ファイルへの変更を取り消しています。

```
$ git restore <ファイル名 or ディレクトリ名>
```
ワークツリー全体の変更を取り消すときは、「 . 」を指定します。↓

```
$ git restore .
```
なお、「restore」の代わりに「checkout --」を使用することも可能です。

##ワークツリーから追跡対象外のファイル(Untracked file)を削除する

git restoreコマンドでは、新規に作成されたファイルを削除できないため、git cleanコマンドを使用します。↓

```
$ git clean -f <ファイル名>
```
ファイル名を指定しなかった場合は、カレントディレクトリ内の追跡対象外ファイル全てが削除されます。
また、追跡対象外ファイルを確認したいときは、-fオプションの代わりに-nオプションを使用します。↓

```
$ git clean -n
```

##ステージのファイルを元の状態に戻す

git addでステージした変更を取り消すとき↓

```
$ git restore --staged <ファイル名 or ディレクトリ名>
```

ステージ全体の変更を取り消すときは、「 . 」を指定します。↓

```
$ git restore --staged .
```
なお、「restore --staged」の代わりに「git reset HEAD」を使用することも可能です。

##直前のコミットをやり直すとき

```
$ git commit --amend
```

現在のステージの状態を元に、コミットを上書きすることでコミットを修正する
※リモートリポジトリにプッシュした後のコミットはやり直しできないので注意が必要

#その他

##ファイルの削除を記録する

```
$ git rm <ファイル名>
```
git rmコマンドを使うことによって、指定したファイルが
ローカルリポジトリとワークツリーの両方から削除されます。
また、ディレクトリを削除するときは、-rオプションを付けてディレクトリ名を指定します。↓

```
$ git rm -r <ディレクトリ名>
```
なお、ファイルをローカルリポジトリからのみ削除し、ワークツリーには残しておきたい場合は
コマンドに --cachedをつけます。

```
$ git rm --cached <ファイル名>
```
AzureポータルでVMやWebアプリの自動スケーリングルールが登録できない

Azureに関する参考書『Learn AZURE　IN A MONTH OF LUNCHES (1 か月のランチ時間で Azure を学ぶ)』の電子版が公開されていたので、DLしてハンズオンで学習していました。

[Month of Lunches で Azure を学習する](
https://azure.microsoft.com/ja-jp/resources/learn-azure-in-a-month-of-lunches/)

9章「スケーラブルなアプリケーション」にて、VMやWebアプリの自動スケールルールを作成するのですが、適用できないエラーが発生したので、解決方法を記載します。

## 問題
Azureポータルにて、作成したVMのスケールセットの自動スケーリングルールを定義し、ページ上部の**[保存]**をクリックするも、通知には「自動スケーリングの構成を更新しています」と表示されたまま変化しない。
ページ上部の**[最新の情報に更新]**をクリックしても、自動スケーリングは適用されていない。

![error_autoscaling.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/503491/c08f8369-d15c-2288-bffa-b940b9f1d419.png)

## 原因
**[アクティビティログ]**にて、先程の操作「自動スケーリング設定の更新」のメッセージを参照する。

>サブスクリプション登録が 'Unregistered' の状態です。サブスクリプションは、名前空間 'microsoft.insights' を使用するように登録する必要があります。サブスクリプションを登録する方法については、https://aka.ms/rps-not-found をご覧ください。

サブスクリプションに名前空間`microsoft.insights`が使用できるように登録されていないからのようです。

## 解決方法
1. Azureポータルを開く
1. **[サブスクリプション]**を選択し、使用するサブスクリプションを選択
1. 左部メニューから**[リソースプロバイダー]**を選択
1. リストから`microsoft.insights`を選択して、ページ上部の**[登録]**をクリック

これで自動スケーリングルールを登録できるようになりました。

## 参考
- [Resolve errors for resource provider registration](https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/error-register-resource-provider)
- [Azure Databricks についてよく寄せられる質問](https://docs.microsoft.com/ja-jp/azure/azure-databricks/frequently-asked-questions-databricks)
brew install nodeで色々詰まった自分用メモ

####前提

https://qiita.com/okohs/items/ced3c3de30af1035242d
この記事を読んで

```
brew install node
```
としたがエラーに出会った。

そこで、
http://www.gworks.jp/2014/05/homebrew-node/
にしたがって

```
brew doctor
```
のところまで行き、問題が生じたので一つ一つ解決したあと、

```
brew install node
```

をしたらまたエラーが出た。
今度はbrew linkできないよ〜というエラーだった。
そこで、エラーメッセージに素直にしたがって解決しようとした。
僕が選んだ選択肢は

```
brew link --overwrite node
```

こうしたら、とあるファイルに権限がないからエラーになった。
というわけで、
https://wtnvenga.hatenablog.com/entry/2017/11/15/125430
を参考にしてエラーを1つ1つ解決することになった。

その時のコマンドとエラーと解決方法の組み合わせが以下になる。



#### 出会ったコマンドとエラーの組み合わせが以下だったら読んでも良いかも

コマンド１

```
brew install node
```

エラー１

```
Could not symlink share/systemtap/tapset/node.stp
以下略
```

コマンド２

```
brew link --overwrite node
```

エラー２

```
Error:Could not symlink 〇〇
△△ is not writable.
```

####解決方法

#####　エラー１：

```
brew link --overwrite node
```

#####　エラー２：

```
cd （△△より手前）
sudo chown -R $USER △△
brew link node
```

もしまた同様のエラーが出たら上記手順を繰り返す。

####感想

わからなくて人に聞けないなら、エラーの奴隷にまずはなることが一番だと思った。
ここら辺は半年近く経っても変わらないスタンスだと思う。
Quoraのどこかの質問に対する回答にも、ベテランエンジニアは初めて触るFWやライブラリに慣れるのが速いのは、エラー解決速度が異常に速いだからという話があった。

上の方法がベストかどうかは知らない。
とはいえ、やりながらミスをして向き合って一つ一つ解決しながら実装するのが上達のために必要な条件だとつくづく思った。
（一番良いのは作りたいプロダクトがある時だ思うけど。JS知らなくても3日くらいやってりゃ初級レベルだったら実装できるようになるし、中級知識と言われるものがすぐに必要になってくるから。しかも必要だったらレベルが如何の斯うのと御構い無しになる。）

#### 参考文献

https://wtnvenga.hatenablog.com/entry/2017/11/15/125430
http://www.gworks.jp/2014/05/homebrew-node/
https://qiita.com/okohs/items/ced3c3de30af1035242d
jetson nano 用のffmpeg をビルドしてみた

jetson nano のハードウェアエンコーダ、デコーダが利用できるffmpeg はnvidiaから公式サポートはされていませんが、さがしてみるとこのリポジトリが見つかりました。

https://github.com/jocover/jetson-ffmpeg

これをビルドしてみたのでその手順を紹介します。
ビルドはjetson nano上でネイティブビルドしています。

## 準備

ffmpeg をソースからビルドするので、まず依存するライブラリをインストールします。

```
sudo apt build-dep ffmpeg
```

これがエラーになるときは、このページをみてください。
[apt build-dep がエラーになるときの対処方法](https://qiita.com/tetsu_koba/items/904b03e908b040ed447d)

```
sudo apt install libv4l-dev
```

あとはこのページの手順でいけます。
https://github.com/jocover/jetson-ffmpeg

## 依存ライブラリのビルド

```
git clone https://github.com/jocover/jetson-ffmpeg.git
cd jetson-ffmpeg
mkdir build
cd build
cmake ..
make
sudo make install
sudo ldconfig
```

## ffmpeg のパッチとビルド

```
git clone git://source.ffmpeg.org/ffmpeg.git -b release/4.2 --depth=1
cd ffmpeg
wget https://github.com/jocover/jetson-ffmpeg/raw/master/ffmpeg_nvmpi.patch
git apply ffmpeg_nvmpi.patch
./configure --enable-nvmpi
make -j4 2>&1 |tee make.log
sudo make install
```

```
$ which ffmpeg
/usr/local/bin/ffmpeg
$ ffmpeg -codecs |grep 264
ffmpeg version 3eedf15 Copyright (c) 2000-2019 the FFmpeg developers
  built with gcc 7 (Ubuntu/Linaro 7.5.0-3ubuntu1~18.04)
  configuration: --enable-nvmpi
  libavutil      56. 31.100 / 56. 31.100
  libavcodec     58. 54.100 / 58. 54.100
  libavformat    58. 29.100 / 58. 29.100
  libavdevice    58.  8.100 / 58.  8.100
  libavfilter     7. 57.100 /  7. 57.100
  libswscale      5.  5.100 /  5.  5.100
  libswresample   3.  5.100 /  3.  5.100
 DEV.LS h264                 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (decoders: h264 h264_v4l2m2m h264_nvmpi ) (encoders: h264_nvmpi h264_v4l2m2m h264_vaapi )
```

H.264 のdecoder と encoder に h264_nvmpi が入っているのが確認できました。

## トランスコードしてみた

H.264の1080p 30fps の動画ファイルを 720p 30fps にトランスコードしてみました。

```
ffmpeg -c:v h264_nvmpi -i bbb1080.mp4 -c:a copy -c:v h264_nvmpi -s 1280x720 -b:v 1M -g 60 bbb720.mp4
```

1.1 倍速でできました。
でも、できたファイルを再生してみると音と映像にズレがある ..?  ちょっと音が早いみたい。なんでだろ。
考古学のためのRでGIS〜ポイントサンプリングツールをRで使う


ポイントサンプリングツールとは点データと同じ位置のラスタ地図の値（標高値とか傾斜角など）を取得し、点データに付値するQGISのプラグインです。考古学では、遺跡立地地点の標高や傾斜などの地形指標を取得するという利用方法が考えられます。
同じ作業をRで実行する方法を紹介します。

![01pointsampling.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/79a45501-f856-4082-53bc-4a445997af3b.png)

# extract()関数

QGISのポイントサンプリングツールに相当する機能は`extract()`関数が提供しています。標高ラスタと傾斜ラスタの値を同一地点の遺跡データに付値します。

![01eleve.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/1608e5ec-71c7-9598-b4c2-b689847911a5.png)
![02slope.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/999d8163-a6e4-8517-2229-2701f0cdb5b8.png)

`extract()`関数の最低限の引数は次のとおりです。

- x = ラスタオブジェクト
- y =  SpatialPoints; SpatialPolygons; SpatialLinesを指定します。
- meshod = "simple"か"bilinear"が選べます。

`method = "simple"`では該当する1点のラスタ値を取得します。`method = "bilinear"`では周囲4点から算出した補完値を使用します。

```{r}
lev <-
  dem3100cr %>%
    extract(
      y = asbSite,    # SpatialPointsオブジェクト 
      method="bilinear", #周囲4点から算出した補完値を使う "bilinear"を指定
  ) %>%
  as_tibble() %>%
  rename("Elevation" = value )
# 標高値を確認
> head(lev)
[1]  95.70188  29.00163 113.30141  35.50785  31.91255  72.68698
```
# 遺跡位置データに標高値を付値

```{r}
asbSite <-
  bind_cols(asbSite ,lev)
```

# 遺跡位置データに傾斜を付値

```{r}
slope <-
  slp %>%
    extract(
      y = asbSite,    # SpatialPointsオブジェクト 
      method="bilinear", #周囲4点から算出した補完値を使う "bilinear"を指定
  ) %>%
  as_tibble() %>%
  rename("Slope" = value )
# 遺跡位置データに付値
asbSite <-
  bind_cols(asbSite ,slope)
```

# 遺跡立地地点の標高ヒストグラム

```{r}
asbSite %>%
  ggplot() +
    geom_histogram(
    aes(x = Elevation)
    ) +
    theme_minimal()
```
![03標高.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/020d175e-f2f7-f697-bc89-eb6ec1fe7727.png)


# 遺跡立地地点の傾斜ヒストグラム

```{r}
asbSite %>%
  ggplot() +
    geom_histogram(
    aes(x = Slope)
    ) +
    theme_minimal()
```
![04slope.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/e08a4fcb-3aaa-ac67-4aa7-31f85ad49d6a.png)

# 自然地形と遺跡立地地点の傾斜比較

前処理として、対象領域の傾斜ラスタ地図と遺跡地点の傾斜データを結合します。

```{r}
# 自然地形
df_slp2 <-
  df_slp %>%
    dplyr::select(Slope) # Slopeカラムのみ選択
df_slp2$class <- factor("自然")  # 自然地形を意味する"自然"をfactor化してclassカラムに付値
# 遺跡
asbSite2 <-
  asbSite %>%
    as.tibble() %>%s
    dplyr::select(Slope) # Slopeカラムのみ選択
asbSite2$class <- factor("遺跡")
# データ結合
asbSlope <-
  bind_rows(asbSite2 , df_slp2)
```

ggplotで描画します。

```{r}
asbSlope %>%
  ggplot() +
    geom_histogram(
    aes(x = Slope)
    ) +
    facet_wrap(~class , scales ="free_y")  +
    theme_minimal()
```
![06傾斜比較.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60438/8185a80e-1bc2-2b84-46d3-2922402b7dee.png)
sedを使ってコメント行を削除する

# sedを使ってコメント行を削除する
今回削除対象に選ばれた記号の皆さんです。

- 「#」
- 「//」
- 「/**/」

では、早速始めてましょう。

## 「#」と「//」を削除
まずは簡単そうな「#」と「//」で始まる行を削除してみます。
特に難しいことはしていないので、ちゃちゃっと書いていきます。

```sh
cat <<EOF| sed -e '/^\/\//d' -e '/^\#/d'
```

ヒアドキュメントを利用しているので対話形式で入力していきます。
今回はコメントされているテキストを2つとコメントされていないテキストを1つ用意して試してみます。
入力する単語は以下です。

```
aaa
// bbb
# ccc
```

すると、「`// bbb`」と「`# ccc`」が除外され、「aaa」のみが出力されます。

```
aaa
```

最終的なターミナルは以下のようになります。(mac+zshでカスタマイズしているのでプロンプトが変かもですが)

```sh
❯ cat <<EOF| sed -e '/^\/\//d' -e '/^\#/d'
pipe heredoc> aaa
pipe heredoc> // bbb
pipe heredoc> # ccc
pipe heredoc> EOF
aaa
```

### 解説
　`sed -e '/^\/\//d' -e '/^\#/d'`にてコメントを削除しています。今回のように削除対象が複数存在する場合、sedでは-eオプションを複数作ることで実現できます。したがって、このコマンドは「行頭が「#」または「//」で始まる行を削除する」と表現できます。

## 「/**/」を削除
これはちょっと難しそうですねー。でも大丈夫です。これもsedで解決できます。
ということで書いてみます。

```sh
cat <<EOF| sed -e '/\/\*/,/\*\// s/.*//' | grep -v '^$'
```

ヒアドキュメントに以下のように入力します。

```
aaa
/* bbb
ccc
*/
/* 
ddd */
eee
```

すると、「`// bbb`」と「`# ccc`」が除外され、「aaa」のみが出力されます。

```
aaa
eee
```

最終的なターミナルは以下のようになります。

```sh
❯ cat <<EOF| sed -e '/\/\*/,/\*\// s/.*//' | grep -v '^$'
pipe pipe heredoc> aaa
pipe pipe heredoc> /* bbb
pipe pipe heredoc> ccc
pipe pipe heredoc> */
pipe pipe heredoc> /*
pipe pipe heredoc> ddd */
pipe pipe heredoc> eee
pipe pipe heredoc> EOF
aaa
eee
```

### 解説
　恐らくお気づきだと思いますが、`sed -e '/\/\*/,/\*\// s/.*//'`の部分で除外しています。sedでは開始地点と終了地点のテキストを指定し、その範囲を置換することができます。ここですね`'/\/\*/,/\*\//`。書き方としては`/START_TEXT/,/END_TEXT`のように記述します。対象としている記号がエスケープ文字を必要とするので読みづらさMAXですが・・・。
　次に範囲をどのようなルールで置換するのかを宣言します。ここですね`s/.*//`。今回は範囲内の全ての文字列を削除する命令をセットしました。
　最後に出力結果をgrepに渡し空の行を除外しています。本来であれば、sedの`/[削除したい文字列やパターン]/d`にて対応できればgrepを使う必要はないのですが、どうも範囲指定を利用する場合使えないようなので渋々この形になりました。

## おまけ
　コメント行や空行を除いた純粋なソースコードの行数を知りたいという動機からこの記事を書いたわけです。なので、インデントを考慮して行数を出す必要がありました。ただ、今回僕が知りたかったのはソースコードからコメントなどを排除した形にしたい（つまり整形）というわけではなく、ソースコードの行数だけだったので、コメントの行を炙り出す前に事前処理としてインデントを排除することを選択しました。ここでは詳しい解説は行いませんが、最終的なターミナルのみ載せておきます。

```sh
❯ echo 'aaa\n\tbbb\n ccc\n\t ddd' | gsed -e 's/[ \t]*//' | sed -e '/^\/\//d' -e '/^\#/d' -e '/\/\*/,/\*\// s/.*//' | grep -v '^$'
aaa
bbb
ccc
ddd
```

　ヒアドキュメントにて「空白」と「タブ」を入れると出力がおかしくなるのでechoで対応しています。また、macのsed(BSD sed)では「\t」でタブを表現できないのでその部分のみgsed(GNU sed)を利用しています。ちなみに、macのsedでタブを表現する際には`[:cntrl:]`を使って表現できます。

## 参考サイト
[sedでこういう時はどう書く? - Qiita](https://qiita.com/hirohiro77/items/7fe2f68781c41777e507)
[BSD(Mac)のsedでのタブ文字を変換する3つの方法](https://rcmdnk.com/blog/2016/09/13/computer-gnu-bsd-linux-mac/)
[ヒアドキュメントをパイプで渡す時の注意点 | ライカ犬は今何処](https://dakensuk.github.io/2018/08/25/oracle.html)
初めてGrace Periodを導入する日に読む話

## はじめに🔥

Grace Periodを導入するうえで色々と行き詰まる部分があったので備忘録としてまとめたいと思います。
これからGrace Periodを導入される方のお役に立てればと！

## Grace Periodとは🔥

Grace Periodとは、サブスクリプション購読者に**請求に関する問題**（クレジットカードの有効期限切れなど）が発生した場合に、その時点では解約とせず、請求に関する問題を解消するための**猶予期間**を設ける仕組み、もしくは猶予期間そのものを指します。

これによりサブスクリプション購読者の**非自発的解約を防ぐ**ことができます。

※ちなみに、Grace Periodの設定をONにしていなくても即解約とはならず、有料サービスは利用できませんが、Appleは60日間、毎日請求を試みます。

## 猶予期間の日数🔥

猶予期間はサブスクリプションの登録期間が週単位の場合は6日、月単位以上の場合は16日が適用されます。猶予期間の設定はApp Store Connectから可能です。

## 有料サービス提供の義務🔥

猶予期間中は、請求に関する問題が生じた人もこれまでと同様に有料サービスにアクセスすることができます。**正確には、デベロッパーは猶予期間中は有料サービスを提供することがAppleから求められています。**つまり単純にGrace Periodの設定をONにすればいいわけでなく、アプリやサーバーサイドの開発も必要になります。

## 猶予期間中に請求に関する問題を解消した場合🔥

これだけでは無料で有料サービスを提供しているように思えるかもしれません。

大丈夫です！そんなことはありません！

もし請求に関する問題が生じた人が**猶予期間中に問題を解消した**場合、Appleによって**請求に関する問題が生じた日まで遡って請求されます**。
つまり**有料サービスの継続日数や収益の中断がなかった**ことになります。

これは収益の観点でもデベロッパーにとっては恩恵があります。
サブスクリプション購読者の有料サービスの継続日数が1年未満の場合は料金の30%、1年以上経過している場合は料金の15%がAppleに摂取されます。
つまり**有料サービスの日数が中断されないほうが収益に繋がる**のです。

## 猶予期間中に請求に関する問題を解消しなかった場合🔥

Grace Periodの設定をONにしていなくてもAppleは**請求に関する問題が生じた日から60日間**、毎日請求を試みます。
Grace Periodの設定をONにすると、この60日間の最初の6日間もしくは16日間は猶予期間としてデベロッパーが有料サービスの提供を続けます。

なので、**猶予期間中に請求に関する問題を解消しなかった場合は有料サービスが利用できなくなります**。また、有料サービスの継続日数も請求に関する問題が生じた日で中断され、請求に関する問題を解消したタイミングで再開となります。

そして、請求に関する問題が生じた日から**60日が過ぎても問題が解消されなかった場合は、サブスクリプション自体が自動解約となります**。
再度サービスを利用したい場合は新規でサブスクリプションを登録する必要があります。

# Grace Periodを導入するメリット🔥

上記の説明を踏まえて導入のメリットをおさらいしましょう。

- **サブスクリプション購読者の非自発的解約を防ぐことができる**
- **有料サービスの継続日数や収益の中断を防ぐことができる**

## 参考資料🔥

- [Introducing Billing Grace Period for Subscriptions](https://developer.apple.com/news/?id=09122019c)
- [アップルはApp Storeのサブスク期限切れに「猶予期間」を導入](https://jp.techcrunch.com/2019/09/14/2019-09-13-apple-introduces-a-grace-period-for-lapsed-app-store-subscriptions/)
- [自動更新サブスクリプション](https://developer.apple.com/jp/app-store/subscriptions/)
- [自動更新登録の請求の猶予期間を有効にする](https://help.apple.com/app-store-connect/#/dev58bda3212)
- [Reducing Involuntary Subscriber Churn](https://developer.apple.com/documentation/storekit/in-app_purchase/subscriptions_and_offers/reducing_involuntary_subscriber_churn)
地理院地図ベクトルタイル  experimental-bvmap のレイヤ一覧

地理院地図ベクトルタイル experimental-bvmap のレイヤ一覧です。スタイルの中で下に敷かれるレイヤから並べています。情報源は[地理院地図Vector（仮称）提供実験のソース](https://github.com/gsi-cyberjapan/gsimaps-vector-experiment)の中にある[地物コード及び表示ズームレベル一覧](https://maps.gsi.go.jp/help/pdf/vector/dataspec.pdf)で、このデータをシンプルに表示すると[こんな感じ](https://optgeo.github.io/toki/static.html#15.51/34.203997/129.289731/-34.5)になります。

|#|レイヤ名|z=[4..7]|z=[8..10]|z=[11..13]|z=[14..16]|z=17|
|---|---|---|---|---|---|---|
|1-pg|🟦waterarea|x|x|x|x|x|
|2-pg|🟦lake|x| | |x|x|
|3-pg|🟩landforma| |x|x|x|x|
|4-pg|🟥structurea| |x|x|x|x|
|5-ls|🟦coastline|x| | |x|x|
|6-ls|🟦river|x|x|x|x|x|
|7-ls|🟥searoute|x|x|x|x| |
|8-ls|🟩contour| |x|x|x|x|
|9-ls|🟩landforml| | | |x|x|
|10-ls|🟥boundary|x|x|x|x|x|
|11-ls|🟥railway|x|x|x|x|x|
|12-ls|🟥road|x|x|x|x|x|
|13-ls|🟥structurel| | | |x|x|
|14-ls|🟥transl| | | |x| |
|15-pt|🟥landformp| | | |x| |
|16-pt|🟥transp| |x|x|x|x|
|17-pg|🟥building| | |x|x|x|
|18-pt|🟩elevation|x|x|x|x| |
|19-pt|🟪symbol|x|x|x|x| |
|20-pt|🟪label|x|x|x|x|x|

これらのデータをシンプルに表示するスタイルは https://optgeo.github.io/plain-bvmap/style.json に置いてあります。このスタイルを Maputnik に表示する URL は、https://maputnik.github.io/editor/?style=https://optgeo.github.io/plain-bvmap/style.json です。

私自身は、この plain-bvmap/style.json 相当のスタイルを出発点に、データの表示を削り込む方向の調整を進めていく予定です。
Laravel 使用頻度の高そうなコマンド

# 目的

- Laravelで使用頻度の高そうなコマンドをまとめる
- 自分が必要に感じたものを随時追加してゆく

# ローカルサーバの起動

- アプリ名ディレクトリで下記コマンドを実行する。

    ```terminal
    $ php artisan serve
    ```

# マイグレーションファイルを作成する。

- マイグレーションファイルに命名規則はないが、どんな修正をDBに与えるのかがわかりやすいファイルである必要がある。

1. テーブルの新規作成
    - アプリ名ディレクトリで下記コマンドを実行する。

        ```terminal
        $ php artisan make:migration create_テーブル名_table --create=テーブル名
        ```
1. 既存テーブルにカラム追加等の途中からテーブルに修正を加える
    - アプリ名ディレクトリで下記コマンドを実行する。(下記のコマンドは〇〇カラムを追加する時のコマンドの例)

        ```terminal
        $ php artisan make:migration add_〇〇_column_テーブル名_table --table=テーブル名
        ```

# マイグレーションファイルのマイグレート

1. マイグレート
    - アプリ名ディレクトリで下記コマンドを実行する。

        ```terminal
        $ php artisan migrate
        ```
 1. ロールバック
    - アプリ名ディレクトリで下記コマンドを実行する。

        ```terminal
        $ php artisan migrate:rollback
        ```
# その他

1. ルーティング情報確認
    - アプリ名ディレクトリで下記を実行する。

        ```terminal
        $ php artisan route:list
        ```
BlocklyでWebページをデザイン

BlocklyでWebページをデザインして表示するサイトを作成しました。JavaScript命令のブロックで動きをプログラミングします。

#「ねそプロ」ウェブサイトを作ろう
この教材は、３つのWebページで構成しています。
○　ウェブサイトを作ろう　　←　サイト作成
○　ウェブサイトに画像登録　←　画像の登録
○　ウェブサイトを見よう　　←　作成したサイト表示
　↓　教材はこちら
http://iwate-manabi-net.sakura.ne.jp/nesopuro/

#ビジュアル　→　テキストプログラミングへ
 2020年から小学校ではプログラミング教育が始まります。多くの学校で教材としてScratch等のビジュアルプログラミング使って指導を行うと思われます。小学校で体験したビジュアルプログラミングからテキストプログラミングへ橋渡しをするための教材として開発しました。HTMLタグ命令のブロックを組み合わせてWebページをデザインします。JavaScript命令のブロックでインタラクティブなページを作成できます。作成したプログラムをテキストとして表示します。ブロックで作成したビジュアルプログラムとテキストを見比べることでWebページの基本を理解させることができます。このテキストをメモ帳等に貼り付け、拡張子を.htmlとして保存するとWebページになります。ブラウザから起動するとボタン等も作動します。

#双方向性のあるコンテンツ
 2021年から中学校で実施される学習指導要領　技術・家庭　解説において、「コンテンツのプログラミングによる問題を解決する学習活動としては、例えば、学校紹介の Web ページにＱ＆Ａ方式のクイズといった双方向性のあるコンテンツを追加」と示されています。そこで、次のサンプルを作成しました。
○　２択クイズ
○　英単語クイズ（テキスト入力）
○　APIを使って「天気」「地図」を表示
　命令ブロックの組み合わせで様々なデザイン、作動を刷るページの作成ができます。さらに、APIを使って他のWebで公開されているデータの活用も体験できます。

#「命令ブロック」について
HTMLとJavaScript命令のブロック、外部Webサイトの画像やAPI等を読み込むブロックを用意しています。
##HTML命令ブロック
見出し（特大）　&lt;h1&gt;
見出し（大）　　&lt;h2&gt;
改行　　　　　　&lt;br&gt;
段落　　　　　　&lt;p&gt;
文字色　　　　　&lt;font color='red'&gt;
文字の大きさ　　&lt;font size='4'&gt;
センタリング　　&lt;div align='center'&gt;
グループ　　　　&lt;div id='Group'&gt;
ボタン　　　　　&lt;button id='B'&gt;
文字入力　　　　&lt;input type='text'&gt;
画像表示　　　　&lt;img src='sample.jpg'&gt;
　※　「ウェブサイトに画像登録」からアップロードした画像を表示します。
　※　登録した当日の画像のみ表示します（過去の画像は表示しません）。

##JavaScript命令ブロック
ボタンが押された　　addEventListener('click', function(){})
グループを非表示　　style.display ='none'
グループを表示　　　style.display ='block'
グループ内容を削除　textContent = null
グループに追加　　　insertAdjacentHTML('beforeend','')
条件分岐　　　　　　if(A=='こたえ'){}else{}
くり返し　　　　　　for (var count=0; count<5; count++){}
 
##外部Webサイトの画像やAPI等のブロック
天気予報（気象庁）　&lt;img src='http://www.jma.go.jp/jp/yoho/'&gt;
天気図（気象庁）　　&lt;img src='http://www.jma.go.jp/jp/g3/'&gt;
降水量（気象庁）　　&lt;img src='http://www.jma.go.jp/jp/amedas/'&gt;
Googleマップ　　　　&lt;iframe src='https://www.google.com/maps/'&gt;

これらの命令ブロックを組み合わせて、Webページを作成します。この実習を通して、生活の課題をネットワークを活用したプログラミングによって解決する方法を考えさせます。
Emacs の正規表現置換

# 基本的な使い方

Emacs では `query-replace-regexp` コマンドまたはキー `C-M-%` で正規表現置換を実行できる。このコマンドを実行すると、下のようなプロンプトが現れる。

```
Query replace regexp: 
```

ここで正規表現を入力する。たとえば小文字のアルファベットにマッチする正規表現を入れてみる。

```
[a-z]+
```

さらにプロンプトが現れる。

```
Query replace regexp [a-z]+ with: 
```

たとえば空白のまま `RET` を押す。すると、カーソル現在地から下に向かって検索が行われ、マッチした時点で次のようなプロンプトが表示される。

```
Query replacing regexp [a-z]+ with : (? for help)
```

ここで y を押すと置換が実行され n を押すとスキップして次のマッチを探す。! を押すと、以降のプロンプトをすべて y で答えたとみなして置換する。

# マッチした文字列を再利用する

たとえば下記の文の "" を「」に置き換えることを考えよう。

```
"hoge"
"fuga"
"moge"
```

その場合は、下記のような正規表現置換を使うとうまくいく。

```input.regexp
"\(.*\)"
```

```output.regexp
「\1」
```

ここで `.*` は任意の文字列を表している。
パターンマッチを取るためには `\(` `\)` で囲まなければならない。


# 応用: org-mode のリンクを markdown 形式のリンクにする

- org でのリンクは `[[リンクURL][リンク文字]]` 
- markdown でのリンクは `[リンク文字](リンクURL)`

となっているため互換性がない。org-mode でメモを取っていたのだがサイトに投稿するときはやむなく markdown に変換しなければならない、ということがある。そのような場合に毎回手書きで直すのは大変なので自動化したい。その目的だけなら `org-md-export-to-markdown` というコマンドが用意されているので、これでよいのだが勉強のために正規表現だけでそれを実現する。

とてもわかりにくいのでまずエスケープなしで考える。org-mode でのリンクは `[[リンクURL][リンク文字]]` の形式であるから正規表現は下のようになる。

```
[[(.+)][(.+)]]
```

マッチさせるだけならカッコ `(` と `)` は不要だが、リンクURL、リンク文字列を抜き出して利用するときに必要なので与えている。これをエスケープすると下記の形式になる。

```input.regexp
\[\[\(.+\)\]\[\(.+\)\]\]
```

カッコで囲まれたパターンにマッチした文字列は Emacs では `\1`, `\2`, `\3`, ... と書けば参照できる。これを使うとmarkdown でのリンクは、下記の通り書ける。

```output.regexp
[\2](\1)
```

`query-replace-regexp` を手打ちする場合はこれでよいのだが、この正規表現を覚えておくのは不可能なので、lisp の関数を作ってみることにした。その場合は正規表現を文字列として書かなければならないため、バックスラッシュに対してエスケープが必要になる。最終的には、次のような関数を作った。

```elisp
(defun replace-link-from-org-to-markdown ()
  (interactive)
  (push-mark)
  (goto-char (point-min))
  (replace-regexp "\\[\\[\\(.+\\)\\]\\[\\(.+\\)\\]\\]" "[\\2](\\1)")
  (pop-mark))
```

これを `init.el` に書き込んでおけば、関数 `replace-org-to-markdown` を呼ぶだけでリンクを置換できる。

ついでに他の記号についても置き換えるように関数を拡張して、最終的には下のような実装にした。

```elisp
(defun replace-org-to-markdown ()
  (interactive)
  (save-excursion
    (let (replacement)
      (setq replacement
            '("^* "                                "# "
              "^** "                               "## "
              "^*** "                              "### "
              "^**** "                             "#### "
              "^***** "                            "##### "
              "#\\+BEGIN_SRC"                      "```"
              "#\\+END_SRC"                        "```"
              "\\[\\[\\(.+\\)\\]\\[\\(.+\\)\\]\\]" "[\\2](\\1)"))
      (while replacement
        (goto-char (point-min))
        (replace-regexp (pop replacement) (pop replacement))))))
```
macOS Catalinaで死んだLilypondをDocker上で動かす

# 背景
macOS Catalinaにおいて、32-bit アプリケーションが切り捨てられたことを受けて[LilyPondが死にました。](http://lilypond.1069038.n5.nabble.com/lilypond-does-not-work-with-Mac-OS-10-15-Catalina-td224189.html)
ということでDockerを使って動かそうという話です。
使用したDockerfile等は[seekworser/lilypond-dockerfile](https://github.com/seekworser/lilypond-dockerfile)に登録してあります。

# Implementation

基本的にはDocker image上でLilyPondを動かすだけですが、なるべく意識せずに動かせるように、

- Docker image上に/lilypondディレクトリを作成
- Host側のカレントワーキングディレクトリを/lilypondにマウントし、container起動時に/lilypond内でlilypondコマンドを実行

ということをしています。実際に使用したDockerfileは次の通りです。

```dockerfile:Dockerfile
from ubuntu:bionic
copy entrypoint /entrypoint

run sed -i.bak -e "s%http://archive.ubuntu.com/ubuntu/%http://ftp.jaist.ac.jp/pub/Linux/ubuntu/%g" /etc/apt/sources.list \
    && apt update \
    && apt -y install lilypond \
    && chmod +x /entrypoint

entrypoint ["/entrypoint"]
```

```bash:entrypoint
#! /bin/bash
cd /lilypond
lilypond "$@"
```

また、起動時にいちいちdockerコマンドを打つのは面倒なのでHost側のlilypondを書き換えておきます。（Host側にインストールしていたlilypondはアンインストールしておきます。）

```bash:lilypond
#! /bin/bash
docker run --rm -v $(pwd):/lilypond seekworser/lilypond "$@"
```
上記のファイルを作成して/usr/local/binに置き、chmod +xすれば完成です。
<img width="570" alt="Screen Shot 2020-04-05 at 15.19.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278556/f9b5206f-b738-3a6a-1743-75719d25e695.png">

macOS Catalina上でlilypondが動きました！

# やってみて

○ 元々、別でインストールしていたLaTeXのghostscriptとLilyPondのghostscriptが2つあって、参照がぐちゃぐちゃになっていた（一回それでハマった）ので、Docker上で環境を分離できたのはよかった。
○ 想定していたほど起動が遅いわけではない。

× Docker image上にLaTeXを別でインストールする関係で、Docker imageのサイズが1.3 GBくらいある。（確か元々はlocalのLaTeXが使えてた...はず）
DynamoDB queryパラメータまとめ

# はじめに

今さらだがDynamoDBのクエリパラメータについてまとめる。
既に他の人が同じような記事を書いているかもしれないが、
AWSのドキュメントを読んでいて、
「分かりづらいから一覧でまとめてくれ！！」と思い
あくまで自分のためのメモとして残す。
他のDB操作パラメータについては必要が出てきたら追記するつもり。


# Query Parameters

## TableName

* 文字通りテーブル名を指定する

## KeyConditionExpression

* プライマリーキー(パーティションキー、ソートキー)、セカンダリーインデックスに対する条件式を記述する
* DynamoDB予約語でなければ、後述のExpressionAttributeNamesでプレースホルダーを指定しなくてもそのまま使える
* 例
    * ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173520/9aff5b5e-cc30-ecba-d1d2-f2792b96081e.png)
    * :main, :subはExpressionAttributeValuesで宣言する
    * 属性値のプレースホルダーにはコロンが必要

## ExpressionAttributeNames

* KeyConditionExpressionで使う属性名のプレースホルダーを定義する
* オブジェクト文字列で指定する
* #を接頭辞としてつけるのが必須
* 例
    * ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173520/021066bb-7c9c-1400-52d4-f693cb24b6ec.png)
    * この場合、ViewsがDynamoDBの予約語であるため、別名を指定しなければならないという事情もある

## ExpressionAttributeValues

* KeyConditionExpressionで使う属性値のプレースホルダーを定義する
* オブジェクトで指定
* 接頭辞としてコロン:をつけるのが必須
* 例
    * ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173520/6cb7b888-7c92-11dc-dba7-7c9a765a0c17.png)
    * 条件式自体が文字列であるため、そのまま書くと文字列か数値かが判別できないため、型定義(S: 文字列、N:数値)が必要なのだと思われる

## FilterExpression

* テーブルからのクエリ実行後に、APIとしての戻り値をフィルタリングするための条件式を書く
* ExpressionAttributeNames, ExpressionAttributeValuesで定義したプレースホルダーを使って、KeyConditionExpressionと同様にして書ける

## ProjectionExpression

* クエリ結果に対して、出力される属性を指定したい場合に使う
* 例
    * ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173520/81d627d7-3b22-fcc6-0133-25c1a9ff4780.png)

# その他

## DynamoDB DocumentClient

* ExpressionAttributeValuesで指定していた型宣言が不要になる
* 上記の例だと、次のようになる
    * ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173520/9704f682-3c50-5c1e-b557-003f77b18df3.png)
Macのdiffツール「meld」インストールメモ

## (必要であれば)Homebrewをアップデート

```
brew update
```

## 次にHomebrew-Caskをインストール

```
brew tap caskroom/cask
```

#### もしインストール時、権限エラーになった際は下記コマンドを実行する

```
sudo chown -R $(whoami) /usr/local/Cellar
sudo chown -R $(whoami) /usr/local
```

## meldインストール
```
brew install caskroom/cask/meld
```

## meld を起動する
ターミナルで下記コマンドを実行

```
meld
```

meldのウィンドウが立ち上がります。
Vuetifyの基本的な使い方とよく使いそうなところのドキュメントのメモ

#Vuetifyとは
[公式ページ](https://vuetifyjs.com/en/)

Vue.jsの[マテリアルデザイン](https://material.io/design/)用のフレームワークです。React.jsの[MATERIAL-UI](https://material-ui.com/)のVueバージョンと言ったところです。

Vuetifyを使用する最大のメリットはCSSを書かなくても、整ったUIを作成することができるということです。

#Vuetifyの導入

VueCLIはインストール済を想定してます。


```
//プロジェクトの作成
$ vue create my-app //「my-app」は何でもいいここの名前でプロジェクトが作成される
```
```
//vuetifyの追加
$ vue add vuetify
```
Nuxt.jsなどで導入するときは[こちら](https://vuetifyjs.com/en/getting-started/quick-start/)を参考


#サンプル

##画面
![スクリーンショット 2020-04-05 14.55.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307699/c3583f1a-acba-fd00-6fdd-12362683c0ee.png)


##コード

```vue:Home.vue
<template>
  <div class="home">
    <h1>HomePage</h1>
    //v-btnでボタンが作れる
    //classにpinkをあてることでピンク色に、white--textをあてることでテキストが白に
    <v-btn class="pink white--text">click me</v-btn>
    //textをつけるで背景色と影がなくなる colorで色を指定
    <v-btn text color="pink">click me</v-btn>
    // depressedをつけることで影がなくなる
    <v-btn depressed class="pink white--text">
      //v-iconでアイコンをつける mdi-emailでemaiのアイコン
      <v-icon left>mdi-email</v-icon>
      <span>EMAIL ME</span>
    </v-btn>
    //fabをつけることで丸くできる
    <v-btn fab depressed small dark color="purple">
      //v-iconでアイコンをつける mdi-heartでハートのアイコン
      <v-icon>mdi-heart</v-icon>
    </v-btn>
  </div>
</template>

<script>

export default {
}
</script>

```


#勉強方法
[チュートリアル](https://www.youtube.com/watch?v=2uZYKcKHgU0&list=PL4cUxeGkcC9g0MQZfHwKcuB0Yswgb3gA5)をやるのが手っ取り早いです。

英語ですが、画面に映っている通りにやっていけば大体のことは理解できます。
また、画面通りにやって上手くいかない時には、コメントを見れば、解決できることが多いです。

#よく使うそうな部分のドキュメントメモ
下記は私がよく使いそうだと感じる部分のドキュメントのリンクのメモです。
大体は下記のドキュメント、サンプルコードを読むことで大体理解できるかなぁと思います。
Codepenへのリンクにとんで実際にコードをイジってみるのも面白いです。

色
https://vuetifyjs.com/ja/styles/colors/#colors

文字サイズ
https://vuetifyjs.com/ja/styles/typography/#font-sizes

ボタンとicon
https://vuetifyjs.com/ja/components/buttons/#buttons

フォーム
https://vuetifyjs.com/ja/components/forms/#forms

ファイルを使うフォーム
https://vuetifyjs.com/ja/components/file-inputs/#file-inputs

#使い勝手良さげ
自分の手でCSSを書かなくていい分、慣れれば工数を削減できる可能性高いなと思います。
かなり凝った表現が必要、とかでない限りはこういったフレームワークを使うのはアリなんじゃないかなぁと思います。
JavaScriptの浮動小数点数を符号なし64ビット整数で表現したい

## はじめに
JavaScriptにおける数値は、倍精度浮動小数点数しかないわけですが、倍精度浮動小数点数を構成するビット列を符号なし64ビット整数で表現した値が欲しいという場面がありました。このやり方について調べたので、記事にしてみました。

## 変換方法
```javascript
function DoubleToBigInt(f)
{
  var buf = new ArrayBuffer(8);
  (new Float64Array(buf))[0] = f;

  lower = BigInt((new Uint32Array(buf))[0]);
  upper = BigInt((new Uint32Array(buf))[1]);

  return (upper << BigInt(32)) | lower;
}
```

上記のコードでは、`ArrayBuffer`を経由して、倍精度浮動小数点数から2つの符号なし32ビット整数に変換しています。`upper`は倍精度浮動小数点数の上位32ビット、`lower`は倍精度浮動小数点数の下位32ビットです。残念ながら、`Uint64Array`なんてものはありませんから、こうするしかないですね…

2つの符号なし32ビット整数に変換した後は、これらの値を`BitInt`に変換して符号なし64ビット整数の値を表現しています。

この関数の戻り値を確認してみましょう。

```javascript

var f = 0.1234567;
console.log(DoubleToBigInt(f)); // 4593560413433027186n
```

`4593560413433027186`という値になりましたが、これが正しいのかC言語のコードで検証してみます。

```c
#include <stdio.h>

union {
  double d;
  unsigned long l;
} val;

int main(void) {
  val.d = 0.1234567;
  printf("%ld\n", val.l);
  return 0;
}
```
上記のコードをコンパイルして、実行してみます。

```shell
$ gcc test.c
$ ./a.out
4593560413433027186
```
JavaScriptコード側の出力と一致しました。

## おわりに
これをやろうと思ったのは、[ももテク](http://inaz2.hatenablog.com/entry/2016/03/07/194034)の記事を参考にJavaScriptの`Math.random`関数(XorShift128+)の内部状態を復元しようとしたためです。浮動小数点数表現で出力されるよりは、整数値で出力された方が解析しやすいかなと思いました。

なにはともあれ、上記のコードで浮動小数点数 -> 符号なし64ビット整数への変換ができたので、一件落着です。

## 追記 (2020/04/05 15:38)
@uhyo さんから`BigUint64Array`の存在を教えていただきました。ありがとうございます！`BigUint64Array`を使えば、`DoubleToBigInt`関数を以下のようにもっと簡潔に書けます。

```javascript
function DoubleToBigInt(f)
{
  var buf = new ArrayBuffer(8);
  (new Float64Array(buf))[0] = f;

  return (new BigUint64Array(buf))[0];
}
```

## 参考サイト
https://stackoverflow.com/questions/2003493/javascript-float-from-to-bits
https://qiita.com/uhyo/items/f9abb94bcc0374d7ed23
Ruby と Perl で解くAtCoder ABC 161 D 幅優先探索

# はじめに
*[AtCoder](https://atcoder.jp/home)* の AtCoder Beginner Contest 161 の D問題が解けなかったので、復習を兼ねて投稿しました。

# お礼
オフィシャルの解説やネット上の解説・解答を参照して理解を進めております。
**AtCoder** さん、競技プロプレイヤーさん、ありがとうございます。

# なぜTLE
ループを三重にしていることもありますが、***Perl*** では、最小公倍数を求める関数が準備されていないことも要因に挙げられます。

# 幅優先探索
幅優先探索といえば、次のようなマップ・迷路問題で使用されます。

```map
#...#.#
..#...#
.#..#..
```
所謂、ある地点での上下左右において、**.** だったらキューに追加、**#** だったらキューに追加しない、というふうな解法を行います。

今回の D問題はそれを応用させ、末尾の数字 (仮に 3とします) のルンルン数 (2, 3, 4) をキューに追加することにより解いていきます。

また、マップ・迷路問題ではゴールにたどり着いた時点もしくは、全マップを探索した時点でループを終了しますが、今回は K番目に到達した時点でループを終了します。

今回のD問題
*[AtCoder Beginner Contest  D - Lunlun Number](https://atcoder.jp/contests/abc161/tasks/abc161_d)*
# Ruby
```Ruby.rb
k = gets.chomp.to_i
cnt = 0
que = []
(1..9).each do |i|
  que.push(i)
  cnt += 1
  if cnt == k
    puts i
    exit
  end
end
while que.size > 0 do
  n = que.shift
  if n % 10 == 0
    cnt += 1
    if cnt == k
      puts n * 10
      exit
    end
    que.push(n * 10)
    cnt += 1
    if cnt == k
      puts n * 10 + 1
      exit
    end
    que.push(n * 10 + 1)
  end
  if n % 10 != 0 && n % 10 != 9
    cnt += 1
    if cnt == k
      puts n * 10 + n % 10 - 1
      exit
    end
    que.push(n * 10 + n % 10 - 1)
    cnt += 1
    if cnt == k
      puts n * 10 + n % 10
      exit
    end
    que.push(n * 10 + n % 10)
    cnt += 1
    if cnt == k
      puts n * 10 + n % 10 + 1
      exit
    end
    que.push(n * 10 + n % 10 + 1)
  end
  if n % 10 == 9
    cnt += 1
    if cnt == k
      puts n * 10 + 8
      exit
    end
    que.push(n * 10 + 8)
    cnt += 1
    if cnt == k
      puts n * 10 + 9
      exit
    end
    que.push(n * 10 + 9)
  end
end
```
キューに *push* して *while* で回して *shift* で取り出す要領で、幅優先探索を実行します。
# Perl
```Perl.pl
use v5.18; # strict say state
use warnings;
use List::Util qw(reduce first max min sum0);

chomp (my $k = <STDIN>);
my @que;
my $cnt;
for my $i (1..9) {
  push @que, $i;
  $cnt++;
  if ($cnt == $k) {
    say $i;
    exit;
  }
}
while (@que) {
  my $i = shift @que;
  if ($i % 10 == 0) {
    $cnt++;
    if ($cnt == $k) {
      say $i.'0';
      exit;
    }
    push @que, $i.'0';
    $cnt++;
    if ($cnt == $k) {
      say $i.'1';
      exit;
    }
    push @que, $i.'1';
  } elsif ($i % 10 != 0 && $i % 10 != 9) {
    $cnt++;
    if ($cnt == $k) {
      say $i.($i % 10 - 1);
      exit;
    }
    push @que, $i.($i % 10 - 1);
    $cnt++;
    if ($cnt == $k) {
      say $i.($i % 10);
      exit;
    }
    push @que, $i.($i % 10);
    $cnt++;
    if ($cnt == $k) {
      say $i.($i % 10 + 1);
      exit;
    }
    push @que, $i.($i % 10 + 1);
  } else {
    $cnt++;
    if ($cnt == $k) {
      say $i.'8';
      exit;
    }
    push @que, $i.'8';
    $cnt++;
    if ($cnt == $k) {
      say $i.'9';
      exit;
    }
    push @que, $i.'9';
  }
}
```
***Perl*** の方は、数字を文字としても扱う様なコーディングにしています。

||Perl(文字)|Perl(数字)|Ruby|
|:--:|:--:|:--:|:--:|
|実行時間|56 ms|42 ms|25 ms|
ここでは、***Ruby*** が速い結果となりました。
# まとめ
+ ABC 162 C を解いた
+ メモ化の応用ができるようになった

参照したサイト
*[Rubyの配列で使えるメソッド、二次元配列の使い方](https://qiita.com/dddisk/items/8ad2d5570edf3c577eea)*
Microsoft Teams | 10分でできる Microsoft Teams を使った授業 | 教材の共有

# はじめに

本記事では、Microsoft Teams を授業でどのように利用していくかについて解説していきます。
今回は**「教材の共有」**について説明していきます。

以下の記事も参照してください。

- [10分でできる Office 365 Education A1 の利用開始手続き](https://qiita.com/hisaho/items/74b6ba9ba9b4f501f74c)
- [10分でできる Office 365 Education のユーザー登録](https://qiita.com/hisaho/items/58e4e4024ee73280ece7)
- [Microsoft Teams | 10分でできる 授業で利用するチームの準備する](https://qiita.com/hisaho/items/2667f3d8979aa92f79c2)

# 授業で使用する資料をアップロードする

- Microsoft Teams for Education には、一般の Microsoft Teams では利用できない教育機関向けの機能が用意されています。その1つが**[クラス教材のアップロード]**です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/b8cdb6fd-fc88-6c8d-8c48-53b769b66bd8.png)

- **[クラス教材のアップロード]** をクリックすると、新しく**「クラスの資料」**という名前のフォルダーが作成されます。このフォルダーは、教員はファイルをアップロード、ファイルの編集することが可能ですが、学生は閲覧することしかできません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/75963d7f-b1f4-8228-a278-5a13cc80ebe3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/81be3857-0653-5262-5271-3965502bee3b.png)

- 学生が**「クラスの資料」フォルダ**のファイルにアクセスした場合には、このように**[読み取り専用]**のアイコンが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/708aaad2-7d76-ffbe-5fd7-1e1a9f8a64fb.png)

- 実際にはこのように授業日ごとにフォルダを作り、そこに教材を入れておくとよいかもしれません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78535/07f4415a-28b9-5b2d-9d4c-5b67e33145d8.png)
docker-composeでFastAPIの環境を構築する

# FastAPI？

モダンで高速なPythonのWebフレームワークだそうです。
最近人気らしいので業務で採用してました。

公式ドキュメント
https://github.com/tiangolo/fastapi

メンバーによって環境が違って導入をスムーズに進められなかったんですが、
Dockerを使ってみんなで同じ作業環境を共有できるようになったのでそのメモです。

# 作成したファイル

公式の手順に沿って進めていきます。  

最終的にこんなファイル構造になっていればOKです。
超シンプル。
<img width="195" alt="スクリーンショット 2020-03-30 16.30.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302049/74034119-2a3f-53c7-c179-89334d2686e5.png">

## Dockerfile

公式ドキュメントの[Installation](https://github.com/tiangolo/fastapi#installation)の項目に記載されているモジュールをインストールさせます。
ビルト時に勝手に走るので手動で必要モジュールを探す必要なくて便利ですね。

```Dockerfile:Dockerfile
FROM python:3.7
WORKDIR /var/www/html
RUN pip install fastapi uvicorn
```

## main.py

こちらも[Example](https://github.com/tiangolo/fastapi#example)の項目を参考に書きます。
ルートにアクセスされるとHelloWorldのオブジェクトを返却するAPIですね。


```python:main.py
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
  return {"Hello": "World"}
```

## docker-compose.yaml

`Dockerfile`と`main.py`の橋渡し的なことをしています。

Dockerfileを使ってPythonのモジュールをインストールした後、
[Run it](https://github.com/tiangolo/fastapi#run-it)の項目を参考にしてFastAPIサーバを起動するコマンドを叩かせます。

ここではポート9004で起動するよう設定しています。

```yaml:docker-compose.yaml
version: '3'

services:
  app:
    container_name: FastAPI
    build: ./docker
    volumes:
      - ./src:/var/www/html
    ports:
      - "9004:9004"
    command: uvicorn main:app --reload --host 0.0.0.0 --port 9004
```

# 動作確認

docker-composeでコンテナを起動・ビルドします。

```bash
$ docker-compose up --build

Creating network "docker_fastapi_default" with the default driver
Building app
Step 1/3 : FROM python:3.7
 ---> 879165535a54
Step 2/3 : WORKDIR /var/www/html
 ---> Using cache
 ---> 31d5c58e6177
Step 3/3 : RUN pip install fastapi uvicorn
 ---> Using cache
 ---> 430430eecf7f
Successfully built 430430eecf7f
Successfully tagged docker_fastapi_app:latest
Creating FastAPI ... done
Attaching to FastAPI
FastAPI | INFO:     Uvicorn running on http://0.0.0.0:9004 (Press CTRL+C to quit)
FastAPI | INFO:     Started reloader process [1]
FastAPI | INFO:     Started server process [7]
FastAPI | INFO:     Waiting for application startup.
FastAPI | INFO:     Application startup complete.
```

必要なモジュールがインストールされ、FastAPIサーバが起動しました。

curlコマンドでアクセスしてみましょう。

```bash

$ curl http://localhost:9004

{"Hello":"World"}
```

`main.py`の定義通りの反応！

# まとめ

FastAPIを使って簡単にAPIサーバを立ち上げられました！
Dockerを使えば少ないファイルで同じ環境を共有できるのもいいですね:sparkles:

Pythonではシェルスクリプトも実行できるので、
自動デプロイ用のコマンドとか実装して「擬似Jenkins」みたいなこともできて便利です。
~~Jenkins使えばいいじゃんとか言ってはいけない~~

# 参考URL

* [GitHub | FastAPI](https://github.com/tiangolo/fastapi)
* [Docker Hub | python](https://hub.docker.com/_/python)
Atcoder ABC161 D問題

##AtCoder ABC161 D問題

問題はこちら

https://atcoder.jp/contests/abc161/tasks/abc161_d

一桁なら1-9まで全てOK.
2桁以上は前の桁に応じて-1,0,1を足したものをお尻につけてやれば良い

queueを使えばよかったのだが気合いで実装したがあと30秒のところでオーバーフローに気づきthe end.みんなqueueを使おう。
最初、1-9までを9につめて、そのあと
step 1.頭から数字を取り出す
step 2.取り出した数字getに対して、10*get+((get%10)+l)をする。ただしl=-1,0,1。((get%10)+l)は1の位なので、-1や10の場合は除外する必要があるので注意。
step 3.1,2を繰り返しK回目で終了

queueで実装したコードを下に載せておく。

```C++
#include <bits/stdc++.h>
#define rep(i,n) for (int i=0;i<(n);i++)
using namespace std;
typedef long long ll;

int main(){

  ll K=0;
  cin>>K;
  
  //queue作成 
  queue<long long> que;
  //1-9をqueueに詰めておく
  rep(i,9){que.push(i+1);}
  
  ll get=0;

　//step 1,2をK回繰り返す
  rep(i,K){

　　 //step 1
    get=que.front();
    que.pop();

    //step 2
    int d=get%10;
    for(int l=-1;l<=1;l++){
    	
      int j=d+l;
      if(j<0 || j>9)continue;
      que.push(get*10+j);
  	}
  }


  cout<<get<<endl;
  
}


```
【爆速メモ】windowメニューからpackage managerが消えた時

windowメニューからpackage managerが消えた時、
1. 新規でプロジェクトを作成する
2. 新しく作成されたプロジェクト内の[Packages]フォルダのmanifest.jsonファイル内のテキストをコピーする
3. package managerが消えたプロジェクトのmanifest.jsonファイルにペーストする

もろもろバックアップは念のためとっておきましょう。