OmniAICreator/Qiita-1.07M huggingface dataset:
[備忘録]　フリーランスエンジニアの健康づくりについて

# はじめに
こんにちは，Umamusume22です．私の会社では医療従事者の方が会社に来て健康診断を行います．血圧や体重など色々な項目があります．また，福利厚生の一環でジムが安く使えます．しかし，フリーランスエンジニアの方たちは健康診断を受けているのでしょうか？(失礼)自ら病院に行って受ける必要があると思いますが実態は不明です．そこで，フリーランスエンジニアの健康づくりについて調査しました

# 備忘録[1,2,3]
#### 健康診断
- フリーランスは会社員と違って指定項目がない
- 検査する内容や費用、必要性に応じて自由に検査項目を決められる
    - 厚生労働省の定期健康診断の項目は目安
    - 地方自治体で受ける
    - 国民健康保険組合経由で受ける
    - 健康診断は自宅でも受けられる
    - 全部自己負担
    - 健康診断の結果によっては医療費控除が受けられる
        - プロフェッショナル＆パラレルキャリア フリーランス協会はフリーランスをサポート[2]
            - 一部有料
                - 割引で賠償責任保険や弁護士保険などが使える

#### 健康づくり[3]
- 腰痛防止のために適切な作業姿勢、椅子等の調整、適切な休憩をとること
- 作業場所の明るさや作業時間の調整、定期的に情報機器作業に関する健康診断を受けることが重要
- 長時間労働を防止する
- メンタルヘルス不調の予防
- 安全衛生教育や健康診断に関する情報の提供、受講・受診機会の提供

# さいごに
本記事の内容は短いですが調査した結果，フリーランスの方にも低価格で健康診断を受ける制度がありました．一番驚いたのが参考文献[2]ですね．このサービスは初めて知りました．割引で保険料が安くなるのは嬉しいです．

            

# 参考文献
[1]"フリーランスは健康診断を受けるべき？受けるメリットや費用目安を解説"
https://relance.jp/blog/should-get-a-medical-checkup/

[2]"自分の名前で仕事をしたい人のためのインフラ＆コミュニティ"
https://www.freelance-jp.org/

[3]"個人事業者等の健康管理に関するガイドライン（素案)"
https://www.mhlw.go.jp/content/11201250/001212763.pdf
CloudFunctions(Firebase)にデプロイ

### 本記事の対象
- FirebaseのCloudFunctionsを学習中
- TypeScriptで書かれた関数をCloudFunctionsにデプロイしたい人

### 実装内容
- クライアントサイドからのリクエストをトリガーとするonCall関数の実装
- 定期的に自動実行されるonSchedule関数の実装

## 実装

### Firebaseの初期設定

- firebaseの初期設定については以下の記事を参考にしてください
[Firebase CLI/SDKの初期設定](https://qiita.com/TakeshiNickOsanai/items/838c0f15c10a2270a109)


### onCallの実装

- 処理内容
    - クライアントサイドで商品登録のリクエストに対する処理
    - (※各々適切な処理を書いてください)
- 第2世代での記述になることも気をつけてください
    - `firebase-functions/v2/https`からインポート

```index.ts
import { onCall, CallableRequest } from "firebase-functions/v2/https";

import { registerItem } from "./helper/registerNewItem";

// データベースに商品を登録
exports.registerNewItem = onCall(async (request: CallableRequest) => {
  return await registerItem(request);
});
```

### スケジューラの実装

- 処理内容
    - 日本時間00:00に毎日自動で商品情報の更新が行われる
    - (※各々適切な処理を書いてください)
- 第2世代での記述になることも気をつけてください
    - `firebase-functions/v2/scheduler`からインポート

```index.ts
import { onSchedule } from "firebase-functions/v2/scheduler";

import { updateAllItems } from "./helper/updateAllItem";

// 商品情報の更新(毎日日本時間00:00に自動で実行される)
exports.runScheduledJobs = onSchedule(
  {
    schedule: "every day 00:00",
    timeZone: "Asia/Tokyo",
  },
  async () => {
    await updateAllItems();
  }
);
```

## あとがき
CloudFunctionsは第1世代と第2世代で記述方法が異なることに戸惑いました。また、使用するべき関数がわかりにくかったので参考になればなによりです。
Kubernetesのデプロイをロールバックする

# やり方

## deploymentを調べる
```Bash
kubectl get deployment
```

ここで、ロールバックしたいdeploymentの名前を調べましょう。

## 1. ロールバック
```Bash
kubectl rollout status deployment なんとか
```

## 2. ロールバックの取り消し
```Bash
kubectl rollout undo deployment なんとか
```

:::note warn
このコマンドを実行してもコードは変更されません。
緊急用として使うことをお勧めします。
:::
開発に必要なテストケース作成で大事なこと

#### 効果的なテストケース作成のためのベストプラクティス
はじめに
開発において、テストケースの作成は重要な工程の一つです。テストケースがしっかりと設計されていれば、バグの早期発見や品質向上に繋がります。今回は、テストケースを作成する際に考えることを少し紹介します。


1. 明確な目的
各テストケースには、具体的な検証目的を設定します。テストケースが何を検証するのかを明確にすることで、テストの精度が向上します。例えば、ログイン機能のテストケースであれば、「正しいユーザー名とパスワードでログインできること」を目的とします。

2. 再利用性を考慮する
テストケースは、再利用可能な形で設計すると便利です。共通のセットアップやテストデータを利用することで、テストケースのメンテナンスが簡単になります。例えば、データベースの初期化処理やログイン処理を共通化することで、他のテストケースでも簡単に利用できます。

3. 分かりやすく具体的なテストステップ
テストステップは、誰が見ても理解できるように簡潔かつ具体的に記述しましょう。複雑なステップは、サブステップに分けると理解しやすくなります。例えば、「ユーザー名を入力する」「パスワードを入力する」「ログインボタンをクリックする」のように具体的に記述します。

4. 期待される結果の明示
各テストケースには、期待結果を明示しましょう。そうすることで、テスト結果の判断がしやすくなります。例えば、「ログインに成功し、ダッシュボード画面が表示されること」を期待結果として明示します。

5. バリエーションを考慮する
テストケースは、正常系だけでなく異常系（エラーケース）も考慮して作成しましょう。多様なバリエーションをテストすることで、より安全なシステムを構築できます。例えば、ログイン機能のテストケースであれば、「正しいユーザー名と間違ったパスワードでログインできないこと」などを検証します。

6. ドキュメントの充実
テストケースは、後から見返したときに理解できるようにドキュメントを充実させましょう。テストケースの目的、手順、期待結果を詳細に記述することで、新しいメンバーも理解しやすいです。

7. 自動化の検討
テストケースの自動化を検討しましょう。手動テストは時間と労力がかかりますが、自動化することで効率化が図れます。特に、繰り返し実行されるテストケースや回帰テストは自動化に向いています。

8. フィードバックの活用
テストケースの作成後、実際にテストを実行し、得られたフィードバックを元に改善を行いましょう。テストケースが不完全だったり、期待結果が不明確だったりする場合、フィードバックを活用して改善することが重要です。

 ### 最後に
良いテストケースの作成は、ソフトウェア品質の向上に直結します。様々なケースを考えて、より良いテストケースを作成していきましょう！
「zsh: command not found: $」←こいつを倒す

```console
$ echo 'Hello'
```

こういうコードサンプルを適当にコピペしてzshに貼って

```console
$ $ echo 'Hello'
zsh: command not found: $
```

こう怒られたことのある人は多いのではないか。

それくらい察して無視してくれよと思わなくもないが、自分のコピペミスが悪いのでしかたがない。でもそれなりにイラッとくる。

回避策はある。
`$` を何もしないエイリアスとして登録してしまえばいいのだ:

```zsh:.zshrc
alias '$'=''
```

こうして

```console
$ $ echo 'Hello'
Hello
```

こうじゃ！

bashだと `$` が特殊文字扱いでNGっぽいので、だれか方法知ってたら教えてください。
WindowsにAWS CLI v2をインストールする必要はない

Dockerを使えばレジストリを変えずに済む

- コマンドプロンプト

```shell-session
>doskey aws=docker run --rm -it -v %userprofile%/.aws:/root/.aws amazon/aws-cli $*
>aws configure
AWS Access Key ID [****************DD7A]:
AWS Secret Access Key [****************IiOW]:
Default region name [us-east-1]:
Default output format [json]:
```

- Gitbash
```shell-session
$ alias aws='MSYS_NO_PATHCONV=1 docker run --rm -it -v $HOME/.aws:/root/.aws amazon/aws-cli'
$ aws configure
AWS Access Key ID [****************DD7A]:
AWS Secret Access Key [****************IiOW]:
Default region name [us-east-1]:
Default output format [json]:
```

- WSL

```shell-session
$ alias aws='docker run --rm -it -v $HOME/.aws:/root/.aws amazon/aws-cli'
$ aws configure
AWS Access Key ID [****************DD7A]:
AWS Secret Access Key [****************IiOW]:
Default region name [us-east-1]:
Default output format [json]:
```

## 参考

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-docker.html
【2024マラソン10】Qiitanの可愛がられ具合から、子どもに好かれるキャラクターデザインを考える

![IMG_9287.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/964152/71e1824a-91ce-b27e-cbd5-840f1bd69d64.jpeg)



# 何の記事?
Qiitanがとても娘たちに可愛がられているので、どこが好かれるポイントなのかを観察・考察してみることにしました

# 誰向け?
- Qiitanぬいぐるみがあると、子供がどう遊ぶのか気になる人
- Qiitanぬいぐるみがどんなものか、興味がある人
- とりあえず、Qiitanが好きな人

# Qiitanってナニ?
ご存じない？
記事を書き上げたときに記事投稿が完了しましたと出てくる緑色の動物。
これがQiitan(きーたん)です。
Qiitaのマスコットキャラクターです。

よくQiitaのイベントのノベルティーとして、ぬいぐるみやピンバッジなどがもらえたりします。
[Qiitaの公式ショップ](https://suzuri.jp/qiita)でもデザインTシャツが売られています。

ちなみに公式によるとたぬきだそうです。~~私はずっと猫玉だと思っていました。~~

https://x.com/Qiita/status/1787694331488575671

# 可愛がり方
## 長女 5歳の場合
- なでなでする

![IMG_3631.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/964152/7d95fc6c-5e90-d2d4-f99c-aaa167e91fb8.jpeg)


もう5歳にもなった長女は、ちゃんとぬいぐるみとして大事に可愛がるようになりました。
ただ、とんがり耳なので最初はネコだと思っていたようです。タヌキだよと教えてあげたら **「ｴｴｴｴｴｴｴｴ」** って言ってた。わかる……。
- ハグをする

![IMG_3631.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/964152/557fa5c7-91df-7cd5-650b-341362e5ecd2.jpeg)


ニコニコverなのもあってか、見せるとにっこり笑顔でハグしてくれます。
自分がぎゅーってしてもらうと嬉しいから、ぬいぐるみにもハグしてあげている姿はかわいらしいですね。
- お布団をかけてあげる
眠そうに船を漕いでいる仕草をさせると「眠たいの?」と尋ね、自分のお布団に入れてあげたり、タオルケットをかけてあげたりします。
さすが5歳児。自分よりも体が小さき存在として優しくしてあげているようです。
## 二女 1歳半の場合
- モーニングスター

![IMG_3631.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/964152/0317b57c-5161-e79e-da42-890a0f6b2f26.jpeg)


しっぽはよっぽど掴みやすいのでしょう。よくぶんまわしの系にあっています。
というより、1歳半の子供にとっては、ぬいぐるみの体を持つ手で抱えると言う発想がないので、**何か物体を目の前にしたときに、手頃に掴みやすそうな部位をつかみます。**
例えば、ウサギのぬいぐるみであれば、小さな手よりも長い耳をつかんで持ち歩くこが多いように思います。
そしてQiitanは尻尾を掴んだ後、ちょうどよくボディーが振り回せるので、よくモーニングスターにされています。見かけたらすかさず武装解除を頑張るのですが、すぐ止めに来ることがわかってしまった今となっては、親の呼び鈴がわりにモーニングQiitanをされます。

- ハンドボール

![IMG_3631.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/964152/ab4ae658-c71b-a23b-5671-8a32b661ad20.jpeg)


**もはや顔がついているだけのボールと認識している節があるのでは**と思うような扱いを受けています。ほどよく弾力があり、ほぼボールのようなボディがちょうどいいようです。渡すと大体空を飛びます。

- ボーリング
空を飛ばないパターンもあります。ボーリングです。
他のぬいぐるみのお友達にぶつかるまで止まらずすっ飛んで行きます。

- ぬいぐるみのそばに添える
一通りQiitanの運動が終わると、他のぬいぐるみの隣に置いて遊びを終えます。

# どのあたりがかわいいと評価してもらえているのか
- 肌ざわり
目や口、ひげも含めてふわふわすべすべで触りやすいので、よく近づけていくと、頬ずりをしてくれます。それくらいに肌触りは気に入られているようです。
やはりぬいぐるみは手にとって可愛がったりするものなので、肌触りは小さい子にとって重要なポイントなのかなぁと思います。

- 顔がシンプルでわかりやすいデザイン
赤ちゃんや小さい子向けのぬいぐるみは、目と口だけなど、シンプルな顔立ちのものが多いです。
Qiitanも漏れなく、シンプルな顔立ちをしています。
また、目、鼻、口、ひげなどのパーツが黒線で書かれているので、子供からはとても認識しやすそうです。

- にっこりしている表情
去年のアドベントカレンダーでもらったQiitanぬいぐるみは、にっこりverでした。にっこりQiitanを近づけると娘たちもニコニコと笑います。

- 猫耳
とんがり耳があることで、なんとなく動物感が出て親しみやすいと言うのもあるかと思います。
特に犬や猫などは1番身近な動物なので、猫耳があることでだいぶ可愛がってもらえていると言うこともあるのではないでしょうか。たぬきだけど。

- つかみやすく、揺れる尻尾
しっぽのバランスが本当に絶妙だなぁと、私も気にいっているポイントです。
手に取ったときにちょこんと触れる位置や、しっぽを持たなくてもQiitanを振るとしっぽが揺れるバランスであったりと素晴らしいです。
デザインをした方も、これを可愛くぬいぐるみに落とし込んだ人もすごいなぁと思いました。


# 2匹目が欲しい
Qiitanへの負荷を分散させるべく2体目を入手したいところです。
あと、普通に何匹もQiitanが並んでるの、めちゃくちゃかわいいと思う。

今何記事目? マラソン走ってきまーす。
【CSS】保存したPDFをAdobe Acrobat Readerで開くと文字化けした

## 前提
自分でCSSファイルをいじれるページでの解決法。
## 事象
タイトル通り。
作ったページを印刷→PDFで保存→Adobe Acrobat Readerで展開したときに文字化けした。
WordやブラウザでPDF確認するぶんには文字化けしていない。
## 原因
ページにメインで使用していた`Noto-serif JP`のfont-familyがAdobe Acrobat Reader側で対応していなかった。
## 解決法
・`Noto-serif CJK JP`の.woffファイルを準備する。
・印刷用のスタイルシート内でfont-familyを`Noto Serif Japanese`に変更。
```css
@font-face {
font-family: 'Noto Serif Japanese';
font-style: normal;
font-weight: 400;
src: url('fonts/NotoSerifJP-Regular.woff') format('woff');
}
body {
font-family: 'Noto Serif Japanese', serif;
}
```
参考サイト：https://www.purakan.co.jp/blog/authorf124e/106.html
### @font-face
CSSのアットルールでテキストに適用させるべき外部フォントに関する指定を記述する。
使用するフォントのファイルをDLしてローカルサーバーにアップしておく必要がある。
## 最後に
今回は案件で`.woff`ファイルと指定があったので`.woff`ファイルを使用しているが、
それぞれの特徴を理解しといたほうがよさそう。
参考サイト：https://reikawatanabe.com/font-file-extension-difference/

今回の内容とは逸れちゃうからまた別の機会にまとめよう…(多分)
AWS Summits Japan 2024 参加レポ

今年もAWS Summits Japanの時期がやってまいりました〜！
ということで、2日とも参加してきた内容のレポ記事を作成しました。

※昨年度のレポは[こちら](https://qiita.com/AlmondTofu/items/2d8eafe8fd962a0f0931)です。

## 事前準備
AWS Summits公式サイトで来場予約をします。
今年は予約したのが6月に入ってからだったのですが、その時点でセミナーの6割くらいは満席でした。
完全に出遅れた(；ω；)

## 当日
9時には会場に到着。
今年は入場券の事前印刷も不要でした。
また、入り口で基調講演の座席指定券とお弁当引換券がセットで配布されており、その指定席に行くとお馴染みの座布団かもらえる方式でした。とってもスムーズで良いですね！

さらにモーニングドリンク(ペットボトル飲料)まで配布されておりました。
こう言うイベントに行くと水分補給が後回しになりがちなので、ものすごくありがたいです。

2日間ともに基調講演を聞いた後で、興味のある個別セッションに参加しつつ、ブースをのぞいてきました。

## セッションの感想

#### 基調講演(1日目)
生成AIの話がほとんどでした。また、Amazon Qの日本語対応が発表されました。ぜひ使ってみたいです。


#### 基調講演(2日目)
次世代リニアの運営にAWSを利用する話が印象的でした。
機械学習とLambdaを組み合わせた異音検知の仕組みなど、聞いていてワクワクする内容で、技術の発展に純粋に感動してしまいました。

https://aws.amazon.com/jp/about-aws/whats-new/2024/06/jr-central-leverages-aws-for-yamanashi-maglev-line-driving-efficient-operations-of-next-generation-high-speed-railway-service/



ここからは気に入ったセッションの感想を記載していきます。

#### 1,000 を超える Web サイトを少人数で運用するソニーミュージックソリューションズ様のオブザーバビリティ実現例～クラウド運用をリアクティブからプロアクティブに！～
少人数でシステムを保守する苦労のお話は、涙なしには聞けない、というのは冗談ですが…。実際にシステムを運用する中で大変なポイントと、それを解消するための方法が大変分かりやすかったです。
特に、「現状のどこに困っているか」をしっかり言語化している所が印象的でした。
やはり困っている事が明確でないと解決策を導き出す事は不可能なので、このピックアップの仕方を含めて参考にしたいともいます。

#### コンタクトセンター基盤移行で感じた Amazon Connect 活用の勘所 - ふくおかフィナンシャルグループが取り組む営業改革
金融系の大規模なシステムをわずか6か月でクラウド移行するというプロジェクトの成功のカギなどを紹介されていました。実際のスケジュールなども資料にありましたが、この規模の案件をこのスケジュールで完了させたのはかなり驚きでした。成功のカギにも上げられていた「プロジェクトマネジメントの重要性」は、複数のステークホルダーが登場するような案件の中ではかなり大きな要素だったのではと感じましたし、コミュニケーションの大切さを再確認しました。

#### 先行事例から分かってきた、自治体職員がガバメントクラウド利用をする上で考えておくこと
こちらは自治体関連の案件時に考慮すべきポイントを説明するセッションでした。
かなり案件構築時の考慮点が分かりやすくまとめてあり、自治体だけではなくどのような案件でも参考にできる内容だったと思います。


## ブースの感想
個人的には「トレンドマイクロ」さんと「クラスメソッド」さんのブースで実施していたミニセミナーは、聞きごたえがあり良かったです。
また、どこも生成AI関連の発表が多く、過渡期であることをより実感できました。


## イベント全体の感想
ほとんどのセッションの話題の中に、「生成AI」というワード入っていると言っても過言ではありませんでした。
去年はIoTなどの話もあった印象ですが、今年は生成AIが圧倒的ですね。

2日目の基調講演で出てきた通り、「生成AI」の登場は大きな技術革新のタイミングであると感じました。
これから生成AIの市場がどんどん広がって行くということが、肌で感じられました。
やはりオンサイトなイベントは良いですね。

ただ、あまりの混雑で予約済みのセッションなのに立ち見になったケースが複数回あり、
講演自体はオンデマンドで視聴でもいいかもなと正直なところ思いました。
人込みがすごくて希望のブースに知被けなかったりすることもあったので、来年はもう少しうまく立ち回りたいと思います。
Goのテストの後処理におけるdeferとt.Cleanupの差

単体テストにおいて前処理と後処理をする場合が多い。

例えばDBのデータを作成/削除する、一時ファイルを作成/削除するなどテスト対象の関数やメソッドの責務のみに集中するためには、テストの前処理と後処理を行う必要がある。

Goのテストにおいての前処理と後処理にはTestMain関数を用いる。

一方で各テスト関数において前処理と後処理を行う方法として、`defer`と`t.Cleanup`がある。

この挙動の差をサンプルコードを用いて確認する。

## deferとt.Cleanupの違い

`defer`は関数の終了時に実行される処理を登録する。

一方で`t.Cleanup`はテスト関数の後処理を登録する関数で、テスト関数が終了するときに登録した関数が実行される。

## サンプルのテストコード

さて問題です。

次のようなテストコードが実行されるとどのように表示されるか。

```go
package main_test

import (
	"fmt"
	"testing"
)

func TestMain(m *testing.M) {
	fmt.Println("before tests")
	m.Run()
	fmt.Println("after tests")
}

func TestDeferVsCleanup(t *testing.T) {
	t.Cleanup(func() {
		fmt.Println("Cleanup: テストのクリーンアップ処理")
	})

	helperCleanup(t)

	// deferの登録
	defer fmt.Println("defer: 関数の終了時に実行")

	fmt.Println("テスト処理の実行")

	t.Run("subtest", func(t *testing.T) {
		defer fmt.Println("defer: サブテストの終了時に実行")
		t.Cleanup(func() {
			fmt.Println("Cleanup: サブテストのクリーンアップ処理")
		})
		fmt.Println("サブテストの実行")
	})
}

func helperCleanup(t *testing.T) {
	t.Helper()
	t.Cleanup(func() {
		fmt.Println("Cleanup: ヘルパー関数のクリーンアップ処理")
	})
}
```

---

答え

```sh
$ go test -v
before tests
=== RUN   TestDeferVsCleanup
テスト処理の実行
=== RUN   TestDeferVsCleanup/subtest
サブテストの実行
defer: サブテストの終了時に実行
Cleanup: サブテストのクリーンアップ処理
defer: 関数の終了時に実行
Cleanup: ヘルパー関数のクリーンアップ処理
Cleanup: テストのクリーンアップ処理
--- PASS: TestDeferVsCleanup (0.00s)
    --- PASS: TestDeferVsCleanup/subtest (0.00s)
PASS
after tests
```

## 解説

Goのテストやベンチマーク測定が実行されると、最初にTestMain(m *testing.M)関数が実行される。

メインのgoroutineで実行され、前処理と後処理を行うことができる。

`m.Run()`を実行することで各テスト関数が実行されるため befer testsが最初に、after tests が最後に表示される。

TestDeferVsCleanup関数を順に見ていく。

t.Cleanup、及びt.CleanupをコールしているhelperCleanup はテスト関数の後処理を登録する関数で、テスト関数が終了するときに登録した関数が実行される。

関数の終了時に実行されるdeferは、関数の終了時に実行されるがt.Cleanupよりも先に実行される。

次にfmt.Println("テスト処理の実行")が書かれているのでこれは最初に表示される。

続いてサブテストが実行され、fmt.Println("サブテストの実行")が書かれているため次はこれが表示される。

サブテスト内にdeferとt.Cleanupが登録されているため、サブテストの後処理がdeferで登録されたfmt.Println("defer: サブテストの終了時に実行") -> t.Cleanupで登録されたfmt.Println("Cleanup: サブテストのクリーンアップ処理")の順に表示される。

サブテストの後処理が終わると、TestDeferVsCleanup関数の後処理が実行される。

TestDeferVsCleanup関数の後処理はdeferで登録されたfmt.Println("defer: 関数の終了時に実行") -> t.Cleanupで登録されたfmt.Println("Cleanup: ヘルパー関数のクリーンアップ処理")の順に表示される。

t.Clearupで登録された関数は、登録された順と逆順に実行される。

参考: https://pkg.go.dev/testing#hdr-Main

## まとめ

defer, t.Cleanupはテスト関数の後処理を書け、サブテスト内やヘルパー関数内でも登録した場合の動きを見た。

これらの性質を理解して、テストコードを書く際に使い分けていきましょう！
DOMContentLoadedとonLoad 、onPageshowの違い

# DOMContentLoaded
トップページのHTMLファイルの解析が終わり、DOMツリーができたタイミング
CSSやJS、画像などのロードはまだ！！！

https://developer.mozilla.org/ja/docs/Web/API/Document/DOMContentLoaded_event


# onLoad 
トップページのHTMLファイルの解析が終わったうえ、CSSやJS、画像などのロードもできた！！！

キャッシュからの復元時は発生しない！

https://developer.mozilla.org/ja/docs/Web/API/Window/load_event

# onPageshow 
onLoadとほぼ同じタイミングで発生するけど、「画面が表示できた」と定義されている！！！

キャッシュからの復元時にも発生！

https://developer.mozilla.org/ja/docs/Web/API/Window/pageshow_event
なぜdjangoのデフォルトのポートは８０００なのか

Djangoを初めて使うとき、開発サーバーを起動するとデフォルトでポート8000が使用されることに疑問を持ったので自分なりに調べてみました。本記事では、Djangoのデフォルトポートが8000になっている理由についてを記述します。

## 1. 昔からの慣習によるもの
多くの開発フレームワークやツールは特定のポート番号をデフォルトで使用します。例えば、HTTPのデフォルトポートは80、HTTPSのデフォルトポートは443です。しかし、これらのポートはすでにシステムの他のサービスによって使用されている可能性が高いため、開発用のサーバーでは別のポートを使用することが一般的です。ポート8000は他のサービスと競合することが少ないため、デフォルトではポート8000が使われるようになりました。

## 2. 一貫性と衝突の回避
ポート8000は比較的使用頻度が低いため、他のサービスとのポート競合を避けることができます。これにより、開発環境での一貫性を保ちつつ、他のサービスとの衝突を回避することができます。

## 3. 覚えやすさと便宜性
8000というポート番号は覚えやすく、しかもタイピングしやすい番号です。これにより、開発者がコマンドを入力する際に簡単に入力できるという利点があります。

## 4. 歴史的な背景
Djangoの初期バージョンからポート8000がデフォルトとして使用されてきました。これは長い間続いてきた慣習であり、そのため新しいバージョンでもそのまま引き継がれているため、現在でもポート8000が使われています。

# デフォルトポートの変更方法
Djangoの開発サーバーのデフォルトポートは簡単に変更することができます。例えば、次のコマンドを使用することによってポート8001でサーバーを起動できます。
```bash
python manage.py runserver 8001
```
これにより特定のプロジェクトや環境のニーズに合わせてポート番号を変更することが可能になります。

# まとめ
Djangoのデフォルトのポートが8000である理由は、慣習、一貫性と衝突の回避、覚えやすさ、そして歴史的な背景にあると考えられます。デフォルトポートはプロジェクトごとに変更することができるため、必要に応じて調整することが望ましいです。

この記事が学習の備忘録となり、またDjangoついて理解を深める助けになればと思います。
PowerAutomateDesktop 入力のブロックができない場合の対処法

# 概要
***"入力のブロック"*** アクションが失敗する場合の原因と対処法について解説します。
# 原因
管理者権限で実行されていないことが原因です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809382/3d42da1f-6700-6149-49fc-6cb795a741f5.png)
# 解決方法
:::note alert
動作を試す際は、"***必ず***" ブロックの解除を入れてください。
例外やエラーが出た際もブロックの解除が行われるようにしてください。
:::

まずPowerAutomateDesktopを終了します。
タスクマネージャーを確認し、プロセスが残っていたら終了させます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809382/9286191c-b4e4-1e5f-5737-4a8931bf10a9.png)
ショートカットを右クリック→プロパティ→ショートカットタブの詳細設定
管理者として実行に☑をする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809382/412bc7fc-8a7d-f093-451d-bf0af71a484f.png)
FlutterのContainerウィジェットの基本的な使い方



Containerウィジェットは、サイズ、背景色、余白、子ウィジェットの配置などを指定できる便利なウィジェットです。以下に、Containerウィジェットを使った簡単な例を示します。

## 例: 青い四角形の中央に「Hello, World!」というテキストを表示する

```dart
Container(
  width: 100.0,
  height: 100.0,
  decoration: BoxDecoration(
    color: Colors.blue,
    border: Border.all(color: Colors.black),
    borderRadius: BorderRadius.circular(10),
  ),
  alignment: Alignment.center,
  child: Text('Hello, World!'),
)
```

### 使用したプロパティー

- **width**:
    - **用途**: Containerの幅を指定します。
    - **例**: `width: 100.0,`
- **height**:
    - **用途**: Containerの高さを指定します。
    - **例**: `height: 100.0,`
- **decoration**:
    - **用途**: Containerの背景画像や境界線、影などの装飾を指定します。
    - **例**:
    
    ```dart
    decoration: BoxDecoration(
      color: Colors.blue,
      border: Border.all(color: Colors.black),
      borderRadius: BorderRadius.circular(10),
    ),
    ```
    
    - **プロパティ**:
        - **color**: Containerの背景色を指定します。
        - **border**: Containerの境界線を指定します。
        - **borderRadius**: Containerの角の丸みを指定します。
- **alignment**:
    - **用途**: 子ウィジェットをContainer内でどのように配置するかを指定します。
    - **例**: `alignment: Alignment.center,`
- **child**:
    - **用途**: Container内に配置する子ウィジェットを指定します。
    - **例**: `child: Text('Hello, World!')`

### 他にもこんなプロパティがあります

- **margin**: Containerの外側の余白を指定します。
- **padding**: 子ウィジェットの内側の余白を指定します。
- **constraints**: Containerの最小・最大幅と高さを指定します。
- **transform**: Containerに対する変換行列を指定します（回転、スケーリングなど）。
- **clipBehavior**: 子ウィジェットの範囲をどのようにクリップするかを指定します。

---

以上がContainerウィジェットの基本的な使い方とそのプロパティの説明です。これを基に、様々なレイアウトやデザインを試してみてください。この記事が皆さんのFlutter開発に役立つことを願っています！
実用的なDB設計

初めて現場で経験したDB設計、その中でも特にテーブル定義に焦点を置いて学んだ手順をまとめていきます。参考書に書いてあることと被る内容もありますが、現場ならではの工夫などもあるので最後まで読んでいってください。
※権利上の問題に抵触しないよう、今回は管理者テーブルのみ例に出しております。本来であれば他にもたくさんのテーブルを扱います。

**目次**
1. 要件確認
1. エンティティの洗い出し
1. figmaでざっと書いてみる
1. スプレッドシートでテーブル定義書作成
1. ER図作成

# 1. 要件確認
はじめに要件の確認をします。当たり前ですが、何を作るのかがわからないとDBの設計などできません。思いつく限りどういうものを作るのか書き出したりして、不明瞭な部分を別で作ったQ＆Aシートに書き出していきましょう。

# 2. エンティティの洗い出し
次にエンティティを洗い出します。エンティティとは「管理するデータ」のことです。
例えばQiitaのトップページで言えば、ヘッダーロゴなどコードにベタ貼りしているものは管理されていませんが、フォロー中のタグなどDBに格納されそうなものを管理するデータとし洗い出していきます。

![スクリーンショット 2024-06-28 16.04.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760862/6fe0b337-b960-54bc-b3bd-f081288b9221.png)

# 3. figmaでざっと書いてみる
次に、エンティティの洗い出しで判明した必要なテーブルやカラムをfigmaに書き出していきます。これはいわゆるブレインストーミングのようなフェーズですので、他にも必要事項などあればどんどん書き出していくとなお良いです◎

![スクリーンショット 2024-06-28 16.59.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760862/10a68848-aeb8-b473-0dc7-6dad26c04141.png)


# 4. テーブル定義書作成
いよいよ本番。スプレッドシートにテーブル定義書を作成していきます。
とはいえ、テーブル定義書作成に最低限必要な情報はテーブル名・カラム名・データ型・サイズ・null許容の5つ。前工程までで半分くらい出来上がっているも同然なのでそこまで身構える必要はないです。

![スクリーンショット 2024-06-28 16.57.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760862/68a94e9b-826e-ed0c-7617-14696043720e.png)

上画像のように現場ごとに用意されているフォーマットを埋めていきます。

# 5. ER図作成
最後に、ER図を作成していきます。figma作成のより詳しいバージョンみたいなイメージです。専用の作成サイトなどいくつかあるので調べてみてください。
今回の作成サイト：https://app.diagrams.net/

![スクリーンショット 2024-06-28 17.02.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760862/432c8836-b993-0215-e957-d6f828215f2f.png)

作成したER図はテーブル定義書に新しいシートを作り、スクショを貼っておくと良いです◎
ここまでできたらDB設計は完了です。
# まとめ
今回はDB設計の流れを説明していきました。この作業の流れでどの現場でも通用すると思いますのでご参考にしていただけますと幸いです。私の実体験からfigmaやスプレッドシートを例に出させていただきましたが、類似ツールはたくさんあるので現場に合わせて使い分けられるようにしていけるとグッドです。
【Active Directory】基本事項と導入手順

## はじめに
企業においてアカウント管理とセキュリティは業務運営における重要な要素です。Active Directoryはそれを担うサービスとして広く利用されています。本記事ではActive Directoryの基本機能、利点、導入手順について簡単に解説します。

## Active Directoryとは？
Active DirectoryはMicrosoftが提供するディレクトリサービスでネットワーク上のユーザーやコンピュータを一元管理するためのシステムです。以下のような機能を提供します。

1. **一元管理**: 
    ユーザーアカウント、コンピュータ、グループ、およびその他のリソースを1つに統合し管理
2. **認証サービス**:
    ユーザーログイン時にID、パスワードを確認し本人であることを確認
3. **ポリシー適用**:
    特定のユーザやグループに対してのセキュリティ設定やソフトウェアのインストールを一括管理
    
## Active Directoryの利点

1. **効率的なアカウント管理**:
   - ユーザーアカウントの作成、変更、削除を一元管理できるため運用効率の向上
   - グループポリシーにより一貫性のあるセキュリティ設定が可能

2. **リソース管理の一元化**:
   - ネットワーク内の全リソースを一元管理することで、管理の複雑さを軽減
   - 共有フォルダやプリンタなどのリソースへのアクセス権を簡単に設定・管理

## Active Directoryの構成要素

### ユーザー
ユーザーはActive Directory内で管理される個々のユーザーアカウントやコンピュータアカウントのことです。ユーザーアカウントは個別に作成され、ネットワークリソースにアクセスするための認証情報(ID,パスワード)を含みます。コンピュータアカウントはネットワーク上のコンピュータを識別し管理するために使用されます。

### グループ
グループは複数のユーザーアカウントやコンピュータアカウントをまとめて管理するための単位です。グループを使用することでセキュリティポリシーやアクセス権限を一括で設定できるため、管理の効率が向上します。

### 組織単位（OU）
組織単位（Organizational Unit, OU）はネットワーク内のユーザーやコンピュータなどを整理するためのフォルダのようなものです。OUを使用することでユーザーやグループを階層的に整理しまとめることができます。またOUごとに管理権限の設定をすることができます。これにより管理の負荷を分散しセキュリティを強化することができます。

## Active Directoryの導入手順

### 1. 事前に
今回はHyper-V 環境上の仮想マシンで作成することとする。
※Hyper-Vを有効化するには以下を参照
https://learn.microsoft.com/ja-jp/windows-server/virtualization/hyper-v/get-started/install-the-hyper-v-role-on-windows-server

### 2. Active Directoryのインストール
1.サーバーマネージャーから「役割と機能の追加」を選択
![スクリーンショット 2024-06-27 093337.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809385/51238405-4efb-4a20-a333-f2425ae99803.png)

2.「サーバーの役割」をクリックし「ActiveDirectoryドメインサービス」にチェックを入れる

![スクリーンショット 2024-06-27 092041.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809385/9d781f5c-dad3-958f-b2ac-5a58b87b83cd.png)

3.インストールを選択し終了する

4.スタートメニューに「Windows管理ツール」→「Active directoryユーザとコンピュータ」が追加されていることを確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809385/dc4ef646-87c0-33b7-4e5e-93b342ead6db.png)

## まとめ
Active Directoryは企業のアカウント管理とセキュリティ強化に欠かせないサービスです。適切な計画と導入により効率的な管理とセキュリティの強化を実現できます。これにより企業全体の業務効率と安全性の向上が見込めます。
パス部分に%2F（/）スラッシュは使えないのでクエリパラメータでパラメータを指定した

下記のようなURLでパラメータをパスで受け取ろうとして、404になった。

```md
https://example.com/path/hoge%2Ffuga/
```

```route.php
Route::get('/path/{param}', 'HogeController@index');
```

パスでパラメータを受け取ろうとしていた。が/（スラッシュ）は予約文字ということでパスには使えないことが判明。
下記がエビデンス。
https://www.ietf.org/rfc/rfc2396.txt#:~:text=2.2.%20Reserved%20Characters


代わりに、

```route.php
Route::get('/', 'HogeController@index');
```

```HogeController.php
$request->query('url');
```

で受け取るようにした。
下記のようなURLで正常に遷移してくれるようになりました。

```md
https://example.com/path/?url=hoge/fuga
```

地味に時間を使ったので備忘録として残しておきます。


他にも予約文字があり、パスには使用できないので覚えておきたい。。。。

```reserved
「; / ? : @ & = + $ ,」
```

ご一読ありがとうございました。
【Fluentd】parserプラグインがjsonだと、時刻がUnixEpocTimeになる問題について【1970-01-01】

以下の参考URLをもとに解決しました。
参考URL:https://github.com/fluent/fluentd/issues/427


上記の記事は少し古く、バージョンも異なるので
自分の状況含め後でもう少し記載します。
とても困ったのでひとまず。

fluentd
19700101
time
placeholder
@type json
fluent.conf
paiza.IOでプログラミング勉強！

こんにちは。篠原です。

今回は、新人プログラマーさん向けに
「paiza.IO」の紹介をしたいと思います。


## paiza.IOとは？

https://paiza.io/ja

ユーザー自身が開発環境を構築することなく、
ブラウザ上でコードを書いて実行できるオンライン実行環境です。 
すぐにプログラミングが始められ、無料で利用が可能で
C、C++、Java、Ruby、Python、PHP、Perlなど、主要32言語に対応しています。



## 実際にコードを書いてみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/c6b3e3b5-eb69-9a68-6c93-d746d15b7954.png)
コード作成を試してみる(無料)をクリックするだけで
直ぐに開発画面に遷移します。
<br>




![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/3c143922-6a9a-1a71-0cfa-ce08deca5900.png)

画面左上のプルダウンをクリックすると
ずらっとプログラミング言語の一覧が表示されるので
勉強したい言語を選択します。
これで準備完了です！
<br>


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/89a04bf8-e6c0-09a9-5e52-937da08baf5b.png)
実際にPHPを選択し、
「Hello World」を出力するコードを書いてみました。
実装後、画面中央の実行ボタンをクリックすると
画面下出力欄に「Hello World」が出力されました。
コンパイルもしっかりやってくれるので安心。
<br>
また、ユーザー登録をすると、コードの保存もできたり、
GitHub アカウントと連携も可能な為、
とても便利です。

## さいごに
何気に時間がかかる環境構築をせずに
直ぐコーディング＆実行までできるので
プログラミング勉強だけでなく
思いついたコーディング試したいときなどオススメです！
以上、篠原でした。
Pythonで指定した文字数のパスワードを生成するプログラムを作ってみた

### 前置き
以前random関数を使って、Password Generatorを作成した。今日はsecrets, 機密を扱うために安全な乱数を生成して、パスワードを作成するプログラムコードを紹介したい。
引用元：https://docs.python.org/ja/3/library/secrets.html#module-secrets

パスワードは一般的に英大小文字＋数字＋記号で10桁以上が安全だといわれています。
引用元：https://www.lrm.jp/security_magazine/secure_password/

まずは、記号、英文字、数字を含めた12文字のパスワードを生成してみる。
### プログラムコード
``` python
import secrets
import string

def generate_password(length=12):
    alphabet = string.ascii_letters + string.digits + string.punctuation
    secure_password = ''.join(secrets.choice(alphabet) for i in range(length))
    return secure_password

# パスワードを生成して表示する例
generated_password = generate_password()
print("生成されたパスワード:", generated_password)
```
### 出力結果
``` python
生成されたパスワード: %k=#F!>6uOHq
生成されたパスワード: pX9*s^~<(}g#
生成されたパスワード: j4Z!u@TOj{qo
生成されたパスワード: 0<?8*k^iexu4
生成されたパスワード: :d^5Zh@<]_B+
```
パスワードを一方的に12文字と設定し、ランダムに生成するのもどうかなと思った。
そこで、ユーザーにパスワードの文字数を選ばせ、パスワードを生成するプログラムコードに改良した。

### 改良したプログラムコード
``` python
import secrets
import string

def generate_password(length):
    alphabet = string.ascii_letters + string.digits + string.punctuation
    secure_password = ''.join(secrets.choice(alphabet) for _ in range(length))
    return secure_password

def main():
    try:
        length = int(input("生成するパスワードの文字数を入力してください: "))
        if length <= 0:
            print("無効な文字数です。正の整数を入力してください。")
            return

        password = generate_password(length)
        print("生成されたパスワード:", password)

    except ValueError:
        print("無効な入力です。整数を入力してください。")

if __name__ == "__main__":
    main()
```
### オリジナルコードとの相違点
1. 文字数の指定:
前のコード: 固定の長さ（デフォルトで12文字）のパスワードを生成していました。
今回のコード: ユーザーに対して文字数を入力してもらい、その長さに応じてパスワードを生成します。
2. エラーハンドリングの改善:
今回のコード: ユーザーが整数以外の入力や負の数を入力した場合にエラーメッセージを表示しています。これにより、プログラムの安全性と使いやすさが向上しています。
3. 関数化の強化:
今回のコード: generate_password 関数と main 関数に処理を分割し、コードの構造化と再利用性を高めています。これにより、パスワード生成のロジックとユーザーインターフェースが明確に分離されています。
4. 機能追加:
今回のコード: ユーザーに対して文字数を選択させる機能が追加されており、より柔軟にパスワード生成が可能です。

ここでは、5,8,10,12,15,20,30文字のパスワードを出力した結果を含めます。
###  出力結果
``` python
生成するパスワードの文字数を入力してください: 5
生成されたパスワード: VM%'u
生成するパスワードの文字数を入力してください: 8
生成されたパスワード: n.-pI_+t
生成するパスワードの文字数を入力してください: 10
生成されたパスワード: *?W/*UV'ZX
生成するパスワードの文字数を入力してください: 12
生成されたパスワード: g!g:+MIGqm`Q
生成するパスワードの文字数を入力してください: 15
生成されたパスワード: m70@-S1[aKw!X@4
生成するパスワードの文字数を入力してください: 20
生成されたパスワード: uTRrb>|(cbTizj2lkK3M
生成するパスワードの文字数を入力してください: 30
生成されたパスワード: MT.ZhQtIT=eW.r60@4}+`PA(IgVX'!
```
このように、ちゃんとユーザーが指定した文字数通りにパスワードが生成されている。
また、安全性の観点から英文字、記号、数字の順番がランダムに混ざっている。

皆さんもこのプログラムコードを参考にして、いろんなサイトで使用するパスワードを、生成してみてはいかがでしょうか。
リクエストを出してからWebページが見れるまえのブラウザ側動作を調べた

# 背景
お客様PJの保守を実施する中、「ユーザー側のネットワークの速度により、画面表示前の処理がおかしくなったりしてる」と調査依頼が来ました。

事象やその原因を大体理解できたが、お客様に説明するため調べた資料をブログ化しようと思います。

# Webページが見えるまでのブラウザ側動作と注意点

ネットワークが速い場合、ユーザーがURLを打ってすぐにページが見れたと思いますが、実は裏でブラウザがいろんな仕事をやってくれました。


### DNS解決 (DNS Resolution)
ブラウザはリクエストするドメイン名をIPアドレスに変換します。

### TCP接続 (TCP Connection)
ブラウザはサーバーとTCP接続を確立します。この過程で三者ハンドシェイク（SYN, SYN-ACK, ACK）が行われます。

### SSL/TLSハンドシェイク (SSL/TLS Handshake)（HTTPSの場合）
セキュアな接続が必要な場合、ブラウザとサーバー間でSSL/TLSハンドシェイクが行われ、暗号化通信が確立されます。

### HTTPリクエスト送信 (Sending HTTP Request)
ブラウザはサーバーに対してHTTPリクエストを送信します。リクエストにはメソッド（GET, POSTなど）、ヘッダー情報、および必要に応じてペイロードが含まれます。

:::note warn
このタイミングでようやくサーバーに一回目のリクエストを出しました！！！
:::

### サーバー応答待ち (Waiting for Server Response)
ブラウザはサーバーからの応答を待ちます。

### HTTP応答受信 (Receiving HTTP Response)
サーバーからのHTTP応答を受け取ります。応答にはステータスコード（200 OK、404 Not Foundなど）、ヘッダー情報、および必要に応じてボディが含まれます。

:::note warn
一回目のレスポンスが来ました！！！
（index.htmlとかのトップページ）
（CSSやJSなどはまだ来ていないよ！！！）
:::

### HTML解析とレンダリング (HTML Parsing and Rendering)
受け取ったHTMLドキュメントを解析し、DOM（Document Object Model）ツリーを構築します。

:::note warn
受け取ったトップページのhtmlを解析し、タグの構成のよりDOMツリーを作る
:::

:::note info
**DOMContentLoadedイベント**発生

HTML の文書が完全に読み込まれ構文解析され、すべての遅延スクリプトがダウンロードされ、実行されたときに発生します。画像、サブフレーム、非同期スクリプトの読み込みの完了は待ちません。
:::


html
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538617/26fb7cd9-5f5b-b17e-3bc5-e9a8269ceee3.png)


### リソースリクエスト (Resource Requests)
HTML内の追加リソース（CSS、JavaScript、画像など）を取得するための追加リクエストを発行します。

:::note warn
linkタグやscriptタグ、imgタグなど外部ファイルに遭遇する場合、再度サーバーにアクセスしてファイルを要求する
（リクエストは一回で終わりではなく、複数回わけて実施するよ！！！）

ネットワークが速い環境にいると、一瞬でレスポンスを帰ってくるように見えるけど、もしネットワークが遅い環境だと、各ファイルの到着に時間差が生じてしまう可能性がある。JSファイルは通常CSSファイルにより大きいので、より遅いかもしれない。
:::
 
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538617/eda4c58b-eaeb-7a69-daed-a4e116074a7a.png)

### CSS解析と適用 (CSS Parsing and Application)
取得したCSSファイルを解析し、スタイル情報を適用します。

:::note warn
もしCSSの到着がJSより早い場合、画面の描画が先にできてしまうかもしれない。
（JSでなんらかの前処理を画面表示前に実施する仕様となると、こちらで引っかかってしまうかも、要注意！！！）
:::

### JavaScript実行 (JavaScript Execution)
取得したJavaScriptファイルを実行します。JavaScriptはDOMを操作したり、追加のリソースをリクエストしたりすることができます。

### レンダリング (Rendering)
DOMツリーとスタイル情報をもとにページのレイアウトを計算し、レンダリングします。

:::note warn
ブラウザはなるはやユーザーに画面を見せる仕組みなので、全ファイルが到着してから描画するのではなく、同時並行で仕事して少しずつ画面を作ってくれる
（一瞬CSSが全然入っていない骨のような画面構成が見えてしまうかもしれないので、要注意！！！）
:::

### ユーザーインタラクション待ち (Waiting for User Interaction)
ページが完全にロードされ、ユーザーがページとインタラクションできるようになります。

:::note info
**pageshow イベント**発生
ページが表示された直後に発生
（ブラウザーがウィンドウの文書を表示したとき）

・最初にページを読み込んだとき
・同じウィンドウまたはタブの中で、他のページからそのページへ移動してきたとき
・モバイル OS で凍結されたページを復元したとき
・ブラウザーの進む、戻るボタンを利用してこのページに戻ったとき

※ ページがキャッシュから復元された場合にも発生するため、ページが再表示されたことを検知できる
:::

:::note info
**load イベント**発生
ページの全てのリソースが読み込まれた後に発生
（スタイルシートや画像などのすべての依存するリソースを含めて読み込まれたとき）

※ ページがキャッシュから復元された場合には発生しない
:::


# 参考資料
https://developer.mozilla.org/ja/docs/Web/Performance/How_browsers_work#%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9

https://developer.mozilla.org/ja/docs/Web/API/Document/DOMContentLoaded_event

https://developer.mozilla.org/ja/docs/Web/API/Window/load_event

https://developer.mozilla.org/ja/docs/Web/API/Window/pageshow_event

https://gigazine.net/news/20190624-how-web-works/#13
AWS ストレージサービス

AWSには複数のストレージサービスがあります。効率的なクラウド運用には各サービスの使い分けを理解することが不可欠です。ということで、本記事ではAWSのストレージサービスを紹介していきます。
## S3
S3(Simple Storage Service)はデータ保存、バックアップやアーカイブ保存に使われるオブジェクトストレージです。
### Standard
頻繫にアクセスするデータを保持するための高可用性ストレージです。S3の中では最も高価です。
### Standard IA
頻繁にアクセスしないデータを低コストで保存できるストレージです。
### One Zone IA
Standard IAより安い代わりに単一AZへ依存するため耐久性が低いストレージです。
### Intelligent Tiering
アクセスパターンに基づいてS3 StandardとS3 Standard IAにオブジェクトを割り振るストレージです。
### Glacier
データの長期保存やアーカイブデータに適している低コストストレージです。データ取得に時間がかかる。
#### Glacier Deep Archive
最も安いオプションですが、データを取り出すのに数時間かかります。
#### Glacier Instant Retrieval
数ミリ秒でデータが取得できますが、Glacierの中では最も高価です。それでもS3 Standardよりは安いです。
#### Glacier Flexible Retrieval
データ取得時間はExpedited(1-5分)、Standard(3-5時間)、Bulk(5-12時間)があり、速度によって使用料金が決まります。Instant Retrievalよりは遅く、安いです。
## EBS
EBS(Elastic Block Store)はブロックストレージで、ネットワーク経由でアタッチされます。
#### 汎用 SSD(gp3,gp2)
汎用的なストレージです。gp2の方が高価で速いです。
#### プロビジョンド IOPS SSD
最も高速なストレージです。io2は16までのEC2インスタンスにマルチアタッチすることができます。
#### スループット オプチマイズド HDD
ビッグデータやデータウェアハウス等の大きいデータを高速処理する場合に適しているストレージです。
#### コールドHDD
最も安く、遅いストレージです。アーカイブ保存等に適しています。
## EFS
EFS(Elastic File System)はファイルストレージで、複数のインスタンスへのマルチアタッチが可能です(LinuXのみ)。
## Amazon FSx
フルマネージドなファイルシステムです。for Windows File Server、for Lustre、for NetApp ONTAP、for OpenZFSがあります。ビッグデータ分析や機械学習に適しています。また、マルチアタッチにも対応しています。
## 参考文献
https://aws.amazon.com/jp/s3/
https://aws.amazon.com/jp/ebs/
https://aws.amazon.com/jp/efs/
https://aws.amazon.com/jp/fsx/
Andriod Studio ワイヤレスデバッグ覚え書き

Androidアプリのデバッグをするときに、USBケーブルを使わずにワイヤレスでデバッグする方法です。
Android実機の開発者モードがオンになっていることが前提です。
Andrio Studioから設定できるっぽいボタンはあるのですが、一度もできた試しがないので毎度この方法でやっています。
何かいい方法があればご教授頂きたいです。

## ペア
ワイヤレスデバッグの画面を開いて、
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403148/cfe3c4b9-033f-3b19-b8bf-1eaa52a2d4fb.png" width="200"/>

以下のコマンドをPC側で実行します。
```shell
$ adb pair 192.168.100.14:39929

>> Enter pairing code: 431596 <- ここにAndroidに表示されている数字を入力
   Successfully paired to 192.168.100.14:39929 [guid=adb-03rf24224242237-n62342ss]
```

## コネクト
```shell
$ adb connect 192.168.100.14:39037

>> connected to 192.168.100.14:39037
```
> これでAndroidがﾋﾟﾛﾘﾝする

## 接続しているデバイスを確認する
```shell
$ adb devices

>> List of devices attached
   192.168.100.14:39037	device <- このように表示されればOK
```
プログラミングを高校生が学ぶ意義

# プログラミングを高校生が学ぶ意義

## 情報Iが有利になる
今年から共通テストで「情報I」が必須科目となりました。テストにはアルゴリズムの問題も含まれており、
プログラミングを通して練習することができます。
さらに学ぶ過程で、ネットワークやデータベースなどの周辺知識も身につきます。
教科書だけだと理解しづらい部分もありますが、実際に手を動かすと分かるようになることも多いです。

## 課題研究のネタになる
プログラミングの知識は、学校での課題研究においても非常に有用です。
データ分析やシミュレーションの作成など研究の幅が広がり、より高度な内容にできます。
またAPIを使って自動化や効率化が可能となるため、研究の進行もスムーズになるでしょう。
他の人と差別化してより良い研究にしましょう。

## 将来のキャリアに有利になる
高校生のうちに学び始めることは就職にも有利です。
大学でも学ぶこともできますが早いに越したことはありません。
またポートフォリオを作成する時間が増えるのでアピールポイントが増えます。
プログラミングはIT業界に限らず、他の業界でも活かせるスキルです。

## 物事を論理的に考える練習に鳴る
プログラムを書く上で、物事を論理的に考える力は必須です。
一つの問題を構造化してそれぞれを解決する過程は数学に似ています。
大きな問題を小さな問題に分解して解決する力は、他の学問でも活かせます。

## 英語が得意になるかも
プログラムは他の学問に比べ英語に触れる機会が多いです。
そもそもコードは英語で書きますし、ドキュメントは殆どの場合は英語です。
良い変数名を考えるためには単語力が求められ、英語を学ぶ機会ができます。
今日もPowerAppsに泣かされます


本当、Power Automateも理解できないツールでしたが、このPowerApps もかなりひどい。


さて、公開URLがいつも分からないですね。どこにあるんだろう。

詳細の中みたいですね。それにしても不親切なUIです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/43ee14a9-f2db-b34f-b51d-11771aa3b6b3.png)
webdriver.ChromeでChromeを表示したら、直ぐに落ちる原因はchromedriverのバージョン不一致

c:tempにchromedriverを置いてchromeを表示しようとしました。

```python chromdisp.py
from selenium import webdriver
import time

def disp():
    driver = webdriver.Chrome('C:\temp\chromedriver')
    driver.get('https://www.google.co.jp')
    time.sleep(10)

    
if __name__ == "__main__":
    disp()
```

#原因
Chromとchromedriverのバージョン不一致

#対策方法
1.chromeの3点リーダーをクリックして設定メニューをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2664815/231d836c-c157-5b57-145c-571894a696cc.png)

2.Chromeについてをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2664815/7d9f357d-70a3-c3be-8fff-5ee79f7c6648.png)

3.Chromeのバージョンを確認
**126**.0.6478.127 とあるが、先頭の**126**に注目
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2664815/ccec22f2-3baa-50ed-283b-b73b3af2ca39.png)

4.[ChromDeveloper](https://developer.chrome.com/docs/chromedriver/downloads?hl=ja)を表示してダッシュボードをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2664815/70a8eb7a-5482-fe0e-1fd4-e7cd011e3ae9.png)

5.私の環境はWindows 64ビットなのでこのリンクからバージョン126をダウンロード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2664815/2b7429d2-5e61-49ee-3d5f-8941df0a96c1.png)

これを使えば問題なくChromeが表示されます
コンパクトなToFカメラを調査中

# はじめに
[市販ＴoＦカメラについて調査中(2023年版）](https://qiita.com/nonbiri15/items/5fdb9962bbdc76274d90) などで3Dカメラを今までにも調査してきたが、まだまだ調査が足りていないことに気づく。

IMUがほしいだとか、time スタンプがほしいだとか、
ROS対応がほしいだとか
SDKにpythonサポートがほしいだとか
いわなければ、ToFカメラの種類はもっと多くあるようだ。
ぶつからないで移動するだけだったら、RGB画像の代わりにIR画像でも十分なはずだ。
RGBのカメラがなければ、その分コンパクトになるので、配置の自由度が増える。
そういう割り切りができるときには、もっとコンパクトなToFカメラがある。
「基板むき出し」だって上出来、その方が調整が効く。そんなタフな人たちへの選択肢だろう。

## 調査中のToFカメラ 

### [Terabee 3Dcam 80×60 - The compact, robust and affordable 3D Time-of-Flight camera](https://www.terabee.com/shop/3d-tof-cameras/terabee-3dcam/)

![Screenshot from 2024-06-28 21-26-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83761/638db2e8-bbc7-3c15-60a0-1ad9778f76da.png)
https://www.terabee.com/wp-content/uploads/2019/03/Terabee_3Dcam80x60_specsheet-2.pdf


### [e-con systems /Time of Flight (ToF) カメラ](https://www.e-consystems.com/jp/3d-depth-cameras/tof-time-of-flight-camera-jp.asp)

![Screenshot from 2024-06-28 21-19-59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83761/0bdbd7bc-4ffe-5376-150e-e01380edfcd9.png)


### [Cube-eye / TOF 3D Depth Camera](https://cube-eye.co.kr/)

![Screenshot from 2024-06-28 21-23-25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83761/a7394e43-d13c-3398-b3af-6eb45f60d0a3.png)

## コンパクトな3Dカメラ
https://shop.luxonis.com/products/oak-d-sr
> OAK-D-SR emphasizes improved short-range accuracy when compared to the standard OAK-D. To ensure the best accuracy, it's recommended to keep the depth measurement range of the OAK-D-SR between 30cm to 1m.

30 cm - 1m の範囲であるので、ぶつからないための利用といった限定的な利用ならば、使えそうである。

### アクティブステレオ方式の広角depthカメラ
KickStarter [HiFi 3D Sensor: Plug-n-Play Depth Perception & AI](https://www.kickstarter.com/projects/tangramvision/hifi-3d-sensor-plug-n-play-depth-perception-and-ai)

[OpenCV 5.0 の関係記事](https://qiita.com/dandelion1124/items/5a93a3deecefc0e17c45)を調べていたら、上記のカメラの紹介があった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83761/d5d03c78-9329-f22e-cbee-3db678c1b10a.png)
DeFi(Decentralized Finance)について

今回の記事は「DeFi」について解説します。

以前「DApp」や「NFT」の記事を書かせてもらったのですが
今回は「DeFi」について纏めていきます。

「DeFi」とは「<font color="red"><B>Decentralized Finance</B></font>」の略で、
日本語にすると「<font color="orange"><B>分散型金融</B></font>」となります。

「DApp」を構成する重要な要素となりますので
「DApp」の記事をまだ見ていないという方は、良ければ下記URLより参照ください。

https://qiita.com/ydclab_0008/items/9d2a4e44941d33c6ee00

※↑以前「DApp」について特徴や発展性などを纏めた記事です。

<br>

また、「NFT」の記事をまだ見ていないという方で、見ても良いよという方は下記URLより参照ください。

https://qiita.com/ydclab_0008/items/a73eba8ac1976ad79d5f

※↑以前「NFT」についてNFTの有用性について纏めた記事です。

<br>


## ■「DeFi」とは？
　「DeFi」とは日本語で「分散型金融」を意味し、
　ブロックチェーン技術を用いて構築された金融システム全体を指します。
　DeFiは、スマートコントラクトを利用して、
　従来の金融機関を介さずに金融サービスを提供することを目指しています。
　これにより、仲介業者を排除し、取引の透明性や効率性を高めることができます。

　大きな特徴としては、以下の3つです。
　　・体制は分散型で中央集権的な管理者が存在しない
　　・オープンソースなので取引の透明性が高い
　　・地理的な制限なし（銀行の種類やATM等の地域制に左右されない）

<br>
　少し分かりにくいですね…
<br>
<br>
　では一般的な金融と比較してみましょう！
<br>

　　**【一般的な金融とDeFiの比較】**
　　![03_DeFi_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633696/05b69122-61cf-c06f-c281-411b79f9232c.png)

　　**【一般的な金融】**
　　銀行で中央集権的に管理され、取引の記録は非公開、
　　銀行やATMの場所に左右される一般的な金融
　　　　　　　　　　　　↕　↕　↕
　　**【DeFi】**
　　ネット上で分散管理され、誰でも取引の記録を照会ができ、
　　ネットさえあれば地域に左右されない「DeFi」
  
　　という様に一般的な金融と「DeFi」は大きく違っています。

　　<B>かなり分かりやすくなりましたね！</B>
<br>
では次にメリットやデメリットについて纏めていきます。

## ■「DeFi」のメリット・デメリット
<br>
実際のところは色々あると思いますが、とりあえず双方3つずつ挙げてみます。

　　**【DeFiのメリットとデメリット】**
　　![03_DeFi_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633696/345f5f05-c613-ff99-6501-f15844dcc507.png)

　◆メリット
　　①仲介業者を排除することでコストを低減できます。
　　②手続きが簡略化でき、プライバシーの保護にも貢献できます。
　　③いつでも利用可能な為、タイムゾーンに縛られません。


　◆デメリット
　　①従来の金融の規制外の為、詐欺や不正行為に対する保護手段が限られます。
　　②現金化する際には一手間必要ですし、スリッページ（価格変動）で損をすることもあります。
　　③将来的に消費者保護のため規制や、税務監査の為の規制が考えられます。


デメリットを見ると、まだ不安は残りますね。


## ■何故「DeFi」なのか
　銀行がない、または銀行の信用性が低い地域でも利用可能です。
　途上国や紛争地域であっても経済的な機会を持つことが出来ます。

　そうでない地域でも国際的なビジネスや送金において利便性が非常に高いです。

　つまり<font color="orange"><B>インターネット</B></font>と<font color="orange"><B>能力（意欲）</B></font>があれば、
　どんな場所でも<font color="blue"><B>金融ビジネス</B></font>を始めることができるという事になります。
　
 　将来的には国際的な経済活動の不便さを払拭できる可能性もある為
　<font color="red"><B>「DeFi」</B></font>は重要な要素となり、
　必要とされる技術になると思われます。


## ■最後に
　色々調べてみると、「DApp」と「DeFi」は将来性の高い技術なのだと再認識しました。
　今後の発展次第ではありますが
　セキュアで透明性の高いサービスを提供していくことで、
　金融業界を大きく変えていく重要な技術になっていくと思われます。
Terraform 入門・基本的な仕組み・チュートリアル紹介：インフラ齧り始めのバックエンドエンジニアより

## 前段
業務の一環で Terraform に関わることになりましたが、まずはキャッチアップを行うために基本的な内容をしっかり整理していきます。

## 概要
Terraform は HashiCorp 社によって開発された`IaC（Infrastructure as Code）`を実現する `OSS（Open Source Software）` です（[GitHub / README](https://github.com/hashicorp/terraform?tab=readme-ov-file#terraform)）。

ちなみに、同社が開発した`HCL(HashiCorp Configuration Language)`という設定言語を利用します。

インフラ構築や設定をテンプレートファイルを使って自動化してくれます。
様々なクラウドサービス（`AWS,Kubernetes,VMWare,…`）に対応しており、インフラ構成をコード上で宣言的に定義することで、コードベースでの管理を実現してくれます。


## 基本コマンド
### 初期化
```
terraform init
```

ワークスペースを初期化してくれます。
`.terraform`ディレクトリが作られ、Provider Plugin と Module に関するキャッシュファイルが作成されます。

以下 terraform コマンドの実行前に必要です。
また設定変更時にも、改めて実行が必要です。

### 実行計画の確認
```
terraform plan
```
.tf（テンプレート）ファイルを元に、`.tfstate`ファイルとの差分を検知して、どのようなリソースが作成（`create`）・更新（`update`）・削除（`destroy`）されるかを事前に確認できます。

### 適用
```
terraform apply
```

.tf ファイルに記載された情報を元にリソースを作成します。

なおリソース作成後、`terraform.tfstate`に、作成リソースの関連情報が保存されます。
この`tfstate`ファイルはローカルで管理することもありますが、複数人の運用では Amazon S3 などのストレージに保存してチーム間で共有するのが一般的です。自動で更新されていくため、手動での変更は厳禁です。

2度目以降の実行後は、1世代前のものが`terraform.tfstate.backup`に保存されます。

なお複数変更を同時に実行されないよう LOCK 機能を用いて 1 つの処理が完了するまで他の処理を受け付けないという設定もできます。


### リソースを取り込む
```
terraform import
```

既に存在するリソースを Terraform 管理下に取り込みます。
例）`terraform import aws_s3_bucket.bucket bucket-name`

`import`コマンドの実行ではなく、`import`ブロックを使用しての取り込みも可能です。
対象の`.tf`ファイルを修正して、以下のように記述。`terraform apply`により適用できます。
```
import {
  id = "terraform-import-example" # リソースの識別子
  to = aws_s3_bucket.example      # import 先
}
```

## 基本的な仕組み
運用者が terraform コマンドを叩くことで、下図のように Terraform Provider を介して各クラウドプロバイダーの API が実行され、必要なインフラ構築がなされます。
![assets.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184395/ac1c9239-23b8-3f0f-d4ef-54e794e4282b.jpeg)
画像の引用元：HashiCorp 社による Terraform 開発者向け公式ドキュメント「What is Terraform? / How does Terraform work?」（ https://developer.hashicorp.com/terraform/intro ）より

- 他、参考：https://caddi.tech/archives/4320

## チュートリアル紹介
基本操作を確認するために公式のチュートリアルをやってみましたが、これが体感としてとても良かったのでオススメします。
https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli#quick-start-tutorial

なお自分は`Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?`とのエラーが出たので、下記記事を参考に Docker Host の指定をして解決しました。
https://zenn.dev/konbu33/articles/bae0ed3671b457

Terraform を介して、ローカル環境で Nginx の Docker Image を元に Docker Container を立ち上げ、http://localhost:8000/ でアクセスできるようになることを確認する流れになっています。

こういうちょっとしたことでも出来ると嬉しい！🙌
![スクリーンショット 2024-06-28 17.36.52.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184395/571eb510-5646-9ffd-9a85-16472b84bb53.png)
（失敗）windowsでdockerとkubernetesを練習する環境を作る。



### しっぱいしました・・・泣

Minikubeの起動で失敗しました。２日間調べましたが泣き寝入りです。

以下は途中までのメモ書き程度になっています。

### 環境

- Windows11
- VirtualBox
    - [**VirtualBox](https://www.virtualbox.org/wiki/VirtualBox) 7.0.18**
    - [https://www.virtualbox.org//wiki/Downloads](https://www.virtualbox.org//wiki/Downloads)
    - インストールは難しくないはず
- Vagrant
    - [https://www.vagrantup.com/](https://www.vagrantup.com/)
    - vagrant_2.4.1_windows_amd64
    - インストールは難しくないはず
- gitコマンド
    - [https://git-scm.com/download/win](https://git-scm.com/download/win)
    - Git-2.45.0-64-bit
    - インストールは難しくないはず
- docker
    - [https://www.docker.com/products/docker-desktop/](https://www.docker.com/products/docker-desktop/)
    - インストールは難しくないはず
- minikube
    - [https://minikube.sigs.k8s.io/docs/start/](https://minikube.sigs.k8s.io/docs/start/)
    - Windowsの.exe
    - インストールについて少し補足（というか翻訳）↓
        - latest releaseをクリック
        
            ![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288640/d1509ab5-3e46-ac07-c9ef-411256a62c77.png)

        
        - 管理者権限でPowerShellを開いて、コピペする。
        
            ![Untitled (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288640/16975f88-aa16-94ad-073c-bc7e040bd3ec.png)

        

            この横にスクロールできる内容のものをコピペする。ちなみにシステムの環境変数 **`Path`** に **`C:\minikube`** パスを追加しようとしている。
            

        
        - そのあとPowerShellはいったんすべて閉じる。
    
    ### 参考URL
    
    [https://github.com/takara9/vagrant-minikube](https://github.com/takara9/vagrant-minikube)
    
    [https://github.com/kubernetes/minikube/pull/16215](https://github.com/kubernetes/minikube/pull/16215)
    
    [docker](https://minikube.sigs.k8s.io/docs/drivers/docker/#requirements)
    
    [VagarntでUbuntu 20.04のboxを起動すると、「SSH auth method: private key」でスタックする](https://zenn.dev/onozaty/articles/vagrant-up-stack-ubuntu20)
    
    手順
    
    ```powershell
    ###VirtualBox の仮想サーバー上に、Minikubeを起動する。
    > git clone https://github.com/takara9/vagrant-minikube.git
    Cloning into 'vagrant-minikube'...
    remote: Enumerating objects: 54, done.
    remote: Counting objects: 100% (10/10), done.
    remote: Compressing objects: 100% (7/7), done.
    remote: Total 54 (delta 3), reused 9 (delta 3), pack-reused 44
    Receiving objects: 100% (54/54), 12.23 KiB | 4.08 MiB/s, done.
    Resolving deltas: 100% (18/18), done.
    
    ###crictlをインストールする。（バージョンの都合で必要になったため）
    > git clone https://github.com/kubernetes-sigs/cri-tools.git
    Cloning into 'cri-tools'...
    remote: Enumerating objects: 34754, done.
    remote: Counting objects: 100% (6405/6405), done.
    remote: Compressing objects: 100% (1975/1975), done.
    remote: Total 34754 (delta 4656), reused 5529 (delta 4280), pack-reused 28349
    Receiving objects: 100% (34754/34754), 33.31 MiB | 6.23 MiB/s, done.
    Resolving deltas: 100% (21114/21114), done.
    Updating files: 100% (4686/4686), done.
    ```
    
    ### おまけ
    
    vagrant upすると、仮想マシンが実行中になる。
    
  ![Untitled (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3288640/d6ec3973-3905-d85c-640e-8d64948b5ccb.png)

    
    virtualboxのGUIの様子　かわいいですね
Developers Boost 2024 に参加した

## はじめに
　2024/06/22 に開催された Developers Boost 2024 へ参加した。このカンファレンスは30歳以下(U30)の若手エンジニア向けのカンファレンスということもあり、講演内容自体も難しすぎることはなくエンジニア2年目の私にとって共感できることや学びになることがたくさんある有意義なカンファレンスだったと感じる。そんな中で私自身が最も印象的だった講演を紹介したいと思う。
 
https://event.shoeisha.jp/devboost/20240622
## 印象的だった講演
　私が最も印象的だったのは、イ ジユル[出前館]さんの「新卒1年目の自分に伝えたかった ～エンジニア成長に役に立つ話～」という講演である。本講演ではエンジニアに必要なスキルの内、「論理的思考」にフォーカスしたお話をされていた。
 　私はそもそも「論理的思考」はできる人間だと自負している。ただ「論理的思考」がなぜ重要なのか、なぜエンジニアにとって重要なスキルなのか、という考え方はしたことがなかった。そして、そもそも「論理的な思考」とは？という問いに対しても面と向かって考えたこともなかった。そういう意味でも本公演によって「論理的な思考」について深く考え意識することができたことはかなりの学びになったと思う。以下に私なりのインプットを記載する。
***
#### 論理的思考とは
　「結論とそれを支える理由・根拠を明確に繋げて考えること」
#### 論理的思考がなぜ重要なのか
 - 要件定義において価値のある要件を見極めなければいけないから
     - なぜ作るか？目的に沿った理由や根拠が重要
     - 自動化の効果がないプロセスのシステム化は必要ない
     - AsIsのプロセスはなぜ生まれたか

- プロジェクトマネジメントにおいて、多くのステークホルダーにプロジェクトやシステムの説明や意図をうまく伝えなければいけないから
#### 論理的思考を鍛える手法
- 論理的に考える習慣をつける
- 話が上手な人の真似をする
- 思考を書きだすようにする
- 伝えることに意識する
***
　以上が私なりの本公演のインプットである。現在私は新規プロジェクトの要件定義に携わっているが、ユーザーは、あれやりたいこんな機能もあったらいい、などたくさんの意見を出してくる（もちろん良い意味で）。そんな「やりたいファースト」の議論の中で、「やるべきファースト」で要件を見極めるために、論理的思考が重要なのだと感じた。また、私は将来的にはPM, PdM になりたいと思っており、そのためのスキルとして論理的思考がかなり重要なことも理解したので、今回得られたインプットをもとに論理的思考を鍛えていこうと思う。まずは1つ、話を聞くとき・伝えるときに論理的思考を意識する、ということをマストでおこなっていくことをここに宣言しておく。

## さいごに
　今年のデブストのテーマは、「Be a changer, Be a challenger」ということで、どの講演も私にとって刺激になったし変化・挑戦のきっかけになったと感じる。本カンファレンスでもらった刺激を燃料として私自身のエンジニアとしての歩み・挑戦・学びをブーストさせていこうと思う。
【Flutter】カレンダーの日付上限を設定する(CupertinoDatePicker)

こんにちは。
今回はCupertinoDatePickerの日付の上限を設定する方法を紹介します。

# 方法
![スクリーンショット 2023-08-13 20.18.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524120/ce57fee2-1687-ea40-8538-b4c8b9db94e0.png)

CupertinoDatePickerの日付の上限を設定するには、次の２つの引数を使います。
２つの引数に、上限にしたい日付を指定します。

:::note info
* minimumDate : 日付の過去の上限
* maximumDate : 日付の未来の上限
:::

# 使用例
```dart

class _MyHomePageState extends State<MyHomePage> {
  var _selectDate = DateTime.now();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: const Color(0xffFFFFFF),
      appBar: AppBar(
        title: const Text("CupertinoDatePicker"),
      ),
      body: Center(
        child: CupertinoDatePicker(
          mode: CupertinoDatePickerMode.date,
          initialDateTime: _selectDate,
          minimumDate: DateTime(DateTime.now().year - 1), //1年前まで
          maximumDate: DateTime(DateTime.now().year + 1), //1年後まで
          onDateTimeChanged: (newDate) {
            setState(() {
              _selectDate = newDate;
            });
          },
        ),
      ),
    );
  }
}

```

# 実行例
![calender_limit.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524120/893e94fb-4d78-2acf-5a0e-5684044f841a.gif)


# 最後に
ここまで読んでいただき、ありがとうございました！
いいねしてくれたら、スキップして喜びます:heartpulse:
選択したカーブを変数に基づいて複製する

このカーブ、欲しいけど自分で書くの面倒
って時に使えるコードを書かせようと思った副産物


```
import maya.cmds as cmds

# カーブを選択していない場合はエラーメッセージを表示
selected_curve = cmds.ls(selection=True)
if not selected_curve:
    cmds.error("カーブを選択してください。")

# 選択したカーブの名前を取得
curve_name = selected_curve[0]

# カーブ情報を取得するためのcurveInfoノードを作成
curve_info_node = cmds.createNode('curveInfo')
cmds.connectAttr(curve_name + ".worldSpace[0]", curve_info_node + ".inputCurve")

# 度数、コントロール頂点、ノットベクトルを格納する変数
degree = None
cvs = None
knots = None

# 度数を取得
if cmds.objExists(curve_name + ".degree"):
    degree = cmds.getAttr(curve_name + ".degree")
else:
    print("度数が存在しません。")

# コントロール頂点を取得
if cmds.objExists(curve_name + ".controlPoints[*]"):
    cvs = cmds.getAttr(curve_name + ".controlPoints[*]")
else:
    print("コントロール頂点が存在しません。")

# ノットベクトルを取得
if cmds.objExists(curve_info_node + '.knots[*]'):
    knots = cmds.getAttr(curve_info_node + '.knots[*]')
else:
    print("ノットベクトルが存在しません。")

# 新しいカーブを作成するために存在する属性を使用
if degree is not None and cvs is not None and knots is not None:
    new_curve = cmds.curve(d=degree, p=cvs, k=knots)
elif degree is not None and cvs is not None:
    new_curve = cmds.curve(d=degree, p=cvs)
elif degree is not None and knots is not None:
    # カーブの度数とノットベクトルがある場合は、適切な数のデフォルト頂点を作成する必要があります
    num_cvs = degree + len(knots) - 2 * degree - 1
    default_cvs = [(0, 0, 0)] * num_cvs
    new_curve = cmds.curve(d=degree, p=default_cvs, k=knots)
elif cvs is not None and knots is not None:
    # コントロール頂点とノットベクトルがある場合、デフォルトの度数を使用します
    default_degree = 3
    new_curve = cmds.curve(d=default_degree, p=cvs, k=knots)
else:
    cmds.error("カーブを複製するために必要な属性が不足しています。")

# 不要なノードを削除
cmds.delete(curve_info_node)

print("複製されたカーブの名前: ", new_curve)

```