何かを書き留める何か

数学や読んだ本について書く何かです。最近は社会人として生き残りの術を学ぶ日々です。

Curriculum Vitae of XaroCydeykn

Curriculum Vitaeと呼ぶには何かが欠けている気がするが気にしない。

技術書査読

2016年

2017年

2018年

2019年

外部発表

2016年

  • PyConJP で感じる私の成長」PyCon JP 2016 Day1 Lightning Talk

受付後にLTの募集枠が空いていたので深く考えずに登録した。 卒論・修論発表で培った(?)勢い重視の発表で中身の薄さを乗り越えた。 最初のPyCon JPは怖い、という話はある程度共感を得たようである。

2017年

当初は話を聞くだけのつもりであったが、Python 3.6の新機能を調べるうちにメタクラスの部分の置き換えができることに気づいたので発表した。

中身のない概要から如何に内容を絞り出すか、と苦戦した発表。 技術書に書かれていることだけでは難しく、実践を伴わないと意味のある発表にするのが難しい。

  • Respect the Built-in Names」PyCon JP 2017 Day1 Lightning Talk

Reject Conから評判の良かった内容を抽出して膨らませたLT。 意外と琴線に触れる内容だったらしく、アンサーLTまで登場した。

  • 技術書査読・校正の現場から」BPStudy #123 Lightning Talk

間違い探しLT。 筆者も意外といい加減なことを書いているのでそれを検証しつつなんとかするのが査読や校正の役割である。

2018年

  • レガシーDjangoアプリケーションの現代化」DjangoCongress JP 2018

2017年8月から参画したプロジェクトの経験を元に架空のプロジェクトという見立てを用いて話を作った。

  • SymPyによる数式処理」PyCon JP 2018

SymPyで学んだことを整理するために発表した。

『PythonによるWebスクレイピング 第2版』の査読を担当しました

Python 3対応&日本語版向けアップデート

2019年3月26日にオライリージャパンから『Web Scraping with Python, 2nd Edition』の邦訳『PythonによるWebスクレイピング 第2版』が発売される。 この度、邦訳の査読者として参加させていただいた。 オライリーの方から話があったのは2019年1月中旬であった。

www.oreilly.co.jp

これは2016年3月に発売された『PythonによるWebスクレイピング』の改訂版である。 第2版からはPython 3のみ対応となり、初版時には過渡期だったScrapyに関して1章を割り当てるなど技術の進歩に応じてアップデートされている。 また、原著でPhantomJSが使われている箇所があったが、技術監修者、翻訳者、原著者の調整の元、Chromeのヘッドレスモードを使う様に書き換えられるなど原著を読んでしまった人でも楽しめる(原著にも反映される予定)。 一方、初版にあったPython入門やWeb入門といった内容は削除されてしまったので、全くの初心者の場合は別の本を援用する必要がある。

2010年代前半に出ていたPython本が改訂される時期がやってきた。 Pythonで目立つのはPython 3対応、3専用であるが、それ以外にも細かなアップデートが存在するので日々怠らずに自分の知識もアップデートして行きたいと思う次第である。

Pythonの文字列メソッドの罠

うわあ...これはUnicodeですね。

業務で、「与えられた文字列が半角英数で構成されているかを判定したい」という場面に遭遇した。 これはユーザーに何かを入力させる際にその文字列が想定しているものなのかを調べるケースの典型例である。 Pythonの場合、正規表現を書くまでもなく文字列のメソッドで判定ができる、と思っていた。 次のようなユニットテストを書いていた。

import unittest

class UtilsTest(unittest.TestCase):

    def test_is_alphanumeric(self):
        """与えられた文字列が半角英数で構成されているか"""
        cases_is_ok = ("12334567890", "abcxyz", "ABCXYZ", "abc123XYZ")
        cases_is_ng = ("3.141592653589793", "たまげたなあ", "0120ー022−022", "0790-62-0110")
        for case in cases_is_ok:
            with self.subTest(case=case):
                self.assertTrue(case.isalnum())
        for case in cases_is_ng:
            with self.subTest(case=case):
                self.assertFalse(case.isalnum())

余裕で通ると思っていたユニットテストに失敗してしまった。どうしてだろうか。

いつから「半角英数」の「英」がアルファベットだと勘違いしていた...?

まずは、str.isalnum()ドキュメントを調べてみよう。

str.isalnum() 文字列中の全ての文字が英数字で、かつ 1 文字以上あるなら真を、そうでなければ偽を返します。文字 c は以下のいずれかが True を返せば英数字です: c.isalpha() 、 c.isdecimal() 、 c.isdigit() 、 c.isnumeric() 。

なるほど。あやしいと踏んだstr.isalpha()ドキュメントを調べる。

文字列中の全ての文字が英字で、かつ 1 文字以上あるなら真を、そうでなければ偽を返します。英字は、Unicode 文字データベースで "Letter" として定義されているもので、すなわち、一般カテゴリプロパティ "Lm"、 "Lt"、 "Lu"、 "Ll"、 "Lo" のいずれかをもつものです。なお、これは Unicode 標準で定義されている "Alphabetic" プロパティとは異なるものです。

なんということだ、str.isalpha()の英字とはUnicode 文字データベースで "Letter" として定義されているものなのか。

>>> import unicodedata
>>> unicodedata.category("た")
'Lo'

ひらがなは "Lo" 、つまりLetterでOther Letterのカテゴリに属しているようである。 たまげたなあ。

対策

1つは正規表現を書くことである。

>>> import re
>>> re.match(r"^[0-9A-Za-z]+$", "たまげたなあ") is None
True

Python 3.7以降はstr.isascii() メソッドが追加されているので援用できる。

>>> "たまげたなあ".isalnum() and "たまげたなあ".isascii()
False

Unicodeに強くなりましょう。

『アジャイルイントロダクション』を読んだ。

アジャイル開発の利点・誇張・難点

近代科学社から発売されているトップエスイーシリーズの入門講座の2分冊目である『アジャイルイントロダクション Agile開発の光と影』を読んだ。

www.kindaikagaku.co.jp

www.kinokuniya.co.jp

Twitterで見かけたのがきっかけである。 最初はそこまで気にしていなかったが筆者がオブジェクト指向プログラミングの本で有名なBertrand Meyerであることに気づいた。 面白そうな予感がしたので購入してみた。

原著のタイトルは『Agile! The Good, the Hype and the Ugly』と(監修者も認識しているが)「光と影」よりも細かい。 原著の表紙の方がオシャレで好きなのだが、トップエスイーシリーズで表紙を揃える必要があるので仕方がないか。

www.springer.com

原著はSpringerであり、まともに原著を買おうとすると5000円近くするので邦訳の方が1000円程度安く、かつ簡単に入手できる。

内容は、端的に言えば従来のソフトウェア工学の観点からアジャイル開発と呼ばれる手法を冷静に分析したもの、である。 その分析の結果としての利点・誇張・難点のカテゴリに分類している。 具体的に何が難点なのか、などをずらずら書くと読む楽しみがなくなってしまうので詳細は避けるが、アジャイル開発の事前のドキュメント作成軽視を批判的に扱っているなど、 アジャイル開発信奉者ではない、けれどもアジャイルを深く研究した筆者の冷静な分析は是非読んでみてほしい。 アジャイル開発を宣伝する本はたくさん存在するが、学術的な側面から分析した本(特に、日本語で書かれているもの)は貴重である。

トップエスイーやらトップエスイーシリーズが何者なのかよくわかっていないが、トップエスイーシリーズの他の分冊の評判が知りたい。