ちょっと気になったことがあったので
http://www2.convention.jp/pdf/dictionary/j/01_e/encoding/encoding.htmより引用。
エンコーディング [一般]
フォントで文字の割り当てを決める文字コードの種類のこと。符号化方式とも言う。PDFファイルでは「フォント情報」を見ると、その文書のエンコーディングを知ることができる。主なエンコーディング方法は下記の通り。
Identity-H PDF独自のCIDエンコードに準拠してコード付けされたもの。縦書きは「Identity-V」 日本語
90ms-RKSJ-H WindowsでのMicrosoftのエンコード。縦書きは「90ms-RKSJ-V」 日本語
90pv-RKSJ-H MacintoshのTrue Type(トゥルータイプ)フォント標準のエンコード。縦書きは「90pv-RKSJ-V」 日本語
83pv-RKSJ-H MacintoshのPostScriptフォント標準のエンコード。縦書きは「83pv-RKSJ-V」 日本語
Windows WindowsのDistillerとPDF Writer、MacintoshのDistillerで変換された、欧文フォントのエンコード。 欧文
MacRoman MacintoshのPDF Writerで変換された、欧文フォントのエンコード。 欧文
例えば「90ms-RKSJ-H」を細かく見ていくと、次のような構造になっている。
文字セット 90ms WindowsでのMicrosoftの文字セット
90pv Macintoshの漢字Talk7で採用された文字セット。True Type(トゥルータイプ)フォント標準
83pv Macintoshの漢字Talk6で採用された文字セット。PostScriptフォント標準
Add 富士通のパソコンでの文字セット
Ext NEC PC98用の文字セット
符号化方式 RKSJ Romaji Kana Shift JISの略。シフトJISの文字コード
特に表記のない場合は、JISを表す
EUC Extended Unix Codeの略。Unixで使われる
組方向 H Horizontalの略。拗促音や括弧などの記号類が、横書き用の文字であることを表す
V Verticalの略。拗促音や括弧などの記号類が、縦書き用の文字であることを表す
http://www.namikawa.co.jp/namikawaset.pdfより
欧文TrueTypeはPDFにした時にエンコードがカスタムになっていないとáやà等の文字が抜けたり、化けたりする。
QuarkからPSに書き出す時に「TrueType」を優先にチェックを入れる。
「Type1」優先だと抜けと化けが発生する。
ちなみにTrueTypeをPSフォントに置き換えてPSに吐いたときのエンコードはMacRoman。
「Type1」優先設定の時はフォントはPSフォントになっているもののエンコードはWindows。
今後起こりうる事態として
http://blog.antenna.co.jp/PDFTool/archives/2007/05/29/#000702がある。
2007年5月27日日曜日
プログラムの考え方 その2
引き続きhttp://blog.livedoor.jp/clausemitz/archives/50656193.htmlより引用
どうも、この問題、根が深いらしい。というのはプログラミングというのは
ある程度、「ひらめき」が要求されるもので、苦手な人はそもそも、その
ひらめきが生じないらしい。プログラミングは理数系という勘違いも拍車を
かけている気がする。聞くところによれば理数系の大学院まで行って
どう見ても私のような高卒DQNより、はるかに優秀な頭脳の持ち主が
簡単なプログラミングができなくて、頭をかかえている例もあるらしい。
ところで、あなたは理系ですか文系ですか、というつまらない質問があるが
私だったら「体育系」ですと答えるだろう。プログラミングしている時の
私の頭の中は動物的な勘がぐるぐる渦巻いているような感じで理路整然と
演繹的に問題を解いているのではなく、あっちこっち試行錯誤をしていて
言語として抜き出しにくい状態、いわゆる「暗黙知」が支配する感じだ。
このあたりの感触をわかっている、わかっていないが
プログラミングが得意か、不得意かの分かれ目のような気がするが、
他人の思考を覗き見できない(説明を求めても、うまく答えてくれた試しがない)
ので、今のところ、推測にすぎない。
で、FizzBuzz問題で、頭をかかえる人は、おそらく、ここでつまづいている
という「推測」はできるのだけど、他人の思考を覗き見できない
(なおかつ、できない人は、なぜできないかの説明すらできない)
ので、そのあたりをチクチク責めるよりも
私だったら、こう解いたという道筋を分解して説明しようと思う。
プログラミングの苦手な人は、この「分解」ができていません。
●1~100の数字を表示するプログラムを作る。
ダメな人の特徴として、いきなり「完成形」を作ろうとするのがある。
まず最初はできるところから、ラフスケッチから攻めるべきだ。
「3で割り切れるなら…」「5で割り切れるなら…」という仕様はまず無視。
1~100を間にカンマをつけて表示するから始めよう。ところがこの程度でも
いきなりつまづく人がいる。カンマのつけかたをどうするか。
int aIdx;
for(aIdx = 1; aIdx <= 100; aIdx++){
printf(", %d",aIdx);
}
printf("\n");
これだと「, 1, 2…」と表示するから、最初の1だけカンマをつけないなら
1だったらカンマをつけない、1以外はカンマをつけるという「条件分岐」を
ここで盛り込む。
int aIdx;
for(aIdx = 1; aIdx <= 100; aIdx++){
if(aIdx > 1){
printf(", ");
}
printf("%d",aIdx);
}
printf("\n");
●3で割り切れるならFizzを出す
単純に考えれば、printf("%d",aIdx);を
if(aIdx % 3 == 0){
printf("Fizz");
}else{
printf("%d",aIdx);
}
に入れ替えだが、これが「ひっかけ」だと気づくか気づかないかで運命が決まる。
「5で割り切れるなら…」という仕様が控え、さらに「3と5で割り切れるなら…」
という仕様があるから単純に条件分岐するのはまずい。ではどうするか?
「状態」を保持しておき、分岐は剰余演算の直接結果ではなく、状態で行う。
「3で割り切れるか割り切れないか」の状態を示す変数、aFizzを導入する。
int aIdx,aFizz;
for(aIdx = 1; aIdx <= 100; aIdx++){
if(aIdx > 1){
printf(", ");
}
aFizz = (aIdx % 3 == 0);
if(aFizz == 0){
printf("%d",aIdx);
}else{
printf("Fizz");
}
}
printf("\n");
●5で割り切れるならBuzzを出す
ここまで来れば、次のステップは
「5で割り切れるか割り切れないか」の状態を示す変数、aBuzzを導入する。
に気づくから(気づかないならプログラマーはやめたほうがいい、マジで)
int aIdx,aFizz,aBuzz;
for(aIdx = 1; aIdx <= 100; aIdx++){
if(aIdx > 1){
printf(", ");
}
aFizz = (aIdx % 3 == 0);
aBuzz = (aIdx % 5 == 0);
と、ここまでできれば数字を表示するのはFizzでもBuzzでもない状態だから
if(aFizz == 0 && aBuzz == 0){
printf("%d",aIdx);
とすりゃいいんだけど、ここで頭をかかえる人はFizz,Buzzの表示方法を
どうするかでしょうね。単純にaFizzでFizzを出す、aBuzzでBuzzを出すだと
両方が成立するケースでうまく表示できない(間のスペースをどう表示する)。
(switch(aFizz + aBuzz)で分岐すると短くなるけど、いかにもC言語だな…)
ここは変に技巧をこらさずにストレートに行きましょう。
}else{
if(aFizz != 0){
printf("Fizz");
}
if(aBuzz != 0){
if(aFizz != 0){
printf(" ");
}
printf("Buzz");
}
}
}
printf("\n");
と、まあこんな感じで解いているのですが、ここで説明していない理由で
コーディングを決めているものもあって、それもおそらくプログラミングが
苦手な人がつまづいている要因なのかもしれませんね…。
*
FizzBuzz問題と関連するのかどうかわからないですが面白い記事を発見しました。
プログラマーになれる人なれない人
どういう理屈なのかはわからないけど、プログラミングを出来るようになれる人とマッタク出来ない人はハッキリと分かれてしまう。
俺がコンピュータサイエンス学科に居た頃と Teaching Assistant として一年生の面倒見てた経験から言うと、プログラミングが出来ない人はホントに最初の段階から出来ない。
例えば、
int a = 10;
というのを習うと 50 人中 4,5 人は脱落する。
変数という概念がどうしても腹の中におちていかないらしい。
にわかには信じがたいですが、変数なんて便利な概念を理解できずして
よく生きてこれたと感心します。(皮肉ではなく正直に感心してます)
ものすごく大雑把に言うと 4 割から 7 割の人はプログラマーに向いてない、ということになる。ポインタと再帰はかなりの難関だけど、 それ以前の段階でつまづいている人がかなりいるのでは、と俺は思う。ポインタと再帰までは騙し騙しでやれてるだけなんじゃないかなぁ?
ごめん。ポインターと再帰は私は簡単に理解してしまった。
ていうか、お勉強があまりできない高卒の私ですら理解できたことだから
世間一般のプログラマーは全員、簡単に理解したものとばかり思ってた。
だから指導者にはなれないんだろうな…。なるつもりはないけど。
どうも、この問題、根が深いらしい。というのはプログラミングというのは
ある程度、「ひらめき」が要求されるもので、苦手な人はそもそも、その
ひらめきが生じないらしい。プログラミングは理数系という勘違いも拍車を
かけている気がする。聞くところによれば理数系の大学院まで行って
どう見ても私のような高卒DQNより、はるかに優秀な頭脳の持ち主が
簡単なプログラミングができなくて、頭をかかえている例もあるらしい。
ところで、あなたは理系ですか文系ですか、というつまらない質問があるが
私だったら「体育系」ですと答えるだろう。プログラミングしている時の
私の頭の中は動物的な勘がぐるぐる渦巻いているような感じで理路整然と
演繹的に問題を解いているのではなく、あっちこっち試行錯誤をしていて
言語として抜き出しにくい状態、いわゆる「暗黙知」が支配する感じだ。
このあたりの感触をわかっている、わかっていないが
プログラミングが得意か、不得意かの分かれ目のような気がするが、
他人の思考を覗き見できない(説明を求めても、うまく答えてくれた試しがない)
ので、今のところ、推測にすぎない。
で、FizzBuzz問題で、頭をかかえる人は、おそらく、ここでつまづいている
という「推測」はできるのだけど、他人の思考を覗き見できない
(なおかつ、できない人は、なぜできないかの説明すらできない)
ので、そのあたりをチクチク責めるよりも
私だったら、こう解いたという道筋を分解して説明しようと思う。
プログラミングの苦手な人は、この「分解」ができていません。
●1~100の数字を表示するプログラムを作る。
ダメな人の特徴として、いきなり「完成形」を作ろうとするのがある。
まず最初はできるところから、ラフスケッチから攻めるべきだ。
「3で割り切れるなら…」「5で割り切れるなら…」という仕様はまず無視。
1~100を間にカンマをつけて表示するから始めよう。ところがこの程度でも
いきなりつまづく人がいる。カンマのつけかたをどうするか。
int aIdx;
for(aIdx = 1; aIdx <= 100; aIdx++){
printf(", %d",aIdx);
}
printf("\n");
これだと「, 1, 2…」と表示するから、最初の1だけカンマをつけないなら
1だったらカンマをつけない、1以外はカンマをつけるという「条件分岐」を
ここで盛り込む。
int aIdx;
for(aIdx = 1; aIdx <= 100; aIdx++){
if(aIdx > 1){
printf(", ");
}
printf("%d",aIdx);
}
printf("\n");
●3で割り切れるならFizzを出す
単純に考えれば、printf("%d",aIdx);を
if(aIdx % 3 == 0){
printf("Fizz");
}else{
printf("%d",aIdx);
}
に入れ替えだが、これが「ひっかけ」だと気づくか気づかないかで運命が決まる。
「5で割り切れるなら…」という仕様が控え、さらに「3と5で割り切れるなら…」
という仕様があるから単純に条件分岐するのはまずい。ではどうするか?
「状態」を保持しておき、分岐は剰余演算の直接結果ではなく、状態で行う。
「3で割り切れるか割り切れないか」の状態を示す変数、aFizzを導入する。
int aIdx,aFizz;
for(aIdx = 1; aIdx <= 100; aIdx++){
if(aIdx > 1){
printf(", ");
}
aFizz = (aIdx % 3 == 0);
if(aFizz == 0){
printf("%d",aIdx);
}else{
printf("Fizz");
}
}
printf("\n");
●5で割り切れるならBuzzを出す
ここまで来れば、次のステップは
「5で割り切れるか割り切れないか」の状態を示す変数、aBuzzを導入する。
に気づくから(気づかないならプログラマーはやめたほうがいい、マジで)
int aIdx,aFizz,aBuzz;
for(aIdx = 1; aIdx <= 100; aIdx++){
if(aIdx > 1){
printf(", ");
}
aFizz = (aIdx % 3 == 0);
aBuzz = (aIdx % 5 == 0);
と、ここまでできれば数字を表示するのはFizzでもBuzzでもない状態だから
if(aFizz == 0 && aBuzz == 0){
printf("%d",aIdx);
とすりゃいいんだけど、ここで頭をかかえる人はFizz,Buzzの表示方法を
どうするかでしょうね。単純にaFizzでFizzを出す、aBuzzでBuzzを出すだと
両方が成立するケースでうまく表示できない(間のスペースをどう表示する)。
(switch(aFizz + aBuzz)で分岐すると短くなるけど、いかにもC言語だな…)
ここは変に技巧をこらさずにストレートに行きましょう。
}else{
if(aFizz != 0){
printf("Fizz");
}
if(aBuzz != 0){
if(aFizz != 0){
printf(" ");
}
printf("Buzz");
}
}
}
printf("\n");
と、まあこんな感じで解いているのですが、ここで説明していない理由で
コーディングを決めているものもあって、それもおそらくプログラミングが
苦手な人がつまづいている要因なのかもしれませんね…。
*
FizzBuzz問題と関連するのかどうかわからないですが面白い記事を発見しました。
プログラマーになれる人なれない人
どういう理屈なのかはわからないけど、プログラミングを出来るようになれる人とマッタク出来ない人はハッキリと分かれてしまう。
俺がコンピュータサイエンス学科に居た頃と Teaching Assistant として一年生の面倒見てた経験から言うと、プログラミングが出来ない人はホントに最初の段階から出来ない。
例えば、
int a = 10;
というのを習うと 50 人中 4,5 人は脱落する。
変数という概念がどうしても腹の中におちていかないらしい。
にわかには信じがたいですが、変数なんて便利な概念を理解できずして
よく生きてこれたと感心します。(皮肉ではなく正直に感心してます)
ものすごく大雑把に言うと 4 割から 7 割の人はプログラマーに向いてない、ということになる。ポインタと再帰はかなりの難関だけど、 それ以前の段階でつまづいている人がかなりいるのでは、と俺は思う。ポインタと再帰までは騙し騙しでやれてるだけなんじゃないかなぁ?
ごめん。ポインターと再帰は私は簡単に理解してしまった。
ていうか、お勉強があまりできない高卒の私ですら理解できたことだから
世間一般のプログラマーは全員、簡単に理解したものとばかり思ってた。
だから指導者にはなれないんだろうな…。なるつもりはないけど。
プログラムの考え方 その1
http://blog.livedoor.jp/clausemitz/archives/50656033.htmlより引用
FizzBuzz問題
というのが流行っているらしい。
Wikipedia - Fizz Buzz
最初のプレイヤーは「1」と数字を発言する。次のプレイヤーは直前のプレイヤーの次の数字を発言していく。ただし、3で割り切れる場合は 「Fizz」、5で割り切れる場合は 「Buzz」、両者で割り切れる場合は 「Fizz Buzz」を数の代わりに発言しなければならない。
ゲームは、以下のとおりに発言が進行する。
1, 2, Fizz, 4, Buzz, Fizz, 7, 8, Fizz, Buzz, 11, Fizz, 13, 14, Fizz Buzz, 16, 17, Fizz, 19, Buzz, Fizz, 22, 23, Fizz, Buzz, 26, Fizz, 28, 29, Fizz Buzz, 31, 32, Fizz, 34, Buzz, Fizz, ...
このゲームをコンピュータ画面に表示させるプログラムとして作成させることで、コードがかけないプログラマ志願者を見分ける手法を Jeff Atwood 氏が FizzBuzz問題 (FizzBuzz Question)として提唱した。
どうしてプログラマに・・・プログラムが書けないのか?
ちゃんとしたプログラマであれば、これを実行するプログラムを2分とかからずに紙に書き出せるはずだ。怖い事実を聞きたい? コンピュータサイエンス学科卒業生の過半数にはそれができないのだ。 自称上級プログラマが答えを書くのに10-15分もかかっているのを見たこともある。
えええっ!!! なんでー??? \(◎o◎;)/
こんなの剰余演算とループの組み合わせで簡単にできるじゃん。
2分は大げさとしても10分もかかるかあ?! (´゚д゚`)
ちなみに、この問題を解くのに「剰余演算は一切使うな」という縛りをつけると
とたんに多くのプログラマーが頭をかかえるらしいけど、嘘だろー??
そんときゃ配列使えばいいじゃん。ちなみに私の解答(C言語)は以下の通り。
#include
#include
#define MAX_FIZZ_BUZZ 100
#define FIZZ 3
#define BUZZ 5
int main(int argc,const char *argv[])
{
static int aFizzBuzz[MAX_FIZZ_BUZZ + 1];
int aIdx;
for(aIdx = FIZZ; aIdx <= MAX_FIZZ_BUZZ; aIdx += FIZZ){
aFizzBuzz[aIdx] += 1;
}
for(aIdx = BUZZ; aIdx <= MAX_FIZZ_BUZZ; aIdx += BUZZ){
aFizzBuzz[aIdx] += 2;
}
for(aIdx = 1; aIdx <= MAX_FIZZ_BUZZ; aIdx++){
if(aIdx > 1){
printf(", ");
}
switch(aFizzBuzz[aIdx]){
case 0:
printf("%d",aIdx);
break;
case 1:
printf("Fizz");
break;
case 2:
printf("Buzz");
break;
case 3:
printf("Fizz Buzz");
break;
default:
abort();
break;
}
}
printf("\n");
return 0;
}
言っとくが私は高卒のDQNだし、別に天才プログラマーでもなんでもない。
とすると、このFizzBuzz問題って、実は根の深い深刻な問題かもしれない…。
FizzBuzz問題
というのが流行っているらしい。
Wikipedia - Fizz Buzz
最初のプレイヤーは「1」と数字を発言する。次のプレイヤーは直前のプレイヤーの次の数字を発言していく。ただし、3で割り切れる場合は 「Fizz」、5で割り切れる場合は 「Buzz」、両者で割り切れる場合は 「Fizz Buzz」を数の代わりに発言しなければならない。
ゲームは、以下のとおりに発言が進行する。
1, 2, Fizz, 4, Buzz, Fizz, 7, 8, Fizz, Buzz, 11, Fizz, 13, 14, Fizz Buzz, 16, 17, Fizz, 19, Buzz, Fizz, 22, 23, Fizz, Buzz, 26, Fizz, 28, 29, Fizz Buzz, 31, 32, Fizz, 34, Buzz, Fizz, ...
このゲームをコンピュータ画面に表示させるプログラムとして作成させることで、コードがかけないプログラマ志願者を見分ける手法を Jeff Atwood 氏が FizzBuzz問題 (FizzBuzz Question)として提唱した。
どうしてプログラマに・・・プログラムが書けないのか?
ちゃんとしたプログラマであれば、これを実行するプログラムを2分とかからずに紙に書き出せるはずだ。怖い事実を聞きたい? コンピュータサイエンス学科卒業生の過半数にはそれができないのだ。 自称上級プログラマが答えを書くのに10-15分もかかっているのを見たこともある。
えええっ!!! なんでー??? \(◎o◎;)/
こんなの剰余演算とループの組み合わせで簡単にできるじゃん。
2分は大げさとしても10分もかかるかあ?! (´゚д゚`)
ちなみに、この問題を解くのに「剰余演算は一切使うな」という縛りをつけると
とたんに多くのプログラマーが頭をかかえるらしいけど、嘘だろー??
そんときゃ配列使えばいいじゃん。ちなみに私の解答(C言語)は以下の通り。
#include
#include
#define MAX_FIZZ_BUZZ 100
#define FIZZ 3
#define BUZZ 5
int main(int argc,const char *argv[])
{
static int aFizzBuzz[MAX_FIZZ_BUZZ + 1];
int aIdx;
for(aIdx = FIZZ; aIdx <= MAX_FIZZ_BUZZ; aIdx += FIZZ){
aFizzBuzz[aIdx] += 1;
}
for(aIdx = BUZZ; aIdx <= MAX_FIZZ_BUZZ; aIdx += BUZZ){
aFizzBuzz[aIdx] += 2;
}
for(aIdx = 1; aIdx <= MAX_FIZZ_BUZZ; aIdx++){
if(aIdx > 1){
printf(", ");
}
switch(aFizzBuzz[aIdx]){
case 0:
printf("%d",aIdx);
break;
case 1:
printf("Fizz");
break;
case 2:
printf("Buzz");
break;
case 3:
printf("Fizz Buzz");
break;
default:
abort();
break;
}
}
printf("\n");
return 0;
}
言っとくが私は高卒のDQNだし、別に天才プログラマーでもなんでもない。
とすると、このFizzBuzz問題って、実は根の深い深刻な問題かもしれない…。
2007年5月24日木曜日
いまさらながらOSの解像度
http://www.theninjacat.com/WEBCLASS/TOPICS/20021011.html
より
(中略)
ではここでOSの解像度の中身に戻りますと、さきほど「Macは1インチ分を72粒(dpi)、Windowsは96粒(dpi)使って表している」という取り決めのことだ、と説明しました。
じゃなんでたったこれだけのことが問題なんだ、ということですが、問題はあるんです。何を隠そう、(隠したってはじまらないけど)OSごとにその粒数が違うんですな、これが。気のきいた方ならもう察しがつくでしょうけど、1インチ分の長さが違って見えるんですよ!
具体的にいうと、Macは1インチ分を72粒(dpi)、Windowsは96粒(dpi)使って表します。WindowsはMacの約1.3倍の長さになるんです。
でも、画像に関してはピクセル=粒数で大きさを決めていますから、どっちのOSでも100粒なら100粒、大きさに変わりありません。「1インチ分」なんて気にすることはめったにないでしょ。だからまず画像に関してはよし。じゃ何に気を使う必要があるか!
文字、文字ですよ。文字って「ポイント」っていう単位使ったりするでしょ?あれが問題です。
「ポイント」という単位はもともと印刷物に使う文字の大きさの単位で、1インチの72分の1が1ポイントと決められています。そしてMacは生まれた当初からDTPを視野に入れていましたから、印刷物と単位を同じにしました。だから1インチを72粒、1粒1ポイントとなるように設計されています。でもWindowsは同じ1ポイントを表示するのに約1.3粒使うんですよ!
でもって問題なのは、htmlで設定するfont size="3"とかいう設定は、このポイントを基準としているってことです。基本的にfont size="3"が12ポイントだったかと思いますが。
だから文字の大きさを「ポイント」で設定してしまうと、Mac上で10文字横に並ぶ幅に、Windowsは7文字しか入らないで、3文字は改行されてしまう。これはテキストがいっぱいある画面をかっこよくレイアウトしたい人には大問題ですね。ちゃんとゆとりを考えておかないと、どこかの画面でとんでもない箇所で改行されてたりってことがおきる。DTP出身の人なんかだと気絶しちゃうような事件ですわね。
じゃどうしたらいいんだってことですが、オーソドックスな方法として、「スタイルシート」を使うというのが一般的です。スタイルシートでは、フォントサイズをpx(ピクセル)で設定することができます。こうすれば、基本的にはMacだろうとWindowsだろうと、12pxといえば12pxで見えるから。(「基本的には」と言ったのは、これも必ずしも完璧ではないからです。使っているフォントによっては、改行場所が違ってしまうこともなくはない。まあでも率は低いのでこの際この問題は追求しないことにしましょう。)こういう点ではスタイルシートはありがたいですね。スタイルシートが存在しなかったころは、対処方法は「画像にして貼る」だったんですよ。それもまたビックリでしょ。
より
(中略)
ではここでOSの解像度の中身に戻りますと、さきほど「Macは1インチ分を72粒(dpi)、Windowsは96粒(dpi)使って表している」という取り決めのことだ、と説明しました。
じゃなんでたったこれだけのことが問題なんだ、ということですが、問題はあるんです。何を隠そう、(隠したってはじまらないけど)OSごとにその粒数が違うんですな、これが。気のきいた方ならもう察しがつくでしょうけど、1インチ分の長さが違って見えるんですよ!
具体的にいうと、Macは1インチ分を72粒(dpi)、Windowsは96粒(dpi)使って表します。WindowsはMacの約1.3倍の長さになるんです。
でも、画像に関してはピクセル=粒数で大きさを決めていますから、どっちのOSでも100粒なら100粒、大きさに変わりありません。「1インチ分」なんて気にすることはめったにないでしょ。だからまず画像に関してはよし。じゃ何に気を使う必要があるか!
文字、文字ですよ。文字って「ポイント」っていう単位使ったりするでしょ?あれが問題です。
「ポイント」という単位はもともと印刷物に使う文字の大きさの単位で、1インチの72分の1が1ポイントと決められています。そしてMacは生まれた当初からDTPを視野に入れていましたから、印刷物と単位を同じにしました。だから1インチを72粒、1粒1ポイントとなるように設計されています。でもWindowsは同じ1ポイントを表示するのに約1.3粒使うんですよ!
でもって問題なのは、htmlで設定するfont size="3"とかいう設定は、このポイントを基準としているってことです。基本的にfont size="3"が12ポイントだったかと思いますが。
だから文字の大きさを「ポイント」で設定してしまうと、Mac上で10文字横に並ぶ幅に、Windowsは7文字しか入らないで、3文字は改行されてしまう。これはテキストがいっぱいある画面をかっこよくレイアウトしたい人には大問題ですね。ちゃんとゆとりを考えておかないと、どこかの画面でとんでもない箇所で改行されてたりってことがおきる。DTP出身の人なんかだと気絶しちゃうような事件ですわね。
じゃどうしたらいいんだってことですが、オーソドックスな方法として、「スタイルシート」を使うというのが一般的です。スタイルシートでは、フォントサイズをpx(ピクセル)で設定することができます。こうすれば、基本的にはMacだろうとWindowsだろうと、12pxといえば12pxで見えるから。(「基本的には」と言ったのは、これも必ずしも完璧ではないからです。使っているフォントによっては、改行場所が違ってしまうこともなくはない。まあでも率は低いのでこの際この問題は追求しないことにしましょう。)こういう点ではスタイルシートはありがたいですね。スタイルシートが存在しなかったころは、対処方法は「画像にして貼る」だったんですよ。それもまたビックリでしょ。
2007年5月21日月曜日
OS-Xのメモリ管理
http://soap.s216.xrea.com/umu/mt/archives/001117.html
http://soap.s216.xrea.com/umu/mt/archives/001141.htmlより引用
私はスワップファイル増殖撲滅協会自称会員なので、 スワップファイルをなくそうという記事を以前書いた。
簡単に言うと、以下の作業を行うことで、解放されていないメモリが大幅に解放されるため、スワップファイルにページアウトせずに踏ん張れるようになって、少し幸せになれるというものだ。特にメモリ喰らいのFirefoxを使っている人には効果大でしょう。 (Firefoxのメモリリーク抑制についてはこちらも参照されたい
→Firefoxのメモリ食いを小食にする (うむらうす))。
Finderの再起動
Dockの再起動
Weekly Maintainance Script実行
このそれぞれの作業の実行方法も書いたが(MainMenuを使うと便利)、三手必要なのもめんどくさいなと思っていた。そこで、これらをAppleScript一本にまとめ、一手で済むようにした。
内容は前回スワップファイルをなくそうに書いたことそのままだ。私はこれをスクリプトメニューに登録していて、 MenuMeterで残りメモリを監視しておき、残りが少なくなったら実行、という風にしているのだが、もう便利でたまらない。
→ファイルをダウンロード(Release Memory.scpt)
注)Safariでダウンロードした場合は拡張子が変わる。その場合の対応はmutaさんの記事を参照されたい(他人任せですみません)。
スクリプトメニューへの登録の仕方はここに詳しく書いたので参照のこと。
→NBA TVのvideoを手軽に楽しむ (うむらうす)
さて、このAppleScriptを実行すると、FinderとDockの再起動は勝手に進むが、 Weekly Maintenance Scriptの実行には管理者権限がいるため、パスワードが要求される。ファイルの内容は下に書いてあるので、「なんでパスワードがいるの?」と心配になる人は、読んでから実行すると良いだろう。
ということで、以下ソースと説明。(3/18 終了メッセージ追加)
(*
「KOTOERA | AppleScript | Finderの再起動」より
http://www.geocities.jp/aqua7bowler/applescript/relaunch_finder.html
*)
-- Finder再起動
tell application "Finder"
quit
delay 1
activateFinder() of me
if exists Finder window 1 then
activate
set windowBounds to (bounds of Finder window 1)
set theFolder to target of Finder window 1
close Finder window 1
open theFolder
set bounds of Finder window 1 to windowBounds
end if
end tell
on activateFinder()
try
tell application "Finder" to activate
on error
activateFinder() of me
end try
end activateFinder
-- Finder再起動ここまで
-- Dock再起動
do shell script "killall Dock"
-- Dock再起動ここまで
-- Weekly Maintenance Scriptを管理者権限で実行
-- http://www.thexlab.com/faqs/maintscripts.html
-- http://developer.apple.com/jp/technotes/tn2065.html
do shell script "periodic weekly" with administrator privileges
-- Weekly Maintenance Scriptを管理者権限で実行ここまで
display dialog "Release Memory 終了しました!" buttons {"OK"}
書いてあるように、Finderの再起動はKOTOERAさん の 「AppleScript | Finderの再起動」を、 Weekly Maintenance Scriptの管理者権限での実行は Running Mac OS X Maintenance Scriptsと do shell script in AppleScript を参考にさせてもらった。というかそのまんま。ありがとうございます。
--------------------------------------------------------------------------------
まとめ
スワップファイル増殖を防ぐため、解放されていないメモリを解放する作業をAppleScript一発でできるようにしたら、すごく満足
エラーの処理とか全く考えてないので、誰かえらい人が改良してくれるとうれしい
3/15追記)
本AppleScriptをmutaさんに紹介して頂いた。こちらの適当記事よりもよっぽど丁寧に解説して頂いた。私はSafari使っていないので、拡張子が変わるとか全く考慮してなかったので、補足して頂いて、とても感謝。実は私はメモリを2G積んでいるので強烈に解放感を感じるのだが、環境によってはそんなに効かなかい・・・?
私の経験上、Swapfileが4つとかになると、絶望的に全ての動作が遅くなるのだが、それを私の環境で防げていることは間違いない。
追記終わり)
http://soap.s216.xrea.com/umu/mt/archives/001141.htmlより引用
私はスワップファイル増殖撲滅協会自称会員なので、 スワップファイルをなくそうという記事を以前書いた。
簡単に言うと、以下の作業を行うことで、解放されていないメモリが大幅に解放されるため、スワップファイルにページアウトせずに踏ん張れるようになって、少し幸せになれるというものだ。特にメモリ喰らいのFirefoxを使っている人には効果大でしょう。 (Firefoxのメモリリーク抑制についてはこちらも参照されたい
→Firefoxのメモリ食いを小食にする (うむらうす))。
Finderの再起動
Dockの再起動
Weekly Maintainance Script実行
このそれぞれの作業の実行方法も書いたが(MainMenuを使うと便利)、三手必要なのもめんどくさいなと思っていた。そこで、これらをAppleScript一本にまとめ、一手で済むようにした。
内容は前回スワップファイルをなくそうに書いたことそのままだ。私はこれをスクリプトメニューに登録していて、 MenuMeterで残りメモリを監視しておき、残りが少なくなったら実行、という風にしているのだが、もう便利でたまらない。
→ファイルをダウンロード(Release Memory.scpt)
注)Safariでダウンロードした場合は拡張子が変わる。その場合の対応はmutaさんの記事を参照されたい(他人任せですみません)。
スクリプトメニューへの登録の仕方はここに詳しく書いたので参照のこと。
→NBA TVのvideoを手軽に楽しむ (うむらうす)
さて、このAppleScriptを実行すると、FinderとDockの再起動は勝手に進むが、 Weekly Maintenance Scriptの実行には管理者権限がいるため、パスワードが要求される。ファイルの内容は下に書いてあるので、「なんでパスワードがいるの?」と心配になる人は、読んでから実行すると良いだろう。
ということで、以下ソースと説明。(3/18 終了メッセージ追加)
(*
「KOTOERA | AppleScript | Finderの再起動」より
http://www.geocities.jp/aqua7bowler/applescript/relaunch_finder.html
*)
-- Finder再起動
tell application "Finder"
quit
delay 1
activateFinder() of me
if exists Finder window 1 then
activate
set windowBounds to (bounds of Finder window 1)
set theFolder to target of Finder window 1
close Finder window 1
open theFolder
set bounds of Finder window 1 to windowBounds
end if
end tell
on activateFinder()
try
tell application "Finder" to activate
on error
activateFinder() of me
end try
end activateFinder
-- Finder再起動ここまで
-- Dock再起動
do shell script "killall Dock"
-- Dock再起動ここまで
-- Weekly Maintenance Scriptを管理者権限で実行
-- http://www.thexlab.com/faqs/maintscripts.html
-- http://developer.apple.com/jp/technotes/tn2065.html
do shell script "periodic weekly" with administrator privileges
-- Weekly Maintenance Scriptを管理者権限で実行ここまで
display dialog "Release Memory 終了しました!" buttons {"OK"}
書いてあるように、Finderの再起動はKOTOERAさん の 「AppleScript | Finderの再起動」を、 Weekly Maintenance Scriptの管理者権限での実行は Running Mac OS X Maintenance Scriptsと do shell script in AppleScript を参考にさせてもらった。というかそのまんま。ありがとうございます。
--------------------------------------------------------------------------------
まとめ
スワップファイル増殖を防ぐため、解放されていないメモリを解放する作業をAppleScript一発でできるようにしたら、すごく満足
エラーの処理とか全く考えてないので、誰かえらい人が改良してくれるとうれしい
3/15追記)
本AppleScriptをmutaさんに紹介して頂いた。こちらの適当記事よりもよっぽど丁寧に解説して頂いた。私はSafari使っていないので、拡張子が変わるとか全く考慮してなかったので、補足して頂いて、とても感謝。実は私はメモリを2G積んでいるので強烈に解放感を感じるのだが、環境によってはそんなに効かなかい・・・?
私の経験上、Swapfileが4つとかになると、絶望的に全ての動作が遅くなるのだが、それを私の環境で防げていることは間違いない。
追記終わり)
PHP再考
http://blog.livedoor.jp/dankogai/archives/50835571.htmlより引用
そろそろPHPに関して一言いっとくか
こんな記事まで出ていることだし。
[ThinkIT] 第1回:今だからこその「PHPのすすめ」 (1/3)
プログラムをたしなまない方にご注意:
こちらのPHPとはちょっと違います:-p
finalventの日記 - そろそろPHPに関してもう一言いっとくか
各論
使うは天国、インストールは地獄
PHPが一旦インストールされたら、それを使うのは確かに簡単だ。普通にHTMLを書く感覚で
とか書けばいい。しかし、PHPでいろいろやるためには、実際にはさまざまなライブラリーをあらかじめインストールした上で、PHPをそれに合わせてconfigureしなおさなければならない。こうして作られたlibphp#.soは、どれも微妙に、しかしユーザーにとっては耐え難く異なる。
% sh configure --help
の出力が390行(5.2.2現在)というところからして、もうシステム管理者の頭痛の種。なんでもかんでもぶちこめば、やたら重いApacheが出来上がるし、かといっていろいろ削ればあとでユーザーに「なんでXMLが扱えないの?」とか突っ込まれることになる。
Webアプリ以外作る気にならない
PHPは、その生まれからしてWeb Serverと密結合している。Webアプリを作るにはいいが、それ以外の目的には使えない。
「でもCLIがあるじゃん」と言った方。なんでただのshell script書くのにで囲まなきゃならないのか。CLIを使う人にそんな勤勉さを期待されても困るというもの。
反吐がでるほど多い呪文
PHPを使うということは、PHPが用意するコマンドを覚えるということに等しいのだけど、これがやたらと沢山ある。なんでrequireとrequire_onceが分かれているのか、他の言語を知っている人にはさっぱりわからない。
そこには、短い言葉を組み合わせて大きな文章を作るという思想があまりに欠落している。ただ呪文の羅列があるのみ。AnimaliaChordataMammaliaPrimataHomonidaeHomoSapiensでなくHomo::Sapiensと書きたいのだけど。
バージョンが変われば別言語
Mac OS Xには、PerlもRubyもPythonもOSリリース時点での安定版が載っているのに、PHPは4のまま。これはデフォルトでインストールされているのがApache 1.3.xということもあるのだろうけれども、これはAppleがPHPを言語としてではなくWebサーバーのコンポーネントとして見ていることを意味している。
そう。PHPはバージョンの違いがあまりに大きいのだ。PHP4とPHP5の違いに至っては、Perl 5とPerl 6以上に見える。
言語で言語を拡張できない
なぜPHPが(他の言語から見ると)異様に激しくバージョンアップという名の別バージョンリリースを続けているかといえば、PHPには言語をもって言語を拡張するというのが思想からして欠落しているからだという結論に達する。PHPで新しいことをしようとしたら、PHPごと新しくせざるを得ないのだ。PerlもPythonもRubyも、言語はそのままで最新の技術に苦もなく対応していることと好対照である。
MVCのVしか出来ない
PHPというのは、Model, View, ControllerのViewのみしか扱えないことを宿命づけられた言語である。実際PHPのみで動いているWebサービスというのはほとんどなく、実際にはMySQLをはじめ、PHPのためのバックエンドプログラムが山のようにあり、PHPはそれを呼び出しているに過ぎない。
なぜPHPヘビーユーザーのDHHがPHP on RailsではなくRuby on Railsを作ったかといえば、それに尽きると思う。
総論
PHPを一言で言うと、「使えても作れない」言語だということになる。PHPのためにお膳立てした環境を使う事はできても、その環境をお膳立てしてあげるにはPHP以上のものが必ず必要になってくる。
そのことは別に悪くない。というより、他の言語がViewをあまりにおろそかにしてきたというのは事実だろう。HTML書きたちを、プログラマーたちが「下に見ていた」ということは否定できない。そのHTML書きたちの、「私たちにも少しはプログラムさせてよ」という声に他の言語屋たちが耳を充分傾けてこなかったことこそ、猛省すべき課題だろう。
しかし、PHPではプログラマーがプログラムを続けるための一番のご褒美がほとんどない。それは何かというと「新しい技を覚える」という喜びである。「新しい呪文」ではない。それならいくらでもある。しかし新しい呪文を覚えた所で、心理報酬は大したことがない。単に知識が増えただけだ。PHPを使っても、知識は増えても知恵が増える気がちっともしないのである。
それでも、
Matzにっき(2007-05-10)
「PHPは言語としてはダメだが、どこにでもあるし、知見も蓄積されていることがキラーだ」 という話。納得できる。
という意見はある。しかし、その知見もよくみれば単なる知識の断片の寄せ集めばかりで、それらを覚えても脳の空き容量が減る気しかしないのはなぜだろう。
ましてや、今やWebページ生成言語は、PHPだけではないのだ。Webページにコードを埋め込むというのは、大抵のLLには出来るし(HaskellすらHaskell Server Pageというのがある)、それゆえPHPの手軽さも今や他の言語を知っている人がわざわざPHPに乗り換えるほどの魅力にあまりに乏しい。
ましてや、最近はAjaxの台頭で、かつてはサーバー側にやらせていたViewを、ブラウザー側にやらせる機会が増えてきた。PHPが「どこにでもある」かどうかは疑念の余地があるが、JavaScriptがどこにもあるのは疑念の余地がない。そして幸いなことに、JavaScriptは「新しい技を覚える」という喜びを味わえる言語でもある。そのことに皆が気づくのにだいぶ時間はかかったが、今ではみんな知っている。車輪の再発明があまりに多いのは頭痛の種だが、それでも車輪を再発明できるというのは、プログラマーの成長にとっては欠かせない特徴なのだ。
PHPにおいては、PHP「環境」に用意された車輪を使い続けるしかない。
だから、PHPに対して正しいスタンスは、「使うにとどめる」というものだと思う。「作る」までやりたかったら、他をあたるべきだろう。
そろそろPHPに関して一言いっとくか
こんな記事まで出ていることだし。
[ThinkIT] 第1回:今だからこその「PHPのすすめ」 (1/3)
プログラムをたしなまない方にご注意:
こちらのPHPとはちょっと違います:-p
finalventの日記 - そろそろPHPに関してもう一言いっとくか
各論
使うは天国、インストールは地獄
PHPが一旦インストールされたら、それを使うのは確かに簡単だ。普通にHTMLを書く感覚で
以下の環境変数が設定されています:
とか書けばいい。しかし、PHPでいろいろやるためには、実際にはさまざまなライブラリーをあらかじめインストールした上で、PHPをそれに合わせてconfigureしなおさなければならない。こうして作られたlibphp#.soは、どれも微妙に、しかしユーザーにとっては耐え難く異なる。
% sh configure --help
の出力が390行(5.2.2現在)というところからして、もうシステム管理者の頭痛の種。なんでもかんでもぶちこめば、やたら重いApacheが出来上がるし、かといっていろいろ削ればあとでユーザーに「なんでXMLが扱えないの?」とか突っ込まれることになる。
Webアプリ以外作る気にならない
PHPは、その生まれからしてWeb Serverと密結合している。Webアプリを作るにはいいが、それ以外の目的には使えない。
「でもCLIがあるじゃん」と言った方。なんでただのshell script書くのに
反吐がでるほど多い呪文
PHPを使うということは、PHPが用意するコマンドを覚えるということに等しいのだけど、これがやたらと沢山ある。なんでrequireとrequire_onceが分かれているのか、他の言語を知っている人にはさっぱりわからない。
そこには、短い言葉を組み合わせて大きな文章を作るという思想があまりに欠落している。ただ呪文の羅列があるのみ。AnimaliaChordataMammaliaPrimataHomonidaeHomoSapiensでなくHomo::Sapiensと書きたいのだけど。
バージョンが変われば別言語
Mac OS Xには、PerlもRubyもPythonもOSリリース時点での安定版が載っているのに、PHPは4のまま。これはデフォルトでインストールされているのがApache 1.3.xということもあるのだろうけれども、これはAppleがPHPを言語としてではなくWebサーバーのコンポーネントとして見ていることを意味している。
そう。PHPはバージョンの違いがあまりに大きいのだ。PHP4とPHP5の違いに至っては、Perl 5とPerl 6以上に見える。
言語で言語を拡張できない
なぜPHPが(他の言語から見ると)異様に激しくバージョンアップという名の別バージョンリリースを続けているかといえば、PHPには言語をもって言語を拡張するというのが思想からして欠落しているからだという結論に達する。PHPで新しいことをしようとしたら、PHPごと新しくせざるを得ないのだ。PerlもPythonもRubyも、言語はそのままで最新の技術に苦もなく対応していることと好対照である。
MVCのVしか出来ない
PHPというのは、Model, View, ControllerのViewのみしか扱えないことを宿命づけられた言語である。実際PHPのみで動いているWebサービスというのはほとんどなく、実際にはMySQLをはじめ、PHPのためのバックエンドプログラムが山のようにあり、PHPはそれを呼び出しているに過ぎない。
なぜPHPヘビーユーザーのDHHがPHP on RailsではなくRuby on Railsを作ったかといえば、それに尽きると思う。
総論
PHPを一言で言うと、「使えても作れない」言語だということになる。PHPのためにお膳立てした環境を使う事はできても、その環境をお膳立てしてあげるにはPHP以上のものが必ず必要になってくる。
そのことは別に悪くない。というより、他の言語がViewをあまりにおろそかにしてきたというのは事実だろう。HTML書きたちを、プログラマーたちが「下に見ていた」ということは否定できない。そのHTML書きたちの、「私たちにも少しはプログラムさせてよ」という声に他の言語屋たちが耳を充分傾けてこなかったことこそ、猛省すべき課題だろう。
しかし、PHPではプログラマーがプログラムを続けるための一番のご褒美がほとんどない。それは何かというと「新しい技を覚える」という喜びである。「新しい呪文」ではない。それならいくらでもある。しかし新しい呪文を覚えた所で、心理報酬は大したことがない。単に知識が増えただけだ。PHPを使っても、知識は増えても知恵が増える気がちっともしないのである。
それでも、
Matzにっき(2007-05-10)
「PHPは言語としてはダメだが、どこにでもあるし、知見も蓄積されていることがキラーだ」 という話。納得できる。
という意見はある。しかし、その知見もよくみれば単なる知識の断片の寄せ集めばかりで、それらを覚えても脳の空き容量が減る気しかしないのはなぜだろう。
ましてや、今やWebページ生成言語は、PHPだけではないのだ。Webページにコードを埋め込むというのは、大抵のLLには出来るし(HaskellすらHaskell Server Pageというのがある)、それゆえPHPの手軽さも今や他の言語を知っている人がわざわざPHPに乗り換えるほどの魅力にあまりに乏しい。
ましてや、最近はAjaxの台頭で、かつてはサーバー側にやらせていたViewを、ブラウザー側にやらせる機会が増えてきた。PHPが「どこにでもある」かどうかは疑念の余地があるが、JavaScriptがどこにもあるのは疑念の余地がない。そして幸いなことに、JavaScriptは「新しい技を覚える」という喜びを味わえる言語でもある。そのことに皆が気づくのにだいぶ時間はかかったが、今ではみんな知っている。車輪の再発明があまりに多いのは頭痛の種だが、それでも車輪を再発明できるというのは、プログラマーの成長にとっては欠かせない特徴なのだ。
PHPにおいては、PHP「環境」に用意された車輪を使い続けるしかない。
だから、PHPに対して正しいスタンスは、「使うにとどめる」というものだと思う。「作る」までやりたかったら、他をあたるべきだろう。
2007年5月18日金曜日
おまけのPerl Script 2点
その1 文字コードを表示するスクリプト。
MacOS9では「この文字のShift-JISコードなんだっけ?」と思ったときに使える。
print"文字入力>>";
$str = くSTDIN>;
# 引数を $str に格納
(このblogでは<←はhtml言語として認識してしまうので「く」で代用
chop($str);
# 改行を取り除く
@arr=split//,$str;
# $strをバイトで分解して@arrに格納
foreach $byte(@arr){
#@arrの各バイトを$byteに格納しながらループ
@buf = unpack("CC", $byte);
#10進数に変換して@bufに格納
printf "%x%x",@buf
# Shift-JISコード(16進数)で出力
}
#ループを終了
# 8進数にする場合はprintf "%o%o",@buf となる
# 00で始まる文字は00が省略されてしまうため、うまくいかない。今後の課題。
その2 LFキャラcheck
お馬鹿なデザは客から支給されたwordテキストをまんまコピペでイラレに流し込む。当然、行頭にはLFキャラが入ってくる。イラレからまんまカラーゲラを出力する分には気づかないが、EPSにしてQuarkに貼ると文字組みが狂って出力される。その症状が反映されるPSプリンタと反映されないPSプリンタがあるからやっかいである。いちいちファイルを開いて検索・置換するのはメンドイんで、Perlスクリプトにドラッグしてチェック。
#!/user/local/bin/perl
while(<>){
if(/\(\\012A\)/){
print"LFキャラが使用されています。\n";
}
#イラ8用
if(/\( \)\(\\000\\001\)/){
print"LFキャラが使用されています。\n";
}
#イラ9用
}
MacOS9では「この文字のShift-JISコードなんだっけ?」と思ったときに使える。
print"文字入力>>";
$str = くSTDIN>;
# 引数を $str に格納
(このblogでは<←はhtml言語として認識してしまうので「く」で代用
chop($str);
# 改行を取り除く
@arr=split//,$str;
# $strをバイトで分解して@arrに格納
foreach $byte(@arr){
#@arrの各バイトを$byteに格納しながらループ
@buf = unpack("CC", $byte);
#10進数に変換して@bufに格納
printf "%x%x",@buf
# Shift-JISコード(16進数)で出力
}
#ループを終了
# 8進数にする場合はprintf "%o%o",@buf となる
# 00で始まる文字は00が省略されてしまうため、うまくいかない。今後の課題。
その2 LFキャラcheck
お馬鹿なデザは客から支給されたwordテキストをまんまコピペでイラレに流し込む。当然、行頭にはLFキャラが入ってくる。イラレからまんまカラーゲラを出力する分には気づかないが、EPSにしてQuarkに貼ると文字組みが狂って出力される。その症状が反映されるPSプリンタと反映されないPSプリンタがあるからやっかいである。いちいちファイルを開いて検索・置換するのはメンドイんで、Perlスクリプトにドラッグしてチェック。
#!/user/local/bin/perl
while(<>){
if(/\(\\012A\)/){
print"LFキャラが使用されています。\n";
}
#イラ8用
if(/\( \)\(\\000\\001\)/){
print"LFキャラが使用されています。\n";
}
#イラ9用
}
2007年5月12日土曜日
PDFはいじれない
PDF関連のネタはCLさんが書いていますが
http://blog.dtpwiki.jp/dtp/pdf/index.html
今週、そのトラブルに遭遇しました。プロパティで出所を見るとMacのDistillarを通してPDF1.4(Acrobat4.0)形式に作成されたPDFです。いくつかのTrueTypeフォントが使われているものの、全て埋め込まれています。
このPDFをPSファイルにデータ書き出しをしてFacilisに面付けして出力したところ、文字抜けの発生するところが出てきました。TrueTypeフォントが文字抜けを起こすのなら理解できますが、GothicMB101-Bという純然たるPostScriptフォントです。
以下は検証した結果です。
PDFからのデータ書き出しにはPSファイルとEPSの2通りのやり方がありますが、もう1つのやり方でやってみました。別な箇所で文字抜けを起こしました。
※2つのデータはFacilisに貼る前にRIPに投げて検証
ならば、PDFをそのままRIPに投げたらどうなるか?
問題なくラスタライズされました。
PDFはいじるな!と言われていますが、データ書き出しも「いじる」範疇に入るようです。
現段階で一番安全な運用法は、PDFをTrueFlowに投げてRipped outlineEPSを作成して、そいつを面付けするのがいいみたいです。
OS-Xの機能で作成されたPDFは画面ではまともに見えるものの、カラーゲラ出力ですら透明部分の出力がうまくいかず、対処法として上記のようにRipped outlineEPSを作成して出力しました。
http://blog.dtpwiki.jp/dtp/pdf/index.html
今週、そのトラブルに遭遇しました。プロパティで出所を見るとMacのDistillarを通してPDF1.4(Acrobat4.0)形式に作成されたPDFです。いくつかのTrueTypeフォントが使われているものの、全て埋め込まれています。
このPDFをPSファイルにデータ書き出しをしてFacilisに面付けして出力したところ、文字抜けの発生するところが出てきました。TrueTypeフォントが文字抜けを起こすのなら理解できますが、GothicMB101-Bという純然たるPostScriptフォントです。
以下は検証した結果です。
PDFからのデータ書き出しにはPSファイルとEPSの2通りのやり方がありますが、もう1つのやり方でやってみました。別な箇所で文字抜けを起こしました。
※2つのデータはFacilisに貼る前にRIPに投げて検証
ならば、PDFをそのままRIPに投げたらどうなるか?
問題なくラスタライズされました。
PDFはいじるな!と言われていますが、データ書き出しも「いじる」範疇に入るようです。
現段階で一番安全な運用法は、PDFをTrueFlowに投げてRipped outlineEPSを作成して、そいつを面付けするのがいいみたいです。
OS-Xの機能で作成されたPDFは画面ではまともに見えるものの、カラーゲラ出力ですら透明部分の出力がうまくいかず、対処法として上記のようにRipped outlineEPSを作成して出力しました。
2007年5月10日木曜日
配置画像の収集
あかつきさんより
http://pocketdtp.blog16.fc2.com/blog-entry-116.html引用
DTP駆け込み寺の掲示板のスレッド、
イラレのCS2で配置した写真だけを集める方法?より、
Illustrator CS2に付いてくる、スクリプト→サンプルスクリプト→AppleScript→Collect for Outputに入っているスクリプトで問題解決です。
収集したいaiファイルをこのスクリプトにドラッグ&ドロップすれば、収集先を聞いてきて、aiファイルと配置画像を全て収集してくれました。
はじめにIllustrator CS2を立ち上げ、ファイルを開いていた方が成功します。ダイアログなど英語表記ですが、落ち着いてみればたいしたことは書いていないので、簡単に使えました。
[あらじん]
ということで、試してみました。
1.スクリプトを用意します。
CS2の場合は、アプリケーションをインストールすると、
/Applications/Adobe illustrator CS2/スクリプト/サンプルスクリプト/AppleScript/Collect for Output/
に「Collect for Output.app」というアプリケーション形式のAppleScriptがインストールされていると思います。
CS/10およびCS2で自動インストールされていない場合は、インストールディスクからコピーします。下記の場所に格納されています。
CS2の場合、
インストールディスク2/テクニカル情報/スクリプト/サンプルスクリプト/AppleScript/Collect for Output
CSの場合、
/Adobe テクニカル情報/Scripting/Sample Scripts/AppleScript/Collect for Output
10の場合、
/Illustrator エクストラ/Scripting/Sample Scripts/AppleScript/Collect for Output
※アプリケーション内のIllustratorフォルダにコピーして、Dockに保存しておくと使いやすいと思います。
スクリプト自体は同じみたいで、CS2フォルダ内のスクリプトが10でも動きました。
2.Illustratorのドキュメントを開きます。
モデルはウチのナル。かわいいでしょ(笑)
3.Collect for Output.appを起動します。
AppleScriptのアプリケーション形式ですので、起動すればスクリプトが開始されます。
4.「Press Run to run this script, or Quit to quit.」というメッセージが出ますので、Runをクリック
スクリプトを開始するかどうかの選択ウィンドウです。
5.「Collect the current Illustrator document for output ?」というメッセージが出ますので、OKをクリック
収集を始めるかどうかの選択ウィンドウです。3.と重複する内容なのでちょっと煩雑。
6.「Choose a Folder」で保存先を選択。
ダイアログ左下に「New Folder」のボタンがありますので、新規フォルダを作成してそこに保存することも出来ます。
7.保存先を選択すると、ドキュメントが「別名保存」され、同じ階層にリンクファイルが一緒に保存され、完了すると選択したフォルダに移動します。
このスクリプト、画像を収集する際にドキュメントを別名保存しているようで、動作完了までちょっと時間がかかります。また、eps形式のドキュメントもai形式で保存されますので、入稿用にeps保存する必要がある場合は、再度保存する必要があります。
それから、スクリプトに画像収集したいドキュメントをドラッグ&ドロップしても収集が可能です。
ついでに、OS9の場合。
OSX用のスクリプトは動きませんので、Illustrator10のインストールディスクからOS9用のスクリプトをコピーします(格納場所、ファイル名は同じです)。
Ver10では同じように収集が可能です。が、Ver8でドキュメントを開いてスクリプトを試してみましたが、スクリプトを起動すると10が立ち上がってしまい、さらにその後は動作しませんでした。なので、Ver8で画像を収集する場合は「イラレの鬼」等を使うしかないみたいです。
間違っても、ver8で作成したドキュメントをver10で開き、このスクリプトを使用して画像を収集、10のドキュメントを8にバージョンダウン保存して入稿したりしないこと。
せっかく配置画像を漏れなく入稿しても、別の要因で出力できなくなってしまいます。
http://pocketdtp.blog16.fc2.com/blog-entry-116.html引用
DTP駆け込み寺の掲示板のスレッド、
イラレのCS2で配置した写真だけを集める方法?より、
Illustrator CS2に付いてくる、スクリプト→サンプルスクリプト→AppleScript→Collect for Outputに入っているスクリプトで問題解決です。
収集したいaiファイルをこのスクリプトにドラッグ&ドロップすれば、収集先を聞いてきて、aiファイルと配置画像を全て収集してくれました。
はじめにIllustrator CS2を立ち上げ、ファイルを開いていた方が成功します。ダイアログなど英語表記ですが、落ち着いてみればたいしたことは書いていないので、簡単に使えました。
[あらじん]
ということで、試してみました。
1.スクリプトを用意します。
CS2の場合は、アプリケーションをインストールすると、
/Applications/Adobe illustrator CS2/スクリプト/サンプルスクリプト/AppleScript/Collect for Output/
に「Collect for Output.app」というアプリケーション形式のAppleScriptがインストールされていると思います。
CS/10およびCS2で自動インストールされていない場合は、インストールディスクからコピーします。下記の場所に格納されています。
CS2の場合、
インストールディスク2/テクニカル情報/スクリプト/サンプルスクリプト/AppleScript/Collect for Output
CSの場合、
/Adobe テクニカル情報/Scripting/Sample Scripts/AppleScript/Collect for Output
10の場合、
/Illustrator エクストラ/Scripting/Sample Scripts/AppleScript/Collect for Output
※アプリケーション内のIllustratorフォルダにコピーして、Dockに保存しておくと使いやすいと思います。
スクリプト自体は同じみたいで、CS2フォルダ内のスクリプトが10でも動きました。
2.Illustratorのドキュメントを開きます。
モデルはウチのナル。かわいいでしょ(笑)
3.Collect for Output.appを起動します。
AppleScriptのアプリケーション形式ですので、起動すればスクリプトが開始されます。
4.「Press Run to run this script, or Quit to quit.」というメッセージが出ますので、Runをクリック
スクリプトを開始するかどうかの選択ウィンドウです。
5.「Collect the current Illustrator document for output ?」というメッセージが出ますので、OKをクリック
収集を始めるかどうかの選択ウィンドウです。3.と重複する内容なのでちょっと煩雑。
6.「Choose a Folder」で保存先を選択。
ダイアログ左下に「New Folder」のボタンがありますので、新規フォルダを作成してそこに保存することも出来ます。
7.保存先を選択すると、ドキュメントが「別名保存」され、同じ階層にリンクファイルが一緒に保存され、完了すると選択したフォルダに移動します。
このスクリプト、画像を収集する際にドキュメントを別名保存しているようで、動作完了までちょっと時間がかかります。また、eps形式のドキュメントもai形式で保存されますので、入稿用にeps保存する必要がある場合は、再度保存する必要があります。
それから、スクリプトに画像収集したいドキュメントをドラッグ&ドロップしても収集が可能です。
ついでに、OS9の場合。
OSX用のスクリプトは動きませんので、Illustrator10のインストールディスクからOS9用のスクリプトをコピーします(格納場所、ファイル名は同じです)。
Ver10では同じように収集が可能です。が、Ver8でドキュメントを開いてスクリプトを試してみましたが、スクリプトを起動すると10が立ち上がってしまい、さらにその後は動作しませんでした。なので、Ver8で画像を収集する場合は「イラレの鬼」等を使うしかないみたいです。
間違っても、ver8で作成したドキュメントをver10で開き、このスクリプトを使用して画像を収集、10のドキュメントを8にバージョンダウン保存して入稿したりしないこと。
せっかく配置画像を漏れなく入稿しても、別の要因で出力できなくなってしまいます。
初めて作ったPerl Script
入門書を片手に生れて初めて作ったPerl Script。
市販の入門書よりもせうぞーさんの
http://www.seuzo.jp/st/Works/MacPerl-lesson.pdfの方が役に立った。
PDFを作成する際に、OCFのダイナフォントやフォントワークス書体をCIDに変換してエンベットさせる。
(フォントワークス外字は抜けてしまいます。今後の課題です。)
書き出したPSファイルを以下のPerlで処理。
#!/usr/local/bin/perl -pi.bk
#元PSファイル名の後ろに.bkがつきます。
s/(D[CF]P.*?)-(.*?)-(83pv)/$1CID-$2-$3/g;
s/Plus(?=-.+-83pv)/CID/g;
s/CIDCID/CID/g;
#元DFPのCIDとOCFが混在の場合は、font名がCIDCIDになってしまうのでCIDにする。
別な書き方として
#!/usr/local/bin/perl
While(<>){
open(OUTPUT,">$ARGV.new")unless -e"$ARGV.new";
#作成されたPSファイル名の後ろに.newがつきます。
s/(D[CF]P.*?)-(.*?)-(83pv)/$1CID-$2-$3/g;
s/Plus(?=-.+-83pv)/CID/g;
s/CIDCID/CID/g;
print OUTPUT;
}
close OUTPUT;
作成されたPSファイルをCIDフォントのある環境でDistillarにかけるとFontが埋め込まれます。
市販の入門書よりもせうぞーさんの
http://www.seuzo.jp/st/Works/MacPerl-lesson.pdfの方が役に立った。
PDFを作成する際に、OCFのダイナフォントやフォントワークス書体をCIDに変換してエンベットさせる。
(フォントワークス外字は抜けてしまいます。今後の課題です。)
書き出したPSファイルを以下のPerlで処理。
#!/usr/local/bin/perl -pi.bk
#元PSファイル名の後ろに.bkがつきます。
s/(D[CF]P.*?)-(.*?)-(83pv)/$1CID-$2-$3/g;
s/Plus(?=-.+-83pv)/CID/g;
s/CIDCID/CID/g;
#元DFPのCIDとOCFが混在の場合は、font名がCIDCIDになってしまうのでCIDにする。
別な書き方として
#!/usr/local/bin/perl
While(<>){
open(OUTPUT,">$ARGV.new")unless -e"$ARGV.new";
#作成されたPSファイル名の後ろに.newがつきます。
s/(D[CF]P.*?)-(.*?)-(83pv)/$1CID-$2-$3/g;
s/Plus(?=-.+-83pv)/CID/g;
s/CIDCID/CID/g;
print OUTPUT;
}
close OUTPUT;
作成されたPSファイルをCIDフォントのある環境でDistillarにかけるとFontが埋め込まれます。
OS9が消える前に 1
あぷらいとさんより
http://homepage2.nifty.com/upright/aidata.html
BBSからも
Illustrator8データの修復
投稿者:あぷらいと 投稿日:2006/01/20(Fri) 15:30 No.530
最近2件のIllustratorデータが開かないと検証をたのまれました。
1件目は「メールで送られてきたデータ」で拡張子が「.ai 1.ps」となっているので、
メールで圧縮せずそのままやりとりしたものらしい。
内容はver.11で作成されver.8で書き出されたもの。
取り敢えずver.8で開いてみると、
************************************************************
イラストレーションを開くことができません。このイラストレーションでは、
オペレータに対するオペランドの数が正しくありません。
不正なオペレータ:「C」
コンテクスト:
(
%AI6_BeginPatternLayer
0 J 0 j 1 w 4 M []0 d
0 XR
27.2285 49.7178 m
56.9531 49.193454.3838 44.3047 54.2139 43.9805 C
************************************************************
こちらはよく見る状況。
「49.1934」と「54.3838」の間のスペースが欠落している。
エディタで開いてスペースを入れて、Illustratorで開く、
の繰り返しでなんとか開けるようになりました。
ver.8以前のデータをそのままメールでやりとりしたものは
このようなスペースの欠落をよく見ます。
2件目を開いてみると、
************************************************************
イラストレーションを開くことができません。このイラストレーションには、
不当なオペランドが含まれています。
不正なオペレータ:「userdict」
コンテクスト:
%%CreationDate (04/10/93) ()
%%Copyright: ((C) 1987-1996 Adobe Systems Incorporated
All Rights Reserved)
userdict
************************************************************
Adobeのデータベースサポートの「文書番号:216266」の方法では、
「A C D」は、文字が縦組のため一文字ずつバラバラとなってしまう。
「B」の「%%PageOrigin:0 0」に書き換える方法では開きませんでした。
最後の手段として、Illustratorで「新規ファイル」を作成・保存し
エディタで「開けないファイル」と「新規ファイル」を開いて
「開けないファイル」の「%%DocumentFonts:」「%%DocumentNeededFonts:」
「%AI55J_Tsume:」の部分と、「%AI5_BeginLayer」から「%AI5_EndLayer--」
の部分を「新規ファイル」の同じ個所にコピーしました。
これで無事にファイルが開くことが出来ました。
http://homepage2.nifty.com/upright/aidata.html
BBSからも
Illustrator8データの修復
投稿者:あぷらいと 投稿日:2006/01/20(Fri) 15:30 No.530
最近2件のIllustratorデータが開かないと検証をたのまれました。
1件目は「メールで送られてきたデータ」で拡張子が「.ai 1.ps」となっているので、
メールで圧縮せずそのままやりとりしたものらしい。
内容はver.11で作成されver.8で書き出されたもの。
取り敢えずver.8で開いてみると、
************************************************************
イラストレーションを開くことができません。このイラストレーションでは、
オペレータに対するオペランドの数が正しくありません。
不正なオペレータ:「C」
コンテクスト:
(
%AI6_BeginPatternLayer
0 J 0 j 1 w 4 M []0 d
0 XR
27.2285 49.7178 m
56.9531 49.193454.3838 44.3047 54.2139 43.9805 C
************************************************************
こちらはよく見る状況。
「49.1934」と「54.3838」の間のスペースが欠落している。
エディタで開いてスペースを入れて、Illustratorで開く、
の繰り返しでなんとか開けるようになりました。
ver.8以前のデータをそのままメールでやりとりしたものは
このようなスペースの欠落をよく見ます。
2件目を開いてみると、
************************************************************
イラストレーションを開くことができません。このイラストレーションには、
不当なオペランドが含まれています。
不正なオペレータ:「userdict」
コンテクスト:
%%CreationDate (04/10/93) ()
%%Copyright: ((C) 1987-1996 Adobe Systems Incorporated
All Rights Reserved)
userdict
************************************************************
Adobeのデータベースサポートの「文書番号:216266」の方法では、
「A C D」は、文字が縦組のため一文字ずつバラバラとなってしまう。
「B」の「%%PageOrigin:0 0」に書き換える方法では開きませんでした。
最後の手段として、Illustratorで「新規ファイル」を作成・保存し
エディタで「開けないファイル」と「新規ファイル」を開いて
「開けないファイル」の「%%DocumentFonts:」「%%DocumentNeededFonts:」
「%AI55J_Tsume:」の部分と、「%AI5_BeginLayer」から「%AI5_EndLayer--」
の部分を「新規ファイル」の同じ個所にコピーしました。
これで無事にファイルが開くことが出来ました。
2007年5月4日金曜日
Unicode正規化 その4
引き続き引用
http://http://tama-san.com/document06.html
Unicode正規化の種類
これまでの流れだと「Unicode正規化」イコール「結合文字列を合成すること」と思ってしまうでしょうけど、すこし違います。Unicode正規化は合成するだけでなく、分解することにも使われるからです。
Unicode Consortium は、Unicode正規化を4種類に分けて規定しています。
NFC Normalization Form C
NFD Normalization Form D
NFKC Normalization Form KC
NFKD Normalization Form KD
「Normalization Form」は 正規形 と訳されています。「正規化した状態」というような意味です。つまりこの4つは、文字を
合成(Composition)する
分解(Decomposition)する
互換分解(K(C)ompatibility Decomposition)してから合成(Composition)する
互換分解(K(C)ompatibility Decomposition)する
ための方法であるということです。
ここでは、あまり深く掘り下げないことにしているので、「互換分解」には触れません。さらに、話を簡潔にするため、私たちの目的に直接関わる「NFC」だけに限定して見て行くことにします。
テキストエディットに「NFC」がない理由
OS Xには、Unicode正規化のAPIが用意されています。ですから、ソフトウェアにUnicode正規化の機能を実装する場合、そのAPIを利用するだけで簡単にできてしまいます。「その1」の簡単なソフトも、そうやって作りました。
それでは、どうしてOS Xの標準エディタであるテキストエディットに、ユーザが「NFC」を適用できる機能がないのでしょうか?
それは、一見とても便利そうな「NFC」に大きな問題があるからです。逆に、NFCを「結合文字列を合成するためだけに使う」商用ソフトは、その開発体制にひどい欠陥があると見て間違いないでしょう。
NFCの大きな問題
私は上記でNFCを「文字を合成する方法」と書きましたが、実際には予想外の処理をしています。すなわち、これが「NFC」のやっていることです。
「分解(Decomposition)してから合成(Composition)する」
「その1」に登場したこの文字で見てみます。まず、この3つはまったく同じ字形ですが、データ上は
「01D6」「00FC 0304」「0075 0308 0304」
とどれも異なります。それぞれにNFCを適用してみます。
「01D6」→ 00FC 0304 → 0075 0308 0304 → 00FC 0304 → 01D6
「00FC 0304」→ 0075 0308 0304 → 00FC 0304 → 01D6
「0075 0308 0304」→ 00FC 0304 → 01D6
結果としてはいずれも単一の「01D6」になるのですが、はじめから「01D6」になっている文字も、徹底的に分解されて、再度また合成されます。つまり、分解マッピングで分解可能な文字は、それが単一コードであってもNFCでは分解されているということです。
そして、分解された文字がすべて元通りに合成されれば問題はないのですが、「すべて元通りに合成されるわけではない」ところにNFCの大きな問題があります。つまり、合成をしようとしてNFCを適用したら、かえって1文字がバラバラになったり、別の1文字に変わってしまう文字があるということです。(「その3」でも少し触れましたが、「分解」という用語は、1文字をバラバラにするだけでなく、別の1文字にする意味でも使われます)
「分解したあとに合成しない」ことを「合成除外 Composition Exclusion」といいます。Unicode Consortium の「CompositionExclusions.txt」はその合成除外文字の一覧です。一見すると少なそうですが、全部で1000文字以上もあります。
どうしてこんな文字があるのか、調べてみると理由はいくつかあり、なるほどと思うものもあれば、私では理解できないものもあります(チベット語とかヘブライ語なんて分かりませんし…)。そしてこれが遠い外国の文字だけなら、日本で作られるテキストにNFCを適用してもさして問題はないかなとも思うのですが、実は合成除外にもっとも多いのが「漢字」なのですから、困るのです。
次回は、この不遇な扱いを受ける漢字について見ていきます。
http://http://tama-san.com/document06.html
Unicode正規化の種類
これまでの流れだと「Unicode正規化」イコール「結合文字列を合成すること」と思ってしまうでしょうけど、すこし違います。Unicode正規化は合成するだけでなく、分解することにも使われるからです。
Unicode Consortium は、Unicode正規化を4種類に分けて規定しています。
NFC Normalization Form C
NFD Normalization Form D
NFKC Normalization Form KC
NFKD Normalization Form KD
「Normalization Form」は 正規形 と訳されています。「正規化した状態」というような意味です。つまりこの4つは、文字を
合成(Composition)する
分解(Decomposition)する
互換分解(K(C)ompatibility Decomposition)してから合成(Composition)する
互換分解(K(C)ompatibility Decomposition)する
ための方法であるということです。
ここでは、あまり深く掘り下げないことにしているので、「互換分解」には触れません。さらに、話を簡潔にするため、私たちの目的に直接関わる「NFC」だけに限定して見て行くことにします。
テキストエディットに「NFC」がない理由
OS Xには、Unicode正規化のAPIが用意されています。ですから、ソフトウェアにUnicode正規化の機能を実装する場合、そのAPIを利用するだけで簡単にできてしまいます。「その1」の簡単なソフトも、そうやって作りました。
それでは、どうしてOS Xの標準エディタであるテキストエディットに、ユーザが「NFC」を適用できる機能がないのでしょうか?
それは、一見とても便利そうな「NFC」に大きな問題があるからです。逆に、NFCを「結合文字列を合成するためだけに使う」商用ソフトは、その開発体制にひどい欠陥があると見て間違いないでしょう。
NFCの大きな問題
私は上記でNFCを「文字を合成する方法」と書きましたが、実際には予想外の処理をしています。すなわち、これが「NFC」のやっていることです。
「分解(Decomposition)してから合成(Composition)する」
「その1」に登場したこの文字で見てみます。まず、この3つはまったく同じ字形ですが、データ上は
「01D6」「00FC 0304」「0075 0308 0304」
とどれも異なります。それぞれにNFCを適用してみます。
「01D6」→ 00FC 0304 → 0075 0308 0304 → 00FC 0304 → 01D6
「00FC 0304」→ 0075 0308 0304 → 00FC 0304 → 01D6
「0075 0308 0304」→ 00FC 0304 → 01D6
結果としてはいずれも単一の「01D6」になるのですが、はじめから「01D6」になっている文字も、徹底的に分解されて、再度また合成されます。つまり、分解マッピングで分解可能な文字は、それが単一コードであってもNFCでは分解されているということです。
そして、分解された文字がすべて元通りに合成されれば問題はないのですが、「すべて元通りに合成されるわけではない」ところにNFCの大きな問題があります。つまり、合成をしようとしてNFCを適用したら、かえって1文字がバラバラになったり、別の1文字に変わってしまう文字があるということです。(「その3」でも少し触れましたが、「分解」という用語は、1文字をバラバラにするだけでなく、別の1文字にする意味でも使われます)
「分解したあとに合成しない」ことを「合成除外 Composition Exclusion」といいます。Unicode Consortium の「CompositionExclusions.txt」はその合成除外文字の一覧です。一見すると少なそうですが、全部で1000文字以上もあります。
どうしてこんな文字があるのか、調べてみると理由はいくつかあり、なるほどと思うものもあれば、私では理解できないものもあります(チベット語とかヘブライ語なんて分かりませんし…)。そしてこれが遠い外国の文字だけなら、日本で作られるテキストにNFCを適用してもさして問題はないかなとも思うのですが、実は合成除外にもっとも多いのが「漢字」なのですから、困るのです。
次回は、この不遇な扱いを受ける漢字について見ていきます。
Unicode正規化 その3
引き続き引用
http://tama-san.com/document05.html
「単一コードの1文字」に変換する
「変換」と言うと、なにかとても難しい処理をするような印象をうけますよね。例えば、ある一定の数量的な法則に従ってバイナリコードを加工する、みたいな感じです。しかし、結合文字列を単一コードにする場合、この方法は使えません。そこには「一定の数量的な法則」がなく、あるのは言語の恣意性そのものだからです。
とは言うものの、やはり記号を扱うコンピュータ上の無機的な規格なので、Unicode Consortium は「結合文字列」と「単一コード1文字」の対応関係、いわばこの恣意的な関係を、属性のひとつとして各文字毎に逐一明記しています。
UnicodeData.txt
このファイルには各文字の属性が列挙されていて、その中に私たちが知りたい対応関係が書かれています。ここから「ポ」の文字を見てみましょう。
30DD;KATAKANA LETTER PO;......;30DB 309A;......
カタカナ「ポ」は
単一コードで「30DD」
結合文字列で「30DB 309A」
であることが書かれています。
これから分かることは、ここに書かれている情報に従って、例えば「30DB 309A」を「30DD」に置換することで、私たちの目的である「単一コード1文字への変換」が実現できそうだということです。そして、この UnicodeData.txt の記述に従って置換することが、まさに「Unicode正規化」です。
http://tama-san.com/document05.html
「単一コードの1文字」に変換する
「変換」と言うと、なにかとても難しい処理をするような印象をうけますよね。例えば、ある一定の数量的な法則に従ってバイナリコードを加工する、みたいな感じです。しかし、結合文字列を単一コードにする場合、この方法は使えません。そこには「一定の数量的な法則」がなく、あるのは言語の恣意性そのものだからです。
とは言うものの、やはり記号を扱うコンピュータ上の無機的な規格なので、Unicode Consortium は「結合文字列」と「単一コード1文字」の対応関係、いわばこの恣意的な関係を、属性のひとつとして各文字毎に逐一明記しています。
UnicodeData.txt
このファイルには各文字の属性が列挙されていて、その中に私たちが知りたい対応関係が書かれています。ここから「ポ」の文字を見てみましょう。
30DD;KATAKANA LETTER PO;......;30DB 309A;......
カタカナ「ポ」は
単一コードで「30DD」
結合文字列で「30DB 309A」
であることが書かれています。
これから分かることは、ここに書かれている情報に従って、例えば「30DB 309A」を「30DD」に置換することで、私たちの目的である「単一コード1文字への変換」が実現できそうだということです。そして、この UnicodeData.txt の記述に従って置換することが、まさに「Unicode正規化」です。
Unicode正規化 その2
引き続き引用
http://tama-san.com/document04.html
結合文字列が引き起こす様々な問題
これはSafariでGoogle検索をした結果です。なんと「パンダ」の検索結果が475件しかありません。実はこの「パンダ」の文字、フォルダ名をコピペしたものです。「パ」と「ダ」が結合文字列なので、検出されるのは実際に結合文字列を含んだ「パンダ」か「ハンタ」だけというわけです。OS Xユーザで、このようにアイテム名をコピペしてGoogle検索をしたら、検索結果があまりに少なくて当惑した方も多いのではないでしょうか。また、誰もが魅了される素晴らしいパンダのサイトでも、結合文字列を含む「パンダ」を使っていたら、アクセスが増えることは期待できません。
次は、JeditXで結合文字列が混在したテキストをソートしてみました。左がソート前、右がソート後です。同じ字形なのでソートしても並び順が変わらないことを期待するのですが、データが異なるため期待に違う結果になってしまいます。
文字検索に関しても、同じ字形なら同じようにヒットすることを、どのソフトウェアでもサポートしているわけではありません。
これはCotEditorで「u」を「A」に一括置換してみたものです。「0075」が検索対象となって置換されてることが分かります。(CotEditorはとてもよくできたエディタです。この置換結果も決して悪い仕様ではないので、低く評価しないようにしてください)
このように、思いがけない結果になるのが、結合文字列です。とくに1文字に表示できるソフトでは、その文字が結合文字列であることを判別できないので厄介です。それでは、どうしたらこれらを防ぐことができるのでしょうか。
やはりそれには、結合文字列を「単一コードの1文字」に変換するしか方法はないと思います。上の例で言うと、結合文字列「ハ+半濁音」を1文字の「パ」に変換するということです
http://tama-san.com/document04.html
結合文字列が引き起こす様々な問題
これはSafariでGoogle検索をした結果です。なんと「パンダ」の検索結果が475件しかありません。実はこの「パンダ」の文字、フォルダ名をコピペしたものです。「パ」と「ダ」が結合文字列なので、検出されるのは実際に結合文字列を含んだ「パンダ」か「ハンタ」だけというわけです。OS Xユーザで、このようにアイテム名をコピペしてGoogle検索をしたら、検索結果があまりに少なくて当惑した方も多いのではないでしょうか。また、誰もが魅了される素晴らしいパンダのサイトでも、結合文字列を含む「パンダ」を使っていたら、アクセスが増えることは期待できません。
次は、JeditXで結合文字列が混在したテキストをソートしてみました。左がソート前、右がソート後です。同じ字形なのでソートしても並び順が変わらないことを期待するのですが、データが異なるため期待に違う結果になってしまいます。
文字検索に関しても、同じ字形なら同じようにヒットすることを、どのソフトウェアでもサポートしているわけではありません。
これはCotEditorで「u」を「A」に一括置換してみたものです。「0075」が検索対象となって置換されてることが分かります。(CotEditorはとてもよくできたエディタです。この置換結果も決して悪い仕様ではないので、低く評価しないようにしてください)
このように、思いがけない結果になるのが、結合文字列です。とくに1文字に表示できるソフトでは、その文字が結合文字列であることを判別できないので厄介です。それでは、どうしたらこれらを防ぐことができるのでしょうか。
やはりそれには、結合文字列を「単一コードの1文字」に変換するしか方法はないと思います。上の例で言うと、結合文字列「ハ+半濁音」を1文字の「パ」に変換するということです
Unicode正規化 その1
ものかのさんより
http://tama-san.com/document03.html
実は、OS X には結合文字列が普通にいたるところにあるのです。しかも、新しく簡単に作ることもできてしまいます。やってみましょう。
デスクトップに新規フォルダを作ります。なんと、これだけで結合文字列のできあがりです。「ダ」の文字を「簡単なソフト」へペーストしてみてください。2文字の結合文字列であることが分かります。
このように、OS X のフォルダ名やファイル名などのアイテム名は、結合文字列にできる文字ならすべて結合文字列になってしまいます。アイテム名をテキストにコピー&ペーストしたことがない人はいないでしょうし、普通に作るテキストデータに結合文字列が混ざることは大いにありそうなことです。それにWindowsでもVistaが結合文字列に対応したことで、結合文字列混在の可能性がひときわ高くなったことも押さえておくべきだと思います。
http://tama-san.com/document03.html
実は、OS X には結合文字列が普通にいたるところにあるのです。しかも、新しく簡単に作ることもできてしまいます。やってみましょう。
デスクトップに新規フォルダを作ります。なんと、これだけで結合文字列のできあがりです。「ダ」の文字を「簡単なソフト」へペーストしてみてください。2文字の結合文字列であることが分かります。
このように、OS X のフォルダ名やファイル名などのアイテム名は、結合文字列にできる文字ならすべて結合文字列になってしまいます。アイテム名をテキストにコピー&ペーストしたことがない人はいないでしょうし、普通に作るテキストデータに結合文字列が混ざることは大いにありそうなことです。それにWindowsでもVistaが結合文字列に対応したことで、結合文字列混在の可能性がひときわ高くなったことも押さえておくべきだと思います。
2007年5月2日水曜日
ISBN を書誌情報に変換する Perl script
http://www.snowelm.com/~t/doc/tips/20020411.ja.htmlより
新しい研究室で本の整理をしたついでに、ISBN をコンピュータに入力した。さて、これをどうやって書誌情報に変換するか。業者だとおっきなデータベースがあるのだろうけど、一般人は直接さわることはできない。
ということでオンライン書店に頼ることにする。さしあたり使いやすいのは amazon.co.jp である。和書も洋書も扱えるからである。とはいえ古い本やマイナーな本などは引けないものもあるのだが、まあいいであろう。
ちうわけで perl の出番である。例によって例のごとくきたない正規表現で Amazon の吐く HTML から書誌情報を取り出している。しかし、そのへんの本の番号を入力するだけでいろいろな情報がとれるのは面白い。
念のため、あんまり乱用する (可能な全 ISBN を試すとか……) のはやめてください。amazon の負荷があがります。というかほとんど DoS 攻撃になってしまう……。必要な分だけにしてあげてください。
※表示がうまくいかないのでPerl Scriptは削除しました(5/10)
新しい研究室で本の整理をしたついでに、ISBN をコンピュータに入力した。さて、これをどうやって書誌情報に変換するか。業者だとおっきなデータベースがあるのだろうけど、一般人は直接さわることはできない。
ということでオンライン書店に頼ることにする。さしあたり使いやすいのは amazon.co.jp である。和書も洋書も扱えるからである。とはいえ古い本やマイナーな本などは引けないものもあるのだが、まあいいであろう。
ちうわけで perl の出番である。例によって例のごとくきたない正規表現で Amazon の吐く HTML から書誌情報を取り出している。しかし、そのへんの本の番号を入力するだけでいろいろな情報がとれるのは面白い。
念のため、あんまり乱用する (可能な全 ISBN を試すとか……) のはやめてください。amazon の負荷があがります。というかほとんど DoS 攻撃になってしまう……。必要な分だけにしてあげてください。
※表示がうまくいかないのでPerl Scriptは削除しました(5/10)
Postscript ファイルに参照情報スタンプを押す Perl script
http://www.snowelm.com/~t/doc/tips/20020603.ja.htmlより
最近、自分の文献リストの整備に凝っている。そもそも研究をして文献を増やさなければ文献リストを整備してもしょうがないのであるが、そのことはここでは追求しない(追求しないでください)。
で、自分でひとの文献をインターネットからひっぱってきたときによく起きるのが、どこに載った論文なのか分からないという事態である。クリックしてダウンロードしたファイルには、タイトルやら著者名やらは当然書いてあるのだが、論文誌名とかページ数といった参照情報が書いてないものが意外に多いのである。せめて自分の論文では、最初のページにちゃんと参照情報を書いておきたい。と思うのだが、いったん Postscript ファイルになってしまうと、そこに参照情報を書き足すのは非常におっくうである。これがまあ参照情報のない論文が多い理由なのだろう。
しかし、Postscript ファイルの中身は描画情報である。適当にコマンドをはさみこめば、参照情報を追加することは難しくないはずである。……どこに何をはさむかを間違えなければ、だが。
そこで、Perl Script を書いてみた。Postscript ファイルを食わせると、1ページ目の左上に参照情報のスタンプを追加して、別のファイルに出力するものである。大量の論文に処理するといった事態を考えれば、script になっているほうが有利だし、漢字の処理やら改行の処理も楽にできるだろう、と思い、いろいろ工夫してみた。
しかし、まともに postscript を生成したのは初めてなので苦労した……。後置系の言語と見当がついていたので楽だったけど、それでも Postscript リファレンス本がなければ手も足も出なかったと思われる。しかも、まだいい加減な点が多いので (DSC Comment 内のフォント情報を修正しないなど)、エラーが起きる可能性もあります。一応、作った後表示なり印字をしてみてください。
スタンプ適用前
スタンプ適用後#!/usr/local/bin/perl
# Reference Stamper 1.0
# by Makino Takaki
# 入力ファイルは1行に1エントリで、各エントリは次の形式です。
# [InputFile] [OutputFile] [Reference...]
#
# ファイル名には空白が入ってはだめです。.gz も使えます。
# Reference には次の記号が使えます。
# _..._ 囲まれた範囲をイタリックにします (英語だけ)。
# \n 次の行にいきます。
# \_ 下線そのもの。
# \\ バックスラッシュそのもの。
#
# たとえばこんなかんじです。
# hoge.ps.gz done/hoge.ps.gz なんとか学会 研究報告 AB-CDE, pp.23-34, 2002.
# moge.ps done/moge.ps In _Proc. of NANTOKA '97_\npp.123-135, 1997.
use Jcode;
while($process = <>)
{
my ($in, $out, $comment) = ($process =~ /^\s*(\S+)\s+(\S+)\s+(.*)$/);
print "$in -> $out\n";
if( $in =~ /\.gz$/ ) { $in = "gzip -d -c $in "; } else {$in = "<$in"};
if( $out =~ /\.gz$/ ) { $out = " gzip -9 >$out"; } else {$out = ">$out"};
open(IN, $in) die "Cannot open input file: $!";
open(OUT, $out) die "Cannot open output file: $!";
my $inserted = 0;
my $str = new Jcode($comment)->euc;
my $kanji = 0;
my $italic = 0;
my $ret = "";
# 文字列 $str を Postscript 描画文字列 $ret に変換
while( $str )
{
if( $str =~ /^[\x80-\xff][\x80-\xff]/ )
{ # 漢字だったら (EUCコードであることを前提)
$kanji = 1;
$ret .= '$$XSKanji$$ ';
while( $str =~ s/^([\x80-\xff][\x80-\xff])// )
{
my ($a,$b) = unpack("CC",$1);
$ret .= sprintf("<%02x%02x> show ", $a-128, $b-128);
}
}
if( $str =~ s/^([^_\\\(\)\x00-\x1f\x80-\xff]+)// )
{ # Ascii テキストだったら
$ret .= ($italic ? '$$XSItalic$$ ' : '$$XSAscii$$ ') . "($1) show ";
}
elsif( $str =~ s/^[\x00-\x1f]// )
{ # コントロール文字だったら
# 何もしない
}
elsif( $str =~ s/^_// )
{ # アンダーライン (イタリック状態変更)
$italic = ! $italic;
}
elsif( $str =~ s/^\\n// )
{ # 改行
$ret .= "grestore 0 -12 rmoveto gsave ";
} # \ の後の1文字
elsif( $str =~ s/^\\(.)// )
{
$ret .= ($italic ? '$$XSItalic$$ ' : '$$XSAscii$$ ') . "(\\$1) show ";
} # その他特殊記号 (かっこなど)
elsif( $str =~ s/^(.)// )
{
$ret .= ($italic ? '$$XSItalic$$ ' : '$$XSAscii$$ ') . "(\\$1) show ";
}
}
$ret = "gsave " . $ret . "grestore";
while()
{
if( /^%%EndComments$/ )
{ # EndComments の後 (最初のほう) に専用定義
print OUT;
$_ = "";
print OUT "/\$\$XSKanji\$\$ " .
"{/Ryumin-Light-H findfont 11 scalefont setfont} def\n";
print OUT "/\$\$XSAscii\$\$ " .
"{/Times findfont 11 scalefont setfont} def\n";
print OUT "/\$\$XSItalic\$\$ " .
"{/Times-Italic findfont 11 scalefont setfont} def\n";
print OUT "/\$\$XSInsertedReferenceString\$\$ " .
"{" . $ret . "} def\n";
print OUT "/\$\$XSInsertReferenceString\$\$ " .
"{gsave initmatrix 24 805 moveto " .
"\$\$XSInsertedReferenceString\$\$ grestore} def\n";
# 「11」(3か所) がフォントサイズです。適当に変更してください。
# 「24 805」が印字位置(紙の左下からのX座標とY座標)です。
# 単位は 1/72 インチです。現状は A4 サイズの論文に合わせて
# あるので、これも適当に変更してください。
}
elsif( /^\/\$\$XS[A-Za-z}+\$\$ / )
{ # すでに参照スタンプ用の定義があった場合
next; # 表示しない
}
elsif( /^\$\$XSInsertReferenceString\$\$\n/ )
{ # すでに参照スタンプ用のコマンドがあった場合
next;
}
elsif( /^%%Page: / )
{ # 最初の Page DSC コメントがあった場合 (逆順 PS には未対応)
if( ! $inserted++ )
{
print OUT;
$_ = "";
print OUT "\$\$XSInsertReferenceString\$\$\n";
}
}
print OUT;
}
close IN;
close OUT;
}
最近、自分の文献リストの整備に凝っている。そもそも研究をして文献を増やさなければ文献リストを整備してもしょうがないのであるが、そのことはここでは追求しない(追求しないでください)。
で、自分でひとの文献をインターネットからひっぱってきたときによく起きるのが、どこに載った論文なのか分からないという事態である。クリックしてダウンロードしたファイルには、タイトルやら著者名やらは当然書いてあるのだが、論文誌名とかページ数といった参照情報が書いてないものが意外に多いのである。せめて自分の論文では、最初のページにちゃんと参照情報を書いておきたい。と思うのだが、いったん Postscript ファイルになってしまうと、そこに参照情報を書き足すのは非常におっくうである。これがまあ参照情報のない論文が多い理由なのだろう。
しかし、Postscript ファイルの中身は描画情報である。適当にコマンドをはさみこめば、参照情報を追加することは難しくないはずである。……どこに何をはさむかを間違えなければ、だが。
そこで、Perl Script を書いてみた。Postscript ファイルを食わせると、1ページ目の左上に参照情報のスタンプを追加して、別のファイルに出力するものである。大量の論文に処理するといった事態を考えれば、script になっているほうが有利だし、漢字の処理やら改行の処理も楽にできるだろう、と思い、いろいろ工夫してみた。
しかし、まともに postscript を生成したのは初めてなので苦労した……。後置系の言語と見当がついていたので楽だったけど、それでも Postscript リファレンス本がなければ手も足も出なかったと思われる。しかも、まだいい加減な点が多いので (DSC Comment 内のフォント情報を修正しないなど)、エラーが起きる可能性もあります。一応、作った後表示なり印字をしてみてください。
スタンプ適用前
スタンプ適用後#!/usr/local/bin/perl
# Reference Stamper 1.0
# by Makino Takaki
# 入力ファイルは1行に1エントリで、各エントリは次の形式です。
# [InputFile] [OutputFile] [Reference...]
#
# ファイル名には空白が入ってはだめです。.gz も使えます。
# Reference には次の記号が使えます。
# _..._ 囲まれた範囲をイタリックにします (英語だけ)。
# \n 次の行にいきます。
# \_ 下線そのもの。
# \\ バックスラッシュそのもの。
#
# たとえばこんなかんじです。
# hoge.ps.gz done/hoge.ps.gz なんとか学会 研究報告 AB-CDE, pp.23-34, 2002.
# moge.ps done/moge.ps In _Proc. of NANTOKA '97_\npp.123-135, 1997.
use Jcode;
while($process = <>)
{
my ($in, $out, $comment) = ($process =~ /^\s*(\S+)\s+(\S+)\s+(.*)$/);
print "$in -> $out\n";
if( $in =~ /\.gz$/ ) { $in = "gzip -d -c $in "; } else {$in = "<$in"};
if( $out =~ /\.gz$/ ) { $out = " gzip -9 >$out"; } else {$out = ">$out"};
open(IN, $in) die "Cannot open input file: $!";
open(OUT, $out) die "Cannot open output file: $!";
my $inserted = 0;
my $str = new Jcode($comment)->euc;
my $kanji = 0;
my $italic = 0;
my $ret = "";
# 文字列 $str を Postscript 描画文字列 $ret に変換
while( $str )
{
if( $str =~ /^[\x80-\xff][\x80-\xff]/ )
{ # 漢字だったら (EUCコードであることを前提)
$kanji = 1;
$ret .= '$$XSKanji$$ ';
while( $str =~ s/^([\x80-\xff][\x80-\xff])// )
{
my ($a,$b) = unpack("CC",$1);
$ret .= sprintf("<%02x%02x> show ", $a-128, $b-128);
}
}
if( $str =~ s/^([^_\\\(\)\x00-\x1f\x80-\xff]+)// )
{ # Ascii テキストだったら
$ret .= ($italic ? '$$XSItalic$$ ' : '$$XSAscii$$ ') . "($1) show ";
}
elsif( $str =~ s/^[\x00-\x1f]// )
{ # コントロール文字だったら
# 何もしない
}
elsif( $str =~ s/^_// )
{ # アンダーライン (イタリック状態変更)
$italic = ! $italic;
}
elsif( $str =~ s/^\\n// )
{ # 改行
$ret .= "grestore 0 -12 rmoveto gsave ";
} # \ の後の1文字
elsif( $str =~ s/^\\(.)// )
{
$ret .= ($italic ? '$$XSItalic$$ ' : '$$XSAscii$$ ') . "(\\$1) show ";
} # その他特殊記号 (かっこなど)
elsif( $str =~ s/^(.)// )
{
$ret .= ($italic ? '$$XSItalic$$ ' : '$$XSAscii$$ ') . "(\\$1) show ";
}
}
$ret = "gsave " . $ret . "grestore";
while(
{
if( /^%%EndComments$/ )
{ # EndComments の後 (最初のほう) に専用定義
print OUT;
$_ = "";
print OUT "/\$\$XSKanji\$\$ " .
"{/Ryumin-Light-H findfont 11 scalefont setfont} def\n";
print OUT "/\$\$XSAscii\$\$ " .
"{/Times findfont 11 scalefont setfont} def\n";
print OUT "/\$\$XSItalic\$\$ " .
"{/Times-Italic findfont 11 scalefont setfont} def\n";
print OUT "/\$\$XSInsertedReferenceString\$\$ " .
"{" . $ret . "} def\n";
print OUT "/\$\$XSInsertReferenceString\$\$ " .
"{gsave initmatrix 24 805 moveto " .
"\$\$XSInsertedReferenceString\$\$ grestore} def\n";
# 「11」(3か所) がフォントサイズです。適当に変更してください。
# 「24 805」が印字位置(紙の左下からのX座標とY座標)です。
# 単位は 1/72 インチです。現状は A4 サイズの論文に合わせて
# あるので、これも適当に変更してください。
}
elsif( /^\/\$\$XS[A-Za-z}+\$\$ / )
{ # すでに参照スタンプ用の定義があった場合
next; # 表示しない
}
elsif( /^\$\$XSInsertReferenceString\$\$\n/ )
{ # すでに参照スタンプ用のコマンドがあった場合
next;
}
elsif( /^%%Page: / )
{ # 最初の Page DSC コメントがあった場合 (逆順 PS には未対応)
if( ! $inserted++ )
{
print OUT;
$_ = "";
print OUT "\$\$XSInsertReferenceString\$\$\n";
}
}
print OUT;
}
close IN;
close OUT;
}
お薦めのPHP本
http://e0166.blog89.fc2.com/blog-entry-151.htmlより
私をPHPが組める人間に育ててくれたのは1冊の書籍だった私がPHPプログラムを始めたのが3年前。 実際問題以前からVBやベーシックは出来ました。 でもWEBアプリとなれば、CGI。 触ることは出来ても、1から全て作りこむなんて事は出来なかったんです。 そこでPHPのお話を始めて聞いて、簡単だというのでやってみましたが、やっぱりわからない。 なんせプログラムといえばベーシックやVBの考えを強く持っていた為、ページが変わってデータの受け渡し云々の意味そのものがわからなかったからです。 そんな私がとりあえず3年という月日でSQL、APIまでわかり、自社で提供しているXoopsのようなCMSを開発できるようになった経緯をお話しておきます。 はっきり申し上げてまだまだ『出来る』人からみれば半人前以下ですが、これからPHPを始めようとか、難しくて前に進めないという方の為に参考になればと思います。 あとがきつけたし2007/4/28PHPでちょっとした学習や遊びをしたいという思いがある人はロリポップがお勧めです。ただ、お金を掛けて覚えるのはいささか問題でもあり、CD-ROMに入っているWindowsでPHPを動かす方法も、わからない人には大きな壁かもしれない。 そこでお勧めなのが http://land.to/ ここはちょっと重い。でもPHPが使えるし、SQLも使える為勉強するにはもってこいかもしれません。XOOPSも動作確認しています。PHPプログラムの基本は3つPHPを始める為に、基礎となるものは実は次の3つです。何が出来るかをまず知る事何が出来るかというのは、恐らくプログラムを組む人がまず最初に知っておかなければならない大原則だと私は思っています。 『あ、たしかファイルに保存する方法があったな』とか『そういえば小数点を切り捨てる方法があったな』というような記憶があるとないとではその人がPHPを組める範囲が大きく変わるからです。簡単な掲示板を自分で設計して作ることとにかく何が何でも一番最初に掲示板を作ることを、新人教育に私は使っています。 掲示板はプログラムの基礎が詰まっています。 データを入力する部分を作成。データを渡す。データを受け取る。データを保存し、保存したデータを引っ張る。そして表示。全ての関数を覚える必要はないという事なにが出来るかさえ知っていれば、関数を全て覚えておく必要など今のところ私にはありません。 そんなときは私の横にある書籍が回答してくれるからです。 また、Google検索もその答えを教えてくれます。 『PHP 小数点』などで検索すればいいわけです。 ですから、なにが出来るのかという記憶部分が最も重要な比率をしめています。なにが出来るのか?に応えてくれた書籍 PHPによるWebアプリケーションスーパーサンプル 第2版 西沢 直木 (2006/03/24) ソフトバンククリエイティブ この商品の詳細を見る この本は本当にすごい。 この第一版もかなり初心者向けに作られていて非常に 参考になりましたが、第2版のボリュームには適わない。 書いている内容はほぼ第一版を羅網し、新しい項目が追加されているようなイメージ。最初本屋で立ち読みしたとき、第一版と同じかと思ったほどでしたが、甘かったです。実際はこちらの方がまとめ方のスキルが向上しているように感じました。 このPHPの第一版を買うまで、PHPの本5冊ほど買っていましたが、半分以上がSQLデータベースの説明や、各大型アプリケーションの作り方等が殆ど。 また、アプリケーションのサンプルCDが無いのは100%使えないというのが印象。コピーペーストできないんですから・・・。 大型アプリケーションの作り方サンプルは非常に勉強になりますが、肝心のその関数が何をしているとか、何ができるのかという勉強にはならない。 そういう書籍にばかり出会ってしまうと、出来上がったアプリケーションは触れるけど、1から作れるようにはなれませんでした。 ところがこの書籍、驚くほど各関数の動きを細かくパーツ分けして、恐ろしく簡単なサンプルアプリケーション群がCD-ROMにつまっています。プログラムを組む前に、何が出来るかを徹底的に記憶できる例えばフォームという項目をみてもすごい。 フォームは入力部をあらわしていますが、その設置の仕方から始まります。・テキストボックス ・テキストエリア ・パスワードボックス ・選択リスト ・ラジオボタン ・チェックボックス ・隠し項目 ・ボタンこれらの設置の仕方と動きが、サンプルアプリケーション集に入っているところがまたすごい。 さらに受け取るという項目では受け取り方法も細かく分解されている。・フォームのデータを受け取る ・フォームのデータを配列で受け取る ・POST送信されたデータを受け取る ・GET送信されたデータを受け取る ・リンクからデータを受け取る ・フォームのデータをまとめて処理する。まとめて変数にセット。 ・データ入力時のみデータを受け取る ・配列のデータを受け取る今度はこれをチェックする項目もこれまた細かく分解されている・データが入力されたかチェックする ・特定の文字列を含むかチェックする ・桁数をチェックする ・数値かどうかチェックする ・半角数字のみかどうかをチェックする ・大文字か小文字かチェックする ・日付かどうかチェックする ・ファイルの拡張子をチェックする至れり尽くせりです。これだけの目次を一通り見るだけで、PHPを作るときに、このチェックだけしたいなと思ったらそれを開けばよいだけ。恐ろしい。 フォームという項目は、メール送信アプリのサンプルや、注文フォームアプリまで紹介されています。 このフォーム部分は第2章です。 こんな細かいパーツがずらずらと15章まであります。 文字列という章もすごい。・文字列の一部を取り出す ・文字を置き換える ・文字から空白の削除 ・文字を比較する ・文字列から文字を検索する ・大文字と小文字を変換する ・文字を分解する ・文字列を繰り返し表示する ・文字の出現回数を調べる ・文字の長さを求める ・全角と半角の変換 ・文字を暗号化するかなりかゆいところまで手が届いています。 あの暗号化ってどうやるんだろうとか、思ったときもこれで解決。 何度も言うようですが、CD-ROMにはこれら全ての項目が一つのサンプルアプリケーションとして収録されているということも見逃せないです。 このほか数値、日付、配列、クラス、ファイル、PDFファイル、XML、バーコードを出力する方法とか、ディレクトリ(フォルダ)を作るプログラムや、フォルダの存在を確認する方法まであります。 セッション、cookieの使い方からSQLデータベースの使い方まで。 最後に16章で大き目のアプリケーションのサンプルがありますが、実際はおまけ程度に紹介されているだけで、この本の本当にすごいのは、パーツの分散化。 細かいパーツのサンプル集とその説明です。唯一初心者に厳しい部分は次の3点・PEAR:という言葉 ・初期の章からもSQLを使用したものが含まれている ・Smartyという言葉PEAR::PEARはどちらかというと、プログラマーよりもサーバー管理者側が知っているもので、サーバーにあらかじめPEARモジュールを仕込んでおくとそれをPHPプログラマ側で、簡単な構文で呼び出せるもの。PEARは例えばAmazonの商品を簡単に取り出せるアプリとか、画像を圧縮するアプリとか、色々ありすぎてまだ始めたばかりの初心者に使うのは無理かと。SQLSQLサーバーはPHPを使っていくのであれば覚えておいて損はないデータベース名。 データベースを使うと、膨大なデータを手軽に保存し、取出しが出来るようになりますが、始めるにあたっては、ちょっと面倒でも『テキストファイル』などにデータを保存して取り出せるようになった方が、覚えやすいと思います。 また、SQLに保存する前に、ある程度データをチェックし、危険なスクリプトが含まれていないか等をチェック出来るようになってからのほうが良いと思います。SmartySmartyに関してはHTMLテンプレートとPHPを分けて開発できるものですが最初に覚える必要はないかと思います。 私はこの書籍に出会い、かなり長時間パソコンから離れ、とにかく各パーツがどんなことをしているかを教わりました。 これからPHPを始めるという人や、まだ1からプログラムを組んでいない人がもしいれば、是非ともお勧めしたい書籍です。 実際今でも、かなりお世話になっている本ですしね。
私をPHPが組める人間に育ててくれたのは1冊の書籍だった私がPHPプログラムを始めたのが3年前。 実際問題以前からVBやベーシックは出来ました。 でもWEBアプリとなれば、CGI。 触ることは出来ても、1から全て作りこむなんて事は出来なかったんです。 そこでPHPのお話を始めて聞いて、簡単だというのでやってみましたが、やっぱりわからない。 なんせプログラムといえばベーシックやVBの考えを強く持っていた為、ページが変わってデータの受け渡し云々の意味そのものがわからなかったからです。 そんな私がとりあえず3年という月日でSQL、APIまでわかり、自社で提供しているXoopsのようなCMSを開発できるようになった経緯をお話しておきます。 はっきり申し上げてまだまだ『出来る』人からみれば半人前以下ですが、これからPHPを始めようとか、難しくて前に進めないという方の為に参考になればと思います。 あとがきつけたし2007/4/28PHPでちょっとした学習や遊びをしたいという思いがある人はロリポップがお勧めです。ただ、お金を掛けて覚えるのはいささか問題でもあり、CD-ROMに入っているWindowsでPHPを動かす方法も、わからない人には大きな壁かもしれない。 そこでお勧めなのが http://land.to/ ここはちょっと重い。でもPHPが使えるし、SQLも使える為勉強するにはもってこいかもしれません。XOOPSも動作確認しています。PHPプログラムの基本は3つPHPを始める為に、基礎となるものは実は次の3つです。何が出来るかをまず知る事何が出来るかというのは、恐らくプログラムを組む人がまず最初に知っておかなければならない大原則だと私は思っています。 『あ、たしかファイルに保存する方法があったな』とか『そういえば小数点を切り捨てる方法があったな』というような記憶があるとないとではその人がPHPを組める範囲が大きく変わるからです。簡単な掲示板を自分で設計して作ることとにかく何が何でも一番最初に掲示板を作ることを、新人教育に私は使っています。 掲示板はプログラムの基礎が詰まっています。 データを入力する部分を作成。データを渡す。データを受け取る。データを保存し、保存したデータを引っ張る。そして表示。全ての関数を覚える必要はないという事なにが出来るかさえ知っていれば、関数を全て覚えておく必要など今のところ私にはありません。 そんなときは私の横にある書籍が回答してくれるからです。 また、Google検索もその答えを教えてくれます。 『PHP 小数点』などで検索すればいいわけです。 ですから、なにが出来るのかという記憶部分が最も重要な比率をしめています。なにが出来るのか?に応えてくれた書籍 PHPによるWebアプリケーションスーパーサンプル 第2版 西沢 直木 (2006/03/24) ソフトバンククリエイティブ この商品の詳細を見る この本は本当にすごい。 この第一版もかなり初心者向けに作られていて非常に 参考になりましたが、第2版のボリュームには適わない。 書いている内容はほぼ第一版を羅網し、新しい項目が追加されているようなイメージ。最初本屋で立ち読みしたとき、第一版と同じかと思ったほどでしたが、甘かったです。実際はこちらの方がまとめ方のスキルが向上しているように感じました。 このPHPの第一版を買うまで、PHPの本5冊ほど買っていましたが、半分以上がSQLデータベースの説明や、各大型アプリケーションの作り方等が殆ど。 また、アプリケーションのサンプルCDが無いのは100%使えないというのが印象。コピーペーストできないんですから・・・。 大型アプリケーションの作り方サンプルは非常に勉強になりますが、肝心のその関数が何をしているとか、何ができるのかという勉強にはならない。 そういう書籍にばかり出会ってしまうと、出来上がったアプリケーションは触れるけど、1から作れるようにはなれませんでした。 ところがこの書籍、驚くほど各関数の動きを細かくパーツ分けして、恐ろしく簡単なサンプルアプリケーション群がCD-ROMにつまっています。プログラムを組む前に、何が出来るかを徹底的に記憶できる例えばフォームという項目をみてもすごい。 フォームは入力部をあらわしていますが、その設置の仕方から始まります。・テキストボックス ・テキストエリア ・パスワードボックス ・選択リスト ・ラジオボタン ・チェックボックス ・隠し項目 ・ボタンこれらの設置の仕方と動きが、サンプルアプリケーション集に入っているところがまたすごい。 さらに受け取るという項目では受け取り方法も細かく分解されている。・フォームのデータを受け取る ・フォームのデータを配列で受け取る ・POST送信されたデータを受け取る ・GET送信されたデータを受け取る ・リンクからデータを受け取る ・フォームのデータをまとめて処理する。まとめて変数にセット。 ・データ入力時のみデータを受け取る ・配列のデータを受け取る今度はこれをチェックする項目もこれまた細かく分解されている・データが入力されたかチェックする ・特定の文字列を含むかチェックする ・桁数をチェックする ・数値かどうかチェックする ・半角数字のみかどうかをチェックする ・大文字か小文字かチェックする ・日付かどうかチェックする ・ファイルの拡張子をチェックする至れり尽くせりです。これだけの目次を一通り見るだけで、PHPを作るときに、このチェックだけしたいなと思ったらそれを開けばよいだけ。恐ろしい。 フォームという項目は、メール送信アプリのサンプルや、注文フォームアプリまで紹介されています。 このフォーム部分は第2章です。 こんな細かいパーツがずらずらと15章まであります。 文字列という章もすごい。・文字列の一部を取り出す ・文字を置き換える ・文字から空白の削除 ・文字を比較する ・文字列から文字を検索する ・大文字と小文字を変換する ・文字を分解する ・文字列を繰り返し表示する ・文字の出現回数を調べる ・文字の長さを求める ・全角と半角の変換 ・文字を暗号化するかなりかゆいところまで手が届いています。 あの暗号化ってどうやるんだろうとか、思ったときもこれで解決。 何度も言うようですが、CD-ROMにはこれら全ての項目が一つのサンプルアプリケーションとして収録されているということも見逃せないです。 このほか数値、日付、配列、クラス、ファイル、PDFファイル、XML、バーコードを出力する方法とか、ディレクトリ(フォルダ)を作るプログラムや、フォルダの存在を確認する方法まであります。 セッション、cookieの使い方からSQLデータベースの使い方まで。 最後に16章で大き目のアプリケーションのサンプルがありますが、実際はおまけ程度に紹介されているだけで、この本の本当にすごいのは、パーツの分散化。 細かいパーツのサンプル集とその説明です。唯一初心者に厳しい部分は次の3点・PEAR:という言葉 ・初期の章からもSQLを使用したものが含まれている ・Smartyという言葉PEAR::PEARはどちらかというと、プログラマーよりもサーバー管理者側が知っているもので、サーバーにあらかじめPEARモジュールを仕込んでおくとそれをPHPプログラマ側で、簡単な構文で呼び出せるもの。PEARは例えばAmazonの商品を簡単に取り出せるアプリとか、画像を圧縮するアプリとか、色々ありすぎてまだ始めたばかりの初心者に使うのは無理かと。SQLSQLサーバーはPHPを使っていくのであれば覚えておいて損はないデータベース名。 データベースを使うと、膨大なデータを手軽に保存し、取出しが出来るようになりますが、始めるにあたっては、ちょっと面倒でも『テキストファイル』などにデータを保存して取り出せるようになった方が、覚えやすいと思います。 また、SQLに保存する前に、ある程度データをチェックし、危険なスクリプトが含まれていないか等をチェック出来るようになってからのほうが良いと思います。SmartySmartyに関してはHTMLテンプレートとPHPを分けて開発できるものですが最初に覚える必要はないかと思います。 私はこの書籍に出会い、かなり長時間パソコンから離れ、とにかく各パーツがどんなことをしているかを教わりました。 これからPHPを始めるという人や、まだ1からプログラムを組んでいない人がもしいれば、是非ともお勧めしたい書籍です。 実際今でも、かなりお世話になっている本ですしね。
OTFの「Pr5」を「Pro」で認識させる
「A-OTF Futo Go B101 Pr5 Bold」がインストールされていない環境で 「A-OTF Futo Go B101 Pr5 Bold」を「A-OTF Futo Go B101 Pro Bold」で認識させる方法について。
作成されたデータをいじるのはトラブルの元なので、、、
「ttfname3.exe」(Windows)を 使い「A-OTF Futo Go B101 Pro Bold」をコピーして、新しくフォントを作成すれば可能かも。
1.コピーしたフォントのファイル名を
「A-OTF-FutoGoB101Pro-Bold.otf」から「A-OTF-FutoGoB101Pr5-Bold.otf」に変更。
2.「ttfname3.exe」を使って「A-OTF Futo Go B101 Pro Bold」の登録内容を
「A-OTF Futo Go B101 Pr5 Bold」と同じ登録名に変更。
3.できたフォントをインストール。
モリサワパスポートの場合は1台のPCの中なら複数入れてもOKとなっていますが、 この場合はどうなるのかはわかりません。
作成されたデータをいじるのはトラブルの元なので、、、
「ttfname3.exe」(Windows)を 使い「A-OTF Futo Go B101 Pro Bold」をコピーして、新しくフォントを作成すれば可能かも。
1.コピーしたフォントのファイル名を
「A-OTF-FutoGoB101Pro-Bold.otf」から「A-OTF-FutoGoB101Pr5-Bold.otf」に変更。
2.「ttfname3.exe」を使って「A-OTF Futo Go B101 Pro Bold」の登録内容を
「A-OTF Futo Go B101 Pr5 Bold」と同じ登録名に変更。
3.できたフォントをインストール。
モリサワパスポートの場合は1台のPCの中なら複数入れてもOKとなっていますが、 この場合はどうなるのかはわかりません。
登録:
投稿 (Atom)
