nikkie-ftnextの日記

イベントレポートや読書メモを発信

イベントレポート | 年の瀬の多用な時期ではありますが #spzcolab のもくもく会にて Django 3系でDjango Girls Tutorialのコードが動くか確認してきました

はじめに

頑張れば、何かがあるって、信じてる。nikkieです。
年の瀬ではありますが、もくもく会に行ってきました。
手を動かして分かったことと、他の方の取り組みから知ったことをまとめます

勉強会の概要

【途中入退室可能】さぼらないようもくもく会【今年最後の日曜日】 - サポーターズCoLab

実家に帰る方もいらっしゃると思いますが、年末年始って意外と"暇"
今年最後の日曜日、一緒に自己研鑽しませんか?

Kaggleのタイタニックコンペハンズオンで何回か登壇させていただいたサポーターズCoLabさん。
年末年始の時期にももくもく会を開いていただきありがたい限りです。
家で過ごす日が続くとだらけがちなので、人の目がある場所で気合を入れてもくもくします。

取り組んだこと

Django Girls Tutorialのコード(Django 2.2.xを想定)がPython 3.8系、Django 3.0系で動くか確認する

動作環境

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.14.4
BuildVersion:   18E226
$ python -V  # venvモジュールで仮想環境を作っています
Python 3.8.1
$ django-admin --version
3.0.1

検証結果

ローカルではチュートリアルのコードから書き換えなくても動作しました!

f:id:nikkie-ftnext:20191229220427p:plain

ちなみに、チュートリアルで使っているBootstrapが3.2なので、3系の最新3.3.7を試しました。
Getting started · Bootstrap

調べたこと

.gitignoreの書き方が気になって

デプロイ! · Django Girls Tutorial.gitignore には

myvenv
/.vscode
/static

が出てきます。
先頭に / が付くか付かないかの違いですが、

  • /が付かないmyvenvの場合:.gitignoreのあるディレクトリの下のmyvenvの他、directory/myvenvも無視される
  • /が付く/.vscode/staticの場合:.gitignoreのあるディレクトリの下にある.vscodeやstaticだけが無視される

そうです1
確かにblog.cssのあるblog/static/css/は無視されていませんね。

Django URLs の裏の仕組みを少しだけ

URL ディスパッチャ | Django ドキュメント | Django

  • settings.ROOT_URLCONFでmysite/urls,pyが指定済み(ここだったのか)
  • mysite/urls,pyからurlpatternsという変数をDjangoが探す

includeについて
URL ディスパッチャ | Django ドキュメント | Django

ModelFormの instance 引数

編集する際には instance 引数に現在のインスタンスを渡しています(例:form = PostForm(request.POST, instance=post))。2

モデルからフォームを作成する | Django ドキュメント | Django

モデルのオブジェクトに付属したモデルフォームのインスタンスは、instance 属性を持ち、メソッドが特定のモデルのインスタンスにアクセスできるようにします。

編集するときは特定のインスタンスにアクセスする必要があるので使っているということですね。

他の方の取り組みから

Java, KotlinやRubyなど言語は多岐にわたっていました。

もくもくの背景:2月に静岡で話します!

今回のもくもくは2月の #pycon_shizu 向けDjangoトークの地歩固めの第一歩でした。

確認結果を踏まえて、Django 3.0.xで話を進められそうです。

このトークはWeb開発を知らない方を含めてAll向けとしています。
トークではDjangoのクイックツアーをやろうとしていて、Web開発に出てくる概念を簡潔に紹介する必要があると思っています。
モデルやテンプレートに比べて、URLやビューって簡潔に説明できていないと気づきました。
Web開発全般を扱った本を参考に、わかりやすく簡潔な説明を探してみます。

また、「図がほしい」という声も見かけたので、発表には図を入れます。

終わりに

もくもくはかどりましたー。
積んでいたタスクが終わって気持ちいいです。
この気持ちよさは麻薬的なのですが、まとまった休みは掃除などができる機会でもあるので、バランスには気をつけないといけませんね。

参加者の皆さま、運営のussyさん、ありがとうございました。
年末年始のもくもく会、引き続きよろしくお願いします。

自分が書いたはてなブログの記事でWordCloudを作り、2019年と2018年を比較する

はじめに

頑張れば、何かがあるって、信じてる。nikkieです。
先日「エンジニアの登壇を応援する会」の忘年LT大会にて、週1でブログを書くブログ駆動開発を知りました。
今週のネタ「自分の今年のブログのWordCloudを作る」についてブログを書きます。

宣言:私のブログ駆動開発

ブログ駆動開発がよさそうに思ったのは、「本当に学びたいことをブログ記事にする」という点です。
2019年4月から業務で自然言語処理に取り組んでいますが、この分野のキャッチアップはまだまだと感じます。
そこで直近1クール(2020年3月末まで)は、自然言語処理のネタで毎週1本ブログを書くことにします。

目的は自然言語処理へのキャッチアップですので、イベントレポートや雑記はブログ駆動開発としてはカウントしないという制約を追加します。

[ここから本題] WordCloudを作ってみた

忘年LT大会で知った「自分のブログのWordCloud」に取り組みました。

WordCloudとは

文章中で出現頻度が高い単語を複数選び出し、その頻度に応じた大きさで図示する手法。ウェブページやブログなどに頻出する単語を自動的に並べることなどを指す。文字の大きさだけでなく、色、字体、向きに変化をつけることで、文章の内容をひと目で印象づけることができる。

デジタル大辞泉 より

1年のブログをWordCloudにすることで、どんなことについて、頻繁に書いた1年だったかが掴めると考えています。

今回は公開している記事のタイトルと本文を対象にしました

  • 2019年:32件
  • 2018年:78件

2019年のブログのWordCloud

f:id:nikkie-ftnext:20191229015635p:plain

出現頻度が高いものは

ですね。
「PyCon」は、PyCon JPのスタッフ活動を始めたり、海外のPyConに参加したりと、私の2019年を言い表している単語のように思います。

2018年のブログのWordCloud

f:id:nikkie-ftnext:20191229015649p:plain

出現頻度が高いものは

といったところでしょうか。
2018年はDjango Girls Tutorialの翻訳に取り組んだ年で、ブログにもコードを載せて翻訳中の気づきをアウトプットしています(postやcommentはTutorialのコードをカウントしたためと思われます)。
Dockerは2019年はめっきり登場しなくなっていますが、使わなくなったわけではありません(最近は業務の中で、コンテナ内のuserとホストマシンのuserとの重ね合わせやコンテナの/etc/hostsの書き換えでハマりました)

2018年からずっとこのブログはPythonについてアウトプットしていて、改めて「Pythonに夢中になっているんだなあ」としみじみ思いました。

どのように手を動かしたか

WordCloudは(このブログでは未アウトプットですが、)過去の #pyhack で実装したコードがあります。

今回は前処理に手を入れて使っています。

はてなブログの記事の取得は新規に実装しました。
ソースコードはこちら

今回の開発で学んだのは大きく2点です:

  • はてなブログの記事一覧(XML)のパース
  • ブログ記事から不要な部分の除去(re.sub

はてなブログの記事一覧のパース

長くなったのでQiitaにまとめました。

今回、XMLの解析とは別の、思ってもみないところでつまづきました。
それがdatetimeタイムゾーン周りで発生した以下のエラーです:

TypeError: can't compare offset-naive and offset-aware datetimes

原因ですが、

わけです。

取得した記事は別々のファイルに分かれてフォルダに格納されます。
一方、私の実装の都合により、後続のWordCloudのスクリプトにはテキストを1ファイルで渡す必要があります。
そこでシェルからcatで1ファイルにまとめます:cat 2019/*.txt > 2019_all_blog.txt

正規表現を使ってブログ記事から不要な部分の除去

これまでのコードでは、前処理が不十分なためにURLに使われる単語もカウントされていました(先のツイートのhttpsやcom)。
これを削除することに取り組みました。

また、はてなブログの記事では [awesome_link:embed]といった埋め込みや [^1] のような脚注も登場します。 この [] で囲まれた部分も削除しました。

さらに、2018年の記事を見返すと、Markdown記法ではなく見たまま記法で書いていた時期がありました。
そのためにWordCloudにdivやpxなどのHTMLタグに使われる語が登場していました。
見たまま記法で作ったHTMLからHTMLタグも削除しました。

text = fin.read()  # ファイルから読み込み
square_bracket_removed = re.sub(r'\[.+?\]', '', text)  # はてな記法の[]を削除
uri_removed = re.sub(  # リンクのURIを削除
    r'https?://[\w/:%#$&?~.=+-]+', '', square_bracket_removed)
# <div>や</blockquote>などのHTMLタグを削除
html_tags_removed = re.sub('</?.+?>', '', uri_removed)

このコードがどのように動くのか、理解したことを以下に書きます。

正規表現. は「改行以外の任意の文字」にマッチします1
.+ は「改行以外の任意の文字を 1 回以上繰り返したもの」です。
.+?最小のマッチにします。
最小とはどういうことかと言うと、[^1]: mofu [hoge:title] のような文字列を考えた時、[^1][hoge:title] にマッチするということです。
?をつけない.+の場合は、[^1]: mofu [hoge:title]全体にマッチします(続く処理により、mofu の部分が捨てられてしまいます)2

URIを表す正規表現正規表現サンプル集 を参考にしました。
https?でhttpもhttpsも表せていて、うまいなと思います(?は「直前の正規表現を 0 回か 1 回繰り返し」を表す)。
[]は「文字の集合を指定」します。
この中では「特殊文字はその特殊な意味を失」うそうです(バックスラッシュによるエスケープが不要でした)。

HTMLタグを表す正規表現</?.+?>は、URIの場合を真似ました。
<h2>日記の見出し</h2>という文字列では、<h2></h2>だけを除いてほしいので、?を使って最小マッチにしています。

こうして指定した正規表現を使い、re.subで空文字列に置き換えて除去します。
今回の開発で re.sub の使い方にはだいぶ慣れました。

不要な部分を除去した後は、kz_moritaさんから教わった参考記事を真似て

  • STOPWORDの追加
  • 品詞の絞り込み

を試しました。
その結果が先ほどお見せした2枚のWordCloudです。

通して実行した様子

# はてなブログの記事一覧を取得するスクリプトのディレクトリに移動
cd ~/hatenablog-atompub-python
source env/bin/activate
python main.py nikkie-ftnext nikkie-ftnext.hatenablog.com 2019 --output output/2019
cd output
cat 2019/*.txt > 2019_all_blog.txt
deactivate
# WordCloudのスクリプトのディレクトリに移動
cd ~/cfp_wordcloud
source env/bin/activate
python draw_cloud.py ~/hatenablog-atompub-python/output/2019_all_blog.txt  # ブログ記事をまとめたファイルを渡す

その他のリソース

手を動かす中や動かした後に見つけたリソースを挙げます。
janomeチュートリアルはブログ駆動開発(自然言語処理編)の1つのネタとしておきます

終わりに

初回のブログ駆動開発は以上です。
迫るタイムリミットで平日はプレッシャーを感じるものですね。

実装したコードにはブラッシュアップできる点がいくつか浮かぶので、Issue管理して整えていきます。
それでは、翌週のブログ駆動開発(自然言語処理編)でまたお会いしましょう。


  1. 正規表現については re --- 正規表現操作 — Python 3.8.1 ドキュメント を参照しています

  2. Pythonによるあたらしいデータ分析の教科書』5章の青空文庫のテキストの前処理で見たコードを参考にドキュメントを引きながら手を動かしました。今回ようやく意味がつかめました

告知 | 2020年1月26日(日)にPyCon JP 2019のリジェクトコンを開催します(会場は早稲田駅近く) #rejectpy

はじめに

頑張れば、何かがあるって、信じてる。nikkieです。
大変お待たせしました、PyCon JP 2019リジェクトコンの案内です。

前回のリジェクトコンエントリ!

このエントリの後、

してきました。

リジェクトコン参加者募集します!!

勉強会の名前を「熱意あるPython使いの発表会」としています。
2019年6月に不採択となり寝かせてきたプロポーザルをついに発表するのです。
そんな方々を言い表す言葉は「熱意あるPython使い」にほかなりません!
熱意あるPython使いの発表を聞きたいという方、ぜひお申し込みください。

器は用意しました。
中身が詰まり、参加してくださる方に有意義な時間になるよう、引き続き準備していきます。

f:id:nikkie-ftnext:20191226024439p:plain

なぜやるか

改めて書くと、PyCon JP 2019は47枠に250を超えるプロポーザルが集まり、採択率は18%という激戦でした。
私は一スタッフとして選考に参加しましたが、非常によく練られているものの、枠数の都合上、僅差で不採択となったプロポーザルを何本も目にしました。
そんな接戦で惜しくも届かなかったプロポーザルに発表の機会がないのはもったいないと思うのです。
不採択となってしまったプロポーザルの発表を、何より私が聞きたいのです。

最近思うのは、「リジェクトコンこそが自分が心から発表したいことを発表できる機会ではないか」ということです。
カンファレンスは多くありますが、心から発表したいプロポーザルが毎回採択されるとは限りません。
レビューアーにうまく伝わらずに不採択となることもたびたび(私の場合はよく)あります。
不採択だからとそのプロポーザルを諦めるのではなく、自分だけに見えていて、レビューアーには見えていない点がどうやったら伝わるか考え、手を動かし、スライドを作り、発表して見えたことを元にプロポーザルを磨き上げてはいかがでしょうか。

不採択はそのカンファレンスだけの話で、プロポーザルを否定するものではないと私は思っています。
ですから私は、登壇できる機会があるのだったら積極的に活かして、次こそはプロポーザルを通すために使います。
そんな機会をリジェクトコンで作れたらと思っています。

登壇者も引き続き募集中!!

以下のフォームより年内の間、募集しています。
応募いただいた方は全員発表していただけます

トークのプロポーザルが不採択またはwaitlistとなった方だけでなく、

  • ポスターセッション
  • LT
  • ビギナーセッション

で不採択またはwaitlistとなった方も発表していただけます2

直近EoLとfinal releaseの順番が話題になった、Python2系の話題でも構いません。
(PyCon JP 2019に合わせてのPython2の話題だったかもしれませんが、話したいという想いがあればリジェクトコンで発表していただけます)

このリジェクトコンにはあなたの発表を聞きたいという参加者が集まります。
ですから、あなたの発表したいことをぜひ発表してみてください。

終わりに

勉強会の主催は初めてですので、準備に至らない点がありましたら、このブログのコメントやTwitter @ftnext 宛にお知らせください。

会場の用意や運営を助けていただいている有志の方に大変感謝しています。
残り1ヶ月、走り切りたいと思います。

なお、走りながら読んでいる ワンストップ勉強会 - oyakata - BOOTH では「準備の中であの時こうしておけば」という点がいくつも見つかっています。笑
軌道修正できるものは取り入れつつ、走り切った後に振り返ろうと思います。

f:id:nikkie-ftnext:20191226025055p:plain

イベントレポート | エンジニアの登壇を応援する会の忘年LT大会でtips、熱、さらにプレゼントまでいただいてきました #engineers_lt

はじめに

頑張れば、何かがあるって、信じてる。nikkieです。
engineers_lt のLT大会に参加して、成長に繋がりそうなtipsをいただき、また、気持ちを奮い立たせていただきました。
手短にイベントレポートをまとめます。

勉強会の概要

エンジニアの成長を応援する忘年LT大会2019 - connpass

今年も残すところあとわずかとなりました!やはり年末といえば忘年会ですよね。 昨年に引き続き今年もやっちゃいます!今年1年を締めくくる総まとめイベントとして、私たちエンジニアが「今年どんなアウトプットをしたか?」「来年どんな目標を掲げるか?」を日本酒の肴にして振り返りを行える忘年LT大会を開催します。

皆さんに熱くエモくトークして頂くLT大会になります!

先日の技書博2が非常に心地よくて定期的にお邪魔したいと思った「エンジニアの登壇を応援する会」。
成長にまつわるLT大会ということでどんな刺激をいただけるか楽しみに参加しました。

知ったこと

皆さん精力的にアウトプットしているので、 #engineers_lt から当日の模様は追えます。

自分の実況ツイートの中から印象的だったトピックを紹介します。
(追記 12/24)この記事で取り上げたトピックはごく一部ですので、興味を持った方は是非ハッシュタグを追ってみてください!

5位:膝の上にPCを置くためのポータブルテーブル(Yogibo)

4位:Vue.jsで寿司を回す

詳しくは お前らのクソアプリは間違えてる - Qiita
真似から始めていろいろ回してみたいなー

3位:振り返りに自分のブログでWordCloud

2位:アホになろう!

補欠枠のあきのさんの懇親会でのLT。
デブストへの登壇を1分で即決(登壇経験ないにもかかわらず!)という自身の「アホ」を紹介した後、リスクを考えすぎない「アホ」というスタンスについて共有するLTでした。
リスクを考えすぎずに飛び込む姿勢は素晴らしいと思いますし、今直面していることにもアホを実践してみようと思いました。
失敗してもいいんですし、やらなかった方が後悔する1んじゃないかと思います。

番外編:あの鳥のTシャツ

しぶあつさんから教えていただいたとおりに探したらいっぱい出てきましたー。わーい!
Party Parrot T-Shirts | Redbubble

1位:週1でブログを書くブログ駆動開発(BDD)

なりたいエンジニア像への第一歩かもと思いました。

さらにいただいたもの

冒頭の写真についてです。

  • 読みたかった『エンジニアの成長を応援する本』をいただきました!ありがとうございます
    • これは読んで感想アウトプットができますね
  • 長村ひろさんのプレゼント企画でre:InventのMonday Night Live Tシャツ(2Xサイズ)をいただきました。ありがとうございます
    • プレミア感が嬉しい一品です。最近Python×Lambdaで少し開発しているので、今後は正装して臨みます
    • プレゼント獲得者は2020の目標をどうぞ!とのことだったので、「US PyConにプロポーザルを通す」というアホな目標を設定しました。2020年一年かけてUS PyCon 2021の登壇を準備します(目標設定ブログ予定)

そして、KANEさん、本を教えていただき、ありがとうございます!

終わりに

ブログを週1で書くというのはやってみたいと思っています。
2020年を待つと始めなさそうなので、今週、「自分の今年のブログのWordCloud」というネタで手を動かしてみます!
失敗したら振り返ればいいのです、まずはやってみます!

参加者、登壇者、運営の皆さま、学び多く楽しい時間をありがとうございました。
また、DMMさんのオフィスのイベントスペースはとても広くて、植物は本物で壁が緑で、過ごしやすい空間でした。
2020年も #engineers_lt の勉強会を楽しみにしています!2


  1. 最近のヒロアカで聞いたクリムゾン・ライオットのセリフが蘇ってきました。怖いけど、目の前の人を救えない辛さに比べたら、飛び込めるというような内容です。

  2. 私はPython使い向けにプロポーザルを書くもくもく会や登壇練習をするもくもく会を開催したいと思っています。技書博でも主催のariakiさんと少しだけお話ししたのですが、タイアップする余地があるのではないかと思っています(タイアップすることでPython使いに限らず、登壇を控えたエンジニア向けのようにできそうです)

ざっくりと2019年を思い出す

はじめに

頑張れば、何かがあるって、信じてる。nikkieです。
気づけば2019年も残り日数が一桁、振り返りの時期です。
このエントリでは、私が2019年に取り組んだことを書き出し、振り返るトピックを掴みます。

書き出しの概要

私の2019年は1文字で表すと「」ですね。
環境を変えたり、海外のカンファレンスに行ったり、初挑戦の形式でアウトプットしたりと、いろいろな 動き をしました。
動きが多くて、何をしたか忘れているところもあるので、まずは取り組んだことを3ヶ月ごとに分けて箇条書きにします。

合わせて好んで見ていたアニメも書いておきます。

2019/01〜03

  • 1月, 2月 eLVさんでDjango Girls Tutorialをもとにしたハンズオンで登壇
  • 1月, 3月 サポーターズさんでKaggleのタイタニックコンペを題材にしたハンズオンで登壇
    • pyhack 冬山合宿でいただいたコメントでものすごくブラッシュアップされた
    • TAしてくださった方に感謝。特に1月、50名近くいらした回
  • 2月 PyCon JP 2019 スタッフ活動を始める
  • 2月 JAWS DaysでLT(Lambdaで作ったFlaskアプリ)
  • 3月 #stapy 長野編へ。日本システム技研さんの文化に魅せられる
  • 1-3月 #技術書典 6に向けて、サポーターズCoLabで知り合った方と合同誌を書く

2019冬クールのアニメ

アニメでは『青春ブタ野郎』が印象的でした。
「かえでクエスト」から始まる かえで回 は胸が締め付けられる切なさでした。

前評判から注目していた『約ネバ』も期待を裏切らず、すごかったです。

2019/04〜06

  • 3-4月 サポーターズさんで学生向けにKaggleのタイタニックコンペを題材にしたハンズオン(オンライン版)
    • 目の前に人がいないため、ペース配分を誤り、3月は用意したものをすべて消化できず。その振り返りをして4月に臨んだ
    • 6月には学生に絞らず、オンライン版を開催
  • 4月 転職。データサイエンティストとして業務でPythonを書くように
  • 5月 PyNyumon 登壇
  • 5月 Django Congress JP 2019 登壇
    • 6月のDjango Girls Tokyo月次勉強会でユーザ管理部分のハンズオンを開催

2019春クールのアニメ

数話読んだことのある『この音とまれ!』は、原作さながらの清涼感でとてもいい息抜きになりました。
『キャロル&チューズデイ』も歌が味わい深くて楽しみに見ていました。

ユーフォ新作『誓いのフィナーレ』はもう本当に熱くて、「次に見たら関西大会の結果変わるんじゃないか?」と何度も通いました。

2019/07〜09

  • 7月 #pycamp のTAで高山へ。『氷菓』の聖地巡礼
  • 8月 PyPIに初めてのパッケージ公開
  • 8月 少しずつ積み上げていく某取り組みに着手
  • 8-9月 トークを落としそうになるまでやり込んだPyCon JP 2019スタッフ活動
  • 9月 PyCon JP 2019登壇:Anacondaの話、15分トーク
  • 9月 id:Nao_Y さんとPyCon Taiwanへ。英語でLTした

2019夏クールのアニメ

京都アニメーション放火事件でつらい時期となった2019年夏。

『荒ぶる季節の乙女どもよ。』が岡田節全開で徐々に引き込まれていきました。
前クールから続く『キャロチュー』でも音楽に癒やされました。

9月公開『ヴァイオレット・エヴァーガーデン 外伝』は圧巻のクオリティでした。
テイラアアアアアアアアアアアアアアア!!

2019/10〜12

  • 10月 id:Nao_Y さんとPyCon Singaporeへ
  • 10-11月 Django Girls Workshopに向けてTutorialの翻訳レビュー
  • 12月 #技書博 2にてargparse本を頒布
  • 11-12月 PyCon JP 2020 スタッフ活動動き出し

2019秋クールのアニメ

フルーツバスケット』『ハイスコアガールⅡ』『ちはやふる』『PSYCHO-PASS 3』『ヒロアカ』と豊作のクール。見切れません!

11月から技術同人執筆に注力して映画館から足が遠のいていたら『空の青さを知る人よ』『HELLO WORLD』が見られなくなっていました。むー、残念。。
「たとえ世界が壊れても、もう一度、君に会いたい」んですが、あー、「空、くっそ青い」

振り返りトピック

以下について振り返るエントリが書けるかなと思っています。
これらについてうまくいったこと、失敗したことを挙げていき、2020に繋げます。

  • Kaggleのタイタニックコンペを題材にしたハンズオン
  • PyCon JP スタッフ活動
  • Django関係
  • PyCon JP 登壇(Anaconda)

また、「転職(して9ヶ月経ちました)エントリ」も年内に書きます。
続くエントリでお会いしましょう!

告知 | 12/14に日本橋浜町 プラザマームで開かれる #技書博 2にてPythonの標準モジュールargparseでコマンドラインツールを作る本(¥500, 90P)を頒布します(2F-か01)

f:id:nikkie-ftnext:20191213201845p:plain

はじめに

頑張れば、何かがあるって、信じてる。nikkieです。
今週末はいよいよ技書博ですね。
最後のアピールとしてブログを書きます。

イベントの概要

イベントサイトはこちら。
サークルチェック機能もあって便利です。

アクセス情報はこちらが参考になります:

11-14時は事前予約制で、14時以降がフリー入場と聞いています。
(事前予約は無料ですが、すでにチケットは売り切れだそうです。この記事で興味をもった方は14時からいらしてください)

頒布する本「Pythonコマンドラインツールを作る with argparse」

f:id:nikkie-ftnext:20191213201904p:plain

  • 対象者:Python入門者〜中級者なりたて
  • 価格:試しやすさを重視して 500円(紙も電子も)
    • PayPay対応しています(ポイント付くのは夢のようですね!)
  • このアウトプットはアップデートしていきたいので、紙の購入者にも電子の最新版にアクセスできるようにカードを渡します
  • B5設定でビルドしたら90P超え!

立ち読みは以下からどうぞ(技書博のページと同様の立ち読み先です):

なぜ書こうと思ったのか

入門書を読むとPythonスクリプトを実行できるようになります。
しかし、入門書のスクリプトは、対象となるファイル名などを直に書いているため、実行するたびに書き換えが必要です。
対象となるファイル名をコマンドラインから引数として渡せたら、スクリプトが扱いやすくなるので、その方法をこの本としてアウトプットすることにしました。
入門書を終えた方がより扱いやすいスクリプトの作り方を知っていただけたら嬉しいです。

詳しくはこちらです:
告知 | 12/14 #技書博 2にて、argparseを使ってPythonでコマンドラインツールを作る方法について同人誌を頒布します(2F-か01) - nikkie-ftnextの日記

チェックしたサークル情報

2F-か02 電脳世界さん 「Python3で学ぶプログラミング入門」(お隣)

240ページ超えの大著!
Git入門などお品書きも充実しています。

3F-す03 GetFEM++

Pythonで科学計算のトピックならゆうげんさん。
技術同人イベントでは安定して出展されています。

2F-あ07「マンガでわかるRuby② 〜オブジェクト指向編〜」

先日のstapyにもお越しいただいた湊川さん。
対象に思い当たるところがあるので、このオブジェクト指向の本、読んでみたいです。

3F-そ02 IM@Study

プロデューサーさん、新刊ですよ、新刊!!
毎回楽しみにしています☺️

雑感

サークル一覧を覗くと、博覧会の名にふさわしい多様なテーマが集まっています。

機械学習系は、さ01やえ06(推薦システム)でしょうか。
いの島のSwiftは特に充実していますね。

終わりに

今晩もこの後、ソロ参戦に向けた準備をします。
ご来場される方、よろしければ、か01までお越しください。
立ち読みだけでも大歓迎です。お待ちしています!

イベントレポート | #pyhack にて 退py のコードをオブジェクト指向でリファクタリングするというプロポーザル駆動開発を進めました

はじめに

頑張れば、何かがあるって、信じてる。nikkieです。
11/30の pyhack で手を動かした内容を備忘のためにまとめます。

勉強会の概要

(第105回)Python mini Hack-a-thon - connpass

基本的に毎月開催です。スプリントのゆるい版みたいな感じで各自自分でやりたいことを持ってきて、勝手に開発を進めています。参加費は無料です。 初めての方も常連さんもぜひご参加ください。

11/30は他のPython勉強会と重なったこともあり、人数は10〜15人くらいで推移し、ゆったりめでした。

やったこと

標題についての解説です。

背景

Pythonを始めたときに『退屈なことはPythonでやらせよう』1(退py2)にお世話になりました。
この本をはじめ、入門書で最初に見たコードを繰り返し真似る中で、同様のコード3が書けるようになりました。

      if width > SQUARE_FIT_SIZE and height > SQUARE_FIT_SIZE:
          # Calculate the new width and height to resize to.
          if width > height:
❶            height = int((SQUARE_FIT_SIZE / width) * height)
              width = SQUARE_FIT_SIZE
          else:
❷            width = int((SQUARE_FIT_SIZE / height) * width)
              height = SQUARE_FIT_SIZE

          # Resize the image.
          print('Resizing %s...' % (filename))
     ❸     im = im.resize((width, height))

こちらのようなコードを書いて自分のやりたいことができるのは非常に嬉しいのですが、仕事でも書く中で変更しにくさを感じるようになりました。
そこで、動作し、かつ、変更しやすいコードをPythonで書けるようになりたいと最近はオブジェクト指向のインプットをしています。

取り組み

退py 17章の画像処理のコード(前掲)をオブジェクト指向で書き直してみます。

オブジェクト指向で書き直すにあたって、増田さんの本や、増田さんの本で言及されている『ThoughtWorksアンソロジー』の「オブジェクト指向エクササイズ」を参考にしました。
インプットした内容の実践です。

なお、単体テストを書いて進めるテスト駆動開発をしています。

成果

画像ファイル1つを渡す場合(MVP)は動作させられました。

# 縮小したい画像のパスを渡すと
$ py-im-process ~/Downloads/pyconjp.jpg
# カレントディレクトリに縮小した画像ができる
$ open pyconjp.jpg

もう少し手を動かしてCfPに落とし込んでいきます。

手を動かす中で気づいたこと

  • Python.gitignoreをコピペでなくwgetすればいいと気づく:wget https://raw.githubusercontent.com/github/gitignore/master/Python.gitignore -O .gitignore4
  • 単体テストで返り値の型を確認するassertIsInstanceメソッドが存在していたことに気づく
    - 長いこと`isinstance`の返り値がTrueか確認していました。恥ずかしい😖
    
  • ファーストクラスコレクションに__iter__メソッドを実装
    • ファーストクラスコレクション自体がfor inに置けるようになる(ファーストクラスコレクションの持つリスト型のプロパティだけでなく)
In [5]: @dataclass
   ...: class Foo:
   ...:     list_: List[int]
   ...:     def __iter__(self):
   ...:         return iter(self.list_)
   ...:

In [6]: l = Foo([1, 2, 3])

In [9]: for i in l.list_:
   ...:     print(i)
   ...:
1
2
3

In [10]: for i in l:
    ...:     print(i)
    ...:
1
2
3

In [5]: iter(l)
Out[5]: <list_iterator at 0x108e035c0>

今後やりたいこと

  • 変更しやすさを体験したい
    • 指定した画像ファイルをグレースケールにもできるようにしたい
    • argparseのadd_subparser
    • main関数がまだ知りすぎている(カプセル化しきれていない)ので修正する
  • 存在する画像ファイルが指定されたことの検証
    • argparseのadd_argumenttypeを使えばできそう
  • 画像ファイル単体でなく、ディレクトリも指定できるようにしたい
  • テストを書いていることを活かしてリファクタリング
    • クラスの分け方、もっとよくできないか試したい

終わりに

久々参加の #pyhack、人が少なめだったので、がっつりやりたい開発ができて満足しています。
必要そうな小さなクラスを作った後、それらを使って1つの処理を組み立てるところで時間がかかるので、設計のときに呼び出し関係を考えた方がよさそうです。

次回12/14は 技書博2 と重なったので、タイムラインから見つめています。 参加者の皆さま、1日ありがとうございました。

PS: 2020年のnikkieへ

新規開発でmypy導入するっ!


  1. 原著(英語版)の2nd Editionが出たようです。100ページ増! ref: What's New in the 2nd Edition of "Automate the Boring Stuff with Python" - The Invent with Python Blog

  2. 一部の熱狂的なファン(私です)による呼称です

  3. 英語版の本文とソースコードは公開されています。続くコードは Automate the Boring Stuff with Python より

  4. ref: gitignore を落としてくれるシェルスクリプト - 私が歌川です