電動爪切りを購入したのでレビュー

評価: かなり良い 爪切りというよりは爪削り

使い方

ボタンを押して回転する刃に爪を充てて削るといった感じ。 2回ボタンを押すとやすり側が回転して整えることができる

使った感想

メリット

一番のメリットは深爪の心配がないこと。
爪を差し込むところは細くなっているため無理やり押し込めば深爪できるけどそんなことする人いないでしょう。
回転刃で削るだけだとちょっとガタガタになるけど、後ろのやすりで削るとめっちゃ滑らかになります。
手でやすり掛けするよりだいぶ楽に仕上げることができます。

デメリット

慣れるまではちょっと大変。
使い始めは加減が分からず強く差し込んでやすり掛けできない状態になってしまったのでちょっとコツがいるのが難点。
また、指や爪の形状によっては、電動爪切りが使えない場合があります。足の爪とか指の腹が爪より出ているとつかうのは難しいと思われます。
購入する前に、自分の指や爪の形状を考慮することが重要。 あと爪の粉がめっちゃ舞います。

HX100GのUbuntuのdockerでSteamOSを試してみる

昨日構築したHX100GのUbuntu環境を入れた理由がこれです。Docker上で動かしたSteamOS環境を使ってみたかったというだけにUbuntu入れてみました(笑)

nao078.hatenablog.com

下記を参考に実施 github.com

対象マシンはMinisforumのHX100G

手順

Ubuntuを更新

wslのターミナル上でsudo apt update && sudo apt upgrade を実行

構築

参考サイトのdocker-composeをコピペしvolumesのconfigのディレクトリ指定を変更、HOST_IPをWSLのIPアドレス指定してdocker-compose up -d

SteamOSへアクセス

ブラウザを開いてhttp://localhost:3000へアクセス

嘘だろ動いたよ…

その後

普通にゲームは起動できた SteamLinkからアクセスできたもののゲームを起動するとコントローラーが認識しない状態。
とりあえずやりたかったことはできたので満足

WowMouseがPixelWatch2で使えるようになっていた

以前紹介したWowMouseがPixelWatch2で使えるようになっていたので記録

nao078.hatenablog.com

【変更点】

  • PixelWatch2側で接続先デバイスが選べるようになっている
  • タップの検出が良くなっている
  • マウスの感度(sensitivity)設定がPixelWatch2側で行えるようになっている
  • マウスの移動の滑らかさ(smoothing)設定がPixelWatch2側で行えるようになっている

AndroidにペアリングしてXREAL Airで画面見るのが最強の使い方がしやすくなっています
ごろ寝がはかどりますね!PW2は不健康に生活するのに必需品のアイテムになりそう

HX100G購入&セットアップ

買っちゃったぜ

下記内容はHX100Gが置物に(動かなく)なってもやってみたいと思った人だけ試そうとしてください

Ubuntuをインストール

思うところがあったのでWindows11 Homeを消してUbuntu22.04LTSをダウンロードしインストールメディアを作成してUbuntu機にします。
セキュアブート有効である必要がある(AMDのドライバを入れるのに必要である)ため下記を参考に対処

askubuntu.com

無事インストール完了
Linuxもすげぇ簡単にインストールできる時代になりましたね

Ubuntu Proへ登録

Ubuntu Oneに登録することで個人端末5台までUbuntu Proへ登録できるという事なのでせっかくなので登録する
方法は簡単でUbuntu Oneにサインインしてトークンが払いだされるので画面の指示に従ってトークン情報を登録することで可能

各種設定

apt update && apt upgreadeで各種パッケージ更新
Chromeインストール(Googleに魂を売っているので)
Mozcから日本語変換追加して日本語入力可能へ設定
再起動

AMDドライバをインストール

下記からUbuntu 22.04 LTS用のドライバをダウンロード。

AMD Radeon™ & Radeon PRO™ グラフィックス用の Linux® ドライバー | AMD

ダウンロードしたdebファイルをsudo apt install amdgpu-install_{Version番号}.debでインストールしsudo apt update
amdgpu-installを実行
結構長いが、エラーが起きなければ成功
再起動して設定のシステムにあるグラフィックがHX100GのAMDドライバとなっていることを確認

SS取り忘れたが最初は別のドライバ情報担っているはず

Dockerインストール

Dockerをインストールします

docs.docker.com

無事成功

おわり

とりあえず必要そうなものは入れ終わったので続いて個別の設定を行っていく
しばらくこれで遊べそう

Go言語のinterface:効果的な機能設計とユースケース

Go言語のinterfaceが便利という話

intarfaceについて

Go言語のインターフェースは、メソッドの集合を定義する抽象的な型。具体的なデータ型や実装の詳細に依存せず、メソッドのシグネチャ(メソッドの名前、引数、戻り値の型)のみを定義できる。 インターフェースは、異なる型の値に共通の振る舞いを持たせたい場合や、多様な型のコレクションを扱いたい場合に役立つ。

httpリクエストを行うクライアントを例にして考えてみる

Getのみが行えるOperatorとGetとPostが行えるAdminクライアントを作ることを例として考えてみる
機能設計として記載するなら以下のような感じ

  • operatorはGetを行う権限を持つ
  • adminはGet、Postを行う権限を持つ
とりあえずの実装

通常はそのままhttp.Clientを使用する形になる

package main

import (
    "bytes"
    "net/http"
)

func main() {
    operator := http.Client{}
    operator.Get("http://example.com/data")

    admin := http.Client{}
    admin.Get("http://example.com/data")
    admin.Post("http://example.com/data", "application/json", bytes.NewBufferString(`{"name":"sample"}`))
}

変数名でoperatorとadminを分けられてはいるが、ぱっと見で機能設計と突合ができないものとなっている。また、各クライアントで機能を制限していないためプログラマが気を付けてコーディングする必要が出てくる。

改善Version

機能を制限したstructを用意して改善する

package client

import (
    "fmt"
    "io"
    "net/http"
)

// operator クライアント
type OperatorClient struct {
    baseUrl string
    client  *http.Client
}

// operator クライアントはGetを可能にする
func (c *OperatorClient) Get() (resp *http.Response, err error) {
    fmt.Printf("get to %s", c.baseUrl)
    return c.client.Get(c.baseUrl)
}

// operator クライアントを返却
func NewOperater(baseUrl string) *OperatorClient {
    return &OperatorClient{baseUrl, &http.Client{}}
}

// admin クライアント
type AdminClient struct {
    baseUrl string
    client  *http.Client
}

// admin クライアントはPostを可能にする
func (c *AdminClient) Post(body io.Reader) (resp *http.Response, err error) {
    fmt.Printf("post to %s", c.baseUrl)
    return c.client.Post(c.baseUrl, "application/json", body)
}

// admin クライアントはGetを可能にする
func (c *AdminClient) Get() (resp *http.Response, err error) {
    fmt.Printf("get to %s", c.baseUrl)
    return c.client.Get(c.baseUrl)
}

// admin クライアントを返却
func NewAdmin(baseUrl string) *AdminClient {
    return &AdminClient{baseUrl, &http.Client{}}
}
package main

import (
    "bytes"
    "my-rest-api/cmd/client"
)

func main() {
    operator := client.NewOperater("test")
    operator.Get()

    admin := client.NewAdmin("test")
    admin.Get()
    admin.Post(bytes.NewBufferString(`{"data":"test"}`))
}

一気に長くなったが、機能設計と突合しやすくなり、拡張性も増え、プログラマ依存にならないでoperatorとadminの操作権限を付与ができるコードとなった。
しかし問題点はまだある。
現状では各クライアントがhttp.Clientを直接持っているため単体テストする際に対向のサーバーが必要になってしまう。

そこでintarfaceですよ

以下のようにintarfaceを用いると単体テストする際にintarfaceのmockが設定可能となり対向のサーバーが不要なコードとなる。

package client

import (
    "fmt"
    "io"
    "net/http"
)

// clientパッケージ内で利用するhttp.Clientの機能をintarfaceとして定義する
type httpClient interface {
    Get(url string) (resp *http.Response, err error)
    Post(url string, contentType string, body io.Reader) (resp *http.Response, err error)
}

// Operator クライアント
// clientの型をhttpClientに変更する
type OperatorClient struct {
    baseUrl string
    client  httpClient 
}

func (c *OperatorClient) Get() (resp *http.Response, err error) {
    fmt.Printf("get to %s", c.baseUrl)
    return c.client.Get(c.baseUrl)
}

func NewOperater(baseUrl string) *OperatorClient {
    return &OperatorClient{baseUrl, &http.Client{}}
}

// Admin クライアント
// clientの型をhttpClientに変更する
type AdminClient struct {
    baseUrl string
    client  httpClient
}

func (c *AdminClient) Post(body io.Reader) (resp *http.Response, err error) {
    fmt.Printf("post to %s", c.baseUrl)
    return c.client.Post(c.baseUrl, "application/json", body)
}

func (c *AdminClient) Get() (resp *http.Response, err error) {
    fmt.Printf("get to %s", c.baseUrl)
    return c.client.Get(c.baseUrl)
}

func NewAdmin(baseUrl string) *AdminClient {
    return &AdminClient{baseUrl, &http.Client{}}
}
package main

import (
    "bytes"
    "my-rest-api/cmd/client"
)

func main() {
    operator := client.NewOperater("test")
    operator.Get()

    admin := client.NewAdmin("test")
    admin.Get()
    admin.Post(bytes.NewBufferString(`{"data":"test"}`))
}

というわけでintarfaceは便利だなぁと思った

Wear OSスマートウォッチ君、WowMouseというアプリでジェスチャーマウスになるってよ

概要

WowMouseというアプリを見つけたので使ってみた。
Doublepoint社が開発した、Wear OS スマートウォッチをマウスに変えるアプリとのこと。

CES 2024 で披露されたそう。
オープンエア ジェスチャはナビゲーションに使用でき、軽いピンチは選択またはスクロールに使用される模様。

play.google.com

ただし、Google Pixel Watch 1/2ではポインティングデバイスとして動作するとのことだが、現状、正式にはサポートしていないようで正常に動かない模様。

docs.doublepoint.com

Apple Watchには既にダブルタップという似たような機能があるとのことだが持っていないので詳細は不明。

早速試してみる

上記PlayストアからPixel Watch2にインストールすることは可能だったので、早速インストールしてPixel7aとつないで使ってみた。
セットアップ後Pixel7aにマウスカーソルが出現。腕を上下に振ったりすることでカーソルが動き、親指と人差し指を叩くことでマウスのように使えた。

しかしながら、1日たって再度使ってみようかと思ったがマウスカーソルすら出現しないようになった。やっぱ未サポートという事もありまだ動作は安定しないのだろう。
その他デバイスなどは下記動画で紹介されているのでそちらを参照。

www.youtube.com

使ってみた感想

かなり良い。期待大。XREAL Air用のデバイスとして最高なのでは?といった感じ。
現状XREAL BeamにChromeCastして画面を映しているが、マウスなどを持ち歩くのも面倒だと思っている昨今、これが機能すれば常につけているスマートウォッチがマウスになるため荷物が減る。
サポートされるかはわかなないけど期待は高まるアプリだなぁと思った。
いっそのことGalaxyWatch買ってしまおうか?

チェーン不要のスマートブラインドモーターの導入

前々から我が家のカーテンのスマートホーム化を考えていたが、我が家のカーテンはロールスクリーンの1級遮光ロールスクリーンを利用しており、スイッチボットが出しているカーテン用ボットが利用できなかった。
今回以下の製品を見つけたのでその話をする

購入した製品

ブラックフライデーや大規模セールなどでAmazonを検索していたところ下記商品を見つけたので衝動的に購入。1か月ほど使用してかなり快適な感じになったのでレビューをする。
自動化本体製品:これのみだとリモコンを利用した自動化のみになる

スマートホーム化オプション製品:Alexaなどとの連携に必要になる製品

自動化本体製品の内容物は以下の通り。詳細が気になる方は製品ページを参照してほしい。

  1. モーター本体x1
  2. リモートコントローラ
  3. 呼び径28mm用部品
  4. 19mm用部品(デフォルト)
  5. Type-Cケーブル(3メートル)
  6. ねじ回し、リモコン蓋用ねじ

古いロールスクリーンを自動化して再利用するといたようなコンセプトらしい。リモコンについての説明書はあるが、取付の説明書などはなし
まぁそれくらいわかる人がやれって製品なのだろう。ぶっちゃけパイプに差し込むだけの製品なので呼び径合うものを取り付けて差し込めって製品なので説明する必要もないと思う。

対応するロールスクリーンは19mm or 28mm のロールスクリーンとなっている。ロールスクリーンはおおむねこのサイズが一般的な企画になる模様。事前に取り外して分解しサイズを測ったところ問題なさそうなことは確認した方が良い。
我が家のロールスクリーンはびっくりカーペットさんでネット購入したロールスクリーン。呼び径は28mmだったので問題なく取り付けできた。 bicklycarpet.co.jp cm単位でオーダーメイドのロールスクリーンを注文できるため各家庭にあったロールスクリーンが注文できる

導入の際にてこずった話

手こずったのは呼び径を外す方法。デフォルトでは19mmy用の部品が付いているが、引っ張っても取れなかったので10分ほど悩んだ。最終的に以下の画像の黒いリングを取れば外せることに気が付いたが、黒いリングが固かったのでペンチで無理やり外すことで取り換えることができた。

あとは右側に機器を取り付けないとリモコンの操作が逆になってしまうためそこも注意する。取付は説明するまでもなく、適当にロールスクリーンを分解してチェーン部分を外し取付けを行う。取り付ける際はUSBの口が下になるように取り付けるとよい。
取付を行ったら説明書に従いリモコンとキャリブレーション設定を行う。

スマートホーム化の話

無事リモコンで操作可能になったらリピーターとの連携設定を行う。こちらも説明書通りに設定すれば基本的に迷うことはないと思う。
設定後の音声操作でどういった感じになるかというと以下のような感じ。

youtu.be

リピーターは障害物があっても5mくらいは操作可能っぽい?(仕様については詳細に書いていないのでよくわからなかった) 1つのリピーターで複数台登録でき、登録した機器は同時操作が可能になる。リピーターの設定は結構便利で位置情報を登録することにより日の入り、日の出の時間前後の設定などが可能。
筆者は朝の6時に自動でカーテンを開け、日没の30分前に占めるという設定を行っている。

現在は朝、夕のカーテン開け閉めの作業から解放された快適な生活を送っている。

不安点

バッテリー式なので経年劣化が心配。とりあえず10年くらい持つといいなぁと思っている。

その他

以下のようなロールスクリーンのチェーンを巻き取るタイプの物はチラホラ見かけていたが、そもそもチェーン自体をなくしたいと考えていたので今まで導入を見送っていた。今後使うことはないと思うが、以下のような製品のレビューなどの見てみたいと思う。