あはは(雑記)

博士学生の独り言

応募書類を書くとき

人生を生きていたら様々な応募書類を書くときがあると思う。

多くの人は新卒採用時のエントリーシート、博士学生では学振や各種フェローシップの申請書を書く必要がある。

 

私個人的には、エントリーシートに関しては、誰にも見せないようにしている。エントリーシートを多くの人に見せて添削してもらうと、自分独自の表現や自分の色が薄まってしまうように感じているからだ。今まで生きてきて培われた自分の考え方や気持ちなどの自分の色を、他人の意見で薄めてしまうのは非常に勿体ないと思う。自分の考え方や思いを、そのまま書いて落ちてしまったら仕方ない。会社のマインドとのマッチングが上手く行っていなかっただけだと考えるようにしている。

 

申請書に関しては少し話が変わってくる。申請書にはある程度の型がある。その型を学ぶためには指導教員など、申請書を書き慣れている人間に適切に添削してもらったほうがいいだろう。ただ、必要以上に多くの人に申請書をみてもらうのもあまり良くないと考えている。研究のストーリの立て方は人によって異なるから多くの人にみてもらうと申請書の内容が混乱してしまう。最低限、分野外の人にも伝わる内容に仕上げるために、分野外の知り合い一人に確認してもらうくらいで十分だと考えている。

 

博士就活の感想

民間企業の就職活動が一段落した。

博士新卒の就活を数社受けたのでその感想を残しておく。

 

民間企業を受ける際に以下の優先順位で企業をみていた。

①自分の専門性が活かせそうか

②初任給などの待遇が学士、修士と差別化されているか

③採用選考フローにバカらしい採用試験がないこと(グループディスカッション、ケース面接等)

 

僕は自分の専門分野がとても楽しかったのもあって、専門分野がダイレクトに活かせそうか、もしくは間接的にも関わりのある分野の企業を受けることにした。こんなことを言ってしまうと怒られるかもしれないが、専門分野を活かせないのなら博士に行った意味も殆どなくなってしまうと思っている。当たり前だが、専門性が関係ない分野では、修士卒の学生で3年間の実務経験を詰んでいる同年代には到底及ばないと思うからだ。博士課程で投資した時間とお金を早く回収するにはできるだけ自身の専門性をできるだけ活かせる企業への就職をしたほうが良いと考えている。

 

続いて、待遇面で明確に学士、修士との差別化が図られていない企業は選択肢から外した。なぜなら博士課程で詰んだ3年間の経験、実績を全く評価していないことがすぐにわかるからだ。どうしても科学、学問へのリスペクトが薄いと感じて、行く気がしなかった。

 

続いて3つめの理由について、バカらしいと書いてしまったが、大げさでなく本音でバカらしいと思っている。グループディスカッション、ケース面接も結局のところ対策が確立されてしまっているので、本人の能力に相関なく対策を繰り返せば高評価を得ることができると考えている。グループディスカッション能力、ケース面接能力を欲しているのであれば、グループディスカッション研究科、ケース面接研究科を設立してそこの学生を取ればいい。修士の学生も研究そっちのけでグループディスカッション、ケース面接の練習ばかりしていて、学生も企業も結果的に何がしたいのか本当にわからない。

 

自分の中である程度のスクリーニングをしてD2の夏から冬にかけて7社受けた。

内訳としては、製薬3社、技術系ベンチャー1社、大手メーカー1社、民間企業の中央研究所2社

 

ESも面接も殆ど研究内容が中心だった。学振を書いている博士学生なら、特に大変でもないだろう。よくわからないガクチカ(学生時代に力を入れたこと)のようなこともあまり聞かれなかった。志望動機、研究内容、研究の新規性、工夫した点、入ってからやりたい研究等をしっかり話すことができればOKだと思う。

 

製薬は間接的に専門性、技術が活かせそうだから受けたけど、専門性がかなりマッチしていないと非常に厳しく感じた。結果的に全滅した。製薬企業以外の企業は研究内容も適切に評価されて、良い結果をもらうことができた。

 

研究を頑張っている学生は修士よりも楽に就活が終わると思う。ただ、博士就活はD2の夏頃から本選考が始まるため、早めに就職活動を始めるのが大事。

 

あと、大事なことは世間でどのようなスキルが求められているのかという点は博士学生もキャッチアップして行く必要があると思う。評価されるために無理やりスキルを身につける必要はないが、流行りの技術やスキルを一つ自分の研究に応用してみるなどの気持ちがあれば、企業からの評価も上がると思う。

 

Labbaseとアカリクからのスカウトは採用面談を受けるきっかけにもなったので、民間企業も視野に入れている博士学生は登録しておくことをオススメする。

 

10年後の自分

人生にはいくつかのターニングポイントがあると思う。僕に取っての人生1つ目のターニングポイントは中学卒業後に地元の進学校に進学せずに、工業高等専門学校高専)を選んだことだと思う。自分で言うのもあれだが比較的勉強はできたほうなので当時は地元で一番の公立進学校にも余裕で入れたと思う。高専への受験を決めたときは周りの大人たちにずいぶん反対されたものだ。ただ、結果的に当時の自分は本当に良い選択をしたと思う。当時は子供だった自分にはわからなかったが、若くから工学的な教育を受けた経験は、考え方や気持ちの面で研究者としての土台に大きく影響している。当時の高専の先生達にお礼を伝えたい。

 

今年で26歳になった(正式には去年だが)ので、高専に入学してからちょうど10年が過ぎた。現在の自分は10年前の自分からは想像もつかないような海外で研究をしている。この10年で、自分の人生のスケールが指数関数的に大きくなっているんだと感じて少し不思議な気分になった。

 

つまり、10年先の自分の人生なんて想像もつかないしほとんど見えないものなんだなと思う。10年後のキャリアをどう形作っていくかという考え方も非常に大事だが、運に左右される要素のほうが大きいんじゃないかと思う(努力はしないといけないが)。

10年後には36歳になる。10年後の自分が何をしているのかわからないが、10年後も今の想像外の所で想像がつかないような仕事、研究をしていたい。

 

とういうわけで、人生なんて計算通りに行くわけがないので、あれこれ考えても仕方ないというのは正論だと思う。今の研究室の後輩を見ていると就職活動に全力をかけ研究を全くしていない学生が多い。1年をかけてインターンシップの合否や採用の合否で常に一喜一憂している感じだ。気持ちは本当にわかるが、新卒就活に失敗してもいくらでも逆転できると思うし、10年後には想像もしないような会社に入っているかもしれない。あまり、新卒就活を重く考えすぎずに生きてほしいなと思う。一部の大人がSNSなどを通じて学生を焦らせている結果だと思うが。

 

また、自分自身も謙虚でありたいなとも改めて思う。たまたま現在がうまく行っていても10年後にはどうなっているのかわからないからだ。でも実際にこの観点を持てている人間は結構少ないと思う。周りの学生でも世間一般では超エリートと呼ばれるような企業に内定した瞬間に態度が変わるような人間が結構いる。どこをゴールに設定するかの違いな気もする。そういう人たちは、特にやりたいこともないため、会社に入りエリートの皮をかぶるのが目標だったのだろう。自分は常に10年先を想像しながら謙虚に生きたいなと強く思う。

博士課程2年目の年収

2年目の年収を計算してみた.

 

次世代の給与 月額15万円 1月~3月 15万×3=45万円

JASSO(第一種全額返済免除)月額12.2万円 1月~3月 12.2万×3=36.6万円

DC2給与 月額20万円 4月~12月 20万×9=180万円

RA給与 41万円

 

45+180+41=302.6万円

これでも博士学生の中では上澄みの方だと思う。

JASSO免除が重複不可になったのは、次世代フェローシップを取っている博士学生にとって大ダメージだと感じる。

博士課程修了後のキャリア

D2も終わりということで博士取得後の進路について少し考えてみる.

博士課程修了後の進路として,純粋なアカデミアとしての道を歩むのか,それとも一般企業に進むのかというのは誰もが悩む問題だと思う.アカデミアのキャリアの魅力はやはり自分の専門分野かつ,自由度が高い研究を続けることができる点だろう.指導教員や周囲の研究者を見ていても,自身の専門分野かつ独創的な研究で,世界に成果を発信し続けられる仕事は本当に楽しそうで魅力的な仕事だとつくづく思う.一方で,給与面,安定面に関しての魅力はあまりないと思われる.

 

純粋なアカデミアの一般的な博士終了直後の進路としては,以下の選択肢が挙げられる.

①学振PD

②海外学振

助教

④プロジェクト雇用のポスドク

③の即助教になれるのは一握りの,業績が豊富かつ運が良い一部の人が選べるキャリアであり,ほとんどの人は①の学振PDか②の海外学振を経て,助教の公募に向けて業績を積むのだと思う(実際周りを見てもそのパターンが大半である).

とはいえ,学振PDに全員がなれるかというと,そういうわけではなく学振PDの採択率は20%~30%くらいで,まあまあな競争を勝ち抜かないといけない.

海外学振も同様で20%程度の競争を勝ち抜かないといけない.海外学振は若手の助教なども出せるため学振PDよりも更に厳しい競争である(ように思える).

④のプロジェクト付き雇用はコネが重要になってくるし,場合によってはひどい待遇で雇用されているような噂も聞く(周りにあまりいなく人づてで聞いた話なので実態はよくわからない).

 

民間企業の選択肢としては,アカデミアよりの国立研究所(産総研JAXA,etc..)から民間企業の研究職,コンサル,などかなり幅広い選択肢が存在する.最近の民間企業は博士採用も積極的であり,周りの博士学生を見ていても民間企業の就活で困っている学生はあまり見ない.製薬系、化学系の学生では最初から製薬企業の研究職を目指して博士課程に進学している学生もいるくらいだ。

 

民間企業の魅力はやはり給与面,安定感だろうか。ただ、民間企業では研究を確実にお金に繋げる必要が出てくる。自分の専門分野の自由な研究がほとんどの確率でできなくなってしまうのがネックではある。

 

 

給与面について考えてみる.

最近の賃上げラッシュで民間企業の初任給は軒並み上昇している傾向にある.大卒初任給はおおよそ,23万5千円,院卒では26万5千円ほどが相場だそう.

news.mynavi.jp

 

仮にボーナスが4カ月~5か月分としたら,2年目で大卒では400万円,院卒では450万円くらいだろうか,残業をすればもっと高くなるだろうし,当然これよりもかなり多い金額を貰える企業もある.

 

一方でアカデミアの事情はどうだろうか.助教になると話は変わってくるが,少なくとも学振DCの給与は月額20万円で,ここ20年ほど額面が上がっていない.そして,毎年の流れを見る感じ,今後も額面が上がることはなさそうだ.学振DCの手取りは税金と国民健康保険料,年金を支払うと16万程度しか残らない.学費を支払ったら12万を切る.一人暮らしすら満足にできない金額で,大学時代の同期と比較すると非常にみじめだ.

ただ,まだ学生という身分からすると給与を貰えるだけありがたいので,学振DCは許容できる.

 

ただ,学振PDはどうか.学振PDの月額の額面は36万円.額面として年間430万円である.博士の学位取得後に30歳までこの金額で満足できるかどうかは人によるが,客観的な事実として,2年目の修士卒,下手したら学部卒よりも低い給与である.博士課程に進む学生の多くは旧帝大や有名私大の学生が多いため,学生時代の同期と比べるとかなりみじめな給与額面だと思う(大学時代の同期に中には30歳あたりで,1本に乗りそうな感じみたいな人もけっこういる).給与面でみじめな博士課程を3年間送った中で,学位取得後も,この額面で更に3年間みじめな思いをしないといけないのはさすがに精神的にきついと感じる.また,物価の値上がりと,企業の賃上げが進む中で,全く賃上げの兆しが見えない学振PDという選択肢は年々選びづらくなっているのが学生目線の本音である.実際に,その結果が学振PDの応募者数の推移に表れていると思う.

www.jsps.go.jp

2020年度:1922人

2021年度:1800人

2022年度:1705人

2023年度:1565人

2024年度:1489人

こんなにきれいに下がっていくもんなんだなと感心している.数値計算の残差がこのペースで落ちてくれたら本当に気持ちがよくなりそう.民間企業が博士課程の学生の採用に積極的になってきたこと,民間企業と学振PDの給与格差が年々拡大していることが原因だと思う.

 

給与面以外でのネックはやはり任期付き(非正規の雇用)になることだろうか.3年で所属を確実に追い出されてしまうので,転居などの事情が確実に生じてしまう.仮にパートナーや配偶者が仕事を持っている場合などに,研究を続ける場合には確実にパートナーの仕事を犠牲にする必要がある(同居する場合には).もしくは別居婚や遠距離での付き合いになるだろう.

 

給与が低いかつ,職の保証もない非正規雇用である事実は,結婚や子供などライフプランの変化が大きい28~30歳には非常に厳しい問題のように感じる.すでにパートナーがいる場合、人生のステージを進める際にこれらが障壁になる可能性もあるだろう。仕事の条件的にはモテない条件のオンパレードなので相手がいないくて、これから探そうと思ってる場合は更に大変だと思う。

 

続いて、キャリアの観点から博士学生の自分から見えるそれぞれのキャリアの感覚を述べておこうと思う。近年は中途採用が盛んになってきており、新卒学生も大企業志向は徐々に薄れつつあり、スキル重視でファーストキャリアを選択する学生も増えているように思う。

 

アカデミアでのキャリア経験(助教ポスドク等)がどの程度、民間企業で評価されるのかというのが博士学生の自分には見えないでいる。アカデミア経験は社会経験にカウントされないという話も聞いたことがあるくらいだ。また、特に日本の若手のうちの採用市場は年齢が非常に重要視される。これは、日本企業の採用体系が従来の終身雇用を前提としたメンバーシップ型の採用体系から十分に脱却できていないからだろう。これらを踏まえると、安易にポスドクの道を選択してしまうと社会経験もないまま年数を浪費してしまい人生そのものがおかしな方向に向かってしまう危険性もある。

 

ただ民間企業の博士やポスドクへの見方が少しづつ変わってきているのは感じている。少子高齢化に伴う労働人口の減少や世界での相対的な競争力の低下から日本の企業も危機感を感じているのかもしれない。このことから特に20代のポスドクの採用事情は今後悪化することはないんじゃないかと勝手に考えている。

 

ここまで,つらつら書いてきたが,結局のところ色々と人生を考えてしまうと学振PDなんていう選択肢は取れないなぁと感じる(そもそも通るかどうかも怪しい)。特に将来のことは考えず何とかなるだろうという気持ちで飛び込むしかないのだと思う。将来のアカデミアでのキャリアの確度、学振PDに出せるくらい自信を持つためには、D2までに十分な業績を詰むしかない。まあ,私にはそれができなかったので,完全に自己責任ではある.これから博士課程に進む学生には反面教師にしてほしい.

 

後は,学生時代にパートナーを見つけておくと精神的に大きな支えになると思う。不安定な人生を許容してくれ、共に人生を歩んでくれるパートナーほど貴重な存在はいない。学振PD等で学位取得後にアカデミアの道を決めている人はパートナーを見つけておくことを個人的におすすめする(見つけろと言われて見つけられるものでもないが)。

 

ただ,個人的には学振PDの待遇をよくしろとか提言したいわけではないです。学振PDの待遇に不満があるなら,ほかの選択肢を選べばいいだけだからです。実際に申請者も順調に減っていっているし,このまま進めば10年後くらいには制度そのものが破綻して待遇を改善せざるを得ないだろうと思う。

 

最後に,客観的な事実から個人的な感想を書いただけなので,特に制度の仕組みそのものを否定するつもりはない。3年間,好きな研究者の下で研究課題を遂行し,研究者としてのスキル、研究の幅を広げることができるのは非常に魅力的で素晴らしい制度だと思う。

 

このまま研究を続けたいけど現実的に厳しい点もある.ただ自由な研究を続けるには勇気を持って一歩を踏み出すしかない。進路の選択で揺れる博士学生のつぶやきでした。

確定申告をした

確定申告ってめっちゃ楽になってるのね

マイナンバーカードとスマホがあれば一瞬で終わった。

所得金額や雑所得をポチポチしていったら納税額を計算してくれる。

↓所得の金額は以下の記事で

hakatanoshio-s.hatenablog.com

納税額は42000円

少なくない?と思ったがこんなもんなのか。

ペイペイで支払って終わり。

博士課程一年目の確定申告でした。

 

FEniCSでCFD入門①(非圧縮Navier-Stokes方程式)

 

Opensourceの有限要素法ベースのCFDソルバーであるFEniCSを使ってみようと思い最近触り始めました.

fenicsproject.org

 

WSLとanacondaを用いてFEniCSのインストールを行いました.

開発環境はWSL+anaconda+jupyter notebookです.

↓インストールの詳細に関しては以下の記事を参照しました.

qiita.com

 

今回は有名なカルマン渦列のシミュレーションを行います.

↓カルマン渦列です(日本機械学会より引用https://www.jsme.or.jp/jsme-medwiki/09:1002355).

 

チュートリアルでカルマン渦列のシミュレーションをしようとしたのですがエラーが多く思うように動作しません.

 

↓参考にしたチュートリアルの記事

fenicsproject.org

記事中ではFenicsの内部関数で形状・メッシュの作成を行っていましたが,以下のようなエラーが出て動きませんでした.

---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
/tmp/ipykernel_9077/1743617236.py in <module>
----> 1 import mshr

~/anaconda3/lib/python3.8/site-packages/mshr/__init__.py in <module>
     22 import dolfin
     23 
---> 24 from .cpp import Circle
     25 from .cpp import Ellipse
     26 from .cpp import Rectangle

ImportError: generic_type: type "CSGGeometry" referenced unknown base type "dolfin::Variable"

↓FEniCS projectのオープンスラックで質問したところ以下のような回答が得られました.

どうやら,FEniCS内部で形状とメッシュを作成するmshrは非推奨となっているようです.外部のメッシャーで構築したメッシュをFEniCS内部に読み込むということでしょうか.

 

今回は面倒だったのでカルマン渦用のメッシュをgithubから拾ってきました.このリポジトリ内のdolfin/data/meshes/内のcylinder.xml.gzを使用します.

github.com

 

↓動作を確認したコードを以下に貼っておきます.

from dolfin import *

# Print log messages only from the root process in parallel
parameters["std_out_all_processes"] = False;

T = 5.0            # final time
num_steps = 5000   # number of time steps
dt = T / num_steps # time step size
mu = 0.001         # dynamic viscosity
rho = 1            # density

mesh = Mesh("cylinder.xml.gz")

# Define function spaces
V = VectorFunctionSpace(mesh, "Lagrange", 2)
Q = FunctionSpace(mesh, "Lagrange", 1)

# Define boundaries
inflow   = 'near(x[0], 0.0)'
outflow  = 'near(x[0], 2.4)'
walls    = 'x[1]<0.0 || near(x[1], 0.4)'
cylinder = 'on_boundary && x[0]>0.1 && x[0]<0.3 && x[1]>0.1 && x[1]<0.3'

# Define inflow profile
inflow_profile = ('4.0*1.5*x[1]*(0.41 - x[1]) / pow(0.41, 2)', '0')

# Define boundary conditions
bcu_inflow = DirichletBC(V, Expression(inflow_profile, degree=2), inflow)
bcu_walls = DirichletBC(V, Constant((0, 0)), walls)
bcu_cylinder = DirichletBC(V, Constant((0, 0)), cylinder)
bcp_outflow = DirichletBC(Q, Constant(0), outflow)
bcu = [bcu_inflow, bcu_walls, bcu_cylinder]
bcp = [bcp_outflow]

# Define trial and test functions
u = TrialFunction(V)
v = TestFunction(V)
p = TrialFunction(Q)
q = TestFunction(Q)

# Define functions for solutions at previous and current time steps
u_n = Function(V)
u_  = Function(V)
p_n = Function(Q)
p_  = Function(Q)

# Define expressions used in variational forms
U  = 0.5*(u_n + u)
n  = FacetNormal(mesh)
f  = Constant((0, 0))
k  = Constant(dt)
mu = Constant(mu)
rho = Constant(rho)

# Define symmetric gradient
def epsilon(u):
    return sym(nabla_grad(u))

# Define stress tensor
def sigma(u, p):
    return 2*mu*epsilon(u) - p*Identity(len(u))

# Define variational problem for step 1
F1 = rho*dot((u - u_n) / k, v)*dx  + rho*dot(dot(u_n, nabla_grad(u_n)), v)*dx  + inner(sigma(U, p_n), epsilon(v))*dx  + dot(p_n*n, v)*ds - dot(mu*nabla_grad(U)*n, v)*ds  - dot(f, v)*dx
a1 = lhs(F1)
L1 = rhs(F1)

# Define variational problem for step 2
a2 = dot(nabla_grad(p), nabla_grad(q))*dx
L2 = dot(nabla_grad(p_n), nabla_grad(q))*dx - (1/k)*div(u_)*q*dx

# Define variational problem for step 3
a3 = dot(u, v)*dx
L3 = dot(u_, v)*dx - k*dot(nabla_grad(p_ - p_n), v)*dx

# Assemble matrices
A1 = assemble(a1)
A2 = assemble(a2)
A3 = assemble(a3)

# Apply boundary conditions to matrices
[bc.apply(A1) for bc in bcu]
[bc.apply(A2) for bc in bcp]

# Create XDMF files for visualization output
u_file = File('navier_stokes_cylinder/velocity.pvd')
p_file = File('navier_stokes_cylinder/pressure.pvd')

# Create time series (for use in reaction_system.py)
timeseries_u = TimeSeries('navier_stokes_cylinder/velocity_series')
timeseries_p = TimeSeries('navier_stokes_cylinder/pressure_series')

# Save mesh to file (for use in reaction_system.py)
File('navier_stokes_cylinder/cylinder.xml.gz') << mesh

# Time-stepping
t = 0
for n in range(num_steps):

    # Update current time
    t += dt

    # Step 1: Tentative velocity step
    b1 = assemble(L1)
    [bc.apply(b1) for bc in bcu]
    solve(A1, u_.vector(), b1, 'bicgstab', 'hypre_amg')

    # Step 2: Pressure correction step
    b2 = assemble(L2)
    [bc.apply(b2) for bc in bcp]
    solve(A2, p_.vector(), b2, 'bicgstab', 'hypre_amg')

    # Step 3: Velocity correction step
    b3 = assemble(L3)
    solve(A3, u_.vector(), b3, 'cg', 'sor')

    # Plot solution
    plot(u_, title='Velocity')
    plot(p_, title='Pressure')

    # Save solution to file (XDMF/HDF5)
    u_file << u_
    p_file << p_

    # Save nodal values to file
    timeseries_u.store(u_.vector(), t)
    timeseries_p.store(p_.vector(), t)

    # Update previous solution
    u_n.assign(u_)
    p_n.assign(p_)

    # Update progress bar
    print('u max:', u_.vector().get_local().max())

細かいコードの解釈はまだできていないため,今後解釈でき次第追記していきたいと思います!

 

可視化はおなじみのParaviewで行いました.

↓カルマン渦列が見えますね!

見知らぬ人が作成したメッシュなのでかなり荒いメッシュです.

今度は自力でメッシュ作成からFEniCSで流体計算までしてみようと思います!