2014年8月22日

新装整備品Thinkpad X230 Tabletを購入

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

発売当初から欲しかったThinkpad X230 Tabletを買いました。
開封済み・新装整備品でお値段は54000円(税込)で、色々遊ぶには最高なんじゃないかと考えてたらポチってました。

ThinkPad X230 Tablet - 開封済み・新装整備品 | 3436XF1 | Lenovo Outlet (JP)
http://shopap.lenovo.com/jpoutlet/itemdetails/3436XF1/445/628C87959CB248F78E23CB2244F4AEC9

実際に買ったのは1ヶ月くらい前だけど、色々追加したり環境整えたりする作業をダラダラやってたので今更まとめということで。

その1:無線LANカードが載ってない

無線系はBluetoothしか載ってないので、無線LANカードを買って増設しました。
アンテナ線は3本(黒、灰、白)来てるので、WiMAXのカードとか3本アンテナ必要なカードとかも刺せる。
ちなみに、WWAN用のアンテナ線も2本来てます。(青と赤)
WWANカードを載せないなら、mSATA SSDカード用に使える。(ただし、SATA2の速度までしか出ない)


買ったのはIntel Centrino Advanced-N 6205。
FRU品じゃないとBIOSで弾かれるので60Y3253という型番のカードを買いました。
お値段2158円。

その2:メモリ搭載量が少ない

流石に2GBは少ないので、換装します。
Lenovoのサイトには2GB (空スロット:0)と書いてあるけど、実際には2GBが1枚刺さってるので、トータル4GBでよければ2GBを刺すのもあり。


まぁ、ここは積めるだけ積んでおこうということで8GB*2枚の16GBを買いました。
お値段14796円。
#エルピーダが死んでから高騰が激しくて辛いですね...

ここまでで、トータル71054円。
来月辺りで320GBのHDDを512GBのSSDに換装しようと考えているので、最終的には10万円弱になりそうですが...
デジタイザ搭載マシンが欲しかった&VMでは無い純粋なWindows機が欲しかったので、どちらも達成できて満足。
Linux走らせて遊ぶだけなら無線LANカードを追加するくらいで十分そう。

ここ数年ずーっとMacしか買ってなかったので、バラバラ分解可能でバッテリーも取り外せるThinkpadが斬新すぎる。
特に最近のMacBook系なんてRAMまでオンボだし...

そのうちmSATAなSSDでも買ってLinuxとデュアルブートにしたいなぁ

2014年8月19日

桜島が噴火したYoの裏側

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

作ってから1週間くらい経ってますが、プログラムの紹介というか詳解というか...
実は初めてのJava Servlet(&Tomcat)だったんですが、Eclipseからwar書き出して置くだけでdeploy完了というのは素晴らしい。
#小5の頃にPerlでCGI書いて動いた時くらいの感動

で、実際の仕組みは...
  1. 気象庁からPuSH(PubSubHubbub)で来るfeedを受け取る
  2. entryをSAX(Simple API for XML)で解析する
  3. 桜島に関する情報(噴火 or 爆発第1報)の場合はYoを送信
という感じ。

気象庁が公開している気象庁防災情報XMLフォーマットについては、下記を参照。
http://xml.kishou.go.jp/open_trial/

PubSubHubbubは以下。
https://code.google.com/p/pubsubhubbub/

ここ↑にはJavaで書かれたSubscriber Clientsの紹介もあるのですが、こちらはServletじゃないです。
特にServletに対するこだわりは無いけど、最近Scalaとかに興味あるのでWebサービスを書く為のJavaを学んでおこうかと...

セキュリティ上の都合で全てのコードを公開できる訳ではないのですが、PuSHの購読&受信とfeedの解析部分は以下の様な感じ。
#例のごとく酷いコードなので参考までに...

上がSAXハンドラ、下がPuSHサブスクライバです。
#Gistってファイル単位でバラしてコード貼り付けできないのね... (今更

実際には、このSAXハンドラのpublic void characters内で「現  象:噴火」「第1報 現  象:爆発」がcontent要素内に含まれる場合に分岐させてYoを送るメソッドを呼んでます。
それと、これも上記コードには含まれてませんが、受け取ったfeedに記載された全てのxmlは取得&保存しています。
#つまり、天気予報とか天気概要とか注意報警報なども"現在は"使ってないけど、保存はしてるっていうこと。

先日のYoアップデートの際にURLの添付が可能になったのですが、これに伴って噴火の詳細情報をYoにくっつけて送るアップデートをしようかなぁっと。
現在フロントエンドを書いてる途中で、これの仕組みは、保存されたxmlをパースして表示するだけですね。はい。

これに並行して、WebSocketでpushを... なんてのも準備中。
PuSHはネット上からアクセス可能なサーバでしか受けられないので、これを転送したいなぁっと。
これができると、噴火したら火口が赤LEDで光る桜島オブジェなんてものも作れちゃう訳です。

そういえば2週間弱くらい大学行って研究してない気がするけど... アッ(

2014年8月11日

桜島が噴火したYoを作った

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

鹿児島県の桜島が噴火(爆発)したときに「Yo」で通知してくれる仕組みを作ってみた。

QuitSquare » 桜島が噴火したYo
http://www.quitsq.com/sakurajima_yo/

使い方 
  1. Yoを起動します。
  2. 「SAKURAJIMA」にYoを送信します。
  3. 終わりです。
以降、桜島が噴火する度にYoが送信されます。
解除したい場合はSAKURAJIMAをブロックしてください。


実際にはこんな感じでYoが来る。
2014年 8月11日 15時01分 (今年199回目)の爆発時の通知なのですが、時刻を見れば分かるとおり15分遅れてます。
これは自分の書いたプログラムとかYo APIの遅延じゃなくて、気象庁が電文を公開するまでの時間なので、こちら側で何とかできる訳ではありません。
だいたい10〜15分程度は遅れるようなので、噴火「速報」的な使い方は全く保証できません。
が、実際噴火してから降灰するまでには時間があるので、降灰注意には使えるかも。

後ろの仕組みは簡単。
気象庁発表の電文をパース、桜島が噴火もしくは爆発した第1報を元にYo APIを叩くというもの。
Javaで書いてるのですが、ちゃっちゃと書いたせいで汚いのでキレイキレイしてから公開します。

他にも桜島の噴火情報を利用したサービスを考え中なので、そのうち作るかも...
その時は気象庁防災情報XMLについても書く予定。

2014年7月31日

ATtiny85で赤外線シリアル通信

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

前回前々回の続き。
赤外線LED(OSI5FU5111C-40)とフォトトランジスタ(L-51ROPT1D1)を使ったシリアル通信をATtiny85で実現させます。
さらに、このATtiny85とArduinoをI2Cで接続し、I2C-赤外線通信コンバーター化します。

構成はこんな感じ。

ATtiny85の各ピンは以下の通り。

pin1 - RESET
pin2 - Serial RX (from フォトトランジスタ)
pin3 - Serial TX (to 赤外線LED)
pin4 - GND
pin5 - I2C SDA (Arduino A4)
pin7 - I2C SCL (Arduino A5)
pin6 - not used(D1)
pin8 - VCC

pin6が空いているので、更に何か追加することもできますが、今回は未使用。

ATtiny85をArduinoとして扱う方法は「Programming an ATtiny w/ Arduino 1.0」 を参考にしました。
書き込みはaitendoで購入し、以前の記事でファームウェアのアップデートを行ったUSBasp-Bを使用。
ATtiny85は内蔵RC 8MHz駆動です。

プログラムは以下の様な感じ。(たぶんもっとキレイに書けるはず...)

#include <SoftwareSerial.h>
#include "TinyWireS.h"

#define I2C_SLAVE_ADDR  13
#define IR_RX 3 // pin2
#define IR_TX 4 // pin3

SoftwareSerial irPort(IR_RX, IR_TX, false);

void receiveEvent(uint8_t a) {
  int i = 0;
  char c;
  char buf[100];
  if (TinyWireS.available()) {
    while(TinyWireS.available()){
      c = TinyWireS.receive();
      buf[i] = c;
      i++;
      buf[i] = '\0';
      delay(2);
    }
    irPort.write(buf);
  }
}

void requestEvent() {
  if(irPort.available()){
    char c = irPort.read();
    if(c!=255)
      TinyWireS.send(c);
  }
}

void setup() {
  TinyWireS.begin(I2C_SLAVE_ADDR);
  irPort.begin(1200);

  TinyWireS.onReceive(receiveEvent);
  TinyWireS.onRequest(requestEvent);
}

void loop() {

}

Arduino UNO側はこんな感じ。

#include <Wire.h>

void setup(){
  Serial.begin(9600);
  Wire.begin();
}

void loop(){
  if(Serial.available()){
    int i = 0;
    char c;
    char buf[100];
    while(Serial.available()){
      c = Serial.read();
      buf[i] = c;
      i++;
      buf[i] = '\0';
      delay(2);
    }
    Wire.beginTransmission(0); //broadcast
    Wire.write(buf);
    Wire.endTransmission();
  }

  Wire.requestFrom(13,1);
  if(Wire.available()){
    byte b = Wire.read();
    if(b!=0xff && b!=0x0a && b!=0x00)
      Serial.write(b);
  }
}

これで、一番上の写真のように向かい合わせにして赤外線通信ができます。
UNO側のコードでbroadcastにしているのは訳があって、このあとATtiny85を複数個ぶら下げる予定。

2014年6月1日

続・赤外線LEDとフォトトランジスタでシリアル通信

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

前回の続き。
赤外線LED(OSI5FU5111C-40)とフォトトランジスタ(L-51ROPT1D1)を使ったシリアル通信。
今回は、送受信×2で双方向(全二重)通信を実現させます。

構成は...
PC <---Serial---> Arduino <---赤外線---> Arduino <---Serial---> PC
こんな感じ。

前回のものを一体化して、以下のようにする。

これを2個用意し、互い違いになるように向かい合わせて配置。


プログラムは以下の通り。

#include <SoftwareSerial.h>

SoftwareSerial irPort(10, 11, false);

void setup() {
  irPort.begin(1200);
  Serial.begin(9600);
}

void loop() {
  int i = 0;
  char c;
  char buf[100];
  if(Serial.available()){
    while(Serial.available()){
      c = Serial.read();
      buf[i] = c;
      i++;
      buf[i] = '\0';
      delay(2);
    }
    irPort.print(buf);
  }

  if (irPort.available())
    Serial.write(irPort.read());
}

最初はSerialから赤外線へ渡す部分を
if (Serial.available()) {
    irPort.write(Serial.read());
}
こんな感じにしていたけど、これだとループの早さにSerial.readが追いつかないっぽい。
abcdefgと送るとabcgになる等、データが途中で抜けたりするので一旦バッファに全部溜めてからprintするようにしました。
ちなみに、上記コード中のdelay(2)を取ると、途中が抜けたり最初の3文字くらいしか取れない現象が発生するので、やはりSerial.readが原因の模様。
当初のコードのirPort.writeの前行にdelayを入れるのも試してみたが、10msくらいにしないとダメだったので、バッファに溜めた方が早いかなと。

上記写真のような配置で距離を離して双方同時に送信すると、互いが干渉して文字抜けや化けが発生するので、実際は間に遮蔽を入れるなどの工夫が必要。
試しに紙を1枚入れてみたら安定して通信できました。