緯度、経度、latitude、longitude…どれがなんだっけ?

緯度、経度、latitude、longitude……どれがどれだかよくわからなくなるのでこうやって覚えた。

緯度  いど    latitude   ←短い
経度  けいど  longitude  ←長い

文字数が短い同士。
文字数が長い同士。しかもなんかlongとかついてるし!*1


そんで、緯度と経度はどっちがどっちなんだっけ?


北緯とか東経とか言うから、緯度が南北の角度、経度が東西の角度。
緯度は赤道を中心に南北90度。
経度はグリニッジ子午線を中心に東西180度。

ん?

緯度  いど    latitude    90度  ←短い(小さい)
経度  けいど  longitude  180度  ←長い(大きい)

これも絡めて覚えられそう!

おまけ

角度は座標次第なのでなんとも言えないけど、日本に限って言えば

都庁
北緯  35.689  ←小さい
東経 139.691  ←大きい
緯度  20度〜 45度  ←小さい
経度 122度〜153度  ←大きい

こんな感じなので、ぱっと数字を見た時にどっちがどっちかもいけるね!
GoogleマップのURLに入ってるやつとか。

おまけ2

並べて言うときは「緯度経度」「latlng」って言うのが一般的に多いと思うので、そのまま同じ順番で覚えるという手もある。
というか上みたいにこじつけて覚えるよりも圧倒的に早いw

緯度 経度
lat  lng

*1:発音は違います。

Raspberry PiにXDMCPでログインする

前回VNCで接続できるようにしてみたが、これだと毎回sshでログインしてからvncserverを起動しないといけないので、今回はもう一歩進んでログイン画面からリモートで接続できるようにしてみる。

前準備(Macの場合)

今回のXDMCPによるログインは、前回のような「サーバへの接続」ではできないのでX11を利用する。
Mountain LionからはX11が同梱されなくなったので、XQuartzを入れる。
dmgパッケージなのでちゃちゃっと入れちゃおう。

XDMCPを有効にする

Raspbianには既にLightDMが入っているので設定を変更するだけ。

# 念のためバックアップを取ってから編集
sudo cp /etc/lightdm/lightdm.conf{,.orig}
sudo -e /etc/lightdm/lightdm.conf
  • [LightDM]にxserver-allow-tcp=trueを追加
  • [XDMCPServer]のenabledのコメントを外してtrueに変更

その他はデフォルトでもいいけど、興味があったら設定ファイル内のコメントを読んでみて。

[LightDM]
#start-default-seat=true
#greeter-user=lightdm
#minimum-display-number=0
#minimum-vt=7
#user-authority-in-system-dir=false
#guest-account-script=guest-account
#log-directory=/var/log/lightdm
#run-directory=/var/run/lightdm
#cache-directory=/var/cache/lightdm
#xsessions-directory=/usr/share/xsessions
#xgreeters-directory=/usr/share/xgreeters
xserver-allow-tcp=true                       ← これ追加

[XDMCPServer]
enabled=true                                 ← trueにする
#port=177
#key=

diffはこんな感じ。

--- lightdm.conf.orig	2012-12-27 01:37:34.031485019 +0900
+++ lightdm.conf	2012-12-27 02:47:16.140862964 +0900
@@ -25,6 +25,7 @@
 #cache-directory=/var/cache/lightdm
 #xsessions-directory=/usr/share/xsessions
 #xgreeters-directory=/usr/share/xgreeters
+xserver-allow-tcp=true
 
 #
 # Seat defaults
@@ -99,7 +100,7 @@
 # it can be a word and the first 7 characters are used as the key.
 #
 [XDMCPServer]
-#enabled=false
+enabled=true
 #port=177
 #key=

LightDMを起動する

runlevel 5*1で起動するか、lightdmを起動する。

sudo service lightdm start


OS起動時に自動的に起動させるならinittabでrunlevel 5とかにしておけばよさそう。試してないけど。
たぶんraspi-configでGUIブートにしてもいいんだろうけどやったことないのでよくわからない。
ここでやった設定上書きされちゃったりするのかな。

Macから接続してみる

ターミナルからXquartz -queryを実行する。

Xquartz -query IPアドレス

しばらくするとログイン画面が表示される。
どうもMacではルートウィンドウがないっぽいので*2、ダイアログと上のバー以外はMacのデスクトップが透けてるけど、ログインするとRaspberry Piのデスクトップが出てくる。


ルートウィンドウがある場合はlightdm-gtk-greeter.confで指定されてる背景色になるんだけど、これはMacの壁紙がそのまま見えてるw

なんか英語なんだけど

GDMからのログイン時は.profileとか.bashrcとかが読み込まれないので、.xsessionrcに書いておく。

export LANG=ja_JP.UTF-8

この辺いまいち知識が足りなくてよくわかってないんだが、.xprofileとか.xinitrcとか似たようなのいっぱいありすぎる。

*1:Debian系だと3とかでもGUI起動っぽいのね

*2:環境設定でフルスクリーンモードにするればルートウィンドウができるようだ。

Raspberry PiにVNCで接続する

前回Raspberry Piをヘッドレス化して、キーボード、HDMI、LANケーブルという鎖から解き放たれたわけだけど、それと同時にラズベリーのデスクトップも失ってしまったので、今回はVNCでリモート接続できるようにしてみる。

TightVNCのインストール

VNCの実装は色々あるけど、TightVNCを利用している例が多かったので真似してみる。

sudo apt-get install tightvncserver

とりあえず起動してみる

vncserverコマンドに解像度や色数などを指定して実行するとサーバが起動する。
詳しいオプションについてはman vncserverman Xvncを参照。


初回起動時はクライアントからVNC接続する時に使用するパスワードの設定を聞かれる。
このパスワードは6文字以上8文字以下らしく、8文字以上入力しても切り捨てられるので注意。
続けて聞かれるview-only passwordというのは表示のみで操作できないモード用のパスワード。


ちなみにVNCの通信は暗号化されないので、実運用するような場合はsshでポートフォワーディングなどしたほうがよいかと思われる。
ひとまずここではお試しということでそのまま繋いでみる。

$ vncserver :0 -geometry 1280x800 -depth 24

You will require a password to access your desktops.

Password: 
Verify:   
Would you like to enter a view-only password (y/n)? n

New 'X' desktop is raspberrypi:0

Starting applications specified in /home/pasela/.vnc/xstartup
Log file is /home/pasela/.vnc/raspberrypi:0.log

これで起動完了。
ポート番号は5900 + ディスプレイ番号(:0っていうやつ)で起動するらしい。
なのでvncserver :2として起動した場合は5902になる。

VNCクライアントから接続してみる

Macの場合

Macの場合は、Finderの「サーバへ接続...」でサーバアドレスに「vnc://RaspberryPiのIPアドレス:ポート番号」と入力して接続する。
暗号化がどうたらというのはひとまず無視しておいて、パスワードを聞かれるので先ほど設定したものを入力するとデスクトップが表示される。


Macから接続



iPadから接続(Remoter VNC)



iPhoneから接続(Remoter VNC)

Windowsの場合

OS標準では対応してないようなので適当にVNCクライアントをインストールする必要があるみたい。
リモートデスクトップVNCとは違う。

VNCサーバの終了

VNCサーバを終了する場合は、-killオプションにディスプレイ番号を指定して実行する。

$ vncserver -kill :0
Killing Xtightvnc process ID 3980

パスワードの変更

初回起動時に適当にパスワードを入れちゃって変えたいなーという時はvncpasswdを実行する。

$ vncpasswd
Using password file /home/pasela/.vnc/passwd
Password: 
Verify:   
Would you like to enter a view-only password (y/n)? n

Raspberry Piを無線LAN化

前回のセットアップでとりあえずRaspberry Piが動いたわけだけど、あのちっちゃいボディに対して給電USB、HDMI、LANケーブル、マウスにキーボードと色々なものが刺さりすぎて鬱陶しかったので、ヘッドレス&無線LAN化してssh経由でアクセスできるようにしてみる。これで繋げるケーブルは給電用のUSBケーブルのみとなってスッキリ!


ちなみにヘッドレス化が目的ではなく、デスクトップで使う人はデスクトップ上にある無線LANの設定ツールから設定すれば簡単……かもしれない。やったことないからわからないw

環境

Raspberry Pi Model B(2012年12月頃)


OSは2012-12-16-wheezy-raspbian.zip

$ uname -a
Linux raspberrypi 3.2.27+ #250 PREEMPT Thu Oct 18 19:03:02 BST 2012 armv6l GNU/Linux

初期状態の設定がググって出てきたサイトと微妙に違ったりしたので、日々改良されているのかもしれない。

無線LANアダプタ

WLI-UC-GNM2 | BUFFALO バッファロー
http://buffalo.jp/product/wireless-lan/client/wli-uc-gnm2/


ヨドバシで適当に買ってきた。マウスのレシーバみたいにちっちゃいやつがいいなーと思って。
お値段も980円と気軽にチャレンジできる。Amazonとかだと700円ぐらいみたい。

とりあえず挿してみる

とりあえずマウスを外して無線LANアダプタを挿して起動してみたところ、なんか自動的に認識してる感じだった。

$ dmesg
[    3.343406] usb 1-1.2: new high-speed USB device number 4 using dwc_otg
[    3.490157] usb 1-1.2: New USB device found, idVendor=0411, idProduct=01ee
[    3.523202] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[    3.552689] usb 1-1.2: Product: 802.11 n WLAN
[    3.573216] usb 1-1.2: Manufacturer: Ralink
[    3.593209] usb 1-1.2: SerialNumber: 1.0

なんかそれっぽいデバイスが検出された。


本当はtail -f /var/log/messagesして挿した瞬間を見たかったんだけど、電力が不安定なのか挿した瞬間再起動してしまったので、挿した状態から起動。
セルフパワーのUSBハブにしたらいいのかもしれないけど、それではコンパクト化にならないのでこのまま様子を見る。

$ lsmod
Module                  Size  Used by
aes_generic            31457  2 
snd_bcm2835            12808  0 
snd_pcm                74834  1 snd_bcm2835
snd_seq                52536  0 
snd_timer              19698  2 snd_seq,snd_pcm
snd_seq_device          6300  1 snd_seq
snd                    52489  5 snd_seq_device,snd_timer,snd_seq,snd_pcm,snd_bcm2835
snd_page_alloc          4951  1 snd_pcm
arc4                    1187  2 
rt2800usb              13009  0 
rt2800lib              47242  1 rt2800usb
crc_ccitt               1465  1 rt2800lib
rt2x00usb              11075  1 rt2800usb
rt2x00lib              41057  3 rt2x00usb,rt2800lib,rt2800usb
mac80211              236178  3 rt2x00lib,rt2x00usb,rt2800lib
cfg80211              171957  2 mac80211,rt2x00lib
evdev                   8682  2 

rt2800usb(たぶんこれがドライバ)が読み込まれてる。
rt2800はblacklist入りしてRT3070のやつを別途入れたほうがいいのかもしれないけど、面倒くさそうなのでとりあえずこれで。

$ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp. 
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. 
Bus 001 Device 004: ID 0411:01ee BUFFALO INC. (formerly MelCo., Inc.) WLI-UC-GNM2 Wireless LAN Adapter [Ralink RT3070]
Bus 001 Device 005: ID 060b:6220 Solid Year 

そのものずばりな型番が出てる。

$ ifconfig
wlan0     Link encap:Ethernet  HWaddr XX:XX:XX:XX:XX:XX  
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
wlan0     IEEE 802.11bgn  ESSID:off/any  
          Mode:Managed  Access Point: Not-Associated   Tx-Power=20 dBm   
          Retry  long limit:7   RTS thr:off   Fragment thr:off
          Power Management:on

で、こんな感じでインタフェースとして出てきた。
ちなみにHWaddrの部分がMACアドレスなので、アクセスポイント側でMACアドレスフィルタとかしてる場合は、この値を追加してあげる。


この状態でとりあえずアクセスポイントをスキャンしてみる。

sudo iwlist wlan0 scan

# あるいは
sudo iwlist wlan0 scan | grep ESSID

するとなにやらずらずらと出てくるのでとりあえず動作はしている模様。



さて……ここから先、上手くいったりいかなかったり試行錯誤しまくったので不確かですw
この記事を書くにあたって一度全部設定を戻してからなぞってるので大丈夫だとは思うんだけど……。


アクセスポイントに接続してみる

ここまでくれば無線LANアダプタは無事に動いているようなので、この状態でiwconfigでSSIDとキーを設定すると繋がるらしい(大文字小文字区別するので注意)。
キーは16進数で指定する時はそのまま、パスフレーズみたいな任意の文字列で指定する場合は頭に「s:」をつける。

sudo iwconfig wlan0 essid 接続先のSSID key s:接続先のキー

例:SSIDがpaselanでキーがhimitsu123の場合
sudo iwconfig wlan0 essid paselan key s:himitsu123
$ iwconfig wlan0
wlan0     IEEE 802.11bgn  ESSID:"paselan"  
          Mode:Managed  Access Point: Not-Associated   Tx-Power=20 dBm   
          Retry  long limit:7   RTS thr:off   Fragment thr:off
          Power Management:on

iwconfigで確認するとESSIDのところが設定した値になってる。
で、DHCPの場合はこのままdhclientでIPアドレスを割り振ってもらえば繋がるようになる。

sudo dhclient wlan0

少し時間かかる。
特にエラーっぽいメッセージが出ずにPINGどうたらみたいなのが出たらとりあえず成功かもしれない。

$ ifconfig wlan0
wlan0     Link encap:Ethernet  HWaddr XX:XX:XX:XX:XX:XX  
          inet addr:192.168.1.162  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

ifconfigで確認してみると無事にIPアドレスが割り当てられている。
おそらくpingとかが通るはず。


ちなみに、自分はここでiwconfigで見てもESSIDのところが全然設定されずに繋がらないこともあって、ここでだいぶはまったんだが、とりあえず起動時の設定に進んだら無事に動くようになったりもしたので、ここではまってもとりあえず先に進んでみるといいかもしれないw
だいたい次の起動時の設定ではやたら項目があるのに、先のコマンドではessidとkeyしか指定がないので繋がるほうが不思議な気がする。

起動時に無線LANアダプタで繋がるように設定する(WPA2-PSK)

/etc/network/interfacesをこんな感じに書き換えた。
wpa-*という項目はwpa_supplicant.confの項目と対応している(wpa-をつけて_を-にする)ので、詳しい値はそのへんのヘルプを参照。
たぶんwpa_supplicant.confに設定を書いて、こっちにはwpa-confで設定ファイルを指定してもいいんだと思う(後述)。


以下はWPA2-PSKの例。

auto lo

iface lo inet loopback

allow-hotplug eth0
iface eth0 inet dhcp

allow-hotplug wlan0
iface wlan0 inet dhcp
wpa-driver wext
wpa-ap-scan 1
wpa-scan-ssid 1                  # APがステルスモードの場合は1、それ以外は0
wpa-key-mgmt WPA-PSK             # キーの種類
wpa-proto WPA2                   # WPAとかWPA2とか
wpa-pariwise CCMP                # CCMPとかTKIPとか
wpa-group CCMP                   # CCMPとかTKIPとか
wpa-ssid "接続先のSSID"
wpa-psk "接続先のキー"
#wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp

差分はこんな感じ。

--- /etc/network/interfaces.org	2012-12-22 09:04:15.800000003 +0900
+++ /etc/network/interfaces	2012-12-25 01:46:11.506044001 +0900
@@ -1,9 +1,20 @@
 auto lo
 
 iface lo inet loopback
+
+allow-hotplug eth0
 iface eth0 inet dhcp
 
 allow-hotplug wlan0
-iface wlan0 inet manual
-wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
+iface wlan0 inet dhcp
+wpa-driver wext
+wpa-ap-scan 1
+wpa-scan-ssid 1
+wpa-key-mgmt WPA-PSK
+wpa-proto RSN
+wpa-pariwise CCMP
+wpa-group CCMP
+wpa-ssid "接続先のSSID"
+wpa-psk "接続先のキー"
+#wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
 iface default inet dhcp
  • eth0をallow-hotplugに
  • wlan0をmanualからdhcp
  • wpa-roamをコメントアウト
  • wpa-*でアクセスポイントの設定を書きまくる

wpa-pskの部分は16進数で指定するんだけど、これはwpa_passphraseというコマンドで得られる。
こんな感じ。

# SSID=paselan, キー=himitsu123の場合
$ wpa_passphrase paselan himitsu123
network={
	ssid="paselan"
	#psk="himitsu123"
	psk=190863550e8b4cf62f28747de7a6545c3ebb7c3e40af26a45811da549eae53a5
}

これは実はwpa_supplicant.confの書式。


以上の設定が終わったら試しに再起動してみる。

sudo reboot

無事繋がるかな?
起動したらifconfigで確認してみよう。

起動時に無線LANアダプタで繋がるように設定する(WEP)

WEPでは設定をしたことがないのでよくわからないけど、wpa-*ではなくwireless-essidとwireless-keyの2つを設定すればいいらしい。
こんな感じ?

auto lo

iface lo inet loopback

allow-hotplug eth0
iface eth0 inet dhcp

allow-hotplug wlan0
iface wlan0 inet dhcp
wireless-essid 接続先のSSID
wireless-key 接続先のキー
#wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp

wpa_supplicant.confに書く場合(WPA2-PSK)

/etc/network/interfacesに全部書くよりwpa_supplicant.confに書いたほうがwpa_supplicantコマンドとか叩けていい気がするので、そうしたい場合はこんな感じかな?

/etc/wpa_supplicant/wpa_supplicant.conf

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
	ssid="接続先のSSID"
	scan_ssid=1                  # APがステルスモードの場合は1、それ以外は0
	key_mgmt=WPA-PSK             # キーの種類
	proto=WPA2                   # WPAとかWPA2とか
	pairwise=CCMP                # CCMPとかTKIPとか
	group=CCMP                   # CCMPとかTKIPとか
	psk="接続先のキー(16進数)"
}

最初の2行は書かれていたのでnetwork { 〜 }の部分を追記。


/etc/network/interfaces

auto lo

iface lo inet loopback

allow-hotplug eth0
iface eth0 inet dhcp

allow-hotplug wlan0
iface wlan0 inet dhcp
#wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp

Raspberry Piが届いた!

話題の名刺サイズPC、Raspberry Piがようやく届いた!





Raspberry Pi

Raspberry Piは名刺サイズのシングルボードPC。
CPUはARM 700MHz、メモリは最近のmodel Bだと512MBで、ディスクはなくてSDカードを使用する。その他、USBポートが2つにLANポート、HDMIでディスプレイに繋ぐようになっている。電源もUSBから給電。普通にLinuxが動いて、それでいてお値段35ドルとリーズナブルだったりする。大人気すぎて注文してもなかなか届かないとか。



というわけで、うちにもようやく届いたので早速立ち上げてみたよ。
起動SDカード準備の部分はMacでの作業記録。

SDカードにOSイメージを書き込む

Raspberry Piのダウンロードページからお好みのものを選んで、ddコマンドとかWin32DiskImagerでSDカードに書き込む。


ArchはVMでちょろっとしか触ったことなくてそれほど詳しくないので、無難にDebianベースのRaspbianにする。
Oracle JVMを使用する場合はSoft-float版を使わないとだめらしいんだけど、OpenJDKの場合はどうなんですか?わかりません!
まぁ色々試してみようってことで普通の方を選択してみた。torrentでOSダンロードなーう。


Macの場合、SDカードをカードリーダーに挿すと自動的にマウントされると思うので、すかさずアンマウントする。
カードの名前を変えとくとわかりやすい。どうせ消えるけど。

$ df -h
Filesystem       Size   Used  Avail Capacity  iused    ifree %iused  Mounted on
/dev/disk0s2    238Gi  140Gi   97Gi    60% 36833943 25470927   59%   /
devfs           185Ki  185Ki    0Bi   100%      641        0  100%   /dev
map -hosts        0Bi    0Bi    0Bi   100%        0        0  100%   /net
map auto_home     0Bi    0Bi    0Bi   100%        0        0  100%   /home
/dev/disk2s1    7.5Gi  2.2Mi  7.5Gi     1%        0        0  100%   /Volumes/RASPBIAN  ←こいつだー!

$ diskutil unmount /dev/disk2s1

バイスは環境によって異なるので各自で確認しよう。ここでは/dev/disk2だった。


んで、rawデバイスのほうが速いらしいのでrawデバイスで指定する*1。頭に"r"をつければいい。
ちなみにここでデバイスを間違えると大変なことになるので不安ならdiskutil infoで確認しておくといい。

$ diskutil info /dev/rdisk2
   Device Identifier:        disk2
   Device Node:              /dev/disk2
   Part of Whole:            disk2
   Device / Media Name:      APPLE SD Card Reader Media
                         :
                         :

んむ、SD Card Reader Mediaなので大丈夫そう。
では落としてきたzipを展開して出てきたimgを書き込む。

sudo dd bs=1m if=2012-12-16-wheezy-raspbian.img of=/dev/rdisk2

しばし時間がかかる。LinuxならSIGUSR1、MacBSDならSIGINFO(Ctrl+T)で進捗状況が確認できる。
MacなのでCtrl+Tを押すとこんな感じで現在の状況が表示される。

load: 0.33  cmd: dd 11655 uninterruptible 0.00u 0.28s
230+0 records in
229+0 records out
240123904 bytes transferred in 15.685685 secs (15308474 bytes/sec)

しばらく待ってると書き込みが完了する。うちの環境では2分ぐらいだった。

1850+0 records in
1850+0 records out
1939865600 bytes transferred in 122.027198 secs (15896994 bytes/sec)

Raspberry Piの起動と初期設定

出来上がったSDカードをRaspberry Piに挿して、各種ケーブルを繋いで起動。
スイッチとかないので電源用USBケーブルをつなぐと起動する。

起動したー!ラズベリーのマークがかわいい。


無事に起動すると初期設定画面が表示される。この画面は後からraspi-configを実行することで呼び出せる。
操作はカーソルキーの上下で項目移動、Enterで決定、ボタンとかのフォーカスの移動はTabといった感じ。


とりあえずupdateをするといいんじゃないでしょうか。自分はやり忘れたw

expand_rootfs

ルートパーティションを拡張する。
先ほど書き込んだRaspbianは2GBのイメージなのでこのままだと2GBの容量しか使えないが、2GBよりも大きいSDカードを使用している場合は、これで容量全体を使用するように設定できる。迷わず実行。設定は次回起動時に反映される。

再起動した時にサイズの変更処理が行われるが、かなーり時間がかかるので焦らないように。
"Performing an on-line resize of 〜"みたいな表示の部分で小人さんが頑張っています。

overscan

画面の端を少し空ける設定をする。画面の周囲が切れるような場合に設定するのかな?不要なのでスルー。

configure_keyboard

キーボードの配列を設定する。
自分は"Generic 105-key (Intl) PC" → "Other" → "Japanese" → "Japanese (ODAG 109A)"と選択していった。
その後のAltGrキーとかComposeキーはなんのことかわからないので、defaultとかnoとかを選んでおいた。
どうせ設定が終わったらsshで繋ぐんだからキーボードなんてどうでもいいw
Xサーバ落とすやつもNoでいいかな。

change_pass

piユーザ(初期ユーザ)のパスワードを変更する。変えておこう。
ちなみに初期アカウントはイメージのダウンロードページに書いてあったね。

change_locale

ロケールの設定。"ja_JP.UTF-8"にしたいところだけど、日本語フォントが入ってないので、今やると文字化けして大変なことになるのでぐっと我慢して後回しにしよう。

change_timezone

タイムゾーンの設定。"Asia" → "Tokyo"としておく。

memory_split

CPUとGPUへのメモリ配分を設定する。ここで設定した分がGPUに割り当てられ、残りがCPUに割り当てられる。
512MB版はデフォルト値が64MBとなっている。とりあえずデフォルトのままにしておいた。

overclock

オーバークロックの設定。さわらないでおく。

ssh

sshを有効にするかどうか。もちろん有効にする。

boot_behaviour

直接GUIで起動するかどうか。まだまだコンソールで作業したいのでNoにしておく。
ちなみにNoの場合はコンソールでstartxを実行すればデスクトップが起動する。

update

この設定ツール(raspi-config)の最新版があれば更新する。
とりあえずやってみたけど、最初にやればよかったw



一通り設定してFinishを選択すると再起動。expand_rootfsをやった人はだいぶ待たされる。
ちなみにここで設定した内容は/root/config.txtに保存される模様。

アップデートとか

無事にサイズ拡張も終わってプロンプトが表示されたら、piユーザでログインしてあとは普通に使うだけ。
なのでとりあえずアップデートしておく。

sudo apt-get update
sudo apt-get upgrade

日本語化とか

初回設定の時にぐっとこらえた日本語化を。


まずはフォント。apt-cache search font japaneseとかするとわらわら出てくるのでお好みでインストール。

sudo apt-get install fonts-ipafont ttf-vlgothic xfonts-intl-japanese xfonts-intl-japanese-big

次に日本語入力。mozc使いたいけど調べる気力がないのでAnthyで。

sudo apt-get install ibus-anthy

そして最後にロケール変更。
さっきのraspi-configでもいいけど。

sudo dpkg-reconfigure locales

デフォルトだとen_GB.UTF-8が有効になっている。とりあえずen_US.UTF-8とja_JP.UTF-8を追加した。
システムのロケールはとりあえずen_US.UTF-8にしておいた。


で、.profileで$LANGに設定することにする。

echo "export LANG=ja_JP.UTF-8" >>~/.profile

そしてデスクトップへ

ここらで一旦再起動して、

sudo reboot

ログインしたら、いよいよstartx!

startx




デスクトップきたー!
中央に鎮座するラズベリー(壁紙)。右は噂のPi Store。

ユーザ追加

いつまでもpiユーザというのもあれなので、自分用ユーザを追加する。

sudo adduser pasela

piユーザが入ってたのと同じグループに入れておく。
なんか色々入ってないとXがうまく動かない。

sudo vigr

# piが入ってるのと同じグループにひたすら自分を足していく。

sudo vigr -s

# さっきと同じ。

piユーザからログアウトして入り直す。
piユーザみたいにデスクトップにアイコンが配置されてなくて、さみしい…。まぁいいか。

*1:diskがblock deviceでrdiskがcharacter deviceらしい。

素のPHPはもはやテンプレートエンジンとしては使えない

なんか未だに「PHP自体がテンプレートエンジンなのになんでSmartyとか使うの?」みたいに考えている人がいるようなのでちょっと。
といっても、言いたいことはSymfony開発者でありTwigの現在の開発者*1でもあるFabien氏がこれでもかってぐらいに語っているので、それを読んでもらったほうが早い。というか読むべき!


Templating Engines in PHP - Fabien Potencier
http://fabien.potencier.org/article/34/templating-engines-in-php


ちなみに、PHPを使ってる事自体が云々とかいう茶々はいりません。



まぁようするに、

<div><?php echo htmlspecialchars($var, ENT_QUOTES, 'UTF-8'); ?></div>

おまえ本当にこんなんでいいと思ってんの?と。
さすがにこれはベタすぎるので百歩譲ってこうだったとしても、

<div><?= h($var); ?></div>

それでも自分はこっちのほうがいい(↓はSmarty)。

<div>{$var|escape}</div>

この例だと文字数はほぼ変わらないけど見やすさは全然違う。

もう少し具体的な例

別にフレームワークを対比させたいわけじゃないので何のフレームワークとは言わないけど、とりあえず素のPHPのViewのやつとTwigのやつを。
内容は適当にでっちあげた。

<div id="products">
  <?php if (!empty($products)): ?>
    <?php foreach ($products as $id => $product): ?>
      <div class="product">
        <div><?php echo $this->Html->link(Inflector::humanize($product['title']), array('action' => 'products', $id)); ?></div>
        <div><?php echo h(date('Y/m/d', $product['published_at'])); ?></div>
        <div><?php echo h(number_format($product['price'])); ?></div>
        <div><?php echo h(!empty($product['description']) ? $product['description'] : '-'); ?></div>
      </div>
    <?php endforeach; ?>
  <?php else: ?>
    <p>no products found</p>
  <?php endif; ?>
</div>
<div id="products">
  {% for id, product in products %}
    <div class="product">
      <div><a href="{{ path('products', { 'id': id }) }}">{{ product.title|title }}</a></div>
      <div>{{ product.published_at|date('Y/m/d') }}</div>
      <div>{{ product.price|number_format }}</div>
      <div>{{ product.description|default('-') }}</div>
    </div>
  {% else %}
    <p>no products found</p>
  {% endfor %}
</div>

※Twigの場合(大抵は)出力がデフォルトでエスケープされる設定にされているので{{ $var|escape }}みたいな書き方はしなくてよい。


ヘルパーとか使いまくりの例だともっと顕著な差が出てくると思うんだけど、それってフレームワークの問題でもあるので、やや無難な比較になってしまったか。
あと面倒くさかったので省いてしまったけど、プルダウンメニューとか状態によって変わってくるものもテンプレートエンジンだとスマートに書くための方法が用意されているよね。


素のPHPでも同じように関数なりヘルパーを書けば似たようなことはできるけど、結局素の構文に引きずられるので、

$this->helper->escape($this->helper->currency($price))

みたいな長ったらしい書き方になって、もうそれだけで気が滅入るほどに可読性を下げてるんだよ。打つのもめんどくさいし。

$price|currency|escape

って書けたほうが楽だしわかりやすいと思いませんか?(自動エスケープがあれば最後のescapeすら不要だし)


それにフィルタ的なものを関数で実現する*2となると、グローバル空間にそういう関数をわんさか作っていくってことになるよね。グローバル空間にcurrency()とか定義しちゃうの?*3
それは正直耐えられない。耐えられないっていうか絶対そのうち何か起こるよね。

素のPHP派の主張とか

  • テンプレートエンジンを通す分遅くなる
  • 新しい文法を覚えないといけない
  • どうせ分業できずにプログラマが移植するんだからPHPでいいじゃないか
  • いざというときにPHPの処理が書けなくなるじゃないか


もう今となっては当時どういう議論が多かったのかよく覚えてないけど、だいたい反対派の主張は「余計なものを増やすな」って感じが多かったと思う。
でも自分にしてみれば、表現が長ったらしくて可読性の低いViewを書くことのほうが遥かに苦痛だったし、速いとか遅いとかそういうところじゃなくて、ただでさえカオスになりがちなHTMLテンプレートをいかに簡潔に、安全に、保守しやすく書けるかってこのとほうが重要だった。




確かに当時はテンプレートエンジン的な立ち位置だったのかもしれないけど、もう今はこんなんじゃ通用しねーだろ。

*1:オリジナルはArmin Ronacher氏かな

*2:個人的にはパイプのほうが読みやすいかなと思う。これは好みの問題?

*3:PHP 5.3ならクロージャをテンプレート変数にアサインして使えば多少はマシか?

Mountain LionでPHPのビルド

SSDに入れ替えたタイミングでOSもMountain Lionにアップデートしてみた。
XcodeとCommandline Toolsを入れてHomebrewで各種入れ直すところまではすんなりいったけど、自前のPHPビルドだけうまくいかなくて苦労した。


普通にやると個々のコンパイルは通ってるっぽいんだけど最後にこんな感じでリンカのエラーが出る。

Undefined symbols for architecture x86_64:
  "_compress", referenced from:
      _php_mysqlnd_net_encode_pub in mysqlnd_net.o
     (maybe you meant: _zim_Phar_compress, _zim_Phar_compressFiles , _phar_compress_filter , _zim_PharFileInfo_compress )
  "_uncompress", referenced from:
      _php_mysqlnd_net_decode_pub in mysqlnd_net.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [libs/libphp5.bundle] Error 1
make: *** Waiting for unfinished jobs....
Failed to make.


んで、色々調べてみたところどうもシステム標準のzlibだと上手くいかないらしい。


Use zlib from homebrew for php 5.4 (fixes issue with OS X 10.8) by ablyler · Pull Request #189 · Homebrew/homebrew-php · GitHub


そんで上記にもある通りhomebrew/dupesからzlibを入れてそっちにリンクするようにすればよいみたい。
というかphp54のFormulaもdepends_on 'homebrew/dupes/zlib'って入ってた。


というわけで、最終的にこんな感じになった。

Mountain LionでのPHPのビルド

libpngとかのためにXQuartsをインストール。
Mountain LionからはX11が同梱されなくなったので自分でXQuartsを入れる。


brewで入れたもの


Apacheはシステム標準ではなくて/usr/local/apache2に自前で入れたもの。


んで、configure

DEST_DIR=/usr/local/php-5.4.6

./configure \
--prefix=${DEST_DIR} \
--with-config-file-path=${DEST_DIR}/etc \
--with-config-file-scan-dir=${DEST_DIR}/etc/php.d \
--with-apxs2=/usr/local/apache2/bin/apxs \
--enable-fpm \
--enable-mbstring \
--enable-mbregex \
--with-pdo-mysql=shared,mysqlnd \
--with-mysql=shared,mysqlnd \
--with-mysqli=shared,mysqlnd \
--with-mysql-sock=/usr/local/var/mysql/mysql.sock \
--with-gd=shared \
--with-jpeg-dir=$(brew --prefix jpeg) \
--enable-exif=shared \
--with-png-dir=/usr/X11 \
--with-zlib=$(brew --prefix zlib) \
--with-bz2=shared \
--enable-zip=shared \
--with-openssl=shared \
--enable-sockets=shared \
--with-curl=shared \
--enable-ftp=shared \
--with-mcrypt=shared,$(brew --prefix mcrypt) \
--enable-bcmath=shared \
--with-iconv=shared,/usr \
--enable-intl \
--with-icu-dir=$(brew --prefix icu4c)


homebrewで入れたものはこんな感じでパスが得られるので覚えておくと指定が楽。

$ brew --prefix zlib
/usr/local/Cellar/zlib/1.2.7


なお、標準のApacheに組み込む場合、make installすると

  • /usr/libexec/apache2/libphp5.so
  • /private/etc/apache2/other/php5.conf

あたりが上書きされると思うので注意。事前にコピーを取っておいたほうがいいかも。


ところで、zlibだけsharedにすると件のエラーが出てしまってできなかった。