2004-08-29
_ EZ! TV で女性管理職を増やすための企業の取り組みを紹介してた。
この番組の扱うテーマは悪くないと思うんだけど、取り上げ方や編集や、コメンテーターのコメントがどうも納得いかないことが多い。ま、それはともかく今回気になったのは以下のシーン。
「男は仕事、女は家庭」に社内で11%賛成しているという事実に驚いているジョンソンエンドジョンソンの社員。
なんで? そんなに価値観が均一にならなきゃだめ? 今の時代に上に挙げた価値観を持つことはそんなに悪いこと? 違うでしょ。いちばんダメなのは多様性を認めないことですよ。他人を認められないことですよ。
2005-08-29
_ Ruby と PHP の配列操作比較
配列操作の比較表: Ruby, Python, JavaScript, Perl, C++ (いやなブログ)
配列操作の比較表は自分のためにも作ったことはなかったので、別に混乱はしないけど、Ruby の分を残して PHP との比較表を起こしてみた。気づいてないだけでもっと賢く書く方法がありそうな気もするけど、とりあえず出しちゃえ。あ、バージョン書いてなかった。PHP4 です。5 は知らない。(マニュアルも見てない。)
| Ruby | PHP |
| a = [1, 2, 3] | $a = array(1, 2, 3) |
| a.length | sizeof( $a ) or count( $a ) |
| a.empty? | empty( $a ) |
| a.push(x) | array_push( $a, $x ) or $a[] = $x |
| a.unshift(x) | array_unshift($a, $x ) |
| a.pop() | array_pop( $a ) |
| a.shift() | array_shift( $a ) |
| a.concat( b ) | $a = array_merge( $a, $b ) |
| a.clear | $a = array() |
| a.include?(x) | in_array( $x, $a ) |
| a.insert(i, x) | array_splice( $a, $i, 0, $x ) |
| a.delete(x) | |
| a.delete_at(i) | unset($a[$i])*1 |
| a.nitems{} | $b = array_count_values( $a ); $b[$x]*2 |
| a.index(x) | array_search( $a, $x ) |
| a.first | $a[0] |
| a.last | end( $a )*3 |
| a[i..j] or a.slice(i..j) | array_slice( $a, offset[, length] )*4 |
| a[i...j] or a.slice(i...j) | |
| a.sort | |
| a.sort! | sort( $a ) |
| a.reverse | array_reverse( $a ) |
| a.reverse! | $a = array_reverse( $a ) |
| a.uniq! | $a = array_unique( $a ) |
| a.join(d) | join( d, $a ) or implode( d, $a ) |
| a.each | foreach( $a as $key => $val ) |
insert は 配列のinsert の情報をいただきました。
delete はなんか関数書かないと無理っぽい。
[2005-08-30 追記]array_push() と [] についてツッコミをいただいたので調べてみた。
<?php
define( 'ACCURACY', 5 );
define( 'TIMES', 5 );
define( 'WAIT', 10000 );
function main() {
print "[]<br>\n";
for ( $i = 1; $i <= TIMES; $i++ ) {
$arr = array();
$start = get_microtime();
for ( $j = 1; $j <= WAIT; $j++ ) {
$arr[] = $j;
}
$end = get_microtime();
putime( bcsub($end, $start, ACCURACY) );
}
print "array_push()<br>\n";
for ( $i = 1; $i <= TIMES; $i++ ) {
$arr = array();
$start = get_microtime();
for ( $j = 1; $j <= WAIT; $j++ ) {
array_push( $arr, $j );
}
$end = get_microtime();
putime( bcsub($end, $start, ACCURACY) );
}
}
function get_microtime() {
list( $msec, $sec ) = split( " ", microtime() );
return bcadd( $sec, $msec, ACCURACY );
}
function putime( $sec ) {
$accuracy = (int)ACCURACY - 1;
$str = "%.".$accuracy."f sec<br>\n";
printf( $str, $sec );
}
main();
?>
結果はこんな感じ。マシンスペックは Pen!!! 800 MHz + 256MB。
[] 0.0421 sec 0.0415 sec 0.0419 sec 0.0415 sec 0.0416 sec array_push() 0.0559 sec 0.0563 sec 0.0561 sec 0.0560 sec 0.0557 sec
[] の方が速いですしタイプ量も少ないけど、個人的には PHP 以外にも触っていると「なんか気持ち悪い」感じ。あとパフォーマンス重要という方は
イテレーションのベンチマーク (Harukiからの平面波)
なども参考にされるとよいかと。
[2005-11-10 追記]
本当に今さらんだけど、マニュアルを読んだら PHP の配列は実際には順番づけられたマップで、配列にもハッシュにもキューにも応用が可能って書いてあった。
そうか、PHP の配列、ハッシュ周りの動きがどうにも納得いかなかったのは、そもそもがいわゆるちゃんとした配列やハッシュとして設計されたもんじゃないからか。ループが遅かったのもハッシュのくせになぜか順番が維持できちゃったりするのも、そういうわけか
2006-08-29
_ tDiary search が 2.1 で動かないねぇ
てのは実は知ってたんだけど忘れてたネタ。公開サーバで tdiarygrep はあまりに質素だしなぁ。rast や hyper estraier が使える環境でもないし、検索できないなんてちょっと話にならないし、だからと言って全部 Google っつーのもどうだろうと思うわけですな。
さーてな。
_ Subversion 1.4.x は working copy のレイアウトが変わるのか
http://svn.collab.net/repos/svn/branches/1.4.x/CHANGES
によると 1.4.0 では working copy のレイアウトが変わってしまうそうな。TortoiseSVN はまだ本家で全然扱いの大きくない 1.4.0-RC の方が先に出てくるので、それ喜んで使っちゃうと 1.3.x など他のクライアントで同じ working copy を覗いたときに困る。
ま、それだけ機能すればいい場合は別に気にする必要ないんだけど。普通は一人に一つ working copy があるし、同じ working copy を複数のアプリで扱う必要もないしね。
2007-08-29
_ spamlinkcheck.rb 再導入
今度は
- spamlinkcheck.rb on
- デバッグモード off
で。
referer が記録されつつ TrackBack spam が来ないかどうかを静観。
[追記] だいじょぶっぽい。デバッグモードが原因か?
_ Perl のオブジェクトについて最近理解した分のメモ
以前勉強してから情勢(って)が変わってきたものや抜けていた部分のメモ。
- Perl のオブジェクトは bless したリファレンス
- 以前はハッシュリファレンスを bless するのが主流だった(と、自分は認識している)が、最近はスカラリファレンスを利用した Inside-Out Object もオシャレなのかも。
- Class::Std を使うと便利
- bless で結びつけられた package 名を取得するには以下の方法がある
- ref
- Scalar::Util の blessed
- オブジェクトには実は便利メソッドがある
- UNIVERSAL 嫁
- isa() と can() がありゃ十分ちゃ十分か。なるほど。
ref は JavaScript の typeof のように使え、bless してないリファレンスに対して使うと以下の組み込みの型を返す。
- SCALAR
- ARRAY
- HASH
- CODE
- REF
- GLOB
- LVALUE
package 以外のものが返って来てしまうという意味ではちょっと危険ではあるけど、それはそれとして ref は知っとくと便利だなと思った。Perl は奥が深いよ、ほんと。
PHP の is_a() と method_exists()、Ruby の Object#is_a? と Module#method_defined? に相当するのは、Scalar::Util を使って
defined( blessed( $ref ) ) && $ref->isa( package_name ) defined( blessed( $ref ) ) && $ref->can( method_name )
になるのかな?
今後 Class::Std を使うかどうかは分からない*1けど、自分の目的はレンタルスペースで CGI を動かすことではないし今後もそういうことはないと思うので、便利に使えるシーンがくるかもしれない。押さえておこう。
[2007-09-06 追記]メソッド一覧はやっぱ欲しいなぁと思ったけど UNIVERSAL にはそんな機能はない。Class::Inspector を使うのが楽らしい。Fink にも deb にもパッケージがあるので、まぁそれほど使うのに抵抗はないかな?
*1 というか新規に Perl スクリプトは書きたくないし、Class::InsideOut なんてのもあるらしい。
_ τ [はじめまして。 PHPは素人ですが(PukiWikiのプラグインを直したことがある程度)、 ぐぐって見付けたPHPの..]