2012-05-04

あれっと思うとき

時間をかけて考えて、最高のソリューションっぽいの妄想できたしこれ実装しよう!!と思ってたら先超されて、うわぁ、、、って思いながらも自分の頭の中にあった最高のソリューション使ってみると、あれっ。。。って思うことがあった。全然最高じゃないし、下手すると負のスパイラルっぽいの発生しそうだし、コレジャナイ感を感じてしまったこととか、実際にできたものを使ってみて思うことがあった。

相手も同じこと感じるかわからないけど、先を越された以上同じことやっても面白くないし、先超されたのを言い訳にがっつり尖ってみるのもいいかもしれないねと夜の11時ぐらいに変なお兄さんと代々木でカレーを食べながら考えてた。

2012-04-30

pythonbrew とか pythonz とか

pythonbrew が半ディスコン状態になったので逃れ先がないかなーと少し調べていたんですが、あんまりしっくりくる感じのものがないです。

pythonbrew を fork したものだと、とりあえず名前だけ変えて pvm と名付けられたものと、pythonz という pythonbrew から機能をいくつか削ぎ落したものがあります。

pvm のほうは正直どうしたいんだこれ感が漂ってる。pythonz のほうは pythobrew のようなものだろうと思って使ってみたら思想が結構違ってて、そもそも pythonz 自体は何もせずにただ python (pypy, jython) をインストールするだけで、pythonbrew のような use とか switch とかは提供されてなく、ほんとにインストールするだけ。そこにパスが通るわけでもなく、サイトに書かれているように、あとは勝手にその python を virtualenv 用に使ってね〜というスタンスみたい。別にそれでもいいんだけど、なんかめんどくさいなーと思ってしまう。

requests とか作ってる heroku の kennethreitz が fork した python-build というものもあって、何かセンスいい感じのものにしてくれないかなーと思ってるんだけど、最後のコミットが2ヶ月ぐらい前。readme には

Pythonbrew is anti-virtualenv. This isn't.

Differences:

- No `switch`. That's crazy.
- Bottles (pre-compiled Pythons)

とか書いてあるので、更新されるとしたら、また思想違ったものになるみたいです。

さてどれを使いましょう。

2012-04-07

オシャレなやつ

すごくオシャレな人たちが集まってコンテンツを投稿するうぇっぶあぷりけーしょんがあったとして、すごくオシャレな人たちが集まってるのでコンテンツのオシャレ度も高くなる。でもそういうすごくオシャレな普段目立っている人たちは数が限られているので、すぐに伸びが頭打ちになる。

ここでどうするか問題。

  • 投稿のハードルを下げて幅広い人に使ってもらう。
  • ハードルは下げずにもっと攻める

楽なのは前者で、尖っていた部分を取ってしまって、今まで集まってくれていた「すごくオシャレ」に届かない全ての人たちも取り込めるようにハードルを下げてしまうことかなと思う。方針次第だけど、ユーザーやコンテンツを増やすという意味では間違ってないと思うし一番妥当な判断っぽい。ただこの方向転換は、今のすごくオシャレ感が好きなユーザーを多かれ少なかれ切り捨ててしまうことになるんじゃないかなと思ってる。

後者は、ここ半年ぐらいずっと考えているけどすごく難しい。目指すところが、コンテンツのすごくオシャレ感を保ったままユーザーを増やして規模拡大していくことだとして、オープンと同時に飛びついてくるような感度の高いオシャレユーザーは既に獲得済みだとすると、投稿サイクルや、まだ自サイトのユーザーじゃない人に発見される仕組みをつくっておかないと、知る人ぞ知る隠れ家的名店を目指したのに本当に隠れてしまって潰れるっていう冗談みたいな話になってしまう。

そうして広めようとしているうちに必ず、ユーザーとして獲得したいオシャレ度よりも低いユーザーにも見つかるようになる。どこかの芸人が、言葉は悪いけどニュアンスはぴったりなので借りるけど「ブレイクするっていうのはバカに見つかるってことなんですよ。」と言っていたのは本当にそうだと思う。一気にユーザーが流れ込んでくると、初期ユーザーで作り上げた、サイトの空気みたいなものを一気に壊してしまう可能性もあって、どうやってこれを保ったまま大きくしていくかというのを考えていました。個人的に、失敗してるんじゃないのと思ってるのが ザ・インタビューズで、初期のあんなに気持ち悪くて濃厚な空気感を一気に薄めてしまった(ように見える)のはなんだかなーって気持ちになる。

長くなってきたので終わりたいけど、特に解決策とかない。でも、今考えているものに対しては後者の選択肢を取ってあげたいし、今の空気を作ってくれたユーザーの人たちをガッカリさせたくないと思っているので、中でうまく住み分けられた世界作る。

(なお、文中のオシャレという言葉はただの変数です。)

そこをうまいことやってるものを色々見たり考えたりしているところなので、また考えが溜まったら書きます「

2012-03-31

Python プロフェッショナルプログラミング買った

BP から出た本です。自分も BP で1年ちょっと働いていたので、なつかしいなーと思いながら読んでました。自分が BP に行き始めたときは10人ぐらい?しかいなかったんですが、今じゃ3倍ぐらいに人増えてるみたいで Python な人たちを囲い込みしまくってもっと面白そうな感じになってます。

本の中だと軽く飛ばされてますが、最近パンツパンツ言わされてる Skype bot をたまたまバイトに来てた moriyoshi が作って redbull の数を数え始めたときは、社内でドッと笑いが起きたのを良く覚えてます。

BP に行くきっかけになったのは、特に行く当てもなく会社やめて誰か雇って!ってブログに書いていたら、社長から、「おれと一緒にキャバクラhackしよう!!!」って Twitter で話しかけてもらったのが最初でした。キャバクラhackはとても困難極めてデスマしてましたが、知らないこと多すぎてあの数ヶ月は無駄に楽しかった気がします。その当時には、この本に書かれているようなよくできた作業フローのようなものは特になく、どこにもまとまっていなくて誰かがその作業をするたびに知っている人に聞きに行っていたし、jenkins とかも無かったので、よく1冊の本になるぐらいまとめたなーと思ってます。それぞれの章は短いですが、下手にググるより全然いいと思います。

良い本だと思うので Python 好きな人たちもそうじゃない人も買いましょう!電子書籍版をください!!またいつか BP で働いてみたいなーと思いました!!!

2012-03-30

マーク・ザッカーバーグいた

ハッカソン行ったらマーク・ザッカーバーグ普通にいて覗いてみて、お〜マークザッカーバーグ〜って最初思ったんだけど、全然オーラみたいなのなかった。何度も目で追ってみたけどやっぱりなかったし、吉高由里子のほうがオーラありそう。ユニクロで1万円ぐらい持って行けば全身同じような服買えそうな感じだったし、写真でよく見るいつものパーカーとジーンズだった。

いきなりドラクエでダークドレアムにたどり着いたみたいな感じで、Facebook なくなってももう未練ない感じする。


2012-03-17

Most important changes in Django 1.4

Django 1.4 がもうすぐリリースされます。気になる変更をあげてみます。

QuerySet.select_for_update()

https://docs.djangoproject.com/en/dev/releases/1.4/#select-for-update-support

1.3 以前のバージョンで Model に対して QuerySet を使って update をするには、QuerySet に対して QuerySet.objects.filter().update() としていました。更新する全てのモデルオブジェクトのインスタンスをループして、それぞれに対して Models.objects.save() を呼んでいると、最初にそのデータを取得した時点と save() を呼ぶ時点とで競合状態になる可能性があり、データを壊してしまう可能性があります。
QuerySet.select_for_update().filter() を使うと、トランザクションの終了まで対象の行をロックします。これにより、ループを使ってのモデル変更を安全に行うことができます。

Model.objects.bulk_create()

https://docs.djangoproject.com/en/dev/releases/1.4/#model-objects-bulk-create-in-the-orm

bulk_create() の引数にオブジェクトのリストを渡すと SQL の bulk insert ができるようになりました。

>>> Entry.objects.bulk_create([
...     Entry(headline="Django 1.0 Released"),
...     Entry(headline="Django 1.1 Announced"),
...     Entry(headline="Breaking: Django is awesome")
... ])

QuerySet.prefetch_related()

https://docs.djangoproject.com/en/dev/releases/1.4/#queryset-prefetch-related

その他の重要な機能として、Django 1.4 では QuerySet.prefetch_related() が追加されました。prefetch は、リレーションの各フィールドをデータベースではなく Python で join する以外は QuerySet.select_related() とほぼ同じ動きをします。
prefetch_related() は、ManyToMany と Generic Foreign Keys の lookup も行うことができますが、select_related() ではできません。

class Topping(models.Model):
    name = models.CharField(max_length=30)
 
class Pizza(models.Model):
    name = models.CharField(max_length=50)
    toppings = models.ManyToManyField(Topping)
 
>>> Pizza.objects.all().prefetch_related('toppings')

Assignment Template Tag

https://docs.djangoproject.com/en/dev/releases/1.4/#assignment-template-tags

テンプレート内でタグに値を assign できるようになりました。

@register.assignment_tag
def get_current_time(format_string):
    ...
{% get_current_time "%Y-%m-%d %I:%M %p" as the_time %}
 
The time is {{ the_time }}.

Updated default project layout and manage.py

デフォルトのプロジェクトレイアウトと、startproject で使われる mange.py ファイルが変更されました。以前の manage.py が原因で起こっていた path に関する問題が解決されます。
Django 1.4 にアップグレードする際に、既存プロジェクトで使っている manage.py ファイルも最新のものに更新しておきましょう。1.3 以前の manage.py は deprecated なメソッドを呼んでいます。(古い manage.py は Django 1.6 までは動きますが、Django 1.5 からは DeprecationWarning を投げるようになります。)

新しい manage.py は以下のようになっています。 

#!/usr/bin/env python
import os, sys

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "{{ project_name }}.settings")

    from django.core.management import execute_from_command_line

    execute_from_command_line(sys.argv)

{{ project_name }} の部分には、実際のプロジェクト名で置換されます。

レイアウトのところめんどくさいので原文読んでください。
https://docs.djangoproject.com/en/dev/releases/1.4/#updated-default-project-layout-and-manage-py

Support for time zones

https://docs.djangoproject.com/en/dev/releases/1.4/#support-for-time-zones

タイムゾーンがサポートされました。タイムゾーンサポートを有効にしていると、Django は日時とタイムゾーン情報をデータベースに保持し、テンプレートやフォームで日時データが使われる際に内部的にエンドユーザーのタイムゾーンに合わせて変換されます。

タイムゾーンサポートは startproject でプロジェクトを作るとデフォルトで有効になっています。この機能を既存のプロジェクトで使いたい場合は、マイグレーションガイドを読んでください。何か問題に当たったら FAQ 読んで!

Changes to Startproject and Startapp

https://docs.djangoproject.com/en/dev/releases/1.4/#custom-project-and-app-templates
http://amccloud.com/post/14689947527/django-1-4-custom-project-template

startproject と startapp コマンドの両方に新しい引数が追加され、テンプレートから project/app が作成できるようになり、project/app をどこに作成するのかも指定できるようになりました。

django-admin.py startproject --template=/path/to/my_project_template myproject
 
django-admin.py startapp myapp /path/to/new/app
django-admin.py startproject myproject /path/to/new/project

{% elif %} template tag

{% elif %} テンプレートタグがついに使えるようになりました!これは 1.4 での最も嬉しい変更の1つです。fuck!!!

Python and Postgres Versions

https://docs.djangoproject.com/en/dev/releases/1.4/#python-compatibility
https://docs.djangoproject.com/en/dev/releases/1.4/#support-for-postgresql-versions-older-than-8-2

Django 1.4 では、Python 2.4 と PostgreSQL 8.2 以下がサポートから外れました。


Release-blocking なバグが出てこない限り Django 1.4 は来週リリースされます。

refs.
https://docs.djangoproject.com/en/dev/releases/1.4/
http://procrastinatingdev.com/django/most-important-changes-in-django-1-4/