perlの再帰でlocalの使い途
perlでディレクトリを辿ってファイルをリストする。
というのは File::Find というモジュールがあるのでそれを使えば一発で解決するんだけど。自分のモジュールに組み込む方法がよくわからず。
File::Find - ディレクトリツリーを辿る
https://perldoc.jp/docs/modules/File-Find-1.19/File/Find.pod
読んでもなんか使い勝手が違う、というかナニソレwanted?
てことで自分のモジュールで使えるものを自作。
「static」というディレクトリ以下にある、ホームページ用のhtmlファイルをリストアップする。というもの。以前から同じことをやってるスクリプトからの使い回しのサブルーチンの再帰。
use vars qw( $HTML );
〜〜〜〜〜
〜〜〜〜〜
sub parse_static{
my $self = shift;
my $args = shift;
my @dirs = ();
my $d = ($args->{dir} || 'static');
opendir(DIR, $d ) || die;
@dirs = grep(!/^\.\.?/, readdir(DIR));
closedir(DIR);
foreach my $f (sort @dirs){
if(-d $d . '/' . $f ){
$self->parse_static({dir=> sprintf(qq{%s/%s}, $d ,$f) });
}
else{
push(@{$HTML}, $d . '/' . $f) if $f =~ m!\.x?html!;
}
}
return $HTML;
}
1)ディレクトリ一覧を取得して
2)ファイルなら配列に放り込んで
3)ディレクトリなら(1)に戻る
というありがちなスクリプト。
…なんだけど、放り込む配列は use vars を使ってのグローバル変数。そうグローバル変数!なのが前から気に入らなかった。
もっと「かっこいい書き方」があるんじゃないかと。わたしのような野良、素人にとって「かっこいい」かどうかがポイント。
検索してみた。やっぱりこれも以前からちょっと気になってた my と local の違いがきっと魔法の種だと思ったらビンゴだった。
Perl で再帰呼出し時のスタック間データ共有
https://amachang.hatenablog.com/entry/20061010/1160506848
知りたかったのが、まさにこれ。かっちょええよなあ。
ダイナミックスコープとかレキシカルスコープとか意味は分からない、グローバル変数を局所化するとかも分からない。
けど、匂いでわかるかっこよさ。さっそくこのままいただいた(多謝!
sub parse_static{
my $self = shift;
my $args = shift;
my @dirs = ();
my $d = ($args->{dir} || 'static');
local $ongoldenpond::html = $ongoldenpond::html;
opendir(DIR, $d ) || die;
@dirs = grep(!/^\.\.?/, readdir(DIR));
closedir(DIR);
foreach my $f (sort @dirs){
if(-d $d . '/' . $f ){
$self->parse_static({dir=> sprintf(qq{%s/%s}, $d ,$f) });
}
else{
push(@{$ongoldenpond::html}, $d . '/' . $f) if $f =~ m!\.x?html!;
}
}
return $ongoldenpond::html;
}
おかげで、このサブルーチンの中だけで記述が完結することができた。
パッケージ名ongoldenpondというのは、わたしがここんとこどっぷりハマってる 個人ホームページ(On Golden Pond) 用のオレオレMovableTypeのスクリプトだから。
このブログ『ひまつぶし雑記帖』にはperlの小ネタもあるから、その手のも集めて、改めて個人ホームページに掲載するかなあ。
前にも書いたように、ここは日常雑記のために記法というか、書き込んだものを変換するけど、perlやhtmlのコードをそのまま掲載しても見づらいだけになってしまう。今さら変換規則を変えると過去25年以上の分全部に影響するんで、HTMLやperlのコードをそのまま掲載できる個人ホームページの方が見やすくなる。
ちょっと整理してみるか。
「よんでますよアザゼルさん」
アザゼル篤史とベルゼブブ優一
たぶん、今、こんなものTV放映したら大騒ぎだろう(最上の褒め言葉
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
馬鹿馬鹿しい書類と判子仕事
書類と判子の必要が理解できない。
食うためにショップのバックヤード仕事もやっていて、わたしのキャリアになかった事務仕事も。そこで出てくる書類の山、いくつものキングジムの分厚いファイルスーパードッチに束ねられた紙の山。現状とは違っているまま放置されているマニュアルの山。
エクセルやワードなどのオフィスソフト、ファイルメーカーなんかも使ってるのに、なにこのゴミ屋敷状態。
どのソフトも「紙を出力するため」にある。
数年前に少しいたところもホームページで集客といいつつ、FAXでDM、電話営業で基本はすべて紙の台帳、帳簿。
ひとつひとつに、見積書、納品書、請求書の3種類の紙が必要となる。社判と代表印を3回押印する。
100回以上ハンコを押してるとさすがに馬鹿馬鹿しくてやってられん。
こんなことで数時間分のコストをかけてることを疑問に思わないんだろうか。これもひとつの雇用創出というやつなんだろうか。
ITとかネットとかで仕事をすることが多く、その中にいたもんだから、ITのありがたみも頭で理解してただけだった。ここにきて、ものすごく今さら、ITのありがたみを体で実感した。
あほらしいなあ。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
固定レイアウトのSVG指定
先日公開した『kindle猫写真集』https://t2aki.doncha.net/?id=1382691748 の固定レイアウト、SVGでの指定について補足自分メモ。
KADOKAWAグループのEPUB制作仕様が公開されたので中を見たところ、画像は固定レイアウトにしてSVGで記述する、ということなのでちょっとだけ調べた。
目次画像用に使ったxhtmlファイル
(画像のサイズは 900x1270 で、画像の中に目次がある)
※KADOKAWAの仕様ではまだ「imageマップは使わない」となっているけど、ibooksなどEPUB3では使えるので目次に使った(クリッカブルマップのSVG版、かな)
上記のxhtml、もろもろ呪文状態で使ってるんだけど
svg(SVGで画像表示の設定。XMLだ)
・viewBox
画像領域のどの部分を切り取るかという指定(画像領域の左上からxyの座標を指定する)上記だと、x座標0、y座標0、幅900、高さ1270
・width height
viewBoxで切り取った画像領域をブラウザ(リーダー)で表示するサイズを指定。上記だと幅100%、高さ100%と目いっぱい表示するように指定(opfや、metaタグのviewportだったりで表示サイズを900x1270に指定してあるので天地左右100%でOK)
image(実際の画像ファイルの指定)
・実際のサイズを指定してファイルを指定する。 HTMLだとimgタグ。
rect(四角領域を作ってクリッカブルマップ)
・xy座標と、幅高さを指定してその四角の中は透明で埋める(fill-opacity)この四角を目次のリンクにする(HTMLのusemapより指定のしかたが分かりやすい)
一枚画像だけのためのxhtmlファイルなので愛想もなにもない短い単純なファイル。
固定レイアウトは画像サイズも揃えるので、画像ファイル名だけが違うxhtmlが画像の数だけ単調に並ぶ。
KADOKAWAのEPUB仕様では、リフローだとspine部で該当ページだけ固定レイアウト指定することになっている。
本文に混じる挿絵や見開き横長挿絵のために固定とリフローの混在がkindleやibooksで使えるようになってからが本番、だな。
KADOKAWA-EPUB PORTAL(EPUB制作仕様ページ)
https://kadokawa-epub.bookwalker.co.jp/home
↑これはかなり細かくて丁寧な資料なので、オススメ。
- 『おかえりください』サウンドノベルWINDOWS版
- 『おかえりください』本編を加筆修正、6つのバッドエンド分岐シナリオを追加してサウンドノベル化!
音と映像が、血まみれのこっくりさんの惨劇を蘇らせる。 - 【無料体験版】はこちら
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
kindle KDPの審査
Kindle Direct Publishing に登録して審査でひっかかったという事例がわたしの見る範囲だけで数例あった。(某掲示板でもひっかかったという事例があがっているとのこと)
「上記の本の権利をお客様が保有していることを証明する書類等をご提出ください。」ということらしい。
以下、憶測で書いてしまうと。たとえば、わたしが「村上春樹」「1Q84」をデータ化、販売しようと登録した、ということだろうな(こんな露骨な海賊版はさすがにないだろうけど)わたしが見たケースは、アマゾンe託で紙印刷本を販売していて、それの電書版を登録したら著者証明してください、と。
e託を使って出品するのをまとめてやってくれるところがあって、そこに委託してe託で出品(言葉がややこしいな)していて、電書を著者本人が登録。アマゾンからみると、先に販売されている本と同じタイトル・同じ著者・同じ内容の電書を先に販売しているアカウントとは別のアカウントが販売しようとしている、と見える。海賊版に該当する。
アマゾンは巨大な書店・小売店。巨大なのでいろいろ考えなきゃいけないことがあるにしても、単純に小売り店だ。顧客・消費者第一でクレームなどには個別に対応する。それと同時に、仕入れ側の版元も大事な顧客。扱ってる本については判断しない。表現の自由なんてのが絡む検閲行為はしないはず。
「購入したお客さんからクレームがあったから、ちょっと販売停止にさせてもらうね」はあっても「これはマズイから扱いません」はない。
ちなみに、版元には、司法行政による指導がはいったり協会による自主規制があったり、内容を吟味・判断する機構機能がずいぶんと練られて蓄積されてきている。解決はされてないけどね。
でも、内容について判断はできない・しないけど、著作権などの権利侵害は単純に判断できる。ここをきちんとやらないと、消費者側に対しても、版元側に対しても、店(アマゾン)の信用がガタ落ちになるし、訴訟沙汰に繋がるリスクは現実的で大きいので厳しくみてるはず。もちろん漏れはあるだろうけど、当たり前の話、アマゾンは取り扱い商品すべてデータベース化している。タイトルや著者名、内容の一部など審査でチェックするのは簡単。
今回審査にひっかかったひとの事例から、アマゾンは既存の出版社の出版物だけでなくて、個人出版物の権利についても気を配っているという信用に繋がる、とも言えるかな。
もうひとつの側面。kindle化リクエストリンクボタンの存在。アマゾンの顧客最優先は有名。紙印刷の本がこっちのページ、電書はあっちのページなどと顧客に不便をしいるのはありえない、んだろうな。(だいたいそんなとっちらかったサイトは動線もなにもあったもんじゃないし)なので、別アカウントでの登録で、同じものがあちこちのページに散らばらないようしたい。
てことで、KDPに登録する際はe託で販売中の本のことも考えてやる必要がありそう。
e託で販売するために、とりまとめてくれてるところに委託するのは、コスト的にも合理的だと思う。中間に入ってもらうことで、アマゾンからの細かいリクエスト(5冊納品してね、2冊納品してね)に対して労力・送料などをいちいち考える必要がなくなる。
まだまだ紙印刷の本の方が馴染み深いので、理想は紙印刷した本と電書を並行して並べること。
e託委託をお願いしつつ、電書も並べる方法があればベスト。だ。
[2013/02/11 12:54:54] 追記
今日、2013年2月11日公開となった『星待ち花の揺れる庭』(日野裕太郎・みさわりょう)がKDPの審査にひっかかった。
Kindle版
同人誌版(※現在取り扱いはありません。品切れ絶版)
KDPの審査から届いたメールの一部。
今回お客様のタイトルをKindleストアで販売させていただくことになり、大変嬉しく思っております。Amazonでは著作権を最も重視しており、著者や著作権保持者が所有する本が、第三者から著作権侵害の申告を受けたり、第三者によって販売されているものではないことを確認させていただく必要があります。したがいまして、お客様の以下の本に関していくつかお伺いしたい点がございます。
〜中略〜
お客様がこのタイトルを出版する権利を保有していること(中略)を示す書類を提出してください。
案の定、というか上記した理由と同じだった。でもって、ポイントも対応も同じ。
「Amazonでは著作権を最も重視しており」
これは安心感がある。個人出版物だからといって粗雑・軽く扱わないできちんと権利関係は見てるということ。
で、具体的に何を提出したかというと、ちょっと困った。同人誌の印刷などは印刷所とメールベースでやりとりしているし、タイトルなどもその時点では入れてない。紙・書類がない。
幸いというか、今回ひっかかったのは「密林社」さん経由で委託した本。「著者セントラルページ」を作る時に、アマゾンから密林社さんにアカウント関連の問い合わせが行っていて、その時点でわたしのメールアドレスとアカウント、そして著者名などの紐付けが、アマゾン側で確認できている、はず。てなことをメール本文で、該当本のアマゾンでのURLや、著者セントラルページなどをお知らせしたら、審査通過で公開、となった。
今後、もしかすると、自分で全部やる場合があったとしたら、印刷所に発注して請求書・領収書の時点でタイトルなどの情報をいれておいた方がいいかもしれない。
木曜日に登録・翌日金曜日に審査から連絡・その日のうちに返信・今日月曜日に公開。
このレスポンスの早さは本当に感謝。
[2013/02/21 10:25:16]追記。
やはり同じ理由で審査にかかった田亀源五郎さんのツイート
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
IE8で表示がバグってた
読書SNSの本棚のタブメニューがIE8で表示バグ。いや、気づいてたんだけど、IEなんてもうイラね、と放置。
タブメニューが4つほどあって、その各々でやることが違う=コンテンツ量が違うので、コンテンツ部分のdiv要素の高さが違う。
これをjavascriptで display:block noneを切り替えるわけだが。
FireFox、Safari、IE7は意図どおり、コンテンツ部分の高さに合わせて、親要素の高さを広げてくれるんだけど、IE8はコンテンツ部分の高さを広げてくれない。ケイ囲み(親要素)からべろ~んとコンテンツがはみ出してみっともないったらありゃしない。floatした子要素の高さを親要素に伝えるためのハックをスタイルシートには適用してあるんだけど、なんでやねん、と。ごそごそスタイルシートをいじったりHTMLに直接styleを埋め込んでみても、ちっともいうことを聞きやがらず、すっかり放置だった。
朝から団地の掃除、イトーヨカドーの特売、と地域密着活動の合間を縫って、見直してみた。結果。
javascriptで切り替えるときに、親要素もいじれば意図どおりになった。
id.style.display='none'
id..parentNode.style.display='none'
id..parentNode.style.display='block'
id.style.display='block'
IE8はけっこうまともという話なので、本来こうすべきところ、なのかな。
ちなみに、
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
こんなのヘッダに入れると強制的にIE7互換表示モードにしてくれるんだけど、このIE7互換がいい加減っぽくて、本当のIE7と表示が違ってたりするんで困ったちゃんでした。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」
せっかくの週末なのに
曇天雨混じりの寒空、だ。おまけに、週末まで、ブラウザ間の解釈に違いにムカつく。
Ajaxで取ったデータをコンテナに流し込んで、そいつをポップアップ風に表示する、てのはありがちなこと。で、「ポップアップ風」てのはページ上の最前面に表示するのが当然なので、z-indexというのを使う。
こいつの解釈が、FireFoxやSafariと、IEで違ってるので悶絶。ありえねえ。
firefox safari
z-indexが最優先。z-indexの大きいものが必ずページ上最前面に表示される。
z-indexの指定がなければ、HTMLの順番(後ろのものが上に)
ie
HTMLの順番がz-indexよりも優先される、っぽい。z-indexの指定に関わらず、HTMLの後ろに別のコンテナが書かれていたら、それが上となってz-indexで表に出したいコンテナは下に潜りこんでしまう。
ieでz-indexの指定を、別のコンテナに適用するには、z-indexを指定したコンテナの親コンテナにもz-indexを指定して前面に出すか、後ろのコンテナにz-indexを指定して背面にまわすか。
if(document.all){
$(c).parentNode.style.zIndex=999;
}
って、なんでieだけのために、と思いつつ入れてみた。とりあえず、直後のコンテナに対しては意図どおり…だけど、さらにコンテナをまたがってポップアップすると、さらに後ろのコンテナにz-indexの指定が勝てなくて、下に潜り込んでしまった。
もうなんかね。ieにイラついたので、ieの時だけ。
HTMLのフッター部分に(最後に)ポップアップ用の空コンテナを用意、
body左上(0,0)から表示位置にある該当div要素の座標を取得して、
絶対位置指定で表示
function get_offset(ele) {
var ele = (typeof ele == 'string') ?
document.getElementById(ele) : ele;
var valuetop = 0, valueleft = 0;
do {
valuetop += ele.offsetTop || 0;
valueleft += ele.offsetLeft || 0;
ele = ele.offsetParent;
} while (ele);
return {left:valueleft, top:valuetop};
}
body左上から、divなどblock要素の座標を取得するスクリプトを、検索しまくり。ありがたくいただいた。
ううううむ。しかし、こんなしょーもないことに半日も取られてしまって…ふぁっきんIEが。
» ローカル環境で電子書籍を作る、Macアプリ・Windows版ツール 「かんたんEPUB3作成easy_epub」