OmniAICreator/Qiita-1.07M huggingface dataset:
Hono RPC + Azure Functionsを試したら型エラーでハマったメモ

## 概要
[Hono Azure Functions](https://hono.dev/docs/getting-started/azure-functions#_3-hello-world)を試そうとしたらクライアント側のビルドでエラーになった。

エラーメッセージから解決が難しかったので備忘録を残しておく。

[ソースコード](https://github.com/hibohiboo/async-ttrpg/tree/b8c3eae3793a54431a8c41fb65190555057a1d78)


## 発生したエラー


```
$ npm run build

> @async-ttrpg/pl-app@0.0.0 build
> tsc -b && vite build

D:\projects\async-ttrpg\node_modules\typescript\lib\tsc.js:120127
      throw e;
      ^

TypeError: Cannot read properties of undefined (reading 'push')
    at addLazyProgramDiagnosticExplainingFile (D:\projects\async-ttrpg\node_modules\typescript\lib\tsc.js:121723:41)
    at checkSourceFilesBelongToPath (D:\projects\async-ttrpg\node_modules\typescript\lib\tsc.js:121142:11)
```

これはエラーが発生した`tsconfig.app.tsbuildinfo`が残っているときのエラー。
`tsconfig.app.tsbuildinfo`を削除するようにしたら解決した。

```diff:package.json
{
  "name": "@async-ttrpg/pl-app",
  "private": true,
  "version": "0.0.0",
  "type": "module",
  "scripts": {
    "dev": "vite",
+    "prebuild": "rm -rf ./node_modules/.tmp",
    "build": "tsc -b && vite build",
    "lint": "eslint",
    "preview": "vite preview",
    "predeploy": "npm run build",
    "deploy": "dotenv -e .env.local -- bash -c 'swa deploy ./dist --env production'"
  },
  "dependencies": {
    "hono": "^4.5.1",
    "react": "^18.3.1",
    "react-dom": "^18.3.1"
  },
  "devDependencies": {
    "@async-ttrpg/eslint-config-custom": "*",
    "@azure/static-web-apps-cli": "^1.1.10",
    "@types/react": "^18.3.3",
    "@types/react-dom": "^18.3.0",
    "@vitejs/plugin-react-swc": "^3.7.0",
    "dotenv-cli": "^7.4.2",
    "typescript": "^5.5.3",
    "vite": "^5.3.4"
  }
}
```

```ts:tsconfig.app.json
{
  "extends": "@async-ttrpg/tsconfig/tsconfig.frontend",
  "compilerOptions": {
    "paths": { 
      "@pl-app/*": ["./src/*"],
      "@api/*": ["../api/src/*"],
     },
     "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo"
  },
  "include": ["src", "../api/src"],
  "exclude": ["node_modules", "dist"]
}
```



## 型解決ができないエラー

```ts
const app = new Hono()
app
  .get('/', (c) => c.text('Hello Azure Functions!'))
```

この状態でクライアント側をビルドしようとしたら下記エラーが発生。

```
src/App.tsx:13:25 - error TS18046: 'client' is of type 'unknown'.

13       const res = await client.api.httpTrigger1.$get();
                           ~~~~~~
```


## 解決方法

```diff
const app = new Hono()
- app
  .get('/', (c) => c.text('Hello Azure Functions!'));
```

一度変数で受けるとうまくいかないようだった。`const app = new Hono().get('/', (c) => c.text('Hello Azure Functions!'));`のようにHonoをnewしてからメソッドチェーンを行うことで型エラーは解決された。

## 参考
[Hono Example RPC](https://hono.dev/examples/grouping-routes-rpc)
APIで取得したjsonをGASでスプレッドシートに書き込む

30日気温予報を取得して、その気温をスプレッドシートに書き込むスクリプトを記述した。参考になる人は参考にしてほしいです。

また、こちらのサイトを参考にしているのでこちらも参考にすると良いと思います。

https://note.com/yuseikanayama/n/n525e24a7a307

```
function getWeatherInfo() {
  var areaCodeList = ["47605","47412"]; //金沢と札幌の天気予報用のコード
  let add_values = [];

  try {
      for (var j=0; j<areaCodeList.length; j++) {
      // リクエスト先URL
      const weatherUrl = `https://api.cultivationdata.net/onemonth?no=${areaCodeList[j]}`;
      // リクエスト送信してレスポンスを受け取る
      var weatherj = UrlFetchApp.fetch(weatherUrl);
      // JSONをパース
      var weather = JSON.parse(weatherj);
      // さっき定義したadd_valuesに開始日、最終日、予測気温を格納
      add_values.push(['firstDay','lastDay','temp']);
      Object.values(weather).map(d => {
          add_values.push([d.firstDay,d.lastDay,d.temp]);
        });

      }  

      const sheet_id = '1BZVA-ls4zMxN_GbVa7vNokAGIVT-jpKb0i9vN99IZ8Y';
      const sheet_name = 'シート1';

      const sheet = SpreadsheetApp.openById(sheet_id).getSheetByName(sheet_name);

      const value_length = Object.keys(add_values).length;
      const range = sheet.getRange(1,1,value_length,Object.keys(add_values[0]).length);

      sheet.clearContents();
      range.setValues(add_values);

    }catch(e) {
      Logger.log("失敗:"+e);
  }
  

}

```

この天気のAPIについては以下のリンクを参考にしてください。

https://www.cultivationdata.net/weather-web-api.html

https://docs.google.com/spreadsheets/d/1oCijdVEn5l65dwDijfgDPm4QcMdiV_fF1Kv4epJ7VGA/edit?gid=0#gid=0
Cannot read properties of null (reading 'getRange')の対処法

GASを使用して、arrayをスプレッドシート内に書き込む記述をした際、タイトルで表示されているエラーが表示された。

初歩的なエラーであるが、スプレッドシートの名前がない場合に生じるらしい。

その名前やIDを再度確認してほしい。
【マケイン】負けヒロインカメラで遊ぼう with iPhone and Mac

## まずは一枚の画像をご覧ください
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747809/1648f347-6d71-e04f-36ae-3a5d9f4509d6.jpeg width=450>

これは私の iPhone 12 で撮影した負けヒロインスタンプ写真です。今回はこの写真の撮り方を伝授します。

必要なもの
- iPhone XR ~ ( iOS 16 ~ )
- Mac ( OS Ventura ~ )

https://support.apple.com/en-us/102546

この写真を撮る前に簡単なiPhone の下準備を行います。

## iPhone 側の準備

iPhone の設定を開き、そこから一般 -> AirPlay と Handoff の項目を選択します。

その中から、「連係カメラ」を ON にします。
これで、サイトのカメラページを起動すると iPhone のカメラを使用できます。

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747809/1143c28b-95b7-5837-66f7-f910e6d7ec7a.png width=300>

iPhone の準備が完了したら、次は Mac の準備をします。

## Mac の準備

負けヒロインのアニメ公式 HP のマケインカメラにアクセスします。

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747809/b24af7a4-2171-54c9-a717-b870e05f651d.png width=450>

https://makeine-anime.com/special/

カメラページが起動すると iPhone のカメラも起動してこのような画面になるはずです。

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747809/2150f0d5-9b75-a0f2-a874-c59a4fa3a559.png width=300>


あとはスタンプを配置し、 Mac の画面に iPhone のカメラを向けて カメラページの撮影ボタンを押せば撮影できます。


<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747809/ee16139d-191f-8a70-9f64-5897f8b00b06.png width=450>

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747809/8102e7a3-619b-33a2-ad47-e211b298835e.png width=450>

## うまくいかない

### カメラページを開いても iPhone カメラが選択されない

うまくいかない時はページ上のカメラに矢印が囲んでいるマークをクリックして iPhone のカメラを選択してください。

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747809/552f6995-6312-b918-e533-b4292c747762.png width=450>

### 接続を切ってしまったが、もう一度繋ぎ直したい
1. 連係カメラを一度 OFF にする
1. ON に戻す
1. カメラページをリロードする

### その他確認事項
- [ ] 同じ Apple ID で iPhone, Mac どちらともログインしているか？
- [ ] Wi-fi, Bluetooth どちらとも ON になっているか？
- [ ] iPhone, Mac どちらともネット回線のシェアリングを OFF にしているか？
- [ ] Airplay をしていないかどうか確認

この方法で復活するでしょう。

# おわりに一言
次週もまた見てくれよな！
【AWS】KendraのS3データ同期でエラー発生した件

# 初めに
現在以下のハンズオンの「Amazon Kendraで簡単に検索システムを作ろう」でKendraとS3に格納したデータとで同期を行っている。

https://aws.amazon.com/jp/events/aws-event-resource/hands-on/

まずはハンズオンの通りにindexを作成し、Data sourcesも作成する。さらにS3に適当なファイルを格納し、Sync nowのボタンを押下


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2521217/bfc1e9e6-8750-ea81-7816-282e304b6c3c.png)

すると以下のようなエラーが発生し、データ同期ができなかった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2521217/7600f3c8-9ab5-b9ae-e0e7-1f88a193304c.png)

# 原因調査
原因を探るためにいくつかサイトを見ていたところ、以下のrepostが当てはまった。どうやらindexのロールに付与されているポリシーが足りないよう。

https://repost.aws/questions/QUb-Qp96beT76DRMnSPVXYQQ/use-s3-bucket-in-kendra

ということでロールにポリシーを追加していく。まずindexのロールのARNを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2521217/8bd85a35-525e-5495-dacb-180ad1ba7c9d.png)

次にIAMのページを開いてCloudWatchとCloudWatchLogのカスタマーインラインをロールに追加(この時はお試しで付与したので、実際はサイトを参照にJSONで追加したり、ポリシー付与の方が良い)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2521217/75ec2759-71dc-b0a3-28e2-43192259bd67.png)

再度Sync nowを実行すると正しくデータが同期されたことを確認できた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2521217/d084413a-a354-f289-2575-dd734cac02d8.png)

# 終わりに
ハンズオン途中でエラーが出た時、権限の問題であることがよくある。もし詰まった時はIAMロールを一度確認すると良いかも。
私はコーダーなのか、フロントエンドエンジニアなのか？

# はじめに
私は都内のIT企業に勤めて今年で4年目になります。最近は、将来的なキャリアも考えてReactを勉強しています。Reactを勉強する上でやりたいことや、私の強みや得意な事、逆に苦手な事などについて改めて考えていました。本当に自分がReactを学ぶ必要があるのか再確認するためです。

その中で一つの疑問が出てきました。
私は**コーダーなのか、フロントエンドエンジニアなのか？**

# コーダーとフロントエンドエンジニアの違いとは？
コーダーとフロントエンドエンジニアの明確な定義はないとされていますが、よく言われるのはプログラミングスキルがあるのかないのかという違いです。

コーダーはHTML・CSSを使いマークアップができる人です。フロントエンドエンジニアはマークアップに加えて、JavaScripやPHPなどを使用して機能面を実装することができる人になります。

# 私の業務内容について
私の普段の業務内容ですが、簡単に言えばWebサイトの制作全般になります。その中でも主な業務はWebサイトの運用業務になります。新規でWebサイトの制作をすることもありますが、こちらの割合は少ないです。

基本的な使用言語はHTML・CSS・JavaScript・jQueryです。上記の業務内容とスキルセットを見る限り私はコーダーになるのかと思います。一方でJavaScriptが全く使えないのかというとそういうわけでもありません。数は少ないですが機能実装の経験もあります。

でも仮にフロントエンドエンジニアと書かれた職務経歴書を他の人が見て、この実績では到底フロントエンドエンジニアと胸を張っていうことができないのも事実です...

# 私に足りないもの
ここまで読んでいただいてお分かりになったと思いますが、私に足りないのはフロントエンドでの開発経験です。業務だけでなく個人開発も含めてです。ここをたくさん経験することができれば自信をもってフロントエンドエンジニアと名乗ることができそうです。

# これから
自分に足りないものは理解できました。現在はReactを勉強していますのでこれをしっかりと続けていれば、フロントエンドエンジニアに近づけると思っています。まずは日々のReact学習を頑張っていきたいと改めて思いました。

# 参考サイト
『フロントエンドエンジニアとコーダーの違いを業務と収入で徹底比較』
https://www.sejuku.net/blog/103363

『フロントエンドエンジニアとは？仕事内容や年収、他エンジニアやコーダーとの違い』
https://www.brain-gate.net/content/column/system-program-front/#:~:text=%E3%83%95%E3%83%AD%E3%83%B3%E3%83%88%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E3%82%B3%E3%83%BC%E3%83%80%E3%83%BC%E3%80%81Web%E3%83%87%E3%82%B6%E3%82%A4%E3%83%8A%E3%83%BC%E3%81%AE%E9%81%95%E3%81%84,-%E3%83%95%E3%83%AD%E3%83%B3%E3%83%88%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8&text=%E3%82%B3%E3%83%BC%E3%83%80%E3%83%BC%E3%81%AF%E3%80%81HTML%E3%82%84CSS,%E3%81%8C%E4%B8%BB%E3%81%AA%E4%BB%95%E4%BA%8B%E3%81%A7%E3%81%99%E3%80%82
【備忘録】初めてのiOSアプリ開発 第6回 Delegate

## Delegateとは
・あるオブジェクトから別のオブジェクトへ処理を任せる
・どのクラスなのか、どんな処理をするのか移譲先を意識しなくていい
・再利用ができる
「delegate」の意味を直訳すると「人に任せる」、「代理人」という意味

## Delegateの使い方
#### 1.ルールを確認する
公式文書を読む。
#### 2.「それができます」と宣言する
処理を受け付けるオブジェクトを選択する。
#### 3.計画する
どのように処理をするか考える。
#### 4.仕事を受け付ける
オブジェクトに仕事が渡されることを確認する。
   
## Delegateの使い方を使った実装方法
#### 1.プロトコル
・任せる処理をメソッドとして定義する。
#### 2.処理を任せるクラス
・処理の流れを記述
#### 3.処理を任されるクラス
・デリゲートメソッドを実装
    
## 参考サイト
https://qiita.com/natya/items/326bd50a78cf34371169

https://youtu.be/Ph8d_UkQeIU?si=oTn2CiHsm42KFa_4
AWS IAMについて

## IAM ユーザー
IAMユーザーはAWSアカウント内で作成される個々のエンティティであり、特定のアクセス権限を持ちます。ユーザーには一意の名前とセキュリティ認証情報（パスワードやアクセスキーなど）が割り当てられ、これらを使用してAWSマネジメントコンソール、CLI、APIにアクセスします。IAMユーザーを使用することで、各ユーザーの操作履歴を追跡し、監査することが可能です。

## IAM グループ
IAMグループは複数のIAMユーザーをまとめるための論理的な集合体です。グループに対してポリシーを設定することで、グループ内のすべてのユーザーに一括して権限を付与することができます。これにより、ユーザーごとに個別のポリシーを設定する手間を省き、一貫性のある権限管理が可能になります。

## IAM ロール
IAMロールは特定のアクセス権限を持つ一時的な認証情報を提供するためのエンティティです。ロールは特定のユーザーやサービス（例えば、EC2インスタンスやLambda関数）に一時的に割り当てられ、特定のタスクを実行するための権限を付与します。ロールは一時的なアクセスを提供するため、セキュリティの観点から非常に有用です。

## ポリシー
ポリシーはIAMの中心的な要素で、ユーザー、グループ、ロールに対するアクセス権限を定義する文書です。ポリシーはJSON形式で記述され、どのアクションが許可され、どのリソースにアクセスできるかを明示します。ポリシーには大きく分けて、管理ポリシーとインラインポリシーの二種類があります。管理ポリシーはAWSが提供する再利用可能なポリシーで、インラインポリシーは特定のユーザー、グループ、ロールに直接関連付けられたポリシーです。

## マルチファクター認証（MFA）
MFAはセキュリティを強化するための追加認証方法です。通常のユーザー名とパスワードに加え、物理的なデバイス（スマートフォンやトークンジェネレーター）によって生成される一時的なコードを要求します。これにより、不正アクセスのリスクを大幅に軽減することができます。

## IAMベストプラクティス
IAMの効果的な使用方法にはいくつかのベストプラクティスがあります。まず、必要最小限の権限の原則（Principle of Least Privilege）を守ることが重要です。これは、ユーザーやロールに対して業務遂行に必要な最小限の権限だけを付与するという考え方です。また、IAMユーザーではなく、IAMロールを使用することで、一時的な権限を必要とするタスクに対して柔軟かつ安全にアクセス権を提供できます。定期的なアクセス権限のレビューも重要で、権限の見直しや不要なユーザーの削除を行うことでセキュリティを保ちます。

## まとめ
AWS IAMは、AWSリソースに対するセキュアなアクセス管理を実現するための強力なツールです。IAMユーザー、グループ、ロール、ポリシーなどのコンポーネントを効果的に活用することで、柔軟かつ詳細なアクセス制御を行い、セキュリティを高めることができます。ベストプラクティスに従い、定期的な見直しと適切な設定を行うことで、AWS環境を安全に運用することが可能です。
C_TS422_2021 SAP Certified Application Associate SAP S/4HANA Production Planning and Manufacturing対策（76/100）

【76日目】
トピック 8：SAPS/4HANAの製造指図（8/15）

≪問題76≫
製造指図を作成しようとしていますが、有効な製造バージョンを選択できません。考えられる理由は以下のどれですか。
（２つ選択）
□指図のロットサイズが製造バージョンの有効範囲にない。
□品目のすべての製造バージョンがロックされている。
□生産ラインが製造バージョンに割り当てられていない。
□部品表/配合表（BOM）が製造バージョンに割り当てられていない。

≪解答≫
■指図のロットサイズが製造バージョンの有効範囲にない。
■品目のすべての製造バージョンがロックされている。
□生産ラインが製造バージョンに割り当てられていない。
□部品表/配合表（BOM）が製造バージョンに割り当てられていない。

≪解説≫
◆製造指図を登録する際に、有効期間とロットサイズの範囲に基づいて適切な製造バージョンが選択されます。ただし、ロックされている製造バージョンは選択から除外されます。
◆複数の有効な製造バージョンが存在し、製造バージョンの自動選択がカスタマイジング設定で有効になっている場合は、ダイアログでマニュアル選択を明示的に指定しない限り、英数字順に最初の有効な製造バージョンが選択されます。また、製造バージョンのマニュアル選択がカスタマイジング設定で有効な場合、ユーザはダイアログを通じて常に製造バージョンを選択することが求められます。
◆製造バージョンが見つからない場合、マスタデータなしで製造指図をマニュアルで登録することが可能です。
基本情報技術者試験(CBT方式)を受けた話

## はじめに

CBT方式(パソコン使って受験する方式)の基本情報技術者試験を受けて来たのでどんな感じだったか話します

### 基本情報技術者試験とは

独立行政法人情報処理機構によると、ITエンジニアの登竜門的な立ち位置のようですが、あまりこの資格を意識したことはありませんでした。

https://www.ipa.go.jp/shiken/kubun/fe.html

### 筆者の背景

新卒で正社員としてエンジニアになってから１年と３ヶ月ほどです。
文系の大学を出ていて、大学時代にも１年ほどエンジニアのインターンをしていました。
情報系の学部を出ていないのでコンピューターサイエンスの知識は特にありません。

### なぜ受けたか

最近ヴァロラントというゲームに激ハマりしていて、人間的な生活を取り戻すという目的で他に打ち込めることを見つけたかったので、本屋に米澤穂信のミステリー小説を買いに行きました。
その本屋でたまたま基本情報の問題集を売っているのが目に入ったので、とりあえずこの勉強を軸に人間に戻ろうという目的で資格の勉強を始めました。
（結局、米澤穂信のミステリー小説は買いませんでした。）

↓これ（かんたん合格 基本情報技術者過去問題集 令和6年度）
https://www.amazon.co.jp/%E3%81%8B%E3%82%93%E3%81%9F%E3%82%93%E5%90%88%E6%A0%BC-%E5%9F%BA%E6%9C%AC%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85%E9%81%8E%E5%8E%BB%E5%95%8F%E9%A1%8C%E9%9B%86-%E4%BB%A4%E5%92%8C6%E5%B9%B4%E5%BA%A6-%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE%E3%83%8E%E3%83%9E%E3%83%89%E3%83%BB%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%B9/dp/4295018163

「かんたん合格」なので簡単に合格できるらしい

## 学習計画

特に学習期間は決めていなくて、上記の問題集を中心に学習を進めました。基本的に予想問題がメインの問題集なので過去問はほとんど解いていません。
(あとキタミ式という参考書を辞書代わりに使いました。)

学習を始めたのが6月の始めで試験を受けたのが7月の半ばなので、結果的に大体1ヶ月半ぐらい勉強していました。
生活習慣の改善が目的としてあったので基本毎日少しずつ(1時間〜１時間半程)勉強するようにしていました。
ただ、金曜日はヴァロラントで忙しかったので一切勉強していませんでした。

## 受験当日

北千住のテストセンターで受けました。
テストの方式はCBT方式というもので、「テストセンターにあるパソコンを使い選択肢の中から適切な答えを選んで入力する」という方式でした。
試験会場は「学習塾の自習室」みたいなイメージで、浪人時代を思い出しました。
試験で使う機器類は、小学校のパソコン室にあるような正方形のディスプレイにメンブレン方式のキーボード、という組み合わせでした。

### 試験の所感

A問題難しいな、と思いました。予想問題集では見たこともないような問題が割とありました。
B問題は毎回出題パターンが決まっているのか予想問題集の内容通りに出題されていた印象です。にもかかわらず理解不足で当日解けなかった問題もありましたが。

### 試験結果

A、Bどちらも1000点満点中ギリギリ600点越えてるぐらいの得点率でした。
(AとBの両方が600点以上であれば合格、とのことですが合格不合格の正式発表はまだです。最終的に合否は試験主催者が決めるようです。)

CBT方式ではA、Bどちらも回答した後すぐに結果が画面上に表示されました。
(試験から３時間後ぐらいに資格を申し込んだサイトのマイページにも得点が表示されました。)

## 感想

テストセンターへの行きと帰りがとてつもない暑さでした。
早く涼しくなって欲しいです。

あと、テストセンターの受付の方がとても親切でした。
初学者学習用テスト投稿

<h1>初投稿</h1>
<p>初学者です！</p>
<p>これからは知識の蓄積とともに、誰かの助けになるような記事を書いていきます。</p>
<p>文章力を鍛えるということも意識しプログラミングの習得や記録をしていきたいので目指せトレンド入りということで、最新の技術の学習を辞めずに進めていきたいと思います。</p>
<p>まだまだ記事の書き方、マークアップ言語についてはなれませんが、良い文章を書ければよいなと思っております。</p>
モーニングコーヒー中に学ぶDjangoで使う基本コマンドとデータ作成

「モーニングコーヒー中にDjangoについて勉強したいな…」

そんな風に思うことあると思います。

この記事では、Djangoについてよく使う基本的なコマンドとマイグレーション、テストデータ作成について説明します。

モーニングコーヒーの時間を有効活用して、Djangoについて詳しくなっていきましょう。

# Djangoのプロジェクトで仮想環境〜Djangoプロジェクト作成まで

まずは作業用のディレクトリを作成する

```$ mkdir djnago_blog```

```$ cd djnago_blog```

### 仮想環境の構築

```$ python3 -m pip install pipenv```

### 仮想環境に入る

```$ pipenv shell```

仮想環境に入ると以下のようになります。

```(blog) ….blog $ ```

### djangoのインストール

```$ python3 -m pip install Django```

### djangoプロジェクトの作成

```$ django-admin startproject Djangoプロジェクト名```

例：```$ django-admin startproject mysite```

### Djangoのバージョン確認

```$ python3 -m django --version```

### 環境の立ち上げ

```$ python3 manage.py runserver```

# Djangoのアプリ作成

manage.pyがあるディレクトリで以下を叩きアプリを作る

```$ python3 manage.py startapp Djangoアプリ名```

例：```$ python3 manage.py startapp blog```

### ライブラリのインストール

```$ python3 -m pip install -r requirements.txt```

※requirements.txtがない場合は、ファイルを作成しておく

※requirements.txtに記載されている内容がインストールされる

# マイグレーション編

Djangoでマイグレーションする流れは、以下です。

①models.pyに定義

②マイグレーションファイルを作成する

③マイグレート実行

④DBにテーブルが作成される

models.pyに定義する

```python
from django.db import models
from django.utils import timezone
import uuid

class Users(models.Model):
  user_id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
  user_name = models.CharField(verbose_name='ユーザー名', max_length=20)
  delete_flg = models.BooleanField(verbose_name='論理削除', default=False)
  created_at = models.DateTimeField(verbose_name='作成日時', default=timezone.now)
  updated_at = models.DateTimeField(verbose_name='更新日時', blank=True, null=True)
```

# マイグレーション関連のコマンド

### マイグレーションファイルの作成※—nameでマイグレーション名を指定できる

```$ python3 manage.py makemigrations Djangoアプリ名 --name マイグレーションファイル名```

例：```$ python3 manage.py makemigrations blog --name add_post```

### マイグレーションの実行

```$ python3 manage.py migrate Djangoアプリ名```

### マイグレーションファイル一覧の表示

```$ python3 manage.py showmigrations Djangoアプリ名```

### マイグレーション名のファイルまでロールバックする

※migration_nameの実行後の状態まで

```$ python3 manage.py migrate Djangoアプリ名 migration_name```

### マイグレーションの履歴を削除

※完全に初期化する

```$ python3 manage.py migrate appname zero```

# テストデータの作成編

Djangoでテストデータを作成する流れは以下です。

①テストデータ用のjsonファイルを作成する

②テストデータを投入するコマンドを実行する

③DBにテストデータが作成される

### テストデータの投入

テストデータ用のjsonファイルを作成します。

```json
[
  {
    "model": "blog.Users",
    "fields": {
      "user_id": "36ce89264b8a41cdbea9c3a1fc578763",
      "user_name": "yamada",
      "delete_flg": false
    }
  }
]
```

"model": "blog.Users",

とありますが、blogはapps.pyにこんな感じで記載されていると思いますので、name = ‘blog’の部分を参照しています。

```python
from django.apps import AppConfig

class BlogConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'blog'
```

blog.UsersのUsersは、models.pyで定義したクラス名を参照しています。

上記ができたら、以下を叩くことでテストデータを投入できます。

```$ python3 manage.py loaddata spacePick/fixtures/ファイル名.json```

例：```$ python3 manage.py loaddata blog/fixtures/users_data.json```

# まとめ
Djangoの基本的なコマンドとマイグレーションについて説明してきましたが、もし他にも補足などがありましたらコメントで教えてください。
paizaの問題をPowerShellで解いてみた【Fizz Buzz (paizaランク C 相当)】


この記事はpaizaのプログラミング問題をPowerShellで解いてみようという試みの記事です。

## paizaのプログラミング問題とは？
ブラウザ上でコードを書いて実行できる、無料プログラミング練習問題集です。
1. 難易度別に問題を選ぶ
2. 問題文を読んで、解答コードを書く
3. 提出するとテストケースが実行されて結果をわかる
正解・不正解だけではなく、解答コード例や解説も見ることができるので、プログラミングの習得から復習まで活用できます

## こんな人におすすめ
- プログラミングスキルの腕試しをしたい方
- プログラミングのスキルアップしたい方
- 新しい言語にチャレンジをしたい方

###

通常は問題をc言語やJavaなどで解くのですがPowerShellで解いてみます。

## 問題
Fizz Buzz (paizaランク C 相当)

https://paiza.jp/works/mondai/c_rank_skillcheck_sample/fizz-buzz


#### 問題
整数 N が入力として与えられます。

1からNまでの整数を1から順に表示してください。

ただし、表示しようとしている数値が、

・3の倍数かつ5の倍数のときには、"Fizz Buzz"
・3の倍数のときには、"Fizz"
・5の倍数のときには、"Buzz"

を数値の代わりに表示してください。

入力: N

N は1以上N以下の整数です。



#### コード:
~~~
# ワンライナー
(1..[int](read-host))|foreach-object{if(-not(($_ % 3 -eq 0)-or($_ % 5 -eq 0))){ $_ }elseif(($_ % 3 -eq 0)-and($_ % 5 -eq 0)){ "Fizz Buzz" }elseif($_ % 3 -eq 0){"Fizz"}elseif($_ % 5 -eq 0){"Buzz"}} | %{write-host $_}

~~~


#### コードの説明:

1.数値1から入力値まで列挙:
~~~
(1..[int](read-host))
~~~

- (a..b) の書き方で数値aから数値bまで順に列挙します
- read-hostで入力値を読み込みint型に変換します

2.パイプ処理
~~~
 |
~~~ 
- 前の処理の出力を一つづつ次処理へ送ります
- PowerShellの特徴として前処理(a..b) が一つづつ通ります

3.ワンライナー
~~~
foreach-object{if(-not(($_ % 3 -eq 0)-or($_ % 5 -eq 0))){ $_ }elseif(($_ % 3 -eq 0)-and($_ % 5 -eq 0)){ "FizzBuzz" }elseif($_ % 3 -eq 0){"Fizz"}elseif($_ % 5 -eq 0){"Buzz"}} | %{write-host $_}
~~~
- PowerShellでもワンライナーで書けるか挑戦してみました。
- ＄_ は前処理からパイプ処理で送られてきた値
- ＄_ が3でも5でも割れないとき -> 数字
- ＄_ が3でも5でも割れるとき -> Fizz Buzz
- ＄_ が3で割れるとき -> Fizz
- ＄_ が5で割れるとき -> Buzz

4.パイプ処理
~~~
 |
~~~ 
- 前の処理の出力を一つずつ次処理へ送ります

5.出力
~~~
 %{write-host $_ }
~~~ 
- write-hostで前処理から送られてきた値$_を表示
- %{} はforeach-object{} の省略形



### 終わりに
noteにPowerShellのサンプルコードの記事を書いています。そっちも見てね
[PowerShellまとめ](https://note.com/mahalo_/m/m421b17a881c8)

https://note.com/mahalo_/m/m421b17a881c8
object.map() is not a functionの解決策

jsonファイルをスプレッドシートにいれる際、必要データのみを取り出すためにmap()を使用した。

その際に、object.map() is not a funcitonというエラーに悩まされたが解決したので方法をメモしておく。

mapはarray(配列)でなければ操作をできないが、jsonのデータはobjectらしい。

その違いは、{}で囲まれているか、[]で囲まれているかである。

つまり、array型にすれば解決するのである。

したがって、元の記述を以下のようにしていたら
```
weatear.map(d => {
    add_values.push([d.firstDay, d.lastDay, d.temp]);
```

以下のように変えればよいのである。
```
 Object.values(weather).map(d => {
          add_values.push([d.firstDay,d.lastDay,d.temp]);
        });
```

要するに、
```
Object.values("ここにオブジェクトデータを入れる").map()
```

これでエラーを解消できた。
Mac Miniは最強の法人向けデバイス？

最近、Mac Miniは企業ユースで最強ではないかと思い始めたのでポエムしてみます。
（もっと技術記事を書けよというツッコミは受領いたします）

[![mac-mini-computer-photo-new-apple-desktop-model-october-46250689.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/d2543cc7-5f78-efa8-f440-54334f6cc96c.jpeg)](https://www.dreamstime.com/editorial-stock-image-mac-mini-computer-photo-new-apple-desktop-model-october-image46250689)


# きっかけ
- 長年のWindowsへの信頼が崩れた。
- 今回の[クラウドストライクの事件](https://www.youtube.com/watch?v=NA4uAYS7t0M)は個人的にWindowsへの信頼性の疑問を抱かせるものでした。
- いちソフトウェアがカーネルレベルへのアクセスができることに驚きがあります。

# Macはシンプル
- あとやはりWindowsは何をするにしても工数がかかる印象があります。
- ちゃんとすればWindowsもセキュリティや機能は高いのですが、その「ちゃんとすれば」にどえらい工数がかかるな～と思うようになりました。
- Jamfを触り始めて、Intuneと比較してしまうのですが、Macにはシンプルさがあります。

# Mac Miniの利点
- 中古ショップでMac Miniを触りましたが、WindowsのミニPCにはない利点があります。

 1. ACアダプタ内蔵。WindowsのミニPCは、ACがデカくてあまりスマートではありません。Mac Miniは内蔵です。
 2. メモリとSSDがはんだ付け。これは物理的アクセスをふせぐのに効果的です。WinだとBitLocker暗号化していても外せてしまうのはやはり管理面からリスクがあります。
 3. 軽い。1.2kgくらいなのでギリギリかばんで持ち運べる。キーボードとモニタを固定してフリーアドレスにしてMacMiniを移動するという方式も不可能ではない。
 4. 劣化しない。キーボードとモニタが外付けなのでよくある水をこぼしてキーボードが使えないとか、液晶がひび割れたといったことは本体とは切り離して解決ができます。
 5. リセールバリューが高い。ミニPCなどは数年たつと中古で安くなってしまいますが、Macは高い傾向があります。

[![male-hand-looking-new-mac-mini-computer-cpu-as-apple-began-transition-intel-processors-to-silicon-paris-france-ap-245035786.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/189a8399-b626-5a53-7bf6-76e015e7a454.jpeg)
](https://www.dreamstime.com/male-hand-looking-new-mac-mini-computer-cpu-as-apple-began-transition-intel-processors-to-silicon-paris-france-ap-image245035786)

# 企業から見た利点
- M1以降のMac Miniは高速。4年たっているのにまだまだ現役で使える。
- リセールバリューも高いので、安物のWinPCを買うより結局投資還元効果が高い。
- [Jamf](https://qiita.com/minoden_works/items/47930c1b1c83a7b6871e)やIntuneによる遠隔管理。
- 最近[プラットフォームSSO](https://www.youtube.com/results?search_query=mac+platform+sso)に対応した。Entra IDでログインできるとのこと。
- iOSデバイスとの親和性。iPhoneミラーリングなど。
- 毎回どのメーカーから買うかとか考えなくてよい。
- 10年以上デザインが変わっていないのでこれからもMac Miniは企業ユースとして安定感が見込まれる。

[![mac-mini-computer-apple-desktop-model-october-46252031.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/7147df0e-69b8-95fc-3c9d-fa6ea2a7c13c.jpeg)
](https://thumbs.dreamstime.com/z/mac-mini-computer-apple-desktop-model-october-46252031.jpg?ct=jpeg)

# デメリット
- 同じスペックだとWindowsより高い。ただしOSも違えばリセールバリューも高いのでそのまま比較はできない。
- Macの管理スキルが必要。
- 「所有」という点ではMacbookに劣る。たぶん社員さんはMac MiniよりMacbookを欲しがる。
- Windowsを使うには仮想ソフトが必要。
- そしてParallelsやVMWareの法人向けは高い。仮想化だけで月額1200円とかするので現実的じゃないですよね。。。


# 期待すること
- [無料仮想ソフトのUTM](https://www.youtube.com/results?search_query=mac+UTM)が発展してほしいと思っています。
- これが実用レベルになれば、Mac本体プラスWindows仮想マシンで多くの業務はこなせる形に。
- ARM版Windowsも開発が進んでいるので、未来はあると思います。

# 情シス視点でのメリット
- Macにはタイムマシーンという差分バックアップツールがついてます。
- UTMの仮想ディスク（qcow2）をタイムマシーンでバックアップするという方法もアリなのではと思いました。
- Windows + Hyper-Vだとそういうオシャレな機能がございません。
- もし今回のようにWindowsがBSoDになっても、仮想化していて、タイムマシーンで戻れたら。。。いいですよね。

# まとめ
- CrowdStrikeの事件で、「ハードウェアに直接インストールしたWindows」の問題点を痛感しました。
- 現在私はWinPCにローカルHyper-VM仮想マシンを数台立てて用途によって使い分けています。
- が、そのベースとなるOSもWindowsなので。。。
- Macをベースにしたら「それって素敵やん？」ってことにならないかな、といったポエムでした。
ブレインスリープピローで夢と朝のパフォーマンスが変わる!? ITエンジニアが試してみた

## 購入の経緯

インターネットでこの商品の存在を知り、購入しました。

## 購入モデル

ブレインスリープピロー ネックフィット
16,500円（定価）

価格は高めですが、スタンダードなモデルは33,000円もするため、さらに高額です。スタンダードモデルは高さが高め、低め、普通の3種類から選べるのに対し、ネックフィットは1種類のみのため、選択に迷うことがなく便利です。

## 使用感

使用開始から約2週間が経ちました。現在は梅雨明けの初夏です。
以前は無印良品の羽毛枕（980円）を使っていましたが、ブレインスリープピロー ネックフィットも遜色なく、違和感がありません。枕の高さもちょうど良く、おそらく1モデルにして中間に合わせているのでしょう。

## 使用してみての変化

まず、夢を見る頻度が増えました。以前と比べて体調や精神面に大きな変化はないため、枕の影響と考えられます。無印の枕では1週間に1度程度だったのが、ブレインスリープピロー ネックフィットでは1週間に4回ほど夢を見ています。

さらに、夢の内容も具体的で鮮明になりました。目覚めた時に夢の詳細を記憶していることが増えました。例えば、クレジットカードのICチップにデータが充当される様子や、友人・知人が具体的な背景を持って登場するなどです。このような夢を翌日にテキストとして記録できるのは、夢が具体的でリアリティが増しているからでしょう。

そして、フィジカル面で一番大きな変化は、朝勃ちの頻度が増えたことです。ブレインスリープピローの一番の効能は朝勃ちであると断言できます。夢を見る回数と一致して、1週間に4回ほど朝勃ちしています。ブレインスリープピローを使う→詳細でリアルな夢を見る→朝勃ちする、という一連の流れが眠っている間に自動的に実行されているわけです。

なお、夢がエロいわけでは全くありません。その点については期待しないでください。

## あなたに使用を薦めるか

面白い体験ができる可能性があるため、高額な商品ですが、メルカリで安い中古品が手に入るなら試してみる価値があります。お湯で丸洗いができるので、潔癖症の方でなければぜひ試してみてください。なお、枕カバーは純正品を使用していますので、ご参考まで。
【Python3】本の整理 (paizaランク A 相当)をやってみた

このコードでは、本の位置情報を記録する配列を用いて、効率的に交換回数を計算しています。

```python
# 入力を読み込む
N = int(input())
shelf = [int(x) - 1 for x in input().split()]

# 各本の位置を記録する配列を用意
pos = [-1] * N
for i in range(N):
    pos[shelf[i]] = i

# 交換回数を記録する変数
ans = 0

# 本棚の本を並び替える処理
for i in range(N):
    # 既に正しい位置にある本はスキップ
    if shelf[i] == i:
        continue
    
    # 交換回数を増やす
    ans += 1
    
    # i番目の本と現在の正しい位置にある本を交換
    shelf[pos[i]] = shelf[i]
    pos[shelf[i]] = pos[i]

# 交換回数を出力
print(ans)
```

### プログラムの説明

1. **入力の読み込み**:
   - 最初の行で本の冊数 `N` を取得します。
   - 次の行で本棚の本のIDを取得し、0ベースのインデックスに変換して `shelf` リストに格納します。

2. **位置情報の記録**:
   - `pos` 配列を作成し、各本のIDの現在の位置を記録します。

3. **交換回数の計算**:
   - 本棚を左から順に確認し、正しい位置にない本を見つけた場合、交換を行います。
   - 交換回数を `ans` にカウントします。
   - 交換後、`shelf` と `pos` の情報を更新します。

4. **結果の出力**:
   - 最終的な交換回数 `ans` を出力します。

このプログラムは効率的に本の交換回数を計算し、必要な計算量を最小限に抑えています。
GASとGoogleフォームを使ってクイズラリー

今度、彼女と金沢へ旅行に行くのですが、それのためにGoogle Siteを使用して、観光地や日程をまとめたサイトを作成しました。

それだけではわざわざサイト作成した意味がないとGoogleフォームを使用してクイズラリーを作成しました。
なぜ、Googleフォームを使用したのかというとそのときはプログラミング不要でクイズラリーを作成できると思ったからです。

しかしながら、Googleフォームではその回答に応じて返信を変化させることができないので、
GASというGoogleのサービスをスクリプトで操作できるサービスを使用して、
Googleフォームでの回答に応じて正解であれば、次の問題のフォームを送信し、不正解であれば不正解であるという通知を送る。
そして、ヒントと送信されれば、ヒントを送信するという仕組みを操作しました。

以下にはそのGAS内のスクリプトを記述します。

```
function sendemail(e) {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = SpreadsheetApp.getActiveSheet();  //更新があったシートを取得
  var sheetName = sheet.getSheetName(); //シートの名前を取得
  var templateSheet = spreadsheet.getSheetByName('メール本文'); // 本文テンプレートのシート名を指定
  
  const textObject = templateSheet.createTextFinder(sheetName); //メール本文のシートから問題番号の含まれるセルを取得
  const results = textObject.findAll();
  var notation = results[0].getA1Notation();
  var coloms = notation.slice( 0, 1 ) ; //列の名前だけを取得
  
  let wVals0 = sheet.getDataRange().getValues();

  let score = sheet.getRange(wVals0.length, 3).getValue(); //scoreがc列のため
  let answer = sheet.getRange(wVals0.length, 4).getValue(); //答えがd列のため
  let emailAdress = sheet.getRange(wVals0.length, 2).getValue(); //emailadressがb列のため

  if (score == 1) {
      var emailBodyTemplate = templateSheet.getRange(`${coloms}2`).getValue(); //問題番号に適したメールの本文を取得 
      GmailApp.sendEmail(
        emailAdress
        , `【テスト】${sheetName} 大正解`
        , emailBodyTemplate
      )
  }else if(answer == "ヒント"){
      var emailBodyTemplate = templateSheet.getRange(`${coloms}4`).getValue(); //問題番号に適したメールの本文を取得 
      GmailApp.sendEmail(
        emailAdress
        , `【テスト】${sheetName} ヒントをあげるよ！`
        , emailBodyTemplate
      )

  }else{
    var emailBodyTemplate = templateSheet.getRange(`${coloms}3`).getValue(); //問題番号に適したメールの本文を取得 
    GmailApp.sendEmail(
        emailAdress
        , `【テスト】${sheetName} 不正解。`
        , emailBodyTemplate
      )

  }
}

```

分からないことがあればコメントくだされば、お答えします。

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2971002/180475ae-1b4a-db81-b388-f6b011cd1d80.png)

メール返信用の回答をこの画像のように入れてしまい、それを取得するために、シートの名前と同じ名前のセルを取得してその列のアルファベットを無理矢理取得しました。

Googleフォームでは一問だけテストという形で提出させて、そのスコアで点数を判定しています。

もっと合理的な方法があれば教えて下さい。

そして、Googleフォームを使用するよりも多分LINEでやったほうがやりやすいような気がするので作り直したいと思います。

それではご覧いただきありがとうございます。
#Thunderbird 上で #Outlook アカウントのメール送信ができない対応

**本内容を利用した場合の一切の責任を私は負いません。**

アカウントにこんなメールが来た。

```
2024 年 9 月 16 日以降、安全性の低いサインイン テクノロジーが使用されているアプリでメールにアクセスすることができなくなります。
お客様の情報の安全性とセキュリティは、Microsoft にとって最優先事項です。アカウントの安全性を確保するため、Microsoft では、Microsoft アカウントのユーザー名とパスワードだけでサインインできるサード パーティのメールおよびカレンダー アプリの使用がサポートされなくなります。より高い安全性を保つため、Microsoft の先進認証方法がサポートされているメールまたはカレンダー アプリを使用する必要があります。ご対応いただかないと、2024 年 9 月 16 日以降、サードパーティのメール アプリは Outlook.com、Hotmail、Live.com のメール アドレスにアクセスできなくなります。

必要な操作

このメールは、安全性の低い認証方法で Outlook.com 電子メール アカウントに接続するメールまたはカレンダー アプリを現在ご使用中の方にお送りしています。サード パーティのメールおよびカレンダー アプリを、先進認証方法をサポートしているバージョンにアップグレードする必要があります。 

Microsoft では PC、Mac、iOS、Android デバイス向けの無料バージョンの Outlook を提供しており、ダウンロードも電子メール アカウントへの接続も簡単です。最新バージョンの Outlook アプリケーションを使用すると、最も安全な方法による接続が保証されます。

Gmail や Apple メールなどのサード パーティのメール アプリケーションを設定する方法

Microsoft 以外のさまざまなアプリケーションで先進認証方法を使用して Outlook.com 電子メール アカウントに接続するには、それぞれ独自の手順に従います。ヘルプ記事「Modern Authentication Methods now needed to continue syncing Outlook Email in non-Microsoft email apps」を参照してください。しかし、これらのアプリケーションの作成者に手順を問い合わせる必要が生じることもあります。多くの場合、そのアプリケーションの最新バージョンでアカウントを削除してから追加し直すだけで、先進認証方法を使用するよう構成されます。 
プライバシーに関する声明
Microsoft Corporation, One Microsoft Way, Redmond, WA 98052 USA      
```

内容のヘルプ記事に従って対応したが、送信しようとすると下記の「認証情報を入力してください」という中身のないウィンドウが表示されて送信できない。

![thunderbirdエラー1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397476/cb7bf0c1-2acc-4985-2d14-6f5f3226cf6c.png)

Thunderbirdの設定のcookieを許可したら中身が表示された。
中身の認証を通したら解決した。
Thunderbirdに限らずブラウズ機能を持ってるもので、そこの動作がおかしい時は考慮するといいかも。
【Python3】長テーブルのうなぎ屋 (paizaランク B 相当)をやってみた

https://paiza.jp/works/mondai/b_rank_skillcheck_sample/long-table

以下は、うなぎ屋の座席配置をシミュレーションするPythonプログラムです。

```python
# 入力を標準入力から読み取る
import sys
input = sys.stdin.read

# メイン処理関数
def main():
    # 入力データを読み取り、行ごとに分割する
    data = input().strip().split('\n')

    # 最初の行から座席数(n)とグループ数(m)を取得
    n, m = map(int, data[0].split())

    # 座席の使用状況を管理するリスト（Falseは空いている、Trueは埋まっている）
    seats = [False] * n

    # 座れた人数のカウンター
    seated_count = 0

    # 各グループの処理
    for i in range(1, m + 1):
        a_i, b_i = map(int, data[i].split())
        b_i -= 1  # 座席番号を0始まりに変換

        # グループが座ろうとする座席の範囲を計算
        can_seat = True
        for j in range(a_i):
            if seats[(b_i + j) % n]:
                can_seat = False
                break

        # 座れる場合、座席をTrue（埋まっている）に更新
        if can_seat:
            for j in range(a_i):
                seats[(b_i + j) % n] = True
            seated_count += a_i

    # 最終的な座れた人数を出力
    print(seated_count)

# メイン処理を呼び出す
if __name__ == "__main__":
    main()
```

### 解説

1. **入力を標準入力から読み取る**
   ```python
   import sys
   input = sys.stdin.read
   ```

2. **メイン処理関数の定義**
   ```python
   def main():
   ```

3. **入力データを読み取り、行ごとに分割する**
   ```python
   data = input().strip().split('\n')
   ```

4. **最初の行から座席数(n)とグループ数(m)を取得**
   ```python
   n, m = map(int, data[0].split())
   ```

5. **座席の使用状況を管理するリストを初期化**
   ```python
   seats = [False] * n
   ```

6. **座れた人数のカウンターを初期化**
   ```python
   seated_count = 0
   ```

7. **各グループの処理**
   ```python
   for i in range(1, m + 1):
       a_i, b_i = map(int, data[i].split())
       b_i -= 1  # 座席番号を0始まりに変換
   ```

8. **グループが座ろうとする座席の範囲を計算し、既に埋まっている座席があるか確認**
   ```python
   can_seat = True
   for j in range(a_i):
       if seats[(b_i + j) % n]:
           can_seat = False
           break
   ```

9. **座れる場合、座席を埋める（Trueに更新）**
   ```python
   if can_seat:
       for j in range(a_i):
           seats[(b_i + j) % n] = True
       seated_count += a_i
   ```

10. **最終的な座れた人数を出力**
    ```python
    print(seated_count)
    ```

このプログラムは、入力されたデータに基づいて座席の配置をシミュレーションし、最後に何人が無事に座れたかを計算します。
オススメラボとは

## オススメラボとは
### オススメラボとは
オススメラボとは、ネットやSNSでよく見かける広告などに対し、気になるけど実際はどうなんだろう？という疑問や不安などを管理人自ら体験・使用しおすすめしていくメディアです。

### オススメラボの概要
オススメラボの概要については、以下をご覧ください。

サイト名	オススメラボ
サイト名（英表記）	osusume-lab
サイトURL website	https://osusume-lab.com/
代表者・運営責任者	なおゆき
e-mail	osusumelab.com@gmail.com
開設日	2022年3月1日
サイト概要	くらしとモノのおすすめ紹介メディア


https://osusume-lab.com/
AppRouter + ChakraUIにおける懸念点


# 概要
approuter + ChakraUIで開発を進め用と思った際、色々気になったのでまとめます。後々追記予定です！
# 背景

reactの学習が一通り終わり、アプリの作成に進むこととしました。
デザインに自信がないため、手軽にそれっぽいデザインの使えそうなChakraUI、フレームワークにnextjs(AppRouter)を使うこととしました。
しかし、調べていく中でChakraUIはAppRouter非対応、あるいは対応済みなどの記事が散見されたので、調査しまとめることにしました。

## 前提
React初学者により記事です。また、SSR,SSGなどについては理科している前提の記事となります

# AppRouter非対応とはどういう事か
非対応とは、approuterとChakraUIの組み合わせではアプリが動かないというわけではなく、next13以降で追加されたAppRouterの機能が使えないということになります。
具体的にはリアクトサーバーコンポーネント（RSC）が使えないということになります。裏を返せば、appディレクトリを用いたルーティング設定などは問題なくできます（Linkタグによる画面遷移には別途専用ライブラリの利用が必要となります。）

## RSC(ReactServerComponent)とは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2910804/c6d3b436-01c4-c9fd-6202-ab1781471317.png)
ざっくりこんなイメージです。

RSCとはnex13以降追加されたものであり、これを指定するとサーバーサイドでフロントエンドのAPIなどに依存しないコンテンツを前もって生成できます。これはサーバーサイドですでに完成済みとなるため、表示が高速かつ軽量です。

next13以前は、ページ単位でSSG,SSRの選択をしていましが、
AppRouterを使用することで、上記に合わせてコンポーネント単位でRSCを利用するか従来型のコンポーネント（以降これをクライアントコンポーネントと呼ぶ）を利用するか指定できる用になりました。

### RSCとクライアントコンポーネントの比較
この辺りに関しては、より詳細に解説されている記事が多数ありますので、詳細については割愛させていただきますが、イメージとしてはRSCはサーバーサイドで完全に静的生成が完了できるコンポーネントで、クライアントコンポーネントはクライアント側でハイドレーションが必要なコンポーネントとなります。

従来は全てのコンポーネントが後者であったため、静的生成したとしても、同時にjsをフロントに返す必要があり、フロントサイドでハイドレーションされることによって完全に動作する画面が完成するようになっていましたが、RSCによってフロントに返すjsを減らし処理を軽量化できるようになりました。

## ChakraUIとRSC
それではなぜChakraUIではRSCが使えないのでしょうか。
それはChakraコンポーネントがフロント側のwebAPIに依存しているためです。そのため、ChakraUIのコンポーネントは全てクライアントコンポーネントとなります。
以下の画像のようなイメージで、全てのコンポーネントがレンダリングされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2910804/0075a2d1-4c25-3549-9ca3-937b818afa7d.png)

# 私の結論
ChakraUIを使用すると、AppRouterの機能が十分に使えないため、ネガティブな意見が多くあるかと思います。一方で個人開発のサイトレベルで言えばユーザビリティをそこまで突き詰める必要もないため、開発体験を優先しChakraUI + AppRouterの構成で開発を進めます。
この組み合わせによる不都合などが開発を進める中で発生した場合、追記していきたいと思います。
re:Invent 2024に参加される方々へ(re:Invent終了後〜帰国編)

# re:Invent終了後のラスベガスでの過ごし方

## フライト前の準備

近畿日本ツーリスト（以下、knt）のツアーでは、プランによりますが、現地の午前5時のフライトでラスベガス（LAS）からサンフランシスコ（SFO）へ移動する予定でした。そのため、チェックアウトや空港への移動で遅れないようにするため、当日は徹夜になることが予想されます。

出発前の時間を有効に使うために、ホテル併設のカジノで遊んで思い出を作るのも良いでしょう。
経験だと思って負けてもいい金額を賭けることをお勧めします。

![60423.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3425323/5ef6dc45-3edf-ccc4-c538-05d16052fbc9.jpeg)
※ホテルの方に許可をいただいて撮影させていただきました。

## チェックアウトと空港への移動

チェックアウトの際には、kntの添乗員さんがサポートしてくれるので、英語ができなくても心配いりません。チェックアウトが完了したら、バスでラスベガス空港へ向かいます。
この移動中に「Visit Japan Webサービス(*1)」を利用して税関申告などの手続きを先に済ませておくと、後が楽になります。

## 荷物の取り扱いについて

ラスベガスからサンフランシスコへは国内線を利用します。お土産などを買いすぎて荷物がオーバーウェイトになることもありますが、同僚のキャリーケースに余裕があれば荷物を分けてもらうことをお勧めします。


# トランジット時の注意点

海外旅行に頻繁に行かれる方ならご存知かと思いますが、トランジットはトラブルの元です。
遅延やキャンセルなど、何かしら問題が発生することが多いです。

今回のツアーでは遅延もキャンセルもありませんでしたが、私のキャリーケースが破損してしまいました。
疲れていて破損したケースの写真を撮り忘れてしまい、~~一生のネタにできたのにと思って~~後悔しています。

日本ほど丁寧にキャリーケースを運んでくれない国も多く、破損の可能性は常にあると思っていましたが、まさか自分のケースが破損するとは思ってもいませんでした。
このようなトラブルに遭遇することは滅多にないと思いますが、もしキャリーケースが破損した場合の対処法を以下にまとめました。


#### キャリーケース破損時の対処法

| 手順 | やること | 注意点 |
|-----------|-----------|-----------|
| 1 | バゲージクレームにキャリーケースの破損をすぐに申告する | すぐに申告しないと対応してもらえない場合があります。英語が苦手な方はkntの添乗員さんに相談すると通訳してもらえます。 |
| 2 | 担当者がキャリーケースの破損状況を確認 | 特になし |
| 3 | 担当者から保証内容の説明を受ける | 破損状況に応じて変わりますが、キャリーケースの交換やクーポンでの補償が一般的です。（私は両方受けました） |
| 4 | 荷物の詰め替え | 場合によっては中の荷物も破損していることがあります。破損している場合はそれも申告しましょう。 |
| 5 | 破損状況のまとめを実施 | 破損したキャリーケースや中の物品について、購入時期や金額、レシートの有無などの質問をされます。 |
| 6 | 最終的な保証内容の確認 | 荷物が破損している場合のみ、この手順が発生します。 |
| 7 | 連絡先の確認と書類へのサインを実施 | 帰国後の連絡先と保証を受け取ったことへのサインをします。 |

英語に自信がない場合はkntの添乗員さんにお任せするのがいいと思います。
僕は幸い英語がそれなりにできるのと、めっちゃ面白そうだったので自分で対応しました。
(3~6あたりが結構大変だと思うので、kntの添乗員さん頼るのが1番です！)

## 余談
余談ですが、僕のキャリーケースは各地を旅するとき使っていたやつだったので10年選手でした。
至る所にボロが出ていたので、「そろそろ新しいの買わないとな〜」と思っていた矢先に無料でゲットできたのでめっちゃツイてました。

ちなみにこれが、新しく手に入れたキャリーケースです。
調べたところ新品価格360$だったので、当時のレートだと5.5万~6万くらいのものですね。
![60422.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3425323/b7105890-15bd-eff8-7d8d-b82fcc9bad24.jpeg)

帰国後に航空会社から以下のようなメールが届きますが、基本的に対応することはないのでご安心ください。

もし万が一、同僚がツアー中にキャリーケースが破損したなどありましたら共有してやってください。

# 出国 ~ 帰国
無事に出国できたらもうこっちのものです、re:Invent期間中の疲労(*2)で基本的には座って数分したら気を失います。定期的にお手洗いと食事で起きるタイミングはありますが、気がついたらまた気を失ってます。

誇張なしにハーゲンダッツを食べたのとアマプラでDLしていたSPECを見た記憶しか残ってないです。
写真フォルダを見ても最後にトランジットで食べたピザを最後に写真が途絶えてました。

![60431.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3425323/19604cb4-d7f9-7d12-a671-8118e980d848.jpeg)


帰国はVisit Japan Webサービスで済ませていた申告に従って対応するだけなので、めちゃ楽です。
荷物を受け取ったら自由解散だったので、wifiレンタルの機器を返却してすぐに帰路につきました。

人によってはここから再度飛行機に乗って...みたいなこともあると思います。
後一息なのでここは頑張ってください。

# 帰国後
ちゃんと休める方は月曜日に有給休暇を取るなどして、休息に当てましょう。
弊社のメンバーは帰国後に「熱っぽくて検査したらコロナだったわw」みたいな例が複数あったので、無理だけはしないようにしましょう。

体力が回復したら出張報告や経費精算などやることがいっぱいですが、この辺りは頑張ってやりましょう...

ある程度落ち着いたら、社内向けにre:capをやるなどして現地の熱狂を持ち帰ることも重要です。


### 注釈
*1. [Visit Japan Webサービス | デジタル庁](https://www.digital.go.jp/policies/visit_japan_web)
*2. 基本的に期間中は平均睡眠時間が3~4hなのと毎日10km歩きつつ、5K走ったりしてたので限界でした。
「sympyのTriangleで、三角形に三角形を追加した。」自作プログラムmyTr02

**・(予定)名称 myPoinrToMatrix → myPointToMatrix** 　申し訳ありません。

・いつかは、作ってみたかった関数。
・tr1の[0]と[2]に、tr2を連結しています。(結局？ tr1の[1]は、使っていません。)
・**2点に三角形をとりつけただけじゃないの？**
　**直線上に三角形をとりつけただけじゃないの？**
　**その通りです。** 三角形に三角形を連結と言えば、高級に聞こえるかも。
　keywordが使えるという事で。 

# myTr02の使い方
・右上、tr1の[1]と[2]に、tr2を連結したい時、引数の順番をずらす。

# sympyで
・直角三角形を２個組み合わせて、長方形をつくった。
class sympy.geometry.polygon.Triangle(*args, **kwargs)
https://docs.sympy.org/latest/modules/geometry/polygons.html#sympy.geometry.polygon.Triangle
```python
from sympy import *
var('X',real=True,poitive=True)
def myMatrixToPoint(myMatrix):    
    return Point2D(myMatrix[0],myMatrix[1])
def myPoinrToMatrix(myPoint):    
    return Matrix([[myPoint.x],[myPoint.y],[1]]) 
def myTr02(tr1,tr2):
    t     =Line(tr1.args[0],tr1.args[0]+Point(1,0)).angle_between(Line(tr1.args[0],tr1.args[2]))
    myTurn=Matrix([[cos(t),-sin(t),tr1.args[0].x],[sin(t),cos(t),tr1.args[0].y],[0,0,1]])
    return Triangle(myMatrixToPoint(myTurn*myPoinrToMatrix(tr2.args[0])),
                    myMatrixToPoint(myTurn*myPoinrToMatrix(tr2.args[1])),
                    myMatrixToPoint(myTurn*myPoinrToMatrix(tr2.args[2])))
d=1
tr1=Triangle(sss=(sqrt(3),1,2))
tr2=Triangle(sss=(2,sqrt(3),1))
print("#",myTr02(tr1,tr2))
# Triangle(Point2D(0, 0), Point2D(sqrt(3), 1), Point2D(0, 1))
tr1=Triangle(sss=(sqrt(3),1,2))
tr3=Triangle(asa=(60,2,30))
print("#",myTr02(tr1,tr3))
# Triangle(Point2D(0, 0), Point2D(sqrt(3), 1), Point2D(0, 1))
```

# 作図
(省略)
「SEの成長戦略：有効時間を最大化する方法」

![title](https://raw.githubusercontent.com/legitwhiz/legitwhiz.github.io/master/technology_memo/images/1000007572.jpg)

# 「SEの成長戦略：有効時間を最大化する方法」

SEの本質について以前書きましたが、
やはりSEとしてただ仕事していればいい訳じゃなく、どれだけ成長したかがポイントだと思います。

## 有効な時間を得るためには

１つのプロジェクトで何を担当するかで、ある程度得られるスキルは決まってしまうことはありますが、そこは
決まる前にどれだけ主張出来るかにもかかってます｡

また、担当が決まってからも、他の人が忙しそうなら「手伝います」と言って結果的に仕事を奪っちゃえばいいわけですし!!

## 何が有効か
では、どこまでがSEとして有効なのか!?
それは目指している未来像によっての変わるとは思います｡

・当の本人が欲するスキルなのか!?
・次に繋がるスキルなのか!?
・技術者が少ないスキルなのか!?(希少性)
・世の中が欲するスキルなのか!?

## SE有効時間率

単純にSEが有効だと思われるスキルアップ・経験した時間をプロジェクトの総時間で割った率が、SEとしてそのプロジェクトで得られるスキルの有効率を算出出来る。

SE有効時間率＝SE有効時間/プロジェクト総時間*100

前置きは長くなってしまいましたが、要はスキルアップに繋がる時間を普段から意識し、スキルアップのない時間はなるべく避けることをお勧めします。

## 有効ではない時間
プロジェクト全体としては、設計書等の納品物は大事です。
ですが、SEとしては、提案書以外の設計書なんて、どうでもいいんです。(そんなこと言うと怒られそうですが)

なぜなら、提案書が書けるなら基本設計のイメージまで掴めてないと書けませんし、詳細設計も同様です。
イメージ出来ていない人が書いた設計書なんて、後で無関係な人が読んだところで理解なんて出来ませんしね!!
パラメータでもスクリプトも設計書より現物を作ってなんぼでしょ!!!

それこそ、認識を合わせるなら会議でホワイトボードに書きなぐればいいんですよ!!
口頭での会話なんて、空中戦なんで意識がズレるのも必然ですよ。
それこそ時間の無駄以外の何物でもない。
PHPでSSL関連のエラーでハマった件

CentOS7からUbuntu24.04にサーバーを入れ替えたところ、以下のエラーで悩んだ！
`Warning:  getimagesize(): SSL operation failed with code 1. OpenSSL Error messages:
error:0A000086:SSL routines::certificate verify failed in ・・・/tcpdf_images.php on line 166`  

php.iniの[openssl]セクションに
`openssl.cafile=/etc/ssl/certs/SectigoRSADomainValidationSecureServerCA.crt`を追加してもダメ  
`/usr/lib/ssl/openssl.cnf`にlegacy_sect追加してもダメ

散々ググって、やっと[これ](https://serverfault.com/questions/1118578/ubuntu-cannot-verify-sectigo-certificate)見つけて解決

`# cp /etc/ssl/certs/SectigoRSADomainValidationSecureServerCA.crt /usr/share/ca-certificates/extra/`  
`# dpkg-reconfigure ca-certificates`  

わかっちゃえばこれだけなのに。。。
【Ruby】ハノイの塔 (paizaランク A 相当)をやってみた

```ruby
# ハノイの塔の状態を追跡するクラス
class Hanoi
  attr_accessor :rods

  # 初期化メソッド
  def initialize(n)
    @n = n
    @rods = { "A" => (1..n).to_a.reverse, "B" => [], "C" => [] }
  end

  # ディスクの移動メソッド
  def move_disk(from, to)
    disk = @rods[from].pop
    @rods[to].push(disk)
  end

  # ハノイの塔の再帰的な解法
  def solve_hanoi(n, from, to, aux, t, move_count)
    return move_count if move_count >= t

    if n == 1
      move_disk(from, to)
      move_count += 1
      return move_count if move_count >= t
    else
      move_count = solve_hanoi(n - 1, from, aux, to, t, move_count)
      return move_count if move_count >= t

      move_disk(from, to)
      move_count += 1
      return move_count if move_count >= t

      move_count = solve_hanoi(n - 1, aux, to, from, t, move_count)
    end
    move_count
  end

  # ハノイの塔をt回移動させるメソッド
  def simulate(t)
    solve_hanoi(@n, "A", "C", "B", t, 0)
  end

  # 各杭の状態を出力するメソッド
  def print_rods
    @rods.each_value do |rod|
      if rod.empty?
        puts "-"
      else
        puts rod.join(" ")
      end
    end
  end
end

# メイン処理
if __FILE__ == $0
  n, t = gets.split.map(&:to_i)
  hanoi = Hanoi.new(n)
  hanoi.simulate(t)
  hanoi.print_rods
end
```

### 解説

1. **ハノイの塔の状態を追跡するクラス**
   ```ruby
   class Hanoi
     attr_accessor :rods
   ```

   - `Hanoi`クラスはハノイの塔の状態を追跡します。`@rods`変数は各杭の状態を保持します。

2. **初期化メソッド**
   ```ruby
   def initialize(n)
     @n = n
     @rods = { "A" => (1..n).to_a.reverse, "B" => [], "C" => [] }
   end
   ```

   - 初期化メソッドでは、円盤の数`n`を設定し、`@rods`ハッシュに各杭の初期状態を設定します。Aの杭には1からnまでの円盤が大きい順に積まれています。

3. **ディスクの移動メソッド**
   ```ruby
   def move_disk(from, to)
     disk = @rods[from].pop
     @rods[to].push(disk)
   end
   ```

   - `move_disk`メソッドは指定された杭`from`から`to`に円盤を移動します。

4. **ハノイの塔の再帰的な解法**
   ```ruby
   def solve_hanoi(n, from, to, aux, t, move_count)
     return move_count if move_count >= t
     if n == 1
       move_disk(from, to)
       move_count += 1
       return move_count if move_count >= t
     else
       move_count = solve_hanoi(n - 1, from, aux, to, t, move_count)
       return move_count if move_count >= t
       move_disk(from, to)
       move_count += 1
       return move_count if move_count >= t
       move_count = solve_hanoi(n - 1, aux, to, from, t, move_count)
     end
     move_count
   end
   ```

   - `solve_hanoi`メソッドはハノイの塔の再帰的な解法です。円盤を目的の回数`t`まで移動します。`move_count`は現在の移動回数を追跡します。

5. **ハノイの塔をt回移動させるメソッド**
   ```ruby
   def simulate(t)
     solve_hanoi(@n, "A", "C", "B", t, 0)
   end
   ```

   - `simulate`メソッドは`solve_hanoi`メソッドを呼び出し、円盤をt回移動させます。

6. **各杭の状態を出力するメソッド**
   ```ruby
   def print_rods
     @rods.each_value do |rod|
       if rod.empty?
         puts "-"
       else
         puts rod.join(" ")
       end
     end
   end
   ```

   - `print_rods`メソッドは各杭の状態を出力します。空の杭は`"-"`と表示されます。

7. **メイン処理**
   ```ruby
   if __FILE__ == $0
     n, t = gets.split.map(&:to_i)
     hanoi = Hanoi.new(n)
     hanoi.simulate(t)
     hanoi.print_rods
   end
   ```

   - メイン処理部分では、標準入力から`n`と`t`を取得し、`Hanoi`クラスを使用して円盤をt回移動させた後、各杭の状態を出力します。
【Ruby】配列の結合方法について

## はじめに
簡単なトランプゲームを作りました。その際、配列の結合方法が分からず調べたのでまとめておきます。
本記事では、実際にコードを書く際に試した方法を紹介します。

## Rubyでの配列の結合方法
### +演算子
+演算子を使って、2つの配列を結合することが出来ます。この方法では、新しい配列は作成され、元の配列は変更されません。
```ruby
array1 = [1, 2, 3]
array2 = [4, 5, 6]
new_array = array1 + array2
puts new_array.inspect
#=> [1, 2, 3, 4, 5, 6]
```
### concatメソッド
concatメソッドは、元の配列を変更して、指定した配列を末尾に追加します。
```ruby
array1 = [1, 2, 3]
array2 = [4, 5, 6]
array1.concat(array2)
puts array1.inspect
#=> [1, 2, 3, 4, 5, 6]
puts array2.inspect
#=>[4, 5, 6]
```
### pushメソッドとスプラット演算子の組み合わせ
pushメソッドにスプラット演算子を使うことで、複数の要素を一度に追加できます。これを利用して配列を結合することが出来ます。
```ruby
array1.push(*array2)
puts array1.inspect
#=> [1, 2, 3, 4, 5, 6]
puts array2.inspect
#=>[4, 5, 6]
```
### <<演算子とflattenメソッドの組み合わせ
<<演算子を使って配列同士を結合する場合は、結合結果がネストされてしまいます。結合後にflattenメソッドで１次元配列に変換する必要があります。
```ruby
array1 = [1, 2, 3]
array2 = [4, 5, 6]
array1 << array2
array1.flatten!
puts array1.inspect
#=>[1, 2, 3, 4, 5, 6]
```
## 動作環境
* Ruby 3.3.2
## 参考文献
* プロを目指す人のためのRuby入門（伊藤淳一 著）
## おわりに
いかがだったでしょうか？
配列がネストされていることに気付かず、要素を取り出そうとしたら意図した挙動にならなかった。という経験から配列の結合方法を調べて記事にしてみました。
それぞれの特性を活かして使い分けてみてください。
Pythonでのバイトデータ処理: struct.packとstruct.unpackの使い方

## はじめに
Pythonの`struct`モジュールは、バイトデータを扱う際に便利です。特に、C言語の構造体（struct）のようにデータをバイト列としてパック（pack）したり、バイト列からアンパック（unpack）したりする機能を提供します。

## structモジュールの概要

`struct`モジュールは、主に以下の2つの関数を提供します：
- `struct.pack()`: データをバイト列に変換（パック）
- `struct.unpack()`: バイト列からデータを取り出す（アンパック）

## 基本的な使い方

### struct.packの使い方

`struct.pack`は、指定したフォーマットに従ってデータをバイト列に変換します。

```python
import struct

# 整数2つをバイト列にパック
packed_data = struct.pack('ii', 1, 2)
print(packed_data)  # b'\x01\x00\x00\x00\x02\x00\x00\x00'
```

ここで、`'ii'`はフォーマット文字列で、それぞれの`'i'`は4バイトの整数（int）を意味します。

### struct.unpackの使い方

`struct.unpack`は、指定したフォーマットに従ってバイト列からデータを取り出します。

```python
import struct

# バイト列を整数2つにアンパック
unpacked_data = struct.unpack('ii', packed_data)
print(unpacked_data)  # (1, 2)
```

## フォーマット文字列の詳細

フォーマット文字列は、データの型とサイズを指定するために使用します。以下に主なフォーマット文字列を示します：

- `'x'`: パディングバイト（1バイト）
- `'c'`: char（1バイト）
- `'b'`: signed char（1バイト）
- `'B'`: unsigned char（1バイト）
- `'?'`: _Bool（1バイト）
- `'h'`: short（2バイト）
- `'H'`: unsigned short（2バイト）
- `'i'`: int（4バイト）
- `'I'`: unsigned int（4バイト）
- `'l'`: long（4バイト）
- `'L'`: unsigned long（4バイト）
- `'q'`: long long（8バイト）
- `'Q'`: unsigned long long（8バイト）
- `'f'`: float（4バイト）
- `'d'`: double（8バイト）
- `'s'`: char[]（文字列）
- `'p'`: パスカル文字列
- `'P'`: voidポインタ

## エンディアンの指定

エンディアン（バイトの並び順）は、フォーマット文字列の最初に指定できます。

- `'@'`: ネイティブエンディアン、ネイティブサイズ（デフォルト）
- `'='`: ネイティブエンディアン、標準サイズ
- `'<'`: リトルエンディアン、標準サイズ
- `'>'`: ビッグエンディアン、標準サイズ
- `'!'`: ネットワーク（ビッグエンディアン）、標準サイズ

例：

```python
import struct

# リトルエンディアンで整数をパック
packed_data = struct.pack('<ii', 1, 2)
print(packed_data)  # b'\x01\x00\x00\x00\x02\x00\x00\x00'

# ビッグエンディアンで整数をパック
packed_data = struct.pack('>ii', 1, 2)
print(packed_data)  # b'\x00\x00\x00\x01\x00\x00\x00\x02'
```

## 実際の例

例えば、座標データ（x, y, z）をバイト列として保存したい場合：

```python
import struct

# 座標データをパック
x, y, z = 10, 20, 30
packed_data = struct.pack('iii', x, y, z)
print(packed_data)  # b'\n\x00\x00\x00\x14\x00\x00\x00\x1e\x00\x00\x00'

# パックしたデータをアンパック
unpacked_data = struct.unpack('iii', packed_data)
print(unpacked_data)  # (10, 20, 30)
```
AZ-204: Microsoft Certified: Azure Developer Associate合格体験記

こんにちは、インフラエンジニア3年目のShintaです。今回は、Microsoft Certified: Azure Developer Associate（AZ-204）試験に合格した体験記を共有したいと思います。

## 1.受験のきっかけ
私はインフラエンジニアとして3年目を迎え、業務でMicrosoft Azureを使用して開発を行っています。Azureの知識をさらに深め、業務においてより高品質なソリューションを提供するために、この試験の合格を目指しました。

私の勤務する会社では、Azureを利用したシステム開発が日常的に行われています。具体的には、Azure App ServiceやAzure Functions、Azure Blob Storageなど、さまざまなAzureサービスを活用しています。これらの技術をさらに深く理解し、実務に応用するためにAZ-204の資格取得を決意しました​。

## 2. 勉強期間
勉強期間は1か月半でした。毎日の通勤時間2時間と帰宅後の2時間、1日合計で4時間の学習時間を確保し、計画的に学習を進めました。
私は開発の経験が浅くAzureの知識もそれほどなかったため、これだけ時間が必要でしたが、開発の経験がある方であればもっと短縮できるかもしれません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821209/996641f6-6f66-70dd-b62b-b655c5ca9e84.png)

## 3. 使用した教材
■**基礎学習**：[Microsoft Learn](https://learn.microsoft.com/ja-jp/credentials/certifications/azure-developer/?practice-assessment-type=certification)
Microsoft Learnは、Azureの基礎から詳細なトピックまで幅広くカバーしており、無料で利用できる学習リソースです。これを利用して、Azureの各サービスの概要を理解しました​。
■**問題集**：[AZ-204：Azure Developer Associate：模擬問題集（300問）](https://amzn.asia/d/0ewURchM)
Amazon Kindleで購入しました。AZ-204の問題集を探すのは苦労しましたが、これが唯一広範囲に対応できる問題集かと思います。Microsoft Learnで学習した後は、この問題集のみで勉強しました。
この模擬問題集を使用して、試験形式に慣れ、実践的な知識を身につけました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821209/6d74084f-ea40-e0cf-65ad-f63b420cf4e6.png)

## 4. 勉強方法
毎日の学習ルーチン
問題を解いて分からなければすぐ解説を読む: 分からない問題はその場で解説を読み、理解を深めました。
繰り返し解く: 模擬試験問題集を分からないところがなくなるまで繰り返し解いていきます。
集中した学習時間の確保: 通勤時間と帰宅後の時間を最大限に活用し、計画的に学習を進めました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821209/0af3b524-08ec-3bf3-0361-4110ae8207b2.png)

AZ-204は、AZ-900と比べて**受験料が高額**（21,100円）なため、自信を持てるまで勉強を繰り返してから試験に挑みました。結果、**850点**で合格できましたが、開発の経験等ある人であればより理解が早く効率的に合格できるかもしれません。
この試験を合格することで以前に比べて自信を持って業務に取り組めるようになったと感じています。また、試験に合格したことで周囲からの評価も上げることができました。
以上が、私がAZ-204試験に合格するために実践した勉強方法と使用した教材です。この方法を参考にして、ぜひ皆さんも合格を目指してください。