2016-10-27

Windows batch: Multi-level variable expansion

この間 getopt.cmd を書いていて思った。変数展開した結果を変数展開するにはどうすればいいんだろう?、と。言葉にすると難しいが、要は C 言語でいうところの、ポインターのポインターから元データを参照する感じ。

call を使うのがいいようだ。call には変数展開後の文字列が引数として渡るので、どんなコマンドにも応用できる。call にこんな使い方があったとは。

test.bat:

@echo off
set hoge=HOGE
set r_hoge=hoge
set rr_hoge=r_hoge
echo %hoge%
call echo %%%r_hoge%%%               & rem run 'echo %hoge%'
call call echo %%%%%%%rr_hoge%%%%%%% & rem run 'call echo %%%r_hoge%%%'
>test.bat
HOGE
HOGE
HOGE

Windows バッチはこういう妙なところで懐が深かったりする。やろうと思えば大抵のことは(頑張れば)できる。でもどんな良い面があっても、圧倒的マイナス面で ks 扱いされる Windows バッチさん。

2016-10-23

Windows batch: Getopt

Windows バッチが ks なことは今さら言うまでもないが、最もお手軽な手段であることも事実。特にユーザーに配布して実行させたい場合、環境の差異を気にしないくて良いのは何にも勝る利点だ。同様の意味で WSH も素晴らしいが、結果が同じならよりシンプルな方を選びたい。

という訳で私はよくバッチも書くが、ちょっと凝ったバッチを書こうとしたとき、オプション処理にはいつも悩まされる。きちんとやろうとすると面倒だし、どうせならこの手の処理は共通化したい。誰か getopt みたいなやつ作ってねーのかよ、と偶にググってみても、これといったものが見つかった試しがない。

まあ、もしバッチでできたらとっくに誰か作ってるよねー、と今までは諦めていたのだが、今回ふと思って試してみた。

test.bat:

@echo off
setlocal
set opt=hoge
set opt_%opt%=HOGE
echo opt_hoge=%opt_hoge%
>test.bat
opt_hoge=HOGE

え!? set の左辺で変数展開できちゃうの?

そうか、set もコマンドだから、引数中の変数は展開されてから set に渡るのか。ていうか、これ使えば getopt できるんじゃね?

getopt.cmd:

@echo off

if not "%~1"=="/?" goto :main
echo.Usage:
echo.  call %~nx0 [/OPTION[:VALUE]]...
echo.
echo.Description:
echo.  Parse options and define 'OPT_^<OPTION^>' variables, and set 'OPTIND' as
echo.  the number of processed arguments.
echo.
echo.Exsample:
echo.  When a batch file is invoked with arguments,
echo.
echo.    ^>example.bat /foo /bar:BAR /baz:"B A Z" arg1 arg2 ...
echo.
echo.  In the batch file, a typical usage is:
echo.
echo.    call %~nx0 %%*
echo.    for /L %%%%i in (1,1,%%OPTIND%%) do shift /1
echo.
echo.  Then a boolean option '/foo' can be tested as below.
echo.
echo.    if defined OPT_FOO ^(
echo.      echo /foo was given
echo.    ^) else ^(
echo.      echo /foo was not given
echo.    ^)
echo.
echo.  Other options have a value can be used as regular variable.
echo.
echo.    echo bar=%%OPT_BAR%%
echo.    echo baz=%%OPT_BAZ%%
echo.
echo.  Remaining arguments are referred through batch parameter.
echo.
echo.    echo args=%%1 %%2 %%3 %%4 %%5 %%6 %%7 %%8 %%9
echo.
echo.  Note that '%%*' batch parameter is never updated by 'shift'.
exit /b 1

:main
set OPTIND=0

:_loop_args
  set _getopt_arg=%1
  if defined _getopt_arg (
    call :parse_arg %_getopt_arg%
    if not errorlevel 1 (
      shift /1
      set /a OPTIND+=1
      goto :_loop_args
    )
  )
set _getopt_arg=
set _getopt_opt=
set _getopt_value=
set _getopt_bool=
exit /b 0

:parse_arg
set _getopt_opt=
set _getopt_value=%~1
set _getopt_bool=1
if not "%_getopt_value:~0,1%"=="/" goto :_parse_arg_ret
set _getopt_value=%_getopt_value:~1%
:_loop_arg_chars
  if not defined _getopt_value goto :_parse_arg_ret
  if "%_getopt_value:~0,1%"==":" (
    set _getopt_bool=
    set _getopt_value=%_getopt_value:~1%
    goto :_parse_arg_ret
  ) else (
    set _getopt_opt=%_getopt_opt%%_getopt_value:~0,1%
    set _getopt_value=%_getopt_value:~1%
  )
  goto :_loop_arg_chars
:_parse_arg_ret
if not defined _getopt_opt exit /b 1
if defined _getopt_bool (
  call :set_opt %_getopt_opt% %_getopt_bool%
) else (
  call :set_opt %_getopt_opt% %_getopt_value%
)
exit /b 0

:set_opt
set OPT_%1=%~2
exit /b 0

できちゃった :-D。使い方は次の通り。

test_getopt.bat:

@echo off
setlocal

call getopt.cmd %*
for /L %%i in (1,1,%optind%) do shift /1

if defined opt_hoge echo /hoge was given
if not defined opt_hage echo /hage was not given
echo /piyo=%opt_piyo%
echo /fuga=%opt_fuga%
echo /boke=%opt_boke%
echo %1 %2 %3 %4 %5 %6 %7 %8 %9
>test_getopt.bat /hoge /piyo:PIYO /fuga:"FU GA" /boke: arg1 arg2 ...
/hoge was given
/hage was not given
/piyo=PIYO
/fuga=FU GA
/boke=
arg1 arg2 ...

まだ改良の余地はあると思うが、私が使うには当面これで十分。

ところで今回の件で、Windows バッチは変数名に記号(どころか空白も!)を使えることを知ったが、ならば getopt.cmd に /? を渡せば変数 opt_? を定義してくれそうに思う。しかしそれは叶わない。

>call getopt.cmd /?
バッチ プログラムを別のバッチ プログラムから呼び出します。

CALL [ドライブ:][パス]ファイル名 [バッチパラメーター]

  バッチパラメーター   バッチ プログラムで必要なコマンド ライン情報を指定します。

コマンド拡張機能を有効にすると、CALL は次のように変更されます:

<...snip...>

call が /? を奪い取る模様。やっぱ Windows バッチって ks だわ。

2016-10-11

ADODB.Stream: Read write-locked file

あるシステムのログ集計を、Excel マクロでやろうとしたときのこと。

ログは UTF-8 で書かれており、ググれば ADODB.Stream を使えば良いことは直ぐに分かる。ほどなくマクロは完成し、本番投入の直前、その問題は発覚した。

ADODB.Stream.LoadFromFile は、書き込みロックが掛かったファイルを読み込めない!

それはつまり、システムが開いている当日分のログを集計できないことを意味する。しかし、今回の要件としてそれは受け入れられない。何てこった。そんなこと Google 先生も教えてくれなかったよ。

Sub Test1()
    With CreateObject("ADODB.Stream")
        .Type = 2   ' 2=adTypeText
        .Charset = "UTF-8"
        .Open
        .LoadFromFile "WriteLocked.txt"
        ' ReadText...
        .Close
    End With
End Sub

ならば、アクセスモード(Stream.Mode)を読み取り専用(adModeRead)にすれば開けるはず・・・、

Sub Test2()
    With CreateObject("ADODB.Stream")
        .Mode = 1   ' 1=adModeRead
        .Type = 2   ' 2=adTypeText
        .Charset = "UTF-8"
        .Open
        .LoadFromFile "WriteLocked.txt"
        ' ReadText...
        .Close
    End With
End Sub

どういうことなの。

恐らく、アクセスモードは Stream に対してのものであり、Stream が読み取り専用となったために Stream への書き込みメソッドである LoadFromFile がブロックされたのだと思われる。そうすると LoadFromFile に対してアクセスモードを指定する術がない以上、この方向での解決策は絶望的に思える。

ではファイルの読み込みは別の手段で行い、それを Stream に食わせたらどうか?

じゃそれ FileSystemObject で! と思ったら、FileSystemObject はバイナリファイルを読み込めないときた。ダメ元で無理やり読み込ませてみたら、化け化けになった。泣きたい。

結局、最も基本的な方法で読み込ませることで上手くいった。

Sub Test3()
    Dim fd As Long, _
        buf() As Byte
    fd = FreeFile
    Open "WriteLocked.txt" For Binary As #fd
    ReDim buf(LOF(fd))
    Get #fd, , buf
    Close #fd

    With CreateObject("ADODB.Stream")
        .Type = 1   ' 1=adTypeBinary
        .Open
        .Write buf
        .Position = 0
        .Type = 2   ' 2=adTypeText
        .Charset = "UTF-8"
        ' ReadText...
        .Close
    End With
End Sub

この方法の欠点は、ファイル全体をメモリに読み込んでしまうこと。できれば 1 行ずつ読み込ませたいが、バッファリング制御の実装とか大変そう過ぎて、やってみる気すら起きない。

2016-07-31

Animes in the 2nd quarter of 2016

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

三輪士郎キャラ動画は初見だが、想像以上にアニメと相性が良かった。特に女子キャラは雰囲気があって良い。なのに、最後のヒロインの行動が訳ワカメだったのが残念。

前期より視聴。前期で広げた話にどう収拾をつけるか注目していたが、どうやら風呂敷を広げ過ぎた模様。加えて、視聴者の記憶力にももう少し配慮して欲しかった。

初見で女子向けか?と思ったらやっぱり少女マンガ原作。しかし女子キャラは男ウケしそうな感じで、男子が見ても十分イケる。反面、男子キャラは同性からみるとどれもイケてない。

前期より視聴。集英社は余程これを推したいらしいが、話の方はどんどん面白くなくなっていく。もはや進撃の対抗馬にすらならない。もう次回以降は見ないと断言できる。

作品自体はユニークで良く出来ていると思う。しかし声優がキャラに勝ちすぎて、見ていてずっと違和感が拭えなかった。この作品に限れば、特徴のある有名声優を使ったのは失敗だったと思う。

前期より視聴。前回のテンプレ対決を勝ち抜いただけあって、今回も王道の展開。つまりは意外性がなく退屈ということ。むしろこの流れで 3 期目をやることが最も意外だった。

絵を見て期待してなかったが、ヒロインがダメ可愛い。こんなん反則やろ。ネット上では最終話が炎上したっぽいけど、原作を知らないので気にしない。今回は日岡なつみを覚えた。

タイトルで煽る程にはヒロインが可愛くない。それよりも散りばめられたネトゲネタを楽しむのが正しい楽しみ方。つまり「しょうがないにゃあ」はもう一般用語ということでおk?

登場人物のキャラ付けが少し強引な気がしたが、慣れれば許容範囲。もう少し回を重ねると馴染んでくるような気がする。原作は長いようだし、次回もあるなら見るつもり。

登場時は万能感を感じさせる主人公だが、徐々にメッキが剥がれていく。それでも紅ルートを進めば挽回の余地もあったが、妹ルートに入ってしまい挽回することなく終了。

艦これ類似品と思いきや、むしろガルパンを彷彿とさせる良作。これ単発で終わらせるには惜しいように思う。ただ登場人物がやたら多く、私は最後までキャラ名を覚えられなかった。

とにかく最初から最後までほのぼのとした作品。決して悪くはないが、見るには少し退屈。ところで、ヒロインのキャラが「ずっと待ってる」の人にしか見えなくて困る。

最初はヒバリたんが可愛くて仕方なかったが、後半はヒビキがジワジワ来る。正直、コメディとしての面白さは微妙なので、誰かに属性が合うかどうかが全てだと思う。

主人公が八方美人でハイスペックという、私が今まで見たことがないタイプの BL。あっちの方も同性愛というより家族愛みたいな雰囲気。私も含めて、たぶん男には面白さが分からない。

最初は、腐女子が考えたような設定に「何だこりゃ」だったが、ジワジワと面白くなった。そして鏡花たんが出てからが本番。もう太宰とかいうアホはどうでもいいので、もっと鏡花たんを出してください。

和風ゾンビ物としては良いと思う。主人公のムサ苦しさもまた良し。しかしヒロインとその兄者、彼らのキャラと行動がテンプレート過ぎて、それが作品の完成度を下げていると思う。

2016-07-18

RHEL7: Virtual interface with NetworkManager

RHEL6 でインターフェイスに複数 IP アドレスを割り当てられるようになってからも、個人的には好んで仮想インターフェイスの方を使っている。

私自身、もう仮想インターフェイスはオワコン、とは思っていない。いくら ip addr で IP アドレスを自由に付け替えられるといっても、それでは余りに生々しすぎる。仮想インターフェイスは if{up,down} <ifname> という安全かつお手軽な UI が良いのだ。操作する度に IP アドレスを打ち込むなど、トラブルの元でしかない。

という訳で、RHEL7 + NetworkManager で仮想インターフェイスが使えるかどうかは、私にとって大きな関心事だった。とりあえず早くに動くことだけは確認していたが、NetworkManager と仮想インターフェイスとの関係が良く理解できず、暫く様子を見ていた。そして最近になってようやく安心して使っていけそうだと判断した。

まず、enp0s18 を親とする仮想インターフェイス enp0s18:1 を作ってみる。

# cat /etc/sysconfig/network-scripts/ifcfg-enp0s18
TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
NAME=enp0s18
UUID=4fe308d7-c49f-4232-ba9b-fb8f635ea38c
DEVICE=enp0s18
ONBOOT=yes
IPADDR=192.168.0.1
PREFIX=24
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_PRIVACY=no

# cat /etc/sysconfig/network-scripts/ifcfg-enp0s18:1
NAME=enp0s18:1
DEVICE=enp0s18:1
BOOTPROTO=none
IPADDR=192.168.0.2
PREFIX=24

この状態で、NetworkManager はどのように認識するのか。(予め enp0s18 は停止している)

# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.2 (Maipo)

# nmcli con reload

# nmcli con
NAME     UUID                                  TYPE            DEVICE
enp0s17  bd4f8279-8778-4032-86dc-900dce2a12ee  802-3-ethernet  enp0s17
enp0s18  4fe308d7-c49f-4232-ba9b-fb8f635ea38c  802-3-ethernet  --

NetworkManager は、親(enp0s18)だけを認識している。その内容は、

# nmcli con show enp0s18
connection.id:                          enp0s18
connection.uuid:                        4fe308d7-c49f-4232-ba9b-fb8f635ea38c
connection.interface-name:              enp0s18
connection.type:                        802-3-ethernet
connection.autoconnect:                 yes
connection.autoconnect-priority:        0
connection.timestamp:                   1467383289
connection.read-only:                   no
connection.permissions:
connection.zone:                        --
connection.master:                      --
connection.slave-type:                  --
connection.secondaries:
connection.gateway-ping-timeout:        0
802-3-ethernet.port:                    --
802-3-ethernet.speed:                   0
802-3-ethernet.duplex:                  --
802-3-ethernet.auto-negotiate:          yes
802-3-ethernet.mac-address:             --
802-3-ethernet.cloned-mac-address:      --
802-3-ethernet.mac-address-blacklist:
802-3-ethernet.mtu:                     auto
802-3-ethernet.s390-subchannels:
802-3-ethernet.s390-nettype:            --
802-3-ethernet.s390-options:
ipv4.method:                            manual
ipv4.dns:
ipv4.dns-search:
ipv4.addresses:                         192.168.0.1/24, 192.168.0.2/24
ipv4.gateway:                           --
ipv4.routes:
ipv4.route-metric:                      -1
ipv4.ignore-auto-routes:                no
ipv4.ignore-auto-dns:                   no
ipv4.dhcp-client-id:                    --
ipv4.dhcp-send-hostname:                yes
ipv4.dhcp-hostname:                     --
ipv4.never-default:                     no
ipv4.may-fail:                          yes
ipv6.method:                            auto
ipv6.dns:
ipv6.dns-search:
ipv6.addresses:
ipv6.gateway:                           --
ipv6.routes:
ipv6.route-metric:                      -1
ipv6.ignore-auto-routes:                no
ipv6.ignore-auto-dns:                   no
ipv6.never-default:                     no
ipv6.may-fail:                          yes
ipv6.ip6-privacy:                       0 (disabled)
ipv6.dhcp-send-hostname:                yes
ipv6.dhcp-hostname:                     --

注目すべきは、ipv4.addresses に仮想インターフェイス(enp0s18:1)の IP アドレスも設定されていること。NetworkManager は仮想インターフェイスの情報を収集し、親インターフェイス側に集約するようだ。そして仮想インターフェイスの方は無かったことにされ、NetworkManager から仮想インターフェイスは見えなくなる。

# nmcli con show enp0s18:1 ; echo $?
Error: enp0s18:1 - no such connection profile.
10

この状態で enp0s18 を起動すると、両方の IP アドレスが起動する。

# ip addr show enp0s18
3: enp0s18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:94:42:c7 brd ff:ff:ff:ff:ff:ff

# nmcli con up enp0s18
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/16)

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

その際、仮想インターフェイスの「ONBOOT」や「ONPARENT」という設定は無視されるようだ。少なくとも試した限りでは、これらをどう設定しても、仮想インターフェイス側の IP アドレスは自動的に起動した。

そして前述の通り、NetworkManager から仮想インターフェイスは見えないので、当然、up / down することもできない。

# nmcli con down enp0s18:1 ; echo $?
Error: 'enp0s18:1' is not an active connection.
Error: no active connection provided.
10

# nmcli con up enp0s18:1 ; echo $?
Error: Connection 'enp0s18:1' does not exist.
10

しかし ifup / ifdown なら、それが可能。

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

# ifdown enp0s18:1 ; echo $?
0

# ip addr show enp0s18
3: enp0s18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:94:42:c7 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.1/24 brd 192.168.0.255 scope global enp0s18
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe94:42c7/64 scope link
       valid_lft forever preferred_lft forever

# ifup enp0s18:1 ; echo $?
0

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

ifup / ifdown は、NetworkManager が管理するインターフェイスについては NetworkManager に処理を丸投げするが、そうでない場合、従来同様に ifup / ifdown 自身が処理を行う。よって NetworkManager からは見えない仮想インターフェイスについても、ifup / ifdown なら扱うことができる。

・・・のはずなのだが、実は RHEL7.1 以前には不具合があって、仮想インターフェイスを ifup することができない。

# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.1 (Maipo)

# ifdown enp0s18:1 ; echo $?
0

# ifup enp0s18:1 ; echo $?
Error: no device found for connection 'enp0s18:1'.
4

正直この不具合のお陰で、ずっと NetworkManager と仮想インターフェイスとの関係に悩んでいたと言っていい。:-(

以上をまとめると、

  • RHEL7 でも仮想インターフェイスは使用できる。
    • ただし、「ONBOOT」「ONPARENT」設定は無視される。(常に自動起動する)
  • NetworkManager (nmcli)は仮想インターフェイスを操作できない。
  • ifup / ifdown は仮想インターフェイスを操作できる。
    • ただし、RHEL7.2 以上が必要。

個人的には、仮想インターフェイスはずっと残しておいて欲しい機能だ。きっと RHEL8 でも動いてくれる・・・よね?

2016-05-31

Slony-I 2.0: `cleanupEvent' causes deadlock

Slony-I 2.0.6 + 同期復旧 patch を使うようになって以降、割と平穏な日々を過ごしてきた。

しかし実はまだ 1 つ、既知の問題が残っている。Slony-I 2.0 系は、deadlock を起こすことがある。

いつか直らないかと気に掛けていたものの、一向に直る気配もなく今に至る。そうこうしているうちに何年かぶりに再発したため、今更ながら調べることにした。

面倒なのでソースコード引用は省略。発生条件は、slon が 10 分毎に実行する clenaupEvent 処理と、slonik の実行が衝突すること。slonik を使わない、または slonik 実行時に slon が停止していれば発生することはない。(たぶん)

deadlock の原因は、当たり前だが、それぞれの処理でロックの取得順が異なることに因る。それぞれのロック取得順は次のようになる。

  • slonik コマンド: sl_config_lock → sl_event (一部の slonik コマンドを除く)
  • slon cleanupEvent: sl_event → sl_config_lock

分かってしまえば解決は難しくない。それぞれのロック取得順を合わせてやれば良い。今回の場合、cleanupEvent 処理の最初で sl_config_lock のロックを取得するのが簡単だろう。

--- slony1-2.0.6/src/backend/slony1_funcs.sql.orig	2010-12-08 01:44:09.000000000 +0900
+++ slony1-2.0.6/src/backend/slony1_funcs.sql	2016-05-31 17:35:22.000000000 +0900
@@ -4478,6 +4478,11 @@
 	v_rc            int8;
 begin
 	-- ----
+	-- Grab the central configuration lock
+	-- ----
+	lock table @NAMESPACE@.sl_config_lock;
+
+	-- ----
 	-- First remove all confirmations where origin/receiver no longer exist
 	-- ----
 	delete from @NAMESPACE@.sl_confirm

とは言っても、元々 deadlock が発生すること自体が稀なため、本当に直ったのか確認することは難しい。正直、「直ったらラッキー」程度に考えている。

ちなみに Slony-I 2.1 以降はロック機構がガラリと変わっており、以上のことは当てはまらない。(deadlock が起こらないかは知らない)

2016-04-30

Animes in the 1st quarter of 2016

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

最初こそ「面白いかも」との期待もあったが、程なくマンネリ感が漂い、ちょっと出来のいい作品に落ち着いた。主人公を好みかどうかで評価が分かれる気がする。ちな私は好みでない。

前期より視聴。ヒロインがラブラブになるほどつまらないのは相変わらず。むしろラジ王子と絡んでいる方がよっぽど面白かった。第三期があっても見ないと思う。

最弱無敗の主人公、チョロいヒロイン等。これは是非とも前クールで落第騎士、アスタリスクと三つ巴の争いをやって欲しかった。個人的にはクルルシファーがツボったので満足。

原作は半既読。アニメ化に伴い、ヒロインの魅力が半減。色っぽくないし、何より(私の想像と)声が違う! 対してサヤ氏は魅力 50% 増。サヤ氏推しは見ておいて損はない。

  • プリンス・オブ・ストライド オルタナティブ http://pos-a.jp/

「ストライド」とかいう、限界まで格好つけた障害物競争は見ていて滑稽。女子向けメディアミックスのアニメ作品らしく、安定の中身の薄っぺさ。男子は見る必要なし。

前シーズンより視聴。声優の割り当ては相変わらず適当だが、全体的には綺麗に纏まった感じ。あといい加減、主要キャラに怪我を負わせて試練と称する少年誌の悪癖はやめるべき。

シリーズ通し視聴。正直、やっと終わってくれた、というのが本音。これだけ引き延ばしておいて、幕引きは余りに呆気ない。これなら「起」と最終回だけ見とけば十分。

クラリオンがかわいい、に尽きる。あと「ロボットだからエロくないもん」というのは、これから流行るかも知れない。しかし原作が士郎正宗だったことに一番驚いた。

女子向けなので男子スルー安定と思いきや、ヒロイン除く女子二名が意外に可愛くて、結構楽しめてしまった。話も女子向けには珍しい設定だが、1 クールでは消化不足な感。

原作の評価は高かったみたいだが、アニメになってしまうと普通。しかし絵が綺麗でオリジナリティもあるのは認める。お気に入りの女子キャラが居ればまた違ったと思う。

雨宮天の新境地。こんな演技ができるとは思わなかった。めぐみんもいいキャラで、この二人と主人公との絡みが面白い。ただ一人、ダクネスの魅力が分からない。第二期では彼女の躍進に期待。

まず吹奏楽は全くの飾りで、実は推理物な件。しかし本作の要は、推理ではなくヒロイン。彼女なくしてこの作品は成り立たない。個人的には、一クールで終わらせるには惜しい作品。

コンビニでジャンプが立ち読みできなくなって以降、こんなことになっていたとは。果たしてこれは銀魂なのか。とてもファンが望んだ方向とは思えない。楽しかった銀魂よ、帰ってきておくれ。