OmniAICreator/Qiita-1.07M huggingface dataset:
kotlinとjavaで関数を作りたい！

# はじめに…

この記事は[3個前の記事](https://qiita.com/sato-na/items/cc23f9b1db9c948dc00e)で書いた、

**7日間毎日記事投稿の4日目**

になってます

使うコードは下に貼りますが、このアプリの詳しい機能はその3個前の記事をご覧ください！

- java版 : https://github.com/sato-na/guruwake_java

- kotlin版 : https://github.com/sato-na/guruwake_kotlin

↓ここからが今回の記事の本題です↓

# それぞれの言語で関数を作るには…

- javaの場合

```java
修飾子 戻り値の型 関数名(引数, 引数, …) {
    関数の内容
    return 戻り値
}
```

例)
※ 引数なし、戻り値なしの関数を定義している

```java:WhoActivity.java
private void addMember() {  // 78行目
    EditText memberET = findViewById(R.id.member_et);
    ListView memberLV = findViewById(R.id.member_lv);
    memberL.add(memberET.getText().toString());
    memberET.getEditableText().clear();
    ArrayList<String> memberLR = (ArrayList<String>) memberL.clone();
    Collections.reverse(memberLR);
    ArrayAdapter<String> adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, memberLR);
    memberLV.setAdapter(adapter);
    }
```

- kotlinの場合

```kotlin
fun 関数名(引数:型, 引数:型, …): 戻り値の型 {
    関数の内容
    return 戻り値
}
```

例)
※ 引数なし、戻り値なしの関数を定義している

```kotlin:WhoActivity.kt
fun addMember() {  // 52行目
    memberL.add(member_et.text.toString())
    member_et?.text?.clear()
    var memverLR = ArrayList<String>(memberL)
    memverLR.reverse()
    var adapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, memverLR)
    member_lv.adapter = adapter
}
```

書き方は大きく違うが、関数定義時に必要な情報はほとんど変わらない。

# 最後に…

今回はjavaとkotlinで関数の定義をしました。
引数の種類・戻り値の種類によって様々な機能の関数を定義できるので、これからも多用できたらなと思います。

明日も記事を投稿するので、引き続き温かく見守ってください。
Cloud9でのHeroku操作

railsチュートリアルでherokuの操作をしきりに行うので、改めてCloud9でのHerokuの操作を整理しました。

<h2>前提</h2>
・Cloud9での操作であること
・Herokuに登録済みであること

<h2>【初回設定】</h2>

・クラウド上にHerokuをインストール

```
source <(curl -sL https://cdn.learnenough.com/heroku_install)
```

・インストールできたかの確認(バージョン確認)

```
heroku -v` or `heroku --version
```

・ログインとSSHキーの追加

```
heroku login --interactive #コマンド送信後mailアドレスとpasswordを入力する
heroku keys:add
```
・アプリを作成

```
heroku create #アプリ名は自動で決まる
or
heroku create (任意のアプリ名)
※ここで、表示されるURLがアプリのURLになる。
 remote:        https://********/ deployed to Heroku　⇦これがURL
```

<h2>デプロイ（変更を適用）</h2>
・gitに追加
`git add (ファイル名 or 全て)`

・gitにコミットする
`git commit -m "コメント"`

・herokuにpushする
`git push heroku master`

<h2>データベースに変更を適用する</h2>
・herokuにマイグレーションを実行する

```
 heroku run rails db:migrate
```

※自分はここがうまくいかなかったので以下で説明されているコマンドを実行しました。
https://qiita.com/bdogrep/items/8620dbba5e4c3fd859df
ありがとうございます。
意外と知らないVBの変遷とそれぞれの用途について

システム開発を行う上でVB（Visual Basic）という言語を良く耳にするのではないでしょうか。
VBはVBでもVB.NET、VBA、VBScriptとVBにも色々違いがあり、意外と知らないこともあったのでまとめてみました。

##VB（Visual Basic）の歴史##
1990年年代にMicrosoftが開発していたプログラミング言語であり、BASIC→Quick Basic→VBという変化を遂げてきました。
「**Visual**」と名の付く通りボタンやテキストボックスをマウスで配置していくことにより、**視覚的に**アプリケーションを開発することができます。
自然言語にも近く馴染みやすい言語である事から、初学者にも優しい作りになっています。

従来「Visual Studio」という開発ツールを用いて開発しておりましたが、2019年4月以降「Visual Studio 2019 Community」というツールでも開発可能となっています。
VBAやVB.NET、VBScriptなどは、どれもVBからそれぞれの用途に合わせて改良された言語となります。

##それぞれの歴史と特性##
###VBとVB.NET###
VBはVer1.0~6.0とバージョンアップを重ねており、2002年のバージョンアップにより内部Verでは7.0となり、「**.NET**」というものがつくようになりました。
これが「**VB.NET**」になります。
2005年以降は「.NET」ではなく「Visual Basic 2005」と.NETがつかなくなっていますが、VB.NETと連続性のある言語になっています。

**バージョンアップによるメリット**
・オブジェクト指向への対応
・.NET Framework言語と同じ機能が使える

**バージョンアップによるデメリット**
・.NET Frameworkの標準ライブラリに従ったプログラミングが必要となった。

**VB.NETの主な使用用途**
・Webアプリ
・Windowsアプリ
・スマホアプリ

このように大きな変化を遂げた2002年のバージョンアップは、VB開発者にとって大きな分岐点となりました。
汎用性の高い言語になった一方で、従来のVBプログラマのノウハウが通用しにくいといったデメリットも発生していることから、変化に戸惑う開発者や変化に工数がかかる開発環境も一定数存在していることも事実です。
特に業務に密接に関わっているシステムである場合、変化によるリスクが大きいことから躊躇う企業も多いようです。
しかし、マイクロソフトからのサポート終了によるリスクを考え、重い腰を上げざるをえないといった状況にもなってきており、また一つ節目を迎えようとしています。

さて、VBについての歴史や特性を見てきたのですが、ここからはVBAとVBScriptについても触れていきたいと思います。

##VBAとVBScript##
これらの言語はそれぞれ用途に合わせてVBが改良された言語です。

###VBA(Visual Basic for Applications)###
MicrosoftがMS Officeの拡張機能として提供しているプログラミング言語になります。
VBとの違いは、機能に多少の制限があるものの、MS Officeさえあればすぐに使うことができるといった環境設定のコストが少ないことが挙げられます。
VBの場合は「Visual Studio」という開発環境が必要となりますので、MS Officeが導入されていれば開発を始められる分、コストや手間が少ないことがわかります。
※Word、PowerPoint、Access、Outlook、Internet Explorer、Microsoft Edgeなどにも実装されています。

**VBAの主な使用用途**
Excel業務を効率化するツールを作成する

###VBScript###
VBScript は Visual Basic の構文を真似てつくられた、Windows の「スクリプト言語」です。
誕生の経緯としては、世界で初めて一般に本格的に普及したWebブラウザソフトウェアの一つである、Netscape NavigatorがJavaScriptを初めて実装したことにあり、マイクロソフト社がそれに対抗して**VBScript**を作りました。
ここに関してはWindows版のInternet Explorerでしか動作しなかったことから、JavaScriptへの人気が勝る結果となりましたが、その後Internet Information Server 3.0に実装されたActive Server Pagesの標準の言語として採用されたことで、VBScriptは確固たる地位を確立することとなります。
しかし、2000年頃からVB.NETが推奨されるようになったことから、時代の流れと共にVBScriptは置き換えられ、衰退していきました。

##まとめ##
VBと一括にいっても様々な用途によって住み分けられていることがわかりました。
.NET Framework初期の時代に作成されたデスクトップアプリやWebアプリの保守で利用され続けているVB。近年注目を集めるRPAにVB.NETの記法が取り入れられているものもありますが、言語としての人気の低さに加え、言語の進化が終わることが公式にアナウンスされたため、需要はゆるやかに落ちていくことが予想されます。

##参照記事##
.NET Column
https://www.fenet.jp/dotnet/column/language/884/#VBNET-3
日経クロステック
https://xtech.nikkei.com/atcl/nxt/column/18/01040/102400002/
IT用語辞典　e-Words
http://e-words.jp/
Visual Basicユーザーは要注意、.NET 5より後では使えない可能性 | マイナビニュース
https://news.mynavi.jp/article/20200316-997140/
「Visual Basic」は.NET Coreでもサポートを継続 ～ただし、言語としての発展は終わり - 窓の杜
https://forest.watch.impress.co.jp/docs/news/1240998.html
Stack Overflowプログラム言語人気ランキング2017（好き/嫌い/習得したい）
https://insights.stackoverflow.com/survey/2017#technology-_-most-loved-dreaded-and-wanted-languages
Stack Overflowプログラム言語人気ランキング2020（好き/嫌い/習得したい）
https://insights.stackoverflow.com/survey/2020#technology-most-loved-dreaded-and-wanted-languages-loved
【2020年度版】振り返りフレームワーク手法 まとめ

# はじめに
アジャイル開発で、振り返りの司会を近日やる必要があるのだが、KPTしかまとめ方がわからない人もいるはず。
一言で説明していきます、詳細はリンク記事をつけております。

振り返りは
- レトロスペクティブ(Retrospective)
- Retro（レトロ）
- リフレクション
などとも呼ばれます

## KPT
K: Keep 今後も続けていくこと
P: Problem 問題なこと
T: Try 試してみること
https://seleck.cc/kpt

## KPTA
K: Keep 今後も続けていくこと
P: Problem 問題なこと
T: Try 試してみること
A: Action 行動すること
http://www.kpta.club/#kpta

## KWS
K: KPT
W: Why なぜ分析
S: Solution 対策
https://www.juse.or.jp/sqip/workshop/report/attachs/2011/SQiP1-B.pdf

## KDA
K：Keep 今後も続けていくこと
D：Discard やめること
A：Add 新たに始めること
https://shuchi.php.co.jp/the21/detail/4399?p=1

## GKPT
G: Good よかったこと
K: Keep 今後も続けていくこと
P: Problem 問題なこと
T: Try 試してみること
https://c16e.com/1510132118/

## YWT
Y:やったこと
W:わかったこと
T:次にやること
https://qiita.com/teru855/items/f1e97b275aaaf500c693#ywt

## YWTM
Y:やったこと
W:わかったこと
T:次にやること
M:改善されること（メリット）
https://int128.hatenablog.com/entry/2016/09/27/233140

## YOIT
Y:やったこと
O:起きたこと
I:言えること
T:次にすること
https://hisa-magazine.net/blog/ref/200310/

## FDL
F: Fun 楽しかったこと
D: Done やったこと
L: Learn 学んだこと
https://www.ogis-ri.co.jp/otc/hiroba/others/ActivityPocket/FunDoneLearn.html

## 4行日記
事実: 出来事
気づき: 発見や感想
教訓: 学んだこと
宣言: 自分がありたい姿
https://ferret-plus.com/9262#p7

## タイムライン (テンショングラフ)
X軸: 時系列にイベント
Y軸: 良かったか悪かったか
https://developers.freee.co.jp/entry/timeline-is-a-good-retrospective-method

## KFCC
K…Keep 継続したいこと
F…Failure 失敗したこと
C…Challenge 挑戦したいこと
C…Celebrate チームの他の人の褒めたいこと
https://note.com/ancientscapes/n/n8bae169cd967#4wOPE

## Good & Moyatto
Good: 感謝したいことなど
Moyatto: 気になったこと、問題に感じたことなど
https://hexadrive.jp/author/user001/page/150/

## Mad Glad Sad
Mad: 喜
Glad: 怒
Sad: 哀
https://devblog.thebase.in/entry/2020/07/08/162359

## 学習マトリクス
- 良かったこと、続けたいこと
- 変えたいこと
- 気付き
- 感謝
https://www.cresco.co.jp/blog/entry/12584/

## +/Δ (プラス/デルタ)
+：続けたいこと
Δ：変えたいこと
https://pmstyle.biz/column/tool/tool96.htm

## GC
G： Good 良かったこと
C： Change 変えたいこと
https://hisa-magazine.net/blog/ref/2850/

## 満足ヒストグラム
1 不満 <-> 5 満足
https://qiita.com/kanishionori/items/9900c6a8d1e7a4e9dda6#%E6%BA%80%E8%B6%B3%E3%83%92%E3%82%B9%E3%83%88%E3%82%B0%E3%83%A9%E3%83%A0

## 感謝
感謝: 感謝したいこと
https://qiita.com/mistletoe/items/4277eac0b69dfa93d50c#%E4%BD%9C%E3%81%A3%E3%81%9F%E3%82%82%E3%81%AE

## 3WHATs
- What? 事実
- So what? 解釈
- Now what? 行動

http://listfreak.com/list/1490?utm_source=feedburner&utm_medium=twitter&utm_campaign=Feed%3A+listfreak%2Fkoji+%28koji%27s+lists+from+*ListFreak%29
AWS初心者が概要をざっくりまとめる（メモ書き）

#はじめに
AWSについて最低限の知識を得るために、AWS認定資格の1つである「クラウドプラクティショナー」の対策本を読み、ざっくりまとめたいと思います。

####■セキュリティ
AWSではセキュリティの責任の所在を、AWS社とユーザで分けている。
‐AWS対応：データセンターの設備・環境・ハードウェア、ハイパーバイザー
‐ユーザ対応：上記以外のもの（OS、アプリケーション、ユーザのID・パスワードなど）
ただしAWSが提供するサービス内容（マネージドかそうでないか）に依って線引きは異なり、基本的にはユーザが触れられない部分をAWS、それ以外をユーザが担当する形となっている。

「IAM」（クラウドへのアクセス管理サービス）を設定することで、様々なサービスへのアクセス権を一括で制御することができる。
そのほか、DDos攻撃から保護する「AWS Shield」や、ファイヤウォール機能を果たす「AWS WAF」などのサービスがある。


####■リージョンとアベイラビリティゾーン
リージョンは全世界にあり、リージョン内には必ず2つ以上のアベイラビリティゾーン（AZ）が存在する。また、1つのAZは複数のデータセンターから構成されている。（データセンター単位、AZ単位で停電や自然災害などの障害が起こった場合の可用性を担保するため）
ユーザは任意のリージョンを選択して使用することができる。また複数のリージョンを使用することも可能。（東京とサンパウロなど）

####■VPC
「Amazon Virtual Private Cloud」の略。プライベートなネットワーク環境。リージョン内の複数のAZをまたがって構築可能。
1つのVPCに対してインターネットゲートウェイを1つのみ作成する。
サブネットは、VPCで設定したIPアドレスの範囲内で、AZとIPアドレスを指定して作成する。リソースに応じて、外部接続できる「パブリックサブネット」と、外部接続せずにリソースを保護する「プライベートサブネット」に分けることが可能。

###主なサービス
####■EC2
「Amazon Elastic Compute Cloud」の略。サーバ。
主なメリット：
・必要な時に必要なだけ利用可能
→不足や遊びを減らして柔軟に対応できる。

・コストは使用した分だけ
→インスタンスの稼働時間単位で課金。アウト通信（リージョンの外部）で転送料金が発生。

・変更可能なインスタンスタイプから性能を選択
→運用しながら適切なタイプに変更可能。インスタンスタイプによって課金単価が異なる。

・セキュリティグループでトラフィック制御可能
→複数のインスタンスをセキュリティグループと設定し、トラフィックのインバウンド制御可能。

・数分で調達と起動が可能
・世界中のリージョンから起動場所を選択可能
・AMIによっていくつでも同じサーバを起動可能

####■ELB
「Elastic Load Balancing」の略。負荷分散装置。
・ロードバランサータイプ
→HTTP・HTTPSのリクエストでは「Application Load Balancer」、それ以外のTCP通信では「Network Load Balancer」を用いる
・ヘルスチェック
→正常なインスタンスかの判断
・インターネット向け/内部向けの選択可能
→ELBのDNS名にパブリックIPアドレスとプライベートIPアドレスどちらが紐づくかで設定が変わる
・クロスゾーン負荷分散
→AZを超えて負荷分散することが可能

####■Auto Scaling
EC2インスタンスを必要に応じて自動で増減することが可能。（数の増減＝水平スケーリング）
どのようなインスタンスを、どこで、どのタイミングで起動するのかを事前に設定する。

####■Lambda
ソースコードさえ用意すれば、自動で実行してくれるサービス。
主なメリット：
・サーバ構築/管理が不要
→OS、ミドルウェアインストール、セキュリティパッチ適用などの対応不要

・一般的な言語に対応
→C#、Java、python、Rubyなどで実行可能

・並列処理
複数リクエストを並列処理可能、自動でスケーリングを行う

・ミリ秒単位で課金
実行されている時間単位で課金され、待機時間は課金対象とならない

・他のAWSサービスとの連携
→S3へのデータアップロード、特定の時間などをトリガーとし、サービス同士をつなげることが可能

####■S3
「Amazon Simple Storage Service」の略。完全マネージド型のオブジェクトストレージ。
主なメリット：
・ストレージ容量が無制限
→上限がないため、容量の不足を気にせず利用することができる。

・高耐久性
→オブジェクトは複数のAZに保存されるため、バックアップや冗長化等を意識しなくてよい（耐久性99.99999999999％）

・インターネット経由でアクセス可能

セキュリティ対策：
・アクセスコントロールリスト（ACL）
→バケット・オブジェクト単位で、読み取り・書き込み権限の制御可能
・バケットポリシー
→ACLよりも細かい単位（任意のディレクトリ以下のオブジェクトなど）で制限可能

料金体系：
・ストレージ料金
→1か月の平均保存料で算出。アクセス頻度が異なるストレージクラスやリージョンによって単価は変わる。
・リクエスト料金
→データのダウンロード・アップロードのリクエストで発生。
・データ転送料金
→リージョン外へ転送した場合に発生。

####■RDS
「Amazon Relational Database Service」の略。
MySQL、Oracle、PostgreSQLなどのメジャーどころを利用可能。
EC2にDBをのせることも可能だが、その場合はミドルウェアの管理が必要となる。RDSではその部分が不要となる。また、バックアップもデフォルトで7日間自動で適用される。

####■DynamoDB
非リレーショナルデータベース、NoSQL型のデータベースサービス。1つのデータは項目として格納され、キーに紐づく属性は動的で不定形。厳密なトランザクションには向かないが大量のアクセスがある場合には有効。


#あとがき
かなりざっくり、そしてポイント絞っていますが、導入の導入くらい（？）は認知できたんじゃないかなと思っています。
（そもそもインフラ側の人間ではないので、インスタンスの意味がわからなかったりしましたが、それを知れただけでもヨシ！としましょうね。。）
Static Web Appsでは現状TimerTriggerは使えないっぽい - LINE BOT不向き説


[Azure Functions のタイマー トリガー](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-bindings-timer?tabs=javascript)を使ってStatic Web Appsに紐づいたAPIプログラムもタイマー実行できないかと思いましたがどうやらできないっぽいのでメモ。

ビルドでこんなコケかたします。

```
Error in processing api build artifacts: the file 'myTimer/function.json' has specified an invalid trigger of type 'timerTrigger' and direction 'in'. Currently, only httpTriggers are supported. Visit https://github.com/Azure/azure-functions-host/wiki/function.json for more information.
```

ドキュメントを見てみると`トリガーとバインドは、HTTP に限定されています。`としっかりと書いてましたね......

> https://docs.microsoft.com/ja-jp/azure/static-web-apps/apis

![](https://i.gyazo.com/0d578d49875314344dfdd17c013a6246.png)

ちゃんとドキュメントみましょうという教訓をメモにしておきます。

LINE BOTなどで継続的に動作させようと思ってみてたのですが、定期的に眠ってしまう問題は現状だと厳しそう。。

> [Azure Static Web AppsのAPI作成でLINE BOTを作る](https://qiita.com/n0bisuke/items/6237294125c516693b52)
PHPについて簡単にまとめてみた

#プログラミングの勉強日記
2020年8月18日　Progate Lv.226
PHPについて学んだのでまとめる。

#PHPとは
　動的にWebページを生成できるサーバーサイドのスクリプト言語。MySQLといったデータベースとの連携が簡単で、Webアプリケーション開発によく使われる。
　PHPはアクセスのタイミングや状況によって表示内容が変わるように（動的に）Webページを生成するのに対してHTMLはいつだれが見ても同じように表示されるページを（静的に）表示している。HTMLのファイルの中にPHPを埋め込むことで、PHPによって動的にHTMLを生成して表示することができる。

#PHPの基本的なルール
　拡張子は`.php`をつける。<font color=blue>コードの最後にセミコロンを付ける。</font>

```php
<?php
  //ここに記述する
?>

<?php
  echo '<p>Hello World</p>';
?>
```

#変数のルール
1. `$`から書き始める
2. 使用できる文字はa~z,A~Z,0~9,_
3. 数字は先頭に使えない
4. 日本語も使えるがあまり使わないほうがいい

　変数名の規則は決まっていないが、できるだけ短くわかりやすいものにする。

#if-else文　while文
　基本的にはC言語と変わらないので簡単にまとめておく。
　if文は、指定した条件式が当てはまるかどうかを見る。

```php:if-else文の基本的な書き方
<?php
  if(条件式){
  }
  elseif(条件式){
  }
  else{
  }
?>
```

```php:while文の基本的な書き方
<?php
  初期値;
  while(条件式){
    処理;
    増減式;
  }
?>
```

#参考文献
[PHPとは？基礎知識、できることを初心者にもわかりやすく解説します](https://www.kagoya.jp/howto/wordpress/php/)
【hoge?.[fuga]】TypeScriptのOptional Chainingで変数名を使う【log?.('hello')】

# 概要

TypeScriptではプロパティに安全にアクセスするために`hoge?.aaa?.bbb`のようなOptional Chainingを使用できます。
一方、以下の`hoge[fuga][piyo]`のように、Objectのkeyに変数名を使用してアクセスすることもできます。
ただ、この変数名を使う場合でOptional Chainingでアクセスしたいときにどうするんだっけ？となったのでメモしておきます。

```ts
const fuga = 'aaa'
const piyo = 'bbb'
const hoge: Record<string, any> = {}
console.log(hoge[fuga][piyo]) // Uncaught TypeError: Cannot read property 'bbb' of undefined
```

# 結論

タイトルにも書いてありますが`hoge?.[fuga]`でOKです。

```ts
const fuga = 'aaa'
const piyo = 'bbb'
const hoge: Record<string, any> = {}
console.log(hoge?.[fuga]?.[piyo]) // undefined
```

また、変数名でのkeyアクセスだけでなく、配列の要素にアクセスする際や、Optionalな関数の呼び出しでも利用できます。

```ts
/* 配列要素へのアクセス */
const hoge = ['hello']
console.log(hoge?.[1]) // undefined

/* Optionalな関数の呼び出し */
async function makeRequest(url: string, log?: (msg: string) => void) {
  const result = (await fetch(url)).json()
  log?.('Request finished!') // log が与えられている場合のみ実行される
  return result
}
```

# 参考

公式ドキュメントにはちゃんと書いてありました。

- [TypeScript: Handbook - TypeScript 3.7](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html#optional-chaining)
ssd.pytorchをpytorch 1.5.1で動くように修正した

ssdの元論文と同等の精度のpytorch実装に[amdegroot/ssd.pytorch](https://github.com/amdegroot/ssd.pytorch)があるのですが、pytorchの古いバージョンでしか動きません。CUDAのversionも合わせないとGPUが使えないので古いバージョンで動かすのは大変です(というか僕は出来ませんでした)。なのでpytorch 1.5.1で動くように修正しました。変更内容は[ここ](https://github.com/nnabeyang/ssd.pytorch/commit/38c984358c1302f429c998a8797329f224d0ca41)で確認出来ます。試してみる場合は[https://github.com/nnabeyang/ssd.pytorch](https://github.com/nnabeyang/ssd.pytorch)のブランチpytorch1.5.1を取ってくるのが一番手っ取り早いと思います。

この状態で学習して出来たモデルのmAPは0.77で、古いバージョンと同等の性能でした。

```
AP for aeroplane = 0.7946
AP for bicycle = 0.8467
AP for bird = 0.7603
AP for boat = 0.7286
AP for bottle = 0.4905
AP for bus = 0.8546
AP for car = 0.8628
AP for cat = 0.8865
AP for chair = 0.6305
AP for cow = 0.8270
AP for diningtable = 0.7645
AP for dog = 0.8494
AP for horse = 0.8707
AP for motorbike = 0.8396
AP for person = 0.7927
AP for pottedplant = 0.4953
AP for sheep = 0.7737
AP for sofa = 0.8142
AP for train = 0.8523
AP for tvmonitor = 0.7710
Mean AP = 0.7753
```

今回の修正のほとんどは参考に載せているページに載っている [https://github.com/ponta256/pytorch-ssd7](https://github.com/ponta256/pytorch-ssd7)から取ってきています。学習の仕方やmAPの計算方法もそこのページに書かれています。

### 環境

- Ubuntu 20.04
- Python 3.6.9
- Pytorch 1.5.1
- CUDA 10.2

### 参考

- [Pytorch版SSDを改造してベースネットを入れ替えてみる|株式会社Sigfoss](https://www.sigfoss.com/developer_blog/detail?actual_object_id=229)
Slackでアカウントの解除(削除)ができない

Slackの管理者アカウントで、退職者を解除したいのだが、
Slackのヘルプセンターの「アカウントの解除」の解説通りにできない。
https://slack.com/intl/ja-jp/help/articles/204475027
試行錯誤したらできたので、メモを残しておきます。

Slackのヘルプセンターにはこう書かれているが…

(1) デスクトップの画面左上にあるワークスペース名をクリックします。
(2) 「設定と管理」を選択し、その後「メンバーを管理する」を選択します。
(3)  解除するメンバーの右側の  (3 つのドットアイコン) をクリックします。
(4) 「アカウントを解除する」を選択します。

…「メンバーを管理する」が表示されない。
下記の手順で、できました。

(1) デスクトップの画面左上にあるワークスペース名をクリックします。
(2) 「設定と管理」を選択し、その後<font color="Red">「ワークスペースの設定」を選択します。
(3) 左上の「Menu」から「メンバー管理」を選択します。</font>
<font color="Red">(4)</font>  解除するメンバーの右側の  (3 つのドットアイコン) をクリックします。
<font color="Red">(5)</font> 「アカウントを解除する」を選択します。
Boost PhoenixとBoost Lambdaの違いについての個人的解釈

Boost PhoenixとBoost Lambdaは何が違うのか？

個人的に調べた限りでは、「ほぼ同じ」である。
Boost PhoenixはBoost Spiritのために開発されている（サブライブラリ）。

     1#include <boost/phoenix/phoenix.hpp>
     2#include <vector>
     3#include <algorithm>
     4#include <iostream>
     5
     6bool is_odd(int i) { return i % 2 == 1; }
     7
     8int main()
     9{
    10  std::vector<int> v{0, 3, 6, 9, 12};
    11
    12  std::cout << std::count_if(v.begin(), v.end(), is_odd) << '\n';
    13
    14  auto lambda = [](int i){ return i % 3 == 0; };
    15  std::cout << std::count_if(v.begin(), v.end(), lambda) << '\n';
    16
    17  using namespace boost::phoenix::placeholders;
    18  auto phoenix = arg1 % 3 == 0;
    19  std::cout << std::count_if(v.begin(), v.end(), phoenix) << '\n';
    20}

リストv{0, 3, 6, 9, 12}に対して、

14-15行目ではlambdaを使って3で割り切れるものを数えている。
17-19行目ではphoenixを使って3で割り切れるものを数えている。

Phoenixもlambdaも同じことができる。Placeholderの標記の違いなどはある(PhonixのPlaceholderはarg1と書く)が、両者は「ほぼ同じ」と見ている。

<pre>
$ ./a.out 
2
5
5
</pre>

一応次のような違いがある。。Phoenixの方が後発のライブラリである。

- The phoenix function can accept "ANY" type which the modulo operator can handle while the lambda function expects a parameter type of int.
Flutter開発でハマったポイント

#Flutterでいくつかハマったポイント
Flutterを使って個人アプリの開発を行った際にいくつかつまづいた点があるので、
もし同じポイントでつまづいている人の役に立てればと思い書きます。（flutter, dart は更新が激しくて、情報も少ないので苦労します）

##①ホットリロードができない
FlutterといえばHotReloadが売りですね。
本来なら、VScodeで変更し、保存を押したら即座にSimulator上に変更点が反映されるはずなのですが、
自分が作業時に変更を保存すると以下の画面が出てきました。
![スクリーンショット 2020-08-18 20.02.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464190/bc7d9fb0-a09e-429a-0e25-ff5f2adaa521.png)

「あれ？no element??画面をリロードしたらデータが読み込まれる前にページがrenderingされるのかな？？」
などと考え、いろいろfirebaseの読み込むタイミングを変えたりしたのですが、、、うまくいかず。
結論。main.dartのRoutingにvalueを使用していると上記のようなエラーが出るようです。
```
変更前
providers:[
  ChangeNotifierProvider.value()(
    value:HogeHoge(),
  ),
],
変更後
providers:[
  ChangeNotifierProvider(
    create: (ctx) => HogeHoge(),
  ),
],
```

##②Image_Picker() を使うと、アプリそのものが落ちる
　FlutterでNativeのDeviceのカメラ機能を使用できるPackage　Image＿picke。
　仕様書どおりに設定して、
　　ボタンを押す=>カメラ起動=> 写真をとる=>　✔︎ボタン（Android）を押す
　で、本来なら前のページに戻って画像のPrevierwを表示する予定だったのですが、、、、

　**突如アプリが終了する**

  　しかもconsoleにはなんのエラー表示もなく、、、、、。
　
　これは結構原因を見つけるのに苦労しました。。。結論から言うと
　**pubspec.yamlになんらかImage_pickerと干渉してしまうpackageを入れている**
　事が原因でした。
　Stackoverflow などを見ていると、様々なpackageが干渉する場合があるみたいですが、
　僕の場合原因となったのは、**characters**と言うPackageでした。

　これは元々入れていなかったpackageなのですが、VScodeでDartをupdateした際に、
　consoleで謎のエラーが出まくっていたために入れていたものでした。
　このPackageを削除したところ、アプリが落ちる事なく正常に動作しました。


###終わりに
　Flutterはまだまだ日本語のDocumentが少なく変化も激しいので、
　また何かTipsがあれば健忘録として追加していきたいと思います。
AtCoder 174 BCD


# [B問題](https://atcoder.jp/contests/abc174/tasks/abc174_b)
ポイント

- 累乗は**でした。^で計算しようとしてハマった
- 距離の計算でsqrt(x**2, y**2)とすると小数誤差が生じて等号の境界でぴたりと等号を満たせない可能性がある。代わりに以下が推奨
    - 等号にせず、ごく小さいepsを大きく出るべき方に足すか小さく出るべき方で引く
    - 両辺を二乗してsqrtを避け、整数で解く！！

```B.py

import math
N, D = list(map(int,input().split()))
cnt = 0
for i in range(N):
    x, y = list(map(int, input().split()))
    if (x**2)+(y**2) <= D**2:
        cnt+=1
        
print(cnt)
```


# [C問題](https://atcoder.jp/contests/abc174/tasks/abc174_c)

アルゴリズムも実装もわからずボロボロでした。

ポイント

- 7, 77, 777の数列はa_i = a_i*10 + 7 と規則的
- このとき、あまりも規則的（周期的）
    - a_i をKでわったあまりをmod_iとすると、数列a_iは前項を10倍して7を足すので、当然前項に対して計算したあまりも10倍して7を足す。 => mod_i = (mod_i-1 * 10 + 7) % K 
- Kで割った時のあまりはK以下。
- 上記より、あまりは0~Kの間で循環する。
    - これは、K桁まで7を並べるケースを試せば、必ずどこかで一巡を終えるということ！！
    - すなわちK桁の7を並べた数まで繰り返せばいい
- 循環すれば割り切れないと判断なので、あまりをリストで保持して循環を検知したい。
    - しかし、要素数が非常に大きいときのappendはめちゃくちゃ遅い！！！
    - なので貪欲にKまで繰り返せばいい


```C.py

K=int(input())
amari=0
for i in range(K):
    amari = (amari * 10 + 7)% K
    if amari == 0:
        print(i+1)
        break
    if i == (K-1):
        print(-1)

```

```C_RE.py
K=int(input())
amari_list = []
amari = 7%K
if amari == 0:
    print(1)
    
amari_list.append(amari)
for i in range(1,K):
    amari = (amari * 10 + 7)% K
    if amari == 0:
        print(i+1)
        break
    if amari in amari_list:
        print(-1)
        break
    if i == (K-1):
        print(-1)
    else:
        amari_list.append(amari)
```


# [D問題](https://atcoder.jp/contests/abc174/tasks/abc174_d)

ポイント

- 最終状態をイメージする。
- 赤の左に白がだめ、というとき、ある白の右には（隣でなくとも）赤があってはいけない。
- そのような状態はいくつもある(WWWW, RWWW, RRWW...) ので、その起こりえる状態のなかでそれぞれ操作回数を比較すればよい
- 各状態の操作回数は現在の状態と目標の状態の差で決まる。
    - 愚直に行えば、色が異なる数だけ色変えをする必要がある。しかし、都合のよい白と赤を交換すれば色変え2回分を一度の操作で達成できる。
    - 状態毎にギャップを図り直すと2重ループ（O(n^2)）になってしまうので、他の方法を考える。
        - 状態を左からひとつずつ変えれば、その変えた部分だけ見ればよいのでループする必要がなくなる


-  未証明だが、より簡潔な解法でACした。
-  最終状態は左からRが連続し、右にはWが連続する状態になる。
-  これを達成したいとき、色変えよりも交換の方が常に効率的っぽい
    -  入力例3で、「WRWWRWRR」が与えられたとき、色変えだけでは4回必要。交換を入れることで最小の3回になる。
-  交換だけでこれを最終状態を実現したいとき、必要な交換の回数は、最終状態のWの連続部分と現状のその部分を比較して、Rの数を数えればよい



```D.py
_ = input()
s = input()

R_num = s.count("R")
print(s[:R_num].count("W"))
```
【2020】Mac版Chromeショートカットキー

#### はじめに
完全に自分用のメモです。Chromeを利用してるときの操作で煩わしかったのでそんな生活に終止符を打ちます
[GoogleChromeヘルプ](https://support.google.com/chrome/answer/157179?hl=ja)で紹介されているものですが、使用頻度が高そうなものを紹介します。

## ショートカットキー
|ショートカットキー|操作|頻度|
|:--------------|:--|:--|
|**⌘+n**                  |新しいウィンドウを開く                    |◆◆◇|
|**⌘+t**                  |新しいタブを開いてそのタブに移動する         |◆◇◇|
|**⌘+option+右矢印**       |開いている次のタブに移動する               |◆◆◆|
|**⌘+option+左矢印**       |開いている前のタブに移動する               |◆◆◆|
|**⌘+1~⌘+8**              |特定のタブに移動する                      |◆◆◇|
|**⌘+9**                  |最後のタブに移動する                      |◆◇◇|
|**⌘+]** または **⌘+右矢印**|現在のタブの閲覧履歴の中で次にあるページを開く|◆◇◇|
|**⌘+[** または **⌘+左矢印**|現在のタブの閲覧履歴の中で前にあるページを開く|◆◆◆|
|**⌘+w**                  |現在のタブまたはポップアップを閉じる        |◆◆◇|
|**⌘+f**                  |現在のページ内を検索する検索バーを開く       |◆◆◇|
|**⌘+option+i**           |デベロッパー ツールを開く                 |◆◆◇|
|**⌘+l**                  |アドレスバーに移動する                    |◆◇◇|
|**⌘+r**                  |現在のページを再読み込み                   |◆◆◆|
|**⌘+リンクをクリック**      |リンクを新しいバックグラウンド タブで開く    |◆◆◆|
|**⌘+shift+リンクをクリック**|リンクを開いてリンク先に移動する            |◆◇◇|

#### おわりに
他にも有用そうなショートカットキーは色々ありますが、現在のウィンドウを閉じたりGoogleChromeを隠したりしないので…。
ご清覧ありがとうございました。
【独学】Railsチュートリアル終えた後の、ポートフォリオ（オリジナルアプリ）作成

#はじめに
今回は

**Railsチュートリアル学習したのに、ポートフォリオ（オリジナルアプリ）の作成に苦戦している**方に向けて書いていこうと思います。

（スクールに通われている方にも参考になるかと思います。）

#自己紹介

・24歳
・2020年3月　プログラミング学習開始
・6月　ポートフォリオ作成開始 
　<a href="http://toretomo.work/">ポートフォリオ</a> 
　<a href="https://github.com/Takayaus/toretomo">Github</a>
・7月~現在　受託開発に取り組みながら、エンジニアへの転職活動をしています。

#Railsチュートリアル学習したのにポートフォリオが作れない理由
それは、単純に**Railsチュートリアルはポートフォリオ（オリジナルアプリ）を作り方を学べるものではないからです。**

そもそも、Railsチュートリアルは**Railsの構造を理解することに適した教材**です。（おそらくスクール教材も）

実際に私自身もRailsチュートリアルを終えた後にすぐに、ポートフォリオ作成に取り組みましたがすぐに手が止まりました。

そこで、私が実践した**３つのステップ**をご紹介します。

```
1. 転職活動している未経験者のポートフォリオを参考にする
2. とにかく作る
3. 現役のエンジニアにみてもらう
```

#1. 転職活動している未経験者のポートフォリオを参考にする


転職活動しているほとんどの方がポートフォリオとGithubのリポジトリを公開しているので両方見ましょう。


**コードが単純で書かれているものが多いので**、Railsチュートリアルを十分に理解しているレベルなら、ほぼ理解できるかと思います。

ここでRailsチュートリアルで出てこない機能（gem）がたくさん出てくるので、Railsでどのような機能を実装できるのかがわかると思います。

私は、実際に検索機能（Ransack）ログイン機能（Devise）は他のポートフォリオを通じて知りました。

#2. とにかく作る
簡単なものでもいいのでとにかく作りましょう！

私が最初に作ったサービスは**「どのジムでどこの部位の筋トレをするかを投稿できるサービス」**です。
正直、出来はひどいです。（見たい方は私のGithubから探してくださいw）

ですが、**自分が理解していないところがわかったり、様々なエラーを自力で解決させたりすること**は、実際に手を動かさないと経験できません。

一つポイントとして、作る前に**モックアップ**を書きましょう！



なので**とりあえず作る！**これに限ります。

#3.現役のエンジニアにみてもらう
これが何よりも大事です！

「お前独学の人を対象に書いてるのに何いってんだ！」って言われても仕方ないですが、**本当に現役のエンジニアにみてもらうのは大事なんです**泣

2.であげた**自分が理解していないところがわかったり、様々なエラーを自力で解決させたりすること**は一人では限界がありますし、かなり時間がかかります。

冒頭で挙げたポートフォリオは独学で一人で作成しましたが、現役のエンジニアの方から頂いたフィードバックを元に修正をしたところ、カジュアル面談でかなり**評価された**ので、独学で頑張ってる方、初学者の方々には是非現役のエンジニアからレビューをもらいましょう！

私はオンラインサロンに入ってレビューをもらいましたが、Twitterなどに上げてみるのもいいですね！

#最後に


本当に初学者のために書いたので、あまり参考になる人は少ないかもしれませんね汗

私自身、独学でやってた時に何から手をつけてわからなかったので、この記事を見て少しでも参考になれば幸いです！

次はポートフォリオ作りで技術的に苦労したところをあげようと考えてます！
Dockerのイメージを全部消す(クリーンアップ)

#Dockerのイメージを全部消す(クリーンアップ)

稼働中のコンテナを全て止める。

```
$ docker kill `docker ps -q`
d949279b7e8b
90f0009df4dc
fc6cf5b5a26b
```

全てのコンテナを削除する。

```
$ docker rm `docker ps -aq`
60f91cccb7dd
d949279b7e8b
90f0009df4dc
fc6cf5b5a26b
```

全てのイメージを削除する。

```
$ docker rmi `docker images -q`
Untagged: nginx:latest
Untagged: nginx@sha256:b0ad43f0ad430ad43ee5edbc0eff...
Deleted: sha256:4bb46517cac397bdb0bab6eba09b0e1f8e9...
Deleted: sha256:80b21afd8140706d5fe3b7106ae6147e192...
Deleted: sha256:0f04ae71e99f5ef9021b92f76bac3979e25...
Deleted: sha256:9a14852344d88a1fdf8297914729834521e...
Deleted: sha256:74299126f8099031c5bbd4774147f4ab6b0...
Untagged: wordpress:latest
Untagged: wordpress@sha256:6da8f886b20632dd05eeb246...
Deleted: sha256:f1da35a7ddca022240b522847aa00229a53...
Deleted: sha256:2575d97839d38f8e5d03bff9faa60e2b6b9...
Deleted: sha256:02b438dc689e82d43a5020697c9fcf69ab1...
Deleted: sha256:6ba52464be861d5820d3993f1679fb19598...
Deleted: sha256:c009eaa948f2fdeac83c727e23ecf54e3ce...
Deleted: sha256:c1dcd220a514e0a20c296ac98504ae1a060...
Deleted: sha256:4ea2c0ce663f0f818e515817b07f4c9a874...
Deleted: sha256:87c45811775aae1757da1a94f55ecbbbdeb...
Deleted: sha256:f6e183c191d75a55ea7b0695c32ba9bd4a6...
Deleted: sha256:ff09d507a3ca7496a332579227770965c61...
Deleted: sha256:ffa2c187679ddbeeda9b9d41725fa4916f2...
Deleted: sha256:eaae8b52ab6afc664a6584033bd8942c7a9...
Deleted: sha256:56a340d84f17f5b4e83bd02ffd40a3b1273...
Deleted: sha256:f8899bfcfa880bd6caa5078c27b488a37f6...
Deleted: sha256:08b50110935f318104dd652795f0b0a2c6d...
Deleted: sha256:3bcc29238c6f1ce1602b88b2317fd742922...
Deleted: sha256:e7854f919e1ba15b6ac0b0e70cd2cb1eac7...
Deleted: sha256:45c01c7d544fd67d36753507065e5458be1...
Deleted: sha256:8e311722d5028e3cb61f5dea8786ed5fbc5...
Deleted: sha256:2f245d38723aa315787ea341d92c1abbccc...
Untagged: mysql:5.7
Untagged: mysql@sha256:da58f943b4721d46e87d5de208dc...
Deleted: sha256:718a6da099d82183c064a964523c0deca80...
Deleted: sha256:058d93ef2bfb943ba6a19d8b679c702be96...
Deleted: sha256:7bca77783fcf15499a0386127dd7d5c6793...
Deleted: sha256:183d05512fa88dfa8c17abb9b6f09a79922...
Deleted: sha256:1658012fa88dfa5124c17a136fdeec1782b...
Deleted: sha256:904bdc2d0b81c112fa88dfa7ac17a71d215...
Deleted: sha256:d26f7649f78cf789267fbbca8aeb234932e...
Deleted: sha256:7fcf7796e23ea5b42eb3bbd5bec160ba5f5...
Deleted: sha256:826130797a5760bcd2bb19a6c6d92b5f486...
Deleted: sha256:53e0181c63e41fb85bce681ec8aadfa323c...
Deleted: sha256:d6854b83e83d7eb48fb0ef778c58a8b839a...
Deleted: sha256:d0f104dc0a1f9c744b65b23b3fd4d4d3236...
Untagged: hello-world:latest
Untagged: hello-world@sha256:7f0a9f93b4aa3022c3449b...
Deleted: sha256:bf756fb1ae65adf866bd8c456593cd24beb...
Deleted: sha256:9c27e219663c25e0f28493790cc0b88bc97...
```

確認

```
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
```

すっきり
amdgpu, amdgpu-pro のメモ

Linux の AMD GPU ドライバの admgpu, amdgpu-pro の違いについて.

https://amdgpu-install.readthedocs.io/en/latest/install-overview.html

* amdgpu: OSS で構成
* amdgpu-pro: プロプライエタリな OpenGL, OpenCL ドライバが付属

OpenGL や Vulkan アプリだけ動かしたいのであれば OSS only の admgpu(Mesa RADV?)でよいと思われる. OSS(Mesa RADV or AMDVLK) のほうが性能いいらしいようですし.

RADV についてはこちら.

RADV で最新 Vulkan を使うため, Mesa をコンパイルするメモ
https://qiita.com/syoyo/items/9b98a3124ce47065453f


OpenCL が使いたい場合は proprietary な pro 版を使うしかない.
`--headless` で OpenGL サポートなしで OpenCL をインストールできる(マイニングや機械学習など向け)

## legacy, PAL(rocr)?

OpenCL には legacy,PAL がある.

legacy = orca とも呼ばれている.

PAL = VEGA56/64 以降っぽいようである. rocr と名前が変わった(ころころ名称変えてつらい :cry: )

とりあえず legacy, PAL 両方インストールできるので, 両方インストールしておくのが無難かと思われる.

## WINE と相性悪い

apt で wine を入れると, Ubuntu 標準の opencl 関連が付属でインストールされてしまいます.
clinfo などで不都合が出るかもです.
 
## headless 運用では, Ubuntu 20.04 では `render` group に追加必要

https://math.dartmouth.edu/~sarunas/amdgpu.html

Ubuntu 20.04 Desktop ですと, headless で OpenCL インストールしていたとしても,
一旦 graphical login しないとだめでした.

最近? 権限構成が変わって, headless で運用(サーバで動かしたい)したい場合は `render` group に追加が必要になります.

https://math.dartmouth.edu/~sarunas/amdgpu.html

(これは ROCm 版 OpenCL でも同等)

## ROCm?

ROCm だと OpenCL 部分ふくめ all-open で OpenCL が動くようだが...(OpenCL 実装は clang で OpenCL -> ROCm 用バイナリ変換?), 
正式対応している GPU は限られており, 現状(2020/08. 3.5.0, 3.5.1)はカオスな状態なので少なくとも OpenCL を動かすにはおすすめしない.

## OSS な OpenCL?

ROCm 非依存でやりたい.
amdgpu でうごくのは, Mesa あたりが頑張っているようではあるが... まだ一般的に利用できるようではなさそう.

https://wiki.archlinux.org/index.php/GPGPU#AMD/ATI


https://www.phoronix.com/scan.php?page=news_item&px=Mesa-OpenCL-Features-State

r600, radensi など古めのアーキテクチャであれば image 使わなければ OpenCL 1.2 相当は動くやも.
【言語処理100本ノック 2020】第8章: ニューラルネット

## はじめに
自然言語処理の問題集として有名な言語処理100本ノックの[2020年版](https://nlp100.github.io/ja/)が公開されました。
この記事では、以下の第1章から第10章のうち、「第8章: ニューラルネット」を解いてみた結果をまとめています。

本編は以下のリンク先に移転しました。
https://amaru-ai.com/entry/2022/10/14/204710

[全100問の解答へ](https://amaru-ai.com/entry/2022/10/15/204035)
薬剤管理システムの再構築（DB問題）－午後

平成31年春期 午後問題6

ファイル：2019h31h_ap_pm_qs.pdf


**１、図１中のa,bに入れる適切なエンティティ間の関連を解答群の中から選ぶ。**


a,bにつきまして、図１だけで、情報不足ですね。
表１も参照して、（１）初回の外来受診の時に、「受信者、外来受診」両方を作成する。且つ、（２）２回目以上の外来受診は、「外来受診」のみ作成する。
つまり、１：Nですね。且つNは　＞＝１　ですね。よって、aの答えは　「カ」ですね。

bは、表１を参照して、（９）初回発注の薬剤の時に、「薬剤、薬剤在庫」両方を作成する。
（１０）発注実績のある薬剤の時に、何もしなく、且つ（１１）薬剤の入庫の時に、何らかを更新するので、１：１ですね。よって、bの答えは、「ウ」ですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/94f213c0-bd1e-fb8a-7048-8c64cd3fe7c2.png)

＜＜図１＞＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/1cb98330-317b-d0a3-9cf1-e9eb05ec0104.png)

＜＜表１＞＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/59e8c1a7-9b8b-33b9-2387-84bd96cee6ff.png)

**２、表１のc,d,表２のe,fに適切なテーブル名、列名を入れて答えよ**

cは（５）薬剤併用チェック、（６）在庫チェックで使っていますね。
処方箋の作成に含んでいますね。
処方箋の作成流れ：
　１）、（４）処方箋の登録（発行前）
　　　　つまり、テーブル「処方箋、処方箋明細」に登録し、「外来受診」に更新する。
　２）、薬剤併用と在庫チェックして、登録していた「処方箋、処方箋明細」を見直すとのことですね。「外来受診」に多分、処方箋IDのみを更新するので、チェック処理で見直すのは必要ないですね。なお、チェックNGの場合、異なる成分の薬剤を調整するなどので、変更必要のテーブルは、処方箋明細のみですね。cは「処方箋明細」です。
　３）、（７）処方箋（書面）発行

dは（１１）薬剤の入庫です。
　　（９）初回発注の薬剤の時に、テーブル「薬剤の在庫」に薬剤データを作成する、項目「在庫量_大人１日」を０に登録します。
　　（１１）で入庫するときに、テーブル「薬剤の在庫」に薬剤データを更新し、項目「在庫量_大人１日」を入庫量を更新しますね。
なので、dは「薬剤の在庫」ですね。


・（５）薬剤併用チェック、（６）在庫チェック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/92b3ff5d-d6f0-31e6-0376-7848d98b93b3.png)


＜＜表２＞＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/49125c9f-e6f8-4157-d3c4-154bbabbc413.png)


**３、図２のg,hを適切な字句を入れて答えよ。**
gは、チェック対象薬剤の副問い合わせですね。
チェック対象薬剤は、受診者の過去６ヶ月の履歴＋今回受診の処方箋　ですね。
なので、gはUNIONですね。もちろん、UNION　ALLも正しいですね。

hはチェック対象薬剤をベースで、薬剤併用情報を利用して併用情報ありのを抽出しますね。
hは、existsで問題ないですね。
ただ、existsを利用すると、副問い合わせの「SELECT T2.薬剤コード１,T2.薬剤コード2」は、意味がないでしょう。戸惑いのものですね。迷いがなく注意したほうがですね。私は、existsを利用すると、副問い合わせに[Select 1　。。。」というふうに書きますから。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/99a05dc2-f0aa-2030-5508-c50e57ab6c8d.png)

・（５）薬剤併用チェック、（６）在庫チェック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/92b3ff5d-d6f0-31e6-0376-7848d98b93b3.png)


**４、図３のi,j,kを適切な字句を入れて答えよ。**
ビューには、有効年月日まで確保されるよう、在庫保証を行うための薬剤コードとその在庫量ですね。
有効年月日とは普通の理解でよいですね。つまり、今日より未来ものですね。
よって、j は　「＞＝CURRENT_DATE」です。
なお、在庫確保が目的ので、つまり、まだ薬剤の受け渡しはしていないですね。
表２により、薬剤処方箋年月日が受け渡しまでは、NULLであるため、kは「IS NULL」ですね。

iは、薬剤コードごとの在庫量ですので、SUM(T3.処方量_大人１日)ですね。これは、GROUP　BYよりも左証できますね。

＜＜図３＞＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/01c3ba8f-fd8f-75f4-7ca5-27e34f0e5f22.png)

＜＜ビュー＞＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/6cc70d29-0b51-f689-3ae1-9f3d1f466189.png)


**結論**
DB問題は、難しくないが、結構間違いしやいですね。
細心の注意を払って、進みましょう。
AndroidでKotlin Coroutinesを導入する際の注意点

# 導入方法

AndroidでCoroutinesを導入する際は、`app/build.gradle`に以下のように記載します。
バージョンは特に理由がなければ最新版を指定するのが望ましいでしょう。

```gradle:build.gradle
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.7'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.7'
```

# 注意点

以下に導入する際に起きたトラブルおよび原因、解決方法を記載します。

## VerifyErrorによるアプリクラッシュ

Kotlin 1.3系（私の環境では1.3.41）を使用している場合に、Coroutinesのバージョンを1.3.7にすると、コルーチンの処理を呼び出したときにVerifyErrorが発生してアプリがクラッシュしました。

```
java.lang.VerifyError: Verifier rejected class com.volcast.data.VolcastRepositoryImpl: java.lang.Object com.volcast.data.VolcastRepositoryImpl.refresh(kotlin.coroutines.Continuation) failed to verify: java.lang.Object com.volcast.data.VolcastRepositoryImpl.refresh(kotlin.coroutines.Continuation): [0x12F] register v3 has type Reference: java.lang.Exception but expected Precise Reference: kotlin.jvm.internal.Ref$ObjectRef (declaration of 'com.volcast.data.VolcastRepositoryImpl' appears in /data/app/com.volcast.temp-6UrzwdYgEJRIKC9aa-RzVQ==/base.apk!classes2.dex)
        at com.volcast.di.DataModuleKt$dataModule$1$12.invoke(DataModule.kt:58)
        at com.volcast.di.DataModuleKt$dataModule$1$12.invoke(Unknown Source:4)
        at org.koin.core.instance.InstanceFactory.create(InstanceFactory.kt:50)
        at org.koin.core.instance.FactoryInstanceFactory.get(FactoryInstanceFactory.kt:36)
        at org.koin.core.registry.InstanceRegistry.resolveInstance$koin_core(InstanceRegistry.kt:87)
        at org.koin.core.scope.Scope.resolveInstance(Scope.kt:214)
        at org.koin.core.scope.Scope.get(Scope.kt:181)
        at com.volcast.di.ViewModelModuleKt$viewModelModule$1$7.invoke(ViewModelModule.kt:72)
        at com.volcast.di.ViewModelModuleKt$viewModelModule$1$7.invoke(Unknown Source:4)
```

### 原因

原因としては、どうやらコンパイラのバグのようです。
https://github.com/Kotlin/kotlinx.coroutines/issues/2049#issuecomment-638120448
（こちらではどうすることもできないやつですね。。）

### 解決策

解決策として、Kotlinを1.4以降にアップデートするか、Coroutinesのバージョンを1.3.6にダウングレードすることで解消できます。

```
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.6'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.6'
```

ちなみに2020年8月18日時点でCoroutinesの1.3.9がリリースされているものの、当問題が解決しているかはリリースノートを見る限り不明です。
（もし1.3.9にしたら動いた！という方がいましたら教えていただけると大変喜びます）
[Releases · Kotlin/kotlinx.coroutines · GitHub](https://github.com/Kotlin/kotlinx.coroutines/releases)

Kotlinをアップデートできるのなら、最新版を使えるという点でアップデートしたほうが良いかもしれません。
（とはいえプロジェクトの関係でいきなりバージョンアップできないことが多いかと思いますので、その時は大人しく1.3.6にしましょう）
E2EフレームワークCypressを使ってみた

# はじめに
仕事でE2Eテストをするにあたり、geb-spockからcypressに移行しました。
個人的にはすごく使いやすくてよかったのでメモがてら書こうと思います。
具体的にどこがどうよかったかは最後にまとめています。

# 本家
https://www.cypress.io/

# 環境
- macOS Catalina 10.15.5
- npm 6.13.7

# 導入手順
主な導入手順は以下のリンクに従えばOKです。
https://typescript-jp.gitbook.io/deep-dive/intro-1/cypress

```shell
mkdir e2e
cd e2e
npm init -y
npm install cypress typescript
npx tsc --init --types cypress --lib dom,es6
echo {} > cypress.json
```

e2e/package.jsonにスクリプトを追加

```package.json
"scripts": {
    "cypress:open": "cypress open",
    "cypress:run": "cypress run"
}
```
あとは`npm run cypress:open`でcypressIDE(UIモードですね)が起動するので実行したいテストを選択して実行。
または`npm run cypress:run`でヘッドレスでcypressが実行されます。CIなどに組み込みたい場合はこちらですね。

# テスト作成
早速`npm run cypress:open`を実行すると、各種ディレクトリを作成するか聞かれるので、OKを選択します。
`e2e`ディレクトリの下に`cypress`ディレクトリができているはずです。
`cypress/integration`に自分のe2eをガシガシと追加しましょう！

![cypress_directory.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319966/a900759c-11a2-cb2e-f083-0ba3a383407a.png)


基本的な書き方は`cypress/integration/examples`の中のサンプルテストを見ればほぼわかるようになっています。~~自分のようなドキュメントをあさるのが苦手な人には大変助かります~~

要素の取得はjQueryと同じセレクターの書き方で可能です。

```ts
cy.get('.myClass > button').click();
```

Chaiをバンドルしているため、Chai流のアサーションの書き方ができます。詳しくは[こちら](https://docs.cypress.io/guides/references/assertions.html)


```ts
// retry until this input does not have class disabled
cy.get('form').find('input').should('not.have.class', 'disabled')
```

最初のテスト作成は`integration/example`内のテストを参考にしてもよいですし、以下のリンクを見てみるのもよいと思います。
https://docs.cypress.io/guides/getting-started/writing-your-first-test.html

# Cypressのいいところ(geb-spockと比べて)
個人の感想です。また、geb-spockを使いこなせていなかった可能性は十分にあります。

## ステップごとにDOMのSnapshotを保存してくれている
これが大変すばらしい！各ステップの実行前・実行後のDOMの状態を見ることができるのでなぜ落ちたか非常にわかりやすいです。
![dom_snapshot.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319966/c43b9204-d4d2-3653-b400-b989798f2c03.gif)

## セレクターをコピーできる機能
AngularMaterialなどのUIライブラリを導入していると、テストしたい要素のセレクターがぱっと見で分からないことが多く、意外とそこに時間をとられることが多いです。
しかしcypressのセレクターコピー機能を使えば、ほしい要素を選択し、コピーボタンを押し、ペーストするだけでお目当ての要素を取得できます！
![copy_selecter.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319966/7d6a9afa-628d-dd94-56ba-358d348a5feb.gif)

## テストの変更が即時に反映される
テストコードの変更は即時にcypressIDEに反映されます！

## 要素がviewportに入り切っていなくても認識してくれる
実はgeb-spockにうんざりして乗り換えを決めた原因はこれです。
viewportに入っていない要素が見えないのはまだしも、スクロールバーがかぶっている要素が取得できなかったときは原因がずっと分からず、かなりの時間をとられてしまいました。
cypressに乗り換えてからはそのような時間ロスに遭遇したことはないです。

# まとめ
Cypressは非常に使いやすく、使い心地も抜群に素晴らしいです(比較対象がgeb-spockのみですが)。
これからE2Eテストツールとしてはデファクトスタンダードになっていくのではないかと思います。
導入も簡単で、既存のツールと同じ書き方ができるため学習コストも低いですし、使用例含め公式ドキュメントも充実していますので気になる方はぜひ使ってみてください。
Docker で停止中のコンテナを全部動かす


#Docker で停止中のコンテナを全部動かす

```
$ docker start `docker ps -aq`
60f91cccb7dd
Error response from daemon: Cannot link to a non running container: /xxx-mysql AS /xxx-wordpress/mysql
90f0009df4dc
fc6cf5b5a26b
Error: failed to start containers: d949279b7e8b
```

もう一回同じコマンドを叩く。[^1]

```
$ docker start `docker ps -aq`
60f91cccb7dd
d949279b7e8b
90f0009df4dc
fc6cf5b5a26b
```

はい、全部動いた。

最低二回コマンドを叩く。


[^1]: `xxx-mysql`が先に可動していないと`xxx-wordpress`が可動できないが、先に`xxx-wordpress`を稼働させようとしたためエラーとなった。
ASP.NET Core の IStartupFilter でアプリの起動時に設定を検証する (.NET 5 以前)

## 経緯

ASP.NET Core には appsettings.json 等の設定から読み込んだデータを検証する機能があります。

[ASP.NET Core のオプション パターン : オプションの検証](https://docs.microsoft.com/ja-jp/aspnet/core/fundamentals/configuration/options?view=aspnetcore-3.1#options-validation)

上記の機能を利用すると簡単に検証を実装出来て非常に便利なのですが、検証のタイミングが DI コンテナから取り出したタイミングになってしまい設定ミスに気付くのが遅れてしまうことが何度かありました。

設定ミスはなるべく早く気づくようにしたいので、[こちらの Github Issue](https://github.com/dotnet/runtime/issues/36391) の実装例を参考に、起動時に設定を検証する実装を試しましたので、備忘録を兼ねて実装と使い方の例を残します。

:::note info
(2022/11/17 追記)
.NET 6 から [ValidateOnStart](https://learn.microsoft.com/ja-jp/dotnet/api/microsoft.extensions.dependencyinjection.optionsbuilderextensions.validateonstart?view=dotnet-plat-ext-6.0) メソッドが使えるようになり、これを使うとアプリ起動時 (`app.Run()` の呼び出し時、のようです) で検証が実行されるようになりました

.NET 6 以降で本記事の「起動時に設定を検証する」挙動を実現するなら ValidateOnStart() を使用するべきと感じています。
:::


## 環境

ASP.NET Core 3.1

## 実装

設定を検証する StartupFilter を定義します。

```cs
public class StartupOptionsValidationFilter<T> : IStartupFilter
{
    public Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next)
    {
        return builder =>
        {
            var options = builder.ApplicationServices.GetService(typeof(IOptions<>).MakeGenericType(typeof(T)));
            if (options != null)
                _ = ((IOptions<object>)options).Value;

            next(builder);
        };
    }
}
```

上記の StartupFilter を DI に登録する拡張メソッドを定義します。

```cs
public static class OptionsBuilderValidationExtensions
{
    public static OptionsBuilder<TOptions>  <TOptions>(this OptionsBuilder<TOptions> optionsBuilder)
        where TOptions : class
    {
        optionsBuilder.Services.AddTransient<IStartupFilter, StartupOptionsValidation<TOptions>>();
        return optionsBuilder;
    }
}
```

## 使い方例

設定ファイルをバインドするクラスを用意します。
今回は DataAnnotations による検証と、カスタムの検証ルール `IsValid()`を用意しました。

```cs
public class SettingA
{
    [Required]
    public string OptionA { get; set; }
    public bool UseOptionB { get; set; }
    public string OptionB { get; set; }

    public bool IsValid()
    {
        // UseOptionB が true の場合、OptionB の設定が必須
        return !(UseOptionB && OptionB == null);
    }
}
```

Startup.cs の `ConfigureServices` メソッドで設定ファイルを DI に以下のように追加します。

```cs
public void ConfigureServices(IServiceCollection services)
{
    services.AddOptions<SettingA>()
        .Configure(option => Configuration.Bind("settingA", option))
        .ValidateDataAnnotations() // DataAnnotations による検証
        .Validate(option => option.IsValid()) // カスタムの検証ルール "IsValid()" による検証
        .ValidateEagerly(); // 起動時に設定を検証する StartupFilter を DI に追加

    services.AddControllers();
}
```
Swift Package Manager とは

### 概要

Swift Package Manager(以降: SwiftPM) は、Swift コードの配布を管理するためのツールです。また、Swift のビルドシステムと統合されていることにより、依存関係のダウンロード・コンパイルなどが最適化されバイナリ、リソースがプロジェクトで使いやすい形になります。 SwiftPM は既存で存在する依存管理ツールの CocoaPods や Carthage とは違い Apple が OSS とし提供しているツールで、Xcode 9以降(Swift 3.0以降)に含まれています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292456/9b7756ad-eaa0-b5ec-afaf-4847e097815a.png)


### ライブラリを導入してみる

SwiftPM はXcode10 以前は `Package.swift` などに依存先を記述して、コマンドラインからのみビルド・実行しかできませんでした。そのため、サーバサイドや CUI アプリケーションなどでしか利用シーンがありませんでした。しかし、Xcode 11 以降からは `.xcodeproj` に直接依存先の情報などを記述して導入できるようになったので、iOS アプリケーションでも SwiftPM が利用できるようになりました。つまり、CLI としてライブラリを利用する(SwiftFormatなど) + CLI ライブラリ、サーバサイドアプリなどを作成する以外は基本的には、`Package.swift` を編集する必要はないということです。


#### Lottie をインストール


`File` > `Swift Packages` > `Add Package Dependency..` を開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292456/605bda5c-8455-671c-b65e-fecbac7737c8.png)


Choose Package Repository 画面がでたら [lottie-ios](https://github.com/airbnb/lottie-ios) のリポジトリ URL を入力して次に進みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292456/78db20ae-e7aa-4960-9ffc-6e99e3e7cbbc.png)


次にバイナリを指定する必要があるので、`version`・`Branch`・`Commit` で任意のものを選択して次に進みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292456/f5a4a864-d04e-a62d-3e00-7473c01e9e03.png)


リポジトリの Fetch が終わると、ライブラリの Target 選択画面が開くので任意の Target を選択して次に進みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292456/5439c8f4-0804-4178-d621-0b90c6c79e5e.png)


すると下記のようにインストールが確認できるとライブラリが利用可能な状態になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292456/97922052-d53e-f2d0-53f6-255248546f2a.png)


#### 参考

- https://swift.org/package-manager/
- https://developer.apple.com/documentation/swift_packages
- https://dev.classmethod.jp/articles/ios-add-library-with-spm/
【GAS】Gmailの未読のメール既読にしたいな

# はじめに
こんにちは。

Gmailで、件名見て、「あぁ、それね。」で未読でほったらかしにすることが多い筆者です。

特にメールマガジンとか、マネーフォワードMEの出金のお知らせとか。。

気づいたら **8000件** も溜まってました。

今更読む気なんて無いので、全て既読にしようと思います(もしかしたらいるメールもあるかもなので、今回は削除しません)。

# 作戦
1. GASで未読のメール(スレッド)を取得する。
    2. 最大500件しか取得できないので、取得できなくなるまでループする(8000件あるので)。
2. GASで1のメールをスレッド単位で既読する。

# 実装
これで行けました:+1:

```js:code.gs
const markRead = () => {
  let offset = 0
  const limit = 500
  while (true) {
    // 作戦: 1
    var threads = GmailApp.search('is:unread is:inbox', offset, limit)
    offset += limit

    // 作戦: 2
    for (thread in threads) {
      threads[thread].markRead()
    }

    if (threads.length < limit) break
  }
}
```

# おわりに
今回は受信トレイにある未読のメールを対象に実行しました。
GASは360秒の実行時間の上限で一度に8000件のメールを既読にできませんでしたが、数回繰り返して全てのメールを既読できました :smiley:
【PHP】業務で使ってきたPHP関数メモ

# 最初に
仕事で学習してきた内容を書き出していきます。
基本的には自分自身でわかるような内容になりますので、ご容赦ください。

※「覚えてない」で検索すると未調査の内容が出るよ
※「要勉強」で検索すると/未勉強の内容が出るよ


# 試験系
## str_split
文字列解体やデータ整形に使った
https://www.php.net/manual/ja/function.preg-split.php

##### ↓配列の文字列を１文字ずつ分解して、再度配列に入れ直す手段

```php:hoge.php
// hogeという文字列があるとする
$array = array('hoge')

foreach ($array as $k => $v) {
    // 配列内の文字列を１文字ずつに分解し再格納
    $array = str_split($v);

print_r($array);
exit;
// 0=>h ,1=>o, 2=>g, 3=>e　みたいになるはず
```



##### ↓配列の文字列の中に、空白などが含まれている場合

```php:hoge.php
// ho ge ho geという文字列があるとする
$array = array('ho ge ho ge')

foreach ($array as $k => $v) {

    // カンマまたは " ", \r, \t, \n , \f などの空白文字で句を分割する。
    $array = preg_split("/[\s,]+/", $v);

print_r($array);
exit;
// 0=>ho, 1=>ge, 2=>ho, 3=>ge　みたいになるはず

$lines = preg_split("/\s/",$value);
// とかで処理したこともあるが、何が違うのか覚えてない
```



## strcmp
文字列の順番を入れ替えるバブルソートの時に使おうと思ったやつ
https://www.php.net/manual/ja/function.strcmp.php

##### ↓１つ前の文字列を比較して、入れ替えたい処理
⚠️正しくない処理なので注意⚠️
この場合、大なり小なりの判定結果が-1,0,1で返ってくるらしい

```php:hoge.php
// そえぞれの配列にh o g eという文字列があるとする
$array = array('h' , 'o' , 'g' , 'e');

// 初期化
$count = 1;

foreach($array as $k => $v){
    // 1つ隣なので、keyが[1]以降から処理
    if($k >= $count){
        // 文字列の比較判定
        $array = strcmp($array[$k-1] , $v);
        // 1つ後ろの配列と比較 1個前のデータの方が大きかったら
        if($check > 0){
            $tmp = $v;
            print_r($tmp);
            $v = $array[$k-1];
            print_r($v);
            $array[$k-1] = $tmp;
            $i++;
        }
    }
    if($sort_count > 0){
        return ex_bubble_sort($array);
    }
    else{
        return $array;
    }
}

print_r($array);
exit;

// ehgoとかにしたかったんや・・・要勉強
```


# 実務系
## in_array()
配列に値があるかチェックするやつ
https://www.php.net/manual/ja/function.in-array.php

## throw new HttpNotFoundException;
http://fuelphp.jp/docs/1.6/general/error.html
404をスローしている

## Response::redirect($hoge[$hoge], 'hoge', 301);
http://fuelphp.jp/docs/1.7/classes/response.html
新しいURLにリダイレクトする方法を提供

## Uri クラス
http://fuelphp.jp/docs/1.6/classes/uri.html
└URIとURLの違い
　https://webtan.impress.co.jp/e/2010/03/09/7539

```php:hoge.php
Uri::String() // 現在のURIを取得することができる
```

## DELETE
SQLでデリートするときはIDなどをWHEREで絞ろう

## jQueryで子要素を取得する方法：children(), find()
https://uxmilk.jp/10873

childNodes
https://www.javadrive.jp/javascript/dom/index4.html

JavaScriptでiframeを操作する方法
https://techacademy.jp/magazine/23192

## str_replace('\\', '\\\\', $hoge['hoge']);
フォーム内の文字列に「\」がある状態で、DBにPOSTすると文字化ける
なので、\\にさせることで\を表現する処理

## 関数
public static functionにすると簡単にインスタンス化できるようになる
というより呼び出せる範囲とかが増える感じっぽい

# 悩んだら
```php:hoge.php
print_r('<pre>');
print_r($provision_list);
print_r('</pre>');

var_dump($変数名など);
exit;
```



✨整理前の吐き出しだけだよ✨
nginx image に mysql を入れる際の注意点


## 対象
docker 環境で [nginx の公式image](https://github.com/nginxinc/docker-nginx/blob/793319d7251c03eccecbf27b60e0cfbbd2d1f400/stable/buster/Dockerfile) に mysql クライアントをインストールする際に詰まった人 :rolling_eyes: 


### 調査＆解決

上記のリンクから確認できるが、 公式image は `FROM debian:buster-slim` を使っている。
ベースイメージが debianであることがわかったので https://hub.docker.com/_/debian を見ると
buster-slim は debian 10系で有ることがわかった。

buster系では `mysql-client`が存在しないので [default-mysql-server](https://packages.debian.org/buster/default-mysql-server ) を使用してinstallする


```bash
$ sudo apt-get update
$ sudo apt-get install default-mysql-server
```

これで入る。
Gitlab⇒Githubに移行した話

## 会社の都合で移行するぞーってなった備忘録

	1	旧リポジトリのミラーリポジトリを開発用PCに作る
		git clone --mirror git@gitlab_gitname tmp
		
	2	ミラーリポジトリに入って内容物を確認
		cd tmp
		ls -l
		
	3	remote originのURLを新リポジトリに向ける
		git remote set-url origin git@github_gitname.git
		
	4	新リポジトリにミラー内容をpush
		git push --mirror origin
		
	5	新リポジトリからcloneしてくる
		git clone git@github_gitname.git
    
    


SSHでミラー出来ない場合はHTTPSでやるとうまくいった
SSHでミラーする場合はSSHキーを作り直すとうまくいくらしい
tmpファイルはあとでいらなくなるので消してもいい。
MinGW（gcc）でDarknetをコンパイルする方法

Pure C言語でyoloを動かしてみたいと思い、ちょっと苦戦しましたができたので、メモとして残します。

まぁ、Windows＆C言語でDarknet-yoloをやりたいって人がどれだけいるか分かりませんが・・・

<br>

# MinGW編

MinGWとは、ザックリ言えば「**Windows版gcc**」のこと。

「WindowsでもLinuxと同じようにC言語やC++をコンパイルできるもの」って思ってください。

## MinGWのインストール手順

近いうちMinGWのインストール手順は書いてみます。

とりあえずMinGW自体のインストール手順はいっぱいありますが、その中で（個人的に）一番分かりやすかった以下のURLを参照してください。

https://webkaru.net/clang/mingw-gcc-install/



## MinGWでpthreadを使えるようにする

上記のURLに従ってMinGWをインストールしたことを前提に記します。

* [Windowsキー]を押して、スタートメニュを開き「mingw」と入力して、

![000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614920/db2a4253-4ffe-72dd-7951-a7d37efaf280.png)


* 以下の手順を実行

```
1. 以下のタブを順番にクリック
「All Package」 → 「MinGW」 → 「MinGW Libraries」 → 「MinGW Standard Libraries」

2. 「MinGW Standard Libraries」にある、以下２つのチェックボックスを選択して、
   「Mark for Installation」を実行
```

![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614920/2899c387-a9ab-a2ba-21a8-2be78667a073.png)


* チェックを入れたら「Installation」→「Apply Changes」を順番でクリックし、出てきたダイアログの「Apply」を実行

![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614920/1b3d77cb-6c92-6050-6543-8748653bbbc6.png)

* 念のため適当なCプログラムを作成し、`#include <pthread.h>` を記述してコンパイルが正常にできるか確認

```c:test.c
#include <pthread.h>

int main(void) {
    return 0;
}
```

```powershell
PS > gcc test.c
PS > # エラーが出なければOK
```

MinGW編　終わり


<br>


# Darknet編

## Darknetのダウンロード

<font color="red">gitコマンドを使えるようにしておいてください。</font>

* [pjreddie/darknet](https://github.com/pjreddie/darknet) より、以下のコマンドでソースコードをダウンロード

```powershell
PS > git clone https://github.com/pjreddie/darknet.git
```

> WindowsまたはLinux向けのDarknetもあるっぽいですが、今回はノンタッチ。
> https://github.com/AlexeyAB/darknet

## MinGWでDarknetコンパイル

* ダウンロードした`darknet -> examples -> go.c`に、`#include <winsock2.h>`を追加

![003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614920/09add84a-b984-078f-b20d-fe0744978a3b.png)

* `darknet -> Makefile` を以下のように編集。

| No. | やること | 図 |
| --- | --- | --- |
| 1. | `LDFLAGS` に `-lws2_32` を追加 | ![004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614920/be9c71b4-ed77-2954-5234-d6233626adc7.png) |
| 2. | `mkdir`のオプション`-p`を削除<br><br>`obj`、`backup`、`results`の3か所 | ![005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614920/6a8e402e-f79f-006c-013f-f0e6f7244b92.png) |


* 最後に`darknet`フォルダ下で`mingw32-make.exe`コマンド（Linuxでは`make`）を実行。

```powershell
PS > cd darknet
PS darknet> mingw32-make.exe
```

色々Warningが出るけど、大丈夫っぽい。

![006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614920/bd4b55c3-80ad-ae81-d194-f925200ed23d.png)


Darknet編　終わり
MacでCalendarAgentのCPU使用率が高いとき

CalendarAgentのDBを再構築することで、CPU使用率を下げることができた。

やり方
1. システム環境設定 -> インターネットアカウント -> iCloudやGoogleなど、同期している「カレンダー」のチェックを外す
2. コマンドプロンプトなどから、以下のコマンドを入力。
`rm -r ~/Library/Calendars/ ~/Library/Preferences/com.apple.iCal.plist`
3. システム環境設定 -> インターネットアカウント -> iCloudやGoogleなど、同期したい「カレンダー」をチェックする

参考文献には書いてないが、各手順ごとに一応再起動をしてみた。
これでCalendarAgentのCPU使用率が高くなることがなくなった。

かなり古くからある問題みたいだが、日本語記事が少ないのでメモで残しておく。

参考:
https://mydesultoryblog.com/2020/02/high-calendaragent-cpu-use-on-apple-macos-catalina-10-15-3/