KTHD台中港線探訪記(2日目)

2月6日

 

朝から阿里山森林鉄路に乗って嘉義→十字路を目指す。

f:id:endloskette:20200206085605j:plain

大井川鐵道黒部峡谷鉄道とは友好姉妹提携を結んでいる

f:id:endloskette:20200206120135j:plain

暫定の終点である十字路駅

f:id:endloskette:20200206125108j:plain

十字路駅の展望台から駅構内を見下ろす

f:id:endloskette:20200206124837j:plain

すごいいい天気だったが、この後急に崩れた

十字路から先は現在不通のため、バスで移動。バス乗車時間自体は約20~30分だったが、ルーズな運用に翻弄され、1時間も待ちぼうけを食らうことになった。

f:id:endloskette:20200206135747j:plain

阿里山駅構内

f:id:endloskette:20200206141715j:plain

米国LIMA製28t SHAY型 (3シリンダー)車番SL-24

f:id:endloskette:20200206142601j:plain

それはそうと、飯

f:id:endloskette:20200206144545j:plain

1999年の九二一地震で損壊した眠月線のシェッドが見える

再び阿里山森林鉄路に乗って、阿里山→沼平

ここから散策。
水山線終点まで行くと往復3km程度(45~60分)だったが、ピロリッシュのヒザが自重を支えられないリスクがあったため、神木までまっすぐ1.6km(20~30分)降りた。

 

f:id:endloskette:20200206154520j:plain

スイッチバック駅の神木駅から阿里山までの間は復旧している

阿里山に戻ってバス7322系統で嘉義まで戻るつもりだったが、白タクのおっちゃんに「一人250台湾ドルでええで」と言われてボロボロのワーゲンで台鉄嘉義へ。古い車の匂い、荒い運転、たまった疲れが相まって危うく吐くところだったが約70kmを2時間で走破しなんとか嘉義駅へ到着。

f:id:endloskette:20200206182658j:plain

嘉義に着くころには吐き気も収まり「85度C」カフェで激甘タピオカミルクティーを飲んだ

19:00 和運租車嘉義博愛站でレンタカーを借り台中へ移動(約90km、1時間)
ハワードプリンスホテル台中に投錨したのであった。

f:id:endloskette:20200206211128j:plain

ビール

f:id:endloskette:20200206211634j:plain

f:id:endloskette:20200206211641j:plain

f:id:endloskette:20200206212026j:plain

f:id:endloskette:20200206212228j:plain

貝やら草やら

f:id:endloskette:20200206212632j:plain

台中の夜は更けていくのであった。

KTHD台中港線探訪記(1日目)

実に4年ぶりの記事となります。

2020年2月5日~7日、KTHDメンバーとともに台湾を訪問した。

 

※写真を追加しました。 

 

2月5日

f:id:endloskette:20200205051421j:plain

羽田空港国際線ターミナルの六厘舎でラーメンを食う

Peach(MM859)で羽田から桃園に到着。

f:id:endloskette:20200205061757j:plain

新しい日本の夜明けじゃき

新しくできたデッキでしばし見学した。

f:id:endloskette:20200205104259j:plain

フードコートで飯を食う。この旅、どれだけ食べられるかの戦いなのである。

桃園機場捷運で機場第一航廈(A12)→新北產業園品(A3)

台北捷運環状線に乗り換えて新北產業園區(Y20)→景安(Y11)

台北捷運中和新蓋線に乗り換えて景安(O02)→民権西路(O11)

台北捷運淡水信義線に乗り換えて民権西路(R13)→北投(R22)→新北投(R22A)

台湾国鉄時代の新北投駅(復元)と保存客車を探訪

f:id:endloskette:20200205131357j:plain

屋根の牛の目型の窓が特徴的

f:id:endloskette:20200205131808j:plain

台鉄時代の客車が保存されている

再び台北捷運淡水信義線にて新北投(R22A)→北投(R22)→紅樹林(R27)

淡海軽軌に乗り換えて紅樹林(V01)→崁頂(V11)

f:id:endloskette:20200205135832j:plain

各駅に簡易型のICカード改札機がある

崁頂は台湾最北端の駅なんだそうな(訪問時点で)

f:id:endloskette:20200205143023j:plain

SVI APVc500

工事用車両が雑に置いてあった。淡海軽軌との関連は不明。メジャーを持ってなかったのでゲージは計れなかったため、淡海軽軌と同じ軌間かわからない。当該形式でグーグル検索すると「台北捷運」という情報も出てくる。いずれにせよなぜここに放置されているかは謎。この辺の、ほぼ新車を持て余している感じ、雑に扱ってる感じが台湾クオリティー

再び淡海軽軌に乗り換えて崁頂(V11)→淡水行政中心(V07)

ニトリやら大戸屋やらが入っているカルフールがあって「はて、ここどこの国だっけ」みたいな気持ちになる(台湾では行く街ごとにこういう気持ちになることが多い)

駅名の由来である淡水區市民聯合服務中心はなんだか初代ガンダムに出てくる宇宙戦艦のブリッジみたいなあか抜けないデザインだった。

f:id:endloskette:20200205150606j:plain

ミニバイクのエンジンオイル自販&交換機 そんなに需要があるのか?

www.youtube.com

説明動画のお姉ちゃんがかわいい(そして衣装がちょっとエロい)ので見て。

バスに乗って淡水市街地に移動。

f:id:endloskette:20200205152102j:plain

分かりやすい異国情緒

淡水渡船碼頭から船に乗って対岸の八里渡船碼頭にに移動。

f:id:endloskette:20200205153851j:plain

日本でも田舎の観光地にありそうだが、EasyCardで乗れる点で台湾の方が先進的

この時点で寒さが限界で、淡水市街のアウトレットっぽいショップでパーカーを買った。天気予報で温かいと思って薄着できたのが失敗だった。台北の冬は普通に寒い。

再び台北捷運淡水信義線にて淡水(R28)→台北(R10)

台湾高鐵(高鐵0669次)に乗り換えて南港→高鐵嘉義

f:id:endloskette:20200205174652j:plain

駅弁である

BRTに乗り換えて高鐵嘉義→台鐵嘉義

f:id:endloskette:20200205194915j:plain

嘉義駅 このどことなく懐かしいデザインが台湾

この日は嘉義駅前のHOTEL DISCOVER(亮黑飯店)に泊まった。

 

f:id:endloskette:20200205203216j:plain

鶏肉飯

f:id:endloskette:20200205203352j:plain

名前にインパクトがある下水湯

f:id:endloskette:20200205203725j:plain

同じようなメニューをついさっき新幹線の中で食ったのでは

f:id:endloskette:20200205195256j:plain

嘉義の夜は更けるのであった

この粒度で三日分書けるのか果たして…

 

MATLAB/Simulink自分用メモ1(変数を変えながらグラフを出力して保存する)

やるべき仕事の量と要求レベルがどんどん上がっていく一方、脳みそがどんどん衰えていく今日この頃、ある程度まとまった文書をアウトプットしていく癖をつけておかないと、もはや毎日が「何をしてたか、忘れちゃった」の繰り返しでしかない今日この頃、皆様いかがお過ごしでしょうか。

最近のマイブーム、MATLABについて自分用のメモ。

・変数を変えながら何度もSimulinkモデルを計算させる方法

そもそもMATLABはコマンドウィンドウからの入力ですべて操作できるようになっているのだが、コマンドウィンドウに入力する操作をファイルに保存して、そのファイルを呼び出すことでコマンドウィンドウへの入力に代用することができる。このファイルは拡張子「.m」で保存される。以下、これを「Mファイル」と呼称する。

また、計算モデルが複雑になるとコマンドだけでやり取りするのは人間には難しいので、MATLABプロダクトファミリのひとつであるSimulinkを使ってモデリングを行う。Simulinkを使って作成するモデルの拡張子は「.mdl」である。以下、これを「モデル」と呼称する。

今回は、モデルに代入する数値や条件を変えながら自動的に計算を行うためのMファイルの記述方法について書きたいと思う。

今回は図1のようなモデルを例に取る。

ファイル名は「sample_model.mdl」とする。モデルの作成方法については今回は議論しない。

このモデルの変数は「a1」「a2」「b」の三つである。この三つの変数を、それぞれ1〜10まで1きざみで代入して計算を行うとする。三つの変数それぞれに10パターンできるので、合計で10^3=1000パターンが出力される。

以下、Mファイルの記述である。説明はコメント行で代用する。

%-----------------------------------------------------
% ループ用サンプルMファイル
%-----------------------------------------------------

clear; %初期化のおまじない。

for l=1:10 %1番目のループ

for m=1:10 %2番目のループ

for n=1:10 %3番目のループ

tic; %処理時間計測開始 書かなくても良い 書いておくとコマンドウィンドウに処理時間が表示される

a1=l %a1にlの値を代入
a2=m %a2にmの値を代入
b=n %bにnの値を代入

sim(sample_model); %シミュレーション実行

toc; %処理時間計測終了

end;

end;

end;

%-----------------------------------------------------


a1、a2、bに値を代入する式を書き換えることでさまざまな数値を代入することができる。
たとえば、偶数にしたい場合は
a1=2*l;
とか、あるいは指数の場合は、
a1=10^l;
とか。

あんまりありがたみがないが、今日のところは疲れたのでこれまで。

次回はグラフの名前を自動的に付けて保存する方法について説明したいと思う。

BITCOINの費用対効果に関する考察

昨日のクローズアップ現代においてBITCOINが取り上げられていた。BITCOINに関して思うところあるので実に1年ぶりにブログを書く。

BITCOINはサトシ・ナカモトなる人物によって投稿された論文に基づいたピアツーピア型の決済網及び暗号通貨である。

昨日のクロ現においては、BITCOINのギャンブル性の高さ、マネーロンダリングや麻薬取引の温床となっている点など、ネガティブな側面を中心に取り上げられていた。
(ただ、番組で取り上げられたことで関心を集め、かえってトラフィックを増大させてしまったWinnyの例もあり、果たして番組制作者の意図が視聴者に伝わったかどうかは不明だが、これはまた別の話。)

番組においては不用意に射幸心をあおることを避けたためか、BITCOINのもっとも肝心な点が報道されていなかった。
それは「計算リソースを対価にBITCOINを得ることができる」という点である。パソコンで計算させ続ければ小遣いが稼げる、ということである。

本記事においては、多くのBITCOINのマイナー(計算を行うことでBITCOINを得る者)が使用しているグラフィックボードであるRADEON HDシリーズを例にとり、もっとも費用対効果に優れたモデルを選出することを目的とする。

図はRADEON HDシリーズのグロスの演算能力(GFLOPS)と、BITCOINの計算における単位である1秒間のハッシュ生成数(Mhash/sec)を比較したものである。
計算においては【スペック一覧】DirectX 11対応GPU仕様一覧表 - PC WatchおよびMining hardware comparison - Bitcoin Wikiを使用した。
GFLOPSとMhash/secの傾向はおおむね一致するといえる。また、グラフィックチップの世代ごとのゲーム用APIに対する最適化はマイニングにおいてはあまり影響しないと思われる。

図は単位価格あたりの演算能力を比較したものである。価格は1月20日における価格ドットコムの各エディションの最安値を使用した。
ハイエンド向けセグメントとエントリー向けセグメントにおいては値が低く、ミドルレンジにおいては値が高い傾向にある。
これは、ミドルレンジビデオボードが費用対効果において優れたいわゆるスイートスポットであるという、ゲーマーの世界における通説と一致する。
これは、ハイエンド向けが歩留りにより単価が高いこと、エントリー向けがビデオチップそのものよりもボードの生産コストが全体の価格に占める割合が高くなることが要因といえる。
この図においてはRADEON HD 7770GHZ EDITIONが最も費用対効果に優れていることを示している。

ではこの7770を使用した場合、どれだけの日本円が稼げるのか。
1.34Ghash/secで24時間計算した場合の対価を0.001BTC/day(話題のBitcoinを専用ASICで採掘したりアレコレして思ったこととか【コラム】 | TeraDas)、1TBCあたり98900円(http://satoshinakamoto.jp/?lang=ja)とした場合、1か月あたりの対価は471円。
対して7770の価格は8180円であり、これに加えて24時間計算させるためには電力もかかる。
つまり、現実的に考えてもとは取れないのである。

加えて、現在の計算の主流はグラフィックボードではなく専用のドングルやクラウドを使うことらしい。また、この専用ドングルを個人輸入して転売するほうが儲かるという話もあるようで、「いかなるギャンブルも結局は元締めが最も儲かる」という今更言うまでもない結論に至ったところで本文を締めたいと思う。

携帯電話買い換えた話

学割を使って携帯電話が契約できる今のうちにすべてのキャリアを契約してしまえ!ってことでDocomoauSoftbankすべて契約するという暴挙に出た。2年後に全部MNPして電話番号維持しつつ本体代の割引狙う魂胆(果たして2年後どうなることやら)データ通信についてはWiMAX使うので、最低料金で運用することを主眼に置いている。

まずDocomoからXperiaZ SO-02E(ブラック)
Xperia™ Z SO-02E | ソニーモバイルコミュニケーションズ
画面がでかくてFullHDの高精細なのだが「いかにフォントを美しく見せるか/いかに画像と映像を高精細に見せるか」に注力しているため、一度に画面に表示できる情報量はMIDやタブレットよりは少ない印象。
プリインストールソフトとしてはGoogleマップを利用したカーナビゲーションソフトの「Sonyドライブ」と、言わずと知れた「WALKMAN」が今のところのお気に入りである。Sonyドライブは通常のGoogleマップよりはカーナビとしては洗練されている。WALKMANについても気合が入っているようで試供品のイヤホン「MH-EX300AP」が付属する。
今回契約したプラン:本体代24回払い3011円+タイプXiにねん0円+spモード315円+Xiパケホーダイダブル2100円(上限6510円)+ケータイ補償399円−月々サポート1995円=3831円(最大8241円)

次にauからiPhone5(16GBホワイト)
http://www.apple.com/jp/iphone/
もはや説明あるまい。iOS用アプリが試したかった。ただそれだけ。iPadWifiモデルやiPodでもいいじゃんって言われたらそれまでなんだが。
今回契約したプラン:本体代24回払い2570円+基本使用料0円+AppleCare366円=2936円
不必要なもの全部外してくれ!って言ったら実質本体代とAppleCareしか残らなかった。通話はできるがデータ通信はおろかメールもできない仕様である。

最後にSoftbankからArrows A101F(マゼンタ)
http://www.fmworld.net/product/phone/101f/
今回契約した中で一番どうでもいいポジション(電話番号さえ手に入ればよい)なのでこれだけ4Gではなく型落ちの3G端末。とはいえ今まで使ってたIS05に比べたら断然処理速度は速い。
今回契約したプラン:本体代24回払い980円+ホワイトプラン0円+S!ベーシックパック315円+パケットし放題S390円+安心保障パック498円−バリュープログラム490円=1693円

最後にWiMAXであるが、今回はWiMAX+3Gを契約した。月額使用料3880円+プロバイダ使用料525円=4405円

全部ひっくるめて12865円/月となるが、果たして安かったのか高かったのか。
まぁWiMAXは春からのインターネット回線としての役割も担っているから、純粋な携帯代は8460円である。3回線維持してこの値段ならまぁ許せんこともないかなぁといったところか。

USB3.0の外付けHDDケースの話

今使ってるノートパソコン(富士通のLIFE BOOK PH75/DN)にはUSB3.0ホストが付いているんだが、USB3.0対応デバイスは持っていなかった。
今回、2.5インチHDD(東芝MK6465GSX)が手に入ったのでポータブルHDDとして運用すべく、玄人志向のGW2.5TL-U3/BKを買ったので、ベンチマークをとってみた。
http://www.kuroutoshikou.com/modules/display/?iid=1667
このケース、ドスパラで980円と不安になるぐらいの安さ(今回はポイント使ったのでタダ)であったが、それなりの速度で動いている。

参考のためにeSATAとの比較を行った。ケースはOWL-ELCD35/EU、パソコンがeSATAポートを持たないため、ExpressCard対応ホストアダプタEX34Nを使用した。
Owltech ドライブケース OWL-ELCD35/EUシリーズ ガチャポンパッ!
pw5v-ex34n
USB3.0と比べてかなり遅い結果になってしまったが、どこにボトルネックがあるかは不明。

HDDの生の速度が出てるかどうかはわからないが、USB2.0よりはよっぽど速いということがわかったので今日はこれまで。

MPI超超入門 第2回 「もっとHello world編」

前回はお約束通り「Hello world」してみましたが、実行時オプションで強制的に並列実行しただに過ぎませんでした。
そこで今回は、きちんとした「MPIでのHello world」をしてみたいと思います。

まず最初に、MPIを使用したもっとも簡単なプログラムについて紹介します。

最低限のMPIプログラム

program main
include 'mpif.h'
call MPI_INIT(IERR)
call MPI_COMM_SIZE(MPI_COMM_WORLD,NPROCS,IERR)
call MPI_COMM_RANK(MPI_COMM_WORLD,MYRANK,IERR)

write(*,*)'Hello world!','NPROCS=',NPROCS,'MYRANK=',MYRANK

call MPI_FINALIZE(IERR)
stop
end

このソースコードについて説明します。

include 'mpif.h'

インクルードファイル'mpif.h'がインストールされる場所は環境によって異なります。MPIを使用したプログラムを書く場合は必ずこのmpif.hをインクルードしてください。この中身について知る必要はありません。*1

call MPI_INIT(IERR)

MPI_INITで指定する引数(この例ではIERR)は必ず指定される必要があります。コールしたMPIサブルーチンが正常に終了すれば「0」、エラーが発生した場合はそれ以外の値が戻ってきます。
このサブルーチンと指定する引数を指定しなかった場合segmentation fault等でエラーとなるので、必ず指定される必要があります。

call MPI_COMM_SIZE(MPI_COMM_WORLD,NPROCS,IERR)
call MPI_COMM_RANK(MPI_COMM_WORLD,MYRANK,IERR)

ここではまとめて説明します。この二つのサブルーチンはコミュニケータに属しています。
MPI_COMM_SIZEの第二引数(ここではNPROCS)は、MPI実行時のプロセス数です。
MPI_COMM_RANKの第二引数(ここではMYRANK)は、MPI実行時の各プロセスに割り振られる背番号です。
二つのサブルーチンの第一引数「MPI_COMM_WORLD」はコミュニケータと呼ばれるグループ名です。
コミュニケータは、MPI実行時の全てのプロセスをまとめたものです。

call MPI_FINALIZE(IERR)

MPIの終了処理を行うサブルーチンです。これを書かなかった場合、誤作動を引き起こすことがありますので必ず記述してください。

コンパイルと実行の例1(某工業大学スパコンの場合)

mpif90 hello_mpi.f -o hello_mpi.out -mcmodel=medium
mpirun -n 4 hello_mpi.out
Hello world! NPROCS= 4 MYRANK= 2
Hello world! NPROCS= 4 MYRANK= 1
Hello world! NPROCS= 4 MYRANK= 0
Hello world! NPROCS= 4 MYRANK= 3

全てのプロセスで「Hello world! NPROCS= 4」が表示された一方で、「MYRANK」の数がプロセスごとに異なりました。
これは、プロセスの総数を表すNPROCSが一定である一方、MYRANKの値がそれぞれのプロセスに固有であることからご理解いただけるご思います。
また、注目すべき事柄として「MYRANK」が「1」から始まる数ではなく、「0」から始まる数であること、さらに重要なことに「MYRANK」が昇順あるいは降順になるとは限らないことが挙げられます。
特に後者に関してよくある誤解として「MYRANKの順番どおりに処理が実行される」というものがありますがこれは間違いですので、プログラムを書くときは「どのプロセスが一番先に始まり、どのプロセスが一番最後に終わるかは実行時によって違う」ということを覚えておいてください。実際、この次に実行した際の結果は以下のようなものでした。

Hello world! NPROCS= 4 MYRANK= 0
Hello world! NPROCS= 4 MYRANK= 3
Hello world! NPROCS= 4 MYRANK= 1
Hello world! NPROCS= 4 MYRANK= 2

次に、同様のプログラムをC言語で書いた場合について説明します。

#include "mpi.h"
#include
int main(int argc, char **argv)
{
int n, myid, numprocs, i;

MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
MPI_Comm_rank(MPI_COMM_WORLD,&myid);
printf("Hello world! numprocs=%d myid=%d\n", numprocs, myid);
MPI_Finalize();
}

このソースコードについて説明します。

#include "mpi.h"

C言語の場合はインクルードファイル'mpi.h'を必ずインクルードしてください。この中身について知る必要はありません。

MPI_Init(&argc,&argv);

MPI_Initで指定する引数はmain関数で指定される引数と同様にする必要があります。FORTRANのIERRに相当する引数は指定する必要はありません。

MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
MPI_Comm_rank(MPI_COMM_WORLD,&myid);

MPI_Comm_sizeの第二引数(ここではnumprocs)は、MPI実行時のプロセス数です。
MPI_Comm_rankの第二引数(ここではmyid)は、MPI実行時の各プロセスに割り振られる背番号です。
二つのサブルーチンの第一引数「MPI_COMM_WORLD」はコミュニケータと呼ばれるグループ名です。
FORTRANのように第三引数IERRに相当する引数は必要ありません。

MPI_Finalize();

MPIの終了処理を行うサブルーチンです。これを書かなかった場合、誤作動を引き起こすことがありますので必ず記述してください。
引数を指定する必要はありません。

コンパイルと実行の例1(某工業大学スパコンの場合)

mpicc hello_mpi.c -o hello_mpi.exe -mcmodel=medium
mpirun -n 4 hello_mpi.exe
Hello world! numprocs=4 myid=3
Hello world! numprocs=4 myid=2
Hello world! numprocs=4 myid=1
Hello world! numprocs=4 myid=0

次回からはデータ並列処理のプログラムを紹介します。

*1:中身についての簡単な説明はまたの機会にしたいと思います