2007/07/23

[技術系]   これじゃダメじゃん>天地中央

at 15:50JST
別に「Webヒョウジュン」のようなバカの好きなことばとは関係なく、これってうまく使えないことが多い気がする。

CSSでDivを天地左右中央に配置する方法『locate div at the center vertically and horizontally』 | CREAMU
http://blog.creamu.com/mt/2007/07/cssdivlocate_div_at_the_center.html

ミニマルモデルで示すと、
<html> 
<body>
<div
style="
position: absolute;
top: 50%;
left: 50%;
margin-left: -200px;
margin-top: -100px;
width: 400px;
height: 200px;

border: 1px solid black;
"
>
aaaa
</div>
</body>
</html>


こういうことなんだけど、これって
「ウインドウサイズが天地左右中央にしたいボックスより小さいと、
 そのボックスの上辺・左辺が消えてしまう」
よね。

具体的に
http://blog.creamu.com/
で示すと(XP+IE7使用。Firefox系も同じ)、ウインドウサイズが十分に大きい場合は
20070723cssmage1.png

となって期待通りだが、小さくしてみると
20070723cssmage2.png

といったように上辺・左辺が欠ける。というか四辺全部が欠けるということなんだけどね。

欠けるのが下辺・右辺だけならいいのだが、上辺・右辺が欠けると
・違和感がある
・ナビゲーションバーなど上辺・右辺に配することが多いパーツが消える
という問題点がある。特に後者が致命的。

「こまけーこといってんじゃねーよ。
 こんなウインドウサイズにして見るヤツいねーよぼけー」
とか言う? いや、そうじゃなくて…天地左右中央にボックスを配置したいのって、
「描画領域をXGA(1024×768ドット)決め打ちで作っているサイトを
 SXGA・WXGAディスプレイで見たとき、
 描画領域を中央にもってくることでつじつまを合わせたい」
場合が多いじゃない? そういうケースで描画領域がスクロールバーなどの分量を計算に入れていないとき、XGAディスプレイでフルスクリーン表示しても上辺・左辺が欠けてしまうんだよね。

おまけに、スクリーンショットを見てもわかるように、上辺・左辺に向かって消えてしまった領域はスクロールバーの操作で呼び出すこともできないので、万一VGA環境なんかで見たら死ぬほど悲惨なことになる。

ということなので、この手法は使う場所を考えないといけないと思う。

めんどくさいねー。もっと簡単に天地中央にしたいよねー。…はっ! いま、誰もが納得するうえにインターオペラビリティ豊かな解決策を思いついたよ!! それはtabl(以下Web標準原理主義者による検閲で削除)

[雑記]   また変わったコーヒーメーカーが…

at 14:59JST
アマゾンを見てたら、最近はこんなのが流行ろうとしているらしい。

うーむ…。思わず買いたくなった。いかんいかん…。

今までこうやって何台コーヒーメーカーを買ってきたことだろう。エスプレッソメーカーだけでも2,3台買ったはずだ。おもしろそうだからという理由でサイフォン式コーヒーメーカーとか、メッシュ浸透式とか…。どれも満足できない。

死ぬほど無駄遣いしてきたぼくに言わせてもらえば、いちばん便利なコーヒーメーカーは、3,000円くらいで売ってるペーパードリップのやつだ。安いし壊れないし、専用の消耗品はなし。出し殻はペーパーに包んだままポイすればいい。あと、茶葉を使えばお茶も淹れられるし、お味噌汁も作れる。

最悪なのは細引き豆を使う抽出型のエスプレッソメーカーで、あれは出し殻の始末に苦労する。キッチンストレーナーをつまらせるわ、匂いが染みつくわ…。

で、ですね。このSenseoの欠点はハッキリしている。専用の「コーヒーポッド」(豆をパックしたやつね)を使う必要があるということ。こういうタイプのエスプレッソメーカーを使ってたことがあるのでわかる。やっぱこれで継続的にお金を取られるというのはメーカー側のビジネスモデルとしてはイイかもしれないが、消費者側にはたまったもんじゃないですよ。ちょっとケチってアメリカンで淹れるとかいうことができないじゃないか!(貧乏くせー) なので買いませんよ。

個人的に興味があるのは、直火式のエスプレッソメーカーだね。あれなら豆は自分の好みで調達できるし。

…と思って調べてたらこんなのを見つけた。

豆とミルクを入れて火にかけると、泡立ちカプチーノが!! しかも牛さん柄でかわいい!! 欲しい…あ、いかんいかん!

[技術系]   update pingを受け取って何かを起動するCGIスクリプト

at 11:13JST
というのを適当にでっちあげている。

たとえばいま、このblogはn分おきにcronで更新チェックしてmixiに転載されたりしているが、これは非常にムダである。update pingを受け取ったときに更新チェックしに行くスクリプトを起動するようにしておけば省エネだ。これをタスクaとする。

もうひとつ。update pingを受け取ったらRSSを取得しにゆき、特定カテゴリの記事だけを蓄積してDB/RSS化するスクリプトもあれば便利だ。これをタスクbとする。

というわけで。しかし、

Weblogs.Com changes.xml を吐いたりする Ping サーバの Perl 実装 : NDO::Weblog
http://naoya.dyndns.org/~naoya/mt/archives/000444.html

あたりの事例のようにXMLRPCに沿ってマジメに書くのはいかにもメンドくさい。だって、weblogUpdates.pingのベーシックな中身って、
<?xml version="1.0"?> 
<methodCall>
<methodName>weblogUpdates.ping</methodName>
<params>
<param><value>testblog-blog</value></param>
<param><value>http://memo.hirosiki.jp/</value></param>
</params>
</methodCall>

こんだけなのだ。ムダきわまりない。そもそもXMLRPCキライだしね。

なので単純にPOSTで受け取って正規表現で更新サイトのURLを取得するだけにした。そのほか、もーほんとに適当に書き殴ってみる。

それでスクリプトの末尾に設定を
memo.hirosiki.jp	mailto	hoge@hoge.jp 
memo.hirosiki.jp !/var/net/www/hirosiki.jp/update.ping/something.to.exec

のように羅列しておくと、順に読んで処理してくれる。mailtoは更新通知メール送信コマンド。!のあとにパスを添えると外部コマンド起動。これでタスクaは完了。

で、タスクbのほう。とりあえず、
・更新通知を受ける
  ↓
・更新されたサイトからRSS auto discoveryでRSS URL取得
  ↓
・RSS取得
をやる。RSS auto discoveryももちろん正規表現で。この程度のことでTokeParserなんて使ってられるか。

…しかし、
・RSSを解析してローカルDBにストア
・特定カテゴリだけのRSSをストア
という処理で困った。
・RSS 1.0とRSS 2.0で大幅に仕様が違うので差異の吸収がめんどう
・パースがけっこうめんどう
うーん。しかし、ここでXML::RSSを使いたくないな…。そもそもXMLがキライだからな…。wellformedでないXMLを読むとショックで死ぬようなモジュール使えるか、ボケ。どうしようか。

以下、汚いスクリプト。
#!/usr/bin/perl 

use strict vars;
use Jcode;
use LWP::UserAgent;

my $req;
if ( $ENV{'REQUEST_METHOD'} eq 'POST' ) {
read( STDIN, $req, $ENV{'CONTENT_LENGTH'} );
} else {
FatalResponse( 503 );
}
=rem
* Seesaaでの例
<?xml version="1.0"?>
<methodCall>
<methodName>weblogUpdates.ping</methodName>
<params>
<param><value><string>testblog-blog</string></value></param>
<param><value><string>http://memo.hirosiki.jp/</string></value></param>
</params>
</methodCall>

* MovableTypeでの例
<?xml version="1.0"?>
<methodCall>
<methodName>weblogUpdates.ping</methodName>
<params>
<param><value>testblog-blog</value></param>
<param><value>http://memo.hirosiki.jp/</value></param>
</params>
</methodCall>
=cut

my $url =
( $req =~ m!<value>(?:<string>)?(http://.*?)(?:</string>)?</value>! )[0]
;

Response();

while ( <DATA> ) {
s/^\s+//;
s/\s+$//;
next if ( /^$/ || /^#/ );
my $name = ( split( /\t/, $_ ) )[0];
my $rest = $_;
$rest =~ s/^$name\t//;
my @args = split( /\t/, $rest );
my $cmd = shift @args;

next
if ( $url !~ m|^http://$name| );

if ( $cmd =~ s/^!// ) {
system( $cmd );
next;
}

my $cmdroutine = "__cmd_$cmd";
&$cmdroutine( $url, @args );
}

exit;

sub __cmd_mailto {
my @args = @_;
my $site = shift @args;

system( "echo '$site' | mail -s '[ping received] $site' $args[0]" );
}

sub __cmd_rssaddto {
my @args = @_;
my $site = shift @args;

my $cnt = GetRSS( $site )
or do {
Warn( "Could not get $site content" );
exit;
};
print STDERR substr( $cnt, 0, 20 ) . "\n";
}

sub GetRSS {
my $site = shift @_;

my $rssUrl = GetRSSURL( $site )
or return; # エラー
my $cnt = GetEucURL( $rssUrl )
or return; # エラー

return( $cnt );
}

sub GetRSSURL {
my $site = shift @_;

my $cnt = GetEucURL( $site )
or return; # エラー
my $rssUrl =
( $cnt =~ m|<link(?:.*)?type="application/rss\+xml"(?:.*)?href="(.*)"[^>]{0,}>|ig )[0]
;
return # エラー
if ( $rssUrl !~ /^http:/ );

return( $rssUrl );
}

sub Warn {
print STDERR shift @_;
}

sub GetEucURL {
my $url = shift @_;

my $refConf = shift @_;
my $timeout = 10;
my $max_size = 128;
if ( $refConf ) {
if ( $$refConf{timeout} ) {
$timeout = $$refConf{timeout};
}
if ( $$refConf{max_size} ) {
$max_size = $$refConf{max_size};
}
}

my $ua = LWP::UserAgent->new(
agent => 'Mozilla/4.0 (compatible; MSIE 6.0)',
timeout => $timeout,
max_size => $max_size * 1024,
);
my $response;
$response = $ua->get( $url )
or return; # エラー
return # エラー
if ( !$response->is_success );
my $eucContent;
$eucContent = jcode( $response->content )->h2z->euc;
return( $eucContent );
}

sub FatalResponse {
my $r = shift @_;
print "Response: $r\n\n";
exit;
}

sub Response {
my %params = (
flerror => 0,
message => 'Thanks for the ping',
@_,
);

print <<"_EOF_";
Content-Type: text/xml

<?xml version="1.0" encoding="UTF-8"?>
<methodResponse>
<params>
<param>
<value>
<struct>
<member>
<name>flerror</name>
<value>
<boolean>$params{'flerror'}</boolean>
</value>
</member>
<member>
<name>message</name>
<value>$params{'message'}</value>
</member>
</struct>
</value>
</param>
</params>
</methodResponse>
_EOF_
}

__DATA__
#memo.hirosiki.jp mailto hoge@hoge.jp
#memo.hirosiki.jp !/var/net/www/hirosiki.jp/update.ping/something.to.exec


そーす:update-ping.cgi
さらに過去の記事
2009/04 (1)   2008/12 (3)   2008/11 (9)   2008/10 (10)   2008/09 (20)   2008/08 (2)   2008/07 (23)   2008/06 (16)   2008/05 (22)   2008/04 (11)   2008/03 (21)   2008/02 (20)   2008/01 (21)   2007/12 (32)   2007/11 (37)   2007/10 (46)   2007/09 (63)   2007/08 (33)   2007/07 (41)   2007/06 (81)   2007/05 (173)   2007/04 (168)   2007/03 (113)   2007/02 (123)   2007/01 (92)   2006/12 (111)   2006/11 (185)   2006/10 (20)  

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は1年以上新しい記事の投稿がないブログに表示されております。