ノートの切れ端

その日やったことを書くだけ。

2022年度の振り返り

この度2023年度 総合研究大学院大学 統計科学コース 博士後期課程 4月入学へ無事合格したので, 2022年の振り返りを兼ねて,退職D進に至った経緯みたいなものをまとめようと思います.

項目 詳細
記事の目的 退職D進の体験記というか,皆何を考えてその結果に行き着いたのかの情報が少ないと思ったので,サンプルを提供するくらいのモチベです
想定対象読者 (1) D進したいが就職しないことへの漠然とした不安感を持っている,(2) いつかD進したいが戻ってくる判断基準に困っている,(3) 何らかの形でD進の選択肢を持っている,のいずれかに該当する人

私のバックグラウンド

私自身の情報がないと比較しにくいと思いますので, 簡単ですがD進に関連しそうなものを上げておきます.

時期 イベント
2018/03 CSと数学を半々で勉強して情報科学部卒業
2020/03 統計学寄りの研究で修了
2020/04 - 2021/02 新卒でシステムエンジニア
2021/03 - 2022/06 転職してベンチャーでAIエンジニア
2022/08 - 現在 退職して,RA活動

なぜ修士修了後に就職したのか

  • 漠然と取り組みたい研究領域はあったものの,具体的に詰められていなかった
  • エンジニアとしての仕事に興味があった

という状態でした.テーマが不安定な状態でD進してグダグダになるよりは,ひとまず後顧の憂いを断った方が良いという判断で就職しました.

D進を決意したきっかけ

私は元々いつかD進する予定だったので, どのタイミングで行動を起こすか が問題でした. 2022年冒頭に,2023年度入学に向けた行動を開始した理由は主に下記の通りです.

  • 貯金が多少貯まってきた
  • 専門にしたい領域が掴めてきた・言語化できてきた
  • 最短で博士課程を修了しても30歳という年齢になった(文字へ書き起こすとリアルさが違いますね..)
  • コロナが落ち着いて,国際会議も現地開催し始めた(←コミュニケーション弱者的に超重要)

D進を決意したきっかけ:貯金面

貯金額については 2023年夏まで生きていける生活費・入学金・初年度の授業料 を目安にしました. 安心できる金額まで貯めようとすると時間ばかりかかるので,目先の生活に困らなければ良いと割り切りました.

なお,進学後の生活費は何らかの奨学金,2年目以降の学費は指導教員にRA雇用をお願いしたり, 民間の奨学金を申請したり,エンジニア系のアルバイトで確保する想定です.

D進を決意したきっかけ:お仕事面

2023年度入学想定にもかかわらず2022年6月に正規雇用を退職した理由は, 研究領域掘り下げのための時間が足りない と判断したからです. これは完全に私の能力不足ですが,2年ちょっとの社会人経験をもとに,働きながら入学準備をするのは私にはできないという結論になりました.

メインの理由は上記の通りですが,入学までの間にお勉強しておきたいという理由もありました. 社会人生活を2年とちょっと挟んだことで学術的な思考がおざなりになっていましたし, 博士課程へ進む以上語学能力は必須なため,そのあたりを補完する時間が必要だと考えました.

行動とお気持ち振り返り

前述までは退職前時点での判断基準で,以降は退職後にどういう心境だったか等, 将来的に振り返った際の日記となるような感覚でまとめています. 入試と関係ない内容も含まれますが,上記の方針をご留意の上参考にしてください.

行動とお気持ち:退職前( - 2022/06)

冬入試を受験する予定のため,入試準備について当時はあまり不安を覚えていませんでした. それよりも金銭面の計算を何度もして,来年生きていけそうか考えてました. 特に住民税と健康保険が厳しかったですね,エグいです.私の場合は任意継続だとほんの少し高かったので,国民健康保険に入りました.

また仕事は引き継ぎ作業で結構忙しかったです.社内で私しか扱ってない領域を他の人へ渡す必要があったため,教材的な資料も含めて作成してました. あと,次にビジネスへ関わる時は自分で責任取れる事業規模に収めようと思いました(心理的な負担を加味して).

それと指導をお願いするかもしれない先生とコンタクトを取り始めました. 私の領域は人格者しかいない印象で,このやり取りにストレスを感じることはなかったです.

行動とお気持ち:研究領域の確定期間(2022/07 - 2022/09)

主に (1) 基礎学習,(2) 研究領域の選択,(3) RA活動,(4) エンジニア的趣味,に時間を使っていました. (1)は英語と解析学・確率論を振り返り,(2)はメインで興味持ってる領域とその他候補の領域の論文を読みまくりました. 私の出身大学は卒業生も図書館を利用できるので,たまに入り浸ったりという感じで最終的な研究領域を確定しました.

(3)はまたまた採用いただいたポジションで,他分野の事を知れる良い機会だと思って参画しました. 別分野の論文を読む機会は全くなかったので,今振り返っても良い選択の1つだと思っています.

(4)は今振り返るとやらなくてよかった活動ですね.モチベとしては,博士課程でのエンジニア系アルバイトを 視野に入れて,ちょうど作りたいものもあるし作っておくかぁ,というものでした.けれど完成したのは骨組みだけで 機能的な肉付けをするには時間が足りず,たぶん今後も優先度下がりまくってパブリックにできるレベルには達しないです.

全体を通して勉強がメインだったので,心理的にはかなり安定してました.金銭面も6月までで考えきったので, 意図的に頭の中から捨ててました.思考のノイズになるものを頭から切り捨てる的な技術は,修士課程くらいからできるようになった気がします.

行動とお気持ち:研究テーマの確定期間(2022/09 - 2022/10)

この時期から私のライフワークが2つ増えました.1つは運動,もう1つは英語学習です. この2つは今後もメンタルの安定化にかなり寄与すると思っています.というのも, 進捗がないと人はメンタルが不安定になりがちですが,この2つは比較的進捗管理がしやすいものだと思います.

体作りは入出力が食事管理と運動で大体制御できて,内部状態はジムに置いてあるちょっと良い体重計で把握できます. つまり, 計画さえ立てれば後は何も考えず実行するだけで進捗が出る のが体作りだと思います.

また英語学習はある程度頭を使いながらトレーニングする必要がありますが,私のような初級段階の課題は大抵慣れで突破できそうな実感があります.

したがって,(1) 体作りで何も考えずとも進捗が生まれて,(2) 語学学習でちょっと頑張れば進捗が生まれる, という体制を整えておくことで,(3) 頑張ってもなかなか進捗が生まれないかもしれない研究活動,に対するメンタル安定化を図ろうという自身の運用が確立しました.

この時期の研究活動は,もう少し詳細な研究テーマを確立して,そのための予備実験を始めていました.

行動とお気持ち:入試試験 準備期間(2022/11 - 2023/01)

この時期にしていたのは

  • 指導をお願いする先生の確定と挨拶
  • 入試・奨学金のための書類作成

でした.1つ目の方は6月くらいからたまに連絡を取っていましたが最終判断はこの時期となりました. これは最終的な研究テーマとそれに対するアプローチが見えてきたのが10月だったことに起因します. 後1ヶ月早く話を進めることができていればだいぶ余裕があっただろうなと思いますが, 別に怠けて遅れたわけではなかったのでしょうがないと割り切ってました.

指導教員の方に挨拶をして,2023年4月入学に向けて準備に取り掛かりました. 私の受験した大学はそれなりに落ちる事もあるとのことだったので, 落ちても2023年10月入学へ向けて準備する旨を共有していました.

本格的に書類作成を始めたのが11月中旬で,締切が12月中旬だったので,良くないスケジュール管理だなぁと思いながらなんとか作成し, 大学現地へ持っていって出願書類の提出をしました(郵送は期日が不安だった).こんな事にならないよう,皆さんは余裕を持って準備してください.

書類を提出次第,面接用のプレゼン資料作成を進めました.面接時期が1月中旬で 期日まで1ヶ月未満と厳しかったです.論文投稿は1ヶ月前に9割できているように, と指導を受けていた経験が活きてなくて申し訳ない,って感情でした.博士課程中はちゃんとスケジュール管理します.

上記に並行して,過去に自分が行っていた研究内容の振り返りを面接対策として進めました. 作業自体は楽しかったですが,時間的な制約がしんどかったです.というのも学部生の頃の内容は 現在の能力から見ても背伸びした分野を前提としていて,「分野全体の構成の流れを論理的に説明してください」みたいな 質問が面接で来たらやばい状態でした.そのため振り返る作業自体に苦はなかったのですが, 時間に追われている状態がしんどかったです.

メンタルは問題なく平常運転でしたが,体調的な変化があり,1回の睡眠で3時間以上寝れなくなりました. まあ一般的な社会人ではないので,それで活動に支障が出ることはなかったです.日中睡魔に襲われるわけでもなかったので, 夕寝する言い訳ができ,頭もスッキリするので悪くはなかったです.

行動とお気持ち:実際の面接(2023/01)

面接準備では

  • 過去研究の説明ができる
  • 博士課程で志望する研究の説明ができる
  • 研究者としての将来的なプランの話ができる
  • 統計科学の基礎知識の説明ができる

ことを目指して進めましたが,最後の4つ目に割く時間を捻出できませんでした. これまでの自分の基礎教養にかけて挑むことになりましたが,合格をいただけたので基準値はクリアできていたのでしょう.

直近3ヶ月だけ見れば,自分的にこれ以上詰められないくらい準備はしたので,「駄目だったら10月入学に備えればいいか」 くらいの考えでした.ただ,面接の先生が7人くらいいてビビりました.

D進を考えている人向けの独り言 & 結び

以上,自身のD進準備を振り返って「ある程度備えた上でギャンブル性の高い行動をしていた」と考えています. 特に他大学と比較して博士入試の不合格率高めという前提なのに,早々に退職して背水の陣を敷くのは 一般的な判断ではないなと振り返っています.この判断ができたのは,社会人をやってみた結果, 「エンジニアとして食うに困る状況にはならなそう」という実感を得たことが大きいです. 一度社会人を経て博士課程へ進む人の強みの1つはこのあたりかなとも思います.メンタル強くなります. この事を踏まえていくつか助言を残すとしたら,

  • 背水の陣を敷かなくて済むよう計画的に準備しよう
  • "修士→社会人→D進" はメンタルつよつよで進学できるというメリットが(たぶん)ある
  • 面接は「全く関わりない先生に自分の研究の話を聞いてもらえる場」と考えると面白イベントになる
  • 退職しても毎日忙しくしていれば,「お金を稼いでいないことへの後ろめたさ」とか「周囲は人生のステージ進めているのに自分だけ..」みたいな些事を気にする余裕はない

あたりです.考え抜いた末の判断であれば間違いはないので,自信を持って突き進めばなんとかなると思います.

最後に,受け入れていただいた指導教員をはじめ,相談に乗っていただいた先生方,RA雇用いただいた先生,私の判断を応援してくれた家族・友人に感謝します.今後にご期待下さい.

PGFPlotsX.jlのExample集

Introと注意

Julialangで最終成果物としてグラフを描画したい場合は,PGFPlotsX.jlを用いるのがオススメ!という記事を書いて久しいですが,やっと重い腰があがりExample集を載せることができました.以前の記事でも書きましたが,PGFPlotsXはLaTeXのPGFPlotsライブラリをバックエンドに用いて描画します.Julialang上での記述方法もオリジナルに沿っているため,PGFPlotsを使い慣れた人であればほとんど同じように記述できることに感動することでしょう.

オリジナルと同様に記述できるということはつまり,500ページ以上あるPGFPlotsの公式のマニュアルがそのまま使えることを意味します.したがって以下のExample集は公式マニュアルの劣化版の劣化版もいいところなので,詳細な情報を知りたい場合は,PGFPlotsやPGFPlotsXの公式ドキュメントを確認して下さい.

Examples作成時の動作環境

  • Linux 4.19.13-1-MANJARO
  • Julia Version 1.1.0
  • PGFPlotsX Version 0.3.4
  • LaTeXStrings Version 1.0.3

Example集

Julialangのプロットライブラリの紹介

序文

Rの演算表現だったり行列表現が合わないということでJulialangを好んで使うようになって久しいですが, 最近になってようやく腰を落ちつけてプログラミングできるようになった気がします.というのも主な原因は デフォルトのプロットライブラリがなく,あれこれ試行錯誤していたことかと思います.自分なりにオススメのライブラリと その特徴をまとめます.以降,主観が強いことを留意ください.

PlotlyJSとPGFPlotsXの紹介と使いどころ

個人的には PlotlyJSとPGFPlotsX を用途によって使い分けることをオススメします.

PlotlyJS.jl

インタラクティブで美しい描画を生成してくれるライブラリです.Julialang向けのドキュメントは充実しているとは言えませんが, オプションを指定するためのデータ構造を把握してしまえば,他言語のドキュメントで事足りると思います.以下,特徴をいくつか挙げます. 実験的に手元で描画して考察したい時に有用なプロットライブラリ かと思います.

インタラクティブなプロットが可能

いわゆるグリグリ操作できるプロットを生成してくれます.特に3次元データを可視化する際は非常に有用です.

htmlへグラフの書き出しが可能

グリグリ操作できるプロットを,htmlファイルとして書き出せます.他の人へ描画結果を渡したい場合に便利かもしれません.

描画のためのオプションの設定方法が私好み

完全に主観な意見ですが,上記の通りです.描画時の線の太さや点の大きさ,色の設定などをオプションと呼びますが,これらを 設定するためのデータ構造が私好みです.Example集を挙げる際には一緒にまとめようと思います.

無料版の場合,ファイルへの出力結果に難あり(確認不足)

調査不足かもしれませんが,pdfファイルなどとしてファイルへ出力した際,綺麗な描画が得られませんでした.有料版のほうは 試していないのでよくわかりません.

LaTeX表記に難あり

数式フォントを使って描画したい場合の自由度は低いです.例えば数式フォントにTimesフォントを使いたい場合,LaTeXでは \usepackage{mathptmx}を使うかもしれませんが, そのような変更をPlotlyJSで行う方法を私は把握していません.また,無料版においてLaTeX表記による数式をそのままファイルへ出力することも,私の調べた限りできません.

PGFPlotsX.jl

LaTeXのPGFPlotsを使う,描画の品質の高さが信頼できるライブラリです.もととするPGFPlotsと同じように記述できることが特徴の1つです. グラフをグリグリ操作することはできないので, 最終的な出力物としてグラフを生成する時に有用なプロットライブラリ としてオススメです.

記述方法がPGFPlotsとほとんど同じ

記述方法がほとんど同じであるため,「pgfplots manual」で出てくる,500ページ越えの公式マニュアルがそのまま手引書となります. できないことなんてないんじゃないかと思えます.

LaTeXパッケージの使用も可能

数式フォントにTimesフォントを使用したい時の\usepackage{mathptmx}や,太字にしたい場合の\usepackage{bm}などを利用することができます. 詳細はPGFPlotsX.jlの公式ドキュメントに記述されています.そのうち挙げるExample集にもまとめようと思います.

まとめ

今回は個人的にオススメのJulialangプロットライブラリとして, PlotlyJSPGFPlotsX を挙げました.前者は考察のための実験的な 可視化ツールとして最適で,後者は論文などへ載せる場合の最終的な成果物を描画するツールとして適しているかと思います.それぞれのExample集はメモとしてそのうちまとめます.

付録.その他のライブラリについて

今回挙げたライブラリ以外の有名どころは多数ありますが,個人的に合いませんでした.簡単に,どこが合わなかったかを挙げておきます.

PyPlot.jl
単純にmatplotlibを使ったことがなかったため,記法に慣れませんでした.matplotlibを使い慣れている人は相性が良いかもしれません.
Gadfly.jl
非常に綺麗な描画をしてくれますが,私が使ってた時は3次元プロットができなく断念しました.
PGFPlots.jl
PGFPlotsX.jlと同様,LaTeXのPGFPlotsを使って描画するライブラリです.PGFPlotsX.jlの記法の方が相性が良かったため私はそちらを好みます.

biblatexにおけるFamily nameとprefixの誤認識と一時的な対処法

卒論の時期になりLaTeXをゴリゴリ書く時間が増えましたが, 挙動になれないことが多々あったり...

今回は, 恐らくbiblatexがFamily nameをprefixと誤認識するために生じる問題とその場しのぎの対処法をメモする.

続きを読む

計算機クラスタ構築 第3回

進捗

2台で実行できるようになりました。

実行に必要な環境

  • すべてのノードに実行するプログラムを同じディレクトリ構造で置く
  • パスワードレスの公開鍵認証SSH
  • 計算ノードの明記

プログラムを置く場所

すべてのノードに、同じ場所にプログラムを置く必要があるようです。例えば実行したいプログラムが、操作端末1において、

/home/mpiuser/src/a.out

にあるとします。この場合、他の計算ノードにおいても同じように

/home/mpiuser/src/a.out

にプログラムが存在する必要があります。よって、各ノードに並列プログラム実行用のユーザを追加するほうが良さそうです。一般的にはNFSで同じディレクトリをマウントするようです。しかし今回は計算ノードがArchLinuxだったり、LinuxMintだったり、さらにはハードにラズパイを追加する予定だったりするので、各種環境に合わせてコンパイルする必要があるため、scpで送ってコンパイルしてから実行するという面倒なやり方をします。

公開鍵認証SSH

各ノードにアクセスするときパスワードを要求されると実行できないらしいので、公開鍵を相互交換しておきます。

$ ssh-keygen -t rsa
$ ssh-copy-id -i ~/.ssh/id_rsa.pub mpiuser@LinuxMint_nobuta

上記をすべての計算ノードで、相互にやります。

計算ノードの明記

実際にコマンドを打ったり操作する端末の適当な場所に、計算ノードを明記したファイルを作成します。~/.hostsに以下を記述しました。

ArchLinux_nobuta slots=4
linuxMint_nobuta slots=4

slotsはCPU数を記載するらしいです。恐らく生成可能な最大プロセス数だと思いますが、正確には確認してません。 実行時には、

mpirun -np 8 -hostfile ~/.hosts a.out

等と書きます。ここではプロセスが8個生成されるようです。

気をつけること

インストールされているのが、openMPIなのか、MPICHなのか確認すること。

計算機クラスタ構築 第2回

Intro

前回の続きです。

進捗

互いにsshできるようになりました。

詳細

まずsshを受け付けるため、LinuxMint側は恐らく、openssh-serverが必要です。ArchLinuxのほうは、

sudo systemctl enable sshd.service

を実行するだけで、LinuxMint端末からのsshを受け付けるようになりましたが、問題は逆方向でした。

問題点

LinuxMint端末は

sudo lsof -nPi:22

で確認すると、sshdが待機してるっぽい状態にはなってました。現に、LinuxMint端末から、LinuxMint端末の別アカウントへSSHすると正常にアクセスできました。しかし、ArchLinux端末からLinuxMint端末へアクセスしようとすると、"Connecting to LinuxMint"って感じで止まったままになりました。

原因

ufwというファイアウォールが原因でした。LinuxMint端末で以下のコマンドを実行した結果、アクセス可能になりました。

sudo ufw allow from 192.168.110.2

計算機クラスタ構築 第1回

Intro

最近マルチスレッドプログラミングを始めたので、これを期にMPIも勉強しとこうと思った次第です。以下、LANも組んだことない初心者があれこれ適当なことを書きます。

構成

現在こんな感じです。双方へpingが届くことを確認した段階です。

f:id:nobuta05:20160604191341p:plain

スイッチングハブamazonで買ったこれを利用しています。

設定

PC1(LinuxMint17.3)の設定

/etc/network/interfaces に以下の書き込みをします。

auto eth0
iface eth0 inet static
address           192.168.110.1
netmask           255.255.255.0
network           192.168.110.0
broadcast   192.168.110.255
gateway           192.168.110.1

dhcpほにゃららって文章があったらコメントアウトするのが良さそうです。保存したら、以下のコマンドでリスタート

sudo /etc/init.d/networking restart

PC2(ArchLinux)の設定

dhcpを停止するのが得策らしいです。systemctlに詳しくないので、使い方間違ってるかもです。このページを参考にしました。

sudo systemctl stop dhcpcd.service
sudo systemctl disable dhcpcd.service

ネットワーク設定を/etc/conf.d/networkに書き込みます。networkってファイル名は別のものでも問題ないです。

interface=enp9s0
address=192.168.110.2
netmask=255.255.255.0
broadcast=192.168.110.255
gateway=192.168.110.1

interfaceですが、詳細はここに書いてありますが、簡単に。

ls /sys/class/net

で現在のデバイス名を取得できます。デバイス名の先頭名が"en"がイーサネット、"wl"がWLANということですから、それを参考にしましょう。

次にsystemd用の設定ファイルを書きますが、これは先ほどのページを参考にしてください。

最後に起動時に今までの設定が反映されるようにします。

sudo systemctl enable network.service

以下のコマンドなどで、意図したIPアドレスが反映されていれば終了です。

ip addr list