hokkun blog

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

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

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

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

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

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

二章、三章はパフォーマンス分析について 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月辺りからじわじわ動きたいと思っている。

今日はここまで。