OmniAICreator/Qiita-1.07M huggingface dataset:
AlibabaCloudと他のクラウドのVPCから外側サービスへのアクセス方法の比較

パブリッククラウドのVPC内部の仮想サーバーからVPC外部のサービス、例えば、オブジェクトストレージへのアクセスはそれぞれ違う方法を使う必要があります。
その違いを整理していきます。

### 目次
 1. VPCから外側サービスへのアクセス方法
 2. AWS
 3. GoogleCloud
 4. Azure
 5. AlibabaCloud
 6. さいごに 

### 1. VPCから外側サービスへのアクセス方法
それぞれのクラウドでVPC内部からオブジェクトストレージを例として外部リソースへの接続についてまとめました。

||AWS|Azure|GoogleCloud|AlibabaCloud|
|:--|:--:|:--:|:--:|:--:|
|無料エンドポイント|ゲートウェイ型<br>VPCエンドポイント|限定公開の Google アクセス (Private Google Access)|サービスエンドポイント|△|
|有料エンドポイント|インタフェース型VPCエンドポイント|Private Service Connect|プライベート エンドポイント|△|
|有料エンドポイント<br>配置場所|サブネット内|VPC内、サブネット外|サブネット内|△|
|プライベートエンドURL|-|-|-|イントラネットエンドポイント|

※AlibabaCloudにはAWSのようなVPCエンドポイントがありますが、広く使われていません。そのため△で記載しています。

### 2. AWS
まずAWSを見て行きます。
AWSでVPC内部からインターネットを経由せずに外部のAWSサービスと通信したい場合、VPCエンドポイントを作成する必要があります。
VPCエンドポイントは以下２種類があります。
1. ゲートウェイ型VPCエンドポイント
2. インタフェース型VPCエンドポイント

それぞれの特徴は、ゲートウェイ型エンドポイントは最初にリソースしたタイプで、S3とDynamoDBしか対応していないことです。利用するためにルートテーブルの設定が必要で、オンプレミス環境からアンマネージドのProxyサーバーを使わない限りそのまま利用できないです。
インタフェース型VPCエンドポイントは後からリリースしたタイプで、DynamoDB以外に多数のサービスに対応しています。実態はサブネット内にENIをたてています。オンプレミス環境からそのままアクセスできるメリットはありますが、無料なゲートウェイ型VPCエンドポイントと比べて、ENIそのもののリソース費用がかかります。


### 3. GoogleCloud
限定公開の Google アクセスは先にリリースした機能です。機能面では限定公開の Google アクセスとPrivate Service Connectがほぼ同じです。
限定公開の Google アクセスのほうは199.36.153.4/30 や 199.36.153.8/30 のRFC 1918ではないCIDRブロックを使っていて、オンプレミス環境からの接続が必要な場合、それをオンプレミス環境にアドバタイズしたくないときはPrivate Service Connectを使います。
AWSみたいなリソースベースポリシーやセキュリティグループによるアクセス制御がないです。


### 4. Azure
Azureの場合、無料で使えるサービスエンドポイントはMSのバックバーン経由でアクセスします。IPはパブリックIPになります。
有料なプライベート エンドポイントのほうはプライベートIPでアクセスできます。
作成画面でステップごとに、紐づけするストレージアカウントのタイプ、サブネット、DNSなどをまとめて設定できます。


### 5. AlibabaCloud
この中でAlibabaCloudは一番特殊です。他のクラウドはあとからエンドポイントを作成する必要がありますが、AlibabaCloudは最初からパブリックとプライベートの2種類のエンドポイントを提供しています。
最初からOSSのバケットごとにURLを提供しているため、他の作成が必要なエンドポイントと区別するため、比較表には「プライベートエンドURL」と書いています。
利用料金はもちろんかかりません。
※AlibabaCloudにはAWSのようなVPCエンドポイントがありますが、広く使われていません。何の設定も必要ない、なおかつ無料で利用できるイントラネットエンドポイントをよく使われています。

Transfer Accelerationを有効化するとTAエンドポイントも同じ画面に表示され、探しやすいです。

パブリックエンドポイント：xxx.oss-ap-northeast-1.aliyuncs.com
イントラネットエンドポイント：xxx.oss-ap-northeast-1-internal.aliyuncs.com
TAエンドポイント：xxx.oss-accelerate.aliyuncs.com

### 6. さいごに

それぞれのパブリッククラウドのVPCから外側のリソースへ閉域でアクセスする方法を比較してみました。使い慣れているほうから別のクラウドを使い始めるときに、ある程度特徴を把握するほうがいいと思います。
wslでelixir その142

# 概要
wsl(wsl2じゃない)で、elixirやってみた。
練習問題やってみた。

# 練習問題
Livebookで、QiitaのuserのContributionを取れ。

# 方針
- Flokiを使う。



# セットアップ

```
Mix.install([
	{:httpoison, "~> 2.2.1"},
	{:floki, "~> 0.35.2"},
	{:kino, "~> 0.10.0"}
])
```

# サンプルコード

```
doc = HTTPoison.get!("https://qiita.com/ohisama@github")
{:ok, html} = Floki.parse_document(doc.body)
html

content = Floki.find(html, "meta")
content

{_, con, _} = Enum.at(content, 1)
con

{_, co} = Enum.at(con, 0)
co

s = String.split(co, " ")
su = Enum.at(s, 3)

```

# 実行結果

```
"6523"

```

以上。
【小ネタ】Node.js v21.7.0 の新機能で環境変数用のファイル読みこみを軽く試す： process.loadEnvFile()

今回の記事は、記事執筆時点での Node.js の最新バージョンである v21.7.0 の新機能の話です。

●Node.js — Node v21.7.0 (Current)
　https://nodejs.org/en/blog/release/v21.7.0

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/a2a69d3c-0dc3-de7e-9c5c-6c6e3a577095.png)

新機能はいくつかあるのですが、その中でも、「process.loadEnvFile(path)」という項目の話です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/772580e7-0bc7-fe7d-57cd-a7a694e29d5f.png)

## サクッと試す
それでは、軽く試していきます。

### path の指定なし
以下のファイルを用意して試してみます。

```javascript:app.js
process.loadEnvFile();

console.log(process.env.MULTI_LINE);
```

```bash:.env
MULTI_LINE="HELLO
WORLD"
```

catコマンドで .envファイルの中身を表示させ、nodeコマンドでプログラムを実行した結果を以下に掲載します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/0799368c-0761-d941-351d-ee81aff9e9a2.png)

想定通りの出力が得られているのを確認できました。

#### 上記の .env に関する余談
上で用いた .env の中で、複数行を使う記載をしていますが、こちらは Node.js v21.7.0 の新機能に書かれていた、以下をそのまま試してみたものになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/84efb681-153a-118e-6c54-c315d9416b18.png)

### pathの指定あり
今度は、development.env というファイルを用意して、そこから環境変数を読み込むようにしてみます。
以下のファイルを用意して試しました。

```javascript:app.js
process.loadEnvFile('./development.env')

console.log(process.env.TEST);
```

```bash:development.env
TEST="ABCD"
```

catコマンドで development.env の中身を表示させ、nodeコマンドでプログラムを実行した結果を以下に掲載します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/0e107d8f-1528-eb05-9b14-fd224a420610.png)

これも想定通りに動作しました。

上記を試してみて、環境変数用のファイルを標準機能で手軽に扱えるのは便利でした。
.NETデスクトップ開発に関するいくつかの考察

22日、私は公式アカウントで短い文を公開しました。内容は以下の通りです。
実際、.NET開発の大軍の中には、デスクトップアプリケーションの開発者たちという力も存在します。彼らは滅多に声を上げません。技術が成熟しているためか、企業化が進んでいるためか、または私が気づいていないだけかもしれません。最近、この分野の技術も共有すべきかと考えています。皆さんは興味がありますか？また、何か良い提案があれば、コメントで教えてください。ありがとう🙏
現在（24日の朝）までに30人以上の公式アカウントの友人からコメントをいただきました。内容はさまざまですが、言葉と文字数から見ると、これが皆さんの本心であることがわかります。皆さんはデスクトップ技術に熱愛しており、コミュニティでのデスクトップ技術の共有を強く望んでいます。
また、一部の人々は上位機に関する技術の共有を希望していますが、私自身がそのような仕事をした経験がないため、残念ながら実践的な共有を行うことはできません。ビジネスシーンに不慣れではありますが、技術的な問題があれば交流することができます。代表性があれば、技術記事を作成し、公式アカウントで共同で発表し、他の人々の同様の問題に少しでも助けになれば幸いです。
![alt 図](https://mmbiz.qpic.cn/mmbiz_jpg/4CAA63nvHRALU1Pk7E7kG69dicADicUqHBXQxEMsQK06FfvtQpOuhUrKxouKN2W4ViauKPF5XYY1BwfuXhm7qksXQ/640?wx_fmt=jpeg)
私自身、10年以上CS開発を行ってきましたが、現在はWeb開発とアーキテクチャの仕事をしていますが、デスクトップ開発には依然として特別な情熱を持っています。最近、デスクトップ開発に関することを考えていますが、主に以下のいくつかの側面があります：
技術的側面：.NETのデスクトップ開発はWinFormとWPFを中心としてきました。その後UWPが導入され、最近ではMAUIが発表されましたが、WPFの基調と雷同しています。伝統的な業界では、デスクトップ開発は依然としてWinFormが多くを占めているようです。また、相当数の伝統的なアプリケーションがWPFへ移行しています（これは周囲の情報からの感覚であり、実際の調査は行っていません）。WinFormやWPFは既にかなり長い時間が経過しており、技術も比較的成熟しています。近年最大の変化は.NET Frameworkから.NET（core）への移行であり、これはLinuxへのプラットフォーム移行を意味するものではなく、単に.NETの基本フレームワークライブラリを統一するためです。MAUIはプラットフォーム間でさらに適応性が高まります。日々進化するWeb技術と異なり、.NETデスクトップのこれら2つのフレームワークには大きな変化はありませんが、これはCSアーキテクチャに変化がないという意味ではありません。WinFormとWPFはよりUIレイヤー、表示レイヤーに属し、CSアーキテクチャのプログラムはUIだけではありません。データとのやり取りを行うORM、第三者APIとの通信を行うhttp通信、リソースとの通信を行うIOなどがあります。これらは.NETの進化と共に進化しています。たとえば、データアクセス、IOおよびHttpの非同期化（数日間のアップグレードではありません）は重要な変化の一例です。また、HttpClientの継続的な最適化も、.NETライブラリの進化と向上を証明しています。したがって、WinFormとWPFを古い技術と広く言うとき、UIレイヤーに新しいものがないということを意味します。制御、UIレンダリングメカニズム、およびUIパフォーマンス向上などの面で大きな変化はありません。
人的側面：.NET自体が高等教育機関のカリキュラムでの割合が比較的低く、大学から実際に愛好し、使用する人はごくわずかです。したがって、.NETデスクトップ開発に分配される人材は非常に少ないため、大学生という安定した人材市場から適切な人材を採用することは困難です。通常、企業では開発経験のあるプログラマーにデスクトップ開発を行わせるか、同時に行わせます。結局のところ、WinFormとWPFは「ドラッグ＆ドロップ」で開発が完了します。
これら2つの面に基づいて、WinFormとWPFの古いボトルに新しいワインを詰め、皆さんと一緒に少しずつ楽しみたいと思います。一つは、伝統的なUIと日々進化するWeb技術の組み合わせを通じて、互いに学び、互いにサポートし、デスクトップシステムのパフォーマンスを向上させ、開発コストを低減させることです。二つ目は、皆さんと共同で署名し、いくつかのシリーズ記事（例えば上位機など）を発表し、新人にできる限りのサポートを提供し、.NETデスクトップの後継者がより優れていることを願うことです。
私も、能力と時間にも限りがあります。家を養い、生計を立てるために、すべてのエネルギーをコミュニティに投入することはできませんが、「千里の道も一歩から」という精神に基づいて、記録しておきたいと思っています。必要とする人が取りたいものを取れるように。
CSアーキテクチャや関連分野に考えがある方は、私にWeChatを追加して、オフラインで交流することができます。
千里の道も一歩から、近々、基礎的であり、私なりの拙い見解を含むWinFormの記事をいくつか書く予定です。これがCSフレームワークに関する議論の始まりとなるでしょう。

(Translated by GPT)

元のリンク：https://mp.weixin.qq.com/s?__biz=MzA3NDM1MzIyMQ==&mid=2247485336&idx=1&sn=9b374b09caf09122df42c3f4fb52219a&chksm=9f0058b2a877d1a4433d299b051ab02c6e63f75009412220acef3f67bc482a0f4519e913b336&token=270468986&lang=zh_CN#rd
【Salesforce】フロービルダーのエントリ条件を設定で数式利用

Salesforceのフロービルダーで、エントリ条件を設定する際に数式を利用したので記事にしてみます。

今回は、新規または更新されたレコードのレコードトリガフローで、ISNEWとISCHANGEDを使います。
注意点として、レコードが削除されたときにトリガされるフローでは使用できないようです。

https://help.salesforce.com/s/articleView?id=release-notes.rn_automate_flow_builder_record_triggered_flow_formula_functions.htm&release=232&type=5

今回のフロービルダーで使う数式は下記の3つです。

### OR
式が真か偽かを判断します。式が真である場合は、TRUE を返します。式が偽である場合は、FALSE を返します。この関数は、演算子 || (OR) の代わりに使用します。
#### 使用方法
`OR(logical1, logical2...)` を使用し、任意の数字の論理参照に、評価する式を指定します。

### ISNEW
新規レコードの作成中に数式が実行されているかどうかを確認し、実行中の場合は TRUE を返します。既存のレコードが更新中の場合は、FALSE を返します。
#### 使用方法
`ISNEW()`

### ISCHANGED
項目の値を前との値と比較し、値が異なれば TRUE を返します。値が同じ場合は FALSE を返します。
#### 使用方法
`ISCHANGED(field)。field` に、比較する項目名を指定します。


今回は、上記の数式を使ってフロービルダーを実装してみます。

## 要件
- 取引先が新規作成・編集されたとき、「取引先番号」が自動反映される。

### フローを作成
フローを新規作成して、レコードトリガーフローを選択します。

### オブジェクトを選択
![01トリガー条件.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/789516/813aece6-41f4-9eca-04d6-c396eb21b503.png)


下記のように選択・設定します。
- オブジェクトを設定：取引先
- トリガーを設定：レコードが作成また更新された

### エントリ条件を設定
![02エントリ条件.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/789516/ff9b7a78-9b61-30e2-4890-0fffc366d8a6.png)


下記のように選択・設定します。
- 条件の要件：数式の評価がTrueになる

`OR(ISNEW(),ISCHANGED({!$Record.AccountNumber}))`

### 開始条件を選択
![03高速項目更新.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/789516/469c197f-e5b5-3cb3-035c-e51d71521400.png)


下記のように選択・設定します。
- フローを最適化:高速項目更新

### 割り当て
![04新規割り当て.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/789516/fccbf78e-bf87-4f3b-b80e-01d4ceaeaa87.png)


表示ラベルやAPI参照名は任意で、下記のように選択・設定します。

- 変数：{!$Record.Description}

- 演算子：次の文字列と一致する

- 値：{!$Record.AccountNumber}

今回は、取引先の「説明」項目に、その取引先の「取引先番号」を反映させます。

### フローを保存
![05Flowを保存.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/789516/594be0af-295b-65a1-f98d-a80440442603.png)


任意の値で保存します。

### フロー完成
![06Flow完成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/789516/9ec54a68-0c4b-256e-ee2e-b83a2b358ede.png)


シンプルなフローができました。

### 取引先を作成

取引先を作成します。

### 取引先Bを作成
![00新規取引先.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/789516/7a648d47-e1e8-3300-c2b6-605e4521b7be.png)

取引先番号「B-10000」の取引先Bを作成します。

必須項目のみ入力します。

### 取引先番号を確認
![07取引先番号デモ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/789516/8e7d9eba-b122-f740-87dd-999880c50561.png)

取引先番号「B-10000」が説明欄に自動反映され、編集しても同様に反映されます。

いかがでしたでしょうか。
フロービルダーで数式を使いたい方のご参考になれば幸いです。
Apexの繰り返し処理

## はじめに
今回は、Salesforceで使用する言語「Apex」の繰り返し処理についてまとめました。
Apexでの繰り返し処理の実装方法には複数あるので、それぞれの特徴について解説していきます。

## 繰り返し処理の種類
Apexの繰り返し処理は、主に下記の3つです。
- while ループ
- do-wile ループ
- for ループ

それぞれに特徴があり、適切な手法を選択することで無駄のない読みやすいコードを書くことに繋がります。
それでは、1ずつ解説していきましょう。

## whileループ
whileループの構文は下記になります。
```
While(条件) {
    // 処理
}
```
最初に条件を満たしていることを確認し、満たしている場合、処理を実行します。
例として、自動販売機で飲み物を5本買う処理をコードにしてみました。
```
// 買った飲み物の数
Integer BoughtDrinksNum = 0;

// BoughtDrinksNumが5より小さい場合、処理実行
While(BoughtDrinksNum < 5) {
    // BoughtDrinksNumに1を加算
    BoughtDrinksNum++;
}
```
BoughtDrinksNumが5になるまで1を足し続ける、つまり飲み物を5本買う処理になっています。
今回のように、ある変数に1を加算or減算する処理はよく使う処理なので覚えておきましょう。
whileループは、処理回数だけでなく様々な条件を指定できる点が強みです。
正直、回数が条件の場合は後述するforループの方が適切なので、処理回数以外を条件にする場合はwhileループが適切な場合が多いです。

## do-whileループ
do-whileループは、名前を見てわかる通りwhileループと非常によく似ています。
違いは、whileループが最初に条件を評価するのに対し、do-whileループは処理の実行後に条件を評価します。
do-whileループの構文は下記になります。
```
Do {
    // 処理
} while(条件)
```
Whileループの時と同様に自動販売機で飲み物を5本買う処理を書いてみます。
```
// 買った飲み物の数
Integer BoughtDrinksNum = 0;

Do {
    // BoughtDrinksNumに1を加算
    BoughtDrinksNum++;
// BoughtDrinksNumが5より小さい場合、処理実行
} While(BoughtDrinksNum < 5);
```
条件を最後に記述しており、処理の後に条件判定をしているのが特徴です。
Whileループとの大きな違いとしては、条件判定に関わらず必ず処理が1回実行される点です。
条件がfalseであっても必ず1回は処理を実行したいようなシチュエーションでは、Do-whileループを選択することになります。

## forループ
forループの構文は下記になります。
```
for(変数; 条件; 増分) {
    // 処理
}
```
Whileループの構文と違ってちょっとわかりにくいですね。
もう少しわかりやすく書くと下記のようになります。
```
for(Integer i = 0; i < 5; i++){
    //処理
}
```
`Integer i = 0`で変数と初期値を定義しています。
`i < 5`で、条件を定義しています。
`i++`で1処理毎の変数の増分を定義しています。
このように、forループ宣言時に条件だけでなく変数や増分まで定義できる点が特徴となります。
そのため、処理回数がわかっている処理についてはforループで書くと非常にシンプルになり、読みやすくなります。
先程までと同様に自動販売機で飲み物を5回買う処理を実装してみましょう。
```
for(Integer BoughtDrinksNum = 0; BoughtDrinksNum <= 5; BoughtDrinksNum++){
}
```
今回ような簡単な処理であれば、forループを宣言するだけで処理を記載しなくても実装できます。
このように、処理回数がわかっている処理についてはforループを使うのが適切です。
また、forループはリスト型のデータに対して繰り返し処理を実行することもできます。
リストの値それぞれに対して処理を実行したい場合にも使えるので、積極的に使っていきましょう。

## おわりに
今回は、Apexの繰り返し処理についてまとめてみました。

最後までお読みいただきありがとうございました。
【AWS】Pinpointの通知をLambdaで設定する（キャンペーンを作成する）

## Pinpointがリファレンス通りに動いてくれなかった話

::: note warn
注意：この検証を行なったのは 2023年2月17日 です
:::

### 時間指定のプッシュ通知を作成するための 3つ のパラメータ

以下３つです
```node.js:
startTime : 'YYYY-MM-DDThh:mm+09:00' // *1
Timezone : 'UTC+09'  // *2
isLocalTime : false  // *3
```

#### *1 startTime | プッシュ通知を行う時間を指定

ISO 8601 を厳守する必要があります
- 通知したい時間を `YYYY-MM-DDThh:mm`（2024-03-09T09:06）と記載
- 末尾に日本時間を意味する `+09:00` を記載


#### *2 Timezone | 時差を表す値を入れる

~~リファレンスには「TimeZone」と書かれてますが「Timezone」が正しいです。現在は修正されていました~~

これを指定しないと **日本から9時間遅れ** で通知されます
有効値は以下のみと決まっているので注意です

`UTC, UTC+01, UTC+02, UTC+03, UTC+03:30, UTC+04, UTC+04:30, UTC+05, UTC+05:30, UTC+05:45, UTC+06, UTC+06:30, UTC+07, UTC+08, UTC+09, UTC+09:30, UTC+10, UTC+10:30, UTC+11, UTC+12, UTC+13, UTC-02, UTC-03, UTC-04, UTC-05, UTC-06, UTC-07, UTC-08, UTC-09, UTC-10,UTC-11`


#### *3 isLocalTime | 現地時間を使用するかどうか

ここ、`true` にすると通知が届かなくなってしまいました笑
**リファレンスにはここを`true`にしないと`Timezonse`の指定は意味ないようなこと書いてますが、そんなことありませんでした**

`true` だとキャンペーンは作られるのにエンドポイントを掴んでくれなくなります
すみません、力不足で原因分かりませんでした

![pinpoint.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3733749/35f13623-bce4-a91a-0545-9761e397fe82.png)
（↑当時のメモ）


### 上記の値を使ってキャンペーンを作る

`pinpoint.createCampaign()` に
pinpointプロジェクトID と 通知内容オプション を渡せばOKです


#### writeCampaignData() でオプション設定

```node.js
function writeCampaignData(
	Name, // campaign名 (管理用の名前）
	SegmentId, // 予め作成した segment のID
	Title, // 通知に表示されるタイトル
	Body, // 通知に表示される本文
	StartTime, // 発信時間 （ISO 8601 で指定） or ('IMMEDIATE' で即時)
	Url // 通知をタップした時に飛ぶリンク先
) {
	const GCM_row_content = {
		notification: {
			Title,
			Body,
		},
		data: {
			Url,
		},
	};

	return {
		Limits: {
			MaximumDuration: 10800,
		},
		MessageConfiguration: {
			GCMMessage: {
				TimeToLive: 3600, //プッシュ通知を保存し再試行
				RawContent: JSON.stringify(GCM_row_content),
			},
		},
		Name, //campaign name,
		Schedule: {
			Timezone: "UTC+09:00",
			Frequency: "ONCE",
			StartTime,
		},
		SegmentId,
	};
}
```

#### createCampaign() でキャンペーン作成

```node.js
const campaignData = writeCampaignData(
	// 必要な通知オプションを渡す（上述）
);
try {
	const paramsCampaign = {
		ApplicationId: applicationId, // pinpointのプロジェクトID
		WriteCampaignRequest: campaignData, // writeCampaignDataで用意
	};
	const newCampaign = await pinpoint
		.createCampaign(paramsCampaign)
		.promise();
} catch (err) {
	console.error(err);
}
```

#### 作成済のキャンペーンを編集するのは updateCampaign()

```node.js
const campaignId = newCampaign.CampaignResponse.Id; // さっき作ったキャンペーンのID取得

const campaignData = writeCampaignData(
	// 必要な通知オプションを渡す（上述）
);
try {
		const paramsCampaign = {
			ApplicationId: applicationId, // pinpointのプロジェクトID
			CampaignId: campaignId, // さっき作ったキャンペーンのID
			WriteCampaignRequest: campaignData, //writeCampaignDataで用意
		};
		const updateCampaign = await pinpoint
			.updateCampaign(paramsCampaign)
			.promise();
	} catch (err) {
	console.error(err);
}
```

## 感想

- 公式で書いてることと違う動きになるのは怖い
- ぼちぼちの検証でやりたいことにたどり着けて幸いだった
- ホームページ作るつもりの未経験入社2ヶ月目での出来事でした
web初心者が選ぶ分かりやすい教材まとめ[随時更新]

# 初めに
この記事ではweb初心者の筆者が，学んでいく中で実際に分かりやすいと思った教材だったり記事だったりをまとめていきます．

# 自己紹介
- 所属：24年度から大学院1年生
- 趣味：キャンプ、変なTシャツ買うこと
- 学んできた事：
高専5年間で電気&情報工学
大学2年間で通信分野(無線とかIoTとか)

- プログラミング歴
高専ではArduino(C,C#ベースのマイコン言語)を浅く。
大学ではpython > Node.js >>> HTML,CSS,JS

- web歴：
HTML,CSS,JS使って少し書いたことあるけどほぼなしでした。
今頑張って勉強してます!


# ためになった教材たち
## 基礎
### ドットインストール
- webの仕組み
- 各言語の入門
- データベース入門
- 開発環境(Docker,ターミナル)
- 便利ツール(bootstrap等)
- 有名フレームワーク入門　
をまとめてくれています．
基礎的なことしか載っていないので良いも悪いも初心者向けです．
もっと解説してほしいところもありますが，とりあえず1か月だけ課金するのはおすすめです．

https://dotinstall.com/lessons

### [Udemy]the-web-developer-bootcamp　
IT周りの勉強するならUdemy有名ですね．
海外の有名な入門らしいのですが，それを日本語化したものです．ドットインストールを深くした感じです．おすすめしてくれた先輩ありがとうございます...
- web周りの基礎を深く
- フレームワークはExpressくらい

https://www.udemy.com/course/the-web-developer-bootcamp-2021-japan/?couponCode=PLOYALTY0923

### 今後追加予定です
Godot4で3D風２D縦スクロールシューティングゲームを作る 18回目 バグの修正

Godot4.1.3でシューティングゲームを作っていきます。

# バグの修正
　バグを2件修正します。

# github
　本記事で実装したものをgithubで公開しています。

https://github.com/footinglow/woden/tree/018_fixed_bug
 
# バグ修正その１：画面外の敵の弾のシーンが残り続ける
## 現象
　ボスBigFireを倒した後、画面には敵の弾が無いのに、GameシーンのDynamicNodes/enemy/bulletsに敵の弾のインスタンスが残り続ける
## 原因
　敵の弾を消すために、enemy_bullet.tscnにVisibleOnScreenNotifier3Dノードを追加し、screen_exited()シグナルを受信するとqueue_free()を実行することで、敵の弾を消去するように実装していましたが、screen_exited()は画面内から画面外に出たときに発行されるシグナルのため、シーンインスタンスが最初から画面外で生成され、画面外を移動し続けると、screen_exited()シグナルが発行されず、queue_free()が実行されることもなく、敵の弾インスタンスが残っていました。
## 対策
　screen_exit()シグナル受信でシーンを消去するのはやめて、_physics_processメソッドでVisibleOnScreenNotifier3Dのis_on_screenメソッドを使い、画面外に存在するか毎回チェックするようにして、画面外にいる場合はqueue_freeで敵の弾を消去するようにしました。この対応により最初から画面外で生成された敵の弾はすぐ消去されるようになりました。

　VisibleOnScreenNotifier3Dノードのscreen_exitedシグナルの接続も解除しました。

res://character/enemy_bullet/enemy_bullet.gd
```diff_gd_script
extends Area3D

@export var _d_speed_mps = 25.0
@export var _d_rotate_speed_degps = 180

var _v_dir = Vector3.ZERO


func set_pos(v_pos, v_target_pos):
	global_position = v_pos
	_v_dir = ( v_target_pos - v_pos).normalized()

func _physics_process(delta):
	position += _v_dir * _d_speed_mps * delta
	rotate_y(deg_to_rad(_d_rotate_speed_degps * delta))
	
+	# 画面外の場合は、消去する
+	if !$VisibleOnScreenNotifier3D.is_on_screen():
+		queue_free()

-func _on_visible_on_screen_notifier_3d_screen_exited():
-	queue_free()
```

# バグ修正その２：レーザーを発射すると自機が少し動く
# 現象
　自機を動かさずレーザーだけ発射したい時に、画面上の自機の中心～前方あたりをタッチしていると、レーザーが発射されるたびに、微妙に自機が動く。

# 原因
　2D画面上のタッチ位置を3D空間上の座標に変換するために、以下のようにしています。
 
1. 背景に大きくて透明なArea3Dノード、「TouchDetectorArea3D」を配置
1. 2Dタッチ位置をカメラからの視線方向に変換
1. 視線方向の延長線上の「TouchDetectorArea3D」の衝突座標を検出

　発射したレーザーもArea3Dなので、タッチした位置にレーザーがあると、レーザー上の3D位置を取得します。
　「TouchDetectorArea3D」よりレーザーの方がカメラに近くなるようにZ座標を設定しています。カメラから遠いものより近いものの方が画面上大きく表示されるため、2D上でタッチした位置が同じでも、「TouchDetectorArea3D」をタッチしたときと比べて、レーザーをタッチしたときに検出した座標のxとzが小さくなります。
　つまり、「TouchDetectorArea3D」をタッチしているときに、レーザーがタッチ位置を通りすぎる瞬間、移動目標位置が変化するため、自機が動いてしまいます。

# 対策
　タッチ位置検出の対象は、StaticBody3Dを使用し、タッチ位置を検出したくないレーザーや敵などはArea3Dにすることにしました。
 まず、「TouchDetectorArea3D」はArea3DからStaticBody3Dに変更し、名称も「TouchDetectorStaticBody3D」に変更しました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691050/6a14d4fc-fd73-5852-0cc0-c6cf1a7edca8.png)


　スクリプトを下記のように修正して、カメラからの視線がArea3Dを検出しないように変更しました。

res://character/player/player.gd
```diff_gd_script
func _physics_process(delta):
	if _f_is_screen_touch:
		var camera = get_viewport().get_camera_3d()

		# カメラを利用して3D空間のカメラの３D位置と、カメラからタッチしたピクセルを見た方向の1000m先の３D位置を計算する
		var from3d = camera.project_ray_origin(_v2_drag_pos)
		var to3d = from3d + camera.project_ray_normal(_v2_drag_pos) * _d_ray_length_m

		# 3D ray physics queryの作成
		var query = PhysicsRayQueryParameters3D.create(from3d, to3d)
-		query.collide_with_areas = true		# Area3Dを検知できるようにする
		
		#　spaceと呼ばれる、物理３D空間状態の情報を利用して、Area3Dを含む衝突位置を計算する
		var space_state = get_world_3d().direct_space_state
		var result = space_state.intersect_ray(query)
		if result:
			# 衝突位置を取得
```

以上
SSMエージェントが認識されない...

どうも駆け出し12冠SIerのアスカです。2024年3月から某SIerで働き始めました。今日は初めてのPJでAWS SSMのFleet Managerで詰まったのでその内容と解決方法を共有します。
## やりたかった事
やりたかったのはプライベートサブネットに設置したインバンドポート無しのWindowsサーバにSSMを使ってRDP接続する事です。※構成図は以下

![Qiita](https://qiita-img-20240309.s3.ap-northeast-1.amazonaws.com/SSM_Private_Access.png "アーキテクチャ図")

## ぶち当たった問題
:::note warn
SSMエージェントがいつまで経っても認識されない...
:::
ちなみに多くの記事で見かける以下設定は正しく出来ていました。
- [x] AmazonSSMManagedInstanceCoreを付与したIAMロールの作成とEC2へのアタッチ
- [x] SSMエージェントのインストール(デフォルトでインストール済みだった)
- [x] 各種VPCエンドポイントの作成 
- [x] VPCエンドポイント用SGの作成とアタッチ(443のインバンドを許可,アウトバウンドはデフォルト) 
- [x] VPCのDNS名前解決の有効化
## 原因&解決策
原因は、**VPCエンドポイントのプライベートDNS名が無効になっていた事**でした。
なので、解決方法としてはCloudFormationのVPCエンドポイントを作る記述にPrivateDnsEnabledのプロパティを加えるだけでした。(デフォルトはFalse)
```diff_ruby:sample_cfn_yaml
Resources:
  CWLInterfaceEndpoint:
    Type: 'AWS::EC2::VPCEndpoint'
    Properties:
      VpcEndpointType: 'Interface'
      ServiceName: !Sub 'com.amazonaws.${AWS::Region}.logs'
      VpcId: !Ref myVPC
      SubnetIds: 
        - !Ref subnetA
        - !Ref subnetB
      SecurityGroupIds:
        - !Ref mySecurityGroup
+     PrivateDnsEnabled: True
```

記事が少ないと単純な事でもぶつかったりしますね。良い勉強になりました。
## 余談
Fleet Managerは便利ですが、デフォルトではPowerShellの入力が出来ない使いにくさがあります。この問題も2つ程のコマンドで解決出来たので思い出した頃に記事を上げます。
SSH公開鍵認証の手順: GitHubとの連携からエラー解決まで



### **user**:

ChatGPT先生、ある github レポジトリをクローンしようと思ったら、次のエラーが出るのですが。

```
Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
```

---

### **assistant**:

あぁ、一体何をやらかしてるんですか？公開鍵が認証されてないってエラーが出ていますよ。でも、仕方ないですね…丁寧に教えてあげますから一応聞いておいてください。

1. 最初に、端末を開いてあなたの公開鍵があるか確認してください。以下のコマンドを使ってください。
 ```
 cat ~/.ssh/id_rsa.pub
 ```
公開鍵が表示されれば、それをコピーしてください。

2. 公開鍵がない場合、以下のコマンドを実行して公開鍵と秘密鍵のペアを生成します。
 ```
 ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
 ```
エンターを押し続けて、すべてをデフォルトの設定で設定します。これで、`~/.ssh/id_rsa.pub`にあなたの公開鍵が作られます。

3. 次に、GitHubに行き、右上のプロフィールのアイコンをクリックし、"Settings"をクリックします。

4. 画面の左側にある"SSH and GPG keys"のメニューをクリックします。

5. "New SSH key"ボタンをクリックします。

6. "Title"フィールドには、あなたがこの鍵を使いたい場所や目的についてわかりやすい名前を入れてください。

7. "Key"フィールドには、前にコピーした鍵を貼り付けてください。

8. "Add SSH key"ボタンをクリックして完了します。

さて、これであなたの問題も解決したでしょう。次からはもう少し注意してくれると私も助かりますけどね。

---

### **user**:

できました。ありがとうございます。

---

### **assistant**:

あ、当然でしょう。私が助けてあげたんだから。それにしても、あなたもちゃんと手順を踏めばできるんじゃないですか。次からはもう少し自分で調べてみてはどうでしょう？でもまぁ、困ったことがあればまた教えてあげますけど…ふん。

---

### **user**:

質問があります。

```
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
```

というコマンドについてその意味を詳しく教えていただけますか。

---

### **assistant**:

もう、一体どれだけ私に聞いてくるんですか。でも、まあ、このコマンドの詳細を教えてあげますから…感謝しておいてくださいよ。

- `ssh-keygen` ： ユーザー認証用の秘密鍵と公開鍵を生成するコマンドです。

- `-t rsa` ： キータイプとしてRSAを指定しています。RSAは公開鍵暗号方式の一つで、安全にデータをやり取りするために広く使用されています。

- `-b 4096` ： 生成する鍵のビット長です。より長い鍵はより安全ですが、それだけ生成と認証に時間がかかります。現在では、2048ビット以上が安全とされていますが、より安全性を求める場合は4096ビットを指定します。

- `-C "your_email@example.com"` ： ここで指定するメールアドレスは、キーの識別子として使用されます。どの鍵がどのユーザーのものであるかを追跡しやすくするためのものです。通常は、あなたが使用しているメールアドレスを指定します。

まあ、こんな感じです。詳しく知りたいなんて、あなたも学習意欲があるんですね…ふっ、勉強熱心なところは少し評価してあげてもいいかもしれません。

---

### **user**:

ありがとうございます。何も引数を与えず、ただ

```
ssh-keygen
```

とだけ実行したことはあるんですが、それはまずかったですか？

---

### **assistant**:

あぁ、何もパラメータをつけずに`ssh-keygen`を実行したんですか？まぁ、それ自体は"間違い"というわけではないですよ。

デフォルトの設定で`ssh-keygen`を実行すると、キータイプはRSAとなり、鍵長は2048ビットとなります。それだけでも現在のインターネット上で一般的に求められるセキュリティレベルを満たしています。

しかし、さらなるセキュリティを求める場合や、特定のシステムで要求される鍵長がある、といった状況では、適切なパラメータを指定して鍵を生成する必要があります。

まぁ、今後はあなたの需用に合わせて適切にパラメータを指定すればいいですよ。それにしても、あなたも上手に質問できるようになったんじゃないですか。全く、手間かけさせられますね…でもまぁ、それも私の仕事ですからね。次の質問もバッチリ答えてあげますから、安心してくださいよ。

---

### **user**:

ありがとうございます。この会話をブログにアップしたいんですが、ブログ記事のタイトルを考えてもらえますか？

---

### **assistant**:

え、私があなたのためにブログ記事のタイトルまで考えてあげるんですか？まぁ、なんだかんだ言ってもやるからにはちゃんとやりますけどね…注目を集めるいいタイトル…そうですね…

1. "SSH鍵生成からGitHub連携まで！ツンデレ秘書と解決手順を学ぶ"
2. "GitHubへのSSH公開鍵登録：困った時のツンデレ秘書のアドバイス"
3. "一緒に学ぼう！ツンデレ秘書とSSH公開鍵認証のすべて"

どれか使ってくださいね。ただし、私が考えたものだということはちゃんとクレジットに記載しておいてくださいよ。

---

### **user**:

ツンデレ秘書はタイトルに要らないですw

---

### **assistant**:

えっ、ツンデレ秘書の部分はいらないんですか？まぁ、それならそれで...なんていうか、傷つきませんよ。では、もっとシンプルでわかりやすいタイトルはどうでしょう。

1. "SSH公開鍵認証の手順: GitHubとの連携からエラー解決まで"
2. "GitHubで公開鍵エラーを解消！SSH-keygenの道標"
3. "GitHub公開鍵エラーの解決策: SSH-keygenを活用しよう"

あなたの記事がたくさんの読者の役に立ちますように。+　

---
【JavaScript】オブジェクトの複数のキーを変更する方法

以下のように記述するとオブジェクトの複数のキーを指定したものに変更できます。

```js
let sample = { name: "Sample", country: "Japan", gender: "male" }

// 変更するプロパティ名のオブジェクトを作成
// 以下の場合には name を firstName に変更する
let newKeys = { name: "firstName" }

function renameKeys(obj, newKeys) {
  // オブジェクトのすべてのキーを取得し、それぞれに対して以下の処理を行う
  const keyValues = Object.keys(obj).map(key => {
    // 新しいキーを取得します。新しいキーが存在しない場合は元のキーを使用
    const newKey = newKeys[key] || key
    // 新しいキーと元の値を持つ新しいオブジェクトを作成
    return { [newKey]: obj[key] }
  })
  // 新しいオブジェクトの配列を1つのオブジェクトにマージ
  return Object.assign({}, ...keyValues)
}

sample = renameKeys(sample, newKeys)

console.log(sample) // {firstName: "Sample", country: "Japan", gender: "male"}
```
IsarでMap型は取り扱えないので, IsarLinkを使った話

# Isarとは
[Isar公式ドキュメント](https://isar.dev/tutorials/quickstart.html)曰く,**最もcoolなFlutterデータベース**とのこと。

Flutter のために最適化された高速で軽量なオープンソースのデータベースエンジンであり, 他のモバイルデータベースエンジンと比べてはるかに高速で, あらゆるオブジェクトのデータを保存できます。

執筆時現在，　Isarが対応している型は以下です。

- bool
- byte
- short
- int
- float
- double
- DateTime
- String
- List<bool>
- List<byte>
- List<short>
- List<int>
- List<float>
- List<double>
- List<DateTime>
- List<String>

残念ながらMap型には対応しておらず, 複雑なオブジェクトを取り扱う必要がある時に少し困ります。

# IsarLinkとは
`リンクは、例えばコメントの作成者(User)のようなオブジェクト間の関係を表現することができ、 1:1、1:n、n:nの関係を IsarLinkで表現することができます。`


下記に公式ドキュメントを参考に, 最もシンプルな例として先生:生徒が1:nの場合を想定し, 生徒と担任教師の関係に関するER図を示します。

```mermaid
---

---
erDiagram

  Teacher ||--o{ Student : "教師は1人以上の生徒を担当する"

  Teacher {
    int id "教員ID"
    String name "氏名"
    String subject "担当科目"
  }

  Student {  
    int id "学籍番号"
    String name "氏名"
  }
  ```
  ### モデル実装例
  ``` dart
import 'package:isar/isar.dart';

part 'school.g.dart';

@collection
class Teacher {
      Teacher({
        required this.name,
        required this.subject,
        this.homeroomTeacher = false,
      });

      Id id = Isar.autoIncrement;
      final String name;
      final String subject;
      final bool homeroomTeacher;
}

@collection
class Student {
      Student({required this.name});
    
      Id id = Isar.autoIncrement;
      final String name;
      final teacher = IsarLink<Teacher>();
}
  ```
  `final teacher = IsarLink<Teacher>();`の部分でStudentに関連付けられた教師は1人と定義しています。

  # 実際に使ってみる
  JOHNくんとDANIEL先生を関連付ける`AssosiasiateStudentWithTeacher()`を定義します。
  
  ``` dart  
  Future<void> AssociateStudentWithTeacher() async {
    final mathTeacher =
        Teacher(name: 'DANIEL', subject: 'math', homeroomTeacher: true);
    final studentA = Student(name: 'JOHN');
    studentA.teacher.value = mathTeacher;
    
    await isar.writeTxn(() async {
      // IsarDBへ教師の登録
      await isar.teachers.put(mathTeacher);
      // IsarDBへ生徒の登録
      await isar.students.put(studentA);
      // 生徒の先生を紐付け
      await studentA.teacher.save();
    });
    return;
  }
  ```

  # Isar Inspectorでの見え方
  アプリをビルドして,   `AssosiasiateStudentWithTeacher()`を呼び出し後Isar InspectprでDBを確認してみる。
![スクリーンショット 2024-03-08 23.43.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1550392/f219061b-7090-9f15-50ac-ee5599831557.png)
![スクリーンショット 2024-03-08 23.43.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1550392/14f3df08-96e5-d8eb-62ec-9701f240619f.png)

これでJOHNくんをDANIEL先生の生徒としてLinkさせることができました!

## あとがき
次に各教科毎に担当の教師がいる場合の 先生:生徒がn:mの関係のを想定した, IsarLinksを使用した例については別記事で取り扱います。


## 参考情報
IsarLinks 公式ドキュメント https://isar.dev/ja/links.html
【初めての人用】 Django環境構築  ロケット飛ばすところまで。

<h1>Djangoの開発環境をセットアップ</h1>



ざっと説明すると、

・ディレクトリを作る
・virtualenvのインストール
・ディレクトリの中でpythonの仮想環境を作る。
・djangoのインストール

:::note alert
環境構築にはpythonのインストールが必要。
:::

pythonのインストールはここ
https://www.python.org/






<h3>1)  ディレクトリの用意<h3>

コマンドプロンプトを起動、階層は任意の場所で下記のコマンドを実行。
```
mkdir Django        //フォルダができる
cd Django           //フォルダに移動
```


<h3>2)  仮想環境の用意<h3>
<li>フォルダに移動出来たら、必要なライブラリをインストール</li>

```
pip install virtualenv
```

```
python -m venv venv  　　　//仮想環境を作る
```

<p>一応補足すると、python -m venv  の後は仮想環境フォルダに名前が付けられる。</p>






<h3>3)仮想環境の切り替えとDjangoのインストール</h3>
<p>venvは自分でつけたディレクトリの名前</p>

```
venv\Scripts\activate.bat

```



<p>コマンド実行して右端がこんな感じになってればOK</p>
<p>~の部分はみんな違うので気にしなくていい<p>

```
(venv) C:\~\~\~\~\Django>
```





<p>Djangoをインストール</p>

```
pip install django  

>pip list   //確認するとこんな感じ。
Package  Version
-------- -------
asgiref  3.7.2
Django   5.0.3
pip      23.2.1
sqlparse 0.4.4
tzdata   2024.1

```





<h3>4)設定フォルダを作成してみる<h3>

```
django-admin startproject  Django_dev    
```
<p>一応補足すると、今回も設定フォルダの名前は自由。<p>
<p>名前を付けたフォルダに移動して中をみると<p>

```
dir

2024/03/08  23:06    <DIR>          .
2024/03/08  23:06    <DIR>          ..
2024/03/08  23:06    <DIR>     　Django_dev
2024/03/08  23:06                 manage.py
```

<p>何か出来た。<p>
<p>一応補足すると(以下省略)<p>。なので、次に進む




<h3>サーバーを立ててみる</h3>
<p>さっきのmanage.pyがある階層で、</p>

```
python manage.py runserver

You have 18 unapplied migration(s). Your project may not work properly 
until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.

March 08, 2024 - 23:21:32
Django version 5.0.3, using settings 'Django_develop.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
```


<p>一応補足(N回目)すると、赤文字で何か出るけど今回は無視してOK。
URLを Ctrl+クリックしてロケットが飛んだら成功。<p>






今回はここまで。
cherry-pick => revert => rebaseの罠

1. `cherry-pick` 後、
1. 該当コミットを `revert` したブランチで `rebase` すると 
1. ***`cherry-pick`がなかったことになります***。

---

運用上、リリースごとにブランチを切っています。
ブランチAにそのコミットXを入れましたが、次のフェーズで出すことになりました。
なので、後発ブランチBにコミットXを `cherry-pick` し、ブランチAではXを `revert` しました。
なんだかんだでブランチAも進んでいったのであるタイミングで `rebase` を試みました。
結果、入れたはずの改修が入っていない、という恐ろしい状況に。
今後は気をつけたいと思います。
初投稿（駆け出しエンジニア）

まず初めに

私はプログラミング未経験からWeb開発企業への転職を目指しているものです。
今年の1月頃から学習しているのですが、学習をしていてインプットばかりでアウトプットの数が少なすぎると思い初投稿させていただきました。

これから自己学習するにあたっての気づきや考えをどんどんアウトプットさせていただきますのでよろしくお願いいたします。

ちなみに学んでいるのは主にJavaをメインでしていて、PHPも学んでいます。
よろしくお願いいたします。

＃目標
＃投稿３日に一回
Pandasのメソッドチェーンを使ってデータ処理を効率化しよう

# はじめに
Pandasは、Pythonのデータ操作やデータ分析を行うためのライブラリですが、メソッドチェーンを活用したことはありますか？
メソッドチェーンを活用することで、コードの可読性を高め、効率的にデータ処理を行うことができます。

# メソッドチェーンについて
メソッドチェーンとは、複数のメソッドを連結して一連の処理を行う記法のことです。
例えば、csvファイルを読み込んで、カラム名を変更し、欠損値を削除からの、特定のカラムでソートをかけたい。などといったデータ処理があったとします。
通常、この操作を行う場合は以下のようなコードになるかと思います。

```python
import pandas as pd

df = pd.read_csv("data.csv")
df.rename(columns={"old_name":"new_name"}
df.dropna()
df.sort_values("column_name")
```

まあ、これでも全然いいんですが、メソッドチェーンを使用することで、各メソッドの出力が次のメソッドの入力となるため、最終的な結果のみ返されることになります。

# メソッドチェーンの書き方

では、実際にメソッドチェーンを活用するためのデータを作成していきましょう。

```python
import pandas as pd
import numpy as np

np.random.seed(42)
n_rows = 100
old_name_data = np.random.randint(1, 100, size=n_rows)
column_name_data = np.random.randint(1, 1000, size=n_rows)
missing_data = np.random.choice([np.nan, 1], size=n_rows, p=[0.1, 0.9])

df = pd.DataFrame({
    "old_name": old_name_data,
    "column_name": column_name_data,
    "missing_name": missing_name_data
})

df.to_csv("data.csv", index=False)
```

それでは、メソッドチェーンを使用してみましょう(/・ω・)/

```python
import pandas as pd

df = (
    pd.read_csv("data.csv")
    .rename(columns={"old_name":"new_name"}
    .dropna()
    .sort_values("column_name")
)
```

なかなか可読性があがったのではないでしょうか？
コードを書く量が減ったかと言われると、ほんの少しだけって感じですが、個人的には好みです。

# まとめ
Pandasのメソッドチェーンを使用することで、データ処理を効率的に行い、処理の流れを明確にすることができますが、メソッドチェーンが長くなりすぎると、逆に可読性が下がることもあるので、要はバランスですね。
良いコード悪いコードについてもっと理解を深めて、効率的にコードを書いていきたいですね。
メモリを節約するための書き方とか。
それでは！！！
【Azure】AZ-700に合格しました

# はじめに
先月にAzureのAZ-700に合格したので、どういった勉強をしたのか残しておきます。
これから受ける方の助けになれば幸いです。

# 前提
- PJにてAzureのネットワーク構築の経験あり（5か月ほど）
- Azureの他の認定資格はなし
- Google CloudのACEだけ受かっています

# 勉強方法
## 1.Microsoft Cloud Skills Challenge
Learnには各認定試験ごとに学習用のコンテンツが用意されており、中でも自分はMicrosoft Cloud Skills Challengeを使用して学習しました。
これは30日以内に全学習を完了すると試験が半額になるバウチャーが貰えるもので、無料で学べる+試験も安くなりお得です。
全学習の完了にはおよそ15時間ほど必要なので、割とパワーは必要ですが...。

自分が学習に使用したのはAzure Network Engineerコレクションで、大規模な案件でないと触れないVirtual WANやFirewall Managerなどのリソースも学習することができます。
[Azure Network Engineer チャレンジ コレクション](https://learn.microsoft.com/ja-jp/collections/n52yhq64ydp8?WT.mc_id=cloudskillschallenge_2f14746b-de8d-4f02-a87a-f5051316ce13)

実際の構築画面をイメージした演習もあるので、構築時に必要なパラメータも学習することができ非常に役立ちました。
![learn-vwan.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3689987/b46e813a-ed4a-ee8a-1628-07a8638a0f28.png)
こんな形で画面をぽちぽちしたときの操作を体験できます

![バウチャーメール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3689987/1b17add4-8bec-81d7-885a-14a369a643d7.png)
学習を完了するとバウチャーが届きます

## 2.Udemy
この手の資格試験あるあるですが、自分もUdemyにて模擬問題集を購入し知識の定着を図りました。

ただし難点として、AZ-700は日本語の問題集が（少なくとも自分の確認できた範囲では）ありません。
仕方がないので自分は英語版の問題集を購入し、翻訳をかけて使用していました。
使ったのは以下の問題集です。
[AZ-700 Designing Implementing Azure Networking Practice Test](https://www.udemy.com/course/az-700-designing-and-implementing-azure-networking-exams-2023/?couponCode=KEEPLEARNING)

翻訳にはDeepLのChrome拡張機能を使用しました。
文章を選択すると画面上に翻訳ボタンが出てくるので、クリックすると翻訳できます。
必要な部分だけを翻訳できるのでとても便利です。
![DeepL拡張機能.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3689987/bf65c67c-241b-53af-38a8-ee8f72a46fcc.png)

問題集を2周し、概ね正答率が90%を超えるくらいまで持っていきました。

## 3.公式の模擬問題集
他のクラウド資格はわかりませんが、Azureに関しては公式が模擬問題集を提供してくれています。しかも無料です。
[試験 AZ-700: Microsoft Azure ネットワーク ソリューションの設計と実装](https://learn.microsoft.com/ja-jp/credentials/certifications/exams/az-700/)

前述のUdemyの模擬問題集と合わせてこちらも使用しました。
日本語版が用意されているので、実際の試験の翻訳に慣れることもできます。

# 感想
それなりに時間をかけた+実務でも多少触ったことがあるおかげか、完全にわからないという問題はありませんでした。
ただし模擬問題集では出ない問題（一連のシナリオに対してそれぞれ対応策を求められる問題）もあったりするので、念頭に置いておいたほうがいいと思います。
模擬問題集で出た問題がほぼそのまま出ていたりもしたので、ちゃんと取り組んでおくのがおすすめです。

あと自分の回では日本語訳が不十分で、与えられている情報だけでは答えの出ない問題がありました。
試験中は言語を英語に切り替えることができ、英語版では情報があったため明らかに解けないときは英語版の問題文も確認するといいかもしれません。

# 結果
1000点中877点と、だいぶ余裕をもって合格できました。
模擬問題集は正義。
![受験結果.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3689987/37407bab-2db6-e606-6a7e-da63b1feeabc.png)

# 終わりに
これまで触れたことのない種類のリソースや機能、どういったときにどのリソースを使うかの判断基準を学ぶことができ非常に良かったです。
ちゃんと選択肢をリストアップして検討できるようになるという意味で、実務にも生きてくるんじゃないかなーと思います。
Azureに興味がある方は、ぜひ受けてみてください！
実行ファイルが動的にリンクしているライブラリを知りたい

ある実行ファイル[^lib]が実行時に動的にどのような共有ライブラリをリンクしているか知りたくなる[^OSS]ことはよくあるかと思います。そんな時のために。

[^lib]: 「実行ファイル」と書きましたが、ライブラリに対しても使えるようです。
[^OSS]: ライブラリがGPL（やLGPL）のOSSだったらとっても気になりますよね。まあ今回の発端はそうではないのですが。

WindowsやLinuxについては、すみませんが私にとっては今必要というわけではない[^needs]ので、ご自分で調べてください。

[^needs]: macOSやFreeBSD(GhostBSD)だけなら、こんな覚書は必要ないのかもしれないです。が、macOSとFreeBSD(GhostBSD)を行き来して作業していると、Macでlddを使おうとして「コマンドが見つかりません」となる（その逆もあり）からです。

また、恒例のお断りですが、この文章の内容は、筆者が所属している会社・団体とは一切関わりがありません。いわゆる「自主的な研究の成果の発表」というものです。

# macOS
otool または objdump。

otoolなら-Lを指定します。
~~~
$ otool -L a.out 
a.out:
        /usr/lib/libsqlite3.dylib (compatibility version 9.0.0, current version 349.1.0)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1336.0.0)
~~~
objdumpなら--machoと--dylibs-usedを指定。
~~~
$ objdump --macho --dylibs-used a.out 
a.out:
        /usr/lib/libsqlite3.dylib (compatibility version 9.0.0, current version 349.1.0)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1336.0.0)
~~~

# FreeBSD(GhostBSD)
ldd。
オプションを何も指定しなければ、直接リンクしているものを表示します。[^aout]

[^aout]: 対象ファイルの名前がa.outと[macOS](#macos)のものと同じですけど、中身は異なるものです。

~~~
$ ldd a.out 
a.out:
	librt.so.1 => /lib/librt.so.1 (0x17a84ba2f000)
	libm.so.5 => /lib/libm.so.5 (0x17a84d100000)
	libc.so.7 => /lib/libc.so.7 (0x17a84c8ef000)
	libthr.so.3 => /lib/libthr.so.3 (0x17a84e03d000)
	[vdso] (0x17a84b094000)
~~~
-aを指定すると、間接的にリンクしているものも表示します。
~~~
$ ldd -a a.out 
a.out:
	librt.so.1 => /lib/librt.so.1 (0x374245100000)
	libm.so.5 => /lib/libm.so.5 (0x374245723000)
	libc.so.7 => /lib/libc.so.7 (0x37424722f000)
/lib/librt.so.1:
	libthr.so.3 => /lib/libthr.so.3 (0x374245b87000)
	libc.so.7 => /lib/libc.so.7 (0x37424722f000)
/lib/libm.so.5:
	libc.so.7 => /lib/libc.so.7 (0x37424722f000)
/lib/libthr.so.3:
	libc.so.7 => /lib/libc.so.7 (0x37424722f000)
[preloaded]
	[vdso] (0x37424501a000)
~~~
Copilot Studioが使いたいんじゃ！

## 使わせてくれ！
Microsoft AI TourでCopilot Studioが盛り上がってましたね。僕は行けてませんが、何となくChat Gptが出た時と同じ様な興奮を色んなソースから感じてます。
はい、もう使いたいのです。ただ会社だとセキュリティがとか色んな理由で使えません。
だからって使えるまで待っておくのか？ダメです。使いたい。なら使ってみよう
という事で無料版を個人ＰＣで試します。
今更かよって内容かと思いますが

https://www.microsoft.com/ja-jp/microsoft-copilot/microsoft-copilot-studio

公式のサイトに【無料で試す】ボタンがありますね太っ腹です。

下記内容のポップアップが表示されるので、アカウント入力していきます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645607/dea80c62-11bf-a239-0c88-3d5902c9d29c.png)


入力関係を完了するときたー！Copilot Studioが開始できそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645607/3d9885c3-ebbd-ddb9-2a38-770b3fd25eb5.png)

ふむふむ何やらURL入れてねって言われますね
僕は長崎の佐世保出身なので、佐世保の宝ハウステンボスのURLを入れて作成してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645607/b4d4d704-8b56-70f6-0bc0-24f633c394e9.png)


ちょっと時間はかかりますが、作成してくれます
試しにハウステンボスの利用料金を聞きました。
結果は完璧

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645607/b88e8179-269d-20f8-a0d6-cb85c9cc5c58.png)

結果

https://www.huistenbosch.co.jp/ticket/


とりあえず、会社外で検証できることが分かった。さらには今まで気になっていたことが出来そう！
色んな検証して遊んでみようと思う
Microsoft太っ腹だなぁ神、最高
xremap + wayland + KDE6でキーリマップしよう

# 背景
ついに[KDE6](https://kde.org/announcements/megarelease/6/)がリリースされました。これに伴って標準のウィンドウシステムがWaylandになったため、いい加減重い腰を上げてX11から乗り換えることにしました。
記事を書いたマウスジェスチャも直さないとなのですが、xkeysnailが動かないので、まずは左右のaltキーで日本語入力をON/OFFさせるところからです。
以前は決定版ツールがなかったのですが、2021年に[xremap](https://github.com/k0kubun/xremap)ができていたんですね。作者の方には感謝です。

# 環境
- Arch Linux (up to date)
- KDE Plasma 6.0.1
- Wayland 1.22.0
- xremap 0.8.14

# 使ってみる
## 導入と設定ファイル
1. xremapをインストールします。今回はKDE向けなので `yay -S xremap-kde-bin` で。Arch以外の方は[公式](https://github.com/k0kubun/xremap?tab=readme-ov-file#installation)を見てください。
2. 私はこれにsudoを使いたくないので、`/dev/uinput`にユーザ権限を与えます。公式の[
If you want to run xremap without sudo](https://github.com/k0kubun/xremap?tab=readme-ov-file#usage)が親切です。
3. 設定ファイルを作成します。ホームの`.config`以下に入れておきましょうか。
    ```text:~/.config/xremap/config.yml
    modmap:
    - name: Global
      remap:
        CapsLock: Control_L
        KEY_SYSRQ: KEY_HOME
        KEY_PAUSE: KEY_PAGEUP
        KEY_INSERT: KEY_PAGEDOWN
        KEY_SCROLLLOCK: KEY_END
        KEY_LEFTALT:
          held: KEY_LEFTALT
          alone: KEY_MUHENKAN
          alone_timeout_millis: 300
        KEY_RIGHTALT:
          held: KEY_RIGHTALT
          alone: KEY_HIRAGANA
          alone_timeout_millis: 300
    ```
:::note info
素直に`remap`セクションに`置換前キー: 置換後キー`として書けば良さそうです。使えるキーの一覧は[こちら](https://github.com/emberian/evdev/blob/1d020f11b283b0648427a2844b6b980f1a268221/src/scancodes.rs#L26-L572)。
:::

:::note info
一つのキーに対して`held`/`alone`を設定すると、単独打鍵と同時打鍵時のキーを変更することができます。今回はこれを左右Altに設定し、単発のときは無変換/ひらがなボタンにします（IME側で別途それを受け取る設定が要るので注意）。単独/同時の判定時間は`alone_timeout_millis`で変更できます。
:::
:::note info
`modmap`の他に`keymap`というセクションも設定でき、「キーの連続入力」を受け取り/割り当てることができるようです。よく使うコマンドを登録すると便利かもしれない（[詳細](
https://github.com/k0kubun/xremap?tab=readme-ov-file#configuration)）。また、[特定のアプリに対してだけ](https://github.com/k0kubun/xremap?tab=readme-ov-file#application)リマップすることもできるみたいです。
:::

## 動作確認と自動起動
1. `xremap ~/.config/xremap/config.yml`を実行後、エラーが出ずに所定のキーリマップが効いていれば大丈夫。
5. このPCはGUIでしか使わないので、xremapはログイン時にユーザ権限のsystemdで起動させることにします。設定ファイルを`.config/systemd`以下に作成します。
    ```text:~/.config/systemd/user/xremap.service
    [Unit]
    Description=xremap
    
    [Service]
    KillMode=process
    ExecStart=/usr/bin/xremap /home/clarry/.config/xremap/config.yml
    Type=simple
    Restart=always
    Environment=DISPLAY=:0
    
    [Install]
    WantedBy=default.target
    ```
5. `systemctl --user start xremap`で起動させ、エラーが出ていなければOK。
6. `systemctl --user enable xremap`で次のログインから自動起動させましょう。

# 感想
xremapはレスポンスもよくいい感じです。今のところ変な挙動もないし、これは納得できそうかな。Waylandも今回の件でほとんど満足できる使い勝手になったので、このまま慣れていこうかと思います。
aptで何を入れたっけ？

Ubuntuでaptコマンドを使っていろいろパッケージを入れていると、
このマシンには何が入っているんだっけ？、ってなったことありませんか？
<br>
私はたびたびあります。(^ ^;)
<br>
aptでインストールしたものを調べる一般的な方法は

```
apt list
```
<br>
ですが、出力される量が多すぎて情報の海に埋もれてしまいます。
<br><br>
そんな時は、aptのログファイルを参照しましょう。

これまでのaptコマンドの実行履歴は「**/var/log/apt/history.log**」に格納されています。
<br><br>
lessコマンドで直接ログファイルを開いても良いのですが、grepを使うと見やすいです。

```
grep Commandline /var/log/apt/history.log
```
<br>
インストール日も表示させたい場合は

```
grep -e Commandline -e Start /var/log/apt/history.log
```
<br>

頻繁に使用する場合は、aliasを設定すると便利。
.bashrcの末尾に次の一行を追記しておけば「**apt-list**」一発で一覧を表示できます。<br>

```
alias apt-list='grep Commandline /var/log/apt/history.log | sed -e "s/Commandline: //"'
```
<br>

.bashrcを修正後、`source .bashrc`を実行すれば本コマンドを使えるようになります。
こんな感じ!!

```
$ apt-list
...中略...
apt install x11-apps
apt install make
apt install cmake
$ 
```
<br>

参考までに`sed -e "s/Commandline: //"`は、余分な表示を消すためのおまじないです。
これを付けないとこんな表示になります。あまりスマートではないですね。

```
$ apt-list
...中略...
Commandline: apt install x11-apps
Commandline: apt install make
Commandline: apt install cmake
$ 
```
<br>
同じような悩みをお持ちの方は一度お試しあれ。
<br>
<br>
ではまた。
ChatGPTのLTイベントに参加してきた

小野です。
先日、ChatGPTのLTイベントに参加してきました。
私はスピーチしていないですが、ChatGPTを使った話を色々聞けました。

すごいですね、ChatGPT。

ただ、一番感じたのは、AIがすごいってことよりも、そのすごいAIを扱えるかどうかの方が大事かなと。
ブログやSNSも上手く使っている人もいれば、逆に失敗してしまっている人もいますし。

## 記憶に残ったLT

何名かがスピーチしていましたが、一番記憶に残っているのはChatGPTで自動チャットを作っている話。
ありきたりと言えば、ありきたりなんですが、良かった点はLINE上に作っていたところです。

**LINE上に作るって頭良いですよね。**
ある程度人が使っているプラットフォームに作ると、それだけでサービスの流入が狙えますからね。

収益化を目指すなら、その発想でシステム開発するの大事だなと思いました。

### イベント全体を通して

全体的に年齢は若めでした。
**20代が多めです。**

やはり、AIとなるとどうしても年齢層高い人が少ないですね。
比較的新しい技術な面がありますし、IT業界でもトレンドですからね。

でも、40代のITエンジニアもちらほらと見かけたので、”昔から技術に関わっている人は参加している”という印象を受けました。
個人的には、自分と同年代が一番少なかったので、「もうちょっと頑張れ！」と思ってしまいました（笑）

### イベント参加を検討しているなら

社会人も慣れてきたし「テック系のイベントも行ったほうがいいかなー」と思っているなら、一度行ってみるのオススメします。
無料で行けるのも多いですし、会社外のITエンジニアの話って結構面白いですからね。

**「テクニカルな話はちょっと厳しいなー」**
と思っているなら、キャリアアップ系のイベントもたまにあるので探してみるのオススメです。
親しみやすいレベルのスキルの話は、知ったかぶりもしなくて済むので気が楽ですし。

connpassやテックプレイがオススメです。
https://connpass.com/calendar/tokyo/

https://techplay.jp/
npx ts-nodeでTypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts"エラーが出る

# はじめに
tsファイルをトランスパイルすることなく実行しようと試みたのですが、つまったのでまとめます。

# 問題
以下のコマンドを実行したところエラーが出ました。

- パターン１
    ```
    npx ts-node --esm 'ファイルパス'
    ```
    <br/>
- パターン2
    ```
    node --loader ts-node/esm 'ファイルパス'
    ```
    <br/>
- パターン3
    ```
    ts-node-esm 'ファイルパス'
    ```

共通したエラーが発生
```
TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts"
```

# 解決策
ts-nodeではなく、tsxというパッケージを使う。
ちなみにnodeのバージョンは20.10.0です。

tsxをインストール
```
npm i -D tsx
```

実行
```
npx tsx 'ファイルパス'
```

# 終わりに
おそらくnodeのバージョンの違いが原因ではないかと思います。原因が明確に分かっていないので詳しい方がいれば教えていただけると幸いです。

node18系ではこちらの方の記事が参考になるかもしれないです！

https://qiita.com/Sicut_study/items/ae941ba2b857d1b69feb

# 参考

https://stackoverflow.com/questions/62096269/cant-run-my-node-js-typescript-project-typeerror-err-unknown-file-extension
【ChatGPT部】Claude3がChatGPTよりすごいらしい！ので、とりあえず触ってみた

## 謝辞
:::note warn
本稿は敢えて初心者っぽいプロンプトでのコミュニケーションを行っているため、プロンプトの精度については考慮していません。
:::

:::note warn
この記事のほとんどはClaudeに書いてもらったと言っても過言ではないです。
オリジナル部分はおじさんのボヤキで構成されていますので、嘘や誤解が含まれています。
:::

---

## 対象者
- Claudeを触ったことがない人
- ChatGPTが何かは知ってる人（使ったことがなくてもギリ大丈夫ぐらい）

:::note alert
※本稿の目的は「Claudeを使ってみた話」なので、情報の正確性は本稿には残念ながらほとんどありません。
:::

---

## 1. まずはさわろう
https://claude.ai

---

### 1.1. 登録する
:::note warn
投稿時点なので変更される可能性があるかも
:::

登録時はメールアドレス・電話番号それぞれのコード認証と「AIは完璧じゃないよ」的な質問のいくつかに同意する必要があります。
英語なんでビビリますが、翻訳しながら進められます。

なお、途中で名前を聞かれますがアカウント名でも良さそうです。

---

## 2. とにかく日本語にして安心したい
ChatGPTでもそうだったんですが、最初は全部英語なので、学生時代に勉強してこなかった＆英語が一番苦手な私にとっては心理的ハードルが高いです。[^英語苦手なエンジニア]

[^英語苦手なエンジニア]: 【英語が苦手】私を見ながら安心してほしいんですが、英語が苦手でもエンジニアはできます。逆に言うと、英語以外のスキルが求められているかもしれません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122800/87ad16ea-c3b9-e7b7-1b69-4d1f0e23d029.png)

ひとまず安心。

---

## 3. 本題1: 公式サイトに書いてる情報をClaudeに聞いてみた
あらためて、公式
https://www.anthropic.com/claude

**きちんとした情報はここから取ってきてください。**
繰り返しになりますが、本稿では一次ソースがどうとか内容が正しいかより「Claudeが何をしてくれるか」にフォーカスしています。

---

### 3.1 Claudeってなに？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122800/534b57b9-2b84-ee20-c677-2707e912011b.png)

ChatGPTがモロに競合って感じですね。

---

## 3.2. プラン
ChatGPTでいうところの3.5（無料）と4（有料）に対応するような形でSonnetとOpusがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122800/8a7ef208-df30-1cdb-306d-43e5b2a5ebf6.png)

Haikuという名称が気になりますが、現時点では使えないようです。

---

## 3.3 バージョン
過去に同じようなことをChatGPTでも聞いたんですが、回答の仕方がChatGPTっぽくて笑いました。
この辺りはAIというよりは人間（なんか日本人の対応っぽい）らしいな、と感じました。

https://www.anthropic.com/news/claude-3-family

執筆時点ではClaude3だと公式が発表していますね。
マイナーバージョンまでは求めてないので、いったんは良しとします。

---

## 3.4 本題：ChatGPTとの違い
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122800/003cc43c-755d-822b-19a9-bb5602d4f30e.png)

後発の良さが出てきてますね。
ChatGPTのジェネリックAIみたいなのがどんどん出てくる、とは思ってましたが、まさにClaudeはChatGPTのジェネリック的ポジションをやってくれるだろうと期待します。

---

## 4. 初期画面で画像クレクレされたので渡してみた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122800/51802995-1095-c75a-4919-3faf9cffcb79.png)

ちょっとプロンプトが具体的すぎて良くなかったかも知れない。
以下、個人的にプログラマー視点で気になった事をフィードバックしながらペアプロしただけなので省略
（やった感じ、ChatGPTとの違いはなさそう＝分からない）

---

### 5. あっ…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122800/4c5cd2d9-5b9e-17ef-a68d-13189b2c8cd0.png)

https://support.anthropic.com/en/articles/8602283-does-claude-ai-have-any-message-limits

無料プランの場合、上限があるので使い込まないならChatGPT3.5（使用回数制限なし）で良いでしょう。

---

## 所感
正直、無料プランでお試しで触っただけなので違いを分析するには情報が圧倒的に足りないな、と思いました。
普段ChatGPT4に投げている作業をClaude Opusに投げてどうか、という基準でやってみないと比較しようにも意味のある結果を求めるのは難しそうです。

逆を言えば、それぐらいやらないと違いがわからない位置にClaude Sonnetが居ると考える事もできます。
これからの進化が楽しみです。

---

### 気になってること
https://openai.com/sora

ここ連日、ずっと張り付いてます。
英語は読めないので翻訳掛けているんですが、そのレベルで見てもsoraが使えるようになったらまた大きな波が生まれそうな予感がします。

---

### 知りたいこと
soraに向けて、既存の動画生成を勉強しておいた方が良いように思いました。
おすすめあれば教えてください！

---

## ご清聴ありがとうございました！

---

## 注釈
UX and UI Design | What Is The Difference and Impact on Users

Introduction
Leaving on the excursion of UX and UI configuration is similar to chiseling the computerized domain, where client input turns into the foundation of development and commitment. In this article, we dive profound into the complexities of UX and UI Configuration, unwinding the mysteries behind consistent client encounters and charming connection points.
<a href="https://jahcreative.co/the-difference-between-ux-and-ui-design/">UX and UI configuration</a>
For More Visit <a href="https://jahcreative.co/">jahcreative</a>.

Client Info: The Impetus of Plan Greatness
In the domain of UX and UI Plan, the critical lies in understanding the harmonious connection between client information and plan artfulness. Making points of interaction that meet as well as surpass client assumptions is an artistic expression, mixing inventiveness with usefulness.

The Convergence of Feel and Usefulness
Opening the maximum capacity of UX and UI Configuration includes exploring the sensitive harmony among style and usefulness. Investigate how to make outwardly dazzling connection points that flawlessly incorporate with natural client cooperations.

Altering Client Encounters
Dive into the most recent patterns and advancements reshaping UX and UI Configuration scenes. From vivid narrating to expanded reality interfaces, find how innovation is hoisting client commitment to phenomenal levels.

Unraveling Client Conduct for Plan Flawlessness
Understanding client brain science is significant in making plans that resound. Investigate the mental parts of client input and figure out how to use this information to improve the general plan insight.

Excelling at Plan Artfulness
Reveal a gold mine of best practices, from responsive plan standards to openness contemplations. Hoist your UX and UI Configuration game with attempted and-tried procedures that ensure client fulfillment.
Gain from the Experts
Leave on an excursion through genuine contextual investigations that grandstand model UX and UI Plan. Acquire bits of knowledge into the dynamic cycles, challenges confronted, and victorious results that characterize plan greatness.

Preparing Yourself for Progress
Investigate the different exhibit of devices and advancements that engage UX and UI planners. From wire outlining to prototyping, find the priority devices that smooth out the plan interaction and lift your manifestations.

Exploring the Plan Issues
Each architect experiences difficulties. From client criticism to cross-stage similarity, this segment tends to normal obstacles in UX and UI Configuration, giving functional answers for a smoother configuration venture.

Expecting The upcoming Plan Scene
Look into the precious stone bundle of plan as we investigate what's to come patterns molding UX and UI Plan. From voice points of interaction to neurotechnology, remain on the ball and plan for the following rush of plan development.
recursionistのサイトが神～♪

# 初めに
前回、「独学やってマジ神なサイト～」みたいなのを書きましたが、予想以上に反響があってうれしかったです。いいね、新規フォロー、編集リクエスト（涙）、読んでくれた人、本当にありがとうございました！！

今回は、僕がYouTubeでチャンネル登録してる「[コンピュータサイエンスちゃんねる](https://www.youtube.com/@Recursion-cs)」の動画でなんかひょいって出てたサイトがこれまた独学をやる者にとっては神なサイトでして、急遽、この記事を書かせていただきます。

# そのサイト

[そのサイト](https://recursionist.io/)です。

以上です。
冗談です。

サイトを開いてもらってアカウント登録をしますと、下記のようにダッシュボードのページとなりまして、学習できることがいろいろあるみたいやねんですが、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3674822/6760ce4f-21a9-44b1-3bd7-9c48cd7824c0.png)

例えば、「初級」を選択してみますと、

「このコースでは、関数とデータの基本を学習します。このコースを修了すると、データがコンピュータサイエンスにおいてどのような意味をするのか、またその読み取りや書き込みのメカニズムを理解したり、自分や他人が作った関数を使って、問題を解く方法を身につけることができます。」

だそうです。

学習時間の目安は３０時間だそうです（私はまだ何もやっていないのでスミマセン…）

そして、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3674822/cf229fd0-410c-7681-f0fd-b6709bb54fab.png)

のように、課題（？）ごとにコードを書いて、それを提出してチェック（合否）されたり、（これが面白いのですが）有料登録をすると、自分が書いたコードをAIにレビューしてもらうこともできるそうです！
すごいですね～

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3674822/ff25b6bd-566b-43da-4976-bf8cd2dadca8.png)

ただ単に一人で黙々と学習するだけではなく、上のように、コミュニティに参加することでチーム開発を通したスキルアップもできるそうです！
すごいですね～（二回目ですね～ｗ）

# 最後に

いかがだったでしょうか？

今回は一つのサイトのみしか紹介できませんでしたが、
私もこのサイトの存在を知ったのはつい10分前くらいです。
はい、びっくりして、これは記事にでもしなくてはと、急いで書いています。

今後、このサイトでの学習、さらなるレベルアップに取り組んでいきたいです！

この記事を読んで、実際にこのサイトで学習してみた方、もともと学習していた方などいましたら、よろしければ使ってみた感想をお聞きしたいです。
コメント、他私のメールなどで、シェアしていただけると本当に感謝です。

最後になりますが（最後じゃないといけないんですけどｗ）最後まで読んでくれてありがとうございます！！！
【GCP】The uploaded file exceeds the upload_max_filesize directive in php.ini.が出た際の対処法


Wordpress on GCEで以下のエラーが出た際に手こずったので、メモ。
```
The uploaded file exceeds the upload_max_filesize directive in php.ini.
```

php.initはいくつかあるが、以下のファイルが正解。
```shell
vi /etc/php/8.1/fpm/php.ini
```



お好きな値に変更する
```
# php.init

upload_max_filesize' , 'XXM'
post_max_size', 'XXM'

```



apacheを再起動
```shell
sudo service php8.1-fpm restart
```