linux Beanに続いてLinux版Scratch1.4で日本語入力でちょっとテンション上がったので、Raspberry Piで動くDebian系のLinuxであるRaspbianでも試してみました。

とは言いつつも私自身実機を持っていないので、今回はQEMU上のRaspbianで挑戦です。

まずはQEMU環境の整備

1. QEMUのダウンロード

QEMUを使ってRaspbianを使ってみようと考えている人は他にもいるもので、イメージファイルも含めてsourceforgeのRaspberry Pi emulation for Windowsからzip形式で一式ダウンロードできるようですのでダウンロードします。

2. 解凍&実行

ダウンロードしたqemu.zipを解凍し、run.batを実行するとRaspbianが起動します。動きはゆっくりなので、気長な作業が求められそうですが、ちょっと嬉しい感じです。

Raspbianを最新に

QEMUでのRaspbianの起動は思ったよりも簡単に起動できたのですが、よく見てみるとイメージファイルが2012-07-15-wheezy-raspbian.imgとかなり古い事が分かりました。新しい方が不具合も改善され、機能も増え、多言語環境も良くなる傾向にありますので、最新版にしたいと思います。手間ではありますが、手間をかけるだけの価値はあると思っています。

1. 最新のイメージをダウンロード

Raspbianから最新のイメージファイルをダウンロードします。この時点では2014-01-07-wheezy-raspbian.zipがダウンロードできました。2012-07-15-wheezy-raspbian.imgと思うとかなり新しいです。

2. 起動…

run.batを以下のように変更し実行します。ブートし順調に流れていくのですが、ログインまでたどり着かないようです。

qemu-system-arm.exe -M versatilepb -cpu arm1176
 -hda 2012-07-15-wheezy-raspbian.img2014-01-07-wheezy-raspbian.img 
 -kernel kernel-qemu -m 256
 -append "root=/dev/sda2"

3. 修正

調べてみたところ /etc/ld.so.preload を変更して共有ライブラリが読み込まれないようにしてしまえば起動できるらしい記事を見つけましたので試してみます。まずrun.batを以下のように変更して再度ブートします。

qemu-system-arm.exe -M versatilepb -cpu arm1176
 -hda 2014-01-07-wheezy-raspbian.img
 -kernel kernel-qemu -m 256
 -append "root=/dev/sda2 rootfstype=ext4 rw init=/bin/bash"

シングルユーザモードで起動しますので、/etc/ld.so.preload を空にしQEMUを終了します。

echo > /etc/ld.so.preload 

run.batを元に戻し実行します。今度は無事起動しました。

qemu-system-arm.exe -M versatilepb -cpu arm1176
 -hda 2014-01-07-wheezy-raspbian.img
 -kernel kernel-qemu -m 256
 -append "root=/dev/sda2 rootfstype=ext4 rw init=/bin/bash"

Raspbianの設定&パッケージのインストール

まずはRaspbianの設定です。日本語に必要なパッケージをインストールします。

1. 基本設定

起動するとraspi-configが自動的に起動しますのでLocaleにja_JP.UTF-8を追加、TimezoneをAsia/Tokyoに設定、Keyboard LayoutをJapaneseに設定します。

2. 日本語に必要なパッケージのインストール

サーバーからパッケージ・リストを入手します。

LANG=C sudo apt-get update --fix-missing

続けて日本語フォントと日本語入力システムをインストールします。

LANG=C sudo apt-get install ttf-sazanami-gothic ibus-anthy

3. 画面の大きさの調整

QEMU上のRaspbianは640x480で起動します。さすがに小さすぎますのでせめて800x600を使えるようにします。

sudo vi /etc/X11/xorg.conf
Section "Screen"
    Identifier    "Default Screen"
    SubSection "Display"
        Depth    16
        Modes    "800x600"
    EndSubSection
EndSection

4. ibusの設定

startxでウィンドウシステムを起動し、スタート -> 設定 -> ibusの設定 -> インプットメソッド -> インプットメソッドの選択 -> 日本語 -> Anthy -> 追加。

5. 確認

leafpadを起動し日本語入力ができる事を確認します。私の環境では[CTRL]+[SPACE]か、画面下のキーボードのアイコンをクリックしてAnthyを選択でしかIMEの切り替えができず、[半角/全角]キーを使うとおかしな動きをするようです。

scratchの設定と起動

長かったですがここからがやっとscratchの設定です。

1. scratchの起動ファイルの変更

scratchでIMEを有効にするために起動ファイル中のVMOPTIONSに"-compositioninput"を追加します。

sudo  vi /usr/bin/scratch
10行目あたり
VMOPTIONS="-encoding UTF-8 -vm-display-x11 -xshm -plugins /usr/lib/scratch/plugins/:$SQ_DIR/ -compositioninput"

2. 起動!

Scratchはデスクトップにアイコンがありますので起動してみます。試しに日本語を入力してみると、化けた文字が入力できました!ここで日本語入力ができないと前に進まないで嬉しい瞬間です。

日本語入力に挑戦

行う事はLinux版Scratch1.4で日本語入力と同じです。

1. まずはコンパイルに必要なパッケージをインストールします。

sudo apt-get install cmake g++ xorg-dev

2. VMのソースコードをダウンロード

ls -Al /usr/lib/squeak/ を実行するとVMのバージョンが4.10.2-2793である事が分かります。https://packages.debian.org/ja/wheezy/squeak-vmを探しても4.7.7しかないのですが、http://ftp.de.debian.org/debian/pool/main/s/squeak-vm/ を見ると4.10.2.2614というバージョンがありました。バージョンは少し違いますが、今回はsqueak-vm_4.10.2.2614.orig.tar.gzをダウンロードします。

$ ls -Al /usr/lib/squeak/
total 4
drwxr-xr-x 2 root root 4096 Jan  8 06:59 4.10.2-2793

3. ソースコードの解凍

ダウンロードしたソースコードを解凍します。

tar xvfz squeak-vm_4.10.2.2614.orig.tar.gz

4. ソースコードの変更

cd Squeak-4.10.2.2614-src
vi unix/vm-display-X11/sqUnixX11.c
1700行目あたり
static int recordPendingKeys(void)
{
  if (inputCount <= 0) {
    if (inputBuf != inputString) {
      free(inputBuf);
      inputBuf= inputString;
    }
    return 0;
  }

  int utf32 = 0;
  while (inputCount > 0) {
	//110x xxxx 10xx xxxx
	if(inputCount >= 2 &&
	   pendingKey[0] >= 0xc0 && pendingKey[0] <= 0xdf && 
	   pendingKey[1] >= 0x80 && pendingKey[1] <= 0xbf)
		{
		utf32 = ((pendingKey[0] & 0x1f) << 6) | 
			 (pendingKey[1] & 0x3f);
	        recordKeyboardEvent(0, EventKeyDown, modifierState, utf32);
	        recordKeyboardEvent(0, EventKeyChar, modifierState, utf32);
		pendingKey+=2;
		inputCount-=2;
	//1110 xxxx 10xx xxxx 10xx xxxx
	} else if(inputCount >= 3 &&
		  pendingKey[0] >= 0xe0 && pendingKey[0] <= 0xef && 
		  pendingKey[1] >= 0x80 && pendingKey[1] <= 0xbf && 
		  pendingKey[2] >= 0x80 && pendingKey[2] <= 0xbf)
		{
		utf32 = ((pendingKey[0]  & 0x0f) << 12) | 
			((pendingKey[1] & 0x3f) << 6) | 
			 (pendingKey[2] & 0x3f);
	        recordKeyboardEvent(0, EventKeyDown, modifierState, utf32);
	        recordKeyboardEvent(0, EventKeyChar, modifierState, utf32);
		pendingKey+=3;
		inputCount-=3;
	//1111 0xxx 10xx xxxx 10xx xxxx 10xx xxxx
	} else if(inputCount >= 4 &&
		  pendingKey[0] >= 0xf0 && pendingKey[0] <= 0xf7 && 
		  pendingKey[1] >= 0x80 && pendingKey[1] <= 0xbf && 
		  pendingKey[2] >= 0x80 && pendingKey[2] <= 0xbf && 
		  pendingKey[3] >= 0x80 && pendingKey[3] <= 0xbf)
		{
		utf32 =	((pendingKey[0] & 0x07) << 18) | 
			((pendingKey[1] & 0x3f) << 12) |
			((pendingKey[2] & 0x3f) << 6) |
			 (pendingKey[3] & 0x3f);
	        recordKeyboardEvent(0, EventKeyDown, modifierState, utf32);
	        recordKeyboardEvent(0, EventKeyChar, modifierState, utf32);
		pendingKey+=4;
		inputCount-=4;
	} else {
	        recordKeyboardEvent(*pendingKey, EventKeyDown, modifierState, 0);
	        recordKeyboardEvent(*pendingKey, EventKeyChar, modifierState, 0);
	        recordKeystroke(*pendingKey); /* DEPRECATED */
		pendingKey++;
		inputCount--;
	}
  }
  return 1;
  if (inputCount > 0)
    {
      int i= iebOut - iebIn;
      for (i= (i > 0 ? i : IEB_SIZE + i) / 4; i > 0; -- i)
	{
# if defined(DEBUG_XIM)
	  fprintf(stderr, "%3d pending key %2d=0x%02x\n", inputCount, i, *pendingKey);
# endif
	  recordKeyboardEvent(*pendingKey, EventKeyDown, modifierState, 0);
	  recordKeyboardEvent(*pendingKey, EventKeyChar, modifierState, 0);
	  recordKeystroke(*pendingKey);  /* DEPRECATED */
	  ++pendingKey;
	  if (--inputCount == 0) break;
	}
      return 1;
    }
  /* inputBuf is allocated by lookupKeys */
  if (inputBuf != inputString)
    {
      free(inputBuf);
      inputBuf= inputString;
    }
  return 0;
}

5. コンパイル&インストール

QEMUの速度がゆっくり目なので、今回はvm-display-X11のみをコンパイルしてインストールしてみます。インストールは既存のso.vm-display-X11を新しいfileso.vm-display-X11に差し替える事で行います。

mkdir bld
cd bld
../unix/cmake/configure
make vm-display-X11
sudo mv /usr/lib/squeak/4.10.2-2793/so.vm-display-X11 /usr/lib/squeak/4.10.2-2793/so.vm-display-X11.orig
sudo cp vm-display-X11/so.vm-display-X11 /usr/lib/squeak/4.10.2-2793/

オリジナルのso.vm-display-X11と新しいfileso.vm-display-X11を比較するとlinux Beanの時ほどは大きくならなかったようです。

ls -Al so.vm-display-X11*
-rwxr-xr-x 1 root root 115227 Jan  8 00:51 so.vm-display-X11
-rw-r--r-- 1 root root  97848 Dec 18 00:16 so.vm-display-X11.orig

6. 起動!

Scratchを起動し日本語入力をしてみて日本語が正しく表示される事を確認します。QEMUではゆっくりと動く感じでしたので、思ったよりも時間は掛かりましたが、アーキテクチャーが異なってもlinux Beanの時とほとんど同じ作業でできたのって凄い事だと思います。

ダウンロード


Last-modified: 2014-03-09 (日) 08:10:43 (0m)