プログラマーになりたい。

プログラミングや写真や本や読書会のことや、日常のこと。

Python教材用のSIRモデル

友だちから「じぶんでSIRモデルが書けるようになりたい,でもそれだけだと面白くないから,できれば何かプラスアルファの機能がほしい.」というような依頼があったので,教材を作っている.

それで,先にゴールとして「このくらい書けるようになる」プログラムの例をかんたんな表現で書いてみた.

S.I,Rがベクトルになっているが,これは年齢層や地域などで別々に計算したいときに使う.いまは,3つとも同条件なので,このままだと意味がないが…….βを変更するか,グループ同士の交流を隣接行列のようなものを使って制御する必要がある.まあ,それはプラスアルファということで.現状のColabへのリンクも最後に張っておきます.

import numpy as np
import matplotlib.pyplot as plt

#基本設定
GROUPS=["A","B","C"]
ONES=np.ones_like(GROUPS, dtype=np.float64)
ZEROS=np.zeros_like(GROUPS, dtype=np.float64)

#SIRモデル定数
R0=1.0
γ=ONES*1/15
β=ONES*R0*γ
print("γ",γ)
print("β",β)

#SIRモデル変数初期値
S=[ONES]
I=[ONES*0.001]
R=[ZEROS]

def calc(s, i ,r):
    #差分の計算
    ds=-β*s*sum(i) #グループに関係なく接触
    #ds=-β*s*i #グループ同士が接触しない
    dr=γ*i
    di=-ds-dr

    #差分を適用した値を返す
    return s+ds, i+di, r+dr

def run(S, I, R, TMAX=100):
    s=S[-1]
    i=I[-1]
    r=R[-1]
    for t in range(1,TMAX):
        s,i,r=calc(s, i, r)
        S.append(s)
        I.append(i)
        R.append(r)
    return S, I, R

S, I, R=run(S, I, R)

plt.plot(S)
plt.plot(I)
plt.plot(R)
plt.legend()
plt.show()

colab.research.google.com

systemdはなぜ「システム」なのか?

はじめてsystemdの名前を見たときは,たかだかデーモンを起動するだけのしくみになんて大げさな……と思ったが,よくよく調べると確かにシステムの根幹をなすものなのだった. なにしろ,すべてのプロセスはsystemdが起動したものだし(下記参照),マウントやソケットもすべてsystemdにぶらさがっている.そのことはオプションをつけずにsystemctlを実行するとわかる.systemdはまさにシステムそのものなのだった.

$ pstree
systemd─┬─ModemManager───2*[{ModemManager}]
        ├─NetworkManager───2*[{NetworkManager}]
        ├─2*[abrt-watch-log]
        ├─abrtd
(略)

yumのグループには環境とふつうのグループがある

あまり知られていないようだがmCentOSyum groupsで扱うグループには種類がある. # yum groups listと打ち込むと,Environment GroupsとGroupsに分かれているのがわかる.

[iida@katla3 ~]$ yum groups list
Loaded plugins: fastestmirror, langpacks
Repodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fast
There is no installed groups file.
Maybe run: yum groups mark convert (see man yum)
Loading mirror speeds from cached hostfile
 * base: ftp-srv2.kddilabs.jp
 * extras: ftp-srv2.kddilabs.jp
 * updates: ftp-srv2.kddilabs.jp
Available Environment Groups:
   Minimal Install
   Compute Node
   Infrastructure Server
   File and Print Server
   Basic Web Server
   Virtualization Host
   Server with GUI
   GNOME Desktop
   KDE Plasma Workspaces
   Development and Creative Workstation
Available Groups:
   Compatibility Libraries
   Console Internet Tools
   Development Tools
   Graphical Administration Tools
   Legacy UNIX Compatibility
   Scientific Support
   Security Tools
   Smart Card Support
   System Administration Tools
   System Management
Done

Environment GroupsはOSのインストーラーで選択する環境とだいたい対応していることがわかると思う.インストーラーでは1つしか選べないが,yum groups installでも原則的に1つしかインストールしないことを想定しているようだ.ただし,2つ以上インストールできないわけではない. よくある用途としては,インストーラーで,GUIをインストールしたかったのに誤ってMinimal Installを選んでしまったとき,この中から適切なグループ(一般的にはServer with GUIGNOME Desktopになると思う)をインストールすると,見慣れたGNOMEがインストールされる.

具体的にはrootでログインして,

  • yum groups install GNOME\ Desktop
  • もしくは,yum groups install "GNOME Desktop"

のようにする,空白を含むので上記のようにエスケープしたりする必要がある.

なお,# yum groups list hiddenとすると,通常のリストには出てこないグループが出てくる.あまりいじるのはオススメしない.たとえばGNOMEとかX Window Systemとかがふつうのグループとして出てくるが.これらはEnvironment GroupsのGNOME Desktopに比べてかなりスリムな構成になっていて,GNOMEだけではGNOMEが起動しないなど,トラブルの元になるからである.

ちなみにマシンによってはMinimal Installでインストールしておいて,GNOMEX Window Systemを追加でインストールすると最小限のGUI環境が作れる場合があるようだけど,失敗すると起動後画面が真っ黒になったりするので,オススメしない(その場合Environment GroupsのGNOME Desktopをインストールすると,直る).

弊社では,どうしてもディスク容量を節約したいとかの場合,Compute Node+Debugging ToolsでOSのインストールをしておいて,yum groups install GNOME "X Window System"を行うことがあるが,なぜか上手くいくときとそうでないときがある.

なお,ふつうの,Environmentではないグループはいくつでも追加することができる.

最近プログラミングをしています

このブログの今のタイトルは『プログラマーになりたい』ですが,これはそもそも僕にはアマチュアとしてのプログラミングの経験しかないからでした.関係ないアルバイト中に,ちょっと業務命令を受けてないプログラミングすることはあっても,プログラマーとして雇われたことがないのです.もう少し具体的に言うと,

  • 卒業研究でC++Java,Rでニューラルネットワークのモデルを書く
  • PHPでデータの整形をして,ブラウザーから同僚が見れるようにする
  • 会社のウェブサイトを作るのに,WordPressの子テーマを作る(x3回くらい)
  • プログラミング経験が浅い人の書いた,HTMLテンプレートのロジックの整理
  • なんだか知らないソフトウェアのインストールと設定
  • プログラミング経験が無い友だちが書いた簡単な物理シミュレーションの手直し
  • 趣味でSwiftでiOSアプリを作る
  • 趣味で深層学習のモデルをファインチューニングして物体検出をする

みたいな感じです.何を基準にプログラマーを名乗るかは,別に自分の判断でいいのですが,社会的には求職時にスキルシートというものがあって,「業務上」行った経験しか書けないため,上記のような経験は書くことができないので,プログラミング経験がない=プログラマーではない扱いになるのです.

それが,なんと,最近パートタイムではあるもののプログラミングの仕事が来ています.JavaPythonを書いていますが,もう1年くらいやっています.さらに納品物としてシェルスクリプトをときどき書くのでbashの経験も書ける気がします.どちらも実質ひとりぼっちプロジェクトなので,プロジェクトマネジメントとか全然できないのが痛いですが,そろそろ「プログラマー」を名乗っても怒られない気がしてきましたよ. 今の会社を辞める気はないため,当分スキルシートを書く機会はなさそうなので,ブログのタイトルは変えませんが.

最近身につけたスキル

最近は軽自動から外車が買えるくらいの値段のパソコンを販売している会社で働いている.XeonCentOS 7の組み合わせが多い. 元々全くLinuxを使えないわけではなかったけど,./configure&&makeレベルだった. それが,複雑なconfigureオプション,NFS,systemdのユニットファイルの作成などができるようになってしまった. AVX512 Boost Frequency,Hyper-Threading,P/C-statesといった概念もある程度理解している. それから,年に数回クラスター製品が売れるので,Torque,Open Lava,slurmなどで,OpenMPIと10GbEやInfiniBandを動かすタイプの簡易なクラスターが組めるようになってしまった.

言語面では必要に迫られてググって書いていたら,気づいたらBashのif/forの簡単なワンライナーが書けるようになっていた.元々あまり好きじゃないのに.findにコマンドを渡すやつと,xargsがよくわからないので,目下の課題だ. あと,Bashを書いていたらPerlへの拒否感が霧消しててびっくりしている.

これまで,1日にコードを書く量では,15年ほど前が,プロコン(Java)とゼミ(R)と卒研(Java,R)が重なっていて,ピークだったけど,最近突然再びJavaを書くことになってその当時を超えている日がある. デザインパターン的な感覚というか,いろんな言語にちょこちょこ手を出したおかげか,妙に俯瞰できる気がするのが不思議だ. 一方で,継承,インターフェースとかの変数のスコープの仕様なんかはボロボロ. あとMavenは使ってるけど全然わからない.gitはコミットと新ブランチ切る以外無理.

まあ,そんな感じ.

生きていますか

私は何とか世の中で生きています.いまだに令和の響きには慣れませんが…. 何でもいいけど,諸君,頼むから平和な時代にしてくださいね.

久しぶりに更新しますが,書くこともないので,近況報告として最近やってる仕事について書いておきます.

最近は,主にハイパフォーマンスコンピューティング向けのマシンのソフトウェアのセットアップとかやっています.

マシンはどのくらいの規模かというと,軽自動車から高級車くらいの値段.そんなマシンが1台から数台のシステムが多いです.この分野としてはかわいらしい方です. などと偉そうに書きましたが,僕自身は予算管理や見積もりに関わらないので,実はよくわかっていません.というか,多分誰も真面目に僕の作業量(人件費の予算)のカウントをしていません.期限までに動けばオッケー.

そんなマシンにOSやライブラリーなどを入れて設定します. ほとんどの案件で,OSのインストールから出荷までひとりでやるので,結構好き勝手できてしまいます.よく言えば自由度が高いと言えましょうが,何の保険もありません.僕が失敗に気づかないと,そのままお客さんに届くので時々ヒヤヒヤします.

まじめな話,シェルの入出力をいい感じに記録する方法がないものか,と悩んでいます.記録しておけば,少なくともどのようなバカをやらかしたか,どうしたら直せるか,わかるからです.品質管理が最近の一番の悩みです.(scriptコマンドは,打ち忘れるんですよね.Jupyterはーーうーん…….)

 *

皆さんご存じの通り,僕が卒業した都立高専というところは,貧乏でした.最近は国立大も厳しいと評判ですが,都立高専は僕が研究室に所属していた2005年頃からすでに研究室のパソコンを買う金にも困っていた気がします.電子系の研究室では,学生の人数分のパソコンがないところもあった.僕は専用のパソコンがありましたが,数年前のBTOの安いパソコンでした. あるとき先生が外部資金を当てたのか,hpかなにかのワークステーションが来ましたが,正直俺以外はSSHの使い方が分からなくて,使ってなかった気がします.

そんな世界で育ったので,突然その10〜100倍するマシンをいじってると知らされても,正直1年くらいやってるのに実感がわいてない節があるのです. まあ,精々壊さないように頑張ります.ワタクシ,集中力がないというか,あらゆる動作が非常に雑なので.

SONY MDR-EX31BNはいいイヤホンだ

SONY MDR-EX31BNはいいイヤホンだ。 古いので新品でも7000円強で買えるし、ノイズキャンセリングの性能は同時期の他社製品と比較して抜きん出ている。

発売当時、他社製品はノイズキャンセリング回路がアナログばかりだったのだが、この製品はいち早くデジタル方式を採用している。装着すればすぐに違いがわかると思う。

もちろんイヤホンというのは、ヘッドホンに比べると、構造上外部の騒音を防ぎきれないため、同じSONYだったらヘッドホンの方がノイズキャンセリングはよく効くが。

あと、なぜか日本のメーカーのイヤホンって、昔から遮音性が低いので、例えば遮音性が高い(ノイズキャンセリングではない)SURE SE215とかと比べるとどっちが快適かは人やシチュエーションによる。

ノイズキャンセリングの副作用として,DACとアンプがイヤホン側に入っているということがある(私としてはこちらが重要)。 Bluetoothイヤホンの場合、iPhoneの内蔵アンプを経由しないで音が出るわけだ。例えばXperiaなどはそうでもないのかもしれないが、iPhoneのオーディオ周りは貧弱なのだ。

イヤホンのSONYDACで信号を作り、SONY製アンプでイヤホンをドライブした方がよい結果になるようである。特に低音は、SONY製の似たようなイヤホンを直接iPhoneのイヤホンジャックにつないだ場合と比べて、明らかに増強される。まあ、これが嬉しいのは、低音が好きな人に限るけど。 BOSEのイヤホンなんかも、パッシブな回路(エフェクター)をコードの途中についてるみたいだが、やはりアクティブな回路(電源付き)のが自由度が高い。

デメリットとしては、充電が必要なことと、秋葉原のような電波が飛びすぎているところではブチブチ切れること、前述の通りノイズキャンセリングが海外の有線イヤホンと大して変わらないこと、SONY製の新型(WF-1000X)と比べると音の出所が一カ所にあり、広がりを感じられないことなどがある。

ちなみに、ノイズキャンセリングの性能は,新型と大して変わらないと思う。

Creative Commons License ©2007-2021 IIDA Munenori.