「モリのアサガオ」と死刑
April 22, 2008 at 10:41 PM | View Comments先日、例の光市母子殺害事件の高裁での判決が出て、大方の予想通り死刑が言い渡されました。
死刑は当然という意見と、死刑廃止派の意見といろいろありますが、当然という意見が大半のような気がします。
死刑に関しては漠然と絞首刑になるということくらいしか知らなかったのですが、最近、郷田 マモラさんの「モリのアサガオ」という刑務官と死刑囚を描いた漫画を読んだので少しでしょうがいろいろ知ることができました。
- 死刑が確定してから執行されるまで平均7年くらいかかる
- 死刑確定囚は刑を執行されて初めて刑罰を受けることになるので、労役を課せられる懲役囚とは違い執行されるまでは比較的自由であること(頭髪は自由、服も自分の好きなものを着れる、お金があればある程度自由に食べ物を買い求めることができる、雑誌や本などをある程度自由に読める)
- 死刑執行日は事前に本人には伝えらず、当日の朝、突然言い渡されて執行される。
- 死刑執行は確定順に順番に執行されるのではなく、ランダムに執行される。
僕は漫画が好きなので、いろいろな漫画を読んできましたが、この「モリのアサガオ」は傑作中の傑作に値するのではないかと思います。
他の僕が傑作だと思っている作品(例えば、火の鳥・ブッダ(手塚治虫)、ベルセルク(三浦建太郎)、ピンポン(松本大洋)、Pink(岡崎京子)、、、)には作者のよく分からない部分、一種の狂気みたいなものが作品の根本にあると思うのですが、郷田マモラさんの描く「モリのアサガオ」にはそういった狂気じみたものがありません。
ただ丁寧に取材し、取材対象と誠実に向き合い、誠実に物語を作っていく。
強いて言えば誠実さこそが郷田マモラさんが常人とかけ離れた才能なのではないかと思います。
主人公の刑務官「及川直樹」は罪と向き合い反省した死刑囚、全く反省せずに自己正当化している死刑囚、冤罪の問題、獄中結婚、死刑反対派、被害者遺族、死刑囚の家族、死刑執行に関わる刑務官の苦悩などを通じて死刑制度への「賛成」「反対」の狭間でゆれつづけます。
最後には一応の結論を出しますが
「ぼくは今も、、、これからも深い森の中をさまよい続けるんや」
と、今後も迷い続けるとして終わっています。
死刑制度に関して僕自身は廃止する必要はないと思っていたし、今後もそう思うと思うのですが、いろいろ考えられる作品でした。
ネタバレ各巻感想
双葉社
「この世で最後に見るものはお前の顔にしたい、、、」
冒頭で友人の死刑執行を行う主人公。
物語は主人公が新人刑務官として赴任する8年前に戻る。
主人公を通じて読者も死刑囚、死刑囚舎房のこと、死刑確定順ではなくランダムに事前に告知されることなく死刑執行されることを知る。
拘置所は一般社会からは見えない深いモリのようなもの、死刑囚は死刑執行は必ず朝に実行されることから朝に咲いて昼にはしなびてしますアサガオのようなものという示唆。
--
冒頭に物語の終わりを見せる手法。男性向けの漫画には珍しい終わりを見据えた物語だということが分かる。
双葉社
死刑囚たちのエピソード。
--
物語の大筋には絡まず、死刑囚たちのエピソードを見せる巻。
死刑囚の罪は許されないにしても、それぞれの事情があり、やはり彼らも人間ということを描いている。
孫に会うことができなかった老死刑囚が夜中に孫を想って枕を抱く姿に涙する主人公。
双葉社
反省せずに気楽に生きている死刑囚「星山」の改心に全力を尽くす主人公。
反省させることに成功するも、ずっと後のことだと思っていた星山に死刑執行が実施される。
死刑執行に関わった刑務官の苦悩。
渡瀬満に死刑判決が下る
--
読んでて震えが止まらなかった。
1巻では詳しく描かれなかった死刑執行の様子が描かれる。
初めて死刑執行に関わりショックを受け退職する先輩、死刑執行に関わりすぎたため精神を壊してしまった刑務官を通じ職務として人を殺す職業があることを描いている。
双葉社
死刑囚のエピソード。
被害者遺族の問題が中心。
--
かつて恋人を殺された先輩刑務官里中と、被害者家族の苦悩。
ずっと憎まれ役だった里中が一気にいい人になる。
この後も好プレー連発。こういうのはずるいけどいいな。
双葉社
主人公の出生の秘密。冤罪の問題。
--
1巻から伏線を張りまくってた「山本」の謎が分かる。
死刑反対派のおばちゃんがマトモな人でよかった。
双葉社
冤罪の話。
主人公の出生に大きく関わった深堀の死刑執行。
--
死刑制度最大の問題といわれる冤罪の話。
自供で死刑というのはどうかと思うがどうなんだろう??
あと一巻で終わるというのに主人公と渡瀬は仲良くならない。
双葉社
冤罪の加害者家族のエピソード。
渡瀬満の真実と死刑執行。
--
ついに主人公と渡瀬が分かり合う。
死を受け入れていた渡瀬が状況がかわったことで
「死刑になりたくない。生きたい」と主人公に訴える。
主人公は渡瀬に自分の死刑についての答えをだす。結論は最初にわかっているのですが、やはり悲しくやりきれない気持ちになりました。
Google app engine用汎用ビュー date_based
April 15, 2008 at 10:49 PM | View Commentsまだ作りかけですが、Google app engine用の汎用ビューdate_basedを作ってみました。
コードはCodeReposのコミット権をもらったので、そちらにあげておきました。
http://coderepos.org/share/browser/lang/python/gae_django/views/generic/date_based.py
template_nameを必ず渡す必要があるのと、object_detailができてません。
また、Google app engineのTIMEZONEはUTCなのですが、そのへんを考慮してないので日付の指定がズレてしまいます。そのうちsettings.pyのTIME_ZONEを見てその辺の修正をかけるようにする予定です。
テンプレートに表示するときはtemplatetagsで時刻を修正する予定です。
http://coderepos.org/share/browser/lang/python/gae_django/templatetags/datefilter.py
pytzが必要です。
Goolge app engine + Djangoで汎用ビュー(object_list)を扱う方法
April 11, 2008 at 08:24 AM | View CommentsDjangoには汎用ビューという便利な機能があって、
http://michilu.com/django/doc-ja/generic_views/
特にpaginateを簡単に扱えるdjango.views.generic.list_detail.object_listは非常に便利なのですが
http://michilu.com/django/doc-ja/generic_views/#django-views-generic-list-detail-object-list
Google Apps Engineでは扱うことができない。
しかし、ちょっといじればいけそうなのでやってみました。
まずREQUEST_CONTEXTを使っていて、デフォルトではdjangoのmodelに依存しているdjango.contrib.authを使っているのでsettings.pyに以下を追加してで設定を上書きする。
TEMPLATE_CONTEXT_PROCESSORS = (
#'django.core.context_processors.auth',
'django.core.context_processors.debug',
'django.core.context_processors.i18n',
#'django.core.context_processors.media', #mediaは0.97からかな?0.96にはないはず
'django.core.context_processors.request',
)
object_list関数のなかに
queryset = queryset._clone()
というのがあって、それのためにエラーになるので
setattr(query, '_clone', lambda : query)
を追加。
object_listの引数にtemplate_nameがないとqueryset.modelを見てエラーになるので必ず引数として渡す。
この前の例だと以下のようになる(userの部分が間違ってたので`Djangoを動かした。 - 偏った言語信者の垂れ流し`_ を参考に直しました。)
#!-*- coding:utf-8 -*-
from django.http import HttpResponse
from django.views.generic.list_detail import object_list
from django.shortcuts import render_to_response
from django import newforms as forms
from google.appengine.ext import db
from google.appengine.api import users
import datetime
class Entry(db.Model):
created = db.DateTimeProperty()
body = db.StringProperty(required=True)
author = db.UserProperty()
class EntryForm(forms.Form):
body = forms.CharField(max_length=100, min_length=1)
def bbs_list(request):
form = EntryForm(request.POST or None)
user = users.get_current_user()
if user:
userlink = "%s (<a href='%s'>sign out</a>)" % (user.nickname(), users.create_logout_url("/hoge/list/"))
else:
userlink = "<a href='%s'>Sign in or register</a>." % (users.create_login_url("/hoge/list/"))
if form.is_valid():
e = Entry(body=unicode(request.POST["body"], 'utf8'),
created=datetime.datetime.now(),
)
if user:
e.author = user
e.put()
form = EntryForm()
query = Entry.all()
query.order('-created')
setattr(query, '_clone', lambda :query) #この行を追加
#return render_to_response('hoge/entry_list.html', {'form':form, 'object_list':query, 'nickname':nickname})
return object_list(request, query, paginate_by=10,
template_name='hoge/entry_list.html', #template_nameを必ず渡す
extra_context={'form': form, 'userlink':userlink}
)
テンプレートは次のようになる
ueblog33/hoge/templates/hoge/entry_list.html
{% extends "base.html" %}
{% block title %}HOGE{% endblock %}
{% block content %}
<ul>
<p>
<form method="POST" action="." >
{{ form }}
<input type="submit" />
</form>
</p>
<p>
{{ userlink }}
</p>
{% for object in object_list %}
<li>{{ object.body|escape }} : {{ object.created|date:"Y-m-d (D) H:i:s" }} : {% if object.author %}{{ object.author }}{% else %}名無しさん{% endif %}</li>
{% endfor %}
</ul>
{% if has_previous %}
<a href="/hoge/list/?page={{ previous }}">previous</a>
{% endif %}
{% if has_next %}
<a href="/hoge/list/?page={{ next }}">next</a>
{% endif %}
{% endblock %}
他の汎用ビューはdate_basedだけが惜しいのですが、ちょっとやれば使えそうなので次回にでもやってみたいと思います。というかdjango.modelをうまくgoogleのdb.Modelに対応するのを作ってる人がいるみたいなのでそっちに期待。
上記のアプリは以下で動いてます
Google app engineでDjangoを動かす
April 09, 2008 at 10:36 AM | View Commentsまず、普通にGoogle app engineを使えるようにするには秋元さんのエントリーが詳しいのでそちらを参考に
- http://labs.cybozu.co.jp/blog/akky/archives/2008/04/google_app_engine_sdk.html
- http://labs.cybozu.co.jp/blog/akky/archives/2008/04/tried-google-app-engine.html
秋元さんはWindowsを使っているがMacの場合はdmgとpkgでインストールする。
ローカル環境であれこれするdev_appserver.pyと、デプロイするためのappcfg.pyはそれぞれ/user/local/bin/に入る
- /usr/local/bin/dev_appserver.py
- /usr/local/bin/appcfg.py
またdemoやlibなどのファイルたちは/usr/local/google_appengineにある。
Google app engineはPythonは2.5が必要なのでOS-X10.5以外の人は別途インストールしましょう。Djangoのインストールだがeveresさんの記事が分かりやすいです。
http://www.everes.net/2007/sep/06/install-django-for-begginers-osx/
アプリを作るディレクトリに移ります(どこでもいい)
% cd ~/tmp
/usr/local/google_appengine/libにあるdjangoを使ってプロジェクトを作る(今回はueblog33というアプリ名にしました)
% python /usr/local/google_appengine/lib/django/django/bin/django-admin.py startproject ueblog33
次のように4つのファイルができているはずです。
% ls ueblog33
__init__.py manage.py settings.py urls.py
アプリ直下にdjango自体が必要なのでコピーしましょう
% cp -r /usr/local/google_appengine/lib/django/django ueblog33/django
google app engineを使うためにはueblog33/main.pyを作る必要がある。
http://code.google.com/appengine/articles/django.html
のmain.pyをコピーしてしまいましょう。しかし、#Log errorの後の行はエラーになるので#でコメントアウトしておきましょう。
# Log errors
#django.dispatch.dispatcher.connect(
# log_exception,
# django.core.signals.got_request_exception)
次app.yamlをhttp://code.google.com/appengine/articles/django.html を参考につくる
application: ueblog33
version: 1
runtime: python
api_version: 1
handlers:
- url: /static
static_dir: static
- url: /.*
script: main.py
静的ファイルを作る場所を指定してあるようなのでstaticディレクトリを作っておきましょう
% mkdir ueblog33/static
次にアプリを作ります。今回はhogeという名前のアプリにします。
% cd ueblog33
% python manage.py startapp hoge
次にsettings.pyの設定。やはりhttp://code.google.com/appengine/articles/django.htmlの例でいいのですが
- ROOT_URLCONF = 'urls' にする
- INSTALLED_APPSに今さっきつくったアプリを入れる
ようにしましょう。
# Django settings for ueblog project.
import os
DEBUG = True
TEMPLATE_DEBUG = DEBUG
ADMINS = (
# ('Your Name', 'your_email@domain.com'),
)
MANAGERS = ADMINS
LANGUAGE_CODE = 'ja'
SITE_ID = 1
USE_I18N = True
MEDIA_ROOT = ''
MEDIA_URL = ''
ADMIN_MEDIA_PREFIX = '/media/'
SECRET_KEY = '' #ここは自分のやつを使ってください
TEMPLATE_LOADERS = (
'django.template.loaders.filesystem.load_template_source',
'django.template.loaders.app_directories.load_template_source',
# 'django.template.loaders.eggs.load_template_source',
)
MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
#'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.middleware.doc.XViewMiddleware',
)
ROOT_URLCONF = 'urls'
ROOT_PATH = os.path.dirname(__file__)
TEMPLATE_DIRS = (
# Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
# Always use forward slashes, even on Windows.
# Don't forget to use absolute paths, not relative paths.
ROOT_PATH + '/templates',
)
INSTALLED_APPS = (
#'django.contrib.auth',
'django.contrib.contenttypes',
#'django.contrib.sessions',
'django.contrib.sites',
'hoge',
)
次にueblog33/urls.pyの編集
今回は
http://ueblog33.appspot.com/hoge/list/
で一行掲示板を作りたいので以下の通り
from django.conf.urls.defaults import *
urlpatterns = patterns('',
(r'^hoge/list/$', 'hoge.views.bbs_list'),
)
次に/hoge/list/でアクセスされた場合の処理を任せるueblog/hoge/views.pyを作ります。
google app engineではdjango.modelを使えないのでgoogle.appenine.ext.dbを使ってます。また、googleのusersも使ってみました。
#!-*- coding:utf-8 -*-
from django.shortcuts import render_to_response
from django import newforms as forms
from google.appengine.ext import db
from google.appengine.api import users
import datetime
class Entry(db.Model):
created = db.DateTimeProperty()
body = db.StringProperty(required=True)
class EntryForm(forms.Form):
body = forms.CharField(max_length=100, min_length=1)
def bbs_list(request):
form = EntryForm(request.POST or None)
if form.is_valid():
e = Entry(body=unicode(request.POST["body"], 'utf8'), #unicodeで渡す必要がある
created=datetime.datetime.now())
e.put()
form = EntryForm()
query = Entry.all()
query.order('created')
user = users.get_current_user()
if user:
nickname = ("%s (<a href='%s'>sign out</a>)" % (user.nickname(), users.create_logout_url("/hoge/list/")))
else:
nickname = "名無しさん <a href='%s'>Sign in or register</a>." % users.create_login_url("/hoge/list/")
return render_to_response('hoge/entry_list.html', {'form':form, 'object_list':query, 'nickname':nickname})
最後の行でhoge/entry_list.htmlというテンプレートを使うようにしてるのでそれもつくります。
% mkdir hoge/templates
% mkdir hoge/templates/hoge
まず、ベースになるbase.htmlを ueblog33/hoge/template/base.html
に作ります。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>{% block title %}{% endblock %}</title>
</head>
<body>
{% block content %}
{% endblock %}
</body>
</html>
つぎに ueblog33/hoge/template/hoge/entry_list.htmlを作ります。
{% extends "base.html" %}
{% block title %}HOGE{% endblock %}
{% block content %}
<ul>
{% for object in object_list %}
<li>{{ object.body|escape }} : {{ object.created|date:"Y-m-d (D) H:i:s" }} : {{ nickname }}</li>
{% endfor %}
</ul>
<p>
<form method="POST" action="." >
{{ form }}
<input type="submit" />
</form>
</p>
{% endblock %}
次にローカル環境で動かす
最初のueblog33の親ディレクトリに移動して
% cd ..
% python /usr/local/bin/dev_appserver.py ueblog33
をするとhttp://localhost:8080/hoge/list/
で先ほどつくったアプリが動く。Ctrl + C で止まる(Windowsは止まらないのでタスクマネージャーから無理矢理止めた)
ちなみにローカルのdatastoreをクリアするには
% python dev_appserver.py --clear_datastore ueblog33/
とやる。
うまく動いているようなら
% python /usr/local/bin/appcfg.py update ueblog33
でデプロイできます。
django.modelが使えないのならdjango使う旨味はない気もしましたが、djangoはテンプレートとかよくできてるのでそれはそれでありな気がします。
試してから書きますけどThe Expando Classはかなり衝撃的な気がします。
http://code.google.com/appengine/docs/datastore/expandoclass.html
※ よくよく考えてみたらgoogle app engineに入ってるdjango 0.96じゃなくて最新版のでもいいのではないかと思ったらeveresさんがやっていた。
http://www.everes.net/2008/apr/09/django-on-google-app-engine/
小さな王様と約束の国 ファイナルファンタジー・クリスタルクロニクル
April 04, 2008 at 08:52 AM | View Comments先日、Wiiの新作ソフトのダウンロード販売「WiiWare」がスタートしたので、僕は「ドクターマリオ&細菌撲滅」と「小さな王様と約束の国 ファイナルファンタジー・クリスタルクロニクル」を購入したのですが両ソフトとも非常に楽しいです。
ドクターマリオの楽しさは僕が始めて遊んだGB時代から相変わらずなのですが、それほど期待してなかったけど試しに買ってみた「小さな王様~」の方は予想以上に面白いです。かなり衝撃を受けました。
そもそも、ファイナルファンタジー、FFCCが好きでもない僕がこのゲームを購入しようとおもったきっかけは今年(2008年)の2月に米サンフランシスコで開催されたテレビゲーム開発者向け技術会議「GDC(ゲーム・デベロッパーズ・カンファレンス)」における開発者の土田氏と白石氏の公演の記事を読んだことがきっかけでした。
【GDC08】スクエニ土田氏と白石氏がWiiウェアでの『クリスタルクロニクル』の開発について語る - iNSIDE
記事によればネットワークゲームであるFFIXのサーバーエンジニアだった白石氏がWiiウェアの概要を聞き企画を提案して実現したゲームとのことです。
ポイントはWiiウェアのソフトを開発するという会社の決定から開発者へ命令が下って作られた上(会社)から下(開発者)へ意思が流れるものではなく、開発者が意欲をもって会社に提案して作られたゲームということです。
さらに「プランナー1人、プログラマー2人、デザイナー5人の8人による開発(最大時で17名)」という小規模開発というのもポイントです。
大規模開発のゲームは豪華でそれはそれでよいのですが、大勢の開発者たちが共通のゴール(完成したゲーム)を意識して作らなければいけないので斬新なアイディアというものはどうしても生まれにくいようです。
例えば大規模開発だったGC&Wii版のゼルダの伝説と小規模開発のDS版のゼルダの伝説なら斬新なアイディアや小気味の良さといえば断然DS版の方がよく出来ていた。
僕はどちらかと言えばメイン開発者(ディレクター)が、一人の人間が見渡せる範囲で責任と情熱をもって作り上げたゲームが好きなので断然DS版が好きです。
「小さな王様~」も
「自分を含めて核となった5名のスタッフは常に一緒に行動していた。毎日、会社に行くのが楽しかった」(白石氏)
とまで言っているので、面白いか面白くないかは別として情熱あふれるゲームなんだろうなと期待してました。
また開発環境が
開発言語にもC++ではなくSquirrelと、任天堂から提供されるライブラリ「NintendoWare」が併用されました。
というのも面白いなと思いました。僕はC++は触ったこともないし、Squirrelという言語は初耳でしたが、やってることはWebプログラマーがスクリプト言語とオープンソースのライブラリを駆使して新規サービスを立ち上げるのに近い感覚なんじゃないかと思いました。
実際、ゲームの核になる部分は一人のプログラマーが3ヶ月で作ったようです。
想像ですが、新しいジャンルのゲームの核の部分を面白くするためには何度も試しに作って壊す、また作って壊すという作業が必要なため性能はいいけど固いC++じゃなく、LLに近い柔らかいSquirrelという言語を使ったのではないかと思います。
そんな訳で購入した「小さな王様~」ですが、これは本当に面白い!
「国造りRPG」という変わったジャンルなのですが、これはウィザードリー系の最初の町を0から造りあげる感じです。
普通のRPGで操作する冒険者達は一切操作できずに目的を与え、報告を受けるのみになります。
最初は武器屋もないのですが、ゲームが進むにつれ作ることができるようになり、防具屋、道具屋~と、プレイヤーの成長に合わせいろいろなものが作ることができます。
要素要素は既存のものでありがなら組み合わせると衝撃的に新しい感覚ということでは、はじめてファイヤーエムブレムをやったときに受けた衝撃に近いものがあります。
当時、既存の大戦略やファミコンウォーズのようなシミュレーションゲームとRPGを組み合わせることで全く新しい感覚を受けたのですが(今では珍しくもないがシミュレーションRPGというジャンルは当時なかった)、今回は「シムシティ + RPG」という組み合わせ。
ファイヤーエムブレムも「気がつけば数時間、、、、」という感じでやりましたが、「小さな王様~」も同じくらい夢中でやってます。
ちなみに130日目(十数時間)でそろそろ1周目クリアというところです。
もちろん追加データを買って2週目もやる予定です。
さて、一部では「1週間で追加データ販売とは、、、最初から入れてくれよ~」と評判の悪い別売の追加データですが、そういう形式だからこそ最初の価格が1500円になったと思えば十分じゃないでしょうか?
最初から追加データを買わないと面白くない悪徳商法のようなゲームじゃないかと思われたかもしれませんが、「小さな王様~」に関しては最初の1500円分で十二分に楽しめる作品です。追加データは1500円分遊んで「面白い」と判断した人が買うものなので「ずるずると金を取られ続けるのではないか?」と思って買うのを躊躇するのは勿体ないです。
とにかく安いですし、ネットでの評判も上々なので、ちょっとでも気になった人は買って遊んでみてください。
(ネットの評判を知るのには最近はYahoo!ブログ検索を使うことが多いです。)







