サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
GPT-4o
blog.amedama.jp
何らかの処理を定期的に実行したくなる場面は多い。 トラディショナルなやり方であれば、仮想マシンを用意して cron などで処理を呼び出すと思う。 もちろん、それでも良いんだけど、よりシンプルに実装したい気持ちが出てくる。 具体的にはマシンの管理をなくした、いわゆるサーバレス・コンピューティングで楽がしたくなる。 Google Cloud であれば、このようなニーズに対して以下のサービスを組み合わせるのが良いようだ。 Cloud Functions サーバレスで特定の処理 (関数) を呼び出すためのサービス Cloud Scheduler フルマネージドな cron ジョブを提供するサービス Cloud Pub/Sub 非同期のスケーラブルなメッセージングを提供するサービス 利用の流れは次のとおり。 まず、Cloud Functions で定期的に実行したい何らかの処理を定義する。 その際、
PyTorch v1.12 以降では、macOS において Apple Silicon あるいは AMD の GPU を使ったアクセラレーションが可能になっているらしい。 バックエンドの名称は Metal Performance Shaders (MPS) という。 意外と簡単に使えるようなので、今回は手元の Mac で試してみた。 使った環境は次のとおり。 GPU が 19 コアの Apple M2 Pro を積んだ Mac mini を使用している。 $ sw_vers ProductName: macOS ProductVersion: 14.4.1 BuildVersion: 23E224 $ sysctl machdep.cpu.brand_string machdep.cpu.brand_string: Apple M2 Pro $ pip list | grep -i tor
AdGuard Home は、インターネット広告や端末のトラッキングなど 1 をブロックすることを目的とした OSS の DNS サーバ (プロキシ) のひとつ。 フィルタリングルールを入れた状態で DNS サーバとして利用することで、端末に依存しないフィルタリング 2 が可能になる。 今回は、そんな AdGuard Home を Raspberry Pi にインストールして試してみた。 使った環境は次のとおり。 $ cat /etc/*-release PRETTY_NAME="Debian GNU/Linux 12 (bookworm)" NAME="Debian GNU/Linux" VERSION_ID="12" VERSION="12 (bookworm)" VERSION_CODENAME=bookworm ID=debian HOME_URL="https://www.deb
Python の EDA 用フレームワークとして有名な pandas-profiling は ydata-profiling に名前が変更された。 まだ意外と知られていないようなので、今回はそれについて書いてみる。 使った環境は次のとおり。 $ sw_vers ProductName: macOS ProductVersion: 13.4 BuildVersion: 22F66 $ python -V Python 3.10.12 $ pip list | egrep ".*-profiling" pandas-profiling 3.6.6 ydata-profiling 4.2.0 もくじ もくじ 下準備 パッケージ名の変更について 変更点について 下準備 動作を確認するために、リネームされる前の名前を使って pandas-profiling をインストールしておこう。 $ pip i
これまで scikit-learn が提供する TransformerMixin の実装 1 は、出力に NumPy 配列を仮定していた。 そのため、pandas の DataFrame を入力しても出力は NumPy 配列になってしまい、使い勝手が良くないという問題があった。 この問題は、特に Pipeline や ColumnTransformer を使って処理を組むときに顕在化しやすい。 しかし、scikit-learn v1.2 で set_output API が追加されたことで、この状況に改善が見られた。 そこで、今回は set_output API の使い方について書いてみる。 使った環境は次のとおり。 $ sw_vers ProductName: macOS ProductVersion: 13.6.2 BuildVersion: 22G320 $ python -V Py
今回は Linux の Network Namespace で作ったネットワーク上で Libreswan を動かして IPsec VPN を試してみる。 なお、Libreswan には、いくつかの動作モードがある。 今回は、その中でも Route-based VPN using VTI と呼ばれる動作モードを利用する。 これは VTI (Virtual Tunnel Interface) というインターフェイスを作成して、そこに明示的な経路を指定することで一致するパケットを暗号化するというもの。 使った環境は次のとおり。 $ cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=22.04 DISTRIB_CODENAME=jammy DISTRIB_DESCRIPTION="Ubuntu 22.04.3 LTS" $ uname -
今回は Multipass で作った仮想マシン上で X Window System のアプリケーションを使う方法について。 やり方としては、Multipass の仮想マシンに ssh(1) を使ってログインできるようにした上で X11 Forwarding すれば良い。 使った環境は次のとおり。 $ sw_vers ProductName: macOS ProductVersion: 12.4 BuildVersion: 21F79 $ uname -srm Darwin 21.5.0 x86_64 $ multipass version multipass 1.10.0+mac multipassd 1.10.0+mac もくじ もくじ 下準備 公開鍵を仮想マシンに登録する ssh(1) で仮想マシンにログインする X Window System のアプリケーションを実行する 下準備 ま
Luigi は、Python を使って実装された、バッチ処理のパイプラインを扱うためのフレームワーク。 Luigi でパイプラインを定義するときは、基本的には個別のタスクを依存関係でつないでいくことになる。 このとき、扱う処理によってはパイプラインは長大になると共に扱うパラメータの数も増える。 そうすると、依存関係で上流にあるタスクに対して、どのようにパラメータを渡すか、という問題が生じる。 この問題は、公式のドキュメントではパラメータ爆発 (parameter explosion) と表現されている。 luigi.readthedocs.io 今回は、このパラメータ爆発問題を解決する方法について。 なお、基本的には上記のドキュメントに解決方法が書いてあるので、そちらを読むでも良い。 使った環境は次のとおり。 $ sw_vers ProductName: Mac OS X ProductV
今回は OpenSSH で過去に作った鍵の種類や長さを確認する方法について。 結論から先に述べると ssh-keygen(1) の -l オプションと -f オプションを組み合わせれば良い。 使った環境は次のとおり。 $ cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=22.04 DISTRIB_CODENAME=jammy DISTRIB_DESCRIPTION="Ubuntu 22.04.1 LTS" $ uname -srm Linux 5.15.0-58-generic x86_64 $ ssh -V OpenSSH_8.9p1 Ubuntu-3ubuntu0.1, OpenSSL 3.0.2 15 Mar 2022 もくじ もくじ 下準備 動作確認用の公開鍵ペアを生成する 鍵の種類や長さを確認する 別の鍵の種類でも確認
今回は Google Cloud の Cloud Functions で実行した処理の中で Cloud Storage にオブジェクトを保存する方法について。 Cloud Functions で実行した何らかの処理の成果物を保存する先として Cloud Storage を使うイメージになる。 操作は、基本的に Google Cloud SDK の gcloud コマンドから実施する。 なお、操作の対象となる Google Cloud API が有効化されていない場合には、別途有効化するかを確認する表示が出ることもある。 使った環境は次のとおり。 $ sw_vers ProductName: macOS ProductVersion: 13.5 BuildVersion: 22G74 $ gcloud version Google Cloud SDK 442.0.0 bq 2.0.96 co
イロレーティング (Elo Rating) は 2 人のプレイヤーが対戦して勝敗を決める競技において、プレイヤーの実力を数値にする手法のひとつ 1。 歴史のある古典的な手法だけど、現在でも様々な競技のレーティングに用いられている。 今回は、そんなイロレーティングをモンテカルロ法で作成した擬似的な対戦データを元に計算してみる。 使った環境は次のとおり。 $ sw_vers ProductName: macOS ProductVersion: 13.5 BuildVersion: 22G74 $ python -V Python 3.10.12 $ pip list | grep -i matplotlib matplotlib 3.7.2 もくじ もくじ 下準備 サンプルコード 下準備 レーティングの推移を可視化するために、あらかじめ Matplotlib をインストールしておく。 $ pi
TrueSkill は 2 人以上のプレイヤーまたはチームが対戦して勝敗を決める競技において、プレイヤーの実力を数値にする手法のひとつ。 TrueSkill は Microsoft が開発して特許や商標を保持している。 そのため、アルゴリズムを商用で利用するためには同社からライセンスを受ける必要がある。 なんでも Xbox のゲームでプレイヤーの実力を数値化して、適正なマッチングをするために使われているらしい。 同種のレーティングアルゴリズムとして有名なイロレーティング (Elo Rating) に比べると、次のようなメリットがある。 1 vs 1 以外の競技にも使える レーティングの収束が早い レーティングの不確実性が得られる なお、今回のエントリは以下のレーティングアルゴリズムを TrueSkill にしたバージョンとなっている。 blog.amedama.jp 使った環境は次のとおり
LightGBM のバージョン 4.0.0 が 2023-07-14 にリリースされた。 このリリースは久しぶりのメジャーアップデートで、様々な改良が含まれている。 詳細については、以下のリリースノートで確認できる。 github.com リリースの大きな目玉として CUDA を使った学習の実装が全面的に書き直されたことが挙げられる。 以前の LightGBM は、GPU を学習に使う場合でも、その計算リソースを利用できる範囲が限られていた。 それが、今回の全面的な刷新によって、利用の範囲が拡大されたとのこと。 ただし、PyPI で配布されている Linux 向け Wheel ファイルは CUDA での学習に対応していない。 対応しているのは CPU と、GPU でも OpenCL の API を使ったもの。 そのため、もし CUDA を使った学習を利用したい場合には自分で Wheel を
BIRD 1 は The BIRD Internet Routing Daemon の略で、ルーティングプロトコルを実装した OSS のひとつ。 今回は、そんな BIRD を Network Namespace と組み合わせてスタティックルーティング (静的経路制御) の設定をしてみる。 なお、今回試す内容は ip(8) を使えば一行のコマンドラインで実行できるくらいシンプルなものになっている。 つまり、ごく単純な例で BIRD の基本的な使い方を確認する側面が強い。 現在 (2023-06-15) の BIRD はバージョン 1 系と 2 系が平行してメンテナンスされているが、今回使うのはバージョン 2 系である。 使った環境は次のとおり。 $ cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=22.04 DISTRIB_COD
DuckDB のバージョン 0.7 で Polars とのインテグレーションが強化された。 たとえば Polars の DataFrame に対して DuckDB の Python API で直接クエリを発行できるようになったらしい。 また、DuckDB で実行したクエリの結果を Polars の DataFrame に変換することもできる。 ユースケースとしては、たとえばすべてインメモリで扱うのが辛くなったときに読み書きする先を DuckDB に切り替えるなどが考えられる。 あるいは、データの加工をなるべく SQL でやりたい場合にもマッチしそうだ。 今回は、その機能を実際に試してみることにする。 使った環境は次のとおり。 $ sw_vers ProductName: macOS ProductVersion: 13.2.1 BuildVersion: 22D68 $ python -V
BIRD 1 は The BIRD Internet Routing Daemon の略で、ルーティングプロトコルを実装した OSS のひとつ。 今回は、そんな BIRD を Network Namespace と組み合わせて RIPv2 を使ったダイナミックルーティングを設定をしてみる。 なお、現在 (2023-06-16) の BIRD はバージョン 1 系と 2 系が平行してメンテナンスされているが、今回使うのはバージョン 2 系である。 今回のエントリは、以下のエントリの RIPv2 を使ったバージョンになっている。 そのため、こちらに先に目を通しておくと内容を理解しやすい。 blog.amedama.jp 使った環境は次のとおり。 $ cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=22.04 DISTRIB_CODE
今回は L2TP の LAC (L2TP Access Concentrator) と LNS (L2TP Network Server) を Linux の Network Namespace の環境で動かしてみる。 L2TP はリモートアクセス VPN でよく使われるプロトコルの一つ。 ただし、今回は IPsec を組み合わせないため、単なるトンネリングプロトコルとしての検証になる。 LAC は接続を開始するクライアント、LNS は接続を待ち受けるサーバと考えれば良い。 使った環境は次のとおり。 $ cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=22.04 DISTRIB_CODENAME=jammy DISTRIB_DESCRIPTION="Ubuntu 22.04.2 LTS" $ uname -srm Linux 5
scikit-learn の LabelEncoder を説明変数の変換に使っている例はたくさん見つかる。 しかし、実は本来 LabelEncoder は目的変数の変換に使うことが想定されていることは、あまり知られていない。 これは公式のドキュメントで確認できる。 scikit-learn.org 上記から一部を引用する。 This transformer should be used to encode target values, i.e. y, and not the input X. このように、入力として想定されているのが本来は目的変数であることが読み取れる。 ようするに Iris データセットでいう setosa とか versicolor を 0 とか 1 に変換するのが本来の目的ということ。 メソッドの引数名を見ても X ではなく y になっている。 なので Pipelin
WireGuard は VPN を構成するための一連の実装と通信プロトコル。 実装のコードベースが小さく、他の VPN ソフトウェアと比べて設定方法がシンプルという特徴がある。 今回は、その WireGuard を Linux の Network Namespace と一緒に試してみる。 使った環境は次のとおり。 $ cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=22.04 DISTRIB_CODENAME=jammy DISTRIB_DESCRIPTION="Ubuntu 22.04.2 LTS" $ uname -srm Linux 5.15.0-69-generic x86_64 もくじ もくじ 下準備 ネットワークを用意する WireGuard で VPN を構成する 動作を確認する 下準備 あらかじめ必要なパッケージ
Pandas の 2 系から、新たにデータ型のバックエンドという考え方が導入された。 これは、端的にいうと DataFrame のデータをどのような形式で持つかを表している。 たとえば Pandas 2.0.0 の時点では、次の 3 つからバックエンドを選ぶことができる。 NumPy (デフォルト) NumPy Nullable PyArrow 何も指定しないときに選ばれるデフォルトの NumPy は 1 系と使い勝手が変わらない。 このエントリでは、バックエンドを切り替えたときに何が起こるのかを解説する。 また Pandas の内部実装についても軽く紹介する。 使った環境は次のとおり。 $ sw_vers ProductName: macOS ProductVersion: 13.3 BuildVersion: 22E252 $ python -V Python 3.10.11 $ pi
最近は Polars が気に入っていて、主にプライベートで使っている。 ただ、エコシステムという観点では Pandas に比べて発展途上の段階にあると思う。 そこで、今回は発展の一助として「Shirokumas」というライブラリを作ってみた。 github.com どんなライブラリかというと、現時点の機能では Pandas の category_encoders 1 のサブセットに相当する。 より具体的には、scikit-learn のスタイルで書かれた特徴量抽出をするための基本的なエンコーダを実装してある。 特徴としては、同じ処理を完了するまでにかかる時間が短いこと。 Pandas のエコシステムで使われるフレームワークとパフォーマンスを比較したグラフを以下に示す。 グラフから、比較対象の概ね 1/10 以下の時間で処理を完了できることが分かる。 詳細については、このエントリの後半に記述
Kubernetes を手元で検証しようとすると CNI (Container Network Interface) プラグインの機能が障壁になることがある。 たとえば kind を使う場合はデフォルトで kindnetd という CNI プラグインがインストールされる。 しかし、この CNI プラグインは動作する上で最低限の機能しか有していない。 そのため、Ingress リソースや NetworkPolicy リソースはデフォルトでは利用できない。 もちろん、別途 Calico などの CNI プラグインをインストールすることも考えられるが、その分の手間はかかる。 そこで、今回は k3s という IoT 向けの軽量な Kubernetes ディストリビューションを k3d というツールでインストールして試してみる。 k3d (k3s) ではデフォルトで Flannel が CNI プラ
勾配ブースティング決定木 (Gradient Boosting Decision Tree; GBDT) では、以下が経験則として知られている。 学習率 (Learning Rate) を下げることで精度が高まる 一方で、学習にはより多くのイテレーション数 (≒時間) を必要とする しかしながら、上記が実際に実験などで示される機会はさほど無いように思われた。 そこで、今回は代表的な GBDT の実装のひとつである LightGBM と、疑似的に生成した学習データを使ってそれを確かめていく。 確かめる内容としては、以下のそれぞれのタスクで学習率を変化させながら精度と最適なイテレーション数の関係を記録して可視化する。 二値分類タスク 多値分類タスク 回帰タスク 使った環境は次のとおり。 $ sw_vers ProductName: macOS ProductVersion: 12.6.2 Bu
Target (Mean) Encoding の出典は、2001 年の ACM SIGKDD Explorations Newsletter, Volume 3, Issue 1 に掲載された以下の論文らしい。 https://dl.acm.org/doi/10.1145/507533.507538 この論文には Target Encoding のスムージングに関する詳しい記述があった。 そこで、その内容を元に巷のフレームワークがどのようにスムージングを実装しているかを併せて調査してみた。 自分用のメモも兼ねて、ここに書き残すことにする。 なお、Target Encoding 自体の説明については以下を参照のこと。 blog.amedama.jp もくじ もくじ なぜスムージングするのか Empirical Bayesian (EB) を用いたスムージング category_encoder
一般に、テーブルデータの教師あり学習では、勾配ブースティング決定木の性能の良さについて語られることが多い。 これは、汎化性能の高さや前処理の容易さ、学習・推論の速さ、解釈可能性の高さなどが理由として挙げられる。 一方で、ニューラルネットワークをテーブルデータに適用する取り組みについても、以前から様々な試みがある。 今回は、その中でも近年機械学習コンテストにおいて結果を残している TabNet というモデルを試してみる。 TabNet には Unsupervised pre-training と Supervised fine-tuning を組み合わせた学習方法や、モデルの解釈可能性を向上させる試みなどに特徴がある。 使った環境は次のとおり。 $ cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=20.04 DISTRIB_COD
今回は Linux TC (Traffic Control) に実装されている netem (Network Emulator) という qdisc (Queueing Discipline) を使って、劣悪なネットワーク環境を再現する方法について書いてみる。 Linux TC は、文字通り Linux のトラフィックを制御するための機能で、qdisc という形で様々な制御のやり方が実装されている。 その中でも netem という qdisc には、意図的にフレームの送出にディレイを入れたりドロップするといった機能が備わっている。 これを使うと、実際に環境を用意してテストするのがなかなか難しいようなネットワークの状況を再現できる。 使った環境は次のとおり。 $ cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=22.04 DIST
リンクアグリゲーションは、複数のネットワークインターフェイスを束ねて扱う技術の総称。 たとえば、2 本のイーサネットを束ねて冗長化することで 1 本に障害が起こってもサービスを提供し続けることができる。 あるいは、フレームをロードバランスすることで単一のイーサネットよりもスループットを向上させる用途でも用いられる。 今回は Linux のリンクアグリゲーションの実装であるボンディング (Bonding) を Network Namespace と共に使ってみよう。 使った環境は次のとおり。 $ cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=22.04 DISTRIB_CODENAME=jammy DISTRIB_DESCRIPTION="Ubuntu 22.04.1 LTS" $ uname -srm Linux 5.15.0
前回に引き続き Apache Hive の複合型の一つ MAP 型を試してみる。 blog.amedama.jp MAP 型は一般的なプログラミング言語でいうマップや辞書といったデータ構造に相当する。 これを使うとテーブルのカラムに任意のキーで値を格納できる。 環境は次の通り。 $ cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core) $ uname -r 3.10.0-693.5.2.el7.x86_64 $ hadoop version Hadoop 2.8.3 Subversion https://git-wip-us.apache.org/repos/asf/hadoop.git -r b3fe56402d908019d99af1f1f4fc65cb1d1436a2 Compiled by jdu on 2017-
まったく知らなかったんだけど、Pandas はカラムの型として NumPy の float16 (16 ビット浮動小数点型) をサポートしていない。 これは、以下の Issue で説明されている。 どうやら、プラットフォームによっては float16 を利用できないため対応が難しいらしい 1。 github.com サポートされていなくても、カラムの型としては指定できる。 そして、なんとなく動いているようにも見えてしまうので知らないとハマる。 メモリを節約するために、高い精度が必要ないカラムには指定したくなる場面もあるだろうから。 今回は、どんな場面でこの問題に気づいたのか述べる。 使った環境は次のとおり。 $ sw_vers ProductName: macOS ProductVersion: 12.6 BuildVersion: 21G115 $ uname -srm Darwin 2
次のページ
このページを最初にブックマークしてみませんか?
『CUBE SUGAR CONTAINER』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く