• SAStrutsのHTML5対応 その3

    2015年06月18日 01時04分
    taglib-html5_1_2_9_2.zip

    ナウなHTML5で必要な属性が足りていなかったのでいくらか足しました。
    • textareaタグ
      • maxlength属性
      • wrap属性

    やはり無条件に全て受け入れてそのまま出すというのが正解だった気がしますが今更後には引けない。

    というか、これJava1.3のソースをtarget=Java1.2で作っているのですが、
    Java9以降は3バージョンくらい古いバージョンしかサポートしてくれない予定のようなので
    さすがにそろそろ延命措置も厳しい気がします。
  • libvpxのVisual Studio用ファイルをLinux上で作る

    2015年06月11日 20時38分
    libvpxをWindows用にビルドしたいけどMinGWをインストールするのが嫌でLinuxはある人向けという
    隙間産業的な記事。


    VP9のエンコードはそろそろ早くなったりしないかなあと思いつつlibvpxの中身を眺めていたら、
    なんか行けそうな気がしてやってみたら出来たのでメモっておきます。

    ちなみに私はlibvpxの中身を熟知しているわけではなく、
    部分部分をちょいちょいとつまんで解釈し
    なんとなく合ってそうというものであるとご理解ください。


    きっかけは、libvpxの中身を見ていたら「gen_msvs_sln.sh」とか「gen_msvs_vcxproj.sh」とかが有るのに気づいたことで、
    同時に「これをLinux上で動かしてslnとかvcxprojとか作れればそれを持ってきてVSでビルド出来るんじゃね?」と閃きました。

    これらのスクリプトはconfigureでtargetにvsを選択すると使われるようになっています。

    例えば、VS12で64bit用にビルドしたい場合はtargetにx86_64-win64-vs12を指定します
    # ./configure --target=x86_64-win64-vs12

    ※targetの一覧はconfigureのhelpに出てきます。


    これでmakeすると、指定したVS向けファイルが作成されます。

    configureの中のヘッダチェックとかも気になったのですが、主にtargetを確認する処理になっていて、
    実際そのヘッダが有るかないかとかは見てないので大丈夫そうです。


    細かい手順や注意点は以下になります。

    gitのcloneを取る
    # git clone https://chromium.googlesource.com/webm/libvpx
    # cd libvpx


    試した時のrevisionはこれでした
    # git rev-parse HEAD
    44afbbb72d8a5fa0528f8a571a5023a843d02f33


    作業用にまるっとコピーします
    # mkdir ../export
    # git archive --format=tar HEAD | tar -x -C ../export
    # cd ../export


    VSプロジェクトファイル内のincludeディレクトリ指定に、configureした時のLinux上のフルパスが現れないように書き換えます
    # sed -i -e 's/SRC_PATH_BARE=$source_path/SRC_PATH_BARE=./' build/make/configure.sh
    # sed -i -e 's/CFLAGS+=-I$(BUILD_PFX)$(BUILD_ROOT) -I$(SRC_PATH)/CFLAGS+=-I$(BUILD_PFX)$(BUILD_ROOT)/' -e 's/CXXFLAGS+=-I$(BUILD_PFX)$(BUILD_ROOT) -I$(SRC_PATH)/CXXFLAGS+=-I$(BUILD_PFX)$(BUILD_ROOT)/' build/make/Makefile


    vpxenc以外コンパイルしたくないんじゃあという場合は、examplesの対象をvpxencだけに書き換えます
    # sed -i -e 's/ALL_EXAMPLES    = $(UTILS) $(EXAMPLES)/ALL_EXAMPLES    = vpxenc.c/' examples.mk


    お好みのオプションを選択してconfigure
    # ./configure --log=no --target=x86_64-win64-vs12 --enable-static-msvcrt --disable-vp8 --disable-unit-tests

    vp9のdecoderも要らないのでOFFにしようと思ったのですが
    decoderが一個も無くなると一部ソースがコンパイルエラーになるのでやめました。

    makeするとVS用のプロジェクトファイルとかソリューションファイルが作成されます
    # make


    後はこのソースツリーをまるごとWindowsに持ってきてvpx.slnをVSで開けばビルドできます。
    ※yasmのインストールも必要です



    さて、VP9のエンコードは今どのくらいの速度なのでしょうか。
    1920 * 1080 FPS30の動画をエンコードしてみました。
    CPUはCore i7 3770です。

    オプションがまだ完全に把握出来ていないのですが、
    まずはおそらく最速の設定であろう「good cpu-used=8」を試しました
    vpxenc --output=output.webm --threads=4 --good --cpu-used=8 --passes=1 --codec=vp9 --webm --end-usage=cq --cq-level=10 --i420 --color-space=bt709 --width=1920 --height=1080 input.y4m


    思ったより早い!11FPSくらい出ました。
    そこそこ使えなくもない早さな気がします。
    でも、どうせなら遅くても品質を取りたいので、次は「best」を設定してみました。
    vpxenc --output=output.webm --threads=4 --best --passes=1 --codec=vp9 --webm --end-usage=cq --cq-level=10 --i420 --color-space=bt709 --width=1920 --height=1080 input.y4m


    結果は14FPMでした。
    FPSじゃないです。FPMです。
    最初表示がバグったかと思いました。
    こんな表示が用意してあるあたり開発側もまだ遅いと思っているのでしょう。

    品質についてはbestのエンコード終了を待てなかったので比較していません。
  • x264とffmepg

    2015年06月05日 01時16分
    動画エンコード関連は色々と難しすぎて未だによくわからないのですが
    トラブルに遭い、解消方法がわかったのでメモしておこうと思います。


    LoVAのオープンβが始まるということで
    復習用に録画を手早くエンコードする準備をしていました。

    以下の手順をbatファイルで行います
    1. x264で映像部をH.264にエンコード
    2. neroaacencで音声部をAACにエンコード
    3. ffmpegで結合


    この手順で試しにエンコードしたところ、映像がカックカクです。


    問題を切り分けて行ったところ、
    x264の出力を.264→.mp4に変更したら直りました。

    .264をffmpegで結合するとプログレスバーがニョキニョキ動いているので
    なんか映像データに手を加えておかしくなっているのだと思います。
    (.mp4だとそういうのが出なくてあっさり処理が終わります)

    ちなみにコマンドはこんな感じでした
    ffmpeg -i 映像.264 -i 音声.aac -vcodec copy -acodec copy 出力ファイル.mp4

    FPSがおかしくなっているのかと思い、試しに-rオプションで元動画のFPS(30)を指定してみたのですがダメでした。

    「このPCまだmp4box入れてないわあ、ffmepg入ってるからこれでいいや」とか横着したのがそもそも失敗だったかもしれません。


    あと、LoVAはもうだめかもしれません。
  • 俺が・・・俺たちが・・・MX Masterだ!!

    2015年04月13日 19時02分
    その昔MX Revolutionというマウスがありまして、
    私はこれを発売日に買って去年まで使っていました。

    発売が2006年らしいので8年くらい使っていた計算になります。
    その8年間も仕事とプライベートでずっと使い続けているわけでかなりの密度と言えるでしょう。

    さすがにこれだけ酷使するとボタンにはチャタリング出てきますし、
    充電の接点がうまく接触しなくなったりして、限界を感じた為引退させました。

    そうしますと新品を買い直し・・・と行きたいところですが、
    だいぶ前に生産終了していて手に入りません。
    予備を購入しようしようと思いつつ放置していたのが失敗でした。
    時既に時間切れ。私は深い悲しみに包まれた。


    何故MX Revolutionにこだわるかと言えばSmart shiftの1点に尽きます。

    一度これに慣れてしまうともう他のホイールは使う気にならないのですが、
    MX Revolution以降のどのマウスにもこの機能が付いていなかったのです。

    調教してそれ無しでは生きられない体にしておいて
    全くフォローしないLogicoolは鬼のようだと思っていたのですが、
    先日ついにSmart shiftが復活しました。


    MX Master


    SetPointの再インストールのたびにアンケートでSmart shift復活させろと送り続けたかいがありました。

    とりあえず買ってきてしばらく使ったので、
    MX Revolutionを使い続けて来た、MX Revolutionマスター。略してMXマスター視点の感想を書きます。


    まず形状ですがMX Revolutionと比べて背が高いと感じます。
    スペック的には大差ないはずなのですが・・・
    親指付け根の辺りが高い形状のせいでそう思うのかもしれません。
    まあでもこれが困るという人は居ないんじゃないかなと思います。


    注目のホイールですがMX Revolutionと同じ感覚で使えます。
    気持ち軽くなったような気もします。
    新品だからか個体差だからかもしれませんが。


    進む・戻るボタンの配置は最初違和感ありましたが、
    押すのが窮屈というわけではないのですぐに慣れました。


    サムホイールはスイッチ的なホイールから本当のホイールになったので、
    MX Revolutionでスイッチ的に使っていた人はボタンが足りなくなって困るかもしれません。
    私の場合殆ど使っていなかったので水平スクロールは便利だなあという感じです。


    ジェスチャーボタンは使い道を考えれば便利かもしれない・・・?
    今のところ未使用です。
    他の人のレビューを見ても割と持て余し気味な気はします。


    充電が専用の充電台からUSBケーブルを刺す形に変わりました。
    充電しながら使うことも出来ますし、
    充電台はすぐ接触が悪くなって困っていたのでうれしい変更だと思います。


    という感じで概ねMX Revolutionの正当後継と言っていいと思います。
    MX Revolution生産終了でお困りの方にオススメです。
    私もとりあえず3個くらい買っておこうと思います。
  • HHKBをAXキーボードレイアウトで使っているFF14プレイヤーの話

    2015年01月13日 20時28分
    この記事はタイトルに関係無い人には全く役に立たない内容と予めお知らせしておきます。

    問題

    FINAL FANTASY XIVでパッチ2.4アップデート以降、
    半角/全角キー押下でAltキーが押されたままの状態になる。

    ∧∧∧∧∧∧∧∧∧∧      ___/ ̄ ̄ ̄\
    < ┌┐  ┌───┐ >   /  / / ̄ ̄ ̄ ̄\
    < ││  └──┐│ >  /    ̄          \
    < ││  ┌──┘│ >/    □            \
    < ││  └──┐│ >// ̄~\ / ̄ ̄ ̄\      |
    < ││  ┌──┘│ >|//\ヽ ∨〃/\   \   /\
    < ││  └───┘ >//(・) \ゞ/ /(・)  〉   |  | ∩|
    < ││           >| \_/ノ  \_/ ノ し|:   | ∪|
    < ││   □   _  >l:::::::::∠~         ⌒ |   \/
    < ││   □  //  >|:::::::::r~~‐、ヽ      /   /
    < ││     //   >|:::::::::)jjjjjjjjjjjヽヽ   /   /
    <   ̄    //     >|:::::::::|,,    || /   /
    <.  ロロ┌┐ ̄ _ □□ >!:::: ヽiiiiiiiii//  /   /
    <   ┌┘│  / /     >ヽ  ヽ~~"/   /
    <     ̄ ̄  /  ̄ ̄フ  > ヽ、__,,,_∠__/
    < ┌┐┌┐ / /ニ/ /  >  _]:::::::   [_
    < ││││/┌っ /   > ̄~        ゙ ̄ ̄ ̄ ̄ヽ
    < ││││ ̄ / /    >               ,~ヽ
    < └┘└┘  / /      >             ~ ノ ̄\
    <   []  []    ̄       >           ’ノ⌒⌒⌒⌒



    原因

    HHKB Professional2をAXキーボードレイアウトで使っているためと思われる。

    AXキーボードレイアウトというのは、基本的にUSレイアウトのキーボードとして使えるが
    右Altキーを半角/全角キーとして使えるようになる設定。

    おそらくFF14のキー情報取得はスキャンコードを取っているが、
    IMEがONになったときにそのキーのUPを取りこぼすようなバグがあるんだと思う。

    Altキーは各種ショートカットで頻繁に使うので押しっぱ状態だと色々と困る。


    対応

    一応公式に不具合報告は出しているが、未だに修正されないし修正されるのかもわからないので自分で対応する。

    ちなみに私はWindowsのキーボードがどういう仕様で動いているかよく知らないし、
    こんな全国でも数人レベルしか困っていない問題に労力を割くのも馬鹿らしいので
    理論や理屈はかなり適当だと断っておく。動けば良い。
    あと文章もほぼ自分用のメモ代わりなので結構雑になるとも断っておく。


    周りに同様の現象で困っているような人は居ないので、半角/全角キーのスキャンコードのキーに半角/全角キーのレイアウトを割り当てれば良いっぽい。
    たぶんゲーム内部的には半角/全角キーのスキャンコード(0x0029)が押しっぱになっていると思うのだが、
    そのキーはIMEのON/OFFにしか使わないので表に問題として出てきてないんだと思う。

    なので、まずはキーボードのレイアウトをを日本語106キー(kbd106.dll)に戻す。
    基本的には日本語のWindowsは最初これになっていると思う。

    そうすると、HHKBの右上のキー(`キー)が半角/全角キーになるので、
    レジストリのスキャンコードの設定を変えて、右Altがこのキーになるように設定すればよい。
    ついでに同じキーが2個あっても仕方ないので、右上のキー(`キー)を日本語キーボードの|キーに変更する。

    つまりこうなる
    • 右Altキー(スキャンコード=0xe038) → 半角/全角キー(スキャンコード=0x0029)
    • 半角/全角キー(スキャンコード=0x0029) → |キー(スキャンコード=0x007d)


    ひとまずこれで右Altキーを押してIMEの切り替えが正常に行われるようになる。


    ただ、この状態だと基本的に日本語レイアウトなので、
    Shift+数字キーとか記号キーの辺りが違って非常に使いにくい。

    そこで、kbd106.dllのレイアウトを一部改造してUSレイアウトっぽくする。

    具体的にはkbd106.dllのソースがMicrosoft公式に置いてあるのでそれを取ってくる。
    (厳密には違うのかもしれないけどだいたい同じっぽいのでよしとする)

    このソースはVisual Studio 2013とWDK8.1をインストールすれば簡単にビルドできる。
    (両方とも同じくMicrosoft公式からダウンロード出来る。)


    C++/fe_kbds/jpn/106の、キーボードレイアウトを設定してるっぽいところを
    適度にエスパーしつつ書き換える。

    --- kbd106.c    2015-01-13 20:23:39.000000000 +0900
    +++ kbd106mod.c 2015-01-13 20:26:22.739691347 +0900
    @@ -237,14 +237,14 @@
     static ALLOC_SECTION_LDATA VK_TO_WCHARS4 aVkToWch4[] = {
         //                               |          |   SHIFT  |  KANA  | K+SHFT |
         //                               |          |==========|========|========|
    -    {'0'          ,          KANALOK ,'0'       ,WCH_NONE  ,WCH_WA  ,WCH_WO  },
    +    {'0'          ,          KANALOK ,'0'       ,')'       ,WCH_WA  ,WCH_WO  },
         {'1'          ,          KANALOK ,'1'       ,'!'       ,WCH_NU  ,WCH_NU  },
         {'3'          ,          KANALOK ,'3'       ,'#'       ,WCH_A   ,WCH_AA  },
         {'4'          ,          KANALOK ,'4'       ,'$'       ,WCH_U   ,WCH_UU  },
         {'5'          ,          KANALOK ,'5'       ,'%'       ,WCH_E   ,WCH_EE  },
    -    {'7'          ,          KANALOK ,'7'       ,0x27      ,WCH_YA  ,WCH_YAA },
    -    {'8'          ,          KANALOK ,'8'       ,'('       ,WCH_YU  ,WCH_YUU },
    -    {'9'          ,          KANALOK ,'9'       ,')'       ,WCH_YO  ,WCH_YOO },
    +    {'7'          ,          KANALOK ,'7'       ,'&'       ,WCH_YA  ,WCH_YAA },
    +    {'8'          ,          KANALOK ,'8'       ,'*'       ,WCH_YU  ,WCH_YUU },
    +    {'9'          ,          KANALOK ,'9'       ,'('       ,WCH_YO  ,WCH_YOO },
         {'A'          , CAPLOK | KANALOK ,'a'       ,'A'       ,WCH_TI  ,WCH_TI  },
         {'B'          , CAPLOK | KANALOK ,'b'       ,'B'       ,WCH_KO  ,WCH_KO  },
         {'C'          , CAPLOK | KANALOK ,'c'       ,'C'       ,WCH_SO  ,WCH_SO  },
    @@ -271,14 +271,14 @@
         {'X'          , CAPLOK | KANALOK ,'x'       ,'X'       ,WCH_SA  ,WCH_SA  },
         {'Y'          , CAPLOK | KANALOK ,'y'       ,'Y'       ,WCH_NN  ,WCH_NN  },
         {'Z'          , CAPLOK | KANALOK ,'z'       ,'Z'       ,WCH_TU  ,WCH_TUU },
    -    {VK_OEM_1     ,          KANALOK ,':'       ,'*'       ,WCH_KE  ,WCH_KE  },
    +    {VK_OEM_1     ,          KANALOK ,'\''      ,'"'       ,WCH_KE  ,WCH_KE  },
         {VK_OEM_2     ,          KANALOK ,'/'       ,'?'       ,WCH_ME  ,WCH_MD  },
    -    {VK_OEM_3     ,          KANALOK ,'@'       ,'`'       ,WCH_VS  ,WCH_VS  },
    -    {VK_OEM_7     ,          KANALOK ,'^'       ,'~'       ,WCH_HE  ,WCH_HE  },
    +    {VK_OEM_3     ,          KANALOK ,'['       ,'{'       ,WCH_VS  ,WCH_VS  },
    +    {VK_OEM_7     ,          KANALOK ,'='      ,'+'        ,WCH_HE  ,WCH_HE  },
         {VK_OEM_8     , 0                ,WCH_NONE  ,WCH_NONE  ,WCH_NONE,WCH_NONE},
         {VK_OEM_COMMA ,          KANALOK ,','       ,'<'       ,WCH_NE  ,WCH_IC  },
         {VK_OEM_PERIOD,          KANALOK ,'.'       ,'>'       ,WCH_RU  ,WCH_IP  },
    -    {VK_OEM_PLUS  ,          KANALOK ,';'       ,'+'       ,WCH_RE  ,WCH_RE  },
    +    {VK_OEM_PLUS  ,          KANALOK ,';'       ,':'       ,WCH_RE  ,WCH_RE  },
         {VK_TAB       , 0                ,'\t'      ,'\t'      ,'\t'    ,'\t'    },
         {VK_ADD       , 0                ,'+'       ,'+'       ,'+'     ,'+'     },
         {VK_DECIMAL   , 0                ,'.'       ,'.'       ,'.'     ,'.'     },
    @@ -294,10 +294,10 @@
         {VK_BACK      , 0       ,'\b'      ,'\b'      ,'\b'    ,'\b'    , 0x7f      , 0x7f      },
         {VK_CANCEL    , 0       ,0x03      ,0x03      ,0x03    ,0x03    , 0x03      , 0x03      },
         {VK_ESCAPE    , 0       ,0x1b      ,0x1b      ,0x1b    ,0x1b    , 0x1b      , 0x1b      },
    -    {VK_OEM_4     , KANALOK ,'['       ,'{'       ,WCH_SVS ,WCH_OB  , 0x1b      , 0x1b      },
    -    {VK_OEM_5     , KANALOK ,'\\'      ,'|'       ,WCH_PS  ,WCH_PS  , 0x1c      , 0x1c      },
    +    {VK_OEM_4     , KANALOK ,']'       ,'}'       ,WCH_SVS ,WCH_OB  , 0x1b      , 0x1b      },
    +    {VK_OEM_5     , KANALOK ,'`'       ,'~'       ,WCH_PS  ,WCH_PS  , 0x1c      , 0x1c      },
         {VK_OEM_102   , KANALOK ,'\\'      ,'_'       ,WCH_RO  ,WCH_RO  , 0x1c      , 0x1c      },
    -    {VK_OEM_6     , KANALOK ,']'       ,'}'       ,WCH_MU  ,WCH_CB  , 0x1d      , 0x1d      },
    +    {VK_OEM_6     , KANALOK ,'\\'      ,'|'       ,WCH_MU  ,WCH_CB  , 0x1d      , 0x1d      },
         {VK_RETURN    , 0       ,'\r'      ,'\r'      ,'\r'    ,'\r'    , '\n'      , '\n'      },
         {VK_SPACE     , 0       ,' '       ,' '       ,' '     ,' '     , 0x20      , 0x20      },
         {0            , 0       ,0         ,0         ,0       ,0       , 0         , 0         }
    @@ -306,9 +306,9 @@
     static ALLOC_SECTION_LDATA VK_TO_WCHARS8 aVkToWch8[] = {
         //                      |          |   SHIFT  |  KANA  | K+SHFT |  CONTROL  |  K+CTRL   | SHFT+CTRL |K+SHFT+CTRL|
         //                      |          |==========|========|========|===========|===========|===========|===========|
    -    {'2'          , KANALOK ,'2'       ,'"'       ,WCH_HU  ,WCH_HU  , WCH_NONE  , WCH_NONE  , 0x00      , 0x00      },
    -    {'6'          , KANALOK ,'6'       ,'&'       ,WCH_O   ,WCH_OO  , WCH_NONE  , WCH_NONE  , 0x1e      , 0x1e      },
    -    {VK_OEM_MINUS , KANALOK ,'-'       ,'='       ,WCH_HO  ,WCH_HO  , WCH_NONE  , WCH_NONE  , 0x1f      , 0x1f      },
    +    {'2'          , KANALOK ,'2'       ,'@'       ,WCH_HU  ,WCH_HU  , WCH_NONE  , WCH_NONE  , 0x00      , 0x00      },
    +    {'6'          , KANALOK ,'6'       ,'^'       ,WCH_O   ,WCH_OO  , WCH_NONE  , WCH_NONE  , 0x1e      , 0x1e      },
    +    {VK_OEM_MINUS , KANALOK ,'-'       ,'_'       ,WCH_HO  ,WCH_HO  , WCH_NONE  , WCH_NONE  , 0x1f      , 0x1f      },
         {0            , 0       ,0         ,0         ,0       ,0       , 0         , 0         , 0         , 0         }
     };


    書き換えたらビルドしてdllを設定すればよい。
    (上書きは怖いので別の名前で設定したほうがいいと思う。)