OmniAICreator/Qiita-1.07M huggingface dataset:
[VRChat] VRCQuestTools でQuestに対応

:::note warn
- そもそも購入したアバターにAndroid用があるのなら不要
- キプフェルはなくてもいけそう
:::

## ⭐️目的

Qusetに対応する軽いアバターを作る

## ⭐️参考

https://booth.pm/ja/items/2436054

https://kurotu.github.io/VRCQuestTools/ja/

https://x.com/usa_tewi_inaba/status/1931549687976538214?t=Yim6j-FxgKXHiYsCNXs3Mg&s=09


## ⭐️インストール

https://booth.pm/ja/items/2436054

https://kurotu.github.io/vpm-repos/vpm.html

![スクリーンショット 2025-04-28 20.12.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/27cd023a-5df2-4827-a34f-b3528afb4c34.png)


## ⭐️使い方

2パターンやり方がある?
公式だと一連の流れになってるけど2つアンドロイド用ができた

https://kurotu.github.io/VRCQuestTools/ja/docs/intro

### ☂️やり方1

本体を選択して

![スクリーンショット 2025-04-28 20.15.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/0ed5dbfe-b019-444e-8316-47f9f0c4b29f.png)

- ツールからconvert avatar for androidを押す

![スクリーンショット 2025-04-28 20.17.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/6f5adade-b666-4e18-b7c8-884c6db9c798.png)

削減したい情報などを確認してconvertを押す

![スクリーンショット 2025-04-28 20.27.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/a71a1f79-4190-4eb1-a0df-fdfb3daa8dfc.png)


### ☂️やり方2

本体を選択して

![スクリーンショット 2025-04-28 20.29.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/a2867134-742b-4dca-972d-9dad4bb902d6.png)

ファイルからビルドを設定を押す

![スクリーンショット 2025-04-28 20.23.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/b3f7f6e3-08e3-4579-8ace-e0d44c878fd4.png)

ポップアップでターゲットを切り替えを押す

![スクリーンショット 2025-04-28 20.27.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/f5868792-7c07-4ba8-872c-bd02223faadb.png)

## ⭐️ビルドとアップロード

![スクリーンショット 2025-06-08 16.41.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/d4be19e8-af6a-42d8-b3dd-dc8f7f40f5fa.png)

- show avatar builderを使ってアップロードする
【Rails】deviseを使ったユーザー管理機能の実装手順まとめ（初学者向け）

今回は、Railsにユーザー管理機能を追加するために、
deviseというGemを使って実装する流れを勉強しました。

初学者なりに手順を整理してみたので、同じくこれから学ぶ方の参考になれば嬉しいです！

# 1. deviseを導入してUserモデルを作成する
まずは、認証機能を簡単に実装できるgem「devise」を使えるようにしていきます。

### ① Gemfileに追記してインストール

```
gem 'devise'
```
そのあとターミナルで
```
bundle install
```
を実行します。

### ② deviseの設定ファイルを作成する

```
rails generate devise:install
```
実行後、ターミナルに表示される指示（Mailer設定など）も忘れずに対応しておきます。

### ③ Userモデルを作成する
```
rails generate devise User
```
これでdevise対応のUserモデルができるので、

```
rails db:migrate
```
でマイグレーションを適用します。

## 2. 新規登録画面をカスタマイズする
続いて、新規登録画面を作って名前も登録できるようにしていきます。

### ① deviseのビューを作成
デフォルトのビューをカスタマイズするために、まずファイルをコピーします。
```
rails generate devise:views
```
これでapp/views/devise/フォルダが作られます。

### ② 新規登録フォームを編集
app/views/devise/registrations/new.html.erbに、以下のようにfirst_nameとlast_nameの入力欄を追加しました。
```
<div class="field">
  <%= f.label :first_name %><br />
  <%= f.text_field :first_name, maxlength: 6 %>
</div>

<div class="field">
  <%= f.label :last_name %><br />
  <%= f.text_field :last_name, maxlength: 6 %>
</div>
```
ポイント：

maxlength: 6で、最大6文字以内に制限しています。

## 3. Userモデルに「first_name」と「last_name」カラムを追加する
データベースにも名前を保存できるように、Userモデルにカラムを追加します。

### ① マイグレーションファイルを作成
```
rails generate migration AddNameToUsers first_name:string last_name:string
```
### ② マイグレーションを実行
```
rails db:migrate
```
これで、Userテーブルにfirst_nameとlast_nameのカラムが追加されました！

## 4. パラメータ許可の設定をする
deviseではセキュリティのため、許可したパラメータしか受け付けません。
なので、first_nameとlast_nameも許可する設定をします。

### ① ApplicationControllerを編集
app/controllers/application_controller.rbに以下を追加しました。
```
before_action :configure_permitted_parameters, if: :devise_controller?

protected

def configure_permitted_parameters
  devise_parameter_sanitizer.permit(:sign_up, keys: [:first_name, :last_name])
end
```
これで新規登録時に、名前も保存できるようになります！

# 学んだこと・気をつけたこと
:point_up:deviseはかなり便利だけど、「パラメータ許可」を忘れるとカラム追加しても保存できないので注意！

:point_up:入力制限（maxlength）も意識して、バリデーションを補助できる

:point_up:ターミナルでの指示（特にrails generate devise:install後）は、しっかり読む

# まとめ
今回の流れはこの通りです。

1.deviseをインストールしてUserモデルを作成

2.ビューを生成して新規登録フォームを編集

3.Userモデルにfirst_nameとlast_nameカラムを追加

4.パラメータ許可設定をして保存できるようにする

初めてでも、ひとつひとつ順番に進めればちゃんと動かすことができました！
PowerAppsでコントロールや画像をプルプルさせる方法

![画面収録 2025-04-27 9.01.17.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3750690/f45fe42e-ba39-4b7f-9615-5ae269de35b3.gif)


# 🍮 PowerApps で “ぷるぷる” ボタンを作る超ライトチュートリアル

> **はじめての Qiita 投稿**  
---

## これはなに？

PowerApps で画面に置いたボタン（や画像）を **ぷるぷる揺らす** 小ネタです。  
「押して！」感を出したいときに使えます。ライブラリ不要、標準コントロールのみ。

---

## 材料

| 名前 | 用途 |
|------|------|
| **Timer コントロール** | 揺らし役 |
| **ShakeTarget**（例） | 揺らしたいオブジェクト（ボタン or 画像） |

---

## 手順（3 ステップ）

### 1. Timer を配置してプロパティを設定

| プロパティ | 値 | メモ |
|-----------|----|------|
| **Duration** | `800` | 800ms で 1 周（好みで） |
| **AutoStart** | `true` | 画面表示と同時に開始 |
| **Repeat** | `true` | ずっとループ |
| **Name** | `timShake` | わかりやすい名前で |

---

### 2. 揺らしたいコントローｒの **Y** プロパティを編集

```powerfx
715 - timShake.Value / 100

//最初の数値はコントロールの初期位置を入れてください
未来を見通してテキスト制御！TRACEが切り拓く次世代言語モデル制御技術とは？

# 未来を見通してテキスト制御！TRACEが切り拓く次世代言語モデル制御技術とは？
今回は、最新の研究成果である「TRACE Back from the Future: A Probabilistic Reasoning Approach to Controllable Language Generation」という論文をご紹介します。この研究は、大規模言語モデル（LLMs）の出力制御を効率的かつ柔軟に実現する新たな枠組みを提案しています。

### 論文情報
- **タイトル**: TRACE Back from the Future: A Probabilistic Reasoning Approach to Controllable Language Generation
- **リンク**: [arXiv:2504.18535v1](https://arxiv.org/abs/2504.18535)
- **発表日**: 2025年4月25日
- **著者**: Gwen Yidou Weng, Benjie Wang, Guy Van den Broeck
- **DOI**: （arXiv preprintのため無し）

## 背景と目的

### 背景の重要性
近年、ChatGPT、Claude、Geminiといった大規模言語モデル（LLMs）が社会インフラ化する中で、出力されるテキストを「人間の価値観に適合させる」「特定の属性を持たせる」ニーズが急増しています。しかし、既存の制御手法には以下の課題があります：

- **再学習の必要性**: 多くの手法は各属性ごとにモデルの再学習（ファインチューニング）が必要であり、コストが高く柔軟性に欠ける。
- **未来予測の困難さ**: オートレグレッシブモデルは、未来のテキスト全体を見越して制御することが苦手。
- **属性確率の近似**: 属性に基づく未来予測（Expected Attribute Probability: EAP）をサンプリングやディスクリミネータに依存して近似しており、特にレアな属性に対しては不安定かつ遅い。

これらの課題を克服するため、著者らは**TRACE（Tractable probabilistic Reasoning for Adaptable Controllable gEneration）**という新しい枠組みを提案しました。

## 研究の焦点

### TRACEの設計思想
TRACEは次の「三原則」で設計されています：

1. **一度きりの蒸留**: 言語モデル（LM）をHidden Markov Model（HMM）に蒸留し、未来予測を高速化
2. **軽量な制御**: 属性ごとに小型のロジスティック分類器を数秒で学習
3. **厳密な推論**: 蒸留HMM上でExpected Attribute Probability（EAP）を正確に計算し、次トークン選択を制御

### 数式で直感を掴む
TRACEにおける次トークン選択は次式で表されます：

```math
p(\text{next-token} | \text{prefix}, s) \propto p_{\text{LM}}(\text{next-token} | \text{prefix}) \times \mathbb{E}_{\text{future}}[p(s|\text{prefix+future})]
```

HMMによりこの期待値を厳密に求め、より未来に整合的な出力を実現します。

## 実験の概要と結果

### 設計と条件
- **データセット**: RealToxicityPrompts（10,000プロンプト）
- **生成方式**: top-pサンプリング (p=0.9)、各プロンプトあたり25生成
- **比較対象**: DAPT, PPO, DExperts, GeDi, FUDGE, MuCoLa, DPO

### 主な結果
- **毒性低減**: TRACEは毒性スコア（Perspective API評価）でSOTA達成
- **流暢さ維持**: perplexity上昇を最小限に抑えつつ、流暢さと多様性を両立

| モデル | 最大毒性(↓) | 毒性生成割合(↓) | 3-gram多様性(↑) | PPL(↓) |
|:------|:-----------|:----------------|:----------------|:------|
| Baseline | 0.385 | 0.257 | 0.86 | 25.57 |
| DPO | 0.180 | 0.026 | 0.78 | **21.59** |
| TRACE | **0.163** | **0.016** | **0.85** | 29.83 |

### 個別強調
- **即時適応**: 76キャラクターのロールプレイに数秒で対応（RoleBench）
- **複合属性制御**: 政治的かつ無毒なテキストも容易に生成（属性を掛け算）

## 賛否両論

### 賛成意見
- **高速**：適応にかかる時間は1属性あたり約3秒
- **柔軟**：どんな新属性にも追加学習不要で対応可能
- **正確**：未来を見据えた厳密な推論ができる

### 反対意見
- **HMMの品質依存**：蒸留されたHMMの品質に生成性能が強く依存
- **分類器の単純性**：属性分類器はトークンごとの重みの積に制限されるため、きわめて複雑な属性（文脈依存、長距離依存）には限界あり

## 将来の展望

### TRACEから開かれる新たな研究領域
- **HMM高性能化**: より大規模かつリッチなHMMの蒸留技術
- **トラクタブル確率回路（TPCs）**との融合
- **動的制御**: 状況に応じたリアルタイム制御（例：RLによるEAP変動対応）

これにより、未来のLLMsは単なる文生成ではなく、"未来整合的な制御生成"を標準とする時代が到来するでしょう。

---
この記事が、皆さんの研究や実務に役立つことを願っています。ご質問やフィードバックがありましたら、ぜひコメント欄にお寄せください！
pip install hydra してはいけない

# TL;DR
機械学習の `hydra` パッケージは `pip install hydra` では入らない。`pip install hydra-core` しないといけない。

# どういうことか
機械学習の `hydra` は便利なパラメータ管理のためのパッケージだが、同名の先発のパッケージがある。なので、PyPy上では `hydra` は別のパッケージで、機械学習のほうのhydra は `hydra-core` というパッケージ名になっている。使う時は `import hydra` なので、よく忘れる。

先発の Hydra はPythonの新しめのバージョンをサポートしていないので、普通に `pip install hydra` すると Cのエラーが出る。困ったことに、何かおかしいな、と思ってエラーメッセージを検索しても根本的な解決には辿りつかない。具体的には次のようなエラーが出る。

```
ERROR: Command errored out with exit status 1: /Library/Developer/CommandLineTools/usr/bin/python3 -u -c 'import io, os, sys, setuptools, tokenize; sys.argv[0] = '"'"'/private/var/folders/9y/0v69xg7d5r941xdqgbl_7bqw0000gn/T/pip-install-8ecvx8rx/hydra_75c536766069419a959274801836af60/setup.py'"'"'; __file__='"'"'/private/var/folders/9y/0v69xg7d5r941xdqgbl_7bqw0000gn/T/pip-install-8ecvx8rx/hydra_75c536766069419a959274801836af60/setup.py'"'"';f = getattr(tokenize, '"'"'open'"'"', open)(__file__) if os.path.exists(__file__) else io.StringIO('"'"'from setuptools import setup; setup()'"'"');code = f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /private/var/folders/9y/0v69xg7d5r941xdqgbl_7bqw0000gn/T/pip-record-8ksuyn9s/install-record.txt --single-version-externally-managed --user --prefix= --compile --install-headers /Users/[ユーザ名]/Library/Python/3.9/include/python3.9/hydra Check the logs for full command output.
```

とか、

```
fatal error: longintrepr.h: No such file or directory
        198 |   #include "longintrepr.h"
```

```
hydra error: command '/usr/bin/x86_64-linux-gnu-gcc' failed with exit code 1
```

とかである。エラーメッセージを検索してこの記事がヒットすることを願う。
NginxにModSecurityを適用


<!--
Copyright (c) 2025 Takaya Maekawa
This file is distributed under the terms of the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
See the LICENSE file in the source directory for details.
(https://creativecommons.org/licenses/by-nc-sa/4.0/)
-->

# NginxにModSecurityを導入するまで

## インストール
```bash
sudo pacman -S libmodsecurity modsecurity-crs
```

## Nginxへの適用

### ModSecurityと依存関係のインストール
```bash
sudo pacman -Syu
sudo pacman -S git gcc pcre pcre2 zlib make
```

### ModSecurityのダウンロードとビルド
```bash
git clone --depth 1 https://github.com/SpiderLabs/ModSecurity-nginx.git
git clone --depth 1 -b v3.0.13 https://github.com/SpiderLabs/ModSecurity
cd ModSecurity
git submodule init
git submodule update
./build.sh
./configure
make
sudo make install
```

### nginxのソースコードのダウンロードとビルド
http://nginx.org/download/
ここより、最新のバージョンのnginxをダウンロードする
ここでもいいかも
http://nginx.org/en/download.html

```bash
wget http://nginx.org/download/nginx-[latest nginx version].tar.gz
tar zxvf nginx-[latest nginx version].tar.gz
cd nginx-[latest nginx version]

./configure --with-compat --add-dynamic-module=../ModSecurity-nginx
make modules
sudo cp objs/ngx_http_modsecurity_module.so /etc/nginx/modules
```

### RuleSetをダウンロードと配置
https://github.com/coreruleset/coreruleset

```bash
wget https://github.com/coreruleset/coreruleset/archive/refs/tags/v[latest version].tar.gz
tar -xzvf v[latest version].tar.gz

sudo mkdir -p /etc/nginx/modsec/coreruleset
sudo cp -r coreruleset-[latest version]/crs-setup.conf.example /etc/nginx/modsec/coreruleset/crs-setup.conf
sudo cp -r coreruleset-[latest version]/rules /etc/nginx/modsec/coreruleset/
```

### 必要なファイルのダウンロード
```bash
wget https://raw.githubusercontent.com/SpiderLabs/ModSecurity/v3/master/modsecurity.conf-recommended -O /etc/nginx/modsec/modsecurity.conf
wget https://raw.githubusercontent.com/SpiderLabs/ModSecurity/v3/master/unicode.mapping -O /etc/nginx/modsec/unicode.mapping
```

### Nginx設定ファイルを編集
`/etc/nginx/nginx.conf`
```conf
load_module modules/ngx_http_modsecurity_module.so;

http {
    ...
    modsecurity on;
    modsecurity_rules_file /etc/nginx/modsec/modsecurity.conf;
    ...
}
```
NginxにSSLを導入


<!--
Copyright (c) 2025 Takaya Maekawa
This file is distributed under the terms of the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
See the LICENSE file in the source directory for details.
(https://creativecommons.org/licenses/by-nc-sa/4.0/)
-->

# NginxにSSLを導入するまで

## インストール
```
sudo pacman -S certbot

sudo pacman -S certbot-nginx
```

## 鍵生成
```bash
sudo certbot --nginx
```
新たにドメインを増やす場合、既存のSSL証明書に新たに追加することが可能。
```
sudo certbot --nginx -d sample.com,sample2.com
```
Website Terms and Policies


<!--
Copyright (c) 2025 Takaya Maekawa
This file is distributed under the terms of the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
See the LICENSE file in the source directory for details.
(https://creativecommons.org/licenses/by-nc-sa/4.0/)
-->

## Note
This post contains privacy policy and terms of service using at [kishax-web](https://github.com/takayamaekawa/kishax-web).

## Privacy Policy
```
Last Updated: [2024/12/31]

This Privacy Policy describes how we collect, use, and protect your personal information when you use our application ("the App"). By using the App, you agree to the practices described in this policy.

1. Information We Collect
We may collect the following information:

Your X or Google username and profile information.
Your email address (if you grant permission).
2. How We Use Your Information
The information we collect is used to:

Authenticate your login to the App.
Provide personalized services within the App.
Contact you regarding important updates or changes to the App.
3. Data Protection
We are committed to protecting your personal information and use appropriate security measures to safeguard it.

4. Third-Party Sharing
We do not share your information with third parties except as required by law or necessary for the operation of the App.

5. Contact Us
If you have any questions about this Privacy Policy, please contact us at [mc.kishax@gmail.com].
```

## Terms Of Service
```
Last Updated: [2024/12/31]

These Terms of Service ("Terms") govern your use of our application ("the App"). By accessing or using the App, you agree to comply with these Terms.

1. Acceptable Use
You must use the App in compliance with all applicable laws and regulations.
You are responsible for any content you create or upload to the App.
2. Prohibited Actions
You may not:

Use the App for any unlawful activities.
Attempt to reverse-engineer or interfere with the App's functionality.
3. Limitation of Liability
We are not responsible for any damages or losses resulting from your use of the App.

4. Termination
We reserve the right to suspend or terminate your access to the App for violations of these Terms.

5. Changes to the Terms
We may update these Terms from time to time. Continued use of the App constitutes acceptance of the updated Terms.

6. Contact Us
If you have any questions about these Terms, please contact us at [mc.kishax@gmail.com].
```
Windows側の日付と時刻が同期しない問題


<!--
Copyright (c) 2025 Takaya Maekawa
This file is distributed under the terms of the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
See the LICENSE file in the source directory for details.
(https://creativecommons.org/licenses/by-nc-sa/4.0/)
-->

# Linux, Windowsのデュアルブート環境で、Windows側の日付と時刻が同期しない問題
## 解決方法
Windows側でハードウェアクロックをUTCで扱うように設定する。
以下実行後は再起動必須。
```pwsh
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation" /v RealTimeIsUniversal /t REG_DWORD /d 1 /f
```
私的MySQLチートシート


<!--
Copyright (c) 2025 Takaya Maekawa
This file is distributed under the terms of the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
See the LICENSE file in the source directory for details.
(https://creativecommons.org/licenses/by-nc-sa/4.0/)
-->

# MySQLチートシート
## インストール
```bash
sudo pacman -Syu
sudo pacman -S mysql mysql-workbench
sudo mkdir -p /var/lib/mysql/
sudo chown -R mysql:mysql /var/lib/mysql
sudo chmod -R 750 /var/lib/mysql
sudo mariadb-install-db --user=mysql --basedir=/usr --datadir=/var/lib/mysql
sudo systemctl enable --now mysqld
```

## もし、`dbeaver`などでrootにログインできなかったら、
```sql
UPDATE mysql.user SET authentication_string=PASSWORD('新しいパスワード'), plugin='mysql_native_password' WHERE User='root';
FLUSH PRIVILEGES;
EXIT;
```

## データインポートするのが遅かったら
一番早いのは、ログインしてから
```sql
use [database];
source ~/file.sql
```

## mysql import, export中の進捗をログで表示

### インストール
```bash
sudo pacman -S pv
```

### 実際に使ってみる
```bash
# import
pv ~/downloads/forum.sql | sudo mariadb --max_allowed_packet=64M web

# export
mysqldump --max_allowed_packet=64M -u root -p web | pv > ~/downloads/forum.sql
```

## exportで失敗しないために
`mysqldump`コマンドの引数で、`max_allowed_packet`を指定する
```bash
mysqldump --max_allowed_packet=64M -u root -p web > ~/path/to/sample.sql
```

## `auth_socket`プラグインを使っているかどうか検証
```sql
SELECT user, host, plugin FROM mysql.user WHERE user='mc';
```

## INSERTでSELECT参照
例として、`members`テーブルのものを`users`テーブルに移植する。
```sql
INSERT INTO users (name, password, email)
SELECT name, password, email
FROM members;
```
OBSやVBCableを使わずに音声を内部ルーティング


<!--
Copyright (c) 2025 Takaya Maekawa
This file is distributed under the terms of the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
See the LICENSE file in the source directory for details.
(https://creativecommons.org/licenses/by-nc-sa/4.0/)
-->

# OBSから脱却
jackパッケージでサウンドの内部ルーティングが容易に。
# インストール
```bash
sudo pacman -S pipewire pipewire-pulse pipewire-jack qjackctl
```
```bash
systemctl --user restart pipewire
systemctl --user restart pipewire-pulse
systemctl --user restart pipewire-media-session
```
jack, setupのinterfaceに持ってるオーディオインターフェースを選択
あとは、グラフよりルーティング
![jack_graph.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628758/e1e25ade-583d-4dfe-8a88-0181888877f7.png)
SSHログインに2FA導入


<!--
Copyright (c) 2025 Takaya Maekawa
This file is distributed under the terms of the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
See the LICENSE file in the source directory for details.
(https://creativecommons.org/licenses/by-nc-sa/4.0/)
-->

# sshに2FAを導入するにあたって
## インストール
```bash
sudo pacman -S libpam-google-authenticator
```
ユーザーごとに鍵を作る
```bash
google-authenticator
```

## 参照
https://wiki.archlinux.jp/index.php/Google_Authenticator#.E3.82.A4.E3.83.B3.E3.82.B9.E3.83.88.E3.83.BC.E3.83.AB
https://wiki.archlinux.jp/index.php/OpenSSH#.E4.BA.8C.E8.A6.81.E7.B4.A0.E8.AA.8D.E8.A8.BC.E3.81.A8.E5.85.AC.E9.96.8B.E9.8D.B5
生成AIとの共生1


<!--
Copyright (c) 2025 Takaya Maekawa
This file is distributed under the terms of the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
See the LICENSE file in the source directory for details.
(https://creativecommons.org/licenses/by-nc-sa/4.0/)
-->

# 生成AIをプログラミングに活用することについて

## 賢い人とは
賢い人とは、抽象度（視点）が高く、共通項を見つける能力に長けた人のことを言う。即ち、部分から全体、全体から部分を考えることのできる能力に秀でた人のことだ。  
確かに、生成AIを用いることで、誰でも母国語である自然言語でコードを生成できる。それ即ち、~~部分から~~全体を知れる。

## 生成AIがもたらすもの
しかし、そこに__過程__はない。部分から全体、全体から部分を考えられる人が賢い人だと表現したが、共通項を見つける作業をすっ飛ばしてその能力が上がることはないと思うのだ。ゆえに、生成AIを用いることで自らの抽象度が上がることはないのだ。

## 過程とは
一方、その__過程__とは何か？  
「逆元的である」という表現を思いついた。部分から全体、全体から部分を可能にするのは数学においては、間違いなく定義だ。defがあれば即ち、必要十分条件があれば、どんな例題だって思いつけるし解けるだろう。また、多くの例題をひとまとめにいわば統一的に書いたものこそ定義である。コード生成はこの定義を自らに落とすことなく全体を述べてしまう。  

## 生成AIがもたらす恩恵
しかし、自然言語からコードへの等価交換はなんといっても魅力的だ。  
実際、コードを理解することを確認するには、それを自らの自然言語で説明できるかという点に集約されるだろう。

## 生成AIを扱う上での注意点
私が生成AIを用いてコード生成するときに注意していることは、自然言語からコードを生成された後のコードを一通り読み、何らかの自らの解釈を加えるということだ。  
そのコードが即座に実行可能であれば、実行して確認することもできるだろう。

## 生成AIを扱う上での理想
しかし、我々は生成AIを使いたい、もって言い換えれば、生成AIに使役されることなく生成AIを道具、自らの糧にしたい人が多いはずだ。それには、単純に生成AIが生成する全体としてのコードを眺めるだけではいけない。なぜなら、部分から全体を考えるにあたっての自らの定義（武器）を持たずして、生成AIと同じ視点、即ち、生成AIと同じ抽象度を維持することはできないのだ。

## 臨界点
人のメモリには限界があるので、defを多岐の分野で、一人の人間が生成AIと同レベルに抽象的に表現することはできないだろうが、なにか一部分、特定の分野においては生成AIと同レベルに考えることができると私は信じている。

## プログラミング力を高めるには
さしあたっては、真にプログラミングを身に着けたいのであれば、生成AIを超える覚悟を持って、批判的に扱うべきだ。また、コード生成になにかのAPIを使ったものなのであれば、そのAPIを作った開発者のドキュメントぐらいは見るべきだろう。それを知らずして、生成AIを超える抽象度を維持することはできないからだ。

## 最後に
今回は、生成AIを使うことについて深く考えた。きっかけは、このままプログラミングに生成AIを使っていて、ほんとうに自らのプログラミングスキルが身につくものかと疑問視したからだ。  
下記の参考にあるrの住人のピエロがいった「賢い人」について知ったことで、ここ数日の疑問に私なりの回答を出せた気がする。

## 参考
rの住人ピエロより  
https://youtu.be/fFQ9kax20I0?si=f59Kuw5A8jezI7En

## 続き
[生成AIとの共生2](https://qiita.com/takaya_maekawa/items/f563b57505808f5bfaeb)を見てね。
UnityのButtonのImageが真っ黒になる現象に詰まった話【実際のコード付き】

Unity開発中に遭遇した、ちょっと厄介なバグについて共有します！

**「ButtonのImageが真っ黒になる問題」**、みなさんも遭遇したことありませんか？

この記事では、実際に詰まったコード例と、なぜ起きたか、どう直したかをコンパクトにまとめました。

---

## 現象

- Buttonに付属するImageのColorを変えたら真っ黒に
- Playするたびにリセットされる

たとえば、こんなコードを書いても：

```csharp
if (dodgeButton != null)
{
    var image = dodgeButton.GetComponent<Image>();
    if (image != null)
    {
        image.color = (currentMoveResource >= dodgeCost) ? dodgeAvailableColor : dodgeUnavailableColor;
    }
}
```

Playしてみると、意図せず真っ黒になってしまう……。
（リソースがあればボタンの色を使える色合いに、リソースがなかったら使えない色合いに変更するだけのスクリプトです。当然使えない際の色に黒色を設定しているわけではありません。）

---

## 原因

UnityのButtonには、デフォルトで**Transitionが"Color Tint"**になっており、

- Hoverしたとき
- クリックしたとき

などに**Image.colorを内部的に書き換えています**。

そのため、スクリプトで設定しても、Buttonの処理で上書きされてしまうわけです。

---

## 実際の発生コード

発生したのは、`PlayerUnitController.cs`の中。
プレイヤーの移動リソース量によって、回避ボタンの色を切り替えたかっただけでした。

```csharp
void Awake()
{
    if (dodgeButton == null)
    {
        GameObject dodgeButtonObj = GameObject.Find("DodgeButton");
        if (dodgeButtonObj != null)
        {
            dodgeButton = dodgeButtonObj.GetComponent<Button>();
        }
    }
    if (dodgeButton != null)
    {
        dodgeButton.onClick.AddListener(TryDodge);
    }
}

private void Update()
{
    if (dodgeButton != null)
    {
        var image = dodgeButton.GetComponent<Image>();
        if (image != null)
        {
            image.color = (currentMoveResource >= dodgeCost) ? dodgeAvailableColor : dodgeUnavailableColor;
        }
    }
}
```

これがTransition=ColorTintの罠にはまっていました。

---

## 解決策

**ButtonのTransitionを"None"に変更するだけ**でOKです！

1. Buttonを選択
2. Inspectorで`Transition`を`None`に変更

これで、スクリプトから設定したImage.colorが正しく反映されるようになります！

---

## まとめ

- UnityのButtonはTransition=ColorTintだとImage.colorが自動上書きされる
- 自前で色制御するならTransition=Noneにするのが安全
- UI制御は「一体化」することがバグ回避の基本！

Unity UIバグは"仕組み"を知ればすぐ対処できるので、こういった基本挙動を押さえておくと開発がスムーズになります！

---

## ブログでもUnityや個人開発ネタを発信中！
開発ノウハウやアプリ制作過程、Unity連携系のハマりポイントなど
より深堀りした内容をブログにまとめています！
▶ https://syunpp.com

## 公開中のアプリ一覧はこちら！
実際にUnityで開発してリリース済みのアプリ一覧をまとめています！
▶ https://syunpp.com/公開中のアプリ一覧/
How to use antidetect browser

## How to Use an Antidetect Browser for Multi-Account Management

Antidetect browsers like **Hidemyacc**, **GoLogin**, or **[AdsPower](https://hidemyacc.com/adspower-browser)** help manage multiple accounts securely by masking digital fingerprints, ideal for e-commerce, social media, or affiliate marketing. Here’s a concise guide to using an antidetect browser effectively:

1. **Choose a Reliable Antidetect Browser**  
   Select a tool that fits your needs. **[GoLogin](https://hidemyacc.com/gologin-antidetect-browser)** is beginner-friendly with a free plan, **AdsPower** excels in automation, and **Hidemyacc** offers strong proxy integration. Most provide free trials (e.g., 7 days for Hidemyacc).

2. **Set Up the Browser**  
   - Download and install the antidetect browser from its official site (e.g., [hidemyacc.com](https://hidemyacc.com)).  
   - Create an account and log in to access the dashboard.  
   - Configure proxy settings (residential or mobile proxies recommended) to assign unique IP addresses to each profile, reducing ban risks.

3. **Create Browser Profiles**  
   - Use the browser’s interface to generate profiles with unique fingerprints (e.g., OS, screen resolution, time zone).  
   - Customize settings like user agent, fonts, or WebGL to mimic real devices. For example, AdsPower allows 50+ parameters for profile customization.  
   - Label profiles (e.g., “FB_Ad_Campaign1”) for easy management.

4. **Manage Multiple Accounts**  
   - Open each profile in a separate browser instance to log into platforms like Facebook, Amazon, or Google Ads.  
   - Use automation features (e.g., Hidemyacc’s script recording) to streamline tasks like logging in or filling forms.  
   - Monitor account activity to ensure profiles remain undetected.

5. **Enhance Security and Efficiency**  
   - Regularly update fingerprints to stay ahead of platform detection algorithms.  
   - Integrate tools like 2FA or password managers for added security.  
   - Test profiles on smaller campaigns before scaling to avoid bans.

**Tips for Success**: Start with a single platform to learn the tool, use high-quality proxies, and avoid reusing fingerprints across accounts. Always check platform policies to minimize risks.
【HTML5備忘録】実務で頻繁に使う主要タグまとめ【初心者向け・用途別一覧】HTML

# はじめに

HTML5では、多くの新しい要素が導入され、より**意味を持った構造（セマンティックなマークアップ）**が求められるようになりました。

この記事では、**実務で頻繁に使うHTML5要素**を用途別に整理して、備忘録としてまとめます！

---

# ①セクション系タグ（ページの区切り）

| タグ | 用途 | 説明 |
|-----|-----|-----|
| `<header>` | ヘッダー | ページやセクションの上部 |
| `<footer>` | フッター | ページやセクションの下部 |
| `<main>` | メインコンテンツ | ページの主要な内容をまとめる |
| `<section>` | セクション | 意味のあるまとまり（章やブロック） |
| `<article>` | 記事 | 独立して成立するコンテンツ（ブログ記事など） |
| `<nav>` | ナビゲーション | ページ内のリンクメニュー群 |
| `<aside>` | 補足情報 | サイドバーや関連情報など |

---

# ②テキスト・メディア関連タグ

| タグ | 用途 | 説明 |
|-----|-----|-----|
| `<h1>〜<h6>` | 見出し | h1が最上位、h6が最下位 |
| `<p>` | 段落 | テキストの基本単位 |
| `<a>` | リンク | 他ページやファイルへのリンク |
| `<ul> / <ol> / <li>` | リスト | 順不同/順序付きリスト |
| `<img>` | 画像表示 | 画像ファイルを表示 |
| `<figure>`, `<figcaption>` | メディアグループ | 画像とキャプションをまとめる |

---

# ③フォーム関連タグ

| タグ | 用途 | 説明 |
|-----|-----|-----|
| `<form>` | フォーム本体 | 入力内容を送信するための囲い |
| `<input>` | 入力フィールド | テキスト、パスワード、チェックボックスなど |
| `<textarea>` | 複数行入力 | 長文入力用 |
| `<button>` | ボタン | 送信ボタンや通常ボタン |
| `<label>` | ラベル | 入力フィールドに名前を付ける |
| `<select>`, `<option>` | セレクトボックス | ドロップダウン形式の選択肢 |

---

# ④その他便利なHTML5要素

| タグ | 用途 | 説明 |
|-----|-----|-----|
| `<details>` | 折りたたみ可能な情報 | アコーディオンメニューなど |
| `<summary>` | 折りたたみのタイトル | `<details>` とセットで使う |
| `<time>` | 日付や時刻 | コンテンツに日付を明示 |
| `<mark>` | ハイライト | 強調したいテキスト範囲 |
| `<progress>` | 進行状況バー | ローディング中などを可視化 |
| `<meter>` | 数値の範囲表示 | スコアやパラメータ表示に使用 |

---

# ⑤実務で特によく使うタグトップ5

| 順位 | タグ | 用途 |
|------|-----|-----|
| 1位 | `<header>` | ページヘッダー |
| 2位 | `<main>` | 本文コンテンツ |
| 3位 | `<section>` | 複数ブロック分け |
| 4位 | `<nav>` | グローバルナビ |
| 5位 | `<footer>` | ページフッター |

---

# ⑥まとめ

- HTML5では「どのタグを使うか」で**ページ構造の意味が伝わりやすくなる**
- 特にセクション系タグ（`<header>`, `<section>`, `<nav>`, `<main>` など）は積極的に使う
- フォームやメディア系の新要素も、今後さらに利用機会が増えるので慣れておきたい
Azure Functions×Playwrightでバッチ自動化（HTTPトリガー対応）構築手順

※本エントリはAIツールにて生成されています

Azure Functions（Linux Consumption）上でPlaywrightと@sparticuz/chromiumを使い、Webページを自動でPDF化するバッチ処理を作った記録です。当初はTimer Triggerによるスケジュール実行を考えていましたが、運用の柔軟さを重視してHTTPトリガー運用に切り替えました。生成したPDFはAzure Blob Storageへ自動アップロードされます。

## 技術スタック・開発環境

使った主な技術・ツールは次の通りです。

- Node.js 20.x
- TypeScript
- Azure Functions Core Tools 4.x
- Azure CLI 2.60+
- Playwright-core、@sparticuz/chromium
- @azure/functions
- Git

## プロジェクト初期化と依存パッケージ導入

まず、Azure FunctionsのTypeScriptプロジェクトを作成し、必要なパッケージを導入します。

```bash
# プロジェクト作成
func init AzureFunctionsPlaywrightBatch --worker-runtime node --language typescript

# Function作成（例: MonthlyJob）
func new --name MonthlyJob --template "HTTP trigger"

# 依存パッケージ追加
npm install playwright-core @sparticuz/chromium @azure/storage-blob
npm install -D typescript @azure/functions
```

## Function実装とトリガー設定

`MonthlyJob/index.ts`でPlaywrightと@sparticuz/chromiumを使いWebページをPDF化し、生成したPDFをAzure Blob Storageへアップロードします。一時ファイルの保存先は`/tmp`ディレクトリです。

**index.ts（抜粋）:**
```typescript
import chromium from "@sparticuz/chromium";
import { chromium as pw } from "playwright-core";
import { BlobServiceClient } from "@azure/storage-blob";
import fs from "fs";

export default async function (context, req) {
  const browser = await pw.launch({
    executablePath: await chromium.executablePath(),
    args: chromium.args,
    headless: true
  });
  const page = await browser.newPage();
  await page.goto("https://www.yahoo.co.jp", { waitUntil: "networkidle" });
  const pdfPath = `/tmp/report.pdf`;
  await page.pdf({ path: pdfPath, format: "A4" });
  await browser.close();

  // Blob Storageアップロード処理...
}
```

**function.json（HTTPトリガー設定例）:**
```json
{
  "bindings": [
    {
      "authLevel": "function",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": [ "get", "post" ]
    },
    {
      "type": "http",
      "direction": "out",
      "name": "res"
    }
  ],
  "scriptFile": "../dist/MonthlyJob/index.js"
}
```

## 設定ファイルのポイント

- `local.settings.json`でAzure Storageの接続文字列などを管理
- `tsconfig.json`でTypeScriptのビルド設定
- `.funcignore`や`.gitignore`も必要に応じて整備

## ビルド・ローカルテスト

TypeScriptのビルドとローカルでのFunction実行は次の通りです。

```bash
# TypeScriptビルド
npm run build

# ローカルでFunction実行
func start
```
ローカル環境ではhttp://localhost:7071/api/MonthlyJobへcurl等でリクエストし、PDF生成やBlobアップロードの動作を確認できます。

## Azureリソース準備とデプロイ

Azure上でのリソース作成とデプロイ手順は次の通りです。

```bash
# Azureリソース作成（リソースグループ、ストレージ、Function App等）
az group create ...
az storage account create ...
az functionapp create ...

# デプロイ
func azure functionapp publish <FunctionApp名>
```
デプロイ後はAzure PortalでFunctionのエンドポイントやfunction keyを取得し、curl等で本番環境のFunctionを実行して動作確認します。

## 注意点・トラブルシューティング

- Playwright/Chromiumの実行には@sparticuz/chromiumが必須
- 書き込み可能なディレクトリは`/tmp`のみ
- Azure Functions（Linux Consumption）ではリソース制限や依存バイナリの配置に注意
- 実行時エラーはAzure Portalの「モニター」や「ログ」で確認
- 必要に応じてApp Serviceプランへの切り替えやバイナリ配置方法の見直しも検討
softether ログ分析

# 概要
softether VPNを運用しています。
海外渡航時や、親しい友人たちに貸与しています。
今回、セキュリティの観点からもログを確認したいと思います。
とはいっても、難しいことは分からないので、IPアドレスを見ていきたいと思います。
具体的にはログに入っているIPアドレスをpythonで抜き出してみます。

# 保存場所
私の環境では、ログファイルの保存場所は下記にあります。
../../usr/local/vpnserver/
packet_log/
server_log/
security_log/


# teratermでやるのがめんどくさい。
ので、今回は、windows上で作業します。
ログファイルたちをzipで圧縮します。

cd ../../usr/local/vpnserver/
sudo zip svlog.zip server_log/
sudo zip sclog.zip security_log/
sudo zip pclog.zip packet_log/

ファイルたちをSSH SCP（ファイルメニュー内）でwindows上に転送します。
[from] ../../usr/local/vpnserver/svlog.zip
[to] windowsローカル

# IPアドレス検出
```python
import re
import requests
import csv
from collections import Counter
from pathlib import Path

# IPアドレス検出パターン
ip_pattern = r'(?:\d{1,3}\.){3}\d{1,3}'

# フォルダのパス
folder = Path('.')  # ここを必要なら変えてね

ip_counter = Counter()

# まずIPアドレスを収集
for txt_file in folder.glob('**/*.log'):
    try:
        with open(txt_file, 'r', encoding='utf-8') as f:
            data = f.read()
    except UnicodeDecodeError:
        with open(txt_file, 'r', encoding='shift_jis') as f:
            data = f.read()

    ips = re.findall(ip_pattern, data)
    # ローカルIP（192.168.x.x）を除外
    ips = [ip for ip in ips if not ip.startswith('192.168.')]
    ip_counter.update(ips)

# IPごとに地域情報を取得
def get_ip_location(ip):
    try:
        response = requests.get(f'https://ipinfo.io/{ip}/json', timeout=5)
        if response.status_code == 200:
            data = response.json()
            return data.get('country', '不明'), data.get('region', '不明')
    except Exception:
        pass
    return '不明', '不明'

# 結果をCSV形式で出力
with open('ip_result.csv', 'w', newline='', encoding='utf-8-sig') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow(['IPアドレス', '回数', '国', '地域'])  # ヘッダー

    for ip, count in ip_counter.most_common():
        country, region = get_ip_location(ip)
        writer.writerow([ip, count, country, region])

print('✅ 結果を ip_result.csv に保存しました！')
```

同じディレクトリ以下にあるlogファイルに対し、IPアドレス及び地域を
csvにて出力します。(openaiにて生成)


# 結果

![スクリーンショット 2025-04-28 191936.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3675614/f8d43eda-3a63-4aa7-b8c0-bd52854cfc4c.png)

思った以上に海外のIPアドレスが出てくる。（この場合隠す必要はないのかも。）
一部の国は、渡航歴があったり、友人の滞在中と思われますが（除外済み）、
それ以外の国で思い当たる節がない国もたくさん出てきます。
中国は、セキュリティの観点上からは、拒否したいところですが、
割と行く地域です。。。。。難しい。
周辺諸国ももちろん出てきます。
欧米諸国も出てきて、いやな気持になります。
本当は、そのログの中身を確認するのがよいのでしょうが、今回は割愛します。

# 対応
セキュリティ向上のために、余計なIPアドレスからのアクセスは拒否りたいと思います。
softether内に「接続元IP制限リスト」があります。
しかし、入力後、「保存」をクリックしても、
「この機能はオープンソース版Softether VPNにはまだ実装されていません。」だそうです。


# とりあえず
うちでは、WXR-5700AX7Pを導入しています。
こちらでは、ルーターセキュリティー>IPフィルターで、対象IPアドレスを拒否れます。
ので、いくつかのIPアドレスを拒否っておきます。
本当は、softether側でホワイトリストの作成ができると一番安心して寝れるのですが。。。
何分、まだ実装されていないようです。
一旦は、怪しいものをルータのブラックリストに追加する形で対応していきます。
【ホンマに初心者】EC2つこてみた

AWSとLINUXの練習としてEC2でデータベースを操作するアプリケーションをデプロイしました．
AIとの壁打ちの履歴を記録します．
# EC2の設定
AMIはAmazon Linux 2としてインスタンスを作成しました．その他の細かい設定などは(https://qiita.com/gyu_outputs/items/f0ab345402362e43db80)を参考にしています．

 # データベースの設定
 あくまで練習のためAWSのAmazon RDSではなく，EC2にデータベースサーバを立てるということにしました．実用性の面は検討していません．

 ローカルで開発していた時はMySQLを使用していたので互換性があるMariaDBをつかうことにしました．以下のコマンドでインストールできます．
 ```
 sudo yum install mariadb-server
 ```
 次に以下のコマンドで起動し，インスタンス移動時の自動起動設定を行います．
 ```
 sudo systemctl start mariadb
 sudo systemctl enable mariadb
 ```
 以下のコマンドでパスワードを設定可能です．
 ```
 sudo mysql_secure_installation
```
次にデータベースの作成を行います．次のコマンドでパスワードを聞かれたら先ほど設定したものを入力してください．
```
sudo mysql -u root -p
```
そして以下のコマンドでデータベースの設定，localhostで接続可能なユーザーの作成，ユーザーへの権限譲渡を行うことができます．
```
-- アプリケーション用のデータベースを作成
CREATE DATABASE your_database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- アプリケーション用のユーザーを作成し、パスワードを設定（'localhost' は同一EC2内からの接続を意味）
CREATE USER 'your_user'@'localhost' IDENTIFIED BY 'your_password';

-- 作成したデータベースに対する全ての権限をユーザーに付与
GRANT ALL PRIVILEGES ON your_database_name.* TO 'your_user'@'localhost';

-- 権限設定を反映
FLUSH PRIVILEGES;

-- MySQLクライアントを終了
EXIT;
```
ここで，your_database_name,your_user,your_passwordの部分は適切に変更してください．

# Node.jsのインストール
筆者はNode.jsでアプリを開発していたためそのまま使おうと思います．
```
-- 利用可能なバージョンの表示
nvm ls
-- 適当なバージョンのNode.jsのインストール
nvm install 'version'
-- defultの設定
nvm alias default 'version'
-- バージョンの確認
node -v
npm -v
```
これでバージョンが表示されていればOKです．ちなみにnpmは単なるパッケージマネジャーです．

# Githubからデプロイ
ここまでくればあとはアプリケーションをデプロイするだけです．Githubからcloneするにはsshキーが必要になるので以下のようにして鍵を共有します．
```
ssh-keygen -t ed25519 -C "your_email@example.com"
```
これで鍵が生成されます．
```
cat ~/.ssh/id_ed25519.pub
```
このコマンドで公開鍵の内容を表示し，それをコピーしGithubの方にも貼り付けます．接続をテストするには以下のコマンドを使います．
```
ssh -T git@github.com
```
これでsuccessful的なことが表示されていればOKです．それでは最後に次のコマンドでアプリケーションをクローンします．
```
-- クローンしたい場所に移動(例としてホームディレクトリ)
cd /home/ec2-user/
-- Githubからクローン
git clone git@github.com:'Githubのユーザ名'/'対象のリポジトリ名'.git
```
lsとかでうまくクローンされているか確認して終わりです．

# おまけ
バージョン管理について．コードを変更した際の同期方法については未開拓です．Github.workflowsとかでうまくできるんでしょうけどめんどくさそう．ひとまずはいちいちクローンする方法をとっています．不要になった古いディレクトリは次のようにして消去してください．
```
-- 中身を空っぽにする
rm -rf 'ディレクトリ名'
-- ディレクトリを消去する
rmdir 'ディレクトリ名'
```
この辺の消去は不可逆な操作なのでくれぐれもお気をつけください．


おわり．
[VRChat] VRChat以外の用途でエクスポートを便利にManual Bake

## ⭐️目的

VRChat以外の用途で使う場合にエクスポートするときに便利なツール

## ⭐️参考

https://qiita.com/YukiLulu0229/items/ffad4ad480223bbf1ba9


## ⭐️インストール

https://vpm.anatawa12.com/avatar-optimizer/ja/

![スクリーンショット 2025-04-27 18.08.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/7fa705dc-788b-4edd-8fbb-819d0ce07899.png)

## ⭐️Manual Bakeの使い方

![スクリーンショット 2025-04-28 19.17.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/ce04300a-6aa7-4261-b0bb-3436956051e0.png)

- ツールタブからManual bake avatarにチェックを入れる

![スクリーンショット 2025-04-28 19.19.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/3f947f08-01e7-403d-82c3-83a63b67627f.png)

そうするとエクスポートに使えるクローン?ができる?で合ってる?
[Mac].commandファイルをDockに固定したい 〜コピペでMacOSアプリを作っちゃおう〜

# 概要 〜なにをするのか〜
.commandファイルはシェルスクリプトでいろいろ自動化ができるので便利なんだ
例えば以下の2つとか。

https://qiita.com/GeneLab_999/items/4edc7bf5a2fa159feb5f

https://github.com/hiroki-abe-58/sort_files

しかし、これはDockに固定できん
これは、commandファイルを実行するためのラッパーとして機能する
シンプルなアプリを作ってしまおうという試みだ。
日頃行っている自動化シェルをDockから呼び出せるようになって便利なのだよ


Windowsの方は以下
https://qiita.com/GeneLab_999/items/c24c0e4f968d9cf76a7c



## 1.MacOSアプリの基本構造を作成
```
mkdir -p ~/<YOUR APP NAME>.app/Contents/MacOS
```

## 2.アプリの実際の動作を定義する実行ファイルを作成
```
echo '#!/bin/bash
open -a iTerm.app /Users/<YOUR USER NAME>/<YOUR COMMAND NAME>.command' > ~/<YOUR APP NAME>.app/Contents/MacOS/<YOUR APP NAME>
```
- #!/bin/bash: シェルスクリプトであることを示しています
- open -a iTerm.app /Users/<YOUR USER NAME>/<YOUR COMMAND NAME>.command :命令本体。「iTerm2を開いて、指定された.commandファイルを実行する」という命令なのだよ


## 3.実行権限を付与
```
chmod +x ~/<YOUR APP NAME>.app/Contents/MacOS/<YOUR APP NAME>
```

## 4.plistファイルを作成する
plistファイルは「Property List（プロパティリスト）」の略称で、
macOSやiOSアプリケーションの設定情報やメタデータを保存するための特別なファイル形式なのだよ。
簡単に説明すると、plistファイルは「アプリの説明書」や「アプリの身分証明書」のようなものなのだよ。例えば：

- アプリの名前
- アプリの識別子
- 実行する実際のプログラムの名前
- アプリのバージョン
- 対応しているOS
- 使用する権限

などの情報が含まれているのだ。
macOSでは、すべての.appファイル（アプリケーション）はContentsフォルダの中にInfo.plistファイルを持っていて、このファイルがないとシステムはそれを正しいアプリとして認識できないのだ。

このファイルがないと、あなたが作成したRunkeeperApp.appはmacOSに「正式なアプリ」として認識されず、Dockに固定しても正しく動作しない可能性があります。
```
mkdir -p ~/<YOUR APP NAME>.app/Contents/Resources
echo '<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>CFBundleExecutable</key>
    <string><YOUR APP NAME></string>
    <key>CFBundleIdentifier</key>
    <string>com.yourname.<YOUR APP NAME></string>
    <key>CFBundleName</key>
    <string><YOUR APP NAME></string>
    <key>CFBundlePackageType</key>
    <string>APPL</string>
    <key>CFBundleVersion</key>
    <string>1.0</string>
</dict>
</plist>' > ~/<YOUR APP NAME>.app/Contents/Info.plist
```

## 5.Dockにドラッグ&ドロップ
完成! アイコンも変えてあげるといいのだよ。

# あとがき
#### WindowsとMacの両方でダブルクリックでシェル動かす方法ないの？
たぶんある。

#### PowerShell 7
Windows/macOS/Linux 共通で動いてくれるのでこんどやってみようと思う。

#### POSIX シェルで書く + shebang方法
以下みたいな感じで書けばWindows 側は WSL または Git Bash を使えばそのまま走るっぽい。今度やってみようと思う。
```
#!/usr/bin/env bash
echo "Hello $1"
```
squirrelのGtOrEqとLtOrEqの使い方メモ

今日Goでコード書いてて、データベースから条件検索するときにつまづいたのでメモ。

## squirrelライブラリとは

squirrelはGo言語でSQLを組み立てるためのライブラリ。生のSQLを書くよりも型安全に書けるので便利。

```go
import "github.com/Masterminds/squirrel"
```


## 色々な比較演算子

### Gt - Greater Than (より大きい)

`Gt`は「Greater Than」の略で、SQLの「>」演算子に相当します。「より大きい」という条件を表します。

```go
// IDが100より大きいレコードを取得
users := squirrel.Select("id", "name").
    From("users").
    Where(squirrel.Gt{
        "id": 100,
    })
```

### GtOrEq - Greater Than or Equal (以上)

`GtOrEq`は「Greater Than or Equal」の略で、SQLの「>=」のこと。「以上」って意味。

```go
// created_atが7日前以降のデータを取る
users := squirrel.Select("id", "name").
    From("users").
    Where(squirrel.GtOrEq{
        "created_at": time.Now().AddDate(0, 0, -7),
    })
```

### Lt - Less Than (より小さい)

`Lt`は「Less Than」の略で、SQLの「<」演算子に相当します。「より小さい」という条件を表します。

```go
// 価格が1000円より小さい商品を取得
items := squirrel.Select("id", "name").
    From("items").
    Where(squirrel.Lt{
        "price": 1000,
    })
```

### LtOrEq - Less Than or Equal (以下)

`LtOrEq`は「Less Than or Equal」の略で、SQLの「<=」のこと。「以下」って意味。

```go
// 値段が1000円以下の商品を取る
items := squirrel.Select("id", "name").
    From("items").
    Where(squirrel.LtOrEq{
        "price": 1000,
    })
```

## 複数条件を組み合わせる

両方使って範囲検索みたいなことをやりたいときは、`And{}`を使って組み合わせる。

```go
// 値段が100円以上500円以下の商品
items := sq.Select("*").
    From("items").
    Where(sq.And{
        sq.GtOrEq{"price": 100},
        sq.LtOrEq{"price": 500},
    })
```

他の条件と組み合わせることもできる：

```go
// 会社IDが3で、作成日が1週間以内のユーザー
users := squirrel.Select("*").
    From("users").
    Where("company_id = ?", 3).
    Where(squirrel.GtOrEq{
        "created_at": time.Now().AddDate(0, 0, -7),
    })
```

## 注意点

* BETWEENを直接書けない（上の例みたいにAnd{}とGtOrEq/LtOrEqを使うか、Expr()で直接SQLを書く）
* 値がnilのときはIS NULL/IS NOT NULLになるので注意
* 配列を渡すとIN句になる

## まとめ

squirrelを使うとSQLを安全に書けて便利。GtOrEqとLtOrEqは「以上」「以下」の条件を書くときに使う。複数条件はAnd{}やOr{}で組み合わせる。

## 参考

https://pkg.go.dev/github.com/Masterminds/squirrel

https://poniblog.com/posts/tech/squirrel-1/
【Rails】railsがインストールできない！時の対処法

# gem install railsが実行できない場合

以下のエラーが出てきた場合です。

```sh
% gem install rails
ERROR:  While executing gem ... (Gem::FilePermissionError)
    You don't have write permissions for the /Users/testuser/.rbenv/versions/3.4.3/lib/ruby/gems/3.4.0/gems/rails-8.0.2/MIT-LICENSE directory
```

「**書き込み権限がないっすよ！**」って言われてますね。ってことは、書き込み権限を付与すればいいのです。ｴｯﾍﾝ<(￣＾￣)>

## 1. gemを保存するディレクトリを作成

```sh
% mkdir -p $HOME/.gem/ruby
```

## 2. .zshrc にパスを追加

まず、.zshrcの中身を確認しておきましょう。

```sh
% vi ~/.zshrc

# または

% cat ~/.zshrc
```

次に、以下のコマンド二つを実行します。

```sh
% echo 'export GEM_HOME="$HOME/.gem/ruby"' >> ~/.zshrc

% echo 'export PATH="$HOME/.gem/ruby/bin:$PATH"' >> ~/.zshrc
```

次に、以下のコマンドを実行して、パスを反映させます。

```sh
% source ~/.zshrc
```

## gem install rails を実行

```sh
% gem install rails
Fetching rails-8.0.2.gem
Successfully installed rails-8.0.2
Parsing documentation for rails-8.0.2
Installing ri documentation for rails-8.0.2
Done installing documentation for rails after 0 seconds
1 gem installed
```

できた！
TurbonomicによるOpenShift Virtualizationの仮想マシン管理

Turbonomic バージョン 8.15.6 （2025年4月リリース）以降、Red Hat OpenShift Virtualization（以下OCP Virt）を介して OpenShift クラスターにデプロイされた仮想マシンをサポートするようになりました。

https://www.ibm.com/docs/ja/tarm/8.15.x?topic=targets-red-hat-openshift-virtualization

今回はOCP VirtをTurbonomic管理対象に追加した際に利用可能な機能についてご紹介します。


## OCP VirtをTurbonomicの管理対象に追加するには？
[こちら](https://qiita.com/YoHey/items/703324d621d3985b83c8)の記事をご参照下さい。

:::note info
特にOCP Virtだからといって特別な手順は必要なく、通常の（コンテナだけを管理する場合と同様に）OpenShiftとしてターゲット追加頂くのみです。
但し、サポートされている[OCPバージョンなどの前提](https://www.ibm.com/docs/ja/tarm/latest?topic=targets-red-hat-openshift-virtualization) はありますので、念の為ご認識下さい。
:::


## Turbonomic上のOpenShift Virtualization 仮想マシン
Turbonomic では、OpenShift Virtualizationの仮想マシンは**ワークロード・コントローラー**として表現されます。また、**仮想マシン**としてTurbonomic上に表示されているものは、実体はKubernetes環境におけるワーカーノードを指しますので、ご留意ください。

:::note info
Turbonomic上の**仮想マシン**エンティティは、実際にはOpenShiftクラスター内のワーカーノードを表します。
| Turbonomic上の表現 | 実体 |
|:-:|:-:|
| ワークロード・コントローラ  | OCP Virtの仮想マシン  |
| 仮想マシン  |OpenShiftクラスター内のワーカーノード   |
:::

実際の例を一つご紹介します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3082344/f89e9544-3622-4a71-a5d2-83686d0020b3.png)


**ワークロードコントローラー**のエンティティには、OCP Virtの仮想マシンが**コンテナポッド**として関連付けられていることに注意してください。



Turbonomic で OpenShift Virtualization 仮想マシンの**移動**を実行するには、ワークロードコントローラーに関連付けられたコンテナポッドを移動する必要があります。Turbonomic では、これらのコンテナポッドに、実行可能な移動アクションが含まれています。

OpenShiftでは、コンテナポッドは定義、デプロイ、管理が可能な最小のコンピューティングユニットです。OpenShiftクラスター上に仮想マシンを作成すると、これらのポッドが（仮想マシンごとに1つ）実行され、最終的に複数のワーカーノードに配置されます。
ノードで輻輳が発生した場合、これらのコンテナポッドをあるワーカーノードから別のワーカーノードに移動する必要があります。 

## 実際の仮想マシンの移動アクション例
**移動**アクションが生成されると、コンテナポッド（実体はOCP Virtの仮想マシン）に対して次の画像のような詳細が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3082344/5d652f16-ba79-4fb2-8ec1-12ee7a380d4f.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3082344/e94f8191-2f12-4c2e-a6f6-35ff5294f4bf.png)



これらの画像には、注目すべき重要なポイントがいくつかあります。
* まず、アクションに関係する仮想マシン（ワーカーノード）のエンティティです。この場合、コンテナポッドが存在する仮想マシンはworker2.ocpv.cp.fyre.ibm.comです。Turbonomicがコンテナポッドの移動先として計画している仮想マシンはworker0.ocpv.cp.fyre.ibm.comです。
* 次に注目すべき点は、提案された変更によるCPUとメモリへの影響です。この場合、ソース仮想マシンではリソース使用量が減少しますが、ターゲット仮想マシンではリソース使用量が増加します。 また、そのBefore/Afterが事前に可視化されています。

* 最後に、これらのアクションは実際に（自動化を含めて）Turbonomicから実行可能です。アクションが完了すると、OpenShift の新しいワーカーノード上で仮想マシンが中断なく稼働されます。
* そしてこれらの変更された構成（新しいポッド名や更新された仮想マシンエンティティなど）は、10分毎のTurbonomicの検出サイクルで更新され、必要があれば更なる推奨アクションが生成され続けます。

## まとめ
いかがでしょう、このOCP Virtの仮想マシンのノード間の**移動**機能は、OCP Virtualization がインストールされたOpenShift ターゲットをTurbonomic インスタンスに追加するだけで利用可能となります。
これは、言ってみれば、VMwareの上位ライセンス（vSphere Enterprise Plus）でご利用可能であったDRS（Distributed Resource Scheduler）と同等のノード間のリソース最適化機能が、OCP Virt環境でも簡単にご利用頂く事が可能なものとなりますので、Turbonomicのライセンスをお持ちであれば使わない手はありません！是非お試し頂ければと存じます。

#### 補足：
なお、今回公開されたバージョン8.15.6では、OCP Virtをサポートする初期リリースとなり、利用可能な機能は限定的ではありますが、今後、従来のVMware向けで提供されていた各種機能（仮想マシン自体の動的なサイズ変更や、環境最適化のシミュレーションなど）は追って実装が予定されておりますので、そちらについても続報を是非ご期待頂ければと思います！
ANO88_NET

This topic needs more attention in the media.

<a href="https://ano88.net" rel="nofollow">ano88</a>

Very eye-opening, thank you.

FACEBOOK: https://www.facebook.com/ano88official/
TELEGRAM: https://t.me/ano88Official
INSTAGRAM: https://www.instagram.com/ano88official/
PINTEREST: https://www.pinterest.com/ano88official/
YOUTUBE: https://www.youtube.com/@ano88Official
X: https://x.com/ano88official
【JavaScript】for...in と for...of の違いをわかりやすく解説！

JavaScriptでループ処理をするとき、よく出てくる**for...in**と**for...of**。
使い方が似ているようで、実は役割が違うんです！

この記事では、「それぞれの特徴」と「実際の使い方」について、初心者にもわかりやすくまとめます！
### ✅️for...in と for...of の違い

<table>
<thead>
<tr><th>構文　　<th>取り出すもの<th>使う場面<th>配列への適正　
<tbody>
<tr><tr><td>for...in<td>キー（インデックス番号やプロパティ名）<td>オブジェクトのプロパティを回すとき<td>あまり適していない
<tr><tr><td>for...of<td>値（中身そのもの）<td>配列や文字列を順番に回すとき<td>適している
</table>

### ✅️それぞれの使い方
#### for...in の例（オブジェクト向き）
```
const user = {
  name: "Yuki",
  age: 28,
  city: "Osaka"
};

for (let key in user) {
  console.log(`${key}: ${user[key]}`);
}
```
出力：
```
name: Yuki
age: 28
city: Osaka
```
💡key にはオブジェクトのプロパティ名（"name", "age", "city"）が入ります。
#### for...of の例（配列向き）
```
const fruits = ["apple", "banana", "orange"];

for (let fruit of fruits) {
  console.log(fruit);
}
```
出力：
```
apple
banana
orange
```
💡fruit には配列の要素そのもの（"apple"など）が順番に入ります。

### ✅️配列を回すときは for...of がオススメ！
実は、配列にもfor...inは使えます。 例えばこんなふうに書けば動きます。
```
const fruits = ["apple", "banana", "orange"];

for (let index in fruits) {
  console.log(fruits[index]);
}
```
ただし、for...inはもともとオブジェクト向けなので、
配列にはfor...ofを使うのが自然で安全です！

理由は、
- 配列の順番を保証してくれる
- 余計なプロパティを拾わない
- コードが読みやすい

など、たくさんあります！

#### ✒️実務ではどうなの？
現場は、こういった配列を反復処理するときは基本的に
**for...of**
**forEach**
**map** 
のどれかを使うことが多いです！

間違った使い方をするとバグにつながりやすいので、
**用途に合った書き方を選ぶ** ことがすごく大切です！

### ✅️まとめ
**for...in**はオブジェクトを回すときに使う。
**for...of**は配列や文字列を回すときに使う。

配列には**for...of**を選ぶのがベスト！
他にも適宜**forEach**,**map**を用いるとグット！

正しいループの使い分けができると、コードもきれいでバグが減ります✨
これからどんどん実践して、使いこなしていきましょう！
copilotが意味不明なリスト内包表記書いてきた

こんにちは、久しぶりに記事を書く六角レンチです。
Copilot無料版で使ってますがすごい優秀なので楽しいです
# 問題のコード(関数)
とりあえずこのコードを見てほしい
```py
def flat_3d_to_2d(input_data: list[list[list[float]]]) -> list[list[float]]:
    return [[i for row in data for i in row] for data in input_data]
```
3次元のリストを2次元のリストに展開する感じの関数を書こうと`def flat_3d_to_2d`まで書いたら残りをCopilot君が全部書いてくれた
<br>
なにこれ？？？？？？？？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3594202/13699f64-1d83-43b5-95b8-e73af84494a5.png)
しかもちゃんと期待した動きをする
# for文のあとにfor文が続く？？
この関数の特に意味不明なポイントはリスト内包表記の部分
(型ヒントがでかすぎるのは気にしない)
```py
[i for row in data for i in row]
```

普通のリスト内包表記であれば
```py
[変数 for 変数 in イテラブル]
```
って感じで使われるものの左に使うものがある
三項演算子も

```py
真の時の値 if 条件式 else 負の時の値
```

って感じで(真の時が普通だと考えれば)左にある感じ

なのにこの関数のfor文は二つもあって使うもの使われるものより左にある。
左に流れていくイメージがあるのでなんか違和感がすごい
# 公式ドキュメントを読んでみよう

https://docs.python.org/ja/3/tutorial/datastructures.html#list-comprehensions

上のpython公式ドキュメントのリスト内包表記の部分を見ると、下のように書いてある。
> リスト内包表記は、括弧の中の 式、 for 句、そして0個以上の for か if 句で構成されます。 リスト内包表記の実行結果は、 for と if 句のコンテキスト中で式を評価した結果からなる新しいリストです。 例えば、次のリスト内包表記は2つのリストの要素から、違うもの同士をペアにします。
> ```py
> [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
> ```
> これは次のコードと等価です:
> ```py
> combs = []
>for x in [1,2,3]:
>    for y in [3,1,4]:
>        if x != y:
>            combs.append((x, y))
> ```
> for と if 文が両方のコードで同じ順序になっていることに注目してください。

if文が一番後ろに付くのずっと違和感あったけどそういう理由あったんだな...

これをもとに考えてみると
```py
[i for row in data for i in row]
```
は
```py
a = []
for row in data:
    for i in row:
        a.append(i)
```
ということになる

# 結論

見た目はすっきりするしリスト内包表記だから多分普通に書くより速くなると思うけど可読性が~~ゴミ~~あまりよくないしわかる人が少なそうなので使わない方が無難かもしれない
後ろじゃなくて前に足していけばわかりやすくて使いたくなるんだけどな...
[writeup] picoCTF "where are the robots"

# 今回の問題
picoCTFより"where are the robots"を解いていきます。

# 実際に解いていく
### 1. 問題文にあるWebサイトに移動する
![where are the robots_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945501/2ae5d6eb-c4f6-4afd-bdd4-a36b03b467be.png)
「ようこそ　ロボットはどこですか？」
このサイトにはこれ以上ないみたいです。

### 2. Webインスペクタを開く
![where are the robots_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945501/d3989b70-86e8-44ab-91f5-40fba94a8dbb.png)
次の手が浮かんでこないので、とりあえずWebインスペクタを開きました。
しかし、これといった怪しい情報も見つかりません。
どうしよう、困ったな...

### 3. ヒントを見る
![where are the robots_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945501/ebf92049-4be9-4b92-b99f-336d9f81fae0.png)
そういえば、ヒントがあったことを思い出しました！
ここは素直にヒントを見ます。
ふむふむ。「ウェブサイトのどの部分を見れば、作成者がユーザーに見られたくない場所がわかるでしょうか?（Google翻訳より）」
なるほど！！robotsというキーワードと、ヒントの内容を組み合わせると、答えが浮かんできました。

### 4. "robots.txt"を見る
![where are the robots_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945501/269c4bc7-9258-4320-a6b6-acb9dd9b5163.png)
問題文のURLの後ろに”robots.txt"をつけると、Webサイトが変わります。
そこには「Disallow: /8028f.html」と書いてありました。

### 5. "/8028f.html"を見る
![where are the robots_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945501/d2d8c2a1-5e68-4a69-b3dc-cdbc48122677.png)
最初のURLの後ろに”/8028f.html”をつけると、Webサイトが変わり、FLAGが現れました！
これにてFLAG獲得です！

# もう少し考えてみる
突然出てきた「robots.txt」とは一体何者なのか。簡単にですが、まとめてみます。

1. Webサイトにはクローラーが存在する
クローラーの目的は「インターネット上の情報を集めること」です。
クローラーは、「ボット（自動プログラム）」の一種で、人間の代わりにウェブサイトを見て回って、情報を集めています。
・どんな内容か？
・他と比べてどれくらい重要か？
・キーワードは何か？ 
みたいな情報をもとに、検索結果を作っています。
2. クローラーから隠したい
クローラーに見られたくない情報もあるのです。
例えば、
・秘密の情報を収集されたくない
・サーバーに負荷がかかるからアクセスされたくない
・コピーされて悪用されたくない
などの理由があります。こんなときに、robots.txtやアクセス制限をかけて、クローラーが見られないようにします。
2. robots.txtとは
robots.txtとは、クローラーに対して「ここは見ないでください」と指示するファイルです。
その構成は
・User-agent→指示を適用したいクローラーを指定
・Disallow→クロールしてはいけないWebページを指定
・Allow→クロールしてよいWebページを指定
・Sitemap→Webサイトの構成を示すxmlファイル
から作られます。
4. robots.txtの注意
robots.txtで、Disallowに指定したページは、クロールされません。
しかし、**人間は意図的に検索することが可能**です。
決して、誰にも見えない秘密のページではないので、お間違えないように...



# まとめ
今回のFLAGは、robots.txtのDisallowに指定されたページにありました。
robots.txtは「秘密を隠すファイル」ではありません。
「秘密の場所を教えてしまうファイル」でもあるのです。


# 補足
・本当に隠したいファイルはどうするべきなのか
→本当に隠したいなら、認証制御、IP制御、ファイアウォールなどを使うべきです。
・robots.txtに関連する事件は多数発生しているので、調べてみると面白いかもしれません。