OmniAICreator/Qiita-1.07M huggingface dataset:
libuv の紹介

### `libuv`の紹介

`libuv`は、多くのプラットフォームで動作する非同期I/Oライブラリで、主にNode.jsで使用されますが、他のプロジェクトでも利用可能です。このライブラリは、イベント駆動型プログラミングモデルをサポートしており、ファイルシステム操作、ネットワーク操作、タイマーなどを効率的に処理することができます。`libuv`は、高パフォーマンスと一貫性のあるクロスプラットフォームの非同期I/O操作を提供することを目的としています。

### `libuv`の主な特徴

1. **クロスプラットフォームサポート**：Unix系およびWindowsシステムをサポートしており、コードの移植性を確保します。
2. **イベントループ**：非同期プログラミングの中心である効率的なイベントループメカニズムを提供します。
3. **ファイルシステム操作**：非同期ファイルシステムAPIを提供し、さまざまなファイル操作をサポートします。
4. **ネットワーク操作**：TCP、UDP、パイプなどのネットワークプロトコルの非同期操作をサポートします。
5. **マルチスレッドサポート**：スレッドプールをサポートしており、計算集約型タスクを処理することができます。
6. **タイマー**：タイマーAPIを提供し、タイミングや遅延操作をサポートします。

### `libuv`の使用方法

`libuv`を使用する基本的な手順は以下の通りです：

1. **イベントループの初期化**：`uv_loop_t`イベントループを作成し、初期化します。
2. **I/Oオブジェクトの作成と初期化**：具体的な操作に応じて、`uv_tcp_t`、`uv_timer_t`などのI/Oオブジェクトを作成します。
3. **コールバック関数の登録**：I/Oオブジェクトにコールバック関数を登録し、操作完了時に実行されるようにします。
4. **イベントループの開始**：`uv_run`関数を呼び出してイベントループを開始し、イベントを処理します。

### `libuv`の利点

`libuv`の利点は、その高効率性と柔軟性にあります。非同期I/O操作を効率的に処理することで、システムリソースの利用を最小限に抑え、アプリケーションのパフォーマンスを向上させることができます。また、クロスプラットフォームサポートにより、異なるオペレーティングシステム間で一貫した動作を保証します。

### `libuv`の適用例

`libuv`は、さまざまなユースケースで使用されています。例えば：

- **Node.js**：`libuv`はNode.jsのI/Oエンジンとして使用され、非同期I/O操作の基盤を提供します。
- **高性能サーバー**：非同期I/Oを活用して、高スループットと低レイテンシを実現するサーバーアプリケーションの構築に利用されます。
- **リアルタイムアプリケーション**：リアルタイムデータ処理やストリーミングアプリケーションにおいて、効率的なデータ処理を実現します。

### まとめ

`libuv`は、強力な非同期I/Oライブラリであり、イベント駆動型プログラミングモデルをサポートすることで、効率的なクロスプラットフォームI/O操作を実現します。ファイルシステム操作、ネットワーク操作、タイマーなど、多くの機能を提供しており、さまざまなアプリケーションで利用されています。`libuv`をマスターすることで、アプリケーションのパフォーマンスと応答速度を向上させることができます。
AWS Certified Solutions Architect - Associate(SAA-C03)受験奮戦記

# 目次
[1. はじめに](#1-はじめに)
[2. インプット1(英語学習なら英単語に相当)](#2-インプット1英語学習なら英単語に相当)
[3. インプット2(英語学習なら英文法に相当)](#3-インプット2英語学習なら英文法に相当)
[4. アウトプット(英語学習なら英会話に相当)](#4-アウトプット英語学習なら英会話に相当)
[5. その他](#5-その他)

## 1. はじめに
実業務でAWSのマネージメントコンソールに触れることは多くないものの、徐々に増えつつあります。
現在所属している会社がAWS資格取得を奨励していることと、仕事が一段落したことから、一念発起しました。

私は、ハンズオンは極力省略する学習スタイルでインプット＆アウトプットサイクルを回しました。
合格までに要した期間は2か月程度です。

本稿が誰かの合格に一助となれば幸いです。

### 書くこと
有用と感じた教材と感想

### 書かないこと
AWSやSAAの概要
途中で挫折した教材と感想

## 2. インプット1(英語学習なら英単語に相当)
* [AWSソリューションアーキテクト（アソシエイト）の教科書(SAA-C03) (MAISON DIGITAL BOOKS)](https://www.amazon.co.jp/gp/product/B0C8VCDFZ3/) 
:::note info
各サービスの概要が簡潔にまとめられています。
**Polly**、**Kendra**等名前からサービス内容を連想しにくいものを丸暗記する目的で電車通勤中にパラパラめくって単語帳のように使いました。各章末に演習問題もあります。個人的にはパラパラの邪魔なので、巻末にまとめてもらったほうがよかったです。
AWSのサービスには「AWS ほにゃらら」と「Amazon ほにゃらら」があり、長年「なぜ統一しないのか？」ともやもやしておりました。その説明が本書のコラムに記載されているのを見つけたときは、思わず飛び上がりました🤩。
:::

## 3. インプット2(英語学習なら英文法に相当)
* [AWS認定資格 ソリューションアーキテクト-アソシエイトの試験対策から学ぶ！超クラウド入門書【SAA-C03】: IT資格試験学習サイト「Ping-t」の最強WEB問題集を活用したインフラエンジニア登竜門資格の独学勉強法を徹底解説！ IT業界超入門書](https://www.amazon.co.jp/gp/product/B0BQJNHDVX/)
:::note info
書名にあるとおり本書と「Ping-t」の最強WEB問題集の組み合わせてインプット＆アプトプットサイクルを回すことができます。Kindle Unlimitedに含まれてますし、「Ping-t」のSAAの最強WEB問題集も本稿の執筆時点で無料ですのでコスパがよいです。
:::
* Exam Prep Standard Course: AWS Certified Solutions Architect - Associate (SAA-C03 - Japanese) (Na) 日本語実写版
:::note info
AWS SkillBuilderのコースです。AWS Certified Solutions Architect - Associateに関する前提知識の解説を日本語で確認できます。
:::
* [【ベストセラー完全日本語化】AWS 認定ソリューションアーキテクト アソシエイト SAA-C03 対応 2023 最新版](https://www.udemy.com/course/jp-aws-certified-solutions-architect-associate-2021/)
:::note info
Udemyの教材です。講師の方の話し方がソフトでとてもわかりやすいです。
私は時間が足りず省略しましたが、ハンズオンをしっかりやれば十分な学習効果が得られると思います。
(もし購入されるのであれば、お手頃価格で購入できるセール時を狙うことをお勧めします。)
:::

## 4. アウトプット(英語学習なら英会話に相当)
* [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)
:::note info
AWS SkillBuilderのコースです。AWS公式の模擬試験20問を日本語で受験できます。解説もあり、間違えた問題を復習できます。
:::
* [Pint-t 最強問題集 AWS ソリューションアーキテクト - アソシエイト(SAA-C03)](https://mondai.ping-t.com/g#content-large_category_2)
:::note info
これが無料とは🤩！！問題集の冒頭にきちんと注意書きされておりますが、すべての問題が実試験と同等の難易度ではないことを理解した上で学習を進める必要があります。
:::
* [CloudTech AWS資格演習対策コース  SAA-C03 Solutions Architect – Associate](https://kws-cloud-tech.com/lessons/saa-c03-solutions-architect-associate)
:::note info
有料ですはありますが、問題の質・量ともに十分です。問題ごとに解説動画があり、間違えた問題は解説動画を視聴することで自分に足りない知識をすぐ明確にすることができます。私は正解した場合には解説動画の視聴は省略しました。UIが前述のPing-t 最強問題集(無料)より劣るのが唯一の難点です。
:::

## 5. その他 
インプット＆アウトプットサイクルで浮き彫りになった自分の苦手分野に関する知識を補います。私の場合は以下の書籍のお世話になりました。
* [AWSの薄い本　IAMのマニアックな話](https://www.amazon.co.jp/gp/product/B085PZCMG2/)
* [要点整理から攻略する『AWS認定 セキュリティ-専門知識』 (Compass Booksシリーズ) ](https://www.amazon.co.jp/gp/product/B08DCLRHC7/)
* [要点整理から攻略する『AWS認定 高度なネットワーキング-専門知識』 (Compass Booksシリーズ) ](https://www.amazon.co.jp/gp/product/B09T2B93NY/)
mruby/cでVMとMRBを分離

RX210はCode FlashとData Flashという書き込みできる領域があります。R5F52108ADFPの場合Code Flashが512KバイトでData Flashが8Kバイトです。

Code FlashはROMと呼ばれていて、Data FlashはE2 Flashとも呼ばれます。

書き込み保証回数はCode Flashが1000回でData Flashが100000回です。

mruby/cのようなプログラムの場合、VM部分よりRubyスクリプトから生成したMRB部分の方が変更の頻度が多いと思われます。

このためCode Flashに焼かれるVMのソースでMRBの配列を読み込まず、MRBをData Flashに置いてそこからよむようにしました。

当初Renesas Flash ProgrammerでData Flashのみ書き換えようとしたのですが、Data Flashを書き換えると、Code Flashに残っているはずの、VMが起動しなくなります。

あきらめて、VMにxmodemを入れて、受信したデータをData Flashに書き込む機能を実装してみました。

メニューは作ってありませんが'x'でxmodemでMRBを受け取ってData Flashにかき、'r'でData FlashのMRBを実行するようにしてみました。

コードはルネサスの正式なサンプルコードのr_flash_api_rxをE2アクセスのみにして割り込みを使わない実装に修正されたコードがあったので、それを使いました。

RLoginのxmodemの機能でダウンロードしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/5a6fcf55-4b4b-c520-094e-c1c762d145d1.png)

xmodemはいい加減な実装ですがコードはこれです。

https://github.com/yamori813/rx-mrubyc/tree/c68e733478e82b8b21cf8cb7ea573ebb2875ded6

mruby/cでは[MRBの標準ダウンロード仕様](https://qiita.com/HirohitoHigashi/items/439494cde09da6350bde)があったのですが、独自仕様になります。

itocさんがWindowsのmrbc.exeを提供してくれているので、WindowsだけでMRBを作ってダウンロードして実行することが出来るようになりました。

MacOS XでもMRBを保存してみました。

screenでCP/M8266とのやりとりのため作った[xmodemのコマンド](https://github.com/yamori813/xm)を使いました。

```
:exec !! ./xs sample_serial_echo_server.mrb
```

![スクリーンショット 2024-08-04 14.45.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/bb16325b-fec5-27a0-b714-31574b811b87.png)

El Capitanではmruby 3.3がビルドできなかったので、itocさんからビルド済みのバイナリをダウンロードして使いました。
【ChatGPT＋Code Interpreter】で背景を塗りつぶせ。


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

　今回は、背景を塗りつぶします。先日（2024/08/01）の続きです。

:::note info
本記事は、ChatGPT（有料版）
で行なっております。画像は
あります。　あしからず。
:::

　ニュースはないので、
　　さっそく本題です。

　先日（2024/08/01）、
　　白い背景に
　　　黒丸を大きくしたり
　　　　小さくしたりの
　　　　　アニメGIFを作成しました。
[【ChatGPT＋Code Interpreter】で白い背景に、黒丸を大きくしたり小さくしたりするアニメGIFを作成します。](https://qiita.com/kabumira/items/175850559acd650433e7)

　今回は、その続きです。

　目的には合わなかったものの
　　後日、続けてみた内容になります。

　前回は
　　0.5秒の小→大→小でした。

　ではと、
　　黒丸をどんどん大きくして
　　　背景を塗りつぶしてみたのです。
```Text:白い背景を黒丸で塗りつぶすPrompt
CodeInterpreterで、白い正方形（512×512）の中央に、黒い真円がだんだん大きくなって、背景をすべて黒にするアニメGIFを作成してください。
コードは不要です。
不明な点があれば質問してください。
```

　結果は
　　黒丸の直径が
　　　背景の辺の長さと
　　　　同じになったところで
　　　　　終わりました。
![expanding_circle (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/8332f396-f4d5-982b-0d81-58513cc226f3.gif)

　どうして
　　そうなった？
***
***user***
黒丸の縁が背景の辺に触れると、そこで止まってしまうのですが、それは仕様なのですか？
説明してください。

***GPT-4o***
黒い真円が背景の辺に触れて止まるのは、画像のサイズとアニメーションの仕様によるものです。具体的には以下の理由があります。

1. **画像サイズの制限**: 作成された画像のサイズは512×512ピクセルであり、円の半径がその半分（256ピクセル）まで成長します。このため、円が成長して背景の端に触れると、それ以上大きくなることはできません。

2. **アニメーションの段階的な増加**: 円の半径はアニメーションの各フレームで少しずつ増加します。最終フレームでは、円の半径が画像の半径に達するように設定されています。

もし円が背景の端を超えてさらに大きくなるようにしたい場合は、円の半径を更に大きく設定するか、画像のサイズを大きくする必要があります。どちらの方法が適切か、具体的な要望を教えていただければ、それに応じた修正を行います。

***user***（ふむ、なるほど）
黒丸の直径は、最終的に背景の対角線と同じになります。

***GPT-4o***
（ダウンロードリンク）
***

　出来上がりが
　　こちらになります。
![expanding_circle (4).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/850ee26e-24d3-3dde-5a54-b75f9e0e782a.gif)

　私の
　　最初のイメージどおりに
　　　なりました😸

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

　今回は、ここまで。
【初心者向け Java】 ScannerとBufferedReaderの違いについて 

コーディング初心者あるある。
「Scanner,BufferedReaderのどちらを使えばいいかわからない！」
って題材で書いていく。

①'Scanner'クラスについて
特徴
１．簡単な入力処理が可能
２．close処理が必要


以下に例を記載する。

```Java
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.println("Enter an integer:");
        int n = scanner.nextInt();
        
        System.out.println("Enter a string:");
        String str = scanner.next();
        
        System.out.println("You entered: " + n + " and " + str);
    //最後にclose処理が必要！
        scanner.close(); 
    }
}
```

上記のようにScannerクラスを使用すると処理を終了する前で

```Java
scanner.close(); 
```

を書く必要があります。
JavaSilever勉強中の方であれば、
try-catch-finally構文もclose処理が必要で閉じ忘れがめんどくさいから、
try-with-resource構文を使うようなイメージかな。

結論
scannerクラスは実装が短く済む一方で、close処理が必要だから気を使いましょう。


②'BufferedReader'クラス
特徴
１．大量のテキストデータを効率的に読み取ることができる。
２．BufferedReadearはInputStreamReaderと組み合わせて使用する。

実際に例を見てみよう。
```Java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) {
        try {    //まずtry-with-resource構文の形式で書く。
            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
            
            System.out.println("Enter an integer:");
            int n = Integer.parseInt(reader.readLine());
            
            System.out.println("Enter a string:");
            String str = reader.readLine();
            
            System.out.println("You entered: " + n + " and " + str);
            
        } catch (IOException e) {    //最後にcatchする。
            e.printStackTrace();   //エラー処理
        }
    }
}
```

あれ、なのでBufferedReaderとInputStreamReaderどちらも必要なんだ？
って思いませんか？（←僕は昔思いました）

その理由としてそれぞれのクラスの役割と流れを知りましょう。

InputStreamReader：バイトストリームを文字ストリームに変換する。
BufferedReader：InputStreamReaderをラップ（※１）してバッファリングを行い、効率的な読み取りを実現する。
。

ラップは感覚としてはチェーンメソッド的な感じです↓
```Java
BufferedReader br = new BufferedReader(isr); //isrはInputStreamReaderの変数
```

つまり、上記の二つのクラスを使うことで、効率的に文字入力ストリームを処理することができるのです。効率的というのは、readLine()メソッドを使ってシンプルに高速に処理できるという意味。

最終的にどっちが使い勝手いいんですか！（怒）

回答：どちらもメリットデメリットあるので下記を見て使いやすい方で使い分けてください。

BufferedReaderを使うべき場合
①大量のデータを高速に読み取る必要がある場合：BufferedReaderはバッファリングにより、効率的な読み取りが可能。
②一行単位での読み取りが中心の場合：readLine()メソッドで一行ずつ読み取るのが簡単。
③細かい制御が必要な場合：低レベルの操作や特殊な入出力処理が必要なときに向いている。

Scannerを使うべき場合
①ユーザー入力の解析が必要な場合：整数、浮動小数点数、文字列などのプリミティブデータ型を簡単に読み取ることができる。
②トークン単位での入力分割が必要な場合：nextInt(), nextLine()などのメソッドを使って入力をトークンに分割できます。
③正規表現による入力のパターンマッチングが必要な場合：入力を特定のパターンに基づいて分割することができる。

まとめ
シンプルかつ効率的な一行単位の入力にはBufferedReader。
多様なデータ型の入力解析やトークン単位の分割が必要な場合にはScanner。

以上、ご覧いただきありがとうございました。
LibreOfficeCalc: Python マクロ: コラムのコピー

KからQ のコラムを、QからU にコピーします。
値とコラムの幅をコピーします。

## プログラム

```py:.config/libreoffice/4/user/Scripts/python/column_copy.py
import uno

def column_copy():
	doc = XSCRIPTCONTEXT.getDocument()
	sheet = doc.getCurrentController().getActiveSheet()
#
	range_src = sheet.getCellRangeByName("K1:O50")
	range_target = sheet.getCellRangeByName("Q1:U50")
	
	range_target.setDataArray(range_src.getDataArray())

	for it in range(5):
		range_target.getColumns()[it].Width = range_src.getColumns()[it].Width
#
	return
 ```
【C++】あれ、OpenCVのimread/imwriteで日本語パス使えるじゃん？

## はじめに
私の所属するチームにおいて、OpenCVでは日本語が読めないのでは？という話題が上がりました。ネットを調べていても、OpenCVでは日本語（マルチバイト文字）を読めないという記事がいくつかヒットします。

百聞は一見に如かずということで、私のWindows環境でも試してみました。

### 参考記事
https://qiita.com/picpie/items/8a4b865c17ce6dc72c7e

https://github.com/opencv/opencv/issues/4292#issuecomment-601686965

## 結論
- C++のOpenCVで、日本語パスの画像を問題なく読み書きすることができました。（※ 私のWindows環境では）
  - **ファイルパスをstd::stringで指定**すれば問題なさそう 

下記に、検証コードと検証結果を貼り付けます。


## 検証環境
- OS: Windows 11 Home (22H2)
- CPU: 11th Gen Intel(R) Core(TM) i7-11390H @ 3.40GHz   2.92 GHz
- Visual Studio: 2022 (v143)
  - Windows SDK: 10.0
  - C++言語標準 ISO C++ 20
- OpenCV: https://opencv.org/releases/
  - Lib: opencv_world4100.lib
  - Dll: opencv_world4100.dll 

## 検証方法
1. 下記のように日本語文字および空白文字が含まれる画像パスになるよう、画像を配置します
2. サンプルコードを用意します
      - cv::imread()
      - cv::imshow()
      - cv::imwrite()
3. サンプルコードを実行し、画像を問題なく読み書きできることを検証します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349189/e8189909-998a-e754-84e9-287f5fe1932d.png)

## サンプルコード
```C++
#include <iostream>
#include "opencv2/opencv.hpp"
#include <string>
#include <array>

int main()
{
	// 画像ファイルのパス
	std::array<std::string, 2> fileStrings = { 
		R"(C:\テストデータ\日本語 空　白あり\sample.jpg)",
		R"(C:\テストデータ\日本語 空　白あり\サンプル - コピー@！＃.jpg)"
	};
	std::for_each(fileStrings.begin(), fileStrings.end(), [](std::string fileString) {
		try {
			// 画像ファイルを読み込む
			cv::Mat	image = cv::imread(fileString);

			//エラー処理
			if (image.empty() == true) {
				std::cout << "読み込みに失敗しました" << std::endl;
				return -1;
			}

			// ウィンドウに画像を表示する
			cv::imshow(fileString, image);

			// キーが押されるまで待つ
			cv::waitKey(0);
			//  画像を書き出し
			const int ret = cv::imwrite(fileString + "の出力結果.png", image);
			std::cout << "書き込み結果 = " << ret << std::endl;
		}
		catch (cv::Exception& e) {
			std::cerr << e.what() << std::endl;
			return -1;
		}
	});

	return 0;
}
```

## 出力結果
- cv::imshow()の出力例
  - 読み込んだ画像がWindowに表示されています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349189/9747c727-9ef6-f1eb-0627-aba3d69aeb36.png)

- コンソール出力結果
  - 書き込みも正常終了しています  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349189/32728105-ec7c-3684-a30b-f28fbb242294.png)

- 画像ディレクトリのファイル
  - 指定したディレクトリに出力結果が.pngで出力されています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349189/00c58d99-1948-6c99-a94f-b3a18d18c8d8.png)

## まとめ
今回私が実施した環境では、日本語パスの画像も問題なく読むことができました。char, wchar, wstring等は試していませんが、std::stringであれば問題なさそうです。

### 日本語パスの読み込みに失敗する例（この記事の反例）がありましたら、コメント💬いただければ嬉しいです。
awsume で本番プロファイルにスイッチロールすると赤背景で警告

[awsume]:https://awsu.me/
[warp]:https://www.warp.dev/


[awsume] を使って Mac Terminal 上で AWS Profile を切り替えているケースで、本番アカウントの AWS Profile へ切り替えた際に **<font color="Red">赤背景にして注意喚起</font>** を促す設定です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60131/9f868ced-c0c8-1d17-06d5-de1201d36d5e.png)

# 環境・制限

本記事の方法は次の環境のみが対象です。

* スイッチロールに [awsume] を使用している
* zsh ユーザーのみ対象
* zsh 標準のプロンプト設定 `PROMPT`, `PS1` が有効なターミナル

:::note alert
[warp] 等、何らかのツール・設定で既にプロンプト設定が書き換えられている場合は、残念ながら本記事の設定は効きません。
:::

# やり方

zsh の設定ファイル `~/.zshrc` に下記設定を記述します。

```shell:~/.zshrc
# PROMPT for awsume.
if [[ $SHELL == *'zsh'* ]]; then
  function set_awsume_prompt() {
    if [[ $AWSUME_PROFILE =~ ^.*(pro|prd).*$ ]]; then
      _PREV=${_PREV:-$PROMPT}
      export PROMPT='%K{red}%B[PRODUCTION] %~ %#%K%b '
    elif [[ -v _PREV ]]; then
      export PROMPT=$_PREV
      unset _PREV
    fi
  }
  autoload -Uz add-zsh-hook
  add-zsh-hook precmd set_awsume_prompt
fi
```

:::note
AWS Profile 名 (`$AWSUME_PROFILE`) に、文字 `production` `prd` `prod` を含むケースを本番プロファイルに切り替わったと判定しています。
:::
非対称ルーティングってなんぞや？？？

## ネットワークの知識
- AWSクラウド基盤案件に携わって6年程度。
- それまでは（オンプレミス）アプリケーション開発に従事することが多かったので、苦手にしていた分野でもある。
  - まだまだ分からない事が多いですがメンバーにも助けられ、日々の業務や自己研鑽の時間でキャッチアップを行なっています。

## きっかけ
- AWS Certified Advanced Netwoking Speciality の 受験勉強していた時に、聞いたことのなかったキーワードが出てきたぞ！
  - 『非対称ルーティング』
    - ん？　何それ？
- リクエスト側サブネット構成が3AZで、対向側サブネットの構成が2AZで、PrivateLink を構成した場合、『非対称ルーティング』になるのではないか？という疑問から

## そもそも非対称ルーティングってなんぞや？？？
ChatGPT o4 先生に聞いてみると下記回答で応答がありました。
> 非対称ルーティング（Asymmetric Routing）は、送信経路と受信経路が異なるルーティングパスを通る状況を指します。
これは、ネットワークパケットが送信元から宛先に到達する際の経路と、返信パケットが宛先から送信元に戻る際の経路が異なる場合に発生します。

下記AWSでは、Transit Gateway を利用したケースがドキュメントが検索でHITしてきます。
[AWS Transit Gatewayトラフィックフローと非対称ルーティング](https://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/inline-traffic-inspection-third-party-appliances/transit-gateway-asymmetric-routing.html)

### 非対称ルーティングの発生要因
非対称ルーティングが発生する要因は、下記の４つが列挙されるらしい
1. ネットワーク上に複数のルーティングパスが存在し、それぞれのパスが異なるルートテーブルやルーティングポリシーを持つ場合
2. トラフィックを複数の経路に分散するためのロードバランサーが設定されている場合
3. 送信と受信が異なるルーティングポリシーを使用している場合
4. ネットワーク構成の変更やルーティングテーブルの変更により、一部のパケットが異なる経路を通るようになる場合

PrivateLink は、サービス側に NLB を構築しているので、2. には合致する。
他は特に問題なさそうだ

### 自分の理解
前述でも例に出したように、リクエスト側サブネット構成が3AZ で、
対向側サブネット構成が2AZ のケースで考えてみる。
#### 前提条件
- ルートテーブル、Network ACL の設定は、制限をかけるような設定を行なっていない。
  - 前述の「[非対称ルーティングの発生要因](https://qiita.com/drafts/bd762dfc1819958a8644/edit#%E9%9D%9E%E5%AF%BE%E7%A7%B0%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%AE%E7%99%BA%E7%94%9F%E8%A6%81%E5%9B%A0)」に記載の内容で、1, 3, 4 の設定

#### 送信経路
- ap-northeast-1d の EC2インスタンスから、対向側へのリクエストを送信
- ap-norheast-1d の Endpoint から 対向側の VPC Endpoint Ssrvice(NLB) へ
- 対向側には、ap-northeast-1d にサブネットが構成されていないため、NLBの動作としては、ap-northeast-1a, 1c のいずれかのEC2インスタンスが応答する。
- この場合は、ap-northeast-1a の EC2インスタンスが応答した。

#### 受信経路
- ap-northeast-1a からの応答なので、戻ってくる経路としては、ap-northeast-1a の VPC Enndpoint を経由してくる
- その後、ap-northeast-1d に配置されているEC2インスタンスへ戻る

![非対称ルーティング_01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1107799/bc477b86-0d02-cbad-d662-a616811562ea.jpeg)


### AWSサポートに問い合わせた回答
AWSサポートに問い合わせてみました。
今回のケースにおいては、非対称ルーティングとはならない旨の回答が説明とともに返信がありました。

#### 送信経路
- ap-northeast-1d の EC2インスタンスから、対向側へのリクエストを送信
- ap-northeast-1a, 1c の Endpoint から 対向側の VPC Endpoint Service(NLB) へ
- この場合は、ap-northeast-1a の EC2インスタンスが応答


#### 受信経路
- ap-northeast-1a からの応答なので、戻ってくる経路としては、ap-northeast-1a の VPC Enndpoint を経由してくる
- その後、ap-northeast-1d に配置されているEC2インスタンスへ戻る

#### 違い
- 送信経路で、リクエスト側のEC2インスタンスから、VPC Endpoint への経路が、先を見通して ap-northeast-1a, 1c を選択する
  - 最初の経路選択で非対称ルーティングとならないように制御されているようだ

![非対称ルーティング_02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1107799/933dd217-6080-2d8f-3100-c559ad66bd67.jpeg)

## まとめ
- PrivateLink では、「非対称ルーティング」にはなり得ない
  - ただし、「[非対称ルーティングの発生要因](https://qiita.com/drafts/bd762dfc1819958a8644/edit#%E9%9D%9E%E5%AF%BE%E7%A7%B0%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%AE%E7%99%BA%E7%94%9F%E8%A6%81%E5%9B%A0)」 に 2. 以外の設定を行なっているケースは起こり得る事がある。
- 今回のケースでは比較的構成も単純でしたが、複雑なケースやTransit Gateway を導入したケースについてはまだ理解が追いついていないところもある
  - 今後、試験の復習、業務での経験も深めながら、またこのテーマで深掘りできたら良いと感じた。
- 色々、確認しながら試験勉強も進めていたおかげもあり、AWS Certified Advanced Networking Speciality には２回目の挑戦でなんとか合格できました。
【ISUCON】pt-query-digestのログが文字化けするときの対処法

## 文字化けの経緯

https://gihyo.jp/book/2022/978-4-297-12846-3

↑のISUCON本を進めていたら、途中まで問題なく使えていた「pt-query-digest」のログがめっちゃ文字化けし始めました。

具体的には、273ページの『アップロード画像を静的ファイル化する』を実施した後ぐらいからログの一部が文字化けするようになり、解析に支障が出るほど可読性が低下してしまいました。

## 対応方法
おそらくですが、273ページで行った静的ファイル化によって起きてしまう文字化けなので、それ自体はしょうがないっぽいです。
（文字化けが嫌だから改善をしない、というわけにはいかないですもんね...）

ただ、そのせいでログが見づらくなって全体の解析に支障が出ていることは解消したいです。

ということで、ログをターミナル上で確認するのではなく別のファイルに出力させてみたところ、可読性を回復できました！
```shell 
# ログの結果をa.logファイルに出力
% pt-query-digest /var/log/mysql/mysql-slow.log > a.log

# a.logに記録されたログを確認する
% cat a.log
```

## おわりに
文字化けの根本的な解決になっておらず恐縮ですが、とりあえずログを見やすくしたい！という方はぜひ試してみてください。
d

<iframe width="914" height="514" src="https://www.youtube.com/embed/oYAMe9-Lkxc" title="【崩壊：スターレイル】「2024スターレイルLIVE」公式配信録画(Full ver.)" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
LibreOfficeCalc: Python マクロ: セルのコピー

## プログラム

```py:.config/libreoffice/4/user/Scripts/python/cell_copy.py
import uno

def cell_copy():
	doc = XSCRIPTCONTEXT.getDocument()
	sheet = doc.Sheets[0]
#
	for it in range(8,17):
		cell_src = sheet['B%d' % it]
		cell_target = sheet['K%d' % it]
		vv = cell_src.getString()
		cell_target.setString(vv)
#
		cell_src = sheet['C%d' % it]
		cell_target = sheet['L%d' % it]
		vv = cell_src.getString()
		cell_target.setString(vv)
#
	return
 ```

 ## 参考ページ

 [LibreOffice: Python のマクロを使う](https://qiita.com/ekzemplaro/items/d456b105aa918302e273)
 [LibreOfficeCalc: Python のマクロを作成、実行](https://qiita.com/ekzemplaro/items/91ca81a8d7b465ce2d6c)
【ISUCON】ソースコードをGitHubで管理しよう

ISUCONに取り組む際、ソースをGitHubで管理したい方向けにまとめた記事です。
## 1. サーバに 「isucon」 ユーザで接続する
 AWSのEC2でサーバを立ち上げた想定で説明します。
 
まずはサーバにSSH接続してください。
```shell 
# EC2インスタンスへssh接続
% ssh -i ~/.ssh/[キーファイル名].pem ec2-user@パブリックアドレス(DNSアドレス)
```
ssh接続できたら、「isucon」ユーザに切り替えます。
```shell 
# isuconユーザに切り替え
% sudo su - isucon
```

## 2. 以下の手順書に沿って作業する
以降の手順についてはこちらの資料にわかりやすくまとまっているので、見ながらやってみてください！

https://isucon-workshop.trap.show/text/chapter-3/0-Github.html

ただし、私の場合は資料の通りに進めてもうまくいかない部分があったため、その際の回避方法を3にまとめておきます。

## 3. 手順書で詰まったポイント
### その1: `git push -u origin main` がうまくいかない
ちょっと記憶が曖昧なのですが、プッシュしようとしたら確かこんな感じのエラーが出ました。
```shell 
% git push -u origin main
 ! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'https://github.com/<user>/<repo_name>.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
```
で、こちらの記事の通りに対応したら無事にプッシュできました！

https://qiita.com/mei28/items/85bc881ac1f26332ac15

## 4. おわり
この手順を踏めば、ISUCONのソースをGitHubで管理できるかと思います！
最後まで読んでくださりありがとうございました！
論点思考


### はじめに
高松 智史さんの"アウトプットを生み出す「６ステップ」"が深い。
方向を合わせて、狙って、打つまでの、
方向を合わせるの部分をステップで明確にした方法です。

### アウトプットを生み出す「６ステップ」  
  
① ロ：論点 
② サ：サブ論点 
③ Ｔ：Task 
④ ス：スケジュール 
⑤ 作：作業 
⑥ ア：アウトプット 
  
※関連  
アウトカム 
議論 ⑥の後で行う

### 論点とはなに？
★TODO

### 参考
[1] 論点（＋サブ論点）の立て方～クリティカル・シンキングと比較しながら学ぶ
https://kanataw.com/knowledge/all/becoming-a-consultant/consultant-work-technique/sub-issue/

[2] 【打ち手バカ上司に価値はない】『コンサルがマネージャー時代に学ぶコト』著者が説くニュータイプ管理職／部下の信頼得る“インテレクチャルリーダーシップ”って何？
https://www.youtube.com/watch?v=SIkQxbo9D6Y

[3] コンサルが「マネージャー時代」に学ぶコト 知るだけでビジネスモンスターになれる79のスキル/思考と矜持 
https://www.amazon.co.jp/%E3%82%B3%E3%83%B3%E3%82%B5%E3%83%AB%E3%81%8C%E3%80%8C%E3%83%9E%E3%83%8D%E3%83%BC%E3%82%B8%E3%83%A3%E3%83%BC%E6%99%82%E4%BB%A3%E3%80%8D%E3%81%AB%E5%AD%A6%E3%81%B6%E3%82%B3%E3%83%88-%E7%9F%A5%E3%82%8B%E3%81%A0%E3%81%91%E3%81%A7%E3%83%93%E3%82%B8%E3%83%8D%E3%82%B9%E3%83%A2%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%BC%E3%81%AB%E3%81%AA%E3%82%8C%E3%82%8B79%E3%81%AE%E3%82%B9%E3%82%AD%E3%83%AB-%E6%80%9D%E8%80%83%E3%81%A8%E7%9F%9C%E6%8C%81-%E9%AB%98%E6%9D%BE-%E6%99%BA%E5%8F%B2/dp/480261439X

###
Conohaサーバーにssh接続できない、、、？

railsを雑にデプロイする練習をしようと、conohaサーバーを借りてssh用のキーを生成してローカルの設定もして、いざssh！としたけど、コンソールが一定時間停止した後、timeoutとなってしまいました。
私の場合、になりますが、conoha側のセキュリティグループ設定をしていないことが原因だったようです。

忘備録として対処法を残しておきます。

## 前提
* konohaのサーバーを借り、ssh用のポートが開いている
* sshコマンドを使用すると、しばらく何も表示されない時間が続き、のちにtimeoutとなってしまう



## 対処法
1. konohaコンソールにログインする
2. セキュリティグループにssh接続の設定を追加する

だけです。以下参考キャプチャです。
1. konohaコンソールへ移動し、サーバー設定へ
2. セキュリティーグループに、ssh接続設定を追加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2704095/c85ac0bb-85a6-9c92-def0-619aceed7b59.png)

ssh用ポート番号を変えていない場合は上記で終了です。

※セキュリティ上、ssh用のポートを変更している場合は以下手順でセキュリティグループを別途作成します。上記設定は22番ポートの開放になっています。

セキュリティグループを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2704095/5713f4b5-e0dd-184f-4c26-1011cee24c2d.png)

 +セキュリティーグループボタンから、グループを追加（詳細設定は追加後にできます）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2704095/34a4e8b8-9a03-0695-5ed3-5557a13dcb60.png)

編集し、該当のポート番号の開放設定を追加する（画像は12345番ポートを開放した設定です。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2704095/81229b15-26bf-1dd1-d7c9-6be773a7cd67.png)

以上で終了です。ssh接続ができるか試してみてください。
Azure SQL Database で動的データマスク（DDM）を試してみた

私は、動的データマスクを、個人データや機密データを保護する目的で、データベースにアクセスするユーザーやロールに対してデータをマスクして表示する技術だと理解しています。今までインフラや CI/CD 周辺の仕事が多かったので、知識としては知っていた動的データマスクを実際に試してみました。

## Azure SQL Database Free のクエリーエディターでテストデータを作成

```sql:sql
CREATE SCHEMA Data;
GO

CREATE TABLE Data.Membership (
    MemberID INT IDENTITY(1, 1) NOT NULL PRIMARY KEY CLUSTERED,
    FirstName VARCHAR(100) MASKED WITH (FUNCTION = 'partial(1, "xxxxx", 1)') NULL,
    LastName VARCHAR(100) NOT NULL,
    Phone VARCHAR(12) MASKED WITH (FUNCTION = 'default()') NULL,
    Email VARCHAR(100) MASKED WITH (FUNCTION = 'email()') NOT NULL,
    DiscountCode SMALLINT MASKED WITH (FUNCTION = 'random(1, 100)') NULL
);
GO

INSERT INTO Data.Membership (FirstName, LastName, Phone, Email, DiscountCode)
VALUES
('Roberto', 'Tamburello', '555.123.4567', 'RTamburello@contoso.com', 10),
('Janice', 'Galvin', '555.123.4568', 'JGalvin@contoso.com.co', 5),
('Shakti', 'Menon', '555.123.4570', 'SMenon@contoso.net', 50),
('Zheng', 'Mu', '555.123.4569', 'ZMu@contoso.net', 40);
GO
```

## MASKED WITH (FNCTION = '') のマスクルールを理解

### partial(1, "xxxxx", 1)

最初と最後の文字以外を x でマスクする。

### default()

全て x でマスクする。

### email()

Email 形式でマスクする。

### random(1, 100)

1 から 100 の間の数値でランダム表示する。

## まずは管理者でマスクなし表示

```sql:sql
SELECT * FROM Data.Membership;
```

![azure-sql-database-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/60e296ce-31c6-bf45-de10-448fd516a55d.png)

## マスク表示用ユーザーを作成

```sql:sql
CREATE USER MaskingTestUser WITHOUT LOGIN;

GRANT SELECT ON SCHEMA::Data TO MaskingTestUser;
```

## マスク表示を試す

```sql:sql
EXECUTE AS USER = 'MaskingTestUser';

SELECT * FROM Data.Membership;

REVERT;
```

![azure-sql-database-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/e069aabf-937c-1f92-1ed1-528abe0ad709.png)

## Azure ポータルから動的データマスクの状態を確認

![azure-sql-database-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/ec944fc7-eea2-b397-fbc1-64659ecc829c.png)

## 参考

https://learn.microsoft.com/ja-jp/sql/relational-databases/security/dynamic-data-masking?view=sql-server-ver16#examples
rex0220 計算式プラグイン レコード再利用時テーブル最終行のみ設定

計算式プラグインで、レコード再利用時テーブル行に最終行のみを設定する例です。

# 概要

[計算式プラグイン](https://qiita.com/rex0220/items/ae83c6d5ce50ff7a9a73)を使って、レコード再利用時に特定のテーブル行のみを設定することが出来ます。
レコードを再利用するアクション機能でも適用されますので、再利用する項目を指定できます。

※テーブル内にルックアップ項目が無いこと

![2024-08-03_10h02_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/1b1b800d-a592-5e96-474e-c9a2cf7e4e72.png)

# 操作例

![2024-08-03_10h11_11.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/deca6359-5211-5866-7968-7010c05ab1ca.gif)

# 計算式プラグイン設定

循環参照を許可をチェックします。
レコード追加イベント時に、テーブル最終行のみセットします。
TPFILTER 関数で、特定行のみ選択することが出来ます。

![2024-08-03_10h15_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/5e700ab4-c203-1ffc-ed50-9e39bfe1a931.png)


```.js
OPTION: 循環参照を許可

// テーブル SUBTABLE (editable)
IF(IN(EV_INFO("type"),"app.record.create.show","mobile.app.record.create.show"),
  TABLE_SORT(テーブル,
    TPFILTER(COUNTROW(テーブル)=(ROWNO(テーブル)+1))
  )
)
```
Javaで「文字列の先頭からパターンとマッチするか調べる(Matcher.lookingAt)」の動作を確認してみた

# 概要

Javaで「文字列の先頭からパターンとマッチするか調べる(Matcher.lookingAt)」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/start/regex/index7.html

# 実装

以下のファイルを作成しました。
```JSample7_1.java
import java.util.regex.*;

class JSample7_1{
  public static void main(String[] args){
    String regex = "[0-9]{2}";
    Pattern p = Pattern.compile(regex);

    String[] target = {"AAZ02", "75PPT", "ON24KM"};
    for (int i = 0 ; i < 3 ; i++){
      Matcher m = p.matcher(target[i]);
      if (m.lookingAt()){
        System.out.println(target[i] + "は" + m.group() + "の部分とマッチしました");
      }else{
        System.out.println(target[i] + "はマッチしませんでした");
      }
    }
  }
}
```

以下のコマンドを実行しました。
```
$ javac JSample7_1.java 
$ java JSample7_1 
AAZ02はマッチしませんでした
75PPTは75の部分とマッチしました
ON24KMはマッチしませんでした
```

# まとめ

何かの役に立てばと。
Macのターミナルで日本語を入力できない

## 問題
MacのターミナルでDBの操作中に日本語を入力してエンターを押すと、消えてしまう事象が発生しました。

## 解決方法
~/.bash_profileに以下を追記します。

~/.bash_profile
```sh
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
```

その後、ターミナルで以下を実行して、設定を反映させます。
```sh
source ~/.bash_profile
```

## 参考
https://zenn.dev/takuyanagai0213/articles/12b258356b57e3
「スッキリわかるPython入門第2版」を読んで

## はじめに
　今までpaizaでpythonについて学習していましたが、「スッキリわかるPython入門第2版」を購入し改めて学習し直しました。その中で学んだことを記憶するためにまとめます。

 https://amzn.asia/d/iJ2h5L8

 ### 1. ヒアドキュメント
 ```
 '''
 文字列1
 文字列2
 :
 '''
```
 - 三連続引用符の間に記述した、文字が入力したとおりの文字として解釈される
 - 三連続の引用符はダブルクォーテーションでもよい
 - 最後の引用符の後に`.strip()`を追加すると前後の改行を除去できる

### 2. アンパック代入
```
name, age = 'タナカ', 24
```
- 変数と値の要素をそれぞれ,(カンマ)で書き並べ＝記号を間に入れることで、変数にまとめえて代入することができる

### 3. 文字列の中に値を埋め込む
```
'{}を含む文字列'.format(埋め込む値1, 埋め込む値2, ・・・)

例)
name = 'tanaka'
age = 24
print(''私の名前は{}です。年齢は{}歳です。).format(name, age) 
```
- 文字列の中の値を埋め込みたい場所に波括弧をかく（複数可）
- formatの丸括弧内に、埋め込みたい値をカンマ区切りで順番に並べる

### 4. f-string
```
f'{}を含む文字列'
```
- 文字列中に値を埋め込みたい場所に波括弧を書く（複数可）
- 波括弧の中には式や関数も記述できる
- 文字列の中に引用符を使用したい場合は、別の引用符で囲む必要がある
- python3.6以降のバージョンで使用可能
- 波括弧の中には式や関数も記述可能

### 5. スライスによる範囲指定
``` 
リスト変数[A:B]
```
- 添え字がA以上B未満の要素を参照する部分リストに評価される
- A: と指定すると、添え字がA以上すべての要素を参照する
- :B と指定すると、添え字がB未満のすべての要素を参照する
- :　のみ指定するとすべての要素を参照する
- 負の数を使うことで末尾から扱うこともできる

### 6. in演算子
- 右辺に左辺の値が含まれているかを判定する比較演算子
```
キー in ディクショナリ
```
- キーがディクショナリに存在する場合は条件成立、存在しない場合は不成立

### 7. 繰り返しの強制終了とスキップ
- 繰り返しの中で`break`を記述するとその時点で繰り返しを強制終了する
- 現在のループ周回を中断して同じ繰り返しを継続する際には`continue`を記述する

## おわりに
　この本を読んでPythonの基礎をしっかり学ぶことができました。まだまだ学習不足なところもあり、復習しつつ、機械学習やデータ分析などにも学習を進めていきたいと思います。
Lightning Experience のホームページでアシスタント

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめA～M](https://qiita.com/Keiji_otsubo/items/f3ddedee6793bf1576f8)


+ [What populates in "Assistant" and how can I customize?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007eqaVg)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/d41c75e4-fa78-a235-3fbb-e18026bc374d.png)


:::note
This Help Article covers the information that should be displayed within the Assistant. If you utilize Einstein Activity Capture, that rules out a few of the records that you would see otherwise.

+ [アシスタントを使用した重要な更新の表示](https://help.salesforce.com/s/articleView?id=sf.home_assistant_lex.htm&type=5)

:::

アシスタント] には次の更新が表示されます。

+ 本日割り当てられているリード
+ 期限切れの ToDo がある商談 (完了予定日から最大 90 日間)
+ ToDo が依然として期限切れであっても、これらの更新は商談の完了予定日の 90 日後に表示されなくなります。

+ 30 日間活動がない商談
+ 活動予定がない商談
+ 期限切れの商談
+ 完了予定日を過ぎても進行中の商談は期限切れです。完了予定日からの経過日数が 8 日を超えると、これらの更新は表示されなくなります。
【Suno AIでつくった楽曲】しろぶりゅーの歌 ver.9 (3拍子、口笛、ウクレレ)【動画 1分20秒】【YouTubeチャンネルからの転記です】

この記事は、わたしの[YouTubeチャンネル](https://bit.ly/Yamanaka-YouTube "Living without things. 持たない生き方 手放す生き方")にある公開動画を転記しております。
( どこかのタイミングで、プログラミング-Google Apps Script or iPaaS-Zapier をつかって自動転記させる予定です )

転記のための時間コストを少なくしたいので、文字装飾( Markdown記法 )を極力つかわずに書いております。

こちらが動画内容です👇

***

![01 YouTube再生中の画像 Suno AI _ しろぶりゅーの歌 ver.9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386308/a0dcf223-9275-c830-98fb-f9a6c15721e8.png)



* # 動画URL
    * https://youtu.be/m9EMji0VZsg

<br>

* # 動画タイトル
    * 【Suno AIでつくった楽曲】しろぶりゅーの歌 ver.9 (3拍子、口笛、ウクレレ)【動画 1分20秒】

<br>

* # 動画の説明欄(一部を抜粋)

📅撮影日 = 2024-07-27(土)

Suno AIとは、文章から音楽を生成することができるAI( Text-to-Music-AI )です。
わたしは、2024-04-02(火)に初めてSuno AIで有償プランを契約してから、時々楽曲をつくって遊んでいます。

🎦【Suno AI】文章から音楽を生成するAI( Text-to-Music-AI )で、3分間で2曲、6分間で4曲作りました【試聴可能】1)伴侶の曲 2)税理士の曲【動画 16分11秒】
https://youtu.be/QKfhk4HgQ_g

🎦“Suno AIでつくった楽曲”シリーズ
https://www.youtube.com/playlist?list=PLpQhBHT4oghMLdiSVqwvSs_Z5y0H4VGOe

🎦“効果的にSuno AIを活用するヒント”シリーズ
https://www.youtube.com/playlist?list=PLpQhBHT4oghPuaNOVZn-N53wVvsBkeHdI


今回は、Suno AIでつくった曲を WAV で出力してから、動画編集いたしました。

スロージョギングの途中に、早朝の中目黒で偶然出会った「しろぶりゅー」-ShiroBrew-のテーマソング( イメージソングは和製英語です )を、1人のファンとして自主的につくりました。
つまり「しろぶりゅー」のファンメイドテーマソングです。

ぜひ聴いてみてください。
そして、ぜひみなさんも、あなたが大好きなお店やブランドや企業のために楽曲をつくってみてください！

作曲日:
2024-07-20(土)

Suno AI 契約の種類:
Pro Plan

楽曲の正式名称:
しろぶりゅーの歌 #9

Suno AI Library URL:
https://bit.ly/ShiroBrew-09

Custom Mode: On

Audio Inputs: Not Used

With Vocals:


---


Lyrics(without Meta tags):

真っ白な心

そよ風感じる

コーヒーの香りと
真っ白な心


---


Lyrics & Meta tags:

[Break]

[Intro]

[Whistling]

[Verse]
真っ白な心

[Verse 2]
そよ風感じる

[Chorus]
コーヒーの香りと
真っ白な心

[Whistling]

[Outro]


---


Suno AIへの指示文章( プロンプト/Prompt ): Custom Modeの場合は”Style of Music”を指定します。


🇬🇧English

[Waltz][Long song][Female voice][Lo-fi]


🇯🇵日本語訳

[ワルツ][長い曲][女性ボイス][ローファイ]


---


Suno AI 公式URL
https://accounts.suno.ai


SHIROノMONO 公式URL - Instagram
https://www.instagram.com/shiro_nomono


---


✓ 🎥この動画と関連が強いわたしの動画 ↙
　・“Suno AIでつくった楽曲”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghMLdiSVqwvSs_Z5y0H4VGOe


　・“効果的にSuno AIを活用するヒント”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghPuaNOVZn-N53wVvsBkeHdI


　・“Suno AIで3拍子”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghNy-xIeeMZV6D2YAnax9Nzw


　・“しろぶりゅー ファンメイドソング”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghPk5-_YwWl499DNAOVKlcvZ


✓ 🎥Shortened URL for this video | この動画の短縮URL ↙
　https://bit.ly/4bZtKVJ
知財のあれこれをVBAで何とかする

１．ファミリを何とかする(その５）
特許リスト上で何らか作業をする場合に、ファミリだけをまとめて表示させたい、そんな時の処理方法を紹介したいと思います。

２．今回やろうとしていること
今回やろうとしていることは「ファミリ以外の特許を含む特許リストから、ファミリだけを表示させる」ことです。
具体的には以下のような特許リストと、希望するファミリを含む情報を入力すると、特許リストから希望するファミリの行を抽出して表示するような処理を行います。
特許リストはExcel形式を想定しています。

特許リストの例：

![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831931/f8583c39-5408-ce47-6656-6380b6b9257a.jpeg)
(特許リストをtxt形式で貼りつけたものがこちら。メモ帳にコピペしてエンコード「ANSI」で保存（文字化け対策）して拡張子(txt)をcsvにするとExcelで開けます)
```sample.txt
"特許番号","評価","ファミリ"
JP7776655,B,"JP7776655
JP5432123
JP5004321"
JP6665544,C,JP6665544
JP5554433,A,JP5554433
JP5432123,D,"JP7776655
JP5432123
JP5004321"
JP5004321,E,"JP7776655
JP5432123
JP5004321"
```
（エンコード「ANSI」でメモ帳で保存します）
![タイトルなし.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831931/93eacb61-2f40-a1e9-52f5-58dc7c4c8811.jpeg)

最初はpythonで処理するつもりでしたがVBAを使うほうが自然かと思い、今回はVBAで処理します。
上記のような特許リストがあるとします。ファミリ(C列)には複数の特許番号が改行を挟んで連結した状態で収められています。
このような特許リストで以下の特許番号のファミリを含む行だけを表示したいときに、
![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831931/63c016bc-2f7c-e528-5426-820cc22d0c47.jpeg)
以下のプログラムで、ファミリのセル(C2セル)を指定して、指定したセルに含まれるファミリ特許を絞り込む処理を行います。

```vba:vba.xlsm
Sub fmly_flt()
    Dim fmly_arr() As String, i As Integer, fmly As String
    fmly = Cells(2, 3) 'C2セルをファミリとして指定
    fmly_arr = Split(fmly, vbcrLf)  '改行コードで分割
    'テキストからの取り込みデータの場合vbcrlf,Excelセル内改行の場合はvblf
    Range("A1").AutoFilter 1, fmly_arr, xlFilterValues  'A1セルを含むリストを1列目で配列fmly_arrの文字列で絞り込む
End Sub
```

ファミリに含まれる3件だけが抽出できました。（VBAでオートフィルタを自動設定するよう制御している）
![5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831931/56d2269e-08c8-ca21-103b-a6fb18fa40b5.jpeg)

(プログラムについて補足）
今回絞り込みの列(「特許番号」)が1列目ですので「AutoFilter 1」としています。絞り込みの列nに対応して「AutoFilter n」のnの数値を設定してください。

(注意事項)
ファミリデータはセル内改行で区切っています。注意すべき点として、サンプルデータのようなテキストデータにおける改行コード(CRLF)とExcelのセル内でalt+Enterで改行する場合の改行コード（LF）は違うので、alt+Enterでの改行コードだとプログラム4行目は
　fmly_arr = Split(fmly, vbLf)
としてください。（テキストから取りこんだデータとExcelで打ち込んだデータが混ざっているような場合は要注意)

３．最後に
VBAもpythonも適材適所でそれぞれの利点を活かしていければと思います。
今回の記事が何らかの助けになれば幸いです。
Ferrum を使って特定の要素のスクリーンショットを撮影する

# はじめに

[Ferrum](https://github.com/rubycdp/ferrum) は [CDP (Chrome DevTools Protocol)](https://chromedevtools.github.io/devtools-protocol/) を使用して Ruby で Chrome を操作できる Gem です。今回はこの Gem を使用して、Web ページ上の特定の要素のスクリーンショットを撮影してみます。

# 例

[Yahoo!天気・災害](https://weather.yahoo.co.jp/weather/) で [福岡県福岡市](https://weather.yahoo.co.jp/weather/jp/40/8210.html) の本日の天気の部分を撮影したいです。

![weather.yahoo.co.jp_weather_jp_40_8210.html(PC).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6697/9dfc77eb-1a9a-f386-5ba4-798e02ef4cb6.png)

```rb
require 'ferrum'

browser = Ferrum::Browser.new
page = browser.create_page

# Yahoo! 天気・災害 > 天気・災害トップ > 九州 > 福岡県 > 福岡 (福岡)
url = 'https://weather.yahoo.co.jp/weather/jp/40/8210.html'
page.goto(url) 

# ~/Downloads/todays_weather.png として保存する。
path = Pathname(Dir.home).join('Downloads/todays_weather.png')
selector = '.forecastCity td:first-child'
page.screenshot(path:, selector:)

browser.quit
```

うまく撮影できました :camera_with_flash:

<img alt="todays_weather.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6697/63def638-a19d-c533-6ff4-85f419df5892.png" width=400>

# バージョン情報

- Ruby 3.3.4
- Ferrum 0.15
MoviePyで，`Unrecognized option 'preset'.`とエラーが出た時の対処法

# エラー

以下のように，FFmpegに関するエラーが表示されることがある．そのバージョンで認識されないオプションを指定していることが原因である．

```python
MoviePy error: FFMPEG encountered the following error while writing file test_output.mp4:

 b"Unrecognized option 'preset'.\nError splitting the argument list: Option not found\n"
```

# 解決策

`Unrecognized option 'preset'.`に関しては，FFmpeg 4.2.2をインストールすることで解決できた．その他の類似のエラーについても，同様にバージョンの変更で解決できるものと思われる．

```bash
conda install -c conda-forge ffmpeg=4.2.2
```

参考：https://github.com/Zulko/moviepy/issues/657#issuecomment-972144503
MoviePyで`This error can be due to the fact that ImageMagick is not installed on your computer`と表示された時の対処法 (Ubuntu)

# `ImageMagick`をインストールしていない場合

```bash
sudo apt install -y imagemagick
```

# security policyに関するエラー

以下のように，security policyに関するエラーが表示されることがある．

```bash
convert-im6.q16: attempt to perform an operation not allowed by the security policy `@/tmp/tmpmr4ard3d.txt' @ error/property.c/InterpretImageProperties/3666.
convert-im6.q16: no images defined `PNG32:/tmp/tmpupxr37mx.png' @ error/convert.c/ConvertImageCommand/3258.
```

これは，@で始まるリソースの作成を許可していないことが原因である．
`identify -list policy`コマンドで，`policy.xml`ファイルの場所を確認する．
以下のような1行を見つけたら，コメントアウトする（`<!--`と`-->`で囲う）．
```xml
<policy domain="path" rights="none" pattern="@*" />
```

参考：https://github.com/Zulko/moviepy/issues/401#issuecomment-278679961

# Version 2.0

Version 2.0で`ImageMagick`を使わない実装を提案しているようである．しかし，ライブラリのメンテナンスが止まっており，リリースされていない．

参考：https://github.com/Zulko/moviepy/issues/1472
リモートマシンの VS Code Server を削除する

## 方法

`Remote-SSH: Uninstall VS Code Server from Host....` コマンドを実行する．

このコマンドは，以下の二つをする．

1. 実行中の VS Code Server のプロセスをキルする
1. サーバーがインストールされているフォルダを削除する

## 参考
https://code.visualstudio.com/docs/remote/troubleshooting#_cleaning-up-the-vs-code-server-on-the-remote
robloxでassistant その158

# 概要
robloxでassistantやってみた。
練習問題、やってみた。

# 練習問題
Statsを使え。

# サンプルコード

```
local Stats = game:GetService("Stats")
local TotalAPI = Stats:GetTotalMemoryUsageMb()
local TotalSum = 0
for _, Tag in ipairs(Enum.DeveloperMemoryTag:GetEnumItems()) do
	TotalSum += Stats:GetMemoryUsageMbForTag(Tag)
end
print("Total API:", TotalAPI)
print("Total Sum:", TotalSum)
```

# 実行結果

```
  08:20:24.653  Hello world!  -  サーバー
  08:20:26.139  Total API: 618.9921875  -  クライアント - LocalScript:9
  08:20:26.139  Total Sum: 1650.3057441711426  -  クライアント - LocalScript:10
  08:20:27.137  Hello world!  -  クライアント

```

以上。
robloxでassistant その157

# 概要
robloxでassistantやってみた。
練習問題、やってみた。

# 練習問題
SocialServiceを使え。

# サンプルコード

```
local SocialService = game:GetService("SocialService")
local Players = game:GetService("Players")
local player = Players.LocalPlayer
local function canSendGameInvite(sendingPlayer)
	local success, canSend = pcall(function()
		return SocialService:CanSendGameInviteAsync(sendingPlayer)
	end)
	return success and canSend
end
local canInvite = canSendGameInvite(player)
if canInvite then
	SocialService:PromptGameInvite(player)
	print("ok")
else
	print("Cannot send invite")
end


```

以上。
robloxでassistant その156

# 概要
robloxでassistantやってみた。
練習問題、やってみた。

# 練習問題
ScriptContextを使え。

# サンプルコード

```

local ScriptContext = game:GetService("ScriptContext")
local function onError(message, trace, script)
	print(script:GetFullName(), "errored!")
	print("Reason:", message)
	print("Trace:", trace)
end
ScriptContext.Error:Connect(onError)
error("Error occurred!")


```

# 実行結果

```

  07:49:32.977  Hello world!  -  サーバー
  07:49:33.794  ReplicatedFirst.LocalScript:16: Error occurred!  -  クライアント - LocalScript:16
  07:49:33.794  Stack Begin  -  Studio
  07:49:33.795  Script 'ReplicatedFirst.LocalScript', Line 16  -  Studio - LocalScript:16
  07:49:33.796  Stack End  -  Studio
  07:49:33.798  ReplicatedFirst.LocalScript errored!  -  クライアント - LocalScript:7
  07:49:33.798  Reason: ReplicatedFirst.LocalScript:16: Error occurred!  -  クライアント - LocalScript:8
  07:49:33.798  Trace: ReplicatedFirst.LocalScript, line 16  -  クライアント - LocalScript:9
  07:49:34.477  Hello world!  -  クライアント



```

以上。
スクリーンフロー：日時コンポーネント



+ [日時コンポーネントのデフォルト値設定方法](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54V00007eqZfa)

”日”の部分（7/1）を入力すると自動的に”時”の部分が12:00にて表示されるようにしたいです。

:::note
以下のような日時型の数式リソースを作ってデフォルトとして設定してみてください。
日付の部分を変えても日時は12:00で固定されます
 
```
DATETIMEVALUE(TEXT(TODAY()) + " 03:00:000")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/b3f8b782-520f-c228-41a0-e4b73602c757.png)
:::
paizaラーニングレベルアップ問題集の「本の整理」をやってみた

paiza×Qiita記事投稿キャンペーンということで、paizaラーニングレベルアップ問題集の[本の整理](https://paiza.jp/works/mondai/real_event/book_sort)をやってみました。
- - -
Aランク問題、Sランク問題となると、計算量を意識しなければなりません。
###### あなたは、歩きながら最小IDの本の位置を見つけていった。
まず、問題文のルールをコピペしてコメントにします。但し、最初の手順を$0$回目、左端の本を$0$番目の本とカウントし、変数名$j$を$k$に変更しています。そして、ルールの通りプログラムしていきます。
```c
#include <stdio.h>

int main(){
    int n;
    scanf("%d",&n);
    int A[n];
    for(int i=0;i<n;i++)scanf("%d",&A[i]);
    int count=0;//本を交換した回数

    //次の手順をn回繰り返す。
    for(int i=0;i<n;i++){
        //1. i(0<=i<n)回目の手順では、まず本棚の左からi番目の位置に立つ。
        int k=i;
        
        //2. 左からi番目の位置にある本から、本棚の右端にある本までのうち、
        //   最もIDが小さい本の位置を歩きながら見つける。この位置をkとする。
        for(int j=i+1;j<n;j++){
            if(A[j]<A[k])k=j;
        }
        
        //3. i=kなら、何もしない。
        //   i!=kなら、i番目の本とk番目の本を入れ替える。
        if(k!=i){
            int tmp=A[i];
            A[i]=A[k];
            A[k]=tmp;
            count++;
        }
    }
    printf("%d\n",count);
    return 0;
}
```
C言語の実行時間は$2.11$秒でしたが、Python3語に翻訳して実行させたらタイムオーバーになりました。

###### あなたはテレポーテーション能力を身に付けた！
問題文に「それぞれの本には$1$から$N$までの相異なる整数のIDがついています」と書かれています。左から$i$番目（左端を$1$番目とします）にあるべき本の番号は$i$ですので、最初に本$1$～$N$がそれぞれ左から何番目にあるかをメモし、$i$回目の手順（最初を$1$回目とします）では、本$i$のある場所まで瞬間移動しましょう。
```c
#include <stdio.h>

int main() {
	int n;
	scanf("%d", &n);
	int A[n + 1]; //左からi番目に本A[i]がある
	int B[n + 1]; //本jは左からB[j]番目にある
	for (int i = 1; i <= n; i++) {
		scanf("%d", &A[i]);
		B[A[i]] = i; //本の位置をメモ
	}
	int count = 0; //本を交換した回数

	//次の手順をn回繰り返す。
	for (int i = 1; i <= n; i++) {
		if (A[i] != i) { //左からi番目が本iでなければ
			//本iの位置
			int k = B[i];

			//本iを左からi番目に移す
			B[i] = i;

			//左からi番目にあった本A[i]の位置はkになる。
			B[A[i]] = k;

			//左からk番目に本A[i]を移す
			A[k] = A[i];

			//左からi番目は本iになる
			A[i] = i;

			//本の交換回数をカウント
			count++;
		}
	}
	printf("%d\n", count);
	return 0;
}
```
瞬間移動能力により、$10^5$冊の本を$0.01$秒未満で整理することができました。（設定上、何回本を入れ替える必要があるのかを計算するだけでしたね。失礼いたしました）
paiza.ioでc# その4

# 概要
paiza.ioでc#、やってみた。
Forth見つけたのでやってみた。
練習問題やってみた。

# 練習問題
forthで数9を4個つかって1から15までの数を表す式を実行せよ。

```
9 9 - 9 9 / . # 1
9 9 / 9 9 / + . # 2
9 9 + 9 + 9 / . # 3
9 9 9 + 9 / dup + . # 4
9 9 9 + 9 / dup + - . # 5
9 dup 9 + 9 + 9 / - . # 6
9 9 9 + 9 / - . # 7
9 9 9 drop 9 / - . # 8
9 9 - 9 * 9 + . # 9
9 9 / 9 dup 9 / + . # 10
9 9 9 + 9 / + . # 11
9 dup 9 9 + + 9 / + . # 12
9 9 9 + 9 / dup + + . # 13
9 dup 9 9 + 9 / dup + - + . # 14
9 dup dup 9 + 9 + 9 / - + . # 15
```


# 実行結果

```
Forth mini Ver.0.0.0.0 by Spumoni
Enter Forth commands (type 'exit' to quit):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 
```

# 成果物


https://paiza.io/projects/MW_sI-9-bJjxjcJKaHc8kQ


以上。
paiza.ioでc# その3

# 概要
paiza.ioでc#、やってみた。
Forth見つけたのでやってみた。

# 参考にしたページ

https://qiita.com/spumoni/items/fdced0ea876f4baa9c36


# 実行結果

```
Forth mini Ver.0.0.0.0 by Spumoni
Enter Forth commands (type 'exit' to quit):
<5> 1 2 3 4 5 
```


# 成果物

https://paiza.io/projects/MW_sI-9-bJjxjcJKaHc8kQ


以上。
ここがツラいよQiita CLI ～Zenn CLIとの比較～


## はじめに

私は GitHub を利用して記事を投稿しています。Qiita CLI と Zenn CLI を両方使ってみて感じた Qiita のツラさを書いていきます。

## 画像の貼り付けが大変

Qiita の記事は画像を挿入するのが大変です！GitHub 連携をしている身からすると、Zenn はすべてエディタの中で完結するため理想的です。Qiita の場合はブラウザでの操作が必要で、二重管理のようになってしまうのも気になります。

### Qiita CLI の場合

```md
1. images/<article_title> フォルダに画像を配置する
2. [ファイルのアップロード](https://qiita.com/settings/uploading_images) を開く
3. ファイルをアップロードし「画像URLをコピー」する
4. ![description](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/xxx.png) の形式で参照する
```

### Zenn CLI の場合

```md
1. images/<article_title> フォルダに画像を配置する
2. ![description](/images/<article_title>/xxx.png) の形式で参照する
```

## 下書き一覧に表示されない

Markdown で記事の下書きを書いているとします。Qiita も Zenn も CLI でプレビューが可能ですが、実際のところ見た目は公開記事と若干異なります。具体的には目次やサイドバーの有無、ページ幅の誤差による改行の位置ズレ、ダークモード対応の有無などです。

これら理由より CLI のプレビューだけでなく、下書きページから実際のページを確認したいです。ところが Qiita の場合、CLI で記事を執筆し `ignorePublish: true` を指定している状態だと「下書き一覧」に表示されません。

![qiita_draft.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3852183/34db136c-a4fe-bf16-a346-5cb5b994d6f4.png)

一方 Zenn の場合、`published: false` でも「記事一覧」に表示されるため、公開せずに実際の見た目の確認ができます。

![zenn_draft.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3852183/662862dc-842c-5add-fe30-abbcc2db8c99.png)

## GitHub のデータが御本尊とは限らない

Qiita CLI では GitHub のデータが御本尊とは限りません。そのため記事ファイルを消しても公開されている記事は消されませんし、Qiita 上で記事を更新してしまうと Markdown のデータと差分が生まれる可能性があります（これ自体は `npx qitta pull` コマンドで[解消できます](https://github.com/increments/qiita-cli?tab=readme-ov-file#pull)）。

> 記事ファイルを Qiita と同期します。
Qiita 上で更新を行い、手元で変更を行っていない記事ファイルのみ同期されます。

一方 Zenn CLI では必ず GitHub のデータが御本尊 となります。仮に Zenn 上で記事を更新しても、次にデプロイが走れば記事データの通り巻き戻ります。逆に Qiita はウェブから更新する自由があるとも言えますが、GitHub を介したデプロイが強制される方が正しいのかなと考えています。

![zenn_warning.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3852183/7dc4e9c2-16d8-093c-5e7f-c7fece8777a7.png)

## GitHub Actions の利用が必要

Qiita で GitHub 連携を選択した場合、GitHub Actions を利用したデプロイになります。このため GitHub Actions の利用枠を使うことに注意が必要です。

![qiita_connect.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3852183/e46eff4d-25b0-921f-0f47-9411f16e7510.png)

Zenn の場合は Zenn Connect という GitHub App による連携となります。このため設定もより簡単（Install & Authorize ボタンを押すだけ）で、GitHub Actions の利用枠を使うことはありません。

![zenn_connect.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3852183/e1fa7129-6b0a-82e8-8363-a633b60ba456.png)

## まとめ

Qiita CLI のツラい点を中心に書いてしまいましたが、ブラウザで書くのと違いリポジトリで記事が管理ができるという点は最高です！あなたの資産を保全するためにも、Qiita CLI で執筆、GitHub で記事管理してみませんか？
Qiitaに入門してみた！～GitHubリポジトリ連携編～

## Qiita に入門してみた

以下記事を参考に、Qiita に入門してみました！

https://qiita.com/Qiita/items/666e190490d0af90a92b

https://qiita.com/Qiita/items/32c79014509987541130

## 記事投稿までの流れ

詳しい手順は上記公式ドキュメントを参考にしてください。およそ 15 分で Qiita に入門できました！

| 項番 | 内容                                      | 所要時間 |
| ---- | ----------------------------------------- | -------- |
| 1    | GitHub でリポジトリ作成                   | 1 min    |
| 2    | Qiita CLI のインストール                  | 2 min    |
| 3    | Qiita トークンの発行                      | 1 min    |
| 4    | GitHub Actions の Secret にトークンを設定 | 2 min    |
| 5    | 適当な記事を作成                          | 5 min    |
| 6    | 変更をコミット、GitHub へプッシュ         | 3 min    |
| 7    | Qiita へのデプロイを確認                  | 1 min |

## ポイント

**GitHub Actions による連携を選択**することにより、どこからでも簡単に記事を投稿できます！GitHub Actions 用のファイルは `npx qiita init` コマンドで自動作成してくれるので、自身での設定は不要です！

![github_actions.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3852183/8187b6b6-822a-c617-7560-44014d984839.png)

### Qiita CLI を使う場合の記事投稿例

```bash
# Qiita CLI による記事のデプロイ
npx qiita login
npx qiita new ${記事ファイル}
npx qiita publish ${記事ファイル}
```

### Qiita CLI でのデプロイを選択しなかった理由

- 環境や端末ごとに `npx qiita login` する必要があり、Qiita トークンの管理が煩雑
- Git 管理しているのにコミットやプッシュと別に `npx qiita publish` するのが面倒

## まとめ

GitHub 連携はそこまで難しくないので、ぜひみなさんもやってみてください！
OCI CLIインストール時の「No such file or directory」エラーの解決方法

# OCI CLIインストール時の「No such file or directory」エラーの解決方法（Windows 11 Home対応）

## はじめに

Oracle Cloud Infrastructure (OCI) CLIをWindows環境にインストールする(pip install oci-cli実行の)際、以下のようなエラーに遭遇することがあります。

```
ERROR: Could not install packages due to an OSError: [Errno 2] No such file or directory: 'C:\\Users\\...\\Python39\\Lib\\site-packages\\oci_cli\\help_text_producer\\data_files\\man\\database-management_managed-database_enable-external-container-database-management-feature-external-database-diagnostics-and-management-feature-details.1'
HINT: This error might have occurred since this system does not have Windows Long Path support enabled.
```

この記事では、このエラーの原因と解決方法を説明します。

## エラーの原因

このエラーは主に以下の理由で発生します：

1. Windowsのロングパスサポートが無効になっている
2. ファイルパスが260文字の制限を超えている

## 解決方法

### 1. Windowsのロングパスサポートを有効にする

#### Windows 11 Pro/Enterprise/Educationの場合：

1. 管理者権限でPowerShellを開く
2. 以下のコマンドを実行：

```powershell
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem" -Name "LongPathsEnabled" -Value 1
```

3. PCを再起動

#### Windows 11 Homeの場合：

1. Windowsキー + R を押して「ファイル名を指定して実行」を開く
2. `regedit` と入力し、OKをクリック
3. レジストリエディタで以下のパスに移動：
   `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem`
4. 右ペインで `LongPathsEnabled` を探す
   - 存在しない場合：右クリック → 新規 → DWORD (32ビット) 値 を選択し、名前を `LongPathsEnabled` とする
5. `LongPathsEnabled` をダブルクリックし、値のデータを `1` に設定
6. OKをクリックしてレジストリエディタを閉じる
7. PCを再起動

### 2. インストールディレクトリの変更

上記の方法で解決しない場合：

1. 短いパスにインストールを試みる：

```powershell
$env:ORACLE_PATH = "C:\oci-cli"
iex ((New-Object System.Net.WebClient).DownloadString('https://raw.githubusercontent.com/oracle/oci-cli/master/scripts/install/install.ps1'))
```

## まとめ

これらの方法でOCI CLIのインストールエラーが解決できるはずです。ロングパスサポートを有効にすることで、他のアプリケーションでも長いファイルパスを扱えるようになるため、一般的なWindowsの使用においても有用です。

## 注意点

- レジストリの編集は慎重に行ってください
- Windows 11 Homeでは、グループポリシーエディタ（gpedit.msc）が利用できないため、レジストリを直接編集する必要があります