.NET 8 の新機能「時間抽象化」うれしいけど微妙

「時間抽象化」ってパッと見なんのことかわかりませんでしたが、DateTime.nowとか時関係の実装のテストで困るやつの対応なのですね。おおっ、それはうれしい。

「時間抽象化」

www.infoq.com

まだ公式ドキュメントには使用例とかがほとんど無くてちょっとわからないのですが、どうやら使うには結局新しい"TimeProvider"クラスを使うように既存の実装を書き換えねばならないみたい。時間係の実装のUnitTest対策としては正攻法でしょうが、MSがやるなら一歩突っ込んだ実装も期待したかったです。

MacBook Proでkernel_taskがCPU食って遅い件

最近、自分のMacBook Pro(16inch 2019)が動作がモッサリしてきた気がしていた。アクティビティモニターで見るとkernel_taskがCPUを食っているようだ。ググったら、どうもCPU高温ぽい。季節的に暑くなってきたせいもあるのかな。下の記事「MacBook Pro 2019 16インチ 裏蓋の外し方 ファン掃除の方法」を参考にさせていただいて、MacBook Proの蓋を開けてファン掃除した。

itxdancer.com

今使っているMacBook Proは買ってから蓋を開けたことなかったのですが、開けてみたら、やはりファンがホコリまみれでした...。
上の記事を参考にして開けられましたが、見てなかったら開けられなかったかも。ちょっとコツがいります。

Polarsで全てnullの列を削除する

[edit 2023/12/06]
MSのBing Chat改めCopilotに聞いたら、最初エラーになるコードだったのですが、エラーメッセージを教えたらちゃんと直してくれて、こんなコード書いてくれました。

import polars as pl

# データフレームを作成
df = pl.DataFrame({
    "col1": [1, 2, None],
    "col2": [None, None, None],
    "col3": [None, 4, 5]
})

# 全ての値がnullの列を削除
df = df.drop([col for col in df.columns if df[col].is_null().all()])

print(df)

[edit 2023/07/11]
この記事、元は違うやり方で書いたのですが、本家のDataFrame.drop_nulls()リファレンス polars.DataFrame.drop_nulls — Polars documentation に、全てnullの列を削除するコード例があって、それを真似たやり方だとこんな感じです。こっちの方が意図がわかりやすい。

# 全てnullの列を削除
def drop_null_columns(df):
    return df.select(
        [col.name for col in df if not (col.null_count() == df.height)]
    )

df = ...
df.pipe(drop_null_columns)


[当初書いたやつ]
Pandasだとこんな感じのことをしたい。

df.dropna(how='all', axis='columns')

Polarsではズバリのメソッドは無いみたい。なのでこんな感じかな。

# 全てnullの列を削除
# 参考サイト
# https://stackoverflow.com/questions/75446886/selecting-columns-based-on-a-condition-in-polars
# https://stackoverflow.com/questions/74295124/polars-selecting-all-columns-without-nans

def drop_null_columns(df):
    return df.select(
        [col.name for col in df.select(~pl.all().is_null().all()) if col.all()]
    )

df = ...
df.pipe(drop_null_columns)

Pandas2.0に移行しようと思ったけど、結局Polarsに移行した。

Pandas 2.0来た! 自作コードでPandas使っているところを2.0を使うようにしよう!

What’s new in 2.0.0 (April 3, 2023) — pandas 2.1.0.dev0+1270.gaf76d785cc documentation

と思って調べていたところ、Pandasと同じようにDataFrameを扱う「Polars」が良さそうに思えてきたので使ってみた。

この辺りなど参考にさせていただきつつ使ってみた。

qiita.com

dev.classmethod.jp

使ってみたところ良かったので、自作コードでこれまでPandasを使っていたところはPolarsに移行することにした。自分が使っている範囲ではPolarsで置き換えられそう。スピードも速いぞ。Pandasよりコードが短くシンプルになる場合もあるけど逆の場合もある。でも、私がPandasに感じていた「The Zen of Python」の特に "There should be one-- and preferably only one --obvious way to do it." の真逆を行っている感。それがPolarsではだいぶ緩和される。Pandasは同じことをやるのに異なる方法がありすぎると思う。あとPandasのIndexはPolarsには無くて最初"え〜無いのぉ〜"と思ったけど、結局私が使っている範囲ではIndex無くても別に平気だった。

Polarsでちょっと残念だったところは、read_csv()は複数csvファイルをワイルドカードで読み込めるのにjson用のread_ndjson()には同様の機能が無かったところ。  scan_ndjson()のほうはファイル名にワイルドカード指定で複数 jsonファイルが読めました。

Polars使ってみたら良い感じ。今後はPolarsを使っていこう。

他力本願でラズパイをbullseyeにした

ラズパイのOSを今時のbullseyeにしたい。64bit化もしたい。参考になるサイトを探しまくって、いざ実行だ。

今回は別のSDメディアを用意してクリーンインストールする。 こちらなどを参考にやった。 Raspberry Pi OS Lite(64-bit) ヘッドレスインストール(bullseye編) - Qiita

早速sshでつなごうとして、こちらと同じ現象になるので参考にして解決できた。 https://www.niandc.co.jp/sol/tech/date20150729_507.php

SSHは鍵認証にしたい。またまた参考になりそうなところを探してやったらできた。公開鍵のコピーはssh-copy-idを使うのが便利だが、それ知らないで普通にググると公開鍵ファイルをscpでコピーする方法でやっちゃうね。ssh-copy-idを使うのが普及すると良いのですが。あと/etc/ssh/sshd_configでパスワード認証を止めておきます。 [ssh] 公開鍵認証を使って RaspberryPi4 に ssh 接続する - Qiita

ラズパイ上でPythonでpandasを使っているのですが、pandasはpipじゃなくaptで入れた方が良さそう。 ラズパイにpandasをインストールする方法 – 半力投球

他力本願でコンプリート!

C#をリハビリ 「プログラミングC# 第8版」

久々にC#をリハビリだ。最近はなるべく紙の本を買わないようにしているのだが、あえて前に買った本の新しい版を買おう。前回第7版を買ったのは8年前だ、さぞ版も進んだろう。Amazonで検索して...あれ...まだ第8版...。第7版と第8版の間隔が8年! この業界で8年は永遠の時間のような...。でもまあ新版があって良かった。(そもそもプログラミングを書籍で学ぼうという考えが古いのかもね...)
とにかく、このありをまとめてポチッと一気買い。