OmniAICreator/Qiita-1.07M huggingface dataset:
AIでGitコミットメッセージを自動生成

## aicommitsとは？
aicommitsは、OpenAIのGPTモデルを活用してGitの変更内容に応じたコミットメッセージを自動生成するCLIツールです。このツールを使えば、AIがコード変更を分析し、適切なコミットメッセージを提案してくれます。これにより、エンジニアはコミットメッセージにかける時間を減らし、コードの品質向上に専念できるようになります。

## インストール方法
### 1. Node.jsのインストール

aicommitsはNode.jsで動作するため、Node.js v14以上が必要です。Node.jsのバージョンは以下のコマンドで確認できます。

```bash
node --version
```

### 2. aicommitsのインストール

npmを使用して、aicommitsをグローバルにインストールします。

```bash
npm install -g aicommits
```

### 3. OpenAI APIキーの設定

aicommitsを利用するには、OpenAIのAPIキーが必要です。OpenAIの公式サイトからAPIキーを取得し、以下のコマンドで設定します。

```bash
aicommits config set OPENAI_KEY=<your-api-key>
```

## 基本的な使い方
### 1. ファイルをステージングしてコミットメッセージを生成

Gitに変更を追加した後、aicommitsを実行するだけでコミットメッセージを自動生成します。

```bash
git add <files...>
aicommits
```

### 2. コミットフラグの利用

aicommitsはGitのコミットフラグを受け取ることができます。たとえば、すべての変更を一度にステージングしてコミットするには以下のコマンドを使います。

```bash
aicommits --all # または -a
```

### 3. 複数のメッセージを生成

提案されたコミットメッセージが気に入らない場合、複数のメッセージを生成して選ぶことができます。

```bash
aicommits --generate 3 # または -g 3
```

### 4. Conventional Commitsに対応

プロジェクトでConventional Commitsの規約を採用している場合、コミットメッセージをその形式に合わせて生成できます。

```bash
aicommits --type conventional # または -t conventional
```

## 設定オプション
### 1. APIキーの設定と確認

設定されたAPIキーは次のコマンドで確認できます。

```bash
aicommits config get OPENAI_KEY
```

### 2. 生成するメッセージ数の設定

通常、aicommitsは1つのメッセージを生成しますが、設定で生成数を変更できます。

```bash
aicommits config set generate=3
```

### 3. メッセージの最大文字数

コミットメッセージの最大文字数はデフォルトで50文字ですが、設定で変更することが可能です。

```bash
aicommits config set max-length=100
```

## 参考
https://github.com/Nutlope/aicommits
モバイルの勉強3GPP Release 15のサマリTR21.915を読む

私の3GPPの知識はRelease 11で止まっているので、5Gの1st full steであるRel15からリスキリングで勉強します。少しずつ更新予定。

## 更新履歴
2024年10月9日　とりあえず目次を見て気になるところをピックアップ

# 参考文献
[1]Release 15サマリの3GPPのHP [link](https://www.3gpp.org/specifications-technologies/releases/release-15)
[2]Release 15 Description; Summary of Rel-15 Work Items v15.0.0 [link](https://portal.3gpp.org/desktopmodules/Specifications/SpecificationDetails.aspx?specificationId=3389)

# [1]のメモ
2019年Q3にlate drop の ASN.1がfreezeしたらしい。[1]
早期実装のために、NSA, 5FSA, late dropと段階的に分けて、短い期間で標準に尽力されたことが、スケジュールから見て取れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/ae24367a-2047-0efd-2a6b-b3ac70757c00.png)
図の出典[1]

# [2]のメモ　
3GPP TR 21.915 V15.0.0 (2019-09) Summary of Rel-15 Work Items
## 目次の抜粋
目次を見て気になる節を抜粋、少しずつ読んでいきます。
| 章番号 | タイトル | 内容 | 個人的に気になる | ステータス |
|:------|:---------|:-------|:--------|:---------|
| 3 | Definitions of terms　| 略語の定義　| 超重要 | 未 |　
| 4 |  Exective Summary　| | 超重要 | 未 |
| 5 |  The 5G System Phase1 | | 超重要 | 未 |
| 5.3 |  5GS Architecture |アーキテクチャ | 超重要 | 未 |
| 5.5.2 |  5G Core Network | 5Gコア //スライス、ポリシー&QoS、Exposure | 超重要 | 未 |
| 5.4.3 |  5G Access Network | C/Uプレーン　//無線のL2 RRC ハンドオーバー関連のインタフェース | 超重要 | 未 |
| 5.5.4 |  Radio Physical layner | ヌメノロジ、Wavefrorm、MIMO、スケジューリング、 | 分からないので気になる| 未 |
| 5.6. |  その他　| Dual Connectivity, NSA, | 分からないので気になる| 未 |
| 6  | Critical Communication | 低遅延系 | ベストエフォート | 未 |
| 7  | Mathine=Type Communication and IoT | IoT系 |  ベストエフォート | 未 |
| 8  | V2X | 車系　 | ベストエフォート | 未 |　
| 9  | Massive Critical | 重要通信系  | ベストエフォート | 未 |
| 10  | | Wi-Fi連携系  | ベストエフォート | 未 |
| 11  | その他　|  Railway, Nothbound API  | ベストエフォート | 未 |
| 12  | SYstm 拡張 | QoE, VR  | ベストエフォート | 未 |
| 13  | LTE拡張　 | | 分からないので気になる| 未 |
| 14  | オペレーション＆マネージメント|   | ベストエフォート | 未 |

教はここまで
Nuxt3のサーバサイドで複数Cookieをまとめて取得する

:::note warn
2024年10月現在の情報となります。
頻繁に更新があるため、利用の際には公式ドキュメントを参照するようお願いします。
:::
## useCookieでCookieを取得
Nuxt3にはCookieを取得するための`useCookie`というComposablesが用意されています。

[useCookie · Nuxt Composables ](https://nuxt.com/docs/api/composables/use-cookie)

```ts
const cookie = useCookie(name, options)
```
ただし、キー名指定で1個ずつしか取得できません。

## 複数Cookieを取得

`useRequestHeaders`が使えます。

[useRequestHeaders · Nuxt Composables ](https://nuxt.com/docs/api/composables/use-request-headers)

```cookies.ts
const headers = useRequestHeaders(['cookie'])
```

これを利用したComposablesの実装例です。

```useFetchCookie.ts
export const useFetchCookie = async () => {

  // SSRの場合はリクエストにcookieを手動追加
  const headers: HeadersInit = useRequestHeaders(['cookie'])

  const { data, status, execute } = useFetch('/api/path', {
    method: 'GET',
    headers: headers,
  })
  
  return {
    data: readonly(data),
    status: readonly(status),
    execute
  }
}
```

## H3Eventを利用できるとき
`getHeader(event, 'Cookie')`が使えます。
`@supabase/ssr`の`createServerClient`を宣言する際に必要な`getAll`とかで使えます。

```useSupabase.ts
import { CookieOptions, createServerClient, parseCookieHeader } from '@supabase/ssr'
import type { H3Event } from 'h3'

export const useSupabase = async (event: H3Event) => {
  const config = useRuntimeConfig()
  const supabase = createServerClient(
    config.supabaseUrl,
    config.supabaseAnonKey,
    {
      cookies: {
        getAll: () => parseCookieHeader(getHeader(event, 'Cookie') ?? ''),
        setAll: (
          cookies: {
            name: string
            value: string
            options: CookieOptions
          }[],
        ) => cookies.forEach(({ name, value, options }) => setCookie(event, name, value, options)),
      }
    }
  )

  return { supabase }
}
```

## （余談）useRequestHeadersを見つける前の話

`useCookie`の実装を見に行きます。

https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/cookie.ts

exportされていない`readRawCookies`というメソッドがあるみたいなので、追ってみると次の記述が見つかります。

```cookie.ts
function readRawCookies (opts: CookieOptions = {}): Record<string, unknown> | undefined {
  if (import.meta.server) {
    return parse(getRequestHeader(useRequestEvent()!, 'cookie') || '', opts)
  } else if (import.meta.client) {
    return parse(document.cookie, opts)
  }
}
```

`getRequestHeader(useRequestEvent()!, 'cookie')`で取れるようです。

<details><summary>実装例</summary>

```useFetchCookie.ts
import { getRequestHeader } from 'h3'

export const useFetchCookie = async () => {

  // SSRの場合はリクエストにcookieを手動追加
  const cookies = import.meta.server ? getRequestHeader(useRequestEvent()!, 'cookie') : undefined
  const headers: HeadersInit = cookies ? { Cookie: String(cookies) } : {}

  const { data, status, execute } = useFetch('/api/path', {
    method: 'GET',
    headers: headers,
  })
  
  return {
    data: readonly(data),
    status: readonly(status),
    execute
  }
}
```
</details>
enebularでnode-red その17

# 概要
enebularでnode-redやってみる。
練習問題やってみた。

# 練習問題
webapiを作れ。

# 方針
- クラウド実行環境使う。
- datastore使う。
- エンドポイントにGETなら、一覧をjsonで返す。
- エンドポイントにPOSTなら、保存して、jsonで返す。
- jsonは、timestamp,name,commentで出来てる。
- datastoreは、メインキーにtimestamp。

# クラウド実行環境
データストアへの接続
データストアへの接続を行う場合は"ON"にしてください。

# datastore


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/0caa791a-5cee-e90c-6ba6-371bbea71f3b.png)



# フロー
- switchでPOST、GETを分岐する
- GETなら、データ検索して、一覧をJSONで返す。
- POSTなら、データ保存して、JSONで返す。
- timestampは、投入するデータを整える。
- json headersで、Content-Typeをjsonにする。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/31b84ab3-3075-4429-da84-6feed5c8bffd.png)


# 接続テスト

```
curl -i https://lcdp003.enebular.com/****/
```

# json

```
[
{"timestamp":"1728082796491"},
{"timestamp":"1728083796491","name":"ai","publish":"ture","condition":"good","comment":"ok"},
{"timestamp":"1728083845078","name":"aita","publish":"1","condition":"good","comment":"ok"},
{"timestamp":"1728082865943"},
{"timestamp":"1728360810390","name":"test","comment":"iine"},
{"timestamp":"1728082597520"},{"timestamp":"1728082516509"},
{"timestamp":"1728082616074"}
]

```

以上
Terraformの関数、式、リソースの値をすばやく確認する方法

## はじめに

Terraformは、Infrastructure as Code (IaC) を実現する強力なツールですが、その関数や式の挙動を理解することは、効率的なインフラストラクチャ管理の鍵となります。本記事では、`terraform console`コマンドを利用して、関数、式、リソースの値などをすばやく確認する方法について紹介します。このコマンドは、本番環境に影響を与えることなく、Terraformの動作を事前に確認できる非常に便利なコマンドです.

## terraform consoleの使用法

### コマンド構文

```console
terraform [global options] console [options]
```

このコマンドは、ルートモジュールのstate（状態）を自動的に読み込みます。ルートモジュールのディレクトリに移動するか、`-chdir`グローバルオプションを使用してワーキングディレクトリを指定してください.

### オプション

| オプション | 説明 |
|------------|------|
| -var 'foo=var' | 実行時変数を動的に設定 |
| -var-file=foo | 変数ファイルからの一括設定 |
| -plan | 実行計画の事前生成（`terraform plan`相当） |

これらのオプションにより、様々なシナリオや設定でのテストが可能になります.

## 使用例

### 対話形式

対話形式で関数や式の結果を確認できます。

```
❯ terraform console
> one([])
null
> one(["a"])
"a"
> one(["a", "b"])
╷
│ Error: Invalid function argument
│
│   on <console-input> line 1:
│   (source code not available)
│
│ Invalid value for "list" parameter: must be a list, set, or tuple value with either zero or one elements.
```

この例では、`one()`関数の挙動を検証しています。空リスト、単一要素リスト、複数要素リストに対する結果が即座に確認できます.

### スクリプトモード

パイプラインを使用したスクリプトモードも可能で、自動化やバッチ処理に適しています。

```console
❯ echo 'one(["a"])' | terraform console
"a"
```

このアプローチは、CIパイプラインやシェルスクリプトでの使用に特に有効です.

## 条件式のテスト
変数に基づいた条件分岐のロジックをテストできます。
```hcl:main.tf
variable "env" {}
```
```
❯ terraform console -var="env=prd"
> var.env == "prd" ? 1 : 0
1
> var.env == "dev" ? 1 : 0
0
```


## リソース属性の参照
既存のリソースの属性を参照し、その値を確認することが可能です。
```hcl:main.tf
resource "random_pet" "main" {
  count = 3
}

```
```
> random_pet.main[*].id
[
  "divine-guppy",
  "nearby-weasel",
  "enormous-dolphin",
]
```

**注意：**
`terraform apply`でリソースを反映していない場合は、applyをするまで値を確認することができません。
```
❯ terraform console
> random_pet.main[*].id
(known after apply)
```
## まとめ

`terraform console`は、Terraformの関数、式、リソースの値などを簡単に確認できるツールです。この機能を活用することで、コードの品質向上、デバッグ時間の短縮が可能になります。

## 動作を確認した環境

- Terraform v1.9.2

## 参考
https://developer.hashicorp.com/terraform/cli/commands/console
【基本情報】独学マラソン ソートアルゴリズム Day 9

ナガノさんは足るを知り尽くしている

:::note worn
この記事は自分用の備忘録です。
:::



# ソートはアルゴリズムの基本
ソートの種類、あなたはいくつ言えますか？


![sort-image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3736578/10e7698d-5cc7-5bab-bdc1-e5738b4c62bb.jpeg)


### バブルソート
- 隣り合う要素を比較しながら、必要に応じて大小を入れ替える方法
- シンプルだが、リストのサイズが大きいと処理時間が増えるので効率が悪い
- 例：
    - 1回目
        - [3, 5, 8, 4, 2] → [3, 5, 8, 4, 2] → [3, 5, 4, 8, 2] → [3, 5, 4, 2, 8]
    - 2回目
        - [3, 5, 4, 2, 8] → [3, 4, 5, 2, 8] → [3, 4, 2, 5, 8]
    - 3回目
        - [3, 4, 2, 5, 8] → [3, 2, 4, 5, 8]
    - 4回目
        - [2, 3, 4, 5, 8]

<br>

### クイックソート
- 分割統治法を利用
- 基準値（ピボット）を選んで、それより小さい値と大きい値に分割することを繰り返す
- バブルソートよりも高速
- 例：
    - [5, 3, 8, 4, 2]
        - ピボット：5
            - 左 [3, 4, 2]、右 [8]
    - 左側 [3, 4, 2] 
        - ピボット：3
            - 左 [2]、右 [4]
    - 各部分を結合: [2, 3, 4] + [5] + [8]

<br>

### マージソート
- データを分割し、最小の単位からソート、マージを繰り返す
- 処理時間がデータの並びに依存しないので安定する
    - [1,4,3,2]と[1,2,4,3]の場合でも、同じ処理時間になる
- 例：
    - データ：[1, 4, 3, 2]
    - 分割
        - [1, 4] と [3, 2]
            - [1]、[4]、[3]、[2] 
    - マージ
        - [1] と [4] をマージ → [1, 4]
        - [3] と [2] をマージ → [2, 3]
        - [1, 4] と [2, 3] をマージ → [1, 2, 3, 4]

<br>

### 選択ソート
- リストの中から最小の要素を探し、それをリストの先頭に持ってくる操作を繰り返す
- マージソートと同様に、処理時間がデータの並びに依存しないので安定する
- 操作回数が多いため、大規模なデータには不向き
- 例：
    - [5, 3, 8, 4, 2]
        - 2を5と入れ替え
            - [2, 3, 8, 4, 5]
    - [3, 8, 4, 5]
        - 入れ替え不要
    - [8, 4, 5]
        - 4と8を入れ替え
            - [4,8,5]
    - [8,5]
        - 8と5を入れ替え
            - [5,8]
    - 結果[2,3,4,5,8]

<br>

### 挿入ソート
- 前から2個要素を取り出し、順序が逆なら入れ替えて、その後は1つずつ適切な位置に挿入することを繰り返す
- 既にある程度整列されているデータの場合、効率が良い
    - 運要素絡む感じ
- 例：
    - データ：[5, 3, 8, 4, 2] 
    - 5と3を比較、入れ替え
        - [3, 5, 8, 4, 2]
    - 8を取り出し、[3,5]と比較
        - [3,5,8]
    - 4を取り出し、[3,5,8]と比較
        - [3,4,5,8]
    - 2を取り出し、[3,4,5,8]と比較
        - [2,3,4,5,8]

<br>

# どれを使えばいいの？
- データが小規模
    - 挿入ソートや選択ソート
- データが大量
    - マージソートやクイックソート
- 特定の範囲に限定
    - 基数ソートやカウントソート

# ソートはまだまだあるらしい
- ヒープソート
    - ヒープ（最大ヒープまたは最小ヒープ）を利用し、最大（または最小）要素を順に取り出してソートするアルゴリズム
- シェルソート
    - 挿入ソートの改良版。要素を一定間隔で比較してソートし、その間隔を徐々に狭めることで効率的にソートする
- カウントソート
    - 値の範囲が限定されているときに使用する非比較ソート
    - 各値の出現回数を数え、その回数に基づいてリストを再構築する
- 基数ソート
    - 各桁ごとにデータをソートする非比較ソート
    - 整数や文字列のソートに適している
- バケツソート
    - データを複数の「バケツ」に分け、それぞれのバケツ内でソートを行い、最終的にバケツの内容を結合する
- 蜘蛛ソート
    - 隣接する要素を比較して、順序が間違っていれば戻って入れ替える
    - バブルソートに似ているが、前後に移動する
- コムソート
    - バブルソートの改良版
    - 隣接する要素だけでなく、間隔を広げた要素同士を比較し、徐々に間隔を縮めながらソートする
- トポロジカルソート
    - 有向非巡回グラフ（DAG）のノードを順序づけるソート
    - タスクの依存関係を解消する際などに使用
- バケットソート
    - データをそれぞれの値に対応するバケツ（または穴）に入れ、そこから順番に要素を取り出す。データの範囲が狭い場合に有効




# 感想
ソートの種類がこんなにたくさんあるとは‥
対数(log)とか久々に見たよ‥

# 参考

https://products.sint.co.jp/topsic/blog/algorithm-type
paiza.ioでelixir その324

# 概要
paiza.ioでelixirやってみた。
練習問題、やってみた。

# 練習問題
リストなタプルをソートせよ。

# サンプルコード

```

[
%{timestamp: "1728082796491"},
%{timestamp: "1728083796491", name: "ai", publish: "ture", condition: "good", comment: "ok"},
%{timestamp: "1728083845078", name: "aita", publish: "1", condition: "good", comment: "ok"},
%{timestamp: "1728082865943"},
%{timestamp: "1728360810390", name: "test", comment: "iine"},
%{timestamp: "1728362175611", name: "test", comment: "good"},
%{timestamp: "1728082597520"},
%{timestamp: "1728362004019", name: "test", comment: "last"},
%{timestamp: "1728361668285", name: "test", comment: "こんにちは"},
%{timestamp: "1728361943212", name: "test", comment: "良いね"}
]
|> Enum.sort_by(fn x -> 
    x.timestamp
end, :asc)
|> IO.inspect 


```

# 実行結果

```

[
  %{timestamp: "1728082597520"},
  %{timestamp: "1728082796491"},
  %{timestamp: "1728082865943"},
  %{
    comment: "ok",
    condition: "good",
    name: "ai",
    publish: "ture",
    timestamp: "1728083796491"
  },
  %{
    comment: "ok",
    condition: "good",
    name: "aita",
    publish: "1",
    timestamp: "1728083845078"
  },
  %{comment: "iine", name: "test", timestamp: "1728360810390"},
  %{comment: "こんにちは", name: "test", timestamp: "1728361668285"},
  %{comment: "良いね", name: "test", timestamp: "1728361943212"},
  %{comment: "last", name: "test", timestamp: "1728362004019"},
  %{comment: "good", name: "test", timestamp: "1728362175611"}
]

```

# 成果物

https://paiza.io/projects/jORHR3nTfta7E8vHDez7cQ


以上
yukicoder No.2789 hako111223’s Master Thesis 解説

[問題文](https://yukicoder.me/problems/no/2789)
# 解説
まず前提として12月は31日ある。よって、論文を書ける時間は$B+31-A$日。これを基準に場合分けをすればよい。

# C++での解答例
```C++
#include <bits/stdc++.h>
using namespace std;

int main() {
  int a, b, c, d;
  cin >> a >> b >> c >> d;
  b += 31;
  if(b - a >= c) {
    cout << 1 << endl;
  }
  else if(b - a >= d) {
    cout << 2 << endl;
  }
  else {
    cout << 3 << endl;
  }
}
```
paiza.ioでnode.js その4

# 概要
paiza.ioでnode.js、やってみた。
練習問題やってみた。

# 練習問題
リストなタプルをソートせよ。

# サンプルコード

```
process.stdin.resume();
process.stdin.setEncoding('utf8');

var rowElements = [{"timestamp":"1728082796491"},{"timestamp":"1728083796491","name":"ai","publish":"ture","condition":"good","comment":"ok"},{"timestamp":"1728083845078","name":"aita","publish":"1","condition":"good","comment":"ok"},{"timestamp":"1728082865943"},{"timestamp":"1728360810390","name":"test","comment":"iine"},{"timestamp":"1728362175611","name":"test","comment":"good"},{"timestamp":"1728082597520"},{"timestamp":"1728362004019","name":"test","comment":"last"},{"timestamp":"1728361668285","name":"test","comment":"こんにちは"},{"timestamp":"1728361943212","name":"test","comment":"良いね"}];

console.log(rowElements)

var target = [];

var result = Array.from(rowElements).sort(function(line1, line2) {
    return (line1.timestamp < line2.timestamp) ? -1 : 1;
});


for(var i = 0; i < result.length; i++)
{
   target.push(result[i]);
}

console.log(target)



```

# 

```
[
  { timestamp: '1728082796491' },
  {
    timestamp: '1728083796491',
    name: 'ai',
    publish: 'ture',
    condition: 'good',
    comment: 'ok'
  },
  {
    timestamp: '1728083845078',
    name: 'aita',
    publish: '1',
    condition: 'good',
    comment: 'ok'
  },
  { timestamp: '1728082865943' },
  { timestamp: '1728360810390', name: 'test', comment: 'iine' },
  { timestamp: '1728362175611', name: 'test', comment: 'good' },
  { timestamp: '1728082597520' },
  { timestamp: '1728362004019', name: 'test', comment: 'last' },
  { timestamp: '1728361668285', name: 'test', comment: 'こんにちは' },
  { timestamp: '1728361943212', name: 'test', comment: '良いね' }
]
[
  { timestamp: '1728082597520' },
  { timestamp: '1728082796491' },
  { timestamp: '1728082865943' },
  {
    timestamp: '1728083796491',
    name: 'ai',
    publish: 'ture',
    condition: 'good',
    comment: 'ok'
  },
  {
    timestamp: '1728083845078',
    name: 'aita',
    publish: '1',
    condition: 'good',
    comment: 'ok'
  },
  { timestamp: '1728360810390', name: 'test', comment: 'iine' },
  { timestamp: '1728361668285', name: 'test', comment: 'こんにちは' },
  { timestamp: '1728361943212', name: 'test', comment: '良いね' },
  { timestamp: '1728362004019', name: 'test', comment: 'last' },
  { timestamp: '1728362175611', name: 'test', comment: 'good' }
]
```

# 成果物

https://paiza.io/projects/gySkaNFJw-w-x0t2nJ8nNA


以上
[C言語 #6] 変数② ~ 型 ~

<!--
 <font color="c00000"></font> 赤
-->
## はじめに
こんにちは　今日帰宅途中、素直に思ったこと..「寒ッ！！:grimacing:」もう四季が二季みたいですな

今回は[前回の続き](https://qiita.com/aoiku/items/e708760011d7af7c5af3)で <font color="c00000"> **「型」**</font>について取り上げていきたいと思います。

## 型のしくみ
[変数](https://monozukuri-c.com/langc-variable/)には<font color="c00000">**値を記憶させる**</font>ことができます。
この値にはいくつかの「**種類**」があります。値の種類には、「**データ型**」または「**型**」と呼ばれています。
C言語には、このような基本的な型（基本型）があります。
![スクリーンショット 2024-10-08 224435.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806875/370051e2-377a-1953-50c5-aba63cb32f9c.png)

変数を使うためには、<font color="c00000">**どの型の値を記憶させる変数なのか**</font>を、**予め決めておく**必要があります。一例ですが...
```c
// short int型という種類の値を記憶できる変数について
```
このような変数を使うと、「-32678~32767」までの範囲の整数のうちの、どれか一つの値を記憶させることができます。
![C03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806875/49608909-8e47-523e-5f23-eae247af66e7.png)

## おわりに
今回のちょっとしたまとめになります。

:::note info
変数を使うには、**型を指定する**必要があります
:::
:::note warn
C言語の基本型のサイズは、**開発環境によって異なる場合があります**
:::
次回は変数を「宣言」してみたいと思います。
最後までお読みいただきありがとうございました！

> **「参考書」**
[やさしいC 第5版 (「やさしい」シリーズ)](https://www.amazon.co.jp/%E3%82%84%E3%81%95%E3%81%97%E3%81%84C-%E7%AC%AC5%E7%89%88-%E3%80%8C%E3%82%84%E3%81%95%E3%81%97%E3%81%84%E3%80%8D%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E9%AB%98%E6%A9%8B-%E9%BA%BB%E5%A5%88/dp/4797392584)
>
> **「参考サイト」**
[「苦しんで覚えるＣ言語」～C言語の型～](https://9cguide.appspot.com/15-03.html)
>
Ruby 3.4 ではデフォルトのブロックパラメータとして it が使える

## この記事は？

Ruby 3.4 で導入される it について説明します。

## it とは？

来たる Ruby 3.4 ではデフォルトのブロックパラメータとして it が使えるようになります (まるで [Kotlin の it](https://kotlinlang.org/docs/lambdas.html#it-implicit-name-of-a-single-parameter) みたいですね) 。it は暗黙的にブロックに渡された 1 番目のパラメータを参照します。この場合、配列の各要素です。ブロックパラメータを明示的に指定する必要がなく、ブロックをよりシンプルに書けるようになります。

```rb
# 通常のブロックパラメータ
[2, 4, 1, 3].sort_by { |n| n }
#=> [1, 2, 3, 4]

# it
[2, 4, 1, 3].sort_by { it }
#=> [1, 2, 3, 4]
```

既存の[番号指定パラメータ](https://docs.ruby-lang.org/ja/latest/doc/spec=2fcall.html#numbered_parameters)とも似ています。

```rb
# 番号指定パラメータ
[2, 4, 1, 3].sort_by { _1 }
#=> [1, 2, 3, 4]

# it
[2, 4, 1, 3].sort_by { it }
#=> [1, 2, 3, 4]
```

なぜ、すでに番号指定パラメータという似た仕組みが存在するのに it が追加されるのでしょうか？それは Ruby の Redmine のチケット [#18980](https://bugs.ruby-lang.org/issues/18980) で言及されていました。認知的なオーバーヘッドを軽減するというのが目的のようです。

> Why I don't use _1
>
> I'm not clever enough to remember the order of parameters. Therefore, when a block has multiple parameters, I'd always want to name those parameters because which is _1 or _2 is not immediately obvious. Thus I would use this feature only when a block takes a single argument, which is actually pretty common.
>
> If I use _1, it feels like there might be a second argument, and you might waste time to think about _2, even if _2 doesn't exist, which is a cognitive overhead. If you use it, it kinda implies there's only a single argument, so you don't need to spend time remembering whether _2 exists or not. It is important for me that there's no number in it.

> なぜ私は _1 を使わないのか
>
> 私はパラメータの順番を覚えるほど賢くないからです。そのため、ブロックに複数のパラメータがある場合にパラメータに名前を付けたいです。なぜなら _1 なのか _2 なのかがすぐに分からないからです。したがって、この機能を使うのは、ブロックが単一の引数を取る場合のみです。これは実際によくあることです。
>
> _1 を使用すると、2 番目の引数があるのだと考えます。_2 が存在しなくても _2 について考えるのに時間を費やしてしまう場合があります。これは認知的なオーバーヘッドです。もし it を使用すると引数が 1 つだけであることを暗示するので、_2 が存在するかどうかを覚えるのに時間を費やす必要がなくなります。数字が含まれていないことが私にとっては重要です。

## バージョン情報

```shell-session
$ ruby -v
ruby 3.4.0preview2 (2024-10-07 master 32c733f57b) +PRISM [arm64-darwin23]
```

## 参考

- [Feature #18980: Re-reconsider numbered parameters: `it` as a default block parameter - Ruby master - Ruby Issue Tracking System](https://bugs.ruby-lang.org/issues/18980)
【( ..)φメモメモ】Android Studio でつまずく些細なこと

# ActivityTrigger(system_server)のエラー

`app`を実行すると **ActivityTrigger(system_server)** から次のエラーが **Logcat** に出力されることがあります。

- エラー `activityStartTrigger: not whiteListed`
- エラー `activityResumeTrigger: not whiteListed`

**【回避？】**
`app`実行時にLogcatを表示するように構成を変更するとエラーが出なくなるようです？

**補足：** これらのエラーはエラーではないとの情報もありますし、`minifyEnabled`を`false`に設定するように助言している情報もあります。

```app\build.gradle.kts
    :
    buildTypes {
        debug {
            isMinifyEnabled = false
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
        }
        release {
            isMinifyEnabled = true
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
        }
    }
    :
```

# `app`実行時にLogcatを表示したい

**Run**の**Edit Configurations**で、`Show logcat automatically` をチェックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/98258cf4-0fb9-b188-fb68-a95e7ba47552.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/7013a603-1e5d-313c-c445-616f7d9c7c98.png)

# `.idea` フォルダ

プロジェクトのルートに `.idea` フォルダが作成されますが、gitリポジトリから除外します。

```text: .gitignore
*.iml
.gradle
/local.properties
/.idea
.DS_Store
/build
/captures
.externalNativeBuild
.cxx
local.properties
```

# Reformat Code - ctrl + alt + L

`File` > `Setting` を開き、`Menus and Toolbars` の `Editor Popup Menu` に `Code Formatting Actions` を `+` ボタンで、追加する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/92936b20-ae17-49f7-b8a2-9c1d92a6f3c8.png)


# テストの自動実行

ソースコードを編集するたびに、テストが自動実行されるようになってしまった。

次のアイコンで、有効・無効の切り替えが可能。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/0f3c23b3-c076-4ebb-bd28-a03ba22eb2e7.png)
JavaScriptのバブリングとキャプチャリング

JavaScriptのイベントバブリングとキャプチャリングについて知る機会があったので簡単にまとめます。

### バブリングとは
ご存知の方も多いと思いますが、子要素で発火したイベントが親要素にまで伝播することをバブリングと言います。よく考えてみれば普段から目にする光景で、
```html
<div id='button'>
    <div>テキスト</div>
    <div>テキスト2</div>
</div>
```
このようにid='button'のdiv要素にクリックイベント時の処理を追加した時、内部のテキスト部分（子要素のdiv）をクリックしても処理が実行されます。これは子要素から親へとイベントが伝播しているためです（ボタン内部の要素もボタンの一部なので、感覚的にこの挙動に違和感がなく、バブリングについて意識することがありませんね）
また、子 → 親 → その親 → その親 ... とどんどん上へバブリングしていくイベントですが、イベントリスナーに渡すコールバック関数のイベント引数の**currentTarget**でアクセスできます。逆に、イベントが生じた出発源となる要素には**target**でアクセスできます。

### キャプチャリングとは
①イベントが生じた要素 → ②その先祖要素、の順でバブリングするイメージですが、⓪番目にあたるフェーズがあります。それがキャプチャリングフェーズで、
**⓪windowオブジェクトから出発してイベントが下りてくる → ①targetでイベントが生じる → ②親方向へイベントが上がっていく**
こういう順番でイベントは**降りて来て、そして去っていきます。**

以下のコードではその順をコンソ－ルで確認できます。なお、**キャプチャリングフェーズのイベントはaddEventListenerの第３引数にtrueを設定することで取得できます。**

``` html
<body>
    <div id="parent">
      親
      <div id="child">
        子
        <div id="grandchild">孫</div>
      </div>
    </div>
  </body>
```
``` javascript
document.addEventListener("DOMContentLoaded", () => {
  const parentNode = document.getElementById("parent");
  const childNode = document.getElementById("child");
  const grandchildNode = document.getElementById("grandchild");

  if (!parentNode || !childNode || !grandchildNode) return;

  [parentNode, childNode, grandchildNode].forEach((node) => {
    node.addEventListener("click", (e) => {
      console.log(e.currentTarget.id + "キャプチャリングなし");
    });

    node.addEventListener(
      "click",
      (e) => {
        console.log(e.currentTarget.id + "キャプチャリング");
      },
      true //キャプチャリングフェーズでイベントを検知
    );
  });
});

```
孫をクリックすると、以下の出力となります。
```
parentキャプチャリング
childキャプチャリング
grandchildキャプチャリング
grandchildキャプチャリングなし
childキャプチャリングなし
parentキャプチャリングなし
```
降ってきて、そして先祖方向へ去っていくことがお分かりになるかと思います。
PowerApps ドロップダウンとコンボボックスの違い

PowerAppsで名前や日付などを指定する際に便利なドロップダウンとコンボボックス
コンボボックスがたまに忘れるので使い方をメモ

### ドロップダウン
ドロップダウンは、Itemsプロパティに選択肢を指定して使用
選択できるアイテムは１つだけ
ドロップダウンで選択したアイテムを取り出すには

```
DropDown1.Selected.Value
```
もしくは
```
DropDown1.SelectedText.Value
```
で取り出せる。

試しにItemsプロパティの値を
```
[1,"2","あいう"]
```
にしてみると、文字の２は問題ないけど、文字列がエラーに
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880604/f348f89d-5d83-2068-83b3-12cd6be1b441.png)

もちろん["あ","い","う"]などの文字列のみであれば問題ないので、数値と文字列の混在が出来ない模様。数値を入れたいなら["1","2","すべて"]などと、文字列で入れると良さそう。

AllowEmptySelectionプロパティをtrueにすることで、値を空にすることができる。
ただ、空にするには選択している値と同じ値を選ぶと空になる。という分かりにくい仕様。
IsBlank関数を使用するとtrueになるので、空白ではなく空ですね。

### コンボボックス
ドロップダウンの機能拡張版的なものと捉えていますが似て非なるもの
SelectMultipleプロパティをtrueで複数選択が可能
IsSearchableプロパティをtrueで値の検索が可能(人名の検索などに便利)

Defaultプロパティはあるけど使用せず、DefaultSelectedItemsに既定の値を入れる。
規定値の設定は["1"]などと書く必要があり、"1"だとエラーになる。
規定値は["1","2"]など複数入れることができる。
ドロップダウンと同じく数値と文字列を混在すると、文字列がエラーになる。

値を取り出す際は、ドロップダウンと数式が異なるので注意。

"あ"  "い"  "う" が選択されていたとして

↓１つ目の値"あ"を取り出すなら
```
First(ComboBox1.SelectedItems).Value
```
↓２つ目の値”い”を取り出すなら ※ただこのやり方だと1つしか選択してないときは2つ目以降が"あ"になる。
```
Last(FirstN(ComboBox1.SelectedItems,2)).Value
```
↓Concat関数で結合して"あ,い,う"で取り出すなら
```
Concat(ComboBox1.SelectedItems,Value,",")
```
↓コレクションとして取り出すなら、OnChangedプロパティに
```
ClearCollect(col_select,ComboBox1.SelectedItems)
```
とすれば、このようにテーブル形式で取得できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880604/32c333d9-6c7d-d4b4-a8f8-2de826a35489.png)

↑で作成したコレクションの値をテキストラベルなどで確認する際も、Concat関数で下のように書くことで取得した値を確認できる。
```
Concat(col_select,Value,",")
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3880604/37e9918f-b418-fc37-418d-6ba5eb8b5627.png)
rails gのｇってなんだ？

railsを学び始めて約２週間。
環境構築に手間取りましたがようやくrailsを活用しているぞと
思える段階に入りました。

教材を見つつ学んでいるのですが、何度も登場するけどいまいちわかってない
コマンドがありました。

それが「rails g ~」です。
何度も登場する癖に何のことかさっぱりわかってないまま進めてました。
何のことかわかってないから、「rails a~」って入力してエラーとか出ちゃうし。

もしかしたら教材のどこかに「rails gのgとは～」とか書いてあったかもしれませんが、
私の目は節穴なので見落としてる可能性大です。

そこでちゃんと調べました。

「rails g」の「g」は「gerenate(生成する)」の「g」でした！！
言われてみれば確かに何かを新規作成するときに「rails g~」って入れてたなぁ・・・

他にも、
・「rails d」（削除するよ）のdは「delete（削除）」のdだし、
・「rails s」(サーバーを起動するよ)のsは「server(サーバー)」のだし、
言われてみれば確かにそんな感じの動きをしてたわー！！と気づいたのでした。
（generateもdeleteも動詞だけど、serverは名詞なのかな？
ちょっとそこは疑問です）

こういうコマンド（たとえば「rails s」）実行するよーといわれて、
今までは何も考えず入力してましたが、
ちゃんと単語の意味を考えると打ち間違いがあっても気づきそう！

これからは自分が実行するコマンドの意味（語源・省略前の単語)もしっかり考えたいと思います！

余談ですが、
どう考えても今日はrailsの投稿だからrails選べばいいな！って思ってサジェスト見たらRubyonRailsだとバージョンで分かれてて、何を選べばいいかわからないからRailsにしました。タグに毎度悩みます。
【Ruby】ifとcaseの使い分けについて

# はじめに
progateで`Ruby`を勉強したのち「ゼロからわかるRuby超入門」を勉強しています。
本書では`if`と`case`の使い分けについて「3つ以上の分岐の場合は`case`を使う」と記載がありました。
ですが`if`にも`elsif`があるので`case`を使用しなくても可読性落ちることがないのでは？と思い記事にしてみようと思いました。
# caseとは
`case`は特定の変数や値に対して、複数の候補の中から一致するものを見つけるために使います。
`case`を使うことで、同じ値に対して複数のパターンを簡潔に記述でき、コードが読みやすくなります。
基本構文は以下の通りです
```ruby:case1.rb
case 変数
when 値1
  # 値1と一致した場合に実行されるコード
when 値2
  # 値2と一致した場合に実行されるコード
else
  # どれにも一致しない場合に実行されるコード
end
```
## ifとcaseの違いは
`if`は、複雑な条件式や比較演算、範囲指定が必要な場合に向いています。
一方`case`は、特定の値やパターンに基づいて処理を切り替える場合に向いています。
### if文
if文は複雑な条件式や比較演算、範囲指定が必要な場合に向いていると書きましたが具体例を見てみましょう
```ruby:if.ruby
age = 25

if age < 18
  puts "未成年"
elsif age >= 18 && age <= 65
  puts "成人"
else
  puts "高齢者"
end
```
この例では、年齢に基づいて「未成年」「成人」「高齢者」に分類しています。`if`文は、範囲指定や論理演算子（`&&`など）を使って、条件を柔軟に設定できるので、複雑な条件判断に向いています。

### case文
上記同様に具体例を見てみましょう
```ruby:case2.rb
drink = "カフェラテ"

case drink
when "カフェラテ"
  puts "カフェラテを注文しました"
when "コーヒー"
  puts "コーヒーを注文しました"
when "紅茶"
  puts "紅茶を注文しました"
else
  puts "メニューにない飲み物です"
end
```
この例では、飲み物の種類に応じて異なる処理を行っています。
`case`文は、特定の値に基づいた分岐を効率的に表現でき、条件が多い場合でも読みやすいコードになります。


一方でこんな意見もあると思います。「`case`文でも範囲指定の文書けるでしょ。」
おっしゃる通りです。
では、`if`文で使用したコードをcase文で書き直してみましょう
```ruby:case3.rb
age = 25
case age 
when 0...18
    puts "未成年"
when 18..65
    puts "成人"
else
    puts "高齢者"
end
```
`0...18`は0以上18<strong>未満</strong>を表します
`18..65`は18以上65<strong>以下</strong>を表します

この場合直観的に`if`と`case`どっちかというと`if`文のほうがわかりやすいと思います。

# まとめ
本日は`if`文と`case`文の違いについて触れてみました。
まとめると
`if`文...複雑な条件式や比較演算、<strong>範囲指定</strong>が必要な場合
`case`文...<strong>特定の値やパターンに</strong>基づいて処理を切り替える場合
ワンクリックでSDカードなどから自動で画像をローカルに取り込み、取り込んだ画像をPhotoshopで開くスクリプト

# 概要

スマホやカメラで撮影した写真をSDカードからパソコンに取り込む作業は、
手間だと感じる方も多いのではないでしょうか。

私も毎回だと面倒に感じることが多かったため、
Windowsのバッチファイルを活用した自動化スクリプトを作成しました。

このスクリプトは、以下の機能を提供します。

### ① ローカルに保存してない画像の自動コピー
ダブルクリックで、指定した外部機器のフォルダから指定した拡張子の画像ファイルを
ローカルの指定フォルダへコピーします（すでにある画像は回避）。
### ② Photoshopでの自動オープン
コピーした画像のみをPhotoshopで自動的に開きます。


# バッチファイルのコード

以下が実際のバッチファイルのコードです。

```bat:backupAndEdit.bat
@echo off
setlocal

:: SDカードなどの外部機器のドライブを設定（以下の例はD。自分の接続する機器により変更。）
set sd_card_drive=D:\
:: 外部機器で画像が存在するパスを設定
set sd_folder=D:\撮影画像
:: 取り込む画像の拡張子を選択（カンマ区切りで増減可能）
set target_extensions=*.jpeg *.jpg *.png

:: コピー先のローカルフォルダを設定（環境変数を用いてデスクトップ上の「写真保管庫」を指定）
set local_folder=%USERPROFILE%\Desktop\写真保管庫

:: Photoshopのパスを設定（自分がインストールしている環境に応じて調整してください）
set photoshop_path="C:\Program Files\Adobe\Adobe Photoshop 2024\Photoshop.exe"

:: コピーされたファイルのリストをファイルに保存
set copied_files=%temp%\copied_files.txt
del /f /q "%copied_files%" 2>nul

:: 外部機器が接続されているか確認
if exist "%sd_card_drive%" (
    :: コピー元フォルダが存在するか確認
    if exist "%sd_folder%" (
        :: JPEG, JPG, PNGファイルのコピーを開始
        for %%e in (jpeg jpg png) do (
            dir /b "%sd_folder%\*.%%e" > %temp%\filelist.txt
            for /f "delims=" %%f in (%temp%\filelist.txt) do (
                if not exist "%local_folder%\%%f" (
                    copy "%sd_folder%\%%f" "%local_folder%" > nul
                    echo "%sd_folder%\%%f" >> "%copied_files%"
                )
            )
        )

        :: コピーされたファイルをPhotoshopで開く
        for /f "delims=" %%f in (%copied_files%) do (
            if exist "%%f" (
                start "" %photoshop_path% "%%f"
            )
        )
    )
)

endlocal
exit
```

- メモ帳などで記載したあと、拡張子を.batにして保存してください。
（文字コードの形式にご注意ください）


# 検証

## 画像の用意

下記のようにローカルと、外部機器の差分が2枚ある状況にしました。
この状況でローカルにない2枚だけを取り込み、photoshopで開けば成功です。

![スクリーンショット 2024-10-09 013414.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211946/9765c07d-8580-6263-0d2a-acca826195cd.png)

## バッチファイルの実行

基本的にはどこでも良いので、
先ほどのコードを記載したバッチファイルを置いて、
ダブルクリックで実行します。

## 実行結果

無事にPhotoshopで**転送した画像のみを**開いてくれました！

![スクリーンショット 2024-10-09 020325.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211946/d799ffcf-87d3-43b2-6c19-eecc6c5d0597.png)

保存もされています。

![スクリーンショット 2024-10-09 020347.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211946/e9079a96-e329-792c-ab81-75401f276146.png)

ちなみに転送した画像は、
`%temp%\copied_files.txt`
にリストとして記載されています。

```
"D:\撮影画像\猫に小判のイラスト.jpg" 
"D:\撮影画像\秋田犬のイラスト.png" 
```

なお、すべての画像がローカルにある状態でクリックしても
想定通り何も起きませんでした。

# 今後の展望

本来は外部機器が接続されたら、自動で実行されるようにしたい！

しかし、なぜか外部機器が接続されたイベントログをイベントビューアーのWindowsログで確認できず、
イベントIDもわからなかったため、タスクスケジューラにトリガーを指定が難しく…。

トレーサーを設定し直してみてもイベントがやはり入ってこなかったのですが、
何かを見返したら問題解消できるかも？
深みにハマりかけてますが、画像編集は気分が乗らないと中々やる気にならないので
少しでも動き出しの負担を軽くしたい…！
[paiza]レベルアップ問題集解答案(C#) 商品の検索

# 問題
https://paiza.jp/works/mondai/data_structure/data_structure__dict_boss

> N 個の文字列 S_1, ... , S_N と、Q 個の文字列 T_1, ... , T_Q が与えられます。各 T_i について、以下の処理を行ってください。
・ S_j == T_i を満たす最小の j を出力する。ただし、そのような j が存在しない場合は -1 を出力する。

>> 入力される値
N Q
S_1
S_2
...
S_N
T_1
T_2
...
T_Q

>> 期待する出力
Q 行出力してください。i 行目には、S_j == T_i を満たす最小の j を出力してください。ただし、そのような j が存在しない場合は -1 を出力してください。
j_1
...
j_Q

>> 入力例1
3 2
a
b
c
b
d

>> 出力例1
2
-1

# C#解答案
```C#
using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        var num = Array.ConvertAll(Console.ReadLine()?.Split(' ') ?? new string[0], int.Parse);
        int N = num[0];
        int Q = num[1];
        List<string> searchList = new List<string>();

        for (int i = 0; i < N; i++)
        {
            searchList.Add(Console.ReadLine() ?? "");
        }
        
        for (int j = 0; j < Q; j++)
        {
            string query = Console.ReadLine() ?? "";
            int index = searchList.IndexOf(query);
            Console.WriteLine(index == -1 ? -1 : index + 1);
        }
    }
}
```

# 解答案補足
解いたあとにChatGPTに添削してもらい、上記案が出てきた。
初学者につき、? ?? が良くわからずChatGPT先生に解説してもらったので補足とする。

### 1. ?（nullable 型）
C#では、?を使って値が「null（値がない状態）」になっても良いという型を作ることができます。たとえば、通常の整数（int）は必ず値が必要ですが、int?とすると、値があってもなくてもOKになります。

例:

```csharp
int? myNumber = null; // 値がなくてもエラーにならない
```
このように?をつけることで、「この変数はnullでも大丈夫だよ」という意味を持たせることができます。

### 2. ??（null 合体演算子）
??は、もし左側の値がnullだったら、右側の値を使う、という意味です。これによって、nullが原因でエラーになるのを防ぎつつ、デフォルト値を設定できます。

たとえば、次のように使います。

```csharp
string myText = null;
string result = myText ?? "デフォルトのテキスト";
Console.WriteLine(result); // "デフォルトのテキスト"と表示される
```
まず、myTextにはnullが入っています。
resultにはmyTextの値を入れようとしますが、もしmyTextがnullだったら、"デフォルトのテキスト"を使います。
つまり、??は「左側がnullだった場合、右側の値を使う」という便利な方法です。

nullable 型、null 合体演算子について、あなたのコードでは、以下のように使っています：

```csharp
var num = Array.ConvertAll(Console.ReadLine()?.Split(' ') ?? new string[0], int.Parse);
```
Console.ReadLine()? は、もしConsole.ReadLine()の値がnullでなければSplit(' ')を実行するという意味です。
次に、もしConsole.ReadLine()?.Split(' ')がnullだった場合、?? new string[0]で空の配列（new string[0]）を代わりに使います。

### 3.三項演算子（? :）の使い方
```csharp
条件式 ? 値1 : 値2
```
条件式：trueかfalseを返す条件を指定します。例えば、index == -1は、indexが-1であるかどうかをチェックしています。
値1：条件式がtrueのときに返す値です。
値2：条件式がfalseのときに返す値です。

あなたのコードの具体的な意味：
```csharp
Console.WriteLine(index == -1 ? -1 : index + 1);
```

これは、次のような意味になります：

index == -1: indexが-1と等しいかどうかを確認します。

もしtrue（つまり、indexが-1）の場合、次に-1が実行されます。
もしfalse（つまり、indexが-1ではない）場合、次にindex + 1が実行されます。
indexが-1の場合は、そのまま-1を表示しますが、-1でない場合はindex + 1の値を表示します。

#### 三項演算子なしで同じ処理を記述すると…
```csharp
if (index == -1)
{
    Console.WriteLine(-1);
}
else
{
    Console.WriteLine(index + 1);
}
```
三項演算子は、簡潔に書けるため、特に短い条件分岐に向いています。
この書き方に慣れると、コードがすっきりするので、ぜひ試してみてください！
Safariだとoptionタグに「display: none;」は効かない？！

## 結論
Safariのバグらしい。
バグ報告レポートによると、2006年4月12日に報告されている模様。
https://bugs.webkit.org/show_bug.cgi?id=8351

## 動作確認
- サンプルコード
```html:hoge.html
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
    </head>
    <body>
        <select name="example">
            <option value="サンプル1">サンプル1</option>
            <option value="サンプル2">サンプル2</option> ← ここにdisplay: none;を効かせたい
            <option value="サンプル3">サンプル3</option>
        </select>
    </body>
</html>
```
【Chrome】
![スクリーンショット 2024-09-06 17.45.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/752214/5c732690-4fc2-1f1f-3902-182cd9032738.png)

【Safari】
![スクリーンショット 2024-09-06 17.44.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/752214/9dc95330-ea20-0907-928d-eca9849726f6.png)
Safariでは効かない、、だと、、？

## 対策案
- `disabled`属性を付与させて、選択させないようにする
- `option`タグを`span`タグで囲み、`span`タグに対して`display: none;`を適用させる
    - JavaScriptからスタイルを付与しないと効かないらしい

## 終わりに
期待するスタイルがどうしても効かない時は、バグレポートをチェックしたほうが良さそうですね🤔

## 参考
[Safariではoption要素をhiddenできない - Qiita](https://qiita.com/yanamura/items/59464705642c41f83c26)
[iPhoneでselect要素optionに「display:none;」が効かない罠 | グリニッジ株式会社](https://www.greenwich.co.jp/blog-archives/p/26682)
【Laravel】親クラスのコンストラクターを呼び出す

`__constructor`メソッドを記述してた時に気づきがあったので、備忘録としてメモします。

- 子クラスを作成して`__constructor`を定義した場合、親クラスの`__constructor`は実行されず無視される
```php:ParentHoge.php
class ParentHoge
{
	public function __constructor()
	{
		// 処理
	}
}
```
```php:ChildHoge.php
class ChildHoge extend ParentHoge
{
	public function __constructor()
	{
		// 継承元(ParentHogeクラス)の__constructorは実行されず無視される
		// 処理
	}
}
```

- もし親クラスの`__constructor`も実行したいなら、`parent::__constructor`を記述する

```php
class ChildHoge extend ParentHoge
{
	public function __constructor()
	{
		parent::__constructor;
		// 処理
	}
}
```
IT業界1年目で成功する3つの原則：未経験者が押さえるべきポイント

こんにちは！IT業界に興味がある方、あるいは最近入社したばかりの方々に向けて、今回は「IT業界1年目の教科書」から学んだ重要な3つの原則についてお話しします。これらの原則を理解し、実践することで、あなたのキャリアをより良いものにできるはずです。

## 1. 頼まれたことは必ずやり切る：信頼の基盤を築く

IT業界に限らず、ビジネスの世界で最も重要なものは「信頼」です。特に未経験者やキャリアの浅い方にとって、信頼を築くことは成長の鍵となります。

### なぜ信頼が重要か？
- チームでの協力が不可欠なIT業界では、信頼関係が仕事の質と効率を大きく左右します。
- 信頼は新しい機会やチャレンジングな仕事を任されるチャンスにつながります。
- 一度失った信頼を取り戻すのは非常に困難です。

### 信頼を築くためのアクション
1. 締め切りを守る：約束した期日には必ず成果物を提出しましょう。
2. 進捗報告を欠かさない：特に長期のタスクでは、定期的な状況報告が重要です。
3. 困難に直面したら早めに相談：一人で抱え込まず、チームの力を借りることも大切です。

## 2. 50点でいいから早く出す：フィードバックループを活用する

未経験者やスキルが浅い段階では、完璧を目指すよりも、まずは形にして早くフィードバックを得ることが重要です。

### なぜ早めの提出が大切か？
- IT業界は変化が速く、完璧を目指している間に要件が変わることもあります。
- フィードバックを得ることで、より効率的に学習と改善ができます。
- チーム内でのコミュニケーションが活発になり、協力関係が強化されます。

### 実践のためのヒント
1. タイムボックスを設定：作業時間に制限を設け、その中で最善を尽くします。
2. MVP（Minimum Viable Product）の考え方を取り入れる：最小限の機能で動くものを先に作ります。
3. フィードバックを積極的に求める：上司や先輩に定期的にレビューを依頼しましょう。

## 3. つまらない仕事はない：全ての経験から学ぶ姿勢

キャリアの初期段階では、必ずしも希望通りの仕事ばかりではありません。しかし、どんな仕事にも価値があると捉えることが重要です。

### なぜ全ての仕事に意味があるのか？
- 一見つまらない作業でも、業界やプロジェクトの全体像を理解する機会になります。
- 基本的なスキルや仕事の進め方を学ぶ良い機会です。
- 困難な状況でも前向きに取り組む姿勢は、周囲から高く評価されます。

### つまらない仕事を成長の機会に変える方法
1. 作業の目的を理解する：なぜこの作業が必要なのか、全体の中でどう位置づけられているかを把握します。
2. 効率化を考える：単純作業こそ、効率化の余地があります。プロセスの改善を提案してみましょう。
3. スキルアップの機会と捉える：例えば、ドキュメント作成ならば文書作成スキルの向上に、データ入力ならばExcelのショートカットキーの習得に活かせます。

## まとめ：自己成長のサイクルを作る

これら3つの原則は、単独で実践するのではなく、相互に関連させることで最大の効果を発揮します。

1. 信頼を築く → より多くの仕事や責任ある仕事を任される
2. 早くフィードバックを得る → 迅速に改善し、スキルアップする
3. 全ての仕事から学ぶ → 幅広い知識と経験を積む

このサイクルを回し続けることで、IT業界で着実にキャリアを築いていくことができるでしょう。

最後に、キャリア形成は長期的な取り組みです。日々の小さな努力の積み重ねが、やがて大きな成果となって現れます。焦らず、着実に、そして楽しみながら成長していってください。

IT業界でのキャリアに関する詳細な情報や、実践的なスキルアップのためのリソースについては、[アクロビジョン](https://www.acrovision.jp)のウェブサイトをご覧ください。また、IT業界での求人情報やキャリアアドバイスについては、[アクロビジョンの採用ページ](https://recruit.acrovision.jp)もチェックしてみてください。

皆さんのIT業界での成功を心よりお祈りしています！
【Git】【Husky】削除したファイルをpre-commitの対象から除外する

## 前提
- GitHookとは
[Git hooks入門](https://zenn.dev/hinoshin/articles/67249ed5f75023)
-  Huskyとは
[リントに便利な、開発者ツール「 husky 」🐶を使おう!](https://www.vektor-inc.co.jp/post/use-husky/)

## エラー内容
Huskyの`pre-commit`を使用して、コミット時にLintを実行するようにスクリプトを書いてます。
いつも通り、`git add`→`git commit`をしたらエラー発生しました。
```shell
ERROR: The file "app/Http/Controllers/HogeController.php" does not exist.
```
ファイルが存在しない、、？

削除したファイルをインデックスに上げた後pre-commitすると、削除したファイルに対してLintを走らせようとするのでエラーがでてしまうようです。

## 結論
git diffに「`--diff-filter=d`」オプションをつける。
`--diff-filter=d`は削除されたファイルを除外するオプションです。
```bash:.husky/pre-commit
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

# `--diff-filter=d`で削除されたファイルはpre-commitの対象から除外
if git diff --cached --name-only | grep '\.php'; then
    files=$(git diff --cached --name-only | grep '\.php')
    ./vendor/bin/sail composer lint $files && git add $files
fi
```

また、`--diff-filter=D`にすると、削除したファイルのみ取得できるようフィルターをかけられるようです。
システム生成AIの最新動向と本質的な理解の重要性について

# システム生成AIの最新動向と本質的な理解の重要性

## はじめに

システム生成AI技術の進化は目覚ましく、新しいプロダクトが次々と登場しています。
弊社では4月から世界に先駆けて世界最大の２、３分で最大150ファイルを生成するシステム生成AI「Babel/Zoltraak」を開発しており、

その実装経験から解説を行いたいと思います。

＊ Babelリリース. アスキーさんの記事。
https://ascii.jp/elem/000/004/225/4225897/
https://ascii.jp/elem/000/004/218/4218870/

## システム生成AIの国内外の動向

現在、システム生成AIのプロダクトベンダーは国内ではRinteさんと筆者（および一部の他の開発者）程度しかいないと思われます。
一方で、海外では次々と新しいプロダクトが登場し、大きな話題を呼んでいます。

今までのシステム生成AIの流れをまとめたいと思います：

0. Zoltraakの登場（4月）
1. Createが注目を集める（Difyとともに5月ごろ）
2. Claude Artifactが登場し、UI生成として人気を集める（6月）
3. 大規模システム生成AI Babelの開発着手（7月）
4. Babelリリース. アスキーやYahooニュースに取り上げられる（8, 9月）
5. UI生成AI v0やシステム生成AI GPT Engineerが登場し、多くの人が支持（9月）
6. システム生成AI Boltの登場により、再び注目が移る（10月）


ここまで見るとかなり多くのプロダクトが登場していることがわかります。
また次から次に新しいプロダクトが登場し、その度に次々と興味が移って行っている状況でもあります。

## 「質量反比例の法則」とプロダクトの特性

システム生成AIプロダクトには、自分自身が提唱している「質量反比例の法則」が適用されます。
この法則は、「システム生成AIプロダクトにおいて、生成される成果物の量と質は反比例する」と定義されます。
具体的には以下のような特性を示します：

- 量が少ない（1枚のみのファイル生成）：1枚ファイルの質が高い
  - 例：Claude Artifact、v0
- 量が多い：1枚ファイルは60点まで、高度な技術力が必要
  - 例：Bolt、Babel/Zoltraak

もしくは前者をUI生成AI、後者をシステム生成AIと呼び分けることもできます。
他にもCursorのようなAIエディタもありますが、別の機会に説明します。

この法則を理解することで、各プロダクトの特性と適した使用シーンが明確になります。

## プロダクトの本質的理解と比喩による解説の重要性

UI生成AI、システム生成AIの理解を深めるために、絵を描くことに例えて説明しましょう。

まず、v0のようなツールは、美しいデザインを描くことができますが、これは全体構造を理解している人にとって最も効果的です。

想像してみてください。
デザイン教室に通っていない人が、驚くほど美しい「瞳」を描けたとしても、手足のバランスを取ることができないかもしれません。
結果として、少女漫画のような美しい瞳を持ちながら、手足の短いイケメン劇画風カービーが誕生してしまうのです。
デザイナーやCTOがv0を巧みに使いこなせるのは、「体全体」の構造を深く理解しているからなのです。

逆にBoltについて考えてみましょう。
このツールは全体のラフスケッチを行うのに非常に有効ですが、その裏で動作するviteフレームワークの理解が必要です。

これは、顔全体のラフスケッチを行うツールに例えることができます。
しかし、美しい表情を描くためには、「表情筋」（つまり、裏側の仕組み）を理解する必要があります。Boltを使いこなすには、viteというフレームワークを理解することが不可欠で、これはまさに「表情筋」を理解することに相当するのです。

しかし、ここで立ち止まって考えてみましょう。
これらのツールは確かに素晴らしいものですが、まだ「カービー」の域を出ていないのです。
Boltは顔全体のラフスケッチを、v0は瞳や眉、口の完成デザインを描くことができます。

しかし、それらはまだ「体全体」を描くことができません。

ここで、Zoltraakのようなツールの重要性が浮かび上がります。
Zoltraakは、漫画のストーリー全体を描き、登場人物の体全体のラフスケッチができるツールとして構想されています。

顔だけでなく、体全体のラフスケッチを描くものとしてZoltraakは非常に有効です。

このように、各プロダクトの特性を深く理解し、適材適所で活用することが、システム生成AIの真の力を引き出すために不可欠なのです。
背景にある技術や構造を理解し、継続的な価値を生み出すことが求められています。

それは、単に美しい瞳を描くだけでなく、全体のバランスが取れた絵を描くことができるアーティストになるようなものです。

全てのプロダクトは1つ1つ意味があります。

そして、それらはまるでさまざまな種類の自動車があるように無意味なツールなどありません。１つ１つ役割を理解して習熟することが必要です。



## まとめ

システム生成AIの世界は急速に進化していますが、重要なのは各プロダクトの本質を理解し、適材適所で活用することです。背景にある技術や構造を理解し、継続的な価値を生み出すことが求められています。

開発者は、ユーザーの真の課題を理解し、それに適したソリューションを提供することに注力すべきです。一方、ユーザーは、各ツールの特性を理解し、自身のニーズに合わせて適切に選択・活用することが重要です。

システム生成AIの真の力を引き出すには、表面的な機能だけでなく、その裏側にある「表情筋」を理解し、全体像を把握する視点が不可欠です。今後も技術の進化に注目しつつ、本質的な理解を深めていくことが、この分野での成功の鍵となるでしょう。
MUFG Data Science Basic Camp 2024 初心者でも9位を取れた感想

# はじめに
初めまして！**onigilar**です！

初心者ながらSIGNATEコンペで**9位**を取ることができたので、体験談を投稿したいと思います。(記事の投稿も初めてです、お試しで書いてみてます。)

よろしくお願いします。

# Agenda
**[1.参加の動機](#1-参加の動機)**
**[2.参加前のレベル感](#2-参加前のレベル感)**
**[3.学習方法](#3-学習方法)**
**[4.コンペ](#4-コンペ)**
**[5.解法](#5-解法)**
**[6.まとめ](#6-まとめ)**

## 1. 参加の動機
元々コンペに参加したいと考えていて、たまたまMUFG主催の初心者向けのコンペを見つけたため参加を決意しました。

とりあえず登録してみると、e-learningが提供されており、Pythonの基礎から学習できる環境が整っていました。

これなら自分でもできそうだと思えたことが一番大きいと思います。

# 2. 参加前のレベル感
どのくらい初心者なのか、これが気になるところだと思います。

結論としては、大学の授業や研究でちょっとやったことがあるレベルです。そのため、レベル感は以下の通りになります。

+ **Pythonの基礎を習得している**
+ **Pandasなどのライブラリの扱いには慣れていない**
+ **コンペ未経験**
+ **AtCoder灰(超初心者)**
+ **機械学習に関する知識はあるが、実装はほとんどしたことない**

勉強すれば20時間程度で追いつくレベルです。学部生なので研究といえども高いレベルではありません。化学系(非情報系)の学部で、簡易的な分析を行うためのツールとして使っているという程度でした。
これらの事前知識はe-learningに含まれていたので、なくてもほとんど同じように進められたのではないかと思います。完全な初心者でも大丈夫だと思いました。

# 3. 学習方法
さすがにこのレベルではコンペの提出まで至らないので、SIGNATE(MUFGの提供)のe-learningを活用しました。

非常に説明が丁寧で、難しいところはなかったです。一通りのチュートリアルを終えたころには、簡易的に実装できるようになりました。

# 4. コンペ
題目は**住宅ローンの返済可否を予測する**というものでした。

テーブルデータでやや不均衡でしたが、かなり簡単な部類なのかなと思いました。データ数も40000程度で少なめです。(Basicですね！)
評価指標はAUCというものでした。

入賞は5位までです。入賞した人はMUFG各社(6社)からインターンシップ参加や面談確約などの特典を得ることができます。賞金などはありませんでした。

# 5. 解法
+ **前処理**
とりあえずデータを観察し、データの概観を掴むまでひたすらEDAをしました。結果として、以下の処理を施しました。

-------
**1\. 外れ値処理**
外れ値と外れ値以外の集合をS、Tに分けるとします。Sの各要素をTの要素の中で最も距離(値)が近いものに合わせました。
ただし、削除した方が良かったと思います。

**2\.欠損値補完**
簡易的な補完を行っただけです。
数値変数は欠損が10個程度だったので、modeやmedianで補完して、精度が高い方にしました。
カテゴリ変数には欠損が700ほどあったため無視できませんでした。色々試しましたが、結局「その他」として分類しました。良い案は思いつきませんでした。

追記:
勾配ブースティング系のモデルでは欠損があっても問題ないようです。試してみれば良かったです。

----

+ **特徴量の処理**
特徴量の生成や選択は行っていません。独自の特徴量を生成しても精度が下がったためです。そのため、こちらも簡易的な処理となっています。

----

**1\.エンコーディング**
文字列にはターゲットエンコーディングを施しました。

追記:
ターゲットエンコーディングでリークを起こしていました。自身のレコードの目的変数を用いずに平均をとるために、K-foldを行う必要があるようです。

**2\.特徴量の整形**
logで変換して、正規分布様にしました。後述のモデル(XGBoost)に対して、数学的に精度に寄与するのかは分からないのですが、変換したら少し精度が上がりました。

追記:
tree系のアルゴリズムでは値の大小のみが関係します。そのため、基本的には大小関係の変化がない変換は行う必要がありません。
しかしながら、今回は精度が上がりました。なぜかは自分にはよく分かりません。

------

+ **モデル**
勾配ブースティング系のモデルである **XGBoost** ( eXtreme Gradient Boosting ) を用いました。
上位層は勾配ブースティング系のモデルを使用していたようです。
-----------
**1\.ハイパーパラメータチューニング**
グリッドサーチやランダムサーチで良いものを選びました。
しかし、最終的には手動で動かしながら、地道に確認しました。
優勝者の方は、OptunaでCV scoreが最大になるようにチューニングしていたようです。
次回、試してみようと思いました。

**2\.クロスバリデーション**
Stratified K-fold (n = 5) でCVを行い、5つのモデルを作成しました。
平均を取って住宅ローンの返済確率を算出しました。これはAUCで評価するために必要だっただけで特に意味はありません。
例えば、Accuracyでの評価であれば、返済可否(0 or 1)を複数のモデルの多数決で決めるという方法になるかと思います。

追記:
クロスバリデーションで平均をとることをアンサンブルと勘違いしてました。
アンサンブル実装してみます！


# 6. まとめ
いかがだったでしょうか？
本当に初心者向けの内容だったと思います。おそらく、すごい方々からしたら「なんだこれ」って感じだと思います。
入賞もしていませんし、解法などはあまり参考にならないかなとは思います。ですが、本当に初心者でも、参加してアウトプットが出せるんだということが伝わればいいなと思っています。
これからデータ分析を始めたいと思っている方に読んでいただけたら幸いです。

実際のところ、今回書いた内容に関しても一部正しくないものがあるかもしれません。何かございましたらご指摘をよろしくお願いいたします。

次回、何かしらのコンペに参加するときには、過去の解法や現在のトレンドなどを調べつつやってみたいです。(欠損値補完方法を変えた複数のファイルをアンサンブルするなど、気になる解法を沢山知ることができました！)

今後ともよろしくお願いいたします！
自作のオンラインゲームをWebGLビルドしてunityroomに投稿する際に行ったこと

こんにちは。主に個人でゲーム開発をしておりますToya Shiwasuと申します。この記事では、拙作のオンラインアクションRPGをWebGLビルドしてunityroomに投稿する際に行ったことをまとめています。なお、繰り返しを避けるためリンクで済むところはリンクで済ませています。

# プログラミング

## プラグインのコードのpointer_stringifyをUTF8ToStringに置換
今回のゲームのアップデートで、Unityのバージョンを2023.2.20f1に変更したのですが、ビルドに失敗するようになりました。利用していたプラグインのコードのpointer_stringifyをUTF8ToStringに置換することで解決しました。
https://github.com/naichilab/unityroom-tweet/issues/7

# グラフィックス

## Screen.orientationに値を代入しないよう書き換え
Screen.orientationに値を代入するとフリーズするので、以下のように書き換え、WebGLでは実行しないようにしました。
```OrientationManager.cs
    void setOrientation(int orientation)
    {
        if (Application.platform == RuntimePlatform.WebGLPlayer)
            return;
        Screen.orientation = (ScreenOrientation)orientation;
    }
```
https://developer.mozilla.org/ja/docs/Web/API/Screen/lockOrientation

# UI

## 多言語に対応したフォントを導入
フォントはFont.GetOSInstalledFontNames()でOSにインストールされているフォントを設定できるようにしていたのですが、WebGLでは0個のフォントしか取得できませんでした。go-noto-universalというフォントをまとめるソフトのサイトで配布されている「GoNotoKurrent-Regular.ttf」というフォントが、多言語に対応しているそうなので、導入しました。Google翻訳で翻訳できる108の言語で、各言語での言語名はすべて表示できるのを確認しました。ただ、「▲」などの全角記号が表示できないようです。
https://github.com/satbyy/go-noto-universal/releases/

## IMEを使えるようにWebGLInputを導入
InputFieldでIMEが有効にならず日本語が入力できませんでした。WebGLInputというアセットを導入することで解決しました。
https://github.com/kou-yeung/WebGLInput/releases

## GUIUtility.systemCopyBufferが機能しないので書き換え
GUIUtility.systemCopyBufferを使ったコピーが機能しませんでした。次の記事のコードを利用することで解決しました。
https://qiita.com/ttttpzm/items/1015b148c98a2d4da182

# ファイル

## セーブデータの保存後IndexedDBをフラッシュする処理を追加
セーブデータはApplication.persistentDataPathに保存していましたが、unityroomで確認したところ保存されていませんでした。IndexedDBをフラッシュする処理を追加して解決しました。自宅のブラウザでは特に問題なく動作しましたが、ネカフェのブラウザで動作確認したところ、Firefoxでのみ保存できませんでした。原因は不明です。
https://discussions.unity.com/t/webgl-flushing-data-to-indexdb/240698
また、IndexedDBはストレージの空き容量の10分の1程度までしか保存できないようなので、WebGLでは肥大化する恐れのあるログデータの保存は行わないようにしました。
https://iwatendo.hateblo.jp/entry/2018/02/15/215811

# ネットワーク

ネットワークは、ロビーサーバーでC#のHttpListenerを、ゲームサーバーでMirrorというアセットを利用していたのですが、そのどちらもunityroomでは最初は動作しませんでした。unityroomはhttpsで接続するサイトなので、サーバーへの接続もhttpsで行うようにする必要があるようです。できるだけお金をかけずにMixedContent対応したかったので、「DDNS Now」という無料のダイナミックDNSサービスでドメインを取得し、そのドメインのSSL証明書を「Let's Encrypt」というサービスで無料で取得しました。
https://ddns.kuku.lu/index.php
https://letsencrypt.org/ja/
また、Nginxでhttpsからhttpにプロキシする設定を行うことで、クライアントプログラムの接続先はhttpsに書き換え、ロビーサーバーとゲームサーバーのプログラムはほぼそのままという最小限の変更で動作しました。HttpListenerでCROS設定を行い、MirrorはSimpleWebTransportを利用するよう修正しました。
https://qiita.com/kochiyukimoto/items/3c8f3a74f5f3727ddb71
https://mirror-networking.gitbook.io/docs/manual/transports/websockets-transport/reverse-proxy
https://github.com/MirrorNetworking/Mirror/issues/3012
【小ネタ】Python in Excelで４行でQRコードを作成する

## Excelでは今まで数式でQRコードを作れなかった
GoogleのスプレッドシートではQRコードをIMAGE関数を使って簡単に作れますが、
Excelの関数では残念ながら作成することができません
（VBAを使ってバーコードオブジェクトをいじればできますが）

## Python in Excelを作っと使う
Python in Excelを使うとたったの４行で作成することができます。

```Python_in_Excel.py
# B4にURL等を入れておく
import qrcode
data = xl("B4")
qr = qrcode.make(data)
qr.show()
```

鬼簡単♪画像を保存するときは右クリックで図として保存しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629241/4c703507-4683-a887-635b-85392a3417b0.png)