OmniAICreator/Qiita-1.07M huggingface dataset:
SESで楽な仕事、退屈な仕事は思うつぼだ

**＜本記事のターゲット層＞**
- SESの立場が大変だと感じている人
- SESが人売りに感じてしまっている人
- SESで働く意義が分からない人
- SESで働く将来が不安な人
- 仕事が辛くてたまらない人

ぜひ、[こちら](https://qiita.com/ochtum/items/ae460d680e3ef70c031f)の記事もお読みください。

## 1. はじめに
これは私の体験談が含まれており、必ずしも同じ思想を持っている人ばかりではないということを前提にお聞きください。

今回、皆さんにお伝えしたいことは、
(1) 楽な仕事など世の中にそうそうない
(2) 大変だからこそ価値があり、そこに対して対価が支払われている
(3) 楽であればあるほど、定型的であればあるほど価値が低く、支払われる対価は低い
ということです。

問題は(3)になります。これは自動化やシステム化しやすく、若手やパートなどに仕事を取られやすい領域でもあります。給与を上げるためには、そして年齢が上がっても仕事を続けるためには、より難易度が高く、大変なことができるようになっていかなければいけない。ということです。

## 2. なぜつらいことをしなければいけないのか
まず、イメージを持ってほしいことがあります。

それは、
(1) スキルアップをすればするほど、挑戦すればするほど、つらいことが一つずつ減っていくということ
(2) ゲームのレベルアップと違い、現実のスキルアップは[0.00001]ぐらいずつ上がるイメージであり、結果、体感するのは3年かかる
ということです。

それはスキルアップには知識も必要ですが、知識を得るだけでは達成することができないからです。センス、感性、経験といった感覚的なものが磨かれて初めてスキルアップを達成すると言えます。

若いときほど、知らなければいけないことは多いですし、挑戦しなければいけないことも多いです。しかし、何もしないままでいると年を経るごとに、よりつらい状態に陥ります。

なぜかというと、一般的には年を取るほど、より大変なことができることを期待されるからです。だから自分のペースでよいので、スキルアップは続けなければいけません。

## 3. 楽をしてはいけないのか？
注意しなければいけないのは、「楽をしてはいけない」わけではありません。

「めんどくさい」「つらい」「やる気がでない」「だるい」
こうした感情が生まれる背景には、業務が非効率である場合があります。これらの感情をきっかけに、仕事をやりやすく、効率的にすることが業務効率化であり、働き方改革とも言えます。

そうしたことに挑戦することそのものも、会社貢献という実績になり、スキルアップにつながります。

## 4. 楽な現場の注意点
世の中には、効率化のために「個性」をつぶし、個人の努力を許さず、機械的に作業をさせるというマネジメント手法があります。

こうした現場においては仕事は定型的で、自由がなく、融通が利かず、環境が変化しにくいようにできています。経験を積むのはこうした環境を構築する側だけでよく、ノウハウも環境を構築した側だけに溜まります。

このような現場であれば仕事はさぞ楽なことでしょう。しかし、その代償として経験が溜まらず、考える力が身につかず、スキルアップに繋がりにくくなります。

もっとも恐ろしいのは、こうした環境になれたまま、例えば50代になったらどうでしょうか。

若手でもできることであれば、単価が安い若手に人材が入れ替わる可能性が高いです。もちろん、単価だけでいえばオフショア開発のほうが安いのはたしかですけど。

しかし、選んでもらえる人材でいるためにはスキルが高いほうが良いのは間違いありません。


## 5. まとめ
この仕事は常に勉強をしなければいけないため、つらいと感じている人がそこそこいると思います。しかし、だからこそ価値があり、他の業種より高い水準の給与になっていることも事実です。

これからもこの業界で仕事をしたいならば、「自分のペース」で無理なくスキルアップを続けることが大事です。この業界で仕事をするメリットは、プログラミングの基礎は応用が利きやすいということがあげられます。

IT人材は他の人材よりも枯渇している状態にあります。副業の観点でもIT人材であれば有利な時代であると言えます。大変であるからこそ、収入を上げるチャンスが大きいのです。

とにかく、10年後、20年後の将来を見据えたとき、楽な現場ばかり回るということはそうした現場を作り上げた側にとって都合がよく、そうした現場に参加する側にとっては将来に繋がりません。スキルアップに繋がらないため、よりレベルの高い現場に挑戦しずらくなり、単価も上がりにくくなることでしょう。きっと仕事も単調でつまらなくなり、顧客からのあたりの強さで「SESはよくない業界」と感じてしまうかもしれません。

その結果、40代、50代の年齢になったとき、現場が見つかりにくくなり、別の業界に転職を余儀なくされることも考えられます。そうした状況を逆手に取り、地方に異動させて利益を得る会社もあります。人材は搾取しやすい人材であるということでもあるからです。

とにかく伝えたいことは、開発の仕事はそんなに単調でつまらない現場ばかりではなく、挑戦しがいがあり、顧客が優しいところだってあります。しかし、自分が選んでもらえる側にならないとそうした現場にはつきにくいということです。そのためにはスキルアップも必要ですが、自分がいかに役に立てて、課題解決の力になれるかをアピールする力も必要になります。

そして、そのためには大変なことを自ら進んで挑戦し、あるいは、顧客から言われたことを否定から話すのではなく、「実行するにはどうしたらいいか」という観点で前向きに挑戦する姿勢が大事です。
JSON の備忘録

# はじめに

JSON を扱う上での備忘録として動作を残しておく。

## `System.Text.Json` のデフォルト動作

- `public` であること
- プロパティであること
- `JsonPropertyName` が指定されいていると、その名前で出力される
- `JsonPropertyName` が指定されていないと、プロパティ名で出力される

## `Newtonsoft.Json` のデフォルト動作

- `public`、`private` は問わない
- プロパティ、変数は問わない
- `JsonProperty` が指定されていると、その名前で出力される
- `JsonProperty` が指定されていないと、プロパティ名または変数で出力される
- `private` で且つ、 `JsonProperty` が指定されていないと無視される
#72　【GAS】スプレッドシートの内容を読み取ってGASのログに出力してみた

### はじめに
今回は、スプレッドシートに保存した内容をGASを使って読み取り、ログに出力してみました。
GASとスプレッドシートを用いてDBの代わりのように使えるそうなので、その前段階としてデータの取得を行ってみます。


### 手順
#### 注意点
スプレッドシートには列数行数の制限や処理速度の問題があり、大量のデータを扱うには向いていません。
また、スプレッドシートをDBとして使用する場合、アクセス権の設定に気を付けてください。


#### 1.スプレッドシートを準備する
スプレッドシートに"Sheet1"（※）という名前のシートを作成し、データを入力します。
※後述のコードでシート名を指定する必要があるので、あえて"Sheet1"という名前にしています。
※コード内の名前とシート名が一致していればよいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843084/6d464fd5-e21f-10e2-03f7-0b7e61cc5b83.png)

各列はデータのフィールド、各行はレコードを表しています。
```
id　name　address　occupation
```
今回は、4つのフィールドを作成しました。
　

#### 2.GASを使ってスプレッドシートのデータを読み込む
GASを使用して、スプレッドシート内のデータにアクセスします。
スプレッドシートのヘッダー＞拡張機能＞Apps Script
を押下でGASが開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843084/d723badf-cb29-45c3-baf3-361b5b06f9e2.png)


以下のコードを自身で作成したスプレッドシートの内容に合うよう修正してエディタに入力してください。

```javascript
function readData() {
  // 作成したシート"Sheet1"を取得する
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
  // シートからデータの範囲を取得する
  var dataRange = sheet.getDataRange();
  // データ範囲からデータ（値）を取得
  var dataValues = dataRange.getValues();
  
  // 取得したデータ（値）をループ、ログに出力
  // ヘッダー行を出力しないようにするため i=1 から開始する
  for (var i = 1; i < dataValues.length; i++) {
    var row = dataValues[i];
    // row[0] (id : A列)は今回出力したくないため飛ばす
    var name = row[1]; // B列
    var address = row[2]; // C列
    var occupation = row[3]; // D列
    Logger.log("名前: " + name + ", 住所: " + address + ", 職業: " + occupation);
  }
}
```
入力後、「実行する関数を選択」で作成した関数名が選択されていることを確認してください。
上記のコードの場合は「readData」が選択されているようにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843084/34505e2a-3490-e471-45f5-714a7900f917.png)

「プロジェクトを保存」を押下⇒「選択した関数を実行」を押下で関数が実行されます。


#### 実行結果
実行すると、スプレッドシートに入力したデータがきちんとログに出力されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843084/84ba29b8-6885-4e46-8d35-1e072463e115.png)

### 最後に
今回はGASを使ってスプレッドシートの値を取得するところまで行ってみました。
今度、実際にAPIとしてWebアプリ側から呼び出せるようにしてみたいと思います。
ご覧いただきありがとうございました。
URLと画面内容がずれないように設計する


## ここでいう「URL」は主に画面が対象
- URLを起点に考える
  「この処理を行うのはどんなURLが相応しい？」
- URLと画面内容がずれると困ることが多い
  ブックマークがおかしくなる

---
## 具体例１：Qiitaの新規記事作成


----
## 具体例２：とあるアプリ
- 一覧画面にて「新規作成」をクリックすると、新しい図が作成され、編集画面が開く
- みなさんはどう設計しますか？

----
## 私が考えた作り
- 「新規作成」を推すと```/diagram/new```に遷移
- ```/diagram/<diagram-id>```のブラウザにて処理：diagram-idが"new"の場合、APIにて新しい図の作成をリクエスト
- 戻り値の図IDで URLを組み立て、 ```/diagram/APIの戻り値の図ID``` にリダイレクト

----
## 別解
- 「新規作成」を推すと```/diagram/new```に遷移
- ```/diagram/<diagram-id>```のサーバ側処理にて新しい図を作成、そのIDから組み立てた```/diagram/新しい図のID```へのリダイレクト(301)レスポンスを返す

----
## 大事なこと
- ```/diagram/new```をいつまでも表示しない。図にIDが振られた時点でそのURLを使う
- こうしておくことで、例えばブックマークしたり、他の画面からのリンクが簡単に貼れるようになる
- 特に後者が重要で、URLへのリンクを張るだけで正しく遷移できる状態を作っておくことはWebアプリの柔軟性を支える重要な基礎技術

----
## 最後に
- URLは外部仕様と考える（画面設計と同レベル）
- 特に画面のURLはきれいに設計しておくと吉
- 画面をアドレスバー直で移動できるので開発のスピードアップにも繋がる
失敗事例でわかる！WBS活用の勘所 - スケジュール表では見えない航海図としての真価

# 実務で使えるWBS事例：ECサイトリニューアルプロジェクト

## はじめに

「スケジュールどおりに進んでいます」という報告を鵜呑みにしていませんか？
本記事では、ECサイトリニューアルプロジェクトの実例を通じて、WBSの本質と効果的な活用方法を解説します。

## プロジェクト概要
- プロジェクト名：ECサイトフルリニューアル
- 期間：6ヶ月（2024年4月〜9月）
- 予算：5000万円
- チーム構成：10名

## 失敗パターン：単なるスケジュール表での管理

### ダメな例：単純な進捗率管理

| 作業項目 | 予定工数 | 実績工数 | 進捗率 | ステータス |
|---------|----------|----------|---------|------------|
| 要件定義 | 160h | 160h | 100% | 完了 |
| 基本設計 | 240h | 240h | 100% | 完了 |
| フロントエンド開発 | 640h | 288h | 45% | 予定通り |
| バックエンド開発 | 800h | 336h | 42% | 予定通り |
| インフラ構築 | 320h | 160h | 50% | 予定通り |

**問題点：**
- 工数消化のみを見て「予定通り」と判断
- 成果物の品質や依存関係を考慮していない
- 実際の完成度が不明確

## 改善後：WBSを航海図として活用

### 1. 成果物ベースのWBS構成例

| レベル1 | レベル2 | レベル3 | 成果物 | 受入基準 | 依存関係 |
|---------|---------|---------|---------|-----------|-----------|
| 1.フロントエンド | 1.1 商品一覧 | 1.1.1 一覧表示 | ・商品一覧画面<br>・検索機能<br>・ソート機能 | ・レスポンシブ対応<br>・1000件表示での性能要件クリア | ・商品API完了<br>・デザインシステム確定 |
| | | 1.1.2 フィルタ機能 | ・カテゴリフィルタ<br>・価格範囲フィルタ | ・複数条件の組み合わせ対応 | ・カテゴリマスタ移行 |
| | 1.2 決済機能 | 1.2.1 カート | ・カート画面<br>・数量変更 | ・在庫数チェック<br>・リアルタイム価格反映 | ・在庫API完了 |
| 2.バックエンド | 2.1 商品API | 2.1.1 検索API | ・API仕様書<br>・実装コード | ・応答時間1秒以内<br>・負荷テスト完了 | ・DB設計完了 |

### 2. マイルストーン管理表

| マイルストーン | 完了予定日 | 前提条件 | 評価基準 | 現状 |
|---------------|------------|-----------|-----------|-------|
| MS1:基本設計完了 | 5/15 | ・要件定義書承認<br>・外部連携仕様確定 | ・設計書レビュー完了<br>・ステークホルダー承認 | 完了 |
| MS2:結合テスト開始 | 7/1 | ・単体テスト完了<br>・テスト環境準備 | ・テスト仕様書作成<br>・テストデータ準備 | 遅延 |
| MS3:受入テスト開始 | 8/15 | ・結合テスト完了<br>・性能要件達成 | ・テスト報告書承認<br>・残課題0件 | 未着手 |

### 3. 依存関係管理表

| ID | 先行タスク | 後続タスク | 依存度 | リスク | 対策状況 |
|----|------------|------------|---------|---------|-----------|
| D1 | デザインシステム確定 | フロントエンド実装 | 高 | デザイン変更による手戻り | レビュー実施中 |
| D2 | API仕様確定 | フロントエンド実装 | 高 | インターフェース齟齬 | 仕様書作成中 |
| D3 | 決済事業者連携仕様 | 決済機能開発 | 中 | 連携テスト遅延 | 調整会議週次実施 |

### 4. 進捗確認シート

| 機能分類 | 機能項目 | 実装状況 | テスト状況 | 課題・リスク |
|----------|----------|-----------|------------|---------------|
| 商品表示 | 一覧表示 | 90% | 未着手 | ・画像表示パフォーマンス改善要 |
| | 詳細表示 | 70% | 未着手 | ・レビュー表示の仕様未確定 |
| 会員管理 | ログイン | 100% | 実施中 | ・セキュリティレビュー待ち |
| | 会員登録 | 80% | 未着手 | ・入力バリデーション追加必要 |

### 5. 週次レビューチェックリスト

| 確認項目 | 確認ポイント | 確認結果 | 対応方針 |
|----------|--------------|-----------|-----------|
| 成果物の品質 | ・コードレビュー実施<br>・テストカバレッジ | ・レビュー83%完了<br>・カバレッジ75% | ・レビュー優先度見直し |
| 依存関係の解決 | ・ブロッカーの有無<br>・調整事項の進捗 | ・決済連携仕様未確定 | ・次週までに確定予定 |
| リスク状況 | ・新規リスクの発見<br>・対応状況の確認 | ・パフォーマンス問題検出 | ・チューニング計画策定中 |

## 実践的なWBS活用のポイント

### 1. 進捗報告時の確認項目

良い例：
```
□ 各成果物の具体的な完了状況
□ 品質基準に対する達成度
□ 依存関係の解決状況
□ 次のマイルストーンの達成見込み
```

悪い例：
```
× 単純な工数消化率
× あいまいな進捗状況
× 課題やリスクの報告漏れ
```

### 2. 効果的なステータスレビューの進め方

1. 成果物ベースの確認
   ```
   1. 具体的な成果物の確認
   2. 品質基準との照合
   3. 受入条件の達成度確認
   ```

2. 依存関係の確認
   ```
   1. ブロッカーの有無確認
   2. 外部調整事項の進捗確認
   3. リスクの早期発見
   ```

## まとめ

WBSを航海図として活用するためのポイント：

1. **成果物中心の管理**
   - 工数消化ではなく、成果物の完成度を重視
   - 具体的な受入基準を設定

2. **マイルストーンの戦略的設定**
   - 重要な判断ポイントを明確化
   - 具体的な評価基準を設定

3. **依存関係の可視化**
   - 関係者間の認識合わせ
   - リスクの早期発見と対策

## 著者プロフィール
大規模ECサイト開発のプロジェクトマネージャーとして10年以上の経験を持つ。WBSを活用した可視化と進捗管理により、数々のプロジェクトを成功に導いてきました。

## 参考文献
- 『実践プロジェクトマネジメント』
- 『WBSで失敗しないプロジェクト計画』
- PMBOKガイド 第7版
叫び声でプログラミングできるようにした

どうもAtsu1209です。
今回は叫び声でプログラミングできるようにした話を書いて行きます。

# 言語
**F*cking Scream Programing Language**
**通称Aaalang**
BrainF*ckをベースに作ったものです

# サンプルコード
Hello
```code.aaaa
AaAAaAAaAAaAAaAAaAAaAAaAaaAAAAAaAAaAAaAAaAAaAAaAAaAAaAAaAAAaAaaaaaAAAaAAAAAAaAAaAAaAAaAAaAAaAAaAAaAAaAAaAaaAAAAAaAAaAAaAAaAAaAAaAAaAAaAAaAAaAAAaAaaaaaAAAAaAaAAAAAAaAAaAAaAAaAAaAAaAAaAAaAAaAAaAaaAAAAAaAAaAAaAAaAAaAAaAAaAAaAAaAAaAAAaAaaaaaAAAAaAAaAAaAAaAAaAAaAAaAAaAaAAAAAAaAAaAAaAAaAAaAAaAAaAAaAAaAAaAaaAAAAAaAAaAAaAAaAAaAAaAAaAAaAAaAAaAAAaAaaaaaAAAAaAAaAAaAAaAAaAAaAAaAAaAaAAAAAAaAAaAAaAAaAAaAAaAAaAAaAAaAAaAaaAAAAAaAAaAAaAAaAAaAAaAAaAAaAAaAAaAAAaAaaaaaAAAAaAAaAAaAAaAAaAAaAAaAAaAAaAAaAAaAaAA
```
こんな感じで`あああああああああ`と叫ぶだけです。
コードは`code.aaaa`とというファイルから読み取っています。
ちなみに拡張子も`aaaa`になってます

# BrainF*ck
BrainF*ckを元に作っているので対応表があります。
|Brainfuck|AAA|
|:---:|:---:|
|`>`|`AAA`|
|`<`|`AAa`|
|`+`|`AaA`|
|`-`|`Aaa`|
|`.`|`aAA`|
|`,`|`aAa`|
|`[`|`aaA`|
|`]`|`aaa`|

# 最後に
BrainF*ckを知ってるといいことあるよ


今回参考にした記事

https://qiita.com/claustra01/items/b422ea740c3cb0dc62b6
【ChatGPT】Step-by-Stepで行なう翻訳Promptです（論文→Prompt）


　どうも、カーブミラーです。

　今回は、Step-by-Stepで行なう翻訳Promptです。Googleの論文をもとにPromptを作成しました。

:::note info
本記事は、ChatGPT（有料版）
で行なっております。画像は
ありません。　あしからず。
:::
　ChatGPT等の動作状況を知らせる
　　OpenAIのステータスページ。
　　　[OpenAIステータス](https://status.openai.com/)

***
　ニュースはありませんので、
　　さっそく、本題です。

　今回は、
　　Step-by-Stepで行なう
　　　翻訳Promptです。

　Googleの論文をもとに
　　Promptを作成しました。

　こちらがその論文の概要です。
　　詳細は、PDFにまとめられています。
[Translating Step-by-Step: Decomposing the Translation Process for Improved Translation Quality of Long-Form Texts](https://arxiv.org/abs/2409.06790)

タイトルDeepL翻訳
>ステップ・バイ・ステップで翻訳する：
長文の翻訳品質向上のための翻訳プロセスの分解

　ChatGPT出力の概要
>長文テキストの翻訳品質向上のため、翻訳プロセスを分解し段階的に進めるアプローチを提案しています。従来の機械翻訳が1ステップで完結するのに対し、本研究では複数回のやりとりを通じて翻訳を進行させ、事前調査、初稿作成、改良、校正を含むフレームワークを構築しています。

　こちらのPDFを
　　ChatGPTに読み込ませて
　　　基本Promptを作成してもらい、
　　　　それに手を加えました。

　とある小説のひとつの段落を
　　翻訳させてみたところ、
　　　単純に翻訳させるよりも
　　　　よくなった気がします。

　　日本語→英語→日本語での
　　　実験です。

　ここでは
　　出力結果は
　　　助長になるため、
　　　　出さずにおきます。

　ただ、
　　生成のたびに
　　　結果が微妙に変わります。
　　　　これは生成AIの宿命ですね。

　みなさんで
　　試してみてください。

　では、
　　Promptです。

　以下のの三点を書き変えてください。
　・0の翻訳前言語
　・0の翻訳後言語
　・最後のテキスト（（）は外して）

　例えば、以下は英文を和訳します。
　・英語
　・日本語
　・英文
```Text:Step-by-Step翻訳Prompt
# 0. 目的
与えたテキストの翻訳（翻訳前言語→翻訳後言語）

# 1. 事前調査プロンプト
以下のテキストを翻訳する前に、内容を理解し、翻訳時に注意すべき文化的または文脈的な要素を特定してください。特に、固有名詞、専門用語、文化特有の表現に注意を払い、翻訳上の課題や考慮すべき点をリストアップしてください。

# 2. 初稿作成プロンプト
上記の事前調査の結果を踏まえ、以下のテキストを忠実かつ自然な言語に翻訳してください。文脈と文化的要素を考慮し、原文の意味とニュアンスを正確に伝えるようにしてください。

# 3. 改良プロンプト
以下の翻訳文を見直し、表現の自然さ、文法の正確さ、一貫性を向上させてください。特に、前後の文脈との整合性や、専門用語の適切な使用に注意を払い、必要に応じて修正を行ってください。

# 4. 校正プロンプト
最終的な翻訳文を校正し、誤字脱字、文法的誤り、スタイルの不統一を修正してください。全体の流れと一貫性を確認し、最終的な仕上げを行ってください。

# 5. 最終稿の処理
最終稿を、コードブロックに出力してください。

# テキスト
（翻訳前テキスト）
```

　私が手を加えたのは
　　0と5とテキストの部分、
　　　それに2の“自然な言語”の部分。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
atcoder練習(2024.11.14)

# キーワード
while, list
# 問題
https://atcoder.jp/contests/abs/tasks/abc081_b

黒板に 
N 個の正の整数 
A 
1
​
 ,...,A 
N
​
  が書かれています．

すぬけ君は，黒板に書かれている整数がすべて偶数であるとき，次の操作を行うことができます．

黒板に書かれている整数すべてを，
2 で割ったものに置き換える．
すぬけ君は最大で何回操作を行うことができるかを求めてください．

制約
1≤N≤200
1≤A 
i
​
 ≤10 
9
 
入力
入力は以下の形式で標準入力から与えられる。

N
A 
1
​
  
A 
2
​
  ... 
A 
N
​
 
出力
すぬけ君は最大で何回操作を行うことができるかを出力せよ．

入力例 1
Copy
3
8 12 40
出力例 1
Copy
2
最初，黒板には 
[8,12,40] が書かれています． このとき，書かれている整数はすべて偶数なので，操作を行うことができます．

1 回操作を行った後，黒板には 
[4,6,20] が書かれています． 再び，書かれている整数はすべて偶数なので，操作を行うことができます．

2 回操作を行った後，黒板には 
[2,3,10] が書かれています． この時，奇数 
3 が書かれているため，これ以上操作を行うことはできません．

よって，すぬけ君は最大で 
2 回操作を行うことができます．

入力例 2
Copy
4
5 6 8 10
出力例 2
Copy
0
最初から奇数 
5 が書かれているため，すぬけ君は一回も操作を行うことができません．

入力例 3
Copy
6
382253568 723152896 37802240 379425024 404894720 471526144
出力例 3
Copy
8

# 回答
```Python
N = int(input())
A = list(map(int, input().split()))

answer = 0

while all(num % 2 == 0 for num in A) == True:
  answer += 1
  A = [x/2 for x in A]
  
print(answer)
```

# 参考
https://qiita.com/zhengxi__/items/15f1941f53204f40f30d

# 備考
- なぜかループとなると、forばっかりでwhileが思いつかない。whileを理解していないということだと思う。
- 今まで計算はnumpyでやっていたので、listの四則演算がめちゃんこ面倒だということを理解した。
- ここら辺のアルゴリズムはなんとなく頭の中で出てくる、あとはそれをプログラム言語を介して表現するだけの問題だと思う。
文系卒未経験のSEが普段の業務中に意識していること3つ

## はじめに
新卒で入社してから気づけばもう3年目の年になっていました。

単語すらわからずがむしゃらについていくのが精一杯だった1年目、
少しづつ業務に慣れてくるのと同時に任される仕事のハードルが上がり、がむしゃらにこなしていくので精一杯になりがちだった2年目、
そして今が3年目です。
今も日々悪戦苦闘しながら業務をこなしていますが、
以前よりは余裕が出てきたんじゃないかなと思います。

余裕のヨの字も目に入らないくらい精一杯だった文系卒未経験のSEである私が、
心に余裕をもって普段の業務にのぞめるように意識している3つのポイントをご紹介します。

## ①挨拶
当たり前のことだろうと思われる方も多いかもしれませんが、実際これにつきます。
挨拶というのは百利あって一害なしです。挨拶されて嫌な人は基本いません。
自分からたった一言挨拶をするだけで、
「顔見知りを増やせる」、「相手に好印象を残せる」、「自己肯定感が上がる」などいいことづくめです。
技術関係に自信がない人でも誰でもできて、しかも簡単。やらない手はありません。
実際現場に出てみるとよくわかるのですが、挨拶をしない人・小声すぎて聞こえない人は本当に多いです。
挨拶をしない人はともかく、小声すぎて聞こえない人はもったいなさすぎます。
挨拶だけに限らず、自分は何かしているつもりでいても、それが相手に伝わっていなければ意味がありません。
気づいてもらう、察してもらうなどの受け身でいると逆に心が疲れる原因にもなるので、
一歩勇気を出して自分スタートで行動することを意識することが大事だと思います。
そのはじめの一歩としても挨拶はぴったりだと思いますので、ぜひ意識してみてください。

## ②タスクの見える化
やることが多くなってくると、あれやってこれやってそれもやってそのあと～といったように、
頭の中がぐちゃぐちゃになって心に余裕がなくなることってありませんか？
そのせいで焦ってミスを連発なんてこと、私はしょっちゅうでした。
これをなんとかしようと取り組んだのが、タスクの見える化でした。
自分のタスクはいくつあるのか、それぞれの期限はいつなのか、終わらせるのにかかる時間はどれくらいか
この3つをまず書き出して整理するだけでも、自分の中で予定が立てられる部品がそろうので、
予定・目標をたててそこにまっすぐ進むことができます。
ゴール、つまりタスクの終わりがわかっているのといないのでは、人が発揮できるパフォーマンスは雲泥の差かと思います。
心に余裕をもって業務を進めるためにも、常に自分が抱えているタスク量を把握しておくことが大事になると思います。

## ③質問すること前提で話を聞く
なにか説明を受けたとき、たいていは最後に質問はありますか？と聞かれます。
このとき、本当になければそれでいいのですが、
少し経ってから、「あれ、やっぱこれわからないな」となって質問してしまうこと、
私はよくあります。

この時すぐに質問できる環境であれば解決に時間はかかりませんが、
質問したい人がお忙しい方だったり、リモートでのやりとりだった場合、
追加でかなりの時間がかかってしまうことも少なくありません。
相手としても、質問あるかきいたのになという気持ちになってしまい
お互いによくないので、こういった状況はなるべく避けるようにしています。

そのために、相手の話を聞くときは、なにか質問するつもりで聞くようにしています。
意識して聞くと、別途確認の手間も減りますし、話の内容も記憶に残りやすいです。
それに、必ずなにか質問しなければならない場面とかもたまにあったりしますので、
そういったときにも役立つかと思います。

## おわりに
自分が普段意識していることを整理するいい機会となりました。
まだまだ意識はしているが実際できていないこともたくさんありますので、
また、日々精進していきたいと思います。
ここまで閲覧いただきありがとうございました。
Invoke-WebRequest : パラメーター名 'Form' に一致するパラメーターが見つかりません。


https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.utility/invoke-webrequest?view=powershell-7.4#-form


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/b22f3cd6-818a-6527-58cd-f605a720a2b1.png)


```
$PSVersionTable

Name                           Value
----                           -----
PSVersion                      5.1.22621.4391
```
Google Cloud Build で cache: true 設定が引き起こす問題と対策

# はじめに
Google Cloud Build では、ビルドの高速化のためにキャッシュ機能が提供されています。
cloudbuild.yaml において cache: true を設定することで、過去のビルド結果を再利用し、ビルド時間の短縮が図られます。
しかし、同じタグでイメージを更新するようなイメージを使用している場合、このキャッシュ機能が予期しない動作を引き起こすことがあります。

例)

https://hub.docker.com/layers/library/buildpack-deps/bookworm-curl/images/sha256-41e41eb5a1eb21e97dc86dcc037ad0f73605f83b56c1c73464dd1db9196a4983?context=explore

# 解決方法
## 1. キャッシュを無効にする
キャッシュを使用しない設定を行うことで、常に最新のビルド結果を取得できます。以下のように cache: false を設定します：

```yaml
steps:
  - name: 'gcr.io/cloud-builders/docker'
    args: ['build', '-t', 'your-image:latest', '.']
    cache: false
```
これにより、毎回キャッシュなしでビルドが行われ、最新の内容が反映されます。

## 2. タグにユニークな識別子を付与する
コミットハッシュやビルド番号などのユニークな識別子をタグに付けることで、キャッシュの再利用を防ぎます。例えば、latest の代わりに以下のようにタグを設定します：

```yaml
steps:
  - name: 'gcr.io/cloud-builders/docker'
    args: ['build', '-t', 'your-image:${COMMIT_SHA}', '.']
```

これにより、毎回異なるタグが付けられ、キャッシュが無効化されます。
DELL R520でZFSを使ってみる

### なにをしたいのか
R520にTrueNASをインストールしてZFSでファイルサーバをつくりたい
R520にはH310、H710系のRAIDカードが搭載されており、ZFSを扱う際にはRAIDカードが非推奨（データが消える可能性がある）のため、その問題を回避したい


### わかっていること
マシンに直接TrueNASを導入してZFSを使っても、proxmoxなどで仮想化しても根元のHBAが問題源なのでドライバを書き換えないとデータが消える事象は解決しない。
なんならTrueNASでもproxmoxでもワーニングが出る

### 構成
DELL poweredge R520 
RAID card H710
proxmox インストール済み

### 1.
PREC h710 をITmode にromを書き換え
IRモード→ITモードにする

下記リンクからromを落とす
```
https://fohdeesha.com/docs/perc.html
```

※一番大事なとこなので今後解説する。たぶん
一応リンク先に英語で全部書いてあるのでそれくらい頑張って読んで
### 2.OSでZFS構築

1.1diskを初期化する
使用状況がddf_raid_memberになっているディスクを選択し、ディスクの消去 を選択してディスクの初期化を行う
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843315/bef8a68a-c367-c7f9-db75-daced74e7aa9.png)


シェルから
```
ls -al /dev/disk/by-id/
```
目的のディスクを探して、

```
zfs raidz2
```

できたzfsデータセットをVMにマウントする

書きかけで何もわからないかもしれない
BigQuery Tips パーティションテーブルを作成するDDL

BigQueryでパーティションテーブルを作成するときに使うDDLをよく忘れるのでまとめようと思う。

#### 1, 日付パーティション（DATE型の列を使用）
```sql 
-- 1. 日付パーティション（DATE型の列を使用）
CREATE OR REPLACE TABLE my_project.example_dataset.daily_sales_partition
PARTITION BY DATE(event_date)
AS
SELECT * FROM source_table;
```
DATE(event_date)で、event_date列がDATE型指定
このパーティションは、日付単位で分割




#### 2, 日時パーティション（TIMESTAMP型の列を使用）
```sql
-- 2. 日時パーティション（TIMESTAMP型の列を使用）
CREATE OR REPLACE TABLE my_project.example_dataset.event_logs_timestamp_partition
PARTITION BY TIMESTAMP_TRUNC(event_timestamp, DAY)
AS
SELECT * FROM source_table;
```
TIMESTAMP_TRUNC(event_timestamp, DAY)でevent_timestamp列をTIMESTAMP型で日単位にパーティション化、パーティション単位は**HOUR**、**DAY**、**WEEK**、**MONTH**、**YEAR**など指定可能



#### 3, 整数範囲パーティション（INTEGER型の列を使用）
```sql 
-- 3. 整数範囲パーティション（INTEGER型の列を使用）
CREATE OR REPLACE TABLE my_project.example_dataset.customer_segments_partition
PARTITION BY RANGE_BUCKET(customer_id, GENERATE_ARRAY(1, 100, 10))
AS
SELECT * FROM source_table;
```
customer_id列を整数範囲でパーティション化
GENERATE_ARRAY(1, 100, 10)により、1から100までの範囲を10ごとに分割する例
これは今のところあまり使い所がなかった
EC2からインターネットに出るを低料金にメモ

料金は2024/11/14現在の情報

## yumはS3エンドポイントで
リポジトリにS3のものがあることを活用する形。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3916302/ffb04ce3-0141-df05-4de5-be7925c4554e.png)
ちなみにサブネットとの関連付けは即座に反映される。

## dockerイメージを取ってくる場合とかは
一時的にパブリックIP割り付ける
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3916302/8b1d123d-1521-f2fb-a485-c31a49b26e53.png)
$0.005/h（2024/2/1から無料ではなくなり、IPv6推奨らしい。750h/月の無料枠アリ）
請求額は 1 秒単位の増分で計算され、最小は 60 秒
ちなみにパブリックIPの割り当ては（ルートテーブルの変更も）即座に反映される。

### Elastic IPアドレス（EIP）ってのもあるけど
copilotさんによると
>コスト: 使用されていないElastic IPアドレスに対して課金が発生します。つまり、インスタンスに関連付けられていないEIPには料金がかかるため、不要なEIPを解放することをおすすめします。
>
>用途: 静的なパブリックIPアドレスが必要な場合や、インスタンスのパブリックIPアドレスが変更されると困る場合に使用されます。

前述でEC2に割り付けるパブリックIPとの差異は、静的で再利用したいかどうか。
課金は使用していようが未使用だろうが課金されるので、一時的な用途には不向き
請求額は 1 秒単位の増分で計算され、最小は 60 秒（前述と同じ）

## ずっとつなぐならNATゲートウェイ
$0.062/h
>NAT ゲートウェイがプロビジョニングされ利用可能になると 1 時間あたり 0.045 USD が必ず適用されます。
なので1秒から課金

また、1GB毎に$0.062が別で課金される。切り捨てとか不明

## まとめ
必要な時にEC2に一時的なパブリックIP割り付けるという手段で運用する。
【BizRobo!】ループ中にエラーが発生した場合、ループを終了させたい！

## はじめに

今回は、 **「ループ中にエラーが発生した場合、ループを終了させる方法」** をご紹介します！

MCのスケジュールからロボットを実行している場合、BizRobo!の仕様上、ループの途中でエラーが発生すると、すべてのイテレーションが実行されてからエラーとなります。

予定しているイテレーション数が多い場合、エラーが発生しても停止せずに稼働時間が長くなってしまう（とくにDA）ため、その対処法をご紹介します。

あくまで一例ですので、参考程度にご覧ください！

:::note warn
記事内のロボットは v10.4.0.4 で作成しています。
:::

## 設定方法
すべてのステップのエラー処理にループ終了を設定すれば、実現したい処理はできますが、現実的ではないため、今回は「エラーフラグ」変数(グローバル)でエラーハンドリングします。


基本的な形は下記のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3685566/74d90b03-2a2a-d719-faea-5bd58066c1a0.png)

1. エラーフラグが立っていない(0)か確認
2. 処理中はエラーフラグを立てる(1)
3. 処理終了でエラーフラグを戻す(0)

上記のように設定することで、ステップ1つずつにエラー処理を入れることなくエラー検知することができます。


注意点としては、
エラー処理に「次のイテレーション」が入っているステップには、エラー処理を「次の代替手段を試行」に変更しフラグを戻す処理、
ブランチ・分岐で処理終了点が分かれている場合は、それぞれにフラグを戻す処理を入れる必要があるので気を付けてください。

例：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3685566/053ca3fb-0026-0776-c95c-0a4126a89fb2.png)

## さいごに
ご覧いただきありがとうございました！

今回紹介したのは、ただループを終了させるだけでしたが、トライステップに飛ばすなどすれば、エラー時の処理を設定できます。

ぜひ参考にしていただければ幸いです。
ブラウザで表示されているリンク取得

ブラウザで表示されているリンク取得



// すべてのリンクの href 属性を取得してコンソールに表示する
const links = Array.from(document.querySelectorAll('a'));
const hrefs = links.map(link => link.href).filter(href => href);

// すべてのリンクをコンソールに出力
console.log("リンク一覧:");
hrefs.forEach(href => console.log(href));

// クリップボードにコピー
const textToCopy = hrefs.join('\n');
navigator.clipboard.writeText(textToCopy)
  .then(() => console.log("すべてのリンクがクリップボードにコピーされました。"))
  .catch(err => console.error("コピーに失敗しました: ", err));
[VBA]初心者脱却～コピペは配列を使え！～

## コピー&ペーストを使わない選択
VBAで最初に取得するといっても過言ではないコピペ。
最初はコピペが自動で動いているのに大興奮していましたが、
大きな処理になるにつれてだんだん時間がかかることに引っかかるんです。

「自動で動くのはいいけど処理に時間がかかるな…」

処理中は他のことができるけど、でも処理がすぐ終わった方がうれしい…
VBAの高速化は次のレベルへの最重要課題になってきます。
おまじない（ScreenUpdating=FalseやCalculation=xlCalculationManual）の次にやるのは配列によるコピペ！
配列を理解できればVBAはもっと広がります！ぜひご一読を

https://indoor-nekura.work/vba_copypaste/
wslでrust その9

# 概要
wslでrustやってみた。
練習問題やってみた。

# 練習問題
インラインアセンブラを実行せよ。

# 方針
- cpuidを取得してみる。

# サンプルコード

```
use std::arch::asm;

fn main() {
	let mut name_buf = [0_u8; 12];
	unsafe {
		asm!(
			"push rbx",
			"cpuid",
			"mov [rdi], ebx",
			"mov [rdi + 4], edx",
			"mov [rdi + 8], ecx",
			"pop rbx",
			in("rdi") name_buf.as_mut_ptr(),
			inout("eax") 0 => _,
			out("ecx") _,
			out("edx") _,
		);
	}
	let name = core::str::from_utf8(&name_buf).unwrap();
	println!("CPU Manufacturer ID: {}", name);
}

```
# 実行結果

```
$ rustc asm0.rs
$ ./asm0
CPU Manufacturer ID: GenuineIntel
```


以上。
vuetify3 メモ

vuetify3のメモ

vue3 + \<script lang="ts" setup> 記法
templateはpugで記載

# v-data-table
## headersの設定

{title, value}の配列をv-data-tableへ渡す。

```
const headers = [
  { title: "ユーザID", value: "userId" },
  { title: "ユーザ名", value: "userName" },
];

v-data-table(:headers="headers" :items="items")
```
### チェックボックス付けて選択可能とする
show-selectを設定する
v-modelに設定した配列へ、id値が設定される。
id以外のフィールドを利用する場合、item-valueを設定する

```
const selectedIds = ref([]);

v-data-table(:headers="headers" :items="items"
    show-select v-model="selectedIds" item-value="userId")
```
[Ruby] undefined method for nil:NilClass を回避するためのテクニック

## 概要
nil に対してメソッドを実行しようとすると、`undefined method for nil:NilClass`が発生します。

```ruby
nil[:hoge]
# <anonymous>': eval:1:in `<main>': undefined method `[]' for nil:NilClass (NoMethodError)
```

本記事では初学者の方向けに `undefined method for nil:NilClass` を回避するためのテクニックについてまとめました。

## Tips.
### nil?

最も基本的な方法です。
`nil?`メソッドを使って`nil`であるかを事前にチェックします。

```ruby
if obj.nil?
  # objがnilの場合の処理
  {}
else
  # objがnilでない場合の処理
  obj[:hoge]
end
```

`nil`であるかどうかを確認することで、エラーの発生を防ぐことができます。

### nil.to_h

`nil`に対して`to_h`メソッドを呼び出すと、空のハッシュ `{}` を返します。
ハッシュとして扱いたいが`nil`である可能性があるオブジェクトに対して、安全にメソッドを呼び出すことができます。

```ruby
obj = nil
hash = obj.to_h
hash[:hoge] # => nil（エラーにならない）
```

### nil.to_a

同様に、`nil.to_a`は空の配列 `[]` を返します。
配列として扱いたいが`nil`である可能性があるオブジェクトに対して、安全にメソッドを呼び出すことができます。

```ruby
obj = nil
array = obj.to_a
array.each do |item|
  # 処理
end
```

### Hash(nil)
Hashメソッドにnilを渡すと、空のハッシュ`{}`を返します。
```ruby
obj = nil
hash = Hash(obj)
hash[:hoge] # => nil（エラーにならない）
```

### Array(nil)
Arrayメソッドにnilを渡すと、空の配列`[]`を返します。
```ruby
obj = nil
array = Array(obj)
array.each do |item|
  # 処理
end
```

### dig

ハッシュから値を取得する際に、`dig`メソッドを利用できます。
※ デフォルト値を使用したい場合は`fetch`を利用

```ruby
params = nil
value = params.to_h.dig(:hoge) # => nil（エラーにならない）
```

キーが存在しない場合や`params`が`nil`の場合でも、例外が発生しません。

## presence （ActiveSupport）

`presence`メソッドは、オブジェクトが存在する場合はそのオブジェクトを、`nil`や空の場合は`nil`を返します。

```ruby
value = obj.presence || 'デフォルト値'
```

これにより、オブジェクトが存在しない場合にデフォルト値を設定できます。

## カスタムメソッドの定義

`NilClass`に対してメソッドを定義することで、`nil`オブジェクトでも特定のメソッドを呼び出せるようにする方法です。

```ruby
class NilClass
  def [](key)
    nil
  end
end

nil[:hoge] # => nil（エラーにならない）
```

この方法は全体の挙動に影響を与える可能性があるため、注意が必要です。

## まとめ
何かと例外が発生することがあるので、こういった小技を頭の片隅に入れておくと良いと思います。
良いRubyライフを！
.srt字幕ファイルから.wav音声を生成する

最近、私が録画した中国語のビデオを日本語に変換する必要が出てきました。基本的な流れは以下の通りです：

1. 中国語のビデオを準備
2. 字幕（.srt）を抽出
3. 字幕を最適化
4. 日本語に翻訳
5. 日本語音声を生成
6. ビデオに合成

現在、この機能を持つソフトウェアはたくさんありますが、有料のものが多く、自前で実現することで、コードを手元に残しておくことができます。これにより統合が容易になります。

### コードを見てみましょう

以下に示すのは、`smartfill.srt`という字幕ファイルの内容です:

```css
1
00:00:02,912 --> 00:00:05,905
こんにちは、今日は皆さんに紹介します。

2
00:00:05,905 --> 00:00:08,412
一つの生成型AIに基づいた

3
00:00:08,412 --> 00:00:11,162
インテリジェントな補助ツール、

4
00:00:11,162 --> 00:00:13,913
入力ツール、smart fillです。

...
```

このコードは、MicrosoftのSpeechサービスを使用します。既に手元にあるものを利用するため、料金はかかりますが、再購入の必要はありません。このコードの基本的な流れは、.srtファイルをSpeechで認識可能なSSMLに変換し、それをSpeech APIに渡すことです。

```csharp
using System.Text;
using System.Text.RegularExpressions;
using Microsoft.CognitiveServices.Speech;

string subscriptionKey = File.ReadAllText("C:/GPT/audiokey.txt");
string region = "westus2";
var config = SpeechConfig.FromSubscription(subscriptionKey, region);
var voceName = "ja-JP-KeitaNeural";
config.SpeechSynthesisVoiceName = voceName;
using var synthesizer = new SpeechSynthesizer(config, null);
synthesizer.SynthesisStarted += (s, e) =>
{
    Console.WriteLine($"开始生成音频……");
};
synthesizer.SynthesisCompleted += (s, e) =>
{
    Console.WriteLine($"生成语音完成！");
};

var subtitles = ParseSrt(Directory.GetCurrentDirectory() + "/smartfill.srt");
var voices = ParseVoices(subtitles);
var ssml = BuildSSML(voices);

using (var result = await synthesizer.SpeakSsmlAsync(ssml.ToString()))
{
    if (result.Reason == ResultReason.SynthesizingAudioCompleted)
    {
        using (var outputStream = new FileStream("smartfill.wav", FileMode.Create))
        {
            using (var waveFileWriter = new NAudio.Wave.WaveFileWriter(outputStream, new NAudio.Wave.WaveFormat(16000, 16, 1)))
            {
                waveFileWriter.Write(result.AudioData, 0, result.AudioData.Length);
            }
        }
    }
    else
    {
        Console.WriteLine($"语音合成失败：{result.Reason}");
    }
}
```

### 最後の結果

![](http://wx.qlogo.cn/mmopen/fvicoCuwP3cCaj269GCiauWF9OMHibdJCy2JKmFmSyCcDooicabr688lILhYWpYicmPcNzRdiaSjoLNc24u3WCHcCQWU58kPQ8ITGa/0)

もちろん、品質の向上と最適化が必要ですが、ここでは詳細は省略します。

(Translated by GPT)
streamlit のデータの流れまとめ

# 背景
streamlitを触っているとたまにデータの流れや処理の流れで混乱するのでまとめておきます

# 基本はこれ
https://docs.streamlit.io/get-started/fundamentals/main-concepts#data-flow

- スクリーン上の何かが更新されたら、Streamlitのスクリプトが再実行されます
  - コードが修正された時
  - ユーザーがapp上でwidgetsとインタラクトした時
- on_changeやon_clickが呼ばれるとその時点でcallbackが呼ばれます


# cacheとsession

## sessionとcacheの違い
- cacheは全てのsessionの全てのユーザーに対して利用できる
- sessionはsingle sessionでのに利用できる

### chacheとは
https://docs.streamlit.io/get-started/fundamentals/advanced-concepts#caching


### sessionとは
https://docs.streamlit.io/get-started/fundamentals/advanced-concepts#what-is-a-session

- appを見るためのinstance
- 2つのタブからあるappを表示している場合、そのブラウザは2つのsessionを持っている
- ブラウザをリフレッシュしたり、リロードするとsessionはリセットされる




# formとは
https://docs.streamlit.io/develop/concepts/architecture/forms

- 基本入力欄に更新があると、streamlitはスクリプトを上から下まで上から下まで再実行され、アプリのフロントエンドが更新されるが、form内のインプットはsubmitされるまで再実行が走りません

# fragmentsとは
https://docs.streamlit.io/develop/concepts/architecture/fragments

- fragmentsを定義すると、再実行するスコープを定義できます


# 入力欄の実行順序

https://docs.streamlit.io/develop/concepts/architecture/widget-behavior#order-of-operations

入力欄に値を入力すると
1. st.session_state の値が更新される
2. コールバック関数（もしあれば）が実行される
3. ページが再実行され、ウィジェット関数が新しい値を返す


# コールバックの処理
- コールバック関数はスクリプト再実行の前に実行されます
  - コールバック関数が画面に何かを表示する場合、その内容はページの他の部分よりも上に表示されます
- コールバック関数にargs経由で引数を渡す場合は、inputの返り値を渡さない
  - 返りが値を持つのは次の再実行時なので、渡したい場合は、st.session_state経由で渡す
Next.js AppRouterを利用して、searchparamsを取得する

## 0. 環境

| name | version |
|:--|:--|
| nextjs | 15.0 |

## 1. 取得方法

[upgrading/version-15](https://nextjs.org/docs/app/building-your-application/upgrading/version-15#synchronous-page)に記載があった。


### 1-1. pageレベルで、asyncを利用。

```app/index.tsx
type Params = Promise<{ slug: string }>
type SearchParams = Promise<{ [key: string]: string | string[] | undefined }>

const RootPage = async ({ params, searchParams }:{ props: Params, searchParams: SearchParams }) => {
    const p = await params
    const q = await searchParams
    return (
        <div>
            <div>{ JSON.stringify(p) }</div>
            <div>{ JSON.stringify(q) }</div>
        </div>
    )
}

export default RootPage
```

### 1-2. useを利用する

```app/index.tsx
import { use } from "react"

type Params = Promise<{ slug: string }>
type SearchParams = Promise<{ [key: string]: string | string[] | undefined }>

const RootPage = (props: { props: Params, searchParams: SearchParams }) => {
    const p = use(props.params)
    const q = use(props.searachParams)
    return (
        <div>
            <div>{ JSON.stringify(p) }</div>
            <div>{ JSON.stringify(q) }</div>
        </div>
    )
}

export default RootPage
```

### 1-3. FCを利用して型情報を記載する

```app/index.tsx
import { type FC } from "react"

type RootPageProps {
    params: Promise<{ [key: string]: string }>
    searchParams: Promise<{ [key: string]: string | string[] | undefined }>
}

const RootPage = async ({ params, searchParams }:{ props: Params, searchParams: SearchParams }) => {
    const p = await params
    const q = await searchParams
    return (
        <div>
            <div>{ JSON.stringify(p) }</div>
            <div>{ JSON.stringify(q) }</div>
        </div>
    )
}

export default RootPage
```
誕生日が2月29日の人は平年の何日に年をとるのか？


## 結論

3月1日0時0分
もしくは2月28日24時00分

## 理由

>以上の条文から、年齢は生まれた日を0歳とし（0歳児は法律上、生後◯ヶ月と表現する。[4]）、生まれた年の翌年以降、起算日に応当する日の前日が満了するたびに1歳ずつ加算する。つまり、加齢する時刻は誕生日前日が満了する「午後12時」（24時0分0秒）と解されている[5][6]（「前日午後12時」と「当日午前0時」は時刻としては同じだが、属する日は異なることに注意）。
>
>したがって、閏日である2月29日生まれの者は4年に1度しか加齢しないというわけではなく、毎年2月28日の午後12時に加齢することになる。

[年齢計算ニ関スル法律](https://ja.wikipedia.org/wiki/%E5%B9%B4%E9%BD%A2%E8%A8%88%E7%AE%97%E3%83%8B%E9%96%A2%E3%82%B9%E3%83%AB%E6%B3%95%E5%BE%8B)より引用

## 何故この記事を書いたのか

2月29日が誕生日の人は平年では2月28日に年をとると主張する人がいたため。

その人は
2月29日生まれはいつ年をとる？ → 2月28日
という処理を書いていたが、

仮にそういう処理にするならば
4月1日生まれはいつ年をとる？ → 3月31日
4月2日生まれはいつ年をとる？ → 4月1日
とならなければ整合性がとれない。（そしてそのようになっていなかった。）

もちろん、そこが一貫しているなら別にいいが。

## おまけ

4月1日生まれはいつ年をとる？ → 4月1日
4月2日生まれはいつ年をとる？ → 4月2日

という処理ならば

2月29日生まれはいつ年をとる？ → 閏年は2月29日、平年は3月1日

となる。
atcoder練習(2024.11.14)

# キーワード

# 問題
https://atcoder.jp/contests/abs/tasks/abc081_a

すぬけ君は 
1,2,3 の番号がついた 
3 つのマスからなるマス目を持っています。 各マスには 0 か 1 が書かれており、マス 
i には 
s 
i
​
  が書かれています。

すぬけ君は 1 が書かれたマスにビー玉を置きます。 ビー玉が置かれるマスがいくつあるか求めてください。

制約
s 
1
​
 ,s 
2
​
 ,s 
3
​
  は 1 あるいは 0
入力
入力は以下の形式で標準入力から与えられる。

s 
1
​
 s 
2
​
 s 
3
​
 
出力
答えを出力せよ。

入力例 1
Copy
101
出力例 1
Copy
2
マス 
1,3 にビー玉が置かれます
入力例 2
Copy
000
出力例 2
Copy
0
ビー玉はどのマスにも置かれません

# 回答
```Python
a = str(input())
print(a.count("1"))
```

# 参考

# 備考
- int形のcount関数を探していただけど、そもそもinputの形を変えればいいだけの話だったんだ。
【Ruby】ヒアドキュメントについて

# はじめに
こんにちは！アメリカの大学で語学を学びながら、独学でソフトウェアエンジニアを目指している者です。
本日はヒアドキュメントについてまとめていきたいと思います。
現在文字列クラスについて勉強中なのですが、ヒアドキュメントを初めて聞き意外と知らない方もいるのかなと思い簡単にまとめてみようと思いました

# ヒアドキュメントとは

ヒアドキュメント（Here Document）は、複数行の文字列を簡単に作成するための行指向文字列リテラルです。
長い文章を埋め込むときには通常のクォーテーションよりも見やすいのが特徴です

ヒアドキュメントの基本形は、、`<<` 演算子の後に識別子を指定し、その識別子で始まり、再度同じ識別子が現れるまでの間の文字列を、1つの文字列として扱います。
```ruby
message = <<TEXT
これはRubyのヒアドキュメントのサンプルです。
複数行にわたる文字列を記述できます。
HTMLやSQLのテンプレートにも便利です。
TEXT

puts message
# => これはRubyのヒアドキュメントのサンプルです。
# => 複数行にわたる文字列を記述できます。
# => HTMLやSQLのテンプレートにも便利です。
```

### ヒアドキュメントを使わない場合
ヒアドキュメントを使わずに複数行の文字列を作成すると、各行をクォーテーションで囲み、行ごとに改行文字（`\n`）を追加する必要があります。
この方法では記述が煩雑になり、視認性も悪くなります。
```ruby
message = "これはRubyのヒアドキュメントのサンプルです。\n" +
          "複数行にわたる文字列を記述できます。\n" +
          "HTMLやSQLのテンプレートにも便利です。"

puts message
```
ヒアドキュメントを使うと、コードがより簡潔で読みやすくなり、変更やメンテナンスもしやすくなります。

## 識別子の選択と種類
ヒアドキュメントの識別子には自由な名前が使えますが、慣例として `EOF`(End of File) や `EOS`（End of String） などがよく使われます。
また、識別子をシングルクォーテーション ' で囲むかダブルクォーテーション " で囲むかで、文字列の挙動が変わります

* ダブルクォーテーション（<<-"EOS"）
式展開や特殊文字が有効
* シングルクォーテーション（<<-'EOS'）
式展開や特殊文字が無効

```ruby
name = "田中"
message1 = <<-"EOS"
こんにちは、#{name}さん。
今日は良い天気ですね。
EOS

message2 = <<-'EOS'
こんにちは、#{name}さん。
今日は良い天気ですね。
EOS

puts message1  # => こんにちは、田中さん。今日は良い天気ですね。
puts message2  # => こんにちは、#{name}さん。今日は良い天気ですね。
```

## `<<-` と `<<~` の違い

### `<<-`
この記法では識別子の前にハイフン（`-`）を付けることで、インデントされた識別子も認識されます。
ただし、文字列の内容そのものにはインデントが残ります。
```ruby
message = <<-EOS
  この行はインデント付きで出力されます。
  ヒアドキュメントが終了する識別子もインデントできます。
EOS

puts message
```
出力結果
```ruby
    この行はインデント付きで出力されます。
    ヒアドキュメントが終了する識別子もインデントできます。
```

### `<<~`
この記法を使用すると、内容自体のインデントが取り除かれ、見た目を整えながらコードを記述できます。
```ruby
message = <<~EOS
  この行のインデントは削除されて出力されます。
  ヒアドキュメントの内容がきれいに整えられます。
EOS

puts message
```
出力結果
```ruby
この行のインデントは削除されて出力されます。
ヒアドキュメントの内容がきれいに整えられます。
```

## 応用例
ヒアドキュメントは上記のようなケースではなく、HTMLコード等の長いコードを作成したいときにも使用することが可能です。
```ruby
name = "山田"
html = <<~EOS
  <html>
    <body>
      <h1>こんにちは、#{name}さん！</h1>
      <p>Rubyのヒアドキュメントを使ってHTMLを生成しています。</p>
    </body>
  </html>
EOS

puts html
```

# まとめ
Rubyのヒアドキュメントは、複数行の文字列を簡潔に記述し、テンプレートなどの複雑な文字列操作を行う際に便利です。
ここで紹介したように、`<<-` や `<<~` といった記法を使ってインデントや式展開の設定も柔軟に行うことが可能になります。
M4Pro MacBook ProのGPUをPyTorchから使う


M4Pro MacBook ProのGPUをTensorflowで実行する手順は[コチラ](https://qiita.com/xtrizeShino/items/56e3c1e027107debe331)で試しましたので、PyTorchの使い方もまとめておきます。PyTorchは2024/11/14現在、既にデフォルトでMPS（Metal Performance Shaders）に対応していますので、**特別な手順は必要なく** `.to("mps")`メソッドを使うだけでハードウェアリソースを利用することができます。

## 手順の前準備

以下記事を進めていることを前提に書いています。

- Homebrewをインストールする
- Anacondaをインストールする
- Miniforgeをインストトールする

https://qiita.com/xtrizeShino/items/56e3c1e027107debe331

## PyTorchをインストールする

それでは仮想環境を作成してPyTorchをインストールしていきましょう。この手順では仮想環境の作成にAnacondaを使っています。

### conda仮想環境を作成する

Anacondaで仮想環境を作成します。ここではpython3.8を選択しました。

```bash
$ mkdir pytorchbox
$ cd pytorchbox 
$ conda create --prefix ./env python=3.8
$ conda activate ./env
```

### PyTorchを仮想環境にインストールする

[PyTorchの公式サイト](https://pytorch.org/get-started/locally/)にアクセスすると、Anaconda環境へのインストール用コマンドが表示されますので、その通りに実行します。

![2024-11-14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/e55d1b89-520f-c393-d2d4-5cd2b6d99d3c.png)

```
(env) $ conda install pytorch::pytorch torchvision torchaudio -c pytorch
```

## 実際に使ってみよう

それでは実際に使ってみましょう。

特に必要な手順はなく`torch`で作成したデータを`.to("mps")`でMPS (Metal Performance Shaders)へ転送するだけです。転送したデータは`.device`メソッドを使うことにより、どこにデータが置かれているか見ることができます。

以下の例ではテストデータとして3x3のテンソルを作成しています。テンソルの各要素は正規分布のランダムな値で初期化しています。

```python
(env) $ python
>>> import torch
>>> torch.backends.mps.is_available()
True
>>> testdata = torch.rand(3,3)
>>> print(testdata)
tensor([[0.9923, 0.1906, 0.1752],
        [0.2960, 0.3211, 0.6276],
        [0.3285, 0.4022, 0.4152]])
>>> trdata = testdata.to("mps")
>>> trdata.device
device(type='mps', index=0)
```

ハードウェアリソースを使えていますね！

実際に推論で使う方法は以下の記事にまとめています。併せてご利用ください。

https://qiita.com/xtrizeShino/items/a456d1913c3c135acd90
flutterでandroidの実機デバッグをする方法

## ペア設定

`adb pair 192.xxx.xxx.xxx:34326`


## コネクト
`adb connect 192.xxx.xxx.xxx:43739`


## バックエンドとつなげない場合

バックエンドはrailsでlocalhost:3000起動中
実機デバイスからアクセスできない問題が発生

この時

`adb reverse tcp:3000 tcp:3000`
を行う



#### 参考

https://qiita.com/suruseas/items/42d5d9c5beffa6ebdd78
atcoder練習(2024.1114)

# キーワード
命名規則, 
# 問題
https://atcoder.jp/contests/abs/tasks/abc086_a

シカのAtCoDeerくんは二つの正整数 
a,b を見つけました。 
a と 
b の積が偶数か奇数か判定してください。

制約
1 
≤ 
a,b 
≤ 
10000
a,b は整数
入力
入力は以下の形式で標準入力から与えられる。

a 
b
出力
積が奇数なら Odd と、 偶数なら Even と出力せよ。

入力例 1
Copy
3 4
出力例 1
Copy
Even
3×4=12 は偶数なので Even を出力してください。

入力例 2
Copy
1 21
出力例 2
Copy
Odd
1×21=21 は奇数なので Odd を出力してください。


# 回答
```Python
a, b = map(int, input().split())

if a*b % 2 == 0:
  print("Even")
else:
  print("Odd")
```

# 参考

# 備考
- EvenとOddが逆だった。命名規則の側面も合わせて英単語が意外と必要になる。合わせて英語も勉強してください。
- inputとかだいぶ慣れてきた、やっぱり手を動かして体に染み込ませる方法がよさそう。
Mozilla ThunderbirdからアクセスするGoogleカレンダーの「日本の祝日」を祝日のみにする方法

## 発端
「七五三」が日本の祝日として表示されるようになったことが紛らわしくて、工夫してみた。

## 要約

- Thunderbirdの「設定エディター」上で、`calendar.registry`から始まるキーの中で、カレンダーIDを持つ箇所を特定
- `googleapi://Googleアカウントのメールアドレス/?calendar=ja.japanese%23holiday%40group.v.calendar.google.com`となっている箇所を、`googleapi://Googleアカウントのメールアドレス/?calendar=ja.japanese.official%23holiday%40group.v.calendar.google.com`に書き換えて保存、カレンダーIDを「ja.japanese」から「ja.japanese.official」に変更するという意味

## もうちょっと解説

### 設定エディターの開き方

メニューバーを表示させていない場合は、ハンバーガーメニューボタンクリックで、歯車の「設定」をクリック。
メニューバーを表示させているなら、ツール(T)→設定(E)とクリックして設定パネルを開く。

左ペインの「一般」を選択して、右ペインの最下部に「設定エディター...(C)」というボタンがあるのでクリック。

### カレンダーIDを保存しているキーを特定

「高度な設定」パネルが開き、上部の検索窓に`calendar.registry`（スペルミス注意）と入力すると、カレンダー機能で使用する設定情報が表示される。
`calendar.registry`に続くUUIDっぽい文字列は、実行環境ごとに変わっているみたいなので、ズバリこのキーを探せとは言いにくい。
`calendar.registry`で始まり、`uri`で終わるキー、そして、値に`group.v.calendar.google.com`を含んでいるもの、となる。

設定値を眺めて、`group.v.calendar.google.com`を含むものを目視で検索。
（値で検索する方法までは知らないし、情報を見つけられなかったもので）

### 設定値の書き換え

新しいカレンダーとしてGoogleカレンダー上の「日本の祝日」を追加しただけなら、

```
googleapi://xxxxxxxxxx@gmail.com/?calendar=ja.japanese%23holiday%40group.v.calendar.google.com
```

みたいになっているはず。
これを、こう書き換える。

```
googleapi://xxxxxxxxxx@gmail.com/?calendar=ja.japanese.official%23holiday%40group.v.calendar.google.com
```

「ja.japanese」の箇所に「ja.japanese **.official**」と`.official`を追加する。

保存させたら、念の為Thunderbirdを立ち上げ直して、10分とか20分とか待つ。
以上。

## 注意

あくまで個人的に実験したらできただけなので、自己責任でお試しください。

なお、設定エディター上で書き換えても即反映されない（キャッシュを持ってるっぽい）ので、反映されるまで気長に待ってください。

## 参考

下記の記事にヒントをいただきました。感謝いたします。
[\[GAS\] カレンダーの「祝日のみ」と「祝日およびその他の休日」 \#GoogleAppsScript \- Qiita](https://qiita.com/sakaimo/items/0a0a31697dd821e775cd)
paizaラーニング問題集「STEP2移動が可能かの判定・方角」を解いてみた

https://paiza.jp/works/mondai/a_rank_level_up_problems/a_rank_snake_mapmove_step2

▼考え方

この問題を解くために私が考えた内容1、2を以下に示します。

1. 現在向いている方角dと1マス移動する方向mを関数caldistanceに渡して、y,x座標の移動距離を計算します。

2. 1の戻り値と現在の座標を関数nextpositioncheckに渡して、移動が可能かどうかを判定し出力します。

▼コード
```py
H,W,sy,sx,d,m = input().split()

S = [list(input()) for _ in range(int(H))]

# caldistance: y,x座標の移動距離を計算する関数
def caldistance(d,m):

    # dy: y座標の移動距離
    dy = 0

    # dx: x座標の移動距離
    dx = 0
    
    if d == "N":
        if m == "L":
            dx -= 1
        else:
            dx += 1
    elif d == "S":
        if m == "L":
            dx += 1
        else:
            dx -= 1
    elif d == "W":
        if m == "L":
            dy += 1
        else:
            dy -= 1
    else:
        if m == "L":
            dy -= 1
        else:
            dy += 1

    return [dy,dx]

# nextpositioncheck: 移動が可能かどうかを判定し出力する関数
def nextpositioncheck(ny,nx,dyx):
    
    if (ny+dyx[0] <= -1 or ny+dyx[0] >= int(H)) or (nx+dyx[1] <= -1  or nx+dyx[1] >= int(W)):
        print("No")
    elif S[ny][nx] == "#":
        print("No")
    else:
        print("Yes")

# 考え方1,2.
nextpositioncheck(int(sy),int(sx),caldistance(d,m))
```
paizaラーニング問題集「STEP1移動が可能かの判定・方角」を解いてみた

https://paiza.jp/works/mondai/a_rank_level_up_problems/a_rank_snake_mapmove_step1

▼考え方

現在の座標と1マス移動する方角の3つを関数に渡して、移動が可能かどうかを判定し出力します。解答コードの考え方と私のものはほぼ一緒でした。

▼コード
```py
H,W,sy,sx,m = input().split()

S = [list(input()) for _ in range(int(H))]

# npc: 移動が可能かどうかを判定し出力する関数
def npc(ny,nx,d):
    
    if d == "N":
        ny -= 1
    elif d == "S":
        ny += 1
    elif d == "W":
        nx -= 1
    else:
        nx += 1
      
    if (ny <= -1 or ny >= int(H)) or (nx <= -1  or nx >= int(W)):
        print("No")
    elif S[ny][nx] == "#":
        print("No")
    else:
        print("Yes")

npc(int(sy),int(sx),m)
```
ひずみエネルギとそれを使った材料力学 基本例題8.18 解説3(途中) P277 「材料力学演習(20221021)」をsympyでやってみたい。

　　　[基本例題8.18 P276](https://qiita.com/mrrclb48z/items/2ed82c3c6f53ccd7ee06)　　　　　　(2024-11-14) 
　　　[基本例題8.18 解説1,2 P276](https://qiita.com/mrrclb48z/items/6fd514c1f6551cb89cd8)　　(2024-11-14) 
# オリジナル
[基本例題8.18 解説3 P277 (pdf)](http://zairikiweb.starfree.jp/zai_enshuh/zai_enshuh_ver.3.3.pdf#page=282)＜[「材料力学演習(20221021)一括(ver.3.3)」を勉強したい。#sympy](https://qiita.com/mrrclb48z/items/c3274daf5f7a99cfe027#%E4%BD%9C%E6%A5%AD%E4%B8%AD%E7%A7%81%E3%81%AE%E8%A7%A3%E7%AD%94sympy)
　　　　　　　　？？？タブレット等で、pdfを開く事ができないかも。？？？　

# sympyで
・ ver0.1 p277 基本例題8.18  解説3
・変数Eを変数myEにしました。
・(途中) 申し訳ありません。後半は、理解できませんでした
```python
# ver0.1 p276 基本例題8.18 解説3
#　p276 基本例題8.18 解説3
from sympy import *
var('myE,G,Iz,Ip' )  # var('E,G,Iz,Ip' )
var('P,a,b,c'   )
var('x,x1,x2,x3,tA')
def myStrFactor(expr,myStr):
    return myStr+"* ("+str( (expr/sympify(myStr)).expand())+")"
str_d2vAB ="-1/(myE*Iz)*(P*c-P*a+P*x3)"                                        ;print("#",str_d2vAB)
str_tAB   =myStrFactor(integrate(sympify(str_d2vAB),x3),"-P/(myE*Iz)")+" + tA" ;print("#",str_tAB)
tAB       =sympify(str_tAB)
tA_sol    =solve  (Eq(tAB.subs({x3:0}),0),tA)[0]                               ;print("#",tA_sol)
tB        =tAB.subs({tA:tA_sol}).subs({x3:a})                                  ;print("#",factor(tB))
#
# -1/(myE*Iz)*(P*c-P*a+P*x3)
# -P/(myE*Iz)* (-a*x3 + c*x3 + x3**2/2) + tA
# 0
# P*a*(a - 2*c)/(2*Iz*myE)
```
・(途中)

# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342)

# いつもと違うおすすめです。

https://docs.sympy.org/latest/modules/integrals/integrals.html#module-sympy.integrals

https://www.delftstack.com/howto/python/python-partial-derivatives/

#### 参考文献

~~＞一部に等分布荷重を受ける単純支持はり~~
~~＞JSME p89~~
　
~~＞単純支持ばり 7)~~
~~＞構造力学公式集 p136~~
ネットワークデバッグに役立つツール

## はじめに
ネットワークの問題は、サーバーの運営やウェブサイトのメンテナンスで頻繁に発生する課題の一つです。ネットワーク障害の原因を見つけ、解決するために様々なツールが役立ちます。今回は、代表的なネットワークデバッグツールである dig、nslookup、その他のネットワークデバッグツールを紹介します。

## 1. dig (Domain Information Groper)
dig は、DNS（Domain Name System）に関する情報を取得するための非常に便利なツールです。特定のドメインのIPアドレス、ネームサーバー情報、MX（メール交換）レコードなどを素早く確認できます。特に、ネームサーバーの問題を診断したり、DNSが正しく設定されているかを確認する際に使用されます。

### 主なコマンド
- dig [ドメイン名]: 基本的なDNSクエリ（Aレコードの確認）
- dig [ドメイン名] MX: メールサーバーの確認（MXレコード）
- dig [ドメイン名] NS: ネームサーバーの確認
- dig [ドメイン名] +trace: 全体のDNSクエリ経路の追跡

### 使用例
```bash
dig example.com
dig example.com MX
```

### 活用例
- DNSレコードが正しく設定されているかを確認する時
- メールサーバーの設定を点検する時
- 特定のドメインが正しくルーティングされているか確認する時

## 2. nslookup
nslookup は dig と同様にDNS関連の情報を取得するためのツールです。使い方が簡単で、DNSレコードを素早く調べる際に便利です。

### 主なコマンド
- nslookup [ドメイン名]: 基本的なドメイン情報の確認
- nslookup [IPアドレス]: IPアドレスを使った逆引きDNSクエリ
- nslookup [ドメイン名] [ネームサーバーアドレス]: 特定のネームサーバーを指定してDNSクエリを

### 使用例
```bash
nslookup example.com
nslookup example.com 8.8.8.8
```

### 活用例
- 特定のIPアドレスに紐づくドメインを確認する時
- ローカルネットワークでネームサーバーが正常に動作しているか点検する時

## 3. ping
ping は、ネットワーク接続状況を確認する際に使用される基本的なツールです。ping コマンドを使用して特定のホストにパケットを送り、応答時間を測定し、ネットワーク接続が正常かを確認できます。

### 主なコマンド
- ping [ドメイン/IPアドレス]: 基本的な接続状況の確認
- ping -c [パケット数] [ドメイン/IPアドレス]: 指定したパケット数だけ送信

### 使用例

```bash
ping google.com
ping -c 4 google.com
```

### 活用例
- ネットワーク接続状況を素早く確認する時
- パケットロスや応答の遅延を点検する時

## 4. traceroute
traceroute は、パケットが特定の目的地に到達するまでに通過する経路を表示するツールです。中継地点のネットワーク遅延や障害ポイントを追跡でき、ネットワーク問題の診断に役立ちます。

### 主なコマンド
- traceroute [ドメイン/IPアドレス]: 基本的な経路追跡
- traceroute -n [ドメイン/IPアドレス]: IPアドレスのみを表示し、結果を高速化

### 使用例
```bash
traceroute example.com
```

### 活用例
- 特定のネットワーク経路で遅延が発生するポイントを確認する時
- 目的地までのネットワーク経路を把握し、障害を診断する時

## 5. netstat
netstat は、システムで開いているネットワークポート、接続状況、受信および送信中のパケット情報などを提供するツールです。システムのネットワーク状況を一目で把握することができ、便利です。

### 主なコマンド
- netstat -a: すべてのネットワーク接続とリスニングポートを表示
- netstat -r: ルーティングテーブルを表示
- netstat -i: ネットワークインターフェースの状態を表示

### 使用例
```bash
netstat -a
netstat -r
```

### 活用例
- システムのネットワーク接続状況を把握する時
- 特定のポートが開いているかを確認する時

## 6. curl
curl は、URLを通じてサーバーにHTTPリクエストを送り、応答を確認するための強力なツールです。API呼び出しやサーバー応答の状態確認などに役立ちます。

### 主なコマンド
- curl [URL]: 基本的なリクエスト
- curl -I [URL]: HTTPヘッダ情報のみを確認
- curl -X [HTTPメソッド] [URL]: 特定のHTTPメソッドでリクエスト送信（POST、PUTなど）

### 使用例
```bash
curl example.com
curl -I example.com
```

### 活用例
- ウェブサーバーの応答状態を確認する時
- API呼び出しの結果を確認する時

## 結論
ネットワークデバッグは、ウェブサイトの運営やサーバー管理で欠かせない重要なプロセスです。dig、nslookup、ping、traceroute、netstat、そして curl は、基本的なネットワーク問題を解決するために覚えておくと役立つツールです。ネットワーク関連の問題が発生した際に適切なツールを使用して迅速に問題を把握し、解決に導けるように準備しておきましょう。
Nutanix初心者がまとめる「AHV」と「CVM」の超基礎

# はじめに
BroadcomのVMware買収により、名前を聞く機会が多くなったNutanix。
私も業務で触れる機会が増えそう…ということで今更ながら調査してみました。
自分自身の備忘録としてまとめてみます。

# 今日のトピック
Nutanixのハイパーバイザーである「AHV」とコアコンポーネントである「CVM」をざっくりまとめてみる。

# AHV（Acropolis Hypervisor）
・KVMベースのハイパーバイザー。
・KVMとしての基本機能を拡張し、HAやライブマイグレーション機能を実装。
・VMware社のvSphere Enterprise Plusに相当する機能を提供。
　()内はVMware側の名称。
    　・ライブマイグレーション（vMotion）
    　・VM High Availability（vSphere HA）
    　・ADS（vSphere DRS）
    　・スナップショット（スナップショット）
    　・アフィニティルール（アフィニティルール）
    　・アンチアフィニティ（アンチアフィニティ）
    　・Nutanix Prism（vCenter Server）
    　・OVS（vDS）
    　などなど

# CVM（Controller VM）
・Nutanixのコアコンポーネント。
・Nutanix HCI環境やゲストVMを制御するためのVM。
・中身はAOS（Acropolis Operating System）。
・クラスタ内の各ノード上に1台ずつ稼働。
・各ノードのCVMが相互に連携しながらデータの読み書き/リソース管理/VMデプロイ等の機能を提供。
・Nutanix環境を構成するために必要となるサービスが多々動作している。
・VMwareのvCenter的な機能であるPrismもCVM内のサービスとして稼働。

# おわりに
今回はざっくりまとめるということでメモレベルになりました。
初投稿でしたが、アウトプットって難しいですね…。
人に説明できるレベルになれることを目指して引き続き頑張りたいと思います。
NCP取得も並行して…。
ひずみエネルギとそれを使った材料力学 基本例題8.18 解説1,2 P276 「材料力学演習(20221021)」をsympyでやってみたい。

　　　[基本例題8.18 P276](https://qiita.com/mrrclb48z/items/2ed82c3c6f53ccd7ee06)　　　　　　(2024-11-14) 
　　　[基本例題8.18 解説3(途中) P277](https://qiita.com/mrrclb48z/items/bc532ea60bd32151028f) (2024-11-14) 
# オリジナル
[基本例題8.18 解説1,2 P276 (pdf)](http://zairikiweb.starfree.jp/zai_enshuh/zai_enshuh_ver.3.3.pdf#page=281)＜[「材料力学演習(20221021)一括(ver.3.3)」を勉強したい。#sympy](https://qiita.com/mrrclb48z/items/c3274daf5f7a99cfe027#%E4%BD%9C%E6%A5%AD%E4%B8%AD%E7%A7%81%E3%81%AE%E8%A7%A3%E7%AD%94sympy)
　　　　　　　　？？？タブレット等で、pdfを開く事ができないかも。？？？　

# sympyで
・ ver0.1 p276 基本例題8.18  解説1,2
・変数Eを変数myEすべきでした。
```python
# ver0.1 p276 基本例題8.18 解説1,2
from sympy import *
var('E,G,Iz,Ip' )
var('P,a,b,c'   )
var('x,x1,x2,x3')
UAB  ="1/(2*E*Iz)*Integral((P*(c-a)+P*x3)**2,(x3,0,a)) + 1/(2*G*Ip)*Integral((P*b)**2,(x3,0,a))"  ;print("#",UAB)
UABk1="1/(2*E*Iz)*Integral((P*c    -P*x3)**2,(x3,0,a)) + 1/(2*G*Ip)*Integral((P*b)**2,(x3,0,a))"  ;print("#",UABk1)
print("#",sympify(UAB  ).doit())
print("#",sympify(UABk1).doit())
print("#",sympify(UAB  ).doit()-sympify(UABk1).doit())  # 調子が悪いです。??? exp
print()
UAB  =1/(2*E*Iz)*Integral((P*(c-a)+P*x3)**2,(x3,0,a)) + 1/(2*G*Ip)*Integral((P*b)**2,(x3,0,a))
UABk1=1/(2*E*Iz)*Integral((P*c    -P*x3)**2,(x3,0,a)) + 1/(2*G*Ip)*Integral((P*b)**2,(x3,0,a))
print("#",simplify(UAB.doit()-UABk1.doit()))  
print()
var("MB")
tB="1/(2*E*Iz)*diff(Integral((MB-P*a+P*x3)**2,(x3,0,a)),MB)"  ;print("#",tB)
tB=sympify(tB).doit().subs({MB:P*c}).simplify()               ;print("#",tB)
tB="1/(2*E*Iz)*diff(Integral((MB    -P*x3)**2,(x3,0,a)),MB)"  ;print("#",tB)
tB=sympify(tB).doit().subs({MB:P*c}).simplify()               ;print("#",tB)   # 調子が悪いです。??? exp
# 1/(2*E*Iz)*Integral((P*(c-a)+P*x3)**2,(x3,0,a)) + 1/(2*G*Ip)*Integral((P*b)**2,(x3,0,a))
# 1/(2*E*Iz)*Integral((P*c    -P*x3)**2,(x3,0,a)) + 1/(2*G*Ip)*Integral((P*b)**2,(x3,0,a))
# (P**2*a**3/3 + a**2*(-P**2*a + P**2*c) + a*(P**2*a**2 - 2*P**2*a*c + P**2*c**2))*exp(-1)/(2*Iz) + P**2*a*b**2/(2*G*Ip)
# (P**2*a**3/3 - P**2*a**2*c + P**2*a*c**2)*exp(-1)/(2*Iz) + P**2*a*b**2/(2*G*Ip)
# (P**2*a**3/3 + a**2*(-P**2*a + P**2*c) + a*(P**2*a**2 - 2*P**2*a*c + P**2*c**2))*exp(-1)/(2*Iz) - (P**2*a**3/3 - P**2*a**2*c + P**2*a*c**2)*exp(-1)/(2*Iz)

# 0

# 1/(2*E*Iz)*diff(Integral((MB-P*a+P*x3)**2,(x3,0,a)),MB)
# P*a*(-a + 2*c)*exp(-1)/(2*Iz)
# 1/(2*E*Iz)*diff(Integral((MB    -P*x3)**2,(x3,0,a)),MB)
# P*a*(-a + 2*c)*exp(-1)/(2*Iz)
```

# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342) 　開発環境

# いつもと違うおすすめです。

https://docs.sympy.org/latest/modules/integrals/integrals.html#module-sympy.integrals

https://www.delftstack.com/howto/python/python-partial-derivatives/

#### 参考文献

~~＞一部に等分布荷重を受ける単純支持はり~~
~~＞JSME p89~~
　
~~＞単純支持ばり 7)~~
~~＞構造力学公式集 p136~~
redissonの接続サーバを環境変数で設定する

[前回の記事(Apache、mod_jk、Tomcat、redisson、Redisでセッション共有を試してみる)](https://qiita.com/5zm/items/f127ef551ba8b64d03cc)ではredissonの接続するRedisサーバを設定ファイルに直書きしていたので、今回はTomcatのポート番号と同じく環境変数で定義・変更できるようにしたいと思います。


```yml:%CATALINA_HOME%/conf/redisson.conf
singleServerConfig:
  address: "${redis.address}"

threads: 0
nettyThreads: 0
transportMode: NIO
```

[Tomcatのポート番号を環境変数で定義・変更する方法](https://qiita.com/5zm/items/2f8e43a0c4dd0a4a6947)に記載の通りシステムプロパティを定義します。

```bat:%CATALINA_HOME%/bin/setenv.bat
@echo off
set JAVA_OPTS=-Dserver.port=%SERVER_PORT% -Dajp.port=%AJP_PORT% -Dshutdown.port=%SHUTDOWN_PORT% -Dredis.address=%REDIS_ADDRESS%
```

`REDIS_ADDRESS`環境変数にRedisの接続サーバの設定情報を定義すれば完了です。

```bat:apserver2_startup.bat
@echo off
set JAVA_HOME=C:¥tools¥corretto¥jdk17.0.12_7
set CATALINA_HOME=C:¥tools¥apache-tomcat-10.1.26
set CATALINA_BASE=C:¥tools¥apserver_2

set SHUTDOWN_PORT=8006
set SERVER_PORT=8084
set AJP_PORT=8019

rem ⭐️　ポイント
set REDIS_ADDRESS=redis://127.0.0.1:7777

call %CATALINA_HOME%¥bin¥startup.bat
```

ちなみにRedisサーバ側でリッスンするポート番号を変更するには`--port`オプションを指定します。
```bat:ポート番号を7777に変更するコマンド
redis-server.exe --port 7777
```