OmniAICreator/Qiita-1.07M huggingface dataset:
ブックマークでQRコード生成！

## はじめに
便利なブックマークレットを作ったので、備忘録も兼ねて共有したいと思います。

## ブックマークレットとは
多くのブラウザには、ブックマークを登録する機能がありますが、そのブックマークのURL欄に`javascript:{JavaScript式}`を入力すると、今見ているページで指定したスクリプトを実行することができます。

これを「ブックマークレット」といいます。

## 今回作ったもの
今回は、「今見ているサイトのURLをQRコードにして表示する」という機能のブックマークレットを作りました。

近くにいる人や別の端末にサクッとURLを共有したいときに便利です。

忙しい人のために、先に成果物をおいておきます。

```
javascript:(()=>{const s=document.createElement('script');s.src='//cdn.jsdelivr.net/gh/laddge/mkqr@8e0414904f5d00d427265b69f1234ebeef4ade43/output.js';document.body.appendChild(s)})()
```

上の文字列をブックマークに登録してください。

(適当なサイトをブックマークに登録して、URL欄を編集して上の文字列を入れてください。)

実行するには、QRコードを表示したいページでブックマークを押すだけです。

(AndroidのChromeだと、アドレスバーにブックマーク名を入力すると候補で出てくるのでそれをタップしてください。そのためにもわかりやすくて短い名前にしておくことをおすすめします。)

↓このように表示されます。

![IMG_0896.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637875/41d54ce2-155b-d6ea-e3ac-8f46b90918f3.png)

画面内の任意の場所をクリック/タップすると消えます。

## 実装
作り方を書きます。

node.jsの`node-qrcode`というライブラリを使ってメインの機能を作ります。

https://www.npmjs.com/package/qrcode

コードはこんな感じです。

```typescript:script.ts
import { toDataURL } from 'qrcode'

toDataURL(location.href)
  .then(url => {
    const w = document.createElement('div')
    const s = w.style
    s.width = '100vw'
    s.height = '100vh'
    s.position = 'fixed'
    s.top = '0px'
    s.left = '0px'
    s.backgroundColor = 'rgba(0, 0, 0, .5)'
    s.zIndex = '2147483647'
    s.padding = '16px'
    s.textAlign = 'center'
    w.onclick = () => {
      w.remove()
    }
    const i = document.createElement('img')
    const S = i.style
    S.width = '480px'
    S.maxWidth = '100%'
    S.aspectRatio = '1'
    S.borderRadius = '5%'
    i.src = url
    w.appendChild(i)
    document.body.appendChild(w)
  })
  .catch(e => console.log(e))
```

特に複雑なことはしていません。

あとは、これをesbuildでバンドル化します。

```bash
esbuild --bundle script.ts --minify > output.js
```

GitHubにpushしてjsdelivrのcdnをブックマークレットから読めば完了です。

## さいごに
結構簡単に色々作れるのでぜひ試してみてください！
せんせー、ゲノム編集食品ってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、ゲノム編集食品ってなに？

# ゲノム編集食品とは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## ゲノム編集食品って何でしょうか？

皆さまが普段食べる野菜や果物、さらには肉などの食品。これらの中には、特定の方法で遺伝子が少し変えられたものがあります。この特定の方法とは、「ゲノム編集」という技術を使って、生物の遺伝情報の一部を狙って変更することです。この技術を使った食品を「ゲノム編集食品」と称します。

## どのような特徴があるのでしょうか？

ゲノム編集を利用することで、例えば、病気に強い野菜や、成長が早い魚などを作ることができます。具体的には、ある特定の遺伝子をオフにしたり、働きを強化したりして、望ましい特性を持つ食品を開発することが期待されます。

## そのような技術を使うメリットは？

ゲノム編集技術には、農薬の使用を減らしたり、効率よく食糧を生産するといったメリットがあります。これにより、環境への負担を減らしつつ、増加する世界の人口に対して安定した食糧供給が期待されます。

# まとめ

ゲノム編集食品は、新しい技術を駆使して生み出される食品であり、持続可能な食糧生産や環境問題の解決に向けた一歩として注目されています。ただし、安全性や倫理的な側面についても十分な議論と検証が求められています。
【JAWS-UG大分】大分県でAWSの勉強会を主催してみた

## はじめに

2023年９月2日、 JAWS-UG 大分で AWS 認定に関する勉強会を開催しました

「AWS認定 勉強会 JAWS-UGおおいた」
https://manage.doorkeeper.jp/groups/jawsug-oita/events/160739

今回は初めてメインで運営を行ったので、その記録を残しておきます

## 開催概要

主催: JAWS-UG大分

- Doorekeeper: https://jawsug-oita.doorkeeper.jp/

- Facebook: https://www.facebook.com/groups/jawsug.oita/

テーマ: AWS 認定

日時: 2023/09/02(土) 14:00 - 16:30

場所: 大分銀行宗麟館５階会議室

## 会場紹介

JAWS-UG 大分の勉強会会場として、大分銀行宗麟館の立派な会議室をお貸しいただきました

https://www.oitabank.co.jp/atm/sorinkan/

会場のホームページには以下のようなメッセージが書かれています

> 感動を、シェアしたい。を実現する大分銀行のフラッグシップビル

勉強会の目的は大分県内でのクラウド知識共有、教育、エンジニアの交流です
（AWS のセールスではありません）

エンジニアとしてクラウドで体験した感動を、まさにシェアしたい、という思いで私は JAWS-UG に参加しています

会社の枠を超えたコミュニティ活動の場として、設備の整った環境を使用でき、大分銀行様には非常に感謝しています

ちなみに「宗麟館」の名前の由来は「大友宗麟」という大分県の戦国武将です

https://www.touken-world.jp/tips/46473/

## 勉強会の発表資料

私の発表資料はこちらです

https://speakerdeck.com/ryowakabayashi/awsren-ding-woqu-de-surutohatupininaruli-you

なぜ資格を取ると良いのか、というモチベーション部分の話をしてきました

## 勉強会の様子、他の方の発表

X (Twitter) のハッシュタグ [#jawsugoita](https://twitter.com/search?q=%23jawsugoita&src=typed_query) または [#jawsug_oita](https://twitter.com/search?q=%23jawsug_oita&src=typed_query) で見ることができます

非常に有意義で、共感もある勉強会になったと思います

## 反省点

懇親会の会場予約をする際、 4,000 円のようなキリのいい値段になるよう、お店と交渉すべし

3,850 円だと、懇親会費用を徴収するときに小銭が足りず涙目になります

## 今後の予定

福岡で開催される JAWS の全国イベント JAWS FESTA に参加予定です！

https://jft2023.jaws-ug.jp/

また、 JAWS-UG 大分の次回オフライン開催も企画していきます

## まとめ

私は「大分県の IT を盛り上げていきたい！」という思いでコミュニティ活動をしています

私はまだまだ大分県でエンジニアを続けていくつもりだからです

大分県のエンジニアが元気に楽しく働けるようにしていきたいと思っています

そのためには、今回のような企業の枠を超えた、大分県内エンジニアのコミュニティは必要不可欠です

今後も様々な活動を通して、大分の IT を盛り上げていきます
スニペット集ってどうやってまとめてます？

css（cscs）コーディングしていると同じような内容を毎回入力していることに気が付きました。
特にgridは、結構使い所が多くて多用しているんですが、
```
.box{
 "display: grid;",
 "grid-template-columns: repeat(2,auto);",
 "grid-template-rows: repeat(2,auto);",
 "gap: 10px;"
}
```
みたいに毎回書くのが結構面倒になってきます。

効率よくコーディングするにはscssのmixinとかfunctionとか使って簡単にすることができますが、他社のプロジェクトを編集するような時はその定義がされていないこともあり、使い回しが悪いと感じることがあります。

そんなときに、自分のスニペット集があればそこからコピペして使いまわすようにすれば簡単じゃん！
とおもってNotionのデータベースによく使うスニペットをまとめていました。

でもNotionでまとめるのは、ちょっと使いづらいなーと感じていました。

# ってか、そもそもVSCodeのスニペット機能があるじゃん

そうなんです。
VScodeにはスニペット機能があり、ユーザースニペットを登録することで、ショートカットやサジェストで使うことができます。

## VSCodeのスニペット登録方法

- 設定から「ユーザースニペット」を選択
![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84007/2437df1c-3eaa-1fce-45ef-fe52a92cd872.png)

    
コマンド パレットにどのファイルのスニペットを作成するかのプルダウンが表示されます。
ファイルごとに使えるスニペットを作成することができます。（この画像ではcssとscssがすでにスニペットを設定中です）
![2023-08-03_16h21_35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84007/e8be4479-88fc-1283-046e-c7f055a77e18.png)
※「新しいグローバルスニペットファイル」はすべての拡張子に対して使用できるスニペットを登録することができます。
※「プロジェクトの新しいスニペット ファイル」はプロジェクトフォルダごとに設定するスニペットを登録することができます。特定のプロジェクトだけでよく使うスニペットなどを登録すると便利そうですね。

例えば「プロジェクトの新しいスニペット ファイル」を作成すると、プロジェクトフォルダ直下に「.vscode」フォルダが生成され、作成したスニペットファイルが生成されます。
![Untitled (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84007/8ebf222f-8d1b-f3b9-447f-74803601bccb.png)
この.vscodeをgitで共有すれば他のメンバーにも同じスニペットが使えるようになります。


それではscssファイルで使用するスニペットを登録してみます。
先程のコマンド パレットから`scss`を選択します。
この中にjsonを追記してスニペットを登録していきます。

```json
"①スニペット名": {
    "prefix": "②入力するとこのスニペットを呼び出せます",
    "body": [
      "③ここに登録したいスニペットを一行ずつ入力",
      "③ここに登録したいスニペットを一行ずつ入力",
      "③ここに登録したいスニペットを一行ずつ入力"
    ],
    "description": "④説明文を入力"
  },
```

①スニペット名は自分が識別する用なので任意でスニペット名をつけます
②prefixは入力によってこのスニペットを呼び出せます。例えばprefixに「my_snipett」と登録しておくとコーディングのときにmyと入力途中から登録したスニペットをサジェストしてくれます。
③は登録したスニペットを展開するソースコードを入力します。（1行づつ入力する必要があるので注意！）
④このスニペットに説明文を設定できます。サジェストしたツールチップに表示します。

以下はスニペットの登録例です。

```json
"my-grid": {
    "prefix": "snippet:grid",
    "body": [
      "display: grid;",
      "grid-template-columns: repeat(2,auto);",
      "grid-template-rows: repeat(2,auto);",
      "gap: 10px;"
      
    ],
    "description": "gridレイアウトのsnippetです"
  },
```

### VSCodeのスニペット使用方法

scssファイルに関連してスニペットを登録したので、scssファイルを開いて先程登録したprefixを入力します。

sniまで入力すると以下のようにサジェストしてくれます！

![Untitled (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84007/d1cc6535-0f02-0daf-f5b1-eb73a4f9d4b6.png)


このスニペットを選択すると展開されます！

![Untitled (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84007/b74ca2a8-2397-49ab-de89-efa8b68a90dd.png)
このように関連するファイル・プロジェクト・すべてのファイル共通でよく使うコードなどを区別して登録しておけば、効率アップに繋がります。

## $1、$2を使ってみる

`gap:10px;`のところですが、いつも10pxではなく都度変わると思います。

そのときは`10px`のところを`$1`として登録すると、スニペットを呼び出し後にカーソルがその位置に移動しすぐに入力することができます。
スニペットの変動する部分などに$1、$2…と登録しておくと便利そうですね！
VIOS vSCSI 環境で既に削除されたボリュームの定義を見分ける方法

#### はじめに

VIOS(Virtual I/O Server) vscsi環境で VIOS 側でhdiskを消す前にストレージ側でボリュームを削除した場合、VIOS側にhdisk定義が残ってしまうことが発生します。

その際の不要なhdiskを見分ける方法を確認したログです。

---

#### 環境

VIOS 3.1.4.10

---

#### 確認

VIOSで以下の hdisk が認識されていますが、ストレージ上のボリュームを先に消してしまいました。
しかしながら hdisk 定義は残っています。

```
$ lspv | grep hdisk | awk '{ print $1 }'
hdisk0
hdisk2
hdisk3
hdisk4
hdisk5
hdisk6
hdisk7
hdisk9
hdisk11
hdisk12
hdisk13
hdisk14
hdisk15
hdisk16
hdisk19
hdisk20
hdisk1
hdisk8
hdisk10
hdisk17
hdisk18
hdisk21
hdisk22
hdisk23
```

---

##### lspv -size コマンド

lspv -size コマンドは ディスクサイズを表示します。
ただし、実体がない場合は対象のhdiskはサイズが表示されないようです。
この差異を利用して不要な定義を判別します。


```
$ lspv -size | grep hdisk |  awk '{ print $1 }'
hdisk0
hdisk2
hdisk3
hdisk4
hdisk5
hdisk6
hdisk7
hdisk9
hdisk11
hdisk12
hdisk13
hdisk14
hdisk15
hdisk16
hdisk19
hdisk20
hdisk1
hdisk8
```

差分は、hdisk10, hdisk17, hdisk18, hdisk21, hdisk22, hdisk23 の 6つです。

なお、sort コマンドで順番並べたり、ファイルに出力したりできれば良いのですが、どちらもVIOSのpadminでは実行できません。

---

##### 不要なhdiskの削除

対象デバイスの削除を実施します。


```
$ rmdev -dev hdisk10
hdisk10 deleted
$ rmdev -dev hdisk17
hdisk17 deleted
$ rmdev -dev hdisk18
hdisk18 deleted
$ rmdev -dev hdisk21
hdisk21 deleted
$ rmdev -dev hdisk22
hdisk22 deleted
$ rmdev -dev hdisk23
hdisk23 deleted
```

##### デバイス再認識実行

```
$ cfgdev
$ echo $?
0
```

##### hdisk確認

```
$ lspv | grep hdisk | awk '{ print $1 }'
hdisk0
hdisk2
hdisk3
hdisk4
hdisk5
hdisk6
hdisk7
hdisk9
hdisk11
hdisk12
hdisk13
hdisk14
hdisk15
hdisk16
hdisk19
hdisk20
hdisk1
hdisk8
```

実体が存在しないため削除した hdisk が再度認識されていません。
再認識されないことで、削除対象が正しいことも確認できました。




以上です。
【Salesforse】【Apex】指定ログイン情報の設定方法とエラー

Salesforseから外部サービスをコールアウトする案件がいくつか続き
指定ログイン情報の知見がたまったので設定方法とよくあるエラーをまとめました！

<font color="Red">※旧の指定ログイン情報は非推奨となっているため、当記事ではWinter '23にリリースされた新の指定ログイン情報についての内容となります。</font>

**<font color="Red">※プロファイルでの権限付与は廃止される予定なので、権限セットで権限付与する方法で記載しています。</font>**


# 指定ログイン情報とは？
Apexでエンドポイントとかヘッダーとかごにょごにょ書かないで設定に外出ししよ。ってやつです。
コード見せたほうが早いのでサンプルをば

```Apex:指定ログイン情報なし
HttpRequest req = new HttpRequest();
req.setHeader('Content-Type', 'application/json');
req.setHeader('Accept', 'application/xml');
req.setEndpoint('https://piepie-sample.com/api/v1/data');
req.setMethod('POST');
req.setBody('{"aaa":"bbbbbb"}');
HttpResponse res = new Http().send(req);
```

```Apex:指定ログイン情報あり
HttpRequest req = new HttpRequest();
req.setEndpoint('callout:piepie');
req.setMethod('POST');
req.setBody('{"aaa":"bbbbbb"}');
HttpResponse res = new Http().send(req);
```
指定ログイン情報なしの2～4行目が `req.setEndpoint('callout:piepie');` の1行になります。
URLや認証情報をハードコードしないので管理しやすいですね。

# 指定ログイン情報の設定方法
### １．外部ログイン情報の作成
設定で「指定ログイン情報」の画面を開き、外部ログイン情報を作成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/2e3cf647-3d8c-3e03-c8d9-6248d67df592.png)

プリンシパルを作成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/62becca7-26c8-03d9-2136-7bebfeefb1dc.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/211de228-7240-0ccb-d012-d396791ae049.png)

setHeader()にあたる部分はカスタムヘッダーに登録する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/169e01ba-1144-eb05-9913-b5246212c86b.png)

### ２．指定ログイン情報の作成
設定で「指定ログイン情報」の画面を開き、指定ログイン情報を作成する
１で作成した外部ログイン情報を設定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/47124e7c-1d94-f3fc-df6d-a9ffcd7f02d4.png)

### ３．コーディング
setEndpoint()の引数は `'callout:★★★'` のようにする。
★★★は２で設定した名前を入れるが大文字と小文字を区別するらしいので注意。
また、以下のように文字列連結も可能
```Apex
req.setEndpoint('callout:piepie' + '/piepie');
```

### ４．権限セットの作成とユーザへの割り当て
設定で「権限セット」の画面を開き、権限セットを作成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/e44aec2c-74d1-56e0-07e8-310697dfc8e7.png)

外部ログイン情報プリンシパルアクセスを追加する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/e2c7bae3-6c33-19e9-db0c-fd224731a5e5.png)

標準オブジェクトのユーザの外部ログイン情報の参照権限を付与する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461666/71910636-d961-ffa8-61ab-c36ae2b40209.png)

:::note info
その他、このコールアウトをする機能（オブジェクト・Apex・VF）の権限一式をこの権限セットに入れるのもおすすめです。
:::

### やらなくていいこと「リモートサイトの設定」
外部連携といえば「リモートサイトの設定」ですが、指定ログイン情報を使用する場合は不要です。

# よくあるエラー
設定は済んだのでいざ実行！ってしてみたら、なんかエラーになっちゃったシリーズ
検索してもなかなか出てこなかったのでメモしておきます(\*'ω'*)

### We couldn't access the credential(s). You might not have the required permissions, or the external credential "piepie_ext" might not exist.
原因
・権限セットがユーザに割り当てられていない
・権限セットに外部ログイン情報プリンシパルアクセスが追加されていない

### The callout couldn't access the endpoint. You might not have the required permissions, or the named credential "piepie" might not exist.
原因
・権限セットに標準オブジェクト「ユーザの外部ログイン情報」の権限が付与されていない
　→シス管には付与されているのでテストまで気づかないことがあり、、




# 参考

https://help.salesforce.com/s/articleView?id=sf.named_credentials_about.htm&type=5
ActiveStorage::InvariableErrorについて

画像を表示しているページで`ActiveStorage::InvariableError`に遭遇したためまとめておきます。

# ActiveStorage::InvariableErrorとは？
Railsのドキュメントには以下のように記載されていました。
「可変」という部分が微妙にわかりづらいため、記載されているそれぞれのメソッドを確認して行きます。

>ActiveStorage::Blob#variant が可変でない blob に対して呼び出されたときに発生。ActiveStorage::Blob#variable?を使って、blobが可変かどうかを判断する。

https://edgeapi.rubyonrails.org/classes/ActiveStorage/InvariableError.html

## ActiveStorage::Blob#variant
`variant`メソッドは画像のサイズや色を変更することができるメソッド。
以下の例では画像の高さと幅を100pxにリサイズしています。
（サイズだけでなく色も変更できるため「可変」と書かれていたんですね👀）

```ruby
avatar.variant(resize_to_limit: [100, 100]).processed.url
```

https://edgeapi.rubyonrails.org/classes/ActiveStorage/Blob/Representable.html#method-i-variant

## ActiveStorage::Blob#variable?
`variant`メソッドによって変換可能な画像形式の場合に`true`を返します。
変換可能な画像形式は`ActiveStorage.variable_content_types`で確認ができるようになっています。

```ruby
# Rails v6.1
ActiveStorage.variable_content_types
=> ["image/png",
 "image/gif",
 "image/jpg",
 "image/jpeg",
 "image/pjpeg",
 "image/tiff",
 "image/bmp",
 "image/vnd.adobe.photoshop",
 "image/vnd.microsoft.icon",
 "image/webp"]
```

https://edgeapi.rubyonrails.org/classes/ActiveStorage/Blob/Representable.html#method-i-variable-3F

<br>

つまり、変換ができない形式の画像に対して`ActiveStorage::Blob#variant`を呼んだ時に`ActiveStorage::InvariableError`が発生するようになっています。

## エラーの原因と対策
今回エラーの原因となっていた画像を調べてみると、画像形式が`image/avif`という形式になっており、その画像に対して`ActiveStorage::Blob#variant`が呼ばれていました。[※補足](#補足)
対策としては、画像を添付したいModelにvaridationを設定することですが、ActiveStorageにはRailsの標準でvalidationを設定することができないっぽいです。

幸い`active_storage_validations`というgemがあるようなので、これを導入してvalidationを設定しておくと良さそう。
（なぜRailsの標準機能としてActiveStorageのvalidationを実装しないのだろうか？:thinking_face:）

https://github.com/igorkasyanchuk/active_storage_validations

## 補足
今回は`image/avif`の画像形式で例外が発生したわけですが、この画像形式は今後普及されていくであろうと言われている次世代型の画像形式ファイルらしいです。
もしやと思い、Rails7.0以降の環境で確認してみると`image/avif`にも対応していました。
「変換したい画像形式にActiveStorageが対応していない！」というときは、Railsのバージョンアップを検討してみるのも良いかもしれません。

```ruby
ActiveStorage.variable_content_types
=> 
["image/png",
 "image/gif",
 "image/jpg",
 "image/jpeg",
 "image/pjpeg",
 "image/tiff",
 "image/bmp",
 "image/vnd.adobe.photoshop",
 "image/vnd.microsoft.icon",
 "image/webp",
 "image/avif", # !!!!
 "image/heic",
 "image/heif"]
```
Ruby - ArrayとEnumerator の違い

たとえば `Integer#times` は配列ではなく Enumeratorを返してくる

```rb
3.times # => #<Enumerator: ...>
```

なぜなのだろう。

# Enumerator が使われる理由

- 配列生成してそれを保持するとメモリが食われるため大量の不向き
- そもそも配列では実現できない処理がある

このあたりが理由ではないだろうか。
と思ってあとからググったら同じ理由を述べる記事が複数見つかったので当たっていたようだ。

配列のeachで実現できない処理というのは次に述べるように例えば無限回数の処理とか。

# 無限回数の繰り返し

無限回数の繰り返しをおこなう loop メソッドも  Enumerator だ

```rb
loop # => #<Enumerator: ...>
```

これを配列で実現しようとするとどうだろう？
無限個数の配列をあらかじめ作るわけにはいかない。(作れない)

すなわち Enumerator が必要だ。


# Enumerator の挙動

たとえば Enumerator には next メソッドがあり each せずとも1個ずつ処理することが出来る。

```rb
t = 3.times

t.next { |i| p i } # => 0
t.next { |i| p i } # => 1
t.next { |i| p i } # => 2
t.next { |i| p i } # StopIteration: iteration reached an end
```

何かのライブラリのクラス(のインスタンス)で  next するたびに外部APIにリクエストするものも見たことがある気がする。

この場合もあらかじめ全ての外部APIリクエストをおこなっておくことは出来ないというか極めて非効率なので Enumerator で実装されているのは理にかなっているのだろう。

# 実装としての正しさ

たとえば `100.times`  の返り値で `Array.new(100)` のように100個のnilが返ってきたら普通にびっくりしないだろうか。
やりたいことは 100回の繰り返し処理であって100個の配列ではないためだ。


# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# Twitter

https://twitter.com/YumaInaura
pygame で録画する

```python
import ffmpeg,pygame
process = None
def key(w,h,fps):
  global process,pw,ph
  if process: return stop()
  pw = w
  ph = h
  process = (
    ffmpeg
    .input('pipe:', format='rawvideo', pix_fmt='rgb24', s='{}x{}'.format(pw,ph), r=fps)
    .output("out.mkv", preset="ultrafast", qp=0)
    .overwrite_output()
    .run_async(pipe_stdin=True)
  )
def stop():
  if process:
    process.stdin.close()
    process.wait()
def draw(g):
  if process:
    g = pygame.transform.scale(g,(pw,ph))
    g = pygame.surfarray.pixels3d(g).swapaxes(0, 1)
    g = g.tobytes()
    process.stdin.write(g)
```

な感じのモジュールを作っておき、rec.key をキーイベントで呼び、rec.drawを定期的に録画したいサーフェスを渡して呼び出し、rec.stopをプログラム終了時に呼び出すようにします。
配列

```
let array = [1, 2, 3, 4, 5]
let lastElement = array.last // 最後の要素にアクセス
```

```
let lastElement = 5
let newArray = Array(repeating: 0, count: lastElement + 1)
```
このコードでは、Array(repeating:count:) コンストラクタを使用して、指定された値（0）と指定された要素数（lastElement + 1）で初期化された新しい配列を作成します。最後の要素が5なら、要素数が6個の空の配列が作成されます。


```
let lastElement = 5
var newArray = [Int]()

for _ in 0...lastElement {
    newArray.append(0)
}
```
このコードでは、for ループを使って、lastElement に指定した値に基づいて新しい空の配列 newArray を作成し、要素を0で初期化しています。この方法も効果的に空の配列を生成する手段の一つです。

```
var arrayOfIntegers = [1, 2, 3, 4, 5]
let insertionIndex = 5
let valueToInsert = 5.0

if insertionIndex >= 0 && insertionIndex <= arrayOfIntegers.count {
    arrayOfIntegers.insert(valueToInsert, at: insertionIndex)
} else {
    // 指定された位置に要素を挿入できない場合の処理
}
```
このコードでは、insert(_:at:) メソッドを使用して、指定した位置に新しい要素を挿入しています。挿入する位置が配列の範囲内にあることを確認することが重要です。


```
class CustomAxisValueFormatter: NSObject, IAxisValueFormatter {
    private let dateFormatter: DateFormatter
    private let values: [Double]
    
    init(dateFormatter: DateFormatter, values: [Double]) {
        self.dateFormatter = dateFormatter
        self.values = values
        super.init()
    }
    
    func stringForValue(_ value: Double, axis: AxisBase?) -> String {
        // Unix時刻が0の場合、空のラベルを返す
        if value == 0 {
            return ""
        }
        
        guard let index = values.firstIndex(of: value) else {
            return ""
        }
        
        let unixTime = values[index]
        let date = Date(timeIntervalSince1970: unixTime)
        return dateFormatter.string(from: date)
    }
}
```
この CustomAxisValueFormatter を使用するには、次のように xAxis.valueFormatter を設定します：

```
let customAxisValueFormatter = CustomAxisValueFormatter(dateFormatter: dateFormatter, values: unixTimeData)
xAxis.valueFormatter = DefaultAxisValueFormatter(formatter: customAxisValueFormatter)

```
これにより、Unix時刻が0の場合は空のラベルが表示され、それ以外の場合は指定したフォーマットでラベルが表示されるようになります。
API Only Users


+ [Access Restricted for API Only Users](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007FSbT6)

API のみのユーザーにはアクセスが制限されています

設定は正常に更新されましたが、UI にアクセスできなくなりました。続行するには、このウィンドウを閉じてください。

実際にはこのユーザーのアクセストークンが必要ですが、エラーが発生してログインできません。
アクセストークン（セキュリティ）トークンの取得方法。


:::note
An API only user never receives the salesforce security token along with the password email. The whole concept of provisioning this user is for an integrating system user to login to salesforce. As a workaround we first create them as normal user profiles without API only checked, and then once they receive password and security token, we switch them to API only. This is a bug.

https://ideas.salesforce.com/s/idea/a0B8W00000GdbfuUAB/api-only-profile-users-should-receive-security-token
:::
LeetCodeのTwo Sum解いてみた

# 始めに
今回もLeetCodeの有名問題**Two Sum**に挑戦してみようと思う
有名とは言えお恥ずかしながらコーディング面接やコーディングテストを受けた経験がないので実際によく出るよ！みたいなのはよくわからない。

ちなみにこの問題の難易度はEasyなので確実に突破したい

チャレンジしたい人は↓から挑戦してみて

https://leetcode.com/problems/two-sum/description/


## 問題
この問題は数値が格納された配列numsが渡されるので



## 解法1
まずは**ブルートフォース**で解いてみる

簡単に思い付くがやはり非効率かな...

計算量は最悪の場合**O(N2)** となります。
一応、Acceptedはできるがパフォーマンスはよろしくない。
ただ、コーディング面接とかで最適な解法が見つからなかったら最悪この方法でも答えに辿り着いた方が良さそう。
この辺の対応は有識者の方がいれば教えて頂きたい🙇‍♂️
```python
def twoSum(self, nums: List[int], target: int) -> List[int]:
    for i in range(len(nums)-1):
        for j in range(i+1, len(nums)):
            if nums[i] + nums[j] == target:
                return [i, j]
    return []

```

## 解法２
今回も**ハッシュマップ**を使って解く
この方法なら計算量**O(N)** で解くことができる。
コーディング面接などで最も多く出題される分野みたいなので絶対に抑えておきたい。

ハッシュマップに保存する内容はnumsの各値とそのインデックス番号を保存する。

nums = [2,7,11,15]の場合、
↓こんな感じ
{2: 0, 7: 1, 11: 2, 15: 3}

もう一度、numsを探索し、nums[i]の補数(complement)がhash_map内にあれば、現在のiと補数のインデックス番号を配列で返せばOK。



```python
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        hash_map = {}
        for i in range(len(nums)):
            hash_map[nums[i]] = i

        # ハッシュマップ内に補数があるか探索
        for i in range(len(nums)):
            complement = target - nums[i]
            if complement in hash_map and hash_map[complement] != i:
                return [i, hash_map[complement]]

        return []

```

## 感想
LeetCodeの回答にはライブラリを使い、1行で解決してるものもあったがコメント欄見る限り、あまり推奨されない方法らしい。
まあ、コーディング面接でライブラリ使って終わりだと面接にならないからね...
とはいえ実際の実務の現場では車輪の再発明は御法度とするため知識として持っているのは良いことだと感じた。
ハッシュマップなどで回答した上で、このような方法もあります。と+αの知識を添えると評価されるかも？


今回の問題はただハッシュマップに保存するだけでなく、補数を探索するという洞察力がないと難しかった。
道のりは険しそう
電子工作メモ - ブザー

# ブザー

## ブザーについて

- 種類
  - アクティブブザー: 内部にオシレーター（電源が供給されている間ずっと鳴る）が入っている。
  - パッシブブザー　: オシレータがないので、外部にオシレーターが必要。PWM を使って周波数を変えて音を鳴らす。共鳴周波数が最も大きい音が鳴る。

  - 見分け方
    - アクティブブザーには、表面に音声出力の穴がある（絶対ではない）
    - アクティブブザーは、回路構成が複雑で内部にクリスタルオシレーターなどがあるので、下側に防水加工がしてある。

- 動作使用
  - アクティブブザー
    - 電圧: 1.5V ～ 24V
    - 電流: 10mA ～ 150mA

## トランジスタ

- NPN: 8050(キット内)
- PNP: 8550(キット内)

マイコンの電流出力容量はとても小さいので、電流が多く必要なデバイスを使う場合に増幅する必要がある。その場合にトランジスタを使う。

- 回路

<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4641/25355f85-f2f7-9638-8728-01b71d2a37fe.png">

  - NPNの場合の回路
    GPIO が High 出力の場合に電流が流れる。Low の場合にオフになる。
  - PNPの場合の回路
    GPIO が Low 出力の場合に電流が流れる。High の場合にオフになる。

## 接続

NPN型を使う。

- ブザー側
  - VBUS(5V): ブザーの＋
  - トランジスタ
    - E: GND
    - C: ブザーのー
    - B: 1kΩ抵抗(R1) => GP15

- スイッチ側
  - 3V3 : 10kΩ抵抗(R3) => スイッチ上側
  - GP16: 10kΩ抵抗(R2) => スイッチ上側
  - GND : スイッチ下側

## コード

```python:Doorbell(押したときに鳴る)
from machine import Pin
import time

button = Pin(16, Pin.IN, Pin.PULL_UP)
activeBuzzer = Pin(15, Pin.OUT)
activeBuzzer.value(0)

while True:
    if not button.value():
        activeBuzzer.value(1)
    else:
        activeBuzzer.value(0)
```

```python:Alertor(PWMで鳴らす)
from machine import Pin,PWM
import math
import time
PI = 3.14
button = Pin(16, Pin.IN, Pin.PULL_UP)
passiveBuzzer = PWM(Pin(15))
passiveBuzzer.freq(1000)

def alert():
    for x in range(0, 36):
        sinVal  = math.sin(x * 10 * PI / 180)
        toneVal = 1500+int(sinVal*500)
        passiveBuzzer.freq(toneVal)
        time.sleep_ms(10)
     
try:
    while True:
        if not button.value():
            passiveBuzzer.duty_u16(4092*2)
            alert()   
        else:
            passiveBuzzer.duty_u16(0)
except:
    passiveBuzzer.deinit()
```
リブログ合同会社のAPI：日本の自然と地域の魅力をデジタルで再発見

こんにちは、アプリ開発者やデジタルコンテンツクリエイターの皆さん！日本の豊かな自然や地域の魅力をデジタルの世界で再現したいと思ったことはありませんか？リブログ合同会社が提供するAPIは、そんなあなたの願いを叶える鍵となるでしょう。

# 1. 日本の自然や地域の魅力を感じるAPI

これらのAPIは、日本独特の自然や風景をデジタルで感じることができるものです。

- [**山岳標高API**](https://yamaelevation.docs.apiary.io/): 山好きにはたまらない、日本全国の山の標高情報を提供。ハイキングやトレッキングの計画に役立てることができます。
- [**朝夕日和API**](https://asayuubiyori.docs.apiary.io/): 旅行やキャンプの際に役立つ、日の出・日の入りの時間やその日の天気情報を提供。
- [**巨樹検索API**](https://bigtree.docs.apiary.io/): 自然愛好者やフォトグラファーにおすすめ。日本全国の巨樹の位置や情報を提供。
- [**きれいな高原API**](https://plateauaqicn.docs.apiary.io/): リフレッシュやリラックスのためのスポットを探す際に。空気のキレイ度と高原のランキング情報を提供。
- [**湧き水検索API**](https://springwaterapi.docs.apiary.io/): 清涼感あふれる湧き水のスポットを探す際に。全国の湧き水情報を提供。
- [**星をみるひとAPI**](https://hoshimiru.docs.apiary.io/): 星空観賞や天体観測の際に。見つけた星座や天体の情報を提供。

# 2. 自然対話を行うためのAPI

人とコンピュータが自然にコミュニケーションをとるためのAPIです。

- [**NOBY API**](https://noby.chat/): 会話型の人工知能のAPI。ユーザーとのコミュニケーションをより自然に、そして楽しくするためのツール。

# 3. 地名由来系のAPI

日本の地名には歴史や背景があります。それを知ることで、その地域の魅力をさらに深く知ることができます。

- [**言の場API**](https://kotonoba.docs.apiary.io/): 旅行先の地名の由来や背景を知ることができる。日本全国の地名の由来とその場所の情報を提供。
- [**崩壊地名API**](https://houkaichimeiapi.docs.apiary.io/): 地域の災害の歴史を知ることができる。過去の災害履歴を示す地名情報を提供。

# まとめ

リブログ合同会社のAPIは、日本の自然や地域の魅力をデジタルの世界で再発見するための素晴らしいツールとなっています。これらのAPIを活用して、ユーザーのニーズに合わせた新しいアプリやサービスを開発してみてはいかがでしょうか。デジタルとリアルの融合を通じて、日本の魅力を再発見し、多くの人々にその魅力を伝える手助けをすることができるでしょう。

---

※図解や具体的なAPIの使用例は、公式ドキュメントを参照してください。
[OCI] 世界中とData Gaurdしようと思ったら、いきなり詰んだ話

## やりたいこと
Oracle Cloud では、DR対策で他リージョンへのData Guardを簡単に構築することができます。
せっかくなので、日本から遠いブラジルや、南アフリカ、個人的に大好きなスイスなど、
世界中のリージョンにData Guardを構築してみます。各大陸に1つは作りたいと思います。


## Oracle Cloud のリージョン追加
Oracle Cloud環境を開設すると、ホームリージョンが1つ割り当てられます。
今回の環境は、ホームリージョンが「Japan East (Tokyo)」になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2551183/5a42658d-d0aa-8427-0f76-7e5a91e99ad6.png)


リージョンを追加するには、上記画面の「リージョンの管理」を選択し、
表示されるリージョン一覧から、追加したいものを「サブスクライブ」します。
追加したリージョンにComputeやBaseDBを作成すればお金はかかりますが、
リージョン追加だけならお金はかからないため、気軽にやってしまいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2551183/9fc00fc5-a772-66c6-b361-151934288a06.png)

確認画面がでるため「サブスクライブ」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2551183/4e7b3fac-2f6c-e4ab-015d-5029cedc6b29.png)

追加には少し時間がかかります。10分程度まてば完了です。
無事に追加されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2551183/5176170c-b137-c717-d78c-6da6d926bde7.png)

調子にのって、どんどん追加していきます。
日本の大阪と、日本から遠い、ブラジルと南アフリカを追加して4つになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2551183/3086dc0f-bf9f-adc0-d3cb-3a7159f5e3f7.png)

今度は大好きな国、スイスのリージョンを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2551183/27f81f2d-75e1-4903-86a7-17677b968227.png)

すると、今までのリージョン追加では出なかったエラーが発生しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2551183/c65380b2-8340-9e5b-31c7-63cca9f8881c.png)
＜エラー（原文）＞
You have exceeded the maximum number of allowed subscribed regions. Please see the Limits, Quotas and Usage page for more detail.

＜エラー（翻訳）＞
許可されているサブスクライブ済みリージョンの最大数を超えました。詳細については、制限、クォータ、および使用状況のページを参照してください。


なんと、サブスクライブできるリージョンには上限があるみたいです。


## Oracle Cloud サービス上限確認
サブスクライブできるリージョン数や、作成できるCompute数など、上限を確認してみます。
なお、クラウド契約形態などによって上限は異なりますので、テナンシによって上限が異なることに注意してください。

メニューから「ガバナンスと管理」＞「制限、割り当ておよび使用状況」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2551183/b417b5ed-de4c-4f54-3c94-78685546f5d4.png)


最初に表示された画面で、作成できるComputeの上限が100個ということがわかりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2551183/d2f33c88-27d3-3f8e-744f-88ac76a3832f.png)

次に左上の「サービス」から「Regions」を選択して、リージョン数の制限を確認します。
すると、、、、、「4」と表示されています。
大好きなスイスリージョンを追加する夢が破れました、、、。最初に追加すればよかった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2551183/56ec978b-d0fd-764b-0368-0758af965c19.png)


本テナンシでは、サブスクライブできるリージョンは4つまでのようです。
世界中にData Guardを構築して、データを転送しようと思いましたが、3リージョンまでしかできなさそうです。
しかも、実用性はなさそうな遠いところを選んでしまいました。



## サービス制限の引上げSR
よく見ると、サービス制限の引上げを要望できるみたいなので、やってみたいと思います。
結果はこうご期待！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2551183/23012621-ab14-53f3-d271-2be6f31562e5.png)
cscの作法 その441


# 概要
cscの作法、調べてみた。
練習問題、やってみた。

# 練習問題
TableLayoutPanelでセルに2つのlabelを入れよ。


# 方針
- GroupBox使う

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/4714b05f-400d-0cf1-d70c-d3830ad72b16.png)


# サンプルコード

```
using System;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
using System.Data;

namespace App
{
	public partial class Form1: Form {
		public Form1() {
			Text = "Layout";
			ClientSize = new Size(390, 300);
			float fRowPercentage = 100;
			float fColumnPercentage = 100;
			int iss = 3;
			int jss = 3;
			fColumnPercentage = 100 / jss;
			fRowPercentage = 100 / iss;
			TableLayoutPanel tableLayoutPanel1 = new TableLayoutPanel();
			tableLayoutPanel1.Dock = DockStyle.Fill;
			tableLayoutPanel1.CellBorderStyle = TableLayoutPanelCellBorderStyle.Inset;
			tableLayoutPanel1.ColumnCount = jss;
			tableLayoutPanel1.ColumnStyles.Clear();
			for (int j = 0; j < jss; j++)
			{
				tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, fColumnPercentage));
			}
			tableLayoutPanel1.RowCount = iss;
			tableLayoutPanel1.RowStyles.Clear();
			for (int i = 0; i < iss; i++)
			{
				tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.Percent, fRowPercentage));
			}
			for (int i = 0; i < iss; i++)
			{
				for (int j = 0; j < jss; j++)
				{
					GroupBox group = new GroupBox();
					Label label0 = new Label();
					label0.Location = new Point(10, 20);
					label0.Text = "koko " + i.ToString() + " " + j.ToString();
					Label label1 = new Label();
					label1.Location = new Point(10, 50);
					label1.Text = "koko " + i.ToString() + " " + j.ToString();
					group.Text = "group";
					group.Controls.Add(label0);
					group.Controls.Add(label1);
					tableLayoutPanel1.Controls.Add(group);
				}
			}
			Controls.Add(tableLayoutPanel1);
		}
		[STAThread]
		public static void Main() {
			Application.Run(new Form1());
		}
	}
}





```


以上。
QGISでAmazon Location Serviceのマップを表示してみた

![img](https://memo.dayjournal.dev/images/try-100_00.gif)

![img](https://memo.dayjournal.dev/images/try-100_00.png)

### QGISでAmazon Location Serviceのマップを表示してみました :tada:  

詳細として下記について説明します。

- [事前準備](https://qiita.com/dayjournal/items/b633883f48b4bdd91a75#%E4%BA%8B%E5%89%8D%E6%BA%96%E5%82%99)
- [ベクトルタイルレイヤ登録](https://qiita.com/dayjournal/items/b633883f48b4bdd91a75#%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E3%82%BF%E3%82%A4%E3%83%AB%E3%83%AC%E3%82%A4%E3%83%A4%E7%99%BB%E9%8C%B2)
- [ベクトルタイルレイヤ表示](https://qiita.com/dayjournal/items/b633883f48b4bdd91a75#%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E3%82%BF%E3%82%A4%E3%83%AB%E3%83%AC%E3%82%A4%E3%83%A4%E8%A1%A8%E7%A4%BA)

## 事前準備

- Amazon Location ServiceのAPIキー作成  
[Amazon Location Service #004 - APIキー作成(マップ)](https://memo.dayjournal.dev/memo/amazon-location-service-004)  

マップを表示するためには下記情報を準備します。

- リージョン名 (例: ap-northeast-1)
- マップ名 (例: SampleMap)
- APIキー (例: v1.public.xxxxx)

<br>

## ベクトルタイルレイヤ登録
はじめに、QGISのベクトルタイルレイヤでAmazon Location Serviceのマップを登録します。 

<br>

QGISを起動 → レイヤ → レイヤを追加 → ベクタタイルレイヤを追加をクリックします。
![img](https://memo.dayjournal.dev/images/try-100_01.png)

新規 → 新規一般接続をクリックします。
![img](https://memo.dayjournal.dev/images/try-100_02.png)

レイヤ名前・タイルURL・スタイルURLを設定しOKをクリックします。URLには、"region" にリージョン名・"mapName" にマップ名・"apiKey" にAPIキーをそれぞれ設定します。
![img](https://memo.dayjournal.dev/images/try-100_03.png)

タイルURL
```text
https://maps.geo.[region].amazonaws.com/maps/v0/maps/[mapName]/tiles/{z}/{x}/{y}?key=[apiKey]
```

スタイルURL
```text
https://maps.geo.[region].amazonaws.com/maps/v0/maps/[mapName]/style-descriptor?key=[apiKey]
```

<br>

これでベクトルタイルレイヤ登録は完了になります！

<br>

## ベクトルタイルレイヤ表示
最後に、QGISでAmazon Location Serviceのマップを表示します。

<br>

設定したベクトルタイルレイヤを選択し、追加をクリックします。
![img](https://memo.dayjournal.dev/images/try-100_04.png)  

QGISでAmazon Location Serviceのマップを表示できました！
![img](https://memo.dayjournal.dev/images/try-100_05.png)  

<br>

QGISではベクトルタイルやそのマップスタイルを読み込むことが可能です。Amazon Location Serviceのマップもベクトルタイルを利用しているため、QGISで読み込みができます。ただし、QGISは現状ですべてのマップスタイルには対応していないので、一部のスタイル表現が正確に再現されないことがあります。

<br>
<br>

QGISとAmazon Location Serviceについて、他にも記事を書いています。よろしければぜひ :bow:
<a href="https://memo.dayjournal.dev/tags/qgis/" target="_blank">tags - QGIS</a>
<a href="https://memo.dayjournal.dev/tags/amazon-location-service" target="_blank">tags - Amazon Location Service</a>

やってみたシリーズ :grinning:
<a href="https://day-journal.com/memo/tags/Try" target="_blank">tags - Try</a>

https://aws.amazon.com/jp/builders-flash/202308/use-3d-map-library-location-service

https://aws.amazon.com/jp/builders-flash/202301/use-map-library-location-service

https://qiita.com/dayjournal/items/441f89794f6fb5656846

<br>
<br>

<a href="https://dayjournal.booth.pm" target="_blank"><img src="https://day-journal.com/memo/images/etc/book.png" alt="book"></a>
cscの作法 その440



# 概要
cscの作法、調べてみた。
練習問題、やってみた。

# 練習問題
TableLayoutPanelでセルに2つのlabelを入れる。

# 方針
- FlowLayoutPanel使う

# 写真


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/5531d7c0-dd01-8a30-3b1f-9f4af41981d4.png)

# サンプルコード

```
using System;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
using System.Data;

namespace App
{
	public partial class Form1: Form {
		public Form1() {
			Text = "Layout";
			ClientSize = new Size(300, 300);
			float fRowPercentage = 100;
			float fColumnPercentage = 100;
			int iss = 3;
			int jss = 3;
			fColumnPercentage = 100 / jss;
			fRowPercentage = 100 / iss;
			TableLayoutPanel tableLayoutPanel1 = new TableLayoutPanel();
			tableLayoutPanel1.Dock = DockStyle.Fill;
			tableLayoutPanel1.CellBorderStyle = TableLayoutPanelCellBorderStyle.Inset;
			tableLayoutPanel1.ColumnCount = jss;
			tableLayoutPanel1.ColumnStyles.Clear();
			for (int j = 0; j < jss; j++)
			{
				tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, fColumnPercentage));
			}
			tableLayoutPanel1.RowCount = iss;
			tableLayoutPanel1.RowStyles.Clear();
			for (int i = 0; i < iss; i++)
			{
				tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.Percent, fRowPercentage));
			}
			for (int i = 0; i < iss; i++)
			{
				for (int j = 0; j < jss; j++)
				{
					FlowLayoutPanel flowLayoutPanel3 = new FlowLayoutPanel();
					Label label0 = new Label();
					label0.Text = "koko " + i.ToString() + " " + j.ToString();
					Label label1 = new Label();
					label1.Text = "koko " + i.ToString() + " " + j.ToString();
					flowLayoutPanel3.AutoSize = true;
					flowLayoutPanel3.AutoSizeMode = AutoSizeMode.GrowAndShrink;
					flowLayoutPanel3.Controls.Add(label0);
					flowLayoutPanel3.Controls.Add(label1);
					tableLayoutPanel1.Controls.Add(flowLayoutPanel3);
				}
			}
			Controls.Add(tableLayoutPanel1);
		}
		[STAThread]
		public static void Main() {
			Application.Run(new Form1());
		}
	}
}



```

以上。
Git初学者の方へ！コミットメッセージをプロフェッショナルにするテンプレート術

# 概要
まだまだGit自体に慣れていなかったり初学者なのでコミットする際どのようなメッセージにするか悩むことが多かったので、「これ、テンプレート化させられないかな？」と思い調べてみたところ、テンプレート化できたので備忘録として残しておきます。

# 前提
mac,VScodeを使用

# テンプレート化しようと思った経緯
今まではメッセージ自体を軽視しており、
```
git add -m "add"
```
だったり
```
git add -m "バグ修正"
```
のように日本語と英語が混合していたり、何の機能を追加したのかわかりづらいメッセージを書いてました。
ただ、実際に現場で適当なメッセージを書くのはマズイし、現場で決まった書き方があるはずなのでその練習の意味も込めてテンプレート化させてみました。

# テンプレートメッセージの設定

### ・テンプレートの作成
ルートディレクトリ直下にテンプレートファイルを作成
`.commit_template`というファイル名で作成します。
```
cd ~
touch .commit_template
```

### ・作成したファイルをGitのコミットメッセージのテンプレートに設定

以下を実行して先ほど作成した.commit_templateをテンプレートメッセージとして設定
グローバルにすることで全てのGitリポジトリのコミットメッセージのテンプレートとして使用できます。
```
git config --global commit.template ~/.commit_template
```

## テンプレート例
.commit_templateを開き、テンプレートメッセージを記載します.
以下がテンプレートメッセージのサンプルです、他記事を引用したり自分で作成したりしました。
```
🐞 バグとパフォーマンス
#🐛 :bug: バグ修正
#🚑 :ambulance: 重大なバグの修正
#🚀 :rocket: パフォーマンス改善
#💻 コードの品質とスタイル
#👍 :+1: 機能改善
#♻️ :recycle: リファクタリング
#👕 :shirt: Lintエラーの修正やコードスタイルの修正

🎨 UI/UXとデザイン
#✨ :sparkles: 新しい機能を追加
#🎨 :art: デザイン変更のみ

🛠️ 開発ツールと設定
#🚧 :construction: WIP (Work in Progress)
#⚙ :gear: config変更
#📦 :package: 新しい依存関係追加
#🆙 :up: 依存パッケージなどのアップデート

📝 ドキュメントとコメント
#📝 :memo: 文言修正
#📚 :books: ドキュメント
#💡 :bulb: 新しいアイデアやコメント追加

🛡️ セキュリティ
#👮 :op: セキュリティ関連の改善

🧪 テストとCI
#💚 :green_heart: テストやCIの修正・改善

🗂️ ファイルとフォルダ操作
#📂 :file_folder: フォルダの操作
#🚚 :truck: ファイル移動

📊 ログとトラッキング
#💢 :anger: コンフリクト
#🔊 :loud_sound: ログ追加
#🔇 :mute: ログ削除
#📈 :chart_with_upwards_trend: アナリティクスやトラッキングコード追加

💡 その他
#🧐 :monocle_face: コードのリーディングや疑問
#🍻 :beers: 書いているときに楽しかったコード
#🙈 :see_no_evil: .gitignore追加
#🛠️ :hammer_and_wrench: バグ修正や基本的な問題解決
```

# 実際にコミットしてみる
適当にコミットして
```
git add .
```
```
git commit
```
を打つと
```
# ==== Commit Messages ==============
♻️ #3 不要なコメントを削除
# ==== Commit Messages(Template) ====
# :emoji: #Issue番号 変更内容
# 例) :+1: #438 コメント追加
#       👍 #438 コメント追加
# ==== Emojis ====
# 🐛 :bug: バグ修正
# 例：🐛 #10 未登録のメールアドレスが入力された場合に500エラーとなる箇所を改修
# ✨ :sparkles: 新規機能(ファイル)の追加
# 例：✨ #2 faviconファイルの追加、及び、設定
# 👍 :+1: 機能修正（バグではない）
# 例：👍 #9 nameのプレースホルダを「氏名」から「お名前」に変更
# 🚿：:shower: 不要な機能（ファイル）の削除
# 例：🚿 #30 未使用の関数「set_name」を削除
# ♻️ :recycle: リファクタリング（同じ挙動を担保した上での変更）
# 例：♻️ #30 n+1問題が発生していたループをeager_loadに変更
# ✅ :white_check_mark: テストの追加
# 例：✅ #30 Userモデルのテストを追加
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# On branch main
# Your branch is up to date with 'origin/main'.
#
# Changes to be committed:
#       modified:   algo-method/search/double-loop/chapter1.py
#       modified:   atcoder/abc240/b/main.py
#
-- INSERT --
```
このような形でvimが起動されます。
iを押してinsertモートにした後に空白行にコミットメッセージを書くらしいのですが、自分はどうにもやりにくかったので普通に力技でメッセージを打つことにしました。
いつも通り``git commit -m "~"``の書き方です。
適当にコミットして
```
git add .
```
```
git commit -m "✨ :sparkles: あた機能を追加"
```
そうすると![4f32a179dce5ec72d04debfb7944e29c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516334/4103a0a0-eb47-07c9-2ca2-dda10d407ea7.png)
このようにわかりやすいです。コピペして状況に応じて少しいじったりもできるのでなかなか使い勝手がいいです。
英語にしたい方は英語に編集してみるといいと思います。
ただこのやり方だとわざわざ``.commit_template``ファイルにテンプレートを書かなくてもnotionなどにメモしてもいいです笑
かっこいいのでつくりましたが、、！
AIによるアプリ開発サポートを強化したSkeet AI v1.5をリリースしました。ChatGPT搭載のアプリをすぐに開発し公開できるオープンソースです。

![skeet-ai-v-1-5-released.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780317/7ef85786-0a63-69d3-13d2-1df192c6130c.png)

gm! エルソウルラボのkishi.solです。

AI によるアプリ開発サポートをさらに強化した Skeet AI v1.5 のリリースを発表しました。

Skeet は GCP (Google Cloud) と Firebase 上にフルスタックアプリを構築できるオープンソースの TypeScript 製サーバーレスフレームワークです。

Skeet を使えば、API サーバーから Web・iOS・Android アプリまですべてを TypeScript で爆速開発することができます。GraphQL や Firestore など、開発者体験の評判が良い技術を積極的に採用しています。ChatGPT や Vertex AI などの AI を活用したアプリケーション開発や Solana などのブロックチェーンを活用した Web3 dApp 開発も簡単に行うことができる現代的なアプリケーションフレームワークとなっています。

今回のアップデートにより、Skeet 開発のサポートに特化した AI モデル(ChatGPT 及び Vertex AI)を Skeet CLI から簡単に利用できるようになりました。これにより、Skeet は、AI による Skeet アプリ開発サポートを通じて、開発者の生産性をさらに向上させることを目指しています。

Skeet CLI (GitHub): https://github.com/elsoul/skeet-cli

Skeet AI (GitHub): https://github.com/elsoul/skeet-ai

## Skeet AI による開発サポート

アプリケーションフレームワークは、アプリケーション開発のための土台となるコードを自動生成することで、開発者の生産性を向上させることができます。
多くのフレームワークは開発ツールを提供しており、開発者はそのツールを使うことで、多くの開発を自動化することができます。

しかし、開発者がそのツールを使いこなすまでにはそれなりの学習時間が必要で、一度覚えたとしてもなんらかの原因によるブランクがあると使い方を忘れやすく、再度コマンドを覚え直したりする必要があります。

Skeet AI はこの課題を解決します。下記画像は、Skeet AI が提供する AI コンソールの一例です。

![skeet-ai-dev-support2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780317/1b054344-f796-e9af-d539-26b40184617a.png)


ここでは、ユーザーにツイートができるようにしたいという要望を Skeet AI に伝えるだけで、Skeet AI が自動的に必要なデータモデルを提案します。
開発者は、この提案されたデータモデルをそのまま採用することも、要望をより明確にしてデータモデルを改善することもできます。
データモデルが決まれば、Skeet AI は必要なコードを自動生成するか開発者に質問します。

開発者は AI に作りたいアプリについて相談するだけで、必要なコードが自動生成されるようになっています。

このように AI 開発サポートを充実させることで、フレームワーク自体の学習コストを削減し、開発者の生産性を向上させることができます。

現在有効になっている AI サポートは下記の通りです。

- Firestore のデータモデルの提案とコード自動生成 AI
- Prisma のデータモデルの提案と GraphQL コード自動生成 AI
- Skeet ドキュメントを学習した先生 AI
- 作成した関数の TypeDoc(TypeScript のドキュメント)生成 AI
- ドキュメントやアプリの多言語対応のための翻訳ファイル生成 AI

今後追加していく AI サポートは下記を予定しております。

- Firebase Functions のコード自動生成 AI (ロジック部分の開発サポート)
- 自分のアプリコードのコアを把握しているデバッグに強い AI

Skeet は、アプリケーションフレームワークとして、アプリケーション開発のための土台となるコードを自動生成するだけでなく、AI によるアプリケーション開発サポートを提供することで、開発者の生産性をさらに向上させることを目指しています。

Skeet は世界中すべてのアプリケーション開発現場の開発・メンテナンスコストを削減、開発者体験を向上させるためにオープンソースとして開発されています。

詳しくは公式ドキュメントを御覧ください。

Skeet ドキュメント: https://skeet.dev/ja/
cscの作法 その439

# 概要
cscの作法、調べてみた。
練習問題、やってみた。

# 練習問題
ComboBoxで表示と値が違うやつ

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/efdcf026-f08d-2078-66f1-bab035a171e5.png)

# サンプルコード

```
using System;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
using System.Data;

namespace App
{
	public partial class Form1: Form {
		ComboBox comboBox1;
		public Form1() {
			Text = "ComboBox";
			ClientSize = new Size(300, 300);
			Label label = new Label();
			label.Location = new Point(10, 50);
			label.Text = "フルーツ";
			DataTable dt = new DataTable();
			dt.Columns.AddRange(new DataColumn[] {
				new DataColumn("ID", typeof(int)),
				new DataColumn("Obj", typeof(string))
			});
			dt.Rows.Add(0, "");
			dt.Rows.Add(1, "バナナ");
			dt.Rows.Add(2, "マンゴー");
			dt.Rows.Add(3, "パパイア");
			dt.Rows.Add(4, "キウイ");
			comboBox1 = new ComboBox();
			comboBox1.Location = new Point(30, 100);
			comboBox1.DataSource = new BindingSource(dt, null);
			comboBox1.DisplayMember = "Obj";
			comboBox1.ValueMember = "ID";
			comboBox1.SelectedIndex = -1;
			comboBox1.SelectedValueChanged += comboBox1_TextChanged;
			//comboBox1.TextChanged += comboBox1_TextChanged;
			Controls.Add(label);
			Controls.Add(comboBox1);
		}
		private void comboBox1_TextChanged(object sender, EventArgs e) {
			int n = comboBox1.SelectedIndex;
			string str = comboBox1.Text;
			string str1 = comboBox1.SelectedValue.ToString();
			MessageBox.Show("selected: " + n + " (" + str + ": " + str1 + ")");
		}
		[STAThread]
		public static void Main() {
			Application.Run(new Form1());
		}
	}
}





```


以上。
せんせー、スマートウィンドウってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、スマートウィンドウってなに？

# スマートウィンドウとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## スマートウィンドウってなんですか？

皆さんが窓を想像してみてください。通常の窓は、明るさや外の景色を楽しむためのものですよね。しかし、「スマートウィンドウ」は、特別な技術が使われており、太陽光の量や透過度を調整することができる窓のことを指します。

## どのような働きをするのですか？

スマートウィンドウは、電気の通電や特定の刺激によって、ガラスの透明度を変更することができます。例えば、強い日差しの時には窓が自動的に色が濃くなって日差しを遮り、曇りの日などは透明になって明るさを確保することができます。

## なぜそれが便利なのですか？

スマートウィンドウを使うことで、エネルギーの節約や室内の快適さを向上させることができます。エアコンの使用頻度を減らしたり、照明の使用量を減らすことにより、電気代の節約にも繋がります。

# まとめ

スマートウィンドウは、先進的な技術を取り入れた窓で、その透明度を自在に変更することができます。これにより、室内の快適さやエネルギーの節約が期待されています。エコロジーや省エネルギーの観点からも、非常に注目されている技術となっております。
せんせー、イオントランスポーターってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、イオントランスポーターってなに？

# イオントランスポーターとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## イオントランスポーターってなんですか？

皆さん、私たちの体の細胞を構成する壁、すなわち細胞膜を想像してみてください。この細胞膜には、さまざまな物質が通り抜ける扉のようなものがあります。イオントランスポーターは、この扉のような役割を果たし、特定のイオン（電荷を持った原子や分子）を細胞の中へ入れたり、外へ出したりするためのタンパク質です。

## どのような働きをするのですか？

イオントランスポーターは、細胞の中や外の環境に合わせて、必要なイオンを適切な場所へ移動させます。これにより、細胞内のイオンの濃度を一定に保ったり、エネルギーの生成や神経の伝達などの生命活動をサポートします。

## なぜそれが大切なのですか？

細胞の中でのイオンの動きは、私たちの体のさまざまな機能に影響を与えます。例えば、筋肉の収縮や神経の信号伝達など、日常の活動には欠かせないものです。イオントランスポーターがしっかりと働くことで、これらの機能が正常に行われます。

# まとめ

イオントランスポーターは、細胞の中のイオンの移動を助ける大切なタンパク質です。この働きにより、私たちの体の多くの生命活動が支えられています。
せんせー、フェムトテクノロジーってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、フェムトテクノロジーってなに？

# フェムトテクノロジーとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## フェムトテクノロジーってなんですか？

皆さんは、「ナノテクノロジー」という言葉を聞いたことがあるかと思います。それは1億分の1メートルの世界での技術を指します。では、フェムトテクノロジーはどうでしょう？これはさらに小さい、1兆分の1メートルのスケールでの技術を指します。

## どんなことができるのですか？

フェムトテクノロジーのスケールでは、原子や分子のレベルでの操作やコントロールが考えられます。これにより、物質の基本的な性質を変更したり、新しい物質を作り出すことも夢ではありません。

## どうしてそれがすごいことなのですか？

このスケールでの技術開発は、物質の基本的な振る舞いを理解し、操作することが可能です。これは、新しい薬や高性能な素材、エネルギー変換技術など、多くの分野での革命的な進歩をもたらす可能性があります。

# まとめ

フェムトテクノロジーは、極めて小さいスケールでの技術開発を指します。これにより、物質の根本的な性質を操作し、新しい可能性を開くことが期待されています。
せんせー、メタトランジスタってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、メタトランジスタってなに？

# メタトランジスタとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## メタトランジスタってなんですか？

みなさん、トランジスタという部品をご存じでしょうか？電子機器の中に入っている、電気の流れをコントロールする部品のことを指します。メタトランジスタは、このトランジスタをさらに進化させた、特殊な構造を持った新しいタイプのトランジスタです。

## どんな特性があるんですか？

メタトランジスタは、メタマテリアルという特別な材料を利用しています。メタマテリアルは、自然界には存在しない特殊な電磁波の性質を持つことで知られています。メタトランジスタは、このメタマテリアルの特性を活かし、非常に高速に動作することや、特定の周波数の電磁波を効率よく扱うことができます。

## なぜそれが重要なのですか？

現代の電子機器は、より高速で、より効率的に動作することが求められています。メタトランジスタは、そのニーズに応えるための新しい技術の一つとして注目されています。

# まとめ

メタトランジスタは、メタマテリアルの特性を利用した新しいトランジスタの形です。この技術は、次世代の電子機器の性能向上に貢献する可能性があります。
せんせー、スーパーフルイドってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、スーパーフルイドってなに？

# スーパーフルイドとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## スーパーフルイドってなんですか？

皆さん、普通の液体を思い浮かべてみてください。水やジュースのように、何らかの抵抗感を持ちながら流れるものですよね。しかし、スーパーフルイドというのは特別な液体で、全く摩擦や抵抗を感じることなく流れる性質を持っています。

## どのような特性があるんですか？

スーパーフルイドは、超低温で特定の物質（例えばヘリウム-4）が示す現象です。この状態では、液体は壁を上って容器から溢れ出るような不思議な振る舞いを見せたりします。それは、液体が内部の摩擦を一切感じないためです。

## それって、どうして驚くべきことなんですか？

普通の液体は、何かと接触すると摩擦が生じますが、スーパーフルイドはその常識を覆します。この特異な性質は、物理学や技術の分野で大きな興味を持たれています。

# まとめ

スーパーフルイドは、超低温で見られる特別な液体の性質であり、内部の摩擦を感じないという驚くべき特性を持っています。この現象は、物理学の研究や新しい技術の発展に寄与する可能性があります。
せんせー、リキッドクリスタルエラストマーってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、リキッドクリスタルエラストマーってなに？

# リキッドクリスタルエラストマーとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## リキッドクリスタルエラストマーってなんですか？

みなさん、液晶（リキッドクリスタル）という言葉を聞いたことがあるかと思います。テレビや計算機の画面によく使われるものです。リキッドクリスタルエラストマーは、この液晶の性質を持ちつつ、ゴムのように伸び縮みする素材のことを指します。

##どんな特性を持っているんですか？

リキッドクリスタルエラストマーは、温度や光の変化に応じて形を変えることができる特性を持っています。これは、液晶の分子が特定の方向に整列する性質と、ゴムのような伸縮性を組み合わせたためです。

## どんな利用方法が考えられるんですか？

この素材は、温度や光に応じて形を変えることができるので、ロボットの関節や、新しいタイプのディスプレイ、センサーなど、さまざまな用途での利用が考えられます。

# まとめ

リキッドクリスタルエラストマーは、液晶の特性とゴムの伸縮性を持ち合わせた新しい素材です。これにより、未来の技術や製品において、さまざまな応用が期待されています。
せんせー、テラヘルツレーダーってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、テラヘルツレーダーってなに？

# テラヘルツレーダーとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## テラヘルツレーダーってなんですか？

みなさん、テラヘルツという単位を聞いたことはありますか？光や電波のようなものの中で、特定の波長を持つものをテラヘルツと呼んでいます。テラヘルツレーダーは、このテラヘルツの波長を利用して、物や物体を探ったり、調べたりする装置のことです。

## どんな特徴があるんですか？

テラヘルツの波長は、光と電波の中間に位置しています。この特性を利用すると、紙や布、プラスチックなどを透過して、中のものを見ることができるんです。例えば、荷物の中身をチェックする際に役立つことがあります。

## それって、どうして便利なんですか？

テラヘルツレーダーは、物体を傷つけることなく、または物体に直接触れることなく、中を見ることができます。このため、安全性の確認や研究、検査などの場面で非常に役立ちます。

# まとめ

テラヘルツレーダーは、テラヘルツの特性を利用して、物の中を見ることができる技術です。さまざまな場面での活用が期待されており、今後の技術発展にも寄与すると思われます。
せんせー、ゲートチューナブルグラフェンってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、ゲートチューナブルグラフェンってなに？

# ゲートチューナブルグラフェンとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## ゲートチューナブルグラフェンってなんですか？

みなさん、グラフェンという、とても薄い素材をご存じですか？鉛筆の芯にも少し含まれています。ゲートチューナブルグラフェンとは、このグラフェンの特性をちょっと変えることができる技術のことです。

## それって、どういうことですか？

グラフェンは、電気をとてもよく通すことができるんです。ゲートチューナブルグラフェンの技術を使うと、その電気の通り方を細かく調整することができます。

## それがすごいのは、なぜですか？

電気の流れをコントロールすることで、電子機器やセンサーなどの性能を向上させることができるんです。だから、ゲートチューナブルグラフェンは、新しい技術や製品を作る上でとても役に立ちます。

# まとめ

ゲートチューナブルグラフェンは、電気の性質をうまく調整できる技術なんです。これを使うと、さまざまな新しい技術や製品を作ることができるようになります。