Pharo 4.0でアイコン一覧を表示する方法

いつも忘れてしまうので。

参考:SpecBooklet.pdf

| iconList |
iconList := IconListModel new.
iconList
  items: (Smalltalk ui icons iconSelectors collect: [ :each | each -> (Smalltalk ui icons iconNamed: each) ]);
  displayBlock: [ :assoc | assoc key];
  sortingBlock: [ :assocA :assocB | assocA key < assocB key ];
  icons: [ :assoc | assoc value ];
  title: 'Availiable icons for the current theme.'.
iconList openWithSpec

ScratchとSmalltalkの関係

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

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

続きを読む →

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の行に動作中のバージョンが表示される。

続きを読む →

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インストールは完了する。