OmniAICreator/Qiita-1.07M huggingface dataset:
千種キャンパスの謎のオブジェクトをBlenderで再現した話ーっ！

みなさまこんにちは！アクピリンと申します！

私は趣味でプログラミングや3Dモデリングを利用して作品を作っている学生です！

今回は、N高等学校の名古屋千種キャンパスの前にあるオブジェクトをBlenderで再現してみました！

正式名称が不明なのでタイトルが長くなっていますが、ご了承ください！

※ 以降は『Nオブジェクト』と呼びます。


##  『目次』
・Nオブジェクトとは
・こだわり
・まとめ
・振り返り
・最後に


## 『Nオブジェクトとは』

実物を見ないと何のことかわからないと思うので、まずはこちらの画像をご覧ください！

![Nオブジェクト画像.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3908048/c6accab5-fe5d-f9a0-fdc6-a077d7584dd3.jpeg)


3年間、スクーリングやテストなどでこのオブジェクトを目にしているのですが、調べても何もわからないのですよね...

なので正式名称や制作当時の情報を知っている方がおられましたら、ぜひ教えてください！


## 『こだわり』

そして、実際に再現したモノがこちらです！

![千種キャンパス前のアレ 画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3908048/0f8e784a-4120-9a39-4a4c-9fec86f2e805.png)

どうでしょうか？

かなり似ていませんか？

こちらのオブジェクトは、スクーリングなどで名古屋千種キャンパスに通ったことがある方なら、必ず目にしたことがあると思いますので、

再現度の高さが伝わるはずです！

この作品のこだわりとしては、反射の表現にあります！

みなさん『スーパーマリオ64』はご存知ですか？

その『スーパーマリオ64』には『メタルマリオ』という全身がメタリックのマリオが登場するのですが、

そのメタリックの反射はなんと『お花畑の画像』を貼ることで表現されているのです！

驚きですよね！

※ お手数おかけしますが、気になった方はご自分で検索をお願いします！

その反射の表現を見習い、『Nオブジェクト』では玉の部分に森の画像を貼ることで反射を表現しています！

いかがですかね？

森の画像が貼られているのに、まるでビル街が反射しているように見えませんか？

そこが私のこだわりです！


## 『まとめ』

・玉や土台のバランス、各テクスチャなどを限りなく再現することができた！

製作している中で、Blenderの基礎知識をフル活用して製作できたので、Blenderの復習にもなって非常に良かったです！


## 『振り返り』

・玉はもう少し滑らかな表現でも良かったかも
・背景はもう少し見やすい色に変えるべきだった

などいろいろありますが、個人的にはかなり高いクオリティで再現することができたので、非常に満足しております！

## 『最後に』

私はブレンダーを今年の4月に始めたばっかりの初心者です。

ですが、ZEN Studyの『Blenderをつかった3Dモデリング』を学んだことで、3Dモデリングについて何も知らなかった私でも好きにモノを作れるようになったので、気になっている方はぜひ挑戦してみてください！

※ 案件ではありません。

また、『Times_Chikusa』という千種キャンパスの共有チャットルームに、この作品の画像を載せたところ、非常に好評をいただくことができました！

めちゃめちゃ嬉しかったです！

私はQiitaで記事を書くのが初めてなので、読みずらい部分も多かったと思います！

なので、文章や構成について何かアドバイス等ありましたらぜひ教えてください！

また、モデリングに関しても何かアドバイスがありましたら教えてください！

それでは、最後までご閲覧いただきありがとうございました！
TCP及びUDPの組み込み開発における役割

基本情報技術者試験などのIPA試験を勉強したり、情報系の大学や高専に通っていたりすると通信プロトコルについての勉強をすると思うが…
"アルゴリズムや信頼性等はなんとなくわかるけど…実務においてはどんな感じで使い分けるのだろう？"などという疑問を持っている人は少なくないと思う。
本記事では1年程度実務経験のある筆者が通信プロトコルの代表的な物である**TCP**と**UDP**を組み込み開発にてどう使い分けるのか？について話していく
※なお、本記事ではTCPやUDPの細かい内部構造はブラックボックスとし、組み込み開発等での使用事例を述べていく形にする

# TCPの活用事例
TCPはよくされる説明にもある様に、**信頼性がかなり重要であるという考えの通信プロトコル**である。
組み込み開発においては、IoT家電、スマートロックなど主にローカルネット上で運用する想定のシステムにてTCPを元にしたプロトコルが採用されたりする。（MQTTなど）

![TCPEX.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2817451/c91088b9-9909-eecb-a48b-18dba3c2dc9a.png)

組み込み開発以外で言うと、インターネットやメールの送受信等々、日常生活にて直接触れる様なシステムの大半はこれで運用されているため、IPA試験や授業で学んだレベルだと、信頼性がある分こちらの方がUDPの上位互換に見えてしまうと思う。（少なくとも筆者は実務経験を積む前はそうであった。）
しかし、ハンドシェイクにてメモリをかなり食うなどの要因で組み込み開発においてはUDPの方が相応しい場合も結構ある。

# UDPの活用事例
UDPはよくされる説明にもある様に、**信頼性は捨てて何度でも送りつけなさいという考えの通信プロトコル**である。
組み込み開発においては、バスの車載器など古いデータに価値が無いシステムやエレベータの制御システムなどリアルタイム性がないと人の命が関わる様な物にはUDPを元にしたプロトコルが採用されたりする。（QUICなど）
![UDPEX.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2817451/2c83ef09-80f1-acef-664e-6a2d73f5898c.png)
実際UDPをそのまま使用すると通信が垂れ流しになってしまうのでセキュリティ上良くない
したがって、大体UDPを少し改造した様な物が組み込みの現場では採用されることが多い

# まとめ
組み込み開発においては最新のデータを取らなければいけないシステムが多いのでUDPをベースにした通信プロトコルを現場では使う場合が多い
|  | TCP | UDP |
|:-:|:-:|:-:|
|信頼性  |高い   |低い   |
|リアルタイム性 |低い   |高い   |

追記
MQTPと誤字をしてましたが…正しくはMQTTです。失礼しました。

参考サイト
>https://www.hulft.com/special-column/iot-architecture_01/iot-architecture_05
>https://www.netattest.com/tcp-2023_mkt_tst
Rspecとは

# 一緒に仕事ができてCucumber,Minitestと独立してテストを行う　Rspec
>RSpec is composed of multiple libraries, which are designed to work together, or can be used independently with other testing tools like Cucumber or Minitest.

https://rspec.info/documentation/#:~:text=RSpec%20is%20composed%20of%20multiple%20libraries%2C%20which%20are%20designed%20to%20work%20together%2C%20or%20can%20be%20used%20independently%20with%20other%20testing%20tools%20like%20Cucumber%20or%20Minitest

# Rspecを構成するライブラリ
### rspec-core
>rspec-core: The spec runner, providing a rich command line program, flexible and customizable reporting, and an API to organize your code examples.

>rspec-core provides the structure for writing executable examples of how your code should behave, and an rspec command with tools to constrain which examples get run and tailor the output.

https://rspec.info/documentation/3.13/rspec-core/#:~:text=rspec%2Dcore%20provides%20the%20structure%20for%20writing%20executable%20examples%20of%20how%20your%20code%20should%20behave%2C%20and%20an%20rspec%20command%20with%20tools%20to%20constrain%20which%20examples%20get%20run%20and%20tailor%20the%20output

### rspec-expectations
>rspec-expectations: Provides a readable API to express expected outcomes of a code example.

>RSpec::Expectations lets you express expected outcomes on an object in an example.

https://rspec.info/documentation/3.13/rspec-expectations/#:~:text=RSpec%3A%3AExpectations%20lets%20you%20express%20expected%20outcomes%20on%20an%20object%20in%20an%20example

### rspec-mocks

>rspec-mocks: Test double framework, providing multiple types of fake objects to allow you to tightly control the environment in which your specs run.

>rspec-mocks is a test-double framework for rspec with support for method stubs, fakes, and message expectations on generated test-doubles and real objects alike.

https://rspec.info/documentation/3.13/rspec-mocks/#:~:text=rspec%2Dmocks%20is%20a%20test%2Ddouble%20framework%20for%20rspec%20with%20support%20for%20method%20stubs%2C%20fakes%2C%20and%20message%20expectations%20on%20generated%20test%2Ddoubles%20and%20real%20objects%20alike

### rspec-rails
>rspec-rails: Supports using RSpec to test Ruby on Rails applications in place of Rails' built-in test framework.

>rspec-rails brings the RSpec testing framework to Ruby on Rails as a drop-in alternative to its default testing framework, Minitest.

https://rspec.info/documentation/7.1/rspec-rails/#:~:text=rspec%2Drails%20brings%20the%20RSpec%20testing%20framework%20to%20Ruby%20on%20Rails%20as%20a%20drop%2Din%20alternative%20to%20its%20default%20testing%20framework%2C%20Minitest

https://rspec.info/documentation/#:~:text=rspec%2Dcore%3A%C2%A0,in%20test%20framework

# 感想
* rspec-coreは、あなたのコードがどのように動作すべきかを示す実行可能なサンプルを書くための構造と、どのサンプルが実行されるかを制限し、出力を調整するためのツールを備えたrspecコマンドを提供します
* RSpec::Expectationsを使用すると、サンプル内のオブジェクトに期待される結果を表現できます
* rspec-mocksはrspec用のテストダブルフレームワークで、生成されたテストダ ブルと実際のオブジェクトに対して、メソッドスタブ、フェイク、メッセージの期待値 をサポートします
* rspec-railsは、Ruby on RailsのデフォルトのテストフレームワークであるMinitestのドロップインの代替として、RSpecテストフレームワークをRuby on Railsにもたらします

翻訳を読んでも理解できなかったので手を動かして理解する
画面共有するといつも「コードが見えづらい」と言われ続けた、わいのVSCodeのテーマ

普段からリモートワークがメインで仕事をしているエンジニアです。
オンラインでコードを共有して議論することがあるのですが、いつも「見づらいです」と言われ続けた私のVSCodeのテーマを晒します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11128/a71bfda3-8957-b3a3-c8f5-baee2dcc569b.png)

なお老眼により私自身も見づらくなってきたため、現在は落ち着いたテーマになってます。
加えて、SynthWave（というよりはCustom CSS and JS Loader）を適用すると、スクリーンショット右下にあるように「お前のVSCodeぶっ壊れてるから再インストールしろや」というメッセージが毎回表示されるためいい加減辞めました。

## 使っていた拡張機能

### SynthWave '84

テーマは「SynthWave '84」を使ってます。バックトゥーザフューチャーやブレードランナー感がカッコいいです。そして何より文字が光ります。でも年取って来ると、光のせいで文字が小さいとぼやけて見づらいという致命的問題が発生し始めました。

https://marketplace.visualstudio.com/items?itemName=RobbOwen.synthwave-vscode

これかっこいい、使いたいという（若い）方はぜひ以下の記事も参照してください。

https://qiita.com/_masa_u/items/df3f50f3b86a58041715

### Synthwave x Fluoromachine

この拡張機能に含まれるCSSを使うことで、VSCodeの背景にかっこいい奥行きが生まれます。（さらに見づらくなる）
なお、このテーマの色合いは自分自身でさえコードが見づらくなったため、早急にやめました。

https://marketplace.visualstudio.com/items?itemName=webrender.synthwave-x-fluoromachine

### Custom CSS and JS Loader

この拡張機能はSynthWave '84といっしょに使う必要があります。

https://marketplace.visualstudio.com/items?itemName=be5invis.vscode-custom-css

### settings.jsonの設定

見た目に関わる部分の設定のみ記述します。SynthWave用のCSSへのパスはご自身の環境に合わせて変更してください。
フォントに指定している「UDEV Gothic 35NF」は日英フォントを同時に使う場合に文字間隔がいい感じに調整されるので、普通におすすめです。

```json
{
  // SynthWave用
  "vscode_custom_css.imports": [
    "file:///Users/bon/.vscode/extensions/webrender.synthwave-x-fluoromachine-0.0.14/synthwave-x-fluoromachine.css"
  ],
  "editor.fontFamily": "'UDEV Gothic 35NF'",
  "editor.fontLigatures": true,
  "editor.fontSize": 13,
  "editor.fontWeight": 300,
（以下略）

}
```

udev-gothic:

https://github.com/yuru7/udev-gothic

VSCodeに設定する方法



## いざ適用

適用の順番にもこだわりが必要です。

まずはテーマを変えます。メニューの設定→テーマ→カラーテーマ→SynthWave '84。VSCode再起動
↓
次に Custom CSS and JS LoaderをEnableにします。Macの場合は Command + Shift + P で開くコマンドウィンドウから「Enable Custom CSS and JS」を選んで実行

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11128/37a2fb55-6860-41e5-91d3-1e8eadfc77ed.png)

その後再度再起動
↓
完成！

VSCodeをアップデートするとCustom CSSがリセットされる場合もあるため、そのときは再度上記手順を適用してください。
RFCとは？

「インターネット」といったキーワードで関連づけられて広く公開しておくべきだと思われる情報を公開するための管理された文書シリーズのこと。

たとえば、インターネット中で利用される通信やアプリケーションのプロトコル、経路制御やアドレス割り当てといった運用やルールのコンセンサス（合意事項）がRFCにまとめられています。

参考文献：https://www.nic.ad.jp/ja/newsletter/No24/090.html
【Laravel】－初学者向け　初期設定について②

今回は前回の続きの初期設定Part2となります。

■環境
* Windows11
* XAMPP
* phpMyAdmin

# データベース設定

■事前準備
* まず、XAMPPはApacheとMySQLを起動させた状態にし、MySQLの「Admin」を押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929458/1ff23b6b-5914-4f45-0d89-d269353b9d46.png)

* 外観の設定で言語を「日本語」に設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929458/9927ea12-1b32-4ad8-da90-f5c8ad4536ae.png)

# データベースの作成

* 左バーにある「新規作成」を押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929458/0726bce0-9325-4a13-e56b-eec751a28629.png)


* phpMyAdminからデータベースを下記名前を入れ、「作成」を押下し、作成されていたらOK！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929458/fdf9551b-afef-310c-7a6a-a72135c2f778.png)

# ユーザの作成

* 「権限」を押下
※作成したデータベース名のユーザを作成できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929458/29afb082-c81a-0c43-0006-60b59b1159a6.png)

* 「ユーザアカウント追加する」を押下し、「ユーザ名」とパスワードを設定し、
「データベース（データベース名）へのすべての権限を与える。」をチェックし、「実行」を押下

# ユーザの設定

ユーザの設定を行います。

* 「ユーザアカウント」⇒先ほど作成した「ユーザ名」を押下


* グローバル権限を「すべてチェックする」を押下し、「実行」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929458/b648357c-be08-e49d-1ee7-a632c14b20c1.png)

* VSコードを開き、「.env」を開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929458/46895a99-56fc-0cd5-c6aa-163f6a5bf71b.png)


*「DB_DATABASE」を「データベース名」、「DB_USERNAME」を「ユーザ名」、「DB_PASSWORD」を「パスワード」設定する

```
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=「データベース名」
DB_USERNAME=「ユーザ名」
DB_PASSWORD=「パスワード」
```

* コマンドプロンプトを開き、「php artisan migrate」とたたく

■コマンドプロンプト
```
php artisan migrate
```
■結果
```
INFO Preparing database.
Creating migration table
INFO Running migrations.
```

* PHPMyAdiminに戻り、データベースにいくつかテーブルができていればOK！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929458/92167cf7-8c41-95e4-b61e-ae1228573c7a.png)
directConnection=trueにしないとMongoDBレプリカセットに接続できなかった件

![img-products-mongodb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3904291/7f777972-0e74-f22d-9cb6-5100a189a2ab.png)

この記事は[BeeX Advent Calendar](https://qiita.com/advent-calendar/2024/beex) 2024の10日目の記事です。

## はじめに

外部クライアントからEC2で動作するMongoDBレプリカセットに接続する際、接続が上手くできずハマってしまいました。
今回は解消方法と、調査過程でわかったことを書いてみようと思います。

## 困っていたこと

コマンドライン上でMongoSh、あるいはGUIツール「MongoDBCompass」を使用して、MongoDBへのアクセスを試みました。
その際下記コマンドで複数ホスト名を指定すると接続できない事象が発生しました。

``` 
mongosh "mongodb://<ユーザ名>:<パスワード>@XXX.XXX.XXX.XXX:28017,@XXX.XXX.XXX.XXX:28018,@XXX.XXX.XXX.XXX:28019/?replicaSet=rs0&readPreference=secondaryPreferred&retryWrites=false"
```

ただし、下記コマンドで単一ホストを指定すると接続が可能でした。

- Mongoshの場合(directConnection指定なし)

```
mongosh "mongodb://<ユーザ名>:<パスワード>@XXX.XXX.XXX.XXX:28017/?replicaSet=rs0&readPreference=secondaryPreferred&retryWrites=false"
```

- MongoDBCompassの場合(directConnection=true)

```
"mongodb://<ユーザ名>:<パスワード>@XXX.XXX.XXX.XXX:28017/?replicaSet=rs0&readPreference=secondaryPreferred&retryWrites=false&directConnection=true"
```


## 結論

原因は「レプリカセット構築時のメンバーホスト名」がよろしくなかったようです。
今回私が構築した際は、3プロセスともに「localhost」を指定していました。
```
rs.initiate({ _id: "rs0", members: [{ _id: 0, host: "localhost:28017"},{_id: 1, host: "localhost:28018"},{_id: 2,host:"localhost:28019"}]})
```

おそらく外部ホストから接続する際「directConnection=false」だと、接続URIの情報ではなく、レプリカセット内のホスト名を参照してしまい、その際「localhost」が指定されているとクライアント自身のlocalhostを参照してしまうのではないかと思われます。

:::note warn
警告
この辺は憶測のため、もし詳しい方がいればコメント欄で教えていただけますと幸いです。
:::

修正方法としては、下記2パターンです。

1. **レプリカセット構築時(rs.initate)に「EC2のIPアドレス」を指定して作成**

2. **ホスト名を「localhost」から「EC2のIPアドレス」に変更**

今回は既にレプリカセットを構築しているので、2.変更のパターンで修正してみます。

## 修正方法

レプリカセットの修正方法は少し癖があります。

- 現状の設定を確認

  ```
  $ config = rs.config
  ```

- 設定の変更
  ```
  $ config.members[0].host = 'EC2のIPアドレス:port'
  $ config.members[1].host = 'EC2のIPアドレス:port'
  $ config.members[2].host = 'EC2のIPアドレス:port'
  ```

  ![スクリーンショット 2024-11-28 111029.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3904291/90a64761-5357-1390-c9ac-38a61739d776.png)

- 設定の反映
  ```
  $ rs.reconfig(config)
  ```
  ![スクリーンショット 2024-11-28 111136.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3904291/dafe6aa1-3700-d8ff-8329-1fc732aa493e.png)

- 設定が反映されているか確認
  ```
  $ rs.conf
  ```

修正後はホスト名複数指定しても外部クライアントから接続可能になります。
※もちろん単一ホストだけの接続も可能です。

## 調査の過程でわかったこと

**mongoshで接続する際に単一ホスト名を指定すると「directConnection=true」になる**
[公式ドキュメント](https://www.mongodb.com/ja-jp/docs/mongodb-shell/connect/?msockid=1ab58f656edf666e18789b9a6fac6755)によるとmongoshは以下の条件にあてはまらない場合に「directConnection=true」パラメータを自動で追加するようです。

> - 接続文字列に replicaSet クエリパラメーターが存在する
> - 接続文字列が mongodb+srv:// 接続文字列フォーマットを使用している
> - 接続文字列に複数のホストを含むシードリストが含まれている
> - 接続文字列に directConnection パラメーターが既に含まれている
> directConnection=true の場合、すべての操作は接続 URI で指定されたホスト上で実行されます。

そのため、コマンドライン上からMongoShellで「directConnection=true」指定なしで接続できたのも、
MongoShell側で勝手に「directConnection=true」を追加してくれたことによるものでした。

## おわりに

MongoDBレプリカセット構築時にはまったポイントを今回はまとめました。
読み取り設定やレプリカセットの選挙など、まだ整理したいことがあるので、今後も時間があればMongoDBの勉強は続けていきたいと思います。

この記事が誰かの参考になれば幸いです
入社8年目の元ITコンサルが社内ジョブチェンジした話

# はじめに
こんにちは！ふるすと申します:princess_tone1:
はじめて「Advent Calendar」に参加します。
Qiita自体も初投稿！わくわくしながら記事を書いています。

https://qiita.com/advent-calendar/2024/advent-works-hi

新卒入社して8年目。若手社員が多い弊社では、すっかり中堅どころ？いやベテラン社員？の年次です。
入社以後ずーっと導入コンサルタントをしていましたが、今年の7月に **DevRel**へ異動しました。
# 異動のきっかけ
導入コンサルの仕事は性に合っていました。
お客様やプロジェクトメンバーと同じ方向に向かって働くことに対するやりがい。
お客様の業務がどんどんよくなっていくことを実感できるのも楽しい。そもそも話す仕事が好き。
無事稼働して、お客様から「ありがとう」の言葉をいただいたときの感動はひとしお。

…だけど、せっかくIT企業に入ったなら、製品を触るだけではなくて、その製品を作り、日々維持している人たちのお仕事をもっと近くで見てみたい。
プログラミングは新卒研修でしかやったことがないけれど、何か開発に関わるお仕事をしたい。視野をもっともっと広げたい。
だんだんとそんな気持ちが強くなっていきました。

# ありがた～い社内公募制度
弊社には社内公募制度があります。
年に一度、募集ポジションや応募要項が発表されて、誰でも公募に参加できるという取り組みです。
そんな中で、開発部門の中に技術広報グループがあることを知りました。
学生時代は広告の企画や制作を行うサークルに入っていたり、アルバイトで発信・広報業務をしていたこともあり、募集要項はクリアしていました。

そして何よりも、
>**『「憧れる」仲間が居る』『仲間の「憧れ」になる』を実現している「弊社開発」のブランディングを確立します**

このミッションに惹かれて応募を決めたのでした。

# ふるす、カルチャーショックを受ける
異動当初は毎日カルチャーショックを受けていました。
同じ会社なのに、組織が変わるとこんなにいろいろと違うんだと楽しくもありました。

たとえば「**スプリント**」という概念。
コンサル時代は案件ごとの進捗管理は行っていたものの、自分の仕事を期間単位で区切ることはしていませんでした。
しかしDevRel異動後はこの概念を持って仕事ができているため、成果を短いスパンで評価しやすく、**短距離型の私には合っているな**と感じています。

また、コンサル時代は案件ごとに必ず週次の打ち合わせやMTGがあったため、それらをきちんとこなしていけば「**前に進んでいるぞ！**」という感覚があったのですが、DevRelの仕事は答えがないこともあり、セルフマネジメントをしっかりして仕事を作り出さないと成果を出せないのでは、という怖さも感じています。これはバックオフィス業務ならではの悩みかもしれません。

~~あとは単純にお客様対応がなくなり、電話や連絡が来るたびに「びくっっ」とすることがなくなりました:joy:~~

そのほかにもいろいろと文化の違いを感じることがあり、日々勉強です。

# これからのこと
考えないといけないこと・やりたいこと・やらないといけないこと…たくさんあります。
が、持ち前のポジティブシンキングと行動力で楽しくはたらいて、組織のミッションを達成していければと思っています！

Qiitaの記事もどんどん書いていく予定なので、これからどうぞよろしくお願いいたします:star2:
ここまで読んでいただきありがとうございました！
デバイスの管理（連載第24回/25回）

# はじめに
システムのハードウェアデバイスを管理することは、トラブルシューティングや新しいデバイスの追加において重要です。ここでは、`lsblk`、`lsusb`、`lspci`、`mount`、`umount` の基本的な使い方を紹介します。

# コマンド説明
#### `lsblk` - ブロックデバイスの表示

`lsblk` コマンドは、システムに接続されているブロックデバイスの情報を表示します。

***主なオプション***
-f : ファイルシステム情報を表示
-d : ディスクのみを表示
-l : リスト形式で表示

```powershell
# ブロックデバイスの情報を表示：
lsblk
# ファイルシステム情報を含むブロックデバイス情報を表示：
lsblk -f
```

#### `lsusb` - USBデバイスの表示
`lsusb` コマンドは、システムに接続されているUSBデバイスの情報を表示します。

***主なオプション***
-v : 詳細情報を表示
-t : ツリービューで表示

```powershell
# USBデバイスの情報を表示：
lsusb
# 詳細情報を表示：
lsusb -v
```


#### `lspci` - PCIデバイスの表示
`lspci` コマンドは、システムに接続されているPCIデバイスの情報を表示します。

***主なオプション***
-v : 詳細情報を表示
-t : ツリービューで表示
-k : デバイスドライバ情報を表示

```powershell
# PCIデバイスの情報を表示：
lspci
# デバイスドライバ情報を含む詳細情報を表示：
lspci -v -k
```

#### `mount` - デバイスのマウント
`mount` コマンドは、デバイスを指定されたマウントポイントにマウントするために使用されます。

***主なオプション***
-t : ファイルシステムのタイプを指定
-o : マウントオプションを指定

```powershell
mount [オプション] デバイス マウントポイント
# 外部デバイスをマウントする：
sudo mount /dev/sdb1 /mnt
#特定のファイルシステムタイプを指定してマウントする：
sudo mount -t ext4 /dev/sdb1 /mnt
```

#### `umount` - デバイスのアンマウント
`umount` コマンドは、指定されたマウントポイントからデバイスをアンマウントするために使用されます。

***主なオプション***
-f : 強制的にアンマウント
-l : 忙しいファイルシステムを遅延アンマウント

```powershell
# 例
umount [オプション] マウントポイントまたはデバイス
# マウントポイントからアンマウントする：
sudo umount /mnt
# デバイスをアンマウントする：
sudo umount /dev/sdb1
```


応用例
```powershell
# システムの全ブロックデバイスを表示
lsblk -a
# 特定のUSBデバイスの詳細情報を表示
lsusb -s 001:002 -v
# PCIデバイスのツリービューを表示
lspci -t
# 新しいファイルシステムを作成してマウント
sudo mkfs.ext4 /dev/sdb1
sudo mount /dev/sdb1 /mnt
# 特定のマウントポイントを強制的にアンマウント
sudo umount -f /mnt
```

# おわりに
デバイスの管理の基本的なコマンドを使用することで、システムのハードウェアデバイスを効率的に管理し、トラブルシューティングが容易になります。

次からの記事では、2>&1 の使い方と応用について解説します。

https://qiita.com/yu1016/items/54f312636e180e38d612

一覧

https://qiita.com/advent-calendar/2024/pig
WinMergeをCLIで動かす

# はじめに
職場でこんなことを言われました
上司「サーバ上に置いてある定義ファイルをさ、随時で修正してよ」
私「わかりました」
上司「証跡として**修正前後の差分が分かるようにWinMergeでレポート作って**ね」
私「わかりました」

# とりあえず手作業でやってみた
私「とりあえずサーバにWinSCPでログインして」
私「ほんでダウンロードして」
私「修正したら」
私「修正後の定義ファイルダウンロードして」
私「WinMergeでぽちぽちやってファイル出力して」
**私「・・・・・・めんどくさっ！！！！！**」

# CLIでやってみる
私「WinSCPはCLIで動かす仕組み作ったしWinMergeも出来るでしょきっとｶﾁｬｶﾁｬｯﾀｰﾝ」
私「やっぱあるじゃん」

# 作ってみる
私「楽をするための苦労を惜しまないのがエンジニアというものらしい（最近コーディング的なことしてなかったから息抜きがしたい）」
```WinMergeExec.bat
"C:\Program Files\WinMerge\WinMergeU.exe" C:\WinMergeCliTest\Test1.txt C:\WinMergeCliTest\Test2.txt 
```
#### 比較するファイル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616564/055be979-b314-49d4-74c5-ab4e268ea3d8.png)

#### 実行結果
WinMergeのウィンドウが開いて結果が表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616564/317ab024-c6be-9a60-1b5e-6c0499bca300.png)

→欲しいのは比較結果のレポートファイル

## オプションを色々つけてみる
まずは`/or`オプション

```WinMergeExec.bat
"C:\Program Files\WinMerge\WinMergeU.exe" C:\WinMergeCliTest\Test1.txt C:\WinMergeCliTest\Test2.txt /or C:\WinMergeCliTest\DiffResultReport.html
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616564/29d7aee8-b5e9-909d-ed1b-b51d5ffd4648.png)
- 比較結果のレポートが出力された
- WinMergeのウィンドウがでかでかと出てきて邪魔

`/minimize`オプションを付けてみる
```WinMergeExec.bat
"C:\Program Files\WinMerge\WinMergeU.exe" C:\WinMergeCliTest\Test1.txt C:\WinMergeCliTest\Test2.txt /minimize /or C:\WinMergeCliTest\DiffResultReport.html
``` 
- ウィンドウが出なくなった
- ついでに`/noninteractive`を付けたらコマンドプロンプトが自動で閉じるようになった

`-cfg`オプションでいろいろ遊べるっぽいので業務中遊びたくなったら触ってみたい

# 作った結果
私「こんなん作ったんで爆速になりました」
私「これ渡して手順化すればほかの人に作業任せられるな！」
私「任せたぜ後輩！」
後輩「なんかバッチ動かないんですけど」

WinMergeの実行ファイルの置き場所が変わってた


# 参考
https://manual.winmerge.org/jp/Command_line.html

↑オプションの説明がTBDになっている項目がある

https://qiita.com/mima_ita/items/ac21c0588080e73fc458

↑この記事はほぼすべてこれを見て作った
システム情報の取得（連載第23回/25回）

# はじめに
システム情報の取得は、システム管理やトラブルシューティングにおいて重要です。ここでは、`uname`、`lscpu`、`lsblk`、`df`、`free` の基本的な使い方を紹介します。

# コマンド説明
#### `uname` - カーネル情報の表示
`uname` コマンドは、システムのカーネル情報を表示します。

***主なオプション***
-a : 全ての情報を表示
-r : カーネルリリース情報を表示
-m : マシンハードウェア名を表示

```powershell
uname [オプション]
# 全てのカーネル情報を表示：
uname -a
```

#### `lscpu` - CPU情報の表示
`lscpu` コマンドは、システムのCPU情報を表示します。

```powershell
# CPU情報を表示：
lscpu
```
#### `lsblk` - ブロックデバイス情報の表示
`lsblk` コマンドは、システムのブロックデバイス情報を表示します。

***主なオプション***
-f : ファイルシステム情報を表示
-d : ディスクのみを表示

```powershell
# ブロックデバイスの情報を表示：
lsblk
# ファイルシステム情報を含むブロックデバイス情報を表示：
lsblk -f
```

#### `df` - ディスク使用量の表示
`df` コマンドは、ファイルシステムのディスク使用量を表示します。

***主なオプション***
-h : 人間が読みやすい形式で表示
-T : ファイルシステムのタイプを表示

```powershell
# 例
df [オプション]
# ディスク使用量を表示：
df -h
```

#### `free` - メモリ使用量の表示
`free` コマンドは、システムのメモリ使用量を表示します。

***主なオプション***
-h : 人間が読みやすい形式で表示
-m : メモリ使用量をMB単位で表示
-g : メモリ使用量をGB単位で表示

```powershell
free [オプション]
# メモリ使用量をMB単位で表示：
free -m
```

応用例
```powershell
# カーネルリリース情報の取得
uname -r
# ブロックデバイスのファイルシステム情報を表示
lsblk -f
# CPUアーキテクチャとモデルの確認
lscpu | grep "Architecture\|Model name"
# システムメモリ使用量の確認
free -h
# ディスク使用量の確認
df -h
```
# おわりに
システム情報の取得の基本的なコマンドを使用することで、システムの状態を把握し、トラブルシューティングやパフォーマンスの最適化を行うことができます。

次からの記事では、デバイスの管理について解説します。

https://qiita.com/yu1016/items/50bfc7bc29204b54fb60

一覧

https://qiita.com/advent-calendar/2024/pig
Pythonでコードフォーマッタを適用したい

# Pythonでコードフォーマッタを適用したい

普段は多言語を使っている事が多くPythonのコーディング規約がよく分からないのですが、Pythonでもコーディングスタイルを安定させたいのです。

## PEP8

PEP8がPythonのコーディング規約とのこと

https://peps.python.org/pep-0008/

## Black Formatter

vscodeではBlackフォーマッタが有名だそうです。

https://marketplace.visualstudio.com/items?itemName=ms-python.black-formatter

`settings.json`
```json
  "[python]": {
    "editor.defaultFormatter": "ms-python.black-formatter",
    "editor.formatOnSave": true
  }
```
vscodeでは上記の通り`editor.defaultFormatter`でBlack Formatterを指定します。
2番目の設定のように`"editor.formatOnSave": true`とすることでファイル保存時に自動でフォーマット実行されます。  

明示的にフォーマッタを実行したい場合、デフォルトのショートカット`Shft+Alt＋F`で実行できます。

## 参考


https://www.issoh.co.jp/tech/details/3032/#PEP8

https://qiita.com/nujust/items/e0985240fd461e5c4c0a
Macユーザー必見！Flutter開発の効率が劇的UP！VSCodeで使える必須小技5選

この記事は、株式会社スピードリンクジャパン Advent Calendar 2024 の9日目の記事です。

https://qiita.com/advent-calendar/2024/slj

こんにちは！今回は、**Flutterの開発で私がよく使用している便利な機能**をいくつかご紹介します。これからFlutter開発を始める方や、すでに開発を行っている方でも、きっと役立つテクニックが見つかるはずです。

VSCodeでの開発をより効率的にするため、ぜひ試してみてください！

---

## **1. ウィジェットラップのショートカット**

**操作方法**:

- ウィジェットを選択して`Command + .`を押すと、「Wrap with Container」や「Wrap with Column」などのオプションが表示されます。

**使いどころ**:

ウィジェットを他のウィジェットでラップする作業が簡単になります。例えば、`Column`ウィジェットを`Container`で囲む場合などに便利です。
![スクリーンショット 2024-12-05 18.23.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798484/d860ad9c-5e64-6a3e-a162-ef73bcebe642.png)

---

## **2. Flutter Outlineを活用**

**Flutter Outline**は、コードの構造をツリー形式で表示してくれる便利なサイドパネルです。

**開き方**:

1. VSCodeの左下にある「アウトライン」をクリック。
2. ウィジェット階層が可視化され、編集したいウィジェットをすぐに見つけられます。
![スクリーンショット 2024-12-05 18.26.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798484/e73dccfd-4930-261e-13ef-7b8381389c42.png)

---

## **3. スニペット（コード補完）の活用**

VSCodeには、ショートカットで簡単にウィジェットテンプレートを生成するスニペット機能が用意されています。

**例**:

- **StatelessWidget**: `stless` → `Tab`
- **StatefulWidget**: `stful` → `Tab`

 **使いどころ**:

よく使うウィジェットやメソッドを素早く生成でき、手入力の手間が減ります。
![スクリーンショット 2024-12-05 18.28.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798484/c6e626c7-21f7-0b9d-22e1-5952455e0370.png)

 　　　　　　　　　　　　　　　　　　　↓
                   
![スクリーンショット 2024-12-05 18.28.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798484/604dde4a-109d-4aae-88d2-e74041469c39.png)


---

## **4. 自動インデントとフォーマット**

**設定方法**：

VSCodeの`settings.json`に以下を追加：

```json
"editor.formatOnSave": true,
"editor.formatOnType": true,
```

**使いどころ**：

- **保存時**や**入力中**にDartのコードが自動で整形され、常にきれいなコードを保てます。
- コードの整形を忘れる心配がなく、チーム開発でも統一されたフォーマットが維持できます。

---

## **5. 「Flutter: Save Screenshot」コマンドでエミュレータのスクリーンショットを取得**

**操作方法**：

1. `Command + Shift + P`（Mac）または `Ctrl + Shift + P`（Windows）でコマンドパレットを開く。
2. 「**Flutter: Save Screenshot**」と入力して実行。

**使いどころ**：

- Flutterアプリの画面を簡単にスクリーンショットとして保存できます。
- UIの確認やデザインレビュー、チームメンバーとの共有に便利です。

---

## **まとめ**

今回紹介した小技を活用することで、VSCodeでのFlutter開発がより快適になります。特にショートカットや補完機能をフル活用することで、時間を節約しながら効率的にコードを書いていけるでしょう。
【超入門】PL/SQLとは

## はじめに
 筆者はエンジニア歴が２年目のひよっこプログラマです。よくSQLは触りますがPL/SQLはほぼ触れておらず、前の案件で初めて遭遇しました。自習しようと検索をかけてみると意外と記事や動画、本なども少なく当初は面食らった記憶があります…。そこで！今回は少しでもPL/SQLの情報が増えるよう願いをこめ、まずは超入門編としてソースコードなども使わず、前提知識の紹介をしていこうと思います！:information_desk_person:

 
## PL/SQLとは？
　そもそもPL/SQLというのは、オラクル社のプログラミング言語なのですがSQL単体では難しいような複雑な処理をできるようにしたものです。難しく言うと、非手続き型であるSQLを手続き型に拡張した言語ですね。
 　なんだか難しそうな響き…と感じる方もいるかもしれません。ですが構造は４つのキーワードで構成されており、記述もSQLに繋がるような部分もあり意外と親近感が湧いてくる言語なんです。(筆者だけかもしれませんが…)


## メリット
　まずはPL/SQLのメリットを大きく３つに分けて紹介していきたいと思います:writing_hand:

**➀移植性**
　1つ目は移植性に優れていることです:sparkles:
 　LinuxやWindowsなどOSが違っていてもOracleが動作する環境さえあれば実行できます。なので環境を意識してプログラムを修正したりせず、開発やメンテナンスができちゃうという生産性の高さが特徴です。
 
**➁Oracleとの親和性**
　２つ目はOracleとの親和性の高さです:raised_hands:
　前述したようにPL/SQLはオラクル社が開発した言語なのでOracleで使えるSQLデータ型を全てサポートしています。そのため、SQL間での変換作業がいらず、データのやりとりも効率的かつ柔軟にできます。

 **➂パフォーマンス**
　最後３つ目がパフォーマンスに優れているという点です:star2:
　他の言語でSQLを実行する場合SQLは文単位で送信されるため、発行する文が多ければ多いほど当然処理が増えパフォーマンスに大きな影響を与えます。一方PL/SQLはブロック内の記述も含めてプログラム単位で一括送信し、処理をします。そのため他の言語と比べ、負荷が小さく効率的にプログラムを実行することが可能となっているんです。
 　また、PL/SQLはブロックに名前をつけて解析済みの状態でOracleに格納することができるため、さらに負荷を軽減させることも可能です。
 
 
## 基本構造
　最後にPL/SQLの基本構造を簡単に紹介したいと思います:muscle:
 PL/SQLの構造は大きな塊で構成されているのが大きな特徴です。ブロック構造化言語と呼ばれており、PL/SQLで作ったプログラムのことはPL/SQLブロックと呼びます。ブロックの中には以下の４つのキーワードで構成されています:bulb:
 
・DECLARE：プログラムで使用する変数などのオブジェクトを定義する部分(宣言部)
・BEGIN：具体的な実行内容を記述する部分(実行部)
・EXCEPTION：例外処理を記述する部分(例外処理部)
・END;:終了を宣言

特に定義するものや処理を指定する必要がなければ、宣言部と例外処理部の記述は省略することもできます！また、実行部の中にさらにPL/SQLのブロックを埋め込む(ネストする)ことも可能です。

## おわりに
　今回は入門ということで具体的なコードの書き方などよりもっと前提の知識を備忘録も兼ねて書いてみました。今後ももし機会があればさらに内容を進めていけたらなと思います！自分自身でもいつ遭遇しても身構えずに書いたり修正できるよう都度触れていきたいと思います:fist:
ネットワーク設定（連載第22回/25回）

# はじめに

Linuxシステムのネットワーク設定は、システムの管理やトラブルシューティングにおいて重要なスキルです。ここでは、`ip` コマンドと `nmcli` コマンドを使用した基本的なネットワーク設定の方法を紹介します。

# コマンド説明
#### `ip` - ネットワークインターフェースの設定

`ip` コマンドは、ネットワークインターフェースの設定や表示を行うための強力なツールです。

***主なオブジェクト***
addr : アドレスの表示や設定
link : ネットワークリンクの表示や設定
route : ルーティングテーブルの表示や設定

```powershell
ip [オプション] [オブジェクト] [サブコマンド]
# ネットワークインターフェースのアドレスを表示
ip addr show
# ネットワークインターフェースにIPアドレスを追加
sudo ip addr add 192.168.1.100/24 dev eth0
# ネットワークインターフェースを有効化
sudo ip link set eth0 up
# ネットワークインターフェースを無効化
sudo ip link set eth0 down
```

#### `nmcli` - NetworkManagerのコマンドラインインターフェース
`nmcli` コマンドは、NetworkManagerを使用してネットワーク設定を管理するためのツールです。

***主なコマンド***
con : 接続の表示や設定
dev : デバイスの表示や管理
general : NetworkManagerの一般設定

```powershell
# 例
nmcli [オプション]
# 接続の一覧を表示
nmcli con show
# 新しい接続を追加
nmcli con add type ethernet ifname eth0 con-name "Wired connection" autoconnect yes ip4 192.168.1.100/24 gw4 192.168.1.1
# デバイスの状態を表示
nmcli dev status
# 接続をアクティブ化
nmcli con up "Wired connection"
# 接続を無効化
nmcli con down "Wired connection"
```

応用例
```powershell
# デフォルトゲートウェイの設定
sudo ip route add default via 192.168.1.1
# DNSサーバーの設定
sudo nmcli con mod "Wired connection" ipv4.dns "8.8.8.8 8.8.4.4"
# 特定のネットワークインターフェースの詳細を表示
ip addr show dev eth0
# Wi-Fiネットワークへの接続
nmcli dev wifi connect "SSID_NAME" password "PASSWORD"
```

# おわりに
ネットワーク設定の基本的なコマンドを使用することで、システムのネットワーク管理が効率的に行えます。

次からの記事では、システム情報の取得について解説します。

https://qiita.com/yu1016/items/6a60da5ce8e7c26de264

一覧

https://qiita.com/advent-calendar/2024/pig
ユーザーとグループの管理（連載第21回/25回）

# はじめに
システムのセキュリティと効率的な運用のためには、ユーザーとグループの管理が重要です。ここでは、`useradd`、`usermod`、`groupadd`、`passwd` の基本的な使い方を紹介します。

# コマンド説明
#### `useradd` - 新しいユーザーの追加

`useradd` コマンドは、新しいユーザーをシステムに追加するために使用されます。

***主なオプション***
-m : ホームディレクトリを作成
-d : ホームディレクトリのパスを指定
-s : ログインシェルを指定
-G : ユーザーを追加するグループを指定

```powershell
# 例
useradd [オプション] ユーザー名
# 新しいユーザー john を追加し、ホームディレクトリを作成：
sudo useradd -m john
# 新しいユーザー john を追加し、特定のホームディレクトリとシェルを指定：
sudo useradd -m -d /home/john -s /bin/bash john
```

#### `usermod` - ユーザーの変更
`usermod` コマンドは、既存のユーザーアカウントを変更するために使用されます。

***主なオプション***
-d : 新しいホームディレクトリを指定
-G : ユーザーを追加するグループを指定
-s : 新しいログインシェルを指定
-l : 新しいログイン名を指定

```powershell
# 例
usermod [オプション] ユーザー名
# ユーザー john のホームディレクトリを変更：
sudo usermod -d /new/home/john john
# ユーザー john を追加グループ admin に追加：
sudo usermod -aG admin john
# ユーザー bob のログインシェルを変更
sudo usermod -s /bin/zsh bob
# 新しいユーザー alice を追加し、特定のグループに追加
sudo useradd -m -G developers alice
```

#### `groupadd` - 新しいグループの追加
`groupadd` コマンドは、新しいグループをシステムに追加するために使用されます。

```powershell
# 例
groupadd [オプション] グループ名
# 新しいグループ developers を追加：
sudo groupadd developers
# グループ managers を追加し、ユーザー carol をそのグループに追加
sudo groupadd managers
sudo usermod -aG managers carol
```

#### `passwd` - ユーザーパスワードの設定
`passwd` コマンドは、ユーザーのパスワードを設定または変更するために使用されます。

```powershell
# 例
passwd [ユーザー名]
# 現在のユーザーのパスワードを変更：
passwd
# ユーザー john のパスワードを変更：
sudo passwd john
```

# おわりに
ユーザーとグループの管理の基本的なコマンドを使用することで、システムのセキュリティを維持し、ユーザーの管理が効率的に行えます。

次からの記事では、ネットワーク設定について解説します。

https://qiita.com/yu1016/items/3a9dafaf29c6208ec99e

一覧

https://qiita.com/advent-calendar/2024/pig
2024年版　Windows11にMagentaをインストールする方法

# Magentaの開発環境を構築する方法
[Magenta](https://magenta.tensorflow.org "Magenta")の開発環境を構築しようとした際、エラーが出まくって手こずりました。今後、Magentaのインストールを考えている人は、参考にしていただければ幸いです。

## Anacondaのインストール
```
winget install Anaconda.Anaconda3
```
## 仮想環境の構築
以下の操作はAnaconda Navigatorからでも可能です。


:::note warn
Pythonバージョンは3.7系を選択
:::
```
conda create --name magenta_env python=3.7
conda activate magenta_env
```

## TensorFlowのインストール
**追記 （2024/12/16）**

:::note info
Magentaをインストールする際にTensorFlowも一緒にインストールされます。
:::

## Magentaのインストール
```
git clone https://github.com/tensorflow/magenta.git
cd magenta
pip install -e .
```

## ffmpegのインストール
:::note warn
MP3、AACを扱う場合は必要
:::
```
winget install ffmpeg
```

## おわりに
以上でMagentaのインストールが完了です！！
お疲れさまでした:blush:
頭がいたくなりそうなAWS ParallelClusterとEFAをイメージしよう

こんにちは。
みなさんいかがお過ごしでしょうか。ずっと暖かかったのにいきなり寒くなりましたね。
今年もアドベントカレンダーの季節がやってきました！！

最近、基盤保守から開発に異動して様々な経験をしているしろやまです。
二年目でAWS SAAを取得していないのはさすがにやばいので、模擬試験で難しくて頭を抱えたAWS ParallelClusterとEFAについて、わかりやすく解説したいと思います！！

# AWS ParallelClusterってなんぞや
一言で言うと、たくさんのコンピューターを一つにまとめて使うためのツールです。
具体的なユースケースとしては機械学習のトレーニング、大規模なデータ処理などが挙げられます。
なのでAWS ParallelCluster活用することで、企業や研究機関は必要な計算リソースを迅速かつ効率的に活用できるようになるということです。

## 何をしてくれる？
AWS ParallelClusterは、HPC（High Performance Computing：高性能計算）環境を簡単に構築できる便利なツールです。

HPC（High Performance Computing）環境を作る： たくさんのデータを解析したり、シミュレーションを行ったりするとき、普通のパソコンでは処理が遅くなりますよね。でも、ParallelClusterを使えば、たくさんのコンピューターをまとめて使えるから、すごく速く計算ができちゃいます。

自動設定： これがとても便利！ParallelClusterは、必要なコンピューターリソース（CPUやメモリ）、ジョブスケジューラ（どの仕事をいつやるか決めるプログラム）、共有ファイルシステム（みんなで使うファイルの置き場所）を自動的に設定してくれるんです。設定を自分でする必要が無いので、簡単に使い始められるのがぉっょぃ。

### どんなスケジューラが使える？
AWS ParallelClusterは、ジョブを管理するスケジューラも自動で設定してくれます。皆さんもご存じかと思いますがスケジューラは、どの仕事をいつやるかを決めます。

# EFA（Elastic Fabric Adapter）ってなんぞや
次に、EFA（Elastic Fabric Adapter）について説明します。
EFAを使うと、たくさんのコンピューターが協力して、ものすごく速く計算できるようになるんです、これが！

お気づきの方いますか？

**ParallelClusterで基本の環境を作って、EFAは計算を加速させるイメージです！！**

具体的な例は、、
科学研究やシミュレーション: 地震の予測、天気のシミュレーション、生物学の研究など、巨大なデータと計算が必要なときに、ParallelClusterで基盤を作り、EFAで計算スピードを上げる。
機械学習トレーニング: 大量のデータを使うAIモデルのトレーニングをする場合にも、同じようにParallelClusterとEFAを使って、すごく速くデータ処理ができるようにする。

ですです。

## 何が良いの？
EFAとAWSクラウドを組み合わせることで、計算能力と柔軟性が最大化します。

クラウドの柔軟性： 必要なときに必要なだけコンピューターを借りて使えるから、無駄がないんです。難しい計算や機械学習をするとき、AWSクラウドを使えば簡単に必要なリソースを手に入れられます。

オンプレミス級のパフォーマンス： 自分で持っているデータセンター（たくさんのコンピュータがある場所）のように速くて、効率的に動いてくれるんです。これで、大規模な計算やデータ処理も問題なくこなせます！！

# まとめ
AWS ParallelClusterを使うと、難しい計算やAIのトレーニングに必要な強力なコンピューター環境を簡単に作ることができます！！
EFAを使うと、その計算をもっと速くできます。この2つを組み合わせると、AWSクラウドを使ってとても効率的で強力なコンピューター環境を手に入れることができるます！！みなさん、是非！！（私は使ったことがない笑）

### 参考
https://aws.amazon.com/jp/hpc/parallelcluster/

https://aws.amazon.com/jp/hpc/efa/
PE Tech Evening について

## はじめに

:::note info
この記事はLITALICO Engineers Advent Calendar 2024 カレンダー1の9日目の記事です。前日8日目は、@kamesennin による「[中期開発PJTの失敗を防ぎ、成功へ導くレビュー戦略](https://qiita.com/kamesennin/items/b766e04ecdee49f935f6)」でした。
:::

プロダクト本部プロダクトエンジニアリング（PE）部基盤グループに所属している @eito_katagiri-litalico です。「PE Tech Evening」という社内技術交流の場を1年以上運営してきています。この場の目的や運営方針などを記事にすることで、LITALICO社内外のエンジニアの方々で同じような場を運営したいと考えている方に参考にしていただければと思います。

## イベントの目的

PE Tech Evening を立ち上げたのは、約2年前に入社してから、PE部内の各グループで、Ruby on Rails や Next.js（Vue.js）など同じような技術スタックを使用しているのですが、グループ間での共有や相談があまり活発に行われていないと感じていたためです。

このイベントを通じて、グループの壁を越えた技術交流の「場」を作れたらいいなと考えています。定期的に技術について話せる機会があれば、自然とエンジニア同士の対話も生まれてきて、共有や相談が活発になって欲しいなぁと期待しています。

## イベントの生い立ち

最初は「仕事ナビ」グループ内での技術共有ミートアップとして、約2年前に始まりました。ゲリラ的に開催していましたが、回を重ねていくうちに他のグループからも参加者が現れてきたので、この取り組みをPE部全体のイベントとして、2023年7月に「PE Tech Evening」として立ち上げました。

## 運営方針

運営方針は、「頑張らずに定期的に場を開催し続ける」です。発表する側も運営する側の負担を少なくするために、以下のような運営をしています。

- 発表時間は1時間以内であれば短くても大丈夫です。残りは質疑応答やディスカッションの時間に充てます
- 発表内容は技術・エンジニアリングに関することであれば特に制限はありません
- 発表者がいない場合は、座談会形式でのディスカッションのような形式にして運営側が発表者探しに奔走する必要が無いようにしています
- 運営する側は複数人で委員会方式として、負担を分担するようにしています

## 開催形式と実績

### 開催スケジュール
- 定例会：毎月第1・第3金曜日
- 時間枠：1時間（17から18時）

これまでに約32回開催してきて、毎回10名から20名くらいの方に参加いただいています。開催形式はこんな感じでいろいろ試してきました。

1. 技術共有セッション
   - 実務で使った技術の調査報告
   - 社内読書会での学びの共有
   - 気になる技術トレンドの紹介

2. Lightning Talks（LT）
   - 複数の方による短い発表
   - いろんな視点からの技術トピックの共有

3. ワールドカフェ形式の座談会（3回開催）
   - テーマ（例: GitHub Copilot や ChatGPT などの活用について）を決めてのグループディスカッション
   - みんなで意見を出し合える双方向の対話

## 今後の展望

PE Tech Evening に参加したことがない方や、発表経験のない方にも気軽に参加や発表してもらえるよう何か工夫ができないかと考えています。

技術について話をするという場を定期的に開催してリズムを作ることで、将来は、PE部のエンジニアが主体的に自然と集まって技術について語ったり相談しあえる場になっていけると良いかなぁと思っています。

また、エンジニアリング統括部全体での新しい技術交流の場を作って、プラットフォームエンジニアリング部の方とより広い組織での交流や共有の場ができたらいいなとも考えています。

## おわりに

PE Tech Eveningは、「技術的な交流ができる場」として、これからも細く長く続けていきたいと思っています。そして、もっと広く組織の枠を超えた同じような技術交流の場を新たに作ることができればとも思っています。場を作り続け、そこに人が集まり、自然と技術の対話が生まれることを目指して、これからも続けていきます。

明日10日目は、@yknoguchi による「技術ではないこと書きそうです」だそうです。何を書くのか楽しみですね。
Pandasの基本的な使い方

# Pandasの基本的な使い方

毎回調べなくても良いように、よく使いそうな機能のメモです


## DataFrame

### CSV読み込み

`read_csv()`メソッドを使う

```py
import pandas as pd

df = pd.read_csv(file_path)
```

### 先頭から読み込む行を指定

引数`nrows=行数`で指定

10行読み込み
```py
df = pd.read_csv(file_path, nrows=10)
```

### 先頭から読み込む時にSkipする行を指定

引数`skiprows=行数`で指定

2行Skip
```py
df = pd.read_csv(file_path, skiprows=2)
```

### 列を指定して読み込み

`usecols=xxx`で指定する

index=0,1列目を指定したい場合

```py
df = pd.read_csv(file_path,j usecol=[0,1])
```

index=0,1列目を名前で指定したい場合

```py
df = pd.read_csv(file_path,j usecol=['col_0' ,'col_1'])
```


### ヘッダ無しであることを明示する

通常は先頭行がヘッダ行だと推測されます

```py
df = pd.read_csv(file_path, header=None)
```

### DataFrameの列を指定する

'col_1'列を指定

```py
print(df['col_1'])
```
### DataFrameの複数の列を指定する

'col_1, col_3'列を指定

```py
print(df[['col_1', 'col_3']])
```


# 参考

https://doku-pro.com/pandas_read_csv/#i
【Visual Studio】NuGetとは【初心者向け】

# 概要
Visual Studioのパッケージ管理機能「NuGet」について、あまり知らない人が大まかにイメージできるように簡単にですがまとめてみました。

# 目次
- [どういったツールか](#どういったツールか)
- [NuGetの歴史](#nugetの歴史)
- [NuGetの使いかた](#nugetの使いかた)
- [拡張機能との違い](#拡張機能との違い)

# どういったツールか
読み方は「ニューゲット」もしくは「ヌゲット」と読みます。
公式のNugetのリポジトリに公開されている外部ライブラリをVisual Studioの各プロジェクトにインストールしたり、追加したライブラリのアンインストールやアップデートが簡単にできるようになるツールです。プログラミングの素材の追加に特化したツールのイメージだと思います。
例えば[WPF](#https://ja.wikipedia.org/wiki/Windows_Presentation_Foundation)のソフトウェアアーキテクチャである[MVVMパターン](#https://ja.wikipedia.org/wiki/Model_View_ViewModel)で開発を行おうとする場合、「Prism.Core」や「ReactiveProperty」というパッケージがすごく役に立ちますので、NuGetを使用して追加する場合が多いと思います。
※このパッケージを使用しなくてもMVVMは開発できますが、パッケージにあるdllのメソッド等を使用すると、MVVMパターンでの実装が行いやすくなったり、開発が効率的に進むイメージです。

また使用したいライブラリに依存関係があって色々なdllをダウンロードしないと動かないといった場合も、「NuGet」を使用するとこのような依存関係があるライブラリも含めてダウンロードしてプロジェクトに取り込んでくれます。
※例えば上記の「ReactiveProperty」をNugetでインストールすると、依存関係にある「ReactiveExtensions」というものも自動でインストールしてくれます。

自前で作成したdllをパッケージとして公開することもできます。
※公開の方法はWebで調べると色々なサイトがヒットすると思います。
参考：[クイック スタート: Visual Studio を使用したパッケージの作成と公開 (.NET Framework、Windows)](https://learn.microsoft.com/ja-jp/nuget/quickstart/create-and-publish-a-package-using-visual-studio-net-framework)

# NuGetの歴史
元々2010年に｢ASP.NET MVC3[^1]｣と同時に公開されました。
｢NuGet｣は、かつては｢NuPack｣という名前でしたが、ソフトウェアパッケージにも｢NUPACK｣というものがあったため、混同しないように名前が変更された経緯があるらしいです。
初期のころは、「NuGet」は｢ASP.NET MVC3｣専用という感じだったらしいのですが、その後、｢.NET｣のパッケージ管理機能として成長していきました。
※もともと「NuGet」のリリースが「ASP.NET MVC3」のリリース時と同じタイミングだったので、初期の頃は両者の連携が強化されいったらしいです。

# NuGetの使いかた
私が使用しているVisual Studio 2019では、
`Visual Studioの上部の「ツール」 > NuGetパッケージマネージャー > ソリューションのNuGetパッケージの管理`
を押すとパッケージを管理する画面が表示されましたので、ここからプロジェクトごとにライブラリの追加等を行うことができました。

# 拡張機能との違い
「NuGet」は上記の通り、.NETプロジェクトが対象で、プログラミングの素材の追加に特化しています。適用する対象もプロジェクト単位で選択できます。「拡張機能」はプロジェクト固有のものではなく、Visual Studio自体の機能の追加を行うことができる機能のイメージです。

[^1]:Microsoftが開発した、Webアプリケーションを作成するためのフレームワークです。モデルビューコントローラー(MVC)パターンを採用していて、モデル（Model）、ビュー（View）、コントローラー（Controller）の3つの層でアプリケーションを構築します。2009年3月13日にASP.NET MVC1、2010年3月10日にASP.NET MVC2、2010年4月12日にASP.NET MVC3が公開されました。
「SQLの実行計画ってなに？？」という人向けの実行計画入門

# はじめに
先日、業務で「このSQL文の実行計画取っといてください」と指示を受けたのですが、
そのときの自分は「そもそも実行計画ってなに？？」という状態でした。

この記事では、そんな状態の自分が、なんとか指示をこなすために調べたことを整理して共有してみようと思います。

# そもそも実行計画とは？
・クエリの先頭にEXPLAINを文頭につけると、実行計画というものが取得できるらしい

・実行計画というのは、「クエリがどの手順でデータを取得するかを示す計画書」のようなもの

・具体的に分かるのは以下のような情報
>テーブルのスキャンにインデックスを使っているかどうか
>命令の開始コスト（スキャン対象の行数に関わらずかかるコスト）
>命令の終了コスト（スキャン対象行数が増えると増えるコスト）
>推定行数（スキャン対象となる行数）

# 3つの基本コマンド-EXPLAIN,ANALYZE,VACUUM-
実行計画に関わるSQLコマンドとしては、主にこの3つが挙げられます。
## EXPLAINコマンド
クエリの先頭につけると、実行計画を取得できる。
取得された実行計画は、**統計情報をもとに算出した推定値**であることに注意。
※統計情報についてはANALYZEの説明を参照

（例）
```
EXPLAIN
SELECT *
FROM hoge_table;
```
（出力例）
```
Seq Scan on hoge_table  (cost=0.00..10.24 rows=224 width=153)
```
※Seq Scanは「インデックス使って検索してないよ～」という意味。
※cost=0.00..10.24は、推定開始コストが0.00、推定終了コストが10.24という意味。
## ANALYZEコマンド
統計情報を更新するコマンド。
EXPAINによって取得される実行計画は、推定値を出すにあたり、この統計情報を参照する。
※EXPAINコマンドを実行しても、統計情報の更新は行われない。

統計情報が古いと正しい推定値の実行計画が取得できないため、
**EXPLAINを行う前に必ずANALYZEを実行しておくと安心。**
だが、**後述のVACUUMと一緒に行うと、もっと安心。**

## VACUUMコマンド
DELETE文でレコードを物理削除したり、UPDATE文でレコードを更新したりしても、実は削除前/更新前のレコードは、物理的にディスクの中に残っている。
この残ったデータをクリーンアップするのがVACUUMコマンド。
**特に大規模なデータ削除を行った場合、VACUUMをしないと、テーブルの行数に対してクエリのパフォーマンスが下がることがある。**

# 2つの応用コマンド-EXPLAIN ANALYZE,VACUUM ANALYZE-
##  EXPLAIN ANALYZEコマンド
EXPLAINコマンド単体では推定値しか出ないが、
**EXPLAIN ANALYZEを実行すると実測値も出せる。**

ややこしいが、ANALYZEが入っているからといって、統計情報が更新されるわけではないので注意。

## VACUUM ANALYZEコマンド
こちらはその名の通り、
VACUUMとANALYZEを一緒に実行してくれるコマンド。
実行計画を取得するクエリについて、***そのクエリが関連するテーブル全て***
（FROM句で直接指定しているテーブルやJOINで結合しているテーブルなど）
に。VACUUM ANALYZEをかけてから実行計画を取得すると確実。

# 結局どうすればいいの？？
VACUUM ANALYZE → EXPLAIN ANALYZEの順で実行しておければ、とりあえず間違いないと思います。

（例）
````
-- 関連するテーブルをVACUUM ANALYZE
VACUUM ANALYZE tableA, tableB, tableC;
-- 実行計画を取得（推定値・実測値）
EXPLAIN ANALYZE
[テーブルA,B,Cを結合して値を取得するクエリ]
````
# 取得できたらどう使うの？
色々条件を変えてみて問題ないか（クエリのパフォーマンスが明らかに遅くなっていないかどうかなど）を見ます。
例えば、
・テーブルに登録されている件数を10件→100件→1000件と増やしてみる
・クエリに渡すパラメータの数を増やしてみる
など。

分かりやすい指標としては、以下の項目が極端に変化していたらクエリの見直しが必要です。
>Planning time（最適な実行計画を作るためにかかる時間）
>Execution time（実際にクエリを実行し、データを取得・処理するのに要した時間）

# おわりに
実行計画を取得する分には、とりあえずこの記事に書いてある知識で問題ないはずです。
実行計画の読み方については、長くなるので今回は触れないでおきます。
というか自分も細かいところまでまだ勉強できていません...。
所属コミュニティの紹介 #CATechLounge #42Tokyo

## はじめに

n番煎じなのですが、現在所属しているコミュニティについて簡単に紹介してみます。
なお、この記事の内容は公式なものでなく、単なる個人的な所感です。

## CA Tech Lounge

https://www.cyberagent.co.jp/careers/special/students/tech_lounge/

CA Tech Lounge はサイバーエージェントが提供する「エンジニア志望者向けの学習コミュニティスペース」です。会員費などはなく、完全無料です(入会試験と面接はあります)。
詳細については、室長の宝田さんが投稿されている[1日目の記事](https://qiita.com/takarada/items/a888dbd57295ef95c2a3)や Yoichiro さんの[昨日の記事](https://qiita.com/TechYoichiro/items/1a395eeeaa2cc01162d0)などもぜひ参考にしてください。

https://qiita.com/takarada/items/a888dbd57295ef95c2a3

https://qiita.com/TechYoichiro/items/1a395eeeaa2cc01162d0

### 特長
#### エンジニア社員がメンターをしてくれる

サイバーエージェント所属の現役エンジニアがメンターに就いてくださり、2 週間に 1 度面談を行い、目標や学習プランなど何でも相談することができます。また特定技術について強い方に話を聞きたいなど、他のサイバーエージェント社員と繋げてもらうこともできたりします。（メンターもですが室長のコミット量がすごいので、学習のための要望があればかなり色々と叶えてくれます)

#### インターンやコンテスト等に活発に参加している学生が多い

エンジニア社員だけではなく、巷のつよつよ学生エンジニアみたいな会員が何人もいます。気づけば誰かがどこかのコンテストで優勝したり、優秀賞を取っていたりします。有名な企業のインターンに行っていたり、就職が決まっていたりする人の話も聞けるので、就活や転職のための情報収集にも有用かなと思います。

#### サイバーエージェントについて知れる

メンターや他のエンジニア社員などとランチに行ける制度があり、サイバーエージェントの話を聞ける機会がたくさん用意されています。
そもそもコミュニティスペースがサイバーエージェントのオフィス Abema Towers 内にあり、周辺がサイバーエージェント社員だらけなので、社内の雰囲気なども感じられたりします。

## 42 Tokyo

https://42tokyo.jp/

42 は 「フランス発のエンジニア養成機関」です。42 のキャンパスは世界各地にあり、その内の東京校が 42 Tokyo となります。こちらも学費は完全無料です。
[note](https://note.42tokyo.jp/) などに学生の投稿記事がたくさんあるので、気になる方は見てみてください。

https://note.42tokyo.jp/

### 特長
#### 入学試験 (Piscine) が「つら楽しい」

Piscine について説明する際には、「つら楽しい」という表現がよく使われます。
というのも内容が非公開で詳しく書けないのですが、この入学試験は 1 ヶ月間(土日祝含む 24 時間/日)に渡り開催され、何を行えばいいのかの説明もなく、受験者同士でコミュニケーションをとりつつ課題等に取り組んでいくといったものでした。
そのため時間的な余裕がない方には受験をおすすめしづらいですが、1 ヶ月間フルコミットできる、かつプログラミングを基礎から学びたいような方にとって、とても良い機会になると思います。

#### ピアラーニングで課題に取り組み、学生同士でコードレビューを行う

42 では課題は与えられますが、教科書や講義などが提供されるわけではなく、学生同士でコミュニケーションをとり学び合う、ピアラーニングの形式が取られています。
42 のカリキュラムは 24 時間 365 日開講されており、夜間帯や休日にも多くの学生がキャンパスにいたりします。
学生のバックグランドや年齢層なども様々で、42 で初めてプログラミングを始めた方から、どこかの企業でエンジニアとして働いている方など幅広くいます。

#### 様々なスポンサー企業との接点がある

42 Tokyo ではたくさんのパートナー企業が協賛してくださっており、学生向けの就職系イベントやコンテストなども活発に開催されています。パートナー企業はIT業界だけでなく多岐にわたるので、ユニークなイベントもたくさんあり面白いです。

## それぞれの比較

比較してもあまり意味はないかなと思いつつも、無理やり独断と偏見で以下のように比較してみました。(全てを書くと表に収まらないので、かなり切り取りです。片方に記載があるからといって、もう片方にないわけでもありません)

|  | CA Tech Lounge | 42 Tokyo |
|:-:|:--------------:|:-------:|
|学習方法|目標を設定して学習計画を立てる|ピアラーニングで課題に取り組む|
|内容|実務、個人開発、研究寄り|コンピューターサイエンス寄り|
|分野|Web, iOS/Android, 機械学習/データサイエンス, ゲーム, プライベートクラウド etc.|C/C++/Shell, データ構造, アルゴリズム, OS, グラフィック, サーバー etc. (基礎課程修了後は更に発展)|
|強み|エンジニア社員によるサポート / 学習環境、設備 / 会員コミュニティー|CS 基礎から学べる / プログラミング未経験者多数 / 24 時間 365 日開講|

## おすすめする方について

これも独断と偏見ですが、それぞれのコミュニティは以下に当てはまるような方へ特におすすめできそうです。

### CA Tech Lounge

- 自身の目標や学びたい分野(Web, Mobile, ML/DS, ゲーム等)がある程度定まっている方
- エンジニア社員から話を聞きたい、学習をサポートしてほしい方
- サイバーエージェントに興味のある方(他企業についても情報収集可能)

### 42 Tokyo

- 一からプログラミング(C言語)や CS 基礎、低レイヤー的な内容について、課題を解くことで学びたい方
- ピアラーニング形式に抵抗のない方
- 24 時間 365 日いつでも通学したい方

:::note
両方に所属している方は私以外にも複数いるので、両取りするのも全然ありだと思います
:::

## おわりに

無料でこのようなコミュニティ、学習環境を提供してもらっていることには頭が下がりますが、ありがたく活用させていただいています。
どちらのコミュニティも新規入会者が募集されているので、気になる方はぜひチェックしてみてください！

https://www.cyberagent.co.jp/careers/special/students/tech_lounge/

https://42tokyo.jp/
docker-compose.ymlのエラーについて

# 概要
以下のハンズオンをやっていたところ、躓いたので学んだことを記載

# 該当箇所
### 教材
https://amzn.asia/d/eMBmcXr

┗46ページ

# Docker上でMySQLの起動の設定をする作業
- テキストに書かれている通りにdocker-compose.ymlを作る
```docker-compose.yml
services:
  app-db:
    image: mysql:8
    command:
      --collation-server=utf8mb4_0900_bin
      --transaction-isolation=READ-COMMITTED
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: password
      TZ: Asia/Tokyo
      ports:
      - 53306:3306
```
テキストに従ってコマプロから実行
```
c:\dev>docker compose up -d
validating c:\dev\docker-compose.yml: services.app-db.environment.ports must be a string, number, boolean or null
```
あら？

# 原因はインデント
- こう直す
    - portsのインデントを一段浅くした
    - ~~テキストの写し間違い~~
```docker-compose.yml
services:
  app-db1:
    image: mysql:8
    command:
      --collation-server=utf8mb4_0900_bin
      --transaction-isolation=READ-COMMITTED
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: password
      TZ: Asia/Tokyo
    ports:
    - 53307:3307
```
テキストに従ってコマプロから実行
```
c:\dev>docker compose up -d
time="2024-12-05T17:32:56+09:00" level=warning msg="Found orphan containers ([dev-app-db-1]) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up."
[+] Running 1/1
 ✔ Container dev-app-db1-1  Started
```
できた！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616564/c12744b0-c073-4d7b-b467-07983a95289f.png)

# 感想
- docker-composeへの理解不足
    - モノ自体は知っていたが触るのは初めてだった
- 注意不足
    - 「その通りにやる」系の作業が苦手なのでインデントがずれていることに気が付かなかった
    - おかげで記事一本分のネタができた
MicroPython で USB HID の使い方を調べてみる③

# はじめに

[前回](https://qiita.com/inachi/items/70975592469e508d2d75)では、MicroPythonでキーボード風の機能を実現するためのデバイスを作成しました。今回は USB HID キーボードのプログラミングを行って完成させます。

# mpremote のインストール

micropython-lib からのパッケージインストールには MicroPython プロジェクトが提供しているツール `mpremote` を使います。`mpremote` は [PyPI](https://pypi.org/project/mpremote/) からインストールすることができて、pip を使えば簡単にPCに入れられます。

```bash
$ pip install mpremote
```

# usb-device-keyboard パッケージのインストール

mpremote があれば、micropython-lib からのパッケージのインストールも簡単です。`mip install` サブコマンドでパッケージ名を指定するだけです。

```bash
$ mpremote mip install usb-device-keyboard
Install usb-device-keyboard
Installing usb-device-keyboard (latest) from https://micropython.org/pi/v2 to /lib
Installing: /lib/usb/device/__init__.mpy
Installing: /lib/usb/device/core.mpy
Installing: /lib/usb/device/hid.mpy     
Installing: /lib/usb/device/keyboard.mpy
Done                           
```



# プログラミング

micropython-lib にある[キーボードの例](https://github.com/micropython/micropython-lib/blob/master/micropython/usb/examples/device/keyboard_example.py)を参考に、
プログラミングしてみました。

GPIO18に繋がっている青ボタンにA1キー、GPIO19に繋がっているGPIO19に左シフトキーを割り当ててます。

simple-kbd.py:
```python
import usb.device
from usb.device.keyboard import KeyboardInterface, KeyCode, LEDCode
from machine import Pin
import time


# GPIOとキーコードのマッピング
KEYS = (
    (Pin.cpu.GPIO18, KeyCode.A),
    (Pin.cpu.GPIO19, KeyCode.LEFT_SHIFT)
)


def keyboard_example():
    # GPIOの初期化
    for pin, _ in KEYS:
        pin.init(Pin.IN, Pin.PULL_UP)

    # キーボード登録
    k = KeyboardInterface()
    usb.device.get().init(k, builtin_driver=True)

    # キー入力処理
    print("Entering keyboard loop...")
    keys = []
    prev_keys = [None]
    while True:
        if k.is_open():
            keys.clear()
            for pin, code in KEYS:
                if not pin():
                    keys.append(code)
            if keys != prev_keys:
                k.send_keys(keys)
                prev_keys.clear()
                prev_keys.extend(keys)

        time.sleep_ms(1)


keyboard_example()
```

できたら、Raspberry Pi Pico の Micropython のファイルシステムに `main.py` という名前でコピーします。

```bash
$ mpremote cp simple-kbd.py :main.py
```

# 動かしてみる

青ボタン単独で "a"、赤ボタンと青ボタンを同時に押して "A" が入力できます。

![IMG_1546.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/17a76949-27f7-2ee4-4de7-e5f38077bc58.gif)

# おわりに

以上で USB HID のキーボードインタフェースの動作を確認できました。まだ RP2* 系と samd系でしか使えないみたいですが、どちらも入手性は良いですし、安価でもありますので、あまり不自由することはないのかなと思います。
MicroPython で USB HID の使い方を調べてみる②

# はじめに

[前回](https://qiita.com/inachi/items/d5aec941f54220dd0dcb)は MicroPython でも v1.23.0 から USB HID インタフェースが使えそうなところまで調べてみました。

今回は micropython-lib にある usb-device-keyboard パッケージを使って、極簡単なキーボード風なものを作ってみます。

# 用意するもの

極簡単なキーボード風なものを実現する方法として以下のものを用意しました。

* Raspberry Pi Pico H

ピンヘッダが予めはんだ付けされている Raspberry Pi PICO です。ファームウェアには MicroPython v1.24.1 を使いました。

![IMG_1587.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/5f73a231-3a17-fb3b-1cc7-b61787f87622.jpeg)

* Grove Shield For Pi Pico v1.0

手元にあった Raspberry Pi Pico 用の Grove シールドです。デュアルボタンユニットを繋ぐのに使いました。

![IMG_1588.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/791c8d02-924c-b51a-502f-2085c5199c2c.jpeg)

* M5Stack デュアルボタンユニット

M5Stack用に売られているボタン２つの付いたユニットです Grove のケーブルで繋げられます。

![IMG_1589.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/e7d74ccf-bea3-a2ce-eb1b-e0181c79dfaf.jpeg)

# キーボード風デバイスの組立

組立は Grove を使うので簡単です。Groveシールドに Raspberry Pi Pico とデュアルボタンを差し込むだけです。

![85C2AFE0-D7A2-4255-B64A-4E42A8F2008B_1_105_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/dde78fc2-0c16-6b8e-1505-687405a43177.jpeg)

ディアルボタンは D18 とシルク印刷されているところに差し込みました。こうすると、青ボタンは GPIO18、赤ボタンは GPIO19 に繋がるようです。

![IMG_1544.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/c1a135c9-b76c-3f70-d339-4bca0bee7a9b.jpeg)

これで、青ボタンにはキーボードの Aキー、赤ボタンにはシフトキーを割り当て、青ボタン単独で押したら "a"、赤ボタンと青ボタンを同時に押したら "A" となるようなものを作ってみます。

プログラミングは[次回](https://qiita.com/inachi/items/448eb15bff6b25956bbf)へ。
MicroPython で USB HID の使い方を調べてみる①

# はじめに

以前より MicroPython には USB HID のインタフェースが無いので、キーボード自作などには CircuitPython を使うという話がよくあります。

そこで、最近になっても MicroPython では USB HID が使えないのか調べてみました。

# pyb モジュールには、けっこう前から USB HID インタフェースがある

MicroPython の pyb モジュールには、けっこう前(たぶん v1.9)から USB HID インタフェースがあります。

https://micropython-docs-ja.readthedocs.io/ja/latest/library/pyb.USB_HID.html

この `USB_HID` クラスを使った [記事](https://blog.boochow.com/article/457647476.html)も見つけることができます。

ただ、pyb モジュールが使えるのは pyboard など、STM32 の MCU を積んだ一部のボードに限られるので、自作キーボードなどの目的で入手すること方は少ないでしょう。

![IMG_1586.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/70667e41-df1f-fad1-298d-f3bb74b2d033.jpeg)

# v1.23.0 で追加された USBDevice クラスは使えるか

RP2系、samd系のMCU のポートに限られますが、MicroPython v1.23.0 で machine モジュールに USBDevice クラスが追加されました。

https://micropython-docs-ja.readthedocs.io/ja/latest/library/machine.USBDevice.html

直接 HID をサポートしているわけではありませんが、あらゆる USB デバイスを MicroPython で実装できるとのことです。USBDevice クラスは低レベルAPIとのことで、これをベースにした高レベルAPIは microputhon-lib を参照してくれとのことです。 

https://github.com/micropython/micropython-lib/tree/master/micropython/usb#readme

そこで、micropython-lib を除いてみると HID デバイスの実装がいくつか見つかりました。

[次回](https://qiita.com/inachi/items/70975592469e508d2d75)からは、この micropython-lib にある `usb-device-keyboard` パッケージを試してみます。
OpenID Connectで使用するトークンについて

## 目的
AWS Cognitoの実装の際、ログイン時に返却されるトークンについて気になったので理解を深めるついでにまとめる。またここではCognitoで使用される認証認可のメカニズムであるOpenID Connect(OIDC)の認証認可の流れについては言及しない。


## はじめに
Cognitoの認証時に返却されるトークンは以下の三つ

+ IDトークン
+ アクセストークン
+ リフレッシュトークン

これらのうちIDトークンとアクセストークンはOIDCで使用される。

## IDトークン
### 特徴
OIDCで追加されたトークン。

以下の情報を含む
+ ユーザの属性情報
+ ユーザが認証されたという情報
+ トークンが改竄されたかどうかの情報

### 形式
JWT形式（Json Web Token)
```{ヘッダ}.{ペイロード}.{署名}```
という形式で表される

#### ヘッダ
+ alg: 署名に使用するアルゴリズム
+ typ: トークンの種類の情報

#### ペイロード
ユーザの属性情報(claimという)。これらを検証することで不正ななりすましを軽減できる。
+ sub: 認証されたユーザの識別子
+ name: 認証されたユーザの名前
+ ita: トークンの発行日時を表すタイムスタンプ
+ exp: トークンの有効期限
+ iss: 発行者
+ aud: 受信者
+ nonce: リクエストごとにランダムに変わる値。攻撃者が以前の認証リクエストを再送信してもnonceが異なる場合、正当なトークンとして受け入れられない。

#### 署名
署名情報

### 用途
+ シングルサインオン
    + ユーザの属性情報とそのユーザが認証されたこと、トークンが改竄されてないかが確認できれば他のシステムにログイン可能という仕組み


## アクセストークン


### 特徴
OAuth2.0から引き継がれた概念。
リソースに対するアクセスと操作する権限を持つ



### 用途
リソースに対してアクセスと操作をする


## まとめ
OAuth2.0だとアクセストークンが漏洩した場合、攻撃者はユーザーになりすましてリソースへのアクセスが可能となるが、OIDCの場合、IDトークンを検証することによりなりすましのリスクを軽減することができる。
いずれにしても漏洩時は迅速に無効化する仕組みも重要であると感じた。