その時々

その時々で違うんです。特に決まっていないんです。

土壌改善

そろそろ本格的に畑について取り組もうと思っています。

そんな気分になってきました。

 

f:id:suttanipaata:20180307154001j:image

まずは適当にやってきていた、この2畝の土壌を改善しようと思います。

 

ここ2週間ほど土について調べまくっていました。

まずはphを測定することにしました。

 

f:id:suttanipaata:20180307154133j:image

 

ph1と、とてもひどい状況です。

よく今までこれでやってこれたなというほど酸性です。

 

 

f:id:suttanipaata:20180307154224j:image

 

ついでにEC値も測定してみました。

こちらは0.2mS/cmと、まあまあでした。あまり肥料はやってないですからね。

 

f:id:suttanipaata:20180307154417j:image

ついでに、すでに植わっている作物に草マルチというものを、やってみました。

 

まだまだこれからです。

 

 

 

 

ソース

しばらくの間、ソースを読んで自分のソースを検討してきました。

ソース~あなたの人生の源は、ワクワクすることにある。

ソース~あなたの人生の源は、ワクワクすることにある。

そして出来があったソースの車輪です。

これらのワクワクをターゲットに活動していきます。

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つ問題が発生。

  • この署名は本当に正しいのかどうやって確認するの?
  • gpgの秘密鍵パスフレーズを忘れてしまった。

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

RPCのコードを触ろう
https://bc-2.jp/archive/season1/materials/0202_RPC%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E8%A7%A6%E3%82%8D%E3%81%86-na.pdf

ホリエモンの「多動力」を読んでみた

amazon:多動力

なぜだか急に読みたくなったので、ホリエモンの多動力を読んでみました。
本が呼んでいたのです。
こういうときって何か見えない力が働くのですね(笑


私はよく飽きっぽい、長いこと続かないと言われています。
転職も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関数が呼び出されます。

つづく