2010年2月11日木曜日

Google 雑感 Buzz

 「イノベーションの神話」によると、イノベーションの条件の1つに、「移行コストが低い事」というのがある。GMail から Buzz への移行コストは、そこそこ低いと言える。そういう意味では、Buzz は、そこそこ使われるようになるかもしれない。問題は、Twitter 的要素に GMailは最適か?である。GMail 以外に専用の入り口を用意すべきであろう。
 Google Wave についても言及しておくと、Git によるリアルタイム性の強いリポジトリ・ドキュメント・システムじゃねぇの?というのが、今のところ、私が持っている印象である。いや、Wave なんてビデオの紹介でしか見たこと無いんだけどね…。
 私は、Twitter さえ使うのを拒否しているので、Buzz を使わないだろう。ちょっと覗いてみたが、あれを公開しろ、公開しろ、おまえのデータを公開しろ、と、もう、やりたくない汁が充満してしまった。何を公開して、何を公開しないかは、俺がコントロールする。ちなみに、Facebook も MySpace も Mixi もやらないし、やる予定もない。

2010年2月10日水曜日

天安門事件セール

 ふと、TechCranch の記事を見ていて閃いた。いくら中国でも、全部を人手を介して人力ファイヤーウォール登録するのは、無理だ。そして、この時代に、情報を抑えこもうとするアホさ加減…。中国の人権問題は、日本のワーキングプア問題とリンクしているのだ。見過ごしには、できない。
 そこで、みんなで「天安門事件」って、文字を書いてしまえば、いいんじゃね?

  「天安門事件」って書いちゃえば、面白くね???

 どこにもアクセスのしようが無い・・・と、そんなくだらない事を思いつき、実行に移してみました。

2010年2月7日日曜日

mimetic が密かに気になる

 今、密かに気になっているライブラリがあります。
mimeticという、MIMEのライブラリです。C++で、この辺の事を処理しようと思ったら、相当しんどいです。有償のライブラリは探せばあるんでしょうけど…。VC で使おうと思ったら、きじねこさんの stdint.h が必要です。

copy config_win32.h config.h

とした上で、HAVE_STDINT_H を定義しないとコンパイル通りません。

サンプルには、

#include <stdint.h>

の1行を加えてやる必要があります。

2010年2月3日水曜日

strict week ordering?

 久々に代数学の教科書を引っ張り出してきた…。

順序集合(半順序)の条件は

a) 反射律 x <= x
b) 非対称律 x <= y && y <= x -> y == x
c) 推移律 x <= y && y <= z -> x <= z

であり、これに

d) (x <= y || y <= x) が真

という条件が加われば全順序集合という事になる。

Strict week ordering 聞いた事が無かったが、これによると


a) 反射律の対偶?と呼ぶべきか、非反射律と呼ぶべきか? !(x < x)
b) 非対称律の対偶(なんて表現すれば…)? x != y -> (x < y || y < x) && !(x < y && y < x)
c) 推移律(変形) x < y && y < z -> x < z
d) !( x < y || y < x ) && !( y < z || z < y ) -> !( x < z || z < x )

全順序集合から == を取り除いたものという感覚が一番しっくりするかも…。

比較可能であれば、必ず x < y || y < x が成立し、比較不可能であれば !( x < x ) より常に false となる。

で、確かに、なんて訳せばいいのかは、わかんねーです。

追伸:Blogger のエディタが文中の < & > を正しく扱えなくて、何度も書き直した。イライラが続くときは、こんなもんか…。
追記 2010/02/04:Strict weak ordering (b) の条件を強化
weak の意味は、不等号 < という意味に近いのかな?と思った。そうすると、完全比較順序集合という訳が妥当かもしれない。

ぬがー

タスク多すぎて、キレそう…

boost::asio で serial通信 (PATLITE)

仕事で、パトライトを制御する事になった。せっかくなので、boost::asio を使ってみた。


#include <boost/asio.hpp>
#include <iostream>
#include <iomanip>

#define PATLITE_COMMAND_

#define PATLITE_CMD_BIT 0x30
#define PATLITE_RED_ON 0x01
#define PATLITE_YELLOW_ON 0x02
#define PATLITE_GREEN_ON 0x04
#define PATLITE_BUZZ_SHORT 0x08
//
#define PATLITE_BUZZ_LONG 0x01
#define PATLITE_RED_BLINK 0x02
#define PATLITE_YELLOW_BLINK 0x04
#define PATLITE_GREEN_BLINK 0x08

void write_hex( const char* p, size_t len ) {
for( size_t i = 0; i < len; ++i ) {
std::cout << ":" << std::hex << std::setw(2) << (int)p[i];
}
}

int main() {
char start_rbuf[ 7 ] = { 0x40, 0x3f, 0x3f, 0x31, PATLITE_CMD_BIT | PATLITE_RED_BLINK | PATLITE_BUZZ_LONG, PATLITE_CMD_BIT, 0x21 };
char start_ybuf[ 7 ] = { 0x40, 0x3f, 0x3f, 0x31, PATLITE_CMD_BIT | PATLITE_YELLOW_BLINK, PATLITE_CMD_BIT | PATLITE_BUZZ_SHORT, 0x21 };
char start_gbuf[ 7 ] = { 0x40, 0x3f, 0x3f, 0x31, PATLITE_CMD_BIT | PATLITE_GREEN_BLINK | PATLITE_BUZZ_LONG, PATLITE_CMD_BIT, 0x21 };
char stop_buf[ 7 ] = { 0x40, 0x3f, 0x3f, 0x30, 0x3f, 0x3f, 0x21 };
char buf[ 8 ];

try {
boost::asio::io_service service;
boost::asio::serial_port port( service );
std::cout << "open COM1" << std::endl;
port.open( "COM1" );
std::cout << "set up baud_rate 9600" << std::endl;
port.set_option( boost::asio::serial_port_base::baud_rate( 9600 ) );
port.set_option( boost::asio::serial_port_base::character_size( 8 ) );
port.set_option( boost::asio::serial_port_base::stop_bits() );
port.set_option( boost::asio::serial_port_base::parity() );
port.set_option( boost::asio::serial_port_base::flow_control() );
std::cout << "write 1"; write_hex( start_rbuf, 7 ); std::cout << std::endl;
port.write_some( boost::asio::buffer( start_rbuf, 7 ) );
std::cout << "read 1" << std::endl;
port.read_some( boost::asio::buffer( buf, 1 ) );
std::cout << "result: " << std::hex << (int)buf[0] << std::endl;
Sleep( 2000 );
std::cout << "write 2"; write_hex( start_ybuf, 7 ); std::cout << std::endl;
port.write_some( boost::asio::buffer( start_ybuf, 7 ) );
std::cout << "read 2" << std::endl;
port.read_some( boost::asio::buffer( buf, 1 ) );
std::cout << "result: " << std::hex << (int)buf[0] << std::endl;
Sleep( 2000 );
std::cout << "write 3"; write_hex( start_gbuf, 7 ); std::cout << std::endl;
port.write_some( boost::asio::buffer( start_gbuf, 7 ) );
std::cout << "read 3" << std::endl;
port.read_some( boost::asio::buffer( buf, 1 ) );
std::cout << "result: " << std::hex << (int)buf[0] << std::endl;
Sleep( 2000 );
std::cout << "write 4"; write_hex( stop_buf, 7 ); std::cout << std::endl;
port.write_some( boost::asio::buffer( stop_buf, 7 ) );
std::cout << "read 4" << std::endl;
port.read_some( boost::asio::buffer( buf, 1 ) );
std::cout << "result: " << std::hex << (int)buf[0] << std::endl;
std::cout << "end" << std::endl;
} catch( std::exception& e ) {
std::cout << e.what() << std::endl;
}
return 0;
}



シリアル通信のオプションは、キッチリ指定しないといけないようです。デフォルトであろうと指定しないと動作しなかった。

mongrel_cluster prefix AbstractRequest (NameError) 備忘録

 また、検索しそうなので備忘録として記録する。

mongrel_cluster + mod_proxy_balancer の組み合わせで、prefix を指定すると、エラーが出るようになった。原因は、Rails の内部仕様が変更された事による。

/usr/lib64/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/rails.rb
に修正を施す。

ActionController::AbstractRequest.relative_url_root = ops[:prefix] if ops[:prefix]

という部分を

if ops[:prefix]
if ActionController::Base.respond_to?('relative_url_root=')
ActionController::Base.relative_url_root = ops[:prefix]
# new way to set the relative URL in Rails 2.1.1
else
ActionController::AbstractRequest.relative_url_root = ops[:prefix]
end
end

 とする。

参考URL
LANKHMAR
mongrel rubyforge