ソース
しばらくの間、ソースを読んで自分のソースを検討してきました。
- 作者: マイク・マクマナス,ヒューイ陽子
- 出版社/メーカー: ヴォイス
- 発売日: 1999/10/01
- メディア: 単行本
- 購入: 38人 クリック: 244回
- この商品を含むブログ (81件) を見る
これらのワクワクをターゲットに活動していきます。
Autotools
今まで、コンパイルでそんなにハマることはなかったのですが、cpuminer2.6.0のコンパイルで結構はまっています。
そこで、原因をつきとめるべく Autotoolsから勉強しています。
Autoconfのマニュアルからどういう流れでAutotoolsが動くのか転載します。
cpuminer の場合は、configure.acからaclocalを使ってaclocal.m4を作成。
configure.acからautoheaderを使ってconfig.h.inを作成。
configure.acとMakefile.amからautomakeを使ってMakefile.inを作成。
という流れです。
それではautogen.shの中身から追っていきます。
#!/bin/sh # You need autoconf 2.5x, preferably 2.57 or later # You need automake 1.7 or later. 1.6 might work. set -e aclocal autoheader automake --gnu --add-missing --copy autoconf
通常は./autogen.shとやればいいのですけど、ここは1つずつ実行してみます。
$ aclocal
これでaclocal.m4が作成されます。
aclocal.m4はconfigure.acを元に作成されます。
このconfigure.acはMakefile.amを元にautoscanで作成するのですが、cpuminerのtarballにはすでにconfigure.acが入っているので、aclocalから始めています。
次にautoheaderを実行します。
$ autoheader
そうするとcpuminer-config.h.inが作成されます。
これもconfigure.acを元に作成されます。
次にautomakeを実行します。
$ automake --gnu --add-missing --copy
そうするとMakefile.inが作成されます。
これはMakefile.amとconfigure.acを元に作成されます。
次にautoconfを実行します。
続くかも?
この問題は解決しちゃったので、続かないかも。
configure と GnuPG について
今まで、webに記載されているインストール手順を参考にして、そのままOSSソフトウェアをインストールしてきていました。
ところが、行き詰まってしまうことも多々あり、いよいよ configureとかmakeとかをキチンと理解したほうがいいと思える状況になってきました。
というわけで、勉強がてらメモしていきます。
テスト環境はMac OSX Sierraです。
GNU Helloのtarballを手に入れる
https://www.gnu.org/software/hello/
こちらのサイトから hello-2.10.tar.gz と hello-2.10.tar.gz.sig をダウンロードします。
このtarballが不正なものでないかチェックします。
$ gpg --verify hello-2.10.tar.gz.sig gpg: 署名されたデータが'hello-2.10.tar.gz'にあると想定します gpg: 日 11/16 21:08:37 2014 JSTに施された署名 gpg: RSA鍵A9553245FDE9B739を使用 gpg: 鍵A9553245FDE9B739をhkpsからサーバhkps.pool.sks-keyservers.netに要求 gpg: 鍵A9553245FDE9B739: 公開鍵"Sami Kerola <kerolasa@iki.fi>"をインポートしました gpg: 究極的に信用する鍵が見つかりません gpg: 処理数の合計: 1 gpg: インポート: 1 gpg: "Sami Kerola <kerolasa@iki.fi>"からの正しい署名 [不明の] gpg: 別名"Sami Kerola (http://www.iki.fi/kerolasa/) <kerolasa@iki.fi>" [不明の] gpg: *警告*: この鍵は信用できる署名で証明されていません! gpg: この署名が所有者のものかどうかの検証手段がありません。 主鍵フィンガープリント: 8ED3 96E3 7E38 D471 A005 30D3 A955 3245 FDE9 B739
日本語なのでわかりにくいですが、正しい署名とでていますので、問題ないはず。
と、ここで2つ問題が発生。
2つ目の問題は深刻です。
gpgの秘密鍵のパスフレーズを忘れてしまったら?
失効証明書すらないようで、しょうがないので作り直すことにしました。
GnuPGをもう少し勉強します。
次のコマンドでプライマリーキーとサブキーを作成します。
$ gpg --gen-key
プライマリーキーとサブキーを作ったら直ちに失効証明書を作る必要があるようです。
これやってなかったかも。。。
$ gpg --output revoke.asc --gen-revoke hoge@hogehoge.com
作成した公開鍵を確認してみます。
$ gpg -k gpg: 信用データベースの検査 gpg: marginals needed: 3 completes needed: 1 trust model: pgp gpg: 深さ: 0 有効性: 1 署名: 0 信用: 0-, 0q, 0n, 0m, 0f, 1u gpg: 次回の信用データベース検査は、2020-02-06です /Users/hoge/.gnupg/pubring.kbx ---------------------------------- pub rsa2048 2018-02-06 [SC] [有効期限: 2020-02-06] ***************************** uid [ 究極 ] hoge <hoge@hogehoge.com> sub rsa2048 2018-02-06 [E] [有効期限: 2020-02-06]
秘密鍵も確認してみます。引数のKを大文字にすると秘密鍵が見れます。
$ gpg -K /Users/hoge/.gnupg/pubring.kbx ---------------------------------- sec rsa2048 2018-02-06 [SC] [有効期限: 2020-02-06] *************************** uid [ 究極 ] hoge <hoge@hogehoge.com> ssb rsa2048 2018-02-06 [E] [有効期限: 2020-02-06]
あとは、このプライマリーキーと失効証明書をどこかに保存しておく必要があります。
せっかくなので、GitHubにも登録しておきます。
gpg --list-secret-key --keyid-format LONG /Users/hoge/.gnupg/pubring.kbx ---------------------------------- sec rsa2048/401F174HONYARARA 2018-02-06 [SC] [有効期限: 2020-02-06] ************************************ uid [ 究極 ] hoge <hoge@hogehoge.com> ssb rsa2048/A311314HONYARARA 2018-02-06 [E] [有効期限: 2020-02-06] $ gpg --armor --export 401F174HONYARARA -----BEGIN PGP PUBLIC KEY BLOCK----- mQENBFp5EEUBCADTmrJp+ywE1C9Qxva8oJZSj5cM01lOB1krWhYxtNObOt4K+mDp nAsOApt1NCYnctV7H4DTe+f+aDCWRqX+216NztPwr4ldc0jWWUZMc/ZDWcFGB1Uq 5QND99QkYIPuynygkUUaxr+fYyNUzXWdW2Iz+/lXCadvh/AdFwmAlw+sr1P/qSEa orr/lyc/6xNO0AgMOLFZ1JofOr+HKBygSNZ6ipOFC (省略) zkx8EO9ZxP6L9QP47YZoW/cAWXu9ppowXC+A08WBT/QxlnTJ =Q4Ot -----END PGP PUBLIC KEY BLOCK-----
githubのsettingより
ここに登録しておきます。
再度、GNU helloのシグネチャを検証
もう一度検証します。
$ gpg --verify hello-2.10.tar.gz.sig gpg: 署名されたデータが'hello-2.10.tar.gz'にあると想定します gpg: 日 11/16 21:08:37 2014 JSTに施された署名 gpg: RSA鍵A9553245FDE9B739を使用 gpg: "Sami Kerola <kerolasa@iki.fi>"からの正しい署名 [不明の] gpg: 別名"Sami Kerola (http://www.iki.fi/kerolasa/) <kerolasa@iki.fi>" [不明の] gpg: *警告*: この鍵は信用できる署名で証明されていません! gpg: この署名が所有者のものかどうかの検証手段がありません。 主鍵フィンガープリント: 8ED3 96E3 7E38 D471 A005 30D3 A955 3245 FDE9 B739 $ gpg --recv-key A9553245FDE9B739 gpg: 鍵A9553245FDE9B739:"Sami Kerola <kerolasa@iki.fi>"変更なし gpg: 処理数の合計: 1 gpg: 変更なし: 1
これで特に問題ないと確認できました。
helloのファイル構成からconfigureとかを理解する
$ ls -p ABOUT-NLS INSTALL README-release configure m4/ AUTHORS Makefile.am THANKS configure.ac maint.mk COPYING Makefile.in TODO contrib/ man/ ChangeLog NEWS aclocal.m4 doc/ po/ ChangeLog.O README build-aux/ hello.1 src/ GNUmakefile README-dev config.in lib/ tests/
ファイル名が大文字のものはほとんどがドキュメントのようです。
とりあえず最初にREADME、ChangeLog、CHANGES、INSTALL、COPYING、LICENSEあたりを見ておくと良いようです。
READMEを見ると
Briefly, the shell command `./configure && make && make install' should configure, build, and install this package. The following more-detailed instructions are generic; see the `README' file for instructions specific to this package.
./configureして、makeして、make installしなさいよとのことです。
まずはmakefileもないので、./configureしてmakefileを作るのですね。
それから./configure のヘルプは次の2つで確認できます。
./configure --help
./configure --help=short
下ののヘルプだとソフトウェア固有のものが表示されます。
通常はshortの方でいいとのこと。
$ ./configure --help=short Configuration of GNU Hello 2.10: Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --disable-nls do not use Native Language Support --disable-rpath do not hardcode runtime library paths Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-libiconv-prefix[=DIR] search for libiconv in DIR/include and DIR/lib --without-libiconv-prefix don't search for libiconv in includedir and libdir --with-libintl-prefix[=DIR] search for libintl in DIR/include and DIR/lib --without-libintl-prefix don't search for libintl in includedir and libdir Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a nonstandard directory <lib dir> LIBS libraries to pass to the linker, e.g. -l<library> CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if you have headers in a nonstandard directory <include dir> CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to <bug-hello@gnu.org>. GNU Hello home page: <http://www.gnu.org/software/hello/>. General help using GNU software: <http://www.gnu.org/gethelp/>.
このうち、Optional Featuresのほうはソフトウェアの機能や動作を
Optional Packagesのほうは外部のソフトウェアやライブラリを組み込む時に使います。
withoutを使うと組み込まないように指示できますが、withoutがないものもあります。
必要な外部のソフトウェアやライブラリがない場合は、./configure でエラーとなります。
参考URL
GnuGPG関連
http://www.atmarkit.co.jp/ait/articles/1106/17/news138.html#utm_term=view_sp
https://qiita.com/moutend/items/5c22d6e57a74845578f6#gpg%E3%81%AE%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6
http://kuenishi.hatenadiary.jp/entry/2016/07/12/013041
最近の参考メモ
参考URL
BitCoin Developer Reference
https://bitcoin.org/en/developer-reference
BitZeny insight
https://test-insight.bitzeny.jp/
BitZeny Testnet用ウォレット
https://wallet-testnet.zeny.live
ホリエモンの「多動力」を読んでみた
なぜだか急に読みたくなったので、ホリエモンの多動力を読んでみました。
本が呼んでいたのです。
こういうときって何か見えない力が働くのですね(笑
私はよく飽きっぽい、長いこと続かないと言われています。
転職も2回してますし、仕事が面白く無くなってくると無理に続ける必要がないのかなった思えてくるんですよね。
そんな無駄な時間を過ごしたくないって。
なので、人間関係が嫌になったとか、そういった理由で変わってきたことはありません。
趣味も、プログラミングにハマったと思えば、急に自転車にハマったり、天文にハマったり、ラジオや無線にハマったりと落ち着きがありません。。。
多動力ってタイトルを見ただけなんですが、いろんなことにいっぱい手を出せばいいんだってことを言ってる気がしたのです。
以前にも、そんなような本を読んだことがあるのですが、タイトルが思い出せません。
やっぱり本を読んだらメモは必要ですね、
心に残ったところ
スティーブ・ジョブズは「点と点をつなげていくと、いつの間にか線ができる」と言ったが、あちこちハマっていくうちに、網の目のように散らばった点と点が思わぬところでつながるのだ。
これ、そういえばスティーブ・ジョブズの伝説のスピーチで言っていたような気がします。
ホリエモンが言うには、飽きっぽい人ほど成長するそうです。
一度深くまでハマり、あっさりと次へ移る。これからの時代はそうやって80点取れるものをいくつももっている人が強いとのこと。
これはいい言葉です。
修業、下積みと同じように「一つの仕事を定年まで全うするのが正しい」という幻想にとらわれている人もまた多い。
ひとつのことしかできなくて、この先その職種自体がAIに取って代わられたとどうするんだというのも私的には思っていたりもします。
別の分野に1万時間取り組めば何が起きるか。「100人に1人」×「100人に1人」の掛け算により、「1万人に1人」の人材になれる。
なるほど。
仕事の質は睡眠で決まる
ホリエモンはとても睡眠を重視しているようです。
ここは確かにそうなのかもしれません。
揺れ動く部分です。
お釈迦様は睡眠時間は無駄であると説かれています。
なので、必要以上に寝るのは時間がもったいないと今まで考えてきました。
少し調べてみると、ここに答えが書かれていました。
【45】 睡眠について
あとは気になったタイトルを
知らないことは「恥」ではない
聞かぬは一生の恥
恥をかいた分だけ自由になれる
はっきり言おう。誰もあなたには興味がない。
私もこれ、よく思います。
どうせ人のことなんてみんな興味がないんだから、好きなようにやればいいって。
永遠の3歳児たれ
子供の好奇心を大人になっても持ち続けたいですね。
本って言うのは同じことが書かれているのに、人によって捉え方は全然違います。
例えば私が心に響いた内容を、パートナーに話すと、全く違うように捉えていて、そこじゃないのにな〜って思うことがよくあります。
結局自分の都合のいいようにしか捉えないんだなと。
なので、本とか、そう言ったものは自分のために読めばいいのだと最近は思っています。
わざわざ進める必要もないですし、必要な時に必要な本がやってくるのです。
今の私にこの「多動力」という本が必要だったのかもしれません。
cpu-miner.cを眺めてみる2
struct thr_info *thr; long flags; int i; rpc_user = strdup(""); rpc_pass = strdup(""); /* parse command line */ parse_cmdline(argc, argv); if (!opt_benchmark && !rpc_url) { fprintf(stderr, "%s: no URL supplied\n", argv[0]); show_usage_and_exit(1); } if (!rpc_userpass) { rpc_userpass = malloc(strlen(rpc_user) + strlen(rpc_pass) + 2); if (!rpc_userpass) return 1; sprintf(rpc_userpass, "%s:%s", rpc_user, rpc_pass); } pthread_mutex_init(&applog_lock, NULL); pthread_mutex_init(&stats_lock, NULL); pthread_mutex_init(&g_work_lock, NULL); pthread_mutex_init(&stratum.sock_lock, NULL); pthread_mutex_init(&stratum.work_lock, NULL); flags = !opt_benchmark && strncmp(rpc_url, "https:", 6) ? (CURL_GLOBAL_ALL & ~CURL_GLOBAL_SSL) : CURL_GLOBAL_ALL; if (curl_global_init(flags)) { applog(LOG_ERR, "CURL initialization failed"); return 1; }
まずは、コマンドライン引数をパースしています。
ベンチマークの場合や、urlのプロトコルによって処理を分けているようです。
#if defined(WIN32) SYSTEM_INFO sysinfo; GetSystemInfo(&sysinfo); num_processors = sysinfo.dwNumberOfProcessors; #elif defined(_SC_NPROCESSORS_CONF) num_processors = sysconf(_SC_NPROCESSORS_CONF); #elif defined(CTL_HW) && defined(HW_NCPU) int req[] = { CTL_HW, HW_NCPU }; size_t len = sizeof(num_processors); sysctl(req, 2, &num_processors, &len, NULL, 0); #else num_processors = 1; #endif if (num_processors < 1) num_processors = 1; if (!opt_n_threads) opt_n_threads = num_processors;
次にCPUの数を求めています。
私のMBA 2011 13inchの場合は、デュアルコア4スレッドのため、
num_processors = 4 となります。
#ifdef HAVE_SYSLOG_H if (use_syslog) openlog("cpuminer", LOG_PID, LOG_USER); #endif
syslogに出力する場合はここで出力設定します。
/* init workio thread info */ work_thr_id = opt_n_threads; thr = &thr_info[work_thr_id]; thr->id = work_thr_id; thr->q = tq_new(); if (!thr->q) return 1;
workI/Oのスレッド情報を初期化します。
work_th_idにはスレッド数が入ります。
thr_info構造体は次の構造になっています。
struct thr_info { int id; pthread_t pth; struct thread_q *q; };
マルチスレッド処理用の初期化処理だと思っておけばいいかと。
/* start work I/O thread */ if (pthread_create(&thr->pth, NULL, workio_thread, thr)) { applog(LOG_ERR, "workio thread create failed"); return 1; }
そして、ここでスレッドが作成されます。
スレッドが作成されることによって、 workio_thread関数が呼び出されます。
つづく