OmniAICreator/Qiita-1.07M huggingface dataset:
2024/9/16主にITとかセキュリティの記事

考えられるリスクと適切な対策とは？　楽天モバイル、セキュリティ対策を解説(9/13)
https://news.nicovideo.jp/watch/nw16443847

日本で急に高まったサイバーセキュリティの意識…KADOKAWAへの攻撃で投資家が注目…関連銘柄3選(9/14)
https://news.yahoo.co.jp/articles/363258128f0a17cd21897a9117f8b0c30695e099?source=rss

Crucialの人気SSD『MX500』でデータ漏洩の危険性がある脆弱性が見つかる(9/14)
https://gazlog.jp/entry/crucial-mx500-security-flaw/

マイクロソフト、「ウィンドウズ」の障害再発防止に向けシステム見直しへ…７月に世界的な大規模障害で端末８５０万台停止(9/14)
https://www.yomiuri.co.jp/economy/20240914-OYT1T50092/

物流代行の関通にサイバー攻撃(9/14)
https://www.nikkei.com/article/DGKKZO83464630T10C24A9LKB000/

Windows 11が強制アップデートへ。21H2/22H2が来月強制的に23H2へ(9/14)
https://gazlog.jp/entry/windows11-auto-update-to-23h2/

日本銀行 決済システムレポート（2024年9月）(2024.09.10)(9/14)
http://maruyama-mitsuhiko.cocolog-nifty.com/security/2024/09/post-0c1543.html

韓国スタートアップが手掛ける次世代の顧客管理…電子文書で安全・スマートに(9/14)
https://www.afpbb.com/articles/-/3538742?cx_part=top_category&cx_position=2

パスワードマネージャーの重要性とそのセキュリティ効果とは？
https://cybersecurity-park.com/2952/

スクフェス三河2024_自己組織的なチームから空虚なチームへ変貌させた３カ月の組織運営からの教訓(9/14)
https://www.docswell.com/s/Insurtech-lab/Z222YV-2024-09-14-103304

サイバーセキュリティ専門の人材が引っ張りだこに　中国の高等教育機関626校が学科設置(9/14)
http://j.people.com.cn/n3/2024/0914/c94475-20219825.html

次世代技術の展望を探る ＹＲＰで公開講演 落合陽一氏が登壇　横須賀市・三浦市(9/14)
https://nordot.app/1207492040590852499

“QRコードを使った詐欺”が増加中 専門家が注意を促す3つのパターンとは 対策は「安易に読み込まない」(9/13)
https://news.yahoo.co.jp/articles/bf3d0a08eaba8f8ba3a6ad82e8ebe6daef070ee3?source=rss

「マイナポータルに繋ぎすぎ」「悪用されても政府の責任ない」河野太郎、マッチングアプリとマイナ連携方針に国民の疑問続出(9/14)
https://news.yahoo.co.jp/articles/1c3c7fd76bf328fb1dfa846727da0ac97650d297

「サイバー攻撃の脅威」を伝える広告が「無害そうで草」　“攻撃を受けた”っぽい雰囲気だけど……実は凶悪なコードかも？(9/14)
https://news.yahoo.co.jp/articles/ade050961efe4c0dcfea279b298edc073a2b88f2?source=rss

hadolintを使ってDockerfileをベストプラクティスに沿った状態に保つ(9/14)
https://zenn.dev/yskn_sid25/articles/caf5d26ae8a743

7日間でハッキングをはじめる本をやってみた(9/14)
https://zenn.dev/anri99103/articles/e22ecab6512be5

フロッピーディスクはどのようにしてコピーを防いでいたか？(9/14)
https://gigazine.net/news/20240914-floppy-copy-protection/

米国 NIST IR 8425A 一般消費者向けルーター製品に推奨されるサイバーセキュリティ要件 (2024.09.10)(9/14)
http://maruyama-mitsuhiko.cocolog-nifty.com/security/2024/09/post-8dbf21.html

文化財を紹介するWEBサイトで文化財所有者の個人情報63人分が漏えい　職員が気づいて30分後に削除【長野市】(9/14)
https://news.yahoo.co.jp/articles/cebebd50235196590fdb117e595eaf186ed7715a?source=rss

米国 NIST IR 8459 NIST SP 800-38シリーズにおけるブロック暗号利用モードに関する報告書 (2024.09.10)(9/14)
http://maruyama-mitsuhiko.cocolog-nifty.com/security/2024/09/post-2fa47d.html

欧州委員会 データ法に関するFAQ (2024.09.06)(9/14)
http://maruyama-mitsuhiko.cocolog-nifty.com/security/2024/09/post-e556d6.html

DroidKaigi 2024 9月12日資料一覧(9/14)
https://qiita.com/sacred-sanctuary/items/6b50f507011d54f163ea

新たなマイナ紐付けミス大量発覚…自民総裁候補“神奈川コンビ”それでも「保険証廃止」強行で国民置き去り(9/14)
https://www.nikkan-gendai.com/articles/view/life/360596

iPhoneも来年対応！ スマホの新しい使い道「スマホ用電子証明書搭載サービス」とは？(9/14)
https://kakakumag.com/pc-smartphone/?id=21278

便利さの裏にリスクも　「マイナ免許証」のメリットとデメリット(9/15)
https://www.epochtimes.jp/2024/09/251296.html
ユーザーと組織が共有するフォルダーの設計：組織ビデオホルダーの最適な拡張

ユーザーと組織が共有するフォルダーの設計：組織ビデオホルダーの最適な拡張

### はじめに
前回の記事では、「フォルダー」から「オーガニゼーションビデオホルダー」への命名変更について提案しました。今回は、その設計を踏まえ、ユーザーと組織がどのようにフォルダーを作成・共有できるかについて深掘りしていきます。

この記事では、組織とユーザーがフォルダーを通じてビデオを管理する設計を考え、最適な方法を提示します。特に、フォルダーが中間テーブルとして機能しつつも、ユーザーがフォルダーを作成できるようにするための設計案について詳しく見ていきます。

### 現在の状況
前回の記事では、folders テーブルを organization_video_holders という名前に変更する提案を行いました。これにより、フォルダーが組織がビデオを管理するための中間テーブルであることを明確にしました。

しかし、次の問題が浮かび上がってきました。

・ユーザーがフォルダーを作成できない
・組織とユーザーの関係性が複雑になっている
・そこで、今回はこれらの問題に対応するために、以下の2つの設計案を提示します。

#### 設計案1: 組織とユーザーのフォルダーを分離
この設計では、組織のフォルダーとユーザーのフォルダーを完全に分離します。具体的には、organization_video_holders テーブルに user_id を追加し、ユーザー専用のフォルダーも作成できるようにします。

### テーブル設計
```ruby
# migration to add user_id to organization_video_holders
class AddUserIdToOrganizationVideoHolders < ActiveRecord::Migration[6.0]
  def change
    add_reference :organization_video_holders, :user, foreign_key: true
  end
end
```

この設計では、organization_id と user_id のどちらか一方に値が入ることで、フォルダーが「組織専用」か「ユーザー専用」かを区別します。これにより、シンプルな管理が可能となり、保守性が向上します。

### メリット
・シンプルさ: フォルダーの所有者が明確で、組織とユーザーのフォルダーが完全に分離されるため、複雑なアクセス制御の必要がありません。
・保守が容易: 明確に所有者が定義されているため、データの操作や保守が簡単になります。

### デメリット
・共有フォルダーが難しい: ユーザーと組織がフォルダーを共有できないため、共有フォルダーのニーズがある場合にはこの設計では不十分です。

### 設計案2: フォルダーの共有を可能にする
次に、組織とユーザーがフォルダーを共有できる設計を提案します。この場合、組織とユーザーが同じフォルダーにアクセスする可能性があるため、フォルダーのアクセス権を管理する中間テーブルを追加します。

### テーブル設計
##### organization_video_holders テーブル
```ruby
# migration to add user_id and organization_id to organization_video_holders
class AddUserIdAndOrganizationIdToOrganizationVideoHolders < ActiveRecord::Migration[6.0]
  def change
    add_reference :organization_video_holders, :user, foreign_key: true
    add_reference :organization_video_holders, :organization, foreign_key: true
  end
end
```
##### folder_accesses テーブル

```ruby
# migration to create folder_accesses table
class CreateFolderAccesses < ActiveRecord::Migration[6.0]
  def change
    create_table :folder_accesses do |t|
      t.references :organization_video_holder, foreign_key: true
      t.references :user, foreign_key: true
      t.references :organization, foreign_key: true
      t.timestamps
    end
  end
end
```

この設計では、folder_accesses テーブルを使って、フォルダーへのアクセス権を管理します。これにより、組織とユーザーが同じフォルダーを共有でき、柔軟なアクセス管理が可能になります。

### メリット
・柔軟な共有: 組織とユーザーが同じフォルダーを共有できるため、プロジェクトやチームでの協力が促進されます。
・詳細なアクセス管理: folder_accesses テーブルを使うことで、フォルダーごとに詳細なアクセス権限を設定できます。

### デメリット
・複雑な管理: アクセス権を管理するためのロジックが増えるため、シンプルさを犠牲にすることになります。

### おすすめの設計
プロジェクトの要件次第ではありますが、より柔軟な設計が求められる場合には「設計案2」をおすすめします。理由は次の通りです。

組織とユーザーが協力してビデオを管理するシナリオがある場合、共有フォルダーの設計が柔軟である方が適しています。
folder_accesses テーブルを使うことで、アクセス管理の柔軟性が高まり、将来的な拡張も容易です。
ただし、シンプルさを求める場合は、設計案1の方が実装や保守が簡単なので、プロジェクトの規模や要件に応じて判断すると良いでしょう。

## 結論
今回の記事では、ユーザーがフォルダーを作成する場合や、組織とユーザーがフォルダーを共有する設計について考察しました。

・設計案1: 組織とユーザーのフォルダーを分離し、シンプルな管理を実現
・設計案2: フォルダーを共有可能にし、柔軟なアクセス管理を提供
どちらの設計も一長一短がありますが、プロジェクトの要件に応じて、どちらを採用するかを検討してみてください。共有が必要でない場合はシンプルな設計案1が有効ですが、将来的な拡張性やチームでの協力を考慮するなら設計案2がベストです。
AHC 037 参加録(遅刻、バーチャル)

# AHC037に参加()しました！
- 遅刻したのでバーチャル参加

# 結果(本参加していたらの順位)
- 173rd / 922

![スクリーンショット 2024-09-16 032355.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3292016/c0080c79-9cc5-3b8c-f5fa-a2c9f0e3900a.png)
![スクリーンショット 2024-09-16 032411.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3292016/7a432a1b-f0e0-0385-7bb8-02d9ab736ee2.png)

# 考察
- それぞれの点を独立して原点からつなげるのは効率が悪い
    - コストを考えると全体的に二分木を構築すると効率がよさそう
- それぞれの点と近い点を辺の先とする頂点を決める必要がある
    - x,y軸において小さい座標をそれぞれ組み合わせた点を頂点とする
    - これを繰り返すといい感じに繋げられそう
- つなげ方は現在存在している頂点に一番近い頂点を選ぶ
- 一部無駄なつなげ方をする挙動が見られたので対策として軸付近に頂点を存在させておく

- ![vis.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3292016/8e14a615-11b1-b78b-7a03-a560feddc2fd.gif)


# 感想
- 結構面白かったけれど、もう少し詰めれる知識がなかったのが悔やまれる
- ヒューリスティックに参加はしているけれど、ちょくちょく参加を逃す時に限って相性の良い問題が出てきたりしてて悲しい
データベース設計の最適化: フォルダーからオーガニゼーションビデオホルダーへの進化



### はじめに
この記事では、データベース設計の中で重要な「命名規則」や「中間テーブル」の役割に関する最適化について解説します。特に、組織（オーガニゼーション）がビデオを管理するための中間テーブルとして「フォルダー」という名前を使用していた状況から、より明確で適切な命名に変更するまでのプロセスを紹介します。

### 現在のデータベース設計の課題
まずは、現在のデータベース設計における問題点を見ていきます。特にフォルダー（folders テーブル）という名前が持つ曖昧さが、理解を難しくしている点について指摘します。

### 問題点
命名の曖昧さ: 現在、組織がビデオを管理するための中間テーブルとして「フォルダー」という名前が使われています。しかし、「フォルダー」という名前はそのテーブルの役割を正確に反映していません。フォルダーは一般的にファイルの整理を連想させますが、実際には組織がビデオを管理するためのリンクを提供する役割を果たしています。

### 構造の複雑さ
ビデオ管理の際に「ビデオフォルダー」という別の中間テーブルも存在しており、これらの関係が理解しづらいという問題があります。命名がもっと具体的であれば、関係性が一目でわかるようになるでしょう。

### 現在のテーブル構造
```ruby
organizations
  ├─ folders
  │    └─ video_folders
  │         └─ videos
  ```
folders テーブルが中間テーブルとして使われているものの、その名前が役割を反映しておらず、理解しづらくなっています。

### 改善提案: 「フォルダー」から「オーガニゼーションビデオホルダー」へ

### 提案内容
フォルダー（folders テーブル）は、組織がビデオを管理するための中間テーブルとして使われています。そのため、このテーブルの役割をより明確にするために、名前を「オーガニゼーションビデオホルダー」に変更することを提案します。

### 変更前
```ruby
organizations
  ├─ folders
      └─ video_folders
          └─ videos
```

### 変更後
```ruby
organizations
  ├─ organization_video_holders
      └─ video_folders
          └─ videos
```

### 新しい命名によるメリット
役割が明確になる: 「organization_video_holder」という名前を使うことで、テーブルが中間テーブルとしての役割を果たしていることが一目で分かるようになります。

保守性の向上: 開発者がこのテーブルの目的をすぐに理解できるようになり、将来の保守や拡張が容易になります。

命名規則の一貫性: 名前がテーブルの役割を反映しているため、コードベース全体で命名規則の一貫性が保たれます。これにより、コードの可読性が向上します。

### 変更に伴うマイグレーション例
もしRailsでこれを実装するなら、以下のようなマイグレーションを追加して、テーブル名を変更することができます。

```ruby
# migration to rename folders to organization_video_holders
class RenameFoldersToOrganizationVideoHolders < ActiveRecord::Migration[6.0]
  def change
    rename_table :folders, :organization_video_holders
  end
end
これにより、 folders テーブルは organization_video_holders という名前に変更されます。
```

### 新しいテーブル構造
新しいテーブル構造は以下のようになります：

```
organizations
  ├─ organization_video_holders
      └─ video_folders
          └─ videos
このように、中間テーブルの役割が明確になり、コードやデータベース設計を読む際の混乱が少なくなります。

ユーザーとフォルダーの関係（拡張案）
現時点では、ユーザーは直接フォルダーを作成できません。しかし、もしユーザーが自分のフォルダーを作成できるようにする場合、以下のように user_id を organization_video_holders テーブルに追加することで、ユーザー単位でフォルダーを管理できるようになります。

```
```ruby
# migration to add user_id to organization_video_holders
class AddUserIdToOrganizationVideoHolders < ActiveRecord::Migration[6.0]
  def change
    add_reference :organization_video_holders, :user, foreign_key: true
  end
end
```
これにより、組織だけでなくユーザーもビデオ管理に直接関与できるようになります。
しかし、その場合、組織とuserが混ざる可能性も否定できません。どう設計するのがベストなのかをディスカッションしたいです。
## 結論
データベース設計では、命名規則が非常に重要です。テーブル名がその役割を正確に反映していれば、開発者はよりスムーズに設計を理解し、システム全体の保守性が向上します。

この記事では、「フォルダー」という曖昧な名前を「オーガニゼーションビデオホルダー」に変更することで、データベースの設計をより直感的に、わかりやすくする方法を提案しました。このような名前変更によって、複雑なシステムの理解が格段にしやすくなるはずです。
[Service Management] サービス・ポートフォリオ

# 一覧
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2955010/5175089a-c2e1-c9aa-e078-60cd3f2b288b.png)

# 参考リンク
- [令和3春56](https://www.ap-siken.com/kakomon/03_haru/q56.html)
- [令和元秋55](https://www.ap-siken.com/kakomon/01_aki/q55.html)
【初心者向け】OpenCV.js導入→詰まったこと

## はじめに

こんばんわ！
まだまだ暑い日が続きますね。
未だに半袖と半ズボンスタイルを貫いています:sunglasses:
初心者プログラマーのジンです！

今日は作りたいプロダクトにOpenCV.jsを
使ってみて詰まったことなどを共有したいです。
よければ見ていただけると嬉しいです！

## OpenCVって？？

**OpenCV**（Open Source Computer Vision Library）は、画像処理やコンピュータビジョンに特化したライブラリです。PythonやC++、Javaなどで利用でき、主に**画像認識、物体検出、顔検出、画像変換、特徴量抽出、動画解析**などのさまざまなタスクに対応しています。特に、機械学習やAIアプリケーションで画像データを処理する際に非常に役立ちます。無料です！

## 導入まで（事前説明）
今回Reactプロダクトで、
写真に写っているあれは何㎝のものなのか。などをわかるようにするアプリを作っています。

基準となる千円札を目的物と一緒に写真を撮り
「千円札がこう歪んでるから同じ平行線上にある目的物はこれくらいの長さ。」
を計算させるのが目的です。
平面で写真を撮れるものであればもっと簡単だったのですが、ほとんどの写真は斜めであったり立体に考える必要があると思いましたのでOpenCV内のパース補正という機能を使って奥行を計算しています。

## 導入途中
今回フロントで作成していたので、
サーバーサイドの技術は考えていなかったのですが、
文献調べると、
Python　＋　OpenCVや
C++　+　OpenCVなど
サーバー言語との組み合わせ文献が多い。

しかし
なにやらブラウザで読み込める
**OpenCV.js**があるとのこと。

https://docs.opencv.org/4.x/d0/d84/tutorial_js_usage.html

バージョンもあるので最新は上記公式ドキュメント確認してください。

Web上で読み込むだけで使えます！
が、、、、
下に続く。

## 結果（詰み→解決策）
結果として機能を作り、いざ試してみたのですが、
立体で空間を
把握する機能だからか、
計測すると**画面がフリーズ**してしまいました。

よくよく調べるとパース補正計算時**画像のピクセルでの計算**をしているので
画質のいい写真であればあるほど、
複雑な計算がいる様子。

しかしこのアプリを使うとしたら、
携帯で撮った写真がほぼ占めると思ったので、
諦められませんでした。

色々試行錯誤していきついた結果、
**APIとしてPython**を使用し、
**OpenCV.jsではなく普通のOpenCV**として

Python上で計算させると、
画面もフリーズせず期待通りの結果が出ました。

事例を伝えたかったので今回コードは長くなるので省略します。

## 最後に
Web上で簡単に読み込めるOpenCV.jsは
簡単な計算であれば実装できそうですが、
立体での奥行きも含めた画像処理などをさせようとすると重いみたいですね。
苦手だからと逃げず、
おとなしくサーバー言語でAPIを作れ。
そう身にしみた経験でした。

同じようにフリーズして試行錯誤している方に届くとうれしいです！
SQL初歩の初歩


# SQL入門

こんにちは、今回は、データベースと対話するための言語「SQL (Structured Query Language)」の初歩の初歩についてです。SQLは、データの検索、追加、更新、削除など、データベース操作に必須のスキルです。この記事では、基本的なSQL文法を中心に、簡単なクエリの書き方を紹介していきます。記事作成の練習も踏まえた初投稿なのでお手柔らかに。

## 1. SQLとは？

SQLは、関係データベース（リレーショナルデータベース、RDB）を操作するための言語です。関係データベース（リレーショナルデータベース、RDB）は、データを「テーブル（表）」の形式で管理するデータベースの一種です。各テーブルは行と列から構成され、行はデータのレコードを、列はデータの属性（フィールド）を表します。データベースは、SQLを使ってそのデータを操作します。例えば、以下のようなテーブルがあります。

| id  | name   | age |
| --- | ------ | --- |
| 1   | Alice  | 25  |
| 2   | Bob    | 30  |
| 3   | Charlie| 22  |

今回は、このテーブルを使ってSQLの基本的な操作を説明していきます。

## 2. 基本的なSQLクエリ

### SELECT文 (データの取得)
データベースからデータを取得するために使うのが `SELECT` 文です。例えば、全てのユーザーの名前を取得するクエリは以下の通りです。テーブルから何かしらデータを取り出すにはまず `SELECT` から始まります。慣れないうちは文末の `:`を忘れがちなので注意です。 

```sql
SELECT 
    name 
FROM 
    users;
```

すべての列を取得する場合は `*` を使います。

```sql
SELECT 
    * 
FROM 
    users;
```

### WHERE句 (条件付き検索)
条件を指定してデータを取得する場合は、 `WHERE` 句を使用します。例えば、30歳以上のユーザーを取得する場合は次のように書きます。

```sql
SELECT 
    * 
FROM 
    users 
WHERE 
    age >= 30;
```

### INSERT文 (データの追加)
新しいデータをテーブルに挿入するには、 `INSERT INTO` 文を使います。例えば、新しいユーザーを追加するには以下のように書きます。

```sql
INSERT INTO 
    users (name, age) 
VALUES 
    ('David', 28);
```
文字列は`''`でくくります。

### UPDATE文 (データの更新)
既存のデータを更新するには、 `UPDATE` 文を使用します。例えば、Aliceの年齢を26歳に更新する場合は次のようにします。

```sql
UPDATE 
    users 
SET 
    age = 26 
WHERE 
    name = 'Alice';
```

### DELETE文 (データの削除)
データを削除するには `DELETE` 文を使います。例えば、Bobのデータを削除するには次のクエリを書きます。

```sql
DELETE FROM 
    users 
WHERE 
    name = 'Bob';
```

## 3. SQLの実行順序

SQLクエリは、書かれた順に実行されるわけではありません。以下の順序で実行されます。

1. `FROM`: まずはテーブルを指定します。
2. `WHERE`: 次に条件を適用してデータを絞り込みます。
3. `SELECT`: 最後に、必要な列を選択します。

この実行順序を理解すると、SQLクエリの動作がより明確になります。

## 4. よく使うSQL関数

SQLには、~~便利な~~関数がいくつか用意されています。ここでは、いくつかよく使われる関数を紹介します。

- `COUNT()`: レコードの数を数えます。
    ```sql
    SELECT 
        COUNT(*) 
    FROM 
        users;
    ```

- `AVG()`: 平均値を計算します。
    ```sql
    SELECT 
        AVG(age) 
    FROM 
        users;
    ```

- `MAX()`, `MIN()`: 最大値、最小値を取得します。
    ```sql
    SELECT 
        MAX(age) 
    FROM 
        users;
    ```

- `SUM()`: 合計値を計算します。
    ```sql
    SELECT 
        SUM(age) 
    FROM 
        users;
    ```

## 5. まとめ

この記事では、SQLの初歩についてまとめました。
今回紹介した`SELECT`、`INSERT`、`UPDATE`、`DELETE`は4大命令と言われていますが、データ分析業務を行う人はこの4つの中で`SELECT`しかほぼ使用しません。慣れてくると、より複雑なクエリを書けるようになりますので、ぜひ手を動かして実際に試してみてください。

次回は、テーブルの結合（JOIN）、サブクエリといったより高度なSQLの使い方や、PythonからのSQLite操作方法について紹介します。
[Industrial Engineering] 作業測定手法

# 一覧
|||
|:--|:--|
|ワークサンプリング法|観測回数、時刻を予め設定して瞬間的な観測を行う<br>統計的理論に基づいて作業時間を見積もる|
|PTS法|Predetermined Time Standard<br>作業を基本動作に分解する|
|ストップウォッチ法|ストップウォッチで作業時間を測定する|



# 参考リンク
- [令和元秋78](https://www.ap-siken.com/kakomon/01_aki/q75.html)
ApacheのForward ProxyでHTTPSの特定サイトへのアクセスのみを許可する設定の注意点

ApacheでForward Proxyを構築し、HTTPSの特定サイトのみへのアクセスを許可する場合、Proxyディレクティブでは、URLではなくホスト名（FQDN）を指定する必要があります。

例えば、`https://abc.example-20240915.org/path/`へのアクセスのみを許可するForward Proxyを構築したいとします。

正しい設定は以下になります。FQDNしか指定できないため、「/path/」といった特定パスに限定することはできません。

```
# 正しい設定
<Proxy abc.example-20240915.org>
  Require all granted
</Proxy>
```


また、以下は全て誤りになります。

```
# URLを指定している
<Proxy https://abc.example-20240915.org/>
  Require all granted
</Proxy>

# パスを含めてしまっている
<Proxy abc.example-20240915.org/path/>
  Require all granted
</Proxy>
```
GitHub Actionsをローカル実行できるactについて簡易解説

## 概要
Github Actionを構築する際のymlファイル作成の段階で修正の都度、特定のブランチに対してトリガーを発動させて、対象のサーバーに対してデプロイを繰り返して試行錯誤したりしていないだろうか？

その作業がローカルでできてしまうといういうのがactの最大のメリットだと考える。

もちろん、これから解説するactだけでなく、
gfコマンドのインストールなども必要だったり、Githubの認証が場合によってはSSOで少しめんどかったり（所感）などはあるかもしれないが、
上記は割愛したい。

また、自身はGithub Actionに関しては精通しているわけではなく、
学習した防備録として記載する形なので、そちらも了承をお願いしたい。

では本編を始めたいと思う。

## actとは
GitHub Actionsのワークフローファイル（*.yml）をローカル環境で実行し、GitHub Actionsの動作をテストするツールである。

作成したワークフローをローカルで実行できるツールというところがポイント。

GitHub ActionsのCI/CDパイプラインをローカル環境でテストするための便利なツールであり、次のような特徴とメリットがある。

Dockerコンテナを利用して、実際のGitHub Actionsの実行環境をローカルに再現する。これにより、CI/CDパイプラインの修正やデバッグを迅速に行うことができる。

***→検証環境などに直に試すということがなくなるので、時間の短縮や予期せぬ不都合を回避しやすい。***

### メリット
***迅速なフィードバック***
ワークフローの変更や修正をローカルで即座にテストできるため、GitHubにプッシュする前に問題を特定しやすくなる。

***コスト削減***
GitHub Actionsの実行が頻繁に発生する場合、ローカルでのテストにより、GitHubの実行リソースやランナーの利用コストを削減できる。

***デバッグの容易さ***
ローカル環境でのテストは、ネットワークの遅延やGitHub Actionsの制約に影響されず、問題のトラブルシューティングが行いやすい。

***環境の再現性***
Dockerを使用するため、GitHub Actionsの実行環境をローカルで再現し、一貫性のあるテストが可能である。

## 導入方法
#### actのインストール
actは、さまざまなプラットフォーム（Linux、macOS、Windows）で利用可能である。以下の手順でインストールできる。

### macOS / Linux
Homebrewを使ってインストールする場合：

```
brew install act
```
### Windows
Chocolateyを使ってインストールする場合：
```
choco install act-cli
```

### その他の方法
GitHubのリリースページからバイナリをダウンロードし、
パスを通すことでもインストールできる。
***リリースページのURLは、GitHub Releasesで確認できる。***

### リポジトリの設定
actを使うには、GitHub Actionsのワークフローファイルがリポジトリに存在する必要がある。

リポジトリのルートに.github/workflowsディレクトリがあり、その中に[*.yml]ファイルが含まれていることを確認する。

実際、***新規で作成する場合***は上記のディレクトリ下の
***【独自名称可】.yml***
を作成して、CI/DCを構築していくことになる。

### ローカル実行
ワークフローをローカルで実行するには、以下のコマンドを使用する：
```
act
```
特定のイベントやジョブを指定して実行することもできる：
```
act push
act -j <job_id>
```
#### オプションの設定
actには、さまざまなオプションがある。
例えば、Dockerのコンテナイメージを指定したり、
GitHubのイベントのシミュレーションを行ったりすることができる。

詳細なオプションは
```
act --help
```
で確認できる。

## まとめ
actを導入することで、GitHub Actionsのワークフローをローカルで効率よくテストできるようになる。
これにより、CI/CDパイプラインの品質を向上させることができる。

また、実験的に簡単に動かすことができるリポジトリは下記で、
使用感などをまずは体験してみるといいかもしれない。

https://github.com/nektos/act

また、今回はactの紹介ということで、github/workflowsディレクトリ内の
[*.yml]ファイルの書き方などには全く触れていないが、

むしろCI/CDとしてのGitHub Actionの業務として一番面白いところは、
***そこ***だと思うので、自身でサービスをデプロイしていてかつリリース作業を手動で行っているという人は、

是非取り入れて自動化してみるのはいかがだろか？
OpenAI o1：LLMにより深い思考能力を与えた

## 1. モデルの背景と動機

OpenAI o1 は、科学、プログラミング、数学などの複雑なタスクにおいて、推論能力を強化し、より多くの時間をかけて問題を解決できる全く新しいシリーズの AI モデルです。o1 の命名規則は、従来の OpenAI モデルとは異なり、従来シリーズとの差別化を示しています。GPT-3 や GPT-4 シリーズが自然言語処理に重点を置いていたのに対し、OpenAI o1 は主に推論能力の最適化を目指しており、この命名規則はモデルの目標やアーキテクチャが全く新しい方向性であることを示唆しています。

### OpenAIのレポートにある興味深い実験結果
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006814/10460d77-14e7-948b-0e73-da7a980302d8.png)

上記の結果は、トレーニング時もテスト時も、計算量を増やすことでモデルの正確性が効果的に向上することを示しています。o1 モデルは、複雑な問題に取り組む際に、より長い時間をかけて思考することで、より良い結果を得ることができるのです。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006814/5d2215d1-d5ae-d0b0-d819-fcf076268a8f.png)

o1 モデルは、数学、物理、論理推論、学術試験などの複数のベンチマークテストで顕著な向上を示しており、特に GPT-4o よりも優れた成績を収めています。また、o1 は博士レベルの科学的問題（GPQA Diamond など）でも強力な推論能力を発揮し、特に物理や化学分野で卓越した結果を示しています。さらに、o1 は AP や SAT などの標準化試験でも明確な進歩を遂げており、学術的および複雑なタスクにおける広範な応用可能性を示しています。

## 2. **思考の連鎖**（CoT）
**思考の連鎖（CoT, Chain of Thought）** とは、大規模なモデルが複雑な問題を段階的に複数のサブ問題に分解し、それを一歩ずつ解決する推論プロセスを指します。CoT の特徴は以下の通りです：

- **エラー分析とデバッグ**：CoT はモデルの推論プロセスを観察するための窓を提供し、モデルがなぜ誤りを犯すのかを分析し、デバッグする機会を提供します。
- **Zero-shot / Few-shot**：これらの違いは、問題解決の手順例を提供するかどうかにあります。

なお、CoT の概念は「[Chain-of-Thought Prompting Elicits Reasoning in Large Language Models](https://proceedings.neurips.cc/paper_files/paper/2022/file/9d5609613524ecf4f15af0f7b31abca4-Paper-Conference.pdf)」という論文で最初に提唱され、Zero-shot CoT は「[Large Language Models are Zero-Shot Reasoners](https://arxiv.org/pdf/2205.11916)」という論文で初めて紹介されました。

### 強化学習とCoT

OpenAIが公開した記事「[Learning to Reason with LLMs](https://openai.com/index/learning-to-reason-with-llms/)」では、o1モデルが強化学習（RL）を通じて、思考の連鎖（Chain of Thought）を効果的に活用して問題を推論する方法を学ぶことが言及されています。RLを通じて、モデルは推論過程に関するフィードバックを受け取り、それに基づいて推論戦略を徐々に最適化していきます。

## 3. デメリット

OpenAI o1モデルは推論能力において顕著な向上を示している一方で、いくつかの欠点も存在します。まず、各出力には不可視の **Reasoning Token**が含まれているため、推論時間や計算リソースの増加を引き起こします。このため、OpenAI は `max_completion_tokens` パラメーターを導入しました。これは従来の `max_tokens` と区別され、生成される推論および回答に使用されるトークンの総数を制御するためのものです。

下図は、モデルの思考と推論のプロセスを示しています。

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006814/91785563-e8b5-1bf4-40ba-e1feb670a3e7.png)

さらに、OpenAIの公式ドキュメントから、o1モデルは複雑なプロンプトエンジニアリングには適していません。特に、few-shotプロンプトやモデルに逐次的に思考させるような指示を使用すると、性能が向上しないばかりか、逆に悪影響を及ぼす可能性があります。このモデルは、シンプルで明確なプロンプトに適しており、過度な誘導や複雑なコンテキストは推論プロセスに影響を与える可能性があります。

## 4. **GPTモデルとの比較と適用シーン**

| 特徴 | GPT モデル | OpenAI o1 モデル |
| --- | --- | --- |
| **主なタスク** | 自然言語処理と生成タスク（例：テキスト生成、対話、翻訳など） | 複雑な推論タスク（例：数学の問題解決、プログラミング、科学的推論） |
| **推論能力** | 強力だが、複雑な多段階推論では限界がある | 高度に最適化され、複雑な問題の多段階推論に特に優れている |
| **時間と計算コスト** | 高速で、計算コストは比較的低い | 複雑な問題の回答生成にはより多くの時間と計算リソースが必要 |
| **プロンプト設計** | few-shot プロンプトや複雑なプロンプトで性能を向上できる | シンプルで明確なプロンプトに最適、複雑なプロンプトは性能を低下させる可能性がある |
| **適用シーン** | 日常対話、テキスト生成、Q&A などの一般的なタスク | 数学の問題解決、プログラミング、科学的推論、論理推論 |

以上の情報により、OpenAI o1 は推論能力における GPT モデルの拡張に近く、強力な推論能力が GPT モデルと組み合わさることで、より複雑な生成タスクに適用できるようになっています。

## 5. **将来には**

CoTと同様に、Promptの自動生成に基づく代表的なプロジェクトには、ToT、GoT、AoTなどがあります。Promptエンジニアリングは、効率と自動化を向上させることで、複雑なタスクの解決を迅速に進めることができます。しかし、長期的には、モデル自体の推論能力の向上が鍵となり、大規模モデルがより複雑なシナリオで優れたパフォーマンスを発揮できるようになり、推論を誘導するために過度にPromptに依存する必要がなくなるではないかと考えています。
titanicの生存をbiplotで可視化

前回までの内容

https://qiita.com/murasaki1994/items/0e1148f1b16a4d76a599

ここからbiplotを使ってどういうデータ構造になっているか生存の色付けとともに確認します。
```Python3
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
def biplot_spv(df, y):
    for col in df.columns:
        df[col] = (df[col] - df[col].mean()) / df[col].std()
    model = PCA()
    model.fit(df)
    df_pc = model.transform(df)
    com = model.components_
    evr = model.explained_variance_ratio_
    fac = []
    for i in range(len(evr)):
        fac.append(np.sqrt(model.explained_variance_ratio_)[i] * model.components_[i])
    fig, ax1 = plt.subplots()
    ax2 = ax1.twinx()
    ax2.scatter(df_pc[:, 0], df_pc[:, 1], cmap="brg", c=y, marker="x")
    ax3 = ax1.twiny()
    ylim = [abs(max(fac[1])), abs(min(fac[1]))]
    xlim = [abs(max(fac[0])), abs(min(fac[0]))]
    for i in range(len(df.columns)):
        ax3.plot([0, fac[0][i]], [0, fac[1][i]], color="#FF0000")
        ax3.text(fac[0][i], fac[1][i], df.columns[i])
    ax3.set_xlim(-max(xlim), max(xlim))
    ax3.set_ylim(-max(ylim), max(ylim))
    plt.show()
```
```Python3
biplot_spv(x2, y)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/a43b5ea9-2e67-7675-9ca3-35d8c5140cf9.png)

この結果から分かることとして男性より女性の方が生き残りやすく、年齢は低い方が男性でも生き残りやすい(家族の子供か？)。また、敬称ではMrsの方がMissよりベクトルからは生き残り安いことがわかる(既婚者だから家族持ち？)。
そのほかにも解釈は色々あると思いますが簡単にわかる解釈ではこのくらいは簡単に見つかるのではないかと考えます。
あとEmbarkedがCの人は生き残値やすいみたいですね。
いずれにしても映画のタイタニック未視聴者だと前情報よくわからないので見てからだと何か違うかもしれませんね。
Cloud-Based Web Application Architecture: AWS and Azure Services Mapping（クラウドベースのウェブアプリケーションアーキテクチャ: AWSとAzureのサービス対応表）

この記事では、図を通じて、AWSとAzureそれぞれのクラウドプラットフォームにおける同等のサービスを視覚的に比較します。


#### 1. 全体概要
AWSとAzureは共に、スケーラブルで信頼性の高いクラウドサービスを提供しますが、サービスの名称や操作方法に若干の違いがあります。企業がクラウドプロバイダを変更する際には、対応するサービスを正確に把握し、移行をスムーズに行うことが重要です。

以下の図は、AWSで使用される主要なサービスと、それに対応するAzureのサービスを対比したものです。

#### 2. AWSのアーキテクチャ
図1は、AWSを利用したウェブアプリケーションの典型的なアーキテクチャを示しています。
図1：AWSベースのウェブアプリケーションアーキテクチャ  
![Deploy web application on AWS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1082021/dabef2cc-7b29-ae94-1849-a7899067b050.png)

- **ネットワーキング層**: VPC（仮想プライベートクラウド）を使用してセキュアなネットワーク環境を提供します。DNS管理はRoute 53、トラフィック管理にはElastic Load Balancerを使用しています。
- **バックエンド層**: EC2（仮想マシン）、Lambda（サーバーレス）、ECSやEKS（コンテナサービス）を利用して、スケーラブルなバックエンドを構築します。
- **データベース層**: RDS（リレーショナルデータベース）、Aurora、DynamoDB（NoSQL）を使用してデータ管理を行います。
- **CICDパイプライン**: CodeCommit、CodeBuild、CodeDeploy、CodePipelineを使って、継続的インテグレーションとデプロイのワークフローを自動化します。
- **イベントコーディネーション**: SNS（通知サービス）、SQS（メッセージキューサービス）、EventBridge、Step Functionsを使って、イベント駆動型アーキテクチャをサポートします。

#### 3. Azureのアーキテクチャ
図2は、AWSアーキテクチャをAzureに置き換えた場合の対応するサービスを示しています。

図2：Azureベースのウェブアプリケーションアーキテクチャ
![Deploy web application on Azure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1082021/b386d4fa-dd8a-eacd-a38a-3cebff92c72b.png)
- **ネットワーキング層**: Azure Virtual Networkを使用してネットワークを構築し、DNS管理にはAzure DNS、トラフィック管理にはApplication Gatewayを使用します。
- **バックエンド層**: Azure Virtual Machines、Function Apps、Azure Kubernetes Service（AKS）、およびContainer Instancesを利用して、バックエンドを実現します。
- **データベース層**: Azure SQL Database、Azure Cache for Redis、Cosmos DB（NoSQL）を使用してデータを管理します。
- **CICDパイプライン**: Azure Repos、Azure Pipelinesを使用して、CI/CDの自動化を行います。
- **イベントコーディネーション**: Azure Notification Hubs、Service Bus、Event Grid、Logic Appsを使って、イベント駆動型のシステムを構築します。

#### 4. サービスの対応表
| AWSサービス                 | Azureサービス                  |
|-----------------------------|-------------------------------|
| VPC                         | Azure Virtual Network (VNet)   |
| Route 53                    | Azure DNS                     |
| Elastic Load Balancer        | Azure Application Gateway      |
| EC2                         | Azure Virtual Machines         |
| Lambda                      | Azure Functions                |
| ECS / EKS                   | Azure Kubernetes Service (AKS) |
| RDS / Aurora                | Azure SQL Database             |
| DynamoDB                    | Azure Cosmos DB                |
| ElastiCache                 | Azure Cache for Redis          |
| SNS                         | Azure Notification Hubs        |
| SQS                         | Azure Queue Storage / Service Bus |
| EventBridge                 | Azure Event Grid               |
| Step Functions              | Azure Logic Apps               |
| CodeCommit                  | Azure Repos                    |
| CodeBuild                   | Azure Pipelines                |
| CodeDeploy                  | Azure Pipelines                |
| CodePipeline                | Azure Pipelines                |

#### 5. 結論
AWSとAzureにはそれぞれ同等のサービスが存在し、企業がクラウドプラットフォームを移行する際には、これらの対応するサービスを正確に把握することが重要です。
[PostgreSQL]テンプレートとは、テンプレート確認方法

こんにちは！れーあです。
実は近々PostgreSQLを触ることができる案件に参画できそうな
雰囲気になってきたので最近勉強しています。

今回はそんなPostgreSQLのテンプレートについて
勉強した内容をまとめたいと思います。
なお、長くなりそうな気がしたので複数回にわけて投稿予定です。

それではどうぞ。

# そもそもテンプレートとは
英語の意味としては「ひな型」、「定型文」といったことになります。
PostgreSQLにおいてもテンプレートはそのような意味を持ち、
データベースを作るための「ひな型」として使用することができます。
また、新たにデータベースを作成した時点で
下記2つのテンプレートが自動生成されます。
　・template0
　・template1

# template0、template1の違い
それでは次に「template0」、「template1」の違いを見ていきましょう。
大きな違いとしてはテンプレートの中身を変更できるかできないかがあります。
template0は初期設定のデータベースの値が入っています。
つまり、テンプレートとして初期設定であるデータベースを
作成したい場合使用できます。
そうなると、初期設定が入ったテンプレートを使いたいという要件を維持するためにも
中身を変更するわけにはいかないため、変更はできないようになっています。

次に「template1」はどうでしょうか。
こちらは逆に変更可能であるテンプレートです。
例えば共通設定部分はテンプレート化して「template1」をベースに
データベースを作成した後、個別設定は各データベースで実施する
という使い方をしたいときに使用可能と思われます。

まとめると、
・データベース作成時点で「template0」、「template1」が
　　自動で作成される
・「template0」は変更できず、初期設定のみ入った
　　データベース作成に使用しやすい
・「template1」は変更できるため、共通設定を入れた
　　データベース作成に使用しやすい

ということになります。

# テンプレートの確認方法
では、実際どのように表示されるのか見てみたいと思います。

まず環境は下記です。
```
# OSのバージョン
[root@localhost ~]# cat /etc/redhat-release
Red Hat Enterprise Linux release 8.6 (Ootpa)

# PostgreSQLのバージョン
[root@localhost ~]# su - postgres
最終ログイン: 2024/09/15 (日) 04:08:59 PDT日時 pts/0
[postgres@localhost ~]$ psql --version
psql (PostgreSQL) 13.9
```
<br>

それでは確認していきます。
なお、あらかじめ「postgres」というデータベースを作成しています。
```SQL
-- データベースへログイン
$ psql -d postgres

-- テンプレートの確認
postgres=# SELECT datname, datistemplate FROM pg_database WHERE datistemplate = 'true' ;
  datname  | datistemplate
-----------+---------------
 template1 | t
 template0 | t
(2 rows)
```
<br>

上記はそれぞれ下記のような意味を持ちます。
|使用した句|項目名|説明|
|:---|:---|:---|
|SELECT句|datname|データベース名|
|SELECT句|datistemplate|テンプレートであるかの判定|
|FROM句|pg_database|使用可能なデータベース一覧|
|WHERE句|datistemplate = 'true'|テンプレートである対象を絞り込み|

その中で特に重要であったのが「datistemplate」です。
この設定により対象のデータベースがテンプレートとして使用可能なのか、
または使用不可なのかを判断します。
使用可能な場合は「t(true)」、使用不可な場合は「f(false)」と表示されます。

今回の場合、表示されている「template0」、「template1」ともに、
「datistemplate」の値は「t(true)」となっていましたので、両方とも
テンプレートとして使用可能と判断できます。


# おわりに
というわけで、今回はPostgreSQLにおけるテンプレートとはなにか、
テンプレートの確認方法について書きました。
次回も引き続きPostgreSQLのテンプレートのお話を書こうと思っています。
次はテンプレートの作成、削除、変更についてを予定しています。

それではまた。

# 参考
https://www.postgresql.jp/docs/13/manage-ag-templatedbs.html

https://www.postgresql.jp/docs/13/catalog-pg-database.html
「コード×AI」宇宙最速レビュー！生成AI時代のプログラミング教書

# ついに「生成AIコーディング」の本が出た！

今週9/17(木)、技術評論社より以下の書籍が発売予定です。

**コード×AI**
ーソフトウェア開発者のための生成AI実践入門
服部佑樹 著

https://gihyo.jp/book/2024/978-4-297-14484-5

大変ありがたいことに、こちらの書籍を発売前にご恵贈（献本）いただきましたので、簡単ですが宇宙最速で書評をアウトプットさせていただきます！

https://x.com/minorun365/status/1833799612890804499


# この本について

最近はGitHub Copilotをはじめ、プログラミングを支援する生成AIサービスが普及してきました。

本書はGitHub JapanにてCustomer Success Architectとして活躍されている服部さんが執筆された書籍ということで、発売前から話題になっています。

**本書の紹介文（公式サイトより）：**

> GitHub CopilotやChatGPTなど生成AIによるコード生成やコードリーデイング支援が流行っています。これらは破壊的なイノベーションで，いずれはすべての開発者や企業が導入するものです。
>
> ただ，現状では生成AI×コードを推進・導入している企業は多くはなく，さらに活用法については手探りの状況です。
>
> 本書では生成AI×コードでなにができるか，どうすればよりよく活用できるかを解説します。しっかりと活用していくための知識と，現場で活用できる実践が身に付く必携の一冊です。


# 本書の特徴

GitHubの方が書かれた書籍ではありますが、本書のポイントはGitHub Copilotの具体的な使い方などに終始した本ではないというところです。

「はじめに」にも書かれているのですが、表面的なテクニックではなく「ソフトウェア開発者がAIと協働するうえで身につけておくべき本質的なスキル」に重きを置いています。

製品がアップデートされても廃れにくい「アプローチ」の解説と、具体的な「テクニック」の紹介がバランスよく記載されています。また、後者は目次でラベル付けされており、多くがGitHub Copilotに限らない複数の製品で活用できる汎用的なテクニックとなっているのも嬉しいポイントです。


# 誰が読むべき？

メインターゲットは「プログラマー」だと考えます。ただしアプリケーション開発者に限らず、IaCをはじめとしたコーディングを活用するインフラエンジニアも含みます。

また、コーディングだけではなくドキュメンテーション、要件定義、設計、レビューにおいても生成AIを活用するコツが紹介されているため、ソフトウェア開発に携わる多くの人が手に取る価値があるでしょう。


# 私が興味深かった点を紹介

### プロンプトエンジニアリングは重要なのか？

本書では「（狭義の）プロンプトエンジニアリングの具体的なテクニック自体はあまり重要ではない」旨が繰り返し述べられています。

巷では様々な手法が紹介され話題になりがちですが、これらを頑張ってたくさん覚えても、期待するほどAIの出力が劇的に改善されることはなかったり、そもそも開発タスクは「一点もの」の対応が多い傾向にあります。

AIの出力をみながらプロンプトを調整したり、そもそもプロンプト自体をAIに書かせたりといった柔軟な対応スキルのほうが重要ということですね。


### 生成AIでエンジニアの仕事はなくなる？

最近のAIブームでｇｋｂｒしているエンジニアの皆さんも多いのではないでしょうか？

本書では「エンジニアの仕事は消えない」と語られています。生成AIがいい感じのコードやアプリケーションを生成できても、じゃあそれをノールックでそのまま商用稼働できるか？中身を正しく理解し、運用し、改善するためには結局人間の高度なスキルが必要ですよね。

例えばクラウドの出現で「インフラエンジニア不要論」が囁かれましたが、今や「クラウドエンジニア」をはじめとする新たなスキルを持った人々が活躍しています。このように新技術を柔軟に取り込み、新しいスキルを獲得して環境に適応していける人こそ、どんな時代でも仕事に困らないエンジニアと言えそうです。


### 内製化すればAIを最大限に活用できる

AIを活用したコーディングでは、自社のコードリポジトリなどをAIに読み込ませることで、より的確なコード生成が可能になることがあります。

この観点で「内製開発」にメリットがあります。他社とのしがらみのあるコードと異なり、内製開発を行なっていればコードベースをAIに参照させてコード提案の質を向上させることができます。また、組織の中でコードを共有する「インナーソース」を進めればこのメリットがさらに最大化します。

本書では **AI活用の価値は決してコストカットだけではない** ことが指摘されています。上記の取り組みによって社内の技術資産を共有することで、中長期的に組織がイノベーションを起こす能力の醸成に繋がります。


### AIにやさしいコードを書くコツ

本書では具体的なテクニックとして「AIとの協働に適したコーディングテクニック」も紹介されているのですが、例えばコードを適切に分割する、一貫性のある命名を行う等、結果的に「これって人間にとっても読みやすいコードなのでは？」といった内容になっていたのが印象的でした。

普段から横着せず、可読性の高い綺麗なコードを書くクセをつけていれば、結果的に人間もAIも理解しやすく、トータルの開発速度が上がるということではないでしょうか。


# おまけ

実は、弊社KAGでもインナーソースに取り組んでおり、社内でコード資産の共有を行うだけでは飽き足らず、テーマソングまで作ってしまうメンバーが現れました。

**共創未来インナーソースマン feat. InnerSource Commonsコミュニティ**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/b5465641-e648-81fc-e302-cc13ec02611a.png)

https://www.youtube.com/@kddi_agile

もしご興味あれば上記YouTubeチャンネルを覗いてみてください。

「音KAG(/)部」（おんがくぶ）では、他にも愉快な楽曲をいくつも制作しております。メンバーの中島が下記noteにて取り組みを紹介しています。

https://note.com/piyonakajima/n/n3a663953b51e
他人(ヒト)からされて面倒だなと思うことは貴方で止めよう！(後編)

## 前回の続きです
Formsでイベントの参加申込みしたら会議依頼メールを転送してくれるような仕組みを作りかけていました。

https://qiita.com/yamachan67/items/e46b7bf36212b31aaed2

前回もご紹介しましたが、大雑把な手順としては次の通りです。

1. 宛先は誰かモルモットを召喚し先に会議の予定を入れる
1. 発信した招集メールのIDを取得する
1. イベント募集用のFormsを作成する
1. Formsトリガーで会議の予定を転送するフローを作る

前回は、２つめの手順、会議依頼メールのメッセージのIDを取得して、ついでに、それを誰かに転送するところまで実現しましたので、今回はその続きから、はじめていきましょう。

---

### イベント募集用のFormsを作る。

さっそくなのでFormsの作成はCopilotくんにお願いしてみましょう。
テキトーに依頼してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272254/5126a23a-6a75-eab0-27d8-82946111dbbf.png)
さぁ、これでどんなフォームを作ってくれるのか、ドキドキ:heartbeat:しますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272254/b572c9b4-fdf9-c317-8048-ead010a9e176.png)
だいたい、いい感じのフォームを作ってくれましたが、２の名前や３のメールアドレスは、Automateで取得できるので不要ですね。削除しちゃいましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272254/f027d9a7-b158-1f7d-d51a-eb1cc4e06a10.png)
いい感じで出来ましたね。これで良しとしましょう。

:::note warn
Copilotが作成するフォームは毎回、同じではありません。
その場合も温かい心で対応ください。あくまでも機長はあなたです。
:::

### 本日のメイン・イベント！

Formsトリガーで会議の予定を転送するフローを作って行きたいと思います。
前回、会議招集メールを転送したフローを改造していきます。
まずはトリガーを削除しちゃってください。
そして、Formsコンテナーの『新しい応答が送信されるとき』トリガーを追加したらフォームIDのところに、先程、コパイロットくんが作ってくれたフォームを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272254/1bef5a29-0c4c-d298-d184-01b0f6402ec4.png)


#### 『応答の詳細を取得する』アクションを追加します。
パラメータには、トリガーで指定したのと同じフォームIDとトリガーの応答IDを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272254/e629438a-70a5-2cc3-c393-db06a1fabde8.png)

これでフォームで投稿された情報にアクセスすることができます。
では、ユーザが応答した参加するか否かを判断してみます。
#### 条件アクションを追加しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272254/e51abb40-e30b-61ae-0680-fe6e3c681946.png)
条件のイナズマアイコンをクリックして設問を指定して、『参加する』と等しい条件とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272254/fcf3e1d2-61b4-1604-49e0-9e50fed1b23f.png)

#### おまけです。
フォーム作成する時に、メールアドレスや名前は取れると書いていましたので、本当に出来るかどうか試してみましょう。
ここで回答者の情報を取得するために『オフィス365ユーザ』コネクタの『ユーザプロフィールの取得(v2)』アクションを条件のtrueの方に追加してみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272254/1b291985-6142-0980-562c-54be6792029e.png)


パラメータには、ユーザID(UPN)を指定します。動的コンテンツを見るとResponder's Emailとありますが、これは実はメールアドレスではなくUPNが返ってくるのでそれを指定すればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272254/63ba7a73-35ff-7d8e-66a5-02a705867bcf.png)

#### いよいよ最終段階です。
次にメールの転送をこのアクションの下に移動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272254/8283e9bb-91e0-dc6b-0a0a-fb2181df79ae.png)

そして宛先には、Responder's Emailを指定します。
これで、アンケートの回答者に会議招集メールを転送することが可能です。
そして、コメント欄にオフィス365コネクタで取得した回答者のプロフィール情報を指定することで、より親切なメールが出来て受け取ったヒトにも貴方が頑張った『お・も・て・な・し』が伝わるかと思います。

## まとめ

前編・後編２回に渡って、Formsでイベント参加を申し込んだときに、会議招集メールを転送する仕組みの作り方をPower Automateを使って試してみました。
一つひとつ試しながら作ってみましたので、手順的には行ったり来たり感があるかと思いますが、意外と簡単にできることが判ってもらえたかと思います。

参加者のヒトにダブルブッキングさせてしまうかどうかは、
**貴方の『お・も・て・な・し』の心**一つかと思います。

ぜひ、参加者に面倒だなと思わせないように、ちょっとした手間をかけてくれると無精モノで他力本願な私はたいへん嬉しいです。
expo-routerで複数段階あるfullscreenModalを全て閉じる方法

# はじめに
今回は、表題の通りexpo-routerを使用しているreact nativeで、fullscreenModalを閉じる方法について紹介します。

## 発生した問題

ScreenAからfullscreen1、fullscreen2、fullscreen3と遷移してきて、最後にfullscreen3からScreenAに遷移(fullscreenModalを終了する)という動作がexpo-routerでは簡単には実装できない。

useRouterを使用した`.back()`や`.dismiss()`、`.dismissAll()`もfullscreen3からfullscreen1に戻るだけで、ScreenAに遷移が実装できない。(これらの組み合わせなら実現は可能だが、なんとかワンライナーで書きたい)


## 解決法

以下のコードを使用する。

```typescript
const navigation = useNavigation(); 
// ~~~~~ 省略 ~~~~
navigation.getParent()?.goBack();
```
### 解説

- `navigation.getParent()?`

この関数は現在のナビゲーターの親ナビゲーターへの参照を返します。
今回のfullscreenModalの場合、モーダルを開いた元のスタックナビゲーター(ScreenA)を指すようです。

`getParent()`がundefinedを返す可能性のある関数なので、ちゃんとオプショナルチェーンを使用するようにしましょう。


## おわりに
このような方法の記載はexpo-routerおよびreact-navigationのdocsにもなかったので、勉強になりました。
こんなことをしなくても、それ用のメソッドを用意して欲しいものではあるのですが...

## 参考
https://stackoverflow.com/questions/49804332/how-to-close-a-react-navigation-modal-with-multiple-screens-in-it
Railsのeditアクションとupdateアクションの役割の違いを整理してみた。

RUNTEQでプログラミング学習を始めて、5ヶ月が経過しました。
プログラミングは全くの未経験なのでRailsの勉強はわからないことだらけですが、
仕事終わりや土日にも学習する時間を作り、少しずつ成長を感じています。

今回はRuby on Railsでルーティングを設定する際に使う、resourcesにも含まれている、
editアクションとupdateアクションについての理解が曖昧だったので改めて整理することにしました。
基本動作なので今更感がありますが、一歩一歩進んでいきます。

まずはeditアクションからです。
そもそもeditは英語で編集を意味する言葉です。
なので、編集に関わるアクションなのだろうというイメージでした。
editアクションを実行することで、データの編集をすると思っていましたが、
実際の役割は編集画面を表示するためのアクションでした。

編集対象のデータを取得して、編集フォームにそのデータを表示する。ユーザーがデータを変更できるようにするための準備をするところまでがeditアクションの役割なります。

つまり、editアクションだけだと編集フォームを表示して、更新後のデータをサーバー側で受け取ることまでしかできないのでした。

そこで、editアクションで送られてきたデータを上書きするupdateアクションの出番となるわけです。

updateアクションこそが、実際にデータを更新するためのアクション。
editアクションで表示されたフォームから送信されたデータを受け取り、データベースの内容を更新する。更新が成功した場合は、通常はリダイレクトして別のページを表示するというのが基本の動作となります。

editアクションとupdateアクションはデータベースに登録されている情報を更新する機能を実装する時に使うコンビだったというわけですね〜
【Mac】コマンドでAVIFをPNGなどに変換する方法

## `libavif`をインストール

Homebrewを使用して`libavif`をインストールします。

```terminal
brew install libavif
```

https://github.com/AOMediaCodec/libavif

## `avifdec`コマンドを使用して画像を変換

```terminal
avifdec input.png output.avif
```

![スクリーンショット 2024-09-15 23.41.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/ab0e3163-60a3-8275-64f4-eccf65b33d88.png)

`avifdec`コマンドで使用できるオプションの詳細は以下のとおりです。

```terminal
$ avifdec --help
Syntax: avifdec [options] input.avif output.[jpg|jpeg|png|y4m]
        avifdec --info    input.avif
Options:
    -h,--help         : Show syntax help
    -V,--version      : Show the version number
    -j,--jobs J       : Number of jobs (worker threads). Use "all" to potentially use as many cores as possible (default: all)
    -c,--codec C      : Codec to use (choose from versions list below)
    -d,--depth D      : Output depth [8,16]. (PNG only; For y4m, depth is retained, and JPEG is always 8bpc)
    -q,--quality Q    : Output quality [0-100]. (JPEG only, default: 90)
    --png-compress L  : Set PNG compression level (PNG only; 0-9, 0=none, 9=max). Defaults to libpng's builtin default.
    -u,--upsampling U : Chroma upsampling (for 420/422). automatic (default), fastest, best, nearest, or bilinear
    -r,--raw-color    : Output raw RGB values instead of multiplying by alpha when saving to opaque formats
                        (JPEG only; not applicable to y4m)
    --index I         : When decoding an image sequence or progressive image, specify which frame index to decode (Default: 0)
    --progressive     : Enable progressive AVIF processing. If a progressive image is encountered and --progressive is passed,
                        avifdec will use --index to choose which layer to decode (in progressive order).
    --no-strict       : Disable strict decoding, which disables strict validation checks and errors
    -i,--info         : Decode all frames and display all image information instead of saving to disk
    --icc FILENAME    : Provide an ICC profile payload (implies --ignore-icc)
    --ignore-icc      : If the input file contains an embedded ICC profile, ignore it (no-op if absent)
    --size-limit C    : Specifies the image size limit (in total pixels) that should be tolerated.
                        Default: 268435456, set to a smaller value to further restrict.
  --dimension-limit C : Specifies the image dimension limit (width or height) that should be tolerated.
                        Default: 32768, set to 0 to ignore.
    --                : Signals the end of options. Everything after this is interpreted as file names.

Version: 1.1.1 (aom [enc/dec]:3.10.0)
libyuv : unavailable
```
CSSでバツの描き方

## はじめに
以前、解説サイトからほとんどそのままパクってきた「CSSでバツを描く」コードを、いま一度理解するため、備忘録的に仕組みをここで書いていきたい。

## 著者について
- プログラミングを（本格的に）始めては半年ほど
- HTML/CSSは別に得意でもない

## 「×」で削除ボタン作りたいけど、どうやるんだ？

あるページの要素の削除機能を実装している時に「削除」ボタンだと、なんかかっこわるいなー、と思うようになり、「×」ボタンにすればいいのでは？と思いついたものの、実装方法がわからない。

そこで案としてパッと思いついたのが

- "×" を文字として入力する
- フリーのアイコンを表示する

だった。ただ、それぞれ

- 位置がずれてカッコ悪い
- 見た目の調整に制限がある

という難点があったので、調べていたらCSSで作れるらしい

## とりあえずそのまま使ってみた
https://kouhekikyozou.com/css_close_button

その時は時間がなくて、とりあえずこちらのコードを少し調整して使っていたのだが、改めてみるとよくわからない。
```html:HTML
<span class="batsu"></span>
```
``` css:CSS
.batsu {
  display: block;
  position: relative;
  width: 30px;
  height: 30px;
}
 
.batsu::before, .batsu::after { /* 共通設定 */
  content: "";
  position: absolute;
  top: 50%;
  left: 50%;
  width: 5px; /* 棒の幅（太さ） */
  height: 30px; /* 棒の高さ */
  background: #333;
}
 
.batsu::before {
  transform: translate(-50%,-50%) rotate(45deg);
}
 
.batsu::after {
  transform: translate(-50%,-50%) rotate(-45deg);
}
```

## 擬似要素について
まず ::before がよくわかっていなかった。
そこでMdnの記事を読むと、

https://developer.mozilla.org/ja/docs/Web/CSS/::before

「CSS において ::before は、選択した要素の最初の子要素として擬似要素を生成します。よく content プロパティを使用して、要素に装飾的な内容を追加するために用いられます。この要素は既定でインラインです。」

とある。要するに、この::beforeと::afterでspanタグ内に新しく小要素を設定しているみたいだ。そこで

``` css:CSS 
.batsu::before, .batsu::after {
 content: "";
 }
```
で空の要素をいれているということらしい。


## 「×」部分の書き方


``` css:CSS
.batsu {
  display: block;
  position: relative;
  width: 30px;
  height: 30px;
}
```
これで親要素の大きさを設定し、positionプロパティをrelativeにして、これから作る小要素の描画領域を設定。

``` css:CSS
.batsu::before, .batsu::after { /* 共通設定 */
  content: "";
  position: absolute;
  top: 50%;
  left: 50%;
  width: 5px; /* 棒の幅（太さ） */
  height: 30px; /* 棒の高さ */
  background: #333;
}
```

- positionプロパティをabsoluteにして描画領域を設定
- top, leftプロパティを50%にして、親要素のど真ん中に小要素の左上を設定
- width, heightプロパティで小要素の大きさを設定（長方形になる）
- backgroundプロパティで小要素を#333で塗りつぶす

この段階だと、ただ親要素の中心から下に伸びていく黒い長方形ができただけなので、

``` css:CSS
.batsu::before {
  transform: translate(-50%,-50%) rotate(45deg);
}
 
.batsu::after {
  transform: translate(-50%,-50%) rotate(-45deg);
}
```

- transformプロパティのtranslate()メソッドでそれぞれの起点を「小要素に対して」-50%左上（つまりxが-2.5px、yが-15px）にする（結果的に親要素の中央に黒い長方形ができる）
- transformプロパティのrotate()メソッドでそれぞれ45度左右に回転させる

ということらしい。

## まとめてわかったこと
- 小要素のtransformのtranslateは親要素ではなく、小要素の大きさで表されている
- そもそも塗りつぶしということがわかっていなかった

## おわりに
あらためて自分でコードを触ってみて、描画を確認しながらやると理解が進んでよかった。
だいぶ初歩的な部分だが、逆に検証しやすくて、振り返る重要性に気づけた。
[自然言語処理]OpenAI APIで名前と役職を分離してみた

## 前置き

議事録というものには一般的に、議題、会議の内容、発言記録などが記載されているが、その書き方（記法）は人それぞれである。

発言記録には、主に「発言者」「役職」「発言内容」といった情報が含まれている。どんな人がどんな発言をしたのかを記録するためだ。

しかしながらその記法はバラバラで、


``田中（議長）こんにちは``

という形式もあれば、

``議長（田中）こんにちは``

であったり、

``田中議長　こんにちは``

であったりもする。

この文字列から、誰が、どんな人で、どんな発言をしたのか、

つまり「発言者名」「役職」「発言内容」を切り分けたいと思った時、どんな方法があるだろう？

## AIに任せちゃおう
今回はAIに任せてみた方法をご紹介しよう。

使用したLLMはopenAIのgpt-4oモデル。pythonでAPIを呼び出し、発言者情報をGPTモデルに渡して判別させる。

**対象の議事録**

対象の議事録はとある市町村の会議録。これは先ほどの話で言う``田中議長　こんにちは``の記法であり、「田中」と「議長」をプログラムで分離させることが難しいために、今回の方法を試した。

**実装コード**

```python:python
from openai import OpenAI

api_key = os.environ.get('OPENAI_API_KEY')
client = OpenAI(api_key=api_key)
model = 'gpt-4o' 

def separate_name_and_title(speaker_info):
    # GPTへのプロンプトを作成
    prompt = f"以下の発言者情報のうち、名前を表している文字列のみを返答してください。それ以外に余計なことは返答しないこと。\n\n発言者情報：{speaker_info}\n\n"

    # GPTに対してリクエストを送信
    response = client.chat.completions.create(
        model=model,
        messages=[
            {"role": "system", "content": "あなたは日本語の助言者です。"},
            {"role": "user", "content": prompt}
        ]
    )

    # GPTの応答から名前を取得
    name = response.choices[0].message.content.strip()
    return name
```

プロンプトに渡しているspeaker_infoには、発言者情報を表す文字列が入っている。
例えば、
○水沢議長 これで諸般の報告を終わります。
と言った発言記録の場合、「○水沢議長」にあたる位置の文字列を正規表現で抜き出して渡した。

APIの呼び出しの記述は一般的だと思う（多分）。

モデルからの返答をそのまま変数に入れて使うので、プロンプトには余計なことを言わないように（例えば、「名前に当たるのは水沢です」みたいな返答をしないように）念を押した。意外とこれで回答を制御できる。

その後はnameを基準にpost（役職）を分離した。

## 結果
以下は出力結果である。

![スクリーンショット 2024-09-15 14.38.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570369/554da4e4-0621-719c-1f40-e4a7ead92363.png)

見てわかる通り、同じ文字列でも出力結果が異なっている。


:::note warn
田村議長を「田村」としている場合もあれば、「田村議長」としている場合もある
:::

つまり回答にゆれがみられた。

これでは使えないかな、と落ち込んだが、一応「回答ゆれ」のパターンはどのようなものがあるのか、全体のどの程度なのかを調べることにした。

## 結果を分析する

同じ発言者情報のうち、いくつの回答ゆれパターンがあるのかを調べた。

田村議長の場合で言うなら、「田村」「田村議長」のほかにパターンは存在するのか。それぞれのパターンは全体のうちいくつあるのか等の数値を出す。

![スクリーンショット 2024-09-15 23.01.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570369/19b904d1-94f9-8e6e-bd72-343535c518b6.png)

すると驚くべきことに、今回のデータに限った話ではあるが、回答ゆれのパターンは二つ。

**1**
名前と役職を正しく分離し、名前のみを出力している
**2**
発言者情報（元の文字列）をそのまま出力している

役職名の方も同じ処理でカウントして比較しているが、数字は合っているし、同じように2パターン（正しく分離できているか、nullか）だった。そしてこれら２パターンの合計を取ると総数となる。

つまり本当にこの2パターンのようだ（今回に限った話）。

## 結果と分析を踏まえて
ここまでの情報を元に考えると、LLMの回答ゆれが2パターンなら、パターン２の際にfalseということにしてもう一度apiを呼び出し、パターン１がでるまで続けるというガチャガチャ方式が取れる。

元としたデータ数が少ない（2600例ほど）うえにほとんどが田村議長なので、多分さらにやっていくと別のパターンも出てくるだろうが、``田中議長　こんにちは``記法の分離方法に散々悩まされてきた私としては、これはかなり嬉しい結果だった。

ガチャガチャを試してみたら、また書こう。
M5Stamp S3でカラーLED、Grove - Chainable RGB LEDで遊ぶ(P9813)


参考

![o_coq404.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/e74c9847-c269-45c2-5ff9-2e943dadedf6.jpeg)


↓クリック


https://qiita.com/caa45040/items/0b72293684642472a327


↑クリック

x 過去ログを見よ!!


結果


![o_coq410.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/d0afa8e2-3ab3-5427-3044-3297d5ea9197.jpeg)




プログラム


```c++


//Chainable_LED_S3_1
//1個専用のカラーRGB LEDのライブラリ


//送信クロックの発生
void clk() {

  digitalWrite(15, LOW);//clk
  delay(20);                       // wait for a second
  digitalWrite(15, HIGH);//clk
  delay(20);                       // wait for a second

}//clk


//1バイトを送信する
void sendByte(int b) {

  for (int i = 0; i < 8; i++) {
    if ( (b & 0x80) == 0) {
      digitalWrite(13, LOW);//data
    } else {
      digitalWrite(13, HIGH);//data
    }//endif
    clk();
    b = b << 1;
  }//for i

}//sendByte


//1個のLED専用
void setColorRGB(int red, int green, int blue) {

  //開始
  sendByte(0);
  sendByte(0);
  sendByte(0);
  sendByte(0);

  //ここから
  int prefix = 0b11000000;
  if( (blue  & 0x80)==0 ) {prefix = prefix | 0b00100000;}
  if( (blue  & 0x40)==0 ) {prefix = prefix | 0b00010000;}

  if( (green & 0x80)==0 ) {prefix = prefix | 0b00001000;}
  if( (green & 0x40)==0 ) {prefix = prefix | 0b00000100;}

  if( (red   & 0x80)==0 ) {prefix = prefix | 0b00000010;}
  if( (red   & 0x40)==0 ) {prefix = prefix | 0b00000001;}
  sendByte(prefix);

  sendByte(blue);
  sendByte(green);
  sendByte(red);
  //ここまで

  //終了
  sendByte(0);
  sendByte(0);
  sendByte(0);
  sendByte(0);

}//setColorRGB


// the setup function runs once when you press reset or power the board
void setup() {
  //GPIOポートの初期化
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(13, OUTPUT); //data
  pinMode(15, OUTPUT); //clk
}//setup


// the loop function runs over and over again forever
void loop() {

  //赤
  setColorRGB(0x55, 0x00, 0x00);
  delay(500);                       // wait for a second

  //緑
  setColorRGB(0x00, 0x55, 0x00);
  delay(500);                       // wait for a second

  //青
  setColorRGB(0x00, 0x00, 0x55);
  delay(500);                       // wait for a second
  
}//loop


```
Nexus5xにTermuxを用いてSSH接続する

# 主要ポイント

## 前提
　mobile
　　nexus 5x
　Termux Version
　　v0.118.0
　Android Version
　　8.1.0　(5.0 or newer)

## termux をインストール
 A) GitHub からTermuxをインストール
　　参考：https://github.com/termux/termux-app/releases/tag/v0.118.0
　　　例：https://github.com/termux/termux-app/releases/download/v0.118.0/termux-app_v0.118.0+github-debug_arm64-v8a.apk
 B) Google Play Store からTermuxをインストール
　　参考：https://play.google.com/store/apps/details?id=com.termux

## 必要に応じて、Termux から下記を実行
```
[5X] ~$ termux-setup-storage
[5X] ~$ pkg install openssh
[5X] ~$ pkg install iproute2
[5X] ~$ ip -4 a
[5X] ~$ id
(　必要に応じて　[5X] ~$ pkg up　など　)
[5X] ~$ passwd
(　必要に応じて　[5X] ~$ ssh-keygen -A　など　)
[5X] ~$ sshd
[PC] $ ssh -p 8022 u0_aXXX@192.168.XXX.XXX
(　例えば　[5X] $ ls -la /data/data/com.termux/files/home/storage/downloads/　など)
(　必要に応じて　[5X] $ exit　など)
```

# サイトポリシー
当ページをご利用いただくにあたっては、以下の事項に全て同意いただけた場合に限り、ご利用いただけます。
なお、当ページの利用規定を予告なしに変更する場合がありますので、ご了承ください。

### 本ページの目的と利用者責任について
当ページは関連情報の整理を主目的としています。
当ページに掲載された内容のご活用は、ご活用者の責任において行われるものとします。
当ページで提供する情報の内容について、掲載した情報の内容が正確であるか？有用であるか？更新時期が適切かどうか？などを一切保証をするものではありません。
また、掲載された情報をご利用いただいた結果、万一、ご利用者が何らかのトラブル、被害、損失、損害等が発生したとしても、一切責任を負うものではありません。
なお、当ページに掲載されている情報等につきましては、予告なく変更、又は削除されることがありますので、あらかじめご了承ください。
ソフトウェアファースト第2版（第2章）の読書メモ

# はじめに

前回に続き、ソフトウェアファーストの第2版を読んで思ったことを書き連ねていきます。

https://amzn.asia/d/2fxjKjS

第2章は「DX失敗の原因と製造業信仰からの脱却」です。

# なぜDXがうまくいかないのか

「DXが流行っている、だからやってみよう（または、やらなければいけない）」だと、うまくいかないですね。
なんだか便利そうな家電が売ってたから買ってみたけど、結局使わない、という現象と似ている気がします。

DXの成功例がいくつか紹介されていましたが、DXを正しく理解したからというより、そのような言葉に惑わされず、真摯に市場や顧客に向き合った結果うまくいっている印象を受けました。

# 低位安定

本書の中で、日本のユーザ企業とベンダー企業の相互依存関係が取り上げられてました。
ただ、個人的にはベンダー企業側の気持ちが分からなくはありません。リスクを取らずに一定の売り上げ・利益を見込めるなら、会社として、これほど美味しい話はないからです。

ホンダジェットの例が挙げられていましたが、あれはリスクをとって成功した事例であり、世の中にはリスクを取った結果失敗した例もあるため、ある程度、生存バイアスがかかっているかな〜と感じました。

# アジャイルが浸透しない理由

日本の製造業はウォーターフォールで進めがちですが、それは製造業のプロセスに沿っているからだけでなく、予算・稟議の取り方も影響しているかなと思います。
ウォーターフォールの場合、計画上の話とはいえ、いつまでにいくらで何をやります、と最初に約束をするため、稟議を通す側からすると検討しやすい側面があります。
対して、アジャイルの場合、そこの約束ができない・不明瞭になっているため、嫌悪感を示す人が出てきてしまいます。


# 狩野モデル

第2章で狩野モデルの紹介がされていました。

https://ja.wikipedia.org/wiki/%E7%8B%A9%E9%87%8E%E3%83%A2%E3%83%87%E3%83%AB

ソフトウェア開発では、気をつけるべきポイントが様々あります。
* UI/UX
* 処理速度（応答速度）
* 様々なデバイス（ディスプレイ）への対応
* エラーハンドリング
* RASIS
    * https://bcblog.sios.jp/drbd-what-is-rasis/
* 運用・サポート体制

プロジェクトは、人、金、時間に限りがあるため、全てにおいて100点満点を目指すのは非現実的ですね。
狩野モデルを活用することで、この辺りをうまく整理できそうです。

第3章で紹介されている「価値曲線」（ゲーム機の比較の図が載っていたもの）と併せて考えても良さそうです。
Goの標準ライブラリでuse of internal packageエラーが大量発生した場合の対処方法

## 背景
Go言語のソースコードをVSCodeで閲覧時、大量のuse of internal packageエラーが発生しました。なんとその数3,000以上・・・！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122367/4eaf1408-8be7-1b84-3d0d-55655295703c.png)

## 対処方法
settings.jsonでgorootをcloneしたGoのソースコードのパスに設定をしたら解決しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122367/723cd081-5704-710d-3a32-bd6f37dc3d85.png)

通常はinternal directoryはinternal directoryと同階層以下にいないと参照できませんが、`$GOROOT/src`配下の標準ライブラリは`$GOROOT/src`配下のinternal directoryをどこからでも参照できるようです。

[internal directoryの詳細](https://docs.google.com/document/d/1e8kOo3r51b2BWtTs_1uADIA5djfXhPT36s6eHVRIvaU/edit)に以下記載がありました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122367/7bab7a4c-f3bd-4ebb-d998-c3f6646f0de0.png)

※ internal directoryの詳細はhttps://pkg.go.dev/cmd/go#hdr-Internal_Directories から辿りました