OmniAICreator/Qiita-1.07M huggingface dataset:
FreeRTOSのtagの使い方


下記の記事から続くFreeRTOSの機能に関する記事です。

https://qiita.com/tom_S/items/ea653880132e1fcfed72

この記事ではFreeRTOSのタスクが保持できる「tag」の機能に関して説明します。
FreeRTOSにおける「tag」とはタスクが保持できる一つの値もしくはポインタです。使用用途としては、何らかのエラーが起きた際のタスクの情報を格納したり、別のタスクからコールバックを呼び出したりするのに使われます。

tagは値だけでなく、関数を指定することもできます。タグはタスクの管理構造体で保存されますが、使用するのはユーザのみでFreeRTOSの動作に影響しません。
また、tagの型「TaskHookFunction_t」は下記のように関数のvoidポインタとして定義されています。
```c
typedef BaseType_t (*TaskHookFunction_t)( void * );
```

使用する際は、FreeRTOSConfig.hに、「configUSE_APPLICATION_TASK_TAG」を定義する必要があります。


## API

```c
void vTaskSetApplicationTaskTag(
                                 TaskHandle_t xTask,
                                 TaskHookFunction_t pxTagValue );
```

| 項目1 |  項目2 | 説明 |
| ------------- |  ------------- | ------------------------------ |
|機能| | タスクにtagを設定する。tagは値でも関数ポインタでも設定可能 |
| 引数 | xTask | tagを設定するタスクのID。NULLを指定した場合は呼び出し先のタスクが指定される |
|  | pxTagValue  | 設定するtagの値、もしくは関数 |


```C
TaskHookFunction_t xTaskGetApplicationTaskTag( TaskHandle_t xTask );
TaskHookFunction_t xTaskGetApplicationTaskTagFromISR( TaskHandle_t xTask );
```

| 項目1 |  項目2 | 説明 |
| ------------- |  ------------- | ------------------------------ |
|機能| | タスクのtagの値を取得する。tagに設定されているのが関数の場合はこのAPIは使用しないこと |
| 引数 | xTask | tagを取得するタスクのID。NULLを指定した場合は呼び出し先のタスクが指定される |
| 返り値 |  | タスクのtag |


```C
BaseType_t xTaskCallApplicationTaskHook(
                                         TaskHandle_t xTask,
                                         void *pvParameter );
```

| 項目1 |  項目2 | 説明 |
| ------------- |  ------------- | ------------------------------ |
|機能| | タスクのtagに設定されている関数を呼び出す |
| 引数 | xTask | 呼び出したいtagの関数を持つタスクのID。NULLを指定した場合は呼び出し先のタスクが指定される |
|  | pvParameter | tagに設定されている関数を呼び出す際に引数として設定される  |
| 返り値 |  | tagに指定された関数がNULLでなければ0を返す |

## サンプルソースコード

タスク「test_thread2」でタグを設定し、「test_thread1」でタグを取得(もしくは関数呼び出し)するサンプルを下記に示します。タスクの生成とスケジューラの開始の実装は省略しています。


```C

static void testCallback(int * testVal)
{
    *testVal = 1;
}

static void test_thread1(void * argument)
{
    int testVal = 1234;
	for( ;; )
	{
		xTaskAbortDelay( task2 );
		for (int i = 0; i < 10;i++)
		{
			BSP_LED_On(LED1);
			vTaskDelay(100);
			BSP_LED_Off(LED1);
			vTaskDelay(100);
		}

        //int tagVal = (in)xTaskGetApplicationTaskTag(task2); // tagを取得(値が設定されている場合)
		xTaskCallApplicationTaskHook(task2, &testVal); // タグに設定した関数「testCallback」を呼び出し
	}

	BSP_LED_Off(LED1);
	osThreadTerminate(NULL);
}

static void test_thread2(void * argument)
{
    //int tagInitVal = 9876;
    //vTaskSetApplicationTaskTag(NULL, (void*)tagInitVal); // tagに値を設定する場合
	vTaskSetApplicationTaskTag(NULL, testCallback); // 関数「testCallback」をtagに設定

	for( ;; )
	{
		BSP_LED_On(LED2);
		vTaskDelay(100);
		BSP_LED_Off(LED2);

	}

	BSP_LED_Off(LED2);
	osThreadTerminate(NULL);
}

```
2024 dlib/face_recogonitionを始める時に知っておきたいこと

## 結論・コアの68点顔認識は商用利用できない
リリース直前に、調べて気づいて悲しい今日このごろです。

https://github.com/davisking/dlib-models
```
The license for this dataset excludes commercial use and Stefanos Zafeiriou, one of the creators of the dataset, asked me to include a note here saying that the trained model therefore can't be used in a commercial product. So you should contact a lawyer or talk to Imperial College London to find out if it's OK for you to use this model in a commercial product.
```
### 代案

どれも大変です。点を打って、hyperparameterをサーチするだけでいい。dlibが一番楽に思えてきます。

- Mediapipe - https://huggingface.co/spaces/hysts/mediapipe-face-detection
- OpenVINO - https://github.com/openvinotoolkit/openvino
- Transformer DETR - https://huggingface.co/docs/transformers/main/ja/model_doc/detr
- HRNet - https://github.com/HRNet/HRNet-Facial-Landmark-Detection
- dlibで自分で作る 

### dlibについて
#### 大雑把に３種類あります。
　まず、初期段階で、顔の範囲を取れないのは、デフォルトのHog顔 Detectionの問題で、Precitionをいくら訓練しても無駄です。顔の範囲取得に、***dlib.simple_object_detector***を訓練するか、CNN版を使いましょう。

- bool値を返す - recognition - 顔が存在するか判定
- Rectを返す - detection - 顔の範囲を返す
- Pointを返す - prediction - 顔のパーツの位置を返す
#### hyper-parameterです。
datasetの数と質で、最適な設定は異なります。
面白いことに、複雑にすればいいというわけじゃないです。

　一つ言えるのは、ランダムで多少変わる。split_testを1000ほどすると、時間かかるけど、かなり減らせる。
 
 　一番いいのは、data数を増やす気がします。
AWS Certificated Solution Architect - Associateに合格した

![AWS Certified Solution Architect Associate.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2503918/dc1f8b3c-edd1-10dd-38b4-46b9ae6e26cb.png)

# 本記事から得られること
- SAA合格のために用いた教材集
- 勉強方法
- 自分でも合格できるという自信

# こんな人向け
- SAAをこれから受験しようと思っている
- 1-2ヶ月学習のための時間がある人
- なんとしてでも合格しないといけない人

# 自己紹介 👨‍💻
自社開発のWeb開発企業で働いているエンジニア2年生です。

「業務でAWSを触る機会を増やしていこう！」と2年目に突入してから意気込んでいたのですが、全くAWSが分からない！

というわけで資格取得を学習のマイルストーンにして、5月くらいからAWSやインフラ関連の学習を始め、SAAの前哨戦として6月にCloud PractitionerというAWSの初歩資格を取得しました。

7月末にSolution Architect Associate（以下SAA）を受験し、なんとか合格できたので、その体験記を残しておこうと思います。


# 内容
## 使った教材
AWSが出している公式のデジタルトレーニング動画とUdemyの講義動画・模擬試験を使いました。
それぞれ紹介していきます。

### AWS
#### 1. [Exam Prep Standard Course: AWS Certified Solutions Architect - Associate (SAA-C03 - Japanese)](https://explore.skillbuilder.aws/learn/course/13269/aws-certified-solutions-architect-associate-official-practice-question-set-saa-c03-japanese)

この講義では、以下の内容を学ぶことができます。
```
- SAAの概要
- 試験のトピック
- 必要な知識のインプット
```
概要の理解は学習の効率に影響するので、先に把握しておくと良いと思います。

この講義では概要だけでなく、試験範囲に対する簡単な講義も用意されていますので、導入でこれを使うのもありだと思います。

#### 2. [AWS Certified Solutions Architect – Associate Official Practice Question Set (SAA-C03 - Japanese)](https://explore.skillbuilder.aws/learn/course/13269/aws-certified-solutions-architect-associate-official-practice-question-set-saa-c03-japanese)

これは類似問題が解ける教材で、現在のレベルと求められるレベルの乖離を知るために受講しました。
1-2ヶ月後に解かなければいけないレベルを先に知っておくことで、学習計画が立てやすくなります。

受講したことで「Cloud Practitioner合格したけど全然分からん。結構やらないと受からないかも」と学習前に差分を確認でき、焦りを自ら作り出すことに成功しました。

### Udemy
#### [【ベストセラー完全日本語化】AWS 認定ソリューションアーキテクト アソシエイト SAA-C03 対応 2023 最新版](https://www.udemy.com/course/jp-aws-certified-solutions-architect-associate-2021/)

資格取得目的が「実務で使えること」だったので、ハンズオン含めた教材をメインとして使っていました。初歩の知識がなくても、これをやってホワイトペーパー見れば十分でした。

#### [【SAA-C03版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集（6回分390問）](https://www.udemy.com/course/aws-knan/?couponCode=MCLARENT71824)
一通りインプットが終わった後に使っていました。
この教材の良かった点は、模擬試験終了後に試験問題の分析結果が出るところです。
分野の正答率が表示されるため、復習がしやすいです。


## 学習の進め方
### 学習期間
2024年6月頭〜7月下旬
仕事が終わってから毎日1-2hのペースでやってたので約2ヶ月くらいかかりました。

### 学習方法
試験のための勉強というよりは実務で使えるようになることが目的だったので、ハンズオンを丁寧にやりながら学習を進めました。

Chapter1から順に進め、ボリュームが多いChapterに関しては長く時間が取れる休日にまとめてやってました。



# 最後に

実務で使うことを目的として取得しましたが、転職活動時に「取得しておいて良かった」と思える瞬間がありました。

学習途中、難しい箇所にぶち当たった時「もう辞めてしまいたい」と思いましたが、「あの時最後までやって良かったな」と未来の自分に感謝される日が来るので、決めたものは諦めずにやり切るのが吉ですね。


ある程度時間取れる方であれば予備知識0でも合格できる試験だと思います。もし不安があれば、私と同様 Cloud Practitionerから受験することをおすすめします！

皆さんの合格を心からお祈りしております🎉
VBAで選択中の画像の縦横比を100％にする

Excelでマニュアル作成等を行い、スクリーンショットを画像で貼ることがよくあると思います。
この画像の縦横比がおかしくなっていて、画像内の文字が変につぶれていることがありませんか？

特に画像と図形をグループ化していると、ちょっとした動作で縦横比がズレてしまいがちです。

そんなときに、選択中の画像の縦横比を100％に戻すマクロを紹介します。

```vb:ExcelVBA
Sub sb選択中の画像の縦横比を100パーセントにする()

    If (TypeName(Selection) <> "Picture") Then
        MsgBox "選択しているものの全部又は一部が画像ではありません。", , "処理終了通知"
        Exit Sub
    End If
    
    Dim shapeObj As ShapeRange   '図形用変数
    Set shapeObj = Selection.ShapeRange
    
    With shapeObj
        .LockAspectRatio = msoTrue   '縦横比が固定
        .ScaleHeight 1, msoTrue      '縦横比が固定の場合、高さ・幅のどちらかを100％にすれば自動でもう一方も100％になる）
    End With

End Sub
```
なお、画像ではなく、図形を選択している場合には、元のサイズという概念がそもそもないため、処理せず終了するようにしています。
画像を他に図形とグループ化している場合には、グループ化を解除してから画像のみを選択している状態で実行してください。

個人マクロブックにこのコードを保存して、リボンから実行できるようにしておくと便利です。
cscの作法 その522

# 概要
cscの作法、調べてみた。
automation見つけたので、やってみた。

# 参考にしたページ

https://qiita.com/h_tacayama/items/a85937039f6564cf90cc

# サンプルコード

```

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Automation;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace App
{
	public class EdgeAutomation {
		public void CloseTab(string targetTabTitle) {
			if (string.IsNullOrEmpty(targetTabTitle))
			{
				return;
			}
			Process edgeProcess = FindEdgeMainProcess();
			if (edgeProcess == null)
			{
				return;
			}
			AutomationElementCollection edgeWindows = FindEdgeWindows(edgeProcess.Id);
			if (edgeWindows.Count == 0)
			{
				return;
			}
			foreach (AutomationElement edgeWindow in edgeWindows)
			{
				AutomationElementCollection tabItems = FindEdgeTabs(edgeWindow);
				foreach (AutomationElement tabItem in tabItems)
				{
					try
					{
						if (tabItem.Current.Name.Contains(targetTabTitle))
						{
							CloseTab(tabItem);
						}
					}
					catch (ElementNotAvailableException ex)
					{
						Console.WriteLine(ex.Message);
					}
				}
			}
		}
		private Process FindEdgeMainProcess() {
			foreach (Process proc in Process.GetProcessesByName("msedge"))
			{
				if (proc.MainWindowHandle != IntPtr.Zero)
				{
					return proc;
				}
			}
			return null;
		}
		private AutomationElementCollection FindEdgeWindows(int processId) {
			return AutomationElement.RootElement.FindAll(TreeScope.Children, new AndCondition(new PropertyCondition(AutomationElement.ProcessIdProperty, processId), new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Window)));
		}
		private AutomationElementCollection FindEdgeTabs(AutomationElement edgeWindow) {
			return edgeWindow.FindAll(TreeScope.Descendants, new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.TabItem));
		}
		private AutomationElement FindCloseButton(AutomationElement tabItem) {
			return tabItem.FindFirst(TreeScope.Descendants, new OrCondition(new AndCondition(new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Button), new PropertyCondition(AutomationElement.ClassNameProperty, "EdgeTabCloseButton")), new AndCondition(new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Button), new PropertyCondition(AutomationElement.ClassNameProperty, "TabCloseButton"))));
		}
		private void CloseTab(AutomationElement tabItem) {
			AutomationElement closeButton = FindCloseButton(tabItem);
			if (closeButton == null)
			{
				return;
			}
			InvokePattern invokePattern = closeButton.GetCurrentPattern(InvokePattern.Pattern) as InvokePattern;
			if (invokePattern == null)
			{
				return;
			}
			invokePattern.Invoke();
		}
	}
	class Program {
		static void Main(string[] args) {
			EdgeAutomation Edge = new EdgeAutomation();
			Edge.CloseTab("新しいタブ");
		}
	}
}




```

以上
Pythonで特定の文字列以降を削除する

# 特定の文字列以降を削除する（その１）
例えば、123-4567のような郵便番号みたいな文字列があるとします。
    "-"以降の部分文字列を削除したいとき、私が最初に思いつくのは、find()メソッドを使うやり方です。find()メソッドは、指定した部分文字列が文字列内で最初に見つかる位置のインデックスを返します。
~~~Python:example1.py
s = "123-4567"
pos = s.find("-")
s = s[:pos]
print(s) # 123が出力される
~~~
上のコードは変数posを使わずに書くこともできます。
~~~Python:example2.py
s = "123-4567"
s = [:s.find("-")]
print(s) # 123が出力される
~~~
# 特定の文字列以降を削除する（その２）
その次に考えられるのが、split()メソッドを使うやり方です。
今度は怪しげな？メールアドレスの@以降（ドメイン名）を削除してみます。
~~~Python:example3.py
s = "hogehoge@Junkmail.com"
s = s.split("@")[0]
print(s) # hogehogeが出力される
~~~
# 特定の文字列以降を削除する（その３）
私は知らなかったのですが、partition()メソッドを使う方法もあります。
~~~Python:example4.py
s = "hogehoge@Junkmail.com"
s = s.partition("@")[0]
print(s) # hogehogeが出力される
~~~
split()メソッドとの違いは、partition()メソッドは指定した区切り文字で文字列を分割し、**３つの部分**に分けるということです。すなわち、分割する文字列の前半、**区切り文字**、分割する文字列の後半に分けられます。（知らなかったので自分用の備忘録です。）
2024/10/1主にITとかセキュリティの記事

AIを活用したセキュリティは何を変えるのか？　「知的なデータインフラ」構想に迫る(9/29)
https://news.yahoo.co.jp/articles/2de6fe145a55231910dc3f27406eb58942fe5ebf?source=rss

X(旧Twitter)に続きMetaもFacebook・Instagram・Threadsでトランプ陣営から流出した内部文書へのアクセスをブロック(9/29)
https://gigazine.net/news/20240929-meta-block-jd-vance-dossier-hack/

オランダ 個人データ庁 意見募集 「操作的欺瞞的、搾取的なAIシステム」(9/29)
http://maruyama-mitsuhiko.cocolog-nifty.com/security/2024/09/post-4406e3.html

阿蘇市の不正アクセス事件から学ぶ自治体のサイバーセキュリティ強化策
https://cybersecurity-park.com/3055/

サイバー攻撃を引き寄せる「ハニーポット」は何のためにある？(9/29)
https://ascii.jp/elem/000/004/224/4224602/?rss

Mango DAO、未登録証券販売でSECと和解｜罰金とMNGOトークンの上場廃止へ(9/29)
https://crypto-times.jp/news-mango-dao-settles-with-sec/

QRコードを貼ってるメールに詐欺の匂いが！(9/29)
https://ascii.jp/elem/000/004/224/4224600/?rss

韓国 個人情報保護委員会 事例付き「自動化された決定に対する情報主体の権利ガイド」を公開(9/29)
http://maruyama-mitsuhiko.cocolog-nifty.com/security/2024/09/post-d437df.html

アクセスキーを使ったaws-cliはもうやめよう！(9/28)
https://qiita.com/s_moriyama/items/14b703cc0dfa91a6f464

現金からクリックへ:サウジアラビアの電子決済革命(9/28)
https://www.arabnews.jp/article/business/article_130388/

【ナゼ？】期待と不安が入り混じる『給与のデジタル払い』開始　国が“キャッシュレス決済の比率80％”を将来的に目指す「2つの理由」(9/29)
https://news.yahoo.co.jp/articles/ced46b6734e647eeeff126d11982bb95a771d13c?source=rss

導入が進む次世代AGVによる並列搬送と課題(9/30)
https://xtech.nikkei.com/atcl/nxt/column/18/02927/092400002/

ランサム攻撃の初動　復旧を成功させる勘所(9/30)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600014/092600187/

グーグルやモジラが証明書を無効化　強権の発動に踏み切った業界事情 米エントラスト(9/30)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600011/092600164/

世界最大の認証局Let's EncryptがOCSPサポート停止、企業ユーザーにも影響(9/30)
https://xtech.nikkei.com/atcl/nxt/column/18/02958/092600001/

AI活用は攻めと守りのバランスが大切、GOでの使い方を教えよう(9/30)
https://xtech.nikkei.com/atcl/nxt/column/18/02952/092000005/

安定稼働中のネットワークでトラブル勃発、堅実な切り分けと「ぼんやり」で原因つかむ(9/30)
https://xtech.nikkei.com/atcl/nxt/column/18/01156/091800061/

SBOM活用の難所となるツール選び、失敗しないためのポイントを徹底解説(9/30)
https://xtech.nikkei.com/atcl/nxt/column/18/02936/090600005/

プロンプトエンジニアリング（Prompt Engineering）(9/30)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600009/092500178/

「つながらない権利」尊重すべし　ITが生み出した悪しき環境断て(9/30)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600007/092600175/

能登半島地震の被害額が判明
通信大手4社で200億円超に　NTT西日本は通信ビルの廃棄も(9/30)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/041800012/091700262/

ルーターを自作する(9/30)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/091700201/091700001/
[C言語 #3] 文字コード

<!--
 <font color="c00000"></font> 赤
-->
## はじめに
こんにちは
今回は久しぶりにC言語を触りたいと思います。:keyboard:
その中でも **<font color="c00000">「文字コード」</font>** について紹介したいと思います。

:rolling_eyes:そういえばコンピュータは**0と1しかわからない**んですよね。文字も数値として扱っているんですかね
:upside_down:実はコンピュータの内部では、文字も **「数値」** として扱われています。**各文字の形に対応する数値**を<font color="c00000">**「文字コード」**</font>と言います（charactor code）。

文字コードの種類には様々なものがあります。代表的なものは **「Unicode」** **「JISコード」** があります。どの文字コードが使用されているかは、皆さんの<font color="c00000">**お使いの環境によって異なります**</font>。

## 文字コードを使う
今回はC言語で文字コードについて見ていきたいと思います。
エスケープシーケンスである **「￥○○」** や **「￥x△△」** を出力すると、指定した文字コードに対応する文字が出力されます。実際にコードで見てみましょう
```c

#include <stdio.h>
int main(void)
{
	// 文字コードをもつ文字の出力をします.
	printf("\n");
	printf("8進数101の文字コードをもつ文字コードをもつ文字は「%c」です。\n", '\101');
	printf("16進数61の文字コードをもつ文字コードをもつ文字は「%c」です。\n", '\x61');
	return 0;
}
```
使用している環境が **「シフトJISコード」** などで処理されている場合、次のような実行結果が得られるかと思います。
![スクリーンショット 2024-09-29 145353.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806875/7df43b5c-f1a6-8dce-b7b4-916c0ad1fe3e.png)
:upside_down: シフトJISコードでは8進数の「101」がA、16進数の「61」がaに対応しています。そのため、実行結果のように「A」「a」が出力されるのです。

:::note warn
このプログラムは、お使いの環境が別の文字コードを使用している場合、このように**出力されない**場合もありますのでご注意です:computer:
:::


## おわりに
今回のちょっとしたまとめになります。

:::note info
文字コードを指定して、<font color="c00000">**文字を出力する**</font>ことができる
:::
:::note info
どの文字コードが使用されているかは**お使いの環境によって異なる**
:::

最後までお読みいただきありがとうございました！

> **「参考書」**
[やさしいC 第5版 (「やさしい」シリーズ)](https://www.amazon.co.jp/%E3%82%84%E3%81%95%E3%81%97%E3%81%84C-%E7%AC%AC5%E7%89%88-%E3%80%8C%E3%82%84%E3%81%95%E3%81%97%E3%81%84%E3%80%8D%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E9%AB%98%E6%A9%8B-%E9%BA%BB%E5%A5%88/dp/4797392584)
>
> **「参考サイト」**
[文字コード](https://9cguide.appspot.com/14-01.html)
>
FlutterでWarning: CocoaPods minimum required version 1.10.0 or greater not installed. Skipping pod install.   CocoaPods is a package manager for iOS or macOS platform code.   Without CocoaPods, plugins will not work on iOS or macOS.  の解決方法

# はじめに
IOSのエミュレーターでビルド中に以下のエラーが出てなかなか解決できなかったのですがどすこい塾のかたに聞いたところ一発で解決できたので皆さんにも共有していきたいなと思います。
#### エラー内容
```
Warning: CocoaPods minimum required version 1.10.0 or greater not installed. Skipping pod install.
  CocoaPods is a package manager for iOS or macOS platform code.
  Without CocoaPods, plugins will not work on iOS or macOS.
  For more info, see https://flutter.dev/to/platform-plugins
To update CocoaPods, see https://guides.cocoapods.org/using/getting-started.html#updating-cocoapods
CocoaPods not installed or not in valid state.
Error launching application on iPhone 15 Pro.
```
# 解決方法
:::note info
### 実行環境
使用PC：MacBockAir M2
統合開発環境：Android Studio
:::


結果的に以下の内容で解決できました
```
sudo gem install cocoapods 
pod setup
```
#### 参考文献
https://github.com/flutter/flutter/issues/14630#issuecomment-367447443
https://github.com/flutter/flutter/issues/36544#issuecomment-513325379

僕の環境ではすでにcocoapodsをインストールしていたのでsudo **gem install cocoapods cocoapods** を更新させてから **pod setup**　で最新のPodspecリポジトリをダウンロードし直しました。以下に記述しましたが僕の環境ではどれもうまくいきませんでした。

# 失敗例
まずエラー内容としては「IOSのエミュレーター動かすにはcocoaPodsのバージョン1.10.0以上じゃねーと使えねーよ」という内容だったので以下の方法を試してみました。
### 方法①（cocoapodsの更新）
```
sudo gem install cocoapods
pod --version
```
cocoapodsは入れているので更新すれば最新になるのではということでこちらを行ったのですが**pod --version**をしても1.5.2の更新以前のバージョンになってしまいました。
### 方法②（cocoapodsの再インストール）
```
sudo gem uninstall cocoapods
sudo gem install cocoapods
pod --version
```
こちらはcocoapodsをアンインストールをしてからインストールをし直しました。
結果としては方法①と同じで更新前のバージョンが出力されてしまいました。
### 方法③（キャッシュの削除とxcodesのコマンドラインツールのインストール）
```
pod cache clean --all
xcode-select --install
flutter upgrade
pod --version
```
こちらはキャッシュの削除をしてからxcodeのコマンドラインツールのインストールをしてみました。最後にFlutterのフレームワークを最新にバージョンアップをしました。
結果としてはこちらも更新前のバージョンが出力されてしまいました。

# 終わり
こちらの方法についてはWebでおんなじエラーの内容で書いてある記事を参考にしてみたり、AIに質問してみたりしてみましたが、全てうまくいきませんでした。

しかし、どすこい塾の方はFlutterのissueから参照してうまくいったので調べ方の新しい発見ができました！！ほんと感謝しかないです。
これからもFlutterやAndroid
を勉強していこうと思うので何か新しい意見などありましたらXなどで教えて下さい！！
開発者ツールを使ったAPI呼び出し元の追跡方法

## アジェンダ
開発者ツールのネットワークタブを使用して、API 呼び出しを確認し、コード内での呼び出し箇所を特定する具体的な手順について簡単にまとめます。

## 手順
### 1. **開発者ツールを開く**
まず、ブラウザで開発者ツールを開きます。

1. **Google Chrome** や **Microsoft Edge** を使っている場合、次の手順で開発者ツールを開きます:
   - 右クリックして「検証」を選択する。
   - または、`F12` キーを押すか、macOS では `Cmd + Opt + I`、Windowsでは、`Ctrl + Shift + I`を押します。

2. 開発者ツールのメニューが表示されたら、**「ネットワーク」タブ**をクリックします。

### 2. ページをリロードして API 呼び出しをキャプチャ
「ネットワーク」タブが開いた状態で、ページをリロード（再読み込み）します。API 呼び出しはページが読み込まれる際に実行されるため、これで API リクエストがキャプチャされます。

### 3. フィルタリングして API 呼び出しを探す
ネットワークタブでは、膨大な数のリクエストが表示されることがあるため、**`XHR`** や **`Fetch`** フィルターを使って API 呼び出しを絞り込みます。

- **XHR**（XMLHttpRequest）や **Fetch** は、主に API 呼び出しで使用されるリクエストの種類です。これらにフィルタリングすることで、API リクエストのみを表示することができます。

### 4. API リクエストの詳細を確認する
特定の API リクエストをクリックすると、その詳細が表示されます。ここで重要なのは以下のポイントになります。

#### (a) Request URL
リクエストが送信された API の URL です。これを使用して、ソースコード内でどのエンドポイントにリクエストを送信しているかを確認できます。

#### (b) ペイロード（Request Payload）
- 送信されたリクエストのペイロード（データ）を確認します。特に、POST リクエストや PUT リクエストの場合、サーバーに送信されているデータがこのセクションに表示されます。
- ペイロード内のフィールドや値を使って、コード内でどのデータがどのように送られているかを確認する手がかりにできます。

#### (c) リクエストヘッダー
- API のリクエストヘッダーは、認証トークン（例えば `Authorization` ヘッダー）や他の重要なメタ情報を含むことがあります。
- 認証や API の特定の設定がコード内でどのように実装されているかを知る手がかりとなります。

#### (d) レスポンス（Response）
- API からのレスポンスを確認します。返されるデータの形式（JSON など）や内容を確認することで、どのコンポーネントでこのデータが使われているかがわかる場合があります。

### 5. ソースコード内で API 呼び出しを検索
API の URL やリクエストペイロードを確認したら、次にソースコード内でその URL や関数を検索します。

#### (a) API URL で検索
- 確認した API エンドポイント（例えば `https://api.example.com/v1/products/list`）で、ソースコード全体を検索します。URL が直接書かれている箇所が見つかるかもしれません。

#### (b) 使用されている API 関数を確認
- `axios` や `fetch`、`trpc` など、使用されている API クライアントライブラリをソースコード内で検索します。例えば、`axios.get`、`fetch` 関数、`trpc.client.query` などです。これにより、API リクエストのコード箇所を特定できます。

#### (c) API コールの実行タイミングを確認
- 多くの場合、API 呼び出しは `useEffect` の中で行われています。そのため、`useEffect` を探し、API 呼び出しがいつ行われるか確認します。

### 6. リクエストの発行元を特定する
特定の API リクエストが行われる箇所を見つけたら、どのコンポーネントや関数で実行されているか確認し、さらにデータの流れや使い方を追跡します。
java。URLエンコード。標準ライブラリ。spring frameworkのライブラリの例

##  Java標準ライブラリを使用したURLエンコード

```java
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

public class URLEncodeExample {
    public static void main(String[] args) {
        try {
            String original = "こんにちは 世界!";
            String encoded = URLEncoder.encode(original, "UTF-8");
            System.out.println("Original: " + original);
            System.out.println("Encoded: " + encoded);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }
}
```
出力
```sh
Original: こんにちは 世界!
Encoded: %E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF+%E4%B8%96%E7%95%8C%21
```

## Spring FrameworkのUriComponentsBuilderを使用したURLエンコード

```java
import org.springframework.web.util.UriComponentsBuilder;

public class SpringURLEncodeExample {
    public static void main(String[] args) {
        String baseUrl = "https://example.com/search";
        String queryParam = "こんにちは 世界!";

        String url = UriComponentsBuilder.fromHttpUrl(baseUrl)
                .queryParam("q", queryParam)
                .encode()
                .toUriString();

        System.out.println("Encoded URL: " + url);
    }
}
```

出力
```sh
Encoded URL: https://example.com/search?q=%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF+%E4%B8%96%E7%95%8C%21
```
java。base64エンコード。標準ライブラリ。spring frameworkのライブラリの例

## 標準ライブラリでのBase64エンコード

```java
import java.util.Base64;

public class Base64Example {
    public static void main(String[] args) {
        String originalInput = "Hello, World!";
        
        // Base64エンコード
        String encodedString = Base64.getEncoder().encodeToString(originalInput.getBytes());
        System.out.println("Encoded String: " + encodedString);
        
        // Base64デコード
        byte[] decodedBytes = Base64.getDecoder().decode(encodedString);
        String decodedString = new String(decodedBytes);
        System.out.println("Decoded String: " + decodedString);
    }
}
```

## Spring FrameworkでのBase64エンコード

```java
import org.springframework.util.Base64Utils;

public class SpringBase64Example {
    public static void main(String[] args) {
        String originalInput = "Hello, World!";
        
        // Base64エンコード
        String encodedString = Base64Utils.encodeToString(originalInput.getBytes());
        System.out.println("Encoded String: " + encodedString);
        
        // Base64デコード
        byte[] decodedBytes = Base64Utils.decodeFromString(encodedString);
        String decodedString = new String(decodedBytes);
        System.out.println("Decoded String: " + decodedString);
    }
}
```
byte[] 型の配列が空であるかどうかを Java でチェックする

## 標準ライブラリ

```java
byte[] byteArray = ...; // ここに配列を初期化するコードが入ります。

if (byteArray == null || byteArray.length == 0) {
    System.out.println("The byte array is empty.");
} else {
    System.out.println("The byte array is not empty.");
}
```

## Apache Commons Lang

```java
import org.apache.commons.lang3.ArrayUtils;

byte[] byteArray = ...; // ここに配列を初期化するコードが入ります。

if (ArrayUtils.isEmpty(byteArray)) {
    System.out.println("The byte array is empty.");
} else {
    System.out.println("The byte array is not empty.");
}
```

## Google Guava

```java
import com.google.common.primitives.Bytes;

byte[] byteArray = ...; // ここに配列を初期化するコードが入ります。

if (Bytes.asList(byteArray).isEmpty()) {
    System.out.println("The byte array is empty.");
} else {
    System.out.println("The byte array is not empty.");
}
```

## Spring Framework

```java
import org.springframework.util.ObjectUtils;

byte[] byteArray = ...; // ここに配列を初期化するコードが入ります。

if (ObjectUtils.isEmpty(byteArray)) {
    System.out.println("The byte array is empty.");
} else {
    System.out.println("The byte array is not empty.");
}
```
useLoaderDataの使用法

## アジェンダ
`useLoaderData`は、`React Router`のフックで、ルートに関連付けられた`loader`関数から取得したデータをコンポーネント内で利用するためのものです。簡単に言うと、ページの表示に必要なデータを非同期で取得し、そのデータを使ってコンポーネントをレンダリングするための仕組みです。

ここでは、`useLoaderData`を使ってAPIからデータを取得し、それをコンポーネントで利用する最もシンプルな例をまとめます。
以下のようにデータを取得し、利用します。

1. **`loader`関数**でAPIからデータを取得。
2. **ルート設定**で、コンポーネントに対して`loader`を設定。
3. `useLoaderData`で`loader`から返されたデータをコンポーネント内で利用。

この方法で、React Routerを使ってAPIのデータを簡単に取得し、レンダリングできます。

## 手順
### 1. `loader`関数の作成

`loader`関数は、データを取得する関数です。APIやモックデータからデータを取得し、そのデータを`useLoaderData`で利用します。

```tsx
// loader関数
export const myLoader = async () => {
  const response = await fetch('https://jsonplaceholder.typicode.com/posts/1');
  const data = await response.json();
  return data; // データを返す
};
```

この例では、外部のAPI（`https://jsonplaceholder.typicode.com/posts/1`）からデータを取得しています。`myLoader`関数は、このAPIから取得したJSONデータを返します。

### 2. ルート設定

次に、React Routerのルートで`loader`関数を設定します。ここで、`myLoader`をルートに関連付けます。

```tsx
import { createBrowserRouter, RouterProvider } from 'react-router-dom';
import MyComponent from './MyComponent';
import { myLoader } from './myLoader';

const router = createBrowserRouter([
  {
    path: "/",
    element: <MyComponent />,
    loader: myLoader, // ここでloaderを指定
  },
]);

function App() {
  return <RouterProvider router={router} />;
}

export default App;
```

ここでは、`"/"`パスにアクセスしたときに`MyComponent`コンポーネントが表示され、同時に`myLoader`が呼び出されます。

### 3. コンポーネントで`useLoaderData`を使用する

`MyComponent`コンポーネントで、`useLoaderData`を使って`loader`関数から返されたデータを取得し、表示します。

```tsx
import { useLoaderData } from 'react-router-dom';

function MyComponent() {
  const data = useLoaderData(); // loaderから取得したデータを使用

  return (
    <div>
      <h1>{data.title}</h1>
      <p>{data.body}</p>
    </div>
  );
}

export default MyComponent;
```

## 参考
- [How to use loader function and useLoaderData hook [ remix js tutorial for beginners ] - YouTube](https://www.youtube.com/watch?v=uD7NjVpZe6w&ab_channel=CodingAfterThirty)
IERAE CTF2024 Writeup (入門問題のみ)

CTF 初心者でとりあえず何かしらのコンテストに出てみようと思い IERAE CTF2024 に参加しました!
結果としては入門問題をいくつか解いただけで終わりましたが, トレーニングも兼ねて解けた問題の Writeup を書いてみます (Qiita での投稿も初なので何かお作法等変なことがあれば教えてほしいです!)

## 筆者の CTF に関するレベル (参考)
- OverTheWire の bandit, natas, Leviathan をある程度解いた (わからなかったところは主に Web 上の writeup を見て何とかクリアした感じ)
- CTFlearn で easy の問題を大体解いた (こちらもわからないところは早めに見切りをつけて writeup を探して勉強したので, すべて自力ではない)

## Writeup
### Welcome
- 確認問題のため省略
### OMG
- ブラウザから指定された url を開くと 33 回クリックしてとの指示が出ている $\to$ 愚直に考えると 33 回クリックするとフラグが表示されそう?
- ソースコードを確認すると 33 回クリックされた場合にある文字列が base64 デコードされたものが表示されるようになっていた $\to$ おそらくコード内にあるその文字列がフラグを base64 エンコードされたもの
- 上記の予想通り base64 デコードしてみるとフラグゲット!
### derangement
- 配布された python コードを読むと, magicword に指定された 15 文字のランダム文字列を当てることができればフラグがゲットできるらしい
- 最大 300 回までクエリを投げることが可能で, 各クエリでは必ず magicword と同じ位置に同じ文字が来ないよう並べ替えられた文字列を取得する
- 各位置において当てはまる可能性のある文字は 15 文字までなので, 300 回のクエリで magicword を絞ることは可能
- 以下の exploit を作成し実行したらフラグを獲得できた
```
from pwn import *

sh = remote("104.199.135.28", 55555)

welcome_txt = sh.recvuntil(b">").decode()
print(welcome_txt)

# send 1 for hint
print("send 1")
sh.send(b"1\n")
hint_txts = sh.recvuntil(b">").decode().split("\n")
hint_txt = ""
for txt in hint_txts:
    if "hint:" in txt:
        hint_txt = txt.split()[1].replace("\n","")

print(list(hint_txt))

possible_chars = "".join(list(set(list(hint_txt))))
possibles = [possible_chars] * len(hint_txt)
print(possibles)

for i in range(100):
    print("send 1")
    sh.send(b"1\n")
    hint_txts = sh.recvuntil(b">").decode().split("\n")
    hint_txt = ""
    for txt in hint_txts:
        if "hint:" in txt:
            hint_txt = txt.split()[1].replace("\n","")
    hint_strs = hint_txt
    print(hint_strs)

    for i in range(len(hint_strs)):
        if hint_strs[i] in possibles[i]:
            possibles[i] = possibles[i].replace(hint_strs[i],"")

passwd = "".join(possibles)
print(passwd)

sh.send(b"2\n")
prompt_txt = sh.recvuntil(b">").decode()
print(prompt_txt)
sh.send(passwd.encode())
sh.interactive()
```
実際に 300 回ループを回す必要はなく, 100 回程度のループでもうまくパスワードを推測できた.

### Assignment
- 配布された実行ファイルについて gdb で逆アセンブルをかけたところ, main 関数でフラグをバラバラな順番で読み込んでいることが確認できた.
- 手作業で元の順番通りに並べ替えてフラグを取得 (他にもっと楽な方法がありそう)

## 感想
- 全くできなかったらどうしようと不安だったけれど, とりあえず参加してみたら普通に楽しかったです (競プロを始めたときに近い感じ)
- CTFTime で毎週何かしらの CTF の開催情報が載っているので, 今後も定期的に参加してみようと思いました
【p5.js】p5.sound の getSources() を使って複数のマイク入力のリストをシンプルに出力

タイトル通り [p5.sound](https://github.com/processing/p5.sound.js) を使った内容です。

前に書いた以下の記事でも、今回と似たようなことをやっていました。
その際、p5.js Web Editor・p5.js を使ったものの、マイク入力の取得は JavaScript の「[MediaDevices: enumerateDevices() メソッド](https://developer.mozilla.org/ja/docs/Web/API/MediaDevices/enumerateDevices)」を使っていました。

●PC で利用できるマイクなどのオーディオ入力のリストを p5.js Web Editor上で見てみる（ブラウザの MediaDevices） - Qiita
　https://qiita.com/youtoy/items/8339313b561c503ffe39

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/e7b6535d-41e3-7233-880d-36cd801e7b41.png)

今回は、この部分を p5.sound を使った処理にしてみます。

## 試してみる
### 利用する処理
実際に試してみます。
[p5.sound](https://github.com/processing/p5.sound.js) のリファレンス等を見てみたところ、以下の「getSources()」を使うのが良さそうです。
※ 前に書いた記事で使った「MediaDevices.enumerateDevices()」のラッパーとなるようです

●getSources
　https://p5js.org/reference/p5.AudioIn/getSources/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/0db0d492-8364-2c5c-a888-5f2ae12c8699.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/f9a948a4-5d50-c097-e71a-2d25e3eaa579.png)


### デバイスのリストをそのまま出力
マイク入力（や、他のオーディオ入力）のリストを単純に出力するだけなら、以下のシンプルな内容で実現できました。

```javascript
function setup() {
  createCanvas(400, 400);
  const mic = new p5.AudioIn();

  mic.getSources((deviceList) => {
    console.log(deviceList);
  });
}
```

以下の書き方でも OK です。

```javascript
function setup() {
  createCanvas(400, 400);
  const mic = new p5.AudioIn();

  mic.getSources(function (deviceList) {
    console.log(deviceList);
  });
}
```

上記を実行して得られた出力は、以下のとおりです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/1b9d9f62-67c5-066b-a9e8-a27cf2cef4ac.png)

### デバイスのラベルのみを出力
次に、マイク入力（や、他のオーディオ入力）のリストの中の、ラベルのみを取得してみます。

上で書いたプログラムに、少しだけ手を加えました。

```javascript
function setup() {
  createCanvas(400, 400);
  const mic = new p5.AudioIn();

  mic.getSources((deviceList) => {
    // console.log(deviceList);
    const labels = deviceList.map((device) => device.label);
    console.log(labels);
  });
}
```

これを実行すると、以下の出力が得られました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/46c0c7ef-2014-f660-346c-7bc46c8d821a.png)

ひとまず無事、p5.sound を使った情報取得・出力が行えました。
今更ながらWindowsで開発環境をちょこっと整えてみた

# 動機
Macでの開発の快適さにすっかり慣れて、使わなくなったWindowsだが、
魔が差して開発環境を整えたくなった。

# 開発環境
Windows10

## Windows Terminalの活用
コマンドプロンプトやPowerShellを踏襲したものとして、**Windows Terminal**というものがあるらしい。
早速、**Microsoft Store**からインストール。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2426934/4ddc0173-2ec9-f9b1-3f24-8fe625d6a25e.png)

powershellやlinuxとの違いは下記サイトが分かりやすい。
>[Windows Terminalの総合ガイド: 歴史、機能、そしてLinuxTerminalとの比較](https://qiita.com/yu_uk/items/09fe1197768ba9718c34)

lsやcpといった基本的なコマンドが叩けるので使い勝手はそこそこ良い印象。

## gitの導入
開発環境なのでgitの導入は必須。
アプリインストールはwingetで実行できるとのことなので、wingetでgitインストールを試してみる。
`winget install --id Git.Git -e --source winget`

実行すると下記のような状態になり、少し待つとGitのGUIのインストーラが自動起動する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2426934/8e08818a-0709-e8fe-e008-b9fd715f4675.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2426934/5cdc11d8-9b75-59d6-02b7-29371f4f437f.png)

インストールが完了したので、環境変数を指定する。
`$env:PATH += ";C:\Program Files\Git\git-bash.exe"`
PATHを確認すると、無事にgitのpathが追加されており、これでgitコマンドも叩けるようになった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2426934/872802fc-49ed-306f-a769-5221c0f25f24.png)

## おわりに
あとは、自分に必要な開発言語をインストールしてパスを通せば、一定の開発作業はできそうだ。ソースコードの記述などはCLI上では厳しそうなので、VSCodeなどを代用したい。
Windows Terminalによってどんな革新がもたらされたか楽しみではあったが、リファレンスの多さを踏まえると、使い勝手はまだまだlinuxのほうが良い印象。
とはいえ、今後の進展が楽しみである。
個人用 Ubuntuセットアップ


## configuration
### ディレクトリ名を英語に変更
``` shell
LANG=C xdg-user-dirs-update --force
```
--- 
## utils
``` shell
sudo apt install vim git curl ssh python3-pip
```
--- 
## terminator
### install
``` shell
sudo apt install terminator
```
### dracula theme
[Terminator • Dracula Theme](https://draculatheme.com/terminator)
``` shell
git clone https://github.com/dracula/terminator.git
cd terminator
./install.sh
```
### ※フォント設定に問題があるため、適当に変える
### install Hack font
```
sudo apt install fonts-hack
```

### edit config file
```
# font = Anonymous Pro 12
font = Hack 12
```

---
## vim
[こちらを参照](https://qiita.com/VonBondie/items/b56f9fce03ed83566ea7)

--- 
## MOZC
### MOZC
``` shell
sudo apt install ibus-mozc
```
### MOZC-utils-gui
``` shell
sudo apt install mozc-utils-gui
```
※ install後再起動すると、ubuntuの設定項目に現れる
※ 基本的にはmozcのみでよいためEnglishはremoveして良い
※ mozc設定後、更に再起動しないとmozcがうまく有効化されない事がある模様
### MOZCショートカット設定

mozcのオプションを開き以下の設定
```
HANKAKU/ZENKAKU キーの設定を全削除
直接入力 : ctrl + space : IMEを有効化
入力文字なし : ctrl + space : IMEを無効化
```
※ 設定が正しくても何故かうまくいかないケースあり、一度IMEを無効化を別のものに変更してから、再度IMEを無効化に変更したところ適当に動作した

--- 
## firefoxのアドオン
- [Gesturefy – 🦊 Firefox (ja) 向け拡張機能を入手](https://addons.mozilla.org/ja/firefox/addon/gesturefy/)
--- 
# Obsidian
[Download - Obsidian](https://obsidian.md/download)
[ObsidianをUbuntu 22.04にインストールしようとしてハマったのでメモ](https://zenn.dev/jolantern/articles/2ed2ba76f91524)
``` sh
sudo apt install flatpak

```

※非推奨手順
LinuxからSnapを選んでダウンロード
``` shell
snap install obsidian*** --dangerous --classic 
```
--- 
## fish
[Ubuntu 22 にアプデしてデフォルトのshell に fish を導入した話 | 浅瀬に徒浪](https://shoalwave.net/develop/2022052927273/)
[【完全版】fish shell \~スーパーコマンドライン\~](https://zenn.dev/sawao/articles/0b40e80d151d6a)
### installation & set as default shell
``` shell
sudo apt install fish
chsh
# /usr/bin/fish
```

### install fisher
``` shell
curl -sL https://raw.githubusercontent.com/jorgebucaran/fisher/main/functions/fisher.fish | source && fisher install jorgebucaran/fisher
```

### install plugins
``` shell
fisher install 0rax/fish-bd
fisher install oh-my-fish/theme-bobthefish
```

### install Fonts for custom theme
``` shell
git clone https://github.com/powerline/fonts.git
./fonts/install.sh
rm -rf ./fonts
```
### Setup vim key binding
open `~/.config/fish/config.fish`
``` config.fish
// add this.
fish_vi_key_bindings
```
--- 

## visual studio code
### instlation
[UbuntuにVSCodeをインストールする3つの方法 #Ubuntu - Qiita](https://qiita.com/yoshiyasu1111/items/e21a77ed68b52cb5f7c8)

### plugins
```cardlink
url: https://marketplace.visualstudio.com/items?itemName=vscodevim.vim
title: "Vim - Visual Studio Marketplace"
description: "Extension for Visual Studio Code - Vim emulation for Visual Studio Code"
host: marketplace.visualstudio.com
image: https://vscodevim.gallerycdn.vsassets.io/extensions/vscodevim/vim/1.27.2/1703296672749/Microsoft.VisualStudio.Services.Icons.Default
```
VPCエンドポイント経由で、CloudWatchLogsにログを出力する

## VPCエンドポイント経由で、CloudWatchLogsにログを出力したいときに、確認すること
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871776/a58fd6d7-1427-8c75-25c4-3f6ec310729b.png)



## 1.EC2インスタンスにロールがアタッチされているか確認する
以下のロールがEC2にアタッチされているか確認する。
- CloudWatchAgentServerPolicy

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871776/eadb87ee-93b7-dd71-6c02-1cd50faabdf1.png)


## 2.CloudWatchエージェントが動作しているか確認する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871776/c73119c4-5336-555a-acfb-ed8663c038b0.png)

### CloudWatchのインストール方法
以下のいずれかでインストールができる。
- コマンドラインに S3 ダウンロードリンクを使用する
- EC2 Systems Manager を使用する
- CloudFormation テンプレートを使用する
- 
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/install-CloudWatch-Agent-on-EC2-Instance.html

## 3.CloudWatchLogsのVPCエンドポイントのポリシーを確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871776/bc67087a-10f2-8f7a-e2b5-b9f93b93a1cf.png)

IAMポリシーで許可している場合でも、VPCエンドポイントポリシーで許可していなければ、リクエストは拒否されるため、確認が必要となる。

また、エンドポイントの作成時にポリシーをアタッチしない場合、フルアクセスを許可するデフォルトのポリシーがアタッチされる。

:::note info
CloudWatchLogsにログを表示するには、**ログの書き込みを許可するエンドポイントポリシーが必要**となる。
:::

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/cloudwatch-logs-and-interface-VPC.html
個人用備忘録 vimのインストールと設定

# vimのインストール
```
sudo apt install vim
```

# deinのインストール
[Vimのplugin管理ツール、\`dein\`のインストールとpluginのセット #Vim - Qiita](https://qiita.com/MickeyOoh/items/b47ab0b8b5fbbbad3793)
``` shell
curl -fsSL https://raw.githubusercontent.com/Shougo/dein-installer.vim/master/installer.sh > installer.sh
sudo chmod 777 installer.sh
./installer.sh
```

# vim.rc
``` vim.rc
if &compatible
  set nocompatible
endif 
set runtimepath+=~/.cache/dein/repos/github.com/Shougo/dein.vim

if dein#load_state('~/.cache/dein')
  call dein#begin('~/.cache/dein')
  call dein#add("~/.cache/dein/repos/github.com/Shougo/dein.vim ")
  call dein#add("Shougo/neosnippet.vim")
  call dein#add("Shougo/neosnippet-snippets")

  call dein#add('dracula/vim')
  call dein#add('slim-template/vim-slim.git')
  call dein#add('mxw/vim-prolog')

  call dein#add('tpope/vim-fugitive')
  call dein#add('tpope/vim-surround')
  call dein#add('tpope/vim-commentary')
  call dein#add('vim-airline/vim-airline')
  call dein#add('vim-airline/vim-airline-themes')

  call dein#end()
  call dein#save_state()
endif

if dein#check_install()
    call dein#install()
endif

filetype plugin indent on
"""""""""""""""""""""
" 基本設定
"""""""""""""""""""""
" ウインドウのタイトルバーにファイルのパス情報等を表示する set title " 行番号を表示する
set number
" カーソルの行を目立つ
set cursorline
" ペア括弧やを表示する
set showmatch

"""""""""""""""""""""
" 配色
"""""""""""""""""""""
" 構文毎に文字色を変化させる
syntax enable
" カラースキーマの指定
colorscheme dracula 
" 行番号の色
highlight LineNr ctermfg=darkyellow

"""""""""""""""""""""
" 検索
"""""""""""""""""""""
" 検索ワードの最初の文字を入力した時点で検索を開始する
set incsearch
" 小文字のみで検索したときに大文字小文字を無視する
set smartcase
" 検索結果をハイライト表示する
set hlsearch

"""""""""""""""""""""
" タブ&インデント
"""""""""""""""""""""
" タブの代わりに空白文字を挿入する
set expandtab
" タブ文字の表示幅
set tabstop=2
" Vimが挿入するインデントの幅
set shiftwidth=2
" 行頭の余白内で Tab を打ち込むと、'shiftwidth' の数だけインデントする
set smarttab
" 改行時に前の行のインデントを継続する
set autoindent
" 改行時に入力された行の末尾に合わせて次の行のインデントを増減する
set smartindent

"""""""""""""""""""""
" その他
"""""""""""""""""""""
" 他で書き換えられたら自動で読み直す
set autoread
" スワップファイルを生成しない
set noswapfile
" 入力中のコマンドを表示する
set showcmd
" コマンドモードでTabキーによるファイル名を補完する
set wildmenu
" カーソルを行頭、行末で止まらないようにする
set whichwrap=b,s,h,l,<,>,[,]
" 変更中のファイルでも、保存しないで他のファイルを表示
set hidden

set belloff=all
"""""""""""""""""""""
" キーマッピング
"""""""""""""""""""""
" ペストモード
nnoremap pt :set paste<CR>
nnoremap np :set nopaste<CR>
```
フロント完全未経験が勉強を始めて３ヵ月、ReactのWEBアプリ制作を作成

フロントエンド完全未経験で3カ月間React学習に取り組んできました。
今回作成したWEBアプリと3カ月の学習の振り返りについて書いていきたいと思います。

# 今回作成したもの

今回作成したのは、「JISOU」というプログラミングコミュニティの中の課題で作成した「デジタル名刺アプリ」です。
デジタル名刺としてユーザー情報をDBへ登録し、登録したデータを表示するアプリです。
登録データは毎朝６時にGithubActionで削除されます。

## 画面

### トップ画面（検索）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3815580/0fcb7ba3-2b2a-7786-c9cc-cc987ae85555.png" width="300">

### 名刺情報入力
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3815580/c97e311d-1a1b-5b28-08f2-3350cf59a0c4.png" width="300">

### 名刺情報表示

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3815580/3494dc02-0bf7-9e9f-718a-5b04fae81f28.png" width="300">

# 3ヵ月の学習を終えての振り返り

学習を始めるにあたって、私は最初に記事を出しました。

https://qiita.com/miu-Y/items/d147f13bb8e2c0e5f19b

この記事の中では、３ヵ月の目標として大胆な宣言をしていました。

> ## 中期的な目標
> Reactで基本的なWEBアプリを作成できるようになる。
> アウトプットとして読みやすい記事を出せるようになる。

今見ると恥ずかしいような内容ですが、目標は立てるだけじゃダメなので３ヵ月で出来たかを振り返っていきたいと思います。

## 成長できた事

### 基本的なアプリ制作

上部で述べたように、基本的なReactアプリを作成できるようになりました。
また、CRUD / バッチ処理 / CICDといった開発には必須の実装もなんだかんだ行えるようになりました。
これは今入っている「JISOU」のカリキュラムのおかげでもありますが、
どういう仕組みで動いているのかや、それによるメリットも分かるようになってきました。

また、開発中にエラーで詰まった際の解決もある程度一人で出来るようになりました。
（最初の頃はアロー関数を代入した変数にカッコをつけ忘れて大騒ぎするレベルでした…笑）

### 記事について

MD形式を駆使して記事を書けるようになりました。

https://qiita.com/miu-Y/items/efb904fc888083252c20

これが最新のエラー解決記事なのですが、Mermaidやコード例を活用して見やすく書くことを心掛けています。

### 勉強習慣

時間がある日は毎日勉強や記事を書く事を心掛けられるようになりました。
今まではYoutube ShortsやTikTokに無限に時間を吸われていたので精神的にも成長です。

## 今後の課題（できていないこと）

今自分で出来ていない事を書きます。

### レンダリング分からない問題

Reactのレンダリングのタイミングや仕組みを深く理解できていません。
Udemyのコードをなぞりつつ、再レンダリングされてないよね～と確認しているレベルです。
今はまだ小規模なのでパフォーマンスを意識せず済んでいますが、いつか必ず求められるスキルだと思うので勉強しときたいです。
（こういう便利ツールがあるらしいので、次の開発から導入します！）

https://dev.classmethod.jp/articles/react-developer-tools/

https://zenn.dev/bs_kansai/articles/415c7e7a81ac6a

### 記事の構成が上手くない問題

３ヵ月前の目標として、

> アウトプットとして読みやすい記事を出せるようになる。

と書きました。
ですが、いまだに記事の構成が上手くない…
見返してみても、構成的にイマイチ読みにくい・伝えたい事が分かりにくいと感じる記事が多いです。

業務でハンズオン的な手順書を書いたことはあるのですが、Qiitaの記事のようなナレッジ的な物は未経験です。
明確な目的やゴールを上手く作れていないのも原因なのかなと思います。（スピーチは苦手なタイプです。）

今後読みやすい記事を見つけた際は、記事の内容や文章だけでなく構成も意識して参考にできればいいなーと考えております。

# JISOUのメンバー募集中
プログラミングコーチングJISOUではメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか？

気になる方はぜひHPからライン登録お願いします👇

https://projisou.jp
[JavaScript] ライブラリなしで配列操作の遅延評価ができる（予定）〜Iterator Helpersについて〜

JavaScriptの言語仕様に新しく追加される予定の「Iterator Helpers」について解説します。

# Iterator Helpers Proposalについて

JavaScriptの言語仕様に、イテレータを操作するための便利なメソッドを追加しようという提案です。
2024年9月現在Stage3であり、**今のところまだ全てのブラウザやランタイムで利用できるわけではありません。**

https://github.com/tc39/proposal-iterator-helpers

この機能を使うと、配列操作を遅延評価することができます。

# 配列操作の遅延評価とは

従来のJavaScriptの配列操作関数では、メソッドを呼び出した瞬間に配列操作が走っていました。

```ts:従来の配列操作
// .map()を呼び出すと、即時関数で渡した関数がすぐに実行され、結果の配列が作成される
const result = [0, 1, 2]
    .map(val => val + 1)
    .map(val => val ** 2);
```

```mermaid
graph TB
subgraph 元の配列
    A
end
subgraph 途中結果の配列
    B
end
subgraph 最終結果の配列
    C
end
  A["[0, 1, 2]"]-->|".map(val => val + 1)"| B["[1, 2, 3]"]
  B-->|".map(val => val ** 2)"| C["[1, 4, 9]"]
```

一方、計算処理をすぐに行い結果の配列を先に生成するのではなく、実際に結果が必要になる時まで計算処理が延期させることを、**遅延評価**といいます。

```mermaid
graph TB
subgraph 元の配列
    A
    C
    E
end
  A((0))-->|"(val + 1) ** 2"| B((1))
  C((1))-->|"(val + 1) ** 2"| D((4))
  E((2))-->|"(val + 1) ** 2"| F((9))
```

▲i番目の結果が必要になった時に初めて`(val + 1) ** 2`の計算が走る

# JavaScriptでライブラリを使わずに遅延評価する

:::note warn
こちらのメソッドは2024年9月現在、Chrome、Node.js、Deno、FirefoxのTechnology Preview版で利用できます。Safariではまだ利用できません。
:::

配列に対して`.values()`メソッドを使うと`Iterator`オブジェクトに変換できます。
この`Iterator`オブジェクトに対して`.map()`などのメソッドを使うと、遅延評価になります。
また、`Iterator`オブジェクトの`.toArray()`メソッドを使うと、配列に戻すことができます。

```diff_typescript:配列操作の遅延評価
 const result = [0, 1, 2]
+    .values()
     .map(val => val + 1)
     .map(val => val ** 2)
+    .toArray();
```

### 例：無限イテレータ

通常の配列操作の場合、無限の長さを持つ配列は扱えません（当然ですね）。
一方、`Iterator`オブジェクトを使って遅延評価を行う場合は、無限に値を取り出せるイテレータを作って操作することができます。

今回は無限イテレータを作成し`map`で変換したのち、`take`メソッドを使って先頭3個を取り出すコードを書いてみましょう。

```ts:無限イテレータの操作
// 無限イテレータを作成する関数
function* infinityIterator() {
  let i = 0;
  while (true) {
    yield i++;
  }
}

infinityIterator() // 無限イテレータを生成
    .map(val => val + 1)
    .map(val => val ** 2)
    .take(3)    // 先頭3個を取り出し
    .toArray(); // [1, 4, 9]
```

これがもし配列なら、1回目のmapの際に無限ループに陥り、プログラムが止まらなくなってしまうはずです。
しかし、イテレータは遅延評価されるという性質があるため、最後に`.take(3)`で先頭3個を取り出せば、後ろの4番目以降の値については計算されず、無限ループを回避できます。

このように、`Iterator`オブジェクトを使って遅延評価することで、無駄な計算処理を省くことができます。また、中間配列の生成を避けることができるため、処理の高速化も期待できます。

# まとめ

- JavaScriptで配列の遅延評価ができる「Iterator Helpers」がもうすぐ導入予定
- 「Iterator Helpers」を使って配列操作を遅延評価するには、`.values()`で`Iterator`オブジェクトに変換する
- 遅延評価することで、不要な計算を回避したり、中間配列の生成を避けることができたりといったメリットがある

Iteratorオブジェクトには、今回紹介した`map`や`take`以外にも、便利なメソッドが揃っています。導入が待ち遠しいですね！

### 関連記事

https://zenn.dev/pixiv/articles/062461b79e0d8f

https://v8.dev/features/iterator-helpers

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Iterator

https://zenn.dev/pixiv/articles/6f406804f6a820
Google Cloud Armorのセキュリティポリシーの仕組み

# はじめに
本記事ではGoogle Cloudのセキュリティサービスである「Google Cloud Armor」（以下、Cloud Armor）について、セキュリティポリシーがどういう仕組みになっているのか解説します。

# Cloud Armor
「Cloud Armor」は分散型サービス拒否（DDoS）攻撃や、クロスサイト スクリプティング（XSS）、SQL インジェクション（SQLi）などのアプリケーション攻撃をはじめとしたさまざまなタイプの脅威からGoogle Cloudにデプロイされているリソースを保護するいわゆるWAFとして機能するサービスです。
今回検証にするセキュリティポリシーを使用することでロードバランサの背後で実行されているアプリケーションを分散型サービス拒否攻撃（DDoS）やその他のウェブベースの攻撃から保護します。

https://cloud.google.com/security/products/armor?hl=ja

Cloud Armorは基本的に従量課金制のサービスですが、年間サブスクリプションであるGoogle Cloud Armor Enterpriseに契約することでさらに多くの機能を利用できます。
詳細な機能については下記の公式ドキュメントを参照ください。

https://cloud.google.com/armor/docs/armor-enterprise-overview?hl=ja

## セキュリティポリシーについて
本記事ではセキュリティポリシーのすべてを説明しているわけではないため、本記事以外の内容は以下公式ドキュメントを参照ください。
https://cloud.google.com/armor/docs/security-policy-overview?hl=ja

Cloud Armorのセキュリティポリシーは、L7属性のリクエストをL7フィルタリングなどでブロックし、その後ろにあるバックエンドサービスへのリクエストを防ぐことで、アプリケーションを保護します。
各セキュリティポリシーは、受信リクエストのIPアドレス、IP範囲、リクエストヘッダーなどの条件に基づいてトラフィックをフィルタリングする一連のルールで構成することができます。そして、このルールはトラフィックの一致条件とその条件が満たされたときに実行する以下アクションで構成されます。
- 許可
- 拒否
- リダイレクト
- スロットル
- レートベースの禁止
評価されるルールは優先度によって小さいルールから評価され、0 ~ 2,147,483,646の優先度を設定します。（2,147,483,647はデフォルトの拒否ルールとして予約されています）
ルールには基本一致条件と詳細一致条件があり、基本一致条件はIPアドレスやIPアドレス範囲を、詳細一致条件はCEL（Common Expression Language）を使ってルール式を定義できます。
CELについては下記参考資料を参照してください。今後このCELについても記事を執筆予定です。

https://cloud.google.com/armor/docs/rules-language-reference?hl=ja

リクエストがルールに一致するとそれより低い優先度のルールは無視されます。
例えば、以下のセキュリティポリシーが設定されているCloud Armorに送信元IPアドレスが0.0.0.1のリクエストを受信したときは優先度2のルールが適用されます。

| 優先度 | ルール | アクション | 評価 |
| :-: | :-: | :-: | :-: |
| 1 | 0.0.0.2/32 | 拒否 | ルールに一致しないため次の優先度が評価 |
| 2 | 0.0.0.1/32 | 拒否 | ルールに一致しているため、リクエストは拒否される |
| 3 | 0.0.0.1/32 | 許可 | リクエストがすでに評価されているため、スキップ |
| 2,147,483,647 | * | 拒否 | 同上 |

アクションのうち、許可、拒否、リダイレクトについては他に記事がたくさんあるのでレートベースのルールであるスロットルとレートベースの禁止について解説します。

## レートベースのルール
Cloud Armorには受信したリクエストのレートによって処理を定義することができます。

### スロットル
1クライアントまたは全クライアントに対して最大のリクエスト量を制限することができます。
たとえば、パラメータとして10秒間に1000リクエストと設定した場合、1000を超えるリクエストはスロットリングされて、バックエンドには到達しません。ちなみに、リクエストが1000以下の場合、このルールは評価されますが閾値を下回っているためACCEPTとなりバックエンドにリクエストが到達します。

### レートベースの禁止
クライアントごとに設定したルール一致するリクエストのレート制限を適用できます。ユーザーが構成した式い値を超えると、一時的にクライアントからのリクエストを禁止できます。

参考：
https://cloud.google.com/armor/docs/rate-limiting-overview?hl=ja

# さいごに
今回は仕組みの紹介にとどまりましたが、視覚的に理解できるようにするため実際に検証をして示す予定です。
【Mac】コマンドで動画から音声を抽出する方法

動画から音声を抽出するには `ffmpeg` コマンドを使用します。

https://ffmpeg.org

## インストール

以下のコマンドを実行してインストールします。

```terminal
brew install ffmpeg
```

https://formulae.brew.sh/formula/ffmpeg

## 音声の形式を調べる

以下のようにコマンドを実行し、`Audio:`の値を確認します。

```terminal
ffmpeg -i input.mp4
```

## 抽出する

以下のコマンドを実行し、上記で調べた形式で音声を抽出します。

```terminal
ffmpeg -i input.mp4 -vn -y -acodec copy output.aac
```
CloudFront ディストリビューションで使用しているOAIの確認

## やりたいこと
CloudFrontのディストリビューションで設定しているOAIを確認したい。
マネコンからでも確認はできるが、一つずつ設定を見るのは大変なので、スクリプトを作成しました。
## 実践

```
export AWS_PROFILE="your_profile"

aws cloudfront list-distributions \
--query "DistributionList.Items[*].{CF_ID:Id,OAI_ID:Origins.Items[*].S3OriginConfig.OriginAccessIdentity}"
```
上記コマンドで、アカウント内のディストリビューションIDと、OAI_IDを値にもつ配列は出力できます。
ただちょっとこのままだと見づらいのと、OAIが複数のディストリビューションで使用されていないか確認したかったので以下スクリプトにします。

```
export AWS_PROFILE="your_profile"

aws cloudfront list-distributions \
--query "DistributionList.Items[*].{CF_ID:Id,OAI_ID:Origins.Items[*].S3OriginConfig.OriginAccessIdentity}" \
| jq -r '.[] | [.CF_ID, (.OAI_ID[] // "-")] | @csv' \
> ./CloudFront-OAI.csv
```

`jq`コマンドで見やすい形に変換して、CSVで出力します。
後はCSVからフィルターかけるなりして使用すれば良いかと思います！

## 自分のための忘備録
AWS CLIを使用際に`jq`を使用することが多いのでメモ。

```
#jsonを読み込み、データをrow形式（プレーンテキスト）で出力する。
jq -r '.[] 
```

```
#読み込んだデータの各配列の要素にアクセス。
.[] 
```
```
#配列内の、CF_ID,OAI_IDを新しく生成した配列に入れる
#// "-") は、OAIが設定されていない場合に、空文字列ではなく"-"が入るようにしている
[.CF_ID, (.OAI_ID[] // "-")] 
```

```
#上記で生成した配列を、CSV形式で出力
@csv
```
## 終わりに
マネコンで自力で確認するより、プログラムささっと書いて円滑に仕事を進めていきたい。。
誰かの参考になれば幸いです。
SessionProviderがUnterminated regexp literalとエラーになりコンパイルできない

## バージョン
| name | version |
|:-:|:-:|
|next|14.2.4|
|next-auth|4.24.5|

## 事象
* VSCode上で「'SessionProvider' は値を参照していますが、ここでは型として使用されています。'typeof SessionProvider' を意図していましたか?」とエラーが出る
* 画面上では「Failed to compile　Unterminated regexp literal」とコンパイルエラーとなる
*  当該ファイルはsrc/lib/NextAuthProvider.tsとして保存

## 当該コード

```
'use client'

import { SessionProvider } from 'next-auth/react'
import { ReactNode } from 'react'

const NextAuthProvider = ({ children }: { children: ReactNode }) => {
    return <SessionProvider>{children} </SessionProvider>
}

export default NextAuthProvider
```

## 原因
ファイル名が.tsとなっていたため。

## 対応
NextAuthProvider.tsxとして保存する

## .tsxと.tsファイルの違い

* .tsxファイルは、TypeScriptでJSX構文を使用するためのファイル形式です。Reactコンポーネントを定義するときや、JSXを含むコードを扱う場合には、この拡張子を使います。
* .tsファイルは、通常のTypeScriptコード用の拡張子です。このファイル形式では、JSX構文はデフォルトではサポートされていません。

今回はJSX構文を使用しているためtsxでないとだめだったということです。
初歩的なことで躓いてしまいました…
モダンJavaScriptの基礎から始める挫折しないためのReact入門の環境設定（StackBlitz版）

## 状況
* じゃけぇさんがUdemy講師の「モダンJavaScriptの基礎から始める挫折しないためのReact入門」のセクション6:Reactの基本を学ぶでStackBlitzを使用している際の環境設定で少し詰まったので簡単な備忘録を残します
* （Udemyの動画上ではCodeSandboxを使用しています）

## 注意する点
* StackBlitzでフレームワークを選ぶ際はReactが２つあるので、React(JavaScript)の方を選ぶ
![スクリーンショット 2024-10-20 23.14.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289947/786c4d21-80ca-f2cf-8f6e-6ca6482e0c49.png)
<br>

* こんにちは!の文字を表示させるにはmain.jsx内で記述する  
* App.jsxやApp.jsx等のファイルは削除しても良い
![スクリーンショット 2024-10-20 23.24.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289947/2ae427b2-a2bf-3794-2111-312363da91ec.png)
<br>

* main.jsxのファイル名を変えたい場合、index.htmlのsrc=の部分を変えたいファイル名に変更する
* 拡張子は.jsxを使わないとエラーになる
![スクリーンショット 2024-10-20 23.28.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3289947/957f3444-d066-e749-71ad-67ea792a6907.png)

以上、簡単ですがStackBlitz上での環境設定の備忘録でした。