2013-04-30

Animes in the 1st quarter of 2013

アニメは IT エンジニアの必須科目です。 ということで簡単なレビューを。

まず先に、原作を未読なのを謝罪しておく。話の内容より、テンポが速過ぎてまるでアメリカのアニメを見ているようだった。これがジョジョらしいのか私には判断不能だが、新鮮な感覚ではあった。中だるみがないので見るのは苦でなかったが、声優のチョイスはあれで良かったのか疑問が残る。

女子向けとかいう以前に、まずヒロインに問題あり。自己主張が乏しく、始終相手に流されっ放しでフラストレーションが溜まる。更に相棒がそれに輪を掛けて役立たずで、見ていて爆発しそうになる。途中から開き直って、何処までつまらないか見届けるつもりになったら、楽になった。OP が良かったのがせめてもの救い。

この辺から原作をチラ見していた。なので気付いたが、アニメ版は結構と端折られているらしい。話は、前作までを見ているなら安定して見れる。ただ「熱さ」は若干薄れたように思う。正直、原作を読んだ方が面白いような気もする。あと、アニメで見返してみても、扉絵のネタは凝りすぎて全然ウマくない思うのは私だけだろうか。

本編(絶チル)とは逆のシリアス路線は、完全に失敗だったと思う。ギャグの無い本シリーズなんて、つまらないにも程がある。何よりも致命的なのは、本作の女子キャラが可愛くないこと。原作のパティが何故あんな風になるのか、責任者を小一時間ほど問い詰めたい。このシリーズは原作を読むのが一番という結論。

見始めたときは、まさか一年続くとは思わなかった。知ってたら見なかったと思う。前宣伝通り声優陣は豪華で、ギャグがイマイチな分を声優の力量で補ってもらった感が大きい。今回の演技では、神谷浩史、森川智之を見直した。当初は笹子さん目当てで見ていたのだが、作画のブレが大きく、何か途中からどうでも良くなった。

企画自体は数年前から進行中らしく、キャラ付けはできている模様。聞いたことの無い声優を使うのは構わないが、歌がヘタなのが問題。逆に歌が上手い声優は演技がダメという。話も、1 クールしかないんだからメンバー集めに四苦八苦する描写とか要らなかった。決して嫌いでは無いのだが、イマイチ感の残る作品だった。

京アニということで視聴。キャラがけい○ん!を彷彿とさせるのは置いておいて、見る分には退屈することは無かった。しかし、この作品を京アニが作った意図が分からない。今までの作品は何らかチャレンジ精神的なものを感じたのだが、今回はそれを感じ取れなかった。まあ、某鳥が Gu-Gu ガ○モっぽい件は挑戦と言えなくも無い。

魔王と勇者、在り来たりな題材をどう料理するのかと思ったら、魔法は使わず経済で世界に挑むという予想外の展開。普通なら勇者一行の人外の強さがバランスを崩すところだが、バトルは本質では無いので何とか保っている。ただ話が少し難解。もっとバカ向けに「おっぱい」を前面に持ってきて良かった、というか寧ろそれを希望。

オーソドックスなファンタジーかと思いきや、銀魂臭の漂うギャグ作品。OP のルビ振りは一度は見ておくべき。しかし、見るべきものはそれだけ。肝心のギャグは面白くないのに加え、作ってる連中は面白いと思っている感が伝わってきて、特に後半になる程に鬱陶しい。真面目路線で作ってハズすのよりは幾分マシか、という所。

絵は綺麗。OP を見れば、製作陣のこの作品に対する思いが伺える。しかし中身がそれに付いていっていない。四人目の登場で猛烈な挽回を見せるが、というか、もうこの娘がメインヒロインで良くね? という程にヒロインのキャラが弱い。いっそのこと、主人公を除くヒロイン全員が中二病、という設定の方が面白かったのでは。

前期からの視聴。そのまま楽しく歌っていれば良かったものを、苦悩や葛藤を織り込んだせいで、在り来たりな話になった。また、メインキャラとサブキャラがはっきり分かれてしまい、前期でいい味を出しつつあったサブキャラがこぞって潰れてしまった。色んな意味で前期からデグレードしたと思う。

鍵っ子が生まれる理由に興味があり視聴。筋肉バカは論外として、最初はベタなキャラばかりの印象を受けるが、2 クールかけて各キャラを掘り下げていくため、感情移入もあって気にならなくなる。しかし結局キャラ紹介に終始した感があり、どう終わらせるのかと思ったら、まさか続くとは思わなかった。OP・ED は良い。

一般に相棒が頼りになる奴の場合、その相方は引っ込み思案で内気キャラというのが相場だが、本作では中々に強かで度胸のあるキャラで好感が持てる。しかしそれも前半の話。後半はとても同じ作者が作ったとは思えないくらい、見ていられない話になる。これ本当に同一人物が作った? 前半で期待しただけ、残念な結果だった。

影のあるイケメンが沢山出てきて適度に絡む、という女子向け作品に良くあるパターン。男子にとって一番つまらないパターンとも言う。唯一、浜路の存在が救い。彼女にだけは萌えられる。ただ女子的に需要が無いのだろう、出番が少ないのが悲しい。次回はもっと浜路を頼む。最早それだけがこの作品を見るモチベーション。

原作は序盤でリタイア。アニメで魅力を発見できるかと思ったが、やはり叶わなかった。まず主人公に魅力が無い。アリババは正義感をかざすくせにウジウジで見ててイライラする。モルさんはもっと萌えるキャラにできたはず。やはりこの作者は王道ファンタジーではなく、すもも(前半)のようなノリが合っていると思う。

思ったよりも早い再開だったな、と思ったら、やっぱり早すぎた模様。それも「原作」ではなく「製作」の方が、というのが問題。映画と平行のせいか、製作が追いつかないなら素直に止めた方が良かったのでは。これでは映画の宣伝がやりたかっただけ、と思われても仕方がない。次回は万全の状態でお願いしたい。

最初、凝ってはいるが地味な作品だと思ったが、最後まで見て評価が変わった。世界観は一貫してブレが無く、ギャグも息抜きも無いシリアス一辺倒でありながら、見るのが苦にならず最後まで見ることができた。OP/ED も含め、隅々まで製作者の拘りを感じる。目を惹く華やかさは無いが、大人が楽しめる良作。

見る前からフラウ坊のイメージしかない作品だが、この作品の不幸は前作(シュタインズ)が偉大過ぎたこと。普通ならば十分に良作だと思うが、相対的に評価が下がってしまうのは仕方が無いところ。しかし OP/ED の作詞・作曲までをも手掛ける志倉千代丸のマルチタレント性は、悔しいが認めざるを得ない。

見た感じで期待はしていなかったが、大方は予想通りだった。各キャラの個性が微妙な上に、全体的に取って付けたような話で終始している。所詮はパチンコが出自の作品か。ただ例外として、第十一話だけは面白かった。ああいうノリで全編を通していたら、もっと評価は違ったと思う。

心が読めてしまう超能力者、まともに描けば重くなるのは必至。いきなり初話で重い話を突きつけられるが、二話目で救われる。以降も周りキャラの明るさに助けられるので、安心して見ていられる。やはりアニメはこうでないと。○○ロ○ネクトも少しは見習って欲しい。ただ、森谷さんは途中でキャラが変わり過ぎだと思う。

パステル調の絵に惹かれて視聴。何というか、青緑色が目に心地よい。この作品は部長が可愛いと思えるかが全てだと思う。私は三話目くらいから可愛く見えてきたので問題なし。今回は内田真礼の頑張りを評価。あと途中参加のタマの必要性が疑問だったが、意外に SD キャラが一番可愛いのがタマで、これも問題なかった。

弱小コミュニティの成り上がり物語かと思ったら、最後の方は何か違った。主人公が万能過ぎるのと最後の謎解きが独りよがりなのがマイナスポイント。前半の話は嫌いではなかったが、最終的にはラノベをアニメにしました、という以上にはならなかったように思う。

2013-03-31

RHEL6: ifconfig is obsolete!

前回エントリで、expand_config を見て気付いたことがある。

RHEL6 では、インターフェイスに複数の IP アドレスを設定できるらしい。そういえば OS インストール時のネットワーク設定画面では、複数 IP アドレスが登録できそうな UI になっていた。今まで試したことはなかったが、実際にそこで複数 IP アドレスを設定してみると、ifcfg-* は次のようになる。

RHEL6.4: /etc/sysconfig/network-scripts/ifcfg-eth0:

DEVICE=eth0
TYPE=Ethernet
UUID=7f36ffb3-0b2a-48d5-9e81-18b685396f06
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
HWADDR=00:0C:29:94:42:BD
IPADDR=192.168.0.1
PREFIX=24
IPADDR2=192.168.0.2
PREFIX2=24
IPADDR3=192.168.0.3
PREFIX3=24
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME="System eth0"

これは完全に意図通りに動く。もう仮想インターフェイスなんて(eth0:1 とか)必要ない。ていうか、できるんだったらもっと早く(略)。尤も、IP アドレス毎に ifup / ifdown する必要があるなら、仮想インターフェイスは相変わらず有用ではある。

しかしインターフェイスに複数の IP アドレスを設定できるなら、今現在インターフェイスで有効な IP アドレスを知る手段も必要になる。これらは 2 つで 1 つ、どちらか一方だけでは意味がない。しかし残念ながら、ifconfig はその役には立たないらしい。

[rhel64]# ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 00:0C:29:94:42:BD
          inet addr:192.168.0.1  Bcast:192.168.0.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe94:42bd/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:42649 errors:0 dropped:0 overruns:0 frame:0
          TX packets:18439 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:26605808 (25.3 MiB)  TX bytes:2001382 (1.9 MiB)

困った時の、man 頼み。

[rhel64]# man ifconfig
NAME
       ifconfig - configure a network interface

SYNOPSIS
       ifconfig [interface]
       ifconfig interface [aftype] options | address ...

NOTE
       This  program  is obsolete!  For replacement check ip addr and ip link.
       For statistics use ip -s link.

obsolete! と言ってくれたところで、一体どれだけの人が気付くというのか。今回のことがなければ、私も man を読もうとは思わなかったし。それはともかく、これからは ip addr を使え、と。

[rhel64]# ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:94:42:bd brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.1/24 brd 192.168.0.255 scope global eth0
    inet 192.168.0.2/24 brd 192.168.0.255 scope global secondary eth0
    inet 192.168.0.3/24 brd 192.168.0.255 scope global secondary eth0
    inet6 fe80::20c:29ff:fe94:42bd/64 scope link
       valid_lft forever preferred_lft forever

この ip addr は RHEL5 でも動く。(RHEL4 以前は知らない)

以上より、

もう ifconfig は時代遅れらしいよ。

ちなみに前回の話に出た Webmin (1.620)だが、やはりこの複数 IP アドレスには対応していない。2 番目以降の設定は Webmin 画面からは見えないし、変更することもできない。よって Webmin でネットワーク設定を行うつもりなら、この複数 IP アドレス機能も使わない方が良い。

2013-03-27

RHEL6: PREFIX overrides NETMASK in `ifcfg-*'

RHEL6 インストール画面で固定 IP アドレスを設定すると、ifcfg-* には NETMASK の代わりに PREFIX という項目が記入される。名前から NETMASK の代替であることは分かるし、実際にそう動く。しかし、もし PREFIX と NETMASK の両方が設定され、その内容が矛盾していたらどうなるのか。

似た関係に NETMASK / NETWORK / BROADCAST があるが、これは公式ドキュメントに記載がある。

BROADCAST=address
where address is the broadcast address. This directive is deprecated, as the value is calculated automatically with ipcalc.
NETMASK=mask
where mask is the netmask value.
NETWORK=address
where address is the network address. This directive is deprecated, as the value is calculated automatically with ipcalc.

曰く、「NETWORK と BROADCAST は非推奨です」と。しかし、PREFIX については何処にも記述が見当たらない。試しに grep -i prefix /etc/sysconfig/network-scripts/* してみると、この辺りの処理を行っている場所は 1 か所しかない。

RHEL6.4: /etc/sysconfig/network-scripts/network-functions:

expand_config ()
{
    local i=0 val
    for idx in '' {0..255} ; do
        ipaddr[$i]=$(eval echo '$'IPADDR$idx)
        if [ -z "${ipaddr[$i]}" ]; then
           [ "$idx" ] && [ $idx -gt 2 ] && break
           continue
        fi
        prefix[$i]=$(eval echo '$'PREFIX$idx)
        netmask[$i]=$(eval echo '$'NETMASK$idx)
        broadcast[$i]=$(eval echo '$'BROADCAST$idx)
        arpcheck[$i]=$(eval echo '$'ARPCHECK$idx)

        if [ "${prefix[$i]}x" != "x" ]; then
            val=$(/bin/ipcalc --netmask "${ipaddr[$i]}/${prefix[$i]}")
            netmask[$i]=${val##NETMASK=}
        fi

        if [ "${netmask[$i]}x" = "x" ]; then
            val=$(/bin/ipcalc --netmask "${ipaddr[$i]}")
            netmask[$i]=${val##NETMASK=}
        fi

        if [ "${prefix[$i]}x" = "x" ]; then
            val=$(/bin/ipcalc --prefix ${ipaddr[$i]} ${netmask[$i]})
            prefix[$i]=${val##PREFIX=}
        fi

        if [ "${broadcast[$i]}x" = "x" ]; then
            val=$(/bin/ipcalc --broadcast ${ipaddr[$i]} ${netmask[$i]})
            broadcast[$i]=${val##BROADCAST=}
        fi

        if [ "${arpcheck[$i]}x" != "x" ]; then
            arpcheck[$i]=${arpcheck[$i]##ARPCHECK=}
            arpcheck[$i]=${arpcheck[$i],,*}
        fi

        i=$((i+1))
    done

    if [ -z "${NETWORK}" ]; then
        eval $(/bin/ipcalc --network ${ipaddr[0]} ${netmask[0]})
    fi
}

これによると、

  1. PREFIX が設定されていれば、PREFIX から NETMASK が計算される。
  2. NETMASK が未設定(空)であれば、IPADDR から NETMASK が計算(推測)される。
  3. PREFIX が未設定(空)であれば、IPADDR / NETMASK から PREFIX が計算される。

つまり、PREFIX は NETMASK より強い。ついでに言うと、公式ドキュメント通り BROADCAST と NETWORK はどちらも IPADDR / NETMASK から自動計算されるが、それは値が未設定(空)である場合に限られる。

念のため RHEL5 でも確認しておくと、

RHEL5.9: /etc/sysconfig/network-scripts/network-functions:

expand_config ()
{
    if [ -z "${NETMASK}" ]; then
	eval `/bin/ipcalc --netmask ${IPADDR}`
    fi

    if [ -z "${PREFIX}" ]; then
	eval `/bin/ipcalc --prefix ${IPADDR} ${NETMASK}`
    fi

    if [ -z "${BROADCAST}" ]; then
	eval `/bin/ipcalc --broadcast ${IPADDR} ${NETMASK}`
    fi

    if [ -z "${NETWORK}" ]; then
	eval `/bin/ipcalc --network ${IPADDR} ${NETMASK}`
    fi
}
  1. NETMASK が未設定(空)であれば、IPADDR から NETMASK が計算(推測)される。
  2. PREFIX が未設定(空)であれば、IPADDR / NETMASK から PREFIX が計算される。

これだけではどちらが強いのか分からないが、合わせて expand_config の呼び出し元(/etc/sysconfig/network-scripts/ifup-eth)を見ると、実際に使われるのは PREFIX の方だと分かる。

よって RHEL5 でも、PREFIX は NETMASK より強い。RHEL4 以前は使ってないので知らない。

そもそも何故こんなことを気にするかというと、現在の Webmin (1.620)が PREFIX に対応してないっぽいから。Webmin は NETMASK を設定するが、PREFIX には一切関与しない(消しもしない)。よって PREFIX と NETMASK の両方が ifcfg-* に記述される状況が生まれてしまう。もし Webmin でネットワーク設定を行うなら、事前に全ての PREFIX を NETMASK に変換しておいた方が良い。でないと、いつか痛い目を見る可能性がある。


2014-06-19 追記

今更だが、Webmin 1.630 にて PREFIX 対応が行われた。

2013-02-27

RHEL6: ssh-keygen: Permission denied

SSH 鍵を作ろうとすると、「Permission denied」と言われる。

[rhel62]# mkdir ~/.ssh

[rhel62]# chmod 700 ~/.ssh

[rhel62]# ls -dl ~/.ssh
drwx------. 2 root root 4096 Feb 27 09:04 /root/.ssh

[rhel62]# ssh-keygen -t rsa -N '' -f ~/.ssh/id_rsa ; echo $?
Generating public/private rsa key pair.
open /root/.ssh/id_rsa failed: Permission denied.
Saving the key failed: /root/.ssh/id_rsa.

パーミッションに抜かりなどある訳がない。失礼な。こういう時、真っ先に疑うべきは SELinux。

/var/log/audit/audit.log:

type=AVC msg=audit(1361923639.970:20915): avc:  denied  { create } for  pid=1932 comm="ssh-keygen" name="id_rsa" scontext=unconfined_u:unconfined_r:ssh_keygen_t:s0-s0:c0.c1023 tcontext=unconfined_u:object_r:admin_home_t:s0 tclass=file
type=SYSCALL msg=audit(1361923639.970:20915): arch=c000003e syscall=2 success=no exit=-13 a0=7f6f3282cb80 a1=241 a2=180 a3=fffffff7 items=0 ppid=1875 pid=1932 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts3 ses=2 comm="ssh-keygen" exe="/usr/bin/ssh-keygen" subj=unconfined_u:unconfined_r:ssh_keygen_t:s0-s0:c0.c1023 key=(null)

案の定、何か文句を言っている。~/.ssh のコンテキストを確認すると、

[rhel62]# ls -dZ ~/.ssh
drwx------. root root unconfined_u:object_r:admin_home_t:s0 /root/.ssh

何処が気に入らないのかは良く分からないが、ともかく restorecon してみる。

[rhel62]# restorecon ~/.ssh

[rhel62]# ls -dZ ~/.ssh
drwx------. root root unconfined_u:object_r:ssh_home_t:s0 /root/.ssh

何か修正されたっぽいので、リトライ。

[rhel62]# ssh-keygen -t rsa -N '' -f ~/.ssh/id_rsa
Generating public/private rsa key pair.
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
a7:14:6f:f0:8a:72:64:20:01:55:2b:24:4c:aa:a7:30 root@rhel62
The key's randomart image is:
+--[ RSA 2048]----+
|=++..            |
|.+ . .           |
|. o o   o        |
|.  o .   =       |
|E .   o S =      |
|.+   o o =       |
|.   . o o        |
|     o           |
|                 |
+-----------------+

動いた。ちなみに ~/.ssh を作るのを ssh-keygen に任せると、何もしなくても上手くいく。

[rhel62]# rm -fr ~/.ssh

[rhel62]# ls -dl ~/.ssh
ls: cannot access /root/.ssh: No such file or directory

[rhel62]# ssh-keygen -t rsa -N '' -f ~/.ssh/id_rsa ; echo $?
Generating public/private rsa key pair.
Created directory '/root/.ssh'.
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
e6:83:f6:38:dc:fc:eb:6a:45:f1:39:05:34:7d:ad:68 root@rhel62
The key's randomart image is:
+--[ RSA 2048]----+
|           .+o  .|
|          .  .o o|
|           o + o |
|          . E .  |
|        S. . .   |
|       +  .      |
|     .ooo.       |
|     .oo+.       |
|      .oo++.     |
+-----------------+

これは理屈としては理解できるが、非常に分かり辛い動作だと思う。

この理屈に従うと、作ったファイル・ディレクトリが SELinux のポリシーに沿っているかどうか、逐一確認しなければならくなってしまう。そういうことを平気で要求する SELinux の気が知れない。だから「SELinux 氏ね」とか言われるんだよ。:-p

ところでコンテキストの修正は restorecon で行えるが、現在のコンテキストが正しいかどうかはどうやって確認すれば良いのか。

matchpathcon を使え、と。

[rhel62]# rm -fr ~/.ssh

[rhel62]# mkdir ~/.ssh

[rhel62]# chmod 700 ~/.ssh

[rhel62]# matchpathcon -V ~/.ssh ; echo $?
/root/.ssh has context unconfined_u:object_r:admin_home_t:s0, should be system_u:object_r:ssh_home_t:s0
1

[rhel62]# restorecon ~/.ssh

[rhel62]# matchpathcon -V ~/.ssh ; echo $?
/root/.ssh verified.
0

注意点として、matchpathcon には絶対パスを渡す必要がある。でないと判定に失敗する。

[rhel62]# ls -dZ .ssh
drwx------. root root unconfined_u:object_r:ssh_home_t:s0 .ssh

[rhel62]# matchpathcon -V .ssh ; echo $?
.ssh has context unconfined_u:object_r:ssh_home_t:s0, should be <<none>>
1

これも理解できる動作ではあるが、やはり分かり辛い。もう少しマシなメッセージは出せないのかと文句を言いたい。

と、いうようなことを実は 1 年以上前にやっていたのだが、最近になって RHEL6.3 では本現象が起こらないことに気が付いた。調べてみると、この辺か。

「理解できる」と言っておいてアレだが、どうやら仕様ではなかったらしい。

2013-01-20

Animes in the 4th quarter of 2012

アニメは IT エンジニアの必須科目です。 ということで簡単なレビューを。

最初、主人公は一匹狼的でカッコ良さげなのだが、ヒロインと合流してからヘタれてしまう。このヒロインは男をダメにするサゲ○○に思えてならない。アクセル・ワールドと同じ作者と聞いて、妙に納得した。この人は世界観は良いが、脚本がダメなんだと思う。音楽だけは良いと思ったら、梶浦由紀だった。これも納得。

序盤は人類が天敵にエサにされるという展開。またキツいのが始まったなあ、と思っていたら、後半は殆ど人間の話になった。人の敵は人の心の中にこそある、というのは真実だとは思うが、結果として至って普通の話になった。個人的には、最初の絶望的な雰囲気で進めて欲しかった。きっと見るのは鬱になっただろうけど。

第一章はさっぱり面白くなかったが、第二章も変わらず。団結力だけが取り柄の弱っちい主人公達が仲間割れしたら、いったい何を褒めれば良いのか。最後に強くカッコよくなるが、その過程が理不尽。想いだけで強くなれたら世話ない。第一章と同様、OP くらいしか褒められるところが無かった。

少女マンガ原作ながらイマイチだった。ヒロインが惚れっぽくて話の展開が読める。神様の仕事そっちのけで狐とイチャつくことしか頭にない神様ってどうよ。まあ確かに年頃の女子とはそういうものだろうが、話もギャグも中途半端でお気に入りのキャラも無し、というのが正直な感想。ただ OP・ED は作品の雰囲気に合った良作。

原作は読んでたつもりだったが話がさっぱり思い出せない。と思ったら、実はアニメ用のオリジナルだったらしい(by Wikipedia)。そのせいかは分からないが、個人的にはイマイチな内容だった。本シリーズにしては、話が真面目すぎる気がする。まあ私はアニメより漫画の方が面白いと思ってるので、私的には問題ない。

今度は戦車を女子化か!?と思ったら流石にそれは無かった。戦車のことは知らないが、戦車の挙動がやけにリアルで、嘘かも知れないが本当にドリフトとかしそうに思える。個人的には好きな作品だったが、決勝戦の最中に「私たちの戦いはこれからです!!」と衝撃の終わり方。決して不人気のせいではなく、内部事情だと思いたい。

本シリーズは初めての視聴。原作も未読なので、最初は女子キャラの区別が付かなかった。ご都合展開全開の作品だが(何故いちいちパンツに突っ込む?という台詞は道理)、長寿作品なだけあって各キャラの個性は立っている(主人公を除く)。ただ長女の扱いがサブキャラ並みだなと思ったら、本作は一応スピンオフ作品だとは知らなかった。

原作は最初の五話くらいで挫折。ただ現在も連載中なので、アニメで魅力を発見できるかと期待したが、もう全然ダメだった。主人公、ヒロイン、敵の親玉、どいつの台詞も嘘くさくて私には全く受け付けられない。これは次回作があっても見ないと断言できる。

前期からの続き。序盤は雰囲気が変わったように思えて心配になったが、中盤以降は元に戻ったので安心。ただし最終回は消化不良。いきなり「2 年後」もそうだが、ヨナの心の変化、どう納得したのかが良く分からなかった。サブキャラの近況描写も一瞬だし、「風」の意味も不明。まあそれを差し引いても、全体としては十分に満足。

今クールの少女マンガ原作では、ダントツの出来。ギャグベースのドタバタ劇に、出てくる女子キャラは(サブキャラでさえも)魅力的で、見ていて飽きない。少女マンガ原作はこうでないとね。今回は「種﨑敦美」を覚えた。鈴木達央も今回の演技で見直した。唯一の不満は、最終回があっさり過ぎて終わったことに気付かなかったこと。

典型的な少女マンガという印象。内気なヒロイン、自分勝手で強引なイケメン、ライバルの出現。最初「君に届け」とデジャヴったが、君届には全く及ばなかった。風早くんの方がよっぽどいい奴だし、シリアス一辺倒で話に遊びがない(最終回を除く)。次回予告は良かったが、そういう遊びを本編にも入れて欲しかった。

まず目を引くのが独特な画質。特に空間制御魔法の描写が印象的。キャラも主人公以外は魅力的で、個人的にはネコがお気に入り。ただ、話がキャラに追いついていない感じがする。キャッチコピーの「きずな」は何処に出てきた? 結局ネコが何者かも分からないし。まあ既に続編が決定しているらしいので、そちらでの解決に期待。

大して期待していなかったが、賑やかさ・パロディー・エロス(?)など、その方面で期待していた「生徒会の一存」を食ってしまった。しかしそれは同時に、万人から見るととても「疲れる」作品になってしまった可能性も否定できない。個人的には元ネタが分からないパロディーがあったのが悔しい。まだまだ勉強が足りないようだ。

前作が結構好きだったので、引き続き視聴。しかし前作の勢いが感じられず、前半は空回りが目立つ印象。林檎、飛鳥での話のような盛り上がりがもっとあれば良かった。この作品の肝は生徒会メンバーの「デレ」だから。制作会社や声優が変わったりと扱いが不憫だが、そこまでして第二期を製作する必要があったのかは疑問。

2012-12-16

Python: cElementTree returns non open object

xml.etree.cElementTree は、xml.etree.ElementTree の C 実装だ。

ElementTree クラスはエレメントの構造を包み込み、それと XML を行き来するのに使えます。

この API の C 実装である xml.etree.cElementTree も使用可能です。

C 実装であること以外、ElementTree と cElementTree の違いについては述べられていない。違いがないなら、C 実装の方を使わない手はない。しかし、

$ python
Python 2.6.6 (r266:84292, Sep 12 2011, 14:03:14)
[GCC 4.4.5 20110214 (Red Hat 4.4.5-6)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import xml.etree.ElementTree
>>> html = '<html></html>'
>>> tree = xml.etree.ElementTree.fromstring(html)
>>> tree.html = html
>>> tree.html
'<html></html>'
$ python
Python 2.6.6 (r266:84292, Sep 12 2011, 14:03:14)
[GCC 4.4.5 20110214 (Red Hat 4.4.5-6)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import xml.etree.cElementTree
>>> html = '<html></html>'
>>> tree = xml.etree.cElementTree.fromstring(html)
>>> tree.html = html
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: html

cElementTree が返すオブジェクトはオープン・オブジェクトではないらしく、属性を追加することができない。C 実装されたモジュールとはそういうもんか、とも思ったが、

$ python
Python 2.6.6 (r266:84292, Sep 12 2011, 14:03:14)
[GCC 4.4.5 20110214 (Red Hat 4.4.5-6)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import cProfile
>>> p = cProfile.Profile()
>>> p.foo = 'foo'
>>> p.foo
'foo'

同じ C 実装モジュールの cProfile では問題ない。想像するに、ElementTree の場合、木構造で大量のオブジェクトを使用するためメモリをケチってるのかも知れない。

ともかく、RHEL5 + elementtree で作ったスクリプトを RHEL6 で動そうと喜んで cElementTree を使った私にとっては、この上ないぬか喜びだった。

2012-11-21

psycopg2: Can't mogrify `None' in a tuple to `NULL'

RHEL6 付属の psycopg2 で、

# rpm -qa | grep psycopg
python-psycopg2-2.0.13-2.el6_1.1.x86_64

tuple 中にある None を mogrify するとエラーになる。

test1.py:

#!/usr/bin/python

import psycopg2.extensions

def main():
    conn = psycopg2.connect('dbname=testdb user=testuser')
    cur = conn.cursor()
    for param in [0, [0], (0,), '', [''], ('',), None, [None], (None,)]:
        print '%s\t->' % repr(param), cur.mogrify('%s', [param])

if __name__ == '__main__':
    main()
$ python test1.py
0       -> 0
[0]     -> ARRAY[0]
(0,)    -> (0)
''      -> E''
['']    -> ARRAY[E'']
('',)   -> (E'')
None    -> NULL
[None]  -> ARRAY[NULL]
(None,) ->
Traceback (most recent call last):
  File "/root/tmp/test1.py", line 12, in <module>
    main()
  File "/root/tmp/test1.py", line 9, in main
    print '%s\t->' % repr(param), cur.mogrify('%s', [param])
  File "/usr/lib64/python2.6/site-packages/psycopg2/extensions.py", line 100, in getquoted
    qobjs = [str(o.getquoted()) for o in pobjs]
AttributeError: 'str' object has no attribute 'getquoted'

落ちている場所は、

/usr/lib64/python2.6/site-packages/psycopg2/extensions.py:

# The SQL_IN class is the official adapter for tuples starting from 2.0.6.
class SQL_IN(object):
    """Adapt any iterable to an SQL quotable object."""

    def __init__(self, seq):
        self._seq = seq

    def prepare(self, conn):
        self._conn = conn

    def getquoted(self):
        # this is the important line: note how every object in the
        # list is adapted and then how getquoted() is called on it
        pobjs = [adapt(o) for o in self._seq]
        for obj in pobjs:
            if hasattr(obj, 'prepare'):
                obj.prepare(self._conn)
        qobjs = [str(o.getquoted()) for o in pobjs]
        return '(' + ', '.join(qobjs) + ')'

    __str__ = getquoted

register_adapter(tuple, SQL_IN)

print デバッグすると直ぐに分かるが、このとき o には 'NULL' という文字列(str 型)が入っている。当然、単なる文字列に getquoted なんてメソッドがあるはずがない。そりゃ落ちるわ。

何がどうあるべきなのかは分からないが、「動かないシステムに価値はない」の持論に従い、ともかく動くようにする。

test2.py:

#!/usr/bin/python

import psycopg2.extensions

# Fix a bug that can't mogrify `None' in a tuple to `NULL'
class FIXED_SQL_IN(object):
    def __init__(self, seq):
        self._seq = seq

    def prepare(self, conn):
        self._conn = conn

    def getquoted(self):
        adapt = psycopg2.extensions.adapt
        pobjs = [adapt(o) for o in self._seq]
        for obj in pobjs:
            if hasattr(obj, 'prepare'):
                obj.prepare(self._conn)
        qobjs = [getattr(o, 'getquoted', o.__str__)() for o in pobjs]
        return '(' + ', '.join(qobjs) + ')'

    __str__ = getquoted

psycopg2.extensions.register_adapter(tuple, FIXED_SQL_IN)

def main():
    conn = psycopg2.connect('dbname=testdb user=testuser')
    cur = conn.cursor()
    for param in [0, [0], (0,), '', [''], ('',), None, [None], (None,)]:
        print '%s\t->' % repr(param), cur.mogrify('%s', [param])

if __name__ == '__main__':
    main()
$ python test2.py
0       -> 0
[0]     -> ARRAY[0]
(0,)    -> (0)
''      -> E''
['']    -> ARRAY[E'']
('',)   -> (E'')
None    -> NULL
[None]  -> ARRAY[NULL]
(None,) -> (NULL)

ということを、実は 2 年くらい前に RHEL5 + psycopg2-2.0.12 (from rpmforge)という組み合わせでやっていたのだが、最近になって検索すると次が出てきた。

本件は psycopg2-2.4 で直っている模様。しかし私が試した限り、この変更部分を 2.0 系に持ってきても動かない。None に対してアダプターを登録しても、全く動く気配がない。None に対するアダプターが動くようになる変更が 2.4 までの何処かに入ったのかも知れないが、私的にはもう上述の方法で解決しているのでこれ以上は調べる気なし。