ScratchとSmalltalkの関係

この記事はSmalltalk Advent Calendar 2016のエントリです。

今年のSmalltalk Advent Calendarを何もネタを考えずに引き受けてしまった。このところ忙しくてなかなかコーディングの機会がない。昨年は何を書いたのだろうと思ったら、こんな記事を書いていた。毎度のネタで心苦しいが、今回もScratch絡みの記事を書く事にする。

Scratchとは、MITの開発したビジュアルプログラミング環境のScratchである。現在はウェブ上でスクリプトの作成や実行を行うことができるが、以前は(今でも可能だが)ダウンロードしたプログラミング環境でスクリプトを作り、サイトにアップロードして公開する形であった。

Squeak SmalltalkをベースとしたScratch 1.4

その当時に使われていたScratch 1.4は、「知る人ぞ知る」Smalltalkで書かれたプログラミング環境であった。10年くらい前に当時隆盛を極めて(陰りも出て)いたSqueak Smalltalkをベースに作られていたのである。

細かな経緯は忘れてしまったが、Scratchの利用者がSmalltalk環境に入る方法を見いだしたのが発端だったろうか。ファイルを読み込む際にエラーダイアログを出させて、そこからSmalltalk環境に降りて行けたように記憶している。Scratch 1.4では、ちょっとしたバックドアを用いてSmalltalk環境に入り、カスタマイズすることもできるようになっている。

このあたりの手順は、以下のサイトで阿部さんが詳しく書いている。
簡単だけど奥深い!Scratchプログラミングの魅力 – 第3回 分散プログラミング:ITpro

Smalltalkプログラミングを行うという意味ではあまり便利な環境ではないものの、Raspberry pi上のScratchをカスタマイズするには避けて通れないので、この方法を知っておいても悪くないだろう。なお、ラズパイ上のScratch環境はgithubで公開されている。
https://github.com/raspberrypi/scratch

このScratchはNuScratchと呼ばれており、ソースはSqueakSourceで公開されている。 
Improved Scratch 1.4 as used on Raspberry Pi

Based on Scratch: 公開されたScrachのソース

配布されているScratch 1.4を改造して使うこともできるが、この配布イメージにはSmalltalkのchangesファイルがなく、継続して何かを開発したいような場合には、ソースコードの見た目が保存されず変数名も機械的に生成されたものとなるため、かなりの困難を強いられることになる。

Scratchに何らかのカスタマイズを行いたい場合には、Scratchの開発チームが提供する公式のソースを利用することができる。
Scratch 1.4 Source Code – Scratch Wiki

公開されたソースコードでは、配布されている一般のScratchの一部の機能が制限されている。例えば、いわゆるScratch Catが別のものになっていたり、公式サイトにスクリプトがアップロードされないようになっている。

ちなみに去年の記事では、Based on Scratchに共有メニューを追加する方法について説明した。
Based on ScratchにShareメニューを追加する

また、Scratch Source Code Licenseで述べられているように利用上の制限も明示されている。要点をかいつまんでおくと以下のような事が書かれている。

  • 派生物において、Scratchという文言の使用は一部の例外を除いて認められない。
  • 同様にロゴ(Scratch cat)も利用できない。
  • 公式サイトにスクリプトをアップロードする機能を実装してはならない。
  • 派生物のソースコードは無料でサイトに公開するか、それに準ずる形にしなければならない。

Based on Scratchにはカラーリングされたウィンドウなど当時のSqueakの雰囲気が残っており、ノスタルジーを感じさせる開発環境でSmalltalkプログラミングするのもオツなものだ。

ArTecのStuduino

Based on Scratchを元にして、いくつかの派生物が開発されている。その中でいち早く登場したものが ArTecによるStuduino開発環境だろう。StuduinoはArduinoを基に設計されたマイコンで、様々なセンサやアクチュエータなどを接続して手軽にフィジカルコンピューティングを楽しめる製品である。
Studuinoダウンロード

このStuduinoで使うブロックプログラミング環境が、先ほどのScratch 1.4の公開ソースコードを利用している。
ブロックプログラミング環境

Studuinoのような特定製品向けの開発環境としてではなく、Scratchのような汎用的なプログラミング環境として更に発展させようとする試みもある。

iPadで使えるPyonkee

Based on Scratchの派生物のなかで、利用者数が最も多いのがPyonkeeではないだろうか。
Pyonkee – iPadでビジュアルプログラミング

PyonkeeはSoftUmeYaの梅澤さんが開発されたもので、J.M.Macintosh氏によるScratch Viewerを元としている。
iPadでScratch

Based on ScratchはPCでの利用を前提としたUIになっており、タブレット端末では利用上のさまざまな問題点があるが、Pyonkeeではタブレット端末でも使いやすいような工夫がなされている。プロジェクトの共有やiPadの持つセンサーを利用することもできるようになっている。

Smalltalk勉強会では、PyonkeeからSmalltalk環境を触るデモも行われた。
Pyonkeeの皮をはぐ

Pharo Smalltalkで動くscat

Scratchが現在のようなFLASHベースになることがアナウンスされた後、一部のSmalltalkerによってSmalltalkコードのままのScratchを維持しようとする試みが行われた。
scat

ここのStatementは面白い。

We believe there is a conspiracy going on all over the universe, evil forces are constantly fighting to take down great Smalltalk projects and port them to other languages.
(私たちは宇宙の陰謀が起こっていると信じています。邪悪な勢力は、絶え間なく偉大なSmalltalkプロジェクトを引きずり落とし、他の言語に移植しようと戦い続けています。)
In a quest against such demonic plots, a couple of us started a confidential mission to rescue the last of these endangered projects, namely Scratch.
(そんな悪魔的な策略へ対抗するために我々二名は絶滅の危機にある最後のプロジェクト<scratch>を救済する秘密の任務を始めました。)

scatはPharo 1.3をベースに作られており、先ほどのサイトからダウンロードすることができる。
https://code.google.com/archive/p/scat/downloads
Google Code Archiveがサービスを停止したようにscatの開発も止まっているが、その流れはPhratchに引き継がれている。

より洗練されたPhratch

Phratchは、ScratchをPharo Smalltalk上に構築しようというプロジェクトである。
Phratch | Pharo Visual Harmony

scatの流れを引き継いでいるが、単なるPharo上での再実装やソースコードの整理にとどまらず、新しいブロックを組み込んだりカテゴリを整理する機能などが追加されており、Pharoのさまざまな機能を活用することができる。

PhratchはLEGO MindstormsやArduinoなど、ロボットプログラミングやフィジカルコンピューティングの教材としても使われており、それらを制御するための追加モジュールも提供されている。

Phratch – Visual Programming for Grownups

おわりに

以上、SmalltalkベースのScratchとその派生物について紹介した。
最初のScratchの登場から10年、宇宙的な陰謀により?開発環境がウェブに移行してから数年たった。さらに新しいバージョンのScratch(HTML5ベースだろうか)もアナウンスされ、悪魔的な策略?は着々と進んでいる。しかし、SmalltalkをベースとしたScratchもまだまだ現役で使われていることがわかるだろう。邪悪な勢力に対抗するには新しいSmalltalkerが必要である。Scratchのカスタマイズをスタート地点としてSmalltalkの勉強を始めてはどうだろうか。

キングジム PORTABOOKへのlubuntuインストール

一気に価格が下がったPORTABOOKを衝動買いしてしまった。Windows 10ではモタつく感じがするため、lubuntuをインストールすることにした。いろいろ問題があるものの、とりあえず使える状態になったので手順を記しておく。

参考にした情報源

  • https://www.logsoku.com/r/2ch.sc/notepc/1479283028/
  • https://norihitosogoshi.blogspot.jp/2016/11/arch-linux_22.html

現状の問題点

  • バッテリー残量がわからない
  • サスペンド・ハイバーネートできない
  • 日本語キーボード配列に設定するとバックスラッシュや縦棒が入力できない
  • 本体上のwifiが機能しない
  • 音が出ない

当然のことながらインストールの前には、不慮の事故のためにWindowsの回復ドライブを作成しておいた。といっても実際に回復させた訳ではないので、元に戻せるかどうかはわからない。

lubuntuのバージョンとUSBメモリの準備

lubuntuは、16.04.1(LTS)を使った。16.10.1だとUSBメモリからの起動はできるもののインストール中に失敗してしまう。

rufusでイメージをUSBメモリに作る。「パーティション構成とターゲットシステムの種類」には「MBR UEFIコンピュータのためにパーティション構成」を選んでおく。

機器の準備

USBハブを用意してPORTABOOKに接続する。USBハブには作成したUSBメモリの他、Ethernetアダプタとキーボードを挿入しておく。

PORTABOOKのwifiは利用できず、インターネットに接続していないとインストールに失敗するようなのでEthernetアダプタ経由でインターネットに接続する。

USBのキーボードを挿入しておかないとPORTABOOKのキーボードやポインタが有効にならないため起動前に必ず挿入する。ドライバの読み込みの問題のようなので、ワイヤレスキーボード・マウス用のUSBドングルだけ刺していても良い。(キーボード・マウス本体の電源がオフでも構わなかった)

USBからの起動

PORTABOOKの電源を入れ、画面に「PORTABOOK」と表示されている間にF2キーを連打すると、ブートメニューが現れる。ブートメニューから挿入したUSBメモリを選ぶと、エラーが出たり表示が崩れたりするもののLXDEのデスクトップ画面が現れる。

インストール

デスクトップ上のインストールアイコンからインストールを開始する。インストール中にバシバシ操作すると高い確率でインストールに失敗する。のんびり構えた方が良い。

キーボードは日本語キーボードを選択するものの、バックスラッシュや縦棒のキーが反応しない。USキーボードのままだとそれらしい位置で入力できるので、USキーボードの設定で刻印を見ないように入力するか、日本語キーボードの設定で後から別のキーに割り当てるか、どちらかの選択をする必要がある。

無事にインストールが終了したらシャットダウンしてUSBメモリを抜く。

再起動と不具合への対処

再起動すると画面は乱れるものの、ちゃんとデスクトップ画面が表示される。内蔵キーボードもポインタも使えるはず。

まずは、USBキーボードを外しても内蔵キーボード・ポインタが使えるように設定する。

sudo vi /etc/rc.local

で/etc/rc.localを開いて、以下の2行をexitの前に挿入する。

modprobe -r i2c_hid
modprobe i2c_hid

次に、起動時の画面の乱れを解決する。

sudo vi /etc/default/grub

で/etc/default/grubを開いて11行目あたりを以下のように変更する。

#GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX="xdriver=EFIFB nomodeset"

これで一応は使えるようになった。

Scratch拡張 — ServoDesigner公開

今年のゼミ夏合宿で「サーボを制御するのにHeartToHeartのようなツールが欲しい」という声があった。

Scratchのコスチューム切り換えの機能を流用すれば、それらしい機能を提供できそうだと思ったので、合宿中から早速取りかかってみた。

杉浦先生のMugbot Designerを参考にさせて頂いて(名前の一部も頂いて)、ほとんどの部分はあっという間に作り上げた。

ServoDesigner — github

sd1

ServoDesigner ではサーボのチャンネルを模した変数の値を一括して変更する機能しかない。その値を実際のサーボに設定するには別プログラムを使う。Scratchと別プログラムとの通信は Remote Sensor Protocol を用いて行い、 servo changed というブロードキャストメッセージによって、切り換えのタイミングが知らされる。なお、Based on Scratchで無効化されている Remote Sensor Protocol は、ServoDesignerを導入することで有効化される。

現時点では firmata で Arduino に接続されたサーボを制御するサンプルがあるが、今後はラズパイに接続されたサーボの制御プログラムなども用意していく。

Raspberry pi model B(Raspbian jessie版)にROS indigoをインストールする

この記事は以前の記事(Raspberry pi(Raspbian wheezy)にROS indigoをインストールする)をもとに、Raspbian jessie用に書き換えた記事である。

Raspbian のバージョンによってインストールするパッケージが異なるので、以下のコマンドでRaspbianのバージョンを確認した上で、適切な方法を選ぶ必要がある。

$ lsb_release -a
No LSB modules are available.
Distributor ID:	Raspbian
Description:	Raspbian GNU/Linux 8.0 (jessie)
Release:	8.0
Codename:	jessie
$ 

Codenameの行に動作中のバージョンが表示される。

Raspberry piにROS/indigoをインストールする。現時点でRaspberry pi model B用のROSのバイナリパッケージは提供されていないようなので、直接ビルドしていくことになる。手順の概要は以下の通り。

  1. Raspbianをインストールする。
  2. ROSビルドの設定を行う。
  3. ROS本体をビルドする。

Raspbianのインストール

まず、Raspberry piのダウンロードページからNOOBSのZIPファイルをダウンロードする。

ダウンロードするしたZIPファイルを適当なフォルダに展開し、FATフォーマットされたSDカードにコピーする。

Raspberry piを適切にセットアップし、インターネット接続できるようにネットワークケーブルを接続したあと、NOOBSをコピーしたSDカードを挿入して起動する。

起動後の画面で日本語を選び、Raspbianのインストールを選んでインストールを始める。

このあたりの手順は、Raspberry piのセットアップページを参照する。

一般的なサイトで紹介している設定を済ませておくと良いだろう。

ROSビルドの設定

この手順はROSのページを参考にしている。要は忠実に一つずつこなしていくことだ。

この記事はRaspberry piのOSであるRaspbianのバージョンがjessieの頃の内容である。wheezy用のインストールについては別記事を参照してほしい。

リポジトリの設定と更新

ROSのリポジトリを設定し、認証キーを追加する。

sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu jessie main" > /etc/apt/sources.list.d/ros-latest.list'
wget https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -O - | sudo apt-key add -

aptのパッケージインデックスを更新する。

sudo apt-get update
sudo apt-get upgrade

ビルド用パッケージのインストール

ビルドに必要なパッケージをインストールする。

sudo apt-get install python-pip python-setuptools python-yaml python-distribute python-docutils python-dateutil python-six
sudo pip install rosdep rosinstall_generator wstool rosinstall

rosdepを初期化する。

sudo rosdep init
rosdep update

catkinのワークスペースを作成する。

mkdir ~/ros_catkin_ws
cd ~/ros_catkin_ws

Variantの選択

ここで、ROSのどんなパッケージをビルドするかを選ぶことになる。推奨されているvariantのはros_commだが、他にdesktopやrobotなどがある。目的に応じて好きなものを選べばよい。variantはREP 131のページで紹介されている。

適当なvariantを選んだら、以下のようなコマンドでインストールの設定を行う。なお、下はros_comm用のコマンドなので、選んだvariantに応じてros_commの部分(3カ所ある)をvariantの名前で置き換えて実行する。

rosinstall_generator ros_comm --rosdistro indigo --deps --wet-only --exclude roslisp --tar > indigo-ros_comm-wet.rosinstall
wstool init src indigo-ros_comm-wet.rosinstall

なお、Collada DOMが不要ならば以下のように –excludeの後ろに collada_parser と collada_urdf を追加する。

rosinstall_generator ros_comm --rosdistro indigo --deps --wet-only --exclude roslisp collada_parser collada_urdf --tar > indigo-ros_comm-wet.rosinstall
wstool init src indigo-ros_comm-wet.rosinstall

この時点で選んだvariantを間違えてしまった場合は、srcフォルダを削除して上のコマンドをやりなおせば良い。

必要なパッケージのインストール

ROSのビルドに必要だが、Raspbianではstableになっていないパッケージをそれぞれビルドしておく。まずは、その準備を行う。

sudo apt-get install checkinstall cmake
sudo sh -c 'echo "deb-src http://mirrordirector.raspbian.org/raspbian/ testing main contrib non-free rpi" >> /etc/apt/sources.list'
sudo apt-get update

libconsole-bridge-dev,liblz4-dev をインストールする。

sudo apt-get install libconsole-bridge-dev liblz4-dev

Collada DOMのインストール

variantsの選択時に Collada DOM を除外していなければ、以下を実行する。

cd ~/ros_catkin_ws/external_src
sudo apt-get install libboost-filesystem-dev libxml2-dev
wget http://downloads.sourceforge.net/project/collada-dom/Collada%20DOM/Collada%20DOM%202.4/collada-dom-2.4.0.tgz
tar -xzf collada-dom-2.4.0.tgz
cd collada-dom-2.4.0
cmake .
sudo checkinstall make install

checkinstallを行うと、以下のような設定が現れる。

0 -  Maintainer: [ root@raspberrypi ]
1 -  Summary: [ Package created with checkinstall 1.6.2 ]
2 -  Name:    [ collada-dom ]
3 -  Version: [ 2.4.0 ]
4 -  Release: [ 1 ]
5 -  License: [ GPL ]
6 -  Group:   [ checkinstall ]
7 -  Architecture: [ armhf ]
8 -  Source location: [ collada-dom-2.4.0 ]
9 -  Alternate source location: [  ]
10 - Requires: [  ]
11 - Provides: [ collada-dom ]
12 - Conflicts: [  ]
13 - Replaces: [  ]
Enter a number to change any of them or press ENTER to continue:

2番のNameをcollada-domからcollada-dom-devに変更する必要があるので、2 を入力してEnterを押し、次に collada-dom-dev と入力する。再度確認の設定が表示されたらそのまま Enter を押して続ける。

collada_urdfへのパッチ

Collada DOMをインストールした場合、以下のようにcollada_urdfへパッチを当てる必要がある。

Google Groupのエントリに添付されているパッチファイル(0001-fixed-arm-build.patch)をダウンロードし、ホームディレクトリにコピーしておく。

以下を入力してパッチを当てる。

cd ~/ros_catkin_ws/src/robot_model/collada_urdf/
patch -p1 < ~/0001-fixed-arm-build.patch

依存関係の解決

rosdepを実行して依存関係を解決する。

cd ~/ros_catkin_ws
rosdep install --from-paths src --ignore-src --rosdistro indigo -y -r --os=debian:jessie

最終的に以下のように表示されて完了する。

#All required rosdeps installed successfully

ROS本体のビルド

後は以下を入力して本体をビルドする。

cd ~/ros_catkin_ws
sudo ./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release --install-space /opt/ros/indigo

終わるまでひたすら待つしかない。SSH経由だとタイムアウトする可能性があるのでタイムアウトしないように設定するかコンソール経由でビルドする。

動作確認

.bashrc で初期化スクリプトを実行するようにする。

echo "source /opt/ros/indigo/setup.bash" >> ~/.bashrc
source ~/.bashrc

roscore を起動する。

roscore
... logging to /home/pi/.ros/log/9781754e-3a9d-11e5-8b98-b827ebe98f3c/roslaunch-raspberrypi-11718.log
Checking log directory for disk usage. This may take awhile.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.

started roslaunch server http://raspberrypi:42226/
ros_comm version 1.11.13


SUMMARY
========

PARAMETERS
 * /rosdistro: indigo
 * /rosversion: 1.11.13

NODES

auto-starting new master
process[master]: started with pid [11735]
ROS_MASTER_URI=http://raspberrypi:11311/

setting /run_id to 9781754e-3a9d-11e5-8b98-b827ebe98f3c
process[rosout-1]: started with pid [11748]
started core service [/rosout]

Ctrl-Zを押してプロセスを止め、プロンプトでbgを入力してバックグラウンド動作させる。

bg

トピックの一覧を表示させる。

rostopic list
/rosout
/rosout_agg

おそらく正常動作しているだろう。fgを入力した後、Ctrl-Cでroscoreの動作を止める。

fg
roscore
^C[rosout-1] killing on exit
[master] killing on exit
shutting down processing monitor...
... shutting down processing monitor complete
done

WiringPi2 for Pythonをインストールする

前回の記事に引き続いて Raspberry Pi A+ へ、もろもろインストールする。

Python開発用ツールのインストール

python-pipはインストール済のようなので、python-devだけインストールする。

sudo apt-get install python-dev

WiringPi2のインストール

wiringipi2をインストールする。以前よりずっと簡単になった。

sudo pip install wiringpi2

いろいろ警告が出るけど、下のようになって終わればOK。

Successfully installed wiringpi2 wiringpi
Cleaning up...

試運転

$ python
Python 2.7.9 (default, Mar  8 2015, 00:52:26) 
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import wiringpi2
__main__:1: DeprecationWarning: The wiringpi2 module has been deprecated, please 'import wiringpi' instead.

以前のようにwiringpi2をimportすると、deprecatedだと怒られる。素直にwiringpiをimportすればよい。

>>> import wiringpi
>>> wiringpi.piBoardRev()
2
>>> wiringpi.wiringPiSetup()
wiringPiSetup: Must be root. (Did you forget sudo?)
$

wiringPiSetupを使うにはroot権限が必要なので、sudo pythonとしなければならない。

以上。

Raspberry Pi A+にRaspbianをインストールする

完全な備忘録。来た道を見失わないために。

目標

  • コンソールで起動(GUIは使わない)
  • wifiでネットワーク接続
  • PythonでGPIOを使う(別記事

準備

  • Raspberry Pi A+
  • MicroSDカード(8MB以上のもの)
  • WiFi USB Adapter(GW-USNano2)
  • その他、インストールに必要なもろもろ
    • セルフパワーのUSBハブ
    • キーボード
    • マウス
    • HDMIディスプレイ
    • USB-LANアダプタ

Raspbianのインストール

Raspberry PiウェブサイトのDownloadページでNOOBSをダウンロードする。

ダウンロードした圧縮ファイルを展開し、その中身を全てFATフォーマットしたMicroSDカードにコピーする。

コピーしたMicroSDカードを、もろもろ接続したRaspberry Pi A+に挿入して起動する。

起動したらRaspbianを選択してインストールを進める。

基本設定(その1)

Raspbian が起動したらコンソールを開いて、raspi-config を実行する。

sudo raspi-config

Advanced Optionsで、A2 Hostname を選ぶ。続く画面で、Hostname として適当な名前を入力する。(ここでは例として、roverを入力したものとする)

Advanced Optionsで、A4 SSHを選ぶ。続く画面で、Enableを選ぶ。

Enable Boot to Desktop/Scratchで、B2 Console Autologin を選ぶ。

Finishを選んで再起動する。

基本設定(その2)

別のPCからネットワーク経由で設定を継続する。

まず、PINGが通ることを確認する。

ping rover.local

SSHでログインし、.ssh フォルダを作成する。パスワードにはraspberryを入力する。

ssh pi@rover.local
mkdir .ssh

sshd_configの設定を変更する。

sudo vi /etc/ssh/sshd_config

最終行のUsePAMをyesからnoに変更し、さらにUseDNS noを追加する。以下のようになればよい。

UsePAM no
UseDNS no

いったんログアウトしてから、SSH鍵を転送する。

scp .ssh/id_rsa.pub pi@rover.local:~/.ssh/authorized_keys

再度、sshでログインする。以降、パスワードの入力を求められない。

ssh pi@rover.local

パッケージを更新し、アップデートする。

sudo apt-get update
sudo apt-get upgrade

raspi-config を起動して設定の続きを行う。

sudo raspi-config

Internationalisation Optionsで、I1 Change Locale を選ぶ。
en_GB.UTF-8 の選択を外し、en_US.UTF-8 と ja_JP.UTF-8 を選択する。

Internationalisation Optionsで、I2 Change Timezone を選ぶ。
アジア(Asia), Tokyoを選ぶ。

Internationalisation Optionsで、I3 Change Keyboard Layout を選ぶ。
キーボードに合わせて適切なものを選ぶ。

wifi設定

/etc/network/interfaces を編集する。

iface wlan0 inet manual

これを

iface wlan0 inet dhcp

に書き換える。

/etc/wpa_supplicant/wpa_supplicant.conf を作成する。なお、ESSID、PSKには適切なものを指定する。

sudo bash
cd /etc/wpa_supplicant
wpa_passphrase ESSID PSK >> wpa_supplicant.conf

wifiモジュールをUSBハブに挿入するか、挿入済であれば以下を実行して wifi モジュールを再設定する。

ifdown wlan0
ifup wlan0

ログアウトした後、ネットワークケーブルを外してもPCからPINGが通ることを確認する。

以上で基本的な設定は完了。

Based on ScratchにShareメニューを追加する

この記事はSmalltalk Advent Calendar 2015のエントリです。

今さらSmalltalkベースのScratch 1.4をイジる必要はなかろうと思うが、ちょっとしたアイデアを試したりするのにまだまだ使える部分が多い。

その1つにRemote Sensor Protocolがある。シンプルなプロトコルなので他の言語でも実装しやすい。ScratchでRemote Sensor Protocolを使うには、ちょっとしたメソッドの変更を行った上で、Shiftを押しながらShareメニューをクリックして、Host MeshまたはJoin Meshを選べばよい。(簡単だけど奥深い!Scratchプログラミングの魅力

しかし、ScratchSource1.4として公開されているオープンなScratch(いわゆるBased on Scratch)環境では、Shareメニューが存在しないので、この機能を利用することができない。

そこで、この記事ではBased on ScratchにShareメニューを追加する方法について説明したい。

目標

この記事では以下の機能の実現を目指す。

  1. Based on ScratchにShareメニューを追加する。
  2. ShareメニューにHost MeshおよびJoin Meshのメニュー項目を置く。
  3. 各メニュー項目がScratchにおけるRemote Sensor Protocolに基づいた機能を提供する。

ScratchのShareメニューには、作品をScratchのウェブサイトにアップロードする機能もあるが、Based on Scratch環境ではアップロードを行うことは許されていない。

you cannot implement the ability to upload projects to any MIT Scratch website (currently, http://scratch.mit.edu)
(License Informationより)

そこで、Host MeshおよびJoin Meshの機能実現のみとする。

準備

まずはScratchSource1.4.zipをダウンロードの上、適当なフォルダで展開する。

展開したフォルダにはイメージのみでVMがないので、普通のScratch1.4もダウンロードしてインストールしておく。

展開したフォルダにあるScratchSourceCode1.4.imageのファイルを、ScratchのVM(アプリケーション)にドラッグ&ドロップして、Based on Scratchを起動する。

ScratchSource1.4.imageの起動

ScratchSource1.4の起動時画面

起動したら、表示されているScratchのウィンドウを閉じる。そのためにはShiftを押しながらCommandキーを押し、表示されたHaloのうち左上の×印のボタンをクリックする。
×印のボタンを押して閉じる

メニュー用メソッドの作成

まずはShareメニューを押した時に反応するメソッドを作成する。

画面左側の緑色のウィンドウ(browser)の上段で、一番左にあるペイン(クラスカテゴリペイン)から、Scratch-UI-Panesを選ぶ。続いて、その右に表示されるクラスペインから、ScratchFrameMorphを選ぶ。そして、その右のプロトコルペインからmenu/button actionsを選ぶ。
browserの上段

するとbrowserの下段のコードペインが以下のようになっている(はず)。
メソッド入力欄

この内容を全て消して、以下の内容をコードペインに入力 or コピペする。

shareMenu: aMenuTitleMorph 
    | menu |
    menu _ CustomMenu new.
    self addServerCommandsTo: menu.
    menu localize.
    menu invokeOn: self at: aMenuTitleMorph bottomLeft + (0 @ 10)

shareMenu:の入力

「_」アンダースコアになっている部分が、入力すると←の記号に変わっているがこれで問題ない。

メソッド入力欄の左上に表示される「ー」をクリックしてコンテキストメニューを出し、acceptを選ぶ。
Screen Shot 2015-12-03 at 8.55.52
Screen Shot 2015-12-03 at 8.56.03

特に問題がなければイニシャルを入れるように促されるので適当なもの(スペースが含んでいてはダメ)を入力してAcceptを押す。
Screen Shot 2015-12-03 at 10.32.48

1行目が太字で表示されればOK。

メニューの登録

メニューにShareを追加して、shareMenu:メッセージを送るようにする。

同じbrowser内で上段の右から2番目のプロトコルペインでinitializationを選び、その右のメソッド一覧ペインでcreateMenuPanelを選ぶ。
Screen Shot 2015-12-03 at 10.37.21

コードペインの20行目付近に、メニュー項目を登録している箇所がある。EditとHelpのエントリの間へ、以下のようにShareメニューのエントリを追加する。
Screen Shot 2015-12-03 at 10.41.16

終わったら先ほどと同様に、コードペインのコンテキストメニューでacceptを選ぶ。

MESH機能の抑制解除

この時点でメニューにはShareと表示されるが、クリックしてもメニュー項目は表示されない。これは、ScratchがデフォルトでMESH機能を抑制しているためなので、この抑制を解除する必要がある。

browserのプロトコルペインでmenu/button actionsを選び、メソッド一覧ペインでaddServerCommandsTo:を選ぶ。
Screen Shot 2015-12-03 at 15.42.25

抑制を解除するには、上のコード中で明るく表示されているtrueを、falseに置き換える。そして、コードペインのコンテキストメニューでacceptを選べよい。

試してみる

3つの追加・変更が完了したら、デスクトップをクリックしてworldメニューを出し、open…からScratchを選ぶ。Shareメニューをクリックして2つのメニュー項目が表示されればOKである。
Screen Shot 2015-12-03 at 15.44.50

ネットワークで接続された2台以上のPCでScratchを起動すればMESH機能の面白さを実感できるが、1台のPC上でもScratchを2個立ち上げて、一方でHost Meshを選び、もう一方でJoin Meshを選べば動作を確かめることができる。後者についてはIPアドレスとして127.0.0.1と入力すればよい。

気をつけなければならないのは、一方で変数値を更新しても、もう一方の変数が変わるわけではないこと。もう一方ではセンサー値として他の変数値を参照できるだけである。

Change File

上記の追加・変更を行うチェンジファイルも公開しておく。
http://itolab.com/software/scratch/enableShareMenu.1.cs

このファイルをダウンロードしたらScratchSourceのフォルダに格納した上で、worldメニューを出して、open…からfile listを選ぶ。enableShareMenu.1.csを選んでコンテキストメニューからfileInを選べば、全ての追加・変更が行われる。

手軽に実施したい人はどうぞ。

Elementary OSにROS indigoをインストールする

Elementary OSの調子がなかなか良いのでROSをインストールして継続的に使ってみることにした。

Elementary OSのウェブサイトからisoイメージをダウンロードする。ダウンロードの際には「Freyaをダウンロード」を押す前に「カスタム」をクリックして0と入力すれば無料で入手できる。もう少し使ってみないとわからないが数ドル払う価値はあるのではと思う。
今回はChromeBook(C720)にインストールして使ったが大きな問題なくインストールできた。

ROS indigoのインストール

OSのインストールが終わったらROSをインストールする。Elementary OS Freyaがubuntu 14.04ベースなので、ROSはindigoをインストールする。
ROS indigoのインストールページを参考に、インストールを進める。

Setup your sources.list

まずsource.listを作成する。画面左上のApplicationからTerminalを選んで起動し、以下を入力する。

$ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'

これを実行すると/etc/apt/sources.list.dにros-latest.listが作られる。インストールページの指示に従ってapt-get updateまで実行すると、以下のようなエラーが発生する。

Err http://packages.ros.org freya/main amd64 Packages
  404  Not Found
Err http://packages.ros.org freya/main i386 Packages
  404  Not Found

/etc/apt/sources.list.d/ros-latest.listを見ると、以下のような内容になっている。

$ cat /etc/apt/sources.list.d/ros-latest.list 
deb http://packages.ros.org/ros/ubuntu freya main

trustyであるべき部分がfreyaになっているのでROSのパッケージを入手できないようだ。

そこで、この部分を書き換えて以下のようにする。

$ cat /etc/apt/sources.list.d/ros-latest.list 
deb http://packages.ros.org/ros/ubuntu trusty main

Set up your keys

以下を実行してkeyを設定する。

$ sudo apt-key adv --keyserver hkp://pool.sks-keyservers.net --recv-key 0xB01FA116

Installation

後は通常どおりROSをインストールすればよい。今回はDesktop-Full Installとした。

$ sudo apt-get update
$ sudo apt-get install ros-indigo-desktop-full

Initialize rosdep

続いてrosdepを実行する。

$ sudo rosdep init
$ rosdep update

ところが2行目の実行後、以下のようなエラーが発生する。

$ rosdep update
reading in sources list data from /etc/ros/rosdep/sources.list.d
Hit https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/osx-homebrew.yaml
Hit https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/base.yaml
Hit https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/python.yaml
Hit https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/ruby.yaml
Hit https://raw.githubusercontent.com/ros/rosdistro/master/releases/fuerte.yaml
Query rosdistro index https://raw.githubusercontent.com/ros/rosdistro/master/index.yaml
Add distro "groovy"

ERROR: Rosdep experienced an error: Could not detect OS, tried ['windows', 'ubuntu', 'rhel', 'qnx', 'osx', 'opensuse', 'opensuse', 'mint', 'linaro', 'gentoo', 'funtoo', 'freebsd', 'fedora', 'elementary', 'debian', 'cygwin', 'centos', 'arch']
Please go to the rosdep page [1] and file a bug report with the stack trace below.
[1] : http://www.ros.org/wiki/rosdep

これもsources.listの時と同様にubuntuのコードネームがfreyaになっているのではないかと考えられるので、以下のようにOSの検出を上書きする。

$ export ROS_OS_OVERRIDE=ubuntu:14.04

再度rosdepを実行する。

$ rosdep update

Environment setup

ROSの設定を行うように.bashrcを変更する。

$ echo "source /opt/ros/indigo/setup.bash" >> ~/.bashrc
$ source ~/.bashrc

これまたエラーが発生する。

bash: /home/itolab/.bashrc: line 168: syntax error near unexpected token `/opt/ros/indigo/setup.bash'
bash: /home/itolab/.bashrc: line 168: `esacsource /opt/ros/indigo/setup.bash'

もともと.bashrcの最終行に改行が入っておらず、echoの出力がつながってしまうことが原因である。適当なエディタで.bashrcを開き、esacとsourceの間に改行を入れる。

さらに先ほどのexportも追加しておく。

$ echo export ROS_OS_OVERRIDE=ubuntu:14.04 >> .bashrc 

Getting rosinstall

rosinstallをインストールする。

$ sudo apt-get install python-rosinstall

以上でElementary OSへのROS indigoインストールは完了する。

ChromeBookへのLinuxインストール(準備編)

【無保証、損壊の危険あり】この記事ではChromeBookのハードウェア・ソフトウェアに変更を加えるため、ChromeBookを元に戻せないような状態にする可能性がある。実施する場合は自己責任で行うこと。

以前にArchLinuxのインストール方法としてまとめたが、ArchLinuxを使っておらずその後の記事を掲載するつもりもないので、元記事を削除し、必要な部分だけ残すことにした。
この記事ではChromeBook(Acer C720)でSeaBIOSを設定する手順について説明し、実際にLinuxをインストールする手順については別途説明する。

前提

自分が購入したChromeBookがAcerのC720(C720-2420)なので、この記事ではそれに関する情報のみ載せる。

Linux導入準備の流れ

  1. デベロッパーモードの有効化
  2. SeaBIOSの有効化
  3. ハードウェア書き込み保護の無効化
  4. GBBフラグの設定
  5. ハードウェア書き込み保護の有効化

デベロッパーモードの有効化

chrubuntuのインストールで説明したのと同じ方法でデベロッパー(開発者)モードにする。具体的には以下の手順となる。

  1. ChromeBookを終了しておく。
  2. キーボード最上段のescと→を押しながら、電源をオンにする。
  3. リカバリ画面になったら、Ctrl-Dを押し、その後、Enterを押す。
  4. 開発者モード用の初期化が始まり、その後自動的に再起動される。

SeaBIOSの有効化

これも以前の記事と同じように無線LANを有効にした後、ログイン画面する。

  1. ChromeBookを起動する。
  2. 無線LANの設定を行い、インターネットへアクセスできるようにする。
  3. EULAの画面をAcceptしてログイン画面に進む。(ただしログインしない)
  4. ctrlとaltを押しながら最上段の→キーを押し、ChromeOSのCUIログイン画面に移る。
  5. ユーザーIDとして、chronos と入力してログインする。(パスワードは入力しない)

次にSeaBIOSを有効化する。
$ sudo bash
# crossystem dev_boot_usb=1 dev_boot_legacy=1

シャットダウンする。

ハードウェア書き込み保護の無効化

デフォルトでSeaBIOSを起動するように変更するにはGBBフラグを設定する必要がある。また、このようにしないとバッテリーが空になった際に、自動的にChromeOSがリカバリされ、インストールしたLinuxが失われてしまう。GBBフラグを設定するには、ソフトウェア書き込み保護の無効化を行う必要があり、それに先立ってハードウェア書き込み保護の無効化を行う。

この手順を行うとAcerの保証が受けられなくなるので注意すること。

ArchLinuxサイト上のC720の情報ページに従い、C720の裏面のネジを全て取り外す。具体的な手順は以下の通りである。

  1. 裏面に見える12個のネジを全て外す。
  2. 保証用のシールを外して、その下のネジを外す。(保証が受けられなくなるので注意)
  3. 裏面のパネルを注意深く外す。
  4. 写真を確認しながら、バッテリー右上にある7番のネジを外す。
  5. 裏面のパネルを元に戻す。

裏面パネルは比較的簡単に外れる。ディスプレイヒンジ側の中央あたりに爪を入れ、やさしく開けていけば良い。

バッテリーが接続されたままなので、基盤上のネジを外す場合はドライバーを電子部品等に接触させないように十分に注意して行うこと。
また、外したネジは後で元に戻すので失くさないように注意する。

GBBフラグの設定

通常通りにChromeBookの電源を入れ、先ほどの「SeaBIOSの有効化」と同じようにCUIログインを行って、以下を実行する。

$ sudo su
# flashrom --wp-disable
# flashrom --wp-status

最後のコマンドで書き込み保護が無効化されていることを確認する。

# /usr/share/vboot/bin/set_gbb_flags.sh

上記を実行した結果が以下のようになっていることを確認する。

GBB_FLAG_DEV_SCREEN_SHORT_DELAY 0x00000001
GBB_FLAG_FORCE_DEV_SWITCH_ON 0x00000008
GBB_FLAG_FORCE_DEV_BOOT_LEGACY 0x00000080
GBB_FLAG_DEFAULT_DEV_BOOT_LEGACY 0x00000400

同じ内容であれば以下を実行して、SeaBIOSがデフォルトで起動するように設定する。

# /usr/share/vboot/bin/set_gbb_flags.sh 0x489

ソフトウェアの書き込み保護を有効にする。

# flashrom --wp-enable

ChromeBookをシャットダウンする。

ハードウェア書き込み保護の有効化

先ほどの「ハードウェア書き込み保護の無効化」と同じように裏面のパネルを取り外し、外したネジを7番の場所に元通り付ける。

SeaBIOS関係の設定は以上である。

グラフ操作フレームワーク:Grafeo公開

Smalltalk

データを元にグラフを生成して、ぐりぐりとグラフを扱うにはRoassalという素晴らしいツールが既にある。一方で、小規模なグラフを作ったり操作したりできるツールの必要性もあって、ここ数年そういったソフトウェアの開発を行っていた。もとはFluoのグラフ操作部分だったのが、汎用的になるようにリファクタリングを重ねていったら、それなりに使えそうなものができたので公開することにした。

Grafeo

方向性としては、状態遷移図を作ったりするようなツールのフレームワークを目指しつつ、ちょっとしたグラフを描きたいといった場合に便利なツールとしても使えるようにしたい。
まだ公開していないが、このGrafeoをベースに既存のFluoを構築したり、umejavaさんのSState向けのUIを作ったりしているので、ぼちぼちと公開して行こうと思っている。