OmniAICreator/Qiita-1.07M huggingface dataset:
vscode で Run Test 実行前に、サーバーを立ち上げておきたい！

# TL;TR

- VSCODE の テスト(Run Debug)設定ファイル `vscode/launch.json`, `tasks.json`を用意
- `configuretion.preDebugTask` を独自の前処理を記述


# 目的:Unit Test の前にサーバー起動したい。

Django で Unit Test を用いた開発をしている。

サーバーの挙動を確かめる機能テストする場合、テストの間、サーバーが立ち上がっていないといけない。

毎回テストのときに手動で立ち上げるのは面倒なので、`python3 manage.py runserver`を`python3 manage.py test`の前に勝手に実行して、勝手にバックグラウンドで走り、勝手に終了してほしい。

# 方法

- VSCODE の テスト(Run Debug)設定ファイル `vscode/launch.json`, `tasks.json`を用意
- tasks には 実行したいコマンドに名前をつけられて、いつ実行させるかを設定できる
- task`start server`を定義し、`configuretion.preDebugTask`を実行させる。
    - その際に background で走る設定を加える。
- task`stop server`を定義し、`configuretion.postDebugTask`を実行させる。
    - テストが終わった時点で、サーバーの terminate する処理を実行させる。

# launch.json

```json
{
    // IntelliSense を使用して利用可能な属性を学べます。
    // 既存の属性の説明をホバーして表示します。
    // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Functional Test",
            "type": "python",
            "request": "launch",
            "program": "functional_tests.py",
            "console": "integratedTerminal",
            "cwd": "/workspaces/django_tdd/superlists",
            "preLaunchTask": "start server",
            "postDebugTask": "stop server"
        }, 
        {
            "name": "Unit Test",
            "type": "python",
            "request": "launch",
            "program": "manage.py",
            "args": ["test"],
            "console": "integratedTerminal",
            "cwd": "/workspaces/django_tdd/superlists"
        }
    ]
}
```


# tasks.json

```json

{
    "version": "2.0.0",
    "tasks": [
      {
          "label": "start server",
          "type": "shell",
          "isBackground": true,
          "command": "cd /workspaces/django_tdd/superlists; python3 manage.py runserver"
      },
      {
          "label": "stop server",
          "command": "echo ${input:terminate}",
          "type": "shell"
      }
    ],
    "inputs": [{
      "id": "terminate",
      "type": "command",
      "command": "workbench.action.tasks.terminate",
      "args": "terminateAll"
    }]
  }
```

# 終わりに
- 便利。拾い物だけどいい感じ。
- vscode がなにかポップアップを出してくるかもしれないが、一度許可すると以降は出なくなり、問題なく使用できるようになった。


# (もっとシンプルな方法があったら教えていただきたい。)

# 参考文献

https://christianheilmann.com/2022/03/17/automatically-starting-a-server-when-starting-a-debug-session-in-vs-code/
情報共有の精度を上げるIT技術

# はじめに
IT×ビジネスという視点で週1本記事を投稿しています。
もし興味のある方は下のリンクから他の記事も見ていただければ幸いです。
 [@7_inai_](https://qiita.com/7_inai_)

# この記事を書くに至った背景
情報社会と呼ばれる昨今、毎日滝のように流れてくる新しい情報に飽き飽きしている方もいるのではないでしょうか？現在の私たちの1日に接する情報量は、平安時代の人達の一生分、江戸時代の人達の一年分とも言われています。少し大袈裟なとも思いますが(笑)、それだけの情報に手軽に触れられるようになったいうことは確かでしょう。

では、本当に必要な情報を漏れなく確実に保管・伝達を行うにはどうすればいいでしょうか？手書きのメモや口頭での伝言などといったアナログ的なやり方も大切だとは思いますが、この記事ではITを活用した情報共有について、次の2つの企業がリリースしているツールを通して記載していきたいと思います。
・Google
・サイボウズ

# ■Google × Workspace
Google Workspaceは、 `Googleが組織向けに提供するオンラインツール` です。
Google Workspaceには、GmailやGoogleカレンダーのような一般ユーザーからも馴染みのあるアプリを含め合計14個のアプリがあります。

### Google Workspaceの特徴
Google Workspaceの最大の特徴は、 `それぞれのアプリが単体で動いているのではなく連携し合っていること` です。例えば、メールにドキュメントを添付して送信するのではなく、ドキュメントを共同でリアルタイムに同時編集する(Google Drive)。Google カレンダーから招待されたWEB会議（Google Meet）に参加する。Gmailのメール画面からチャット（Google Chat）を行うなど、アプリケーション同士の繋がりが深く、いちいち各アプリケーションを立ち上げる必要がないだけでなく、データの連携を素早くすることができます。
また、Cloud Searchというアプリを使用すると、 __Workspace全体に対して探したいファイルを包括的に検索__ することができます。私の勤めている企業では、MicrosoftのOffice365を使用していますが、ファイルがメールから送られてきたのかTemasで送られてきたのか、はたまた共有フォルダから取得したのかわからなくなり、探し出すのに時間を要することがよくあります。しかし、Google workspaceを使用すればそういった探し物に要する時間を短縮することができます。


### 無料版と有料版のGmailは何が違う？
workspaceを使用していなくても、無料版のGmailを使用している人は結構いるのではないでしょうか？では、なぜ無料で使用できるGmailではなく、有料版のGmailを使用するのでしょうか？
正確に言うと、 __Gmailの有料版というものは存在せず__ 、グーグルのビジネスツールをパッケージ化した「Google Workspace（グーグルワークスペース）」の中に __ビジネス版のGmailが含まれている__ という表現が正しいです。
有料版(ビジネス版)のGmailの最大のメリットは独自ドメインを使用できることです。
通常のGmailのアドレスは、XXX＠gmail.com で統一されていますが、有料版のGmailでは、XXX＠inai.coというように＠以降を自由に設定することができます。
他にもストレージの容量やセキュリティの違いがあります。

# ■サイボウズ × kintone
kintoneは、手軽で素早い __「ファストシステム」__ をコンセプトにした業務アプリを作成するクラウド型のグループウェアです。サイボウズには、GaroonやサイボウズOfficeのようなグループウェアもありますが、それらは、一般的に必要なITツールがワンパッケージで揃うことを特徴としており、どちらかというと前述のGoogle Workspaceと似ていることから、少し違う用途で使用されるkintoneについて記載します。

### kintoneでノーコード/ローコード開発
kintoneの特徴は、グループウェアの中でも特にカスタマイズ性が高いことです。kintoneはノーコードまたは、ローコードでカスタマイズが行えるグループウェアです。
kintoneでは、「多種多様に分かれるビジネスモデル」や「社内ルール」に応じたアプリを簡単に自作することができます。

※ちなみにですが、ノーコードとローコードの違いとしては、以下のようなイメージになります。
`kintoneの標準機能の範囲で使用する場合はノーコード開発。プラグインやAPIなどの他システムなどと連携してカスタマイズを行うとローコード開発になります。`
ノーコード/ローコード開発については、以前まとめた記事がありますのでこちらをご覧ください。
[「ノーコード/ローコード開発でビジネスがどう変わる？」](https://qiita.com/7_inai_/items/c88513247a5c5fb44245)

### アプリを使った情報共有
kintoneのアプリには、データを蓄積・一覧・検索できるデータベース機能と、業務を円滑に進めるためのコミュニケーション機能が備わっています。
具体的に言うと、アプリに蓄積したデータを一覧情報として閲覧したり、検索機能により探し出したりすることができます。また、アプリに溜めた一つ一つのデータに対してコメントを入力することも可能です。これらの機能より、アプリを用いて簡単に情報共有することができます。


# 終わりに
同じグループウェアでも、「料金、導入障壁、使いやすさ、セキュリティー」など色々な面での違いや、各グループウェアの強みがあります。もし導入される場合は、自身の望む機能があるかや、使用したい環境に適切かをよく考えて導入するようにしましょう。

最後までお付き合いくださりありがとうございました。
バブルソート

## はじめに
前回は挿入ソートを振り返ったので、次はバブルソート。

## バブルソートとは
隣り合う数字の並び順が逆になっている要素がなくなるまで、以下の処理を繰り返すソート手法。

1.  配列の末尾から順に隣接する要素の大小を確認
1.  大小関係が逆ならば要素の入れ替え(交換)をする


### 具体例

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199864/7603e646-466b-d78b-ff31-8f2a4ec7c29f.png)

### 計算量
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199864/ef99efdb-d6ea-93ad-9a81-1a5b307c9947.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199864/82649a1e-f700-cacf-e158-995f49d53915.png)





### ソースコード
数字配列を受け取って、並び替えて返す関数を作成。
```cpp
vector<long> bubbleSort(vector<long> v)
{
	long n = v.size();
	for (long i = 0; i < n - 1; i++) // 確定した数字の数
	{
		for (long j = n - 1; j >= i + 1; j--) // 比較を行う範囲
		{
			if (v[j - 1] > v[j])
			{
				long tmp = v[j];
				v[j] = v[j - 1];
				v[j - 1] = tmp;
			}
		}
	}

	return v;
}
```


## 前回記事
* [挿入ソート](https://qiita.com/shamterk/items/5ade56773db0f19c95fa)
[WIP]　Access（FormGUIアプリケーション）操作時にスクリーンショットする

# Access（FormGUIアプリケーション）操作時にスクリーンショットする

# なんで？
→開発側しかり、ユーザーが操作したときのログキャプチャ機能として
→→主要な操作ポイントだけ保存でもいい
~~→→→それならそもそもログ出力のほうがスマート（気づく）~~
~~→→→→でも結局ユーザー（顧客とか）にログ見せても仕方ないので、キャプチャ見てもらったほうが早い~~

# 結論（どうすればよいか）
1
とりあえず、64bit対応のWin32が多分必要
→Win32の64bit対応のVBA書くときに宣言するやつのまとめ表をいつか作っておく。~~そもそも未だにVBAなんて書くなんて信じｒ~~

2
Clickイベントなどに仕込みたいが共通化のため継承とか
~~それかスパゲッティコード~~


# 参考：
https://www.599cd.com/tips/access/141219-screenshot/
Kotlinのcontext receivers機能試しに触ってみた

Kotlin1.6.20からContext Receiversという機能がプロトタイプ版として使えるようになりました。
https://blog.jetbrains.com/kotlin/2022/02/kotlin-1-6-20-m1-released/

Kotlinは言語仕様的に成熟しており、言語仕様の追加は珍しかったので、キャッチアップがてら触ってみました。雑なメモ記事です。

# 試し方

上に添付したリリース記事に記載されているとおり、コンパイラオプションとして `-Xcontext-receivers` を追加した上で起動すれば大丈夫です。
ちなみにgradleを使っている場合は以下のように書けば動きます。（gradleをKotlinで書いている場合の例です）

```gradle
tasks.withType<KotlinCompile> {
    kotlinOptions.freeCompilerArgs = listOf("-Xcontext-receivers")
}
```

# サンプルコード

以下のようなコードで動きます。
context receiversがまだプロトタイプ版のためIntelliJ上ではエラーになるかもしれませんが、実行すれば動きます。

```kotlin
data class LoginContext(
    val userId: Long,
    val userName: String,
    val email: String
)

fun main(args: Array<String>) {
    val ctx = LoginContext(1L, "Tom", "tom@example.com")
    handleRequest(ctx)
}

fun handleRequest(ctx: LoginContext) {
    with(ctx) {
        doSomeOperation()
    }
}

context(LoginContext)
fun doSomeOperation() {
    println("user [id = ${userId}] do some operation!")
}

```

Scalaのimplicit parameterに似ているなと感じます（Scalaを使ったのが大分昔なので、間違っていたらすみません）。
ログインユーザの認証情報（基本情報）、権限情報、DBのコネクション情報など、引数として引き回したいものがあるときに、活用できそうな機能なので、本実装としてリリースされるのが楽しみです。

他のユースケースについては、KEEP（Kotlinの言語仕様のDiscussionが行われている場所）にいろいろ書かれているようなので、参考として貼っておきます。
https://github.com/Kotlin/KEEP/blob/master/proposals/context-receivers.md#use-cases
【個人開発】ポートフォリオ作成時に気にしたほうがいいこと

# はじめに

1 年目のエンジニアとして働いており勉強の毎日ですが、入社前の、個人開発をしている頃に知っておきたかったことをまとめました。

# 概要

個人開発だと実装が時間的な割合にすると 90％くらいのボリュームを占めると思いますが、実際面接等で聞かれることは「どのように実装したか」ではなく、「どんな目的があったのか」ということが、個人的には多かったです。
<br> 以下のような人を対象にしています。

- 転職のためにこれから何かしらのアプリを作成しようとしている
- エンジニア派遣系の会社で 1 社目が決まらない

# 結論

### 技術選定について考える。

<br>

# 理由

初めてのアプリケーションを開発する際の技術選定の理由なんて、「スクールで使用していたから」, 「調べて情報がいっぱい出てきたから」程度だと思います。実際、流行っているから Django, Rails が本音というケースがほとんどだと思いますし、最初はメリットなんてわからないと思います。
<br>
しかし面接で聞かれるのは「どうやってその機能を実装したか」より、「なんでそのフレームワークを選んだのか」や、「DB は MongoDB にしてどんなメリットがあったか」が多いです。

# フレームワーク毎のメリット・デメリット

### Ruby on Rails

- メリット：
  記述量が抑えられ可読性を確保しやすい点が、少人数での開発を可能にしている。また、日本語ドキュメントが多いため、MVC モデルを理解しつつ効率的に学習ができるでしょう。
- デメリット：
  一般的に規模が処理速度が遅くなると言われています。速度が求められる系のゲーム開発等には向かないかもしれませんが、SNS などの Web アプリケーションであれば問題はないでしょう

### Django

- メリット：
  Python を使用しているため、機械学習や OCR の技術を使用する Web アプリの場合に、親和性が高いと思われます。また、他の Python を用いた Web フレームワークと比べ、機能面やセキュリティ面で多くの機能があるため、必要に応じて拡張が可能になっています。
- デメリット：日本語情報は少ない印象。Google 翻訳頼りになる。処理速度は Rails と同じくスクリプト言語のため同じくらい。

# まとめ

本当に業務で技術選定から関われるレベルになると、希少価値の高いエンジニアとして扱われますので、初学者がいきなりそれと同等のレベルで理由付けができるわけではありません。ですが技術について学び続けられる人であれば、使う道具はどんな性能かについて興味が出てくると思いますので、少し調べてみるということは大事です。いろんな技術に触れた経験があるわけではないと思いますので、経験から理由を作るのは難しいので、ネットで一般的に言われていることを調べるところから初めて見るのもいいでしょう。
IntelliJ IDEA CommunityでJenkinsfileを開発する


# はじめに

そろそろいい感じにJenkinsfileを編集できる
いい感じのエディターがほしいと思って調べたらIntelliJ IDEA Communityが一番良さそうだったので、設定方法の紹介

# 0. IntelliJ IDEA Communityのインストール

[IntelliJ IDEA Community](https://www.jetbrains.com/ja-jp/idea/download/#section=windows)をインストールしてください。
全部デフォルトで大丈夫なはずです。

# 1. JenkinsfileのあるリポジトリをIntelliJ で開く

普通にopenで開いてOK

# 2. JenkinsfileのDeclarative Pipelineの補完が効くようにする。

## gdslのダウンロード
以下のどちらかの方法でgdslを取得して「ソースコードのあるディレクトリ/.gdsl」にDLしてくる。

1. https://[自分のjenkinsurl]/pipeline-syntax/gdsl
2. https://github.com/jkroepke/jenkins-declarative-gdsl/blob/master/jenkins.gdsl

2を落としちゃうのが多分楽だと思います。
自分でなんか作ってもいいと思います。（仕様知らないけど）

## もしディレクトリの色が青でなければ、ディレクトリを右クリックしてSource Rootに設定する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77177/11cdf739-ae87-a813-a068-d196f62ce8d0.png)

ここまでやるととりあえずコード補完が効いて快適に開発できると思います。

# 3. プラグインのインストール

このあたりは必要ならだと思います。

File > Setting > Jenkinsと検索して上位2つは入れておくといいかも
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77177/5414d015-6ffd-1ba1-e508-4e33007c5911.png)

これらはインストール後にSettings > Tools > プラグイン名で設定を入れることが来ます。
基本的には自分のプロジェクトのJenkinsかlocalhostに立てたJenkinsを指定してあげるといいと思います。
このあたりは、プラグインのドキュメントを読むといいと思います。

* [Jenkins Control](https://github.com/MCMicS/jenkins-control-plugin/blob/v0.13.11/README.md)
* [Jenkins Pipeline Linter](https://github.com/MikeSafonov/jenkins-linter-idea-plugin)


# 4. jenkinsのライブラリを読み込む

プロジェクトを右クリックしてOpen Module Settingsから設定します。
Modulesで追加していきます。
Jenkinsが入っていれば、Windowsであれば通常「C:\Program Files (x86)\Jenkins\plugins」「C:\Program Files (x86)\Jenkins\war\WEB-INF\lib」あたりに必要なものが揃っていると思います。
ちゃんと読み込むと型補完が聞くので便利です。（scriptブロックのみ）
【Nuxt.js】Nuxt.jsで部分的に静的なhtmlファイルを表示させたい

# ファイル構造を以下にする（結論）

```
├── static
│　　　　　　└── aaa.html （htmlファイル）
├── pages
│　　　　　　├── bbb.vue
│　　　　　　└── ccc.vue
```

# なぜこんな記事を書いたか
シンプルだが意外とhtmlファイルを表示させる、といった記事がなかったため。
もし誰かのお力になれましたら幸いでございます。
git config --global --add safe.directory '...' が出たとき

# はじめに
USBメモリ上のディレクトリに対してリモートリポジトリ設定を行おうとすると，中々うまくいきませんでした．
かなり手こずってしまったので，私の場合の解決方法を残しておきます．

# 環境
- Windows 10
- USB3.0 メモリ

# エラー内容
USBのファイル名は `F:` で対象ディレクトリは `workspace` です．

```bash:コマンドプロンプト
F:\workspace>echo "# my-repo" >> README.md

F:\workspace>git init
Reinitialized existing Git repository in F:/workspace/.git/

F:\workspace>git add README.md
fatal: unsafe repository ('F:/workspace' is owned by someone else)
To add an exception for this directory, call:

        git config --global --add safe.directory 'F:/workspace'

# 以下略
```

# 解決方法
`safe.directory` として，該当のディレクトリを登録してあげます．
しかし，エラーに出ている通りに以下のコマンドを`コマンドプロンプト`でタイプしてもうまくいきません．

```bash:間違い
git config --global --add safe.directory 'F:/workspace'
```

`'F:/workspace'` の部分を `F:/workspace` に書き換えて，

```bash:修正版
git config --global --add safe.directory F:/workspace
```

とするとうまくいきました．
ディレクトリ名を囲うクオーテーションを消しました．

## 注意点1
エラーが提示した `'F:/workspace'` のまま実行すると，`safe.directory` として登録されるディレクトリ名にもクオーテーションが含まれてしまいます．

以下のコマンドで，`safe.directory`を確認できます．

```bash:コマンドプロンプト
git config --global -l | find "safe.directory"
```
出力は以下のようになります．

```bash:コマンドプロンプト
# 正しいコマンドの場合
safe.directory=F:/workspace

# クオーテーションありで実行した場合
safe.directory='F:/workspace'
```

## 注意点2
Windows環境での実行ではありますが，ディレクトリ名の区切りは `バックスラッシュ(\)` ではなく，`スラッシュ(/)` を用います．
なので，`F:\workspace` のようなディレクトリ名は不正です．

正しくは，`F:/workspace` のようなスラッシュ区切りです．

# おわりに
こんな単純な設定周りの問題だったのに，割と解決までに時間を要してしまった(エラー通りに素直に実行していたため)ので，同じ轍を踏む方が少しでも減ることを祈っています．

それでは:wave:

# 参考記事
- [いきなりgitが使えなくなった - 2022](https://www.nda.co.jp/memo/git_safe_directory/)
ポエムと呼ばないで

何をポエムと呼ぶか、何をポエムと呼ばないかは個人の自由である。

仕様を自然言語で書くのやめませんか。「言葉にすれば」「嘘に染まる」水谷啓二・ダンシングオールナイト　もんたよしのり

https://qiita.com/kaizen_nagoya/items/dd6ee74818f1a1a1c918

自然言語で意思疎通する限り、嘘に染まらずに、大事なことをすることはできないというのが経験則。

ポエムというのが、嘘であってもかまわない。

じゃ、「ポエムとは呼ばないで」というのが、誰が誰に対する伝言かを記録する。

# 主人公（第一者）

文章そのもの。

自分のことを、「ポエムとは呼ばないで」と言っているとする。

じゃ、主人公が誰なら、ポエムと呼んで欲しいと言っているか。

プログラムは詩のように描こう

https://qiita.com/kaizen_nagoya/items/dd2a912f23b18e0f8893

ここでの定義では、プログラムのソースコードがついているものが、poemです。


プログラムは詩を創るように

https://researchmap.jp/blogs/blog_entries/view/78451/092943ce613cd4029b8d03518f62da82?frame_id=407644

programming like making a poem.

https://qiita.com/kaizen_nagoya/items/07ed8747f0811d070070

本論では、何をポエムと呼ばないでと言っているかは記述しない。

プログラムはpoemと呼んでという主張をしていることは明記する。

言葉にすれば、意志が通じるとは限らない。

立場の違いは言葉では超えられるとは限らない。

数学であれば、通じるということはないことや、
物理学であれば、通じるということはないことを目撃してきたような気がする。

初期条件を含む事前条件、制約条件、事後条件など、少しでも違えば、意味が違うことがある。

# 書き手（第二者）

書き手は、事後には読み手となる。ここでは、書き手を読み手に含めて、第二者とする。

# 計算機・機械学習（第三者）
第一者、第二者がいれば、第三者も決めておくといいかもしれない。

計算機の機械学習を第三者とする。

第一者、第二者が入力したプログラム、データも機械学習の処理に影響を与える。

純粋な第三者は存在することはありえないのかもしれない。

### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。
#### Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
SetupAPIを使用してデバイスを列挙する

# 課題：特定のカテゴリーのデバイスを列挙したい
ここでは例として[生体認証デバイス]下にあるデバイスを列挙します。
![デバイスマネージャー：生体認証デバイス一覧.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608900/c5ab58b2-1de0-c7b5-2307-0cf80851a785.png)

生体認証デバイスは、クラスGUIDが"{53d29ef7-377c-4d14-864b-eb3a85769359}"になります。これを利用して列挙します。
![生体認証デバイスのプロパティ：クラスGUID.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608900/870c512d-d419-e6d6-631b-ce2b7042a499.png)

# サンプルコード
下記が、クラスGUIDを使用して生体認証デバイスを列挙するサンプルコードになります。
```C++
// ====================================================================================================
//  インクルード
// ====================================================================================================
#include <conio.h>
#include <stdio.h>
#include <combaseapi.h>
#include <Setupapi.h>

// ====================================================================================================
//  ライブラリ
// ====================================================================================================
#pragma comment(lib, "Setupapi.lib")

// ====================================================================================================
//  エントリーポイント
// ====================================================================================================
int main()
{
    HRESULT hr = S_OK;
    HDEVINFO hDevInfo = INVALID_HANDLE_VALUE;

    try
    {
        // 生体認証デバイスのGUID
        GUID BiometricGuid;
        CLSIDFromString(L"{53d29ef7-377c-4d14-864b-eb3a85769359}", &BiometricGuid);

        // デバイス情報セットを取得
        hDevInfo = SetupDiGetClassDevs(&BiometricGuid, NULL, NULL, 0);
        if (hDevInfo == INVALID_HANDLE_VALUE)
            throw HRESULT_FROM_WIN32(GetLastError());

        // デバイス情報セットを確認
        SP_DEVINFO_DATA stDevInfo;
        ::ZeroMemory(&stDevInfo, sizeof(stDevInfo));
        stDevInfo.cbSize = sizeof(stDevInfo);

        DWORD dwIndex = 0;

        while (SetupDiEnumDeviceInfo(hDevInfo, dwIndex, &stDevInfo) == TRUE)
        {
            // デバイス名の取得
            DWORD dwRegType = 0;

            wchar_t pwcDeviceName[_MAX_PATH];
            ::ZeroMemory(pwcDeviceName, sizeof(pwcDeviceName));

            DWORD dwSize = _MAX_PATH;

            if (SetupDiGetDeviceRegistryProperty(hDevInfo, &stDevInfo, SPDRP_DEVICEDESC, &dwRegType, (BYTE*)pwcDeviceName, dwSize, &dwSize) == FALSE)
                throw HRESULT_FROM_WIN32(GetLastError());

            // デバイス名を標準出力へ表示
            wprintf(pwcDeviceName);
            wprintf(L"\n");

            // 次のデバイスへ
            ::ZeroMemory(&stDevInfo, sizeof(stDevInfo));
            stDevInfo.cbSize = sizeof(stDevInfo);
 
            dwIndex++;
        }
    }
    catch (HRESULT hrError) { hr = hrError; }
    catch (...) { hr = E_UNEXPECTED; }

    if (hDevInfo == INVALID_HANDLE_VALUE)
        SetupDiDestroyDeviceInfoList(hDevInfo);

    _getch();
    return 0;
}
```
これを実行すると、下記画像のように生体認証デバイスが列挙できます。
![実行結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608900/79bb239d-6a26-d7c2-b56e-bdc8e0df941d.png)
編集リクエスト処理は早急に

編集リクエスト処理は早急にしないでいて、何人もの方のお手を煩わせることになってしまった。

コメントは原則、いいね（LGTM)してくださった方にしか答えないことを原則としている。

理由としては、いいね（LGTM)をせずに、コメントをする方と、意思疎通はほぼ不可能だというのが経験則です。

通信規約で、Aを送ってからBを送るというような順番が違う場合でも、意思疎通することは可能な場合がある。

人間のような複雑系では、一つ手順が違うと、意思疎通はほぼ不可能かもしれない。

「あいさつしないやつとは口聞かない」という方針の方をお見受けすることがある。

長らく、その趣旨がわかっていなかった。

人格改造　あいうえお。仮説（185）

https://qiita.com/kaizen_nagoya/items/bfae8b4a486ee5fd72de

西野亮廣 挨拶 @kazuo_reve 新人展開(62)

https://qiita.com/kaizen_nagoya/items/f444d42862f0b88817da


編集リクエストは、コメントへの対応と同じというわけにはいかない。

中身のことはともかく、気になったのでちょっと「編集リクエスト」を送ってみた、という軽いのりから、いろんな方が想像できる。

一律な対応よりは、何の編集リクエストかを、なるべく早く確認することが大事だろう。
デザインパターンの基本（TECHSCORE読書会）

# 目的
ちゃんと勉強していなかったデザインパターンを学習したい。
TECHSCORE様のまとめ（何度か3日坊主に）を読み切りたい。

# 本日のページ
https://www.techscore.com/tech/DesignPattern/foundation/foundation1

# オブジェクト指向
## オブジェクト指向とは
* 機能を定義するのは「クラス」、実態を伴うのは「オブジェクト」
* オブジェクト指向は、クラスを定義しオブジェクト同士の相互作用を表現する

## オブジェクト指向の利点
* コードの「再利用」が可能で、「生産性の向上」が期待できる
* 「再利用」が繰り返され、コードの「信頼性」が向上する

オブジェクト指向の利点を活かすために、再利用性の高い設計にする必要がある。

# デザインパターン
## デザインパターンとは
* オブジェクト指向における再利用のためのデザインパターン

## デザインパターンの利点
* よく出会う問題とそれに対処する良い設計をたくさん知っていればスムーズに良い設計ができる
* 技術者同士の意思疎通が容易になる
【Laravel】どのクラスに置くか・if文は文章化しよう【リファクタリング】

## 環境
Laravel v9.5.1 (PHP v8.1.3)

## 前提
恥ずかしながらリファクタリングをまともにやったことがなく、最近覚えたリファクタリングの際の小ネタをまとめる。


## 小ネタ①

```$request->user()```の情報を使わないならそのクラスに置くべきでない。

### before

- ポイントを加算し、ポイント履歴をつける```addPoints```メソッドのリファクタリング
- User - PointWallet＝```1:1```
- User - PointHistory＝```1:多```


```user```が```addPoints```するものだと思い、```addPoints```メソッドをUserモデルに置いていた。
```addPoints```メソッドで```$request->user()```の情報が使われていないなら、このメソッドがUserモデルのインスタンスメソッドであるとはいえないので、適したクラスに置こう。

```AddPointController.php
class AddPointController extends Controller
{
   public function store(Request $request): JsonResponse
   {
      $request->user()->addPoints($request->user_id, $request->points);

      return response()->json(Response::HTTP_OK);
   }
}
```

```User.php
class User extends Authenticatable
{
   ...
   public function addPoints(int $userId, float $points): void
   {
      self::find($userId)->pointWallet()->increment('points', $points);
      PointHistory::create([
        'user_id' => $userId,
        'amount' => $points,
      ]);
   }
}
```

### after

UserモデルではなくPointWalletモデルに置くことに。

```AddPointController.php
class AddPointController extends Controller
{
  ...
  public function store(Request $request): JsonResponse
  {
    $pointWallet = User::find($request->user_id)->pointWallet;
    $pointWallet->addPoints($request->points);

    return response()->json(Response::HTTP_OK);
  }

}
```

```PointWallet.php
class PointWallet extends Model
{
   ...
   public function addPoints(float $points): void
   {
      $this->increment('points', $points);
      PointHistory::create([
        'user_id' => $this->user_id,
        'amount' => $points,
      ]);
   }
}
```


## 小ネタ②
if文の中は文章になるように条件文を命名する。



### before
「```is_null($request->user())```＝アクセスユーザーがnullだったら」はまだ単純なのでぱっとみで理解できそうだが、なるべく読み手（他人かもしれないし未来の自分かもしれない）の脳のリソースを削がないようにする。

```PostController.php
class PostController extends Controller
{
   public function store(Request $request)
   {
      if (is_null($request->user())) {
         // 何か処理
      }

      return response()->json(Response::HTTP_OK);
   }
}
```

### after
「アクセスユーザーがnullはこの仕様でいうとつまりどういうことか？」を英語にする。
ここでは「アクセスユーザーがnull＝ゲストユーザー（新規登録してない）かどうか」ということにした。


```PostController.php
class PostController extends Controller
{
   public function store(Request $request)
   {
      $isGuestUser = is_null($request->user());
      if ($isGuestUser) {
         // 何か処理
      }

      return response()->json(Response::HTTP_OK);
   }
}
```
kubectlの基本操作をまとめてみた。

前回の用語解説に続き、今回はkubernetesのコマンドラインツール、kubectlの基本操作を紹介する。

https://qiita.com/KentaroYoshizumi/items/7d7dcb7db2eee65286f9

kubectlをインストールする。

**前提条件：Docker Desktopがインストールされていること。**

右上の歯車のマークをクリックすると、kubernetesの設定に行ける。
左下のタブから「Kubernetes」⇨「Enable Kubernetes」⇨右下の「Apply&Restart」でkubernetesのインストールを開始する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280830/54c65549-e358-2084-ed29-98c4a2b0d25f.png)

インストールが完了すると左下にkubernetesのアイコンが表示され、「Running」の文字が表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280830/ea193cfa-1e1d-e017-e0f8-c2e415c4c008.png)

### kubectlのインストール

**前提条件：Docker for Macがインストールされていること**
　　　　　**Kubernetes is runningの状態になっていること**
　　　　　**Homebrewが利用可能であること**

#### kubectlとは

クベコントロール。コマンドラインツール。Kubernetesクラスターを制御できる。ymlやコマンドをAPIリクエストに変えてAPIserverに命令を出す。

#### 全体の流れ

**①.kubectlをインストール**

**②.Verの確認**


#### kubectlのインストール
公式ドキュメントによると、kubectlをインストールするには複数のアプローチがあるが、今回はHomebrewを使用してインストールを行なっていく。
下記のコマンドを実行。

```
$ brew install kubectl 
```

![スクリーンショット 2022-06-12 11.00.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280830/ee25bf15-7938-b31c-a107-6d58459eb463.png)

#### Verの確認

```
$ kubectl version --client
```

![スクリーンショット 2022-06-12 11.00.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280830/81e7a817-2fb1-2cf4-81ae-58acdaad08f7.png)

Ver1.21.2が最新であるため、最新のものがうまく入っていることが確認できる。

#### kubectlの構文

```
$ kubectl [command] [TYPE] [NAME] [flags]
```

command部分には、（get,create,patch,delete等）実行したい処理が入る。
TYPEには、（pod,node,service,deployment等）操作するリソースタイプが入る。
NAMEには、指定したリソースの名前が入る。
flagsはオプションで、必ずしも指定されない場合もある。

![スクリーンショット 2022-06-12 17.45.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280830/421232e9-4953-1dcd-e7e9-652c2ddbc424.png)


画像の例では、commandがget,TYPEがnode,NAMEはdocker-desktopとなる。
どんなnodeが存在しているかを表示する。

##### kubectl get
pod/node/service等、リソースを指定して使う。

```
$ kubectl get pod -n kube-system
```

kube-systemというnamespace内のpod情報を表示せよという命令。


##### kubectl describe
指定したリソースの詳細を表示する。

```
$ kubectl describe pod -n kube-system
```

![スクリーンショット 2022-06-13 20.00.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280830/735bd865-cfbc-a7d7-0d87-95d72f9c78de.png)

kube-systemというnamespace内のpodの詳細を表示せよという命令。
やばいくらい情報が表示されて正直引いた。

##### kubectl create/delete

リソースを作成/削除する。

```
$ kubectl create namespace test-ns
```

![スクリーンショット 2022-06-13 20.14.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280830/4bd3c6e8-9e7d-8c9f-d9f7-1c850e6c24ab.png)

test-nsという名前空間を作成している。

```
$ kubectl delete namespace test-ns
```

![スクリーンショット 2022-06-13 20.18.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280830/9483479f-e95d-6366-d7a3-850342d0a991.png)

作成した名前空間を削除している。
【SwiftUI】プライバシーポリシーの設置方法

# はじめに
[AppStoreReviewガイドライン](https://developer.apple.com/jp/app-store/review/guidelines/)には様々な条件があり、その中に[プライバシーポリシーを設置を義務付ける項目](https://developer.apple.com/jp/app-store/review/guidelines/#privacy)があります。
今回はSwiftUIでどのようにプライバシーポリシーを設置すれば良いのかを解説します。

# 方法1
<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/bf21c0aa-a9be-2cbf-9f07-cef6bd3f16c2.gif">

```ContentView.swift
import SwiftUI

struct ContentView: View {
    var body: some View {
        List {
            Link(destination: URL(string: "https://taishin-miyamoto.conohawing.com/PrivacyPolicy/DigitalClock.html")!) {
                Text("プライバシーポリシー")
            }
        }
    }
}
```

# 方法2
<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/4d1f2593-e8c9-ed23-8e6c-708baaa019e3.gif">

```ContentView.swift
import SwiftUI

struct ContentView: View {
    @State var ShowPrivacyPolicy: Bool = false
    var body: some View {
        List {
            Button("プライバシーポリシー") {
                ShowPrivacyPolicy = true
            }
        }
        .fullScreenCover(isPresented: $ShowPrivacyPolicy) {
            SafariView(url: "https://taishin-miyamoto.conohawing.com/PrivacyPolicy/DigitalClock.html")
                .edgesIgnoringSafeArea(.all)
        }
    }
}
```
```SafariView.swift
import SafariServices

struct SafariView: UIViewControllerRepresentable {
    var url: String
    func makeUIViewController(context: UIViewControllerRepresentableContext<SafariView>) -> SFSafariViewController {
        let safariViewController = SFSafariViewController(url: URL(string: url)!)
        safariViewController.dismissButtonStyle = .close
        return safariViewController
    }
    func updateUIViewController(_ uiViewController: SFSafariViewController, context: UIViewControllerRepresentableContext<SafariView>) {
    }
}
```
pythonなのか、python3なのか。

## トラブル
python3系をネットからインストールしたはずにも関わらず、ターミナルでバージョンを確認すると「Python 2.7.16」と表示される。（「Python 3.10.5」と表示されて欲しい）

```console
$ python --version
Python 2.7.16
```

## 原因
バージョン確認のコマンドが間違っていた。
コンピューターによってはpython2系とpython3系の両方がインストールされていることがあり、その場合はコマンドを以下のように使い分ける必要があるらしい。
　
　python2系：python
　python3系：python3

自分のコンピューターにはpython2系がデフォルトでインストールされていたため、pythonコマンドを打つと「Python 2.7.16」と出力されるということだった。
python3系のバージョンを確認したければpython3コマンドを打つと「Python 3.10.5」と出力される。

```console
$ python --version
Python 2.7.16
$ python3 --version
Python 3.10.5
```

## まとめ
Pythonはバージョンによってコマンドが異なるため注意すべし。



## 追記
初投稿です！記事の書き方など提言頂けるととても嬉しいです:bow:
【JavaScript】LoadイベントとDOMContentLoadedイベントの違い

loadイベントとDOMContentLoadedイベントの違いはイベント発火のタイミングです。
・loadイベントは、すべての読み込みが完了した時点でイベントが発火します。
・DOMContentLoadedイベントはDOMツリーの解析が終了した時点で発火します。

***
HTMLからブラウザに表示するまでの流れの中で二つのイベントがどのタイミングで発火するのか大まかに説明します。

1.ブラウザはグローバルオブジェクトであるWindowオブジェクトを生成します。そしてWindowオブジェクトのプロパティとしてDocumentオブジェクトが生成されます。

2.DocumentオブジェクトはDOMツリーを読み込んでいきます。HTMLの解析が終わると**DOMContentLoadedイベント**が発火されます。

3.DOMツリーの構築が完了した後に、画像が読み込まれていきます。読み込みのすべてが完了するとWindowオブジェクトに対して**loadイベント**が発火されます。

***
例えば、画像のプレビュー機能を実装するときなどは、loadイベントではなく、DOMContentLoadedイベントとすることになります。
vue+drf(django rest framework)のcors問題

# はじめに
frontendをvue、backendをdrfでweb appを初めて開発中です。
vueを127.0.0.1:8080(localhost:8080)、drfを127.0.0.1:8000で実行しておきます。
8080から8000に向けてapiリクエスト出してもcorsエラーがでて、getやpostが飛びませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2082391/cd2cf682-c8cf-6096-0013-46e78f292078.png)

webpack devserverを見よう見まねで書いてみましたが、理解するには時間がかかりそうだったため断念しました。
front,backともにcors設定を書くことで解決しました。

# 環境

windows10
vue/cli 5.0.4
npm 8.8.0
vue 2.6.14
Django 3.2.12
drf 3.13.1
django-cors-headers 3.13.0
# 設定(frontend)
非同期通信にaxiosを使用しています。
vueのmain.jsに以下のデフォルト設定を書くことでcors設定を追加できます。
```vuejs:main.js
　axios.defaults.baseURL = 'http://x.x.x.x:nnnn'
　axios.defaults.headers.common['Accept'] = 'application/json'
　axios.defaults.headers.common['Content-Type'] = 'application/json;charset=utf-8'
　axios.defaults.headers.common['Access-Control-Allow-Origin'] = 'http://y.y.y.y:mmmm'
　axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'
```
参考URLに詳しい設定内容が載っています。

また、main.jsで設定する以外にもaxios.createでインスタンス化した場合にcors設定を引数として追加できます。
```vuejs:api.js
import axios from "axios";

const api = axios.create({
  baseURL: "http://localhost:8000/api",
  timeout: 5000,
  headers: {
    "Content-Type": "application/json",
    "X-Requested-With": "XMLHttpRequest",
  },
});

api.interceptors.request.use(
  (config) => {
    store.dispatch("message/clearMessages");
    const token = localStorage.getItem("access");
    if (token) {
      console.log("aiueo");
      config.headers.Authorization = "JWT " + token;
      return config;
    }
    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);
```
# 設定(backend)
django-cors-headersをインストールしてsetting.pyにcors設定を追加してください。

```django:setting.py
INSTALLED_APPS = [
    'corsheaders',
]

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware', 
    'django.middleware.common.CommonMiddleware',

]

CORS_ALLOW_ALL_ORIGINS=False
CORS_ALLOWED_ORIGINS=[
    "http://localhost:8080",
    "http://127.0.0.1:8080",
]

CORS_ALLOW_HEADERS = (
'accept',
'accept-encoding',
'authorization',
'content-type',
'dnt',
'origin',
'user-agent',
'x-csrftoken',
'x-requested-with',
'access-control-allow-origin',
)
```
CORS_ALLOWED_ORIGINSは django-cors-headersのバージョンによってCORS_ORIGIN_WHITELISTと書く場合もあるので
注意してください。

# 参考にさせて頂いたサイト
https://handatec.hatenablog.com/entry/2020/04/21/162535
https://pypi.org/project/django-cors-headers/
基本情報（アナログデータのコンピュータ制御）

コンピュータは現在、あらゆる機器に組み込まれています。
家電製品、駅の改札機、ATM、ビルのエレベータ、工場の工作機会など数えたらキリがないくらいです。

コンピュータの役割は「機器を制御する」ことです。
制御とは目的に適した動作が実現できるように、機器をコントロールすることです。

アナログ情報をコンピュータで受け取って、電気信号を送ることで機械的な動作を実行することができます。
そこで**センサ**と**アクチュエータ**を使います。

アナログ情報を各種センサから電気信号として受け取ると、適宜必要な処理・判断を行なって次の動作を決定し
アクチュエータへと伝えます。

```
センサ 　　　　　　　　　　　　　　　　　　　     →　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　コンピュータ 　             →                   アクチュエータ 
（計測)　　　　A/D変換(アナログからデジタル変換）  (情報処理)    D/A変換（デジタルからアナログ変換)    (物理動作)
```

事象を計測するための装置が**センサ**です。
熱や光をはじめとする自然界のさまざまな情報を量として捉えて、電気信号に変換します。

センサの例としては
温度センサ、加速度センサ、GPSセンサ、照度センサなど

電気信号を物理的な動作に変換する装置がアクチュエータとなります。
モーターや電磁石などを利用して、入力信号を直線運動や回転運動などの機械エネルギーに変換します。
機器を実際に動かす稼働装置となります。

## 機器の制御方式
機器を制御するにあたり、現在よく使われている制御方式が**シーケンス制御**と**フィードバック制御**です。

## シーケンス制御
あらかじめ定められた順序や条件に従って、制御の各段階を逐次進めていく制御方式です。
例えば洗濯機は
```
給水→洗い→すすぎ→脱水
// 開始ボタンを押すと、シーケンス制御によって給水〜脱水へと至る一連の動作が行われます。
```

## フィードバック制御
現在の状態を定期的に測定し、目標値とのズレを入力側に戻して反映させることで
出力結果を目標値と一致させようとする制御方式です。
例えばエアコンは
```
温度を設定→温風を出力→室温を測定→
↑　フィードバック　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　↓
←←←←←←←←←←←←←←←←←←←←←←←←←←←
// 暖房ボタンを押すと、設定温度と室温が同じになるように温風出力を調整しながら動作します。
```

## まとめ
暗記しましょう。
とーふのアウトプットブログ (1) 

# とーふ、技術ブログ始めるってよ
初めまして、とーふという物です。
プログラミングスクールを卒業して就職したのはいいものの焦って就職を決めてしまい
家電量販・コールセンターSESに入り、ヒイヒイ言ってます。
「流石にこのままではまずい、色々と持たない。心が壊れる」と察して転職活動を開始。
無事に転職が決まって、やっと開発ができるSESに入社が決まった者です。

スクールの頃からRubyをメインに触っていたのですが、就職に伴ってこの度Javaを勉強することになったので
どうせならと思い、このように記事を残そうと思った次第でございます。

不慣れな記事となりますが、よろしくお願いします。
【PHP基礎②】割り算の余りを求める

［問題］　　(参照：http://www.cc.kyoto-su.ac.jp/~mmina/bp1/hundredKnocksBasic.html)
15000を7で割った余りを表示するプログラムを作成しなさい。

# コード
```php
echo 15000 % 7;
```

# 結果
```
6
```

☆ a % b ＝aをbで割った余り
【PHP基礎①】数値の入力と文字列の入力の違い

［問題］　　(参照：http://www.cc.kyoto-su.ac.jp/~mmina/bp1/hundredKnocksBasic.html)
1789+1758を計算して結果を表示するプログラムを作成しなさい。

# コード
```PHP
１． 数値として数字を入力する場合
echo 1789+1758;

２．文字列として数字を入力する場合
echo '1789+1758';

```
# 結果
```
１．　3547
２．　1789+1758
```

☆数値として表示させたい、計算させたい時は、'　'を付けない。
AWS認定SysOpsアドミニストレータ(SOA-C02)合格日記

# はじめに
[AWS認定デベロッパアソシエイト合格日記](https://qiita.com/kazutxt/items/4551063b76853fa940b7)に合格したら、欲が出てSysOpsアドミニストレータ(SOA-C02)も欲しくなったので挑戦してみました。

# AWS認定試験の全体像
* [AWS認定試験の概要](https://qiita.com/kazutxt/items/dce1c5df12d5ab27020a)

# SysOpsアドミニストレータ(SOA-C02)の試験概要
* 問題数は55問 + ラボ2問
* 試験時間は180分
* 合格スコアは100-1000のスコアで720以上(≒正解率72%前後)
* 試験料は15,000円
* 試験範囲
    * 分野 1: 監視、ロギング、および解決 20%
    * 分野 2: 信頼性および事業継続性 16%
    * 分野 3: 展開、プロビジョニング、および自動化 18%
    * 分野 4: セキュリティおよびコンプライアンス 16%
    * 分野 5: ネットワーキングおよびコンテンツ配信 18%
    * 分野 6: コストおよびパフォーマンスの最適化 12%


# 受験前のステータス
現時点でのスキル・知識を整理

* SAAを3週間前に合格したばかり&SDAを1.5週間前に合格したばかり
* ICT及びプログラミングのある程度ある
    * SIerで10年ぐらいの実務経験
    * 情報処理技術者試験で高度試験(ITアーキテクト/NWスペシャリスト/安全確保支援士など)をいくつか保有
    * 複数のプログラミング言語(Node/Java/Python/C/Dartなど)を扱える
    * 業務以外にもプライベートでアプリをリリースしたり、サーバ立てたり、ラズパイで遊んだりする
* AWSは約1年
    * CloudFront,WAF,ALB,ECS,Code4兄弟,Dynamo,S3,Lambda,APIGWなどを使って簡単なWebサイトを構築
    * 3案件ほど経験


# 勉強方法と時間(1.5週間/35Hぐらい)

1. 試験について調べる (2H)
2. AWSWeb問題集で勉強(30H)
    * https://aws.koiwaclub.com/
3. 勉強ノートで復習(3H)
    * 作った勉強ノートを読み返して不明点や整合性のつかない部分の確認
    * 暗記


# 受験した所感
* 若干数分からないもおがあり、ラボはニュアンスに困る物が多かった
* ラボはS3とVPCに関連するものが出題されたが、○○を設定してではなく、アクセス頻度は△△になりますなどの表現
* AMIとCloudFoarmationの組み合わせ/注意点が3回ぐらい出ていた
Cognito/Dynamoストリームが多かった
* 過去問とほぼ同じ問題が数問あり、かつ類題も数問ありました
* 試験結果はすぐにはでません。金曜日に受験したのですが結果が来たのは月曜日でした。

# 結果
* 合格
    * 点数は786
    * ラボは改善が必要
        * 結構自信があったし、指示の内容はすべてカバーしていると思うのですが、曖昧な表現も多かったし、うーん。 

# 振り返ってみて
* SAAでUdamyがいらないといったのがまさに正解で、過去問繰り返しが最短最強でした

# 次の目標
* しばらくしたらSAPを受けようかな


# 備考(SAAとDVAのよく出るマネージドサービスの違い)
## SAAで特に出るもの
* 移行
* DirectConnect
* IAM/Organization
* コスト
* FSx
* Strage

## DVAで特に出るもの
* Codeシリーズ
* APIGW
* Cognito
* Amplify
* CloudFormation
* ElasticBeanstalk
* StepFunctions

## SOAで特に出るもの
* CloudWatch
* Organization(SCP)
* ServiceCatalog
* HelthDashBoard
* コストエクスプローラー
* CloudTrail/CloudConfig
* SystemsManager
* 各種マネージドサービスの監視


## 共通
* Lambda
* S3 /Glacier
* RDS
* Dynamo
* ElastiCache
* SQS/SNS
* CloudWatch
* VPC
【Android Studio】ListViewでリストを表示する方法【Kotlin】

- まずはListViewを追加します
```
<ListView
        android:id="@+id/countryList"
        android:layout_width="200dp"
        android:layout_height="500dp"
        app:layout_constraintTop_toBottomOf="@+id/editTextTextPersonName"
        app:layout_constraintLeft_toLeftOf="@+id/editTextTextPersonName"/>
```


- 次にonCreateに下記を追加します
```
        // Listに表示する配列を用意する
        val countries = listOf("Brazil", "Indonesia", "Colombia");

        // Listに配置する
        var countryList = findViewById<ListView>(R.id.countryList)
        countryList.adapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, countries)
```

- Emulaterで見てみると、配列内のデータが表示されていることが確認できます
<img width="400" alt="1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349192/c45c1405-b310-5366-20c2-263a3b4c8a67.png">
【Laravel】enumで管理する場合引数に渡すIDをオブジェクトで渡そう【リファクタリング】

## 環境
Laravel v9.5.1 (PHP v8.1.3)

## 前提

- User -> Bookは1対多
- Bookのプロパティ：```user_id``` ```title``` ```content``` ```genre```
- ```genre```はenumで定義されている


```app/Enums/Genre.php
namespace App\Enums;

enum Genre: int
{
  case Fantasy = 1;
  case DetectiveAndMystery = 2;
  case Horror = 3;
  case Romance = 4;
}
```

## Bad
```genreId```をenumで定義している場合、```createPost```メソッドの```genreId```の型宣言を```int```にしてしまうと、enumに存在しない値が入る可能性がある。
例えばenumには定義されていない```5```が入ってしまうとか。
DB上は問題ない値なのでもし```5```が入っても保存されてしまうが、一度DBに保存されてしまうとまず気づかないし変更するとしてもかなり大変なことになる。
バグの温床になりかねない。

```BookController.php
class BookController extends Controller
{
  ...
  public function store(Request $request): JsonResponse
  {
    $post = $request->user()->createBook(
       $request->title, $request->content, $request->genre_id
    );

    return response()->json(Response::HTTP_OK);
  }
}
```

```User.php
class User extends Model
{
  ...
  public static function createBook(string $title, string $content, int $genreId): void
  {
     Book::create([
        'user_id' => $this->id,
        'title' => $title,
        'content' => $content,
        'genre_id' => $genreId,
     ]);
  }
}
```

## Better
```createPost```メソッドの```genreId```の型宣言を```Genre```オブジェクトで定義すると、間違って```1~4```以外の数字が入ることはない。
**DBに間違った値が入る前にアプリケーション側で防ぐことが大切！**

```User.php
use App\Enums\Genre;

class User extends Model
{
  ...
  public static function createBook(string $title, string $content, Genre $genreId): void
  {
     Book::create([
        'user_id' => $this->id,
        'title' => $title,
        'content' => $content,
        'genre_id' => $genreId,
     ]);
  }
}
```
Next.jsでp5.jsのスケッチを表示する

# 概要
Next.jsのプロジェクトにp5.jsのスケッチを掲載して動かす！

# 手順

Next.jsとTypeScriptを以下のように導入する。

```:ターミナル
$ yarn create next-app

$ cd [app名]

$ yarn add -D typescript @types/react @types/node

$ touch tsconfig.json

# ここで_app.jsとindex.jsの拡張子を.tsxに書き換える

$ yarn dev
```

react-p5-wrapperも導入する。
[react\-p5\-wrapper \- npm](https://www.npmjs.com/package/react-p5-wrapper)

```:ターミナル
yarn add react-p5-wrapper
```

`index.tsx`を下記のように書き換える。

```tsx:index.tsx
import SketchComponent from "../components/SketchComponent";

export default function Home() {
  return (
    <div id="sketch-div">
      <h1>My Sketch</h1>
      <SketchComponent />
      <p>This is my sketch!</p>
    </div>
  )
}
```

`components`ディレクトリの中に`SketchComponent.tsx`ファイルを作成する。

```tsx:SketchComponent.tsx
import dynamic from "next/dynamic";
import React from "react";
import { P5WrapperProps } from "react-p5-wrapper";
import sketch from "./modules/sketch";

const ReactP5Wrapper = dynamic(
  () => import("react-p5-wrapper").then((mod) => mod.ReactP5Wrapper as any),
  {
    ssr: false,
  }
) as unknown as React.NamedExoticComponent<P5WrapperProps>;

export default function SketchComponent() {
  return (
    <>
      <ReactP5Wrapper sketch={sketch} />
    </>
  );
}
```

さらに`components`の下に`modules`ディレクトリを作り`sketch.ts`ファイルを下記のように作る。
この中にp5.jsのスケッチのコードをinstance modeで記述する。
[Instantiation - examples \| p5\.js](https://p5js.org/examples/instance-mode-instantiation.html)

```tsx:sketch.ts
import { P5Instance } from "react-p5-wrapper";

const sketch = (p5: P5Instance) => {
  p5.setup = () => {
    p5.createCanvas(400, 400);
    p5.background(200);
  };

  p5.draw = () => {
    p5.circle(p5.mouseX, p5.mouseY, 20);
  };
};

export default sketch;
```

マウスインタラクション付きのスケッチが表示できました🎉

![Next.jsでp5.jsのスケッチを表示する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67311/920bfbcd-f833-90ff-d9ad-4bd17dbbeaa8.png)

# 参考文献
* [【React & p5\.js】「三角関数しらべMath」を作った（三角関数の理解を深めるアプリ） \- クモのようにコツコツと](https://www.i-ryo.com/entry/2021/12/31/160217)
HoloLens2を使って自分の顔と芸能人がどれくらい似ているか画像判断処理をやってみた（HoloLens2 × Dynamics 365 Guides × Power Apps × Azure Custom Vison ）

## はじめに
昨日作った　自分の顔と芸能人がどれくらい似ているか画像判断処理をやってみた（Power Apps × Azure Custom Vison ）
のアプリをHoloLens2 のデバイスから見るようにした。

* [自分の顔と芸能人がどれくらい似ているか画像判断処理をやってみた（Power Apps × Azure Custom Vison ）)](https://qiita.com/hide6974/items/40d6b3d2998a1a21876c)2022/6/11

## 完成イメージ
HoloLens2 を頭にかぶり、HoloLens上でカメラ撮影し、操作を行うとAIが誰に似ているか判定してくれる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/4a06b1f7-31b0-ef5a-2320-cc0bb177ca18.png)


## 手順
### 1.パソコンで、Guidesアプリ起動し以前作ったアプリを埋め込む
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/cc1983a6-885e-7d77-d587-b84ecae06d20.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/9665870b-a238-0f1c-3453-eba7e2d55626.png)

Power Appsを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/d3639032-9928-93d9-41f4-74d731fe08f4.png)

以前作成したアプリのURLをコピーする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/926cc0e3-ca54-ade4-fe4d-4145ba23ebfb.png)

または

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/696d3026-9f3b-3fcc-43ff-2e8535cf9149.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/aea2c087-b88c-260f-8972-10e04d05e399.png)

Guidesテキスト入力する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/174e4735-5e77-0729-6266-43f8f382049a.png)

### 2.Dynamics 365 Guideを起動
頭にかぶったHoloLens2のGuidesアプリを起動する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/79dc95e2-892c-3db7-807c-faceb3dfaed3.png)

事前に作成したQRコードを読み込み、作成した手順を呼び出す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/5601fa18-4998-21a7-5a84-b4b136fa484b.png)

Power Appsで作成した芸能人画像認識処理のアプリを起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/911d452c-792a-1983-ccd2-fe8a4dc709fe.png)

Power Appsアプリがブラウザで起動する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/6ed8a0c2-a187-a7d2-7103-b0ae916d0e44.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/4312ae4a-9eb2-cbd3-43d5-f7d22d07b4ee.png)

写真撮って、ボタンを押してAIによる似ている判断をする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/4a06b1f7-31b0-ef5a-2320-cc0bb177ca18.png)

完成！以上
Tensorflowで"DeprecationWarning: NEAREST is deprecated and will be removed in Pillow 10 (2023-07-01)."が表示された時の回避策


フレームワークを作っているのですが、ちょっと前から以下の警告文が出るようになりました。

``` bash
\lib\site-packages\flatbuffers\compat.py:19: DeprecationWarning: the imp module is deprecated in favour of importlib; see the module's documentation for alternative uses
  import imp
\lib\site-packages\keras\utils\image_utils.py:36: DeprecationWarning: NEAREST is deprecated and will be removed in Pillow 10 (2023-07-01). Use Resampling.NEAREST or Dither.NONE instead.
  'nearest': pil_image.NEAREST,
\lib\site-packages\keras\utils\image_utils.py:37: DeprecationWarning: BILINEAR is deprecated and will be removed in Pillow 10 (2023-07-01). Use Resampling.BILI  'bilinear': pil_image.BILINEAR,
\lib\site-packages\keras\utils\image_utils.py:38: DeprecationWarning: BICUBIC is deprecated and will be removed in Pillow 10 (2023-07-01). Use Resampling.BICUBIC instead.
  'bicubic': pil_image.BICUBIC,
\lib\site-packages\keras\utils\image_utils.py:39: DeprecationWarning: HAMMING is deprecated and will be removed in Pillow 10 (2023-07-01). Use Resampling.HAMMING instead.
  'hamming': pil_image.HAMMING,
\lib\site-packages\keras\utils\image_utils.py:40: DeprecationWarning: BOX is deprecated and will be removed in Pillow 10 (2023-07-01). Use Resampling.BOX instead.
  'box': pil_image.BOX,
\lib\site-packages\keras\utils\image_utils.py:41: DeprecationWarning: LANCZOS is deprecated and will be removed in Pillow 10 (2023-07-01). Use Resampling.LANCZOS instead.
  'lanczos': pil_image.LANCZOS,
```

今回回避策が分かったので備忘録として記事にしたいと思います。

# 再現コード

* version

```
Python 3.9.13
gym                          0.24.1
tensorflow-gpu               2.9.1
Pillow                       9.1.1
flatbuffers                  1.12
```

* コード

``` python
import gym
import tensorflow
# 警告が表示される
```

なお、これは警告を非表示にしても表示されます。

``` python
import warnings

warnings.simplefilter("ignore")

import gym
import tensorflow
# 警告が表示される
```


# 回避策

根本原因は分かりません。
ただ、gymをimportした後にtensorflowをimportをすると表示されるようです。
順番を逆にすると表示されません。

``` python
import tensorflow
import gym
# 警告は表示されなくなる
```

isortを使っているとgymが上にくるのでちょっと厄介です…。
警告内容的にそのうち解決しそうな気もします。
Office365でGoogle WorkspaceをIdPにしたとき、Google側でメールアドレス変更した場合やること

Googleでメールアドレスを変更した場合、オートプロビジョニングでOffice365上のログインアドレス(UserPrincipalName)自体は変更されるが、そのアドレスでGoogleのログインを使ってOffice365にログインしようとすると、 `Message: AADSTS51004: The user account hogehoge does not exist` と言われログインできない。

いろいろ掘ってみると、その理由はImmutableIdが元のままになっているからっぽい。ImmutableIdは外部IdPとの連携に使う物で、IdPのアカウント名が入っている。Auto ProvisioningでUserPrincipalNameは変更されているが、ImmutableIdは変更されないようだ。

PowershellでImmutableIdの変更をしようとすると、外部プロバイダーが設定するアカウントはSourceAnchorの設定がないやらで変更が出来ない。

Immutableidを後で変更するには以下のようなHackが必要。

## Powershellで接続

### 事前準備
Powershellを管理権限で起動し、MSOnlineが入っていなければインストール。
```
 Install-Module -Name MSOnline
```

パーミッション云々で文句を言われたら以下を実行して権限を付ける。安全のため、このセッションでだけ権限を付与する。

```
Set-ExecutionPolicy RemoteSigned -Scope Process -Force
```

モジュールのImport

```
 Import-Module MSOnline
```
### 当該アドレスのImmutableidを確認
変更前のアドレスを `before@hoge.com`、変更後を `after@hoge.com` とするとき、以下のコマンドを実行し、 `after@hoge.com` ではなく `before@hoge.com` のままになっているとビンゴ。
```
Get-MsolUser -UserPrincipalName "after@hoge.com" | fl ImmutableId
```

この状態で、ImmutableIdを　`Set-MsolUser` で変更しようとしても、 ` You must provide a required property: Parameter name: FederatedUser.SourceAnchor` と言われて変更できない。そこで以下のような微妙なハックをする

### UserPrincipalNameを書き換えてからImmutableIdを変更する。

基本GoogleをIdPにしている場合は、独自ドメインを設定していると思われる。独自ドメインでUserPrincipalNameが設定されていると、ImmubtaleIdの書き換えが出来ないようなので、一度これをOffice 365のデフォルトアドレス(@hoge.onmicrosoft.com)に変更する。

```
Set-MsolUserPrincipalName -UserPrincipalName "after@hoge.com" -NewUserPrincipalName "after@hoge.onmicrosoft.com"
Set-MsolUser -UserPrincipalName "after@hoge.onmicrosoft.com" -ImmutableId "after@hoge.com"
```
これでImmutableIdが書き換えられたので、UserPrincipalNameをもとに戻す。

```
Set-MsolUserPrincipalName -UserPrincipalName "after@hoge.onmicrosoft.com" -NewUserPrincipalName "after@hoge.com"
```

これで、Googleアカウントである `after@hoge.com` でOffice365にログインできるようになる。
Minecraftゲームを入口にプログラミングに興味を持つよう促す

# はじめに
3歳の娘に対してMinecraftを触ってもらう。
本当は小学校上がるぐらいに、面白いゲームあるよと


# 結果
アンパンマンみせてということでまだ娘には早いようだった

# 環境設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/d6d1bc34-3143-c1b8-ccd5-7d89501c9dd6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/f1b18447-75c0-9e2e-030e-6296f05c8881.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/08b10dd0-5470-32eb-8d5e-eb52c5c97aaa.png)

テンプレートがたくさんありますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/cc35ef8b-1ccc-38e6-f8cd-fc4618fca150.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/989a419e-fa9e-9e15-c315-822b04a1ec89.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/77d03fb9-7ab5-399f-7785-6980c63932f6.png)

おっと対象年齢が8歳からとなっている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/6fa927f9-7650-163f-f2a1-54bedd376d10.png)

最初の画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/9cdc2075-0bf4-1e7f-1fdf-ad52f51951fa.png)

あとは自由に遊べます

これから見たい参考動画

https://www.youtube.com/watch?v=78jR4Uc_oAU

https://www.youtube.com/watch?v=tuP0vPpODfM
【自分用メモ】Google Spreadsheetのマクロをボタンから呼び出そうとしたらボタンの編集になってしまう

# 前提
* Google Spreadsheetのマクロ（GAS）を、シート上に置いたボタンをクリックして起動することができる
* シート上のボタンは、右クリックすると四隅にドットが、右の方にハンバーガーメニュー（︙）が表示され、大きさ、ボタンテキスト、アサインされたマクロを編集することが出来る
* ボタンを左クリックすると、当然アサインされたマクロが起動する

# 現象
* ボタンを左クリックしても、なぜか右クリックしたときのように編集可能状態になり、マクロが起動されない。

# 原因と対処
* アサインされるべきマクロが、何らかの事情で空欄になっていた。
* 正しく指定すると、動作した。

コピペコピペを繰り返しているうちに、どの過程かで失敗したらしい。
それらしいエラーメッセージが出ず、エラーの規模にしては戸惑ってしまったので、こんなゴミ記事だが晒す。

**（この項終わり）**
TECH CAMP 8日目　~ストロングパラメーターって何...~

# 学習内容
- Ruby on Rails
　- __`form_with`のおさらい__・・・`method: @インスタンス関数`とすると、newメソッドで送る場合はcreateアクションへ、findメソッドで送る場合はupdateアクションへ自動的に振り分けてくれる。
　- __ストロングパラメーター__・・・意図しないデータベースの読み書きを防ぐため。`require`と`permit`を使う。送信されたパラメーターにどの情報を取得するかを選択する。例）`params.require(:モデル名).permit(:キー名)`
　- __プライベートメソッド__・・・クラス外から呼び出せない。メリット１：必要のない変更操作などを防ぐ安全性が担保できる。メリット２：アクション探す時private見ないので時短
　- __`validates`メソッド__・・・データを登録する際に、一定の制約をかける。例）`validates :カラム名, バリデーション`
　- __`Prefix`__・・・ルーティングのURLに名前をつけた変数。`rails routes`で確認できる
　
# 苦労したこと
ストロングパラメーターを入れる時、
`params.require(:Tweet).permit(:name, :text)`
このようにシンボルに続くモデル名をキャメルケースで記入した。
モデルをシンボルの形で書く際は小文字で書きましょう。

# 今週の目標
__日曜日までに応用カリキュラムを終わらせる__
devise登場してから結構理解するのが難しくなってきたので、わからなかったら深く悩まずメンターに相談します。
RDSインスタンスのタイプを変更方法まとめ

[株式会社じげん](https://qiita.com/organizations/zigexn)の李です、
AWS RDS for MySQLのインスタンスタイプM3、R3については、2023年4月30日までがサポート期限となってます。
そのため、本番環境でRDSインスタンスタイプは`db.m5`へアップグレードしました、その手順とログを紹介していきます。

## 概要
- 前期調査
  - 料金変更について
  - 作業時間について
- 実行ログ
  - RDSのスケールアップする
  - フェイルオーバーで再起動する
- 参考資料

### 前期調査その１---料金
今回、DBインスタンスを`db.m3.large`から`db.m5.large`へ変更しました、比較表は下記です。
**m５へ変更後料金増えてないのは楽です。**
- [Amazon RDS の料金](https://aws.amazon.com/jp/rds/pricing/)により抜粋
- `アジアパシフィック (東京)リージョン`、`Multi-AZ`利用時の730時間分のオンデマンド料金
- [AWS 料金見積りツール](https://calculator.aws/#/)を使う

 https://calculator.aws/#/


インスタンスクラス|vCPU|ECU|Memory(GiB)|最大帯域幅(Mbps)|ネットワークパフォーマンス|月額料金(USD)
--|--|--|--|--|--|--
db.m5.large|2|10|8|Up to 2,120|Up to 10 Gigabit|343.10
db.m3.large|2|6.5|7.5|—	|Moderate|350.40 

### 前期調査その２---実行時間計測する
ダウンタイムに基づいてメンテナンスモードと時間を考えられなければなりません、シャットダウンを最小限にするため、本番環境は必ず`Multi-AZ`にすると考えられるので、`Multi-AZ`のみを調査しました。

- 結論：テスト環境で実施結果と別の記事参考のによると、「5分弱のシャットダウンでRDSスケールアップできる」と言っても問題なさそう。

- 参考:

https://cloudpack.media/1701

https://qiita.com/zaru/items/d236c8d3a3be6c49fd34

### 実行ログその１-- RDSのスケールアップ
- RDSをMulti−AZ有効に確認する:データベース→設定→マルチAZ:あり
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658393/7d1aa8dd-5eef-b4c6-18c9-a75b8d2af48d.png)
- DBインスタンスのクラス変更する:`db.m3.large`から`db.m5.large`へ変更→`すぐに適用`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658393/25c242d9-5e9c-5794-7170-f23d27ba3b79.png)
- ダウンタイムを見守り: データベース→ログとイベント→最近のイベントでダウンタイムを見守ります
`DB instance shutdown`から`Multi-AZ instance failover completed`まで、1分04秒、早いでしょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658393/fd462216-8d70-951b-89ab-ef675a47f0af.png)
ステータス偏移は下記のようなのでした。
```変更中→Configuring-enhanced-monitoring→バックアップ中→変更中→利用可能```
### 実行ログその2-- フェイルオーバーで再起動する
パフォーマンス向上のため、再起動する必要があリます。

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_RebootInstance.html

- 「フェイルオーバーし再起動しますか？」にチェックをつけ再起動する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658393/af704801-dcdf-3d9e-b393-d20d701c1736.png)
- ダウンタイムを見守り:`	Multi-AZ instance failover started`から`completed`まで45秒で完了しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658393/179ad632-eea4-1a76-92e1-6a56d3e5f606.png)

- 最後：最deployとサービスの動作確認する、 done！:tada:


### 参考資料
- [Amazon RDS DB インスタンスを変更する](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/Overview.DBInstance.Modifying.html)

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/Overview.DBInstance.Modifying.html