OmniAICreator/Qiita-1.07M huggingface dataset:
Python3エンジニア認定基礎試験向けかもしれない問題集

AIを使って問題を作成しています。


### Prompt:
`Python3エンジニア認定基礎試験に出てきそうな問題を作ってください。`


### 問題1 (タプル操作)
次のコードの出力は何ですか？

```python: Python
t = (1, 2, 3, 4)
print(t[1:3])
```

1. `(1, 2)`
1. `(2, 3)`
1. `(3, 4)`
1. `(1, 2, 3)`

<details> <summary>解説</summary>

正解：2. `(2, 3)` スライス t[1:3] はインデックス1から2までの要素を含みます。

</details>

### 問題2 (ループ)
次のコードの出力は何ですか？

```python: Python
count = 0
while count < 3:
    count += 1
print(count)
```

1. `0`
1. `1`
1. `3`
1. `4`

<details> <summary>解説</summary>

正解：3. `3` ループが終了した後の count の値は 3 です。

</details>

### 問題3 (例外処理)
次のコードを実行した場合、どの例外が発生しますか？

```python: Python
try:
    1 + '1'
except Exception as e:
    print(type(e))
```

1. `<class 'ValueError'>`
1. `<class 'IndexError'>`
1. `<class 'TypeError'>`
1. `<class 'KeyError'>`

<details> <summary>解説</summary>

正解：3. `<class 'TypeError'>` 異なる型のオペランドを追加しようとすると TypeError が発生します。

</details>

### 問題4 (リストのスライス)
次のコードの出力は何ですか？

```python: Python
lst = [10, 20, 30, 40, 50]
print(lst[:3])
```

1. `[10, 20]`
1. `[10, 20, 30]`
1. `[30, 40, 50]`
1. `[20, 30, 40]`

<details> <summary>解説</summary>

正解：2. `[10, 20, 30]` スライス lst[:3] はインデックス0から2までの要素を含みます。

</details>

### 問題5 (文字列操作)
次のコードの出力は何ですか？

```python: Python
s = "Python"
print(s.replace("P", "J"))
```

1. `Jython`
1. `Python`
1. `Jyton`
1. `JythonPython`

<details> <summary>解説</summary>

正解：1. `Jython` replace メソッドは指定した文字を置き換えます。

</details>

### 問題6 (辞書操作)
次のコードの出力は何ですか？

```python: Python
d = {'a': 1, 'b': 2}
print(list(d.keys()))
```

1. `['a', 'b']`
1. `[1, 2]`
1. `['a']`
1. `['b']`

<details> <summary>解説</summary>

正解：1. `['a', 'b']` keys メソッドは辞書の全てのキーをリストとして返します。

</details>

### 問題7 (集合操作)
次のコードの出力は何ですか？

```python: Python
s = {1, 2, 3}
s.add(4)
print(s)
```

1. `{1, 2, 3}`
1. `{1, 2, 3, 4}`
1. `{4, 1, 2, 3}`
1. `{2, 3, 4}`

<details> <summary>解説</summary>

正解：2. `{1, 2, 3, 4}` add メソッドは集合に要素を追加します。

</details>

### 問題8 (関数の引数)
次のコードの出力は何ですか？

```python: Python
def greet(name, greeting="Hello"):
    return f"{greeting}, {name}!"

print(greet("Alice"))
```

1. `Hello, Alice!`
1. `Hi, Alice!`
1. `Greetings, Alice!`
1. `Error`

<details> <summary>解説</summary>

正解：1. `Hello, Alice!` デフォルト引数 greeting は "Hello" が使われます。

</details>

### 問題9 (リストのメソッド)
次のコードの出力は何ですか？

```python: Python
lst = [1, 2, 3, 4]
lst.remove(3)
print(lst)
```

1. `[1, 2, 3, 4]`
1. `[1, 2, 4]`
1. `[2, 4]`
1. `[1, 2, 3]`

<details> <summary>解説</summary>

正解：2. `[1, 2, 4]` remove メソッドはリストから指定した要素を削除します。

</details>

### 問題10 (ループと条件分岐)
次のコードの出力は何ですか？

```python: Python
for i in range(5):
    if i % 2 == 0:
        print(i, end=" ")
```

1. `1 3`
1. `0 2 4`
1. `0 1 2 3 4`
1. `2 4`

<details> <summary>解説</summary>

正解：2. `0 2 4` ループ内で if 文により偶数のみが出力されます。

</details>
GraphQLスキーマを出力時に上書きする

この記事は[一休.com Advent Calendar 2024](https://qiita.com/advent-calendar/2024/ikyu) 2日目の記事です。

## 概要

GraphQLアプリケーションにおいて、ランタイムに影響を与えずに型定義のみ上書きしたいケースがあり、出力時に力業でスキーマを上書きすることによって解決したという事例を紹介します。

## 構成

- スキーマビルダー（バックエンド）: Pothos
- クライアント（フロントエンド）: Relay

## 問題

```graphql:schema.graphql
type RestaurantGroup {
  customers(after: ID, first: Int): CustomerConnection!
}
```

上記のフィールドを例として説明します。
`first` は取得件数を表す引数で、メインのユースケースではRelayが想定するように `20` などを指定してページネーションに利用しています。
一方、（本当はよくないのですが便宜上）使用する場所によっては `first` に大きな数字を与えることで全件取得の普通のリストとしても使っていました。しかし、`first` はnullableなため、全件取得するつもりが指定を忘れてデフォルトの件数しか取得していないことによるバグがときどき発生していました。
そこで、`first` をnon-nullableに変更してlintで指定忘れを防ぐことを考えました。その際、古いクライアントでエラーが出ないようにランタイムの振る舞いは保持したいという要件もあったので、リゾルバのコードは変更せずスキーマファイル出力時にのみ `first` の型を上書きすることにしました。

## 解決方法

手動でASTをいじることも覚悟していましたが、幸い graphql-tools というライブラリの `mapSchema` という便利な関数のおかげで簡単にスキーマの編集ができました。
この関数は[公式ドキュメントに示されている型](https://the-guild.dev/graphql/tools/docs/schema-directives#full-mapschema-api)から読み取れるように、スキーマに対してさまざまな操作が可能です。
今回は `first` の `type` を上書きするだけなので下記のように書きました。

```typescript:build_schema.ts
/* ビルド時に実行するスクリプト */
import { writeFileSync } from 'node:fs'

import { MapperKind, mapSchema } from '@graphql-tools/utils'
import { GraphQLInt, GraphQLNonNull, printSchema } from 'graphql'

import { builder } from './graphql.js'

// ビルダーからスキーマオブジェクトを生成
const schema = builder.toSchema()

// 編集
const modifiedSchema = mapSchema(schema, {
  [MapperKind.OBJECT_FIELD]: (fieldConfig) =>
    fieldConfig.args && 'first' in fieldConfig.args ?
      {
        ...fieldConfig,
        args: {
          ...fieldConfig.args,
          first: {
            ...fieldConfig.args.first,
            type: new GraphQLNonNull(GraphQLInt),
          },
        },
      }
    : fieldConfig,
})

// ファイルに出力
writeFileSync('schema.graphql', printSchema(modifiedSchema))
```

出力したスキーマファイルにもしっかり反映されていました。

```graphql:schema.graphql
type RestaurantGroup {
  customers(after: ID, first: Int!): CustomerConnection!
}
```

## 参考

https://relay.dev/docs/guided-tour/list-data/connections/

https://pothos-graphql.dev/docs/plugins/relay
チームで勉強会をやっていたときに心がけていたこと

## はじめに
株式会社LITALICOでQAチームに所属している@k_kitamuraと申します。
好きな食べ物は唐揚げ、好きな飲み物はカルピスです。
前に勤めていた会社でCS（カスタマーサポート）を担当していたので、その経験を活かしてソフトの品質を高められるよう日々テストに勤しんでおります。
ただQAとしての技術はまだ未熟なため何か学習におすすめの書籍はないかお尋ねしたところ、「ソフトウェアテスト技法練習帳」という書籍を紹介してもらいました。
本記事ではこの書籍を用いた勉強会のお話をさせていただきます。

## なぜ勉強会をやることになったのか
上記でも少しお話したとおり、私が所属しているQAメンバーの中で私を含めテスト経験の浅いメンバーが何名かいたため、経験者との知識の偏りをなくすため学習におすすめの書籍を経験者の方に尋ねたところ、「ソフトウェアテスト技法練習帳」（以下 練習帳）を紹介していただきました。
練習帳とのことで問題を解いていくタイプの書籍だったので、時間をとってみんなで集まってやっていきましょうかと同じメンバーで当時リーダーだったNさんがすすめてくださったのが勉強会を始めるきっかけでした。

## 勉強会の内容
練習帳は大きく分けて
- Part1：同値分割法と境界値分析
- Part2：デシジョンテーブル
- Part3：状態遷移テスト
- Part4：組合わせテスト
- Part5：総合問題

と5つの章に分かれており、それぞれの章に問題が用意されております。
まず各問題を個人で挑戦し、夕方頃に全員で集まってそれぞれの回答を発表→解答例と解説を確認という流れで実施しておりました。

## 実施するにあたって大事にしていたこと
わからないことをわからないままにすると後の勉強会にも響いてきたりするので、その場で解決を目指すことが大事だと思いました。
ファシリを一人に集約すると他のメンバーの気が抜けることもあると思うので、参加者全員が発表・発言できるような空気を心がけてました。

:::note info
聞くは一時の恥、聞かぬは一生の恥
:::

## 勉強会を実施する中で改善してきたこと
練習帳にある解答例がなぜその答えになるのか納得できない場合があり、その問題・解答に対してみんなで議論するような時間が徐々に増えていったことです。
議論を通してメンバーそれぞれの視点やノウハウが共有できたので全体的にスキルアップに繋がったとQA業務を通じて実感できました。

## さいごに
読んでいただきありがとうございます。
普段の業務をこなしつつ勉強会を実施していくのは大変ですよね...
せっかく開催しているので参加者には楽しんでもらうような雰囲気もまた重要だと思います。
人生は日々勉強、学びを楽しんでいきましょう！

## 書籍紹介
ソフトウェアテスト技法練習帳
↓技術評論社HP

https://gihyo.jp/book/2020/978-4-297-11061-1
Python3エンジニア認定基礎試験向けかもしれない問題集

AIを使って問題を作成しています。


### Prompt:
`Python3エンジニア認定基礎試験に出てきそうな問題を作ってください。`



### 問題1 (条件分岐)
次のコードの出力は何ですか？

```python: Python
x = 7
if x % 2 == 0:
    print("Even")
else:
    print("Odd")
```

1. `Even`
1. `Odd`
1. `None`
1. `Error`

<details> <summary>解説</summary>

正解：2. `Odd` x が奇数であるため、"Odd" が出力されます。

</details>

### 問題2 (辞書のメソッド)
次のコードの出力は何ですか？

```python: Python
d = {'a': 1, 'b': 2}
d.update({'c': 3})
print(d)
```

1. `{'a': 1, 'b': 2}`
1. `{'a': 1, 'b': 2, 'c': 3}`
1. `{'a': 1, 'c': 3}`
1. `{'c': 3, 'b': 2}`

<details> <summary>解説</summary>

正解：2. `{'a': 1, 'b': 2, 'c': 3}` update メソッドは辞書に新しいキーと値のペアを追加します。

</details>

### 問題3 (ループ)
次のコードの出力は何ですか？

```python: Python
result = 1
for i in range(1, 4):
    result *= i
print(result)
```

1. `1`
1. `6`
1. `10`
1. `24`

<details> <summary>解説</summary>

正解：2. `6` 1 * 1 * 2 * 3 なので結果は 6 です。

</details>

### 問題4 (関数のネスト)
次のコードの出力は何ですか？

```python: Python
def outer(a):
    def inner(b):
        return a + b
    return inner

add_five = outer(5)
print(add_five(3))
```

1. `5`
1. `8`
1. `10`
1. `15`

<details> <summary>解説</summary>

正解：2. `8` 内部関数 inner は外部関数 outer の引数 a を使用します。

</details>

### 問題5 (リスト操作)
次のコードの出力は何ですか？

```python: Python
lst = [1, 2, 3, 4]
lst.pop()
print(lst)
```

1. `[1, 2, 3, 4]`
1. `[2, 3, 4]`
1. `[1, 2, 3]`
1. `[1, 2, 3, 4, 5]`

<details> <summary>解説</summary>

正解：3. `[1, 2, 3]` pop メソッドはリストの最後の要素を削除します。

</details>

### 問題6 (クラスのメソッド)
次のコードの出力は何ですか？

```python: Python
class MyClass:
    def __init__(self, value):
        self.value = value
    
    def double(self):
        return self.value * 2

obj = MyClass(5)
print(obj.double())
```

1. `5`
1. `10`
1. `15`
1. `20`

<details> <summary>解説</summary>

正解：2. `10` double メソッドは value の2倍を返します。

</details>

### 問題7 (例外処理)
次のコードを実行した場合、どの例外が発生しますか？

```python: Python
try:
    d = {'a': 1}
    print(d['b'])
except Exception as e:
    print(type(e))
```

1. `<class 'ValueError'>`
1. `<class 'IndexError'>`
1. `<class 'TypeError'>`
1. `<class 'KeyError'>`

<details> <summary>解説</summary>

正解：4. `<class 'KeyError'>` 辞書に存在しないキーにアクセスしようとすると KeyError が発生します。

</details>

### 問題8 (文字列操作)
次のコードの出力は何ですか？

```python: Python
s = "Python"
print(s[-1])
```

1. `P`
1. `y`
1. `n`
1. `Error`

<details> <summary>解説</summary>

正解：3. `n` インデックス -1 は文字列の最後の要素を指します。

</details>

### 問題9 (標準入力)
次のコードの出力は何ですか？ (標準入力として 3 を入力することを仮定します)

```python: Python
n = int(input())
print(n * 2)
```

1. `3`
1. `6`
1. `2`
1. `Error`

<details> <summary>解説</summary>

正解：2. `6` 標準入力から受け取った 3 を2倍します。

</details>

### 問題10 (リスト内包表記)
次のコードの出力は何ですか？

```python: Python
lst = [x for x in range(5) if x % 2 == 0]
print(lst)
```

1. `[0, 2, 4]`
1. `[1, 3, 5]`
1. `[0, 1, 2, 3, 4]`
1. `[2, 4, 6]`

<details> <summary>解説</summary>

正解：1. `[0, 2, 4]` リスト内包表記で、0から4の範囲内で偶数のみを含むリストを作成します。

</details>
Dockerって結局よくわからない...という人のための入門者向けDocker紹介

# はじめに
[CYBIRD Advent Calendar 2024](https://qiita.com/advent-calendar/2024/cybird)の3日目担当の@tomoko_ishizakaです。
2日目は@chikako_ikedaさんの「[Android15の録画検出機能を試した話](https://qiita.com/chikako_ikeda/private/13d2baae018a7097904a)」でした。

3日目のこの記事では、Dockerについてまとめてみました。

# 概要
『Docker』について、コンテナ・仮想化、そんなフワッとしたイメージを持っている方は多いと思います。
ただ私自身、Dockerを使ってたくさん作業してきたはずなのに、いまいち掴み切れていないなと感じていました。
そこで一度全体像を抑えておこうと思い、調べたことをまとめました。

# 結論：Dockerとは
Dockerとは、
『コンテナと呼ばれる仮想動作環境を使って、環境構築を楽にしてくれるツール』
です。
※環境構築 = MySQLやLaravelなどの色々なソフトを用意し、適切なバージョンに設定したり、その他開発に必要なものを揃えること

とはいえ、コンテナや仮想という言葉はまだわかりにくいため、イメージ図付きで整理してみました。

# 仮想動作環境...って何？
仮想でない環境（物理環境）の場合は、コンピュータのOSに直接必要なアプリを入れて、開発しますが、『同じ環境を別の人のコンピュータにも用意したい！』という場合に非常に面倒です。

そこで、VMware や Virtualbox のような仮想化ソフトを使うことで、コンピュータの中に
まるでもう１台コンピュータがあるかのように振る舞わせて、管理を楽にすることができます。
（自分のコンピュータ自体にアプリを入れないので、複数バージョンのアプリで散らからずに済みます。また、他の人に共有するときもマシンをエクスポートしたファイルを共有すれば同じ環境を簡単に再現できます。）

ただし、OSごと仮想マシンを作るため、重くなるというデメリットがあります。
そこを解消したのがDockerです。

Dockerは、OSはホストマシン（手元にある物理的なコンピュータ）のものを使い、アプリやその依存関係などの情報をコンテナとして動かしているため、軽く動かせます。
（厳密にはOSっぽいものはコンテナに含まれているものの、ホストマシンのカーネルを使っているから軽いらしいです。）

![Dockerを学ぼう.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981423/3501cf91-36c5-2ed3-80c0-b329b929eff1.png)


# 具体的にはどうやって仮想環境を作っているの？
仮想マシンの設定などは、Dockerfileというもので指定します。

![Dockerを学ぼう (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981423/c7cda47c-541d-c188-e01d-44f8f4fb665e.png)


また、設定項目のうち少しわかりづらいものの詳細を以下にまとめました。

**FROM**：コンテナの親イメージを指定。なお、Dockerfileは必ずFROMから始まる必要がある。公開リポジトリから自由に指定できる。
**ENV**：環境変数を指定。このDockerfileは例のため使っていないが、以降このファイル内でNODE_ENVという変数が使えるようになる。
**WORKDIR**：作業ディレクトリの指定。以降のRUNなどはここで指定した場所で実行される。
**EXPOSE**：リッスンするポートを指定。この指定だけでは実際にはポートは開かれないので、docker run時に指定が必要。このポートは、コンテナ側のポートなので、ここを3000指定にして、ホスト側は3001で接続するように（docker runコマンドなどで）設定すると、3001にアクセスすればコンテナの3000に届くようになる。

※なお、EXPOSE設定については、ネットワークの設定はこの他にも色々あるので必ずしもこの設定が守られるわけではないようです。

# おわりに
今回は、DockerやDockerfileをメインに調べてみました。
コンテナ同士のネットワーク設定やポート管理など、まだ理解しきれていない部分が多々あるので、今後も機会があればまとめていきたいと思います。

明日の[CYBIRD Advent Calendar 2024](https://qiita.com/advent-calendar/2024/cybird) 4日目は、@kyukkyu81さんの「[テキスト生成AIに極小コードでひたすら励まし癒してもらう（無料でな）](https://qiita.com/kyukkyu81/private/3ede686c3e8dd7d7f8fc)」です。
お楽しみに！
GPT-4oの最新アップデートがもたらす変化とは？Google Geminiとの競争！

OpenAIは2024年11月20日にGPT-4oの大規模なアップデートを発表しました。このアップデートにより、モデルの性能と機能が大幅に向上し、ユーザーエクスペリエンスが改善されたようです。そのアップデートについて紹介いたします！

![Screenshot 2024-11-29 at 18.00.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778915/c688f095-fa12-03f6-7d68-2970d9bc8fb1.png)

![Screenshot 2024-11-29 at 18.02.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778915/df8c063b-5ec4-8c8a-c146-6d1d19fbc60d.png)

GPT-4oのアップデートが大きなニュースになっていないのですが、OpenAIのModel Release NotesとXに投稿されています。

Model Release Note：
>GPT-4oのアップデートを行いました。GPT-4oのアップデートでは、より自然で、聴衆を意識し、関連性と読みやすさを向上させるために調整されたライティング機能が改善されました。このモデルはまた、アップロードされたファイルを扱うのがより上手になり、より深い洞察とより徹底的な回答を提供します。

Xの投稿：
>GPT-4oがアップデート🎉。
より自然で、より魅力的で、より読みやすい文章を提供します。
また、アップロードされたファイルを扱うのがより得意になり、より深い洞察と徹底的な回答を提供します。

ちょっと曖昧な説明で、具体的にどう改善できているかが気になります。

まず、改善ポイントをまとめます：

### 創造的ライティング能力の強化

11月20日のアップデートより、GPT-4oモデルは現在、より自然で魅力的なコンテンツを生成し、創造的な文章能力が向上しているそうです。文章の改善点には以下が含まれます：

- ユーザーの情報要求のより良い理解
- テキスト生成におけるより自然な表現
- より適切で関連性の高いコンテンツの提供

### ファイル処理とコンテキスト理解の向上

このアップデートにより、GPT-4oのアップロードファイル処理能力が強化され、以下が可能になりました：

- より深いドキュメント分析
- より徹底したインサイトの提供
- より優れた情報抽出と処理

### 実際どうなっている？

最近のLLMのランキングをチェックしたい時は「Chatbot Arena」を見ています。https://lmarena.ai/?leaderboard

Chatbot Arenaは、最新のLLM（大規模言語モデル）のランキングや性能をチェックできるサイトです。ユーザーは「Battle」で2つのチャットボットと話し、それぞれの応答を比較して評価することができます。たとえば、どのボットが質問により的確に答えられるかを試すことができ、AIチャットボット同士の特徴や違いを簡単に確認できます。

ランキングを見れば、アップデートされたChatGPT-4o（2024-11-20）とGoogleの「Geminiのexp-1121」が両方1位になっています。

![Screenshot 2024-11-29 at 18.33.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778915/bae96603-becc-1e2e-81e4-038e34f9fd19.png)

最初に自分で使ってみたら、一番に気づくのがスピードでした。「2024-11-20」が「2024-08-06」（11月20日までの最新4o）よりずっと早いです。文章が改善されているかどうか、という点では少し言いにくいですが、良い感じに見えます。
文字のサイズが場面によって変わってしまう問題

[PONOS Advent Calendar 2024](https://qiita.com/advent-calendar/2024/ponos)の1日目の記事です。:tada:

ちょっとした困りごとから調べ物を始め、Unicodeの沼にはまりました。
結局、根本的な原因までは突き止められずだったのですが、分かったところまで書いておきます。:bow_tone1:

## 起こっていること

Googleドキュメントで黒丸（●）を使うとき、状況によってサイズ感が変化してしまいます。

![gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2492/c7866d6f-ffbe-8294-07b7-63752c4b02d4.gif)
※ 「●aiueo」の2文字目に「あ」を入れると、「●」のサイズが変わってしまう

こんな感じで、続く文字が「a」のときは小さく、「あ」だと大きく変化します。
Unicode環境ではありますが、いわゆる半角文字か全角文字かで変化するようです。


## なぜこうなる？

「●」がUnicodeにおける「あいまい幅文字」だからです。

※ 実はこれだけだと半分しか解決していません。
後述のとおり別のPCだとサイズが変わらなかったりもするのですが、その違いまでは調べきれず。

### Unicodeと半角/全角

Unicodeは言語を問わず1つの文字コードで扱える仕組みです。
Shift-JISと違って、半角だから1バイト・全角は2バイトと決まっているわけじゃないのですが、依然として半角/全角の区別は存在します。
主に固定幅フォントの環境で効いてくる区別で、字体のバランスからアルファベットは半角、漢字やひらがなは全角で表現されます。


### あいまい幅（Ambiguous Width）の文字

ややこしいのが、文脈によって文字幅が変わる文字の存在です。
あいまい幅（Ambiguous Width）と呼ばれています。

> A（Ambiguous; 曖昧）- 文脈によって文字幅が異なる文字。東アジアの組版とそれ以外の組版の両方に出現し、東アジアの従来文字コードではいわゆる全角として扱われることがある。ギリシア文字やキリル文字など。
[東アジアの文字幅](https://ja.wikipedia.org/wiki/%E6%9D%B1%E3%82%A2%E3%82%B8%E3%82%A2%E3%81%AE%E6%96%87%E5%AD%97%E5%B9%85)

旧来の文字コードとの互換性を維持するための措置で、同じ文字であっても文脈によって全角になったり半角になったりします。
たとえばギリシャ文字の「α」は、Shift-JISだと漢字と同じ2バイト全角扱いですが、greek（[ISO-8859-7](https://ja.wikipedia.org/wiki/ISO/IEC_8859-7)）では1バイト半角で表現されています。

ギリシャ語のテキストの中に急に全角αが出てきたらおかしいので、そういう場合は半角で表示されることになります。（逆に日本語文の場合は全角になる）


### つまり・・・

「●」も同じく、あいまい幅だったようです。

念のため裏取りをしてみます。

[EastAsianWidth-16.0.0.txt](https://www.unicode.org/Public/UNIDATA/EastAsianWidth.txt)

East Asian Widthの設定値一覧が書かれたテキストファイルです。
「●」のUTF-16コード`25CF`を探してみると・・・。
```
25CC..25CD     ; N  # So     [2] DOTTED CIRCLE..CIRCLE WITH VERTICAL FILL
25CE..25D1     ; A  # So     [4] BULLSEYE..CIRCLE WITH RIGHT HALF BLACK
25D2..25E1     ; N  # So    [16] CIRCLE WITH LOWER HALF BLACK..LOWER HALF CIRCLE
```
ありました。
真ん中の`25CE..25D1`の範囲に包括されています。
設定値は`A`、つまりAmbiguous（あいまい）です。

「●」もあいまい幅扱いだったことが確認できました。



## わかっていないこと

実はこの問題、手元にあるPC2台のうち、片方でだけ発生している事象だったりします。
Googleドキュメントで「Century」フォントを使ったときに発生します。

同じファイルを開いたときでも、PC-AとPC-Bで表示が異なります。

「Century」+ PC-A
文脈がアルファベットの場合は小さいサイズ（半角扱い）、ひらがなだと全角になります。
![image_2024_11_29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2492/007e4383-f4dc-1076-aff2-b1b12a4d9280.png)


「Century」+ PC-B
こっちは両方とも全角。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2492/cff4a693-59f9-e940-9f0f-552acc53ea94.png)


さらに、PC-Aでもフォントによっては状態が違ったりします。
「Arial」に変更すると、両方とも半角になります。

「Arial」 + PC-A
![image_2024_11_292.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2492/df5a4443-c03e-05b4-4fd7-0a7d89555923.png)


PCごとの設定の違いやフォントの違いが影響するのかもしれません。
また機会があれば調べてみたいと思います。

次回は@kerimekaさんです！
よろしくお願いします。:clap:


## 参考記事

- [端末の文字幅問題の傾向と対策](https://eng-blog.iij.ad.jp/archives/12576)
- [Unicodeで半角全角を扱う Ambiguous（曖昧さ）とUncertainty（不確実性）の恐怖](https://qiita.com/Nuits/items/71a69cf32d547c9875bb)
Kernelモジュール

# Kernelモジュールはすべてのクラスから参照できる
>全てのクラスから参照できるメソッドを定義しているモジュール。 Object クラスはこのモジュールをインクルードしています。
>
>Object クラスのメソッドは実際にはこのモジュールで定義されています。

https://docs.ruby-lang.org/ja/latest/class/Kernel.html#:~:text=%E5%85%A8%E3%81%A6%E3%81%AE%E3%82%AF%E3%83%A9%E3%82%B9,%E3%82%8C%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82

# ObjectクラスがKernelモジュールをincludeしている
>Kernelモジュールのメソッドはどこでも使えるようになっているのでしょうか？それはObjectクラスはKernelモジュールをincludeしているからです。

```rb
irb(main):007> Object.include?(Kernel)
=> true
```

>全クラスの頂点にいるクラスだと説明しました。そのため、すべてのクラスはKernelモジュールのメソッドが使えるようになっているわけです。

https://gihyo.jp/book/2017/978-4-7741-9397-7

# 感想
puts p はKernelモジュールのメソッドだったのか
Clojure環境構築 - VScode

![advent_calendar_2024.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985550/f4cd8ce0-6352-a1d8-4cae-f39dd44f4def.png)

[*Advent Calendar 2024 Day 3*](https://qiita.com/advent-calendar/2024/clojure)

:::note warn
前提

- javaがインストール済みであること
- leiningenがインストール済みであること
- VSCodeがインストールされていること

もし上記セットアップがまだな場合は昨日の[記事](https://qiita.com/maaaashi/private/542f30a11b4e80ac1b4b)を読んで下さい
:::

## VScode での開発環境構築

### 拡張機能 "Calva" のインストール

![スクリーンショット 2024-11-29 23.17.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985550/d9865db4-180e-3afb-99d2-6961ee0b8697.png)

1. VSCodeの拡張機能のCalvaをインストールします
1. leiningenで作成されたプロジェクトを開きます

    :::note warn
    まだleiningenのプロジェクトが作成されていない場合は作成しておきます。
    もしleiningenがインストールされていない場合は昨日の[記事](https://qiita.com/maaaashi/private/542f30a11b4e80ac1b4b)を見てください
    ```
    $ lein new {appName}
    ```

1. CalvaでREPLを起動します(jack-in)
    1. `Ctrl + P` でCommand Panelを開きます
    1. `Calva: Start a Project REPL and Connect (Jack-in)` を選択します
    
        ![スクリーンショット 2024-11-29 23.23.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985550/746d4455-ec43-cfc0-1fcb-33aee8fb200b.png)

    1. 使用するツールとして、`leiningen` を選択します

        ![スクリーンショット 2024-11-29 23.25.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985550/3979b417-88c5-b8e4-9d6f-d2ce43a6ace6.png)

これでLeiningenによってREPLが起動し、開いているプロジェクトに接続されます

---

### 実際に評価してみる

`src/{appName}/core.clj`を開き、`Hello World`と出力する関数を書いてみます

```clojure
(ns todo.core)

(defn greet [name]
  (str "Hello, " name " !"))

(println (greet "World"))
```

`greet` 関数を評価した後に`println`から始まる関数を実行した結果

```clojure
clj꞉todo.core꞉> 
#'todo.core/greet
clj꞉todo.core꞉> 
; Hello, World !
nil
```

このようにVSCodeでコードを書きながらリアルタイムに評価することができました。

![スクリーンショット 2024-11-29 23.36.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985550/c320cbeb-19a3-6154-ef6c-b61ac3e39fd4.png)

:::note
このアドベントカレンダーのどこかでまとめようと思いますが、
VSCodeでClojureを書くのであればショートカットを有効に活用していくと良いでしょう

以下は一例です

|操作|コマンド|
|----|----|
|現在の行を評価|Alt + Enter|
|選択中の関数を評価|Ctrl + Enter|
:::
Oracle Databaseのdockerでtimezoneを変更

Oracle Databaseの設定変更というより、コンテナのOSのtimezone変更で行う。

# 手順
どちらのコンテナでも`TZ`が意図通りになるのを確認した。以下のコマンド例はtimezone変更が分かりやすいように`Europe/Madrid` (`+01:00`)で試している。

## container-registry.oracle.com/database/free
https://container-registry.oracle.com/ords/ocr/ba/database/free の場合。

```sh
docker run --name my_oracle -p 11521:1521 -e ORACLE_PWD="Oracle23" -e TZ="Europe/Madrid" container-registry.oracle.com/database/free:23.5.0.0-lite
```

## gvenzl/oracle-free

https://hub.docker.com/r/gvenzl/oracle-free の場合。

```sh
docker run --name my_oracle -p 11521:1521 -e ORACLE_PASSWORD="Oracle23" -e TZ="Europe/Madrid" gvenzl/oracle-free:23.5
```

## 確認
以下のように、`SYSTIMESTAMP`はコンテナOSのtimezoneに影響されて`+01:00`、`CURRENT_TIMESTAMP`はsessionが日本なので`+09:00`になるのが確認できる。DBTIMEZONEの決定方法がイマイチ調べても良く分からないがこの環境ではデフォルト`+00:00`のままになるようだ。

```sql
select 
  DBTIMEZONE,       -- +00:00
  SESSIONTIMEZONE,  -- +09:00
  SYSTIMESTAMP,     -- 24-11-29 11:02:25.968674 +01:00
  CURRENT_TIMESTAMP -- 24-11-29 19:02:25.968681 +09:00
from dual;
```

コンテナの起動ログでも確認できる。

```
#########################
DATABASE IS READY TO USE!
#########################
The following output is now a tail of the alert.log:
Pluggable database FREEPDB1 with pdb id - 3 is now marked as NEW.
****************************************************************
2024-11-29T11:04:31.871810+01:00 <- これ
```
inspect

# inspectの内容が文字列となって出力される

>オブジェクトを人間が読める形式に変換した文字列を返します。
>
>組み込み関数 Kernel.#p は、このメソッドの結果を使用してオブジェクトを表示します。

```rb
[ 1, 2, 3..4, 'five' ].inspect   # => "[1, 2, 3..4, \"five\"]"
Time.new.inspect                 # => "2008-03-08 19:43:39 +0900"
[ 1, 2, 3..4, 'five' ].inspect   # => "[1, 2, 3..4, \"five\"]"
Time.new.inspect                 # => "2008-03-08 19:43:39 +0900"
```
>inspect メソッドをオーバーライドしなかった場合、クラス名とインスタンス変数の名前、値の組を元にした文字列を返します。

```rb
class Foo
end
Foo.new.inspect                  # => "#<Foo:0x0300c868>"

class Bar
  def initialize
    @bar = 1
  end
end
Bar.new.inspect                  # => "#<Bar:0x0300c868 @bar=1>"
class Foo
end
Foo.new.inspect                  # => "#<Foo:0x0300c868>"

class Bar
  def initialize
    @bar = 1
  end
end
Bar.new.inspect                  # => "#<Bar:0x0300c868 @bar=1>"
```

https://docs.ruby-lang.org/ja/latest/method/Object/i/inspect.html
# inspectあるなしで実験してみた
```rb
irb(main):057* class Hi
irb(main):058*   def inspect
irb(main):059*     "hi hi!"
irb(main):060*   end
irb(main):061> end
=> :inspect
irb(main):062> Hi.new
=> hi hi!
```
```rb
irb(main):001* class Hi
irb(main):002*   def dance
irb(main):003*     "hi hi dance!"
irb(main):004*   end
irb(main):005> end
=> :dance
irb(main):006> Hi.new
=> #<Hi:0x000000010911fee0>
```
【型 'string | undefined' の引数を型 'string' のパラメーターに割り当てることはできません。】せっかくTypescript使っているんだから、通ればOKは違うでしょう！

## はじめに

>型 'string | undefined' の引数を型 'string' のパラメーターに割り当てることはできません。

このエラーよく見ますよね。
```string```だけではなくて```number```だったり、```MyType```のようなユーザ定義型だったり、色々あると思いますが、要は```〇〇 | undefined```の場合のお話です。

## 結論
存在確認をしてundefinedの可能性を潰してあげましょう。
```Typescript
    // このIF文で存在確認をしている。
    if (hoge) {
    validateString(hoge.text)
    }
```

NULL合体演算子を使ってもいいし、三項演算子を使ってもいいです。
<font color="Red">とにかく型チェックを無理やり回避するようなやり方をやめましょう。</font>

## 出来れば避けたい対処法
・asで無理やり通す
→そうだ！as使えば良いじゃん！ってなりがちですが、型の安全性が損なわれるので良くないです。

・そもそものユーザー定義型でundefinedを入れてしまう
→全てのユーザ定義型でそれをやるって訳にもいかないので、良くないです。

・諦めていっそany
→どうしようもない時も正直あります。
ただし最終手段です。
ESLintとかでany禁止にするのが本当は一番なんですけどね・・・
常微分方程式 x**2*y''+2*x*y'=6*x,y(1)=y(2)=0 を解きたい。(その2)ロンスキアン途中です。


・途中です。続編未定。
・GPT-4o. の Free プランの制限に達しました。
制限が 30 分以内. にリセットされるまで、回答では別のモデルが使用されます。
・**勉強予定。??? 2階オイラー方程式**

:::note info
(その1)のつづきです。
https://qiita.com/mrrclb48z/items/25283f5ead2edf86c6e7
:::


# ChatGPT先生へ
同時？同次?
```
x**2*y''+2*x*y'=6*x,y(1)=y(2)=0
上式は、定数係数1階同時常微分方程式ですか。
```
いいえ、提示された式は 定数係数1階同次常微分方程式 ではありません。
(途中省略)
したがって、この式は「**変数係数の2階非同次常微分方程式**」に分類されます。
...
```
ロンスキアンを使って、解いて下さい。
```
(途中省略)
計算量が多いため、詳細な導出を行うか、別途手順を示す準備があります。計算を進めたい場合は指示してください。
```
sympyで、解いて下さい。
```
分析しています。...
```
ロンスキアンのsympyのソースコードを教えてください。
```
(途中省略)
```
ロンスキアンのsympyのソースコードを使って解いてください。
```
??? 私はわかりませんでした。
It seems like I can’t do more advanced data analysis right now. Please try again later. If you'd like, I can guide you on how to run the calculations on your own system using SymPy! Let me know how you'd like to proceed. ​
# Gemini先生へ

# copilot先生へ

# 参考記事

https://en.wikipedia.org/wiki/Wronskian

https://ja.wikipedia.org/wiki/ロンスキー行列式

# 参考文献
 私は「改訂6」でした。常微分方程式キャンパス・ゼミ 改訂11

https://books.mathema.jp/books/qzpda5bi4zo7o8t9nuway4u8j8nh0u94
Python3エンジニア認定基礎試験向けかもしれない問題集

AIを使って問題を作成しています。


### Prompt:
`Python3エンジニア認定基礎試験に出てきそうな問題を作ってください。`


### 問題1 (リスト操作)
次のコードの出力は何ですか？

```python: Python
lst = [1, 2, 3, 4]
lst.insert(2, 5)
print(lst)
```

1. `[1, 2, 5, 3, 4]`
1. `[1, 2, 3, 4, 5]`
1. `[5, 1, 2, 3, 4]`
1. `[1, 5, 2, 3, 4]`

<details> <summary>解説</summary>

正解：1. `[1, 2, 5, 3, 4]` insert メソッドは指定したインデックスに要素を挿入します。

</details>

### 問題2 (辞書操作)
次のコードの出力は何ですか？

```python: Python
d = {'a': 1, 'b': 2}
d['c'] = 3
print(d)
```

1. `{'a': 1, 'b': 2}`
1. `{'a': 1, 'b': 2, 'c': 3}`
1. `{'a': 1, 'c': 3}`
1. `{'c': 3, 'b': 2}`

<details> <summary>解説</summary>

正解：2. `{'a': 1, 'b': 2, 'c': 3}` 新しいキーと値のペア {'c': 3} が辞書に追加されます。

</details>

### 問題3 (例外処理)
次のコードを実行した場合、どの例外が発生しますか？

```python: Python
try:
    lst = [1, 2, 3]
    print(lst[3])
except Exception as e:
    print(type(e))
```

1. `<class 'ValueError'>`
1. `<class 'IndexError'>`
1. `<class 'TypeError'>`
1. `<class 'KeyError'>`

<details> <summary>解説</summary>

正解：2. `<class 'IndexError'>` リストの範囲外にアクセスしようとすると IndexError が発生します。

</details>

### 問題4 (関数の引数)
次のコードの出力は何ですか？

```python: Python
def multiply(x, y=2):
    return x * y

print(multiply(3))
```

1. `3`
1. `6`
1. `9`
1. `None`

<details> <summary>解説</summary>

正解：2. `6` デフォルト引数 y が指定されていない場合、値は 2 が使われます。

</details>

### 問題5 (文字列操作)
次のコードの出力は何ですか？

```python: Python
s = "Python"
print(s[1:4])
```

1. `Pyt`
1. `yth`
1. `tho`
1. `ytho`

<details> <summary>解説</summary>

正解：2. `yth` スライス s[1:4] はインデックス1から3までの部分文字列を含みます。

</details>

### 問題6 (リストの繰り返し)
次のコードの出力は何ですか？

```python: Python
lst = [0] * 3
print(lst)
```

1. `[0, 0, 0]`
1. `[0, 0, 0, 0]`
1. `[3, 3, 3]`
1. `[0, 3, 0]`

<details> <summary>解説</summary>

正解：1. `[0, 0, 0]` リストの繰り返しにより、指定された要素が繰り返されます。

</details>

### 問題7 (辞書のメソッド)
次のコードの出力は何ですか？

```python: Python
d = {'a': 1, 'b': 2}
print(d.get('c', 3))
```

1. `1`
1. `2`
1. `3`
1. `None`

<details> <summary>解説</summary>

正解：3. `3` キー 'c' が存在しない場合、デフォルト値 3 が返されます。

</details>

### 問題8 (モジュールの利用)
次のコードの出力は何ですか？

```python: Python
import datetime
print(datetime.date.today())
```

1. `Today's date`
1. `Current time`
1. `Error`
1. `Current date`

<details> <summary>解説</summary>

正解：4. `Current date` datetime.date.today() は現在の日付を返します。

</details>

### 問題9 (文字列のメソッド)
次のコードの出力は何ですか？

```python: Python
s = "   Hello, World!   "
print(s.strip())
```

1. `"Hello, World!"`
1. `"   Hello, World!   "`
1. `"Hello, World! "`
1. `"Hello, World"`

<details> <summary>解説</summary>

正解：1. `"Hello, World!"` strip メソッドは文字列の前後の空白を削除します。

</details>

### 問題10 (ループ)
次のコードの出力は何ですか？

```python: Python
for i in range(3, 6):
    print(i)
```

1. `3 4 5 6`
1. `3 4 5`
1. `4 5 6`
1. `Error`

<details> <summary>解説</summary>

正解：2. `3 4 5` range(3, 6) は3から5の値を生成します。

</details>
Python3エンジニア認定基礎試験向けかもしれない問題集

AIを使って問題を作成しています。


### Prompt:
`Python3エンジニア認定基礎試験に出てきそうな問題を作ってください。`


### 問題1 (関数のデフォルト引数)
次のコードの出力は何ですか？

```python: Python
def greet(name="World"):
    return f"Hello, {name}!"

print(greet())
```

1. `Hello, World!`
1. `Hello, !`
1. `Hello, None!`
1. `Error`

<details> <summary>解説</summary>

正解：1. `Hello, World!` デフォルト引数 name は指定されていない場合 "World" が使われます。

</details>

### 問題2 (モジュールのインポート)
次のコードの出力は何ですか？

```python: Python
import math
print(math.pi)
```

1. `3`
1. `3.14`
1. `3.14159`
1. `3.141592653589793`

<details> <summary>解説</summary>

正解：4. `3.141592653589793` math モジュールの pi は円周率を表します。

</details>

### 問題3 (リストメソッド)
次のコードの出力は何ですか？

```python: Python
lst = [5, 1, 3, 2, 4]
lst.sort()
print(lst)
```

1. `[1, 2, 3, 4, 5]`
1. `[5, 4, 3, 2, 1]`
1. `[5, 1, 3, 2, 4]`
1. `Error`

<details> <summary>解説</summary>

正解：1. `[1, 2, 3, 4, 5]` sort メソッドはリストを昇順に並び替えます。

</details>

### 問題4 (条件式)
次のコードの出力は何ですか？

```python: Python
x = 10
result = "Even" if x % 2 == 0 else "Odd"
print(result)
```

1. `Even`
1. `Odd`
1. `None`
1. `Error`

<details> <summary>解説</summary>

正解：1. `Even` 条件式で x が偶数なら "Even" を返します。

</details>

### 問題5 (リストの組み込み関数)
次のコードの出力は何ですか？

```python: Python
lst = [1, 2, 3, 4, 5]
print(sum(lst))
```

1. `15`
1. `10`
1. `5`
1. `Error`

<details> <summary>解説</summary>

正解：1. `15` sum 関数はリストの全要素の合計を返します。

</details>

### 問題6 (論理演算)
次のコードの出力は何ですか？

```python: Python
print(True or False)
```

1. `True`
1. `False`
1. `None`
1. `Error`

<details> <summary>解説</summary>

正解：1. `True` or 演算子は一方が真であれば真を返します。

</details>

### 問題7 (関数のスコープ)
次のコードの出力は何ですか？

```python: Python
def outer():
    x = "outer"
    def inner():
        return x
    return inner()

print(outer())
```

1. `inner`
1. `outer`
1. `None`
1. `Error`

<details> <summary>解説</summary>

正解：2. `outer` 内部関数 inner は外部関数 outer の変数 x にアクセスできます。

</details>

### 問題8 (セット操作)
次のコードの出力は何ですか？

```python: Python
s = {1, 2, 3}
s.remove(2)
print(s)
```

1. `{1, 2, 3}`
1. `{1, 3}`
1. `{2, 3}`
1. `Error`

<details> <summary>解説</summary>

正解：2. `{1, 3}` remove メソッドはセットから指定した要素を削除します。

</details>

### 問題9 (文字列フォーマット)
次のコードの出力は何ですか？

```python: Python
name = "Alice"
age = 30
print(f"My name is {name} and I am {age} years old.")
```

1. `My name is and I am years old.`
1. `My name is Alice and I am 30 years old.`
1. `My name is {name} and I am {age} years old.`
1. `Error`

<details> <summary>解説</summary>

正解：2. `My name is Alice and I am 30 years old.` f文字列を使用することで、変数を直接文字列に挿入できます。

</details>

### 問題10 (例外処理)
次のコードを実行した場合、どの例外が発生しますか？

```python: Python
lst = [1, 2, 3]
print(lst[5])
```

1. `IndexError`
1. `ValueError`
1. `TypeError`
1. `KeyError`

<details> <summary>解説</summary>

正解：1. `IndexError` リストの範囲外にアクセスしようとすると IndexError が発生します。

</details>
Python3エンジニア認定基礎試験向けかもしれない問題集

AIを使って問題を作成しています。


### Prompt:
`Python3エンジニア認定基礎試験に出てきそうな問題を作ってください。`

### 問題1 (条件分岐)
次のコードの出力は何ですか？

```python: Python
x = 10
if x > 5:
    print("Greater")
else:
    print("Smaller")
```

1. `Greater`
1. `Smaller`
1. `None`
1. `Error`

<details> <summary>解説</summary>

正解：1. `Greater` x が5より大きいため、"Greater" が出力されます。

</details>

### 問題2 (リスト操作)
次のコードの出力は何ですか？

```python: Python
lst = [1, 2, 3, 4, 5]
lst.append(6)
print(lst)
```

1. `[1, 2, 3, 4, 5, 6]`
1. `[6, 1, 2, 3, 4, 5]`
1. `[1, 2, 3, 4, 5]`
1. `[1, 2, 3, 4, 5, 6, 7]`

<details> <summary>解説</summary>

正解：1. `[1, 2, 3, 4, 5, 6]` append メソッドはリストの末尾に要素を追加します。

</details>

### 問題3 (ファイル操作)
次のコードの出力は何ですか？

```python: Python
with open("test.txt", "w") as f:
    f.write("Hello, World!")
with open("test.txt", "r") as f:
    print(f.read())
```

1. `Hello, World!`
1. `何も表示されない`
1. `test.txt`
1. `Error`

<details> <summary>解説</summary>

正解：1. `Hello, World! ファイルに "Hello, World!" を書き込み、その内容を読み込んで表示します。

</details>

### 問題4 (集合)
次のコードの出力は何ですか？

```python: Python
s = {1, 2, 3, 4, 5}
s.add(6)
print(s)
```

1. `{1, 2, 3, 4, 5, 6}`
1. `{6, 1, 2, 3, 4, 5}`
1. `{1, 2, 3, 4, 5}`
1. `Error`

<details> <summary>解説</summary>

正解：1. `{1, 2, 3, 4, 5, 6}` add メソッドは集合に要素を追加します。

</details>

### 問題5 (ラムダ関数)
次のコードの出力は何ですか？

```python: Python
add = lambda x, y: x + y
print(add(3, 4))
```

1. `3`
1. `4`
1. `7`
1. `Error`

<details> <summary>解説</summary>

正解：3. `7` ラムダ関数は二つの引数の和を返します。

</details>

### 問題6 (リスト内包表記)
次のコードの出力は何ですか？

```python: Python
lst = [x * 2 for x in range(5)]
print(lst)
```

1. `[0, 2, 4, 6, 8]`
1. `[1, 2, 3, 4, 5]`
1. `[2, 4, 6, 8, 10]`
1. `[0, 1, 2, 3, 4]`

<details> <summary>解説</summary>

正解：1. `[0, 2, 4, 6, 8]` リスト内包表記で、各要素を2倍にしたリストを作成します。

</details>

### 問題7 (演算子)
次のコードの出力は何ですか？

```python: Python
print(3 * 3 + 3)
```

1. `9`
1. `12`
1. `6`
1. `Error`

<details> <summary>解説</summary>

正解：2. `12` 演算子の優先順位により、掛け算が先に計算されます。

</details>

### 問題8 (論理演算)
次のコードの出力は何ですか？

```python: Python
a = True
b = False
print(a and b)
```

1. `True`
1. `False`
1. `None`
1. `Error`

<details> <summary>解説</summary>

正解：2. `False` and 演算子は両方の条件が真である場合にのみ真を返します。

</details>

### 問題9 (モジュール)
次のコードの出力は何ですか？

```python: Python
import random
print(random.randint(1, 10))
```

1. `1`
1. `10`
1. `1から10の間のランダムな整数`
1. `Error`

<details> <summary>解説</summary>

正解：3. `1から10の間のランダムな整数` randint 関数は指定された範囲内のランダムな整数を返します。

</details>

### 問題10 (リストのスライス)
次のコードの出力は何ですか？

```python: Python
lst = [10, 20, 30, 40, 50]
print(lst[1:3])
```

1. `[10, 20]`
1. `[20, 30]`
1. `[30, 40]`
1. `[40, 50]`

<details> <summary>解説</summary>

正解：2. `[20, 30]` スライス lst[1:3] はインデックス1から2までの要素を含みます。

</details>

---

### 補足

**appendメソッド**
  - リスト専用: リストの末尾に要素を1つ追加します。
  - 要素の種類: どんな型の要素でも追加できます（数値、文字列、他のリストなど）。
  - リスト内の要素として追加: 追加された要素は、リスト内の1つの要素として扱われます。


**addメソッド**
  - セット専用: セットに要素を1つ追加します。
  - 重複排除: セットは重複した要素を持たないため、すでに存在する要素を追加しても無視されます。
  - 順序は保証されない: セットは順序を保持しないため、要素の追加順序は保証されません。
【Laravel】初学者向け－Laravel9の環境設定

今回は、windowsでLaravel9の環境設定を行いたいと思います。

:::note info
事前に下記の設定を完了してから、こちらを進めることをおすすめいたします。
:::

https://qiita.com/ai-aiaika/items/c934afdb86e234f42b15

# Laravel9をインストール方法

以下、手順でLaravel9をインストールします。

・「Windows」を押下し、「コマンドプロンプト」を開く

・フォルダに移動
※php_testとcomposertestは自分でフォルダを作成しているため、
C:\xampp\htdocs…のパスにインストールすればOK。
※インストールに少し時間がかかります（5分ぐらい？）※
```
cd C:\xampp\htdocs\php_test\composertest
```
・ Laravel9をインストール「コマンドプロンプト」に下記コマンドをたたく
```
composer create-project "laravel/laravel=9.*" task_test --prefer-dist
```
■意味
**"laravel/laravel=9.*"**
→Laravel9系を指定
**task_test**
→フォルダ名を指定
**--prefer-dist**
→オプションで圧縮版をインストール

・「コマンドプロンプト」で下記に移動
※C:\xampp\htdocs\php_test\composertestのフォルダを確認すると、「task_test」がインストールされていたらOK！
```
cd C:\xampp\htdocs\php_test\composertest\task_test
```


# VSコードでもインストールされているか確認


・VSコードを開き、左上にある「ファイル」→「フォルダーを開く」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929458/289a9826-d959-97e0-f42f-3804642cc511.png)

・「task_test」を選択し、「フォルダーの選択」を押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929458/121658c0-1267-5e7f-cda3-f001d787b63e.png)

・下記で確認できたらOK！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929458/3587f3d3-5431-2452-7a89-bce3e04bcf40.png)

# Laravelのホームページ確認



・コマンドプロンプトに戻り、開発サーバーが立ち上がっているか確認
```
php artisan serve 
```

```結果
INFO Server running on [http://127.0.0.1:8000].
Press Ctrl＋C to stop the server
```
・chromeにて「http://127.0.0.1:8000」にアクセスし、Laravelのページが開けばOK！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929458/a30b8956-2814-d079-5c46-bec39b8478ab.png)
Python3エンジニア認定基礎試験向けかもしれない問題集

AIを使って問題を作成しています。


### Prompt:
`Python3エンジニア認定基礎試験に出てきそうな問題を作ってください。`


### 問題1 (データ型)
以下のコードの出力は何ですか？

```python: Python
print(type(123))
```

1. `<class 'int'>`
1. `<class 'str'>`
1. `<class 'float'>`
1. `<class 'bool'>`

<details> <summary>解説</summary>

正解：1. `<class 'int'>` 整数 123 の型は int です。

</details>

### 問題2 (制御構文)
次のコードの出力は何ですか？

```python: Python
for i in range(3):
    print(i)
```

1. `0 1 2`
1. `1 2 3`
1. `0 1 2 3`
1. `0 2 4`

<details> <summary>解説</summary>

正解：1. `0 1 2` range(3) は 0, 1, 2 を生成します。

</details>

### 問題3 (関数)
次のコードの出力は何ですか？

```python: Python
def add(a, b):
    return a + b

print(add(2, 3))
```

1. `2`
1. `3`
1. `5`
1. `6`

<details> <summary>解説</summary>

正解：3. `5` 関数 add は二つの引数の和を返します。

</details>

### 問題4 (リスト)
次のコードの出力は何ですか？

```python: Python
lst = [1, 2, 3, 4, 5]
print(lst[2])
```

1. `1`
1. `2`
1. `3`
1. `4`

<details> <summary>解説</summary>

正解：3. `3` リストのインデックスは0から始まるため、lst[2] は 3 になります。

</details>

### 問題5 (辞書)
次のコードの出力は何ですか？

```python: Python
d = {'one': 1, 'two': 2, 'three': 3}
print(d['two'])
```

1. `1`
1. `2`
1. `3`
1. `4`

<details> <summary>解説</summary>

正解：2. `2` 辞書 d のキー 'two' に対応する値は 2 です。

</details>

### 問題6 (タプル)
次のコードの出力は何ですか？

```python: Python
t = (1, 2, 3)
print(t[1])
```

1. `1`
1. `2`
1. `3`
1. `4`

<details> <summary>解説</summary>

正解：2. `2` タプルのインデックスは0から始まるため、t[1] は 2 になります。

</details>

### 問題7 (文字列操作)
次のコードの出力は何ですか？

```python: Python
s = "hello"
print(s.upper())
```

1. `HELLO`
1. `Hello`
1. `hello`
1. `hELLO`

<details> <summary>解説</summary>

正解：1. `HELLO` upper() メソッドは文字列を全て大文字に変換します。

</details>

### 問題8 (例外処理)
次のコードを実行した場合、どの例外が発生しますか？

```python: Python
try:
    1 / 0
except Exception as e:
    print(type(e))
```

1. `<class 'ValueError'>`
1. `<class 'IndexError'>`
1. `<class 'ZeroDivisionError'>`
1. `<class 'KeyError'>`

<details> <summary>解説</summary>

正解：3. `<class 'ZeroDivisionError'>` ゼロで割ると ZeroDivisionError が発生します。

</details>

### 問題9 (クラス)
次のコードの出力は何ですか？

```python: Python
class MyClass:
    def __init__(self, value):
        self.value = value

    def get_value(self):
        return self.value

obj = MyClass(10)
print(obj.get_value())
```

1. `None`
1. `10`
1. `0`
1. `Error`

<details> <summary>解説</summary>

正解：2. `10` get_value メソッドはオブジェクト obj の value 属性の値を返します。

</details>

### 問題10 (モジュール)
次のコードの出力は何ですか？

```python: Python
import math
print(math.sqrt(16))
```

1. `3`
1. `4`
1. `5`
1. `6`

<details> <summary>解説</summary>

正解：2. `4` math.sqrt(16) は16の平方根を返します。

</details>
midPointとは（2024年12月版）

# midPointとは

[midPoint](https://evolveum.com/midpoint/)は、オープンソースのアイデンティティ・ガバナンスおよび管理（IGA：Identity Governance and Administration）ソフトウェアです。特に企業や組織が直面する、複雑なIDライフサイクル管理の課題を解決することを目的としています。

実は [2019年のAdvent Calendar](https://qiita.com/advent-calendar/2019/midpoint-by-openstandia) で一度、25日間まるごとmidPointの紹介記事を書いています。その時は、国内ではそもそもIGAそのものの認知度がまだまだ低い状態でした。その後、コロナ禍の影響もあり、ゼロトラストセキュリティの考え方が急速に普及しだし、1丁目1番地であるID管理基盤、そしてIGAが注目集め、国内でも徐々に普及してきた感触があります。

一方、midPointはこの数年間でどうなったかというと、2019年は「4.0」が最新かつLTS（Long-Term Support）バージョンでした。そして2024年12月現在では、**LTSバージョンの「4.8」と最新の機能リリースである「4.9」が登場**しており、着実に進化を続けています。

この5年間での進化を振り返りつつ、最新の機能やノウハウを共有するため、再びmidPoint Advent Calendarを始めることにしました！

# IGAについて

IGAそのものについては、定義が変わったとかそういうことは特にありませんので、前回の記事を参考にしていただければと思います。この時は、IGAの定義やコンセプトが国内で全然広まっていない状況でしたので、こちらで丁寧に解説しています。

https://qiita.com/naokiiiii/items/0535139fb45e50cb1180


# midPointを学ぶにあたって

2019年と違い、midPointを学ぶコンテンツが大分拡充されたかなと感じています。ドキュメントもそうですが、近年はYouTubeで公開されている動画コンテンツもたくさんあります！2024年12月時点で、なんと80本の動画がアップロードされています。

https://www.youtube.com/c/Evolveum

ドキュメントではちょうど先月、**The Book**が更新されて「2.3」が公開されました。

https://docs.evolveum.com/book/

2.3では、最新のLTSバージョンであるmidPoint 4.8に対応した内容となりました。また、このThe Bookの内容に沿ったチュートリアル動画もYouTubeで公開されています。動画ですと実際の画面の動きを見ることができますので、理解しやすいかと思います。


※The Bookについては、2020年に以下の紹介記事を書いています。The Bookを初めて読む方は、こちらの解説記事を見ると全体感が分かり良いかなと思います。

https://qiita.com/daian183/items/1129980c9456f86ad1b9


その他、おすすめなのが **MidPoint Deployment Methodology** という比較的新しいコンテンツです。

https://docs.evolveum.com/midpoint/methodology/

中でも、**Methodology: First Steps With MidPoint** はこれからmidPointの導入を検討したい方にはぴったりかと思います。「Methodology」と書いてあるように、このコンテンツでは、企業・組織内に既にITシステムがいくつかある中で、どのようにmidPointを導入して最適化するとよいかその方法論を、Evolveum社が考えるベストプラクティスをもとに解説されています。こちらもYouTube動画が付属するコンテンツになっていますので、参照されるとよいでしょう。

https://docs.evolveum.com/midpoint/methodology/first-steps/


:::note info
他にも、一般公開はされていませんが、Evolveum社によるトレーニング用のコンテンツもあります。トレーニングメニューの中には自習型のものがあり、サブスクリプション契約を行うと利用することができます。
:::




# 2024年のmidPoint Advent Calendar

2019年のAdvent Calendar以来、midPointは着実に進化し、新機能や改善が多数追加されています。学ぶためのコンテンツもかなり増えてきています。しかしながら、それらはすべて英語ですので、やはり日本国内では中々とっつきにくい面があるかなと思います。というわけで2024年のAdvent Calendarでは、それらのコンテンツを補完できるようにとチュートリアル的なものをお伝えしたいと考えています。

それでは25日間、どうぞよろしくお願いいたします！
Kotlinとserializationの互換性エラー――バージョンを下げても解消しない原因を探る

この記事は[and factory.inc Advent Calendar 2024](https://qiita.com/advent-calendar/2024/andfactory) 11日目の記事です。

導入
---
個人開発でKotlinと[kotlinx.serialization](https://github.com/Kotlin/kotlinx.serialization)のバージョン互換性エラーに悩まされ、互換性のあるバージョンに下げても同じエラーで解消しない状況に直面。原因を探して試行錯誤した結果、ようやく解決に至った過程をご共有します。同じエラーに直面している方のお役に立つことができれば幸いです。

原因・解決方法
---
1. 他のライブラリやフレームワークで[kotlinx.serialization](https://github.com/Kotlin/kotlinx.serialization)が使用されていないか確認
2. 使用されている場合、[kotlinx.serialization](https://github.com/Kotlin/kotlinx.serialization)のバージョンが合うようにそのライブラリやフレームワークのバージョンを調節する

今回はKtorが原因でした。

経緯
--
個人開発中に以下のようなエラーが発生しました。
```
e: Your current Kotlin version is 1.9.25, while kotlinx.serialization core runtime 1.7.3 requires at least Kotlin 2.0.0-RC1. Please update your Kotlin compiler and IDE plugin.
```

内容(直訳)としては

:::note alert
現在のKotlinのバージョンは1.9.25ですが、kotlinx.serialization core runtime 1.7.3には少なくともKotlin 2.0.0-RC1が必要です。KotlinコンパイラとIDEプラグインを更新してください。
:::
[kotlinx.serializationのリリースノート](https://github.com/Kotlin/kotlinx.serialization/releases/tag/v1.7.3)から確認すると1.7.3は通常Kotlin2.0.20を使用するようになっているそう。

私は ~~Kotlinのバージョンを上げる対応が少し面倒だったので~~ このkotlinx.serializationのバージョンを1.7.3 -> 1.6.3と互換性のあるバージョンに下げました。

しかし同様のエラーが発生。バージョンを下げたにも関わらずエラー文では1.7.3が使えないとの文言がでました。


解決方法
--
どうやら使用するものによっては他の依存関係が利用されていることがあるそう。
なので今回の使用しているものの依存関係を調べるとKtorのバージョン3.0.1でkotlinx.serializationが使われていることがわかりました。

```toml : gradle/libs.versions.toml
[versions]

kotlin = "2.0.21"
kotlinx-html = "0.11.0"
kotlinx-datetime = "0.6.1"
kotlinx-io = "0.5.4"
coroutines = "1.9.0"
atomicfu = "0.26.0"
serialization = "1.7.3"  // 1.7.3が使用されている
binaryCompatibilityValidator = "0.16.3"
dokka = "1.9.20"
kover = "0.8.3"
ktlint = "3.15.0"
#他色々

[libraries]

kotlin-gradlePlugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" }
# ~~~
kotlinx-serialization-core = { module = "org.jetbrains.kotlinx:kotlinx-serialization-core", version.ref = "serialization" }
kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "serialization" }
kotlinx-serialization-json-io = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json-io", version.ref = "serialization" }
kotlinx-serialization-cbor = { module = "org.jetbrains.kotlinx:kotlinx-serialization-cbor", version.ref = "serialization" }
kotlinx-serialization-protobuf = { module = "org.jetbrains.kotlinx:kotlinx-serialization-protobuf", version.ref = "serialization" }

```
なのでこちらを最新バージョンの3.0.1 -> 2.3.13に下げると無事ビルドも通り想定通りの結果を得られました！

まとめ
--
今回はKotlinとkotlinx.serializationの互換性エラーについて書かせていただきました。
依存関係についてはまだよくわかっていないのですが、今回の経験からエラー分に出ているライブラリなどを鵜呑みにしてそこばかり調整するのではなく他の依存関係も調査する必要がわかりました。

### 追記
Kotlinのバージョンを上げてもビルドが通ったのでこの個人開発はKotlinのバージョンをあげようと思います
[Rust]RustのインストールからHelloWorldまで

この記事は[一歩ずつRustに慣れていくTypeScriptエンジニアの記録 Advent Calendar 2024](https://qiita.com/advent-calendar/2024/rust-from-ts)の1日目の記事になります。

https://qiita.com/advent-calendar/2024/rust-from-ts

また、筆者が属している株式会社野村総合研究所のアドベントカレンダーもあるので、ぜひ購読ください。

https://qiita.com/advent-calendar/2024/nri-openstandia

# このアドベントカレンダーについて

初回なので、アドベントカレンダーの目的を書いておきます。
筆者はTypeScript歴とVue歴がそれぞれ５年程度のエンジニアで、業務では主にフロントエンド領域を担当しています。
昨今のフロントエンド領域では、従来のTypeScriptに加えRustの存在感が増してきています。高速な開発ツールは大体Rust製ですし、WASMという技術を使ってアプリケーションの動作そのものも担うケースも出てきました。

筆者はその流れに触発されて最近Rustを勉強しています。このアドベントカレンダーは、TypeScriptチョットデキルな筆者がRustの主な機能や仕様をちょっとずつ勉強するシリーズになっています。
TypeScriptとの対比を示していければいいなぁと考えています。

:::warn
筆者はRust初学者なので、もし不正確であったり誤っていたりした場合はコメントでご指摘いただけると幸いです。
:::

# Rustをインストールする

今回はRustを開発端末にインストールすることがゴールです。
公式サイトに従うのが一番なので、まずはそれを見てみましょう。

https://doc.rust-jp.rs/book-ja/ch01-01-installation.html

このページにアクセスすると、あなたが使っているOSに応じたインストール方法が提示されています。

MacOSやLinuxであればコマンドが、Windowsであれば実行ファイルへのリンクが貼られています。

Rustのコンパイルにはリンカが必要で、別途インストールする必要があります。MacOSであればXCodeが、WindowsであればVisual Studioが提供するものが一般的でしょうか。（このあたりは公式サイトや検索結果上位を見て進めていただくのが確実です）

# `PATH`を設定する

インストールに成功すると、`~/.cargo/bin`にもろもろのツールチェーンが置かれます。
今後、Rustで開発をするうえで使うコマンドの実体はこのディレクトリ配下にあるため、`PATH`環境変数にこのパスを追加しておきましょう。

Rustのインストールの過程で自動的に追加されるようですが、反映には再起動が必要であり、何かしらの不具合でそもそも追加されないケースが考えられるため、自身の手で追加するとよいでしょう。

# Rustファイルをコンパイルして実行してみる

早速Rustのファイルを書いて実行してみましょう。
Rustのソースコードを実行するには、コンパイルして実行可能ファイルを生成する必要があります。コンパイルには`rustc`コマンドを使用します。

まずはソースコードを用意しましょう。適当なディレクトリで以下のようなファイルを作成します。

```rust:helloworld.rs
fn main() {
    println!("Hello, world!");
}
```

次に、このファイルがあるディレクトリで以下のコマンドを実行します。

```bash
rustc helloworld.rs
```

実行すると、同じディレクトリに新しく`helloworld`というファイルが生成されます。

```
root@k4nd4windows:/work/rust/sample# ll
total 3952
drwxr-xr-x 2 root root    4096 Nov  8 20:18 ./
drwxr-xr-x 4 root root    4096 Nov  8 20:17 ../
-rwxr-xr-x 1 root root 4026664 Nov  8 20:18 helloworld*
-rw-r--r-- 1 root root      80 Nov  8 20:18 helloworld.rs
```

このファイルを実行するとターミナルに`Hello, world!`が表示されます（つまり、ソースコードで書いた処理が実行されたということです！）。

このように、Rustで書いたプログラムを実行するには、コンパイルをして実行可能ファイルを生成する必要があります。
一般的に、Rustアプリケーションを開発する際は直に`rustc`コマンドを実行するより、次回に紹介するCargoというツールチェーンを利用します。

これでひとまずRustのソースコードを書き、それを実行する環境は整いました。次回にCargoを使ったビルドや実行方法を確認し、その後様々な記法を取り上げていきます。

ちなみにですが、筆者はIDEとしてRustRoverを使用しています。もともとWebstormユーザなので、その流れでJetBrainsのRust向けIDEを選びました。非商用利用であれば無料なので、ぜひ使ってみてください。

https://www.jetbrains.com/ja-jp/rust/
【備忘録】SESのメール送信リクエストはCloudtrailに残らない ～AWS100本ノック～ 16/100

# 備忘録メモ

- AWSでAPIリクエストをすると、誰がどんな操作をしたかはCloudtrailの証跡に記録される
- しかし、一部のAPIリクエストはログに残らない仕様である
- SESでメールテンプレートを使って一斉送信を行った際に一部のリクエストが成功しなかったため、リクエストの記録を見ようと思ったが確認できなかった。以下[AWS公式の説明](https://docs.aws.amazon.com/ses/latest/dg/logging-using-cloudtrail.html)

```
Note
Amazon SES delivers management events to CloudTrail. Management events include actions that are related to creating and managing resources within your AWS account. In Amazon SES, management events include actions such as creating and deleting identities or receipt rules.

Management events are different from data events. Data events are events that are related to accessing and interacting with data within your AWS account. In Amazon SES, data events include actions such as sending emails.

Because Amazon SES only delivers management events to CloudTrail, the following events aren't recorded in CloudTrail:

SendEmail
SendRawEmail
SendTemplatedEmail
SendBulkTemplatedEmail

You can use event publishing to record events related to email sending. For more information, see Monitor email sending using Amazon SES event publishing.

メモ
Amazon SESはCloudTrailに管理イベントを配信します。管理イベントには、AWSアカウント内のリソースの作成と管理に関連するアクションが含まれます。Amazon SESでは、管理イベントにはIDや受信ルールの作成・削除などのアクションが含まれます。

管理イベントはデータイベントとは異なります。データイベントは、AWSアカウント内のデータへのアクセスと相互作用に関連するイベントです。Amazon SESでは、データイベントにはメールの送信などのアクションが含まれます。

Amazon SESは管理イベントのみをCloudTrailに配信するため、以下のイベントはCloudTrailに記録されません：

SendEmail
SendRawEmail
SendTemplatedEmail
SendBulkTemplatedEmail

イベントパブリッシングを使用すると、メール送信に関連するイベントを記録できます。詳細については、Amazon SESイベントパブリッシングを使用したメール送信の監視を参照してください。
```

- つまり、メール送信リクエストを行うアプリケーションでレスポンスなどからハンドリングし、必要に応じてログに出力する
- でないと、送信できなかった場合にエラー原因（スロットリングエラーなど）を確認できない
※CloudWatchメトリクスでも見れない
node.js,nvm,npm 覚書

**node.js**,**nvm(NodeVersionManager)**,**npm(NodePackageManager)**...

## そもそもnode.jsとは？
- 一言で言うと**JavaScriptをサーバーサイドで実行できるようにするための環境**
- サーバーサイド、クライアントサイドどちらもJavaScriptで書ける
- ファイル操作、ネットワーク通信、データベースアクセスなど、サーバーサイドのタスクをJavaScriptで記述できる
- 非同期処理（Asynchronous Programming）が得意
:::note warn
**Q：サーバーサイドで実行できて何がいいの？**
:::

:::note info
**・安全**
機密情報（APIキー、ユーザーのパスワードなど）や重要なロジックをサーバーに隠すことで、クライアント側に露出せず、安全性が高まる。

**・軽い**
サーバーが重い計算やデータ処理を代行することで、クライアント（ブラウザやアプリ）の負荷を減らし、動作を軽くできる

**・便利**
サーバーサイドでは、バックグラウンドで複雑なロジックや連携を実行できる。これにより、クライアント側では実現できない高度な機能を提供できる
:::


## nvmとは？
Node.jsの複数のバージョンを簡単にインストールしたり切り替えたりできる便利なツール
**NVMを使う理由：**
- プロジェクトごとに異なるNode.jsのバージョンを使いたい
  - 例えば、プロジェクトAではNode.js 14を使い、プロジェクトBではNode.js 18を使う場合。
- 新しいバージョンを試したい
  - Node.jsの最新バージョンを試してみたいが、現在のプロジェクトに影響を与えたくない場合。
- 古いプロジェクトを保守する
  - 以前のNode.jsのバージョンで動くプロジェクトを維持する必要がある場合。

## npmとは？
Node.jsのパッケージ管理ツール
**NPMを使う理由：**
- **パッケージの簡単なインストール**
  - 外部のライブラリ（パッケージ）をコマンド一つでインストールできます
    ```
    npm install パッケージ名
    ```
  :::note info
    「パッケージ」というのはライブラリやフレームワークのこと
    つまりVueやReact, webpack, jQueryなどのこと
  :::
<br>

- **依存関係の自動アップデート**
  - パッケージがさらに別のパッケージ（依存関係）に依存している場合、それも自動的にインストールしてくれる

- **プロジェクト環境の再現性**
    - `package.json` と `package-lock.json` というファイルで、使用したいプロジェクトが必要とするパッケージとそのバージョンを正確に記録しているため、他の開発者やサーバー環境で、まったく同じ状態のパッケージセットを再現可能


npm以外パッケージ管理ツール：
**Yarn**: npmと似た機能を持ち、高速な依存関係管理が特徴。
**pnpm**: ディスクスペースの節約を重視した軽量なパッケージ管理ツール。
**Composer**: PHPのパッケージ管理ツール（Node.js以外の言語向け）。
リモートでPCを起動しよう！Wake-on-LAN（WOL）の完全ガイド

## はじめに
Wake-on-LAN (WOL) は、ネットワークを通じてリモートコンピュータを起動できる便利な技術です。このガイドでは、WOLを使用してマシンを起動する方法を説明します。

## 必要なもの
1. Wake-on-LANをサポートするデバイス（PCやサーバー）
2. Wake-on-LANを送信するためのクライアント（別のPCやスマートフォン）
3. 同じローカルネットワーク内にいる、またはリモートアクセスの設定があること

## 1. Wake-on-LANを有効にする

Wake-on-LANはBIOSまたはUEFIで有効にする必要があります。

### BIOS/UEFIでの設定例

1. PCを再起動し、BIOS/UEFIにアクセスする。
2. 「Power Management」または「Advanced」セクションを探す。
3. 「Wake-on-LAN」または「Power On by PCI-E」を有効にする。
4. 設定を保存して再起動する。


### OS設定（例: Windowsの場合）

1. デバイスマネージャーを開く。
2. ネットワークアダプターを右クリックして「プロパティ」を選択。
3. 「電源管理」タブで「このデバイスで、コンピューターのスタンバイ状態を解除できるようにする」をチェック。
4. 「詳細設定」タブで「Wake on Magic Packet」を有効にする。

## 2. クライアントツールの準備

WOLを送信するためのツールをインストールします。

### Linuxの場合
```
sudo apt update
sudo apt install wakeonlan
```

### Windowsの場合

WOLツールをダウンロードしてインストールします。例: [Depicus WOL](https://www.depicus.com/wake-on-lan/)


### スマートフォンの場合

Google PlayやApp Storeで「Wake on LAN」アプリを検索してインストールします。


## 3. WOLを使用してPCを起動する

### 必要な情報

- ターゲットPCのMACアドレス
- ブロードキャストアドレス（例: 192.168.1.255）


### Linuxでの使用例
```
wakeonlan 00:11:22:33:44:55
```

### Windowsでの使用例

Depicus WOL GUIツールを使い、MACアドレスとブロードキャストアドレスを入力して「Send」をクリック。

### スマートフォンでの使用例

アプリにターゲットPCの情報を登録し、「Wake」ボタンを押します。

## 注意点

- WOLはスタンバイモードまたはシャットダウン後でも電源供給が必要です。
- ネットワーク設定によってはルーターやスイッチで追加設定が必要になる場合があります。



以上で、Wake-on-LANの基本的な使い方は完了です。これでリモートからPCを起動できるようになります！
指定した列の最終行を取得したい

VBAでは、以下のステップで指定した列の最終行を取得することができます。

1. 指定した列の一番下のセルから`Ctrl+↑`をする
2. そのセルがブランクの場合は、そのセルが最終行。ブランクではない場合は、その次の行が最終行。

これを実装したものが以下になります。

```
Function GetLastRowNumber(sheet As Worksheet, col As String) As Long
    Dim lastCell As Range
    Set lastCell = sheet.Range(col & sheet.Rows.Count).Cells.End(xlUp)
    If lastCell = "" Then
        GetLastRowNumber = lastCell.Row
    Else
        GetLastRowNumber = lastCell.Row + 1
    End If
End Function
```

例: 以下のようなシートがあるとします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/e8c6efe8-f7ef-4609-8302-ccd87e518143.png)

A列・B列・C列の最終行、すなわち1行目・2行目・4行目を`GetLastRowNumber`を使って取得します。

```
Dim sheet As Worksheet
Set sheet = ...

Debug.Print GetLastRowNumber(sheet, "A") '=> 1
Debug.Print GetLastRowNumber(sheet, "B") '=> 2
Debug.Print GetLastRowNumber(sheet, "C") '=> 4
```

**環境情報**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/3d466b39-35a8-2d42-1b68-1fe20105bbc8.png)