Processingやってみた

このエントリーをはてなブックマークに追加
はてなブックマーク - Processingやってみた
Facebook にシェア
[`google_buzz` not found]
[`yahoo` not found]
[`livedoor` not found]
[`friendfeed` not found]

Processingという言語がある.Javaで作られた実行環境上で動く超簡単な言語らしい.手軽に図を書いたり,音鳴らしたり,WebCamの画像処理したりできるぽい.

こことかこことかが参考になるかも.

Processingを知ったきっかけは,本屋で

を見つけて.膨大なデータ可視化とかが簡単にできるの?と思って色々調べてみた(本は買ってない…).

で,Webで調べながら適当にコード書いてみた.基本的には文法はJavaと同じ.void setup();やvoid draw();の関数を記述すると,一発実行して終了ではなく,処理がループされるようになる.Javaでいうところの,Runnableをimplementして,run()の中でwhileループ回してる状態.そのrun()の冒頭でsetup()が実行され,つづけてwhile文の中で,上記draw()が呼び続けられるイメージ.

イベントハンドラ的なものもあって,マウスイベントやキーイベントなどは,それ用の関数(例えばvoid mousePressed())を定義するだけでOK.

簡単な例を作ったので貼っておく.

int[] x,y,u,v; // 配列の宣言.Javaと同じ
int width, height; // 変数の宣言
int num=100; // 変数の宣言と初期化
int mouseselect;
// 初期化陽関数
// 実行時,一度だけ呼ばれるっぽい
void setup()
{
mouseselect=0;
width=640;
height=480;
size(width,height);
// 配列の初期化.Javaと同じ
x=new int[num];
y=new int[num];
u=new int[num];
v=new int[num];
for(int i=0;i<num;i++){ // forループ.()内でループ用の変数を宣言できる
x[i]=0;
y[i]=0;
u[i]=5;
v[i]=5;
}
}
// 自前の関数
void drawInit(){
background(0);
text("クリックするとマウスの位置へボールが移動",300,200);
}
// 自前の関数.戻り値,引数とも自由にできそう
void drawPoints(int i){
if(x[i]<0 || x[i]>=width)u[i]*=-1;
if(y[i]<0 || y[i]>=height)v[i]*=-1;
x[i]+=u[i];
y[i]+=v[i];
ellipse(x[i],y[i],30,30);
}
// 画面描画用の関数
// 常に繰り返し呼ばれる?
void draw()
{
drawInit();
for(int i=0;i<num;i++) drawPoints(i);
}
// マウスイベント(mousePressed)の関数
// マウスPress後に呼ばれる
void mousePressed()
{
mouseselect+=1;
if(mouseselect>=num) mouseselect=0;
x[mouseselect]=mouseX;
y[mouseselect]=mouseY;
}

ミニチュア作ってみた

このエントリーをはてなブックマークに追加
はてなブックマーク - ミニチュア作ってみた
Facebook にシェア
[`google_buzz` not found]
[`yahoo` not found]
[`livedoor` not found]
[`friendfeed` not found]

鴨川のミニチュア.出町柳駅付近をイメージ.

f:id:yasutomo57jp:20100403165816j:image

これはミニチュアではなく,実際の風景写真(自分で撮影)をTilt Shift Makerで加工した画像です.Tilt Shift Makerを使うと,本物の写真がミニチュアみたいになります.

ループを使わずに配列の順序を逆にしてみた

このエントリーをはてなブックマークに追加
はてなブックマーク - ループを使わずに配列の順序を逆にしてみた
Facebook にシェア
[`google_buzz` not found]
[`yahoo` not found]
[`livedoor` not found]
[`friendfeed` not found]

ループを使わずに配列の順序を逆にする。という問題があったのでやってみた.

答えは再起呼び出し.

#include <iostream>
#include <algorithm>
void disp(int val){
std::cout << val << std::endl;
}
template <class T>
void swap(T *a, T *b){
T temp=*a; *a=*b; *b=temp;
}
template <class T>
void reverse(T *a, T *b){
b--;
if(a>=b)return;
swap(a,b);
a++;
reverse(a,b);
}
int main(){
int array[10]={1,2,3,4,5,6,7,8,9,10};
std::for_each(array,array+10,disp);
reverse(array,array+10);
std::for_each(array,array+10,disp);
return 0;
}

for_each使ってみたかっただけなんです><.reverse部分ではループ使ってない.

dispをテンプレートにしたときに,呼出側でdisp<int>みたいにしないといけないらしいので,今回はテンプレート化していない.

このプログラム,配列ならOKだけど,reverse_iteratorにも対応したいな~.でもめんどいのでこの辺でやめとく.

見て便利・撮られても安心な「変身カメラ」

このエントリーをはてなブックマークに追加
はてなブックマーク - 見て便利・撮られても安心な「変身カメラ」
Facebook にシェア
[`google_buzz` not found]
[`yahoo` not found]
[`livedoor` not found]
[`friendfeed` not found]

以前開催したイベント:「体感しよう!あいあいネット」で,大々的に紹介した「変身カメラ」のコンセプトムービーを作っているのですが,とりあえずYoutubeにアップロードしてみました.


D

まだ音無し,カクカク,「※実際の結果とは多少異なります」付きですが….ちなみに映像に映っている人は私です.

このような防犯カメラの映像をインターネットに流す場合,プライバシの侵害が大きな問題となるのですが,この「変身カメラ」ような映像ならば,インターネットに公開してもプライバシ問題を気にする必要はありません.

ちなみに私の研究は,この「変身カメラ」のための「背景画像生成」です.

Windowsで特定のユーザだけCapsとCtrlを入れ替える

このエントリーをはてなブックマークに追加
はてなブックマーク - Windowsで特定のユーザだけCapsとCtrlを入れ替える
Facebook にシェア
[`google_buzz` not found]
[`yahoo` not found]
[`livedoor` not found]
[`friendfeed` not found]

日本語106キーボードで,Ctrlキーを押しやすい位置にあるCaps Lockキーと入れ替える設定はyohgaki’s wikiなどで紹介されているが,これをやってしまうと,ユーザ全員,キーマップが変わってしまう.

これだと家族や,職場の同僚とパソコンを共有してる場合に不都合が生じる.で,いろいろ調べたらユーザごとに変更できる設定を見つけた.

HKEY_CURRENT_USER\Keyboard Layout\Scancode Map というレジストリの値をいじれば良いらしい.

そこで,作ってみました.ダウンロードはこちら.キーマップを変更したいユーザでダウンロード後,そのファイルをダブルクリックしてレジストリに登録し,いったんログオフした後,ログインしなおしててください.

利用は自己責任でお願いします.

追記

もしかして別の人がログインしたら設定が上書きされる?

ライフゲーム

このエントリーをはてなブックマークに追加
はてなブックマーク - ライフゲーム
Facebook にシェア
[`google_buzz` not found]
[`yahoo` not found]
[`livedoor` not found]
[`friendfeed` not found]

Rubyでライフゲームを作ってみた.

起動後,10x10みたいな感じでフィールドの大きさを入力.

あとはEnterを押すと世代が一つずつ進んでいく.

また,座標の指定をすれば,その座標の生死を切り替えられる.

以下にソースコードを示す.

lifegame.rb

#!/usr/bin/env ruby
require "lifegamefield.rb"
require "lifegameview.rb"
print "[幅x高さ]を入力してください: "
widthheight=gets.split(/x/)
width=widthheight[0].to_i
height=widthheight[1].to_i
lgf = LifeGame::Field.new(width,height)
view = LifeGame::ConsoleView.new(lgf)
g=0
loop do
print "=== generation #{g+1} ===\n"
view.visualize
cmd=""
loop do
print "状態を変更する場合はその座標をカンマ区切りで入力[x,y]:"
break if (cmd=gets) == "\n"
# 座標指定があれば
if cmd =~ /(\d+),(\d+)/
x=$1.to_i
y=$2.to_i
if lgf.isalive?(x,y)
lgf.kill(x,y)
else
lgf.create(x,y)
end
end
view.visualize
end
break if cmd=="exit"
lgf.update
g+=1
end

lifegamefield.rb

module LifeGame
class Field
attr_reader :width,:height
def initialize(width,height)
@width=width
@height=height
init
end
def init
@field=[]
@height.times do |h|
line=[]
@width.times do |w|
line.push(false)
end
@field.push(line)
end
end
def isalive?(x,y)
return false if x >= @width
return false if y >= @height
return @field[y][x]
end
def create(x,y)
return false if x >= @width
return false if y >= @height
@field[y][x]=true
end
def kill(x,y)
return false if x >= @width
return false if y >= @height
@field[y][x]=false
end
def update
# life game のメインルーチン
newfield=@field.map{|x| x.clone}
@height.times do |h|
@width.times do |w|
count=getlivecount(h,w)
if @field[h][w]
# 8近傍のうち生きているのが2つか3つでないなら死ぬ
newfield[h][w]=false if count != 2 and count != 3
else
# 8近傍のうち生きているのが3つだったら生きる
newfield[h][w]=true if count == 3
end
end
end
@field=newfield
end
def getlivecount(h,w)
count=0
(-1..1).each do |dy|
(-1..1).each do |dx|
next if dy==0 and dx==0
count += 1 if @field[h-dy] != nil and @field[h-dy][w-dx]
end
end
return count
end
end
end

lifegameview.rb

module LifeGame
class ConsoleView
def initialize(field)
@field=field
end
def visualize
@field.height.times do |h|
@field.width.times do |w|
state=@field.isalive?(w,h)
print "" if state
print "" unless state
end
print "\n"
end
end
end
end

ついでにWebアプリにもしてみたいけど,めんどくさいので今日はここまで.

体感しよう!あいあいネット

このエントリーをはてなブックマークに追加
はてなブックマーク - 体感しよう!あいあいネット
Facebook にシェア
[`google_buzz` not found]
[`yahoo` not found]
[`livedoor` not found]
[`friendfeed` not found]

僕がからんでいる(というかかなりメインで実装したり研究したりしてる)プロジェクト,センシングWebのイベント「体感しよう!あいあいネット」が7月31日に行われます.

今は祇園祭真っ盛りでめちゃくちゃ込み合ってる新風館でイベントが行われます.

これは,今まで数回メディアで取り上げられた

に関する催しです.

平日ですが,付近の方々はぜひお越しください.

詳細はこちら

DJの谷口キヨコさんも来ます!

以下,業界の方々に周知されている案内

センシングWebプロジェクト(代表者:京都大学学術情報メディアセンター 美濃

教授)では,下記の通り,研究公開イベントを行います.

「体感しよう!あいあいネット」

7月31日(金) @新風館(京都市 中京区)

第1部 12:00-13:00 オープニングトーク

第2部 13:00-17:00 デモ展示(随時見学可)

カメラ等から得られるセンサ情報をプライバシを保護しながらネットワークへ公

開し利用する技術について,DJの谷口キヨコさんをナビゲータとしたトークイベ

ントと,デモ展示により紹介します.

入場は無料で,どなたでもご参加いただけます.

お時間がございましたら,是非,お立ちよりの上,研究成果をご覧下さい.

i18nizer.cpp

このエントリーをはてなブックマークに追加
はてなブックマーク - i18nizer.cpp
Facebook にシェア
[`google_buzz` not found]
[`yahoo` not found]
[`livedoor` not found]
[`friendfeed` not found]

C++でもi18nizer作ってみた.

文字列の区切りに正規表現を使えなかったので,ちょっと仕様が変わりました.

#include <string>
#include <iostream>
#include <sstream>
std::string i18nizer(const std::string& str){
std::ostringstream oss;
bool isPeriod=false;
int length=str.length();
if(str[length-1]=='.'){
isPeriod=true;
length--;
}
if(length < 3) return str;
oss << str[0] << str.substr(1,length-2).length() << str[length-1];
if(isPeriod) oss << ".";
return oss.str();
}
int main(int argc,char *argv[]){
std::string line,token;
while(std::getline(std::cin,line)){
std::istringstream iss(line);
while(!iss.eof()){
iss >> token;
std::cout << i18nizer(token) << " ";
}
std::cout << std::endl;
}
return 0;
}

Pythonでi18nizer

このエントリーをはてなブックマークに追加
はてなブックマーク - Pythonでi18nizer
Facebook にシェア
[`google_buzz` not found]
[`yahoo` not found]
[`livedoor` not found]
[`friendfeed` not found]

Python勉強中なので,Pythonでi18nizer.pyを作ってみた.

コードは以下.

#!/usr/bin/env python3
import sys
import re
def i18nize(token):
length=len(token)
if(length > 2):
val=str(len(token[1:length-1]))
return token[0:1]+val+token[length-1:length]
else:
return token
r = re.compile(r"[A-Za-z0-9]+|\.|,")
while 1:
line=sys.stdin.readline().strip()
if not line:
break
list=r.findall(line)
for token in list:
print(i18nize(token),end=" ")
print()

Python3版です.慣れない言語だとスマートに書けない..

i18nizer

このエントリーをはてなブックマークに追加
はてなブックマーク - i18nizer
Facebook にシェア
[`google_buzz` not found]
[`yahoo` not found]
[`livedoor` not found]
[`friendfeed` not found]

どんな文字列もi18n な表記に変えてしまうスクリプトをRubyで書いてみた.

#!/usr/bin/env ruby
# i18nのような表記に変換するブロック
i18nize=lambda do | token |
if token.length > 2
num=token[1..token.length-2].length
token[0,1] + num.to_s + token[token.length-1,1]
else
token
end
end
# メイン部分
print $_.scan(/[A-Za-z0-9]+|\.|,/).map(&i18nize).join(" ")+"\n" while gets

これをi18nizer.rbとして,サンプル文字列(test.txt)

This is a sample.
Kore ha Test desu.

という文字列を入力として実行してみる.実行方法は次の通り.

% ./i18nizer < test.txt

すると,

T2s is a s4e .
K2e ha t2t d2u .

という結果が出力される.