OmniAICreator/Qiita-1.07M huggingface dataset:
自律型AIエンジニア『CodeAGI』(β版)_新機能追加発表

![PRtimes_banner_R3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3688819/4e98e30c-7740-b9b4-6834-82a55bff6220.jpeg)
<b>:new: 追加新機能</b>
<b>１：テストケース&テストデータ自動生成</b>
解析された企業独自の設計書から単体テストの仕様書とテスト実施用のデータを自動生成
<b>２：画像解析によるプログラム自動生成</b>
画像やモックを解析し設計書の画面レイアウトに基づきプログラムコードを自動生成
<b>３：リレーショナルデータベースの解析による複雑なSQLへの対応</b>
設計書だけでは読み取りづらい複雑なリレーションの内容もCodeAGIで分析しプログラムコードを自動生成

<b>:ideograph_advantage::ideograph_advantage:2024年4月『初回ご利用限定』　CodeAGI/GPT-4無料ご利用キャンペーン！</b>
キャンペーン期間中、CodeAGIに新規会員登録いただいた方を対象に、抽選で100社様を上限に『GPT-4ご利用無料特典プレゼント』を実施しております。
詳細はCodeAGIサービスページにてご確認ください。
https://www.soppradx.com/service.html

【今後の機能追加予定】
2024年4月時点において、アジャイル開発対応やリバースエンジニアリング機能の開発を進めております。CodeAGIのプログラム自動生成技術を応用し、プログラムやデータベースを解析することで、保守困難となっているシステムの設計書を自動生成する機能を開発し、これにより属人化しているシステムの安定稼働に寄与することを想定しています。
<br>
<b>CodeAGIだけが実現できること</b>
1.	企業独自の多様なフォーマットの設計書解析を実現
2.	設計書やデータ構造を学習し整合性を担保した正確なコード自動生成を実現
3.	リレーショナルデータベースの解析による複雑なSQLの自動生成を実現 
4.	テストケース・テストデータの生成を実現
5.	画像データを解析することで、画面プログラムのコード生成を実現
6.	複数プログラムの一括自動生成を実現
最尤推定による交差エントロピーの導出

## はじめに
この記事は、以下の内容の続きになります。

https://qiita.com/annap_nn/items/e76e4947b3b74c31143c

## ロジスティック回帰における最尤推定
ロジスティック回帰とは、あるデータセット$D={(x_1,t_1),(x_2,t_2),...,(x_n,t_n)}, t_i \in \set{0,1}$が与えられたとき、$x$と$t$の関係を

``` math
y = f(x) = \frac{1}{1-\exp(w_0+w_1x)} \tag{1}
```

により表現する手法のことです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3761909/c47f34cf-56b1-93ad-774f-2ea921adba23.png)

ここで、入力$x$を与えたときにラベル$t$を得る確率分布は、$t=0$を正しく予測する事象と$t=1$を正しく予測する事象の同時確率であるため、式$(1)$を用いて

``` math
q(t|x) = q(t=1|x)^t q(t=0|x)^{1-t} = \bigr(f(x)\bigr)^t \bigr(1-f(x)\bigr)^{1-t} \tag{2}
```

で表すことができ

``` math
L(t|x;w) = \prod_{i=1}^n \bigr(f(x_i)\bigr)^{t_1} \bigr(1-f(x_i)\bigr)^{1-t_1} \tag{3}
```

を最大化すればよいことになります。

::: note info
$t=1$のとき、$q(1|x) = q(t=1|x)^1 q(t=0|x)^{1-1} = q(t=1|x) = f(x)$ 
$t=0$のとき、$q(0|x) = q(t=1|x)^0 q(t=0|x)^{1-0} = q(t=0|x) = 1-f(x)$ 
:::

しかし、このまま式$(3)$を最大化することは難しいので、負の対数尤度を最小化することを考えます。

``` math
- \log L(t|x;w) = - \sum_{i=1}^n \log \bigr(f(x_i)\bigr)^{t_1} \bigr(1-f(x_i)\bigr)^{1-t_1} \tag{4}
```

それでは実際に計算してみましょう。
まずは、式$(4)$の右辺、シグマの中の項を次のように変換します。

``` math
\begin{align}
\log \bigr(f(x_i)\bigr)^{t_1} \bigr(1-f(x_i)\bigr)^{1-t_1} &= \log \bigr(f(x_i)\bigr)^{t_1} + \log \bigr(1-f(x_i)\bigr)^{1-t_1} \\
&= t_i \log \bigr(f(x_i)\bigr) + (1-t_i) \log \bigr(1-f(x_i)\bigr) \\
\end{align}
```

この変換を用いて式$(4)$を変換すると

``` math
- \log L(t|x;w) = - \sum_{i=1}^n t_i \log \bigr(f(x_i)\bigr) + (1-t_i) \log \bigr(1-f(x_i)\bigr) \tag{5}
```

が得られ、これを最小化すればよいことになります。

式$(5)$は、一般的に（二値）交差エントロピーと呼ばれ、ロジスティック回帰における（二値）交差エントロピーの最小化は、尤度を最大にするパラメータ$w$の推定になっています。これより、ロジスティック回帰における損失関数、交差エントロピーが導出できました。

## おわりに
今回は、最尤推定によりロジスティック回帰における損失関数「交差エントロピー」を導出しました。これまで「最小二乗誤差」「交差エントロピー」と比較的簡単な損失関数について触れてきましたが、今後は複雑な損失関数が最尤推定で設計されている事例についても調べてみたいと思います。
【Rails】レコードの中から、ある項目ごとの最新データを取得する方法

株式会社学びと成長しくみデザイン研究所の藤澤です。

## 前提
データベースに蓄積されたログから、特定の項目ごとの最新のデータを取得したいことがあるかと思います。

例えば、各タスクの実行状況を記録する TaskLog テーブルがあるとします。このテーブルには、タスクの識別コード（タスクコード）、ステータス、作成日時、更新日時が記録されています。
```rb
TaskLog(id, task_code, status, created_at, updated_at)
```

そして、テーブルには以下のようなデータが存在するとします。
```sh
id | task_code | status |     created_at      |     updated_at      |
 1 |  "taskA"  |  "ok"  | 2022/04/01 12:30:00 | 2022/04/01 12:30:00 |
 2 |  "taskB"  |  "ok"  | 2022/04/02 12:30:00 | 2022/04/02 12:30:00 |
 3 |  "taskA"  |  "ng"  | 2022/04/03 12:30:00 | 2022/04/03 12:30:00 |
 4 |  "taskC"  |  "ng"  | 2022/04/04 12:30:00 | 2022/04/04 12:30:00 |
 5 |  "taskC"  |  "ok"  | 2022/04/05 12:30:00 | 2022/04/05 12:30:00 |
```

## 課題と解決法
このデータの中から、タスクコードごとに最新のステータスを取得したいケースを考えます。

その場合、以下のようなコードで取得することが可能です。
```rb
TaskLog.order(:created_at).index_by(&:task_code).transform_values(&:status)
#=> {"taskA"=>"ng", "taskB"=>"ok", "taskC"=>"ok"}
```

このコードでは、
1. `.order(:created_at)` で、作成日時順にソート
1. `.index_by(&:task_code)` で、タスクコードごとにハッシュを作成

という手順を踏んでいます。

`index_by` の仕様により、**同じキーに紐づく値はあとから取得したもので上書きされます**。そして、事前にレコードの作成日時順でソートしていることで、最終的に最新のものがハッシュの値として適用されます。
つまりここでは、**各タスクコードごとに作成日時が最新のレコードを取得する**ということを行っています。

最後に、`.transform_values(&:status)` によって必要な値だけ抽出して完了です。
Rocky Linux 9にGoogle Chromeをインストールする

# What's？

タイトル通りということで。

# 環境

Rocky Linux 9です。

```shell
$ cat /etc/redhat-release
Rocky Linux release 9.3 (Blue Onyx)


$ uname -srvmpio
Linux 5.14.0-362.24.1.el9_3.0.1.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Apr 4 22:31:43 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
```

# Linux版Google Chromeをダウンロードする

Linuxを使っている場合は特に困らない気がしますが、他OSを使っている場合はこちらのヘルプページを見るとよいかと。

https://support.google.com/chrome/a/answer/9025926?hl=ja

`platform=linux`でアクセスすると、Linux版のインストーラー（64 ビット .deb（Debian/Ubuntu 用）、
64 ビット .rpm（Fedora/openSUSE 用））がダウンロードできます。

https://www.google.com/chrome/?platform=linux

ちなみに、ダウンロードする際に以下のような注意書きが表示されています。

> 注: Google Chrome をインストールすると、ご利用のシステムに Google のリポジトリが追加されます。これにより、Google Chrome は自動的に最新の状態に保たれます。Google のリポジトリを追加しない場合は、パッケージをインストールする前に「sudo touch /etc/default/google-chrome」を実行してください。

つまり、インストールするのはrpmやdebパッケージになりますが、これを導入するとサードパーティのリポジトリが追加されて以降は自動更新になるということですね。

# Google Chromeをインストールする

インストールは以下のコマンドで。

```shell
$ sudo dnf install https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm
```

インストールされました。

```shell
$ google-chrome --version
Google Chrome 123.0.6312.122
```

アップデートは、`dnf upgrade`時に一緒に行われます。

```shell
$ sudo dnf upgrade
```

パッケージの情報。

```shell
$ dnf info google-chrome-stable
メタデータの期限切れの最終確認: 0:00:05 前の 2024年04月12日 13時21分01秒 に実施しました。
インストール済みパッケージ
名前         : google-chrome-stable
バージョン   : 123.0.6312.122
リリース     : 1
Arch         : x86_64
サイズ       : 328 M
ソース       : google-chrome-stable-123.0.6312.122-1.src.rpm
リポジトリー : @System
repo から    : @commandline
概要         : Google Chrome
URL          : https://chrome.google.com/
ライセンス   : Multiple, see https://chrome.google.com/
説明         : The web browser from Google
             :
             : Google Chrome is a browser that combines a minimal design with sophisticated technology to make the web faster, safer, and easier.

```

そしてリポジトリが追加されています。

```shell:/etc/yum.repos.d/google-chrome.repo
[google-chrome]
name=google-chrome
baseurl=https://dl.google.com/linux/chrome/rpm/stable/x86_64
enabled=1
gpgcheck=1
gpgkey=https://dl.google.com/linux/linux_signing_key.pub
```
内部名前解決の方法をまとめてみた

## はじめに
内部の名前解決の方法について、まとめてみたので備忘録として残しておきます。

## Route 53 Resolverを利用した名前解決方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115411/7fbfd774-7bd3-0144-d8d8-36c80ae8f5b2.png)

サブドメインのプライベートホストゾーンを作成します。
オンプレミスのDNSサーバで条件付きフォワーダを設定し、Route 53 リゾルバーにAWSへの問合せを転送し、名前解決します。

### コスト
Route 53 Resolverを利用する場合、利用料が高額であることに注意する必要があります。
Route 53 Resolverを利用するにはエンドポイントが必要です。
エンドポイントの料金はENIに依存し、0.125$/ENI/1時間かかります。
※Route 53リゾルバーエンドポイントのENIは仕様上、エンドポイントごとに2つ必要です。
そのため、エンドポイント1つの場合、月額で1800$（約27,000円）がかかります。

### 運用
Route 53 Resolverの場合、オンプレミスDNSには条件付きフォワーダを設定するのみで、サブドメインのDNSレコードのメンテナンスはAWS側のみで完結します。
オンプレミスとAWSで管理者が異なる場合は、AWS内のレコード管理をAWS管理者で完結できるため、運用コストが下がります。

また、名前解決時の振り分けをルールを詳細に設定可能なため、システム要件に合わせた柔軟なルーティングが可能です。これまでのDNSと同じような通常の振り分けをする「シンプルルーティングポリシー」、バックエンドのヘルスチェックの結果によって振り分けをする「フェイルオーバールーティングポリシー」、ユーザの位置によってバックエンドの振り分けをする「位置情報ルーティングポリシー」などがあります。

### ユースケース
拡張性が高いため、大規模なシステムや今後多くの機能をAWS上で構築する予定がある場合に利用を推奨します。


## NLBを利用した名前解決方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115411/6c1c785e-1e96-d014-780d-fcf2879f0393.png)
ALBやEC2の前段にNLBを配置し、IPアドレスを固定します。
オンプレミスのDNSサーバにAレコードとしてNLBのIPアドレスを登録します。

NLBはAWSの提供するロードバランサーのうち唯一、ロードバランサーに固定のIPアドレスを設定可能なため、利用するAWSリソースの前段に配置することで、オンプレミスからの名前解決ができます。

### コスト
Route 53 Resolverを利用すると高額な場合は、NLBを利用するのがいいでしょう。
NLBは0.0243＄/1時間とNLCUによって料金が決まります。
NLCUは以下の要素を測定し、1時間の使用量が平均で最も多いものに大して課金されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115411/139897db-b889-a9be-3e2b-3b447f788db6.png)

名前解決が必要なリソース毎にNLBを作成する必要があります。
大量のEC2やALBがある場合は、リソース毎にNLBを作成し、結果的にコストが

### 運用
NLB（IPアドレス）を追加するたびにオンプレミスのDNSサーバにもレコード追加作業が必要となります。
そのため、オンプレミスとAWSで管理者が異なる場合、AWS管理者からオンプレミス管理者へ作業を依頼しレコード追加するというフローになり、運用コストが高くばります。

### ユースケース
拡張性は低いため、小規模なシステムや今後追加機能をAWS上で構築予定がない場合に利用を推奨します。

## AWS Managed Microsoft ADを利用した名前解決
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115411/a5c171e8-66b2-42ae-519f-4df6db2253ca.png)

EC2はMSADディレクトリに結合することで、MSADによって名前解決されます。
MSADにはフォワーダとしてRoute 53 Resolverが設定されており、ALBはResolverによって名前解決されます。

### コスト
2台構成(最小)のドメインコントローラーの場合、基本料金は以下となります。
Standard(オブジェクト数：30,000)：$0.146 /時間当たり
Enterprise(オブジェクト数：500,000)：$0.445 /時間当たり

### 運用
MSADの管理サーバにてDNSレコードを管理します。AWS内でレコードを管理することができますが、Route 53に比べ管理はしにくいと思います。
ちなみに、レコードの管理画面はこのようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115411/55e9f763-efd7-1c40-338c-9a104768b171.png)

### ユースケース
MSADを利用する場合は内部名前解決に関する料金を削減できます。

##  おわりに
自分がこれまで実施したことのある内部名前解決方法を整理しました。
今後またあれば追加していこうと思います。
rviz2でrosbag2ファイルを確認するメモ

# はじめに

/clockトピックを使用してrosbag2ファイルを再生してrviz2で可視化したいときのコマンドのメモ



## rviz2をuse_sim_time=trueで起動

```bash
rviz2 --ros-args -p use_sim_time:=true
```

use_sim_time = trueになってるか確認

```bash
ros2 param get /rviz use_sim_time
Boolean value is: True
```

## rosbag2ファイルの再生　

/clock　オプションをつける
-r オプションで再生速度を指定（10は10倍速）

```bash
ros2 bag play rosbag2_2024_04_11-14_24_45/ --clock -r 10
```


# 参考

https://zenn.dev/hyt126/articles/ea20358107c568
PowerPointで印刷時にのみ現れる文字がある

# 背景
先輩からもらったパワポ資料をベースに作った資料を印刷すると、なぜかフッターが２重に印刷される。  
しかも、１つはコピーライトが2015年になっている。  
スライドマスターを見ても、余計なフッターがあるようには見えない。  

# オチ
スライドマスタに、フッターが重なって２つ存在していて、１つには**白文字で**2015年のコピーライトが記述されていた。  
グレースケール・単純印刷で印刷すると黒文字で印刷される。  

# 解説
編集画面で、選択できないオブジェクトがあって消せない…みたいなのはスライドマスターにオブジェクトが配置されていることが原因であることが多いです。調べるとこのケースで困っている人も多々いるようですが、今回は違います。  
編集画面では表示されていないのに、印刷プレビューでは現れる、です。  
（気づいていなかったけど、カラー印刷を選ぶと現れません）  

PowerPointのグレースケール印刷には、少しクセがあるようで、白文字が黒く印刷される特徴（敢えて仕様とは言わない）があるらしい。なんでやねん。  
https://answers.microsoft.com/ja-jp/msoffice/forum/all/%E3%82%AB%E3%83%A9%E3%83%BC%E6%96%87%E6%9B%B8/3e1c8e2b-d5f6-4098-b153-702eb38f07c2

なので、黒地に白文字を描くと、真っ黒に塗りつぶされる、みたいなことも発生するらしい。  
https://aladdina.hatenadiary.org/entry/20080613/1213359263

使っていたのは`Microsoft® PowerPoint® for Microsoft 365 MSO (バージョン 2302 ビルド 16.0.16130.20848) 64 ビット`なのですが、PowerPoint2002からそうだということなので、20年来そうなのでしょうね。  

詳しくは探していませんが、グレースケール印刷のこの仕様を明記しているものは見つけていません。  
白黒印刷については探していません。  

# 余談
少しでもお困りの人の助けになればと思って書きました。  
スライドマスターで「オブジェクトの選択と表示」を表示したりオブジェクトを全選択したりしてたら、変なオブジェクトがあるぞ？ってすぐに気付けたのでしょうか。
[svelte] checkboxをコンポーネント化する際にbind:groupが効かなくなる問題の対策

[こちらのissue](https://github.com/sveltejs/svelte/issues/2308)の通り、Svelteでcheckboxをラップしたコンポーネントを作成すると、bind:groupができなくなってしまう。
bind:groupの機能を再開発することで対策できたっぽいのでメモ。

※ [GitHubのissueにもコメントしてみた](https://github.com/sveltejs/svelte/issues/2308#issuecomment-2050941123)ので、見落としがあればご指摘いただいてる可能性あるので見てみてください。

```svelte:Checkbox.svelte
<script>
  let checked = false;
  export let value = '';
  export let group = [];

  const handleCheck = () => { group = [...group, value] };
  const handleUncheck = () => { group = group.filter(checkedValue => checkedValue !== value) };

  $: checked? handleCheck(): handleUncheck();
</script>

<input type="checkbox" value={value} bind:checked>
```

```svelte:親コンポーネント
<script>
  import Checkbox from 'Checkbox.svelte';
  let group = [];
  let values = [1,2,3];
  $: console.log(group);
</script>

{#each values as value}
  <Checkbox value={value} bind:group={group} />
{/each}
```

[デモ](https://svelte.dev/repl/b41984444fe542b0b2b8f5a8c13cf480)
【Mac】おすすめアプリ3選&おまけ

# はじめに
<!-- 発端や概要を記載 -->
こんにちは、エンジニア3年目の嶋田です。
まずは、この記事を開いていただきありがとうございます！
今回は作業効率化のためのおすすめアプリを3つとおまけに私が絶対にするMacの初期設定を2つ紹介します。
4月からエンジニアになった方にも有益な情報になればいいなと思っています。
ぜひ、最後までお付き合いください。

# 目次
- [アプリ3選](#アプリ3選)
    - [Clipy](#Clipy)
    - [Fig](#Fig)
    - [Rectangle](#Rectangle)
- [初期設定](#初期設定)
    - [カーソルとキーボードの入力速度をMAXに](#カーソルとキーボードの入力速度をMAXに)
    - [右クリック](#右クリック)
- [最後に](#最後に)

# アプリ3選
## Clipy
これは時短間違いなしのアプリです！
エンジニアとして働いていると、色々とコピペを使う場面が多いです。
そんな時に役に立ちます！
使い方は、超簡単👍

主な使用法は2つ

1. 履歴を保持してくれるので、 再度コピーしなくても履歴からペーストできる

2. スニペットを設定しあらかじめ登録したスニペットからペーストできる

コピペをするときは
```
shift + command + v
```
これで完璧です。

https://clipy-app.com/

細かい説明や使い方を見たい方は[こちら](https://note.com/se_maaru/n/n0cda4758c7dd)の記事をどうぞ💁‍♂️

## Fig
こちらはコマンドがたくさんあって覚えられないあなたにおすすめなアプリです！
簡単に言うとターミナルを使いやすくしてくれるもの！

![fig.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524119/d331c6ba-4103-e9ad-8146-40ad7bc40381.png)


なんと自動補完してくれちゃいます…
ダウンロード法や使い方は以下でどうぞ💁‍♂️

https://www.kikagaku.co.jp/kikagaku-blog/fig-cli/

https://zenn.dev/syuya2036/articles/c23bf190ceb70a

## Rectangle
macって分割にするの難しくないですか…？
このアプリを入れちゃえば
ウィンドウを右半分表示にしたり、全画面表示にしたりをショートカットで実行できます！
2つのアプリを左右に並べて使用するときに便利です。

https://rectangleapp.com/

詳しい使い方は[こちら](https://blog.hpfull.jp/mac-app-rectangle/)💁‍♂️

# 初期設定
## カーソルとキーボードの入力速度を**MAX**に
- システム設定＞トラックパッド

![スクリーンショット 2024-04-11 21.45.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524119/05a3628e-6f5d-ca64-05b2-3481a028bcdb.png)

- システム設定＞キーボード

![スクリーンショット 2024-04-11 21.45.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524119/afdd67c6-4ff3-6735-a8a4-2badae814b93.png)

## 右クリック
初めてMacを触った時に1番困ったものがこれ！！！
>Mac を右クリックするには、キーボードの Control キーを押したまま、トラックパッドまたはマウスをクリックします。 この操作により、Windows PC での右クリックと同様のコンテキスト メニューが表示されます。

このような記載がありますが、慣れなかったので設定変更しています。
- システム設定＞トラックパッド
![スクリーンショット 2024-04-11 21.51.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524119/1e3e43e3-a7e2-8eb7-007c-e31679a52c6c.png)

# 最後に
最後までお付き合いいただきありがとうございました。
Macの初期設定はおまけでしたが、他にも自分好みにカスタマイズすると使いやすさが桁違いで
効率が上がることもありますよね！
他におすすめのアプリや初期設定がありましたら、ぜひコメントで教えてください。
Multi-Perspective Happiness Methodという「幸せ」の増幅思考法

## Multi-Perspective Happiness Method(MPHM)とは
文字通り、第二、第三と複数の視点を持つことで、（一見すると）幸せ値0の事象から無限に「幸せ」を引き出せるという思考法だ。

## 余談
先日、古巣のエンジニアたちと「幸せ」とは何か、という話で盛り上がった。
たったひとつの方程式からあらゆる事象を導き出す究極宇宙理論「ひも理論」のように、
「幸せ」を方程式で語ることはできないか。

仮説：幸せエネルギー保存の法則

幸せは世の中に一定の総量が存在し、一方に幸せを享受する人がいれば、どこかで幸せを消費している人がいるのではないか。
幸福とは、何かしらのエネルギーを消費して形態変換されたものなのではないか。

話のオチとしては、幸せには適切な物差しがなく、それを増減させる変数も多いので、万物に対する幸せをひとつの方程式にするのは非常に難しいという結論になった。

本記事は「幸せエネルギー保存の法則（仮）」を反証する記事だ。

## 思考実験
ある人物Aが飼っている猫に餌を与える。
人物Aにとってその行為は毎日数回繰り返されるタスクであり、その事象に対して思考したり感情を持ったりすることはない。
その時の幸せの状態を体積で表してみるとこのような状態だ。
![TPHM_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768580/8250e073-ebd8-72e1-5835-6a7d8cfa9663.png)
この時、
* 猫は餌を貰えて幸せ値が増加している
* Aはタスクをこなしているだけなので幸せ値の増減がない
---
ここで人物Aに第三の視点を持たせてみる

---
人物Aは、餌を食べ喜んでいる猫を見てふと考える。（猫は餌を食べたあとしばしば[顔を洗うポーズをとる](https://0455930097.com/63.html)）
「猫が喜んでくれてよかった。」
「頑張って働いた甲斐があったな。」
この時二つの視点から幸せ値が増加している。

* 喜んでいる猫を認識して、人物Aの幸せ値が増加している
![MPHM_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768580/1eee9948-ccb8-4739-28a9-9de378fc98ce.png)

* 人物A'が第三の視点を持つことで人物Aが猫に餌を与えたプロセスを認識し、人物A'（=人物A）の幸せ値が増加している
![MPHM_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768580/47f1b27a-2f0f-87da-2232-4be514808872.png)

この思考法を身につけると、さらに第四の視点「A″」を持ち、
「こんな小さなことに幸せを感じられる自分」を認識することで「今自分の人生は最高に幸せだ」と幸せ値をさらに増加させることもできるかもしれない。

## MPHMの練習方法
1. ふと周りを見渡して、一つの物事をピックアップする。
2. 無理やり幸せになれる視点を見つけてみる。
3. さらに視点を一つ増やして、より大きな幸せを感じてみる。
4. 最後はこんな小さな幸せに気づけた自分を褒め、幸せを感じる。

例）
1. 毎日仕事で使っているMacbook Pro。もうスペックもかなり古くなってきており、正直買い替えたい。いつもファンが唸りを上げている。
2. ファンを唸らせるほど自分のために働いてくれているのか、ありがとう！便利な時代に生まれてよかった！
3. 端末スペックを見てみると2019年製造。もう5年も一緒に働いているのか。新しい会社の創業時を支えてくれたな。思い出たくさんあるな。
4. 無機物に感謝して幸せを感じられる自分すごい！神！天才！

## まとめ
* 幸せは日々の小さなことへの気付きである。
---
ご意見・反論・新説なんでも受け付けます。
第0章 独自の物理リザバー作成に向けて作戦を立てる

# はじめに
最近ずっとリザバーコンピューティングの物理リザバーを作りたいと思っています．
今回の記事では，物理リザバーが満たす条件をまとめて，どんな物理リザバーを作成するか作戦を立てたいと思います．

しかし，私はリザバーコンピューティングは愚か，機械学習の専門家でも無いため，詳しい内容は挙げさせていただいた参考文献をご参照ください．


# 出発点
私がリザバーコンピューティングについて興味を持ったきっかけは，学会でそれに関する発表を聞いたことです．
詳しいことは専門家の文献を参照していただきたいのですが，どうやら，ニューラルネットワークの中間層部分(出力層以外)をリザバーと呼ばれるトレイナブルではない部分に置き換えることで，計算コストを大きく削減するスキームのようです(図1)．

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3714489/823e7fc2-03f6-8216-d7c2-2ee6a4258aa5.png" width=50%>

図1の出典 : 山根敏志, "図1: リザバー・コンピューティングの概念図", "物理リザバー・コンピューティングによる機械学習デバイスとエッジ・コンピューティングへの応用", ProVISION No.95 / 2019.

以下では，物理系のリザバー層が満たすべき条件をまとめて，作成に向けて物理リザバーの候補をまとめたいと思います．


# 物理リザバー
物理リザバーには様々な系が提案されています．たとえば，タコの足を模したシリコンのロボットアームのダイナミクスなどをがあります．


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3714489/4c98db75-6e0b-89a5-d794-7ec88e1f796f.png" width=50%>

図2の出典 : Nakajima, K., Hauser, H., Li, T., & Pfeifer, R. (2015). Information processing via physical soft body. Scientific reports, 5(1), 10487, Figure. 1.

他にも，スピン系，電子回路，生物などを物理リザバーとして用いるものが提案されています．しかし，当然，どんなものでもリザバーとして使えるものになるとは限りません．
　　ここで，どんな系が物理リザバーに向いているのかをまとめてみます(以下，[1])．もっとも基本的で重要な性質は，共通入力信号同期と呼ばれるものです．
　　離散時間$k$に対して，リザバー$r(k)$は次のように定式化できます．
```math
\boldsymbol{r}(k) = \boldsymbol{F}(k)(\boldsymbol{r}(k-1), s(k)). \tag{1}
```
ここで，$\boldsymbol{r}(k) \in \mathbb{R}^N$, $\boldsymbol{F}(k) : \mathbb{R}^N\times \mathbb{R} \rightarrow \mathbb{R}^N$，$s(k)$は入力信号です．リザバーは力学系$\boldsymbol{F}(k)$と書けるように，同じ入力に対しては同じ出力になる必要があります．この性質が担保されているからこそ，出力層で学習することが出来るわけです．この性質を数理的に考え直してみます．２つの異なるリザバーの初期状態，$\boldsymbol{r}(0)$，$\boldsymbol{r}'(0)$の基で共通の入力信号$s(k)$に対する出力は式(1)にしたがって時間発展します．十分に時間発展した後の状態がある1つの状態に収束する場合$|\boldsymbol{r}(k) - \boldsymbol{r}'(k)| = 0 (k \rightarrow \infty)$，この性質を共通入力信号同期と呼びます．共通入力信号同期である系であれば，原理的にその系をリザバーとして用いることが出来ます．

上で示した最低限の条件以外にも，経験的にリザバーとして適した系の性質が知られているようです．それが，"edge of chaos"と"短期記憶と非線形変換のトレードオフ関係"と呼ばれるものです．詳しくは，犬伏正信, & 吉村和之[1]を参照してください．

なにはともあれ，同じ入力に対して同じ出力が得られて，非線形性が強い系を探せばよいということになります．


# 今後のこと
今日，タコの足や単細胞生物をリザバーにすることが提案されています．そんなふうに自由にリザバーを探して良いならば，自分だけのリザバーを見つけたいと思うわけです．

第1章の記事では具体的にどんな物理リザバーにするかを絞りたいと思います．
ということで，本記事では最後に，物理リザバーの候補として考えたものを2つ以下に列挙します．

- 入力 : ギターの弦の組み合わせと弦を弾く強さ, 出力:音程
- 非線形光学素子: 光学系内で非線形光学素子(あるあるそうだけど，一旦の候補)

　　近い内に物理リザバーを構築し，ベンチマークのデータセットに対してテストの実験を行いたいです．


# 参考文献
[1] 犬伏正信, & 吉村和之. (2019). リザバーコンピューティングに適した力学系の特性と構造. 電子情報通信学会誌, 102(2), 114-120.
【vSphere】標準仮想スイッチ(VSS)の名前変更

作成した標準仮想スイッチの名前はGUI上から変更できない。そのためSSHで入り、コマンドで変更する。

## 設定方法
「vswitch0 rename」で検索
https://www.yellow-bricks.com/2021/06/14/how-do-i-change-the-name-of-a-vswitch-with-vsphere-7-0-u2-and-higher/

* コンフィグの確認
`configstorecli config current get -c esx -g network_vss -k switches`

* コンフィグエクスポート
`configstorecli config current get -c esx -g network_vss -k switches > vswitch.json`

* jsonファイル編集
`vi vswitch.json`

* jsonファイルの変更を反映
`configstorecli config current set -c esx -g network_vss -k switches -i vswitch.json --overwrite`

* 再起動
`reboot`
Azure VM の拡張機能 (Extention) をクエリーで抽出する

# 1. はじめに
Azure VM に導入される拡張情報 (Extention) を抽出するクエリーが欲しかったので作成してみました。

# 2. クエリー例
Azure Resource Graph から抽出する例です。
``microsoft.compute/virtualmachines`` の情報に ``microsoft.compute/virtualmachines/extensions`` を JOIN すると綺麗に抽出できます。

```sql
Resources
| where type == 'microsoft.compute/virtualmachines'
| extend
    JoinID = toupper(id),
    OSName = tostring(properties.osProfile.computerName),
    OSType = tostring(properties.storageProfile.osDisk.osType),
    VMSize = tostring(properties.hardwareProfile.vmSize)
| join kind=leftouter(
    Resources
    | where type == 'microsoft.compute/virtualmachines/extensions'
    | extend
        VMId = toupper(substring(id, 0, indexof(id, '/extensions'))),
        ExtensionName = name
) on $left.JoinID == $right.VMId
| summarize Extensions = make_list(ExtensionName) by OSName, OSType,subscriptionId
| order by tolower(OSName) asc
```
Extensions (拡張情報)は json アレイ形式で抽出されるので、ロジックアプリを使う場合は For Each 処理で制御できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/415060f3-083a-bf4d-2e36-4021bd617319.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653790/adebe238-d8b1-e4bb-5142-c8b7c0811a92.png)

# 3. 参考情報

https://blog.blksthl.com/2021/09/29/list-all-linux-vm-extensions-in-one-query-using-azure-resource-graph/

https://learn.microsoft.com/en-us/azure/governance/resource-graph/samples/advanced?tabs=azure-cli
【Bootstrap】フォームで読み込み専用、イベント無効化

## 問題
　詳細ページなどで、フォームで読み込み専用として表示したい

 ## 方法
 ```spendingDetail.blade.php
 <form class="mt-5 date_option">
    @csrf
    <div class="form-group d-flex border-bottom">
        <label for="title" class="col-form-label w-25">タイトル</label>
        ⭐️ここ
        <input type="text" class="form-control-plaintext" id="title" value="aaa" disabled readonly>
    </div>
    <div class="form-group d-flex border-bottom">
        <label for="amount" class="col-form-label w-25">支出金額</label>
        <input type="number" class="form-control-plaintext" id="amount" value="12345" disabled readonly>
    </div>
    <div class="form-group d-flex border-bottom">
        <label for="date" class="col-form-label w-25">日付</label>
        <input type="date" id="date" class="form-control-plaintext" disabled readonly>
    </div>
    <div class="mt-4">
        <button type="submit" class="btn btn-primary">編集</button>
        <button type="submit" class="btn btn-danger">削除</button>
    </div>
</form>
```

⭐️
disabled：ポインターイベント無効化
readonly：入力の値の変更を防ぐ

## 参考
 https://getbootstrap.jp/docs/5.3/forms/form-control/
[Google Tasks API(V1)] Javaでタスクリスト内のタスクの順序変更や親タスクを設定する

Google Tasks API V1(Java)を使用して、
タスクリスト内のタスクの順序変更や親タスクを設定する方法
についてご紹介します。

なお、このAPIでは同一タスクリスト内のみ移動が可能です。

:::note info
APIを利用する環境の準備から始める場合や、コードを実行する際は、
[⧉[Google Tasks API(V1)] JavaでTasks APIを使う](https://qiita.com/doran/items/8a3b7e24d9e0417a7f9a)
を参照ください。
:::

|No||目次|
|---|---|---|
|1||[タスクを移動](#1-タスクを移動)|
||1|[スコープ](#11-スコープ)|
||2|[実行](#12-実行)|
||3|[レスポンスの内容](#13-レスポンスの内容)|
|2||[親タスクの指定](#2-親タスクの指定)|
||1|[スコープ](#21-スコープ)|
||2|[実行](#22-実行)|
||3|[レスポンスの内容](#23-レスポンスの内容)|

## 1. タスクを移動
指定したタスクを指定したタスクリストに移動します。

### 1.1. スコープ
このAPIを実行するには、以下のスコープを指定してください。
```
TasksScopes.TASKS
```
[⧉[Google Tasks API(V1)] JavaでTasks APIを使う(2.2 Tasksインスタンスを取得)](https://qiita.com/doran/items/8a3b7e24d9e0417a7f9a#22-tasksインスタンスを取得)
でスコープを指定してください。

### 1.2. 実行

setPreviousで指定した「兄としたいタスクID」の次にタスクが移動します。

```java
public static void main(String[] args) throws Exception{
    Tasks tasks = getTasks();
    Tasks.TasksOperations op = tasks.tasks();
    
    Tasks.TasksOperations.Move move = op.move("タスクリストID","タスクID");
    move.setPrevious("兄としたいタスクID");
    
    Task res = move.execute();
    System.out.println(res);
}
```
#### 1.2.1. HTTPリクエスト
POST:　https:\//tasks.googleapis.com/tasks/v1/lists/{タスクリストID}/tasks/{タスクID}/move
が実行されます。

#### 1.2.2. クエリパラメータ
Tasks.TasksOperations.Moveのsetメソッドにより、クエリパラメータを追加できます。

|メソッド|引数|説明|
|---|---|---|
|setPrevious|String|兄としたいタスクID<br>ここで指定したタスクIDの下に移動します|

#### 1.2.3. リクエストボディ
リクエスボディはありません。

### 1.3. レスポンスの内容
#### Task
(com.google.api.services.tasks.model.Tasks)

|メソッド|戻り値|説明|
|---|---|---|
|getKind|String|リソースの種類<br>固定文字列："tasks#task"|
|getId|String|タスクID|
|getEtag|String|Eタグ|
|getTitle|String|タスクのタイトル|
|getUpdated|String|タスクの最終更新日時|
|getSelfLink|String|このタスクを指すURL|
|getParent|String|親のタスクID|
|getPosition|String|同じ親タスクの下または最上位にある兄弟タスク間のタスクの位置|
|getNotes|String|タスクについてのメモ|
|getStatus|String|タスクのステータス<br>"needsAction"、"completed"|
|getDue|String|タスクの期限|
|getCompleted|String|タスクの完了日|
|getDeleted|Boolean|タスクが削除されたか|
|getHidden|Boolean|タスクが非表示か|
|getLinks|List\<[Linkes](#linkes)|リンク情報|
|getWebViewLink|String|GoogleToDoリストのタスクURL|

#### Linkes
|メソッド|戻り値|説明|
|---|---|---|
|getType|String|リンクの種類|
|getDescription|String|説明文(HTML)|
|link|String|URL|

## 2. 親タスクの指定
指定したタスクを指定したタスクの子にします。

### 2.1. スコープ
[1.1. スコープ](#11-スコープ)と同じです。

### 1.2. 実行

setParentで指定した「親にしたいタスクID」の子にタスクが移動します。

```java
public static void main(String[] args) throws Exception{
    Tasks tasks = getTasks();
    Tasks.TasksOperations op = tasks.tasks();
    
    Tasks.TasksOperations.Move move = op.move("タスクリストID","タスクID");
    move.setParent("親にしたいタスクID");
    
    Task res = move.execute();
    System.out.println(res);
}
```
#### 2.2.1. HTTPリクエスト
[1.2.1. HTTPリクエスト](#121-httpリクエスト)と同じです。

#### 1.2.2. クエリパラメータ
Tasks.TasksOperations.Moveのsetメソッドにより、クエリパラメータを追加できます。

|メソッド|引数|説明|
|---|---|---|
|setParent|String|親にしたいタスクID<br>ここで指定したタスクIDの子に移動します|

#### 1.2.3. リクエストボディ
リクエスボディはありません。

### 2.3. レスポンスの内容
#### Task
[1.3. レスポンスの内容(Task)](#task)と同じです。

<br>
<br>
おしまい。。
辛ければ「リフレーミング」をしてから考えればいいじゃない

# はじめに


## リフレーミングって？
皆さんは「リフレーミング」という手法をご存知でしょうか？

「**リフレーミング（reframing）**」は心理学で用いられる用語です。

「**物事を捉える視点を変えて、別の枠組みとして捉える**」ことを指します。

つまり、別の角度から物事を捉えることです。


この**リフレーミング**を日頃から意識しておくと
ポジティブな捉え方で物事を捉えることができるようになります。

## どうしてリフレーミングを意識するのか

エンジニアという職種はプログラミングの速度やスキルセットなどで
人によっては他者との差を意識してしまう場面が多いかなと思います。
（特に新社会人や新入社員の方などは先輩社員や同僚を意識する場面も多いんじゃないでしょうか。）

他者と自身を比較して「客観的に」「適切に」違いを捉えることは大切です。
しかし、過度に比較しすぎてしまうと「こうでなければいけない」「自分は劣っている」など少し悲観的な考え方に寄っていってしまう場合があります。

この考え方がモチベーションにつながるのであれば素晴らしいことです。
しかし、中にはこの考え方が大きな劣等感につながる人もいるでしょう。

他者と比較して劣等感を抱いてしまいそうになった時、
見方をすこし変えてみることでポジティブに捉えられる面を発見できることがあります。

見方をすこし変えてみる方法が「**リフレーミング**」です。
頭の片隅に覚えておいてもらえればと思います。

## リフレーミングを使うように意識していること
### 過去の自分と比較する

過去の自分と比較してみると
意外とできるようになっていることが見つかることも多いです。



:::note alert
触ったことのないLinuxサーバでWebサーバ環境の構築を頼まれた。結局つよつよエンジニアにLinuxのコマンドを聞かないと、依頼されていたApacheの設定は何一つできなかった。
:::

:::note info
以前はLinuxの操作が何一つわからなかったが、今はcdしてPermissionを変えるぐらいなら自分で変えられるようになった。Apacheにはhttpd.confという設定があるというヒントを知ることができた。
:::

### 性格の見方を変えてみる
自分自身の性格はネガティブに捉えてしまいがちです。
しかし、人との差異になるので当然あなたの強みにもなります。

**ついつい不安になってしまう場合**

:::note alert
心配性で不安になってしまい、必要以上に準備してしまう
:::

:::note info
隅々まで考えて準備をして、きっちり物事に備えられている
:::


**自分を飽き性だと感じている場合**

:::note alert
すぐに何かをはじめたくなるが、飽きてすぐにやめてしまう
:::

:::note info
いろいろなことに興味を持ち、フットワーク軽くチャレンジできる
:::

### 他者に向けて声かけをする
他者が落ち込んでいたり、劣等感に少し弱っているときには
客観的な視点からその人の成長をリフレーミングをして伝えてみましょう。

落ち込んだりして、自分の目の前しか見えなくなってしまっている時は、視野が狭まっていて、自分で気づけることが少なくなっています。そんな時には、その人の成長や変化をリフレーミングして伝えてみてもいいかもしれません。他者からの客観的な見え方を伝えることで、出口につながる気づきを与えられるかもしれません。

同僚や同期、先輩や後輩が悩んでいるのを見かけた時には、その人の変化を客観的な目線からリフレーミングの手助けをしてみましょう。


# まとめ

自分自身を理解することは、生きていく上でも大切なスキルです。
正しく理解するために、様々な目線からものごとを捉えてみましょう。

戦うスキルだけではなく、自分を守るスキルも大切です。生き抜いていきましょう。

この記事で「**リフレーミング**」の言葉だけでも、持ち帰ってもらえれば幸いです。

# 告知
最後にお知らせとなりますが、イーディーエーでは一緒に働くエンジニアを
募集しております。詳しくは採用情報ページをご確認ください。

https://eda-inc.jp/recruit/

みなさまからのご応募をお待ちしております。
JQueryでハンバーガーメニューを開いき、他の要素をクリックすると閉じる。

参考

https://designsupply-web.com/media/programming/2647/

```html
<i class="fa-solid fa-bars"></i>
```

```js
$(document).on('click',function(e) {
    if(!$(e.target).closest('.fa-bars,.menu').length) {
        // ターゲット要素の外側をクリックした時の操作
        $("body").removeClass('open');
    } else {
        // ターゲット要素をクリックした時の操作
        $("body").addClass('open');
    }
    });
```
アイコンをクリックしたときにbody要素にクラスopenが付き、ナビゲーションメニューを表示。
```js
$("body").addClass('open');
```

もしアイコン以外の要素をクリックしたときはbody要素のクラスopenがなくなり、ナビゲーションメニューを閉じる。
```js
    if(!$(e.target).closest('.fa-bars,.menu').length) {
        // ターゲット要素の外側をクリックした時の操作
        $("body").removeClass('open');
```
【vSphere】ESXiのSyslogサービスが停止できない

Syslogを外部に転送しないので無効にしようとしたらエラーがでたのでメモ

## エラーの原因
エラー内容は「サービス vmsyslogdの停止に失敗しました」というもの。ちなみにサービス再起動はできる。

ESXiにSSHで入り、`chkconfig vmsyslogd off`で再起動かけても止められず。

「vmsyslogd stop」でググってみると以下ヒット
https://communities.vmware.com/t5/VMware-vSphere-Discussions/vSphere-7-unable-to-stop-syslog-service/td-p/2299308
＞the item below is not an issue as this is by design as a required service.
the service can be restarted but cannot be stoppped.
⇒必須サービスのため再起動はできるが停止はできないとのこと。仕様みたいですね。

## 結論
このvmsyslogdはローカルに出力するログも管理してるため停止不可と解釈しました。
https://kb.vmware.com/s/article/2003322?lang=ja
＞ESXi ではデフォルトで、これらのログはローカル スクラッチ ボリュームまたは ramdisk に配置されます。さらなるログを保存するために、ディスク上の代替ストレージの場所へこれらのログを置き、そのログをネットワークを介して Syslog サーバへ送信するよう ESXi を構成することができます。
移動軌跡・人流データに関する研究についてのメモ

# 移動軌跡・人流データに関する調査メモ

人流データ・移動軌跡を可視化・分析に関する研究をしらべ自分用のメモを残します。（2024年4月12日現在）

自分用のメモですが一応、私は「アカデミックな人でも数理が得意な人でもデータサイエンスが得意な人でもないので正確さにかける」と断っておきます。

## はじめに

人流データ・移動軌跡データは、可視化・分析するために考えることが多いと感じました。

なぜならば、

- 画一的なフォーマットが無い（データセット固有の特徴がある）
- **取得頻度**や**１トレースあたりの長さ**がきれいではない（データもある）
  - どうやってデータを補完するかによってデータが大きくかわってしまう
- 個人情報保護のため、なんらかの制約がある（場合がある）

などのためです。

また、単純にデータ量が大きくなりがちであり、観察したい対象・期間を効率的に絞り込む何らかの手法が無ければ、データの前処理すら難しくなる場合がある点も挙げられます。

データセット固有の特徴として例えば…
[kaggle - Taxi Trajectory Data](https://www.kaggle.com/datasets/crailtap/taxi-trajectory)

- このデータは、1行の軌跡（緯度経度の組のリスト）が入っている
- 緯度経度の組ごとの間隔は15秒とされ、長さはまちまち
- そして、賃走中のデータであり、常に動いている前提(滞留はない)

など
~~リストを平たく伸ばそうとしてえらい目をみた~~

---

## 可視化・分析の手法などについて

可視化・分析の方向性として、

- 何らかの方法で記号・文字列化し、パターンマッチ・テキストマイニング的な手法で人の流れを解析する
  - [？] 室内などの限られた空間で行われている→広範囲への適応？
- 「滞留」している地点に着目し分析する
  - [？] 「滞留」を検出する手法についてよく検討する必要がある
- 緯度経度をグラフ理論的に扱える形に集約・変換する
  - [？] 着目するもの・前処理などについて
- 移動軌跡をベクトルと見なしてあつかう
  - [？]長さ？

などがあげられるようです。

（`[？]`はその時感じた疑問点）

# 参考文献

ざっと系統別にメモ
参考文献の参考文献、研費、共同研究云々を当たれば大体いま机の上に刷ってある情報は引けるはず…


## 概要などの調査

- Big Trajectory Data Mining: A Survey of Methods, Applications, and Services 

https://www.mdpi.com/1424-8220/20/16/4571

## 滞留に着目した研究

- 携帯端末から得られる低頻度測位な人流ビッグデータを用いた通勤・通学の推定及び分析

https://jglobal.jst.go.jp/detail?JGLOBAL_ID=201802290009356448

https://www.gisa-japan.org/content/files/conferences/proceedings/2018cd/papers/B62.pdf

- 人流ビッグデータを用いたイベント参加前後の人々の滞留分析

https://www.csis.u-tokyo.ac.jp/wp-content/uploads/2019/11/days19B09.pdf


## 人流データをネットワークとして扱う

- 人流データのクラスタリング手法に対する一考察

https://www.gisa-japan.org/content/files/conferences/2016/papers/E65.pdf


## 人流データを文字列化する

- Universal SAX: 空間充填曲線を利用したSAXの多次元時系列データへの適用

https://dbsj.org/journal/dbsj_journal/dbsj_journal_vol_11_no_1_43_48/

- 文字列化による人流データの圧縮と可視化
  
https://db-event.jpn.org/deim2015/paper/169.pdf

- 複数の時系列データの関連性発見に基づく言語化の一考察

http://is.ocha.ac.jp/~siio/pdf/grad/2011/2011grad53.pdf

## 観察すべき対象が定まっているならば&他に属性などのデータがあればこういう事も出来る？

- スマホ・アプリ型回遊調査データによる熊本都心部回遊行動圏の分析

https://www.jstage.jst.go.jp/article/journalcpij/50/3/50_345/_article/-char/ja/

<!-- 
文献のめも

TODO：　~~後で気が向いたら~~ちゃんと引用を書く

文献１

概要をさらっと

どこそこ大学　〇〇研究室　or 研究費

- 関連する２～３の論文

big trajectory data mining -->

<!-- 

- 自動取得された移動軌跡による観光者行動の分析
  - 神谷達夫
- GPS搭載携帯電話を用いた移動経路履歴に基づく訪問地・経由地予測システム
  - 山田直哉 
  - 
-->
[Laravel]rectorで未使用のuse文を一括削除する


# この記事で説明すること

rectorという自動リファクタリングツールを使って未使用のuse文を一括削除する方法を説明！

https://github.com/rectorphp/rector

# 課題感

なんか使ってるか使っていないかわからないが、未使用なuse文がたくさんコード上に存在している！
手動で消すのもファイル数が多くてめんどくさい！！って人向けに、秘術をお伝えします！

これで君もいちいちコードに「使っていないんかーーーい！！」と突っ込まなくて済む快適なエンジニアライフを送れるはずだ！！

# 筆者の動作環境
 - laravel10系
 - composerが動く！

# まず動かしてみる
## インストール

```
composer require rector/rector --dev
```

## rector.phpを修正

下記コードをもとに、動作させたいディレクトリのパスを入れる！

```php
<?php

declare(strict_types=1);

use Rector\Config\RectorConfig;


return static function (RectorConfig $rectorConfig): void {
    // rectorを動作させたいパスを指定する
    $rectorConfig->paths([
//        __DIR__ . '/app',
    ]);

    // rector内で動作させたい設定を呼ぶ
    $rectorConfig->removeUnusedImports();

    $rectorConfig->rules([
        // こちらに追加したいルールを記載する
        // 例
        Rector\Arguments\Rector\MethodCall\RemoveMethodCallParamRector::class,
        // @see https://github.com/rectorphp/rector-phpunit/blob/main/docs/rector_rules_overview.md
        // @see https://github.com/rectorphp/rector/blob/main/docs/rector_rules_overview.md
    ]);

    $rectorConfig->skip([
        // SKIPしたいルールをこちらに記載する
    ]);

    $rectorConfig->sets([
        // ルールセットを記載する
    ]);
};
```

## コマンド実行

```
/vendor/bin/rector process --dry-run
```

実行完了すると、対象ファイル数と対処箇所がコンソール上に出力される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330768/b97d876b-3693-6c89-1571-325888b6d22a.png)

dry-runオプションを消すことで、実際のコードにも反映できる
```
/vendor/bin/rector process
```

# 他にも
色々と自動リファクタリングできる！

 - コード品質の向上
 - デッドコードの削除
 - テストコードの品質向上
 - PHPバージョンアップ対応

https://github.com/rectorphp/rector/blob/main/docs/rector_rules_overview.md


https://github.com/rectorphp/rector-phpunit/blob/main/docs/rector_rules_overview.md



# まとめ

コードにツッコミを入れながら読むようなエンジニアは、rectorを使うことで、「こんなに修正箇所あるんかーーい」と自分の見る目のなさにツッコミを入れることになるかもしれない。
ただ、それは今まで見えてなかった事象が見えたという観点での成長のチャンスかもしれない。
めげずにエンジニアライフを満喫して欲しいと心から思いながら、この記事を締めさせていただきたいと思う

敬具
システム管理者以外、特定の項目の変更を不可とする入力規則を作成する。

## １．システム管理者であることを確認する
プロファイルを利用する場合、名称でなく、IDを利用する（名称変更されたり言語的な影響が出るため）

```
$Profile.Id <>"システム管理者のプロファイルID"
```

カスタム権限を作成しプロファイルで割り当てる方法もある。hogehogeはカスタム権限名

```
AND(NOT($Permission.hogehoge)
```


[参考記事](https://qiita.com/Takaa/items/f0f863c7795dd975701c)


## 2.条件設定→新規行でないこと　を判定する

```
NOT(ISNEW())
```

## 3.該当項目が以前空白で今は入力値が存在すること　を判定する

```
NOT(ISBLANK(PRIORVALUE( Email__c )))
```

## 4.該当項目に変更があったかどうか判定する。

```
ISCHANGED( Email__c )
```

これらをAND条件で結合すると、

```
AND(
　　　　$Profile.Id <>"システム管理者のプロファイルID",
  NOT(ISNEW()),
  NOT(ISBLANK(PRIORVALUE( Email__c )))
  ISCHANGED( Email__c )
)
```
または
```
AND(
　　　　AND(NOT($Permission.hogehoge),
  NOT(ISNEW()),
  NOT(ISBLANK(PRIORVALUE( Email__c )))
  ISCHANGED( Email__c )
)
```
ISNEWは新規レコードの作成中に数式が実行されているかどうかを確認し、実行中の場合は TRUE を返す。既存のレコードが更新中の場合は、FALSE を返す。この場合、既存のレコード更新に当たる場合ストップをかけたいので、NOTで囲んでTRUEを返すようにする。
PRIORVALUEは、項目の前の値を返す関数である。更新前が空白かどうかを確認するためだ。これがないと空白の場合でも、更新することができなくなる。

[参考記事](https://help.salesforce.com/s/articleView?id=000394453&type=1)
【ChatGPT＋DALL-E3】Selectでの削除は簡単だった。


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

　今回は、Selectでの削除は簡単だった、という話を書きます。

:::note info
本記事は、ChatGPT（有料版）
＋DALL-E3で行なっております。
画像はあります。　あしからず。
:::

　まずは、ニュース。

　OpenAIさんが
　　やってくれました！

　ChatGPT有料版が
　　GPT-4 Turboになるそうです。
[OpenAIアカウントより](https://x.com/OpenAI/status/1778574613813006610?t=JrqB4Kfu7jcD-kBZ_uHKNw&s=03)

　DeepL翻訳
>新しいGPT-4ターボが有料ChatGPTユーザーに提供されました。 ライティング、数学、論理的推理、コーディングの能力を向上させました。

　これは
　　今日（2024/04/12）の9時に
　　　ポストされたので、
　　　　切り替わるには
　　　　　それなりの時間が掛かる
　　　　　　かと思います。

　今朝の段階で、
　　“やけに早いな”とは
　　　感じましたが、
　　　　切り替わった感はありません。
　　　　　“たまたま”って感じでした。

　今もやってみましたけど、
　　スピードもいつもより
　　　少し早い？程度です。

　まぁ、
　　計算をやらせたら
　　　早かったですね。
　　　　Code Interpreterに
　　　　　やらせただけですけど🤣

　また、何かわかったら、
　　お知らせしますね😁

　ちなみに、これで、
　　DALL-E3は早くはなりません。
　　　あしからず🤣
***
　今日の本題は、
　　DALL-E3の編集機能についてです。

　使っていますか？

　私は頻繁ではないものの
　　それなりに使っています。

　人物を描くことが多いのですが、
　　人物の服装を変えたり、
　　　手足が多かった場合に
　　　　よく使っています。

　手足が多く出てくることは
　　DALL-E3では比較的少ないとはいえ
　　　まぎらわしい場面では
　　　　出やすいです。

　例えば、
　　ペアでダンスをさせると
　　　その足使いが微妙らしく
　　　　足がもう一本生えます(汗)

　そこで、
　　Selectを使って、
　　　消すわけです。
***
　今回は、
　　その“消す”という行為を
　　　紹介します。

　“えっ？　
　　塗りつぶして
　　　プロンプトを書くだけだろ？”と
　　　　思った方は、ふつうです😅
　　　　　私もそうでした。

　たまたまYouTube動画を
　　見る機会がありまして
　　　その流れで、
　　　　YouTuberのmikimikiさんの
　　　　　動画を見たのです。

　彼女はCanvaというツールを
　　日々使って、その動画を
　　　アップし続けている方です。

　その方が
　　ときおり、ほかのツールを
　　　紹介したりするのですが、
　　　　そこではDALL-E3の編集機能を
　　　　　紹介していました。

　そこでは
　　Canvaとの比較を
　　　やっていたのですが、
　　　　Selectでの削除を
　　　　　教えてくれました。

　その方法は
　　次のとおりです。
***
　まずは
　　さきほどのダンスしている画像。
![1712887186168.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/ef3652e9-3354-7af7-96eb-2517d813cfda.jpeg)

　女性の足が
　　三本ありますね。

　後ろの支えてる足を
　　消したいと思います。

　そこをSelectで
　　塗りつぶして、と。

　それからNextをタップして
　　入力枠へと戻る。

　そのまま、
　　送信してください。

　そう、
　　そのまま何も入力せずに、です。

![1712887203655.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/87241710-dd96-5baa-13ce-a6062eb50fb4.jpeg)
　このとおり、
　　支えていた足が
　　　消えました。

　ちなみに、その動画はこちらです。
[【ChatGPTユーザー必見】DALL-E3に神アプデ！ついに生成した画像を加工・編集できる機能が追加！](https://youtu.be/SPqL1XoF-xA?si=MIXygVshWymFVFZG)

　このやり方ならば、
　　塗りつぶして、送信するだけ
　　　なので、時短になりますね。

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

　今回は、ここまで。
オフライン環境にローカルLLMを実行する環境を作ってみた

# はじめに
以前に以下のような紹介をしました。

https://qiita.com/sugimochi_1019/items/2f8e426faa4e2fc3ba3c

今回はこれの続きで、ローカルLLMを使える環境をオフラインで作成したので手順を共有できればと思います。

# LLMの選定とダウンロード
まず、使用するモデルを選定し、オンライン環境でダウンロードします。ここでは、日本語に対応したjapanese-stablelm-3b-4e1t-instruct-ggufを例に進めます。

https://huggingface.co/mmnga/japanese-stablelm-3b-4e1t-instruct-gguf/tree/main

ダウンロードしたモデルデータは、オフライン環境へ移行するためにUSBなどの移動可能なメディアに保存します。

# 必要なライブラリとツールの準備
LLMの実行に必要なライブラリ等を`pip download`を用いて行います。

```bash
pip download -d ./packages -r requirements.txt
```

`requirements.txt`には以下を含めます。

```shell
scikit-build-core>=0.5.1
pathspec>=0.10.1
pyproject-metadata>=0.5
cmake>=3.21
llama-cpp-python
```

この段階で、インストールを仮想環境にしておくと、良いです。このときに、「特定のライブラリとの依存関係を解決できません」といったエラーが出た場合は、適宜`requirements.txt`に追記して解決してください。
上記でバージョン指定しているライブラリは私の環境で行った時に追記したものになります。
```bash
pip install --no-index --find-links=./packages -r requirements.txt
```

また、LLMのコンパイルにはcmakeが必要ですので、[CMakeの公式サイト](https://cmake.org/download/)からインストーラーをダウンロードしておきます。

# オフライン環境でのセットアップ
オフラインPCにて、以下の手順で環境を構築します。

1. CMakeのインストール: ダウンロードしたインストーラーを実行してCMakeをセットアップします。
1. Pythonライブラリのインストール:
```bash
pip install --no-index --find-links=./packages -r requirements.txt
```
このステップで問題なく完了すれば、環境はLLMの実行にほぼ準備完了です。

# LLMの動作テスト
セットアップが完了したら、以下のPythonスクリプトでモデルが正しく動作するか確認します。

（参考：https://qiita.com/sald_ra/items/24b571ea2b9c0fa04c56#cpu%E6%8E%A8%E8%AB%96%E3%81%B8%E3%81%AE%E9%81%93）
```python
from llama_cpp import Llama

class LlamaAdapter():
    def __init__(self):
        self.llm = Llama(model_path='./japanese-stablelm-3b-4e1t-instruct-q4_K_M.gguf')

    def infer(self):
        output = self.llm(
            "### 指示: 東京の名所を一つ紹介せよ  \n ### 応答:",
            max_tokens=64,
        )["choices"][0]["text"]
        return output

if __name__ == '__main__':
    llama = LlamaAdapter()
    print(llama.infer())
```

このスクリプトは、指定されたプロンプトに基づいてテキスト生成を行います。正常に動作すれば、セットアップは成功です。

---

以上
数日かけてpivpnサーバのエラーを解決した

# はじめに
　私は実用のため自宅でpi-vpnを用いたVPNサーバを立てて運用していますが、ネットワークに対してそれほど深い知識を有するわけではありません。本項で述べる運用方法にはセキュリティ上の欠陥がある可能性があるため、十分注意して運用をしてください。

 # 問題の発生
 　数日前、突如として自宅で運用していたVPNに接続できなくなった。最初はVPN経由でインターネットに接続できていないのだと考えたが、検証を進めるうち自宅内のネットワークにすら接続できていないことが判明した。

# 結果的な解決策
　結論として、ポート開放可能ポートが変更されたことによりポートフォワーディングに問題があった。私はOCNバーチャルコネクト(MAP-E)というサービスを用いている。このサービスでは、IPv6を用いながら1部のポートを開放することが可能になっている(解放できるポートは細かく制限されている)。ところが、私の知らぬ間に開放可能なポートの変更がなされていたようであり、当初の設定で開放していたポートが解放不可になっていた。適切なポートを開放しなおし、再設定することで問題は解決した。

 # 所感
 　まさかプロバイダが勝手に開放可能なポートを変更すると思っていなかったため、PiVPNの再インストールから、ddns業者の変更まで他のあらゆる手段を先に取ってしまった。個人運用とはいえ、デバイスの再設定を考えると気が重い。一般人には関わりのないこととはいえ、解放可能ポートが変更された際は通知するのが義理ではないのだろうか...
  数日を棒に振った私の体験が、誰かのためになることを願います。
【Windows】NTFSアクセス権と共有アクセス権

・NTFSアクセス権
NTFSでフォーマットされたすべてのフォルダ/ファイルに対するアクセス権

・共有アクセス権
共有したフォルダに対するアクセス権


つまり…
①NTFS拒否、共有拒否→共有リソース拒否
②NTFS許可、共有拒否→共有リソース拒否
③NTFS拒否、共有許可→共有リソース拒否
④NTFS許可、共有許可→共有リソース許可

⇒NTFSアクセス権と共有アクセス権がどちらも許可の場合のみ共有リソースへのアクセスが可能




・NTFSアクセス権設定
フォルダ/ファイルのプロパティを開いてセキュリティタブ

・共有アクセス権設定
フォルダのプロパティを開いて共有タブ
MySQLのVARCHARは255文字で指定するとおいしいの？

## MySQLのVARCHAR型について255バイトまではストレージ節約できるよ～みたいな記事を見かけるので少し調べてみた。

以下にこの辺は記載されています。
https://dev.mysql.com/doc/refman/8.0/ja/char.html


### 前提としておさえておくこと
VARCHAR(5) と指定したときの5はバイト数ではなく文字数
つまり`aaaaa` の1バイト文字 x 5でも `あいうえお` の2バイト文字 x 5でも保持できます。

### VARCHAR(255)って何が嬉しいの？
これにはMySQLがVARCHARカラムに対してどのようにストレージをを確保・利用するかを理解する必要があります。

・計算式
1つのカラム/レコードに対して必要なバイト数　= 長さプレフィックス + カラムの保持する文字列データ

#### 長さプレフィックス

長さプレフィックスとは可変長のVARCHARに対してどれだけ長さが必要かを示す数値（バイト数）です。
例えばVARCHAR(10)に対して
`aaa`を格納した場合、 以下のようになります。
```
[長さプレフィックス1バイト][文字列データ]
[3][a][a][a]
```

この長さプレフィックスが必要とする(↑だと3という情報を保持する)バイト数は、カラムに保持する文字列長(バイト数）によって決まります。

| 文字列長(バイト数) | 長さプレフィックスとして必要バイト数 |
|:-:|:-:|
| 1～255  | 1  |
| 256～65,535  |  2 |

例えばVARCHAR(70)の場合、
1バイト文字が70入れば70バイトで長さプレフィックスは1バイト。
4バイト文字が70入れば280バイトで長さプレフィックスは2バイト。

### カラムの保持する文字列データ
これはシンプルで
varchar(10)にaaaaをいれたら4バイト。
4バイト文字を10文字いれたら40バイトという計算です。
aaaaで4バイトとなったとき、長さプレフィックスは1バイトで足りるので、合計のストレージは
長さプレフィックス(1バイト）+ 文字列長(4バイト) = 5バイトです。


#### 長さプレフィックスが1バイトか2バイトかってそんなに気にしなくてもよいのでは？
注意しておく必要があるのがカラム/レコード単位で必要ということですね。

| レコード数 | 長さプレフィックス1の場合 | 長さプレフィックス2の場合 |
|:-:|:-:|:-:|
| 1万  | 0.0095MB  | 0.02MB  |
| 100万　  | 0.95MB  | 2MB  |
| 1000万  | 9.5M  | 20MB  |
| 1億  | 95M  | 200MB  |

# まとめ
- レコード数とカラムが多い(レコード100万以上とか）テーブルは長さプレフィックスは意識しておいたほうがよさそう
- レコード数やカラム数が多くない場合、そんなに気にしなくてよい。（ほぼ影響なし）
- 何文字が上限と決まっているのであればその値をセットするのがベスト
- 何文字くるかわからないけど、多めにとっておきたいというのであれば255文字を基準にするのもありだと思う
- 255文字にしても中身に何バイト文字が入ってくるかで長さプレフィックスは1バイトになるときも2バイトになるときもあるので全てのケースにおいて節約とまではいかないよ
MySQL/MariaDBでIPアドレスをいじくりまわす話

## MySQL/MariaDBでIPアドレスをよしなに扱いたい。

ネットワーク機器ではIPルートはサブネット表記されるのが普通。
その情報から、特定IPアドレスがどのルートテーブルに乗るのかを調べるのは結構めんどい。
Pythonとか使っていればさっくり変換できるが、MySQL上だけでできるとそれはそれで便利。

ということでいろいろなIPアドレス処理をまとめてみた。

```sql:変数セット
set @addr = '192.168.3.66';
set @cidr = '26';
set @mask = '255.255.255.192';
```
```sql:IPアドレス計算(サブネットマスク)
select inet_ntoa(inet_aton(@addr) & inet_aton(@mask)) nw_address;
select inet_ntoa(inet_aton(@addr) | ~inet_aton(@mask)<<32>>32 ) bc_address;
select inet_ntoa(inet_aton(@addr) | pow(2,32) - inet_aton(@mask) -1) bc_address;
```
Mariadbは数値計算が64bitのため、`<<32>>32`で上位32bitをzeroにしている。
もっと文字数少なく計算するやり方があればそちらにしたい。
また、ビット演算になれていな人向けに数字で計算をする方式も記載。

```sql:IPアドレス計算(CIDR)
select inet_ntoa(inet_aton(@addr)>>(32-@cidr)<<(32-@cidr)) nw_address;
select inet_ntoa(inet_aton(@addr) & (pow(2,32) - pow(2,32-@cidr)) ) nw_address;
select inet_ntoa(inet_aton(@addr) | (pow(2,32-@cidr)-1) ) bc_address;
```

```sql:サブネットマスク ⇔ CIDR
select 32 - log2(power(2,32) - inet_aton(@mask)) subnet_mask_to_cidr;
select inet_ntoa(pow(2,32) - pow(2,32-@cidr)) cidr_to_subnet_mask;
```

`inet_aton` を使用すればIPアドレスを10進数で処理ができる。
仮に、nw_address,subnet_maskが記載されたテーブルがあった場合、以下のようにして特定のIPアドレス「@addr」をnw_addressとbc_addressのbetweenで抽出すればどのIPアドレスレンジに含まれているかがわかる。
```sql:ipaddress range search
select address_range_name,nw_address,subnet_mask 
from ip_address_table t1
where inet_aton(@addr) between inet_aton(nw_address) and ( inet_aton(nw_address) | ~inet_aton(subnet_mask)<<32>>32 )
```
PowerAutomateフローの設計の基本

# メインフロー
メインフローが下記のように構成すると、開発時間が節約できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368087/2db8a5b3-d5fb-324f-82ac-431141990992.png)

※子フローの実行：
子フロー：0000-1:ErrorHanding
WFInfo：string(workflow())
Result：string(result('スコープ：try'))
# Error Handing子フロー
Activitus Barが思っていた以上にカスタマイズできた

# はじめに
Activitus Barという拡張機能を愛用しています。

https://marketplace.visualstudio.com/items?itemName=Gruntfuggly.activitusbar

これがあれば画面左端にでっかくバーを表示しなくても、gitや検索等のビューパネルを表示出来て、画面がコンパクトになるのですが・・。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603116/26889553-69a5-4199-25d5-a76f7242b4ed.png)

他の拡張機能によって登録されたビューパネルを呼び出すボタンが表示されません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603116/5b542c2a-a398-52a3-69b1-555b3d5f89ed.png)

ただ、設定でどうにか出来るようです。

# Todo Treeのビューアイコンを登録する
今回は同じく愛用している、こちらの拡張機能のビューパネルを呼び出すアイコンを登録します。

https://marketplace.visualstudio.com/items?itemName=Gruntfuggly.todo-tree

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603116/d3b05013-b8e2-5a56-4121-071e79dde665.png)

## Viewパネルのidを確認する
いきなりちょっとだけ難しいのですが、まず拡張機能のGithub > package.jsonを確認します。 

https://github.com/Gruntfuggly/todo-tree

その中にある`views > XX > id`が必要なidとなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603116/3bc6a9c0-cf64-12f1-34a4-2ca02e85bafb.png)

なので、今回で言えば「**todo-tree-view**」がid。

## Activitus Barの設定を開く
Activitus Barの設定下部にある`Activitusbar:Views > setting.jsonで編集`を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603116/8f733f56-3901-097a-d00d-e01e14d297ee.png)

そしたらこんな感じの配列が表示されるはず。  
これが、画面左下に表示される内容になります。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603116/61fb0940-9f99-b242-6690-455fb5186836.png)

## Activitus Barの設定をいじる
それではここにTodoTreeのviewを呼び出すボタンを追加しましょう。  
下記の形になるよう、新規要素を追加します。
```
{
    name：[viewパネルのid]
    codicon：https://microsoft.github.io/vscode-codicons/dist/codicon.html で定義されているアイコン
}
```

今回はこんな感じ。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603116/de0e4a50-6517-6414-9322-799bf0766cc0.png)


後はsetting.jsonを保存すると即座に反映されます。  

きちんと開けてる！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603116/133a5444-c779-1cf9-d5c3-97b6b7f20315.png)

# おわりに
今回はviewを開くボタンを追加しましたが、readmeを読むとセパレートを追加したり、コマンド呼び出しボタンを追加したりとかなりいろいろ出来るみたいです。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603116/1bacc9d3-162b-5101-a392-12fe0b101a5c.png)


自分の使いやすいようにカスタマイズしてみてはいかがでしょうか？
【Android／Java】Bluetoothペアリング機器の削除（任意のもの以外）

## やりたいこと
製品に付随しているBluetooth機器（例えば、AndroidTVに付随しているBluetoothリモコン）以外のペアリング機器を削除したい。
ネットカフェのPCなど、不特定多数の使用が想定される状況で、利用者がペアリングした機器を、利用終了後に削除したいのが目的での調査メモ

## Step1．実装方法
#### AndroidManifest.xml
~~~xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
~~~~

#### MainActivity.java
~~~java
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // 削除しない機器のデバイスIDを指定
    final String excludeDevices = "0x1111";

    // 端末起動直後は、Bluetooth OFFの場合があるため、ONになるまでまつ
    do {
        BluetoothAdapter ba = BluetoothAdapter.getDefaultAdapter();
        if (null != ba) {
            // Bluethooth設定有効時のみ
            if (ba.isEnabled()) {
                Set<BluetoothDevice> bd = ba.getBondedDevices();
                for (BluetoothDevice device : bd) {
                    if (excludeDevices != device.getBluetoothClass().getDeviceClass()) {
                        // ペアリングを解除
                        Method method = device.getClass().getMethod("removeBond");
                        method.invoke(device);
                    }
                }
                break;
            }
        }
        Thread.sleep(1000);
    } while (true);
}
~~~~

### 解説
1. do-while(true)で無限ループし、BluetoothがONになるのを待ち続ける…永遠にONとならなかった場合の考慮は別途する必要がある
1. device.getBluetoothClass().getDeviceClass()で、ペアリングしているBluetooth機器情報を取得し、削除対象外かを判断
1. method.invoke(device)でBluetoothのペアリングを解除


### 最後に
ハードよりの開発をすることが増えてきて、こういった変な実装ばかりしている気がする。
初心者がGitをインストールして思ったこと

今回は、全体公開の内容でもいいかなって思って珍しく全体公開記事を書きます

普段は、技術的なことは書いていないから限定公開多めなんですが
今回は一応、ソレっぽいことも書くから全体公開にします。

限定公開を読みたいと思った変人のあなたは [あまねのX](https://twitter.com/amane_ds2024) までお越しください

## 独学でGitのインストールしてみた
求人を見ているとGit, GitHubが使えると良いらしい。

職業訓練所ではカリキュラムにGit, GitHubが入っていなさそうなので自分でなんとすることにした。

YouTubeとQiitaの記事でGitのインストール、VScodeとの連携、ファイルのコミットまではやりました。
誰かに教えてもらうよりは時間がかかったけど、自分のペースで作業できたことは良かった。
特に、ジーザス勲さんの記事はインストール後の設定が画像付きで丁寧に解説されていて助かりました
本当にありがとうございます。

【ジーザス勲さんの記事】
[君には1時間でGitについて知ってもらう(with VSCode)](https://qiita.com/jesus_isao/items/63557eba36819faa4ad9)

数日前までGitのUIすら見たことなかった私が初期設定までできたのは感動です。

YouTubeとSNSをはじめインターネットって本当にすごく便利。
座ってるだけでスキルが上がる時代になったのねぇ（お茶をすする）

あまねは しんか の じゅもん を となえた「Git init !!」

## Gitをインストールして思ったこと
先にも書いたように、YouTubeとQiitaだけで入門編は完了したわけですが
動画も記事も公開されてから3年前後経過しているものが多かった。

これに私は衝撃を受けた。

と、いうのもここ2、3年ほど趣味でブログとブロックチェーン（仮想通貨）に関わることが多かったので
一度公開したコンテンツの寿命が1日で終わるなんて言うことはざらだったから
こんなに前の記事なのに今もしっかりとそのまま使えるのすごい！！！となったのです。

### ブログ運営関連の情報の寿命
webサイトを構成する言語自体(HTML,CSS)はそんなに早く変化していかないんだろうけど
webサイトを上位表示させる方法はもう2年前の手法は使えない。

だからYouTubeで「ブログを上位表示させる方法」みたいなタイトルがあっても
2年前の動画は見てはいけない

サムネイルが雑であろうと、音声が荒かろうと、アップロード順で最新のものが正義である
（内容があっているかはさておき）

アルゴリズムで古い動画がおすすめに出てくるのが厄介だね。
どんだけ魅力的なサムネイルであっても再生していいけど、本当に今その情報がそのまま使えるかの検証はしてみたほうが良い。

だから、ブログを上位表示を常にさせたいなら、ブログの設定と記事をかなりの頻度で見直すことになる。
（えらそうなこと言っていますが、上位表示は数記事しかできてません）


Google Analyticsという訪問者をカウントするツールも先日大幅に変更がかかって、アカウントの移行を余儀なくされて、UIもまるっきり変わってしまった。
3年くらい前から変わるから新しい方でアカウント作れってGoogle様が言っていたんだけど、既存のブロガーは情報が出そろっていない新仕様(GA4)の解説ブログや動画を作らなかったし話題にもしなかった。
今でもGoogle analyticsの動画を探しても上位に出てくるのは旧仕様の方なんじゃないかな

私は、GA4の情報が欲しくて探しに探しまくってやっとなんとなくわかる動画にたどり着いたけど、アクセス解析を本業にしている人が「GA4を初見プレイ！」みたいな感じで、計画性もへったくれもない雑談動画だったので、要点などがまとめられていなかったけど、当時それが一番良い動画だった。
動画のクオリティと内容のクオリティは比例しない。
最新の情報がつかみにくいのもブログのしんどいところだったりする。

さらには、ブログに使用する拡張機能（プラグイン）も流行りのものがあって
導入して一定期間経過したら
そのまま使うのか、違うものを使うのか調べる必要がある。
結構前だけど、かなりフォロワーが多い人がXで「おすすめプラグイン最新版！！」みたいなことポストしてたけど、私からみても「それ古くね？？？」っていう内容だった。

案の定、「古い」って言われまくってたけど。

だからブログ運営関連の動画、記事は鮮度が命だったりする。
ボタンの色、形が変わっているだけでもパニックになるまるっきりの初心者に限って言えば個人的には本の購入なんて論外だと思っている。

出版したときには、使用ツールの何かしらのUI変わってるからなだいたい。

### ブロックチェーンの情報の寿命
ブログ以上に情報の寿命が短いのがブロックチェーン関連で
分かりやすいところでいうと、仮想通貨の価格である。

私は以前半年前の情報を基に仮想通貨を買ってしまったことがある大馬鹿ものです。

「この仮想通貨がアツい！！」みたいなことを誰かが言い出した時点で冷め切っているという世界です。

YouTube大好きあまねでも、仮想通貨、ブロックチェーン関連の動画は見なくなりましたね。
だいたい、Xから情報収集をはじめてクローズドコミュニティにたどり着いて
その中で情報交換や議論がなされているわけです。

仮想通貨以外のブロックチェーンのニュースもあふれまくっていて
しかも英語が読めないなら、ついていくのがしんどい。という状況

あと詐欺もびっくりするくらい多い。

毎日のようにハッキングのニュースが飛びこんでくる。

とにかく情報の賞味期限が短い。
ブロックチェーン技術ともなれば、そんなことはないのかもしれないけどいずれにしても情報収集は難しい世界だったりする

## プログラミングの基本的なことは情報の寿命が長いのか？
職業訓練校で教えてもらった範囲でしかわからないけど、
Pythonはバージョンによって、違いがそれなりにありそうだけど

どのバージョンの話をしているか理解できればクリアできそうだった。

そして今回のお題となったGitの動画と記事に関して言えば
私がインストールしたGitのUIは動画や記事に出てきたGitの画面は当時のそれと全く同じだったのです。

Gitよ変わらないでくれてありがとう。
もしかして、使っていくうちに細かいところは変わっているのかもしれないけど
少なくともインストールはできた。

3年前の情報が今でも同じ鮮度で機能しているのが感動なのだ。
いままで情報が早すぎるところにいたなのか、なぞのヨロコビを感じる。

### まとめ
最後まで読んでいただきありがとう。
Gitのインストールしたときのこの感動をどうしても書きたかったの
公開出来て満足です。

4月中にはGitHubもちゃんと設定をしよう。