目次

2008年12月29日月曜日

Wi-port設定について

久しぶりにWi-portの設定をしようとしたら、上手くいかない。。。。
と苦悩すること一時間。

電源をシリアル変換からの供給ではなく、別に用意したところ、それが原因だった模様。
シリアル変換のVCCとGNDからWi-port電源3.3v回路を作ったら、上手くいきました。

余計なことに手をだすな、ってことですね。


それから、前回Wi-portに関して書いた時、Configurable Pin Settingsについて書いてなかったので補足。

Configurable Pin1をSerial Channel 1 Status LED、Highにしました。これで、上手く通信出来ている時はLEDが光ります。ちなみにConfigurable Pin1はWi-port基盤では35番pin。Configurable Pin2は6番、Configurable Pin3は7番、Configurable Pin4は19番、、、、、、とめちゃくちゃ分かりづらいので注意。

2008年12月26日金曜日

MYSQL あれこれ

リア充なのか、違うのか。。。
一応、2X歳として、美容とかおしゃれとか恋愛とかにもっともっと時間を使うべきなのではと苦悶する毎日です。

そんな私はクリスマスに大学に残留して、mysqlと格闘しました。


mysqlのインストールはこちらのサイト等を見て出来ました。

いざ、コマンドプロンプト

$ mysql -u root

と打ちますと、

-bash: mysql: command not found
このようにかえって来てしまいます。どうやらPATHが通ってないようです。調べて行くと、.bashrcと.bash_profileという隠しファイル(?)にPATHを書き込めばいいとのこと。

まずは、.bashrcと.bash_profileを探してみます。
$ ls -a
すると

. Desktop
.. Documents
.CFUserTextEncoding Downloads
.DS_Store Imaging-1.1.6
.Trash Library
.Xcode Movies
.bash_history Music Pictures
.cups Public
(などなど)


そんなファイルはありませんでした。。。

というわけで作る事にします。

$ vi .bashrc
実行してみると

こんな画面が出てきます。

viは今回初めて使うのですが、こちらを参考にすれば、大丈夫かと思われます。
まずは入力モードに切り替え。iキー+enterで、画面の下に--INSERT--と出てきます。

alias mysql=/usr/local/mysql/bin/mysql
alias mysqladmin=/usr/local/mysql/bin/mysqladmin


以上の2行を追加。
コマンドモードに切り替えます。escキーを押すだけです。
:wで保存、:qで終了です。

これでもう一度
$ ls -a
するとファイルが追加されています。

同様に.bash_profileもviで作成。

PATH=/usr/local/mysql/bin:$PATH
export PATH


これを書き込めばOK

あとは再起動をします。


すると

PATHが、、、、、通ったよ〜!!

ってなるはずです。

2008年12月13日土曜日

moxaとWi-portと通信速度

こんにちは。リア充を目指すもこもこじゅう/やすこやかです。

なんだか自分が思っている以上に、このblogを見てくれてる人がいるんだな〜って知って、ちょっと嬉しくなりました。

こんなblogを閲覧してくださっている方のなかで、慶應関係者では無い方は、blogに頻繁に出てくる“Xtel”や“moxa”という単語が「?」だったでしょう。
それらの説明はこちら。
そして私は、xtelを活用して、いろいろ作ろうとしている人の一人ってわけです。

と、いまさらながらのご紹介でした。


さて、本題。
前回、moxaとWi-Portを繋げる試みが成功したとお伝えしましたが、問題がありました。
文字化けするのです。moxaから読んで来た値を、Wi-portサーバーから引き出そうとすると文字がぐちゃぐちゃに(><)
文字コードの問題?でも、半角英数字しかつかっていないし。。。。と思い悩んでおりました。が、すぐに解決。
なんと通信速度の問題でした。

Wi-Port側に文字列を送るRuby:

equire 'socket'

client = TCPSocket.open('192.168.0.123', 10001)

while true do
client.write('a')
p client.gets.chomp
sleep(3)
client.write('b')
p client.gets.chomp
sleep(3)
end


最初、sleepを(1)にしていたのですが、(3)に変更しただけで、文字化けしなくなりました。なんかちょっぴり拍子抜け。
もしくはmoxaに書き込むコードの
serialInit(9600);
serialInit(4800);に変えると上手くいく場合もあるそうです。
(ちなみに、今回はこの手法では解決できませんでした)

シリアル通信の文字化けで悩んでいる方、ちょっと試してみてはどうでしょうか?

2008年11月26日水曜日

RubyでSocket通信

KRYM logсино Блогと、その中の人の協力により、WiPortデビューを果たす事が出来ました。

いまはRubyの勉強中。
KRYMさんのBlogからソースを拝借。


require 'socket'

client = TCPSocket.open('192.168.0.123', 10001)
//ここで自分でWiPortに割り振ったIPアドレスとポート

//ここから下は無限ループ
while true do
//trueの間はずっと実行=Falseなんてここにはないので、無限になりますね。

client.write('a')
//クライアント=WiPortにaを送り続けます
p client.gets.chomp
//p = print
//client = 上で記述した“TCPSocket~・・・”のこと
//gets = 入力データを文字列オブジェクトとして返します
//chomp = 改行を取り除いた文字列を生成して返します。
sleep(1)
//上の出力が終わった後、停止する
client.write('b')
p client.gets.chomp
sleep(1)
//上の三行と同じ

end


一行ずつ見て行くとこんな感じでした。

2008年11月16日日曜日

Orb APIで曲を探してみよう〜search.media編〜

曲再生のためにはmediumIdが必要。それを調べるには、search.mediaを活用というわけです。

たとえばAshの曲だけ調べたい時
http://api.orb.com/orb/xml/media.search?sid=(セッションID)&q=mediaType%3Daudio.file%20artist%5E%3DAsh

&qの後、条件を並列させるにはスペースでよいみたいですが、きちんとエンコードします。
こんなふうに→%20
そうするとこんな結果


<orb version="1.0" action="media.search" login="yasuko_yaka">
<status code="0"/>

<response>

<searchResult searchId="17" groupCount="0" itemCount="15">
<pagination>
</pagination>






<item orbMediumId="O82JqAce">
<field name="title">Shark</field>
<field name="description">0</field>
<field name="album">Free All Angels</field>
<field name="artist">Ash</field>
<field name="rating">0</field>
</item>

<item orbMediumId="OFTEbgfD">
<field name="title">Gabriel</field>
<field name="description">0</field>
<field name="album">Free All Angels</field>
<field name="artist">Ash</field>
<field name="rating">0</field>
</item>
</searchResult>
</response>
</orb>


全部の情報出て来て、うざいっす!って思ったら、fieldsで出したい情報だけ出します。
例えば、タイトルだけでいいってときは
http://api.orb.com/orb/xml/media.search?sid=(セッションID)&q=mediaType%3Daudio.file%20artist%5E%3DAsh&fields=title
こうすると、シンプルになって扱いやすいデータになるわけです。



<orb version="1.0" action="media.search" login="yasuko_yaka">
<status code="0"/>

<response>

<searchResult searchId="18" groupCount="0" itemCount="15">
<pagination>
</pagination>

<item orbMediumId="OAsr3j0A">
<field name="title">Walking Barefoot</field>
</item>

<item orbMediumId="O80WxSm3">
<field name="title">Shining Light</field>
</item>

<item orbMediumId="ORVcABGh">
<field name="title">Burn Baby Burn</field>
</item>

<item orbMediumId="OpO18BL2">
<field name="title">Candy</field>
</item>

<item orbMediumId="OROBI4d0">
<field name="title">Cherry Bomb</field>
</item>

<item orbMediumId="OGF6FKp1">
<field name="title">Submission</field>
</item>

<item orbMediumId="OLG6kFUL">
<field name="title">Someday</field>
</item>

<item orbMediumId="Ojc3FJaP">
<field name="title">Pacific Palisades</field>
</item>

<item orbMediumId="O82JqAce">
<field name="title">Shark</field>
</item>

<item orbMediumId="OObc8b2R">
<field name="title">Sometimes</field>
</item>

<item orbMediumId="OKBHcCFf">
<field name="title">Nicole</field>
</item>

<item orbMediumId="OF82CbGd">
<field name="title">There's A Star</field>
</item>

<item orbMediumId="OBCe1SO1">
<field name="title">World Domination</field>
</item>

<item orbMediumId="OFTF0Gc4">
<field name="title">Warmer Than Fire</field>
</item>

<item orbMediumId="OFTEbgfD">
<field name="title">Gabriel</field>
</item>
</searchResult>
</response>
</orb>

Orb APIで音楽ファイルを再生してみよう

なんだかしらないけど、昨日一日がんばって出来なかったstream.sdpというAPIが急に呼び出せるようになってテンションがあがりまくりました。

https://api.orb.com/orb/data/(セッショID)/(メディアID)/stream.sdp
昨日さんざこれをうっても反応してなかったくせに、ふっとできましたw
テンションがぐっとあがりました。

補足:
ログイン&セッションIDをサンプルのものはアラートで表示していたので、コピペできないのが難点でした。なので、自分で、結果からセッションIDを抜き出してHTMLの部分に表示するプログラムを作っちゃいました。

<html>
<head>
<meta name = "viewport" content = "width = device-width">
<!-- We use the Prototype library. Get it at: http://prototypejs.org -->
<script src="prototype.js" type="text/javascript"></script>
</head>
<body>
<script language="javascript">
// End point url of the Orb Api.エンド ポイントURIとは、ローカル又はリモートの資源及びサービスを特定するためのアドレスです
var orbApiUrl = 'http://api.orb.com/orb/';
// API key. If you want to run this sample, paste your API key below.ここにはAPIKey入れます
var apiKey = '3o7hgfvmof7jb';
// To go around Javascript's cross domain restriction, we use a local proxy.
var proxyUrl = 'ajaxProxy.php';

/*
* Authenticate
*/
function authenticate() {
var login = $('login').value;
var password = $('password').value;
// We make an ajax request to the login method, through the local proxy.
var url = orbApiUrl + 'xml/session.login?apiKey=' + apiKey +
'&l=' + encodeURIComponent(login) +
'&password=' + encodeURIComponent(password);
new Ajax.Request(proxyUrl + '?url=' + escape(url), {
method: 'get',
onSuccess: authenticateSuccessCallback,
onFailure: orbApiFailureCallback
});
};

/*
* authenticateSuccessCallback
* Called when the login ajax request was successful.
*/
function authenticateSuccessCallback(transport) {
// Access the XML dom object within the response.
var dom = transport.responseXML.documentElement;
// Check that the Orb response is OK.
if (checkOrbResponseStatus(dom)) {
// Retrieve the session id from the XML dom object.
sessionId = dom.getElementsByTagName('orbSessionId')[0].firstChild.nodeValue;
//セッションIDの表示
  // document.write(sessionId,"がセッションIDです。");
$('results').innerHTML = sessionId + '<br/>' +"セッションIDです";
// Hide the login panel and display the search panel on the page.
Element.hide('loginPanel');
Element.show('mainPanel');
}
};

/*
* orbApiFailureCallback
* Called when an ajax request failed.
* (this is not a failure from the API method itself).
*/
function orbApiFailureCallback(transport) {
alert('Error contacting Orb server (' + transport.status + '): ' + transport.responseText);
};

/*
* checkOrbResponseStatus
* This is a generic function that looks into the XML response sent by Orb to see if the status code is 0 (OK).
*/
function checkOrbResponseStatus(dom) {
var error = '';
try {
// Get the XML 'status' node.
var statusNode = dom.getElementsByTagName('status')[0];
// Get the XML 'status' node's 'code' attribute.
var statusCode = statusNode.attributes.getNamedItem('code').value;
if (statusCode != '0') {
// Code different from 0 means there was a problem.
var statusDesc = statusNode.attributes.getNamedItem('desc').value;
// Get the description corresponding to the error.
// WARNING: the description is just for development purposes.
// The text it contains is not intended to be displayed to the end-user.
// You should provide your own text/error messages depending on the error codes.
error = 'Error (' + statusCode + ') : ' + statusDesc;
}
} catch (e) {
error = 'Unknown error.';
}
if (error !== '') {
alert(error);
}
// Return true (boolean) if there was no error.
return (error === '');
}


</script>

<div id="loginPanel" style="border:1px;">
Login: <input type="text" id="login" value="" />
<br/>
Password: <input type="password" id="password" value="" />
<br/>
<input type="button" onclick="authenticate();" value="Login"/>
</div>


<div id="mainPanel" style="display:none;">
You are logged in!ログインしましたよよよよよよ。
<div id="results">
</div>
</div>
</body>
</html>

2008年11月14日金曜日

とてもやさしいAPI (自己流なので、違っているかも)~orbAPIの場合

夜中におなかが痛くて目が覚めてしまいました。なので、ソースコードをじっくり、一行ずつ読んでいました。すると、なんだか分からなかったOrbのAPIがなんとなく分かって来たような気がしました。おそらくDOM形式のAPI全般で、このように使用するのだと思います。Flickrとかもね。

OrbのAPIはURLを入力すると、XMLでデータがかえってくるものだと前に書きました。
例えばログインするときは

https://api.orb.com/orb/xml/session.login?apiKey=ohla9ocejeen&l=john&password=foo&speed=250

と入力すると

<orbSession>
<orbSessionId>...</orbSessionId>
<maxInactiveInterval>...</maxInactiveInterval>
<orbVersion>...</orbVersion>
</orbSession>

こんな結果が帰ってきました。
後は、この結果から、欲しい情報をゲットすればよいのです。 JavaScriptの場合、
dom.getElementsByTagName('orbSessionId')[0].firstChild.nodeValue;

こんな感じでとってきてます。
あとは

var sessionID = dom.getElementsByTagName('orbSessionId')[0].firstChild.nodeValue;

こんなふうにかけば、html上で表示するもよし、新しくAPIを引っ張ってくるためのURLに代入するもよし。

手順を整理してみると
1,APIを用いるためのURLを作る
2,タグから情報を引き出す
3,またAPIを用いるためのURLを作る(もしくは別なメソッドに活かす)
行うことはこれだけなんです。なんかカンタンなのかもって思えませんか?もちろん、URLを作るためにプログラミング言語が必要なんですが、どんな言語だって作れればいいのです。JavaScriptでもRubyでもPythonでもなんでも。

さて、補足。
Q:DOMってなんだ?

dom.getElementsByTagNameの後半は分かるとしても、domってなんなんでしょう。

A:XMLパーサが提供するアクセスの手段です。

DOMが知りたければ、XMLパーサをしらねばなりません。
XMLパーサとは XML文書を、アプリケーションソフトが利用しやすい形に変換するソフトウェアだそうです。
DOM(Document Object Model)とはW3C で勧告されている仕様の一つで、様々なソフトウェアがXML文書を読み取ったり、表示形式を変更して表示する事などを可能にする、XMLパーサのAPIなのです。
DOMはXML文書中のデータをXMLパーサが読み込むと、データをツリー構造としてメモリ上に展開します。最初に見た「結果」を表示していたのはDOMだったのです。

とまあ、googleのある時代に生まれて本当によかった3時間を過ごしました。