スポンサーサイト

Tags :
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

AppleScriptのシンタックスをハイライトするJavaScriptを少し改良

ウチのblogではAppleScriptとかJavaSciptのソースコードをいろいろ書き散らして晒してますが、ソースコードの構文を色分け表示するのに、AppleScriptの場合は自作のJavaScriptを使ってハイライト表示させています。(AppleScript以外のソースコードは、『SyntaxHighlighter』を利用)

で、今回ちょっと不具合があったのを直したついでに少し改良して、スクリプトエディタでの表示と同じ様に、主要な構文がボールドの文字で表示出来る様にしたのと、あとリストのラベル名やAppleEventが含まれるコードもできるだけスクリプトエディタでの色分けに合わせる様にしました。ソースコードのクリップボードへのコピーをする部分は、flashを使った外部のライブラリ『Zero Clipboard』を使っています。

<pre class="applescript">~</pre>でAppleScriptのソースを囲むとこんな感じに表示する様になってます。
on «event appSscrW» theObject given «class eveE»:theEvent
	set theValue to «class conT» of theObject as number
	(«class delY» of theEvent)
	set theValue to theValue + («class delY» of theEvent)
	set theEvent to theEvent
	set «class conT» of theObject to theValue
	tell window of theObject
		set contents of «class texF» "seconds" to contents of «class sliI» "secondsSlider"
		set secsToPlay to contents of «class texF» "seconds"
	end tell
end «event appSscrW»


on create_thumb(tgt_file, dest_file)
	tell application "Adobe Photoshop CS4"
		activate
		open tgt_file showing dialogs never
		set theDoc to current document
		tell theDoc
			if width > height then
				resize image width thumb_size as pixels resolution 72 resample method bicubic
			else
				resize image height thumb_size as pixels resolution 72 resample method bicubic
			end if
			change mode to RGB
			convert to profile "sRGB IEC61966-2.1" intent relative colorimetric with blackpoint compensation and dithering
			set save_opts to {class:JPEG save options, embed color profile:false, quality:10}
			save in file dest_file as JPEG with options save_opts appending no extension with copying
			close without saving
		end tell
	end tell
end create_thumb


(*  via MacWiki http://macwiki.sourceforge.jp/wiki/index.php/AppleScriptTips *)
set chars to {¬
	{uc:"A", lc:"a", ucj:"A", lcj:"a"}, {uc:"B", lc:"b", ucj:"B", lcj:"b"}, ¬
	{uc:"C", lc:"c", ucj:"C", lcj:"c"}, {uc:"D", lc:"d", ucj:"D", lcj:"d"}, ¬
	{uc:"E", lc:"e", ucj:"E", lcj:"e"}, {uc:"F", lc:"f", ucj:"F", lcj:"f"}, ¬
	{uc:"G", lc:"g", ucj:"G", lcj:"g"}, {uc:"H", lc:"h", ucj:"H", lcj:"h"}, ¬
	{uc:"I", lc:"i", ucj:"I", lcj:"i"}, {uc:"J", lc:"j", ucj:"J", lcj:"j"}, ¬
	{uc:"K", lc:"k", ucj:"K", lcj:"k"}, {uc:"L", lc:"l", ucj:"L", lcj:"l"}, ¬
	{uc:"M", lc:"m", ucj:"M", lcj:"m"}, {uc:"N", lc:"n", ucj:"N", lcj:"n"}, ¬
	{uc:"O", lc:"o", ucj:"O", lcj:"o"}, {uc:"P", lc:"p", ucj:"P", lcj:"p"}, ¬
	{uc:"Q", lc:"q", ucj:"Q", lcj:"q"}, {uc:"R", lc:"r", ucj:"R", lcj:"r"}, ¬
	{uc:"S", lc:"s", ucj:"S", lcj:"s"}, {uc:"T", lc:"t", ucj:"T", lcj:"t"}, ¬
	{uc:"U", lc:"u", ucj:"U", lcj:"u"}, {uc:"V", lc:"v", ucj:"V", lcj:"v"}, ¬
	{uc:"W", lc:"w", ucj:"W", lcj:"w"}, {uc:"X", lc:"x", ucj:"X", lcj:"x"}, ¬
	{uc:"Y", lc:"y", ucj:"Y", lcj:"y"}, {uc:"Z", lc:"z", ucj:"Z", lcj:"z"}}
set theText to "AppleScript アップルスクリプト AppleScript"
set newText to ""
repeat with aChar in every character of theText
	repeat with c in chars
		if aChar as string is uc of c then set aChar to lc of c -- tr/A-Z/a-z/
		-- if aChar as string is lc of c then set aChar to uc of c -- tr/a-z/A-Z/
	end repeat
	set newText to newText & aChar
end repeat
-- display dialog newText
クォートされた文字列を赤くしてるのは、ウチのblogにあるAppleScriptのコードはシェルとか他の言語に処理を投げてるのが多いので、その部分を目立つ様にするためです。

AppleScriptはアプリケーションの数だけ、それこそ無限にプロパティやメソッド等の予約語があるので、完璧に構文を正しく表示するのは難しいですが、基本的にこのJavaScriptでは『変数名とハンドラ名と記号と数字とコメントとクォートされた文字列以外はすべて予約語』として扱ってます。(で、イレギュラーなものを個別に登録して処理。)

変数名やハンドラかどうかは一旦コードを頭からスキャンして判断してるので、コードの一部を載せた様な場合いきなり変数名が出て来ても対応出来ず、スクリプトエディタでコンパイルが通る形のものでないときちんと処理出来ないという弱点はあります。

まあ、今後Adobeはアプリの新機能をAppleScriptでサポートしなくなるというのもあって、AppleScript書く事が少なくなってるので出番はあまり無いかも知れません。

JacvaScriptでInDesignやIllustratorのドキュメントに配置されているEPS画像の情報を取得する

じわじわと過去の物にされようとしているEPSですが、まだまだ製版の現場では出力用の画像として幅を利かせてると思います。が、InDesignやIllustratorでは配置されているEPS画像の解像度等の情報をJavaScriptで得るには画像ファイルを直接調べてみるしか無い様なので、そのための関数を書きました。

一応、IllustratorとInDesign両方で動く様になっています。InDesignの場合はEPSクラスのprototypeを拡張する書き方の方が良いかもしれませんが。

InDesignのJavaScript書く時いつも参考にしているサイト InDesign Scripting ReferenceのEPSクラスのプロパティの所に解像度を示す『actualPpi』『effectivePpi』の記述があるので、もしや?と思ったんですけど本当に値を持ってるのか確認できず…(for ~ inでオブジェクトを見たんですが解像度がらみのプロパティは表示されませんでした。ひょっとして英語版との差とかあるんでしょうか)

■使用例
以下の様に、配置された画像を引数として渡します。
/*
	epsObj は処理するEPS画像

	InDesignの場合はallGraphics等で得られるEPSオブジェクト
	Illustratorの場合はPlacedItemオブジェクトを渡す

*/

 //クリエータを得る
var creator = epsInfo.getCreator(epsObj);

//カラーモードを得る
var mode = epsInfo.getMode(epsObj);

 //エンコーディングを得る
var encoding = epsInfo.getEncoding(epsObj);

 //解像度を得る
var ppi = epsInfo.getPpi(epsObj);

//まとめて連想配列で得る
var epsInfoObj = epsInfo.getAll(epsObj);
最近のPhotoshopやIllustratorで保存されたEPSなら対応出来てると思いますが、変な訛りのあるEPSだとちゃんと動作しないかも知れません。処理出来なかった場合はundefinedが返ります。

■動作確認
MacOSX 10.5.7
InDesign CS4
Illustrator CS4
var epsInfo = {
	'parseHeader': function(imgObj) {
		if (imgObj.constructor.name == 'EPS') { 
			var f = new File(imgObj.itemLink.filePath); // InDesign
		} else if (imgObj.constructor.name == 'PlacedItem') {
			var f = new File(imgObj.file); // Illustrator
		} else {
			return [];
		}
		if (!f.open("r")) return [];
		for (var i=0; i<500; i++) {
			var line = f.readln();
			if (line.indexOf("%%Creator", 0) != -1) {
				var creator = line.slice(10);
			} else if (line.indexOf("%%HiResBoundingBox", 0) != -1) {
				var hrbbParams = line.split(" ");
			} else if (line.indexOf("%ImageData", 0) != -1) {
				var idParams = line.split(" ");
				break;
			}
		}
		f.close();
		return [creator, hrbbParams, idParams];
	},

	'getMode': function(imgObj) {
		var headerObj = this.parseHeader(imgObj);
		if (!headerObj[2]) return;
		var idParams = headerObj[2];
		switch(idParams[4]) {
			case "4":
				return "CMYK";
				break;
			case "3":
				return "RGB";
				break;
			case "2":
				return "Lab";
				break;
			case "1":
				return (idParams[3] == 1) ? "1bit" : "Gray";
				break;
			default:
				return;
		}
	},

	'getEncoding': function(imgObj) {
		var headerObj = this.parseHeader(imgObj);
		if (!headerObj[2]) return;
		var idParams = headerObj[2];
		switch(idParams[7]) {
			case "7":
				return "ASCII85";
				break;
			case "6":
				return "JPEG:Max";
				break;
			case "5":
				return "JPEG:High";
				break;
			case "4":
				return "JPEG:Mid";
				break;
			case "3":
				return "JPEG:Low";
				break;
			case "2":
				treturn "ASCII";
				break;
			case "1":
				return "Binary";
				break;
			default:
				return;
		}
	},

	'getPpi': function(imgObj) {
		var headerObj = this.parseHeader(imgObj);
		if (!headerObj[1] || !headerObj[2]) return;
		var hrbbParams = headerObj[1];
		var idParams = headerObj[2];
		var pt_x = hrbbParams[3];
		//var pt_y = hrbbParams[4];
		var px_x = idParams[1];
		//var px_y = idParams[2];
		return (px_x / pt_x * 72).toFixed(1);
	},

	'getCreator': function(imgObj) {
		var headerObj = this.parseHeader(imgObj);
		return headerObj[0] ? headerObj[0] : undefined;
	},

	'getAll': function(imgObj) {
		return {
			'creator': this.getCreator(imgObj),
			'mode': this.getMode(imgObj),
			'encoding': this.getEncoding(imgObj),
			'ppi': this.getPpi(imgObj)
		}
	}
}

PhotoshopでのCMYK分解カーブをJavaScriptを使ってプロットしてみる

Photoshopのカラー設定のプロファイルでCMYK分解する際のアミ%をプロットするJavaScriptを書いてみました。

分解カーブは、ニュートラルグレー(RGB 0,0,0~255,255,255)を分解した際のアミ%でプロットされ、カラープロファイル名やグレーバランスでのCMYKの最大値、インキの総量を表示します。

PhotoshopでこのJavaScriptを実行すると、以下の様な画像が生成されます。

Japan Colorが設定されている場合の分解カーブ。


こちらはSWOP。シャドウ側のCMYのグレー成分ががスミ版に置き換わっています


某社の広色域インキ用プロファイル。グレーバランス出すのにマゼンタとイエローがかなり少なめの設定になってる様です。


■課題というか問題点というか…
JavaScriptで『任意の位置にピクセルを描画する』やり方が良くわからなかったので、プロットする点のサイズの選択範囲を作り、それを塗り潰していく様なやり方なので処理がメチャクチャ遅いです(ウチのMacBook Proで全部描画するのに2分以上かかります)。パスを使って描いても良かったかも知れません。

■動作確認
MacOSX 10.5.6
Photoshop CS4
#target Photoshop

function setRgb(r, g, b){
	colObj = new SolidColor()
	colObj.rgb.red = r;
	colObj.rgb.green = g;
	colObj.rgb.blue = b;
	return colObj;
}

function plotColor(c_val, plot_color){
	c_val *=  plot_ratio;
	doc.selection.select([[510-i*2, 290-c_val-1.5], [510-i*2+2, 290-c_val-1.5], [510-i*2+2, 290-c_val+1], [510-i*2, 290-c_val+1]]);
	doc.selection.fill(plot_color, ColorBlendMode.NORMAL, 100, false);
}

function makeText(props) {
	lay = doc.artLayers.add();
	lay.kind = LayerKind.TEXT;
	ti = lay.textItem
	ti.font = 'HiraMinPro-W6';
	ti.contents = props.contents;
	ti.size = props.size;
	ti.color = props.color;
	ti.position = props.position;	
}

var ru = app.preferences.rulerUnits;
app.preferences.rulerUnits = Units.PIXELS;
var doc = app.documents.add(512, 320, 72, "CMYK Separation Curves", NewDocumentMode.CMYK);
var profile_name = doc.colorProfileName;
doc.changeMode(ChangeMode.RGB);

var colors = {
	'cyan': setRgb(0, 255, 255),
	'magenta': setRgb(255, 0, 255),
	'yellow': setRgb(255, 255, 0),
	'black': setRgb(0, 0, 0),
	'gray': setRgb(128, 128, 128),
	'white': setRgb(255, 255, 255),
	'line': setRgb(116, 116, 116)
};

var plot_ratio = 2.5;

doc.selection.selectAll();
doc.selection.fill(colors.gray, ColorBlendMode.NORMAL, 100, false);

for (var i=40; i<290; i+=25) {
	doc.selection.select([[0, i],[512, i],[512, i+1],[0, i+1]]);
	doc.selection.fill(colors.line, ColorBlendMode.NORMAL, 100, false);
}
var tgt_color = new SolidColor();

for (var i=255; i>-1; i--) {
	doc.selection.select([[510-i*2, 290], [510-i*2+2, 290], [510-i*2+2, 320], [510-i*2, 320]]);
	tgt_color.rgb.red = i;
	tgt_color.rgb.green = i;
	tgt_color.rgb.blue = i;
	doc.selection.fill(tgt_color, ColorBlendMode.NORMAL, 100, false);
	plotColor(tgt_color.cmyk.cyan, colors.cyan);
	plotColor(tgt_color.cmyk.magenta, colors.magenta);
	plotColor(tgt_color.cmyk.yellow, colors.yellow);
	plotColor(tgt_color.cmyk.black, colors.black);
}

doc.selection.deselect();
var max_cmyk = tgt_color.cmyk;
var total = max_cmyk.cyan + max_cmyk.magenta + max_cmyk.yellow + max_cmyk.black;
var ink_info = 'Max\r'
			+ 'Cyan : ' + Math.round(max_cmyk.cyan) + '%\r'
			+ 'Magenta : ' + Math.round(max_cmyk.magenta) + '%\r'
			+ 'Yellow : ' + Math.round(max_cmyk.yellow) + '%\r'
			+ 'Black : ' + Math.round(max_cmyk.black) + '%';
			
makeText({'contents': profile_name, 'size': 20, 'color': colors.white, 'position': [10, 30]});
makeText({'contents': ink_info, 'size': 12, 'color': colors.white, 'position': [10, 55]});
makeText({'contents': 'Total\r' + Math.round(total) + '%', 'size': 12, 'color': colors.white, 'position': [120, 55]});

app.preferences.rulerUnits = ru;

InDesignでTwitterのAPIにアクセスし、タイムラインを取得してドキュメントに自動レイアウトしてみる

JavaScriptを使ってInDesignでTwitter APIにアクセスし、タイムラインのステータスを取得して、followしている人たちの発言をInDesignのドキュメントに自動でレイアウトしてみます。

TwitterのAPIではfollowしている人たちの発言の他にも、自分の発言のみ、@Repliesなんかを取得出来ますが、今回は『http://twitter.com/home』で表示される『自分がfollowしている人たちの発言』を取り出して、それをアイコン付きで生成したドキュメントにレイアウトして行く様にしてみました。

■参考URL 『Twitter API 仕様書 日本語訳』
http://watcher.moe-nifty.com/memo/docs/twitterAPI.txt

Socketを使ったWebへのアクセスには、以前のエントリで書いた、Basic認証とファイルのダウンロードが出来るスクリプトをそのまま使っています。Basic認証には、『ユーザID:パスワード』の文字列をBase64エンコードして渡す必要がありますが、今回はその部分は省略してあらかじめエンコードした文字列を用意しています。

MacOSXの場合はターミナルで、
php -r 'echo base64_encode("ユーザID:パスワード")."\n";'
とすればBase64エンコードされた文字列を生成出来ます。

スクリプトの実行結果はこんな感じになります(今回は単ページ)。ドキュメントは一から生成するので雛形は必要ありません。配置するアイコン等の画像は全てローカル(デフォルトではデスクトップ)にダウンロードして保存されます。

旬のDTP Boosterさんfollowさせてもらってます。

Webブラウザで見るのと似た様なレイアウトってのも芸が無い気がしますけど。テキストも最低限オーバーフローしないための処理しかしてないので組版なんて呼べる代物ではありませんが…

一応ドキュメントサイズの変更にはある程度追従出来る様な書き方にはなってますが、本当はレイアウトを自動生成する部分をもうちょっとキレイに、と言うか、CSS的な文脈で書ければ良いなと思ったりもしたんですけど今回は全然煮詰められませんでした(相変わらず思い付くままに書き殴ったようなコードです)。何かテンプレートエンジン的な物が用意出来れば良いんでしょうかね。

■動作確認
MacOSX 10.5.6
InDesign CS4
#target InDesign

//HTTPレスポンスを得る
function getHttpResponse(requests) {
	var parseUrl = function(url) {
		var urlObj = {};
		//[url, scheme, slash, host, port, path, query, fragment] via O'REILLY JavaScript: The Good Parts
		var url_re = /^(?:([A-Za-z]+):)?(\/{0,3})([0-9.\-A-Za-z]+)(?::(\d+))?(?:\/([^?#]*))?(?:\?([^#]*))?(?:#(.*))?$/;
		var m = url_re.exec(url);
		urlObj.host = m[3];
		urlObj.port = m[4] || '80';
		urlObj.path = m[5];
		urlObj.query = (m[6]) ? '?' +  m[6] : '';
		urlObj.frag = (m[7]) ? '#' + m[7] : '';
		return urlObj;
	}
	var urlObj = parseUrl(requests.url);
	var encoding = requests.encoding || 'UTF-8';
	var method = requests.method || 'GET';
	var auth = (requests.basic_auth != undefined) ? 'Authorization: Basic ' + requests.basic_auth + '\r\n' : '';
	var conn = new Socket;
	conn.timeout = 10;
	if (conn.open (urlObj.host + ':' + urlObj.port, encoding)) {
  	conn.write (method + ' /' + urlObj.path + urlObj.query + urlObj.frag + ' HTTP/1.0\r\n'
		+ 'Host: ' + urlObj.host + '\r\n'
		+ 'User-Agent: ' + 'InDesign/6.0' + '(Macintosh; U; Intel Mac OS X 10_5_6; ja-jp)' + '\r\n'
		+ auth
		+ '\r\n');
		var reply = conn.read(999999);
		conn.close();
		return reply; //ヘッダ込みで返す
	} else {
		return conn.error;
	}
}


//Webからファイルをダウンロードする
function downloadFile(url, localFile) {
	var rep = getHttpResponse({
		method: 'GET',
		url: url,
		encoding: 'BINARY',
	});
	if (rep.match(/HTTP.*\d{3}/).toString().indexOf('200') != -1) {
		//レスポンスのヘッダを除去 
		var body = rep.slice(rep.indexOf('\r\n\r\n') + 4);
		//ファイルに書き出し
		var f = new File(localFile);
		if (f.open("w")) {
			f.encoding = 'BINARY';
			f.write(body);
		}
		f.close();
		return f;
	} else {
		return false;	
	}
}


//RGBカラーを作成
function setRgb(cv) {
	return app.activeDocument.colors.add({
		model: ColorModel.process,
		space: ColorSpace.rgb,
		colorValue: cv
	});
}

TextFrame.prototype = { 
	getHeight: function() { return this.geometricBounds[2] - this.geometricBounds[0]; },
	getWidth: function() { return this.geometricBounds[3] - this.geometricBounds[1]; },
}


//初期設定
var id = 'your_twitter_account';
var b64_userpass = 'ZHVtbXk6ZHVtbXk='; //'username:password'をbase64エンコードした文字列(値はダミー)
var downloadPath = '~/Desktop/'; //ダウンロードしたファイルの保存場所
var cnt = 15; //1ページにレイアウトするPOSTの数
var doc = app.documents.add();
doc.documentPreferences.pageWidth = '110mm';
doc.documentPreferences.pageHeight = '150mm';
var fontName1 = app.fonts.item('小塚ゴシック Pro');
var tu = 'pt';
var default_txtSize = 7; //標準の文字サイズ
var default_txtLead = 9; //標準の行送り	
var container_margin = {
	top: 10,
	left: 7,
	right: 7,
	bottom: 3
};
var my_colors = {
	'white': setRgb([255, 255, 255]),
	'background': setRgb([148, 228, 232]),
	'profile': setRgb([218, 255, 130]),
	'link': setRgb([0, 0, 255])
};

var postRects = [];
var textRects = [];
var iconRects = [];
var iconImgs = [];

var p = doc.pages[0];
var p_b = p.bounds;

var logo = {
	url: 'http://assets0.twitter.com/images/twitter_logo_header.png',
	localFile: downloadPath + 'twitter_logo_header.png'
};

//APIでプロファイルを取得
var profile_info = getHttpResponse({
	url: 'http://twitter.com/users/show/' + id + '.json'
});

var profile_json = eval('(' + profile_info.match(/\{.*\}?/) + ')');
var profile_icon = {
	url: profile_json.profile_image_url,
	localFile: downloadPath + profile_json.profile_image_url.replace(/^.*\//, '')
}

//twitter_logo_header.png, profile_iconをダウンロード
var logo_file = downloadFile(logo.url, logo.localFile);
var profile_icon_file = downloadFile(profile_icon.url, profile_icon.localFile);

//APIでtimelineを取得
var timeline = getHttpResponse({
	url: 'http://twitter.com//statuses/friends_timeline.json?page=1',
	basic_auth: b64_userpass
});
timeline.replace('Connection', '');
tlObj = eval('(' + timeline.match(/\[\{.*\}\]?/) + ')');

//背景の矩形
var bgRect = p.textFrames.add({
	geometricBounds: [p_b[0] - 3, p_b[1] - 3, p_b[2] + 3, p_b[3] + 3],
	fillColor: my_colors.background
});
//ヘッダ部分
var logoRect = p.textFrames.add({
	geometricBounds: [p_b[0] + 2, p_b[1] + container_margin.left, p_b[0] + container_margin.top - 1, p_b[1] + 40],
	fillColor: my_colors.background,
	strokeWeight: 0
});
logoRect.place(logo_file);
logoRect.fit(FitOptions.proportionally);
var profile_rect = p.textFrames.add({
	geometricBounds: [p_b[0] + 2, (p_b[3] - p_b[1]) / 2, p_b[0] + container_margin.top - 1, p_b[3] - container_margin.right],
	fillColor: my_colors.profile,
	strokeWeight: 0
});
var pr_gb = profile_rect.geometricBounds;
var profile_icon_rect = p.textFrames.add({
	geometricBounds: [pr_gb[0], pr_gb[1], pr_gb[0] + profile_rect.getHeight(), pr_gb[1] + profile_rect.getHeight()],
	fillColor: my_colors.background,
	strokeWeight: 0
});
profile_icon_rect.place(profile_icon_file);
profile_icon_rect.fit(FitOptions.proportionally);
var title_rect = p.textFrames.add({
	geometricBounds: [pr_gb[0] + 2, profile_icon_rect.geometricBounds[3], pr_gb[2], pr_gb[3]],
	strokeWeight: 0,
	contents: id + '\'s timeline'
});
title_rect.paragraphs[0].properties = {
	pointSize: 9 + tu,
	appliedFont: fontName1,
	fontStyle: 'R',
	justification: 1667591796
};
//全てのPOSTを納める矩形
var container = p.textFrames.add({
	geometricBounds: [p_b[0] + container_margin.top, p_b[1] + container_margin.left, p_b[2] - container_margin.bottom, p_b[3] - container_margin.right],
	fillColor: my_colors.white
});
var container_gb = container.geometricBounds;
var container_h = container_gb[2] - container_gb[0];
var post_h = container_h / cnt; //各POSTの矩形の高さ


//各POSTをレイアウトして行く
for (var i=0; i<cnt; i++) {
	txtSize = default_txtSize;
	txtLead = default_txtLead;
	//JSONオブジェクトから情報を取り出す
	var tl_text = tlObj[i].text.replace(/</g, '<').replace(/>/g, '>').replace(/\r\n/g, ' ').replace(/\r/g, ' ').replace(/\n/g, ' ');
	var tl_name = tlObj[i].user.name;
	//各POSTの矩形
	var pr = postRects[i] = p.textFrames.add({
		geometricBounds: [container_gb[0] + post_h * i, container_gb[1] + 2, container_gb[0] + post_h * i + post_h, container_gb[3] - 2],
		fillColor: my_colors.white
	});
	var pr_gb = pr.geometricBounds;
	//textを納めるフレーム
	var tr = textRects[i] = p.textFrames.add();
	tr.properties = {
		geometricBounds: [pr_gb[0] + 1, pr_gb[1] + post_h - 1, pr_gb[0] + post_h - 1, pr_gb[3]],
		fillColor: my_colors.white,
		contents: tl_name + ' ' + tl_text,
	};
	tr.paragraphs[0].properties = {
		pointSize: txtSize + tu,
		leading: txtLead + tu,
		appliedFont: fontName1,
		fontStyle: 'R',
		kerningMethod: 'メトリクス'
	};
	//name部分のスタイル
	for (var j=0; j<tl_name.length; j++) {
		tr.paragraphs[0].characters[j].properties = {
			fillColor: my_colors.link,
			fontStyle: 'H',
			pointSize: '7.5' + tu
		};
	}
	//テキストがオーバーフローしている場合の処理
	tr_para = tr.paragraphs[0];
	while (tr.overflows && tr_para.horizontalScale > 90) {
		tr_para.horizontalScale--;
	}
	if (tr.overflows) {
		tr_para.horizontalScale = 100;
		tr_para.properties = {
			pointSize:'6' + tu,
			leading: '7' + tu
		};
		while (tr.overflows) {
			tr_para.horizontalScale--;
		}
	}
	//アイコンの情報を格納()
	iconImgs[i] = {
		url: encodeURI(tlObj[i].user.profile_image_url),
		localFile: downloadPath + tlObj[i].user.profile_image_url.replace(/^.*\//, '')
	};
	if (!new File(iconImgs[i].localFile).exists) {
		downloadFile(iconImgs[i].url, iconImgs[i].localFile); //アイコンの画像ををダウンロード
	}
	//アイコン用の矩形
	iconRects[i] = p.textFrames.add({
		geometricBounds: [pr_gb[0] + 1, pr_gb[1], pr_gb[0] + post_h - 1, pr_gb[1] + post_h - 2],
	});
	iconRects[i].place(new File(iconImgs[i].localFile)); //アイコンの画像を配置
	iconRects[i].fit(FitOptions.proportionally);
}

10年前のDTPエキスパートの参考書の中から…

届いてから未開封のまま放ったらかしにしてたDTPエキスパートの更新試験の問題、さずがに手を付けんとマズいと思い、昨日あたりからやり始めてます。なんかどっかのblogで見たネタとか、wikipedia丸写しみたいな問題がありますね。

で、ふと思い立って10年前(99年版)のDTPエキスパートの参考書を引っ張り出して見てみようとしたんですが、中からすっかり忘れてたヘソクリが出て来ました。
dtpexpert99-02.png

dtpexpert99-01.png
あーそういえば2004年の新札発行時に記念に取っとくかと思ってピン札をこの本に挟んでいたんでした。その時保管してた別のお札も一緒に挟んでたみたいです。DTPがらみの本なら処分しないと考えていたんでしょうか。

dtpexpert99-03.png
右上の五百円札は、子供の頃おばあちゃんがお小遣いとしてくれたのを、大事にとっておいたやつです…おばあちゃん…・゚・(ノД`;)・゚・

更新試験の方は、あと50問くらいなので、まあ何とかなるでしょう…
Profile
choco
Author : choco

印刷・製版の現場を経て、広告制作会社でPhotoshopを使ったビジュアル制作を担当。

→現在は車載機器開発ベンダにて、組み込み3Dデータ作成やUIデザインなどを行っています。

Categories
Favorites


Search
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。