ポタージュを垂れ流す。

マイペースこうしん(主に旅行)

18きっぷで日本縦断(2日目:準備編2)

要旨:稚内に移動して岬2つ見る

旭川から稚内に行きます

節約のため特急ではなく18きっぷを使用

f:id:potaxyz:20210323014214j:plain
稚内行き 普通列車

行き先が書いていない(ダイヤ改正で書かれなくなったとか聞いた気がするが)

名寄と幌延で長時間停車しつつも廃駅が増えてスパースになった宗谷線をひたすら北上する

f:id:potaxyz:20210323015900j:plain
車窓はだいたい真っ白

景色はずっと真っ白で雪降ってたりみぞれ降ってたりしたけどそういうのがいいんだよね〜

稚内に到着

何食うか考えてなかったけどとりあえずラーメン食べようと思ってラーメン屋へ

(ラーメン青い鳥)

優しいお味でおいしかったです

地元の人が店主と話してて今日は寒いねえ〜みたいなこと言ってたから多分寒いんだと思う

稚内駅と宗谷岬の往復バス乗車券を買って宗谷岬

どうでもいいけど南稚内駅の近くのバス停の名前が南駅前なの、その付近だと確かに一意に定まるけどなんで南稚内にしなかったんだろーって思った(発音したときに長いから?)

宗谷岬到着

f:id:potaxyz:20210323014222j:plain
宗谷岬

バカみたいに風が強く、みぞれが体に打ちつけてきた

宗谷岬の展望台は冬ということで休業、灯台があったけど入り口に鎖がかかってて入らない方がよさそうだった

ただ、横にあった旧海軍望楼とかいうとこから岬を見下ろすことができた(上のツイート、風が強い)

40分ほど宗谷岬周辺を見ることができた 戻る(バスを使う場合宗谷岬を14:55に出るものが稚内駅へ行ける最終便)

稚内駅に戻る いつもならそのまま別のところを見るのだが先にホテルにチェックインする

今回はわっかない応援クーポンとかいうのが配られてたので実質3000円引きということになるのかな?

ただそのクーポンが少し曲者で、乗る/食べる/買う でそれぞれ1000円ずつというもの

まあそれぞれの業種に利益を与えるという意味ではいいけど使う側は少し難しいね

そこで

  • 食べるは普通に夜ご飯に使用

  • 乗るは宗谷バスの1000円で買える回数券にして、次に行くノシャップ岬と回転寿司屋までの交通費にして、余ったら今度来たときに使えるような形にしよう*1

  • 買うはそのうち…

ってことで考えてホテルから出てバスの回数券を買い*2、ノシャップ岬へ

向かうバスの途中ですごい雪というかあられ?が強く降ってきて大丈夫か〜って思ってたけどだんだんやんで雲の隙間から夕日の光がちょっと覗く感じになっきてイイゾ〜となったところでノシャップで下車

ノシャップ岬に行くと本当に誰もいなくて一人で日没を見ることに

f:id:potaxyz:20210323014729j:plain
ノシャップ岬の日没

地平線に太陽が沈んでいく姿は本当に綺麗でした、こんなくっきり形というかその沈みゆく姿とかそういうのがわかるもんなんだと思って思わずスゲーって声が出た

ゆるキャン最高〜

ノシャップを去り潮見5丁目バス停の正面の回転寿司屋までバスで向かう

どれもおいし〜 -4k

ついでに日本最北端のマクドナルドに寄ってマックフルーリー食べてゆっくりしてた

ここでわっかない応援クーポン(買う)が残ってしまっているが、もうそういったものが使えるお土産屋は閉まっているし、明日は始発だから使える店がないし…となったが唯一使える施設があった

それが稚内駅にくっついてる施設内にあるTジョイ稚内である(!)

ノシャップ岬に行く前に、このクーポン券で映画見れるんすか?って聞いたら見れますよって答えが返ってきたので(どう考えても想定されてた使い方じゃないと思うのですが)使わないよりは〜と思ってみていなかった鬼滅の刃を見ることにした

皆さんは見て、心を、燃やしていましたか?私は、燃やしていませんでした

このこと決めたのマクドナルドからの帰りのバスで稚内駅降りる直前くらいでしたが *3

稚内駅に着くと同時くらいに上映の開始時間だったのでバスから降りてそのまま鬼滅のチケットくださいって言って見た

見終わってホテルに戻ってもいいけどホテルを通り過ぎて防波堤を見るだけ見た

ホテルに戻った頃には23:30でした…

明日はいよいよ南下を開始 5:20の始発の普通列車に乗って乗り継いで長万部まで行く予定です

普通に今日の満足度めっちゃ高くて全く同じこともう一回したいな〜と思った

*1:1000円回数券とかいうの、窓口付近には書いてなかった気がしたけどネットにはなんか運賃改定かなんかの黄色いチラシに書いてあった

*2:事前情報では市内1区間220円x4+110円x2、市内2区間250円x4+100円x2の2種類だったが100円x11?もあるっぽい、1区間のものを購入して2区間のところで使いたい時は差額の30円を払えば使用可能

*3:近くにあってここから乗ったら戻れると思ってたバス停が昼間の一部の便しか止まらないやつ(隣の道に同じ名前だが使えるバス停があった?)だったせいで1本遅れることになって余裕のある時間にならなかった

18きっぷで日本縦断(1日目:準備編)

2月下旬くらいに友人に春休み何するの?って聞かれて急に日本縦断するかって思い立ったのですることにしました

大雑把に言えば新千歳に飛行機で行って、稚内を起点に西大山/枕崎駅を目指します

普通に切符買ってもよかったですが18きっぷ(とオプション券)だけでやってみることにしてみました

旅行前

新千歳空港に行くのに関空から行ってもよかったのですが、あまり良い感じの値段でLCCが取れなさそうだったので実家を経由してセントレアから行くことにしました(セントレアの方が安かったので)

ということで京都駅から名古屋の方を目指すことにしましたが...

琵琶湖線が電気トラブルで運転見合わせと遅れ

米原から大垣間でシカとぶつかり運転見合わせと遅れ

終電がなくなり帰省失敗(八事より先の赤池まで行きたかった)

親になんとか迎えにきてもらって帰ることができました(こんな夜中に感謝)

次の日の夜:

朝早いから寝るか〜という時にメールを確認したら

欠航のお知らせが届きました...

その日の夜の便に振り替えましたが、なんか幸先悪いですね...

1日目

セントレアまで地下鉄と名鉄できました

2020年の12月にjetstarが撤退して代わりにpeachが入った名古屋-札幌便です

LCCなのにチェックインカウンターが第一ターミナルにあって駅から徒歩3分程度でついて便利ですね、関空もこんくらい近くしてほしい

保安検査が関空だったらpeachの人がやってる(そうだった気がする、うろ覚えですが)けどそうじゃないみたいで重さはかるとかなんもしてなくてガバだと思いました

17:25頃離陸

夕日がよかった

19:10分到着予定でしたが新千歳空港着いてもなんか降りる予定のとこに飛行機がとまってるとかなんかでなかなか降りれなくて結局行動できたのは19:30過ぎてからだった気がする

15時頃に昼食とってたけど新千歳空港ラーメン道場を制覇したいと思っていたので夕食をここでとる

今回はあじさいに行ってみた(この時点で時刻は19:46)

電車の時間やばかったけどすぐラーメン出てきて助かりました

ラーメン道場の3階フロアから駅の地下1階のフロアに降りるのにエスカレーターで普通に降りようとしたけど、なんとなくエレベータを使ったらこれが正解だった(ラーメン道場のとこからエレベーター使うと新千歳空港駅の改札に直で到着できる!ことを発見)

20:06に出る快速エアポートで札幌に行って、そこで特急カムイに乗り換えて旭川に向かいます

クレジットカード作ったのでえきねっとが使えるようになって45%引きの切符が買えるようになった(日付はわかるけど何時に乗るかわかんないときに、その日の一番遅いのとっておけばあとで乗車変更して好きな時間の切符にできることに気づいた)

いままで実は見てなかったので飛行機と特急の中で見てた

旅行の途中で映画見に行こうかな

なんだかんだしていると旭川駅に到着

旭川駅の中も外もデザインが好きなんですよねー(あとで画像を追加したい)

チャリが埋まっていた

気温は2度とかだったので本州の冬とあんま変わらんね

ということで明日は始発の普通列車稚内まで向かいます

帰省法(京都-名古屋 間)

コメント

  • 個人的には在来線(東海道線)をよく使う。いつ帰るか日付は決めていても時間を決めていないことが多いため。実家には21:31の新快速で京都を出れば終電で帰れる。たまに鹿と衝撃して遅延する。(ぶつかることを鉄道用語では衝撃というらしい)
  • 時間を決めているなら平日は名神ハイウェイバスが一番安い。しばしば遅れる。
  • 休日はバスが高いのでそれより安く行きたいなーとちょっと値段を意識する時は在来線(東海道線-草津線-関西線)を使いたくなることがある。山の中を通る感じが良い。
  • 近鉄株主優待券は都合よく手元にないことが多いので大体近鉄には乗らないことにしてしまうが高速バスの次に安い。時間さえ気にしなければ。気分次第で特急課金ができ、そうしても新幹線よりは安くできる。(普通に乗った時の運賃は東海道線と同じ、学割も使えた気がする)
  • 新幹線は速いが高い。
  • 近鉄ひのとりの利用はすごく快適で良い。ほとんどが甲特急のため一度大阪まで出る必要があるが(とはいえそこまで移動するのも楽しいかもしれない)、一部の便は乙特急として配当されているためそれが使えるなら大和八木からひのとりの利用ができる。
  • ほかの選択肢は飽きたらそれ使うノリ

2回生後期の振り返り

これに基づいています

僕なんかが講評とかいうのは烏滸がましいですが

1月の最終週にレポートの締め切りがたくさん迫っている+引っ越しで本当に大変なことになっていました 色々あって普通の学科の人よりコマ数が多いのも災いした

来年はコマ数が減る予定なので嬉しい

月2 プログラミング言語

講義方法

動画

評価方法

テスト&クイズ(25)/中間レポート的なプログラム書いたりするやつx2(20x2)/期末レポート(35) or 一発逆転スペシャル期末レポート(100)

コメント

  • ちょっと興味があったので取ってみた
  • 同じ学科の科目だがコース(専攻みたいなもの)が違うので単位にならない
  • Java/Ocaml/Cを使って言語間の考え方の違いとかプログラムの抽象化の方法とかをやる
  • 後半の多相性高階関数ビジターパターンあたりの概念を知れたのはよかった

月34火34 数理工学実験

講義方法

zoom

評価方法

レポートx7 2週間に1こくらい書く

コメント

  • 今期の要 これさえ取れれば必修は取り切れるので
  • 配布されたテキストに従って問題をやる
  • 配布テキストには載ってたけど扱わなかったやつの方が面白そうだったりした(モンテカルロシミュレーションとか)
  • zoomにはほぼ出なかった(出る意味ある?)
  • めちゃくちゃ重かった 苦しみながら学ぶ数理工学になってた
  • 毎回レポート40ページくらいかいてた気がする
  • プログラムも乗ってるから実質的な記述量は30ページとかかもしれんが問題の答えだけじゃなくてそのアルゴリズムとか数値計算方法の仕組みとかも書かないといけないのでtex打ちに時間を取られる
  • C指定かと思ってはじめCで書いてたらC++とかpythonもいいらしいということで途中からC++時々pythonで書いてた
  • gnuplotに習熟した(?)
  • gnuplot-lua-tikz使うときれいに図が載る 全部tikz形式でpdfに載るため 基本gnuplotはset terminal tikzで出してた、ただし点が多くて複雑だと重くなるのでそのときはset terminal epslatexにしてた
  • 競プロ強い人のライブラリ乗っけてるgithubとかにめっちゃお世話になった(ダイクストラとかFFTとか)

ei1333.github.io勝手にお世話になりました

火1 量子物理学2

講義方法

動画

評価方法

レポートx4

コメント

  • 前期の続き
  • 今期唯一の上回履修
  • キーワード:生成消滅作用素/一次元調和振動子/コヒーレント状態/回転群/角運動量/中心力問題/水素原子/摂動展開/スペクトル作用素/中間表示/T積/CHSH/Popescu-Rohrlich box/混合状態
  • 復習します
  • 群論とか関数解析とかやろう

火2 システム解析入門

講義方法

zoom

評価方法

期末レポート + テスト&クイズで加点?

コメント

  • 教授が非常に丁寧で好感が持てる
  • 途中から出なくなってしまった
  • 動画配信もしてくださったのでたまにみたりみなかったりしていました
  • ...

  • 内容は濃い
  • 制御系の入門的な話をやっていて思ってたより色々やるんだなーって思って面白そうではあった
  • 結局のところラプラス変換やったことくらいしか覚えていない...
  • 期末レポートが軽くてよかった

水2 解析力学

講義方法

zoom

評価方法

オンライン期末試験 + 期末レポート

コメント

  • ノートの量がとにかく多い(A4で50ページ以上なってた気がする)
  • 自習課題がいっぱい出る
  • 前自分で勉強したことがあったがもう一回こうやって向き合って理解が深まった
  • 関係ないけど解析力学の参考書は個人的にはこれが好きです

www.amazon.co.jp

  • シンプレクティック表現便利ですね 読んだことある参考書にちょろっと書いてあったけど実際に課題とかでヤコビ恒等式示すときとかに使ってみると楽でいいねとなった
  • オンライン試験の形式があまり好きではなかった(前期の非線形動力学も同じでした)

そのほか(問題に関しての知見)

  • 最急降下線の問題の途中でベルトラミの公式を使うと楽になる気がする
  • 基準振動だけ求めるなら解を例えばAcos(ωt+a)とか仮定するとかでよさそうだけどω=0のときにpt+qみたいになる解が求まらない、一般解を求めたいなら普通の微分方程式の解き方(固有ベクトルとか求めたりする方法)でやる
  • 慣性モーメント絡めてくるものは面倒。車輪って課題の問題文にあったから円環の慣性モーメントで計算したら解答例が円盤の慣性モーメントになっててバツついて返却された
  • 有効ポテンシャルは中心力問題を動径方向の1次元問題に還元できてうんぬん
  • 安定性で線形安定性みたいな感じのことやったりするけどそれって結局2階微分の符号見ればいい
  • 課題のに相平面上の点の動きを図示する問題があってその流れの向きみたいなものに一切言及されてなかったけど正準方程式からqとpのtでの一階微分が求められてそれから判断する
  • 正準変換のパターンは一番初めにみるやつ覚えておけばそれを微分形式で書いたやつに適当に後ろにd(PQ)とか足したりして入れ替えたいやつがうまく出るように調整すれば記憶容量の節約になる
  • 調和振動のラグランジアンにexp(2γt)かけたら減衰振動になるとか、この操作?に名前ってついてたりするのか?と思った

水3 数値解析

講義方法

zoom(動画あり)

評価方法

毎回の小レポート

コメント

  • あんま出てない
  • 実験とやってること被ってたのとあまり興味が持てなかったため...
  • 課題は全部出した

水4 微分積分学続論Ⅱ - 微分方程式

講義方法

zoom

評価方法

毎回の小レポート(50)+期末レポート(50)

コメント

  • クラス指定取ると口頭試問に引っかかる可能性があってそれが嫌だったので裏番組の同じ授業を取った
  • 普通に常微分方程式する講義
  • 講義には一度も出なかった
  • 全部で演習めっちゃ積むことになってよかった

    そのほか(問題からの知見など)

  • 期末レポートに、臨界点が2つで1つの臨界点に対するヤコビ行列の固有値が正と負になる and 1つの臨界点に対するヤコビ行列の固有値虚数になるような2次元ベクトルf(x,t)を構成する問題が出たのがなかなか面白いなと思った
  • まず臨界点になる座標を決める、適当に(0,1),(1,0)にした なお解答例は(1,1),(-1,-1)になってた
  • 各成分をxとyの2次式としておく(Axx+Bx+Cyy+Dy+Eみたいなかんじ)それに臨界点の座標入れて適当にその係数を決める
  • 決まった係数から判別式考えてちゃんと0より大と0より小になるのを確認したような確認しなかったような気がする
  • 円と双曲線になった
  • 交点がそれだけだってなんか図で見れば明らかっちゃそうかもしれないけど不安があったので代数的に示すのに円の束とかいうの使って必要条件が1つしかないっすねーとかいって示した
  • 題意がみたされます

木1 数理統計

講義方法

zoom(動画あり)

評価方法

トピックごとのレポートと補充課題

コメント

  • 履修登録期間中に難易度が高そうだということで他の数理統計に逃げていく人がたくさん観測された
  • 実際難易度高くて統計そのものより数理の方が入ってきた(?)
  • 射影行列めっちゃ使うし記号が独特だったりしたしレジュメも読みづらい
  • 身についたとは言い難い
  • 進度が速く1月頭には全課題終了してた

木2 工業数学A1

講義方法

zoom(動画あり)

評価方法

毎月のレポート(50)+期末レポート(50)

コメント

  • 名前からはわからないが複素関数
  • 講義には一度も出なかった(すみません)
  • レジュメが素晴らしい
  • 期末レポート(1問10点x13問)、解いた問題のうちで点数が高かった5問の点数が評価点になるけどせっかくだしやるかーという軽い気持ちで全部解いた
  • けっこう時間食われた
  • 数理解析研究所とかいく人が解く院試の問題が持ってこられていた

    そのほか(問題からの知見など)

  • 複素数の問題解く時にクラメールの公式がけっこう役立ったりする(以下外心を求める例)

math.stackexchange.com

  • リーマン球面に内接する任意の正四面体の頂点を複素平面に立体射影したときの4点の位置関係がどうなるか?という問題
    • 円円対応と等角性を使う。正四面体を構成する4点を、3つの点によって決まる円の交点(合計円は4つ)としてみる。リーマン球面上にそれらの円を描いておいた状態を考える。リーマン球面上の正四面体の頂点を通ってその接平面に垂直な軸を考えれば、その軸でリーマン球面をπ/3回転させると各円が一致するのでそこの角度を保ったまま、円のままCに写る。
    • 概要はこれだが細かいところを考えるとリーマン球面とCの対応の写像を求めるのと、C上での円or直線の表示を求めておくのと、接ベクトルの計算(しんどい)をするのとかをしないといけなくて、解答が6ページとかになった
    • はじめ3次元空間上でその正四面体1点を固定した場合の残りの3点の座標を求めてCに移してC上での座標を求めてみたけどえげつないことになった(geogebraとかぶちこんでみたらちゃんと円で写っていることは確認できたので表示は正しそうだったがこれから特徴は掴めないため没)
  • \cot \pi zとかがバーゼル問題に応用できる
  • 偏角の原理というものの存在を知った
  •  \textrm{tr}(A^{-1}(t)A'(t))=\frac{1}{\textrm{det} A}(\textrm{det}A(t))'が成り立つらしい(ちゃんと証明できる)

木4 グラフ理論

講義方法

zoom(動画あり、ただし講義時間中に出席確認あり)

評価方法

レポート(20)+オンライン期末試験(80)

コメント

  • 前期の他学部聴講でとれなかったものを別コースのもので取ることにした
  • 期末試験がIQクイズみたいなもので、これで成績つくのか...となっていた
  • あんまり興味はなかったかな...

木5 Fundamentals of Artificial Intelligence-E2

講義方法

zoom

評価方法

出席+小課題+期末レポート(割合忘れたけど期末レポート出さなくても単位出るくらいだった気がする)

コメント

  • 名前の通り教師あり機械学習ディープラーニングの基礎をやる
  • 毎週の課題めっちゃ簡単なのに期末レポートは2000words以上とかでやばい
  • word数は諦めた
  • こういう類のに自分からは手が回っていなかったので触れれたのはよかった
  • deep learningパートで何故か使ってるのがchainerだった
  • pytorchではなく?となったが資料chainerで作ってたら開発終了しちゃったのかなという感じ

学生証で入退室管理するシステムを作った

最近縁があってある研究室に出入りしているのですが、コロナのことも考えて入退室の記録をとることになりました。はじめは紙に入退室時間を書くとかいうアナログな方法で記録を取っていたのですが面倒...。そこで課題がひと段落ついたところで*1気分転換(?)がてらちょっと工作しようということで入退室管理システムをサクッと作りました。先駆者がいたので意外とすぐに作れた。プログラム自体は半日くらい?

(何箇所か追記しています)

追記:GitHub

github.com

学生証タッチ

(うしろはモザイクでかくした)raspberry piにしたのリンクに貼るようなカード読む端末をさしています。

機能とか

学生証読み取り部分

「nfcpy 学生証」とかで調べると先駆者の記事が見つかるので、それを参考に学生証の欲しい情報(ここでは学籍番号と名前、あとは興味でチャージの残高*2)を取ります。学籍番号しか取れないと思ってたけど名前も格納されてるんですね。

あとは気になったのでSuicaの残高を取るやつも作った。

import nfc
import struct

# 京都大学学生証 学籍番号と名前(半角カナ)を返す
def read_kucard(tag):
    servc = 0x1A8B
    service_code = [nfc.tag.tt3.ServiceCode(servc >> 6, servc & 0x3F)]

    tag.dump() # これがないと何故かうまくいかなかった

    bc_id = [nfc.tag.tt3.BlockCode(0)]
    bd_id = tag.read_without_encryption(service_code, bc_id)
    student_id = int(bd_id[2:-4].decode("utf-8"))

    bc_name = [nfc.tag.tt3.BlockCode(1)]
    student_name = (
        tag.read_without_encryption(service_code, bc_name)
        .decode("shift-jis")
        .rstrip("\x00")
    )

    return student_id, student_name

# 交通系ICカード(モバイルでない)から残高を返す
def read_suica(tag):
    servc = 0x090F
    service_code = [nfc.tag.tt3.ServiceCode(servc >> 6, servc & 0x3F)]
    block_code = [nfc.tag.tt3.BlockCode(0, service=0)]
    row_le = struct.unpack(
        "<2B2H4BH4B", tag.read_without_encryption(service_code, block_code)
    )
    balance = row_le[8]

    return balance

nfcpyで学生証から情報を読む+おまけ · GitHub *3

学生証がかざされるとデータベースの履歴テーブルに日時と学籍番号と名前と入室or退室の情報が書き込まれる。入室or退室は履歴テーブルとは別に作った在室テーブルにその学籍番号が存在しているかどうかで判断して記録することにした。

管理ページ

コマンドラインからsqlite叩くのもアレだし、webアプリで操作できる感じにしようということでfastapiを使って作ってみた。raspberry piが繋がってるのと同一のネットワーク内ならraspberry piipアドレスからアクセスできるようにした。いままでflaskとresponderをさわったことはあったけど初めて(fastapiを選んだ理由は特になく別のものを触ってみようと思ったから)。似た感じで作れたかな。あんまりapiの良さ(?)を生かした感じにはできなかったけど。

入退室の履歴は見たいのでそれは表示するとして、いざ何かあったというときに履歴を何らかのファイルとして見たいはずなので、データベースに登録されているデータはcsv形式でダウンロードできるようにした。

あとは間違って二重タッチしちゃったとか退室のときにタッチし忘れたとかのために、入退室の情報が手動でデータベースに追加/削除できるようにはした。このへんはもう少ししっかり作ってもいいかもしれない。

履歴の表示
データの修正ページ 削除かレコードの追加はできる
あとから履歴の追加

*4

タッチ音の設定(追記)

webアプリの方からタッチ音をいじれるようにした。

タッチ音の管理画面

Slackに投稿

Slackに入退室情報を流すのに適当にslack appを入れて適当に走らせた。Suicaの残高読み取りの機能せっかく作ったのに使わないのもアレだと思って学生証じゃなくてSuica載せて遊ぶやつがいたら残高をSlackに流す仕様にした。

slackへの通知

得た知見

  • 今までraspberry piに接続してvimで色々いじったりとかscpでデータ送ってたりしたけど、vscodeから普通のパソコンのように操作できることを知った。Visual Studio Code Remote Development Extension Packとかいうやつ。

marketplace.visualstudio.com

  • はじめてコードフォーマッタを使った。blackを使ってみた。いいですね、これから使っていこうと思った。
  • raspberry pi内の自動起動の設定。今までcron使ってたけどはじめてsystemdを使った。設定めっちゃ簡単やな。
  • ipアドレス固定のあたりでルーターのipが10.0.〜ならstatic ip addressのとこも10.0.〜みたいにしないと1回つながるかもしれんけど切れる。10.0.〜と192.168.〜とかはダメ。

*1:実際には実験を放置してこっちのプログラムを書いていた

*2:たしかtagPurse Serviceのとこの頭2バイト分のとこにカード残高が格納されていたはず

*3:github gistそのまま貼ろうとしたらhtmlタグ展開されて貼れんかった なんで

*4:ブログに載せるためにxxxxxxxx研究室とかにしてhtmlいじった

dc

dcのアップデート

Macのdcで

1 2 3 3R

とすると

dc: 'R' (0122) unimplemented

と返されてしまった。あれ?と思ったのでバージョンを確認すると

$ dc -V
dc (GNU bc 1.06) 1.3

Copyright 1994, 1997, 1998, 2000 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
to the extent permitted by law.

古かった。ブログ書いてる今現在のatcoderではdc1.4.1が使われている。man dcで見るとRが存在していなかったのでRが1.4からの実装だと初めて知る。そこでバージョンを1.4に上げることにした。そのためにはdcが含まれているbcをインストールすることになる。

$ brew install bc

としてしばらく待つとインストールされるのだが

==> Caveats
bc is keg-only, which means it was not symlinked into /usr/local,
because macOS already provides this software and installing another version in
parallel can cause all kinds of trouble.

If you need to have bc first in your PATH run:
  echo 'export PATH="/usr/local/opt/bc/bin:$PATH"' >> ~/.zshrc

==> Summary
🍺  /usr/local/Cellar/bc/1.07.1: 13 files, 340KB

このままだと新たにインストールされたものが普通には起動してくれない

$ which bc
/usr/bin/bc

ので、シンボリックリンクの向き先を変える。

$ brew ls bc
/usr/local/Cellar/bc/1.07.1/bin/bc
/usr/local/Cellar/bc/1.07.1/bin/dc
/usr/local/Cellar/bc/1.07.1/share/info/ (2 files)
/usr/local/Cellar/bc/1.07.1/share/man/ (2 files)

brewシンボリックリンクは/usr/local/binにできるらしいので

$ cd /usr/local/bin
$ ln -s ../Cellar/bc/1.07.1/bin/bc bc
$ ln -s ../Cellar/bc/1.07.1/bin/dc dc

これでシェルを再起動すると

$ dc -V
dc (GNU bc 1.07.1) 1.4.1

Copyright 1994, 1997, 1998, 2000, 2001, 2003-2006, 2008, 2010, 2012-2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
to the extent permitted by law.

めでたく最新バージョンのdcが使えるようになる。

使い方とか

数理統計の課題でエクセルとか使うのが面倒だったのでdcでパパっと計算させて結果だけ見たいと思った。

7.97 7.66 7.59 8.44 8.05 8.08 8.35 7.77 7.98 8.15

適当な数10コ用意しました。とりあえず期待値と分散が知りたいので適当にコードを書く。

$ dc
> 7.97 7.66 7.59 8.44 8.05 8.08 8.35 7.77 7.98 8.15
> f
8.15
7.98
7.77
8.35
8.08
8.05
8.44
7.59
7.66
7.97
> zsw0se[d0z-Rle+selw1-dsw0<x]sxlxxzle3kr/p
8.004
> sezsw[le-0z-Rlw1-dsw0<x]sxlxxf
.146
-.024
-.234
.346
.076
.046
.436
-.414
-.344
-.034
> K2*kzsw[d*0z-Rlw1-dsw0<x]sxlxxf
.021316
.000576
.054756
.119716
.005776
.002116
.190096
.171396
.118336
.001156
> [+z1<x]sxlxxK1+k10/p
.0685240

実際に実行したときは>は入らないが見やすさのために入れてみた。dcは入力された数字を上に積むスタックマシンとかいうやつらしい。改行かスペースで数字を分けた後ろ側のものをより上に積む。コマンドは1文字なのでスペースはあってもいいが不要。

簡単に上のプログラムの説明をしてみる。

fはスタックの中身を全部表示。pはスタックの一番上だけを表示(表示した値を捨てることはしない)。

zsw0se[d0z-Rle+selw1-dsw0<x]sxlxxzle3kr/p

zはスタックの高さを取得しその値を一番上に積む。swは変数wに一番上の数を格納する。0を積む。seで変数eに一番上の0を格納(eは後で期待値の値になるつもり)。[ ]内部はwhileループのような構造になっている。 [ dで一番上の数を複製。0を積む。zでスタックの高さを取得しその数積む。-は一番上の数を2番目に上の数から引く(このとき、演算に使われた2つの数はなくなって1つの数が積まれる)。「nR」で上からn番目の数を一番上に持ってくるというコマンドになるので、今は一番上に「マイナス高さ(今回は10)」の数が積まれているから、逆に一番上の数を上から「高さ」分持ち下げる。leはeを読み込んで上に積む。+で一番上の数と2番目に上の数を足す。seでeに一番上の数を格納する。lwでwを読み込み、1を積む。1を一番上にあるwから引いて一番上に積む。dで一番上の数を複製。0を積む。(一番上 0)<(2番目 さっき複製された数)をしてtrueならxを実行する。 ] をsxでxに格納。lxでxを一番上に積む。xは一番上を実行するというコマンドになるので、これで<の部分でfalse判定になるまでこの処理を続ける。 ここまで終わった段階ではちょうど一番最初のスタックの状態になっている。このとき、eには求めたい期待値ではなく、総和が入っているので要素数(=スタックの高さ)で割りたい。のでzで今の要素数を一番上に積み、leでeを呼び出す。ここで間に入る「3k」は一番上に3を積んで、kでその数字の精度を定める(小数点以下3桁まで見るという感じ)。rで一番上と2番目を入れ替える。/で(2番目)/(1番上)をして一番上に積む。ここでpをすると、めでたく期待値が表示される。

次に...とやろうと思ったがもう朝だし説明疲れたのでここまでにする。

ここまで出てこなかったが途中にあるKは現在の精度を一番上に積むというコマンドである。興味があれば「dc - 任意精度の計算機」とかで検索すると使い方は出てくる。

ちなみに、総和を表示させるためだけなら数字をコピペした後

[+z1<x]sxlxxp

期待値を表示するだけなら

[+z1<x]sxlxx3k10/p

とすれば出る。数字を再利用したかったので上で説明したものは少しコードが長くなっている。

...いや、これは綺麗に書きすぎですね、総和は

7.97 7.66 7.59 8.44 8.05 8.08 8.35 7.77 7.98 8.15++++++++++++++++++++++p

で出せる。+は9個必要だが、10個以上になってもstack emptyと怒られるが結果は表示してくれる。期待値にしたければこの後に3k10/pなどとすればよい。

何も考えずコピペして+を押し続けて適当なタイミングでpを押すだけ、ということができるのはdcのいいところの1つだ。アプリとかの電卓だとコピペで全部足すができないだとか、他の言語でやるにもpythonとかだとリストに入れてsumを取る等の手段が考えられるが、リストに入れる時にスペースを,に変えないといけないとか、ちょっと面倒だ。

dcのいいところは非常に短いコードで計算ができるということだ。コードゴルフとかでしばしば見る。使ってると呪文のようでなんとなく楽しい。

調和振動子のコヒーレント状態に関する話題

1次元調和振動子のコヒーレント状態に関する課題が出ていたのだが、問題文を読み間違えていて(本当は位置とか運動量の期待値の時間発展とかだったが)それの位置表示を求めてしまったのでせっかくだし備忘録的に載せておく。平行移動演算子でやってるのをよく見たけど、エルミート多項式からのものは少なかった気がする。複素積分をしっかり勉強していないので少ししんどい。

f:id:potaxyz:20201015052953p:plainf:id:potaxyz:20201015051530p:plainf:id:potaxyz:20201015052602p:plain