done is better than perfect

自分が学んだことや、作成したプログラムの記事を書きます。すべての記載は他に定める場合を除き個人的なものです。

2016年のやりたいこと・やらないことリスト

あけましておめでとうございます。

今年は大晦日に何かしら「できた!」という感想を持てる年にしたいので、ブログにしておきます。 この記事は後から更新もします。

やることリスト

  1. 何かしらのOSSにコントリビュート
  2. ディープラーニング勉強
    • 後述する本を読んで、自分で実装
  3. ネットワークスペシャリスト合格
  4. TOEFL勉強
    • 目標は2回受験し、90点を目標

やらないことリスト

  1. FX
    • 苦い思い出が・・・
  2. 先物取引
    • 最近本業がおろそかになっている気がするので、自粛
  3. ネットサーフィン
    • せめて時間を決めてやりましょうね・・・

読みたい本リスト

2016年大晦日に振り返りたいですね。

今年もどうぞ宜しくお願い致します。

CentOS 6.5から7.2にアップデートした時のメモ

色々あって、VPS上で標題のことを行ってみました。すんなりいけるかとおもいきや結構ハマる。まあ自業自得ですが。

  1. CentOS 6.5のアップデート まずは7.2にアップグレードする前に、CentOS 6.5を最新のバージョンにしておきます。
# yum -y update
  1. /etc/yum.repo.d/CentOS-Base.repoを編集 下記を追加
[upg]
name=CentOS-$releasever - Upgrade Tool
baseurl=http://dev.centos.org/centos/6/upg/x86_64/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

念のため、上記編集後以下のコマンドを実行

# yum clean all
  1. 必要なものをインストール
# yum install -y openscap pcre-devel libxml2-devel libxslt-devel m2crypto python-simplejson mod_wsgi redhat-upgrade-tool preupgrade-assistant-contents
  1. アップグレード前のチェック
# preupg --list
# preupg -s CentOS6_7
  1. rpmのkeyを追加
# rpm --import http://ftp.plusline.de/centos/7/os/x86_64/RPM-GPG-KEY-CentOS-7
  1. アップグレード
# redhat-upgrade-tool-cli --network 7.0 --instrepo http://mirror.centos.org/centos/7/os/x86_64/ --force

上記までの手順で無事CentOS 7.2にすることができました。7.0だと思ってたけど一気に7.2まで。

で、アップグレード後におもむろにyum -y updateすると・・・

...
Error: Package: python-pillow-2.0.0-19.gitd1c6db8.el7.x86_64 (installed)
           Requires: libwebp.so.4()(64bit)
           Removing: libwebp-0.3.0-3.el7.x86_64 (installed)
               libwebp.so.4()(64bit)
           Updated By: libwebp-0.4.3-3.el6.x86_64 (epel)
              ~libwebp.so.5()(64bit)
 You could try using --skip-broken to work around the problem
** Found 26 pre-existing rpmdb problem(s), 'yum check' output follows:
10:centos-release-SCL-6-5.el6.centos.x86_64 has missing requires of centos-release = ('0', '6', None)
10:centos-release-cr-6-0.el6.centos.x86_64 has missing requires of centos-release = ('0', '6', None)
cloog-ppl-0.15.7-1.2.el6.x86_64 has missing requires of libgmp.so.3()(64bit)
grep-2.20-3.el6_7.1.x86_64 has missing requires of libpcre.so.0()(64bit)
libgcj-4.4.7-16.el6.x86_64 has missing requires of libgmp.so.3()(64bit)
mosh-1.2.4-1.el6.x86_64 has missing requires of libprotobuf.so.6()(64bit)
ppl-0.10.2-11.el6.x86_64 has missing requires of libgmp.so.3()(64bit)
python-argparse-1.2.1-2.1.el6.noarch has missing requires of python(abi) = ('0', '2.6', None)
python-boto-2.38.0-1.el6.noarch has missing requires of python(abi) = ('0', '2.6', None)
python-cheetah-2.4.1-1.el6.x86_64 has missing requires of libpython2.6.so.1.0()(64bit)
python-cheetah-2.4.1-1.el6.x86_64 has missing requires of python(abi) = ('0', '2.6', None)
python-iwlib-0.1-1.2.el6.x86_64 has missing requires of libpython2.6.so.1.0()(64bit)
python-iwlib-0.1-1.2.el6.x86_64 has missing requires of python(abi) = ('0', '2.6', None)
python-jsonpatch-1.2-2.el6.centos.noarch has missing requires of python(abi) = ('0', '2.6', None)
python-markdown-2.0.1-3.1.el6.noarch has missing requires of python(abi) = ('0', '2.6', None)
python-ordereddict-1.1-2.el6.noarch has missing requires of python(abi) = ('0', '2.6', None)
python-prettytable-0.7.2-1.el6.centos.noarch has missing requires of python(abi) = ('0', '2.6', None)
python-requests-2.6.0-3.el6.noarch has missing requires of python(abi) = ('0', '2.6', None)
python-rsa-3.1.1-5.el6.noarch has missing requires of python(abi) = ('0', '2.6', None)
python-simplejson-2.0.9-3.1.el6.x86_64 has missing requires of libpython2.6.so.1.0()(64bit)
python-simplejson-2.0.9-3.1.el6.x86_64 has missing requires of python(abi) = ('0', '2.6', None)
1:readahead-1.5.6-2.el6.x86_64 has missing requires of upstart
1:redhat-upgrade-tool-0.7.22-3.el6.centos.noarch has missing requires of preupgrade-assistant >= ('0', '1.0.2', '4')
1:redhat-upgrade-tool-0.7.22-3.el6.centos.noarch has missing requires of python(abi) = ('0', '2.6', None)
satyr-0.16-2.el6.x86_64 has missing requires of librpm.so.1()(64bit)
2:vim-enhanced-7.4.629-5.el6.x86_64 has missing requires of perl(:MODULE_COMPAT_5.10.1)

オーノー・・・

問題は、epel-releaseが古いままであったことにありました。以下のように、CentOS7で改めてepel-releaseをインストールしましょう。

# yum -y install epel-release

参考URL

「フラッシュボーイズ」を読んだ

「フラッシュボーイズ・10億分の1秒の男たち」(マイケル・ルイス著)を読んだ。前評判通りとても興味深い内容が多く楽しめました(若干訳が読みづらい箇所がありましたが)。

HFT(High Frequency Trade)のことを扱った本で、一般の投資家は意識することもないような取引所の物理的距離によって生じる数マイクロ秒の差を活かしたフロントランニングについて 詳細に書かれています。

数マイクロ秒の利を得るために、限りなく直線となるように引いたファイバーの利用権が高値で取引されたり、株式取引所のシステムサーバーにより近く自社のサーバーを置くために大金を積んだりと、もはや喜劇的だとすら思えました。

かつて証券会社の人に「証券会社が存在する意義とは?」と聞いた際には、「市場に流動性をもたらすため」みたいな話をされていたような気がしますが、上記のことも流動性と言えるんですかね。

また、本の中にはゴールドマン・サックスに勤めていた天才プログラマーSergey Aleynikovの話も出てきました。Sergey Aleynikovは、GSの古いシステムを継ぎ接ぎするように改修する仕事をしていたといった話が書いてあり、身につまされる様な感じを覚えましたね・・・

また、GSのサーバーにあるものはたとえOSSでもGSのものであるとGSは考えているといった話は面白かったです。OSSという考えがとても普及してきたと感じる今日このごろですし、件のGSですらGitHubにアカウントを持っている時代ですが、そんな時代もあったんですね。日本の企業でも結構ありそうな話だと思いました。

GSに行った先輩の話では、今のGSはJVMの実装にすら意見をいうほどにコンピュータに対して真剣に考えているそうです。日本企業もそれくらいになってほしい・・・

ともかく、「フラッシュボーイズ」は株取引とコンピュータに興味が有るような人にはとても楽しめる本でした。

CentOS x 2 on VMware ESXi on VMware Player on Windows 10

上記環境で、取り敢えずCentOS間でのネットワーク疎通ができたのでメモ。

とにかく、

VMware ESXi(ホスト)からCentOS(ゲスト)にSSHしようとしてはならない。

VMware ESXi(ホスト)からCentOS(ゲスト)にSSHしようとしてはならない。

大事なことなので2回言いました。 まあ、そもそもそんなことする必要ないと思うんですけどね。必要ないってことに気づくのに時間かかって僕がアホでしたというお話です。

スクリーンショット等は省略します。というか必要ないくらい簡単でしたので、ひたすら箇条書します。

  1. VMware ESXiのISOとCentOS のISOを用意
  2. VMware Playerの新しい仮想マシンを作成で、まずはVMware ESXiをインストール
  3. VMware ESXiを起動して、諸手続きを済ませる
  4. 画面のどこかにIPアドレスが書かれているので、Windows 10上のWebブラウザからアクセス。証明書のエラーが出るかも知れないが気にしない
  5. VMware vSphere Clientをダウンロード。Windows 10にインストール
  6. VMware vSphere Clientを起動して、先ほどのIPアドレスとアカウント名にroot, ESXiのインストール時に設定したパスワードを入れログイン
  7. Client上で仮想マシンを2つ作る。諸手続きを済ませ、起動した際にWindows 10上にあるCentOSのISOイメージを指定できるのでマジ便利
  8. CentOS仮想マシンが出来上がる。CentOSにログインしてからはdhclientコマンドを使用しないとIPアドレスが取得できないので注意
  9. 2つ作った仮想マシンの、片方から他方にpingなりsshなりする

ちなみに、デフォルトの仮想スイッチ以外にもう一つ作った場合は、なぜか仮想マシンに払い出されるIPアドレスIPv6となる。なんでだろう。たぶんどこかで設定し忘れている気がするけど、もう疲れた

rm -fをした場合のexit-statusについて

bashにおいて、rmコマンドを使った場合のexit statusについてです。初歩的なことだとは思いますが、自分への備忘録。

結論を先に書くと、rm $PATH_TO_FILEをした時に$PATH_TO_FILEが元々存在しない場合、-fオプションがない場合はexit statusが1となり、-fオプションがある場合は0となるので気をつけましょうということです。

~/dev/tmp$ ls                                                                                   
~/dev/tmp$ rm testfile                                                                          
rm cannot remove ‘testfile’ No such file or directory                                           
~/dev/tmp$ echo $?                                                                              
1                                                                                               
~/dev/tmp$ rm -f testfile                                                                       
~/dev/tmp$ echo $?                                                                              
0

ちなみに、permission deniedなど他のエラーに関してはオプション関係なくexit statusは1になるっぽいです。

~/dev/tmp$ rm testdir/                                                                          
rm: cannot remove ‘testdir/’: Is a directory                                                    
~/dev/tmp$ echo $?                                                                              
1                                                                                               
~/dev/tmp$ rm -f testdir/                                                                       
rm: cannot remove ‘testdir/’: Is a directory                                                    
~/dev/tmp$ echo $?                                                                              
1                                                                                               
~/dev/tmp$ rm /initrd.img                                                                       
rm: cannot remove ‘/initrd.img’: Permission denied                                              
~/dev/tmp$ echo $?                                                                              
1                                                                                               
~/dev/tmp$ rm -f /initrd.img                                                                    
rm: cannot remove ‘/initrd.img’: Permission denied                                              
~/dev/tmp$ echo $?                                                                              
1

Sparkのaggregateが謎すぎたのでメモ

謎っていうのは自分にとってというだけなのであしからず。

初めてのSpark読んでて、aggregate関数なるものが説明読んでもよくわからなかったので、備忘録として今の自分の理解を書いておきます。

あまり良く調べていないので、間違っている可能性大です。後で調べてて間違っていたら追記します。

nums = sc.parallelize([1,2,3,4,5,6,7,8,9,10])
sumCount = nums.aggregate((0, 0),
                            (lambda acc, value: (acc[0] + value, acc[1] + 1)),
                            (lambda acc1, acc2: (acc1[0] + acc2[1], acc1[1] + acc2[1])))
avg = sumCount[0] / float(sumCount[1])

これで、avgには1 - 10までの平均が入っているという寸法です。

今の自分の理解としては、

  • 最初のlambda([0+1, 0+1], [0+2, 0+1], ... , [0+10, 0+1])みたいな変換が行われる
  • 続くlambdaで先に変換したRDDに対してreduceする

といったイメージです。間違っていたら誰かおしえて・・・

自分をよく見せたい欲求

ポエムです.落ちもないです.

新入社員なのですが,最近とある仕事を任せてもらえました.自分で得意ですと公言していた分野の仕事で,喜び勇んでとりかかったはいいものの,失敗してしまいました,

結局その日に行った作業は全てパーで,一からまたやり直さなければいけませんでした.得意ですとか公言していた自分のメンツは丸つぶれ・・・

その仕事を任せてくれた先輩のなんとも言えない顔は今でも忘れられないです.怒るでもなく呆れるでもなく・・・お前今まで何してきたの?ってな感じでした.

本当ならこの反省を次に活かせばいい!みたいな感じにすべきなんでしょうが,やはりいつまでも感情を引きずります.

ホントこれまでやってきたことはなんだったんだろう?

先輩に使えないゴミだと思われてるのでは?

特異だと思っていたことすら全く満足にできなくて生きてる価値あるんだろうか?少なくともここでやっていけるんだろうか?

いや本当に,仕事ではこれが特徴的な例ですが,事務的な作業とかでもそうです.なんか何をやってもできた感じがしないし,自分よりできる人間が山ほどいるし.大学の時からそんなことをたまに思っていましたが,未だに思います.いっそ開き直って自分は無価値なゴミだからゴミらしく生きようとか思えればいいのでしょうが,心の何処かでもの凄く活躍してなんでいうことを諦めきれない自分が・・・

結局,自分を良く見せようと必死なんだろうけど,どうしてもそういう生き方しかできない.なんでだろう.どうすればいいのだろうか.