今年の目標

明けましておめでとうございます。新年ということで自分なりの今年の目標をまとめてみました。
これが1年で達成できるとなかなか立派なプログラマーになれそうですねえ。
まあ、6割以上は達成できるようになりたいです。

  1. アセンブリ言語をマスターする
    よりハードウェアに近いことを理解しようと思うと常にアセンブラにぶつかるのでそろそろ身に付けたい。 リバースエンジニアリングにも興味がある。

  2. C/C++を実用レベルまで習得する
    アセンブラに関連してC/C++で書かれたソースコードは多いし、基礎となる言語なので身に付けたい。

  3. ダンなWebサイトを作るのに必要な技術を身に付ける
    JavaScriptのライブラリやCSSなどを使えるようになりたい。
    Web界隈は非常に込み入っているイメージがあり、あまり手を付けたくなかったのだが、最近よく聞くElectronにはWeb技術が使われているようで、Webサイトに興味がなくても無視できない存在になっていると感じた。

  4. セキュリティについて勉強する(のに必要な知識を付ける)
    先日、セキュリティ関連の本を読んだところ、アセンブラやデバッガ、Linuxカーネルの話題などがありついていけなかった。
    幅広い知識が必要なのだと実感した。

  5. 効率的にプログラムを開発できるようにする
    すこし規模の大きなプログラムを作ろうとすると、設計が上手くいかなくなる。デザインパターンを勉強したい。 また、gitやIDEを使いこなせるようになりたい。

  6. 機械学習ディープラーニングについてアルゴリズムを理解し、実用できるようにする
    取り敢えず、PRMLとコード主体の機会学習の本を読む。

  7. 数学
    まともに大学で数学を勉強できないので、しばらくは独学で頑張るしかない。

  8. 英語
    プログラミングには直接関係ないけど。TOEIC750点、TOEFL550点ぐらい取れるようになりたい。

  9. アプリ開発
    自分で作ったアプリを公開してみたい。まずはUWPとAndroidで。
    iOS用にも作ってみたいがiPhoneMacもないから難しそう。(というか無理)
    最近、Xamarinを始めようとしている。C#にも手を出すことになるとは...

TeXで数式をはてなブログに表示する

(初期設定がやや面倒ですが[tex:]記法ではなくこちらの方がおすすめです。 1/11追加) stronger.hatenablog.com

数学のお勉強をちゃんとしようと思い、(おそらく)このブログにも書いていくことにした。

そのためには数式を書く必要があるのでTeXの書式について調べてみた。

以下の数式は機械学習において有名な本「パターン認識機械学習」(通称: PRML)に載っていたものです。

加法定理


\displaystyle p(X) = \sum_{Y} p(X, Y)

乗法定理


p(X, Y) = p(Y | X)p(X)

ベイズの定理


\displaystyle p(Y, X) = \frac{p(X | Y) p(Y)}{p(X)}

正則化した誤差関数


\displaystyle \tilde{E}(\mathrm{W}) = \frac{1}{2} \sum_{n = 1}^N \{ y(x_n, \mathrm{W}) - t_n\}^{2} + \frac{1}{2}||\mathrm{W}||^2

[tex:TeXのコマンド]で数式を表示する。

コマンド自体の使い方はhttp://www.latex-cmd.com/を参考にした。

\displaystyleを使うことで分数や総和が見やすくなる

最後の数式の中括弧は\\{とエスケープしないと表示されなかった(30分ぐらい悩んだ...)

恐らくMarkdown記法によるものではないかと思う。他のはてなブログでは表示されていたので。

(確認したところはてな記法では\{のように1回だけエスケープが必要だった。 12/20) 他にも]_などエスケープが必要なものがあります。うまく表示されないときは怪しい文字(MarkdownTeXのメタ文字)をエスケープするといいかもしれません。

以下がソースです。繰り返しになりますが、Markdownで書いています。

加法定理

[tex:
\displaystyle p(X) = \sum_{Y} p(X, Y)
]

乗法定理

[tex:
p(X, Y) = p(Y | X)p(X)
]

ベイズの定理

[tex:
\displaystyle p(Y, X) = \frac{p(X | Y) p(Y)}{p(X)}
]

正則化した誤差関数

[tex:
\displaystyle \tilde{E}(\mathrm{W}) = \frac{1}{2} \sum_{n = 1}^N \\{ y(x_n, \mathrm{W}) - t_n\\}^{2} + \frac{1}{2}||\mathrm{W}||^2
]

数学や機械学習の本を読むと難しい数式が出てきて、抵抗感があったのですが、TeXを使うことでより数式が身近なものに感じてきました。

プログラムは好きだけど数式は苦手という人はTeXから入るといいかもしれない。

参考サイト

www.latex-cmd.com

whoisコマンドについて

インストール方法

Windows

以下のリンクからファイルをダウウンロード、解凍し、exeファイルをパスの通っているディレクトリに置く。

https://technet.microsoft.com/ja-jp/sysinternals/whois.aspx

Linux(CentOSの場合)

yum install whoisではインストール出来ない

sudo yum install jwhois

使用方法

whois [ドメイン名]

注意

VPNに繋いで使おうとしたところWindowsでもLinuxでもwhoisコマンドが使えなかった。

VPNから切断したところ使えたため、接続先のファイアーウォールで止められてしまったためと思われる。

whoisコマンドはTCPの43番ポートを使う。

Pythonの辞書の要素を削除しようとするとdictionary changed size during iterationと言われた

辞書からある条件に一致する要素を削除しようと思い、下のようにすると

for key in dic.keys():
    dic.pop(key)

エラーが出てきました。

RuntimeError: dictionary changed size during iteration

こうすれば大丈夫です。

for key in list(dic):
    dic.pop(key)

forを使って辞書を操作する時は基本的にlist()を使った方がいいかもしれない

Cygwinでjarファイルを実行しようとしたらError: Unable to access jarfileとなった

Cygwinでjarファイルを実行しようとしたらGit Bashでは生じないエラーに見舞われた

% java -jar /cygdrive/c/jar/hoge.jar
Error: Unable to access jarfile /cygdrive/c/hoge.jar

ちゃんと指定したパスにファイルがあるはずなのにアクセスできないと言われる。

調べてみるとCygwinにおいてjavaWindows形式でパスを書かないといけないらしい

% java -jar c:/jar/hoge.jar

ってやったら上手くいった

ちなみに\(バックスラッシュ)でやろうとすると

% java -jar c:\\jar\\hoge.jar

このようにエスケープする必要があって非常に面倒くさい

Pythonのlambda(無名関数)について

lambdaって見た目からして難しそうですね、でも使えるこなせるようになってみたい

例えば引数を2乗する関数は普通に書くとこうなりますね

def foo(x):
    return x ** 2

print(foo(3))
# 9

lamdaを使うとこうなります

lam = lambda x: x ** 2

print(lam(3))
# 9

この場合ではfooとlamが等価になっていますね

つまり

lambda (引数): (戻り値)

で関数になるということです。

「関数になる」というのがよく分からない場合はPythonの対話型シェルを開いて次のコードを打ち込んでみると分かりやすい

>>> (lambda x: x ** 2)(3)
9

(lambda x: x ** 2)が普通の関数と同じように使えています。(3)が引数の部分ですね

次に条件分岐を加えてみます

print((lambda x: x ** 2 if x > 10 else 0)(3))
# 0

x >10ならばx ** 2を返しそうでなければ0を返すという意味です

これは条件演算子三項演算子と呼ばれ他にもいろいろな書き方がある

これを普通にやろうとすると

def foo(x):
    if x > 10:
        return x ** 2
    else:
        return 0

print(foo(3))

となってかなり面倒臭いです

1回しか使わないような細かい関数はdefしないでlamdaを使っていこう!

引数で関数を指定するときに使うことが多いらしいです

コードも見やすくなりそう

CygwinをExplorerのコンテキストメニュー(右クリック)から開く

ググれば似たような記事はわんさか出てくるけどメモ代わりとして

  1. Cygwinを管理者権限で開く
  2. chereが入っていなければapt-cyg install chereでインストール
  3. chere -ian -e "Cygwin" -t mintty -s zshと入力
    -eオプションでコンテキストメニューで出てくるメッセージを決められる。 -tで開くターミナル、-sで開くシェルを指定できる。bashでいい人は-sオプションはいらない。
    コンテキストメニューの表示を消したいときはchere -u、設定を上書きするときは-fオプション。

右クリックから開けるというだけでGit Bashを使っていたのですがこれでCygwinの利用頻度が上がりそうです。