OmniAICreator/Qiita-1.07M huggingface dataset:
ZIOAppを使った、独自Environmentの実装方法

Environmentが`Any`だったり、あまり複雑でなければ`ZIOAppDefault`を使えば良いですが、`AService & BService & CService` みたいに複雑になると、それを参照するのも手間だったりします。

デフォルトから異なるEnvironmentを使う場合、`ZIOApp`を継承して次のように実装できます。

```scala
import zio.*

object Main extends ZIOApp:
  override type Environment =
    AService & BService & CService & ... // 必要なサービスを列挙
  override val environmentTag: EnvironmentTag[Environment] =
    EnvironmentTag[Environment]
  override val bootstrap: RLayer[ZIOAppArgs, Environment] =
    AServiceImpl.layer ++ BServiceImpl.layer ++ CServiceImpl.layer ++ ... // サービス実装を列挙
  def run: RIO[Environment, Unit] =
    for _ <- MyService() // サービスを使った処理
    yield ()
```

# 参考

https://stackoverflow.com/a/73919987
screen Linux コマンドまとめ

## はじめに
深層学習モデルの学習や，データの前処理などでコマンドを実行して，長時間放置するような機会が増えたためターミナルやセッションの管理,バックグランドでの実行をしたいと思うようになりました．
`nohup`,`screen`,`tmux`など様々なコマンドがあるなかで，とりあえず１つマスターしようと思い`screen`コマンドから入りました．

参考：

https://qiita.com/umigamek/items/fa42f0f194bd5a13d5e3

本記事では原理や用語解説などは行わず，自信がよく使うもののみを紹介します．随時更新していきます．

## screen コマンドの使い方
```
sudo apt install screen
```
###  新しいセッションを作る
```shell
screen
```
### 名前付きで新しいセッションを作る
```
screen -S name
```

### セッションの一覧を確認する
```
screen -ls
```

### デタッチする
```
<ctrl> + <a>
d
```

### 再アタッチする
```
screen -r
```

### PIDを指定して再アタッチする
```
screen -r PID
```
### セッション名を指定して再アタッチする
```
screen -r name
```

### アタッチした状態でセッション名をつけ直す
```
<ctrl> + <a>
:sessionname name
```

### コピーモードに入る・スクロールを可能にする
```
<ctrl> + <a>
[
```
抜ける時は`esc`

### セッションを終了する

```:セッション内部
<ctrl> + <a>
k
```

```:セッション内部
<ctrl> + <a>
:quit
```

```:セッション外部
screen -S sessionname -X quit
```

### 実行したコマンドをscreenに付け替える
- `reptyr`コマンドのインストール
```
sudo apt install reptyr
```
- screenをアタッチする
- `reptyr`コマンドで付け替える
`ps aux | grep 実行ファイル`や`nvtop`, `htop`などで付け替えたいコマンドのPIDを調べる
子プロセスがある場合はTオプションをつける
```
sudo reptyr -T PID
```
ウェブ開発の未来図 2024：Refine.jsと共に未来を創造せよ！

テスト記事

ポストコロナ時代において、ウェブアプリケーションは私たちの生活に欠かせない存在となった。リモートワーク、オンライン教育、ネットバンキング、eコマース、デリバリーサービス… これら全てがウェブアプリケーションによって支えられている。もはやウェブアプリケーションなしでは、現代社会は成り立たないと言っても過言ではない。

この記事では、2024年のウェブ開発の現状と未来、そしてReactベースのメタフレームワークであるRefine.jsがいかにその進化を加速させているかを深く掘り下げていく。未来のウェブ開発を担う君にとって、必読の内容となっているぞ。

https://programming-sc.com/column/column1/

### ウェブアプリケーションとは何か？：その本質を再確認せよ

ウェブアプリケーションとは、インターネット上のリモートサーバーで動作し、HTTP/HTTPSプロトコルを使用してHTML、XML、JSONドキュメントを提供するアプリケーションだ。かつてはSOAPやWSDLといった技術が主流だったが、現在ではRESTful APIが広く普及している。RESTful APIは、シンプルで柔軟な設計により、現代のウェブアプリケーション開発を支える重要な基盤となっている。

### ウェブ開発を取り巻く技術：進化の波に乗り遅れるな！

ウェブアプリケーション開発には、様々な言語、スタック、フレームワークが使用されている。バックエンドではJavaScript、Python、Java、TypeScriptなどが人気だ。フロントエンドではReact、Angular、Vue.jsなどが主流となっている。さらに、Next.js、Remixといったメタフレームワークも台頭し、開発効率を飛躍的に向上させている。これらの技術を理解し、適切に選択することが、成功するウェブ開発の鍵となる。

### ウェブアプリケーション開発ライフサイクル：成功へのロードマップを手に入れろ！

ウェブアプリケーション開発は、要件定義、設計、開発、テスト、デプロイ、保守といった一連のステップで構成される。各ステップで適切な方法論を採用することで、開発プロセスを効率化し、高品質なアプリケーションを開発することができる。アジャイル開発、ウォーターフォールモデルなど、様々な方法論が存在するため、プロジェクトの特性に合わせて最適な方法論を選択することが重要だ。

https://dx-king.designone.jp/0048

### 開発における重要事項：ユーザー中心の設計で最高の体験を提供せよ！

ウェブアプリケーション開発において、開発速度と効率性、ユーザーエクスペリエンス、データ管理、セキュリティ、アクセシビリティ、国際化対応は非常に重要な要素だ。これらの要素をバランス良く考慮することで、ユーザーにとって真に価値のあるウェブアプリケーションを開発することができる。

* **開発速度と効率性：ライブラリとフレームワークを駆使せよ！**

既存のライブラリやフレームワークを積極的に活用することで、開発速度と効率性を劇的に向上させることができる。車輪の再発明は避けるべきだ。例えば、React Hook FormやYupといったライブラリは、フォーム処理を大幅に簡素化してくれる。

* **ユーザーエクスペリエンスとUIデザイン：最高の体験を追求せよ！**

ユーザーエクスペリエンスは、ウェブアプリケーションの成功を左右する最重要要素だ。ページのパフォーマンス、[レスポンシブデザイン](https://oh-ay.blog/vercel-vzero-guide/)、アニメーションなど、あらゆる側面からユーザーエクスペリエンスを最適化することで、ユーザー満足度を高めることができる。Material UI、Ant Design、Tailwind CSSといったUIフレームワークは、高品質なUIを構築するための強力なツールとなる。

* **効果的なデータ管理とAPI連携：データは宝だ！**

データは現代のウェブアプリケーションの生命線だ。React QueryやRTK Queryといったライブラリは、データフェッチングと状態管理を効率的に行うための強力な武器となる。また、Next.jsやRemixは、様々なバックエンドAPIとの連携を容易にする。

* **認証と認可：セキュリティは最重要課題だ！**

セキュリティはウェブアプリケーション開発において決して妥協できない要素だ。OTP、JWT、OAuth 2といった認証技術、そしてCasbinやCerbosといった認可ライブラリを適切に実装することで、強固なセキュリティを実現できる。

* **アクセシビリティと国際化：全ての人に最高の体験を！**

アクセシビリティと国際化対応は、より多くのユーザーにウェブアプリケーションを届けるために不可欠だ。WAI-ARIAガイドラインに準拠し、i18nライブラリを活用することで、全ての人が快適に利用できるウェブアプリケーションを開発できる。

https://oh-ay.blog/no-code-ai-app-million-dollar-business/

### オープンソースの力：コミュニティと共に未来を築け！

オープンソースライブラリは、ウェブ開発に革命をもたらした。活発なコミュニティによって支えられ、常に進化を続けている。オープンソースを活用することで、開発コストを削減し、より高品質なアプリケーションを開発することができる。

### Refine.js：データ駆動型アプリケーション開発の救世主

Refine.jsは、データ駆動型のエンタープライズアプリケーション開発に特化したReactベースのメタフレームワークだ。そのヘッドレスコアパッケージは、認証、認可、APIデータフェッチング、リアルタイム通信、ルーティング、国際化など、数々の機能を備えている。React Query、React Hook Form、Ant Design、Material UIなど、様々なライブラリとのシームレスな連携により、開発効率を飛躍的に向上させる。

Refine.jsは、まさにデータ駆動型アプリケーション開発の救世主と言える。その豊富な機能と柔軟性は、開発者に無限の可能性を提供する。

### 未来のウェブ開発を担う君へ：Refine.jsと共に未来を創造せよ！

この記事を通して、2024年のウェブ開発の現状と未来、そしてRefine.jsの可能性を感じてもらえただろうか？進化の波に乗り遅れるな！今すぐRefine.jsを試してみて、未来のウェブ開発を体験しよう！活発なコミュニティが君を待っている！

https://oh-ay.blog/
Watson Studio(CP4DaaS)へのログイン可能なIPアドレスを制限する場合の注意点

Watson Studioへのログイン可能なIPを制限する場合には、@1000akiさんの以下の記事の手順で制限することができます。

Cloud Pak for Data as a Service へログイン可能なIPアドレスを制御する #ibmcloud - Qiita 

https://qiita.com/1000aki/items/96cc3e3e51a0abce2f16


特に注意点する点が2点あります。

# 1. 「CP4DaaS製品が使用するIPアドレス範囲」をちゃんと指定する必要があります。

上記記事内にもあるように、「クラウド統合」の「ファイアウォール構成」で参照されるIPアドレスを許可アドレスに指定する必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/480cbd96-dffd-0fe7-3dcb-259e255cdcf4.png)

指定をしていないと「プロジェクトの作成時」に「"Unable to create a bucket for your project in the selected Cloud Object Storage instance. Please contact support for assistance, or try again later."」がでました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/41312783-180c-a1ae-ed99-87ac9e72f33d.png)

# 2. IPv4 over IPv6で接続している場合、許可するIPとしてIPv6も指定する必要があります。

IPv4の正しいIPアドレスを指定しているのに「このIPからのログインを許可されていない可能性があります」のエラーでログインできないことがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/8d2d0220-212f-67b7-85b9-4b35c4f9d120.png)

その場合はIPv4 over IPv6で接続しているのかもしれません。「ヒント：現在のIPはXXX.XXX.XXX.XXX」ではIPv4のアドレスしか表示されませんが、IPv6のIPも指定しないとログインができなくなってしまいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/6fcef5b4-18b3-301d-7dfa-7eebf2bc9ec1.png)

現在のIPv6は以下などで調べることができます。
https://test-ipv6.com/index.html.ja_JP

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/fdcdcd61-630e-bff6-6fc2-ea44e406af20.png)


# 参考
#### CP4DaasのWMLにアクセス可能なIPアドレスを制限する #ibmcloud - Qiita 
WMLのIP制限方法は以下で解説しています。

https://qiita.com/spssfun2017/items/313ca47b544964b953f8
Oracle Analytics Cloud：ワークブックのパフォーマンスが気になるときに、パフォーマンスにまつわるログをみる

はじめに
---
Data Visualizationでワークブックを作成しているときに、パフォーマンスが気になる、遅く感じるときがあります。いろいろ原因は考えられるのですが、ワークブック作成中は、データベースでの処理速度が遅いケースがよくあります。そんなときにOACからデータベースに対してどのようなSQL（物理SQL）を実行しているのかをチェックしてみます

パフォーマンス・ツールのサマリ
![g1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/2f78e7d6-b7c0-b0ec-a121-b9f243ca5455.jpeg)

パフォーマンス・ツールの実行ログ、SQL（物理SQL）
![g2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/15b4c410-72d1-90da-bd1f-93b654eabb04.jpeg)

前述画面は開発者オプションを利用して取得できます
開発者オプションについては以下記事を参考ください
[Oracle Analytics Cloud：実行時のパフォーマンスが気になったらココを見る](https://qiita.com/tyo38/items/0d87e32b2c7bd4d7a776)

記事記載時のOAC ver：Sep 2024 Update

前提
---
* データソースがデータベースであるデータセットもしくはサブジェクト領域が作成済み
* ワークブックが作成済み

開発者オプションをオンにする
---
パフォーマンスが気になるワークブックを開きます
右上部端のアカウントのアイコンをクリックします。アカウントメニューからプロファイルをクリックします。
![g3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/ef65faf9-e159-7bff-d28c-9d068288cbc4.jpeg)

左の"拡張"をクリックします。"開発者オプションの有効化"のツマミを右に移動して有効化します。保存をクリック、その後、閉じるをクリックします
![g4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/8db057bd-06a9-8ccb-d089-554735d1dc31.jpeg)

開発者メニューを利用する
---
ワークブックで、右上部、アカウントアイコンの下にワークブックメニュー"・・・（縦）"があります。クリックします。"開発者オプションの有効化"がされているとワークブック・メニューから開発者が表示されるようになりますので、クリックします。
![g5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/b132a4b2-b4fd-2ecf-b84d-6a83c80b2ec1.jpeg)

下部に開発者のウィンドウが表示されます。パフォーマンスにまつわるログが参照できます
![g6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/cb8611a9-fd71-cc26-7fac-8aa6e135fd43.jpeg)

パフォーマンスを取得する
---
"パフォーマンス・ツール"タブで、リフレッシュをクリックします
ワークブックに配置されているビジュアライゼーション（表、ピボット、グラフ）毎にパフォーマンスが取得されます。"サマリー"タブで、処理時間の内訳をみれます
![g7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/f895bc82-4afb-d05c-cab6-21e09053532a.jpeg)

処理時間については前述の以下記事を参考ください
[Oracle Analytics Cloud：実行時のパフォーマンスが気になったらココを見る](https://qiita.com/tyo38/items/0d87e32b2c7bd4d7a776)

"実行ログ"で、詳細のログをみれます
![g8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/f18c0aec-4cc1-0999-e36e-51ab40503dc1.jpeg)

データベースに対して発行しているSQLも"実行ログ"でみれます。
![g9.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/ab9ed6b3-1e82-2a0e-0709-cf67d7ff6a9e.jpeg)

実行ログで、"sending query to database"の文字列で検索すると、その次の行以下に発行されたSQLが出力されているのがみえます
![g10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/27672fc7-df41-fb58-abf4-0166360c645f.jpeg)

まとめ
---
ワークブックを作成しているときに、パフォーマンスが気になるときは、"開発者"機能を利用して、詳細が確認できます。データベースでの処理が遅いケースが多々ありますので、適宜、サマリーの画面イメージと、詳細ログ全て、もしくは、SQLがわかる場合はSQLをコピーして、データベース管理者と共有し、処理内容について解析、改善を実施します

以上
【AWS】小学生でもわかる！ELB(Elastic Load Balancer)を徹底解説【擬人化】

:::note warn
「AWSに親しみを持つエンジニアが1人でも増えてほしい」という思いを込めて、擬人化で説明してます。
「ちょっとノリが合わないな…」と思ったら、戻るボタンで回れ右してね :wink: 
:::


## 小学生でもわかるELBの概要

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401561/d55127d5-abcb-14e1-df73-52f93e596702.png" width="200">

ELBさんは、部下の面倒見がとても良い中間管理職なんだよ。

部下にはEC2やECS、Lambdaっていう働き者がたくさんいるんだけど、ELBさんはその子たちが元気に仕事しているか、ちゃんと見てあげる役目を持ってるんだ。(**ヘルスチェック**)

https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/target-group-health-checks.html

https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/network/target-group-health-checks.html


もし部下がちょっと調子悪いときがあったら、ELBさんはすぐに他の元気な部下に「この仕事、お願いね！」って指示して仕事が止まらないようにしてくれるんだよ。

さらにAuto Scalingさんと手を組めば、忙しいときは部下を増やして一人一人の負担が少なくなるようにすることもできるんだ！

部下の仕事の成果はELBさんのお名前を呼べばすぐに参照できるよ！


## 超混同しやすい！CLB, NLB, ALBの違いについて

3者の関係をざっくりと図で表すとこんな感じ

![スクリーンショット 2024-10-28 14.56.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401561/538936c6-ef1a-2147-ca8c-ac15c9a2a72c.png)


元々CLBという大きなお家に住んでいたけど、
自分の得意分野を伸ばしていこうということでALB, NLBという小さなグループにそれぞれ分かれたんだ。

### ALB(Application Load Balancer)

ALBさんは、とっても器用なんだ！

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401561/fd9842b9-2e8b-59d5-70eb-dd9f83e83cb5.png" width="50"> < EC2やECSだけじゃなくて、**Lambdaも部下にできるんだよ。**

ALBさんの仕事場は「**アプリケーション層**」っていう、ユーザーに一番近い場所なんだ。
たとえば、インターネットを使ってアプリやウェブサイトを見たりするとき、そのリクエストをしっかり受け止めて部下たちに渡してあげる役目をしているんだよ。

https://qiita.com/output_Tarou_dl/items/08d6d04c1cb4bf147ca9

アプリケーション層で働くから、ユーザーと話しているみたいに、色んな部下に「このリクエストお願いね！」って伝えやすいんだ。
ECS、EC2、Lambdaのいろんな子と連携できるのもこのためなんだよ！

急に忙しくなると対応が追いつかず、目が回ってしまうというちょっとナイーブな面もあるんだ。

色んな仕事場所で対応できるから「ノマドワーカー」って感じで、いろんなところで仕事をするのが得意なんだよ！(**動的IP**)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401561/306606aa-ff68-8f1d-b143-d1d0593023de.png" width="50"> < パフォーマンスを最大化するためにもハワイでリモートワークでもすっかな！


:::note info
**ALBの特徴**
- NLBより幅広いサービスと連携が可能
- 急なスパイクにはちょっと弱い
- [スケールアップの度にIPアドレスが変わる](https://aws.amazon.com/jp/blogs/news/application-load-balancer-aws-privatelink-static-ip-addresses-network-load-balancer/)
:::


### NLB(Network Load Balancer)


NLBさんは、仕事がすごくできるエリートなんだ！

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401561/fd7550ac-0ae5-27b7-f89a-f8117742b819.png" width="50"> < そんなお世辞言われても何も出ませんよ…///

NLBさんの仕事場は「**トランスポート層**」っていう、もう少し奥の方にある層なんだ。ここはちょうど道路みたいな場所で、情報を素早く運ぶためにとても大切な場所なんだよ。

https://qiita.com/yukitkns/items/208170b5eeff8d846cee

NLBさんはこのトランスポート層で、素早く、そして確実に大量のリクエストをさばくことが得意なんだ。(**レイテンシーを低く保ちながら、一秒間に何百万のリクエストを捌ける**)

どんなに急なリクエストが来ても、冷静に、しっかりとこなすエリートさんなんだよ。

しかも「**静的IPアドレス**」と言う自分専用のお部屋を持っていて、いつも同じ場所で慣れた環境で働いてるから、まるでエリート公務員のように頼りがいがあるんだ。

:::note info
**NLBの特徴**
- 低いレイテンシーで大量のリクエストを捌ける
- 突発的なアクセスにも強い
- 慣れた環境で安定して力を発揮できる！(静的IPアドレス)
:::

NLBさんとECSの連携例もあるから、よかったら見てみてね！👇

https://qiita.com/sugichaaaan/items/0a184a557928da0e3620

## あとがき

ず●だもんの声で脳内再生されちゃうのは気のせいだろうか・・・（吐血）
この記事が皆様のAWS学習の一助になれば幸いです。

## おすすめ記事

https://qiita.com/sugichaaaan/items/738867e4bc3a1a0077d9

https://qiita.com/sugichaaaan/items/3ff9830a24f6094e18b4
1歳児の子育てをしながら基本情報技術者試験に合格した話

# はじめに
2024年10月に基本情報技術者試験を受験し、無事合格することができました。(まだ正式な結果は出てないですが)
私は現在1歳児の父であり、ガッツリ勉強する時間を捻出できないのですが、若手の内に基本情報は取っておきたいと思い受験を決めました。
今回は勉強でやったことを備忘録として残しておきます。

# 筆者について
- 1歳児の父
- IT企業 ソフトウェア開発
- 情報系修士
- 社会人4年目

# 受験結果
- 科目A: 680点
- 科目B: 770点

:::note info
2024/11/15追記
正式に合格してました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1589041/5801c3e3-5f06-9b07-83d0-10ece05f678c.png)
:::




# 勉強方法
### 勉強スタイル
筆者は現在仕事以外の時間は育児に追われており、なかなかまとまって勉強する時間を用意できません。
そのため毎日1時間～多くて2時間程度の勉強をコツコツ続け、3～4カ月の長いスパンで勉強をしていくことに決めました。
最終的には約100時間の勉強時間となりました。

### 科目A
- キタミ式イラストIT塾 基本情報技術者 令和06年
まずは参考書としてキタミ式を1周してなんとなく全体の内容を把握しました。
1週で全部理解するのは無理なので、わからないところは読み飛ばしつつどんどん読んでいきました。
正直過去問を解いていって、分からないところや周辺分野の補足に使う程度でいいと思います。

https://amzn.asia/d/hBvAIan

- 基本情報技術者過去問道場
おなじみの過去問道場です。
令和5年免除～平成29年春期まで10回分の過去問をまずは1週し、間違えた問題にチェックをつけてもう一回解きなおしたりしてました。
さらに10回分をもう1週して大体7割後半～9割くらいとれるようになりました。

https://www.fe-siken.com/fekakomon.php

- 基本情報技術者試験（科目A・科目B）全問解説
iPhone向けのアプリです。
過去問道場と内容は一緒ですが、スキマ時間にスマホの方が解きやすいため補助的に活用していました。

https://apps.apple.com/jp/app/%E5%9F%BA%E6%9C%AC%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85%E8%A9%A6%E9%A8%93-%E7%A7%91%E7%9B%AEa-%E7%A7%91%E7%9B%AEb-%E5%85%A8%E5%95%8F%E8%A7%A3%E8%AA%AC/id1644966017?uo=4

### 科目B
- 情報処理教科書 出るとこだけ！基本情報技術者［科目B］第4版
科目Bのトレースのやり方はこの本で学びました。
テクニック等も載っていて、科目Bに手をつけたことがない方がまずやるにはぴったりだと思います。
ただ、トレースが冗長なので自分でカスタマイズしないと時間が足りなくなると思います。

https://amzn.asia/d/biolHQZ

- 令和06年 基本情報技術者 パーフェクトラーニング過去問題集
科目Bは参考になる過去問が少ないので、20問フル問題が4回分載っているこの本を買いました。
「出るとこだけ」で身に着けたトレースをこの本で実践していく感じです。
3週ほど解いて、明らかに難問以外は自力で解けるようにしました。
科目Aの問題も4回分収録されておりそちらもやりました。

https://amzn.asia/d/aAcDlNt

# 試験を終えて
昔から取ろう取ろうと思っていた基本情報でしたが、忙しいことを言い訳になかなか手が付けられませんでした。ですが、若手と呼ばれるうちに取っておきたかったので、重い腰を上げて受験することに決めました...
まとまった時間を取れなくても、コツコツやれば合格できるということで継続は力なりを実感しました。
10月からシラバスVer9.0となり、新たな用語の問題が割と出てきたため、科目Aの点はあまり伸びませんでした。

https://www.ipa.go.jp/shiken/syllabus/gaiyou.html

これから受験を検討される方は、新シラバスに対応した参考書やYouTubeの動画などを使って新用語を重点的に勉強しておくと良いかもしれません。
Next.js App Router で route handlers でappollo graphql を利用する

# Next.js App Router で route handlers でgraphql を利用する

## 背景

Page Routerを利用した記事やTutorialはあるが、
App Routerを利用した場合の方法がなく軽く実装してみようと考えたため。

## TL;DR

Page Routerと同じく、`apollo-server-integration-next`をinstallして利用すれば動きます。

[apollo-server-integration-next](https://github.com/apollo-server-integrations/apollo-server-integration-next)

## 0. 現状の想定しているdirectory

```terminal
% npx create-next-app@latest
```

上記で生成したdirectoryを想定しています。


## 1. apollo server で依存関係をinstallする

[apollo server get started](https://www.apollographql.com/docs/apollo-server/getting-started)に記載通りの手順で依存関係をinstallする。

```terminal
% npm install @apollo/server graphql
```

上記のみの場合だと、apollo serverからRoute Handlerの調整が必要になるため、[apollo-server-integration-next](https://github.com/apollo-server-integrations/apollo-server-integration-next)を追加でinstallします。

```terminal
% npm i @as-integrations/next
```

## 2. route handlerに記載する

api/graphqlをgraphqlようのpathにして作成していきます。

```terminal
% mkdir -r api/graphql
% touch api/graphql/route.ts
```

[apollo server get started](https://www.apollographql.com/docs/apollo-server/getting-started)の定義を追加していきます。

```api/graphql/rotue.ts
import { ApolloServer } from '@apollo/server'

// A schema is a collection of type definitions (hence "typeDefs")
// that together define the "shape" of queries that are executed against
// your data.
const typeDefs = `#graphql
  # Comments in GraphQL strings (such as this one) start with the hash (#) symbol.

  # This "Book" type defines the queryable fields for every book in our data source.
  type Book {
    title: String
    author: String
  }

  # The "Query" type is special: it lists all of the available queries that
  # clients can execute, along with the return type for each. In this
  # case, the "books" query returns an array of zero or more Books (defined above).
  type Query {
    books: [Book]
  }
`

const books = [
  {
    title: 'The Awakening',
    author: 'Kate Chopin',
  },
  {
    title: 'City of Glass',
    author: 'Paul Auster',
  },
]

const resolvers = {
  Query: {
    books: () => books,
  },
}

const server = new ApolloServer({
  typeDefs,
  resolvers,
})
```

[apollo-server-integrations/apollo-server-integration-next](https://github.com/apollo-server-integrations/apollo-server-integration-next)の通りに、handlerを定義する。

```api/graphql/rotue.ts
import { ApolloServer } from '@apollo/server'
import { startServerAndCreateNextHandler } from '@as-integrations/next' // 追記

// 省略

const handler = startServerAndCreateNextHandler(server)

export { handler as GET, handler as POST } // 追記
```

## 3. apollo server にアクセスしてQueryを利用する

[localhost](http://localhost:3000/api/graphql)に接続して、Queryを試してみる。

![スクリーンショット 2024-10-28 14.53.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144543/40478862-85f4-9c22-818c-f10be73e5ded.png)
ケースの活動について

### ケースには活動が表示されない場合がある

普通は以下のように表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894299/ee1070ca-dac7-74f2-9f09-6b40f30264e1.png)

しかし、ケースは特殊で、フィード追跡が有効の場合は、活動が表示れない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894299/c7c8234a-e015-5d0a-35f5-356103817856.png)

「活動コンポーネント」を追加しても表示されない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894299/179a1bde-02b8-ac33-c754-a3bc841c80fd.png)

## 表示される方法
1. ケースのフィード追跡を無効化
2. ページレイアウトで新規Todoボタン追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894299/4c40c969-f94c-c07c-8b9f-6730bfb55b98.png)


## HelpSite記事
[Lightning Experience のアクション](https://help.salesforce.com/s/articleView?id=sf.actions_in_lex.htm&type=5)
>ケースまたは作業指示でフィード追跡が有効になっている場合、それらのレコードのページレベルのアクションメニューにはカスタムボタンとサポートされる標準ボタンのみが含まれます。
postgresql_scriptの返り値の注意点

## はじめに
OracleとPostgresで同じ挙動をするコードを書いていたのですが、返り値の違いに戸惑ったので、記録用に残しておきます。

## この記事の要約

ansibleのpostgresql_scriptモジュールにおいて、query_resultは、複数のSQL文を実行した場合、最後の文の実行結果だけ出力されます。

query_resultを利用した処理を書きたい場合は、注意が必要です！

https://docs.ansible.com/ansible/latest/collections/community/postgresql/postgresql_script_module.html#return-values

## コード概要

Oracleコード
```ansible:oracle
 # DBの状態を確認
- name: Check result of check-db.sql
  command: sqlplus -S USER/PASS@SAMPLEDB @{{ TEMP_SQL_FOLDER }}/{{ CHECK_SQL_FILENAME }}
  register: check_result

  # 特定の条件に合ったときだけDBを更新
- name: UPDATE DB
  command: "sqlplus {{ USER }}/{{ PASS }}@SAMPLEDB @{{ TEMP_SQL_FOLDER }}/{{ UPDATE_SQL_FILENAME }}
  when: "check_result.stdout is search('NEED TO CHANGE') and check_result.stdout is search('NEED TO FIX')"
```

```ansible:postgres
 # DBの状態を確認
- name: Check result of check-db.sql
  community.postgresql.postgresql_script:
    db: SAMPLEDB
    login_host: "{{ hostvars[groups['AuroraCluster'][0]].endpoint }}"
    login_user: "{{ USER }}"
    login_password: "{{ PASS }}"
    path: "{{ TEMP_SMTP_SQL_FOLDER }}/{{ CHECK_SQL_FILENAME }}"
    encoding: UTF-8
  register: check_result

  # 特定の条件に合ったときだけDBを更新
- name: UPDATE DB
　community.postgresql.postgresql_script:
　　db: SAMPLEDB
　　login_host: "{{ hostvars[groups['AuroraCluster'][0]].endpoint }}"
　　login_user: "{{ USER }}"
　　login_password: "{{ PASS }}"
　　path: "{{ TEMP_SMTP_SQL_FOLDER }}/{{ UPDATE_SQL_FILENAME }}"
　　encoding: UTF-8
  when: "check_result.query_result is search('NEED TO CHANGE') and check_result.query_result is search('NEED TO FIX')"
```
SQLが複数行の場合、postgresの方のコードでは、query_resultに1つのSQL文の実行結果しか格納されていなくて悩みました。

## 原因

原因は、ansibleのpostgresql_scriptモジュールにおいて、query_resultは、複数のSQL文を実行した場合、最後の文の実行結果しか出力されないことでした。

sqlplusのstdoutは複数のSQL文の実行結果もすべて出力されるので、その違いに悩みましたが、無事解決できてよかったです。

> **query_result** 
> list / elements=dictionary
>
> List of dictionaries in the column:value form representing returned rows.
>
> **When there are several statements in the script, returns result of the last statement.** 

https://docs.ansible.com/ansible/latest/collections/community/postgresql/postgresql_script_module.html#return-values

対処として、1つのSQLファイルに1つのSQL文を入れるようにしました！

## 終わりに

同じようなことに悩んでいる方の解決に役立ったら幸いです:blush:
FFmpegで png 画像から mp4 動画を作成

## FFmpeg とは？
[FFmpeg](https://ffmpeg.org/) は、マルチメディアデータの処理に特化したオープンソースのソフトウェアフレームワークで、音声、動画、画像などの変換、編集、ストリーミング、エンコーディングなど、さまざまな機能を提供されています。編集をガチしないでいい人には、簡単に動画がつくれていいと思います。

FFmpeg は多くのコーデックとフォーマットに対応しており、例えば MP4 や MKV といった動画形式の変換、MP3 や AAC などの音声形式の変換が可能です。さらに、解像度の変更、音量の調整、字幕の追加など、映像編集やエフェクト適用もコマンドラインから行えます。

FFmpeg を使用して、複数の png 画像から mp4 動画を作る機会があったので、PowerShellスクリプトを残しておきます。

## PowerShell スクリプト
```powershell:imgs2mov.ps1
# ディレクトリのパスを指定
$directoryImage = "D:\PowerShell\img\*.png"
$directoryMovie = "D:\PowerShell\mov\"

# ディレクトリ内の png ファイルを取得し、変数に代入
$directoryItems = Get-ChildItem -Path $directoryImage | Sort-Object Name

# 画像ファイルから動画を作成
$outputList = @()
foreach ($file in $directoryItems) {
    $mp4filename = $file.BaseName + ".mp4"
    $output = $directoryMovie + $mp4filename
    $outputList += $output
    $fullpath = $file.FullName
    ffmpeg.exe -framerate 5 -i $fullpath -vcodec libx264 -pix_fmt yuv420p -crf 20 -r 30 $output -y
}

# ffmpegで指定する動画リストを作成
$mp4ListupFile = $directoryMovie + "list.txt"
$outputList | ForEach-Object {"file '$_'"} | Out-File -FilePath $mp4ListupFile -Encoding ascii

# 個々の動画をつなげて１つの動画にする
$output = $directoryMovie + "output.mp4"
ffmpeg.exe -f concat -safe 0 -i $mp4ListupFile -c copy $output -y
```
:::note info
`-framerate` オプションの値を変更することで、画像あたりの動画の長さを変更できます。
:::
| framerate | 動画の長さ |
|:-:|:-:|
| 10  | 0.1s  |
|  5 |  0.2s |
|  2 |  0.5s |
|  1 |  1.0s |
| 0.5 |  2.0s |
| 0.25 |  4.0s |
| 0.2 |  5.0s |
| 0.1 |  10.0s |

## 動画作成例
スマホのスクリーンショットから作成したデモ動画です。（200万～800万）

![output800.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3853334/ecaca2c3-8141-3355-2181-a6904552c42a.gif)

## さいごに
今回は、単純に動画をつなげましたが、ffmpeg には、フェードイン・フェードアウトといったように動画間にエフェクトを付けることができます。やり方はまた投稿しようと思います。

Xfade – FFmpeg
https://trac.ffmpeg.org/wiki/Xfade
【2024年10月最新】Next.jsにおけるおすすめライブラリ

# はじめに

みなさん、こんにちは。Happiness Chainメンターのryoです。

転職のためにNext.jsで自作アプリを作ろうと考えている皆さん。

Next.jsの自作アプリを作るだけで高い評価を得られますが、どのライブラリを選ぶかも重要なポイントです。

今回は、Next.jsでのおすすめライブラリを機能別にご紹介します。

# CSS関連のライブラリ: shadcn-ui

理由は以下の通りです。

- パフォーマンスの向上 
    Next.jsはCSS-in-JSからの脱却を目指しています。
    その理由としてCSS-in-JSがクライアントサイドで動的にスタイリングしており、事前にビルドされたCSSの方が効率的であるためです。
    そのため、styled-componentsやmui、chakra-uiなどのCSS-in-JSのみ対応のライブラリは選択肢として除外されます。（MUIなどは、CSS-in-JS以外の方法をサポートする動きがあります）
    <br />

- Tailwind CSSの推奨
    Next.jsはTailwind CSSを推奨しているため、Tailwind CSSをサポートするライブラリを選ぶのが良いです。

上記二つを考慮すると、nextuiやheadlessui等がありますが、GitHubのstar数や拡張性の高さで、shadcn-uiが特におすすめです。

https://ui.shadcn.com/

# フォーム関連のライブラリ
### Server Actionを利用する場合: conform
### Server Actionを利用しない場合: react-hook-form

どちらのライブラリも入力変更時のパフォーマンスを改善し、複雑なバリデーションを簡単に実装できます。フォームの実装にはぜひ導入してみてください。

https://ja.conform.guide/integration/nextjs

https://www.react-hook-form.com/

# バリデーションライブラリ: zod

「yupとzod、どちらが良いの？」という議論がありますが、機能的には大差ありません。
その上で、GitHubのスター数が多く、僕自身zodを使用している現場が多い印象ですので、zodがおすすめです。

https://zod.dev/

# グローバルステート管理のライブラリ
### 少ないstateの管理: useContext
### 多くのstateの管理: zustand

管理するstateが少ない場合はuseContextで十分ですが、多い場合は軽量なzustandが適しています。zustandはコード量を抑えながらグローバルステート管理ができ、スター数もReduxやRecoilよりも増加しています。

https://ja.react.dev/reference/react/useContext

https://zustand-demo.pmnd.rs/

# ORMライブラリ: Prisma

Next.jsでAPIを開発しない方にもおすすめのライブラリです。Prisma Clientを活用することで、既存のデータベースからデータを取得し、スキーマファイルを自動生成できます。また、zodやyupと組み合わせることで、各テーブルの型を自動生成できるため、シンプルなAPIからデータを取得する際に生成された型をそのまま使用することができます。

https://www.prisma.io/

# 最後に

いかがだったでしょうか？
これらのライブラリを活用することで、モダンな企業の採用担当者の目に留まりやすくなります。
採用面接では、なぜそのライブラリを選んだのかを聞かれることもありますので、上記の理由をお答えできればバッチリです。ぜひ参考にしてみてください！
jupyter notebookでhuggingfaceのload_datasetが終わらない

# 概要
huggingfaceからのdatasets.load_datasetが終わらなかったときのメモです。

# 環境
- jupyter notebook（Cursor上で実行）
- macOS M1
- uvで作成した仮想環境
  - python 3.11.2
  - datasets 3.0.2
  - ipykernel 6.29.5
# 課題

以下のコードをjupyter notebook上で実行しました。

```
from datasets import load_dataset

# livedoor-news-corpus データセットをロード
dataset = load_dataset("shunk031/livedoor-news-corpus", split='train')
```

以下のwarningが出た以降20分待ってもセルの実行が完了しませんでした。

```
/***/.venv/lib/python3.11/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html
  from .autonotebook import tqdm as notebook_tqdm
```

livedoorコーパス（件数8000件くらい）なので、ネットワーク環境によりますが、あまり時間がかかるものではないと思います。
warningは進捗の表示に関することなので、遅延には直接的には関係ないように思われます。

# 解決方法（？）
なんとなくnotebookで実行していることが悪さをしているような気がしたので、.pyのスクリプトを作ってターミナル上で実行してみました。

```python:test.py
from datasets import load_dataset

# livedoor-news-corpus データセットをロード
dataset = load_dataset("shunk031/livedoor-news-corpus", split='train')
```

実行したところ、custom codeを実行するかどうかを聞かれました。yesと回答したところ、数秒で処理が完了しました。

```
% uv run test.py 
The repository for shunk031/livedoor-news-corpus contains custom code which must be executed to correctly load the dataset. You can inspect the repository content at https://hf.co/datasets/shunk031/livedoor-news-corpus.
You can avoid this prompt in future by passing the argument `trust_remote_code=True`.

Do you wish to run the custom code? [y/N] y
Downloading data: 31.6MB [00:00, 63.6MB/s]                                                                        
Generating train split: 5894 examples [00:00, 11998.65 examples/s]
Generating validation split: 737 examples [00:00, 11827.01 examples/s]
Generating test split: 736 examples [00:00, 11270.15 examples/s]
```

完了後、notebook上で再度試すと今度はダウンロードに成功しました。

# 考察
test.py実行時の出力から考えると以下のような気がします。
- ダウンロードしようとしていたデータセットがカスタムコードの実行を要求するものだったので、ユーザ側で許可を与える必要があった。
- notebook側の表示の不具合で、対話的な入力ができなくなり、永遠に待機していた。
- ターミナルでスクリプトから一度実行すると、キャッシュが残るので、notebookからも実行できるようになった。

今回は状況を再現させることがすぐにはできなくなったのでこれ以上の追求はできませんが、今後同じ事象に遭遇したときにやれることとしては以下があると思います。
- パッケージが対話的な入力を要求しているがnotebook上でそれが正しく表示されない不具合があるかも
- custom code関連であれば、warningで出ていたtrust_remote_code=Trueを指定することで解決できるかも
プロセス名を指定してキルする

C#でプロセス名を指定してキルするコードをChatGPTに作成してもらいました。

:::note warn
AI生成によるコードです。
:::

```c#
using System;
using System.Diagnostics;

namespace KillProcess
{
    class Program
    {
        static void Main(string[] args)
        {
            // 終了させたいプロセス名を指定（拡張子不要、例えば "notepad"）
            string processName = "プロセス名をここに入力";

            try
            {
                // 指定した名前のプロセスをすべて取得
                Process[] processes = Process.GetProcessesByName(processName);

                if (processes.Length == 0)
                {
                    Console.WriteLine($"{processName} は見つかりませんでした。");
                }
                else
                {
                    // 各プロセスをキルする
                    foreach (Process process in processes)
                    {
                        process.Kill();
                        process.WaitForExit(); // プロセスが完全に終了するまで待機
                        Console.WriteLine($"プロセス {process.ProcessName} (PID: {process.Id}) を終了しました。");
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("エラーが発生しました: " + ex.Message);
            }
        }
    }
}

```
【Androidアプリ開発】Hilt Unable to instantiate activity 解決策


<!--

## 技術記事のタイトル

最も伝えたいこと。
簡潔かつ分かりやすく過不足ないタイトルを考えましょう。

### 【 】(墨付き括弧)

- 【言語やサービス】
    - 例1.【Python】すぐにpytestで単体テストを実行するまでの手順
- 【言いたいこと】
    - 例1.【必見】Objectはどこに消えた？
- 【前提】
    - 例1.【個人開発】○○を○○できるサービスをリリースしました
    - 例2.【初心者向け】Reactとはそもそも何なのか説明します
- 【続き物の番号】
    - 例1.【2024年版】新入社員向け研修資料を公開します
    - 例2.【環境構築編】Windows11でPythonを実行するまで

【前提】詳しいタイトル【言語やサービス】のように、複数を併用するパターンもあります。

-->

## はじめに
<!--
何についての記事なのか、誰に向けた記事なのかを簡単に説明しましょう。
-->


<!--
読んだら何がわかるようになるのか、何ができるようになるのかを書きましょう。
-->

DIをやりたかったのでHiltを使うことにしました。

gradleとか設定してビルトできた。

が、、

アプリ開くと

Unable to instantiate activity ComponentInfo{省略}: java.lang.ClassCastException: 
アプリ cannot be cast to android.app.Activity

時間かかりました。



## 解決策
<!--
章全体の要約や、何について書くのかをここに書きます。
記事が長い時や資料として作るときは番号を振ることをおすすめします。
章を増やすときは章から項までをコピーしてください。
-->




### activiryのandroid:nameにhiltのアプリケーションを入れてしまっていた
<!--
記事の主要な部分です。ここに思い思いの内容を書いていってください。

画像やGIFがあると分かりやすいです。
画像があるとUIが変わったとしても読者がアタリをつけて対応しやすくなります。

コードを記載する場合は必ずコードブロックを使いましょう。
バッククオート3つで囲んでください。
```python:表示名

    print('Hello World')
    
```
-->
```
  <application
      //ここが正解
      android:name=".AwesomeApp">
        <activity
        //ここのnameにApp入れていた
            android:name=".MainActivity"
```



#### 似てるやん
<!--
より詳細な内容を書いたり、事例を挙げたりするときに使います。
- 節の内容の列挙
- 節の補足事項
- 例外
-->
まさかすごいケアレスミス
サイトの説明に沿ってミスらないようにしよう笑


## 参考資料
<!--

https://qiita.com

[リンク1](https://qiita.com)
-->

https://zenn.dev/okuzawats/books/android-dependency-injection/viewer/dependency-injection-with-hilt

[リンク1](https://zenn.dev/okuzawats/books/android-dependency-injection/viewer/dependency-injection-with-hilt)
pythonで配列を使うときは`deepcopy`を使うよりスライスを使った方が速い備忘メモ

pythonで配列を使うときは`deepcopy`を使うよりスライスを使った方が速い

- deepcopyを使う（遅い）

```python
array2 = copy.deepcopy(array)
```

- スライスを使った方が速い

```python
array2  = array[:]
```

# 参照

https://qiita.com/shoji9x9/items/e7d19bd6f54e960f46be#list%E3%81%AE%E3%82%B3%E3%83%94%E3%83%BC%E3%81%ABcopydeepcopy%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F%E3%82%B9%E3%83%A9%E3%82%A4%E3%82%B9%E3%82%92%E4%BD%BF%E3%81%86
React開発中のts(1261)エラー解決法: ファイル名変更時の対処法

### はじめに
Reactを使った開発中、ファイル名を変更した後に「ts(1261)」エラーが発生することがあります。このエラーは、Visual Studio Code（VSCode）のキャッシュが原因で発生しやすく、特に大文字・小文字を変更した際に現れることが多いです。本記事では、ファイル名変更時に発生するts(1261)エラーの原因と、その解決方法について解説します。

### ts(1261)エラーの発生状況
**ts(1261)エラー**は、ファイル名の変更、特に大文字・小文字の違いが原因で発生します。たとえば、`Child.jsx`を`child.jsx`という異なるファイル名に変更すると、VSCodeがキャッシュしている情報と異なるため、インポートエラーが発生します。

具体的な発生状況：
1. **ファイル名の大文字・小文字の不一致**  
   `Child.jsx`というファイルを`import child from './child'`とインポートした際に、VSCodeがキャッシュしている旧ファイル名と異なりエラーが発生することがあります。
2. **ファイルシステム依存のケースセンシティブの問題**  
   特にMacやLinuxのファイルシステムは、ファイル名の大文字・小文字を区別するため、これがエラーの原因になる場合があります。

### 解決方法
ファイル名を変更した後にts(1261)エラーが発生した場合、VSCodeの再起動が有効です。

#### VSCodeの再起動
VSCodeを再起動することで、キャッシュがクリアされ、変更されたファイル名が正しく読み込まれることが多いです。
- **Macの場合**：`Command + Q`で終了し、再度起動します。
- **Windowsの場合**：`Alt + F4`で終了し、再度起動します。

### 再発防止のためのポイント
- **ファイル名は正確に入力する**  
  特に大文字・小文字の違いがエラーの原因となるため、ファイル名は常に正確に記述します。
- **インポートの自動補完を利用する**  
  VSCodeの自動補完機能を活用して、ファイル名を正しくインポートするとエラーが減ります。

### まとめ
ファイル名変更時に発生するts(1261)エラーは、VSCodeの再起動で解決できる場合が多いです。ファイル名の変更を行った際には、インポート文やキャッシュに注意し、これらの対処法を試してエラーを解消しましょう。
EC2サーバーへのアクセスログを調べる

# 概要
EC2サーバーへログインするとどのようなログが記録されるのかを整理する。
# 前提
- EC2インスタンスをパブリックサブネットで起動
- セキュリティグループで、22番ポートのインバウンドを許可
- OS: Amazon Linux 2023
- OpenSSH_8.7p1, OpenSSL 3.0.8 7 Feb 2023
    - キーペア設定

# SSH
## ログ
```
$ sudo journalctl -u sshd
```
### EC2 Instance Coreで接続した場合
18.237.140.165(EC2 Instance Coreのエンドポイント)からアクセスに成功していることが分かる。
```
Oct 28 03:17:51 ip-10-0-0-214.us-west-2.compute.internal ec2-instance-connect[2691]: Querying EC2 Instance Connect keys for matching fingerprint: SHA256:<hash>
Oct 28 03:17:51 ip-10-0-0-214.us-west-2.compute.internal ec2-instance-connect[2719]: Providing ssh key from EC2 Instance Connect with fingerprint: SHA256:<hash>, request-id: <uuid>, for IAM principal: arn:aws:iam::<AWSアカウントID>:user/<IAMユーザ名>
Oct 28 03:17:52 ip-10-0-0-214.us-west-2.compute.internal ec2-instance-connect[2856]: Querying EC2 Instance Connect keys for matching fingerprint: SHA256:<hash>
Oct 28 03:17:52 ip-10-0-0-214.us-west-2.compute.internal ec2-instance-connect[2884]: Providing ssh key from EC2 Instance Connect with fingerprint: SHA256:<hash>, request-id: <uuid>, for IAM principal: arn:aws:iam::<AWSアカウントID>:user/<IAMユーザ名>
Oct 28 03:17:53 ip-10-0-0-214.us-west-2.compute.internal sshd[2562]: Accepted publickey for ec2-user from 18.237.140.165 port 45002 ssh2: ED25519 SHA256:<hash>
Oct 28 03:17:53 ip-10-0-0-214.us-west-2.compute.internal sshd[2562]: pam_unix(sshd:session): session opened for user ec2-user(uid=1000) by (uid=0)
```
### SSHでログイン成功した場合（公開鍵認証）
```
Oct 28 03:51:33 ip-10-0-0-214.us-west-2.compute.internal sshd[4877]: Accepted publickey for ec2-user from <接続元IP> port 63523 ssh2: RSA SHA256:<hash>
Oct 28 03:51:33 ip-10-0-0-214.us-west-2.compute.internal sshd[4877]: pam_unix(sshd:session): session opened for user ec2-user(uid=1000) by (uid=0)
```
### SSHでログイン失敗した場合
-iに指定した秘密鍵(pem)が異なる場合
```
Oct 28 03:54:43 ip-10-0-0-214.us-west-2.compute.internal sshd[5038]: Connection closed by authenticating user ec2-user <接続元IP> port 63617 [preauth]`
```
※ 不正アクセス攻撃のリクエストだと、もう少し色んなパターンがあります。

## lastコマンド
ログイン履歴を表示
```
$ last
```
- 1行目：SSHでログイン。03:51にログイン。2分後の03:54にログアウト
- 2行目：EC2 Instance Coreでログイン。03:40にログインし、現在もログイン中
- 3行目：EC2 Instance Coreでログイン。03:17にログインし、22分後の03:40にログアウト
- 4行目：再起動ログ。カーネルバージョンは6.1.112-122.189。03:08に起動して、現在も起動中。
```
ec2-user pts/4        xx.xx.xx.xx     Mon Oct 28 03:51 - 03:54  (00:02)
ec2-user pts/0        18.237.140.165   Mon Oct 28 03:40   still logged in
ec2-user pts/0        18.237.140.165   Mon Oct 28 03:17 - 03:40  (00:22)
reboot   system boot  6.1.112-122.189. Mon Oct 28 03:08   still running
```
※ セッションマネージャーで入ったものは出ないようなので、SSMのコンソール画面から履歴見るしかなさそうです。
# おまけ
## 設定ファイル
```
$ sudo vi /etc/ssh/sshd_config
```
sshd_configの中身は以下の通り。
```config
Include /etc/ssh/sshd_config.d/*.conf
AuthorizedKeysFile      .ssh/authorized_keys
PasswordAuthentication no
PermitEmptyPasswords no
Subsystem       sftp    /usr/libexec/openssh/sftp-server
AuthorizedKeysCommand /opt/aws/bin/eic_run_authorized_keys %u %f
AuthorizedKeysCommandUser ec2-instance-connect
```
Apple Payに銀行口座を追加する方法

この記事では、Apple Payに銀行口座をリンクする手順を説明し、その利点を強調し、よくある問題や手数料についても解説します。デジタルウォレットを強化したい場合、銀行口座をApple Payに追加する方法を理解することは、スムーズな支払い体験のために不可欠です。

Apple Payに銀行口座をリンクする理由
銀行口座をApple Payにリンクすることで、全体的な支払い体験を向上させるさまざまな利点が得られます。

主な利点の一つは、取引のための資金にシームレスにアクセスできることです。銀行口座をリンクすると、物理的なクレジットカードやデビットカードを使わずに、直接残高から購入できるため、支払いプロセスが簡素化され、資金の追加や引き出しも簡単になります。

さらに、銀行口座をApple Payにリンクすることで、セキュリティと利便性が向上します。Face IDやTouch IDの第一段階の認証により、あなた以外の誰かがApple Payのカードにアクセスするのは非常に困難です。

一部のアプリでは、オンライン取引を完了するために、Face IDを使用して二重チェックを要求する場合もあります。これに加え、暗号化とトークン化の仕組みが、クレジットカード詐欺や不正請求のリスクを軽減します。

さらに、Apple Payに銀行口座をリンクすることで、Apple Cash残高に簡単に資金を追加でき、Apple Payでの購入に使用することができます。この柔軟性により、常に取引のための資金が確保され、全体的な支払い体験が向上します。
[GoCuCo](https://gocuco.com)
興味があるかもしれません: Apple Cash vs Apple Payの主な違い
Apple Payに銀行口座を追加する手順
以下は、銀行口座を簡単にApple Payにリンクするための具体的な手順です。

手順1: 互換性の確認
始める前に、AppleデバイスがApple Payに対応していることを確認してください。Apple Payは、iPhone 6以降のモデル、iPad Air 2以降のモデル、Apple Watchでサポートされています。また、最適な体験を得るために、最新バージョンのiOSまたはwatchOSを使用する必要があります。

現在、この機能にはアメリカ拠点の銀行口座のみが対応しており、銀行によってはリンクが完了する前に追加の確認手順を要求することがあります。

手順2: Walletアプリに移動
iPhoneやiPadでWalletアプリを見つけて開きます。このアプリには、クレジットカードやデビットカード、Apple Cashなどのすべての支払い方法が保存されています。

新しい支払い方法を追加するには、Walletアプリの右上にある「＋」アイコンをタップします。

手順3: Walletに追加
「＋」アイコンをタップすると、クレジットカードまたはデビットカード、または銀行口座を追加するオプションが表示されます。「銀行口座を追加」を選択してください。

銀行口座情報を入力するように求められます。これには、銀行名、口座番号、およびルーティング番号が含まれる場合があります。

手順4: 銀行口座の確認
銀行口座情報を入力した後、Apple Payは口座の確認を要求する場合があります。これは、登録された電話番号または銀行口座に関連付けられたメールアドレスに確認コードを送信することが含まれます。

その後、メッセージまたはメールで確認コードを確認し、指示に従って入力して銀行口座を確認します。

手順5: プロセスの完了
銀行口座を確認し、Apple Cashのセットアップが完了した後、銀行口座がApple Payに正常に追加されたことを確認する通知が届きます。これで、この口座を使用してApple Pay取引の資金を調達したり、Apple Cashに資金を追加したりできるようになります。

上記の手順はiPhoneおよびiPad用です。Apple Watchにカードを追加する方法を探している場合は、Apple WatchのWalletアプリを開きます。その後、その他のオプションボタンをタップし、「カードを追加」を選択します。

提供されるオプションから、Appleアカウント、デビットカードやクレジットカード、または交通系ICカードを追加するかどうかを選択します。画面の指示に従ってプロセスを完了してください。
野球の審判（力試し編） (paizaランク C 相当)

https://paiza.jp/works/mondai/c_rank_skillcheck_archive/umpire_01

### 考え方
Pythonはswitch文がないとのことで、辞書を使用しています。
アウトかフォアボールが成立した時点でループを抜けたほうがいいかもしれません。

```python3
s=[input() for _ in range(n)]
c={"ball":0, "strike":0}
for i in s:
    c[i] += 1
    if c["strike"] == 3:
        print("out!")
    elif c["ball"] == 4:
        print("fourball!")
    else:
        print(i+"!")
```
Roadmap.shで学ぶFlutter - Advanced Dart - [Core Libraries④:convert]

# 導入
[roadmap.shのFlutter](https://roadmap.sh/flutter)のCore Librariesの4本目はdart:convertです。
これはJSON形式の変換やUTF-8の変換などに利用されるライブラリです。

https://dart.dev/libraries/dart-convert

# dart:convert
`dart:convert`ライブラリは、JSONやUTF-8の変換機能を提供しており、さらに追加のコンバータを作成するための機能も有しています。

このライブラリを使用するには、`dart：math`と同様に、`dart:convert`をインポートが必要になります。

```dart
import 'dart:convert';
```

## JSONのデコードとエンコード

`jsonDecode()`を使って、JSON形式の文字列をDartオブジェクトにデコードできます。

```dart
// JSON文字列内ではダブルクォート（"）を使用し、シングルクォート（'）は使用してはいけません。
// また、この文字列はJSON形式であり、Dartオブジェクトではありません。
var jsonString = '''
  [
    {"score": 40},
    {"score": 80}
  ]
''';

// JSON文字列をDartオブジェクトに変換します。
var scores = jsonDecode(jsonString);
assert(scores is List); // List型になったことの確認

var firstScore = scores[0];
assert(firstScore is Map);
assert(firstScore['score'] == 40);
```

逆に`jsonEncode()`を使うことで、DartオブジェクトをJSON形式の文字列にエンコードできます。

```dart
var scores = [
  {'score': 40},
  {'score': 80},
  {'score': 100, 'overtime': true, 'special_guest': null}
];

var jsonText = jsonEncode(scores);
assert(jsonText ==
    '[{"score":40},{"score":80},'
        '{"score":100,"overtime":true,'
        '"special_guest":null}]');
```

直接JSONにエンコードできるのは、以下の型になります。
- `int`
- `double`
- `String`
- `bool`
- `null`
- `List`
- `Map`（文字列キーを持つもの）

この中でも、`List`や`Map`オブジェクトは再帰的にエンコードされます。
つまり`List`や`Map`の中身も同時にエンコードされることになります。

### 直接エンコードできないオブジェクトをエンコードする方法

以下の2通りがあります。
1. `jsonEncode()`に2つ目の引数として、直接エンコード可能なオブジェクトを返す関数を渡す。
2. 2つ目の引数を省略することで、エンコーダがオブジェクトの`toJson()`メソッドを呼び出す。

## UTF-8文字のデコードとエンコード

`utf8.decode()`を使って、UTF-8エンコードされたバイト列をDartの文字列にデコードできます。

```dart
List<int> utf8Bytes = [
  0xc3, 0x8e, 0xc3, 0xb1, 0xc5, 0xa3, 0xc3, 0xa9,
  0x72, 0xc3, 0xb1, 0xc3, 0xa5, 0xc5, 0xa3, 0xc3,
  0xae, 0xc3, 0xb6, 0xc3, 0xb1, 0xc3, 0xa5, 0xc4,
  0xbc, 0xc3, 0xae, 0xc5, 0xbe, 0xc3, 0xa5, 0xc5,
  0xa3, 0xc3, 0xae, 0xe1, 0xbb, 0x9d, 0xc3, 0xb1
];

var funnyWord = utf8.decode(utf8Bytes);

assert(funnyWord == 'Îñţérñåţîöñåļîžåţîờñ');
```

UTF-8文字のストリームをDartの文字列に変換するには、`Stream`の`transform()`メソッドに`utf8.decoder`を指定します。

```dart
var lines = utf8.decoder.bind(inputStream).transform(const LineSplitter());
try {
  await for (final line in lines) {
    print('Got ${line.length} characters from stream');
  }
  print('file is now closed');
} catch (e) {
  print(e);
}
```

JSONと同様に、逆に`utf8.encode()`を使用して、Dartの文字列をUTF-8エンコードされたバイト列にエンコードすることもできます。

```dart
Uint8List encoded = utf8.encode('Îñţérñåţîöñåļîžåţîờñ');

assert(encoded.length == utf8Bytes.length);
for (int i = 0; i < encoded.length; i++) {
  assert(encoded[i] == utf8Bytes[i]);
}
```

# 終わりに
今回はさらっとでしたが、dart:convertライブラリについて触れました。
正直、UTF-8の変換を行う機会が今までなく、今後もあまりないかもしれませんが、一方でJSONはAPIとのやりとりで利用することは頻繁にあると思いますので、自分のために限らず、誰かに有益な情報になれば嬉しいです。
SPSS CADSの時間ベースのスケジュールのオプション

SPSS CADSの時間ベースのスケジュールのオプションにどんなものがあるかを確認します。

＊ テスト環境
    * CADS 8.5

# 1回
年月日、時分を指定して一度だけ動きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/f080620a-0f49-6123-dc24-f23ca0fe5680.png)


# 秒単位
何秒おきに実行するかを指定します。
なお、秒単位で利用する場合には、Deployment Manager（web)より[構成] -> [プロセス管理] -> [「カレンダープール」](https://www.ibm.com/docs/ja/sc-and-ds/8.4.0?topic=configuration-process-management)の値（デフォルト60秒）を短くする必要があります（短くした場合、CADSサーバーの負荷が高まる可能性があります）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/476d56e4-2252-f702-9872-4dc8be486fcd.png)

# 分単位
何分おきに実行するかを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/b6c0411a-6c90-a819-5021-f539dc58507c.png)

# 時間単位
何時間おきに実行するかを指定します。毎時何分になるかは、開始時刻で設定した「分」に依存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/f47c6e6d-efa9-3721-d221-75d8122f9c3f.png)

# 日単位
何日おきに実行するかを指定します。何時何分になるかは、開始時刻で設定した「時」、「分」に依存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/f1d8ec36-d044-aaf5-4c26-fb6d5144e8bb.png)

# 週単位
何週おきの何曜日に実行するかを指定します。複数の曜日を指定することもできます。何時何分になるかは、開始時刻で設定した「時」、「分」に依存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/7c235b65-6112-9f07-869e-6cdf3943acca.png)

# 月単位
何か月おきの何日に実行するかを指定します。何時何分になるかは、開始時刻で設定した「時」、「分」に依存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/69ce6dca-ac55-460b-b627-bb722168abc3.png)


### 参考：時刻ベースのスケジュール設定 - IBM Documentation 

https://www.ibm.com/docs/ja/sc-and-ds/8.4.0?topic=schedules-time-based-schedule-settings
ブログ開始、学習記録

【はじめに】
文系の業界初心者がエンジニアのキャリア形成の上で、フロントエンドからフルスタックを目標に、まずは形からということでQiitaにてブログをつけることにしました。

前置きはさておき、2024/10/28現在の学習状況です。

【時系列】
2024/09/18～
    JavaScript, コーディング学習
2024/10/10～
    Notion, 管理システム運用

【なんでこの２つ？】

「JavaScript」
    ・フロントエンド開発言語の利用割合で圧倒的だった。(1)
    ・altjs(代替言語)であるTypescriptを見据えて、年収ベースで需要があると見込んだ。(2)
    
「Notion」
    ・どの企業の技術スタック/開発ツールを見てもSlack, Notionを利用していたため(3)
    ※Slackはチーム開発が前提なので一旦保留
    ・拡張性が高い
    → 苦手だったスケジューリング（日常も含めて）の改善に役立ちそう
    → システム開発のような側面があるため、エンジニア的思考の練習に

【おわりに】
約１ヶ月間、様々な業界知識や情報を取り入れたので徐々に自分の方向性が見えてきました。
現在の短期目標は、JavaScriptでサイトを作成すること及びエンジニア１年目の必修項目の学習になります。(4)

学習状況の洗い出しも含めて隔月で更新しようかなと考えてます。

【参考リンク】
(1)「Client-side Programming Languages | W3Techs」
(https://w3techs.com)

(2)「平均年収の高い「プログラミング言語」　3位「Scala」、2位「TypeScript」、1位は？ | ITmedia」(https://www.itmedia.co.jp/business/articles/2312/28/news060.html)

(3)「採用情報・募集要項 | mybest」
(https://open.talentio.com/r/1/c/my-best/pages/82307)

(4)「【何冊読んでる!?】1年目エンジニアが絶対に読むべき技術書15選 | TECH WORLD」
(https://youtu.be/SrUDW5z9dRk?si=0le9K5J-uMsVW3EH)
Tera Termをインストールする前に、ターミナルエミュレータって何？

# はじめに

最近データアナリストから転生して、インフラ周りも扱えるようになろうとAWSを学習しています。新たな転生者へ少しでも役に立てればと、学習メモや躓きポイントを記していきます。

今回は未知のモンスター、ターミナルエミュレータと遭遇したので、対戦ログを残しておきます。

# EC2でのサーバ立ち上げ

今日は、EC2でインスタンスを起動してサーバを立ち上げました。

EC2インスタンスの操作をしていくにあたり、どうやらインスタンスの操作方法はサーバの種類によって異なるとのこと。

- **Windowsサーバー向け操作GUI**  
- **Linuxサーバー操作用SSHソフト**

SSH接続方式の場合、WindowsではSSHソフトウェアのダウンロードが必要なんだとか。
（MACだとターミナルが内蔵されています）

そこで有名なのがTera Term。version 5を選んでダウンロード。
※2024年10月時点    

https://github.com/TeraTermProject/teraterm/releases/tag/v5.0

[Tera Term ダウンロードリンク](https://github.com/TeraTermProject/osdn-download/releases/tag/teraterm-5.0)

# Tera Termって何？
さて、流れるようにインストールを進めてきましたが、そもそもTera Termって何？
調べると、 [Tera Termの記事](https://wa3.i-3-i.info/word12679.html)がわかりやすかったです。

SSH接続は通信内容が暗号化されてセキュリティも安心。その際にSSHで接続するときに必要なソフトがTera Termで、ターミナルエミュレータと呼ばれている。

なるほど、便利であることがわかりましたので、551のほーらい風に整理します。
（関西人なら全員知ってる）

# ターミナルエミュレータの有無の比較

| 特徴 | ターミナルエミュレータがあるとき | ターミナルエミュレータがないとき |  
| --- | --- | --- |  
| **リモートアクセス** | SSH、Telnet、シリアルポートを通じてリモートサーバに安全にアクセス | リモートアクセスが困難、現地に赴いて操作が必要 |  
| **利便性** | 世界中どこからでもインターネット接続があればアクセス可能 | 離れた場所や複数拠点のサーバ管理が非効率 |  
| **セキュリティ** | SSHなどで通信が暗号化され、データが安全にやり取り可能 | セキュアな通信が難しく、データの不正アクセスのリスクが高い |  
| **自動化とスクリプト** | シェルスクリプトやマクロでタスクを自動化、効率が向上 | すべて手動操作で、エラーが増え、作業効率が低下 |  
| **多様なプロトコルのサポート** | 多様な通信プロトコル（SSH、Telnet、シリアル）に対応 | 特定のプロトコルしかサポートされず、互換性がない |  
| **リアルタイムの監視とデバッグ** | リモートでの監視と即時対応が可能 | リモート監視ができず、問題の早期発見と解決が難しい |  
| **柔軟性** | 異なるシステムやデバイス間での操作が容易 | 対応範囲が狭く、特定のシステムに対する操作しかできない |  
| **問題解決のスピード** | 問題発生時に迅速に対応、ダウンタイムの短縮 | 問題解決が遅れ、ダウンタイムが長くなることが多い |  

![](https://storage.googleapis.com/zenn-user-upload/78547d8c7775-20241028.png)
ターミナルエミュレータのない生活は考えられないですね。

# 登場人物の整理
### SSH（Secure Shell）

SSHは、セキュアシェル (Secure Shell) の略で、インターネットやその他のネットワークを経由して遠隔のコンピュータに安全に接続するためのプロトコル。

- **暗号化**：通信内容が暗号化されるため、データの盗聴や改ざんを防ぐ  
- **認証**：パスワードや公開鍵などを用いた認証機能で、接続する相手が正当なものであることを確認する  
- **リモート操作**：コマンドラインインターフェースを通じて、遠隔のサーバーを操作できる

### ターミナルエミュレータ（Terminal Emulator）

ターミナルエミュレータは、リモートコンピュータに接続して操作するためのソフトウェア。もともとはターミナル（コンピュータの端末）として動作するハードウェア機器をソフトウェアでエミュレート（模倣）するために使われる。

- **リモートアクセス**：SSHやTelnetなどの通信プロトコルを使用して、遠隔のサーバにアクセスする
- **コマンド実行**：コマンドラインインターフェースを提供し、直接コマンドを入力して実行できる  
- **スクリプト自動化**：シェルスクリプトやマクロを使用して、よく使う操作を自動化できる


![](https://storage.googleapis.com/zenn-user-upload/806c729de552-20241028.png)

# おわりに
元々は寺西さんという方が開発されて、テラタームという名前をつけられたと知り胸アツでした。
技名を命名できるのは先駆者の特権！今後もテラタームさんと仲良くやっていきます。
【ジョブ】アメリカエンジニアの採用実態

# はじめに
こんにちは、現在アメリカに住んでおりアメリカの大学で英語を学びながら独学でエンジニアの勉強をしているものです
今回はアメリカでエンジニアになれるのか？ということに触れていきたいと思います。
というのも、アメリカのソフトウェアエンジニアの給料は最低でも$80,000(日本円で約1,200万円)というのもあり目指したいと思っている方も多いのではないでしょうか。
また、アメリカのエンジニアについて「ブートキャンプに参加してジョブをゲットした」という話も聞いたことがある方もいると思います。

今回の記事については、私が調べた内容とアメリカのエンジニアの方から聞いた話なのですべてが正しいとは限らないので
この記事は参考程度に見ていただけると幸いです。

# ブートキャンプに参加すればエンジニアになれるの？
実は以前、私自身が起業家プログラムに参加したことがあり、その際シリコンバレーで働く日本人の方々と交流する機会がありました。
あるエンジニアの方に「アメリカでエンジニアとして働くならブートキャンプもおすすめだよ」と言われ、特に「Hack Reactor」というブートキャンプの卒業生がシリコンバレーに多くいるとのことでした。
しかし、Hack Reactorはすべて英語で授業が行われ、参加費も約300万円と高額なため、一旦受講は見送ることにしました。

その後、英語で情報収集を行い、以下のようなサイトを見つけました。

https://www.reddit.com/r/codingbootcamp/comments/19319sy/how_are_recent_hack_reactor_graduates_doing/

これはアメリカ版のSNSであるRedditに掲載された投稿で、最近のHack Reactor卒業生が就職できていないという内容が書かれていました。
さらに、アメリカで就職するためにはコンピュータサイエンス（CS）の学位が重要だとのことです。
アメリカにいるソフトウェアエンジニアの友人によると、現在ブートキャンプ経由で現地採用される人は少ないようで、エンジニアになるためにブートキャンプに参加するのは一時期の流行で、現在は状況が変わりつつあるのかもしれません。
日本ではスクールに通う方が多いように感じますが、国ごとにキャリアの形成方法が異なるようです。

また、ブートキャンプ卒業生の就職率が下がっている背景として、採用数の減少も関係していると考えられます。

https://fred.stlouisfed.org/series/IHLIDXUSTPSOFTDEVE

サイトの中にある正規分布みたいなグラフがあると思いますが、これは2020～2024年までにindeedに掲載されたsoftware engineerのジョブ数(の指標)です。
2020年の2月の採用数を100とすると、2022年のピーク時に約230と2倍以上の採用があることがわかります。
一方で2024年の10月は67という値になっており、経験者ですら転職が厳しいように思えます。
上記の記事を見て中には、採用が厳しくなったというより通常の採用レベルになったのではというかたもいるようです。
知り合いにブートキャンプやコミュニティカレッジという日本でいう短大に行ってエンジニアになった方もいるようですが、どの方も採用が増えていた時期にエンジニアになっていたと思います。

# どうすればアメリカのエンジニアになれるの？
私はまだエンジニアではないので確実な答えは言えませんが、聞いた話によると、アメリカではCSの学位が非常に重視されるようです（もちろん他のスキルも重要ですが）。
ある企業では、CS学位を持たないと書類選考すら通らないこともあると聞きました（これは企業によるでしょう）。
さらに技術を磨いたり、GitHubでの貢献度を増やしたりすることも大事ですが、この記事では技術的な話題は控え、学位の重要性についてお話しします。

大学院に進学すれば就職が簡単かというと、それも一概には言えないようです。
ジュニアポジションでの募集があっても、より経験豊富なミドルクラスの候補者が優先されるケースもあるようです。
そのため、アメリカでエンジニアになるための王道パターンとしては、アメリカの大学院でCSを専攻し、インターンシップを通じてそのまま就職することが挙げられます。「今さら大学院は…」と思われるかもしれませんが、アメリカのマスター進学者の平均年齢は32歳とのことですので、年齢を気にせず挑戦してもよいかもしれません。

また、アメリカのCSの大学院にはオンラインプログラムもあり、それも一つの選択肢です。ただ、インターンシップの機会が得られにくいこともあると聞いています。もし、この点に詳しい方がいらっしゃればコメントいただけると嬉しいです。
【Figma×ChatGPT】UIデザインからWebアプリを作っぞ！

アプリを作るとき、まず考えるのは要件と実装で、
エンジニア的にはデザインやUIについては二の次な部分かと思います。

が、今回は要件を決めたらUIデザインをするところから始めていきます。
同時にChatGPTにデザインを渡し、だいたいのコードも書いてもらいましょう。
UIUXについてとChatGPTの利用法を学ぶことが目的でしたので、この2点に挑戦することが今回の趣旨です。

# なんのアプリを作る？
今回はブラウザで動作する「カメラアプリ」を作りたいと思います。
弊社のマスコット「ココアちゃん」と一緒に写真を撮れる、
ARフォトフレームのようなものを作りたいな～と構想を練っていきます。

アプリの構成要素は下記の通り。
 - カメラ映像
 - フレーム画像
 - シャッターボタン

# デザインを作る
妄想を具体化するためにデザインを作ります。
今回はFigmaというツールを使いましたが、目的は脳内にある完成図を視覚的に再現することなので
XDでもスマホアプリでもMSペイントでも、ツールは何でもいいと思います。

そうしてできたデザインカンプがこちら。
適当に写真とイラスト（フレーム）とシャッターボタンを重ねてみました。
![デザイン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149621/9300c069-0926-47c9-0c8e-907832cd6bba.png)

# ChatGPTにコーディングをお願いする
ChatGPT（4o）は画像を添付するとそこに何が映っているかを解析できます。
ウェブページのワイヤーフレームを送ると、ある程度似たレイアウトのHTMLやCSSを組んでくれます。
その要領でアプリのコードのたたき台を作ってもらいましょう。

今回はアプリなので、デザインだけでなく
 - 何の技術を使用するか
 - どのように実装するか
 
といった要件的なところは把握しておく必要があります。

なのでこのようにお願いしました。
![スクリーンショット 2024-10-24 013503.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149621/a6a61f17-dd7e-039f-3344-c81304e0f8da.png)

# 書いてもらったコードの修正
![スクリーンショット 2024-10-24 004617.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149621/ee0af73a-02ad-5496-d4d3-9f21e44d8e89.png)
こんな風に実装例が返ってきましたが、今回の例だとシャッターボタンの画像について言及せずに依頼したので、buttonで実装されていました。
そのような個所を、ChatGPTに依頼して直してもらったり自分で直したり要件を追加したりしてできたアプリがこちら。
人とAI半々くらいです。

# 完成
![スクリーンショット 2024-10-24 124045.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149621/178b9d7c-d129-36cb-55df-5f44f01158ce.png)

こんな感じで、無事にフォトフレームアプリができました。
カメラの映像を全面に表示し、下のシャッターボタンでキャプチャ取得・保存を行います。
環境によってアクティブでない真っ暗なカメラが選択されていたりしたので、手動でカメラを選択できるプルダウンを追加したり等もしました。
これでココアちゃんとツーショット！

実際のアプリはこちら。
【GitHub】
https://github.com/mayegg4869/Portfolio/tree/master/photoframe
【GitHubPages】
https://mayegg4869.github.io/Portfolio/photoframe/ 

# まとめ・感想
デザインから作ってみることを試してみて、一番実感したのは**ブレが少ない**ということです。
普段は作っているうちにどんどん脱線していってしまうのですが、
最初に完成形をはっきりさせたので、要件を増やした場合も目的を達成するための追加となり、焦点が定まっていました。

また、たたき台をChatGPTに作ってもらったことで、HTMLのお約束部分の工数削減や、
新しく自分で要件を追加してそれがうまくかみ合わないとき、考えられる原因についてを聞いたりといった相談ができたのも勉強になりました。

みんなもUIデザインからWebアプリを作ってみよう！　と適当に締めさせていただきます。

*********************************
オブジェクティブグループではXの投稿も平日毎日行っています！
IT関連の小ネタや便利技から、日常のアニメ・ゲーム布教なども幅広く投稿してるので、
ご興味のある方は是非フォロー・いいねをお願いします。
https://x.com/obg_ocr
*********************************