config.inc.phpに
$cfg['LoginCookieValidity'] = 14400;
とか書けばOK。
数年ぶりに自宅サーバを作って遊んでいる。やはり外部宛にメールが送信できないと楽しくない。
最近はOP25Bとかいう面倒なものがあるが、外部宛メールはSubmission Portである587を使って、プロバイダのSMTPサーバにSASL認証を通し、中継してもらうように設定すればOK。なはずだったが…
一部のアドレスからは送信できるが、他のアドレスからは送信できず以下のエラーメールが返ってくる。
host ybbsmtp.mail.yahoo.co.jp[183.79.29.230] said: 521 ybbsmtp.mail.yahoo.co.jp closing transmission channel. This email address must be verified first before you can use it for Sender/From field. (in reply to MAIL FROM command)
エラーメールから分かるとおり、プロバイダはYAhoo!BBである。
調べてみると、Yahooのウェブメールの画面で送信元アドレスをいちいち登録しないといけないらしい。めんどくさっ
画面を開いてみると、送信に成功したアドレスはすでに録されていた。そういえば大昔試しに登録して見た気もする…
そして当然、ここに登録していないアドレスではエラーが返ってきていたわけだ。
ならば新しい送信元アドレスを登録すればいいのだが、将来さらにアドレスを追加することを考えると、う~ん…
というか、よく見たらybbsmtpでリレーしたメールのヘッダにヘンなものがついてる。
X-Apparently-From: <xxxxxxxx@yahoo.co.jp>
認証に使ったYahoo! BBのアドレスが大公開されてる!
もはや使い続ける気がわかない。
最初はPostfixの設定に原因があるだと思い、少し検索したけど分からなかったのでオライリーの本を少し読んだ
結果から言えば関係なかったのだが、いい復習になったので、アフィリエイトリンクとかいうものを張ってみる。
MyDNS.JPで利用者向けに当面のあいだメールリレーサービスが提供されているので、ここに中継してもらえばOK。何でこれまで知らなかったんだ…
「当面のあいだ」というのが気になるので次の手を考えたい。この機会にちょっと探してみたが、自宅サーバのメールをリレーしてくれるサービスは他に見つからなかった。有料でも月1000円くらいまでは払ってもいいと思うのだが、やはりニッチな需要なのか…
ここ数日、よく分からない現象に悩まされてきた。
htmlファイルを編集しようとサクラエディタで開くと、「…は現在他のプロセスによって書き込みが禁止されています。」が出る。当然、他のエディタで同時に開いているわけでもなければ、作成途中のプレビューのためブラウザで開いている訳でもない。
このエラーは常に表示されるのではなく、タイミングが悪い時に発生するとしか言いようのないほどランダムに発生する。編集途中から上書きできなくなることもある。再起動によって直る場合もあるが、直らない場合もある。しかし、時間経過によっていつかは必ず直る。
サクラエディタの問題かというと、この問題が発生している間は、たとえば真魚で開いても上書きできない。もしかしてと思って試してみると、真魚で編集中に上書きできなくなる現象も発生した。
さらに訳の分からないことに、.txtやら.cssやら.jsやら.cgiやら.phpをエディタで編集しているときに発生したことはない。
こうなるとWindowsの問題な気がする。またどこか壊してしまったか。
エクスプローラのプレビューウィンドウを非表示にする。
これがWindowsの仕様だそうで……宝くじ当たったらMac買いたい…
表題の通り、MySQLのデータベースに日本語のレコードを保存して、それをphpMyAdminから見ると日本語が文字化けしていた。
文字コードをUTF-8に設定したコンソールでは問題なく表示される。Perlからuse utf8;してDBIで接続しても問題ない。phpMyAdminから見るときだけ文字化けする。当然、ブラウザが文字コードの判定を間違えている状態でもない。
my.cfgにdefault-character-set=utf8を記述。
注意点は、CenOS6でデフォルトで入っているMySQLは5.1でありこと。5.5以降で使うcharacter_set_server=utf8では不可。
昔ながらのPerl/CGIではデータをテキストファイルに保存しているわけだが、データの肥大化が原因なのか、動作が遅くなってきた。
その対策として、データをスリムアップするとか処理を効率化するとかが考えられるが、この際モダンな感じでデータの保存をMySQLに保以降してみてはどうだろうかと思った。
MySQLにデータベース「mysqltest」をutf8_general_ciで作成。一般ユーザID:test、pass:testpassで利用できるように設定。
テスト用に小規模なデータを作成。掲示板のログファイルを想定。
形式は
通し番号<>名前<>書き込み内容
とする。
bbsdata.txt
1<>名無し<>てすと 2<>ななーし<>てすとー 3<>anonimous<>test
ちょっと遠回しなスクリプトだけど、気にしない。
mysqltest.pl(データ移行)
use DBI; my $mysqldb = 'DBI:mysql:mysqltest'; my $mysqluser = 'test'; my $mysqlpass = 'testpass'; my $data = 'bbsdata'; my $datafile = "./$data.txt"; my @dataarray = ('no','name','content'); my @datatypearray = ('int','text','text'); my @filedata; open(DATA,"$datafile") || die("error:$datafile"); chomp(@filedata=<DATA>); close(DATA); my @datalist; foreach(@filedata){ my @tmp = split(/<>/, $_); my %data; foreach(@dataarray){ $data{$_} = shift(@tmp); } push(@datalist,\%data); } my $dbh = DBI->connect($mysqldb,$mysqluser,$mysqlpass); my @sql; $sql[0] = "create table $data ("; my $fields; my @values; for(my $i=0; $i <= $#dataarray; $i++ ){ $sql[0] .= "$dataarray[$i] $datatypearray[$i]"; $fields .= $dataarray[$i]; if($i == $#dataarray){ $sql[0] .= ');'; }else{ $sql[0] .= ', '; $fields .= ','; } } for(my $j=0; $j <= $#datalist; $j++ ){ my $tmp; for(my $i=0; $i <= $#dataarray; $i++ ){ if($datatypearray[$i] eq 'text'){ $tmp .= $dbh->quote($datalist[$j]->{$dataarray[$i]}); }else{ $tmp .= $datalist[$j]->{$dataarray[$i]}; } if($i == $#dataarray){ }else{ $tmp .= ','; } } $sql[1+$j] = "insert into $data ($fields) values ($tmp);"; } print "$fields\n"; print "$sql[0]\n"; print "$sql[1]\n"; print "$sql[2]\n"; foreach(@sql){ my $sth = $dbh->prepare($_); $sth->execute; $sth->finish; } $dbh->disconnect;
mysqltest2.pl(データ読込)
use DBI; my $mysqldb = 'DBI:mysql:mysqltest'; my $mysqluser = 'test'; my $mysqlpass = 'testpass'; my $data = 'bbsdata'; my @dataarray = ('no','name','content'); my $dbh = DBI->connect($mysqldb,$mysqluser,$mysqlpass); my $sql = "select * from $data;"; my $sth = $dbh->prepare($sql); $sth->execute; while(my $ref = $sth->fetchrow_hashref){ foreach(@dataarray){ print "$_ = $ref->{$_},"; } print "\n"; } $sth->finish; $dbh->disconnect;
# perl mysqltest.pl no,name,content create table bbsdata (no int, name text, content text); insert into bbsdata (no,name,content) values (1,"名無し","てすと"); insert into bbsdata (no,name,content) values (2,"ななーし","てすとー"); # perl mysqltest2.pl no,name,content select * from bbsdata no = 1,name = 名無し,content = てすと, no = 2,name = ななーし,content = てすとー, no = 3,name = anonimous,content = test,
とりあえずここまではうまくいった。
あとは実際のCGIを最小限の変更で動作させられるかどうか…
スマホっぽいUIのサイトを手軽に作れるjQuery mobileだが、グリッドの幅を調整できないのが不満だった。
<div style="width: 10em;"></div>
などとしても無視されてしまう。
どうやらこういう仕様であるようだ。
解決方法は、考えてみれば単純なものだった。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title></title>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" href="http://code.jquery.com/mobile/1.2.0/jquery.mobile-1.2.0.min.css" />
<script src="http://code.jquery.com/jquery-1.8.2.min.js"></script>
<script src="http://code.jquery.com/mobile/1.2.0/jquery.mobile-1.2.0.min.js"></script>
<style type="text/css">
<!--
.mygrid-main .ui-block-a{
width:6em;
}
.mygrid-main .ui-block-b{
min-width:12em;
}
-->
</style>
</head>
<body>
<div data-role="page" id="main" data-theme="b">
<div data-role="content">
<div>
<div><a href="http://localhost/" data-role="button">1</a></div>
<div><a href="http://localhost/" data-role="button">2</a></div>
</div>
</div>
</div>
</body>
</html>
前回の課題の解決に挑戦。
画像生成の部品として使用しているキャラクターなんとか機のパーツは、ファイル名がそのまま表示名になる仕様であり、日本語になっている。
FTPソフトで転送した際に文字化けを起こしていたので、Cent OS 6のファイルシステムに合わせてUTF-8に変更して転送する設定にした。
また、スクリプトから日本語でファイル名を直接指定しているので、スクリプト自体も文字コードをUTF-8にして保存する。
これであっさりとサーバ上で動作した。
せっかくなので、実行するとHTTPヘッダと画像データのバイナリを標準出力に書き込む動作に変更し、昔のアクセスカウンターのようにimgタグで呼び出す仕様にしてみた。
これに関してはこれができることを意識してもともとスクリプトを書いていたので、簡単に終了。
#!/usr/bin/perl
use Imager;
local $basedir = './data/default';
local @layers = (
'accessory_back',
'hair_back',
'hair_back_accessory',
'body_back',
'accessory_underwear',
'body_front',
'body_front_color',
'accessory_middle_back',
'head',
'accessory_middle_front',
'face_back',
'hair_front',
'hair_front_accessory',
'face_front',
'eye',
'accessory_front'
);
local %colorgloup = (
'head' => 'body',
'face_back' => '',
'face_front' => '',
'eye' => 'eye',
'hair_back' => 'hair',
'hair_front' => 'hair',
'hair_back_accessory' => '',
'hair_front_accessory' => '',
'body_back' => 'body',
'body_front' => '',
'body_front_color' => 'cloth',
'accessory_underwear' => '',
'accessory_middle_back' => '',
'accessory_middle_front' => '',
'accessory_back' => '',
'accessory_front' => ''
);
my %charaparts = (
'head' => '普通な顔1.png',
'face_back' => '素.png',
'face_front' => '素.png',
'eye' => '普通な目1.png',
'hair_back' => 'ロング.png',
'hair_front' => 'ナチュラル.png',
'hair_back_accessory' => 'ツインテール(長).png',
'hair_front_accessory' => '',
'body_back' => 'サマードレス1.png',
'body_front' => '',
'body_front_color' => 'サマードレス1.png',
'accessory_underwear' => '',
'accessory_middle_back' => '',
'accessory_middle_front' => '',
'accessory_back' => '',
'accessory_front' => ''
);
local %colormatrixorigin = (
'blue' => [ [ 1 , 0 , 0 , 0 ],
[ 1 , 0 , 0 , 0 ],
[ 0 , 0 , 1 , 0 ],
[ 0 , 0 , 0 , 1 ], ],
'purple' => [ [ 0 , 0 , 1 , 0 ],
[ 1 , 0 , 0 , 0 ],
[ 0 , 0 , 1 , 0 ],
[ 0 , 0 , 0 , 1 ], ],
'red' => [ [ 0 , 0 , 1 , 0 ],
[ 1 , 0 , 0 , 0 ],
[ 1 , 0 , 0 , 0 ],
[ 0 , 0 , 0 , 1 ], ],
'yellow' => [ [ 0 , 0 , 1 , 0 ],
[ 0 , 0 , 1 , 0 ],
[ 1 , 0 , 0 , 0 ],
[ 0 , 0 , 0 , 1 ], ],
'green' => [ [ 1 , 0 , 0 , 0 ],
[ 0 , 0 , 1 , 0 ],
[ 1 , 0 , 0 , 0 ],
[ 0 , 0 , 0 , 1 ], ],
'water' => [ [ 1 , 0 , 0 , 0 ],
[ 0 , 0 , 1 , 0 ],
[ 0 , 0 , 1 , 0 ],
[ 0 , 0 , 0 , 1 ], ],
'black' => [ [ 1 , 0 , 0 , 0 ],
[ 1 , 0 , 0 , 0 ],
[ 1 , 0 , 0 , 0 ],
[ 0 , 0 , 0 , 1 ], ],
'white' => [ [ 0 , 0 , 1 , 0 ],
[ 0 , 0 , 1 , 0 ],
[ 0 , 0 , 1 , 0 ],
[ 0 , 0 , 0 , 1 ], ],
'dummy' => [ [ 1 , 0 , 0 , 0 ],
[ 0 , 1 , 0 , 0 ],
[ 0 , 0 , 1 , 0 ],
[ 0 , 0 , 0 , 1 ], ]
);
my @colorlist = keys(%colormatrixorigin);
my %colormatrix = (
'eye' => $colormatrixorigin{$colorlist[int(rand(@colorlist))]},
'hair' => $colormatrixorigin{$colorlist[int(rand(@colorlist))]},
'cloth' => $colormatrixorigin{$colorlist[int(rand(@colorlist))]},
'body' => $colormatrixorigin{'dummy'},
);
my $imager = Imager->new(xsize => 300,ysize => 400, channels => 4);
$imager = &makechara($imager,\%charaparts,\%colormatrix);
my $data;
$imager->write(data => \$data, type => 'png') or die $imager->errstr;
binmode STDOUT;
print "Content-type: image/png\n";
print "Pragma: no-cache\n\n";
print $data;
sub makechara{
(my $imager,my $charapartsref,my $colormatrixref) = @_;
my $imagertmp = Imager->new(xsize => 300,ysize => 400, channels => 4);
foreach(@layers){
unless($charapartsref->{$_}){next;}
$imagertmp->read( file => "$basedir/$_/$charapartsref->{$_}" ) or die $imagertmp->errstr;
if($colormatrix{$colorgloup{$_}}){
$imagertmp = $imagertmp->convert(matrix => $colormatrixref->{$colorgloup{$_}});
}
$imager->rubthrough( src => $imagertmp, tx => 0, ty =>0);
}
return $imager;
}
↓リロードしたら色が変わるはず
前から気になってたけど、よく見るアレはCSSを編集しないとできなかったのか。
ただしTwenty Twelveでは編集する場所が違う。
.entry-content h3,
.comment-content h3 {
font-size: 16px;
font-size: 1.142857143rem;
line-height: 1.846153846;
margin-bottom: 1em;
padding: 5px 10px;
border-bottom: solid 1px #C0C0C0;
border-left: solid 10px #C0C0C0;
}
.entry-content h4,
.comment-content h4 {
font-size: 14px;
font-size: 1rem;
line-height: 1.846153846;
margin-bottom: 1em;
padding: 2px 5px;
border-bottom: solid 1px #C0C0C0;
border-left: solid 5px #C0C0C0;
}
.entry-contentではなく.comment-contentで反応するのが納得いかない。
Perlで画像処理をしたいと思った。
「キャラクターなんとか機」とは、素材として収録されている透過PNG画像を組み合わせ、さらに色の変更を行い、人物のいわゆる「立ち絵」を生成するプログラムである。
Perlでの画像処理ライブラリの有名どころはGD・ImageMagick・Imagerの3つのようだ。
StrawberryPerlにはGDとImagerがはじめから入っていたので、とりあえずImagerを使ってみることにした。
(StrawberryPerlにImageMagickインストールするのがうまくいかなかった。)
参考サイト
#yum list installed
してみると、
giflib.i686 4.1.6-3.1.el6
libjpeg.i686 6b-46.el6
libpng.i686 2:1.2.49-1.el6_2
なんだはいってるじゃん
ってことで
#cpan -i Imager
ずらずらーっと流れて結構時間かかって、
#perl -MImager -e 'print join ", ", sort keys %Imager::formats'
bmp, ifs, pnm, raw, tga
あれっ
あ、よく見てなかった。develがいるのか。
#yum install libjpeg-devel
#yum install libpng-devel
#yum install giflib-devel
で、
#cpan
cpan> force install Imager
#perl -MImager -e 'print join ", ", sort keys %Imager::formats'
bmp, gif, ifs, jpeg, png, pnm, raw, tga
よし、OK
#yum install freetype-devel
#cpan
cpan> force install Imager
色の変更については、日本語の情報が見つけられなかったのでCPANで確認した。
げげ、行列の乗算なんて長らくやってない。どうやるんだったかな…
use Imager;
my @layers = (
'accessory_back',
'hair_back',
'hair_back_accessory',
'body_back',
'accessory_underwear',
'body_front',
'body_front_color',
'accessory_middle_back',
'head',
'accessory_middle_front',
'face_back',
'hair_front',
'hair_front_accessory',
'face_front',
'eye',
'accessory_front'
);
my %colorgloup = (
'head' => 'body',
'face_back' => '',
'face_front' => '',
'eye' => 'eye',
'hair_back' => 'hair',
'hair_front' => 'hair',
'hair_back_accessory' => '',
'hair_front_accessory' => '',
'body_back' => 'body',
'body_front' => '',
'body_front_color' => 'cloth',
'accessory_underwear' => '',
'accessory_middle_back' => '',
'accessory_middle_front' => '',
'accessory_back' => '',
'accessory_front' => ''
);
my %charaparts = (
'head' => '普通な顔1.png',
'face_back' => '素.png',
'face_front' => '素.png',
'eye' => '普通な目1.png',
'hair_back' => 'セミロング.png',
'hair_front' => 'ナチュラル.png',
'hair_back_accessory' => 'ツインテール(長).png',
'hair_front_accessory' => '',
'body_back' => 'セーラー服1.png',
'body_front' => 'セーラー服1.png',
'body_front_color' => 'セーラー服1.png',
'accessory_underwear' => '',
'accessory_middle_back' => '',
'accessory_middle_front' => '',
'accessory_back' => '',
'accessory_front' => ''
);
my %colormatrixorigin = (
'blue' => [ [ 1 , 0 , 0 , 0 ],
[ 1 , 0 , 0 , 0 ],
[ 0 , 0 , 1 , 0 ],
[ 0 , 0 , 0 , 1 ], ],
'pur' => [ [ 0 , 0 , 1 , 0 ],
[ 1 , 0 , 0 , 0 ],
[ 0 , 0 , 1 , 0 ],
[ 0 , 0 , 0 , 1 ], ],
'red' => [ [ 0 , 0 , 1 , 0 ],
[ 1 , 0 , 0 , 0 ],
[ 1 , 0 , 0 , 0 ],
[ 0 , 0 , 0 , 1 ], ],
'yel' => [ [ 0 , 0 , 1 , 0 ],
[ 0 , 0 , 1 , 0 ],
[ 1 , 0 , 0 , 0 ],
[ 0 , 0 , 0 , 1 ], ],
'grn' => [ [ 1 , 0 , 0 , 0 ],
[ 0 , 0 , 1 , 0 ],
[ 1 , 0 , 0 , 0 ],
[ 0 , 0 , 0 , 1 ], ],
'wtr' => [ [ 1 , 0 , 0 , 0 ],
[ 0 , 0 , 1 , 0 ],
[ 0 , 0 , 1 , 0 ],
[ 0 , 0 , 0 , 1 ], ],
'blk' => [ [ 1 , 0 , 0 , 0 ],
[ 1 , 0 , 0 , 0 ],
[ 1 , 0 , 0 , 0 ],
[ 0 , 0 , 0 , 1 ], ],
'wht' => [ [ 0 , 0 , 1 , 0 ],
[ 0 , 0 , 1 , 0 ],
[ 0 , 0 , 1 , 0 ],
[ 0 , 0 , 0 , 1 ], ],
'dummy' => [ [ 1 , 0 , 0 , 0 ],
[ 0 , 1 , 0 , 0 ],
[ 0 , 0 , 1 , 0 ],
[ 0 , 0 , 0 , 1 ], ]
);
my %colormatrix = (
'eye' => $colormatrixorigin{'blk'},
'hair' => $colormatrixorigin{'red'},
'cloth' => $colormatrixorigin{'blue'},
'body' => $colormatrixorigin{'dummy'},
);
my $imager = Imager->new(xsize => 300,ysize => 400, channels => 4);
my $imagertmp = Imager->new(xsize => 300,ysize => 400, channels => 4);
my $counter = 0;
foreach(@layers){
$counter++;
unless($charaparts{$_}){next;}
$imagertmp->read( file => "data/default/$_/$charaparts{$_}" ) or die $imagertmp->errstr;
if($colormatrix{$colorgloup{$_}}){
$imagertmp = $imagertmp->convert(matrix => $colormatrix{$colorgloup{$_}});
}
$imager->rubthrough( src => $imagertmp, tx => 0, ty =>0);
}
$imager->write( file => 'imagertest.png')or die $imager->errstr;
今のところは動作確認なので、もっとシンプルに書けるんじゃないか、なんてことは気にしない。
なんかでた。
SSDを入手したのでWindows7 x64の再インストールを行っていたところ、UEFI BIOSのブートメニューに”Windows Boot Manager”なる見慣れないものが出現しているのを発見。
調べてみたところ、UEFI BIOS上でGPTパーテーションテーブルのドライブにx64版のWindowsをインストールするとできるもので、NVRAMに書き込まれるブートメニューらしい。
NVRAMにってことは、CMOSクリアしたら消えるんじゃね?っと思って調べたところ、やはり消えるらしい。
参考サイト:http://solomon-review.blog.so-net.ne.jp/2012-07-16
インストールCDからbcdedit実行とか、CMOSクリアごとにやるのか…