蛇ノ目の記

技術のことも。そうでないことも。

「暗号解読」を読んでるのでシーザー暗号をPythonで書いてみる

最近、サイモン・シンの「暗号解読(上)」を読んでいる。主にライブ開演待ちの時間に読む程度なのでなかなか読み終わらない。 硬いタイトルだけど、暗号理論の難しい話は無くて紀元前から始まる暗号にまつわるエピソードがメインになっている。この手の科学読み物的な本はかなり好み。 シーザー暗号やらヴィジュネル暗号、エニグマまでが今のところ登場していて、それぞれのエピソードと並んでアルゴリズムについても触れられている。というわけで今回はシーザー暗号をPythonで書いてみる。

シーザー暗号 is 何

ユリウス・カエサルが使ったことからシーザー暗号と呼ばれている。 "A" →"C", "B" → "D" というように平文のアルファベットに常にひとつのアルファベットが対応する単一換字式暗号という種類の暗号。平文に含まれるアルファベットを平アルファベット、暗号に含まれるアルファベットを暗号アルファベットと呼ぶ。

シーザー暗号では、平文を暗号化するときに各文字をアルファベット順で何文字シフトするか、というのを鍵にする。

例えば、鍵が2であるときHello world は各文字を2つシフトさせて jgnnqyqtnfとなる。

このときの平アルファベットと暗号アルファベットの対応は以下のようになる。

平アルファベット a b c d E ...
暗号アルファベット C D E F G ...

Pythonでシーザー暗号

文字をシフトさせると聞いて、初めに思いついたのがord()Unicodeコードポイントに変換、そこに鍵となる値を足し、chr()で文字列に戻すという方法だった。

>>> ord('a')
97
>>> chr(ord('a')+2)
'c'

しかし、この場合zを暗号化するとUnicodeでこれらの文字の2文字隣にコードされている文字(=|)になってしまって具合がよくない。

>>> chr(ord('z')+2)
'|'

そこで、string.ascii_lowercaseを使ってアルファベット26文字を取得。これを平アルファベットとする。 暗号アルファベットはself.plain_alphabet[self.key:] + self.plain_alphabet[:self.key] のように、平アルファベットのkey文字目移行のスライスと、key文字目までのスライスを組み合わせて作る。暗号化は平文の各文字の平アルファベット上の位置を、暗号アルファベット上の位置に置き換えることで行う。

import string

from typing import List


class Caesar:
    def __init__(self, msg: str, key: int):
        self.msg = msg
        self.key = key

    @property
    def plain_msg(self) -> str:
        return ''.join(
            [c.lower() for c in self.msg if c.lower() in self.plain_alphabet]
        )

    @property
    def plain_pos(self) -> List:
        alphabet_dict = {}
        for idx, c in enumerate(self.plain_alphabet):
            alphabet_dict[c] = idx
        return [alphabet_dict[c] for c in self.plain_msg]

    @property
    def plain_alphabet(self) -> str:
        return string.ascii_lowercase

    @property
    def encrypted_alphabet(self) -> str:
        return self.plain_alphabet[self.key:] + self.plain_alphabet[:self.key]

    def encrypt(self) -> str:
        # ここでは暗号は大文字で表す
        return ''.join(
            [self.encrypted_alphabet[pos] for pos in self.plain_pos]
        ).upper()

    def decrypt(self) -> str:
        # ここでは平文は小文字で表す
        return ''.join(
            [self.plain_alphabet[pos] for pos in self.plain_pos]
        ).lower()

アルファベット26文字すべて登場することから、暗号化がわかりやすくなるのでフォントの例文によく使われるアレを使う。こういうのをパングラムって言うらしい。

鍵は2なので t は 2文字シフトしてV に、hも同様に2文字シフトしてJに暗号化されている。、zは一周してBに、yAに暗号化されている。

>>> from caesar import Caesar
>>> msg = 'The quick brown fox jumps over the lazy dog'
>>> key = 2
>>> caesar = Caesar(msg=msg, key=key)
>>> cipher = caesar.encrypt()
>>> cipher
'VJGSWKEMDTQYPHQZLWORUQXGTVJGNCBAFQI'
>>> plain = caesar.decrypt()
>>> plain
'thequickbrownfoxjumpsoverthelazydog'

というわけでシーザー暗号をPythonで書いてみる話だった。

初心者の課題とかにもいいかも、とか思った。

月刊推し活まとめ 2020年1月号

2020年の目標を立てたりすることもなく、いきなり推し活まとめ。

今年から参加したイベント日程、会場、チケット代、チェキ枚数をまとめるということを始めたので、月刊で「推し活まとめ」やっていけそう。

日付 目当て イベント名 会場 チケ代 チェキ枚数
1/4 sora tob sakana Z新年会 フジさんのヨコ 2000 0
1/5 Maison book girl Solitude HOTEL ∞F LINE CUBE SHIBUYA 5500 0
1/12 sora tob sakana, ヤなことそっとミュート Pop'n Party 新宿LOFT 2500 神﨑風花2, なでしこ1
1/13 sora tob sakana amiinA × sora tob sakana 2MAN LIVE ‘’binary star’’ 下北沢GARDEN 3000 1
1/17 nuance cry for the moon vol.1 青山 月見ル君思フ 2500 0
1/18 sora tob sakana 照井順政生誕祭 渋谷REX 3000 全チェキ1
1/19 sora tob sakana DMM VR THEATER presents Future LIVE DMM VR THEARTER 3500 2
1/20 sora tob sakana 月面の遊覧船~74匹目 恵比寿CreAto 2000 3
1/25 sora tob sakana PERFECT MUSIC presents 20200125 代官山Unit 3000 2
1/26 sora tob sakana リリイベ タワレコ博多パルコ 0 1
1/26 sora tob sakana IDOL by...! 2nd ANNIVERSARY evoL by GRANDMIRAGE 4000 2

※ チェキ枚数が数字のみの箇所は言うまでもなく神﨑風花

今月の風花ちゃんとのチェキ合計は11枚(全チェキ含む)。年始は風花ちゃんがインフルエンザのため欠席が続いたのでチェキ始めは1/12となった。

この調子でいけば10月末には100枚に到達できそう。

1/26のIDOL by...!は博多開催だったんだけど、東京でチケット発券するの忘れてて当日の朝に福岡空港セブンイレブンで発券した。前もって発券しておこうな。あと帰りの便がオサカナちゃんと被るのワンチャンあるのでは、と思ったけどそんなことはなかった。

スプレッドシートからコピペしてもMarkdownのテーブルにならないので、スクリプトを書いて対応した。

# スプシのコピペをlist.txtとする
with open('list.txt', 'r') as f:
    for line in f:
        print('| ' + line.replace('\t', '|').strip() + ' |')

2019年を振り返る

年の瀬なので今年を振り返ってみる。という去年とまったく同じ書き出し。

ところで2019年の漢字は「推」です。

この写真はPyCon TW 2019で行った中央研究院のドア。

激推しし始めたのは今年からなので圧倒的成長。ライブ何回行ったんですかね。もうわからない。来年からはチケット整理の意味合いも含めてスプレッドシートで管理しようと思う。

ささやかな祝祭リリイベ、TIFの辺りから本気出し始めた気がする。名前認知はスタートラインとかいう謎の真理に到達したのも同じく夏頃。2020年はさらに推していくぞ。

仕事

今年は印象に残っている案件はPython3+Django 2.2+Ubutu 18.04移行。すべて同時に上げたものだから大変だった。たしかDjangoのドキュメントに推奨する上げ方が書いてあったはず。なぜ読まなかったのか。外部ライブラリの数が少なかったのはよかった。とはいえ、Djangoの振る舞いが変わったりしていて、公式ドキュメントを見たりソースコードを読んだりと結構苦戦した。なお、本番稼働はこれからなので記憶を取り戻しつつ、本番環境構築をやる仕事がそのうちある。

そして今はOracleSQLからMySQLに置き換え、それをSQLAlchemyでクエリを組み立てるということをやっている。SQLよわよわなので悲鳴を上げつつ、Oracleいろいろできすぎやろってキレたりしている。あとはRubyで書かれたAPIPythonに置き換えたりもしている。実はRubyを読むのは初めて。

他はPython研修のTAとして名古屋に行ったり、2018年から引き続きの会社さんの新人研修でもTAしたりした。

カンファレンス

PyCon mini Sapporo 2019

PyCon mini Sapporo 2019にてカンファレンス初登壇を果たした。

nao-y.hatenablog.com

このとき発表したライブラリは現在、完全に情熱が絶えており開発がストップしている。そのうちやる気出して、型アノテーション書いたりDocstring充実するなどコードをもっとよくしたり、対応できてないAPIを実装したい。どうやったらやる気出てくるんですかね。推し事に情熱注ぎすぎてなんかいっぱいいっぱいです。

ギリギリまでコードを書いたり、資料作ったりして徹夜状態で飛行機乗ったら貧血起こして死ぬかと思った。冷や汗出るし視界真っ暗になるし、ほんとやばかった。あと寒い中、小樽の運河沿いでビール飲んだ結果として風邪引いた。アホかな。

前日は有給とって準備しながら、夕方にはsiraphのライブに行き、帰宅後に徹夜したんだった。やっぱアホだった。まあライブの開演待ちの時間でアイデア浮かんだのでセーフ。

PyCon JP 2019

3年目のスタッフ参加。

nao-y.hatenablog.com

2年ぶりにオープニング・クロージングで少し喋ったり、飛び込みLTの司会をするなどしていた。LTの繋ぎってめっちゃ難しいね。

あとPyCon JPスタッフとしてgihyoさんでレポート記事を書かせていただきました。

gihyo.jp

PyCon TW 2019

PyCon TW初参加。そして海外LTデビューを果たした。

(Sapporoと同じネタで)Proposal出してたけど、厳しいレビューの前にあえなく敗退。それでもLTできたので実質海外登壇デビュー。

nao-y.hatenablog.com

blog.pyq.jp

日本勢で「Do you know PyCon JP ?」を被せていく悪ふざけをしたのは記憶に新しい。

PyCon SG 2019

去年のAPACに引き続き1年ぶり2回目のシンガポール海南鶏飯が美味しいので好きな国です。

nao-y.hatenablog.com

blog.pyq.jp

ほんとはここで本当の海外登壇デビューをキメるつもりだったんですが、CfPの締切が早まるという予想外の事態により、そもそもProposal出せず。PyCon TWに出したやつをブラッシュアップして出そうかな、と思ってた矢先だった。やっぱ早めに出さないとダメっすね。

nikkieとのシンガポール観光でマリーナベイサンズの上からの眺めを堪能したり、二人揃ってルーレットで負けたりして楽しかった。

その他

あれ、去年って何書いてたんだろう。

nao-y.hatenablog.com

ポーカーとか写真とか音楽について書いてますね。ポーカーは最近全然やれてないし、高田馬場や高円寺でやってるやつにも参加できてないです。推し事への情熱があまりに強すぎる。

写真はFlickr見ていただけると嬉しいです。春頃には友人の友人がモデルをやってくれてポートレート撮影できた。ありがとうございました。

Nao Y. | Flickr

音楽

音楽は…お察しです。推してます。神﨑風花ちゃん激推しです。Spotifyが生成する2018年nao_yまとめによると300時間くらいオサカナ聴いてたらしいっすよ。狂気。

www.youtube.com

今年から聴き始めたところだと、nuance。うちの近所の居酒屋で店主さんが流してて知ったグループ。

www.youtube.com

TIFで知ったlyrical school

www.youtube.com

去年から聴いてるヤなことそっとミュートはレイラインが自分の中でキている。先日、初めてワンマン行ってきた。なでしこさんマジかっこいい。

www.youtube.com

他には最近、来年にメジャーデビューすることが決まったフィロソフィーのダンスMaison book girlとの対バンとおとはす生誕祭に行った。

www.youtube.com

Maison book girlは、4/14に人見記念講堂で開催されたワンマンSolitude HOTEL 7Fとフィロのスとの対バンを見た。

www.youtube.com

1/5に開催されるSolitude HOTEL ∞Fがオサカナ定期公演と被っているんですが俺はどうすれば。体が足りない。

アイドル以外だと、ずっと真夜中でいいのに。

www.youtube.com

最近は4s4kiとmaco maretsがお気に入り。 なんていうんでしょうね、なんかこういうの好き。上の「眩しいDNAだけ」も似た雰囲気だしね。

www.youtube.com

www.youtube.com

ここ最近のは反映されてないけど、Spotifyによる2019年nao_y再生数ベスト100プレイリスト。

Your Top Songs 2019 on Spotify

使い始めた頃によく聴いてた曲なんかが入ってて既になんか懐かしい。

音楽の趣味を押し付けたあたりで2019年のまとめを終わります。どれか一つでも刺さったら嬉しい限りです。

なんか去年より振り返り方が雑な気もするけど、ここらで2018年の振り返りを終わりにする。

と2018年の自分が書いているけど、今年はさらに雑になったぞ。

というわけで、2019年はありがとうございました。

いや、2010年代終わるんですね。やばい。知らんけど。

2020年もよろしくお願いします。

PyCon SG 2019に行ってきた話 (主に観光

10/10~12にかけて開催されたPyCon SG 2019に行ってきた。

pycon.sg

10/10, 11がカンファレンス, 10/12がチュートリアルという構成。詳しくは後述するけどカンファレンスのみ参加。

例によって真面目な話はPython学習チャンネルの記事を見てください。

blog.pyq.jp

3行でカンファレンスの感想。

TL;DR

本編

今回の日程は10/9~10/13の4泊5日。 id:nikkie-ftnextと共に行動した。なんとかsoftという人は不運にも参加できず。

1日目

今回の宿。カーテンを開くとシンガポールの街並みが、なんてことはなく吹き抜けのロビーが見える。つまり陽の光が差さない。たぶん日本だと建築法とかそんなんで怒られそうな作り。

宿はChinaTown駅周辺。少し歩くと中華街がある。

中華街……?お前らどう見ても中南米っぽいけど。

地下鉄でOrchardに移動。中華街から一変して高層ビル群。

去年とは違って、今年は1日目から晴天。いわゆるシンガポールの画。

宿泊して無くても展望台には上ることができる。お値段なんと23SGD(1800円程度)。高いわ。でもスカイツリーのてっぺん行くよりは安いのかな。知らんけど。

今年もマリーナベイサンズのカジノへ。100SGD持って2SGDルーレットに挑戦。

途中でちょっと増えたけど、結局ゼロに。引き際覚えろ。というかポーカーでいうところの50BBスタートなのでつらみがある。100BBはあった方がいい。

nikkie氏とカジノのつらみを味わったあとはMaxwell Food Centre海南鶏飯。なお、今回の旅では合計3回食べている。天天海南鶏飯が一番美味い。

シンガポールでも天気の子が上映されているっぽい。天気の子めっちゃ好きな推しに思わずInstagramのDMで送ってしまうなどした。仕方ないね。

日本からのPyCon SG参加勢とシンガポール在住勢で中華屋さん(津津餐室)で夕飯。鶏肉美味しいです。

二次会はThe Armouryクラフトビールシンガポールは酒が高いけど、結構クラフトビールの文化があるっぽい。

China Townに某名探偵が。版権ガン無視イラストかな、と邪推したけど「紺青の拳」コラボイラストらしい。

PyCon SG 2019会場のRepublic Polytechnic。

めっちゃ広いし近代的でおしゃれ。日本の建築家によるデザインらしい。

真面目な話はPython学習チャンネルに丸投げしているので、カンファレンスの話は一切しない。

2日目もビール。ここは去年も行った川沿いのシャレオツクラフトビールスポット。

時間が少し飛んで4日目。nikkie氏がチュートリアルに向かったので一人で朝飯へ。Ya Kun Kaya Toastでシンガポール名物のカヤトースト。カヤというのはココナッツミルクと卵、砂糖で作られたジャム。甘い。半熟卵に浸して食べるスタイル。美味しいのでシンガポール行ったらぜひ。

歴史からも経験からも学べない愚者なのでセントーサ島のカジノへ。スロットだけやったけど全然ダメだった。あとスロットあんまり面白くない。

チュートリアルが終わったnikkie氏と合流して観光へ。アラブ街は去年も来たけど、今年はモスクの中を見に行ったりした。狭い街にいろいろな文化が混在しているシンガポールの雰囲気やっぱ好き。

夜はtakanoryさんたちと共にPyCon SGスタッフディナーへ。シンガポールだけど台湾料理の鼎泰豊。美味しかった。ありがとうPyCon SGスタッフ。

なんかすごい量を注文したっぽくて炒飯3皿、豆苗炒めとかいろいろ出てきた。Keynote speakerのRich Jones氏とスタッフと日本のアニメの話をした。Ghost In the ShellとかCowboy Bebop超クールだよね、みたいな話をした気がする。

そして蒸籠タワーが築かれた。

他の参加者は二次会行ったけど、シンガポールの夜景を見ておきたくて徒歩でマーライオン公園へ。映える。

そこからLittle Creatures Brewingに移動してまたクラフトビール

最終日。チャンギ空港に併設されたショッピングモールの中には滝があったりした。

というわけでシンガポールの話でした。

アイドルで理解するYoutube Data API - 動画情報取得編

アイドルで理解するhogehogeシリーズ第2弾です。

PyLadies Tokyo 5周年パーティのLT大会で@meliさんが発表した、Youtube Data APITwitterとLambdaを使って「Pythonで推しの役に立ちたい!」というLTに刺激を受けて、Youtube Data API面白そうじゃんと思うも使ったことなかったので使い方を書いてみる。

TL;DR

3行でおk

下準備

  1. Google API Consoleでプロジェクトを作成する。

  2. API Consoleの認証情報からAPI Keyを作成する

  3. ダッシュボードのライブラリからYouTube Data API v3を選択して、APIを有効にする

これでYoutube Data APIを使う準備が整った。

今回はOAuthを必要としないAPIを使っていく。

APIを叩くのを簡単に済ませたいのでrequestsを使う。仮想環境を作ってrequestsをインストールしておく。

$ python3 -m venv venv
$ . venv/bin/activate
(venv)$ pip install requests

API Keyはconfig.pyに書いておいて、複数のスクリプトで使いやすくしておく。

# config.py
API_KEY = YOUR API KEY

余談

requestsのドキュメントでレスポンスをJSON形式で取得するメソッドを検索したら、

このサイトは安全に接続できません

2.python-requests.org から無効な応答が送信されました。

ERR_SSL_PROTOCOL_ERROR

とか出てきた。Kenneth氏〜

動画の情報を取得してみる

動画情報のAPIVideos エンドポイントにまとめられている。

developers.google.com

その中でも情報の取得にはVideos:listを使う。

developers.google.com

GETメソッドを使う。

GET https://www.googleapis.com/youtube/v3/videos

Videos:listでは例えば以下のような情報が取れる。

  • snippet: 動画の基本的な情報(タイトルやアップロード日時、説明など)

  • ContentDetail: 動画の長さやアスペクト比、字幕の有無、各国でのレーティング状況など

  • statistics: 動画の統計情報(再生回数, 高評価・低評価の数など)

その他の情報はリファレンスを参照のこと。

一部の情報(fileDetail, processingDetail, suggestions)は動画の所有者しか取得できないので注意。

基本的な情報を取得してみる

パラメータのうち、今回は必須パラメータであるpartと動画IDのidを使う。

partはどの情報を取得するかを指定するパラメータで、snippetstatisticsなどをカンマ区切りリストで指定する。

まずはpartにはsnippetidにはsora tob sakana 3rdシングル「flash」のティザーMVのIDを指定する。

flashは11/13(水)に発売される新曲。先行配信は10/26(土)から始まったのでみんなチェックしような。

CDの方はアーティスト盤のジャケ写がめっちゃかっこいい。ポスター欲しくなる出来。

import requests

from config import API_KEY

URL = 'https://www.googleapis.com/youtube/v3/videos'

part = ['snippet']
ids = ['JTpFWzKGhFU']

payload = {
    'part': ','.join(part),
    'id': ','.join(ids),
    'key': API_KEY,
}

r = requests.get(URL, params=payload)
res = r.json()
snippet = res['items'][0]['snippet']
print(snippet['title'])
print(snippet['publishedAt'])
print(snippet['channelTitle'])
print(snippet['description'])

レスポンスはJSON形式で返ってくるため、requests.models.Response.json()で辞書形式にしている。

JSONの詳細についてはリファレンスのリソース表現を見てもらうとして、itemsフィールドに各動画の情報が格納されている。ここでは動画IDを一つだけ指定しているのでres['items'][0]を参照している。複数の動画IDを指定した場合は指定した順に格納される。

各動画の情報はさらに辞書形式になっている。ここにpartで指定した種類の情報が入っている。ここではsnippetのみなので、res['items'][0]['snippet']を参照している。

sora tob sakana/flash(Teaser)
2019-10-18T15:00:07.000Z
sora tob sakana Official YouTube Channel
【新曲「flash」CD発売に先駆けての先行配信決定】
2019年10月26日(土)より順次配信開始します。
各配信リンク先は追ってお知らせします。

==

2019年11月13日発売3rdシングル「flash」MUSIC VIDEOのティザーVです。

flash
(TVアニメ「ハイスコアガールⅡ」オープニングテーマ)
Lylic/music/arrange:照井順政

ーーMUSIC VIDEO STAFFーー
Director 斉藤友和(epoch)

Producer 須貝日東史(koe Inc.)

Cameraman 柳沼貴幸
Camera Assistant  横山穂高

Lighting Designer 二階堂 譲
Lighting Assistant 高谷英之 堀尾秀樹

Hair&Make(sora tob sakana Member) 横山 藍 
Costume Design/Styling 浅野実希

Choreographer MARIKA

Production Staff 平田樹生 木﨑 竣



=====================================================
sora tob sakana/flash
発売日:2019年11月13日(水)
<アーティスト盤>CD+DVD 1000749884 2,091円+税
=CD=
1.flash
(TVアニメ「ハイスコアガールⅡ」オープニングテーマ)
作詞・作曲・編曲:照井順政
2.パレードがはじまる
作詞・作曲・編曲:照井順政
3.踊り子たち
作詞・作曲・編曲:照井順政

=特典DVD=
「flash」 Music Video

=ジャケット仕様=
16Pブックレット
  ・ライナーノーツ
  ・イラストレーター「ayaka nakamura」「Megumi Fujita」
   による描きおろしのイラスト

<通常盤>CD 1000749885 1,182円+税
=CD=
1.flash
(TVアニメ「ハイスコアガールⅡ」オープニングテーマ)
作詞・作曲・編曲:照井順政

2.flash-TV Size-
3.flash-YMCK Remix- 

=ジャケット仕様= 
アニメ「ハイスコアガールⅡ」描き下ろしイラスト差し替え
ジャケット
8Pブックレット
=====================================================
【公式HP】http://soratobsakana.tokyo
【公式Blog】http://ameblo.jp/soratobsakana/
【公式Twitter】@soratobsakana
【公式Instagram】
  神﨑風花:@fuka_sakana
  寺口夏花:@natsuka_sakana
  山崎 愛:@mana_sakana
【レギュラー番組】
<ラジオ>文化放送「sora tob sakanaの飛ばなきゃ損損」(毎週木曜26時30分~27時)

通常盤にはRemixが入ってる。どっちも買おうな。

descriptionは普段、YouTubeで折り畳まれている部分。今回のようにとても長い場合がある。

動画の統計情報を取得してみる

partstatisticsを指定するだけ。とても簡単。

import pprint

import requests

from config import API_KEY

URL = 'https://www.googleapis.com/youtube/v3/videos'

part = ['statistics']
ids = ['JTpFWzKGhFU']

payload = {
    'part': ','.join(part),
    'id': ','.join(ids),
    'key': API_KEY,
}

r = requests.get(URL, params=payload)
print(type(r))
res = r.json()
stat = res['items'][0]['statistics']
pprint.pprint(stat)

statisticsはフィールドが少ないのでpprintで整形してすべて表示してみた。

{'commentCount': '68',
 'dislikeCount': '4',
 'favoriteCount': '0',
 'likeCount': '625',
 'viewCount': '13296'}

投稿から1週間程度で1万再生以上。いいぞ。

複数の動画を扱う

最後にsora tob sakanaの3つの動画を対象に、複数動画の情報を取得してみる。

import requests

from config import API_KEY

URL = 'https://www.googleapis.com/youtube/v3/videos'

part = ['snippet', 'statistics']
ids = ['JTpFWzKGhFU', 'K_Qx7EE4ucY', 'MyikIWSAEE4']  # flash(Teaser), ささやかな祝祭, knock!knock!

payload = {
    'part': ','.join(part),
    'id': ','.join(ids),
    'key': API_KEY,
}

r = requests.get(URL, params=payload)

res = r.json()

for item, _ in zip(res['items'], ids):
    print('-' * 50)
    print(item['snippet']['title'])
    print(item['snippet']['publishedAt'][:10])
    print(item['statistics'])

ISO 8601(YYYY-MM-DDThh:mm:ss.sZ)形式のpublishedAtを10文字目までスライスしてYYYY-MM-DDにしている。

sora tob sakana/flash(Teaser)
2019-10-18
{'viewCount': '13300', 'likeCount': '625', 'dislikeCount': '4', 'favoriteCount': '0', 'commentCount': '68'}
--------------------------------------------------
sora tob sakana/ささやかな祝祭(Full)
2019-07-06
{'viewCount': '191270', 'likeCount': '3129', 'dislikeCount': '88', 'favoriteCount': '0', 'commentCount': '269'}
--------------------------------------------------
sora tob sakana/knock!knock! (Full)
2019-02-06
{'viewCount': '299740', 'likeCount': '3969', 'dislikeCount': '98', 'favoriteCount': '0', 'commentCount': '434'}

動画情報の格納順はIDを渡した順と一致していることがわかる。

Videosエンドポイントを使って動画の情報を取得する方法がざっくりわかったところで今回はここまで。

次回は特定のチャンネルから動画IDを取ってくる方法を書きたい思っている。

PyCon TW 2019に行ってきた話(だけど主に観光の話

【2019/11/16追記】

PyQ公式ブログPython学習チャンネルにて真面目な方のPyCon TW 2019参加レポートを書きました。

blog.pyq.jp


PyCon JP 2019の疲れも取れぬまま、台北に飛んでPyCon TW 2019に参加してきた。という話をPyCon SG 2019の会場で書いている。

LCCはアラサーの体には堪える。なんなら4時半発なので羽田空港で夜を明かしてダメージ倍増。

tw.pycon.org

真面目な話はいずれ公開されると思うので、ここでは9/18の台北観光メインで書く。

実質、訪台中のツイートまとめ。

人生2度目の台湾。

上陸直後の台湾メシ。素麺みたいな細さのやつ。

nikkie氏と合流するため、地下鉄を乗り継いで桃園空港から松山空港へ。台北は地下鉄が発達してるので移動が割と楽。

桃園からのMRTの終点、台北車站にギリギリ隣接といえなくも無い距離で隣接している松山新店線の北門駅に移動して、南京復興駅へ。

南京復興駅から文湖線で松山機場へ。

nikkie氏と合流したついでにPyCon JP 2019座長の吉田さんと会えたので3人行動に切り替えて、台北市内にUberで移動した。

魯肉飯食いたいという気持ちで探したよさげな店のある龍山寺へ。美味いけど見た目が映えない。

ローカル感あるいい感じに雑感のある店だった。

四方阿九魯肉飯 (万華) 最新のレストランの口コ(2019年) - トリップアドバイザー

その後は龍山寺へ。

龍山寺でひいたおみくじ。後述するメイドカフェメイドさんにどんな内容か聞いてみたらだいぶいい感じらしい。上上って書いてあるし、納得感ある。

ここからは吉田さんと別れてnikkie氏と行動。台北オタク文化に触れるため、秋葉原と原宿を足して2で割った雰囲気の西門町へ。

ご当地キャラの垂れ幕があった。かわいい。林默娘っていうらしい。なんて読むのかは知らない。

台北アニメイトへ。翻訳されたラノベとか漫画がメインだけど、台湾独自のオタクコンテンツもあった。「食用系少女」って字面が危険な感じだけど、台湾グルメの擬人化なのでご安心。

こっちは鉄道むすめの台湾バージョンみたいな雰囲気。

@doi-tさんに教えてもらったマンゴーかき氷の店へ。一人で余裕で食べれる量やろ、と高をくくっていたら地獄を見た。ひたすら冷たい。美味いけど冷たい。

隣のテーブルに来た日本人の学生3人組は分けて食べるとのことだった。賢いと思ったら、彼らも一度は地獄を見ていたらしい。

暖かいものを飲んで冷えた体を温めようとメイドカフェへ。最初から行く予定だったけども。

台湾でのメイドカフェ探しは 台湾女僕珈琲(メイドカフェ)まとめ|もえ氏(萌大小姐)|note が役に立つ。

ここのメイドさんはカタコトながら日本語が話せる娘だったのでとても助かった。というか可愛くてカタコト日本語はポイント高い。チェキも撮った。

この日の夜は日本からのPyCon TW参加勢と合流して、青葉という台湾料理の店へ。

この翌日からPyCon TW 2019が始まるわけだけど、そちらの話は近日公開予定。

Uberはいいぞ

というかタクシー怖い。

PyCon TWの会場、中央研究院は南港展覧場駅からバスないしタクシーで行く距離にある。

カンファレンス初日、駅の前に停まってたタクシーを使おうとして運転手の爺さんにGoogle Mapで目的地を見せるも上手く伝わらず。どうやら字が小さいと言っているようだったので、テンパりながらも拡大しようとし続けててたら数十メートル走ったところで爺さんがキレて降ろされてしまった。タクシーはコミュニケーションが必要になるのでUberが絶対おすすめ。

Uberなら英語話せる若い人もいるしね。最終日、クラフトビールの店から台北車站まで乗ったUberの運転手の兄ちゃんはとてもいい人だった。パイナップルケーキのおすすめの店とか、東京に行ったことあるけど日本感なかったので京都がよかったかも、とかいろいろ話した。

PyCon JP 2019とビープラウド入社3年目突入

ども

から始まる山崎愛構文は「アイドルで理解するTF-IDF」ではないのでやらない。

PyCon JP 2019

9/16(月)から9/17(火)にかけてPyCon JP 2019が開催された。

pycon.jp

スタッフ3年目の今年は2018年に引き続き、コンテンツチームに所属してポスターセッション(コミュニティ)の担当をやっていた。

コミュニティは去年の5つから5つも増えて日本各地+海外から11のコミュニティに出展していただくことができた。ポスターセッションのコアタイムにはどのコミュニティの前にも人だかりができていて、コミュニティメンバーとの交流やコミュニティ間の情報交換が行われていた。年に一度、日本国内外からPythonistaが集まるイベントだからこそできる貴重な機会を作ることができて本当に良かった。

コミュニティブースはPythonコミュニティが活動を紹介する企画で、南はPyCon Kyushu、北は札幌Pythonまで日本各地から6つのコミュニティが参加した。

PyCon JP 2018とBP入社一周年 - 蛇ノ目の記

あと、気づいたらオープニング・クロージングの案内を任されていた。2年前のように全体的な司会ではないものの、200~300人はいそうな会場で喋るのはとにかく緊張する。今度、風花ちゃんに会ったら緊張しないコツとか教えてもらおう。英語の発音をいろいろな人から褒められたのは嬉しかった(話すのが早いという課題もあるけど)。なお、英語喋れてる風なだけで聞き取れないので会話は成立しない模様。

査読付きLT・飛び入りLTの司会も担当した。次の発表者までの繋ぎをやるのがとにかく難しくて、繋ぐことを諦めてしまったのが反省点。2日目のLTでは接続が上手くいかないことが何度かあったりした。ああいったトラブルの対応も難しい。

LTといえば、2日目飛び込みLT、 @mizzsuggar0425による「PyCon JP 2018で勇気をもらってPythonエンジニアになった話」が最高にいい話だった。PyCon JPで聞いたLTに刺激を受けてPythonエンジニアになりました、だけでなく今はまだ自信が無い人もきっとやれる、というメッセージがとにかくエモい。来年、@mizzsugar0425の後に続く人がLTするなんてことがあったらきっと感動にあまりにむせび泣く。

speakerdeck.com

そして特に面白かったトーク@_sin_tanakaによる「Pythonでライブをしよう!FoxDotを使った新時代のPython活用法 」

ライブコーディング(コードを書く方ではなくコードを書くことでライブ演奏する)を行えるPythonライブラリFoxDotの概要とDEMO。音楽わからない自分でも曲作れそうと思えたし、simple-spotifySpotifyの楽曲データAPIを叩いてコードやスケール、BPMを取得してくれば好きな曲と同じコードとスケール、BPMを素材にして演奏したりできるなと考えた。

speakerdeck.com

FoxDotを使ってLightningTalkならぬLightningLiveもできそう。今度stapyでやってみようかな。

ところで、来年も引き続きスタッフをやるかどうか実は悩んでいる。飽き性なので数ヶ月に渡る準備の間にモチベーションが下がってしまうことが多々あって、他のスタッフに迷惑を掛けてしまっているのではないかと思う。本格的にPyCon JP 2020が動き出すまでに、モチベーションをある程度維持できるように工夫するか当日スタッフだけやるかを決めておこう。文化祭をやっているみたいで楽しいのでスタッフをやらない選択肢は今のところなさそう。

ビープラウド入社3年目突入

ビープラウドに入社したのがPyCon JP 2017の直後だったのでPyCon JPの季節になると自然とビープラウド歴も更新される。

最近はタスクをバラしてスケジュールを立てることの苦手さやコードレビュー依頼の雑さに直面していて、特に何かできるようになったという感じは実はあまりない。

とはいえ、(自分にとって)新しいことを経験して、多少は知識も増えている。例えば直近ではUbuntu14.04から18.04, Python2.7から3.7, Django1.11から2.2という3つの移行をやっていることもあってUbuntu(というよりsystemdやjournald)の知識を新たに得たり、Djangoソースコードを読むようになったりしている。 移行案件が終わったら、イチから開発する案件をやってみたいなとか思いつつ、休みが明けたら移行済みテスト環境の画面テストで出たバグとの戦いに精を出すことになる。

このあたりでPyCon JP 2019のざっくりまとめとビープラウド3年目突入の話は終わり。

さて、PyCon TW 2019に遊びに行くために羽田空港にいて、早朝便まで寝れる場所を確保しないといけない。