2009年7月アーカイブ
一カ所のIPから同一のコンテンツを死ぬほどアクセスされて(20回/秒)、Webサーバが大変なことになってしまったので、このたびmod_evasiveというApacheモジュールをとりあえず入れました。
mod_evasive で DoS攻撃対策 - chibilog++ [aroe.name]
印刷屋にDoS攻撃すんなっつーの(Safariが暴走したっぽい挙動だったが)。ともかく、専任じゃないから迎撃モードに移行すると通常業務が後ろに遅延していくわけで、いろいろと大変であります。
▲大いなる手抜き
教育訓練でこれを使った後、実際にやってみましょうとかいって、印刷機のプロセスインキを混ぜてみると効果的。
CorelDRAW X4からのPDFをMac版Acrobat 8でプリフライトをしようとするとレインボーカーソルが出て止まるのだが、回避法は、Acrobat 9でプリフライトする、でした。
Acrobat 9があるなら最初っからAcrobat 9使えっていうかもしれませんけれども、いろんな理由でAcrobat 8しか使えなかったりするのです。
CorelDRAW X4自体は、CMYKのPDFがちゃんと書きだせるようで、いいソフトだと思います。
▲土曜ワイド劇場ではない
会社で教育訓練するときに使う教材で、光の三原色を説明するためのものです。自前でFLASH購入しておいたのが今生きました。
むかーし、学校いたときFLASH 2を購入してトゥイーンとかなら出来るのですが、今時のActionScript3とかよくわからないので苦労しました。円を配置して乗算するところまでは10分で出来たが、その後ActionScriptをどこに入力するかから調べ始めて、動くまで100分かかったw
作ってみてわかったのは、JavaScript+DHTMLをやるのと同じ感覚で出来そうだし、FLASHのオブジェクトが根本的に動かしやすくなっているっていうことです。
近日セミナーイベントが近くで行われるのですが、その日はドキッ男だらけのバーベキュー大会だったのでいけないなーと思ったが昨日確認したらそのいかがわしい大会は次の日だっていうことになったので、セミナーイベントに行くことにしました。
オープンソースカンファレンス2009 Niigata - [http://www.ospn.jp]
うむ、赤塚のほうじゃないんじゃな。
そろそろうちのWebサーバの入れ替えの話が出ているのでXenを使った仮想化のあたりを聞きたいかな。
実験る~む 次の「DTP Booster」は面白そうだ、けれどもしかし [dslabo.blog4.fc2.com]
問題はどちらかというと後者で「『DTP Booster実行委員会』という団体について、世間一般への説明が難しい」、というところ。
んーと地方からだと、どうせお金かけて出かけるんだから、主催者はともかくセミナーの時間が長ければ長いほど、もしくは連続で参加できるセミナーが多ければ多いほど出張申請が通りやすいこともあるんだって。
感想は特になし。
来月のOSC2009は土曜日で出勤日じゃないし、セミナーのコマが6コマ連続であるんで行きたいところだが、ドキッ男だらけのバーベキュー大会の予定が入っているので行かない。お昼のコマのサーバ仮想化技術のやつは聞きたいんですけどねえ……
Twitterの自分の書き込みをRSSの差分をとることで抽出して、JAGAT SNS [www.jagat.jp] に書き込みます。cronで好きな間隔でまわすといいよ。

▲JAGAT SNSのTodoに「全員に共有」設定でシンクロされます
ユーザーID、パスワードはConfig:Pitで管理する方式です。
パスワード設定をコードに書かない(Config::Pit) - モダンなPerl入門 - モダンなPerl入門 [perl-users.jp]
スクリプトを動かす前に、上記リンク先を参照して、コマンドラインからアカウントとパスワードをセットしておこう。こんな感じでいいのでは。
$ perl -MConfig::Pit -e'Config::Pit::set("www.jagat.jp", data=>{ username => "ABC12345", password => "password" })'
filename: twitter2jagatsns.pl
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use Config::Pit;
use Encode;
use URI::Fetch;
use XML::Feed;
use WWW::Mechanize;
# Twitterの自分のタイムラインのRSSを入れよう
my $uri = 'http://twitter.com/statuses/user_timeline/'
. '14119989.rss';
# aboutmeの自分のアカウント情報はConfig::Pitで
# あらかじめセットしておこう。コマンドラインからは
# $ perl -MConfig::Pit -e'Config::Pit::set("www.jagat.jp", data=>{ username => "ABC12345", password => "password" })'
my $config = pit_get("www.jagat.jp");
die "not preset account data in Pit." if !%$config;
my $username = $config->{username} or die 'username not found.';
my $password = $config->{password} or die 'password not found.';
my $mech = WWW::Mechanize->new();
my $past = './past.xml';
$mech->agent_alias( 'Windows Mozilla' );
# Main
parse();
exit;
sub parse {
my $content = load();
my $feed = XML::Feed->parse( \$content );
my $list; # 前回のfeedのlinkをキーとしてハッシュ作る
if ($feed) { # 前回のfeedが正常でない場合ループしない
foreach my $entry ( $feed->entries ) {
$list->{ $entry->link } = 1;
}
}
$content = get();
$feed = XML::Feed->parse( \$content );
exit unless $feed; # メンテナンスなどfeedが正常でない場合は終了
save($content);
my $list2; # 今回のfeedで前回のfeedに無いものが溜まるリスト
foreach my $entry ( $feed->entries ) {
if (!exists $list->{ $entry->link } ){ # 前回のfeedに無ければ
push @$list2, { title => $entry->title
}; # 今回のfeedからtitle(post内容)を格納
}
}
return if $#$list2 == -1; # 長さが0ならばparse終わり
# JAGAT SNSログイン
login( $username, $password );
# 新着分書き込み
for my $item ( reverse @$list2 ) {
(my $title = $item->{title}) =~s/^.+?: //o; #ユーザ名トルツメ
#print encode('utf8', $title."\n"); # デバッグ用
post( $title ); # JAGAT SNSへ投稿
}
}
sub get { # TwitterからRSSを取得
my $ua = new LWP::UserAgent;
$ua->agent('Mozilla/5.0 (Windows; U; Windows NT 5.1; '
.'ja; rv:1.9.0.6) Gecko/2009011913 '
.'Firefox/3.0.6'); # UAをFirefoxに偽装
$ua->timeout(20); # timeoutを20秒に設定
my $res = URI::Fetch->fetch( "$uri",, UserAgent => $ua )
or die URI::Fetch->errstr; # 未来のことを考えてURI::Fetch
return $res->content;
}
sub load { # 前回feedを読み込み
open my $fh, '<', $past;
my $content = do { local $/; <$fh> }; # 一気読み
close $fh;
return $content;
}
sub save { # 前回feedとして書き込み
my $content = shift;
open my $fh, '>', $past;
print $fh $content;
close $fh;
return;
}
sub login { # JAGAT SNSへログイン
my $username = shift;
my $password = shift;
my $res = $mech->get('http://www.jagat.jp/mypage/login.php');
$mech->form_number(2);
$mech->set_visible( $username, $password );
$mech->submit();
die 'Login Failed.' if ($mech->uri() =~m|https://www.jagat.jp/index.php?option=login|);
return;
}
sub post { # JAGAT SNS Todoへ投稿
my $text = shift;
my $res = $mech->get('http://www.jagat.jp/igns/?m=pc&a=page_h_home');
$mech->form_number(3); # HTML内の3番目のフォーム
$mech->set_visible( $text, [ checkbox => 1 ] ); # 見えているtextboxにセット
# checkbox=>1で共有書き込み
$mech->submit(); # 送信
return;
}
これをみんなで使うとJAGATのTodo欄がTwitterのタイムラインみたいになると思うよ。
(2009-08-27 09:50訂正)
WWW::Mechanizeの最新バージョンだと、投稿が文字化けしますので、以下のとおり訂正します。
post( encode('utf8', $title ) ); # JAGAT SNSへ投稿
↓
post( $title ); # JAGAT SNSへ投稿
さくらさくらというゲームについてくるエピソードブックという冊子もやはり小塚ゴシックELなんですけれども、67ページにサントラのボーナストラックの歌詞カードが掲載されているのですが、曲名が「C0M5Y2K0」でした。

▲さーくーらー、さーくーらー、さくらーい~ろ~(←別のゲーム)
淡いピンク、つまりさくら色ですね。仕込みが半端ない。
剣道大会が秋分の日に寒風山で開催されて試合中面越しに周りを見たらばみんな試合を見ずにガラスをライターであぶって日食観察用遮光具(現在非推奨)を作っていて何しに来たんだよーて思っていたら相手の白道着の白防具を着けた女の子の選手に面食らって1本取られた。
あと試合が終わったら父がきのこの山のチョコだけ食ってクラッカーだけ残してくれていた。確かにこの山自体ボウズみたいなもんだけどきのこの山をボウズにすることはあるまい。どうやら僕がきのこの山のクラッカーの部分が好きだと勘違いしていたらしい。もっと子供と会話しよう。つhttp://www.youtube.com/watch?v=zaKA_Vu7E4g
あと父が缶コーヒー飲んだらなぜか具合が悪くなって寒風山の大地に吐いていた。その後僕が成人するまでコーヒー飲まなかった。なんの意味があるかはついぞわからなかったが、吐いたのは僕のためにがんばって食べたチョコのせいだと思うよ。
大阪で開催された3回のDTP Booster開催後の参加者のブログなどによる反響を眺めているのですが、先週金曜日に行われたDTP Booster 004のあとのブログエントリがほぼ上がってきていないので(見つけたらdtpboosterタグなどつけてSBMしてください)、やっぱり大阪開催の地域的特徴があるなろうなーと思うわけです。
んで、「イベント開催後必ずブログエントリを書かなくてはならんのか?」と言われそうですが、イベント後のレポートがブログエントリとして書かれるというのは、いままでになかった風習ですから、やられなくてもしょうがないと思いますけれども、5年後あたりに「Boosterが始まった頃の様子を調べよう」と思ってネットで調べると、大阪開催の回だけネットでの反応が少なくて、やっぱり盛り上がりが少なかったのかなあと思われてしまうと思うので、そういう観測のされ方もされるということ、そしてそういう観測のされ方も一つの判断手段となっていくよ、ということを頭の片隅に置いておいたほうがいいかなーとも思います。
ただ、まだ東京と大阪の2か所でしか開催していないわけですので、他の個所で開催したら(やるのか?)やっぱり大阪みたいなネット上の反応になるっつーことかもしれませんね。しらんけど。
まとめ:
東京:DTPイベントやるとブログでの反応がある
大阪:DTPイベントやるとブログでの反応が薄い
その他の地域:不明(反応あるかもしれんし薄いかもしれん)
ついに、ちぎれちゃった。

▲クルマのカギ
12年目の車だし、さもありなん。
今度は国産車にするんだ。会社がつぶれてもう部品手に入らんのだ。
M.C.P.C.: 横取り40萬 というエントリで、「なにをつくっているんでしょーか」とか言いながらブレッドボードに組んでいたやつが完成しました。
▲フルカラーLEDを使用した光の三原色説明用教育訓練機材
会社で教育訓練するときに使う教材で、光の三原色を説明するためのものです。東京から通販でフルカラーLEDほか部品を購入して作りました。
むかーし、学研の6年の科学あたりで、赤と緑のLEDを使った教材があって、同じ時期、月刊I/Oで青色LED実用化、サンプル価格10000個オーダーで@1000とか書いていて、「青色LEDが安くなったら、3色組み合わせてフルカラーLEDできるじゃないかー」とか思っていたわけですが、最近フルカラーLEDがふつーに売られている [akizukidenshi.com] ということを知り、この機会に作ってみました。
作ってみてわかったのは、定格どおりに使っても青と緑が強いのでさらに半固定抵抗で調整する必要があるってことです。あと、発光ダイオードにかぶせる乳白色のカバーがないと、きれいな白になってくれません。もし作る人がいたらそこらへん注意です。
(2011-07-25追記)
コメント欄で回路の質問がありましたので、用意しました。
どこにも安全回路らしきものがないことが分かると思います。僕も実験ではPCからは電源をとらず、eleloop モバイルブースターから取りました。

M.C.P.C.: マイクロソフトにJIS2004の問題点を伝えるにはコールセンターに電話すればよかったってことか。 にて、マイクロソフトの上級部長のところには実情が全く伝わっていないっていうことがわかったので、マイクロソフトのコールセンターにクレームを入れようと思いました。
アドビと違ってさすがマイクロソフト、土曜日曜でもコールセンター受付があるのですね。というわけで、早速
マイクロソフト カスタマー サービス & サポート | 無償テクニカル サポート [www.microsoft.com]
の末部に載っているフリーダイヤルの電話番号に電話をかけて、現状の問題点を伝えてきました。
僕が伝えたのは、
- 僕は印刷屋さん
- お客様の希望の通りの印刷物を作るのが仕事、よって希望通りでない製品を納めたらクレームになる
- Vistaの登場で、お客様の使用OSによりお客様が見ている文字の字形が違うようになった
- 互換フォントパックのせいで、OSを特定してもお客様が見ている文字の字形が印刷会社側からはわからない
- 印刷会社は、お客様の環境により使用OSを切り替えて対応する余地はあるが、印刷会社側からお客様の使用環境を確認するすべが無い
- マイクロソフト側でデータの制作環境を確認できるツールを用意するべきではなかったか
ということです。
窓口のおねーさんはこちらの話を聞きながらパソコンに入力していきますので、ゆっくり伝えてあげました。
これで、少なくともマイクロソフトの中川哲氏(コマーシャルWindows本部本部長)は「クレーム0件」なんて言えなくなったはず。OSの使用に関するクレームを伝える手段がコールセンターでいいっていうのは収穫でしたね(本当に伝わるかどうかは知らん)。
あと、おねーさん曰く、「Windows 7 RC版のフォームにて今回の話を送信されると云々」いっていましたが、僕はWindows 7 RC版試用していませんので、それでも送れるのですか? と確認したら、やっぱりRC版試用者しかフォーム送信できないそうなので、RC版試用者は、そちらから文章として意見を送信をされるのもいいかもしれませんね。
昨日会社帰り飯を食いに飲み屋の親父に何でもいいから飯、とか言ったらば、カレーライスとカレイのフライが出てきた。
おやじに「わざとやってんの」とかいったら気がつかなかったらしいです。もう何でもありですね。
4月ぐらいに来たんだと思う定額給付金の申請をほっぽっていたんですが、今日うちに帰ってきたら新たに定額給付金申請書がお役所から郵送されてきていました。
実際申請書無くしてあきらめていたところだったのでちょうど良かったのですが、お金配るのにいくらかけているんだっていう話ですよね。お役所の人ごめんなさい。
画面はMac OS X 10.4上のNorton AntiVirus for Macです。

▲懐かしのAutoStart 9805
Mac OS 9マシンじゃなくてもちゃんと確認出来るって事で、安心ですね。
あと、Mac OS XマシンのみでMac OS 9/Mac OS X両対応の解凍・データチェックするためのソフトとして、HappyLHA [hp.vector.co.jp]、StuffItと9時間戻すAppleScript [dtpwiki.jp]、拙作AiVersionChecker [dtpwiki.jp] 等があります。
Mac OS 9マシンを使わなくてもいい部分はぎりぎりまでMac OS Xマシンで作業するのが効率化の鍵です。
Microsoftが総括「Windows Vistaにフォントの混乱なし」 - もじのなまえ [d.hatena.ne.jp]
細部は記事にゆずるとして、ぼくが重要だと思ったことは以下の点です。
- Windows Vistaによるフォント変更について、同社コールセンターに対し、クレームの電話は1件もかかってきていない。
- Microsoftは(今のところ)この件について、ユーザーに大きな混乱は発生しなかったと考えている。
Windows VistaにIllustrator10を入れたとき、逆にXPのWindowsUpdateで表示されたfontを入れてしまったとき、IllustratorでMSゴシック選択できなくなったとかいうのはOKWaveやDTP掲示板であがっていたけれども、印刷業界とMicrosoftの接点は10年以上前に途絶えているから(←僕の認識ね)、何ともないぜってことか。
神々の住む地から一歩も出ないで下界から声が聞こえてこなかった、ということでしょうから、
僕が作った http://instfont.info/ なんていうのは当然存じていらっしゃらないことでしょうね。問題提起にもならなかった。ちぇっ。
PCのウェブブラウザでみていたページで、「このページのURLをケータイに送りたい」とか、PCで難しい漢字を打っておいて、「この文字をケータイで使いたい」とかいったときにQRコードを使うと便利です。
ネットサーフィン(死語)中ちょうどいいエッチイラスト画像があったらすかさずケータイの待ち受けにするとか(個人利用の範囲内で)、よくするんですが、こういう話を女性にすると、よっぽどオタク趣味に理解のある人でもなぜか引かれるわけですが、これなんでなんでしょうね。するけど。
んで、そういう意味も含めて、自分の持っているドメインの中にこういう文字列をQRコードに変換するやつを設置すると。なんで自分の持っているドメイン内かっていうと、ほかの人が作ったやつだと、記録されているかもしれないじゃないですか。あと、今時だとGoogleのサービスでQRコード生成するやつがあるんですけれども、Googleは確実に記録しているぞきっと。趣味ばれるぞきっと。
というわけで、Perlを使って http://qr.dtpwiki.jp/ を便利なQRコード変換サイトとして設定する例です。無駄に大掛かりなんでほとんど参考にならないかもね。
1.サブドメインを作り、自分が管理しているサーバに向ける
僕はValue-Domainを使っています。クレジットカードさえあれば今すぐにドメインを取得できるから便利です。今回でいえば、qr.dtpwiki.jpを自サーバのIPに割り当てます。

▲Value-Domain設定
2.Apacheの/etc/httpd/conf/httpd.confに追加記述する
サーバにはCentOS5など使っていますからそれっぽく書きます。
<VirtualHost 192.168.6.16>
ServerAdmin webmaster@dtpwiki.jp
DocumentRoot /home/www/qr.dtpwiki.jp/html
ServerName qr.dtpwiki.jp
ErrorLog /home/www/qr.dtpwiki.jp/logs/error_log
CustomLog /home/www/qr.dtpwiki.jp/logs/access_log combined
<Directory "/home/www/qr.dtpwiki.jp/html">
AllowOverride All
</Directory>
</VirtualHost>
IPとかディレクトリは読み替えてね。
3.スクリプトを設置
Filename: /home/www/qr.dtpwiki.jp/html/qr.cgi
#!/usr/bin/perl
use strict;
use warnings;
use CGI::Carp qw(fatalsToBrowser);
use Encode;
use GD::Barcode::QRcode;
fixup();
my $url
= encode( 'cp932',
decode( 'utf8',
substr( $ENV{'PATH_INFO'},
1
)
)
);
my $barcode
= GD::Barcode::QRcode->new(
$url,
{
Ecc => 'M',
ModuleSize => 4,
}
);
{
binmode STDOUT => ':raw';
print "Content-Type: image/gif\n\n";
print $barcode->plot->gif;
}
sub fixup {
return if GD::Barcode::QRcode->VERSION > 0.01;
package GD::Barcode::QRcode;
no warnings 'redefine';
*init = sub {
my($oSelf, $sTxt, $rhPrm) =@_;
#CalcCd
$oSelf->{text} = $sTxt;
$oSelf->{Ecc} = $rhPrm->{Ecc} || ' ';
$oSelf->{Ecc} =~ tr/LMHQ/M/c; #Not /LMQH/ => M
$oSelf->{Version} = $rhPrm->{Version};
$oSelf->{ModuleSize} = $rhPrm->{ModuleSize};
$oSelf->{ModuleSize} = int($oSelf->{ModuleSize});
my $iDatCnt = 0;
my @aDatVal;
my @aDatBit;
my $raPlusWords;
my $iWordsPos;
$aDatBit[$iDatCnt]=4;
# Determin Data Type(8Bit, AlphaNumeric, Numeric .. not supported Kanji-Mode)
if ($oSelf->{text} =~ /\D/) {
if ($oSelf->{text} =~ /[^0-9A-Z \$\*\%\+\-\.\/\:]/) {
# --- 8bit byte mode
($iDatCnt, $raPlusWords) =
$oSelf->_cnv8bit($iDatCnt, \@aDatVal, \@aDatBit,);
}
else {
# ---- alphanumeric mode
($iDatCnt, $raPlusWords) =
$oSelf->_cnvAlphaNumeric($iDatCnt, \@aDatVal, \@aDatBit);
}
}
else {
# ---- numeric mode
($iDatCnt, $raPlusWords) =
$oSelf->_cnvNumeric($iDatCnt, \@aDatVal, \@aDatBit);
}
my $iTotalBits = 0;
for(my $i=0;$i<$iDatCnt;++$i){
$iTotalBits += $aDatBit[$i];
}
# Calc version(=Size)
my ($iMaxDatBits, $iCdNumPlus, $iMaxCodeWords, $iRemainBits);
($iMaxDatBits, $iCdNumPlus, $iMaxCodeWords, $iRemainBits) =
$oSelf->_calcVersion($iTotalBits, $raPlusWords);
$iTotalBits += $iCdNumPlus;
$aDatBit[$oSelf->{WordsPos}] += $iCdNumPlus;
$oSelf->{MaxModules} = 17 + ($oSelf->{Version} * 4);
my $iBitCnt = ($iMaxCodeWords * 8) + $iRemainBits;
my $iMaxDatWords=($iMaxDatBits / 8);
# ---- read version ECC data file.
my ($sMatX, $sMatY, $sMasks, $sFmtInfX2, $sFmtInfY2, $sRsEccCodeWord, $sRso);
my $sRec = do ('GD/Barcode/QRcode/qrv' .
sprintf('%02d', $oSelf->{Version}) . $oSelf->{Ecc} . '.dat');
($sMatX, $sMatY, $sMasks, $sFmtInfX2, $sFmtInfY2, $sRsEccCodeWord, $sRso) =
unpack(("a$iBitCnt" x 3) . ('a15' x 2) . 'a1a128', pack('H*', $sRec));
my $iRsEccWords = ord($sRsEccCodeWord);
my @aMatrixX = unpack("C*", $sMatX);
my @aMatrixY = unpack("C*", $sMatY);
my @aMask = unpack("C*", $sMasks);
my @aRsBlockOrder = unpack("C*", $sRso);
my @aFmtInfX2 = unpack("C*", $sFmtInfX2);
my @aFmtInfY2 = unpack("C*", $sFmtInfY2);
$sRec = do ('GD/Barcode/QRcode/rsc' . sprintf('%02d', $iRsEccWords) . '.dat');
my @aRsCalTbl = unpack("a$iRsEccWords" x 256, pack('H*', $sRec));
# ---- set teminator
if ($iTotalBits <= ($iMaxDatBits-4)){
$aDatVal[$iDatCnt] = 0;
$aDatBit[$iDatCnt] = 4;
}
elsif ($iTotalBits < $iMaxDatBits){
$aDatVal[$iDatCnt] = 0;
$aDatBit[$iDatCnt] = $iMaxDatBits-$iTotalBits;
}
elsif ($iTotalBits > $iMaxDatBits){
die "Overflow error. version $oSelf->{Version}\n" .
"total bits: $iTotalBits max bits: $iMaxDatBits\n";
}
# 8ビット単位に分割
my $iCodeWords=0;
my @aCodeWords;
$aCodeWords[0]=0;
my $iRestBits = 8;
for(my $i=0;$i <= $iDatCnt; ++$i) {
my $sBuff = $aDatVal[$i];
my $iBuffBit = $aDatBit[$i];
my $iFlg=1;
while ($iFlg) {
if ($iRestBits > $iBuffBit) {
$aCodeWords[$iCodeWords]=(($aCodeWords[$iCodeWords] << $iBuffBit) | $sBuff);
$iRestBits -= $iBuffBit;
$iFlg=0;
}
else {
$iBuffBit -= $iRestBits;
$aCodeWords[$iCodeWords]=(($aCodeWords[$iCodeWords] << $iRestBits) | ($sBuff >> $iBuffBit));
if ($iBuffBit==0) {
$iFlg=0;
}
else {
$sBuff= ($sBuff & ((1 << $iBuffBit) -1 ));
$iFlg=1;
}
$iCodeWords++;
if ($iCodeWords<$iMaxDatWords-1){
$aCodeWords[$iCodeWords]=0;
}
$iRestBits = 8;
}
}
}
if ($iRestBits != 8) {
$aCodeWords[$iCodeWords] <<= $iRestBits;
}
else {
--$iCodeWords;
}
# Padding data
if ($iCodeWords < $iMaxDatWords - 1 ){
my $iFlg=1;
while ($iCodeWords < ($iMaxDatWords-1)){
$aCodeWords[++$iCodeWords] = ($iFlg==1)? 0xEC : 0x11;
$iFlg *= -1;
}
}
# ---- RS-ECC prepare
my $iRsBlock=0;
my @aRsTmp=();
my $j=0;
# Divide RS-Blocks
for(my $i = 0; $i < $iMaxDatWords; ++$i) {
$aRsTmp[$iRsBlock] .= chr($aCodeWords[$i]);
if (++$j >= $aRsBlockOrder[$iRsBlock]-$iRsEccWords){
$j=0;
++$iRsBlock;
}
}
# RS-ECC main
for($iRsBlock=0; $iRsBlock <= scalar(@aRsBlockOrder); $iRsBlock++) {
my $sRsCodeWords = $aRsBlockOrder[$iRsBlock];
$sRsCodeWords ||= 0;
$sRsCodeWords =~ s/\n//g;
my $sRsTmp = ($aRsTmp[$iRsBlock] || ''). (chr(0) x $iRsEccWords);
for($j = ($sRsCodeWords - $iRsEccWords); $j>0; $j--) {
my $iFirst = ord(substr($sRsTmp, 0, 1));
if ($iFirst != 0){
$sRsTmp = substr($sRsTmp, 1) ^ $aRsCalTbl[$iFirst];
}
else {
$sRsTmp = substr($sRsTmp, 1);
}
}
push(@aCodeWords, unpack("C*", $sRsTmp));
}
# ---- put data
# ---- flash matrix
my @aCont;
$oSelf->{Cont} = \@aCont;
for(my $i=0;$i<$oSelf->{MaxModules};$i++) {
$aCont[$i] = [ (0) x $oSelf->{MaxModules}];
}
for(my $i=0; $i<$iMaxCodeWords; $i++) {
my $iCodeWord = $aCodeWords[$i];
for(my $j = 7; $j >= 0; $j--) {
my $iCodeWordBitNum = ($i * 8)+$j;
$aCont[$aMatrixX[$iCodeWordBitNum] ][ $aMatrixY[$iCodeWordBitNum]]
= ((255*($iCodeWord & 1)) ^ $aMask[$iCodeWordBitNum]);
$iCodeWord >>= 1;
}
}
for(my $iMatrixRemain = $iRemainBits; $iMatrixRemain; $iMatrixRemain--) {
my $iRemainBitTmp = $iMatrixRemain + ($iMaxCodeWords * 8);
$aCont[$aMatrixX[$iRemainBitTmp]][$aMatrixY[$iRemainBitTmp]]
= (255 ^ $aMask[$iRemainBitTmp] );
}
# ---- mask select
my $sHorMst='';
my $sVerMst='';
for(my $i=0; $i < $oSelf->{MaxModules}; ++$i) {
for($j=0 ; $j < $oSelf->{MaxModules}; ++$j){
$sHorMst .= chr($aCont[$j][$i]);
$sVerMst .= chr($aCont[$i][$j]);
}
}
my $iMask = $oSelf->_calcMask($sHorMst, $sVerMst);
$oSelf->{MaskCont} = (1 << $iMask);
# ---- format information
my %hFmtInf =(
'M' => [
'101010000010010', '101000100100101', '101111001111100', '101101101001011',
'100010111111001', '100000011001110', '100111110010111', '100101010100000',],
'L' => [
'111011111000100', '111001011110011', '111110110101010', '111100010011101',
'110011000101111', '110001100011000', '110110001000001', '110100101110110',],
'H' =>[
'001011010001001', '001001110111110', '001110011100111', '001100111010000',
'000011101100010', '000001001010101', '000110100001100', '000100000111011',],
'Q' => [
'011010101011111', '011000001101000', '011111100110001', '011101000000110',
'010010010110100', '010000110000011', '010111011011010', '010101111101101',],
);
my @aFmtInfX1=( 0, 1, 2, 3, 4, 5, 7, 8, 8, 8, 8, 8, 8, 8, 8);
my @aFmtInfY1=( 8, 8, 8, 8, 8, 8, 8, 8, 7, 5, 4, 3, 2, 1, 0);
my @aContWk = split //, $hFmtInf{$oSelf->{Ecc}}->[$iMask];
for(my $i = 0; $i < 15; ++$i) {
$aCont[$aFmtInfX1[$i]][$aFmtInfY1[$i]] = $aContWk[$i] * 255;
$aCont[$aFmtInfX2[$i]][$aFmtInfY2[$i]] = $aContWk[$i] * 255;
}
return '';
};
return 1;
}
ポイントはGD::Barcode::QRcodeのバグをオンデマンドのパッチで直しているところですが、直すべきサブルーチンがでかすぎるのでこんなことに。
参考:
GD::Barcode::QRcodeのバグ?の件について - libnitsuji.so [d.hatena.ne.jp]
4. .htaccessを書きます
Filename: /home/www/qr.dtpwiki.jp/html/.htaccess
Options +ExecCGI AddType application/x-httpd-cgi .cgi DirectoryIndex qr.cgi RewriteEngine on RewriteRule ^qr.cgi - [L] RewriteRule ^(.*)$ qr.cgi/$1
これで、http://qr.dtpwiki.jp/ほげ で、表示できるようになります(PATH_INFOってやつでしょうか)。
んで、実際に http://qr.dtpwiki.jp/ほげ とすれば、表示されたQRコードをケータイで撮影すると「ほげ」と表示されると思いますし、http://qr.dtpwiki.jp/http://blog.dtpwiki.jp/ とかするとこのブログがケータイで見られるんだと思います。
んで、上記設定を見るとわかりますが、ログに残ります。自分で設置するときはそこらへんも考えましょう。
そんでエッチなイラストは、普段もって歩かない方のdocomo端末にいれるわけですが、それをi-modeでダウンロードするために、普段もって歩く方のdocomo端末からFOMAカードを移してダウンロードして待ち受けに設定するのですけれども、ダウンロード済みコンテンツはFOMAカードにひも付けされているので、FOMAカードを元に戻すと待ち受けが表示されなくなるという。SDカードに移して戻すとひも付けが切れるみたいですね。なんだかなあ。
Planet DTP@jp [dtpwiki.jp] というのを4年半前に設置しまして、使ってもらっていたんですけれども、このたび、これを生成しているPlanetPlanetのpythonスクリプトを入れ替えました。
実は結構エラーはいていたんです。登録したのに表示されないサイトがあったりしたのはこのせい。
あと、ATOMに未対応だったが対応となりました。
インストールスクリプトが無い時代のものを使っていたんですが、今時のはちゃんとインストールスクリプトがある。そんで、インストールスクリプトでインストールしたのが1年前で、そのまま放置していたのをこのたび思い出したっていうわけです。
Planet DTP@jpは、最近登録が追加・変更されるようになってきたようですので、ぜひご活用ください。
デザインの現場 小林章の「タイプディレクターの眼」 : 「似た」フォントって [blog.excite.co.jp]
ちょっと前に騒がれた(というか多くのデザイナーにすっごく嫌われた)Arial (アリアル)は、ライノタイプのトップセラー書体 Helvetica(ヘルベチカ)のクローンだと言われました。大手ソフトウェア会社が、ライノタイプにライセンス料を払わずに「素人目には Helveticaっぽい書体」をOSに搭載したわけです。実際に重ね合わせると、文字の輪郭そのものは微妙に違っています。でも、字幅がぴったり同じなんです。ここです。書体デザイナーを始め、文字に詳しいデザイナーの多くが「反 Arial」を声高に叫んだのは。
Arialのフォントファイルには、モノタイプのコピーライトが入っているけれども……? ライノタイプのHelveticaを採用せずに(=当然、ライセンス料を払わずに)、モノタイプのArialを採用したのではないでしょうか。
Windows 3.1でスケーラブルフォントの形式、TrueTypeフォントとして同梱されたArialは、PostScriptで出力するとHelveticaに置換されるよう設定されていて、いわばHelveticaのスクリーンフォントというべき存在だったものですから、字幅が同じでないとフォント置換しても字がくっついたり離れたりしますので、これはもともとそういう製品として作られたと考えるといいと思います。
(今の製品のArialが全てにおいてHelveticaと字幅や字送りが同じかは僕は調べていない。というのは、今はArialの指定があればArialで出力できる時代になっているからです。)
字幅や字送りに関しては、例えばワープロソフトで文字を打つとき、フォントに設定されている字送りに従って表示された文字を人間の目がとらえ脳で判断が入り次のプロセスに移っているわけで、どんなくだらない挨拶状であったとしても、文字の位置についてはユーザの成果物であって、フォント制作者の都合のみで字幅や字送りを語るのは一面的な見方ではないかなと思います。
Arialを使うのがイヤとかいうのは、各個人の信条の問題だから、そう思った人がライノタイプのHelveticaを購入して使えばいいだけの話ですよね。
出力の手引きWeb 縦書き文字に透明効果で文字が欠ける問題:大日本スクリーン製造株式会社 メディアアンドプレシジョンテクノロジーカンパニー [www.screen.co.jp]
この件についてもっと掘り下げると、OutlinePDFの場合(従来工程)はAcrobat 8の表現で固定化、OutlinePDF Advancedの場合、OutlinePDF Advanceを開くAcrobatのバージョンによって表示が異なる、っていうことになりまして、OutlinePDF Advanceは校正に使えねーていうことになってしまうわけですが、そういう理解でいいのでしょうか。
OutlinePDFはPDF校正にもおいしく使わせていただいておりました。
あさうすさんのところのアンケート [dslabo.blog4.fc2.com] が死ぬほどおもろい。
これ書いている時点で93人がアンケートに参加しているのだけれども、30代〜50代以上で75%を占めている。おっさんすぐる。僕もblog始めた時点では20代だったんだけどいつの間にか75%のほうに入ってた。これは参った。
ともかく93人もblogやっとる人がいるっつーことはわかった。
そこで、はてなダイアリー以外のblogを使っているはてなID持っている人に朗報。僕があなたのblogエントリをブックマークした瞬間、あなたへはてなポイントが10ポイント送られる、つまり興味深いエントリを書いたら10ポイントもらえる方法を教えちゃいます。
以下の記述をあなたのblogのテンプレートに仕込みましょう。
<!--
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:foaf="http://xmlns.com/foaf/0.1/">
<rdf:Description rdf:about="(エントリのPermalink)">
<foaf:maker rdf:parseType="Resource">
<foaf:holdsAccount>
<foaf:OnlineAccount foaf:accountName="(自分のはてなID)">
<foaf:accountServiceHomepage
rdf:resource="http://www.hatena.ne.jp/" />
</foaf:OnlineAccount>
</foaf:holdsAccount>
</foaf:maker>
</rdf:Description>
</rdf:RDF>
-->
さて、これでなんでポイントがもらえちゃうのかといいますと、以前僕が書いたエントリ
M.C.P.C.: はてなブックマークリニューアルで削除されたはてな投げ銭機能をはてなブックマークWeb Hookを使って復活(ある意味以前よりも強力に)
にて書いたスクリプトを僕自身が設定していますので、ブックマークしたページに上記記述(Account Auto-Discovery)が設定されていると自動的にはてなポイントを10ポイント送信するようになっているのです。
DTP関係のブログをやられている人のエントリを見ていますと、反応がないのでblogやめたとか、モチベーション下がったとか書かれている人がいますから、実際お金に相当するはてなポイントを送付すればやる気出してもらえるもんかなーと思ったわけですけれども、DTPのブログやっている人ははてな投げ銭やAccount Auto-Discoveryの話題がはやったときはおそらくその話題を知らないだろうから、今回あえて書いてみました。
あと、はてなダイアリー使っている人は設定なしでポイント送信対象になっていますのでご安心を。
最近InDesignのJavaScriptなどで
( function( ) { ... } ) ( )
という書き方が流行っていて、昔Webのほうで流行っていたクロージャで書く書き方が数年遅れでDTPの世界にやってきたのかと思ってウルッときましたが、
何のことはない、
の作例がそうなっていました。
ちなみに僕がこの書き方覚えたのはFirefoxのGreasemonkeyスクリプト書いた時です。
(2009-7-9 13:29追記)
古籏さん(書籍の筆者)のblogで補足が書かれていました。
OpenSpace更新情報: 雑談:InDesign自動処理実例集のJavaScriptの書き方の補足 [www.openspc2.org]
サンプルコードは、あくまでも分かりやすく書いたサンプルなのですが、グローバル変数なども使っていた、動作条件が異なっていたりと、連続してコピー&ペーストして使われると動作することは、まずありません(中途半端に動作する)。
ということで、コピー&ペーストしても動作するように(function(){ 〜〜〜〜 })()といった書き方にしてあります。
さくらさくらというゲームを買ったんですけれども、タイトルロゴからして小塚ゴシックだったわけですけれども、マニュアル類も全部小塚ゴシックでした。
こういうゲーム久しぶりに買ったんですけれども、Adobeのソフトを購入すると付いてくる小塚ゴシックは印刷物制作を専門としていないところではまず選択される傾向にありますよね。
LANDISK HDL-GT1.0という250GB HDDを4台搭載しているRAID対応NASを使っています。
先回は2009.3.26にHDD一台がお亡くなりになったわけですが、今回またお亡くなりになりました。
そんで、秋葉までひとっ走りして、交換用HDDを2台買ってきました。平日には行けないもんね。
リビルド中の表示。
250GBよりも500GBのほうが安いという逆転現象が起きているんですよね。
しかし、一度交換したドライブがまた逝ってしまうとは。いまどきだと1TBのHDDをRAID1ミラーリングしたほうが読み書きも早いだろうし、縮退モードからリビルド中にもう1台逝ってしまわれる心配もRAID1のほうがはるかに少ないよなーと思いました。
新聞でこんなのが載ろうとは。

▲新聞「ZIPでくれ」
この奇妙な新聞の正体は印刷業界向けの業界紙っていうやつです。こうやってクリッピングしてみると、普通の人から見るとネタになりそうな見出しもゴロゴロしているのですね。
業界紙なんて業界以外の人は見る機会がないのだから、業界の人はおもしろげと思ったらクリッピングしてWebに出しておくと、業界外の人へ印刷業界の人もネットに居るよーというアピールになると思います。
往復はがきの宛名印刷をしているわけですけれども、ものすごく暇であれば、ExcelからContactXMLに変換して、筆王に取り込んで印刷するところなんですけれども、ものすごく多忙ですので、InDesign CS2から実装された「データ結合」を使って、Excelから書き出したCSVファイルを使い往復はがきサイズのドキュメントを生成して、宛名印刷をしているところです。
とりあえず305枚のうち本日分100枚は終わりました。データ結合便利だよ!
ところで、こういう一枚ごとに別のデータを印刷するのは、Microsoft Wordでは、「差し込み印刷」といわれているものです。
アドビの人が、InDesign CS2の日本語版のメニュー項目の日本語名を考えるとき、「Data CombinationData Merge」をそのまま「データ結合」としてしまったのはセンスが悪いと思います。なんで、「差し込み印刷」っていう単語を思いつかなかったかなあ。
(2009-7-3 12:36訂正)
コメント欄で指摘がありまして、訂正しました。
<del>Data Combination</del><ins>Data Merge</ins>
でもMergeっていったらいよいよ単語としておかしいよなあ。別種のデータソースをどちらかの種類のデータソースにするのは合流と言うよりは統合というのではないかなあ。
町の先輩に、この地域の厄年学年男子への祈祷の参加確認往復はがきの印刷・宛名印刷の依頼を受けたが、僕の勤める印刷屋さんではもうはがき印刷は受け付けないということになっているから会社では受けられんというので、はがき刷り込みは地元のほかの印刷会社さんをお願いし、宛名刷り込みは我が家のプリンタで行うことになりました。ここら辺ではオンデマンド印刷機を持っているところは無いようなのです。
しかし、名簿整理をしていたらどうみてもうちの会社におる先輩の名前が2名ほどあるんだけれども、そっちに依頼しないでこっちに仕事が来た意味が分からん。答えをいうと、飲み屋でお世話になっている先輩だったりします。まいどあり。
秋月電子から通販で電子部品を買って、教育訓練用の教育教材を作ろうと思っていまして、部品はもうかってしまって、ブレッドボードにもう組んでいるんですけれども、さて実際に蛇の目基盤にはんだ付けしようと思ったら、共晶はんだとはんだ吸い取り線は見つかったが、はんだこてが行方不明。
コメリに売ってないんだよね、はんだごて。







