あきらぼ

テック系ブログ

iPhoneの写真をheicファイルからjpegファイルにpython で変換する

またやってしまいました。

 

今までWindowsユーザーの私はiphone のデフォルト設定であるheicフォーマットの写真を扱いづらいのでjpeg保存にしていたのですが、iPhoneを買い替えた際に元の設定に戻ってしまっていました。

 

heicは圧縮率が高いので便利な面もありますが、こうやってブログを書いたりする際にWindowsPCで読み込んだり加工しづらく困ってしまいます。

すでに写真はheicのままAmazonPhotoにアップロードされてしまっているし。

 

 

 

そこで今回はpythonでheicからjpegへ変換するスクリプトを書いてみました。

 

変換で使用するパッケージはpillow_heifです。

以下のコマンドでインストールします。

sudo pip install pillow_heif

windowsなら

python -m pip install pillow_heif

 

あとはChatGPTさんに協力してもらいながらスクリプトを書きます。

GPTさん優秀なプロンプトエンジニアなので、適切に指示すれば綺麗に作ってくれます。

 

 

あとは入力にheicファイルが保存されているディレクトリと変換したファイルを保存したいディレクトリを指定して使用します。

python heic_jpeg_converter.py -i input_directory -o output_directory

実際の例はこんな感じ。

python heic_jpeg_converter.py -i path/to/heic_files -o path/to/output_directory

 

とりあえず、これで変換してブログ用の画像等を変換して使いました。

 

今回作成したスクリプトはこちら。

github.com

Ankerのポータブル電源修理

壊れて動かなくなったというAnkerのポータブル電源を手に入れたので修理できるか試してみます。

 

f:id:AKIRA_san:20240229092133j:image

 

症状としては充電ケーブルを接続しても何も表示がされず、USBや12V、100Vの出力ボタンを押しても何も反応しません。

 

とりあえずネットで調べてるみると分解修理している人がいたので参考にしながら分解していきます。

https://mazu-bunkai.com/bunkai-wp/repair/12640/

 

まず、本体側面のビスを外して、底面のゴム足の裏にあるビスをはずします。

このゴム足が接着剤固定なので硬く、スイスツールのピッキングツール使っていたら折れてしまいました(泣)


f:id:AKIRA_san:20240229092749j:image

f:id:AKIRA_san:20240229092753j:image

 

そしてビスを外せば背面と前面のパネルははまっているだけなので隙間を作って引っ張り出せば取り外せます。

 

しかし、この爪ではまっているだけのパネルが固いのなんの。

一応バッテリーで万が一にもショートさせたり破損させらればいのでスマホ分解用の工具用を使っていたのですが、ものの見事に破棄しまくりました。

(バッテリーは酸化剤も燃料も入っているので燃えてしまったら燃え尽きるまで待つしかできませんからね。家での作業なら尚更注意が必要です。)

 

なんとか背面パネルを外しました。

f:id:AKIRA_san:20240229092456j:image

 

(最後までやってから気づいたのですが、おそらく背面は外さなくても良かった)

 

次に前面も同じように外していきます。背面よりも液晶があったりボタンがあったりで力は入れづらくやりづらかったです。

 

次に基板固定のビスを外してケーブルを外すと参考にしていたサイトではやっていたのですが、組み順的には基板は後にやっても良さそうです。

パネル外側のビスを全て外すと中身ごと手前に引き出せます。

 

f:id:AKIRA_san:20240229093412j:image

 

そうすると前面パネルと繋がっているケーブルコネクタが外せるので外してサイドにあるキボシのバッテリー接続を外します。

 

電源容量も大きいので万が一にもショートできないので一個ずつ取り外してテープで絶縁してを繰り返して安全にバッテリーと基板を切り離します。

 

これで基板本体で故障チェックができます。

1番怪しい充電コネクタの導通を確認しましたが、問題ありませんでした。

不思議に思ってとりあえず基板だけで充電ケーブルを繋いでみると液晶が正しく表示されています。

「あれ?症状が変わった?」と思いバッテリーのキボシも取り付けて仮組して充電ケーブルを接続してみると問題なくバッテリー残量も表示されました。

 

「なんでかは分からないが分解してみたら治ってしまったので逆の手順で組み付けていきます。

 

f:id:AKIRA_san:20240301170815j:image

 

問題なく出力も含めて作動するようになりました。

 

ということでただ分解して組んだだけで症状がなくなってしまったので、修理完了です。

 

足ゴムを接着剤でつけて作業完了です。

 

用途は簡易UPSとして使用していこうと思います。

 

Streamlitで部屋の温度・湿度モニターの可視化ボード作成

こんにちは。

 

今回はStreamlitを使って以前作った部屋の温湿度モニターの可視化ボードを作ってみました。

以前はChart.jsを使ってグラフ化していたのですが、Streamlitを使うと簡単にもっとInteractiveな表示ができそうなので試してみた次第です。

 

前回Chat.jsを使った際の記事はこちら。

 

aki-lab.hatenadiary.com

 

Streamlitとは?

Streamlitとはpythonのwebフレームワークで、データ解析に特化したフレームワークになります。

Pandasなどと相性がよく、データサイエンスやAIのフィールドでよく利用されているようです。

実際、私も仕事で解析のスクリプト組んだとしても結果の共有に悩む場面が多いですが、こういったWEBで表示できると共有先の環境に合わせる必要がなく便利というわけです。

 

streamlit.io

 

実際、使用してみた感じでもWEB上で細かくデータも見ることができるのでとても便利です。

一時解析ぐらいできてしまうぐらいインタラクティブに動かせるのも魅力です。

実際のサンプルサイト

今回使った実際のサンプルサイトはこちらになります。

JSON形式のデータを読み込んで表示しています。

https://aki-r-streamlit-sample-app-gkayym.streamlit.app/

 

まずはLineグラフに関して。

SreamlitのAPIにも線グラフのAPIはありますが、Plotlyと組み合わせられるのでグラフはPlotlyで表示しています。

Plotlyの方がカスタマイズ性が高いです。

実際見てもらうとドラッグ、ズームも簡単でPNGで出力もできます。

 

以前使っていたChart.jsよりもグリグリと動かせるので使い勝手がとても良いです。

 

次にPandasのデータフレーム表示に関して。

データフレームを簡単に表示できるだけでなく、変数名のところをクリックすることで簡単にソートできてしまいます。

これだけで簡単な一時解析できるぐらいの便利さです。

 

こんな形で、データ表示としては強力なGUIを作ることができます。

 

実装コード

今回上記のサンプルを作成したのは以下のコードです。

GUIアプリですが、この程度であれば非同期やコールバックを考えずにそこそこ実装できます。

 

 

公開はサーバーであればstreamlitをpipでインストールして実行するだけ。

今回添付したサンプルはstreamlitの機能でgithub連携で公開していてデプロイも楽ちんです。

 

今回のコードはこちらです。

github.com

 

以上、Streamlitでの可視化ダッシュボード作成でした。

 

docker-composeで「unknown or invalid runtime name: nvidia」のエラー

あるdocker-composeのGPUを使用するイメージでハマってしまったので、解決した方法を書こうと思います。

 

環境

  • Windows11
  • Cuda V12.2.128
  • WSL2(Ubuntu20.04)
  • Docker 20.10.17
  • Docker Compose V1.25

 

問題

WSL2(Ubuntu20.04)上で以下のようなruntimeでnvidiaを指定するImageをBuildしようとしました。

 

 

このサービスのイメージはこちらです。

https://hub.docker.com/r/nvidia/cuda

 

このサービスを実行しようとすると以下のエラーが生じました。

ERROR: Cannot create container for service test: unknown or invalid runtime name: nvidia

 

解決策

私が解決したのは以下の二つを行ってです。

  1. docker-composeのバージョンアップ
  2. docker-compose.yamlでのGPU使用設定方法の変更

 

docker-composeのバージョンアップ

まずはdocker-composeのバージョンアップです。

V1.25からV2.20へアップデートしました。

 

バージョンアップ方法はこちらを参考にしました。

【Docker】docker-compose を最新版にアップグレードする - Qiita

公式のレポジトリはこちら。(こちらから最新のリリースバイナリに入れ替えればバージョンアップできます。)

GitHub - docker/compose: Define and run multi-container applications with Docker

 

docker-compose.yamlでのGPU使用設定方法の変更

次にdocker-compose.yamlの設定を変えます。

以下のように変更しました。(これで1つGPU使えます。複数GPUのケースは色々他に指定する必要があります。)

 

 

実際に実行するとコンテナ内でGPU状態が確認できます。

こちらに公式情報があります。

Compose で GPU アクセスの有効化 — Docker-docs-ja 20.10 ドキュメント

 

この方法でなくてもdockerのdefault runtime設定を変える方法もありますが、これもdocker-composeバージョンアップする必要はあります。

ただし公式でも非推奨方法となるので上記の方法が良いと思います。

 

以上、docker-composeでのGPU使用方法でのエラー解消法でした。

 

【IoT】【悲報】ラトックのスマート家電リモコンがIFTTTとの連携を終了

ラトックシステムのスマート家電リモコンがIFTTTとの連携を終了するとのです。

 

www.ratocsystems.com

 

私が使っているRATOCの家電リモコンは以下の二つです。

 

 

こちらを使っていた理由はIFTTT連携を通してIoT化できるからという理由です。

実際にこれらを使って温度・湿度モニターなんかを作っていました。

 

aki-lab.hatenadiary.com

 

温度モニターは最近の猛暑日続きの部屋の温度の推移確認だったり、エアコンの設定等に活かされていたので非常に残念です。

 

センサー値や操作コマンドへアクセスできるようなAPI公開してくれているスマート家電があれば使いたいですね。

 

とりあえずはIFTTT連携サービスが終了するので今後どうやって部屋のモニター機能等維持するか考える必要ができました。

 

また、アイデア思いついたら書いていこうと思います。

【Steam】【Ubuntu】【ARK】ARKのゲームサーバーをSystemdでデーモン(service)化する

今回はARKのゲームサーバーをCrontabでモニターして起動する方法で使ってきましたが、Systemdのデーモン(Service)化すると異常停止時に再起動したり、ログを残せたり簡単に再起動できたりと良いことずくめなのでデーモン化することとしました。

 

 

 

起動スクリプト

まず、起動用のスクリプトを用意します。

基本的にはゲームサーバーのメインのバイナリをオプションと一緒に起動するだけのシェルスクリプトになります。

今回はフィヨルドのマップにしました。

 

 

 

保存する場所はどこでもいいですが、私はoptに置きました。

/opt/ark/bin/Fjordur.sh

 

Serviceの登録

次に、サービスとして登録していきます。

登録の仕方は以下のディレクトリに(サービス名).serviceというUnit定義ファイルを作成するだけです。

/etc/systemd/system/

 

今回はフィヨルドマップなので「ark_fjordur.service」という名前にしました。

内容は以下の通りです。

 

Restartのところをon-failureとすることで異常終了した際に再起動するようにしています。

ExecStartで先ほど作成したスクリプトを指定してあげます。

 

これで基本的にはServiceの登録は終了です。

 

Serviceの起動

次に登録したサービスを起動していきます。

基本的には管理者権限が必要となります。(sudo必要)

まずはサービスの有効化をします。

sudo systemctl enable ark_fjordur

これで有効化されます。

 

次に起動します。

sudo systemctl start ark_fjordur

これで起動されます。

あとは基本的にはずっと起動してくれます。

 

状態を確認するには以下のコマンドを使用します。

sudo systemctl status ark_fjordur

以下のように状態を確認できます。

● ark_fjordur.service - ARK Fjordur Game Server
     Loaded: loaded (/etc/systemd/system/ark_fjordur.service; enabled; vendor preset: enabled)
     Active: active (running) since Sun 2023-07-16 11:44:51 JST; 12h ago
   Main PID: 3628739 (Fjordur.sh)
      Tasks: 17 (limit: 4584)
     Memory: 3.0G
     CGroup: /system.slice/ark_fjordur.service
             ├─3628739 /bin/bash /opt/ark/bin/Fjordur.sh
             └─3628740 /home/akira/Steam/servers/ark/ShooterGame/Binaries/Linux/ShooterGameServer Fjordur?listen?SessionName=YokohamaKaitaku?ServerPassword=Kaitakumin?ServerAdminPassword=KatakuminAdmin -server -log

 7月 16 11:44:51 v133-18-232-25 systemd[1]: Started ARK Fjordur Game Server.
 7月 16 11:44:52 v133-18-232-25 ark_fjordur[3628740]: [S_API FAIL] SteamAPI_Init() failed; SteamAPI_IsSteamRunning() failed.
 7月 16 11:44:53 v133-18-232-25 ark_fjordur[3628740]: Setting breakpad minidump AppID = 346110

 

Serviceの停止・再起動

サーバーのアップデート等で停止・再起動が必要になりますが以下のコマンドで行うことができます。

 

停止

sudo systemctl stop ark_fjordur

 

再起動

sudo systemctl restart ark_fjordur

 

以上、ARKサーバーのデーモン化でした。

 

【Linux】【ARK】SteamCMDの自動化・ARKサーバーアップデート

今回はSteamCMDでのARKサーバーアップテートの自動化をしてみました。

 

環境はLinux(Ubuntu)のVPSサーバーです。

 

SteamCMDで手動でいつもアップデートしていたのですが、数コマンドですが面倒くさいのでシェルスクリプト化しました。

 

基本的には以下の記事の手順をシェルスクリプトに記載するだけです。

 

ここではsteamcmd.shの引数でstemacmdで実行したいコマンドを指定しています。

具体的には停止するにしてもプロセスIDが分からないので以下のコマンドで確認します。

./steamcmd.sh +force_install_dir ./servers/ark +login anonymous +app_update 376030 validate +exit

引数として+(コマンド)の形で実行することで全て実行してくれます。

 

詳細は以下の記事を参考にしました。

https://developer.valvesoftware.com/wiki/SteamCMD#Linux.2FmacOS

 

スクリプト自体はこちらに置いてあります。

GitHub - Aki-R/ark_server_update_script: Shell script for ark server update on SteamCmd of linux