Raspberry Pi B+ と L-05A で SORACOM Air(nano SIM)を試してみた
はじめに
SORACOM SIMを入手したので試してみたのでその備忘録的なメモ。
現在は以下のような状態です。
(L-05Aはこの時たまたま横向きになっていて普段は上向きになっています)
以下今回準備したもの
- Raspberry Pi B+
- SORACOM Air データ通信 nanoSIM
- L-05A
設定方法
設定方法は下記サイトを参考に行いました。
- OBDNマガジン: [.tested] docomo L-05A [debian Wheezy][AX3][A6]
- try catch and ...release: [Ubuntu]USBモデム「L-03D」をセットアップ
必要なものをインストール
まずは設定に必要なものをインストールします。今回自分がインストールしたのは以下の3つです。
- eject
- minicom
- pppconfig
これを以下のようにインストールしました。
sudo apt-get install eject minicom
sudo aptitude install pppconfig
インストール完了後、早速L-05Aを接続して通信の設定を進めます。
L-05Aの設定
まずdmesg
コマンドで接続を確認します。
デバイスを認識していると以下のような出力があるので確認しましょう。
> dmesg usb 1-1.2: Product: FOMA L05A 中略 cdrom: Uniform CD-ROM driver Revision: 3.20 sr 0:0:0:0: Attached scsi CD-ROM sr0
確認後は早速CD-ROMをeject
コマンドで/dev/sr0
から取り外します。
> eject /dev/sr0 eject: イジェクトできません, 直近のエラー: 無効な引数です
ここで上記のように無効な引数ですと出力されていても取り外しは実施されています。
dmesg
コマンドを実行すると以下のようにttyACM0
、ttyACM1
、ttyACM2
が新たに認識されていることが確認できます。
> dmesg usb 1-1.2: Product: FOMA L05A usb 1-1.2: Manufacturer: LG Electronics Inc. cdc_acm 1-1.2:1.0: ttyACM0: USB ACM device cdc_acm 1-1.2:1.2: ttyACM1: USB ACM device cdc_acm 1-1.2:1.4: ttyACM2: USB ACM device usbcore: registered new interface driver cdc_acm cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters
ttyACMが認識されていることを確認できたら次はminicom
コマンドで接続し、APN設定をL-05Aで行います。
この時設定はttyACM0
で行います。
L-05Aへの接続コマンドは以下の通りです。
minicom -D /dev/ttyACM0
接続後はまずAT+CGDCONT?
でAPN情報を表示してCIDを確認します。実行結果は以下のようになります。
AT+CGDCONT? +CGDCONT:CID,"PPP","hogehoge.ne.jp",,0,0 +CGDCONT:CID,"IP","hogehoge.net",,0,0 OK
この上記でCIDと表記している部分には何かしらの数字が入っており、それがCIDです。
既に利用されているCID以外で今回のSORACOMAir用のAPN情報を登録します。
私の場合は1と3が利用されていたのでCIDは2を利用しました。
登録にはAT+CGDCONT=n,"IP","soracom.io"
(nは利用するCID)というコマンドを入力します。実行結果は以下のようになります。
AT+CGDCONT=n,"IP","soracom.io" OK
また登録の内容にミスがありその設定を削除したい場合はAT+CGDCONT=n
(nは削除したいCID)というコマンドを入力します。実行結果は以下のようになります。
AT+CGDCONT=n OK
コマンド実行後はAT+CGDCONT?
で登録できたことを確認しましょう。またAPN情報登録に使用したCIDはpppconfigでの設定時に利用します。
確認後はCTRL-A X
でminicomを終了します。
Raspberry Pi の設定
ここからはpppconfig
を使った設定について説明します。
まずsudo pppconfig
で設定画面を起動します。次に「Create 接続の作成」を選択します。
以降は画面に表示される内容に沿って、内容を入力していきます。私は以下のように入力しました。
プロバイダ名:soracom DNSの設定:Dynamic 動的 DNS を使う 認証方法:CHAP ユーザ名:SIMのパッケージに記載されているもの パスワード:SIMのパッケージに記載されているもの 速度:460800 パルスまたはトーン:Tone 電話番号:*99***n#(nはCID) モデムの設定方法を選択:いいえ 手動でモデムポートを選択する:/dev/ttyACM0
入力完了後は「Finished ファイルを書き出してメインメニューに戻ります。」を選択して設定を終了します。
その後、確認画面が表示されるので進んでいくと最初の画面に戻るので「Quit このユーティリティの終了」でpppconfigを終了します。
pppconfigの終了後、次に/etc/ppp/peers/プロバイダ名
のファイルを開き、以下の一行をファイルの一番下に追記します。
replacedefaultroute
追記後はファイルの変更を保存してpon
コマンドで起動を確認します。
具体的なコマンドは以下の通りです。
sudo pon プロバイダ名
起動ができるとL05-Aの通信ランプが緑色から青色になります。
またifconfig
コマンドを実行するとppp0
の項目があり、ipアドレスなども確認することができます。
接続を終了する場合にはpoff
コマンドを使用します。
具体的なコマンドは以下の通りです。
sudo poff プロバイダ名
接続が終了するとL05-Aの通信ランプが青色から緑色になります。
またifconfigコマンドからppp0の項目もなくなります。
設定については以上です。
おわりに
設定中に気になった点としてL-05Aが横向き(冒頭の写真)状態だとejectを何回やってもすぐCD-ROM認識状態に戻って、接続できなくなるということがありました。
ただし上向きにすると問題なくejectでき、使用することもできました。
Visual Studio Code をWindows8.1の32bit版に入れてみた
はじめに
タイトルそのままです。
新しいマシンの設定をしていて、エディタをどうしようかと考えていたところに、YAPC::Asia Tokyoハッカソンで Visual Studio Codeのお話を聴いたのでさっそくインストールしてみた。
ちなみに動作環境は以下の通り
Visual Studio Codeとは
詳しい説明はこちらのVisualStudio日本チームブログを見ればどんなものなのかわかるかと。
以下は上記リンクのブログより引用です。
最新の Web およびクラウド アプリケーション開発に利用できる、Mac OS X、Linux、Windows 対応の新しい無料のクロス プラットフォーム コード エディターです。
ということで以下ではどのようにしてインストールしたかを書きます。
インストール時にハマったところ
通常はインストーラーをダウンロードして実行することで、問題なく入れるので大体のブログ記事などではインストールは一行で済まされています。 また依存関係にある.NETなどもインストーラー起動時にマシンに必要なバージョンのものが存在しなければインストールもしくはアップデートされるようですが、自分の場合はインストーラーが起動し、とくに.NETについての文言がでることなく数秒後にインストール失敗のウィンドウが出てきました。
失敗の原因は依存関係にあるのではと.NETをインストールしてみようとしても既にインストールされており、問題はありませんでした。 改めてエラーウィンドウを見ると、ログを確認するようにとのことでしたがログがどこにあるのかがわからず、ひたすらPC内部検索をかけけて探したり同じ状況になった人がいないかとwebで検索してみたりとしましたが、なかなか発見できずにいました。
解決方法
いろいろ探していたところこの記事にたどり着きました。 どうもインストールパスに問題があると正常に動作しないらしい。 ただ自分の場合はそもそもインストールすらできていない状態。。。
とりあえずFAQになにか情報がないかと見たところ Trouble with the Windows installer の文字が。
どうやらインストールに失敗した場合はzipファイルをダウンロードして、入れてのとのこと。
Visual Studio CodeのFAQページはこちら。
実際にその通りにやると問題なく動作させることができました。
おわりに
ようやくインストールすることができたVisual Studio Codeを動作させてみると思っていたより動作が軽く感じました。 これからさらに使ってみて感想など書いていこうと思います。
【 #kamakurago 】kamakura.go#1に参加してきた
2/28(土)に鎌倉のiichiさんのオフィスで開催されたkamakura.goの1回目に参加してきました。
会場の様子
今回の内容はもくもく会でした。
会場の様子は主催の@massatさんが投稿されていたようでこんな感じでした。
#kamakurago pic.twitter.com/QDK3VrDgmw
— 平井雅人 (@massat) 2015, 2月 28
やったこと
指定したディレクトリの中身をすべて圧縮する機能の作成
- 圧縮形式は.tar.gz
- ディレクトリはフルパスで指定
- 圧縮対象、保存先は固定
作業リポジトリはこちら
作業中のハマりポイント
ハマりの原因や解決方法についてはまた別の機会にまとめようと思います。
集中して作業が進めたので、目標としていた作業はできました。
振り返りと目標 【2014-2015】
2014年の振り返り
1月~3月まで北海道、4月からは東京を拠点として生活してきました。
1月~3月までの活動については以下にざっくりまとまってます。
上京しました - akms道東
勉強会への参加
上記の最後にPerlとかRubyとかD言語の勉強会に出たいと書いていましたが、
結果としてPerlとGoの勉強会に出ることが多かったです。
PerlはPerl入学式のサポーターであったり、YAPCでのLTなどを行ってきました。
YAPC::Asiaに初参加、あとLTしてきた #yapcasia - akms道東
Perl入学式を地方で開催してみたというお話 - akms道東
Goの勉強会ではとくに発表などはしていないのですが、本当に多くの勉強会に参加してきました。
勉強会で学んだおかげで公私ともにGoを活用することができています。
北海道→東京
北海道から東京へ出てやはり勉強会などが多く、
いろいろなエンジニアの方たちと交流することができました。
やはり東京は人が集まる場所だなと改めて感じました。
また北海道へ戻りたいという気持ちが薄れるかというと逆で、
むしろ北海道へ戻りたい気持ちは高まっていきました。
やはり生活面などで東京より北海道がいいなというのが正直な感想です。
2015年の目標
さて2015年ですが技術面では更なる向上というのは常に思っているのことなのですが、
改めて意識しながら1年を過ごしていきたいと思います。
今後もこのブログでいろいろ学んだことをアウトプットしていく。
その回数も増やそうと考えています。
また仕事をしていく上で感じたのが「0から1を生み出す場でのファシリテーション」
というのが難しく、この部分を伸ばしていけたらなと思います。
今は漠然と難しいという経験しかないのですが、この問題についても後日まとまったときに
ブログなどでアウトプットできればなと考えています。
おわりに
今年最初の勉強会を以下のように開催します。
1月7日という急な日程ですが、参加できるかたいらっしゃいましたらぜひ!
ゆるいITべんきょうかい in 帯広 - connpass
Goでinterface{}を扱うときの忘備録:型コンバートについて
昨日(2014/12/23)同期とあつまりハッカソン的ななにかを開催したのですが、
お題もとくに決まってなかったのでhipchatのapiを使って遊んでいたので、
その中で学んだことの忘備てきななにかです。
hipchatのAPIについては上記の公式ドキュメントを見ると
様々な言語で作成された便利なライブラリなどがあります。
今回はその中で私が現在勉強しているGoのclient libraryを使ってみることにしました。
履歴の出力時に学んだこと
特定の部屋の会話履歴を最高30件分取得して、
とくに加工整形せずに出力する場合は下記のようなコードを書きます。
c := hipchat.NewClient(authToken string) historyRq := &hipchat.HistoryRequest{MaxResults: 30} history, _, err := c.Room.History(room_name string, historyRq) if err != nil { log.Fatal(err) } for _, item := range history.Items { fmt.Println(item) }
そのままの内容を載せることはできないので加工してありますが出力結果はこんな感じ
{2014-12-23Thh:mm:ss.0123456+00:00 map[id:012345 links:map[self:https://api.hipchat.com/v2/user/012345] mention_name:test name:TestUser] abcdefg-1234567-a12b3c4d [] テスト message} {2014-12-23Thh:mm:ss.0123456+00:00 map[id:012345 links:map[self:https://api.hipchat.com/v2/user/012345] mention_name:test name:TestUser] abcdefg-1234567-a12b3c4d [] テストテスト message}
これはhistory.Itemsからmessage構造体の配列を受け取り
各message構造体の要素を出力しています。要素の詳細は下記リンク参照
hipchat - GoDoc
とにかく分かり難い。履歴の中でほしい情報は発言者の名前とその内容。
他には時間くらいだと思います。
そこで加工整形して出力するようにしたところ発言内容はitem.Messageとして簡単に取り出せました。
ただし発言者の名前の要素がmessage構造体のFromにあり
Fromの型がinterface{}型という問題にぶち当たり、思うままに結果を取り出せませんでした。
以下のようにしても発言者の名前は取り出せず。。。
for _, item := range history.Items { fmt.Printf("%s :%s",item["name"],item.message) }
型のコンバート
そこでいろいろ調べたところinterface{}の型を
コンバートするとnameを取り出せるところにたどり着きました。
map[id:012345 links:map[self:https://api.hipchat.com/v2/user/012345] mention_name:test name:TestUser]
上記は先ほどの出力からFromの部分のみを抜き出したもの
コンバートするために最初はmap[string]stringかなと思い下記のようにして実行しました。
from := item.From.(map[string]string)
しかし、正しく動作せずに出力されたエラーにはmap[string]interface{}の文字が。
どうやらFromはmap[string]interface{}にコンバートできるようでした。
そこで下記のようにしたところ実際に動作しました。
from := item.From.(map[string]interface{})
Fromの形式が様々問題
しかしこれで全てが解決したわけではありませんでした。
なんとFromのコンバートができないitemが存在しました。
詳しく調べたわけではないのですがおそらくbotからのpostの場合は
Fromにある情報がnameだけのようでした。
そこでコンバートを実行した場合に成功の可否を受け取ることができたので、
下記のように実装しました。
for _, item := range history.Items { var from map[string]interface{} var ok bool if from,ok = item.From.(map[string]interface{}); ok { fmt.Printf("%s :%s\n",from["name"],item.Message) }else{ fmt.Printf("%s :%s\n",message.From,item.Message) } }
これにより出力結果は「発言者の名前:発言内容」というようになりました。
以上ざっくり自分メモと素振りの成果。
Perl入学式を地方で開催してみたというお話
はじめに
この記事はPerl入学式アドベントカレンダー20日目の記事です。
Perl入学式ではたまにサポータをやっております。タケウチです。
現在は東京、大阪、福岡の3都府県で開催されているPerl入学式の歴史についてはpapix校長が下記リンク先で綴っております。
2014年12月02日 : Perl入学式 公式ブログ
2014年12月09日 : Perl入学式 公式ブログ
2014年12月18日 : Perl入学式 公式ブログ
ですが、おそらくこの歴史の中で出て来ることはないであろう、簡易出張版Perl入学式in釧路について
今回は書いていきたいと思います。
田舎でPerl入学式
そもそもpapix校長とは現在の会社の内定者時代に知り合いそこでPerl入学式というものを知り、
当時のwebサイトを見たりしていました。
そこでは以前からPerl入学式で使用している資料が公開されていて、勉強には絶好の題材でした。
最初は独学で学んでいたのですが、ちょうどその頃私が参加していたITコミュニティで言語を一つ勉強したいという話があがっていました。そこで私はPerl入学式の資料を使ってみんなで勉強するチャンスだと思い早速提案しました。
もちろんpapix校長に資料の使用について確認をしてから使用しました。
そこからPerl入学式の資料を使わせていただきながらの勉強会を3、4回ほど開催したころ、
papix校長を北海道に呼ぼう計画が私のなかでふと、起こり本人に打診、実際に校長来道ということになりました。
勉強会では簡易出張版Perl入学式としてAPIクライアントの開発というテーマで開催することができました。
下記はpapix校長の開催感想ブログです。
釧路で「Perl入学式出張版」をやってきた - Masteries
さてここまで書いてきましたが、言いたかったことは一つ。
東京、大阪、福岡だけでなく北海道の片田舎でもPerl入学式は開催できました!
せっかくPerl入学式の素晴らしい資料が公開されているので、もちろん参加した人が復習などに使うのはもちろんですが、既存の入学式に参加するのが地理的に困難な人たちが集まって、自分たちで開催することは可能です!
また声を上げれば校長がやってくる!?
そして簡易版が開催できる!?
ということで以上で今日の記事はここまでです。
明日はぼくの尊敬する先輩の担当ということでとても楽しみです!
それではまたPerl入学式で楽しく学びましょう!
Goでテストを実行する時の備忘録
Goでテストを回すには
最近Goで実装するものがあった。そこでテストを回すときの自分メモ兼今日の素振りの成果
とりあえず下記公式のページでTestingの箇所を見れば大まかにわかる
How to Write Go Code - The Go Programming Language
公式ページではリモートリポジトリに対するテストもやっているが今回はローカルに対してのみ
例としては以下のようなパッケージ構成を想定する
fizzbuzz |-- fizzbuzz.go |-- fizzbuzz_test.go
またfizzbuzz_test.goの内容は以下のように想定
package fizzbuzz import( "testing" ) func TestFizz(t *testing.T){ ... } func TestBuzz(t *testing.T){ ... }
作成しているパッケージ内でまるっとテストを回すときは以下のようにする
> go test PASS ok fizzbuzz 123.456s
テストを1つずつ結果を見ながらすすめる
> go test -v === RUN TestFizz --- PASS: TestFizz (xxx.xx seconds) === RUN TestBuzz --- PASS: TestBuzz (xxx.xx seconds) PASS ok command-line-arguments xxx.xxxs
その他の実行方法
複数ファイルの場合
次の例として以下のように細かくファイルが分かれている場合
fizzbuzz |-- fizz.go |-- fizz_test.go |-- buzz.go |-- buzz_test.go
対象ファイルを指定して実行
> go test fizz.go fizz_test.go
自分がやってしまったミス
> go test fizz_test.go
上記の場合テストは以下のようにテストを実装する必要がある。ただしこのテストはどうなんだろう
package fizzbuzz import( "testing" "fizzbuzz" ) func TestFizz(t *testing.T) { fizzbuzz.Fizz() ... }
パッケージが階層でわかれている場合
fizzbuzz |--fizz | |-- fizz.go | |-- fizz_test.go |-- buzz.go |-- buzz_test.go
以下のようにすると再帰的にテストを実行する
> go test ./...