OmniAICreator/Qiita-1.07M huggingface dataset:
Google Cloud でIPv6対応のVPNを構築する

# 筆者について

```
name → Koki Teramoto
age → 18
language → ja_JP, en_US
```

# 本編

僕のTailscaleネットワークではVPNの出口ノード用サーバーを構築しています。要は、普通にVPNのサーバーと同じ役割のものなので、それにIPv6の機能を載せよう！って感じのやつです。例えば楽天証券とかはSSLに対応した接続じゃないとそもそも売買できなかったりするので（というかそもそもそんな危ない接続で証券取引をしたらダメなのですが）、セキュリティを高めるためにもぜひ参考にして試してみてください。

## 前提条件

- Google Cloudのアカウントを作成している

## 構築手順

### サーバー構築編

まずはIPv6に対応したサブネットネットワークを作成しましょう。ここで対して例を挙げるほどの難しい入力項目もないので詳しい説明は省かせてもらいますが、一つだけ、このサブネットのIPスタックタイプは必ず「IPv4 と IPv6（デュアル スタック）」にしてください。そもそもIPv4のシングルスタックであればデフォルトのVPCとほぼ変わらないですし、IPv6のシングルスタックにしてしまうとIPv4のみに対応したサービスを利用できなくなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583428/546919dc-d222-44ce-af6e-0e7991e457d1.png)

VPCを作成したらこのVPCを利用したインスタンスを作成しましょう。他はなんでもいい（無料枠でも問題ない）です。ちなみに参考までに、僕の環境はFedoraです。

### サーバー設定編

さて、まずはTailscaleにログインしていきましょう。とその前に、Tailscaleにそれをインストールしていきます。

```bash
curl -fsSL https://tailscale.com/install.sh | sh
```

続いてログインしていきましょう。

```bash
tailscale up
```

さて、次はIPフォワーディングを有効にしましょう。

https://tailscale.com/kb/1019/subnets

```bash
echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
sudo sysctl -p /etc/sysctl.d/99-tailscale.conf
```

もしくは

```bash
echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p /etc/sysctl.conf
```

firewalldを使っている場合は以下のコマンドでIPアドレスをマスクするように設定します。

```bash
firewall-cmd --permanent --add-masquerade
```

これで

```bash
tailscale up --advertise-routes=10.0.0.0/16
```

`--advertise-routes=`の後ろはVPCのCIDRブロックを指定してください。

### あとは接続するだけ！

あとはExit Nodeとして利用しましょう。下のリンクを参考にしながらぜひ利用してみてください

https://tailscale.com/kb/1103/exit-nodes#use-the-exit-node

## （参考）スピード計測

参考までにスピード計測しておいたものを掲載しておきます。

### VPNなし

![IMG_0626.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583428/3da7832a-6284-4777-8b0f-988ec1e1195c.jpeg)

### VPNあり

![IMG_0627.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583428/676b6462-d007-4312-bb49-1dc83430ff1f.jpeg)

ここを見ても分かる通り、ちゃんとVPNを使っているとプロバイダがGoogle Cloudになっています。やっぱりWireguardって爆速なのですね！

# 最後に

僕は今日に至るまでに何度かTailscaleのネタをあげていますが、もうそろそろネタがつきそうなところです。僕個人的にはとても気に入ってるし普段から常用しているので今後ともTailscaleの成長には乞うご期待というところでしょうか。
リバースエンジニアリング（逆コンパイル）からアプリを守る方法

## 難読化でコードを読めなくする
前回の記事で見たように、.NETアプリのコードはそのままでは簡単に解析されてしまいます。そこで重要になるのが**難読化（Obfuscation）**です。難読化とは文字通り「読みにくくする」ことで、プログラムの実行結果や機能はそのままに、**コードの中身だけ第三者には理解困難な形に変換**します[^1]。この処理を行う専用ツールの一つが、Microsoft Visual Studioにもバンドルされている**Dotfuscator**です[^2]。

Dotfuscatorは2003年からVisual Studioに同梱されている実績あるツールで、ソースコードを改変せずにアセンブリ（DLLやEXE）のバイナリを難読化します[^2]。難読化後のアセンブリは、難読化前と**機能的に同一**であり、実行結果も変わりません[^1]。

では難読化を適用すると具体的に何が起こるのでしょうか？主なポイントは次の3つです[^1]：

- **名前の変更**: クラス名、メソッド名、変数名などを意味のない文字列に置き換え、役割を推測できなくします。
- **文字列の暗号化**: コード中に埋め込まれた文字列リテラルを暗号化し、実行ファイル中から直接検索できないようにします。
- **制御フローの難読化**: 本来の処理の合間に無意味な分岐や計算などの**ダミーのコード**を挿入し、解析者がコードの流れを追いにくくします。

こうした難読化処理によって、逆コンパイルしても**元の意図した構造や内容が読み取れないコード**に変換できるのです[^1]。

## 難読化前後のコード比較
では、難読化を適用する前後で実際にコードがどう変わるか比較してみましょう。**難読化適用前**は、コメント以外のコード要素はそのまま再現されてしまいます。例えば以下のようなメソッドがあったとします：

```csharp
// 難読化適用前のコード例
private string HelloName(string name) {
    return "Hello, " + name + "!";
}
```

このコードを難読化ツールに通すと、**メソッド名や変数名は無意味なものに変更**され、**文字列 "Hello" も暗号化**されます。難読化後に逆コンパイルした結果の一例を見てみます[^1]。

![after_obfuscate.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4031922/79d943f6-9321-4c35-97f7-77bbf43bfe0d.png)



難読化適用前と比べて、メソッド名や変数名が`a`や`A_0`のような識別不能な名称に変わり、コード内部も短い整数や条件分岐だらけの複雑な構造に書き換えられているのが分かります。文字列リテラルも直接は現れず、元の意味を推測することは困難です。さらに、見覚えのない処理（ダミーコード）が大量に追加されており、コードの流れを追うだけでも非常に時間がかかることが予想されます[^1]。

このように難読化を施すことで、**逆コンパイル後のコード解析難易度を飛躍的に高めることが可能**です。

## Dotfuscatorを使った難読化の手順
実際にDotfuscatorを使ってアプリケーションを難読化する手順を見てみましょう[^3]。DotfuscatorはスタンドアロンでもVisual Studio統合でも利用できますが、ここではスタンドアロン版を使用する想定です。

1. **アセンブリの読み込み**: Dotfuscatorを起動し、自分のアプリケーションのビルド済みアセンブリ（exeやdllファイル）をドラッグ＆ドロップします[^3]
![P012-08.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4031922/5994c202-cd6e-4f3b-8526-633a62473638.gif)

2. **難読化オプションの設定**: デフォルトでも基本的な難読化は有効ですが、より強力な難読化を行うには追加のオプションを設定します[^3]
![P012-09.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4031922/91c0c121-f3ed-4d80-8b4e-b199f33a4808.gif)

3. **難読化済みアセンブリの出力**: 処理が完了すると、指定した出力先に**保護されたアセンブリ**が生成されます[^3]。

### Dotfuscatorのエディションについて
Visual Studioに付属する無料版「Dotfuscator Community」エディションでは、利用できる難読化機能が**名前の変更のみ**に限定されています[^2]。高度な難読化や改ざん検出など**すべての保護機能**を利用するには、有償の「Dotfuscator Professional」エディションのライセンスが必要です[^2]。

以上のように、Dotfuscatorを使えば**実践的に.NETアプリの逆コンパイル対策**を施すことができます。難読化されたアプリは、そうでないものに比べて解析が格段に難しくなるため、**ソースコードの盗用や不正解析のリスク低減**に大きく役立ちます。大切なアプリケーションをリバースエンジニアリングから守るために、ぜひ難読化の導入を検討してみてください。

### Dotfuscatorの評価版を試してみる

難読化の効果を実感したい方は、[Dotfuscatorの評価版](https://www.agtech.co.jp/preemptive/dotfuscator/trial/)を試してみるのも良いでしょう。公式サイトからダウンロードし、自社アプリに適用することで、その効果を確認できます。

---

## 参考文献
[^1]: [.NETアプリの逆コンパイル対策、その具体的な方法とは？（難読化の実例付）](https://www.agtech.co.jp/blog/2021/05/reasons-to-protect-dotnet-application/)  
[^2]: [.NET用の難読化ツール | Microsoft Visual Studioに無料版がバンドル！](https://www.agtech.co.jp/preemptive/dotfuscator/product/)  
[^3]: [SQL インジェクションからデータベースを守るひとつの方法 -難読化ツールの紹介- | Blog | AG-TECH](https://www.agtech.co.jp/blog/2022/09/introduction-of-obfuscation-tools/)
[Mac] CapsLock を Swift で ON/OFF する方法

#### 次のコードで実現できます

```swift
import IOKit
import IOKit.hid

func SetCapslockState(_ enabled: Bool) {
    guard let serviceDictionary = IOServiceMatching(kIOHIDSystemClass) else { return }
    
    let ioService = IOServiceGetMatchingService(kIOMainPortDefault, serviceDictionary)
    if ioService == MACH_PORT_NULL { return }
    
    var ioConnection: io_connect_t = 0
    let result = IOServiceOpen(ioService, mach_task_self_, UInt32(kIOHIDParamConnectType), &ioConnection)
    IOObjectRelease(ioService)
    
    if result == KERN_SUCCESS {
        IOHIDSetModifierLockState(ioConnection, Int32(kIOHIDCapsLockState), enabled)
        IOServiceClose(ioConnection)
    }
}

func GetCapslockState() -> Bool {
    guard let serviceDictionary = IOServiceMatching(kIOHIDSystemClass) else { return false }
    
    let ioService = IOServiceGetMatchingService(kIOMainPortDefault, serviceDictionary)
    if ioService == MACH_PORT_NULL { return false }
    
    var state = false
    var ioConnection: io_connect_t = 0
    let result = IOServiceOpen(ioService, mach_task_self_, UInt32(kIOHIDParamConnectType), &ioConnection)
    IOObjectRelease(ioService)
    
    if result == KERN_SUCCESS {
        IOHIDGetModifierLockState(ioConnection, Int32(kIOHIDCapsLockState), &state)
        IOServiceClose(ioConnection)
    }
    
    return state
}
```

#### 使い方


```swift:CapsLock状態を設定する
//連動して実キーボードのCapsLockを示すLEDがOn/Offします

SetCapslockState(true) //CapsLockをOnにする

SetCapslockState(false) //CapsLockをOffにする
```

```swift:CapsLock状態を取得する
let capsLockState = GetCapslockState()
//true ：CapsLock On状態
//fasle：CapsLock Off状態
```

---

_`macOS Sonoma 14.7.2 (23H311)`,<br>`swift-driver version: 1.90.11.1 Apple Swift version 5.10 (swiftlang-5.10.0.13 clang-1500.3.9.4)`_
および
_`macOS Sequoia 15.3.1 (24D70)`,<br>`swift-driver version: 1.115.1 Apple Swift version 6.0.3 (swiftlang-6.0.3.1.10 clang-1600.0.30.1)`_
で動作確認済み。

<br>Swift Repl でも可。<br><br>　

**以上**
流体解析における計算時間を比較: Fortran, MATLAB, C++, Python

# 動機
流体解析においてどの言語を使うと計算時間が短くなるか気になったので，馴染みのある言語（Fortran, MATLAB, C++, Python）を用いて簡単なプログラムを作成し，計算時間を測定することにしました．既に似たような記事が沢山存在してると思いますが，自分で実感してみたかったので許してください...

Pythonの場合は明らかに計算が遅いのでNumpyと並列処理を使って計算速度が速くなるように努めました．他の言語の場合は高速化を意識せずに書きましたが，無駄な処理が生じないように気をつけました．アルゴリズムは全て大体同じです．

ソースコードは一身上の都合により省略させていただきます．

# 計算手法の簡単な説明
低レイノルズ数における円柱周りの流れを計算し可視化するプログラムを作成しました．
円柱の軸に垂直に左側から一様流が当たるとします．
また，ここでは2次元非圧縮性，外力無しの流れを考えます．

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531123/a90a5830-2328-4556-8f08-e66b5439da18.jpeg" width=40%>

解析手法は流れ関数-渦度法を使用し，メッシュは円柱の境界に沿うように極座標系で作成し，さらに円柱付近が細かくなるようにしました．

低レイノルズ数の場合は十分な時間が経過すると定常流れになると考えられるので，計算コストを削減するために$y>0$の領域のみ考慮します．

# 計算結果
生成したGIF画像の一部です．アップロード出来る容量が10MBまでなので，カット&圧縮しました．
![cylinder_flow_Re150-ezgif.com-resize.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531123/cea10259-7068-4b91-84d9-38965ec91895.gif)


# 計算時間
ここでは実行開始から数値の算出までの時間を計測しており，グラフ生成やデータ出力する処理などに要した時間は含まれていません．

C++やFortran等のコンパイラ言語の場合，コンパイラにオプションをつけることで更にコードを最適化できますが，ここではオプション無しで比較します．

|言語  |コンパイラ | 計算時間 [s] |
|---|---|---|
|MATLAB  |-|1.12|
|Fortran |gfortran(default)  |2.04|
|C++ |g++(default) |4.87|
|Python(並列処理) |- |64.0|
|Python(逐次処理) |- |213 |

実行環境：M1 Pro Macbook Pro，Mac OS 15.3，ローカル環境

# まとめ
使用する言語によって所要時間が約2〜数百倍も変わっています．本格的に流体解析を行う場合，不適切な言語を用いると膨大な時間を損することになるので，言語の選択がとても重要であることが実感出来ました．


お金を払える方はMATLAB，お金を使いたくない人はFortranら辺がおすすめです．大学生であればMATLABを無料で使える可能性が高いので，調べてみてください．
私の中で基本情報技術者試験の取得要否に決着がついた話


## はじめに

こんにちわ。皆様いかがお過ごしでしょうか。
長年私を悩ませていたFEいるのかいらないのか問題。
人に聞いたり記事を読んだりと、色んな意見を聞きまくった結果、本当によくわからず、どうすれば良いのか悩み続けていました。
そんな私のような混乱している子羊の背中を押せたら良いなと思い、記事にしてみました。

## 私について

- へっぽこエンジニア９年目
- テスター６年（金融案件、証券案件、オフショアなのでプログラミングなし）
- プログラマー３年（社内PG/PHPメイン）
- 高卒（普通科）
- 中学生の時にHTMLを弄ってみたが、齧れてもいなかった
- ネットワーク、セキュリティ等はマジ訳わからん
- データベースはDMLを扱える程度で細かいチューニングは出来ない
- サーバー構築は出来ない


未経験でこの職種について、単独で金融案件に参画。案件内のメンバーも技術的な部分についての知識が弱く、聞くにしても何から抑えていくべきなのかが全くわからなかった。
他案件の方々にいろいろ聞くも、色んな意見に勝手に振り回されてしまい、行動出来ずに。そんな状態で基礎力に不安を抱えたまま、業務を続ける日々。
このままではキャリアを進める事が出来ないと思い、プログラムの経験が必要だと考え、プログラミングの勉強をし始める。丁度その頃に知人の会社で空き枠が出来、実務を積むために年収を落としてプログラマーとして転職。
なんだかんだで３年が経過し、ここ数か月で必要だと改めて思い、今に至る。

## 必要か否か色んな人に聞いてみた

| 回答者 | 経歴 | 回答 | 備考 |
| ---- | ---- | ---- | ---- |
| SE | ０年目、文系大学出身のお姉様、FE未取得 | 必要 | 上司が取ってほしいと言っていた |
| SE | ？年目、不明、文系大学出身のお姉様の上司 | 必要 | 基礎的な部分で話が通じないと困る |
| PM | ８年目、大学生物学専攻、FE取得済、通称鬼軍曹(笑) | 必要 | ただ取得するだけでは意味がないため、理解する事が大切 |
| SE | ？年目、情報系専門出身、FE取得済 | 不要 | 無くても仕事は出来る |
| SE | ２０年目、情報系専門出身、FE未取得 | 不要 | 無くても仕事は出来る |

それぞれで回答がバラバラだ…

## 共通点や思った事
今思えば、上記の方々に共通点があった。
上記の全員がエンジニアの基礎として必要なカリキュラムを受ける、もしくはFEの勉強を行っていたということ。
それって、即ち必要だということでは？
多分、専門的に学んでいない場合は、FE取得を通して基礎をまず固めていくのが良いのかな。

## 昔に聞いた話（10年～15年前）

今から10年～15年前に周りのお姉様から聞いたお話。

- お姉様は知人からツテで採用されたエンジニア。上司がこんな話をしていたとのことだった。
- 「昨今はFEさえも取得していない文系エンジニアが多く、基礎的な部分で話が通じなくて困っている。」
- 「まずは、FEを取得してもらえると、大変助かる。」


## 昨今の流れ（ここ数年）

- 大学入試で「情報I」必須科目として導入

IT知識の重要性について、世間の認識が昔よりも遥かに上がっているのではないか。
基礎知識に関しては、一般教養として認識され始めていそうなんて思ったり。


## 取得するしないのメリデメ（私の場合）

| 取得 | メリット | デメリット |
| ---- | ---- | ---- |
| 取得する  | ・基礎知識が体系的に身に付く<br>・自信が少し付く<br>・以前よりも業務での内容で不明な点が減る<br>・担当外のセクションとの会話がよりスムーズになりそう<br>・理解できる事が多くなって、更にこれからの人生が楽しくなりそう<br>・基礎知識があると、定着度が上がり、その後の学習効率が飛躍的にあがるらしい | ・年次的にFEしか取得していないと思われる可能性がある |
| 取得しない | ・試験費用が節約できる | ・対外的に基礎があるかどうかを証明出来ない<br>・参画する案件によって、理解度に偏りが発生する場合にカバーが出来ない |

## 結局、私はどうしたいのか
- 理系出身ではない私にとってメリットがとても多いのに、何に悩んでいたんだろうと思いました。(苦笑)
- 年次的にどうこう思われてもいいから、理解出来る事多くなるから、この先楽しいだろうなあ。
- FE取得を通して基礎を固めることで、己に自信を付けてあげたいなと思いました。
- 今までの知識がなんとなく断片的な感覚があるので、体系的な知識を学ぶことで、頭の中がもう少し体系化されるのではないか思いました。
- 仕組みで課題を解決していくのがエンジニアならば、手法を選定するための最低限の知識として勉強したいと思いました。

## その他
### 参考になった記事やサイト等
https://note.com/ntom_tech/n/nd19500b639b6
https://zenn.dev/mesi/articles/88ff0f11a631c6
https://tech89.net/info/kyoututest/
https://diamond.jp/educate/articles/johosugaku-zoshinho/400140/
junit private eunm 変数設定方法

```

------------junit private eunm 変数設定方法

Class<?>enumClass = Class.forName("対象変数");

method = targetClass.class.getDeclaredMethod(enumClass );

method.setAccessible(true);

Object enumVale = Enum.valueOf(Class<Enum>) enumClass);

result = (boolean)method.invoke(target,enumVale);
自動で係り受けのあるネガティブカテゴリを作成する(SPSS Modeler データ加工逆引き13-11)

# 自動で係り受けのあるネガティブカテゴリを作成する

![スクリーンショット 2025-02-27 10.51.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/887a138b-2a0c-4597-adfd-8a3870cb179f.png)

この記事はSPSS Modeler Premium Ver18.6から追加された日本語テキスト機能を利用して書かれています。SPSS Modeler Professionalをお使いの方はアップグレードするかPython連携を用いて実現します。

Python連携を紹介する記事はこちら

https://qiita.com/harrowharrow16/items/248ff8fe3879b63e7ae3

## 1.想定される利用目的

・文章に含まれるポジティブ/ネガティブの要素を係り受けと組み合わせてフラグ化します。

## 2.ストリームとデータのダウンロード

ストリーム

https://github.com/yoichiro0903n/blue/raw/refs/heads/main/link_auto.str

## 3.サンプルストリームの説明

![スクリーンショット 2025-02-27 10.42.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/4bf033e7-f80a-4158-a072-c69172fd59d1.png)

a.入力データは以下の通りです。

![スクリーンショット 2025-02-27 10.43.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/3b31a3af-1cdf-4632-b54d-fc16e69ea630.png)

b.[テキストマイニング]ノードを編集します。[IDフィールド]と[テキストフィールド]を以下の通り選択します。

![スクリーンショット 2025-02-24 11.53.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/f98790bb-c67d-46a9-8f48-2e90288976ef.png)

[モデル]タブを編集します。[テキストリンク分析...]を選択します。感情を識別するために[リソーステンプレート]を[読み込み]ボタンを押して[Opinions(Japanese)]を選択します。

![スクリーンショット 2025-02-27 10.43.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/a432ed7b-b522-4029-b899-f7dd72f5379d.png)

[実行]します。右上のドロップダウンリストから[カテゴリーとコンセプト]を選択します。

![スクリーンショット 2025-02-27 10.33.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/4361eb86-6a8b-4a5d-a086-4a90f3231d45.png)

左上の[作成]ボタンを押して自動でカテゴリーを作成します。メッセージが表示されたら[編集]を選択します。

![スクリーンショット 2025-02-27 10.33.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/b0e03ef2-4eab-4374-b44f-7d04d5d40355.png)

以下のように設定して[カテゴリー]を選択します。

![スクリーンショット 2025-02-27 10.33.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/34b885ea-59a0-40a8-a8d1-3e5e20ddd400.png)

カテゴリーが二つ作成されました。任意のカテゴリー名に変更します。

![スクリーンショット 2025-02-27 10.38.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/f09acad7-2431-4ca0-97f2-94b26b69413b.png)

左上のダイヤモンドのボタンでフラグ化します。

![スクリーンショット 2025-02-27 10.34.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/65cbb015-c55d-4ab8-989f-6aab21d714cd.png)

c.[テキストマイニング]ナゲットを編集します。[設定タブ]で真偽をT/Fから1/0へ[フィールド名拡張子]をブランクにします。

![スクリーンショット 2025-02-24 11.59.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/a075eadd-c39d-4b68-9b55-90141b9ec9f0.png)

d.[重複]ノードは便宜的に増幅されたデータを非表示するために利用しています。

[テーブル]ノードを編集します。

![スクリーンショット 2025-02-27 10.42.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/ce4b175b-52b1-4af7-b885-d2b23e984b3b.png)

#### 注意事項

実際には自動のみでは十分なカテゴリー作成ができることはなく、次の記事で紹介されるTAPを参考に手動で作成します。

## 4.参考情報

#### Python連携によるテキストマイニング

https://qiita.com/harrowharrow16/items/248ff8fe3879b63e7ae3

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/items/4bf813e6cba84b2a1008
visudoでnanoを使用する方法（環境変数だけではうまく行かない人向け）

## 背景
私は普段、 ~~viの操作を覚えるのが面倒なので~~ テキストエディタにはシンプルに操作できるnanoを使用している。
しかし`visudo`においてはデフォルトでviが使われてしまうため、これをnanoに変更したい。
google検索で出てくる方法だけでは解決しなかったので、記事として残すことにする。

## 課題
`sudo EDITOR=nano visudo` と明示的に指定すればnanoが起動するものの、毎回指定するのが手間。
調べると、環境変数の変更や`update-alternatives`の設定を変更するといった方法が出てくるが、これらでは解決ができなかった。

### 以下事前に試していたこと
- ユーザー、rootそれぞれの`.bashrc`に以下を追記し、`source`コマンドで実行
  - `export SUDO_EDITOR=nano`
  - `export EDITOR=nano`
- 以下のコマンドを実行し、`editor`コマンドでnanoが開くように変更
```sh
$ sudo update-alternatives --install /usr/bin/editor editor bin/nano 100
$ sudo update-alternatives --config editor
There is 1 program that provides 'editor'.

  Selection    Command
-----------------------------------------------
*+ 1           /usr/bin/nano

Enter to keep the current selection[+], or type selection number: 
```

## 解決方法
ChatGPT o3-miniに質問したら一発で正しい回答が得られた。
visudoの起動オプション(`EDITOR=nano`など)は、`visudo`の設定ファイルである`/etc/sudoers`内でデフォルト値を指定できる模様。

1. **一時的にnanoでvisudoを起動する**
   ```sh
   sudo EDITOR=nano visudo
   ```

2. **sudoersファイルにエディタの指定を追加する**
   visudoで開いたファイル内に、以下の行を追加。
    ```sh
   Defaults editor=/usr/bin/nano
   ```
   > ※nanoのパスは通常`/usr/bin/nano`だと思われるが、念の為`which nano`で確認しておくことを推奨。

3. **設定の保存と終了**
   変更を保存して終了すれば、今後は単に以下のコマンドを実行するだけでnanoが起動するはず。
   ```sh
   sudo visudo
   ```

うまく行かない場合、冒頭に述べた環境変数の設定や`update-alternatives`の設定も合わせて試すと良い。

## 参考文献
- [visudoマニュアル](https://www.sudo.ws/man/1.8.31/sudoers.man.html)  
- [sudoers覚え書き #sudo - Qiita](https://qiita.com/progrhyme/items/6f936033b9d23efb1741)
- [sudo / visudo で、一時的にvim を使い nano を使わない。 - それマグで！](https://takuya-1st.hatenablog.jp/entry/2021/02/14/132742)

余談だが、google検索するとnanoからviに変える記事ばかりが引っかかった。
nanoは少数派なのかなぁ…
git rebaseを恐れずに! 理解すれば最強のツール

# 本記事を執筆した背景
以前、コミットログの修正で`git rebase`を使おうとしましたが、うまくいかず、かえってコミットログが追加され、更にカオスになった経験があります。
共同開発で`rebase`を使う度に肝を冷やすため、体系的に学び、使いこなしたいなと思い立ちました。



# 目次
- [1. 本記事を執筆した背景](#本記事を執筆した背景)
- [2. そもそもgit rebaseとは？](#そもそもgit-rebaseとは)
  - [2.1 git rebaseの一般的な使用例: 作業ブランチに最新の情報を反映させる](#git-rebaseの一般的な使用例-作業ブランチに最新の情報を反映させる)
  - [2.2 git rebaseの応用: コミットログをまとめる](#git-rebaseの応用-コミットログをまとめる)
- [3. おわりに](#おわりに)



# そもそもgit rebaseとは?

そもそも、`git rebase`とはどのようなコマンドなのかおさらいをします。
結論から言うと、`git rebase`とは、<font color="#FF7043">**コミットログを改変**</font>するためのコマンドです。

下記の使用例を見ながら理解していきましょう。



## git rebaseの一般的な使用例: 作業ブランチに最新の情報を反映させる


#### イメージ図(引用元: [IT Information](https://it-infomation.com/git-rebase/))
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3767231/ad40dcfb-179b-4041-be0e-1ccf3303d4e1.png)

### 上記の事例:
```
1. 新規機能の開発を頼まれ、コミットAから切って、featureブランチを作成
2. ところが、別ブランチでコミットD,Eが進み、これらを利用しないと開発出来ないことが判明。
3. どうにかコミットB,Cの情報をもったまま、コミットD,Eも取り込みたい。どうしよう。。
```

こんなときに、`git rebase`が非常に有効です。
上記の図のように`rebase`を使用することで、A地点で切られた`feature`ブランチをEに変更してあげることで、B,Cの情報を持たせたまま、D,Eを取り込むことが出来ます。


なぜなら、**コミットAからコミットEに祖先を変更する**という**コミットログの改変**に他ならないためです。

くどいようですが、`git rebase`は<font color="#FF7043">**コミットログを改変**</font>しているんだ~ということを意識することで理解度が高まると思います!!




## git rebaseの応用: コミットログをまとめる

コミットをした後に、タイポ、`print`文の追加, `Linter`の適用など、チマチマしたコミットがたくさん積み重なってしまうことがあると思います。
これらを1つずつ見るのはレビュワーの負担になるため、適切な粒度でコミットをまとめる必要があります。


### コミットログが不適切な事例: 

コミットAから3回、小さなコミットをしてしまったという状況を想定します。


![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3767231/ba0364f0-479c-45a2-8836-f79d338d47dc.jpeg)
(引用: [www-creators](https://www-creators.com/archives/2850))

```
[コミットが積み重なってしまった状況]
A. 最初のコミット(commit-A)： 機能実装
    - 必要な機能を実装したが、軽微なミスに気づかずそのままコミット
1. タイポ修正
    - コード内のタイポを発見し、修正
2. エラーハンドリング
    - エラーを握りつぶしていたことに気が付き、修正
3. Linter適用
    - 2で実装した部分のLinterが適用されていなかったため、修正
```

1~3はすべて認知しているミスコミットです。なので1~3の修正は、本来は下図のようにコミットAに組み込むべきです。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3767231/57d8239c-5423-4198-875c-9585aa58f1e5.jpeg)

(引用: [www-creators](https://www-creators.com/archives/2850))



## おわりに
今回は、`rebase`を用いてブランチの祖先の改変と、コミットをまとめる方法について紹介しました。
とはいえ、具体的な操作に戸惑うと思うので、次回の記事では、`git rebase`の使用方法をハンズオン形式で説明したいと思います。


**筆者のぼやき**
紹介した事例は私がつい最近経験したものです。
自分ではきちんと確認しているつもりなのに、なぜか修正点が後から次々と見つかることが多いんですよね。こういう現象に名前があったりするのかな、、(笑)
JOI2024/2025 参加記（〜本選）

# 0. はじめに
JOI2024/2025の本選までの参加記です。

# 1. 1次予選
1回目に参加して通りました。
デバッグ禁止縛りをしたら見事に1ペナしました。

# 2. 2次予選
満点に固執した結果E問題0点でした。
これが本選じゃなくて良かった...
![GeQjRTcbIAAFBmK.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3703546/f47aac5f-af15-3a79-bdd0-aa8ac17c7e1f.png)


# 3. 本選
難易度9と10をそれなりに埋めたので、まあ普通にやれば通るだろうと思っていました。
しかし、前回は問題3以降で自明部分点しか取れなくて余裕で落ちたので、最後まで不安でした。
![Screenshot 2025-02-02 at 11-43-54 AOJ_AtCoder-JOI.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3703546/8bc27938-3744-0ec3-356a-e71ea51b09f2.png)

# 3-1. 問題1
累積maxを考えて行/列ごとに二分探索をします。
普通に実装してAC(9:06)

# 3-2. 問題2
jを全探索することを考えると、Bの累積和とA_iの差を見ればいい感じに解けます。
これも実装してAC(15:00)

# 3-3. 問題3(小課題6まで)
木構造でよくある「頂点iの親はP_i(P_i < i)」を考えると条件が分かり、各lごとにrの最小値を尺取り法で求められるので、全体でO((M+Q)log(M+Q))で答えが求まると分かります。あとはいい感じに実装...しようとしましたが、座標圧縮の定数倍が重く小課題6までしか取れません。しばらく粘りましたがどうしても小課題7が取れないので一旦スルーします。(2:05:42)

# 3-4. 問題4(小課題6まで）
とりあえず愚直bitDPで小課題4までを確保します。その実装中に、状態数2^AのDPで解けないか考えると、O(2^A A^2logN)で割といい感じに行けると分かります。実装し、小課題5まで取ります。その後、どうにか定数倍高速化を加えることで小課題6まで通します。(3:26:06)

# 3-5. 問題3(満点)
どうにか高速化できないか考えると、endlが動作を重くしていることに気づき、\nに変更すると満点が取れました。(3:39:59)

# 3-6. 問題5(小課題1まで)
時間がないので、とりあえず自明な小課題1を取ります。しかし、小課題2の実装は間に合わず、結局3点で終わってしまいます。(4:00:00)

# 3-7. 結果
100-100-100-82-3で、385点でした。見た限り自分より高い人が3人ほどしかいなかったので、通過を確信しました。そしてボーダーは306点だったので、正式に通過が確定しました。

# 4. 終わりに
多分全体5位ぐらいでした。この順位だとまだ日本代表にはなれないのでもっと精進します。
一応言っておこう。流行りすぎているOpenRouterを使う前に確認しておきたい事象

## 本当に大丈夫？OpenRouterを使う前に確認しておきたい事象

### OpenRouterとは？

OpenRouterは、各種AIモデルを統一的なAPI経由で利用できる便利なサービスです。特に、さまざまなAIモデルを簡単に試したい人や、無料モデルを活用したい人にとっては非常に魅力的な選択肢です。

しかし、その構造上、プライバシーやデータの取り扱いに関する明確なリスクが存在します。今回は、事実に基づいた懸念点を整理しつつ、それらを踏まえた上でどのように活用すべきかを考えていきます。

---

## OpenRouterの構造上、避けられないリスクとは？

OpenRouterは、一つのエンドポイント（API）を通じてリクエストを各種バックエンドモデルにリレーする仕組みです。この設計により、以下のような具体的なリスクが発生します。

### 1. 入力データの流出リスク

- すべてのリクエストはOpenRouterのサーバーを経由するため、入力したプロンプトが第三者の管理下に置かれることになります。

### 2. データの保存・ログ記録

- OpenRouterがリクエストの内容をどの程度保存・記録しているのかは、明確な情報が少ないのが現状です。
- 各モデル提供元（OpenAI、Anthropic、Mistralなど）も、それぞれ異なるポリシーを持ち、一部はデータを学習に利用する可能性があります。

### 3. 通信経路のセキュリティ

- OpenRouterはHTTPSを使用しており、通信の暗号化はされていますが、内部的にどのようにデータが転送・処理されるのかは不透明です。
- 各モデルのホスト先が異なる場合、それぞれの通信経路の安全性は利用者側からは検証できません。

---

## どんなデータを送るべきではないのか？

上記のリスクを踏まえると、OpenRouterを利用する際に**絶対に送信すべきでない情報**があります。

- **個人情報**（氏名、住所、電話番号、メールアドレスなど）
- **機密情報**（クレジットカード番号、パスワード、APIキー、企業の内部情報など）
- **法的・倫理的に問題のある情報**（機密文書、未公開の研究データなど）

要するに、**「外部に漏れて困る情報は絶対に送信しない」**ことが大前提です。

---

## OpenRouterを安全に活用するには？

こうしたリスクがあるからといって、OpenRouterを全く使わないべきというわけではありません。無料で使えるモデルもあり、さまざまなAIを手軽に試せる点は非常に魅力的です。

そのため、安全に利用するためのポイントを押さえつつ、適切に活用することが重要です。

### 1. 匿名性を保つ

- できるだけ個人情報を含まない形でプロンプトを設計する。

### 2. 一時的な用途でのみ使う

- 試験的に使う場合や遊びで使う場合に限定し、重要なデータ処理には使用しない。

---

## まとめ

OpenRouterは、AIモデルを手軽に試せる優れたサービスですが、その構造上、データの流出リスクやセキュリティの問題が避けられません。これらの事実を認識した上で、適切な情報管理を行い、安全に活用することが求められます。

**「無料で多様なモデルを試せる」「便利で手軽」**といったメリットを活かしつつ、重要なデータは扱わないという基本ルールを守ることで、OpenRouterを最大限に活用できるでしょう。

**利便性とリスクを正しく理解し、上手に活用していきましょう！**
bug対策

## 1.bug信息
### 报错信息
Invalid bound statement (not found)

### 原因dui'ce
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3899383/7350ffa8-393d-43fc-b4c5-e4d23985a8fb.png)

## 2.使用postman测试报错
### 报错信息
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3899383/3c826e4b-a52d-407a-9461-c6ea9ee7b258.png)

### 原因和对策
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3899383/b5bfd67c-cfab-497b-9a06-1ddccce20381.png)
シェルスクリプト記事集：シェルスクリプトついての記事が増えすぎたので、このあたりで一度整理してみた

## はじめに

シェルスクリプトについての記事があちこちに散らばっていたので、スクラップして整理してみました。

今回の内容については、個人的な備忘録になりますので、ご了承ください。

## 過去の記事を気軽にスクラップしてみた

**Linuxでの定期再起動をシェルスクリプトとcronジョブで自動化する方法と検証結果**

https://qiita.com/free-honda/items/efa3c889888fd7ef75b5

**日本の祝日を自動取得して活用するシェルスクリプト検証**

https://qiita.com/free-honda/items/efaa963bcd7a79e09c8b

**Linuxでログローテーションを自動化するシェルスクリプトの作成と運用方法**

https://qiita.com/free-honda/items/5f6faedc66f0653a4e04

**Linuxのサービス監視と自動起動をシェルスクリプトで実現する方法**

https://qiita.com/free-honda/items/f3810e87d70001f52622

**シェルスクリプトで祝日判定とメッセージ通知を自動化する自宅検証**

https://qiita.com/free-honda/items/d87cb5fedce714a87e34

**シェルスクリプトで実現するログ監視とエラーメール通知の自動化検証**

https://qiita.com/free-honda/items/f34923c681a5323eda03

**シェルスクリプトで作るログ管理とメール通知機能付き簡単おみくじアプリ**

https://qiita.com/free-honda/items/b40f98bd14d15c59eac1

**祝日データの自動ダウンロードと更新をシェルスクリプトで実現する方法**

https://qiita.com/free-honda/items/bfd5233f6c46e265de6a

**個人的な備忘録まとめ：祝日データの自動取得と管理に関するスクリプト**

https://qiita.com/free-honda/items/06abfb7f1affc3d56894

## まとめ
今回は、自分自身を改めて整理する機会となりましたが、その中で過去の記事のメンテナンスも行うことができました。

最近は記事投稿などのアウトプット量が増えてきているからこそ、振り返る時間を持つことの大切さを改めて実感しました...！
ターミナルのユーザー名をvscodeで編集する

# ターミナルのユーザー名を変更する方法
ターミナルが地味に見にくい。そんな時、いい感じかつモチベが上がるようなターミナルのデザインに、vscodeを使って変更する方法を書く。
## .zshrcファイルを編集する
```zsh
cd ~
code . #code コマンドを有効にしていると、カレントディレクトリがvscodeで開かれます。
```
参照：https://qiita.com/P-man_Brown/items/b18f31e3bb98b08ff31b

vscodeでルートディレクトリが開きます。
その中から「.zshrc」のファイルを探す。
そして、以下の内容を最下部に入力して、ターミナルを再起動
```~/.zshrc
export PS1="%F{色番号}好きな文字%"
```
※注意
他の箇所は削除しないように注意する。

- export PS1を宣言
- 色をつけたい文字を以下のように囲む
    - `%F{色番号}好きな文字%f`
        - 色番号がどんな色か確認したい時は以下をターミナルに貼り付けると色を確認できます
        - `for i in {0..255}; do print -P "%F{$i}Color $i%f"; done`
    - 改行をするときは、エディタ上の改行が反映される
- `=`以後全体を""で囲う

例↓
```~/.zshrc
export PS1="%F{40}yutti@mac%f %F{15}:%f %F{39}%1~%f 
%F{15}$%f " #改行するとシェルも改行される
```
![スクリーンショット 2025-03-08 1.19.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626883/94c12618-57e7-4aa9-861b-68000f1a5eb3.png)

このようになる。

# 参照
色番号：
https://qiita.com/tmd45/items/226e7c380453809bc62a
色の付け方：
https://bonoponz.hatenablog.com/entry/20240219/1708295400
なぜ最高の低予算3Dスキャナーでもプロ並みのスキャン品質を実現できるのか？

近年、3Dスキャン技術の発展により、高価なハイエンドスキャナーだけでなく、低予算のスキャナーでもプロフェッショナル品質のスキャンが可能になっています。これにより、多くのクリエイター、デザイナー、エンジニア、愛好家が手頃な価格で高品質な3Dスキャンデータを手に入れることができます。では、なぜ最高の低予算3Dスキャナーでもプロ並みの品質を実現できるのでしょうか？  

## 1. 低予算スキャナーとハイエンドスキャナーの主な違い  

まず、低予算スキャナーがどのようにしてプロ並みのスキャン品質を実現するのかを理解するために、低予算スキャナーとハイエンドスキャナーの主な違いを見てみましょう。  

| 特性 | 低予算スキャナー | ハイエンドスキャナー |
|------|--------------|--------------|
| 価格 | 200～1000ドル | 5000ドル以上 |
| スキャン精度 | 0.05mm～0.2mm | 0.01mm～0.05mm |
| 解像度 | 高めだが制限あり | 非常に高く、微細なテクスチャもキャプチャ可能 |
| 適用分野 | DIY、個人、軽工業用途 | 工業用測定、医療、考古学など |
| センサーの種類 | 構造光、レーザー、深度カメラ | マルチスペクトル、レーザー+フォトグラメトリ |
| 携帯性 | 軽量で持ち運びやすい | 一般的に大型で固定設置が必要 |
| ソフトウェア機能 | 基本的なモデリング、補正 | 精密測定、複雑なメッシュ処理 |

この表から分かるように、低予算スキャナーはハイエンド機に比べて若干劣る部分があるものの、精度、解像度、ソフトウェアの最適化などの面では、プロ仕様の品質に迫る性能を持つ製品も多くなっています。  

## 2. 低予算スキャナーがプロ品質を実現できる理由  

### 1. 高度な光学技術とセンサーの進化  

近年、3Dスキャン技術のコアコンポーネントのコストが下がったことで、低予算スキャナーにも高品質な光学センサーが搭載されるようになりました。たとえば、**MIRACO 3Dスキャナー**は高解像度のデュアルカメラ構造光技術を採用しており、表面の細かいディテールをキャプチャし、誤差を0.05mm以内に抑えることができます。これは一部のハイエンドスキャナーに匹敵するレベルです。 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/9a92c9ee-5b29-40d8-b27f-ddf7ed154a2c.png)


また、センサーの最適化やアルゴリズムの向上により、光の影響を受けやすい環境でも安定したスキャンが可能になりました。例えば、一部のスキャナーは**赤外線**や**マルチスペクトルスキャン**に対応しており、光の干渉を最小限に抑えて正確なデータを取得できます。  

### 2. 強力なソフトウェア最適化  

かつて、低予算スキャナーの弱点の一つはソフトウェア機能の制限でした。スキャンデータの補正や修正には外部ソフトが必要でしたが、現在は**AIアルゴリズムの進化**により、自動補正やメッシュ修正、テクスチャ強化が可能になっています。  

例えば、Revopointの**Revo Scan**ソフトウェアは、**ポイントクラウドの自動整列、メッシュ処理、穴埋め**などの機能を備えており、追加のソフトウェアなしで高品質なモデルを作成できます。この最適化により、低予算スキャナーでもプロ仕様のスキャンが簡単にできるようになりました。  

### 3. 携帯性と多用途対応  

低予算スキャナーは一般的にコンパクトなデザインが多く、持ち運びが簡単です。たとえば、MIRACOはUSB-Cケーブル一本でPCやスマートフォンに接続でき、**手持ちスキャンモード**を利用することで、大型オブジェクトのスキャンも容易に行えます。これは一部のハイエンドスキャナーよりも優れた携帯性を実現しています。  

さらに、最近の低予算スキャナーは、以下のような複数のスキャンモードに対応しています。  

- **固定スキャンモード**（高精度な小型オブジェクトのスキャンに最適）  
- **手持ちスキャンモード**（大型オブジェクトに対応）  
- **フルカラースキャン**（アート作品や3Dプリント用途に最適）  

この柔軟性により、低予算スキャナーは**製品デザイン、3Dプリント、文化財保存、ゲームCG制作**など幅広い分野で活躍できます。  

## 3. 低予算スキャナーの活用シーン  

### 1. **3Dプリント & DIYプロジェクト**  
DIY愛好家にとって、低予算スキャナーは現実のオブジェクトを素早くデジタルモデルに変換する強力なツールです。例えば、MIRACO 3Dスキャナーを使えば、壊れた機械部品をスキャンし、CADソフトで修正後に3Dプリントすることで、簡単に部品を再現できます。  

### 2. **ECビジネス & カスタム製造**  
オンラインショップでは、3Dスキャンを活用してリアルな商品モデルを作成することが増えています。例えば、ジュエリーショップでは高精度スキャンを使用して指輪やブレスレットの詳細な3Dモデルを作成し、顧客がオンラインで細部まで確認できるようにしています。  

### 3. **医療 & 義肢カスタマイズ**  
低予算スキャナーは医療用スキャナーほどの精度はありませんが、歯科や義肢カスタムなどの分野で十分に活用可能です。例えば、歯科医は**構造光スキャナー**を使用して患者の歯型を3Dモデル化し、カスタム治療を提供できます。  

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/d1236c9f-104c-4445-9a15-c3f7be162693.png)


### 4. **ゲーム & 映画CG制作**  
ゲーム開発者は3Dスキャン技術を使い、リアルなオブジェクトのデジタルモデルを素早く取得し、ゲームエンジンに取り込むことができます。例えば、『サイバーパンク2077』の衣装デザインには3Dスキャナーが活用され、リアルな布の質感を再現しています。  

## 4. 低予算3Dスキャナーの選び方  

| 目的 | 推奨機能 |
|------|---------|
| **高精度スキャン** | 誤差0.05mm以下、マルチフレーム統合 |
| **大型オブジェクト** | 手持ちスキャン、広視野角 |
| **フルカラースキャン** | テクスチャマッピング、高解像度RGBカメラ |
| **携帯性** | 軽量デザイン、外部電源不要 |
| **ソフトウェア互換性** | STL、OBJ、PLYフォーマット対応、CADソフトとの互換性 |

## 5. まとめ  

現在の低予算3Dスキャナーは、**高精度センサー、AIソフトウェア、柔軟なスキャンモード**により、プロ品質のスキャンが可能になっています。今後も技術の進化により、低予算スキャナーの性能はさらに向上し、より多くの分野で活用されるでしょう。

https://www.revopoint3d.jp/
【Windows】右クリックメニューに7Zipが表示されない時の対処法

## 手順
1\. 7-Zip File Manager を [管理者として実行] で開く

2\. [ツール(T)] → [オプション(O)] を選択

3\. [7-Zip] タブを選択

4\. ｢シェル コンテキストメニューに7-Zipを登録｣ にチェックを入れる

5\. [適用(A)] → [OK] を選択

## 参考

https://ja.stackoverflow.com/questions/91618/%E3%82%B7%E3%82%A7%E3%83%AB%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC%E3%81%AB-7zip-%E3%82%92%E7%99%BB%E9%8C%B2%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84
Docker Desktop for Macが起動できないときにやったこと

:::note warn
この記事は主にまとめ記事です。
本事象は[#7527](https://github.com/docker/for-mac/issues/7527)の事象解決で少しはまったのでその解決についてです。
本件の事象については参考文献にさせていただいた記事をご確認ください。
※筆者はりんご🍎デバイスを持っていないため、こういう方法あるよ！という意見はありがたいですがなんでこうしないの！？は答えきれないので許して…
:::

# はじめに

久しぶりにDockerを起動した友人から、「マルウェアがブロックされました」みたいなエラーが出るんだけど！？みたいな話を聞きに、多くの有志の方が情報を上げてくれていました。私も、そのあたりのサイト見れば解決するじゃんくらいのノリで適当に記事共有していたら友人が意外と沼にはまっていたのでその解決を備忘録として載せます。

# 事象

詳しくはこちら

https://qiita.com/zembutsu/items/00e147cc1b97d89aaab6

古いバージョンのDockerを使っていたらなんかエラー出るようになったのでその事象と解決方法についてまとめてくださった大変ありがたい記事です✨
アンインストールができなかったようでパッチ更新の方法をとってはまってました。
パッチ更新の方法をとったのですが、Dockerデスクトップが全く起動しなくなり、アンインストールもできたか怪しい状態になってました…
Dockerデスクトップのアイコン押しても全くうんともすんとも言わないのは恐怖ですね…

# 解決方法

詳しくはこちら

https://zenn.dev/euxn23/articles/b2eeef22589b8c

書かれていることを順に試していき、vmnetd を復元すると無事にDockerデスクトップが動き出しました！
パッチ更新の際にvmnetdをキルしたのですが再インストール等々してもキルしたままのようでした…

# 総評
macのだけに起きていた問題だったので全くキャッチアップできておらず、こんな事象あったんだ…といいお勉強になりました！
今回のことでも思いましたが、ほとんど使わなくなったアプリは脆弱性の影響を受けやすいので、定期的に更新するか、使わなくなったらアンインストールして、使うたびに最新バージョンを使うようにする方がセキュリティ的にも安心ですね！
【一般】サービスヘルスチェック

# はじめに #
コンピュータソフトウェアに関して、常に完璧に動作し、不具合いが一切ないということは不可能です。異常を検出し、その原因を調査するために、さまざまな監視機能やアプリケーションに依存しています。Sharperlightも例外ではありません。この投稿では、Sharperlightが提供するエラー情報を簡単に確認できる機能を紹介します。この機能は、Sharperlightバージョン7.0.28以降でサポートされています。

# 実践 #
「サービスヘルスチェック」 – これが今回紹介する機能です。

メインアプリケーションメニューからアクセスできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/530b3453-fd0a-4e82-b407-f9cc51f248d6.png)
アプリケーションサーバーで実行されると、Windowsイベントビューアーログに表示されるSharperlight関連のすべてのエラーや警告などを要約してカテゴリ分けします。これにより、非Sharperlightのエントリを除外しながら、データベース接続エラーなどのサービスに関する問題を診断するのに役立ちます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/8d3e7c6a-0a6f-4b93-b10f-f98716c06632.png)
1. ここで日付範囲を指定でき、Sharperlightの例外事象のみを表示するか、Sharperlightに関連するその他の情報も含めるかを選択できます
2. このボタンをクリックすると、指定した条件でフィルタリングされた情報を表示できます

# あとがき #
この機能を使って、問題がどこにあるのか、原因は何かを調査し、問題解決に役立ててください。
Agentforce ２dx



+ [TrailblazerDX 2025: Top Insights for Salesforce Admins](https://www.salesforceben.com/trailblazerdx-2025-top-insights-for-salesforce-admins/)

Agentforce は単なる AI アシスタントを超えて成長しました。現在では複数のエージェント タイプがあり、それぞれが異なる役割と使用例に合わせて設計されています。

+ **Agentforce Default**:ユーザー向けのサポートを提供する、Salesforce 内の AI アシスタント。

Einstein Copilot は消えたわけではなく、単に進化しただけです。現在は Agentforce Default と呼ばれ、アカウントを要約し、重要な取引を強調し、ユーザーにリアルタイムの洞察を提供できるプラットフォーム内アシスタントとして機能します。

+ **Agentforce SDR** :ビジネス開発担当者として機能し、リードに対応し、最初のアウトリーチを処理し、質問に答え、必要に応じて人間の担当者に引き継ぎます。
+ **Agentforce Sales Coach** :営業チームにリアルタイムのコーチングを提供します。
+ **Agentforce Service Agent** :主要なデジタルチャネル全体で顧客サポートプロセスを自動化します
+ **Agent for Setup**:セットアップを使用するSalesforce管理者にナビゲーション、サポート、支援を提供します。


**Agentforce 2dx の前の世界**:顧客が Web サイトにアクセスし、「電球が点灯しません。返金を受けるにはどうすればよいですか?」と尋ねます。エージェントは返金ポリシーに関するナレッジ記事を提供しますが、顧客はさらにトラブルシューティングを行うためにサポートに連絡する必要があります。

Agentforce 2dx を使用すると、 AI エージェントは単に反応的であるだけでなく、積極的に行動します。顧客が問題を報告するのを待つのではなく、エージェントは問題を検出して最初に連絡します。「スマート電球で接続の問題が発生していることがわかりました。この問題はインターネット接続に関連しているようです。」
【Linux】psコマンド

# はじめに
こんにちは。私はアメリカ在住で、独学を通してエンジニアを目指している者です。
本日は現在学習中のLinuxコマンドの1つであるpsコマンドについてみていきたいと思います

`ps` コマンドは UNIX 系システムや Linux 環境で、**現在動作しているプロセス**を一覧表示するための基本的なツールです。
プロセスとは、コンピュータ上で実行されているプログラムを指します。
このドキュメントでは、`ps` コマンドの概要や主要なオプション、利用シーンなどについて紹介します。

---

## psコマンドの概要

- **プロセスの状態を表示する**：`ps` は “Process Status” の略で、プロセスの情報を確認するために用いられるコマンドです。
- **スナップショット表示**：`ps` はリアルタイムの情報ではなく、コマンドを実行した時点のプロセス状態を表示します。プロセスの動きを追いかける場合は、必要に応じてコマンドを再度実行するか、`top` や `htop` などの動的監視コマンドを使用するとよいでしょう。

## 主なオプションと使い方

多くの UNIX 系システムでは、`ps` コマンドに **BSD 系オプション** と **System V 系オプション** が存在します。また、Linux ではこれらが混在していることも珍しくありません。いくつか有名なオプションを紹介します。

### BSD 系オプション

- `-a` : すべてのユーザーの端末に紐づいたプロセスを表示
- `-x` : 端末に紐づいていないプロセス（デーモンなど）も表示
- `-u` : ユーザーを指定してプロセスを表示（例: `ps -u root` など）

#### 例: 全プロセスの一覧を表示

```bash
ps ax
```

上記コマンドは、端末がないプロセスも含め、全てのプロセスを表示します。

### System V 系オプション

- `-e` : システム上のすべてのプロセスを表示
- `-f` : 詳細情報（親プロセス ID や開始時刻など）を含む「フルフォーマット」で表示
- `-l` : ロングフォーマットで表示

#### 例: 全プロセスをフルフォーマットで一覧表示

```bash
ps -ef
```

Linux 環境でよく利用されるオプションの組み合わせです。ユーザーや開始時刻、親プロセスなど詳細な情報が表示されます。

## 出力形式の見方

多くの環境で、`ps` コマンドを実行すると以下のような項目が表示されます（オプションによって表示内容は異なる場合があります）。

- **PID** : プロセスID
- **TTY** : プロセスが関連付けられている端末（ターミナル）
- **TIME** : プロセスが動作していた時間（CPU 時間）
- **CMD** : 実行コマンド名
- **PPID** : 親プロセスの PID
- **USER** : プロセスを実行しているユーザー
- **START** : プロセスが開始された時刻

## &#x20;実行例

### ps の基本使用

```bash
ps
```

現在のシェルに紐づくプロセスのみが表示されるため、少数のプロセスが表示されます。

### 全プロセスの表示

```bash
ps ax
```

端末に紐づいていないバックグラウンドのプロセス（デーモンなど）も含めて表示されます。すべてのプロセスを確認したい場合に有用です。

### 詳細情報の表示

```bash
ps -ef
```

System V 系のオプションを使用して、プロセスの親子関係や実行開始時刻などを含めた詳細な情報を一覧で表示します。

## よくある用途

- **プロセスの調査**: 異常に CPU 使用率やメモリ使用量が高いプロセスがないかをチェックするために利用
- **デーモンの確認**: バックグラウンドで動作しているサービスやデーモンが正しく起動しているかの確認
- **トラブルシューティング**: 不要なプロセスや停止すべきプロセスを特定したり、どのユーザーがどのプロセスを起動しているかを調べたりする

## 注意点

- `ps` のオプションはシステムによって挙動が異なる場合があります。Linux、BSD、macOS、Unix などで微妙にオプションの意味が変わることがあるため、**`man ps`** コマンドを使って自分の環境のマニュアルを確認してください。
- シェルによっては、エイリアスが設定されている場合があります。思わぬ結果になることがあるため、念のためにフルパス（例: `/bin/ps`）を使って実行することも検討してください。

---

## まとめ

`ps` コマンドは、プロセスの状況を迅速に把握するための基本かつ強力なツールです。トラブルシューティングやシステム管理の場面で頻繁に使用されるため、使い方やオプションの意味を把握しておくと大変便利です。特に、`-a`、`-x`、`-e`、`-f` などを組み合わせることで、必要に応じた情報を得ることができます。今後、システム管理やプログラムのデバッグをする際には、ぜひ活用してください。
Jetson Xavier NX + Seeed社のキャリアボードの組立手順

# はじめに
Seeed社のキャリアボードを用いたJetson Xavier NXの組立手順を備忘録として、まとめています。本記事の内容は、Seeed社のキャリアボードを使用していれば、同様に組み立てることが可能と思います。
※ 本記事では、組立までの手順について、触れています。セットアップ以降の話については、次回以降でまとめようと思います。

## 準備したもの
組み立てに準備したものは、次となります。
* Jetson Xavier NX 8GBモジュール
* キャリアボード（品名：reComputer J202 - carrier）
* ファン（品名：Aluminum Heatsink with bigger Fan for Jetson Xavier NX Modul）
* SSD（品名：256GB NVMe M.2 PCle Gen3x4 2280 Internal SSD）
* ACアダプター
* ドライバー
* ハサミ
* ジャンパーピン

## 手順
### 手順①　キャリアボードにSSDを装着する
1. キャリアボードを裏返し、図1の赤丸箇所のネジを外す
2. 図2の赤丸箇所にSSDを差し込む
3. SSDを差し込んだ後、1. で外したネジを留める（図3）

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499475/ca10c881-18b7-4daa-a598-4c06fec5e053.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499475/d38dcb1b-806c-4390-87d1-20e6d767f515.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499475/2680f40f-4b56-44d1-be46-c99b5e16ac2f.png)|
|---|---|---|
|図1|図2|図3|

### 手順② Jetsonモジュールにファンを取り付ける
1. ファンと同梱されているシートを切り取り、モジュールの赤丸箇所に付ける（図4）
2. 図5のように、モジュールのシートが貼られている面にファンを付ける
3. 2. の状態のまま、裏返した後、金具を取り付けてネジで固定する（図6）

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499475/a0394cdc-8813-4504-8fdd-603de3ac74af.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499475/f62322b1-8c73-4cd7-b6e3-fb4d91dcd540.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499475/5fa3af17-93de-4c3d-9cbf-020cf4af7892.png)|
|---|---|---|
|図4|図5|図6|

### 手順③ キャリアボードにモジュール（ファン付き）を装着する
1. 図7のように、キャリアボードの赤丸箇所（292HBと書かれている部品）にモジュールを差し込む
   ※ 差し込む際は、図7の赤矢印の銀色のパーツを開くと、差し込みやすくなる
2. 図8の赤丸箇所を黄丸箇所に差し込む（差し込んだ後は、図9のようになる）

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499475/aa5042cb-f9e2-431d-a987-40e8c37d2ba7.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499475/2b59acd8-7b00-46bd-8c8c-7866791ac9b7.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499475/98149c17-ad5c-4309-8fe0-3994432e6f83.png)|
|---|---|---|
|図7|図8|図9|

## さいご
以上が組立の手順でした。もし、本記事の手順に沿って設定を行ったが、うまくいかなかった場合やご不明な点等がありましたらコメントいただける幸いです。読んでいただき、ありがとうございました。
【一般】管理者ユーザーアカウント - パスワードの喪失

# はじめに #
管理者パスワードの紛失は時に厄介な状況になることがありますので、通常、複数の管理者Sharperlightユーザーアカウントを用意しておくことをお勧めします。これにより、他の人が資格情報を失った場合でも、少なくとも1人はアクセスできるようになります。また、バックアップとしてWindowsユーザーアカウントを管理者として設定しておくこともお勧めします。

# 実践 #
## パスワードリセットオプションを有効にする ##
サイトセットアップでメールアドレスを持つSharperlightユーザーアカウントを設定している場合、Sharperlightウェブチャネルのログインにアクセスし、「歯車」アイコンをクリックして追加オプションを開くことで、アカウントのパスワードをリセットすることができます。

### Sharperlight 管理者ユーザー ###
ユーザーにメールアドレスを追加します。リセット確認のメールがこのメールアドレスに送信されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/9b48c462-6cdc-4a03-aa2f-24c069790c54.png)

### クライアントのセットアップの設定 ###
アクティブなサービス定義を選択し、「ユーザーパスワードリセットの許可」オプションをTrueに設定します。

次に、ユーザーのメールアドレスに通知を送信するために、メールサーバーの詳細を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/4647813b-bbd5-4120-aa7f-ec9b13177a2d.png)

## その他の手段 ##
残念ながら、これらの前提条件が満たされていない場合、すべての管理者ユーザーパスワードが失われた後に管理者ログインを有効にする「バックドア」は存在しません。

一般的な推奨として、常にバックアップオプションが利用できるように、Windowsユーザーを管理者として設定することをお勧めします。

### 他の管理者ユーザーの確認 ###
Sharperlightデータベースを確認して、忘れてしまった可能性のある他の管理者アカウントがあるかどうかを確認できます。

以下のSQLクエリを使用してください：
```
SELECT adminRights, * FROM mdUserAccounts
```
管理者権限を持つアカウントを探して、それでログインできるか確認してください。できれば、その中にWindowsアカウントが含まれていることを願います。

### 新しいSharperlightシステムデータベース ###
管理者ログインを回復できない場合、また、ウェブレポートにあまり依存していない場合、最も簡単なオプションは新しいSharperlightデータベースを作成することです。この方法を選択した場合、最初にレポートやダッシュボードをエクスポートし、設定が完了した後、新しいSharperlightデータベースにインポートすることができます。

レポート、ダッシュボードページなどのSharperlightオブジェクトは、アプリケーションメニューからアクセスできる「バックアップ」機能を使用してエクスポートできます。この操作は管理者権限を必要としません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/077520f4-0e14-4d35-ae1b-38906f6cbbfd.png)

バックアップオプションは、Webレポート、ダッシュボードページ、その他のアイテムのエクスポートされたファイルを含むZIPファイルを生成します。

ZIPファイルには、データモデルやクライアントのセットアップの設定情報も含まれます。

# あとがき #
トラブルを避けるために、少なくとも1つのWindowsユーザーアカウントをバックアップとして管理者として設定することを検討してください。
CodeIgniter 4のapp/commandsに__construct()を定義したら、0から環境構築の際にmigrateで失敗した


## はじめに
先日、Codeigniter 4のsparkコマンドで使用する際のコマンドを作成した所、バグが発生してしまいました。
あまりやってこなかったアウトプットというのをしてみようと思い、せっかくなので報告を受けたバグを記事にしてみる事にしました。

## コマンドの概略

- CSVからデータをインポートするためのコマンド
- 既にテーブルにデータが存在する場合は、スキップする

## 処理の概要

- コンストラクタ（`__construct()`）では、現在のテーブルのデータを取得して、プロパティ（メンバー変数）展開する
- 本処理（`run`）では、その展開した中をチェックして処理を行う

※コンストラクタをあまり使う機会が無かったので、せっかくなので現在のテーブルを取得して展開しておく際にコンストラクタを使用した

## 事象

- 何故かmigrateの実行時にエラーが発生した。
- 開発途中の環境では、migrateは問題なく動作が完了した。
- 0から環境構築をした際に、migrateが失敗する事が判明した。

## 原因

- 各migrateを行って、最終的にインポート用のコマンドを実行するような順序を想定していた。
- Codeigniter 4の仕様としては、`php spark migrate`を実行すると、`app/commands`配下の各クラスがすべてロードされるため、想定していた実行順序と仕様が噛み合っていなかった。
- テーブルを展開したくても、環境構築が0からの場合は、テーブルそのものが存在しないので、失敗する。

## 対策

仕方ないので、コマンドのコンストラクタに記述していた処理をまるっと`run`に移動しました。

## 疑問

それぞれのコマンドのためのコンストラクタがmigrate時に全実行されるというのは、果たしてベストプラクティスな実装なのか。
周りに質問してみたところ、「コンストラクタ全実行は想定外で、仕様としては好ましくない気がする。」とのことだった。ただ、何か理由があってこの形になっているのかが気になった。
私自身もそれぞれのコマンドを実行した際にだけ、コンストラクタが実行されると思っていたので、想定外の事象だった。
【Linux基本設定】　pam.d設定(パスワードポリシー/ログイン制限/コマンド監視)

# 前提
サーバーはEC2で構築
基礎的なコマンドは打てる前提


## 目的
PAMの主要な設定
・ユーザーのパスワード設定
・ユーザーのパスワードポリシー
・パスワードの再試行回数設定
・コマンド監視

## ユーザーのパスワード設定

```passwd <ユーザー名>```

設定パスワードを確認含めて2回入力すると変更可能


## パスワードポリシー設定

### PAMについて
パスワード関連の設定はLinuxに標準で入ってるPAMモジュールで制御されている(ことが多い)

正直PAMは奥が深すぎるし全然理解できていないので主要なものだけ記載します....

中でも
```/etc/pam.d/system-auth``` と```/etc/security/pwquality.conf```
が大事


### パスワードポリシールール

```/etc/security/pwquality.conf```内でパスワードポリシーを制御する

12文字以上+特殊文字数字大文字小文字含む場合
```
minlen = 12        # 最低文字数
dcredit = -1       # 少なくとも1つの数字を含む
ucredit = -1       # 少なくとも1つの大文字を含む
lcredit = -1       # 少なくとも1つの小文字を含む
ocredit = -1       # 少なくとも1つの特殊文字を含む
```

## パスワード認証ルール

```/etc/pam.d/system-auth```でパスワード認証ルールを設定する
SSH,SUDO,passwdなど複数のサービスの認証の共通設定となる

auth :: ログイン時に適用するルール
account :: ログインユーザーのシステムログイン権限をチェック
password :: パスワード変更の際に適用
session　:: ユーザーのログインセッション管理
↑これらは管理グループといいsystem-auth内ではこの単位で設定を適応する

それぞれ詳細な設定を記載していく

### ログイン試行回数制限

pam_faillock.so でログイン失敗のアカウントロックなどを制御する

```
auth  required      pam_faillock.so preauth silent audit deny=回数 unlock_time=解除時間
auth  [default=die] pam_faillock.so authfail audit deny=回数 unlock_time=解除時間
account     required      pam_unix.so
account required pam_faillock.so
```
UNIX認証でのパスワードをN回失敗するとT秒間アカウントロックする


ロック解除はsudoユーザーから下記コマンド入力

```
faillock --user <ユーザー名> --reset 
```

### パスワード強度チェック

```
password    requisite     pam_pwquality.so try_first_pass local_users_only retry=3
```

```/etc/security/pwquality.conf ```の設定を元にパスワードの強度を検証

### パスワードをハッシュ化して保存

```
password    sufficient    pam_unix.so try_first_pass use_authtok nullok sha512 shadow
```

```/etc/shadow```にsha512でハッシュ化されてパスワードが保存


## 特定ユーザーのリモートログイン禁止

アクセスに関するルールは```/etc/security/access.conf```に記載

```/etc/security/access.conf
-:<ユーザー名>:ALL EXCEPT <IPアドレス>
```

```
-:root:ALL EXCEPT 192.168.1.100
```
rootへの192.168.1.100以外からのログイン禁止(SSH)

```
account     required      pam_access.so
```
↑アクセス設定適応

## 特定の時間だけログイン

ログイン時間帯制御は```/etc/security/time.conf
```に記載

```/etc/security/time.conf
login;*;<ユーザー名>;<時間指定>
```
<時間指定>の部分はここでは記載しない

```/etc/security/time.conf
login;*;root;!Wk0900-1800
```
root ユーザーのログインを平日の9:00～18:00だけ許可 

```
account     required      pam_time.so
```
↑時間帯設定適応
とはいえ、夜間作業等でrootユーザーが使えないと困るケースの方が多いのでこんな設定しないか


## コマンド監視

pam_tty_auditモジュールでコマンド監査用のログを取得できる

設定ファイルは```etc/audit/auditd.conf```に記載

```etc/audit/auditd.conf
log_file = /var/log/audit/audit.log  #監査ログの保存先
max_log_file = 8  #監査ログファイルの最大サイズ（MB単位）。このサイズを超えるとローテーション
max_log_file_action = ROTATE  #ログをローテーション（古いものを削除）
```



↓pam_tyy_auditの適応
```
session required pam_tty_audit.so disable=username,username2 enable=username
```

:::note
コマンドログ監査対象から除外したいユーザーはdisableで明記

基本的にroot/sudo許可ユーザーなど重要な操作を行えるユーザーだけ対象にしよ
:::
Active Directory記事集：Active Directoryやドメイン周りについての記事が増えすぎたので、このあたりで一度整理してみた

## はじめに

Active Directoryについての記事があちこちに散らばっていたので、スクラップして整理してみました。

今回の内容については、個人的な備忘録になりますので、ご了承ください。

## 過去の記事を気軽にスクラップしてみた

**Windows Server 2022で自宅ネットワークにADサーバーを構築し、Windows 10端末をドメインに参加させる方法**

https://qiita.com/free-honda/items/2fcdc8343aa878c17d9e

**LinuxサーバーをWindows Server 2022のADドメインに参加させる手順と確認方法**

https://qiita.com/free-honda/items/a7b4c6fec0ef6eef0247

**Windows Server 2022のADサーバーでのドメインユーザーの作成とログイン検証**

https://qiita.com/free-honda/items/f391a37195ff0e557981

**Active DirectoryとGPOを使ってWindows 10/11端末の壁紙を一括変更する方法**

https://qiita.com/free-honda/items/62efadc861dd211a1062

**Active DirectoryとGPOを使ってWindows 10端末のプロキシの設定を一括変更する方法**

https://qiita.com/free-honda/items/8a5ef34fbfdf268fbb7b

**Active Directory入門：企業のITインフラを支える主要コンポーネントを体系的に解説してみた**

https://qiita.com/free-honda/items/c07e545d166f5fe99bdf

**Active Directory入門：ドメインコントローラーを支えるDNSの役割、SRVレコード、動的更新、フォレスト管理を解説**

https://qiita.com/free-honda/items/25458d6ce452de147f15

**Active Directory入門：AWS上でWindows Serverを利用したActive Directory (AD) の構築してみた**

https://qiita.com/free-honda/items/d0902150684d398a6ee9

**Active Directory入門：AWS環境でWindows ServerをActive Directoryドメインに参加させる際のエラー対処法**

https://qiita.com/free-honda/items/a798bc83b5dc7ca61883

**Active Directory入門：Windows クライアントPCをActive Directory (AD) ドメインに参加させる方法**

https://qiita.com/free-honda/items/15108524f4dba0557cb8

**Active Directory入門：PowerShell で Active Directory のユーザー情報を取得する方法**

https://qiita.com/free-honda/items/7b912599857386182690

**Active Directory入門：PowerShell で Active Directory モジュールが読み込めない問題の解決についてまとめてみた**

https://qiita.com/free-honda/items/54303ff22db27ada96e6

## まとめ

今回は、自分自身を改めて整理する機会となりましたが、その中で過去の記事のメンテナンスも行うことができました。

最近は記事投稿などのアウトプット量が増えてきているからこそ、振り返る時間を持つことの大切さを改めて実感しました...！
wslでelixir その155

# 概要
wsl(wsl2じゃない)で、elixirやってみた。
練習問題やってみた。

# 練習問題

AxonでXORを求よ。

# setup
```






Mix.install(
  [
    {:axon, "~> 0.2.0"},
    {:exla, "~> 0.3.0"},
    {:nx, "~> 0.3.0"},
    {:kino, "~> 0.10.0"}
  ],
  config: [
    nx: [default_backend: EXLA.Backend]
  ]

```

# サンプルコード


```
x1_input = Axon.input("x1", shape: {nil, 1})
x2_input = Axon.input("x2", shape: {nil, 1})

model =
  x1_input                                     
  |> Axon.concatenate(x2_input)                
  |> Axon.dense(8, activation: :tanh)          
  |> Axon.dense(1, activation: :sigmoid)       



batch_size = 32

data =
  Stream.repeatedly(fn ->
    x1 = Nx.random_uniform({batch_size, 1}, 0, 2)
    x2 = Nx.random_uniform({batch_size, 1}, 0, 2)
    y = Nx.logical_xor(x1, x2)

    {%{"x1" => x1, "x2" => x2}, y}
  end)
 
          
epochs = 10

params =
  model
  |> Axon.Loop.trainer(:binary_cross_entropy, :sgd)
  |> Axon.Loop.run(data, %{}, epochs: epochs, iterations: 1000)

```


# 実行結果

```
Epoch: 0, Batch: 1000, loss: 0.6645805
Epoch: 1, Batch: 1000, loss: 0.6334236
Epoch: 2, Batch: 1000, loss: 0.5894425
Epoch: 3, Batch: 1000, loss: 0.5315313
Epoch: 4, Batch: 1000, loss: 0.4695869
Epoch: 5, Batch: 1000, loss: 0.4142583
Epoch: 6, Batch: 1000, loss: 0.3682923
Epoch: 7, Batch: 1000, loss: 0.3305883
Epoch: 8, Batch: 1000, loss: 0.2995510
Epoch: 9, Batch: 1000, loss: 0.2737042



Axon.predict(model, params, %{
  "x1" => Nx.tensor([[0]]),
  "x2" => Nx.tensor([[1]])
})

Evaluated
#Nx.Tensor<
  f32[1][1]
  EXLA.Backend<host:0, 0.204904100.2404515847.97079>
  [
    [0.9617963433265686]
  ]
>


Axon.predict(model, params, %{
  "x1" => Nx.tensor([[1]]),
  "x2" => Nx.tensor([[0]])
})

Evaluated
#Nx.Tensor<
  f32[1][1]
  EXLA.Backend<host:0, 0.204904100.2404515847.97088>
  [
    [0.9612305164337158]
  ]
>


Axon.predict(model, params, %{
  "x1" => Nx.tensor([[1]]),
  "x2" => Nx.tensor([[1]])
})

Evaluated
#Nx.Tensor<
  f32[1][1]
  EXLA.Backend<host:0, 0.204904100.2404515847.97097>
  [
    [0.05178850144147873]
  ]
>





Axon.predict(model, params, %{
  "x1" => Nx.tensor([[0]]),
  "x2" => Nx.tensor([[0]])
})

Evaluated
#Nx.Tensor<
  f32[1][1]
  EXLA.Backend<host:0, 0.204904100.2404515847.97106>
  [
    [0.01657288148999214]
  ]
>


```

以上。
AbstractComposeViewを使ったカスタムビューをData BindingでXMLから設定する方法

こんにちは、@majoLibraryです

既存のAndroidプロジェクトにComposeを導入する場合、AbstractComposeViewを活用すると、よりシンプルかつ柔軟にカスタムビューを作成できます。
本記事では、このAbstractComposeViewを用いてカスタムビューを定義し、Data Bindingを利用してXMLから直接プロパティを設定する方法について解説します。

具体的な例として、プロフィール画面の表示・非表示を管理するためのBoolean型のプロパティprofileVisibleをXML経由で設定する手法を取り上げます。

## AbstractComposeViewを用いたカスタムビューの作成

まず、AbstractComposeViewを継承してカスタムComposeビューを作成します。AbstractComposeViewは、Composeコンテンツの記述を強制する抽象クラスで、Content()メソッド内にComposeのUIを定義します。

以下は具体的な実装例です。

``` kotlin
// CustomProfileView.kt
import android.content.Context
import android.util.AttributeSet
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.material.Text
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.AbstractComposeView

class CustomProfileView @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0
) : AbstractComposeView(context, attrs, defStyleAttr) {

    // XMLから設定可能なプロパティをComposeの状態として保持
    private var profileVisible by mutableStateOf(false)

    // Data BindingがXMLから値を設定する際に呼び出すsetter
    fun setProfileVisible(visible: Boolean) {
        profileVisible = visible
    }

    @Composable
    override fun Content() {
        ProfileContent(profileVisible)
    }
}

@Composable
fun ProfileContent(profileVisible: Boolean) {
    if (profileVisible) {
        Text(
            text = "プロフィールを表示しています。",
            modifier = Modifier.fillMaxWidth()
        )
    } else {
        Text(
            text = "プロフィールは非表示です。",
            modifier = Modifier.fillMaxWidth()
        )
    }
}
```

## XMLレイアウトからData Bindingを利用して値を設定する方法

次に、Data Bindingを用いてXMLレイアウトからプロパティを設定する方法を示します。Data Bindingを使えば、必ずしもカスタム属性（attrs.xml）を定義する必要はありません。

以下はXMLレイアウトの例です。

``` xml
<!-- res/layout/activity_main.xml -->
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <com.example.yourapp.CustomProfileView
            android:id="@+id/customProfileView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:profileVisible="@{true}" />
    </LinearLayout>
</layout>
```

上記のようにapp:profileVisible="@{true}"と記述すると、Data Bindingが対応するsetterメソッドsetProfileVisible(true)を自動的に呼び出します。これにより、XMLだけでビューの挙動を簡単に制御できます。

## AbstractComposeViewとComposeViewの違いと使い分け

ここで、ComposeをXML内で使う場合に選択できる2つの主要なクラスについて整理します。

### ComposeView

- setContentを明示的に呼び出す必要がある
- UIのセットをより自由に制御したい場合に適している

### AbstractComposeView

- setContentの呼び出しが抽象メソッドContent()として定義されているため、自動的にComposeがセットされる
- カスタムビューとして再利用する場合、シンプルで直感的な実装が可能

シンプルで再利用性の高いカスタムComposeビューを作る場合、AbstractComposeViewが特に推奨されます。

## まとめ

この記事では、Jetpack ComposeのAbstractComposeViewを利用したカスタムビューを作成し、Data Bindingを使ってXMLからプロパティを簡単に制御する方法を紹介しました。

これを理解することで、既存のXMLを使用したプロジェクトにも柔軟かつスムーズにComposeを導入できます。ぜひ実務での開発に役立ててください。