hokkun blog

技術の話をメインに、たまに糖質制限の話とか色々したい予定。

数学図鑑〜やりなおしの高校数学〜 第一章・第二章

数学図鑑〜やりなおしの高校数学〜を買った - hokkun blogで書いた高校数学の本をやり始めたので、自分用の復習や感想をざっとまとめておきたいと思う。

数学図鑑: やりなおしの高校数学

数学図鑑: やりなおしの高校数学

第一章 - 集合と論理(数I)

一章は高校数学以降の基本となる集合・論理・証明法などを取り扱っている。数学的帰納法とかは出てこなかったけど、後で触れるんだろうか。 このあたりは今でもなんとなく頭のなかで触れることが多い分野なので、あーこれ忘れてたわーみたいなのはあまりなかった印象。 ちょっと気になるのは解説の部分で取り上げられている例が少しわかりにくい。例えば背理法の例で、「有史以降未来から来た人がいるという記録はないので、タイムマシーンは未来永劫作られない」みたいなのがあるけど、正直「記録はない」とかもしかしたら未来では記録が残らないようにしているのかもしれないし、過去ではなく未来にしか行けないタイムマシーンができているかもしれない。もう少しイメージしやすい例を取り上げてほしかった。

第二章 - 場合の数と確率(数A)

  • 2.1 場合の数
  • 2.2 確率の基礎
  • 2.3 和事象の確率と確率の加法定理
  • 2.4 反復試行の確率
  • 2.5 条件付き確率

こちらは機械学習を学ぶ上で必須となる統計に関する知識の更に前提である確率に関する章。順列、重複順列、組み合わせ、重複組み合わせの話題から始まり、条件付き確率・ベイズの定理までを扱う。基本的に高校数学で扱うのは離散確率分布である。場合の数の部分の問題を解くテクニック、久々に思い出した。。例えば、

A~D のアルファベットを並べ替える。AとDが並び合う場合は何通りあるか?

という問題を考える。この場合、ADをひとつの組として、3種の文字の並べ替え問題に置き換え、その後ADの順番を考えて2倍する。(正解は{ \displaystyle 3! * 2 = 12} 通り。)

上記の設定で、D が C より左にある場合は何通りあるか?

という場合は、一旦 D と C を例外ケース X として、4つの文字の置かれうる場所から X の置く場所を2つ選ぶと、 { \displaystyle {}_4 C_2 = 6 } 通り。さらに残りの2箇所の A, B の順列は { \displaystyle 2! = 2} 通りなので、合わせて12通り。最後に X を D と C に戻すが、D は常に必ず C より左なので 60 通りの A, B, X, X の順列に対して一つの D, C の置き方が対応するので、 { \displaystyle 12 * 1 = 12} 通り。

こういったテクニックは久々に見ると懐かしさを感じられた。

こちらもたまに例が気になる。順列の例で3人のチームからリーダーとサブリーダーを選ぶ場合が取り上げられているが、「選ぶ」という行為を順列の例にするのは最初としてはどうだろう。。組み合わせとの対比を意識されているのかもしれないが、少しわかりにくいなあと思った。

数学図鑑〜やりなおしの高校数学〜を買った

数学図鑑: やりなおしの高校数学

数学図鑑: やりなおしの高校数学

こいつを買いました。きっかけは前も書いたとおり機械学習をしっかり学び直す上で、まずは高校数学と大学数学を復習したいということで。 目次は以下の通り。

  • 第1章 集合と論理(数I )
  • 第2章 場合の数と確率(数A)
  • 第3章 関数(数I 、数II)
  • 第4章 微分積分(数II、数III)
  • 第5章 数列(数B)
  • 第6章 ベクトル(数B)&行列(旧数C)
  • 補章 複素数平面(数III)
  • 大学入試の問題に挑戦!

最後に練習問題(東大・京大の問題もある)があるようなので、読み進める→問題解く→読み進める→問題解く・・のほうがよさそうなので一旦「集合と論理」からそのつもりで進めようと思う。

趣味のウェブアプリも進めたいので、まずは2月末を目標に読み終わりたい。一章ごとに書くことがあればブログ書こうと思う。


2018-03-10 追記

2018-03-01 に読了しました。感想等などのまとめは以下の記事を参照。

数学図鑑〜やりなおしの高校数学〜 第一章・第二章 - hokkun blog

数学図鑑〜やりなおしの高校数学〜 第三章・第四章 - hokkun blog

数学図鑑〜やりなおしの高校数学〜 第五章・第六章 - hokkun blog

数学図鑑〜やりなおしの高校数学〜 補章&すべての感想 - hokkun blog

2018年上半期の目標とこのブログの使いみちについて

あけましておめでとうございます。 2018年ですね。今年の上半期の目標をなんとなく書いてみます。

  • 高校数学〜大学数学を勉強する
    • 去年、ICLR2017読み会 - connpassに参加するとかして機械学習も少しずつ勉強しとこうと思ったんですが、正直久々過ぎて基礎がなってなかったのでまず高校数学にまで戻ることにしました。今使う参考書を選定中。
  • 去年末から作り始めちょっとしたウェブアプリを完成させる
    • まあいうてもふたつのウェブサービスをくっつけるだけなんですけど、一旦完成させることが大事かなと。
  • 仮想通貨の技術的側面についてもう少し勉強しとく
    • これからはエンジニアも Fin Tech だったり仮想通貨関連だったりの職が増えそうなのでそのあたりも見据えて。去年もブロックチェーン回り勉強したけど半端だったので・・。まあしかし上記二つ優先で行きたいと思います。目標だけでかくても達成できなかったときの無力感につながるから・・

ところで、このブログ作って以降だいぶ放置だったんですが、Qiitaにはいくつか記事を投稿してました。 スポットぽい技術記事はこういう個人ブログより Qiita のほうが相性が良さそうなのでそっちに投げてました。

なので、今後は

  • 日記っぽい進捗メモ
  • Qiita に投稿した記事のまとめ

とか Qiita にあんまそぐわない感じの記事をかけるようにしたいです。あと書評とか。 それこそ、

インフラエンジニアの教科書

インフラエンジニアの教科書

インフラエンジニアの教科書2 スキルアップに効く技術と知識

インフラエンジニアの教科書2 スキルアップに効く技術と知識

あたりは読んだのでもう一度さらって記事書きたいところ。

「絵で見てわかるシステムパフォーマンスの仕組み」(翔泳社)ざっと読んだ

会社に入って職業エンジニアとして飯を食ってきて、アプリケーションロジックや、アーキテクチャのことについて少しずつ詳しくなってきた(と思う)。しかし、パフォーマンス関連の話題がどうしても網羅的な知識が足りない気がしていて、いい感じの本がないか探していたところ、表題の書籍が見つかったのでまずはざっと読んだ。

絵で見てわかるシステムパフォーマンスの仕組み

絵で見てわかるシステムパフォーマンスの仕組み

一章は簡単にアルゴリズムの話題。情報科学専攻でエンジニアになった人にとってはすこし簡単すぎる説明かも知れないが、逆に言うとこれだけでも知っておくと役立つ現場もある、ということを知れていいかも。

二章、三章はパフォーマンス分析について Linux コマンドなどの実践的な内容も含めて紹介されてる。筆者の性格なのか、無理やり目でもフォーマットを揃えていろんな話題を論じようとしているのが見えるが、僕には割と合っていたのでよかった。四章は前章までの基礎知識を基に、チューニングにおける定石等をまとめている。ここはたまにちらっと目を通して振り返る感じにしたらよさそう。実際のチューニング例などもある。

五章はパフォーマンステストに関して。ここは少し難しくて、実は僕が一番知りたいのはこのあたりだったのだが、ウォータフォール型における開発工程とその中におけるパフォーマンステストのあり方等を詳細に書いてあって、少し自分の置かれている状況にはマッチしなかった。大規模な受注開発とかだとあそこまで役割分担するのだろうか?

六章・七章はそれぞれ仮想化環境・クラウド環境におけるパフォーマンスチューニングについて。さすがに少し自分の(今の)技術的・立場的な意味で少しオーバースペックな内容だったので、ふーんといいながらかなり流して読んだ。仮想化環境における CPU /メモリのオーバーコミットの説明とかは勉強になった。

今後、実際に手を動かしながら、二〜四章をもう少し何度か参照することになるだろう。

実は、会社で JVM のチューニングで有名な↓の本も買ってもらって何度か呼んでいるが、基礎知識が足りないのか理解度が半分くらいな気がする。先輩に頼って勉強会でもしようかしら。。

Javaパフォーマンス

Javaパフォーマンス

tkinter と functools.partial()

就職活動のときに買った パーフェクトPython | Pythonサポーターズ | 工学 | Kindleストア | Amazon を最近改めて通読し始めた。一応大学生までは Python をメインで書いていたので、9章の言語仕様の部分まではサラッと流した。ただ、正直ジェネレータとかデコレータとか、無理やり他の方法でやればできてしまうあたりについては実践的な経験がないので、今後苦労しそうだ。折に触れて読み返そうと思う。そして、11章の実践開発:チャットアプリケーションの章で少しハマったので残しておく。

tkinter を利用した GUI アプリケーションの開発の部分で、tkinter のメインループを回すメソッドである、tkinter.mainloop() に対してフックをしてasyncoreのループを回す部分で、tkinter のバージョンが変わってエラーが発生する。サンプルコード(サポートページ:パーフェクトPython:|技術評論社より)を一部引用する。

def idle_task(root):
    try:
        asyncore.loop(count=1, timeout=1)
    finally:
        root.after(200, functools.partial(idle_task, root))

def main():
    root = tkinter.Tk()
    root.after(200, functools.partial(idle_task, root))
    ...
    root.mainloop()

こちらの functools.partial() は __name__ 属性をデフォルトで持たないが(これはもともと)、いつの変更からか(おそらく Python 3.4.x あたりだということらしい。こちら参照)root.after()がそれを参照してしまう。

# tkinter.__init__.py 一部省略
def after(self, ms, func=None, *args):
        if not func:
            self.tk.call('after', ms)
        else:
            def callit():
                try:
                    func(*args)
                finally:
                    try:
                        self.deletecommand(name)
                    except TclError:
                        pass
            callit.__name__ = func.__name__ # ここで死ぬ
            name = self._register(callit)
            return self.tk.call('after', ms, name)

なので、サンプルコードそのままでは動かなくて、何らかの方法で __name__ 属性を与え(?)なくてはならない。 そもそも、ここではコールバックを渡すことを目標にしているわけなので、上記で引用した回答にあるように、ラムダ式を使う手もある。ただ、partial で作った高階関数も、そのまま元の関数の属性をコピーするのが自然と考えるのなら、functools.update_wrapperを使うのが自然かなと思う。元のサンプルコードを変更すれば、

def idle_task(root):
    try:
        asyncore.loop(count=1, timeout=1)
    finally:
        wrapped_func = functools.partial(idle_task, root)
        functools.update_wrapper(wrapped_func, idle_task)
        root.after(200, wrapped_func)

# main() 側も当然変更する

となる。こうすると、__name__ 属性や __doc__ 属性がもともとの関数からコピーされる形になる。

久しぶりに技術記事っぽいの書いたけど、やっぱブログ続けられる人ってすごい。。結構骨だな。

技術ブログを新しくした

こんにちは hokkun です。学生の時はDevelopmental Mentalという tumblr ブログにちょこちょこ技術的なことを書いてたんだけど、技術じゃない内容もあったので移行してみる。 はてブは使ってたけど、はてなブログは初めてなので徐々に慣れていきたい。

仕事も二年目に入って、少し技術的な振り返りでもしようかと思う。 業務では Java 使ってサーバ書いていて、技術スタックとしては

あたりに触れて仕事してた。もしかすると Spark を下期から使い始めるかもしれない。Scala を勉強したかったのでそれと合わせて都合がいい。 フロントをいじることもあって、社内 CMS や簡単な SPA を作っていた。

  • フロント
    • React

あと瑣末なもので言うと、Lazybonesというプロジェクト生成ツールを試して、会社のブログで紹介したりもした。 あと会社では、DevOps にも興味を持って、Ansible の導入を探ったりなどしている。これはある程度まとまったら記事にしたい。 会社に入ったばかりのときは、まずは技術的な裾野を広げたいと思っていたんだけど、今は上司に言われたこともあって得意な分野を作りたいなあなどと思っている。それにあたって、最近は

kafka-apache-jp.connpass.com

こんなのに出たりとかして、自分の興味を探っている。Kafka や HBase といった Java ベースのミドルウェアにもっと詳しくなりたい。あと HBase でいうと Hadoop つながりで Hive とか Impala とか。 正直使うだけならどれも簡単(こう言ってるの、去年の自分が聞いたら驚くだろうか。。)なので、もう一個踏み込みたいなという気もしている。

また、昨年ひっそりと立てた目標の一つに、自分で一つ Web サービスを構築する、という目標を立てたのだが、アイデアがないのと、少々他のタスクで忙しく達成できていない。 できれば11月辺りからじわじわ動きたいと思っている。

今日はここまで。