2015年3月30日

Raspberry Pi 2にArchLinux, Xfce, Chromiumをインストール

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

卒論などでバタバタしてて放置してたRaspberry Pi 2、2ヶ月弱ぶりに触ってみました。
2/7の段階ではUSBキーボードを刺しただけでハングするくらい不安定だったArchLinuxでしたが、3/2に公開されたバージョンがあったので、インストールしてみます。
※細かい説明はコマンドの右側に「←」に続けて記述しています。(コピペ時に含めない様に注意)

パーティション作成

ここは別のマシン(ArchLinux on ThinkPad X220)で行いました。
トランセンド製のMicroSDHCカード 16GBを使用。

sudo fdisk /dev/mmcblk0
fdisk (util-linux 2.25.2) へようこそ。
ここで設定した内容は、書き込みコマンドを実行するまでメモリのみに保持されます。
書き込みコマンドを使用する際は、注意して実行してください。

コマンド (m でヘルプ): o
Created a new DOS disklabel with disk identifier 0xd88f609a.

コマンド (m でヘルプ): p
Disk /dev/mmcblk0: 14.7 GiB, 15719727104 bytes, 30702592 sectors
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスクラベルのタイプ: dos
ディスク識別子: 0xd88f609a

コマンド (m でヘルプ): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
パーティション番号 (1-4, default 1): 1
最初のセクタ (2048-30702591, default 2048): 
最終セクタ, +セクタ番号 または +サイズ{K,M,G,T,P} (2048-30702591, default 30702591): +100M

新しいパーティション 1 をタイプ Linux、サイズ 100 MiB で作成しました。

コマンド (m でヘルプ): t
Selected partition 1
16 進数コード (L で利用可能なコードを一覧表示します): c
DOS 6.x 領域を作成、または変更してしまった場合は、cfdisk 付属文書にある追加情報ページを参照してください。
パーティションのタイプを 'Linux' から 'W95 FAT32 (LBA)' に変更しました。

コマンド (m でヘルプ): n
Partition type
   p   primary (1 primary, 0 extended, 3 free)
   e   extended (container for logical partitions)
Select (default p): p
パーティション番号 (2-4, default 2): 2
最初のセクタ (206848-30702591, default 206848): 
最終セクタ, +セクタ番号 または +サイズ{K,M,G,T,P} (206848-30702591, default 30702591): 

新しいパーティション 2 をタイプ Linux、サイズ 14.6 GiB で作成しました。

コマンド (m でヘルプ): w
パーティション情報が変更されました。
ioctl() を呼び出してパーティション情報を再読み込みします。
ディスクを同期しています。

フォーマットと展開

sudo mkfs.vfat /dev/mmcblk0p1
sudo mount /dev/mmcblk0p1 boot
sudo mkfs.ext4 /dev/mmcblk0p2
sudo mount /dev/mmcblk0p2 root
su
wget http://archlinuxarm.org/os/ArchLinuxARM-rpi-2-latest.tar.gz
bsdtar -xpf ArchLinuxARM-rpi-2-latest.tar.gz -C root
sync
mv root/boot/* boot
umount boot root
SDカードを取り出す。

Rapsberry Pi 2での作業

SDカードをRaspberry Pi 2に刺して、LANケーブルを接続、電源を入れる。
ユーザ:root / パスワード:root でログイン
pacman -Syu  ←インストール済みパッケージのアップデート
pacman -S base-devel wget  ←gcc, makeなどのインストール
passwd  ←rootパスワードの変更
useradd -m -g wheel <ユーザ名>  ←ユーザの追加
passwd <ユーザ名>  ←追加したユーザのパスワード設定
visudo
以下のコメントアウトを外す
Defaults env_keep += "HOME"
%wheel ALL=(ALL) ALL
systemctl enable sshd.service  ←SSHサーバの起動
ip addr  ←Raspberry Pi2のIPアドレスを表示
exit
続きはSSHでRaspberry Pi 2に接続して行う

XとXfceのインストール

sudo pacman -S xorg-server xorg-server-utils xorg-xinit 
sudo pacman -S xf86-video-armsoc-git xf86-video-fbdev xf86-video-vesa
sudo pacman -S xfce4 xfce4-goodies

yaourtのインストール

sudo pacman -S yajl
cd
wget https://aur.archlinux.org/packages/pa/package-query/package-query.tar.gz
tar zxvf package-query.tar.gz
cd package-query
makepkg
sudo pacman -U package-query-1.5-2-armv7h.pkg.tar.xz
cd
wget https://aur.archlinux.org/packages/ya/yaourt/yaourt.tar.gz
tar zxvf yaourt.tar.gz
cd yaourt
makepkg
sudo pacman -U yaourt-1.5-1-any.pkg.tar.xz
yaourt -Syy  ←データベースのアップデート
yaourt -S ttf-ricty  ←日本語フォントのインストール
sudo pacman -S chromium  ←ブラウザ(chromium)のインストール

画面解像度の調整

1920x1080のFullHDで出力されるようにします。
sudo nano /boot/config.txt
hdmi_groupとhdmi_modeのコメントアウトを解除し、以下のように書き換え
hdmi_group=2
hdmi_mode=82
ここで、hdmi_groupの2はDMT、hdmi_modeの82は1080p 60 Hzを意味する
詳細はeLinux.orgのRPiconfigに記載されています。

Xfceの起動

以下、Raspberry Pi 2でログイン後
startxfce4
でデスクトップが表示されれば成功

YouTubeも再生できます。

2015年2月7日

Raspberry Pi 2 Model Bが到着

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

販売開始直後に発注したので、3日程度で到着。
外箱のサイズはB+と比較して若干厚みが増してましたが、ボード自体は発表通りサイズ・ポート位置の変更は無し。


手元にある2種類のB+用ケースに入れてみましたが、1個は完璧、もう1個は一部削ることで入りました。


今は販売されてない(2Bの発売開始とほぼ同時に消えた)このケースの場合、以下の写真のような感じ。


ものによっては基板裏の部品が干渉して入らないものあるようで、基板下にゆとりがあるケースならだいたい入るかなぁっと。

ちなみに↓これはキレイに入った。
http://jp.rs-online.com/web/p/development-board-enclosures/8293459/
ただし、このケース、通気口が無いので上の写真の真っ黒ケースに載せ替えたという訳です。

OSについては、BやB+でRaspbianを使っていた人なら、B(B+)で起動して
sudo apt-get update
sudo apt-get dist-upgrade
したSDを2Bに差し替えるだけで起動する。


dist-upgradeは結構時間が掛かるのでのんびり待ちます。
SDを2Bに差し替えて電源を入れると、クアッドコアの証、ラスベリーロゴが4個表示されて起動。


ブラウザでYouTubeを再生してみたりしましたが、まぁ見れる感じでした。
ただ、raspbian自体がちょっと微妙だなぁと思い始めてた(パッケージが古いものがあったりする)ので、次回はArch Linuxに載せ替える話の予定。

追記:dist-upgrade後のSDカード、boot領域の中身。


2014年12月7日

SECCON CTF 2014 online予選 QR400

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
前回の2013年で出た問題の逆(?)パターンでしたね。

問題:BBQR
Let's enjoy BBQR!


とりあえず、まずは問題の画像から読み解きます。
写っているマーカーと形式情報から、バージョン3のQRコードの左半分っぽいですね。

形式情報は全部残っていて、001011010001001と読めます。
誤り訂正レベル(Error Correction Level):00
マスクパターン参照子(Mask Pattern):101
誤り訂正レベルとマスクパターン参照子から算出した訂正ビット(Format error correction):1010001001

なので、訂正レベルH、マスクパターンは市松模様だと分かります。
バージョン3で訂正レベルHのQRコードは、データコード数26、エラー訂正コード数44、RSブロック数2です。

合成すると...

キレイにE1〜E44までのエラー訂正コードが残っています。
キレイにするとこんな感じかな?


左下図の赤がマスクパターン、右下図はパターンに従ってマスクしたところ。


このアンチマスクを合成して...


これを読んでいくと、下表のとおり。


以下のページを参照すると
http://www.swetake.com/qrcode/qr3.html

f(x)をg(x)で除算して... 排他的論理和を計算して... というのを26回ほど繰り返すと剰余R(x)が出てくるという感じだそうで。

データコードを係数とした多項式f(x)→これが分かるとflagが出てくる
エラー訂正コードの生成多項式g(x)→データコード数から算出可能
剰余R(x)→今回のQRコードで残っている部分


ここでタイムアップでした。

ここから先、解けたら追記していきます。
というより、このアプローチで正しいのかすら分かりません。
前回同様に人力解読に挑戦していますが、QRコードリーダのプログラムを上手く改良してエラー訂正コードのみからデータを取り出せるようにすることが出来るかもしれませんし...

※まだ解けてないので、上の画像(QRコードや表、剰余の式)は正しいと保証できませんのであしからず...

追記 2014/12/07 20:24:マスクパターンを掛け間違っていたので、画像を差し替えました

追記 2014/12/08 03:40:問題制作者とのやりとり



というわけで、今回はflagのフォーマットが SECCON{〜} の形になっていると想定して進めます。
当初は全て8ビットバイトモードで記述されていると思って、8ビットバイトモードで求めていたのですが、うまくいかず...
というわけで、混合モードというものがあるそうで(初めて知った...
先頭のSECCONは英数字モード、それ以降の{〜}を8ビットバイトモードであると仮定して...

英数字モード6文字=0010 000000110
SE=45*28+14=1274=10011111010
CC=45*12+12=552=01000101000
ON=45*24+23=1103=10001001111
ここまでで、4+9+11+11+11 = 46 bit

8ビットバイトモード18文字=0100 00010010
{=123=01111011
ここまでで、66 bit → 66/8 = 8.25 → D1〜D9の先頭2bitまで分かる

逆に終端は
}=125=01111101
ここまでで、202bitなので208bitになるように6bitを0で埋める

??011111 → D25
01000000 → D26

残り、D9後半6bit〜D25先頭2bitまでの合計128bit、16文字が不明。

αの指数と整数の対応表は http://www.swetake.com/qrcode/qr_table4.html を参照


でも、この手法だと8回目で計算できなくなる...


色々とアレだったので、改めて解法を別記事に書き直します...
(問題作成者からもアドバイスを頂いたので、それも含めて。)


以下おまけ。元々のD1〜D26。


これを当てはめて市松模様でマスクを掛けると以下のQRコードが復元できます。

2014年11月30日

aitendoの正方形LCDをmbedで駆動させる

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

久々にハードウェア系のネタ。
今回は、aitendoで販売されているスクエアLCD「ZY-FGD1442701V1」をmbed(1768)で動かします。

特徴は...
・128×128ピクセル
・65535色(16bitカラー)
・接続は8bitパラレル
・1000円くらい(割と安い?)

TFT液晶モジュール(1.44/128×128) [ZY-FGD1442701V1] (液晶単体)
1.44インチ液晶withキャリーボード [2P-1442701V1-PCB] (キャリーボード付き)

追記(2015/10) : 上記の商品は取り扱い終了しています。現時点では、以下の商品で同じように動かせるはず。
TFT液晶モジュール(1.44/8bit) [Y1411A1]

ネットで「ZY-FGD1442701V1」を検索すると先人たちの記事が出てきますが、いずれも搭載されているコントローラがST7735のもので、現在販売されているST7735S搭載版についての記事が見つかりません。
ST7735→ST7735Sでコマンドなどが一部変更になっているので、これに対応するようにしました。
初期化コードはaitendoが公開しているものに少々手を入れています。
#データシートもaitendoの商品ページにあるので助かりました

コードは以下(mbed Hg repository)に全て置いてます。
ZY_FGD1442701V1_BusOut_SDHC

以下は解説スライド (Qemb#03での発表を前提に準備してましたが、開催できなかった...)


スライド中で扱っている描画速度ですが、このスライドを作った後に別のSDHCカードで試してみたところ最終的に150ms程度で描画することができました。
また、画像ではなく黒や白で塗りつぶした(for文で0xffffffff、0x00000000を128*128*2回ぶん回した)場合、BusOutで105ms、PortOutで24msでした。

追記:LPCXpresso NXP LPC1769が手元に届いたので、これでも動作チェックしてみたいと思っています。

2014年10月16日

OpenLayers 3でOpenStreetMap上にピンを打つ

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
OpenLayers 3を使って、緯度経度で指定したポイントやポイントを結んだ形の図形をOpenStreetMap上に表示してみた。
OpenLayersは2から3へのアップデートで結構変わってる上にドキュメントは微妙、日本語での解説は2ばかりという状況なので、色々と試しながらです。

問題点は
・OpenStreetMapは球面メルカトル図法(EPSG:3857)で描画される
・ポイントは緯度経度(WGS84/EPSG:4326)で示したい
・EPSG:3857とEPSG:4326のレイヤーは同時に表示できない

最終的には
format: new ol.format.GeoJSON({
    defaultProjection: 'EPSG:4326'
}),
projection: 'EPSG:3857',
みたいな感じで解決できました。

以下、ソースコード

GeoJSONの仕様は
http://s.kitazaki.name/docs/geojson-spec-ja.html
を参考に。

上記コード内では、textで直接GeoJSONを書き込んでいるが、実際はurlで外部からjsonファイルを引っ張ってくる使い方が一般的(のはず)。

ちなみに、Polygonは閉路になる順にcoordinatesを指定してしないと捻れちゃうので、その辺も要注意。
そういうのを踏まえて、投げられた複数のジオタグから凸包を描くようなGeoJSONを吐くプログラムを現在製作中...