macosxにpostgres9.0.4をインストール

macosxで作りはじめたrails3アプリ、データベースをsqlite3からpostgresに切り替える。

※rvmとrails3とmacportsはインストール済みの前提。

 $ gem install pg

pg_configがないぞ、というエラー。

 checking for pg_config... no
 No pg_config... trying anyway. If building fails, please try again with
  --with-pg-config=/path/to/pg_config

そこでmacportsでpostgresをインストールすることにした。以下、その手順。
最近portsを使っていなかったので、

 $ sudo port selfupdate

パッケージ名を調べる

 $ port search postgres

バージョン9.0.4をインストールする。

 $ sudo port install postgresql90
 $ sudo port install postgresql90-server

表示されたメッセージに従って以下の手順。

 $ sudo port load postgresql90-server
 $ sudo mkdir -p /opt/local/var/db/postgresql90/defaultdb
 $ sudo chown postgres:postgres /opt/local/var/db/postgresql90/defaultdb
 $ sudo su postgres -c '/opt/local/lib/postgresql90/bin/initdb -D /opt/local/var/db/postgresql90/defaultdb'

あらためてpgのインストール

 $ gem install pg  --  --with-pg-config=/opt/local/lib/postgresql90/bin/pg_config

 Building native extensions.  This could take a while...
 Successfully installed pg-0.11.0
 1 gem installed
 Installing ri documentation for pg-0.11.0...
 Installing RDoc documentation for pg-0.11.0...

以下、rails3アプリのルートディレクトリで操作。
Gemfileに以下を追加。

 gem 'pg'

バンドルのインストール。

 $ bundle install
 ...
 Using pg (0.11.0) 
 ...
 Your bundle is complete! Use `bundle show [gemname]` to see where a bundled gem is installed.

database.ymlはこんな感じで。

 test:
   adapter: postgresql
   database: june_test
   username: rails
   password: rails
   host: 127.0.0.1
   encoding: utf8

この段階でtest/unitを実行すると

 PGError: FATAL:  role "rails" does not exist

ここで、ロールを追加するか、アクセス制限を緩和するか、方針を考える。

ErlangでSOAPをデコードしてみる

#!/opt/local/bin/escript

-include_lib("xmerl/include/xmerl.hrl").

main(_) -> 
        XmlData = "<soapenv:Envelope " ++
"xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " ++
"xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" " ++
"xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" " ++
"xmlns:cwmp=\"urn:dslforum-org:cwmp-1-0\">" ++
"<soapenv:Header>" ++
"<cwmp:ID soap-env:mustUnderstand=\"1\">999</cwmp:ID>" ++
"<cwmp:HoldRequest soap-env:mustUnderstand=\"1\">0</cwmp:HoldRequest>" ++
"</soapenv:Header>" ++
"<soapenv:Body>" ++
"</soapenv:Body>" ++
"</soapenv:Envelope>",

        {Header, Body} = unmarshall(XmlData),
        io:format("SoapHeader: ~p~n", [Header]),
        io:format("SoapBody: ~p~n", [Body]).

unmarshall(Xml) ->
        {SoapEnv, _Rest} = xmerl_scan:string(Xml),
        [SoapHead, SoapBody] = SoapEnv#xmlElement.content,
        {
        [soap_header(C) || C <- SoapHead#xmlElement.content],
        [soap_body(C) || C <- SoapBody#xmlElement.content]
        }.

soap_header(C) ->
        Name = C#xmlElement.name,
        [Value] = [Content#xmlText.value || 
                Content <- C#xmlElement.content],
        Attr = [{A#xmlAttribute.name, A#xmlAttribute.value} || 
                A <- C#xmlElement.attributes],
        {Name, Value, Attr}.

soap_body(C) ->
        {
        C#xmlElement.name,
        C#xmlElement.content,
        C#xmlElement.attributes
        }.

node.jsの練習(v0.4対応)

v0.3.6でhttp.request() と http.get()が導入された。
http.Clientインスタンスを作成しclient.request()を呼ぶ従来のインターフェイスは非推奨とのこと。

var http = require('http');

http.createServer(function (req, res) {
	var proxy_headers = req.headers,
		proxy_req,
		options;

	function _options() {
		var host = req.headers.host,
			h, _host, _port;
		if(host.indexOf(':') > 0){
			h = host.split(':');
			_host = h[0];
			_port = parseInt(h[1],10);
		} else {
			_host = host;
			_port = 80;
		}
		return {
			host: _host,
			port: _port,
			method: req.method,
			path: req.url,
			headers: req.headers
		};
	}

	function _proxy_response(proxy_res) {
		var headers = proxy_res.headers;
		res.writeHead(proxy_res.statusCode, headers);
		proxy_res.on('data', function(chunk) { res.write(chunk); });
		proxy_res.on('end', function() { res.end(); });	
	}

	options = _options(proxy_headers.host);

	if (req.method === 'GET'){
		proxy_req = http.get(options, _proxy_response);
	} else if(req.method === 'POST'){
		proxy_req = http.request(options, _proxy_response);
		req.on('data',function(chunk){ proxy_req.write(chunk); });
		req.on('end',function(){
			proxy_req.end();
		});
	}

}).listen(8080, "localhost");

node.jsの練習

簡単なhttp proxyを書いてみた。

var http = require('http');

http.createServer(function (req, res) {
	var proxy_headers = req.headers,
		proxy_req,
		client;

	function _client(host) {
		var h, _host, _port;
		if(host.indexOf(':') > 0){
			h = host.split(':');
			_host = h[0];
			_port = parseInt(h[1],10);
		} else {
			_host = host;
			_port = 80;
		}
		return http.createClient( _port, _host  );
	}

	function _proxy_response(proxy_res) {
		var headers = proxy_res.headers;
		res.writeHead(proxy_res.statusCode, headers);
		proxy_res.on('data', function(chunk) { res.write(chunk); });
		proxy_res.on('end', function() { res.end(); });	
	}

	client = _client(proxy_headers.host);

	if (req.method === 'GET'){
		proxy_req = client.request(req.method, req.url, proxy_headers);
		proxy_req.end();
		proxy_req.on('response', _proxy_response);
	} else if(req.method === 'POST'){
		proxy_req = client.request(req.method, req.url, proxy_headers);
		req.on('data',function(chunk){ proxy_req.write(chunk); });
		req.on('end',function(){
			proxy_req.end();
			proxy_req.on('response',  _proxy_response);
		});
	}

}).listen(8080, "localhost");

@jennyholzer

A LOT OF PROFESSIONALS ARE CRACKPOTS
プロの多くはイカれてる
A RELAXED MAN IS NOT NECESSARILY A BETTER MAN
リラックスしてる男がましな男とはかぎらない
A SINGLE EVENT CAN HAVE INFINITELY MANY INTERPRETATIONS
ひとつの事象には際限ない解釈がありえる
A SOLID HOME BASE BUILDS A SENSE OF SELF
根拠地は自己意識を形成する
ABSOLUTE SUBMISSION CAN BE A FORM OF FREEDOM
無条件降伏は自由の形式のひとつ
ABSTRACTION IS A TYPE OF DECADENCE
抽象は堕落の一型式
ACTION CAUSES MORE TROUBLE THAN THOUGHT
思想より行動が迷惑
AN ELITE IS INEVITABLE
エリートは避けられない
ANGER OR HATE CAN BE A USEFUL MOTIVATING FORCE
怒りと憎しみは人を動かすのに使える
AT TIMES INACTIVITY IS PREFERABLE TO MINDLESS FUNCTIONING
何もしない方が思慮に欠けた機能になるよりいいときもある
BEING SURE OF YOURSELF MEANS YOU'RE A FOOL
バカほど自信がある
CALM IS MORE CONDUCTIVE TO CREATIVITY THAN IS ANXIETY
心配するより冷静でいる方が創造性は高まる
CLASS STRUCTURE IS AS ARTIFICIAL AS PLASTIC
階級構造はプラスチックなみに人工的
CONFUSING YOURSELF IS A WAY TO STAY HONEST
自分に正直になるには自分を混乱させることです
DISGUST IS THE APPROPRIATE RESPONSE TO MOST SITUATIONS
どんな状況であれ十中八九むかつくしかない
DON'T PLACE TO MUCH TRUST IN EXPERTS
専門家を信頼しすぎないように
DYING AND COMING BACK GIVES YOU CONSIDERABLE PERSPECTIVE
死からの生還は重要な透視図をもたらす
ENSURE THAT YOUR LIFE STAYS IN FLUX
流動的な生活の持続を確保せよ
EVEN YOUR FAMILY CAN BETRAY YOU
家族でさえあなたを裏切ることがある
EVERYONE'S WORK IS EQUALLY IMPORTANT
誰の仕事であれ等しく重要
EVERYTHING THAT'S INTERESTING IS NEW
面白いものはどれも新しい
EXCEPTIONAL PEOPLE DESERVE SPECIAL CONCESSIONS
例外的なひとたちは特権に値する
EXTREME BEHAVIOR HAS ITS BASIS IN PATHOLOGICAL PSYCHOLOGY
極端な行動は病的心理学に根拠がある
FAKE OR REAL INDIFFERENCE IS A POWERFUL PERSONAL WEAPON
装っていてもいなくても無関心は強力な私的武器
GOING WITH THE FLOW IS SOOTHING BUT RISKY
流れに沿っていれば不安はないけど危険
GOOD DEEDS EVENTUALLY ARE REWARDED
善行はいつか報われる
GRASS ROOTS AGITATION IS THE ONLY HOPE
草の根の煽動に期待するしかない
GUILT AND SELF-LACERATION ARE INDULGENCES
罪と自傷は免罪符
HUMANISM IS OBSOLETE
人間中心主義は流行らない
IDEALS ARE REPLACED BY CONVENTIONAL GOALS AT A CERTAIN AGE
ある年齢までに到達すべきありきたりな目標に差し替えられた理想
IF YOU CAN'T LEAVE YOUR MARK GIVE UP
自分の印を残せなければ、あきらめろ
IF YOU LIVE SIMPLY THERE IS NOTHING TO WORRY ABOUT
単純に生きていれば何も悩まない
IT IS HEROIC TO TRY TO STOP TIME
英雄は時間を止めようとする
IT IS IN YOUR SELF-INTEREST TO FIND A WAY TO BE VERY TENDER
やさしく振る舞う術を学ぶのは自分のため
IT'S BETTER TO BE NAIVE THAN JADED
すれからしより世間知らずがいい
IT'S GOOD TO GIVE EXTRA MONEY TO CHARITY
余ったお金で慈善するのはいいことだ
IT'S NOT GOOD TO HOLD TOO MANY ABSOLUTES
絶対的なものをあまりにたくさん抱えこむのはよくない
KNOWING YOURSELF LETS YOU UNDERSTAND OTHERS
自分自身を知ることで他人を理解する
LACK OF CHARISMA CAN BE FATAL
カリスマのなさは取り返しがつかない
LEISURE TIME IS A GIGANTIC SMOKE SCREEN
余暇は巨大煙幕
LISTEN WHEN YOUR BODY TALKS
体が話すときは耳をすませろ
LOOKING BACK IS THE FIRST SIGN OF AGING AND DECAY
回想は老衰の最初の兆候
LOVING ANIMALS IS A SUBSTITUTE ACTIVITY
動物愛好は代償行動
LOW EXPECTATIONS ARE GOOD PROTECTION
期待が小さければ失うものも少ない
MEN ARE NOT MONOGAMOUS BY NATURE
単婚は男性の自然ではない
MODERATION KILLS THE SPIRIT
節度が精神をだめにする
MOSTLY YOU SHOULD MIND YOUR OWN BUSINESS
余計なちょっかいは出すべからず
NOISE CAN BE HOSTILE
ノイズは敵になる
NOTHING UPSETS THE BALANCE OF GOOD AND EVIL
吉と凶のバランスはひっくり返せない
OFTEN YOU SHOULD ACT LIKE YOU ARE SEXLESS
ときにはセックスレスのふりをすべきだ
OPACITY IS AN IRRESISTIBLE CHALLENG
不透明性は抗し難い欲望をかきたてる
PAIN CAN BE A VERY POSITIVE THING
傷はとても肯定的なものになりえる
PLANNING FOR THE FUTURE IS ESCAPISM
将来設計は現実逃避
PLAYING IT SAFE CAN CAUSE A LOT OF DAMAGE IN THE LONG RUN
安全な遊びは長い目でみればたくさんの被害をもたらす
PUSH YOURSELF TO THE LIMIT AS OFTEN AS POSSIBLE
可能なかぎり何度でも自分を限界に押しやれ
REMEMBER YOU ALWAYS HAVE FREEDOM OF CHOICE
どんなときでも選択の自由があることを忘れないように
RESOLUTIONS SERVE TO EASE OUR CONSCIENCE
決断は我々の良心をゆるめるものだ
REVOLUTION BEGINS WITH CHANGES IN THE INDIVIDUAL
革命は個々人の変化からはじまる
ROMANTIC LOVE WAS INVENTED TO MANIPULATE WOMEN
恋愛は女を操るためにつくりだされた
SALVATION CAN'T BE BOUGHT AND SOLD
救済が売り買いされていいはずがない
SELF-AWARENESS CAN BE CRIPPLING
自己認識のせいで動けなくなるかもしれない
SELFISHNESS IS THE MOST BASIC MOTIVATION
それをやる一番の理由は、自分のため
SIN IS A MEANS OF SOCIAL CONTROL
罪はソーシャルな管理手段
SLIPPING INTO MADNESS IS GOOD FOR THE SAKE OF COMPARISON
比較するために狂ってみるのはいいことだ
SLOPPY THINKING GETS WORSE OVER TIME
ずさんな思考がますます悪化する
SOMETIMES THINGS SEEM TO HAPPEN OF THEIR OWN ACCORD
ときどきモノゴトはひとりでに起きるようだ
STRONG EMOTIONAL ATTACHMENT STEMS FROM BASIC INSECURITY
強い執着心は不安から生じる
TAKING A STRONG STAND PUBLICIZES THE OPPOSITE POSITION
立場を強調して反対意見を訴える
TECHNOLOGY WILL MAKE OR BREAK US
テクノロジーはわれわれを作り、あるいは壊すだろう
THE FUTURE IS STUPID
未来はばかげている
THE IDEA OF TRANSCENDENCE IS USED TO OBSCURE OPPRESSION
超越という概念は抑圧をぼかすために使われる
THE NEW IS NOTHING BUT A RESTATEMENT OF THE OLD
新しいものは古いものを言い換えただけ
THE ONLY WAY TO BE PURE IS TO STAY BY YOURSELF
純粋になる唯一の方法は独りでいること
THERE'S NOTHING EXCEPT WHAT YOU SENSE
感覚できるものがすべて
THERE'S NOTHING REDEEMING IN TOIL
労苦を埋め合わせるものはない
THINKING TOO MUCH CAN ONLY CAUSE PROBLEMS
考えすぎは問題を起こすだけ
UNIQUE THINGS MUST BE THE MOST VALUABLE
他に存在しないものは一番高く売れなければならない
UNQUESTIONING LOVE DEMONSTRATES LARGESSE OF SPIRIT
疑いのない愛が示す精霊の贈りもの
VIOLENCE IS PERMISSIBLE EVEN DESIRABLE OCCASIONALLY
暴力はそれが望ましいときでさえ許される
WISHING THINGS AWAY IS NOT EFFECTIVE
あれがなければと思うのは実効的でない
YOU ARE A VICTIM OF THE RULES YOU LIVE BY
あなたはあなたの規則の犠牲者
YOU ARE RESPONSIBLE FOR CONSTITUTING THE MEANING OF THINGS
あなたはその意味が構成されるのに関与している
YOU ARE THE PAST PRESENT AND FUTURE
他者は時間である
YOU CAN'T FOOL OTHERS IF YOU'RE FOOLING YOURSELF
自分を嗤うものは他人を嗤えない
YOU MUST BE INTIMATE WITH A TOKEN FEW
わずかな印と親密に
YOU MUST HAVE ONE GRAND PASSION
熱愛の対象をひとつ持たなければならない
YOUR ACTIONS ARE POINTLESS IF NO ONE NOTICES
誰も注目しない行動は無意味

パウルクレーの色彩円環

『教育スケッチブック』Fig.87をモチーフに作図

void setup()
{
  size(320, 460);
  colorMode(HSB,360,100,100);
  background(#FFFFFF);
  fig86();
  translate(-width/2, -height/2);
  fig87();
}

void fig86()
{
  strokeWeight(2);
  smooth();
  translate(width/2, height/2);
  for(float h=0; h < 360; h+=0.25){
    float s = 99;
    float b = 99;
    for(int r=79; r > 0; r--){
      float a = r / 79.0 * 90.0;
      b = 99.0 * sin(radians(a));
      float ch = h;
      if(h < 120){
        ch = h / 2;
      } else if(h < 180){
        ch = h - 60; 
      } else if(h < 240){
        ch = 120 + (h - 180)* 2;
      } else {
        ch = h;
      }
      color c = color(ch, s, b);
      float x = r*cos(radians(h-60.0)) + width / 2;
      float y = r*sin(radians(h-60.0)) + height / 2;
      set((int)x, (int)y, c);
    }
  }

  stroke(0,0,100,128);
  for(int i = 0; i < 6; i++){
      line(0,0,80*cos(radians(60*i)),80*sin(radians(60*i)));
  }
  noFill();
  stroke(#ffffff);
  ellipse(0, 0, 160.0, 160.0);
}

void fig87()
{
  stroke(#000000);
  smooth();
  translate(width/2, height/2);
  fill(#666666);
  ellipse(0,0,30,30);
  int s = 99;
  int b = 99;
  for(int i=0; i < 6; i++){
    switch(i){
      case 0:
        fill(29,s,b);  // ORANGE
        break;
      case 1:
        fill(59,s,b);  // YELLOW
        break;
      case 2:
        fill(119,s,b);  // GREEN
        break;
      case 3:
        fill(239,s,b);  // BLUE
        break;
      case 4:
        fill(299,s,b);  // VIOLET
        break;
      case 5:
        fill(0,s,b);  // RED
        break;      
    }
    ellipse(80*cos(radians(60*i)),80*sin(radians(60*i)),60,60);
    line(0,0,50*cos(radians(60*i)),50*sin(radians(60*i)));
  }
  noFill();
  ellipse(0,0,160,160);
}