mieki256's diary



2017/09/01(金) [n年前の日記]

#1 [raspberrypi][pi3d] Raspberry Pi のlibEGL.soについて

巷の解説ページを見ると、Raspberry Pi は /opt/vc/lib/ 以下に libEGL.so , libGLESv2.so がある、とされているのだけど。手元の環境、raspbian stretch ではどちらも入ってなかったのが気になってググってみたり。

どうやら、mesaライブラリの libEGL.so 等と名前が同じなので衝突しちゃうから、libbrcmEGL.so , libbrcmGLESv2.so にリネームした、ということらしい…。

_VC libraries missing errors with Raspbian Stretch - Issue #80 - RPi-Distro/repo
_Games that uses libGLESv2.so doen't work in raspbian stretch - Raspberry Pi Forums

しかしそのことで、OpenGL ESを使ったアレコレが動かなくなった模様。

「sudo rpi-update をすれば修正される」という一文もあるな…。試してみよう…。
sudo apt update
sudo apt upgrade
sudo apt dist-upgrade
sudo rpi-update
たしかに、/opt/vc/lib/ 以下に libEGL.so と libGLESv2.so が追加された。

ちなみに、/opt/vc/lib/ 以下には、Raspberry Pi用にカスタマイズされたアレコレが入ってる模様。たぶん。

libeEGL.so等を書き換えるパッケージを一応メモ。 :

例えば、以下のパッケージ等をインストールすると、/usr/lib/arm-linux-gnueabihf/ 以下の libEGL.so , libGLESv2.so が変更される模様。と、一応メモ。
libegl1-mesa-dev
libgles2-mesa
libsdl2-dev

_Debian -- stretch の libegl1-mesa-dev パッケージに関する詳細
_Debian -- stretch の libgles2-mesa パッケージに関する詳細
_Debian -- stretch の libsdl2-dev パッケージに関する詳細

ファイル一覧を眺めると、/usr/lib/arm-linux-gnueabihf/libEGL.so 等が列挙されてる。

_Debian -- パッケージのファイル一覧: libegl1-mesa-dev/stretch/armhf
_Debian -- パッケージのファイル一覧: libgles2-mesa/stretch/armhf

共有ライブラリを探す順番。 :

libEGL.so 等は共有ライブラリと呼ばれるソレで、各アプリがそれらを使いつつ実行されるのだとか。アプリを実行した際、どこに共有ライブラリがあるのか探す順番が、/etc/ld.so.conf で指定されてるそうで。

Raspberyy Pi3 + raspbian stretch で確認してみよう…。catコマンドを使ってファイルの中身を表示してみる。
$ cat /etc/ld.so.conf
include /etc/ld.so.conf.d/*.conf
/etc/ld.so.conf.d/*.conf をインクルードしてるな…。そっちに実際の指定が書いてあるらしい。

ファイルを確認。
$ ls -al /etc/ld.so.conf.d/
合計 24
drwxr-xr-x   2 root root 4096  8月 16 09:31 .
drwxr-xr-x 120 root root 4096  9月  1 17:35 ..
-rw-r--r--   1 root root   12  8月 12 02:05 00-vmcs.conf
-rw-r--r--   1 root root   74  6月 16 04:17 arm-linux-gnueabihf.conf
-rw-r--r--   1 root root   41  1月 17  2017 fakeroot-arm-linux-gnueabihf.conf
-rw-r--r--   1 root root   44  3月 21  2016 libc.conf
4ファイル入ってる。おそらくだけど、00-vmcs.conf てのが、頭に「00」がついてることで一番先に呼ばれるんじゃないかな。

$ cat /etc/ld.so.conf.d/00-vmcs.conf
/opt/vc/lib

$ cat /etc/ld.so.conf.d/arm-linux-gnueabihf.conf
# Multiarch support
/lib/arm-linux-gnueabihf
/usr/lib/arm-linux-gnueabihf

$ cat /etc/ld.so.conf.d/fakeroot-arm-linux-gnueabihf.conf
/usr/lib/arm-linux-gnueabihf/libfakeroot

$ cat /etc/ld.so.conf.d/libc.conf
# libc default configuration
/usr/local/lib

つまり、以下の順番で共有ライブラリを探すのだろう…。たぶん。
/opt/vc/lib
/lib/arm-linux-gnueabihf
/usr/lib/arm-linux-gnueabihf
/usr/lib/arm-linux-gnueabihf/libfakeroot
/usr/local/lib

sudo ldconfig をすると、/etc/ld.so.cache というファイルが更新される。中身はバイナリっぽい。各アプリは、実際には /etc/ld.so.cache を参照して共有ライブラリを見つける、ってことなのかな?

_/etc/ld.so.cacheとは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典 に説明があった。ldconfig -p で、ld.so.cache の内容をテキストで表示してくれるらしい。
$ ldconfig -p | grep libEGL
        libEGL.so.1 (libc6,hard-float) => /usr/lib/arm-linux-gnueabihf/libEGL.so.1
        libEGL.so (libc6,hard-float) => /opt/vc/lib/libEGL.so
        libEGL.so (libc6,hard-float) => /usr/lib/arm-linux-gnueabihf/libEGL.so

$ ldconfig -p | grep libGLESv2
        libGLESv2.so.2 (libc6,hard-float) => /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2
        libGLESv2.so (libc6,hard-float) => /opt/vc/lib/libGLESv2.so
        libGLESv2.so (libc6,hard-float) => /usr/lib/arm-linux-gnueabihf/libGLESv2.so
libEGL.so はココにあるよ、てな感じの情報が、/etc/ld.so.cache に記録・列挙されてるのだな…。

要するに最新版では修正済みらしい。 :

今回、sudo rpi-update をしたことで、libEGL.so や libGLESv2.so が /opt/vc/lib/ の中に追加されたから、OpenGL ES を使うアレコレは、まず /opt/vc/lib/ 内のソレを探すはず。であれば、今まで動かなかったアレコレも、正常動作するようになった可能性が高い。かもしれない。

実際に、es2gears や、Python + pi3d + pi3d_demos の python Earth.py を動かしてみた。どちらも動作してくれた。 *1

つまり、少なくとも pi3d に関しては、昨日行ったシンボリックリンクの変更作業等はしなくてもよくなったらしい。助かった。ありがたや。

*1: es2gears は相変わらず表示がおかしいけど…。

#2 [raspberrypi][linux] シェルスクリプト内でシンボリックリンクの変更ができなくて悩んだり

昨日、Raspberry Pi3 上で、*.so のシンボリックリンク変更作業をしていた際に、何度も何度も同じ行を打つのが面倒だったのでスクリプトにできないかなーと思いついたわけで。

てなわけで、ググりまくりながら生まれて初めて Linux用のシェルスクリプトを書いてみたのだけど。コレが何故か上手く行かず。

スクリプトは以下。 :

書いてみたスクリプトは以下。数字を入力して、その数字と対応した *.so のシンボリックリンクを /usr/lib/arm-linux-gnueabihf/ 以下に作成する。みたいな。

_chg_libegl.sh
#!/bin/bash
# change link libEGL.so , libEGL.so.1 , libGLESv2.so , libGLESv2.so.2
set -Ceu

if [ "$USER" == "root" ]; then
    :
else
    echo "please sudo chg_libegl.sh."
    exit 0
fi

LIBDIR0=/usr/lib/arm-linux-gnueabihf
LIBEGL0="${LIBDIR0}/libEGL.so.1.0.0"
LIBGLESV20="${LIBDIR0}/libGLESv2.so.2.0.0"

LIBEGL1=/usr/lib/chromium-browser/libEGL.so
LIBGLESV21=/usr/lib/chromium-browser/libGLESv2.so

LIBEGL2=/opt/vc/lib/libbrcmEGL.so
LIBGLESV22=/opt/vc/lib/libbrcmGLESv2.so

LIBEGLSRC=
LIBGLESV2SRC=

echo "change libEGL.so , libGLESv2.so"
echo "  0 : ${LIBEGL0}"
echo "  1 : ${LIBEGL1}"
echo "  2 : ${LIBEGL2}"
read -p "select (0/1/2/n): " num

case "${num}" in
    "0" )
        LIBEGLSRC="${LIBEGL0}"
        LIBGLESV2SRC="${LIBGLESV20}"
        echo "# select 0"
        ;;
    "1" )
        LIBEGLSRC="${LIBEGL1}"
        LIBGLESV2SRC="${LIBGLESV21}"
        echo "# select 1"
        ;;
    "2" )
        LIBEGLSRC="${LIBEGL2}"
        LIBGLESV2SRC="${LIBGLESV22}"
        echo "# select 2"
        ;;
esac

if [ -n "${LIBEGLSRC}" ]; then
    if [ -e "${LIBEGLSRC}" ]; then
        echo "# Found ${LIBEGLSRC}"
        echo "sudo ln -fs ${LIBEGLSRC} ${LIBDIR0}/libEGL.so"
        echo "sudo ln -fs ${LIBEGLSRC} ${LIBDIR0}/libEGL.so.1"
        ln -fs ${LIBEGLSRC} ${LIBDIR0}/libEGL.so
        ln -fs ${LIBEGLSRC} ${LIBDIR0}/libEGL.so.1
    else
        echo "Not found ${LIBEGLSRC}"
    fi
else
    echo "hold libEGL.so link."
fi

if [ -n "${LIBGLESV2SRC}" ]; then
    if [ -e "${LIBGLESV2SRC}" ]; then
        echo "# Found ${LIBGLESV2SRC}"
        echo "sudo ln -fs ${LIBGLESV2SRC} ${LIBDIR0}/libGLESv2.so"
        echo "sudo ln -fs ${LIBGLESV2SRC} ${LIBDIR0}/libGLESv2.so.2"
        ln -fs ${LIBGLESV2SRC} ${LIBDIR0}/libGLESv2.so
        ln -fs ${LIBGLESV2SRC} ${LIBDIR0}/libGLESv2.so.2
    else
        echo "Not found ${LIBGLESV2SRC}"
    fi
else
    echo "hold libGLESv2.so link."
fi

if [ -n "${LIBEGLSRC}" -o -n "${LIBGLESV2SRC}" ]; then
    echo "sudo ldconfig"
    ldconfig
fi

echo -e "\n"
/bin/ls -alF --color=auto ${LIBDIR0}/libEGL*
/bin/ls -alF --color=auto ${LIBDIR0}/libGLESv2*
exit 0

実行結果。 :

実行してみると…。
$ sudo ~/bin/chg_libegl.sh
change libEGL.so , libGLESv2.so
  0 : /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0
  1 : /usr/lib/chromium-browser/libEGL.so
  2 : /opt/vc/lib/libbrcmEGL.so
select (0/1/2/n): 0
# select 0
# Found /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0
sudo ln -fs /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0 /usr/lib/arm-linux-gnueabihf/libEGL.so
sudo ln -fs /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0 /usr/lib/arm-linux-gnueabihf/libEGL.so.1
# Found /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0
sudo ln -fs /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0 /usr/lib/arm-linux-gnueabihf/libGLESv2.so
sudo ln -fs /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0 /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2
sudo ldconfig


lrwxrwxrwx 1 root root     44  9月  1 18:04 /usr/lib/arm-linux-gnueabihf/libEGL.so -> /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0
lrwxrwxrwx 1 root root     44  9月  1 18:04 /usr/lib/arm-linux-gnueabihf/libEGL.so.1 -> /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0
-rw-r--r-- 1 root root 175516  8月  4 21:41 /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0
lrwxrwxrwx 1 root root    47  9月  1 18:04 /usr/lib/arm-linux-gnueabihf/libGLESv2.so -> /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0
lrwxrwxrwx 1 root root    47  9月  1 18:04 /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2 -> /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0
-rw-r--r-- 1 root root 38184  8月  4 21:41 /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0
「0」を打ち込んだ時は思った通りに動く。

ところが。
$ sudo ~/bin/chg_libegl.sh
change libEGL.so , libGLESv2.so
  0 : /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0
  1 : /usr/lib/chromium-browser/libEGL.so
  2 : /opt/vc/lib/libbrcmEGL.so
select (0/1/2/n): 1
# select 1
# Found /usr/lib/chromium-browser/libEGL.so
sudo ln -fs /usr/lib/chromium-browser/libEGL.so /usr/lib/arm-linux-gnueabihf/libEGL.so
sudo ln -fs /usr/lib/chromium-browser/libEGL.so /usr/lib/arm-linux-gnueabihf/libEGL.so.1
# Found /usr/lib/chromium-browser/libGLESv2.so
sudo ln -fs /usr/lib/chromium-browser/libGLESv2.so /usr/lib/arm-linux-gnueabihf/libGLESv2.so
sudo ln -fs /usr/lib/chromium-browser/libGLESv2.so /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2
sudo ldconfig


lrwxrwxrwx 1 root root     13  9月  1 18:05 /usr/lib/arm-linux-gnueabihf/libEGL.so -> libbrcmEGL.so
lrwxrwxrwx 1 root root     15  9月  1 18:05 /usr/lib/arm-linux-gnueabihf/libEGL.so.1 -> libEGL.so.1.0.0
-rw-r--r-- 1 root root 175516  8月  4 21:41 /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0
lrwxrwxrwx 1 root root    16  9月  1 18:05 /usr/lib/arm-linux-gnueabihf/libGLESv2.so -> libbrcmGLESv2.so
lrwxrwxrwx 1 root root    18  9月  1 18:05 /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2 -> libGLESv2.so.2.0.0
-rw-r--r-- 1 root root 38184  8月  4 21:41 /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0
$ sudo ~/bin/chg_libegl.sh
change libEGL.so , libGLESv2.so
  0 : /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0
  1 : /usr/lib/chromium-browser/libEGL.so
  2 : /opt/vc/lib/libbrcmEGL.so
select (0/1/2/n): 2
# select 2
# Found /opt/vc/lib/libbrcmEGL.so
sudo ln -fs /opt/vc/lib/libbrcmEGL.so /usr/lib/arm-linux-gnueabihf/libEGL.so
sudo ln -fs /opt/vc/lib/libbrcmEGL.so /usr/lib/arm-linux-gnueabihf/libEGL.so.1
# Found /opt/vc/lib/libbrcmGLESv2.so
sudo ln -fs /opt/vc/lib/libbrcmGLESv2.so /usr/lib/arm-linux-gnueabihf/libGLESv2.so
sudo ln -fs /opt/vc/lib/libbrcmGLESv2.so /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2
sudo ldconfig


lrwxrwxrwx 1 root root     25  9月  1 18:06 /usr/lib/arm-linux-gnueabihf/libEGL.so -> /opt/vc/lib/libbrcmEGL.so
lrwxrwxrwx 1 root root     15  9月  1 18:06 /usr/lib/arm-linux-gnueabihf/libEGL.so.1 -> libEGL.so.1.0.0
-rw-r--r-- 1 root root 175516  8月  4 21:41 /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0
lrwxrwxrwx 1 root root    28  9月  1 18:06 /usr/lib/arm-linux-gnueabihf/libGLESv2.so -> /opt/vc/lib/libbrcmGLESv2.so
lrwxrwxrwx 1 root root    18  9月  1 18:06 /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2 -> libGLESv2.so.2.0.0
-rw-r--r-- 1 root root 38184  8月  4 21:41 /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0
「1」や「2」を打った時は変な .so にリンクされたり、*.so.1 や *.so.2 のリンクが変わらなかったりする。

よくわからないのが、bash を開いて一行一行打ち込むと、ちゃんと反映されること。
$ sudo ln -fs /usr/lib/chromium-browser/libEGL.so /usr/lib/arm-linux-gnueabihf/libEGL.so.1
$ sudo ln -fs /usr/lib/chromium-browser/libEGL.so /usr/lib/arm-linux-gnueabihf/libEGL.so
$ sudo ln -fs /usr/lib/chromium-browser/libGLESv2.so /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2
$ sudo ln -fs /usr/lib/chromium-browser/libGLESv2.so /usr/lib/arm-linux-gnueabihf/libGLESv2.so

$ ll /usr/lib/arm-linux-gnueabihf/libEGL*
lrwxrwxrwx 1 root root     35  9月  1 18:08 /usr/lib/arm-linux-gnueabihf/libEGL.so -> /usr/lib/chromium-browser/libEGL.so*
lrwxrwxrwx 1 root root     35  9月  1 18:08 /usr/lib/arm-linux-gnueabihf/libEGL.so.1 -> /usr/lib/chromium-browser/libEGL.so*
-rw-r--r-- 1 root root 175516  8月  4 21:41 /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0

$ ll /usr/lib/arm-linux-gnueabihf/libGLESv2*
lrwxrwxrwx 1 root root    38  9月  1 18:08 /usr/lib/arm-linux-gnueabihf/libGLESv2.so -> /usr/lib/chromium-browser/libGLESv2.so*
lrwxrwxrwx 1 root root    38  9月  1 18:08 /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2 -> /usr/lib/chromium-browser/libGLESv2.so*
-rw-r--r-- 1 root root 38184  8月  4 21:41 /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0

一体何を間違えているのだろう…。シェルスクリプト、あるいは ln に、何か罠でもあるのか。それともケアレスミスなのか…。
  • ln -fs SRC DST でシンボリックリンクを上書き変更する際に時間がかかっているのだろうか。と思って sleep 1 をあちこちに入れてみたけど変化なし。
  • ln -fs "SRC" "DST" とダブルクオーテーションで囲んでみたけど変化なし。
  • set -Ceux を指定して、動作を一行ずつ表示させてみたけど、おかしな指定をしてるようには見えず。

まあ、sudo rpi-update をしたらこんなことをしなくても済むように修正されたので、このスクリプトは既に不要ではあるのだけど。しかし、どうしてこんな妙な動作になるのか…。

ldconfigが関係してるのかな。 :

以下のような書き方をしたら思った通りに動いてくれた。

_chg_libegl.sh.new
#!/bin/sh
# change link libEGL.so , libEGL.so.1 , libGLESv2.so , libGLESv2.so.2
set -Ceu

echo "change libEGL.so , libGLESv2.so"
echo "  0 : /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0"
echo "  1 : /usr/lib/chromium-browser/libEGL.so"
echo "  2 : /opt/vc/lib/libbrcmEGL.so"
read -p "select (0/1/2/n): " num

case "${num}" in
    "0" )
        ln -fs /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0 /usr/lib/arm-linux-gnueabihf/libEGL.so
        ln -fs /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0 /usr/lib/arm-linux-gnueabihf/libEGL.so.1
        ln -fs /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0 /usr/lib/arm-linux-gnueabihf/libGLESv2.so
        ln -fs /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0 /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2
        ls -alF --color=auto /usr/lib/arm-linux-gnueabihf/libEGL*
        ls -alF --color=auto /usr/lib/arm-linux-gnueabihf/libGLESv2*
        echo "\nplease sudo ldconfig"
        ;;
    "1" )
        ln -fs /usr/lib/chromium-browser/libEGL.so /usr/lib/arm-linux-gnueabihf/libEGL.so
        ln -fs /usr/lib/chromium-browser/libEGL.so /usr/lib/arm-linux-gnueabihf/libEGL.so.1
        ln -fs /usr/lib/chromium-browser/libGLESv2.so /usr/lib/arm-linux-gnueabihf/libGLESv2.so
        ln -fs /usr/lib/chromium-browser/libGLESv2.so /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2
        ls -alF --color=auto /usr/lib/arm-linux-gnueabihf/libEGL*
        ls -alF --color=auto /usr/lib/arm-linux-gnueabihf/libGLESv2*
        echo "\nplease sudo ldconfig"
        ;;
    "2" )
        ln -fs /opt/vc/lib/libbrcmEGL.so /usr/lib/arm-linux-gnueabihf/libEGL.so
        ln -fs /opt/vc/lib/libbrcmEGL.so /usr/lib/arm-linux-gnueabihf/libEGL.so.1
        ln -fs /opt/vc/lib/libbrcmGLESv2.so /usr/lib/arm-linux-gnueabihf/libGLESv2.so
        ln -fs /opt/vc/lib/libbrcmGLESv2.so /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2
        ls -alF --color=auto /usr/lib/arm-linux-gnueabihf/libEGL*
        ls -alF --color=auto /usr/lib/arm-linux-gnueabihf/libGLESv2*
        echo "\nplease sudo ldconfig"
        ;;
    * )
        ls -alF --color=auto /usr/lib/arm-linux-gnueabihf/libEGL*
        ls -alF --color=auto /usr/lib/arm-linux-gnueabihf/libGLESv2*
        ;;
esac
exit 0

ldconfig を呼ぶと以前のような妙な動作になるけど、ldconfig を呼ばなければ思った通りに動くことに気が付いた。…なんで? どうして?

2017/09/02() [n年前の日記]

#1 [ubuntu][python][pi3d] Ubuntu Linux 16.04 LTS に pi3d をインストール

Pythonから OpenGL ES を使える _pi3d は、 Linux や Windows 上でもインストールすることが可能らしい。足元で埃をかぶってる、Ubuntu Linux 16.04 LTS が入ったサブPCを使って、インストールできるのか試してみる。

Ubuntu Linux 上で OpenGL ES が使えるようにする。 :

デスクトップ機で OpenGL ES を使うためには、mesa-utils-extra が必要らしい。仮想的に OpenGL ES を持ってるような状態にしてくれるとかなんとか…。とりあえずインストール。
sudo apt install mesa-utils-extra

実機にディスプレイを繋いで、OpenGL ES の動作確認。
es2gears
ギアがクルクル回るアレが表示されて、FPSも出力された。動いてるっぽい。

pipをインストール。 :

pipをインストール。pip を使えば、Python のモジュールをネット経由でインストールできる。
sudo apt install python-pip python3-pip

バージョン等を確認。
$ pip3 --version
pip 8.1.1 from /usr/lib/python3/dist-packages (python 3.5)

$ sudo -H pip3 search pi3d
pi3d (2.20)  - pi3d OpenGLES2 3D graphics library
You are using pip version 8.1.1, however version 9.0.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
「pipをアップグレードしろ」と言われてしまった。

pipをアップグレードする。
$ sudo -H pip3 install --upgrade pip

$ sudo -H pip3 --version
pip 9.0.1 from /usr/local/lib/python3.5/dist-packages (python 3.5)
アップグレードできた。

ちなみにUbuntu上では、pip は Python 2.7用。pip3 は Python 3.x 用。自分の環境では、pip のほうは既に 9.0.1 になってた。

pi3dをインストール。 :

pipを使って、pi3dをインストール。
sudo -H pip install pi3d
sudo -H pip3 install pi3d

デモスクリプト群の pi3d_demos も git で取ってくる。
git clone https://github.com/pi3d/pi3d_demos.git

pi3dの動作確認。 :

デモスクリプトを動かしてみる。ディスプレイを繋げた実機上で操作。
cd pi3d_demos
python Earth.py
地球と月がグルグル回るソレが出てきた。たしかに Linux上でも動いた。

他のスクリプトも動かしてみる。
Python ForestWalk.py
Permission denied /dev/input/mice と怒られて終了してしまった…。

/dev/input/mice のパーミッションを確認してみる。
$ ll /dev/input/mice
crw-rw---- 1 root input 13, 63  9月  2 08:51 /dev/input/mice
ユーザがinputグループに入ってないとアクセスできないのだな…。

ユーザをinputグループに所属させる。
sudo gpasswd -a ユーザ名 input
ログアウトして再ログイン。

再度、pi3dのスクリプトを実行。
python ForestWalk.py
今度は動いた。

ということで、Linux上でも pi3d が動作することを確認できた。

自分の手元の環境の問題点。 :

表示はできたけど、描画面積が大きいスクリプトを動かすと、なんだかガクガクしてるな…。

サブPCのCPUとM/Bは、AMD Athlon II X2 250 (3.0GHz, 2コア) + ASRock M3A785GMH/128M (AMD785G + SB710チップセット使用)。このスペックでは重いのかもしれん。というか、AMD785Gチップセットの ATI Radeon HD 4200 が足を引っ張ってるんじゃないかな。たぶん。

VMware + Ubuntu でも試してみた。 :

調子に乗って VMware + Ubuntu 上でも pi3d のインストールを試してみた。

import pi3d で「そんなモジュールはねえよ」と怒られた…。pip じゃなくて pip2 を使ってインストールしないとダメっぽい。pip2 が Python 2.7用。pip3 が Python 3.x用。ということなのかな。
sudo -H pip2 install pi3d

この状態なら、python Earth.py が動いてくれた。

ただ、VMware 上では vsync(垂直同期)を見てくれないというかサポートしてないようで。物凄い速度で、地球と月が回る…。

ググってみたら、.vmx に
mks.vsync = "1"
を追加する、という話を見かけたので試してみたけど効果は無かった。もしかするとMac上で動いてるVMware用の設定、なんだろうか。

#2 [ubuntu][linux] x11vncを使ってみたり

今までは、 てな状態で、VNCでリモート接続 ―― Ubuntu のデスクトップ画面を Windows側で表示して操作する、てなことをたまにしてたのだけど。 *1

しかしこの組み合わせだと、Ubuntu側で OpenGL関係の何かを実行しても、Windows 側の VNC viewer 上では描画結果が表示されないことに気がついて、これはちょっと不便だなと。描画速度が遅くてもいい・紙芝居状態でもいいから、一応結果を VNC viewer上でも確認したい。

ググってたら、tightvncserver は OpenGLの描画結果を表示できない、という話を見かけた。そこで代わりに vnc4server をインストールしてみたり。
sudo aptitude purge tightvncserver
sudo aptitude install vnc4server
しかしコレも、OpenGLの描画結果は表示されなかった。

さらにググってたら、x11vnc というものがあると知り。x11vnc を使うと、Ubuntu がディスプレイに表示してるデスクトップをそのまま VNC で表示できるから OpenGLの結果も表示できる、という話を見かけた。

_linux - How can OpenGL graphics be displayed remotely using VNC? - Server Fault
_x11vnc(1) - Linux man page

試してみたり。
sudo aptitude install x11vnc
x11vnc -display :0
Windows側は今までと同様、 UltraVNC に同梱の VNC viewer を利用。「相手ホスト名:5900」でアクセス。

たしかに、OpenGLの描画結果も表示された。接続を切ると x11vnc も終了する。

ただ、コレをするためには、Ubuntu側であらかじめデスクトップ画面を表示しておかないといけない…。

自動ログインを有効に。 :

Ubuntu は _lightdm というディスプレイマネージャが最初に起動して、そこでユーザを選択してパスワードを入力するとデスクトップ画面に入れるようになってる。この lightdm の設定ファイルを編集すれば自動ログインができるようになる。らしい。

_LightDM - ArchWiki
_LightDM - Ubuntu Wiki

/etc/lightdm/lightdm.conf を編集、というか新規作成して以下を追加。
[Seat:*]
autologin-user=ユーザ名
autologin-user-timeout=0

これで、Ubuntuを起動すると自動ログインしてデスクトップ画面が表示される状態になった。後は ssh でアクセスして x11vnc を起動すれば、Windows側で VNC viewer を起動してデスクトップ画面が出せる。はず。

x11vncのオプション。 :

x11vncのオプションについて、一部をメモ。
  • -repeat はキーリピート有効化。
  • -ncache n は描画の高速化。n は 6〜12 を指定できる。
  • -ncache_cr はウインドウドラッグ時の高速化。
  • -nowf はウインドウドラッグ時のワイヤーフレーム表示の無効化。
  • -nodpms はディスプレイの電源管理無効化。スクリーンセーバが1〜2秒で起動してしまうときは指定するといいらしい。
例えば以下のような感じで指定できる。
x11vnc -display :0 -repeat -ncache 10

*1: あくまで「たまに」で…。普段は PuTTY で ssh接続すれば十分な場合がほとんど。

#3 [ubuntu][linux] Ubuntu 16.04上で x0vncserver の動作確認をしてみたり

TigerVNC に入ってる x0vncserver を使えば x11vnc のようなことができるらしい。TightVNC じゃなくて TigerVNC。なんだか間違えやすい…。

_TigerVNC - ArchWiki

試しに入れてみようかなと思ったけれど、TigerVNC は Ubuntu 16.04の公式リポジトリに入ってない。が、 _Releases - TigerVNC/tigervnc 経由で、 _tigervnc/1.8.0 に .debファイルがあることを知った。Files → ubuntu-16.04LTS → amd64、で、tigervncserver_1.8.0-1ubuntu1_amd64.deb をダウンロード。

あるいは、 _https://dl.bintray.com/tigervnc/stable/ubuntu-16.04LTS/amd64/ から入手することもできる。

今まで入れてた vncserver をアンインストール。
sudo aptitude purge tightvncserver
or
sudo aptitude purge vnc4server

_Ubuntu Xenial Xerus 16.04 で tigervnc server(nightly-build:1.6.8) を使う方法 - Qiita を参考に、.deb をダウンロードしたディレクトリで以下を実行して、TigerVNC をインストール。
sudo apt install ./tigervncserver_1.8.0-1ubuntu1_amd64.deb
aptってローカルにある .deb のインストールもできるのか…! 知らなかった。

VNCでアクセスするためのパスワードを指定。 ~/.vnc/passwd にパスワードファイルが作成される。
vncpasswd

x0vncserver を実行。
x0vncserver -display :0 -passwordfile ~/.vnc/passwd

Windows 側から UltraVNC の VNC viewer を使って「相手先ホスト名:5900」でアクセス。パスワードを尋ねてくるので打ち込む。…デスクトップ画面が出た。

しかし、接続を切っても x11vnc のように自動で終了してくれない。Ctrl + C で無理矢理終了させたけど、本来はどうやって終了させるのやら…。

x0vnc4serverなるものもあるらしい。 :

_Ubuntu - パッケージのファイル一覧: vnc4server/trusty-updates/i386 を眺めた感じでは、vnc4server をインストールすると x0vnc4server というファイルがインストールされるようで。TigerVNC を使わなくても vnc4server を入れれば同じことができたのか…な…。

#4 [pc] HDDレコーダがLANに繋がらない

ふと、Windows10 x64機から、HDDレコーダ RD-BZ710 が見えないことに気がついた。調べてみたら、どうも RD-BZ710 がルータからDHCPでIPアドレスを貰えてないようで。というか、RD-BZ710 からルータが見えてない気配が。

とうとう壊れたのかな…。とりあえず、RD-BZ710 を固定IPアドレスにしてみたり。これならWindowsからアクセスできるから用は済むだろう…。

一応、ルータ側も、RD-BZ710 のMACアドレスに固定IPを割り当てる設定にしておいた。

2017/09/03() [n年前の日記]

#1 [python][windows][pi3d] Windows10 x64上に pi3d をインストールしてみたり

Windows上でも _pi3d はインストールできるらしいので試してみた。

_Introduction to pi3d - pi3d 2.20 documentation

環境は Windows10 x64 + Python 2.7.13 or Python 3.5.4。
> python --version
Python 2.7.13

> py -2 --version
Python 2.7.13

> py -3 --version
Python 3.5.4

動作に必要なモジュールをインストール。 :

pi3dをWindows上で動かすには以下のモジュールも必要になるらしい。
pygame
Pillow
numpy

現時点では pip でインストールできる。
pip install pygame
pip install Pillow
pip install numpy

最後に pi3d をインストール。
pip install pi3d

pip list
と打てばインストール済みモジュールの一覧が表示されるので、インストールできたか確認できるはず。

デモスクリプト群 pi3d_demos を入手。 :

_pi3d/pi3d_demos: Demos and support files for pi3d

git を使って持ってくる。
git clone https://github.com/pi3d/pi3d_demos.git

あるいは、zipをダウンロードして解凍してもいい。 _pi3d/pi3d_demos の、右上のほうの緑のボタン、「Clone or download」→「Download zip」をクリックすれば、zipファイルとしてダウンロードできる。

ANGLEの入手。 :

pi3dをWindows上で動かすためには、OpenGL ES をエミュレートするANGLEなるものが ―― 3〜4ファイルの .dllファイルが必要になるらしい。

入手方法はいくつかあるようで。

その1。 _paddywwoof/pi3d_windll からzipでダウンロードして解凍。中に入ってる dllファイルを使わせてもらう方法。

その2。Mozilla Firefox のインストールフォルダ、
C:\Program Files (x86)\Mozilla Firefox\
から、該当する .dll をコピーしてくる方法。

その3。Google Chrome のインストールフォルダ、
C:\Program Files (x86)\Google\Chrome\Application\バージョン番号\
からコピーしてくる方法。

動作に必要なファイルは3〜4ファイル。
libegl.dll
libglesv2.dll
d3dcompiler_47.dll   # 最後の数字は違ってる可能性有
mozglue.dll          # Mozilla Firefox のみ必要

これらのファイルを、動かしたいスクリプトと同じ階層に置く。例えば pi3d_demos を動かしたいなら、pi3d_demosフォルダの中にコピーする。

Pythonが32bit版なら、32bit版用のdllを、Pythonが64bit版なら、64bit版のdllを用意する。

ちなみに自分の環境では、 _paddywwoof/pi3d_windll の32bit版dll、あるいは Firefoxのソレが使えて、Google Chromeのソレは使えなかった。

デモスクリプトの実行。 :

pi3d_demos の Earth.py を動かしてみる。
cd pi3d_demos
python Earth.py
D:\home\prg\python\_test_sample\pi3d\pi3d_demos\pi3d_demos> python Earth.py
Traceback (most recent call last):
  File "Earth.py", line 11, in <module>
    import pi3d
  File "C:\Python\Python27\lib\site-packages\pi3d\__init__.py", line 10, in <module>
    from pi3d.constants import *
  File "C:\Python\Python27\lib\site-packages\pi3d\constants\__init__.py", line 167, in <module>
    PLATFORM, bcm, openegl, opengles = _detect_platform_and_load_libraries()
  File "C:\Python\Python27\lib\site-packages\pi3d\constants\__init__.py", line 160, in _detect_platform_and_load_libraries
    platform, bcm, openegl, opengles = loader()
  File "C:\Python\Python27\lib\site-packages\pi3d\constants\__init__.py", line 139, in _windows
    opengles = _load_library("libglesv2.dll", "Win")
  File "C:\Python\Python27\lib\site-packages\pi3d\constants\__init__.py", line 77, in _load_library
    Log.logger(__name__).error("Couldn't load library %s", name)
AttributeError: 'module' object has no attribute 'logger'
Python 2.7 上で試したらエラーが出て動かない…。libglesv2.dll を見つけ出すところで処理に失敗してる模様。

ところが。Python 3.5 ならどうか。
> py -3 Earth.py
こっちだと動いてしまった。地球と月がWindows上でもクルクル回ってる。

どうやら現時点では、Windows + Python + pi3d は、 Python 3.x でしか動かないようだなと。

どうしてエラーが出るのか謎。 :

Python 2.7で動かそうとした場合、 _pi3d/constants/__init__.py でエラーが出るわけだけど。ソースを眺めても、これでどうしてエラーが出るのか分からない。

pi3d_demosフォルダ内に _mydemo.py というファイルを作って動作確認してみた。

__mydemo.py
import sys
# sys.path.insert(1, '/home/pi/pi3d')

import ctypes

def _load_library(name, dll_type="C"):
    if name:
        try:
            if dll_type == "Win":
                return ctypes.WinDLL(name)
            else:
                return ctypes.CDLL(name)
        except:
            print("Couldn't load library %s" % name)

opengles = _load_library("libglesv2.dll", "Win")
openegl = _load_library("libegl.dll", "Win")
print(opengles)
print(openegl)

> python _mydemo.py
<WinDLL 'libglesv2.dll', handle 5ae30000 at 3467cd0>
<WinDLL 'libegl.dll', handle 5daa0000 at 3467db0>
ちゃんとdllを見つけることができてる。pi3d/constants/__init__.py をコピペして動かしてみたのに問題が出ていない。

なのに、pi3d/constants/__init__.py を呼び出すとエラーになってしまう。何故? どうして?

もし、Python 2.7同梱の ctypes のバグだったら、どっちもエラーが出るはずだよな…。なのに、片方はエラーで、片方は動く…。

Python 3.5 では動いてしまうのも謎。何故。

エラーが出る原因が分かった。 :

Python 2.7.13 のバグらしい。

_TypeError: LoadLibrary() argument 1 must be string, not unicode - Issue #147 - carlosperate/ardublockly
_Issue 29082: In 2.7.13, _ctypes.LoadLibrary no longer accepts Unicode objects - Python tracker
_ctypes - TypeError when importing ghostscript on Python - Stack Overflow

ctypes.WinDLL() に渡すべき文字列の種類が、Python 2.7.13 と Python 3.x では違ってしまっているらしい。Unicode文字列だか、バイト文字列だか…。

例えば、pi3d/constants/__init__.py の _load_library() を、以下のように書き換えるとエラーメッセージが変わってくる。
def _load_library(name, dll_type="C"):
  """Try to load a shared library, report an error on failure."""
  if name:
    try:
      if dll_type == "Win":
        return ctypes.WinDLL(name)
      else:
        return ctypes.CDLL(name)
    except:
      from pi3d.util import Log
      Log.logger(__name__).error("Couldn't load library %s", name)
def _load_library(name, dll_type="C"):
  """Try to load a shared library, report an error on failure."""
  if name:
    if dll_type == "Win":
      return ctypes.WinDLL(name)
    else:
      return ctypes.CDLL(name)

Python 2.7.13 で動かした場合。
> python Earth.py
Traceback (most recent call last):
  File "Earth.py", line 11, in <module>
    import pi3d
(中略)
  File "C:\Python\Python27\lib\site-packages\pi3d\constants\__init__.py", line 72, in _load_library
    return ctypes.WinDLL(name)
  File "C:\Python\Python27\lib\ctypes\__init__.py", line 362, in __init__
    self._handle = _dlopen(self._name, mode)
TypeError: LoadLibrary() argument 1 must be string, not unicode
「TypeError: LoadLibrary() argument 1 must be string, not unicode」と怒られてる。

Python 2.7.13 で動くように修正してみると…。
def _load_library(name, dll_type="C"):
  """Try to load a shared library, report an error on failure."""
  if name:
    name = name.encode('ascii', 'ignore')  # add
    if dll_type == "Win":
      return ctypes.WinDLL(name)
    else:
      return ctypes.CDLL(name)
1行追加しただけで、Python 2.7.13 でも動くようになった。

しかし、同じ修正をしたものを Python 3.5.4 で動かしてみると。
> py -3 Earth.py
Traceback (most recent call last):
  File "Earth.py", line 11, in <module>
    import pi3d
(中略)
  File "C:\Python\Python35\lib\site-packages\pi3d\constants\__init__.py", line 72, in _load_library
    return ctypes.WinDLL(name)
  File "C:\Python\Python35\lib\ctypes\__init__.py", line 351, in __init__
    self._handle = _dlopen(self._name, mode)
TypeError: LoadLibrary() argument 1 must be str, not bytes
今度は、「TypeError: LoadLibrary() argument 1 must be str, not bytes」と怒られた。

Python 2.7.13 と Python 3.5.4 で、エラーメッセージが違ってる…。LoadLibrary() に与えるべき文字列の種類が違うという。
TypeError: LoadLibrary() argument 1 must be string, not unicode

TypeError: LoadLibrary() argument 1 must be str, not bytes

解決策としては…。英語圏のやり取りを眺めると「Python 2.7.12 にダウングレードしろ」「もしくは Python 3.x を使え」ということになってるっぽいな…。

Python 2.7.13 は _結構色々修正されてる っぽいから、できれば 2.7.13 のほうがいいのではと思えてくるけど、しかし、こういう不具合があるのでは…。ていうか去年の年末に報告されてたのに、修正版はまだ出ないのか…。

#2 [python] Python 2.7.13 から 2.7.12 にダウングレードした

Windows10 x64上で普段使ってる Python を、2.7.13 から 2.7.12 にダウングレードすることにした。2.7.13 のバグがちょっとアレなので。

上書きインストールしたらダウングレードできるかな、と期待したけど甘かった。相変わらず 2.7.13 のまま。仕方ないのでアンインストールしてから再インストールすることに。面倒臭いことになってきた。

モジュール一覧を残しておく。 :

アンインストールする前に、インストール済みのモジュールの一覧を残しておく。
pip freeze > list.txt

本来であれば、
pip -r list.txt
で、全部まとめて一括して再インストールできるらしいけど。おそらく pip でインストールできないモジュールもありそうだから、一つ一つ確認しながら再インストールすることに。

コントロールパネルからアンインストール。 :

コントロールパネルから、Python 2.7.x 関係と Python 3.5.x 関係をアンインストール。自分の環境では以下が見つかった。
Python 2.7.12
Python 2.7.13
Python 3.5.4

PyGTK 2.24.2
PyQt GPL 4.11.4
pywin32 219
pyreadline 2.0
wxPython 3.0.2.0
wxPython docs and demos 3.0.2.0

アンインストール後も、Pythonインストールフォルダに色々残ってるので、フォルダをリネームして一応バックアップを取っておく。後で要らなくなったら削除する。

再インストール。 :

Python 2.7.12、Python 3.5.4 の順番でインストール。普段は Python 2.7.x を使ってるので、Python 2.7.12 のインストール時に、PATHへ追加するあたりのオプションを有効にした。

python --version
py -2 --version
py -3 --version
pip --version
再インストールできたっぽい。pip は「アップデートしろ」と言ってきたので、メッセージに従ってアップデート。

各モジュールのインストール。 :

項目が多いので別記事としてメモ。

pi3dについて。 :

Python 2.7.13 から 2.7.12 にしたら、pi3d_demos のスクリプトもちゃんと動作しました。つまり、動かなかったのは Python 2.7.13 のバグのせいだった、ということで。

#3 [python] Python 2.7.12 ダウングレード時に再インストールしたモジュールについてメモ

大半のモジュールは pip install hoge でインストールできたけど、一部のモジュールは別作業でインストールしないといけなかった、ので一応メモ。

pipでインストールできるようになったもの。 :

pyreadline , wxpython は pip でインストールできるようになったらしい。

PyGTK等。 :

PyGTK-all-in-one は、 _Index of /pub/gnome/binaries/win32/pygtk/2.24 から、pygtk-all-in-one-2.24.2.win32-py2.7.msi をDLしてインストール。これで、pygtk , pycairo , pygobject がインストールされた。

pywin32。 :

pywin32 は、pip でインストールできないらしい。 _Python for Windows Extensions - Browse /pywin32 at SourceForge.net から、pywin32-221.win32-py2.7.exe をDLしてインストール。

py2exe。 :

py2exe は、pip でインストールしようとすると「お前の使ってるPythonバージョン用のバイナリはねえ」と怒られる。が、Python 2.7用のpy2exe は py2exe_py2 という名前で提供されてるっぽい?
pip install py2exe_py2
が、 _py2exe - Browse /py2exe at SourceForge.net から入手したほうがいいような気がする。py2exe-0.6.9.win32-py2.7.exe をDLしてインストール。

Pymacs。 :

Pymacs も、pip からインストールできない。 _Pymacs install for windows - ブログ for programming を参考にさせてもらってインストールした。

PyOpenGL。 :

PyOpenGL は、pip でインストールするとデモスクリプトが動かなかったりしてハマる。

_Python Extension Packages for Windows - Christoph Gohlke から、
PyOpenGL-3.1.1-cp27-cp27m-win32.whl
PyOpenGL_accelerate-3.1.1-cp27-cp27m-win32.whl
をDLして、それらを使ってインストールする。
pip install PyOpenGL-3.1.1-cp27-cp27m-win32.whl
pip install PyOpenGL_accelerate-3.1.1-cp27-cp27m-win32.whl

デモスクリプトは、 _PyOpenGL-Demo 3.0.1b1 : Python Package Index から、PyOpenGL-Demo-3.0.1b1.zip をDLして解凍。フォルダの中に入って、
python setup.py install
を実行すると、以下の場所にインストールされる。
Python2.7インストールフォルダ\Lib\site-packages\PyOpenGL-Demo\

wxPythonのデモスクリプト等。 :

wxPython のデモスクリプトとドキュメントは、 _wxPython Downloads 経由で、 _Index of /wxPython4/extras/4.0.0b1 から入手可能。
wxPython-demo-4.0.0b1.tar.gz
wxPython-docs-4.0.0b1.tar.gz
それぞれをDLして任意のフォルダに解凍。ただ、かなり解凍時間がかかる。両方合わせて9,000ファイルぐらいあるようで。

デモは、demo.py を実行すると見れる。

ドキュメントは、index.html を開けば見れる、けど、Web上の _wxPython API Documentation を眺めたほうが早いかも。

2017/09/04(月) [n年前の日記]

#1 [python][pi3d] pi3dでハローワールド

せっかく Windows上でも pi3d が動くようになったので、少し使い方を調べてみたり。

球を出す。 :

_pi3dの公式ドキュメント に従って、ウインドウを生成して球を出してみたり。こんな感じに。

helloworld_ss.png

一応、ESCキーを押したら終了するようにしてある。じゃないとスクリプトを簡単に終了させられないので。

ソースは以下。

_helloworld.py
u"""
pi3d Hello World.

球を生成して描画するサンプル。
ESCキーで終了する。

Windows10 x64 + Python 2.7.12 32bit + pi3d 2.20
"""
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals
import pi3d

# ウインドウ生成
display = pi3d.Display.create(w=640, h=480,
                              frames_per_second=60)

# 球を生成
ball = pi3d.Sphere(z=5.0)

# キーボード取得用クラスを生成
keys = pi3d.Keyboard()

# メインループ
while display.loop_running():

    # 球を描画
    ball.draw()

    if keys.read() == 27:
        # ESCキーが押されたらループを抜けて終了
        keys.close()
        display.destroy()
        break

python helloworld.py で実行できる。

Windows10 x64上だけではなく、以下の環境でも同じように表示された。
  • Ubuntu 16.04 + Python 2.7.12
  • Raspberry Pi3 + raspbian stretch + Python 2.7.13

少し解説。 :

pi3d を使うときは、import pi3d を最初のあたりに書いて、「このスクリプトはpi3dを使うよ」とPythonに教えてやる。

上記スクリプトの最初のほうに、from __future__ import なんたら、みたいな行が列挙されてるけど。これは、Python 2.7を使いつつも Python 3.x っぽく動かすための指定らしい。コレを入れとけば Python 2.7 と Python 3.x の両方で動くスクリプトが書けるのだろう。たぶん。Pythonってよく知らないから自信ないけど。

display = pi3d.Display.create(w=640, h=480, frames_per_second=60) で、ウインドウを生成。w,h が、ウインドウ横幅と縦幅の指定。frames_per_second で最大フレームレートを指定。この場合、640x480ドット、60FPSのウインドウを作れ、と指定してる。

フレームレートを指定しないと、CPUが全力でループを回す状態になって、その分、他の処理がおろそかになるのだとか。バックグラウンドで音楽を鳴らしつつ、みたいなことをしたいときはフレームレートを指定したほうがいいよ、とドキュメントには書いてあった。

ball = pi3d.Sphere(z=5.0) で、球を生成。pi3d.Sphere(x=0.0, y=0.0, z=0.0) といった感じの指定で、位置を設定できるらしい。

if keys.read() == 27: は、ESCキーが押されたかチェックしてる。…いきなり直接数値を書いて比較してるあたりがなんだか引っ掛かるなあ。

そのままいきなりスクリプトを終了させると、キー入力関係の不具合が発生する時があるらしいので、keys.close() を呼んでから終了したほうがいいかも、みたいなことが公式ドキュメントに書いてあった。pi3d_demos のサンプルスクリプト群も大体そんな感じの記述になってるっぽい。

display.destroy() でウインドウを破棄、してるのかな。たぶん。

球を動かしてみる。 :

静止画ではつまらないので、球を動かしてみたい。sinカーブで位置を変えてみる。

helloworld2_ss.gif

これも、Windows10 x64、Ubuntu 16.04、Raspberry Pi3上で同じように動いた。

ソースは以下。

_helloworld2.py
u"""
pi3d Hello World.

球を生成して描画するサンプル。位置を動かしてみる。
ESCキーで終了する。

Windows10 x64 + Python 2.7.12 32bit + pi3d 2.20
"""

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals
import math
import pi3d

# ウインドウ生成
display = pi3d.Display.create(w=640, h=480,
                              frames_per_second=60)

x, y, z = 0.0, 0.0, 15.0
x_ang, y_ang, z_ang = 0.0, 0.0, 0.0

# 球を生成
ball = pi3d.Sphere(x=x, y=y, z=z)

# キーボード取得用クラスを生成
keys = pi3d.Keyboard()

# メインループ
while display.loop_running():

    # sinカーブで位置を動かす
    x_ang += 3.0
    y_ang += 4.5
    z_ang += 0.8
    x = 5.0 * math.sin(math.radians(x_ang))
    y = 3.0 * math.sin(math.radians(y_ang))
    z = 7.0 * math.sin(math.radians(z_ang)) + 15.0

    # 球の位置を設定
    ball.position(x, y, z)

    # 球を描画
    ball.draw()

    if keys.read() == 27:
        # ESCキーが押されたらループを抜けて終了
        keys.close()
        display.destroy()
        break

python helloworld2.py で実行できる。

#2 [ubuntu] x11vncを使うとテンキーが送れない

Windows10 x64 + VNC viewer から、Ubuntu 16.04 + x11vnc にアクセスして、デスクトップ画面を表示して操作してたのだけど。Windows側でテンキーを押しても正常に送られてないことに気づいたり。ちなみに Windows側の VNC viewer は UltraVNC同梱の Viewer。

Ubuntu側で vncserver を立ち上げて、そこにアクセスした場合は、テンキーもちゃんと送れる…。ということは VNC viewer の設定がおかしいわけではなく、x11vnc のほうで設定が必要なのかな…? ググってみたけど解決策が見つからず。

まあ、テンキーが使えなくても、どうにかなるかな…。

TigerVNCをアンインストール。 :

どうも時々 VNC viewer が落ちてしまう。もしかして、Ubuntu側で TigerVNC を使ってるのがよろしくないのかな。公式リポジトリに入ってないパッケージだし、ちょっと不安定だったりする可能性がありそうな。や、どこが原因で落ちてるのか分からないので、濡れ衣かもしれんけど。

とりあえず TigerVNC をアンインストールして、代わりに vnc4server をインストールしてみたり。後者で安定動作してくれたらいいのだけど、さて。
sudo aptitude purge tigervncserver
sudo aptitude install vnc4server

元々 TigerVNC をインストールしたのは、x0vncserver を試してみたかったから、だけど。vnc4server にも、x0vnc4server が入っていて、インストールすると x0vncserver として割り当ててくれるので、x0vncserver を使いたくなった時も困ったりはしないだろう…。

#3 [ubuntu] Ubuntu機に winbind をインストール

Ubuntu 16.04機からWindows10 x64機のホスト名が見えない。winbind をインストーすることで解決、という事例を見かけたので試してみたり。
sudo aptitude install winbind libnss-winbind

sudo vi /etc/nsswitch.conf
hosts:          files mdns4_minimal [NOTFOUND=return] dns myhostname
↓
hosts:          files mdns4_minimal [NOTFOUND=return] dns myhostname mdns4 wins

sudo service winbind restart

ping Windows機ホスト名、が通るようになった。

以下、参考ページ。

_Winbind をインストールしたのに NetBIOS nameでアクセスできない on Ubuntu 13.10 | 穀風
_まさおのブログ (表): Ubuntu で wins の設定

Ubuntu側からWindowsの共有フォルダにアクセス。 :

Ubuntu 16.04側から、Windows10 x64上の共有フォルダにアクセスしたい。cifs-utils なるパッケージをインストールすればマウントできるらしい。試してみたり。
sudo aptitude install cifs-utils
sudo mkdir /mnt/windows

以下でマウント。パスワード指定は省略可能で、その場合コマンドを実行した段階で尋ねてくるのだとか。
sudo mount -t cifs -o username=Windowsユーザ名,password=Windowsパスワード //Windowsホスト名/共有フォルダ名 /mnt/windows
or
sudo mount.cifs -o username=Windowsユーザー名 //Windowsホスト名/共有フォルダ名 /mnt/windows

これで実際にマウントできた。

上記の場合、所有者が root:root になる。変更した状態でマウントしたいなら、uidとgidを指定すればいいらしい。
sudo mount.cifs -o username=Windowsユーザー名,uid=ubuntu,gid=ubuntu //Windowsホスト名/共有フォルダ名 /mnt/windows

以下、参考ページ。

_Ubuntu から Windows の共有フォルダをマウントして利用する - Qiita
_【cifs-1】UbuntuからWindowsの共有フォルダを手動マウントする | インフラエンジニアのメモ

#4 [pc] Bluetooth接続のキーボードが欲しいのだけど

Raspberry Pi3 に一々ワイヤレスキーボードの子機を差すのが面倒臭くなってきた…。Raspberry Pi3はBluetoothを内蔵してることだし、Bluetooth接続のキーボードが欲しくなってきた…。

しかし…。 てな希望を元に探してみたら、これがまったく選択肢が無くて。

いっそ、仮想キーボードを使うという選択肢は…どうだろう…。Bluetooth でマウスだけを接続して…。

_Raspberry Pi の仮想キーボード | Raspberry Pi

2017/09/05(火) [n年前の日記]

#1 [nitijyou] SONY製オーディオセレクターを分解

自分はPCで音を聞く時にヘッドフォンをとっかえひっかえしてるのだけど。一々コネクタの抜き差しをしてたら面倒臭い、ということで、 _SONY SB-A40 というオーディオセレクターを使っていたり。

しかし最近、スイッチを切り替えても接触不良で左右が正しく聞こえない時があって。試しに分解して KURE CRC 接点復活スプレーを吹いてみようかなと。

てなわけで分解。一応写真も残しておいてみたりして。

sony_sb_a40_01.jpg

sony_sb_a40_02.jpg

sony_sb_a40_03.jpg

分解は、底面の2つのネジを外して、前面(?)の薄いほうから開ける感じ。簡単にパカッと開けるわけではなく、マイナスドライバーで少しずつグリグリしながら開けた。何かコツがあるのかな…。

分解してみて驚いたけど、スイッチの機構が謎。4つスイッチが並んでるだけのように見えたのだけど、1つを押すと他の3つがOFFになって軸が上がる。どういう仕組みになってるんだ…SONYは魔法でも使っているのか…。とにかく、昔のSONYにはアイデアマンが居たのだなと。いや、SONYが設計したわけじゃないのかもしれないけど。

とりあえず、スイッチの軸の、微妙に凹みがあるところから、接点復活スプレーをかけてみたけど。これで効果は期待できるのだろうか…。中にちゃんと入ってるのかな…。

中国企業にコピーしてほしい一品。 :

この SB-A40、もう販売してないんだよなあ…。とっても便利なのに…。ここはぜひとも中国企業にガツンとコピーしてもらって市場・店頭に流してもらいたい。今の中国の技術力ならできるはず。ていうか裏面には「MADE IN CHINA」って書いてあったし。

「今時は皆、Bluetoothヘッドフォン使ってるよ」「ケーブルなんか使わねえよ」「ステレオミニジャック? 何ソレ? 円谷特撮?」と言われてしまうだろうか…。そんな殺生な。

もし、コレが壊れたら、自作するしかないのかなあ…。はんだ付け、面倒臭いなあ…。

_monta@site >> ロータリースイッチでヘッドホンセレクターを作る
_100均工作:Seriaのブリキケースで4系統ステレオミニオーディオセレクターを作ってみた - white croquis
_電子工作知識ゼロが作る、自作オーディオセレクター 前編 : ZAPZAP!
_電子工作知識ゼロが作る、自作オーディオセレクター 後編 : ZAPZAP!

#2 [game][neta] 夢の中で気になるゲームを見かけた

寝ていたら、夢の中で、なんだか気になるゲームを見かけた。のでなんとなくメモ。







てな感じで、覚えてる範囲でメモ。

目が覚めてから気づいたけど。なんかこういうインディーズゲームの動画を見たような記憶が…。タイトル忘れたけど…。ただ、そのゲームは鬼のような難易度だったような。

「ぺったんこ」なるソレは、たぶん「もじぴったん」あたりからの連想じゃないのだろうか。ちなみに、なんとなく気になって「ぺったんこ ゲーム」でググってみたらたくさん出てきた。今まで知らなかったけど、「ぺったんこ」なる言葉はゲームのタイトルにたくさん使われていたのだな…。

寝ぼけ頭で、ゲーム制作ライブラリの類でとりあえずゲームっぽいものを作ってみる、てな時にはヨサゲな仕様かも、と思ったりもして。 であれば、ちゃんと作れたらそこそこ面白くなる可能性が。…む。考えてみたら壁だか天井だかにつかまる仕様も悪魔城伝説じゃないのか。夢ってのは、こうやって記憶を整理してたのだな…。

#3 [anime][neta] 顔芸も手描きの武器じゃなかろうか

思考メモ。

随分前に、とあるアニメーターさんが、「顔芸なんて価値はない」みたいなことを ―― 記憶が定かじゃないけど、たしかそういう感じの一文をつぶやいてた場面を見かけた…ことを某アニメを見ている最中に思い出してしまったり。

当時、その一文を読んで、「いや、それは違うのでは」と思ってしまった、そんな記憶が。

と言うのも…。

自分はCG大好き人間なので、常日頃アニメを眺めていても、「手描きの強みって何だろうなあ」みたいなことをついつい考えちゃうのだけど。そういう視点からすると、顔芸だって手描きならではの立派な武器の一つじゃないのと思えてくるからで。

だって、3DCGだの、After Effectsを駆使して実現したカットアウトアニメの類で、「賭ケグルイ」や「ボールルームへようこそ」は作れないもの…。どちらも顔芸だらけのアニメだけど、アレをポリピクに作れるか? 無理でしょ。例えばLive2Dで作れるか? 無理でしょ。ああいうのは手描きならではでしょ、と。

ところが、手描きの強みを活かしてるのに蔑まれてしまうという。なんだかな、と。

それに…。単なる止め絵の1カットだけを見せて、ソレを見た人が「怖い」「気味悪い」「楽しそう」「可愛い」等々を一瞬にして思ってしまう。それってスゴイことだよなと。たったの1カットでお客さんの気持ちに変化を与える。どう考えても武器になる。

娯楽映像の勘所とは何か。見てる人の気持ちを動かせるかどうか、だろうと。そして、お客さんの心を揺さぶる手管に貴賤は無いはず、と思うのだよなあ…。高度な技術を駆使したから偉いとか、ひたすらこだわったから偉いとか、そういうものじゃないよなと。だから「顔芸なんて」という言には「いやいや、アレはアレで」と思ってしまうという。

とは言うものの。「手描きの強さって他にも色々あるだろ」「顔芸だけに頼った作りはいかがなものか」という話であれば、「ああ、それはそうかも」とも思ってしまうのですが。アレかな。顔芸だけのアニメを何かに喩えるなら、辛さだけを売りにしたカレー専門店、甘さだけを売りにしたケーキ屋さん、みたいなものなのかな。偏り過ぎてもなんだかアレだなと。

でも、カレー専門店より定食屋のほうが偉いんだ、てのも違う気もする…。お客さんが満足するなら専門店でも定食屋でもどっちでもいいよなあ…。む。食べ物に喩えるのは違うな。だってアニメは娯楽商品、嗜好品だから。見なきゃ死んじゃう類のものではないし。

まあ、元々は、「俺、顔芸ってあまり好きじゃないんだよね」ぐらいの軽い話で「価値は〜」と呟いたのかな、とも想像するのですが。娯楽映像作品って嗜好品だから、そりゃ好き嫌いは絶対出てくるわけで、口に合わない人だって当然居るよな、とは思うのでした。

見る人の感情を揺さぶる何か。 :

「娯楽」に携わる側が、見る人の感情を揺さぶる何かを不当に低く評価するのは、ちょっと危ないんじゃないかなと思えてきたりもして。

例えばだけど…。
  • 昔、実写畑の人達からアニメは馬鹿にされてた。というか前からアニメ作ってた人達も「鉄腕アトム」を馬鹿にしてた。TV紙芝居とか揶揄されてたっけ。考えてみたら、紙芝居自体も馬鹿にされてたのだな…。
  • 昔、特撮映画や特撮ヒーロー番組は馬鹿にされてた。あんなの子供騙しだ、ジャリ番(ジャリ向け番組)だと揶揄されてた。
  • 昔、宮崎アニメは馬鹿にされてた。絵柄が古い、馬糞臭い、こんなの絶対ヒットしない、とか言われてた。
昔はアレもコレも馬鹿にされてた。でも、今は、それらに対してそういった評価を下してる人は(あんまり)居ない。

当時低評価を下した方々は、TVの前の子供さん達がそれらを見て「一喜一憂」してることを完全に見落としてた、だから見誤ったのではないかなあ、などと思うわけで。

客が「一喜一憂」する ―― 見る人の心を揺さぶるアレコレは、娯楽商品として通用するための強力な何かを絶対に持ってるはずで。故に、それらが後に正当(かどうかは分からんけど、まあそこそこ)な評価をされる可能性があったりするよなと。

で。顔芸だって、一目見ただけで視聴者の感情が揺さぶられてしまう手管なわけだから…。「顔芸に価値はない」と言っちゃうのは、「アニメなんて見る価値もない」的発言をしてた人達とかなり近いところに居るんじゃないかという不安が。それを提示することで見てる人の気持ちが変化するのか変化しないのか、そこって大事だよなと。そこが見えてないとマズイよなと。

アニメを馬鹿にしてた日本の実写畑が、その後どうなったかを思い返せば…。顔芸すら馬鹿にしてしまう作り手が、未来で何かを掴めるとは、ちょっと思えないというか…。技術面では高度かもしれないけどお客さんの気持ちがさっぱり動かない何かに辿り着きそうで…。いやまあ、そこらへんを考えるのは演出家と呼ばれる方々の仕事なのかもだけど。

てな感じのことを唐突に思い出して考えてしまったのでメモ。思考メモ。

顔芸はどうして有効なんだろう。 :

顔芸はどうして有効なんだろう、てなあたりが気になり始めたりもして。

アレかな。自分達人間は、日常生活においてコミュニケーションをとる相手の表情を見ながら、そこにある感情を類推して自身の言動を決めてるわけで。視聴者側が毎日毎日飽きもせずにやってることだから、情報伝達ルートとしては手っ取り早いのだ、てな感じなのかな。まあ、コストパフォーマンスは高いよな…。

アニメはデフォルメで成り立ってる表現手法だけど、顔芸も当然デフォルメによるところが大きいよなと。微妙な表情の差異を見せるのではなく、誇張して提示することで、小さい子供が見てもそのキャラがどんな感情を持ってるか瞬時に理解できる、てなところが強力、なのだろうか。しかしそれはそれで、なんでもかんでも咀嚼して与えてしまうのもどうなんだ、てな疑問も。微妙な表情の差異を提示して読み取ってもらう楽しませ方だってあるんじゃないか、とも思えてきたりもして。ただ、それをアニメで行うためには、実力を持った絵描きさんが必要で…。微妙な違いにこだわるための時間も必要になるし…。制作状況がソレを許すか許さないか、という問題が…。

表情の抽象化のバリエーションが膨大なあたりも魅力、だったりするのだろうか。そのあたりは漫画文化が普及した国ならでは、だろうけど。同じ感情でも、どんな抽象化をして表現するかで、作家や作品の独自性が出てくるというか…。各作品を眺めてると、時々、「えっ。ここでこの記号持ってくるか」と驚かされる時もあるし。全てが予想通りより、時々飛躍があると面白いわけで。ただ、あまり飛躍し過ぎると見る側がついてこれなくなって「理解不能」=「つまらない」と思ってしまう人達も出てくるけど。このあたり、ハイコンテクスト文化によって日本のアニメは成立してる、てな話になってくるのだろうか。

待てよ? 考えてみたら歌舞伎役者を描いた浮世絵もソレなんじゃないか。もしかして顔芸とは、浮世絵の復権? アニメも浮世絵も線画で絵を構築していくという共通点もあるわけで…。

「顔芸って何なんだろう」と考え始めると、眠れなくなりそう… (;´〜`)

#4 [anime][neta] アニメキャラの顔のしわ

思考メモ。考えが全然まとまってないので箇条書き。

2017/09/06(水) [n年前の日記]

#1 [raspberrypi] Raspberry Pi Zero Wが気になる

Raspberry Pi Zero W がなんだか気になる。どの程度の速度がでるのか、みたいなあたりが。

今現在手元にある Raspberry Pi3 は、CPUが4コア + 1.2GHzだけど、Zero W はCPUが1コア + 1.0GHz なので、確実に遅いはずだけど、話にならないぐらい遅いのか、なんとなくちょっと遅いのか、実際はどんな感じなんだろうと。

それと、Pi3 で使えるBluetoothキーボードについて調べてたら、値段的に Zero W 買えちゃうよな、てな気分もなってきて。一々ワイヤレスキーボードの子機を繋ぐのが面倒だから Bluetooth キーボードを、という考えだったけど、もう一台 Raspberry Piがあれば、ソイツに子機をずっと刺したままそこらへんに置いといて実験できるだろうし。

いっそ、Zero W を買ってしまうか…。

と思ってググり始めたけど、そもそも日本じゃ単品で販売してない模様。どの通販サイトを眺めても、ケースや変換コネクタをセットにした状態でしか売ってない。

それでもまだ、好みの構成で売ってるならなんとかなりそうだけど、個人的には今一つなセット構成で。ケースが気に入らなかったり、電源アダプタは不要なのに同梱されてたり、microSDHC は16GBぐらい欲しいのに8GBだったり。コレだ、てな感じのセットが存在しない。

結局アレコレ揃えていくと、全部で5,000円ぐらいになってしまうあたりも…。どうしたもんか。

2017/09/07(木) [n年前の日記]

#1 [nitijyou][web] 自分のWebサイトがYahooに消されてた

_Web廃墟を作るときに心がけるべき7箇条 - Qiita という記事を読んで懐かしさを感じつつ、ふと、自分のWebサイト(の入り口)って今はどんな表示になってるのだろうと気になったわけで。おそらく広告表示のフォーマットが以前と多少変わってたりして妙なレイアウトになってるでのは、みたいな。

てなわけで、サイトを開こうとしてみたのだけど。

_http://www.geocities.jp/mieki256jp/

ホームページ停止のお知らせ

利用規約違反により、現在サービスをご利用いただけなくなっています。
Yahoo!ジオシティーズのガイドラインに沿ったご利用をお願いいたします。

…消されてた。Yahoo に、というか Yahoo JAPAN GeoCities に消されてた。1997年頃に開設してからずっと置いてたサイトが、とうとう Yahoo に消されちゃった。トホホ。

にしても、一体何時頃から消されてたんだか…。気づかなかったよ…。

理由が思いつかない。 :

利用規約違反と言われても、自分、身に覚えは…。

いや、待て…。ずっと放置してたも同然だから何を置いてたのかすっかり忘れてる…。あからさまにマズイ何かは置いてないと思ったけど、それでも叩けば何かしらの埃が出てくる可能性は…否定できないかも…。当時はOKなノリでも今はNGな何かが残ってる可能性だって…。でも、そういうのは置いてなかったと思うけどなあ。置いてたのかなあ。

_Yahoo!ジオシティーズヘルプ - 利用規約違反でホームページが表示されない場合
利用規約違反でホームページが表示されない場合

違反と判断されるのは以下の項目に該当する場合です。

・ 商品またはサービスの宣伝、販売ならびに販売を主な目的とした紹介のためにYahoo!ジオシティーズ(無料版)を利用すること
・ 広告を掲載すること
・ パスワードを要求するなど、ホームページの閲覧に制限を設けること
・ 社会規範・公序良俗に反するものや、他人の権利を侵害し、または他人の迷惑となるようなものを、投稿、掲載、開示、提供または送信したりする行為

どれにも引っ掛からないよなあ…。と思ったけど、一番最後が万能過ぎて怪しいかも。「社会規範・公序良俗〜」って評価者の思惑次第でどうとでもなるソレだからなあ…。他人の迷惑となるようなものを投稿掲載、って…何だよ、その言い方。ふわっふわじゃん。その弁を使ったらなんでもかんでもしょっ引けるやん。「俺はコレを迷惑と感じたから」で通っちゃうじゃん。

例えば、Yahooジオシティーズの社員が嫌煙者だったりすると、自分は喫煙者だから、もう自分の存在自体が社会規範公序良俗に反する扱いになりそうだし、そりゃ削除の対象になりかねない。

あるいはYahooジオシティーズの社員がロッテンマイヤーさんみたいな人だったら、自分が大昔に描いた下着姿の美少女モドキのつもりのド下手糞な絵は公序良俗に反する醜悪コンテンツになるだろうし。

何が引っ掛かってるのかさっぱり分からん…。削除理由ぐらいメールで送って知らせてくれればいいのに…。

まさかコレって、社員がストレス解消代わりにその日の気分でテキトーにサイコロ振って消して回ってんじゃねえのか…。などと妙な想像をしてしまうのも、削除理由がハッキリしないからで。そこらへん毎回ハッキリさせておけば各人納得できるところもありそうなのに。昨今話題になってるTwitterのアカウント凍結云々もそうだけど、Webサービスのこのあたりって、えてして雑過ぎる。 *1

ひょっとしてYahoo BB関連の実験記録がムカついたのだろうか。 :

たしか昔、Yahoo BB の ADSL に乗り換えようとして、ところが全然速度が出なくて、そのドタバタぶりをメモして公開してた気がする…。

まさかと思うけど、ソコかな? ソフトバンクグループにとって都合の悪い情報を少しでも流してる連中はこの際粛清すべし! てなキャンペーンが社内で開かれた時期が、とか。

そこまで追い込まれてるのですか…ソフトバンクグループ…。今はもう光ファイバーが当たり前になったんだから、「いやーそんな時代もあったなー懐かしいなー」ぐらいに思ってほっといてくれてもいいのに…。ていうかあの記録を眺めたら「うわあ。ここまで苦労させちゃって、なんかゴメンねえ…」的気分にちょっとはなってみてもいいんだよ? なのに、この仕打ち。ソフトバンクグループは血も涙もないのか。鬼の集まりか。

ってソコが原因と決まったわけでもないのだけど。一体どこが気に入らなかったんだ…。

もしかしたら放置してたからかも。 :

_ガイドライン - Yahoo!ジオシティーズ を眺めてみたら、気になる項目が。

当社の削除権について

(中略)

(2)Yahoo!ジオシティーズ上のホームページの最終更新日から3か月以上経過した場合

ガイドライン - Yahoo!ジオシティーズ より


あ。コレじゃないのか。何を置いてたのか忘れるぐらいに放置してたし…。

そうか…。あのサービスは、3ヵ月更新しなかったら消されるシステムに変貌してたのか…。

って、だとしたらソレはアレだろ。マズイだろ。

更新頻度なんてどうでもいいことなのに。 :

サイトの更新頻度を削除条件にしているとしたら、失礼ながら、かなり頭が悪い企業だなと…。だって、「広告を表示する代わりに無料で場所を貸し出すよー」というサービスなわけだから、更新頻度なんて関係ないサービスなわけで。

サイトを更新しようがしまいが、ページ内の情報が古かろうが新しかろうが、有用な情報さえそこにあれば、Web検索で飛んでくる閲覧者は居るはずで。であればページの閲覧数は稼げるから広告も表示されて収益は出続けるはず。だから、広告表示でなんとかしてる企業やサービスなら、Webサイトの更新頻度なんてマジどうでもいい。そんなことより、「とにかく閲覧数が期待できる有用な情報をアップロードしてくれ」「広告が表示される状態だけは実現してくれ」という話になるはず、だよなと。

なのに、更新してるかしてないか、などという全く無意味な判断基準を評価システムに持ちこんでクソ真面目に削除して回ってるのだとしたら…。そりゃアホですわ。「広告表示をする代わりに無料で」という、自分達が考えたビジネスの仕組みすら理解してないんじゃないのか…。

こんな簡単なことすら気づかないぐらいに、もはや切羽詰まっているのだ、ということでもあるのかしら。仮にそうだとすれば、コレはもう先が無さそうかも…。アカウント復活を検討せずに移転先を考えないと、てな時期にとうとう来ちゃった、ということかもしれんのか…。infoseek isweb、Nifty @homepage、OCN Page ON…どんどん消えてくなあ…。

昨今、Yahooの色々なサービスがリストラされて、次はジオシティーズも対象に、てな空気になって、働いてる素振りだけでも見せねば、てな感じでやらなくていいことを急にやり始めちゃったのかもしれん。いや、分からんけど。でもたぶんそんな感じじゃないのか。きっと社内に妙な空気が漂ってるのだろう…。

これはなんでもそうなのだけど。評価システムがバグってると全てがおかしくなるというか。狂った評価に晒されてる兵達の行動はどんどんおかしくなって、組織にとってはマイナスな方向へと突進していくという…。 *2

などと他人様の会社を心配してても意味が無い。とりあえず、移転先を探そう…。それとも、この日記ページと同様に、自宅サーバに置いてしまおうか…。

それにしても、Webって、どうしてこうも記録を残し続けることに価値を見出さないのだろう…。検索システムだけがあっても意味無いんやで…。膨大な情報が温存されてるからこそ、検索システムも役に立つんやで…。コンテンツが無ければ広告だって表示できないんやで…。自分達で膨大なコンテンツを揃えるのは無理筋だから、場所だけ貸すよーその代わり皆でよってたかってコンテンツをアップロードしてー、てのがその手のソレじゃなかったのかい…。

とりあえずお礼は書いとかないと。 :

一眠りしてから読み返して、ちょっと酷いことしか書いてないような気がしてきた。場所を使わせてもらう代わりに、広告を表示させるためのコンテンツをこちらで用意する、という契約なわけだから、別に一方的に便宜を図ってもらっていた関係ではないはずだけど。それでも約20年も無料で使わせてもらってたことに対して、礼の一つも言わないのは人としていかがなものか。礼節を忘れてはいかんのではないか。

ということで。GeoCities、ありがとう。まさかここまで長いお付き合いをさせていただくことになるとは想像もしておりませんでした。感謝の念に堪えません。なにはともあれ、今までお疲れ様でした…。今後のご健闘をお祈り申し上げます。

まあ、コレは、戦力外通告、リストラの類でもあるのかも。「お前のアップロードしたコンテンツじゃもう客は呼べねえんだよ!」てな話と捉えることもできそうだなと。

もっとも、たぶん、アクセス数なんか一切見ないで削除して回ってる予感も。そのへんちゃんとチェックしてたら、「ページビューが落ち込んできたからもっと色々工夫してくれないとこのまま使い続けるのは厳しくなるよ」とか「ページビューが今後も期待できるけどこのコンテンツ内容はマズイよ炎上するよトラブルは勘弁してよ」的警告メールを日頃送ったり、みたいな感じになってくるはずで。しかし、Google Adsense みたいに、ページビューだのクリック数だの詳細情報を見れる仕組みが全然無かったし…。どうも、単なるノリで消されてる気配が…。

ホント、削除理由が分からないから、もやもやする…。そのあたり、よくないと思うんだけどなあ。

*1: ハッキリさせちゃうと悪意を持った人間が裏口を見つけやすくなる、とか想像して、あえてふわふわにしてる可能性もありそうだけど。その結果、フツーのユーザから悪い印象を持たれちゃう展開も、それもそれでどうなんだろうと。ハッキリさせるか、させないか、どっちがメリットが多いのか、一度ちゃんと考えてみたほうがいいような気もしますが。
*2: 社員にとっての顧客とは、その企業が提供する製品やサービスのユーザじゃなくて、単に社員の上司なわけで。上司が変な命令を出してきても、一応それに従わないと、上司という顧客が満足しないから報酬を貰えない、みたいな。その結果、会社が潰れたらアレではあるけど、まあ、潰れるまでは給料貰おう、てな話になるよな…。にしても、そこで会社を潰すことに精を出した上司の責任は問われないのだろうか、と思うのだけど、その上司も、その上に居る上司から変な命令を出されてそうなった可能性だってあり得るし。どこかの階層で、誰かが不適切な評価基準を持ち込んでいるんだよなあ…。

#2 [nitijyou] GeoCitiesに置いてたアレコレを自宅サーバに移した

とりあえず緊急措置(?)として、GeoCities に置いてたアレコレを自宅サーバ上にフォルダを作って置き直してみたり。

_http://blawat2015.no-ip.com/~mieki256/old_geocities_mieki256jp/

改めて中身を少し確認したけど、見れたからどうなるというものでもなかった…。戦力外通告は当然と言える…。けど、一応記録として残しとこう…。

入り口が無いとアレだな…。そっちも簡単に作っておこう…。

_http://blawat2015.no-ip.com/~mieki256/

ソースはちょっと修正した。 :

各htmlを Adobe Brackets で開いたら、「URIをシングルクォーテーショで囲んでんじゃねえよ。ダブルクォーテーションで囲むもんだろボケ」と怒られてしまったので、とりあえず警告が出ないレベルまで気づいた範囲でソースを修正。あと、リンクも少々修正。

Adobe Brackets、便利だな…。問題点をその場で教えてくれる。コレは便利だ…。と言っても、そもそも今時HTMLを直接打つのってどうなん、という気もするけど。

考えてみたら、昔のWebはなんだかスゴイな。日記の類すらHTMLタグを直接打って公開してたわけで。いやまあ、昔はアセンブラでプログラム書いてましたとか、Z80の機械語覚えちゃってましたとか、自分ではんだ付けしてマイコン作ってました、みたいな話かもしれんけど。

個人とWebとドヤァ。 :

自分、たしか最初の頃は、「HTMLなる規格が世の中にはあるのか」「ちょっと勉強してみようかな」てなノリでHTMLを書いてみて、「せっかく書いてみたのだから、自分のHDDの中にだけ置いとくのもなんかもったいない。試しに公開してみよう」てなノリでGeoCities のアカウントを取って置いてみた、てな感じだった気がする。まあ、中身というかHTMLソースは、HTML4 だの HTML5 だの CSS3 だの、その時々に合わせてその都度書き換えてしまったから、当時のHTMLソースがそのまま残ってるわけではないのだけど。

昔を思い返しているうちに、なんとなく気づいたけれど。結局のところ、Webにおける個人のアレコレって、「見せびらかしたい」というソレで増えてきたところもありそうな。

「こんなん書いてみたんやで(ドヤァ」
「ほうほう。だったら俺はこんなの書いちゃうぜ(ドヤァ」

そんな応酬で成り立ってるというか。

まあ、そういうアレコレを眺めていたギャラリーが、

「だったら俺はアイスの入った冷凍庫の中に入っちゃうぜ(ドヤァ」
「えっ…それはちょっと…」
「俺なんかソースの容器の先っぽを鼻の穴に突っ込んじゃうぜ(ドヤァ」
「ちょ…ソレお店でやっちゃダメだろ…」
「アイツの言動は許せない! 正義の鉄槌を下してやる!(ドヤァ」
「…気のせいかな。なんか最近息苦しくない?」

みたいなことが起き始めてアレだったりするのだろうけど。

せっかくだから、皆が笑顔になれる「ドヤァ」を目指したいものです…というか目指そうぜ(ドヤァ。

#3 [pc] Java Appletってどうなったんだろう

昔のコンテンツの表示確認をしていたら、Processing で作った Java Applet が動かないことに気が付いて。Firefox や Google Chrome は Javaプラグインを動かせないようになったから動かなくて当然だけど、IE11 でも動かないというのは…。それとも apache2 の設定が何か必要なのかな…。

_Javaアプレット - Wikipedia
2016年1月27日、オラクル社は2017年にリリース予定のJDK 9でJavaアプレットを非推奨にし、後のリリースでは廃止することを発表した[2]。

Javaアプレット - Wikipedia より


_Moving to a Plugin-Free Web | Oracle Java Platform Group, Product Management Blog
_大変なこともいろいろあったけれど楽しかったよ:さよならJavaアプレット。JDK 9からWebブラウザプラグイン機能を排除 - @IT

どのみち将来的には非推奨になってしまうのか…。であれば、無理して動かさなくてもいいか…。

#4 [raspberrypi] 結局 Raspberry Pi Zero W を注文してしまった

あちらこちらの通販サイトを眺めて、Raspberry Pi Zero W の購入について検討していたのだけれど。

どうも現時点では、あくまで日本国内のお店に注文するということなら、 _マルツオンライン さんでスターターキットを買うのが一番安く入手できそうな気がしてきたわけで。や、自分、別にマルツさんの回し者じゃないですけど…。

マルツオンラインさんは今現在、3,000円以上買うと送料無料なので、商品価格 + 消費税だけで買えそうだなと。たぶん。自分が何か勘違いや見落としをしていなければ、だけど。何か罠があるんじゃないか…。どうなんだ。ちょっと自信が無い。まあ、届いたら分かるだろう…。

Raspberry Pi製品の販売と言えば _KSY さんだけど。送料が756円と高いし、5,000円以上じゃないと送料無料にならないので、スターターキットを選ぶと送料込みで5,000円を超えてしまってなんだか複雑な気分に。また、本体以外のアレコレはどれも高目のお値段なので、色々細かく選んでいくと総額が結構跳ね上がる。もっとも、相性問題が起きない製品を選別して揃えてるらしいから、高くなるのは仕方ない気も。安心料、みたいなもので。それとは別に、KSYさんはAmazonでも商品を出してるようなので、もしそちらで買うと送料無料になるのであれば、4,700円台ぐらいで済みそうな。でも本当に送料無料になるのかな。送料かかっちゃうのかな。そのへんよく分からず。

_スイッチサイエンス さんは3,000円以上で送料無料になるけれど、スターターキットにケースは含まれてなくて。好みのケースを選んで購入できるメリットはあるけれど、ケース代も合わせると若干総額が…と言っても、それでも4,700円台だけど。

_せんごくネット(千石電商) さんは送料432円、10,000円以上で送料無料なので、スターターキットだけでも4,700円台に。

てな感じで、どのお店でも Zero W のスターターキットを購入する場合は、税込み・送料込み・総額で4,700円台になるかどうか、てなところに境界線がありそうな気がしてきたり。

構成が不満。 :

個人的には、スターターキットの構成が今一つで…。
  • 8GB じゃなくて 16GB の microSDHC が欲しい。
  • ACアダプタは Pi3用のがあるから要らない。モバイルバッテリーも持ってるし。
  • 公式ケースよりAdafruitケースのほうが microSDHC を抜き差しできそうなあたりヨサゲに思える。ただ、何か罠がありそうな気もするけど…。
  • GPIO の 2x20ピンヘッダは欲しい。余裕があれば、はんだ付けをしてみたい。
  • miniHDMI - HDMI変換コネクタは…100円ショップで売ってるヤツではダメなん? ケースの厚みで接触不良になるのかな。かもしれん。
  • microUSB - USB変換ケーブルは…コレも100円ショップで売ってないのかな? これは売ってないか。
てな感じで。

しかし、条件を満たす組み合わせで探していくと、一つのお店では全部揃わないから、複数のお店で買うことになって、すると送料が増えていって5,000円を軽く超えちゃう…。

イギリスの通販サイト、 _Pimoroni で購入することも検討したけど。そこだけでは全部揃わないから、やっぱり総額で5,000円を超える…。かつ、海外通販はやっぱりちょっと怖いなあ、てなところも…。本体を単独で買えそうなあたりはとても魅力的なのだけど。

Zero W ではなく、 Raspberry Pi A+ を選べば、GPIOのはんだ付けもしなくて済むし、変換アダプタの類も要らないし、カメラモジュールとケーブルは既存のものが使えるし等のメリットがあるので悩んだのだけど。送料込みで電卓を叩くと、Zero W より高くなる…。Zero W よりCPUは遅いのに…。考えてみたらLAN接続するための何かも必要になるのか。ますます総額が…。

ということで、泣く泣く(?)スターターキットを選択という…。まあ、少し前までは、日本国内でZero系の購入は絶望的だったので、随分と状況が改善されたなあ、以前と比べたら買えるだけでもありがたい、とも思うのですけれど。でも、本体+好みのパーツで揃えたかったなあ…。

2017/09/08(金) [n年前の日記]

#1 [raspberrypi] Raspberry Pi Zero W が届いた

マルツオンラインさんに注文してた Raspberry Pi Zero W スターターキットが届いた。

昨日注文したはずなのに、もう届いたよ…。早いなあ…。迅速な対応ありがとうございます。素晴らしい。

ちっちゃくなくないよ! :

届いた現物を見てビックリ。小さい。マジ小さい。小さい小さいとは聞いてたけど、まさかここまで小さいとは。

いやまあ、頑張ればFRISKのケースに入るかも、ぐらいなサイズと聞いてたから、そりゃ小さいわけだけど。コレで Debian Linux (raspbian) が動いちゃうのか…。スゲエ。

中身を確認。 :

中身を確認してみたけど、ちゃんと全部入ってた。と思う。
  • 本体
  • 公式ケース + カメラ変換ケーブル
  • ACアダプタ + USB - microUSBケーブル
  • miniHDMI - HDMi変換コネクタ
  • microUSB - USB変換ケーブル
  • GPIO用2x20ピンヘッダ
  • 8GB microSDHC
だったはず。たぶん。

microSDHC は Team製だった。また、ACアダプタの横には「KSY」の文字が。…どこの店もKSYさんから仕入れて売ってるのだろうか。

NOOBSを入れ替え。 :

届いた microSDHC には、NOOBS 2.4.2 が入ってた。 _Download NOOBS for Raspberry Pi で公開されてるのは 2.4.3 なので、入れ替えることに。 _SDメモリカードフォーマッタ 5.0 を使ってフォーマットしてから、NOOBS_v2_4_3.zip を解凍して、中身を microSDHC にコピー。

ちなみに、microSDカードリーダは、 _BUFFALO BSCRMSDCWH を使用、だったと思う。たぶん。

後でググってみたら、NOOBS 2.4.2 は raspbian jessie が入ってるから日本語フォント等も表示されるけど、NOOBS 2.4.3 は raspbian stretch なので日本語フォント等が入ってないのだな。そりゃ 2.4.2 のほうを入れとくわな…。

ケースに入れる。 :

本体を公式ケースに入れる前に microSDHC を刺しておく。ケースに入れちゃってからでは microSDHC の抜き差しができないので。

microSDHC は、印刷面が上になるようにして挿入。

公式ケースに入れる際は、GPIO側をケースに引っ掛けてから全体を、てな感じで入れる。

蓋を閉める前に、変換コネクタの類を刺してみて、ちゃんと刺さってそうか見た目でも確認。OKっぽいなら蓋を閉める。

OSをインストール。 :

HDMIでディスプレイと接続して、USBキーボードを刺して、ACアダプタを繋いで電源投入。

Raspberry Piシリーズおなじみの、グラデーションの四角が表示されて、NOOBSの起動画面が出てきた。日本語表示に切り替えて、raspbian をインストール。

Wi-Fi(無線LAN)で接続したいけど、MACアドレスが分からん…。ウチのルータはMACアドレスを登録しておかないと接続できないわけで…。raspbian のインストール後に確認するしかないかな…。

蓋を閉めると、結構熱くなるな…。空気が入るところが全くないもんなあ…。開けとくか…。

microSDにアクセスする際はLEDが光るようだけど、ケースの蓋を閉めてしまうとLEDが見えなくなってしまう。やっぱり透明な蓋のほうがいいよなあ…。 *1 子供さんには、透明で中が見えるほうがウケると思うんですけどねえ。 _クリスタルボーイ とか _ミクロマン とか _変身サイボーグ とか好きじゃん。でもないか。

それはともかく、インストールは無事終了。raspbian が起動…するんだけど、rc.local.service とやらのところで随分と待たされる。が、一応デスクトップ画面が出てきた。

日本語フォントが入ってなかった。豆腐(四角い何か)だらけ。

MACアドレスを調べる。 :

ターミナルを起動して以下を打つ。
LANG=C
ifconfig
wlan0 のところにMACアドレスが出てるはず。

ルータに登録した。これで、LANやインターネットに接続できるようになった。

パッケージを更新。 :

ネット接続が可能になったので、パッケージを更新。かつ、日本語フォントを入れて、再起動。
LANG=C
sudo apt update
sudo apt upgrade
sudo apt install fonts-ipafont
sudo reboot

カーネル(?)を更新。
sudo rpi-update

他にも色々設定。 :

スタートボタン → 設定 → Raspberry Piの設定、で色々変更。
  • システム、で、パスワード変更、ホスト名変更、解像度を設定、オーバースキャンを無効に。
  • インターフェイス、で、SSHとVNCを有効に。
  • ローカライゼーション、で、ロケールの設定を確認、タイムゾーンを Asia/Tokyo に、キーボードの設定を、日本語(OADG 109A) にしたり、無線LANの国設定をJP Japan にしたり。

ユーザも追加。以下を参考に作業。

_RaspberryPiをRaspbianで使う場合の初期設定メモ(ユーザ追加) - Qiita
_raspberrypi3に独自のユーザを設定する | Hornet|静岡拠点のWeb、ホームページ制作

日本語入力を可能にする。

_日本語入力メソッドは、fcitx-mozcで決まり! - FABSHOP.JP -デジタルでものづくり! ファブショップ !

sudo apt install fcitx-mozc

IPv6を無効に。かつ、固定IPアドレスに。

_Raspberry Pi 2で遊ぶ(Ver.2.0):ipv6の無効化 | cozy attic
_Raspberry Pi 3 (Raspbian Jessie)の無線LANに固定IPアドレスを設定する - Qiita

動作速度が遅い。 :

Raspberry Pi3 との速度差が気になってたけど。予想より遅い…。どうもファイルアクセスがとにかく遅いというか。体感で3倍ぐらい遅い。

デスクトップ画面が出てくるまで1分15秒〜1分40秒かかるあたりも気になる。

これはアレかな。microSDHC が遅いのかな。それともストレージへのアクセスコントローラが省電力や小型化を優先したことで遅くなった、とかなのかな。

OSをインストールする前に、microSDHC のベンチマークを取っておくべきだったな…。今からやるか…。でも面倒臭いな…。

microSDHCの速度を測ってみた。 :

とりあえず、簡易ではあるけど測ってみた。
$ sudo apt install hdparm
$ sudo hdparm -t /dev/mmcblk0

/dev/mmcblk0:
 Timing buffered disk reads:  32 MB in  3.15 seconds =  10.17 MB/sec

Team製 microSDHC のパッケージには、class10マークだの、Read 20MB/s だの書いてあるけど…。実際は半分の速度しか出てないな…。

Raspberry Piシリーズはどれだけ速い microSD を使っても最高で20MB/s前後しか出ないという話があるけれど。

_microSD Card Benchmarks | Raspberry Pi Dramble
_RPi SD cards - eLinux.org
Please bear in mind that the maximum throughput of the card reader of the Raspberry Pi is 25 MB/s and that most likely read and write speed won't exceed 22 MB/s.

RPi SD cards - eLinux.org より

手元のソレは、最高速度の半分、ということか…。

コレ、パッケージとは違う製品が入ってた、てなオチだったりしないのかな。それとも、ロットによってばらつきが、とかなのかな。microSDは、よく分からん…。

*1: もしくは、LEDが見えそうなあたりに穴を開けておくとか。

#2 [web][neta] 個人webサイトって何だろう

思考メモ。

Yahooさんにサイトを消されてしまって、ちょっと困ってしまったわけだけど。考えてみたら、今時個人Webサイトを公開ってのもスタイルとしてなんかアレなんだよなーと思えてきたり。

昔は、個人がWebで何かを公開するとなったら、HTMLを書いてWebサーバにアップロードするしか手段が無かったわけだけど。

「考えてみたら俺達って文章ばかり公開してるよね」「文章を公開するたびに毎回HTMLを書くのって面倒臭いよね」てなことに気づいた人達が、ほぼ文章だけを書けば公開できてしまうWeb日記システムを作ってくれて。それと同時期に海外でもブログシステムが作られて。舶来品をありがたがる日本人は、一気にブログに飛びついて、Web日記代わりに使い始めて。そして、個人が文章を書いて公開するならブログでいいんじゃね、htmlを書くより面倒臭くないし、という時期が存在して。

それはつまり、「何でも公開できるよ。ただしHTMLを覚えろや」的システムで済ませるのではなく、「何を公開したいのか」に着目して、その公開したい何かに合わせて最適化したシステムを作る、という流れがそこにあったと言えるわけで。

同様に、その流れで色々出てきて…。「○○をしたい」という需要に最適化されて、○○が作られる、ということが当たり前になっていった。 まあ、最適化が甘いサービスも混ざってる気もするけど…。それはさておき。

つまり、個人が「公開したい」と思ったそれぞれについては、分類され、細分化され、最適化されて、その需要に特化した専門サービスが登場しているし、多くの人はソレを使って欲求を満たしてる、という状況があって。

となると…。「個人サイトを設置できますよ」と謳う、無料Webスペースサービス・ホームページサービスの類は、一体何を公開できるのでしょうか、という話になってくるなと。

かつて公開していたアレやソレは、商売人が全てバラバラに切り刻んで、専門サービスとして提供してしまったわけだから…。文章を公開したいならブログでいいし、自作画像を公開したいなら pixiv でいいし、時々愚痴りたいなら Twitter でいいし、自作ソフトウェアを公開したいなら GitHub でいい。

すると、何が残ってるのか。何を公開するなら、「やっぱりホームページサービスがないとね…」という話になってくるのか。

これがまだ、CGIが動くから自分好みのWeb関連システムを設置して使えます、てな話なら使い道もあるだろうけど。巷の無料ホームページサービスって、CGIなんか一切動かなくて、HTMLしか置けないわけで。その条件下で一体何が公開できるのか、という気分にも…。

HTML5 の実験ページぐらいしか置けないよな。ってマニアックだな…。JavaScript の実験成果公開は jsdo.it で出来ちゃうし…。

HTMLじゃないと置けないものって何ですか? 何がありますか?

そのあたりが見えてない人ばかりだから、次々にその手のサービスが消滅してるのだろうけど…。

アーカイブとしての役割。 :

妹とこのあたりを少し話してたのだけど。妹から、「ホームページサービスは、アーカイブとしての役割ぐらいしか残ってないんじゃないか」という意見が出て、なるほど、と。

インターネット黎明期に作られたコンテンツは HTML ばかりなのだから、それらをアーカイブとして公開できる場所としては、これはもうホームページサービスしかないよなと。だって、TwitterにHTMLをアップロードなんてできないわけだし。

が、しかし、それら無料ホームページサービスは、数年前〜数十年前のコンテンツを「更新してないから」という理由で削除しちゃったりするわけで…。ダメじゃん。自分達しかできないことを、自分達から「それはやっちゃダメ」と言い出してる。そこは本来逆だよなあ。「貴方の黒歴史を公開できるのは我々だけ!」「他のサービスじゃ無理!」とか言い出すのが正しい、って黒歴史を公開したい奇特な人なんて居るのかよっていう。ていうかその頃HTMLを書いてた人達の数なんて今と比べたらたかが知れてるから、ユーザ数がたいして見込めないっていう…。

「インターネットの神保町」になるのは無理かな無理だろうな。 :

東京神田神保町には古本屋さんが軒を連ね、昔の珍しい情報を探しにきたお客さんの姿がチラホラ見える、てな話があるけれど。Web上でもそういうソレを作れないか。ホームページスペースが目指すのはそこじゃないか。

無理か。古本屋さんってどういう形で商売になってるのかちょっと分からんけど…収集したものを「売ってる」から商売になってるわけで。無料で、誰でも見れる状態で成立してるわけではないのだよな。

誰でも見れる状態で、となると、図書館や博物館のような存在になりそうだけど、それはもう商売じゃないし。

とは言え、歴史を残す、記録を残すという需要に最適化すれば、それはそれで専門サービスとして成立する…可能性はあるのかな。どうかな。ソースコード管理ツールの Subverson や git は履歴を残せるけど、公開されたHTMLだって履歴を残してみてもいいんやで、みたいな。

「そんなの既に Internet Archiveがあるじゃん」という気にもなったけど、Internet Archive は、HTMLの形で公開されたものを収集・再閲覧することは可能だけど、Internet Archive で自分が書いたHTMLをアップロードして公開できるわけじゃないから、ちょっと違う気がする。一旦どこかのWebサーバで公開しないと Internet Archive に取り込まれないという…。

あ。そうか。ホームページサービスを、マイInternet Archiveに変化させちゃう、という道もあるか…。他人様のサイトの魚拓を自分専用で残すサービスというか。これで万が一リンク先が消えても(自分だけは)閲覧できる、みたいな。って無料ホームページサービスは「倉庫として使ったら消すぞ」と言ってるわけだからソレもダメなんだけど。

リソースを共有できないのかな。 :

どうも不思議なんだけど、ホームページスペースだの、ブログだの、メールだの、画像アップロードだの、その手のサービスで使うファイルの保存場所・リソースを全部同じところにするのは難しいのかな…。いや、Googleはソレをやってる気配があるけど、日本のWeb関連企業ってソレをやらないよなと。

「無料でブログが使えます。容量は10GB!」とか言いながら、系列グループが提供する無料ホームページスペースは数十MBのままだったりして、なんでコレ一緒にせんのやろと。一緒にすれば、「ホームページサービスは流行らないのでやめます…」「なんだかブログもオワコンっぽいのでやめます…」なんて展開にはならんよなと。「ブログだろうと共有フォルダだろうと何に使ってもいいですよ。ただし全部で10GBまで!」のほうがいいよなと。まあ、Google はソレをやってるわけだけど、Google は Googleで、いきなりHTMLを置いたりできないし…。

そもそもサービスを提供してる会社が違うとか、部署が違うとかで、無理なんだろうな。ほとんどは、他所のサービスを買収して、てな展開だし…。技術的にも、それまで運用してたアレコレを統合するなんて結構難しい、てなところもあるのかな。分からんけど。

そういや、昔のシャープなんて、3つの部署からそれぞれ別系列の8bit PCを出してたっけ。 *1 日本って、そういうところがあるよなあ。太平洋戦争中の、陸軍と海軍の乖離・敵対状態とか…。と思ったけど日本に限らないか。Microsoftも部署同士の足の引っ張り合い、潰し合い、社内政治が酷いらしいし。

ある意味、まだ全然余裕があるんだろうな。共闘して事態を乗り越えるぞ、おー、みたいなことをしなくてもなんとかなるさ、大丈夫大丈夫、てな見込みがあるから、それぞれが、てんでバラバラなことをしてるのだろう…。

まあ、そんなことをぼんやり考えました。只の思考メモです。

*1: さすがにある時期「これはアホだ」とようやく気が付いて、同じ部署にまとめたらしいけど…。

2017/09/09() [n年前の日記]

#1 [raspberrypi] Raspberry Pi Zero WのmicroSDHCを交換してみたり

Raspberry Pi Zero W の、microSDHC へのアクセス速度が遅いあたりが気になるわけで。

手元に、昔購入した microSDHC、Transcend TS16GUSDC4 16GB Class4 があったので、交換してみようかなと。

Transcend TS16GUSDC4 16GB Class4 のベンチマークは、 _2016/06/25の日記 にメモしてあった。

Team製 8GB の microSDHC のベンチマークもメモ。 :

せっかくだから、Raspberry Pi Zero W スターターキットについてきた Team製 microSDHC 8GB Class10 (KSY008G0MC28PI) のベンチマークもとってみたり。SDカードフォーマッタでクイックフォーマットをした直後の状態で測定。

-----------------------------------------------------------------------
CrystalDiskMark 5.1.2 x64 (C) 2007-2016 hiyohiyo
                           Crystal Dew World : http://crystalmark.info/
-----------------------------------------------------------------------
* MB/s = 1,000,000 bytes/s [SATA/600 = 600,000,000 bytes/s]
* KB = 1000 bytes, KiB = 1024 bytes

   Sequential Read (Q= 32,T= 1) :    19.793 MB/s
  Sequential Write (Q= 32,T= 1) :    14.131 MB/s
  Random Read 4KiB (Q= 32,T= 1) :     2.117 MB/s [   516.8 IOPS]
 Random Write 4KiB (Q= 32,T= 1) :     0.414 MB/s [   101.1 IOPS]
         Sequential Read (T= 1) :    19.714 MB/s
        Sequential Write (T= 1) :    12.792 MB/s
   Random Read 4KiB (Q= 1,T= 1) :     2.052 MB/s [   501.0 IOPS]
  Random Write 4KiB (Q= 1,T= 1) :     0.284 MB/s [    69.3 IOPS]

  Test : 100 MiB [E: 0.0% (0.1/7536.0 MiB)] (x3)  [Interval=5 sec]
  Date : 2017/09/09 8:02:00
    OS : Windows 10 Professional [10.0 Build 15063] (x64)
    microSDHC Team 8GB CLASS10 (KSY008G0MC28PI) + BUFFALO BSCRMSDCBK(USB2.0)

microsdhc_team8gb_class10_20170909.png

Transcend製 microSDHC と、そんなに変わらんなあ…。あっちは Class4 で、こっちは Class10 なのだけど…。

いや待て。結構違うか。
  • Team製は、Transcend製に比べて、シーケンシャルライト(書き込み)速度が倍。
  • その代わり、ランダムライトは、1/2〜1/3。
  • ランダムリードも微妙に遅い。
シーケンシャルライトが速いあたりが、Class10 らしさ、なのだろうか。でも、リード(読み込み)は、さほど変わらんよな…。それに Raspberry Pi は、どうせ20MB/s前後で頭打ちになるのだし…。

ちなみに、Raspberry Pi3 購入時に一緒に買った Team製 microSDHC 16GB は、 _2016/07/13の日記 にベンチマークがメモしてあった。16GBのほうが微妙に速いのだな…。

起動時間は変わらなかった。 :

Transcend製も、起動時間は Team製とさほど変わらなかった。デスクトップ画面が出てくるまで1分20秒ほど。

hdparmの結果は違った。 :

hdparm も同じかなと思ったら、これは違った。
$ sudo hdparm -t /dev/mmcblk0

/dev/mmcblk0:
 Timing buffered disk reads:  62 MB in  3.09 seconds =  20.05 MB/sec
Transcend製のソレは、20MBぐらい出てる。Team製は10MBぐらいだったのに…。なんでやろ。まさか、Team製を使ってた時は、接触不良だったとか…? それとも、アクセスしてる領域によっては遅いとか。microSDHC については詳しくないから分からん…。

とりあえず、Transcend製を使うことにするか…。

#2 [raspberrypi] Raspberry Pi Zero W でサンプル等を動かしたり

Raspberry Pi は、/opt/vc/src/hello_pi/ 以下に、OpenGL ES を使ったサンプルソース等が入ってるので試しに動かしてみたり。

cd /opt/vc/src/hello_pi
sh rebuild.sh
色々コンパイルされる。ということは、この手のビルドに必要なプログラム群は既にインストールされてるらしい。

各フォルダに入ってる hello_*.bin が実行ファイル。
cd hello_triangle
./hello_triangle.bin
キューブが表示された。

描画速度は Raspberry Pi3 とほとんど違いが見られなかった。GPUに頑張ってもらう分には、Pi3 も Zero W も速度的には同じようなものらしい。

ただ、hello_teapot を実行したらテクスチャが反映されず。hello_teapot は、動画をテクスチャにして描画するサンプルなのだけど。

Zero W はRAMが512MBしかないから、デフォルトではGPUに64MBしかメモリが割り当てられてない。故に、メモリ不足で動画をテクスチャにできない。128MBまで増やせば、テクスチャも描画されるようになる。

GPUへのメモリ割り当て量は、以下で変更。

pi3dも動かしてみた。 :

Python から OpenGL ES を扱える、 _pi3d もインストールして動作確認してみたり。

pi3d の動作には Pillow と numpy も必要らしい。raspbian stretch では既にインストール済みだった。別途インストールしたい場合は以下。
sudo aptitude install python-pillow python3-pillow
sudo aptitude install python-numpy python3-numpy

pi3d は pip でインストール。
sudo -H pip2 install pi3d
sudo -H pip3 install pi3d
pip2 が、Python 2.7用のpip。pip3 が、Python3.x用のpip。

サンプルスクリプト群の _pi3d_demos を git で持ってくる。
git clone https://github.com/pi3d/pi3d_demos.git

フォルダに入って何か実行してみる。
cd pi3d_demos
python Earth.py
画面が出てくるまで、何故か結構かなり時間がかかったけど、それでも一応、地球と月と謎の球体がくるくると回ってくれた。

pi3d も、GPUに頑張ってもらう系のスクリプトなら Pi3 と似たような速度で動いてくれる模様。ただ、CPUに頑張ってもらう系のスクリプトは、ちょっとフレームレートが低いような…気がする。

それはともかく、pip list と打つとインストール済みのPythonモジュールが一覧表示されるけど、25秒ほど、無反応で待たされる…。ストレージへのアクセスが遅いのか、CPUが遅いのか、メモリが少ないのか…。

2017/09/10() [n年前の日記]

#1 [raspberrypi] Raspberry Pi Zero W のケースに穴を開けてみた

Raspberrypi Pi Zero W を公式ケースの中に入れて使っているのだけど。蓋を閉めてしまうと、電源LED? ストレージアクセスLED? が見えなくなってしまうのが、なんかアレだよなと。

穴でも開けたらLEDが見えるだろうかと思えてきたので、試しにピンバイスで開けてみたり。

こんな感じに。

zerow_case_led_and_hole.jpg

暗くて写真にノイズ乗りまくりだからちと分かりづらいけど、LEDが光ってることぐらいは分かるかなと。

埃が入りそうな気もするけど、その時は裏面から透明プラバンでもくっつければいいだろうと。薄い透明プラバンならダイソーあたりで売ってるし。…透明なプラ棒でも差し込めれば、プラ棒の中でLEDの光が反射して、表面まで奇麗に光が出てきそうな気もする。そういうケースをどこかで販売したりしないものだろうか。値段が高くなるからさほど売れないかもしれんけど。

温度が不安。 :

蓋を閉めると内部の温度が上がり過ぎないかと不安だったけど。以下のコマンドで温度を取得したところ、アイドル状態なら蓋無しの場合より数度上昇するぐらいで済んでる感じ。
$ vcgencmd measure_temp

temp=45.5'C

_[Raspbian] Raspberry Pi 3の動作状況とハードウェア設定を取得する(vcgencmd) - Life with IT
_RaspberryPi(Raspbian)のCPUの温度をcatを使わないで取得してみた - Qiita

ただ、CPUやGPUを回し始めると、どの程度温度が上昇するのかちょっと予想できないなと。給気口?っぽいスリットでもあったほうがいいのだろうけど…。いや、その場合はヒートシンクもつけたほうがいいのかな。でも、サイズが分からんな…。ググってみても情報が無いし。測ってみるしかないのかな…。

まあ、熱が怖ければ、蓋を開ければいいか…。しばらくはそんなノリで…。

#2 [raspberrypi] Raspberry Pi Zero WにGPIOのピンヘッダをはんだ付けした

Zero W は _GPIO なる、比較的自由な使い方ができる入出力機能を ―― 汎用入出力を持ってるのだけど。ピンがついてないので、使うのがちょっと面倒で。なんだかもったいないので、今のうちにピンヘッダをはんだ付けしてしまおうかと。

てなわけで、はんだ付けをしてる最中に傾かないように下準備。2x20 ピンヘッダを定規で測ったら…9mmぐらいの高さを確保すればいいのかなと。

zerow_gpio_01.jpg

青いのは、たまたまそのへんにあった耐震シート。重ねて9mm程度になるようにした。ただ、それだと高すぎたので、ピンヘッダ側に紙を挟んで調整。

対角線上のピンを ―― 左上のピンと、右下のピンを最初にはんだ付けして、全体が軽く固定された状態にしてから、他のピンを少しずつはんだ付け。

一応、はんだ付けは終了。

zerow_gpio_02.jpg

汚い仕上がり…。下手糞だなあ…。不器用な自分は Zero W じゃなくて A+ を選ぶべきだったろうか…。

タクトスイッチをつけて動作確認。

zerow_gpio_03.jpg

pigpio のサービスを有効にしたり等、やったことは Pi3 と同じ。一応動いてくれた。ちゃんと通電してるっぽい。

#3 [anime] ウルトラマンジード、3話を視聴

福島でもウルトラマンジードの放映がいつの間にか始まっていたようで、録画できた3話のみを視聴。

1話と2話は、東芝製HDDレコーダが番組の存在に気づいてくれなかったようで、録画されてなかった…。残念…。特撮ヒーロー番組はえてして1〜2話がスゴイ映像になってるのに、よりにもよってそこらへんを録画してないとか…。もうガッカリ…。 *1

さておき。メイン監督が坂本監督と今頃知ってワクワク。坂本監督は元々アクション監督出身で、パワーレンジャー、戦隊シリーズ、平成ライダーでも大活躍した方だから、アクションに関しては堪能できそうだなと。映画版ウルトラマンも担当してたけど、そこでもゴイスなアクションをガンガン見せてたし…。アレは凄かった…。「今のウルトラマンってこんなことできるのかよ」と…。

3話では、セブンとレオを合成したメカメカウルトラマンが登場していたけど。ワイヤーアクションだかトランポリンだかでクルクル回りながら、ブレーキ表現としてのバーニア噴射を合成してるカットがあってシビレてしまった。戦隊シリーズでもこういうソレを目にした記憶があるけど…アレは…カッコイイ。自分、バイファムとかレイズナーとかクラッシャージョウとかのバーニア噴射で軌道を変更するソレが好きだったので…。バーニア噴射は男(の子)の浪漫。と思うのだけど。自分だけかな。

足にアイスラッガーを装着してキックで決め技、てな画にもシビレタ。ライダー555を思い出した。手だの足だのにアイテムを装着して決め技発動は男(の子)の浪漫。と思うのだけど。自分だけかな。

何にせよ、TVの前の子供さんが口をポカーンと開けたまま「カッケエ…」と漏らす、そんなウルトラマンになってくれたらいいよなあ、と。

メカウルトラマンが登場したということは、バイオウルトラマンも登場するのだろうか…。もう全部あいつ一人でいいんじゃないかな。じゃなかった。ここはジードにまかせよう。みたいな。

インタビュー記事をググってみたら、ウルトラマンレオにおける、レオとセブンの関係を、ジードとゼロで再現できたら、てな思惑もあるようで。師匠と弟子のウルトラマン…なるほど、ソレはイイ…。新人ウルトラマンから師匠呼ばわりされたら、ゼロはどんな態度・反応を見せるのだろう、などとついつい妄想してしまう…。と思ったけど、レオもセブンを師匠と呼んでたわけではなかったような。どうだったっけ。子供の頃に見てそれっきりだから、お互いをどう呼んでたか、忘れてしまった…。

などと期待してしまったものの。福島は2ヶ月遅れで放送してるから、東京のほうでは既に1クールぐらい流れてるはず。ということは、もう番組自体は終わってたりするのかもしれん。と思ったけど調べてみたら10話目あたりを放送してるのか。1クール作品だとしたら、そろそろ最終回が近いのかな。
*1: おそらく、番組タイトルが以前のソレと変わっちゃったから、だろうけど。番組表上では見つからなくても、予約時間になったらとりあえず念のために録画しとく、てな動作をしてくれればいいのに。いや、でも、変だな。普段はそういう風に動くのだけどなあ…。ブラタモリが放送されない週は、野球中継だの特番だのを録画してたりもするから、「番組が見つからないけど、とりあえず録画」的動作をする時もあるんだけど。まあ、東芝製だから奇妙な動作は仕方ない。冒頭の数十秒を録画できてない、なんて時もちょくちょくあるし。

#4 [anime][neta] 円谷プロって今はどうなってるんだろう

ふとなんとなく気になって円谷プロについてググってみたら、随分前からパチンコ会社の子会社になってたそうで。知らなかった…。以前はバンダイナムコグループが資本参加してた、という話も見かけたけど…。

ビルドアップが円谷プロと合併してたと今頃知って驚いた。道理でCG関係も強くなったわけで…。いや、合併した頃のビルドアップがどうなってたかは分からんので、あまり関係ないのかもしれないけど。

ビルドアップと言えば、ググってるうちに「フィギュアニメ」なるものを知ったのだけど。ビルドアップが関わったタイトルをググってみても情報が全然出てこなくて。どうやら製作が某K社、ということだから…。法務部様が頑張って各種情報をWeb上から削除させていったら商品自体がまるで存在していないも同然の状態に、なのかなと邪推しちゃったけど実際のところはどうなんだろう。 *1

中国企業にアドバイスしてあげたい。 :

少し前に、中国でウルトラマンの新作が、という話が出て、円谷プロが「聞いてねえよ!」「訴えてやる!」と反応してた話があるけれど。

中国企業にアドバイスしてやりたいなと…。円谷プロ、買っちゃえよ…。買収しちゃえよ…。買収すれば、中国国内向けどころか、アジア向け、世界向けの新作ウルトラマンを作り放題やで…。数十年後に、「ウルトラマンは日本生まれだが、育ての親は中国だ」と言っちゃえよ…。

昔、日本企業がアメリカの映画会社を買収しちゃったりして、アメリカ人から「ジャップ許すまじ」的にかなり恨まれた時期があったけど。今の中国なら似たようなことができるだろと。買っちゃえ買っちゃえ。爆買いしちゃえ。

で、中国国内に、昔のILMもビックリな巨大特撮スタジオを作ったりして、今頃になって何故か特撮の復権をですね…。大昔、日本の東映動画が「我々は東洋のディズニーを目指す」とぶち上げてたけど、今度は中国が「東洋の○○を目指す」などとぶち上げてみたらどうかと。庵野監督に「我が国のスタジオを使ってマイティジャック作りませんか? ただし船体色は真っ赤でお願いします」と声かけちゃうとか。ダメか。

いやまあ、怪獣と戦ってるうちに万里の長城をうっかり蹴り飛ばしちゃうウルトラマンの図とか、それはそれで見てみたいかもと思っただけなんですけど。日本のウルトラマンがソレをやると大問題だけど、中国のウルトラマンがやる分には意外と許されそうだなと…。ダメか。当局とやらに怒られるか。社長や監督が投獄されちゃうかな。中国の観客にウケそうだけどなあ…。「アイヤー…ウルトラマン…アイヤー…」みたいな。

中国のあらゆる観光名所を阿鼻叫喚な戦場に変えていくウルトラマン…。面白そうだけどなあ。とは言ったものの、自分、恥ずかしながら、中国の名所ってほとんど知らないんですよね…。「サザエでございまーす」なノリで、中国版ウルトラマンがOPで「シュワッ」「ヘアッ」「ンッガッググ」と中国の観光名所を紹介してくれないものかってソレどんな番組やねん。

観光名所を巡るだけの特撮ヒーローってどうだろう。 :

もはやウルトラマンと関係ないけど、観光名所を巡って紹介するだけの特撮ヒーローってどうだろう。いや、ソレってもはや特撮もヒーローも関係なくて只のヒーローコスプレしてる人になるんだろうけど。

昔、美人のお姉さんが温泉に入りながら「効能は」とか言ってた番組があったような気がするけど。その美人のお姉さんを特撮ヒーローに置き換えてみたらどうなるか、みたいな。

ヒーロー 「皆さん、こんにちわ。○○戦隊○○の○○レッドです。今日は東京タワーに来てみました。実は俺、東京タワーにくるの初めてなんだよね」
怪人 「実は俺も」
ヒーロー 「あ。そうなん? 意外とさ、地元の観光名所ってこないよね」
怪人 「いやいやいや。俺達、東京が地元じゃないやん」
ヒーロー 「アレッ? そうだっけ? 俺達、都民じゃなかったの?」
怪人 「設定では埼玉県民になってます」
ヒーロー 「いやー、似たようなもんだろ」
怪人 「正義のヒーローが嘘ついちゃダメだよー。怪人の俺にこんなツッコミさせないでよ」

みたいな。

てな妄想を書いてるうちに思い出してしまったけど、ウルトラマンに登場する宇宙人がこんな感じのアレコレをする番組が既にあったような…気がする…。スキー場で滑ってる回を見たような記憶が…。自分如きが思いつくようなことは、既に誰かがやってるのだよなあ…。

*1: かつての自社商品をあっという間に黒歴史扱いして削除していく、そんな気配があるよな…あの某K社…。それもまた、評価システム、というか評価者がバグってるからだろうけど。あれだけ膨大なIPを持ってながらさっぱり活かさないのは、ある意味逆にスゴイ…。全てが作り捨て…。

2017/09/11(月) [n年前の日記]

#1 [raspberrypi] Raspberry Pi Zero WのCPUのサイズ

ノギスでざっくりと、Raspberry Pi Zero W のCPUのサイズを測ってみたのだけど。12x12mm、ぐらいじゃないかなあ…。たぶん。

_On the next version of the Zero (without adding cost) - Page 2 - Raspberry Pi Forums で、「4コアになったら12x12mmが14x14mmになっちゃった」てな一文があるから、たぶん12x12mm、でいいのかなと。

ということは、12x12mmのヒートシンクを購入すれば Zero W につけられるはず。

と思ったのだけど。ググってみてもそんなサイズのヒートシンクは無くて。14x14mmなら出てくるのだけど…。まあ、そのあたりは Pi2 や Pi3 用として売られてるわけですが。

14x14mmのヒートシンクを Zero W につけられるかというと…。miniHDMI端子のあたりにぶつかりそうな気配も…。Zero W じゃなくて Zero なら、真ん中あたりに配置してあるらしいから大丈夫かもしれんけど。

そもそも、Zero や Zero W の消費電力で、ヒートシンクって必要なのかな。何をどうすれば判断できるのだろう。ベンチマークでも動かして発熱させれば分かるのかしらん。

#2 [raspberrypi] pigpiodって結構重いのだな

Raspberry Pi のGPIOをより使い易くする、というか高機能にする、 _pigpio というライブラリだかサービスだかがあるのだけど、利用するためには _pigpiod というデーモン?を動かしておかないといけなくて。

というわけで、先日 Zero W の GPIO が使えるかどうかを実験する際に有効にしてみたのだけど。Zero W上では、pigpiod のCPU使用率が 7〜8%ぐらいになってることに今頃気が付いて。ざっくり考えれば常時1割近くを持っていかれるわけだから…結構重いのだな、と。

もっとも、GPIO をアレコレしながらデスクトップでゴージャスな何かを表示しつつ、みたいなアレもコレも全部一斉にやるぜ、てなことを Raspberry Pi シリーズでできるとも思えないし。GPIO を使ってたら、それはもうほとんど制御専用として使ってそうだし、デスクトップ画面でどうのこうのは制御云々なんてまずやってないだろうし。なので、ほとんどの場面では問題にならないであろう気もする。

#3 [anime][neta] お祭りについて妄想

バカ妄想をメモ。

数日前に、「美少女アニメキャラの顔にしわを描けるようになったのは押井監督のおかげ」「そんな偉業を成した押井監督のお墓を皆でお参りすべき」てな妄想をメモしたのだけど。考えてみたら御存命中に崇め奉っても全然いいのだよなあ、と気が付いて。

例えば…。毎年毎年、劇場版パト1の公開日になると、押井監督が真っ白な着物を着せられて皆の前に現れて。お参りに来たアニメ業界人が、一人一人、筆と墨で、監督の顔に、しわを一本ずつ描き加えていく。

なんとなく雰囲気的に108本ぐらい描き加えて監督の顔が真っ黒になったあたりで、監督は神輿に乗せられて。業界人が神輿を担いで、IGのスタジオがある街の中をぐるぐると練り歩く。

ただ歩いてるのではちょっと雰囲気が出ないので、ここはやはり川井憲次氏にソレっぽい曲を作ってもらって、攻殻機動隊で流れた民謡っぽい謎合掌を皆でしながらウロウロしつつ、私達は押井監督をこの通り心の底から賞賛していますよ、と示す。

てな感じの祭りを企画する。とか。

しかし当然ながら押井監督は絶対嫌がるはず。「冗談じゃないよ」「バッカじゃないの」と言い出しそう。これは困った。神様が出てこないのでは祭りにならない。皆で監督を取り押さえて無理矢理実行するのもアリかもしれないけど、それはそれで後が怖い。特に作画スタッフがガクブル。次回作で何を要求されるか想像するだに恐ろしい。というか、荒縄でグルグル巻きにされた押井監督が集団に担ぎ上げられて街を練り歩いてるの図は、もはや祭りじゃなくて違う何かとしか思えない。ビジュアル的によろしくない。映像制作に携わる者達の振る舞いとしてはいかがなものか。たとえそこに監督を褒め称えたい気持ちが溢れていたとしてもビジュアルって重要。

誰かが言い出す。「犬でいいんじゃねえか」。押井監督と言えば犬だし、犬と言えば押井監督なのだから、犬を神輿に乗せて練り歩くということは押井監督を神輿に乗せて練り歩いてるのと同義である、と…。その発言に、その場に居た全員が、「なるほど。それは名案」「実に筋が通っている」と大賛同。

かくして、犬を神様 ―― オシイ様に見立てて祭りを開く展開に。

だが、犬の顔にしわを描こうとしても、もちろん犬は暴れるわけで。更に、犬は毛だらけだから、どれがしわで、どれが毛だか分からない。どうにか神輿に乗せてみたら恐怖に震えておしっこジャー。しかも、その様子を傍から見ていた押井監督が「オイ! 俺を虐待するのはやめろ!」と怒り出してしまうしで、計画は頓挫しかける…。

もう面倒臭いからぬいぐるみや木彫りの像でいいよ、という話になって…。ツルツルな表面の犬の木像をアレしてソレをする、なんだか妥協しまくりなお祭りに。

しかしそんな経緯で始まった祭りも、数十年、数百年と続けるとなんとなく箔が付いてくるもので。未来の日本では、これは犬ですと言われたらどうにか犬に見えなくもないようなそんな気分にもなってくる、人だか犬だか判別が難しい不思議な謎生物の像が、近隣住民から「オシイ様」と呼ばれて親しまれつつ、祭りの日になると担ぎ出されて墨で真っ黒にされるという光景が…。

ちょっとSFっぽい気がする。でもないか。

他の事例で妄想。 :

てな感じのバカ妄想をしてしまったけど、コレの宮崎駿監督版や、富野監督版を妄想してみたら、どうなるんだろうと…。

まあ、富野監督はイデオン祭りの前科、もとい、実績があるから、内容次第ではビッグな態度を見せてくれそうなイメージが。ていうかガンダム関係のイベントでも顔を出してくれて、集まった人達が「富野監督キター」って喜んでるから、別にわざわざ今から奇祭を企画せんでも、てな気もする。

が、宮崎駿監督は…嫌がりそうだなあ…。絶対怒るだろう…。

でも女性スタッフが、「最近小さい子供さんでも楽しめる、昔ながらの日本らしい祭りってあまりないんですよね」などとつぶやくと、無言でしばらく考えた後、「…やってみるか」と言い出したりしそうな、そんな勝手なイメージも。「せっかくだからこういう祭りはどうか」「チビ達も喜ぶんじゃないか」とエンジンさえかかれば次々に面白いアイデアが。

かくして、スタジオジブリがあったあの辺に、慈奉里(じぶり)祭りなる、小さな小さなお祭りがひっそり定着するという…。当然その頃にはスタジオジブリは無くなってるのだけど、お祭りの名前として、「ジブリ」という名前がずっとその地域に残り続ける、みたいな。

ちょっとSFっぽい。ような気が。すこしファンタジー。

現存する祭りってスゴイ。 :

てな感じの妄想をしていくと、今現在日本の各地に残ってる奇祭の類って、どういう経緯で始まったんだろう、ここまで継続させるのは大変だったんだろうなあ、消えていったお祭りも結構あるんだろうなあ、などと思いを馳せてしまったりもするわけで。いやー、アレとかソレとか、よくまあ残せたもんだよなあ…。当時の人達はどんだけエネルギッシュだったんだろう。みたいな。

まあ、昔は、ハレとケの比率が違ったからそこまでやれたのかも。今はもう、例えばTVをつけたらハレしか目に飛び込んでこないし。感覚的に違ってくるところもあるだろうな…。

てな感じの妄想をしてしまったのでなんとなくメモ。

#4 [anime][neta] 一人の作家が未来で神様扱いされてるソレ

小説家、漫画家、ミュージシャン、映画監督、なんでもいいのだけど、一人の作家が未来世界では比喩でもなんでもなくガチで宗教的な神様として扱われてる、てな設定はアリなのかナシなのか、などとしょーもないことを考え始めてしまったり。まあ、何がどうなったらそんなことになるのか、てな部分が何も思いつかないのでアレだけど。そこらへんをすらすら思いつける人なら、小説家や脚本家になれるのだろう…。

考えてみたら、「機動戦艦ナデシコ」がちょっと近い気もする。まあ、神様になるソレが、人ではなかったけど。「ウラシマン」も近いのかな。と言ってもアレは神と言うわけではなくて、未来世界における重要人物が、実は…てなソレだけど。

昔読んだSF小説で、過去にタイムスリップしてみたら歴史上の偉人が、実は…てのもあったような。アレはSF小説として扱われているのだから、そういう設定は一応SF、なんだろうなあ…。逆に、過去ではなく未来に飛ばしてみれば…それもまたSFになるのだろうか。

現代世界では神様扱いされるほどに特別視されてはいない人物が、未来ではスゴイ扱いになってる、てなあたりを説得力を持って描けたら…。それは逆に、今現在神様として扱われてるアレやコレって実際はどうだったんだろう、てなことをつい考えてしまう可能性も出てきそうだなと。となると…ちょっと危険な感じがしてきた。フィクションが通じない人達って居るから…。

スペックが強化されていく偉人達。 :

神様云々とはちょっと違ってくるけど。有名人って、時代が経つにつれて、そのスペックが人ならざる者になっていく時があるよなと。

例えば聖徳太子は、約1,500年ほど前の人物だけど、そのエピソードを眺めると、「これもう人間じゃなくて宇宙人じゃね?」と思えてくるし。たった1,500年で、この状態。

500年ぐらい前の君主様は、人の生き血を吸ったり、コウモリに変身して夜な夜な飛び回る、そんなキャラになってたりするし。

200年ぐらい前に活動してた新選組は、今ではもう、全員超絶イケメンだったのだ、そうに決まってる、そうじゃなきゃ許さない、という扱いが当たり前で。

それらを考えると…。今現在活躍してる有名人は、未来でどんなキャラクターとして描かれてるか、ちょっと予想がつかないよなと。

何度も例に出してなんだか申し訳ないけど…例えば押井監督などは、犬に変身したり、犬と会話ができる異能力者として未来では扱われてる可能性があるよなと。しかも十中八九、美少年か美青年キャラになってる。いや、だって、沖田総司が今ではあんなルックスになってるのだもの。押井監督もスゴイよ? スゴイことになるよ? 保証しますよ。してどうする。…まあ、犬に変身できたからと言って、その設定でどんな話が作れるのかと考えてみると悩んじゃうけど。

宮崎駿監督あたりは、「一目見ただけで全ての光景を記憶できる魔眼の持ち主」とか「通り名:パーフェクトレコーダー」とかそういう扱いのキャラになってそうな。

とか妄想すると…。未来の作家さん達からとんでもない扱いを受ける前に、本人が、「どうせアレンジされちゃうなら、せめてこういう感じのキャラにしてくれ」と要望を出しておくのもアリかもな、と…。「短足には描くな」とか「ほっそりキャラとして描いてくれ」とかそういう。

というか今のうちに自分でキャラ作って「俺はこういうキャラね」と浸透させたほうがいいのかも…。ナベシン監督みたいに。

すると未来の日本では…。犬に変身できる美少年と化した押井監督と、魔眼所有者の美少年と化した宮崎駿監督の横に、コスプレおじさんにしか見えないいつものナベシン監督のソレが並ぶ、という作品が人気を博していたり。ナベシン監督、美味しい…。作戦勝ちじゃないスか…。

2017/09/12(火) [n年前の日記]

#1 [pc] PCにGPIOを追加できないのだろうか

ふとなんとなく、PCにGPIOを追加できないものかなあ、などと思い始めて。USB接続したその先に、GPIOのピンがずらりと並ぶ、そんな何か、みたいな商品が存在しないものかと。いやまあ、PCなどという巨大な物体にそんなのつけてどうするの、と言われそうな気もするけど…。

ググってみたら、やっぱりあるらしい。

_Km2Net Inc. (Try! USB-IO2.0 USB-FSIO)
_USB接続デジタル入出力モジュール USB-IO2.0(AKI): マイコン関連 秋月電子通商 電子部品 ネット通販
_PIC USB-IO2.0(AKI)を買ってみました KazHatブログ/ウェブリブログ
_USB-IO2.0を使う : 好きな事だけの日記

Windowsで制御するのはともかく、Linuxで制御するのは大変そうだな…。Raspberry Pi のように、「Pythonを使っても制御できますよー」みたいなノリではないらしい。

こういうのを使えば、フットスイッチ等を作れそうな。

2017/09/13(水) [n年前の日記]

#1 [python][pi3d] pi3dで画像を表示する

_pi3d で画像を表示してみたい。画像の表示ができれば、pi3d で2Dゲームを作れそうかちょっと見えてくるかもしれないし。

pi3dのサンプルスクリプト群、 _pi3d_demos の中では…。以下が参考になりそうかなと。

_pi3d_demos/Minimal.py
_pi3d_demos/Minimal_2d.py
_pi3d_demos/Raspberry_Rain.py
_pi3d_demos/Clouds3d.py
_pi3d_demos/SpriteBalls.py

どうやら、pi3d.ImageSprite、あるいは pi3d.Sprite、はたまた pi3d.Points、てなあたりを生成すれば画像を描画できるっぽい。

ImageSpriteを使ってみる。 :

とりあえず、一番簡単に使えそうな ImageSprite を使って描画してみる。

imagesprite_ss01.png

_imagesprite.py
_cutegirl.png
_cutegirl2.png
u"""
pi3d ImageSprite sample.

スプライトを描画するサンプル。
平行投影で描画。
ESCキーで終了する。

Windows10 x64 + Python 2.7.12 32bit + pi3d 2.20
"""
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals
import pi3d

# ウインドウ生成
display = pi3d.Display.create(w=640, h=480, frames_per_second=60)

# シェーダーを生成。uv_flatは照明関係の計算をしない。
shader = pi3d.Shader("uv_flat")

# カメラを平行投影に
camera = pi3d.Camera(is_3d=False)

# テクスチャを読み込み
tex = pi3d.Texture("cutegirl.png", blend=False, filter=pi3d.GL_NEAREST)
# tex = pi3d.Texture("cutegirl2.png", blend=False, filter=pi3d.GL_NEAREST)

# スプライトを生成
sprite0 = pi3d.ImageSprite(tex, shader,
                           w=256.0, h=256.0, x=0.0, y=0.0)
sprite1 = pi3d.ImageSprite(tex, shader,
                           w=256.0, h=256.0, x=128.0, y=128.0)

print("sprite0.z() = %d" % sprite0.z())  # z=20.0
print("sprite1.z() = %d" % sprite1.z())

# キーボード取得用クラスを生成
keys = pi3d.Keyboard()

# メインループ
while display.loop_running():

    # スプライトを描画
    sprite0.draw()
    sprite1.draw()

    if keys.read() == 27:
        # ESCキーが押されたらループを抜けて終了
        keys.close()
        display.destroy()
        break

画像は、 _OpenGameArt.org の、 _Cute Girl - Free Sprites を使わせてもらいました。ありがたや。この画像、可愛いな…。しかもライセンスが CC0 だし…。

少し解説。 :

ソースにコメントを書きまくったから、眺めれば分かりそうではあるけど、一応。

画像の色をそのまま出したいときは、uv_flat という種類のシェーダーを使うといいらしい。shader = pi3d.Shader("uv_flat") で用意してる。

_pi3d.Shader - pi3d 2.21 documentation によると、テクスチャ画像を使いたいときはシェーダー種類を示す文字列の頭に「uv_」と付くらしい。「flat」は、照明関係の計算をしないでフラットな状態で描画、ということかなと。

2D描画をしたいので、透視投影ではなく平行投影にする。そのために、カメラを用意して設定する。camera = pi3d.Camera(is_3d=False) で、「このカメラは、3Dっぽく描画しないでくれ=平行投影にしてくれ」と指定してるのだろう…。

画像を描画したいので、テクスチャ画像として読み込む。tex = pi3d.Texture("テクスチャ画像のパス") でテクスチャとして読み込める。

テクスチャ読み込み時の、blend指定の意味は、ちょっとよく分からなかった。filter指定は、拡大縮小時にどんなフィルタをかけるか、だろうけど。 _pi3d.Texture - pi3d 2.21 documentation によれば、フィルタ種類として pi3d.GL_NEAREST や pi3d.GL_LINEAR が指定できるらしい。GL_NEAREST はクッキリだけどジャギジャギ。GL_LINEAR は滑らかだけどぼやける。てな認識でいいんじゃないかな…。 _Textures で紹介されてる画像を眺めれば分かるかなと。

ちなみにドキュメントには、「テクスチャ画像のサイズは、4, 8, 16, 32, 48, 64, 72, 96, 128, 144, 192, 256, 288, 384, 512, 576, 640, 720, 768, 800, 960, 1024, 1080, 1920 てな感じのキリのいい値にしておいてね」と書いてある。

画像を使うスプライトは、以下で生成できる。
sprite0 = pi3d.ImageSprite(テクスチャ, シェーダー,
                           w=幅, h=高さ, x=x座標, y=y座標)
そして、この場合は平行投影だから、幅、高さ、座標はドット単位で指定すればいいのだろう…。たぶん。

pi3d.ImageSprite() のテクスチャのところに、直接、画像のパスを書いても、画像をテクスチャとして読み込んで使ってくれる模様。ただ、同じ画像を他のスプライトでも使いたい場合は、別途テクスチャとして読み込んでソレを指定したほうが確実かもしれず。

と思ったけど、 _pi3d/Sprite.py at master - tipam/pi3d を眺めたら、既にテクスチャが読み込まれているならそっちを流用する、てな実装になってる、ように見えなくもないな…。

透視投影で描画してみる。 :

前述のソースは平行投影で描画してるけど、透視投影でも描画してみる。

imagesprite2_ss01.png

_imagesprite2.py
u"""
pi3d ImageSprite sample.

スプライトを描画するサンプル。
透視投影で描画。
ESCキーで終了する。

Windows10 x64 + Python 2.7.12 32bit + pi3d 2.20
"""
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals
import pi3d

# ウインドウ生成
display = pi3d.Display.create(w=640, h=480, frames_per_second=60)

# シェーダーを生成。uv_flatは照明関係の計算をしない。
shader = pi3d.Shader("uv_flat")

# カメラを透視投影に
camera = pi3d.Camera(is_3d=True)

# テクスチャを読み込み
tex = pi3d.Texture("cutegirl.png", blend=False, filter=pi3d.GL_NEAREST)
# tex = pi3d.Texture("cutegirl2.png", blend=False, filter=pi3d.GL_NEAREST)

# スプライトを生成
sprite0 = pi3d.ImageSprite(tex, shader,
                           w=10.0, h=10.0, x=0.0, y=0.0)
sprite1 = pi3d.ImageSprite(tex, shader,
                           w=10.0, h=10.0, x=5.0, y=5.0)

print("sprite0.z() = %f" % sprite0.z())  # z=20.0
print("sprite1.z() = %f" % sprite1.z())

# キーボード取得用クラスを生成
keys = pi3d.Keyboard()

# メインループ
while display.loop_running():

    # スプライトを描画
    sprite0.draw()
    sprite1.draw()

    if keys.read() == 27:
        # ESCキーが押されたらループを抜けて終了
        keys.close()
        display.destroy()
        break

pi3d.Camera(is_3d=True) を指定してるので、平行投影ではなく、透視投影になってる。それと同時に、ImageSprite() 生成時の、幅、高さ、座標値に対して、謎単位な数値を指定している。

また、透視投影の場合、 ImageSprite() 生成時に、z=20.0とか z=30.0 とか指定してやると、描画される大きさが違ってくる。

以下の描画結果は、2つ目のスプライトのz値を、1つ目より大きくした=遠くにしてみた事例。透視投影は、近くにあるものは大きく、遠くにあるものは小さく描画するので、遠くにあるスプライトのほうが小さく描画されてる。

imagesprite2_ss02.png

境界線がおかしい。 :

アルファチャンネルを持った画像を描画した場合、境界部分がちょっと妙な描画になることに気づいた。

imagesprite2_ss03.png

お判りいただけるだろうか。

どうやら pi3d は、テクスチャ画像のアルファチャンネルが 0 or 255 の時は問題ないけど、1〜254の時は妙な描画になるっぽいなと…。これはもしかすると、pi3d の問題ではなくて、Open GL ES の問題なのかもしれない。あるいは、使おうとしてるシェーダーの問題だろうか。

_cutegirl.png は境界部分のアルファチャンネルが0〜255になってるけど、 _cutegirl2.png は 0 or 255 の二値にしてあるので、読み込む画像を変えてみると違いが分かるかも。平行投影の場合は _cutegirl2.png を使うと変な境界が出ないけど、透視投影の場合はどちらを使っても変な境界が出ちゃう。みたいな。このあたり、解決策はあるのだろうか…。

#2 [pc][neta] CPUは男なのか女なのか

思考メモ。

寝ていたら夢の中で、CPUを女性として分類している光景を何故か目にして。

目が覚めてから、少し考え込んでしまったり。CPUに性別をつけるとしたら、どちらになるんだろう。男なのか、女なのか。「彼」なのか、「彼女」なのか。

まあ、CPUは男扱いされるのが自然、かなと。例えば直系のアーキテクチャ、かつ、機能削減版が出た際などは、「○○の弟分」などと呼ばれたりするし。「○○の妹分」と呼ばれてる場面を見た記憶が無い。つまり、CPUについて語ったり紹介したりしてる人々は、CPUを男として扱うのが感覚的に妥当、と思っているということだろう…。

しかし、8bit PCが普及していた頃、自分の「マイコン」を擬人化するお遊びが一部で流行ってたけど…。その場合は、えてして女性として擬人化されてたような気もするわけで。CPUは男扱いなのに、マイコンは女扱い。さて、何故だろう。

今はどうなんだろうか。例えば、世間の皆様が持ち歩いてる、スマホ、あるいはガラケー。これは男なのか、女なのか。「彼」なのか、「彼女」なのか。

そういえば、スマホだかタブレットだか忘れたけどその手のTVCMで、イケメンの俳優さんがスマホであるかのように演じてた記憶も。すると感覚的には男、ということなのかしらん。女性がスマホやタブレットを演じるという選択肢は…検討されたのだろうか。それとも一切検討されなかったのだろうか。なんだかちょっと気になる。

船は女性扱いされることがあるよな…。電車はどうだろう…。車はどうだろう…。日本刀はどうなのだ…。戦艦は…。一体どのあたりで、自分達は、その機械の性別を推測しているのだろう。

男性ユーザがほとんどなら、そのユーザが扱う機械は女性として見立てられる、というわけではないよな…。だったらCPUも女性扱いされてしかるべきだし。つまり、ユーザの性別で決まるわけでもなさそうな。

もしかして、サイズかな…。手の中に収まるもの、机の上に置くもの、自分が乗り込むもの、つまりは大きさで違ってくるんだろうか。

2017/09/14(木) [n年前の日記]

#1 [pi3d][python][raspberrypi] pi3dで画像を表示する。その2

pi3d で画像を表示できたけど、只の静止画状態では今一つなので試しに動かしてみたり。



_imagesprite3.py
_ufo.png
u"""
pi3d ImageSprite sample.

スプライトを描画するサンプル。
透視投影で描画しつつグネグネ動かす。
ESCキーで終了する。

Windows10 x64 + Python 2.7.12 32bit + pi3d 2.20
"""
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals
from math import radians
from math import sin
import pi3d

# ウインドウ生成
display = pi3d.Display.create(w=640, h=480, frames_per_second=60)

# シェーダーを生成。uv_flatは照明関係の計算をしない。
shader = pi3d.Shader("uv_flat")

# カメラを透視投影に
camera = pi3d.Camera(is_3d=True)

# テクスチャを読み込み
tex = pi3d.Texture("ufo.png")

# スプライトをたくさん生成
sprs = []
num = 30
for i in range(num):
    spr = pi3d.ImageSprite(tex, shader, w=10.0, h=10.0)
    sprs.append(spr)

# キーボード取得用クラスを生成
keys = pi3d.Keyboard()

bs_z = 50.0
x_ang, y_ang, z_ang = 0.0, 0.0, 0.0

# メインループ
while display.loop_running():

    x_ang = (x_ang + 3.0) % 360.0
    y_ang = (y_ang + 4.0) % 360.0
    z_ang = (z_ang + 2.2) % 360.0

    # 先っぽ
    tx = 0.0
    ty = 0.0
    tz = 30.0 * sin(radians(z_ang)) + bs_z

    # 根元
    bx = 0.0
    by = 0.0
    bz = tz + 200.0

    dx = (tx - bx) / num
    dy = (ty - by) / num
    dz = (tz - bz) / num

    for i, spr in enumerate(sprs):
        x = bx + (dx * i) + (15.0 * sin(radians(x_ang + (10.0 * i))))
        y = by + (dy * i) + (12.0 * sin(radians(y_ang + (25.0 * i))))
        z = bz + (dz * i)
        spr.position(x, y, z)  # スプライトの座標を設定
        spr.draw()  # スプライトを描画

    if keys.read() == 27:
        # ESCキーが押されたらループを抜けて終了
        keys.close()
        display.destroy()
        break

_DXRubyでインチキ多関節を試してみる をpi3dでもやってみた、みたいな。

Raspberry Pi Zero W上で動かしてみたのだけど。 :

上記のソレは Windows10 上で動かした場合の結果だけど、試しに Raspberry Pi Zero W上で動かしたら、とんでもなく遅かった…。まさかここまで遅くなるとは…。ちゃんと測ってないけど、5〜6FPSしか出てないんじゃないかなあ…。

スプライト枚数を減らして動作確認してみたら、減らせば減らしただけフレームレートが改善されていったので、どうも大量に描画するのは厳しいみたいだなと。…この程度で息も絶え絶えでは困るんだけど。

ただ、 _pi3d_demos/SpriteBalls.py を動かすと、大量に画像が表示されてるのに、40FPS以上は出てるし…。工夫次第でどうにかなる可能性もありそうな。

画像の代わりに球を出してみた。 :

もしや画像を描画すると遅くなるのかなと疑問が湧いたので、試しに ImageSprite ではなく Sphere にして、Zero W上で動作確認してみたり。

_spheres.py

残念ながら、見た目でほとんど変わらなかった。やっぱり遅い…。遅過ぎる…。

ということは、描画しようとしてるオブジェクトの種類に関係なく、とにかく大量に出した時点で遅くなるようだなと…。大量と言っても、この場合、30個程度なんだけどなあ。ファミコンですらスプライト64枚、MSXですら32枚だった(らしい)のに…。

オブジェクトの発生個数や座標計算のあたりはそのままにして、描画する個数のみを1〜3個にしてみたところ、滑らかに動いた。ということは…描画で処理落ちしちゃってるのだな…。

2017/09/15(金) [n年前の日記]

#1 [pi3d][python][raspberrypi] pi3dでキー入力を取得

2Dのリアルタイムゲームを作りたいならキーボード入力の取得ぐらいはできないと話にならないだろう、と思えてきたので、pi3dでキー入力を取得する方法について少し調べたのだけど。これが…ちょっとなかなか厳しい気配が…。

フツーに取得。 :

pi3d_demos のサンプルを眺めながら、フツーに取得するソレを試してみたり。

get_keyboard1_ss.gif

_get_keyboard1.py
_airplane_01_64x64.png (CC0 License)
u"""
pi3d input keyboard sample.

キーボード入力を取得してみるサンプル。
WASDキーで上下左右に動かしてみる。
ESCキーで終了する。

Windows10 x64 + Python 2.7.12 32bit + pi3d 2.21
"""
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals
import pi3d

# ウインドウ生成
display = pi3d.Display.create(w=640, h=480, frames_per_second=60)

# シェーダーを生成。uv_flatは照明関係の計算をしない。
shader = pi3d.Shader("uv_flat")

# カメラを平行投影に
camera = pi3d.Camera(is_3d=False)

# テクスチャを読み込み
tex = pi3d.Texture("airplane_01_64x64.png", mipmap=False)

# スプライトを生成
x, y, z = 0.0, 0.0, 20.0
spr = pi3d.ImageSprite(tex, shader, w=64, h=64, x=x, y=y, z=z)

# スプライトをDisplayに登録
display.add_sprites(spr)

# キーボード取得用クラスを生成
keys = pi3d.Keyboard()

# メインループ
while display.loop_running():
    spd = 8.0

    # キー入力で座標を変化させる
    k = keys.read()
    if k == ord("w"):
        spr.translateY(spd)  # スプライトのy座標を変化
    if k == ord("a"):
        spr.translateX(-spd)  # スプライトのx座標を変化
    if k == ord("s"):
        spr.translateY(-spd)
    if k == ord("d"):
        spr.translateX(spd)

    if k == 27:
        # ESCキーが押されたらループを抜けて終了
        keys.close()
        display.destroy()
        break

動いた。と思いきや、これはこれでかなり問題が。動きをよく見ると分かるけど…。キーを押すと、「タッ……タタタタタ」という感じの動きになってしまっている。

要するに、ブラウザやエディタ等で文字を打ち込む際に、キーのオートリピートが働いたりするけど、アレがそのまま入力されてる・取得されてしまっているわけで。

ゲームを作ろうとした場合、コレは非常にマズイ。インベーダーゲームですら、レバーを倒してから自機が「タッ……タタタタタ」なんて動いたりしないわけで。ということで、このやり方はマズイ。これじゃ使い物にならない。

TestEvents.pyが動かない。 :

_pi3dのFAQページ によると、 _pi3d_demos の TestEvents.py を実行するとキー入力やマウス入力、ジョイスティック入力を取得する様子を確認できるよ、と書いてある。

試してみたところ、Raspberry Pi Zero W 上では動作した。
  • キーを押した瞬間
  • キーを離した瞬間
  • オートリピートが働いてキー入力された瞬間
それぞれを取得できてる模様。

ところが、Windows上で実行するとエラーが出る。
> python TestEvents.py

Traceback (most recent call last):
  File "TestEvents.py", line 6, in <module>
    from pi3d.event.Event import InputEvents, code_to_key
  File "C:\Python\Python27\lib\site-packages\pi3d\event\Event.py", line 4, in <module>
    from pi3d.event import EventHandler
  File "C:\Python\Python27\lib\site-packages\pi3d\event\EventHandler.py", line 4, in <module>
    from pi3d.event.EventStream import EventStream
  File "C:\Python\Python27\lib\site-packages\pi3d\event\EventStream.py", line 1, in <module>
    import fcntl
ImportError: No module named fcntl

調べてみたところ、Windows版Pythonに、fcntl というモジュールは無いようで。fcntl は Linux版Pythonでしか使えないという…。

_python - fcntl substitute on Windows - Stack Overflow

上記フォーラムで、「fcntl.py というファイルを作って、中でこういう記述をすれば、とりあえずエラー回避はできるよ。機能としては一切働かないけどな」と書かれていたので試してみたのだけど。
> python TestEvents.py

Traceback (most recent call last):
  File "TestEvents.py", line 30, in <module>
    inputs = InputEvents( key_handler_func, mouse_handler_func, joystick_handler_func, syn_handler_func, unhandled_handler_func)
  File "C:\Python\Python27\lib\site-packages\pi3d\event\Event.py", line 70, in __init__
    keyboards =  find_devices("kbd")
  File "C:\Python\Python27\lib\site-packages\pi3d\event\FindDevices.py", line 179, in find_devices
    with open("/proc/bus/input/devices", "r") as filehandle:
IOError: [Errno 2] No such file or directory: '/proc/bus/input/devices'

「fcntlなんてモジュールはねえよ」と怒られなくなったものの。しかし今度は、「/proc/bus/input/devices なんてファイルもディレクトリもねえよ」と怒られるという。…うん。そのファイル、Linuxは持ってるけどWindowsが持ってるわけないんだよねえ…。

_epics/powermate-event - Epics Users JP

Linuxに接続された入力デバイスの状態は、そこで提示されるという仕組みで…。Windowsにはそんなの無いんだよ…。

ということで、Windows上でも動くようにと考えると、TestEvents.py のソレではダメっぽいなと。

pi3d.Keyboard.PygameKeyboardをどうにかできれば。 :

_pi3d/Keyboard.py を眺めた感じでは、Windows上でpi3dを動かした場合、pi3d.Keyboard() は pi3d.Keyboard.PygameKeyboard() を返すようで。ということは、pygame がキー入力をそれらしく取得できるなら、pi3d 上でもキー入力を取得できるように変更できそうな…。

しかしコレ、pi3d.Keyboard.PygameKeyboard() の read() を眺めていて気付いたけど、キーの同時押しを取得できないのでは…。リストの一番最初の値しか取得してなくて、他のキー入力は全部捨ててるよな…。

#2 [anime] 「異世界はスマートフォンとともに。」なるアニメがなんだか気になる

BS11で放送されてる、「異世界はスマートフォンとともに。」なるアニメを一応視聴してるのだけど。なんだか気になるというか、興味深い作品だなと思ってしまったのでそのあたりをメモ。

テンプレ集合体としての個性。 :

原作はWeb小説発祥のラノベらしいけど…。作者さんの意図や背景が全く分からんので色々と断言するのは難しいのだけど、なんでも巷の評では、異世界転生モノのテンプレートをひたすらかき集めて列挙した、てな感じの作品だそうで。

テンプレ展開というのは、「あ、これテンプレだ」「こういうのは○○で見たぞ」と認知されると、その時点からえてして面白くない印象を受けるわけだけど。しかし全てがテンプレで構成されると、それはそれでまた違った印象を受けるのだと、この作品を通じて気づかされたというか。

たとえテンプレでも、次から次へと提示されれば、質はともかくそこには膨大な情報量がたしかに提示されているわけで、その情報量に対してある種のトリップ感、酩酊状態が発生してしまう、とでもいうか…。結果、瞬間瞬間で見ると何一つこれっぽっちも欠片も面白くないし正直なところ頭痛がしてくるぐらいに酷いレベルなのだけど、しかし全体を通してみると他の作品には無い独特な面白さが感じ取れなくもない、なんとも不思議な作品になってる、ような気がするわけで。面白くないのに、面白い。一体なんなんだろう、この作品は。こういう作り方もあるのか、これはこれでアリと言えばアリかもしれないなあ、などと感心させられてしまったり。もっとも、こういう作り方をするためには、既存作品に対するテンプレの探索と発見の作業が必要になるわけで、それはそれで結構大変じゃないのかなと想像したりもするのだけど…。

まあ、庵野監督あたりが「自分達はコピー世代」と言ってたりするけれど、コピー世代にはコピー世代なりの作り方・戦い方がある、てな話でもあるのかなあ…。あるいは、どんな手法も本気で取り組めば見世物になるんだよ、てな事例なのかも。

スマートフォンに対する認知。 :

それとは別に、作中でのスマートフォンというアイテムの捉えられ方が非常に気になるというか。

主人公は、神様に、「異世界に行ってもスマートフォンが使えるように」とお願いして異世界転生する、という設定なのだけど。時々ふと思い出したようにスマートフォンを使いつつも、しかしそこで提供されている機能が、すべて回線の向こう側に存在するネットサービスだったりするあたりが実に興味深いなと。

このあたり、作者が天然でやってるのか、それともわざとやってるのかは分からんのだけど…。もしかすると今時の若い人は、スマートフォン=ネットサービスを利用するための端末、ではなくて、スマートフォン自体にネットサービスが提供している各機能がまるっと含まれていると捉えてるのではあるまいか、てな疑念が自分の中で生じてしまったわけで。

いやまあ、おそらく主人公の思考の安易さは読者にとってのツッコミどころとしてわざとらしく提示されているのだろうと想像もするし、若い人達は、スマートフォンの回線の向こう側に存在するサーバにアクセスして各種サービスを享受してることをちゃんと分かってるだろうと想像もするのだけど。だって、現実世界のスマートフォン利用者は、日常会話の中で「サーバが落ちてる」云々とつぶやいてるわけで。つまり大多数のユーザは、スマートフォンの本体機能としてそれが提供されてるわけではなく、サーバが実処理をやってるのだ、ぐらいの認識は当然あるはずで。故に、主人公のスマホの使い方を見て、「ねーよ」「なんでだよ」と笑うことができるのだろう、と。

ただ、物心ついた頃にはスマートフォンがあるのが当たり前だった世代にとって、スマートフォンが一体どんなアイテムに見えてるのか、そのあたりは気になるところだよなと…。

彼等は、Googleストリートビューがどうやって写真を集めてきたのか想像することはあるのだろうか。Wikipediaが集合知と寄付で存在できていることを知っているのだろうか。「いせスマ」の主人公のように、回線の向こう側で提供されてるアレやコレがスマートフォンの中に全てまるっと内包されている、スマホさえあれば全てが完結する、スマホはガチで単なる魔法の道具なのだ、と勘違いする可能性はないのだろうか…。

例えば、生まれた時から民放TVチャンネルが存在するのが当たり前だった世代の中には、うっかりすると「どうしてNHKは受信料を取るんだ」「民放のように無料で放送しろ」と言い出しちゃう輩が時々混ざってるわけだけど。どうして民放が放送するチャンネルを無料で視聴できるのか、その仕組みすら想像することもなく、同時に、その仕組みがもたらすデメリットを予想できない状態に陥ってる層が、現実世界では悲しいかな既に一定数存在しているわけで。

同じことが、「生まれた時からスマートフォンがあるのが当たり前」だった世代の中で発生しないと言えるのだろうか…。

彼等の手の中にある、スマートフォンと呼ばれるアイテムは、広大なネットをチラチラ覗くことができるだけの機器に過ぎず、さらにネットは、多くの人達が色んな形で努力することでかろうじて存続できている、どこか危うさを持った存在でもあるわけだけど。そういった認識を一体どの時点で持つことができるのだろうか。彼等は、「いせスマ」の主人公にはならないと、はたして楽観視できるのか…。

いや、自分達だって結構怪しい…。時と場合によっては、「いせスマ」の主人公のような錯覚をしている可能性はないか。ネットサービスを利用する際、回線の向こう側を想像することができているのか。そこにある仕組みだけではなく、向こう側の向こう側でサービスを利用している「相手」の姿を想像しながら、各種サービスを上手に利用していると言えるのだろうか。

今はまだ、読者視聴者がツッコミ入れつつ笑いながら見てるけど、そのうちツッコミ入れてもキョトンとしてる層が出てきたらどうしよう…。「いせスマ」はギャグ作品なのだろうと思うけど、見方によってはホラー作品にもなり得るよなあ、と。

てなあたりをついつい考えてしまうあたり、なんだか興味深い作品だなあ、などと思いながら眺めております。とメモ。

や。1話の冒頭で主人公が、神様に「スマートフォンを使えるように」とお願いした時、「スマホでモンスターに殴りかかるのだろうか…」「あるいはスマホの熱で玉子焼きでも作ったりするのかなあ」「そのぐらいしか使い道ねえよなあ」と想像していたらいきなりGoogleマップ異世界版を使い始めたのでビックリしちゃったんですよね…。ソレ、スマホじゃなくてGoogleのサービスだよね? スマホって…何なの…君達一体どういう認識してるの…。もしかして、俺の認識がおかしいの…? いや待て、これはいわゆる「ボケ」かな? ツッコミ待ちの場面なのか? 「ソレ、スマホじゃねー」って言っとけばいいのか? みたいな。とにかく各所で「スマホとは何ぞや」という命題を提示されて不安になってくる、妙な作品だなと…。

2017/09/16() [n年前の日記]

#1 [pi3d][python][raspberrypi] pi3dでキー入力を取得その2

pi3dでキー入力を取得する方法について、まだ調べていたり。pi3d.Keyboard() を使うと「タッ……タタタタタ」的に、キー入力のオートリピートが働いてしまうので、なんとかならんものかと。

ふと、pygameと併用したらどうだろうと思いついたわけで。

pygameと併用。 :

試してみたり。

get_keyboard_with_pygame_ss.gif

_get_keyboard_with_pygame.py
_airplane_01_64x64.png (CC0 License)
u"""
pi3d input keyboard with pygame sample.

キーボード入力を取得してみるサンプル。
WASDキーで上下左右に動かしてみる。
pygameを使ってキーボードの状態を調べる。
ESCキーで終了する。

Windows10 x64 + Python 2.7.12 32bit + pi3d 2.21
"""
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals
import pi3d
import pygame

# ウインドウ生成
display = pi3d.Display.create(w=640, h=480,
                              frames_per_second=60, use_pygame=True)

# シェーダーを生成。uv_flatは照明関係の計算をしない。
shader = pi3d.Shader("uv_flat")

# カメラを平行投影に
camera = pi3d.Camera(is_3d=False)

# テクスチャを読み込み
tex = pi3d.Texture("airplane_01_64x64.png", mipmap=False)

# スプライトを生成
x, y, z = 0.0, 0.0, 20.0
spr = pi3d.ImageSprite(tex, shader, w=64, h=64, x=x, y=y, z=z)

# スプライトをDisplayに登録
display.add_sprites(spr)

# キーボード入力を取得するためにpygameを初期化
pygame.init()

pikeys = pi3d.Keyboard()
print(pikeys)

# メインループ
while display.loop_running():
    quit_fg = False
    spd = 6.0

    pygame.event.pump()  # pygameがイベントを処理できるようにする

    # キー入力で座標を変化させる
    keys = pygame.key.get_pressed()
    if keys[pygame.K_w] or keys[pygame.K_UP]:
        spr.translateY(spd)  # スプライトのy座標を変化
    if keys[pygame.K_s] or keys[pygame.K_DOWN]:
        spr.translateY(-spd)
    if keys[pygame.K_a] or keys[pygame.K_LEFT]:
        spr.translateX(-spd)  # スプライトのx座標を変化
    if keys[pygame.K_d] or keys[pygame.K_RIGHT]:
        spr.translateX(spd)
    if keys[pygame.K_ESCAPE]:
        quit_fg = True

    pikey = pikeys.read()
    if pikey == 27:
        # ESC key
        quit_fg = True

    if quit_fg:
        # ループを抜けて終了
        display.destroy()
        break

一見すると上手く動いてるようだけど、これはこれで問題が。Windows10 x64 や Ubuntu Linux 上では動くのだけど、Raspberry Pi 上では動かない…。
OSresult
Windows10 x64 + Python 2.7.12 + pi3d 2.21 + pygame 1.9.3PASS
Ubuntu Linux 16.04 LTS + Python 2.7.12 + pi3d 2.21 + pygame 1.9.3PASS
Raspberry Pi Zero W + raspbian stretch + Python 2.7.13 + pi3d 2.21 + pygame 1.9.3FAIL

肝心の Raspberry Pi上で動いてくれないのでは困る。

_pi3d/Display.py を眺めてみたのだけど…。
  • Windows と Linux の場合は、pi3d.Display.create() で use_pygame=True を渡すと、pygameのウインドウを作成して、その中で OpenGL ES(もしかするとOpenGL)を表示してくれるから、pygame関係のアレコレが動いてくれるっぽい。
  • しかし、Raspberry Pi 上で動かした場合、問答無用で use_pygame=False に設定されてしまって、pygame のウインドウが出てこない=pygameのアレコレが使えない状態になる。
てな感じの実装になってるように見える。たぶん。

ちなみに、Ubuntu Linux 上でも、pi3d.Display.create() に use_pygame=False を渡してみたら、pygame を使ったキー入力取得ができなかった。

また、Windowsの場合は、use_pygame=True を指定しなくても、自動で必ず pygame を使うように設定される模様。

pynputを試してみたり。 :

pygame以外にキー入力を調べられるモジュールはないのかなとググってみたら、pynput なるモジュールに遭遇。

_pynput 1.3.7 : Python Package Index
_Pythonでキーイベントを取得したかったけどできなかった話←できました。 - 豆腐とコンソメ

試してみたり。pip でインストール。
pip install pynput

サンプルスクリプトをコピペして動作確認。

_pynput_sample.py
u"""
pynput sample.

キー入力を調べる pynput の動作確認。

動作確認環境:
Windows10 x64 + Python 2.7.12 32bit + pynput 1.3.7
"""

import pynput


def on_press(key):
    """Key press."""
    try:
        print('alphanumeric key {0} pressed'.format(key.char))
    except AttributeError:
        print('special key {0} pressed'.format(key))


def on_release(key):
    """Key release."""
    print('{0} released'.format(key))
    if key == pynput.keyboard.Key.esc:
        # Stop listener
        return False


# Collect events until released
print("ESC to exit.")
with pynput.keyboard.Listener(on_press=on_press,
                              on_release=on_release) as listener:
    listener.join()

しかし…。Windows10 x64 + DOS窓(cmd.exe)上ではそれらしく動いたのだけど、Ubuntu Linux 16.04 LTS + ターミナルエミュレータ(GNOME端末)上では、押したキーが端末上に表示されてしまって…。しかも、カーソルキー等の特殊キーを押した際には、端末上の表示がそれはもう大変なことに。

ということで、pynput では、今回の目的を果たせないようだなと。

inputsを使ってみる。 :

他にもキーボード入力を取得できるモジュールが無いのかなと探してみたら、inputs なるモジュールに遭遇。

_inputs 0.1 : Python Package Index
_zeth/inputs: Cross-platform Python support for keyboards, mice and gamepads

2016/06/17が最終更新日らしい。

試してみたり。環境は Windows10 x64 + Python 2.7.12。pipでインストール。
pip install inputs

クイックスタートに従って、以下を試してみたのだけど。
> py
Python 2.7.12 (v2.7.12:d33e0cf91556, Jun 27 2016, 15:19:22) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import inputs
>>> for device in inputs.devices:
...     print(device)
...
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
  File "C:\Python\Python27\lib\site-packages\inputs.py", line 2031, in __str__
    return self.name
AttributeError: 'Keyboard' object has no attribute 'name'
いきなり最初からエラー。

_'Keyboard' object has no attribute 'name' - Issue #13 - zeth/inputs としてバグ報告はされてるのだけど、github上のソースは去年から全く更新されてない…。

_inputs/examples_inputs/devices_example.py_inputs/keyboard_example.py もエラー。ダメだこりゃ。

#2 [python][windows] Python + curses を試す

pi3d を Raspberry Pi上で動かすと、キーボード入力を curses なるもので取得するようで。何ができるモジュールなのかよく分からなかったので、少し試してみようと。

Windows10 x64上でサンプルスクリプトを動かそうとしたら、「_curses なんてモジュールはねえよ」と怒られてしまった。どうやら Windows版Pythonの場合、別途 curses をインストールしないといかんらしい。

_Python で Curses のサンプルを書いてみた - quwaharaの日記

自分が使ってるのは Python 2.7.12 なので、 _Python Extension Packages for Windows - Christoph Gohlke から、curses-2.2-cp27-none-win32.whl をDL。pipでインストール。
pip install curses-2.2-cp27-none-win32.whl
これで、Windows上でも curses が使えるようになった。

_curses_sample.py
u"""
curses sample.

キー入力を取得して表示する。
ESCキーかqキーで終了。

Windows10 x64 + Python 2.7.12 32bit + curses 2.2
"""

import curses
import os


def main(win):
    u"""メイン処理."""
    win.nodelay(True)
    key = ""
    win.clear()
    win.addstr("Detected key:")
    while 1:
        try:
            key = win.getkey()
            win.clear()
            win.addstr("Detected key:")
            win.addstr(str(key))
            if key == os.linesep or key == "q" or ord(key) == 27:
                break
        except Exception as e:
            # No input
            pass


curses.wrapper(main)

python curses_sample.py で実行したら、押したキーが表示された。一応キー入力を取得することはできるらしい。ESCキーかqキーを押せば終了。

しかし…。コレってキーの同時押しを取得できないのでは…。1文字ずつ入力されることを前提にしてるような…。

ちなみに、上記スクリプトは VMware + Ubuntu Linux 16.04 LTS上でも動いた。Linux上ではデフォルトインストール状態で動いてしまうのだな…。ズルイ…。

#3 [anime] SWITCHに米林監督が出てたのか

知らなかった…。見損ねた…。知ってたら予約録画しておいたのに…。再放送しないのかな…。

2017/09/17() [n年前の日記]

#1 [pi3d][python][raspberrypi] pi3dのキーボード入力はちょっと使い物にならないかも

pi3d のキーボード入力について調べてるのだけど。

コレ、ゲームを作るには機能が足りなくて、使い物にならない気配。他モジュールと組み合わせてどうにかできないかとググっているけど、解決策が見つからない…。

Windows + pi3d、あるいは、Linux + pi3d なら、pygame と併用すればなんとかなると分ったけど。Raspberry Pi + pi3d の場合、解決策が見つからなくて…。

問題点。 :

Raspberry Pi + pi3d の場合、pi3d はキーボード入力を調べるために curses を使うので、以下の問題があって。
  • 押されているキーを1つしか調べられない。複数キーが同時に押されてることを判別できない。
  • 何のキーが押されたか、という情報しか得られない。キーが離された瞬間を得ることはできない。

この2点がどうして問題になるのか、図で描けば分かるだろうか…。

pi3d_keyboard_fail.png

例えばだけど、カーソルキーの上と右を同時に押したら自機が斜めに移動する、という処理ができない。二つのキーが同時に押されてることを判別できないから。これではレトロ風の2Dスクロールシューティングゲームすら作れない。

また、「キーが押された瞬間」しか取得できないのも厳しい。一応、オートリピートがかかるから、連続して動いてるような「気分だけ」は得られるけど、最初の1回目に反応した直後、ピタッと止まるのが厳しい。これではインベーダーゲームやパックマンすら満足に作れない。また、各環境のオートリピート設定によって、それぞれ移動速度が異なってしまう可能性もある。

pi3d_keyboard_ss.gif

pygame_keyboard_ss.gif

いやまあ、一応、「キーが押された瞬間だけ取得できる」という仕様でも、どうにかできないこともないけれど。動きを止めるためのキーを別途用意しておいて…例えばテンキーの5を押すと動きが止まるとかってお前は _FM-7 か! 21世紀にもなってFM-7ライクな操作仕様はないだろう…。

pi3d というライブラリ・モジュールは、あくまで、OpenGL ES を使って3Dモデルを簡単に描画できますよ、というモジュールなのだろうなと。それ以外の使われ方を想定していない気がする。少なくとも、リアルタイムゲームの類をコレで作れるかも、てなことは考えてないのではないかなあ。だって、あり得ない。キーボード入力周りの、こんな仕様。あり得ないよ。

Raspberry Pi専用スクリプトにすればどうにかできるのかも。 :

_pi3d.event.Event の動作サンプルスクリプト、 _pi3d_demos/TestEvents.py を Raspberry Pi上で実行すると、
  • キーを押した瞬間
  • キーのオートリピートが働いてキー入力がされた瞬間
  • キーが離された瞬間
それぞれが取得できてるように見えるので…。Raspberry Pi専用を前提にして処理を書いてしまえば、少なくとも、「タッ……タタタタ」ではないキー入力はできるのかもしれない。実際、 _pi3d_demos/DogFight.py も、そのやり方でキー入力をチェックしてるようで、実例は既にある。

ただ、そのやり方は、Windows や Linux では使えないので…。
  • Windows と Linux は pygame を併用する処理を、
  • Raspberry Pi は pi3d.event.Event を使った処理を、
それぞれ分けて書くしかないなと。

でもまあ、考えてみれば、そもそも OpenGL が使える環境なら ―― Windows も Linux も Raspberry Pi2/3 も OpenGL を使えるのだから、それらの環境では PyOpenGL だの pyglet だのを使ってこの手のソレを書けばいいわけで、あえて pi3d を使わなくても、という気がしてくるし。

Raspberry Pi1 や Zeroシリーズはメモリが少なくて OpenGL を使えないから、代わりに OpenGL ES を使う pi3d はどうでしょうか、という話なわけで、だったら、pi3d を使うってことは、Raspberry Pi専用スクリプトとして書いちゃって問題ない場面じゃねえの、と割り切ってしまうのもアリかもなと。

これがもし、Pi1/Zero/Zero W でも OpenGL が動いてくれるなら話が簡単になるのだけど…。そこは難しい事情があるのだろうな…。

pygameウインドウの上にOpenGL ESを乗せるわけにはいかんのだろうか。 :

Raspberry Pi用の Minecraftは、フツーのウインドウを表示したその上に、OpenGL ES のレイヤーを位置合わせして配置して描画をしてるらしいけど。

pi3d も、似たようなことができないのだろうか。pygameのウインドウを生成して、そのpygameウインドウの位置に OpenGL ES のレイヤーを置いてソレらしく見せるとか。それができれば、Windows、Linux、Raspberry Piで共通して動かせるスクリプトを書けそうだけど…。描画以外は、pygame の機能をそのまま使えばいいわけだし…。

考えが甘いかな。かもしれん。何か罠が潜んでそう。

ちなみに、Raspberry Piの描画関係については、以下のやり取りで紹介されてる画像が分かりやすかった。フツーのLinuxのデスクトップは X.Org と GLX が繋がってるけど、raspbian は X.Org と EGL が繋がってないからウインドウの移動に OpenGL ES が追従してこないのだ、等が説明されてる。

_Graphics Acronyms & What works with what? - Raspberry Pi Forums

#2 [prog] Processing 3.3.6 x64をインストール

Raspberry Pi上で Processing(Proce55ing) 3 が動くという話を見かけたのでインストールしてみようと思ったのだけど。その前に Windows上でインストールしてみたほうがいいのかなと。てなわけで、Windows10 x64上に、Processing 3.3.6 x64版をインストールしてみたり。

_Processing.org
_Download - Processing.org

processing-3.3.6-windows64.zip をDLして解凍。任意のフォルダに移動。processing.exeを実行。少なくとも、IDEはフツーに起動してくれた。

JavaScriptモードが動かない。 :

IDEウインドウ右上の「Java」のボタンをクリックすれば、他のモードに切り替えられるのだけど。Javaモードはあるけれど、JavaScriptモードが見当たらない。いや、正確には、Processing 3.0.2 の頃に使ってた JavaScriptモード 0.4.0 が動かないというか。切り替えるとIDEが落ちる。

色々ググってみたけど、どうも昨今の Processing は、「JavaScriptで動かしたい? p5.jsモードを使えや」ということになってる雰囲気。

ちょっと愚痴。 :

元々 Processing は Java Appletモードを持ってたけど。ある時期、「Java Appletモードは捨てるわ」「どうせお前等、Webブラウザ上で動かしたいだけなんだろ?」「だったらJavaScriptでいいじゃん。JavaScriptモード入れといたわ。これで文句ねえだろ」ということになって。

Java Appletモードが無くなったのは、まあ、いい。死兆星が見えてたし…。今では Oracleですら「Java Appletは推奨しねえ」と言ってるし、今時のWebブラウザでは動かなくなったしで、消えるのも仕方ない。けど、その代わりに入ったはずの JavaScriptモードがこんなことになるのは…なんだかちと釈然としない。

JavaScriptモードは、 _Processing.js を利用して、Processing のソースファイルである .pde を読み込んでブラウザ上で動かすのだけど。 _p5.js は、「Webブラウザ上で動かしたいのにわざわざJava風に書いてるんじゃねえよ糞が。最初から JavaScriptっぽく書きやがれ」てなライブラリらしくて。

なんだか言語習得コストを低く見積もってる気がする。どういう層にProcessingをオススメするのかを考えたら、.pde がそのまま動くほうがいいのでは…。

でもまあ、おそらく p5.js のほうがパフォーマンスも多少は期待できる、等のメリットがありそうだし。JavaScript をベタで書くより p5.js を利用したほうが楽になると踏んで p5.js を作ったのだろうから、習得のハードルは、さほど高くないのかもしれない。

それに、
「Processing.js は昔の Processing の言語仕様しかサポートしてないので、昨今の Processing のソースを渡しても再現できない」
「Processing.js を使いたかったら Processing旧版を使え」
てな話も見かけたわけで。なるほど…それじゃ仕方ないよな…。

ていうか、なんで Processing.js が追従してこないのだろう。 _Releases - processing-js/processing-js を眺めるとバージョンは上がってるようだけど…。

2017/09/18追記。 :

JavaScriptモードについて追記。

_0.3.3 NOT Compatible with Processing 3.0 - Issue #35 - fjenett/javascript-mode-processing で、Processing 3.1以降でも JavaScriptモードを使えるかもしれない方法が書いてあった。
  • JavaScriptMode 0.4.0 をDLして解凍。
  • スケッチブックの場所\modes\ 以下に、JavaScriptMode というフォルダごとコピー。
  • 〜\modes\JavaScriptMode\template\ 以下に、template というフォルダを作成。
  • そのフォルダの中に、processing.js と template.html を移動。
  • 〜\modes\JavaScriptMode\template\ 以下に、sketch.pde という0バイトのファイルを作成。
これで、JavaScriptモードに切り替えても、IDEが落ちることはなくなった。

ただ、ソースを打って実行しようとするとエラーが表示される。また、ブラウザ上でも動かない。やはり対応できてないっぽいなと。

一応、Processing 2.2.1 と、Processing 3.3.6 では、異なるスケッチブックの場所を設定できるので…。 *1 Processing 2.2.1 と 3.3.6 で異なるモード構成にできるから、JavaScriptモードも使いたいなら 3.3.6 とは別に 2.2.1 をインストールしておいて、そちらを使って解決することも可能。とメモ。

*1: C:\Users\ユーザアカウント名\AppData\Roaming\Processing\preferences.txt の中に、sketchbook.path= と sketchbook.path.three= の指定があって、3.3.6 は後者を参照する。

#3 [web][neta] twitterのアカウントがロックだか凍結だかされてた

いつの間にか、twitterのアカウントがロックされていた…。ログインすると、「お前ルールに沿わないことしやがったから自動処理でアカウントをロックしたで」と表示されてる…。なんでや…。

○○が無いので手詰まり。 :

「ロックを解除したいなら電話番号を入力して認証しろ」とtwitterのページ上に表示されてるけど。自分、携帯電話はかなり昔に解約したから、電話が無いんですけど…。 *1 フツーに電子メールでやり取り、ではダメなんか…。 *2

携帯電話やスマホを持ってない者は、もはや人間に非ず。基本的人権ですら認められない、みたいな風潮になってきているなあ…。 *3

さようなら、twitter。なのかな。 :

ここ最近、twitterのユーザ対応の奇妙さが話題になって、しかし改善の見込みが見えなくて「この調子では…twitterもいよいよ終わりか…」的に先が危ぶまれているようでもあるし。

また、仕事で使ってる人ならともかく、自分、TVアニメを見ながらたまにぶつぶつと感想をつぶやいてただけだから、アカウントが使えないと仕事上困るというわけでもないし…。こんなのどか(?)な使い方をしてるのに、どうしてアカウントをロックされるのか不可解なんだけど、それはさておき。

てな状況だから、この際twitterとお別れするという選択肢も全然アリ、ではあるのだよなあ…。沈没しそうな船から逃げ出すネズミのノリで…。さようなら、twitter。今までありがとう。みたいな。

とりあえず、真面目なことをつぶやくソレ用と、TVアニメの視聴感想ぶつぶつ用に2つ持ってたけど、真面目用アカウントはロックされてなかったので削除してみたり。そもそもtwitterは一人で複数アカウントを持つことをルール違反としてるらしいので、貴社の提示したルールにちゃんと従った状態にしてみましたよ、これで文句ねえだろ、みたいな。

感想ぶつぶつ用は…どうしようもないな…。現状、ロック解除の試みも、アカウント削除もできないのでは、アカウントを放置してサヨナラする以外に選択肢は無いわけで…。

どうしてロックされたんだろう。 :

妙なNGワードでも書き込んでしまったのだろうか。結構気をつけて書いてたつもりなんだけどなあ。なんでも、twitterって「蚊を殺した」とつぶやいただけでもロックされるという噂が…。例えばアニメを見てたら、「ああ…このキャラ…殺されてしまう…誰か助けて…」とかうっかりつぶやいてしまう場面もあるだろうけど。そんなんでアカウントロックとか恐ろしくて使えんわ…。

それとも、アニメスタッフだか、アニメ会社だか、某アニメのファンあたりだかの逆鱗に触れるつぶやきをうっかりしてしまって、裏技とやらを使われてアカウントをロックされてしまったのだろうか…。

自分、基本的にはどのアニメも、比較的褒めてる感じのつぶやきになるよう心掛けてたつもりなのだけどな…。いや、時々うっかりやらかしているだろうなとも思うけど、全体をざっくり眺めれば、この人ポリアンナの生まれ変わりデスカと見紛うほどによかった探し的つぶやきで溢れてるアカウントになっていることであろうよ、などと心の中ではひっそり自負していたのだけど。そうか…まだまだ努力が足りなかったか…。

む。待てよ。もしかして逆なのか? アニメ視聴をしつつ、そこでスタッフの仕事ぶりを褒めてしまったからやられたのか? 「こんなクソアニメを褒めやがって…コイツ許せねえ! 潰してやる!」みたいな。他人様の仕事を迂闊に褒めたら後ろから刺されるとか…日本って、なんて美しい国…。

いや、分かんねえですけど。なんで凍結されたのか具体的な理由が分からんから本当に困る。WebサーバやWindowsすらエラー番号を返すのに。ちょっと酷いなと。調べようがないじゃん。なんでも隠せばいいってもんでもないだろう…。

「○○さんがツイートしました」 :

twitter側でアカウントをロックしたのに、twitterから「○○さんがツイートしました」的宣伝メールが送られてくるあたり、ちょっとイラッとしてきたり。

そうやってそっちからメールをガンガン送ってきてるのに、なんで携帯電話でしかロック解除の申請はできないとか言い出すんや。 *4 お前が送ってきたこのメールは何なんだ。ユーザのメールアドレスをお前はちゃんと知ってるじゃねえか。どうしてコレ使って解除申請できないんだよ。どういうシステムだよ。

みたいな。コレ、ちょっと…いや、かなりイラッとするなあ。

もっとも、今現在残ってる人達は、何がどう自動化されてるのか把握できてない可能性もありそうだなと邪推したりもして。であれば、どうしようもないよな。まるでイデオンよろしく超古代文明の遺産を仕組みも分からず使ってる状態、とか。twitterはSFだったのか…。

*1: 家族全員で使ってる固定電話はあるけど、この場合、固定電話じゃダメだろう…。「その電話番号にショートメッセージを送り付けてやるぜ!」って書いてあるし。黒電話でソレ受け取れるの? 無理でしょ。最初から「電話」じゃなくて「携帯電話」と書いとけよ。ぷんすか。
*2: ていうかページに「通信料が発生する可能性が〜」って書いてあるけど電話代?はそっち持ちじゃないんかい。お前一体どこの国から電話をかけてくるつもりなんだよ。怖いよ…。今時ダイヤルQ2詐欺紛いをしないだろうな…。
*3: いやまあ、社会全体でそういう流れにしていくという合意があるのであれば、それはそれで別に構わんけど、だったら生活保護みたいに国が最低限のアレやソレを国民一人一人に配布、てな流れにしないといかんのではないか…。もちろんそんなことするより、各サービスに他の連絡手段用意させといたほうが国にとっては安上がりだろうから「国民全員にスマホ持たせるとかアホか」と思うのだけど…。いや、もしかすると逆なのかな。全員に配布しちゃったほうが関連ビジネスが活性化して経済的には云々てな展開もあり得るのかな。少なくともスマホメーカは喜ぶか。って日本のスマホメーカほとんど残ってないじゃん。ダメじゃん。どの国を儲けさせるつもりなんだ。
*4: や、ググってみたら、ヘルプから辿って云々な手段もあるらしいけど…。ググらなきゃ分からないあたり、ソレ裏技の域に入りかけてないかと…。しかも、運が良ければ通るかも、結構時間かかるよ、等の説明もあるし。いやまあ、一応試しておきますけどね…。効果あるのかなコレ…。

#4 [web] マストドンが気になる

マストドン(Mastodon)なるサービス? ツール? が気になる。アレってどの程度twitterの代わりになるんだろう…。twitterのアカウントがロックされてしまったのを機に、引っ越しするか…。

と思って少し調べてみたのだけど。どうやらアカウントを持ってる人じゃないと、ローカルタイムラインとやらを閲覧することすらできない、そんな気配。閉じてるなあ…。うーん。

銀河通信がイイ。 :

自分、誰でもその気になれば見れる場所でぼそぼそとつぶやく行為が好きなので、アカウントを持ってないと閲覧すらできないというサービスは、ちょっと。「アカウントなんて無くても誰でも覗き見できまっせ」な感じじゃないと厳しい。

要は、 _銀河通信 をしたいわけで。いや、 _ボトルメール とでも言えばいいのかな。誰かに届くのかもしれないし、誰にも届かないのかもしれない。届く可能性もあるけれど、届かない可能性も高い。そういうつぶやきをポツリポツリとしたい。そのためには、誰でも見れる仕様じゃないと。オープンな場所じゃないと。

アカウントを持ってる人達しか見れないサービスでつぶやいてたら、まるで押し入れに入ってぼそぼそ呟いてるも同然で、ガチで只の危ない人になっちゃうよなと。ていうかそんなのローカルHDDに書き溜めておけばいいだけで、わざわざWeb上で書き込む意味なんて無いよな、てな極端な印象すら持っていたりして。

いやまあ、知人友人がたくさん居るリア充さんなら、「閉じてるほうが仲間内でコミュニケーション取りやすいじゃん」と言い出すだろうけど。悪かったな。俺は知人友人がほとんど居ないんだよ。だからそういう利用スタイルを自分に当てはめてイメージすることができないんだよ。笑えよ。さあ笑え。いや、泣けよ。泣いてくれよ。ていうか自分が泣いていいですか?

ということで、もしかしてマストドンってリア充さん御用達のツールなのでは、という疑念が若干自分の中で…。だとしたら、自分にとって望んでるソレとはちょっと違うんだよなあ…。

個人専用twitterって無いのかな。 :

個人がガッツリ何かしらの意見を世界に向かって公開、となると「blogでも使えば?」という話になっちゃうけど。そこまで大層なことをつぶやきたいわけではなくて…。だって、アニメ見ながら「この幼女…可愛いのう…これは兵器になるレベル…」とかアホなことをつぶやいてるだけだし。

twitterと同程度に、140文字前後の制限を与えつつ、しかしblogのように全世界に向けて公開できて、書き込んだ時間もメッセージと共に併記されるからちゃんとログになってる、そういうサービス、あるいはCGIの類って無いのかなと。書き込み内容がGoogleの検索結果にも出てくるよ、閲覧についてはオープンだよ、閉じてないよ、どこかの一社が管理してるせいで不可解な理由により突然アカウントを削除されたりしないよ、みたいな。

需要が無いか…。無いよな…。あるわけねえか…。

と思ったけど、 _ミニブログ を探してみればいいのかな。

ミニブログと呼ばれるソレを、いくつか辿ってみたけど、結構各サービスが消えてるような。blogやwikiと同様、これもまたブームは去った、てな感じなのだろうか…。改めて調べてみたら、その手のサービスが出現したのって2007年前後らしいし。そりゃ大半が死滅…するわな…。

考えてみたらtwitterの代替サービスなんてあるわけないか。「バルス」に耐えるシステムだもんな…。そういうところは凄いんだよな、twitter…。

2017/09/18(月) [n年前の日記]

#1 [prog] Kuinなるプログラミング言語を少し触ってみたり

Kuinなるプログラミング言語が公開されてるらしいので、なんとなく触ってみたり。Windows専用のプログラミング言語。エディタ付き。

_Kuinのダウンロードと紹介 - プログラミング言語「Kuin」 - Kuina-chan
_Kuinチュートリアル1 はじめてのKuin - プログラミング言語「Kuin」 - Kuina-chan

第一印象。 :

エディタがついてるあたりはグッドだなと。 _HSP_Small Basic 等もそうなのだけど、これさえDLすればとりあえず始められる、てのは初学者向けを意識した場合、超大事だなと思ったり。導入ハードルは低ければ低いほど好ましい。

とりあえず、チュートリアルを眺めつつ写経してみたけれど。

  • 「=」が「::」だったり。
  • 「0xffffff00」が「16#FFFFFF00」だったり。
  • 「@」だらけだったり。
  • 1行書くたびに頭に「do」が入ったり。

う、うむ…。どうしてこうなった…。

疑問に思ってドキュメントを眺めてみたら、どれもこれも設計理由が書いてあった。どうやら Pascalの圧倒的なコンパイル速度を強く意識したことで、Pascal由来の記述や、コンパイル処理の最適化に繋がる不思議な記述が増えたっぽい。言われてみれば、たしかにコンパイル速度が速い、ような気もする。

既存言語をガン無視してこうなったのかなと邪推したけど、むしろ逆のようで。C、Pascal、Basic、Python等を例に出しつつ設計理由を説明してあったので、色々意識しまくったら結果こうなったのだ、ということらしい…。

感想。 :

(感想には個人差があります)

個人的には、一つの言語と各種ライブラリを揃えるパワフルさに、まず素直に脱帽。よくまあここまで作れるなあ…。言語・環境を作れる人達って尊敬します…。

ただ、しかし。コンパイル速度と、ソースの入力のし易さを優先した結果、可読性が悪く、また、他の言語に移行しづらい独特な記述スタイルになって、習得しても潰しが効かない、そんな雰囲気も感じてしまったり。ていうかぶっちゃけ、「そんなにPascalが大好きなら、Pascalそのままじゃダメなのかのう…」などと身も蓋もないことを…。

でもまあ、プログラマーって、えてしてこういう方向に最適化しちゃう人が多いから…。意味のある文字列を打つより謎記号を1文字打って済んだほうが早いだろ、みたいな。Markdownとwiki記法を比較して「Markdownは機能が少ないからダメだ」「wiki記法のほうが文字数が少ない上に機能も豊富だから優れている」みたいな判断を下すノリとでもいうか。それはそれで分かるし、そういう方向性もアリと言えばアリだよなと。

もっとも、自分は…。ソースの可読性が悪くなったらバグが混入する可能性が高くなって、結局デバッグ作業で余計に時間がかかるのだから、打鍵数の少なさを気にしてもアレだし、まともなIDEを使えるなら打鍵数は意外とどうでもよくなるし、自分が最後までそのソースをメンテナンスできるとも限らないから、となると優先すべきは、誰でもざっくり眺めただけで「ハイハイ。なるほど」と理解できる優れた可読性を実現することだろうし、そのためには既存言語への慣れを積極的に利用して奇抜な記述・文法は最小限に、などと思ってしまうのだけど。

とは言えもちろん、色んな言語があったほうが色々なことに気付けるし、多様性があったほうが面白いので、こういう言語が存在することは当然肯定するわけですが。いいぞもっとやれ。みたいな。

プログラミング言語マニアの意見感想を、眺めてみたい気もする…。例えば、屈指の言語マニアであろうRuby作者様あたりが言及したら、全然違う視点やアイデアがチラチラ見えてきて、めっちゃ勉強になるのだろうな、などと妄想を。

(感想には個人差があります)

サンプルソースのウインドウサイズ。 :

言語仕様とは全然関係ない話だけど。チュートリアルのソースや、サンプルソース群で指定されてる、1600x900というウインドウサイズに首を捻ったり。何故、このサイズ…。

この話は長くなりそうなので、別記事でメモ。

#2 [prog] サンプルソースのウインドウサイズについて少し考え込んでしまったり

Kuinというプログラミング言語を少し触ってみた際に、チュートリアルのソースや、サンプルソース群で指定されてる、1600x900というウインドウサイズに首を捻ってしまったり。何故、あえて、そのウインドウサイズを選んだのだろう…。

というのも、サンプルの類は、興味を持ってくれた人達に、「コレはこういうことができますよ」と伝える・宣伝するためのソレだから、できるだけ多くの環境で動かせることを意識したほうがいいだろう、であれば、そこで指定するウインドウサイズは、どの環境でも表示できるサイズであることが望ましいのではあるまいか、と自分は思っているからで。

例えば…。ペルソナだか顧客ストーリーだかを提示してみるけど…。

小中学生がお小遣いやお年玉を貯めて、自分専用のノートPCを買ったとする。あるいは、親御さんにお願いしてノートPCを買ってもらうとする。

お小遣いやお年玉で買えるPCとなれば、それほど高額でゴイスなスペックのPCは選べないだろう。だって、他にも買いたいものがたくさんあるはずだし。

あるいは、親御さんが子供に買い与えるとしたら、最初からゴイスなPCは買わないだろう。子供が使うのだからと、比較的安いPCを「とりあえず」で選んでしまうのではないか。

ということで、安いノートPCの画面解像度を眺めてみると…。

_価格.com - ノートパソコン スペック検索・性能比較

1366x768とか、1280x800とか、そんな画面解像度のノートPCがゴロゴロしてる。つまり、そのぐらいの画面解像度のPCを、お子さん達が入手している可能性は否定できない。

さて、そのお子さんが、「えっ? コレを使うとゲームが作れるの!?」と、めっちゃワクワクしながら、何かしらのプログラミング言語・ツール等をDLしてインストールしたとして。

期待に胸を膨らませながら、サンプルソースを実行してみたら、1600x900でウインドウがバーン。1366x768の画面解像度のノートPC上で、1600x900のウインドウがバーン。

そのお子さんはどう思うだろうか。「クソが!」「画面(ウインドウの中身)が全部見えないじゃん!」と思うわなと。印象最悪ですがな…。どんなに言語やライブラリを作り込んでいたとしても、サンプルのウインドウサイズが1600x900だったというただそれだけで「コイツ使えねー」扱い。トホホ。

であるから、サンプルの類は、あまり大きなウインドウサイズを指定しないほうが良いのだろうなー、と自分は思うわけで。

じゃあ、どの程度のウインドウサイズならいいのか。一般的にこの手のソレは、640x480とか800x600が多いような気がする。 _Windows 10 のシステム要件と仕様 を眺めると、「最低でも800x600のディスプレイを用意してくれよな」と書いてあるし、 _Windows 8 と Windows 8.1 のシステム要件 を眺めると、「1024x768は欲しいッスねー」と書いてあるので、どんなに酷い環境でもWindowsを使ってる以上、640x480や800x600のウインドウサイズなら確実に表示できるはず。

でも…。2Dゲームっぽい何かしらを表示したいとなると、今時、640x480なんてちょっと寂しいよね、悲しいよねえ、Windows95を使ってた時代ならともかくねえ、てな印象が無きにしも非ず。

もうちょっとリッチに行きたいよなあ…。であれば。一昔前のゲーム機の「HD画質」てのは1280x720だったらしいし、TVアニメ制作時の解像度も1280x720だったりするらしいので、せめてその程度はあってもいいんじゃないか。800x600のディスプレイを使ってる人には「ゴメン!」するしかないけれど、いくらなんでも今時そんな環境は少数派だろう。大体は、最安ノートPC群の1366x768や1280x800のディスプレイが最低ラインじゃないかしらん。だったら、1280x720のウインドウが表示できるよなと。たぶんできると思う。できるんじゃないかな。

てなことを考えながら、普段、サンプルスクリプトのウインドウサイズを640x480とか1280x720で指定してる自分からすると、なんでコレ1600x900にしたんだろうなー、と疑問に思ってしまったわけです。

まあ、大きな画面でグリグリ高速に動いたらビックリしてくれるだろう、てなノリかなと想像したりもするのですが。でも、「クソが!」と思われちゃったら元もこうもないよな…。みたいな。さて、どうなんですかね。

いやまあ、そもそも今時の子供さんは「ゲームを作れるの!?」なんてワクワクしないだろ、と根底から否定されそうでもあるけど。「ゲームを作る…? うへえ、メンドクサ…」としか思わないんじゃないか…。ワクワクするのって、ファミコンで遊んでたおじさんぐらいじゃないの…ってソレを言っちゃあ…。

サイズが変えられるのがベストではあるのだろうな。 :

そういえば、cocos2dを触っていて感心した点があるのだけど。 _特定のショートカットキーを押す と、フルスクリーン表示とウインドウ表示を切り替えられたり、FPS表示のON/OFFができるあたりが便利だなと。640x480の小さいウインドウで表示されても、ショートカットキーを押すだけで全画面表示される。迫力満点。大体にして、そのあたりの機能はえてして必ず欲しくなるものだし、最初から機能として実装済みのほうがいいよな、毎回個別に実装するのもアレだよなとも思えるわけで。cocos2dって、そういうところは賢い。

あるいは、昔のTVゲームのエミュレータ関係を試用してみると、ウインドウサイズを自由に変更できるものがたまにあったりして感心したり。ウインドウ内のドット絵がボケたりジャギったりするデメリットはあるものの、画質よりゲーム画面の大きさを優先したい人は、ウインドウ枠をドラッグするだけで目的が果たせる。こりゃ便利。

考えてみれば、ウインドウサイズ変更、ウインドウ表示とフルスクリーン表示の切り替え、てなあたりは、PC上で動かしてるからこそ得られるメリットなのだよな…。家庭用ゲーム機で、そういうことはフツーできないわけで。

例えばWebブラウザなどは、Ctrl+ + や Ctrl + - を叩くとページが拡大したり縮小したりするけれど。そういう機能を盛り込んでみた2Dゲーム制作ライブラリ、なんてのも実はアリだったりするのかもしれないな、てな妄想を。

そして、そういう機能があれば、サンプルソース内のウインドウサイズの指定なんて、結構どうでもいい話になるはずで…。ウインドウサイズを変更できない作りが前提になってるから、デフォルトサイズってかなり大事ですやん、という話になっちゃうけれど、ユーザがいつでも好きなように変更できるなら、デフォルトサイズはなんでもいいよね、ということに…。

などと書いているうちにふと気づいたけど。Kuinのウインドウって、枠をドラッグしてサイズを変更すると、中に描画されたアレコレもサイズ変更されるのだな…。ああ、なるほど。それで最初から件のサイズが指定してあるのか。見えなかったら枠をドラッグして小さくすりゃええやん、と。そういうことか…。

となると残る問題は、ユーザがその機能の存在に気づくかどうか…。自分は、「いやー言われなきゃ気付かないんじゃないか?」とネガティブな想像をしちゃうけど、作者さん的には「何言ってんだよ気づくに決まってるだろ。だからこれで問題無し」と思っているからこのサイズ、なのだろう…。

まあ、例えばフルHDのディスプレイを使ってる環境等では迫力が感じられるサイズなので、「迫力があるほうが訴求力もある。だからこのサイズがグッド」てな判断もアリなのかもしれず。

しかし、迫力があるほうがいいなら、最初からフルスクリーン表示のほうが更に良かったりしないか。と思ったけど、その場合は終了のさせ方が分からなくて「クソが!」と思われちゃうか…。なかなか難しい。

てな感じで、サンプル類のウインドウサイズ決定って、考え込んでしまうと意外とどこまでも悩むことができちゃうので、「あーもうめんどくせーからVGA(640x480)で」「こんなところでグダグダ悩んでる暇あったらガンガンソース書いてサンプルの本数増やしたほうがいいわ」てのもアリだよなと思えてきちゃったりなんかしちゃったりなんかして(広川太一郎風に)。

このへん、典型的な _自転車置き場の議論 ですわ。たぶん。

2017/09/19(火) [n年前の日記]

#1 [prog] Pascalについて少し調べてたり

KuinがPascalラブなあたりで、「Pascalってそんなにええもんなんやろうか」と気になり始めて、関連情報をググっていたり。自分、Pascalって触ったことないので分かんないのですよね。

_Pascal - Wikipedia

「var x : int」の記法は数学っぽい記法とか、コンパイル時に問題を見つけるために強く型付けとか、それなりに理由・メリットがあるのだなと。もっとも、最近 Python や Ruby を触ってばかりの自分には、変数宣言すら億劫に感じられて…。まあ、そのあたり、どこで苦労してどこで楽をするか、てな違いなのかなあ。

Turbo Pascal の原作者・Delphiの開発者、 _アンダース・ヘルスバーグ は、Microsoft に移って _C# を作ってる、てな話が興味深い。Pascal系を使うぐらいなら進化発展形とも言えるC#を使ったほうが、という話になるのか、それとも、いやーどっちも全然違うよー、という話になるのか。

_C#を病的に嫌う者が出現する理由を示す「Pascal踏み絵」仮説 【▲→川俣晶の縁側→ソフトウェア→技術雑記】
_Delphiをかじっている者ですがC#への移行を考えています - 趣味でDelp... - Yahoo!知恵袋
_Pascalは過小評価されている | スラド デベロッパー
_Java対Delphi - 宗教論争にならないように(宗教戦争になってる気もしますが)
_Turbo Pascal - Wikipedia

色々と興味深い。PC-9801のマルチペイントが Turbo Pascal で作られてたなんて知らなかった…。

Windows上で動かせるPascal系って何があるんだろ。 :

今現在、Windows上で動かせるPascal系の言語・環境って何があるんだろう。できれば無料で使えるとありがたいのだけど。

Free Pascal てのがあるみたいだな…。

_Free Pascal - Advanced open source Pascal compiler for Pascal and Object Pascal - Home Page
_Free Pascal - Wikipedia
_WindowsでPascalを走らせる | 葉巻のけむり 高田直樹ブログ

アレ? でもコレ、なんかDOS窓がどうとか書かれてる…。Windows登場以前、DOS時代のソレなのだろうか。

Lazarus なるものもあるらしい。

_Lazarus - Wikipedia
_Overview of Free Pascal and Lazarus/ja - Free Pascal wiki

Free Pascal を使ってGUIアプリを作れるようにしたのが Lazarus、という認識でいいのかな。

そういえば、Delphiの無償版が云々と言う話が以前あったような…。

_Delphi10の無料版が出たので使ってみた - Qiita
_入門者向け「Delphi」「C++Builder」の有償販売が終了、無期限の無償版として公開 - 窓の杜
_[ Delphi の無料ダウンロード版 ] - Mr.XRAY

昔は有償でしか使えなかったけど…。今は無償版が使えるのであれば、第一候補はDelphiってことになりそうな。

と思ったけど、第一候補と言ったら、Visual Studio + C# になるのだろうか。一応 Pascal の血を継いでいるらしいし…。今は、個人使用なら無料で使えるし…。そもそも、死にかけてないし。

_ダウンロード | IDE、Code、Team Foundation Server | Visual Studio

Webブラウザ上でPascalが動くらしい。 :

Webブラウザ上でPascalが動いたりせんのかな、と思ってググったら。

_懐かしの「Turbo Pascal」がブラウザで動く!!
_Turbo Pascal

マジか。試してみたらホントに動いた。スゲー。

そして、エディタの使い方が分からねえ。終了のさせ方すら分からんわ…。

#2 [prog][neta] 「:=」の謎

C言語系は、変数に値を代入する際に「a = 10;」みたいな書き方をするのだけど。どうして Pascal は「a := 10;」みたいな書き方をするのか気になったり。

ググってたら、なんとなく分かってきた。

_数学記号の表 - Wikipedia
「A := X」は、A という記号の意味するところを、X と定義することである。

数学記号の表 - Wikipedia より

数学の「定義」を示す記号から来ていたのか…。代入の意味じゃないのだな。

そもそも数学では、「a = 10」と書いたら「a と 10 は等しいんだよ」てな意味だと思うけど、プログラミング言語の場合、「=」は「a に 10 を格納するよ」という意味で使われる(ことが多いように見える)ので、おかしいと言えばおかしいのだよなあ…。一体どの言語から、「=」を「等しい」の意味ではなく、代入の意味として使い始めたんだろう。

Pascalは本当に「:=」にしたかったのだろうか。 :

歴史や思想を知らないので、頓珍漢なことを書いてるかもしれんけど。もしかして、Pascal も、「:=」ではなく「=」にしたかった可能性はないのかなと。コンパイル処理の高速化を検討した際に、「=」より「:=」のほうが速く処理できるので、泣く泣く、仕方なく、「:=」にした、みたいな。いや、泣く泣く、てのは違うか。おそらく「数学の『:=』と同じ意味になる。一石二鳥だ」と思った可能性のほうが高そうか。

当時の言語群は、このあたりどれが主流だったのかを調べてみないと、ちょっと分かんないな…。大多数が「=」だったのであれば、Pascalも「=」にすることを検討したのだろうし。どれもてんでバラバラだったなら、Pascalだって「=」のほうが望ましいなんて欠片も考えなかったのかも。

Pascalの作者は、 _ニクラウス・ヴィルト氏 だけど、どこかに記録が残ってたりせんのかな。何かの講演で語ってたり、著作でちょっと触れてたり、そういう記録があれば…。

全然関係ないけど。 _ヴィルトの法則 を目にして、なんだか色々と思い当たるというか…。

むしろ「:=」のほうがメジャーだったのかも。 :

む。 _ALGOL のソレを眺めていて気が付いた。そもそも、Pascalが参考にしていたALGOLからして「:=」だったのか。すると、Pascalを作る時に、そこで初めて勝手に「:=」にしたわけじゃなくて…。既存言語の真似をしただけ、ということか…。

ALGOLと同世代の言語らしい _FORTRAN は、「=」を使ってるな…。

C言語の前身のB言語は、ALGOLの影響を受けている、とされているけど。 _Thompson's B Manual を眺めると「=」になってる、ように見える。どうして「:=」が「=」になったんだろう…。

B言語が影響を受けたとされる _BCPL は…。この時点では「:=」を使ってるなあ。

つまり、プログラミング言語って元々は「:=」を使うのが主流で、「=」を使うのはマイナー派だった。ところが、C言語がドーンと普及したことで逆転したのです。ということになるのだろうか。

ホントかな? なんだか怪しい。自信無し。このあたり、歴史を知ってる詳しい人がどこかで解説してたりせんのかな…。

特殊記号と可読性。 :

ALGOLが、当時のコンピュータでは扱えなかったはずの特殊記号の数々を用いてソースを記述する案を出していた、てなエピソードがなんだか興味深かったり。

当たってるかどうかは分からんけど、そんなことを検討したのは、おそらく可読性を高めることを重要視していたから、だろうと想像したりもして。既存の記法が存在するなら、ソレをそのまま使ってソースを書けたほうが可読性は高まるだろう、てのは自然な発想だよなと。そして、その証拠の一つとして、「:=」が存在するのではあるまいか。

となると、Kuinの「::」が、Pascalを参考にしたと言いつつも、実は本質的なところでPascalどころかALGOLすら全く参考にしていないことも見えてくる。既存の記法からむしろ距離を置き、新規に異なる記法を学習することを利用者に強要する記法なわけで…。極端な評をすれば、人間にとって分かりやすい記法ではなく、コンピュータにとって分かりやすい記法を選択したとすら言える。コンパイル速度という、コンピュータにとって分かりやすい処理を追求したが故に「::」になったのだから…。人間がコンピュータを奴隷にするのではなく、人間がコンピュータの奴隷になるよう自ら歩を進めてみた言語仕様。それを端的に表すのが「::」…だったりするのかもしれない。まあ、あくまで、ひょっとすると、ぐらいの話だけど。

その方向性を更に発展させてみたらどうなるのだろう、てな興味も湧いてしまったり。あらゆる面で、人間様の都合など考えず、とにかく処理速度を追求したらどんな言語になるか、みたいな。例えば、「var」も「do」も「if」も、1文字の特殊記号で置き換えてみたらどうなるだろう。可読性は全く無くなる代わりに、コンパイル速度とソース入力速度だけは爆速に。それはそれで使い道が出てこないか。

それはおそらく、漫画やアニメに出てくる魔導書だの、SF作品でチラチラ出てくる「高速言語」なるものにどことなく近づきそうな気もするわけで。扱える者は圧倒的に少数だが、詠唱寺間が短く、効果も絶大、みたいな。さすがはお兄様です。的な。

アレ? ソレ、ひょっとして、LISP系じゃないのか…。コンピュータの仕組みに合わせた最適化を、わざわざ人間様がソースを書く時点で肩代わりしてやる、あのLISP系…。なるほど、LISP最強ってのは、そういうことでもあるのかな。LISP最強と言いつつ、実態はLISPが最強なのではない。LISPをスラスラと扱える俺様が最強なのだよ。みたいな。

コレ、たぶん、詳しい人が見たら怒り出しそうなことを書いてそうな、そんな不安が…。「いい加減なことを書くんじゃねえ!」と怒ってしまった方は、はてな匿名ダイアリーやQiitaあたりで正しい見方・捉え方・歴史を書いてくれると助かるッス。

#3 [prog] Visual Studio Community 2017 をインストール

Pascal について調べてたら、なんだか C# を触ってみたくなってきて、勢い余って Visual Studio Community 2017 をWindows10 x64上にインストール。

インストール時に必要な機能について選べるけれど、最低限の機能だけを選んだつもりでも6〜7GBぐらい使われるようで。コレ、32GBとか64GBのeMMC等の環境では使えないなあ。まあ、そのあたりのスペックのPCって、何かしらのデータの再生用であって、開発用ではないのだろうけど。

少し触ってみたけど、考えてみたら今のところコレで何かを作りたいわけでもないし…。HDDの空き容量が想像してた以上に減ってしまったのも痛いので、Visual Studio Installer を起動して、一旦アンインストール。必要になったらその時にまたインストールしよう…。そもそも 2015 が既に入っているし…。

#4 [pc][cg_tools] CELSYSフォルダをDドライブに移動してみたり

お絵かきソフトの CLIP STUDIO PAINT (Windows版)は、マイドキュメント\CELSYS\CLIPStudioCommon\ の中にDLした素材等を保存してくれるのだけど。マイドキュメントがCドライブにあると、Cドライブの空き容量が減ってしまうわけで…。

以前、CELSYSフォルダをDドライブに移動してシンボリックリンクを張ってみたのだけど、その時は動作が怪しくなって元に戻してしまった記憶が。でも、今時のバージョンはどうなってるのかなと、試しにDドライブに移動してシンボリックを張ってみたり。

む。ちゃんと素材が読み込めている…ような気がする。もしかして改良されたのかな? それともWindows10がそのあたりをイイ感じに処理してくれるようになったのだろうか。何にせよ、これでCドライブの空き容量が少し増やせそうな気配。助かった。ありがたや。

ちなみに、CLIP STUDIO PAINT 1.5.5 から、素材の保存先をユーザがカスタマイズできる機能が追加されていたようで。

_CLIP STUDIO PAINT Ver.1.5.5 / CLIP STUDIO ACTION Ver.1.5.5アップデータ公開のお知らせ | CLIP STUDIO
_素材のインストール先について | CLIP STUDIO PAINTの要望・不具合ボード | CLIP STUDIO

2012年頃から要望が出ていたけど、2016年にようやく実装、てな経緯があったのだな…。

これから使う人は、ちゃんと公式に機能がついてるから困らなくて済むのだな。

#5 [web] twitterアカウントのロックを解除してもらえた

携帯電話を持ってないからちょっと諦めてたところもあるのだけど、巷で紹介されてる、ヘルプ経由でロック解除の手続きを試してみたら、解除してもらえたようで。助かった。と言ってもアカウント削除をするために解除してもらったようなものだけど。

ログを一応バックアップ。 :

とりあえず、今までのつぶやきをまとめてダウンロードできる機能がtwitterにはあるらしいので、それを使ってローカルにログをダウンロード。

ログを眺めてみたら…自分、意外とそこそこ面白いことつぶやいていたんだなあ。
モフルンのライバルキャラとしてヌルヌルした感触のヌルルンとか出てこないかなって出してどうする…いや…もしかすると既に本編で登場した可能性があるのかな…ちゃんと見てないから分からない… #precure #nitiasa
確信した。この人、バカなんじゃないかな。

JavaScriptフル活用なのだな。 :

感心したのは、DLしたログの実体が全部 .js だったこと。JavaScript ってそんな使い方もできるのか…。いや、JavaScriptを使ってるプログラマーにとっては、こんな使い方は常識なのかもしれないけれど。

また、ローカルのログに対しても検索できてしまうようで。どうしてそんなことができるんだ…。全ログを、ブラウザにオンメモリで読み込んである、とか?

こういう使い方ができるなら、blog等の各記事にJavaScriptでコメント機能をつけるのも技術的には可能だったりするのかもしれない。と思ったけど、その場合Google検索で拾ってくれるんだろうか。

_GoogleはAjaxで読み込むコンテンツを解釈してくれるのか? | briccolog|渋谷区神宮前のウェブ制作会社ブリコルール

現時点では、JavaScriptで生成されたテキスト情報もクロールしてくれるのか。まあ、考えてみれば、そりゃそうか。Google自身がAjax活用のトップランナーだったもんな。そりゃ対応しないと…。何にせよ、昔と違って今ならそういう実装も状況的に可能ってことか…。

ちなみに、ログは .csv でも保存されてた。至れり尽くせりで感心。twitterって、こういうところは、ホント凄いなあ…。そりゃ代替サービスが見つからないわけだ…。でも理由不明でアカウントをロックされちゃうけど。ぎゃふん。

アカウント削除に成功。 :

とりあえず、アカウント削除もできた。今までありがとう…twitter…。

と言いつつ、結局代替が見つからなくて、またアカウントを取りそうな予感もあるのだけど。「バルス」に耐えるシステムは…魅力的だよなあ…。これで奇妙なアカウントロック等が無ければなあ…。

2017/09/20(水) [n年前の日記]

#1 [pi3d][python][raspberrypi] pi3dでキーボード入力をするあたりを実験中

Raspberry Pi や Linux 上で動かすときは pi3d.InputEvents を使って、Windows上で動かすときは pygame を使って、キー入力を取得できるかどうかを実験中。

クラスを作る時に、このクラスはこういうメソッドが必要になる、みたいなソレを定義する何かがあったような…。Python ってそういうの無いのかな…。もしかして、抽象クラスってのがソレなのかな。

#2 [web] 今のtwitterは携帯電話が無いとアカウントが取れないのか

twitterのサイトでハッシュタグで検索しても、TLの流れ方がどうもしっくりこなくて。閲覧目的で、一応アカウントを取っておいたほうがいいのかなと思えてきて、新規アカウントを作成しようと思ったのだけど。

メールアドレス等を入力した次のページで、必ず、電話番号の入力を求められる…。携帯電話持ってないから入力できないのですけど…。メールアドレスだけ奪っておいてその先通行止めとか、酷いな…。

回避策があるのだろうかとググってみたら、昔は回避策があったようだけど、今は携帯電話を持ってないとアカウントが取れないようで。SPAM業者対策らしいので仕方ない気もするけれど。しかし、他にやり方ないんかな。と言っても自分も名案は思いつかないけど。

やはり、携帯電話を持ってない者は人間に非ず、てな風潮になってきているなあ…。

アカウント、削除したのは失敗だったのだろうか。でも、一度ロックされると、その後は監視対象になって、頻繁にロックされるという話もどこかで見かけたし。結局ロックされるのでは、残しておく意味も無いわけで…。

twitterアカウント取得代行業者、とかどうだろう。 :

この状況なら、商売になるんじゃないか。

ならないか。どうせSPAM業者が押し寄せて結果無茶やってtwiiterから対策されて一般利用者が無駄にとばっちりを受けて、とかなりそうな。

#3 [nitijyou] 腹痛で目が覚めた

寝ている最中に腹痛で目が覚めて。急いで起きてトイレに駆け込んだら、息が苦しくなってきて、意識朦朧。体は冷たいのに感覚的に熱い。脂汗だらだら。てな状態に。意識を失う前にトイレから這いずり出して、しばらく床に倒れ込んだまま、動けるようになるまで待つ羽目に。

年に何回か、こういうことがあるな…。

おそらく、体全体は眠っているのに、胃腸だけは活発に動いてて、起きたばかりの状態で胃腸が「血液よこせ! 緊急事態なんだよ!」と主張するものだから、他の部分に血液が回らなくなって…。みたいな状態なのかなと勝手に想像しているのだけど。

もしかすると、胃腸じゃないのかもしれない。内臓の何かしらが腫れ上がったり悲鳴を上げて、それが胃腸から来る信号に似てるものだから、てな可能性もあるのかも。

何にせよ、寝てる最中に腹痛が来ると、「またか? またなのか?」と怖くて怖くてしょうがない…。

2017/09/21(木) [n年前の日記]

#1 [pi3d][python][raspberrypi] pi3dでキーボード入力をチェックするあたりがなんとかなったかも

pi3dでキーボード入力をチェックすると、「タッ……タタタタ」となったり、同時押しが検出できなかったりした件について。pi3d.InputEvents を使って、少しはマシになるような処理を書いてみたり。

一応、Windows、Ubuntu Linux 、Raspberry Pi Zero W上で、同じように動くことを確認できた。と言っても、Windowsはpygameを、Linux と Raspberry Pi は pi3d.InputEvents を使うように処理を分けてあるけど。

以下は、Raspberry Pi Zero W 上で撮ったスクリーンショット。ホントは動画で見せないと動きが伝わらないけど、デスクトップを動画としてキャプチャする方法が分からない…。でもまあ、とりあえず、画面が出てることぐらいの証拠にはなる…かな…。ちなみにキャプチャには、 _raspi2png を使った。

get_keyboard3_ss_raspi0.png

以下は、Ubuntu Linux 16.04 実機上で動かした際の様子を動画でキャプチャ。キャプチャには、 _SimpleScreenRecorder を使った。



「タッ……タタタタ」な動きになってないこと、及び、斜め移動ができてる=キーの同時押しを検出できてることぐらいは伝わるかなと。

ソース。 :

以下、WASDキーかカーソルキーで、スプライトを動かすだけのスクリプト。ESCで終了。

_get_keyboard3.py
_airplane_01_64x64.png
u"""
pi3d input keyboard with pygame or InputEvents sample.

Sample script to get keyboard input.
Move the sprite up, down, left and right with WASD key or cursor key.

use pygame.key.get_pressed / pi3d.InputEvents.

Press ESC key to exit.

Windows10 x64 + Python 2.7.12 32bit + pi3d 2.21 + pygame 1.9.3

Author : mieki256
License : CC0
"""
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals
import pi3d
import pygame


class KeyboardStatus(object):
    u"""Keyboard status."""

    # referenc :
    # pi3d/event/Keys.py
    # https://www.pygame.org/docs/ref/key.html
    keys_list = {
        "KEY_ESC": pygame.K_ESCAPE,
        "KEY_A": pygame.K_a, "KEY_B": pygame.K_b, "KEY_C": pygame.K_c,
        "KEY_D": pygame.K_d, "KEY_E": pygame.K_e, "KEY_F": pygame.K_f,
        "KEY_G": pygame.K_g, "KEY_H": pygame.K_h, "KEY_I": pygame.K_i,
        "KEY_J": pygame.K_j, "KEY_K": pygame.K_k, "KEY_L": pygame.K_l,
        "KEY_M": pygame.K_m, "KEY_N": pygame.K_n, "KEY_O": pygame.K_o,
        "KEY_P": pygame.K_p, "KEY_Q": pygame.K_q, "KEY_R": pygame.K_r,
        "KEY_S": pygame.K_s, "KEY_T": pygame.K_t, "KEY_U": pygame.K_u,
        "KEY_V": pygame.K_v, "KEY_W": pygame.K_w, "KEY_X": pygame.K_x,
        "KEY_Y": pygame.K_y, "KEY_Z": pygame.K_z,
        "KEY_0": pygame.K_0, "KEY_1": pygame.K_1, "KEY_2": pygame.K_2,
        "KEY_3": pygame.K_3, "KEY_4": pygame.K_4, "KEY_5": pygame.K_5,
        "KEY_6": pygame.K_6, "KEY_7": pygame.K_7, "KEY_8": pygame.K_8,
        "KEY_9": pygame.K_9,
        "KEY_UP": pygame.K_UP, "KEY_DOWN": pygame.K_DOWN,
        "KEY_LEFT": pygame.K_LEFT, "KEY_RIGHT": pygame.K_RIGHT,
        "KEY_SPACE": pygame.K_SPACE
    }

    class PygameKeyStatus(object):
        u"""Keyboard status with pygame."""

        def __init__(self):
            """Init."""
            pygame.init()

        def update(self):
            """Update."""
            pygame.event.pump()
            self.keys = pygame.key.get_pressed()
            pygame.event.clear()

        def key_pressed(self, key_str):
            """Get key press state.

            @param key_str key kind string
            @return True or False

            """
            return self.keys[KeyboardStatus.keys_list[key_str]]

        def close(self):
            """Close."""
            pygame.quit()

    class Pi3dInputKeyState(object):
        """Keyboard status width pi3d.InputEvents."""

        def __init__(self):
            """Init."""
            self.inputs = pi3d.InputEvents()

        def update(self):
            """Update."""
            self.inputs.do_input_events()

        def key_pressed(self, key_str):
            """Get key press state.

            @param key_str key kind string
            @return True or False

            """
            return (self.inputs.key_state(key_str) != 0)

        def close(self):
            """Close."""
            pass

    def __init__(self):
        """Init."""
        self.keyboard = pi3d.Keyboard()
        if pi3d.USE_PYGAME:
            self.state = KeyboardStatus.PygameKeyStatus()
        else:
            self.state = KeyboardStatus.Pi3dInputKeyState()

    def update(self):
        """Update."""
        self.pikey = self.keyboard.read()
        self.state.update()

    def key_pressed(self, key_str):
        """Key press check.

        @param key_str key kind
        @return True or False

        """
        return self.state.key_pressed(key_str)

    def esckey_pressed(self):
        """ESC key press check.

        @return True or False

        """
        return (self.pikey == 27 or self.key_pressed("KEY_ESC"))

    def close(self):
        u"""Close."""
        self.keyboard.close()
        self.state.close()


display = pi3d.Display.create(w=640, h=480, frames_per_second=60)
shader = pi3d.Shader("uv_flat")
camera = pi3d.Camera(is_3d=False)

x, y, z = 0.0, 0.0, 20.0
tex = pi3d.Texture("airplane_01_64x64.png", mipmap=False)
spr = pi3d.ImageSprite(tex, shader, w=64, h=64, x=x, y=y, z=z)
display.add_sprites(spr)

inputs = KeyboardStatus()

while display.loop_running():
    inputs.update()

    spd = 6.0

    if inputs.key_pressed("KEY_W") or inputs.key_pressed("KEY_UP"):
        spr.translateY(spd)
    if inputs.key_pressed("KEY_S") or inputs.key_pressed("KEY_DOWN"):
        spr.translateY(-spd)

    if inputs.key_pressed("KEY_A") or inputs.key_pressed("KEY_LEFT"):
        spr.translateX(-spd)
    if inputs.key_pressed("KEY_D") or inputs.key_pressed("KEY_RIGHT"):
        spr.translateX(spd)

    if inputs.esckey_pressed():
        inputs.close()
        display.destroy()
        break

少し説明しておくと…。

pi3d を import して pi3d.Display.create() で初期化をすると、pi3d.USE_PYGAME という変数に値が設定される。pygame を使ってたら True、使ってなかったら False。

なので、その変数を見て、pygame を使ってたら pygame でキーボード情報を取得。pygame を使ってなかったら pi3d.InputEvents でキーボード情報を取得するようなクラスを作成した。

上記のソースでは、KeyboardStatusクラスの中で、pygameを利用するクラスと、pi3d.InputEvents を利用するクラスの2つを用意して、pi3d.USE_PYGAME を見てどちらかを選んでる。

問題点。 :

pygameを利用した場合はコレと言って問題はないのだけど。pi3d.InputEvents を利用した場合は少々問題があって。OSの、キーボード入力やマウス入力を、全部奪ってしまうっぽいのだよな…。なので、以下のような怖い状態に。
  • Ctrl + C を押してもスクリプトが止まってくれない。
  • マウスを動かしてもマウスカーソルが動かないから、ウインドウの閉じるボタンを押せない。
更に、pi3.InputEvents を使うと、pi3d.Keyboard、pi3d.Keyboard.read() が働かなくなるような気がする。

であるから、何かしらのキーを押せばスクリプトが終了するような処理を、必ず、絶対、メインループに入れておかないといけない。それをうっかり忘れてスクリプトを動かしたが最後、デスクトップの操作が一切できなくなるので、電源コンセントを引っこ抜いて強制終了、てなことになる。

てな怖さを考えると…。pi3d が pygame を使えない状態にしてしまう Raspberry Pi上では仕方ないとしても、せめて Linux上で動かすときは、pygame を使って動くスクリプトを書いたほうがいいのでは、と思えたりもして。

ちなみに、pygame を使いたい場合は、pi3d.Display.create() に use_pygame=True を渡せばいい。

_pi3d Package - pi3d 2.21 documentation

pi3d は、現状、以下のような処理をしてる模様。
  • Windows上で動かす場合は、何も指定しなくても pygame が有効になる。
  • Raspberry Pi上で動かす場合は、指定しても pygame が無効になる。
  • Linux上で動かす場合は、指定によって pygame の有効/無効が変わる。

#2 [raspberrypi] Raspberry Pi Zero Wにデスクトップキャプチャツールをインストールしてみたり

Raspberry Pi Zero W 上で、デスクトップをキャプチャしたいなと。ただ、X Windowアプリをキャプチャできるツールの類では、OpenGL ESを使ってるアプリの画面をキャプチャできなくて。Raspberry Pi は、X Window と EGL が繋がってないので…。

ググってみたら、raspi2png なるツールを使えば、OpenGL ESの画面もキャプチャできるようで。

_Raspberry Pi でスクリーンショット | Raspberry Pi
_AndrewFromMelbourne/raspi2png

インストールしてみたり。
sudo apt install libpng12-dev
mkdir ~/Package
cd ~/Package
git clone https://github.com/AndrewFromMelbourne/raspi2png.git
cd raspi2png
make
sudo cp raspi2png /usr/local/bin

使い方は…。

scrotもインストール。 :

X Windowアプリをキャプチャしたいだけなら、scrotなるツールが使えるらしい。

_ラズベリーパイ3の簡単な動作確認 - やってみる

sudo apt-get install scrot

む。既に入ってた。どこかの段階で、自分で入れたのか、それともデフォルトで入っていたのか、どっちなんだろう…。忘れた…。

2017/09/22(金) [n年前の日記]

#1 [dxruby][ruby] DXRubyをブラウザ上で動かせるというDXOpalを試用してみたり

DXRuby作者様のtwitterで、DXRubyをWebブラウザ上で動かせる DXOpal なるものが紹介されていて、なんだか興味が湧いたわけで。試しに動かしてみようかな、と。

_yhara/dxopal: Game development framework for Opal, API compatible to DXRuby
_DXOpal demo
_RubyKaigiで発表しました - yhara.jp
_Presenter notes(Japanese) of https://speakerdeck.com/yhara/ruby-opal-and-webassembly

RubyスクリプトをWebブラウザ上で動かせるように JavaScript に変換してしまう _Opal なるものがあり、それを使うことを前提にして DXRuby の一部を移植、という認識でいいのだろうか…。何にせよ、Ruby + DXRuby スクリプトを、ほんの少し手直しするだけでWebブラウザ上でも動かせる…可能性がある。らしい。たぶん。

ローカルにダウンロード。 :

_yhara/dxopal-game: Demo & Template for DXOpal で、テンプレートファイル群が公開されているので、まずはソレをローカルHDDにダウンロード。

ちなみに自分の環境は、Windows10 x64。

git がインストールされてない環境なら、 _yhara/dxopal-game の右のほうの緑色のボタンをクリックして、「Download ZIP」をクリックすればzipファイルの形で入手できる。後は適当なフォルダの中で解凍すればいい。

自分の環境は git がインストール済みなので、git clone でクローンさせてもらった。何か適当なフォルダを作成してから…。
git clone https://github.com/yhara/dxopal-game.git
これでローカルに、dxopal-game というフォルダが作成されて、その中に一式が入ってくれた。

dxopal-demo で使われている dxopal.min.js はちょっと古いので、 _dxopal/dxopal.min.js at master - yhara/dxopal から dxopal.min.js をダウンロードして、dxopal-demo の dxopal.min.js を上書きしたほうがいいかもしれず。

自分の場合、これも git clone で取得して…。
git clone https://github.com/yhara/dxopal.git
buildフォルダ内の dxopal.min.js を、dxopal-game フォルダ内の dxopal.min.js に上書きコピー。みたいな。

動作確認。 :

とりあえずこの状態で、dxopal-demo/index.html をWebブラウザで開いてみる。
  • Firefoxで開いたら、マウスカーソルをキャラクターが追いかける何かが表示された。動いてるっぽい。
  • Microsoft Edge も、同じように動いた。
  • Google Chrome で開いたら、何も表示されなかった。というのも、Google Chrome はローカルHDD内のJavaScriptをいきなり動かさない設定になってるそうで。Google Chromeの起動オプションに「--allow-file-access-from-files」をつけて、index.html を開く必要があるらしい。
  • IE11 では動かなかった。

自分が書いたスクリプトで試してみた。 :

dxopal-demo フォルダの名前を適当な名前にリネームして、その中の main.rb を書き換えて動作確認してみたり。

昔の日記ページからコピペして実験。自分が書いたソース・作った画像はCC0ってことで。

_dxopal_inchiki_takansetsu (元ネタ: _DXRubyでインチキ多関節を試してみる )

_dxopal_walkenemy (元ネタ: _DXRubyで二足歩行する敵っぽい動きを作ってみる )

_dxopal_rolltaka (元ネタ: _DXRubyで例の多関節を実験 )

元のソースをいきなり読み込ませても動くわけではない模様。修正作業で難儀した。が、それでもなんとか動かせた。

スゴイ。ブラウザ上で本当に、Ruby + DXRuby が動いてる…。あ、いや、実際動いてるのは JavaScript だけど。渡してるソースは Ruby のソレにしか見えないわけで。

分かった点をメモ。 :

今現在気づいた範囲で分かったことをメモ。

読み込ませるスクリプト(main.rb)は、utf8n で書いておく。のだと思う。JavaScriptのソースって、えてしてUTF-8だろうから。

頭のほうに、以下を書く。
include DXOpal
「require "dxruby"」の代わりになる行らしい。「require "dxruby"」は消しちゃっていい。

利用する画像等は、頭のほうで、以下のように書いて列挙しておく。
Image.register(:hoge, 'images/hoge.png') 
Image.register(:piyo, 'images/piyo.png') 
「Window.load_resources do 〜 end」の中で、「img_ufo = Image[:ufo]」みたいな感じで書けば、画像を読み込める模様。

何故か、元スクリプトを module hoge で囲まないと動いてくれなかったりした。… _module って何? 使ったことないので勉強しないと。

てな感じで、おそらく基本的には、以下のような感じの書き方になるのではないかなと。たぶん。自信無いですが。
include DXOpal

Image.register(:hoge, 'images/hoge.png') 
Image.register(:piyo, 'images/piyo.png') 

module hoge

  Window.load_resources do
    img_hoge = Image[:hoge]
    img_piyo = Image[:piyo]
    
    Window.loop do
      # メインループ内の処理
    end
  end

end

現時点では、拡大縮小描画(Window.draw_scale や、Spriteクラスの scale_x, scale_y 等)は未実装らしい。ただ、回転描画(Window.draw_rot や Sprite の angle)は実装済みの模様。まあ、ファミコン、PCエンジン、メガドライブあたりは、スプライトの拡大縮小なんて無かったし…。昔のゲーム機と比べたら回転描画がサポート済みなだけでも御の字状態というか。

DXRuby で使われてる古い名称(?)もサポートしてないっぽい。気付いた範囲では、 _Input.mouse_x はOKだけど、 _Input.mousePosX と書いたらNGだった。

ruby hoge.rb で動かした場合と違って何もエラーが出てこないから、修正作業はかなり面倒臭い印象。

Firefox上で動かしたら滑らかに動いたけど、GoogleChrome上で動かしたら処理落ちしてるように見えた。

サーバ側の設定。 :

WebブラウザでIISにアクセスして動作確認しようとしたら、動かなかった。IISマネージャで、MIMEの種類として、.rb は text/ruby になるように追加設定しないといかんらしい。

Apacheの場合はどうなるんだろう…。.htaccess に、
AddType text/ruby rb
とでも書いとけばいいのだろうか。分からんけど。でも、そういう風に書いちゃうと、Rubyで書かれたCGIが動かなくなったりしないのかな。 *1

*1: いやまあ、自分のアカウントでは、Rubyで書かれたCGIは存在しないはずなので問題にはならないけど。以前、Rubyのバージョンが上がったら、Rubyで書かれたCGIが動かなくなって、サーバ上でRubyを動かすのはやめてしまった記憶が…。やっぱりCGI(スクリプト?)を書くなら後方互換性を大事にしてるPerlを使うべきなんだろう。と思ったけどPerl6があったっけ…。まあ、別言語扱いらしいけど…。

2017/09/23() [n年前の日記]

#1 [pi3d][python] pi3dで3Dモデルを表示したいのだけど

pi3dで独自の3Dモデルを表示したいのだけど、どうしたらいいのかなと。

_pi3d_demos/BuckfastAbbey.py を眺めると…。models/Buckfast Abbey/BuckfastAbbey.egg を読み込んでるようだなと。

_shape Package - pi3d 2.21 documentation を見ると、.egg か .obj を読み込めるらしい。

eggファイルって何だろう。 :

.egg ファイルって…何だ? ググってもPythonのeggファイルしか出てこないが…。テキストエディタで開いてみたけど、Pythonのソレには見えないな…。

_ヒズメモ |Panda3D(1)
_3階建ての2階角部屋 2nd : ユーティリティー @panda3D

どうやら Panda3D用のデータファイルらしい。

x形式からegg形式に変換する x2egg や、obj形式からegg形式に変換する obj2egg なるツールも存在するらしい。また、blender からeggをエクスポートするYABEEというアドオンもあるようで。

_BlenderとYABEEでPanda3d用にモデルを作る - Py淡
_09th/YABEE: Export models from the Blender to Panda3D game engine
_Converting from Blender - Panda3D Manual

Panda3Dって何だろう。 :

Panda3D って何だろうな。

_Panda3D - Free 3D Game Engine
_Python入門 Pythonのゲームライブラリ
_ニートですが何か? Panda3D-3D作成のフリーソフト-

Python もしくは C++ で使える3Dゲームエンジン、らしい…。

2017/09/24() [n年前の日記]

#1 [python] Panda3Dをインストール

.eggファイル関係について調べるために、Panda3D SDK をインストールしてみたり。ちなみに環境は Windows10 x64。

_Panda3D - Free 3D Game Engine
_Panda3D - Downloads
_Panda3D Software Downloads

インストール手順。 :

現行版は 1.9.4 らしい。Panda3D SDK 1.9.4 をクリックして辿りつつ、Panda3D-SDK-1.9.4.exe をDL。

また、.eggファイルのサンプルがたくさん入ってる art-gallery.zip も一応DL。

Panda3D-SDK-1.9.4.exe を実行。任意のフォルダにインストール。

インストールするコンポーネントを選択できるので、3ds Max plug-ins と Maya plug-ins のオプションは外した。

途中で、「この環境、Python 2.7 が既にインストールされてるんだけど…そのPythonからもPanda3Dライブラリを利用できるようにしてみる? やめとく?」てなダイアログが表示された。一応「はい」を選んでみたら、
Python2.7インストールフォルダ\Lib\site-packages\panda.pth
というファイルが作られた。中には Panda3D へのパスが書かれている。これで、OSにインストールされている Python 2.7 から Panda3Dが使えるようになったらしい。

また、インストールが終了すると、ユーザー環境変数の PATH に、以下が追加された。
Panda3Dインストールフォルダ\python
Panda3Dインストールフォルダ\python\Scripts
Panda3Dインストールフォルダ\bin
これで、DOS窓からPanda3D関係のツールをいきなり呼び出せるようになった。

サンプルの動作確認。 :

Panda3Dインストールフォルダ\samples\ 以下にサンプルが入っているので動作確認ができる。

Panda3D には python と名前が衝突しないように、リネームした ppython.exe が入っていて、ソレを使うと Panda3Dが動かせる。例えば 〜\samples\infinite-tunnel\ に入って ppython main.py を実行すると、トンネルが表示された。

eggへの変換ツールについて。 :

Panda3Dインストールフォルダ\bin\ 以下には、他の3Dモデルデータファイルを .eggファイルに変換するツールも入ってる模様。
dae2egg.exe
dxf2egg.exe
flt2egg.exe
lwo2egg.exe
obj2egg.exe
vrml2egg.exe
x2egg.exe
ツール名から想像するに、dae、lwo、obj、x 等から .egg に変換できるのだろう…。試してないから本当に変換できるのか分からんけど。

eggファイルビューワを実行。 :

Panda3Dインストールフォルダ\bin\ 以下の pview.exe を使うと、Panda3Dのモデルデータ形式である、.egg ファイルのプレビュー表示ができる。

_Previewing 3D Models in Pview - Panda3D Manual

pview hoge.egg てな感じで実行できる。

操作は、マウスの左ボタンドラッグで平行移動。中ボタンドラッグで回転。右ボタンドラッグでズーム変更。他にもショートカットキーが色々あるらしい。例えば w を叩くとワイヤーフレーム表示になったりとか。

eggファイルのサンプル。 :

art-gallery.zip を解凍すると、中に色々な .zip が入ってる。解凍すると .egg とテクスチャ画像が入ってるので、Panda3D SDK に入ってる pview を使ってプレビュー表示できる。

それはともかく。art-gallery.zip の中には、どうも著作権的にアウトっぽいモデルデータがチラチラと…。いいのかコレ。まあ、ローカルでの実験に使うだけなら…てなノリなのかな…。

2017/09/25(月) [n年前の日記]

#1 [pi3d][python] pi3dでeggモデルデータを表示しようとしているけれど

どうもよく分からん…。ちなみに pi3d のバージョンは 2.21。Panda3D SDK のバージョンは 1.9.4。Windows10 x64上で動作確認。

ライトが分からん。 :

ライトの位置情報が何を示しているのかが分からん…。位置なのか、向きなのか…。

_pi3d Package - pi3d 2.21 documentation

eggのエクスポートが分からん。 :

blenderと _YABEE を使って、eggファイルをエクスポートして、pi3d で読み込んでみたけれど。2枚使ってるはずのテクスチャが1枚しか反映されない。うーん。eggのプレビュー表示ツール pview を使うと、反映されてる・描画されるのだけどなあ。何故 pi3d 上では反映されないのか。

pi3d は複数のテクスチャに対応してないんじゃないの、と思ったけど、pi3d_demos に含まれてる eggファイルは複数テクスチャを使ってるんだよな…。どうしてそっちは反映されるのだろう…。

obj2eggが分からん。 :

Panda3D SDK に同梱されてた obj2egg.exe を使って、obj から egg に変換・出力してみたけれど。得られた egg を pi3d で読み込もうとするとエラーが出る。そもそも出力された egg の中にテクスチャ情報が含まれていない。形状は表示はされるものの、テクスチャは何も反映されてなくて真っ白なモデルが描画される。うーん。

2006年頃のやり取りでは、「Panda3Dに同梱の obj2egg は mtl(マテリアル情報)やテクスチャには対応してないぜ」という話が出てる。

_Panda3D - View topic - obj no texture

すると、Panda3D をお使いの皆さんは、一体どうやってeggファイルを作っているんだ? objファイル以外を経由して変換してるってこと?

_Models and Actors - Panda3D Manual

「Panda3Dの開発者はMaya使ってるからそれ以外は知らねえ」みたいなことが書かれてるな…。Mayaってどのくらいの価格なんだろう、とググってみたら1年契約で22万円。Panda3Dの開発陣って…金持ちじゃのう…。

x2eggも分からん。 :

blender から .x でエクスポートして、その .x を x2egg で egg に変換してみたけれど。pview で表示するとちゃんと表示されてるのに、pi3d で読みこんで表示するとポリゴンの表裏が反転してしまう。また、相変わらずテクスチャは1枚しか反映されず。

ちなみに、x2egg のヘルプは x2egg -h で表示できるっぽい。

そもそもobjでもいいんだけど。 :

まあ、pi3d は obj + mtl も読み込めるし、それならテクスチャが2枚とも反映されてるので、無理して egg を使わなくても obj を読ませればいいじゃないか、という気もしているのだけど。パンが無いならお菓子を食べればいいじゃない。

前述の、Panda3Dのフォーラムでも、「objを読み込ませればいいじゃん」みたいなことを言われてるし。しかし、すると、何のために egg形式を作ったのやら。他のモデルデータ形式では何か問題があるから、新規にモデルデータフォーマットを考え出したのとちゃうんか…。もしかしてアニメーション関係かな。obj + mtl ではアニメーション情報を含めることができないし。

#2 [nitijyou] 市の健康診断に行ってきた

10:00に出発。10:47頃終了。

いつもは暑い時期に受けてた印象があるのけど。今年は1ヶ月ぐらい遅い時期になってた気がする。その代わり、別の場所が今年は早い時期になってたけれど。どういう事情があるのだろう。実は毎年、時期を微妙にシャッフル、でもしてるのかな。

毎回思うけど、採血はどうにかならんのかな…。21世紀になったのだから、無痛の採血手法が発明されてもよさそうな…。人類の科学はまだまだ全然進歩が足りてない。

2017/09/26(火) [n年前の日記]

#1 [pi3d][python][raspberrypi] pi3dでeggを使う際の注意点

pi3dで、複数のテクスチャ画像を使っているeggモデルデータを表示しようとすると、テクスチャが一枚分しか反映されなくて悩んでいたのだけど。

正常に描画される _pi3d_demos内の egg の中身を眺めているうちに、なんとなく原因が分かってきた。

ちゃんと表示されるeggデータは、どうもテクスチャ画像毎にポリゴン群をグループ化しているようで。例えば以下のような感じでデータが並んでる。
テクスチャAを使ってるグループ
  ポリゴン群データ
グループ終わり

テクスチャBを使ってるグループ
  ポリゴン群データ
グループ終わり

テクスチャCを使ってるグループ
  ポリゴン群データ
グループ終わり

対して、blender + YABEE でエクスポートした、テクスチャがちゃんと反映されないeggは、テクスチャ毎にグループ分けなんかしてなくて。
グループ
  このポリゴンはテクスチャC
  このポリゴンはテクスチャB
  このポリゴンはテクスチャC
  このポリゴンはテクスチャA
グループ終わり

Panda3D SDK の pview でプレビュー表示すると、後者のeggも描画されるので、おそらく Panda3D の eggフォーマットとしては後者もサポートされていてしかるべき、なのだろうと想像するのだけど。

ただ、pi3d の場合、OpenGL ES を利用するライブラリだから、テクスチャ画像毎に描画していかないと描画パフォーマンスが出ない等の理由で、あらかじめデータ側で、テクスチャ別の並びで整理整頓しておいてくれないと困る、てな事情でもあるのかもしれない。

でもまあ…。 ということで、今後 egg は使わない、というノリで触っていこうかなと。 *1

ちなみに、blender からエクスポートした obj + mtl は、マテリアル別=テクスチャ別にポリゴン群がまとまって並んでいるので、pi3d が egg に望んでる仕様 ―― テクスチャ別にグループ分けして並べろ、的な仕様は、obj + mtl の場合既に満たされている可能性が高い。 *2
*1: そもそも、不人気で死兆星が見えかけてる気配があるPanda3Dが独自に策定したフォーマットなんて、できれば触りたくないし。
*2: もっとも、blenderのエクスポータはテクスチャ別に並べているけど、他の3DCGソフトのエクスポータはそういう仕様になってない可能性があるので、obj + mtl ならとにかくOKというわけではなさそう。

#2 [pi3d][python][raspberrypi] pi3dで3Dモデルデータを描画

とりあえず、pi3d で 3Dモデルデータを描画できた。ような気がする。

以下は、Raspberry Pi Zero W + pi3d 2.21 で動作確認した際の様子。デジカメで撮影したから画質が汚いけど、動いてることぐらいは分かるかなと。



結構滑らかに動いてる。OpenGL ESってスゴイ。もっとも、画面が出てくるまで随分時間がかかってるけど…。そのあたりは Raspberry Pi Zero W だから仕方ない、のかな。

ソース。 :

ソースは以下。

_draw_model.py
_モデルデータ(models.zip)

モデルデータは解凍して、ソースに対して models/*.obj となるように置いてもらえれば。自作データだからライセンスはCC0ってことで。

u"""
pi3d draw model sample.

モデルデータ(.obj + .mtl or .egg)を描画してみるサンプル。
ESCキーで終了する。

Windows10 x64 + Python 2.7.12 32bit + pi3d 2.21
"""
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals
import pi3d

# ウインドウ生成
display = pi3d.Display.create(frames_per_second=60)

# ライトを設定. position, color, ambientを指定
light = pi3d.Light(lightpos=(10.0, -10.0, -5.0),
                   lightcol=(1.0, 1.0, 1.0),
                   lightamb=(0.3, 0.3, 0.3),
                   is_point=False)

# シェーダを生成
shader = pi3d.Shader("uv_light")

# カメラ生成
camera = pi3d.Camera.instance()

# モデルデータを読み込み
# modelpath = "models/cube_quad_tex2.obj"
# modelpath = "models/robo_01.obj"
modelpath = "models/robo_02.obj"
# modelpath = "models/cube_quad_tex2.egg"
# modelpath = "models/robo_01.egg"
# modelpath = "models/robo_02.egg"
my_model = pi3d.Model(file_string=modelpath,
                      name="my_model",
                      rx=0, ry=0, rz=0,  # rotate
                      sx=1.0, sy=1.0, sz=1.0,  # scale
                      x=0.0, y=0.0, z=4.0  # position
                      )

# モデルのシェーダを設定
my_model.set_shader(shader)
# my_model.set_light(light)

# キーボード取得用クラスを生成
keys = pi3d.Keyboard()

# メインループ
while display.loop_running():
    camera.reset()

    # モデルを描画
    my_model.draw()

    # モデルを回転
    my_model.rotateIncX(0.25)
    my_model.rotateIncY(1.0)

    if keys.read() == 27:
        # ESCキーが押されたら終了
        keys.close()
        display.destroy()
        break

少し解説。 :

モデルデータの読み込みは、以下のような感じで指定するらしい。
my_model = pi3d.Model(file_string="モデルデータへのパス",
                      name="モデルのID(名前)",
                      rx=0, ry=0, rz=0,  # 回転角度
                      sx=1.0, sy=1.0, sz=1.0,  # 拡大縮小率
                      x=0.0, y=0.0, z=4.0  # 位置
                      )
name がよく分からないのだけど…適当な名前でいいのかな。おそらく name を使って他のモデルデータと区別したりするのだろうから、他と重ならない名前をつけとけばいいのではないかと。分からんけど。

モデルデータを描画する際にシェーダが必要になるようなので、シェーダの生成と、モデルデータへの割り当てをする。
shader = pi3d.Shader("uv_light")
my_model.set_shader(shader)
「uv_light」は、「テクスチャ(UV値)を使用 + 照明計算有り」てな処理をするシェーダを指定、ということじゃないかなと。

モデルデータには、カメラやライトも割り当てられるようだけど…。
light = pi3d.Light(lightpos=(10.0, -10.0, -5.0),
                   lightcol=(1.0, 1.0, 1.0),
                   lightamb=(0.3, 0.3, 0.3),
                   is_point=False)

# my_model.set_light(light)
今回試した範囲では、反映のされ方がよく分からなかったのでコメントアウトしてある。

ちなみに、lightpos がライトの位置 or 光線の向き。lightcol がライトの色。lightamb が環境光の色だか強さだか。is_point で、点光源か平行光源だかの指定ができるのだろうか。ホントかな。自信無し。 _pi3d Package - pi3d 2.21 documentation に説明があるので、英語が分かる人は読んでください…。

#3 [nitijyou] 日記をアップロード

気が付いたら、最後にアップロードしたのが2017/09/04だった…。ということでせっせとアップロード。

2017/09/27(水) [n年前の日記]

#1 [raspberrypi] Raspberry Piの画面を動画でキャプチャする方法は無いのだろうか

Raspberry Pi Zero W 上で OpenGL ES を使った際の画面を、動画でキャプチャする方法は無いのだろうか。

今のところ、デジカメで動画として撮影して、Windows機に取り込んで、AviUtl で mov から mp4 に変換してるけど。かなり面倒臭い。一々デジカメと三脚を引っ張り出してセッティングするのがツライ。デジカメにUSBケーブルを差して、PCと接続して、転送が終わったらまたケーブルを外すのが面倒臭い。

ビデオ端子で入力するのはどうか。 :

これがまだ、ビデオ端子から映像出力する機器であれば…。手持ちの、アナログ放送時代のHDDレコーダ TOSHIBA RD-H1 で録画して、録画ファイルをLAN経由でWindowsに転送して…等ができそうだけど。

Raspberry Pi2 / Pi3なら、ビデオ端子用の出力端子を一応持ってるけど。Pi ZeroはHDMIしか持ってないし。たしかそのはず。

HDDレコーダはどうか。 :

HDMI端子から出力されてる映像を録画するとなると…。

手持ちのHDDレコーダ TOSHIBA RD-BZ710 を使って、HDMI経由で送られてくる映像を録画できないかなと思ったけれど、マニュアルを眺めてみてもそんな方法は書いてない。

というか今頃気づいたけど、そもそも RD-BZ710にはHDMI入力端子が無かった。コレ、HDMI出力端子しか無いのか…。昔のビデオデッキの感覚で、てっきり入力端子があるものと思い込んでたけど、この手の機器にそんなものは無いのだな。TV放送をそのまま保存したDR録画ファイルを、別形式に変換する機能しか持ってないのが、一般的なHDDレコーダ、なのだろう…。

HDMIキャプチャボードはどうか。 :

HDMIキャプチャボードを使えば Raspberry Piの画面を動画でキャプチャすることができるらしいけど。Raspberry Piの画面をキャプチャしたいという、ただそれだけのために、HDMIキャプチャボードの類を購入するのも馬鹿馬鹿しい。一応価格を調べてみたけど、Raspberry Pi シリーズの数倍の価格だし…。

本体だけでどうにかならんかな。 :

Raspberry Pi + raspbian で、自力で動画キャプチャできればいいのだけど…。Raspberry Pi上の OpenGL ES 出力結果は X Windowと繋がってないので、Linux上で動作する一般的な動画キャプチャソフトではキャプチャすることができないはず。X Window の画面ならキャプチャできるだろうけど。

また、動画でキャプチャしようとすると、おそらく Raspberry PiのGPUに内蔵されてるjpeg変換機能を使って Motion JPEG の類で保存して、とかなりそうだし、そうなると OpenGL ES を使ってる場合、GPUはそっちで使われてしまうから、jpeg に変換する機能は使えなくなって、さりとて非力なCPUで変換したら速度が足りないし、ベタで書き込めるほど microSD のアクセス速度も速くないしで、かなりの低フレームレートで録画することになりそうな。

まあ、とにかく不便だなと…。何かいい手は無いものか。無いよな。

#2 [prog] luaをインストール

Windows10 x64上に lua をインストールしてみた。以下を参考にして作業。

_Lua の Windows へのインストールと使い方 | プログラマーズ雑記帳

_Lua - Joe DF's Builds から、lua-5.3.4_Win32_bin.zip と srlua-5.3.4_Win32_bin.zip をDLして解凍。任意のフォルダにコピー。環境変数PATHに場所を追加。インストール終了。

使い方をメモ。 :

前述の解説記事に従って動作確認。
  • スクリプトを実行 : lua hello.lua
  • 対話モード : lua - i
  • 対話モード終了 : Ctrl+Z[enter]
  • バイトコンパイル : luac -o hello.luac hello.lua
  • バイトコンパイルされたファイルの実行 : lua hello.luac
  • 実行ファイル(.exe)生成 : glue srluaのPATH スクリプトファイル名 生成ファイル名。ただし lua??.dll が実行ファイルと一緒に必要。
問題なく動いてくれた。

#3 [anime] 「サクラクエスト」最終回を視聴

録画してたソレをようやく視聴。全体の感想をメモ。

色々と興味深いアニメだったなと…。

このアニメは、P.A.WORKSの「お仕事シリーズ」の一つ、「SHIROBAKO」に次ぐ第3弾という扱いらしいけど。個人的には、SHIROBAKOと比べてしまうとなんだか弱いなと感じてしまったところがあって。

どうして弱いと感じるのかを考えてみたのだけど…。「お仕事シリーズ」は、若い女性達が仕事を通して悩んだり成長したり、というのが一つの柱、大黒柱としてあるけれど。SHIROBAKOの場合、ソレに加えて「アニメ業界ってこんなところですよ」と紹介していくあたりが、もう一つの柱になってたなと気付かされたわけで。

「○○業界」を紹介していくというのは、視聴者にとっての異世界を見せていくこと。多くの漫画・アニメ・ドラマで使われているやり方で。「美味しんぼ」「もやしもん」「銀の匙」「のだめカンタービレ」等々、前例はいくらでもある。そういった作品は、それら異世界を分かりやすく紹介することで、視聴者の知的好奇心を満たしつつも、感情的な部分についてはドラマ性を見せることで満たしていく、一粒で二度美味しい的な作りになっていて。

で。SHIROBAKOは二本柱で見せてたけれど、サクラクエストは柱が一本しかないから、そりゃ後者はちょっと物足りないと感じるのも致し方ないよなと。いやまあ、SHIROBAKOが優秀過ぎたというか、目の付け所が美味し過ぎたのだろうけど…。

それとは別に。「町おこし」「限界集落」という問題は、現状ではなかなか正解が見えない話でもあり。主人公達が頑張って、何かしらの結末に繋げたとしても、はたしてこれでいいのか、これで解決したと言えるのだろうか、てな懸念が絶えずついて回るので、見ていてスッキリしないところがあったなと。

逆に考えると、そんな難しい問題をテーマに据えながらも、ちゃんとそこそこ見れる作品にしてみせたのだから、参加した脚本家さん達の手管はスゲエなあと感心せずには居られないわけで。ただただ暗い話にしてしまうのではなく、ところどころで笑いを盛り込みつつ全体のムードを調整していったあたりはさすが、みたいな。巷の話によると、なんでも脚本を2年ほど練ったという話らしいけど、それが本当なら努力の甲斐はあったのではないかと。

何にせよ、P.A.WORKSらしい真面目さが感じられる作品になってた気がするわけで。手放しで絶賛できるほどの出来ではないのだろうけど、箸にも棒にも掛からないというわけでもなく、良作・佳作として扱われてしかるべき、てな作品だったような気がしたり。と言っても、前がSHIROBAKOだったから、「うーん」と思ってしまうあたりは、コレはどうしようもないけれど…。

それはともかく。ところどころで、「アレ? コレって手描きアニメ業界の比喩?」と思ったところもあるのだけど…。そこらへん、意識して重ねて見せていたのだろうか。それとも、たまたま偶然そう見えただけだろうか…。

#4 [anime] 「プリンセス・プリンシパル」最終回を視聴

美少女スパイアニメ、という説明でいいのだろうか…。なんか違う気がする…。

全体の感想としては、面白かったなと…。キャラも立っていてそれぞれにファンがつきそうに見えたし。アクションもガンガン見せられる設定だし。一話完結でエピソードを提示できるから、売れればシリーズ化もできそうだし。美少女キャラで構成したルパン三世、てな印象も。

当初、ガルパンを制作したアクタスというスタジオが絡んでると知って、これは放送を落とすだろうな…と予想してたけど一度も落とさなかったので大変失礼ながらなんだか逆にビックリ。いや、一緒に名前が並んでるStudio 3Hz側が頑張ったということかもしれんけど。そういえば、メインは3Hzだったとどこかで見かけた記憶も…。

重力制御できるガジェット?がなんだか興味深かったり。魔法のようだけど魔法ではないぞ、時間制限もあるし無理すると壊れるから万能じゃねえぞ、みたいなところが実にイイ感じ。魔法だぞ、にしちゃうと何でもアリになっちゃうから…。いやまあ、それはそれで、例えばリトルウィッチアカデミアみたいにテンションだけでガーッとイケたりしてアリではあるけど。しかし、限られたリソース・制約の中で工夫して、「そう来たか。やるなあ」と思わせるソレもアリだよなと。

重力を操る少女の図と言えば、たしかそういうゲームがあったような…。プレイしたことないけど…。ああいう映像って気持ちいいよなと。実写じゃああいうのはちょっと難しい。ワイヤーで吊ってます感が隠せないし。漫画でやると動きが伝わらないから今一つ。自由に動かせるし、動きとして提示できるゲームやアニメだからこそ、堂々と気持ちよく見せることができる設定、のような気が。…あ。考えてみたらラムちゃんなのか。今頃気づいた。道理でイイ感じの映像と思ってしまったわけで。自分、おじさんだから、アレが染み込んじゃってるのだな。

個人的には、お姉さんキャラの父親が出てくる回のラストのあたりで唸ってしまったり。少女達の明るい歌声がバックで流れつつ、しかし画面では、みたいな。上手いというか黒いというかエグイというか。さすがやで…。これもまた考えてみたら、画と音と言う2つの要素を同時に扱える、映像作品という形だからこそ可能な見せ方なのだよな。小説や漫画では音を流せないから、ちと難しい。ああいう見せ方、個人的に好きですわ。

ずっと同じ脚本家さん(大河内一楼氏)が担当してたのに、最終回1話前と最終回だけは脚本が檜垣亮氏に変わったあたりはなんだか気になった。一体どんな事情が…。まあ、本編内でボスが差し替えられたあたりと重なって、なんだかちょっとメタな感じがしてそれはそれで面白かったけど。実況の類を眺めていたら、急にキャラが変わったと感じてしまった人も少なからず居たみたいで、やはり一人の脚本家さんが全話担当すると、それだけで一本筋が通るところがあるのだなと改めて思ったり。と言っても、それもそれでシンドイはずで…。

そういえば、シリーズ構成の大河内氏は、∀ガンダムでアニメ脚本家としてデビューしたのだったか…。∀ガンダムも姫様の入れ替わりがあったわけだけど。当時新人扱いだった氏の中で、∀ガンダムのソレが仕込まれて、熟成されて、こういう形で昇華・アレンジされたのだ、てのは考え過ぎだろうか。

時系列のシャッフルについて。 :

このアニメ、一話単位で、時系列がシャッフルされていて。巷のソレを眺めると、そこに文句を言ってる人も若干見かけたのだけど。

時系列のシャッフルは…。色んな作品が果敢に挑戦してたりするけど、えてして視聴者をある程度振り落とすからなあ…。どうなんだろうなあ…。

昔、EVAの2話を視聴した際、回想シーン使って戦闘の様子を見せてるあたりで、自分は「カッケー」「なんだこの見せ方。イカス!」とシビレタのだけど。後になって友人が「あの回、EVAが2回出撃して戦ってるよね」と言い出して愕然とした記憶が。時間軸の前後を入れ替えると、ついてこれる視聴者とついてこれない視聴者に別れちゃうのだと、その時初めて認識したというか。

かといって、きっちり順々に並べて見せるのが絶対に正解というわけでもないだろうし。だって、EVAのアレを見た自分は「カッケー」と思ってしまったわけだから…。あの見せ方が無かったら、そこで受けた感動も無かったことになっちゃう。分かればそれでいいってもんでもないよな。加えて感動までさせなきゃ商品価値は生まれない。

だから、時系列のシャッフルは難しい。「あ、コレって過去の話か」と気付いて、ある種の感動を受けてる視聴者も居れば、「???」となってる視聴者も居る。前者に合わせると後者が振り落とされるし、後者に合わせると前者はつまらないと感じちゃう。

テクニックを見つけるしかないのだろうなと。例えば仮面ライダーキバは、父と息子の時間軸を並列・交互に見せていくという凝った作りをしていて、プロデューサーはそういう作りってホントにできるのかと不安だったらしいけど。脚本を担当した井上敏樹氏は「手口は色々あるんだよ。俺にまかせろ」みたいなことを言ってたそうで。つまり、テクニックを知ってるかどうか、駆使するかどうかで、どうとでもなるところがあるんだろう。と思いたいなあ。みたいな。

2017/09/28(木) [n年前の日記]

#1 [pi3d][python][raspberrypi] pi3dで独自モデルを描画その2

pi3d で独自モデルを描画する実験をしていたけれど。単にグルグル回してるだけではなんだか物足りないよなと思えてきたので、少しソレっぽい描画を、と。

とりあえず、Raspberry Pi Zero W 上で動かしてみたり。



結構滑らかに動いてくれた。もっとも、簡単な背景モデル x 2 + スプライト x 1枚を描画してるだけだから…。おそらく弾を撃ったらそれだけで処理落ちしそう。

ソース。 :

ソースとモデルデータは以下。CC0ってことで。

_draw_model2.py
_airplane_01_64x64.png
_models.zip

モデルデータは、解凍して、models/*.obj な場所になるように置く。

u"""
pi3d draw model(obj + mtl) sample.

モデルデータ(.obj + .mtl)を描画してみるサンプルその2。
街っぽいモデルデータを読み込んで動かしつつ、
手前のスプライトをWASDキーで移動。
Press ESC key to exit.

- Windows10 x64 + Python 2.7.12 32bit + pi3d 2.21
- Raspberry Pi Zero W + raspbian stretch + pi3d 2.21

Author : mieki256
License : CC0
"""
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals
import math
import pi3d
import pygame


class KeyboardStatus(object):
    u"""Keyboard status."""

    # referenc :
    # pi3d/event/Keys.py
    # https://www.pygame.org/docs/ref/key.html
    keys_list = {
        "KEY_ESC": pygame.K_ESCAPE,
        "KEY_A": pygame.K_a, "KEY_B": pygame.K_b, "KEY_C": pygame.K_c,
        "KEY_D": pygame.K_d, "KEY_E": pygame.K_e, "KEY_F": pygame.K_f,
        "KEY_G": pygame.K_g, "KEY_H": pygame.K_h, "KEY_I": pygame.K_i,
        "KEY_J": pygame.K_j, "KEY_K": pygame.K_k, "KEY_L": pygame.K_l,
        "KEY_M": pygame.K_m, "KEY_N": pygame.K_n, "KEY_O": pygame.K_o,
        "KEY_P": pygame.K_p, "KEY_Q": pygame.K_q, "KEY_R": pygame.K_r,
        "KEY_S": pygame.K_s, "KEY_T": pygame.K_t, "KEY_U": pygame.K_u,
        "KEY_V": pygame.K_v, "KEY_W": pygame.K_w, "KEY_X": pygame.K_x,
        "KEY_Y": pygame.K_y, "KEY_Z": pygame.K_z,
        "KEY_0": pygame.K_0, "KEY_1": pygame.K_1, "KEY_2": pygame.K_2,
        "KEY_3": pygame.K_3, "KEY_4": pygame.K_4, "KEY_5": pygame.K_5,
        "KEY_6": pygame.K_6, "KEY_7": pygame.K_7, "KEY_8": pygame.K_8,
        "KEY_9": pygame.K_9,
        "KEY_UP": pygame.K_UP, "KEY_DOWN": pygame.K_DOWN,
        "KEY_LEFT": pygame.K_LEFT, "KEY_RIGHT": pygame.K_RIGHT,
        "KEY_SPACE": pygame.K_SPACE
    }

    class PygameKeyStatus(object):
        u"""Keyboard status with pygame."""

        def __init__(self):
            """Init."""
            pygame.init()

        def update(self):
            """Update."""
            pygame.event.pump()
            self.keys = pygame.key.get_pressed()
            pygame.event.clear()

        def key_pressed(self, key_str):
            """Get key press state.

            @param key_str key kind string
            @return True or False

            """
            return self.keys[KeyboardStatus.keys_list[key_str]]

        def close(self):
            """Close."""
            pygame.quit()

    class Pi3dInputKeyState(object):
        """Keyboard status width pi3d.InputEvents."""

        def __init__(self):
            """Init."""
            self.inputs = pi3d.InputEvents()

        def update(self):
            """Update."""
            self.inputs.do_input_events()

        def key_pressed(self, key_str):
            """Get key press state.

            @param key_str key kind string
            @return True or False

            """
            return (self.inputs.key_state(key_str) != 0)

        def close(self):
            """Close."""
            pass

    def __init__(self):
        """Init."""
        self.keyboard = pi3d.Keyboard()
        if pi3d.USE_PYGAME:
            self.state = KeyboardStatus.PygameKeyStatus()
        else:
            self.state = KeyboardStatus.Pi3dInputKeyState()

    def update(self):
        """Update."""
        self.pikey = self.keyboard.read()
        self.state.update()

    def key_pressed(self, key_str):
        """Key press check.

        @param key_str key kind
        @return True or False

        """
        return self.state.key_pressed(key_str)

    def esckey_pressed(self):
        """ESC key press check.

        @return True or False

        """
        return (self.pikey == 27 or self.key_pressed("KEY_ESC"))

    def close(self):
        u"""Close."""
        self.keyboard.close()
        self.state.close()


display = pi3d.Display.create(frames_per_second=60)

# ライトを設定. position, color, ambientを指定
light = pi3d.Light(lightpos=(10.0, -10.0, -5.0),
                   lightcol=(1.0, 1.0, 1.0),
                   lightamb=(0.3, 0.3, 0.3),
                   is_point=False)

# シェーダを生成
shader = pi3d.Shader("uv_light")
shader_flat = pi3d.Shader("uv_flat")

# カメラ生成
camera_bg = pi3d.Camera(at=(0, 0, 0), eye=(0.0, 15.0, -4.0))
camera_flat = pi3d.Camera(is_3d=True)

# 背景モデルデータを読み込み
model_path = "models/tiny_city.obj"
my_model0 = pi3d.Model(camera=camera_bg, light=light, file_string=model_path)
my_model1 = pi3d.Model(camera=camera_bg, light=light, file_string=model_path)

# 背景モデルのシェーダを設定
my_model0.set_shader(shader)
my_model1.set_shader(shader)

# 背景モデル位置を初期化
bg_x, bg_y, bg_z = 0.0, 0.0, 20.0
my_model0.position(bg_x, bg_y, bg_z)
my_model1.position(bg_x, bg_y, bg_z - 20.0)

# 背景モデルを少し回転
# my_model0.rotateIncZ(10)
# my_model1.rotateIncZ(10)

# 手前に重ねるスプライトを生成
x, y, z = 0.0, 0.0, 1.0
tex = pi3d.Texture("airplane_01_64x64.png")
spr = pi3d.ImageSprite(tex, shader_flat, w=0.1, h=0.1, camera=camera_flat)
display.add_sprites(spr)
spr.position(x, y, z)

inputs = KeyboardStatus()

# スプライトが画面外に移動しないように境界値を算出
y_limit = 0.45
x_limit = y_limit * float(display.width) / float(display.height)
y_limit -= 0.05
x_limit -= 0.05

# メインループ
while display.loop_running():

    inputs.update()

    camera_bg.reset()
    camera_flat.reset()

    # BGモデルを描画
    my_model0.draw()
    my_model1.draw()

    # BGモデルを移動
    my_model0.position(bg_x, bg_y, bg_z)
    my_model1.position(bg_x, bg_y, bg_z - 20.0)
    bg_z -= 0.3
    if bg_z <= 0.0:
        bg_z += 20.0

    # 手前のスプライトの座標をキー入力で変更
    spd = 0.01
    ang = -1
    if inputs.key_pressed("KEY_A") or inputs.key_pressed("KEY_LEFT"):
        ang = 180
    elif inputs.key_pressed("KEY_D") or inputs.key_pressed("KEY_RIGHT"):
        ang = 0
    if inputs.key_pressed("KEY_W") or inputs.key_pressed("KEY_UP"):
        if ang == 0:
            ang = 45
        elif ang == 180:
            ang = 180 - 45
        else:
            ang = 90
    elif inputs.key_pressed("KEY_S") or inputs.key_pressed("KEY_DOWN"):
        if ang == 0:
            ang = 360 - 45
        elif ang == 180:
            ang = 180 + 45
        else:
            ang = 270
    if ang >= 0:
        rad = math.radians(ang)
        x += spd * math.cos(rad)
        y += spd * math.sin(rad)

    # 画面外に移動しないように座標を補正
    if y >= y_limit:
        y = y_limit
    elif y <= -y_limit:
        y = -y_limit
    if x >= x_limit:
        x = x_limit
    elif x <= -x_limit:
        x = -x_limit

    # スプライトの座標を設定
    spr.position(x, y, z)

    if inputs.esckey_pressed():
        inputs.close()
        display.destroy()
        break

キー入力処理で、ちょっと長くなっちゃってるけど…。そこだけ別ファイルに分けたほうがいいのだろうけど。ていうかコレ、gistに置くべきだったか…。

少し説明。 :

スプライトをWASDキー or カーソルキーで動かせるようにしてみたけれど、画面外に出ていかないように補正するあたりで悩んだり。

色々試してみたけれど、透視変換で描画する場合、ウインドウの縦幅 = 1.0 として扱われる雰囲気。まあ、z値によって1.0より大きい範囲になるけど…。なので、y座標の範囲は、0.5 〜 0.0 〜 -0.5 ぐらいの値を目安にしつつ少し調整、みたいな。

x座標の範囲は…。display.width と display.height でウインドウの横幅・縦幅をドット単位で取得できるので、縦幅を1.0とした際の比率を求めて、それを使ってx座標の範囲も算出、みたいな。

2017/09/29(金) [n年前の日記]

#1 [cg_tools] Poser Pro 11 ダウンロード版を購入

ソースネクストで Poser Pro 11 DL版が、税抜き3,900円、税込み4,212円と、比較的安い価格で売られていたので購入。ちなみに今回は09/30までのweb限定価格、となっていた。

購入理由。 :

前々からPoserに興味はあって、ソースネクストでこの手のキャンペーンがあるたびに、ずっと気にはなっていたのだけど、なかなか踏ん切りがつかなくて。自分、大昔に、たしか Poser2 を購入したことがあるけれど、その頃は結局それほど使わなかったという。なのでおそらく今回購入したとしても、ほとんど使わないまま終わりそうだなと。

しかし…。
  • 例えば、MakeHuman で作ったモデルでは、何かしら描く時の下絵としては今一つだし。
  • CLIP STUDIO PAINTの3Dデッサン人形や、コミPoのソレはアニメ調なので、これまた何か描く時の下絵としては今一つだし。
  • DesignDollはモデル形状がストイック過ぎて、想像力が貧相な自分の頭では完成イメージまで補完しづらいし。
  • DAZ Studio は使い方が分からんし。
ということで、下絵に使える何かを生成できるなら Poser も使い道があるかもと思えてきたわけで。期間限定での安売りだし…。ええい、この際、と。

一応、前述のソフトのDL先・説明ページもメモ。

_MakeHuman | Open source tool for making 3d characters
_MakeHumanのダウンロードと日本語化と使い方メモ | 絵を描いてみる
_デザインドール | 次世代デッサン人形

インストール手順。 :

インストール手順としては…。
  1. まず、ソースネクストから数MByteのプログラムをDL。実行形式の圧縮ファイルらしい。実行して解凍。
  2. 解凍後、解凍されたフォルダ内に入ってるプログラムをまた実行。
  3. Smith Micro ダウンロードマネージャ、というプログラムがDL・インストールされる。Smith Micro は今現在の Poser の販売元。
  4. Smith Micro ダウンロードマネージャを実行。
  5. シリアル番号を尋ねてくるので、Poser 11 のシリアル番号を入力。ここ、ちょっと間違えやすい予感。「ソースネクストにユーザ登録するためのシリアル番号」ではなくて「Poser 11 のシリアル番号」を入れる。
  6. Poser 11 用の色んなプログラムのリストがでてくる。
  7. 「Poser 11 for Windows」の横の「ダウンロード」ボタンをクリック。
  8. 1GB前後のファイルが、1時間ほどかかってDLされた。
  9. 「インストール」ボタンをクリックして、Poser Pro 11本体をインストール。
改めてメモしてみると、面倒臭いな…。

コンテンツの保存場所は、デフォルトの場所ではなく、Dドライブの任意のフォルダにした。

他にも色々なデータがあるようなので、Smith Microダウンロードマネージャで全部ダウンロード、かつ、インストール。ダウンロードだけで2〜3時間ほどかかったような気がする。

少し触ってみたけれど。 :

使い方が分からん…。いや、フィギュアを置いて、服を追加して、カメラ位置変えて、ぐらいはできるけど。ライト位置の調整だの、フェイスの調整だの、そのあたりが今一つ分からず。購入したのは失敗だったかな…。

2017/09/30() [n年前の日記]

#1 [cg_tools] Poserの操作について勉強中

Poser Pro 11 のクイックスタートを眺めながら、操作の仕方を勉強中。

クイックスタートは、ウインドウ→クイックスタートで表示できる。ただし、説明文は英文。

Poserはもう初心者を意識してない気配が。 :

クイックスタートのウインドウの表示仕様は問題があるように感じたり。前面表示(フローティング)か、メインウインドウにドッキングする以外にないのだけど…。

載っている動画サイズが結構大きいので、次々に動画を眺めながらメインウインド上で操作して学習することが難しい。フルHD程度の画面解像度では、ドッキングしちゃうと動画が一部しか見えないし、かといって前面表示にするとメインウインドウが操作できなくなる。動画を見て、実際に操作して確認するたびに、毎回クイックスタートウインドウを閉じなきゃいけない。せめて最小化ボタンでもあれば助かるのだけど…。

クイックスタートを眺めるのはえてして新規ユーザだろうけど。その新規ユーザ向けの機能が、このように問題があるまま放置されてるということは…。どうやら Poser は、新規ユーザが存在する可能性をほとんど考えない、そんなフェーズに到達してしまったアプリになった、ということかなと。ソースネクストで安売りされてた理由がなんとなく分かってきた。

まあ、DAZ Studio が無料で使える現状があるし、高額な3DCGソフトはPoser相当の機能を持ってしまったという話もどこかで見かけたし、アニメ調かつ日本国内ならMMDのほうが軽いし遊べる気配もあるし。こうなるのも仕方ないよな…。

#2 [nitijyou] AliExpressに会員登録してみたらいきなり酷い扱いを受けた

ここのところずっと Orange Pi PC が気になっているのだけど、どうも中国の通販サイト AliExpress でしか売ってない製品らしくて。更に、AliExpress で買い物するには、アカウントというか会員登録が必要らしくて。仕方ないので、購入する前に AliExpress で会員登録をしてみたのだけど。

しかし…。サインアウトしてから、本当に会員登録できたのか確認すべくサインインしようとしたら、「オイてめえ。なんか怪しいことしてやがるな? アカウントをロックしたからな!」と表示されてしまって。オイ…まだ何も買い物してないのに…コイツいきなり何を言い出すのだ…。

一見すると、そのままアカウントの正当性の確認ができるように見えたけど。しかし途中で、「携帯電話番号を打ち込め」「SMS(ショートメッセージサービス)で送られた番号を入力しろ」と言ってくる。

いや、だから…自分、携帯電話を持ってないんだよ…。AliExpressよ。お前もTwitterと同類か。

まあ、AliExpress は中国のサービスだから、「中国人ならスマホか携帯電話持ってるよね。そんなの当たり前だよね。今時スマホも携帯も持ってないとかどう考えても人間じゃないよね。何? 携帯持ってない? ははあ、さてはお前botだろ? 俺様はちゃんと分ってるんだぞフフン」てな感覚でこうなってるんだろうけど。居るんだよ。ココに。携帯電話持ってないけど一応人間に分類されているはずの二足歩行生物が。

アレかな。「スマホも携帯も持ってないヤツはどうせ貧乏人に決まってるからウチの客としては相応しくありませんなあ。どうぞお引き取りください。ペッペッ。オイ誰か塩もってこい」みたいなことなのかなあ。いわゆるドレスコード相当というか…。

Orange Piなんて買わないほうが良いのかもしれない。 :

そもそも、Orange Piシリーズは買わないほうがいいのかもと思えてきたり。
  • OSすら公式から満足に入手できない。
  • そのOSもカーネルはアップデートされないまま放置。
  • 頼みの綱のarmbianも、H3搭載品には対応してるけど、H5搭載品には未対応。
  • GPUの資料がちゃんと公開されてないからドライバの出来がアレで、ハードウェアデコードが働かないらしい。
ハードウェアは激安なんだけど、ソフトウェア面でとにかく不安要素が山盛り満載てんこ盛りという話も見かけるわけで…。

これはきっと神様が、「お前さあ。その気になってるけど、買わないほうがいいぞ。Rapberry Piとは違うんだぞ。コレは面倒臭いぞ。地獄を見るぞ」と親切に誘導してくれたのかもしれん…。そう思うことにしよう…。

しかし、まさか買う前からこんな扱いを受けるとは思ってなかった。さすがチャイナクオリティ。ってわけでもないか。Twitterも同じことやってるし。

#3 [zatta][pc][neta] そもそもその手のワンボードPCを買ってどうするのだ自分は

よく考えてみたら、自分、その手のワンボードPCを買ってみてどうするのだ、という気にもなってきた。

Linuxを触ってみたいだけなら、VMware や VirtualBox 等の仮想PCで動かしたほうが楽だし。Windows10 なら Bash on Ubuntu on Windows があるわけだし。それに、自分の部屋には、Ubuntu Linux を入れたまま埃を被ってるPCが…。あらら。数えてみたら6台もあった。コレ以上要らないだろ…。コイツラを少しは有効活用してやれよ、自分…。

GPIOを使って簡単な電子工作っぽい何かを云々なら、Raspberry Pi3 も Raspberry Pi Zero W も自分の手元に既にあるから、もう十分だし。それに、Orange Pi や PINE64等は、GPIOを扱うためのPythonライブラリ等が Raspberry Pi ほど揃ってないらしいし。

教育用云々なら Raspberry Piシリーズ一択だろうし。Orange Pi だの PINE64 だの Nano Pi だのを教育用として使うわけがない。

OpenGL関係はまず期待できないし。せいぜい OpenGL ES に対応してたら御の字らしいけど、Raspberry Pi 以外はどこまで対応してるのやら。

デスクトップPCとして使うには非力だし。部屋に転がってる、使ってないPCを立ち上げたほうが、まだ使い物になる。

てな感じで、改めて洗い出してメモしてみると、買ってどうするのだ、何に使うのだ、という気分に。

いやまあ、こんなに小さいのに Linux が動いちゃうなんて、もうそれだけでも「欲しい!」…となってしまうところもあるのだけど。

もしかすると、学生時代に小さなPCなんて買えなかったソレがココにきてムラムラと、てな状態なのだろうか。先輩が持ち歩いてたポケコンを見て「いいなー、いいなー」と羨ましがってたソレが、今まですっかり忘れていたけど、どこかでずっとくすぶってたのかもしれないなあ。

以上、30 日分です。

過去ログ表示

Prev - 2017/09 - Next
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project