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

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

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)と比べると音の出所が一カ所にあり、広がりを感じられないことなどがある。

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

ニューラルネットワークのプログラムを久しぶりに見て思ったこと

10年ぶりくらいにニューラルネットワークのプログラムを書いている。趣味だけど。

少し前にすごい勢いでディープラーニングが流行ってしまい、うっとおしいような、うらやましいような気分になった。だが、TensorflowやKerasを触ってみると、格段に楽になっている。流行ってすごいな。

なにしろ、2004年に僕が高専の研究室に入ったときは、最初C++で配列とfor文を使って書いていた。単層のパーセプトロンでも、僕はプログラマとしての注意力が決定的に欠けているので、配列の操作でエラーとNaNを出しまくって、わけがわからなくなったものだ。

途中からJavaにしたので若干マシになったが、for文を使うという基本は大して変わらなかった。ぬるぽぬるぽ。たしか、まだイテレーターがなかったか、知らなかった。最後の方でRを知り、やっと内積(ベクトル-ベクトル積)が1行で書けるようになった。

それが、最近Kerasを使ってみたら、今では1層の定義が1行で済むじゃないか。

それから、驚異的なのが学習。tfから入った人には、何のことを言っているかよくわからないかもしれないが、学習(結合負荷の更新)の式は、w(t+1)=w(t)+……みたいな漸化式の形式になっているものを本や論文から写す必要があった。なければ紙とペンで偏微分だ(僕は授業でしかやったことはないが)。

現在は、どうもtfが対応しているタイプの関数なら式の変形(偏微分)をtfの内部で行ってくれるようで、基本的に入出力の式と誤差の式だけ書けばいいみたいだ。すげえ時代。個人的には、tfで書かれたプログラムを初めて見たとき一番驚いたのがこれだった。

個人的には、一応tfの中で何が起きているのか、更新式の存在くらいは知っていたほうがいい気もするんだけど、これは「プログラマならアセンブラを勉強しろ」と言うのに等しい気もするので、難しいところだ。

Creative Commons License ©2007-2016 IIDA Munenori.