今年の目標
明けましておめでとうございます。新年ということで自分なりの今年の目標をまとめてみました。
これが1年で達成できるとなかなか立派なプログラマーになれそうですねえ。
まあ、6割以上は達成できるようになりたいです。
アセンブリ言語をマスターする
よりハードウェアに近いことを理解しようと思うと常にアセンブラにぶつかるのでそろそろ身に付けたい。 リバースエンジニアリングにも興味がある。C/C++を実用レベルまで習得する
アセンブラに関連してC/C++で書かれたソースコードは多いし、基礎となる言語なので身に付けたい。モダンなWebサイトを作るのに必要な技術を身に付ける
JavaScriptのライブラリやCSSなどを使えるようになりたい。
Web界隈は非常に込み入っているイメージがあり、あまり手を付けたくなかったのだが、最近よく聞くElectronにはWeb技術が使われているようで、Webサイトに興味がなくても無視できない存在になっていると感じた。セキュリティについて勉強する(のに必要な知識を付ける)
先日、セキュリティ関連の本を読んだところ、アセンブラやデバッガ、Linuxカーネルの話題などがありついていけなかった。
幅広い知識が必要なのだと実感した。効率的にプログラムを開発できるようにする
すこし規模の大きなプログラムを作ろうとすると、設計が上手くいかなくなる。デザインパターンを勉強したい。 また、gitやIDEを使いこなせるようになりたい。機械学習、ディープラーニングについてアルゴリズムを理解し、実用できるようにする
取り敢えず、PRMLとコード主体の機会学習の本を読む。数学
まともに大学で数学を勉強できないので、しばらくは独学で頑張るしかない。英語
プログラミングには直接関係ないけど。TOEIC750点、TOEFL550点ぐらい取れるようになりたい。アプリ開発
自分で作ったアプリを公開してみたい。まずはUWPとAndroidで。
iOS用にも作ってみたいがiPhoneもMacもないから難しそう。(というか無理)
最近、Xamarinを始めようとしている。C#にも手を出すことになるとは...
TeXで数式をはてなブログに表示する
(初期設定がやや面倒ですが[tex:]記法ではなくこちらの方がおすすめです。 1/11追加) stronger.hatenablog.com
数学のお勉強をちゃんとしようと思い、(おそらく)このブログにも書いていくことにした。
そのためには数式を書く必要があるのでTeXの書式について調べてみた。
以下の数式は機械学習において有名な本「パターン認識と機械学習」(通称: PRML)に載っていたものです。
加法定理
乗法定理
ベイズの定理
正則化した誤差関数
[tex:TeXのコマンド]
で数式を表示する。
コマンド自体の使い方はhttp://www.latex-cmd.com/を参考にした。
\displaystyle
を使うことで分数や総和が見やすくなる
最後の数式の中括弧は\\{
とエスケープしないと表示されなかった(30分ぐらい悩んだ...)
恐らくMarkdown記法によるものではないかと思う。他のはてなブログでは表示されていたので。
(確認したところはてな記法では\{
のように1回だけエスケープが必要だった。 12/20)
他にも]
や_
などエスケープが必要なものがあります。うまく表示されないときは怪しい文字(MarkdownとTeXのメタ文字)をエスケープするといいかもしれません。
以下がソースです。繰り返しになりますが、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から入るといいかもしれない。
参考サイト
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から切断したところ使えたため、接続先のファイアーウォールで止められてしまったためと思われる。
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においてjavaはWindows形式でパスを書かないといけないらしい
% 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のコンテキストメニュー(右クリック)から開く
ググれば似たような記事はわんさか出てくるけどメモ代わりとして
- Cygwinを管理者権限で開く
- chereが入っていなければ
apt-cyg install chere
でインストール chere -ian -e "Cygwin" -t mintty -s zsh
と入力
-eオプションでコンテキストメニューで出てくるメッセージを決められる。 -tで開くターミナル、-sで開くシェルを指定できる。bashでいい人は-sオプションはいらない。
コンテキストメニューの表示を消したいときはchere -u
、設定を上書きするときは-fオプション。