OmniAICreator/Qiita-1.07M huggingface dataset:
# Fortifyの魅力を紹介！

皆さんこんにちは。Fortifyサポートでもあり、とあるYoutuberモデレーターでもある者です「誰だよ定期」

さて、今回この記事では、荒らし対策BOT「Fortify」の魅力を開発者との連絡内容も交えて紹介していきます！

## 1.危険ユーザー検知機能付きの認証パネル
このBOTの機能の一つとして、危険ユーザー検知機能が搭載された認証パネルを提供しております
危険ユーザーとは、荒らしと呼ばれる人を主にした、関わるのは控えたほうが良いユーザーのことを指します

実際に作ってみるとこんな感じです！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3918325/f90a61bd-f224-7bcf-2af1-591fdf7def42.png)

一見普通の認証ですが、実際にはチェックマークを押すと、危険ではないかを判別するそうです。
普通の方は、このようになんともなく認証ができ、DMで結果が表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3918325/373dd41e-6036-f260-90aa-77aabb1da4ed.png)

しかし、危険ユーザーに登録されている方は、このようなDMが来て、認証できません「過去記事引用」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3918325/012338fa-7cd7-f05f-b1d4-f41bc1b9d85a.png)

実際どうやって収集してるかといいますと、AIみたいなのを作って、危険ユーザーをどんどん判別し、サーバーに送信され、登録されるそうです「色々凄くてなにがなんだかワカンナイ()」
まぁ要するにいろいろあってすごい機能が作れちゃうんですね★

あとはメッセージの部分に文字をいれるとより良くなりそうですね！「今回で言う｛こんなかんじになります｝」

なお、現在もあたらしい機能の開発もしております。ぜひ導入してみてください！

今回使ったコマンド:/verifier


#導入はここをクリック！
↓
[BOT導入!!!!](https://discord.com/oauth2/authorize?client_id=1240964440581603370&permissions=8&scope=bot+applications.commands)

もし困り事や、サポートが必要な方は、こちらにお入りください！
[サポートサーバーに参加](https://discord.gg/BVCgtC5AnK)
matplot.lib　メモ

＜.xticks(yticks)＞
(tickは目盛りのことかな、TickTackチクタクってこと？)

目盛り(軸)を打つところをリスト形式[]で渡してる
→range()を使えば、stepを考慮したリストが作成可！
→np.arange()使えば、floatも扱える！

.xlim(ylim)を使えば、目盛りとは別で軸の最小値・最大値を指定可！
組み合わせて使おう


＜.tick_params＞
目盛りのパラメーター設定
以下使ったオプション
axis：軸を指定(both,x,y)(str)
length：長さ指定(float)(０にすることで目盛りをなくせる！)
direction：向き指定(in,out,inout)(str)
 https://pygraph.helve-blog.com/matplotlib-conf/tick-config
paizaコードモンスター大図鑑で週間ランキング1位を獲る攻略法

# 1.はじめに
どうも最強Pythonistaのたちゅみです。
![スクリーンショット 2025-01-11 093348.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3983698/500cf985-4fd3-ff8c-5b79-4ef64f7ee159.png)

![スクリーンショット 2025-01-11 104432.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3983698/281b462d-44fb-ad2c-8cbd-299492111727.png)
お正月休み明け体調を崩しまして、病み上がりのウォーミングアップとしてこのゲームで遊びました。そしたら週間ランキング1位を獲ることができ、せっかくなので記事に残そうと思った限りです。

# 2.コードモンスター大図鑑とは
![スクリーンショット 2025-01-12 114119.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3983698/539fc6f7-d659-c0ac-8456-3fc6c97b2c2f.png)
https://paiza.jp/code_monster

ゲーム感覚でプログラミングが学べるpaizaのサービスです。
現在9種類の言語が選択でき、選択した言語に応じた問題を解いていく形式となっています。
本ゲームで出題される内容は
・基本的な構文
・四則演算
・if文、条件式
・for文
・find、rstrip、など文字列に関する関数
が主でした。（Python3の場合）
そのため、ゲーム難易度自体はさほど高くなく初心者向けです。

# 3.ハイスコアを獲るための攻略法
結論ですが
**最終ステージで迅速に全問正解とれれば誰でも獲ることができます。**
具体的には以下のとおりです。

## 最終ステージまで進める
本ゲームは、全部で17ステージあります。
![スクリーンショット 2025-01-12 120048.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3983698/1d8483df-d32a-7780-f60e-4704c7116f35.png)
ステージ17が一番高いスコアを出すことができるため、まずはステージを進めることに専念しましょう。

## リーダースキル「スコアUP」を持つモンスターをリーダーに設定する
本ゲームは、他のブラウザゲームでよくあるモンスターをゲットし、パーティを組むことができます。モンスターにはリーダースキルを所持しているものがいて、その中で「スコアUP」のスキルがあります。それをリーダーに設定しましょう。
![スクリーンショット 2025-01-12 120220.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3983698/a34a6eac-aadb-1ad8-8b48-f18a7b050a42.png)

また、リーダースキルには他にも種類がありますが、「スコアUP」以外で私が使ったのは「経験値UP」だけです。
![スクリーンショット 2025-01-12 120410.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3983698/a090fb64-032d-8e2e-1fd7-b8717fb8d995.png)
本ゲームはスタミナ性であるため、レベルアップでスタミナが回復します。最終ステージに辿り着くまでスタミナ効率をよくするために採用しました。

## 問題は素早く正確に回答する
解答時間、正解率はスコアに反映されます。そのため、正確かつ迅速に回答することでハイスコアを狙えます。
また、出題にはパターンがあります。何回か解いていくと早く回答できるようになりますので、あきらめずに頑張りましょう。

## アイテムの活用
ゲーム開始前に使用するアイテムを選択することができます。
![スクリーンショット 2025-01-12 190510.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3983698/684446cd-3501-c651-4875-a69fdb04653e.png)
最終ステージでは「スコアアップ」を使用してハイスコアを狙いましょう。

# 4.おすすめモンスター

### Perl![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3983698/7a6e4636-fa89-4dcb-7085-65ee19f7e0db.png)
リーダースキル…スコア10%UP
排出ガチャ…言語の妖精コドモンガチャ
本ゲームにおいて一番高いスコアUP率を持っています。
ハイスコアを狙う際に必須のモンスターであるため、必ずゲットしましょう。



### 妲己![スクリーンショット 2025-01-12 121638.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3983698/2f91b5cb-c20d-2ba8-281a-52da7d0ae323.png)
リーダースキル…経験値10%UP
排出ガチャ…paizaランクD以上限定世界の美女ガチャ
本ゲームにおいて一番高い経験値UP率を持っています。
最終ステージまでの道中リーダーに設定することでスタミナ効率よく進めることができます。
※このモンスターが排出されるガチャは、paizaランクD以上でないと引くことができません。


# 5.おわりに
初心者向けの内容であるため、病み上がりのウォーミングアップにはちょうど良かったです。ただ、以下の不満があったので改善されればなぁ、と思った限りです。
・パーティ設定時の操作性の悪さ
・リーダー以外のモンスターがガチャでしか活きない

# 6.ちなみに
最終ステージをクリアすることで「パイザキャット」がゲットできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3983698/91da87a6-8361-1bc8-b04d-1b3f49b0851d.png)
本ゲームではコインという概念があり、それで引けるガチャがあります。
ガチャモンスターをコンプするために本モンスターは良いかもしれません。
（私は使用したことがありません）
intellijで日本語テストメソッドが文字化けしてた時の対処法

# 症状

画像のようにメソッド名を日本語にしたメソッドを実行した時に、メソッド名が文字化けしてしまっていた

![スクリーンショット 2025-01-12 191247.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3077686/57af0a4b-9c20-c278-66ff-5f1cc62d19f7.png)

# 解決策

[Ctrl] + [Alt] + [s] → [Editor] → [File Encodings]の設定をShiftJISに変更した

![スクリーンショット 2025-01-12 191521.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3077686/3c060ff4-f3a2-cdcf-ce10-9187b73b7375.png)

# 参考サイト

https://35programming.com/intellij-idea-console-garbled
Ubuntuで異なるバージョンのPythonをインストールする

# Ubuntu22.04/24.04 で異なるバージョンのPythonをインストールする

## 概要
Pythonを使って開発をしている時に複数のバージョンを切り替えながら使用することはよくあると思います。今回はUbuntu 22.04、24.04 環境に別バージョンのPythonをインストールする手順についてまとめてみました。

## Ubuntuに標準インストールされているPythonバージョン
Ubuntu 22.04と24.04で追加のリポジトリ設定なしでインストール可能なPythonバージョンは下記の通りです。

| Pythonバージョン | Ubuntu 22.04 | Ubuntu 24.04 |
|-----------------|--------------|--------------|
| Python 3.9      | × | × |
| Python 3.10     | ○ | × |
| Python 3.11     | × | × |
| Python 3.12     | × | ○ |

注意点：
- Ubuntu 22.04ではPython 3.10がデフォルトでプリインストール
- Ubuntu 24.04ではPython 3.12がデフォルトでプリインストール
- その他のバージョンをインストールする場合は、Deadsnakes PPAの追加が必要

## 共通するPPAの設定

標準インストールされていないバージョンをインストールしたい場合、PPAを使用してインストールする必要があります。下記コマンドを使用してPPA設定を実施します。

```
sudo apt update
sudo apt upgrade -y
sudo apt install software-properties-common
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt update
```

## Ubuntu 22.04/24.04環境にPythonをインストールする

### Python 3.9 (Ubuntu 22.04/24.04環境共通)

下記コマンドを使用してインストールします。

```
sudo apt install python3.9
```

必要に応じて下記も設定します。

```
python3.9-venv python3.9-dev python3.9-distutils
```

### Python 3.10 (Ubuntu 24.04環境のみ)

下記コマンドを使用してインストールします。

```
sudo apt install python3.10
```

必要に応じて下記も設定します。

```
python3.10-venv python3.10-dev python3.10-distutils
```

### Python 3.11 (Ubuntu 22.04/24.04環境共通)

下記コマンドを使用してインストールします。

```
sudo apt install python3.11
```

必要に応じて下記も設定します。

```
python3.11-venv python3.11-dev python3.11-distutils
```

### Python 3.12 (Ubuntu 22.04環境のみ)

下記コマンドを使用してインストールします。

```
sudo apt install python3.12
```

必要に応じて下記も設定します。

```
python3.12-venv python3.12-dev python3.12-distutils
```

## まとめ

標準でインストールされているバージョンがわからなかったので、調べるついでに設定方法をまとめてみました。開発環境でいろいろなバージョンを切り替えて使用することがあると思いますので、どなたかの参考に立てれば幸いです。
Tableau Cloudでフローをスケジュール実行しようとしてできなかった話

# Tableau Cloudでのフロー管理に関する問題解決記録

## 問題の発生状況

Tableau Cloudでフローのスケジュール実行を設定しようとしたところ、スケジュール設定が選択できない状態になっていました。別環境では正常に設定できることから、環境による違いがあることが判明し,調査しました。

![売上実績FL画面.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/975576/156324bc-4ce5-4715-0aa2-448b3e989c44.png)
![東芝テリーFL画面.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/975576/5e787bef-a5ee-1326-217f-d6ab287a6e74.png)


## 原因の特定

調査の結果、この問題の原因は**Tableau Prep Conductor**というライセンスが必要であることが分かりました。

## データ管理とTableau Prep Conductor

### データ管理の構成要素
データ管理には以下の機能が含まれています：

- Tableau Catalog
- Tableau Prep Conductor
- 仮想接続
- データポリシー

これらの機能は、Tableau Enterpriseを購入することで利用可能になります。

### ライセンスと展開について
データ管理は、ライセンスを認証されたTableau Server展開でのみ有効化が可能です。展開には以下が含まれます：

- ライセンスされている本番環境のTableau Serverインストール
- 本番環境インストールをサポートする非本番環境のTableau Serverインストール

### Tableau Prep Conductorの主な機能と特徴

#### 基本機能
Tableau Prep Conductorを使用することで、以下が可能になります：

- Tableau Serverのスケジュール調整機能の活用
- フローの自動実行
- フロー出力の自動更新
- 追跡機能の活用

#### ライセンス状態による機能の可用性

**データ管理がアクティブな場合：**
- フローのスケジュール設定が可能
- フローの監視が可能
- REST APIを使用したフロー実行が可能

**データ管理が非アクティブな場合：**
- フローのスケジュール機能が無効
- ただし、Tableau Server/Cloudのライセンスが有効であれば、REST APIを使用したフローのダウンロードは可能

### 重要な注意点
バージョン2020.4以降、以下の機能を使用する場合にはデータ管理ライセンスが必要です：

- スケジュールに従ったフローの実行
- REST APIを使用したフローの実行

ただし、以下の操作にはデータ管理ライセンスは不要です：

- Web上での手動フロー実行
- Creatorとしてのサーバー上でのフロー作成・編集

## まとめ

Tableau Cloudでフローのスケジュール実行を行うためには、Tableau Prep Conductorライセンスが必須です。この機能を利用するためには：

1. Tableau Enterpriseの購入
2. データ管理ライセンスの有効化
3. Tableau Prep Conductorの設定

まさかライセンス原因でできない事があることを知り、焦った話でした。
【terraform import】「Error 409: Your previous request to create the named bucket succeeded and you already own it., conflict」となる場合の対処法

# エラー内容

既にGUIやgcloudコマンドなどで作成済みのリソースをTerraformで作成しようとした際にコンフリクトが起きて、terraform applyがエラーになります。

以下がtfstateを配置するバケットを定義した状態でapplyしようとした例です。

```bash
Error: googleapi: Error 409: Your previous request to create the named bucket succeeded and you already own it., conflict
│
│   with google_storage_bucket.store_of_tfstate,
│   on gcs.tf line 1, in resource "google_storage_bucket" "store_of_tfstate":
│    1: resource "google_storage_bucket" "store_of_tfstate" {
│
```

# 対処方法

`terraform import`コマンドを使用して対象のリソースをTerraform管理に取り込みます。

```bash
$ terraform import google_storage_bucket.store_of_tfstate your-bucket

google_storage_bucket.store_of_tfstate: Importing from ID "your-bucket"...
google_storage_bucket.store_of_tfstate: Import prepared!
  Prepared google_storage_bucket for import
google_storage_bucket.store_of_tfstate: Refreshing state... [id=your-bucket]

Import successful!

The resources that were imported are shown above. These resources are now in
your Terraform state and will henceforth be managed by Terraform.
```

再度applyすると成功します。

```bash
$ terraform applly
Apply complete! Resources: 0 added, 1 changed, 0 destroyed.
```
Visual Studio 2022 設定備忘録

忘れないうちに、何時でも再環境構築できるよう、
私のVisual Studio 2022の環境設定をメモします。

まだ少ない感じですが、使っているうちに拡張機能が増えていきそうです。


## エディターに使用するフォント
PlemolJP35 Console
https://github.com/yuru7/PlemolJP

## テーマ
Noctis (vscode porting) の Noctis Lilac

## 拡張機能
### ClaudiaIDE
IDEに背景画像を設定できます。
IDE全体に設定したり、エディター部分のみ設定したり、
画像をストレッチさせたりなどの設定もできます。

オプションにClaudiaIDEの項目が増えているのでそこから設定できます。

個人的に外観はモチベーション維持に大切！

### File Icons
いくつか表示されるアイコン画像が増えます。

### Color Preview
名前の通りです。

むらさき色のビジュアルが完成。満足。

![VSみため.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3976537/8f6249c2-9a45-c2dd-717e-16d6e65b00f5.jpeg)
Ollamaで使用可能なembeddingモデルの比較　

# 埋め込み検証
対象データ：
60件ほどセキュリティや、CTF、Pythonライブラリ等の参考資料が入っています。


クエリ：
- Nmapの代わりに使用可能なツール
- X86　アラインメントについて

評価：ほしい情報に対して
０論外
１全く出てこない
２クエリどちらか一つは上位３件に含まれる。
３クエリどちらかは１件目に出力
４最高

# 結果
```
mxbai-embed-large　      ２（３）    670MB
nomic-embed-text　       ２         274MB
snowflake-arctic-embed　 エラー      669MB
all-minilm　             １（０）     46MB
bge-m3　                 １　　　　　1.2GB
bge-large　              エラー　    671MB
paraphrase-multilingual　３          563MB
snowflake-arctic-embed2　１（０）    1.2GB
granite-embedding        エラー       63MB

２(１)だとしたら、2寄りの１つまり１．５くらい
```
以下の記事でもparaphrase-multilingualの性能が良いらしいです。
https://www.jiang.jp/posts/20230601_embedding_benchmark/
0	OpenAIEmbeddings	0.684147	0.548009	0.868852
1	TensorflowHubEmbeddings	0.560619	0.407494	0.761124
2	paraphrase-multilingual-mpnet-base-v2	0.525899	0.398126	0.676815
3	oshizo/sbert-jsnli-luke-japanese-base-lite	0.520106	0.405152	0.655738
4	paraphrase-multilingual-MiniLM-L12-v2	0.497027	0.370023	0.639344
5	intfloat/multilingual-e5-base	0.481144	0.337237	0.632319
6	sonoisa/sentence-bert-base-ja-mean-tokens-v2	0.465294	0.327869	0.622951
7	setu4993/smaller-LaBSE	0.450434	0.290398	0.632319
8	sonoisa/sentence-bert-base-ja-en-mean-tokens	0.438923	0.304450	0.599532
9	setu4993/LaBSE	0.434725	0.274005	0.625293
10	Blaxzter/LaBSE-sentence-embeddings	0.434725	0.274005	0.625293
11	distiluse-base-multilingual-cased-v2	0.428484	0.264637	0.620609
12	ZurichNLP/unsup-simcse-xlm-roberta-base	0.419397	0.299766	0.526932
13	sentence-transformers/stsb-xlm-r-multilingual	0.361811	0.231850	0.484778
14	sonoisa/clip-vit-b-32-japanese-v1	0.320160	0.203747	0.437939
15	sonoisa/sentence-bert-base-ja-mean-tokens	0.293779	0.177986	0.402810
16	google/canine-s	0.270446	0.159251	0.358314
17	google/canine-c	0.258978	0.159251	0.341920
18	colorfulscoop/sbert-base-ja	0.227531	0.133489	0.295082
19	sonoisa/t5-base-japanese	0.213053	0.135831	0.278689
20	M-CLIP/M-BERT-Distil-40	0.170714	0.084309	0.236534
21	microsoft/unihanlm-base	0.162957	0.098361	0.187354
22	nielsr/lilt-xlm-roberta-base	0.143722	0.074941	0.173302
23	severinsimmler/xlm-roberta-longformer-base-16384	0.129116	0.072600	0.145199
24	facebook/nllb-moe-54b	0.000000	0.000000	0.000000
25	sonoisa/sentence-luke-japanese-base-lite	0.000000	0.000000	0.000000
26	TylorShine/distilhubert-ft-japanese-50k	0.000000	0.000000	0.000000
27	rinna/japanese-hubert-base	0.000000	0.000000	0.000000
28	ArthurZ/nllb-moe-128	0.000000	0.000000	0.000000
29	pkshatech/simcse-ja-bert-base-clcmlp	0.000000	0.000000	0.000000
30	paulhindemith/fasttext-jp-embedding	0.000000	0.000000	0.000000
31	rinna/japanese-cloob-vit-b-16	0.000000	0.000000	0.000000
32	rinna/japanese-clip-vit-b-16	0.000000	0.000000	0.000000
33	sonoisa/sentence-t5-base-ja-mean-tokens	0.000000	0.000000	0.000000
34	megagonlabs/transformers-ud-japanese-electra-b...
# まとめ

精度はモデルの大きさによらないことが判明しました。
WSLをクイックアクセスにピン止めしたら削除できなくなった

## WSLをクイックアクセスにピン止め

パソコンを新調したので\\wsl$で表示されるUbuntuをクイックアクセスにピン止めした。
(普通のエンジニアはしないのかもしれない)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238634/52307b97-9b6a-0a7a-1a8a-3ac4c00ee5e4.png)

アクセスしようとすると下記のようにエラーとなった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238634/308e93cf-9b8f-af58-8aca-f8fbcd5694c2.png)

ひとまず削除しようにも通常出るはずの削除ボタンが出てこず削除ができない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238634/d5305d33-825e-ecc8-c90f-6b0c29b6fa8e.png)

## 対応方法

タスクバーでエクスプローラーを右クリックしたときに出てくるピン止め解除ボタンで解除できた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238634/773e806c-fe25-d9ee-2af2-57d47d67d40b.png)

### もやもや

以前は普通にこの方法でWSLにアクセスできていた気がするのだが何故？

### 解決

下記アドレスの場合、無事にクイックアクセスにピン止めできた
\\wsl.localhost\Ubuntu-22.04\home

wslとwsl.localhostの違い下記の違いがあるらしいが、これだけなら今回の問題は起きなさそう。
原因は謎のまま

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238634/4dd30683-db83-735f-88df-e8bca55976ea.png)
jsの単項演算子（Unary Operators）とは？

jsでfor文を書いていると以下のような書き方になることが多い。

``` js
let arr = [1, 2, 3];
for (let i = 0; i < arr.length; i++) {
  arr[i] = arr[i++];  // ESLint : Disallow the unary operators ++ and --
}
```

そうすると、ESLintから使うなと警告される。
えーダメなのかと思って`i += 1`に直す作業をするだけでなんで使っちゃダメなのかについて深く考えたことがなかった。

ESLintの警告について読んでいたら`Unary Operators`(単項演算子)が原因だったので調べてみた。

https://eslint.org/docs/latest/rules/no-plusplus

## 単項演算子とは？
単項演算子は一つの値に対して操作を行う演算子で、二項演算子（例：a + b）と異なり、一つの値に対してのみ作用する。

## 使い方
### インクリメント/デクリメント演算子
`++`と`--`は一般的な使い方のように+1や-1の動きをする。
また、前におくか、後ろにおくかで結果が異なる。

``` js
let x = 5;
let y = ++x;  // xを増加させてから代入: x = 6, y = 6
```

``` js
let x = 5;
let y = x++;  // 現在のxを代入してから増加: x = 6, y = 5
```

### 単項プラス/マイナス
直感的な動きをしてくれる。
``` js
let num = 5;
+num;    // 変更なし
-num;    // -5
```

`string`を`number`に変換する使い方もできる
``` js
+"42";   // 42（number）
-"42";   // -42（number）
```

以下のようにオブジェクトを数値に変えることもできる
``` js
+new Date() // 1736674507547
+!!{} // 1
```

### 論理NOT演算子
これもjsでよく使われているもので、!!を2つつけて値が存在するかを確認する用途もある。
``` js
let flag = true;
!flag;    // false
!!flag;   // true
```

## 演算の順番
同じ+でも実行される順番が異なるため、順番には気を付ける必要がある。
単項の+より二項の+が後に実行されるため、コードがすぐ判断できないこともある
その紛らわしさがESLintでも警告を出す一因となっているでしょう。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Operator_precedence

## おわりに
js紛らわしい...
スライディング・ウインドウ

## スライディング・ウインドウプロトコルの持つ順序番号
>出力フレームは`0からある最大値までの順序番号`を持っている。`最大値は通常nビットのフィールドにちょうど収まるように2^n - 1`となっている。逐次確認スライディング・ウインドウ・プロトコルはn=1を用いており、順序番号を０と１だけに制限しているが、より高度なバージョンでは任意のnを用いることができる。

## 送信者、受信者それぞれで順序番号の集団を管理している
>スライディング・ウインドウ・プロトコルで最も重要な点は、`送信者が送信を許可されているフレームに対応する順序番号を集合を、どの時点においても管理`していることである。これらのフレームは送信ウインドウ(sending window)の中にあると言われている。同様に、`受信者は受信を許可したフレームの集合に対応する受信ウインドウ(receiving window)`を管理している。

## 送信・受信ウインドウの大きさ
>送信者と受信者の各ウインドウは、`同一の下限および上限を持つ必要`はなく、同じ大きさである必要さえもない。いくつかのプロトコルでは大きさは固定であるが、他のものでは、`フレームが送受信されるのに応じて時間と共に伸びたり縮んだり`する。

## ネットワーク層から届いたパケットに順序番号を割り振り、送ったパケットの確認通知がくれば閉じる
>送信者のウインドウ中の順序番号は、すでに送信されたかまたは送信された可能性があり、まだ`確認通知されていないフレーム`を表す。`新しいパケットがネットワーク層から届くたびに、次に大きな順序番号が与えられ、ウインドウの上の端が一つ進められてる`。`確認通知が来ると、下の端が一つ進められる`。このようにして、ウインドウは常に未確認のフレームのリストを保持する

>送信側のデータ・リンク層はバッファが空くまでネットワーク層を強制的に遮断しなければならない。

## 受信側は順序番号と対応したフレームしか受け付けない
>受信側のデータ・リンク層のウインドウは、受理してよいフレームに対応している。この`ウインドウの中に位置するフレームは、受信側のバッファに入れられる`。`ウインドウの下の端と順序番号の同じフレームが受信されると、ネットワーク層に渡されて、ウインドウは１だけ回転される`。ウインドウの外に位置するフレームは捨てられる。これら全ての場合に確認通知が生成されて送信側にどのように進めたら良いかわかるようにする。

## データリンク層はウインドウ幅が大きいと順序通りに供給できないがネットワーク層はできる
>ウインドウ幅が１ならばデータ・リンク層はフレームを順序通りにしか受け付けないが、より大きなウインドウに対してはそうではないことに注意が必要である。これに対してネットワーク層には、データ・リンク層のウインドウ幅にかかわらず、常にデータを正しい順序で供給する。

https://bookplus.nikkei.com/atcl/catalog/23/03/16/00728/
[備忘録] Rasberry PiでWebからWindowsをWOLできるようにする

# この記事の内容
- WindowsのWOL(Wake on Lan)をしたい人のための記事です
- ラズパイを用いますが，ラズパイ自体をWOLするものではありません
- WOLするWindows機は物理マシンです

# あらすじ
- 自宅（下宿）のデスクトップWindowsを，リモートデスクトップで使う時以外はスリープしておきたい
- Wake on Lanという仕組みがあるが，それをCLIではなくブラウザとかからボタン押すだけで実現したい
- ちょうどサービスはあったので，それを運用するためのセッティングがすこーし必要
- ラズパイをいじった後などに設定するたび忘れているので，備忘録を残しておく

# 使用するもの
- tailscale（WebコンソールへのアクセルをVPNで行う）
- macoshitaさんの[wakeonlan-server](https://github.com/macoshita/wakeonlan-server) を使わせていただくことにした（参考:https://atooshi-note.com/raspi-wol/)

# セッティング
### tailscaleの導入
既に導入済み．ちなみに導入方法はDocumentや他サイトにわかりやすくまとめられているのでそちらを参照すれば良い．（参考：https://zenn.dev/xin9le/articles/98c82f4998e22f)

### Wakeonlan-serverの設定
基本的には，READMEに従って設定をすれば良い．ただし，requirements.txtで指定されているuWSGIのバージョンが古く，エラーが出るので2.0.27に変更する．
```requirements.txt
click==8.0.1
Flask==2.0.1
itsdangerous==2.0.1
Jinja2==3.0.1
MarkupSafe==2.0.1
uWSGI==2.0.28 <-ここを変更
wakeonlan==2.0.1
Werkzeug==2.0.1
```

以下に，nginxの設定例を示す．
```wakeonlan-server.setting
server {
    listen 80 default_server;

    location / {
        include uwsgi_params;
        uwsgi_pass unix:/home/pi/wakeonlan-server/wol.sock;
    }
}
```
よくあるエラーとしては，sockにアクセス権限がなく，bad gatewayになることがあるので，権限は`chmod`などで変更しておく．

あとは，[参考サイト](https://atooshi-note.com/raspi-wol/)にあるように，受け取ったMACアドレスが内部でおかしなことになりエラーとなるので，Windows機のMACアドレスを確認して`wol.py`の'addr`に直書きすることで対処した．これは落とし穴だが，Windowsの設定で確認できるMACアドレスはハイフン区切りだが，サーバーで処理するMACアドレスはコロン区切りでなければならない．

最後に，サービスを自動起動させるようにするため，`systemctl enable wakeonlan-server`を実行しておく．

# まとめ
これでhttp://[TailscaleのIP]/wolにアクセスすれば，マジックパケットを飛ばせるようになった．
ollama on FreeBSD

# FreeBSD一本槍おじさんもついにLLMをやってみる
以下、ubuntu デスクトップでちょこっと遊んでいたのをFreeBSDサーバに。

* ubuntuではかんたんに動いたので、行けるんではないかと錯覚する。（使ってるGPUは古すぎて実用性が低い）
* インストールはかんたんすぎるので拍子抜けしている。
* 手持ちのサーバでは、GPUはないが、40coreのがあるから、もしかしたらそんなのでも行けるのか・・・？
* 結論：入ったけど動かない（ pkg ollamaは、GPUドライバ必須か？）
<pre>
$ sudo pkg install misc/ollama

</pre>

# ubuntu 版と違うところ
* 入れただけでは、server は動かない = モデルとかコンテナ単位で管理してるので、そこから serve すれば　CONSOLEに処理が・・・
* console それは ほぼ docker だった（
そもそも文化的に苦手なのはそれ
）

### (挿してないんで）GPU が必要なモデルは動かない 
基本的にLLMをオンプレミスでやるんならサーバでもGPUのほうが良い。

#### aya-expanse ❌　
<pre>
Terminating due to uncaught exception 0x1feb8ac45780 of type vk::IncompatibleDriverError
time=2025-01-12T17:09:05.539+09:00 level=ERROR source=sched.go:451 msg="error loading llama server" error="llama runner process has terminated: error loading model: vk::createInstance: ErrorIncompatibleDriver"
</pre>
##### phi3 を試す ❌
<pre>
ollama run phi3
pulling manifest 
pulling 633fc5be925f... 100% ▕████████████████▏ 2.2 GB                         
pulling fa8235e5b48f... 100% ▕████████████████▏ 1.1 KB                         
pulling 542b217f179c... 100% ▕████████████████▏  148 B                         
pulling 8dde1baf1db0... 100% ▕████████████████▏   78 B                         
pulling 23291dc44752... 100% ▕████████████████▏  483 B                         
verifying sha256 digest 
writing manifest 
removing any unused layers 
success 
Error: llama runner process has terminated: error loading model: vk::createInstance: ErrorIncompatibleDriver
</pre>
結論：GPU前提のモデルが普通なので、良く探す。またはサーバにGPUを積む。

## gpuつかわんモデルを探す。
→ google様に伺う： https://ollama.com/steamdj/llama3.1-cpu-only
性能出るかわからんけど入れてみんとす。

<pre>
Error: llama runner process has terminated: error loading model: vk::createInstance: ErrorIncompatibleDriver
</pre>

* IncomatibleDriver というのが問題か？
→ FreeBSD-Jail でやっているので物理的なドライバが何もあたってない可能性・・
* ちなみに16Gメモリのサーバでやってみたところ： 
<pre>
Error: model requires more system memory (4.7 GiB) than is available (2.5 GiB)
</pre>
メモリ足らないので門前払いされます。 

## 物理サーバ直下でやってみる（これで駄目なら今回のテストは終わり）
* ドライバが駄目なのも変わらず
* ollama はそもそも物理ドライバの条件、CUDAありきに見受けられるので、後でllama-cpp をやってみる　→ https://qiita.com/strnh/items/088515ac98aa4872f2e6 ことにする。


## まとめ
* ollamaは基本手軽だが、FreeBSDでは面倒くさいことになりそうなので、一般人は、ubuntuサーバでやろう。
* 実用を考えるなら 大枚を積んでGPUを買うか、クラウドに行けば幸せになれると思う。
SupabaseからTypeScriptの型生成

## はじめに
この記事ではSupabaseにデータベースを作成した後、Supabase CLIを使って型定義ファイルを生成し、それをプロジェクトに統合する方法を説明します。

### 参考
https://supabase.com/docs/reference/javascript/typescript-support

## Supabase へのログインと初期設定
まず、Supabaseにログインして初期化します
### ログイン
Supabaseにログインします。
``` 
supabase login
```
ブラウザが開き、認証を求められます。
### プロジェクトの初期化
Supabaseプロジェクトを初期化します
```
supabase init
```

## 型定義ファイルの生成
以下のコマンドを使用して、ファイルを生成します。
```
supabase gen types typescript --project-id your_project_id > database.types.ts
```
`database.types.ts`が生成されます
### 生成されたファイルの例
```ts: ./database.types.ts
export type Json = string | number | boolean | null | { [key: string]: Json | undefined } | Json[]

export interface Database {
  public: {
    Tables: {
      movies: {
        Row: {               
          id: number
          name: string
          data: Json | null
        }
        Insert: {            
          id?: never         
          name: string 
          data?: Json | null
        }
        Update: {            
          id?: never
          name?: string     
          data?: Json | null
        }
      }
    }
  }
}
```

## createClienの使用
生成した型を使用して以下のようにcreateClient関数に型を適用します。
```tsx: ./index.tsx
import { createClient } from '@supabase/supabase-js'
import { Database } from './database.types'

const supabase = createClient<Database>(
  process.env.SUPABASE_URL,
  process.env.SUPABASE_ANON_KEY
)
```

### データの取得例
`movies`テーブルからデータを取得する場合、以下のように書きます。
```tsx: ./index.tsx
import { createClient } from '@supabase/supabase-js'
import { Database } from './database.types'

const supabase = createClient<Database>(
  process.env.SUPABASE_URL,
  process.env.SUPABASE_ANON_KEY
)

type Movie = Database['public']['Tables']['movies']['Row'];

// dataが型付けされる
const { data, error } = await supabase.from('movies').select('*');
```
Go言語(プログラミング)入門メモ⑥

## エラーハンドリングとは
プログラムにエラーが発生したときの処理をエラーハンドリングという。このときにエラーの内容を表示させて原因をわかりやすくさせるなど、エラーハンドリングは重要な意味を持つ。

## エラーハンドリングの実施
エラーが発生したとき、どのように処理をするか。例えば、コードを書いたファイルをos.Openで読み込んだファイルの内容を変数file、エラーの内容をerrに入れる。エラーがある場合(変数errがnilではない場合)は、log.Fatallnで「Error!」と表示させる。
※nilとは？
他のプログラミング言語におけるnullやNoneと同じ概念。nilは値が存在しないことを示すために使用される。
~~~
func main() {
    file, err := os.Open("./lesson.go")  //ファイルを開く
    if err != nil{              //ファイルを開いたときのエラーハンドリング
        log.Fatallm("Error!") 
    }
    defer file.Close() 　　　　　　//エラーがなければファイルを最後に閉じる
}
~~~
os.Open関数は戻り値としてfileとerrの二つの戻り値を返す。

次にデータを書き込むためのbyte型スライスを作成し、変数dataに入れる。なお、byte型のスライスは、バイト配列と呼ばれることもよくある。
~~~
data := make([]byte,100) //バイト配列の作成
~~~
次にReadメソッドでファイルの内容を変数dataに読み込む。ここでも同様にエラーがnilでなければlog.Fatallnで「Error」を出力して処理を終了する。
Readメソッドの返り値として、読み込んだbyte数を変数countにエラーの内容を変数errに入れる。ここでサイドエラーハンドリングをする。
~~~
count, err := file.Read(data)
if err != nil {
    log.Fatalln("Error!")
}
~~~
最後に、変数countの値とstring型でcastした変数dataを表示する。実行すると100byte分読み込まれたコードが表示される。実行結果の最初の「100」は
100byte分が読み込まれたという意味。

~~~
import(
    "fmt"
    "os"
    "log"
)


func main() {
    file, err := os.Open("./lesson.go")  //ファイルを開く
    if err != nil{              //ファイルを開いたときのエラーハンドリング
        log.Fatalln("Error!") 
    }
    defer file.Close() 　
    data := make([]byte,100)
    count, err := file.Read(data)
    if err != nil {
    log.Fatalln("Error!")
    }
    fmt.Println(count, string(data))
}

//以下のように出力される
100 package main    (byte数(100)が表示されたあと、ファイルの中身が表示される)
import(
    "fmt"
    "os"
    "log"
)

func main() {
    file, err := os.Open("./lesson.go")  //ファイルを開く
    if
    ↑ここまで出力範囲
~~~
※ほかのプログラミング言語では、エラーハンドリングをtry catchなどの方法で行うが、Go言語ではコードがエラーを返したとにエラーハンドリングを行う。そのため、エラーハンドリングのコードが複数になる。
また、エラーを返すパターンではどうなるかを確かめるために、ディレクトリを移動するos.Chdir関数の引数に存在しないディレクトリである「"test"」を指定する。この返り値を変数errに代入し、エラーがある場合はlog.Fatallnでコードを終了する


以下のコードをこれまで作成したものに追加する。
~~~
package main

import (
	"fmt"
	"log"
	"os"
)

func main() {
	file, err := os.Open("./lesson.go")
	if err != nil {
		log.Fatalln("Error!")
	}
	defer file.Close()
	data := make([]byte, 100)
	count, err := file.Read(data)
	if err != nil {
		log.Fatalln("Error")
	}
	fmt.Println(count, string(data))

    //追加した範囲
	err = os.Chdir("test")   
	if err != nil {
		log.Fatalln("Error")
	}
}

//実行結果はtestというディレクトリは存在しないため以下のようになる。
100 package main    
import(
    "fmt"
    "os"
    "log"
)

func main() {
    file, err := os.Open("./lesson.go")  
    if 
2025/01/12 18:11:02 Error!
~~~
## 学習に使用した教材
・『入門】Golang基礎入門 + 各種ライブラリ + 簡単なTodoWebアプリケーション開発(Go言語)』M.A EduTech
https://www.udemy.com/course/golang-webgosql/?utm_medium=udemyads&utm_source=bene-msa&utm_campaign=responsive&utm_content=top-1&utm_term=general&msclkid=81e2f24a32cc185d275d953d60760226&couponCode=NEWYEARCAREERJP

・『シリコンバレー一流プログラマーが教える Goプロフェッショナル大全』酒井 潤 (著)
https://www.amazon.co.jp/%E3%82%B7%E3%83%AA%E3%82%B3%E3%83%B3%E3%83%90%E3%83%AC%E3%83%BC%E4%B8%80%E6%B5%81%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E3%81%8C%E6%95%99%E3%81%88%E3%82%8B-Go%E3%83%97%E3%83%AD%E3%83%95%E3%82%A7%E3%83%83%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB%E5%A4%A7%E5%85%A8-%E9%85%92%E4%BA%95-%E6%BD%A4/dp/4046070897
データリストからバインド変数と条件文字列の生成方法【Python】

#### 説明
1. データ加工
   - データリストからバインド変数と条件文字列を生成
```python
data_list = [
    {'id': 1, 'code': 'A', 'name': 'apple'},
    {'id': 1, 'code': 'B', 'name': 'banana'},
    {'id': 2, 'code': 'A', 'name': 'cherry'},
    {'id': 2, 'code': 'B', 'name': 'doughnut'}
]

bind_values = {}
conditions = []
for i, item in enumerate(data_list, start=1):
    bind_values[f'id_{i}'] = item['id']
    bind_values[f'code_{i}'] = item['code']
    conditions.append(f'(id = :id_{i} AND code = :code_{i})')
conditions = ' OR '.join(conditions)

print(bind_values)
# {'id_1': 1, 'code_1': 'A', 'id_2': 1, 'code_2': 'B', 'id_3': 2, 'code_3': 'A', 'id_4': 2, 'code_4': 'B'}

print(conditions)
# (id = :id_1 AND code = :code_1) OR (id = :id_2 AND code = :code_2) OR (id = :id_3 AND code = :code_3) OR (id = :id_4 AND code = :code_4)
```
【2025年01月版】Ubuntu24.04 で イーサネットのリンク速度の確認と設定

# はじめに

このUbuntuのネットワークって2.5Gのハブにつながっているけど、iperf3で1000Mしかでてない気がする。。。確認しよう。。。のメモ

# 確認方法

## インターフェイスの名前を取得する

```terminal
# ip a
 :
 :
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master ovs-system state UP group default qlen 1000
    link/ether 7c:83:34:b9:b4:a9 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::7e83:34ff:feb9:b4a9/64 scope link 
       valid_lft forever preferred_lft forever
 :
```

## ethtool で確認する

```terminal
# ethtool enp1s0
Settings for enp1s0:
        Supported ports: [ TP ]
        Supported link modes:   10baseT/Half 10baseT/Full
                                100baseT/Half 100baseT/Full
                                1000baseT/Full
                                2500baseT/Full
        Supported pause frame use: Symmetric
        Supports auto-negotiation: Yes
        Supported FEC modes: Not reported
        Advertised link modes:  10baseT/Half 10baseT/Full
                                100baseT/Half 100baseT/Full
                                1000baseT/Full
                                2500baseT/Full
        Advertised pause frame use: Symmetric
        Advertised auto-negotiation: Yes
        Advertised FEC modes: Not reported
        Speed: 1000Mb/s
        Duplex: Full
        Auto-negotiation: on
        Port: Twisted Pair
        PHYAD: 0
        Transceiver: internal
        MDI-X: off (auto)
        Supports Wake-on: pumbg
        Wake-on: g
        Current message level: 0x00000007 (7)
                               drv probe link
        Link detected: yes
```

### 読み方

`Supported link modes` : サポートしているリンクモード
`Advertised link modes` : Hubなどの対向機器に通知したリンクモード
`Speed` : リンクスピード
`Duplex` : Full なら全二重
`Auto-negotiation` : 自動ネゴシエーション
`Link detected` : リンクされているかどうか

# 設定方法

## 速度設定

- 2.5Gに設定

`# ethtool -s enp1s0 speed 2500 duplex full autoneg on`

- 1Gに設定

`# ethtool -s enp1s0 speed 1000 duplex full autoneg on`

- ネゴシエーションをOFFに設定

`# ethtool -s enp1s0 speed 2500 duplex full autoneg off`

:::note warn
よくわからずに `autoneg off` にすると、たいてい繋がらなくなります

経験上、よくわからずにとりあえずで、1Gで自動的に設定されているのに2.5Gに無理やりすると、
対向の機器の設定、対向の機器の制限、対向の機器のスペック、ケーブルのスペック、自機のスペックなどでつながらなくなることがほとんどです。
:::

# さいごに

かんたんでしたね
【GitHub Desktop】リポジトリの作り方について

# はじめに
業務で初めて`GitHub Desktop`を使用し、リポジトリを新規作成する際の手順を整理しました。

:::note warn
***この記事は<font color="Red">個人的なアウトプット</font>を目的として作成したものです。そのため、誤った情報や不足している内容が含まれている可能性があります。もし間違いや気になる点がございましたら、ぜひご指摘いただけますと幸いです***。
:::

# リポジトリの作成
## ローカルリポジトリの作成手順
***1.ホーム画面で作成を開始***
`Create a New Repository on your Local Drive`を選択します。

![スクリーンショット 2025-01-11 23.36.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835217/b98f36a3-5d19-4428-bfff-c08b2ce06aa1.png)

***2.リポジトリ設定の入力***
以下の画面が表示されるので、各項目を入力します。

![スクリーンショット 2025-01-11 23.46.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835217/fed73f0f-1be0-3af6-a63c-b77c5867ce3d.png)

+ ***Name*** : リポジトリの名前
+ ***Local Path*** : ローカルレポジトリの保存場所

設定が完了したら、`Create Repository`を押します。

![スクリーンショット 2025-01-12 0.06.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835217/41b5ae1e-b55f-451d-c998-6937245d0f31.png)

***3.作成完了の確認***
以下のような画面が表示され、左上にリポジトリ名が反映されていれば成功です。

![スクリーンショット 2025-01-12 0.08.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835217/7ba577ba-e628-92c3-6c78-15319a108d37.png)


## リモートリポジトリの作成手順
***1.リモート公開の開始***
ローカルリポジトリを選択した状態で、右上の`Publish repository`をクリックします。

![スクリーンショット 2025-01-12 17.53.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835217/54bdaa9e-eb48-583e-c6b1-b97d8c4a950a.png)

***2.公開設定の入力***
+ ***Name*** : ローカルリポジトリと同じ名前
+ ***Keep this code private*** : プライベートリポジトリにする場合はチェックを入れる

![スクリーンショット 2025-01-12 17.54.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835217/c5e6c236-0cd3-61e7-03f5-ea16c5b9638f.png)

***3.リモートリポジトリの公開***
`Publish Repository`を押します。

![スクリーンショット 2025-01-12 18.02.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835217/895ec8f6-c885-0c6c-f6b5-61608207a794.png)

***4.リポジトリの確認***
`View on GitHub`を押すと、`GitHub`の該当ページが開きます。

![スクリーンショット 2025-01-12 18.03.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835217/df6acd3e-a223-7242-3775-2d5121f6c2e0.png)

GitHub上にリポジトリが作成されていれば完了です。

![スクリーンショット 2025-01-12 18.03.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835217/81f7a546-8fc8-b342-52dc-6a758776e936.png)

# 終わりに
初めて`GitHub Desktop`を使用する際は少し戸惑うこともありましたが、実際に手順を整理することで効率的に操作ができるようになりました。今後も学びを積み重ねながら業務での活用スキルを向上させていきたいと思います。

# 参考

https://zenn.dev/penguin4731/books/11bee5738e367f/viewer/633f01
paizaラーニングレベルアップ問題集の「N個のデータの入力」をやってみた。

paizaラーニングレベルアップ問題集の[N個のデータの入力](https://paiza.jp/works/mondai/stdin/stdin_n)をやってみました。
- - -
###### 問題
https://paiza.jp/works/mondai/stdin/stdin_n
- - -
###### 方針
1. 整数$N$を受け取ります
1. 以下のいずれかの方法で出力します（[3つのデータの入力](https://qiita.com/anonymously115/items/3dbfe05f8a2de7e7dd20)と同様、言語による）
    - [1つのデータ入力](https://qiita.com/anonymously115/items/50ed25f7748f1cb1b426)を$N$回繰り返す
    - 難しい場合は、1行受け取って半角空白で区切る
- - -
###### C
```c
#include <stdio.h>

int main() {
	int n;
	scanf("%d", &n);
	for (int i = 0; i < n; i++) {
		char s[101];
		scanf("%s", s);
		printf("%s\n", s);
	}
	return 0;
}
```
- - -
###### C++
```cpp
#include <iostream>
using namespace std;

int main() {
	int n;
	cin >> n;
	for (int i = 0; i < n; i++) {
		string s;
		cin >> s;
		cout << s << endl;
	}
	return 0;
}
```
- - -
###### C#
```cs
using System;

class Program
{
	public static void Main()
	{
		int n = int.Parse(Console.ReadLine());
		string[] S = Console.ReadLine().Split();
		for (int i = 0; i < n; i++) Console.WriteLine(S[i]);
	}
}
```
- - -
###### Go
```go
package main
import "fmt"

func main() {
	var n int
	fmt.Scan(&n)
	for i := 0; i < n; i++ {
		var s string
		fmt.Scan(&s)
		fmt.Println(s)
	}
}
```
- - -
###### Java
```java
import java.util.*;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		for (int i = 0; i < n; i++)
			System.out.println(sc.next());
		sc.close();
	}
}
```
- - -
###### JavaScript
```js
const lines = require("fs").readFileSync("/dev/stdin", "utf8").split('\n');
const n = Number(lines[0]);
const S = lines[1].split(' ');
for (var i = 0; i < n; i++) console.log(S[i]);
```
- - -
###### Kotlin
```kotlin
import java.util.*

fun main() {
	val sc = Scanner(System.`in`)
	val n = sc.nextInt()
	for (i in 0 until n)
		println(sc.next())
	sc.close()
}
```
- - -
###### PHP
```php
<?php
	$n = intval(trim(fgets(STDIN)));
	$S = explode(" ", trim(fgets(STDIN)));
	for ($i = 0; $i < $n; $i++)
		echo "$S[$i]\n";
?>
```
- - -
###### Perl
```pl
chomp(my $n = <STDIN>);
chomp(my $s = <STDIN>);
@S = split(" ", $s);
for (my $i = 0; $i < $n; $i++) {
	print "@S[$i]\n";
}
```
- - -
###### Python3
```py
n = int(input())
S = input().split()
for i in range(n):
	print(S[i])
```
- - -
###### Ruby
```rb
n = gets.to_i
S = gets.split
n.times do |i|
	puts S[i]
end
```
- - -
###### Scala
```scala
import scala.io.StdIn._

object Main extends App{
	val n = readInt()
	val S = readLine().split(" ")
	for (i <- 0 until n) {
		println(S(i))
	}
}
```
- - -
###### Swift
```swift
let n = Int(readLine()!)!
let S = readLine()!.split(separator: " ")

for i in 0..<n {
	print(S[i])
}
```
[React] Reactとは

# はじめに
この記事は、Reactを学ぶ中で得た知識や感じたことを記録したメモをまとめたものです。エンジニア初学者として学習する中で気づいたポイントや躓いた部分を整理し、後から振り返った際に役立てるとともに、Reactを学び始めた方々にも少しでも参考になる内容になれば幸いです。

# Reactとは
Reactは、Metaが開発した、UIを効率的に構築するための**JavaScriptライブラリ**。


# ライブラリ？ フレームワーク？
Reactはあくまでライブラリだが、豊富な周辺ツールやエコシステムを活用することで、フレームワークのように使うことが可能。

## Reactフレームワークの例
- **Next.js**  
  サーバーサイドレンダリング（SSR）や静的サイト生成（SSG）に対応。
- **Gatsby**  
  静的サイト生成に特化したフレームワーク。高速なウェブサイト構築に最適。
- **Remix**  
  高速なデータ駆動型のアプリケーション開発が可能。

「State of JavaScript 2024」によると、メタフレームワークの中で最も使用されているのは**Next.js**。

## React周辺ツールの例
- **Axios**: シンプルで柔軟なHTTP通信ライブラリ。  
- **React Hook Form**: 軽量でパフォーマンスに優れたフォーム管理ツール。  
- **Tailwind CSS**: ユーティリティクラスを活用したCSSフレームワーク。  
- **Jest**: JavaScriptのテストランナー。  
- **Vite**: 高速な開発環境を提供するビルドツール。


# Reactの特徴
## 1. コンポーネントベース
ReactではUIを「コンポーネント」という小さな部品に分けて作成する。それぞれのコンポーネントは独立しており、再利用可能なため、保守性や開発効率が向上する。

## 2. 仮想DOM
仮想DOMを使用することで、変更箇所だけを効率的に更新する。この仕組みにより、アプリケーションの動作が高速化する。


# Reactプロジェクトの始め方
React公式では「Reactをフレームワークなしで使うことも可能だが、新しいアプリやサイトをフルでReactを使って構築する場合は、フレームワークを使用することを推奨」としている。

## Next.jsプロジェクトの作成方法
新規プロジェクトを作成するには、以下のコマンドを実行：

```bash
npx create-next-app@latest
```
### コマンドの各部分の解説
**1. npx**
* **意味**
Node.js に付属するコマンドラインツールで、パッケージを一時的にインストールして実行するためのもの。
* **役割**
指定したパッケージ（```create-next-app```）をローカルやグローバルにインストールせず、その場で実行する。

**2. create-next-app**
* **意味**
Next.js プロジェクトを簡単にセットアップするための CLI ツール。
* **役割**
プロジェクトディレクトリを作成し、Next.js の基本構成や依存関係を自動的にセットアップする。
* **実行後に行われること**
  * プロジェクトディレクトリが作成される。
  * 必要なファイルやディレクトリが生成される。
  　*　```pages/```（ルーティング用のディレクトリ）
  　*　```public/```（静的アセット用のディレクトリ）
  　*　```styles/```（スタイル用のディレクトリ）
 
  * ```package.json```が生成され、Next.js 関連の依存パッケージがインストールされる。

**3. @latest**
* **意味**
```create-next-app```パッケージの最新バージョンを使用する指定。
* **役割**
バージョンを明示的に指定する代わりに、常に最新バージョンをインストールして実行する。

## Reactを学ぶために
下記は、Reactを学ぶために実際に取り組んだ内容です。

**1. 基本を理解する**
* JSX、コンポーネント、Props、Stateなどの基礎概念を、Udemyや本を活用して学習しました。

**2. 小さなReactプロジェクトを始めてみる**
* 簡単なポートフォリオを作成しました。
* スクール内の課題で家計簿アプリを作成しました。

**3. 公式ドキュメントを活用する**
* React公式ドキュメントを活用して、基礎を学びました。

**4. Next.jsなどのフレームワークを使ってみる**
* 前述の家計簿アプリを、再度Next.jsで作成しました。
* SSRやルーティングの活用を体験しました。
【pyenv】Pythonバージョン管理

# 手順

作業フォルダを作成し、以下のコマンドを順番に実行する。

```sh
# install pyenv
brew install pyenv
# check pyenv version
pyenv -v
# pass a path 
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(pyenv init -)"' >> ~/.zshrc
# List of Python installs available
pyenv install -l
# install python
pyenv install 3.13.1
# check python version
pyenv versions
# apply python version on project directory
pyenv local 3.13.1
# check python version
pyenv versions
```
## 他のPythonバージョンと競合してパッケージのインストールがうまくいかない場合

pyenvをインストールする前にbrewや公式サイトからPythonをインストールしている場合、pipでインストールしても期待通りに読み込めない場合があります。

以下のように直接ローカルプロジェクトに設定したインタープリタを使用するようにして対処可能です。

```
# check python version
$ /Users/youruser/.pyenv/versions/3.13.1/bin/python --version
Python 3.13.1
# install package
$ /Users/youruser/.pyenv/versions/3.13.1/bin/python -m pip install diagrams
Successfully installed MarkupSafe-3.0.2 diagrams-0.24.1 graphviz-0.20.3 jinja2-3.1.5
# check installed package
$ /Users/youruser/.pyenv/versions/3.13.1/bin/python -m pip list | grep diagrams
diagrams   0.24.1
```
Vscodeでのssh二段階接続

# はじめに
外部から大学の研究室のPCにsshでアクセスする際など、いくつかのサーバを経由して接続する場合、sshのコマンドを何回も打つ必要があります。毎回コマンドをたたくのは面倒なので、設定ファイル(`~/.ssh/config`)を編集してGUIでアクセスできるようにしたいと思います。

# ~/.ssh/config

結論から言うと以下のようになります。
※ 二段階接続の場合
```~/.ssh/config
# 踏み台サーバー（Bastion）の設定
Host bastion
  HostName bastion-server-ip-or-hostname
  User bastion-user

# ターゲットサーバーの設定
Host target
  HostName target-server-ip-or-hostname
  User target-user
  ProxyJump bastion
```

ローカル -> bastion -> targetといった流れで接続します。


ここで `ProxyCommand`を用いて行われている記事が多いですが、レガシーな書き方であり`ProxyJump`の方が簡潔なため採用しています。

# vscode remote-ssh

vscodeの拡張機能にある Remote Development というパッケージをインストールします。(vscode上で`ctrl+shift+x`を押すことで拡張機能を開くことができ、そこから Remote Developmentと検索することでパッケージが出てきます)

Remote Developmentの扱い方は他の記事でやり方がたくさん出てくるため詳しくは説明しませんが、インストールするとvscodeの左側のアイコンの列にリモートエクスプローラーというアイコンが作成され、そこからGUIでsshログインをすることができます。

Remote Developmentの使い方：https://blog.future.ad.jp/vscode_remote_development

# 参考
https://zenn.dev/kariya_mitsuru/articles/ed76b4b27ac0fc
Redisのメモ

Redisに関する簡単なメモです。
コマンドの例を記載しています。コマンドに続く行のスニペットは返り値です。

### コマンド
#### SET
String型のキーバリューペアを登録する。
```SET key1 value1```
```OK``` キー：key1、バリュー：value1で登録される。

 - NXオプション
```SET key1 value1 NX```
キーが存在する場合はnil、存在しない場合はOKを返し登録する

#### APPEND
指定したキーのバリューの追記する。キーが存在しない場合は新規にキーバリューのペアを登録する動きになる。

```APPEND key1 value1```
key1が存在しなかった場合はキー：key1、バリュー：value1
key1が存在した場合はキー：key1、バリュー：既存の文字列とvalue1が結合された文字列

#### GETRANGE
指定したキーの特定の始点、終点の範囲のバリューを取得する。
 
 ```GETRANGE key1 0 2``` 値はvalue1とする。
 ```"val"```

 ```GETRANGE key1 0 0```
 ```"v"```

 ```GETRANGE key1 2 0```
 ```""``` 終点よりも後の始点を指定すると空文字になる。エラーにはならない。

 ```GETRANGE key1 0 -1```
 ```"value1"```

 ``` GETRANGE key1 -3 -2```
 ```"ue"```
Tableau Prep Builder（TableauPrep）についての整理

# Tableau Prep Builder（Tableau Prep）とは？
データを分析に適した形にする、<mark>データ準備のための加工ツール</mark>。
データの中身を確認しながら変換でき、さらに、データソースを作成フローごとシェアできるのが特徴。

Tableau Desktopでもできることもあるが、Prepでしかできないこともある。
以下が主なデータ処理の項目でのTableau DesktopとTableau Prepの比較一覧です。![Prep比較.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/975576/63413552-a6fb-10ac-151b-4c266449a900.png)
## 手順
### 1. 左側の「接続」の右側にある「＋」からデータソースに接続する
Tableau ServerからSalesforceのデータに繋いだり、Excelから繋いだり、その他外部のデータソースにも繋ぐことができる。
![suta-to.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/975576/c347a7c5-ac93-e002-637a-92a66d885122.png)

### 2. データを選択して、不要なデータがあれば選択して除外していく。![suta-to2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/975576/22cc42b9-eda8-f08e-3aad-9f373c35fb30.png)

### 3. データを加工していく
![suta-to3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/975576/cf7b2d43-ed6b-06e7-eda4-d19f32fde456.png)

#### 加工で主に使う機能
- クリーニング（フィルター・データ型の変更・グループ化と置換）
- 集計
- 結合
- ユニオン
- ピボット
- 出力

※これらの詳細は別途記事を作成もしくは追記していきます。

##### 各作業の際にわかると便利。

- 各画面の名称。ざっくり覚えておいたほうが調べる際に便利
![zenn1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/975576/3f919172-8918-678e-567e-d79a47f5b235.png)

​
- 後で誰が見てもわかるように命名するなり説明するなりした方が良いと思うが、実際にはどんな命名規則で運用するのがいいのかは是非色々聞きたい。。
![zenn2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/975576/db325bdc-52b1-39ee-d0a0-88563972beee.png)


- データに変更を加えると、「変更」のところに変更箇所が記載される。
　しかも順番も制御されるので、１つ１つで処理のステップを増やさなくても可能。
　ここも命名規則についてはどのような運用で行うべきか聞きたい部分
 ![zenn3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/975576/a6ad142a-b383-b3c7-5970-90d5df8c7291.png)
![zenn4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/975576/c268c282-1241-adb3-25d9-8b756a34c81f.png)
【Android】定めた期間がきたかどうかを判定するクラスのチートシート【Kotlin】

# 内容
注意点は
**Androidバージョンで日時を取得する方法が違うこと**


```
  fun isAvailable(): Boolean {
      // 期限を設定
      val periodDateText = "2030/01/01 23:59:59 Asia/Tokyo"

      // Android26以降はZonedDateTimeが推奨されている為、26以降以降はZonedDateTime、25以前はDateで現在日時・時刻を取得
      return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        val formatPattern = "yyyy/MM/dd HH:mm:ss VV"
        val nowTimeDate = ZonedDateTime.now()
        val periodDate = ZonedDateTime.parse(
          periodDateText,
          DateTimeFormatter.ofPattern(formatPattern)
        )

        nowTimeDate.isBefore(periodDate)
      } else {
        val formatPattern = "yyyy/MM/dd HH:mm:ss"
        val nowTimeDate = Calendar.getInstance(Locale("ja", "JP", "JP")).time
        val periodDate = SimpleDateFormat(formatPattern, Locale.JAPAN).parse(periodDateText)

        nowTimeDate.before(periodDate)
      }
    }
```
【2025年01月版】Proxmox VE 8.3 で コンテナイメージのダウンロード

# はじめに

Proxmox VE 8.3 でコンテナで遊ぶためにイメージをダウンロードするときのメモ

Proxmox の Shell で作業します

# コンテナリストの更新

```
# pveam update
update successful
```

# コンテナリストの取得

```
# pveam available
mail            proxmox-mail-gateway-8.1-standard_8.1-1_amd64.tar.zst
mail            proxmox-mailgateway-7.3-standard_7.3-1_amd64.tar.zst
system          almalinux-9-default_20240911_amd64.tar.xz
system          alpine-3.18-default_20230607_amd64.tar.xz
system          alpine-3.19-default_20240207_amd64.tar.xz
system          alpine-3.20-default_20240908_amd64.tar.xz
system          alpine-3.21-default_20241217_amd64.tar.xz
system          archlinux-base_20240911-1_amd64.tar.zst
system          centos-9-stream-default_20240828_amd64.tar.xz
system          debian-11-standard_11.7-1_amd64.tar.zst
system          debian-12-standard_12.7-1_amd64.tar.zst
system          devuan-5.0-standard_5.0_amd64.tar.gz
system          fedora-40-default_20240909_amd64.tar.xz
system          fedora-41-default_20241118_amd64.tar.xz
system          gentoo-current-openrc_20231009_amd64.tar.xz
system          openeuler-24.09-default_20241118_amd64.tar.xz
system          opensuse-15.5-default_20231118_amd64.tar.xz
system          opensuse-15.6-default_20240910_amd64.tar.xz
system          rockylinux-9-default_20240912_amd64.tar.xz
system          ubuntu-20.04-standard_20.04-1_amd64.tar.gz
system          ubuntu-22.04-standard_22.04-1_amd64.tar.zst
system          ubuntu-24.04-standard_24.04-2_amd64.tar.zst
system          ubuntu-24.10-standard_24.10-1_amd64.tar.zst
turnkeylinux    debian-10-turnkey-collabtive_16.1-1_amd64.tar.gz
turnkeylinux    debian-10-turnkey-concrete5_16.1-1_amd64.tar.gz
 :
 :
```

# コンテナリストのダウンロード

- ここでは、`nvme-xfs` というストレージにダウンロードしている
- `local`, `local-lvm` 等お好きな容量のある場所に
- ダウンロード先として指定できない場合は、Datacenter → Storage → 対象のID(たとえばlocal-lvm) → Edit → Content に `Container` を追加

```
# pveam download nvme-xfs ubuntu-24.10-standard_24.10-1_amd64.tar.zst
downloading http://download.proxmox.com/images/system/ubuntu-24.10-standard_24.10-1_amd64.tar.zst to /mnt/pve/nvme-xfs/template/cache/ubuntu-24.10-standard_24.10-1_amd64.tar.zst
--2025-01-12 17:12:02--  http://download.proxmox.com/images/system/ubuntu-24.10-standard_24.10-1_amd64.tar.zst
Resolving download.proxmox.com (download.proxmox.com)... 51.79.228.122, 2400:ed00:3::2
Connecting to download.proxmox.com (download.proxmox.com)|51.79.228.122|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 143472532 (137M) [application/octet-stream]
Saving to: '/mnt/pve/nvme-xfs/template/cache/ubuntu-24.10-standard_24.10-1_amd64.tar.zst.tmp_dwnl.1723565'
     0K ........ ........ ........ ........ 23% 19.0M 6s
 32768K ........ ........ ........ ........ 46% 30.8M 3s
 65536K ........ ........ ........ ........ 70% 30.7M 2s
 98304K ........ ........ ........ ........ 93% 30.7M 0s
131072K ........                           100% 30.8M=5.1s
```

# さいごに

かんたんでしたね

# リンク

[Proxmox Container Toolkit](https://192.168.100.221:8006/pve-docs/chapter-pct.html#pct_container_images)
Mac Apple M3 miniconda3 install

最近MacBookを買いかけたので備忘用

# 環境
・MacBook Air M3

# 公式ドキュメントを参考にする。

今回はインストールコマンドでささっとインストールする。

まずは、インストールするフォルダを任意の場所に作成する。
```bash:command
mkdir -p ~/miniconda3
```

インストールのファイルをダウンロードする。
オプション "-o" でデータをファイルとして保存している。
```bash:command
curl https://repo.anaconda.com/miniconda/Miniconda3-latest-MacOSX-arm64.sh -o ~/miniconda3/miniconda.sh
```

ダウンロードしたShellファイルを実行する。
オプションはそれぞれ以下のようだ。
<table>
  <thead>
    <tr>
      <th>オプション</th> <th>概要</th>
    </tr>
  </thead>
  <tr>
    <td> -b </td> <td>バッチモードのインストール。オプションがあってもデフォルトになる。</td>
  </tr>
  <tr>
    <td> -u </td> <td>既存でインストールされている場合でも上書きされる。</td>
  </tr>
  <tr>
    <td> -p </td> <td>インストール先のprefixを指定する。</td>
  </tr>
</table>

```bash:command
bash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3
```

最後にゴミ掃除。インストールに使ったShellファイルを削除する。
```bash:command
rm ~/miniconda3/miniconda.sh
```

https://docs.anaconda.com/miniconda/install/#quick-command-line-install
Win11 PCのバッテリー消耗について確認する方法

こんにちは
株式会社クラスアクト インフラストラクチャ事業部の大塚です。

この記事ではWin11 PCのバッテリーの消耗について確認する方法をメモっていきたいと思います。

# 手順
コマンドプロンプトを開いて以下のコマンドを実行します。
```
powercfg/batteryreport
```
実行すると以下のようにフォルダのパスが出力されます。
コピペして開いてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/d2e89df2-c6b7-0eaa-2a2b-97393b14d25d.png)
battery-report.htmlというファイルがあるかと思いますので、これを開いてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/9fa04f53-7b64-9cf2-07a1-e1c44af23980.png)
開いてみるとBattery reportというものが確認できます。
このファイルの中盤少し下にある"DESIGN CAPACITY"と"FULL CHARGE CAPACITY"に注目します。
それぞれ以下の意味になります。
| 用語 | 意味 |
|:-----------|:-----------|
|DESIGN CAPACITY|バッテリーが最初に設計されたときに、メーカーが設定した理論的な最大容量を示す|
|FULL CHARGE CAPACITY|現在のバッテリーがフル充電されたときの実際の容量を示す|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/91b90e04-c848-633d-c408-44cb4b654bf3.png)

現在の私のバッテリーの状態を見てみますと、以下のような計算が出来ますので初期の3/4程度しかエネルギーを保持できないということがわかります。
容量の割合 = ( 35,110 ÷ 45,800 ) × 100 ≈ 76.6%

さらにレポートのCYCLE COUNTというものを見てみます。以下の意味です。
| 用語 | 意味 |
|:-----------|:-----------|
|CYCLE COUNT|バッテリーが完全に充電されてから完全に放電されるサイクルを何回繰り返したかを示す|

つまり177回ほど完全充電⇔完全放電を繰り返した結果、25%程度バッテリーが弱ってしまったことになりますね。
※最も、絶対的に正しい数値というものでもないようですが・・・
django rest_frameworkでCRUD処理のAPI実装の流れ

最近、djangoのrest_frameworkを使った実装をしていて
やり方を忘れないようにメモしておきます。


インストールはこちら(https://www.django-rest-framework.org/#installation)
```
pip install djangorestframework
```


bookというアプリの中のmodels.pyにBookという名前でモデルを作っている前提で話を進めます。
また、CRUD処理について、全ての処理を一括できるModelViewSetを用いて実装します。

## step1:serializers.pyの作成&シリアライズクラスの作成
bookアプリにserializers.pyファイルを作成してください。
中身を、このように編集します。
```python:serializers.py
from .models import Book #Bookモデル
from rest_framework import serializers

#Bookシリアライザ
class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book #モデルを指定
        fields = '__all__'

```

## step2:views.pyにViewの作成
bookアプリのviews.pyに
```python:views.py
from rest_framework import viewsets #ViewSet使用
from .serializers import BookSerializer 
from .models import Book


class BookViewSet(viewsets.ModelViewSet):
    serializer_class = BookSerializer 
    queryset = Book.objects.all()
```

## step3.urls.pyにapiエンドポイント登録
bookアプリのurls.pyファイルを作成

```python:urls.py
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import (
    BookViewSet
)



router = DefaultRouter()
router.register('books', BookViewSet)

urlpatterns = [
    path('', include(router.urls)),#ViewSetのURLを追加
]
```

以上です。
データモデル・項目整理

頭の整理

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450298/851666bd-881c-bec5-f5b7-fc2ee4d8ec97.png)


①ケースが作られる。
　・Webtoケース
　・メールToケース
　・コールセンターが電話を受けて、ケース手動生成
②作業指示が作られる。
　・コールセンターが手動作成
  ・ロジックで自動生成（レコードトリガフローとかケース作成トリガに自動生成）
③サービス予定作成／ディスパッチ
　・作業種別の設定によりサービス予定自動生成
　・手動でサービス予定を作成
　→上記の後、ディスパッチを実行（ステータスがディスパッチ済みになり、必要に応じて権限処理発動。）


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450298/e6c9c610-6c84-fd34-001f-cda4f0069215.png)