2021年1月7日木曜日

bugpointを使ってみたよ

前回、前々回とC-Reduceを使って、ここまで削れました。

$ ls -l test2.cc*
-rw-r--r-- 1 jam jam 1180 Dec 27 10:41 test2.cc
$ clang -O3 -fvectorize ... -S -emit-llvm test2.cc
$ ls -l test2.ll
-rw-r--r-- 1 jam jam 8500 Dec 27 11:04 test2.ll
$ wc test2.ll
136 981 8500 test2.ll

しかし、ビットコードで見るとまだ大きいので、これをbugpointで削ります。

$ cp test2.ll test3.ll
$ bugpoint --compile-custom --compile-command=./test3.sh test3.ll
...
Emitted bitcode to 'bugpoint-reduced-simplified.bc'
$ llvm-dis bugpoint-reduced-simplified.bc -o test3-reduced.ll
$ ls -l test3*.ll
-rw-r--r-- 1 jam jam 893 Dec 27 11:40 test3-reduced.ll
-rw-r--r-- 1 jam jam 8500 Dec 27 11:10 test3.ll
$ wc test3*.ll
24 100 893 test3-reduced.ll
136 981 8500 test3.ll
160 1081 9393 total

これでデバッグが本当に楽になります。何故俺はこれまでC-Reduceとbugpointを使っていなかったのか・・・。

ちなみに、test3.shは以下の通りです。C-Reduceと違い、bugpointのスクリプトは探索対象の場合0以外を返すため、!は必要ありません。

$ cat test3.sh
#!/bin/bash
llc -mtriple XX "$@"

2020年12月28日月曜日

C-Reduceを使ってみたよ 2

C-Reduceを使って、これでデバッグが捗る!!と思ったわけですが、甘かったのです。

$ ls -l test.cc*
-rw-r--r-- 1 jam jam 134 Dec 27 09:23 test.cc
-rw-r--r-- 1 jam jam 13892 Dec 27 09:02 test.cc.orig
$ clang -O3 -fvectorize ... -S -emit-llvm test.cc
$ ls -l test.ll
-rw-r--r-- 1 jam jam 1031219 Dec 27 09:55 test.ll

orz... ヘッダファイルのre.hはデカかった・・・。

なので、一度cppで展開してから、もう一度C-Reduceを掛けます。

$ clang ... test.cc -E -o test2.cc
$ creduce test2.sh test2.cc
...
$ ls -l test2.cc*
-rw-r--r-- 1 jam jam 1180 Dec 27 10:41 test2.cc
-rw-r--r-- 1 jam jam 2350864 Dec 27 10:19 test2.cc.orig
$ clang -O3 -fvectorize ... -S -emit-llvm test2.cc
$ ls -l test2.ll
-rw-r--r-- 1 jam jam 8500 Dec 27 11:04 test2.ll
$ wc test2.ll
136 981 8500 test2.ll

よしよし、大分いい感じに。最初から`-E`で展開してから作業すべきでしたね。

2020年12月27日日曜日

C-Reduceを使ってみたよ

以前から気になってた、C-Reduceを、ついに使ってみました!

Cコードを破壊的に削っていくプログラムなのですが、コンパイラのバグが出たコードを、問題の箇所だけに削るのに便利なプログラムです。

案に違わず、なんでこれまで使ってなかったんだ、俺の馬鹿馬鹿!みたいな結果でした。まずは分かりやすく結果から。

$ ls -l test.cc
-rw-r--r-- 1 jam jam 13892 Dec 27 09:02 test.cc
$ creduce test.sh test.cc
...
#include "re.h"
namespace benchmark {
void a(std::string b) {
std::string d;
Regex c;
c.Init(b, &d);
}
} // namespace benchmark

え、そんだけ!?!?そんなに削ってくれるの!?

関数単位で削ってくれるだけかな?とか思ってたんですが、関数内のコードもガンガン削って、変数名なども適当に付け替えてくれて、超有能です!!

作るテストスクリプトは以下みたいな感じ。検出したい、エラーが出るパターンに!を付けます。!パターンだけだと、削り過ぎてsyntax errorが出るようになった時にcompile errorとsyntax errorが区別できなくなるので、コンパイルできて(syntax errorじゃなくて)、かつ最適化するとエラーになる物を検出としています。

$ cat test.sh
#!/bin/bash
clang -O3 -fno-vectorize ... &&\
! clang -O3 -fvectorize ...

いやあ、超便利!有能!なんで俺はこれまで使ってこなかったんだ・・・!!

2020年11月14日土曜日

Ryzen 7 5800Xデビュー

遂にまたデスクトップPC買いました!

しばらくMacbookで開発してたんですが、再々Macbookに爆音上げさせてるのが気になってて、PC買いました。ちょうど先日出たばっかのRyzen 7 5800Xにしました。サイコムさんとこで水冷のBTO売ってたのでそれで適当に作って貰いました

$ cd build
$ time ninja -j8
[4319/4319] Generating ../../bin/llvm-readelf

real 18m51.953s
user 146m27.064s
sys 4m38.495s
$

Civilization 6やりながらコンパイルできて幸せです。





全力で実行すると以下くらいに向上しました。

[4324/4324] Generating ../../bin/llvm-readelf

real 13m17.512s
user 199m5.145s
sys 6m25.026s

Macbook proの頃は、全力で30分くらい掛かってたので幸せになれたかな

2020年9月5日土曜日

Macbookでnarou.rb

Macbookでnarou.rb他一式を動かしてみる話です。

dockerからnarou.rbを動かしているのだけど、最近AozoraEpub3を改造版にして画像も表示できるようになって満足していた。これまでは私家版AozoraEpub3でpngしか出せなかったからね。

しかし、今度はjpgが大きすぎ、epubサイズが25Mを超えて、google mail経由で転送できなくなってしまった。利用しているnarou.rbは、jpgなどをDLして用意してそれをAozoraEpub3に流し込んでいるので、そこで画像サイズを変えれないかなと相談してみた。結論から言うと、AozoraEpub3で対応して欲しいと。最近改造版AozoraEpub3ではそういった画像周りの改善をしているし、それもそうかなと、AozoraEpub3を直接使ってみることにした。

しかし、AozoraEpub3は実行するのにディスプレイが必要で、例えばDockerからだとX11サーバーに接続する必要がある。

X11サーバー周りの設定してもいいのだけど、一度、手持ちのMacbookで、narou.rbからAozoraEpub3まで一通り動かしてみるのもいいかと思ったので、今回はそれをやってみることにする。ついでにMacbookで一通りを実行する様子をまとめることにする。

2017年6月4日日曜日

Squid

今回はsquidをdockerで動かす話です。

元々は、SquidをQNAPのNASにインストールして使っていました。ところが、最近QNAPのバージョンが上がる度に設定が変わったり、動作が変わったりと危うい感じに。

元々QNAPはQAが良くないみたいで、バージョンアップの度にデグレードする会社だったんですが、ここ最近は特に酷い。

というわけで、QNAP版のSquidに見切りをつけて、NAS上のdockerから適当なSquidを動したというわけです。


最初は、sameersbnのsquidを使おうとしたんですが、動くんですが、設定で大きなファイルもキャッシュするようにしてもキャッシュしてくれないんですね。1週間ぐらいずっと悩んだんですが、どうやっても出来ないので諦めました。

他に目ぼしいdocker-squidがなくて、小さくて新しいsquidがいいなあということで、Alpine Linuxを使ったsquidに。ただこれも2年前と少し古かったので、これをforkして自前のdocker imageを作ることにしました。

Alpine Linux 3.6とSquid 3.5.23です。13MB、圧縮して6MBに収まりました。またデフォルトで以下の設定で起動するようにしました。
  • キャッシュは4GB
  • 一つのファイルにつき32MBまでキャッシュ
自分のdocker imageにしてしまえば、デフォルト設定を好きに変更できていいですな(笑)

実行は
$ docker run -p 3128:3128 jam7/squid3
です。

2017年5月21日日曜日

Edgerouterに証明書導入

今日は家庭内でhttpsの証明書を取る話です。

httpsの接続先がオレオレ証明書だと、接続する度に信頼するかと聞かれ、パスワードのオートコンプリーションも効かないし、色々面倒です。

かといって公式な認証を取ると3万円程度必要になります。無理無理無理w

そこで、今回はLet's Encryptを使って無料で公式な認証を取る話です。認証を取ると、URLが緑になって、パスワードのコンプリーションも効いて便利です。


前提として必要なのは、以下の通り。
  • Edgerouter 1.8.5以降
  • 独自ドメイン (1年目は99円や299円から)
  • ポート80を一時的に公開できること
独自ドメインは、1年目は割引で、2年目からは4000円超なんてのもあるので気をつけましょう。2年目以降が1200円程度なら妥当だと思います。ドメインを作ったら、IPはDynamic DNSを利用して、自分のドメインのDNSからは、そのDDNSをCNAME(ALIASみたいな物)で指すようにするといいでしょう。

その先の手順は以下の通りです。
  1. 外部の名前で、内部から接続できるようにする
  2. 外部から接続しacme-tinyを使って認証を作成する
まず、外部の名前、今回は`router.jam.blue`としてますが、これで内部からルーターのweb UIに接続できるよう設定します。その手順は以下の通り。
  1. router.jam.blueでIPを引けるようにする
  2. web UIをrouter.jam.blueに公開する
まず手元のPCで、nslookupしてみます。

$ nslookup router.jam.blue
Server:         127.0.1.1
Address:        127.0.1.1#53

Non-authoritative answer:
router.jam.blue canonical name = jam7.ddns.net.
Name:   jam7.ddns.net
Address: 180.145.72.84

こう出力されれば問題なし。127.0.1.1や192.168.1.1などのプライベートアドレスが出てくると問題あり。

対応方法は、まずホスト名に適当な物、router.jam.blue以外を設定します。これは、debian系のedgerouterでは、ホスト名を設定すると、それを127.0.1.1で登録するので、それを回避するためです。


こんな感じに設定します。同時に、WizardのDNS host namesも見て、router.jam.blueを全て消します。

これで、WAN側のアドレスだけになるはず。それが出来たら、Config treeから、service gui listen-addressを0.0.0.0にして、web UIを公開します。ここでは、httpdの設定を変えているだけで、これ以外にfirewallでブロックされているので、実際には外部からは接続できません。


この例では、certificates導入済みなので、ca-fileやcert-fileがデフォルトとは異なってますが、その下のlisten-addressを修正して、Previewして設定してください。

ここまでできたら、内部のPCから、router.jam.blueでweb UIが開けるはずです。

次は、「外部から接続しacme-tinyを使って認証を作成」なんですが、これは簡単で、 https://github.com/mgbowen/letsencrypt-edgemax をインストールして実行するだけです。

インストール時のgitの導入などでディスクスペースが足らない場合は、バックアップされてるシステムイメージを削除しましょう。

admin@router:~$ df
Filesystem           1K-blocks      Used Available Use% Mounted on
ubi0_0                  220080    203208     12036  94% /root.dev
aufs                    220080    203208     12036  94% /
devtmpfs                127364         0    127364   0% /dev
tmpfs                   127488       144    127344   0% /run
tmpfs                   127488       144    127344   0% /run
tmpfs                   127488        80    127408   0% /var/log
tmpfs                   127488         8    127480   0% /tmp
none                    127488      1364    126124   1% /opt/vyatta/config
unionfs                 127488         8    127480   0% /opt/vyatta/config/tmp/new_config_4ukbi6sshf7ul2arvu74vggnd4scdcue
admin@router:~$ delete system image
The system currently has the following image(s) installed:

v1.9.1.1.4977602.170427.0113   (running image) (default boot)
v1.9.0.4901118.160804.1131

You are about to delete image [v1.9.0.4901118.160804.1131]
Are you sure you want to delete ? (Yes/No) [Yes]: yes
Removing old image... Done
admin@router:~$ df
Filesystem           1K-blocks      Used Available Use% Mounted on
ubi0_0                  220080    126412     88828  59% /root.dev
aufs                    220080    126412     88828  59% /
devtmpfs                127364         0    127364   0% /dev
tmpfs                   127488       144    127344   0% /run
tmpfs                   127488       144    127344   0% /run
tmpfs                   127488        80    127408   0% /var/log
tmpfs                   127488         8    127480   0% /tmp
none                    127488      1364    126124   1% /opt/vyatta/config
unionfs                 127488         8    127480   0% /opt/vyatta/config/tmp/new_config_4ukbi6sshf7ul2arvu74vggnd4scdcue

後は、手順通り。sudo ./install.shするだけです。エラーが発生した場合でも、certificatesを導入してしまうため、web UIが見れなくなるかもしれません。そういう時は、sudo ./uninstall.shで回復できます。