目次

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時間を過ごしました。

2008年11月9日日曜日

iPhone Webアプリ 備忘録



「iPhoneシュミレーターで見ると、字の大きさがヒドい事になる」という問題を抱えておりましたが、解決してるでしょ?


<meta name = "viewport" content = "width = device-width">

これを書き込めば解決!iPhoneSafariを使った人なら知っているでしょうが、iPhoneSafariではページをデフォで縮小表示してしまうらしい。
なので、上のタグを書き込めば一見落着と相成ります。

あと、Appleから配布されてたiPhone用のCSSが良いですね。

ネイティブアプリみたいなボタンとかリストが作れます。

OrbAPIを使ってみた~SearchMedhia編~

朝起きて、今日ものびのびと勉強中。
自分のOrbサーバーにログインして、メディアファイルを検索するものを作りました。

なんか字が大きくて見づらいのですが、iPhoneシュミレーター上で表示してみました。

用意したファイルは前と同じく、ajaxProxy.phpとprototype.jsにhtmlの3つ。
前述の二つは以前のものをそのまま使います。
で、htmlファイル。


<html>
<head>
<!-- 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 = 'ここにAPIKeyです';
// 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;
// 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 === '');
}

/*
* searchMedia
* This function looks for media on the Orb computer.
*/
function searchMedia() {
// Build URL to call search method.
var searchFor = $('searchFor').value;
var mediaType = $('mediaType').value;
var query = 'mediaType=' + mediaType + ' title^=' + searchFor;
var url = orbApiUrl + 'xml/media.search?sid=' + sessionId +
'&q=' + encodeURIComponent(query) +
'&fields=title&count=10';
// Send request.
new Ajax.Request(proxyUrl + '?url=' + escape(url), {
method: 'get',
onSuccess: searchMediaSuccessCallback,
onFailure: orbApiFailureCallback
});
}

/*
* searchMediaSuccessCallback
* Called when the search ajax request was successful.
*/
function searchMediaSuccessCallback(transport) {
// Access the XML dom object within the response.
var dom = transport.responseXML.documentElement;
// Check that the Orb response is OK.
if (checkOrbResponseStatus(dom)) {
// Get the items from the XML response.
var items = dom.getElementsByTagName('item');
// This will hold the html showing the results.
var html = '';
// Number of items found.
var itemCount = items.length;
if (itemCount == 0) {
html = 'No item found.';
} else {
for (var i = 0; i < itemCount; i++) {
// List of fields for the current item.
var fields = items[i].getElementsByTagName('field');
var fieldCount = fields.length;
// Iterate through fields to find the 'title' one, and retrieve its value.
for (var j = 0; j < fieldCount; j++) {
var fieldName = fields[j].attributes.getNamedItem('name').value;
if (fieldName == 'title') {
html += fields[j].firstChild.nodeValue + '<br/>';
break;
}
}
}
}
$('results').innerHTML = html;
}
};
</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;">
Return media which title start with: <input type="text" id="searchFor" value="" />
<br/>
In:
<select id="mediaType">
<option value="audio.file">Audio</option>
<option value="video.file">Video</option>
<option value="photo.file">Photo</option>
<option value="document.file">Document</option>
</select>
<br/>
<input type="button" onclick="searchMedia();" value="Search"/>
<div id="results">
<div>
</div>
</body>
</html>



PC上で見ますと、こんな感じ。


できました!パチパチ

2008年11月8日土曜日

Orb APIを使ってみた~ログイン(session.login)編〜

今日一日、OrbのAPIと格闘した私です。初心者にはきついんですよ。
全部英語だし!んぎゃぎゃ。
で苦労した結果のまとめ&How To でございます。

1,始めに
まずOrbAPIを使うには、ほとんどの場合authenticateが必要なんだそうな。それを行うための“session.login”なんであります。

2,まずはサンプルを試してみる。
https://api.orb.com/orb/xml/session.login?apiKey=※ここにはOrbから発行してもらったAPIKeyを入れます&login=ログイン名&password=パスワード

このURLを入れてみます。すると


<orb version="1.0" action="session.login" login="yasuko_yaka">
<status code="0"/>
−<response>
−<orbSession>
<orbSessionId>01234*****</orbSessionId>
<maxInactiveInterval>120</maxInactiveInterval>
<orbVersion>2.01.0015</orbVersion>
</orbSession>
</response>
</orb>


こんな結果が出力されます。01234*****が私のsessionIdになります!

3,自分でも作ってみましょう。
・サンプルソース(html)
・ajaxProxy.php
・prototype.js
この3つを用意して、同じ階層に置いてあげます。
ajaxProxy.php

<?php
header("Content-Type: text/xml");
if ( substr($_GET['url'], 0, 7) == 'http://' ) {
$handle = fopen($_GET['url'], "rb");
while ( !feof($handle) ) {
echo fread($handle, 8192);
}
fclose($handle);
}
?>

Orbにあったサンプルを利用しました。


prototype.js
こちらから、ソースコードがあるのでコピペ

htmlファイル

<html>
<head>
<!-- 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.
var apiKey = '以前習得したOrbAPIkeyを入れます';
// To go around Javascript's cross domain restriction, we use a local proxy.ajaxProxy.phpファイルソースはOrbのサイトに掲載されてるものを利用
var proxyUrl = 'ajaxProxy.php';

/*
* Authenticate
*/
function authenticate(login, password) {
// 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: authenticateFailureCallback
});
};

/*
* 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;
// That's it! We have the session id, we can now make call to methods that require authentication.
alert('User is logged in! The session id is: ' + sessionId);
}
};

/*
* authenticateFailureCallback
* Called when the login ajax request failed.
* (this is different from a failure on the Orb side, like if the login/password are incorrect for instance).
*/
function authenticateFailureCallback(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 === '');
}

// Authenticate the user!
authenticate('ログイン名', 'パスワード');
</script>
</body>
</html>


できたら、上のhtmlにアクセス。
成功するとsessionIDが書かれたポップアップが出てきます♪

2008年11月6日木曜日

最近してたこと&設計変更

なんだかいろいろと忙しくなっており、マイルストーンが守れておりません。しかもいろいろと発見があったので、そのマイルストーンも変更せねば!

なにをしていたかというと、Orbを使って、家のPCをメディアサーバーにしておりました。
これが相当使える!iPhoneアプリでは音楽ライブラリに入り込むことが出来なかったので、音どうしよう、、、問題が一気に解決!!!

私のWinPCに入っている曲が聞けるし、PCで接続した時はプレイリストも作れます。だからいろんな問題が解決!
さらにさらに、OrbはAPIも公開してるんです。わ〜い♪

さて、じゃあどうしようと考え直した結果、Webアプリとしてまずは作ってみようではないかという結論に至りました。使う言語はRubyです。

MacRubyプロジェクトがガンガン進んで、そのうちiPhoneアプリ開発も出来るようになるんじゃないかと期待してます。
※ちなみに、ネイティブアプリもRubyで開発出来るという噂に踊らされた私。Jailbreakしないと動かないらしいっす。ぬか喜び。

2008年10月29日水曜日

設計図への考察

今日は頭が働かず、集中力も切れていたのでチュートリアルは明日に持ち越し。そのかわり、設計図を考えていました。

難所としては、どうやって音をならすか?ということです。iphoneではJailbreakしないと音楽ライブラリからデータをもってこれないようになっているので、うんうんうなっていました。
ネットをふらふら流れて、なんかいいアプリないかしら?と思っていると、iphoneでニコ動を楽しむアプリの存在や、Orbの存在を知りました。

まあ、結局自分のPCをサーバーとして公開しちゃってるわけですが、これだったらなんか出来そうかも?ここらを中心に勉強していくのもよいかも、、、

2008年10月28日火曜日

SDK 次のページに移ります


この画面のNextViewってやつを押すと

この画面に切り替わります。ただそれだけなんですが、以外と手間取りました。
最初はエラーばっかりで「んん?!」となやんでましたが、単純にコード書き忘れ。

RootViewController.hにimpot View2ViewController.hをかきわすれるという凡ミスでした。
一日3チュートリアル目標です!

2008年10月26日日曜日

SDK Connections Inspectorを使ってみた


iCodeBlog
をちまちまと続けています。前の段階で作ったインターフェイスと、コードを繋げてみました。iPhone Programming Tutorial - Connecting Code to An Interface Builder Viewってチュートリアルです。iCodeさんのチュートリアルは大変わかりやすくてサクサク進むのですが、途中でちょっと行き詰まりがあったのでメモ。

>Click in that circle and drag the blue line to the File’s Owner object and release it.
というこの一文。File's Owner objectってどれのこと?

ちょこっと悩んだのですが、左下に注目。File's Owner objectっていうアイコンある!とドロップしてみるとドンピシャ!解決でした。


でこんな感じのアプリがものの20分たらずで完成。先行きは明るいよ〜☆

SDK これはすごいよ!

ちまちまとSDK

iCodeBlog
のチュートリアルをちまちま

CocoaのライブラリをもとにHelloWorrdしてみようってやってみました。
んがぁ!これがすっごい、、、、

カンタン♪

ViewbasedApplicationを最初に選択すると、“ファイル名ViewController.xib”ってファイルが作られてます。これをクリック。すると上の画面が出てきます。
なんだか右側にCocoaのAPI部品たちがいっぱい。ワクワクしながらドロップしてみると、カンタンに追加されちゃいました。

オーサリングツールみたい!Appleすごいよ本当にって感動しました。

はじめての SDK

久しぶりです。気づくと一人になっていました。これじゃ“どうしていないの?”ですね(笑)

さて、今学期の活動のゴールはiphone アプリ開発としました。
当面の目標としては、
・音楽ファイルの再生(podcastがいいな)
・LastFMのAPIの活用
この二つです。まずはこれが一山。

とは言え、SDKの世界はHello Worldから。SDK初心者、入門のためのステップ。
こちらのサイトを参考にやってみたら、できたよお母さん!!

ちなみに、Apple側ではスクリーンショットなんかをとって、公開するのはやめてね、って言っているようです。なので、詳細は割愛。といっても、たくさんチュートリアルサイトはあるのですが。

SDKにはXcode、Cocoa、Object-Cの知識が必要だっていうけど違いは何?どういう関係なんだろ?ここに触れてる人があまり居なかった。
これはすべてバラバラの言語だと思っていた私。。。
実際には
Xcode:appleの統合開発環境
Cocoa:MacOS X用のAPI
Object-C:プログラミング言語

ふむ。自分的にまとめていうと
・Macは、Object-Cで書かれているプログラムでネイティブアプリを作る事ができます。
・でも一からメソッドを作るのは大変ですよね。文字を表示させるのだって大変。それを一行、「文字出せ!」って書くだけで、実行してくれるのがAPI。MacネイティブアプリではCocoaってのがそれで、とってもポピュラー。
・Xcodeというのは、それらのプログラムを書いて、ビルド、実行まで可能にしてくれる便利ツール。JavaとかPythonとか、Emacsで書いたものをTerminalでコンパイルして実行、、、という手順をとりますが、Xcodeはインターフェイスでポチっと「実行」しちゃえばOK!素晴らしい。

よって,
Object-Cは言語として構文を勉強する事
Cocoaは日々、「あら、こんなことができるようになったのね」と目を見張らせる事
Xcodeは使い勝手、便利機能などを学んで行く事
こんな感じで対応していくのです。巷には「Xcode攻略!」とか「はじめてのCocoa」とかいろいろ本があってぐるぐるしてたけどスッキリしました。

さあ、まだまだチュートリアルがんばりますよ!

2008年7月15日火曜日

Flash+moxa

やすこ


今日はFlash+Xtelをやってみました。上手くいきましたよ〜♪

2008年7月12日土曜日

Flash+マイコン

やすこ

今日はこーりゃんからシリアルからとってきた値をFlashで受け取る方法forMacを教わりました。
ちなみにこのワザは、Arduinoと同じドライバを使っていればできる!はず、、

まず、Flash単体では、シリアル通信は出来ないので、
serial proxyを使います。ArduinoのDownloadページ一番下にリンクが貼ってあるので、そこからDownload!

1、解凍し、serproxy.cfgをテキストエディターで開けます。
2、マイコンをPCと接続します。
3、Processingでデバイスを調べます。

Processingに書き込むソースはこんな感じかな。別にListをプリントしてくれればなんでも良いです。

import processing.serial.*;
Serial myPort;
void setup(){
println(Serial.list());

myPort = new Serial(this, Serial.list()[0],9600);

}

こいつをProcessingに書き込んでRunします。すると、リストが出てくるので、Port1にあたるものをコピー。
画像の場合だと、/dev/cu.usbserial-A10166Yですね。

4、serproxy.cfgの編集。


serial_device1=[さっきprocessingで調べたデバイス名]
を付け足します。
私は
serial_device1=/dev/cu.usbserial-A10166Y
を書き足しました。
出来たら上書き保存。

5、serproxyを立ち上げる。
serproxyをクリックするとそのままTerminalが立ち上がります。
ちなみに終了するときはcontrol+c(リンゴじゃないほうのcontrol)

5.5、Arduinoへの書き込み
下のファイルを動かすために書いたのはこんな感じ。はたやまさん、ありがとう。

int potPin = 2;
int ad;

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


void loop()
{
ad = analogRead(potPin);
Serial.println(ad/4);
delay(100);
}


6、Flashファイルを実行

今回ははたやまさんが2006のテクササイズで用意してくれたasファイルを使ってみました。

ソースはこんな感じ。値によって丸の大きさが変化します。

//import ArduinoSerproxy API これは以前はたやまさんが用意してくれたasファイルなのです。奥出研究室の特権ですね笑どうしても手に入れたいって人はご連絡くださいませ♪
import org.hatayan.util.arduino.ArduinoSerproxy;
//Create ArduinoSerproxyObject
var serial_net = new ArduinoSerproxy();

//Connect Comport Server.Input Server IPAdress and Port number.PortNumberはSerproxy.cfgに書いてあります。勝手に変更しないこと。

serial_net.openRemoteComport("localhost", 5331);

serial_net.onReceiveStr = function(serialObj:ArduinoSerproxy) {
var rsv = serialObj.getStr();
receive_txt.text=rsv;
trace(rsv);
_root.circle_mc._xscale=rsv;
circle_mc._yscale=rsv;

};

ActionScript3.0=基礎体力編1日目=

オブジェクトがどんどん右に水平移動していく

//var 変数名 = 値  変数を宣言、初期値は0
var starX:Number = 0;

//インスタンス.addEventListener(イベント, 関数名);
my_mc.addEventListener(Event.ENTER_FRAME, enterFrameHandler);

//function 関数名(イベントオブジェクト:データ型):void
function enterFrameHandler(event:Event):void {

//変数starXの値を毎フレーム増加して、ムービークリップのx座標に割り当てる
starX++;
event.target.x = starX;
}

これから怒濤のActionScript3.0祭りの開催だーぃ

今日から、ちゃんとAS3.0します。
私は、プログラミングの基本的な考え方から身に付いていないので、AS3を通じてプログラミングのお作法も身につけることが目標!

2008年6月15日日曜日

モバイルやP2pの最近の動き



Loopt
携帯で近場の友だちが探せるモバイル版ソーシャルネットワーク。
もうすぐiphone用も出る。twitterが地図上で見れる感じ。









peer cast
P2Oネットワークを利用している

初心者向けPeerCast解説なんてのもある



Flashで音を鳴らす (橋本詳解さんより)
この音楽ファイルの名前をXMLでダイアミックに変化させていけば
以前の構想に近い感じになる。
var s:Sound = new Sound();
s.loadSound("gon.mp3", false); // ストリーミングしない
s.onLoad = function(success:Boolean):Void {
if (!success) return;
s.start(); // 1回鳴る
};
http://d.hatena.ne.jp/shokai/20080520/1211249718


var req:URLRequest = new URLRequest("pi.mp3");
var s:Sound = new Sound(req);
s.play();

http://d.hatena.ne.jp/shokai/20080423/1208934247

2008年6月6日金曜日

言葉で伝えるときに気をつける事

今日は自分たちが創るものを伝えることがあって、それに対してアドバイスをいただいた。
あ〜そっか!!っていうことがもりもりしていたので、個人的なことだけどめもめもーっと。

文章を読んでいて、そのシーンが思い浮かぶように伝える。
そのためには、

まずは、話を抽象化しない。
自分の創るモノ、それが作る世界の価値をストレートに表す。それは、自分が創るモノっぽいのがある世界を書く(概念的な)のではない。ついついそのモノが生み出す世界を書こうとすると大きく大きく見せようとしてしまって抽象的な言葉で表現してしまう。そうではなくって、自分の作るモノが大きく世界をつくることを伝える。
じゃあ、そのモノがつくる世界ってなんなのさって時にその哲学的なことを書く。これはちょっち難しくて頭を働かせる。

これってモノをデザインする時の思考と同じなんだー。
抽象化してはいけない。具体的に具体的に考えて設計するってこと。
自分達のつかまえたものを、歪曲化しないでストレートにデザインする。

抽象的な言葉って、なんか小難しくてふやふやしていてなんだかかっこよく見えたりするけど
伝わらないよな〜確かに!と思った。私がデザインしているのは思想とかふやふやしたものでなくて、こう手に取れるモノ。触れるモノ。そのモノを伝えたいのだし、そのモノがつくる世界を伝えたいのだから、抽象的な言葉では伝わらないんだな〜。ストレートに伝えなきゃ!ってこと。


言葉の選び方にもっと注意を払う。
そういえば、昔から友達に私の伝えたいイメージと私が選ぶ言葉にずれがあるって指摘されたことがあったな〜。
例えば今日の事で言うと、干渉する・混線する・混ざり合うって全然違う言葉。その自分の伝えたいことを表す言葉を選ぶのにもっともっと慎重になる。
これをするのに自分には足りないところがいくつかある。例えば、語彙が少ない。例えば、今日の例で言うと混線するとか混ざり合うって言葉が出てこなかった。言葉を知らないからこそ、無理矢理言葉と伝えたいイメージを結びつける。その時は、言葉とイメージがずれているってことすら気づかなかった。鈍感。。

この足りないところは、自分のblogなりで表現してくことで言葉に対する感受性を磨いていかなくては!!って思いました。

2008年6月5日木曜日

underground aesthetics: rethinking urban computing /paul dourishのプロジェクト

paul dourishの論文をあさっていたら、先行研究として参考になりそうなプロジェクトがあったので載せます。論文ほど難しくないので、さくさく手軽に読めます。
underground aesthetics: rethinking urban computing

哲学的な部分がかなり参考になる。音楽を街で聞くとはどういうことか、人が音楽を楽しむとはどういったことなのか、参考にしていきたいと思う。



まずは、デザインの内容を要約したもの

・a moblie phone client lets both emerging musicians and audiophiles wirelessly upload their tracks at upload point inside the underground station ticket halls.

・this same phone application lets users download tracks from download points on the train platforms as well as from other users in proximity.

・the phone application stores metadata from each music exchange, which the upload and download access points throughout the undersound network collect and use to drive large visualizations in the ticket halls, which reflect the music's movement through the network.

・携帯会社は、アップロードポイントを地下鉄の駅、チケット販売ホール内に設置し、無線で新生ミュージシャンやオーディオファンに彼らのトラックをアップロードさせる。

・これと同じ機能を利用して、ユーザーが電車のプラットホームのダウンロードポイントから、もしくは近辺にいる他のユーザーからもトラックをダウンロードできる。

・この携帯アプリケーションは、アンダーサウンド・ネットワーク全体でアップロードとダウンロードのアクセスポイントで収集したすべての曲共有のメタデータを保存でき、それをネットワーク上での音楽の動きを反映するため、チケットホールで大きく視覚化させる。

ーーーーーーーーーーーーーーーーーーーーー

つまり、要約すると、
誰かが曲をアップロードしてそれを他の人がダウンロードできて、それをまた他の人と共有できて、ってどんどん地下鉄内で曲が動いて、その曲の動きがチケット売り場に作られたスクリーン上で見れる。
ってことらしいです。これが実際に実装されたのかはまだ読んでないので分からないけど、
少なくとも2007年ロンドン地下鉄では見た事ないです。(ロンドンにいた友達によると)



あと、第2章を訳したものを載せます。

2章
Noninstrumental aspect of London's Underground
(ロンドン地下鉄の大事じゃない局面?)謎。
エスノグラフィー調査について書いた章。

【1】研究の意義と概要

■Tubeはすごい!
the Tube は ロンドンの city transportation の中心
たくさんのexperienceをsupport
しかしtubeの研究は最近されていない。
ので経験のaesthetic components に対する理解を深めるための研究をしている。
application designに生かすのが最終的な目的。

■研究の概要
目的:
乗客が 他の乗客/もしくは空間とどのようにinteractionしているか見る
interactionはテクノロジーを通じて現れるから、
デジタル/ノンデジタル両方のテクノロジーを観察した。
(ノンデジタル: 新聞、本、チケットとか)
個人と集団両方の地下鉄での経験にfocusした

【2】エスノグラフィー的調査
■ 他人に興味がない例
乗客A「ロンドンでは話しづらい雰囲気だから、無言で席を譲る」
乗客B「本がないとつまんない」
他人に興味がない ⇔ 席をゆずるって社会参加
上のようにプライベートと社会参加のtensionのバランスをとるのに
新聞から音楽プレイヤーまで種々のメディアやtechが使われている
他の人見ないためにtechnologyを使ってる。
音楽プレイヤーは周囲の空気読んだりしない:社会へのdefenseになる
すべてのテクノロジーは他人とのインタラクションを疎外
user は public invisibility力 を備えるのに成功

■ 他の乗客に興味を持って、寄り道しちゃう例
乗客C「他の乗客とcontactする、それを見る他の人」
乗客D 「ひとめぼれした人を追っかけたり、そのために遅く歩く。
街あるいてると20回はひとめぼれしちゃうの」
乗客E「持ってたguidebook の表紙から、その子がタイ人であることを判断。
かわいそうなので道案内してあげた。」
他の乗客の本の内容を見る、みたいな単純な行為:
単純に他の乗客の読書のテイストわかるし、
その人のそれまでの day's activity を大きく変えてしまう!すごい!

乗客の持ち物:
単に想像力をかきたてるだけでなく、インタラクションの可能性を秘めてる。

■ unspoken 非言語コミュニケーション の例
乗客F「チケットを交換するunspoken な exchange」
 day-travel card:
紙チケットだからこその行為が利用者の中に発生
RFID の Oyster card では起こらない。
乗客F「読み終わった新聞を次の人のために車内に置いて帰る」
 無料紙だけでなく有料の The Guardian紙 まで置いてく人も
↑ unspoken exchange の channel として機能
現在と未来の乗客を把握できる。
テクノロジーは、個人の経験を豊かにするだけでなくて、その人の周囲にある環境との関わり方を変える!

■ 閉じこもる人々の例:
すべての壁に貼られているポスター
 ↓↑
個人が持つ personal technology

personal technology によってメディアのコンテンツが人を支配。
:人自身が、多様なメディア(携帯、本、音楽プレイヤーとか)の一部に。
- 地下は電波ないので、携帯でゲーム、読書、古いメッセージ削除、音楽聞くとか。
- 目線は自分の荷物を常に見てる。ある種のパーソナルスペースを作ってる
- 世界に入りすぎて、電車を逃すことも

■ technology使用経験が記憶と結びつく例:
乗客G 「音楽で職場近くの駅の様子を思い出す」
毎日同じ曲を聴いて通勤。特定の曲が通勤時間のシンボル化。
→ " mnemonic narratives 記憶を助ける物語 " をつくってる。
乗客H「ある駅で起こったパニックアタックを、
現地に行かなくても路線図を見るだけで思い出す。」
→ 地下の景観(統一感のある車体/個性的な駅)と掲示物があいまって、
地下鉄と都市両方の経験を豊かにする。
地下が、人間とカオスな都市とを結ぶインターフェースとしての地理に影響。

【3】調査まとめ
(1)テクノロジー利用自体でなく、それによって得た経験に意味がある。
経験とは:
他の乗客に興味を持って、unspoken なやりとり(社会性)
 ↓↑ 乗客は両方をあわせ持つ。
技術を、social isolation を保持ために使う(個人)

(2)リッチな "mnemonic narratives " の生成
みんなが見れる駅の個性的な景観とか掲示物 (public)
 ↓↑ 2つの相互作用
個人の持つtechnology (private)
相互作用が地下鉄での経験を意味のあるものにしている

2008年6月4日水曜日

著作権に関する法律

まほですー

学校の課題で政策を作る課題が出て著作権に関する法律を調べたのでめもめも。

まず知らなくてびっくりしたのは、1曲当たり45秒以内なら使用料が免除みたい!!
だから、i-tunestoreやlast.fmでの視聴はどれでも聞けるのね。
http://www.mext.go.jp/b_menu/houdou/12/12/001224b.htm

それで、ついでにlast.fmはどうやって著作権を管理しているか。
http://www.itmedia.co.jp/news/articles/0606/30/news022.html

によると、
フルコーラス再生できるのは、著作権フリーの曲と、Last.fmが契約したメジャーレーベル4社を含む世界1万レーベルの50~100万曲。


そして気になったのは、 ituneの共有機能は著作権問題はどうなんだろうか。
調べたところ、だいぶグレー。ローカルネットで、あくまで身内などとの私用目的だから◎みたい。

2008年5月29日木曜日

サーバーのはじめの一歩

今日は、サーバーがネットワークにおいてどんな役割を果たしているのかを知りました。
そして、そのサーバーを自分のPCからリモートログインしていじりました。
また、サーバーのOS(Ubuntu)をインストールしました。(超簡単!!)

《serverって何??》
クライアントの親みたいなもの。
クライアントのリクエストに返してくれるのがサーバー。

・DNSとは..
サーバーのIPアドレスは、数字の組み合わせなので覚えにくい。
それを、ドメイン名として変更するのがDNS。
これがあるのでIPを直打しなくてもできる。

《リモートログインしてみよう〜mac用です》
覚えておくといいコマンド
・cd  ディレクトリを移動
・pwd 現在のディレクトリの確認
・ls ディレクトリの中身を表示。-l で詳細表示
・ifconfig  ネットワークインターフェース情報の表示・設定
他にもありますhttp://www.k-tanaka.net/unix/


1)ターミナルを起動する
2) ssh (user名)@(ホスト名.ドメイン名)  と入力
((sshとはつなぎ方を指定してる)) →*1へ
3)サーバーと繋がった
4)nano ファイル名
(nanoはエディタの一種。他にはemaxとかある)
5)ファイルが起動された
6)ターミナル上でサーバーにあるファイルの中身をいじることができた

〈*1 いろんな繋ぎ方〉
ssh 安全
http webのときのプロトコル
ftp ファイル転送プロトコル
scp


《Ubuntuをインストール》
準備:UbuntumをHPからCDRに焼いておく
http://www.ubuntulinux.jp/products/GetUbuntu

1)サーバー用のPCに焼いたCDRを入れておく
2)Ubuntuのインストール画面が出てくる
3)任意の情報を入力し、ひたすらenter
4)ディスクのパーティショニング
 Ubuntuにどのくらいの容量を使うのかを設定する
5)パッケージマネージャーの設定
 HTTPプロキシ情報・・空でもよい
6)software selection
 今回は以下の2つにチェックを入れる
 ・LAMP server(webserverのこと)
 ・Open SSH(SSHでログインすること。これがないとリモートログインできない)
7)インストール終わり!!超簡単!!

2008年5月5日月曜日

今後のここにいるよ。

お久しぶりなここにいるよブログです。

しばらくは、音楽SNSのことや、Ruby on Railsの勉強進み具合なんかを書き込んで行きましょう。

んで、今日は音楽SNSのことをちらっと調べてみた。
Last FMなんかは有名。んでiLikeってのも気になった。ここのblogにいい感じで紹介されています。


iTuneとも連動させることが出来るらしい。これが広まったら中々楽しいよね。
私もさっそく始めようと思います。
メッセンジャーとかでも、友達がいま何を聞いているのか出たりしますが、あれってなかなか良い反面、有効利用されてない感じがぷんぷんしてました。
これだとそのままiTuneストアやAmazoneに飛んでお買い物出来るからよいね。

そうそう、普通のSNS、FaceBookがこのiLikeの会員数に貢献した模様。アプリの開発を推奨しているというのは、やはり良い心がけ。オープンにするからこそ成功、ってのが今ですな。私もFaceBookに使えるようなものを作ろうかな??
伝染ラジオにつけるとしたら、この状態+Mapや時間といった要素も付け加えると面白いと思います。Nike+的要素って感じかな。

うん、燃えて来たね!!!

2008年2月13日水曜日

Xtelに書き込むコード ほとんど最終形態

var checkA= 1;
var checkB= 1;
var checkC= 1;

pinMode(0, true);
radioInit(0xDEAD, 0, 11, 2);
serialInit(9600);
// メインとなるループ
while(true) {
ain = analogRead(0);
ain1 = analogRead(1);
ain2 = analogRead(2);
//serialSend("M "+analogRead(0)+"\r\n"+"SV "+analogRead(1)+"\r\n"+"BT "+analogRead(2)+"\r\n");

function onRadioReceive(seq,src,pan,data,rss) {
serialSend("BT2 "+analogRead(2)+"\r\n");
if (data == 'A' && checkA == 1){
serialSend("A "+1+"\r\n");
checkA = 0;
checkB = 1;
checkC = 1;
}else if(data == 'B' && checkB == 1){
serialSend("B "+1+"\r\n");
checkA = 1;
checkB = 0;
checkC = 1;
}else if(data == 'C' && checkC == 1){
serialSend("C "+1+"\r\n");
checkA = 1;
checkB = 1;
checkC = 0;
}else if(data == 'X'){
serialSend("BT2 "+1+"\r\n");
}
}
radioSend(0xFFFF,analogRead(2));

if(ain<0.3){>0.4 && ain <0.7){>0.7){
radioSend(0xFFFF, 'C');
}else{
}
}

Xtelに書き込むコード 最新

var checkA= 1;
var checkB= 1;
var checkC= 1;

pinMode(0, true);
radioInit(0xDEAD, 0, 11, 2);
serialInit(9600);
// メインとなるループ
while(true) {
ain = analogRead(0);
ain1 = analogRead(1);
ain2 = analogRead(2);
//serialSend("M "+analogRead(0)+"\r\n"+"SV "+analogRead(1)+"\r\n"+"BT "+analogRead(2)+"\r\n");

function onRadioReceive(seq,src,pan,data,rss) {
if (data == 'A' && checkA == 1){
serialSend("A "+1+"\r\n");
checkA = 0;
checkB = 1;
checkC = 1;
}else if(data == 'B' && checkB == 1){
serialSend("B "+1+"\r\n");
checkA = 1;
checkB = 0;
checkC = 1;
}else if(data == 'C' && checkC == 1){
serialSend("C "+1+"\r\n");
checkA = 1;
checkB = 1;
checkC = 0;
}else if(data == 'X'){
serialSend("BT2 "+1+"\r\n");
}
}
if(ain2 >0.6){
radioSend(0xFFFF, 'X');
}else{
}
if(ain<0.3){>0.4 && ain <0.7){>0.7){
radioSend(0xFFFF, 'C');
}else{
}
}

2008年2月12日火曜日

補足

M : 可変抵抗1(スライダー)
この値によって、相手に曲を伝染させたり(正確には、相手のMaxに再生曲を伝える)自分の曲を変更する。

SV : 可変抵抗2
音量の調整用

BT : 加速度センサー
この値でビートを刻む

<最新>Xtelに書き込むコード

// 送りつつ受け取る
var checkA= 1;
var checkB= 1;
var checkC= 1;

pinMode(0, true);
radioInit(0xDEAD, 0, 11, 2);
serialInit(9600);
// メインとなるループ
while(true) {
ain = analogRead(0);
ain1 = analogRead(1);
ain2 = analogRead(2);
//serialSend("M "+analogRead(0)+"\r\n"+"SV "+analogRead(1)+"\r\n"+"BT "+analogRead(2)+"\r\n");
function onRadioReceive(seq,src,pan,data,rss) {
if (data == 'A' && checkA ==1){
serialSend("A "+1+"\r\n");
checkA = 0;
checkB = 1;
checkC = 1;
}else if(data == 'B' && checkB == 1){
serialSend("B "+1+"\r\n");
checkA = 1;
checkB = 0;
checkC = 1;
}else if(data == 'C' && checkC == 1){
serialSend("C "+1+"\r\n");
checkA = 1;
checkB = 1;
checkC = 0;

}
}
//ain = analogRead(0);
if(ain<0.4){>0.4 && ain <0.7){>0.7){
radioSend(0xFFFF, 'C');
}else{
}
}

Xtelに書き込むコードについての考察

やすこ

なんでこんなに同じようなコード(ちょっとずつ改訂してますが)を連続投稿したかというと、スペース一つできちんとRun出来るかどうか変わってしまうという、かなり不安定な存在=Xtelだからです。

昨夜、一人でもくもくと作業しながら、「なんでできないのか??」と悩んでいましたが、コメントアウトを減らした所書き込めました。
こんなこともあるXtelでづが、かなり仲良くなりつつあります。

Xtelに書き込むコード3

// 送りつつ受け取る
var checkA= 1;
var checkB= 1;
var checkC= 1;


pinMode(0, true);
radioInit(0xDEAD, 0, 11, 3);
serialInit(9600);
// メインとなるループ
while(true) {
ain1 = analogRead(1);
ain2 = analogRead(2);
serialSend("KS "+analogRead(1)+"\r\n"+"KH "+analogRead(2)+"\r\n");
function onRadioReceive(seq,src,pan,data,rss) {
if (data == 'A' && checkA ==1){
serialSend("A\r\n");
checkA = 0;
checkB = 1;
checkC = 1;
}else if(data == 'B' && checkB == 1){
serialSend("B\r\n");
checkA = 1;
checkB = 0;
checkC = 1;
}else if(data == 'C' && checkC == 1){
serialSend("C\r\n");
checkA = 1;
checkB = 1;
checkC = 0;

}
}
ain = analogRead(0);
if(ain<0.3){>0.4 && ain <0.6){>0.7){
radioSend(0xFFFF, 'C');
}else{
}

Xtelに書き込むコード2

// 送りつつ受け取る
var checkA= 1;
var checkB= 1;

pinMode(0, true);
radioInit(0xDEAD, 0, 11, 3);
serialInit(9600);
// メインとなるループ
while(true) {
ain1 = analogRead(1);
ain2 = analogRead(2);
serialSend("KS "+analogRead(1)+"\r\n"+"KH "+analogRead(2)+"\r\n");
function onRadioReceive(seq,src,pan,data,rss) {
if (data == 'A' && checkA ==1){
serialSend("A\r\n");
checkA = 0;
checkB = 1;
}else if(data == 'B' && checkB == 1){
serialSend("B\r\n");
checkA = 1;
checkB = 0;
}
}
ain = analogRead(0);
if(ain<0.5){>0.5){
radioSend(0xFFFF, 'B');
}else{
}
}

2008年2月5日火曜日

ドラム

やすこ

連続してすまんぬ。

本日即席で作った、ヘドバンドラム(?)の音素材はここから
SampleSwap
ものすごい量の音素材がタダでもらえます。一読ならぬ一聴あれ

追加したい効果音とかあったら、言ってください。

Xtelに書き込むコード

やすこ

本日の集大成。コードでござい☆




// 送りつつ受け取る
var checkA= 1;
var checkB= 1;
// 初期化処理
pinMode(0, true);// trueならOutputモード
radioInit(0xDEAD, 0, 11, 3); // groupID, 自分のID, チャンネル, 電波強度
serialInit(9600);
// メインとなるループ
while(true) {
ain1 = analogRead(1); //port1には加速度
ain2 = analogRead(2); //port2には可変抵抗をつけます
serialSend("kasokudo"+analogRead(1)+"\r\n"+"kahen"+analogRead(2)+"\r\n");
function onRadioReceive(seq,src,pan,data,rss) {
if (data == 'A' && checkA ==1){ //checkという変数を用意
serialSend("A\r\n");
checkA = 0; //これで、一つ前に送った値がAの場合は、連続して送りません
checkB = 1;
checkC = 1;
checkD = 1;
}else if(data == 'B' && checkB == 1){
serialSend("B\r\n");
checkA = 1;
checkB = 0;
checkC = 1;
checkD = 1;
}
}
ain = analogRead(0);//port0からとった値を送ります
if(ain<0.5){>0.5){
radioSend(0xFFFF, 'B'); //Bを相手に送ります
}else{

}
}






これを共通して書いてしまえば、2つのエクステル間で送受信が出来ます。
注意!
短いスクリプトでないと、書き込めません。
よってなるべく改行やコメントアウトを減らしてください。

2008年2月3日日曜日

秋葉原にいるよ。

まほです。

昨日は、ここにいるよ。は、秋葉原にいるよ。でした。
プロトで検証することとお買い物が目的。

買ったもののめも。
電池:たくさん
電池ボックス:5個
バッテリースナップ:5個
http://akizukidenshi.com/catalog/items2.php?q=%22P-00209%22&s=score&p=1&r=1&page=
http://akizukidenshi.com/catalog/items2.php?p=1&q=%22P-00207%22



↑いくら秋葉原でもおかしいよこの光景の図。ヨドバシ前です。




そして、秋葉原駅前の公園では寒い中ヲタ芸を練習している人たちがいました。



実装を着々と進めていきましょ

2008年1月28日月曜日

MaxとMOXA連携の補足

やすこ

個人的な話。

いつもシリアルリードするとき、ポートを付け替えなくちゃいけないのに、忘れている私。書き込むときと、読む時でポートが違うので注意じゃ!

2008年1月27日日曜日

MAXとMOXAの連携

MAXとMOXAの連携で今日は非常に手間取りましたが、解決!!

xtelを繋げる

MAXを起動(Tetminalやeclipseは起動していない状態で)

あと少し頑張るぞ!!

2008年1月25日金曜日

Moxaな続き。

<ターミナルの使い方>
・セッティングした時のポート指定でUSBシリアルが出てこない場合eclipseを再起動する。
→再起動するとusbserialが増えている。
→そのあとconnectの緑のやつを押すと数値を取ってる。
<MOXAの注意事項>
・レインボウラインは繊細。注意せよ・・・。

↓MOXAの写真。前回の写真だとよく分からないんでもう1回アップロードします。
 上からPROTO1BOARD、DEVICEBOARD、DEVICEBOARDの2番を拡大したもの。

2008年1月18日金曜日

危機せまる



RockStar

DigitalDJで取り上げてたものっす。なんか初期の「伝染ラジオパーティー」を彷彿とさせるなぁ^^;でも、私たちのコンセプトには、私たちだけの「伝染」がある!ってわけでめげずにがんばるんば

今日はミートが流れてしまったので、一人調べ学習。
OSCを使ったProce55ingとMaxの連携

いままでパッチでなんとか切り抜けてきたけど、ここから本格的にUDPとか覚えて行かなくちゃね

2008年1月15日火曜日

Moxaな写真

↓switch on な状態。



MOXAデビュー その2

やすこ
連続投稿

次はMOXAを使ってみましょう!

1、eclipsをたちあげます
2、簡単なソースを用意します

こんなんで。

スライダで手元のLEDを光らせる

// 変数の準備
var brightness; // LEDの明るさ

// 初期化処理
pinMode(0, true); // PORT0にはLEDを接続(LOW出力で点灯)

// メインとなるループ
while(true) {
brightness = analogRead(2); // PORT2からスライダのアナログ値を逐一読む
analogWrite(0, brightness); // PORT0にアナログ値を出力
}

3、書き込みます
talktic buildボタンを押します。compileが出来ると、書き込みを開始します。と出てくるのでwindowsユーザーはcomを指定。
Arduinoと同じように、書き込む直前にスイッチオン!続けざまに書き込みOKボタン!すばやくやらないと失敗します。

4、ソースを見ながらデバイスポートにセンサー類を差し込んで完了!

MOXAデビュー その1

ほんとの私、デビュー♪

MOXA フューチャリング KORIYAMA
でお届けします。

まずはMOXAを使えるようにする準備

1、ウィッキーさんのMOXA技術資料から「開発用エクリプスパッケージ(workshop.zip)」をDL
2、解凍しましたら、setup/USB-Serial driverの中にあるドライバー2つを実行
※macの人は、ターミナルが立ち上がって完了したらシャットダウンします。
3、eclipsをインストールします。
※macの人はアプリケーションに入れればOK
4、workspaceの指定が出てきます。workspaceの場所は、よくわかんないけどeclipsアプリケーションの下に入れました。

これで準備完了!

2008年1月8日火曜日

ArduinoからMax/MSPに値を取ってくる。

清水です。

正月早々ArduinoからMax/MSPに値を取ってこようとしてました。
やってみれば案外簡単です。でもGoogleとEnglishと地味に戦ってました。

とりあえず下のサイトに大まかに書いてある気がします。
http://www.arduino.cc/playground/Interfacing/MaxMSP
あまり読んでないんで何とも言えないですが・・・w。

今回はとりあえずよく分からなかったんで1番上のSimpleMessageSystemでやってみました。
下のリンク先はzipファイルです。
http://www.arduino.cc/playground/uploads/Code/SimpleMessageSystem.zip
保存したら中にあるpdfファイルの通りやればいいだけです。

とりあえずざっくり説明します。
SimpleMessageSystemのフォルダごと"{arduino-0004\lib\targets\libraries\"にコピーしてあげる。(多分arduino-0004ではないと思うけど大丈夫です。)
→Arduinoを開いてやって"Arduino Menubar->File->Sketchbook->Examples-> Library-SimpleMessageSystem->SimpleMessageSystem_example1
のExampleのコードをそのまま入れて実行してやる。
→SimpleMessageSystemのフォルダの中に"MaxMsp Example" のフォルダがあるんで、その中の"SimpleMessageSystem_analogin.mxb"を開いてやる。
→Maxの方のCOMの番号を変えてやる。
これであとはMaxのそれっぽいスイッチを押せば取れるはずです。
今やりながら書いてるわけではないけど確かそんなんでした。詳しいことはpdfファイルを見てあげてください。

※"max2asciimessage"と"asciimessage2max"が何か重要らしいです。なんか"MaxMsp Example"にそれと同じ名前のMaxファイルが入ってるんで多分それは分かると思いますが。
実行したファイルの保存先と同じ所にこの2つのMaxファイルがないと動かないんで注意してください。ちなみに僕はそれで昨日2時間ぐらい地味に格闘しました、テレビ見ながら・・・w。

2008年1月3日木曜日

あけましておめでとうございます

やすこ

お正月はオフライン状態でした。今日からまたがんばります。

実家に帰ったら、親戚のプログラマー兄妹に遭遇しました。メールアドレスも交換しちゃったので、プロの話が今後は聞けそうです!!やばいね、これw

んで、DSの仕組みについてきいたら
「アドホック通信だよ」と即答されました。その場かぎりの(Ad Hoc)ネットワークをつくって、機器同士がつながるもののようです。ちなみにこれは無線LANが入ってればできるようです。現在調査中。

もうひとつ。いままで私の悩みは
「すれちがったひとは誰か?」ということを識別する方法でした。んで、解決策
1、
「Macには部品単位で、世界でたったひとつのMacアドレスというものが割り当てられている。だからそれをつかっちゃえばよい」というもの。すご!!
2、
Bluetooth これはたしかにひとつずつIP持つから、それで識別可能。イギリスでは携帯に入ってるbluetoothを使って知らない人にメール送ったりする、なんてことがはやったらしいです。
(個人情報の問題でなくなったらしいけど)
なんでこのあたりをつかえばなんとか。。。

今後の予定>arudinoを使う??
ipodtouchハックは2月までまったほうがよさそうだなぁ