Jetpack「パブリサイズ共有」改行が気に入らずソースを手当て

投稿日:

 このブログではTwitterやFacebookに記事を共有するため、高機能プラグイン「Jetpack」の機能の一つ、「パブリサイズ共有」を使用している。

 数日前にそのJetpackのアップデートがあったのだが、それから、TwitterとFacebookへのポストの文章の改行がすべて消されてしまうようになった。

 私は最近、俳句のポストをすることが多いが、3句ぐらい詠んだ俳句が全部一行でポストされてしまった。左の如しである。

 これは嫌だ。

 WordPressは所詮PHPで書かれたものなので、嫌なら “Jetpack「パブリサイズ共有」改行が気に入らずソースを手当て” の続きを読む

Fedora 31で自作の株式売買シミュレーションシステムを動かす

投稿日:

 自宅で10年以上の間、株式の売買シミュレーションシステムを運用してきた。Linux上で作動する。

 以前、このブログでも少し書いたことがあるが、これで多少儲けても来ている。

 このシステムは、株価をネットからダウンロードするプログラムをPerlで、これを格納するRDBはPostgreSQL、シミュレーションはCで、ユーザインタフェースはPHPで、というハイブリッド(笑)なつくりである。プラットホームは古いIntel Cerelon D “Prescott-V” 2.66GHzのマシン上に最初Fedora Core 5をインストール、順次アップグレードし、最後はFedora 9となっていた。

 2年ほど前からだったろうか、株価をネットからダウンロードするプログラムがうまく動かなくなってしまっていた。株価は「Yahoo!ファイナンス」の時系列データから無料で頂戴してくるのだが、これはデータではサービスされておらず、htmlの中から特徴的なタグに正規表現でマッチングさせて株価を取り出してくる仕組みになっていた。なので、うまく動かなくなっていたのは、さしずめYahoo!ファイナンスの仕様が変わり、htmlのフォーマットなどが変わったのだろう、と思っていた。実際、正規表現でマッチングさせて目的のデータを切り出すコードになっているから、わずかでもhtmlが変わると、途端に消化不良を起こすのである。

 原因究明や修理が面倒で、また、しばらく株式も値動きがあまりなくて面白くなかったから売買もしておらず、シミュレーションシステムも放りっぱなしになってしまっていた。

 そんな折も折、ここへきて、新型コロナウイルス蔓延により外出の自粛が推奨される事態となった。ために、やむなく家に垂れこめている。平日は仕事に(いそ)しんでいるからあまり暇はないが、休日などはどうしても無聊(ぶりょう)となる。

 そこで、意を決して上述のシステムを修理することにした。多分、Yahoo!ファイナンスの仕様、就中(なかんづく)htmlのフォーマットを分析すれば、すぐに修理できるだろうと思っていた。

 ところが、その推量は全然違っていた。

 株価ダウンロードプログラムは、htmlをダウンロードするのに、CPANの「LWP」ライブラリ等は使わず、Perl内から「wget」を呼び出して使っていた。そうしないとSSLの部分が面倒だからだ。

 問題は、このSSL部分にあった。Yahoo!全体の仕様が、TLS1.2未満のSSLを拒絶するよう変更されていたのだ。Fedora 9は、OpenSSL0.9.8までしか対応しておらず、そしてOpenSSL0.9.8はTLS1.0までしか対応していない。

 そこまで確かめて、やっと思い出した。私のシステムが動かなくなった2年ほど前というと、ちょうどSSLのセキュリティホールやSHA-1アルゴリズムの危殆(きたい)化などが取り沙汰され、あちこちのサイトやブラウザがどんどんバージョンアップされて行っていたのだ。

 私はその頃、仕事が非常に忙しく、自宅のPC環境など(かえり)みている暇がなかった。それで、他人事のようにそれらのニュースに接していたのである。

 原因は、wgetとOpenSSLが古い、ひいてはプラットフォームOSが古いことにあった。

 最新のFedoraシリーズのバージョンは「31」になっており、そもそも平成17年(2005)発売のCerelon Dのような32ビットCPUには対応していないから、もう、古いLinuxマシンはそろそろお払い箱だろう。

 私のデスクトップマシンはCore i7 4790K 4GHzにメモリは32GBをブチ込み、ストレージは1TBのHDDから、先日2TBのSSDに換装したところだ。されば、ここはもう、仮想化しかあるまい。

 VMWare Playerをダウンロードしてインストール。非営利であれば無料である。これにFedora 31のisoイメージを本家サイトから貰ってきてインストールする。

 動かしてみてびっくりした。私のような商用のSystem V育ちの者にとって、Linuxの「init」システムは長年慣れ親しんだシステムなのだが、Apache2を動かそうと/etc/rc.d/init.d/の下を覗いてビックリ仰天!何も入っていなくて、空っぽではないか!(笑)

 こ、これは……!とGoogle先生にお尋ね申し上げ、今は「init」は否定の憂き目にあい、「systemd」というものに置き換わっているということを知る。

 「systemctl」というサービス・コマンドの操作を調べ、これでhttpdを動かす。PostgreSQL、PHP、wgetなど必要なものをyum改め、「dnf」で次々とブチ込む。

 それから(おもむ)ろに株価ダウンロードシステムを動かす。……まったく何の支障もなく、プログラムの変更もなく作動するようになった。

 phpで作られたユーザインタフェースについては、POSTやGETの引数を直接グローバル変数として扱うことのできるかつてのPHPの仕様が廃止されてしまっており、そのままでは動かなくなってしまっていたが、そこは彌縫(びほう)的にパッチ当てをした。

 SELinuxを調整しないとPostgreSQLとPHPが協調動作しないなど、多少ひっかかったところもあったが、元の通り株価売買シミュレーションシステムは作動するようになった。

 さすがは Core i7 だ。生マシンから仮想マシンへの移設とはいえ、もはや骨董(こっとう)品に近い Cerelon の生マシンから移設しただけあって、C で書いたシミュレーション部分は、目を見張るような素晴らしいスピードでカッ飛んでいく。

 もともとこのシステムでは、過去5年分の株価データに対し、8900通り×49銘柄の売買シミュレーションを行っていた。Yahoo!ファイナンスに株価の整理値が出揃う20時50分頃から「cron」でこのシステムを起動していたのだが、これだけの組み合わせのシミュレーションを行うと、全部終わるのは23時くらいにはなってしまっていた。

 ところが今回の移設で、それらシミュレーションがなんと10分ほどで完了するようになった。かつて誰かが言っていたが、「稚拙で鈍足なアルゴリズムでも、意外にマシンパワーの進歩で解決されてしまう」ということの実例を目の当たりにした次第である。

 さて、そのようにしてシミュレーション結果を見てみると、やはり、新型コロナウイルスの影響で、相場は鉄火場と化している。大変な勢いで売買指標が出ている。これは大変だ。

 今この鉄火場に飛び込むのは危険である。ウイルス禍が一段落し、上昇相場になったところからが勝負だろう。

「Simple Tags」のカスタマイズ

投稿日:

 WordPressのプラグイン「Simple Tags」を愛用している。記事に含まれるキー・ワードで自動的にタグをつけることも可能だ。しかし、いつもいつもこの「自動タグ機能」を使いたいわけでもない。なので、ほとんどの場合、記事を新規作成した時の「□ Disable auto tags ?」のチェックボックスを「☑」(チェック)にして、機能をオフにする。ところが、これが毎回毎回なのが気に食わない。この機能のデフォルトが「非checked」だからだ。実に面倒である。

 そこで、プラグイン・エディタで該当部分を書き直してしまうことにした。

 プラグイン内を片っ端から検索してみたところ、「simple-tags/inc/class.admin.post.php」がその部分を生成していることが分かった。

 その中に、

		// Auto terms for this CPT ?
		if ( (int) SimpleTags_Plugin::get_option_value( 'active_autotags' ) === 1 && isset( $auto_options[ $post->post_type ] ) && ! empty( $auto_options[ $post->post_type ] ) ) {
			$meta_value = get_post_meta( $post->ID, '_exclude_autotags', true );
			echo '<p>' . "\n";
			echo '<label><input type="checkbox" name="exclude_autotags" value="true"  ' . checked( $meta_value, true, false ) . ' /> ' . __( 'Disable auto tags ?', 'simpletags' ) . '</label><br />' . "\n";
			echo '</p>' . "\n";
			echo '<input type="hidden" name="_meta_autotags" value="true" />';
		}

……という箇所があるのだが、これを

		// Auto terms for this CPT ?
		if ( (int) SimpleTags_Plugin::get_option_value( 'active_autotags' ) === 1 && isset( $auto_options[ $post->post_type ] ) && ! empty( $auto_options[ $post->post_type ] ) ) {
			$meta_value = get_post_meta( $post->ID, '_exclude_autotags', true );
			echo '<p>' . "\n";
			// echo '<label><input type="checkbox" name="exclude_autotags" value="true"  ' . checked( $meta_value, true, false ) . ' /> ' . __( 'Disable auto tags ?', 'simpletags' ) . '</label><br />' . "\n";
			echo '<label><input type="checkbox" name="exclude_autotags" value="true" checked="checked" ' . checked( $meta_value, true, false ) . ' /> ' . __( 'Disable auto tags ?', 'simpletags' ) . '</label><br />' . "\n";
			echo '</p>' . "\n";
			echo '<input type="hidden" name="_meta_autotags" value="true" />';
		}

……と、下線赤字のように書き足したわけである。さて、うまく作動するかな?……。

今回のJetpackアップデートはWordPressが動かなくなる

投稿日:

 Jetpackが6.3.2になった。

 そこですぐにアップデートした。途端に、このブログは動かなくなった。下のようなエラーを吐いて、ブログが表示されなくなるのだ。

Parse error: syntax error, unexpected '[', expecting ')' in /home/ ... (中略) ... /wp-content/plugins/jetpack/modules/widgets/simple-payments.php on line 220

 このエラーが出る理由は簡単で、PHPのバージョンが古いからである。私の場合は5.x版のPHPを使用していたため、こういうことになった。

 PHPをサクッと7.1にアップデートすれば、このエラーは出なくなる。

 この状況は、一にかかって、環境によるとしか言いようがないが、ごくごく一例として、私が使用しているGMOペパボ(株)の「ロリポップ!レンタルサーバー」の場合を言えば、「ユーザ専用ページ」を表示させ、画面左ペインから「PHP設定」を選べばよい。そうすると、ドメイン毎にどのPHPバージョンを使用したいか選択できるようになる。ここで、全てのドメインにおいて最新のPHPバージョンを使用するよう設定すれば、今回の問題は即解消する。

 ただし、いわでもがなのことではあるが、自ら古いバージョンのPHP仕様に依存する諸設定や開発を行っている場合は上記の限りではなく、ましてや使用しているサーバが異なれば処置も全く異なる。私佐藤俊夫としてもかかる状況を踏まえた上での責任など()いかねるので、読者諸兄姉におかれてこの点を諒として頂きたい。

休みももう終わり

投稿日:

 連休も最後だというのに、「のだめカンタービレ」全25冊を2日ほどで一気読みした。なぜか妻がネットで全巻買ったのだ。

 妻に「ほほぅ、……奮発したね」と聞くと「うん、2千円くらいだったから。お父さん、前に途中まで読んで、そのままになってるって言ってたでしょ。だからゴールデンウィークの行楽に、と思って」と言っていて、それが一昨日届いたのだ。

 この漫画、妻の言う通り、以前三郷のラウンド・ワンの漫画室でたしか十数巻まで読んだことがある。その時、全部読む時間があったのだが、十何巻目だったかに一巻欠けているところがあった。そこを飛ばして読んでもよかったのだけれど、せっかく面白い漫画がそれでは台無しになると思って読まなかったのだ。それが十年くらい前。

 その後、ごく最近になってから、Kindleで3巻まで無料だったのでそれを読み直し、面白かったので有料でもう2巻ほど買って、5巻ぐらいまで読んだ。だが、その頃忙しかったりしたのと、「この調子で読み進めてしまうと1万円以上浪費してしまう」と思ったのとで読むのをやめ、結局全部読まずであった。それっきり読む機会がなかった。

 このほど、なぜか妻が上記のように全巻買い込んだので、全部読むことができた。

 いやもう、面白かった。

 この漫画、たしかもう15年以上も前の作品なのだが、今読んでもまだまだ面白い。登場人物の携帯電話がガラケーだったりするのもそういう時間の経過を感じさせ、かえって良い。

 「のだめカンタービレ」を読み終わったあと、このブログの子テーマの気に入らないところをムキになってゴリゴリ書き直す。各エントリの日付の位置と、日付の書式が気に入らなかったので直したのだ。意地になって和暦との併記にした。ふう。

 渡す文字列がおかしくなっていて、その部分が原因だということがなかなかわからずにハマり、時間がかかった。WordPressの子テーマのphpに手を入れる場合、デバッグが大変なのだ。値のウォッチなどには、「printfデバッグ」をするしかないので、大変なのである。

 実サイトでエラー出しながら書き直したのだが、冷や汗ものであった。ローカルにテストサイトなどを置いてそこでテストするのが本当だろう。今日のように実サイトでエラーなんか垂れ流しにすることを繰り返していたら、しまいにどんなアタックを仕掛けられるか判ったものではない。

 今日は

「『inc』の下を(いじ)っても反映されない時は、『functions.php』に目標の関数をコピペして、それを(いじ)れ」

……ということを知った。ちょっとした収穫である。と言って、カスタマイズの対象は所詮、人が作ったものなのだが。

引用する日付をショートコードで定型化

投稿日:

 最近、(ジジィ)化してきて、時事などにケチをつけてはそれをブログに書いて楽しむようになってしまった。

 子供の頃、私の父はアニメや「8時だョ!全員集合」などの子供が見たがる番組など絶対つけてくれず、子供にとってはつまんないニュース番組などばかりつけていたもので、しかもそれを見て楽しんでいるというならまだしも、「なにがフェミニズムだ!!何が日教組だ!!」などと、どうでもいい他人のことに腹を立てはじめ、しまいには湯気を立てて激昂し、私にそこらの手近のものなど投げつけて八つ当たりするという、誠にもって迷惑な父であった。

 さすがに私はそこまではいかず、父のようにニュースを見て激昂するなどという人間にはならなかったが、どうでもいいニュースに勝手なコメントを加えてブツブツ言っているというところは、多少似ていると言えば言えるかもしれない。

 さて、時事にケチをつけるときは、だいたいニュースなどへのリンクを張っている。例えば、昨日の羽生結弦先生のニュースなら、

……というような書式で引用している。

 前から思っていたのだが、この引用するときの日付が気に入らない。上の例だと「2018年2月17日21時57分」という部分だ。これがマスコミ各社それぞれに、「年」「月」「日」が入ったり、「/」区切りだったり、「-」区切りだったり、時間が入ったり入らなかったりして、不統一である。

 それより何より最も気に入らないのが、年号が全部「西暦」であることだ。和暦を付記すべきだ。……いいや、違うッ!。和暦に西暦を付記すべきである。

 こんなこと、気にしなければいいだけの話なのだが、これをまた、「このブログは日付の書式が不統一だ」などと、私のブログを見てケチをつけてくる人がいるのである。

 これは手作業でひとつづつ書き直すようなことではない。こんな機械的なことは、機械がやるべきだ。

 何か、日付を正規化するプログラムでも書いて、そのAPIでも公開してやろうかい、などとも思ったが、「和暦に西暦付記でないと嫌だ」などという変な人は世の中私ぐらいだろうと思うし、何もAPIを世の中に提供まですることもあるまい。ここはひとつ、WordPressの機能の、「ショートコード」というのを活用して、記事を書くときにチョコッとおまじないを書き足せば、いろいろな日付が私の認める日付書式(俺様用日付)に書き換わって表示される、というふうにすることにした。

 WordPressはPHPで作られている。そのため、ショートコードを作るには、PHPでプログラムを書けばそれでよい。PHPは簡単で、誰でもがWordPressに機能追加することができる。

 具体的には、WordPressのインストールディレクトリの下の「wp-content/themes」の下にある、自分が使っているテーマの中の「functions.php」の末尾にPHPでプログラムを書いてやるのだ。「子テーマ」を作成して使用している場合は、その子テーマの下のfunctions.phpにプログラムを書き加える。

 私は子テーマを使用しているので、その下にあるfunctions.phpの末尾に、次のように書き足した。

/********************************************************************************
 * regdate();
 *   平成30年2月18日(日)11時00分~
 *   佐藤俊夫
 *   ネットのマスコミニュースの日付などをコピペする際、書式がばらばらであるので、
 *   これを私こと佐藤俊夫が認める日付書式に変換するショートコード 
 ********************************************************************************/
function regdate( $arg, $content = null ) {
	$content = mb_convert_kana($content, "n");	//  全角数字はすべて半角数字に
	$content = preg_replace("/$/", "/", $content);	//  処理の単純化のため、末尾に例外なく「/」を付加(日付のみで数字で終了する文字列に対応)
	$content = preg_replace("/^[^0-9][^0-9]*/", "", $content);	//  行頭の数字以外の文字はすべて削除
	$content = preg_replace("/[^0-9][^0-9]*/", "/", $content);	//  数字以外の文字を全て「/」に置換
	$content = preg_replace("/[^0-9]([0-9])[^0-9]/", "/0$1/", $content);	//  数字1文字のみの場合は「0」をパディング
	$content = preg_replace("/^([0-9])[^0-9]/", "0$1/", $content);
	$content = preg_replace("/^([0-9]{2}[^0-9])/", date("Y")."/$1", $content);	//  冒頭が2桁の数字のものは、今の西暦を強制付加する。
	$content = preg_replace("!^([0-9]{4}/[0-9]{2}/[0-9]{2})/$!", "$1/00/00/", $content);	//  年号と日付しかないと見られるものは、00時00分とし、末尾に付加する。
	$content = preg_replace("!/$!", "", $content);	//  末尾の「/」をサニタイズ
	$content = preg_replace("!/([0-9][0-9])/([0-9][0-9])$!", " $1:$2", $content);	//  末尾の数字4つは時間とみなして「 12:34」の形に。
	$unixtime_content = strtotime($content);	//  「strtotime」が高性能なので、一旦丸投げしてUNIXタイムスタンプにする。
	//  元号と和暦年を取得して付加
	$Y = date("Y", $unixtime_content);
	$Ymd = date("Ymd", $unixtime_content);
	if ($Ymd >="18680125" && $Ymd <= "19120729") {
		$gg = "明治";
		$yy = $Y - 1867;
	} elseif ($Ymd >= "19120730" && $Ymd <= "19261224") {
		$gg = "大正";
		$yy = $Y - 1911;
	} elseif ($Ymd >= "19261225" && $Ymd <= "19890107") {
		$gg = "昭和";
		$yy = $Y - 1925;
	} elseif ($Ymd >= "19890108") {
		$gg = "平成";
		$yy = $Y - 1988;
	} else {
		//  明治以前の場合は一律「皇紀」を用いることとする。
		$gg = "皇紀";
		$yy = $Y + 660;
	}
	if($yy == 1){
		$yy = "元";
	}
	$content = $gg.$yy."年".date("(Y)m月d日(", $unixtime_content);
	//  日本語曜日を取得して付加
	$sevendays = array("日","月","火","水","木","金","土");
	$content .= $sevendays[date("w", $unixtime_content)].")".date("H時i分", $unixtime_content);
	//
	return $content;
}
add_shortcode('date', 'regdate');

 「functions.php」に上のように書き加えたら、よく確認して保存する。

 さて、このショートコードの利用である。

 例えば最初のほうで例に述べた朝日新聞の記事の場合、そのまま日付をコピペすると次の赤字で記した部分のようになってしまい気に入らないことは、先述の通りである。

ショートコードを使わない場合の記事ソース
<ul><li> <a href=”https://www.asahi.com/articles/ASL2K52X2L2KULZU004.html” rel=”noopener” target=”_blank”>羽生結弦、自分に勝った孤高の金「僕はアニメの熱血系」</a>(朝日、2018年2月17日21時57分)</li></ul>

 しかし、今回作ったショートコードを使えば、簡単に書式を一定化できる。次の通りだ。

ショートコードを使った場合の記事ソース
<ul><li> <a href=”https://www.asahi.com/articles/ASL2K52X2L2KULZU004.html” rel=”noopener” target=”_blank”>羽生結弦、自分に勝った孤高の金「僕はアニメの熱血系」</a>(朝日、[date]2018年2月17日21時57分[/date])</li></ul>

 WordPressは、このように簡単でわずかなプログラムを書き加えるだけで自分の好みに改変することができる。非常に便利であり、ユーザ・フレンドリであると言える。

 世の中には、「日付に和暦や元号を使う合理性なんてまったく認められない。こんなものはやめるべきだ」などと言い立てている変な人がいるようだが、そういう人は私のように、自分の環境だけ変えればよい。私と同じように、自分の環境だけ、逆に西暦でもイスラム歴でも、勝手に好きなように使えるようにすればよい。そんなもの、上記で実践して見せたように大した手間ではない。

屈折

投稿日:

 ハードディスクの隅っこの方を漁っていたら、「fortune.php3」というファイルが出てきた。かれこれ20年弱くらい前に書いたものだ。

 その内容は摘記すれば次のようなものであった。

fortune.php3
<?
$hitokoto[] = "事態は好転しない。";
$hitokoto[] = "どのやり方もダメだ。";
$hitokoto[] = "人生下り坂。";
$hitokoto[] = "おしまいなのか・・・。";
$hitokoto[] = "暗黒と涙。";
$hitokoto[] = "夜と冬。";
$hitokoto[] = "青函トンネルから出られない。";
$hitokoto[] = "・・・破綻。";
$hitokoto[] = "生涯に一度の光もなく";
$hitokoto[] = "即身仏が鳴らす鐘の音が止んだ。";
$hitokoto[] = "合掌。";
$hitokoto[] = "老いてゆく。";
$hitokoto[] = "永久の苦痛";
$hitokoto[] = "君のすべてが疎ましい。";
$hitokoto[] = "助けを求める声が次第に弱々しくなっていった。";
?>
<table>
<tr><td>ラッキーカラー:</td><td bgcolor="#ff7777">システムエラー あなたのラッキーカラーが見つかりません。</td></tr>
<tr><td>ラッキーナンバー:</td><td bgcolor="#ff7777">システムエラー あなたのラッキーナンバーが見つかりません。</td></tr>
<tr><td>ラッキー方位:</td><td bgcolor="#ff7777">システムエラー あなたのラッキー方位が見つかりません。</td></tr>
</table>
<p>
<center>今日の一言:<h2>「<?echo $hitokoto[rand(0,count($hitokoto) - 1)];?>」</h2></center>

 当時、何か、相当私は屈折していたのだな、ということがうかがわれるわけである。

WordPress画像挿入時動作のカスタマイズ

投稿日:

 愛用中のWordPress。書きやすいし、気に入っている。

 しかし、記事に画像を挿入するときの動作が気に入らない。WordPressの画像の挿入機能は、タテヨコをimgタグのwidth・height両属性で書いてくる。つまり

「<img …… width=”320px” height=”240px” …… >」

……というふうに書きこんでくるのだが、これが気に入らないのである。

 これだと、ブラウザのウィンドウ・サイズなどを変更したり、モバイルや携帯で表示させたときに画像がハミ出したり、周囲の文字が収まりきらず、おかしな具合に画面が散らかったりしてしまう。リサイザブルでないわけである。ここは

「<img …… style=”width:50%;” …… >」

……等であってほしい。こういうふうであれば、ウィンドウのサイズを小さくしたブラウザで表示しようが、携帯やモバイルで表示しようが、必ず表示領域の半分の大きさで画像が表示されるわけである。

 しかし、現行のWordPressはそういうふうにはなっていないし、そういうふうにユーザ設定を追加する機能もない。

 それで、画像を挿入するときには、毎回この「<img …… width=”320px” height=”240px” …… >」というタグの「width……height……」というところを手で削り、「style=”width:50%;”」と書き直していた。

 しかし、毎回毎回、じつに面倒臭い。

 そこで、意を決してカスタマイズした。

 この「width」「height」を書き込んでいるのは、WordPressインストールディレクトリの下の「wp-admin/includes/media.php」というファイルである。

 このファイルの末尾に、次のように書き加える。

function remove_hwstring_from_image_tag( $html, $id, $caption, $title, $align, $url, $size ) {
	list( $img_src, $width, $height ) = image_downsize($id, $size);
	$hwstring = image_hwstring( $width, $height );
	$html = str_replace( $hwstring, ' style="width:50%;" ', $html );
	return $html;
}
add_filter( 'image_send_to_editor', 'remove_hwstring_from_image_tag', 10, 7 );

 これで、邪魔くさいwidth・heightの代わりに幅50%のスタイルが無理やり書き込まれる。

 この改良に当たり、次のサイトを参考にさせていただいた。

 ただ、これをやっちまうと、WordPressのアップデートがあるたびにこのファイルをカスタマイズしなければならないわけである。うーん。……ま、いいか。

SSLと株

投稿日:

 もう10年以上くらいにもなるだろうか、株式売買の指標表示を自動化し、「小魚を釣る」ようにして株を売買している。ところが、先週頃から、その自動化システムが動かなくなってしまった。

 私の株式売買は、夜に自作の株式売買シミュレータを作動させ、そのシミュレーション結果に従って手動で翌日の注文を出すという方法だ。注文そのものの自動化もやればできるだろうが、証券会社がAPIを公開してでもくれない限り、多少技術的な敷居が高いので、そこまではしていない。

 株式売買にはいろいろな指標があるが、その指標を使うのに必要な日数などのパラメータは、銘柄ごとに違う。また、指標ごとにも違うので、色々な組み合わせが出てくる。サラリーマンの場合、何十もの銘柄について、銘柄ごとに手作業でそんな組み合わせ作業を毎日している時間など、あるはずがない。

 そこで、色々なパラメータを組み合わせて、過去のデータを使って売買のシミュレーションを行うのだ。トレーディング用語では「バックテスト」と言う。私のシミュレータでは、現在は1銘柄につき約1万通り程度の組み合わせで売買を試す。

 そのシミュレーション結果で、「90%~100%成功するパラメータの組み合わせ」を抽出して表示するのである。実際のところ、そのパラメータの組み合わせで売買サインが出た時に売買すれば、まず9割は儲かる。1割の確率で損をするのだが、これは10銘柄を束にして注文しておけば、「1銘柄はハズレでも、残り9銘柄は当たり」になる。つまり、期待値として「9割は儲かる」理屈になるわけである。

 だが、私が最も工夫した点は実はそこではない。

 私は勤めており、職務に専念する義務がある。これはサラリーマンなら誰でも同じだと思う。仕事中に株式の売買などすれば、免職になってしまう。そこで、このシミュレーションは、売買サインをリアルタイムの株価で出すのではなく、「前日までの株価でシミュレーションし、翌日約定の注文を出した場合で最適なパラメータの組み合わせ」をシミュレーションにより求める。こうすることで、「前日の夜から当日の朝にかけて、自宅で注文しておく」ことができる。つまり、「サラリーマンが職務外の余暇に自宅で自分の金融資産の管理をしているだけ」という形を整えることができるのだ。

 多くのサラリーマンは株で損をするが、それは、株式の必勝本などには、「今の株価」で売買しなければならないような方法しか書かれていないからだ。これだと、例えば、ある日の経済ニュースなどでその日の株価について知り、夜帰宅して、翌日の注文などを出しても、もう手遅れなのだ。だが、私のシミュレータは翌日の注文で十分なように計算するので、サラリーマン向けなのだ。

 シミュレーションに必要な日々の時系列データは、「Yahoo!ファイナンス」から無料で拝借してくる仕組みである。夜にその日の終値が確定した頃、自動的に株価をダウンロードしてくる。無料で済ませるため、生のhtmlを持ってきて株価データをその中から切り取り、データベースに格納する仕組みだ。

 システムはLinux上で動作する3層クライアントサーバシステムである。ユーザインターフェイスはphpで書かれており、Webサービスだ。株価データは、Perlで書かれたスクリプトを定期起動して、前述のようにしてネットから無料で持って来る。データベースはPostgreSQLを使用している。シミュレーションは高速化を図るためCで書いてある。

 ここ数年、何ら不調なく快調に作動していた。ところが、先週から急に動かなくなってしまった。

 短期の株式売買は毎日の値動きに注意していなければならない。私はこの値段の監視を自動化していたわけだ。ところがこれが動かなくなるとお手上げだ。自分で毎日株価を見なければならなくなってしまう。私もそれなりに忙しいので、何十銘柄もの株価チェックを自分でするなんて馬鹿々々しいことは御免である。

 早く原因を調べなければならなかったが、春の人事異動で職場が変わったりして、手が付けられないでいた。ようやく、今日になって原因を調べることができた。

 調べてみると、どうやら、株価データの拝借先である「Yahoo!ファイナンス」の仕様が変わったようだ。これまで非SSLでもサービスしていたのだが、先週頃完全にSSLに改まったらしい。他方、私の「株価データ拝借スクリプト」はPerlで書いてあり、内部で「wget」を呼び出し、これを用いて「時系列株価ページ」を持って来て、その中からデータを切り出す仕組みなのだが、ハードコーディングしてあるURLのスキームは「http」なのである。

 なるほどよしきた、とばかり、これを「https」に変えて試したが、wgetはブラウザのように簡単にはSSL証明書を扱うことができない。

 ググッてみると、「そういう時にはwgetのオプションに『––no-check-certificate』って書いとけ!」と、どなたかが既に調べて書いておられる。ありがたや。

 そこで、作動させるwgetのコマンドラインは次のようになるわけだ。

$ wget --no-check-certificate -q -O - https://info.finance.yahoo.co.jp/history/?sy=1983&sm=1&sd=1&tm=d&code=銘柄コード&p=1 | nkf -w 

 URLのスキーム部分を「https」にし、「––no-check-certificate」にするだけである。

 株価時系列データのページの作りが変わってしまっているとこれだけでは駄目なのだが、どうやらページの作りは同じらしく、今のところうまく行っているようだ。

プログラミングを何読んで覚えたんだったか

投稿日:

 美しいお姉さんが電車の中で「たのしいプログラミング Pythonではじめよう」なんつー本を読み耽っているのを見た。そのお姉さんはどうもプログラマなどには見えない。カジュアルな感じのお姉さんが、カジュアル~、に、そういう本を読んでいる。ああ、時代だなあ、と思う。

 そういえば、私自身はプログラミングの入門本というものを読んだことがないことに気づいた。BASICで8ビットプログラミングをしていた頃は入門本などなくても、マシンのリファレンス・マニュアルで十分だったし、機械語やアセンブラなどは命令表を見てプログラムを作ったものだし、それ以降も、例えばCだったらカーニハンとリッチーの「プログラミング言語C」、C++だったらストラストラップの「プログラミング言語C++」、Javaだったらゴスリングの「プログラミング言語Java」など、それらの言語の開発者が書いたものを参考にして覚えてきた。

 今はほとんどネット上のリファレンスで間に合ってしまう。だからPHPや、あるいはCSSとかHTMLの参考書など1冊も持っていない。

 そうなってしまった理由は、多分古い時代からプログラミングに親しんできたからだと思う。世の中の進歩に合わせて、自分も少しづつ進歩してきたので、入門本を必要としなかったのだ。

 だから、私のやり方はこれから入門する若い人には全く参考にならないということになる。

 ということは、さしずめ私など、「参考にならない、何の役にも立たぬ先輩」ということになるわけだ。後輩の指導には向かぬ。ハァ。