OmniAICreator/Qiita-1.07M huggingface dataset:
Bicep実行時にEnvironment URLs should not be hardcoded. Use the environment() の警告に対応したメモ

# 概要
下記のエラーが発生。
```
Warning no-hardcoded-env-urls: Environment URLs should not be hardcoded. Use the environment() function to ensure compatibility across clouds. Found this disallowed host: "core.windows.net" [https://aka.ms/bicep/linter/no-hardcoded-env-urls]
```

[ソースコード](https://github.com/hibohiboo/Yakumi/blob/2401fd7bc1de87811a4baca4964ae3bc30531b9a/infrastructure/biceps/batch.bicep)

# 対応
コメント[*](https://aka.ms/bicep/linter/no-hardcoded-env-urls)にあるように、`environment()`から取得できるsuffixを使用すれば警告は解消される。

```diff
  {
    name: 'TARGET_STORAGE_ACCOUNT__blobServiceUri'
-    value: 'https://${uploadStroageAccountName}.blob.core.windows.net'
+    value: 'https://${uploadStroageAccountName}.blob.${environment().suffixes.storage}'
  }
  {
    name: 'DATABASE_CONNECTION_STRING'
-    value: 'Server=tcp:${sqlServerName}.database.windows.net;Authentication=Active Directory Default; Database=${sqlServerDbName};'
+    value: 'Server=tcp:${sqlServerName}${environment().suffixes.sqlServerHostname};Authentication=Active Directory Default; Database=${sqlServerDbName};'
  }
```

## 注意点

suffixによって、頭の`.`の有無が異なる。なんで。
suffixes

key|value|.の有無
--|--|--
acrLoginServer|.azurecr.io|あり
azureDatalakeAnalyticsCatalogAndJob|azuredatalakeanalytics.net|無
azureDatalakeStoreFileSystem|azuredatalakestore.net|無
azureFrontDoorEndpointSuffix|azurefd.net|無
keyvaultDns|.vault.azure.net|あり
sqlServerHostname|.database.windows.net|あり
storage|core.windows.net|無


https://learn.microsoft.com/ja-jp/azure/azure-resource-manager/bicep/bicep-functions-deployment#example-2
Enumeratorクラス. do |_|とは

# _にはあまり深い意味はなさそうだ
```rb
      def convert_value_to_parameters(value)
        if value.is_a?(Array) && !converted_arrays.member?(value)
          converted = value.map { |_| convert_value_to_parameters(_) }
          converted_arrays << converted
          converted
        elsif value.is_a?(Parameters) || !value.is_a?(Hash)
          value
        else
          self.class.new(value)
        end
      end
```
https://github.com/rails/rails/blob/9ab2d030209d9608a6c866d83210f5b3b7d2319e/actionpack/lib/action_controller/metal/strong_parameters.rb#L461C7-L471C10

>This particular block should receive one parameter and we don’t care about it’s value.

>Sooner or later you might encounter |*| syntax—that is the same, but for the block, expecting any vary amount of parameters. 

>It's basically just throwing away the value. A normal do block would have something like |my_var|

https://stackoverflow.com/questions/40746174/what-does-mean-in-ruby

### 感想
なぜこういう書き方のなのかは知らない

### $_と勘違いした
https://qiita.com/masatom86650860/items/08e72fc9061b789592ec
ADFI初心者向けの手順解説（アカウント新規作成～プロジェクト作成）

# はじめに
本記事では、[ADFI（アドファイ）](https://adfi.jp/ja/ai/)を初めて利用する方向けに「アカウント新規作成」から「プロジェクト作成」までの手順を解説します。

[ADFI](https://adfi.jp/ja/ai/)とは、株式会社カラクライが提供しているノーコードAI開発プラットフォームで、画面上の操作だけで簡単にAIモデルを開発できます。
AIモデルの作成や性能評価などの基本機能は、全て無料で利用できます。

# 1. アカウント新規作成
ADFIを利用するにはサインインするためのユーザーアカウントが必要です。無料ですぐに作成できます。

## 手順
 - ADFIのサインインページ（ [https://web.us.adfi.karakurai.com/webapp/signin?lang=ja](https://web.us.adfi.karakurai.com/webapp/signin?lang=ja) ）にアクセスします。
 - 「アカウント新規作成」を押してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3117462/8b6fd5f9-5b75-c943-6160-daed3c511c70.png)


 - 登録するアカウント情報（ユーザー名、メールアドレス、パスワード、パスワードの確認）を入力してください。
 - 左下のチェックボックスにチェックを入れた後、「アカウント新規登録」ボタンを押してください。入力したメールアドレス宛に確認メールが送信されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3117462/7b745ff6-b72f-3f4b-32e3-70b76cd6ab06.png)

 - ADFIから「【ADFIアカウント登録】メールアドレスの確認」というタイトルの確認メールが届きます。メール本文のURLをクリックしてください。
   - URLをクリックすることで、先ほど入力したメールアドレスとパスワードでサインインが可能になります。
   - メールが届かない場合は、迷惑メールボックスに振り分けられているか、入力したメールアドレスが誤っていた可能性がありますので、ご確認ください。
 - 「サインイン」を押してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3117462/e31a68fc-58fa-d1da-3b39-55a3b7798637.png)

 - 先ほど登録したアカウントの情報（メールアドレス、パスワード）を入力してください。
 - 「サインイン」ボタンを押すと、ADFIにサインインできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3117462/5e009a34-e9f0-8a8b-24ef-ee15dcf8472e.png)

# 2. プロジェクト作成
AIモデルを作成するには、まずプロジェクトを作成する必要があります。作成したいAIの種類（画像認識、または、異常検知）のプロジェクトを作成します。
ここでは「画像認識」のケースを例にしています。

## 手順
 - 左メニューの「プロジェクト」を押してください。
 - 左側の「ADFI画像認識」の「プロジェクト新規作成」ボタンを押してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3117462/4ec641c3-b202-637f-d764-72af7831746b.png)

 - 作成したいプロジェクト名を入力して「保存」を押してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3117462/06dd6567-5345-9597-7a1d-0d894ec680f6.png)

 - 新しくプロジェクトが作成されました。作成したプロジェクト名を押してください。プロジェクト詳細画面が表示されます。なお、プロジェクト詳細画面では、プロジェクトのメンバーを追加したり、AIモデルを作成することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3117462/e56278d6-536b-5d2e-07ee-a043b0c9971e.png)

# AI作成手順についての記事
 - [ADFIで路面検査AIを作成する](https://qiita.com/karakurai_rena/items/5e92743814e05d84c8ad)
 - [ADFIで混雑検知AIを作成する](https://qiita.com/karakurai_rena/items/b931bba9a5a347a460c1)
- [ADFIで異物混入検査AIを作成する](https://qiita.com/karakurai_rena/items/45e14891148caff83192)
$_

# `Kernel.#gets` または `Kernel.#readline` で読み込んだ文字列を格納する
```rb
irb(main):042* ARGF.each do |line|
irb(main):043*   print line
irb(main):044> end
fa
fa
fa
fa
```
* 入力するしてenterを押すと入力と同じものが下段に表示された

>$_ -> String | nil
最後に `Kernel.#gets` または `Kernel.#readline` で読み込んだ文字列です。 `EOFに達した場合には、nil`になります。 (覚え方: Perlと同じ)

>Kernel.#print のような Perl 由来の幾つかのメソッドは、引数を省略すると代わりに $_ を利用します。

>この変数は`ローカルスコープ`かつ`スレッドローカル`です。 Ruby起動時の初期値は nil です。

https://docs.ruby-lang.org/ja/latest/method/Kernel/v/_.html

# ローカルスコープ、スレッドローカルとは?
https://qiita.com/masatom86650860/items/e5e003be60443f5fa7f1
スコープの種類

>グローバル変数
>`'$'で始まる変数はグローバル変数`で、プログラムの`どこからでも参照`できます(その分、利用には注意が必要です)。グローバル変数には宣言は必要ありません。`初期化されていないグローバル変数を参照した時の値はnil`です。

https://docs.ruby-lang.org/ja/latest/doc/spec=2fvariables.html#:~:text=%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%0Aend-,%E3%82%B0%E3%83%AD%E3%83%BC%E3%83%90%E3%83%AB%E5%A4%89%E6%95%B0,%E3%82%B0%E3%83%AD%E3%83%BC%E3%83%90%E3%83%AB%E5%A4%89%E6%95%B0%E3%82%92%E5%8F%82%E7%85%A7%E3%81%97%E3%81%9F%E6%99%82%E3%81%AE%E5%80%A4%E3%81%AFnil%E3%81%A7%E3%81%99%E3%80%82,-%E7%B5%84%E3%81%BF%E8%BE%BC%E3%81%BF%E5%A4%89%E6%95%B0

# グローバル、ローカルは理解できるがスレッドローカルは今は理解できなかった

>スコープ
組み込み変数は文法解析上はグローバル変数として扱われます。しかし、実際のスコープは必ずしもグローバルとは限りません。

>組み込み変数には次の種類のスコープがありえます。

>### グローバルスコープ
>通常のグローバル変数と同じ大域的なスコープを持ちます。

>### ローカルスコープ
>通常の`ローカル変数と同じスコープ`を持ちます。つまり、 class 式本体やメソッド本体で行われた代入はその外側には影響しません。プログラム内のすべての場所において代入を行わずともアクセスできることを除いて、通常のローカル変数と同じです。

>### スレッドローカルスコープ
>スレッドごとの値を持ちます。他のスレッドで異なる値が割り当てられても影響しません。

https://docs.ruby-lang.org/ja/latest/doc/spec=2fvariables.html#:~:text=%E3%81%B0%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82-,%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97,%E7%95%B0%E3%81%AA%E3%82%8B%E5%80%A4%E3%81%8C%E5%89%B2%E3%82%8A%E5%BD%93%E3%81%A6%E3%82%89%E3%82%8C%E3%81%A6%E3%82%82%E5%BD%B1%E9%9F%BF%E3%81%97%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82,-%E3%81%BE%E3%81%9F%E3%80%81%E4%B8%80%E9%83%A8%E3%81%AE

### スレッドとは？　スレッドをrubyでも扱える
https://qiita.com/masatom86650860/items/3233fd2ca6f72ef06967
LINEでお正月に挨拶文章を一斉に送ってみた

## はじめに
いつもQiita見る専なので、たまには記事を書こうと思ってこの記事をかきました。
お正月の季節なのでせっかくなら、LINEでの挨拶を自動化してみました。
記事の投稿があまり慣れていないので、ご容赦ください。

## どんなものをつくったの？
A. LINEで一斉送信できるプログラム

## 使用技術
- AppleScript
- ChatGPT　←ほぼ彼ににつくってもらった

## コード
```applescript
#!/usr/bin/osascript

-- 送信するメッセージ
set message1 to "あけましておめでとうございます。hogehogehogeでhogehogehogeですね"

-- 送信先のユーザー名（LINEのグループや個別のチャットに合わせて適切に修正）
set contacts to {"aaa", "bbb", "ccc"} -- 例: "User1"の部分をLINEの相手に合わせて変更

tell application "LINE"
	activate
	delay 0.5
end tell

tell application "System Events"
	repeat with contact in contacts
		-- クリップボードに名前をコピー
		set the clipboard to contact
		
		-- LINEウィンドウをアクティブにして検索バーを表示
		tell application "System Events"
			keystroke "f" using command down -- Cmd + f で検索バーを開く
			delay 0.5
			keystroke "v" using command down -- ここで相手の名前を入力（貼り付け）
			delay 0.5
			keystroke return -- 相手の名前が表示されるので選択
			delay 0.5
		end tell
		
		-- 下矢印キーを2回押して検索結果を選択
		tell application "System Events"
			keystroke (key code 125) -- 下矢印キー（key code 125）
			delay 1
			keystroke (key code 125) -- 下矢印キーをもう一度
			delay 1
		end tell
		
		-- Tabキーを押して次の入力フィールド（または選択肢）に移動
		tell application "System Events"
			keystroke (key code 48) -- Tabキー（key code 48）
			delay 1
		end tell
		
		-- メッセージ1を入力して送信
		set the clipboard to message1
		tell application "System Events"
			keystroke "v" using command down -- メッセージ1を貼り付け
			delay 0.5 -- メッセージが入力されたことを待つ
			keystroke return -- メッセージ送信
			delay 0.5 -- 送信後の遅延
		end tell
		
		-- Escapeキーを押してキャンセル（もし必要な場合）
		tell application "System Events"
			keystroke (key code 53) -- Escapeキー（key code 53）
			delay 0.5
		end tell
	end repeat
end tell
```

## 苦労したところ
文字入力する`keystroke`が日本語では直接入力できないという問題がありました。

例えば以下のコード
```applescript
keystroke "こんにちは"
```
本来なら`こんにちは`という結果が欲しいのですが、`あああああ`と出力してしまいました。
## 解決策
まず変数に文字入力したい値を記入します
```applescript
set message1 to "あけましておめでとうございます。hogehogehogeでhogehogehogeですね"
```
次にメッセージをクリップボードにコピーします
```applescript
set the clipboard to message1
```
そして最後にペースをしてあげることにより、日本語が入力が可能になります
```applescript
keystroke "v" using command down
```

まじでなんでだよ!!

## 反省点
1. 今回LINEの友達104名に送るにあたり、一人ずつLINEのアカウント名を確認し、変数に記入してたので次回やる際には、自動でアカウント名を取得したい。
2. 動作時間が長い
ほぼゴリ押しで送信しているので、検索の時間の猶予なども与えるにあたり、`delay`を入れているので、そこの時間を調整したら短くなると思います。
ちなみに今回の実行時間は役12分ぐらいかかったので、もっと短くする方法をコメントで教えてください

## 最後に
いかがだったでしょうか、ぜひ来年のLINEでのお正月挨拶文章は、AppleScriptを使って自動化してみてはどうでしょうか。

## 参考
[妻の誕生日にLINEでサプライズメッセージを送る](https://qiita.com/tearoom6/items/52f68d404571ed21b94a "Qiita")
[【AppleScript】keystroke で日本語が打てない時の対処法](https://www.dev-dev.net/entry/2021/03/24/164931)
Prettier または ESLint の自動修正を使用する

## 1.VSCode での設定確認

　VSCode の設定で、ファイル保存時に Prettier で自動フォーマットする設定を確認します。設定が有効であれば、ファイル保存時に自動で修正されるはずです。
　設定は、`settings.json` に次のように記述します。
 
```json
{
  "editor.formatOnSave": true,
  "editor.defaultFormatter": "esbenp.prettier-vscode"
}
```

## 2.手動で Prettier を実行:

　コマンドパレット（Ctrl+Shift+P）で「Format Document」を選択し、Prettier を使ってファイルをフォーマットします。

 これらの処理を行うことで、改行の修正が行えます。
材料力学「モーメント荷重が作用するはりのモーメントが直線変化なのは、どうしてですか？」をAI先生に聞きました。


**モーメント荷重が作用するはりのモーメントが直線変化なのは、どうしてですか？sympyのソースコードで教えて下さい。**

# Gemini先生へ
>(回答抜粋)
モーメント荷重が作用するはりのモーメントが直線変化するのは、力のつり合いとモーメントのつり合いの原理に基づきます。...
```python
from sympy import symbols, diff, plot

# 変数の定義
x, L, w = symbols('x L w')

# 曲げモーメントの式
M = w * x * (L - x) / 2

# 微分して曲げモーメントの変化率を確認
dMdx = diff(M, x)

# 数値代入してプロット
L_val = 10  # 梁の長さ
w_val = 1  # モーメント荷重

M_num = M.subs([(L, L_val), (w, w_val)])
plot(M_num, (x, 0, L_val), title='Bending Moment Diagram')
```

# ChatGPT先生へ
>(回答抜粋)
モーメント荷重が一定であれば、そのモーメントの傾き（つまり曲げモーメント図の勾配）が一様に変化し、直線的になります。
```python
from sympy import symbols, integrate, Piecewise

# 定義
x = symbols('x')  # はりの位置
L, M0 = symbols('L M0')  # はりの長さとモーメント荷重

# 曲げモーメントの変化
moment = Piecewise(
    (M0 * x, x <= L),  # モーメント荷重が作用する区間
    (0, x > L)         # それ以外
)

# 結果の表示
moment
```

# copilot先生へ



# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342) 　開発環境
# いつもと違うおすすめです。
VSCodeでMarkdownを爆速で書く！⚡️ 覚えておきたいショートカット集

## VSCodeでMarkdownを爆速で書く！⚡️ 覚えておきたいショートカット集

VSCodeはMarkdownを書くのに最適なエディタの一つですが、さらに効率的に書くためにショートカットを活用しましょう！この記事では、標準機能のものから拡張機能で追加されるものまで、覚えておきたいショートカットを、**頭文字と合わせて**紹介します。

### 標準機能のショートカット

まずはVSCodeに標準で搭載されているショートカットから。

* **プレビューの表示/非表示**: `Ctrl + Shift + V` (Windows) / `Command + Shift + V` (Mac) -  **V**iewのV。書いたMarkdownがどのように表示されるか、すぐに確認できます。
* **エディタの横にプレビューを表示**: `Ctrl + K` → `V` (Windows) / `Command + K` → `V` (Mac) -  こちらも**V**iew。プレビューを見ながら編集したい時に便利です。
* **太字**: `Ctrl + B` (Windows) / `Command + B` (Mac) -  **B**oldのB。強調したい箇所を太字に。
* **斜体**: `Ctrl + I` (Windows) / `Command + I` (Mac) -  **I**talicのI。補足情報などを斜体に。

### Markdown All in Oneのショートカット

「Markdown All in One」は、Markdown編集を強力にサポートしてくれる拡張機能です。インストールすることで、さらに多くのショートカットが使えるようになります。

* **見出しレベルを上げる**: `Ctrl + Shift + ]` (Windows) / `Command + Shift + ]` (Mac) - 見出しレベルを**上げる**方向の括弧。
* **見出しレベルを下げる**: `Ctrl + Shift + [` (Windows) / `Command + Shift + [` (Mac) - 見出しレベルを**下げる**方向の括弧。
* **数式挿入**: `Ctrl + M` (Windows) / `Command + M` (Mac) -  **M**athのM。数式を記述したい時に。
* **チェックボックスのオン/オフ**: `Alt + C` -  **C**heckboxのC。タスクリストなどを管理するのに便利。
* **取り消し線**: `Alt + S` -  **S**trikethroughのS。訂正箇所などに。
* **表のフォーマット整形**: `Alt + Shift + F` -  **F**ormatのF。表を見やすく整理。


### その他

* 多くのショートカットは、テキストを選択した状態で実行することで、そのテキストに効果を適用できます。
* ショートカットキーが競合する場合、うまく動作しないことがあります。その場合は、VSCodeの設定画面でショートカットキーを変更しましょう。


### まとめ

これらのショートカットをマスターすれば、Markdownでの執筆が格段にスピードアップします。頭文字をヒントに、ぜひ活用して、快適なMarkdownライフを送りましょう！
『応用基礎としてのデータサイエンス AI×データ活用の実践』第3章章末問題解答

[応用基礎としてのデータサイエンス AI×データ活用の実践 (データサイエンス入門シリーズ)](https://amzn.to/4gc8hfd)
<a href="https://amzn.to/4gc8hfd" target="_blank"><img src="https://m.media-amazon.com/images/I/61Ydv2hZuaL._SY522_.jpg" width=150 /></a>

解答が公開されてますが

https://www.kspub.co.jp/download/9784065307892_1.pdf

解説がないのと誤っている箇所もあるようなので解説付きで解きました

# 3 AI基礎
## 3.1 AIと社会
- 3.1.1 ③
    - 1950年代に始まり、1956年のダートマス会議でマッカーシーが「AI」と名付けた
- 3.1.2 ④
    - 勾配消失は深層学習で問題となるか改善策が提案されている
    - トイプログラムは問題ではなくトイプロブレムを解くプログラムのこと
- 3.1.3 ①
- 3.1.4 ⑤
- 3.1.5 ③

## 3.2 AIと社会
- 3.2.1 ①
    - ②識別は「分類」か「判別」って呼ばれる方が多いと思いますが、0/1などのカテゴリ値に分ける教師あり学習
    - ③、④は教師なし学習
- 3.2.2 ③
    - ①学習データだけに特化して学習してしまうと実際に予測する新たなデータでの予測能力（つまり汎化能力）が落ちるから、この選択肢は正しい
    - ②場合により微妙ですが③よりは良いか
    - ④①と同様に正しい
- 3.2.3 ②
    - ①カテゴリ変数の場合は大小ではなくこの選択肢は微妙だが②よりは良いか
    - ②線形識別器ではなくIF条件で大小やカテゴリ値を分けるような分類を行う
    - ③3.2.2の複雑な学習モデルと同様
    - ④木の分岐で条件と図示ができる
- 3.2.4 ④
    - ④正則化パラメータを選ぶ手法である
- 3.2.5 ③
    - ③見過ごしをしない確率である再現率なので、逆に言えばどれくらい見過ごししているかがわかる
    
    |||予測||
    |---|---|---|---|
    |||**P**|**N**|
    |**真<br/>の<br/>値**|**P**|<font color="red">TP(Pと予測して当り)</font>|<font color="blue">FN(Nと予測して外れ)</font>|
    ||**N**|<font color="blue">FP(Pと予測して外れ)</font>|<font color="red">TN(Nと予測して当り）</font>|
    - 正解率=$\frac{TP+TN}{TP+FN+FP+TN}$
    - 適合率=$\frac{TP}{TP+FP}$
        - 陽性Pと予測されたうち真にPな割合。これが大きいほどオオカミ少年じゃなくなる
    - 再現率=$\frac{TP}{TP+FN}$
        - 真の陽性Pのうち、正しく予測Pとなった割合。陽性の見過ごしをしない確率
    - 偽陽性率TPR=$\frac{TP}{TP+FN}$
        - 真の陽性Pのうち正しく予測Pとなった割合。
    - 偽陽性率FPR=$\frac{FP}{TN+FP}$
        - 真の陰性Nのうち誤って予測Pとなった割合。
- 3.2.6 ②
    - 予測をする際には推定パラメータを確率分布で表す

## 3.3 深層学習の基礎
- 3.3.1 ①
    - ①恒等関数なので層が増えただけでは複雑な計算はできない
    - 層が増えるので②③④は正しい
- 3.3.2 ④
    - 問題文では$j''$となているが$j'$の誤りと思われる
    ```math
    \begin{align}
    s_j(z)&=\frac{\operatorname{exp}(z_j)}{\sum_{j'=1}^d\operatorname{exp}(z_{j'})} \\
    Z&=\sum_{j'=1}^d\operatorname{exp}(z_{j'})とおくと\\
    s_j(z)&=\frac{\operatorname{exp}(z_j)}{Z} \\
    \frac{\partial \operatorname{exp}(z_j)}{\partial z_{j'}}&=\delta_{ij}\operatorname{exp}(z_j)\\
    &=0\\
    \frac{\partial \frac{1}{Z}}{\partial z_{j'}}&=-\frac{1}{Z^2}\frac{\partial Z}{\partial z_{j'}} \\
    &=-\frac{\operatorname{exp}(z_j)}{Z^2}\\
    &=-s_j(z)\frac{1}{Z}\\
    \operatorname{exp}(z_j)\frac{\partial \frac{1}{Z}}{\partial z_{j'}}&=\operatorname{exp}(z_j)(-s_j(z)\frac{1}{Z})\\
    &=-s_j(z) s_{j'}(z)
    \end{align}
    ```
- 3.3.3 ③
    - ①1回当たりの計算コストは変わらない
    - ②購買計算の実行時間には影響がない
    - ④学習率を増加させると最適解を通り越してしまう恐れあり
- 3.3.4 ③
    - 畳み込み層は画像を抽象化していく過程なので生成層では使えない
- 3.3.5 ①
    - 状態：学力、　行動：費やす勉強時間、報酬：試験の合否
    - 学力：行動ではない。報酬も考えられなくはないがスコアとして得られるのは試験の合否
    - 費やす勉強時間：報酬ではない。状態とも考えられなくもないがそうすると行動がなくなる
    - 試験の合否：状態ではない。行動でもない。

## 3.4 ロボット、認識、言語
- 3.4.1 ②
    - ①あえていうなら文字分割
    - ③係り受け解析
    - ④翻訳
- 3.4.2 ②
    - ①文を単語に分割すること
    - ③品詞のつながりを用いた統計モデル
    - ④周辺の単語から注目単語を予測すること
- 3.4.3 ①
    - ②品詞のつながりを用いた統計モデル
    - ③学習アルゴリズムの一つであり自然言語特有のものではない
    - ④情報圧縮アルゴリズムの一つであり自然言語特有のものではない
- 3.4.4 ③
    ```math
    \begin{align}
    P(barks|dog)&=\frac{P(barks, dog)}{P(dog)}\\
    &=\frac{\frac{1}{20}}{1}\\
    &=\frac{1}{20}
    \end{align}
    ```
- 3.4.5 ③
    - $\frac{6}{10}=60$%
Arch LinuxでQEMU / KVMを使いたい

最近、Arch LinuxへのQEMU / KVM導入に苦戦しています。とりあえず備忘録として残しておきます。

# QEMU / KVMとは？
KVM（Kernel-based Virtual Machine）は、Linuxカーネルに組み込まれている仮想化技術です。
Linuxカーネル自体をハイパーバイザとして利用し、仮想マシンを効率的に、少ないオーバーヘッドで実行することができます。

KVMを利用するためにはQEMUというソフトウェアを利用します。
QEMUはエミュレータです。
Virtual Box等と違い異なるアーキテクチャのエミュレートも可能ですが、QEMU自体のエミュレート速度は早くはありません。（→色々なものをソフトウェア的にエミューレートしてるから？）

要はKVMに足りない機能を補うためにQEMUを用いる、という事らしいです

# メリットはなに？
KVMを用いた時点でVirtual Boxとかよりは高速だと思うのですが、それよりも凄いKVMの圧倒的なメリットは「ホストマシンに複数のGPUがある場合、余っているGPUをゲストマシンにパススルーできる」という点でしょう。仮想マシンでもほぼネイティブ性能でGPUを動作させることができます。

まあ、私は複数GPUが乗ってるマシンを持ってないので今のところ意味ないですが、、、

# 導入
```
sudo pacman -S qemu-full qemu-img libvirt virt-install virt-manager virt-viewer edk2-ovmf dnsmasq swtpm libosinfo tuned ntfs-3g
```

パッケージについて解説します。

qemu-full: QEMUのフルバージョンで、仮想化を行うために必要です。
qemu-img: QEMUイメージの管理に必要なツールです。
libvirt: 仮想化管理のためのAPIとデーモンで、仮想マシンの管理に必須です。
virt-install: コマンドラインから新しい仮想マシンを作成するためのツールです。
virt-manager: GUIを使用して仮想マシンを管理するためのツールです。
virt-viewer: 仮想マシンのコンソールに接続するためのツールです。

edk2-ovmf: UEFIファームウェアを提供し、特定の環境での仮想マシンに必要ですが、すべてのセットアップで必須ではありません。
dnsmasq: DHCPおよびDNSサービスを提供しますが、仮想マシンのネットワーク設定に必要な場合のみです。
swtpm: ソフトウェアTPMエミュレーターで、セキュリティ機能が必要な場合に使用します。
libosinfo: ゲストOSの情報を管理するためのライブラリで、特定の機能を使用する場合にのみ必要です。
tuned: システムのパフォーマンスを最適化するためのツールですが、仮想化の基本機能には影響しません。
ntfs-3g: LinuxでNTFSを読み書きするときに必要になります。

# monolithic daemonを有効にする
```
sudo systemctl enable libvirtd.service
```
有効にするには再起動が必要です。

# ホスト仮想化の検証
```
sudo virt-host-validate qemu
```
WARNは無視しても大丈夫、らしい

# 標準ユーザーでKVMを使えるようにする
```
sudo vim /etc/libvirt/libvirtd.conf
```
以下の二行をコメントアウトします;
unix_sock_group = "libvirt"

unix_sock_rw_perms = "0770"

ユーザーアカウントをlibvirtグループに追加します。
```
sudo usermod -a -G libvirt $(whoami)
newgrp libvirt
```

設定できたらシステムを再起動しましょう。

# Windowsゲスト用のドライバ
ディスク、ネットワーク、グラフィックにvirtioドライバを適用すると速くなります。
ただ、Virt-Managerの設定からデバイスをvirtioに変更するとWindowsのインストーラーからストレージが見えなくなったりするため、インストールの過程でひと工夫必要です。→[参考文献](https://qiita.com/naoyoshinori/items/6f7647a2e2f4b563b6b9)

virtioのドライバを[Fedoraのリポジトリ](https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/latest-virtio/)から持ってきます。（virtio-win.iso）

# ゲストOSとファイル共有をする
QEMUのゲストマシンとファイル共有するのはめんどくさいです。
sambaとかを使う方法もありますが、仮想マシンをネットから遮断したい場合などに使えません。
私が個人的に編み出したファイルの共有法は以下のとおりです。

QEMUの仮想ディスクイメージファイル（.qcow2）を/mntにマウントします。
（ゲストOSのディスクフォーマットがNTFSでも使うことができます。）
ゲストOSのディスクのルートにshare等の名前でディレクトリを作っておくとよいでしょう。

カーネルモジュールの読み込み
```
sudo modprobe nbd
```

マウント
```
sudo qemu-nbd -c /dev/nbd0 -f qcow2 /var/lib/libvirt/images/Windows11.qcow2
sudo mount /dev/nbd0p3 /mnt
```
（注：nbd0p3なのはこの場合３つ目のパーティションにWindowsが入っていたからです。「sudo gdisk -l /dev/nbd0」で中のパーティションを確認できます。）

アンマウント
```
cd ~
sudo umount /mnt
sudo qemu-nbd -d /dev/nbd0
```

アンマウントされたことを確認
（オプションなしでmountコマンドを実行すると現在マウントされているディレクトリが確認できます。）
```
mount
```

また、これらを簡単に実行できるようにシェルスクリプトなんかを作っておくと便利です。

# 参考文献
https://computingforgeeks.com/install-kvm-qemu-virt-manager-arch-manjar/
https://gist.github.com/tatumroaquin/c6464e1ccaef40fd098a4f31db61ab22
https://qiita.com/naoyoshinori/items/6f7647a2e2f4b563b6b9
VS Codeで画像をコピペ！設定ひとつで楽々画像管理

## VS Codeで画像をコピペ！設定ひとつで楽々画像管理

Visual Studio Code（VS Code）でMarkdownファイルを編集する際、画像を貼り付ける作業は頻繁に発生しますよね？ 

いちいち画像を保存して、パスを指定して… と面倒な手順を踏んでいませんか？

実はVS Codeには、**画像をコピー＆ペーストするだけで自動的に指定フォルダに保存してくれる**便利な機能が備わっています。

設定方法はいくつかありますので、ご自身に合った方法を選んで設定してみてください。

### 設定方法1：GUIで設定

1. **設定を開く**

   VS Codeの左下にある歯車アイコンをクリックし、「設定(Settings)」を開きます。

   [Image of VS Code settings icon]

2. **Markdownの設定を探す**

   設定画面上部の検索バーに `"markdown.copyFiles.destination"` と入力します。

   [Image of VS Code settings search bar]

3. **設定値を追加**

   `markdown.copyFiles.destination` の項目に、以下の設定を追加します。

   ```json
   "markdown.copyFiles.destination": {
     "**/*": "./Assets/"
   },
   ```

   この設定により、**全てのMarkdownファイルにおいて、画像をコピー＆ペーストすると、`Assets`フォルダに画像が保存されます。**

   [Image of VS Code settings with markdown.copyFiles.destination]


### 設定方法2：settings.jsonを直接編集

1. **設定を開く**

   VS Codeの左下にある歯車アイコンをクリックし、「設定(Settings)」を開きます。

   [Image of VS Code settings icon]

2. **`settings.json`を開く**

   設定画面上部のタブで「JSON」を選択します。

   [Image of VS Code settings JSON tab]

3. **Markdownの設定を探す**

   `settings.json` ファイル内で `"markdown.copyFiles.destination"` を探します。 既に設定がある場合は、その部分を編集します。

4. **設定値を追加**

   `"markdown.copyFiles.destination"` の項目に、以下の設定を追加します。

   ```json
   "markdown.copyFiles.destination": {
     "**/*": "./Assets/"
   },
   ```

   この設定により、**全てのMarkdownファイルにおいて、画像をコピー＆ペーストすると、`Assets`フォルダに画像が保存されます。**


### 設定方法3：コマンドパレットから設定

1. **コマンドパレットを開く**

   `Ctrl + Shift + P` (Windows/Linux) または `Cmd + Shift + P` (macOS) を押してコマンドパレットを開きます。

2. **設定を開く**

   コマンドパレットに `Preferences: Open Settings (JSON)` と入力してEnterキーを押します。

3. **Markdownの設定を探す**

   `settings.json` ファイル内で `"markdown.copyFiles.destination"` を探します。 既に設定がある場合は、その部分を編集します。

4. **設定値を追加**

    `"markdown.copyFiles.destination"` の項目に、以下の設定を追加します。

   ```json
   "markdown.copyFiles.destination": {
     "**/*": "./Assets/"
   },
   ```

   この設定により、**全てのMarkdownファイルにおいて、画像をコピー＆ペーストすると、`Assets`フォルダに画像が保存されます。**


### 使い方

設定が完了したら、あとは画像をコピーしてMarkdownファイルに貼り付けるだけです。

1. **画像をコピー**

   任意の画像をコピーします。

2. **Markdownファイルに貼り付け**

   VS Codeで編集中のMarkdownファイルに、コピーした画像を貼り付けます。

すると、`Assets`フォルダに画像が自動的に保存され、Markdownファイルには画像へのパスが記述されます。

### まとめ

この設定により、画像の管理が劇的に楽になります。

* 画像を保存する手間が省ける
* パスの記述ミスを防げる
* Markdownファイルの可読性が向上する

ぜひこの機能を活用して、快適なMarkdown編集を実現しましょう！
まいこんの歩き方

# はじめに
この記事は自分の思ったことを書いています。
随時更新します。
価格は記事を書いた時点のものです。購入時はお調べください）

# お間違いないように
マイコンは電子部品です。どんどん廃れ、新しくなってきます。なので”これが良い”という固定概念は持たない方が良いです。
個人によって想いや使い方が異なります。

# 開発環境
## (過去製品?) Seeed Wioシリーズ　
https://wiki.seeedstudio.com/Wio/
アプリでセンサーを指定すると、OTA（On the Air)でファームを書き換えてくれます。
ネットワーク経由（IoT）でデータが取りたいだけだったらこれが一番楽でした。
IFTTTを使うならこれで十分でした。すでにサービスが終わっています。
WioCoreを使えば安価でしたがすこし趣旨が異なってきますね。
センサーの対応は多いですが、ない場合は利用できません。
日本の技適が無い商品もあるので注意が必要です。
App（Android）
App（iOS) https://apps.apple.com/us/app/wio-link/id1054893491
入出力をMQTTにした同等品があれば、過半数の人はこれで十分かも。

## M5Stack UI-Flow
これで出来るならこれで十分かもしれません
原則M5の製品しか使えません。（自分でBlockを作ればできますが）
プログラムが複雑・長くなると大変かも。
リポジトリ管理は出来ないかな。

## Arduino IDE
書籍も沢山あってスタンダードです。
そんなに難しいとは思いませんが以下の人には向きません。
- Cが嫌・無理
- マルチタスクがしたい
- 複雑な描画がしたい
- もっとかっこいい開発環境が使いたい
- 等

## NodeRED MCU
我慢強い人。。。。（ModdabelとNodeREDのインストールが出来る人）
ハード・ソフトとも管理出来れば大丈夫です。

## Mesh
お金がある人はこれでも、、、
ただしセンサーが無ければ絶望かも

# ハードウエア(マイコン)
## Arduino Uno R4　￥3,795
https://www.switch-science.com/products/9000
５Vが使いたい時
安心のUnoブランド
基本はブレッドボードもしくはシールド(拡張基板）かな。

## M5Stack Basic ￥6,941
https://www.switch-science.com/products/9010
豊富なM5Stackのセンサー等で遊ぶには十分
価格の半分？はUI-Flowの開発費と思えばそんなもんかも
ケースが付いているのは良い。
最近はESP32Sシリーズ、ESP32Cシリーズに移りつつあるかも、なので安定を求める以外は選択されないかも。

## LilyGO K193 T-Dongle S3　￥2,000
https://shigezone.square.site/product/-k193-t-dongle-s3-screen-version-transparent-shell-11-/156
Shigezoneの取り扱いが始まって、日本でも入手が楽になりました。
画面が必要な時はこれでも良いのではと思う。
ごめんなさい。実際に使っていないです。

## Xiao SAMD21 ￥1,247
https://www.switch-science.com/products/6335
安価でArduinoしたいときに。(と思っていたのですが Raspberry Pi Pico 2の方が安価になりましたね）
小型で使いたいときに
画面が不要な時に
100回に1回程度ピンセットでリセットしないといけないかも（たまに書き込み不能になります）

## Raspberry PI Pico 2 ￥1,012
https://www.switch-science.com/products/9809
使い込んでないので説明できません。すみません。

# ハードウェア（インターフェイス）
## Grove
https://wiki.seeedstudio.com/Grove_System/
Seeed社が提唱したコネクタケーブル。
コネクターは２mmピッチ。
電圧定義が無かったので
Vcc・信号とも５Vの物、3.3Vの物、Vccが５Vで信号が3.3Vの仕様と多岐にわたる。
特にM5StackのGROVEは、Vccが５Vで信号が3.3Vの仕様なので注意が必要。
M5Stack製のケーブルは色が異なる。
基本は出来合いの物を購入
I2Cの信号はノイズの影響を受けやすいので、入れ替えたものを使う場合もあり。

## Qwiic
SpackFunの提唱したコネクタケーブル
https://www.sparkfun.com/qwiic
JSTのSR/SHコネクタを利用（1mmピッチ）
基本はI2Cのみ？
2025年はこれを使った作品を作るかな。。。
[CSS] `:last-of-type` は使えない / `:nth-last-child` が便利

擬似クラス `:last-of-type` は以前からセレクタとして使えましたが、これは `div` や `section` などの特定のタグにしか適用できません。  

セレクタにクラスを追加したとしても対象は大きく変わらず、  
親要素内の**一番最後の**タグにしか適用されません。

```html
<article>
  <header>header</header>    <!-- header:last-of-type -->

  <section>section</section>
  <section>section</section>
  <section>section</section> <!-- section:last-of-type -->

  <div class="foo">div.foo</div>
  <div class="foo">div.foo</div>
  <div class="foo">div.foo</div> <!-- 特定不可 -->

  <div>div</div>
  <div>div:last-child</div> <!-- div:last-of-type -->
</article>
```

上記の「特定不可」としている箇所は後続に同じ `div` タグが存在するため `.foo:last-of-type` を利用できません。  
この代替策として `:nth-last-child(n of .foo)` が利用できます。

以下のスタイルで `:nth-last-child` の文字色の赤は特定不可とした箇所に適用されます。  
逆に `:last-of-type` の緑の罫線はどこにも適用されません。

```scss
.foo {
  :nth-last-child(1 of &) { color: red }
  &:last-of-type { border: solid 1px green }
}
```

- [デモ @ JSFiddle](https://jsfiddle.net/ghbm104v/)

`:nth-last-child(n of x)` の `x` の部分にはタグでもセレクタでも自由に指定でき、タグを指定する場合も `:last-of-type` と同様な使い方ができます。
また、`:first-of-type` も同様に `:nth-child` で代替できます。  

[Can I use...](https://caniuse.com/css-nth-child-of) や [MDN](https://developer.mozilla.org/ja/docs/Web/CSS/:nth-last-child) を参照する限り、ブラウザ対応も概ね問題なさそうです👌

<script async src="//jsfiddle.net/ghbm104v/embed/"></script>

## 事の発端

特定条件の最後の要素のスタイルを変更したかった事と、過去に `:last-child` などの記述で `:last-of-type` に書き換えを推奨されるケースが有った記憶で、`:last-of-type` への切り替えメリットが感じられず調べていた所でした。

Stylelint のワーニングかと勘違いしてましたが、どうも emotion の SSR のワーニングだったようです。  

- [関連する GitHub issue](https://github.com/emotion-js/emotion/issues/1105)

`:last-of-type` では要素の追加に耐えられないケースが多いと思いますが、`:nth-last-child` への変更は要素追加にも強く、切り替えメリットも感じます。  
emotion の件は未確認ですが、もしワーニングが解消するようであれば `:nth-last-child` への書き換えがお勧めです。
Python tkinter：CPU使用率グラフを作る（２）

(2025.01.04) コード修正


前回記事に続いて、小さいタイプのCPU使用率グラフを作ってみた。

前回記事は以下の通り。これは Mac 標準のアクティビティモニタの CPU history に相当するものであった。

[Python tkinter：CPU使用率グラフを作る（１）](https://qiita.com/damyarou/items/a7261dbd2d8cd2bc4837)

下の写真において、前回作ったものが、縦長の６０秒間の履歴を示すもので、今回作成したものが時計の横にある小さいタイプのものである。これは履歴は示さず、その時々でどのCPUが動いているかを示すもの。利用率の表示には８個の Progressbar を用いている。これは Mac 標準のアクティビティモニタの CPU usage に相当するものである。


環境は以下の通り。

MacBook Pro 14"
Chip Apple M1 Pro (8-core CPU, 14-core GPU)
Memory 16GB
Storage 512GB SSD
macOS Sequoia 15.2
Python 3.13.1
Tcl/Tk 9.0.1

#### 軽い処理
![Screenshot 2025-01-04 at 16.46.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129300/048eb73d-c27f-db96-930b-ea9e6114af34.png)

#### 並列処理により全コア使用
![Screenshot 2025-01-04 at 17.08.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129300/5209e817-c280-1ded-9fb2-d3c9ce19f3cf.png)


小さいものと大きなもので、数値が異なっているが、これはスタートのタイミングのずれによるものと思われる、厳密な数値を問題にするソフトでもないので大体同じ数値が出ていれば良しとする。

コードは以下の通り。

```python
import tkinter as tk
from tkinter import ttk
import numpy as np
import psutil


def update():
    global root,lb2,val,mlb
    r=psutil.cpu_percent(interval=1, percpu=True)
    for k in range(0,len(r)):
        lb2[k]['text']='{0:.1f}'.format(r[k])
        val[k]['value']=r[k]
    mlb[1]['text']='{0:6.1f}%'.format(sum(r)/len(r))
    mlb[3]['text']='{0:6.1f}%'.format(psutil.virtual_memory().percent)
    root.after(1000, update)


def main():
    global root,lb2,val,mlb

    # basin parameter
    nc=psutil.cpu_count() # number pf cores
    cpu=[]
    for i in range(0,nc):
        s='P'  # performance core
        if 0<=i<=1: s='E' # efficiency core
        cpu.append('{0}-{1}'.format(i+1,s))

    # GUI
    root =tk.Tk()
    root.resizable(False,False)
    root.title('CPU & Mem')
    style=ttk.Style()
    style.theme_use('alt')
    fontn='Calibri 10'
    fontb='Calibri 12 bold'
    style.configure('.',font=(fontn))
    style.configure('.',background='#393939',foreground='#ffffff')
    style.configure('Horizontal.TProgressbar', background='#999999')
    style.configure('Horizontal.TProgressbar', troughcolor='#0f0f0f')
    style.configure("Horizontal.TProgressbar", bordercolor='#393939')

    frame0=ttk.Frame(root)
    lb1=np.empty(nc,dtype=object)
    lb2=np.empty(nc,dtype=object)
    val=np.empty(nc,dtype=object)
    for k in range(0,nc):
        lb1[k]=ttk.Label(frame0,text=cpu[k],borderwidth=0,relief=tk.SOLID,anchor=tk.CENTER,width=3)
        lb2[k]=ttk.Label(frame0,text='',borderwidth=0,relief=tk.SOLID,anchor=tk.CENTER,width=5)
        val[k]=ttk.Progressbar(frame0,orient='horizontal',length=70,maximum=100,mode='determinate')
        lb1[k].grid(row=k,column=0)
        lb2[k].grid(row=k,column=1)
        val[k].grid(row=k,column=2)
    frame0.pack()

    frame1=ttk.Frame(root)
    nn=4
    mlb=np.empty(nn,dtype=object)
    txt=['CPU','','MEM','']
    for k in range(0,len(mlb)):
        mlb[k]=ttk.Label(frame1,text=txt[k],borderwidth=1,relief=tk.SOLID,anchor=tk.CENTER,width=7,font=(fontb))
        i,j=k//2,k%2
        mlb[k].grid(row=i,column=j)
    frame1.pack()

    update()

    root.mainloop()


if __name__ == '__main__': main()
```

以　上
PnP PowerShellでSharePointリストにTeamsのチームIDを登録する

# やりたいこと
タイトル通りです。備忘録として記事に残します。

# 実装方法
実装方法はMicrosoftの公式ドキュメントに記載されています。

https://learn.microsoft.com/ja-jp/graph/api/listitem-create?view=graph-rest-1.0&tabs=powershell

ただし、今回利用したのでは通常のPowerShellではなく、コミュニティがオープンソースで提供しているPnP PowerShellライブラリです。Microsoftが直接提供するものではありませんが、Power PlatformやSharePointOnlineなど、Microsoft 365サービスをPowerShellから操作可能です。

https://pnp.github.io/powershell/

# PowerShellコマンドの全体像
結論、実行コマンドは以下です。
```powershell
# Microsoft Teamsモジュールのインストール
Install-Module -Name MicrosoftTeams -Scope CurrentUser -Force

# SharePoint PnPモジュールのインストール
Install-Module -Name PnP.PowerShell -Scope CurrentUser -Force

# Microsoft Teamsに接続
Connect-MicrosoftTeams

# チームIDを取得
$teamName = "{チーム名}"
$team = Get-Team | Where-Object { $_.DisplayName -eq $teamName }
$teamId = $team.GroupId

# SharePointサイトに接続
$siteUrl = "https://{tenant_name}.sharepoint.com/sites/{site_name}"
Connect-PnPOnline -Url $siteUrl -UseWebLogin

# SharePointリストにデータを追加
$listName = "{リスト名}"
Add-PnPListItem -List $listName -Values @{"TeamID" = $teamId}

# SharePointリストのデータを更新
$itemId = 1  # 更新したいアイテムのID
$updatedValues = @{
    "Title" = "Updated Title"
    "FieldInternalName" = "Updated Value"
}
Set-PnPListItem -List $listName -Identity $itemId -Values $updatedValues
```

# インストール時の注意点
結論、PowerShell 7.xを使用することを推奨します。
経験則としてPowerShell 5.xでコマンドを叩いても、以下記事で紹介されているエラーが発生したからです。要はバージョンが古いとダメってことですね。

https://qiita.com/Neko0415/items/b1a00a680476a8d197b2

以下記事でもPnP PowerShellは古い環境では動作しないとの記載があります。

https://github.com/pnp/powershell/blob/dev/MIGRATE-1.0-to-2.0.md

解決方法は簡単です。OS環境に応じて、PowerShell7.x以降をダウンロードして環境にインストールするだけです。

Windows環境の場合、[こちらのリンク](https://learn.microsoft.com/en-us/powershell/scripting/install/installing-powershell-on-windows?view=powershell-7.4&viewFallbackFrom=powershell-7.2)を参照してください。

Linux環境の場合、[こちらのリンク](https://learn.microsoft.com/en-us/powershell/scripting/install/installing-powershell-on-linux?view=powershell-7.4&viewFallbackFrom=powershell-7.2)を参照してください。

Mac Os環境の場合、[こちらのリンク](https://learn.microsoft.com/en-us/powershell/scripting/install/installing-powershell-on-macos?view=powershell-7.4&viewFallbackFrom=powershell-7.2)を参照してください。

# 追記（2025年1月27日）
以下記事を参照して検証した結果、Windows PowerShell 5.1を使用している場合は、PnP.PowerShell 1.xx系のバージョンを明示的に指定して、モジュールのインストールを行えば動作します。なので、PowerShell 5.xではダメっていうのは少々語弊がありました。

```powershell
Install-Module -Name "PnP.PowerShell" -RequiredVersion 1.12.0
```

https://zenn.dev/maekawawawa/articles/032b79fffc7019
Threadクラス

# スレッドを扱うクラス
>class Thread
クラス・モジュールの継承リスト: BasicObject>Kernel>Object >Thread 
要約
スレッドを表すクラスです。スレッドとはメモリ空間を共有して同時に実行される制御の流れです。 Thread を使うことで並行プログラミングが可能になります。

>### スレッドの状態
>個々のスレッドは、以下の実行状態を持ちます。これらの状態は Object#inspect や Thread#status によって見ることができます。
```rb
irb(main):010> p Thread.new {sleep 1}
#<Thread:0x000000010ae3f980 (irb):10 run>
```
>run (実行or実行可能状態)
生成されたばかりのスレッドや Thread#run や Thread#wakeup で起こされたスレッドはこの状態です。 Thread#join でスレッドの終了を待っているスレッドもスレッドの終了によりこの状態になります。 この状態のスレッドは「生きて」います。

>sleep (停止状態)
Thread.stop や Thread#join により停止されたスレッドはこの状態になります。 この状態のスレッドは「生きて」います。

>aborting (終了処理中)
Thread#kill 等で終了されるスレッドは一時的にこの状態になります。この状態から停止状態(sleep)になることもあります。 この状態のスレッドはまだ「生きて」います。

>dead (終了状態)
Thread#kill 等で終了したスレッドはこの状態になります。この状態のスレッドはどこからも参照されていなければ GC によりメモリ上からなくなります。 この状態のスレッドは「死んで」います。

https://docs.ruby-lang.org/ja/latest/class/Thread.html#S_NEW

### 感想
スレッドを扱うクラスしか理解できなかった。
デュアルブート用UEFIソフトをつくる（第0回）

# 本連載の目標
　次回起動時にブートするOSを変更し、コンピュータを再起動させるUEFIソフト「BootNextChanger」を作成する。

# 謝辞
　大神祐真様の[フルスクラッチで作る!UEFIベアメタルプログラミング](http://yuma.ohgami.jp/UEFI-Bare-Metal-Programming/index.html)が、大変参考になりました。ありがとうございます。

# UEFIについて
https://uefi.org/

　Unified Extensible Firmware Interfaceの略で、OSとファームウェアの間を結ぶインターフェースです。UEFIは、仕様が「UEFI Specificatrion」として公開されていることが大きい特徴の1つです。2025年1月3日時点での仕様書の最新版は、UEFI Specification 2.11です。

## UEFIによるOSの起動
　UEFIは、ブートマネージャーを備えています。ブートマネージャーは、UEFI仕様書に則って作成されたアプリケーション（.efi形式の場合がほとんど）を起動することができます。例えばWindowsの場合は、起動時に「bootmgfw.efi」を呼び出します。
　UEFIでは、NVRAM（不揮発性メモリ）に保存する変数（UEFI実行ファイルへのポインタなど）も規定しており、ブートマネージャーはNVRAM上に保存された変数からUEFIアプリケーションをロードし、実行します。
　UEFIと、それに付随したブートマネージャーを使うと、OSを介さずにファームウェアを使って計算機を動作させる、ベアメタルプログラミングが可能です。
 
 　さらなる詳細は、[UEFIの仕様書](https://uefi.org/specs/UEFI/2.11/index.html)をご確認ください。


# 作成するUEFIソフトの詳細
## ファイル形式、呼び出し方法
　C言語のソースコードでアプリケーションの内容を記述し、mingwでPE32+にクロスコンパイルすることでUEFIで実行可能な形式にします。
　実行可能となったEFIファイルは、rEFIndブートマネージャーで呼び出します。

## 動作
　BootNextChangerは、呼び出されると、まずはグローバル変数「BootNext」を書き換えます。次に、コンピュータを再起動させます。

## 使用例
　ブートエントリが次のように設定されていたとします。
 ```
 $ efibootmgr -u
BootCurrent: 0001
Timeout: 0 seconds
BootOrder: 0001,0000
Boot0000* Windows Boot Manager  HD(1,xxxxxxxx)/\EFI\Microsoft\Boot\bootmgfw.efi????
Boot0001* UEFI OS       HD(1,xxxxxxxx)/\EFI\refind\refind_x64.EFI
 ```
　BootNextChangerは、BootNextを0000に書き換えるよう設定しておきます。
　このとき、UEFIのブートマネージャーは、最初にrEFIndを起動します。（rEFIndの起動の際にエラーメッセージが吐かれたら、Windows Boot Managerを起動します。）
　ここで、rEFIndでBootNextChangerを起動すると、BootNextChangerは、OSの起動していないベアメタルの上で動作します。BootNextChangerはBootNextを0000に書き換え、自動的に再起動したあとにBoot0000に登録されたブートオプション（今回の場合は、Windows）が起動します。さらに、BootNextは次回起動時のみに効くため、さらに再起動をすると今度はrEFIndが起動します。
　ブートローダーから直接Windowsブートマネージャーを呼び出すと動作が不自然になることが多いですが、今回の方法を使えば、Windowsによって設定されたブートエントリそのものを起動できるため、動作がとても自然です。

 # おわりに
　私はベアメタルプログラミング初心者なので、間違っているところなどあればご指摘いただけますと幸いです。
　今後ともよろしくお願いします。

 # 参考
 https://qiita.com/tnishinaga/items/40755f414557faf45dcb

http://yuma.ohgami.jp/UEFI-Bare-Metal-Programming/index.html

https://uefi.org/specs/UEFI/2.11/index.html
Soraで同一人物を出す方法

# まとめ
以下の2つをやると良いです。
1. 人物の特徴を、人種的特徴と髪型と顔に身につけたもので描写する。
2. Soraに**全く同じプロンプト**（ここがミソ）で複数回出力させて、同じに見える動画だけを選別する。

# 使用したプロンプトの例
In a space ship, an Anglo-Saxon old man, who has white hair and round glasses, is looking at an old computer.  He is next to fall asleep because of tiredness. The camera focus pulls from the man to the computer.

※ざっくり日本語訳すると、「アングロサクソンの白髪でメガネのおじいちゃんが、宇宙船で疲れながらパソコン見てる、カメラ移動してね」と書いてます。英語の方が精度高いらしいので、プロンプト自体は英語で書いてます。

# 結果
白髪のおじいちゃんを、60%くらいの確率で同一人物っぽく出せました。
あとは40％を切り捨てて編集するだけ。
以下の動画でご確認ください。
https://www.youtube.com/watch?v=INHXywXPNyo
国語研長単位係り受け解析モデルmodernbert-base-japanese-aozora-ud-goeswithリリース

[昨日の記事](https://qiita.com/KoichiYasuoka/items/ec764c40a36426cc6a4c)の続きだが、[modernbert-base-japanese-aozora](https://huggingface.co/KoichiYasuoka/modernbert-base-japanese-aozora)には内部に[ModernBertForTokenClassification](https://qiita.com/KoichiYasuoka/items/d1fbb04804079a4e495e)を実装しておいた。現時点では[inputs_embedsが無い](https://github.com/huggingface/transformers/pull/35373)ので取り回しがちょっと面倒なのだが、国語研長単位[UD_Japanese-GSDLUW](https://github.com/UniversalDependencies/UD_Japanese-GSDLUW)をもとに、係り受け解析モデル[modernbert-base-japanese-aozora-ud-goeswith](https://huggingface.co/KoichiYasuoka/modernbert-base-japanese-aozora-ud-goeswith)を試作してみた。ja_gsdluw-ud-test.conlluによるベンチマーク・プログラムは、Google Colaboratory (GPU版)だと、こんな感じ。

```
!pip install transformers triton
models=["KoichiYasuoka/modernbert-base-japanese-aozora-ud-goeswith"]
import os,sys,subprocess
from transformers import pipeline
url="https://github.com/UniversalDependencies/UD_Japanese-GSDLUW"
d=os.path.basename(url)
os.system(f"test -d {d} || git clone --depth=1 {url}")
os.system("for F in train dev test ; do cp "+d+"/*-$F.conllu $F.conllu ; done")
url="https://universaldependencies.org/conll18/conll18_ud_eval.py"
c=os.path.basename(url)
os.system(f"test -f {c} || curl -LO {url}")
with open("test.conllu","r",encoding="utf-8") as r:
  s=[t[8:].strip() for t in r if t.startswith("# text =")]
for mdl in models:
  nlp=pipeline("universal-dependencies",mdl,trust_remote_code=True,aggregation_strategy="simple",device=0)
  with open("result.conllu","w",encoding="utf-8") as w:
    for t in s:
      w.write(nlp(t))
  p=subprocess.run([sys.executable,c,"-v","test.conllu","result.conllu"],encoding="utf-8",stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
  print(f"\n*** {mdl}",p.stdout,sep="\n",flush=True)
```

私(安岡孝一)の手元では、以下の結果が出力された。

```
*** KoichiYasuoka/modernbert-base-japanese-aozora-ud-goeswith
Metric     | Precision |    Recall |  F1 Score | AligndAcc
-----------+-----------+-----------+-----------+-----------
Tokens     |     96.83 |     96.65 |     96.74 |
Sentences  |    100.00 |    100.00 |    100.00 |
Words      |     96.83 |     96.65 |     96.74 |
UPOS       |     94.30 |     94.13 |     94.22 |     97.39
XPOS       |      0.00 |      0.00 |      0.00 |      0.00
UFeats     |     96.80 |     96.62 |     96.71 |     99.97
AllTags    |      0.00 |      0.00 |      0.00 |      0.00
Lemmas     |      0.00 |      0.00 |      0.00 |      0.00
UAS        |     88.49 |     88.33 |     88.41 |     91.39
LAS        |     87.04 |     86.88 |     86.96 |     89.89
CLAS       |     80.19 |     80.21 |     80.20 |     84.36
MLAS       |     75.87 |     75.88 |     75.88 |     79.81
BLEX       |      0.00 |      0.00 |      0.00 |      0.00
```

UPOS/LAS/MLASが94.22/86.96/75.88なので、[『GPT系言語モデルによる国語研長単位係り受け解析』](http://hdl.handle.net/2433/290887)表3～5や[『青空文庫DeBERTaモデルによる国語研長単位係り受け解析』](http://hdl.handle.net/2433/275409)表6～7の「テスト(predict)」に較べて、イマイチ精度が足りない感じだ。うーん、[aozorabunko-clean](https://huggingface.co/datasets/globis-university/aozorabunko-clean)だけだと、データが少な過ぎるのかしら。それとも、ファインチューニングに何か工夫が必要なのかしら。
SoraでSF映画を作ってます①

# SF映画作ってます①
地球から2ヶ月のところに独りいる、宇宙灯台守のお話です。全5話。
映像は全て動画生成AIのSoraで作っています。
https://www.youtube.com/watch?v=INHXywXPNyo

# Soraの使い方
1. Relaxed modeで、うまくいきそうなプロンプトを試す
※前回はChatGPTに出力させましたが、割と雑なプロンプトでもうまく行く時はいきました。
2. うまく出力されたら、同じプロンプトで同じ動画を複数回出力させる。
3. 人物がほぼ同じ動画を選別して、動画編集ソフトで合わせる用に保存する。

# その他
- 動画編集はFinal Cut Proでやってます。
- アフレコは私がノリでやってます。
（ここはAIではないです。老人っぽくやるのムズカシイ）
2024年のコンピュータサイエンス関連読書振り返り

# はじめに
あけましておめでとうございます。本年もよろしくお願いします。昨年の振り返りとして42Tokyoでの学習(+私の興味関心)のために読んだ書籍を振り返りたいと思います。

なお、掲載順は私の購入順に過ぎません。

## 想定読者
下記のいずれかにあてはまる方
1.42Tokyoの本科生
2.コンピュータサイエンスに興味があって学習を開始して1年未満程度の方

## ※『おすすめ度』節の星評価について
想定読者にとってどの程度おすすめであるか、という単軸で独断と偏見に基づき評価させていただきます。

:::note info
★★★★★ : 必読
★★★★☆ : おすすめ
★★★☆☆ : 興味があれば
★★☆☆☆ : 興味があればいいが過剰or過少
★☆☆☆☆ : 内容が過剰ori過少すぎておすすめしない
:::

# 『C言語によるはじめてのアルゴリズム入門　改訂第5版』
## なぜこの書籍を読んだのか
42Tokyo入学試験中、アルゴリズムについて初学者向けの書籍を友人に質問したところおすすめされました。
## 主要な学び
アルゴリズムの全体感を掴むのに非常に良かったと思います。特に3章のソートとサーチ、5章のデータ構造の内容はダイレクトに実装に活きました。一方でそれ以外の内容はまだ実感を持って活かせたことはないです。
## おすすめ度
:::note
★★★☆☆
:::
# 『C実践プログラミング 第3版』
## なぜこの書籍を読んだのか
Piscineで学んだ内容に加えてC言語学習の全体感を掴みたかったためです。
## 主要な学び
買って少しさらったところ不要だったなと思いほとんど読んでいません。
## おすすめ度
:::note
★☆☆☆☆ ※特に本科生は不要.
:::

# 『セキュリティコンテストチャレンジブック　CTFで学ぼう！情報を守るための戦い方』
## なぜこの書籍を読んだのか
ビギナー向けCTFに参加しようと思い、経験者の方から初学者向けの導入本としておすすめされました。
## 主要な学び
買って少しさらったところ、正直全く前提知識が足りないなと思い、積んでいます。
## おすすめ度
:::note
★★☆☆☆
:::

# 『ふつうのLinuxプログラミング 第2版　Linuxの仕組みから学べるgccプログラミングの王道』
## なぜこの書籍を読んだのか
Linuxの仮想環境構築を勉強する際、そもそもLinux自体の勉強が必要であることに思い至ったためです。
## 主要な学び
コマンドを何を使えば何ができるのか、というレイヤーにとどまらず、Linuxが実際どう成り立っているのか、内部的に何が行われているのか、ファイルシステムとはなにか等など、初学者の自分にとって最高のLinux入門書だったと思います。
## おすすめ度
:::note
★★★★★
:::

# 『入門bash 第3版』
## なぜこの書籍を読んだのか
課題でbashの内部処理について学ぶ必要があったためです。

## 主要な学び
bashの基本は総ざらい出来るという前提で私は以下のことが特に活きました。
1. bashの内部プロセス
1. bashで出来ること
## おすすめ度
:::note
★★★★☆ : 校舎に第2版があったような?
:::

# 『Linuxプログラミングインターフェース』
## なぜこの書籍を読んだのか
Linuxを扱う人なら辞書として持っておけとの言説を受け、目次を見て購入を決めました。

通称TLPI。

## 主要な学び
この本はエンジニアの六法全書だと思います。Linuxのシステムコールの扱いがわからなかったらこの書籍を調べると初動はなんとかなりました。
## おすすめ度
:::note
★★★★☆ : 値段が高い...
:::


# 『コンピュータの構成と設計 MIPS Edition第6版上下巻』
## なぜこの書籍を読んだのか
コンピュータの低レイヤーに興味を持った際、詳しい同期におすすめ書籍を伺ったところ、世界中のcsの学生がおそらく授業で扱う標準テキストであるということでおすすめされました。
## 主要な学び
上巻8割くらいまでしか読めていないのですが、低レイヤーで何が行われているのかアセンブリレベルで説明があり、好奇心を非常にくすぐられました。
C言語の知識がないとあんまり楽しめないかもなとも思います。
## おすすめ度
:::note
★★★☆☆ 
:::

# 『独習C++ 新版』
## なぜこの書籍を読んだのか
課題のためにノリで買って全体を少しさらいましたが、

https://rinatz.github.io/cpp-book/

https://ja.cppreference.com/w/cpp

この2つのサイトだけで十分だったので購入は失敗でした。
## 主要な学び
新しい言語をやるときは導入用の書籍を買うと無駄になる。(=今はWeb上の教材を取捨選択できるだけの学習ノウハウが備わった?)
## おすすめ度
:::note
★☆☆☆☆ 
:::

# 『TCP/IPソケットプログラミング (C言語編)』
## なぜこの書籍を読んだのか
課題でソケットプログラミングを実装する必要があり、関連システムコールの深堀りがTLPIだけでは不十分だったためです。
## 主要な学び
send関数, recv関数で行われていることがカーネルのバッファまで深堀って説明されていたので非常にわかりやすかったです。
正直こんな複雑な動作をシステムコールというAPIで簡単に提供している事実に震えました。我々は巨人の肩に乗っているだけに過ぎない。
全体通してソケットプログラミングの学習にとって名著であると呼ばれることに納得できました。
## おすすめ度
:::note
★★★★★ 
:::

# 終わりに
 読み切れていない書籍を含め、2024年のコンピュータサイエンス関連書籍の振り返りをしました。たくさんインプット出来たなと実感しつつ、未だに自分の興味関心ベースでしか高効率で勉強出来ないことは改善しなければと思っています。
 
  2025年は業務に必要な実務ベースの書籍を大量にインプットしていきたいと思います。
改めて本年もよろしくお願い申し上げます。
お読みいただきありがとうございました。
Raspberry Pi Azure IoT Online Simulatorを使えるようにしてみた

年末年始は忙しいようで案外暇な時間もあるので、実機を持ち運んでなくてもちょっと開発したりできないかな〜と思って調べてみたところ、Azureのオンラインシミュレーターに辿り着いた。
せっかくなのでその過程と使ってみた感じをメモ。

## Raspberry Pi Azure IoT Online Simulator とは
ブラウザ上でRaspberry PiのシミュレーションとIoTハブとの接続・通信ができるらしい。
言語はNode.js（Rasberry Piで動かすソースコードをNode.jsで書いたことがないので若干躊躇いあり）。

ブラウザの操作画面↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3092540/f01bc28d-9d29-ff79-2c02-522868f9d611.png)
左ペインがイメージエリア、右ペインが上下で分割されていて、上がコーディングエリア、下がコンソールエリアとなっている。
イメージエリアでパーツが追加できるのかはまだわからない。。

公式の学習サイトには以下から飛べます。
https://learn.microsoft.com/ja-jp/azure/iot-hub/raspberry-pi-get-started

学習サイトに記載がある通り、IoT Hubとの接続には、Azureサブスクリプションの登録と、
Azure上でのIoT Hubの新規作成が必要。
アカウント作成後、30日は無料枠でサービスが利用できるようだったので登録。

Azureアカウント作成ページ↓
https://azure.microsoft.com/en-us/pricing/purchase-options/azure-account?icid=portal

IoT Hubの作成〜シミュレーターとの疎通確認の方法はシミュレーターのチュートリアルに書いてありました。

## 疎通確認
今回はただ疎通テストがしたいだけなので、無料のIoT Hubを作成。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3092540/af2419cc-1c2c-1569-4ca4-af9e3a41017a.png)

作成したIoT Hubにデバイスを追加し、「プライマリ接続文字列」をオンラインシミュレーターのソースコードに入力して実行すると、シミュレーターとの疎通が確認できる。
ソースコードはコンソールエリアの上部メニューから簡単に実行・停止できる。
ちなみに、Resetを押すとソースコードがデフォルトに戻る仕様。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3092540/99e11c99-5482-664e-3b32-8a7c8c910695.png)
サンプルコードで疎通に成功すると、コンソールエリアでのメッセージログの出力とともに、イメージ画面でLチカが確認できる。


## まとめ
Azureアカウント作成に少し手間取ったものの、他の設定は特に不要のためすぐに使い始めることができた。
言語は変更できるのかもしれないが、デフォルトはNode.jsになっているので、Pythonなどで記述したソースコードがそのまま実行できるのかどうかは調査が必要そう。
あとは、イメージエリアにセンサやモータなどのパーツが追加できるのかどうかも気になるところ。

実機を持ち歩くのがなかなか大変なので、簡単な開発であればシミュレータでうまく代替できるようになってくれると嬉しい。
Ruby 3.4 の it の落とし穴

# はじめに

Ruby 3.4 でブロックパラメーター `it` が導入された。

一言で言えば

```rb
(1..3).map{ _1.to_s }
```

が

```rb
(1..3).map{ it.to_s }
```

と書ける，というもの。

既にさまざまなところで紹介されているので，本記事ではその「さまざまなところ」にはなぜかあまり書かれていない**落とし穴**についてのみ述べる。

# 落とし穴

`it` の何が怖いかは，以下のコードで一目瞭然：

```rb
ary = [1, 2, 3]

p ary.map{ it.to_s }
# => ["1", "2", "3"]
# 期待どおり

it = 110

p ary.map{ it.to_s }
# => ["110", "110", "110"]
# えっ？
```

二番目の `ary.map` のブロックでは，`it` がブロックパラメーターではなく，ブロック外で定義された**ローカル変数の参照**となってしまっている。

この行を見ただけでは，`it` がブロックパラメーターなのかローカル変数なのか区別がつかないのだ。
見つけにくいバグを生みそう。

ブロック内の `it` がこのどちらであるのかは，スクリプトを上のほうまで遡らないと分からない。

`it` 導入の動機の一つは**認知負荷の低減**にあったというが，これでは**逆効果**ではないのだろうか。

# 対策

つまらないバグを防止する対策としては以下の二つが思いつく。

* `it` というローカル変数は使わない
* ローカル変数のスコープが短くなるよう心がける

前者はコーディングルールとして明記したほうがいいかもしれない。
「`it` なんてローカル変数，ふつう使わないでしょ」と思うかもしれないが，アゼルバイジャン語など多くのトルコ系言語で「it」は「犬」という単語なので（知らんけど），犬を表す変数に使わないとも限らない。
あるいは

```rb
ja = "ルビー"
en = "ruby"
de = "Rubin"
fr = "rubis"
it = "rubino"
```

のように，イタリア語の言語コード「it」を変数に使うこともありうる。

後者は，たとえばメソッド定義内にあるブロックで `it` が使われている場合，メソッドがせいぜい 10 行とかなら，どっちの `it` なのか一目で分かるでしょう，ということ。

いずれにしても，これらの「対策」は自分（やチーム）がコードを書くときの話であって，他人の書いたコードがこうなっていることは期待できない。

# メソッド呼び出しと紛れるおそれは？

メソッド `it` を定義しても，ブロック内の `it` がメソッド呼び出しと解釈されることはないようだ。

```rb
def it
  Math::PI
end

p (1..3).map{ it.to_s }
# => ["1", "2", "3"]
```

（もちろん，`it` に `( )` が付いていたり，引数と解釈しうる式が後続していたりすればメソッド呼び出しとなる）

# 最後に

Let `it` go.
Pythonのwith文の使い方

Pythonの`with`文は、「コンテキストマネージャ」と呼ばれる機能を実現するために使われます。これは主に、ファイルやネットワークのアクセスといった「資源の管理」を容易にし、コードを準設化するための文法です。

#### 基本的な構文

`with` 文は下記の構文で使います。

```python
with コンテキストマネージャの実装部分 as 変数:
    処理
```

この「コンテキストマネージャの実装部分」は、たとえばファイルを開くモジュールなどがあります。

#### ファイル操作の例

Pythonでファイルを開き、自動で閉じる処理をするのに`with` 文を使う例です。

```python
with open('example.txt', 'r') as file:
    content = file.read()
    print(content)
```

これは、ファイル`example.txt`を開き、内容を読み込んで表示するコードです。「with」は、ファイルを開いた後、自動的にこのファイルを閉じます。

#### コンテキストマネージャの実装

じっさいに`with` 文で使用するのは「コンテキストマネージャ」を実装しているクラスです。これは「__enter__」メソッドと「__exit__」メソッドを実装することで実現されます。

例えば、自分でコンテキストマネージャを作成する場合、下記のように実装します。

```python
class MyContextManager:
    def __enter__(self):
        print("Entering the context")
        return self

    def __exit__(self, exc_type, exc_value, traceback):
        print("Exiting the context")

with MyContextManager() as manager:
    print("Inside the context")
```

#### メリットとベストプラクティス

- **メリット**:
    - 自動で資源を解放するため、エラーを防げる
    - コードが準設化され、読みやすくなる

- **デメリット**:
    - コンテキストマネージャを作成したことがない場合、既存のものを理解するのに時間がかかる

#### 複数コンテキスト

複数の要素があるとき、コンテキストマネージャは複数の with 文がネストされたかのように進行します:

```
with A() as a, B() as b:
    SUITE
```

これは次と等価です:

```
with A() as a:
    with B() as b:
        SUITE
```
括弧で囲むことにより、複数のコンテキストマネージャを複数行に渡って書くことができます。 例:

```
with (
    A() as a,
    B() as b,
):
    SUITE
```

#### 使用例

- **ファイル操作**: 前説の通り
- **ネットワーク接続**:

```python
import sqlite3

with sqlite3.connect("example.db") as conn:
    cursor = conn.cursor()
    cursor.execute("CREATE TABLE IF NOT EXISTS users (id INTEGER, name TEXT)")
    conn.commit()
```

- **複数ファイル操作処理**:

```python
from threading import Lock

lock = Lock()

with lock:
    # クリティカルセクション
    print("Thread-safe operation")
```

- **マルチスレッド処理**:

```python
with open('file1.txt', 'r') as file1, open('file2.txt', 'w') as file2:
    content = file1.read() #ファイルfile1.txtを開き内容を読み込み
    file2.write(content) #内容をfile2.txtに書き込み
```

これらの例により、`with`文はいかに有用であるかを明確にすることができます。


https://docs.python.org/ja/3/reference/compound_stmts.html#the-with-statement
感想「プロジェクトリーダーの教科書」

# :tea: はじめに
[外資系コンサルが教える難題を解決する12ステップ プロジェクトリーダーの教科書](https://amzn.asia/d/amxx0el)を読了しました。

この本は、従来の「計画して管理するマネジメント志向」ではなく、<font color="pink">プロジェクトを「デザイン」し「推進」していくリーダー志向</font>の重要性を説いています。

プロジェクトの不確実性や失敗要因を最小化するためのアプローチとして、<font color="pink">「D3アプローチ」</font>が提示されています。これは、プロジェクトを「定義」「デザイン」「推進」の3つのフェーズに分けて進める方法です。

単に計画を立てて管理するだけではなく、リーダーとしてチームを牽引しながら目標に向かって進む姿勢が求められます。

本記事では、読んでいて特に腑に落ちたポイントをいくつかピックアップしてご紹介します。

:::note
D3アプローチと従来のPMBOKの一番の違いは「いくら精緻な計画を立てて、厳密な管理（コントロール）をしても、プロジェクトでは問題は必ず起こる 」こと。
:::


# :bulb: 学び

## やらないことの宣言
何をやらないかを定義するためにはプロジェクトの全体像が見えている必要がある。
プロジェクトの最初の段階で全体像を見通すことが難しいと思う場合には、対象範囲以外はスコープアウトとするという書き方でも良い。

## リスク・問題・課題
多くのプロジェクトで混同されている言葉の整理をする。

1. リスク
潜在的な阻害要因のこと。まだ起きていないけれど、起きたら困ること。

1. 問題
顕在的な阻害要因のこと。リスクが現実になった場合に問題と呼ぶ。

1. 課題
取り組むべき問題の原因のこと。

早いフェーズでリスクを多く洗い出すことはプロジェクト成功の秘訣です。

<font color="pink">リスク管理プロセス</font>は下記です。
1. 認識
1. 評価
1. 計画
1. 監視

<font color="pink">リスク対応プロセス</font>は下記です。
1. 回避
    - リスクの原因を取り除くことで、リスクの発生を防ぐ
1. 経過観察
    - リスクの影響が小さい場合、状況を監視し、必要に応じて対応
1. 受容
    - リスクを受け入れ、発生時に備えて対応策を準備
1. 転嫁
    - リスクを第三者に移転し、自社の影響を最小限に抑える

一番重要なことはリーダーはリスクを放置してはいけないということです。<font color="pink">放置して自然消滅するリスクは存在しません</font>。

## 変更要求への対応
要件をはじめに定義したとしても<font color="pink">変更要求は必ず発生</pink>する。

感情や疲れに流されると No と答えてしまうが、緊急度や重要度を見極めて冷静に判断をする必要がある。

著者の3つのTipsが紹介されていた。
- 変更要求の性質と傾向を知る
- 最終決断は翌朝に下す
- 変更対応時の現場の生産性は落ちる

## マインドフルネス
プロジェクトをリードするには、感情コントロール力が必須です。
リーダーはポジティブすぎることも、ネガティブすぎることもよくありません。

特にネガティブ感情は、<font color='pink'>特定の行動を誘引し、選択肢を制限</font>します。
ネガティブな気分の状況では、全ての変更要求に対して「NO」と答えて後々に後悔することが例として挙げられます。

自分の<font color='pink'>ニュートラルポジションの感情を保つ</font>ためにマインドフルネスについて理解を深めることが大切とされています。

自分自身はネガティブすぎる自覚があるため別途、「エンジニア×マインドフルネス」あたりの記事を探し下記の記事を発見しました。

[瞑想するエンジニア ( by いなうらゆうま 稲浦悠馬 @yumainaura ) — Googleやスティーブ・ジョブズに学ぶ「マインドフルネス」のススメ— 全プログラマ SE 必見！](https://qiita.com/YumaInaura/items/f1a55b0b342954224207)

紹介されていた下記の本を購入したので読み進めていきます。Be Buddha.

[反応しない練習　あらゆる悩みが消えていくブッダの超・合理的な「考え方」](https://amzn.asia/d/27YFcFC)

## コミュニケーション
コミュニケーションには2パターンあり、バランスが大切です。
チームがギスギスした雰囲気になっている場合には、チーム内で道具的コミュニケーションのみに傾倒していないかを確認するべきです。

1. <font color='pink'>道具的コミュニケーション</font>
ホウレンソウ（報連相）をはじめとする、業務上必要な目的がある会話のこと。

2. <font color='pink'> 自己充足的コミュニケーション</font>
業務には直接直結しないような無駄話のような会話のこと。

ただし自己充足的コミュニケーションに傾倒して単なる仲良しチームを作ってしまうことに注意です。

コミュニケーションの目的は、仲良しチームを作ることではなく<font color='pink'>プロジェクトが目指す最終目標を達成できるチーム</font>を作ることです。

# まとめ
この本を読んで、「リーダーは仲良しチームを作る人ではなく、目標を達成するチームを作る人」という言葉が特に印象に残りました。  

<font color="pink">地味で細かい作業をコツコツやることがプロジェクトの成功につながる</font>ことを忘れずに、しっかり取り組んでいきたいと思います。