【Django REST framework】viewの中で使用するserializerを変更する

ModelViewSetなんかを使用していると、それぞれのアクション毎にserializerを変更したいことが多々あると思います。
日本語情報が少なくてベストプラクティスなのかどうかは疑わしいですが、クラスベースviewの中でserializerを変更する方法をとりあえずメモしておきます。

環境

Python 3.5.2
Django 1.9.7
djangorestframework 3.4.0

方法

get_serializer_classメソッドをオーバーライドし、アクション毎に異なるserializerを返却するようにします。
以下にlistretrieveで返却するフィールドを変えたserializers.pyviews.pyの簡単なコード例を示します。

serializers.py

class HogeSerializer(serializers.ModelSerializer):
    class Meta:
        model = Hoge
        fields = ('id', 'name')


class HogeRetrieveSerializer(serializers.ModelSerializer):
    class Meta:
        model = Hoge
        fields = '__all__'

views.py

from .serializers import HogeSerializer, HogeRetrieveSerializer

class HogeView(viewsets.ModelViewSet):
    queryset = Hoge.objects.all()

    def get_serializer_class(self):
        if self.action == 'retrieve':
            return HogeRetrieveSerializer
        return HogeSerializer

上記の例ですと、listの時はidとnameカラムのみが返却され、retrieveの時には、モデルの全てのフィールドが返却されます。
このように、get_serializer_classメソッドをオーバーライドすることで、アクションに応じたserializerを設定することができます。
今回はlistretrieveの例でしたが、他のアクションも同様にして、serializerを分けることが可能です。

参考

Generic views - Django REST framework
Django rest framework, use different serializers in the same ModelViewSet-open source projects tomchristie/django-rest-framework
Google グループ

【MySQL】一時的に外部キー制約を無効にする

下記のコマンドで無効化し、

SET FOREIGN_KEY_CHECKS=0;

必要な処理が終了したら、

SET FOREIGN_KEY_CHECKS=1;

これで元に戻す。

【MySQL】外部キー制約を削除する

制約の設定をしたものの、テストデータの投入段階でinsertを阻止してくる邪魔なforeign keyに悩まされたので、一時的に参照整合性の制約を削除します。

環境

MySQL 5.6

手順

まずは、テーブルに設定されている参照制約を確認しましょう。

mysql> SHOW CREATE TABLE something\G
*************************** 1. row ***************************
       Table: something
Create Table: CREATE TABLE `something` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `another_id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `somedb_something_a08cee2d` (`another_id`),
  CONSTRAINT `somedb_another_id_3a4999a1_fk_somedb_another_id` FOREIGN KEY (`another_id`) REFERENCES `another_table` (`id`)
) ENGINE=InnoDB CHARSET=utf8mb4
1 row in set (0.00 sec)

上記の結果を見ると、somethingテーブルの外部キーanother_idが、another_tableidに外部キーとして制約が設定されています。
これを削除するには、CONSTRAINTの次に書いてある文字列を指定して下記のコマンドを実行します。

mysql> ALTER TABLE something DROP FOREIGN KEY `somedb_another_id_3a4999a1_fk_somedb_another_id`;

もう一度SHOW CREATE TABLEを実行すると、外部キー制約の項がなくなっていることが確認できます。

参照

MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.1.17.2 外部キー制約の使用

【Python3】文字列変数をraw文字列で出力する

変数の中身のエスケープシーケンスは自動的に解釈されてしまいます。
例えば下記のようになります。

>>> s = '1\n2\n3\n'
>>> print(s)
1
2
3

変数に対してPythonのraw string記法は使用できません。
そこでreprを使用すると、

>>> print(repr(s))
'1\n2\n3\n'

このようになります。

参考

How to print raw string data from a variable - Python

6ヵ月間Netflixを契約した結果を残しておく

明日が更新日だから解約しなきゃ……

そう思いつつも、毎度解約を忘れてしまい、無駄にお金を払った結果を残しておこうと思います。

俺、不労所得者になったらまた契約するんだ……。

オススメのドラマシリーズ

ハウス・オブ・カード

f:id:taka_say:20160524191453j:plain
恐らくNetflix契約中に見た作品で一番気に入った作品。 Netflixオリジナル。
現在シーズン5まで公開中で、続編は制作中。 ホワイトハウス入りを目指す男の復讐心と野心を描いた力作。
ネット配信で公開されたドラマシリーズで初めてエミー賞を受賞したとか。
フランシスから視聴者への語りかけが段々とツボになってくる。

NARCOS

f:id:taka_say:20160524191532p:plain
実在の麻薬王パブロ・エスコバル麻薬取締官の戦いを描いた作品。 Netflixオリジナル。
現在シーズン1が公開されており、シーズン2も制作進行中である。
独特のテンポが好きだったシリーズ。
麻薬戦争の激しさを体感できる。

Breaking Bad

f:id:taka_say:20160524191653j:plain
ガンで余命宣告された化学教師のドラッグ売買物語。
シーズン4の6話まで視聴。
歯車が狂っていく様が面白い。

オススメの映画作品

WINTER ON FIRE

f:id:taka_say:20160524191708j:plain:w600
ウクライナ国民のデモから発展した革命運動を追ったドキュメンタリー作品。Netflixオリジナル。
生々しい運動の様を見て取れる。
この映像を見て色々と考えることもあるように思われる。

ビューティフル・マインド

f:id:taka_say:20160524191734j:plain:w300
実在のノーベル賞受賞数学者であるジョン・ナッシュを描いた作品。
前情報なしで見たほうが恐らく楽しめるだろう。

インターネットの申し子 天才アーロン・シュウォルツの軌跡

f:id:taka_say:20160524191746j:plain
インターネットの時代に生きた天才を追ったドキュメンタリー作品。
エンジニアはもちろん、それ以外の人たちが見ても楽しめると思う。
思考への良い刺激を体感するだろう。

フルメタル・ジャケット / プライベート・ライアン / ローン・サバイバー

f:id:taka_say:20160524191800j:plain:w300
ミリタリー系作品のオススメ群。
フルメタル・ジャケットプライベート・ライアンはやはり定番だし、比較的新しめのローン・サバイバーの映像も素晴らしい。

キャッチ・ミー・イフ・ユー・キャン

f:id:taka_say:20160524191819j:plain:w450
実在人物の自伝を基に制作された作品。
「天才詐欺師」とそれを追うFBI捜査官の物語である。。

ヒトラー ~最期の12日間~

f:id:taka_say:20160524191835j:plain
おっぱいぷるんぷる〜んで有名なあの映画。
ヒトラー役の鬼気迫る演技はやはり見所。

その他見た作品

レッドバロンは比較的面白かった印象。
U・ボートは長い。

割とドキュメンタリー系を多く見ていたことに書き出して気付いた。
この中だとグレート・ディベーターがオススメ。

STEVE JOBS 1995の中では、日本という言葉がジョブズから出てくるシーンもあるため必見。

  • アルゴ
  • BEAST OF NO NATION
  • 鋼の錬金術士 嘆きの丘の聖なる星
  • ゴッドタン キス我慢選手権 THE MOVIE

キス我慢選手権は少しユーモアが足りない感じがした。

見ようと思ってた作品

時間の関係で見られなかった種々の映像作品たち。
ドキュメンタリーとミリタリーが多めか。

まとめ

意外とたくさん見ていたような気もするし、大した数を見なかったような気もする。
映像作品を見るのは楽しいけど、やはり読書なんかと比べると時間あたりに得られるものが少ない。
趣味としてある程度はいいけど、見放題を無尽蔵に、という楽しみ方はやはりいけないなと感じた6ヵ月間でした。

余談

後から気が付いたけど、先に解約申し込んでおいても、契約終了日まで動画閲覧できるような……。

黒い家と青の炎を読んだ

久しぶりに小説を読了し、余韻に浸っている。
無性に気分を述べたくなったので殴り書き。

そもそものきっかけは、ゴールデンウィーク中にKindleで開催されていた角川フェアであった。 50%引き+20%のポイント付与ということで、何か面白い本は無いだろうかと探していた。

齋藤孝著の大人のための読書の全技術をはじめとして、反応しない練習 あらゆる悩みが消えていくブッダの超・合理的な「考え方」ペンタゴン式 ハードワークでも折れない心のつくり方といった、興味の惹かれる書籍をいくつか購入した。

そんな折、セール一覧の中に、貴志祐介の著作がかなりの数含まれていることに気付いた。
貴志祐介といえば、近年(というほど近年ではないが)アニメ化した新世界よりの著者という印象が強かった。 それと同時に、人伝に聞いたクリムゾンの迷宮の印象があり、一度読んでみたいと思っていた作家だった。

ようするに、Kindleセールで貴志祐介の作品が売られているというのは、私にとって幸運であった。

どのタイトルを購入するかで少し悩んだものの、結局黒い家と青の炎を選択した。 特筆する理由は無かったが、これらの本を読めば、貴志祐介の作品を感じられそうだと考えたからだ。

結果からいうと、この選択は成功だったように思う。まあ、どの作品を選んでも成功だった可能性は極めて高いように思われるが。

はじめに、黒い家を読んだ。
読書感想文などというものに熱心に取り組んだことがない経験上、的確な感想を述べることは難しい。 ただ、一言で表すなら、面白い、それに尽きる。 自分のイメージの中で暴れまわる登場人物の姿に、自分自身でハラハラするという現象に、我ながら胸躍った。

作中で恵が述べる、

問題は、あの人たちが共通して持っている病的なペシミズムなの。人生や世界に対して抱いている、底知れぬ絶望よ。彼らは、自分たちの見るものすべてに、その暗い絶望を投影するの。人間の善意や向上心が世の中を良くするなんていう可能性は、決して認めようとしないの。(中略)社会に大きな害毒を流しているのは、わかりやすい人格障害を持った人よりも、むしろ、そうした一見普通の人間なんだと思うわ

という箇所が特に印象に残った。
なんというか、ペシミズムという単語が頭に残る終わり方であった。

次に、青の炎を読んだ。
黒い家とは打って変わって、高校生が主人公の、少し甘酸っぱさを覚える作品である。
途中、思わず読み進めることが困難になる程に、主人公秀一の視点に同調してしまった。

西欧が『罪の文化』で日本が『恥の文化』を持っているとすれば、日本では、露見しない犯罪は、犯罪ではないことになるではないか。つまり、日本人は、民族的に、世界で最も完全犯罪に向いているのかもしれない。

という秀一の考えは、一見すると説得力がある。
しかし最終的には、単なる事実という重責に押しつぶされることとなる。
秀一がパラレルワールドの可能性を考えている時、私もまたその可能性を強く願ってしまった。 他人事とは思えない、切迫した感情の揺れ動きを感じた作品であった。
紀子かわいい。

個人的に好きな文章は以下。

良い曾根隆司とは、死んだ曾根隆司だけだが、今週のように、ほとんど意識を失った状態の曾根隆司も、ましな部類だとは言えた。

秀一が想像した未来。
回避するために選んだ道。
最期まで、ある種秀一らしさが一貫していた幕引きであったように思う。

どちらの作品にも共通して夢やロードバイクが頻繁に出てくる点は、連続で読んだこともあってか、印象深かった。


長々とあまり内容のないことを書き連ねてしまったが、難しいことは抜きにして、この週末を愉快なものにしてくれた二つの作品とその著者に感謝の意を表したい。
情景の想像がこんなに胸躍る行為になるとは。
映像作品では味わえない充足感に浸りながら、今夜は休むとする。

【Python】日本語Wikipediaのダンプデータから本文を抽出する

日本語Wikipediaのダンプデータ中の本文を利用したい。
ただ、単純にパースするだけではWiki記法の記号等が邪魔である。
というわけでWikipedia Extractorを利用して本文だけテキストとして抽出します。

Wikipedia Extractorの他にもパースするためのライブラリはいくつかあるようなので、用途によっては別のライブラリを使用したほうが良さそう。

Alternative parsers - MediaWiki

環境

Mac OSX Yosemite
Python v2.7.11
Wikipedia Extractor v2.4
20GB程度のディスク空き容量

出力結果例

抽出処理後に生成されるXMLファイルは下記のようなdoc要素の集まりになります。

<doc>...</doc>
<doc>...</doc>
...
<doc>...</doc>

具体的な例としては下記のようになります。

<doc id="20612" url="https://ja.wikipedia.org/wiki?curid=20612" title="カブ">
カブ

カブ(蕪)はアブラナ科アブラナ属の越年草。代表的な野菜(根菜類)の一つで、別名はカブラ、カブナ、カブラナ、スズナ(鈴菜、菘)など数多い。
「カブ」の語源は諸説あり、頭を意味する「かぶり」、根を意味する「株」、またはカブラの女房詞である「オカブ」からとされている。
江戸時代は漢語で蕪菁(ブセイ、wuqing)、蔓菁(マンセイ、manqing)、扁蘿蔔(ヘンラフク、bianluobo)などと呼ばれていた。
かった。
(中略)
ロシアでは『おおきなかぶ』のように民話の題材になるほど馴染みのある野菜である。
一方、カブがあまり好まれないフランスでは、大根役者に相当する「カブ役者」という言い回しがある。
</doc>

ここで、doc要素の属性idおよびurlは、

  • id:ユニークシリアルナンバー
  • url:オリジナルのWikipediaページURL

となります。

準備

日本語Wikipediaダンプデータ

まずは日本語Wikipediaのダンプデータを下記から入手します。

Index of /jawiki/latest/

jawiki-latest-pages-articles.xml.bz2が記事本文を含むダンプデータですね。
当然ですがファイルサイズが大きいので注意。

Wikipedia Extractor

下記サイト内のDownloadsからWikipedia ExtractorのPythonスクリプトを直接ダウンロードします。

Wikipedia Extractor - Medialab

抽出作業

WikiExtractor.pyjawiki-latest-pages-articles.xml.bz2を同一ディレクトリに置き、下記のコマンドを実行するのみで基本的には終了です。

WikiExtractor.py -b 500K -o extracted jawiki-latest-pages-articles.xml.bz2

これで、extractedディレクトリ下に、500KB毎に区切られた抽出後ファイルが生成されていきます。
公式では-cオプションを設定して圧縮していました。
私はとりあえずそのままで構わないので、このオプションは外しました。

次に、このままではファイルが分割状態で使用が面倒なため、一つのファイルにまとめます。

find extracted -name 'wiki*' -exec cat {} \; > text.xml

これで全ての本文データがtext.xmlファイル内に格納されました。
私の試行時では、およそ2.5GBくらいのファイルになりました。

まとめ

というわけで、無事日本語Wikipediaのダンプデータから本文のパースおよび抽出が完了しました。
偉大なライブラリ製作者に感謝。

参考

GitHub - attardi/wikiextractor: A tool for extracting plain text from Wikipedia dumps

実行時のオプション等はこちらから。