OmniAICreator/Qiita-1.07M huggingface dataset:
VSCodeの拡張機能の一覧を取得する

## はじめに
定期的に、VSCode(Visual Studio Code)の拡張機能の紹介投稿があり、参考にさせてもらって、VSCodeの使い勝手をアップデートしています。インストールする拡張機能で一気に便利なったりしますので、とてもありがたいです(感謝)。

https://qiita.com/midiambear/items/f38686bd4d139e0cd46c

https://qiita.com/yamaguchi2000/items/76060c08764ce4c704f9

https://zenn.dev/umi_mori/articles/dd121abf2a2f77

とても便利で、私もたくさんけっこうな数いれています。そんなとき、**インストール済みの拡張の一覧を簡単に取得したい** と思ったので、調べた備忘になります。

## コマンドで一発取得

- VSCode上のターミナルでも、Windows等のPowerShellでもOK。

~~~ bash:ターミナル
$ code --list-extensions
~~~

- バージョンを表示したいときは、以下のように実行すればOK。

~~~ bash:ターミナル
$ code --list-extensions --show-versions
~~~

## 拡張機能でインストール拡張の一覧を取得

- 拡張機能もあります(VSCode - System Information)

https://github.com/wraith13/sysinfo-vscode

![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167772/8fe62d92-36dc-70e5-7319-5353dae5651a.png)

>コマンドを実行する際は、情報の出力レベルを「Basic」と「Full」の2段階から選べる。「Full」ならばハードウェアやネットワークに関する情報まで得られる。出力形式は「Markdown」と「JSON」の2種類。

と、かゆい所にも手が届いています。

## AIコードエディタも注目

VSCodeは、群雄割拠していたIDEのデファクトスタンダードになって久しいですが、AIコードエディタ(Cursor等)の登場で、どうなるかというところにも注目かと思います。

https://zenn.dev/umi_mori/books/ai-code-editor-cursor/viewer/intro

## 参考URL

https://step-learn.com/article/vscode/014-extensions-list.html

https://forest.watch.impress.co.jp/docs/review/1517819.html
高位合成言語アセンブラを作る。 その28

# 概要
高位合成言語アセンブラを作る。
練習問題、やってみる。
ルックアップテーブル方式をやってみる。
論理式は書かない。

# 練習問題
3 の正の倍数検出回路を作れ。

# 高位合成する。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/208385d8-2474-498c-0ae6-7397702bb4b8.png)


# 投入したソース

```
lut 4
lin 3
lout 1
code 0 0
code 1 0
code 2 0
code 3 1
code 4 0
code 5 0
code 6 1
code 7 0
```

# サンプルコード

```

var src = document.getElementById("src");
var out = document.getElementById("out");

function run() {
  var in0 = "";
  var in1 = "";
  var out0 = "";
  var out1 = "";
  var m = "";
  var u = "";
  var str = src.value;
  var codes = str.split("\n");  
  var len = codes.length;
  var i, 
    j;
  for (i = 0; i < len; i++)
  {
    var code = codes[i].split(" ");
    switch (code[0])
    {
    case "":
    break;
    case "lut":
    break;
    case "lin":
      var a = parseInt(code[1]) - 1;
      in0 = "input wire [" + a + ":0] data,";
      in1 = "\treg [" + a + ":0] data;\n";
    break;
    case "lout":
      var a = parseInt(code[1]) - 1;
      out0 = " output reg [" + a + ":0] code";
      out1 = "\twire [" + a + ":0] code;\n";
    break;
    case "code":  
      var a = code[1];
      var b = code[2];
      u += "\t\t4'h" + a + ":\n\t\t\tcode = 8'h" + b + ";\n";
      m += "\t\tdata = 4'h" + a + "; #10;\n";
    break;
    default:
      alert(code[0]);
    break;
    }
  }
  out.value = "module lut(" + in0 + out0 + ");\n" +
  	"\talways @(data)\n" +
	  "\tbegin\n" +
		"\t\tcase(data)\n" +
    u +
    "\t\tendcase\n" +
	  "\tend\n" +
    "endmodule\n\n" +
    "module testbench;\n" +
    in1 + 
    out1 +
    "\tlut u(.data(data), .code(code));\n" +
	  "\tinitial\n" +
	  "\tbegin\n" +
		'\t\t$display("data code");\n' +
		'\t\t$monitor("%h  %b", data, code);\n' +
    m +
    "\t\t$finish;\n" +
    "\tend\n" +
    "endmodule";
}


```

# 成果物

https://embed.plnkr.co/plunk/dXHfvYyzxXR8Nx5U


以上。
高位合成言語アセンブラを作る。 その27

# 概要
高位合成言語アセンブラを作る。
練習問題、やってみる。
ルックアップテーブル方式をやってみる。
論理式は書かない。

# 練習問題
3 の正の倍数検出回路を作れ。

# 真理値表を書く。

# lutで書く。

```
lut 4
lin 3
lout 1
code 0 0
code 1 0
code 2 0
code 3 1
code 4 0
code 5 0
code 6 1
code 7 0
```

# 説明

- lut 4
ルックアップテーブルの列4を宣言
- lin 3
入力を3bit
- lout 1
出力を1bit
- code 3 1
入力0x3で出力0x1を設定

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/2cf3dbce-f527-a1c0-b514-64b00f06856f.png)

# サンプルコード

```

var src = document.getElementById("src");
var out = document.getElementById("out");
var c0;

class LUT {
	constructor(n) {
	  this.h = "";
	  this.n = n;
		this.s = [];
		this.a = 0;
		this.b = 0;
    this.bin = [1, 2, 4, 8, 16, 32, 64, 128, 256, 512];
		return this;
	}
	in(a) {
		this.a = a;
		return this;
	}
	out(a) {
		this.b = a;
		return this;
	}
	code(a, b) {
		var t = new Array(this.n);
    var i,
      j,
      k;
		for (i = 0; i < this.a; i++)
		{
      j = this.a - i - 1;
      k = a >> j;
      k = k & 1;
      if (k == 1) t[i] = 1;
      else t[i] = 0;
		}
    for (i = 0; i < this.b; i++)
		{
      j = this.b - i - 1;
      k = b >> j;
      k = k & 1;
      if (k == 1) t[this.a + i] = 1;
      else t[this.a + i] = 0;
		}
		this.s.push(t);
	  return this;
	}
	table() {
    this.h += '<table>';
    this.h += '<tr>';
		for (var a = 0; a < this.a; a++)
    {
			this.h += '<th>' + this.bin[this.a - a - 1] + '</th>';
		}
    for (var b = 0; b < this.b; b++)
    {
			this.h += '<th>' + this.bin[this.b - b - 1] + '</th>';
		}
		this.h += '</tr>';
		for (var row = 0; row < this.s.length; row++)
    {
    	this.h += '<tr>';
    	for (var col = 0; col < this.n; col++)
    	{
	    	var v = this.s[row][col];
		    this.h += '<td>' + v + '</td>';
	    }
	    this.h += '</tr>';
    }
    this.h += '</table>';
    out.innerHTML = this.h;
	}
}

function run() {
  var str = src.value;
  var codes = str.split("\n");  
  var len = codes.length;
  var i;
  for (i = 0; i < len; i++)
  {
    var code = codes[i].split(" ");
    switch (code[0])
    {
    case "":
    break;
    case "lut":
      var a = parseInt(code[1]);
      c0 = new LUT(a);
    break;
    case "lin":
      var a = parseInt(code[1]);
      c0.in(a);
    break;
    case "lout":  
      var a = parseInt(code[1]);
      c0.out(a);
    break;
    case "code":  
      var a = parseInt("0x" + code[1]);
      var b = parseInt("0x" + code[2]);
      c0.code(a, b);
    break;
    default:
      alert(code[0]);
    break;
    }
  }
  c0.table();
}




```

# 成果物

https://embed.plnkr.co/plunk/xHPsrg6CBXGGxhVT

以上。
Amazon SQSの超詳細解説

# はじめに
この記事はDevOps on AWS大全の一部です。
DevOps on AWS大全の一覧は[こちら](https://qiita.com/tech4anyone/items/b06f88035d27c6ef13b2)。

この記事ではAmazon SQSに関連する内容を超詳細にまとめています。

具体的には以下流れで説明します。

- Amazon SQSとは
- Amazon SQSの仕組み
- Amazon SQS for Advance
- Amazon SQSのベストプラクティス

AWSの区分でいう「Level 200：トピックの入門知識を持っていることを前提に、ベストプラクティス、サービス機能を解説するレベル」の内容です。

# この記事を読んでほしい人
- Amazon SQSがどういうサービスか説明できるようになりたい人
- Amazon SQSを採用するときのベストプラクティスを説明できるようになりたい人
- AWS Certified DevOps Engineer Professionalを目指している人

# Amazon SQSとは
Amazon SQSとは、AWSが提供するメッセージキューイングサービスです。
メッセージキューイングとは、アプリケーション間でメッセージをやり取りする仕組みのことで、メッセージは一時的にキューと呼ばれる場所に格納されます。

Amazon SQSを使うと、アプリケーションはメッセージの送受信を簡単に行うことができます。
また、Amazon SQSはフルマネージドなサービスなので、キューの作成や管理、スケーリングなどを自動的に行ってくれます。

# Amazon SQSの仕組み
Amazon SQSでは、メッセージは基本的にキューに送られた順番に処理されます。

しかし、実際には、ネットワークの遅延やサーバーの障害などの理由で、メッセージの順番が入れ替わることがあり、これをメッセージのジッターと呼びます。
Amazon SQSの場合、標準キューだとこのジッターの影響を受ける可能性があり順序は保証されません。

メッセージのジッターが許容できない場合は、FIFOキューという特別なタイプのキューを使うことができます。
FIFOキューでは、メッセージの順番が保証されるだけでなく、重複したメッセージも排除されます。

Amazon SQSでは、メッセージは可視性タイムアウトという期間内に処理される必要があります。
可視性タイムアウトとは、メッセージがキューから受信された後に、他の受信者から見えなくなる期間のことです。
この期間内にメッセージを処理して削除しない場合は、メッセージは再びキューに戻ります。

これにより、メッセージの損失や処理漏れを防ぐことができます。可視性タイムアウトはデフォルトでは30秒ですが、1秒から12時間まで変更することができます。

# Amazon SQS for Advance
Amazon SQSでは、さまざまな機能を使って、アプリケーションのパフォーマンスや信頼性を向上させることができます。

## デッドレターキュー
デッドレターキューはメッセージが何度も処理に失敗した場合に、別のキューに移動させる機能です。
デッドレターキューに移動したメッセージは、後で分析や再処理を行うことができます。

## ロングポーリング
ロングポーリングはメッセージがキューに到着するまで待機する機能です。
ロングポーリングを使うと、空のレスポンスを受け取る回数を減らし、コストやネットワークトラフィックを削減することができます。

## バッチ処理
バッチ処理は一度に複数のメッセージを送受信する機能です。
バッチ処理を使うと、レイテンシーやオーバーヘッドを減らし、スループットを向上させることができます。

## メッセージ属性
メッセージ属性はメッセージに付加するメタデータです。
メッセージ属性を使うと、受信者がメッセージの内容や処理方法を判断することができます。

## メッセージフィルタリング
メッセージフィルタリングはメッセージ属性に基づいて、メッセージを受信するかどうかを決める機能です。
メッセージフィルタリングを使うと、受信者が必要なメッセージだけを受け取ることができます。

# Amazon SQSのベストプラクティス
Amazon SQSを効果的に使うためには、以下のようなベストプラクティスを守ることが重要です。

| ベストプラクティス | 説明 |
| --- | --- |
| キューの種類を適切に選択する | FIFOキューと標準キューでは、メッセージの順序や重複性が異なります。アプリケーションの要件に応じて、最適なキューの種類を選びましょう。 |
| 可視性タイムアウトを適切に設定する | 可視性タイムアウトは、メッセージの処理時間に影響します。可視性タイムアウトが短すぎると、メッセージが重複して処理される可能性があります。可視性タイムアウトが長すぎると、メッセージの処理が遅延する可能性があります。可視性タイムアウトは、メッセージの処理時間の平均値よりも少し長めに設定しましょう。 |
| ロングポーリングを有効にする | ロングポーリングは、メッセージの到着を待つことで、空のレスポンスを減らします。ロングポーリングを有効にすると、コストやネットワークトラフィックを削減することができます。ロングポーリングは、キューまたはリクエストレベルで設定することができます。 |
| バッチ処理を利用する | バッチ処理は、一度に複数のメッセージを送受信することで、レイテンシーやオーバーヘッドを減らします。バッチ処理を利用すると、スループットを向上させることができます。バッチ処理は、送信者または受信者のコードで実装することができます。 |
| メッセージ属性やメッセージフィルタリングを活用する | メッセージ属性やメッセージフィルタリングは、メッセージの内容や処理方法を制御することができます。メッセージ属性やメッセージフィルタリングを活用すると、受信者が必要なメッセージだけを受け取ることができます。メッセージ属性やメッセージフィルタリングは、送信者または受信者のコードで実装することができます。 |
| デッドレターキューの利用 | メッセージの処理でエラーが発生した場合、デッドレターキューにリダイレクトして再処理を容易にすることができます。メッセージ処理のデバックやリドライブにも活用できます。 |

# まとめ
この記事ではAmazon SQSに関連する内容を超詳細にまとめました。

- Amazon SQSとは
- Amazon SQSの仕組み
- Amazon SQS for Advance
- Amazon SQSのベストプラクティス

次回はAWS X-Rayについて超詳細解説します。
プログラムの特許化について

## はじめに
大学と共同研究開発中の医療分野のプログラム（AI）の一部について、特許出願を行ったので、その過程で調査したことや考えたことをまとめます。

## 特許化の位置づけ
- 大学では、知財収入確保の観点から、論文化の前に特許化を検討することを大学内で奨励しています。
- [AMED](https://www.amed.go.jp/aboutus/kihon.html)では、基礎研究の成果を新しい医薬品・医療機器等の開発などの社会実装に結びつける橋渡し研究の予算を提供していますが、標準プロセスに特許化が組み込まれており、特許申請が出口評価である「シーズA」という予算を毎年公募しています。
    - 橋渡し研究支援機関として認定されているのは、[11拠点](https://www.amed.go.jp/program/list/16/01/012_kyoten_ichiran.html)
    - 上記11拠点でなくても、橋渡し研究支援機関の公募に申請することで橋渡し研究予算に申請できます。
- 特許化は医療機器などの製品化に必須ではありませんが、研究予算公募時に申請者の実績としてアピールできます。
- 対象疾患など適用範囲を拡大できる可能性がある製品の場合特に、特許化すると、2匹目のどじょうを狙った類似競合製品から守ることができます。
- 自分自身が2匹目のどじょうの場合にどうすればよいか、は後述します。

## 特許の7要件
[技術者のための特許実践講座（森北出版株式会社）](https://www.amazon.co.jp/%E6%8A%80%E8%A1%93%E8%80%85%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E7%89%B9%E8%A8%B1%E5%AE%9F%E8%B7%B5%E8%AC%9B%E5%BA%A7-%E6%8A%80%E8%A1%93%E7%9A%84%E7%AF%84%E5%9B%B2%E3%82%92%E6%9C%80%E5%A4%A7%E5%8C%96%E3%81%97-%E3%82%B9%E3%83%A0%E3%83%BC%E3%82%BA%E3%81%AB%E7%89%B9%E8%A8%B1%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-%E5%B0%8F%E5%B7%9D-%E5%8B%9D%E7%94%B7/dp/4627871511)によると、特許の審査では以下の7つの要件を満たしているかを見られます。
1. 産業上利用できるか・自然法則を利用した技術的思想か
2. 新規性はあるか
3. 非容易性はあるか 
4. 最先の出願か
5. 実施可能な開示をしているか 
6. 特許請求の範囲は明確か
7. 先願に開示されていないか

上記7つのうち、特に重要な「新規性」と「非容易性」について後述します。

## 新規性はあるか
同じ課題を解決したものがあるか、関連キーワードを指定して、国内・海外の先行特許調査を行います。
- 国内 [特許情報プラットフォーム J-PlatPat](https://www.j-platpat.inpit.go.jp/)
- 国際・国内特許データベース [WIPO](https://patentscope2.wipo.int/search/ja/search.jsf)

先行特許が無い＝新規性あり、とはなりません。次に申請内容が「公知でないか」、先行研究論文等の確認を行います。出願内容について特許出願前に学会発表や論文発表すると新規性を喪失した、とみなされるので注意が必要です。
- 英語論文　[Pubmed](https://pubmed.ncbi.nlm.nih.gov/)
- 日本語論文 [CiNii](https://cir.nii.ac.jp/)
- （医療系の日本語論文・学会発表の場合）医中誌　

特許事務所の「先行特許調査」は、関連キーワードを指定する検索式を用いて、広めに特許調査をしてくれる一方で、対象が特許のみで論文等の調査は対象としていないこともあるようですので注意が必要です。

## 自分が2匹目のどじょうの（同じ課題解決に向けた先行特許・論文がある）場合
- 期待効果や精度、方法に違いはないかを検討をします。「改良特許」という領域もあります。
- 違いを見つけるために、特許化する範囲を絞ったり、逆に拡大したりなどの検討を行います。

## 非容易性はあるか
- 非容易性とは、その分野において通常の知識を持っている者（当業者）が、公知例から容易に考えつくものでないことをいいます。
- 今回のAIでも、学習データをモデルに投入しているだけじゃないのか、それで特許をとれるのか、という非容易性についての指摘をシーズA審査で受けました。
- 目標精度を達成するために工夫をしたことを整理し、請求項に落とし込むのが有効です。工夫したこと＝非容易性です。

## 特許出願書類の作成・出願
- 特許事務所に発明概要を説明し、出願書類の作成・出願を依頼しました。発明概要のアジェンダは以下のとおり。大学へ提出する発明届と同様の内容となっています。
    - 発明等の概要（処理フロー図）
    - 従来技術
    - 今回の発明
    - 実験方法とデータ
- 出願書類の作成・出願費用は約40万円でした。

## 特許の請求範囲
- 本製品のみを想定した個別化しすぎた範囲にならないよう注意します。横展開を想定し範囲を検討します。
- インプットを限定しすぎず、上位互換品を排除できるとなおよいです。

## おわりに
- 学会発表や論文化（新規性）が見えていて、工夫したことがあり（非容易性）、製品化の可能性がある技術内容でしたら、特許化の検討をおすすめします。
- シーズAへの予算申請は新規性が見えた段階で検討してよいかと思います。開発しているなかで非容易性は出てくると思います。
VRでスタック可能UIブラーを作ったつもりが、結局行き詰った話（解決済み）

丸2日間ずっとやってて、結局解決できないので、どこかに書いて終わりにしようと思いました。
南無。

# 背景
uGUIを表示したら、後ろをブラーで隠したいじゃないですか。隠したい！
そのまた上にuGUIを置いたら、その裏も隠したい！
ＶＲで！
MetaQuest2, 2022.2, 2023.3, URP, SinglePassInstanced, XRInteractionToolkit

# 実践
ブラー処理自体はどうやるかというと、
画面をキャプって、そのキャプったテクスチャをぼかして、UI矩形に合わせて表示します。
それ以外知りません。言葉にすると簡単なのですがしぇーだは複雑になります。

ビルトインコンロRPのころはすごい簡単にできました。
GrabPass { }
っていうすごいやつがいて、どこでも画面キャプチャが取れたんです。


それが、URPもといSRPではどうもこいついなくなっちゃったみたいなんですよね・・・？（不安）
ではどうするのか。画面を取る方法は調べたところ、２つある。

### １．URPコンフィグにあるOpaqueTextureをチェックつけると使える_CameraOpaqueTextureを使う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640703/55d00f96-9405-a870-354a-6dd139a8c8af.png)
しかし_CameraOpaqueTextureにはUIは映らない。つまりこういうことです。
不透明オブジェクト描画　>　【ここでキャプチャ】　>　透明オブジェクト描画（UIとか）> ...　
UIが映る前のキャプチャなんです。南無。


### ２．画面をGrabするカスタムRendererFeatureを実装する。

れんだらふゅーちゃー・・・？ビルトインコンロRPのときに炒めてたCommandBufferという柔軟に描画処理をコントロールできる機能がありました。それのSRP版といったところでしょうか。（違ってたらすみません。）
それを使えば画面をキャプれるそうですが、なんと公式にすごく丁度いいサンプルがありました。嬉しい。
https://docs.unity3d.com/Packages/com.unity.render-pipelines.universal@14.0/manual/containers/create-custom-renderer-feature-1.html

長い！後半のVolumeの拡張のところは要りません。
RendererFeatureのことはほとんど知らない状態でしたが、コピーコピーで改造してできた・・・！
![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640703/29a06ceb-1fee-c580-36b0-6d4d0cfd9835.gif)


あれ？
![2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640703/ac21c78b-9d4a-3725-9e0a-9a895204af31.gif)
VRじゃ映んないんですよね。なぜなんでしょう。諦めてます・・・とほほ。


### 補足
ところで、スタック可能と言っていますが、ブラーは１つしか使わないなんちゃって仕様になっています。
まず、UI2というレイヤーは標準では描画しないように設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640703/ab41343e-7889-c104-1604-000ecf0c4c14.png)

次に、RenderObjectsというRendererFeaturerでUI2を描画します。ブラーUIがでてくるまでおねんねしてます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640703/97617dc1-5480-c1ec-1400-b3a5cf14e775.png)

ランタイムでの流れは、
・画面のキャプチャを取る。
・ブラーUIを表示。
・RenderObjectsをSetActive(true)
・（更に上にスタックする場合）表示されてるUI2オブジェクトをUIレイヤに変更してブラーUIのみ非表示。（キャプチャループするから）
・新しいUI2を表示させる。

こんな感じでがちゃがちゃやっていい感じにできました。ですがVRでできなければ意味がない。もう少し考えたいけどノータイムによりフィニッシュです。薄暗くすっか！

https://github.com/emptybraces/Unity-URP-Stackable-UI-Blur
https://forum.unity.com/threads/blitter-blitcameratexture-seems-to-fail-for-vr-devices-only.1526263/


---
### 追記
下記のコードが上手く機能していないようです。
```c#
Blitter.BlitCameraTexture(cmd, camera_target_handle, _grabRTHandle, _material, 0);
```
そこで色々試してみたら、RendererFeatureの実行タイミングがBeforeRenderingSkybox以下であればこのBlit処理が成功しました。はて・・・


---
### 追記２
解決しました。RenderTextureの生成オプションにSPI用に追加で設定しないといけなかったみたいです。ランタイム時にSPIかどうか調べる方法が分からなかったのでシンボルで分岐しました。また、MultiPassでは動作していたことを今知った。（MultiPassは現在制作中のプロジェクトでは度外視してて調べても見てなかった。）
```c#
#if VR_SPI
	_blurTextureDescriptor.volumeDepth = 2;
	_blurTextureDescriptor.dimension = TextureDimension.Tex2DArray;
#endif
```

---
### 参考
https://tsgcpp.hateblo.jp/entry/2020/06/23/204257
さくらのクラウドGPUプランでLLMを動かしてみよう！

この記事はさくらインターネット Advent Calendar 2023 12日目の記事です。

はじめまして＆こんにちは、さくらインターネットのアルビです。

クラウド事業本部SRE室にて、主にさくらのクラウドに関わるOSS開発やクラウドGPU関連サービスの検証を行なってます。

先日、[さくらのテックランチ](https://www.sakura.ad.jp/corporate/information/events/2023/08/18/1968213536/)というイベントで最近の社内においての生成系AIの動きについてお話しさせていただきまして、「さくらのクラウドでLLMを立ち上げる手順が欲しい」という声がちらほら上がっていたため、今回の記事はさくらのクラウドGPUプランにて大規模言語モデルを載せて動かすための手順を簡単に紹介していきたいと思います！

## さくらのクラウドGPUプランについて
さくらインターネットはさくらのクラウドというIaaSのサービスを提供しています。

そのサービスのうち、GPUプランというハイパーフォーマンスのGPUを初期費用不要で使用可能なプランがありまして、以下のスペックのサーバーが使用できます。

|        |                     |
|--------|---------------------|
| CPU    | 4コア               |
| メモリ | 56GB                |
| GPU    | NVIDIA V100 32GB x1 |

こちらのサーバーは石狩第一ゾーンに設置されています。

さくらのクラウドのGPUプランはおもに機械学習やHPC用途で多くのお客様に使用されております。

OSは自分で選択でき、今回はRocky Linux 9.2を使用させていただきます。

## 必要なもの
必要なものはさくらのクラウドのアカウントのみです！

## 手順
text-generation-webuiをインストールし、手元にLLM用のGUIを動かす手順を解説させていただきます。

まずはさくらのクラウドGPUプランのインスタンスを立ち上げます。

1. さくらのクラウド　コントロールパネルからサーバー作成
2. サーバープランはGPUプラン選択
3. 新規ディスク作成で、Rocky Linux 9.2のアーカイブを選択
4. データ容量が大きくなる可能性が高いですので、最低100GBを選択
5. 他の設定は好みでつけて、作成

終わりましたら、立ち上げたサーバーにログインし、以下の手順でドライバのインストールを行います。

1. まずはEPELを有効化し、Enterprise Linux用のパッケージインストール可能にします。
```
sudo dnf install epel-release
```
2. NVIDIAのレポジトリを追加し、NVIDIAのパッケージもインストール可能にします。
```
sudo dnf config-manager --add-repo https://developer.download.nvidia.com/compute/cuda/repos/rhel9/x86_64/cuda-rhel9.repo
```
1. カーネル関連パッケージをインストールします。
```
sudo dnf install kernel-devel-$(uname -r)
```
1. NVIDIAドライバパッケージをインストールします。
```
sudo dnf install nvidia-driver nvidia-settings
```
1. こちらは任意ですが、CUDAのパッケージもインストールできます。
```
sudo dnf install cuda-driver
```
1. 正常にインストールが終わったかは以下のコマンドで確認できます。
```
nvidia-smi
```

ドライバのインストールが終わりましたら、以下の手順でLLM用GUI「text-generation-webui」をインストールします。

1. まず以下のコマンドでwgetをインストールします。こちらを使用してインストーラをまたダウンロードします。
```
sudo dnf install wget
```
1. 以下のコマンドでWebUIのインストーラをダウンロードします。
```
wget https://github.com/oobabooga/text-generation-webui/releases/download/installers/oobabooga_linux.zip
```
1. ダウンロードしたファイルを解凍します。
```
unzip oobabooga_linux.zip
```
1. 解凍先フォルダに移動します。
```
cd oobabooga_linux
```
1. 以下のコマンドでインストーラを実行可能にします。
```
chmod +x start_linux.sh
```
1. 最後に、以下のコマンドでインストーラを実行します。
```
./start_linux.sh
```

インストールが正常に終わりましたら、自動的にサーバが立ち上がります。サーバを閉じてしまいもう一度立ち上げたい場合、また `./start_linux.sh` を実行すれば大丈夫です！


## 最後に
というわけで、さくらのクラウドGPUプランを用いて誰でも簡単にLLMを使用できます！

モデルの導入などは、簡単にWebUIから可能です。

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

さくらインターネットは現在採用してます！
https://www.sakura.ad.jp/recruit/
Kinesis Data StreamsとKinesis Firehoseの違いを簡単に説明できるようにする

# はじめに
過去に開発業務で、ある程度Kinesisに触れていた経験があるのですが、しばらくAWSに触れていない間に`Kinesis Data Streams`と`Kinesis Firehose`を混同するようになってしまいました。
一度自分なりにまとめておこうと思います。

これら2つの違いを簡単に説明できるようにすることが本記事の目標になります。

# 公式ドキュメント
https://aws.amazon.com/jp/kinesis/data-streams/

https://aws.amazon.com/jp/kinesis/data-firehose/

# Kinesis Data Streams (KDS) と Kinesis Firehose の違い
表形式でまとめました。

| 特徴 | Kinesis Data Streams (KDS) | Kinesis Firehose |
| --- | --- | --- |
| **主な目的** | リアルタイムデータストリームの収集と加工 | リアルタイムデータの収集とデータストアへの転送 |
| **データ加工** | 高度なカスタム処理やフィルタリングが可能 | 限定された単純なデータ変換のみ可能（例: JSONからParquetに変換） |
| **スケーラビリティ** | 手動でスケールアップ/ダウンが必要 | 自動スケーリング |
| **リアルタイム処理** | 高度なリアルタイムのデータ加工に対応 | 即時データ転送に焦点 |
| **データの送信先** | Lambda、Kinesis Firehose、Kinesis Data Analyticsなど | Amazon S3、Redshift、Elasticsearch Serviceといったデータストアサービス |
| **利用シナリオ** | 複雑なリアルタイムデータの分析、複数の消費者への配信 | 単純なリアルタイムデータの転送と保存、データの直接的なストレージへのロード |

※ここで言う消費者とは、ストリームからデータを受け取り、それを処理または分析するシステム、アプリケーション、サービスを指します。

# まとめ
高度なデータ加工や複数の消費者へのデータ配信に対応する必要がある場合、`Kinesis Data Streams`が適していると思われます。

一方で、必要な加工が限定的であり、データの単純な転送が求められる場合は、`Kinesis Firehose`が効果的かと思われます。

状況に応じて、適切なツールを選択していきたいですね。

以上になります。
どなたかの参考になれば幸いです。

# 関連記事
以下の記事も勉強になるかと思います。

https://dev.classmethod.jp/articles/difference-between-kinesis-streams-and-kinesis-firehose/

https://www.ragate.co.jp/blog/articles/17824
ダークモード信仰にメスを入れる話。

ダークモードがいいって話をどこでも聞くけど自分にとってその恩恵を感じられなかったのでダークモードについて判例を述べている研究について調べてみた。

<h1> ダークモードは文字を読みやすくする？

心理学者のコシーマ・ピーペンブロックとスーザン・マイヤーが13年に発表した研究論文によれば、白い背景に黒い文字のほうが、正確さもパフォーマンスも高かったという。実験参加者に視力検査と校正作業を行ってもらったところ、白い背景に黒い文字のほうが読む速度が速く、見つけた誤字脱字の数も多かったのだ。

研究者たちはこの原因を、明るい背景では文字を追うときに瞳孔が小さくなり、視力が上がることにあると考えた。その逆に、暗い背景では瞳孔が大きくなり、文字に集中することが難しくなる。マイヤーらは当初、高齢者では正反対の結果になると予測していたが、そうではないことがわかったという。
<a href="https://pubmed.ncbi.nlm.nih.gov/23654206/"><p>論文のリンク</p></a>

またこういうこともわかっているらしい。
<h2>Twitterは、ダークモードを有効にしているユーザーのほうが、アプリに費やす時間が長くなることを発見した。

だが、これは集中力が増すためではなく、ベッドに入ったまま画面をスクロールするには、ダークモードのほうが不快感が少ないからかもしれない。

ダークモードは集中力を高め、わたしたちの気持ちを落ち着かせると謳っているアプリはたくさんある。しかし、このモードを搭載する本当の動機は、単にユーザーの利用時間を長くできるからなのかもしれない。

 今ある自分の常識を疑ってみてはどうだろうか。。。。

<blockquote cite="https://wired.jp/2019/10/05/dark-mode-chrome-android-ios-science/">

参考にしたサイト：<cite><a href="https://wired.jp/2019/10/05/dark-mode-chrome-android-ios-science/">wired.jp</a></cite>
</blockquote>
Ruby芸160チャレンジ(#17)標準入力およびファイルへの書き込みを同時に

## この記事は何
[shellgei160を通じて言語習得 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/learning-via-shellgei160)に参加しています。

書籍「シェル芸ワンライナー160本ノック」の例題をRubyで解いてみて、Rubyの学習に役立てようとするものです。

例題はこちらのリポジトリで公開されているものに限ります。
https://github.com/shellgei/shellgei160

## 実行環境など
- Docker image: ruby:3.0.2
- 上記リポジトリをクローンした上で、リポジトリのルートディレクトリ直下に`answer-ruby`ディレクトリを作り、その中に解答となるファイルを作成していきます。

## 今回のテーマ
https://github.com/shellgei/shellgei160/blob/master/answer/17.md

```bash
$ while read ln ; do echo $ln ; done < /etc/passwd > ~/a
```

`/etc/passwd`から一行ずつ読み取り、標準入力とファイル(`~/a`)への書き込みを同時に行います。

## 解
```ruby
lines = File.open('/etc/passwd', 'r').readlines

File.open('a', 'w') do |f|
  lines.each do |line|
    f.puts line
    puts line
  end
end
```

## 所感
- コードとしての難しさはないが、この処理を行った時のI/Oの効率は気になる。copilotに聞くと、RubyではI/Oは勝手にバッファリングされて効率よく処理されるとのことだが、ユーザー側でそれを把握したり、あるいは明示的に処理を行うにはどうしたら良いだろうか？
- Goで言うところの`TeeWriter`があるともうちょっとしっくりきそう。
象、死んだ魚、嘔吐

[IT エンジニア、マサカリ上等か？、批判文化は良いことないか？ #ポエム - Qiita](https://qiita.com/e99h2121/items/3d3226de0944bf165dbf)

じゃあ批判じゃなくてどうやって気持ちを表明したらええんやというときに 象、死んだ魚、嘔吐 というものがあるようでその参考文献と、メモ。

## 象、死んだ魚、嘔吐

[Elephants, dead fish & vomit](https://no-kill-switch.ghost.io/elephants-dead-fish-vomit/)
[Elephants, Deadfish, And Vomit, The Secret To Airbnb's Amazing Corporate Culture | Jacob Morgan](https://thefutureorganization.com/elephants-deadfish-vomit-secret-airbnbs-amazing-corporate-culture/)

- 象は、ほとんどの組織で誰も持ち出そうとしない大きなもの
- 死んだ魚は、過去のものだが、従業員がどうしても忘れて手放せないもの
- 吐瀉物は、ただ表に出すべきもの、吐き出したいもの

という AirBnb 発祥のふりかえり手法とのこと。

[「ふりかえりの手法をたくさん学ぼう」で紹介された手法まとめ - Qiita](https://qiita.com/98lerr/items/423a3e8ee44e118091bf#%E8%B1%A1%E6%AD%BB%E3%82%93%E3%81%A0%E9%AD%9A%E5%98%94%E5%90%90)

> [やること]
> 以下の3つを順番に挙げていく

> 象: すごく大きい、見ないフリをする課題
> 死んだ魚: 放置するとまずいことになる問題
> 嘔吐: 胸の中にあった課題

> [有効なシーン/効果]
> 関係性ができてないチームで強力。
> チームの中盤に、終わりに向かって気になることを出したい時にもいい。

[一年半同じチームで色んなふりかえりをやったので手法と学び紹介していく - Speaker Deck](https://speakerdeck.com/murabayashi/nian-ban-tong-zitimudese-nnahurikaeriwoyatutafalsedeshou-fa-toxue-bishao-jie-siteiku?slide=31)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/236bc6f9-3630-33a3-b1c9-5a2e3203e294.png)

[象に言及する｜菊池俊平｜note](https://note.com/shumpei/n/n9e4b52ef01b2)

> だから、断罪されることなく、積極的に問題を共有する時間が必要だ。そして誰かを責めるのではなく、今を少しでもいい状態に持っていくことに、全員でコミットしていくのだ。
> そうすることで、チームの雰囲気が格段に良くなっていく。


## Opportunity Solution Tree

もうちょっと当たり障りのないものとして発見したのは ソリューション ツリー

[Prioritize Opportunities, Not Solutions - Product Talk](https://www.producttalk.org/2019/02/prioritize-opportunities/)
![](https://www.producttalk.org/wp-content/uploads/2019/02/Netflix-Example.png)

[Mapping: An introductory guide for product teams by Teresa Torres](https://miro.com/blog/mapping-product-teams-teresa-torres/)

> Opportunity Solution Treeは、明確な成果、研究から生まれた機会、対象となる機会に対するソリューション、ソリューションを評価するための実験、その背後にある最もリスクの高い前提の4つのセクションから構成されています。

[The Opportunity Solution Tree by Product Talk, Online Whiteboard for Visual Collaboration](https://miro.com/app/board/o9J_kxrE690=/?fromEmbed=1)

[Why This Opportunity Solution Tree is Changing the Way Product Teams Work - Product Talk](https://www.producttalk.org/2016/08/opportunity-solution-tree/)


> 最上段: Outcome 最終的なゴール
2段め: Opportunity そのためにやりたいこと
3段め: Solution 2段めのための解決策
4段め: Experiment 3段めのために試せそうなこと


以上です～

つづく
Easy Loans

In Ottawa, Easy Loans offers bad credit loans up to $50,000, based on collateral like fully paid cars, boats, RVs, trucks, mobile homes, and more. Our loans focus on asset value, not credit scores. Plus, you can retain your vehicle while repaying the loan. No need for concerns about losing your asset; we let you keep it.
Phone	877-232-7592
Address	Ottawa, ON K1H7X3 Canada
Website link	https://www.easyloansottawa.ca/
Ruby芸160チャレンジ(#16)内部状態を保持しながら処理を繰り返す

## この記事は何
[shellgei160を通じて言語習得 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/learning-via-shellgei160)に参加しています。

書籍「シェル芸ワンライナー160本ノック」の例題をRubyで解いてみて、Rubyの学習に役立てようとするものです。

例題はこちらのリポジトリで公開されているものに限ります。
https://github.com/shellgei/shellgei160

## 実行環境など
- Docker image: ruby:3.0.2
- 上記リポジトリをクローンした上で、リポジトリのルートディレクトリ直下に`answer-ruby`ディレクトリを作り、その中に解答となるファイルを作成していきます。

## 今回のテーマ
https://github.com/shellgei/shellgei160/blob/master/answer/16.md

```bash
$ n="XYZ";(for i in {A..C};do n+=$i;echo $n;done);echo $n
```

`XYZ`という文字列に対し、`A`から`C`を徐々に連結した接尾辞をつけます。ただし元の文字列は変えない。

```bash
# output
XYZA
XYZAB
XYZABC
XYZ
```

## 解
2パターン考えた。

ふんわり`yield`を使うと綺麗に書けそうだなと思ったが、実装が思いつかず諦めた版。
```ruby
text = 'XYZ'
suffix = 'ABC'
(0..suffix.length - 1).each do |i|
  puts text + suffix[0..i]
end
puts text
```

後から調べて`yield`を使ってみた版。
```ruby
text = 'XYZ'
suffix = 'ABC'

def growing_suffix(suffix)
  s = ''
  suffix.each_char do |c|
    s += c
    yield s
  end
end

growing_suffix(suffix) do |s|
  puts text + s
end
puts text
```

## 所感
- クラスを作るほどではないが内部状態を保持したい処理を書くのに`yield`は便利。書きっぷりに慣れる必要がある。
Ruby芸160チャレンジ(#15)文章の大文字化・タイトルケース化

## この記事は何
[shellgei160を通じて言語習得 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/learning-via-shellgei160)に参加しています。

書籍「シェル芸ワンライナー160本ノック」の例題をRubyで解いてみて、Rubyの学習に役立てようとするものです。

例題はこちらのリポジトリで公開されているものに限ります。
https://github.com/shellgei/shellgei160

## 実行環境など
- Docker image: ruby:3.0.2
- 上記リポジトリをクローンした上で、リポジトリのルートディレクトリ直下に`answer-ruby`ディレクトリを作り、その中に解答となるファイルを作成していきます。

## 今回のテーマ
https://github.com/shellgei/shellgei160/blob/master/answer/15.md

小問が2個あります。

```bash
小問1$ echo I am a perfect human | (read a; echo ${a^^})
小問2$ echo pen-pineapple-apple-pen | (IFS=-; read -a w; echo "${w[*]^}")
```

1.は文字を全て大文字(`^^`)に、2.は半角ハイフン区切りで単語を読み出して、単語の先頭だけ大文字に変更します。

## 解
```ruby:15_1.rb
raw = 'I am a perfect human.'
puts raw.upcase
```

```ruby:15_2.rb
raw = 'pen-pineapple-apple-pen'
puts raw.split('-').map(&:capitalize).join(' ')
```

## 所感
- 2.は、言語によってはタイトルケースに変換する関数が標準ライブラリに含まれるが、Rubyには無さそう? 単語ごとに`capitalize`しておく。
Ruby芸160チャレンジ(#14)For文+変数+Sleep

## この記事は何
[shellgei160を通じて言語習得 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/learning-via-shellgei160)に参加しています。

書籍「シェル芸ワンライナー160本ノック」の例題をRubyで解いてみて、Rubyの学習に役立てようとするものです。

例題はこちらのリポジトリで公開されているものに限ります。
https://github.com/shellgei/shellgei160

## 実行環境など
- Docker image: ruby:3.0.2
- 上記リポジトリをクローンした上で、リポジトリのルートディレクトリ直下に`answer-ruby`ディレクトリを作り、その中に解答となるファイルを作成していきます。

## 今回のテーマ
https://github.com/shellgei/shellgei160/blob/master/answer/14.md

```bash
#!/bin/bash
n=1
while [ $n -le 100 ]
do
   echo "羊が$n匹"
   n=$((n + 1))
   sleep 1
done
```

For文 + 変数です。

## 解
Rubyでの`sleep`のやり方ぐらいが目新しかった。

```ruby
wait_sec = 0.05

(1..100).each do |i|
  puts "羊が#{i}匹"
  sleep wait_sec
end
```

## 所感
特になし
Ruby芸160チャレンジ(#13)ファイルがなければ作成する

## この記事は何
[shellgei160を通じて言語習得 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/learning-via-shellgei160)に参加しています。

書籍「シェル芸ワンライナー160本ノック」の例題をRubyで解いてみて、Rubyの学習に役立てようとするものです。

例題はこちらのリポジトリで公開されているものに限ります。
https://github.com/shellgei/shellgei160

## 実行環境など
- Docker image: ruby:3.0.2
- 上記リポジトリをクローンした上で、リポジトリのルートディレクトリ直下に`answer-ruby`ディレクトリを作り、その中に解答となるファイルを作成していきます。

## 今回のテーマ
https://github.com/shellgei/shellgei160/blob/master/answer/13.md

```bash
$ [ -e unfile ] || touch unfile
```

ファイルが存在しなければ作成する。頻出処理ですね。

## 解
```ruby
require 'fileutils'

filename = 'unfile'
FileUtils.touch(filename) unless File.exist?(filename)
```

## 所感
- ファイルの`touch`には`fileutils`モジュールが必要。
Ruby芸160チャレンジ(#12)引数や標準入力の読み込み

## この記事は何
[shellgei160を通じて言語習得 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/learning-via-shellgei160)に参加しています。

書籍「シェル芸ワンライナー160本ノック」の例題をRubyで解いてみて、Rubyの学習に役立てようとするものです。

例題はこちらのリポジトリで公開されているものに限ります。
https://github.com/shellgei/shellgei160

## 実行環境など
- Docker image: ruby:3.0.2
- 上記リポジトリをクローンした上で、リポジトリのルートディレクトリ直下に`answer-ruby`ディレクトリを作り、その中に解答となるファイルを作成していきます。

## 今回のテーマ
https://github.com/shellgei/shellgei160/blob/master/answer/12.md

```bash
#!/bin/bash
if [ "$1" = "" ] ; then
    read n
else
    n="$1"
fi
echo $((n*2))
```

引数(`$1`)か、それが与えられない場合は標準入力を読み込み、2倍にして表示します。

## 解
```ruby
n = ARGV[0] || gets.chomp
begin
  n = Integer(n)
rescue StandardError
  raise ArgumentError, '引数は数値にしてください'
end

puts n * 2
```

## 所感
- 引数や標準入力の受け取り方、なるほど。`||`はシェル的用法(?)で、前のコマンドが失敗した時だけ実行するもの。失敗理由が限定的なときは、今回のコードのようにすっきり使えて良さそう。
- 与えられた値を数値に変換する時、`n.to_i`も使えるがエラーをキャッチできなかったので`Integer(n)`とした。
2023/12/12主にITとかセキュリティの記事

アップル、アンドロイドでのiMessage可能にする第三者アプリを遮断(12/10)
https://www.bloomberg.co.jp/news/articles/2023-12-10/S5FXWRT1UM0W00?srnd=cojp-v2

エンドツーエンド暗号化の必要性、Appleが強調(12/10)
https://iphone-mania.jp/news-561702/

Apple、公式声明でBeeper Mini対応を明らかに〜青い吹き出しの行方は？(12/10)
https://iphone-mania.jp/news-561694/

Zendsk 2023年12月のアップデート情報をまとめてみました(12/10)
https://dev.classmethod.jp/articles/zendesk-advent-calendar-2023-10/

Inspector のコンテナイメージスキャンを CodeBuild で実行してみた #AWSreInvent(12/10)
https://dev.classmethod.jp/articles/reinvent2023-inspector-cicd-codebuild/

AWS Backup で自動復元テストおよび検証が使用可能に(12/9)
https://aws.amazon.com/jp/blogs/news/automatic-restore-testing-and-validation-is-now-available-in-aws-backup/

「Linux」が狙われ始めた“なるほどの理由”(12/10)
https://atmarkit.itmedia.co.jp/ait/articles/2312/10/news030.html

イギリスの安保担当相が警告　生成AIの発達で“日本も海外の犯罪グループの標的に”(12/10)
https://news.infoseek.co.jp/article/ntv_2023121006243968/?tpgnr=world

ネットでクレカ決済しようとしたら「不正使用の可能性があるので止めました」というSMSが届いた話(12/10)
https://news.careerconnection.jp/lifestyle/166976/

【メタバース医療】活用例や課題をメタバース企業がわかりやすく解説(12/9)
https://xrcloud.jp/blog/articles/business/928/

ITベンダーも嘆く「SES契約は奴隷契約」、客との愚かな関係は清算すべし(12/11)
https://xtech.nikkei.com/atcl/nxt/column/18/00148/120600312/

教育用AIが生徒に偏向メッセージを連発、開発者は何を間違えたのか(12/11)
https://xtech.nikkei.com/atcl/nxt/column/18/02679/120600001/

生成AI利用の「つまずきポイント」は正当性と説明責任(12/11)
https://xtech.nikkei.com/atcl/nxt/column/18/02669/120100003/

職務質問の様子を記録する、業務用途でも普及が進む「ウエアラブルカメラ」(12/11)
https://xtech.nikkei.com/atcl/nxt/column/18/01679/110700138/
Ruby芸160チャレンジ(#11)複数行テキストを一塊として扱う

## この記事は何
[shellgei160を通じて言語習得 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/learning-via-shellgei160)に参加しています。

書籍「シェル芸ワンライナー160本ノック」の例題をRubyで解いてみて、Rubyの学習に役立てようとするものです。

例題はこちらのリポジトリで公開されているものに限ります。
https://github.com/shellgei/shellgei160

## 実行環境など
- Docker image: ruby:3.0.2
- 上記リポジトリをクローンした上で、リポジトリのルートディレクトリ直下に`answer-ruby`ディレクトリを作り、その中に解答となるファイルを作成していきます。

## 今回のテーマ
https://github.com/shellgei/shellgei160/blob/master/answer/11.md

```bash
$ cat gijiroku.txt | xargs -n2 | sed 's/^すず/鈴木/;s/^さと/佐藤/;s/^やま/山田/;s/ /:/;s/$/\n/'
```

`gijiroku.txt`中にある、改行区切りで`人\n発言\n`となっている文章を`人:発言\n`となるように置換しつつ、人の愛称を苗字に直す処理です。

## 解
```ruby
replacements = {
  /^すず/ => '鈴木',
  /^さと/ => '佐藤',
  /^やま/ => '山田'
}

# xargs -n2 相当のことをやるのって意外と大変
lines = File.open('qdata/11/gijiroku.txt', 'r').readlines
            .map(&:chomp)
            .reject(&:empty?)
pairs = lines.each_slice(2).to_a
# ここまで

# あとは置換やらなんやら
text = pairs.map { |pair| pair.join(':') }.join("\n\n")
replacements.each { |k, v| text.gsub!(k, v) }
puts text
```

## 所感
- `xargs -n2`相当のことをやるには、空行を無視して、それ以外の行を二行で一組になるように扱う必要があった。意外と面倒。`array.each_slice(n).to_a`は覚えておこう。
VST プラグインのプロトタイピングから検証までを MATLAB で ～ MATLAB の VST 生成機能を使う ～ データインスペクターでログ比較

[<B>MATLAB/Simulink Advent Calendar 2023</B>](https://qiita.com/advent-calendar/2023/matlab)

[<B>JUCE Advent Calendar 2023</B>](https://qiita.com/advent-calendar/2023/juce)

に参加しました。


・使用ツール
<dt>　MATLAB</dt>
<br>

<H4><a href="https://note.com/leftbank/n/n10efb1dda828"</a> [<B>note</B>]にUpしました。</H4>
Pythonを用いて、スキャンしたPDFからテキスト抽出してみよう！

## はじめに

&emsp;みなさんこんにちは、Hagianです。現在大学院修士2年に在学しています。本記事では、最近文献を読むにあたって直面した問題と、解決方法について簡単に紹介したいと思います。

## 背景・直面した問題

&emsp;学術論文をはじめとする、研究に関連する文献は近年、電子媒体で発行されるのが一般的になってきています。また、過去に発行された文献についても、電子化して公開する流れはかなり活発になってきています。これらの文献は、PDFとして公開されるのが一般的です。

&emsp;最近発行された文献の場合、PDFにフォントが埋め込まれている場合が多く、**一字一句変えずに利用する場面**（論文を引用するとき/翻訳したいとき/参考文献リストを作るとき etc..）で困ることはあまりありません。しかし、過去に紙媒体で発行された文献が電子化を経て公開された場合であったり、自分で文献をスキャンして保存した場合などは、ほとんどPDFにフォントが埋め込まれておらず、そのままではドラッグ&ドロップでコピーすることは**ほぼ不可能**です。

&emsp;そこで今回、Pythonと文字認識ライブラリを用いて、PDFからテキストを抽出したのでその方法を以下に記します。

## 使ったもの

* pdf2image

PDFを画像ファイルに変換するためのライブラリです。

https://pypi.org/project/pdf2image/

* PyOCR

PythonのOCR（光学文字認識）ツールで、さまざまなOCRエンジンを利用できます。

https://pypi.org/project/pyocr/

* Tesseract

Googleが開発したOCRエンジンで、以下リポジトリから無料でダウンロードすることができます。

https://github.com/tesseract-ocr/tesseract/

### 開発環境

* macOS Ventura 13.6
* VSCode 1.84.2
* Python 3.11.6

## 前準備

&emsp;開発にあたり、まず必要なもののインストールを行いました。TesseractはGithubからダウンロード可能ですが、Homebrewからもインストールできます。

```terminal
$ brew install poppler tesseract
```

ここでインストールしている```poppler```は、PDF閲覧用のライブラリで、pdf2imageが必要としています。Macの場合はHomebrewからインストールできます。

```terminal
$ pip install pdf2image pyocr
```

pdf2image、pyocrともにpipから簡単にインストールできます。

### Tesseractについて
&emsp;Tesseractには3種類のエンジンがあり、それぞれ長所が異なります。

* 通常版
* fast版（実行速度重視）
* best版（精度重視、実行速度はやや遅い）

上記のように、Homebrewからインストールすると、実行速度を重視したfast版が導入されるようです。このあたりは以下Qiita記事が詳しいです。

https://qiita.com/ku_a_i/items/93fdbd75edacb34ec610#2-tesseract%E3%81%AE%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%B3%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B

今回は元のPDFからできるだけ正確にテキストを抽出するため、best版を用いることにしました。上記Qiita記事を参考に、Githubからダウンロードし、データを入れ替えました。

また、Tesseractのエンジンは言語別になっているため、日本語など英語以外を必要とする場合には、都度ダウンロードが必要な点に注意してください。


## 実現したこと

&emsp;今回は、**PDFとして保存した英語の文献を読み込み、テキストだけ抽出してファイルに書き出す**、という操作を実装しました。

```pdf_ocr.py
from pathlib import Path
from pdf2image import convert_from_path
import pyocr
import pyocr.builders
import sys

# 使用可能なOCRツールを探す
tools = pyocr.get_available_tools()
tool = tools[0]
if len(tools) == 0:
    print("OCR tool is not found.")
    sys.exit(1)
lan = "eng"

# 抽出したいファイル名を指定
f_name = "hogehoge"

# パスを設定
pdf_path = Path(f"./{f_name}.pdf")
txt_path = Path(f"./{f_name}.txt")

# PDFから画像ファイルに変換
pages = convert_from_path(str(pdf_path), 300)

txt = ""
for i, page in enumerate(pages):
    txt = txt + tool.image_to_string(page, lang=lan, builder=pyocr.builders.TextBuilder(tesseract_layout=6))

# テキストファイルに書き出し
with open(txt_path, mode="w") as f:
    f.write(txt)
print("Process completed!")
```

## 使ってみた感想

&emsp;実際にこのコードを用いて、筆者がスキャンした論文（英文50ページ）のテキスト抽出に取り組んでみました。

すると5分程度で、**精度およそ95%のテキスト抽出に成功**しました。

テキストファイルとPDFを比較してみてみると、裏側の文字を認識している箇所がいくつかあり、人間の目よりも精度がいいのでは…？と思いました…。

## 参考にした記事

https://qiita.com/henjiganai/items/7a5e871f652b32b41a18

https://qiita.com/kyooooonaka/items/2cb297550792027afa93

https://blog.machine-powers.net/2018/08/02/learning-tesseract-command-utility/
横長の画像から横スクロール動画をつくーる（Python、OpenCV）

# はじめに
[がちもとさんアドベントカレンダー](https://qiita.com/advent-calendar/2023/gachimoto3)16日目の記事です。
今日は、横長の画像から横スクロール画像を作ります。

# 開発環境
- Windows 11 PC
- Python 3.11

# 導入
1．ライブラリのインストール

pip install opencv-python

2．横長の画像を用意（[昨日の結果](https://qiita.com/SatoshiGachiFujimoto/private/94e808a77e87d6fdf263)を用います。）

3．プログラムを作成

~~~png2mp4.py
import cv2
import numpy as np

# 入力画像ファイル名
input_image_file = 'result.png'

# 出力動画ファイル名
output_video_file = 'result.mp4'

# 入力画像の読み込み
input_image = cv2.imread(input_image_file)

# 入力画像のサイズを取得
height, width, _ = input_image.shape
print(height, width)

# 出力動画の設定
fourcc = cv2.VideoWriter_fourcc(*'mp4v')  # 動画コーデックを設定
output_video = cv2.VideoWriter(output_video_file, fourcc, 60.0, (1024, 1024))  # 動画ファイルを作成

# ROIを指定する左上座標とサイズ
roi_x = 0  # 初期位置

# ROIを横にスクロールさせながら動画を作成
for i in range(0, width-1024, 1):
    # ROIを切り取る
    roi = input_image[:, i:i + 1024, :].copy()
    # 動画にROIを追加
    output_video.write(roi)

# 動画をクローズ
output_video.release()

# ウィンドウを閉じる
cv2.destroyAllWindows()
~~~

<details><summary>コード解説</summary><div>

1．cv2モジュールとnumpyモジュールをインポートします。

2．入力画像ファイル名と出力動画ファイル名を設定します。

3．入力画像を読み込みます。

4．入力画像の高さと幅を取得し、変数 height と width に格納します。

5．出力動画の設定を行います。動画のコーデックは 'mp4v' を使用し、1秒あたり60フレーム、フレームのサイズを1024x1024に設定します。

6．ROI（Region of Interest）を指定するための変数 roi_x を初期化します。

7．ROIを横にスクロールさせながら、動画を作成します。ループを使用して、ROIが画像の左端から右端まで移動するようにします。

8．各イテレーションで、ROIを切り取り、それを出力動画に追加します。

9．動画の作成が終了したら、出力動画ファイルを閉じます。

10．最後に、すべてのウィンドウを閉じます。
</div></details>

# 実行結果

https://x.com/sotongshi/status/1734273345565401364?s=20

お疲れさまでした
OpenAIのDALLE2を用いて横スクロール画像を無限に生成すーる（Python、OpenCV）

# はじめに
[がちもとさんアドベントカレンダー](https://qiita.com/advent-calendar/2023/gachimoto3)15日目の記事です。
今日は、DALLE2を用いて横スクロールの画像を無限に生成していきます。

# 開発環境
- Windows 11 PC
- Python 3.11

# 導入
1．ライブラリのインストール
pip install pillow
pip install opencv-python
pip install requests
pip install openai

2．OpenAIのAPIキーを取得

https://platform.openai.com/api-keys

3．正方形画像を用意

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/a8ee376a-72ed-ab37-050f-27be508d9bc9.png)

4．プログラムを作成

~~~hokusai.py
from PIL import Image
from io import BytesIO
import numpy as np
import cv2
import requests

from openai import OpenAI
client = OpenAI(api_key="<INSERT-YOUR-API-KEY>")

# 画像を読み込む
image = cv2.imread("hokusai.png", cv2.IMREAD_UNCHANGED)

height, width = image.shape[:2]
image = cv2.resize(image, (1024,1024))
height, width = image.shape[:2]

# アルファチャンネルを追加（もし存在しなければ）
if image.shape[2] == 3:
    # RGBからRGBAに変換
    image = cv2.cvtColor(image, cv2.COLOR_BGR2BGRA)

result = image.copy()
for _ in range(10):

    # 右半分のROIを切り取る
    right_half_roi = image[:, width // 2:, :]

    mask = np.zeros((1024, 1024, 4), dtype=np.uint8)

    # 左半分にコピー
    mask[:, :width // 2, :] = right_half_roi

    _, mask_enc = cv2.imencode('.png', mask)
    mask_bytes = mask_enc.tobytes()

    # 画像生成APIを呼び出し
    response = client.images.edit(
        model="dall-e-2",
        image=mask_bytes,
        mask=mask_bytes,
        prompt="続きを書いてください。",
        n=1,
        size="1024x1024"
    )

    image_url = response.data[0].url

    # 生成された画像をダウンロード
    response = requests.get(image_url)
    if response.status_code == 200:
        generated_image = np.array(Image.open(BytesIO(response.content)))
        generated_image = cv2.cvtColor(generated_image, cv2.COLOR_RGBA2BGRA)
        cv2.imshow("image", generated_image)
        cv2.waitKey(100)

    right_half_roi = generated_image[:, width // 2:, :]
    result = np.concatenate((result, right_half_roi), axis=1)
    image = generated_image.copy()

cv2.imwrite("result.png", result)
~~~

<details><summary>コード解説</summary><div>

1．必要なライブラリのインポート: プログラムは、PIL（Python Imaging Library）、NumPy、OpenCV、requestsなどのライブラリを使用します。

2．画像の読み込み: cv2.imreadを使用して、指定されたファイルから画像を読み込みます。また、画像のサイズを1024x1024にリサイズします。

3．アルファチャンネルの追加: もし画像がRGB形式であれば、アルファチャンネルを追加してRGBA形式に変換します。

4．画像生成ループ: 生成された画像を10回生成するためのループがあります。各ステップでは次のことが行われます：

a. 右半分のROI（Region of Interest）の切り取り: 画像の右半分をROIとして切り取ります。

b. マスクの作成: マスク画像を作成し、左半分にROIをコピーします。

c. DALL·E 2.0モデルのAPIを呼び出し: 生成された画像の続きをDALL·E 2.0モデルに依頼し、新しい画像を生成します。

d. 生成された画像の取得: 生成された画像をダウンロードして表示します。

e. 生成された画像の右半分を切り取り、結果画像に連結します。

f. ループを繰り返します。

5．結果の画像の保存: ループが終了したら、生成された結果の画像を "result.png" というファイルに保存します。

</div></details>

# 実行結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/e0a4e5fb-dd58-ea39-0deb-9976f6aee374.png)

お疲れさまでした。
{}くらいつけようぜ？

## かっこがないと読めない！！

C言語だとif文の中身が一文の時にかっこをつけなくても良い。

``` c
if (x > 0)
    hoge();
```

今日これについて話します。

## 実際に遭遇した悪質な例

一瞬なんで動くのか脳がバグったコード。これ書く人きらい。条件式や中身は適当です。

```c
if (x > 0)
    switch (x) {
        case 1:
            hoge();
            break;

        case 2:
            fuga();
            break;

        default:
            break;
    }

piyo();
```

switch文がぱっと見浮いてるように見えます。これはif文から見たらswitch文は一文に見える？ので動作はします。

```c
if (x > 0)
    switch (x) {
        case 1:
            hoge();
            break;

        case 2:
            fuga();
            break;

        default:
            break;
    }
} //error!!!!!
piyo();
```

あれ？って思ってかっこを追加したくなりますが、これだと開きがないので動作しません。

## 実際に遭遇した悪質な例2

```c
int x = 5;
int y = 8;
if (x > 0)
    if (y > 0) {
        x++;
        
        if (x > 3) {
            x++;
            y++;
        } else
            x++;
    }

samba();
```

これも同様で上位のif文から見たらif文は一文なので動作はします。でもマジで見にくいので本当に一文とはいえかっこをつけて欲しいです。

## つけない心理

ちなみに1個目の例と2つ目の例のコード考えた人は同じです。~~マジで理解できないです。やめｒ~~

一旦寄り添ってみます。

- タイピング時間を短縮できる
- C言語の仕様を理解してるからかっこをつけなくていい場合がわかる自分に惚れてる

頑張って考えてみましたがこれしか思い浮かびませんでした。何か僕の知らないメリットがあればコメント欲しいです。でも10年プログラミングしてきてそんなシチュエーションは今のところないです。

## 私の結論

僕は基本的にかっこをつけるべきだと思います。

- スコープの明確化
- 見やすい（階層構造の明示）
- メンテナンス性

かっこをつけるだけでこれだけのメリットを享受できます。

`{`一つ打つ時間なんて誤差なので、大幅な時間短縮につながるわけではないしちゃんとやはり打って欲しいです。

## まとめ

括弧つけろ
confluenceのページ名を変更するとURLが変わる場合と変わらない場合がある事例

# インフラの人に教えてもらったよ
実は、自分が勘違いしてたのですが、どうせならと情報共有しておこうと思います。
Confluenceの仕様とのこと。

# ページ整理やタイトルを変更すると起きること

:::note info
日本語名タイトルで新規作成したページは、`pageId`が紐づいています。
ex) `https://...pageId=xxxx`
そのため、スペースのお引越しをしても、迷子になりません。
:::

:::note alert
英数字のみのタイトルで新規作成したページは、`pageId`が定義されていません。
ex) `https://...display/spaceName/pageName`
そのため、スペースのお引越しをすると、同じURLではアクセスできません。
:::

これ知ったとき、結構衝撃でした。
なぜこの話になったかというと、スペースのページお引越しをしたときです。
いくつかのページが、not foundになってしまい、いくつかのページはちゃんと引っ越しされていたんですね。

**・・・・なぜ？！**

と不思議に思って、話題にしてみたら、上記の仕様について教えてくれました。


えー・・うそーん・・。

ということで、みなさんもタイトルを考えるときは、日本語を混ぜるようにすると良いでしょう。
補足ですが、記号が入っていても、pageIdとして付与されるものもあるらしいです。

ややこし・・・。
confluence publisherを使って、ビルドの成果物をjenkinsから自動アップロードする

# はじめに
昔、jenkins pluginのオススメリストの記事を書きました。

https://qiita.com/bluelemmon/items/2ec853d6a9b57bd14518

これの中の一つに confluence publisherというものがあります。
これの便利なところについて紹介する記事です。

https://plugins.jenkins.io/confluence-publisher/

これを導入したキッカケなんですが、自分の会社では、

:::note warn
- 内製ツールが、Confluenceに手動添付でした
- しかも、ローカルビルドして、そいつを添付するという・・・（？！）
:::

おーいおいおいおいおい。ちょっとまってくれ。
それでいいのか、待ってくれ！！

ということで、jenkinsで色々自動化して今に至るわけですが、今回ちらっと紹介するのは、

1. jenkinsでビルド
1. ビルド物をアーカイブ
1. アーカイブした成果物をconfluenceにアップロード


で、３番目の部分です。

# やり方
紹介しなくても、pipeline syntaxで選択すれば、ある程度書き方は書いてあるのですが、せっかくなので。

どん！

```groovy
publishConfluence attachArchivedArtifacts: true,
    pageName: 'ページの名前',
    replaceAttachments: false,
    siteName: 'hogehoge.hogecorp.jp',
    spaceName: 'スペースの名前'

```
これは、アーカイブした物がある前提で動くものなので、それを踏まえて、各必要があります。
また、Confluenceのアカウント設定もjenkinsで行っておく必要があります。
あとは、パーソナルアカウントで駄目だったので、ID＆PW指定した記憶があります。
これは、会社のネットワーク環境によるかもしれませんが。

`spaceName`というのは、Confluenceの中の概念です。
Slackでいうところのworkspaceみたいなものかな。
ページの、`管理 -> 概要 -> キーに設定されているもの`が対象です。

ページの名前はそのままページ名。
日本語で、"ホゲの図書館　テスト"みたなタイトルであれば、スペースも入れた上でのページ名を記載します。

注意事項としては、タイトルやスペース名が変わった場合は適宜変更が必要なので、そこは注意が必要。

# 改善したこと
デザイナさんたちへのツールリリースがめちゃくちゃ楽になりました。
手作業アップロードだったので、いくつのバージョンをあげているの？みたいな間違いも起きません。
ちなみにですが、アップロードするツールは、exeやapp、msiだったりするわけですが、生成時にバージョンを自動取得してファイル名にしてるので、同じバージョンを上げてしまったときの間違いも減らせます。

デプロイの自動化は、自分を効率化する上では必須事項ですね。是非やってみてください。
【Powershell】 そのXMLの読み込み方は間違えている

# そのXMLの読み込み方は間違えている

## はじめに
短いです
間違った（できるけど適切ではない？）情報がインターネット上に広まっていたので、自分用のメモも兼ねて書いてます
間違った箇所があればコメントお願いします :bow:

## 間違った（適切でない）方法
xmlオブジェクトへのキャストを用いた方法です
インターネット上で調べてすぐに出てくる方法はこちらかと思います

```powershell
$xml = [xml](Get-Content "Path/To/XML.xml") 
# or
[xml]$xml = Get-Content "Path/To/XML.xml"
```

## 良い方法
`[System.Xml.XmlDocument]::Load()` を使用します

```powershell
$xml = [xml]::new() # [xml] は [System.Xml.XmlDocument] のエイリアスです
$xml.Load("Path/To/XML.xml")
```

## 何が違うの？

前者はファイル読み込みを `Get-Content` が担っているのに対し、後者は `[xml]::Load()` がファイル読み込みからパースまでの全てを行っているのが大きな違いになります
xmlファイルの先頭には、XMLのバージョンや文字コードについての情報を持つXML宣言が記述されています
XMLファイルを読み込むときに使用する文字コードはこのXML宣言を参照したいのですが、 `Get-Content` は（当たり前ですが）ここを**参照してくれません**
そのため、異なる文字コードで読み込まれたテキストデータがxmlのキャスト処理に渡され、結果**文字化けしたままパースされる**（たまにパースできずエラーになる）ことになります
一応 `Get-Content -Encoding [文字コード]` で使用する文字コードを指定することはできますが、全部やってくれる関数が用意されているのであればそちらを使うのが無難でしょう

## 参考
- [Windows PowerShell - Windows PowerShell による使いやすい XML インターフェイスの構築](https://learn.microsoft.com/ja-jp/archive/msdn-magazine/2012/august/windows-powershell-build-user-friendly-xml-interfaces-with-windows-powershell)
- [Make Get-Content recognize XML file encodings](https://github.com/PowerShell/PowerShell/issues/14508)
AWS上でEFSのモードを切替える際の備忘録（モード：bursting → elastic、elastic → bursting）


## 背景

- AWS上でのストレージ管理にEFS（Elastic File Storage）を使うことがしばしばある
- EFSは通常は`bursting`モードであり、不自由ない速度でファイルの`R/W`が可能であるが、高頻度で`R/W`すると`burstクレジット`なるものが消費され、一定の閾値を超えると途端に`R/W`の速度が遅くなる
- 上記に陥った際はEFSを`elastic`モードにして（多少費用は掛かるものの）`R/W`の速度を不自由ない速度にしたいときがよくある

## EFSのモードの切替え方（モード：bursting → elastic、elastic → bursting）

EFSに対してしかるべきリクエストを送ればOK
具体的には、`javascript`の場合は`'aws-sdk'`のEFSの更新リクエスト用メソッドにしかるべき設定（`bursting or elastic`）をしてコールすればOK（以下のような記事参照）


> https://www.seeds-std.co.jp/blog/creators/2019-08-26-132438/
> クレジットが減るとプロビジョニングになり、クレジットが充足するとバーストモードになる形です

> https://dev.classmethod.jp/articles/how-to-change-from-amazon-efs-bursting-to-elastic-using-aws-cli/
> "ThroughputMode": "bursting",
>  "ThroughputMode": "elastic",

以下は注意点メモ
- 該当記事では、`lambda`にて`node.js`を使用する際のプロファイルは`node.js 14.x`を想定している（`node.js 20`等をそのまま使うと`sdk`等の`import`方法が変わっている場合がある）
- EFSアクセスの際は`lambda`の`IAMロール`に`efs:fileupdate`権限を付与する必要がある（同じサブネットの場合はセキュリティグループの設定はなくてもアクセスできた）
- `CloudWatch`でWatch対象の``について、開始直後は`Insufficient Data`になることがしばしばある。１日ほど放置すれば取り急ぎ安定してデータ取得できるようになる傾向がある。

# 参考

https://dev.classmethod.jp/articles/amazon-efs-elastic-throughput-vs-bursting-throughput/

https://dev.classmethod.jp/articles/how-to-change-from-amazon-efs-bursting-to-elastic-using-aws-cli/

https://techblog.forgevision.com/entry/efs-throughput-mode/automations

https://docs.aws.amazon.com/ja_jp/efs/latest/ug/performance.html

https://qiita.com/Nao9syu/items/554bd8561ddc6182e8dc

https://techblog.techfirm.co.jp/entry/amazon-efs-burst-credits

https://blog.amedama.jp/entry/2015/08/26/210129

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/security-group-rules.html

https://dev.classmethod.jp/articles/ok-to-insufficient-data-in-cloudwatch-alarm/

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html
10ドルの請求が、いきなりPaypalから来たので、PolarDBのPay-as-you-goの仕組みを調べた話

# 結論
結果的には、プリオーソライゼーション（pre-authorization)の実施による、Paypalに対する仮チャージだったので、問題なし。

# 経緯
PolarDB for MySQLを検証しようと思い、Alibaba Cloudのアカウントを作成し、支払い方法はPaypalを選択しました。

PolarDB for MySQLでクラスタを作成する際に、「課金方法」は「従量課金」(Pay-As-You-Go)を選択して、利用を開始し始めると、急にPaypalから10.00 USDの支払い承認メールが通知され、おいおい、まだ使い始めで10ドルも使ってないよと思いながら、10.00 USDと言うキリの良い数字なので、デポジットか何かと思い、せっかくなので調査を開始したと言う背景です。

# プリオーソライゼーションって何？
サポートにケースを登録すると、すぐに返信があり、下記のことが判明しました。

- 支払い方法がデフォルトのPayPalに設定されている場合、Pay-As-You-Goサービスを開始すると、プリオーソライゼーション（pre-authorization)が発生する
- プリオーソライゼーションでは、Alibaba Cloud側から、事前承認が発行され、PayPalアカウントに一定額が凍結される。(freezeと書かれていた)
- プリオーソライゼーションは、Alibaba CloudのBilling centerには表示されない。(請求ではないので、たしかにその動きで正しいが、初めてだと金額の意味がわからず戸惑うが冷静にスルーしましょう)
- アカウントの消費に依存するが、凍結額は、通常 10ドル / 15ドル / 35ドル / 50ドルとなる。
- プリオーソライゼーションは、10日ごとに更新される。追加額が凍結されるのではなく、上記の凍結額が継続されるとのこと
- 30日後にプリオーソライゼーションの凍結は解除される
- 毎月末に、Alibaba Cloudから「従量課金」(Pay-As-You-Go)への課金が行われます。<BR>
と、まあ、ツラツラと書きましたが、「従量課金」(Pay-As-You-Go)とは言え、事前に決済およびアカウントの確認のため、一定額の支払いが必要という事らしいです。(正確には一時凍結で、あとで返ってくる)

# デポジットとは何が違うの？
海外のホテルでは、デポジットとして、一泊分の請求が事前に来るのはよくありますが、これは「利用可能な残高」であるため(つまり凍結されていない)ので、チェックアウト時に、宿泊代金として利用されることがあります。

プリオーソライゼーションは実際の支払いでは利用されず、取引が確定される前に一時的に一定金額が凍結される流れです
「従量課金」では、支払額が凍結額を超えない可能性もあるので、デポジットのように請求代金に含めたりはしないんでしょうね。

# ちなみに
別サービスのObject Storage Service (OSS)をActivateしたら、またPaypalから10.00 USDの支払い承認メールが飛んできました。おそらく、サービス毎にプリオーソライゼーションが実施されるということなんでしょうね。

# 参考

https://www.alibabacloud.com/help/en/user-center/support/when-will-the-pay-as-you-go-fee-be-billed/
【VSCode】Error Lensが神すぎる

この記事は、【 [可茂IT塾 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/kamo-it) 】の12日目の記事です。

# はじめに
エラーや問題に道を阻まれ膝から崩れ落ちた。
そんな時、手を差し伸べてくれた 🙏神🙏 拡張機能 [`Error Lens`](https://marketplace.visualstudio.com/items?itemName=usernamehw.errorlens) を紹介していきます。

# [Error Lens](https://marketplace.visualstudio.com/items?itemName=usernamehw.errorlens)とは

![デモ画像](https://raw.githubusercontent.com/usernamehw/vscode-error-lens/master/img/demo.png)

上の画像のように診断結果をより目立たせ、言語によって診断結果が生成された場合は行全体を強調表示し、メッセージをインラインで表示することで言語診断機能を強化してくれるVSCodeの拡張機能です。

機能は下の通りです。

* 診断を含む行をハイライト
* 診断をテキストとして行末に追加
* ガターにアイコンを表示
* ステータスバーにメッセージを表示

:::note warn
全ての診断結果を表示してくれるわけではないことにご注意ください。
:::

https://marketplace.visualstudio.com/items?itemName=usernamehw.errorlens

# おわりに
エラーや問題の解決にかなり役立つので皆さんもぜひインストールしてみてください。
Power BI レポートで情報ボタンを活用した話

他部署から出社率をみるためのPower BIレポートを作成してほしい、という依頼を受け、Power BIレポートを作成＆公開したところ、何度もデータについて質問されたことを通しながら、Power BIレポートのビジュアルの重要性を痛感し、取った対応策を共有します。

何を何度も確認されたかというと、使ったデータのデータソースについてと母数の定義、出社率を出すための計算式でした。（出社率を出すための母数は会社に所属する従業員のみなのかどうか、出社率を出すにあたり土日祝は考慮されているのか、など。）

もちろん、作成時には依頼者と会話し、この辺りはクリアにしてレポートの作成は行っていました。ただ、この依頼者は退職され、特にドキュメントは用意していなかったため、退社された方の後任者より何度も質問されました。
たしかに当時のレポートには全く説明が記載されておらず、初めて見た人は全くわからないレポートになってました。誰が見るかわからないことを前提にレポートは作成する必要があるな～思いながら、この件はPower BIのビジュアルについて考えるきっかけとなりました。

こちらのドキュメントはPower BIのビジュアルデザインについて抑えておくことが網羅的に説明されているのでとても参考になります。
https://www.docswell.com/s/marshal_dabao/524WLM-2023-09-10-155345#p1

今回の件については情報ボタンを使ってその辺りを説明することにしました。


## <概要>
情報ボタンをクリックすると、説明文書が表示されるようにしました。

1. Power BI Desktopにて、Tooltip用のページを新規作成
2. Tooltip用のページの設定
3. Power BIのレポートキャンバスに情報ボタンを配置
4. 情報ボタンの[書式設定]ペインにて[アクション]や[種類]などを設定

※参考にした記事
https://learn.microsoft.com/ja-jp/power-bi/create-reports/desktop-buttons?tabs=powerbi-desktop

https://marshal115.hatenablog.com/entry/2022/11/30/190621

## <手順>
1. Power BI Desktopにて、tooltip用のページを新規作成します。
Tooltip用のページはキャンバス設定にて、型を"ツールヒント"に設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952241/aef360b0-5f1e-174c-d883-75edc8e4e3ee.png)

2. Tooltip用のページはページ情報にて、名前を型に設定し、"ツールヒントとして使用することを許可する"をOnにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952241/44abcdbc-d516-b407-d568-b43de090e364.png)

3. Tooltip用のページに、説明しておきたい内容を記載しておきます。


4. PowerBI Desktopの[挿入]タブから[ボタン]=>[情報]ボタンを選択し、レポートキャンバスにボタンを配置します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952241/b8c09f77-c9b0-31d0-2a65-a6d1d2dfa4b6.png)

5. 作成した[情報]ボタンを選択したまま書式設定の項目で [状態] を選択し"押したとき"を選択、[アイコンの種類]については"情報"に変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952241/4a11524b-9b16-d815-a6cb-91432268cac6.png)

6. こちらでブックマークの設定を行います。[情報]ボタンをクリックしたら、先ほど設定したTooltipsページが開くようにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952241/8f1da742-83e7-3279-590f-0ca81e61441f.png)


以上