nikkie-ftnextの日記

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

イベントレポート | #pyhack にて旦那と彼氏の間に何があるのかをword2vecに聞いてみました

はじめに

いつも心は虹色に! nikkieです。
4/6開催 (第98回)Python mini Hack-a-thon のイベントレポートをお送りします。

注:書かれている感想や考えは4月時点のものです。

勉強会の概要

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

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

2月回以来の参加となりました。
(3月はstapy長野とブッキング)

取り組んだこと

word2vec入門!

今年はじめに どうしたら「彼女」から「奥さん」になれるかを『Word2Vec』に聞いてみた | 人工知能ニュースメディア AINOW を見て以来、ずっと気になっていたword2vecを触ってみました。

知りたいこと:旦那と彼氏の間に何があるのか?(旦那 - 彼氏)

以下を使って答えを求めてみます:

notebookはこちら:
word2vecで彼氏と旦那の間に何があるのか聞いてみる ライブドアニュースコーパス編 #pyhack 20190406 · GitHub

word2vecとは

単語がベクトルとして表現されるので、単語の足し引きができるようになると理解しています。

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

よくある例

  • 王様 - 男 + 女 → 女王1
  • 日本 - 東京 + ソウル → 韓国2

詳しくは勉強中です。

コーパス

以下のリンクからダウンロードした「livedoor ニュースコーパス」を使いました。3
https://www.rondhuit.com/download.html

ダウンロードしたtar.gzの解凍:tar -zxvf ldcc-20140209.tar.gz
-vもつけると、解凍したフォルダ・ファイル名がコマンドラインに表示されます)

.
├── ldcc-20140209.tar.gz
└── text
    ├── CHANGES.txt
    ├── README.txt
    ├── dokujo-tsushin
    ├── it-life-hack
    ├── kaden-channel
    ├── livedoor-homme
    ├── movie-enter
    ├── peachy
    ├── smax
    ├── sports-watch
    └── topic-news

形態素解析

Keras MLPの文章カテゴリー分類を日本語のデータセットでやってみる | cedro-blog と同様にjanomeで実施しました。

from janome.tokenizer import Tokenizer
ja_tokenizer=Tokenizer()
line = 'すもももももももものうち'
words = ja_tokenizer.tokenize(line)
for word in words:
    print(word)
すもも 名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も 助詞,係助詞,*,*,*,*,も,モ,モ
もも  名詞,一般,*,*,*,*,もも,モモ,モモ
も 助詞,係助詞,*,*,*,*,も,モ,モ
もも  名詞,一般,*,*,*,*,もも,モモ,モモ
の 助詞,連体化,*,*,*,*,の,ノ,ノ
うち  名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ

今回は名詞だけを取り出すことにします。

res = []
malist=ja_tokenizer.tokenize(line)
for tok in malist:
    ps=tok.part_of_speech.split(",")[0]
    if not ps in ['名詞']: continue
    w=tok.base_form
    if w=="*" or w=="": w=tok.surface
    if w=="" or w=="\n": continue
    res.append(w)
res.append("\n")
print(res)
# ['すもも', 'もも', 'もも', 'うち', '\n']

取り出した名詞は半角スペースで区切って並べ、テキストファイルに書き出します。
ライブドアニュースのテキストファイルと同じだけ、名詞を取り出したファイルができます。)
名詞で構成されたテキストファイルはtextと同じ階層にwakatiフォルダを作って配置します。

.
├── ldcc-20140209.tar.gz
├── text
│   ├── CHANGES.txt
│   ├── README.txt
│   ├── dokujo-tsushin
│   ├── it-life-hack
│   ├── kaden-channel
│   ├── livedoor-homme
│   ├── movie-enter
│   ├── peachy
│   ├── smax
│   ├── sports-watch
│   └── topic-news
└── wakati
    ├── dokujo-tsushin
    ├── it-life-hack
    ├── kaden-channel
    ├── livedoor-homme
    ├── movie-enter
    ├── peachy
    ├── smax
    ├── sports-watch
    └── topic-news

名詞を取り出す処理は10分くらいかかりました(1万には満たないファイル数です)。4

モデル作成

word2vecのモデルを作る上で、ライブドアニュースから取り出した名詞を1つのファイルに集約する必要がありました。 (gensim.models.word2vec.Text8Corpusに渡すファイルを作る)
以下の記事のシェルスクリプトを利用させていただきました🙏: 【Python】Word2Vecの使い方 - Qiita

find wakati \
| grep -e movie-enter -e it-life-hack -e kaden-channel \
    -e topic-news -e livedoor-homme -e peachy -e sports-watch \
    -e dokujo-tsushin -e smax \
| awk '{system("cat "$0" >> livedoor_wakati.txt")}'

複数のフォルダから集約する必要があったので、grep-eオプション5を使い、「または」検索しました。

彼氏 - 旦那 = ?

足し引きのやり方は、以下の記事を参考にしました:
【Python】🍜ラーメンガチ勢によるガチ勢のためのWord2vec(食べログ口コミコーパスの威力を検証してみた)🍜 - Qiita
引き算はnagetiveに指定すると理解しました(ドキュメントの確認は宿題事項)。

旦那と彼氏の間にあるものは、「農家、土地、畑」か〜😳

他の方の取り組みから

感想

気になっていた記事の内容を試せたので満足です。
複数カテゴリの記事を渡していたり、名詞だけに限定していたりと工夫できそうなポイントがあるので、今後確認したいと思います。

  • janomeは初期設定がMeCabより少なく6、使いやすいですね(MeCabの経験と比較して)
  • ファイルの集約に使ったシェルスクリプト便利ですね。「awkでやっていることって何?」って感じなので早々に調べます
  • ファイルパスの扱いでos.pathの代わりにpathlibを使ったところ、なかなかいい感じです

登壇報告 | #djangocongress にて、Django Girls Tutorialの次に取り組みたいトピックについて共有してきました

はじめに

頑張れば、何かがあるって、信じてる。nikkieです。
5/18のDjango Congress カンファレンスデーに参加し、「Django Girls Blogのネクストステップ」と題して、発表してきました。
このブログで登壇報告します。

勉強会の概要

DjangoCongress JP 2019

DjangoCongress JPは日本で開催されるDjango Webフレームワークのカンファレンスです。
DjangoCongress JPは、Djangoでアプリケーションを開発している人、Djangoを学んでいる人などDjangoに関わる全ての人が参加できます。
参加する全ての人がDjangoについて交流し、出会い、学び、楽しみ、深い理解を得ることを目的にしています。

昨年はDjangoを始めたばかりで右も左も分からずに参加したDjango Congress。
1年経て登壇内容を持参しての参加です。

トークDjango Girls Blogのネクストステップ

Django Girls Tutorialを始めとするチュートリアルと、Djangoで作りたいアプリが作れる状態の間にはギャップがあると感じています。
このギャップを解消するために、Django Girls Tutorialの題材のブログアプリを作り直し、得られた知見を共有しました。
スライド内容は、チュートリアルで扱っていない機能の実装方法が中心になっています。

取り上げた機能は、「チュートリアルで扱っていない」かつ「身につけるとDjangoでできることが広がる」という観点で選びました。

  • 他のソースコードを読むときに必要となるであろうクラスベースビュー
  • Djangoにこんな機能があると知ってほしかったカスタムタグ権限

実装方法の紹介が中心ですが、最後に話した実際方法の調べ方が言いたかったことです。
(このスライドで扱っていないDjangoの機能はまだまだ多いです。 調べる際に参考になれば嬉しいです)

  • Google検索などで実装例を探す(Djangoのバージョンが古くてもOK)
    • GitHubの動いているコードを参考にしてもいい1
  • 同時にDjangoのドキュメントの中を検索し、一次情報に当たる
    • Djangoドキュメントは英語で表示して検索(日本語で表示しているとヒットしない)
    • 検索結果を確認する際は日本語に戻して表示
    • ドキュメントに記載されていなければソースコードを見る

これは、トークの題材探しとして手を動かす中で見出していった調べ方です。
発表準備の過程はこちらから:

感想

トークを終えたあとに開いたツイッターには、非常に嬉しいコメントがいくつもありました。
フィードバックいただき、ありがとうございます!

こちらは要確認です(akiyokoさんの発表も参考に):

そして、今回一番感謝したいのはGitPitchのDavid Russellさん!!

GitPitchまわりでだいぶハマったのですが、原因はPITCHME.mdのあるフォルダを指定するpパラメタの指定で、末尾につけていた/が不要とのことでした2
Thanks a lot for your help!

これまでで一番大きいと思われる登壇の機会だったので、書籍の「献辞」にならったスライドを入れました。
ここで会場から拍手をいただき、感激しました。(お付き合いいただきありがとうございました)

裏話

ジャンゴールデンウィークネクストステップのネタを仕入れ、その後1回の週末を挟んで資料を作っていきました。
しかし、これまでの登壇と違って、作業見積もりが当てにならず3、資料の最後のパートができたのが前日21時。
そこから勘違いでGitPitchがうまく使えなくて当日朝練習、ランチの時間にアップデートをして登壇という若さに任せた強行スケジュールでした(苦笑)。
スライドに盛り込んだ内容は抜粋で、手を動かすには情報が不足していると思います。
自分の復習の意味を込めて引き続きアウトプットしていきます。

今後

直近では6/1のDjango Girls Workshopで再演の機会をいただきました。
PythonでWebアプリを作ろう [女性対象/男女コーチ◎] 2019.6 - connpass
ユーザ作成の部分に絞って、クラスベースビューの導入ハンズオンを考えています(これから準備するため、変更になる恐れがあります)

というわけで、今後もネクストステップの試みは続くのです。
Django Congress カンファレンスデー、ご参加の皆さま、運営スタッフの皆さま、会場提供のサイボウズさん、1日ありがとうございました!
お疲れさまでした。


  1. matobaさんも同様のツイートをしていて、ちょっと自信を持ちました:https://twitter.com/mtb_beta/status/1129609044799262720

  2. ドキュメントにも末尾に/はありません:https://gitpitch.com/docs/git/branch-many-slideshows/

  3. 今回の登壇内容は蓄積が少ない分野だったことによるかと考えています(=ストレッチゴール)。情報収集→登壇内容組み立て(スライド&サンプルコード)という流れで準備していきました。これまでは蓄積されていた分野で発表することが多く、内容組み立てが中心でした。

登壇報告&イベントレポート | #PyNyumon の「集い」にて、コミュニティ × Python独学 という経験を共有してきました

はじめに

頑張れば、何かがあるって、信じてる1。nikkieです。
Pythonを始めるきっかけになった #PyNyumon の「集い」(LT会)で経験を共有してきました。
手短に登壇報告を残します。

勉強会の概要

Python入門者の集い #8 - connpass

Python入門者のLT大会&懇親会です。
最近Python始めた方、これからPythonを深めていこうという方、ぜひ集まって「Pythonのここがよかった」「ここが好きになった」「ここがひっかかりやすい」など、Pythonを始めるにあたっての知識を共有しましょう。

スクレイピングハンズオンとLT大会を交互に開催している #PyNyumon。
経験を共有する側として場に立てて、胸にこみ上げてくるものがありました。

トーク:「独学Python in コミュニティ」

キーワードは「独学」と「コミュニティ」です

  • もくもく会に通って独学を進める中で、頻繁に質問に回答いただき、多くのものをいただいたと感じたnikkie
  • いただきっぱなしではなく、Pythonのコミュニティへのお返しとして、教える活動に取り組むようになり、今に至ります
  • (他のお返しの仕方として、アウトプットやカンファレンススタッフなどにも取り組んでいます)
  • できる範囲でコミュニティにお返し した結果、独学にプラスに働きましたと共有しました

komo_frさんトーク

印象に残ったのは結びの言葉:

コードは書かなければ書けるようにならない
とにかくコードを書こう

また、軸を明確に決めて取り組まれておられ、自分の取り組みを見つめ直す機会になりました。
(アウトプットも登壇からブログまで全部は難しい。そこで絞る、というトピック)

私とkomo_frさんのトークは共通している部分(もくもく会)もあれば、二者二様の部分もあります。
Pythonの取り組み方の多様性を示した結果になったと感じており、2軸のうちしっくりきた部分を参考にしていただければと思います。

トークを聞いて:「これが私の生きる道

komo_frさんのお話を聞いて、自分がPythonに関わる中で、大事にしているものがおぼろげながら見えてきました。

私は、わからなかったことがわかる瞬間が好きです。(トークで言及した「伏線回収」)
教えるという活動に夢中になっているのは、

  1. 教える中で自分の理解が足りない箇所が埋まる瞬間があり、
  2. また、他の人にとってのわからなかったことがわかる瞬間に立ち会えているから

のようだと気づきました。
登壇などで教える機会の資料には日本語を使うので、Pythonだけを書いているわけではありません。
それでも教えることを続けているのは「好きだからなんだなあ」と帰り道にしみじみと感じました。

Django Congressを週末に控え、怒涛のアウトプットも一段落しそうです。
Congressが終わったら、アウトプットの連続となったこの半年を振り返ってみようと思います。

LTより

紹介された勉強会(抜粋)

感想

嬉しいフィードバックもいただきました!
発表者冥利に尽きます😆

余談ですが、サブカルエンジニア界隈で流行の兆しを見せている「推しのTシャツ(正装)登壇」を試したところ、「ユーフォ好きです」という方がいらして、やってよかったです😊
(ファーストペンギンのnao_yさん、ありがとうございます)

お越しくださった皆さま、フィードバックくださった方々、運営の皆さま、どうもありがとうございました。
経験を共有する機会をいただけたこと、本当に感謝しています。
今後も精進に励みます!


  1. 冒頭の挨拶、アップデートしました。長らくお世話になった「いつも心は虹色に!」さん、ありがとうございました

  2. この資料がスライドにある「Twitterでうまくいかないとツイートしたら教えていただいた」資料の一つです(多謝)

連休ログ | Congressの発表ドリブンでDjangoを触った「ジャンゴールデンウィーク」でした

はじめに

GWはしっかり休めたかい? nikkieです。
休みつつも私は、タイトルの通り、Djangoを触っている時間が長かったです。
5/18にDjango Congressでの発表が控えており、その準備を進めていました。
「こんなことが話せそう」とアウトラインが決まったので、いったんアウトプットしておきます。

5/18 Django Congress トーク

Django Girls Blogのネクストステップ 〜実務レベルへ橋渡し〜」というタイトルで45分話します。

Django Girls Tutorialや公式ドキュメントの投票アプリチュートリアルは、入門者にとってわかりやすくDjangoの開発フローを学べます。
その一方で、私自身は、実務で開発するDjangoアプリケーションとの間にギャップがあると感じています。
チュートリアルよりフォルダ構成は複雑ですし、カスタムユーザなどチュートリアルで扱っていない内容も登場します。
そこで、Django Girls Tutorialのブログアプリを作り直し、実務でDjangoを使う上で必要と考える知見を共有します。
この発表がチュートリアルと実務の間のギャップの認識、そして解消のきっかけとなれば幸いです。

実は実務でDjangoを使ったことはないのですが、「作りたいアプリをDjangoで作ろう!」と思ったとき、チュートリアルで扱われていない機能が多いと感じています。
Django GirlsのWorkshopにコーチ参加しての感触でもあります)
「作りたいアプリをDjangoで作ろう!」という人が参照できるトークスライドを残したく、GWはDjangoで個人開発みたいなことをして、いろいろとネタを仕入れていました。

nikkieとDjangoの10日間

トークのネタ(ブログアプリの作り直し)はこちらのリポジトリにあります:

書籍にあたったり、Djangoドキュメントや先達のブログ記事にあたったりして、チュートリアルで扱っていない機能を実装していました。
例えば多対多のカテゴリの導入やページネーション、ユーザ登録などです。

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

別のリポジトリでは、social-auth-app-djangoを 使ってFacebookログインを試してみました。

手を動かしたことで各種OAuthのログインのイメージがつかめました。

Congressトークアウトライン

スライドやソースコードはこれから作っていくので、この内容になると保証はできませんが、ひとまずこんな感じで考えています。

  • はじめに(5分)
  • Django Girls Tutorial クイックツアー(10分)
  • ユーザまわりを実装(10分)
  • この機能、どう作る?(10分)
  • まとめ(5分)
  • 質疑(5分)

詳しくはこちら:
Django Congress 2019 トーク アウトライン(暫定版) · GitHub

「このあたりの機能は経験あるな」という方は、裏のc-bataさんのトークをどうぞ!

トークの対象者は

を想定しています。
「こういうトピックも扱ってほしい」というリクエストがありましたら、@ftnext質問箱までお寄せください(可能な限り取り入れます)。

終わりに

GWはDjango三昧だったと読者の方は思われるかもしれませんが、

  • 映画を見に新幹線で名古屋にいったり、
  • 映画に出ているファミレスの系列店で同じメニューを頼んだり
  • ふだんおろそかにしている片付けという負債を返済したり

と、締切をあまり意識しない穏やかな時間を過ごしていました。

しっかり休んだ後は、再度スイッチを入れて、トークの追い込みなど締切に追われる生活に戻ります。 Congress当日、会場でお会いしましょう!

イベントレポート | #SciPyJapan 1日目、科学計算まわりのPythonのトークを十分に浴びてきました

はじめに

いつも心は虹色に! nikkieです。
皆さん、SciPy Japanはご存知でしょうか?
機会をいただいたので、当日ボランティアとして参加してきました。

イベントの概要

Scipy Japan Conference 2019

SciPy Japan Conferenceは、日本で成長しているScientific Pythonコミュニティを結集させ、最新のプロジェクトを紹介し、参加者が熟練したユーザーや開発者から学ぶことを目的としています。

学問、企業、Pythonコミュニティからの参加者が一堂に会しました。
内訳は、5カ国から90名だそうです。
会場は「マンダリンオリエンタル東京」(超高級ホテル!)です。

Tutorial(Beginner): TensorFlow 2.0 Tutorial

https://storage.googleapis.com/applied-dl/SciPy_Tokyo.pdf

ディープラーニングは画像や長大なテンソルを入力にするという印象を抱いていたのですが、

  • 線形回帰も扱える
  • 構造化データ(CSVで扱われるような表形式のデータ)も扱える

ことがわかりました。
入門の例だけではなく、

  • DCGAN
  • seq2seq

といった応用例も取り上げていただき、TensorFlow2.0のクイックツアーに参加した感触です。

TensorFlowのインターフェース

tensorflow.keras前提です。

  1. 層(Layer)を並べてモデルを定義
  2. モデルをインスタンス
  3. compile
  4. fit
  5. predict

機械学習のポイント:カジノの例

レーニングデータセットとテストデータセットの違い

  • レーニングデータセットはモデルを作成する上で自由に使えるデータ
  • テストデータセットはカジノにある(モデル作成時に自由に使えず、自信のあるモデルをカジノに持って行ってテストデータセットへの性能を試す)

興味深かったのは、TensorFlow.js!
機械学習アプリケーションのデプロイに関心があるのですが、「JSで作ってしまうのはありだな」と思いました。
今度手を動かしてみます。

Advanced TutorialのAdvanced NumPyは公開されるビデオに期待しています。

Keynote: f(x) = a + bi

  • f: future
  • a: Atom
  • bi: Bit
  • →リアルとビットが未来を決める(世の中もエンジニアのキャリアも)

Bit

現在のAIの懸念点(AlphaGoを想定)

  • AIは高価
  • 電力コストを食い過ぎる

→解決策がCognitive Computing

Atom

リアルな世界の技術が必要

成功例:Carbon社
3Dプリンティングの問題をAtomとBitを組合せて解決

高い視座での話を久しぶりに聞いたので、ワクワクしました。
個人的には、これから来るだろう分野で素振りしておいて、チャンスに備えたいですね。

Apache Arrow

Pythonistaへのメリット

  • pickleの代替として使える(PySpark)
  • pandasとVaes(データフレームのライブラリ)は少しArrowを使っている

メモ:pickleはPythonのオブジェクトをバイトに変換したもの1

cross-languageがArrowの魅力とのことです。
多様な言語で使えるようにC++ベースで実装しようという考えが開発者間で共有されているのが、開発に参加したきっかけとおっしゃっていました。

Chainer: A Deep Learning Framework for Fast Research and Applications

  • ChainerはDefine-By-Runのパイオニア
  • ChanierXによるSpeed, Quick deployment
  • Domain Specific add-on packages

GoogleがTensorFlowでいろいろなプロジェクトを進めているのと同様に、PFNはChainerでいろいろなプロジェクトを進めている印象です。
直近では充実のチュートリアルが公開されています。

Scaling Your Python Interactive Applications with Jupyter

Jupyterでの懸念点を解決したそうです。

  • Optimized resource allocation
  • Security(HTTPS、multiuser)

クラウドのリソースを使いやすくする仕組みで、複数人で使わなくてもメリットはあるとのことです。

ドキュメントにチュートリアルがありました:

CuPy: A NumPy-Compatible Library for High Performance Computing with GPU

「ColabもしくはNVIDIA GPU環境で試してみて」:pip install cupy-cuda-101
(ColabではGPUを有効にする必要あり(Select runtime))

  • CuPyはNumPy, SciPy互換
    • コード中のnpをcpに置き換える(import cupy as cpしている前提)
  • NLPで聞いたことのあったspaCyもcupyを使っていた

GitHubにはexamplesも充実しているそうです:
cupy/examples at master · cupy/cupy · GitHub

RAPIDS: GPU Accelerated Data Science

2018年10月のPyDataでも取り上げられたPAPIDS

  • GPUはCPUがないと動かない(CPUからGPUに指示している)
  • CPU-GPU間でデータを送る部分のオーバーヘッドがある
  • 機械学習のはじめから終わりまでGPUで行う(=RAPIDSの世界観)

RAPIDSの世界観ではfail fastで進められるのがいいですね。

構成要素

太字のものをデモ込みで紹介していただきました。

  • GPU上にArrow互換な形式でデータを持つ
  • pandasライクなデータフレームのライブラリcuDF
  • scikit-learnライクな機械学習API cuML
  • グラフ解析→cuGraph
  • ディープラーニングはこれまで通り
  • 可視化→cuXFilter

cuDF, cuMLともに本体をC++実装して性能を確保し、インターフェースをPython実装して、既存パッケージライクなAPIを実現しているそうです。
pip, conda対応しているので、すぐに使えるのもいいですね。

感想

会場の高級感に終始圧倒されていました。
食事も豪華でおいしく、なんとミシュランに載るほどだそうです。

Wi-Fi接続などはホテルのスタッフさんがサーブの中で対応され、実はボランティアの出る幕はあまりありませんでした(十分にトークを聞くことができました)。
あまりに多くをいただきすぎていると感じているので、このレポートブログや、ツイートで盛り上げに貢献できればと思います。
2日目も(途中までですが)よろしくお願いします。

告知 | 若手エンジニアで書く合同誌にKaggleタイタニックコンペでアウトプットして #技術書典6 に参加します #spzcolab

はじめに

今週末4/14は技術書典ですね、nikkieです。
実は今回初めて書く側に回ったので、告知記事を書きます。
当日お時間がありましたら、く17「サポーターズCoLab(サポーターズコラボ)」まで立ち読みにいらしていただけると嬉しいです。

サークル概要

執筆経験のないメンバーを集めて技術書を書いてみた、いわゆる「やってみた本」です。

技術書を書いたことないから書いてみたい、このテーマなら書けそうだけど一人で出版するのは不安、という声にこたえる形で、「みんなで書けば怖くない」というテーマの下、多ジャンルの合同誌を執筆することにしました。

そもそものことの始まりは。。

【サポーターズ】CoLabのみんなで技術書デビュー!しちゃおう! - サポーターズCoLab

昨年11月末のこちらのイベントまで遡ります。
昨年10月に開催された技術書典5は来場者1万人超えと大盛り上がりでしたね。
技術書典4から買う側参加していますが、「いずれ書く側でも参加したい」と考えるようになりました。

サポーターズCoLabは若手(20代)エンジニアのコミュニティです。
毎日勉強会が開かれており、最新技術のキャッチアップ目的1でちょくちょく参加しています。
合同誌を書こうという企画に「面白そう!」と参加を決めました。

集いし5人の執筆者たち

私以外の4名の参加者を紹介します。
Go, Laravel, Python, ランサムウェアと多岐にわたるテーマになっています!
様々なトピックが読めるのが多ジャンル合同誌の売りだと思っています。
日本語レビューで一通り読んでいますので、簡単な感想つきで紹介します。

ひろのぶさん

ランサムウェアについて執筆されています。
全然知らない世界で、衝撃的な内容でした。

サポーターズでは無線LANについて登壇されています。

Psyduckさん

PythonSpotifyのプレイリスト生成の開発について執筆されています。

開発で工夫した点が読めるのが魅力的でした。
「こういうアウトプットの仕方もあるのか」と参考になります。

po3rinさん

GoについてQiitaやLTで精力的にアウトプットされているpo3rinさん。
この本ではGo + OpenAPIについて執筆されています。
OpenAPIを初めて知った私は「こんな簡単にAPIが作れるのか!」と衝撃を受けました。

また、執筆中に画像のグレースケール変換が必要になり、パッケージとして実装してくださるなど、Goを使って執筆陣のサポートもしてくださいました(多謝)。

おかしょいさん

Laravelのtipsについて執筆されています。

Laravelに馴染みがない私ですが、ログの設計が特に参考になりました。
他のWebフレームワークにも読み替えられる内容だと思います。

nikkie: Kaggleタイタニックコンペで交差検証・グリッドサーチ

私は、Kaggleタイタニックコンペについて執筆しました。
1月と3月にサポーターズCoLabで開催したハンズオンを元にしています。
1月:【サポーターズ】機械学習に興味ありますか?Kaggle始めたいですか?タイタニックでもいいですか? - サポーターズCoLab
3月:続・機械学習に興味ありますか?Kaggle始めたいですか?タイタニックでもいいですか?【勉強会】 - サポーターズCoLab

ハンズオンは入門者向けとし、機械学習の基本的な部分に絞って実施しました。
合同誌では、ハンズオンの内容に「交差検証」や「グリッドサーチ」を追加して執筆しました。
執筆を通して、交差検証でモデル作成用データをまんべんなく使い、グリッドサーチでモデルをしらみつぶしに試して、一番性能の高いモデルが作られるということに気づきました。

ソースコードはKernelに公開しています:

解説やコメントはほとんどありませんので、「解説が読みたい!」という方は、ぜひ く17 までお越しください(立ち読みだけでもありがたいです)。

おわりに

技術書典告知記事は以上になります。
立ち読みだけで構いませんので、く17までお越しいただけると嬉しいです(なお、私がブースに居るかは未確定です)。

ひとまずここまで来れてホッとしています。
技術書典の後、執筆振り返り記事を予定しています。

「夢いっぱい、本いっぱい」のイベントで皆さまによき出会いがありますように。


  1. 私のDockerへの理解が深まったのは、サポーターズCoLabで定期的にDockerの勉強会に通ったのが大きかったです。

イベントレポート | Django Girls Japanの月次勉強会でコーチをしてきました(2019年3月) #djangogirls

はじめに

いつも心は虹色に! nikkieです。
3/30にDjango Girls Tutorialを使った勉強会のコーチをしてきました。
参加者の方の質問に答える中で学んだことをレポートとしてお送りします。

f:id:nikkie-ftnext:20190331122559j:plain

勉強会の概要

PythonでWebアプリを作ろう [女性対象/男女コーチ◎] 2019.3 - connpass

Django Girls のチュートリアルを使って、一緒にWebアプリケーションをつくります。
コーチ・メンターが、躓いたところや、分からないところはサポートします。

レベル別にチームを分けて勉強するので、 はじめてプログラミングに挑戦する方も、焦ることなくイチから学ぶことができます。

Django Girlsにはチュートリアルの翻訳やワークショップでのコーチで関わっています。
予定が合ったので、数カ月ぶりにコーチ参加しました。

解決した質問

もしよろしければ以下の観点でお読みください。

  • 「もしこういうエラーが出たらここを見ればいいのか」とFAQ的に読む
  • Djangoをご存知の方はどこが原因か考える(全3題のクイズ形式)

1. 作ったblog/urls.pyについてModuleNotFoundError

この中で発生:Django URL · Django Girls Tutorial

エラーメッセージはNo module named 'blog.urls'(mysite/urls.pyのpath('', include('blog.urls')),で発生)
チュートリアルに沿って作ったblog/urls.pyが見つからない?🤔

作成したblog/urls.py

from django.urls import path, include
from django.contrib import admin

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('blog.urls')),
]

どうやらrunserverした状態でblog/urls.pyを作成(新規追加)しても、反映されないようです(runserverは落ちたまま)。
Ctrl+Cでrunserverを終了し、再度runserverすると解決しました。
(runserverでは既存のファイルの変更は反映されますが、新規追加ファイルが反映されないことがあると理解しています)

2. migrateしたらModuleNotFoundError

この中で発生:Djangoモデル · Django Girls Tutorial

エラーメッセージを見ると、staticfilesblog がインポートできないとのこと
staticfilesblog?🤔

原因箇所(mysite/settings.py)

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles'
    'blog'
]

原因:INSTALLED_APPSの'django.contrib.staticfiles'の後ろにカンマがない
そのため、後続のblogという文字列と連結して扱われていた。

文字列の要素からなるリストでカンマを忘れると、連結した文字列として扱われます(bcに注目ください)。

>>> ['a', 
...  'b'
...  'c']
['a', 'bc']

3. published_dateを更新しないpublishメソッド

この中で発生:Django ORM(クエリセット) · Django Girls Tutorial

前提:published_dateに値を持つ記事がない状態

>>> post = Post.objects.get(title="Sample title")
>>> post.publish() # published_dateを設定しているはず
>>> Post.objects.filter(published_date__lte=timezone.now())
<QuerySet []> # 現在時刻以前のpublished_dateを持つ記事がない→値が設定できていない?

原因箇所(blog/models.py)

    def publish(self):
        self.published_date = timezone.now()
        self.save

原因:self.saveの後ろにカッコ())がない
そのため、saveメソッドが実行されていない

Anacondaでの環境構築

AnacondaでPythonをインストールした方が、Django Girls Tutorialをやる場合、conda install読み替えDjangoをインストールすることをオススメ1します。
参考:Djangoハンズオンの環境構築で書いた記事:環境を分離してDjangoの開発環境を作る(Python3系・Django2.1系) - Qiita
Anacondaの方は、 Djangoのインストール · Django Girls Tutorial にあるrequirements.txtやpip install無視してください

Django Girls Tutorialの手順

  1. python.orgからPythonをダウンロードしてインストール
  2. venvモジュールで仮想環境を作成
  3. requirements.txtを用意して、Djangopip install

AnacondaでPythonを入れていて、venvモジュールで仮想環境を作るとエラーが発生することが多い印象です。
この日、私が知る限りで2件ありました。(一例:sqlite3用のモジュールが読み込めないというエラーが出た)

エラーの内容が同一ではないので、Anacondaとvenvモジュールが原因かは断定できない2のですが、conda installでDjangoをインストールして進めていただいたところ、エラーは解消したようです。

「データ分析からPythonを始めてDjangoへ」という方が増えている印象なので、Django Girls TutorialにAnaconda向けの環境構築方法は必要そうですね。(言い出しっぺの法則で提案してみようかな。まずはIssue探しから)

Anacondaに関してこの日学んだこと

関連情報

私が関わっているものも宣伝させていただきました。

感想

やはり人に教えることは自分の学びにもなりますね。

Django Girlsでお世話になっているkaizumakiさんから、刺激的なIssueを共有していただきました。
(今後ハンズオンを開く機会があったら試してみたいです)

終わったあとの懇親会も盛り上がり、楽しいひと時でした。
(コーチ参加者同士で「どう教えるか」というトピックになると、すごく盛り上がりますね!)

参加者、コーチ、運営の皆さま、ありがとうございました。

この記事のアイキャッチは以下から利用しました。魅力的な写真素材をありがとうございます:
Photo by Startup Stock Photos from Pexels


  1. 参考情報:Conda コマンド - python.jp

  2. sqliteのエラーのケースは、python.orgからインストールしたPythonとAnacondaでインストールしたPythonが共存していました(Windows 10)