OmniAICreator/Qiita-1.07M huggingface dataset:
マナビDXクエスト2024参加の記録 (新品3万円以下のノートPCでAI開発に挑戦)

# はじめに

この記事は[マナビDX Questで得たもの Advent Calendar 2024](https://qiita.com/advent-calendar/2024/manabi-dx-quest2024)の7日目の記事です。

今回がQiitaで初投稿となります。よろしくお願いします。

# 自己紹介

メーカでデータの活用を推進する業務をしています。
以前は組み込みソフトウェアの業務をしていましたが、思うところがあり社内公募制度を使って異動しました。
今年の2月に異動してから、機械学習、Pythonなどの勉強を本格的に始めました。
去年のマナビDXクエスト参加者に紹介していただき、今年はじめての参加になります。

# 記事の概要

**プログラミング/AI開発に興味があるが、お金がない場合**
**マナビDXクエスト（SIGNATE）を受講するのがピッタリだよ**

* SIGNATE Cloudでブラウザだけで色々な教材で学べるよ
* マナビDXクエストの本編のAI開発課題、プレゼン資料作成もブラウザだけでできるよ
    * クラウド開発環境を使えば、AI開発も大丈夫！
        * Google Colaboratory
        * GitHub Codespaces
    * プレゼン資料作成もGoogle スライドあれば十分だよ
        * 有志の方/CMさんが提供してくれた.pptxからGoogle スライドへの変換処理でレイアウト崩れて時々残念な気持ちになることがあるよ

上記の概要以上の情報はこの記事にないです。
以下、お暇な人だけお読みください。

- - -

# 本編

## 参加の動機

SIGNATE Cloudの教材がタダで使えることに惹かれて

**えー、月額 （ピー）万円の教材がタダで使えるなんてマジ！？**　とホイホイつられてしまいました
https://resource-cloud.jp/product/detail/193

## 使用したPC

Lenovo Chromebook クロームブック IdeaPad Flex 3i Gen8 12.2インチ インテル® プロセッサー N100搭載 メモリ4GB eMMC 64GB バッテリー駆動12.0時間 重量1.25kg アビスブルー

Amazonのセールで ¥29,800- で購入

## 申し込み〜アセスメント試験

申し込むと、データを扱う基礎的なスキルがあるかアセスメントの試験を受けないといけないです。

表計算ソフトを使って対応できるレベルのデータ量で
集計、結合、重複削除、ソート等ができるかを試験で確認されます。

試験用のデータをダウンロードしてから、Googleスプレッドシートで開くためにまたアップロードと
無駄に時間がかかってイライラしましたが、それなりの点数取れました。
一日一回を上限に、期間中は何度も受けられるので、自分の納得の行く点数まで繰り返し受験しました。

この試験時に初めてGoogleスプレッドシートを本格的に使ったが、
ちょっと見た目はちがいますが、Excelとほとんど同じようにつかえました。

## 初日〜演習01〜演習02

### 初日（開会式）

用事があって、開会式は参加できず。なかなか動画が公開されなくてモヤモヤしました。

Web上のバーチャルオフィス MetaLifeに集まって受講者同士で交流。
初対面の人と話すのはむずかしいと感じた。

### 演習01 - 要求定義

演習01ではPBLの設定を読んで舞台となる企業が抱える問題を分析し、問題を解決するためのAIの要求定義を行うことが課題

いきなり演習課題と回答例が同時に公開されて戸惑った。
誘惑に負けて、回答例を読んでから自分の回答を作ってしまった。

かなり回答例に引きずられた回答を作ってしまって後悔した。

ツールに慣れるため、課題の提出PDFはGoogle スライドで作成して提出。
といっても単純な表を描くだけなので、あまりGoogle スライドの経験値にならず。

### 演習02 - PoC計画

演習01で分析し要求定義した内容を元に、PoC（Proof of Concept：概念実証）の計画を立てるのが演習02の課題

演習01の失敗を反省し、回答例を見ないで作成して提出。
期限まで何度でも提出できるので、一度提出したあとに、回答例をみて手直しして出した。
これも単純な表を描くだけなので、Google スライドの経験値にならなかった。

## 演習03

演習03はモデル開発（PoC）

自分で演習01/02の検討した結果ではなく、運営が作成したPoC計画に従ってPoCのモデル開発を実施
演習03はコンペ形式で、お題に沿ったAIを作成し性能を競い合います。

自分はGoogle Colabの無料枠でGPUを使って画像分類のAIを作成しました。

いろいろネットで調べて工夫しようと思ったが、コミニティマスターさん（メンター役の方）から提供されたサンプルコードからほとんど改善できず。。。。

SIGNATE Cloudの教材（Questとチャレンジミッション）の方ばかりに夢中になって、演習03にあまり時間を割かなかったのと、
勉強会に参加して聞いていただけなのに、やった気になってしまって全然手を動かす時間が足りてなかったと後悔しています。

Google Colabを初めて使ったのですが、ブラウザが快適に動けば不自由なく開発はできました。
演習03当時はGitHubアカウントとの連携をさせておらず、Google Colabの版管理機能を使っていました。これは失敗だったと思っています。
さっさとGitHubアカウントと連携させ、Gistで管理しておけばよかったと後悔しています。

## 演習04,05

演習04はPoCの結果を元に本番実装。運用計画・展開を考える課題

演習05はこれまでの演習の成果を使って経営者向けに本番実装の承認を得るためのプレゼンをするためのプレゼン資料を作成します。
作成した資料は、受講者で相互にレビューすることで採点され順位がつけられます。

Goolge スライドで対応したのですが、そもそもPowerPointにも使い慣れているわけではないので苦労しました。
有志の方/CMさんが提供してくれた.pptxからGoogle スライドへの変換処理でレイアウトが崩れて残念な気持ちになることがありました。

## 演習06

演習06は　ここれまでの演習で行ってきた主要課題の解決に向けた具体的な打ち手の推進以外の要素にも視野を広げて
前者のDXについてどう取り組むかを考える課題です。

受講者で課題の成果を持ち寄ってオンラインで話し合った際、いろんな考えが聞けて面白かったです。

---

上記のような感じで、なんとか無事にゴールド終了できました。

長々と駄文を書き連ねてきましたが、感想なので本当にどうでもいいです。
とにかく伝えたいことは以下の二行です。

マナビDXクエストの課題に取り組むにあたって、PCはとりあえずGoogle ColabとGoogleスライドが使えるのであれば心配いりません。
どちらもGoogleアカウントがあれば無料で試せるので、確認してみはいかがでしょうか、

来年マナビDXクエストに参加しようと思っているが、PCのスペックが低くて心配という方の参考になれば幸いです。
【TypeScript】Pick<T, K>の自作（type-challenges 初級編 4・Pick）

## お題
型`T`から`K`に指定した`key`だけを含むオブジェクトの型を返すユーティリティ型`MyPick`を自作する。
## やりたいこと
```typescript
type User = {
  name: string;
  age: number;
  gender: string;
  createdAt: string;
};

type NameAge = MyPick<User, "name" | "age">

type NameAge = {
  name: string;
  age: number;
};
```
## 解答
```typescript
type MyPick<T, K extends keyof T> = {[key in K] : T[key]} 
```

## 解説
### 処理の流れ
- `<T, K extends keyof T>`
`K`が`keyof T`の部分型になるように制約する。
- `{[key in K] : T[key]}`
Mapped Typesを利用し、新しいオブジェクトを作成する。

### ユーティリティ型とは...
型から別の型を導き出してくれる型のこと。

### extendsとは...
- 型引数に制約をつける。
- ジェネリクス型を特定の型に限定することができる。
```typescript
<T extends string>   //  型引数Tはstirng型限定になる。
```

### keyof演算子とは...
- オブジェクトの型からプロパティ名を型として返す型演算子。
```typescript
type Person = {
  name: string;
};

type PersonKey = keyof Person   //  "name"
```
- 複数のプロパティを持つ場合は、全てのプロパティ名がユニオン型で返される。
```typescript
type Person = {
  name: string;
  age: number;
};

type PersonKey = keyof Person   //  "name" | "age"
```

### Mapped Typesとは…
- 型の各プロパティを順番に処理する。
- 主にユニオン型と組み合わせて使う（keyofと相性が良い）。
```typescript
// 基本の形

{Key in X} : Y
```

### インデックスアクセス型とは…
- プロパティの型や配列の要素を参照する。

**オブジェクトの型とインデックスアクセス型**
- オブジェクト型["プロパティ名"]でプロパティの型を取得できる。
```typescript
type Person = {
  name: string;
};

type PersonIndex = Person["name"]   //  string
```
- ユニオン型を使って参照することができる。
```typescript
type Person = {
  name: string;
  age: number;
};

type PersonIndex = Person["name" | "age"]   //  string | number
```

**配列型とインデックスアクセス型**
要素を順番に、ユニオン型で返す。
```typescript
const Array = ["Japan", "France", "Italy"] as const
type ArrayIndex = (typeof Array)[number] // "Japan" | "France" | "Italy"
```

## 参考記事
### ユーティリティ型
- [ユーティリティ型 | TypeScript入門『サバイバルTypeScript』](https://typescriptbook.jp/reference/type-reuse/utility-types)
### extends
- [型引数の制約 | TypeScript入門『サバイバルTypeScript』](https://typescriptbook.jp/reference/generics/type-parameter-constraint)
### keyof演算子
- [keyof型演算子 | TypeScript入門『サバイバルTypeScript』](https://typescriptbook.jp/reference/type-reuse/keyof-type-operator)
### Mapped Types
- [Mapped Types | TypeScript入門『サバイバルTypeScript』](https://typescriptbook.jp/reference/type-reuse/mapped-types)
### インデックスアクセス型
- [インデックスアクセス型 | TypeScript入門『サバイバルTypeScript』](https://typescriptbook.jp/reference/type-reuse/indexed-access-types)

## 今回の問題
https://github.com/type-challenges/type-challenges/blob/main/questions/00004-easy-pick/README.ja.md
Whataburger Menu With Prices

[Whataburger menu](https://whataburger-menu.info/) is a representation of fresh, bold tastes infused with Texan hospitality. It features several breakfast, lunch and dinner possibilities which has been the reason Why Whataburger is loved by family, friends and also people on solitary visits. There is a promise of a filling meal with every visit and because of this, it has always been a place for good food.
BigQueryのCTE(WITH句)をマテリアライズする方法



この記事はBigQuery Advent Calendar 2024 6日目の記事です。

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

こんにちは、吉岡です。
この記事ではBigQueryのCTE(WITH句)をマテリアライズ化する方法を紹介します。

## はじめに

BigQueryでは中間的なクエリ結果をCTEとして記述することができます。このCTEは通常マテリアライズ化されません。

> GoogleSQL only materializes the results of recursive CTEs, but doesn't materialize the results of non-recursive CTEs inside the WITH clause. If a non-recursive CTE is referenced in multiple places in a query, then the CTE is executed once for each reference. The WITH clause with non-recursive CTEs is useful primarily for readability.
( GoogleSQLは再帰CTEのみマテリアライズ化し、非再帰のCTEではWITH句をマテリアライズ化しません。非再帰CTEが複数の場所で参照されると、そのCTEは参照される度に毎回実行されます。非再帰CTEは可読性を向上させるためのものです。)
https://cloud.google.com/bigquery/docs/reference/standard-sql/query-syntax#with_clause

しかし、これでは複雑なCTEや大規模なデータを集約した場合などで、無駄に何度も同じクエリを実行されることになります。

テーブルを作り明示的にマテリアライズ化することもできますが保存先を決める必要があり、また一時テーブルを利用するとクエリキャッシュが利用できなくなります。

そこで、再帰CTEを利用してみます。上記引用文のように再帰CTEはマテリアライズ化されます。再帰CTEにするためには"WITH RECURSIVE"と記述する必要がありますが、それだけでは再帰CTEとして扱われません。実際に自分自身のテーブルを参照する必要があります。

それでは試してみましょう。

## 通常のCTE(非再帰)

まず、通常のCTEで、with句のテーブルを複数回参照するクエリを実行してみます。
違いがわかりやすいように乱数を返すCTEを使ってみます。

```sql
with 
  cte as (
    select rand() as value
  )
select * from cte
union all
select * from cte
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9152/42bd781c-bc1f-fe40-db9e-0ba9e4e3e0c2.png)

異なる乱数が表示され、CTEが2回実行されていることがわかります。

実行計画を見ても、rand()関数が二回呼び出されていることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9152/4ded515a-a95a-280b-d3d7-9e08c1ed8568.png)


## CTE(recursive指定)

次に"recursive"を指定してみましょう。

```sql
with recursive
  cte as (
    select rand() as value
  )
select * from cte
union all
select * from cte
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9152/85216053-87df-cb80-e504-9254c0a1ed55.png)

やはり違う乱数が出力されます。単に"with recursive"と書くだけでは再帰CTEとして扱われないようです。

## 再帰CTE(自己参照)

そこで、"union all"で自分自身を参照してみます。実際に行が増えないように条件"where false"を指定してみます。

```sql
with recursive
  cte as (
    select rand() as value
    union all
    select * from cte where false
  )
select * from cte
union all
select * from cte
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9152/3d62bcd8-57a5-d62f-e4cf-f850120f83d4.png)

同じ乱数が出力されました！ CTEがマテリアライズ化されているようです。

実行計画を見ても、計算を2回行うのではなく、計算結果が2回参照されているようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9152/dfb34c6e-ed65-23fe-2211-530de2157b51.png)


## 使い所

実際には、複数回CTEを実行した方が早いことも多いと思いますが、複雑なCTEや、大きいテーブルを集約した場合など、実行が速くなったりスロットが節約できることもあると思います。
【Swift】Task-isolated value of type '() async -> Void' passed as a strongly transferred parameter; later accesses could raceの原因と解決法

## 概要
`Task-isolated value of type '() async -> Void' passed as a strongly transferred parameter; later accesses could race` というエラーが発生して、その原因と解決策を調べたので備忘録として残しておきます。SwiftのConcurrency（非同期処理）に関連したエラーで、タスク分離やSendableプロトコルに関する理解を深めるための例として役立つと思います。

発生した時のコードを簡略化したのものが以下になります。
```Swift
final class ViewModel {
    func fetchData() async {
        print("Fetching data...")
    }

    func runTask() {
        Task {
            await fetchData()
        }
    }
}
```

## 原因
このエラーの原因を一言でいうと、「**`Sendable` じゃない関数が異なるTask間で渡されているから**」です。
### Sendableとは
`Sendable` は  **「値が複数のスレッドから安全にアクセスできること」** を保証するプロトコルです。もしSendableに準拠してない値や関数が別々のスレッドから参照されると、データ競合や安全性の欠如につながる可能性があります。そのため異なるTask間で値や関数を参照する際には、**Sendableに準拠していなければいけないというルールがあります。**

### エラーの詳細
上記のコードでは、runTaskでTaskを新しく作ってfetchDataを呼び出してますが、fetchDataはSendableではないのでこのエラーが発生していることになります。

1. runTaskメソッドで新しいTaskを作成
2. 新しいTask内で、fetchDataメソッドを呼び出す
3. fetchDataがSendableに準拠していないため、「タスク間での安全な転送が保証されない」としてエラーが発生する

簡単に図にするとのこんな感じです。

```mermaid
sequenceDiagram
    participant Task1
    participant Task2（runTaskで生成されたTask）

    Task1->>Task2（runTaskで生成されたTask）: runTask() を呼び出し
    Task2（runTaskで生成されたTask）->>Task1: fetchData() を参照
    Task1-->>Task2（runTaskで生成されたTask）: エラー: Task 境界を超えた安全性が保証されない参照
```



## 解決策
このエラーを解決するためのアプローチを3つ紹介します。それぞれの方法にはメリットがあり、実際の要件やコード状況に応じて選択してください。

### クラスにSendableを準拠させる
1つ目の解決策は、クラスに`Sendable`を準拠させるものです。
```Swift
final class ViewModel: Sendable {
    func fetchData() async {
        print("Fetching data...")
    }

    func runTask() {
        Task { [weak self] in
            guard let self = self else { return }
            await self.fetchData()
        }
    }
}
```
**ポイント**
- クラスがSendableに準拠させると、そのインスタンスのメソッドがスレッドセーフであることが保証されるのでエラーが解消される

### 新しいTaskを作らない
2つ目の解決策は、そもそも新しいTaskを生成しないことです。
```Swift
final class ViewModel {
    func fetchData() async {
        print("Fetching data...")
    }

    func runTask() async {
        await self.fetchData()
    }
}
```
**ポイント**
- runTask自体を非同期メソッドに変更
- 新しいTaskを生成しないため、タスク間での安全性の問題がそもそも発生しない
- シンプルな解決策

### 参照するメソッドをstaticにする
3つ目の解決策は、参照するメソッドをstaticにすることです。
```Swift
final class ViewModel {
    static func fetchData() async {
        print("Fetching data...")
    }

    func runTask() {
        Task {
            await ViewModel.fetchData()
        }
    }
}
```
**ポイント**
- staticメソッドはインスタンスの状態に依存しないため、スレッドセーフに扱える


## 参考にした記事
- https://qiita.com/satoru_pripara/items/df491bfd412f510927f8
【Unity】RequireComponentを使ってアタッチミスを防ぐ

# はじめに
この記事は[Hamster Output Advent Calendar 2024](https://qiita.com/advent-calendar/2024/game_hamster)の7日目の記事です！

最近、Vcontainerオンパレードの記事でしたが今回はRequireComponentの紹介です。
短くなっちゃうかも...

# 最近の悩み
チームでゲーム制作をしていると他の人が作ったスクリプトを稀に自分でアタッチすることもあります。この時に**どのスクリプトが必要なのか**悩んだことはありませんか。 
~~クラスを見れば直ぐに解決するのは事実...~~

その他にも単純にアタッチを忘れるとか...スクリプトが多すぎてアタッチするのが分からなくなるなどなど...。これらの悩みを解決してくれるのが、**RequireComponent**という機能です。

# RequireComponentって何ができるの？
MonoBehaviorがオブジェクトに、アタッチされた時に指定したコンポーネントを自動でアタッチしてくれる機能です。

また、指定したコンポーネントは**RequireComponent**を宣言したスクリプトが削除されない限り、コンポーネントを削除することができません。

# 実装方法
クラスの上にこのように追加するだけです。とても簡単！今回はRigidbodyを指定していますが、ここは自動アタッチされたいコンポーネントを指定しましょう。
```C#
[RequireComponent(typeof(Rigidbody))]
sealed internal class Test : MonoBehaviour
```
複数指定することも出来ます。
```C#
[RequireComponent(typeof(CapsuleCollider))]
[RequireComponent(typeof(Rigidbody))]
sealed internal class Test : MonoBehaviour
```

インスペクターにスクリプトをアタッチした瞬間に指定されたコンポーネントが追加されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588406/5b5add0f-98d7-f81f-e421-d7c17eec9d1d.png)

記事の本編の内容はこれで終わりです！え...本当に短く終わっちゃった。(それはそう)

# 雑メモ
ここから下は頭が溶け始めているので文章が滅茶苦茶になっています。本編の内容ではないので無視しちゃってください。

頭が溶けているのは、夜にフィットネスバイクを漕ぎながらAKIRAの動画を視聴して体力が壊滅的に持っていかれたからです。

### ・この記事ができた本当の理由
最近作っているゲームで、MVPパターンのクラス設計をベースにしたらクラスの数がありえんくらい増えて、アタッチ忘れが増えた。

### ・Arbor3のParameterContainerの値更新が上手く行かない

ArborEditorのParameterContainerならSet○○で値を変えれるのに、GameObjectにアタッチしたParameterContainerは同じ方法でも値が変わらない。なぜ...?

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588406/8cb6684c-1b47-479c-7d9a-80e209a63ed4.png)

### ・Arbor3情報少ないよ~~~~
リファレンスを見ても時々分からない内容が多い＋インスペクタの設定項目が多すぎて分からない物が多い。調べ方が悪い可能性もある。

### ・パソコンのファンの音がやばい
ブォォーン見たいな音だけならまだしも、若干パーツが空回り？している異音がする。**頼む、卒業するまで持ちこたえて！**

### ・おわり

アウトプット速度が追い付かなくなってきてる。本当にまずい。
PHPでの添字配列結合は破壊的操作が圧倒的に早い

添字配列(リスト型配列)の話です。
Packed arraysでしか確認してません。

`$all_names = [];` に `$names1 = [田中, 鈴木, 吉田, ...]`, `$names2 = [...]` のような配列を単純に追加し続けるコードを書いた時、何も考えずにarray_merge()を使って詰んだのでメモ。


### まとめ
* 添字配列(リスト型配列)同士の結合は非破壊的操作array_merge()より、破壊的操作array_push()のほうが遥かに早い
  * 実測でarray_mergeはO(n^3)、array_pushはO(n)
* 破壊的操作では `array_push($array, ...$items)`と`foreach ($items as $item) {$array[] = $item;}` どちらでも良い
* ユーザ入力を処理する箇所でarray_mergeを繰り返すコードがあるとDoS脆弱性になる可能性あり

当たり前だよなぁ

![gurafu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508490/5b1f4b98-d65e-5b65-497a-6221703d66da.png)
※100回繰り返しの平均、ただしarray_merge 100000回だけは重すぎて1回のみ

### 非破壊的操作(array_merge)と破壊的操作(array_push)の違い
* 非破壊的操作(array_merge): 結合後の配列を新たに作成する = 全体分のメモリを新規確保＆全数コピー(※)
* 破壊的操作(array_push): 今ある配列を拡張して、追加分だけコピー(※)

※値(文字列)そのものではなくポインタ(を持つzval)だけだと思うけど
　参考 分かりやすい絵 [PHP Extension 開発入門 10.1.文字列の内部構造](https://net-newbie.com/phpext/10-string.html#id2)

### セキュリティ面
もしユーザ入力の処理でarray_merge()を繰り返すコードがある場合、通常の入力であれば問題なく動いていても、悪意ある入力を与えることでDoSが可能になるかもしれず、注意を要する。
実測で処理時間は以下の通りで、配列の数が増えると急激に増加する。
 * array_merge(): O(n^3)
 * array_push(): O(n)

例えばMultiple selectやJSONなどから配列型のデータ入力を受け入れる処理に対し、巨大な配列を送りつけるなどが考えられる。


### 検証コード
以下コードでPHP 8.1で確認。
```
<?php
declare(strict_types=1);

$add_loop_num = (int)$argv[1]; #配列を足す回数
$total_try = 100; #試行回数(100回平均)
if (!$add_loop_num) {
    die;
}

$total_time = 0;
$memory_init = memory_get_usage();
for ($try = 1; $try <= $total_try; $try++) {
    $start = microtime(true);

    $all_names = [];
    for ($i = 1; $i <= $add_loop_num; $i++) {
        $names = get_names();

        $all_names = array_merge($all_names, $names); //← ここの処理差し替えで時間比較

        // array_push($all_names, ...$names);
        
        // foreach ($names as $name) {
        //     $all_names[] = $name;
        // }
    }

    $took = microtime(true) - $start;
    $total_time += $took;
}
$memory_used = memory_get_usage() - $memory_init;

echo "took: ", $total_time/$total_try * 1e3 , " ms\n"; //ms単位
echo "memory: ", $memory_used/1024/1024, " MB\n";

function get_names()
{
    return ['A', 'B', 'C', 'D', 'E'];
}

```
LeetCodeを1日1題解いてみる (day37)

37日目に取り組んだ問題はこちら！

# 183. Customers Who Never Order

https://leetcode.com/problems/customers-who-never-order/description/?lang=pythondata

## 問題文
Table: `Customers`
```
+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| id          | int     |
| name        | varchar |
+-------------+---------+
```
id is the primary key (column with unique values) for this table.
Each row of this table indicates the ID and name of a customer.
 

Table: `Orders`
```
+-------------+------+
| Column Name | Type |
+-------------+------+
| id          | int  |
| customerId  | int  |
+-------------+------+
```
id is the primary key (column with unique values) for this table.
customerId is a foreign key (reference columns) of the ID from the Customers table.
Each row of this table indicates the ID of an order and the ID of the customer who ordered it.
 
Write a solution to find all customers who never order anything.

Return the result table in any order.

## 僕の回答 (失敗作)
```py
import pandas as pd

def find_customers(customers: pd.DataFrame, orders: pd.DataFrame) -> pd.DataFrame:
    ordered_customer_ids = orders["customerId"].unique()
    not_order_customers = customers[person not in ordered_customer_ids for person in customers["id"]]
    return not_order_customers["name"].rename(columns={"name":"Customers"})
```

## 僕の回答 (修正版)
```py
import pandas as pd

def find_customers(customers: pd.DataFrame, orders: pd.DataFrame) -> pd.DataFrame:
    ordered_customer_ids = orders["customerId"].unique()
    not_order_customers = customers[[person not in ordered_customer_ids for person in customers["id"]]]
    if not_order_customers.empty:
        return pd.DataFrame({"Customers":[]})
    return not_order_customers[["name"]].rename(columns={"name":"Customers"})
```
リスト内包表記の記法だけGPTに質問をして修正しました。

## より効率の良い回答例

```py
import pandas as pd

def find_customers(customers: pd.DataFrame, orders: pd.DataFrame) -> pd.DataFrame: 
    result = customers[~customers['id'].isin(orders['customerId'])]
    return result[['name']].rename(columns={'name':'Customers'})
```

## 学んだこと
-  `~customers["id"].isin(ordered_customer_ids)`
`isin()` は、`customers["id"]` の各値が `orders['customerId']` に含まれているかどうかを判定するメソッド。
`~`（ビット演算子） を使うと、`True` と `False` を反転できる。
- `customers[...]` は、ブール値のリストや条件を渡すことで行をフィルタリングしている。よって、
```py
[person not in ordered_customer_ids for person in customers["id"]]
```
これで作成したブール値のリストを`customers[...]`に渡さなければならないので、以下のように`[]`が２つ必要となる。
```py
not_order_customers = customers[[person not in ordered_customer_ids for person in customers["id"]]]
```
- `not_order_customers[["name"]]`
`["name"]`だと１次元データの`Series`を返すため、`columns`属性がないのでエラーになってしまう。`[["name"]]`だと２次元データの`DataFrame`を返すためうまくいった。

## コメント
pandasだけでなく、リストなどのフィルターの仕組みについて知ることができてよかった。`isin()`などのメソッドは沢山触れて覚えていきたい。

## 次の問題はこちら!
https://qiita.com/h_y_s_d/items/11148d0807dbb2269f33
メソッド３種盛

### インスタンスメソッド:

クラスのインスタンスに関連付けられたメソッド。
<font color="red">**クラスで定義されてインスタンスで呼び出す。**</font>
例:
```
class MyClass:
    def instance_method(self):
        print("これはインスタンスメソッドです")


obj = MyClass()
obj.instance_method()  # インスタンスメソッドの呼び出し
```
### クラスメソッド:

クラス自体に関連付けられたメソッド。
インスタンスを生成せずに呼び出すことができる。
<font color="red">**クラスで定義してクラスで呼び出す。**</font>
<font color="orange">デコレータ`@classmethod`必須</font>
例:
```
class MyClass:
    @classmethod
    def class_method(cls):
        print("これはクラスメソッドです")

MyClass.class_method()  # クラスメソッドの呼び出し
```
### 静的メソッド:

クラスやインスタンスに依存しないメソッド。
デコレータ `@staticmethod`必須
例:
```
class MyClass:
    @staticmethod
    def static_method():
        print("これは静的メソッドです")

MyClass.static_method()  # 静的メソッドの呼び出し
```
Localでローカル環境構築講座

## 目次
1. [はじめに](#はじめに)  
2. [Localとは？](#localとは)  
3. [Localのインストール手順](#localのインストール手順)  
4. [ローカル環境のセットアップ](#ローカル環境のセットアップ)  
   - サイトの作成  
   - サーバー設定の確認  
5. [WordPressのダッシュボードを開く](#wordpressのダッシュボードを開く)  
6. [トラブルシューティング](#トラブルシューティング)  
7. [まとめ](#まとめ)  

---

## はじめに

この記事では、Local」というツールを使ってWordPressのローカル環境を構築する手順を解説します。
「Local」は、XAMPPなどの従来のツールと比べて、直感的な操作と簡単なセットアップが特徴です。煩雑な設定を気にせず、手軽に環境構築を始めたい方、初学者に特におすすめです。

---

## Localとは？

「Local」は、WordPressのローカル開発環境を簡単に構築できる無料ツールです。
主な特徴は以下の通りです。

- 簡単な操作でローカル環境を作成可能  
- テストや開発に最適な環境を素早く準備ができる  
- WindowsやMacに対応  
- XAMPPに比べてエラーが発生しない（個人の感想）

公式サイト：[Local公式サイト](https://localwp.com/)

---

## Localのインストール手順

1. **Local公式サイトにアクセス**  
   [Local公式サイト](https://localwp.com/) からインストーラーをダウンロードします。

2. **インストーラーを実行**  
   ダウンロードしたインストーラーを実行し、画面の指示に従ってインストールします。

3. **Localを起動**  
   インストール完了後、Localを起動します。


---

## ローカル環境のセットアップ

### サイトの作成

1. **新規サイトの作成**  
   Localのメイン画面で「+ Create a new site」をクリックします。
![スクリーンショット 2024-12-06 22.45.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389386/73924e2b-b481-18cd-78ec-06788afdd47a.png)


2. **サイト情報を入力**  
   - **Site Name**: サイト名（例: test_site）を入力 
   ローカル開発だけであれば、デフォルトでも大丈夫です。
   （↓オプション）
   - **Local Site Domain**: 自動生成されるドメイン名を確認 
   - **Local Site Path**: サイトデータを保存するディレクトリを指定
![スクリーンショット 2024-12-06 22.46.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389386/ba8afebd-2af1-3362-5cff-de1a88e3aa56.png)


3. **環境設定**  
   プリセット環境を選択（推奨設定のままでOK）。
   PHPバージョンやデータベースは必要に応じてカスタマイズしてください。
![スクリーンショット 2024-12-06 22.49.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389386/81c1cbee-ee9e-2085-44a0-948924855eda.png)


4. **WordPress設定**  
   - WordPressのユーザー名、パスワード、メールアドレスを設定  
   - 「Install WordPress」をクリックしてインストール開始  



---

### サーバー設定の確認

1. **サイトを起動**  
   Localのダッシュボードで作成したサイト名をクリックし、「Start Site」を押します。
   

2. **設定の確認**  
   - **Adminer（データベース管理ツール）**  
   - **SSLの適用（任意）**  

---

## WordPressのダッシュボードを開く

1. **管理画面にアクセス**  
   Localの「Open Site」または「WP Admin」ボタンをクリックして、ブラウザでWordPressサイトにアクセスします。
![スクリーンショット 2024-12-06 22.55.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389386/a1fa4a35-eff6-c34f-6566-4aa780581002.png)


2. **ログイン**  
   先ほど設定したユーザー名とパスワードでログインします。
![スクリーンショット 2024-12-06 22.56.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389386/4e3cfa36-547a-3c67-e06a-b7a32d8090e0.png)


3. **ダッシュボードの確認**  
   WordPressのダッシュボードが表示されれば成功です！
   ![スクリーンショット 2024-12-06 22.56.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389386/911133f4-8487-994b-9499-b0c2fcf4dd66.png)


---

## トラブルシューティング

### よくある問題と解決策

- **サイトが起動しない場合**  
  「Stop Site」→「Start Site」で再起動を試してください。

- **ログイン情報を忘れた場合**  
  Localのダッシュボードから「Database」タブを開き、データベースを直接編集してパスワードをリセットします。

---

## まとめ

Localは、初心者でも簡単にWordPressのローカル環境を構築できる便利なツールです。XAMPPに比べて操作がシンプルで、環境構築のハードルが大幅に下がります。この記事を参考に、まずはローカル環境でWordPressの基本操作やカスタマイズを試し、スキルアップにつなげてください。次のステップとして、プラグインやテーマの開発にも挑戦してみましょう！
表面張力の物理学

:::note warn
記事の内容は私個人の見解であり，所属する学科組織またはサークルを代表するものではありません。
:::
:::note warn
PDFの二次配布や悪意のある利用はおやめください。
:::
# 記事
AdventCalendar2024の８日目のはずです。
九州大学理学部化学科の「ねふ＠化学」です。
AdventCalendar2024ではもう一度，記事を書くことになっているはずで，そちらの方ではもっとマシな記事を書くつもりなので，今回は表面張力について書いた PDF を公開することで記事に代えさせてください。
PDF は次のリンクから閲覧することができます。

https://drive.google.com/file/d/1KzpUZ5iSRhT1M0f8nfvvojf8GMmKEiE8/view?usp=drive_link

この PDF は AdventCalendar2024 のために一部編集・削除していますが，読む上では困らないようにしたつもりです。
最後のラプラスの式の拡張については，その導出(?)をきちんと書いた和書は見当たらなかったので，見る価値があるかもしれません。
# 連絡先
記事に関することで連絡したい場合は，下のTwitterのDMにてお願いします。

https://x.com/kagakuc6h6
Goでenumを評価するswitch文を使うときはあえてdefaultを指定しないことで楽になる

### なぜ楽になるか？

enumで定義した全ての要素をswitch文で考慮しているかlinterがチェックしてくれるから。

### 具体例

こんなenumを想定する。

```go
type Item uint8

const (
	itemA Item = iota
	itemB
	itemC
)

```
例えば、アプリケーションで定義している型をDBに入れる値として変換したいときなど、何かしら変換をしたいことがある。すると、以下のような関数を書きがち。

```go

func convertItemToString(i Item) (string, error) {
	switch i {
	case itemA:
		return "itemA", nil
	case itemB:
		return "itemB", nil
	case itemC:
		return "itemC", nil
	default:
		return "", fmt.Errorf("invalid item.")
	}
}

```

ここで、以下のように新たにitemDを追加する。itemDは"itemD"としてマッピングしたいものとする。

```go
const (
    itemA Item = iota
    itemB 
    itemC 
    itemD 
)
```

ただ、うっかりするとconvertItemToStringにitemDのcaseを追加するのを忘れてエラーを起こしてしまう。

そこで、以下のようにあえてdefaultを外して書く。

```go

func convertItemToString(i Item) (string, error) {
    switch i {
        case itemA:
            return "itemA", nil
        case itemB:
            return "itemB", nil
        case itemC:
            return "itemC", nil
    } 
    return "", fmt.Errorf("invalid item.")
}

```

すると、[exhaustive](https://github.com/nishanths/exhaustive)というlinterがitemDのcaseがないことを検知してくれる。ちなみにexhaustiveはgolangci-lintに組み込まれている。

以下のようにlinterを設定

```yml:.golangci.yml
linters:
  enable:
    - exhaustive

```

```:こんな感じでlint errorになる
main.go:15:2: missing cases in switch of type main.Item: main.itemD (exhaustive)
        switch i {
        ^
```

convertItemToStringのような関数でテストを書こうとすると、単調な関数な割には項目が増えるたびにテストをメンテしなければならず面倒になる。しかし、switch文にdefaultを入れないことでlinterがバグの原因を未然に検知してくれるので、対象の関数が十分に簡単であればメンテコストを加味してテストを書かないという選択肢も取れる。


```go:ここでitemDのケースを追加すればlintエラーは消える:

func convertItemToString(i Item) (string, error) {
    switch i {
        case itemA:
            return "itemA", nil
        case itemB:
            return "itemB", nil
        case itemC:
            return "itemC", nil
        case itemD:
            return "itemD", nil
    } 
    return "", fmt.Errorf("invalid item.")
}

```

ちなみにdefaultで何もしなくても同じようにlintエラーになる

```go
func convertItemToString(i Item) (string, error) {
	switch i {
	case itemA:
		return "itemA", nil
	case itemB:
		return "itemB", nil
	case itemC:
		return "itemC", nil
	default:
	}
	return "", fmt.Errorf("invalid item.")
}
```

```:やはりlint error
main.go:15:2: missing cases in switch of type main.Item: main.itemD (exhaustive)
        switch i {
```
Sequence Makerの多言語対応を確認してみる

## はじめに
Sequence MakerはExcelから測定器を制御可能にするアドインです。Sequence Makerは実は公式サイトにも書かれている通り、日本語、英語、中国語（簡体字）、韓国語の4言語に対応しています。この記事では各言語でSequence Maker専用がどのように表示されるのか確認してみたいと思います。なお、Sequence Makerについての詳細は以下の記事を参照ください。

https://qiita.com/sequencemaker/items/8e6a370ab0a793a06a3b

:::note warn
***お断り***
本記事の内容はSequence Maker開発元の公式見解ではなく、あくまでも個人が趣味の範囲内で執筆しているものです。記事の内容について開発元へ問い合わせることはお控えください。ご質問・要望などは各記事のコメント欄へお願いいたします。
:::

## 多言語対応
多言語対応については、公式サイトに記載があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/573978f4-0f09-a30f-9232-787cc7532abc.png)

（https://sequencemaker.hioki.com/ja/ より引用）

ただし、言語は自由に選べるわけではなく、Excelの言語設定に依存します。今回はExcelの言語設定を変更してSequence Makerの表示を確認してみます。言語設定ではお好きな言語を追加できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/bcadfa56-a18c-fe28-cf49-aff69509dda9.png)



## 日本語

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/6c57ed55-53b6-8b95-0d97-ee2778d471eb.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/96fff88b-ca85-5a49-0542-7eecdde0c368.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/d611cac5-b0f3-129b-5e78-1b4cebcaf5d6.png)

## 英語

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/49f51d7f-be91-559e-9109-a20569228edc.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/5548d02b-af89-b7ea-41ef-ff8be8bdcd4c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/56058d7d-d98e-704c-b612-2ca9c3be21e4.png)

## 中国語（簡体字）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/d3d8a536-e2cb-d1bc-eb3a-ba077bf6ad6f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/7a347252-fc10-83fa-4d3e-a396e892b7f8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/4a9c3586-43f1-1974-ae67-36b061011e23.png)

## 韓国語

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/ef3a0744-ccce-8d2c-fad4-e67136251a12.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/84b40fc2-3db3-7df6-e250-d01319510586.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/da4bae8e-2403-16fa-a9ff-7304ee3a559f.png)

## Webマニュアル
Webマニュアルについても言語選択可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/f189dd85-48eb-3084-d9d7-1503a2a9fdc8.png)

https://sequencemaker.hioki.com/manual/

## まとめ
今回はSequence Makerの多言語対応の状況について確認してみました。なお、Excelの言語設定が対応言語以外になっている場合は英語で表示されるようです。海外でも安心して使えますね！
7日目: Mo's Algorithmを実装する

[競プロ用ライブラリを作る Advent Calendar 2024](https://qiita.com/advent-calendar/2024/yukkku-ribitol)の7日目です.

https://qiita.com/advent-calendar/2024/yukkku-ribitol

# Mo's Algorithmって?

巡回セールスマン問題 (の巡回しないバージョン) の近似解を用いた効率的にクエリを捌くテクニックです.

要件定義が難しいので例題を出します.

> 長さ$N$の数列$A_1, A_2, ..., A_N$があります.
> $Q$個質問があります. $i$番目の質問は以下のようになります.
> - $A_{L_i}, A_{L_i+1}, A_{L_i+2}, ..., A_{R_i}$には何種類の数が含まれていますか?
>
> 全ての質問に答えてください.
> ### 制約
> - $1 \le N \le 10^5$
> - $1 \le A_i \le 10^5$
> - $1 \le Q \le 10^5$
> - $1 \le L_i \le R_i \le N$

Mo's Algorithmではこの問題に$O(N\sqrt Q + Q \log Q)$のような計算量で求められます.

# 仕組み

以下, 各クエリでの正解を$f(L, R)$と書くことにします.
とりあえず例題の$Q = 1$の場合を考えます. 解き方は色々あると思いますが, ここでは「配列で値ごとに個数を管理 + 1つ以上ある値が何個あるかも同時に集計」という方法にします.

この方法ですが, $f(L, R)$を求める時に使った配列は$f(L\pm1,R)$や$f(L,R\pm1)$などの計算に使いまわせます. 区間の大部分が重複しているので, ちょっとの変更で移り変われます.
Mo's Algorithmはこのような計算結果の使いまわしでクエリに答えるテクニックです.

$f(L_1,R_1)$の結果から$f(L_2,R_2)$の結果を計算するには$O(\lvert L_1-L_2\rvert+\lvert R_1-R_2\rvert)$くらいのコストがかかります. コストをなるべく減らしたいので, コストが小さくなるようにクエリを並べ替えて, $f(L_{a_1},R_{a_1})\to f(L_{a_2},R_{a_2})\to...\to f(L_{a_N},R_{a_N})$というように使いまわしのリレーを行います.

問題はどう並べ替えればいいか, です. 平方分割などをする方法が有名らしいですが, ここでは[Hilbert曲線](https://w.wiki/CH8f)を使った方法を紹介します.

Hilbert曲線とはこういう曲線のことです. 赤い点からスタートして無限に伸びてます.
<img width="380" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3924904/05e8d162-1229-3f02-b507-7e007ef38de5.png"/>

この曲線をどう使うかというと, まず問題を言い換えます. 各クエリは$(L, R)$という平面上の点に対応していて, 問題はできるだけ短い距離でクエリの点を全部通りたいということです. この解決法として, 各クエリがHilbert曲線のどこに乗っているか見て, その順にクエリを見ることにします.
Hilbert曲線上で近い点は平面上でも近いところにあるので, いい感じに計算量が削減できます.

計算量の見積もりは大変ですが, 頑張ると$O(N\sqrt Q)$くらいだと分かり, クエリをソートした分を含めると$O(N\sqrt Q + Q \log Q)$です.

# 実装

- [`mo.rs`](https://github.com/Yukkku/ribitol/blob/main/src/mo.rs)

答えを入れる配列は適当な順番で埋まっていきます. どの順番でも埋められるようにRust 1.82.0で安定化したばかりの`Box::new_uninit_slice` / `Box::assume_init` を使いました. 計算中にpanicしてもデストラクタが動くように工夫してます.

# まとめ

いかがでしたか?

明日は数学をします.
計算物理班紹介

# 計算物理班へようこそ！
　初めまして。知っている人はこんにちは。Physics Lab. 2025 計算物理班班長の平松です。この記事では、計算物理の魅力や普段の活動について、最後に僕が興味を持っている型理論について紹介します。

# 計算物理とは？
　計算物理は、物理学の問題を数値的に解くために計算機を使ってシミュレーションや解析を行う学問分野です。理論物理と実験物理の橋渡しとしての役割を果たす、新しめながら重要な分野になっています。物理には解析的に解けない問題がたくさんあります。物理好きの高校生なら知っているかもしれませんが、例えば3体問題は一般に解析解を得られません[^1]。そこで活躍するのが計算物理で、計算機によるシミュレーションで数値的に解くことができます。本質は計算機による単なるゴリ押しですが、泥臭くてもいいからなんとか解いてやろうという姿勢は僕は結構好きです。今ならChatGPTにお願いすれば簡単にコードを書いてくれるので、興味を持ったら自分で実験してみてください。こういう気軽さも計算物理の魅力ですよ？
<br>

　　　　　　　　　　　　　実際にお願いして出力されたシミュレーション
 <img width=20%><img width=60% alt="three_body_problem.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3926309/49d7ce00-b5e6-b5b8-c881-31fb64585b4b.gif">


# 普段の活動
　今年度の計算物理班では以下のゼミが開かれています。
### Deep Learningゼミ
　今年のノーベル物理学賞だった深層学習についてのゼミで、「基礎からの物理学とディープラーニング入門」[^2]という本を読んでいます。統計物理班のページ[^3]で紹介されているように、深層学習で使われるニューラルネットワークの概念は統計力学に強い影響を受けています。例えば、基本的な学習モデルの1つであるBoltzmannマシンは統計力学のIsing模型とそっくりで、初めて見た時は感動を通り越して不思議な気分になったものです。

Boltzmannマシンのエネルギー関数
$$E(\mathbf{s}) = -\sum_{i < j} w_{ij} s_i s_j - \sum_i b_i s_i$$

Ising模型のエネルギー関数
$$E(\mathbf{s}) = -\sum_{\langle i, j \rangle} J_{ij} s_i s_j - \sum_i h_i s_i$$
 
上の2式はそれぞれエネルギー関数を書いたものですが、結合の仕方に違いがある程度でほとんど同じです。つまり、2つの問題は等価と言え、片方が解けるならもう片方も解けることになります。Boltzmannマシンが出てきた頃に統計力学はとっくに出来上がっていたので、深層学習の研究者は物理学の成果を十分に活用できました。思いもよらない分野で応用先が見つかるの、良いですよね。

### 自然言語処理ゼミ
　今流行りの自然言語処理についてのゼミです。「言語処理のための機械学習入門」[^4]という本を読んでいる・・・らしいです(僕は参加していないので詳しくは不明)。自然言語処理の応用先としてはChatGPTなどがあり、今一番ホットな分野ではないでしょうか。僕も時間があれば参加したかったです。

# 型理論とは？
　さて、ここからは僕が今興味を持っている型理論についてです。前年度Physics Lab. 2024の計算物理班では型理論ゼミがあり、「Introduction to Homotopy Type Theory」[^5]という本を読んでいます(実は1年経った今もまだ続いています)。型理論の特にHoTT(Homotopy Type Theory)という理論を勉強しています。型理論は集合や命題の形式的な記述を可能にする枠組みの一つで、元々は数学の論理的基盤を再構築する試みで生まれました。型理論の理念には、数学の"証明"は"構成可能"であるべきという考えがあります。どういうことかというと、数学的な対象が存在することを証明するには実際に構成することが必要だという考えで、構成できないものには証明も考えられないというある意味自然な考えです。

 　例えば、$x=2$という等式の変数依存の命題(型理論ではこのような変数依存命題を"依存型"と言います)があったとしましょう。$x$に$1$が代入されるなら$1=2$となりこの時はFalseが返されます。これの証明(型理論では"項"と言います)は$2=2$になり、この時はTrueが返されます。さて、$x=2$という型には$2=2$という項をとれたので証明が構成可能であることが示されました。では、もし$2=2$が見つからない世界があったとしたら、$x=2$には証明は存在すると断言できるのでしょうか？

　この話はかなり具体的に書いたのですが、普通の型理論はもっと抽象的で、集合論や圏論が好きな人におすすめです。型理論は実際にプログラミングのエラーを防ぐのに使われたり、プログラミング言語設計の理論的背景になったりしています。中には、これからはコンピュータで型理論を基盤に数学をやるべきだなんて主張する人も[^6]。数学がコンピュータに支配される日も遠くないのかもしれませんね。

 # 最後に
　ここまで読んでくださりありがとうございました！計算物理班では五月祭で展示企画をやる予定なので、興味を持ってくださった方はぜひいらしてください。Physics Lab. 2025をどうぞよろしくお願いします。


[^1]: 理由は系の自由度に対して保存量が足りないから、砕けて言うと予測に使える情報が足りないからです。解析力学をやると分かります。
[^2]: [―Pythonで実践―　基礎からの物理学とディープラーニング入門 (エンジニア入門シリーズ112)](https://www.amazon.co.jp/―Pythonで実践―-基礎からの物理学とディープラーニング入門-エンジニア入門シリーズ112-福嶋-健二/dp/4910558071)
[^3]: [統計物理班紹介](https://qiita.com/sheepy/items/a1b6c80c1742c67f6750)
[^4]: [自然言語処理シリーズ1 言語処理のための機械学習入門](https://www.coronasha.co.jp/np/isbn/9784339027518/)
[^5]: ゼミで使っているのは[Introduction to Homotopy Type Theory](https://arxiv.org/abs/2212.11082)ですが、有名なのは[HoTT Book](https://homotopytypetheory.org/book/)
[^6]: Vladimir Voevodskyという人。HoTTの第一人者だった。
研究室の新しい席配置を最適輸送で決めたい

あなたは、**最適輸送**を知っていますか？

最適輸送とは、ある確率分布に従う質量（あるいは確率）を、別の確率分布に移動させるために必要なコストを最小化する輸送方法を求めることです。まあ最適輸送についての説明記事は世の中に五万とあるので、気になった方は調べてみてください。
　　
ところで、最適輸送といえば、私の中で**伝説の記事**があります。

https://zenn.dev/akira_t/articles/seat-opt-via-gw

この記事では、披露宴の席決めを最適輸送を用いて行っています。

ちょうど、弊研究室は来年の春に居室のお引越しがあるので、上記の記事をオマージュして、我々も新しい席配置を最適輸送で決めたい、そんな気持ちでこの記事を書いてみます。

# 前提
学生16人と大人4人の最適配置を行う。
今回は適当に、以下のような配置にすることにした。また、小文字が学生の席、大文字が大人の席を想定している。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929126/f0a3b0dd-65c2-6946-d2a5-10d73b91d6f8.png)

# 定義
まず、登場人物は次のように定義する。
学生：U1, U2, U3, U4, U5, M1, M2, M3, M4, M5, M6, M7, M8, D1, D2, D3
大人：O1, O2, O3, O4

座席の関係性については以下のように定義した。この状態をSとする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929126/b3a0c0c8-a0b0-a928-3e74-fdd2ac15d748.png)


次に、個人間の関係性の定義のため、ひとまず10クラスターを定義した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929126/03b5e3ae-68b5-be6f-b5f1-879cc2562c13.png)
すると、個人間の距離は以下のように定まる。この状態をDとする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929126/bfce20a3-1edc-d695-58c2-287ce2ecaa73.png)

類似度行列を正規化された距離行列に変換し、対角要素を0に設定する。
```
#座席について
dist_S = (S.max()-S)/(S.max()-S.min())
np.fill_diagonal(dist_S, 0)
#個人間の距離について
dist_D = (D.max()-D)/(D.max()-D.min())
np.fill_diagonal(dist_D, 0)
```
POTより[gromov_wasserstein](https://pythonot.github.io/gen_modules/ot.gromov.html#ot.gromov.BAPG_gromov_wasserstein)を用いてこの問題を解く。
今回は、大人を指定した席に座らせたかったので、その部分に重みを付けた。
```
G0 = np.ones([20, 20]) * 0.01
G0[17, 1] = 0.05
G0[19, 13] = 0.05
G0 /= G0.sum()

p=G0.sum(axis=1)
q=G0.sum(axis=0)

gw, log = ot.gromov.gromov_wasserstein(
    dist_S, dist_D, p, q, 'square_loss', log=True, verbose=True, G0=G0)
```
ここまでを実行すると以下のような結果が得られた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929126/8792b2c7-a140-a632-5e13-2a7677af9582.png)
図面に起こしてみるとこんな感じらしいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3929126/9f3e52d9-5166-94fd-1021-2d1815bc20c5.png)

# おわりに
わたし、壁際に座りたいので、この席順は却下でおねがします(^_-)-☆
【Java】A a = new B()を考える第2弾

## 前回
https://qiita.com/pandausa/private/8ee99e908bf512512449

## B b = (B)aの挙動を見てみよう(インスタンスメソッド版)
```ruby:Java(A.java)
public class A{
	public void speak() {
		System.out.println("Hello");
	}
}
```
```ruby:Java(B.java)
public class B extends A{
	public void speak() {
		System.out.println("Good Morning");
	}
}
```
復習だが、BはAを継承し、speakメソッドをオーバーライドしている。この時、Mainクラスで以下の処理を実施する。

```ruby:Java(Main.java)
public class Main {
	public static void main(String[] args) {
		A a = new B();//復習
		a.speak();//復習
		B b = (B)a;
		b.speak();
	}	
}
```

問題はA型の変数aをキャスト演算子で明示的にB型とし、B型の変数bに格納していることである。

:::note warn
**キャスト演算子をつけない場合**
以下のコンパイルエラーが発生するので、ダウンキャストの場合は必ずつける
```
Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
	型の不一致: A から B には変換できません

	at Main.main(Main.java:5)
```
:::

さて結果はどうなるだろうか。
```
Good Morning
Good Morning
```

変数bはB型なので、Bクラスのspeakが呼び出された。

## B b = (B)aの挙動を見てみよう(staticメソッド版)
ではspeakメソッドにstaticをつけて確認しよう。

```ruby:Java(A.java)
public class A{
	public static void speak() {
		System.out.println("Hello");
	}
}

```

```ruby:Java(B.java)
public class B extends A{
	public static void speak() {
		System.out.println("Good Morning");
	}
}
```

```ruby:Java(Main.java)
public class Main {
	public static void main(String[] args) {
		A a = new B();//復習
		a.speak();//復習
		B b = (B)a;
		b.speak();
	}	
}
```

結果
```
Hello
Good Morning
```

この場合もBクラスのspeakが呼び出されることに注意。インスタンスメソッドと同様に元の型であるB型にキャストで戻し、B型で宣言した変数に代入しているため、呼び出すメソッドもBクラスのものになる。

## Bクラスだけに存在するメソッドを呼び出す時は？(staticメソッド版)
今度は以下のようにBクラスにのみbyeメソッドを追加する。

```ruby:Java(B.java)
public class B extends A{
	public static void speak() {
		System.out.println("Good Morning");
	}
	public static void bye() {
		System.out.println("bye");
	}
}
```

それをMainクラスで呼び出そう。

```ruby:Java(Main.java)
public class Main {
	public static void main(String[] args) {
		A a = new B();
		a.bye();
		B b = (B)a;
		b.bye();
	}	
}
```


結果
```
Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
	メソッド bye() は型 A で未定義です

	at Main.main(Main.java:4)
```
上記のようにエラーになることは想像しやすいだろう。一旦エラー部分をコメントアウトして再確認する。

```ruby:Java(Main.java)
public class Main {
	public static void main(String[] args) {
		A a = new B();
//		a.bye();
		B b = (B)a;
		b.bye();
	}	
}
```

結果
```
bye
```

b.bye()の結果はエラーにならなかった。このことからもbはB型で定義できていることがよくわかる。

## まとめ
* インスタンスメソッドの場合、実際のオブジェクト（new B()）に基づいて、サブクラスのメソッドが優先的に呼び出される
* staticメソッドの場合、変数の型（A）に基づいてメソッドが決定される
教本中で知りたかったVisualStudioの便利機能

# はじめに
C++やC#、VBなどを勉強することはあれど、VisualStudioについて勉強したことはなく、VisualStudioってなんとなく使いづらいなと思うことはありませんか？
私もソリューションエクスプローラーから今開いているファイルを探すのに、どれだけ時間をかけたか…。
そんな私が、実際の開発現場で教えてもらった、VisualStudioの便利な機能について紹介します。

# ソリューションエクスプローラーウィンドウ
![6のコピー.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568190/38ebbd5d-667a-d3d2-8c1f-be3b6e2da003.jpeg)

左から
- 両矢印(アクティブ ドキュメントとの同期): フォーカスしているファイルを探す
- 回転矢印(最新の情報に更新): 最新の情報に更新
- 複数カードマーク(すべて折りたたむ): ソリューションエクスプローラーで開いているファイルをすべて折りたたみます。
- 複数書類マーク(すべてのファイルを表示): プロジェクトに追加されていないファイルやDesigener.csなどを表示します。

# ウィンドウ
教本で見かけたことなくて便利だなと思ったウィンドウは以下です。
- 呼び出し履歴: ブレークポイントを貼って実行すると、止まった時点でどの関数から呼び出されているか、スタック上に記録が見られます。
- ブレークポイント: ブレークポイントを貼った一覧が見られ、複数選択して一気にブレークポイントを外すことも可能。

教本でも見かけたよく使うウィンドウ
- イミディエイト: 実行中のみ出現し、?で変数値の確認や関数の実行ができる
- 出力: コンソール結果などが表示される
- エラー一覧: ビルドエラーなどが表示される
- ローカルウィンドウ: プライベート変数の値などが分かる。
- ウォッチウィンドウ: 登録した変数の値を常に表示できる。
- ブックマーク: ブックマーク一覧。

# コマンド
VisualStudio自身が自動でフォーマットしてくれるのですが、たまにフォーマット漏れがあるので「編集->詳細->ドキュメントのフォーマット(Ctrl+K, Ctrl+D)」でフォーマットしてます。
マウス操作が得意な人はツールバーをカスタムして登録してもいいかもしれません。

# おわりに
教本をやる初学者からプログラミング言語だけではなく、ツールであるVisualStudioにも理解を深めて、快適な開発環境を構築しましょう！

# 参考
- [ソリューション エクスプローラーについて学習する](https://learn.microsoft.com/ja-jp/visualstudio/ide/use-solution-explorer?view=vs-2022)
-
VS Code　便利ショートカット

# VS Code ショートカットキー一覧

## 基本操作

- **Ctrl + W**: タブを閉じる
- **Ctrl + Shift + T**: 最後に閉じたタブを再度開く
- **Ctrl + W**: すべてのタブを閉じる

## エディター操作
- **Ctrl + P**: ファイルをクイックオープン
- **Ctrl + G**: 指定した行に移動
- **Ctrl + Shift + P**: コマンドパレットを開く
- **Ctrl + F**: 検索
- **Ctrl + H**: 検索と置換
- **Ctrl + Shift + F**: プロジェクト全体で検索
- **Ctrl + /**: コメントの切り替え
- **Alt + ↑ / ↓**: 行を上下に移動
- **Shift + Alt + ↑ / ↓**: 行を上下に複製
- **Ctrl + Shift + K**: 行を削除

## 選択操作
- **Ctrl + A**: すべて選択
- **Shift + Alt + → / ←**: 選択範囲を単語単位で拡大 / 縮小
- **Ctrl + D**: 次の一致する単語を選択
- **Ctrl + Shift + L**: 選択範囲内の一致するすべての箇所を選択

## ナビゲーション
- **Ctrl + Tab**: タブ間を移動
- **Ctrl + -**: 前のカーソル位置に戻る
- **Ctrl + Shift + -**: 次のカーソル位置に進む
- **Ctrl + B**: サイドバーの表示 / 非表示を切り替え
- **Ctrl + `**: ターミナルの表示 / 非表示を切り替え

## ターミナル操作
- **Ctrl + `**: ターミナルを開く / 閉じる
- **Ctrl + Shift + `**: 新しいターミナルを作成
- **Ctrl + Shift + C**: 外部ターミナルを開く
ぬいぐるみゲットのための計画目標


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/f277901a-49c5-cdf4-272f-aa2034d9eb70.jpeg" width=80%>





## 初めてのキャンペーン参加！Qiita Advent Calendarでぬいぐるみゲットに挑戦！
初めて Qiita のアドベントカレンダーキャンペーンに参加します！今回、景品として可愛いぬいぐるみがあると知り、思わず「絶対ゲットしたい！」という気持ちが湧いてきました。その思いをモチベーションにして、記事執筆に挑戦していきます。

## 目標設定
合計25記事投稿が必要。毎日1記事ペースも考えましたが、私にとっては少しハードルが高いかもしれません。そのため、1週間に4記事という目標にして、少しずつ進めていく作戦にしました。

### -11月🍁
12記事が限界、、。しかも完成ではないので編集が必要な記事ばかり。
到底16記事には難しく目標達成には行かなかったです。

### -12月🎄

記事書いていない：１３
土日→３記事分準備（アプリを触りながら記事構成を作る）
平日→投稿


## 記事内容とテーマ
記事内容としては、これまでに学んだプログラミングの知識や最近の取り組みについて書きます。pythonメインで、「業務効率」がメインテーマです。自分が悩んだポイント、解決策など、読んでくださる方にとって少しでも役立つ内容を目指します。



▼ こんな内容です

https://qiita.com/riicon72/items/ca009cfd524a46f6e0d5



## 最後に
ぬいぐるみをゲットするというシンプルな目標が、こうして大きなモチベーションになっています。少しずつ着実に進めていきますので、応援よろしくお願いします！
windows 便利ショートカット

### Windows ショートカット一覧



- **Alt + Tab**: 開いているアプリ間を切り替え
- **Alt + F4**: アクティブウィンドウを閉じる
- **Win + Shift + M**: 最小化したウィンドウを元に戻す


- **Windows + R**: 「ファイル名を指定して実行」を開く
- **Windows + Tab**: タスクビューを表示
- **Ctrl + L**: アドレスバーにフォーカス（エクスプローラーやブラウザ）


- **Win + I**: 設定を開く
- **Win + L**: PCをロック
-  **Control + Alt + Del**: シャットダウン
-  - **Windows + E**: エクスプローラーを開く
- **Ctrl + Shift + Esc**: タスクマネージャーを開く
今年買ったキーボードのご紹介


Advent Calendar で [キーボードの話](https://qiita.com/T_death/items/a2a59e4270b6c8acc61a) を書かれた方がいらしたので触発されて書きます。

# 4 年ぶりにキーボードを買いました

今年は何やったかな～？と思って思い出しましたが、キーボードを買いました。

前回買ったのが 2020 年の 10 月で、[ProgresTouch RETRO TKL](https://archisite.co.jp/products/archiss/progres-touch/retro-tkl-jp/) というヤツでした。
特に不満はなく使えていたのですが、一部のキースイッチがカシュカシュいうようになりまして気になり始めました。
オイルをさしたりすればどうにかなるだろう、と思ったものの、ARCHISS ブランドのキーボードはハンダ付けされているので外すのも面倒だし、失敗した瞬間業務に支障が出るよな・・・と思って悩んでおりました。

軽い気持ちで欲しいキーボードの要件を考えてみることに。

# 要件

-   小さいこと
    -   テンキーレスなのは当然のこと、矢印キーもコンパクトならヨシ
-   キー数は多いこと
    -   複数キーを押さないと使えない、とかはナシ
    -   日本語 JIS 系で「無変換」「変換」があるタイプがヨシ
-   キースイッチが交換できること
    -   ホットスワップ対応ということです
    -   ハンダ付けじゃないほうがいいなあ、と

くらいでしょうか。
要件が見えてくると、検索したくなっちゃいますよね。

そしたらめぼしいのが見つかっちゃったんですね。

https://superkopek.jp/collections/keyboard/products/keychron-k2pro

Keychron K2 Pro というヤツでして。

見つかっちゃうと、つい買ってしまう。 **怖い話です**。

![買っちゃいましたキーボード](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1553291/e8098dab-6945-e4a6-fd60-1a30862a814c.jpeg)
はい、買っちゃいました。

![ProgresTouch RETRO TKLとの比較](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1553291/b9076c82-1101-907b-6354-5711d4c02aa0.jpeg)
前のキーボードよりも小さくなったので持ち運びしやすくなりました。
前のキーボードだと、普段の会社行きのバッグでもギリギリだったので。

# 使ってみて

ただ使ってみると、静音な赤軸にしたのですが、ちょっとうるさいなーと思ったりしまして。

秋葉原の遊舎工房に行って[静音キースイッチ](https://shop.yushakobo.jp/products/5659)を購入して換装しました。

![赤軸からの換装](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1553291/3c6c5fdc-6475-5a57-7076-2d442287982c.jpeg)

ちょっと思っただけなのに気づいたら**かなりの出費になってしまってます**ね。困ったもので。

キーの配列も、USB で有線接続したら[Web 上](https://usevia.app/)で変更できます。これもメリットですね。
fn キーを押しながら `h` `j` `k` `l` で左・下・上・右に動かせるようにしたら手の移動距離もグッと短くなりましたし。
（矢印キーもあるので、移動が多いときはそちらも使えます・・・が元の配列だと左・上・下・右なので、上下は反対にしてます。**vimmer のクセのせい**。）

概ね満足なのですが、換装したキースイッチのキー荷重（作動フォース）が少し弱いため、Keychron のキーキャップの重さでかなり繊細なキータッチを要求されるようになってしまいました。
キーボードに手を触れたままボーっとしていると誤入力がだーーーっと流れてしまう感じになってしまいます。

まあ、その辺は意識改革（気合）でどうにかするという感じですね。

# というわけで

パーフェクトではないですがほぼ満足のいくキーボード生活になりました。
自由に換装できる（ホットスワップ対応）ので、また困ってきたらキースイッチを付け替えればいいだけですしね。

エンジニア的には一番触っているのがキーボード、ってことで皆様の愛用キーボードも見てみたいものです！

![業務状況](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1553291/3c18796e-dbbc-9ca6-08f2-ecba7afe4a3f.jpeg)
マイクの存在感が大きすぎますが、キーボードはいいところに収まっております。
備忘録：pythonでpngファイルが開けないという問い合わせについての対処法など

# 背景
自分の作ったpythonプログラムを使ってもらっていて画像が開けないと苦情があった。確かに開けず、初めは原因がわからなかったが、のちにそのファイルの中身が実は.pngではなかったことがわかった。

# 対処法
## ファイル形式の確認
ターミナルに以下のコマンドを投げ込んで、確認したらよかった。
```:プロンプト
file image.png
```

```:実際の出力結果
image.png: ISO Media, HEIF Image HEVC Main or Main Still Picture Profile
```
拡張子が.pngだったしても、中身がHEIF形式みたいで、今までこういった画像ファイルが存在することを知らず、初めて知った。(HEIFはApple製品で使われている規格みたい)

## じゃぁどうやって対処するのか？
画像を"プレビュー"で開き、「ファイル>書き出す」で再度変換すれば、ptyhonプログラムから開けるようになった。

```:書き出した後
image.png: PNG image data, 3024 x 4032, 8-bit/color RGB, non-interlaced
```

# 補足事項
この記事はMacOSの環境を前提としたものです。
VRMで表情変更・微調整する方法をメモ


どうも初めまして、F-kunです。
A-kun ひとり AdventCaleder 6日目の記事です。

## はじめに
今回は、VRM1.0での表情変更について解説します。

VRM1.0での表情変更は標準で登録されている表情に変更する方法があります。他にも、VRM1.0にはBlendShapeがSkkinedMeshRendererが残っているので、これを変更することでより詳細に表情を変更することができます。

今回はこれらをスクリプトから操作する方法についてメモしておきます。

## VRM10Instanceから操作

アバターのルートにあるVRM10Instanceから操作する方法です。
動的に生成されたアバターに対しても操作が可能です。一方、事前に登録された表情での操作になるため、VRM作成者が表情を登録していない場合は、この方法では操作できません。

```csharp
this.GetComponent<Vrm10Instance>().Runtime.Expression.SeiWeight(ExpressionKey expressionKey, float weight);
```

## SkkindMeshRendererから操作

skinnedMeshRendererから操作する方法です。
BlendShapeを操作することで、モデル作成者が登録したBlendShapeを直接操作することができます。

```csharp
int index = skinnedMeshRenderer.sharedMesh.GetBlendShapeIndex(blendShapeName);
GameObject.Find("Face").GetComponent<SkinnedMeshRenderer>().SetBlendShapeWeight(int index, float value);
```

## 参考文献

https://vrm.dev/api/api_update/

https://docs.unity3d.com/ja/2022.3/ScriptReference/SkinnedMeshRenderer.SetBlendShapeWeight.html
Piscine体験記 ケースs:ある一般社畜の場合

初めまして、お初にお目にかかります。
sohyamazと申します。
2024-08 Piscineにチャレンジし、2024-10より42Tokyoの学生として日々勉強しております。

さて、前書きはさておき、隙があったので自分語りをしようかと思います。

- 前提  そもそもPiscineとは
- 42Tokyoとの出会い
- sohyamazのスペック
- Piscine体験記
    - Piscine前の準備
    - Piscine期間中
    - Piscin後から合格発表まで
    - 入学後
- 現在

#前提　Piscineとは

この説明をすべき人は多分このアドカレを見には来ないと思うので、後日追記しますね。

#42Tokyoとの出会い
諸々の理由があり、私は新卒2年目まで独学で様々な資格を取得してきました。
ここで伝えておきたいのは”独”学はとても時間がかかる、ということです。
理由に関しては後述しますが、少なくとも明るくない分野については、独学を避けるべきだ、と私は考えております。

そんなわけで、独学での成長スピード限界を感じた私は、ネットでプログラミングスクールを探していました。
ここで問題になるのはコストです。新卒未経験エンジニアの給料など、吹けば飛ぶのが自明の理。到底学費を払う余裕はありませんでした。
そうして探すうちに、不自然なまでに情報がなく、何をするかも分からない学校に出会いました。
ただ1つわかることは、この学校を出るということは、恐らく自分のキャリアプランを大きくショートカットする、革命的な最短ルートであること、でした。
サイトを見終わる頃には、私の手はオープンスクール申し込みに伸びていました。一筋の光を見たかのごとく、藁にもすがる思いでした。
それ私と42の出会い、果てへと至る導でした。

#sohyamazのスペック
ここで閑話休題、こいつは一体何者か、という話をしましょう。
私の簡単なスペックはこちら
    ・1999年生まれ25歳
    ・教育学部出身　小中高免許持ち
    ・プログラミング未経験
    ・サブロク協定と仲良しな社畜
いかがでしょうか。良くいる一般的な社畜ですね。社会人から42を目指す方のサンプルケースとしてはまずまずと言ったところではないでしょうか。

#Piscine体験記
前書きにも書いた通り、私は8月のPiscineを受験しました。社畜Piscinerの受験模様をお伝していこうと思います。

 Piscine前の準備
 社会人にとっての最大にして究極の壁は「時間」です。
 というのも、Piscineの受験を考える場合、よっぽど元からできる、とかでない限り1ヶ月のフルコミットが必要になります。
 健康な社会人が１ヶ月休暇を作る。それが如何に無茶な事例であるかはみなさんも想像に難くないのでは無いでしょうか。
 取れるプランとして以下が考えられます。
 ①辞職
 ②休職
 ③リモートワーク
 ④その他休暇取得

ただし私に限って言えば諸事情あり給与が途切れると詰んでしまうため①や②は選択できません。加えるに現場は実機作業必至であるため、③を選ぶことはできません。

結論を言うのであれば、私は持ちうるあらゆる休暇を全て差し出し、日程を確保しました。
その後、有給がない１ヶ月間震えながら過ごしたのは良い思い出です。

Piscine期間中
ここに関して、様々な人が書いている為、別の切り口で書きましょう。
これは本質的には子供が享受できる「義務教育」の権利を、理想的な形で再度享受している状態だと考えられます。

共通部分の例のいくつかを以下に示します。
・費用の負担が無い
・強制はされない
・様々なレベルの人間がいる
・全員が同じタスクを受領している
・全員が同じ目的を共有している

では何が違うのか。それはこの魔法の呪文が、対象者の頭に染み込んでいるかどうか、にあります。
その呪文とは
「周りに訊くこと」
それだけです。たったそれだけ。

なぜこれが義務教育と違うのか。
それは、日本における多くの子供にとっての「学び」とは教師から「与えられる」ものであり「待ってい」れば「教えて/助けて」くれるものである、からだと考えます。

「周りに訊く」必要に迫られない。
だからこそ「訊く」経験を積むことが出来ず、有り体に言えば「助けて」と言えない、言い方が分からない子供が多くいます。

ではピアラーニングが義務教育にとって最適であり、すべきなのかと言えば、それもまた安易に答えが出る問題ではありません。精神的成熟や、知能レベル、「教員」という生物群に染み付いた文化の払拭など、クリアすべき課題は多く残されています。

チャレンジできる年齢が思春期を終えた頃からであることも、そういった部分が一因としてあるように思えます。

だからこそ「義務教育」という権利が持最大限のメリットを引き出し、次の時代の親世代へ渡すこの環境は、次世代への種まきという面で見ても、もちろん受ける我々へメリットとしてもとても理想的なものだ、と考えられます。

結果として、7年以上ぶりに「自分のことだけ」考えて「学習」に没頭できた「教室」での日々は、苦しみを感じることなど無いくらい楽しい日々であったのです。

 Piscin後から合格発表まで
夢はいつかは覚めるもの。社畜に待つのは現実です。他のPiscine同期は2ヶ月の間より練り上げていたり別の挑戦したりしていたようですが、私の場合は単純に仕事を済ませていました。
まあそんなもんでしょ。そうやって日々を過ごしているうち、一通のメールが届きました。
それは夢のつづきへの招待状であり、更なる挑戦の道標でした。未経験の社畜がどこまで行けるのか、そんな挑戦の始まりでした。

入学後
これもまた、当然ながらPiscineの時のようには行きません。好きな事、やりたい事だけやれる権利は社畜には無いのです。それでもどうに続けたくて、一日1時間だけでも通うようにしておりました。
参考として、週のコミット時間は平均25時間、主に土日で稼ぐ形ではあるものの、触れる日は校舎に来てコードを触るようにしています。

8月出会った仲間、10月出会った先輩方、そんな皆様のお知恵を借りながら、最初の課題を進めていきました。

平日は大体朝5:30に起き、2:30-3:00頃に眠るような生活ですが、残業で送る生活リズムと違い、充実感が溢れています。

※寝れる時は寝ましょう。いやマジで。死ぬから。社畜おじさんとの約束です！

#現在  
現在私は電車で寝落ちしかけながらこの記事を書いています。なんか文字は途中で上書きされるし、qiitaって難しいな。なんてことを考えながら書いています。
ちなみにこれも人生初の記事ですね。後ほど修正するので、一旦下書き位の粒度でお目こぼしいただければ幸いです。

ついこの間1個目の課題をクリアし、まだ夢は続いています。
どうかこの夢を1秒でも長く見ていられますように、そう思いながら日々楽しく学んでいます。


急ぎ仕上げたのであんまり気に入ってないです。後で直します。
とりあえず、締切10分前なので締めておこうと思います、ごめんね。

アドカレ、誘ってくれてありがとうございました！
【Rails】オブジェクトの状態を判定するメソッドの使い分け

Ruby on Railsでオブジェクトの状態を判断するためには`nil?`、`empty?`、`blank?`、`present?`の4つのメソッド使用します。
以下のテーブルでは、これらのメソッドの使い分けを示します。

| メソッド     | nil   | "" | [] | ["a"] | {} | {key: "value"} | false |
|--------------|-------|---------------|---------------|--------------------|------------------|-------------------------------|-------|
| `nil?`       | true  | false         | false         | false              | false            | false                         | false |
| `empty?`     | false | true          | true          | false              | true             | false                         | false |
| `blank?`     | true  | true          | true          | false              | true             | false                         | false |
| `present?`   | false | false         | false         | true               | false            | true                          | false |

## 使い分けのポイント

- **`nil?`**: オブジェクトが`nil`かどうかを確認したい場合に使用します。`nil`以外の値はすべて`false`を返します
  
- **`empty?`**: 配列やハッシュなどのコレクションが空であるかどうかを確認するために使用します

- **`blank?`**: `nil`、空文字列、空白文字列、空の配列やハッシュを含む、すべての「空」の状態を確認するために使用します

- **`present?`**: `blank?`の逆で、オブジェクトが存在し、空でないかを確認するために使用します