「笑わない数学者」を読んだ

笑わない数学者 (講談社ノベルス)

笑わない数学者 (講談社ノベルス)

引き続き森博嗣氏の小説。本書で自分が感じたテーマとして、定義しなければ不定というものがあった。こういう表現では思っていなかったけれども、自分が思っていたのは「意味は人間が付与するもの」ということだった。そういう意味で少し共通項を感じた。
人間は不定な状態が嫌いなのだと思う。いや、不安定よりも安定を好むという点に関しては人間に限らないような気もする。不定な状態が嫌だから、この世はどこから始まったのかとか、自分の人生に何の意味があるのかとか考えたくなるのだろうなと思う。答えを見つけて安定したいのだ。
自分はこの世の始めは「ない」が正解だと思っているし、人生の意味も「ない」が正解だと思っている。前者は無限に過去を遡ることが可能だと思うからであり、後者はそもそも人間が意味を決めた時点で発生するものだと思うからだ。
真実かどうかは知らない。この小説を読んでぼんやりとそんなことを改めて感じた。

元号とローマ字

今日、午前中にとある大学病院に行ってきた。大学病院の感想はまた書くとして、診察券を見てあることを感じた。
それは生年月日の記載。自分は昭和55年生まれなのだけれども、「S55」と刻字されている。これを見て「え?次の元号がサ行だったらどうするの?」と思った。
訓令式のローマ字の場合、最初に使われるのは以下の18個。

a i u e o k s t h m y r w g z d b p

仮に明治以降を対象にすると、

m t s h

を既に使用しているから、残りの

a i u e o k y r w g z d b p

から選ばれなければ困ったことになりそうだ。
と言っておきながら、実際には余程決め打ちで作っていなければ困らないだろう。例えば次の元号が「さくら」だったとしてら「SA」とか刻字すれば良いだけの話なので。
それでも、きっと次の元号は「m t s h」以外のローマ字から始まるものが選ばれるだろう。作為的にやっているのだと思う。もちろん、想像。

「冷たい密室と博士たち」を読んだ

すべてがFになるを読んでからすぐに読み始めたはずだったのに大分と時間がかかってしまった。本を読む時間もあまりなかったのだなと思われる。
小説は物にも依るだろうけれども、発売後すぐでなくても新刊のように楽しめるところが好きだ。小説が好きな人からすれば今さら森博嗣という印象かもしれないけれども、今こうして手にとって読めるから全く問題ない。絶版になって手に入らないほどになるとまた話が違ってはくるだろうけれども。
本作品も例外なく前回の続きとして楽しく読み進めることができた。満足。

冷たい密室と博士たち (講談社文庫)

冷たい密室と博士たち (講談社文庫)

特定のサブディレクトリのBASIC認証を外す

特定のサブディレクトリに別のBASIC認証をかける – Do You PHP はてな
これを見て、こないだやったことを思い出したので便乗エントリ。

<Directory "/path/to/example">
AuthName "example"
AuthType Basic
AuthUserFile /path/to/example/.htpasswd
Require valid-user
</Directory>
<Directory "/path/to/example/foo">
Satisfy Any
</Directory>

これでexampleディレクトリにあるfooディレクトリだけは認証が必要なくなる。ただ、こういうケースは結構特殊かなと思う。Satisfy AnyはあるIPはそのまま通すけれども、その他の場合にはBasic認証かけるなどの用途で使うと思うので。普通に考えれば認証の必要なディレクトリ配下に認証不要のものがあるのが不自然だったりするので、何かの都合で暫定的に必要な場合とかでないとあまりお勧めはできないかも。

郵便番号検索

会社の同僚とランチに行ったら少しこれの話がでた。自分が以前、作ってみたもの。

郵便番号検索

これほどの車輪の再発明はないと言えるようなくらいの再発明。同じことが可能なWebサイトは数知れずある。それでも、作りたかった。
理由はリリース時に書いたことだけれども、古い車輪が転がりすぎていて、その車輪に慣れている世の中があったから。車輪を発明したことに満足してギアの開発を怠った感じ。
郵便番号データは全国で12万件くらいしかないので、それくらいのデータ量に画面遷移して絞り込むとか数秒待たされるとか、そういう旧来的な時間をかける作業に疑問があった。
疑問に思えば実装するのが常。やってみたらやはり速い。電光石火とは言わないが電光石火だ。画面遷移を捨てたから得られた境地とも言える。
そんなに郵便番号を検索しないという意見は正だと思うけれども、いざ検索するときに遅いインタフェースを使う必要もないと思う。良き再発明になっていれば良いなと心から思う。

symfonyの自分用メモ

最近、symfonyをよく触るようになった。忘れやすい部分や気になる部分をメモ。間違ってたり変なところがあればツッコミ歓迎です。

最初にやること

$ {symfony home}/data/bin/symfony init-project projectname
$ symfony init-app appname

自分のディレクトリにばらまかれるのでmkdirして潜ってからやること。

Subversionのignoreとか

$ chmod 777 ./cache
$ chmod 777 ./log
$ rm -rf ./cache/*
$ rm -rf ./log/*

とかやってコミット。

$ svn propedit svn:ignore cache
$ svn propedit svn:ignore log

二つとも「*」とだけ入力して配下のファイルをignoreにする。できたらコミット。

モジュール作る

$ symfony init-module appname modulename

routingとか

moduleとactionが必要。パラメータはフォーマット指定可能。

routing_name:
url:   /action/module/:param/*
param:
module: hogemodule
action: hogeaction
requirements:
param: ^[a-zA-Z0-9]+$

MySQL関連

「./config/databases.yml」を書く。

all:
propel:
class:          sfPropelDatabase
param:
phptype:      mysql
host:         localhost
database:     hogedb
username:     hogeuser
password:     hogepw
encoding:     utf8

「./config/propel.ini」を書く。

propel.database.createUrl  = mysql://hogeuser:hogepw@localhost/
propel.database.url        = mysql://hogeuser:hogepw@localhost/hogedb

scheme作る。

$ symfony propel-build-schema

詳しくは知らないけれどもdefaultあるとmodel作ろうとして失敗するのでperlを唱える。
参考: http://unicus.jp/wp/archives/19

$ perl -i -pe 's|^.*default.*\n||g' ./config/schema.yml
$ symfony propel-build-model

とかやってmodelを作る。

キャッシュクリア

何かと忘れずにやるように。

$ symfony cc

Actionでよくやること

User取る。

$this->getUser();

認証されてるかどうか。security.ymlと関係あり。

$this->getUser()->isAuthenticated();

Session。namespace使うなら引数増やす。

$this->getUser()->setAttribute($key, $value);
$this->getUser()->getAttribute($key);

リクエストパラメータの受け取り。

$this->getRequestParameter('hoge');

どこかへリダイレクト。routing.ymlにルールがあること。

$this->redirect('hoge/index');

SessionをMySQL

テーブル作る。

CREATE TABLE session (
sess_id      varchar(32)  NOT NULL,
sess_data    text         NOT NULL,
sess_time    datetime     NOT NULL,
PRIMARY KEY (sess_id)
) ENGINE=MYISAM;

「./apps/appname/config/factories.yml」を書く。

all:
storage:
class: myMySQLSessionStorage
param:
db_table:     session
database:     propel
session_name: sessoinname

Propelでよくやること

プライマリキーで抜く。

TablenamePeer::retrieveByPk($id);

全部抜く。

TablenamePeer:doSelect(new Criteria());

先頭一つ抜く。

TablenamePeer:doSelectOne(new Criteria());

countする。

TablenamePeer:doCount(new Criteria());

WHERE句を作る。

$criteria = new Criteria();
$criteria->add(TablenamePeer::COLUMN_NAME, 'hoge');

ORDER BY句を作る。

$criteria->addAscendingOrderByColumn(TablenamePeer::COLUMN_NAME);
$criteria->addDescendingOrderByColumn(TablenamePeer::COLUMN_NAME);

LIMITを設定する

$criteria->setLimit($number);

OFFSETを設定する。

$criteria->setOffset($number);

JOINで抜く。(上は./config/schema.yml)

foreignTable: 'table'
foreignReference: 'column'
TablenamePeer::doSelectJoinAll($criteria);

特定JOINで抜く。

TablenamePeer::doSelectJoinTablenameRelatedByColumn($criteria);

JOIN後にリレーショナルテーブルを取得。三つ以上でJOINすると上手くいかなかった。

$record->getTablenameRelatedByColumn():

Helperでよく使うのを列挙

<?php
link_to($name = '', $internal_uri = '', $options = array())
button_to($name, $internal_uri, $options = array())
options_for_select($options = array(), $selected = '', $html_options = array())
form_tag($url_for_options = '', $options = array())
select_tag($name, $option_tags = null, $options = array())
input_tag($name, $value = null, $options = array())
input_hidden_tag($name, $value = null, $options = array())
input_file_tag($name, $options = array())
input_password_tag($name = 'password', $value = null, $options = array())
textarea_tag($name, $content = null, $options = array())
checkbox_tag($name, $value = '1', $checked = false, $options = array())
radiobutton_tag($name, $value, $checked = false, $options = array())
submit_tag($value = 'Save changes', $options = array())
reset_tag($value = 'Reset', $options = array())
submit_image_tag($source, $options = array())
label_for($id, $label, $options = array())

scaffold

アプリケーションを作る。

$ symfony init-app <APPLICATION_NAME>

crudを作る。「propel-generate-crud」ではなく「propel-init-crud」を使うとフレームワーク側のコードを継承した形になる。

$ symfony propel-generate-crud <APPLICATION_NAME> <MODULE_NAME> <CLASS_NAME>

ざっくりとこんな感じで。また追記するかも。

Software Designで記事を書きました

Software DesignJavaScript特集で、サーバサイドJavaScriptの例としてHelmaの実装について記事を書きました。興味のある方はぜひご覧になってみてください。

サタデー・コード・フィーバーに参加してきた

気分をかえてウノウで趣味の開発してみませんか?
自社のイベントなので参加。巧い表現が思いつかないけれども、善い場だった。善意に満ちた開発者空気だったと言えば良いだろうか。色々な会社の方が参加してくれて、とても有意義な時間だった。
番外編ではあるけれども、onkさんにcloned(自分)が「有名じゃないですか」と言われたのが違和感だらけだった。無名なつもりだったし今でも無名だと思っていたけれども、Web経由で知ってくれる人がいて、しかもリアルに出会える機会があるというのはとても素晴らしいなと思った。