[夏休みの宿題][IchigoJam] パプリカのスマホ操作

子供(小6)が通っている塾で
マイコンボードIchigoJam(https://ichigojam.net/)を使った
プログラミング講座を受けており
一通り操作ができるようになったようで
今年の夏休みの宿題にそのIchigoJamで制御可能なロボット
paprika(パプリカ)(http://pcn.club/paprika/)を購入して
夏休みの宿題にしてみた
またついでにIchigoJamに取り付ける無線LANボード
MixJuice(http://mixjuice.shizentai.jp/)も購入して
スマホタブレットから操作できるように遊んでみた

パプリカの組み立ては子供が担当
IchigoJamへの5ピンソケットの半田付けだけはこちらで処理
制御プログラムも自分で入力して無事期待どおりに動作することを確認

ここからはこちらの作業だが
MixJuiceの設定でいきなり躓く
http://fukuno.jig.jp/1771
にあるようにどうも1.2.2より古いファームでは
USキーボードでアンダーバーの入力不可となっており
自宅のアクセスポイントのSSIDや事前共有鍵が入力不可
とりあえず職場に眠っていたPS/2の日本語キーボードを借りてなんとか対応
他にはUSBシリアル接続で直接パソコンから入力できそうだったが未確認

無事無線LAN設定が済んだので
http://fukuno.jig.jp/1382
を参考にIchigoJam用のプログラムを作成
スマホタブレットのブラウザから操作するために
簡単なPHPの操作ボタンページも作成
こちらからどうぞ
GitHub - hariki/paprika-remocon
具体的にはスマホタブレットで入力した操作情報をPHPでファイル保存し
そのファイルを1秒毎にIchigoJamとMixJuiceがhttpで取りにくるしくみ
なので最大1秒程度の遅延が起きる
これを例えば0.5秒にするとIchigoJam(?)の動作が不安定になったので
あまり短時間にもできなさそう
本当にリアルタイムで遠隔操作したいなら赤外線センサとかにすべきかも
ファイルに記載されたアルファベットに応じてパプリカが動作しているだけ
なのでプログラムの追加修正でもっと複雑な動作も可能かと思われる

実際に動かした動画がこちら
パプリカリモコン on Vimeo

Raspberry Piにh2oをインストール

Raspberry PiをRaspbian Jessie Liteにアップグレード - kame-tの日記の続き
こちらもメモ程度
Jessieにするとcmakeも3になるのでh2oのインストールOK
方法はh2oのマニュアルhttps://h2o.examp1e.net/のとおり

% sudo apt-get install cmake mruby libmruby-dev bison
% git clone https://github.com/h2o/h2o.git
% cd h2o
% cmake -DWITH_MRUBY=ON
% make
% sudo make install

あとLet's Encryptでサーバ証明書を取得する
これもKazuho's Weblog: Using H2O with Let's Encryptに書いてあるとおり

% git clone https://github.com/letsencrypt/letsencrypt.git
% cd letsencrypt
% ./letsencrypt-auto certonly --standalone \
    --email $EMAIL \
    --domain $HOSTNAME

あとはお好みで

  • /usr/local/etc/h2o.conf
  • /var/log/h2o/{access_log,error_log}
  • /var/run/h2o.pid
  • /etc/init.d/h2o

起動時はmasterモード(-m master)で

Raspberry PiをRaspbian Jessie Liteにアップグレード

以前Raspberry Piのインストールログ - kame-tの日記
インストールログをまとめたが
先日Raspbian Jessie Liteがリリースされたのを受けて
https://www.raspberrypi.org/forums/viewtopic.php?f=63&t=127060
自宅のサーバをアップグレードしてみた

前回同様メモ程度

  • 作業端末でイメージの書き込み
% sudo dd if=2015-11-21-raspbian-jessie-lite.img of=/dev/sdd

サーバ利用するのでIPアドレスを固定に変更
/etc/network/interfacesではなく
DHCPを使うので/etc/dhcpcd.confの設定を下記に変更

interface eth0
static ip_address=192.168.0.xx/24
static routers=192.168.0.oo
static domain_name_servers=192.168.0.oo 8.8.8.8

SSHがデフォルトで動作しているのでリモートで接続

% ssh pi@192.168.0.xx
  • root領域の拡張
$ sudo raspi-config

localtimeは作業PCからscp

$ sudo cp ~/localtime /etc/localtime
$ sudo localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
$ cat /etc/locale.gen
ja_JP.UTF-8 UTF-8
  • apt-get
# apt-get upgrade
# apt-get install postfix
# apt-get install postfix-policyd-spf-python
# apt-get install dnsutils
# apt-get install procmail
# apt-get install fetchmail
# apt-get install telnet
# apt-get install emacs
# apt-get install emacs-mozc
# apt-get install mozc-data
# apt-get install gnupg2
# apt-get install ruby
# apt-get install sqlite3
# apt-get install ruby-sqlite3
# apt-get install ruby-dbd-sqlite3
# apt-get install stunnel4
# apt-get install git
# apt-get install tcsh
# apt-get install screen
# apt-get install ntpdate
# apt-get install pwgen
# apt-get install libssl-dev
# apt-get install ntpdate
# apt-get install squid
# apt-get install pptpd
# apt-get install golang
# apt-get autoremove

pptpdはデフォルトでdisableなので

# systemctl is-enabled pptpd.service
disable
# systemctl enable pptpd.service

不要なサービス起動の停止

# insserv -r rsync
# insserv -r fetchmail
# insserv -r stunnel4
# insserv -r saned
  • ユーザの作成とバックアップからのホーム領域の復元
% rsync -ac bk/home/xx 192.168.0.xx:/home/xx

すでにgit cloneしているので

% cd Mew
% make distclean
% git pull
% ./configure
% make
% sudo make install
% sudo cp /usr/share/emacs/24/site-lisp/subdirs.el /usr/local/share/emacs/site-lisp
  • hyperestraier and qdbm

バージョンは変わらず(T_T)なのでそのまま再コンパイル

% cd qdbm-1.8.78
% make distclean
% ./configure --enable-zlib
% make
% sudo make install
% sudo ldconfig
% cd hyperestraier-1.4.13
% make distclean
% ./configure
% make
% sudo make install
  • fetchmailMewのstunnel用に.certsファイルを作成
$ for i in /usr/share/ca-certificates/mozilla/*; do cp $i ~/.certs/`openssl x509 -hash -noout -in $i`.0; done

動作確認

% openssl s_client -connect imap.gmail.com:993 -CApath ~/.certs/

fetchmailrcはこんな感じ

sslcertck
sslcertpath "~/.certs"

また今回はRaspbianデフォルトのstunnelで接続できた

  • emacsの日本語入力をanthyからmozcへ変更
(require 'mozc)
(setq default-input-method "japanese-mozc")

但し遅い...raspberrypi2なら大丈夫かも

  • cronの設定
  • rsyslogの設定
    • /etc/rsyslog.conf
  • ntpの設定
    • /etc/ntp.conf
  • sshdの設定

イントラネット用とインターネット用デーモン(違うポート番号・公開鍵限定)

Port 22
Port xxxx
PermitRootLogin no
PasswordAuthentication no
Match Address 192.168.0.0/24
    PermitRootLogin without-password
    PasswordAuthentication yes

上位ルータで22番は閉じてハイポートxxxxのみを開放
なおMatchは最下行にする必要あり

わざわざコンパイルしていたが
mackerel-agentのARM版バイナリーはRaspberry PI 2でもさくっと動く - Qiitaみたい
/usr/local/sbin/mackerel-agentにコピーして
/usr/local/etc/mackerel-agent.confをバックアップから復元
/etc/init.d/mackerel-agentを置いて

% sudo insserv mackerel-agent

Raspberry PiでMackerelの続き

本バージョンよりビルドには Go 1.3 が必要となります。ご自分でビルドされ
ている方は、環境のアップデートをお願いいたします。

http://blog-ja.mackerel.io/entry/2014/06/26/164202

おーすごい勢いでバージョンアップしているけど
いちいちビルドしてついていくのはかなり面倒

とりあえずgolang1.3にバージョンアップして
# これは仕方なし
オリジナルのMakefileをコピーして適当なフォルダに置いて

BIN = mackerel-agent

all: clean build test

test: deps
	go test github.com/mackerelio/mackerel-agent/...

build: deps
	go build \
	-ldflags="\
	  -X github.com/mackerelio/mackerel-agent/version.GITCOMMIT `git rev-parse --short HEAD` \
	  -X github.com/mackerelio/mackerel-agent/version.VERSION   `git describe --tags --abbrev=0 | sed 's/^v//' | sed 's/\+.*$$//'` " \
	-o build/$(BIN) \
	github.com/mackerelio/mackerel-agent

install: build
	sudo cp -f ./build/$(BIN) /usr/local/sbin/

deps:
	go get -u -d github.com/mackerelio/mackerel-agent

clean:
	rm -f build/$(BIN)
	go clean
% pkill mackerel-agent
% ln -s ${GOPATH}/src/github.com/mackerelio/mackerel-agent/.git .
% make install

ついでにrcスクリプトも作って

#!/bin/sh
### BEGIN INIT INFO
# Provides:          mackerel-agent
# Required-Start:
# Required-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
### END INIT INFO

PATH=/bin:/usr/bin:/sbin:/usr/local/sbin:/usr/sbin
DAEMON=/usr/local/sbin/mackerel-agent
CONFFILE=/usr/local/etc/mackerel-agent.conf
OPTIONS="-conf=${CONFFILE} -verbose=false"
PIDFILE=/var/run/mackerel-agent.pid
NAME=mackerel-agent

case "$1" in
  start)
    echo -n "Starting $NAME Daemon: "
    start-stop-daemon --start --quiet --pidfile $PIDFILE --background --exec $DAEMON -- $OPTIONS
    ;;
  stop)
    echo -n "Stopping $NAME: "
    start-stop-daemon --stop --quiet --pidfile $PIDFILE
    ;;
  restart)
    echo "Restarting $NAME: "
    start-stop-daemon --stop --quiet --pidfile $PIDFILE
    start-stop-daemon --start --quiet --pidfile $PIDFILE --background --exec $DAEMON -- $OPTIONS
    ;;
  *)
    echo "Usage: $0 {start|stop|restart}"
    exit 1
    ;;
esac

exit 0
% sudo /etc/init.d/mackerel-agent start

かな

Raspberry PiでMackerel

https://mackerel.ioだが
いきなり本番機ではなくまずは自宅のサーバで動かしてみる
Linux用バイナリをダウンロードするもRaspberryPiのarmでは動かず(T_T)
下記ソースをみると
https://github.com/mackerelio/mackerel-agent
とりあえずgolangをインストール
apt-getがうまく動かなかったのでリポジトリから直接ダウンロード

% dpkg -l | grep golang
ii  golang-go                             2:1.2.1-2
armhf        Go programming language compiler
ii  golang-go-linux-arm                   2:1.2.1-2
armhf        Go standard library compiled for linux_arm
ii  golang-src                            2:1.2.1-2
armhf        Go programming language compiler - source files
% setenv GOPATH ~/gocode
% git clone https://github.com/mackerelio/mackerel-agent.git
% cd mackerel-agent
% make build
% build/mackerel-agent --conf=~/downloaded/mackerel/binary/mackerel-agent/mackerel-agent.conf

で動いた!

VineLinuxでdvipdfmx時にフォントを埋め込む

VineLinux
IPA明朝とIPAゴシックを埋め込む」
http://ml.vinelinux.org/vine-users/msg32074.html
http://trac.vinelinux.org/browser/people/munepi/ptl09vl6/
の指示どおりにする

またTgifのフォントTimes-RomanとHelveticaも埋め込むために
下記を変更する
/usr/share/ghostscript/x.xx/Resource/Init/gs_pdfwr.ps

/.standardfonts [
  /Courier /Courier-Bold /Courier-Oblique /Courier-BoldOblique
%  /Helvetica /Helvetica-Bold /Helvetica-Oblique
  /Helvetica-BoldOblique
%  /Times-Roman /Times-Bold /Times-Italic /Times-BoldItalic
  /Symbol /ZapfDingbats
] readonly def

/usr/share/texmf/dvipdfmx/dvipdfmx.cfg

%D  "gs -q -dNOPAUSE -dBATCH -sPAPERSIZE=a0 -sDEVICE=pdfwrite -dCompatibilityLevel=1.3 -dAutoFilterGrayImages=false \ -dGrayImageFilter=/FlateEncode -dAutoFilterColorImages=false \ -dColorImageFilter=/FlateEncode-dUseFlateCompression=true \
-sOutputFile=%o -dNOKANJI -c '.setpdfwrite << /NeverEmbed \
[/Courier /Courier-Bold /Courier-Oblique /Courier-BoldOblique \
/Helvetica /Helvetica-Bold /Helvetica-Oblique /Helvetica-BoldOblique \
/Times-Roman /Times-Bold /Times-Italic /Times-BoldItalic \
/Symbol /ZapfDingbats /Ryumin-Light /GothicBBB-Medium] >> \
setdistillerparams' -f %i -c quit"
D  "gs -q -dNOPAUSE -dBATCH -sPAPERSIZE=a0 -sDEVICE=pdfwrite -dCompatibilityLevel=1.3 -dAutoFilterGrayImages=false \ -dGrayImageFilter=/FlateEncode -dAutoFilterColorImages=false \ -dColorImageFilter=/FlateEncode -dUseFlateCompression=true \
-sOutputFile=%o -dNOKANJI -c '.setpdfwrite << /NeverEmbed \
[/Courier /Courier-Bold /Courier-Oblique /Courier-BoldOblique \
/Symbol /ZapfDingbats /Ryumin-Light /GothicBBB-Medium] >> \
setdistillerparams' -f %i -c quit"

XOOPS Cube Legacy 2.1を無理やりPHP5.3に対応する

古いパッケージですが
XOOPS Cube Legacy 2.1を無理やりPHP5.3に対応する
http://xoopscube.jp/forum/6557
http://blog.netandfield.com/shar/2010/12/xoops-cube-legacy-php-53.html
のようにdeprecatedなエラーが画面に表示される
なぜか.htaccessphp.iniで制限しても表示されるので
# phpのソースに書いてあるのかも(?)
まじめにエラーと向き合う

基本的にこれ
https://php.net/manual/en/migration53.deprecated.php
を見てねですむがログは残しておく

1. "Deprecated: Assigning the return value of new by reference is deprecated in xxx"
そのまま書いてあるとおりなので
リファレンスではなくそのまま返り値にいれる

//$instance =& new $classname();
//を以下に直す
$instance = new $classname();

かなり数が多いので気合で直す

2. "call_user_func_array() expects parameter 1 to be a valid callback, non-static method xxx() should not be called statically in file core/XCube_Delegate.class.php line xxx"
これは第2引数を参照にする

//call_user_func_array($callback, $args);
//を以下に直す
call_user_func_array($callback, &$args);

下記が大変詳しくて参考になる
http://sotarok.hatenablog.com/entry/20090826/1251312215

3. "Deprecated: Function ereg() is deprecated in xxx"
eregはpreg_matchで書き換える

//ereg("Windows",$ua);
//を以下に直す
preg_match("/Windows/",$ua);

4. require_onceでPEAR.phpを/usr/share/pear/PEAR.phpから読もうとする
原因がよくわからないがとりあえずプルパスでファイル名を記述する

//require_once 'PEAR.php';
//を以下に直す
require_once '/home/foo/var/xoops_trust_path/xanhte/lib/PEAR.php';