2010年3月30日火曜日

身近な印刷物、時刻表が消えた

西武池袋線、池袋駅での出来事。

3月になって西武線ダイヤ改正が行われました。
池袋駅で時刻表を貰おうとしたところ、、、時刻表はもう配布しないと言われ、

新しい時刻表は当社ホームページ、または携帯サイトをご覧ください。

と印刷された旧時刻表と同じ紙、同じ大きさの印刷物を手渡されました。。。

なんか違う。。。と感じるのは自分だけ?

確かにPCと携帯は普及してきました。
でも利便性からいえば、財布に入る大きさの時刻表には敵いません。

携帯がなくPCしかない人はプリンタで打ち出して、縮小コピーするのでしょうか?
携帯を持っていても【電話機能しか使ったことがない】という人がいます。
そういった情報弱者と呼ばれる人々を切り捨てるのでしょうか?

駅で老人が時刻表をメモする姿を見て、駅員の方はどう感じるのでしょうか?

2010年3月26日金曜日

縦中横で躓く、辿り着く

古旗さんのPDF本の中で即使えるScriptが

■文字を縦中横にする
   選択されたテキストフレーム内の半角数字を縦中横にする
   選択されたテキストフレーム内の2桁以上の半角数字を縦中横にする
   選択されたテキストフレーム内の2桁の半角数字だけを縦中横にする
   選択されたテキストフレーム内の英数字を標準状態にする
   選択されたテキストフレーム内の英数字を90度右に回転させる

ではないでしょうか? InDesignでは設定で自動で縦中横になりましたが、Illustratorではチクチク作業しなければならなかったような希ガス(うろ覚え)。

で、読み解きを始めてますが、、、躓いてます。。。

Script文をコピペしてblogに貼り付けたいのですが、著作権上それもできず。。。
要は一連の文字を縦中横にするScript文の中で
選択されたテキストフレーム内の半角数字を縦中横にするScriptにだけ、textSelection[0]が使われているのです。
そういうもんだとスルーすればいいのですが、なぜだ!と考え込んでしまい、、、初心者はこういったとこで躓くんでしょうね。考えるよりも手を動かせよ!という突っ込みが怖い(^^;A

で、textSelectionでググったら
Illustrator [23164] スクリプトで一括処理 閉じる処理でエラー発生
に辿り着きました。終了してしまったスレッドですが、分かる方はblogにてUPしていただけるとウレシのココロ(^^

ついでに
選択されたテキストフレーム内の半角数字を縦中横にする
選択されたテキストフレーム内の2 桁の半角数字だけを縦中横にする
にif文が使われ、他はfor文。

明日は【DTPの勉強会(仮称) 第0回】
アチキは仕事で参加できませんが、参加者の皆さん、盛り上げてください。

2010年3月25日木曜日

バックスラッシュ問題

ここ数日の動向。

JavaScriptで正規表現が使えるのかな?と思い、PDF本を「¥(0x5C)d」で検索。


こんな画面が出てきたため、(正規表現が使えないのか。。。)と思ってたんです。
ついでにTwitterでバックスラッシュを入力しても「¥」マークに変わる。
マイミクさんのTwitterはしっかり「╲」で表示されてる。
fontの問題と捉え、今の今までスルーしてきたアチキが馬鹿でした。

スルーしながらPDF本を読み進めますと
サンプルスクリプトに ╲(U+2572)をはっけ~ん!

バックスラッシュ wiki」でU+2572であることを知り、再度PDF内検索。。。

しか~し、同じアラートが出てきます。原因は
PDF文書内の半角円マーク「\」を検索することができない(Acrobat/Adobe Reader)でした。
弊社ではAcrobat/Adobe Reader日本語版でこの現象が発生することを認識しており、現在原因を調査中でです。詳細がわかり次第この文書にてお知らせいたします。

Solutions (解決方法)
検索ボックスに「¥u005c」を指定することで半角円マーク「¥」のみであれば検索することが可能です。

思い起こせば1年ほど前、InDesignで正規表現置換をやろうと思い「¥」(0x5C)を入力したものの動作せず、せうぞーさんのblogからコピペでバックスラッシュを入力して逃げたことがありやした(あの頃もう少し調べておけよな、自分)。

遠~い記憶として、出力に携わった人間は誰しも経験したことのある「5C問題」があります。ファイル名に5cが含まれていると出力時にエラーを起こすアレです。よくあったのが「表」という文字がファイル名(リンクファイル名)にありますと、「表」のShift-JISコードが「95 5c」のためエラーになりました。

タイミングよく、あさうすさんが「それには全く同意できない」をあげてます。
学術書などは電子出版に向いてますね
言いたいことは前回の日記と合わせて山ほどありますが、バックスラッシュを含んだ文の検索はPDF以外の電子ブックで大丈夫なんですかね?

しかし、、、バックスラッシュと¥が同じ意味を持つことに悪意を感じているのは自分だけ?

2010年3月23日火曜日

リファレンスマニュアル(PDF)本についてアレコレ

古旗さんのPDF本を読んだり、JavaScript Reference PDFを眺めた感想です。

古旗さんの本の購入のボタンをポチッと押して驚いたのが、即座にPDF本がダウンロードできる状態にあったこと。これは今までにない感動だった。(読みたい!)という強い思いからAmazonに注文しても、届く頃には、その思いが冷めていき手元に届いた時には数ページ眺めて終わり。。。ということが過去あっただけに、このシステムは心底凄いと思う。
紙メディアと違い、Scriptがコピペで即座に使える状態にある(タイプミスをすることがない)。
PDF本の利点として検索が楽。といった点があげられるが、やはり全体が俯瞰しづらい。つまみ喰いを目的とするならPDF本でいいのだろうが、自分がどこにいて何をしているのかが分からないという不安に駆られる。

で、JavaScript Reference PDFなのだが、英語だというのが全くもって日本ユーザーを馬鹿にしているとしか思えない。

自慢じゃないが、こちとら英語で単位を落として留年しとるんじゃい!

アプリを購入するとついてくるリファレンス本。個人的にはソフトよりこちらに価値があると思っている。

アプリは無料。
ユーザーガイド&リファレンス本は有料


というシステムは作れないのだろうか?
昔から疑問に思っているのだが、各出版社から出されているアプリ関連の書籍。出版社からベンダーへ売り上げの一部が行っているのだろうか? もしそうでないのなら、売り上げの一部がベンダーへ行くべきだと思うし、そういった法律を作るべきだとも思う。

デジタルになって違法コピーの話題が度々掲示板にもあげられているが、違法コピーはデジタルの宿命として解決されることはないだろう。ただデジタルアプリが楽曲と大きく違うところは、ユーザーに知識が求められるということだ。その意味で知識の集約であるリファレンス本をPDFというデジタルにするのはどうかと思う。

アプリにしても趣味で使う人、仕事でヘビーに使う人がいる。趣味で使う人には市販されている安価な本でいいだろうし、仕事で使うにはガッチリした高価なリファレンス本が必要になってくる。使用度合いによって価格が違ってくるのも当然だと思う。

ついでにリファレンス本の思い出。
Nortonマニュアルの後ろに記載されていたDiskの書き込み原理やフラグメンテーションは分かりやすかった。
QuarkのXPressタグも面白かった。
ともにOS9の頃の話。。。


最後に

JavaScript Referenceマニュアルは正規ユーザーのためにも日本語訳で本にすべきものだ!

と声を大にして言いたい。
とともにアチキのような人のためにも英語でいいからPDFをwebにあげといてね(お金のない人は努力を惜しみません)。

検索に引っかからないblogでほざいてみる。

2010年3月21日日曜日

等幅半角字形に置換スクリプトの読み解き

いっちゃんのブログ(仮)の異体字(等幅半角字形)に切り替えるスクリプトの読み解きです。
リンク先で解説されているところはパスします。自分にとって必要ないなぁ~と感じるところも割愛しました。
var docObj = app.activeDocument;
var selObj = docObj.selection;

var i, j;

if( (selObj[0].typename == "TextFrame") ) {
 for(j = 0; j < selObj.length; j++) {
  for(i = 0; i < selObj[j].contents.length; i++) {
  if(selObj[j].characters[i].contents.match(/[0-9]/) != null)
  selObj[j].characters[i].characterAttributes.alternateGlyphs = AlternateGlyphsForm.HALFWIDTH;
  }
 }
}
Ctr+Aの全選択で数字のみ一括置換しますので、これでも動作すると思います。
ちなみにPDF本には異体字(等幅半角字形)の例がなかった。

var i, j;
var i; とvar j; をひとつにまとめた表記と推測
3/25追記:04基本編p4に複数まとめて用意したい場合には,(カンマ)で区切って列記とある。

if( (selObj[0].typename == "TextFrame") ) {
二重括弧はいらんのじゃないのか?
if (selObj[0].typename == "TextFrame" ) {
でも動作するような希ガス。。。

match(/[0-9]/) != null)
正規表現[0-9]、/[0-9]/でパターンマッチ、! は not の意、nullは要素がない
つまり、0から9の数字パターンがmatchする要素がなく(null)はない(not)、つまりmatchする要素がある意。

selObj[j].characters[i].characterAttributes.alternateGlyphs = AlternateGlyphsForm.HALFWIDTH;
選択オブジェクトの文字の文字属性の異体字=異体字の等幅半角
で、理解できんのがPerlの初心者本ではif文は、if (条件) {処理}となるのだが、この行を{}で囲んでいない? 省略できるのか???
{selObj[j].characters[i].characterAttributes.alternateGlyphs = AlternateGlyphsForm.HALFWIDTH;}
でもいけそうな希ガス。。。


で、このスクリプトってタテ組み本文の縦中横の新ゴ数字の出っ張りが気になる方に役立つんですよね。
PDF本に縦中横の例文スクリプトがありますので、合体すれば結構使えそうな気がします。
数字1桁は全角、2桁以上は半角に変換するスクリプトと合体すれば、なおよろしって感じですが、構文が長すぎますのでパスします。
まずは短い文から読み解きですわ。

2010年3月20日土曜日

初心者はIllustratorが入りやすい

テキスト処理からJavaScriptを覚えようとしてます。
一括検索置換はやっぱJavaScriptだと思うのであります。
で、次なる段階は異体字の一括変換なのですが、ちとハードルが高すぎるきらいもありまして、異体字(等幅半角字形)に切り替えるスクリプトの読み解きに手を付けてます。
// オブジェクトが選択されている場合
if(selObj.length != 0) {

// 任意の段落が選択されている場合
if (selObj.typename == "TextRange") {

// テキストフレームが選択されている場合
} else if( (selObj[0].typename == "TextFrame") ) {

と、細やかな説明が非常に嬉し~い。あのPDF本には、そういった丁寧な説明はありません。(初心者向けではないなぁ~)と感じてたのですが、kamisetoさんによりますと

内容は中級者~上級者向けみたいですね。

やはりそうでしたか。。。気を取り直して自分なりに分かる範囲で進めませう。

length != 0
「JavaScriptの絵本」および古旗本にも載っていません。「Perlの絵本」には載ってました。
そうです。JavaScript本の前にPerl本は必須です! 

"!" は not の意でした。Perl本は手放せない。。。

等幅半角字形にかえるScriptはInDesignにもありまして、CS用としていきさんが掲示板に上げてます。
しか~し、InDesignはバージョンによってJavaScriptの書き方が違うという初心者にとっては非常~に高く、そそり立つ壁があるのです。
せうぞーさんの作られた数字の字形を置換する「num_glyph 0.4」がCSおよびCS2で動作するかどうかは分からないだけに、JavaScriptの勉強をInDesignから始めようとする者にとってはかなり敷居が高いと感じます。

そこでIllustratorですよ、奥さん!

Illustratorで文字組みなんぞするのは人間のクズ!
と思って生きてきた自分ですが、方針変更です。「Illustratorで文字組み」――素敵じゃないですか~、デザインばかりでなく、組版、Scriptが覚えられるのですから(^^ 一粒で2度、3度美味しいアプリなんぞ、そうそうあるものではありません。バージョンによって書き方が変わらないのが一番です。

で、思うこと。。。InDesignのバージョンによってJavaScriptの書き方が違うのは、InDesignの迷走なのかしらん?

追記:Indesign CS2で等幅半角字形にするには数字1桁は全角、2桁以上は半角に変換するスクリプトをグリグリすればなんとかなるのかも(^^

2010年3月16日火曜日

合体スクリプトの解説と感想

replace(/[0-9]/gi, function(chr, ptr, allStr)
chrはchractor、でもptr, allStrって? 
ググりましたptrはpointer、allStrは出てこない。。。
多分allStringのことだと思います。
こういった説明が省かれてます(汗

で、最初のパラメータが正規表現文字列、2番目のパラメータに関数(function)を指定した場合、マッチした文字、文字の位置、検索対象となった全文になるようです。
giはPerlと同じならば、iは不要ですね。なんせ元のscriptは「全角英数字を半角英数字にする」でしたから。そのまま流用したアチキがバカなだけ(^^;

この function(chr, ptr, allStr) はアチコチの例文に使われています。
・テキストフレーム内の番号を1 つ増やす
・テキストフレーム内の価格に消費税を加える
・テキストフレーム内の価格のフォーマット(円←→¥)を変更する
・テキストフレーム内の日付フォーマットを変更する
・英文字だけサイズを変える(平仮名、片仮名、漢字)
・英文字だけフォントを変える(平仮名、片仮名、漢字)
・特定の文字列の両側にカッコを付ける
・2桁以上の半角数字を縦中横にする
・テキストフレーム内の金額がオーバーしているか調べる
・全角英数字が含まれているかどうか調べる
・半角英数字←→全角英数字にする
・アラビア数字←→漢数字にする
・句読点←→ピリオドとカンマにする
・3桁ごとにカンマを付ける
・レガシーテキストがあるかどうか調べる
・レガシーテキストを一括変換し保存する
・シリアル番号を付けファイルとして保存する
・住所氏名のデータを元に葉書を自動生成し保存する

などです。
for(var i=0; i<selObj.length; i++)と同じように丸暗記するしかないみたいです。

indexOf()メソッドは文字列を先頭から検索する。
charAt()メソッドは文字列から指定された文字を1文字取り出す。

あとイメージできたのは
var hankaku = "0123456789";を
var hankaku = "9012345678";にすればマイナス1の数字に置き換わるんじゃないかな。
チラシ仕事の価格一括1円引きの変換に使え、、、ない。

InDesignのJavaScriptのテキスト処理(ルビを除く)の多くはヘッダの部分をIllustrator用に書き換えれば、そのまま使えるような気がします。あとカラー関係も。
コピペ合体スクリプトを作りながらマニュアルを片手に読み解きをする予定。
にしても、、、唐突に出てきて何の解説もない式やワードに入門者はつまづくのだと思います。

2010年3月12日金曜日

検索置換のコピペ合体スクリプト(^^;

Page2010で実演したたけうちとおるさんのスクリプトは全角数字→半角数字置換だったけど、複数文字の検索置換を目的としたものだよな(違う?)。複数文字の一括検索置換を実演すればもっとアピールできたのに~~。
findrepAry.push("渡辺,渡邊");
findrepAry.push("読売,讀賣");
できるんじゃないの? で、aaltで指定すれば異体字に置換できそうな(やり方は分からんが)。まぁ、この辺りは後回しにして

古旗さんのInDesign CS3自動化作戦(全ページにある全角の数字を半角の数字にする)Adobe Illustrator CS3 + JavaScript 自動化サンプル集を合体してScriptを作ってみた(多分、動作するべ)。同じ人が違う書き方をしただけであって著作権的にはどうなのか疑問ではあるのだが。。。
なんでこんなことをしたかというとIllustratorの自動化サンプル集の書き方が 全角文字コードを減算する なんて難しい書き方をしていたため(^^;
(function(){
 var selObj = app.activeDocument.selection;
 for(var i=0; i<selObj.length; i++){
  if (selObj[i].typename == "TextFrame") {
   selObj[i].contents =selObj[i].contents.replace(/[0-9]/gi, function(chr, ptr, allStr){
    var hankaku = "0123456789";
    var zenkaku = "0123456789";
    var n = zenkaku.indexOf(chr);
    return hankaku.charAt(n);
   });
  }
 }
})();

で最初、(function()に疑問が出てきた。なんでfunction()ではダメなのか? 
この説明がpdf本にないためググりました。
(function(){})() と function(){}()

function() {}()
と書くと function() {} が式ではなく、文として解釈されてしまう
(function(){})()
と書いてやると function は式になる

下地がないため亀足で進めてます(^^;

2010年3月8日月曜日

たけうちとおるさんの19)検索置換を読む 最後

ちとオフ会やら何やらあり、間が空きました。。。
で、、、勉強したことを忘れた。。。orz

読み直して復習と最後のつぶやき
for(var N = 0; N < selecount;N++){
//selecount分繰り返す

var myObj = mySele[N];
//複数選択の意? ちなみに"var"は"variable"の略

var mypageitem_type = myObj.typename;
//複数選択のtypenameプロパティ

if(mypageitem_type == "TextFrame"){
//複数選択のtypenameプロパティ(属性)がTextFrameの場合

var myContents = myObj.contents;
//contents はプロパティ

var replaceContents = myContents;
/*replaceメソッドのことだと推測されるが、絵本にはreplace()で記述されている
次行の一括処理のためなのだろう*/

for(var i = 0;i < findrepAry.length;i++){
/*i < findrepAry ; i++ ではなく
i < findrepAry.lengthなのがわけわかめ(高度なのね)
findrepAryは0~9を含んでないの?
そういえばnew Array(0)になってたしね*/

var findrep = findrepAry[i].split(",");
//split()は文字列を配列に分割するメソッドだが、この場合は違うよな?

var regStr = "/"+findrep[0]+"/g"
//gフラグはPerlのgと同じと思うが、スラッシュと+findrep[0]+が分からん

var replaceContents = replaceContents.replace (findrep[0], findrep[1]);
//んっ? replace (findrep[0], findrep[1]);とあるから
split()は文字列を配列に分割するメソッドで
findrep[0]は1番目の全角数字を
findrep[1]は2番目の半角数字に置換することだよな

で、一番分からんのが右と左で同じreplaceContentsが使われている
左は置換後のreplaceContentsで、右は置換前のreplaceContentsだよな? 何で?*/

//var replaceContents = replaceContents.replace (eval(regStr), findrep[1]);//正規表現の場合はこちらを使用。
//ここはスルーさせていただきます

}
if(myContents != replaceContents){
// !=は≠(等しくない)の意
myObj.contents = replaceContents;
//ここで置換処理するようだ
}
}
}
}

う~ん、むずかしいです(^^;A
雄さんのオフ会に来られていたくらたさんとお話しをしたのですが、スクリプトに長けた方はJavaScriptから入ったわけではなく、その前に別な言語でやってらした方ばかりです。
そんなわけで全くのアチキみたいな人間が、スクリプトを読み解こうとしてもやっぱ無理があるみたいです。
で、くらたさんの作品は初心者が読んでも読み解けるとのことでしたので、次回からはくらたさんの作品を読み解かせていただきます^^

ps.アチキの15年後の世代の方って小学生の時からBasicをやってるのね(特別だと思いたい)。

2010年3月3日水曜日

単数行コンポーザと段落コンポーザ

works014 さんから「モリサワセミナーは濃い」についてのコメントをいただきました。
こんにちは。
「しかし、美しい文字組版にこだわれば段落コンポーザーが正解なんやね。」
この部分、よろしければ解説していただけませんか?
ひっかかっていたのですが、先日モリサワの中の人にうかがったのですが、やはり「単数行」推奨だとか……。

あらっ? 単数行推奨なんですか? 当日の資料を探しました。

当日のセミナーは赤字が入った時の単数行コンポーザと段落コンポーザの違いを分かりやすく上図の例をあげてました。
で、blogには「美しい文字組版にこだわれば段落コンポーザーが正解なんやね」と書きましたが、セミナー講師の方からこの発言はありませんでした。これは上図の例を見ての自分の感想です。
blogには和欧混の文章と書いてなかっただけに誤解を与えたと思います。

だって読んでる人がいるなんて思ってなかったものですから~~!!

和欧混の文章だと段落コンポーザーが正解になるんだと思います(個人的には)。
で、読みやすい文字組みってやはりケースバイケースだと思うんです。
当時のblogでもつぶやいてましたが、単数行コンポーザー絶対!のルールで責了赤字修正をしていると、極端に字間が空く例に何度も遭遇してました。大手印刷会社の下請け製版会社に派遣されている身としては、どうしようもありません。まして責了時ですから時間もありません。分業化の弊害ですよね。。。

で、モリサワさんの中の人がいう「単数行」推奨の場合って、どんな場合なんでしょうね?

東京開催「文字組版の教室」

に参加すれば理解できる??? で、お財布と相談(^^;A
blogに書くと半額もしくは無料になるということはないのでしょうか?(ダメモトでつぶやいてみる)。

追記:久しぶりに「メモ帳のバケ2」を開いてみたら、こさかさんが読者になっていた。バレたか~~!

2010年3月1日月曜日

たけうちとおるさんの19)検索置換を読む その3

段々むずかしくなってきました。for文です。
function main(findrepAry){
if (app.documents.length == 0){
//documentsと複数形

alert("ドキュメントを開いてください");
return;
}
if (app.selection.length == 0){
//selectionと単数形

alert("オブジェクトを選択してください");
return;
}
var mySele = app.selection;

/*関数内の { と } の中にvarをつけて宣言した変数がローカル変数
ローカル変数とは宣言した関数(ここではmain)で使える変数のこと
app.selection=アプリ(イラレ)の選択したもの

ちょっとまて、このスクリプトはvarから始まってるぞ↓
var findrepAry = new Array(0);
分からんなりに次に進む*/

var selecount = mySele.length;
//アプリの選択したものの部品の数

/*変数の中に変数を入れるので分かりにくい
var selecount = app.selection.length;
と1行にしてもいいよな? 
しかし、改変することを視野に入れれば細かく分けたほうがいいな*/

for(var N = 0 ; N < selecount ;N++){

/*
for ( 変数名=0 ; 変数名< 回数 ; 変数名++)とあるが
for( 初期値 ; 繰り返し条件 ; 繰り返し時の処理)の方が分かりやすい
N = 0は変数が0なのではなく、カウンタの初期値設定
varが使われているが
for( N = 0 ; N < selecount ;N++)
と書いても同じ

注:0 から9 まで10 回繰り返したい場合は N<10
1 から10 までにしたい場合は N<=10
なのだが、現時点ではどんな時に使い分けるのか分からない
今日はここまで
*/

最初に読み解くスクリプトとしてはかなり高度かな?と思ったが、検索置換は入り口でありゴールだよな。スクリプトのほとんどの作業は検索置換のような気がする。ただvarが複数回出現してくると頭が痛くなる。