OmniAICreator/Qiita-1.07M huggingface dataset:
【coursera勉強ノート】時系列分析_ランダムウォーク

### コースURL
https://www.coursera.org/learn/practical-time-series-analysis/home/week/1

## ランダムウォークとは？
ランダムウォークは、ある時点の値が前の時点の値にランダムな変動を加えたもので、次のように表されます：
![スクリーンショット 2024-07-13 144610.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804860/f539bbad-88c9-f053-1543-1cd3dad3e745.png)

### ランダムウォークの特徴
* 非定常性：平均や分散が時間とともに変化するため、定常性の仮定が成り立たないデータを扱うことができる。
* 自己相関：ランダムウォークでは、直近のデータが次のデータに強く影響を与えるため、自己相関が高くなる。

### 使用例
* 株価モデル：
株価の変動は、前日の価格にランダムな変動が加わったものとみなせます。
例：今日の株価は昨日の株価にランダムな変動が加わったもの。
* 経済指標：
GDPやインフレ率などの経済指標もランダムウォークとしてモデル化されることがあります。
例：四半期ごとのGDPの変動は、前四半期の値にランダムな変動が加わったもの。
* マーケティングデータ
月ごとの売上データが前月の売上にランダムな変動が加わったものと考えられる場合。
例：ある月の売上は前月の売上にプロモーションや季節要因などのランダムな要因が加わったもの。

### ランダムウォークを使う理由
予測困難な変動：ランダムウォークは、予測が難しい変動をモデル化するのに適しています。
トレンドの把握：非定常なデータのトレンドや長期的な傾向を把握するのに役立ちます。
データの特性：ランダムウォークは、自己相関が強く、過去の値が現在の値に大きな影響を与えるデータに適しています。

### データがランダムウォークに従っているかどうかを判断する方法
1. ACFプロットの確認
ランダムウォークのACFプロットは、ラグが増えるごとにゆっくりと減少し、高い自己相関を示します。
2. 定常性のテスト
ADF検定（Augmented Dickey-Fuller test）を使用して、データの定常性をテストします。p値が0.05以上であれば、データは非定常であり、ランダムウォークである可能性が高いです。
3. 視覚的な確認
時系列プロットを確認し、データにトレンドがあるかどうかを確認します。トレンドがある場合は、非定常データであることが示唆されます。
### まとめ
ランダムウォークは、金融市場の株価や経済指標、売上データなど、予測が難しい変動を持つ時系列データのモデル化に適しています。これにより、データのトレンドや長期的な変動を分析することができます。
GitHub Copilot導入に向けてCI設定とクレデンシャル削除をした話

こんにちは、misty1999です。4月からユニークビジョン株式会社で開発をしています。最近ではLLMツールが発展しており、弊社でもGitHub Copilotを導入したいという声が上がっています。しかし、最も懸念されるのはクレデンシャルが勝手に読み取られ外部に送信されるリスクです。セキュリティ上のリスクも考慮し、次の条件を満たすリポジトリにのみ導入することにしました。

#### 導入条件

- 過去のコミット履歴にクレデンシャルが含まれていない
- 万が一クレデンシャルが含まれるコミット履歴をブランチに作成した場合、運用ブランチにマージできない状態にする

## 実施したこと

### CI導入

GitHub Workflowを使用し、プルリクエスト時にgitleaksでクレデンシャルが含まれているかを自動的にチェックするようにしました。gitleaksはソースコードに潜むクレデンシャル情報を検出するツールです。ワークフローはリポジトリのルート配下の `.github/workflows` フォルダに定義されます。今回はこのフォルダ内に `ci-gitleaks.yml` というファイルを定義しました。以下はその設定例です。

```yaml
name: ci-gitleaks
on: pull_request
jobs:
  scan:
    name: gitleaks
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
        with:
          fetch-depth: 0
      - uses: gitleaks/gitleaks-action@v2
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          GITLEAKS_LICENSE: ${{ secrets.GITLEAKS_LICENSE }}
```

この設定は [gitleaksの公式リポジトリ](https://github.com/gitleaks/gitleaks-action/blob/master/.github/workflows/example.yml) のコードを参考にしています。`on` は実行条件を意味し、今回は `pull_request` でプルリクエストを作成した際にチェックが行われるようにしました。

#### カスタム設定による除外項目の指定

すべてのクレデンシャルを検知するのではなく、UUIDやシークレットコードのように見えるがマスクされているものに関してはそのままOKにする運用を行います。そのため、以下のような `.gitleaks.toml` を配置しました。

```toml
[extend]
useDefault = true

[allowlist]
regexTarget = "match"

regexes = [
  '''hoge''',
  '''HOGE''',
  '''oooooo''',
  '''OOOOOO''',
  '''xxxxxx''',
  '''XXXXXX''',
  '''EXAMPLE''',
  '''example''',
  # UUID
  '''[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}''',
]
```

`useDefault = true` で既存の設定に加えるよう指定し、`allowlist` で許可する表現を指定しています。具体的には、`regexes` にマッチするような表現が含まれる行はクレデンシャルではないものと見なします。これにより、UUIDやシークレットコードの一部表現を変えたものはCIで引っかからないようになります。

### クレデンシャルの排除

#### 現在のコードに含まれるクレデンシャルの排除

これらは環境変数に逃すか、使用していないなら削除する必要があります。

#### 過去のコミット履歴からクレデンシャルを排除

ローカルにgitleaksを導入し、`gitleaks detect -v` を実行すると過去のクレデンシャルの一覧が表示されます。このうち対応が必要な部分については、git-filter-repoを用いて[先行記事](https://iret.media/90615)に従って作業することでコミット履歴を削除できます。ただし、次の2点に注意が必要です。

- コミット履歴を変更するため、作業中の人には全員一度ブランチにpushしてもらう。コミット履歴の変更後は `git fetch origin` と `git reset --hard origin/develop` を実行し、ローカルとリモートでコミット履歴に不整合がない状態にしてもらう。
- 運用ブランチがprotectedで保護されている場合、adminの権限を持っている人に作業してもらうか、一時的にprotectedを外してforce pushを許可してもらう必要がある。

## まとめ

`.gitleaks.toml` の `useDefault = true` 設定を使えば、自分でカスタムに例外を設定できて非常に便利です。セキュリティ上の懸念がありGitHub Copilotの導入に踏み切れない場合、この記事が参考になれば幸いです。
Java の Maven で Azure Functions を試してみた

いつもは .NET で Azure Functions を使っていますが、ふと Java だとどうやって作るのだろうと疑問に思ったので試してみました。

## 動作環境

```bash:bash
$ java -version
openjdk version "11.0.10" 2021-01-19
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.10+9)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.10+9, mixed mode)

$ mvn -version
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Default locale: ja_JP, platform encoding: UTF-8
OS name: "mac os x", version: "10.16", arch: "x86_64", family: "mac"

$ func --version
4.0.5801

$ az version
{
  "azure-cli": "2.61.0",
  "azure-cli-core": "2.61.0",
  "azure-cli-telemetry": "1.1.0",
  "extensions": {}
}
```

## 検証用 Functions を作成

```bash:bash
$ mvn archetype:generate \
  -DarchetypeGroupId=com.microsoft.azure \
  -DarchetypeArtifactId=azure-functions-archetype \
  -DjavaVersion=11
```

途中で下記の情報を入力。

|Prompt|Value|
|-|-|
|groupId|com.mnrsdev|
|artifactId|mnrfjava|
|version|1.0-SNAPSHOT|
|package|com.mnrsdev|

## Functions 作成後のファイル構成

```bash:bash
$ cd mnrfjava

$ tree
.
├── host.json
├── local.settings.json
├── pom.xml
└── src
    ├── main
    │   └── java
    │       └── com
    │           └── mnrsdev
    │               └── Function.java
    └── test
        └── java
            └── com
                └── mnrsdev
                    ├── FunctionTest.java
                    └── HttpResponseMessageMock.java

10 directories, 6 files
```

## Functions ローカル実行

```bash:bash
$ mvn clean package

$ mvn azure-functions:run

$ curl "http://localhost:7071/api/HttpExample?name=Functions"
Hello, Functions
```

## Azure へのデプロイ準備

pom.xmlで下記項目を自分の環境にあわせて修正。

```xml:pom.xml
<functionAppName>mnrfjava</functionAppName>

<resourceGroup>mnrfjava-rg</resourceGroup>
<appServicePlanName>mnrfjava-asp</appServicePlanName>
<region>japaneast</region>
<disableAppInsights>true</disableAppInsights>
<runtime>
    <os>linux</os>
    <javaVersion>11</javaVersion>
</runtime>
```

## Azure へデプロイし動作確認

```bash:bash
$ mvn azure-functions:deploy

$ curl "https://mnrfjava.azurewebsites.net/api/httpexample?name=Functions"
Hello, Functions
```

## Azure 上に作成されたリソース

![azure-functions-java-mvn-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/5c4c43ef-19bf-dff2-1bae-2a0af4bef1d1.png)


## 後片付け

```bash:bash
$ az group delete --name mnrfjava-rg --yes
```

## 参考

https://learn.microsoft.com/ja-jp/azure/azure-functions/create-first-function-cli-java?tabs=macos%2Cbash%2Cazure-cli%2Ccurl

https://github.com/microsoft/azure-maven-plugins/wiki/Azure-Functions:-Configuration-Details#supported-pricing-tiers

https://github.com/microsoft/azure-maven-plugins/wiki/Azure-Functions:-Configuration-Details
VSCode上のPython仮想環境設定 for Mac

# はじめに
こんにちは。@bdrccです。
図書館で思いがけず、Flaskの参考書を見つけました。

その本の中に、VSCode上のPythonの仮想環境のインタープリター設定方法が記述されていました。
しかし、Windowsでの設定だったため、Macを利用する初心者向けにメモを残します。

# 環境
- MacBookAir M3チップ
- VSCode（Pythonの拡張機能をインストール済）
- Python 3.12.0
- フォルダ構成は以下の通り
```
pyworks
└──try_flask
    ├──blogproject　(.pyファイルを格納)
    └──web_f　　　　　　　　　　　　　(仮想環境もろもろ)
```

# やったこと
1. blogprojectフォルダではなく、try_flaskフォルダをVSCodeで開く
2. 右下のPythonのバージョンをクリック
3. 「Enter interpreter path...」をクリック
4. 「Find...」をクリック 
5. ポップアップから、仮想環境フォルダ名/bin/python3.12 を選択して、「Select Interpreter」をクリック
6. 再度、右下のPythonのバージョンをクリックし、「Python3.12.0('仮想環境フォルダ名':venv)」のインタープリターを選択する

ここまで行うと、下記のような表示になります。
![set_venv.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3793831/3b3020bc-a62a-825d-f818-a08d48cb7715.png)

# 終わりに

本では、`.py`ファイルを格納しているフォルダをVSCodeで開いていました。
Windowsでは、それで良いのかもしれません。

しかしMacでは、元から作成していた`.venv`フォルダの仮想環境に設定できず、新たに`.venv`フォルダを作成してしまっていました。

上記の方法で設定すると、先に仮想環境を構成していても、そちらを選択できるようになりました。

# 参考

本はこちら↓

https://www.shuwasystem.co.jp/book/9784798067964.html
gradle の依存関係で aar を明示的に指定する

あるライブラリの依存関係を書いたところ、アップロードされているライブラリは`aar`であるにもかかわらず、`aar`ではなく、`jar`ファイルを探しに行ってしまいエラーとなってしまう状況に遭遇しました。
これの原因はライブラリの公開情報に不足があるなどが考えられますが、利用者側で修正することはできないので、gradleの記述でどうにかしなければなりません。

## `@aar` をつける

以下のように依存ライブラリを文字列で指定している場合は、バージョン名の後ろに `@aar` をつけて、`aar` を参照するように指定することができます。

```build.gradle.kts
implementation("com.example:foo:1.2.3@aar")
```

## `ext` を指定する

依存ライブラリをセクションごとの情報に分解して指定している場合は、`ext`パラメータとして`aar`を指定します。

```build.gradle.kts
implementation(group = "com.example", name = "foo", version = "1.2.3", ext = "aar")
```

## artifact type を指定する

Gradle Version Catalog を使っている場合は前項までの方法が使えませんが、こちらであれば可能です。
dependencyConfiguration にて artifact　type に `aar` を指定します。

```build.gradle.kts
implementation(libs.foo) {
    artifact {
        type = "aar"
    }
}
```

調べた範囲では gradle version catalog 自体でこちらを指定する方法は見つかりませんでした。
Tips to Become a Successful Electrical Engineer While Pursuing the Degree

Success in electrical industry requires more than technical ability. It's also about developing good study habits and being proactive about learning. 

Successful electrical engineers must possess a combination of soft and hard talents. When evaluating work possibilities, it is critical to consider these needs and the importance of technical competence. Excelling in both areas is critical for obtaining high-level achievement. Many electrical engineering colleges in Villupuram stress the development of these abilities in their students.

This blog will help you navigate the challenges of studying electrical engineering and develop a solid foundation for your future profession.

Nail the Fundamentals: 

To succeed in electrical engineering, you must thoroughly understand fundamental principles such as Ohm's Law, circuit analysis, and electromagnetics. Invest effort in learning these critical ideas from the start, as they will serve as the foundation for further coursework and real-world applications.

Clarify Doubts: 

Feel free to ask questions if you need more clarity about a concept. Seeking clarification early in class, during office hours, or in online forums helps clarify misconceptions. Professors and tutors are ready to help you succeed, so make the most of their expertise.

Hands-On Experience and Stay Updated:

Participate in laboratory sessions, internships, and projects to obtain practical experience with electrical systems. Read publications and use internet resources to stay current on the newest trends and technology, increasing your job market competitiveness.

Persistence Pays Off:

Pursuing an electrical engineering degree at an engineering colleges might be challenging, but dedication is essential for success. Maintain focus on your goals, remain optimistic, and don't be disheartened by failures. Remember that every challenge presents a chance to learn and develop more robustly. With devotion and determination, you can conquer any obstacles that come your way.

ES College of Engineering and Technology, known as the best college in Villupuram, is a leading educational institution committed to developing future engineers and providing them with cutting-edge knowledge and skills.

Successful electrical engineers require perseverance, continuous learning, and a commitment to excellence. Master fundamental concepts, seek clarification, gain hands-on experience, and stay updated with industry trends to forge a rewarding career.
MistralForTokenClassificationによる日本語品詞付与モデルRakutenAI-7B-char-uposをリリース

昨日の[JHPCNシンポジウム](https://jhpcn-kyoten.itc.u-tokyo.ac.jp/ja/sympo/16th)でも指摘したのだが、[RakutenAI-7B](https://huggingface.co/Rakuten/RakutenAI-7B)のトークナイザは[非常に出来が悪く](https://qiita.com/KoichiYasuoka/items/c180d901649dbac43532)、[MistralForTokenClassification](https://qiita.com/KoichiYasuoka/items/6e0d3b23e680879a4314)による系列ラベリングに適さない。たとえば「今も海が見えるでしょうか」を「今」「も」「海」「が見」「える」「でし」「ょう」「か」とトークナイズしてしまうので、「が見」がどうにもならないのだ。

![RakutenAI-7B.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428317/b1b3542d-a032-9685-0558-d3a9cf0f4e42.gif)

だったらトークナイザを改造して、「が見」が「が」「見」になるようにすればいい。そう考えて、私(安岡孝一)なりに[RakutenAI-7B-char-upos](https://huggingface.co/KoichiYasuoka/RakutenAI-7B-char-upos)を[作ってみた](https://huggingface.co/KoichiYasuoka/RakutenAI-7B-char-upos/blob/main/maker.sh)。ちょっと動かしてみよう。

```
>>> from transformers import pipeline
>>> nlp=pipeline("upos","KoichiYasuoka/RakutenAI-7B-char-upos",trust_remote_code=True)
>>> doc=nlp("今も海が見えるでしょうか")
>>> for t in doc:
...   print(t["text"],t["entity"],t["score"])
...
今 NOUN 0.40114793
も ADP 0.9626548
海 NOUN 0.33803082
が ADP 0.9801759
見える VERB 0.42835698
で B-AUX 0.3523871
し I-AUX 0.24315608
ょ I-AUX 0.26823658
う I-AUX 0.4992607
か PART 0.12613676
```

うまく品詞付与できているようだ。B-・I-を解消してみよう。

```
>>> doc=nlp("今も海が見えるでしょうか",aggregation_strategy="simple")
>>> for t in doc:
...   print(t["text"],t["entity_group"],t["score"])
...
今 NOUN 0.40114793
も ADP 0.9626548
海 NOUN 0.33803082
が ADP 0.9801759
見える VERB 0.42835698
でしょう AUX 0.24315608
か PART 0.12613676
```

よし、OK。つまり、トークナイザを適切に改造すれば、Mistralなどの生成AIも系列ラベリングに使えるということだ。そのあたり、他の生成AIもそれぞれ頑張ってほしいなあ。
sshでLinuxサーバーに接続する際のfingerprintの確認方法

参考サイト
https://artisan.hatenablog.com/entry/20130325/1364222117

Linuxサーバーに初めてssh接続する際にfingerprintが表示されます。
これが正しいか確認する方法を調べたので残します。
(今まで気にはなっていましたがそのまま接続していました。。。)

# ターミナルソフトで接続する
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106311/fe6d539d-abd6-8208-e441-f569a09b4f3f.png)

公開鍵暗号方式を確認する

# 一旦切断する

# サーバーの公開鍵のfingerprintを確認する
## ログインする

## サーバーに保存されている公開鍵を確認する
```terminal:terminal(command)
ls -l /etc/ssh/*key.pub
```
```terminal:terminal(result)
-rw-r--r-- 1 root root 182  7月 13 14:58 /etc/ssh/ssh_host_ecdsa_key.pub
-rw-r--r-- 1 root root 102  7月 13 14:58 /etc/ssh/ssh_host_ed25519_key.pub
-rw-r--r-- 1 root root 574  7月 13 14:58 /etc/ssh/ssh_host_rsa_key.pub
```
- 先ほどのターミナルソフトでECDSAが利用されていることがわかっている

## 該当の公開鍵のfingerprintを確認する
```terminal:terminal(command)
 ssh-keygen -lf /etc/ssh/ssh_host_ecdsa_key.pub
```

```terminal:terminal(result)
256 SHA256:OIipk(省略)IcUE username@hostname (ECDSA)
```

# もう一度ターミナルソフトで接続してfingerprintが一致しているか確認する
- 一致していればそのまま接続
MacのFinderでフルパス表示にするための裏技集

# 事の起こり
MacのFinder上で、ファイルパスやディレクトリパスをフルパス表示にしようとした時にいつも方法を忘れてしまい、Web検索をして探します。ところが、筆者が設定したいと思う方法を全て掲載しているページが無く、あちこち探し回る羽目になるのでまとめておこうと思います。

# 裏技1: パスバーの表示
任意のファイルやディレクトリのパスをフルパスで表示するバーをFinderウィンドウ下部に表示します。方法は、**表示 > パスバーを表示**で表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/2d207204-f558-2f39-5387-1135bdc4feee.png)

下図の様なバーが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/46e024c6-707b-bb8a-e880-77c674ff59ff.png)

# 裏技2: Finderタイトルにディレクトリのフルパスを表示
Finderのタイトルは通常現在開いているディレクトリ名が表示されます。これをフルパスにすることが出来ます。方法は簡単で、以下のコマンドを実行して、Finderを再度起動するだけです。

```bash
defaults write com.apple.finder _FXShowPosixPathInTitle -boolean true && killall Finder
```

* 実行前

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/37845379-7090-4cc1-4ced-35aaaea8be6c.png)

* 実行後

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/a8df5ce2-0790-a4cb-bfe2-01b5112daad5.png)

# Reference
https://www.webdlab.com/mac/tips-finder-2/

https://pc-karuma.net/mac-finder-fullpath/

https://tcd-theme.com/2020/11/mac-file-path.html
React×TypeScriptプロジェクト作成時のnpmキャッシュフォルダのエラーの解決方法

## はじめに

この記事は、ReactとTypeScriptを使って新しいプロジェクトを作成する際にnpmのエラーに遭遇したので、その原因と解決方法を調べたメモ記事です。

## 起きた事象

新しいReact×TypeScriptのプロジェクトを作成しようとした際に、以下のエラーが発生しました

```shell
$ npx create-react-app devmatsuko-portfolio --template typescript

Creating a new React app in /Users/devmatsuko/Desktop/study/devmatsuko-portfolio.

Installing packages. This might take a couple of minutes.
Installing react, react-dom, and react-scripts with cra-template-typescript...

npm ERR! code EACCES
npm ERR! syscall open
npm ERR! path /Users/devmatsuko/.npm/_cacache/index-v5/ea/5f/ed9fbd5bd146db522eb110c35f223340a514174c0f8ba9132ea20b8f6721
npm ERR! errno EACCES
npm ERR! 
npm ERR! Your cache folder contains root-owned files, due to a bug in
npm ERR! previous versions of npm which has since been addressed.
npm ERR! 
npm ERR! To permanently fix this problem, please run:
npm ERR!   sudo chown -R 501:20 "/Users/devmatsuko/.npm"

npm ERR! A complete log of this run can be found in: /Users/devmatsuko/.npm/_logs/2024-07-08T08_27_31_680Z-debug-0.log

Aborting installation.
  npm install --no-audit --save --save-exact --loglevel error react react-dom react-scripts cra-template-typescript has failed.

Deleting generated file... package.json
Deleting devmatsuko-portfolio/ from /Users/devmatsuko/Desktop/study
Done.
```

どうやらこのエラーは、npmキャッシュフォルダ内にroot所有のファイルが存在しており、権限エラーとなっているようでした。
## 解決方法

以下の手順でこの問題を解決しました

1. **npmキャッシュフォルダの所有権を修正**

   ターミナルで以下のコマンドを実行して、npmキャッシュフォルダの所有権を現在のユーザーに変更します

   ```bash
   sudo chown -R $(whoami) $(npm config get cache)
   ```
    <br>
   
2. **プロジェクトの作成を再試行**
    所有権を修正した後、再度プロジェクトを作成コマンドを実行

    ```bash
    npx create-react-app devmatsuko-portfolio --template typescript
    ```
    これで無事に新しいReactとTypeScriptのプロジェクトを作成することができました。

## まとめ
今回はnpmのキャッシュフォルダにroot所有のファイルが存在することが原因で、新しいReactプロジェクトの作成が失敗しました。
フォルダの所有権を変更するという半ば強引な？方法で解決しましたが、他にも方法はありそう…な気がしました。
M5StackCoreInkのサンプルを動かす

# はじめに

この記事は、M5Stack CoreInkのサンプルを動かした際のメモとして書いたものです。

## M5Stack CoreInkとは

https://www.switch-science.com/products/6735

- M5Stack CoreInk サンプル

https://github.com/m5stack/M5Core-Ink/tree/master

# M5Stack CoreInkのサンプルを動かす

まずは、開発環境を整えます。

# Arduino IDEのインストール

こちらより、ダウンロードしてインストールしてください。
インストール方法は色々と他記事があるのでここでは解説しません。

https://www.arduino.cc/en/software

## ドライバ・開発環境の導入

こちらの[公式手順](https://docs.m5stack.com/en/quick_start/coreink/arduino)に沿って構築してください。
ライブラリのインストールまで済んだら、サンプルスケッチを試してみます。

まぁ、公式の手順に沿っていけば開発環境の構築は難しくないと思います。

# Hello World

開発環境の準備ができたらサンプルの **Hello World** を試してみたいと思います。

Arduino IDEで新規スケッチを開き、下記のコードを記述します。

```C

#include "M5CoreInk.h"

Ink_Sprite InkPageSprite(&M5.M5Ink);
/* After CoreInk is started or reset
the program in the setUp () function will be run, and this part will only be run once.
*/
void setup() {

    M5.begin(); //Init CoreInk.
    if( !M5.M5Ink.isInit()) //Init CoreInk screen.
    {
        Serial.printf("Ink Init faild");
        while (1) delay(100);
    }
    M5.M5Ink.clear();   //Clear screen.
    delay(1000);
    if( InkPageSprite.creatSprite(0,0,200,200,true) != 0)   //Create a sprite.
    {
        Serial.printf("Ink Sprite creat faild");
    }
    InkPageSprite.drawString(35,50,"Hello World!"); //Draw a string.
    InkPageSprite.pushSprite(); //Push the sprite to the screen.
}
/* After the program in setup() runs, it runs the program in loop()
The loop() function is an infinite loop in which the program runs repeatedly
*/
void loop() {

}

```
### 上記のサンプルスケッチを保存して、ボードとポートを選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/934471/971db3a1-db18-6599-d6b9-4d044d1c270b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/934471/4e534625-e84f-1371-ca2e-abd01ce6069a.png)

### スケッチのアップロードと実行

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/934471/ead2efe3-1b09-43b8-2ef1-37395c96d281.png)

Hello World！が表示されました！

![PXL_20240122_131658955.MP.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/934471/8ec51080-d857-a0f8-a4da-1ce817e6d4fe.jpeg)

とりあえず無事にサンプルが動くことを確認できました。
次回はMQTTのサンプルを動かしてみたいと思います。

- MQTTサンプル

https://github.com/m5stack/M5Core-Ink/blob/master/examples/Advanced/MQTT/MQTT.ino

# その他

アップロードに失敗することがあります。その際にはTools->Upload Speedを変更してみてください。
たまに921600とかになっていて失敗することがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/934471/5ce4cd45-3175-7600-df04-bd88cea8f440.png)
(研究) Macのクリップボード拡張ツールUnclutterを使ってみた

# 事の起こり
筆者は長らくWindowsマシンを使っていましたが、ひょんなことからMacに乗り換えました。macOSには概ね満足しているのですが、幾つか不満点も有ります。そのうちの1つが、クリップボード履歴を過去1件しか参照出来ないことです。Windowsは筆者の記憶が確かならWindows10から過去の履歴が複数件見える様になっています。但し、Mac用のクリップボード拡張ツールはOSSやシェアウェアなどで多数公開されており、筆者も以前とあるOSSを利用していました。ただ、使わない機能が多かったため、利用を辞めてしまいました。将来的に自作するのも悪くないと思いつつ、他にも既存のアプリケーションを参考までに見てみようと思っていた矢先、Unclutterというアプリケーションのライセンスを格安価格で入手出来たので、試しに使ってみることにしました。

# 入手方法
以下の公式サイトでは無料体験版[^free]に加えて、App Store経由で購入できます。

https://unclutterapp.com/

https://apps.apple.com/jp/app/unclutter/id577085396?mt=12

但し、日本のユーザー限定だと思いますが、SourceNextというソフトウェアベンダー経由で購入すると割引価格で購入可能です。筆者はこちらから購入しました。

https://www.sourcenext.com/product/0000013537/?gpc=0000013537

# インストール
インストールは入手方法に応じて異なります。入手方法に合った方法でお使いのMacにインストールして下さい。

# 実際に使ってみる
実際に起動して利用してみました。左からクリップボード履歴、ファイラー、メモ帳が並んでいます。呼び出し方法が少し特殊でウィンドウ上部にマウスカーソルを移動し、そのまま下にスクロールするという方法です。(任意のショートカットキーの登録も可能)筆者はMacのVM(詳しくは[過去記事](https://qiita.com/y-vectorfield/items/2f45059a7ab56ba824ac))上で実行しましたが、上手く動作しない場合が有りました。クリップボード履歴はよく見ると、テキストやZipファイル、リッチテキストファイルなども問題無く格納出来ています。クリップボード上に有るものであれば、何でも吸い込める様です。画像ファイルも試してみましたが、問題有りませんでした。クリップボード履歴の内容や、ファイラーに格納したファイル、メモなどはDropbox経由で複数台のMacマシン間で共有可能となっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/e3709afd-42a5-7771-9eb9-54811b29fb8e.png)

各項目の左端の☆印はお気に入りに登録、右端の✕印が削除のボタンとなっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/7224a3e7-dc21-9f98-aa18-0b157812161b.png)

各項目のファイルの格納先はファイル欄を右クリックした上で、**Finderで表示**をクリックすることで見えました。以下のディレクトリに格納されている様です。


$HOME/Library/Containers/com.softwareambience.Unclutter/Data/Library/Application Support/Unclutter

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/425faab8-445e-019f-afd4-a919eae7dca2.png)


# まとめ
実際にUnclutterを使ってみましたが、VM上で動かしたためか、はたまたそう言う仕様なのか、呼び出し操作が難しかったです。ウィンドウ上部にマウスカーソルを移動させる時の位置がシビアで少しでもズレていたり、タイミングがズレるとウィンドウが表示されませんでした。しかし、クリップボード管理ツール実装時のUIの参考になる部分も有ったので、近い将来実装する時は参考にしたいと思いました。

* 参考: ウィンドウの表示方法
筆者はこの起動方法がやり辛くて表示に失敗するのでショートカットキーを登録して使用しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/b21b3b7b-8777-603f-65c9-a9727bd156dc.png)

[^free]: 無料でどれぐらいの期間利用出来るのか調べてみましたが分かりませんでした。。。
Pineconeを触ってみる

## はじめに
Pinconeはベクトルを保存できるデータベースです。文章や画像、音声等のデータの特徴量を抽出し、ベクトル変換して保存する仕組みです。1年?2年前?くらいから単語だけは聞いた事があったのですが、余裕が出てきたので触っていこうと思います！！

https://www.pinecone.io/

## 前準備
:::note info
pip install pinecone-client
:::
pineconeのクライアントツールをインストールします。

## ソースコード
```python:sample.python
import os
from dotenv import load_dotenv
from pinecone import Pinecone, ServerlessSpec

# .envファイルから環境変数を読み込む
load_dotenv()

# 環境変数からAPIキーを取得
api_key = os.getenv("PINECONE_API_KEY")

# Pineconeクライアントのインスタンスを作成
pc = Pinecone(api_key=api_key)

# インデックス名
index_name = "example-index"

# インデックスが存在しない場合に作成
if index_name not in pc.list_indexes().names():
    pc.create_index(
        name=index_name,
        dimension=3,  # ベクトルの次元数
        metric='euclidean',
        spec=ServerlessSpec(
            cloud='aws',
            region='us-east-1'  # us-west-2ではなく、us-east-1を使用
        )
    )

# インデックスに接続
index = pc.Index(index_name)

# ベクトルデータの挿入
index.upsert(vectors=[
    ("id1", [0.1, 0.2, 0.3]),
    ("id2", [0.4, 0.5, 0.6]),
    ("id3", [0.7, 0.8, 0.9])
])

# ベクトルデータの検索
query_result = index.query(
    vector=[0.1, 0.2, 0.3],
    top_k=2
)
print(query_result)

```

```shell:実行
~/develop/python$ python3 pinecone_example.py
/Users/kawamurakouji/Library/Python/3.9/lib/python/site-packages/urllib3/__init__.py:35: NotOpenSSLWarning: urllib3 v2 only supports OpenSSL 1.1.1+, currently the 'ssl' module is compiled with 'LibreSSL 2.8.3'. See: https://github.com/urllib3/urllib3/issues/3020
  warnings.warn(
{'matches': [{'id': 'id1', 'score': 2.98023224e-08, 'values': []},
             {'id': 'id2', 'score': 0.27000016, 'values': []}],
 'namespace': '',
 'usage': {'read_units': 5}}
```

![スクリーンショット 2024-07-13 15.03.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/087d6d1b-473f-c1c0-6247-233dd95e5e75.png)

![スクリーンショット 2024-07-13 15.04.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/48df0daf-2db7-ad22-c9fc-43a8c7370d57.png)

:::note info
確かに、DBに保存できていますね。ただ、難しいのは特徴量を抽出する事、類似度の計算時に特徴量を計算する事。この2点をどうやって扱えばいいのか。。。そこがまだ全然イメージついていないです。
:::
PowerBIDesktopで、ひとつ前の行を参照する(Index - 1が重かったので、別処理)

PowerBIDesktopで、ひとつ前の行を参照したいニーズがあった。具体的に、以下のようなニーズ。
|Index|取得したい列|取得した列|
|---|---|---|
|1|山田|Error|
|2|田中|山田|
|3|石崎|田中|
|4|来生|石崎|
|5|井沢|来生|
|6|滝|井沢|

DAXに慣れてないので、PowerQuery側で何とかしてみようと思い、ChatGPT大先生に聞くと、以下のようにすればいいよ！って回答あり。
・最初に、インデックスを作る　(0スタートのもの)
・以下のようにカスタム列を作る
　追加されたインデックス[取得したい列]{[インデックス] - 1}

PowerQuery上で試してみると、うまくいった。
さすがChatGPT大先生！と思って、適用させたところ、問題発生。
適用が終わらん。。

## 前提条件

今回、読み込むソースはCSVファイルで、ローカルPC上に置いている。
なお、ファイルは4つに分かれている為、PowerQuery上で事前に結合させている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3741886/096cf617-a809-353c-0d53-116aa9737f84.png)
なお、ファイルの容量は以下の通り。これは伏線なので、軽く覚えておいてほしい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3741886/af450019-4c52-4b55-f9bb-a937da2430a1.png)

## 起こっていたこと

ファイル読み込みウィンドウを見てみると、データの読み込みはしてくれている。
ただひとつおかしいのは、用意したCSVファイルの容量をはるかに超えるデータ量を、読み取っているということ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3741886/39e76d70-86ed-660a-56ba-7a3b01759079.png)

1GB？なして？？
訳が分からずに、天井知らずでどんどんデータ量は膨れ上がっていた。

## 原因

やり方が悪いと思うんだけど、なんでだろう？
だれかわかる人いましたら、お教えいただきたい。。

## 対策

とりあえず、違う方法を試みた。
・最初に、インデックスを作る　(0スタートのもの)
・もういっこ、インデックスを作る　(1スタートのもの)
・下の絵のように、マージする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3741886/52d7d671-74a1-1e0e-59d1-b42e47d264d0.png)
マージってコスト重いとかいうし不安やなーって思ってたけど、すぐ終わった。

## 結果

狙い通りの処理ができるようになって満足。
でも原因不明。
大量の VCF 連絡先を MS Outlook にインポートして開くための効果的な方法

<p>多数の連絡先を含む VCF ファイルを Outlook 2010 および以前のバージョンにインポートする場合、一部のユーザーは、VCF の多数の連絡先を Outlook にインポートする手順を完了するのが難しいと感じています。しかし、心配する必要はありません。この投稿では、多数の VCF ファイルを Outlook プロセスにインポートする最も効果的な 2 つの方法について説明します。</p>
<p>私たちが知る限り、すべての連絡先情報は通常、仮想カード (VCF) に保存されています。Outlook は VCF ファイルを読み取ることができますが、いくつかのフックが関係しています。したがって、そのシナリオでは、まず、多数の vCard 連絡先を Outlook にインポートする手順に関する主なユーザーの問題と質問を確認する必要があります。</p>
<h2><strong>VCF ファイルを PST に変換することに関する懸念</strong></h2>
<blockquote>
    <p>「私の友人は、Google Takeout 方式を使用して、それぞれに固有の連絡先がある .vcard ファイルを 100 個以上エクスポートしました。現在、彼は Outlook に移行し、さまざまなプラットフォームを使用しています。Outlook で、VCF の複数の連絡先をインポートしたいと考えています。インポートしようとしましたが、一度に複数の連絡先を選択できませんでした。さらに、それぞれを個別にインポートするには時間が足りません。助けていただければ幸いです。</p>
</blockquote>
<p>フォーラム サイトや他のいくつかの Web サイトで、多数のユーザーが同じ質問をしていることがわかりました。「Outlook アカウントに連絡先をインポートするにはどうすればいいですか?」「複数の VCF 連絡先を Outlook に取り込むにはどうすればいいですか?」などです。同じ問題を抱えていて、多数の vCard 連絡先を Outlook にインポートしたいと考えている場合は、ブログを読み続けてください。わずか数分で、連絡先をインポートするための最も効果的なテクニックを紹介します。</p>
<p>手動プロセスには、貴重な時間と労力が数時間かかります。しかし、これは心配する必要はありません。ここでは、技術的な専門知識を必要とせずに、多数の連絡先を含む VCF ファイルを Outlook 2010 以降のバージョンにインポートする方法を説明します。vCard 連絡先を Outlook に一括インポートする手順は簡単に完了できます。</p>
<h2><strong>Outlook 2016 を使用して VCF の複数の連絡先をより速くインポートする</strong></h2>
<p><strong>Softaken </strong><a target="_blank" rel="noopener noreferrer" href="https://www.softaken.com/jp/vcard-export-import"><strong>vCard/エクスポート インポート ツールは</strong></a>、MS Outlook 2016、2010、2019、および以前のバージョンに大量の VCF 連絡先をインポートして開く最も直接的な方法です。また、このツールを使用すると、インポート機能が簡単かつ迅速になります。さらに、このユーティリティの他の機能のいくつかを実行して、その主要な部分にアクセスすることもできます。</p>
<ul>
    <li>ソフトウェア内の各連絡先は、1 つの VCF ファイルに制限されます。</li>
    <li>vCard バージョン 2.1、3.0、4.0 を含むすべての VCF ファイル バージョンがソフトウェアと互換性があります。</li>
    <li>複数の VCF ファイルの転送に関する規則はありません。</li>
    <li>ソフトウェアは、すべてのバージョンの Windows で動作します。</li>
</ul>
<h3><strong>Outlook インポートに複数の VCF 連絡先を追加する方法</strong></h3>
<ul>
    <li>最初に変換ツールをインストールする必要があります。</li>
    <li>[開く] を選択した後、VCF ファイルまたはフォルダーを選択します。</li>
    <li>その後、VCF ファイル内の連絡先、個人、および自宅のデータを表示します。</li>
    <li>ニーズに応じて、VCF ファイルを保存する別のファイル形式を選択します。</li>
    <li>電話番号やメール アドレスなどの連絡先の詳細を VCF ファイルから抽出します。</li>
    <li>[保存] ボタンをクリックして、VCF ファイルのインポートを完了します。</li>
</ul>
<h3><strong>要約すれば、</strong></h3>
<p>結論として、この記事では、自動と手動の両方の方法を使用して、多数の VCF 連絡先を Outlook にインポートする方法について説明しました。手動の方法の欠点に対処するために、より理想的で最適な解決策を紹介しています。まず、プログラムをダウンロードしてインストールし、手順に従って複数の VCF ファイルを Outlook (すべてのバージョン) にインポートします。これは、連絡先をすばやく簡単に整理して保存するための効果的な方法です。</p>
【初心者】JRubyでSQLiteデータベースを読み書きする

# 手軽に使えるSQLiteだが思ったよりも苦労した

何もわざわざJRubyなんて使う必要ないと言われそうなんですが、プログラミングを人に教えるときにデータベースの使い方を扱う必要が出てきまして、Windowsで手軽に環境構築できるので、JRubyを使うことにしました。

また、手軽に利用できるデータベースを探していたところSQLiteにたどり着きました。実際、selectは他のDBよりもかなり速いですね(個人が利用する範囲ならば)

ネットで色々と検索したのですが、自分の環境ではJRuby + SQLiteの読み書きは、Rubyのライブラリーではあまりうまく行きませんでした。

普段からJavaでsql2o( https://www.sql2o.org/ )を利用していたので、これをJRubyで呼び出せば行けるのではないかと考えました

# 準備

sqlite-jdbc-3.46.0.0.jar , slf4j-api-1.7.30.jar , slf4j-simple-1.7.30.jar ,sql2o-1.8.0.jar を使います。

sqlite-jdbcは、slf4jに依存しているので(以前のバージョンはそうではなかったですね。ほんとうはやめてほしい)、これも必要となります。

また、sqlite-jdbcの中身を見ると、sqlite接続に必要なネイティブライブラリーが格納されていました。少なくともWinodwsとLinuxでは利用できました。多分macも大丈夫でしょう。

上記ライブラリーをカレントディレクトリに保存します。

# JRubyで書いてみました

自分は jruby-complete-9.4.7.0.jar を利用しています

```ruby
require 'java'
require 'rubygems'
require './sqlite-jdbc-3.46.0.0.jar'
require './slf4j-api-1.7.30.jar'
require './slf4j-simple-1.7.30.jar'
require './sql2o-1.8.0.jar'

# DBの場所(カレントディレクトリになります)
url = "jdbc:sqlite:test.db"

sql2o = org.sql2o.Sql2o.new(url, "","")

# 各種SQL
create_sql = "create table if not exists test (id integer , name text)"
insert_sql = "insert into test values ( :id , :name)"
select_sql = "select id , name from test where name like :kwd"

# 挿入データ
table_data = [
  [0 , "なんとかたろう" ],
  [1 , "なんとかじろう" ],
  [2 , "あれこれたろう" ]
]

begin
  con = sql2o.open
  
  # テーブル作成
  con.createQuery(create_sql)
    .executeUpdate()
  # データ追加(一レコードずつ)
  for col in table_data
    con.createQuery(insert_sql)
      .addParameter("id" , col[0])
      .addParameter("name" , col[1])                   
      .executeUpdate()
  end
  #挿入ここまで
  
  # nameに「たろう」という文字が含まれるレコードを出す
  list = con.createQuery(select_sql)
           .addParameter("kwd" , "%たろう%") # もっといい方法があるかも
           .executeAndFetchTable().asList()
  for l in list
    puts "ID:#{l['id']} 名前:#{l['name']}"
  end  
  
  con.close # こうするのではなくブロックにしたい
  
end
```

# 実行結果

```
ID:0 名前:なんとかたろう
ID:2 名前:あれこれたろう
```

# 大量のデータを追加するとき

いわゆる「バルクインサート」というやつをやる時は、上記のコードのデータ追加部分を以下のように修正します。このほうが実用的かもしれません。

```ruby
# データ追加(まとめて)
  query = con.createQuery(insert_sql)
  for col in table_data
    query
      .addParameter("id" , col[0])
      .addParameter("name" , col[1])
      .addToBatch()
  end
  query.executeBatch()
  #挿入ここまで
```

# 終わりに

JRubyは、Javaのライブリーが利用できるのが大きな魅力です。Rubyのライブラリーを使う方法が色々あるかもしれませんが、自分は普段からJavaで作ることが多いので、慣れたライブラリーを手軽に利用しました。

sql2oを利用した出力が、簡単にRubyのオブジェクトに格納できるのは、Rubyの懐の深さを感じました。

こうしたライブラリーのAPIは、Javaに詳しい人でないと呼び出せないかもしれません。
となると、やはりJRubyならではのメリットを享受するにはJavaの知識が必要なんですかね。
C_TS452_2021 - SAP Certified Application Associate - SAP S/4HANA Sourcing and Procurement対策（8/100）

【8日目】
トピック1：企業構造とマスタデータ（8/11）

≪問題8≫
以下のうち、購買管理で取引先機能決定を有効化するための前提条件となるアクティビティはどれですか。
□取引先決定表の関連する勘定グループヘの割当
□伝票タイプ別使用可能取引先機能の定義
□取引先機能の関連する契約タイプヘの割当
□勘定グループ別使用可能取引先機能の定義

≪解答≫
□取引先決定表の関連する勘定グループヘの割当
□伝票タイプ別使用可能取引先機能の定義
□取引先機能の関連する契約タイプヘの割当
■勘定グループ別使用可能取引先機能の定義

≪解説≫
◆ 取引先決定には、以下のカスタマイジング設定が必要です。
（1）クライアント全体で使用する取引先機能をすべて定義する必要があります。その際、取引先での個々の取引先機能の使用を、各組織レベルにつき1回のみ可能として指定することができます。一意区分を選択していない場合は、各組織レベルにつき、同じ取引先機能に複数の取引先を定義することができます。購買伝票の登録時には、使用可能なすべての取引先の一覧を取得し、その一覧から該当する取引先を選択することができます。
（2）取引先機能の定義が完了したら、それらの定義を勘定グループに許可する必要があります。どの取引先機能として使用するかは、この割当によって決まります。たとえば、運送業者勘定グループに対して取引先機能「受注先住所」を許可しても、あまり効果はありません。
（3）購買伝票タイプに対して少なくとも1つの取引先決定表を定義し、この決定表に取引先機能を割り当てる必要があります。また、勘定グループに対して取引先決定表を登録することもできます。

≪補足≫
この問題の回答が「■勘定グループ別使用可能取引先機能の定義」である理由は、購買管理で取引先機能決定を有効にするために必要な設定が、取引先機能を勘定グループに関連付けることだからです。
具体的には、取引先機能決定を有効にするためのカスタマイジング設定の一部として、以下の手順が含まれます
　1. クライアント全体で使用する取引先機能をすべて定義する。
　2. これらの定義した取引先機能を、勘定グループに対して許可する。これは、どの取引先機能が特定の勘定グループに対して使用可能かを決定するものです。
このように、取引先機能を勘定グループに関連付けることにより、特定の取引先機能がどの勘定グループで使用できるかを設定します。これは、取引先機能決定の基本的な前提条件となります。
一方、他の選択肢は、以下のように取引先機能決定の前提条件を満たしません
　- 「取引先決定表の関連する勘定グループヘの割当」：取引先決定表は、既に定義された取引先機能に基づいています。
　- 「伝票タイプ別使用可能取引先機能の定義」：伝票タイプに対して取引先機能を定義するのは、取引先機能決定表の一部です。
　- 「取引先機能の関連する契約タイプヘの割当」：契約タイプは購買プロセスの一部ですが、取引先機能決定の前提条件ではありません。
したがって、「勘定グループ別使用可能取引先機能の定義」が正しい回答となります。
[備忘録]　IT用語について分かったことをまとめてみた ~ver.10

# はじめに
こんにちは，Umamusume22です．今回，再びIT用語について分かったことをまとめてアウトプットしていきます．

# 備忘録
#### ゾンビプロセス[1]
- 実際にはもういないのに管理上はまだ存在する状態になっているプロセスのこと
- Unix(Linux)の話でよく出てくる
- プロセスが開始されたらプロセステーブルに記載されて終了するとプロセステーブルから削除
- 親プロセスでforkをすると子プロセスが作られる

#### ゼロデイ攻撃[2]
- 準備が整う前に行う攻撃のこと
- ソフトウェアなどの欠陥を見つけて対応している間にやられる，その欠陥を利用した攻撃のこと
- 見つかったけど直っていない欠陥を利用した攻撃のこと
- ソフトウェアには少なからず脆弱性が存在する

#### ゼロデイ脆弱性[3]
- 見つかったけどまだ直っていない欠陥のこと
- 攻撃されたらマズイ
- ゼロデイ脆弱性を利用した攻撃をゼロデイアタックと呼ぶ


# 最後に
今回も記事の内容が短くて申し訳ありません．
IT用語って調べたら調べるほど初めて知る用語と遭遇します．また，説明を求められると上手く答えられなかったりこの用語とこの用語の違いは何？とかあったりします．

読んでいただきありがとございました!

※ウマ娘の声をフーリエ変換した記事や水栓の開閉判定をLineに通知する記事も書いています．suzuが私です．興味がある方はぜひご覧ください！
https://vigne-cla.com/31-1/#toc5

※noteも始めました．
https://note.com/madoka235/n/nbba2153326e1

ぜひフォローよろしくお願いします!

# 参考文献
[1] “「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典”
https://wa3.i-3-i.info/word11035.html

[2] “「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典”
https://wa3.i-3-i.info/word16482.html

[3] “「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典”
https://wa3.i-3-i.info/word14223.html
しくじったときの大事な考え


# しくじりも悪くない

失敗は誰にでもあるものです。
何か新しいチャレンジをするときには失敗はつきものです。

やってはいけない失敗は、防げたはずの失敗です。

しくじりは分けて考えましょう。


# 挑戦したのか？ 怠惰か？

しくじりをネガティブなものと捉えすぎないようにしましょう
挑戦の失敗の多くは学びになります。失敗を恐れて成長を止めないように、どんどん失敗しよう。


知っていたから防げたはず、ちゃんとチェックすれば防げたはず、よく調べずに適当にやらなければ防げたはず。そんな失敗はダメです。
２回同じ失敗をしないように大いに反省してください。

# 仕組み化しよう
エンジニアであれば、２回同じことをしたら仕組み化を考えよう。
同じしくじりを防ぐことができるはずです。
その手で作り出せることはとても大きな可能性を秘めています。

仕組み化するスキルが足りないなら勉強しよう！
できることが増えるのはとても面白いです。


# プロフェッショナルになろう
内部構造はエンジニアしか理解し得ないシステムの品質のため、維持するにはエンジニアがプロフェッショナルになるしかありません。

エンジニアが作り出すものはとても大きな影響を持っています。
外から見えるシステム的な動きが間違っていれば誰かから指摘を受けます。
しかし、システムの中にある構造は同じエンジニアからしか指摘される可能性はありません。

良いシステムであり続けるには、誰か一人だけ頑張っていてもシステム全体の品質を維持できません。
エンジニア以外の人には内部構造がわからないからこそ、信頼できるようなエンジニアになれるように厳しく失敗を防げる仕組みを考えて提案していく必要があります。


# とはいえ失敗はするもの

しくじり自体はしょうがないのです。知らないことは防げないのです。
アプリケーションも開発も複雑化するばかりです。

失敗したあとのアクションこそ一番大事です。
小さな失敗を沢山して、しくじった学びを活かして、次の大きな失敗を防ぐことができればそれで良いと思います。


しくじりを自分で抱え込みすぎずに、次に活かすために世の中の知識として発信しましょう！



そんなわけで、このイベントを見て、この記事を書いてみました

https://qiita.com/official-events/fd39ed8cc0dcc9829621


読んで頂いてありがとうございました！
any-hover？何それどんな時使うの？

TailwindCSSのドキュメントを確認していて見つけたプロパティでした。

:::note
調べてみたら、そんなことができるのか！とこれまで微妙だと思っていたことが解決できるものでした！
:::

そんなの聞いたことない！って人はサクッと読めるのでぜひ一読していってください！

## any-hoverってなんだ？

https://developer.mozilla.org/ja/docs/Web/CSS/@media/any-hover

MDNでは下記のように説明されています。

> any-hover は CSS のメディア特性で、要素の上で停止することができる入力メカニズムが何らか利用できるかどうかを検査するために使用することができます。

よくわかりません…。
1つずつ紐解きます。

:::note
【メディア特性について】
メディア特性は、ユーザーエージェント、出力装置、環境の特徴のことです。
:::

次にわからないのがこの部分。
> 要素の上で停止することができる入力メカニズムが何らか利用できるかどうかを検査するために使用する

メディア特性のページのもう少しわかりやすい表現で書かれてました。

https://developer.mozilla.org/ja/docs/Web/CSS/@media#%E3%83%A1%E3%83%87%E3%82%A3%E3%82%A2%E7%89%B9%E6%80%A7

> 入力メカニズムで、要素上でのホバーをユーザーが使用できるものがあるか。

要するにユーザーエージェントでホバーが機能するか？をチェックするためのメディア特性です！

ブラウザの対応状況は問題なさそうです！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146612/5d5525fd-3e26-14e1-1ccb-6007f7582001.png)

## any-hoverはいつ使うの？
筆者がこれまで微妙だと思っていたのは、`hover`できない端末でも`hover`が有効になってしまっていること…でした。

:::note
`any-hover`はこの微妙な点を改善してくれます！
:::

下記のように指定することで実現できます。

```css
@media (any-hover: hover) {
  a:hover {
    background: yellow;
  }
}
```

ちなみに`hover: hover`というの記述方法も存在します。

|メディア特性|説明|
|:--|:--|
| `@media (hover: hover)`|入力デバイスがhoverに対応している場合に適用する|
|`@media (any-hover: hover)`|入力デバイスのいずれかにhoverに対応している場合に適用する|

`any-hover`については下記の記事わかりやすく、非常に参考になりました！

https://www.tak-dcxi.com/article/disable-hover-on-mobile-and-hover-implementation-example 

https://qiita.com/gilly/items/546adecd18a8db3fd059

:::note
紹介した2つの記事内にも書かれていたことですが、**予期せぬUIの振る舞い**の発生を防ぐため`any-hover`を利用する意味がありそうです！
:::

## まとめ
本件に限ったことではありませんが、暗黙的、内部仕様で設定されているものは見えづらくエラーの原因に気が付きにくくなります…。

:::note
ライブラリやフレームワークも内部的に依存しているライブラリがあるので利用時には把握しておきたいですね！
:::

どこまで対応するのかは難しいところですが、できる限り明示的に所作を指定してやることが予期せぬ表示を防ぐことにつながるのだと改めて思いました。
IEが生きている間にVBAでスクレイピング（非推奨）

## Selenium も Webドライバーも使えない環境でするスクレイピング

Seleniumをインストールできない（理由はそういう会社だから）ので、IEで無理やりやっています。

当然ですが、Pythonも使えないので、本当にVBAとIEのみです。以前、Pythonでスクレイピングするコードを投稿しましたが、実務では今回のようなコードを書いています。

### あの KEN_ALL.csv を作った会社のHPから欲しい情報を抜き出す

ここから国別のページに入って、すべての国の一部分のみの詳細情報をリスト化します。

https://www.post.japanpost.jp/int/information/overview.html

手動でやると、「名宛国・地域」の列を一つずつクリックしてデータベースとしてほしい項目をコピーペーストすることになりますが、当然、こんな単純労働をしていると、10回目あたりのループでアナフィラキシーのような症状を発症してしまうかもしれません。

![国別差出可否.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812230/0a257461-6b4f-7240-e291-3a8a987c7273.png)

国名をクリックした画面
![中国詳細.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812230/088389c8-11c2-5c9c-8fa1-ef842d4feb7e.png)


注目ポイントは、国名をクリック後に遷移するページのURL "https://www.post.japanpost.jp/cgi-kokusai/country.php?cid=41"
の最後の数字（中国は41、アメリカは7）

このページ（https://www.post.japanpost.jp/int/information/overview.html）
をExcelにペーストして国名の数を COUNTA関数で数えたら確か263でした。※なぜかURLをクリックすると、エラーメッセージのページが表示されるので、ブラウザにコピーしてください。

すべてひとつずつ確認したわけではありませんが、ここまでで、1～263までの数字が割り振られているんだろうなと推測できます。

というわけで、この数字の部分を変数にしてループさせればすべての国名を1から順番にクリックした先のページをExcelにコピーペーストできそうですね。

![ループ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812230/34cd783b-c51e-a7eb-fd85-1d0bf990dafd.png)

今回は、6 取り戻し請求及び宛名変更または訂正請求 の列のテキストを狙い撃ちしてシートに転記します。ほしいテキストは、テーブル内にあるので、インデックス番号が必要になります。Rows で テーブルの行を指定しようとしましたが、失敗したので、こんな感じのコードになりました。適当に何回か数字を入れて動かしてみたら、インデックスは37であることがわかりました。"tr" タグのインデックス37を取りに行きます。
```vb
Dim CanOrCannot As Object
Set CanOrCannot = tbl.getElementsByTagName("tr")(37)
```

![中国3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812230/01772718-3647-9e68-a0e4-b5e5c2c8def7.png)


### まだループさせていないコード

とりあえず、中国のみをExcelに転記させるコードを書きました。

```vb
Sub CreateDB() '取り戻し請求の可否

    Dim objIE As Object
    Set objIE = CreateObject("Internetexplorer.Application")
    objIE.Visible = True
    
    objIE.Navigate "https://www.post.japanpost.jp/cgi-kokusai/country.php?cid=41" '41は中国 最後の数字を変数に書き換える
    
    Do While (objIE.Busy = True) Or (objIE.ReadyState < 4)
    
      DoEvents

    Loop
    
    Dim htmlDoc As Object
    Set htmlDoc = objIE.Document

    '国名をシートに転記するための下準備
    Dim Cname As Object '国名を格納する変数
    Set Cname = htmlDoc.getElementsByClassName("countryname")(0) 

    'テーブルの特定の項目を狙い撃ちするための下準備
    Dim tbl As Object
    Set tbl = htmlDoc.getElementsByTagName("table")(0)
    
    Dim CanOrCannot As Object
    '特定の行のみを狙い撃ち
    Set CanOrCannot = tbl.getElementsByTagName("tr")(37) '6取戻請求及び宛名変更 取り扱いの有無
    
    ThisWorkbook.Sheets("Sheet2").Range("A1") = Cname.innerText
    
    ThisWorkbook.Sheets("Sheet2").Range("B1") = CanOrCannot.innerText
    
    objIE.Quit
    Set objIE = Nothing
    
End Sub
```

これに For Next でループさせたら完成です。

### 実際の挙動

```vb
 objIE.Navigate "https://www.post.japanpost.jp/cgi-kokusai/country.php?cid=41"
 ```

![挙動4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812230/e99e76c0-ac37-fa30-f3cf-12efdb6a0014.png)

シートに書き出す

![挙動2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812230/abbb029b-a2f5-a5de-4d66-42826f1bb868.png)

すべての国で転記できたら、データ成形をして完成です。
[備忘録]　IT用語について分かったことをまとめてみた ~ver.9

# はじめに
こんにちは，Umamusume22です．今回，再びIT用語について分かったことをまとめてアウトプットしていきます．

# 備忘録
#### クロック集合[1]
- CPUたちが足並みを揃えるための手拍子のこと
- 回路の同期を取るための周期的な集合のこと

#### 同期[2]
- 足並みを揃えること
- 2つの箱の中身を同じにすること
- 何かと何かを揃えること

#### オーバーヘッド[3]
- コンピュータが何かやった時に発生する付加的な処理のこと
- 目的となる処理に付随して発生する付加的な処理
- オーバーヘッドが処理か負荷を指すかは言った人次第


# 最後に
今回も記事の内容が短くて申し訳ありません．
引き続きIT用語について分かったことをアウトプットしていきます．
読んでいただきありがとございました!

※ウマ娘の声をフーリエ変換した記事や水栓の開閉判定をLineに通知する記事も書いています．suzuが私です．興味がある方はぜひご覧ください！
https://vigne-cla.com/31-1/#toc5

※noteも始めました．
https://note.com/madoka235/n/nbba2153326e1

ぜひフォローよろしくお願いします!

# 参考文献
[1] “「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典”
https://wa3.i-3-i.info/word1978.html

[2] “「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典”
https://wa3.i-3-i.info/word1388.html

[3] “「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典”
https://wa3.i-3-i.info/word12471.html
【Go】for rangeでmapの要素を取り出す順番

mapの要素をfor rangeで取得する時、取得する要素の順番は必ずしもmapに定義した要素順になる訳ではないらしい。
```go:
	m := map[string]int{ 
		"a": 1,
		"b": 2,
		"c": 3,
		"d": 4,
	}

	for i := 0; i < 5; i++ {
		fmt.Println("ループ", i)
		for k, v := range m {
			fmt.Println(k, v)
		}
	}
 ```

 実行結果は以下のようになる。
 ```
 ループ 0
d 4
a 1
b 2
c 3
ループ 1
a 1
b 2
c 3
d 4
ループ 2
b 2
c 3
d 4
a 1
ループ 3
a 1
b 2
c 3
d 4
ループ 4
a 1
b 2
c 3
d 4
```

この使用は以下の2点を考慮された仕様のようだ。
1. mapの順番が固定されていると仮定したコードを書くのを防ぐ
2. マップの裏で作られるハッシュがいつも同じ対応になると、それを利用して「HashDoS」と呼ばれる攻撃が仕掛けられる危険性があるため  

# 参考
[初めてのGo言語 ―他言語プログラマーのためのイディオマティックGo実践ガイド](https://www.amazon.co.jp/%E5%88%9D%E3%82%81%E3%81%A6%E3%81%AEGo%E8%A8%80%E8%AA%9E-%E2%80%95%E4%BB%96%E8%A8%80%E8%AA%9E%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%82%A4%E3%83%87%E3%82%A3%E3%82%AA%E3%83%9E%E3%83%86%E3%82%A3%E3%83%83%E3%82%AFGo%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-Jon-Bodner/dp/4814400047)
[Unity]GooglePlayの対象APIレベル要件の影響を受けているアプリがあります

# 概要
タイトルのようなメールがGoogleから届いてアプリの修正が必要になった時、つまづきやすいポイントを共有します。

# 本文
## Target API Level
UnityのProjectSettingsを開いて、Player > Target API Levelの部分をGoogleから指示のあったAPIレベルまで引き上げます。

![スクリーンショット 2024-07-13 13.18.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/1b4200c0-66bf-08f4-3a99-7b76e9bc60f7.png)

:::note info
Unity2022.3でAPI Levelに34を指定しても内部的に36が指定されるバグがあるようです（新しいバージョンでは解決済み）。もしこのバグに引っかかった場合はこの先に書いてあるSDK34の設定が終わった後「Automatic(highest installed)」を選択することでAPI Level34としてビルドすることができます。
https://forum.unity.com/threads/update-android-sdk-36.1447801/

試していませんが、直接ProjectSettings.assetのAndroidTargetSdkVersionを36から34に書き換えても解決できるようです。
https://issuetracker.unity3d.com/issues/android-unity-prompts-for-an-update-to-api-level-36-when-api-level-34-is-used-to-build-for-android
:::

## ビルド

![スクリーンショット 2024-07-13 11.18.51のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/f9b7ce0e-a068-1e0c-b046-ac494859b2c7.png)
![スクリーンショット 2024-07-13 14.31.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/694d2688-0dff-6aa0-1b7d-a666f357f68e.png)

いざビルドする時、スクショのようなエラーが出ることがあります。「Update Android SDK」を押すとほぼ自動で解決してくれますが、上手くいかなかった場合はAndroidStudioを使って解決することもできます。

## AndroidStudioでSDKを取得する
起動画面でSDK Managerを選んで
![スクリーンショット 2024-07-13 13.14.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/0f1d07ea-e4f3-10ac-9194-11dd838f6d90.png)

目的のSDKを探して、インストールされてるか確認します。Not installedだった場合はチェックを入れてApplyすることでダウンロードされます。
その次に同じ画面のAndroid SDK Locationに書かれているフォルダの場所を開くと「android-34」みたいなフォルダがあるのが確認できると思います。

![スクリーンショット 2024-07-13 13.14.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/a90da2b3-1397-4e53-b7a5-3108687cc0db.png)

次にUnityに戻ってPreferences > External Tools > Android SDK Tools installed with Unityに書かれたフォルダ位置を参考にフォルダをたどります。
![スクリーンショット 2024-07-13 13.08.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/05b592d1-04d2-782e-e746-91e837623d71.png)
そのフォルダに、AndroidStudioでダウンロードしたSDKをフォルダごとコピーします。

![スクリーンショット 2024-07-13 13.09.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/15efb6be-e130-e8f2-5fee-537d754cbb6b.png)

ここまで準備すると、さっきのビルドエラーは出なくなると思います！

## 上手くいったか確認
GooglePlayConsoleでApp Bundleをアップロードした後「対象SDK」がGoogleに指定されたものに更新されていたら完了です！

![スクリーンショット 2024-07-13 13.57.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/f3f09540-8cbc-6e9b-27a2-24b193b74f95.png)


:::note info
ちなみにGooglePlayからの「ポリシーに関する警告」は場合によって変わると思いますが、リリース後一日経ってから解除されるようです。
:::


# 補足
参考にさせていただいたサイト
[【Unity】Androidアプリで「APIレベルを上げてください」と怒られた時の対処法](https://kingmo.jp/kumonos/unity-android-api-level/)
gRPCのクイックスタートを実施してみる！！

## GoでgRPCで構築する方法
gRPCの公式ページのクイックスタートを紹介するものになります。

## 前提条件
以下のツールがインストールされていることを確認してください：
- Go: 最新の3つのメジャーリリースのいずれか。インストール手順はGoのGetting Startedガイドを参照してください。
- Protocol buffer compiler (protoc): バージョン3。インストール手順はProtocol Buffer Compiler Installationを参照してください。

- Go plugins for the protocol compiler:

```shell:コマンド
  go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.28
  go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.2
```
PATHを更新して、protocコンパイラがプラグインを見つけられるようにします
```shell:コマンド
  export PATH="$PATH:$(go env GOPATH)/bin"
```
## サンプルコードの取得
サンプルコードはgrpc-goリポジトリの一部です。
1\.リポジトリをクローンします
```shell:コマンド
   git clone -b v1.65.0 --depth 1 https://github.com/grpc/grpc-go
```
2\. クイックスタートのサンプルディレクトリに移動します
```shell:コマンド
   cd grpc-go/examples/helloworld
```
## サンプルの実行
examples/helloworldディレクトリから以下の手順でサンプルを実行します：
1\.サーバーコードをコンパイルして実行します
```shell:コマンド
   go run greeter_server/main.go
```
2\.別のターミナルからクライアントコードをコンパイルして実行し、クライアントの出力を確認します
```shell:コマンド
   go run greeter_client/main.go
```
出力例
```:出力例
   Greeting: Hello world
```
これでgRPCを使用したクライアントサーバーアプリケーションが実行されました。
## gRPCサービスの更新
次に、サーバーメソッドを追加してアプリケーションを更新します。gRPCサービスはプロトコルバッファを使用して定義されます。
helloworld/helloworld.protoを開き、新しいSayHelloAgain()メソッドを追加します
```proto:protoファイル
// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}
  // Sends another greeting
  rpc SayHelloAgain (HelloRequest) returns (HelloReply) {}
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings
message HelloReply {
  string message = 1;
}
```
ファイルを保存します。
## gRPCコードの再生成
新しいサービスメソッドを使用する前に、更新された.protoファイルを再コンパイルする必要があります。
examples/helloworldディレクトリで以下のコマンドを実行します
```shell:コマンド
  protoc --go_out=. --go_opt=paths=source_relative \
    --go-grpc_out=. --go-grpc_opt=paths=source_relative \
    helloworld/helloworld.proto
```
これにより、helloworld/helloworld.pb.goとhelloworld/helloworld_grpc.pb.goファイルが再生成されます。
## アプリケーションの更新と実行
新しいメソッドを実装し、クライアントコードで呼び出す必要があります。
### サーバーの更新
greeter_server/main.goを開き、以下の関数を追加します
```go:main.go
func (s *server) SayHelloAgain(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
    return &pb.HelloReply{Message: "Hello again " + in.GetName()}, nil
}
```
### クライアントの更新
greeter_client/main.goを開き、main()関数の末尾に以下のコードを追加します
```go:main.go
r, err = c.SayHelloAgain(ctx, &pb.HelloRequest{Name: *name})
if err != nil {
    log.Fatalf("could not greet: %v", err)
}
log.Printf("Greeting: %s", r.GetMessage())
```
ファイルを保存します。
### 実行
再度、サーバーとクライアントを実行します：
1\.サーバーを実行
```shell:コマンド
   $ go run greeter_server/main.go
```
2\. 別のターミナルからクライアントを実行。今回は名前をコマンドライン引数として追加します
```shell:コマンド
   $ go run greeter_client/main.go --name=Alice
```
出力例
```:出力結果
   Greeting: Hello Alice
   Greeting: Hello again Alice
```

### まとめ
これでgRPCの構築が完了しました。

## 参考記事
https://grpc.io/docs/languages/go/quickstart/
[備忘録]　マウスについて分かったことをまとめてみた

# はじめに
こんにちは，Umamusume22です．前回までキーボードについて分かったことを記事にしました．今回はマウスについて分かったことを記事にします．

# マウスの読み取り方式について[1]
#### レーザー
- 光源がレーザー光
- 光沢面でも読み取りが可能
- 透明面の場合，あまり反応しない

#### Blue LED
- BlueLEDの青色光は赤色光・赤外線と比べて波長が短い
- 拡散率が高いため，僅かなホコリも感知する

#### IR LED
- 赤色光と比べて波長が長い
- 赤外線LEDを使用
    - 省電力化
- 電池交換の頻度が下がる

#### 光学式
- 光沢面や光が透過する素材の上では思うように動作しない
- プラスチック素材や木目調の上では問題なく動作する

# マウスの便利な機能について[2,3]
#### 静音設計
- クリック音の音圧レベルを抑えてクリックのカチカチ音が少ない
- 静音スイッチを採用

#### 省電力設計
- 電池の交換時期がわかる「電池残量表示」機能を搭載
- 使用するときだけ電源を入れる「on/off」スイッチ
- マウスが動作していない時はスリープ状態になる

#### こだわり機能
- 縦横共にスクロールができる「チルトホイール」機能が搭載
- ブラウザの「戻る，進む」を操作できるサイドボタンを搭載

レシーバーの収納が可能なマウスも存在します．

# 最後に
今回も記事の内容が短くて申し訳ありません．
今回はマウスについて分かったことをまとめました．私はmacユーザーですが普段はスライドパッドを使用してpc作業を行うのでマウスはそんなに使いません．私が所有しているmacのマウスは白で平らです．
macのマウスを使いこなすのが最初は大変でしたが慣れたら便利です．

記事を読んでいただきありがとございました!

※ウマ娘の声をフーリエ変換した記事や水栓の開閉判定をLineに通知する記事も書いています．suzuが私です．興味がある方はぜひご覧ください！
https://vigne-cla.com/31-1/#toc5

※noteも始めました．
https://note.com/madoka235/n/nbba2153326e1

ぜひフォローよろしくお願いします!

# 参考文献
[1] “マウスの読み取り方式を知ろう"
https://www.buffalo.jp/topics/select/detail/mouse-guide-read-mouse.html

[2] "マウスの便利な機能を知ろう"
https://www.buffalo.jp/topics/select/detail/mouse-guide-functions-mouse.html#a01

[3] "静音なのに確かなクリック感 静かなマウス"
https://www.buffalo.jp/topics/select/detail/seion.html