OmniAICreator/Qiita-1.07M huggingface dataset:
【PostgreSQL】メタコマンド〜\dl〜

## 初めに

Qiita Engineer Festa 2024に参加中。完走目指してます。
他のメタコマンドについては以下から読んでください。

https://qiita.com/dai_chi/items/04f5339d54130f070671

## \dlとは

> `\lo_list`の別名で、ラージオブジェクトの一覧を表示します。 コマンド名に`+`が追加されている場合は、各ラージオブジェクトが、もしあれば関連する権限とともに一覧表示されます。
> 

[\dlについて](https://www.postgresql.jp/docs/15/app-psql.html#:~:text=%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82-,%5Cdl%5B%2B%5D,-%5Clo_list%E3%81%AE%E5%88%A5%E5%90%8D)

## 試してみた

まずは使ってみた。

```sql
postgres=# \dl
ラージ オブジェクト
 ID | 所有者 | 説明 
----+--------+------
(0 行)
```

ラージオブジェクトが存在しないので0行である。

## まとめ

そもそもラージオブジェクトを扱ったことがないので一度触れてみようかと思う。
20240711_反映処理

```

[plantuml]
----
@startuml
skinparam StateFontSize 12
skinparam StateFontName Arial
skinparam ArrowFontSize 11
skinparam ArrowFontName Arial
top to bottom direction
skinparam ranksep 50
skinparam nodesep 50

[*] -down-> DB更新情報取得中

state DB更新情報取得中 #lightyellow {
    [*] --> カレンダー処理
    
    state カレンダー処理 {
        [*] --> 対象データ確認
        対象データ確認 --> [*] : 対象データなし
        対象データ確認 --> 反映処理選択 : 対象データあり
        反映処理選択 --> [*]
    }
  
}

state 5営業日前処理中 #lightyellow {
    [*] --> 新規追加処理
    新規追加処理 -right-> 名称変更廃止 : 新規追加完了
    名称変更廃止 -right-> 名称変更追加 : 変更完了
    名称変更追加 -right-> 廃止処理中 : 変更完了
    廃止処理中 -down-> [*] : 廃止完了

    state 新規追加処理 {
        [*] --> メール連携
        メール連携 -down-> リファレンスDBに追加_表示順1 : メール連携完了
        リファレンスDBに追加_表示順1 -down-> [*] : 追加完了
    }

    state 名称変更廃止 {
        [*] --> 文書切替_CN廃止①
        文書切替_CN廃止① -down-> [*] : ポータル使用フラグ不可
    }

    state 名称変更追加 {
        [*] --> リファレンスDBに追加_表示順99
        リファレンスDBに追加_表示順99 -down-> [*] : 追加完了
    }

    state 廃止処理中 {
        [*] --> 文書切替_D廃止
        文書切替_D廃止 -down-> [*] : ポータル使用フラグ不可\nand表示順99
    }

}

state 前日処理中 #lightyellow {
    [*] --> 名称変更_前日文書切替
    名称変更_前日文書切替 --> [*]

    state 名称変更_前日文書切替 {
        [*] --> 名称変更_CN廃止②
        名称変更_CN廃止② -down-> 名称変更_CN追加 : 表示順99更新完了
        名称変更_CN追加 -down-> [*] : ポータル使用フラグ可\nand表示順1
    }

}

state 5営業日後処理中 #lightyellow {
    [*] --> 廃止文書削除
    廃止文書削除 -down-> [*] : CN廃止 \nand D廃止 削除完了
}

DB更新情報取得中 -down-> 5営業日前処理中 : 対象データあり
5営業日前処理中 -down-> 前日処理中 : 5営業日前処理完了
前日処理中 -down-> 5営業日後処理中 : 前日処理完了
5営業日後処理中 -down-> 一括反映処理 : 5営業日後処理完了
一括反映処理 -down-> [*] : 一括反映完了

@enduml

```

![bLL1JnD15BxlhvZ4cmc9DU707WmYySY5engoserkQ7V9TWbHGq9t8aYbAIPQD4JJ8Y1I48Z6r2hqlpYTQVildDrPnd7wcYuzRBBplk_Rzxxt-iQOB0IM7opcSqPXtd4NBD_Aezd02koxdXlCEizibBa9XMQil8rk-uwb4Fcxxotz8sRqa4OCl0KKUEYX5mHU7cKTttuKE9whi7pBdI_O2s.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782003/b9e74ae9-ba0b-768d-47cf-57a391d4fcd1.png)
【PostgreSQL】メタコマンド〜\conninfo〜

## 初めに

Qiita Engineer Festa 2024に参加中。完走目指してます。
他のメタコマンドについては以下から読んでください。

https://qiita.com/dai_chi/items/04f5339d54130f070671

## \conninfoとは

> 現在のデータベース接続に関する情報を出力します。
> 

[\conninfoについて](https://www.postgresql.jp/docs/15/app-psql.html#:~:text=%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82-,%5Cconninfo,-%E7%8F%BE%E5%9C%A8%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9)

## 試してみた

```sql
postgres=# \conninfo
データベース"postgres"にユーザー"daichi"として、"/tmp"のソケットを介してポート"5432"で接続しています。
```

## まとめ

作業ログを残すのに叩くのはありかも。
Windowsでよく行う管理者権限によるサービス起動or停止をコマンドプロンプト（bat）で時短

# 概要

開発をする時だけ一時的に起動しておきたいローカルサービスがあります。

管理者権限を持たないユーザーで開発しているため、サービス起動時は下記手順を踏んでいます。

1. サービスを管理者として起動。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/e3e46e23-9e5d-0f68-b719-8ee4ae859880.png)
1. 管理者のIDとパスワード入力。
1. 一覧の中から該当のサービスを探しだして右クリックから起動。

毎度この作業が面倒！
『管理者のパスワード入力』は仕方ないにしても、それ以外の部分はbat化したい。

# やり方

```bat:
rem 管理者ユーザーでコマンド実行したい時は『runas』。
runas /user:ドメイン\管理者ユーザー名 "sc start ※※"

rem サービスが起動するまで待つ。待ち時間3秒は適当な値。
timeout /t 3 /nobreak >nul

rem ちゃんとサービスが起動したか確認用。
sc query "※※"

rem batで実行した時にコマンドプロントがすぐ閉じてしまわないように止める。
pause
```

## 『※管理者ユーザー名』の指定

ドメインユーザーなら『ドメイン\ユーザー名』のように指定します。

## これだけで済むようになりました

1. bat起動。
1. 管理者ユーザーのパスワード入力。
1. ちゃんと起動したか結果表示されるのでにエンター押す。

## 停止用のbat

```sc start ※※``` の部分を ```sc stop ※※``` に変えるだけ。

# 参考サイトさん

https://qiita.com/waokitsune/items/72d898c6f0af3d474621

https://qiita.com/waokitsune/items/221f7c20f485b82fe067

https://qiita.com/waokitsune/items/97256ffd26a3e8d8a6f0

https://atmarkit.itmedia.co.jp/ait/articles/0606/17/news015.html

# バージョン

Microsoft Windows [Version 10.0.22631.3880]
getcharの入力待ちにCtrl+Cで割り込みたい

（備忘録）（7/12：ご指摘に対応）

### やりたかったこと
getchar()で入力待ちループをしているときに、Ctrl+Cが押されたことを取得しこれをもとにターミナルに画面表示をしたかった
（そういう要望であったため、Ctrl+C以外を使用するなどは不可）

### はじめに作ったソース
signal()でSIGINT（Ctrl+C 押下時のシグナル）を設定
``` c

// シグナルハンドラ処理
static void ctrl_c_event( int sig )
{
	// Ctrl+C押下を取得し、これをもとに画面表示
	test_disp(0xff); // 画面表示処理
}

// メイン
int main(int argc, char *argv[])
{
    char input;

    signal( SIGINT, ctrl_c_event );

	// ループで標準入力を取得　入力をもとに画面表示を行う処理
	while(1){
       input = getchar();
       test_disp(input); // 画面表示処理
    }

	return 0;
}
```

### 解決…?
これで問題ないかと思っていたが、[シグナルハンドラ内でのprintfは推奨されない](https://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_04 "POSIX 2008年の文書") らしい。
※[参考にしたqiitaの記事](https://qiita.com/rarul/items/090920b850acc4b7e910 "シグナルハンドラにprintf()を書いてはいけない")
また、[signalを使用するのも推奨されない](https://ja.manpages.org/signal/2) らしい

### 対策
ので、対策として以下のように変更した。

Ctrl+C 押下時のシグナルハンドラでフラグを有効化

```c
// シグナルハンドラ処理
static volatile sig_atomic_t ctrl_c_flag;
static void ctrl_c_event( int sig )
{
	ctrl_c_flag = 1; // フラグを有効化
}
```
getchar()をread()に変更し、read()のコールをselect()によって制御するように変更
read()のタイムアウト後の処理でフラグのチェックを行い、フラグが有効であればCtrl+Cが押下されたことを通知
また、signalをsigactionに変更
```c
// メイン
int main(int argc, char *argv[])
{
    char input;

	static struct sigaction sig_ctrl_c;	// Ctrl+C通知用

	// sigaction初期化
	sigemptyset(&sig_ctrl_c.sa_mask);		// シグナルマスクをクリア
	sig_ctrl_c.sa_handler = ctrl_c_event;	// Ctrl+C通知関数を登録

	// シグナルハンドラ登録
	sigaction( SIGINT, &sig_ctrl_c, NULL);

	while(1){
		FD_ZERO(&fd_group);					// グループを初期化
		FD_SET(STDIN_FILENO, &fd_group);	// 標準入力をグループに追加

		if( select(STDIN_FILENO + 1, &fd_group, NULL, NULL, &timeout) == -1) return 0;

		// 入力を監視/処理
		if (FD_ISSET(STDIN_FILENO, &fd_group)) {
			// 標準入力からデータを読み込み
			if (read(STDIN_FILENO, &data, sizeof(data)) > 0) {
				test_disp(input);		// 画面表示処理
			}
		}

		// Ctrl+C イベント取得
		if(ctrlc_event_flag){
			test_disp(0xff); 			// 画面表示処理
			ctrl_c_flag = false;		// フラグをクリア
		}

		usleep(10 * 1000);	// 負荷軽減（10ミリ秒）
	}

	return 0;
}
```
【PostgreSQL】メタコマンド〜\cd〜

## 初めに

Qiita Engineer Festa 2024に参加中。完走目指してます。
他のメタコマンドについては以下から読んでください。

https://qiita.com/dai_chi/items/04f5339d54130f070671

## \cdとは

> 現在の作業ディレクトリを`directory`に変更します。 引数がない場合は、現在のユーザのホームディレクトリに変更します。
> 

[\cdについて](https://www.postgresql.jp/docs/15/app-psql.html#:~:text=%E3%81%9F%E3%81%9F%E3%82%81%E3%81%A7%E3%81%99%E3%80%82%EF%BC%89-,%5Ccd%20%5B%20directory%20%5D,-%E7%8F%BE%E5%9C%A8%E3%81%AE%E4%BD%9C%E6%A5%AD)

## 試してみた

```sql
postgres=# \cd /tmp
postgres=#
```

## まとめ

移動できるんだと感動したがイマイチ使い所は思いつかず。
Synthesizer V Studio Pro のスクリプト機能を試してみた

# これは何？
２週間ほど前に、Synthesizer V Studio Pro　を購入し、オリジナル曲のボーカルトラックを作成しています。
その中で、スクリプト機能が使えるということを知ったので少し試してみました。


- Synthesizer V
    - Dreamtonicsが開発する強力な音声処理エンジンと直感的で柔軟なユーザーインターフェースを併せ持つ歌声合成ソフトウェア。簡単にいうと、初音ミクとかのVOCALOIDみたいなものです。

# 今回作成するもの
選択しているノートを1オクターブあげるスクリプトを作ってみようと思います。

ちなみにスクリプトの対応言語は、`JavaScript` と　`Lua` になりますが、今回は　`JavaScript` で試してみます。

公式ドキュメント: https://resource.dreamtonics.com/scripting/ja/index.html



## はじめに枠組みを作る

スクリプトの構成には、以下の２つのグローバル関数が必ず必要になります。

- `getClientInfo()`
  - スクリプトがホストに読み込まれたときに呼び出されます。スクリプトの名前、作者、スクリプトのバージョン、スクリプトを実行するために必要な Synthesizer V Studio の最小バージョン番号を記述したオブジェクトを返します。

- `main()`
    - ユーザがスクリプトを実行したときに呼び出されます。

```javascript
function getClientInfo() {
  return {
    "name" : "Raise octave",
    "category" : "Edit note", // categoryの項目を追加すると、スクリプトのメニューが階層表示されます。
    "author" : "m.i",
    "versionNumber" : 1,
    "minEditorVersion" : 65540
  };
}

function main() {
  // 選択しているノートを1オクターブあげる処理を書く
}
```


## 選択中のノートを取得する

まずはじめにホストのオブジェクトを取得します。
ホストのオブジェクトは、`SV`という名前のグローバルオブジェクトで、スクリプトのどこからでもアクセスできます。

`SV`から、ピアノロールのUIオブジェクトを取得します。

```javascript
SV.getMainEditor()
```

さらにピアノロールから選択状態オブジェクトを取得します。
このオブジェクトでは選択解除などの操作や、選択中のノートの取得などが可能です。

```javascript
SV.getMainEditor().getSelection()
```

最後に選択された Note の配列を、選択順に取得します。

```javascript
SV.getMainEditor().getSelection().getSelectedNotes()
```


## ノートを編集する

`getSelectedNotes()`　で取得した配列の要素は　**Noteオブジェクト** になります。

Noteオブジェクトの関数には、歌詞・音程・音価の取得や設定が可能です。
普段、ピアノロールで打ち込みの作業をしている操作ができるイメージです。


まずは、`getPitch()` で　MIDIノート番号を取得します。

| MIDI | ノート番号 |
|:-:|:-:|
| C0 | 0 |
| C1 | 12 |
| C2 | 24 |

基本的にオクターブは12単位で変更すれば問題なさそうなので、取得したノート番号に12を足した値を設定してあげれば、1オクターブ上がりそうです。

ノート番号の設定には、`setPitch()`を使います。


## スクリプトの仕上げ

今までに説明した内容を`main`関数に追加して、最後にスクリプトの終了を示す　`finish()` を追加して完成になります。
`SV.showMessageBox()` を使用することでメッセージを出すことも可能なので、お好み応じて追加してみてください。

```javascript: raise_octave.js
function getClientInfo() {
  return {
    "name" : "Raise octave",
    "category" : "Edit note", 
    "author" : "m.i",
    "versionNumber" : 1,
    "minEditorVersion" : 65540
  };
}

function main() {
  var selection = SV.getMainEditor().getSelection();
  var selectedNotes = selection.getSelectedNotes();

  for(var i = 0; i < selectedNotes.length; i++) {
    var note = selectedNotes[i];
    note.setPitch(note.getPitch() + 12)
  }

  SV.showMessageBox("Raise octave", "finish");
  SV.finish();
}
```

実際に完成したスクリプトを取り込む方法などは、下記を参考にしてください。

https://synthesizer-v.fandom.com/ja/wiki/%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E3%83%BBTIPS%E9%9B%86?veaction=edit&section=2


## 最後に
今回作成したものは、ピアノロール上でも簡単にできるので恩恵は少ないですが、
今後打ち込みを進めていく中で、操作が面倒だなと思ったことがあれば、今回調べたことを応用して実用的なスクリプトを作っていけたらと考えています。
退勤時間にPodを自動削除する方法⏰

Kubernetes環境で、毎日18時にPodを自動的に削除したい場合は、コマンドに以下のものを使用します。この方法では、スクリプトが指定された時間まで待機し、その後Podを終了させます。

```yaml
apiVersion: v1
kind: Pod
metadata:
  name: example-pod
spec:
  containers:
  - name: example-container
    image: your-image
    command: ["bash", "-c"]
    args:
      - 'while [ "$(TZ=Asia/Tokyo date +%H%M)" != "1900" ]; do sleep 60; done'
```

## 設定の説明

- **`command: ["bash", "-c"]`**  
  この設定は、Bashシェルを使用してコマンドを実行することを指定します。

- **`args:`**  
  以下のコマンドを引数として渡します。
  ```bash
  while [ "$(TZ=Asia/Tokyo date +%H%M)" != "1900" ]; do sleep 60; done
  ```
  このスクリプトは、東京時間で19時になるまでループし、1分間隔で時刻をチェックします。19時になるとループを終了し、コンテナが終了します。

## 終わり
これで消し忘れがなくなってハッピー
Pandasでダミーデータを自動で作る get_dummies が便利

# 紹介したい内容
Pandasのget_dummiesはダミーデータを自動で作成してくれるのですごく便利

# 内容
例えば以下のようなデータであったとすると、データ解析をするために入会費半額、オールタイム、M/Fなどの文字列をダミーデータにしたい場合がある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512829/34d69535-817a-41d3-d2fe-ade9f9370cdb.png)

以下の get_dummies を実行するだけでいい感じにデータを変換してくれる。
``` Python
predict_data = pd.get_dummies(predict_data)
```

結果がこちら
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512829/66834095-32b7-1fe2-0a90-f24d7f03c273.png)

３つのラベルを分類するなら2bit、2つだけなら1bitしかいらないので、不要な列は削除する
``` Python
del predict_data["campaign_name_通常"]
del predict_data["class_name_ナイト"]
del predict_data["gender_M"]
predict_data.head()
```

最終的にこんな感じのデータで予測モデルなどを作る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512829/b988689a-bdf2-3ab3-8685-59b530344883.png)

# まとめ
まあデータ分析業界では当然なのだと思いますが、自分用のメモとして一応残しておく。
顧客が本当に欲しかったものをチーム顧客として共有するためのテンプレート

[なぜ顧客は「本当に欲しいもの」を言ってくれないのか？](https://qiita.com/Yametaro/items/7eca6c6d7b0cf862995c)という記事を読んで、チーム内でも要求について共有できていないことがあるなと感じ、作成してみました。
具体的にメンバーへ質問するときに使用することを想定しましたが、議事録的にテキストとして使用することもできそうです。

ベンダーへの発注側として業務にあたるようになり、顧客（ぼくたち）が求めるものを発注側としても共有して固めるためのテンプレートが欲しいと思ったことがきっかけです。
:thinking:（これがあればぺーぺーのぼくでも「せんぱいがかんがえたさいきょうのさくせん」を理解できるはず！！）
よりよくするためのご意見やアドバイスなどいただけますととてもうれしいです。

 # システムの開発・改善要求に対して抑えるべきポイント 
```template.txt
【解決したいこと】
なにを、どのようにしたいのか
現状どのようなことが問題なのか
結果としてどうなればよいのか
→本当にその結果が最も実現したいことなのか

この問題は解決すべきものであって、この解決方法が良いという考えに至った背景（業務知識を含む）


【実現方法】
どういうシステムがあれば実現できそうか
もしくは、どこを変更したらよさそうか
→本当にそこの変更が最適なのか、より簡単にメリットを得られる方法はないか

その考えに至った背景、思考の経路（業務上の制約、捨てた案など）
```
【build it 応用編②】好きな画像を使ってオリジナルのオブジェクトを作ってみよう！

![キャプチャ①.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/bf3e3ef7-be42-38d4-db12-6b656aaff055.png)

今回は好きな画像をオブジェクトに挿入する方法をご紹介します。
自分だけのオリジナルオブジェクトを作成してみましょう。

## 手順

### ①「カスタムオブジェクト」を選択
オブジェクトタブから「Custom」を選択してください。
![加工済みキャプチャ①.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/d1addeeb-b5db-f4c6-c6e0-93ed957d7ffc.png)

### ②好きなオブジェクトを選択
配置したいオブジェクトを選択し、プロパティのイメージ＋をクリックしてください。
![加工済みキャプチャ②.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/ef84a4a8-e33e-f3bb-81e3-559645e837c0.png)

### ③画像の挿入
下記画像の"＋"をクリックしてください。

![加工済みキャプチャ③.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/6b4e1f19-9804-8e4b-d8fd-ccc2c70dac67.png)

好きな画像を選択し、「開く」をクリックしてください。（添付画像はwindowsのもの）
![加工済みキャプチャ④.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/6da932c7-ec4b-7f4e-7268-e24ee7a5822a.png)

挿入したい画像を選択し、「確認」ボタンをクリックしてください。
![加工済みキャプチャ⑤.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/8ca00f5a-a00c-0b65-21de-bf8de0d5399c.png)

### ③オリジナルのオブジェクト完成
オブジェクトに画像が挿入されました。
![キャプチャ⑦.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/01006f8e-52db-b017-8fe9-de2ac0c9c5b2.png)

## 別の画像に変更する方法

１つのワールドにつき20個までの画像をアップすることが出来ます。
複数の画像をアップロードしている場合は、オブジェクトに挿入したい画像を選択し「確認」ボタンをクリックしてください。
![キャプチャ⑧.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/6111474e-af55-ca00-cd8f-f51ef244243c.png)

▼サッカーボールの断面写真を選択した場合
![キャプチャ⑨.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/e5600f84-8c7d-2580-7d4c-c293c41166fc.png)

## 画像を削除する方法
オブジェクトから画像を削除したい場合は、プロパティのイメージ(-)を選択するか、イメージ選択画面で該当画像の右上にあるゴミ箱ボタンをクリックしてください。

▼プロパティから削除する場合
![加工済みキャプチャ⑥.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/58a40576-d7d8-e658-b808-6a432f2a79d8.png)

▼イメージ選択画面から削除する場合
![加工済みキャプチャ⑦.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/c15a333f-1dbb-b0f8-ef52-b89bf0e69ba9.png)

前の記事[【build it 応用編①】オブジェクト管理をマスターしよう！](https://qiita.com/Lity0615/items/10c2569365e23cdf2f02)

https://studio.zepeto.me/ja/products/buildit
【build it 応用編①】オブジェクト管理をマスターしよう！

自分が配置したオブジェクトの管理方法について解説します。
ワールドを作成していくと、たくさんのオブジェクトを配置していくので管理が大変になっていきます。
この記事を読めば、簡単にオブジェクトの管理をすることができるようになります。

# 配置済みのオブジェクトを一覧で管理しよう
配置したオブジェクトは、目録として一覧表示されます。
![加工済みキャプチャ㉔.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/a4a28594-5e52-264a-5e81-87219273609f.png)

### 検索
検索欄にオブジェクト名を入力することで検索ができます。
配置済みのオブジェクト関しては、わかりやすい名前を設定することで検索しやすくなります。
マップ上のオブジェクトをマウスで選択せずとも、特定のオブジェクトのプロパティを開くことができるので便利です。
![加工済みキャプチャ⑭.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/04b9d149-5676-4cdc-5c12-44b658784adb.png)

### オブジェクトを一括管理
各オブジェクトのタブはドラッグ＆ドロップをすることで、親と子の関係にして一括で管理することができます。
![加工済みキャプチャ⑨.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/ae7ee8c8-e6e7-af09-e054-19b8ae44bb92.png)

マウスを右クリックして空のオブジェクトを生成することも可能です。
![加工済みキャプチャ⑪.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/03a92beb-b3c7-debd-d2d6-4135273107fc.png)


### オブジェクトを隠す
目のアイコンをクリックすることで編集中のマップから、対象のオブジェクトを隠すことができます。
![加工済みキャプチャ⑫.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/626cf563-1c3b-1c4e-17e2-ff9749a1b4fa.png)

### オブジェクトの保護
鍵マークのアイコンをクリックすることでオブジェクトの保護ができます。
ロック状態の時はオブジェクトが選択できないようになります。
![加工済みキャプチャ⑬.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/98a508af-e79a-80c9-37df-dc8e7a0e0963.png)

次の記事[【build it 応用編②】好きな画像を使ってオリジナルのオブジェクトを作ってみよう！](https://qiita.com/Lity0615/items/e3123bea50e08e21b3e1)では、自分だけのオリジナルオブジェクトの作り方を解説しています。
個性的なオブジェクトを配置してみましょう！

前の記事[【build it 基本編③】オブジェクトについて ](https://qiita.com/Lity0615/items/6e7c6bff89368c546d17)


https://studio.zepeto.me/ja/products/buildit
【build it 基本編③】オブジェクトについて

![キャプチャ㉚.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/568278ff-9378-8b27-ad9b-fe3928df5dde.png)

オブジェクトについて解説していきます。
この記事を読めば、自由度の高いオブジェクトを配置することができ、ワールドを更に面白くすることができます。

# オブジェクトを配置してみよう
オブジェクトとは、建物や車、壁などの置物のことです。
オブジェクトタブでは、好きなオブジェクトを選択しマップに配置することができます。

一部特殊なオブジェクトもあります。（詳しくはこちらとこちらの記事で紹介しています。）
![加工済みキャプチャ㉒.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/66b72487-36a0-7216-4ee6-8ae5a9f5dc79.png)

# オブジェクトの詳細設定
オブジェクトは、プロパティから個別に様々な設定をすることができます。
プロパティは画面上でオブジェクトを直接選択するか、Explorerタブの目録からオブジェクトを選択することで表示されます。
![加工済みキャプチャ㉕.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/4a905a24-2e88-a8f2-b5c2-18aa5af74db4.png)


## ①名前をつける
オブジェクトをたくさん配置していくと、ある特定のオブジェクトを思うように選択できないことがあります。
そのような場合に備えて、各オブジェクトに任意の名前を設定することをオススメします。　

## ②変換
オブジェクトの配置場所、向き、大きさを変更することができます。
いずれもX,Y,Z軸で管理されており、数値を入力して詳細に設定が可能です。

| 項目 | 機能内容 |
| ---- | ---- |
| 位置 | オブジェクトの位置を変更します。 |
| 回転 | オブジェクトの向きを変更します。 |
| 規模 | オブジェクトの大きさを変更します。|

※画面上部にある"移動","回転","サイズ"を選択した状態でオブジェクトをクリックすると、マウス操作で変更することも可能です。
![加工済みキャプチャ⑯.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/b2929abc-5e51-5845-12f5-68be3b139ee1.png)

▼移動(左)、回転(真ん中)、サイズ(右)
![加工済みキャプチャ⑮.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/ee3bfbd9-6cf0-305b-ae38-9f427e34f345.png)

## ③物理
オブジェクトの物理影響についての設定ができます。

| 物理効果：ON|
| ---- | 
|・アバターと衝突してもオブジェクトが動かず、完全に固定された状態になります。|
|・空中にオブジェクトを配置するとジャンプマップが作成可能です。|


| 物理効果：OFF|
| ---- | 
|・アバターと衝突してもオブジェクトに物理効果が発生します。|
|・重力をOFFにするとオブジェクトが空中に浮いていきます。|
|・質量が小さいほど、相対的にアバターより軽くなり、物理効果がさらに発生します。|


▼クルマの重力をOFFにした場合
![キャプチャ⑬.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/4a6c312d-58ff-369a-daf4-af63e1462845.png)

## ④色
オブジェクトの色を変更することができます。

▼通常色(左)、紫に変更(右)
![加工済みキャプチャ㉑.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/e4df356a-b43b-058e-1fd3-b8f3137ac406.png)

次の記事[【build it 応用編①】オブジェクト管理をマスターしよう](https://qiita.com/Lity0615/items/10c2569365e23cdf2f02)では、自分が配置したオブジェクトの管理について解説しています。
たくさん配置していくと管理が大変になっていきますので、効率よく作業できるようにマスタ－しましょう！

前の記事[【build it 基本編②】ワールドのカスタマイズについて](https://qiita.com/Lity0615/items/c3b9b1f5a55c0b31246f)

https://studio.zepeto.me/ja/products/buildit
[Dify] M1Macでdify-sandboxを立ち上げる


## はじめに

ついにDifyもサンドボックスがOSSになりましたね！

https://github.com/langgenius/dify-sandbox

しかしDifySandboxはLinuxで立ち上げる前提で作成されています。READMEでも書いていますね！

> DifySandbox currently only supports Linux, as it's designed for docker containers. It requires the following dependencies:

SandboxのPRを出すだったり、改造するだったりをしたい時にはこれは困ってしまいますよね。
なので今回はM1Macでも立ち上げる方法を書いていきます。


## Sandboxを立ち上げる or コンテナイメージビルドする

まずはdify-sandboxをクローンしてください。そしてディレクトリ内に入ってください。

```
git clone https://github.com/langgenius/dify-sandbox
```

そのあとは使い捨てのLinux環境を立ち上げてその中で作業します。

```sh
docker run -it --rm -v $(pwd):/workspace -w /workspace ubuntu:latest bash
```

環境を構築するのに必要なパッケージをinstallしていきます。

```sh
apt-get update
apt-get install -y build-essential sudo wget git
```

Goを使用できるようにするためにinstallしていきます。

```sh
wget https://go.dev/dl/go1.20.6.linux-arm64.tar.gz
tar -C /usr/local -xzf go1.20.6.linux-arm64.tar.gz
rm go1.20.6.linux-arm64.tar.gz

```

忘れずにパスを通しておきましょう。
```sh
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
echo 'export GOPATH=$HOME/go' >> ~/.bashrc
source ~/.bashrc
```


パスが通せているかを以下のコマンドで確認しておいてください。
```sh
go version
```


ではここからはdify-sandboxのREADMEにしたがって進めます。
まずは必要なものをinstallしてください。

```sh
./install.sh
```

ではビルドしてください。

```sh
./build/build_arm64.sh 
```

### Sandboxを立ち上げる
実際に以下で立ち上げることができます。

```sh
./main

```

### コンテナイメージビルドしてDifyで使ってみる。
コンテナイメージビルドするには以下を進めてください。
dockerイメージをビルドするならまずはdockerで立ち上げた環境から出て、rootで以下を実行してください。
その時に、Dify側でimageを使用する時にわかるような名前でイメージをビルドしておきましょう。

```sh
docker build -t yamaguchi/dify-sandbox:0.2.3 -f docker/arm64/dockerfile .
```

では最後にローカルで立ち上げる時のDifyの```docker-compose.yaml```を書き換えます。

```diff:
sandbox:
-   image: langgenius/dify-sandbox:0.2.3
+   image: yamaguchi/dify-sandbox:0.2.3
    restart: always
    environment:
      # The DifySandbox configurations
      # Make sure you are changing this key for your deployment with a strong key.
      # You can generate a strong key using `openssl rand -base64 42`.
      API_KEY: ${SANDBOX_API_KEY:-dify-sandbox}
      GIN_MODE: ${SANDBOX_GIN_MODE:-release}
      WORKER_TIMEOUT: ${SANDBOX_WORKER_TIMEOUT:-15}
      ENABLE_NETWORK: ${SANDBOX_ENABLE_NETWORK:-true}
      HTTP_PROXY: ${SANDBOX_HTTP_PROXY:-http://ssrf_proxy:3128}
      HTTPS_PROXY: ${SANDBOX_HTTPS_PROXY:-http://ssrf_proxy:3128}
      SANDBOX_PORT: ${SANDBOX_PORT:-8194}
    volumes:
      - ./volumes/sandbox/dependencies:/dependencies
    networks:
      - ssrf_proxy_network

```

これでDifyを立ち上げてください。



## 最後に

これでM１MacでSandboxが使えるようになりました！
あとは他にPythonライブラリをinstallしようとした時には、また少し工夫が必要ですので頑張る必要がありそうですね。

Xやってるので気になる方はフォローお願いします。

https://x.com/hudebakonosoto
【build it 基本編②】ワールドのカスタマイズについて

![キャプチャ㉜.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/3a837dac-0aac-909a-e258-43f146b2f8e1.png)

ワールドのカスタマイズ方法について解説します。
この記事を読めばワールドの地形や空の明るさ、音楽の変更等が出来るようになりワールドの雰囲気を自由にカスタマイズできるようになります。

# 地形のサイズと種類の変更
地形のサイズと種類を変更することができます。
![加工済みキャプチャ②.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/d3e4fb37-7f81-cb22-a0e3-a94ebc625c93.png)

### ①地形サイズの調整
地形の編集モードに切り替わりサイズを変更することができます。
"＋"または"-"をクリックすることで地形のサイズを自由にカスタマイズ可能です。
編集モードを終了する場合は、"地形編集終了"をクリックしてください。

![キャプチャ②.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/3fbd523a-b21c-8003-878d-c7766b313052.png)


### ②地形ブラシ
地形の種類を変更することができます。
水や道路、雪、マグマ等を選ぶことができます。
| 項目 | 機能説明 |
| ---- | ---- |
| ブラシ整列 | チェックONにすることで、描画する線をまっすぐに保つことができます。 |
| 大きさ | ブラシの大きさの調整ができます。 |

▼ブラシ整列OFF(左)、ブラシ整列ON(右)
![加工済みキャプチャ⑤.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/949ab561-4dbf-e608-0a2d-2f2604ebbf9f.png)


# 空の変更
空の明るさ設定ができます。
![加工済みキャプチャ③.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/bde36717-61c5-3977-86ba-df47d5a2eb87.png)

| 項目 | 機能説明 |
| ---- | ---- |
| 空色 | 朝～夜までの調整ができます。 |

▼朝(左)、夜(右)
![加工済みキャプチャ④.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/fd377e26-859d-243e-5711-d5020cab12f9.png)


# バックミュージックの変更
ワールド内で流れるBGMを設定することができます。
![加工済みキャプチャ⑥.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/608ca470-044d-69da-7277-bb68501ba58d.png)


| 項目 | 機能説明 |
| ---- | ---- |
| 音楽 | build it内で用意されている音楽が選択できます。<br>※2024年7月現在では、自分で好きなように音楽を設定することはできない仕様になっています。 |
| 音の大きさ | ONにすると音楽が流れ、OFFにすると消音になります。 |

# プレーヤーの設定
オリジナルマップを利用するすべてのプレーヤーの設定ができます。
![加工済みキャプチャ⑦.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/4e8f075e-7116-713f-8823-dd1c79def3da.png)

| 項目 | 機能説明 |
| ---- | ---- |
| 速度 | プレーヤーの歩くスピードを設定できます。 |
| ジャンプ | プレーヤーのジャンプの高さを設定できます。 |
| インベントリー | チェックをONにすることで、プレーヤーがゲーム内で所持しているアイテムを確認・使用できる機能が有効の状態になります。<br>インベントリーに表示されるアイテムは、ZEPETO StudioやUnityで設定が可能です。|

次の記事[【build it 基本編③】オブジェクトについて](https://qiita.com/Lity0615/items/6e7c6bff89368c546d17)では、オブジェクトの詳細設定について解説しています。個性的なオブジェクトを自分好みにカスタマイズして、ワクワクするワールドを作成してみましょう！

前の記事[【build it 基本編①】ダウンロード～基本操作編 ](https://qiita.com/Lity0615/items/d668e70422bdf59c49ed)

https://studio.zepeto.me/ja/products/buildit
【build it 基本編①】ダウンロード～基本操作編 

![キャプチャ㉝.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/414e5fdb-cd53-687e-a73c-e6950b3c9be2.png)

build itのダウンロード方法と基本的な操作について解説していきます！


# build itとは
ZEPETOのオリジナルワールドを作成することができる、PC用のマップエディターです。
無料でダウンロードすることができ、マウス操作のみで誰でも簡単にワールドを作成することができます。


# ダウンロード方法
公式ダウンロードページを以下のリンク先から開いてください。
https://studio.zepeto.me/ja/products/buildit

![加工済みキャプチャ①.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/fc40fd1f-4108-e779-fd5c-f4548ec14902.png)

### Windowsの場合
「windows」のボタンをクリックすると、セットアップウィザード「ZEPETO+build+it.msi」がダウンロードされるので、これを開いて「次へ」ボタンをクリックしてください。

![キャプチャ②.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/f785d07e-73ef-ff63-c01a-dc49a136a14c.png)

インストール先を確認して「次へ」ボタンをクリックしてください。
![スクリーンショット 2024-08-02 174124.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/55e1f99c-d41f-e043-2e99-f2d72de7e5ba.png)


「インストール」ボタンをクリックして、インストールを開始してください。
![キャプチャ④.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/65d13893-ba6e-c086-f1c4-73b28453563e.png)

インストールが完了しましたら「完了」ボタンをクリックしてください。
※「ZEPETO build itを起動する」にチェックを付けた状態で「完了」ボタンを押すと、自動的にbuild itが起動します。
![キャプチャ⑤.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/9ce134d5-091b-715b-f295-483394526044.png)

### Macの場合
「App Store」のボタンをクリックすると、App Storeが開きます。
「入手」ボタンを押してアプリをダウンロードしてください。
ダウンロード完了後、アプリを起動してください。
![キャプチャ⑦.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/ca77b584-9597-4eaa-4dc1-3729ca218b46.png)

# build itの基本操作
次へbuild itの基本操作について解説します。

### 視点の変更
マウス右を押したまま動かすことで360度視点を変えることができます。
また、マップ右上のボックスでも視点を変更することができます。
![加工済みキャプチャ⑲.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/b4aaa140-f3f8-a3f2-97ab-0204059e659e.png)


### 画面の操作
「メニュー > 設定」で操作方法が確認できます。
![加工済みキャプチャ⑰.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/2814191c-caa5-a91a-1e86-8e4d4343ff81.png)

### 保存方法
「メニュー > 保存」をクリックで保存ができます。

### 編集を終了する方法
「メニュー > ホーム」をクリックでホーム画面に戻ります。
「メニュー > 終了」をクリックでアプリを終了します。

### 覚えておくと便利な操作
**オブジェクトの複数選択**
Ctrlキーを押しながらオブジェクトをマウスで選択することで、同時に複数選択することができます。
または、マウス左を押しながらオブジェクトをカーソルで範囲選択することでも複数選択ができます。

▼Ctrl+クリック(左)、カーソルで範囲選択(右)
![加工済みキャプチャ⑱.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/f002f9f5-e418-15b8-8047-76513954147f.png)


次の記事[【build it 基本編②】ワールドのカスタマイズについて](https://qiita.com/Lity0615/items/c3b9b1f5a55c0b31246f)では、ワールド全体のカスタマイズについて解説しています。
自分だけのオリジナルワールドを作ってみましょう！
標準出力に出力したはずの最後の行が表示されない

（備忘録）（7/12 ご指摘に対応）

### 現象

画面表示で以下を期待していたところ
```
 test message
 #1
 #2
```
実際に表示されるのは以下だった
```
 test message
 #1

```


### 結論
標準出力を行う際に、出力がバッファリングされているため出力の一部が表示されないことがある

### 対策
標準出力のバッファリングを停止するか

```c
    setvbuf(stdout, NULL, _IONBF, 0)
```
バッファをフラッシュする必要がある
```c
    fflush(stdout);
```
（行バッファリングモードになっていれば、改行文字(\n)を出力すると出力が即座に反映される）
「コードを書く」って英語でなんていう？

# はじめに

英会話中に

「I am an IT engineer, so I write code every day at work.（私はITエンジニアなので、仕事で毎日コードを書きます。）」

と言ったら先生に通じなかったのでメモ。

# なぜ通じなかったのか

先生曰く、「write」はペンを使って書くことを連想するかららしい。なるほど。。。!!

# どう言うべきだったのか

じゃあなんていうんだろう？

「How do you say it?」と聞いてみた。

すると、「make code」もしくは「code」かな。と返ってきた。

そうなんだ！と思いつつ、違和感があったのでレッスン後調べてみた。

以下、ChatGPTの回答。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597765/21bd6f4a-0c3d-1c86-3ac0-4f0f2458b214.png)

どうやら「write code」はプログラミングの文脈で一般的に使われている表現とのこと。

プログラミングに馴染みがない人だったから通じなかったのかもしれない。

- **プログラミングに馴染みのある人 → 「write code」**
- **馴染みのない人 → 「make code」「create code」**

で使い分けていこうと思った。

# 最後に

英語でも、相手に合わせて表現を変える必要があることを学ぶいい機会になった。

英語の内容を qiita に投稿するのはちょっと違うのかな？と思いつつ、試しに投稿してみました。

英語学習は想像以上に忍耐が必要です。孤独に学習をしているので、もし同志がいましたら気軽に絡んでください。笑

最後まで読んでくださりありがとうございました!!
量子エンジニア(アニーリング式)勉強会メモ #4

量子エンジニア(アニーリング式)第4回の勉強会メモです。第1回、第2回、第3回のメモは以下。

https://qiita.com/y-vectorfield/items/25b2ac76dbf3a0f6e923

https://qiita.com/y-vectorfield/items/bf50b135cd07b238e28a

https://qiita.com/y-vectorfield/items/7314fc4623c86356f16b

# One-hotエンコーディング
ニューラルネットワークの出力層から出て来る出力と同じ状態。1回目の内容を応用すると出来てしまう。TytanSDKのエネルギー式は原理さえ分かってしまえば簡単に作れてしまえてとても便利。

```python
H = 0
H += (q[0] + q[1] + q[2] - 1)**2
```

# Reference
https://github.com/tytansdk/tytan_tutorial
Google Analytics (GA) と Google Tag Manager (GTM) の違い

### はじめに
こんにちは、フロントエンドエンジニアのちゃったまです。

ウェブサイトのトラフィックやユーザー行動を分析するためのツールとして、Google Analytics (GA) と Google Tag Manager (GTM) が広く利用されています。
今回当方が携わっているWEBシステムで、GAとGTMの組み込み機能を拡張する予定です。
GAについてはある程度理解はあるつもりですが、GTMとの違いがいまいちよく掴めていませんでした。
そこで、それぞれの違いをAIに聞いて、備忘録的にまとめていきたいと思います。

---

### Google Analytics (GA) とは
#### 目的
Google Analytics (GA) は、ウェブサイトのトラフィックやユーザー行動を詳細に分析するためのツールです。GAを使用することで、ウェブサイトのパフォーマンスを理解し、改善点を見つけることができます。

#### 主な機能
- **基本的なメトリクスの提供**: ユーザー数、セッション数、ページビュー数など。
- **詳細なデータ収集**: ユーザーの地理情報、デバイス情報、参照元など。
- **コンバージョン追跡**: コンバージョン率やエンゲージメント指標のトラッキング。
    - コンバーションとは、ウェブサイトにおける目標達成のことを指します。
    具体的には、ユーザーがウェブサイト上で望ましいアクションを取ったときに「コンバージョン」が発生します。
    例えば、100人がサイトを訪問し、そのうち5人が商品を購入した場合、コンバージョン率は5%になります。
    - エンゲージメント指標とは、ユーザーがウェブサイトやコンテンツとどの程度関わりを持っているかを示す指標のことです。
- **カスタムレポートの作成**: 特定のユーザー行動を追跡し、カスタムレポートを作成可能。

#### インストール方法
GAのトラッキングコードをウェブサイトに直接埋め込みます。

例: G-XXXXXXXXXX部分にGAのトラッキングコードをセット
``` html
<!-- GA4のグローバルサイトタグ -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-XXXXXXXXXX"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());

  gtag('config', 'G-XXXXXXXXXX');
</script>

```

---

### Google Tag Manager (GTM) とは
#### 目的
Google Tag Manager (GTM) は、ウェブサイトのタグ管理を簡素化し、コードの知識がなくてもタグを管理・更新できるようにするツールです。

#### 主な機能
- **タグの一元管理**: 各種マーケティングタグ（GAタグ、広告タグ、カスタムタグなど）を一元管理。
    - ウェブサイトに必要なさまざまなタグ（JavaScriptコード）を個別に管理する手間が省け、効率的な運用が可能になります。  
- **トリガー設定**: 特定のタイミングや条件でタグを発火させるためのトリガーを設定。
    - 例えば、次のようなトリガーがあります。
        - ページビュー: ユーザーが特定のページを訪れたとき。
        - クリック: ユーザーが特定のリンクやボタンをクリックしたとき。
        - フォーム送信: ユーザーがフォームを送信したとき。
        - タイムアウト: ユーザーが特定の時間以上ページに滞在したとき。
        - カスタムイベント: JavaScriptによって発火されるカスタムイベント。
- **タグの追加・更新が簡単**: 開発者の手を煩わせずにタグを追加・更新可能。
    - 管理画面上から操作できるため、エンジニア作業が不要となる。
- **デバッグモード**: タグの動作確認ができるデバッグモードを提供。

#### インストール方法
GTMのコンテナスニペットをウェブサイトに埋め込み、管理画面からタグを設定します。


例: GTM-XXXXXX部分にコンテナIDをセット
``` html
<!-- Google Tag Manager -->
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-XXXXXX');</script>
<!-- End Google Tag Manager -->
```

---

### GAとGTMの主な違い
1. **目的**:
   - **GA**: ウェブサイトのデータ分析に特化。
   - **GTM**: タグの管理と実装を効率化。

2. **機能**:
   - **GA**: 分析データの収集とレポート作成。
   - **GTM**: 各種タグの一元管理と運用。

3. **インストール方法**:
   - **GA**: トラッキングコードを直接埋め込む。
   - **GTM**: コンテナスニペットを埋め込み、タグの管理をウェブベースで行う。

---
### まとめ
GAは分析ツール、
GTMは、GAと、その他のタグ（Google Adsタグ、Facebookピクセル、LinkedInインサイトタグなど）を管理するツール。

この記事がGAとGTMの違いを理解する助けになれば幸いです。
SNSについて考えてみる

## はじめに
今回は下記イベントの参加記事として私が思っている事を記していきたいと思います

https://qiita.com/official-events/a1b1a6dd87105eb2bb92

## SNSときいて最初に思ったこと
メール、SMS、FAX、郵送、音声、SNSなどのコミュニケーションAPIを活用した「これからの情報伝達手段の在り方」といわれて、私自身よく利用するものはSNSです。

改めて、SNSとはソーシャルネットワーキングサービスのことになります。
インターネット上でユーザー同士がつながり、情報を共有したり、コミュニケーションを取るためのプラットフォームです。

主なSNSはFacebook、X（Twitter）、Instagram、TikTokなど様々です。

これらのSNSはすでに完成されたものであり、これ以上のものを作れと言われてもパット思いつくのは至難の業💦
よりよくするという方向で考えてみます。

## SNSの問題点を考える
### まずはSNSの利点から
- つながりの構築
家族や友人、ビジネスパートナーと簡単につながり、コミュニケーションが取れる
- 情報の共有
写真、動画、記事などのコンテンツを簡単に共有できる
- 情報の取得
ニュース、トレンド、専門的な情報をリアルタイムで取得できる
- マーケティング
ビジネスにおいて、商品やサービスのプロモーションに活用できる

### 次に問題点
- デジタル格差。情報格差
- プライバシーやセキュリティの問題
- 偽情報。詐欺情報
- 情報過多によるストレスなどの体調不良
- グローバルとは反対に文化的独自性の喪失懸念
- 生産性の低下

## 問題点(特にセキュリティや偽情報）からSNSをよりよくするために
上記のような問題点に対してアプリを提供している企業含め対策を講じているようですが、まずは**自衛**が第一なのではないかと感じています。

自分で自分を守るためには、その先の危険性・最悪どういう事になってしまうのかを知っておくことが大切だと思っています。

小学生等の時に、交通安全の事を学んだり、麻●の危険性を学んだりした方は多いはずです。その時、最悪どうなってしまうのか・・・:scream:
このような教育は子供だけでなく、「私車免許取得して、ペーパーではないゴールドの持ち主だから、事故なんて起こすはずがない。大丈夫でしょ！」というような、隙間すかっすかのある程度年齢のいったからこそ重要だと感じています

かといってどこで自分を守るためとはいえ学びなおす人はごく少数だとも思っています。

強制的に一定期間アプリを利用したら危険性についての「最悪こうなる」をアプリ起動時に流すような機能があればいいのではないかと（これを視聴しないとアプリ利用停止とか）

最悪
- 捕まる
- 一生刑務所
- 亡くなる
- 顔をさらされる
- 記事は消えてもデータは残る
- 犯した罪は消えない
- だまされたらお金は戻ってこない
- 家庭崩壊

考えるときりがない

## さいごに
健全なる情報伝達手段をこれからも利用するには、自分からその危険性等を理解しておくことで、よりよい情報伝達をおこなえるし、その先の新たな手段を生み出すのではないでしょうか。
免許ないとダメ！みたいな強制力は一番効果的？
日本時間を表現するには"Asia/Tokyo"？　それとも"+09:00"？

世間的に、`Asia/Tokyo`は`+09:00`とまったく同義だと取り扱われているのではないかと思います。そうですよね、常に日本時間は世界標準時+9時間です。なにしろ日本には夏時間がありませんからね。

夏時間がない、それが問題です。覚えていらっしゃいますでしょうか2020年の夏、オリンピックの試合を涼しい時間にやるためという目的でいきなりその年からの夏時間（しかも2時間）導入が真面目に検討されたことがあったのを。国の制度は変わりうるのです。`Asia/Tokyo`が`+09:00`と同義なのは今のことであって、将来どうなるかはわからないのですよね。

Asia/Tokyoと指定すると
----
OSやミドルウェア、言語処理系を適正にアップデートし続ける限りは、国の制度の変化にも追従し続けることができます。つまり、`Asia/Tokyo`と書いていたなら夏の間は世界標準時+10時間だったり+11時間だったりで変換されるようになるはずです。

`Asia/Tokyo`指定が特に適しているのは、UI向けの変換です。

ソフトウェア内部では、日付時刻はタイムゾーンによらない絶対時刻で表現していますよね。（⋯ますよね？）　それをユーザーに見せるときはユーザーの所在地による日付時刻に変換して見せるわけですが、それは当然ユーザーの腕時計とあっているべきです。ですから、夏時間に追従している必要があるのです。

+09:00と指定すると
----
これは標準世界時+9時間を固定しているわけですから、夏時間導入後もまったく変わらない変換になります。

それでは困るのかというと、こうでなくては困る場合というのもあります。主に、分析や日次更新にかかわる処理ですね。

日単位に集計をする場合、夏時間の変わり目で23時間だけの日や25時間ある日が登場するとグラフにおかしな凹凸ができてしまいます。日次更新するようなバッチ処理においても、「24時間より古い未処理データはないはず」のような前提条件が崩れてなにが起こるかわからなくなったりします。

むかしGCPで、無料枠内で使っているはずなのに夏時間の終わる月に1時間超過利用したということで課金が発生してしまったなんて話がありましたね。あれもこれに当たりますね、本来は固定オフセット設定で運用すべきところを地名設定で運用してしまったための問題だと言えます。

外部APIとの変換
----
外部APIが日本時間で日時を返してくれるのでこちらのプログラム内で処理できるよう絶対時刻に変換するとき、これは`Asia/Tokyo`と`+09:00`、どちらが正しいでしょうか？

これは判断しようがないんですよね、外部APIがどちら設定で日本時間時刻を生み出しているのかわからないので。問い合わせてみるのも良いかもしれませんが、正しい答えが得られる保証はありません。（質問の意味さえ理解してもらえるかわかりません）

大変面倒なことではありますが、こちらのプログラム内ではどちらか適当に選択した上で、そこに「この`Asia/Tokyo`はこのAPIの時刻変換と一致しているか不明なので夏時間導入時には要確認」というコメントを残しておくのがベストとなると思います。本当にいざというとき全文検索で全部見つけ出せるよう、定型テキストにしておくのをお勧めしておきます。

まとめ
----
- UIとの変換 ⋯ `Asia/Tokyo`
- 外部APIとの変換 ⋯ 適当に決めつつ、適当に決めたことのコメントを
- 日付区切りを作る処理 ⋯ 要件を検討しつつ、おそらく`+09:00`が妥当となる場面が多そう
Hotkeyの設定でiTerm2を画面にオーバーレイ表示させる

controlキーを2回クリックするだけで、画面上にiTermウィンドウをオーバーレイ表示させていつでも使えるようにしたい。フルスクリーン上でもオーバーレイできるようにするのが個人的重要事項。かつ透明度をさげて裏の画面を見ながら操作できるようにする。

## 設定方法
`Keys->Hotkey->Create a Dedicated Hotkey Window...` でHotkey作成。

![Screenshot 2024-07-11 at 12.46.35 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2349875/653dd239-e1b3-a3e5-de47-bd7a551436ca.png)


`Double-tap key` にチェック、キーを選択。
`Floating window` にチェック。

![Screenshot 2024-07-11 at 7.40.58 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2349875/ebfa468e-c1e8-e554-c52c-ee3dff92089f.png)

`General->Window` で `Native ful screen windows` のチェックを外す。

![Screenshot 2024-07-11 at 7.39.24 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2349875/2d2b21c6-acb3-9ca0-62ec-eabbee1b3335.png)

`General->Startup` で `Only Restore Hotkey Window` にする。 

![Screenshot 2024-11-06 at 11.38.37 AM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2349875/5bfc57dd-4670-48e3-143c-677cb7718ba1.png)

`Profiles->Window` で透明度とかサイズとかの設定をいい感じにする。

![Screenshot 2024-07-11 at 7.33.29 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2349875/20b8602e-67b8-375a-07d3-4bb3669e2468.png)


`Profiles->Keys` で `A hotkey opens a dedicated window with this profile.` にチェック。 

![Screenshot 2024-07-11 at 7.40.03 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2349875/074c842b-e5c4-cac0-cfbc-7e8ab58e2a3a.png)


以上。

## 参考
- [iTerm2の使い方や初期設定を解説！Macのターミナルアプリとしてオススメの理由とは？Hotkeyを設定し効率化しよう](https://freelance.shiftinc.jp/column/iterm2)
- [iTerm2 でフルスクリーンで起動しているアプリにターミナルを重ねる](https://gist.github.com/d-kuro/551d98f9d4a28f61b3e8111adc082074)

ちなみに、こちらはiTermをoh-my-zshでいい感じにする方法。

https://qiita.com/mz_mz_mz/items/cd73a1cfac0e9b2b42ec
【ChatGPT＋Code Interpreter】で音声合成についてわかったこと。


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

　今回は、音声合成についてわかったことを書きます。

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

　Anthropicが
　　ClaudeのArtifactsを
　　　紹介する公式サイトを
　　　　開設したそうです。
　[IT naviさんポスト](https://x.com/itnavi2022/status/1811231687612965288?t=niDt8kFOv4f6G5nXZYXRiQ&s=03)

　登録すれば、
　　世界のArtifactsファンの人に
　　　見てもらえるかも。
***
　さて、本題です。

　今回は、昨日（2024/07/11）に
　　引き続き、音声合成についてです。
[【ChatGPT＋Code Interpreter】で音声合成を行ないます。](https://qiita.com/kabumira/items/189289c205b616c24fdb)

　いろいろとやってみたところ、
　　いくつかわかりました。

　❶男性女性の指定は、意味がない。
　❷スピード調整が可能。
　❸音声合成しても音声出力できない。
　❹英語オンリー（日本語はデタラメ）
***
　❶男性女性の指定は、意味がない。
　　　これは、指定しても一緒。
　　　　あんまり違いが感じられず。

　❷スピード調整が可能。
　　　これは、もともとが早いので
　　　　“ゆっくり”と指示したことで
　　　　　変わりました。
　　　　コード自体では、
　　　　　rateの操作で行なわれます。

　❸音声合成しても音声出力できない。
　　　これは、ChatGPTの仕様ですね。
　　　　そのため、聞きたいならば
　　　　　ファイルに出力する
　　　　　　ことになります。

　❹英語オンリー（日本語はデタラメ）
　　　これは、英語圏のものですから
　　　　仕方ないですね。
　　　　　日本語をひらがなに開いて、
　　　　　　ローマ字表記にして、
　　　　　　　それを渡すことに
　　　　　　　　なるのかな。

　だいたい
　　こんなところですね。

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

　今回は、ここまで。
UptimeKuma を簡単に構築

## UbuntuServer (24.04) Install
※それ以外での検証はしていません。

・簡易スクリプトをインストール
```
wget https://m1ntooo.com/Download/UptimeKuma/uptimekuma.sh && chmod +x uptimekuma.sh && clear && ./uptimekuma.sh
```
``Install: y , Cancel: n :``  と出たら ``y``と入力してEnter

これで終わりです。
あとはローカルIP:3001でアクセスするとできます。


### もしできない場合
・Dockerをインストール
```
wget https://m1ntooo.com/Download/Docker/docker.sh && chmod +x docker.sh && clear && ./docker.sh
```
こちらをインストールしてください。先ほどと同様に
``Install: y , Cancel: n : `` と出たら ``y`` と入力してEnterを押してください。

これで終わりです。お疲れさまでした。
アプリ開発者を雇うとリモート開発者を雇う：成功のためのベストプラクティス

近年、アプリ開発の需要が急増しており、多くの企業が優れた開発者を採用することで競争力を高めようとしています。また、リモートワークの普及により、地理的な制約を超えて優秀な開発者を採用することが可能になりました。この記事では、アプリ開発者を雇う際のベストプラクティスと、リモート開発者を成功させるための戦略を紹介します。
[アプリ開発者を雇う](https://newwave-solutions.co.jp/hire-app-developer/)際のベストプラクティス
アプリ開発者を採用する際には、以下のポイントに注意することが重要です。
技術スキルの評価:
開発者の技術スキルを正確に評価するために、実際のコーディングテストやプロジェクトの成果物を見ることが効果的です。特に、必要な技術スタックや経験が求められるかどうかを確認しましょう。
コミュニケーション能力:
チームとの円滑なコミュニケーションが重要です。コードレビュー、進捗報告、問題解決能力など、コミュニケーションスキルも評価対象として考慮しましょう。
チームフィット:
開発者がチームの文化や価値観にフィットするかどうかを確認します。チームワークが重要な開発環境では、相互の信頼関係と協力が成功の鍵となります。
成長と学習意欲:
技術の進化が速いアプリ開発業界では、常に学び続ける姿勢が求められます。開発者が自己啓発に積極的であるかどうかを見極めましょう。
[リモート開発者を雇う](https://newwave-solutions.co.jp/hire-remote-developers/)成功の戦略
リモート開発者を採用する場合、以下の戦略が役立ちます。
明確なコミュニケーションチャネルの確立:
リモートチームとの定期的なビデオ会議やチャットツールの活用を通じて、コミュニケーションを促進しましょう。進捗報告や課題の共有がスムーズに行える環境を整えます。
透明性とオープンネス:
リモート開発者に対して、プロジェクトの目標や期待する成果物を明確に伝えることが重要です。進行状況や課題についてオープンに議論し、問題解決に積極的に取り組みましょう。
タイムゾーンの違いの管理:
グローバルなリモートチームでは、タイムゾーンの違いが課題となることがあります。適切なツールやスケジュールの調整を行い、効率的なコラボレーションを実現します。
成果主義の導入:
リモートワーク環境では、効果的な成果主義の導入が重要です。開発者が成果を出せる環境を整え、自己管理と成長を促進します。
まとめ
アプリ開発者を雇う際には、技術スキルだけでなくコミュニケーション能力やチームフィットも重視しましょう。また、リモート開発者を成功させるためには、明確なコミュニケーションと透明性、タイムゾーンの管理、成果主義の導入が不可欠です。これらのベストプラクティスを実践することで、優れた開発者を採用し、プロジェクトの成功を支える強力なチームを形成することができます。
バックエンドフレームワークトップ10と選び方

Web開発において、バックエンドフレームワークは不可欠な要素です。効率的でスケーラブルなアプリケーションを構築するためには、適切なバックエンドフレームワークを選ぶことが重要です。この記事では、バックエンドフレームワークのトップ10を紹介し、PythonとJavaのバックエンドフレームワークについても詳しく解説します。
[バックエンドフレームワークトップ10](https://newwave-solutions.co.jp/top-ten-backend-frameworks/)
Django (Python)
フルスタックフレームワークで、迅速な開発が可能。セキュリティ機能も豊富。
Flask (Python)
軽量なマイクロフレームワーク。シンプルで柔軟性が高く、拡張性に優れる。
Spring Boot (Java)
エンタープライズ向けの強力なフレームワーク。豊富な機能と高いパフォーマンスを提供。
Express.js (Node.js)
Node.jsベースのシンプルで柔軟なフレームワーク。リアルタイムアプリケーションに最適。
Ruby on Rails (Ruby)
コードの記述量を大幅に削減し、迅速なプロトタイピングが可能。コミュニティが活発。
Laravel (PHP)
エレガントなシンタックスを持つフレームワーク。豊富なライブラリとツールが揃っている。
ASP.NET Core (C#)
高性能でスケーラブルなフレームワーク。Microsoft製品との統合が容易。
Koa.js (Node.js)
ミニマルなフレームワーク。ミドルウェアの使用が簡単で、高いパフォーマンスを発揮。
Phoenix (Elixir)
高速かつスケーラブルなフレームワーク。リアルタイムアプリケーションに強い。
Fiber (Go)
軽量で非常に高速なフレームワーク。シンプルなAPIと高いパフォーマンスが特徴。
[Pythonバックエンドフレームワークの特徴](https://newwave-solutions.co.jp/python-backend-framework/)
Pythonは、そのシンプルさと強力なライブラリ群から、多くの開発者に愛されています。以下に、Pythonの代表的なバックエンドフレームワークを紹介します。
Django
利点: フルスタックで包括的な機能を提供。高いセキュリティと迅速な開発が可能。
用途: 大規模なWebアプリケーションやエンタープライズ向けプロジェクト。
Flask
利点: 軽量で柔軟性が高い。カスタマイズが容易で、拡張性に優れる。
用途: 小規模なプロジェクトやマイクロサービス。
FastAPI
利点: 高速なパフォーマンスとモダンな設計。非同期処理が容易。
用途: 高性能なAPI開発。
[Java Webフレームワークの選び方](https://newwave-solutions.co.jp/java-web-frameworks/)
Javaはエンタープライズアプリケーションの開発において広く使用されています。以下に、代表的なJavaのWebフレームワークを紹介します。
Spring Boot
利点: 強力なエコシステムと豊富な機能。高いパフォーマンスとスケーラビリティ。
用途: 大規模なエンタープライズアプリケーション。
JSF (JavaServer Faces)
利点: コンポーネントベースのフレームワーク。再利用可能なUIコンポーネントを提供。
用途: リッチなユーザーインターフェースが必要なアプリケーション。
Vaadin
利点: クライアントサイドのコードを書く必要がない。サーバーサイドでUIを構築。
用途: ビジネスアプリケーションやダッシュボード。
Grails
利点: Groovyベースで、迅速な開発が可能。Springとの統合がスムーズ。
用途: 迅速なプロトタイピングが求められるプロジェクト。
まとめ
バックエンドフレームワークの選択は、プロジェクトの成功に直結します。DjangoやFlaskのようなPythonフレームワークは、シンプルさと柔軟性が魅力です。一方、Spring BootなどのJavaフレームワークは、エンタープライズアプリケーションにおいて強力なツールとなります。それぞれのフレームワークの特性を理解し、プロジェクトのニーズに合ったものを選ぶことが重要です。これにより、効率的でスケーラブルなアプリケーションを構築し、ビジネスの成功を支えることができるでしょう。
WebサイトとWebアプリ：違いと選び方

現代のデジタル時代において、ビジネスや個人プロジェクトの成功には、オンラインプレゼンスが不可欠です。しかし、「Webサイト」と「Webアプリ」という用語が飛び交う中で、その違いを理解し、適切に選ぶことが重要です。本記事では、WebサイトとWebアプリの違いを詳しく説明し、どちらを選ぶべきかについてのガイドを提供します。
[Webサイトとは？](https://newwave-solutions.co.jp/website-vs-web-application/)
Webサイトは、情報提供やマーケティングを目的とした静的なページの集合体です。企業のホームページや個人のブログなどがこれに該当します。一般的に、HTML、CSS、JavaScriptを使用して構築され、主な目的は情報の提供やブランドの認知度向上です。
[Webアプリとは？](https://newwave-solutions.co.jp/website-vs-web-application/)
Webアプリは、ユーザーとのインタラクションを重視した動的なシステムです。例えば、GoogleドキュメントやTwitterのようなプラットフォームはWebアプリの一例です。これらは、サーバーとのデータ通信を頻繁に行い、ユーザーがリアルタイムで操作できる機能を提供します。
違いを理解する
インタラクションレベル:
Webサイト: 主に情報提供。ユーザーはページを閲覧し、内容を消費する。
Webアプリ: ユーザーが操作し、リアルタイムで結果が反映される。
技術スタック:
Webサイト: HTML、CSS、JavaScriptが基本。
Webアプリ: フロントエンドにReact、Angular、バックエンドにNode.js、Pythonなどの高度な技術を使用。
目的:
Webサイト: 情報提供やブランドの認知度向上。
Webアプリ: ユーザーエクスペリエンスの向上や特定のタスクの効率化。
[React Native開発会社の選び方](https://newwave-solutions.co.jp/react-native-development-company/)
React Nativeは、クロスプラットフォームでモバイルアプリを開発するための強力なフレームワークです。ここでは、React Native開発会社を選ぶ際のポイントを紹介します。
実績とポートフォリオ: 開発会社の過去のプロジェクトやクライアントのレビューを確認しましょう。成功事例が豊富な会社は信頼性が高いです。
技術力と専門知識: React Nativeの深い知識と経験を持つエンジニアが在籍しているか確認します。また、最新の技術トレンドに対応できる柔軟性も重要です。
コミュニケーションとコラボレーション: プロジェクトの進行中に円滑なコミュニケーションが取れるかどうかも大切です。開発チームとの定期的なミーティングや透明性のある報告が求められます。
コストと納期: 予算内でプロジェクトを完了できるか、納期を守れるかも重要な要素です。見積もりやスケジュールについて詳細に確認しましょう。
[モバイルアプリデザイン会社の重要性](https://newwave-solutions.co.jp/mobile-app-design-company/)
優れたモバイルアプリは、単に機能するだけでなく、ユーザーエクスペリエンス（UX）を向上させるデザインが求められます。モバイルアプリデザイン会社の選び方についても触れておきます。
ユーザー中心のデザイン: ユーザーのニーズや行動を理解し、それに基づいたデザインを提供できる会社を選びましょう。ユーザビリティテストやプロトタイピングを重視する会社は信頼性が高いです。
クリエイティブなアプローチ: 独自のアイデアやクリエイティブなデザインを提案できるかどうかも重要です。他のアプリとは一線を画すデザインが求められます。
技術との融合: デザインと技術の融合がスムーズであるか確認します。デザインの美しさと機能性を両立させることが大切です。
ポートフォリオの確認: 過去のデザイン事例をチェックし、自分のプロジェクトに合ったスタイルかどうかを見極めましょう。
まとめ
WebサイトとWebアプリの違いを理解し、自分のビジネスやプロジェクトに最適な選択をすることは重要です。また、React Native開発会社やモバイルアプリデザイン会社を選ぶ際には、実績や専門知識、コミュニケーション能力などを重視することが成功の鍵となります。質の高いデザインと技術の融合が、ユーザーにとって魅力的なアプリを生み出す基盤となるでしょう。
このように、正しいパートナーと協力することで、優れたオンラインプレゼンスを築き、デジタル市場での成功を手に入れることができます。
Docker環境をきれいにしたいときに使うコマンド

### 全コンテナ停止
```zsh
docker stop $(docker ps -aq)
```

### 全コンテナ削除
```zsh
docker rm $(docker ps -aq)
```

### 全イメージ削除
```zsh
docker rmi $(docker images -q)
```

### キャッシュ削除
```zsh
docker builder prune
```

### キャッシュ確認
```zsh
docker system df
```
DynamoDB で時系列データの降順スキャン

## 課題

DynamoDB で時系列データを扱うときに参考になる記事は、まず [DynamoDB で時系列データを処理するベストプラクティス](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/bp-time-series.html) ですが、降順にデータを取り出そうとするとパーティションキーを指定する必要があり、クエリ実行にひと手間必要です。

<table>
  <thead>
    <tr>
      <th colspan="2">Primary Key</th>
      <th colspan="3">Attributes</th>
    </tr>
    <tr>
      <th>Partition Key</th>
      <th>Sort Key</th>
      <th>Attr1</th>
      <th>Attr2</th>
      <th>...</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>2024-01-01</td>
      <td>00:00:00.000</td>
      <td>...</td>
      <td>...</td>
      <td>...</td>
    </tr>
    <tr>
      <td>2024-01-01</td>
      <td>00:00:01.000</td>
      <td>...</td>
      <td>...</td>
      <td>...</td>
    </tr>
    <tr>
      <td>2024-01-02</td>
      <td>00:00:00.000</td>
      <td>...</td>
      <td>...</td>
      <td>...</td>
    </tr>
    <tr>
      <td>2024-01-02</td>
      <td>00:00:01.000</td>
      <td>...</td>
      <td>...</td>
      <td>...</td>
    </tr>
    <tr>
      <td>...</td>
      <td>...</td>
      <td>...</td>
      <td>...</td>
      <td>...</td>
    </tr>
  </tbody>
</table>


- 降順ソート可能な **Query はパーティションキーの指定が必要**
- **Scan は降順ソートできない**

ひと手間とは、パーティションキーに現在日を指定し、1日づつ過去日に遡って複数回 Query を実行することです。ちょっと面倒ですね。

## RDBMS だと...

RDBMS だと、以下のような日時とメッセージを持つテーブルに対して

```sql
create table logs (
  partition_key date not null,
  sort_key time not null,
  attribute_1 text
);
```

日時の降順でデータを取り出す SQL は、次のように簡単なんですけどね。

```sql
select * from logs order by parition_key desc, sort_key desc;
```
## 解決策

ではどのように DynamoDB で時系列の降順スキャンを実現するか、１つの解決策を紹介します。

メインの Key Schema か Global Secondary Index で次の 3点を行います。

- **パーティションキーを数字、ソートキーを文字列で定義する**
- **パーティションキーには、日でまるめた負の UnixTime を保存する**
- **ソートキーには UUID V7 の XOR 値を保存する** 

これだけで Scan が降順になります！

### 実行例

| Partition Key（日で丸めた負の UnixTime） | Sort Key （UUID V7 の XOR） |
| - | - | 
| -1704034800 | fe6f5b49-df3a-8ecf-596f-e78e69ad53c2 |
| -1704034800 | fe6f5b49-5c9e-8e33-61fe-813dc262ced2 |
| ... | ... |

### ポイント

UUID V7 はランダム性を備えつつ、作った順にソート可能な識別子です。そのまま使うと昇順になってしまうので一工夫して XOR 演算します。以下 go での UUID の XOR 例です。

```go
package main

import (
	"fmt"
	"github.com/google/uuid"
)

func main() {
	uu := uuid.Must(uuid.NewV7())
	fmt.Printf("Before %s\n", uu.String())
	for i, u := range uu {
		uu[i] = ^u
	}
	fmt.Printf("After  %s\n", uu.String())
}
```

実行結果

```
Before 0190a4cd-d3e7-7222-9f99-fdb74feee752
After  fe6f5b32-2c18-8ddd-6066-0248b01118ad
```
mambaをインストール

**2024-11-02: Mambaforgeはdeprecatedとのことです．Miniforge3に移行します．**

condaの代替で，conda-forgeを対象とした，速いと評判のmambaをMambaforgeからインストールしました．WSL2のUbuntu 22.04，九州大学スパコン玄界，東京大学スパコンWisteria-Oで検証済みです．
最初にMinicondaやAnacondaがインストールされている場合はそれをdeactivateし，`.bashrc`等に関連の追記がある場合は削除（コメントアウト）しておきます．

```bash
cd ~/Downloads
curl -L -O "https://github.com/conda-forge/miniforge/releases/latest/download/Mambaforge-$(uname)-$(uname -m).sh"
bash Mambaforge-$(uname)-$(uname -m).sh
```

質問にはすべてデフォルトで答えました．
以下を **.bashrc** に追記します．
```bash
source "$HOME/mambaforge/etc/profile.d/conda.sh"
source "$HOME/mambaforge/etc/profile.d/mamba.sh"
```
再ログインし，以下のコマンドを実行します．condaの代わりにmambaでも構いません．
```bash
conda activate base
conda update conda
```
あとはcondaで普通に作業ができます．
仮想環境中でcondaをupdateするには以下のようにbaseで実行します．
```bash
conda update -n base -c conda-forge conda
```
ActiveDirectoryでグループへのメンバー追加or削除をコマンドで実行

# 概要

1. システムリリースや動作確認などの特別な作業をする時だけ、特定のグループのメンバーに入る。
1. 作業が終わったらそのグループから抜ける。

ということをやっています。
このメンバー追加or削除は毎度GUIでやっているため、面倒かつ誤操作が怖いです。

コマンドでサクッとやりたい。

# やり方（グループにメンバー追加）

PowerShell。

```powershell:
Add-ADGroupMember -Identity 'グループ名' -Members 'ユーザーID'
```

## グループ名はここの値

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/5d57f336-fd7a-3e0b-09f1-c51b0045a2b8.png)

## ユーザーIDはここの値

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/827bbfef-281c-17eb-a07e-f1b1aab7db02.png)

# やり方（グループからメンバー削除）

PowerShell。
『メンバー追加』は即実行されますが、『メンバー削除』は確認が入ります。
その確認を飛ばして即実行もできます。

```powershell:確認を飛ばさない
Remove-ADGroupMember -Identity 'グループ名' -Members 'ユーザーID'
```

```powershell:確認を飛ばして即実行
Remove-ADGroupMember -Identity 'グループ名' -Members 'ユーザーID' -confirm:$false
```

## メンバー削除時に入る確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/a4f1b89e-122c-c1d6-1c62-73b82bab6d17.png)

# 参考サイトさん

https://qiita.com/kidxcv/items/bbef09cdaddfa1cafa60

https://tooljp.com/language/powershell/html/remove-adcomputer-no-confirm.html
PDF翻訳ツールの紹介

エンジニアとして、勉強するとき外国語のPDFを読むことよくありますね。以下で、よく知られているPDF翻訳ツールを紹介します：
## 1. Google翻訳
Google翻訳は無料ですが、使用中にフォーマットの問題や翻訳の質が低い場合があります。

## 2. Doclingo
これはオンラインとモバイルで利用できる無料のPDF翻訳ツールです。AIによる高精度の翻訳を提供し、PDFをWord形式に変換することもできます。

## 3. DeepL
DeepLは特定の言語の翻訳品質が高いと言われていますが、大量や専門的な翻訳に対しては有料のサービスが必要です。

## 4. ABBYY FineReader
ABBYY FineReaderは強力なOCRソフトウェアで、PDF文書を編集可能なテキスト形式に変換できます。通常は有料で、機能と使用状況に応じたさまざまなライセンスオプションがあります。

## 5. SDL Trados Studio
SDL Trados Studioは翻訳業界の専門家向けのプロフェッショナルな翻訳ツールです。これも有料で、ライセンスの種類や機能に応じて価格が異なります。

## 6. Babylon
Babylonはオンラインとデスクトップの辞書サービスを提供するソフトウェアで、特定の機能には有料のサブスクリプションが必要な場合があります。

　自分の状況に合わせて、一番いいツールを選びましょう。