プログラマ行進曲第二章

主にソフトウェア関連の技術をネタにした記事を執筆するためのブログ

『SINGLE TASK 一点集中術』を読み終えた

takuan-osho.hatenablog.com

『やり抜く力 GRIT』を読んだ後、「一つのことに集中する方法論が知りたい」と思っていたところ、本屋で見つけたので読んでみました。

SINGLE TASK 一点集中術――「シングルタスクの原則」ですべての成果が最大になる

SINGLE TASK 一点集中術――「シングルタスクの原則」ですべての成果が最大になる

例によって例のごとく、これも期待に応えられるほどの内容ではなかったですが、最近の自分の集中力の欠如を意識するにはいい薬だったかと思います。

雑念が入りにくい環境下で今日の12時頃から1.5時間くらいでバーッと読みました。一応シングルタスクを標榜している書籍なので、それに習って読書も集中してやるようにしました。

この書籍を一言で要約すると「マルチタスクは効率が下がるので、効率をよくしたかったらシングルタスクで作業せよ」というものでした。

この主張自体は人によっては至って当たり前で何の新鮮味もない*1ですが、これくらいシンプルな法則は日々の生活で実践していくのが難しいと相場が決まっているものです。

この本の著者もその辺りは分かっているようで、SNSを含め情報に溢れた現代でマルチタスクをせずにシングルタスクで作業していくことの難しさに対処していくか、そんなことも含めて書かれていました。一番最初に「集中を削ぐものから離れる」という趣旨の項目が書かれていることからもそれが伺えます。

GTDを日々実践できている人にはもう既にやっていることばかりなので「何を当たり前な」と思うことばかりですが、私みたいに何回もGTDをやって途中で挫折している人間にとっては「これくらいやることを絞ってくれるならできそうかも」と思える分量だと思います。

本もそれほど厚くなく、数時間で読み切れる分量だと思うので、気になる方は本屋で手に取って読んでみるといいかと。

自分用のメモに残していた文言を適当に書き散らして終わりにします。

p72

シングルタスクとは、単なる行為を指すわけではない。自制心を発達させることでもある。

p76

シンプルに考えたいのなら、一日のあいだに「ひとりでじっくりと考え事をする時間」を決めるのがいい。

p188

いま自分にとっていちばん大切なことはなにかを考え、それに誠実に取り組もう。

*1:私もそうです

2018年の初日の出を見に行きました

ここ数年、初日の出を見に行っているのですが、今年も見に行きました。

初日の出前の光景。

日が出る前の様子。

出てきてる

初日の出を堪能してます。

こちらの方が初日の出を綺麗に撮れてますかね

段々日が出てきた様子。最初の2枚はiPhoneのカメラを拡大したので画質が荒くなっていますが、最後の一枚は拡大せずに撮っているので、それなりに綺麗かと。

年も明けたので、計画立てて一年を意義深く過ごしたいなあと思ってます。

2017年の振り返り

はじめに

昨年も年末に振り返りをしたので、今年もします。

takuan-osho.hatenablog.com

調べてみたら結構前から振り返りしてるんだなと思いました。

takuan-osho.hatenablog.com

takuan-osho.hatenablog.com

takuan-osho.hatenablog.com

2013年からしてるとは思いませんでしたね。アニメのことだけの振り返りですが。

振り返りといっても年全体の振り返りをするといくら時間が合っても足りないのと、そもそもそんなに記録を残してなくて無理なので、今年頭に立てた目標がどれくらい達成できたかを見て振り返りにしたいと思います。

成果確認

takuan-osho.hatenablog.com

上記記事によると、今年頭に立てた目標は以下の通り。

  • オペレーションをこなせるようにする
  • 機械学習の最初の一歩を踏み出す
  • (180度の)開脚をできるくらいの柔軟性を得る

それぞれ振り返ります。

オペレーションをこなせるようにする

仕事でサーバーの運用業務をするようになったのですが、issueとして登録されている問題の特定・解決するのに必要なオペレーションを思ったようにできていないなと痛感しているので、Linuxの基礎知識*1を含めて、オペレーションの能力を強化していくのを1つめの抱負にしました。

こちらに関しては完璧ではないにしろ、当初立てていた目標に近いところまで出来たと思うので、〇ということにしたいです。

勿論、まだまだ不完全なので、仕事をしつつ、足りない知識を『詳解システムパフォーマンス』を読むなどして埋めながら過ごしてはいたのですが、途中で『詳解システムパフォーマンス』を読むのも止まっているので、年が明けたら再開し、よりまともなオペレーションが出来るように頑張りたいですね。

仕事でよく使うようになったlinuxのコマンドをメモして残しておきます。

  • du
    • だいたいディスク残量が問題なることが多いので必然的に使うように。
  • ps
    • プロセスの状態を見るので。オプションをもっと把握しておいた方がいいかも。
  • top
    • 正直メモリとCPUの値しかまだちゃんと見られないので、他の値を意味を理解してちゃんと見られるようになりたいところ。
  • lsof
    • lsof -i:<port> の使い方しか使いこなせないけどそれでも有用。他のオプションも理解してもっと使いこなせるようにしたい。
  • last
    • last | head とかよくやっている。
  • w

機械学習の第一歩を踏み出す

既存のアルゴリズムを自分で実装できるくらいに理解できれば理想ですが、そこまで行かなかったとしても、素材を自動で分類したくなったときに各種ライブラリを活用してソリューションをでっちあげるということができるようになるといいなあと思ってます。

これに関しては△ですね。

一応最初の方はやる気を出して、Andrew Ng先生のあの有名なCourseのMachine learning講座を途中まではやったのと、『ゼロから作るディープラーニング』を全部読んだので、ある一定程度の成果は得られたのですが、自分でソリューションをでっち上げることができるレベルにまでは到達していないからです。

www.coursera.org

今確認したら、Courseraの方はWeek 6まではやり終えていて、Week 7のSupport Vector Machinesで詰まって死んでいるという状態のようですね。

こちらの書籍は全部読んで、コードも半分以上は写経したのですが、ブログ記事にする余力がなくてできていないのが残念。

立てた目標のレベルには届かなかったけれど、本当に基礎的な部分の知識は得た影響で、今まで機械学習の記事を読んでも宇宙語を話されているような気分になっていたのが、一応分からない部分を調べることができるところにまで行けたのは大きな成果だと思っています。

(180度の)開脚をできるくらいの柔軟性を得る

これは仕事とは全く関係ない目標で、自分の身体の柔軟性を挙げたいというものです。

一応数値目標を出しておいた方が計測できるので180度開脚としたいのですが、多分これ難しいのでなるべくそれに近づけるという意味合いをこめてカッコをつけてます。

今続けている空手のパフォーマンスにも関わってくる話なのでそれなりに真面目に取り組みたい抱負です。

これは残念ながら成果としては×をつけるしかないという結果です。

途中までは少しずつ開脚できる度合いも高まっていたのですが、9月かその辺りで左脚内部の筋を開脚中に痛めてしまって、そこから成果は進展するどころか交代してしまって180度開脚を達成するところではなかったという悲しい結果に。

今も左脚内部の筋は痛い状態が続いていて、整形外科に行ってMRIを使った診察もやったのですが、判明したのは致命的な怪我ではないということだけで、今もどうやって治したらいいのか分からなくて困ってますね。

まあ、ぼちぼちやっていきます。

まとめ

一年を通してみると、ダレてしまった時期が結構ありましたが、それまでの年の過ごし方に比べれば圧倒的に年初に立てた目標を達成する方向に進められたので、新年を迎えてもこの調子は変えずに、目標達成をできるような過ごし方をしていきたいと思います。

通っていたフィットネスクラブを退会した

昨年転職する前までは時間的に余裕があったので、運動の習慣をつけるためにフィットネスクラブに加入して通っていたのだが、転職してから忙しくてほとんど行けてなかった。

というのに、面倒くさくて退会手続きをしてなかったのだが、マネーフォワードに記録されているフィットネスクラブの引き落としの金額を見て、「流石にもう退会するか」と思ったので、先ほど退会手続きをしてきた。

これで毎月11,000円弱引き落とされていたお金がかからなくなる。

半年以上一回も行けてないのにずるずると今まで引き延ばしてきたが、年をまたぐ前に処理できてよかった。

一年の終わりも近づいているので、整理を色々としないとなあ、と思ってる。

RPMパッケージを相手にするときによく使うコマンドをメモしておく

Qiitaとか各種色々なところにもっと分かりやすい形でちゃんとまとまってるんですが、自分のブログに書くことで記憶定着を図りたいのでまとめます。

qiita.com

qiita.com

qiita.com

なお、以下に提示する例はCentOS6を使っているので、色々古いソフトが表示されてますが、気にしないでください。

インストールされたrpmを一覧表示する

rpm -qa

「インストールしたんだけど正確なパッケージ名が思い出せない」といった時にはgrepと組み合わせると効果を発揮。

rpm -qa | grep ruby
ruby-devel-1.8.7.374-4.el6_6.x86_64
ruby-1.8.7.374-4.el6_6.x86_64
ruby-irb-1.8.7.374-4.el6_6.x86_64
ruby-libs-1.8.7.374-4.el6_6.x86_64
ruby-augeas-0.4.1-3.el6.x86_64
ruby-shadow-2.2.0-2.el6.x86_64
ruby-rdoc-1.8.7.374-4.el6_6.x86_64
rubygem-json-1.5.5-3.el6.x86_64
libselinux-ruby-2.0.94-7.el6.x86_64
rubygems-1.3.7-5.el6.noarch

逆にパッケージ名を正確に覚えているときは -q オプションだけでいいです。

rpm -q ruby-devel
ruby-devel-1.8.7.374-4.el6_6.x86_64

RPMパッケージ経由でインストールされたファイルを一覧表示する

rpm -ql <package name>
rpm -ql ruby-devel
/usr/lib64/libruby.so
/usr/lib64/ruby/1.8/x86_64-linux/config.h
/usr/lib64/ruby/1.8/x86_64-linux/defines.h
/usr/lib64/ruby/1.8/x86_64-linux/digest.h
/usr/lib64/ruby/1.8/x86_64-linux/dl.h
/usr/lib64/ruby/1.8/x86_64-linux/dlconfig.h
/usr/lib64/ruby/1.8/x86_64-linux/dln.h
/usr/lib64/ruby/1.8/x86_64-linux/dtrace.h
/usr/lib64/ruby/1.8/x86_64-linux/env.h
/usr/lib64/ruby/1.8/x86_64-linux/intern.h
/usr/lib64/ruby/1.8/x86_64-linux/missing.h
/usr/lib64/ruby/1.8/x86_64-linux/node.h
/usr/lib64/ruby/1.8/x86_64-linux/re.h
/usr/lib64/ruby/1.8/x86_64-linux/regex.h
/usr/lib64/ruby/1.8/x86_64-linux/ruby.h
/usr/lib64/ruby/1.8/x86_64-linux/rubyio.h
/usr/lib64/ruby/1.8/x86_64-linux/rubysig.h
/usr/lib64/ruby/1.8/x86_64-linux/st.h
/usr/lib64/ruby/1.8/x86_64-linux/util.h
/usr/lib64/ruby/1.8/x86_64-linux/version.h
/usr/share/doc/ruby-devel-1.8.7.374
/usr/share/doc/ruby-devel-1.8.7.374/COPYING
/usr/share/doc/ruby-devel-1.8.7.374/COPYING.ja
/usr/share/doc/ruby-devel-1.8.7.374/ChangeLog
/usr/share/doc/ruby-devel-1.8.7.374/GPL
/usr/share/doc/ruby-devel-1.8.7.374/LEGAL
/usr/share/doc/ruby-devel-1.8.7.374/LGPL
/usr/share/doc/ruby-devel-1.8.7.374/README.EXT
/usr/share/doc/ruby-devel-1.8.7.374/README.EXT.ja

インストールしているパッケージの情報を表示する

rpm -qi <package name>
rpm -qi ruby-devel
Name        : ruby-devel                   Relocations: (not relocatable)
Version     : 1.8.7.374                         Vendor: CentOS
Release     : 4.el6_6                       Build Date: Mon 02 Mar 2015 09:12:37 AM UTC
Install Date: Thu 10 Nov 2016 10:08:51 AM UTC      Build Host: c6b8.bsys.dev.centos.org
Group       : Development/Languages         Source RPM: ruby-1.8.7.374-4.el6_6.src.rpm
Size        : 1103028                          License: Ruby or GPLv2
Signature   : RSA/SHA1, Mon 02 Mar 2015 12:21:02 PM UTC, Key ID 0946fca2c105b9de
Packager    : CentOS BuildSystem <http://bugs.centos.org>
URL         : http://www.ruby-lang.org/
Summary     : A Ruby development environment
Description :
Header files and libraries for building a extension library for the
Ruby or an application embedded Ruby.

RPMパッケージの情報を表示する

インストールしているときは rpm -qi <package name> ですが、まだインストールしてないRPMパッケージの場合は rpm -qpi <package name> で表示できます。

ls | grep ruby-devel
ruby-devel-1.8.7.374-5.el6.x86_64.rpm

rpm -qpi ruby-devel-1.8.7.374-5.el6.x86_64.rpm
Name        : ruby-devel                   Relocations: (not relocatable)
Version     : 1.8.7.374                         Vendor: CentOS
Release     : 5.el6                         Build Date: Wed 22 Mar 2017 05:52:23 AM UTC
Install Date: (not installed)               Build Host: c1bm.rdu2.centos.org
Group       : Development/Languages         Source RPM: ruby-1.8.7.374-5.el6.src.rpm
Size        : 1103263                          License: Ruby or GPLv2
Signature   : RSA/SHA1, Thu 23 Mar 2017 03:00:13 PM UTC, Key ID 0946fca2c105b9de
Packager    : CentOS BuildSystem <http://bugs.centos.org>
URL         : http://www.ruby-lang.org/
Summary     : A Ruby development environment
Description :
Header files and libraries for building a extension library for the
Ruby or an application embedded Ruby.

RPMパッケージに含まれているファイルを一覧表示する

rpm2cpio <package name> | cpio -t

rpm -ql はインストールしているRPMパッケージの時に使えるが、これはインストールしてなくてwgetなどでダウンロードしてきたRPMパッケージなどについて使える

rpm2cpio ruby-devel-1.8.7.374-5.el6.x86_64.rpm | cpio -t
./usr/lib64/libruby.so
./usr/lib64/ruby/1.8/x86_64-linux/config.h
./usr/lib64/ruby/1.8/x86_64-linux/defines.h
./usr/lib64/ruby/1.8/x86_64-linux/digest.h
./usr/lib64/ruby/1.8/x86_64-linux/dl.h
./usr/lib64/ruby/1.8/x86_64-linux/dlconfig.h
./usr/lib64/ruby/1.8/x86_64-linux/dln.h
./usr/lib64/ruby/1.8/x86_64-linux/dtrace.h
./usr/lib64/ruby/1.8/x86_64-linux/env.h
./usr/lib64/ruby/1.8/x86_64-linux/intern.h
./usr/lib64/ruby/1.8/x86_64-linux/missing.h
./usr/lib64/ruby/1.8/x86_64-linux/node.h
./usr/lib64/ruby/1.8/x86_64-linux/re.h
./usr/lib64/ruby/1.8/x86_64-linux/regex.h
./usr/lib64/ruby/1.8/x86_64-linux/ruby.h
./usr/lib64/ruby/1.8/x86_64-linux/rubyio.h
./usr/lib64/ruby/1.8/x86_64-linux/rubysig.h
./usr/lib64/ruby/1.8/x86_64-linux/st.h
./usr/lib64/ruby/1.8/x86_64-linux/util.h
./usr/lib64/ruby/1.8/x86_64-linux/version.h
./usr/share/doc/ruby-devel-1.8.7.374
./usr/share/doc/ruby-devel-1.8.7.374/COPYING
./usr/share/doc/ruby-devel-1.8.7.374/COPYING.ja
./usr/share/doc/ruby-devel-1.8.7.374/ChangeLog
./usr/share/doc/ruby-devel-1.8.7.374/GPL
./usr/share/doc/ruby-devel-1.8.7.374/LEGAL
./usr/share/doc/ruby-devel-1.8.7.374/LGPL
./usr/share/doc/ruby-devel-1.8.7.374/README.EXT
./usr/share/doc/ruby-devel-1.8.7.374/README.EXT.ja
2164 blocks

RPMパッケージからファイルを取り出す

rpm2cpio <package name> | cpio -id
ls
ruby-devel-1.8.7.374-5.el6.x86_64.rpm

 rpm2cpio ruby-devel-1.8.7.374-5.el6.x86_64.rpm | cpio -id
2164 blocks

ls
ruby-devel-1.8.7.374-5.el6.x86_64.rpm  usr

正直な話、「今の仕事を始める前にこれらのことをちゃんと知っておけば無駄な時間を使わなかったのにな」と思いながら書きました。

『やり抜く力 GRIT』を読み終わった

学生時代の読書のパターンと比べて、ここ10年間、技術書以外のジャンルの本をほとんど読まなくなってしまっていて、あまりよろしくないなと思い、以前は読んでいたビジネス書や小説なども読み始めるようにしました。

今回はビジネス書*1の読後感想です。

やり抜く力 GRIT(グリット)――人生のあらゆる成功を決める「究極の能力」を身につける

やり抜く力 GRIT(グリット)――人生のあらゆる成功を決める「究極の能力」を身につける

人生色々あったことも影響してか、学生時代と比べて物事をやり遂げる経験や力が少なくなっていると感じることが多く、立てた目標を完遂する癖をつけたいなとここ最近感じていたところ、たまたまこの本の著者のTEDトークでGRIT(やり抜く力)のことを知り、実践的なことが書いてあるのかと思って買って読んでみました。

読み終わった今感じることとして、率直に言うと期待外れでした。

というのも、『人生において何かを成すには「才能」よりも「やり抜く力」の方が重要度が高いことが研究の結果分かった』ということらしいのですが、その「やり抜く力」を伸ばす方法については(まだ研究途中ということなのでどうしようもないのでしょうが)、効果的な方法が研究の結果分かっている箇所もあればまだ不明なところもあるという箇所が多いようで、学問的に裏付けられた「やり抜く力を効果的に伸ばす方法論」が確立されてなさそうだったからです。

一応、「自分のスキルを上回る目標を設定してはそれをクリアする練習を習慣化する」など、指針となる方法は何個か提示されていましたが、どれも確立された方法論というよりは単なるガイドライン程度に(少なくとも私は)思えるレベルで、個人的に期待していたものが無かったということです。

ただ、本を読んでいてモチベーションを高める効果はあったのと、誰もが努力無しに楽に成功しているわけではないということを再認識できた効果があったのは良かったかと思います。

読む時の注意としては、ここで書かれていることを自身を対象に実践するのはおおよそ問題がなさそうですが、他者に対して実践しようとすると、容易にブラック企業がやるようなやりがい搾取的所業をするように振る舞ってしまいそうだなと思ったので、基本的に自分の人生だけに適用するように使った方がいい考え方だなと思いました。

もっと研究が進んで、やり抜く力を効果的に育成する方法論が確立されるといいんですけどね。

*1:というより自己啓発書?

プログラムの学習をしていて最近行った、ほんのちょっとした貢献

久し振りの雑文。

久し振りにOCamlの学習を再開しようとReal World OCaml 2nd Editionのサイトを見ようと思ったら、ある日突然該当サイトが見られなくなっていました。

Real World OCaml

スクリーンショットとか取ってないので証拠とかないんですが、この時該当サイトのSSL証明書の期限が切れていたので、Chromeでアクセスしたら「見られないよ!」と表示されてしまい、思わずTwitterにこんなことを書きました。

すると、Twitterでこんなリプライが来ました。

(日本で)OCamlを学習していたら絶対に記事を読んでいたり存在を見ているはずのcamloebaさんからこういうリプライが来たので「おお?!」と驚き*1ながらも、「たしかに愚痴っててもしょうがないし、連絡するのが真っ当だよな」と思ったので、早速Twitterで連絡。

Twitterで連絡がいいのかは分からなかったけれど、面倒でやらなくなるよりマシという精神で行いました。

しばらくして、著者の方から返事が来ました。

cronの設定が間違っていたとのこと。

余談ですが、「というかcronでrenewalの設定してると言うことは、SSL証明書にLet's Encrypt使ってるのか?」と思って確認してみたら予想通りLet's Encryptでした。

しばらく経った後サイトを確認したらSSL証明書の期限がちゃんと未来の日付になっていて有効になっていて、サイトも見られるようになったので念のために返信で報告。

すると、こういう返信をもらいました。

polymorphic variantの理解がまだ不十分でChapter6をそこそこにChapter7のError Handlingにやっと進めたというくらいの進捗ですが、ゆるゆるとやっていこうかと思います。

OCamlをやりつつ、ReasonMLの動向も目端に入れてやっていくつもりですね。

*1:実はcamloebaさんからリプライされたのはこれで2度目なんですが、それでも驚きました。別にフォローされているわけでもないので。