OmniAICreator/Qiita-1.07M huggingface dataset:
【勉強記録】Qiita毎日投稿してから1か月たちました

# はじめに
こんにちは！アメリカの大学で語学を学びながら、独学でソフトウェアエンジニアを目指している者です。
今回は10/6からQiitaを毎日投稿して1か月たったので、自分が実感している効果を載せていこうと思います。

# なぜ毎日投稿しているのか？
理由はいくつかあるので箇条書きで書いていきます
* 周りに監視の目を置いて自分を追い込むため
* 自分のわからないを言語化して整理するため
* 勉強時間が取れない日でもプログラミングに触れられる時間を作ることができる
* 同じ境遇の独学者を見つけるため
* 就職の際に独学を継続した証拠と学習レベルを見てもらうため


## 周りに監視の目を置いて自分を追い込むため
この記事も1か月がたったという投稿にすることで継続する理由を作ろうという意図もあります。
他の人と比べて自分を律することができるタイプだと思うのですが、それでも甘えが出ないように周りから固めるのは定石ですね。

## 自分のわからないを言語化して整理するため
自分のわからない内容をほかのQiitaの記事やリファレンスマニュアル、Chatgptを参照して何となくわかった！と思っている例と、自分が理解できる言葉に要約して記事にするのとでは、全然理解度が違うなと思います。
あと、記事にすることで自分の復習になるのでわからない内容が気づいたらできるようになっているみたいなことがよくあります！

## 勉強時間が取れない日でもプログラミングに触れられる時間を作ることができる
現在私はアメリカの大学に語学を学ぶために2か月限定でいっているので宿題が出てなかなか勉強が進まないことがよくあります。
その際に記事を書くだけor コメントを見て自分の間違いを振り返るだけでも1日1気づきできるので1年続ければ365の気づきを得ることができます。

## 同じ境遇の独学者を見つけるため
見つかったらいいな～みたいな感じでやっているので、そこまで大きな目的ではないのですが、独学でやってるよ～といっていれば同じ境遇の方が見つかるのでは？と少し思っています。
同じ境遇の方がいれば、お互いに勉強状況を共有したりたわいもない話でもしてみたいですね。
あと、たくさん集まったら独学者によらずですが就職前に一回共同開発できたらしてみたいです！
また、私のような独学者が共同開発できる手段知っている方いれば誰か教えてください！！

## 就職の際に独学を継続した証拠と学習レベルを見てもらうため
これはそうなったらいいな、と思っているレベルで上記の目的のほうが大きいかもしれません。
ですが、継続力と自走力の証明になったりするのかな？と思ったり思わなかったり。
と思いつつも、私の記事を見て採用者がどう考えるかなんて、私にはわからないので、これ以外に得られるメリットにしっかり着目しながら継続したいと思います


# 1か月で何か変わった？
上記と被ることがありますがこれも箇条書きで書いていきます
* アウトプット目線で見るようになるので、理解度が上がった気がする
* 継続したことによる自信がつく
* コメントの質が高く自分が知らないことを教えてくれる方がいる

他にもあるかもしれませんが、メリットが結構あるなと感じます
逆にデメリットをあげるとすると
* 時間が最低30分はかかる
30分を長いとみるか、短いとみるかは人に寄りますが、SNSやyoutubeを見ている時間があれば問題なく作れる時間だと思います
* ネタきれる時も当然ある
基本的には現在勉強している教材から疑問を言語化してあげています。
勉強できないときはインプットがなくて困っても、勉強だけに絞らずほかのテーマで記事を書いています。
クオリティに関しては、そこまで低くてもあまり気にしていません。
低いか否かは誰目線で見るかで変わるので、それについて気にしてる暇があれば、何をインプットして記事にできるかを考えています。

# 今後の目標
まずは3か月を目標に継続しようと思います。
そこでやめるというよりは、small goalを設置して継続できそうなら6カ月、1年と期間を延ばそうと思います！
この記事を書いていて一番うれしいことは、コメントを頂けることです。
独学で新たな気づきを得るのはとても難しいので、レベルアップスピードが上がるような気がします！
もちろん、いいねもうれしいですが
【数式】営業日(土日を除く)を考慮した期日判定

# 概要
期日(DueDate__c)が今日以前の場合は"期日超過"、営業日ベースで2日以内なら"警告"、それ以外は空白を表示する。  
※20行目の`) <= 2`を変更することで閾値を調整できます。

# 数式
```
IF(
    DueDate__c < TODAY(),
    "期日超過",
    IF(
        AND(
            DueDate__c >= TODAY(),
            (
                (DueDate__c - TODAY()) - 
                (2 * FLOOR((DueDate__c - TODAY() + WEEKDAY(TODAY()) - 1) / 7)) - 
                IF(
                    MOD(WEEKDAY(TODAY()) + (DueDate__c - TODAY()) - 1, 7) = 6, 
                    1, 
                    0
                ) - 
                IF(
                    MOD(WEEKDAY(TODAY()) + (DueDate__c - TODAY()) - 1, 7) = 0, 
                    1, 
                    0
                )
            ) <= 2
        ),
        "警告",
        ""
    )
)
```
トラブった時に使えるgit reset コマンド集

# この記事の背景
Gitでトラブった時に助けてくれるgit restのコマンド集を集めてみました。

# git reset --soft (commit)
***直前のコミットをなかったことにして、変更内容をインデックスに残しておく***時に使います。
```
git reset --soft HEAD~1
```

# git reset --mixed (commit)（デフォルト）
***コミットとインデックスをリセットし、作業ツリーはそのまま***で、
指定したコミットまで戻し、変更をインデックスから外しつつ作業ツリーには残す時に使います。
```
git reset --mixed HEAD~1
```
```--mixedはデフォルト```なので、次のように省略しても同じ挙動です。

# git reset --hard (commit)
***コミット、インデックス、作業ツリー全てを指定したコミットの状態にリセット***します。
***過去のコミットを削除したい時***に使えます。
指定したコミットまで完全に戻し、以降の変更をすべて破棄する時に使います。

注意‼️ ***作業ツリー内の変更が失われるため、注意が必要***です。
```
git reset --hard HEAD~1
```

https://qiita.com/ykawakami/items/0d6826c529ad7c7b37dd

# git reset --merge (commit)
***マージ時のコンフリクト解消中に、マージに関わるファイルのみリセット***します。
マージに失敗した場合に、マージに関連するファイルのみをリセットしたいときに使います。
```
git reset --merge
```

# git reset --keep (commit)
指定したコミットに戻し、作業ツリーにある変更がコンフリクトしない場合のみリセットします。
作業ツリーの変更を残したままリセットするが、コンフリクトが発生しない場合のみ成功させたいときに使います。
```
git reset --keep HEAD~1
```

# git resetをなかったことにする
```
git reset --hard ORIG_HEAD
```

# バックアップのすすめ
```--hard オプションでは、データが完全に消される```ので、
重要な変更がある場合は```git stash```や```git commit```を使って***バックアップを取っておく***といいと思います。


# git reflog
***過去のコミットの「参照ログ」を表示するコマンド***です。
git checkout、git commit、git pull などで HEAD がどのように移動したかがわかるので、
間違えて、変更を上書き、削除しても、git reflog によって元の状態を確認・復元できます。
```
git reflog
```

# 資料

[困ったときの git reset コマンド集](https://qiita.com/ChaaaBooo/items/459d5417ff4cf815abce)

ChatGPT
【超基礎】JavaScriptの関数とクラスの基礎まとめ

## 前提
この記事はPython,C,C++がちょっとだけ書ける、読める筆者がProgateでのJS学習を通して、はえ～と思ったことをまとめたものになります。従って、**なんだそれ当たり前だろ**みたいなことしか書かれていませんので悪しからず。

ちなみに生成AI頼りの個人開発をした際，JavaScriptを使いましたのである程度はわかっているつもりですが、自分で書かないと気づけない厳密な部分は何もわかっていないです。

記憶定着用のアウトプットに近いものになりますので、誤っている部分があれば訂正していただけると幸いです。。

https://prog-8.com/courses/es6

 ### 筆者の技術力
 - C,Python (基礎文法~ポインタ、アルゴリズムの授業、研究での使用など)
 - HTML,CSS,JS (大半を生成AIに支援してもらったため読めるが書けない)
 - C++ : (AtcoderのD問題をたまにギリギリ完答できる程度)


## 関数ついて
### 関数式
aという定数に関数が格納されるイメージ。呼び出しや引数の受け渡しは同じ。
ただし、モダンなJSでは後述する**アロー関数**の方が一般的である。
```JavaScript:関数式
const a = function () {...};
```
### アロー関数
ES6で導入された機能で、煩雑だった従来の関数宣言を簡略化した、可読性に優れたもの。
```JavaScript:アロー関数
const a = () => {...};
```

ただし、従来の関数宣言とアロー関数にはそれぞれ違った特性があるため、従来の関数宣言をなりふり構わずアロー関数に置き換えていいというわけではない。

https://qiita.com/nicco_mirai/items/0bd0d0bcee72497d4b42

https://qiita.com/suin/items/a44825d253d023e31e4d

## クラスの基本概念
### クラス
- オブジェクトの設計図
- クラス名は大文字から始まる
- 宣言の際、**セミコロンは不要**
```JavaScript:クラス
class Fruits {...}  //セミコロンは不要
````

### クラスのインスタンス化
`new`を使って宣言する。
```JavaScript:インスタンス化
const apple = new Fruits();
```

### コンストラクタ
Pythonにおける`__init__`の部分。オブジェクト生成時の動作を定義し、下のように引数として値を渡すことで、各インスタンスに格納される値を定義する。

`this.name`とすることで`Fruits`オブジェクトの`name`プロパティが定義される。
```JavaScript:コンストラクタ
class Fruits {
    constructor (name){
        this.name=name; //"Apple"
    }

    info(){...}
};

const apple = new Fruits("Apple"); //インスタンス化
```

### メソッド
- クラスの中で関数のような役割を持つ
- `this.info()`のように同じクラス内の別メソッドを呼び出すことができる。

## 継承
### 概要
- 既に存在するクラスの性質(プロパティやメソッドなど)を引き継ぐことができる。
- 元のクラスは**親クラス**、新たに作られるクラスは**子クラス**と呼ばれる。
- メソッドの追加が可能
``` JavaScript:継承
class Citrus extends Fruits {...} //柑橘クラスの定義
```
### オーバーライド
同じ名前のメソッドを子クラスで新しく定義した場合、`Citrus.info()`のように呼び出すと、新しく子クラスで定義された動作が優先される。これを**オーバーライド**と呼ぶ。

### 子クラスタのコンストラクタ
子クラスにおいて、コンストラクタを記述する場合は、下のように`super()`を記述する必要がある。これを行うことで親クラスのコンストラクタを実行し、親クラスの初期化を行うため、子クラスでは、super()を記述せずに、`this.name`のように`this`を扱うことはできない。
``` JavaScript:super()
class Citrus extends Fruits {
    constructor(name,color){
        super(name); //親クラスで定義されているプロパティは親クラスに渡す。

        this.color= color; //super()を記述して初めて、独自のプロパティを定義できる。
    }
}
```
## まとめ
クラス等を使ったオブジェクト指向プログラミングはPythonにもありますが、ずっと敬遠気味で見たことある程度の浅い理解だったので、0から基礎を学ぶことができてよかったです。

また当方かなりの初学者ですので認知に誤りがある部分があればコメントで指摘していただけると幸いです！😸
達人に学ぶSQLのパターンを整理する

## はじめに
本棚に眠っていた達人SQLの本を読み直し、この書き方自分にも使えそうだなと思うものや、実務で使った書き方がいくつかあったので、個人用に簡単にまとめました。
本書では「リーダブルコード」のSQL版みたいな箇所やチューニングなどについても記載されていますが、そこは省きます。

## 目次
[・CASE式](#case式)
[・ウィンドウ関数](#ウィンドウ関数)
[・自己結合](#自己結合)
[・HAVING句](#having句)

## CASE式
```
SELECT 
    CASE WHEN REGION = '1' THEN NUMBER ELSE 0 END AS TOKYO
    CASE WHEN REGION = '2' THEN NUMBER ELSE 0 END AS OSAKA
FROM JAPAN
```

- **何か**
  - 取得結果から取得条件をさらに追加する
- **用途**
    - 複数の取得条件がある場合にSQLを複数書かなくても一つで完結できる
        - 汎用性が高い
    - 使い方によっては処理速度の向上が可能（チューニング）

## ウィンドウ関数
```
関数名 OVER ( 
	PARTITION BY 列名 -- 指定した列をグループ化
	ORDER BY 列名 -- 順番の入れ替え
	RANGE|ROW BETWEEN -- 指定範囲を選択する
)	
```

- **何か**
    - 一部の行毎に対して、集計した結果を表示するSQL
    - 出力結果は対象レコードも全て表示される
    - 下記ブログの解説がわかりやすかったです
        https://laboratory.kiyono-co.jp/462/date_analytics/
- **用途**
    - 集計結果の内訳を表す際に重宝しそう
    - 抽出した内訳データの前後比較にも使用
- **注意点**
    - 実行計画はソートのため、チューニング対応によっては早くなったり遅くなったり分かれる

## 自己結合
```
SELECT SEME.name AS seme, MAMORI.name AS mamori
	FROM Janken SEME INNER JOIN Janken MAMORI
		ON hoge
```
- **何か**
    - 対象１テーブルを複数テーブルのように扱う
- **用途**
    - １テーブル内で組み合わせパターンを出力したい場合に使用

## HAVING句
```
SELECT hoge
	FROM Hoge
	GROUP BY hoge
	HAVING COUNT(*) = COUNT(hoge);
```
- **何か**
    - グループ化したデータに対して、さらに条件を追加する
- **用途**
    - WHERE句では絞り込めない具体的な抽出パターンがある際に使用

## さいごに
改めて読み直してみると参考になる箇所が多くありました。
テーブル加工するSQL文もあったので、実務で使う機会があれば再度読み直して参考にさせていただこうと思います。
個人開発者が、DDDで勘違いしていた事など（CQRS・DB駆動・集約について）

## はじめに

過去に以下の記事を書いております。
[個人開発者が実践したNext.js - T3stack - DDD な感じのアーキテクチャ 【その1 使用技術と全体の構成】](https://qiita.com/jumokuzai/items/2a472afae5a50b0cf77b)

こちらの記事を書いた時点ではまだDDDの理解が浅い状態で、勘違いしている点・見逃していた考え方等が多くありました。
ここ半年程度で更にDDDの学びを深め、実際に実装しアップデートを行なってきた中で気づいた、

**✅勘違いしやすい・見逃しやすいポイント**を紹介したいと思います。

※ この記事内で扱う言葉や定義等は「[ドメイン駆動設計 モデリング/実装ガイド](https://booth.pm/ja/items/1835632)」を参考にしていることが多いです。
※[みんなで作る木の図鑑](https://kinozukan.info)を運営しています。なので木工品を例にした話が出ます。


## 見逃していたこと：CQRS

CQRSとは、`Command Query Responsibility Segregation`の略で、『コマンドクエリ責務分離』と呼ばれます。

DDDでは、エンティティや値オブジェクト、リポジトリ、などデータの更新系の処理に対して様々なクラスが登場し、多くの書籍や記事ではこれらのクラスがよく紹介されています。
しかし、DDDにおけるCQRSの考えでは、参照系はQuery Serviceクラス等が登場するだけで、**✅更新系で使われるクラスは使用されません**。

実際にアプリケーションを開発する時には、更新系のAPIだけでなく参照系のAPIも作成します。
このCQRSの概念を知っておかないと、**本来更新系で使うべきクラスを参照系にも適用してしまい、必要以上に複雑な参照系の実装をしてしまうことがあります**。

### 更新系と参照系は登場するクラスの違い

・更新系に登場するクラスと呼び出しのフロー
```mermaid
flowchart LR
    irepository["集約単位での
    リポジトリインターフェース"]
    repository["集約単位での
    リポジトリ実装クラス"]

    router --> 各種ユースケースクラス
    各種ユースケースクラス --> 集約クラス
    集約クラス -->|コンポジション| エンティティ
    エンティティ --> 値オブジェクト
    各種ユースケースクラス --> irepository
    各種ユースケースクラス -->|時々| ドメインサービス
    repository -->|implements| irepository
```

・参照系に登場するクラスと呼び出しのフロー
```mermaid
flowchart LR
クエリサービスクラス["クエリサービスクラス
内部でPrisma(ORM)を
直で呼び出してOK
"]
    router --> クエリサービスクラス
```


※私のプロジェクトはt3Stack(tRPC)を使用しているので、エンドポイントはrouterファイルで定義しています。

このように参照系は、更新系に比べてかなりシンプルな構成で済ませられます。
更新系のクラスを使って参照系の実装をすると、制約の多いクラス達に阻まれて実装上の課題が発生しやすくなります。

私の知る限り、DDDの書籍や記事などでCQRSについて言及されていることは多いですが、**詳細に説明されていることは少ない**印象で、見逃す・理解が浅くなりやすいのではないかと思っています。


## 勘違いしていた事：DB駆動設計ではない

DDD以外の開発に慣れた開発者は、設計をする際に無意識に脳内にDBのテーブル構造を組み立てていることが多いと思います。
その勢いで、1つのテーブルを1つのエンティティとして扱い実装を進めるのは、DDDとは違うアプローチです。

私の過去の実装はこのDB駆動になっており、各所にDBの知識が流出していました。

本来のDDDでは、
- ドメインについての理解を深める
- モデルを改善する
- モデルをソフトウェアに反映する

というループを回すことで、実際のドメイン領域の課題に対して、改善のアプローチをしていきます。

この中の「ドメインについての理解を深める」という段階は、何をやるでしょうか？
実際の業務に関わっている方やドメインエキスパートから、課題があることを伝えてもらい、その改善を考えます。
その際に、課題を感じている方々の口から「XXテーブルのデータがOOだから〜」みたいな言葉は基本的に出てこないはずです。
**「ドメインについての理解を深める」ために、エンジニアもこれらの人や考え方・言葉に合わせることが大切です。**

そこから、実際のドメインの中で出てくるユースケースや言葉を、モデル・アプリケーションとして表現して、ドメインの中で使われる言葉通りのモデリング・実装をしていくことによって、**DB駆動ではなくドメイン駆動にシフトできます**。


## 見逃していたこと：集約とリポジトリ

過去に私がやっていた実装では、集約という概念はなく、エンティティを直に操作しデータの作成・更新に利用していました。
ドメイン駆動での開発が進むにつれ、**集約の概念がないとコードにドメインを反映させることが難しくなる**ということが分かりました。

集約のルールとして、
- 強い整合性確保が必要なもの
- 同一のトランザクションで処理する

というものがあります。

例えば、「木工品を登録する」というユースケースでは、「木工品」という集約を扱います。
この「木工品」という言葉に含まれる内部のデータは、複数のエンティティや複数のテーブルにまたがっていても問題ありません。
ただ、これらは整合性を持った一つの集約のデータとして扱います。

つまり「木工品を登録する」を表すために、**「木工品」の集約をまるっと同一トランザクションで登録する**。ということが実現できればOKになります。

「木工品を登録する」という**ドメインの言葉をそのままコードで表現している**ということです。

そして、この「木工品集約」は、**この集約のままリポジトリクラスに引き渡され、その内部で複数のエンティティや複数のテーブルにまたがっていても、同一のトランザクションで永続化される**ことになります。
なので、リポジトリクラスは集約単位で作成すると扱いやすい実装になります。

### トランザクションの記述位置
また**トランザクションの記述位置**についてもメリットがあり、
過去の実装では、集約がなくエンティティのみを扱っていたので、ユースケース層の処理内にトランザクションを張らざるを得ませんでしたが、集約+集約に対応したリポジトリのおかげで、トランザクションやPrismaの依存をリポジトリ内に閉じ込めることができました。

## 以上

今回の記事は、自身の過去の勘違いや失敗を元にアップデートした内容をテキストでまとめてみました。
追々、実際のコードについても紹介する記事を書きたいと思っています。

それでは今回はここまでです。
ウォークフォワード２

TOPIX Core to Mid→TOPIX Core to Small2に変更したら、マンガみたいな成績になった。何かの間違いと考えておこう。
![ret_2000_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303759/424c6f0a-3e46-ed7e-4ecc-5b89139a64b9.png)
![ret_2000_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303759/fe983750-1e6d-ff7a-e7e6-d12ba03cbbf0.png)
![ret_2000_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303759/79f954ee-acd5-e9f1-534a-4bd7f77603e7.png)
![ret_2000_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303759/6f3196f6-8d43-3ae8-df50-b62b3b8ed1eb.png)
![ret_2000_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303759/650241e1-54fe-e767-fae8-9fd45515bb11.png)
![ret_2000_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303759/7d13e2fd-b4e6-b3fd-4a3e-de8335758db1.png)
Amazon-q for command lineでクソデカバグに出会った話

# 概要
MacOS用アプリ「Amazon-q for command line」を知っていますか。
MacユーザーかつDeveloperなら必ず入れてると思います。
`brew search`すると、amazon-qという名前の彼です。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928092/afbf0fd8-300b-2d80-5a0f-6303fab9e09d.png" width="20%">

Amazon-q はターミナルやコーディング中に使える、最強の入力補完ツールです。vscodeの拡張機能で、「あ、このオブジェクトは何のメソッド持ってたっけ…？」といったときにさらっとリスト表記してくれるあいつです。あれがターミナルでもどこでも活躍してくれるようになったverです。強いです。

# 症状
急に動かなくなりました。原因は本当に、全く、これっぽっちも心当たりがありません。

いつも通り amazon-q の入力補完に頼ろうと思ったところ、次のエラーが吐かれました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928092/052345d0-acd0-20f0-29c0-2465dd52c720.png)

そして、こいつが何をしてもずっと消えない。ここで、一旦試したことを全部書いてみます。

- q restart(再起動)
- q logoutからのq login
- q doctor
- amazon-qの再インストール
- 繰り返しReport

とりあえず、「amazon-q」内のコマンドで問題解決はできないと分かりました。そこからはもうやけになって、「homebrewが悪さをしているのではないか」「自分以外でも同じ状況の人はいないか」と迷走しまくってました。

# 改善方法

[このリンク先](https://docs.aws.amazon.com/ja_jp/amazonq/latest/qdeveloper-ug/command-line-getting-started-installing.html)から、アプリをインストール、開くと直りました。
~~インストール後もしばらくゴタゴタしたという話もあります~~

とにかくおかえりなさい、いつもの入力補完くん..。長い戦いだった...。

# ひとりごと
amazon-qについての記事少なすぎませんか？Macユーザーなら全員使っていると思ったのに、それ関連の記事が少なすぎてトラブルシューティングでめちゃめちゃ苦労しました。

とりあえず、アプリもダメ、homebrewもダメならdmgファイルからマウントするのが大事らしい。Mac難しい。
ThinkPadをすこれ！

# TL;DR
####  ThinkPadのいいところ
1. 安い
1. タイプしやすいキーボード
1. 端子が豊富
1. 頑丈
1. Linuxとの相性がいい

**ThinkPadを買おう！！**

# ThinkPadを応援しよう！

僕のQiitaデビューは，ThinkPad教の信者の1人としてThinkPadの好きなところを叫ぶ記事です．

ThinkPadは1992年にIBMから発売された，30年以上の歴史を持つノートPCブランドです．
2005年以降，ThinkPadブランドはLenovoに売却されましたが，真っ黒で無骨な男らしいデザインは継承され，~~社畜よろしく~~ビジネスパーソンに愛されるラップトップとして世界中にファンがいます．

**みんなでThinkPadを買おう！！**


# 1. 安い
まず一番大事なポイント．値段のお話．ThinkPadはシェアが大きくて大量生産するため安いです．モデルチェンジしてもほぼ見た目は同じなんで，多分部品も流用できてコストも下げられるんだと思います．多くの企業でThinkPadが社用のラップトップとして使われていて，リース落ちになった昔の安いモデルが中古市場に溢れます．**お金のない学生はThinkPadを買おう！！**

# 2. タイプしやすいキーボード
いろんなノートPCを触ってきましたが，個人的にMacBookとSurfaceとThinkPadのキーボードはタイピングしやすいと感じました．ThinkPad トラックポイント キーボードと呼ばれる，ThinkPadのキーボード部分だけちぎってきたみたいなキーボードが存在するくらい，ThinkPadのキーボードは人気です．

https://www.lenovo.com/jp/ja/p/accessories-and-software/keyboards-and-mice/keyboards/4y40x49493

最大の人気の理由は，ホームポジションを崩さないようにレイアウトされたトラックポイント（またの名を赤ポチ）とクリックボタンだと思います．**キーボードにこだわる人は，ThinkPadを買おう！！**

# 3. 端子が豊富
最近のノートPCの薄さには驚きます．どんどんスタイリッシュなデザインになって，減っていく端子たち，増えるハブ，，，
僕の周りはMacBookユーザが多いのですが，さすがに端子すくな過ぎて不便そうに見えます．USBメモリ刺したいときありますよね？プロジェクタにHDMIでつなぐことありますよね？
一方，ThinkPadは最新モデルでも，しっかり端子をつけてくれています．HDMIにUSB Type-C，もちろんUSB Type-Aも．**拡張性を重視する人は，ThinkPadを買おう！！**

# 4. 頑丈
ThinkPadはどんな環境でも使えるよう，米軍規格の品質テストを行っており，作りが頑丈で信頼性が高いことで有名です．社用のPCとして雑に扱われることを想定しているのでしょう．交換用のパーツも入手性がよく，交換用のバッテリーとかキーボードとか，Amazonとかで普通に購入できます．分解も比較的簡単でメンテナンス性も抜群です．僕なんか結構がさつで，PCをよくぶつけたり落としたりするので，頑丈なThinkPadを選びたいと思うわけです．**そそっかしいエンジニアはThinkPadを買おう！！**

# 5. Linuxとの相性がいい
上に挙げたような理由で，キーボードにこだわるエンジニアにはThinkPadユーザが多いです．一般的にエンジニアはデフォルトのWindowsよりもunixベースのOSを好むので，みんなThinkPadにLinuxを入れたがるわけです．そういうわけでThinkPadはLinuxディストリビューションのサポートが手厚く，コミュニティも大きいです．僕もバグりまくるWindows11に嫌気がさしてThinkPadにLinux Mintをインストールしました．トラックパッドの挙動がよくないとか指紋センサーが使えないとか細かい不満はありますが，概ねサクサクで満足です．**LinuxユーザはThinkPadを買おう！！**


#    まとめ
**ThinkPadを買おう！！**

https://www.lenovo.com/jp/ja/c/laptops/thinkpad/
API Gateway + API Key認証で403エラーが返ってきた際に対処したこと

# はじめに
API Gatewayのエンドポイントをコールした際に403エラーが返ってきました。エラー解決の際に確認した点を本記事にまとめておきます。


# 解消のためにやった事（結論）
- API GatewayのステージとAPI keyの使用量プランを紐づけました（実施忘れ）
- OPTIONメソッド（プリフライトリクエスト）のAPI Keyが必須のチェックを外しました


# 環境
- フロントエンド: Vite + React
- バックエンド: AWS API Gateway + Lambda
- 認証: API Key認証


# 発生していた問題

PostmanからAPIのエンドポイントに対してのPOSTリクエストを送った際に、ステータス`403`で下記のレスポンスが返って返ってきました。

```JSON:response
{
    "message": "Forbidden"
}
```

# エラー事象発生の経緯
1. API Gatewayで新規APIを作成し、API認証にAPI Keyを使用する設定
2. API Keyを生成し、使用量プランを作成して紐づけ
3. CORS設定の有効化を設定
4. Viteで起動したローカルのフロント環境からAPIをコールしたところCORSエラーが発生
5. CORSエラーの確認のため、PostmanでAPIを直接コールしたところ403エラーが発生
6. API Gatewayと統合しているLambdaのCloudWatchログを見ても、該当の時間の実行ログ自体が出力されていないことを確認

これらの経緯から、APIリクエストがLambdaまで到達する前の認証段階で失敗していることが判明。


# 原因 & 対応

**原因1：使用量プランとステージに紐づけができていなかった**

- 対応：対象の使用量プランから > `ステージを追加` を押下し、対象のAPIとステージを選択して紐づけて完了

**原因2：OPTIONメソッドのAPIキーは必須のチェックを入れていた**

- 対応：対象のAPIを選択し、メソッドリクエストを編集 > `API キーは必須です`のチェックを外して完了

上記2点の対応を行い再度エンドポイントにPOSTリクエストを送ると、正常に想定のレスポンスが返ってきました。

# 参考
https://future-architect.github.io/articles/20200717/
Webページにミニマップを実装

# はじめに
Visual Studioのコンフィグファイルの表示を見て、この右側の表示をWebページで再現したいと思い作ってみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3779420/db5d8cad-2590-efdd-11d7-eab4f2e88870.png)

調べたところ、これはミニマップと呼ぶそうです。

# サンプル

<p class="codepen" data-height="600" data-default-tab="result" data-slug-hash="oNKQZgB" data-pen-title="Untitled" data-user="cjlsrdxi-the-builder" style="height: 600px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/cjlsrdxi-the-builder/pen/oNKQZgB">
  Untitled</a> by masayasu_t (<a href="https://codepen.io/cjlsrdxi-the-builder">@cjlsrdxi-the-builder</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

# ポイント
１．ミニマップの画像はElementをsvgにしてbase64形式に変換し、backgroundImageに設定
```javascript:Element ⇒ svg ⇒ base64 ⇒ backgroundImage
const main = document.getElementById('main');
const img = document.getElementById('mapImg');
const xmls = new XMLSerializer();

const svg = '<svg xmlns="http://www.w3.org/2000/svg" width="' + main.offsetWidth + '" height="' + main.offsetHeight + '">'
          + '<style>'
          + document.getElementsByTagName('style')[0].innerText
          + '</style>'
          + '<foreignObject width="100%" height="100%">'
          + xmls.serializeToString(main)
          + '</foreignObject>'
          + '</svg>';

const mainImg = 'url(data:image/svg+xml;utf8;base64,'
              + btoa(encodeURIComponent(svg).replace(/%([0-9A-F][0-9A-F])/g, function (match, regexpMatch1) {return String.fromCharCode('0x' + regexpMatch1);}))
              + ')';

img.style.backgroundImage = mainImg;
```

２．マウスオーバーで表示させる画像の範囲は「backgroundPosition」で設定
```javascript
map.addEventListener('mousemove', dispGide, false);

function dispGide(e) {
  const gide = document.getElementById('mapGide');
  
  gide.style.backgroundPosition = '0 -' + (((e.pageY - window.scrollY)
                                           * document.documentElement.scrollHeight / document.documentElement.clientHeight
                                           * gide.offsetWidth / main.offsetWidth
                                           - gide.offsetHeight / 2)) + 'px';

  gide.style.top = Math.max(Math.min(e.pageY - gide.offsetHeight / 2, document.documentElement.clientHeight + window.scrollY - gide.offsetHeight), window.scrollY) + 'px';
}
```

３．長文はChatGPTに書いてもらう。
ChatGPTに4節で、各節が３小節に分かれていて、各小節が２段落の文章を書いてもらいました。
内容に誤りがあるかは分かりませんが、htmlのサンプルとしては十分なものが簡単に作れます。
Djangoのアプリを作成し、ローカル環境で動作させるまで

# 目的
- Django で簡単なアプリを作成
- 作成したアプリをローカル環境で動作

# 前提
- OS
    - macOS Sonoma 14.6
- 各バージョン
    - python 3.12
    - Django 5.1.3

# 準備
### プロジェクトを作成
```bash
django-admin startproject {プロジェクト名}
```
```bash
# 例）「sampleProject」というプロジェクトを作成
django-admin startproject sampleProject
```

### アプリを作成
```bash
cd {プロジェクトのディレクトリ}
python manage.py startapp {アプリ名}
```
```bash
# 例）「sampleProject」のプロジェクトに「sampleApp」のアプリを作成
cd sampleProject
python manage.py startapp sampleApp
```

### ローカルサーバー起動
```bash
python manage.py runserver
```

# 実装
### ルーティングを定義
アプリごとにルーティングを定義するため、各アプリのディレクトリ配下に`urls.py`という新規ファイルを作成
```python
# sampleProject/sampleApp/urls.py

from django.urls import path
from . import views

app_name = 'sampleApp'
urlpatterns = [
    path('', 'views.index', name = 'index'),
    ...
]
```
- `app_name`にはアプリ名を代入する
- `path()`でURLと関数を対応づける。引数は以下の通り
    - 第一引数：URL
    - 第二引数：呼び出したい関数（ビュークラス）
    - 第三引数：ルート名

アプリごとに定義したルーティングをプロジェクトのディレクトリ配下にある`urls.py`へ追加することで、プロジェクト全体にルーティングを反映

```python
# sampleProject/sampleProject/urls.py

...
# 「include」を追加
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    # アプリごとにルーティングを追加
    path('sampleApp/', include('sampleApp.urls')),
    ...
]
```
上記の定義をすることで、「sampleApp」で呼び出す関数に対応するURLの先頭に「sampleApp」の文字列が必須となる

### ビュークラスを作成
`sampleProject/sampleApp/urls.py` で定義したルーティングで呼び出したい関数（ビュークラス）を作成
例として、今回は IndexView クラスを作成
```python
# sampleProject/sampleApp/views.py

from django.shortcuts import render
from django.views import View

class IndexView(View):
    def get(self, request):
        return render(request, 'sampleApp/index.html')

index = IndexView.as_view()
```
- IndexView クラスは View クラスを継承
- `render()` の第二引数は画面表示（返却）したい HTML ファイルを指定
- `as_view()` によって IndexView クラスを関数に変換
    - 今回は `urls.py` で `path()` の第二引数に `views.index` と指定したため、変数名を `index` と定義

### テンプレートを作成
ビュークラスの戻り値で指定したテンプレートファイルを作成
```html
# sampleProject/templates/sampleApp/index.html

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>sampleProject</title>
</head>
<body>
    <h1>sampleApp</h1>
</body>
</html>
```
テンプレートファイルに対する設定を追加
```python
# sampleProject/sampleProject/settings.py

...
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        # テンプレートファイルを格納するディレクトリパスを指定
        'DIRS': [BASE_DIR / 'templates'],
...
# 日本語対応設定
LANGUAGE_CODE = 'ja'

# 日本のタイムゾーン設定
TIME_ZONE = 'Asia/Tokyo'
...
```

# 動作確認
以下の URL にアクセス
http://127.0.0.1:8000/sampleApp
![sampleApp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123079/c87d9349-4452-59fd-c38f-3835d1eb0ed7.png)
WSL環境にsailで開発したLaravel＋Reactのプロジェクトを移動させたと気にはまった話。GET http://[::1]:5175/resources/js/app.jsx net::ERR_CONNECTION_REFUSED

## はじめに

sailを使ってwindowsのローカルに
インストールしたLaravel＋React＋Inersia。

開発している際ブラウザで動作確認するとき、毎回ローディング時間が長い。。。
開発ができないわけではないけど、効率上げるためにWSLに移動させました。

### なので移動する前は問題なく開発ができていました。

そして移動してdockerを立ちあげてからlocalhostにアクセスすると真っ白。
デベロッパーツールには以下のエラーが。。。
```
GET http://[::1]:5175/resources/js/app.jsx net::ERR_CONNECTION_REFUSED
```

## 結論
プロジェクト名/public/hot
上記のファイルを削除すること真っ白の画面がなんと、表示されました。

もう、、、いろいろいじったのでこれだけではないかもですが
デベロッパーツールに見覚えのないポート番号でエラーになってたら疑ってみてよいです。

ポート5175なんてymlファイルにもdockerfileにもvite.config.jsにも設定してない。
なんだこれって思ってたけど、検索にヒットしない。
デフォルトかなって思ってましたが

public/hotの中身が。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832683/f32e9b46-e667-2a08-c1d6-2be6f6814b02.png)

　
エラーまんまのポート(笑)
今まで動いてたのにwsl環境に移したら急にこれ拾うん？謎。。。

## 他にもやったこと

ここからは意味がなかったかもだけどいろんな記事を試したので
解決しなかったら見てみてください。

### メインのポートとnpm run devのポートは別にする。

ポートが競合してサーバーつながらなくなる。
これはほんとに関係ないけど。
npm run devとメインポート（localhost）が同じでないといけないと思ってましたが
逆に別ではいといけない。

自分は5173と80にポートを設定して
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832683/d29281e5-b1f7-9698-41fa-c3e00b57fb46.png)
npm run devをした際はポートを5174などかぶらないようにした。
この場合5174にアクセスすると画面が出ることを確認する。
5173はアクセスできないのはなんでだろ？？？


### vite.config.jsの追記

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832683/cf7bfb7a-6be7-b053-f9d1-645486327d54.png)

13～20行目の追記
こんな追記なくても動いたけど、記事を見ると13～17は結構皆さん書いてます。
portはポートの指定。
strictPortは上記のポートが使われていたらエラーを出してほかのポートにアクセスしない。
【Git】ブランチ名を変更する方法

以下のコマンドを実行することでブランチ名を変更できます。

```terminal
git branch -m '古いブランチ名' '新しいブランチ名'
```

カレントブランチの名称を変更する場合には以下のコマンドで変更できます。

```terminal
git branch -m '新しいブランチ名'
```
Raspberry Pi PicoとMicroPythonで作るマウスジグラー

## マウスジグラー

パソコンを付けたまま放置すると、一定時間で画面消灯やスリープに入ることがあります。
この動作を防ぐためにマウスを操作し、わずかにマウスポインタを動かすことを繰り返せばよいのですが、ずっと操作しづつけるのは大変です。
そこで、マウスジグラーという、マウスポインタを動かし続けるUSBデバイスがあります。
パソコンからは標準的なUSBマウスに見えるため、USBメモリなどの接続が禁止されているパソコンでも利用可能です。

マウスジグラーはAmazonなどでも取り扱いがあるのですが、怪しい輸入品が多く、手を出すのが怖そうです。
そのため、自作することにしました。

注意：オンラインゲームのチート対策ツールにチート用デバイスと認識される可能性があるため、使わないときはマウスジグラーを外しましょう。

## Raspberry Pi Pico

Raspberry Pi Pico（以下、Pico）は、シングルボードコンピュータで有名なRaspberry Pi財団が出しているマイコンボードです。
1,000円ちょっとで買えるため、お手軽にデバイスを作るのに最適です。

Picoにはいくつかのシリーズがありますが、
今回は記事執筆時点で最新のPico 2を使います。

## MicroPythonを導入

PicoのBootボタンを押しながら、PicoとPCをUSBケーブルで接続します。
すると、PC上ではストレージとして認識されます。
そのストレージ上に拡張子がuf2であるMicroPythonのファームウェアをコピーします。
コピーすると、自動的にストレージとしての認識が解除されます。

最新のPico2向けファームウェアは以下のサイトからダウンロードできます。

https://micropython.org/download/RPI_PICO2/

## Thonnyを導入

以下のサイトからThonnyをインストールしてください。

https://thonny.org/

以下、割愛しますが、ネット上でLチカなどと検索すると、ThonnyでPicoをプログラムする記事が見つかります。
PicoのLEDをチカチカ光らせることができる状態にして、次の節に移ります。

## PicoをUSBデバイスとして作成

さて、ここからが本題。

MicroPythonにはマイコンをUSBデバイスとして認識させる仕組みが標準ライブラリにありますが、
USBのメッセージ処理を自分で実装する必要があり、とても大変です。
そこで、簡単にマウスとして認識させることができるパッケージを使います。

メニューバーの「ツール」から「パッケージを管理...」を開いてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105381/0ff45057-a83c-c520-3e7e-3adca7de67a8.png)

パッケージ管理ウインドウ上部の検索ボックスに「usb_device_mouse」と入力し検索すると、
下図赤枠に導入したいパッケージが見つかるため、青色のリンクをクリックし、
インストールします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105381/7326cbf2-f265-7c98-bfdf-449b1c5a4bbc.png)

すると、Picoのストレージ上に`lib`フォルダが作られ、そこにパッケージのファイルがコピーされます。

あとは、Picoのストレージ上に`main.py`という名前でファイルを作り、
次節のソースコードを貼り付け保存します。
ソースコードの内容は、1秒ごとにLEDが点滅し、同時にマウスカースルが1ポイント分左右に動くというものです。
PicoをPCから取り出し、再度USB接続するとプログラムが自動的に動き出します。

ちなみにマウスとして認識されていても、Thonny上でプログラミングできるので、ツールバー赤色の停止ボタンを押してプログラムを停止させることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105381/a1ffdb44-2149-84b7-5203-7ff86a484881.png)

## ソースコード

```python:main.py
import time
import usb.device
from usb.device.mouse import MouseInterface
import machine

led = machine.Pin(25, machine.Pin.OUT)
m = MouseInterface()

usb.device.get().init(m, builtin_driver=True)

while not m.is_open():
    time.sleep_ms(100)

time.sleep_ms(1000)

while True:
    m.move_by(-1, 0)
    led.value(1)
    time.sleep_ms(1000)
        
    m.move_by(1, 0)
    led.value(0)
    time.sleep_ms(1000)
```
がんばらない競プロ千里行 〜AtCoder入緑を目指して〜【1日目：JavaScriptで始める茨の道】

# はじめに
Qiitaを見ていると競プロの色の話がよく出てくる。それを見て自分もやる気が出てくる日が今までに何回かあったけど（今日）、持続した最高日数は2日。
習慣化と、成長記録＋備忘録も兼ねてQiitaにこの長い長〜い道のりを残したいと思います。

まず筆者はこういうステータスの持ち主です。

# 筆者（@KyongminS）のスペック
- 学部までは電気電子工学系、大学院は情報系の研究室にいた
- 来年（2025年）で社会人4年目
- プログラミングは完全独学から始めて今年（2024年時点）で6年目
- 仕事以外はプログラミングしない（ただ土日に友達の仕事を手伝うとかで大体触っている）。独学は必要になったらやる程度
- 3日坊主。好きな言葉は「YAGNI」
- 好きな言語はJavaScript。フロントエンド、バックエンド、ブラウザ、アプリまでなんでも作れるから
---
今までの挫折の原因の一つに「ゴールを決めていなかったこと」があると思うので、ゴールを設定します。
あと、やらないことも決めておきます。変にやる気が出そうなことは特に除外します。

# ゴール
:::note
2025/3/31までにAtCoderで入緑する
:::

途中で「入茶」の壁があるので、中期ゴールも設定します。

:::note
2025/1/15 までにAtCoderで入茶する
:::


# やらないこと
平日休日関係なく守ります（※ 土日のAtCoderのコンテスト参加時は除く）。

:::note alert
1. 1日2問以上練習問題を解くこと
2. 1時間以上競プロに時間を割くこと
2. 練習問題で解答見ない縛りをすること
2. 「入水」を目指すこと
2. JavaScript以外の言語に浮気すること
2. 他人と比較すること
:::


# 使うツール
こちらも必要最低限に抑えます。ポモドーロとか使い始めると挫折の可能性が高まるので使いません。
- VSCode
    - 必携。この際Vim縛りにしてついでにVimマスターしようかなと思ったけど、続かない要因になりそうなのでVSCodeを使う
- リマインダー
    - Macに初期搭載されているアプリ。こちらでやっていなかったらリマインドが来るようにする。ツール探しもできるだけサボる
- Qiita
    - 日報代わり。各記事もできるだけ簡略に書く

# 参考記事
このQiitaの記事だけにします。一つの参考書を使い古した高校生の時のように、この記事だけを頼りに競プロを進めていきます。

https://qiita.com/e869120/items/f1c6f98364d1443148b3

---
早速先ほどの参考記事を見ると、
- AtCoder:AtCoder Beginners Selection

https://atcoder.jp/contests/abs/tasks

- AOJ:Introduction To Programming I

https://judge.u-aizu.ac.jp/onlinejudge/finder.jsp?course=ITP1


をやれと仰られているのでこれからやっていきます。

# アルゴリズムの学習
先ほどの参考記事を見て学習します。1日30分くらい。

# AOJ
## Introduction To Programming I
### Hello World
クソ余裕。罠かと思ったくらい。
```js
console.log("Hello World");
```

ACいただきました。

# AtCoder
## AtCoder Beginners Selection
### PracticeA - Welcome to AtCoder
挨拶がわりにしてはちょっとめんどくさそうと思ってしまった。
```js
const [_a, _bc, s] = require("fs").readFileSync("/dev/stdin", "utf8").split("\n");
const a = parseInt(_a, 10);
const [b, c] = _bc.split(" ").map(v=>parseInt(v, 10));

console.log(a+b+c, s);
```

ACいただきました。
最初間違えてDenoで走らせて「RE」となったので「あれ？」と思ったけど、ランタイムが変わるので標準入力周りの記法が違うみたい。そらそうか。
でもNode.jsの方が4倍早い。
```js:Deno
const input = new TextDecoder().decode(await Deno.readAll(Deno.stdin));
```

![スクリーンショット 2024-11-10 23.33.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374872/c6822d70-2741-db6c-8781-f46429dd04cd.png)

今日はこの辺で。

### ダメ出し、アドバイスなど大歓迎です。

# 余談
Macを使う時全画面表示で時間がわからなくなる時があるので、AtCoderの右下の時計機能は欲しいと思った。

![スクリーンショット 2024-11-10 23.15.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374872/4166312e-c9c9-6ab2-5434-d290ab32bf45.png)

# 余談2
この記事を書くこと自体が挫折の要因になるくね？と思った方。
はい。その通りでございます。挫折しそうです。
VScode上のターミナルで、自身のディレクトリ名が延々まぎれこむバグ

# 症状
Enterキーを押すと、現在のディレクトリ名が延々表示され続ける。

![Screenshot 2024-11-18 at 6.07.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928092/b14809cb-9ff8-5d1b-a97e-ecfab16fc4a9.png)

以下の方法を試したが，結果は変わらなかった．
- resetコマンド
- exitコマンド
- clearコマンド
- ctrl + C
- ctrl + D
- ctrl + Shift + ^
- codeの再起動

# 原因
既に存在するディレクトリに対して，その名前を変更すると起こる．
今回の事例でいうと，元々「research_new」という名前のディレクトリで作成したが，その後「research」に改名した．

また，使用しているパッケージは以下の二つであり，ディレクトリの改名前にそれぞれinitを行なった．
- git
- rye

# 改善方法
### 1) ディレクトリ名の再変更
ディレクトリ名を元に戻した上で「exitコマンド(ターミナルの強制終了)」を行うと消える．

![Screenshot 2024-11-18 at 6.46.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928092/485226ff-d429-fd19-7bc6-74549a9748ec.png)

ただし，その後やはりディレクトリ名を変更すると同様の現象が起こる．これでは，一度ディレクトリを作成するとその後自由にディレクトリ名を変更できないので，大変よろしくない．

### 2) .zshrcの再読み込み
「source ~/.zshrc」を行うと，一時的にバグが消える．

![Screenshot 2024-11-18 at 6.47.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928092/3c95cb70-3a39-ff54-777f-ef42b8a9e539.png)

しかし，「exitコマンド(ターミナルの強制終了)」後に再起動させると同じ現象が起きるため，その場しのぎ的な改善方法である．

# 結論
有識者の方，より良い改善方法を教えて下さいm(_ _)m

# ひとりごと
間違った改善方法を書いていたので，この記事は大幅に加筆修正されたという話があります．
エラー発生（未解決）画像保存、表示がされない。→解決済み

## はじめに
今ペット用健康管理アプリを作っています。
マイページに登録したペットの写真を表示したいのですが、どうしても表示してくれません。(Active Storageインストール済）
表示以前にDBに保存してくれません。
```my_page.html.erb
<% @pets.each do |pet| %>
  <div class="content_post" style="background-image: url(<%= image_tag @pet.image %>);">
    <p><%= pet.pets_name %></p> <!-- ペットの名前を表示 -->
    <span class="kind">
      <%= pet.kind %> <!-- 種類を表示 -->
    </span>
    <span class="sex">
      <%= pet.sex.name %> <!-- 性別を表示 -->
    </span>
    <span class="birthday_id">
      <%= pet.birthday_id %> <!-- 誕生日を表示 -->
    </span>
    <span class="family_day_id">
      <%= pet.family_day_id %> <!-- 家に来た日を表示 -->
    </span>
  </div>
<% end %>
```
```users_controller.rb
class UsersController < ApplicationController
  def my_page
    @pets = current_user.pets
  end
end
```

```models.user.rb
class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable
        
   has_many :pets, dependent: :destroy
  end
  ```
  ```
  NoMethodError in Users#my_page
Showing /app/views/users/my_page.html.erb where line #2 raised:

undefined method `image' for nil:NilClass           
<% @pets.each do |pet| %>
  <div class="content_post" style="background-image: url(<%= image_tag @pet.image %>);">
    <p><%= pet.pets_name %></p> <!-- ペットの名前を表示 -->
    <span class="kind">
      <%= pet.kind %> <!-- 種類を表示 -->
    </span>
```
そもそもimageが定義されていない？ActiveStorageがうまくインストールされていない？

## おわりに
完全に私事の内容ですが、AIに何度聞いてもダメでした。
基本に立ち返り明日すっきりした頭でまた考えて解決したいと思います。
AWS Tagを登録して検索したけど、やり方によって結果が違う！？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2680230/50e1a437-058d-3f2b-fcd9-8a92f405bb7f.png)

# はじめに
AWS は使った分だけ費用がかかるので、使わないリソースは削除しています。
リソースを検索するのに**タグ**を登録しますが、タグを検索する方法は複数あるので違いを体感してみました。

**やり方によって結果が異なるので注意が必要です！**


**【検索対象】**
- タグ： Key = Project, Value = abc
- リソースは、VPC、EC2、S3、IAM などが含まれる
- リソースは、複数のリージョンで、グローバルも含まれる

# AWS Resource Explorer
AWS Resource Explorer はリソース検索および検出サービスで、名前、タグ、 などのリソースメタデータを使用してリソースを検索できます。

### タグ検索
- 表示 : all-resources
- クエリ : タグキー = Project, タグの値 = abc

### タグ検索結果
- 15 件

# Resource Groups & Tag Editor
AWS Resource Groups は、多数のリソースのタスクを一度に管理および自動化できるサービスで、AWS リソースを整理できます。

### タグ検索
- リージョン : All regions
- リソースタイプ : All supported resource types
- タグ – オプション : タグキー = Project, オプションのタグの値 = abc

### タグ検索結果
- 11 件

# AWS CLI
コマンドを実行

### タグ検索
```
> aws resourcegroupstaggingapi get-resources --tag-filters Key=Project,Values=abc --profile xxx
```
※xxx は、環境プロファイルを指定

### タグ検索結果
- 67 件　※ただし、検索結果の ARN に重複有り

# おわりに
実際に検索してみて結果に差が出る事に驚きました。特に CLI は一番使えそうと思いましたが、リージョンが限定になり、ARN も重複してしまって、使いにくいですね。
また、ハンズオンを終えてリソースを消していく途中でも確認したのですが、若干の差がありました。一番反映が早かったのは、"AWS Resource Explorer" でした。

今回の体感から、今後のタグ検索は **AWS Resource Explorer** を継続して利用します！

---
**参考（感謝）**
- [特定のタグが付いた AWS のリソース一覧を取得する方法を教えてください](https://dev.classmethod.jp/articles/tsnote-list-aws-resources-from-tag/)
Next.jsの「"use client"」「"use server"」とは？使い方をまとめてみた

Next.jsで「use client」と「use server」を使い分けることで、効率的にアプリケーションを構築することができます。それぞれの役割と使い方を整理し、Reactフックを使う際の注意点についてまとめてみました。

## 1. "use client"
**use client**は、クライアントサイドで実行する必要があるコンポーネントに指定します。この指示を使うことで、ユーザーのインタラクションが可能なコンポーネントを構築できます。

### 主な特徴と役割

useStateなどの多くのReactフックは、use client指定のコンポーネント内でのみ利用可能です。
クライアントサイドで実行が必要なReactフック

useState: 状態管理のためのフックで、クライアント側での実行が前提。

useReducer: useState同様。

useEffect: DOM操作やAPIリクエストなどの副作用を処理。サーバーサイドにはDOMがないため、クライアントサイドでのみ利用。

useRef: DOM要素への参照やレンダリング間で変わらない値の保持。DOMがクライアント側でのみ利用可能なため。

useLayoutEffect: DOMの変更がレイアウトに与える影響を処理するフック。DOMのレンダリング直前に呼び出され、サーバー側では効果がないため、クライアントサイドでのみ使用。

### 使い方
クライアントサイド専用コンポーネントでは、ファイルの最初に"use client"と記述します。これにより、クライアントサイドで実行されるコンポーネントとしてマークされます。

```React:React
// ファイルの最初に "use client" を記述
"use client";

import { useState, useEffect, useRef, useReducer, useLayoutEffect } from 'react';

function MyComponent() {
  const [state, setState] = useState(0);
  const ref = useRef(null);

  useEffect(() => {
    // 副作用の処理
  }, []);

  return (
    <div ref={ref}>
      <p>State: {state}</p>
      <button onClick={() => setState(state + 1)}>Increase</button>
    </div>
  );
}

export default MyComponent;
```

## 2. 「"use server"」
非同期関数内の冒頭に**"use server"**を追加することで、クライアントから実行可能であることをマークできます。
このような関数をサーバーアクション（Server Action）と呼ばれます。

```React:React
// 以下サーバーアクション
async function example(data) {
  'use server';
  // 関数本体...
}
```

関数すべてにuse serverを指定する代わりに、ファイル冒頭に指定することもできます。
その場合は、そのファイル内のすべての関数がサーバーアクションとしてマークされます。
※非同期関数のみしか指定できない。

### まとめ
エラーがでたからuse clientを追加するのはやめて、なぜ必要なのか理解してよりよい開発をしていきたいと思います。
プログラマーにとって姿勢を保つ重要性

長時間同じ姿勢で座り続けることが多いプログラマーは、他の職種に比べて姿勢が悪くなりやすく、筋肉や関節に負担をかける可能性が高いです。この悪い姿勢は、肩こりや腰痛、頭痛などの身体的な不調を引き起こすだけでなく、長期的には呼吸機能の低下や集中力の低下につながることもあります。

姿勢を保つことで、こうした健康リスクを軽減できるだけでなく、作業効率や生産性の向上、さらにはメンタルヘルスの維持にも役立ちます。体が快適な状態であれば、心もより集中して業務に向かえるのです。

# 姿勢を改善・維持するためのポイント
## 1. 日常的な姿勢の意識
- 立っているとき: 耳、肩、腰、膝、足首が一直線になるように意識します。体が前後に傾かないように重心を整え、肩を自然に後ろに引くことで、胸を広げることができます。
- 座っているとき: 椅子の背もたれに腰をしっかりつけ、背筋を伸ばすと共に、腰・胸椎・首の自然なカーブを意識します。足が床につかない場合は、足台やクッションを利用して調整しましょう。

定期的に姿勢を見直すために、スマートフォンのリマインダーを使ったり、専用の姿勢矯正アプリを活用しても良いでしょう。


## 2. 作業環境の見直し
- デスクと椅子: デスクの高さは、肘が90度に曲がる位置を基準に調整し、モニターの上端が目の高さか少し下にくるように配置するのが理想的です。モニターとの距離は、目から腕を伸ばした位置に画面がくるようにします。

- チェアの選び方: 長時間座っても腰が痛くならないよう、ランバーサポートがある椅子を選びましょう。ランバーサポートがない場合は、腰の部分にクッションや専用のランバーピローを追加してサポートすることも効果的です。

参考リンク
- 「エンジニアのための快適な作業環境作りガイド」https://apollonlog.com/how_to_create_a_work_environment_that_allows_programmers_to_concentrate/
- 「腰痛防止のための正しい座り方」https://engineer-style.jp/articles/10708

## 3. 動きとストレッチを取り入れる
一日中同じ姿勢で座っていると、筋肉が凝り固まり、姿勢が崩れる原因になります。1時間に一度、5分程度の休憩を取り、体を動かすことが理想です。歩く、屈伸運動をする、肩を回すなど、簡単な動きで筋肉の緊張をほぐしましょう。

- ヨガ: 自宅やオフィスでできるヨガポーズとして、「猫のポーズ」「コブラのポーズ」「チャイルドポーズ」などは、背中のストレッチに特に効果的です。これらのポーズは肩や背中を柔軟にし、リフレッシュ効果も期待できます。

- ストレッチ: 椅子に座ったままできる「腰回し」「肩回し」「首のストレッチ」などもおすすめです。アプリ「Daily Yoga」や「ヨガタイマー」などを使えば、自分のペースでポーズをチェックしながら進めることができます。

参考リンク
- 「在宅ワークで使えるオフィスヨガ入門」https://www.example.com/office_yoga_introduction
- 「姿勢改善のためのヨガとストレッチガイド」https://www.example.com/yoga_for_posture_improvement

## 姿勢改善による効果的な集中力の向上
姿勢の改善は、身体の健康だけでなく、精神的なパフォーマンスにも大きな影響を与えます。長時間作業をしても疲労感が減少し、集中力が持続しやすくなるため、作業の質も向上します。また、正しい姿勢は自信を高め、ストレスの軽減にもつながります。姿勢を意識することで、自己管理の意識も向上し、プログラミングや開発業務へのモチベーションアップにもつながるでしょう。

姿勢を改善し、作業効率と健康を同時に手に入れることで、持続可能な働き方を実現しましょう。
【ReactNative】カスタムフックで連打対策を実装

# はじめに
今回は、react nativeで開発をした際に使用していた連打対策のためのカスタムフックを紹介します。

## 背景
画面遷移を行うボタンを連打すると同じページが2回開いてしまうなど、連打できることで問題が発生してしまうコンポーネントがいくつかありました。

また、連打対策をする必要のあるコンポーネントが多数存在したので、利用しやすいカスタムフックで作成しました。

## 実装
```typescript:useDebounce.ts
import { useRef } from 'react';

export const useDebounce = () => {
  const canPress = useRef<boolean>(true);

  const debounce = (onPress: Function, duration: number = 1000) => {
    setTimeout(() => {
      canPress.current = true;
    }, duration);

    if (canPress.current) {
      canPress.current = false;
      onPress();
    }
  };

  return { debounce };
};

```
### 使用例
以下のように、hooksから返される`debounce()`で関数をラップすることで、簡単に連打対策が実現できます。

```tsx
const Button: FC = () => {
  const { debounce } = useDebounce();

  const handleClick = () => {
    console.log('clicked');
  };

  return (
    <button
      onClick={() => debounce(handleClick)} // 連打しても初回クリックから１秒間は無効
    >
      Click
    </button>
  );
};
```
`debounce(handleClick, 2000)`のように、第２引数に任意の秒数(ms単位)を指定することもできます。

## 解説
簡単な実装ではありますが、一応解説です。

`useDebounce`は`canPress`というRefを持っています。初期値はtrueです。

:::note info
useRefについてわからないって方はぜひ[公式のリファレンス](https://ja.react.dev/reference/react/useRef)をご覧ください！
:::


```tsx
<button
  onClick={() => debounce(handleClick)}
>
```
上記のような実装をしたとき、onClickが発火すると`setTimeout`が走ります。

```ts
setTimeout(() => {
  canPress.current = true;
}, duration);
```

durationに設定した時間がたった後(デフォルトでは1000ms=1秒後)、`canPress.current`にtrueをセットします。

その後以下のようなコードが続きます。

```ts
if (canPress.current) {
  canPress.current = false;
  onPress();
}
```

`canPress.current`がtrueの時、if文の中身を実行しています。
`canPress.current`にfalseをセットし、引数のonPressを実行します。

このような実装をすることによって、

1. 初回ボタンクリック時に引数のonPressを実行しつつ`canPress.current`をfalseに。１秒後に`canPress.current`をtrueに戻すタイマーもセット

2. １秒経過する前にクリックされると、`canPress.current`がfalseであるためif文で弾かれてonPressは実行されない


3. １秒経過すると`canPress.current`をtrueに戻すタイマーが作動し、再度クリックでonPressが発火するようになる

という動作が実現できます。

## おわりに
最後までお読みいただきありがとうございました!
もっといい方法をご存知の方はコメントで教えてくださると嬉しいです🙇‍♂️
【Swift】アクセス修飾子

# 概観
【緩い】`open` > `public` > `internal`(デフォルト) > `fileprivate` > `private`【厳しい】

|  |open|public|internal|filelprivate|private|
|---|:-:|:-:|:-:|:-:|:-:|
|同じ型の中でアクセス|○|○|○|○|○|
|同じファイル内の他の型からアクセス|○|○|○|○||
|同じモジュール内の他のファイルからアクセス|○|○|○|||
|異なるモジュールからアクセス|○|○||||
|異なるモジュールでのoverrideやサブクラス化|○|||||


:::note
**モジュール**：コードを配布する単位
- ライブラリ
- フレームワーク(バイナリコードに加えて画像などのリソースもひとまとめになったもの)
- アプリ本体（.appファイル）
:::
## fileprivate
fileprivate：ファイルレベルでの隠蔽を提供しつつ、同じファイル内での柔軟な実装を可能にできる。


```CustomView.swift
class CustomView: UIView {
    // 完全に内部実装として隠蔽したい状態
    private var internalState = false
    
    // 同じファイル内の他の型（例：デリゲート）と共有したい状態
    fileprivate var sharedState = false
    
    private func updateInternalState() {
        internalState = true
    }
}

// 同じファイル内のデリゲート
protocol CustomViewDelegate {
    func didUpdateState(_ view: CustomView)
}

class CustomViewDelegateImpl: CustomViewDelegate {
    func didUpdateState(_ view: CustomView) {
        print(view.sharedState)    // OK - fileprivateなのでアクセス可能
        print(view.internalState)  // コンパイルエラー - privateなのでアクセス不可
    }
}
```

## getter/setterで制限を変える
```swift
// 書き込みはprivate
// 読み取りはinternal
private(set) var id

// 書き込みはprivate
// 読み取りはpublic
public private(set) var id
```
[Karabiner-Elements]JIS配列キーボードで「'（アポストロフィー）」を簡単に入力する

Karabiner-Elementsを開き「Complex Modifications => Add your own rules」から以下のルールを書き込む。
```json
{
    "description": "japanese_kana => Apostrophe",
    "manipulators": [
        {
            "from": {
                "key_code": "japanese_kana",
                "modifiers": {}
            },
            "to": [
                {
                    "key_code": "7",
                    "modifiers": ["left_shift"]
                }
            ],
            "type": "basic"
        }
    ]
}
```
VBA開発する人でも意外と知らないこと

VBAの開発をされる方も、最近は書籍を読み込むのではなく、特定の業務に必要な知識だけをネットや生成AIから得て学ぶ方が増えているようです。しかし、そうした学習方法だけでは、VBAの基礎的なルールや知識が抜け落ちることがあります。

そこで、今回は「基礎的でありながらも見落としがちなVBAのポイント」を独断と偏見でご紹介します。もしかしたら、あなたの知らないことも含まれているかもしれません。

# 1.一行で複数の宣言を行う場合､それぞれに型を明示する必要がある

VBAでは、データ型を宣言しない場合はVariant型になるため、基本的にはデータ型を宣言すべきです。しかし、時々次のように書かれているコードを目にします。

```vb:誤っている例
Dim i, j As Long
```
この例では、変数iもjもLong型で宣言したつもりかもしれませんが、実際にはiはVariant型、jのみLong型として宣言されています。一行で複数の変数を宣言する場合は、必ず各変数ごとに型を明示しましょう。

```vb:正しい例
Dim i As Long, j As Long
```

# ２.オブジェクト変数がNothingであることを確認する場合に使用する演算子

オブジェクト変数を開放するときに「Set rng = Nothing」のように書きますが、条件分岐でオブジェクト変数がNothingかどうかことを確認する際には、「=」ではなく「Is」を使用します。

```vb:誤っている例
 If rng = Nothing Then
```

オブジェクト変数の比較には「Is」を使うのが正しい方法です。（というか、誤ってる方法だとエラーになります。）

```vb:正しい例
 If rng Is Nothing Then
```

# 3.文字列を結合する演算子 & は、前後にスペースを入れ忘れると行末でエンターキーを押したときにエラーとなる場合がある

文字列を結合する際に「&」演算子を用いますが、この際に演算子の前後にスペースを入れないと、行末でEnterキーを押したときにエラーとなる場合があります。例えば、次のようなコードがあったとします。

```vb:誤っている例
Dim headerRow As Long
Range ("A" &headerRow)　'エラーになる
```

このコードはエラーになりますが、次のように演算子の前後にきちんとスペースを入れれば、行末で改行してもエラーが出ません。

```vb:正しい例
Dim headerRow As Long
Range ("A" & headerRow)　'エラーにならない
```

前後にスペースを入れ忘れるとエラーになる（＝自動で前後にスペースを挿入してくれない）のは、1）「&」が型宣言文字であることと、2）VBAでは16進数リテラルは以下のように「&H」をプレフィックスに使用して指定することが原因です。
「&」を多用しているコード行がコンパイルエラーになり、なぜエラーになっているかわからない場合には、「&」の前後にスペースが入っているか確認しましょう。

詳細な解説は、「エクセルの神髄」様の下記の記事をご参照ください。
[参考【エクセルの神髄】様 文字列結合&でコンパイルエラーになる理由](https://excel-ubara.com/excelvba4/EXCEL_VBA_410.htmlL)

# 4.And演算子で短絡評価（ショートサーキット評価）を行わない
VBAでは0で除算した場合にエラーが発生します。

![スクリーンショット 2024-11-10 215946.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479442/63b9e644-4040-aa81-fecd-fc7b3dd120ce.png)

そのため、0除算をし得る場合にはエラー回避をする必要があります。
しかし、下記のようなコードでは、エラーが発生します。

```vb:誤っている例
    Dim x As Long
    x = 0
    If x <> 0 And (10 / x > 2) Then
        Debug.Print "条件を満たす"
    End If
```

エラーが発生する理由は、VBAの And 演算子は短絡評価（ショートサーキット評価）を行わないため、条件式の両方の部分が評価されるためです。

:::note info
短絡評価【ショートサーキット評価】とは、論理演算子の評価の仕方の一つで、左辺の評価で値が確定したら右辺の評価を省略する方式。
:::

そのため、0除算を回避するためには、下記のように記載します。

```vb:正しい例
    Dim x As Long
    x = 0
    If x <> 0 Then
        If (10 / x > 2) Then
            Debug.Print "条件を満たす"
        End If
    End If
```

[参考【エクセルの神髄】様 Select Caseでの短絡評価（ショートサーキット）の使い方](https://www.excel-ubara.com/excelvba4/EXCEL_VBA_449.html)

短絡評価がないVBAでは、特にAndやOrを含む複雑な条件式を扱う際に、エラー回避のため評価の順序に注意を払いましょう。

以上、いかがでしたでしょうか？
これらの細かいポイントを意識することで、より安定したVBAコードを書くことができるでしょう。
FlaskアプリケーションのためのDocker環境構築メモ

FlaskとDockerを使用して画像を並べたポートフォリオサイトを作った時の備忘録です。

## このサイトのキモ

### フォルダ内の画像自動読み込み

imagesフォルダに入れた画像をPythonですべて読み込みそれをギャラリー形式で並べています。

### モーダル表示機能

ギャラリーの画像をクリックすると、拡大画像がモーダルウィンドウとして表示されます。

## プロジェクトの構成
```
project-root/
├── Dockerfile                # Dockerイメージの設定ファイル
├── docker-compose.yml        # Docker Composeによるサービス一括管理ファイル
├── requirements.txt          # FlaskなどPython依存パッケージを指定
├── app.py                    # Flaskアプリケーションのメインコード
├── static/                   # CSSや画像などの静的ファイルを格納
│   ├── style.css             # アプリの基本スタイルを定義
│   └── images/               # ギャラリーに表示する画像を格納するフォルダ
└── templates/                # HTMLテンプレートを格納
    └── index.html            # アプリのメインHTMLファイル
```

### 各ファイル・フォルダの役割

- **Dockerfile**: Dockerでアプリケーション環境を構築するための設定ファイル。Flaskアプリケーションのセットアップ手順が書かれています
- **docker-compose.yml**: 複数のコンテナを管理するための設定ファイル。複数のサービス（例: データベースやWebアプリ）を一括管理するのに便利です
- **requirements.txt**: Flaskや他のPythonパッケージの依存関係を定義しています
- **app.py**: Flaskアプリのメインファイルで、ルーティングやアプリの機能が実装されています
- **static/**: CSSや画像などの静的リソースを保存するフォルダです
  - **style.css**: アプリのデザインやレイアウトを定義するCSSファイル
  - **images/**: ポートフォリオサイトのギャラリーに表示する画像ファイルを格納
- **templates/**: HTMLファイルを格納するためのフォルダ
  - **index.html**: ポートフォリオサイトのメインページとして表示されるHTMLテンプレート

---

## 基本的なDockerコマンドと使い方

### イメージのビルド

```bash
docker build -t my-portfolio-app .
```

このコマンドで、現在のディレクトリにあるDockerfileからイメージを作成し、「my-portfolio-app」という名前を付けます。

### コンテナの起動

```bash
docker run -p 5000:5000 my-portfolio-app
```

このコマンドでコンテナを実行し、ローカルホストのポート5000でFlaskアプリケーションにアクセスできるようになります。

---

## 自動化に向けた設定とツールの活用

### Docker Composeで環境を一括管理

Docker Composeを使うと、複数のサービス（Flaskアプリ、データベースなど）を一括で管理できます。

```yaml
version: '3'
services:
  web:
    build: .
    ports:
      - "5000:5000"
    volumes:
      - ./templates:/app/templates
      - ./static:/app/static
    environment:
      FLASK_ENV: development
```

これにより、コードの変更がリアルタイムで反映されます。起動は以下のコマンドで行います。

```bash
docker-compose up --build
```

### Flaskのホットリロード機能を有効にする

Flaskアプリをデバッグモードで実行することで、変更が自動的に反映されます。

```python
if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0')
```

### Dockerfileのキャッシュ管理で再ビルドを高速化

再ビルド時にキャッシュを活用し、効率的に構築します。

```dockerfile
FROM python:3.9
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["flask", "run", "--host=0.0.0.0"]
```
Julia  全部直接引数わたしと構造体わたし，どっちが早いか

# 概要
Juliaで複数の配列を関数に渡すときに直接引数として渡すのと，構造体でまとめてから渡すので，どっちが早いか。

結論，変数が増えると構造体わたしのほうが遅い。

# コード
```julia
using Parameters
using BenchmarkTools

@with_kw struct Param{T1}

    n::T1 = 100
end

struct vars
    u::Array{Float64, 2}
    v::Array{Float64, 2}
    p::Array{Float64, 2}
    T::Array{Float64, 2}
    u1::Array{Float64, 2}
    u2::Array{Float64, 2}
    u3::Array{Float64, 2}
end

#vars(para::Param) = vars(zeros(Float64, para.n, para.n), zeros(Float64, para.n, para.n), zeros(Float64, para.n, para.n), zeros(Float64, para.n, para.n), zeros(Float64, para.n, para.n), zeros(Float64, para.n, para.n), zeros(Float64, para.n, para.n))

function main(para)
    @unpack n = para

    u = zeros(Float64, n, n)
    v = zeros(Float64, n, n)
    p = zeros(Float64, n, n)
    T = zeros(Float64, n, n)
    u1 = zeros(Float64, n, n)
    u2 = zeros(Float64, n, n)
    u3 = zeros(Float64, n, n)

    #Var = vars(para)
    Var = vars(zeros(Float64, para.n, para.n), zeros(Float64, para.n, para.n), zeros(Float64, para.n, para.n), zeros(Float64, para.n, para.n), zeros(Float64, para.n, para.n), zeros(Float64, para.n, para.n), zeros(Float64, para.n, para.n))
    #Var = vars()

    @time for i=1:1000
        test_arg(para, u, v, p, T, u1, u2, u3)
    end
    println(u[1:5,1])
    @time for i=1:1000
        test_struct(para, Var)
    end
    println(Var.u[1:5,1])
end

function test_arg(para, u, v, p, T, u1, u2, u3)
    @unpack n = para 

    for j=1:n
        for i=1:n
            u[i,j] = 2*i+j*1.5
            v[i,j] = sin(i*j)
            p[i,j] = i-j*0.1 
            T[i,j] = 0.2i^2-j
            u1[i,j] = 0.2*i+j
            u2[i,j] = 0.2*i+j
            u3[i,j] = 0.2*i+j
        end
    end
end

function test_struct(para, Var)
    @unpack n = para 

    for j=1:n
        for i=1:n
            Var.u[i,j] = 2*i+j*1.5
            Var.v[i,j] = sin(i*j)
            Var.p[i,j] = i-j*0.1 
            Var.T[i,j] = 0.2i^2-j
            Var.u1[i,j] = 0.2*i+j
            Var.u2[i,j] = 0.2*i+j
            Var.u3[i,j] = 0.2*i+j
        end
    end
end

```

# 結果

```julia
julia> include("struct-arg-test.jl")
julia> para = Param(n=500)
julia> main(para)
 4.876456 seconds
[3.5, 5.5, 7.5, 9.5, 11.5]
  5.039125 seconds
[3.5, 5.5, 7.5, 9.5, 11.5]
```

前半が直接引数渡しで，後半が構造体で引数渡しの場合。
IPM Day 2024登録

## 登録（支払い）

前回も参加していたので、IILのページにログイン。
https://www.iil.com/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654780/6a6407a3-6aa9-c745-d598-d7ae6bd08bdf.png)

ポップアップの「Click Here for Details!」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654780/c1a1d206-c1d7-3b86-91b4-b2cc4ffcd199.png)

Register Now
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654780/c6958d38-f29a-ca60-08b5-452010251aa0.png)

Checkout
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654780/43653174-90f6-71a1-0dbc-286338e1a747.png)

IILからメールで送られてきていたディスカウントコードを入力。
`$89 -> $77`
(11/10時点:$77=11,752.51円)

支払い完了

## カンファレンスへの参加
再度Learner Dashboardへ移動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654780/6b27b6f0-9a19-2c62-092f-2538cb52fe6c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654780/4ebd1471-2113-3ab9-3cee-06b0733092b6.png)
「Enter the Conference」まで進める。