hokkun blog

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

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

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

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

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

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

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

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

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月辺りからじわじわ動きたいと思っている。

今日はここまで。