ユビキタスコンテンツシンポジウム 2010
来週16日(火)に、日吉でシンポジウムがあります。事前予約の受付がはじまりました
本人そっくりのロボットの石黒先生や、Leading Edge Designの山中俊治先生が来ます。参加費無料。
以下リリース文引用
2010年2月16日、「ユビキタスコンテンツ製作支援システムの研究」は、神奈川県横浜市港北区日吉・藤原記念ホールにて、「ユビキタスコンテンツシンポジウム2010」を開催致します。
本プロジェクトは、JSTの戦略的創造研究推進事業CRESTによって支援を受けたプロジェクトで、平成16年度から5年間の研究プロジェクトとして「ユビキタスコンテンツ」という新しいコンテンツジャンルを提案し、基盤技術開発、デザイン理論構築、コンテンツ制作の3軸から研究を実施してまいりました。
ユビキタスコンテンツは、私たちの衣食住遊に新たな経験と感動をもたらすコンテンツです。それらはモノや環境に溶け込み、ヒトや状況によってダイミックに変化します。また、ネットワークと接続されることにより各々のコンテンツのユーザ経験が蓄積され、蓄積されたデータをもとにコンテンツ同士の連動が可能となります。
このようなユビキタスコンテンツを制作するためのプラットフォームとしてわれわれが開発したxtelは、近距離無線通信が可能な小型基板moxa、 MCUボードのためのprogramming・runtime環境Talktic、動画、音声などの連続情報を扱うことが可能なP2Pネットワークライブラリ EntityCollaborator、コンテンツ経験の連動と蓄積を可能にするwebサービスLifeの4つのツールで構成されています。
さらに、本プロジェクトの成果であるユビキタスコンテンツのためのデザイン理論は、デザイン思考とティンカリングと呼ばれるプロセスを通して、効率よく良質なユビキタスコンテンツを創出することを支援します。このデザイン理論は、xtelの開発環境にも生かされており、デザイン思考とティンカリングを実行しやすくなるように、xtelの開発環境が設計・構築されています。
本プロジェクトを締めくくる今回のシンポジウムでは、ロボット研究者の石黒 浩 大阪大学大学院教授、プロダクトデザイナーの山中 俊治 慶應義塾大学環境情報学部教授をゲストスピーカとしてお招きし、トークセッションを行います。また、シンポジウムでは、5年間の活動内容をまとめた書籍「xtel: 生活を豊かにするインタラクションデザイン」をお配りする予定です。
日時・場所:
2010年2月16日(火) 10:30-15:30 (開場 10:00)
慶應義塾大学日吉キャンパス 藤原記念ホール
プログラム:
10:30 – 10:40 代表挨拶
10:40 – 12:10 「親しみのデザイン」
石黒 浩 大阪大学大学院 基礎工学研究科 教授
奥出 直人 慶應義塾大学 メディアデザイン研究科 教授
12:10 – 13:30 休憩
13:30 – 15:00 「美しさのデザイン」
山中 俊治 慶應義塾大学 環境情報学部 教授
稲蔭 正彦 慶應義塾大学 メディアデザイン研究科 教授
15:00 閉会挨拶
事前登録方法:
シンポジウムへのご来場をお考えの方は、
・お名前
・所属
・電話番号
・メールアドレス
を添えて、office [at] dlb.sfc.keio.ac.jpまでメールをお送りください。
なおシンポジウムの詳細は随時 webにてご連絡差し上げます。
http://xtel.sfc.keio.ac.jp/
本件に関するお問い合わせ先
〒223-8526 神奈川県横浜市港北区日吉4-1-1
慶應義塾大学日吉キャンパス 協生館C6S04
CREST ユビキタスコンテンツプロジェクト
Tel. 045-564-2483
Fax. 045-564-2540
E-mail: office [at] dlb.sfc.keio.ac.jp
wavファイルの音量を調整する
音量の小さいwavファイルのボリュームを上げる。上げすぎて音割れしないようにする。
前に作ったWavFile.rbを使ったら簡単にできた
16ビットwavは+-32768、8ビットwavは+-128の範囲の配列で波形が表現されている。
ソースのwavの波形を配列に取り出して、その中で最大の値を取りだし、全体を何倍すれば+-32768の間になるかの倍率を計算して全部かけ算すれば音量を調整できる。
maximizeVolume.rb
#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
# wavの音量を最大に調節する
require File.dirname(__FILE__) + '/WavFile'
if ARGV.size < 2
puts 'ruby maximizeVolume.rb input.wav output.wav'
exit 1
end
in_file = ARGV.shift
out_file = ARGV.shift
format, data = WavFile::read open(in_file)
puts format.to_s
bit = 's*' if format.bitPerSample == 16 # int16_t
bit = 'c*' if format.bitPerSample == 8 # signed char
wavs = data.data.unpack(bit)
puts "このwav中の最大音量: #{wavs.max}"
volume_ratio = 32768/wavs.max.to_f if format.bitPerSample == 16
volume_ratio = 128/wavs.max.to_f if format.bitPerSample == 8
puts "補正倍率: #{volume_ratio}"
wavs_fixed = wavs.map{|w|
(w*volume_ratio).to_i
}
puts "補正されたwav中の最大音量: #{wavs_fixed.max}"
data.data = wavs_fixed.pack(bit)
open(out_file, "w"){|out|
WavFile::write(out, format, [data])
}
使う
ruby maximizeVolume.rb input.wav out.wav
約24倍されてout.wavに保存された
フォーマットID: 1
チャンネル数: 1
サンプリングレート: 44100 (Hz)
byte per sec: 88200
bit per sample: 16
ブロックサイズ: 2
このwav中の最大音量: 1335
補正倍率: 24.5453183520599
補正されたwav中の最大音量: 32768
json_builderを特殊文字のエスケープ、true、false、nullに対応させた
前:橋本商会 » C++でmapやvectorをJSON出力するjson_builder.hを作った
ダブルクオートなどを含む文字列を値に保持するためのエスケープ処理にboost::regexを使ったので、libboost_regex-mt.aをコンパイル時に読み込まないとならなくなった → Makefileの例
まさかboost::regex_replaceで頭にバックスラッシュをつけるのに、バックスラッシュ4つで置換するとは思わなかった
こんな風に使う。true, false, nullを入れられるようになった
test.cpp
#include <iostream>
#include <string>
#include <map>
#include <boost/any.hpp>
#include "../json_builder.h"
int main(int argc, char* argv[]){
std::map<string,boost::any> user;
user["name"] = std::string("shokai");
user["fullname"] = std::string("sho hashimoto");
user["age"] = 25;
user["test"] = 1.23;
user["null"] = json_builder::null;
user["true"] = true;
user["false"] = false;
string json = json_builder::toJson(user);
cout << json << endl;
return 0;
}
実行結果
{"age":"25","false":false,"fullname":"sho hashimoto","name":"shokai","null":null,"test":"1.23","true":true}
C++でnullを表現するために適当な構造体を定義してしまったけど、こういうので良いんだろうか?
json_builder.h
#include <iostream>
#include <string>
#include <map>
#include <vector>
#include <boost/any.hpp>
#include <boost/tuple/tuple.hpp>
#include <boost/format.hpp>
#include <boost/foreach.hpp>
#include <boost/regex.hpp>
using namespace std;
using namespace boost;
#define null json_null()
namespace json_builder{
struct json_null{};
string toJson(any value){
if(value.type() == typeid(vector<any>)){
string result_str;
vector<any> vec = any_cast<vector<any> >(value);
for(int i = 0; i < vec.size(); i++){
result_str += toJson(vec[i]);
if(i < vec.size()-1) result_str += ",";
}
result_str = str(format("[%s]") % result_str);
return result_str;
}
else if(value.type() == typeid(map<string,any>)){
string result_str;
map<string,any> m = any_cast<map<string,any> >(value);
string key;
any value;
int i = 0;
BOOST_FOREACH(tie(key,value), m){
result_str += str(format("\"%s\":%s") % key % toJson(value));
if(++i < m.size()) result_str += ",";
}
result_str = str(format("{%s}") % result_str);
return result_str;
}
else if(value.type() == typeid(json_null)){
return string("null");
}
else if(value.type() == typeid(string)){
return str(format("\"%s\"") %
regex_replace(any_cast<string>(value), regex("[\"\'\\\\/]"), "\\\\$0"));
}
else if(value.type() == typeid(bool)){
if(any_cast<bool>(value)) return string("true");
return string("false");
}
else if(value.type() == typeid(int)){
return str(format("\"%d\"") % any_cast<int>(value));
}
else if(value.type() == typeid(double)){
return str(format("\"%d\"") % any_cast<double>(value));
}
}
}
最近作ったYahooPipes
Pipes: 秋月電子 新製品FullFeed
秋月のRSSが無くなったので、新製品ページから取り出した。
Pipes: ストロベリー・リナックス FullFeed
strawberry-linux.comのnews feedがタイトルのみ配信だったので
どちらも商品イメージとデータシートへのリンクと価格を入れてある。
千石は元気の良いblogで新製品を教えてくれる。spark funと液晶工房もblogがある。スイッチサイエンスもフィード作ろうかと思ったけど新製品ページが半年ぐらい更新されてなかったからやめた。マルツもblogあるけど勉強会情報しかなくて、新製品情報はwebで一覧できない。電子工作系はいまだに新製品情報をネットで効率的に収集する手段が乏しいな。
Pipes: twitter list timeline
twitterのlist機能にrssが無いので。list出た時に作ったんだけど、twitterのHTMLが変わっていつのまにか動かなくなってたのを修理した。
ユーザ名とlist名を入れるとRSSを出す。他人の作ったlistをいろいろ購読してみてる。
pipesってソースのHTMLが変わっていつのまにかエラーになってるんだけど、RSSリーダに登録してるだけだと配信されなくなるだけで、「動かなくなった」事に気づけないんだよなあ
なんとかならないものか。1件も出力できなかったら一番上にエラー文を入れるようにすればいいのか?
C++でmapやvectorをJSON出力するjson_builder.hを作った
C++でJSONというと、json.orgにもライブラリがたくさん紹介されているとおり色々ある。でも単に出力するだけの物で、ヘッダファイル一つで簡単に使えるのが無かったので作ってみた。
ちょっとstringの連結コストがかかる気もするけど、まあいいか。
今のところ、std::map<string,any>とstd::vector<any>とstringとintとdoubleが入る。つまりkeyはstringのみで、値はboost::anyをかぶせている。もちろんmapやvectorは入れ子にできる。
boost::anyは何でも入れられる便利な型。
参考:boost::any – 橋本詳解
必要なのはこれだけだけど、boost::any、tuple、format、foreachが必要。
json_builder.h最新版はbitbucketからどうぞ。
json_builder.h
#include <iostream>見ての通り、”や’や[や{はescapeしていないので、それらを含む文字列をtoJsonするとparseできないjsonができる。とりあえず今は入れる前にescapeしておいてほしい。
#include <string>
#include <map>
#include <vector>
#include <boost/any.hpp>
#include <boost/tuple/tuple.hpp>
#include <boost/format.hpp>
#include <boost/foreach.hpp>
using namespace std;
using namespace boost;
namespace json_builder{
string toJson(any value){
if(value.type() == typeid(vector<any>)){
string result_str;
vector<any> vec = any_cast<vector<any> >(value);
for(int i = 0; i < vec.size(); i++){
result_str += toJson(vec[i]);
if(i < vec.size()-1) result_str += ",";
}
result_str = str(format("[%s]") % result_str);
return result_str;
}
else if(value.type() == typeid(map<string,any>)){
string result_str;
map<string,any> m = any_cast<map<string,any> >(value);
string key;
any value;
int i = 0;
BOOST_FOREACH(tie(key,value), m){
result_str += str(format("\"%s\":%s") % key % toJson(value));
if(++i < m.size()) result_str += ",";
}
result_str = str(format("{%s}") % result_str);
return result_str;
}
else if(value.type() == typeid(string)){
return str(format("\"%s\"") % any_cast<string>(value));
}
else if(value.type() == typeid(int)){
return str(format("\"%d\"") % any_cast<int>(value));
}
else if(value.type() == typeid(double)){
return str(format("\"%d\"") % any_cast<double>(value));
}
}
}
単純にバックスラッシュつければいいだけなのかな? → 対応した
使ってみる。一つのstd::mapをjsonのhashとして標準出力する例
test.cpp
#include <iostream>
#include <string>
#include <map>
#include <boost/any.hpp>
#include "../json_builder.h"
int main(int argc, char* argv[]){
std::map<string,boost::any> user;
user["name"] = std::string(”shokai”); // string
user["fullname"] = std::string(”sho hashimoto”);
user["age"] = 25; // int
user["test"] = 1.23; // double
string json = json_builder::toJson(user);
cout << json << endl;
return 0;
}
出力
{"age":"25","fullname":"sho hashimoto","name":"shokai","test":"1.23"}
より複雑に、mapやvectorを入れ子にした例
test2.cpp
#include <iostream>
#include <string>
#include <map>
#include <vector>
#include <boost/any.hpp>
#include "../json_builder.h"
using namespace json_builder;
using namespace std;
using namespace boost;
int main(int argc, char* argv[]){
map<string,any> obj;
obj["test"] = string("testtest");
map<string,any> user;
user["name"] = string("shokai");
user["fullname"] = string("sho hashimoto");
user["age"] = 25;
user["test"] = 6.78;
obj["user"] = user;
std::vector<any> vec;
vec.push_back(string("aaaa"));
vec.push_back(1234.56);
vec.push_back(string("hello work"));
vector<any> vec2;
vec2.push_back(string("nested std::vector"));
vec2.push_back(string("bbbbb"));
vec.push_back(vec2); // std::vecotrの入れ子
obj["params"] = vec;
string json = json_builder::toJson(obj);
cout << json << endl;
return 0;
}
出力
{"params":["aaaa","1234.56","hello work",["nested std::vector","bbbbb"]],
"test":"testtest","user":{"age":"25","fullname":"sho hashimoto","name":"shokai","test":"6.78"}}
出力したjsonが正しいかどうか、確認するためにrubyのjsonモジュールでrubyのオブジェクトに読み込むコードをtestフォルダに置いておいた。
{"params"=>["aaaa", "1234.56", "hello work", ["nested std::vector", "bbbbb"]],
"user"=>
{"name"=>"shokai", "fullname"=>"sho hashimoto", "test"=>"6.78", "age"=>"25"},
"test"=>"testtest"}
parse success
ちゃんと読み込めた。BOOST_FOREACHが涙が出るほど便利だった!!

最近のコメント