2012年12月17日月曜日

Processing.jsを使ってみる

遅まきながらProcessingにハマり中.

Androidアプリに変換できるし,
Processing.jsがあればhtml5環境でもうごく.

まだまだ簡単なことしかできないけど,
色々と出来そうな感じが素晴らしい.


int angle;
void setup(){
  frameRate(100);
  size(400,400);
  PFont myFont = createFont("Osaka", 32);
  textFont(myFont);
  angle=0;
}

void draw(){
  background(0);
  pushMatrix();
  translate(width/2, height/2);
  angle=angle+5;
  rotate(angle*PI/180);
  text("おいしい", 0, 0);
  popMatrix();
  if(angle>360){
    angle=0;
  }
}
これが,こうなる↓

2012年12月3日月曜日

dbpedia.orgの内容をopenstreetmapに表示する

dbpedia.orgの内容をopenstreetmapに表示する実験.

本当はリアルタイムでdbpedia.org endpointに問い合わせられるといいのだけど,

何となく負荷が気になるので

今回は問い合わせ結果をSPARQL Result XML Formatに保存し,

それをopenstreetmapに表示する.

まずはdbpedia.orgへの問い合わせ.

SPARQLクエリは以下のとおり.

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX wgs84_pos: <http://www.w3.org/2003/01/geo/wgs84_pos#>
PREFIX dbpedia-owl: <http://dbpedia.org/ontology/>
PREFIX yago: <http://dbpedia.org/class/yago/>
select ?lat ?lon ?title ?description ?icon ?iconSize ?iconOffset where{
?s rdf:type yago:PrefecturesOfJapan .
?s rdfs:label ?title .
?s dbpedia-owl:abstract ?description .
?s wgs84_pos:lat ?lat .
?s wgs84_pos:long ?lon .
filter (lang(?title)="en") .
filter (lang(?description)="en").
optional {
?s <urn:hoge> ?icon .
?s <urn:hoge2> ?iconSize .
?s <urn:hoge3> ?iconOffset .
}
}


日本の都道府県を検索しその概要と緯度経度情報を取得するクエリである.

この結果をOpenLayers.Layer.Text()を使って表示する.

OPTIONALはかなり強引・・・

先のクエリをdbpedia.orgのendpointに投げるとこんな感じのSPARQL Result XML Formatが帰ってくる.

これを先のポストで作成したXSLでTSVに変換し,

OpenLayers.Layer.Text()で読み込めば完成.

XSLTはphpで実行している.


うん.いい感じ.

北海道がないのはクエリにある

?s rdf:type yago:PrefecturesOfJapan .

の所為.

なんでかな.


2012年12月2日日曜日

XSLTを使ってSPARQL Query Results XML FormatをCSV/TSV形式にする

SPARQL Query Results XML FormatにあるXSLTサンプルresult-to-html.xslを少し書き換えてCSV/TSVを出力するようにしてみた.

<?xml version="1.0" encoding="UTF-8"?>  
<xsl:stylesheet exclude-result-prefixes="res xsl" version="1.0" xmlns:res="http://www.w3.org/2005/sparql-results#" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml">
  <xsl:output encoding="UTF-8" method="text">
    <xsl:template name="boolean-result">
      <xsl:value-of select="res:boolean">
  </xsl:value-of></xsl:template>
  <xsl:template name="vb-result">
   <xsl:for-each select="res:head/res:variable">
     <xsl:value-of select="@name">
     <xsl:text>,</xsl:text>
   </xsl:value-of></xsl:for-each>
 <xsl:for-each select="res:results/res:result">
<xsl:text>
</xsl:text>
     <xsl:apply-templates select=".">
  </xsl:apply-templates></xsl:for-each>
  </xsl:template>
  <xsl:template match="res:result">
    <xsl:variable name="current" select=".">
    <xsl:for-each select="//res:head/res:variable">
      <xsl:variable name="name" select="@name">
 <xsl:choose>
   <xsl:when test="$current/res:binding[@name=$name]">
     <xsl:apply-templates select="$current/res:binding[@name=$name]">
   </xsl:apply-templates></xsl:when>
   <xsl:otherwise>
   </xsl:otherwise>
 </xsl:choose>
 <xsl:text>,</xsl:text>
    </xsl:variable></xsl:for-each>
  </xsl:variable></xsl:template>
  <xsl:template match="res:bnode">
    <xsl:value-of select="text()">
  </xsl:value-of></xsl:template>
  <xsl:template match="res:uri">
    <xsl:variable name="uri" select="text()">
<xsl:value-of select="$uri">
 </xsl:value-of></xsl:variable></xsl:template>
  <xsl:template match="res:literal">
    <xsl:choose>
<!--
      <xsl:when test="@datatype">
 <xsl:value-of select="text()"/> (datatype <xsl:value-of select="@datatype"/> )
      </xsl:when>
      <xsl:when test="@xml:lang">
 <xsl:value-of select="text()"/> @ <xsl:value-of select="@xml:lang"/>
      </xsl:when>
      <xsl:when test="string-length(text()) != 0">
 <xsl:value-of select="text()"/>
      </xsl:when>
      <xsl:when test="string-length(text()) = 0">
      <xsl:text></xsl:text>
      </xsl:when>
-->
      <xsl:when test="string-length(text()) != 0">
 <xsl:value-of select="text()">
      </xsl:value-of></xsl:when>
    </xsl:choose>
  </xsl:template>
  <xsl:template match="res:sparql">
     <xsl:choose>
   <xsl:when test="res:boolean">
     <xsl:call-template name="boolean-result">
   </xsl:call-template></xsl:when>
   <xsl:when test="res:results">
     <xsl:call-template name="vb-result">
   </xsl:call-template></xsl:when>
 </xsl:choose>
  </xsl:template>
</xsl:output>
</xsl:stylesheet>
TSVを出力する場合は「,」とある箇所をタブに書き換えればよい.


2012年11月24日土曜日

SPARQL ResultをSIMILE Timeline Widgetで表示する

昔からあるツールだけど時系列データの可視化ツール「SIMILE Timeline Widget」はSPARQLによる問い合わせ結果をそのまま表示できるらしい.

さっそく試してみる.

問い合わせは先はdbpedia.org.

SPARQL endpointはhttp://dbpedia.org/sparqlを利用する.

問い合わせ文は以下のとおり.

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#>
PREFIX foaf:<http://xmlns.com/foaf/0.1/>
PREFIX dbpprop: <http://dbpedia.org/property/>
select * where {
?s rdf:type foaf:Person .
?s rdf:type <http://dbpedia.org/class/yago/PeopleOfMuromachiPeriodJapan> .
?s rdfs:label  ?title.
filter(lang(?title)="ja").
?s rdfs:comment  ?description.
filter(lang(?description)="ja").
?s dbpprop:dateOfBirth ?start .
?s dbpprop:dateOfDeath ?end .
?s foaf:isPrimaryTopicOf ?link .
}
室町時代の日本人の生没年と解説を検索する.

Timelineの方は以下のとおり.


<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Timeline demo</title>
<!--[if IE]>
<script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<script src="libs/timeline/api/timeline-api.js" type="text/javascript"></script>
<script type="text/javascript">
var tl;
function onLoad() {
var eventSource = new Timeline.DefaultEventSource();
var bandInfos = [
Timeline.createBandInfo({
eventSource: eventSource,
date: "Jun 1 1534 00:00:00",
width: "80%",
intervalUnit: Timeline.DateTime.YEAR,
intervalPixels: 10
}),
Timeline.createBandInfo({
overview: true,
eventSource: eventSource,
date: "Jun 1 1534 00:00:00",
width: "20%",
intervalUnit: Timeline.DateTime.YEAR,
intervalPixels: 200
})
];
bandInfos[1].syncWith = 0;
bandInfos[1].highlight = true;

tl = Timeline.create(document.getElementById("my-timeline"), bandInfos);
//var sparql="/lod/result01.xml";
var sparql="http://dbpedia.org/sparql?query=以降省略";
Timeline.loadXML(sparql,function(xml,url){eventSource.loadSPARQL(xml,url);});
}

var resizeTimerID = null;
function onResize() {
if (resizeTimerID == null) {
resizeTimerID = window.setTimeout(function() {
resizeTimerID = null;
tl.layout();
}, 500);
}
}
</script>
<style>
</style>
</head>
<body onload="onLoad();" onresize="onResize();">
<div id="my-timeline" style="height: 600px; width: 800px; border:1px solid #aaa"></div>
<noscript>
This page uses Javascript to show you a Timeline. Please enable Javascript in your browser to see the full page. Thank you.
</noscript>
</body>
</html>

結果波以下のとおり.

うーん.こんなことが簡単にできるなんて,





















色々と使えそう.

2012年11月2日金曜日

Octaveで波形を描画する

Octave(http://octave.sourceforge.net/)を使っても波形を描画できる.

というかOctaveの方が向いているらしい.

まずは関数の定義.
function draw(freq,f,sec)                                                          
 nn=1:(freq*sec);                                                            
 tt=nn/freq;                                                                  
 plot(tt,f(1:(freq*sec)));                                                    
endfunction                                                                  
                                                                             
function [f]=cliping(f)                                                      
 for i=1:length(f)                                                            
  if (f(i) > 1.0)                                                            
   f(i)=1.0;                                                                  
  elseif (f(i) < -1.0)                                                        
   f(i)=-1.0;                                                                
  endif                                                                      
 endfor                                                                      
endfunction 
正弦波
fs=44100;                                                                    
n=0:fs;                                                                      
t=n/fs;
f1=440;                                                                      
s=sin(2*pi*f1*t);                                                          
s=cliping(s);                                                              
draw(fs,s,0.01);
三角波
fs=44100;                                                                    
n=0:fs;                                                                      
t=n/fs;
f1=440;
s=t*0;                                                                      
for k=0:10
s+=(-1)^k*(sin((2*k+1)*2*pi*f1*t)/(2*k+1)^2);
endfor
s=8/pi^2*s;
s=cliping(s);
draw(fs,s,0.01);
矩形波
fs=44100;
n=0:fs;
t=n/fs;
f1=440;  
s=t*0;
for k=1:1000
 s+=sin((2*k-1)*pi*f1*t)/(2*k-1);
endfor
s=4/pi*s;
s=cliping(s);
draw(fs,s,0.01);
ノコギリ波
fs=44100;
n=0:fs;
t=n/fs;
f1=440;  
s=t*0;
for k=1:1000
 s+=sin(2*pi*k*f1*t)/k;
endfor
s=2/pi*s;
s=cliping(s);
draw(fs,s,0.01);
さらにoctave-audioをインストールしてあると,下記でサウンド再生も可能.
sound(s,fs);
これは素晴らしい.

各種波形の特徴を是非サウンドで感じてみて.

ちなみにMacOSX環境だと下記のエラーが表示されるかもしれない.

octave:7> sound(f1,fs);
ssh: connect to host air.local port 22: Connection refused
warning: broken pipe -- some output may be lost
sound_play_utility = ofsndplay -

 そんなときはplayerの定義と,


$ vi ~/.octaverc
global sound_play_utility="~/bin/octaveplay";
$ mkdir ~/bin
$ vi ~/bin/octaveplay
#!/bin/sh
cat > ~/.octave_play.au
afplay ~/.octave_play.au
rm -f ~/.octave_play.au  
$ chmod u+x ~/bin/octaveplay
sound.mの96行目あたりにislocal=1;を書き込んでlocal modeを強制して.

 $ sudo vi /opt/local/share/octave/packages/audio-1.1.4/sound.m 
このファイルの

 display=getenv("DISPLAY");
 colon = rindex(display,":");
 if isempty(display) || colon==1
   islocal = 1;
 else
   if colon, display = display(1:colon-1); endif
   host=getenv("HOSTNAME");
   if isempty(host),
     [status, host] = system("uname -n");
     ## trim newline from end of hostname
     if !isempty(host), host = host(1:length(host)-1); endif
   endif
   islocal = strcmp(tolower(host),tolower(display));
 endif
これ以降に
islocal=1;
を追加する.

これでサウンド再生ができるようになる.


2012年11月1日木曜日

Rで波形を描画する




Rを使って色々な波形を描画しようと思う.

まずは基本パラメータを設定する.

サンプリング回数は44.1kHz,
描画する波形の周波数は440Hzとする.
作成する波形は1秒間とする.
freq=44100;
nn=1:freq;
tt=nn/freq;
f1=440;
描画用の関数とクリッピング用の関数を定義する.

draw<-function(s,sec){
freq=44100;
nn=1:(freq*sec);
tt=nn/freq;    
plot(tt,s[1:(freq*sec)],type="l",col="blue");
}
cliping<-function(s){
for(i in 1:length(s)){
           if(s[i] > 1.0 ) s[i]=1.0;
           if(s[i] < -1.0 ) s[i]=-1.0;
}
return(s);
}

これで準備は整った.

まずは正弦波を描画する.
描画する波形は0.01秒分としている.
http://en.wikipedia.org/wiki/Sine_wave
s=sin(2*pi*tt*f1);
s=cliping(s);
draw(s,0.01);
つぎは三角波.
http://en.wikipedia.org/wiki/Triangle_wave
s=tt*0;
for(k in 0:10){
s=(-1)^k*(sin((2*k+1)*2*pi*f1*tt)/(2*k+1)^2)+s;
}
s=8/pi^2*s;
s=cliping(s);
draw(s,0.01);
つぎは矩形波.
http://en.wikipedia.org/wiki/Square_wave
s=tt*0;
for(k in 1:1000){
      s=s+sin((2*k-1)*pi*f1*tt)/(2*k-1);
}
s=4/pi*s;
s=cliping(s);
draw(s,0.01);
最後はノコギリ波.

http://en.wikipedia.org/wiki/Sawtooth_wave

s=tt*0;
for(k in 1:1000){
s=s+sin(2*pi*k*f1*tt)/k;
}
s=2/pi*s;
s=cliping(s);
draw(s,0.01);

こんなことが簡単にできてしまうのだからRは面白い.





波形データは以下で書き出せる.
write(s,"wav.txt",ncolumns=1);
書き出したファイルはtxt2wavでwavファイルに変換できる.

txt2wav.cのコンパイルは
$ gcc -m32 -o txt2wav txt2wav.c 
な感じで(64bit環境の場合ね).

2012年3月29日木曜日

バックアップ&リストア

androidをバックアップする.

$ adb backup -f 20120328.bak -all -apk -shared




 $ ls -all -h 20120328.bak
 -rw-r-----  1 xxxx  staff   462M  3 28 22:50 20120328.bak

一応,バックアップファイルはできた.

あとは,どこまでバックアップできているか・・・

一応,現状はこんな感じ.


端末をリセットする.


リセット後,


これで戻らなかったらどうしよう..もっと早めに実験すればよかったかな.

リストア開始.

$ adb restore 20120328.bak

しばらくパスワードが合わずに焦る..


リストア開始.


むう.

プリインストールものがバックアップ出来ていなかったみたい.


結局,Y!マーケットと内蔵動画を復元できずに,ゴミが残ってしまった.

なんとか消せないものか...

とりあえず今日はここまで.







2012年3月28日水曜日

携帯変更

携帯が壊れてしまった.

結構気に入ってたのでかなりショック.

まだ,割賦残ってたのにさ.

ということで機種変更しました.

Sharpの104SHです.




久々のSharp製.

今のところは特に不具合なく使えている.

というより,さくさく動いて気持ちがいい.


2012年2月18日土曜日

Cytoscapeであそぶ

wikipediaの複雑ネットワークに載っていたランダムネットワークがかっこよくみえたので同じような図をつくってみました.

作り方あってるかな・・・

キャプション通りにCytoscapeのRandomNetworksプラグインを利用する.

プラグインが見当たらない場合は[Manage Plugins]からインストールすること.


RandomNetworksプラグインを起動する.

[Plugins]>[Random Networks]>[Generate Random Network]を選択する.

Barabasi-Albert Modelを選択して[Next].

ノード数に「1000」と入力して,[Generate]ボタンをクリック.


ランダムネットワークが生成された.


適当にレイアウトする.


Network Analysisプラグインを起動して,


ノードサイズを入次数と対応させる.


それっぽくなってきた.(ノード数が多いけど)



あとは色づけして完成.


部分的に拡大するとこんな感じ.



かっこいいだけじゃなくて,ちゃんと勉強しなきゃね.

今日は息抜きということで.


2012年1月26日木曜日

NetCommons2: はじめてのモジュール開発



NetCommons2のモジュールを作成してみる。

参考にしたサイトは http://ncwiki.commonsnet.org/develop/

公式?かどうかは判らないが、検索して引っかかった。

さっそく、「hello world」を表示するモジュールを作ってみる。

まず、NetCommons2のインストールディレクトリに移動する。
 # cd /var/www/html/nc2
ひな形作成用スクリプトは「maple/generate/script」に保存されている。
 # cd maple/generate/script
「nc.sh」を環境に合わせて修正する。
 # vi nc.sh
これを
 if [ -z "$MAPLE_DIR" ]; then
         MAPLE_DIR="D:/xampp/htdocs/maple/maple"
 fi
こうする。
 if [ -z "$MAPLE_DIR" ]; then
         MAPLE_DIR="/var/www/html/nc2/maple"
 fi
スクリプトを実行して、ひな形を作成する。
 # ./nc.sh module hello simple
   [create]  /var/www/html/nc2/webapp/modules/hello/install.ini
   [create]  /var/www/html/nc2/webapp/modules/hello/language/japanese/main.ini
   [create]  /var/www/html/nc2/webapp/modules/hello/files/css/default/style.css
   [create]  /var/www/html/nc2/webapp/modules/hello/files/js/default/hello.js
   [create]  /var/www/html/nc2/webapp/modules/hello/templates/default/hello_view_main_init.html
   [create]  /var/www/html/nc2/webapp/modules/hello/templates/default/hello_script.html
   [create]  /var/www/html/nc2/webapp/modules/hello/view/main/init/Init.class.php
   [create]  /var/www/html/nc2/webapp/modules/hello/view/main/init/maple.ini
   [create]  /var/www/html/nc2/webapp/modules/hello/view/maple.ini
   [create]  /var/www/html/nc2/webapp/modules/hello/language/japanese/modinfo.ini
あとはひな形を編集していくだけ。
 # cd /var/www/html/nc2/webapp/modules/
ファイル権限を変更しておく。
 # chown -R apache:apache hello
モジュール名を設定する。
 # cd hello
 # vi language/japanese/modinfo.ini
 module_name = "hello world module"
モジュールで表示する文字列「Hello World!」を定義する。
# vi language/japanese/main.ini
 [Hello_View_Main_Init]
  hello_value="Hello World!"
テンプレートで文字列が表示する。
 # vi templates/default/hello_view_main_init.html
 <{*テンプレート内容をここに記述*}>
 <{$lang.hello_value}>
 <{include file="hello_script.html"}>
これで取りあえず完成。

コントロールパネルからモジュールをインストールして動作を確認する。



インストール!




















最後にレイアウト画面でモジュールを配置する。






よっしゃ。ちゃんと「Hello World!」と表示された。


今度はデータベースを使うモジュール作りに挑戦したい。


ゆくゆくはちゃんと使えるモジュールを作るぞ!