「ほっ」と。キャンペーン

<   2009年 03月 ( 2 )   > この月の画像一覧

今日悩んだ HTML::ExtractContent のオプション指定方法。

オプションを指定したいときは、
こんな風に opt というガワを用意しておく必要がある。
my $extractor = HTML::ExtractContent->new({ opt => {}});

「opt」は文字列固定。
HTML::ExtractContent の中で「opt」で呼び出されてるんだもん。

その後の指定はこんな感じ。
$extractor->opt->{'waste_expressions'} = '';
$extractor->opt->{'decay_factor'} = 1.1;    # def:0.75
$extractor->opt->{'continuous_factor'} = 1.0;  # def:1.62
$extractor->opt->{'min_length'} = 0;      # def:30
$extractor->opt->{'threshold'} = 90;      # def:60


まさか固定とは思わず、なんかすごい悩んじゃった。

追記:
実は上のようにしただけではちゃんと動かなかった。
ExtractContent.pm 中にある設定値のデフォルトが上書きされてしまい、
まったく設定されなくなる。
あんまりエラーが出まくるので、次のように変更してしまった。
これをやると、上のように opt の空のガワを入れておかなくてもいい。
正しいかな。
正しくないかも。
間違ってたら指摘してください。
ExtractContent.pm 14行目
$self->opt = {

$self->{opt} = {

ExractContent.pm 64行目
$self->content = shift;

$self->{content} = shift;

値を設定するときだけは明示的に連想配列ってことにしないと、
accesor がちゃんと働いてくれないっぽい?

しかし、なんでみんなちゃんと動いてのやろ。
オプション値のチューニングとかしてないのかな。
perl 5.10.0 なんだけど、バージョンが悪い?
[PR]
by xiaoxia | 2009-03-09 19:25 | プログラム言語 | Comments(3)

[perl]色相環を分割

何をしたいかと言いますと、
例えば、折れ線グラフを書くとき、
要素が4個あったら、その4個はなるべく違う色にしたいし、
10個あったら10個をなるべく違う色にしたいですよね。

というわけで、色相環を指定された数で分割して、RGB で出力するよ、
というプログラムを書いてみました。
cgi を書いてると、こういうのよく使うんだよね。
今までも何回かあって、そのたびに書いてたんだけど、
リサイクルしたいので、メモがてら投稿。

GD.pm あたりには用意されてそうだけど、
あれは大きいモジュールなんで、そこまでじゃないなと。
今回参考にしたのは、以下。
つか、ほぼまるっといただき。
C++ みたいだけど、ほぼそのまま perl にできます。
色相環を利用して色に数値を割り当てる方法

511 に分割してあるので、511 以上の数で分割すると、
どっかの色が一緒になっちゃうため、
エラーにしています。
0 はないだろ、ってことでこれもエラー。

赤から青の間を分割しますが、
HUE とか HSV とかは全然わかんないんで、
質問しないで下さい(笑)
わかんないでも何となく書けちゃうのが perl の良いところだよねー。

# 10個に分けて、@poi に入れたいときの呼び出し方
&makeColourList(10, ¥@poi);

sub makeColourList () {
  my $count = shift;
  my $out = shift;

  return if(($count > 511) || ($count <= 0));

  my $step = 511 / $count;
  my $num = -1 * $step;

  map { $num += $step;
     push(@$out, &changeNumberToColor(int($num)));
  } (0..($count - 1));
}

sub changeNumberToColor ($) {
  my $num = shift;

  my $begin = 0;
  my $end = 240;
  my $step = 512;
  my $saturation = 1;
  my $value = 1;
  my $max = 255;
  my $min = 0;

  $num = $num % $step;

  my $hue = 0.46875 * $num;

  while($hue>360 || $hue<0){
    if($hue >= 360) {
      $hue -= 360;
    } elsif($hue < 0) {
      $hue += 360;
    }
  }

  my $region = int($hue / 60.00);
  my $fraction = ($hue / 60.00) - $region;
  my $up = $fraction * 255 * $saturation;
  my $down = 255 - $up;

  my $r = 255;
  my $g = 255;
  my $b = 255;

  if($region == 0) {
    $g = $up;
    $b = 0;
  } elsif($region == 1) {   # 黄→緑
    $r = $down;
    $b = 0;
  } elsif($region == 2) {   # 緑→シアン
    $r = 0;
    $b = $up;
  } elsif($region == 3) {   # シアン→青
    $r = 0;
    $g = $down;
  } elsif($region == 4) {   # 青→マゼンタ
    $r = $up;
    $g = 0;
  } elsif($region == 5) {   # マゼンタ→赤
    $g = 0;
    $b = $down;
  }

  return sprintf("%02X%02X%02X", $r, $g, $b); # 符号なし16進
}


実行すると、
  FF0000
  FF6500
  FFCB00
  CDFF00
  67FF00
  01FF00
  00FF63
  00FFC9
  00CFFF
  0069FF
  0001FF
こんな感じの 10 個がリストに入ります。
[PR]
by xiaoxia | 2009-03-02 12:20 | プログラム言語 | Comments(2)

ダメ女プログラマ&主婦&腐女子&バイオリン弾き


by 小霞