OmniAICreator/Qiita-1.07M huggingface dataset:
なんちゃって情報学部生の就活Tips集

# はじめに

:::note info
この記事は [CA Tech Lounge Advent Calendar 2024](https://qiita.com/advent-calendar/2024/catechlounge) 19日目の記事です。
18日目の記事は[こちら](https://zenn.dev/monchy1017/articles/0c725f1d981881)からどうぞ！
:::


こんにちは、大学4年生のFJ2123です。
今年でCATechLoungeのアドベントカレンダーに投稿するのは２回目になりました。

もう一年が経ったなんて感慨深いですね…

昨年は、(軽めではありますが)技術系の記事を投稿したので、今回は就活体験記的なものを書いてみようと思います。

去年の記事はこちらから⬇️
https://qiita.com/FJ2123/items/5e3915e9fe2e1fbbf0ee


# 自分のステータス
去年時点の自分のステータスは以下のような感じです。

- 都内の大学のなんちゃって情報学科所属(情報系の授業は多くても2割ほどで、メインは経済や、物流系の講義が多い学科です)
- プログラミングを本格的に始めたのは、大学2年生の春くらい
- 大学2年生の終わりに、株式会社サイバーエージェントのイベント「CATechLounge」に参加
- エンジニア学生がやるような長期インターンは大学3年生の5月から始めた(周りと比較するとかなり遅い)
- ちょうど同時期にコミュニティ「CATechLounge」に参加

結果的には、Web系の開発を行う企業から3社、IT系企業という広い括りでは6-7社ほど内定をいただくことができました。


## 就活中意識していたこと

若干Tips集みたいになって申し訳ないのですが、意識していたこと等を書き連ねていきます。

### 1.自分の強みは何かを早めに把握しておく

まず大前提として、これが一番大切だと思っています。

エンジニアの就活といえば、技術的にできることのみ聞かれそうな感じですが、新卒エンジニア就活においては全然そんなことはない印象です！

もちろん最低限のスキルは必要ですし、スキルをより重要視する会社も存在しますが、実際のところは
技術力よりもソフトスキル(コミュニケーション力、リーダーシップなど)をより重視する会社が大半の印象です。

自分は開発経験が周りのエンジニア学生によりも少ないことは自覚していたので、就活の初期段階から、自分の強みを見つける作業に時間をかけていました。そうすることで、自分の特性をしっかり言語化できたと思いますし、何より面接で澱みなく自信を持って話すことができたかなと思っています笑

とはいえ、すぐに強みを探して、言語化することは大変だと思うので、そんな時にはストレングス・ファインダーなどの書籍に頼るのもありだと思います！

![ストレングス・ファインダー.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194385/e3810621-a16e-53fa-28e9-7617e8e16891.jpeg)


### 2.弱みを理解した上で、それを改善する姿勢を絶やさず見せる

「ご自身の弱みは何ですか？」就活でよく聞かれる質問ですね笑
これなんですが、ただ弱みを言うだけだとマイナス面だけをただ伝えることになってしまうので、与える印象も相当悪くなってしまうと思います...

例えば、例を挙げると「開発経験が少ないこと」を弱みとした時、それだけを伝えられても困ってしまいますよね。

それよりは「開発経験は少ないですけれど、〇〇とか〇〇して頑張っています！」と言われる方が、よっぽどポジティブな印象が与えられると思います。

弱みについて話すこと以外にも、言葉と具体的なアクションを紐づけて話すことは、大切だと思いますので、意識的に行えるようにすると良いかなと思います！


また、以下は面接を受ける際に気を付けていたことになります。

### 3.面接中は、常に相手が何を聞きたがっているのかのピントを外さないようにする

就活始めたての段階だと、面接官の質問に対して、正確に答えられないことが多々あると思います。
聞かれたことは一問一答みたいな感じなのに、いろいろと話しすぎてしまって、肝心の結論の部分がだいぶずれてしまう感じですね。

これを防ぐには、質問に答える前に「それって〇〇ですか」とか「〇〇って認識で合ってますか？」などの確認をとって、認識を一致をさせるようにすると良いと思います(もちろんすぐに答えられそうならすぐに答えてしまっても大丈夫だと思います)

なるべく脱線しない会話ができるように癖をつけておくといいと思います！

## 後悔

### 早めに長期インターン等でチーム開発経験を積むべきだった

Web系に就職したいと思うなら、なるべく早めに長期インターンに行くことをおすすめします。
というのも、大体の企業で、チーム開発の経験を聞かれることが多く、情報系の学校でないとそのような経験を積める場所は、長期インターン・業務委託くらいしかないなと思うからです。

また、せっかくインターン生として採用されたとしても、現場への配属前に研修等がある会社も多いので、それを考えると、チーム開発のような経験を積めるのは早くても1ヶ月はかかってしまうかなと思います...

ですので、少しでもWeb系・開発エンジニアに新卒で行きたいと思うのであれば、早めに長期インターンを探して色々なところに応募することをおすすめします。まずは数を打つことが大事です。



### 選考を早めの時期に受けることを躊躇しない

Web系のエンジニアの採用面接は他の業界と比較しても、かなり早いです。
具体的には、大学3年生の夏頃から始まるのが相場で、大学4年生の春頃には、主要な企業の募集は、ほぼほぼ締め切られています。(中には大学1年生の頃から内定をもらっているつよつよな子もいます...)
また、選考を1社受けるだけでも、最短でも1〜2週間はかかってしまいます、そのため、受けたい企業を後回しにしても、採用期間の後ろに受ける企業が増えてしまうだけなので、メリットとしては薄いです。
志望度の高い企業に十分な時間を割くためにも、理想は採用面接が始まった段階、遅くても3年生の10月には、いろいろな企業を受けて、場数を踏むことが大切だなと感じています。



### さいごに

いかがでしたでしょうか？
書くネタを当日の18時に、ラウンジで決めたため駆け足気味の記事になってしまい申し訳ないです🙏

今後、卒業までにちょくちょく加筆修正をしていく予定なので、お楽しみにしていただければ幸いです...

また、最後に宣伝なのですが、自分が現在所属しているCATechLoungeは新規会員を絶賛募集しています！
開発経験を積みたいが、長期インターン・業務委託はちょっと怖いと言う方や、エンジニアを目指して頑張っている人と話してみたいという方はぜひ入会試験を受けてみてください！！

https://www.cyberagent.co.jp/careers/special/students/tech_lounge/
Elixirのチートシートを作ろう #14 パイプ演算子

# 1. OverView

こいつも何度も使ってしまっている、パイプ演算子であります。
実際、（）でネストしまくりよりもわかりやすく、特にサンプルなんかだと重宝します。

奥が深い物なのですが、とりあえず現時点での考え方を書いていきましょう。



# 2. とりあえず解説
Elixirのパイプ演算子（|>）は、関数の出力を次の関数の入力として渡すために使用されます。


```
function_1() |> function_2()
```
function_1の結果を、function_2の第一引数として渡します。



Elixir Schoolでは、以下のサンプルがありますね。
```
foo(bar(baz(new_function(other_function()))))
```
さぁ、正解を見ずに、ちょっとやってみますか…

ネストの深い順番、一番下から、書いていきます。

other_function/0の結果を、new_function/1に、new_function/1の結果をbaz/1に、
baz/1の結果をbar/1に、bar/1ｂの結果を、foo/1に…うん、あってるな。

まー、この手の書き方を簡略化するのが、パイプです。

上の例を書くと、
```
other_function() |> new_function() |> baz() |> bar() |> foo()
```
処理の流れが、つかみやすくなったのではないでしょうか？
さて、Elixir Schoolの例をやってみましょう。

' 'で区切られた文字列を分割する。

```
"Elixir rocks" |> String.split()
["Elixir", "rocks"]
```

1)で区切った文字を、大文字に変換する
```
"Elixir rocks" |> String.upcase() |> String.split()
["ELIXIR", "ROCKS"]
```


さて、ここでおまけ
dbg()と言う関数がありまして、これが、Elixrのパイプ処理の流れを表示してくれます。
```
iex(94)> "Elixir rocks" |> String.upcase() |> String.split() |> dbg()
[iex:94: (file)]
"Elixir rocks" #=> "Elixir rocks"
|> String.upcase() #=> "ELIXIR ROCKS"
|> String.split() #=> ["ELIXIR", "ROCKS"]

["ELIXIR", "ROCKS"]
```

処理の流れがよくわかるので、動きがよくわかるんじゃないでしょうか。

# 3. 本日のチートシート！
  |制御構造の名|説明|例|
  |:--------|:----------------------------------------|:------------------------------------------------------------------|
  |パイプ演算子|関数の出力を次の関数の入力として渡すために使用されます。|"Elixir rocks" |> String.upcase() |> String.split()<br>"ELIXIR", "ROCKS"]|


# 4. 本日の課題

Elixir Schoolでは、ベストプラクティスとして「関数のアリティが1より多いなら括弧を使うようにしてください」
と書いてますが、うーん、これはケースバイケースかなぁ、と思います。
もう少し、書いてから戻ってきて、解説してみますわ。
Rspecの明示的なsubject

### 明示的な`subject`
>Explicit Subject

#### `group scope`においての`subject`の使用して`example group`の`subject`メソッドの返り値を明示的に定義する
>Use subject in the group scope to explicitly define the value that is returned by the subject method in the example scope.

#### 以下の例ではどのように`subject helpler`がユーザー向けの概念として使うことができるかを説明しています。カスタムマッチャーかつ/またはexampleからsubject helplerの使用を隠す拡張ライブラリのサポートのためにをsubject helplerを使用しないことを推奨します

>Note that while the examples below demonstrate how the subject helper can be used as a user-facing concept, we recommend that you reserve it for support of custom matchers and/or extension libraries that hide its use from examples.

#### 名前付き`subject`は文脈に依存した方法で意味のある名前を割り当てることによって明示的な`subject`を改善する。名前付き`subject`からは、明示的な`subject`だから、`example scope`で`subject method`が返す値を定義するしかしながら、指定された名前で追加のヘルパーメソッドを定義する。このヘルパーメソッドはメモ化されている。値は、`example`で複数呼び出しを跨いでキャッシュされるしかし`example`はまたげない。
>A named `subject` improves on the explicit subject by assigning it a contextually semantic name. 
Since a named subject is an explicit subject, it still defines the value that is returned by the subject method in the example scope. 
However, it defines an additional helper method with the provided name. This helper method is memoized. The value is cached across multiple calls in the same example but not across examples.

#### `example`の`subject`よりも名前付きヘルパーメソッドを使うことを推奨する
>We recommend using the named helper method over subject in examples.

>For more information about declaring a subject see the API docs.

https://rspec.info/features/3-13/rspec-core/subject/explicit-subject/#:~:text=Clear%20examples-,Explicit%20Subject,We%20recommend%20using%20the%20named%20helper%20method%20over%20subject%20in%20examples.,-For%20more%20information
Amazon OpenSearch Service 接続部分の詰まりポイント

本記事は、AWS Jr.Champions Adventcalendar 2024 19日目の記事になります。
# はじめに
みなさんは Amazon OpenSearch Serviceを使用したまたはご存知ありますでしょうか。
Amazon OpenSearch Serviceとは、ログ分析、リアルタイム検索、ベクトル検索、RAGなどを安全に行うことが出来るAWSサービスです。

#### 詳細は下記を参照ください！
https://aws.amazon.com/jp/opensearch-service/

そんなAmazon OpenSearch Serviceですが、私もベクトル検索を使用したシステム開発をした際にAmazon OpenSearch Serviceのお世話になり、苦しめられ、悩まされましたので、今回は特に苦労した接続部分について、ご紹介出来ればと思います。

# 遭遇した権限接続エラーについて
早速ですが、皆さんこのようなエラーに遭遇したことありますでしょうか？
```
{
	"type": "security_exception",
	"reason": "no permissions for [indices: data/read/search] and User [name=arn:aws:iam::XXXXXXXXXXXX: role/hogehuga1234567890,backend_roles=[name=arn:aws:iam::XXXXXXXXXXXX: role/hogehuga1234567890], requestedTenant=null]"
}

```
上記は、実際にLambdaからAmazon OpenSearch Serviceにリクエストを送った際にレスポンスとして返ってきた結果になります。
エラーの中身を見てみると、no permissionsと記載があるので何となく権限がないのだろう。そして、ロールについても記載されているのでロール関連の権限エラーだろうということが推測されます。

# 原因1
LambdaのロールがAmazon OpenSearch Serviceのきめ細かなアクセスコントロールに設定されていなかった。
![スクリーンショット 2024-12-19 19.57.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3930014/8367fb2e-5c46-b3e3-ea2c-a33d18bef202.png)

# 原因2
きめ細かなアクセスコントロールに設定できるロールは1つだけということを知らずに複数設定していた。（マネージドコンソール上で複数回設定すると、上書きされるため最後に設定したロールが機能します。）

## 背景
元々下記の構成でリソースをCDKで作成してました。
![スクリーンショット 2024-12-19 21.27.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3930014/41c7ddb7-1f88-4e0f-8f64-379abcf203ed.png)

そのため、原因1が分かってからひとまずマネージドコンソール上のきめ細かなアクセスコントロールで2つのロール（ロール：Post Lambda用とロール：Get Lambda用）を設定し動作確認しても、どちらか一方のLambdaは最初n紹介したエラーのレスポンスしか返ってきませんでした。

### Amazon OpenSearch Serviceの権限&接続部分について
https://docs.aws.amazon.com/ja_jp/opensearch-service/latest/developerguide/fgac.html

# 解消方法
## 原因1の解消方法について
CDK上できめ細かなアクセスコントロールに設定したいロールを実装してあげることで解消しました。
## 原因2の解消方法について
2つあったロールを1つのロールにまとめることで、両方のLambda（Post LambdaとGet Lambda）からAmazon OpenSearch Serviceにアクセスすることが出来ました。
（これがベストプラクティスでないかもしれませんが、、、）
![スクリーンショット 2024-12-19 21.17.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3930014/b4e08c51-4c96-85c2-76c3-f6e9b8784dd6.png)


# おわりに
Amazon OpenSearch Serviceに限らず、AWSの権限エラーは中々原因を解消するのに時間がかかります。特に、Amazon OpenSearch Serviceのような馴染みのないサービスだと、とても苦労します。
ですが、権限周りはAWSを使用する上で避けては通れない道なので、これからもドキュメントと睨めっこしていきたいと思います。

この記事が少しでも参考になったら幸いです！！！
標準入力が難しかったのでまとめたい

# 標準入力の理解を深めたい
いままで標準入力を訳も分からずコピペしているだけだったので、しっかり理解したうえで使いたいと思い、個人的にまとめる。


## 入力が整数１つ

#### 入力
>N

#### コード
```
i = int(input())
```

#### note
input()関数で入力されたものはすべてstr(文字列型)となる。
そのままでは計算し使用できないため、int()関数に入れて整数型にする。
print(type())で文字列型か整数型か確認できる。

## 行列

#### 入力
>A₁,A₂,A₃...AN

#### コード
```
N = list(map(int, input().split()))
```

#### note
- list()関数：新たなリストを作成し、そのリストを返す。

```
N = list(input())
```
上記だと文字列型のリストが作られる。
改行や空白があった場合、それも要素の一つとなってしまう。
>入力：4 5 6　→　リスト　['4',' ','5',' ','6',]

これでは使えないので、まず空白で区切り文字のみをリスト化する。
- split()メソッド：任意の文字で区切りリスト化する
    - 書式：文字列を代入した変数.sprit('区切りたい文字')
```
N = list(input().split())
```
>入力：4 5 6　→　リスト　['4','5','6']

文字型のままだと計算に使えないので整数型にする。

 入力を整数型にする処理
```
map(int,input())
```
- map()関数：リストの各値に対して、指定した関数を使うことができる。
    - 書式：list(map(関数,  イテラブル))
    ※イテラブル：繰り返し可能なオブジェクトのこと


## 勉強はつづく
- 標準入力の勉強をしたらここに追記していく（12/19）
kaggle tutorial computer vision pert 5

https://www.kaggle.com/code/ryanholbrook/custom-convnets

の解説です。ここまででcnnのブロックを全て使えるようになりました。実際にそれらを組み合わせてCNNを設計しましょう。というtutorialです。ではどのような層の深さで？どのくらいの規模の？フィルターの数と大きさは？等についての指針はありません。ならばどうするかというと一般的に使われているCNNを持ってきてそれらを元に自分の用途に合うように調整を加えることになります。

```
model.summary()
```
この関数は定義したモデルの概要を眺めることができます。

実際にそのごtutorialでオリジナルCNNを作成してますが、さほど精度も出ていません。また、知識としては大規模CNNは学習に時間がかかりますが、ここで作ったCNN程度であったり、一般に使われているCNNを調整するのはそこまで学習に時間がかかりません。実際にkernelを動かしてみてその規模と時間を測ると体感できるかと思います。

```
def convert_to_float(image, label):
    image = tf.image.convert_image_dtype(image, dtype=tf.float32)
    return image, label

AUTOTUNE = tf.data.experimental.AUTOTUNE
ds_train = (
    ds_train_
    .map(convert_to_float)
    .cache()
    .prefetch(buffer_size=AUTOTUNE)
)
ds_valid = (
    ds_valid_
    .map(convert_to_float)
    .cache()
    .prefetch(buffer_size=AUTOTUNE)
)

```

の部分については

tf.image.convert_image_dtype: 画像データimageのデータ型をtf.float32に変換。さらに適切な範囲にスケーリングする

AUTOTUNE = tf.data.experimental.AUTOTUNE: データセットのパフォーマンスを自動的にチューニングするために、実行時に利用可能なCPUコア数などに基づいて、最適なバッファサイズや並列処理の数をTensorFlowが自動的に決定。


.cache(): データセットの要素をメモリにキャッシュしようとする。

.prefetch(buffer_size=AUTOTUNE): データのプリフェッチを有効化する。モデルがデータを処理している間に、バックグラウンドで次のバッチのデータを準備しようとしている。

ds_valid ： 検証データセットの前処理

となっています。
【忙しい人向け】仕事のスキマ時間をうまく活用してIPA試験を突破する方法

## はじめに

はじめてのアドベントカレンダー Advent Calendar 2024の8日目の記事になります。

2025年4月20日のIPA試験まで残り120日ほどとなりました。

**「なんだ、まだあと120日以上もあるのか…。」**

こういう風に思った方、ガチで危機感を持ったほうが良いです。いや厳しいって。

資格取得には時間がかかります。「最短30日で合格！！」なんて甘い言葉に騙されてはいけません。

特に、仕事をしながらIPA試験に合格するには長い期間をかけて、細く長く学習を継続する必要があります。

私は社会人になってから今まで、IPAの時間を受ける時は1フェーズを30日として、4フェーズに分けて、対策してきました。

今回は私のIPA対方法を紹介します。なお、この学習方法では過去問道場を教材として利用します。 

http://fe-siken.com/s/fekakomon.php

## フェーズ1【午前対策100% 午後対策0%】
まずは午前試験の対策をします。進め方は「**全範囲指定、ランダム出題**」のノック式です。あと、これは非常に大切なことですが、**参考書を読む→問題を解くはNG**です。先に問題を解き始めてください。

また、**初学者の方は、2進数とかの基礎理論は後回しでOK**です。ここから始めると必ずと言っていいほど挫折します。出題率も低いのでこのフェーズでは無視しても大丈夫です。問題の解答網羅率50〜60％くらいを目指します。

ネスペなどレベル4の試験を受ける場合は、午前1、午前2を順番に進めて、午前1の網羅率が50〜60%達成→午前2を解き始める、のように進んでください。

## フェーズ2【午前対策100% 午後対策0%】
午前試験の対策を続けますが、**問題を解く時間を減らして、参考書を読む時間を増やします**。通勤時間、お昼休憩のスキマ時間で読み進めて、足りない知識を補います。

また、このフェーズで後回しにした基礎理論に取り組みます。解答網羅率80%くらいに到達するのが理想的です。

## フェーズ3【午前対策0% 午後対策100%】
ここから午後試験の対策に入ります。午後問題は過去の問題形式を再利用されやすいので、最低でも5年分、可能なら8年分は解いておきたいです。

まず、当日どの分野を選ぶか決めておきます。個人的には「**必須の選択数＋予備の1個**」を選んでおくのがおススメです。

例えば、応用情報であれば、「セキュリティ」を除いて必須の選択数が3つなので、4つの分野に取り組んでおきます。仮にいずれかの選択肢が難化していたとしても、予備の選択肢に逃げることで、試験当日にオロオロすることを防げます。

解くペースは平日と休日で明確に分けておきます。例えば、平日1問、休日3問のペースで解き進めれば、44問解けるので、4分野に対応したとすれば、11年分に対応できます。

実際は体調不良や時間を確保できずに、ここまで解くことはできないと思いますが、半分のペースでも5年分は対応できるので安心してください。

ネスペのようなレベル4の試験を受けるのであれば、平日は午後1を1問、休日は午後1と午後2を1問ずつ、のようにうまく分けて対策します。

ここで、大切になってくるのは**間違いの原因を可能な限り潰す**ことです。理解があやふやなまま次の問題に進むのはNGです。

## フェーズ4【午前対策50% 午後対策50%】
午前、午後両方の対策を進めます。「通勤時間とお昼休憩で午前対策、夜寝る前に午後問題1問」のように学習スケジュールを固定します。

午前問題は、フェーズ2で網羅率80%近くまで対策できていれば、この時期には問題を見たら反射的に答えが分かるレベルまで極められると思います。

午後問題はフェーズ3で一度解いている問題に再チャレンジします。よほど進捗が悪くない限り、新しい問題を解く必要はありません。間違えた問題は「あ、これは初見で解いた時、こういう理由で間違えたな。」まで思い出すことができれば文句なしです。

簡単ではないかもしれませんが、このスケジュールを崩さずに当日までやり切りましょう。
ここまで読んでいただきありがとうございました。

Xではエンジニアに有益な発信をしていますので、ぜひフォローよろしくお願いします！！

https://twitter.com/satan_engineer
MacOSのターミナルでMySQLのクエリをコピペで一気に大量に流したい

# やりたいこと
作業手順に従ってSQLを更新する場合などに、大量のSQL文をコピペで一気に流したいことがあります。
```sql
update xxx set yyy = 'zzzzz1' where id = 1;
update xxx set yyy = 'zzzzz2' where id = 2;
update xxx set yyy = 'zzzzz3' where id = 3;
update xxx set yyy = 'zzzzz4' where id = 4;
update xxx set yyy = 'zzzzz5' where id = 5;
...
```
# 問題
しかし、そのままコピペしてMacOSのターミナルからMySQLのコマンドラインで流そうとすると、SQLの実行とペーストが連続で実行されるのが原因なのか、実行途中で以下のようにペーストが意図通り実行されずSyntax Errorになってしまうことがあります。（数が多くなると発生しやすくなります）
```
...
mysql> update xxx set yyy = 'zzz
    '> 
    '> update xxx set yyy = 'zzzzz5' where id = 
    '> 
...
ERROR 1064 (42000): You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'zzz'
```
思いつく対処法としては、
- （insert文の場合）`value` ではなく `values` を使って1クエリにする
- コピペを細切れにして実行する
- クエリを記載したファイルを作成し、読み込ませて実行する

などの方法がありますが、いずれもコピペに比べると少し面倒です。
# 解決方法
ペースト途中でSQLが実行開始されてしまうことが原因であるため、改行を取り除いて1行の状態にしてコピペすることで解決しました。この程度の作業であればテキストエディタで簡単にできます。
```sql
update xxx set yyy = 'zzzzz1' where id = 1;update xxx set yyy = 'zzzzz2' where id = 2;update xxx set yyy = 'zzzzz3' where id = 3;update xxx set yyy = 'zzzzz4' where id = 4;update xxx set yyy = 'zzzzz5' where id = 5;...
```
# おわりに
ニッチな状況だとは思いますが、どなたかの役に立てば幸いです。
kaggle tutorial computer vision part 4

https://www.kaggle.com/code/ryanholbrook/the-sliding-window

の解説です。前partでフィルターについての解説を見ましたが、このpartではそのフィルタをどのように画像に適用していくのかの説明を行っています。

![LueNK6b.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627091/00a5eecb-b58a-5300-5633-432f8d8e2d9e.gif)

tutorial　にでてくるこのgifが視覚的な説明となります。


```
from tensorflow import keras
from tensorflow.keras import layers

model = keras.Sequential([
    layers.Conv2D(filters=64,
                  kernel_size=3,
                  strides=1,
                  padding='same',
                  activation='relu'),
    layers.MaxPool2D(pool_size=2,
                     strides=1,
                     padding='same')
    # More layers follow
])
```
layers.Conv2D(...): 2 次元畳み込み層を追加。
filters=64: フィルターの数を 64 に設定。フィルターは、入力データから特徴を抽出する役割を持ちます。ここでのフィルター数は、出力される特徴マップの数のことです。
kernel_size=3: フィルターのサイズを 3x3 に設定。一度に処理する入力データの領域のサイズ（3x3 ピクセル）のことです。
strides=1: ストライドを 1 に設定。ストライドは、フィルターを移動させる際のステップ数です。ここでは、フィルターを 1 ピクセルずつ移動させます。
activation='relu': 活性化関数を ReLU (Rectified Linear Unit) に設定。

その後出てくるコードは視覚的な支援のためのコードで実際的な意味はあまりありません。
Windowsのシリアルポートの取得

Windowsパソコンに接続されているシリアルポートの一覧を出力するツールをGo言語で作成しました。コマンドラインなどから実行すると表示されます。[zero-kb02](https://github.com/sago35/keyboards) はもちろんRaspberry Pi PicoやArduinoなどのマイコン開発などに役立ちます。実は```tinygo ports```の出力とあまり変わらないのですが、他のプロセスによって使用中の場合busyと表示されます。

実行例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1256483/3ca2068e-d00f-3f88-623f-283b6e23344b.png)


## 実行ファイル
https://github.com/rdon-key/serialList/blob/main/bin/serialList.exe
赤丸よりダウンロードしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1256483/b3bab917-db6c-6a79-4a90-7ade15805ee1.png)

## ソースコード
GitHubで公開しています：
https://github.com/rdon-key/serialList/tree/main

## 技術解説

すべてGo言語で記述されています。Windowsのシステム情報を取得する実装例としてご参照いただければと思います。

1. レジストリからシリアルポートの一覧を取得
 ・SYSTEM\CurrentControlSet\Enum\USB
 ・HARDWARE\DEVICEMAP\SERIALCOMM
2. USBデバイスの場合はVID/PID情報を取得
3. Win32 APIで各ポートの使用可能状態をチェック
4. 結果表示

##
シンプルですが、開発時の作業効率向上にお役立てください。フィードバックやプルリクエストも大歓迎です！
BXデザイン室デザイナーの多様性について考える取り組みの話


:::note info
本記事は[LITALICO Advent Calendar 2024](https://qiita.com/advent-calendar/2024/litalico)のシリーズ4の20日目の記事です。
:::

# はじめに 
はじめまして、LITALICOのブランドエクスペリエンスデザイン室（通称 BXデザイン室）に所属している @ayami_n です。


この記事ではBXデザイン室のデザイナーチームで取り組んでいる「多様性について考える取り組み」の紹介と、そこから得た学びについて書きたいと思います。



# そもそも多様性って？

そもそも多様性とは何でしょうか? wikipediaではこのように記載されています。
>多様性とは、ある集団の中に異なる特徴・特性を持つ人がともに存在すること。

デザインの先には必ず「人」がいます。
デザインを作るときに、その先にいる人は多様であるという観点は「障害のない社会をつくる」をビジョンとして掲げているLITALICOのデザイナーとして考えるべき、考え続けるべきことだと感じています。


# 取り組んだこと
### 各年の目標
それぞれの年で以下の目標を立て活動を行ってきました。
- 2023年　今よりも「多様性」の解像度を上げる
- 2024年　多様な観点を用いたデザインの実践と拡大


### 役割分担
この取り組みは主にtoC向けプロダクトを担当しているメンバーの数人が中心メンバーとして取り組んでいます。推進していく中で4つの役割を立てることにしました。
- ①情報を収集すること
- ②情報を溜めること
- ③情報を流通させること
- ④情報について話すこと

この中で私は特に②と③を頑張る人に任命されました。


### ワークショップ
週1回、1時間ペースで以下のワークショップを実施しました。

- 多様性深堀会
- それぞれの視点・言葉で「多様性」を考える
- アンコンシャスバイアスについてのワーク
- カテゴリ整理のワークショップ
    - [Appleの提示しているインクルージョンカテゴリー](https://developer.apple.com/jp/design/human-interface-guidelines/inclusion#Inclusive-by-design)において
      - ①それぞれのカテゴリー毎に、考え得る人物像を出してみる
      - ②それぞれのペルソナに対して、困りが発露しそうなICF項目を並べてみる


### 情報収集
ワークショップと並行して他社が行っている多様性を考慮した施策やプロダクトの情報を集めてslackで共有を行いました。


### 当事者ヒアリング会
当事者の方の声を聞き、自分達が気づいていない視点の理解を深め、プロダクト作りに繋げるために、当事者の方へヒアリングを行いました。
- 視覚障害がある社員さんへのヒアリング
- 聴覚障害があるスタッフさんへのヒアリング



# 学んだこと

### 多様性とは
私が最初に多様性について感じていたのは「自分がわかっていることの外側にあるイメージ」でした。
ワークショップを通して多様性とは何か、多様性を構成する要素は何かということを参加メンバー全員で話し合いながら考えを深めた上でも、やっぱりそのイメージは大きく変わっていません。

人を多様たらしめる要素はある程度共通していても、それらの要素はグラデーションになっていて、それだけ人は多様であり、それぞれが持っている視点が違うことを改めて感じました。

個人的にメンバーのAさんが整理してくれたイラストがしっくりきています。







![スクリーンショット 2024-12-19 20.12.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946199/a96da2d6-96c0-4926-8b6a-e41b3c9421cd.png)


### プロダクトにおける多様性
プロダクトの中で多様性をどう考えていくかについては、ワークショップで得た学びも大きいですが、特に当事者ヒアリングから得た学びが大きかったです。
視覚障害がある社員さんへのヒアリングの中で、VoiceOverを使用して端末を操作する様子を見せていただいたり、どういうところに注目してサイトを見ているかなどを伺って初めて知ったこと、気づいたことがたくさんありました。

KPIを上げるために行った施策が、視覚障害がある方にとっては支障になる場合があるということも実際に目の当たりにしてプロダクトの中で多様性を意識することがまだまだできていないことも痛感しました。

この経験を踏まえてよりどんなに人にとっても使いやすいプロダクトに近づけるようにグロースを続けていきたいです。


# 今後の展望
今後は取り組みの中で以下３つのことを進めていく予定です。
- **①今後はデザイン時にヒントにできる情報群を作る**
    - 多様な観点の項目を対象ユーザーを考えるときのヒントとしてデザイン時に使えるようなアウトプットの用意
- **②多様な観点の深度を上げる**
    - 当事者の方を交えたワークやインタビューの実施
- **③共有範囲の拡大**
    - 「LITALICOのデザイン」に活かしていくための情報共有の検討

# 最後に
多様性についてこうして定期的に時間をとって深掘りできたことがとても貴重な経験となりました。

現時点の個人的な感想になりますが、大切ことは自分と他人は違うことを認識することと、その上でどうしたらプロダクトの先にいる「人」を傷つけないか考えていくことなのかなと思っています。

これからも取り組みを通じて多様性についての考え方を深めていきつつ、デザインに活かせるように精進していきたいと思います。

---
[LITALICO Advent Calendar 2024](https://qiita.com/advent-calendar/2024/litalico)では、明日以降も毎日素敵な記事が公開されます！ぜひチェックしてみてください。

素敵な年末をお過ごしください:gift:
関数型プログラミングの推薦図書

最近、2025年の[関数型まつり（関数型プログラミング）](https://www.notion.so/scalajp/ef21c10f78a4481eaf62ceee7a084a0f?d=bece95a7f3034786b89b01da11b04f0c#55661cf990b54b98bb06861e4a9ea057)の実行委員会メンバーとしてかかわることにしました。
そこで、スポンサーとして書籍販売に関わる方がいたので、関数型プログラミングに関心のある人がどんな本を買いたがるかをリストしてみました。
関数型プログラミングの推薦図書（理論編）は[こちら](https://qiita.com/Trubetzkoy/items/6593edb4bd3d0c69fbde)。

* [ゲーデル,エッシャー,バッハ: あるいは不思議の環](https://amzn.to/4gHYZar)
ダグラス・R. ホフスタッター

1980年代日本でも大ブームを引き起こした数学・対称性・知能・再帰関数・自己参照などの概念について物語やパズルを用いて説明した科学読み物です。
私は英語版を持っていましたが、誤ってストーブで表紙を焼いてしまいました。後に大学の指導教官が日本語版をプレゼントしてくれました。私の青春時代にタオイズムともに衝撃を与えた名作です。

* [ハッカーと画家 コンピュータ時代の創造者たち](https://amzn.to/3DxVODW)
ポール グレアム



LISPプログラミングの達人のグレアムは、当時人気のなかったLISPを使って会社を立ち上げ、成功に導いた。プログラミングの美しさなどについてのエッセー集であり、今読んでも古くない。彼は後にY Combinatorというエンジェル投資会社を設立するが、このY Combinatorという名前はラムダ計算・組み合わせ論理（Combinatory Logic）から取ったものであり、その命名は意味深い。

* [プログラミングHaskell 第2版](https://amzn.to/3ZZJW6O)
Grahum Hutton

書評にもあるように数学読み物のように一気に読めてしまう面白さがあります。計算の理論に基づく数学的面白さをちりばめ、現代プログラミングの抽象化を支える技術についても学べます。

* [LISP 2 (情報処理シリーズ 4-2)](https://amzn.to/3DAhYW8)
P.H.ウィンストン, B.K.P.ホーン

私はこの本でLISPの美しさを知りました。C曲線やドラゴン曲線などの再帰関数による美しい図形や再帰関数による探索アルゴリズムが紹介され、数学パズルの世界に浸ることができます。でも、この本は絶版になっていますが、中古では手に入るようです。

* [活躍する圏論: 具体例からのアプローチ](https://amzn.to/4iJXr1x)
Brendan Fong & David I. Spivak

様々な分野に応用例を見出すことのできる圏論であるが、それを平易に書いている書籍を見つけることは難しい。しかし、その難しい圏論の具体例を交えて紹介している本書は初心者には入りやすいガイドブックになると思う。
【TypeScript】インデックス型（index signature）の使い方

今回は、TypeScriptのインデックス型について調べてみました。

# インデックス型とは
インデックス型とは何でしょうか。

サバイバルTypeScriptでは下記の記述があります。

> TypeScriptで、オブジェクトのフィールド名をあえて指定せず、プロパティのみを指定したい場合があります。そのときに使えるのがこのインデックス型(index signature)です。

<br />

下記のように定義されます。
```ts
type IndexSignatureType = {
  [key: KeyType]: ValueType;
}
```
`KeyType` はプロパティ名の型を表しており、`string` 、`number` 、`symbol` のみ指定可能です。
`ValueType` はプロパティの型を表しており、任意の型を指定可能です。

<br />

これにより、オブジェクトにおいてキーの名前が事前に決まっていない場合や、複数のプロパティが同じ型を持つ場合に、特定のキーの型や値の型を指定できます。

# 具体的な使用例
では、具体的にどのような場面で使用すればよいのでしょうか。
今回はAIに具体例を提示してもらいました。

## ①言語の翻訳データ
インデックス型を使用することで、特定の型に統一された多数のプロパティを持つオブジェクトを定義することができます。

下記は言語の翻訳データを作成する例です。
キーに言語コード、値に翻訳文字列を設定しています。

```ts
type Translation = {
  [key: string]: string;
};

const translations: Translation = {
  en: "Hello",
  ja: "こんにちは",
  es: "Hola",
  fr: "Bonjour",
};

console.log(translations["ja"]); // "こんにちは"
```

## ②APIレスポンスの型定義
動的なデータを扱う場合に役立ちます。

下記はAPIレスポンスの型を定義する例です。
プロパティの型をユニオン型で定義しています。

```ts
type APIResponse = {
  [key: string]: string | number | boolean;
};

const response: APIResponse = {
  status: "success",
  code: 200,
  isAuthenticated: true
};
```

# おわりに
インデックス型を使用することで、柔軟にオブジェクトを設計でき、
安全性も担保できる点が強みかなと思います。

それでは。

# 参考文献
https://www.oreilly.co.jp//books/9784873119045/

https://typescriptbook.jp/reference/values-types-variables/object/index-signature

https://zenn.dev/tsuboi/articles/ee43ddc5a2cd941de138
AWS Certified Solutions Architect - Professional　備忘録②

AWSの認定試験のSAPを取得しようと思っているので
学んだことを書き留めていこうと思います
個人的に資格勉強している内容や参加したクラスルームで学んだことを書きます
受講クラスルーム：Advanced Architecting on AWS

### 受講時の状況
新卒エンジニア　SAA取得済み
業務で一年弱AWSは触っている
調べながら使えはするもののちゃんと理解があるかと言われると微妙。
勢いでAdvancedのクラスを受けてしまったが大丈夫か...と思っていました。
→講師の方に丁寧に解説して頂いて、思ったより理解できて、非常にタメになりました。

## AWSアカウントの複数運用について
なぜ、アカウントを複数作るのか？

1.ログを生成しているアカウントとは別のアカウントにログを保存する
　AWSログと設定データを一元的に保存、保護、処理できる
　複数アカウントでセキュリティのモニタリングとコンプライアンスの確認を簡素化する
 
2.リソース保護を一元化する
　AMI、EBS、Service Catalogなどを親アカウントから一つ以上の関連アカウントに共有
  →デプロイを一元管理することができる。
　許可されたユーザのみがそれらのリソースを変更できるように権限を最適化できる
3.開発用、検証用、商用に分ける
　検証段階のデプロイが商用に影響を与えることを防ぐ。また権限管理も簡単になる。

##  IAM アイデンティティセンター
・AWSアカウントおよびクラウドへのSSOアクセスを一元管理するサービス
SAMLをサポートするカスタムアプリケーションに対するアクセスとアクセス許可を
 管理する場合にも役立つ

#### 主な機能
・ユーザとグループの作成管理を行いSSOを一元管理
・既存の企業IDの利用
・既存のIAMユーザ、ロール、ポリシーとの共存
・ユーザはIDプロバイダーに一回ログインすれば良い
・OrganizationsやAWS APIと統合されている

#### アイデンティティセンターの設定
 1. サービスを有効化するとデフォルトのストアが作成される
 2. そのストアでユーザとグループを直接管理できる
 3. ユーザーを作るとデフォルトでEメールが送信され、独自のパスワードを設定できる
 4. そのメールとパスを使用することでユーザポータルにサインインし、
    割り当てられた全てのアカウントとアプリケーションに一箇所からアクセスできる
    
必要に応じて、既存のAWS Directory Service for Microsoft Active Directory
に接続し、ActiveDirectory管理ツールでユーザ管理できる

外部のIDプロバイダからIAMアイデンティティセンターにユーザとグループを
プロビジョニングし、アクセス許可を管理することもできる

## AWS Organizations
・複数アカウントの管理を簡単にするリソース
・例えばIAMポリシーは特定のアカウントに付与するのが常だが、
　SCPを適用することで組織(OU)単位でのアカウントグループアクセス制御できる。
・各アカウント請求の一括管理もできる。

#### 特徴
　・SCPとIAMがどちらもアクセス許可しているリソースにのみ実行アクセス可
 　（どちらか片方ではNG）
  ・組織のアカウント内にあるリソース間でタグを標準化できる
  ・SCPのみではアクセス許可できず、IAMと組み合わせて用いる
  　→明示的な許可ではなく、IAMで許可されているアクションが
   　本当に許可されているかのフィルタというイメージ
  ・リソースベースのポリシーには直接影響しない
  ・デフォルトのSCPはFullAWSAccess

  ## AWS Control Tower
・組織に複数のAWSアカウントがある場合、クラウドのセットアップとガバナンスの
　設定は時間がかかってしまうのでそういった際にこのリソースを使う
 　数回クリックするだけで新しいAWSアカウントをプロビジョニングできる
・OrganizationやIAMアイデンティティセンター、Service Catalogなどを組み合わせて
　作成することができ、基準に合ったアカウントを作成できる
・ダッシュボードでアカウントやOUごとの基準を満たしていないリソースを確認できる

 #### 管理アカウント
 ランディングゾーン専用に作成したアカウントのこと
 Accout FactoryのプロビジョニングやOU、コントロールの管理も行う

 #### ランディングゾーン
 適切に設計されたマルチアカウントのAWS環境で
 セキュリティやコンプラに準拠した基準となる環境

 #### コントロール
 継続的なガバナンスを提供するルールのこと
 下記のような対応がある
 予防：SCP(ポリシー違反を禁止)
 検出：AWS Config(コンプラ違反の検出)
 プロアクティブ：CloudFormationフック(リソースか基準を満たすことを確実にする)

 #### Account Factory
 組織のアカウントプロビジョニングワークフローの自動化を行う
 テンプレートを使用することで新アカウントのプロビジョニングを標準化できる
 Service Catalogを用いることで、より詳細なリソース単位のプロビジョニング
 ができる。(この時リクエストしたユーザにサービスへのフルアクセスを許可する必要はない)

 #### ダッシュボード
 クラウド管理者がランディングゾーンをモニタリングでき、
 基準を満たしていないリソースを確認する


## まとめ
単一アカウントから複数アカウントへ移行する方法やその時に
有用なリソースをまとめました。これらのサービスの理解もまだまだなので、どんどん
内容を濃くできるよう学ぶ度に編集していこうと思います。
どういうときはUIライブラリに頼り、どういうときは頼らない方が良いのか

## この記事の概要

世の中には色々なUIライブラリがあります。
有名なものだと[MUI](https://mui.com/)や[Chakra UI](https://www.chakra-ui.com/)など。

便利な場面もありますが、ライブラリだからこその大変な場面もあります。

どういうときはUIライブラリに頼り、どういうときは頼らない方が良いのか、という観点を記事にしました。

:::note warn
裏付けされたデータや理論があるわけではなく、自分の経験をもとにした内容です。1つの観点として参考にするくらいの気持ちで読んでください。
:::

:::note warn
ここでいうUIライブラリは「見た目があるライブラリ」です。つまりヘッドレスUI系は除いています。あれらを含めると条件がまた複雑になってくるので、この記事では話を簡単にするため、見た目がセットのライブラリだけに言及しています。
:::

## 頼った方が良い場面

### デザイナーが少なくてエンジニアが多いチーム

よくある制作フローは`デザイナーが見た目を作る→エンジニアが実装する`です。
このとき、エンジニアがたくさんいると自然と開発ラインが増えます。
開発ラインが増えていくと、いずれデザイナーが見た目を作るのが追いつかなくなって、ボトルネックになります。

このとき、デザイナーが1からデザインデータを作っていると`デザイナー人数 * 3`くらいの開発ライン数で限界を迎えることが多いように思います[^1]。

[^1]: もちろん線形に増えるわけではないですが、単純化するならこんな感じ、というイメージです。

しかしUIライブラリを使えば細かな部分の制作時間を短縮できるので、開発ラインの上限が高まります。

### 社内用の業務効率化ツールなどを作る場面

言い方は悪いかもしれませんが、社内用のツールの場合限界効用の逓減が早いです。

ざっくりと「〇〇を△△できる」時点で大抵の要求はクリアされていて、細かな使い勝手を上げてもリターンが増加しづらいです。

そういった場合デザインデータとしては、既に存在するコンポーネントをざざっと並べて終わりでも良いと言えるでしょう。
となると、UIライブラリは頼もしい存在です。

もちろん使い勝手が良いに越したことはありません。
しかし、どこの組織でも人員・時間ともに有限で、シビアに達成すべき目標があるはずですから、こういう判断になりがちかと思います。

### UIデザインの下書き代わりの用途

ライブラリの作者からしたら悲しい使い方かもしれませんが……。

いわゆるワイヤーフレームの状態から、一気に完成形のデザインデータを仕上げるのはなかなか大変です。
中間地点として、一旦UIライブラリのデータ（例えばFigmaコミュニティにあるデータ）を使って下書きを作る、というのはそれなりに便利です。

ライブラリを土台として見ると、自作しないといけない箇所が明確になったり、意外とライブラリだけで済むことが分かったり、自分達の立ち位置が分かりやすくなると思います。

## 頼らない方が良い場面

### 「ブランドに投資する」などが口にされる組織

ここでは、何をもってブランディングとするのか？というアカデミックな話はしません。
しかし確実に言えるのは、ブランド作りは生半可な気持ちでは実現できないということです。

UIライブラリを使うと良いブランドができないわけでもありません。
しかし目の前にあるプロダクトに対して、微に入り細を穿つまで考えていると、大抵自然と既存のライブラリでは実現できないことが出てきます。

その際に頑張ってライブラリをカスタムするよりは、最初から自分達で作った方が良いかと思います。

:::note alert
他の話もそうですが、この話は特に「そういう傾向が（私の観測範囲では）よく見られる」というだけです。「〇〇をしている or していないから、良いブランド or 悪いブランドである」のような単純過ぎる話にするつもりはありません。
:::

### 一般的なUIから逸脱することが分かっている場面

UI作成において、一般的なものから逸脱すること自体が良くないのですが、ときには必要な場面もあります。

昔から続く商慣習に対応するためのUIや、社内独自のKPI向上のためのトリッキーなUIなど、色々な背景が考えられます。
理想像やべき論だけで言えばそんなしがらみは突っぱねて、一般的なUIにした方が良いのでしょうが……。

予め作るものが一般から逸脱していると分かっている場合、UIライブラリには頼らずに自作した方が良いと思います。

### 公式ドキュメントを読むのが苦手なデザイナーが多いチーム

大抵のライブラリは、カスタマイズするための仕組みが提供されています。
しかしすべてをカスタムできるわけもなく、仕組みが用意されている箇所はカスタムしやすく、カスタムを想定されていない箇所はできない or ハックめいたことをするしかないです。
当たり前の話ですね。

このとき、デザイナーが公式ドキュメントを読むのが苦手だとかなり大変になります。
公式からFigmaライブラリなどとして提供されているデザインデータがあったとして、あくまで見た目のデータなのでどうとでも触れてしまいます。
そして実装のターンになって「このカスタマイズを実現するのは無理かもしれない」と発覚し、修正へ……。

かなり時間がかかりますし、多くの関係者がモヤっとするパターンです。

能力の問題というよりは、ライブラリのドキュメントを見ながらそれに沿ってUIを構築するというフローに慣れているかの問題かと思います。

## 最後に

頼った方が良い場面、そうでもない場面、3つずつ挙げました。
一元的に使うべき使わないべきがあるわけではなく、組織や文化次第かと思います（何においてもそうと言えばそうなのですが）。

この記事で書いたような判断軸がお役に立てば幸いです。
Roo-clineでTerraformのセットアップをしてみた！

## はじめに

今回は、Roo-cline（Clineのカスタマイズ版）を使って、Terraformの環境構築を自動化してみました。Roo-clineは、AIによるコーディング支援ツールで、コマンドの自動実行や環境構築の自動化が可能です。

https://hamaruki.com/roo-cline-ai-dev-experience/

https://hamaruki.com/roo-cline-development-efficiency-guide-part-6-github-deploy/


## Roo-clineとは？

Roo-clineは、Clineというオープンソースのコーディング支援AIをベースにした拡張版です。主な特徴として：

- コマンドの自動承認と実行
- 効率的なファイル編集
- プロジェクト固有のルール設定
- 画像のドラッグ&ドロップサポート
- フィードバック用のサウンドエフェクト

などがあります。

## 実行したプロンプト

<blockquote class="twitter-tweet" data-media-max-width="560"><p lang="ja" dir="ltr">Roo-clineでTerraformのセットアップをしてみた！<br>マジで公式のドキュメントを入れただけでやってくれた！ <a href="https://t.co/po1zDdvudS">https://t.co/po1zDdvudS</a> <a href="https://t.co/hPSn66rhX9">pic.twitter.com/hPSn66rhX9</a></p>&mdash; Maki@Sunwood AI Labs. (@hAru_mAki_ch) <a href="https://twitter.com/hAru_mAki_ch/status/1869711632076861939?ref_src=twsrc%5Etfw">December 19, 2024</a></blockquote> 


以下のシンプルなプロンプトでTerraformのインストールを実行しました：

```bash
下記を参考にしてTerraformをインストールして
---

（Terraformの公式インストール手順）
```

## Roo-clineの動作プロセス

Roo-clineは以下のステップで自動的にTerraformのインストールを実行しました：

1. システム更新とパッケージインストール
   ```bash
   sudo apt-get update && sudo apt-get install -y gnupg software-properties-common
   ```
   - パッケージリストの更新
   - 必要なパッケージの確認

2. HashiCorpのGPGキーの追加
   ```bash
   wget -O- https://apt.releases.hashicorp.com/gpg | gpg --dearmor | sudo tee /usr/share/keyrings/hashicorp-archive-keyring.gpg > /dev/null
   ```
   - GPGキーの自動ダウンロードと登録

3. キーの検証
   ```bash
   gpg --no-default-keyring --keyring /usr/share/keyrings/hashicorp-archive-keyring.gpg --fingerprint
   ```
   - セキュリティ確認のための指紋検証

4. HashiCorpリポジトリの追加
   ```bash
   echo \"deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main\" | sudo tee /etc/apt/sources.list.d/hashicorp.list
   ```
   - システムに合わせたリポジトリの自動設定

5. パッケージ情報の更新
   ```bash
   sudo apt update
   ```
   - 新しく追加したリポジトリの情報を取得

6. Terraformのインストール
   ```bash
   sudo apt-get install terraform
   ```
   - パッケージのダウンロードとインストール
   - インストール結果：27.4 MBのアーカイブをダウンロード
   - 90.2 MBのディスクスペースを使用

7. インストール確認
   ```bash
   terraform --version
   ```
   - バージョン確認によるインストール検証
   - 結果：Terraform v1.10.3が正常にインストール

## Roo-clineの特長的な動作

1. エラー検知と自動対応
   - コマンド実行時のエラーを自動検知
   - 必要に応じて適切な対処を実施

2. 進捗の可視化
   - 各ステップの実行状況をリアルタイムに表示
   - 詳細なログ出力による進捗確認

3. 自動化された意思決定
   - システム環境に応じた適切なコマンドの選択
   - 必要なパッケージの依存関係を自動解決

## まとめ

Roo-clineを使用することで、Terraformのインストールプロセスを完全に自動化することができました。通常であれば手動で実行する必要がある複数のコマンドを、単一のプロンプトで実行できる点が非常に便利です。

また、各ステップでの確認や検証も自動的に行われるため、安全かつ確実なインストールが可能になりました。このように、Roo-clineはDevOpsタスクの自動化に非常に有用なツールといえます。

## 参考
- [Roo-Cline GitHub](https://github.com/RooVetGit/Roo-Cline)
- [Terraform 公式ドキュメント](https://www.terraform.io/downloads)


<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
スマホでもQiita記事の目次が見たい！Plasmoでブラウザ拡張機能"Qiita TOC"を作った

:::note info
この記事は「[mofmof Advent Calendar 2024](https://qiita.com/advent-calendar/2024/mofmof)」の19日目の記事です。
:::

はじめてブラウザ拡張機能を作ったので、作ったものと使用したフレームワーク、ライブラリをご紹介します！

![resized_screenshot.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317957/d11cbc24-be47-d5b1-b0b8-b575062dffc4.jpeg)

# 作ったもの

`Qiita TOC`というスマホでQiita記事を閲覧する場合でも目次を見られるようにするブラウザ拡張機能を作りました。
Chromeウェブストアからダウンロードできます。

https://chromewebstore.google.com/detail/qiita-toc/elnjjpnaebfncdhaioicanmdoblppmph

:::note warn
~~Firefox Browser ADD-ONSの方は現在審査中のため、公開されたらリンクを追加します。~~
Firefox Browser ADD-ONSでも公開されてダウンロードできるようになりました！
:::

https://addons.mozilla.org/ja/firefox/addon/qiita-toc/

## 作った背景

Qiitaでは、見出しから自動生成された目次(TOC)が記事本文の右側に挿入されます。
目次は記事の全体像を把握するのに欠かせないものであり、他にも目次から見たいトピックをクリックするとそこまでスクロールしてくれたり、今見ている場所がハイライトされたり便利ですよね。

残念ながらこの目次、画面幅が狭まると表示されなくなってしまいます。
そのため、スマホやタブレットで閲覧する際は逐次読んでいく必要があります。
(こちらはGitHubのDiscussionsでも要望として挙がっていますが、現状ロードマップには追加されていないようでした)

https://github.com/increments/qiita-discussions/discussions/375

そこで、公式リリース(未定)までの間、スマホでも快適にQiita記事閲覧ができるようにブラウザ拡張機能を作ろう！というのがモチベーションです。

# そもそもスマホでブラウザの拡張機能を使えるのか

選択肢は限られていますが、iPhoneユーザーはOrionブラウザ、AndroidユーザーはKiwiブラウザを利用することでブラウザの拡張機能が使えます。

https://kagi.com/orion/

https://kiwibrowser.com/

# どうやって作ったか
## Plasmo

ブラウザ拡張機能開発のフレームワークである`Plasmo`を使いました。
`Plasmo`を使うことでReact等のコンポーネントをWebページへマウントさせることができます。
これにより画面下部のセクションへTOCボタンと目次のダイアログを埋め込んでいます。

https://docs.plasmo.com/framework/content-scripts-ui

### 実装時に困ったところ

後述の`Tocbot`で生成された目次をレンダリングする場所として、`Plasmo`により追加されるShadow DOMへマウントされる要素を指定していたがTocbotから参照できずレンダリングできませんでした。

そのため、Shadow DOMを使用せずにWebページへ直接コンポーネントをマウントさせるため、コンポーネントがマウントされる場所である`Root Container`をカスタマイズしています。
`Plasmo`はこのような場合のコード例も豊富でありがたかったです。

https://docs.plasmo.com/framework/content-scripts-ui/life-cycle#custom-root-container

## Tocbot

目次の生成にはZennの目次実装でも使われている`Tocbot`というライブラリを使用しています。
目次の現在見ている部分にあたるデフォルトのスタイルがQiitaのブランドカラーと近い緑色なのもいい感じです。

https://github.com/tscanlin/tocbot

https://zenn.dev/link/comments/4d10c8dd8315e8

```tsx:content.tsx
  useEffect(() => {
    tocbot.init({
      tocSelector: ".toc", // 生成された目次をレンダリングする場所
      contentSelector: "#content-container", // 目次生成に使用する見出しがある場所
      headingSelector: "h1, h2, h3, h4, h5, h6", // 取得する見出し
      collapseDepth: 6, // 折りたたまずに表示する見出しの深さ
      orderedList: false
    })
    return () => tocbot.destroy()
  }, [])
```

# 今後の対応予定

## v0.0.2

実はすでに審査中...

- アイコン画像の変更
  - アイコン画像配置するのを忘れていてPlasmoのデフォルトアイコンになってしまっていたのでアイコン画像を差し替え
- ダークモード対応修正
  - ビルドしたパッケージにダークモード対応が含まれてなかったので再ビルドしてパッケージ再アップロード

## v0.0.3

以下の調整・追加を予定

- 目次の見出し間の余白が狭いので調整
- 画面幅が770〜991pxの場合は画面下部メニューが表示されないので、左のセクションにTOCボタンを設置

# 最後に

はやいもので今年のアドベントカレンダーも残りわずかですが、たくさん投稿されるQiita記事をスマホで快適に閲覧できる一助になれば幸いです。
よろしければ使ってみてください！
12月でDPをマスターする猫

## はじめに
DPというアルゴリズムを一ヶ月でマスターする!

### 今回の問題
[今日の問題](https://atcoder.jp/contests/dp/tasks/dp_a)
なんかカエルが飛ぶ問題です。
詳しくはリンク飛んでみてください。

猫:カエルが1個先に飛ぶのか2個先に飛ぶのかの２択をすべて考えて最小値を取れば解くことができるのだ。

猫が書いてる様子↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3965294/48ba5f94-5931-d4ea-42fd-cc01ab7fff47.png)
<img src="blob:chrome-untrusted://media-app/93db0e4b-6db7-42ac-b42e-07859277b533" alt="IMG20241219195146.jpg"/>
```python
import sys
sys.setrecursionlimit(1000000)#再帰の上限設定
n = int(input())
hlist = list(map(int,input().split()))

def dfs (a,score):
  if a == n-1:
    return score
  next_a1 = a+1
  next_a2 = a+2
  if next_a1 < n:
    newscore = score + abs(hlist[a]-hlist[next_a1])
    minimum = dfs(next_a1,newscore)
  if next_a2 < n:
    newscore = score + abs(hlist[a]-hlist[next_a2])
    minimum = min(minimum,dfs(next_a2,newscore))
  
  return minimum
print(dfs(0,0))

```

猫:あれ時間オーバーしてる(泣)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3965294/8f31650f-99ba-07d2-e5c8-453f18806a8b.png)
<img src="blob:chrome-untrusted://media-app/dea69472-cf88-4763-a2e9-d68013ed9f21" alt="IMG20241219195233.jpg"/>

主:漸化式みたいに解くと早いよ

```python
n = int(input())
hlist = list(map(int,input().split()))
dp = [1e10]*n#十分大きい値
dp[0] = 0
dp[1] = abs(hlist[1] - hlist[0])
for i in range(2,n):
  mae1 = dp[i-1] + abs(hlist[i] - hlist[i-1])
  mae2 = dp[i-2] + abs(hlist[i] - hlist[i-2])
  dp[i] = min(dp[i],mae1,mae2)
print(dp[n-1])
```

主:n番目の最小値を知るためにはn-1番目の最小値かn-2番目の最小値を見ると高速に求めることができるよ。

猫:理解
pythonモジュールのずぼらな開発

pythonモジュールのずぼらな開発

まだ、自分しか使っていないモジュールの開発がある。
それに対して、最初のうちのズボラな開発のしかたをメモする。

あくまで、個人用の初期の段階でのスタイルです。

# まっとうなやりかた
- github で管理しているリポジトリがある。
- パッケージ化するフォルダ
- scripts/ フォルダ
- test/ フォルダ
の３つのフォルダを区別する。
```
pip install .
```
でパッケージがインストールできるようにする。

(pyproject.toml もしくは、setup.cfg を書く）

スクリプトを書いたら、
pip install .
を繰り返し、
cd scripts; python {スクリプト}
cd test; pytest test_*.py

を繰り返しながら、開発を進めていく。

## まっとうなやり方での気になる点
#### ~~`pip intall . `を繰り返すのが手間である。~~
- (docker 環境の場合には docker build をすることになるだろう。）
- pip をしないまま、古い版のモジュールのライブラリを使って動作させてしまう。
そういう失敗をしてしまいうる。
- 古い版のライブラリで pytest してしまっていることもおこりうる。
（GitHub Actions をすれば、心配はないんだけどね。）
###### 修正
```
pip install --editable .
```
でインストールすれば、pip install .を繰り返すことは回避できます。 

#### 最初のうちは、何をモジュール化すればいいのかを知らない。
- 開発をすすめていくうちに、こういう機能が必要だというのが、山ほどでてくる。


## ずぼらな開発スタイル
- 最初はscripts/ フォルダにパッケージ化するライブラリ、 pytest用のtest_*.py も含めて、保存する。
#### 利点
- pip install . をすることなしに、最新のコードを利用して、スクリプト、testスクリプトが実行できる。
- scripts/ フォルダにあっても, pytest test_*.py はふつうに動く。
- そのような状況で、コードの修正、実行を繰り返す。
- まず、目的の作業を達成できることが大事。
- 次に、再利用性がある部分と、残す必要のなくなっていくコードを分離していく。
##### 順を追って改良していくこと
- パッケージ化するであろう機能を、意味ごとのモジュール用のファイルにする。
- 機能のまとまりを、classに実装した方がいい部分を見極めて　class化していく。
- モジュール内の関数のうち、スコープを狭めていいものは、private化する。
- "_" で始まる名前に変更する。
- パッケージ化する部分と、実行用のスクリプトを分離していく
- あとで、パッケージ化する部分のファイルの置き場所を変えれば十分なようにしておく。

##### 開発が進んで、設計が安定してきたら
- パッケージ化するモジュール用のフォルダを作り、`__init__.py` を置く。
- pyproject.toml もしくは setup.cfg にパッケージ化のために必要な記述をする。
- パッケージ前提のファイル構成に移行する。

## すぼらな開発スタイルその２
独立性が高いリポジトリを、既存のリポジトリから抜き出す

#### まっとうな開発スタイル
開発プロジェクトで、独立性が高いはずであり、他の開発の中でも再利用したいものは、初めから別リポジトリで別パッケージとして開発させる。

#### すぼらなスタイル
- いずれ、別のリポジトリで管理したいものでも、開発の時点では、モジュールファイルを別にする程度で、同じ開発プロジェクトのリポジトリの中で開発する。

#### 利点
- 開発当初のまだ安定していない時点では、別リポジトリにおいて別パッケージとする利点が存在しない。

十分に使い込まれて、testを増やしていったあとに、
以下のように作っていく。
適切なリポジトリ名・パッケージ名を定めて、別のリポジトリを作成し、そこにパッケージのモジュール、scritps/, test/ のディレクトリを作る。

###### 切り出したリポジトリ側の利点
- 既に十分にテストされた状況からリポジトリが始まる。
- リポジトリの履歴がきれいである。

## まとめ
１． 新規リポジトリを作る
２．そこにパッケージのモジュール、scritps/, test/ のディレクトリを作る。
３．　今まで開発していたリポジトリから、対応のファイルをそれぞれのディレクトリにコピーする。
４．パッケージにモジュールには`__init__.py` を置く。
５．pyproject.toml を書く。
６． pip install . でインストールする。
７． scriptsにあるスクリプトが期待する動作をすることを確認する。
８. cd test; pytest test_*.py の動作を確認する。
９. READEME.mdをそのリポジトリの内容に合わせて書く。




### 付記：
python でpyproject.tomlを使った環境設定のツールには
poetry、rye などのツールがでています。
勉強していかなくちゃ。
[Python パッケージ管理ツール比較: Poetry vs Pipenv vs Rye](https://qiita.com/owayo/items/142ac770d1a007e764a9)

--
editable モードについて
[おまけ A: editable mode でのインストール](https://www.lifewithpython.com/2018/07/python-install-package-dev-versions.html#%E3%81%8A%E3%81%BE%E3%81%91-a-editable-mode-%E3%81%A7%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)
Rspecのsubject

#### 暗黙的に課題を定義する
>### Implicitly defined subject
#### exampleグループへの第一引数がクラスだったならば、そのクラスのインスタンスは`subject`メソッドを通じてexampleグループにおいてそれぞれのexampleに公開される
>If the first argument to an example group is a class, an instance of that class is exposed to each example in that example group via the subject method.

#### 以下の例ではsubjectをユーザー向けの概念としてどのように使われるか、exampleからその使用を隠す拡張ライブラリまたは/かつカスタムマッチャーのサポートのためのsubjectを避けることを推奨します
>While the examples below demonstrate how subject can be used as a user-facing concept, we recommend that you reserve it for support of custom matchers and/or extension libraries that hide its use from examples.

* カスタムマッチャー、exampleからその使用を隠す拡張ライブラリとは？
#### トップレベルグループで公開された`subject`
>### subject exposed in top level group

```rb
RSpec.describe Array do
  it "should be empty when first created" do
    expect(subject).to be_empty
  end
end
```
```
Run options: include {:full_description=>/Array/}
1 example, 0 failures, 1 passed
```
* Arrayクラスを全体に公開させる

#### 入れ子のグループにおいての`subject`
>### subject in a nested group

```rb
RSpec.describe Array do
  describe "when first created" do
    it "should be empty" do
      expect(subject).to be_empty
    end
  end
end
```
```
Run options: include {:full_description=>/Array/}
1 example, 0 failures, 1 passed
```
* 入れ子にも影響する

#### 違うクラス付きの入れ子グループの`subject`　（最奥のクラスに なる/勝つ）
>### subject in a nested group with a different class (innermost wins)

```rb
class ArrayWithOneElement < Array
  def initialize(*)
    super
    unshift "first element"
  end
end

RSpec.describe Array do
  describe ArrayWithOneElement do
    context "referenced as subject" do
      it "contains one element" do
        expect(subject).to include("first element")
      end
    end
  end
end
```
```
Run options: include {:full_description=>/Array/}
1 example, 0 failures, 1 passed
```
* テストされるのは`ArrayWithOneElement`クラスで多分Arrayクラスの初期化で空になってArrayWithOneElementの初期化で "first element"が追加されるからテストに通る

https://rspec.info/features/3-13/rspec-core/subject/implicit-subject/
非エンジニアが開発オンボーディングに参加してみた -追加機能開発・実装編-

## はじめに
こんにちは、社会人8年目で元ITコンサルのふるすです！
今年7月、社内公募を通じてDevRelへ異動しました。

先日、オンボーディング課題のカタログ編を投稿しました。

https://qiita.com/furusu_y/items/831ff2706b89d202cf3a

今日はその実装編です！

## ほぼ8年ぶりのプログラミング

プログラミングの勉強をした経験は2回。
1回目は、入社前研修。2回目は、入社後の研修・課題。
その後は業務でSQLを少しと、プライベートでHTMLを少し触ったくらい…

**やれるのか？**

＼為せば成る　為さねば成らぬ　何事も…／
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3827898/7e2f285b-8310-1e1b-035e-45ceb75b106c.jpeg" width="330px">
カタログ編に続き再登場の上杉鷹山

## 実装前に
いきなり実装スタート！といってもさすがに難しいので、Paizaなどの教材を利用して勉強を進めました。
実際にコーディングしてそれを評価までしてくれて、勉強ツールの進化に驚きました。


## いざ実装
カタログをもとに、実装する機能は下記の通り。

・ジャンルの分類機能
・ジャンルタグでのフィルタリング機能
・ステータスによる自動ソート機能
・タスクの完了期日によるアラート

まさに言うは易く行うは難しということで、こういう機能をつけよう→それでこれどうやって実現するんだ？を考えるのが最初は大変でした。
社内のAIツールがなかったら絶対に実装やりきれなかったと思います…。
入社前研修に比べて勉強がすごく楽しかったのもこのツールのおかげだと思います。

あとはデバッグがあまり使いこなせず、今も腹落ちできていない部分があります。
テストケースももっといろいろ想定して作れたんじゃないかな…と振り返ると反省ポイントがたくさん出てきますね。

## 発表会でフィードバックをもらいました

もらったフィードバックは以下の通り。

:no_good_tone1:
・データ更新時の想定に甘いところがある
・サービス層とコントローラー層がごちゃごちゃ

:ok_woman_tone1:
・カタログめちゃくちゃいい
・どのシーンで誰が使うものなのかが整理されていてわかりやすかった
・画面構成も必要な項目と不要な項目と整備されていてぱっと見でわかりやすい構成。何をすればいいのかもすぐにわかる
・実装力がついたらいいエンジニアになれる

## 振り返り
・「データ更新時の想定が甘い」というところ、なんで指摘されるまで気づけなかったんだろうという箇所でした…ほんとになぜ
・カタログほめていただけて嬉しかった。自分でも使ってみたいアプリにできた気がする
**・実装力がついたらいいエンジニアになれる**
→これうれしかったな～逆を言うと今は実装力ないということなんだけど、「誰のための何を作りたいのか」の部分がしっかりしてたらあとはやるだけ！実装力も頑張ってつけたいなぁ

ということでオンボーディング課題は終わったわけですが、本当にやってよかったです！私が今回扱った部分はエンジニアの業務のほんの少しにしか満たないとは思うのですが、これをファーストステップとしてできること・理解できることを増やしていきたいです。

エラーが起きたときに快くご相談にのってくださったみなさま、レビューいただいたみなさま。本当にありがとうございました！
iRICソフトウェア上で動作するプログラムを自由に操るまでの記録（１）「用語の整理：コンパイル・リンク・ビルド」

# 目次
1.[はじめに](#1-はじめに)

2.[プログラムが実行可能になるまで](#2-プログラムが実行可能になるまで)

# はじめに
## この記事の目的・内容
　この記事では、コンパイル、リンク、ビルドといった用語を整理しながら、ソースコードがどのような仕組みで日頃用いるソフトウェアにまでなるのかを説明する。

　これは、初めてプログラミングに触れる人が既存のプログラムを自らの手で改良し、実行可能にすることができるように基礎知識と手順を記すシリーズ記事<qiitaの記事へのリンクをここに入れる>の一部である。

## 前提
　シリーズで一貫して、以下のような環境を想定する。
- 言語：Fortran
- IDE（統合開発環境）：Visual Studio 2022
- コンパイラ：Intel Fortran Compiler Classic (ifort), Intel(R) Fortran Compiler (ifx)
- OS: Windows 

Fortranの開発環境は、[こちらの記事](https://qiita.com/Kazutake/items/a069f86d21ca43b6c153)の方法で構築している。


# プログラムが実行可能になるまで
## 大きな流れ
　ソースコードは、コンパイルを経てコンピュータが理解可能な機械語へと変換されたのち、リンクによって人間が操作可能な実行可能ファイルとなる。
 
 ![g8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3917090/dfb2d25d-e9c5-ba3d-943f-56f00766f743.png)


:::note info
**コンパイル言語とインタプリタ言語**
　プログラミング言語は、それが実行可能になるまでのプロセスによって、**コンパイル言語**と**インタプリタ言語**の2つに大きく分けられる。

　コンパイル言語は、この記事で説明するように、ソースコードを機械語に一括で変換する（コンパイル）言語のことである。FortranやC++がこれに該当する。一方のインタプリタ言語は、ソースコードを機械語に一行毎に逐一変換しながら実行する言語のことである。PythonやJavaScriptがこれに該当する。
:::

## 各工程について
### コンパイル
　コンパイルの過程では、プログラミング言語で書かれたソースコードが、プログラミング言語やCPUに応じたコンパイラによってCPUが解釈実行可能な機械語に翻訳される。
その出力はオブジェクトファイル（拡張子.obj）にまとめられる。例えば、「main.f90」ファイルは「main.obj」となる。

:::note info

**Visual Studioでの挙動**
　Visual Studioの場合、.objはデバックモードならば「プロジェクトのパス/x64/Debug」、リリースモードならば「プロジェクトのパス/x64/Release」に格納されている。

:::

### リンク
単独の.objファイルでは、プログラムを完結できないことがある。リンクでは、オブジェクトファイルにプログラムを動かす際に必要な情報を結び付け、実行可能なファイルに仕上げる。
プログラム中に登場する標準関数をライブラリから呼び出す。。

:::note info
**ライブラリの種類**
　ライブラリファイルには、
- スタティックライブラリ(.lib)
- ダイナミックライブラリ(.dll)

の2種類が存在する。

スタティックライブラリはリンク時にプログラム本体と一体化するのに対し、ダイナミックライブラリは実行のたびに呼び出される。ダイナミックライブラリは複数のアプリケーション間で共有できるので、メモリの節約に繋がる。

スタティックライブラリの一種にインポートライブラリ(.lib)があり、これはオブジェクトファイルの実態ではなく、必要な関数がどのDLLファイルにあり、そのファイルがどこに格納されているかの情報のみを持っている。

:::

### ビルド
コンパイルとリンクを連続して行う操作はビルドと呼ばれる。

# 参考文献
- 矢沢久雄. (2007). プログラムはなぜ動くのか : 知っておきたいプログラミングの基礎知識 (第3版).日経BP社.
Chrome拡張のAuthenticatorを多要素認証で使うべきでない理由

### はじめに
MFA (多要素認証) 設定において、Chrome拡張機能のAuthenticatorを利用することを勧めている記事が多く見受けられます。しかし、多要素認証の目的やその仕組みを考えた場合、この選択には課題があると言えます。本記事では、Authenticator拡張機能の利用が抱える問題点を整理し、多要素認証の本来の目的を再考するメモとしてまとめました。

### 多要素認証とは
多要素認証 (MFA) とは、以下の3要素のうち複数を組み合わせることで、より高い本人確認を行う認証手法です。
- 知識情報（例：パスワード、PINコード）
    - ユーザーだけが知っている情報
- 所持情報（例：スマートフォン、デジタルカード）
    - ユーザーが物理的に所有しているもの
- 生体情報（例：指紋、顔認証）
    - ユーザーの身体的特徴を用いた情報

これらの要素を組み合わせることで、1つの要素が漏洩した場合でも、他の要素によってアカウントが保護される仕組みを提供します。

### Authenticatorの多要素認証の問題点
#### 「所持情報」の要素として不適切
多要素認証では、所持情報の要素を活用することが重要です。通常、この要素はスマートフォンやハードウェアトークンなど、ユーザーが物理的に保持している独立したデバイスを指します。

一方、Chrome拡張機能であるAuthenticatorは、ブラウザ内で動作するため、ユーザーが「所持」しているものとは言い難いです。

例えば、同じPC内でパスワードとTOTPコードを管理している場合、悪意のある攻撃者がPCにアクセスできれば、パスワードとコードの両方を取得される可能性があります。これでは、MFAの目的である「複数の要素を分散して保護する」が達成されません。

### おわりに
スマートフォンでの認証が手間であるため、PC内で完結する拡張機能は確かに魅力的です。しかし、多要素認証を設定する理由や目的を見直す必要があります。特に業務用途で使用する場合、セキュリティポリシーに準拠したツールの選択が不可欠です。

個人利用であれば大きな問題とならない場合もありますが、業務での利用や高いセキュリティが求められる場面では、スマートフォンアプリやハードウェアトークンのようなより安全な選択肢を検討すべきでしょう。
windowsでiverilog その169

# 概要　
windowsでiverilogやってみた。
自作cpu、見つけたので、調査してみた。
練習問題やってみた。
構想編

# 練習問題
elixirでzktcのアセンブラが動くインタープリタを書け。
fizzbuzzを求よ。

# 方針
modが無いsubでやる。
divが無いsubでやる。
x7を仮想コンソールとする。
むずい。



仮想コードで書いてみる。
```
  x1 = 0
loop:
  x1 = x1 + 1
  x2 = x1
  x3 = x1
  x4 = x1
loop0:
  x2 = x2 - 15
  if x2 > 15 jmp loop0
loop1:
  x3 = x3 - 5
  if x2 > 5 jmp loop1
loop2:
  x4 = x4 - 3
  if x2 > 3 jmp loop1
  if x2 != 0 jmp tugi1
  print "fizzbuzz"
tugi1:
  if x3 != 0 jmp tugi2
  print "buzz"
tugi2:
  if x4 != 0 jmp tugi3
  print "fizz"
tugi3:
  x5 = 0
  x6 = x1
loop3:
  if x6 < 10 jmp loop4
  x5 = x5 + 1
  x6 = x6 - 10
  jmp loop3
loop4:
  x7 = 48
  x7 = x7 + x5
  x5 = 0
  x6 = x1
loop5:
  if x6 < 10 jmp loop6
  x5 = x5 + 1
  x6 = x6 - 10
  jmp loop3
loop6:
  x7 = 48
  x7 = x7 + x6
  if x1 < 99 jmp loop
bye:
  ret
```

以上。
Go 1.23におけるX.509証明書関連の変更とその影響について

## はじめに
こんにちは、@prpr_manです。現在、Go言語を用いたマイクロサービスの開発に携わっています。我々のプロジェクトでは、Go 1.22系を使用していましたが、先日1.23にバージョンアップしました。初めは特に問題なく本番環境でも順調に動いていたので「これでヨシッ！」と思っていましたが……。

## CIがたまに失敗するようになった
GitHub Actionsで実行しているテストが**時折失敗する**ようになりました。失敗したテストでは、Dockerコンテナで立ち上げたSQL Serverに接続する箇所で以下のエラーが発生していました。

```
panic: query select: TLS Handshake failed: tls: failed to parse certificate from server: x509: negative serial number
```

問題なくテストが通るときもあればなぜか失敗することもある……。もちろん該当の箇所のコードやテストコードを変更した覚えもありません。この挙動に戸惑いつつ、原因を調査することにしました。

## 原因
調べた結果、原因は比較的早く判明しました。Go 1.23では、`crypto/x509`パッケージにおいて、負のシリアル番号を持つX.509証明書が拒否される仕様に変更されていたのです。公式ドキュメントにも明記されています。

https://pkg.go.dev/crypto/x509@go1.23.0#ParseCertificate

一見、この変更自体に問題はありません。しかし、SQL Serverが提供するX.509証明書のシリアル番号が**負の値である場合がある**ことが判明しました。

https://github.com/microsoft/mssql-docker/issues/895

つまり、**証明書のシリアル番号が正の場合は問題なくテストが通るが、負の場合にテストが失敗する**という状況が発生していました。

## 対応策
この問題を回避する方法として、`GODEBUG`環境変数に`x509negativeserial=1`を設定することで、負のシリアル番号を許可することができます。

実際にGo 1.23の`crypto/x509`パッケージのコードを見ると、環境変数が設定されている場合、負のシリアル番号も許容する処理が追加されています。

```go
	if serial.Sign() == -1 {
		if x509negativeserial.Value() != "1" {
			return nil, errors.New("x509: negative serial number")
		} else {
			x509negativeserial.IncNonDefault()
		}
	}
```

https://github.com/golang/go/commit/db13584baedce4909915cb4631555f6dbd7b8c38#diff-e3cea16ed73b68bdaa41bd72dffb3cbbabe2528712d72080de7e4def46c0dbf4R864-R870

我々のプロジェクトでは、`docker-compose.yml`に以下のような設定を追加し、テスト環境では負のシリアル番号を許容することで問題を回避しました。

```yaml
services:
  app:
    build:
      context: .
      target: debugger
    environment:
      ... 環境変数色々
      - GODEBUG=x509negativeserial=1 
```

## Go 1.23での仕様変更の背景
この変更の背景には、X.509証明書に関するRFC 5280の規定があります。

> The serial number MUST be a positive integer assigned by the CA to each certificate. 

RFC 5280では、シリアル番号は正の整数である必要があると明記されています。しかし、以下のような但し書きにもある通り、RFCに非準拠なCAではゼロや負のシリアル番号を持つ証明書を発行する事があり、これらの証明書を適切に処理する必要があることも書かれています。

> Note: Non-conforming CAs may issue certificates with serial numbers that are negative or zero. Certificate users SHOULD be prepared to gracefully handle such certificates.

https://datatracker.ietf.org/doc/html/rfc5280

これに基づき、Go 1.22以前では負のシリアル番号を許可するようになっていました。ただし、負またはゼロのシリアル番号を持つ証明書を発行するCAは年々減少しており、2024年現在ではこの問題に該当するCAは1件のみ[^1]となっているようです。

そのため、Go 1.23では仕様をRFCに準拠させ、デフォルトでは負のシリアル番号を持つ証明書を拒否するよう変更されたようです。

[^1]: https://github.com/golang/go/commit/db13584baedce4909915cb4631555f6dbd7b8c38

## まとめ
Go 1.23におけるX.509証明書の変更点とその背景、そしてその対応策について解説しました。特に、Dockerコンテナで立ち上げたSQL Serverを利用する場合、この問題に直面する可能性があります。

本記事が、同様の課題に悩む方の参考になれば幸いです。Go 1.23以降の環境に移行する際には、ぜひこの変更を頭に入れておくと良いでしょう。
Security Group for Pods 入門

# はじめに
自分が入社して研修明けてから入った仕事の一つがSecurity Group for Podsに関するものでした。最初は社内単語と思っていたのですが[AWS公式](https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/security-groups-for-pods.html)でも言及されている通信制御方法の一つでした。
この記事ではSecurity Group for Podsとは何かの概略と一般的に導入する場合の利点と注意事項に関してまとめていこうと思います。

# Security Group for Podsとは
Security Group for PodsとはKubernetesのPodレベルでAWS Security Groupを関連つける通信制御方式の一つです。
## 主な利点
Security Group for Podsの一番の利点は細かいネットワークコントロールができることです。

例えばノードレベルで通信制御を行なっていた場合、本来はアプリケーションのPodだけがDBに接続できれば良いのに他のPodにもまとめて通信許可を出しているケースはありませんか？
Security Group for PodsはノードレベルではなくPod単位での通信制御をするため、最小権限の原則に則った構成を実現しやすくなります。
## 導入にあたっての注意
Security Group for Podsは上記を見ると非常に便利ですが、どの環境にもすぐ適応できるわけではありません。
主な問題は大まかに二つあると考えています。

- 導入できるインスタンスタイプが限られる
Security Group for Podsは全てのインスタンスタイプでサポートされているわけではありません。
導入可能なインスタンスタイプは[limits.go](https://github.com/aws/amazon-vpc-resource-controller-k8s/blob/v1.5.0/pkg/aws/vpc/limits.go)の`IsTrunkingCompatible: true`を含むもののみであることを認識しておく必要があります。

- ENIリソースの消費増加
Security Group for Podsを導入する際に各Podは専用のENI(Elastic Network Interface)を必要とします。
これにより利用可能なIPアドレス数が不足し、スケーリングエラー等が発生してしまう場合があります。

# おわりに
Security Group for Podsはうまく導入できればきめ細やかなネットワークセキュリティ制御が可能になります。
この記事が理解の一助になれば幸いです。