先日twitter(X)でiowaitが云々で盛り上がっていて、それ自体は別にどうという話でもなかったのですが、iowaitって今実際どうなってるんだろう?というところを少し実験してみました。
WindowsでJISコード
巷ではシフトJISが嫌だ、みたいな話が多いですが、今回はシフトが付かないJISの話です。正式名称は大体ISO-2022-JPという名前です。もう知らない人も多いと思いますが、電子メールの世界ではまだ使用されているコードだったりします。
2024年2月9日現在、日本語Windowsのデフォルトシステムロケールでコードページは932ですが、一応別のコードページ50220〜50222でJISコードを扱うことが出来るので、それを調べてみるというのが今回のお題です。
C#匿名パイプのバッファサイズ調査
また下らない実験をしてみました。
子プロセスを実行してパイプで繋ぐ場合、普通は実行と同時に別スレッドなどでパイプの読み込みも始めます。そうしないと子プロセスの出力がバッファの上限を超えたところでブロックされてしまい、下手をするとデッドロックするからです。
今回はその辺C#(ちょっと古いですが.NET 5.0)でどうなるのか試してみました。
Dockerコンテナで開いているポートを取得
前回はDockerコンテナで開いているポートをホスト側から取得する方法を解説しました。
今回はそれをスクリプトにしてみました。あまり汎用とは言い難いのですが、ご参考までに。
Dockerコンテナで開いているポートの調査
昨今では誰もが使用するLinuxコンテナ、中でもDockerは初心者でも知っているほど有名です。しかし、Dockerで開いているポートって実は調べようとすると結構面倒くさいですよね。コンテナにexec
でshellを開いてss -ltn
しても、コンテナには通常ss
やnetstat
なんて入っていないわけです。
コンテナと言ってもイメージはどうせdebian系列かalpineなんだからとapt
やらapk
やら叩いてインストールすればss
やnetstat
も使えるでしょう。しかし次にコンテナ起動したときには消えてます。かといってイメージに入れたくもないのです。
ではどうするか?
コンテナで分からないならホストで調べてみます
apt upgradeとfull-upgradeで違う例
aptにはfull-upgradeなるサブコマンドがあります。説明を読んでもupgradeとどう違うのか、実際どういうケースを想定しているのか、よく分かりませんよね。
full-upgrade (apt-get(8))
man apt
full-upgrade はアップグレードの機能を実行しますが、システム全体をアップグレードするために必要とされる場合には、現在インストール済みのパッケージを削除することができます。
今回はUbuntu 22.04上で、具体例(1例だけ)を挙げて、それを検証してみました。
SystemTapを使ってみる
placement newの使い方
2024年からは、まとまってようといなかろうと積極的に記事にすることにしたので、しょうもない記事を書いてみます。
今回はC++のplacement new
です。
pythonでpatch
linuxだとdiff -uprN
でパッチを作成して、patch -p1 <パッチファイル
みたいなことをしてパッチを当てますが、この方法linuxでしか使えません。これをパッチ当てる部分だけpythonで使えるようにしたい、というのがこの記事の主旨です。
pypi(pip)でパッケージ探せばいいのかなぁと思ってたのですが、古かったり機能が足りなかったり、テスト用のmockのためのコードだったり、欲しいものとやや違ってて、当初は自作するしかという状況でした。しかし、最近 whatthepatch
というパッケージを見つけ、自作をやめて使用例を記事にすることにしました。
memcpyの速度測定
C/C++のmemcpyは十分に最適化されており、forループする大抵のコードよりは速くなるように出来ています。しかし測り方を間違えると十分な効果を期待できません。例えばLinuxで以下のコードでは正しく測定できません。なぜだか分かりますか?
#include <chrono>
#include <iostream>
#include <cstring>
using namespace std;
using namespace std::chrono;
typedef size_t target_t;
int main(int argc, char* argv[]) {
constexpr size_t N = 1024 * 1024 * 1024; // 1GiB
auto src = new target_t[N/sizeof(target_t)];
auto dst = new target_t[N/sizeof(target_t)];
auto begin = high_resolution_clock::now();
memcpy(dst, src, N);
auto end = high_resolution_clock::now();
cout << N << "bytes copy: " << N / 1024. / 1024. / duration_cast<nanoseconds>(end - begin).count() * 1000000000 << "[MiB/s]" << endl;
return 0;
}
プログラムは正しく動きます。
$ g++ -g -O0 hoge.cpp -o hoge
$ ./hoge
1073741824bytes copy: 1560.47[MiB/s]
$
何が正しく測定できてないのでしょう?