(rubyとかと比べて)挙動の違いにはまる。
こんなコードを書いたとき、
$num=2
$numbers = array($num - 1,
$num - 2,
$num - 3,
$num - 4);
function natural_number($n) { return ($n>0); }
$natural = array_filter($numbers, 'natural_number');
function not_natural_number($n) { return !($n>0); }
$not_natural = array_filter($numbers, 'not_natural_number');
print_r($natural);
print_r($not_natural);
出力はこんな風になる。
Array
(
[0] => 1
)
Array
(
[1] => 0
[2] => -1
[3] => -2
)
ArrayがHashを兼ねているのはわかる。だからって、ここで添え字まで引き継ぐことは無いんじゃない?
phpのImage_Graphで、最大値、最小値、もしくは0を表示させたいときの話。
こんな風にshowLabelを指定する。
$axis_y =& $plotarea->getAxis(IMAGE_GRAPH_AXIS_Y);
$axis_y->showLabel(IMAGE_GRAPH_LABEL_MINIMUM|
IMAGE_GRAPH_LABEL_MAXIMUM|
IMAGE_GRAPH_LABEL_ZERO
);
これで、範囲が10~100見たいなときも、下限の10が表示される。
みたいなhtmlをrubyのhtmlパーサのhpricotに読ませると、formにinputが含まれなくなる。
こんなだめなhtmlのページをWWW::Mechanizeで操作しなければならなくなってしまった。
$ irb
require 'rubygems'
true
require 'hpricot'
true
doc = Hpricot("<table><form action='hoge'> </table><input name='aa' type='hidden'></form>")
<Hpricot::Doc
{elem <table>
{elem <form action="hoge"> {text " "}}
</table>}
{emptyelem <input name="aa" type="hidden">}
{bogusetag</formform</form>>}>
WWW::Mechanizeで使う情報は、form関連、link関連なので、それ以外をなるべく消去していく。
class WWW::Mechanize::Page
def initialize(uri=nil, response=nil, body=nil, code=nil, mech=nil)
super(uri, response, body, code)
@watch_for_set = {}
@mech = mech
yield self if block_given?
raise Mechanize::ContentTypeError.new(response['content-type']) unless
content_type() =~ /^text\/html/
# construct parser and feed with HTML
if body && response
# 追加
body.gsub!(/<table.*?>/mi, '')
body.gsub!(/<\/table>/mi, '')
body.gsub!(/<tr.*?>/mi, '')
body.gsub!(/<\/tr>/mi, '')
body.gsub!(/<td.*?>/mi, '')
body.gsub!(/<\/td>/mi, '')
body.gsub!(/<th.*?>/mi, '')
body.gsub!(/<\/th>/mi, '')
body.gsub!(/<thead.*?>/mi, '')
body.gsub!(/<\/thead>/mi, '')
body.gsub!(/<tbody.*?>/mi, '')
body.gsub!(/<\/tbody>/mi, '')
body.gsub!(/<tfoot.*?>/mi, '')
body.gsub!(/<\/tfoot>/mi, '')
body.gsub!(/<div.*?>/mi, '')
body.gsub!(/<\/div>/mi, '')
body.gsub!(/<span.*?>/mi, '')
body.gsub!(/<\/span>/mi, '')
@root ||= Hpricot.parse(body)
parse_html
end
end
end
こんなふうに正しくなくなる可能性があるけど、構造の間違いよりずっとよいでしょ。なんか、悲しくなってくるけど。。。
<body> hogehoge </body>
原因がわかった。
IMAGE_GRAPH_AXIS_Y_SECONDARYはImage_Graph_Plotareaのaddの中で作られる。
ここではじめて作るので、何も追加していない状態でgetAxisをするとnullが帰ってきてしまう。
解決法は、使う前に追加。
$plotarea->add(Image_Graph::factory('axis', IMAGE_GRAPH_AXIS_Y_SECONDARY));
phpのPEAR Image_Graphの話。
グラフをまとめるとき。こんな風に使う。
$dataset = array(&$set1, &$set2);
$plot =& $plotarea->addNew('bar', array($dataset));
$plot->setBarWidth(30,'px');
$plot->setLineColor('white@0.5');
$fill_array =& Image_Graph::factory('Image_Graph_Fill_Array');
$fill_array->addColor('blue');
$fill_array->addColor('limegreen');
$plot->setFillStyle($fill_array);
二つのスケールを使いたいとき。二つ目にはIMAGE_GRAPH_AXIS_Y_SECONDARYを指定する。
$plot2 =& $plotarea->addNew('line', array(&$dataset), IMAGE_GRAPH_AXIS_Y_SECONDARY);
メモリの最大値を指定するとき。ソースを追っていないので、なぜIMAGE_GRAPH_AXIS_Y_SECONDARYのほうには使えないかわからない。。。
$axis_y =& $plotarea->getAxis(IMAGE_GRAPH_AXIS_Y);
$axis_y->forceMaximum(16.0);