OmniAICreator/Qiita-1.07M huggingface dataset:
WinMergeでjpeg比較

Winmergeはファイルの差分比較ツール &　マージツールです。
主な用途としてはテキストファイルの比較かと思いますが、
Excel,Word,PowerPoint,PDFに加えて、画像も比較が可能です。

https://winmerge.org/?lang=ja

## 拡張設定
WinMergeインストール後　プラグイン＞自動展開　にチェックをいれておけば、
テキストファイル以外も比較が出来るようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/12abaca5-e3bc-3ba0-403d-43fd268a447f.png)

## 画像比較
bmpやpngだときれいに画像比較できます。
適当に間違い探しのような画像を作りました。
### 画像1
![住宅街２（日中）.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/ab2e86f3-a6d5-a790-2a6e-2ed9c31478ea.jpeg)
出所：https://commons.nicovideo.jp/works/nc367698

### 画像２
![住宅街1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/26fe5c9b-3e35-8ad9-d60a-169b7e1b0aa0.jpeg)

### Winmergeでの結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/0904be94-da67-6140-9010-868244538acf.png)

この状態でテキストと同じようにAlt+↑ or ↓　で差分箇所移動し、Alt+← or → でマージもできます。

## jpegの場合

jpegの場合、画像圧縮の特性上(離散コサイン変換)でグラデーションをごまかしてしまうので
そのままだとうまく比較できません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/75e2325b-38d6-ac01-23c6-4ea6a693e527.png)
上記のようにほとんど差分として判断してしまいます。

このような場合、色距離間閾値を適当にあげます。下記は100にしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/905a8b3b-6b25-f63c-646b-9bdc7d564e2f.png)

これでうまく比較できるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/6322ac01-9a98-7b04-be08-62713a31e47a.png)
関数のプロパティとローカル変数の違いについて

# 関数のプロパティとローカル変数の違いについて

JavaScriptにおける関数のプロパティとローカル変数の役割と特徴を説明する．

# 具体例

```javascript
function example() {
    // ローカル変数
    let localCounter = 0;
    localCounter++;
    
    // 関数プロパティ
    example.propCounter = (example.propCounter || 0) + 1;
    
    console.log(`Local: ${localCounter}, Property: ${example.propCounter}`);
}

example(); // Local: 1, Property: 1
example(); // Local: 1, Property: 2
example(); // Local: 1, Property: 3
```

この例では
- localCounterは毎回1になる（関数が呼ばれるたびにリセット）
- example.propCounterは呼び出しごとに増加し続ける（値が保持される）

# 詳しい説明

## 1. 関数のプロパティの場合

```javascript
function sayHi() {
    alert("Hi");
    sayHi.counter++; // 関数のプロパティにアクセス
}
sayHi.counter = 0; // 関数にプロパティを追加

// プロパティは関数の外からアクセス可能
console.log(sayHi.counter); // 0
```

## 2. ローカル変数の場合

```javascript
function sayHi() {
    let counter = 0; // ローカル変数
    alert("Hi");
    counter++; // ローカル変数を増加
}

// ローカル変数は関数の外からアクセス不可
console.log(counter); // エラー: counter is not defined
```

違いを表にまとめると
| 特徴 | 関数プロパティ | ローカル変数 |
|------|----------------|--------------|
| スコープ | 関数の外からアクセス可能 | 関数内でのみアクセス可能 |
| 生存期間 | 関数オブジェクトが存在する限り維持 | 関数の実行中のみ存在 |
| アクセス方法 | 関数名.プロパティ名 | 変数名で直接アクセス |
| 値の保持 | 関数の呼び出し間で値を保持 | 関数の呼び出しごとにリセット |
リモナビ：高度なゼロトラストの実現

**ゼロトラスト**とは、すべてのユーザーやデバイス、コンポーネントを常に信頼できないと見なし、厳格なID認証と認可を適用することで、組織を保護するセキュリティ対策の考え方です。

# 接続対象のレベル設定と深度設計
よく映画などでハッカーが重要システムに侵入する際に、
　　「レベル１クリア、現在レベル２突破中」
なんてセリフを聞いたことがあると思います。

 これ、映画の中の話ではなく、実際多くの企業が実施している現実です。
 例えばです。
 - 「社員」と「構内常駐の協力会社の人」は同じネットワークに入れるでしょうか？
 - 「社員」でも「役職者」に応じて入れるネットワークやホストに制限はないでしょうか？

 こう訊けば、「あります」と企業人の多くはお答えいただけると思います。

 - 協力会社　　------> Level-1
 - 社員　　　　------> Level-1 -------> Level-2
 - 社員役職者　------> Level-1 -------> Level-2 -------> Level-3 

Level-1,2,3 をサブネットで管理とした場合、利用者が当該 subnet にアクセス可能とするかのポリシー設定はなかなかに大変なものです。　ですが、企業はNIerの助け、あるいは自社情シスの努力によって、これらを実現しています。

### 🔹 ゼロトラスト
冒頭に説明した通り、ゼロトラストとは、
- なにも信用することなく、
- すべての接続するもの、されるものをピックアップして、
- それら個々に接続設定をあたえていく

といったものです。

### 🔹サブネットのアクセスポリシーはゼロトラストか？
サブネットとは言ってもも netmask 32 ならホストは固定できますし、接続するもの、されるものをきちんと抽出して、その上で例えば netmask 28など限定して、アクセスポリシーを設定するのであれば、これは立派なゼロトラストです。

:::note info
ゼロトラストとは「考え方」です。
すべての接続対象と接続が制御下にあるならば、それはゼロトラストです。
これを導入すればゼロトラストなんてことはありませんし、VPN利用であってもゼロトラストの実現は可能です。
:::

# リモナビによるセキュリティ・レベルの深度設計の実現
ご存知リモナビは、接続されるものへのL4レベルでのPtoP接続を提供するシステムです。
「接続されるもの」への経路を設定し、その経路の利用権限を利用者ごとに与えることができます。　

<INS>まさにゼロトラストそのものです。というより、そうした概念を元に開発されたものなのです。</INS>

**ではこのリモナビを使って、先に話した 接続Levelの制御をどう実現するのか？**

### 🔹実現構成図

深度設計、こと社内の深いアクセス制御は、SaaS利用では限界があるため、今回はオンプレ版の導入による実現方法の一つを示します。

<img width="1024px" src="https://remonavi.com/img/remonavi_zero_trust_advanced.png">

詳細な説明は骨が折れるので、要点をピックアップすると
- Level ごとに リモナビ・オンプレを個別に配備します
- Level間接続では、下位 →上位 への接続を許可した踏み台サーバを設置します
    - この踏み台サーバに Level[n-1] Receiver と Level[n] Sender を配備接続することで Level間接続を実現します

基本的な実現方法はこれだけです。
あとは、図の(*1) の運用をどうするか、どう厳格化するか、必要ならリモナビの接続利用に」「**ワークフロー**」を導入するか、です。

<br>
現在リモナビに「利用申請と承認のワークフロー」機能はありませんが、こうした利用が本格して要望されるのなら、すぐにでも実装する用意はあります。
Oracle Analytics Cloud：ビジュアライゼーションで基準線で属性列を使い横棒グラフで範囲をハイライト表示する

はじめに
---
2024/3 アップデートで属性列を使って基準線を設定することができるようになっています。属性列は、商品大分類や日付などのマスタの列です。属性列を利用して基準線を設定すると、たとえば、棒グラフのビジュアライゼーションで、マスタのあるデータをハイライト表示して、レポート参照するユーザーが注目すべきデータをわかりやすく表示することができます。
属性列を使って基準線を設定してみます

属性列で基準線（基準範囲）を設定したイメージ
![g1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/0291b8f2-db53-0b03-4572-c784aca3a82a.jpeg)

記載時のOACバージョン：OAC 2024 Nov版


前提
---
・ Data Visualizationでワークブックを作ったことがある
・ ワークブック作成で利用するデータセットがある

ワークブックの作成
---
ワークブックを作成します
ビジュアライゼーションで横棒グラフを追加します
例では、属性列の商品大分類と売上金額を選択し、横棒グラフを作成しています。
![g2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/eca72063-8a52-1824-f8ee-18e6ad41ab43.jpeg)

ビジュアライゼーションを選択し、真ん中上部の"プロパティ"タブをクリックします。プロパティで、右端の"分析"タブをクリックします。"統計の追加(+)"をクリックします。
![g3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/6e2e96ca-2648-799d-e14a-de9b8be99384.jpeg)

統計から"基準線"をクリックします
![g4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/c780e478-634b-dda1-d481-570584eb3f74.jpeg)

デフォルトではメジャー値に対して基準線が追加されます。メジャー列から、属性列に変更します。列でメジャー値 イメージは受注金額 をクリックします。
![g5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/c7734b3a-68d1-60b6-a9bc-d1a1bed14c16.jpeg)

属性列を選択します。 イメージは商品大分類 をクリックします
![g6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/8befc9d1-6b3f-bdcb-580b-c873e46c79c1.jpeg)

基準線のタイプを変更します。タイプの"線"をクリックし、範囲を選択します。
![g7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/65110f64-35dc-a3e4-02de-799dda07b037.jpeg)

範囲の値を指定します。イメージでは自：スポーツ飲料、至：果汁飲料をセットしています。
色で、"灰色"の色指定部分をクリックし、色のダイアログで、適宜色を変更します。変更後OKをクリックします
![g8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/3ec401eb-13e5-ee93-7bc3-c34e0d55c30b.jpeg)

もう１つ基準線（範囲）を追加してみます。
統計の追加(+)をクリックします
![g9.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/dd883c95-866c-e9a4-39dd-c9db2943a10d.jpeg)

同様に、列を属性列　商品大分類に変更し、タイプを範囲にします
自：水　至：炭酸飲料とデータ範囲を指定します。色を指定します。
![g10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/cc3c626e-31ea-b89a-8352-650e1e58ae8c.jpeg)

基準線で、名前をクリックし、カスタムに変更すると、追加した基準線に対して任意のラベルを付けることができます
![g11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/b79c6ba9-5f2c-d776-c066-c6545ade3cc6.jpeg)

以上で、基準線で属性列を使って横棒グラフのある範囲をハイライト表示できました。

まとめ
---
属性列を利用して基準線を設定すると、たとえば、棒グラフのビジュアライゼーションで、マスタのあるデータをハイライト表示して、レポート参照するユーザーが注目すべきデータをわかりやすく表示することができます。設定手順について試してみました

[参考記事](https://www.youtube.com/watch?v=2upDZ_rISzw&list=PL6gBNP-Fr8KWlnpaELiCxQJii-F4c7Ehz&index=3)です

以上
プレフィックス

# プレフィックスはブロック（アドレス範囲)
>IPアドレスはイーサネット・アドレスとは異なり、階層的になっている。それぞれの３２ビットのアドレスには、`上位ビットに可変長のネットワーク部`が、下位ビットにホスト部がある。`イーサネットLANのような単一なネットワーク上では、ネットワーク部は全てのホストに対して同じ値を持つ`。これは、`ネットワークがIPアドレス空間の連続したプロックに対応している`ことを意味しており、この`ブロックをプレフィックス`と呼ぶ

* イーサネットLAN とは？
一つのLANと考える。

* 単一なネットワーク上では、ネットワーク部は全てのホストに対して同じ値を持つ
同じネットワーク内だから同じになるよね

### IPアドレスは１０進数で表記される
>IPアドレスはドット付き１０進数表記で記述される。この形式では、４つのバイトのそれぞれが１０進数の０〜255で表される。

### プレフィックスの構成
>プレフィックスは、`ブロック中で最小のIPアドレス`と、`そのブロックの大きさ`で表現される。

* ブロック中で最小のIPアドレスとは？
２進数で表記した時最小にした方がいいのは思い出した。親を表現できる


### ブロックの大きさはネットワーク部のnビット数によって決まる
>ブロックの大きさは`ネットワーク部のビット数によって決まり`、ホスト部の残りのビット数が変化する。これは2の冪乗になることを意味する

## ルーティングプロトコルはルータにプレフィックスを教える
>慣例により、プレフィックスIPアドレスの後ろにスラッシュとネットワーク部のビット長を続けることでブロックの大きさを表す。

>`IPアドレスのみからプレフィックス長を推測することはできない`ため、ルーティング・プロトコルはルーターにプレフィックスを知らせなければならない。

### サブネットマスクでプレフィックスをプロトコルに教える
>プレフィックス長は、ネットワーク部に１を並べた２進マスクと対応する。この方式で記述されたものは`サブネット・マスク`と呼ぶ。サブネット・マスクとIPアドレスとの論理積を取ることにより、ネットワーク部のみを抽出することができる

https://bookplus.nikkei.com/atcl/catalog/23/03/16/00728/
IPアドレスは階層的

>IPアドレスはイーサネット・アドレスとは異なり、階層的になっている。それぞれの32ビットアドレスには、上位ビットに可変長のネットワーク部が、下位ビットにホスト部がある
p423

# 利点
### ネットワーク部を見てパケットをフォワードできる
>プレフィックスの鍵となる長所は、`それぞれのネットワークが固有のアドレス・ブロックを持っている限り、ルーターはアドレスのネットワーク部のみに基づいてパケットをフォワードできる`ことである。同一ネットワーク上の全てのホストへフォワードされるのは、そのパケットが目指すネットワークへ到達できる時だけである。

### 階層構造を使うことによってルーティングテーブルは巨大にならない
>これにより、ルーティング・テーブルはこれ以外の方式の場合よりもずっと小さくなる。インターネット上のホストの数は１０億に迫るとも考えられている。すると、全てのルーターが巨大なテーブルを保持することにある。しかし、`階層構造を用いることで、ルーターが保持する必要のあるのは30万程度`のプレフィックスに対するルートのみになる

階層構造はルーティングテーブルを指定することができる

# 欠点
### IPアドレスは特定のネットワークでなければ使うことができない
>`ホストのIPアドレスは、ネットワーク上でホストが位置している場所に依存`する。`イーサネット・アドレスは世界のどこでも使うことができる`が、すべてのIPアドレスは`特定のネットワークに所属しており、ルーターはパケットをネットワークのアドレスに向けて配送`することしかできない。モバイルIPなどの設計では、ホストが`ネットワーク間を移動しても同じIPアドレスを保つように対応する必要`がある。

### IPv6が普及するまでは効率的にIPアドレスを割り当てる
>`階層構造は注意して運用しなければアドレスの無駄`になる。ネットワークに割り当てられたアドレスのブロックが大きすぎる場合、多くのアドレスが割り当てられたにも関わらず未使用の状態になってしまう。このような割り当ては、`アドレスの数が豊富な場合には問題にならない`。しかし、インターネットの著しい発展が`アドレス空間を急速に枯渇させる`ことは20年以上前から分かっている。IPアドレス不足の解決策としてIPv6があるが、`IPv6が広く普及するまでは、IPアドレスを効率的に割り当てる必要`がある。

https://bookplus.nikkei.com/atcl/catalog/23/03/16/00728/
Xcode16.0+iOS18でMenuのonTapGesutreが効かない問題

# 問題
Xcode16でMenuにonTapGesutreを使用してもiOS18では反応しない問題がある

# 対応

### 1. Xcode16.0を止める
Xcode16.0 + iOS18で問題が発生しており、Xcodeを15.4にすることで解決する
※Xcode15.4はSwiftPMを使用していると度々エラーが発生するため注意が必要

### 2. ロングタップを使用する
良い対応とは言えないがロングタップは問題なく動作をしているため、
0.01秒ほどの、ごく短時間のonLongPressGestureを使用する

```: swift
Menu {
    ...
} label: {
    Text("タイトル")
}
.onLongPressGesture(minimumDuration: 0.01) {
    print("タップされました")
}
```
バージョン管理サーバを止めてしまった話 ～CPUを増強しただけなのに～

# はじめに
バージョン管理システムをAWSのEC2（Amazon Linux 2023）で運用しています。
3回ほどサーバがハングアップしてしまったときの話です。

# サーバ構成
メモリはあまり使わないはずなので、（安いやつで運用しようと思って）
以下で運用していました。
- OS：Amazon Linux 2023
- インスタンスタイプ：t2.micro（1vCPU、メモリ1GB）

# タイムライン
## インスタンスの増強
安くてスペックが上がることに気付いて、
インスタンスタイプ：**t3a.micro（2vCPU、メモリ1GB）**
に変更しました。

## １回目のハングアップ
インスタンスタイプ変更後、2週間ほどは問題なかったですが、
バージョン管理システムが動作していないという報告を突然受けて確認すると以下のような状況でした。
- バージョン管理システムは「408 Request Timeout」
- CPUの使用率50％（EC2のコンソール画面での確認）
- サーバにSSHで接続できず

どうにもならないので、EC2のコンソール画面で停止→起動を行い、ひとまず復旧しました。

## ２回目のハングアップ
数日後、2回目のハングアップが発生しました。
原因調査のために、 以下のスクリプトを10分おきで実行するようにしました。

※psコマンドでCPU使用率、メモリ使用率が高いプロセスをテキストファイルに出力させる
```sh:ps.sh
#!/bin/sh

LOGDIR=/home/ec2-user/ps/`date +%Y%m%d`/
CPULOG=${LOGDIR}`date +%Y%m%d%H%M%S`_cpu.log
MEMLOG=${LOGDIR}`date +%Y%m%d%H%M%S`_mem.log

[ ! -e ${LOGDIR} ] && mkdir -p ${LOGDIR}

date >> ${CPULOG}
ps --no-header -e aux | sort -r -k 3 | head -n 30 >> ${CPULOG}
echo "\n" >>  ${CPULOG}

date >> ${MEMLOG}
ps --no-header -e aux | sort -r -k 4 | head -n 30 >> ${MEMLOG}
echo "\n" >>  ${MEMLOG}
```

# ３回目のハングアップ
3回目が起きたときは休日で何もせずに1時間ぐらいで復旧したようでした。

# 原因調査と対策
2回目のハングアップ後に仕込んだテキストファイルを確認したところ
以下のような状況でした。
- ハングアップ中はテキストファイルへの出力もできてなかった
- ハングアップからの復旧直後、CPU使用率リストで「kswapd0」に出ていた

kswapd0は Linuxカーネルがメモリ管理とスワップの処理を行うためのバックグラウンドプロセスということで、
スワップ領域を確認すると、そもそもないことに気付きました。。

EC2のT2、T3インスタンスタイプは
デフォルトでスワップ領域は設定されていないようです。

これが原因だったかと思い、
2GBのスワップ領域を設定することにしました。

まず、 スワップファイルを以下のコマンドで作成します。
```sh
dd if=/dev/zero of=/swapfile bs=64M count=32
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
```

その後、 `/etc/fstab` に以下を追記します。
```sh: /etc/fstab に追記
/swapfile swap swap defaults 0 0
```

さらに、スワップ処理を行う頻度を変更します。
デフォルトでは60になっているので10にしました（数字が大きいとスワップする頻度が高まるようです）。
 `/etc/sysctl.conf` に以下を追記します。
```sh:/etc/sysctl.conf に追記
vm.swappiness = 10
```
追記後、設定を反映させるために以下のコマンドを実行します。
```sh
sysctl -p
```


こちらの設定を入れてからは、止まることなく稼働しています。

# 考察
t2.micro（1vCPU、メモリ1GB）
で運用していたときのメモリ量は問題なかったですが、
t3a.micro（2vCPU、メモリ1GB）
にしてからCPU数が増えて処理はできるようになったけど、メモリが不足するようになったと思われます。


# まとめ
- CPU スペックのみを増強することによってハングアップすることがある
- AWS の EC2 の一部のインスタンスは、スワップ領域がデフォルトではない → 必要なら要設定

# 参考
- [プロセスを記録する](https://moonoot.hatenablog.com/entry/2017/01/10/110017)
- [[サーバー負荷が上がりピンチ！] CPU使用率が高いプロセスや、メモリを大量に消費しているプロセスについてChatGPTに教えてもらう（topコマンド）](https://note.com/murasamejo/n/nbf07d5124a6b)
- [EC2インスタンスのSwap領域を作成する](https://qiita.com/nakamto/items/5e78e9caceeff6b9e2b4)
LeetCodeを1日1題解いてみる (day27)

27日目に取り組んだ問題はこちら！

# 121. Best Time to Buy and Sell Stock

https://leetcode.com/problems/best-time-to-buy-and-sell-stock/description/

## 問題文
You are given an array prices where prices[i] is the price of a given stock on the ith day.

You want to maximize your profit by choosing a single day to buy one stock and choosing a different day in the future to sell that stock.

Return the maximum profit you can achieve from this transaction. If you cannot achieve any profit, return 0.

## 僕の回答(失敗作)
```py
class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        size = len(prices)
        print(prices_sort)
        start = 0
        end = 0
        while (start + end + 2) <= size:
            max_val = prices_sort[-(end+1)]
            min_val = prices_sort[start]
            max_idx = prices.index(max_val)
            min_idx = prices.index(min_val)
            if max_idx > min_idx:
                return max_val - min_val
            next_max_val = prices_sort[-(end+2)]
            next_min_val = prices_sort[start+1]
            if abs(next_max_val - max_val) >= abs(next_min_val - min_val):
                start += 1
            else:
                end += 1
        return 0  
```

## より効率の良い回答例

```py
class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        lp=prices[0]
        mp=0
        p=0

        for x in prices:
            if x < lp:
                lp=x
                mp=0
            if x > mp:
                mp=x                      
                p=max(p, mp-lp)
        
        return p
```

## コメント
僕の方法では、`[4,1,2]`の時に、
```
1回目: max: 4 , min: 1
2回目: max: 4 , min: 2
```
のように本来は2回目で`max: 2`と変更してほしいが、数値が近い`min: 2`としてしまっている。
```py
if start + 2 > size // 2:
    end += 1
elif end + 2 > size // 2:
    start += 1
elif abs(next_max_val - max_val) >= abs(next_min_val - min_val):
    start += 1
else:
    end += 1
```
そこでこのように変更した。すると、次は、`[2,4,1]`が失敗となってしまった。
正しい方法から、`prices`を前から探索し、小さいものを見つけると、それを最小値にセットし、最大値はリセットするということを行えば良いと学んだ。

## 次の問題はこちら!
https://qiita.com/h_y_s_d/items/bb3859efc8b748103326
ZED SDKはどのモードがいいんですか

StereoLabs のZED2iカメラをZED SDKで使っている。

## 困っていること
DEPTH_MODEはどれを使うのがいいんですか？
```
DEPTH_MODE.NEURAL
DEPTH_MODE.NEURAL_PLUS
DEPTH_MODE.PERFORMANCE
DEPTH_MODE.QUALITY
DEPTH_MODE.ULTRA
```

frame_rate,
カメラの解像度設定
カメラの絵作りに関わる初設定

それらを考慮した時に、どのDEPTH_MODEを使ったらいいのかが、わかりにくい。

## StereoLabsの公式に情報はないのか
- DEPTH_MODEの種類があることは書いてある。
- https://github.com/stereolabs/zed-sdk の大半のスクリプトはDEPTH_MODE.ULTRA を使っている。
- 同一データに対するモードの比較例さえ、見つけられていない。

## ユーザーにできること
- svo2 ファイルを保存する。
- depthを推論するスクリプトへの入力にsvo2ファイルを指定して実行させる。
- その際に、DEPTH_MODEの値を切り替えて、実行させれば、同一のSVO2ファイルに対して、モードの切り替えの影響を見ることができる。


## いまの時点でわかっていること
- ULTRA, NEURAL, NEURAL_PLUS のどれでも、至近距離でのdepthは欠損値になる。

## 近距離のdepthの欠損をなんとかしたい。
- 以下のリポジトリに、depth-anything(version1) とのZED　SDKとの比較スクリプトを置きました。
 参照してください。

https://github.com/katsunori-waragai/depth-anything-zed


![](https://github.com/katsunori-waragai/depth-anything-zed/raw/main/figures/neural_plus.png)
![](https://github.com/katsunori-waragai/depth-anything-zed/raw/main/figures/neural_plus_near.png)

今の時点では,DEPTH_MODE.NEURAL_PLUSでも、近い側はこうなってしまう。
- DEPTH_MODE.NEURAL_PLUS は深度計算が狭い領域に対しても処理できている。例：メガネフレーム。
- 近距離側については制限があり、上記のように手が両方のカメラに写っていても、対応点を見つけられていない。
　（計算時間のために、大きすぎる視差の領域は、ブロックマッチングでも対象外にすることが多い）


[ZED SDK のステレオカメラでdepth計算の再現実験をする](https://qiita.com/nonbiri15/items/b03bd1d990b5dd9614da)
Stability AIのdepth-to-imageモデルをDatabricksで動かしてみる

深度情報を維持して画像を生成できるんですね。

https://huggingface.co/docs/diffusers/en/using-diffusers/depth2img

> [StableDiffusionDepth2ImgPipeline](https://huggingface.co/docs/diffusers/v0.31.0/en/api/pipelines/stable_diffusion/depth2img#diffusers.StableDiffusionDepth2ImgPipeline)によって、新規画像生成に条件を加えるためにテキストのプロンプトと初期画像を入力する事ができます。さらに、画像の構造を保持するための`depth_map`を指定する事ができます。`depth_map`が指定されない場合、今パイプラインは、インテグレーションされている[depth\-estimation model](https://github.com/isl-org/MiDaS)を通じて、自動で深度を予測します。

2年前に発表されていたそうで。気付いてませんでした。

https://note.com/abubu_nounanka/n/n5f5c9f9fb1e8

クラスターはこちら。

![Screenshot 2024-11-26 at 12.22.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/94893d3f-0602-51f7-c4c0-9dc0d46489f4.png)


```py
%pip install mlflow==2.17.2 diffusers==0.31.0
dbutils.library.restartPython()
```

```py
# huggingfaceへのログイン
from huggingface_hub import login

login(token="<Hugging Faceのアクセストークン>")
```

[StableDiffusionDepth2ImgPipeline](https://huggingface.co/docs/diffusers/v0.31.0/en/api/pipelines/stable_diffusion/depth2img#diffusers.StableDiffusionDepth2ImgPipeline)のインスタンスを作成します。

```py
import torch
from diffusers import StableDiffusionDepth2ImgPipeline
from diffusers.utils import load_image, make_image_grid

pipeline = StableDiffusionDepth2ImgPipeline.from_pretrained(
    "stabilityai/stable-diffusion-2-depth",
    torch_dtype=torch.float16,
    use_safetensors=True,
).to("cuda")
```

これで、パイプラインにプロンプトを入力できるようになりました。特定の用語が画像生成をガイドしないように、`negative_prompt`を指定することもできます:

```py
url = "http://images.cocodataset.org/val2017/000000039769.jpg"
init_image = load_image(url)
prompt = "two tigers"
negative_prompt = "bad, deformed, ugly, bad anatomy"
image = pipeline(prompt=prompt, image=init_image, negative_prompt=negative_prompt, strength=0.7).images[0]
make_image_grid([init_image, image], rows=1, cols=2)
```

左がオリジナル、右が生成結果。

![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/5520af5f-a384-d4ad-3f30-97cbbe8cf42f.png)

プロンプトを変えてみます。

```py
prompt = "two dogs"
negative_prompt = "bad, deformed, ugly, bad anatomy"
image = pipeline(prompt=prompt, image=init_image, negative_prompt=negative_prompt, strength=0.7).images[0]
make_image_grid([init_image, image], rows=1, cols=2)
```

![download (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ca8f0492-bf73-1891-4860-cbd21e11e17a.png)

パラメーターやネガティブプロンプトも調整してみます。

```py
prompt = "two dogs, cartoon"
negative_prompt = "bad, deformed, ugly, bad anatomy, realistic"
image = pipeline(prompt=prompt, image=init_image, negative_prompt=negative_prompt, strength=1.0).images[0]
make_image_grid([init_image, image], rows=1, cols=2)
```

![download (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/e4468fea-bf17-aeaa-c967-53b22756070e.png)

面白い。

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
Markdown AIの新たな可能性！サイト制作以外の便利な使い方

![Mdown_baner1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921729/2e2463aa-fa61-12a7-08d3-fc43bd7f82b3.png)
# はじめに
Markdwon AIとは、「Markdwon形式でWebサイトが制作できる」「面倒なサーバー設定をしないでサイトを公開できる」「AIをカスタマイズして誰でもサイト内にAIを実装できる」AI Webサイト制作ツールです。
以下にURLを記載しておくので是非触ってみて下さい！

https://mdown.ai/

そんな簡単にサイトを作れて公開できるMarkdwon AIですが、実際にはどんなサイトが作れるのか？サイト制作以外にどんな使い方ができるのか？今日は、そんな疑問に答えたいと思います。

# Markdwon AIでどんなサイトが作れるのか？
実際にどんなサイトを作れるのかは、記載するよりも実物を見てもらった方が早いと思うので、以下にURLを貼っておきます！

【今日の献立】
今日の献立を提案してくれるツールです。
ランダムに献立を書き出す、入力された食材で献立を書き出す、入力されたカロリー内で献立を書き出す、の３つツールがあるので是非使ってみて下さい。

https://mdown.ai/content/566ff4e6-19e2-40dd-be27-6f374588a8c0

【60秒で出来る性格診断ツール】
簡単な質問に答えるだけでAIが性格診断をしてくれます！
修正が簡単で、問題を変えてもAIがそれに合わせて回答してくれるのが便利です。

https://mdown.ai/content/6e91471b-83fc-449b-8e6c-e83bdfcf43f7


# サイト制作以外の用途
Markdwon AIは、上記の様なサイトを作って公開する以外にも便利な使い方があります。
今回は、その用途を紹介していきます！

### **・議事録/計画書の作成**
Markdwon AIは、**議事録や計画書などのドキュメント作成に便利です。**
Markdwon形式で簡単に記載できる事はもちろん、ボタンひとつでURLが自動で発行され、そのURLを共有するだけで**制作ページをすぐにシェアできます！**
また、修正に関しても便利で、間違えた箇所をエディター画面で修正すれば、**URLを共有した人全てに修正がすぐ反映される**ので、会議などリアルタイムでファイルを記入/編集したい時や、計画書や仕様書など大人数でのファイル管理する場合に便利です。
その他にAIを実装すれば、議事録のまとめや修正箇所の見直しなどAIの力をフルに活用出来るので、**作業が効率化または短縮できます。**

例：会議議事録、プロジェクト計画書、仕様書の作成
  
### **・教育/トレーニングツール**
Markdwon AIを使えば、教育やトレーニング用のコンテンツを簡単に作成できます。
AIを活用すれば、学習者の進捗に応じたコンテンツを生成したり、用途に合わせてクイズや教材を提供することも可能です。
また、Markdwonという分かりやすくて使いやすい記法もプログラミングの入り口としてぴったりだと思います。
その例として、10月25日から11月25日まで開催された「Markdown AIを使った記事を投稿しよう」のQiita内での公式イベントで、教育やトレーニングに向けなサイトを作って下さった方々がいたので、紹介させて頂きます！

【Ruby on Rails Gold試験問題出題サイト】

https://mdown.ai/content/0066e78c-1c1f-4b5b-8223-676c2f68adcb

【小学生向け宿題サポートAI 】

https://mdown.ai/content/b6c694e4-92e2-4c4f-b8b3-3fa32e33078d

【植物おしえてボード】

https://mdown.ai/content/6c9c12d9-7ba0-4027-8eb5-295d4f7b39a1


### ・個人特化の作成ツール
Markdown AIは個人でAIをカスタマイズできる事から、個人特化の作成ツールとして使用することができます。
この拡張性がとても便利で、例えば、「コードのエラー箇所を教えて」や「キーワードで文章を考えて」、「入力された場所の観光地を教えて」などそれぞれの用途に特化したAIを作成でき、個人の目的やライフスタイルに合わせたツールとしてMarkdown AIを活用することができます。
また、現在Markdwon AIでは、無料では使用制限があるGeminiやGPT-4o、ClaudeのAIが使い放題なので、シンプルにお得です！今後は無くなるかもしれないので、是非今の内に使ってみて下さい！

# まとめ
Markdown AIは、上記で記載したように、多岐にわたる用途で活用できる柔軟なツールです。
サイト制作だけでなく、業務の効率化や頭の中にあるアイデアを形にする場面でも、その真価を発揮します。
Markdown AIは、さらなる可能性を追求し、今後も続々とアップデートを予定しています。
これからの進化にぜひご期待ください！

![MarkdownAI_note_touka.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3921729/44b0a135-f6b2-bdc8-f35a-62a33ef005ba.png)
【競技プログラミング】AtCoder Beginner Contest 332_D問題

# 問題
https://atcoder.jp/contests/abc332/tasks/abc332_d

# アプローチ法
幅優先探索（BFS）を使用して、グリッドAからグリッドBへの最短変換経路を見つける。
各状態（グリッド配置）をノードとし、隣接する行や列の交換をエッジとして考える。
BFSを使用することで、最小の操作回数を求める。


# 解法手順

1. 入力からグリッドAとBを読み取る。

2. グリッドの状態を効率的に比較・保存するために、各グリッドを不変のタプルに変換する関数を定義する。

3. 幅優先探索のためのキューを初期化し、初期状態（グリッドA）をキューに追加する。

4. 訪問済みの状態と、その状態に到達するまでの操作回数を記録する辞書を初期化する。

5. BFSを開始する：
   a. キューから状態を取り出する。
   b. 現在の状態に対して、可能なすべての行の交換を試みる。
   c. 現在の状態に対して、可能なすべての列の交換を試みる。
   d. 新しい状態が生成されるたびに、それが未訪問であればキューに追加し、操作回数を記録する。

6. BFSの過程で目標状態（グリッドB）に到達した場合、その時点での操作回数が最小の操作回数となる。

7. BFSが終了しても目標状態に到達しなかった場合、変換は不可能であると判断する。

8. 結果を出力する：
   - 変換が可能な場合、最小の操作回数を出力する。
   - 変換が不可能な場合、-1を出力する。



# ACコード
```python:ac.py
from collections import deque

# 1. 入力からグリッドAとBを読み取る
def read_grid(N):
    return [list(map(int, input().split())) for _ in range(N)]

# 2. グリッドを不変のタプルに変換する関数
def grid_to_tuple(grid):
    return tuple(tuple(row) for row in grid)

# 3. & 4. BFSの初期化
def initialize_bfs(start_grid):
    queue = deque([(start_grid, 0)])  # (グリッド, 操作回数)のタプルをキューに追加
    visited = {grid_to_tuple(start_grid): 0}  # 訪問済みの状態と操作回数を記録
    return queue, visited

# 5. BFSの実行
def bfs(start_grid, target_grid, H, W):
    queue, visited = initialize_bfs(start_grid)
    target_tuple = grid_to_tuple(target_grid)

    while queue:
        current_grid, steps = queue.popleft()

        # 目標状態に到達したかチェック
        if grid_to_tuple(current_grid) == target_tuple:
            return steps

        # 行の交換を試みる
        for i in range(H-1):
            new_grid = [row[:] for row in current_grid]
            new_grid[i], new_grid[i+1] = new_grid[i+1], new_grid[i]
            new_tuple = grid_to_tuple(new_grid)
            if new_tuple not in visited:
                queue.append((new_grid, steps + 1))
                visited[new_tuple] = steps + 1

        # 列の交換を試みる
        for j in range(W-1):
            new_grid = [row[:] for row in current_grid]
            for i in range(H):
                new_grid[i][j], new_grid[i][j+1] = new_grid[i][j+1], new_grid[i][j]
            new_tuple = grid_to_tuple(new_grid)
            if new_tuple not in visited:
                queue.append((new_grid, steps + 1))
                visited[new_tuple] = steps + 1

    # 目標状態に到達できなかった場合
    return -1

# メイン処理
def solve():
    # グリッドAとBを読み取る
    H, W = map(int, input().split())
    grid_a = read_grid(H)
    grid_b = read_grid(H)

    # BFSを実行して最小操作回数を求める
    result = bfs(grid_a, grid_b, H, W)

    # 結果を出力
    print(result)

# プログラムの実行
if __name__ == "__main__":
    solve()

```
キータで初めての記事投稿　知っておく3つのこと

QiitaはUIがわかりやすく、何も調べずに投稿だけはできますが流石に以下の内容は知らないと、自分で見直すのにも見づらかったので共有します。ちなみに調べたらすぐ出てきますが、私は備忘録メインでしたので気にせず投稿していました。以下のURLに詳しく書いてあります。

Markdown記法 チートシート
https://qiita.com/Qiita/items/c686397e4a0f4f11683d

## 目次
1.コードを挿入
2.文字を大きくする
3.編集する


### 1.コードを挿入

```:java
class Main {
  public static void main(String[] args) {
    System.out.println("出力内容");
  }
}
```
これは

（バッククォーテーション×3） :java 
class Main {
  public static void main(String[] args) {
    System.out.println("出力内容");
  }
}
 （バッククォーテーション×3）

 `（バッククォーテーション）を３つ並べて囲みたいところにつけると可能です。半角Sfiht+＠キーボード入力できます。代用は~（チルタ）。

 
 見出しのjava表記
 ```:java
 ```
 これは、:javaという風に:（コロン）を使用します。


### 2.文字を大きくする

#␣（半角スペース）を使用します。＃の数で大きさが変わる
#　表示
##　表示
###　表示
####　表示
#####　表示
これのスペースを半角にすることで
# 表示
## 表示
### 表示
#### 表示
##### 表示
代用として文字列の下に-（ハイフン）。



### 3.編集する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883243/ff8aef41-d252-ec60-8149-014ec8461bb8.png)

この♡いいねの一番下にある・・・を押すと自分の投稿記事を修正できる。<br><br><br>





   

これだけ覚えれば備忘録用でも最低限見直しやすい記事に修正できます。私はあまり色や画像などは使用しても見やすくならないタイプなので、とりあえず以上です。
（p.s.文末に＜br＞（<>半角）挿れると行を開けることができる）
TEST MARKDOWN

```ruby:qiita.rb
puts 'The best way to log and share programmers knowledge.'
```

```.rust
rust
```

[書き方](https://qiita.com/shizuma/items/8616bbe3ebe8ab0b6ca1 "https://qiita.com/shizuma/items/8616bbe3ebe8ab0b6ca1")

##見出しh1

##ハイライト構文

###見出しh3

```c
void hello(void)
{
　return "hello world!";
}
```
うーん、見出しだけ機せん。

>ここに引用文を書きます。

_イタリック_

*イタリック*

太字
「__」または「**」で文字をくくります。
__太字__
**太字**

+1
+2
+3

*1
*2
*3

-1
-2
-3

リストはダメか...

&lt;hr&gt;
***
* * *
---
- - -
水平線は全部OK


|A|B|C|
|X|Y|Z|
テーブルはだめ

```math
\left( \sum_{k=1}^n a_k b_k \right)^{\!\!2} \leq
\left( \sum_{k=1}^n a_k^2 \right) \left( \sum_{k=1}^n b_k^2 \right)
```
数式はOK

https://qiita.com/Qiita/items/c686397e4a0f4f11683d
家建替えのために色々開発した話(ChatGPTやAppSheetを活用)

# はじめに
なんやかんやあって家を建て替えたりしました！
その際、必要になるかと思って作ったツールたちがあるので紹介します。

# 作ったもの

## 差額比較サイト
特定の金額と比較する場面があるかと思って作りました。
データを保存する必要もなかったので「GitHub Pages」を利用して使えるように作りました。
Reactで実装したのですが、普通に作っても面白くないのでChatGPTに全コード書かせました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320059/f61511bc-6fe4-101b-8bd9-3a2e2558cdaf.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320059/07570ee8-2fb9-caab-4f42-84de3fd353ee.png)


GPT-4o前に作ったのですが、画像を貼り付けて作らせることを知らなかったので、今作り直したほうが望みのデザインになりそうです。

…HMの営業担当者が丁寧で、都度前回との比較金額を提示してくれたため使用機会は皆無でした…。
記事にすることで成仏させたいと思ってます…。
黒星をつけたものと白星の金額を比較するサイトでした…。

## 家具リスト
新居で使用予定の家具の寸法を把握するために作りました。
これはデータ保存＋共有で使用する必要があるため、「Appsheet」を使用しました。（打ち合わせで必要になると思って急ぎで作る必要もあって…）

* 使用例1
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320059/56d1695a-d1f0-20fa-c1ba-cb1926b2748e.png)

* 使用例2
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320059/378254ea-5b64-bbb1-3ea3-be5000a4ff28.png)

工夫点として、データ保存をSpreadsheetにしており、
横✕奥行✕縦cm表記の箇所はSpreadsheetの関数で自動設定するようにしていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320059/355284d5-8264-baa0-1392-ef3c5ba29b04.png)

稀に使ったサイトでした。

## 引越ラベル

１番使用頻度が高いです。
梱包段ボール毎に種別を割り振り、どこで使うのか、中身の画像を撮って見返せるように作ったものです。
ナンバーは自動で割り振るようにし、登録後にでてくるラベルを段ボールへ記載することで判断できるようにしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320059/acd16761-6e64-4ce8-cb35-0ce7b6d92681.png)

「ラベル」が内容の種別を判断するために使用するところです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320059/2e596bb5-14cf-8d2a-b53e-2954d91554ab.png)
事前に必要となるラベルを登録しているわけではないため、新規作成を可能にしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320059/fda4705e-ee5d-d2f5-5589-7e3b25a212f9.png)

また、段ボールを新居・仮住どちらで使いたいのか、検索がしやすいように中身をメモへ書けるようにしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320059/cb32ac5f-7c82-182e-7c2e-d92db15c2917.png)

ラベルを見るだけである程度の区分わけができるため、引っ越し時に、どの部屋に持っていってほしいか等の指示を手軽にすることができました。
（Cはじまりのラベルはキッチンに持っていってほしい等）

荷解き時にもどの段ボールから手を付ければよいのかが判断しやすく助かっています。(絶賛荷解き中)

# 最後に
この記事で、そういう使い方もあるのか、等なにかの参考になれば幸いです。(いいね待ってます！)
誤字脱字、もっと詳細が知りたい等ありましたらコメントを頂けますと幸いです。
ここまで読んでいただきありがとうございました。
Serviceの単体テストを整理する（SpringBoot）

# はじめに
ここまでに、Controllerと、DBアクセス部分の単体テストについて整理してきました。

https://qiita.com/ryotaro76/items/0c639e6e40cea44061c0

https://qiita.com/ryotaro76/items/75217660b1612854426d

最後にService層の単体テストを整理したいと思います。

# 環境
Windows 11
Eclipse
Java21
Gradle
Spring Boot 3.4.0
Spring Boot Test 3.4.0
Lombok
Mockito 5.14.2

# 単体テスト方針
以下のような方針でテストの実行方法を検討することにします。
ここでは具体的なテストケース、検証内容には触れません

・モックを利用する
・メソッドの呼び出し回数、引数をチェックする
・実行結果及び応答値を検証する

※基本的な考え方は、Controllerと同じです。

# やってみる
## テスト対象クラス
```java:User.java
@Data
@AllArgsConstructor 
public class User {
	long id;
	String name;
}

```

```java:UserMapper.java
@Mapper
public interface UserMapper {
	User findById(int id);
}
```

```java:UserService.java
@Service
public class UserService {

    private final UserMapper userMapper;

    public UserService(UserMapper userMapper) {
        this.userMapper = userMapper;
    }

    public User getUserById(int id) {
        return userMapper.findById(id);
    }
}
```

## テストクラス

```java:UserServiceTest.java

@ExtendWith(MockitoExtension.class) // Mockitoを有効化
public class UserServiceTest {

	@InjectMocks
	private UserService userService;

	@Mock
	private UserMapper userMapper;

	@Test
	void testGetUserById() {
		// モックの設定
		User mockUser = new User(1, "John Doe");
		when(userMapper.findById(1)).thenReturn(mockUser);

		// サービスメソッドを呼び出し
		User result = userService.getUserById(1);

		// 結果を検証
		assertNotNull(result);
		assertEquals("John Doe", result.getName());
		verify(userMapper, times(1)).findById(1);
	}
}
```

## 実行する
Eclipseで実行するとこんな感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132118/ed08934d-3524-d948-f78b-feafc566c9ef.png)

# さいごに
Mockitoの使い方は、Controllerの時とほぼ同じですが、
今回のテストクラスはSpringに依存しないMockitoとして作りました（コンテナの初期化とか余計な時間がかからない）

またここまでの整理で、サーバサイドの各レイヤでの単体テストが整理できたので
現場のプロジェクトでも展開していきたいと思います。
え、何が起こった？LazyVim をバージョンアップしたら、GitHub Copilot が使えなくなったので、それを解決した話

# はじめに

LazyVim を 12.x から 13.x に上げた。
そしたら、突然こういうエラーが出てくるようになった。
初めての表示だったので、どうしていいかわからず… :thinking: 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51857/6cdf9f43-fee2-598a-af18-043a6b9ca1b0.png)
# 原因を探す :spy:

## まずはログを見てみる

:::note info
こちらは、13.x のもので、現在の LazyVim  では、`<Space> -> <n>` で表示できる様になっているので、上記 Lua コマンドの入力は必要なし！便利に改善されてます！
:::

このポップアップ、標準だと3秒くらいで消えてしまいます。確認するためだけに再起動しまくるのもアレだし、かといってこのポップアップ表示 ([noice.nvim](https://github.com/folke/noice.nvim) というプラグインが担ってるみたい。) に重要な情報が載ってたりするので…。

さて、LazyVim でこうしたポップアップログの確認の仕方知ってますか？

僕は知らなかった。。
Vim のつもりで `:messages` コマンド打っても何もでてこない。。

とうことで、見つけ出したのは、、LazyVim の場合は、ここら辺に関して [Snacks]() という、LazyVim 自体の作者の [folke](https://github.com/folke/noice.nvim) 氏が作成した QoL 向上のためのプラグイン郡の中に解決策があった事。
それが [snacks.nvim](https://github.com/folke/snacks.nvim)。

ということで以下のコマンドを打ってみる。

```vim
:lua Snacks.notifier.show_history()
```

出てきた！

![WindowsTerminal_TBzDahw7vj.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51857/fe6b877b-b7c8-86c7-0416-09b82008b90c.png)

微妙に LazyVim の文化があるので、ここら辺は経験則って感じ。。
まぁ、これで、また別のトラブルが発生した際にも参照しに行けそう。

ちなみに、ここで教えてくれてた。

https://github.com/LazyVim/LazyVim/discussions/1963#discussioncomment-11274166

## プラグインを読み込んでいる部分を操作してみる

ということでエラーをじっくり眺めてみる。
まぁ、言っていることは、直訳すると「"lazyvim.plugins.extras.coding.copilot" ってモジュールはスペックでみつらないよ。」ということ。
このスペックはそのまま「仕様」ということなので、どうやら「LazyExtras」の仕様として見つからない状態になっていたみたい。

はたして原因はそれだけかな？というのを調べるためにも、一度コンフィグから該当の読み込み設定部分をコメントアウトしてみる。

```lua:nvim/lua/config/lazy.lua
require("lazy").setup({
  spec = {
  -- 省略
  -- { import = "lazyvim.plugins.extras.coding.copilot" }, <-コメントアウトする
  -- 省略
  },
})
```

すると…、エラーが出ない！
ということで、原因はこのコンフィグの書き方によるものだという事がわかった。

## そして原因を見つけた

はて、これまで使えてたのになんでかな？？
ということで、[LazyExtras](https://www.lazyvim.org/extras) のリストを読んでみる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51857/cda07836-498c-2696-218b-878c074be2fc.png)

ふーむ、おかしそうなところはないぞ？

ということでさらに、LazyExtras を LazyVim のビューワー上で参照してみる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51857/e49a8f7c-4296-1e67-3b2a-2d6e0d48bc8b.png)

おや？？
```lua
"lazyvim.plugins.extras.coding.copilot"
```

ではなく、
```lua
"lazyvim.plugins.extras.ai.copilot"
```
になっているぞ？
どうやらこれが問題のようだ！

# 原因への対応

ということで、この部分をコンフィグのところで書き換えてみる。

```lua:nvim/lua/config/lazy.lua
require("lazy").setup({
  spec = {
  -- 省略
  { import = "lazyvim.plugins.extras.ai.copilot" },
  -- 省略
  },
})
```

すると…！
読めた！！！

そしてちゃんと使えてる！！





# さいごに

僕はけっこう面倒くさがりなので、こういう自分のツール系だとついつい更新を見ずにアップデートしてしまう。
一応アップデート内容のオーバービューは見るのだけど、やはりこういったコンフィグレベルの細かいものは本当に追えない。

とまぁ、そんな中でトラブルは付き物…なんだが、意外とこうしたトラブルシュートって以外と探すのが面倒になってなぁなぁで放置してることもままある。
今回こうしてトラブルシュートとして残せたのは、将来の僕に対するヘルプにできるしよかろうとことで、ここはまとめる。
Oracle Analytics Cloud：ビジュアライゼーションのツールチップの書式を設定する

はじめに
---
2024/3 アップデートでツールチップの数値書式で、負の数の書式を設定できるようになっています
たとえば、地図上で、拠点毎の売上実績の状況を表示し、拠点にマウスカーソルをもっていくと、その拠点の詳細を吹き出し（ツールチップ）で表示します。レポートを見るユーザーがツールチップによって拠点の詳細を理解を手助けすることができます。その際に、ツールチップで表示される数値書式で負の値に対して赤字でハイライト表示できるようになりました。
ツールチップに書式を設定してみます

![g1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/a9856db7-c6a7-b2b7-5c76-7a6db9514a91.jpeg)

記載時のOACバージョン：OAC 2024 Nov版

前提
---
・ Data Visualizationでワークブックを作ったことがある
・ ワークブック作成するためのデータセットが作成済みである

ワークブックの作成
---
ワークブックを作成します
ビジュアライゼーションでマップを追加、ツールチップに、マイナス値を持つメジャー項目を配置しておきます。※下記、イメージでは、売上金額と前年金額、売上金額と前年金額とマイナスしたマイ計算で売上前年差の計算項目を配置しています
![g3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/f9ffa2a3-357e-6419-66b3-6d84b43c58f5.jpeg)

真ん中部分上部の"プロパティ"タブを開き、"値（＃）"タブをクリックします
マイナス値を持つメジャー項目を開き、ツールチップ書式を設定します
ツールチップの数値書式で、数値にセットします。
![g4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/179d5385-524f-d1fb-b4b8-2a0bb3026b97.jpeg)

負の値で、(1,234)赤字を指定します
![g5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/00672c79-cb97-9e1e-ba18-c411aa9f5a59.jpeg)

拠点にマウスカーソルをもっていくと、その拠点の詳細を吹き出し（ツールチップ）で表示し、負の値が赤字表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/81f13f6a-df85-1222-23bf-4b9eae14da2b.png)

まとめ
---
ツールチップの数値書式で、負の数の書式を設定してみました。本記事ではマップを使いました。その他のビジュアライゼーションでもツールチップがセットできますので、同様に書式設定をすることができます

以上
CSSを使って長い文言に対して三点リーダーでの省略表示

`2024年11月`現在、CSSを使って長い文言に対して三点リーダーでの省略表示についてメモします。

## 結論

1行のみと複数行の三点リーダー表示は別々の方法があるが、面倒なので、統一で下記複数行を対応できるcssを利用します。

```css
.text {
  display: -webkit-box;
  overflow: hidden;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 1;
}
```

- `-webkit`はベンダープ独自の機能であるが、主流のブラウザchrome、Safari、Edgeなどはwebkitベースなので、これだけで十分
- `display: -webkit-box`
  - この表示領域は三点リーダーで省略表示できる枠だよとの宣言
- `overflow: hidden;`
  - 領域を超える部分を非表示にする
- `-webkit-box-orient: vertical`
  - 複数行の表示する場合は、各行の内容は上から下へ縦で並ぶ（毎行の文字が横で表示）
  - `horizontal`を指定する場合は左から右へ水平で並ぶ（毎行の文字が縦で表示）
- `-webkit-line-clamp: 1`
  - 行数を設定する
  - 上記の例は1行限定にする

## 表示イメージ

- 単一行の表示例

![スクリーンショット 2024-11-26 11.41.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123446/4de514a6-2ae8-2121-c3fd-683f7cfb249b.png)

- 複数行の表示例

![スクリーンショット 2024-11-26 11.40.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123446/f182db72-6e9f-6fac-50a3-735c2242ca41.png)

## CSS Overflow Module Level 4の`line-clamp`

CSS標準に`line-clamp: 1`のような話がありますが、chrome最新版で確認したところ、`2024年11月`現在はまた識別してくれないですので、実際は利用不可です。

## 参考記事

- [複数行かつ 溢れたら 3 点リーダーを付ける処理を CSS だけで実現したい](https://zenn.dev/bicstone/articles/webkit-line-clamp)
- [複数行を三点リーダーで省略する（EI11対応）](https://qiita.com/gombeedoe/items/d84601fe9401622f4339)
- [CSSでたまに見かける、-webkit-って何だろう...？](https://zenn.dev/azunasu/articles/581153b9ec1f92)
- [MDN -webkit-line-clamp](https://developer.mozilla.org/ja/docs/Web/CSS/-webkit-line-clamp)
デザインパターンを教えるときに　ー設計は目的によって変わるー

新人向けにデザインパターンを教える際に意識しているポイントの一つをここに示します。

### 設計は状況によって変わるもの

設計の経験を重ねると、同じ機能を実現するためでも複数の設計案が考えられることに気づくと思います。そして、どの設計が「より良い」となるかは、そのときの状況や重視するポイントによって変わります。

そのため、新人にデザインパターンを適用した設計を考えさせる際には、以下の点を伝えるようにしています。

- **目的を意識する**  
  今回の目的が「デザインパターンを理解したか確認すること」である場合、デザインパターンが適用されていることが分かりやすい設計にするのが良い
  
- **設計時の重視点を説明できるようにする**  
  実際の業務では、どのような理由でその設計を選んだのか（例：フィルタ条件が今後増える可能性が高いから拡張性を重視した）を説明できるようにすることが重要

- **重視点によって設計は大きく変わる**  
  設計時に何を重視するかで、最終的な設計は全く異なるものになる。  
  - 重視点が間違っていれば、レビューで指摘される。  
  - 正しい重視点で設計されていれば、レビューでの改善案もスムーズに出てくる。  

---

### デザインパターンの選択による設計の違いを示す

たとえば、同じ「ソート」の機能を設計する場合でも、**Factory Method**パターンを適用した場合と**Bridge**パターンを適用した場合では設計が異なります。以下に具体例を挙げて説明しています。

#### Factory Methodパターンを適用した場合

以下は、Factory Methodパターンを適用したソート設計のクラス図です。

![Factory Method Patternのクラス図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660070/13026d69-c2c7-fcc4-ebe4-2850eece1648.png)

#### Bridgeパターンを適用した場合

次は、Bridgeパターンを適用したソート設計のクラス図です。

![Bridge Patternのクラス図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660070/9bd0e60c-bc46-a54d-737d-c0ba6eb2bb92.png)

---

### パターン適用による違いを比較

一見すると両方のクラス図は似ているように見えます。しかし、以下の点で異なります。

- **具象クラス同士の依存関係**  
- **抽象クラスやインターフェース間の依存の強さ**  

その結果、FactoryMethodパターンはソートの具象クラスからCompareの具象クラスへの依存があるため、ソートの具象クラスはCompareの具象クラスの変更から影響を受けやすくなります。しかし、ソートの具象クラスを利用するクラスはComparerの具象クラスの変更から影響を受けにくいです。
また、Bridgeパターンの場合はソートの具象クラスとComparerの具象クラス間の依存がないため、お互いに変更の影響を受けにくいです。しかし、ソートの具象クラスを利用するクラスはソートの具象クラスおよびComparerの具象クラスの変更から影響を受けやすくなります。

この違いを説明することで、新人にも「どのデザインパターンを選ぶかによって設計全体がどう変わるか」を理解してもらいやすくしています。

--- 

こういったアプローチで、デザインパターンの重要性や選択の背景を具体的に教えています。
【合格体験記】Python3 エンジニア認定実践試験

こんにちは。今回はOdysseyの[Python3 エンジニア認定実践試験](https://cbt.odyssey-com.co.jp/pythonic-exam/python3cpe.html)を受験し、無事に合格することができたので学習方法や試験を受けての所感をまとめたいと思います。

![結果](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3853136/7b8d4e60-93ad-b462-b124-05e36829bf03.png)

## 1. 背景

私は今年からIT系の会社に新卒入社し、エンジニアとして業務を行っています。業務ではクラウド（主にAWS）によるシステム構築を行っていますが、Pythonを用いてコーディングを行うこともあります。
業務で使用するにあたりPythonの標準的な知識が不足していると感じたため、以前に[Python3 エンジニア認定基礎試験](https://cbt.odyssey-com.co.jp/pythonic-exam/python3basic.html)を受験しました。せっかくなので基礎試験での記憶も新しいうちにインプットを増やそうと思い、今回実践試験を受験しました。

◯基礎試験の体験記はこちらになります↓

https://qiita.com/rizumu620/items/2d7d13138ee5fba93fd6

## 2. 勉強方法

以下２点を前提として、合計3週間ほどの学習期間で試験に臨みました。
* 基礎試験の内容が既習である
* 一定のプログラミング経験がある（Pythonは5年ほど使用経験がありました）

具体的な教材、内容は以下の通りです。

① **[Pythonエンジニア育成推進協会監修 Python実践レシピ](https://www.amazon.co.jp/dp/4297125765)**
まずは本書の各章を愚直に「読む→必要に応じて挙動の確認」の繰り返しで進めました。1日に2~3章を目安に、合計10日ほどで1周を終えました。ここでは細部まで覚え込むというよりも「こんな機能もあるんだな〜」というレベルで、後々の演習で復習をする際のフックを作るイメージで気楽に進めました。
挙動確認のコーディングは[Google Colaboratory](https://colab.research.google.com/)で簡易的に行い、本書と同一のコードを試したり、「ここの記述を変えたらどうなるんだろう」と気になった部分をいじってみたりしました。Python試験では「（エラーも含め）このコードを実行したらどの結果が得られるか」を問う設問も多いため、正しく動作するコードをいじってどのように出力結果が変わるか経験値を増やすことが効果的だと感じました。

② **[ExamApp](https://python-basic.com/)・[Dpro Exam](https://diver.diveintocode.jp/dive_into_exam)**
模擬試験形式の演習はこれら2つのサイトを使用しました（というよりこれらしかなさそう...？）
ExamAppは初級・中級・上級のレベル別になっているため、最終的に正答率100%の状態になるまで各3回程度繰り返しました。基本的に①完了後に進めましたが、初級に関しては「どんな問題が出るのか」学習初期に押さえておくため①の中頃に一度行いました。
試験日の3日ほど前からはDpro Examをひたすら繰り返しました。無料枠なのでランダム出題で演習→結果確認のみでしたが、4回ほど繰り返しても新規の問題が多い印象で、問題を覚えてしまうことなく演習を繰り返せました。

③ **その他の参考サイト等**
上記を主軸に、理解を深めたいと思った箇所は適宜ネットを活用しました。やはり公式の参考書は内容が正確な一方でお堅い印象があり、まずふんわりイメージを掴みたいと思った時にはQiitaをはじめネット上の解説記事が助けになると感じました。
私が今回参考にしたものの中で特に助けになったものを、恐縮ですが以下に選抜します。
* **[PythonZen & PEP8検定試験](https://www.pythonic-exam.com/exam/pythonzen-pep-8)**
参考書①の第2章に該当するコーディング規約に関する理解を深めるために取り組みました。禅の考え方が共通認識として推奨されていることは、試験勉強を度外視しても興味深く感じました。

* **[Python の unittest の mock（@satamame）](https://qiita.com/satamame/items/1c56e7ff3fc7b2986003)**
私は参考書のみではモックオブジェクトの使い方がいまいち掴めなかったのですが、こちらの記事で理解を深めることができました。段階的に、どういう事象に対して課題感があってモックオブジェクトが必要になっているのかの説明がなされており、かゆいところに手が届く解説記事でした。

* **[Pythonのloggingをイメージで理解する【Python Logging徹底解説】（@でんちゅー）](https://zenn.dev/dencyu/articles/2b58f669bcd473)**
私はログに関してlogging/logger/handler等の区別ができていなかったのですが、こちらの記事でイメージ図を踏まえた解説を読むことで理解を含めることができました。上記同様にloggingの前段としてのprint文から話が始まっており、loggingの必然性が自然と飲み込めました。また、度々出てくるイメージ図は「まさにこれが欲しかった！」という情報でした。

以上、ほんの一部ではありますが紹介させていただきました。自分がまさに欲しかった情報を得られるサイトを探している時間は宝探しのようにワクワクできて結構好きな時間です。

## 3. 所感
今回は実践試験の受験を通じて、Pythonの標準機能に関する理解をより深めることができたと思います。デコレータやコンテキストマネージャ、ジェネレータなどは今までなんとなく聞いたことはあるけどいまいち使い方がわからないなという状態だったので、体系的に整理することができ非常に満足でした。また、デバッグやテスト、ログに関する機能は本格的な運用でもないとなかなか触れることのない項目なので、知見を広げることができました。
今後はデータ分析系の試験を受験したいと思います。また、インプットがメインだったので今度は学習で学んだことを自分の言葉でアウトプットしてゆきたいなと思います。

##
今回は以上です。ご覧いただきありがとうございました！
【LaTeX】文章の間に図を入れる方法【図の回りこみ（wrapfigure）】

文章の間に図を入れる（回りこませる）ことができるwrapfigパッケージについて説明する。

以下をプリアンブル中に記述することで図の回りこみを使用できるようになる。

```
\usepackage{wrapfig}
```

構文は以下の通り。

```
\begin{wrapfigure}[行数]{lまたはr}{幅}
  ~
\end{wrapfigure}
```

# 実装例

<img width="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574030/25c3ab93-48e4-499d-9e67-5b0c10b3a95b.png">


```latex:コード
吾輩は猫である。名前はまだ無い。

\begin{wrapfigure}[5]{r}{8zw}
  \centering
  \vspace{-\intextsep}
  \includegraphics[width=25mm]{サンプル.pdf}
\end{wrapfigure}

どこで生れたかとんと見当がつかぬ。何でも薄暗い〜
```

# 綺麗に配置するコツ

`vspace{-\intextsep}`を記述することで、図とテキストの間にある余白を減らして文章と図の頭を揃えている。
【LaTeX】相互参照におけるラベルの書き方【label・ref】

LaTeXにおいて、あとで参照したい場所に`\label`コマンドでラベルを貼っておき、`\ref`コマンドでラベルを貼った場所を参照することができる。このことを相互参照という。

# 相互参照の使い方

基本的にラベルを貼ることができるのはセクション、数式、表、図、である。具体的には以下のようになる。

<img width="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574030/c8c235d2-d386-da03-bb44-990b740b7034.png">

```latex:コード
\section{セクション名}\label{sec:ラベル名}

\begin{table}[h]
  \caption{成績表}\label{tab:ラベル名}
  \centering
  \begin{tabular}{lrrr}
    \toprule
    \multicolumn{1}{c}{名前} & \multicolumn{1}{c}{数学} & \multicolumn{1}{c}{英語} & \multicolumn{1}{c}{物理} \\
    \midrule
    Aさん & 85 & 78 & 92 \\
    Bさん & 90 & 88 & 95 \\
    Cさん & 75 & 68 & 82 \\
    \bottomrule
  \end{tabular}
\end{table}

\begin{figure}[h]
  \centering
  \includegraphics[width=0.2\columnwidth]{サンプル画像.pdf}
  \caption{サンプル画像}\label{fig:ラベル名}
\end{figure}

\begin{equation}\label{eq:ラベル名}
  2 + 3 = 5
\end{equation}

\ref{sec:ラベル名}で述べたように 〜

〜 を表\ref{tab:ラベル名}に示す。

〜 を図\ref{fig:ラベル名}に示す。

式(\ref{eq:ラベル名})より 〜
```

# ラベルの名前はどうすればいいか

ラベルの名前は基本的になんでもいいのだが、参照するときにわかりやすいように以下のようなルールで決めるとよい。

| ラベルの種類 | ラベルの名前    |
|--------------|-----------------|
| セクション   | sec:ラベル名    |
| 表           | tab:ラベル名    |
| 図           | fig:ラベル名    |
| 数式         | eq:ラベル名     |
iPadOS18でUISplitViewControllerが1pane表示になる


純正の設定画面みたいな感じで、2-paneなUISplitViewControllerをモーダル表示してるところが
iPadOS18だと、1-paneのNavigationViewControllerみたいになっていて。

なんでかなーと調べたのメモ。


# 結論

1-paneになる原因: 
`UserInterfaceSizeClass` が `Compact`になっているから。

[UISplitViewController.isCollapsed](https://developer.apple.com/documentation/uikit/uisplitviewcontroller/1623185-iscollapsed) がソレらしい。

みんなもデバッガで確認してみよう。

> When collapsed, the displayMode property has no impact on the appearance of the split view interface

こいつがtrueな状況だと、`displayMode`は無視される
-> `Compact`の表示になって、1-painにされてしまう


# 対策

1. 幅を増やす
1. Compactなんて認めない

### 幅を増やす
表示幅が足りない（と勝手に決めつけられてる）のが原因なので、幅を増やせば解決。

```swift
self.preferredContentSize = CGSize(width: 640, height: 640)
```

表示してるモーダルの大きさをpreferredContentSizeで広げてやれば解決。
なお、指定したところでOS側に勝手に調整される。


### Compactなんて認めない

```swift
if #available(iOS 17.0, *) {
    splitVC.traitOverrides.horizontalSizeClass = .regular
}
```

文句言わずにRegularで表示しろよ、とtraintOverridesする。


# 雑感
iPadOS 18、だいぶひどい。
sizeClass、だいぶ前からある割に成功する未来が全然見えないが、どうしてこのタイミングで強行したんだろう・・・？
超古いPCを快適に使う作戦 Linux 激軽

前置き、詳細は巻末にある。
<p><li>
<h3>OSはLinux <font color="RED">Manjaro</font>にする</h3>Archは過去使っていたが、不安定だしちょっとの間ver.upしないと　それすら出来なくなる。</br>またちょっといじくると、OSが立ち上がらなくなったりする。<br/>対処は可能だが、流石に面倒臭い。<br/>Manjaroはチームの方々が検証・テストしてくれている(Archのローリング　リリースの後に)。<br/>よってArchより数週間程度UPDATEは遅れるが、それは必要な時間だ。<br/>Archは色々やりすぎなんだよ・・・
<br/>Arch系なのはバグが残り続けないローリングリリースであることと、カスタム性。wikiも充実してる。あとエンジニアだから。


</p><p><h3>window managerは&nbsp;<font color="RED">i3</font></h3>
i3wmとかi3-gapsとかある。<br/>
「えええ、タイル型ぁ??使いにくそう・・・」と拒否する輩、検証・試さず判断を下す者はこれ以上　読まなくてよろしい。<br/>
激軽である。<br/>
文字を大きくしたりなどカスタマイズはCLIで行う。<br/>
また使ってみると、意外と快適だった。<br/>
どーしてもタイルが苦手なら、フロートに変更も出来る。[win]+[space]でサクっと切り替えられるし、それをDefaultにしてもいい。<br/>
とにかくKDEは勿論、xfceより軽い。RAM消費が少ない<br/>

</p><p><h3>メニューは<font color="RED">　rofi　</font> NOT dmenu</h3>
これは使いやすさの問題。<br/>
dmenuはやめとけ。rofiにしなさいよ。

</p><p><h3>SWAPは<font color="RED">　ON　</font></h3>
私のPCのRAMは4GiBだ。<br/>
gnomeなんて使用ものならブラウザ立ち上げただけでCRASH、SWAPナシならね。<br/>
幸い私の古PCはHDDが壊れてしまい、SSDに換装してある、速さでは問題ない。<be/>
が、仮にHDDだったとしてもCRASHよりマシだ。

</p><p><h3>ブラウザは<font color="RED">　Chromium　</font> Not CHrome ,Not FIREFOX</h3>
そのままてせはNetFlixが見られないが、簡単に「見られる様に」出来る。<br/>
詳しくはこちら⇣を参照。

https://qiita.com/bezonata/items/924f4433e745ffad61aa

---

<h3>モデムを止めろ</h3>
まず、サービスを確認しよう

```
systemctl list-unit-files -t service | grep enabled
```

そして
ModemManager.service
がenableになってたら、止めて、無効にしよう。
```
sudo systemctl stop ModemManager.service
sudo systemctl disable ModemManager.service
```

</p>





<hr/>

今、2024年年末。<br/>
そして2010年製のPCを使用している。<br/>
![2024-11-26_11-26-30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3937994/bb8fbaad-4b0a-5f71-e5fd-34425ae20bb8.png)

血迷って買ってしまったディスプレイとMAIN BOAD(MOTHER BOAD)が一体化しているやつ。<br/>
もちろんwindowsサホート切れ。<br/>
だが趣味。<br/>
これは趣味。<br/>
エンジニアだもの、ハンデはある程燃える<br/>
もちろん今そのPCでQiitaを書いている。<br/>

でも後で...
![1733706294.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3937994/d89e8906-4e89-188e-5b31-b23df174aa7a.png)

そしてArchいじり過ぎたら動かなくなった。
起動しなくなった。
![スクリーンショット_2024-12-25_00-11-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3937994/e54a5a1b-cdac-6c64-2755-637077cd8495.png)
とりあえいずDebian最高。
日本語も初めからmozcが入ってた。
何も設定してない。
そしてRAMも1GiB行ってない。
この時はtermだけ立ち上げてた状態。
Firefox立ち上げてても1.6GiBくらい。
...windowsなんなの
BizRobo! ベーシックロボット(DS) 文字で場所を指定する

こんにちは！
今回はBizRobo! ベーシックロボット(DS)でクリックなどの場所を「文字」で指定する方法の紹介です！
クリックのタグパスや属性の値が可変的で安定しない…となった方は一度お試しください。<br>

その前に、激浅の知識でタグパスやら属性やらにふんわり触れておきます。





<h1>タグやら、属性とかタグパス</h1>

:::note warn
タグや属性に関してBizRobo! ナレッジベースまたは、CSSで調べた方がより正確な情報です。
:::

実際にロボットで読み込んだWebページのコードを見ていただくと以下のような構成になってます。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3796227/c718fdca-22cf-b8ee-5a82-d320245560de.png)

赤色の文字部分が「タグ」です。「タグ」というのは「役割」みたいなもんです。
タグの「構成」みたいなのが「タグパス」です。テーブルタグの中に各リストがあるみたいなイメージです。
水色の文字部分が「属性」です。「属性」というのはタグの「詳細情報」みたいなもんです。
黒色の文字部分は「テキスト」です。
今回はこの「テキスト」を使っていきます！


<h1>テキストを指定する</h1>
お世話になっている方も多いであろう某乗換案内のタブをクリックする処理で実際にやっていきます。
手順というほどのものはないです！


クリックを生成したときのデフォルトのファインダーは下のようにタグパスのみ、またはタグパスと属性の設定が入っていることが多いです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3796227/0762e4bd-882c-c5c2-e2ac-a046577df105.png)

今回はタグパスとタグパターンのみ設定します。
・タグパスはパターンで省略して「.*.a」にします。(aより上のタグパスは知らんけど、とりあえずaタグねっていう指定)
・属性名はすべて空にしてください。(タグの詳細情報を無視するために)
・最後はタグパターンにテキストを入力します。
この例では「運行情報」を入れます。(.*で省略可能です。)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3796227/22ac4356-9bc4-c176-5c6c-8e29e1a37977.png)

最後に結果を見てみてください。
このように文字列を指定して認識してくれます。
今回はこれで以上です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3796227/195f1de7-570d-2b68-515c-cf05277ce1c8.png)

<h1>まとめ</h1>
いかがだったでしょうか。
ベーシックロボット(DS)のファインダーはいろいろと制御ができることが多いので、遊びの延長でお試しください！
もし、この記事がお役に立てれば幸いです。<br>
では、より良いRPAライフを～


<h1>参考</h1>


・タグパスに関して
<a href="https://knowledge.bizrobo.com/hc/ja/articles/360030645312-DS%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%B3%E3%83%80%E3%83%BC%E3%81%AE%E3%82%BF%E3%82%B0-%E3%83%91%E3%82%B9">DSのファインダーのタグ パス</a> 
サイト名：BizRobo! ナレッジベース
企業名：オープン株式会社
更新日：2024年08月24日 12:03
【PostgreSQL】ビュー変更時の注意点（CREATE OR REPLACE VIEW）

# TL;DR
- PostgreSQLでビューを置換（CREATE OR REPLACE VIEW）するときに、既存のビュー定義の結果列の定義が変更されているとエラーになる（Oracle だと変更できる）
- この時のエラーメッセージに ALTER VIEW を使うように促されるが、DROP して CREATE VIEW する方法もある

# はじめに
弊社では、Oracle・PostgreSQLの二つのDBに対応した生産管理パッケージを開発しています。
少し前、テーブルに項目追加し、既存のビューにも項目を追加する対応をしました。
CREATE OR REPLACE VIEW の 構文を使って ビュー の置換を行おうとしたのですが、少し困ったので、こちらの記事で内容を共有します。

# 発生したエラーと原因
CREATE OR REPLACE VIEW を実行したところ以下のようなエラーが発生しました。
```
cannot change name of "OldColumn" to "NewColumn"
HINT: Use ALTER VIEW...RENAME COLUMN ... to change name of view column instead
```
※ PostgreSQLバージョン:14.6

PostgreSQLのCREATE OR REPLACE VIEW 文では、結果列の型または名前が違うと置換できないことが原因のようです。
Oracleでは、同様の構文で動作したので、少し沼ってました...

# 対応
エラーメッセージには `ALTER VIEW...RENAME COLUMN ...` を使えと書いてあります。
しかし、**VIEW を DROP して CREATE VIEW することでも同様の操作ができます**。
私は、DROP して CREATE VIEW する方法を採用しました。理由は次の２つです。

- 学習コストが少ない
- Oracle と同じ書き方ができる
    - Oracle は ALTER VIEW で結果列の定義変更ができない

# 参考
以下の記事が大変参考になりました。ありがとうございました。
- [[PostgreSQL]Viewの変更でハマる落とし穴](https://whiletrue.info/?p=3258)
    - CREATE OR REPLACE VIEW でエラーになる詳細なパターンが記載してあってよかった
sudoしたプロセスをsudoごとkill


https://github.com/tyano463/ppkill.git


### コードの説明
指定したプロセスを検索し、親プロセスを辿り
シェルのプロセス以下をkillします。


### ビルド

```shell
git clone https://github.com/tyano463/ppkill.git
cd ppkill
make
sudo make install
```

### 使い方

例) `sudo ./qemu-system-arm ...`したプロセスをkill
```shell
ppkill qemu-system-arm
```