人気ブログランキング |
技術計算屋である。技術計算屋は良くExcelを使う。

どんな風に使うかというと、なにか計算した結果を取り込んでその結果を加工して次の計算のインプットに使用するとか。
つまり、Excelも一つのプログラムの様な使い方をする。入力と出力はCSVファイルが扱い易く、すると処理はこようなイメージ。

b0068891_10464849.png
例えば二つの時刻歴シグナルをExcelに渡し、それぞれのフーリエ変換の除算から伝達関数を出力するとか。

このような処理を大量に実行するので、CSVファイルをExcelのシートに貼り付けたり、ExcelのシートからCSVファイルを出力できるコマンドが有るととても便利。

そのようなツールを作成する方法はいくつかあって、代表的なものはMicrosoft.Office.Interop.Excelを使ったCOM(Component Object Model)参照とClosedXMLを使う方法。

それぞれ、メリットデメリットがあるのだけど、COM参照の一番厄介なのは、オブジェクトの解放が面倒で、丁寧にかかれたプログラムでないとEXCEL.EXEのプロセスが残ってしまう点。そして、実行するマシンにExcelがインストールされていないと利用できない。

一方、ClosedXMLはExcelがインストールされていなくても動作させることができ、そしてC#のガベージコレクタがメモリを管理してくれるので処理に失敗してもEXCEL.EXEのプロセスが残ることはない。その辺りのことはこちらに分かりやすく書かれている。
https://qiita.com/midori44/items/acab9106e6dad9653e73

ClosedXMLは使いにくいと評されるMicrosoft Open XML Format SDKをラップし使い易くしたもの。「使いにくいOpen」をラップしたから「Closed」なのか?

ところで、双方に「XML」と有るのだけどそれはなぜかというと、.xlsxや.docx、.pptxはOpenなXMLで書かれているから。試しに手元のExcelファイルの拡張子を.xlsxから.zipに変更して解凍ソフトで解凍するとテキストで書かれたXMLファイルを確認することができる。

このことから想像できるけどClosedXMLが扱えるのはXMLで書かれた.xlsx、.docx、.pptxであり、.xls、.doc、.pptは操作できない。

ということで、僕もこのClosedXMLを使ってC#でCSVファイルとExcelとの間で情報をやり取りするプログラムを作ってみた。

作ってみて分かったことをひとつ。ClosedXMLはExcelファイルを開いたときに「改ページプレビュー」と「印刷範囲」の設定が外れてしまう。現状の自分の用途としては問題ないのだけど、これらが重要な場合は改ページプレビューや印刷範囲の取得と再設定が必要になる。

仕事で絡みのある方からの要望もあり、独自言語仕様のインタプリタを作ることにした。

インタプリタとはプログラミング言語の実行形態の一種。それって何?という方はこちらを。
http://www.cuc.ac.jp/~miyata/classes/prg1/02/2way.html

# 仕事の関係もあるので、構築の詳細は記載していません。
# 構築方法の詳細をご希望の方は期待はずれですので、ご了承ください。

いろいろと情報を探すと、インタプリタは字句解析と構文解析からなり、構文解析したものを意味解析(1行ずつプログラムを実行)する仕様が多いのだとか。
そしてなんと、世の中にはこの字句解析と構文解析をしてくれるCやC++のソースを吐き出すlexやyaccというツールも存在するらしい。
その辺りの情報はこちらでどうぞ。

とはいえ、インターネットの情報だけでは心許ないので本を一冊購入した。

こちらはlexやyaccを使うことなく、字句解析や構文解析の基本的な動作を記載した感じ。
今回作る独自言語は仕様をかなり限定的にするので、ツールを使うことなくこの本に記載されているような方法にした。

次に独自言語を開発する言語をどうするかという問題がある。
Windows他、MacOSやLinuxでも動作させるものとして作るならやはりC++なのだろうけど、僕はC++にどうも苦手意識がある。
当面はWindowsでしか使わないので、ここは割り切って最近よく使っているC#で作ることにした。
コンソールで動作するようなプログラムなら、C#でXamarin.Macや、monoを使えば直ぐに他OSで動作させることができるのではないかという目論み。

で、どんな感じの言語かというと、以下の仕様。

#ここから
c1 = "これは文字変数です"
c2 = "この言語は独自仕様言語です"

print c1
print c2

for i = 1 to 10
 for j = 0 to 20 step 2
  if ( i lt 5) then
   print " i はまだ5以下です",i
  end if
  if ( i ge 5) then
   print " i が5以上になりました",i
  end if
  pause
 next
 print " j の値は" , j , "です"
 pause
next
quit
# 先頭文字が # ならその行はコメント
# ここまで

その他、もちろんgotoも実装する。
と、いうより制御構造はgotoとifが実装できれば、forループはその応用で実装できる。
更に、昔懐かしいN88BASICなんて言語にあったgosubを使った関数もgotoで実装することができる。

実際に作り始めて上記の独自言語プログラムを動作させるところまで4日であった。
yacc、lexを使っていないのでかなり強引な部分があり、それ故に特に制御構造のネストに苦労した(なんと購入した本には「ネストは複雑になるので考慮しない」と書かれていた)けど、おそらく実働は2日くらいだと思う。

なんというか、、、Visual Studio 2017が凄いな!
ど素人でもなんとなく作れてしまう。

今後は、目標とする「大量にデータを作成して大量に計算を実行するインタプリタ」の為に、既に実装経験がある機能をひとつ一つ追加していく。

あッ、そうそう配列変数も実装する。

◆事前のトレーニング

8月初めの日曜に沼津トライアスロン駅伝に参加。その時、一緒に行った娘に「パパ、白いウェアだとお腹出てるのが目立つ」と言われる。写真を見たらおやまぁ…なんとかせねば。

b0068891_23192034.png

結局、7月のバイク実走は56km、8月は8km。7月まで忙しかったので昨年の佐渡以降それまでの実走は無く、つまりこの一年で64kmの走行距離だった。


因みにランは7月86km、8月116km。スイムはもっと酷くてジムに行っても300mくらいの水浴びしかしていない。


しかし、何もしていないわけでは無く、友人から譲っていただいたローラーで、メディオというメニューをひたすらにやっていた。ローラーなんて25年ぶりだぜ。毎度40分くらいで終わるので、忙しくてもできる。そして頼みはこれだけ。もうなるようにしかならないと覚悟を決める。


◆スイム

b0068891_23194479.png

9月3日午前6時、236.2km先のゴールを目指す。スイムは2kmを2周回。コースロープ側はバトルが激しいので、初めは離れたところを泳いでいたのだが、いつの間にかロープ側へ。バトルに巻き込まれ、故意じゃないかと思えるようなフライングボディアタック…ではなくスイミングボディアタックやキックを受けて少々腹立たしい気持ちになるが、やり返したら相手と同じと思い、我慢して大人しく泳ぐ。


こういうのは相手の顔が見えない車の運転と同じか?ちょっとした挙動(行動)がやたらと腹立つことがあるけど、そういう時こそ冷静になるべき。


900mの第1ブイを周り、200m泳いで第2ブイを周って陸に向かう区間に入ると少しバラけたのでバトルは無くなった。しかし、僕は放っておくと右に寄ってしまうので、時折右腕がコースロープに引っかかり上手くストロークできないことが何度もあった。然も新しいウェットにも関わらず、全くワセリンを塗らなかったので、首の後ろが擦れて痛くなってきた。失敗ったと思ったが後の祭り。結局ドタバタで1周目を周り、陸に上がってみると2kmを47分。スイムは遅いのでまぁこんなものか。


2周目に入ると擦れた首がかなりヒリヒリしてきた。下手な呼吸の典型なのだが、首を前に上げるような動作で呼吸するので、その都度首の後ろがウェットに擦れてしまっている。どうにも我慢できなくなり、何か工夫しようと、入水した手を少し下方に伸ばし、呼吸は真横を向くようにした。これ、良い泳ぎ方を少し極端な動作にしたような泳ぎ方。しかしこれが良かった。なんと2周目の途中からスイマーズハイ(の様な)の状態になる。すごく楽だし、ワンストロークの伸びが違う。いつまでも泳いでいられそう。もう今日はこれだけで終わっても満足できる。


2周目は楽に泳ぎ切って1周目よりタイムが良いと確信しながら見た時計は1時間41分。あれ?2周目の方が遅いではないか。本日最初の勘違いであった。


上がった時に振り返るとそこにはFacebookの友人が。この後も怪我のない様にと握手をして別れる。こちらは本日最初の出会い。


◆バイク

バイクは乗ってないから無理はしないと決めていた。初めはケイデンス90くらいでAve.34km/hくらいだったが、これでは絶対に190kmは走り切れないと思い、走りが落ちついてきてからはペースを落とす。


前半の大佐渡は後半の小佐渡より少しアップダウンが有る。ペースを落としたので心拍や脚の負荷はそれほどでもなく楽なのだけど、ちょっとした登りが脚にくる。大したことない登りも実走無しでは厳しいことを実感する。前半の山場、Z坂を終える頃にはAve.27km/hくらいまでに落ちる。


バイクエイドはいつもは停車せずに減速だけで補給を受け取っていた。今日は無理をしないので、必要であればしっかり停車することにした。86km地点の浦川では停車してバイクを置き、おにぎりやらスイカなどをいただく。ついでにトイレも。並んでいる時に後ろの人と話したり。「まだ、先が長いですからねぇ」「後半の方がキツいですか?」「コースは前半の方がキツいと思います」(小木の坂以外はね)なんて感じ。


浦川を出てここから先は暫くフラットな区間に入る。ところが、ここでプチペダリング革命が起こる。これまではケイデンス90を意識して来たけど、少し重めのギア比でケイデンス80~85くらいだとリズム良く回り然も速い!前を走る選手を次から次へと抜き去る。練習してないにも関わらずいつものパターンに入り込んで意識が集中しだした。負荷をそれほど感じないのにスピードに乗り、走っていることが楽しくなる。ゾーンに入ったぜ。明らかにドラフティングという集団パックも楽にブチ抜く。かなり気持ち良い。練習してないのになんでこんなに速いんだろう?落ちたアベレージも上がり始める。ここまでの距離の積算の割には目に見えて上がってきた。自分に何が起こったのか全くわからず、もしかして天才じゃなかろうかと思った。Stravaを見てもこの辺りの区間はそこそこイケてる感じ。


しかし、本日2度目の勘違いも小木の坂までであった。浦川から小木までの74kmは殆ど抜かれることなく順位も上げて来たけど、ベストから7kg重い体には小木の坂は厳しかった。7kgって言ったら下手したら自転車一台分だからなぁ~。これまで抜いて来た人に次から次へと抜かれ始める。いつもは坂で抜かれることなんてあまりないのに…。


なんとか小木を乗り切り、最後にもう一つ有る登りに入ると坂の途中でFacebookの友人が応援していた。本日2度目の出会い。ヘロヘロな状態で登っていたので、変な挨拶をしてしまったかもしれないけど許して。ごめんなさい。


けっこう疲労した状態で最後の30kmを走ってやっとの状態でバイクをゴール。と、ここで毎年佐渡で会う、バイクラックが数個だけ離れた、こちらもFacebookの友人に会う。「キツかったですね」とか「ラン走れる気がしないですね」などと一頻り話して別れる。本日3度目の出会い。


◆ラン

ラスト、フルマラソン42.2km。ホント、走れる気がしない…と思って走りだしたらなんだか調子良し。心拍ゾーンが80%を超えない154bpmに注意しながら走る。すると1km辺り5分40秒~50秒を刻む。(garminの計測で停止時は時間が進まないモードだったので実際は6分/km程度)


とにかく、2.5km程のエイドの間隔が短く感じる。ランだってそれほど走り込んでないのに一体どうしてしまったのでしょうか本日のワタクシ。何処かでペースダウンが来るだろうなぁと思いながら、一方では上手くいくとサブ4で行けちゃうか?なんてことも感じた。(本日3度目の勘違い)


10kmの折り返しまではペースダウンにならないで欲しいと思いながら走って来たけど、けっこう楽にたどり着く。ハンガーノックになると完全に走れなくなるので、エイドのおにぎりをお茶で無理に流し込んだり、汗で出ていった水分やミネラルを取り戻す為に塩や梅干しも補給する。いつペースダウンが来るんだろうと不安な気持ちを抱えながら1周目のハーフ迄は同じペースで走って来た。昨年は暑さも有って、ホントにここで止めてしまおうかと思ったけど、今年はそんなこともなく気持ち良く2周目に入る。


2周目に入って暫くすると、6分/km以上かかるようになった。時折、7分を超えたり8分を超えたり。遂に来たかペースダウン。心拍も落ちてしまったので、如何にも脚が走ることを嫌がっている感じ。こうなると先が長い。これ、補給でなんとかなったりするものなのかなぁ。やっぱり走り込んだ分しか走れないのかな?などといろんなことを考え始める。辺りは少し暗くなり始めて来た。タイムが良い時は夕陽を正面に見ながらゴールに向かうけど、今日はゴールから離れる方向に走っている時に背中の方で夕陽が山に落ちた。


暗くなると周りが見えない分、尚更いろんなことが頭を過る。年末のマラソンに向けて戦ってる友人。今年はトライアスロンや他のレースに出ることもなく他のことと戦ってる友人。速報を見ながら応援してくれている友人。トラやランの友人だけでなく、いろんな人のことが頭を過る。皆んないろんなものを抱えながら生きてるよなぁ。そんなことを思ったら、ペースは遅くても歩かずにゴールまで行こうと思った。


そして、残り5km。ここでバイクの登りで応援していた友人に再び会う。この人、フットワーク凄し!この時、暗い道を一人でいろんな思いを抱えながら走っていたので、会えたことが本当に嬉しかった。元気を頂きました。ありがとうございました!


最後のエイドを出て、残り2.4km。暫く続く暗い直線を抜けてカーブの先の橋を渡ると明るい街が見える。帰って来た。出会いが有ったり、勘違いが有ったり。トレーニング不足だったけど、なんとか帰って来た。ホッとした。


◆記録

順位:458位[年令別33位]/958(スタート人数)

スイム:1時間41分23秒

バイク:7時間27分48秒

ラン:4時間56分31秒

合計:14時間05分42秒


◆おまけ

佐渡に行ったら、ノドグロのお寿司を食べてこなきゃ。

b0068891_23221198.png

そして、帰りは佐渡島に沈む夕陽を見ながら来年に思いを馳せなきゃ。

b0068891_23223056.png

来年、5年連続で当選する気がしないけど、その時はノドグロとこの夕陽と、そしてこの佐渡を走る友人の応援に来ますかね。今年、元気を貰った恩返しに。


# by yojige | 2017-09-07 05:59 | Triathlon
■スイム編
アイアンマンジャパン洞爺湖のスイムはこんなコース。
b0068891_2044678.jpg

スタート前の湖面は穏やかでとても泳ぎ易そうな雰囲気。
b0068891_20441336.jpg

午前6時、最初のウェーブがスタート。M50-54のカテゴリの僕らは6時19分にスタートした。

More
# by yojige | 2013-09-07 21:01 | Triathlon
■スタート前
午前3時、目が覚めると外はゴーゴーという風の音。今日は昨日の予報どおり強い北風が吹いたか。twitterを見ると、「橋、渡れない!」なんて呟きも。全く同感。

朝食を終えて、5時にスイムスタートの東急リゾートに行くと、こんな風。

こりゃホントに橋を渡れないんじゃないかと思った。

More
# by yojige | 2013-05-02 19:27 | Triathlon
ほんとキツかった!

■前日
 前日、大阪から走りに来る友人をお持て成し…なんて会に呼ばれてどうやら2時過ぎくらいまで飲んでしまったらしい…。
 良い子は飲んで走るなんて真似してはいけません。タラウマラという自覚がある人限定です。ちなみに僕はタラウマラではありません。

More
# by yojige | 2013-03-03 08:42 | Triathlon
いろいろと端折ってスイムスタートから。

■スイム編
 佐渡Aタイプのスイムは今年から1周1.9kmを2周する3.8km。午前6時、総計236km先のゴールを目指してスイムスタート。

 僕はヘッドアップしてコース確認するのが苦手なので、毎回コースロープの近くを泳ぐのだけど、当然、最短コースなので必ず混み合いバトルになる。今回も同様に前半は結構なバトル。しかし700mポイントの第1ターンを超えた辺りで混雑は解消され、自分のペースで泳げるようになった。

More
# by yojige | 2012-09-16 22:14 | Triathlon
■レース前
b0068891_112358100.jpg20年トライアスロンをやっているのに一度も行った事が無い宮古島。

行って来たよ宮古島!それにしてもスケールの大きな大会だった。

レース前々日のワイドーパーティーもスケールが大きかった。

これほどの歓迎は1997年の徳之島以来。いや、参加している人数は格段に宮古島の方が多い。

目にするもの全てが賑やかで、今まで参加したトライアスロンの中では最大のスケールだった。

More
# by yojige | 2012-04-29 12:22 | Triathlon
b0068891_2340331.jpg午前9時30分、号砲と共に今年はCブロックからスタート。
AからGまで有るブロックの中でCブロックは一般ランナーの最前列だ。
前方のAとBは陸連登録しているランナーで、持ちタイムでブロックが分かれている。


More
# by yojige | 2011-12-03 23:53 | Triathlon
b0068891_2326968.jpgtwitter繋がりの方に誘われて行って来た。

1000mを10人×100mで泳ぐという駅伝方式。
実は始めてのマスターズスイム。

それにしても開場の千葉県国際総合水泳場は遠い。
7時過ぎに開場最寄りの新習志野駅で待合せということで、当日は5時過ぎの電車で出発。


More
# by yojige | 2011-12-03 23:38 | Triathlon