CUBE SUGAR CONTAINER

技術系のこと書きます。

Python: イロレーティングが収束する様子を眺めてみる

イロレーティング (Elo Rating) は 2 人のプレイヤーが対戦して勝敗を決める競技において、プレイヤーの実力を数値にする手法のひとつ 1。 歴史のある古典的な手法だけど、現在でも様々な競技のレーティングに用いられている。 今回は、そんなイロレーティン…

Python: LightGBM v4.0 の CUDA 実装を試す

LightGBM のバージョン 4.0.0 が 2023-07-14 にリリースされた。 このリリースは久しぶりのメジャーアップデートで、様々な改良が含まれている。 詳細については、以下のリリースノートで確認できる。 github.com リリースの大きな目玉として CUDA を使った…

pwgen(1) でパスワードを生成する

コマンドラインで使えるパスワードジェネレータのひとつに pwgen(1) がある。 Unix 系の環境であれば、パッケージマネージャからインストールできることが多い。 今回は、そんな pwgen(1) の使い方について見ていく。 使った環境は次のとおり。 $ cat /etc/l…

Lenovo ThinkCentre M75q Tiny Gen2 を買ってメモリとストレージを交換してみた

とある事情から Windows 11 の動作検証をするためのマシンが欲しくなった。 また、検証したい機能は仮想化に関係するので物理的なマシンがあった方が便利そう。 ついでに、我が家には 10 年以上前に購入したミニタワーのデスクトップマシンが残っていたので…

ネットワークスペシャリスト試験に合格した

今回 2023 年春期のネットワークスペシャリスト試験を受験して合格できた。 後から振り返ることができるように、受験に関する諸々について書き留めておく。 受験のモチベーションとしては、ネットワークについて広く浅く復習しておきたい気持ちになったため…

Linux の Network Namespace と dhcpcd / dnsmasq で DHCPv4 を試す

ISC DHCP 1 のメンテナンスが 2022 年末で終了してしまった。 ISC によると DHCP サーバの実装については Kea DHCP 2 への移行が推奨されている。 ただ、ISC DHCP には DHCP クライアントの実装も含まれていた。 ところが Kea DHCP には DHCP クライアントが…

BIRD と Network Namespace で BGP-4 を使ったダイナミックルーティングを試す

BIRD 1 (The BIRD Internet Routing Daemon) はルーティングプロトコルを実装した OSS のひとつ。 今回は、そんな BIRD を Network Namespace と組み合わせて BGP-4 を使ったダイナミックルーティングを設定をしてみる。 なお、現在 (2023-06-22) の BIRD は…

BIRD と Network Namespace で OSPFv2 を使ったダイナミックルーティングを試す

BIRD 1 は The BIRD Internet Routing Daemon の略で、ルーティングプロトコルを実装した OSS のひとつ。 今回は、そんな BIRD を Network Namespace と組み合わせて OSPFv2 を使ったダイナミックルーティングを設定をしてみる。 なお、現在 (2023-06-17) の…

BIRD と Network Namespace で RIPv2 を使ったダイナミックルーティングを試す

BIRD 1 は The BIRD Internet Routing Daemon の略で、ルーティングプロトコルを実装した OSS のひとつ。 今回は、そんな BIRD を Network Namespace と組み合わせて RIPv2 を使ったダイナミックルーティングを設定をしてみる。 なお、現在 (2023-06-16) の …

BIRD と Network Namespace でスタティックルーティングを試す

BIRD 1 は The BIRD Internet Routing Daemon の略で、ルーティングプロトコルを実装した OSS のひとつ。 今回は、そんな BIRD を Network Namespace と組み合わせてスタティックルーティング (静的経路制御) の設定をしてみる。 なお、今回試す内容は ip(8)…

Python: pandas-profiling は ydata-profiling にリネームされた

Python の EDA 用フレームワークとして有名な pandas-profiling は ydata-profiling に名前が変更された。 まだ意外と知られていないようなので、今回はそれについて書いてみる。 使った環境は次のとおり。 $ sw_vers ProductName: macOS ProductVersion: 13…

Linux の Network Namespace で L2TP (IPsec なし) を試す

今回は L2TP の LAC (L2TP Access Concentrator) と LNS (L2TP Network Server) を Linux の Network Namespace の環境で動かしてみる。 L2TP はリモートアクセス VPN でよく使われるプロトコルの一つ。 ただし、今回は IPsec を組み合わせないため、単なる…

Linux の Network Namespace で PPPoE を試す

今回は PPPoE (PPP over Ethernet) のサーバとクライアントを Network Namespace の環境で動かしてみる。 PPPoE は、その名のとおり PPP (Point-to-Point Protocol) を Ethernet で使えるようにしたもの。 NTT 東西が提供するブロードバンドサービスのフレッ…

Python: scikit-learn の LabelEncoder を説明変数の変換に使うのは誤り

scikit-learn の LabelEncoder を説明変数の変換に使っている例はたくさん見つかる。 しかし、実は本来 LabelEncoder は目的変数の変換に使うことが想定されていることは、あまり知られていない。 これは公式のドキュメントで確認できる。 scikit-learn.org …

strongSwan の IPsec VPN を Network Namespace で試す (Route-based / VTI デバイス)

strongSwan は IPsec VPN を構成するのに用いられるソフトウェア。 今回は、その strongSwan を Network Namespace で作ったネットワーク上で動かしてみる。 動作モードとしては VTI (Virtual Tunnel Interface) デバイスを使った Route-based を利用する。 …

WireGuard の VPN を Linux の Network Namespace で試す

WireGuard は VPN を構成するための一連の実装と通信プロトコル。 実装のコードベースが小さく、他の VPN ソフトウェアと比べて設定方法がシンプルという特徴がある。 今回は、その WireGuard を Linux の Network Namespace と一緒に試してみる。 使った環…

Python: Pandas 2 系ではデータ型のバックエンドを変更できる

Pandas の 2 系から、新たにデータ型のバックエンドという考え方が導入された。 これは、端的にいうと DataFrame のデータをどのような形式で持つかを表している。 たとえば Pandas 2.0.0 の時点では、次の 3 つからバックエンドを選ぶことができる。 NumPy …

Python: Polars で文字列が省略される文字数を変更する

Polars は DataFrame や Series に含まれる文字列が、デフォルトでは 32 文字までしか表示されず、それを超えると省略されてしまう。 今回は、その挙動を変更する方法について書く。 結論から先に述べると pl.Config.set_fmt_str_lengths() を使うことで、省…

Python: Polars と NumPy / SciPy の関数を組み合わせて使う

Polars を使って数値を加工しようとすると、数学に関する API がさほど多くないことに気づく。 そうしたときに、最初に思いつくのは Series オブジェクトを NumPy 配列に変換した上で処理する方法かもしれない。 しかし、実際には Polars の Expr オブジェク…

Apple Silicon の macOS にコマンドラインで Rosetta 2 をインストールする

Apple の Rosetta 2 は、x86 アーキテクチャ向けにビルドされた macOS のアプリケーションを Apple Silicon の環境で実行できるようにするソフトウェア。 今回は、そんな Rosetta 2 をコマンドラインでインストールする方法について書いておく。 使った環境…

Python: CatBoost をいくつかの環境でベンチマークしてみる

今回は GBDT (Gradient Boosting Decision Tree) フレームワークのひとつである CatBoost について、いくつかの環境で同一のソースコードを使って学習にかかる時間を比較してみた。 きっかけは、最近入手した Apple M2 Pro を搭載した Mac mini が、どれくら…

Python: Polars の DataFrame をゼロコピーで Pandas の DataFrame に変換する

Polars の DataFrame は to_pandas() メソッドを使うことで Pandas の DataFrame に変換できる。 このとき、デフォルトではメモリのコピーが生じる。 pola-rs.github.io ただし、オプションとして use_pyarrow_extension_array=True を渡すとゼロコピーで変…

Python: Polars で各種エンコーダを実装したライブラリ「Shirokumas」を作った

最近は Polars が気に入っていて、主にプライベートで使っている。 ただ、エコシステムという観点では Pandas に比べて発展途上の段階にあると思う。 そこで、今回は発展の一助として「Shirokumas」というライブラリを作ってみた。 github.com どんなライブ…

Python: DuckDB と Polars を組み合わせて使う

DuckDB のバージョン 0.7 で Polars とのインテグレーションが強化された。 たとえば Polars の DataFrame に対して DuckDB の Python API で直接クエリを発行できるようになったらしい。 また、DuckDB で実行したクエリの結果を Polars の DataFrame に変換…

k3d (k3s) を使って Ingress と NetworkPolicy を検証する

Kubernetes を手元で検証しようとすると CNI (Container Network Interface) プラグインの機能が障壁になることがある。 たとえば kind を使う場合はデフォルトで kindnetd という CNI プラグインがインストールされる。 しかし、この CNI プラグインは動作…

Python: LightGBM の学習率と精度および最適なイテレーション数の関係について

勾配ブースティング決定木 (Gradient Boosting Decision Tree; GBDT) では、以下が経験則として知られている。 学習率 (Learning Rate) を下げることで精度が高まる 一方で、学習にはより多くのイテレーション数 (≒時間) を必要とする しかしながら、上記が…

Python: Polars で行・列が省略されないようにする

今回は Python のデータフレームライブラリの Polars で、データフレームを表示するときに行と列が省略されないようにする方法について。 結論から先に述べると、省略したくないときは pl.Config.set_tbl_cols() と pl.Config.set_tbl_rows() に負の整数 (た…

OpenSSH で過去に作った鍵の種類や長さを確かめる

今回は OpenSSH で過去に作った鍵の種類や長さを確認する方法について。 結論から先に述べると ssh-keygen(1) の -l オプションと -f オプションを組み合わせれば良い。 使った環境は次のとおり。 $ cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE…

Target Encoding のスムージングについて

Target (Mean) Encoding の出典は、2001 年の ACM SIGKDD Explorations Newsletter, Volume 3, Issue 1 に掲載された以下の論文らしい。 https://dl.acm.org/doi/10.1145/507533.507538 この論文には Target Encoding のスムージングに関する詳しい記述があ…

Python: PyTorch でバックプロパゲーションが上手くいかない場所を自動で見つける

PyTorch を使っていると、はるか遠く離れた場所で計算した結果に nan や inf が含まれることで、思いもよらない場所から非直感的なエラーを生じることがある。 あるいは、自動微分したときにゼロ除算が生じるようなパターンでは、順伝搬の結果だけ見ていても…