Raspberry Piをモニタ等無しでMacから使えるようにする方法

2
Filed under RaspberryPi
Tagged as , ,

このブログでは書いていませんでしたが、先月Raspberry Piを購入し、すでにディスプレイ、キーボード、マウスを繋いでNOOBS使ってOS入れたり、ちょこっと仕事に使ったりしていました。
ですが、ちょっとした作業のたびにモニタをラズパイに専有されるのがイヤだな〜(Macでメインに使っているし〜)と思っていたのです。
その解決方法が見つかったので、試してみました!
しかも、SDカードへのOSのインストールから、ディスプレイ、モニタ、マウス無しでやってみます。

Raspberry Pi Model B+ (Plus)

Raspberry Pi Model B+ (Plus)

Amazon価格:¥ 4,880

カテゴリ:エレクトロニクス


最終形と問題点

まず最初に、今回のエントリの最終形を図にしておきます。これで分かる人はこの後続く長いエントリは読まなくてOK!
Mac, Raspberry Pi, LAN
接続の方法としては、Macの有線LANポートを作り、そこにインターネット共有を設定し、Raspberry Piに有線LANで繋いで、SSHで入る、という形になります。これならMacがWi-Fiでインターネットにつながっていたら(普通つながっていますよね?)、MacもRaspberry Piも外のインターネットに繋がるという幸せな状態です!
基本的にはこれでOKなのですが、「ディスプレイ、キーボード、マウスを一度も繋がない」となると問題点が2つ出てきます。
1. SDカードへのOSインストールにNOOBSを使えない
2. RaspberryPiに振られたIPアドレスがわからない
これらへの対応がメインとなります。

SDカードにOSイメージを焼く

まずはMacのブラウザで下記URLにアクセスし、適当なOSイメージをダウンロードします。
Downloads | Raspberry Pi
迷ったら、Raspbianでいいと思います。
ダウンロードが終わったら、展開すると、.imgという拡張子のファイルが出てきます。
次は、ターミナルを開いて、このファイルがある場所に移動します。

$ sudo dd bs=1ms if=2014-06-20-wheezy-raspbian.img of=/dev/disk1

という感じのコマンドでイメージを焼くのですが、作業環境によってもちろん引数は変わります。
ディスクイメージのところはダウンロードして焼きたいOSイメージを指定します。
最後のofに与える引数はSDカードのデバイス名を与えるわけですが、これは diskutil list というコマンドで確認できます。
mac osx diskutil list
例えば、上図のようになっていると思いますが、この場合、/dev/disk1 を指定するわけです。
ddコマンドを実行した時、デバイスがbusyである、というようなエラーが出ることがあります。この場合、マウントを外す必要があるので、「ディスクユーティリティ」アプリ (/Applications/Utilities/Disk\ Utility.app) を起動して、「マウント解除」を行います。(「ディスクを取り出す」ではないので注意!)
Mac ディスクユーティリティ マウント解除

されて、これで上記のddコマンドを実行完了したらSDカード作成は完了なのですが、、実は、かなり時間がかかります!
Raspbianをmicro SDカードにコピーしたら、大体1時間ちょっとかかりました。
正直、NOOBSからOSインストールをしたほうが良かったかなー、と若干後悔するレベルです。
しかも、このddコマンド後、進捗状態が表示されません!
(実は、完全にフリーズしたかと思い、キャンセルしたりしてしまいました…)
でも、ご安心を!!
Control+Tを押すと、その時点での転送完了バイト数や平均転送速度が表示されます!

処理が完了すると、特にメッセージもなく、シェルがコマンド待ち状態に戻ります。
(インストール完了後にcheers!的なアイコンを表示する最近のパッケージとは大違いw)
しかし!!何はともあれ、今はモニタとか無しで環境を作るのが第一義にあります!

インターネット共有

ここで、Mac側のインターネット共有の準備をしておきます。
最近のMacBookには有線LANポートがないので、ThunderBoltなどの変換器を用意します。

Apple Thunderbolt - ギガビットEthernetアダプタ MD463ZM/A

Apple Thunderbolt - ギガビットEthernetアダプタ MD463ZM/A

定価:¥ 2,880

Amazon価格:¥ 3,285

カテゴリ:Personal Computers

発売日:2012-06-13



最近はUSBハブも付いたものがありますので、これも良さそうです!

サンワダイレクト LANアダプター内蔵USB3.0ハブ Gigabit対応 USB3ポート搭載 バスパワー 400-HUB022

サンワダイレクト LANアダプター内蔵USB3.0ハブ Gigabit対応 USB3ポート搭載 バスパワー 400-HUB022

定価:¥ 3,980

Amazon価格:¥ 3,980

カテゴリ:エレクトロニクス


システム環境設定>共有>インターネット共有を選択します。
『共有する接続経路』には外に出ていく経路(今回はWi-Fi)、『相手のコンピュータが使用するポート』にはRaspberry Piがつながるポートを指定します。
Mac インターネット共有
最後に、左側の「インターネット共有」の「入」にチェックを入れて完了です。

Raspberry Piを起動、IP探し

さぁ、いよいよ起動です!
SDカードをMacから外して、Raspberry Piに挿します。
LANコネクタにLANケーブルを接続します。
そして電源USBを挿すと、Raspberry Piの起動です!
ACTのLEDがチカチカしはじめます。Raspberry PiがTypeB+ならLANコネクタのLEDも点滅します!
さて、SSHで接続するわけですが、ここでRaspberry Piに振られたIPがわからない、という2つ目の問題にぶち当たります。
これはとりあえず、地道に調べるしかないようです。
まずはifconfig
ズラズラーっと出ますが、私の環境では下記のような箇所があります。これがThunderboltに挿したLANコネクタのブリッジしているところだと思われます。

$ ifconfig
(略)
bridge100: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
	options=3<RXCSUM,TXCSUM>
	ether 3e:1e:33:3e:e9:33 
	inet 192.168.2.1 netmask 0xffffff00 broadcast 192.168.2.255
	Configuration:
		id 0:0:0:0:0:0 priority 0 hellotime 0 fwddelay 0
		maxage 0 holdcnt 0 proto stp maxaddr 100 timeout 1200
		root id 0:0:0:0:0:0 priority 0 ifcost 0 port 0
		ipfilter disabled flags 0x2
	member: en4 flags=3<LEARNING,DISCOVER>
	        ifmaxaddr 0 port 7 priority 0 path cost 0
	media: autoselect
	status: active

192.168.2.1というのがあり、ここから192.168.2.255までがおそらく、割り当てられているわけで、
ここの辺だと当たりをつけます。
さらにもうひとつ、arpというコマンドを使うと良いらしいので試してみると次のような結果が出ました。

$ arp -a
? (169.254.255.255) at ff:ff:ff:ff:ff:ff on en4 [ethernet]
? (192.168.1.1) at 8:21:bb:a7:83:11 on en0 ifscope [ethernet]
? (192.168.1.101) at 2c:bb:e1:23:71:a3 on en0 ifscope [ethernet]
? (192.168.1.255) at ff:ff:ff:ff:ff:ff on en0 ifscope [ethernet]
? (192.168.2.1) at 2e:15:bb:1d:d9:13 on bridge100 ifscope permanent [bridge]
? (192.168.2.2) at 28:17:bb:1f:b6:13 on bridge100 ifscope [bridge]
? (192.168.2.255) at ff:ff:ff:ff:ff:ff on bridge100 ifscope [bridge]

これを見ると、どうやら、192.168.2.2っぽいなー、と絞り込めるわけです。
SSHでログインしてみます。Raspbianの初期アカウントとパスワードはpi/raspberryなので、そのとおりに指定ます。

$ ssh pi@192.168.2.2
pi@192.168.2.2's password: <ここでパスワードを入力>
Linux raspberrypi 3.12.22+ #691 PREEMPT Wed Jun 18 18:29:58 BST 2014 armv6l
(略)

無事ログインできました!
抜けるときにはexitします。
電源を切る時には、USBを抜いてもいいし、sudo haltしてもOKです。

SSHで怒られた時

OSを入れなおしたりしてIPアドレスが変わらない場合にはSSHでログインしようとしたときに「WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!」等の警告文が出ることがあります。
一度保存した鍵が合わなくて、サーバがクラックされているのでは?という親切なメッセージです。
適当なエディタ(emacsでもvimでも)で、Mac上のknown_hostsファイルを編集することで対応出来ます。

$ emacs ~/.ssh/known_hosts

今接続しようとしたIPが先頭にある行を探し、その行を削除することで対応は完了です。
もう一度SSHを試してみましよう。

以上!

これで、Raspberry Piを始めるのに、モニタやマウスやキーボードを用意する必要はありません!と言い切れるようになりました!
しかも、持ち歩き時の荷物も減ったので、カフェでラズベリーパイを食べながらRaspberry Piをいじる、なんてこともできますね!

Raspberry Pi Model B+ ボード&ケースセット(Clear)

Raspberry Pi Model B+ ボード&ケースセット(Clear)

Amazon価格:¥ 7,280

カテゴリ:エレクトロニクス



ラズパイマガジン (日経BPパソコンベストムック)

出版社:日経BP社( 2014-07-16 )

定価:¥ 2,300

Amazon価格:¥ 2,300

単行本 ( 164 ページ )

ISBN-10 : 4822234940

ISBN-13 : 9784822234942



Raspberry Piクックブック (Make:PROJECTS)

著者/訳者:Simon Monk

出版社:オライリージャパン( 2014-08-23 )

定価:¥ 3,672

Amazon価格:¥ 3,672

大型本 ( 384 ページ )

ISBN-10 : 4873116902

ISBN-13 : 9784873116907


WIMAXが遅くなったと思ってたら原因が見つかった!

0
Filed under Mac
Tagged as , ,

1ヶ月位前から、なんだかWIMAXが異常に重いなー、と悩んでいました。

Wi-Fi WALKER WiMAX HWD13 [ホワイト]

Wi-Fi WALKER WiMAX HWD13 [ホワイト]

中古価格: ¥ 4,600 より

Amazon価格:¥ 15,600

カテゴリ:エレクトロニクス



仕事でメインで使っているので、これが遅いと非常に困る。というか、昨日まで困っていました!
Dropboxの同期が終わらないとか、致命的。。
契約してもうすぐ2年、ずーっとバリバリ使っていましたが、WIMAXなのでパケット制限とかあるわけでもないし、何?会社の近くのWIMAXアンテナとかなくなったのか?とか疑ってしまいました。
場所が悪いのか?(でも全く同じ場所でこれまで使えていたし)動かしてみても、8月になっても状況が変わらないので、auに行って(契約はauなので)聞いてみました。
しかし、
「パソコン側のWi-Fi設定を一度クリアして再設定してみてください」
「本体のリセットボタンを押して再設定してみてください」
「それがダメなら修理ですかねー」
という感じで、なんとなく、こちらとしても「それは違うんじゃないかなー」という回答しか得られなかったのです。
もう諦めかけていたのですが、今朝、解決しました!

結論:Wi-Fi WALKERの設定を変える

「11b/g/n」となっているWLAN設定を「11b/g」に切り替えると良いらしい、という情報を入手したのです!
「Wifiの通信速度が遅い | Apple サポートコミュニティ」
早速ブラウザからWi-Fi WALKERの設定画面にアクセスして設定してみます。
http://wi-fiwalker.home
特にパスワードとか要らないので、そのまま設定します。
WiFi Walker設定 11b/g
これで私の場合も改善しました!良かった!

原因?

ではなぜ、これまで遅くなかったのか?という疑問が出てきます。
そういえば、1ヶ月前といえば、今のMacBook Pro (Late 2013)に買い替えた時期です!
これに買い替えてから、という時期になるので、古いMacBook Pro (Mid 2009)では問題が発生しなかったのかもしれません。

APPLE MacBook Pro with Retina Display(13.3/2.4GHz Dual Core i5/8GB/256GB/Iris Graphics) ME865J/A

APPLE MacBook Pro with Retina Display(13.3/2.4GHz Dual Core i5/8GB/256GB/Iris Graphics) ME865J/A

中古価格: ¥ 119,800 より

Amazon価格:¥ 135,800

カテゴリ:Personal Computers

発売日:2013-10-23


補足:通信速度メモ

いつものBNRスピードテストで測定してみた速度をメモしておきます。

・設定変更前(遅いとき)

—— BNRスピードテスト (ダウンロード速度) ——
1.NTTPC(WebARENA)1: 1.04Mbps (128.82KB/sec)
2.NTTPC(WebARENA)2: 110.18Kbps (13.74KB/sec)
推定転送速度: 1.04Mbps (128.82KB/sec)
————————————————–

2つ目の「2.NTTPC(WebARENA)2」が異常に違うのが問題のようですね。
この違いは回線の違いかな。確かに特定のサーバへのアクセスが遅いような感じでしたので。

・設定変更後(改良後)

—— BNRスピードテスト (ダウンロード速度) ——
1.NTTPC(WebARENA)1: 1.05Mbps (131.41KB/sec)
2.NTTPC(WebARENA)2: 886.56Kbps (109.93KB/sec)
推定転送速度: 1.05Mbps (131.41KB/sec)
————————————————–

2つ目の速度が改善されたのが一目でわかります!良かった!

lldbでiOSの例外を克服

0
Filed under Xcode
Tagged as , , , ,

プログラミングにおいて例外が発生したときの対応はとても重要です。
しかし、iOS開発で例外が発生したとき、なんとなく例外が発生したコードの付近を眺めて原因を予測していたりしませんか?
iOSがOSレベルで発生させる例外はきちんと原因表示ができるので、次の手順を覚えておくと、デバッグが容易に、そして確実になります!

例外を発生させるコード

さて、例外発生時の対応を学ぶためにはまずは例外を発生させるコードが必要になります。
いちいちコードを書くのも面倒、という人のために、プロジェクトをまとめてGitHubにアップしておきました。その名も「GenerateException」というプロジェクトです。

とてもシンプルに、ボタンを押したら例外が発生する仕組みになっています。

例外発生時に止める

Xcodeでは、ブレイクポイントの設定の中にすべての例外発生時に止める事ができるオプションがあります。まずはこれを設定しましょう。
Xcode左側のペインに、ブレイクポイントナビゲーターを表示させます。
そして、左下にある[+]ボタンを押して出てくるメニューから「Add Exception Breakpoint」を選びます。
lldbでiOSの例外を克服 Xcode
これで「All Exceptions」というブレイクポイントが追加され、準備は完了です。
lldbでiOSの例外を克服 Xcode

例外の出す情報を見る

プロジェクトをダウンロードし、ブレイクポイントの設定が完了したらあとはデバッグ実行してください。
起動した画面にあるボタン『Generate Exception』を押すと例外が発生し、下図のような状態で止まると思います。
lldbでiOSの例外を克服 Xcode
ただ、現在は例外が発生し、その元となるコードで止まっている状態ですので原因がわかりません。
ここで例外の原因を調べる方法は次のような手順となります。
1. 例外の発生しているスタックフレームを選択する(左側のスタックの一番上の”0 objc_exception_throw”というところ)
2. デバッグエリアのコンソールを開き、”(lldb)” に続いて “po $eax” とタイプし、Enterを押します。

(lldb) po $eax

3. これで今回発生した例外の原因が表示されます。
lldbでiOSの例外を克服 Xcode
以上!

lldbでスタックフレームを見る

One More Thing,
lldbにはいろいろ便利な機能があり、”po hogehoge”というのが有名かと思いますが、次のコマンドで現在のスタックフレームの変数を一覧することができるのを最近知り便利に使っています!
lldbでiOSの例外を克服 Xcode

(lldb) frame variable

UIViewControllerのデバイス回転への対応

0
Filed under iOS SDK
Tagged as ,

調べるたびに困っていたので、ブログにメモしておきます。

iOS6以降専用の対応方法

回転させないためには、下記のようなコードを、UIViewControllerに書けば良い。

// 回転させない
- (BOOL)shouldAutorotate
{
  return NO;
}
 
- (NSUInteger)supportedInterfaceOrientations
{
  return UIInterfaceOrientationMaskPortrait;
}

iPhoneでは回転させず、iPadでは回転対応する、という仕組みを実装したサンプルをgithubにアップしておきました。

上記ケースではUINavigationControllerを使っているのですが、この場合、UINavigationControllerを派生させたクラスで同様に実装すれば対応できます。