緯度、経度、latitude、longitude…どれがなんだっけ?
緯度、経度、latitude、longitude……どれがどれだかよくわからなくなるのでこうやって覚えた。
緯度 いど latitude ←短い 経度 けいど longitude ←長い
文字数が短い同士。
文字数が長い同士。しかもなんかlongとかついてるし!*1
そんで、緯度と経度はどっちがどっちなんだっけ?
北緯とか東経とか言うから、緯度が南北の角度、経度が東西の角度。
緯度は赤道を中心に南北90度。
経度はグリニッジ子午線を中心に東西180度。
ん?
緯度 いど latitude 90度 ←短い(小さい) 経度 けいど longitude 180度 ←長い(大きい)
これも絡めて覚えられそう!
おまけ
角度は座標次第なのでなんとも言えないけど、日本に限って言えば
都庁 北緯 35.689 ←小さい 東経 139.691 ←大きい
緯度 20度〜 45度 ←小さい 経度 122度〜153度 ←大きい
おまけ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とか似たようなのいっぱいありすぎる。
Raspberry PiにVNCで接続する
前回Raspberry Piをヘッドレス化して、キーボード、HDMI、LANケーブルという鎖から解き放たれたわけだけど、それと同時にラズベリーのデスクトップも失ってしまったので、今回はVNCでリモート接続できるようにしてみる。
とりあえず起動してみる
vncserverコマンドに解像度や色数などを指定して実行するとサーバが起動する。
詳しいオプションについてはman vncserver
やman 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から接続
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
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、MacやBSDなら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_timezone
タイムゾーンの設定。"Asia" → "Tokyo"としておく。
memory_split
CPUとGPUへのメモリ配分を設定する。ここで設定した分がGPUに割り当てられ、残りがCPUに割り当てられる。
512MB版はデフォルト値が64MBとなっている。とりあえずデフォルトのままにしておいた。
overclock
オーバークロックの設定。さわらないでおく。
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派の主張とか
もう今となっては当時どういう議論が多かったのかよく覚えてないけど、だいたい反対派の主張は「余計なものを増やすな」って感じが多かったと思う。
でも自分にしてみれば、表現が長ったらしくて可読性の低いViewを書くことのほうが遥かに苦痛だったし、速いとか遅いとかそういうところじゃなくて、ただでさえカオスになりがちなHTMLテンプレートをいかに簡潔に、安全に、保守しやすく書けるかってこのとほうが重要だった。
確かに当時はテンプレートエンジン的な立ち位置だったのかもしれないけど、もう今はこんなんじゃ通用しねーだろ。
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だと上手くいかないらしい。
そんで上記にもある通り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にすると件のエラーが出てしまってできなかった。