たにしきんぐダム

プログラミングやったりゲームしてます

PyCon JP 2015 に参加してきました!

10/9 ~ 10/12 に開催された PyCon JP 2015 (PyCon JP 運営 — PyCon JP) に参加してきました 10/9 はチュートリアル 10/10, 10/11 に講演等があり 10/12 に開発スプリントという感じで 僕は10/10 ~ 10/12 で参加してきました.

まとめ記事

すでにTogetter や スライド, flicker が公開されているので そちらを見ると雰囲気がつかめるかと思います.

カンファレンス一日目

午前

基調講演を聞いたあとは とりあえず企業ブースを適当に回ったり 無限コーヒーを飲みながら久しぶりに会った大学の先輩と話したりしてた

その後は プレゼンテーション:Python と型ヒント (Type Hints) | PyCon JP 2015 in TOKYO を聞いて型型言ってたりしてたら午前の部が終わり

お昼ご飯は PyCon JP さんが用意してくれたお弁当屋さんの弁当を外の講演のベンチで食べながら次の講演はどこ見に行くかとか話してた

IMG_0191www.flickr.com

ガパオご飯とグリーンカレー食った

午後

食後の眠気と端末の充電したさからソファに座って充電しながら先輩とAndroidの話をしてたらスタッフに写真撮られてた(Pythonの話してなくてごめんなさい) そのままブースを見たりコーヒーを飲んでたらコーヒーブレイクへ お菓子がめちゃくちゃ美味かったです.

その後は プレゼンテーション:tse - Pythonによるテキスト整形ユーティリティ | PyCon JP 2015 in TOKYO を聞いてPythonワンライナー機運を高めたりしてた便利そう

そんなこんなしてるうちにLTの時間に

その後はパーティー! IMG_7185www.flickr.com

知り合いとばっかり話してたし楽しかったけど もっと色んな人と交流すれば良かったなぁという感じです(LTとかできたら話すネタにもなったんだろうけどネタがない…)

カンファレンス二日目

午前

基調講演を聞いた後は適当にジョブフェアーの発表を聞いたり ポスターセッション見たり コーヒー飲んだり

pyexperiment っていう研究用ライブラリが便利そうだなって思った 研究でPython使うようになったらお世話になるかもしれない duerrp/pyexperiment · GitHub

そしてそのままランチタイムへ 二日目はシリアンライス食った

午後

またもや食後の眠気からコーヒーを飲みつつ休憩してた(オープンスペースとかで面白イベントやってたらしいし行けば良かった…) 眠気がとれたら プレゼンテーション:uWSGI/Dockerを利用したWebサービス運用事例 | PyCon JP 2015 in TOKYO を聞いて uWSGI と gunicorn の比較とか聞いて良い知見を得ていた.

その後はコーヒーブレイクだったのですが NOC(Network Operation Center)見学ツアー をやっていたので見学してきました. ネットワーク監視のあれこれを聞いたり 人がよく通る箇所は床ではなく天井に這わしてやるとか細かいところまで考えた配線技術は素晴らしいなあと思いました.

その後は遅れてコーヒーブレイクをとって プレゼンテーション:PyPIデビュー 2015 | PyCon JP 2015 in TOKYO を聞いたりした 僕も便利ライブラリ作りたいです.

その後のLTでは pysqldf とか便利そうだな〜 って聞いてた SQLおじさん見習いとしても pandasをSQLで操作する芸を身につけていきたい

github.com

モノタロウ楽しそうな会社ですね

クロージング

いよいよクロージング モノタロウ侍君とじゃんけんして勝ち残ったら商品が貰えるみたいなイベントがありましたが全然勝てませんでした… (PyCharm Pro とか iPad もあったしすごい)

IMG_7577www.flickr.com

開発sprint

ドキュメント翻訳したいとは思っていたけれど sphinx分からないし…という感じだったので 何も分からないにも関わらずsphinxチームに加えさせて頂いてsphinx環境を作ったり入門したりしてた (ありがとうございました) transifex の Django ja チームに加えて頂いたので翻訳頑張るぞ!

まとめ

  • ネットがめちゃくちゃ安定してるし 常にスタッフがそこらへんにいて安心だった (おつかれさまでした!)
  • 電源確保が難しい
  • モノタロウ侍かわいい…
  • YAPCと比べて大人しめな感じがした 会場の雰囲気も落ち着いた感じで良かった
  • ご飯が美味しかった
  • 結構海外からの方が多かったけどだいたい日本語ペラペラだった. もっと国際交流したい

来年もっと強くなって行きます!!!

英和辞書検索をポップアップからシュッと出来るChrome拡張作った

概要

辞書検索Webアプリとか Chrome拡張とかあるけど

  • そのWebページにアクセスしなくちゃいけなかったり
  • Chrome拡張からの検索結果が新しいタブで開かれたり
  • 調べたい単語を選択状態にしなくちゃいけなかったり

とイマイチ使い勝手がよいものが無かったので ChromeExtensionのポップアップの部分で検索・検索結果の閲覧が出来る感じのChrome拡張を作った.

こんな感じ Gyazo

ボタンがあるけど普通にフォームに検索したい英単語を入力してEnterキー押せば検索結果が出るのでサクッと辞書検索できます.地味に便利.

インストール

Chromeウェブストアにアップロードしてあります. インストールはこちらからどうぞ.

chrome.google.com

GitHub

tanishiking/dejizo-eiwa-chrome · GitHub

注意

現状 英熟語の検索はできないっぽい

この拡張機能のバックエンドには デ辞蔵 REST版API の無償公開版を利用しています.

無償公開サービスのURLです。365日24時間動作していますが稼働保証はございません。

このため この Dejizo Eiwa Chrome も稼働保証はございません. ご了承ください.

PHP でジェネレータを作ったり遅延評価してみる

ジェネレータを作ったり遅延評価するのが流行っているようなので、PHP5.5.0から導入されたジェネレータを使って同様のことをPHPでもやってみようと思いました。

PHPイテレータ、ジェネレータ

PHP 5 は、foreach のような反復処理を可能とするよう オブジェクトを定義する手段を提供しており、IteratorIteratorAggregateなどを実装することによってオブジェクトの反復処理の方法などを細かく指定することができます.

ジェネレータ

先ほど述べたインターフェースを実装することによって反復処理を可能とするオブジェクトを実装することもできますが、ジェネレータを使えば簡単に実装することができます.

早速いくつか簡単なジェネレータを実装してみます。

以上のように内部ではcurrent()メソッドで現在自身が保持している要素を出力し、nextメソッドで次の要素に進むということをしているのですが、同様の処理をforeachで行うことができます.

以下はフィボナッチ数列を無限に返すジェネレータです.

遅延評価

PHP で yield を使ったジェネレータを作成すると遅延評価されていることはこれまでの例から分かることと思います. イテレータを引数にとってイテレータを返す関数を利用することで, より複雑な処理を行うことができます. このようなイテレータを生成する関数はPHP には標準では存在しません. (lstrojny/functional-php · GitHubnikic/iter · GitHubのような外部ライブラリは存在しますが…)
それらの関数を模倣してみます.

実際の例は以下

PHPではデフォルトではリストを受け取ってリストを返すarray_map() やarray_fileter() などは存在しますが、イテレータを受け取ってイテレータを返すようなmap, filter などが存在しないので3~27行目で独自に簡易的に実装しています.

ダミー画像なしでImageFieldを含むFormのテスト

たとえばこんなフォームのテストをしたいとき

from django import forms

class HogeForm(forms.Form):
    name = forms.CharField(max_length=100)
    image = forms.ImageField(upload_to='images/')

テスト用のダミー画像を用意するのもいいが、ダミー画像なしでテストする方法として、PILとSimpleUploadedFileを使ってアップロードされた画像ファイルっぽいものを作ってテストできる。


gistff7336608fca2c889955

使い方

from django.test import TestCase
from your_app_name.forms import HogeForm
from inmemory_image_generator import get_image_dict

class HogeTest(TestCase):
    def test_hoge(self):
        img_dict = get_image_dict()
        param = {'name': 'foo'}
        form = HogeForm(param, img_dict)
        self.assertTrue(form.is_valid())

こんな感じでテストできて便利

django-imagekit使ってみた

djangoに画像をアップロードする際、自動でリサイズとかしたいときにdjango-imagekitを使うと便利らしい。

django-imagekit

github.com

インストール

githubのリンクに書いてある通り。

pip install pillow
pip install django-imagekit

settings.pyのINSTALLED_APPSに'imagekit'を追加

ImageSpecField

ImageFieldにアップロードした画像のサムネを作りたいときなんかはImageSpecFieldを使う。
githubのreadmeのままだけど…

from django.db import models
from imagekit.models import ImageSpecField
from imagekit.processors import ResizeToFill

class Profile(models.Model):
    avatar = models.ImageField(upload_to='avatars')
    avatar_thumbnail = ImageSpecField(source='avatar',
                                      processors=[ResizeToFill(100, 50)],
                                      format='JPEG',
                                      options={'quality': 60})

avatarは普通にImageFieldを使って定義したもの。ImageSpecFieldの引数の意味はなんとなく分かると思う。sourceは元になるImageField、アップロード先は指定する必要ないです。
ImageSpecFieldは仮想的な(?)もので実際にデータベースに'avatar_thumnail'という列は作らない。
これでProfile.avatarに画像をアップロードした際に自動的にリサイズされjpg変換されたサムネ画像が生成される。

サムネ画像の保存先

そのサムネ画像が生成される場所はデフォルトだと,settings.pyで設定したMEDIA_ROOTの相対パスi'CACHE/images/upload_to'になるっぽい。

例えばsettings.pyにおいて

MEDIA_ROOT = 'home/tanishiking/django_project/cms/media/'

の場合、保存先は

home/tanishiking/django_project/cms/media/CACHE/images/avatar/filename.jpg

これはsettings.pyでIMAGEKIT_CACHEFILE_DIRをいじくることで変えられる。

テンプレート側でサムネ画像を呼び出すときは

<img src="{{ profile.avatar_thumbnail.url }}" />

で呼び出せる。

トラブルシューティング

サムネ画像が生成されない

サムネ画像の保存先のディレクトリが無くて作られなかった?

python manage.py generateimages

でディレクトリ、画像が作られて、その後は普通にサムネ画像が作られるようになった。

error decoder jpeg not available

python manage.py generateimages

しようとするとこんなエラーが出る。

jpegをpillowで扱うときはpillowのコンパイル時にlibjpeg-devが必要っぽい。
libjpeg-devをインストールしてからpillowを再インストールしたら治った

sudo apt-get install libjpeg-dev
pip install -I pillow

(ubuntu-14.04)