コンピュータやソフトウェアのあれこれ@道民(&元道民)
Archive for 6月, 2010
よくやった日本代表!
6月 30th
昨晩の日本対パラグアイ戦、みなさん応援お疲れ様でした

本当に素晴らしい試合でしたね。
0-0の接戦で堅実に守って早いカウンター攻撃で相手ゴールを
脅かす、スタイル的には似ている両チーム。
両者とも自陣にボールが入った時のディフェンスの詰めが早く
ゴールエリア付近でもしっかりマークに付きフリーにさせない
レベルの高いサッカーに終始見入ってしまいました。
チーム力的にはパラグアイが若干上のような気がしましたが
日本の素晴らしい組織力で十分勝てる展開でした。
お互いゴールを許さず試合は延長からPKへ。
パラグアイはしっかりと落ち着いてゴールを決め
日本は1本外してしまい惜しくも負けてしまいました。
僕はテレビの前からしばらく動く事が出来ませんでした。
それは負けたショックではなく戦い切った日本代表から
目が離せなかったのです。
PKを外してしまった駒野を慰めるチームメイト達。
僕も気がつけば涙が止まりませんでした。
本当に惜しい試合でした。PKは運といっても過言でもないと
思いますし、運を勝ち取ったパラグアイが少し強かったのでしょう。
しかしこれ程、期待感があったW杯は初めてですし、下馬評を覆し
あれ程までの試合運びをした岡田Japanはすごい!!
岡田Japan、お疲れ様でした!!
オープンソースカンファレンス 2010 Hokkaidoが開催されました
6月 28th
ご参加頂いた皆さん、ありがとうございました!イベントとして至らない点もあったかとは思いますが、楽しんで頂いていれば幸いです。来年度以降の参考にさせて頂きますのでぜひ感想等BlogやTwitterに書いて頂けますようお願い申し上げます。
講師の皆さん、展示出展者の皆さん、スタッフの皆さん、お疲れ様でした!無事終了して何よりでしたね!
僕がお話させて頂いた【企画セミナー】次の一歩・OS編で使ったスライドをアップしました。15分という短い時間に詰め込みすぎて、やたら早口になってしまい、反省しています。もっと量減らせば良かったな。次お話する時にはもっとゆっくり喋れるように頑張ります。
さて、あの会場にいらっしゃった皆さん。立場はいろいろあれど、楽しかったですか?僕は楽しかったです、すごく!皆さんも楽しんで頂けていれば、一スタッフとして何より嬉しいです。また来年お会いしましょう!
[OSC]OSCに行ってきた! #osc10do
6月 27th
みなさん、いきなりですが「OSC(オープンソースカンファレンス)」ってご存知ですか?
僕もほんの数年前に知ったのですが、このイベントは、
・オープンソースに関する最新情報の提供
・展示 - オープンソースコミュニティ、企業・団体による展示
・セミナー - オープンソースの最新情報を提供
こういうことをやるイベントで、北海道IT界のお祭りみたいなもんです。
これが先日、札幌は札幌市産業振興センターで開催されまして、僭越ながら私、初参加してきました。
僕は仕事柄というか、単に勉強していないだけというか、あまりテクニカル方面の知識はありません。ただ、今回のイベントは同じ職場の、@smokeymonkeyさんが講師をするということで興味をもち、半分からかうつもりで参加を決めました。
そして当日、会場入りしてみると本気モードの盛り上がり。からかうのなんてけしからん!びしっと聞いてやろうと決意し、まずはLOCAL 小岩さんによる「猫でもわかるLOCAL」を受講。
LOCALという団体は・・・説明するのめんどいから、リンク先参照せぃ!(http://www.local.or.jp/)
・
・
・
・
・
そういう団体です。
それをもっと、出来た経緯とか、目的とか、入団方法とか、いろいろお話を聞きました。
実は先ほど、ML会員になりました(笑
そんで、本題のすもけ氏セッション。
いやー立派、まじめ、ひげなのにまじめ。
ただ、時間が短くてかなり駆け足の、早口だったのでちょっと残念。もっとちゃんと聞きたかった。
そんであーだこーだあったんだけど、結局なにが言いたいかというと、「次の一歩」を僕も踏み出せたかなと。
今回のOSCでLOCALが掲げた裏テーマが「次の一歩」
ここまで出来た・・・じゃあどうする?
あれやってみたい・・・じゃあどうする?
その「じゃあどうする?」の答えではなく、答えの探し方を訴えかける。
「じゃあどうする?」に答えなんてなくて、WEBサイト作りたいという目標ひとつでも、様々な方法がある。
その様々な方法にはこんなものがあるよ!でも、これだけが答えじゃないよ!次の一歩を踏み出す手伝いをするけど、踏み出す方向を決めるのはあなただよ!
そんなメッセージ性のあるイベントだったかと思います。
このブログをみて、OSCというイベントを知ったという人。知っていたけど、行かなかったという人。
次の一歩踏み出してみませんか?
Arduinoでドレミファソラシド(3)
6月 26th
といっても、前回のバージョンは公開していませんが。
※注意事項
2kΩの抵抗を挿んで試してね!
Digital 11 と Digital 3 にスピーカーを接続すると音がでます。
以下、添付ファイルと解説添付ファイル(ダウンロード)
20100626-Sine8mk2.zip
今回は、見た目をすっきりさせて、
和音が鳴るシーケンス形式も実装しました。
が、まだまだ安定していないし、1オクターブ分しか鳴らせないので、
いろいろ考え中です。
特に、*.pdeファイルについては、まだ試行錯誤しています。
今年の目標は、これで達成ということで。
Radiant0.8.2とrack1.1.0によるエラー
6月 22nd
回避法
(rvmの場合)
~/.rvm/gems/ruby-1.8.7-p249/gems/radiant-0.8.2/vendor/rails/actionpack/lib/action_controller.rb
の中の
gem 'rack', '~> 1.0.0'
を
gem 'rack', '~> 1.1.0'
Arduinoでドレミファソラシド(2)
6月 21st
一応、ソースを上げときます。
※注意事項
2kΩの抵抗を挿んで試してね!
Digital 11 と Digital 3 にスピーカーを接続すると音がでます。
以下、ソースコード。
#include "avr/io.h"
#define POLY_MAX 8
struct OSC {
byte note;
byte gate;
const char *pWave;
unsigned long index;
};
struct {
byte bpm;
unsigned long offset;
unsigned long index;
} bpm_info;
const char sinwav[] = {
-7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 7,
7, 6, 5, 4, 3, 2, 1, 0, -1, -2, -3, -4, -5, -6, -7, -7
// 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
//-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7,-7
};
// [0] = 0, [1] = A(220Hz) -> [12] = A(440Hz)
unsigned long noteOffset[14];
const byte seq[][2] = {
{ 1,16},
{ 3, 2},
{ 5,16},
{ 6, 2},
{ 8,16},
{10, 2},
{12, 2},
{13, 2}
};
byte seqIdx = 0;
byte beatIdx = 0;
OSC osc[POLY_MAX];
namespace {
inline char oscInc(OSC *pOsc)
{
const unsigned long inc = noteOffset[ pOsc->note ];
pOsc->index += inc;
//return ((pOsc->index >> 24) & 0x1F) < 16 ? -16 : 16;
return pOsc->pWave[ ((pOsc->index >> 24) & 0x1F) ] * 2;
}
};
ISR ( TIMER0_COMPA_vect ) {
volatile byte i;
volatile short outVol;
// if ( move 1/8 -> beat++ )
bpm_info.index += bpm_info.offset;
if ( bpm_info.index & (unsigned long)0x00200000 ) {
if ( (beatIdx & 0x01) == (byte)0 ) {
// assign note
for (i=0; i<POLY_MAX; i++) {
if ( osc[i].note == (byte)0 ) {
osc[i].note = seq[seqIdx][0];
osc[i].gate = seq[seqIdx][1];
break;
}
}
seqIdx = ( (seqIdx + 1) & 0x07 );
}
for (i=0; i<POLY_MAX; i++) {
if ( (byte)0 < osc[i].gate ) {
osc[i].gate--;
if ( osc[i].gate == (byte)0 ) {
osc[i].note = 0;
}
}
}
bpm_info.index -= (unsigned long)0x00200000;
beatIdx = ( (beatIdx + 1) & 0x0F );
}
// LED toggle
if ( (beatIdx & 0x01) == (byte)0 ) {
digitalWrite( 13, HIGH );
}
// Mix osc output
outVol = 0;
for (i=0; i<POLY_MAX; i++) {
if ( osc[i].note != (byte)0 ) {
outVol += (short)( oscInc( &(osc[i]) ) );
}
}
// PWM Output
if ( (short)0 < outVol ) {
OCR2A = (byte)( outVol);
OCR2B = (byte)0;
}
else if ( outVol < (short)0 ) {
OCR2A = (byte)0;
OCR2B = (byte)(-outVol);
}
else {
OCR2A = (byte)0;
OCR2B = (byte)0;
}
}
void setup() {
TCCR0A = 0b00000010; // CTC
TCCR0B = 0b00000010; // 1/8
OCR0A = 125;
TIMSK0 = 0b00000010;
// PWM Setting
TCCR2A = 0b10100011; // Fast PWM
TCCR2B = 0b00000001; // 1/1
OCR2A = 0;
pinMode(11, OUTPUT); // Speker out +
pinMode(3, OUTPUT); // Speker out -(GND)
pinMode(13, OUTPUT);
digitalWrite( 13, LOW );
{ // Init osc
byte i;
for (i=0; i<POLY_MAX; i++) {
osc[i].note = 0;
osc[i].index = 0;
osc[i].pWave = sinwav;
}
}
{ // Hz -> offset
byte i;
// 1Hz : 1 * 0x01000000 / ( 125 * 8 * (1/16M) )
// 1/16000 = 1/16M * 1000(= 125 *8)
// wave size : 32
noteOffset[ 0] = 0;
noteOffset[ 1] = ( (unsigned long)( 220 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[ 2] = ( (unsigned long)( 233 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[ 3] = ( (unsigned long)( 247 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[ 4] = ( (unsigned long)( 261 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[ 5] = ( (unsigned long)( 277 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[ 6] = ( (unsigned long)( 293 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[ 7] = ( (unsigned long)( 311 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[ 8] = ( (unsigned long)( 329 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[ 9] = ( (unsigned long)( 349 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[10] = ( (unsigned long)( 370 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[11] = ( (unsigned long)( 392 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[12] = ( (unsigned long)( 415 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[13] = ( (unsigned long)( 440 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
}
{ // BPM Setting
bpm_info.bpm = 60;
// 1Hz : 1 * 0x01000000 / ( 125 * 8 * (1/16M) )
// 1/16000 = 1/16M * 1000(= 125 *8)
// BPS = BPM / 60
bpm_info.offset = ( (unsigned long)( bpm_info.bpm * (0x01000000 >> 6)) / (60 * (16000 >> 6)) );
bpm_info.index = 0x00400000; // dummy offset
}
TCNT0 = 0;
sei();
}
void loop() {
while (1) {
digitalWrite( 13, LOW );
}
}
Arduinoでドレミファソラシド(1)
6月 20th
あとは、波形と精度の問題かな。
その先は、来年の課題ということで。
※注意事項
2kΩの抵抗を挿んで試してね!
音が小さいときは、byte oscInc(OSC *pOsc)の戻り値に8を掛けてください。
Digital 11 と GND にスピーカーを接続すると音がでます。
以下、ソースコード。
#include "avr/io.h"
#define POLY_MAX 8
struct OSC {
byte note;
const byte *pWave;
unsigned long index;
};
struct {
byte bpm;
unsigned long offset;
unsigned long index;
} bpm_info;
const byte sinwav[] = {
1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 14,
14, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 1
};
// [0] = 0, [1] = A(220Hz) -> [12] = A(440Hz)
unsigned long noteOffset[14];
const byte seq[] = {
1, 3, 5, 6, 8, 10, 12, 13,
13, 12, 10, 8, 6, 5, 3, 1 };
byte seqIdx = 0;
OSC osc[POLY_MAX];
namespace {
inline byte oscInc(OSC *pOsc)
{
const unsigned long inc = noteOffset[ pOsc->note ];
pOsc->index += inc;
//return ((pOsc->index >> 24) & 0x1F) < 16 ? (byte)0 : (byte)255;
return pOsc->pWave[ ((pOsc->index >> 24) & 0x1F) ];
}
};
ISR ( TIMER0_COMPA_vect ) {
volatile byte i;
volatile byte outVol;
// if ( move 1/4 -> next seq )
bpm_info.index += bpm_info.offset;
if ( bpm_info.index & (unsigned long)0x00400000 ) {
#if 0
// assign note
for (i=0; i<POLY_MAX; i++) {
if ( osc[i].note == (byte)0 ) {
osc[i].note = seq[seqIdx];
break;
}
}
#else
osc[0].note = seq[seqIdx];
#endif
bpm_info.index -= (unsigned long)0x00400000;
seqIdx = ( (seqIdx + 1) & 0x0F );
}
// LED toggle
if ( (bpm_info.index & (unsigned long)0x00200000) == 0 ) {
digitalWrite( 13, HIGH );
}
// Mix osc output
outVol = 0;
for (i=0; i<POLY_MAX; i++) {
if ( osc[i].note != (byte)0 ) {
outVol += oscInc( &(osc[i]) );
}
}
// PWM Output
OCR2A = outVol;
}
void setup() {
TCCR0A = 0b00000010; // CTC
TCCR0B = 0b00000010; // 1/8
OCR0A = 125;
TIMSK0 = 0b00000010;
// PWM Setting
TCCR2A = 0b10100011; // Fast PWM
TCCR2B = 0b00000001; // 1/1
OCR2A = 0;
pinMode(11, OUTPUT);
pinMode(13, OUTPUT);
digitalWrite( 13, LOW );
{ // Init osc
byte i;
for (i=0; i<POLY_MAX; i++) {
osc[i].note = 0;
osc[i].index = 0;
osc[i].pWave = sinwav;
}
}
{ // Hz -> offset
byte i;
// 1Hz : 1 * 0x01000000 / ( 125 * 8 * (1/16M) )
// 1/16000 = 1/16M * 1000(= 125 *8)
// wave size : 32
noteOffset[ 0] = 0;
noteOffset[ 1] = ( (unsigned long)( 220 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[ 2] = ( (unsigned long)( 233 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[ 3] = ( (unsigned long)( 247 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[ 4] = ( (unsigned long)( 261 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[ 5] = ( (unsigned long)( 277 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[ 6] = ( (unsigned long)( 293 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[ 7] = ( (unsigned long)( 311 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[ 8] = ( (unsigned long)( 329 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[ 9] = ( (unsigned long)( 349 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[10] = ( (unsigned long)( 370 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[11] = ( (unsigned long)( 392 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[12] = ( (unsigned long)( 415 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
noteOffset[13] = ( (unsigned long)( 440 * 32 * (0x01000000 >> 7)) / (16000 >> 7) );
}
{ // BPM Setting
bpm_info.bpm = 120;
// 1Hz : 1 * 0x01000000 / ( 125 * 8 * (1/16M) )
// 1/16000 = 1/16M * 1000(= 125 *8)
// BPS = BPM / 60
bpm_info.offset = ( (unsigned long)( bpm_info.bpm * (0x01000000 >> 6)) / (60 * (16000 >> 6)) );
bpm_info.index = 0x00400000; // dummy offset
}
TCNT0 = 0;
sei();
}
void loop() {
while (1) {
digitalWrite( 13, LOW );
}
}
ランニングで貧血に。
6月 18th
4月から始めたランニングももう少しで2ヶ月になります。
少しづつ走れる距離が延びてきて、さらにはまってしまいそうな
勢いです。
最近では週に10km以上走れる日が2,3回あり
6月中に20kmに挑戦したいと思っています。
そんな感じでだんだんランナーの仲間入り果たしつつある
僕ですが気になった事があり調べてみました。
それは走っていて貧血気味になり
体の力が抜けてしまった事が2,3回ありました

最初は「空腹だから」、「気温が高いから」などと
勝手に決めつけて気にしていなかったのですが
ちょっと調べてみると「スポーツ性貧血」と
いうものらしいのです。
体内組織が低酸素状態になり
動悸、めまい、息切れなど様々な症状を引き起こすそうです。
ランニングを続けていると発汗作用などにより鉄分が
流出する為に貧血症状がでるそうです。
これからさらに暑くなる季節に突入しますので
特に外でスポーツを楽しむ方は鉄分補給を忘れずに
夏を楽しんでくださいね!!
