2026.02.13 20:21
Pythonの型チェック
・というところで、忘れた頃に再チャレンジのニューラルネットワーク。
・まずはここからでしょということで、再びニューロンをPythonで。しかし、改めて思う。Pythonって雑というのか、おおらかというのか。
・わかって使っている分には便利ではあるけれど、逆におおらかすぎて、型を間違って与えると痛い目にあう。
・たとえば、
x=[1,2,3]
y=np.array(x)
で、
x*2は[1,2,3,1,2,3]
y*2はarray([2,4,6])
になるという具合。個人でボソボソやる分にはいいけど、大規模開発なら盛大なバグの養殖場になってしまいそうだ。
・ということで、例によってGCC(Gemini/ChatGPT/Copilot)に頼ってみたら、
from beartype import beartype
とやって(baretypeかと思ったら本当に熊のbear)、関数の直前に
@beartype
xxx_func(x:int, y:np.ndarray)->float:
みたいに型を指定してやると、チェックしてもらえるらしい。また、
from beartype.claw import beartype_this_package # 「爪 (claw)」という強力な機能
beartype_this_package() # これをプログラムの最初に1行書くだけ
と、プログラムの先頭に書いておけば自動的に全関数が対象になるらしい。
・更に関数を引数にとった場合、
from collections.abc import Callable(abcはAbstruct Base Classes)
としたあと、
def executioner(func: Callable[[int, int], int]):
のようにすると、引数にした関数(ここではfunc())の引数や戻り値の型や数がチェックされるという仕掛けらしい。
・実際にどうなのかなと色々いじって遊んだあと、ざっと書いていたニューロンの動作が変になったので、調べていったら単なるスカラーのはずなのに行列が渡されているけど、エラーにもならずにそのまま突っ走っているのが確認できた。早速覚えたてのこれらを埋め込んで見たら見事に引っかかった。
・エラーメッセージが著しくわかりにくいけど、じっと読んで該当する行を見つけてじっと眺めていたら、「あっ!」な記述が見つかった。
・これを修正して改めて実行したら予定通りの結果が得られた。
2026.02.12 16:14
金利の時代
・少し暖かくなってきたな。イオンに行って記帳を済ませておく。しかし本当に金利がつく時代になったんだな。
・円が急騰ということらしいけど、まぁこれから先はもう少し円高に振れるのだろう。
・円安になると外貨預金は金利分も上がるわけで、円高のときに外貨預金した人は大喜びなのだろうな。私もほんの少しだけ・・・ガストで数回ランチできるかどうかという程度だけドルを持っているけど(そうすると他の手数料が格安になるので)、今ならドリンクバーくらいは付けられるかなという感じ。
・ただ、当然のようにRaspberryPiやらArduinoやらの値段も上がってしまうわけで、そのあたりはなんともなぁと思ったり。
・こういうときはやはり手持ちの在庫を引っ張り出さねばなというわけでもないけど、ちょっと探しものをしてあちこち引き出しを開けていたら、出てくる出てくる評価ボード。
・この際もう一回いろいろ頑張ってみるか。
2026.02.11 07:32
Pythonちょいちょい
・ぼちぼち確定申告でもしておかねばと思って通帳を眺めたら最近記帳していなかった。最近は土日祝日も記帳できたりするけど、今日は思い切り寒いし、明日にしよう。
・さて、ではというところで少しPythonのNumpy関係を少しいじりつつ、ノートにメモをとりつつというところ。今までちょっと曖昧になっていたところがスッキリしつつある感。
・しかし、Gemini+ChatGPT+Copilot(最近の使用頻度順):ジェチャコは便利で、「こう書けない?」とか「これだと駄目そうだね」とかやるとせっせと説明してくれる。もちろん、ある程度裏取りは必要ではあるけど。
・言語関係は割と良いけど、ツール関係の使い方についてはどうも同じ情報を元にしているのか、GeminiとChatGPTが同じ間違いをしてきたりするし、ライブラリ関係は古い情報のままコード生成してきて、色々やっているうちに「それは既にLegacyだから・・・」なんて言い出したりする。いや、お前が書いたコードでそれ使ってるだろと突っ込みたくもなるけど。
2026.02.10 07:59
pyqt5が必要か
・さて、ぼちぼちとやるべく、numpyとmatplotを入れて昔作ったプログラムでグラフ描画させようとしたら表示されない。
・ちょっと検索したらPyQt5を追加すれば良いらい。ということで
pip install pyqt5
・これで改めて試したら無事動作。
ーーーーー
import numpy as np
import matplotlib.pyplot as plt
def sigmoid(x):
return (1/(1+np.exp(-x)))
def relu(x):
return (np.maximum(0,x))
x = np.arange(-5.0,5.0,0.1)
#y = sigmoid(x)
y = relu(x)
plt.plot(x,y)
#plt.ylim(-0.1,1.1)
plt.show()
ーーーーー
2026.02.09 12:48
久々Python
・昨日雪がそれなりだったけど、珍しくフカフカな雪でどんどん溶けていく。こういうのをパウダースノーっていうのかな?
・久しぶりにPythonを使うか・・・と思ってちょっとリハビリモードで以前書いたものを動かそうとしたら、numpyが無いよと言われた。
・そうかそうか・・・とpip install numpyしたらなんか叱られた。
・よくわからなくて検索したら、仮想環境で動かすんだということ。言語処理系レベルで仮想環境とは一体なに?ということろで例によってお尋ねしてわかった。
・今までの一般的な言語処理系だと、インストールしたライブラリ類の種類やバージョン、パス設定などの組み合わせによって同じプログラムがちゃんと動かなかったり挙動が変わったりということが起きてしまう。
・そこで、デフォルト状態から変更・追加などをされたものをユーザが指定したディレクトリの下に格納しておいて、切り替えて使えば良いじゃないかという発想か。
・たとえば
A)数値演算したい
B)組み込みのAIを試してみたい
C)USB接続したい
D)デバイスから取り込んだグラフを描画したい
などというものがあったとき、今まではこれらに必要なライブラリ類を全部インストールした一つの開発環境になってしまっていた。
一体今回のものでは何が必要なのかわかりにくいし、 他の人が同じ環境を別に作ろうとしても難しい。
・ということで、
A)のための環境(使っているライブラリ類などの動作環境)
B)のための環境
・・・
という感じでそれぞれのフォルダにまとめて使いたい環境に切り替えて使う。pip installとかすると今使っている環境用のフォルダにインストールされるという具合。
適当なディレクトリで
python3 -m venv .venv_A
とかすると、.env_Aというディレクトリが作られて、この下に最低限必要なものが書き込まれる。pythonの環境もインストール直後のような状態になる
(ちなみに、デフォルトのシェルの状態はクリーンではなく、Linux側で必要なものがあれこれ入っているけど、activateすると、これらも全部外された、本当にクリーンな状態になる)
ここで
source .venv_A/bin/activate
とかすれば、パス設定なども含めて.venv_Aな環境に切り替わる。で、
pip install numpy
とかすると、グローバルな言語処理系。環境ではなく、.venv_Aディレクトリの下にインストールされる。
これであれこれやった後に
deactivate
とすれば、activateでセットされたパスだのなんだのは綺麗さっぱり忘れて元に戻る。もちろん、これとは別に
python3 -m venv .venv_B
source .venv_B/bin/activate
すれば、.venv_B用のクリーンな環境になる。
・で、Aの環境を引き継ぎたいとか言うことももちろんあるし、配布するときに「これが必要だよ」というのも教える必要がある。
このときは、.venv_Aをactivateして使っている状態で、
pip freeze >setup_env.txt
とかやって、deactivateして.venv_Bをactivateして環境を切り替え。そして
pip install -r setup_env.txt
なんてやれば必要なものがインストールされて環境が再現される。
・なるほどね。というところで、更にGeminiしたら「VSCodeにMicrosoftのPythonなエクステンションとJupyter Notebook Renderersを入れると良いよってことで、入れてみる。
面白いのはソースコードの中に
#%%
というのを入れると、ここがプログラムの切れ目(セクション)ということになってくる。たとえば、
#%%
import numpy as np
import matplotlib.pyplot as plt
# データを生成 (0から10までを100分割)
x = np.linspace(0, 10, 100)
y = np.sin(x)
print(x,y)
# グラフの設定
#%%
plt.plot(x, y, label='Sine Wave')
plt.title(loc="center", label="Hello Virtual Environment!")
plt.xlabel("x-axis")
plt.ylabel("y-axis")
plt.legend()
# グラフを画像として保存
#%%
plt.savefig("my_plot.png")
print("グラフを 'my_plot.png' として保存しました!")
# %%
てな具合にしてやると、#%%の上に「セルの実行」とか「以下を実行」とか出てくるので、ここをクリックすると次の#%%まで実行してくれる。
・これで実行結果(たとえばグラフ表示)がイマイチだなと思ったら、今実行したセルのコードを変更してもう一回描画のところのセルだけ実行するなんてことができる。最初から全部やりなおし・・・ではないので便利ということ。
・ということでやっと時代に少し追いつけた感じ。
2026.02.08 12:13
Mbed/MbedOS終了カウントダウン通知
・そういえば先日ARMさんから改めてメールが来ていたけど、Mbed Platform End of Life in July 2026。Mbed OSもまた同時に終了。
・だいぶ前からアナウンスはされていたから、期限迫っているよというお知らせなのだろう。改めてMbed.comに置いているものは吸い上げておいてねといっている。
・MbedOSはGitHubの方に残されてるけど、使う人は要るのだろうかな。FreeRTOSとかそっちに走るんじゃないだろうか。
・簡単なスケジューラは昔作って重宝してたなぁ。シングルステップ機能を使って実行トレースしたりして。
2026.02.07 22:34
RaspberryPiZero2WのAP化(2/8追記)
・雪が振りそうとかいうお天気で、外出を中止してちょっと時間ができたので、キーボードの上に敷く布の作成
・といっても、四角く切って端を折ってミシンがけするだけなので簡単。以前買っていた生地もでてきたので2つ作って1時間もかからなかった。
・というところで、以前買った3Dプリンタを外部につながらないLAN・・・ローカルエリアなネットワークだけで使おうということでルーターを考えていたのだけど、考えたらRaspberryPi Zero2Wもアクセスポイント化できるだろう。
・ということで、Geminiに聞きながらあれこれ設定をいじっていたらできた。スマホやPCからSSIDを指定して接続し、自分で決めたパスワードを入れるとちゃんと接続された。
・これで、
Bambu Studio用のLinux仮想マシンを作る
USB-WiFiドングルをPCに取り付け
USB-WiFiだけをBambu Studio仮想マシンに接続する
とやれば、あとはスッキリいける・・・はずだし、BambuStudioが勝手に外に出ていくこともできない・・・はず。
ーーー
2/8追記:
ということで、設定方法のメモを残しておこう。RaspberryPiのIPアドレスは、192.168.50.1で、DHCPで192.168.50.100-200を割り当てることを想定
これでうまく動けばRaspberryPiのAPに接続して
ssh (user名)@192.168.50.1
とかやってユーザのパスワードを入れてsshで遊ぶこともできる
LANアダプタを追加してルータ化する手もあるけども、それはまた後日としよう。
・必要なもの
sudo apt install hostapd
sudo apt install dnsmasq
あとsystemd-networkdも要るけど、既に入ってる?(失念)
sudo systemctl enable sshもついでにやっておく
・/etc/hostapd/hostapd.confを作成。中身は
interface=wlan0
ssid=(SSIDの文字列)
hw_mode=g
channel=6
ieee80211n=1
wmm_enabled=0
auth_algs=1
wpa=2
wpa_passphrase=(パスワード文字列)
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
ctrl_interface=/var/run/hostapd
ctrl_interface_group=0
・/etc/default/hostapdに追記
DAEMON_CONF="/etc/hostapd/hostapd.conf"
・/etc/systemd/network/10-wlan0.networkを作成(固定IPで作成)。中身は
[Match]
Name=wlan0
[Network]
Address=192.168.50.1/24
ConfigureWithoutCarrier=yes
systemd-networkdの有効化
sudo systemctl enable systemd-networkd
sudo systemctl start systemd-networkd
(動作確認)
systemctl status systemd-networkd
active(runningならOK)
・/etc/dnsmasq.confの後ろに追記
interface=wlan0
dhcp-range=192.168.50.100,192.168.50.200,255.255.255.0,24h
(孤立LANなので下記は無意味だけど入れておいても良い)
domain-needed (ドメイン名の無い名前をDNSに問い合わせしない)
bogus-priv (ローカルのIP逆引き問い合わせをしない)
・hostapdとdnsmasqを起動
sudo systemctl unmask hostapd
sudo systemctl enable hostapd dnsmasq
sudo systemctl restart hostapd dnsmasq
・特定のデバイスに固定IPを割り振りたい時は
/etc/dnsmasq.confに下記のような具合に追記する(最後につけるのはデバイスの名称:省略可能だけど、つけるとping SmartPhoneみたいに名前が使える)
dhcp-host=aa:bb:cc:dd:ee:ff,192.168.50.10,SmartPhone
(DHCPの払い出し範囲を避けること)
書き換えたら
sudo systemctl restart dnsmasq
でdnsmasqの再起動も忘れずに
・動作状態確認コマンド集
・AP(アクセスポイント)が動いているか(hostapd)
systemctl status hostapd
=>Active: active (running)
になっていればOK
・APのインターフェースの状態
iw dev
=>Interface wlan0
type AP
ならOK
・hostapdログ
journalctl -u hostapd -e
=>wlan0: AP-ENABLED
ならOK
・DHCP(dnsmasq)が動いているか
systemctl status dnsmasq
・DHCP払い出しログ
journalctl -u dnsmasq -e
=> DHCPDISCOVER(wlan0)
DHCPOFFER(wlan0)
DHCPREQUEST(wlan0)
DHCPACK(wlan0)
・RaspberryPi自身のIP
ip addr show wlan0
hostname ーI でも良い
・接続している端末一覧
arp -a
ip neigh でも良い
・接続中のクライアントの情報(WiFiレベル)
iw dev wlan0 station dump
・まとめて確認
systemctl --no-pager status hostapd dnsmasq
ip addr show wlan0
iw dev wlan0 station dump
2026.02.06 08:08
キーボードの上に敷く布
・さて、そんなところでキーボードの上に敷いている布がだいぶ汚れてきた。以前コーヒーをこぼして痛い目にあってから薄い布を敷いて使っている(どうせ見てないし)。といっても、100均で買った布の端をミシンでかがっただけのものだけど一枚しかなくて洗い替えがないのでずっと使っていたらだいぶくすんできた感じ。
・ということで、改めて100均へ。30cmX25cmというのがあった。なんだか昭和なセンスの柄だけど大きさがちょうど良さそうだなと思って買ってきたらなんか大きい正方形。実は30cmX30cmだったというオチ。
・やはりちょっと大きすぎるな。ちょっと時間を見てサイズ合わせて端もちゃんと始末しておこう。
2026.02.05 18:15
Tnx.Gemini
・気がつくとsudo apt installでエラーが出てしまうという現象で困っていたのだけど、エラーメッセージを見てもよくわからないのでダメ元でGeminiに投げてみた。
***
install-info (7.1-3build2) を設定しています ...
/usr/sbin/update-info-dir: 2: /etc/environment: SALT_LICENSE_SERVER:
not found
dpkg: パッケージ install-info の処理中にエラーが発生しました (--configure):
installed install-info package post-installation script subprocess returned err or exit status 127
処理中にエラーが発生しました:
install-info
E: Sub-process /usr/bin/dpkg returned an error code (1)
***
・Geminiの回答は
結論から言うと、/etc/environment という設定ファイルの内容が壊れている(書き方を間違えている)ことが原因です。
ということだった。じゃあ、/etc/environmentは?ということで開いたら
***
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin"
SALT_LICENSE_SERVER = "/home/(中略)/Download/Altera_Intel/Questa/LR-278536_License.dat"
***
となっている。これをそのまま投げたら瞬間回答。
原因がはっきりしました!/etc/environment の書き方が、ほんの少しだけルールから外れています。
このファイルはシェルスクリプトではなく「単純な変数割り当て」のみを受け付けるため、=(イコール)の前後にスペー
スを入れてはいけません。
修正内容
現在の状態: SALT_LICENSE_SERVER = "/home/..."(スペースがある)
修正後の状態: SALT_LICENSE_SERVER="/home/..."(スペースを消す)
ということ。そういうことか。スペースを消去して
sudo dpkg --configure -a
すれば良いよということだったので、やってみたら無事apt installできるようになってきた。
珍しくちゃんと役に立ったな。
2026.02.04 22:26
ドキュメントできた&投票
・昨日の続き。
・なんか格好良くないけどとりあえずドキュメントもできたので、プログラム類をまとめてアーカイブ。
・ちょっとサイズが大きいなぁということで、GoogleDrive経由でお渡しすることにした。まぁ良いだろう。
・なんとなく一息ついた感もあって、期日前投票に行く。昔は開票速報がなかなか面白かったけど、近年は当確があまりにも早く出すぎて面白くないけどもね。
・イオンが会場というのはなかなか利便性高い。今回は本当に選択肢がなくて消去法でまぁここかというところ。