OmniAICreator/Qiita-1.07M huggingface dataset:
Power AppsでExcelデータをフィルターする時の罠

## 背景と結論
Excelで存在するデータをそのまま使ってPower Apps化したい、という根強い要望に応えて。[こちら](https://mofumofupower.hatenablog.com/entry/excel-online-powerapps)の記事に背中を押されて検証してみたら、いたるところに罠が仕込まれてました・・・

結論から言うとExcel Online (Business)コネクタにおいて、
・ 列名に「・」や「-」が入っているとフィルター効かない
・ 数値はフィルター効かない（Excel文字列設定にしてもダメ）
・ 「'」接頭辞[^KEY]をつければ数値でもフィルター効く
・ コンボボックスの```Self.SearchText```でのフィルタは全滅

罠はあれど、注意しておけばお手軽にアプリ作れそう。
今後の動作改善を願っております・・・

[^KEY]: ※ 「'」接頭辞の歴史は[こちら](http://www.officetanaka.net/excel/function/tips/tips15.htm)

## 検証内容
下表の6列のテーブルを用意。いずれも1～9999の連番。
1列目： 列名に「・」の文字有り、0埋めするため999以下は「'」接頭辞付き
2列目： 列名に「-」の文字有り、0埋めするため999以下は「'」接頭辞付き
3列目： 列名に「_」の文字有り、0埋めするため999以下は「'」接頭辞付き
4列目： 列名に「・」や「-」無し、1000移行も「'」接頭辞付き
5列目： 列名に「・」や「-」無し、1～9999まで全て数値（「'」接頭辞無し）
6列目： 列名に「・」や「-」無し、1～9999まで全て文字列（「'」接頭辞無し）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670355/a0d3b9fc-4898-3c8f-be3b-84b9e46978c3.png)

これらの各列に対して下図のような検証用アプリを作成。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670355/1943f330-4320-f925-98c2-bbf50618bc4c.png)

・コンボボックスで```Filter(テーブル,StartsWith(各列,Self.SearchText))```が効くか？
・ギャラリーで```Filter(テーブル,StartsWith(各列,TextInput.Text))```ができるか？
を検証の結果、先の結論となった。。。
ペン型マウスを試したら意外に良かったので高評価レビューします（★★★★★）

みなさん、入出力装置にこだわっていますか！？
KVMという言葉があるとおり、
Qiita周辺の方は、
・キーボード
・ビジュアル（ディスプレイ）
・マウス
にこだわっている方多いと思います。

今回、取り上げるのは、
この中でも、「マウス」についてです。

この記事では、「ペン型マウス」について取り上げます。
![400-mawbt202_02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154954/3f28530c-8316-6276-813e-3b0bbdd7cb58.jpeg)


# マウスの形
皆さん、マウスにこだわりがありますよね！！？
Gemma2に
「マウスの形状について教えて？」
と質問したところ、
代表的な
・普通のマウス
・トラックボール
という回答が出てきました。

しかし、この記事では、
Gemma2でも取り上げてくれない
マイノリティーなペン型マウスについての話をします。

# ペン型マウスとは？

こんな形のマウスです。
マウスと同等の操作が、
ペンの形のデバイスでも可能と思っていただければ大丈夫です。
普段からマウスを使ってる私が、
ペン型マウスを併用することになった理由は以下です。

## 理由：鉛筆・ボールペンで記述する際の筋力と漢字力を鍛えなおしたい
はい。普段から、キーボードを利用している方。
・漢字、書けますか！？
・1時間以上、紙に記述する筋力ありますか！？
ということでうす。
私、論文記述形式の試験を受けようと思っているのですが、
・漢字力やべぇ
・指の筋力やべぇ
となったわけです。

## 指の筋力の鍛え直し
漢字力は短期間でなんとかなると判断したのですが、
指の筋力がやばいのです。
30分程度紙にペンで記述すると痛くて書けなくなるのです。
これはヤベェということで、
筋力鍛え直しの必要性を実感したわけですが、
「いつもやってる仕事をしながら指の筋力も鍛えれたらいいよねぇ」
というエンジニア的怠惰の結果、ここに行きつきました。

「ペン型入力デバイス（ペン型マウス）」

というわけで、
買って試してみたわけですが、
思った以上にいいので紹介します。

## 余談
論文記述形式の試験がある情報系資格
・プロジェクトマネージャ
・ITストラテジスト
・システム監査技術者
・ITサービスマネージャ
・システムアーキテクト
・技術士
さっさとキーボードで入力試験にさせて！！！

# ペン型マウス
マウスの完全代替機能があります。
## 利用しているペン型マウス
これです。
https://direct.sanwa.co.jp/ItemPage/400-MAWBT202R

## 機能評価（★★★★★）

### 総合評価
マウスの代替操作で、
筋力を鍛え直すという目的は
達成できると思います。

### マウスの代替性
全然問題ないです。
マウスでできることは全部できます。

### 重量
問題ないです。
私は軽量と感じます。

### ボタン配置
個人的に～というところはありますが、
総合的には納得感あります。

### 利便性
素晴らしいです。
Blutooth以外に、
UCB無線にも対応していて、
なおかつ充電対応なので文句ないです。

## 体感評価

### 鍛えられるの！？
私は1日使うと、
普段使っていなかった腕の筋肉に
違和感が出たので、
使わないよりはマシと思っています。

## ガジェットとして
ガジェットとしては
とても良くできていると思います。


# ペン型マウスの関連記事
https://pc.watch.impress.co.jp/docs/column/yajiuma-mini-review/1604510.html
【Go言語】文字列とrune

# 文字列

Goの文字列はイミュータブルなデータ構造

* イミュータブルなバイト列へのポインタ
* そのバイト列内のバイトの総数

# rune

* 文字セット : 文字の集合。Unicodeの文字セットは $ 2^{21} $個ある
* エンコーディング : 文字のリストを2進数で翻訳したもの。UTF-8は全てのUnicode文字を可変なバイト数(1~4byte)でエンコーディングできるエンコーディング規格

code pointとは、unicodeで1つの値で表される項目を指す。「漢」は、U+6f22コードポイントで識別される。UTF-8では、「漢」は0xE6, 0xBC, 0xACの3バイトでエンコードされる。runeはUnicodeのコードポイントである。
Unicodeのコードポイントは21ビットで、コードポイントを保持するためのruneはint32のエイリアスとなる。

```go
type rune = int 32
```

以下は文字リテラル(文字列定数)を代入している。

```go
s := "hello"
```

Goでは、ソースコードはUTF-8でエンコードされる。文字列リテラルは全てUTF-8でバイト列にエンコードされる。しかし、文字列は任意のバイト列であり、UTF-8であるわけではない。文字リテラルで初期化されていない変数を操作する場合(ファイルシステムから読み込む等)、必ずしもUTF-8エンコーディングを使っているとは限らない。

:::note warn
[golang.org/x](https://pkg.go.dev/golang.org/x)は、標準ライブラリに対する拡張を提供するリポジトリで、UTF-16とUTF-32を扱うたのパッケージを含む
:::

1文字は常に1バイトにエンコードされるわけではない。

```go
s := "hello"
fmt.Println(len(s)) // 5
s := "漢"
fmt.Println(len(s)) // 3
```

"漢"という文字は、`0xE6,0xBC, 0xA2`という2バイトで構成される。

```go
func main() {
	s := string([]byte{0xE6, 0xBC, 0xA2})
	fmt.Println(s) // 漢
}
```

#

```go
func main() {
	s := "hêllo"
	for i := range s {
		fmt.Printf("position %d: %c\n", i, s[i])
	}
	fmt.Printf("len=%d\n", len(s))
}
```

これを実行すると、以下のようになる。

```txt:実行結果
position 0: h
position 1: Ã
position 3: l
position 4: l
position 5: o
len=6
```

特殊文字`ê`をUTF-8にエンコードすると、`c3 aa`となる。
また、`c3`は`Ã`となる。

この解決法としては、`range`を使用する。

```go
func main() {
	s := "hêllo"
	for i, r := range s {
		fmt.Printf("position %d: %c\n", i, r)
	}
}
```

実行すると、ちゃんと`hêllo`が出力される。

```txt:実行結果
position 0: h
position 1: ê
position 3: l
position 4: l
position 5: o
```

ただし、indexはやはり、2が飛ばされている。

もう一つの方法として、以下のように文字列をスライスにする方法がある。

```go
func main() {
	s := "hêllo"
	runes := []rune(s)
	for i, r := range runes {
		fmt.Printf("position %d: %c\n", i, r)
	}
}
```

これを実行すると、

```txt:実行結果
position 0: h
position 1: ê
position 2: l
position 3: l
position 4: o
```

ただし、この解決法は、実行時のオーバーヘッドが発生する。文字列をルーンのスライスに変換するには、追加のスライスを割り当て、バイトをルーンに変換しなければならなく、時間計算量は`O(n)`となる。なので、できる限り最初の解決法で行う方が良い。

indexでアクセスしたい場合は、以下のようにする。

```go
func main() {
	s := "hêllo"
	r := []rune(s)[4]
	fmt.Printf("%c\n", r) // o
}
```

# スライド

<script defer class="speakerdeck-embed" data-id="52b0d477d76f4bbc93c81c428a4afc80" data-ratio="1.7777777777777777" src="//speakerdeck.com/assets/embed.js"></script>

# 参考文献

1. [Japanese Version - 100 Go Mistakes and How to Avoid Them](https://100go.co/ja/)
（1冊ですべて身につく）カラーピッカーを作成する　背景色も同期させる

お疲れ様です。

これまで使っていたノートPC不具合のため、新しいPCへ移行作業などしておりましたら遅くなりました。

今日は前回の続きで、背景も選択された色になるようにコードを足しました。
![1301.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/674c2a71-ec28-f331-6077-27fbc5dba783.png)

![1302.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/3357bb2b-3288-fc26-ae62-b05602a7f4ca.png)

追加したのは **document.body.style.backgroundColor** の部分です。
body.style.cssプロパティ名 で、cssプロパティをJSから直接設定することができるようになります。
プロパティ名を記述する際、ハイフンは使えませんので、キャメルケースで記述する必要があります。

![1303.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/562c0975-3463-ee8d-950a-00cfeac6c1f1.png)
![1304.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/96b2ca19-804b-792e-3b9a-0a1a288682f4.png)
ここまでいかずとも完成でしたが、参考書にある通り進めますと、画像のように#fffが選択された場合に(white)と表示されるようif文を追加するというものです。(20行目)

if文を追加し、無事色の名前を表示できたところでカラーピッカーの作成は終了といたします。
#fffだけでなく、#000(黒)も表示させたい場合はさらに else if を追加すると黒が選ばれたときにも(black)と表示できるようになります。
<br>
これでカラーピッカーの作成は終了です。
自己都合のため数日に渡ってしまいましたが、まとまった時間がとれれば1日で確実に作成できる内容だと思いました。
また使用したコードも最近勉強していたDOM操作や、if文が主だったのでいい復習になりました。
明日からはイベント操作について勉強し、参考書にあるローディング画面なるものを作っていこうと思います。
【Ruby】「ブロック」と「プロック」

# はじめに

Ruby学習者へ

:::note warn
「**プ**ロック」と「**ブ**ロック」は別物です
:::
私は見間違えました。

# ブロック / Block

ブロックとは **「コードの塊」** です。
**「メソッドに渡す」** ために使用します。

:::note
`{ ... }`を使うケース
```rb
[1, 2, 3].each { |num| puts num }
```
:::

:::note
`do ... end`を使うケース
```rb
[1, 2, 3].each do |num|
  puts num
end
```
:::

# プロック / Proc

プロックとは **「ブロックをオブジェクト化したもの」** です。

:::note
```rb
my_proc = Proc.new { |num| puts num }
# または
my_proc = proc { |num| puts num }
```
:::

# 詳細

この記事は **「ブロック」と「プロック」を見間違えないように！** という記事です。

それぞれの詳細については、以下の記事が大変参考になります。

https://qiita.com/kidach1/items/15cfee9ec66804c3afd2

https://qiita.com/k-penguin-sato/items/7f98335ef631ea5ce7ad

# その他参考

https://docs.ruby-lang.org/ja/latest/class/Proc.html
【Ruby】`==` / `===` / `equal?` / `eql?` はけっこう別物

# はじめに

`==` / `===` / `equal?` / `eql?` は別物のようです。

# `==`：値が等しいかを返す

```rb
p "foo" == "foo" #=> true
p 4 == 4 #=> true
p 4 == 4.0 #=> true
```
# `===`：値を含むかを返す

厳密には誤った用法かもしれませんが、大枠は「含む」イメージで正しいと思います。

<details><summary>Rubyリファレンスマニュアル</summary>

:::note
以下のように説明されています。
>case 式で使用されるメソッドです。

>このメソッドは case 式での振る舞いを考慮して、各クラスの性質に合わせて再定義すべきです。

>デフォルトでは内部で Object#== を呼び出します。

[Object#===
](https://docs.ruby-lang.org/ja/latest/method/Object/i/=3d=3d=3d.html)

>Range#=== は主に case 式での比較に用いられます。

[Range#===](https://docs.ruby-lang.org/ja/latest/method/Range/i/=3d=3d=3d.html)

[Rubyで使われる記号の意味](https://docs.ruby-lang.org/ja/latest/doc/symref.html#:~:text=%E7%89%B9%E6%AE%8A%E3%81%AA%E7%AD%89%E5%8F%B7%E6%BC%94%E7%AE%97%E5%AD%90%E3%80%82Object%23%3D%3D%3D%E3%81%A7%E3%81%AE%E8%AA%AC%E6%98%8E%EF%BC%9A%E3%80%8C%E3%81%93%E3%81%AE%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%81%AF%20case%20%E6%96%87%E3%81%A7%E3%81%AE%E6%AF%94%E8%BC%83%E3%81%AB%E7%94%A8%E3%81%84%E3%82%89%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88%E3%81%AF%20Object%23%3D%3D%20%E3%81%A8%E5%90%8C%E3%81%98%E5%83%8D%E3%81%8D%E3%82%92%E3%81%97%E3%81%BE%E3%81%99%E3%81%8C%E3%80%81%20%E3%81%93%E3%81%AE%E6%8C%99%E5%8B%95%E3%81%AF%E3%82%B5%E3%83%96%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%A7%E6%89%80%E5%B1%9E%E6%80%A7%E3%81%AE%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%82%92%E5%AE%9F%E7%8F%BE%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E9%81%A9%E5%AE%9C%E5%86%8D%E5%AE%9A%E7%BE%A9%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%8D%E3%80%82%E3%81%9F%E3%81%A8%E3%81%88%E3%81%B0%E3%80%81Range%23%3D%3D%3D%20%E3%81%AFother%20%E3%81%8C%E7%AF%84%E5%9B%B2%E5%86%85%E3%81%AB%E5%90%AB%E3%81%BE%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E6%99%82%E3%81%AB%E7%9C%9F%E3%82%92%E8%BF%94%E3%81%97%E3%81%BE%E3%81%99%E3%80%82)
:::
</details>

```rb
# 左辺クラスのインスタンスであるかを返す
p String === "foo" #=> true

# 左辺範囲オブジェクトに含まれているかを返す
p (1..5) === 4 #=> true
p (1..5) === 4.0 #=> true

# == と同じ
p "foo" === "foo" #=> true
p 4 === 4 #=> true
p 4 === 4.0 #=> true
```

# `equal?`：`object_id`が一致するかを返す

<details><summary>Rubyリファレンスマニュアル</summary>

[Object#equal?](https://docs.ruby-lang.org/ja/latest/method/Object/i/equal=3f.html)
</details>


```rb
p "foo".equal?("foo") #=> false
p :foo.equal?(:foo) #=> true

p 4.equal?(4) #=> true
p 4.equal?(4.0) #=> false
```

# `eql?`

<details><summary>Rubyリファレンスマニュアル</summary>

[Object#eql?](https://docs.ruby-lang.org/ja/latest/method/Object/i/eql=3f.html)
</details>

```rb
p "foo".eql?("foo") #=> true
p :foo.eql?(:foo) #=> true

p 4.eql?(4) #=> true
p 4.0.eql?(4) #=> false
```
:::note
比較対象は`==`だと思います。
`==`：`1 == 1.0 => true`
`eql?`：`1.eql?(4.0) => false`

**`eql?`は、同値であっても型が違うと`false`を返します。**
:::

# 余談：JavaScriptとの違い

JavaScriptでは、`==` / `===` は以下の意味を持ちます。

- `==`：ゆるい等価性
- `===`：厳密な等価性

```js
console.log(1 == "1") //true
console.log(1 === "1") //false
```

そのため、基本的には`===`を使います。

# おわりに

Rubyは「別の名前だけど同じ挙動」というメソッドが多いです。
（`length`と`size`・`reduce`と`inject`など）

https://qiita.com/kohki_takatama/items/c8236b6a2e267e2dad20

今回は、それぞれが「似た名前だけど別の挙動」でしたね。

以上、等価性にまつわるメソッドについてでした。
コードモンスター大図鑑 プログラミングでゲットだぜ！

【PR】コドモンレポートキャンペーンです


みなさんこんばんは！
大変お久しぶりです

自分がプログラミング学習を始めてからずーーーっとお世話になっているpaiza様からプログラミング学習ゲームがリリースされたとのことで、そのレビュー投稿となります！！！


その名も
### コードモンスター大図鑑 プログラミングでゲットだぜ！
https://paiza.jp/code_monster?utm_source=user&utm_medium=blog&utm_campaign=general&utm_content=ppg

![スクリーンショット 2024-07-14 0.09.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1422262/8542dcd6-271f-59f2-9bf7-64d9d6fbdfe1.png)



一見普通のソシャゲなのですが
プログラミングの問題を解きながら、モンスターを集めていく
ありそうでなかったゲームです！  


### 早速プレイしていく！！

最初はDランク以下の超超超基本問題から開始されます

```
例題）
文字列　10を出力してください
```

ですので
- ここからプログラミングを学習したい方（もちろんお子様にも適していそう！）
- 経験者も**新しい言語にチャレンジしたい方**

みなさんで遊んで楽しめるゲームとなっております！

![スクリーンショット 2024-07-14 0.15.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1422262/c79925a6-c91d-1773-c4d2-a7ef3a24098e.png)

この様に、様々な言語から遊ぶことが可能になっております！



百聞は一見にしかず...ということで、実際の問題を解くシーンを見てみましょう

![スクリーンショット 2024-07-14 0.13.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1422262/7f82bc46-ce99-ff4c-52d0-729ac9b09931.png)

こんな感じで、paizaスキルチェックを受けている感覚です...いやはや懐かしい。

一つケチつけさせていただきますと
当方13インチのPCなのですが、**画面が少し小さい！！！**
まぁそれ以外は色々スムーズなので問題なさそうです

プレイ最初は基本問題だけなので若干退屈感はありますが、そこは仕方ないですね...



### ガチャ要素
ゲーム（スキルチェック練習問題）をクリアしたり
毎日ログインしたりすると報酬がもらえます。
また、今はキャンペーンでしょうか、ダイヤが1,000個くらいもらえます。

ガチャは1回10ダイヤで引けますので、これは大盤振る舞いですね

![スクリーンショット 2024-07-14 0.17.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1422262/144d7baa-c510-1c16-2a5c-fd9513a1cfcf.png)

ガチャを引くと...


![スクリーンショット 2024-07-14 0.18.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1422262/5a19d828-7f33-7f96-ee72-4e84c8c28944.png)

お、いい演出！！！！

![スクリーンショット 2024-07-14 0.21.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1422262/cdca9af9-6e07-ab7f-f6d1-ec27f73bc1b5.png)

SSRが当たりました！！
（正直まだ何がどう強いのかわからない...）


ゲームにはパーティを連れて行け、ゲーム中に様々は＋効果をもたらしてくれます

![スクリーンショット 2024-07-14 0.22.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1422262/827e06f1-488e-f6bb-716e-307165bdf549.png)

この方はスコアが8%UPするみたいですね。


### 総括
まだまだゲーム要素は分かりません...（paizaさんすみません）
ですが、従来のスキルチェックやプログラミング学習の難しさや障壁は下がるのでは無いでしょうか
まさにゲーム感覚でプログラミングが学習できるゲーム、今後が楽しみです！
久しぶりにスキルチェックやってみようかな...


それではPR投稿でした、ありがとうございました！！
【JDK】Eclipseを使わずにJavaファイルをターミナルでコンパイル・実行する

EclipseがあればJDKをインストールする必要はありませんが、勉強目的でEclipseを使わずにターミナルでJavaファイルをコンパイルしたりクラス（.class）ファイルを実行してみたのでメモに残します。

# 使用環境
PC：MacBook Air 2018
OS：macOS Sonoma 14.3.1
Shell：zsh
JDK：OpenJDK 22.0.1

# JDKとは？
JDKとは、Javaの実行環境（Javaランタイム）となるJDE（JVMとJava APIのセット）と、Javaファイルをクラスファイルにコンパイルするコンパイラやデバッガがセットになったソフトウェアパッケージです。

## MacでJDKをインストールする
MacでJDKがインストールされているかどうかは、ターミナルで以下のコマンドを入力します（PATHは/usr/bin/java）。
```
% java -version
```
JDKのバージョンが表示されなければ、インストールされていないということになります。
自分も未インストールだったため、以下の記事を参考に解凍、およびインストールしました。
https://tech.e3factory.com/programming/java/4287

## Javaファイルをターミナルでコンパイルする
Javaファイルをターミナルでコンパイルするには、Javaファイルが含まれたディレクトリ（Eclipseだとパッケージのフォルダ）を右クリックして「フォルダに新規ターミナル」からターミナルを開きます。

あとは、以下のコマンドを入力してコンパイルできます。
```
% javac Javaファイル名.java
```
（ディレクトリ内の全てのJavaファイルをコンパイルする場合は、```*.java```で指定します。）

## クラスファイルをターミナルで実行する
クラスファイルをターミナルで実行する場合は、クラスファイルが含まれたパッケージの親ディレクトリ（Eclipseだとbinディレクトリ）を右クリックして「フォルダに新規ターミナル」からターミナルを開きます。

あとは、以下のコマンドを入力して実行できます。
```
% java パッケージのフォルダ名/クラス名
```
うちのPC紹介：初代GPD WIN：Z8750君

うちにあるPCのスペックとかを紹介します。
この記事は、主に自分であとから見返す用のメモです。

# GPD WINの簡単な説明
Gemma2さんに説明してもらったのをベースに多少修正しています。
```Gemma2による説明
## GPD WIN について

GPD WINは、**中国のメーカーであるGPDが製造するハンディタイプのWindows搭載PCです**。
ゲームプレイに特化しており、そのコンパクトなサイズと強力な性能で注目を集めています。

主な特徴は以下の通りです:

**Windowsを搭載**:
フルfledgedのWindowsパソコンとして使用できます。
一般的なソフトウェアやゲームを動作させることができます。

**取り外し可能なコントローラー**: 
ゲームパッドが本体に内蔵されています。
PCとしてはキーボードとタッチスクリーン、
ゲーム機としてコントローラーを使うという柔軟性が魅力です。

**パワフルなCPU & GPU**:（バージョンによります）
最新のIntel Core i7やAMD Ryzenプロセッサ、
NVIDIA GeForce MXシリーズなどのGPUを搭載し、
高画質ゲームのプレイも可能にする強力な性能を備えています。

**小型・軽量**: （初代は350g程度です）
わずか約600g、手のひらに収まるサイズ感のため持ち運びが容易です。

**GPD WINの用途例:**
**モバイルゲーミング**:  外出先でも快適にゲームを楽しみたい方におすすめです。
**ビジネス旅行**: 必要なソフトウェアを持ち歩けるので、出張中の作業効率を向上させます。
**エンターテイメント**: 動画視聴や読書など、多様なコンテンツを楽しむことができます。
```

![71+GZ6+QkjL._AC_SX679_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154954/36f0f882-40bc-7bc7-7825-a824051d3d04.jpeg)

# 購入経緯
2016～2017年頃、
クラファン落ちのGPD WIN初代を購入しました。
一時期、
ちっちゃいPCに凝っていたので、
衝動買いしちゃいました。

# 利用感：大満足
## モバイル用途としては最強です。
持ち運び感覚は、任天堂のSWITCH持っていくのと変わりません。
購入後1～2年はゲーム用途としても活躍してくれました。
最近は外出時のブラウジング用途や
リモートデスクトップ用途で活躍してくれてます。
良くも悪くもWindows機なので、
Androidとは棲み分けができています。

## 小さい・軽い・使いやすいは正義！
・小さい
　・任天堂スイッチよりも小さく、任天堂DSよりも大きいです。
・軽い
　・350グラムくらいで軽いです。
・使いやすい
　・マウスいらない
　　・コントローラーパットで完全にマウスの代替ができます。
  ・キーボードいらない
  　・たくさん入力するのは辛いですが、
　　キーパッド入力でパスワードや短文なら入力可能です。


# 初代GPD WIN：Z8750君（ちょくちょく稼働中）
## 用途
### 外出時の持ち運び用PCとして（ずっと）
#### Windows機として
Windows10+intelという最強にベーシックな組み合わせなので、
遅いことは覚悟しながら、
・ブラウジング
・PPTプレゼン
・外付けディスプレイとマウスとキーボードを利用した軽い作業
向けには普通に役立ってくれます。
使うか使わないかわからないけれど、
外出や出張のじゃまにならないお供として
移動中なんかも利用しています。

#### モバイルバッテリーとして
こいつ、USBで外向けに給電可能なので、
モバイルバッテリーの代わりになるんですよ。
スマホ使いすぎて電池足りないけど、
こいつを使わないときはこいつから給電可能です。

### ごろ寝・ソファでのリモートデスクトップ機（最近）
最近は、家で、
・ソファやごろ寝でのブラウジング
・リモートデスクトップを利用しての軽い作業
用途で活躍してくれています。

### モバイルゲーム機として（購入～2020年頃まで）
購入後1～2年の間は、
Windowsベースのモバイルゲーム機としても役に立ってくれました。
特に、艦これ用の機器としてはベストでした。
今はゲームするのにはスペック足りないと思います。


# スペック
・GPD WIN（初代）
・CPU：CPU：Atom x7-Z8750（クラファンに出た小ロットZ8750バージョンです）
・グラフィックス：HD Graphics
・メモリ：PC3-12800 LPDDR3 SDRAM 4GB×1
・ストレージ：eMMC 64GB
・パネル：5.5インチIPS液晶（解像度1280×720ドット，グレア（光沢），マルチタッチ対応）
・OS：Windows10 Home
・モットー：小さい、軽い、使いやすい

# 今後の使い方
今後は、
スペック的にもOS的にも
使い続けること難しくなっていくと思うんですが、
ごろ寝PC用途でなんかフィットするんですよね。
とりあえず、
・ごろ寝ブラウジング
・ごろ寝リモートデスクトップ
としては使い続けて、
Windows10サポートなくなった次点で
Linuxでも入れて遊ぼうと思っています。


# その他
## 公式ページ（販売会社）
・探し中
## 公開記事
### ベンチマーク
リクエストがあれば考えます。
けど、新しいバージョンが出てるので、
そっちの情報のほうが有益でしょ？

## 関連記事
徳岡正肇の これをやるしかない！：
夢のゲーマー向け超小型PC「GPD WIN」で，いったい何ができるのか
（ https://www.4gamer.net/games/085/G008544/20161222111/ ）
【Flutter/Dart】リストから先頭のみランダムで入れ替える

## 本記事で紹介すること
リストから先頭のみランダムで表示したいのようなケースにおいて、リストの先頭のみランダムで入れ替える方法

## 実際のソースコード

```dart:
import 'dart:math';

void main() {
  var numbers = <int>[1, 2, 3, 4, 5];
  final random = Random().nextInt(numbers.length);
  numbers = [numbers[random], ...numbers];
  numbers.removeAt(random+1);
  print(numbers); 
}
```

## 実行結果
dartpadでの実行結果の例が以下になります。
[1,2,3,4,5]と整列されたリストからランダムに要素を1つ選んで入れ替えています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261934/625f40f3-983f-eff6-bb9d-5ae86a1ac0bd.png)
転職した際に"大事だ"と感じた➂つのこと。～友達が立て続けに転職したので書いてみる～

# 概要
生成AIが登場し業務内容の高度化が求められる一方、昇給の低迷、雇用の流動化等を感じられる出来事がある度に、同じ会社にずっと勤めると言う考えは終わったんだなぁと実感させられる。

当方が就職活動をしていた時はまさに、リーマンショック勃発時だった為、内定を頂くことが大変困難で、色々な業界にエントリーシートを送り、ご縁があってIT業界に拾っていただいた。
だから、骨を埋める覚悟でIT業界の門を叩いたものです。

ですが、そんな当方の覚悟も昔ながらの企業スタイルの壁や、キャリアアップ・向上心と言う餓えの前では儚いもので、もう既に何回か転職しております笑笑。

今回はその経験を基に、IT業界で就職・転職した際に感じた３つの大事なことを記載していこうと思います。

①、転職しないとさほど給料は上がらない。
②、大事なのは学歴やITスキルじゃない！大事なのは経歴！！
③、前職の年収の重要性

# ①、転職しないとさほど給料は上がらない。
私が社会人となった当初、平均月給20万円+賞与1~2ヶ月が普通の中小IT企業の年収だったと思います。
ざっと計算すると(12×20万円=240万円)+(20万円×2ヶ月=40)=280~300万円が新入社員の年収だったのではないでしょうか？
(私が今所属する会社の新卒の給与は大体月25万円前後だそうなので、かなり羨ましいですが、そんな恵まれた会社に受かる人なんて、東大や早慶という学校名ブランド持つ強者か、ITを学生時代から注力してきた変態さん達です。今回の記事では、普通の方を対象に記載します。)

話が脱線しましたが、では、何故給料が上がらないと言いえるのか？

私は三回の転職をし、300～400万円➡️400万円～450万円➡️450万円～520万円➡️550万円～650万円と15年かけて年収を上げて来ました。
一番最初の会社に今もなお在籍している友達に年収を聞くと、450～500万円位だと聞きますし、今いる会社のパートナー会社の方にひょんな事から年収の話になった時、500～550万円位だと仰ってました。
こちらのパートナーさんは、有名国立大学を出られ、大手IT企業に就職された方です。
それでも、転職をして年収を上げた転職者には劣ってしまうです！！
(ちなみに彼はその後転職し、年収を1.5倍にしております。)

さて、ざっと転職の方が給料を上げやすいと言う事に触れてきましたが、では何故同じ会社に居ると給料が上がらないのでしょうか？

理由は簡単です。
同じ様な仕事をしている方に、会社からしたら生産性や売上が上がらないのに、ある日突然給料をアップしますとはならないからです。

考えてみてください。
昨日まで100円で売っていたお菓子が、原料の値上がりの為150円に値上げしますと言われたら、『ちょっと待て』となりますよね？？
それと同じです。
人は同じ結果を得るられるものに対し、対価が上昇したら違和感を感じるものです。

ですので、更に高度な仕事をするようになるキャリアアップ(昇格)や、転職でないと昇給は望めないと考えます。
キャリアアップの為昇格を狙おうと考えるかもしれませんが、少子化と叫ばれる現在です。
昔に比べて子供が減ったのかもしれませんが、一方で上の世代は沢山居るんです。
昇格は玉突き事故中です。
ほとんど機能なんてしていないでしょう。。。

よって、自分の頑張りで昇給を狙うのであれば、転職一択です。


# ②、大事なのは学歴やITスキルじゃない！大事なのは経歴！！
上記で転職の大事さを書きましたが、次は経歴について考えていきます。

世の中には第二新卒と呼ばれる、新卒で入った会社が合わなかったとか、思ってたのと違うとかで、3年経たない内に早々に辞めて、もう一度心機一転転職活動を行う、『キャバクラで言うチェンジみたいな制度』がありますが、新卒の就職活動と第二新卒の就職は学歴を重視されるため、対象外とさせていただきます。


さて、何故学歴より経歴が大事なのでしょうか？
要は採用側は「この子はうちの会社で活躍できるであろうか？」を知りたいのです！
学生の就職活動であれば、職務経歴が無い以上職務経歴書も書けません。だから、ある程度学生間で差を付けられる学歴を重視する会社さんも少なくないです。

ですが、数年以上働いている社会人であれば職務経歴がありますので、前職ではどういう活躍をしていた方なのかをイメージしやすいってことで職務経歴書です。


では、どういう所を見られるのでしょうか？
IT業界はなかなか業種を一括りに出来ず、
テスター・プログラマー・システムエンジニア・システムインテグレータの大きく４つの業種に分けられると思います。
それぞれに職務経歴書を見る観点があるかと思いますが、基本的にはプログラマー・システムエンジニアはプログラムを書く機会や設計を行う機会が多いので、何の言語でプログラムを書いたかの経験や使っていたフレームワーク、ミドルウェアなどの経験などを見られる傾向にありますが、システムインテグレータとなるとプログラムの経験よりも、マネージメント経験やプロジェクト全体の規模、業種（特に金融業界は多い）などを見られる傾向にあります。

自分の狙う企業がどの業種か分析し、分かりやすく伝わりやすい職務経歴書を記載しましょう！！


# アナウンスメント
ということで、次は「③、前職の年収の重要性」と行きたいところですが、「③、前職の年収の重要性」も記載すると、記事が長くなり手軽に読めなくなりますので、次回に回したいと思います。

最後までお読みいただきありがとうございました。
また次回お会いしましょう！！
【Shell】grepの結果にファイル名と行番号を表示する方法

## ファイル名を表示する

ファイル名を表示するには`-H`オプションを使用します。

```terminal
$ cat sample.txt
1 aaa
2 bbb
3 ccc
4 ddd
5 eee
6 fff

$ grep -H aaa sample.txt
test.txt:aaa

```

## 行番号を表示する

行番頭を表示するには`-n`オプションを使用します。

```terminal
$ cat sample.txt
1 aaa
2 bbb
3 ccc
4 ddd
5 eee
6 fff

$ grep -n ccc sample.txt
3 ccc

```
テストマネジメントとプロジェクトのコンテキストの関連

# この記事が答える問い
テストマネージャは何を考慮してマネジメントをすればよいのか？

# テストマネジメントを最適化するために考慮すること
- テストマネージャは、テストのプロセスを最適化する必要がある。すなわち、どんなプロセスでもテキトーに進めていれば上手くいくわけではない。
- では、良いプロセスとは何か。1つはコンテキストに適合するプロセスである。コンテキストに適合するとは、ステークホルダのニーズと適合し、彼・彼女らの活動と歯車が噛み合っていて、成果物の要件を満たしている、などである。つまり、コンテキストの要素1つ1つが制約としてプロセスに作用するということであると考えられる。

テストプロセスとプロジェクトのコンテキストの関連のイメージは以下の図。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081780/8264cec2-9ffb-e9fb-c52e-0566a0ba2fc8.png)
					

## コンテキスト内の要素	
### テストにかかわるステークホルダ	
- ステークホルダは以下の図を参照。ただし、これらは網羅的ではない。				
- これらのステークホルダのニーズに応える方法、ステークホルダとテストとの関係の本質について把握すべき。					
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081780/b4ef1c23-d518-5d69-77fa-ef1e7a1f0db7.png)
			
### テストに影響しあうタスク	
- テストに影響を与えたり、テストから影響を受けるタスク、成果物を認識しておく必要がある。それらは以下の図を参照。	
- それに整合するようにプロセスを作ることで、プロセスの効果と効率を高められる。	
- テストマネージャーは動的な要素を認識し、テストに影響する変更があればすぐに察知する必要がある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081780/104742d1-688c-a5c6-737c-1ed3289e25ec.png)


## 非機能テストのマネジメント
- 非機能テストの種類は多様にある。だが、リスクと制約に基づいて絞って選択する必要がある。	
- 選択時は、テストマネージャにすべての考慮事項を考慮するだけの専門知識がない場合がある。その場合、選択の仕事をテクニカルテストアナリストに委任する必要がある。				
- 非機能テストの優先順位を考慮するべき。**機能テストが全て完了するのを待って非機能テストを行うのは大抵良くない**。というのも、重要な非機能的欠陥の発見が遅れる可能性があるためである。それゆえ、非機能テストも機能テストと同様に、リスクに応じて優先順位をつけ、順番を決める必要がある。			
テストの早期や開発中に、非機能面の品質の問題による影響を抑える方法も検討すべきである。例えば、システム設計時にプロトタイプを作り、ユーザービリティをレビューする。そうすることで、システムテストの最後に発見したら大きな手戻りが発生した可能性のある欠陥を早期に発見できる。				

## 経験ベースのテストのマネジメント
- 経験ベースのテストのメリットは、他のテスト技法では炙り出しきれなかったバグを発見できること。一方、デメリットもある。デメリットは、結果記録が難しいことと、再現性が低いことだ。					
- マネジメント方法は2つある。
    - 1.**テストセッションという30~120分のタイムボックスを設ける**。
        - テスト作業を分割し、そのタイムボックスに割り当てる。そうすることで、作業量を制限し、さらにある程度の進捗管理とスケジュール作成が可能となる。
        - テストセッションでは、**テストチャータ**を参照する。テストチャータとは、テストセッションでの目的を大まかに定義したもの。具体的には、テストのスコープ、テスト観点と制限時間、大まかなシナリオ、テストツール、レポート用の項目を含む。ただし、テスト観点の粒度は細かすぎてはいけない。経験ベースのテストでは、テストでやるべきことを指定するよりも、テスターがアイデアを発散できるようにすることが重要。テスターが経験や独自のビジネスの知識をもとに、バグが潜んでいそうな条件や操作を自由に決めうちち、テストを実施できるように条件を整える必要があるためだ。さらに、テスト結果として記載する情報の例を挙げる。テスト時に行った操作を1文で記載する。その後、観察した事象とその操作の具体的なステップを記載する。	
    - 2.**従来のテストセッションに自律的かつ自発的なテストをできるよう、テストに余分な時間と権限を与える**。ここで今後テストすべき領域が新しく発見されたら、テストケースを追加したり、変更したりする。			

# 参考資料
テストチャーター

https://montecampo.co.jp/5355.html/	

https://www.qualitestgroup.com/insights/technical-hub/how-to-write-an-exploratory-test-charter/	

テスト技術者資格制度　Advanced Level シラバス日本語版　テストマネージャ　Version 2012.J04

https://jstqb.jp/dl/JSTQB-Syllabus.Advanced_TM_Version2012.J04.pdf
plotly で円グラフを描く

次のようなリストを円グラフで表したい。
|バンド|秒数|
|:-:|:-:|
|2GHz|30|
|1.5GHz|40|
|1.7GHz|50|
|700MHz|10|
|800MHz|20|
```python
# ラベル
labels = ['2GHz','1.5GHz','1.7GHz','700MHz','800MHz']
# ラベルに対応する値
values = [30,40,50,10,20]

fig = go.Figure()
trace = go.Pie(labels= labels, values= values, textinfo= 'percent+label')
fig.add_trace(trace)
fig.update_layout(width=500, height=500)

fig.show()
```
大きい順に反時計回りに並べ替えられて描画される。

![newplot(20).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143934/397e091e-c7f4-4e9f-1f4f-79cc335c4048.png)

色を変えてみる。
```python
#色
colors = ['red','blue','yellow','orange','green']
trace = go.Pie(labels= labels, values= values,marker_colors=colors, textinfo= 'percent+label')
```
![newplot(25).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143934/a90e032a-34ca-3baa-44e8-b8c71ed85346.png)

表示順は sort, direction, rotation を使用して次のように変更可能。

```python
labels = ['2GHz','1.5GHz','1.7GHz','700MHz','800MHz']
values = [30,40,50,10,20]

fig = make_subplots(
    rows=2, cols=2,
    specs=[[{"type": "pie"}, {"type": "pie"}],
           [{"type": "pie"}, {"type": "pie"}]],
)
trace = go.Pie(labels= labels, values= values, textinfo= 'percent+label')

#同じ円グラフを4箇所に追加する。
fig.add_traces([trace,trace, trace, trace],cols=[1,2,1,2,], rows=[1,1,2,2])
fig.update_layout(width=800, height=800)

#update_traces() を用いて後から変更する。

#左上のグラフはデフォルトのまま
#sort=True, direction='counterclockwise', rotation=0
fig.update_traces(col=1,row=1, title='デフォルト')

#右上のグラフをソート無し、時計回りで表示する
fig.update_traces(col=2,row=1, sort=False, direction='clockwise', title='ソート無、時計回り')

#左下のグラフをソート無し、時計回り、90度回転で表示する
fig.update_traces(col=1,row=2, sort=False, direction='clockwise', rotation=90, title='ソート無、時計回り、90度')

#右下のグラフをソート有り、反時計回り、90度回転で表示する
fig.update_traces(col=2,row=2, sort=True, direction='counterclockwise', rotation=90, title='ソート有、反時計回り、90度')

fig.show()
```
![newplot(24).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143934/4c30b213-03dd-c6b2-41c2-7fc27d2002e9.png)

rotation の動作に少しクセがある。[ドキュメント](https://plotly.com/python/reference/pie/)には、
>Instead of the first slice starting at 12 o'clock, rotate to some other angle.
>(最初のスライスを 12 時から開始するかわりに、他の角度に回転させる)

とある。デフォルトの反時計回り(direction='counterclockwise') の時は1番目と2番目のパイをスライスする角度になっているが、時計回り(direction='clockwise')の時は1番目のパイの始まりの角度になっている。
【Qiita Engineer Festa 2024】投稿マラソン振り返り

# きっかけ
- アウトプットする癖を少しでも身につけたかった
- ハーフマラソン賞が欲しかった

# やってみて
- 些細なことでも記事にする習慣が少し身についた
- 投稿するごとにバッチをもらえるのがモチベになった


# おわりに
今年はもうQiita投稿しない気がする笑
ハーフマラソン賞の景品が楽しみ！
microCMSとSlackを連携させる

# はじめに
今回はmicroCMSが投稿されたらSlackに連携する方法をご紹介しようと思います！


# Slack Webhookの設定
1.下記にアクセス
https://mnkw.slack.com/apps/new/A0F7XDUAZ--incoming-webhook-

2.通知したいチャンネルを選択して「インテグレーションの追加」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523103/f7332a6a-fde9-5e4c-d0c4-ff952bc01835.png)

3.表示されるWebhook URLを控えておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523103/6a63c49c-08ae-a0af-e379-ce439ea800b6.png)


# microCMSの設定
1.右上の「API設定」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523103/9ef3933b-270d-2387-15f4-870f2e270b34.png)


2.「Webhook」→「Slack」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523103/2819a3b1-7863-5b14-6f26-17d68cbb9b5a.png)

3.先ほど発行したURLを入力して「設定する」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523103/d261b3a1-2406-f47f-ddbc-5ab9fa25dd06.png)


4.コンテンツを投稿等するとSlackに通知される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523103/b3daaae8-e6e4-aa21-4b24-4bbb5034cd12.png)

# おわりに
いかがだったでしょうか。
Slack Webhookは気軽に連携できるのでおすすめです！
Proxmox VE上のWindows 10ゲストにSPICEを使用してオーディオデバイスを追加し、音楽を再生する方法

Proxmox VE上でWindows 10ゲストを動作させている場合、SPICEを使用してオーディオデバイスを追加し、音楽を再生するための手順を紹介します。

### 手順概要
1. Proxmox VEでSPICEを設定する
2. Windows 10ゲストにSPICEドライバをインストールする
3. オーディオ出力を確認する

### 1. Proxmox VEの設定

#### 1.1 Proxmox VEのWebインターフェースにログイン
まず、Proxmox VEのWebインターフェースにログインします。Webブラウザを開き、Proxmox VEの管理IPアドレスにアクセスしてください。

#### 1.2 Windows 10ゲストの選択
サイドバーから該当するWindows 10ゲストを選択し、「ハードウェア」タブを開きます。

#### 1.3 ディスプレイとグラフィックの設定変更
「ディスプレイ」を選択し、「グラフィックカード」で「SPICE」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789581/f5ab8f01-fd56-b774-f2d0-115b10cec52d.png)

#### 1.4 オーディオデバイスの追加
「追加」ボタンをクリックし、「音声デバイス」を選択します。「音声デバイス」を「intel-hda」に設定し、保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789581/6619a12f-9fa4-a7e9-ec5d-814e37f1a322.png)

:::note warn
「音声デバイス」を「ich9-intel-hda」に設定すると、キーボードやマウスが反応しない問題が発生しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789581/bbfab2d4-7493-a2e1-611b-ec546072e991.png)
:::

#### 1.5 Windows 10ゲストの起動
オーディオデバイスの追加とSPICE設定の変更が完了したら、Windows 10ゲストを起動します。

### 2. Windows 10ゲストの設定

#### 2.1 SPICE Guest Toolsのインストール
Windows 10が起動したら、SPICE Guest Toolsをインストールします。以下のリンクからSPICE Guest Toolsをダウンロードできます。

[SPICE Guest Tools ダウンロード](https://www.spice-space.org/download.html)

#### 2.2 ドライバの確認
SPICE Guest Toolsのインストール後、デバイスマネージャを開きます。スタートメニューを右クリックし、「デバイスマネージャ」を選択します。「サウンド、ビデオ、およびゲームコントローラー」セクションにオーディオデバイスが表示されていることを確認します。表示されていない場合、ドライバーが正しくインストールされていない可能性があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789581/688a7dbf-c3ef-5aa0-0c47-21dcdf33d674.png)

:::note warn
ゲストOSの「プロセッサ」の「種別」が「x86-64-v2-AES」になっていると、「デバイスマネージャ」が固まり表示されませんでした。「host」であれば問題なく表示できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789581/a13929c2-ebdc-4783-9a5b-f2dfeb007285.png)
:::

### 3. オーディオ出力の確認
Youtubeにアクセスして、動画で音声が出力されることを確認します。
AppStore での緊急対応方法について

ネイティブアプリの開発があまり好かれない理由の中に、リリース時の審査があると思います。
丹精込めて作ったアプリをいざリリースしようとしたら審査に1日2日、長ければ1週間近く待たされリジェクト・・・なんてことはよくあると思います。
それが致命的なバグで、すぐにリリースしないといけない場合は阿鼻叫喚でしょう。

この記事では、App Store でリリースしたアプリに致命的なバグが発生した際に、迅速に対応してもらうための手順について詳しく解説します。

# 申請方法
## バグを修正し、申請をする
まず治さなければ話が始まりません。原因の追求、hotfix ブランチを切って修正し、アプリをリリースする申請を行なってください。
この時、
- アプリバージョン
- ビルドバージョン
を変更することを忘れないでください。

アプリ開発が初めてで「え？バージョンはどうあげればいいの？」と思っている方は以下の記事がとてもわかりやすく解説しているのでご参考ください。多くのアプリだとパッチバージョン、つまり、"1.0.0" をリリースしていれば「1.0.1」とすれば問題ありません。
ビルドバージョンは、開発者向けの番号なので1つ上げるだけで問題ありません。

https://dev.classmethod.jp/articles/versoning-with-pictures/

## App Review Team に連絡する
アプリの申請をしたら、App Developer の "Contact the App Review Team" へアクセスします。このページでは、緊急対応が必要な場合に　App Review Team へ連絡するためのオプションが提供されています。
これ以外にも、[リジェクトされたアプリに対する異議申し立て](https://developer.apple.com/contact/request/app-review/appeal/)も行えます。

https://developer.apple.com/contact/app-store/?topic=expedite

![スクリーンショット 2024-07-13 23.50.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/707293/9c944bf0-0ae9-7cb6-dc9b-e074a4eab8f4.png)


## 迅速な申請を選択する
ページ内で「迅速なアプリレビューを申請(request an expedited app review)」を選択します。
このオプションでは、特定の状況でアプリのレビューをするために利用できます。

# アプリケーションの選択と申請
「迅速なアプリレビューを申請(request an expedited app review)」をせたくしたら、ページをスクロールし、レビューを希望するアプリケーションを選択します。次に、必要な情報を入力して申請を完了させます。

# 申請後
ここまで説明しましたが、この申請によって「すぐにリリースできる」とは限りません。
Appleの説明では、約9割の確率で24時間以内にレビューされ、リリースするかの判断が下されます。

# どのくらい早いの？
先日(2024年7月8日)、この方法でアプリをリリースしました。
その際、申請した際の時刻は7月8日13時28分に **Waiting for Review** となり、
同日14時10分に **In Review**、同日14時22分に**Approve** となりました。
この時は、アプリ遷移時にクラッシュはするものの、軽微な修正で済んだので、1時間足らずでApprove となった可能性があります。

# 余談：イベントアプリの場合
公式ドキュメントでは、イベント関連のアプリの場合、アプリリリースを計画し、スケジュールすることを推奨しています。つまり、この対応はやむを得ない事情がある場合にのみ申請するものであり、**早くリリースしたいからという身勝手な理由で行われるものではない**とされています。
ただし、アプリがまだ審査中で、イベントの開始が間近に迫っている場合は、アプリの審査の迅速化をリクエストできます。リクエストには、イベント名、イベントの日付、イベントとアプリの関連付けを必ず明記して申請を行なってみてください。

# 最後に
まとめると、App Storeでバグが発生し、緊急対応が必要な場合には、AppleのApp Review Teamに迅速な申請を行うことが最も効果的です。この手順を踏むことで、アプリのレビューとリリースを迅速に進めることができ、ユーザーへの影響を最小限に抑えることができます。

緊急対応が必要な場合は、ぜひこの記事を参考にしてみてください。

# 参考文献

https://developer.apple.com/distribute/app-review/#expedited
変数と関数

## はじめに
変数と関数を説明しようと思ったときに上手く説明できず、混同してしまっていることに気づきました。
なので、改めてまとめてみようと思います。

## 変数と関数の違い

### 変数とは
* <b>データや値（文字列や数値）</b>を入れる
* 名前を付けることで何度も呼び出せるようにする

例えば、
100 × 1.08
200 × 1.08
300 × 1.08
400 × 1.08
500 × 1.08

みたいな計算式で、「1.08」の部分を一括で変えたいと思ったときに「1.08」の部分に「tax」と名前を付けておくと、

100 × tax
200 × tax
300 × tax
400 × tax
500 × tax
となります。

この「tax」を別の場所で「tax = 1.08」と設定しておくことができます。
さらに、「tax」を「1.10」へ変更したくなったときには「tax = 1.10」とすることで、全ての計算式を書き換えなくても<b>一括で変更</b>することもできます。

また、変数は数値だけでなく文字列などもあり、Stringやintなどのデータ型と呼ばれる種類があるのも特徴です。


### 関数とは
* <b>処理の塊（計算式とか）</b>を入れる
* 名前を付けることで何度も呼び出せるようにする

変数と同じように、名前を付けて呼び出すという点で似ていますが、処理の塊を入れる関数は使い方に特徴があります。

## 関数の便利なところ
関数が本領を発揮するのは、<b>引数</b>を渡して使用する時です。
例えば、「300 × 1.08」を税込の金額を表示するための関数として設定することにします。
ですが、「300 × 1.08」のままだと常に同じ計算結果になっていまい、使い勝手が悪そうです。

ここで重要になってくるのが引数です。
この場合、関数の中で「300」を「value」としておいて、「value × 1.08」という計算式を用意しておきます。

この計算式を利用したいときに、「value」には「300」を入れる、という情報を一緒に渡すことで、「300 × 1.08」の計算が可能になるということです。

「value × 1.08」に<b>tax_calculationという名前</b>を付けると、
tax_calculation(100) = 100 × 1.08
tax_calculation(200) = 200 × 1.08
tax_calculation(300) = 300 × 1.08
tax_calculation(400) = 400 × 1.08
tax_calculation(500) = 500 × 1.08
このように、<b>tax_calculation(value)</b>で消費税の計算が実行できるようになる、というイメージです。

今回の場合は消費税という簡単な計算でしたが、プログラミングにおいて複雑な処理を行う際に、コードの読みやすさやメンテナンスのしやすさに関わってきます。

また、関数は自分で作成した処理に名前を付けて使用することもできますが、プログラム言語に元から用意されている<b>関数（メソッド）</b>も存在しています。


## Javaのメソッドの使用例
Javaのコードを確認しながらメソッドの使い方を見てみましょう。

本題とズレるので細かい説明は省きますが、以下のコードでは<b>「num」変数</b>の中に入れた<b>「15, 9, 13, 16, 8, 10, 5, 11, 4, 6」</b>を<b>昇順に「並び替え」</b>しています。

隣り合った数値の大きさを比較しながら、小さい方が先、大きい方を後に並べます。
```diff_java
package ex;

public class ex_14 {

	public static void main(String[] args) {
		//ランダムに数字が格納された配列の中から2番目に小さな数字を表示する
		//数字を入れ替える
		int[] num = {15, 9, 13, 16, 8, 10, 5, 11, 4, 6};
		
+		for(int i = 0; i < num.length; i++) {
+			for(int j = i + 1; j < num.length; j++) {
+				int compare = 0;
+				if(num[i] > num[j]) {
+					compare = num[i];
+					num[i] = num[j];
+					num[j] = compare;
+				}
+			}
+		}
		
		for(int i = 0; i < num.length; i++) {
			System.out.println(num[i]);
		}

	}

}
```
これを実行することでnumの中身は 「4, 5, 6, 8, 9, 10, 11, 13, 15, 16」となります。

こちらは比較しながらの処理が記述されていますが、Javaには並び替えのための関数（メソッド）も存在しています。

関数を使用した方法がこちら。

```diff_java
import java.util.Arrays;

public class ex_14a {

	public static void main(String[] args) {
		//ランダムに数字が格納された配列の中から2番目に小さな数字を表示する
		//数字を入れ替える
		int[] num = {15, 9, 13, 16, 8, 10, 5, 11, 4, 6};
		
+		Arrays.sort(num);
		for(int i = 0; i < num.length; i++) {
			System.out.println(num[i]);
		}

	}

}

```
先ほどよりコードがシンプルになっていることが分かります。
関数のsortに引数のnumを渡すことで並び替えが可能になりました。

なんと10行使って記述していた内容が1行で完了しています。

しかも、長い処理を書いていた最初の記述ではパッと見でどんな処理化を判断しづらいですが、メソッドを使用したコードではsortという名前から並び替えかな？と単語から推測することが出来ます。

これがコードの可読性やメンテナンスのしやすさにつながるというわけです。


## おわりに
なんとなくで認識していたけれど、文章にすることでより単語の意味が明確になりました。

余談ですが、調べながらコードを書いていると気づかないうちにメソッドを使用していて、指摘されてからそうかこれはメソッドなのか…と思ったことがありました。

メソッドを使用すると便利なのですが、きちんと中でどのような処理が実行されているのかを知って自分で書けるようになるためにも、まずはメソッドを使わずにコードを書く練習が必要だなと感じています。
エンジニアのキャリアって何？美味しいの？

エンジニアのキャリアと言われてどんな道が見えますでしょうか？

自分が死ぬまでの間のエンジニアのキャリアがはっきりしている人はなかなかいないと思います。



## エンジニアのキャリアは未知の世界

技術革新によって、新しいエンジニアが生まれる。
例えば、AIエンジニアやクラウドエンジニアという職業は最近できましたし、COBOLエンジニアは近年はPythonエンジニアにその座を譲っています。


それはそのはずQiitaのメインターゲットであるITエンジニアという職業が主流になったのはここ30年から40年くらいです。
また、昔はwindows95が1995年なので、そのあたりでパソコンというのが消費者に認知されてきたぐらいです。

何が言いたいとエンジニアのキャリアはその時代で変わってくるということです。エンジニアのキャリアは未知であるということです。


## キャリアを作る必要はあるのか
そう考えると、キャリアを作る必要はあるのかという疑問が湧いてきます。
結論としては、作っておいて損は無いですが、あまりこだわりすぎなくていいと思います。
こだわりすぎるとキャリアの修正が効かなくなって、後戻りできなくなってしまうからです。

### エンジニアのキャリア
| キャリア名 | キャリア内容 |
| ---- | ---- |
フロントエンドエンジニア	|ユーザーが直接触れるインターフェースの開発を担当します。基本的にはホームページなどのデザインやコーディング、ディレクションなどを実施します。HTML、CSS、JavaScriptなどの技術を使用します。
バックエンドエンジニア	|サーバーサイドやネットワークの構築を担当します。サーバやデータベースネットワークの構築、管理やバックエンド側のアプリ、APIの開発などを行います。Python、Java、Rubyなどの言語を使用します。
フルスタックエンジニア	|フロントエンドとバックエンドの両方の開発を担当します。Vmwareなどの仮想環境やクラウドの上でバックエンドの構築が可能となったため対応が可能となってきました。広範な技術スキルが必要です。
データサイエンティスト	|データの収集、分析、解釈を行い、ビジネスの意思決定に貢献します。Python、R、SQLなどの言語と、統計学や機械学習の知識が必要です。AIなどの学習なども実施したりします。
データエンジニア	|大量のデータを管理し、データパイプラインを構築します。OracleやSQLなどのデータベースの知識と、Python、Java、Scalaなどの言語を使用します。
DevOpsエンジニア	|開発と運用の間の連携をする役割を果たします。DevOpsツールや自動化ツールを使用して、ソフトウェアのリリースと運用を効率化します。
セキュリティエンジニア	|システムのセキュリティを確保します。ウィルス検知や侵入検知システムの構築、管理やセキュリティポリシーの整理やセキュリティの評価などを行います。

## 時代にあったスキルを身につけるべきか
では、未知の時代だから時代にあったスキルを身につけるべきかというと、身につけておいた方が良いけど、あまり深入りしすぎない方がいいと思います。
一つのスキルをある程度できるようになって、つまみ食いしながらぐらいの感覚でいいかなと思います。

つまみ食いをしていくにつれて段々広く深く身についていくと思います。

## エンジニアのスキル
とはいえエンジニアのスキルにどんなものがあるのかわからないとスキルの身につけようがないのでまとめてみました。

### エンジニアのコアスキル

| スキル名 | スキル内容 |
| ---- | ---- |
|プログラミング |	一つ以上のプログラミング言語（例：Python、Java、C++など）を使ってソフトウェアをプログラミングする能力 |
| データベース管理 | SQLなどのデータベース言語を使ってデータの保存、取得、更新、削除を行いデータベースを構築する能力 |
|バージョン管理 |Gitなどのバージョン管理システムを使ってコードの変更履歴を管理する能力
|テスト設計	|ユニット（単体）テスト、統合テスト、システム（総合）テストなどを設計し、ソフトウェアの品質を確保する能力 |
デバッグ対応|	ソフトウェアのエラーを特定し、修正する能力
問題解決|	複雑な問題を解決するための論理的思考と分析、解決のための実行能力
コミュニケーション|	チームメンバーやステークホルダーと効果的にコミュニケーションを取る能力
プロジェクト管理|	プロジェクトのスケジュール管理、タスク管理、リソース管理、リスク管理などを行う能力
ドキュメント作成能力　| 要件定義書、基本設計書、詳細設計書、手順書、マニュアルなどのドキュメントを作成する能力

## 一旦最後に
エンジニアのキャリアについて考えてみました。普段考えないので言語化することで自分の中で整理できてよかったです。

将来に不安があるのは、自分のキャリアをどう歩めばいいのか見えないことが一番の理由だと思います。エンジニアという未知の職業の中少しでも前を照らすことができたら嬉しいです。
画像認識タスクの機械学習における色空間 RGB vs HSV(色相/彩度/明度) の差について

画像認識を機械学習で実行する機会がありました。
以前から気になっていたのが、RGBというコンピューターに都合の良い色の形式と、より直感的なHSV（色相・彩度・明度）で、認識精度に差が出るのでは？という疑問を持っていたのです。
HSV以外にも、Labや、XYZなど、色を数値化する方法はいろいろありますが、とりあえず、RGBとHSVで差が出るのか？という点について検証してみました。

## HSVとは
これを読んでいる方は、RGBが何たるかはご理解いただいている想定です。
HSVは、だいたいこんなイメージで、RGBの時の「RとGを足すと黄色に...」のようなややこしいことを考えないで済む便利さがあります。
- 色相：　赤～緑～青～　を環状につなげたどの色に属するか
- 彩度：　色の鮮やかさ　言い換えるとその色の白っぽさ（例：赤⇒ピンク⇒白）
- 明度：　明るさ　　　　明るさを下げていくと、暗くなって黒になる

もっと詳しい説明は Wiki 等をご覧ください。

https://ja.wikipedia.org/wiki/HSV%E8%89%B2%E7%A9%BA%E9%96%93

## とりあえず試してみた

```
img = Image.open(os.path.join(path, filename))
img_rgb = np.array(img)
img_hsv = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2HSV)
```

上記の通り OpenCV で、RGB から HSV に簡単に変換できたので、画像認識のタスクにかけてみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3557789/20f1b2ce-baac-36aa-de37-1e3e9012d4ce.png)

グリーン：RGB
オレンジ：HSV
うーん、、、、試行する毎に変動もあるので、ほぼ同じ結果と言ってよさそうです。
もうちょっと変化でてくれないかしら？と期待していたのですが、残念。

## いったん結論
どうも機械学習にかける画像は、RGB でも HSV でも差がなさそう。
ということになりました。

見た限りほとんどの画像認識タスクがRGBで行われていたので、そんなこともあるのかなあ、と何となく考えていたのですが、どうやら、その通りのようです。

　　　　　　　**「RGBの画像で十分」**

ということでした。

もし他に私のように、HSVなどの違う画像フォーマットで認識精度アップを企んで😎いたら、無駄な検証を減らせるように…ということでメモ書きさせていただきました。

::: note warn
↑と書きましたが、データの使い方・加工・学習方法によっては、HSVなど色空間変換をしたほうが良いケースもあるのではと思います。あくまでシンプルな画像認識のシナリオの場合のお話ということでご了承ください。

:::

## ChatGPTにも質問してみました
とても的確な回答をいただいたので、そのまま引用させていただきます。


>画像認識において、RGB形式とHSV形式の違いが認識精度に大きな影響を与えない理由はいくつか考えられます。
>
>### 1. モデルの特性
>多くの機械学習モデルは、入力データの形式に対して比較的ロバストです。特に、ディープラーニングモデル（例えば、畳み込みニューラルネットワーク（CNN））は、学習の過程で特徴量を自動的に抽出するため、入力データがRGB形式であってもHSV形式であっても、最終的には同様の有用な特徴を学習することができます。
>
>### 2. データの再スケーリング
>RGBとHSVは異なる色空間を表しますが、ピクセルごとの情報量は変わりません。データが同じ情報を含んでいるため、モデルは同じように学習し、同じようなパフォーマンスを示すことがよくあります。
>
>### 3. 前処理とデータ拡張
>モデルの前処理やデータ拡張技術（例えば、正規化、ランダムクロップ、フリップなど）が効果的である場合、入力データの形式の違いはさらに影響を受けにくくなります。これにより、RGBとHSVの違いが緩和され、モデルの認識精度にはほとんど影響しません。
>
>### 4. 実際の色相の重要性
>HSV形式は色相（Hue）、彩度（Saturation）、明度（Value）に基づいていますが、多くの画像認識タスクでは、実際の色相や彩度よりも形状やエッジなどの特徴が重要です。このため、RGBとHSVの違いが認識精度に影響を与えにくい場合があります。
>
>### 5. データセットのバランス
>使用しているデータセットのバランスや多様性も影響を与える可能性があります。データセットが非常に多様であれば、入力形式の違いは相対的に小さな要因となります。
>
>まとめると、RGBとHSVの形式の違いが認識精度に大きな影響を与えない理由は、モデルの特性や前処理技術、データの情報量、特徴抽出の重要性に依存しているからです。これらの要因が組み合わさることで、最終的には入力形式の違いが緩和され、同様のパフォーマンスを示す結果となります。
>
>`ChatGPT の回答は必ずしも正しいとは限りません。重要な情報は確認するようにしてください。`
AtCoder 勉強記録[C++] その19

AtCoderで入茶を目指して勉強しています。
勉強を継続するために投稿を始めました。
もともとアカウントを作成していましたが、今年の4月から本格的に勉強を始めました。
一応自分用に解法を書いていますが雑です、自分で読み返して困ったら修正します。
[私のアカウント](https://atcoder.jp/users/nanami_brother)
[解いた問題](https://kenkoooo.com/atcoder/#/table/nanami_brother)
# 本日解いた問題
本日はABC362に参加した。前回の反省を活かし、冷静に問題と向き合うことができた。結果的にA,B問題しか解けなかったが次に活かせるコンテストだったと感じた。これからも自分のペースで焦らず取り組んでいきたい。
## A - Buy a Pen
[A - Buy a Pen](https://atcoder.jp/contests/abc362/tasks/abc362_a)
解答
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vec = vector<ll>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)

int main() {
  ll r, g, b;
  string s;
  cin >> r >> g >> b;
  cin >> s;
  if(s == "Red") cout << min(g,b) << endl;
  else if(s=="Green") cout << min(r,b) << endl;
  else cout << min(r, g) << endl;
}
```
### 解法
`Red`、`Green`、`Blue`の場合に分けて考えることで結果が求まる。
## B - Right Triangle
[B - Right Triangle](https://atcoder.jp/contests/abc362/tasks/abc362_b)
解答
```C++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vec = vector<ll>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)

int main() {
  vec x(3), y(3);
  rep(i, 3) cin >> x[i] >>y[i];
  bool jud = false;
  ll a = (x[0] - x[1])*(x[0] - x[1]) + (y[0] - y[1])*(y[0] - y[1]);
  ll b = (x[0] - x[2])*(x[0] - x[2]) + (y[0] - y[2])*(y[0] - y[2]);
  ll c = (x[2] - x[1])*(x[2] - x[1]) + (y[2] - y[1])*(y[2] - y[1]);
  if(a==b+c) jud = true;
  else if (b==a+c) jud = true;
  else if(c==a+b) jud = true;
  if(jud) cout << "Yes" << endl;
  else cout << "No" << endl;
}
```
### 解法
三角形`ABC`が直角三角形になるには三平方の定理が3辺`AB`、`BC`、`CA`のうちのいずれかで成立すればよいため、三平方の定理が成立するときに`Yes`、そうでないときに`No`を出力する。
## C - Sum = 0
[C - Sum = 0](https://atcoder.jp/contests/abc362/tasks/abc362_c)
解答
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vec = vector<ll>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)

int main() {
  ll n;
  cin >> n;
  vec l(n), r(n), res(n);
  ll suml = 0, sumr = 0;
  rep(i, n){
    cin >> l[i] >> r[i];
    suml += l[i];
    sumr += r[i];
    res[i] = l[i];
  }
  if(suml > 0 || sumr < 0) {
    cout << "No" << endl;
    exit(0);
  }
  for(int i = 0; i < n; i++){
    ll d = min(r[i] - l[i],-suml);
    suml += d;
    res[i] += d;
  }
  cout << "Yes" << endl;
  rep(i, n) cout << res[i] << " ";
}
```
### 解法
この問題について、`L`の総和が0以上の場合、`R`の総和が以下の場合は必ず成立しないため`No`を出力する。そうでない場合は成立する。求める数列`X`を`X=L`とし、`X`の総和が0になるまで`X[i]`に+1していくことで結果が求まる。しかしこれでは計算時間が間に合わないため、`X[i]`に対して`D=min(R[i]-L[i],-sumX)`とし、`X[i]`の値を+Dする。
### 感想
今回のC問題について愚直に+1するのでは計算量オーバーすることまではわかったが計算量を減らす方法を思いつかなかった。ただ、今までなら簡単に諦めていたところを最後までどうにか解けないかと考えたため、今までよりは充実したコンテストにできたと思う。これからも簡単に諦めるのではなく、たとえ間違いだといしても思考する癖をつけていきたい。
Sequence Makerで🔧制御可能な測定器一覧

## はじめに
Sequence MakerはExcelから測定器を制御可能にするアドインです。Sequence Makerを使えば、いろいろな測定器を制御可能です。この記事では、これまで制御が確認できた測定器をリスト化していきます。もしこのリストに掲載が無い測定器で動いたという実績があれば、コメント欄で教えていただけると幸いです。Sequence Makerについての詳細は以下の記事を参照ください。

https://qiita.com/sequencemaker/items/8e6a370ab0a793a06a3b

:::note warn
***お断り***
本記事の内容はSequence Maker開発元の公式見解ではなく、あくまでも個人が趣味の範囲内で執筆しているものです。記事の内容について開発元へ問い合わせることはお控えください。ご質問・要望などは各記事のコメント欄へお願いいたします。
:::

## 測定器
### HIOKIの製品
| 型名 | 品名 | 通信インターフェイス |
|:-|:-|:-|
|IM3590|ケミカルインピーダンスアナライザ|RS-232C,USB,LAN,GPIB|
|IM3570|インピーダンスアナライザ|RS-232C,USB,LAN,GPIB|
|IM3536|LCRメータ|RS-232C,USB,LAN,GPIB|
|IM3533|LCRメータ|RS-232C,USB,LAN,GPIB|
|IM3523|LCRメータ|RS-232C,USB,LAN,GPIB|
|IM3523A|LCRメータ|USB,LAN|
|3504|Cハイテスタ|RS-232C,GPIB|
|3504-40|Cハイテスタ|RS-232C,GPIB|
|3504-50|Cハイテスタ|RS-232C,GPIB|
|RM3542A|抵抗計|RS-232C,GPIB|
|DM7275|直流電圧計|RS-232C,USB,LAN|
|3238|ディジタルハイテスタ|RS-232C|
|SW1001|スイッチメインフレーム|RS-232C,USB,LAN|
|BT4560|バッテリインピーダンスメータ|RS-232C|
|BT3554|バッテリテスタ|USB|
|BT5525|絶縁抵抗試験器|RS-232C,USB,LAN|
|3561-01|バッテリハイテスタ|RS-232C,GPIB|
|SM7420|超絶縁計|RS-232C,USB,GPIB|
|DSM-8104|ディジタル超絶縁/微少電流計|RS-232C|
|ST4030A|インパルス巻線試験器|USB,LAN|
|3174|AC自動絶縁耐圧試験器|RS-232C|
|3153|自動絶縁耐圧試験器|RS-232C,GPIB|
|3159|絶縁耐圧試験器|RS-232C|
|3158|耐圧試験器|RS-232C|
|ST5540|漏れ電流試験器|RS-232C,USB|
|ST5520|絶縁抵抗試験器|RS-232C|
|ST5680|DC耐電圧絶縁抵抗試験器|RS-232C,USB,LAN,GPIB|
|DT4254|デジタルマルチメータ|USB|
|3331|パワーハイテスタ|RS-232C,GPIB|
|PW3335|パワーメータ|RS-232C,LAN|
|PW6001|パワーアナライザ|RS-232C,LAN,GPIB|
|PW8001|パワーアナライザ|LAN|
|MR6000|メモリハイコーダ|LAN|
|ST4200|部分放電検出器|LAN|
|RM3545A|抵抗計|RS-232C,USB,LAN|

（https://www.hioki.co.jp/jp/support/versionup/detail/?downloadid=1438 より引用）

### Keysightの製品
| 型名 | 品名 | 通信インターフェイス |
|:-|:-|:-|
|34401A|デジタルマルチメータ|RS-232C,GPIB|
|E3640A|直流安定化電源	|RS-232C,GPIB|
|DSOX1204G|デジタルオシロスコープ|USB,LAN|

### RIGOLの製品
| 型名 | 品名 | 通信インターフェイス |
|:-|:-|:-|
|DHO814|デジタルオシロスコープ|USB,LAN|


## マイコン
| 品名 | 通信インターフェイス |
|:-|:-|
|Arduino Uno	|USB|
|ESP32-CAM|USB,LAN|

:::note warn
注意
マイコンはそれぞれスケッチやプログラムを書き込む必要があります。
Arduinoと通信する例は以下の記事参照。
https://qiita.com/sequencemaker/items/e68cf7d242e01de62f97
:::

## その他

### IODATAの製品
| 型名 | 品名 | 通信インターフェイス |
|:-|:-|:-|
|UD-CO2S|CO2濃度センサー|USB|

https://qiita.com/sequencemaker/items/a92cdc47fcdad0ec5bd3


## まとめ
この記事はSequence Makerとの通信確認（*IDN?の応答）がとれたところで追記していきます。
macbookpro(mid2019)でubuntuをデュアルブートする方法

苦戦を重ね、ようやくmacでデュアルブートを実施できた。

#やり方
以下を忠実に実施する。
https://unix.stackexchange.com/questions/636709/ubuntu-on-mac-executing-grub-install-dev-nvme0n1-failed

#注意事項
・はじめはgrabのインストールが失敗する。対応方法が記載れているので、焦らないで記事の通りに対応すること。
・スワップ領域については、私の環境のPCメモリが64GBのため、64GBに揃えておいた。
・参考ではあるが、
　「Making Ubuntu bootable part3」の内容は実施せずとも、ubuntuが動いた。
論文読み：DiffHPE: Robust, Coherent 3D Human Pose Lifting with Diffusion

# DiffHPE: Robust, Coherent 3D Human Pose Lifting with Diffusion
ICCVW 2023
## 概要
この論文では、DiffHPE (Diffusion-based Human Pose Estimation) という新しい3D姿勢推定手法を提案している．
拡散モデルを統合することで、精度、ロバスト性、一貫性を向上させることを目指しており、特に、拡散モデルは、オクルージョンに対する耐性と時間的一貫性を向上させることが示されている．

:::note info
近年、拡散モデルを使用した研究が増えている傾向にあるが、どう使うかどんなタスクに使うかという点で、まだまだ研究の余地がある。
本研究では、3D姿勢推定の中でも特にオクルージョンに対する耐性と時間的一貫性の向上に注目している。
:::

## 従来手法との比較
従来の3D姿勢推定手法は、主に確定的アプローチと確率的アプローチに分けられる．確定的アプローチは単一の姿勢を予測し、確率的アプローチは複数の仮説を生成する．これらの手法には以下の課題がある：
- **確定的アプローチ**: 単一の予測に依存するため、オクルージョンやノイズに対する耐性が低い
- **確率的アプローチ**: 仮説の生成が複雑であり、計算コストが高い

## 新規性
DiffHPEの新規性は以下の点にある：
1. **拡散モデルの導入**: 拡散モデルを使用してノイズのある3D姿勢からクリーンな3D姿勢を復元する
2. **時間的一貫性の向上**: 拡散モデルを用いることで、時間的一貫性を向上させ、より現実的な3D姿勢を生成する
3. **オクルージョンに対する耐性**: 拡散モデルはオクルージョンに対する耐性を持ち、部分的に欠損したデータからも正確な姿勢を推定できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2323577/799a2ab2-9677-b50d-fb9d-ad7dba84cd20.png)

## 方法論
- **拡散プロセス**: GTの3D姿勢にノイズを加え、ノイズのある3D姿勢を生成する．このプロセスを反転させることでクリーンな3D姿勢を復元する
- **デノイザー**: 2Dキーポイントに基づいてノイズのある3D姿勢からクリーンな3D姿勢を生成するデノイザーを学習する
- **JPMA (Joint-wise reProjection-based Multi-hypothesis Aggregation)**: 3D姿勢仮説を2Dカメラ平面に再投影し、再投影誤差に基づいて最良の仮説を選択する

## モデル構造

### Training
1. タイムステップをサンプリングする
2. 標準正規分布からノイズをサンプリング、GTの3Dデータを用いてノイズが付加された3Dposeデータを生成する
3. 2D入力を使ってバックボーン（事前訓練済み）を通して、特徴量2Dを計算する
4. ノイズ付き3Dデータを線形エンコーディングレイヤーを通してエンコードし、特徴量3Dを得る（当然、この特徴量3Dにはノイズが付与されている）
5. 特徴量2Dと3Dを用いて、ノイズ予測ネットワークよりノイズを予測する

### Inference
1. ガウス分布から3Dデータの初期ノイズサンプルをサンプリング
2. 2D入力をバックボーンモデルを通して特徴量2Dを計算する
3. 逆拡散プロセス
    1. 特徴量の計算：ノイズ付き3Dデータを線形エンコーディングレイヤーにてエンコードし、特徴量3Dを得る
    2. 特徴量2D,3Dを用いて、ノイズ予測ニューラルネットワークよりノイズを予測する
    3. 予測されたノイズを使用して、ガウス分布から次ステップの3Dデータをサンプリングする
4. 上記の逆プロセスを全てのタイムステップで行い、最終的にノイズが除去された3Dデータを生成

### Loss
1. 予測されたノイズと実際のノイズをL2損失で比較


## 結果と評価
DiffHPEは、Human3.6Mデータセットで評価され、従来の最先端手法を上回る性能を示している．例えば、DiffHPEは、精度、時間的一貫性、およびオクルージョンに対する耐性において、MixSTEなどの既存モデルを上回る結果を示した．具体的には、MPJPE (Mean Per Joint Position Error) が低減し、シンメトリーギャップやセグメント長の標準偏差が改善された．

## 結論
DiffHPEは、拡散モデルを用いた新しい3D姿勢推定手法であり、確定的および確率的な手法の利点を組み合わせている．特に、オクルージョンに対する耐性と時間的一貫性の向上が特徴である．このアプローチは、3D姿勢推定の分野において新たな標準を確立する可能性がある．今後の研究では、長いシーケンスへの適用や計算コストの削減が課題となる．
Next.js で PWA と プッシュ通知の受信を両立させる

# 背景
Next.js で `next-pwa` を用いて PWA に対応させつつ、 ブラウザへ送ったプッシュ通知を受信して表示させる方法でちょっと詰まりました。というのも、`next-pwa` で自動生成されるサービスワーカーのスクリプトと、プッシュ通知を受信して表示させるためのサービスワーカーのスクリプトを共存させる方法が分からなかったためです。
`next-pwa`の GitHub に解決策が書かれていたので備忘録としてまとめておきます。

# next-pwa を用いた PWA への対応
https://www.npmjs.com/package/next-pwa

下記のような設定で、 `next-pwa` を利用します。
```js:next.config.js
const withPWA = require('next-pwa')({ // next-pwa を読み込む
  dest: 'public',
  register: true,
  skipWaiting: true,
});
const withTM = require('next-transpile-modules')([
  'hogehoge',
  'fugafuga',
]);

const { i18n } = require('./next-i18next.config');

module.exports = withTM(
  withPWA({ // ここに記述
    reactStrictMode: true,
    i18n,
    images: {
      domains: [
        'somewhere',
        'localhost',
      ],
    },
    webpack: (config) => {
      config.module.rules.push({
        test: /\.svg$/,
        use: ['@svgr/webpack'],
      });
      return config;
    },
    async redirects() {
      return [
        {
          source: '/test/some',
          destination: '/',
          permanent: false,
        },
      ];
    },
    experimental: {
      scrollRestoration: true,
      optimizePackageImports: ['@mui/icons-material'],
      esmExternals: false,
    },
    eslint: {
      ignoreDuringBuilds: true,
    },
  }),
);
```
このように記述してビルドすると、`public` 配下に `workbox-***.js` というスクリプトと `sw.js` というサービスワーカーのスクリプトが自動生成されます。

# プッシュ通知の受信
https://www.npmjs.com/package/web-push

`web-push` を用いたプッシュ通知の送信方法については長くなるので割愛します。

下記のように、受信したプッシュ通知を表示させるために、
![showNotification001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1504894/5d764545-8c3e-2e95-0409-849261e76f0c.png)

自分でサービスワーカーのスクリプトを書きます。

```js:service-worker.js
// プッシュ通知（web-push）受信時の処理
self.addEventListener('push', function (event) {
  const data = event.data.json();
  const title = data.title || '新しいアクションがありました';
  const options = {
    body: data.body || '詳細はクリックして確認してください',
    icon: '/test-192x192.png',
    badge: '/test-192x192.png',
    data: {
      url: data.url,
    },
  };
  event.waitUntil(self.registration.showNotification(title, options));
});

// プッシュ通知（web-push）クリック時の処理
self.addEventListener('notificationclick', function (event) {
  event.notification.close();
  event.waitUntil(
    clients.matchAll({ type: 'window', includeUncontrolled: true }).then(() => {
      if (clients.openWindow) {
        return clients.openWindow(event.notification.data.url);
      }
    }),
  );
});
```

最初はこのスクリプトを `public` 配下に置いていましたが、同じスコープに２つのサービスワーカーが共存するような形になって上手くいきませんでした。
そのため、下記を参考にしました。

# custom-worker を設置する
https://github.com/shadowwalker/next-pwa/tree/master/examples/custom-worker

> It demonstrates how to add custom worker code to the service worker generated by workbox.
（workbox が生成するサービスワーカーにカスタムワーカーコードを追加する方法を示します。）

結論、`next.config.js` がある階層に `worker/index.js` を作成し、先ほどの `service-worker.js` の中身をそこに書くだけでした。
これで PWA とプッシュ通知の表示を両立させることができ、無事に iOS で「ホーム画面に追加」したアプリにてプッシュ通知を受け取ることができました。
![IMG_0120.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1504894/f35896cb-7125-8d85-db9d-ebbcbb518fb1.png)