当サイトで生成している RSS(野良feed):
M.C.P.C.:カテゴリー Script バックナンバー
- 2009.05.24
-
AppleScriptでレコード文字列をデシリアライズ
- 2009.05.01
-
AppleScriptでレコード文字列のデシリアライズのやり方がわからん
- 2008.11.01
-
HttpConnectionクラス互換HttpConnクラスを作っているのだがJavaScriptで文字列のキャラクターエンコーディング変換する方法が不明
- 2008.10.31
-
Webブラウザの$関数とAdobeアプリの$オブジェクトは違うのだ
- 2008.10.25
-
Illustratorで現在のドキュメント名を入力するJavaScript
- 2008.10.23
-
InDesignやIllustratorのJavaScriptでオブジェクトの種類(クラス名)を調べる方法がたくさんあるよ
- 2008.09.01
-
MacIE5でArray.pushを実装
- 2008.01.14
-
CAM::PDFを使ったPDF内フォント埋め込み調査スクリプト
- 2007.12.25
-
TitanURLみたいなの
- 2007.12.24
-
転送URLをするPerl CGI
2009.05.24
AppleScriptでレコード文字列をデシリアライズ
M.C.P.C.: AppleScriptでレコード文字列のデシリアライズのやり方がわからん
にて、AppleScriptのレコードを表現する文字列
{ creatorversion: "13.0", documentversion: "8.0" }
を、実際にAppleScriptのレコードとして解釈してもらうためにどうすればいいか、ていうことがわからなかったわけです。
ほかのスクリプト言語であれば、これをデシリアライズという表現をして、PerlやJavaScriptだったらevalっていうやつを使うとそれができるわけですが、AppleScriptとデシリアライズと検索しても出てこない。
んて、この前のエントリのコメント欄で教えていただき、run script "{...}"
という書き方ができるというので、やってみました。
set str to " {creatorversion: \"13.0\", documentversion: \"8.0\"} " as string
set result to run script result
display alert ("Creator Version: " & (get creatorversion of result) & "
Document Version: " & (get documentversion of result))

▲スクリプトエディタに入力。エスケープ文字のバックスラッシュはOption+¥

▲実行
うまくいきました。これで、外部のソフトを使って処理した結果をAppleScriptで受け取って処理しやすくなりました。楽でいいですね!
2009.05.24
午後 11:06
[Script]
|
固定リンク
|
コメント
(0)
|
トラックバック
(0)
|
2009.05.01
AppleScriptでレコード文字列のデシリアライズのやり方がわからん
AppleScriptを最近はじめたんですけれども、参考書が少なくて困っていたところ、こんな本があるのを発見。
これ自分で買って会社においておけばMac好きな人が勝手に読んでなんか作ってくれると思って4年ぐらい前に買って書棚においておいたんだけれども結局何もできなかったんで、Macを仕事で使う人≠Mac好きな人であることを実感。自分でやるしかないか。
それはよいとして、AppleScriptからPerlのスクリプトをdo shell scriptで呼んで、結果をAppleScriptに受け渡ししたいところなんですけれども、Perl側で
$VAR1 = {
'creatorversion' => '13.0',
'documentversion' => '8.0'
};
みたいな連想配列になっているものを、AppleScriptでいうところのレコードの文字列
{ creatorversion: "13.0", documentversion: "8.0" }
にしてAppleScriptに渡して、これをレコードとして処理させたいわけです。
PerlからのシリアライズについてはJSONとかのライブラリ使うと作る必要ねーなーと思ったのですけれども(←あとで罠にはまるフラグ)、AppleScript側でデシリアライズする方法がわからん。
ググっても出てこんので、AppleScript界隈ではデシリアライズとか言わないんだろうなーとは思うんですけどね。
2009.05.01
午前 10:42
[Script]
|
固定リンク
|
コメント
(2)
|
トラックバック
(1)
|
2008.11.01
HttpConnectionクラス互換HttpConnクラスを作っているのだがJavaScriptで文字列のキャラクターエンコーディング変換する方法が不明
Adobe ExtendScript2、Adobe Bridge CS3、Adobe InDesign CS3などで動くJavaScriptで、
/*
if ( !ExternalObject.webaccesslib ) {
ExternalObject.webaccesslib = new ExternalObject('lib:webaccesslib');
}
*/
function HttpConn(url) {
// コンストラクタ。ここでUser-Agent名や
// timeout値など準備しておくといいよね
this.url = url;
this.timeout = 5;
this.redirect = 5;
this.method = "GET";
this.responseStatus = undefined;
this.responseheaders = {};
this.requestheaders = {};
this._count = 0;
};
HttpConn.uri = function(uri) {
var rex = new RegExp( 'http://([^:/]+)(?::(\d+))?(.+)' );
// via http://pc11.2ch.net/test/read.cgi/php/1015692614/57
var urlObj =[];
if ( uri.match(rex) ) {
urlObj.host = RegExp.$1;
urlObj.port = RegExp.$2 ?RegExp.$2 :80;
urlObj.path = RegExp.$3;
}
return urlObj;
};
HttpConn.prototype.execute = function () {
var conn = new Socket;
conn.timeout = this.timeout;
var urlObj = HttpConn.uri(this.url);
if (conn.open( urlObj.host + ':' + urlObj.port, 'binary' ) ) {
var requestHeader ="";
for (var i = 0; i < this.requestheaders.length / 2; i++) {
requestHeader = this.requestheaders[i] +": "
+ this.requestheaders[i+1] + "\n";
}
conn.write ( this.method + " " + urlObj.path
+ " HTTP/1.0\n"
+ 'Host: ' + urlObj.host + "\n"
+ requestHeader
+ "\n");
var reply = "";
for ( ; ; ) {
if (conn.eof) break;
reply += conn.read(65536);
}
conn.close();
var boundary =[];
boundary[0]
= reply.indexOf("\r\n"); //responseStatus/ResponseHeader
boundary[1]
= reply.indexOf("\r\n\r\n"); // responseHeader/body
var response = {
status: reply.substring(0, boundary[0]),
header: reply.substring(boundary[0]+2, boundary[1]),
body: reply.substring(boundary[1] + 4 ),
}
// response
if (typeof(this.response) !="undefined"
&& this.response.constructor.name == "File") {
this.response.open("w");
this.response.write(response.body);
}
else {
this.response = response.body;
}
var headerArray
= response.header.substring(boundary[0] + 2).split("\n");
this.responseheaders = [];
var headerArrayPair = [];
// responseheaders
for (var i = 0; i < headerArray.length;i++) {
if (headerArray[i].match(/(^.+?):(.+)/) ) {
headerArrayPair.push( [RegExp.$1, RegExp.$2] );
}
}
headerArrayPair.sort(function(a, b) {
return (a[0] > b[0]) ? 1 : -1;
});
for (var i = 0; i < headerArrayPair.length; i++) {
this.responseheaders.push(
headerArrayPair[i][0], headerArrayPair[i][1] );
}
// responseStatus
response.status.match(/(^HTTP\/\d\.\d) (\d+) (.+)/);
this.responseStatus = RegExp.$2;
if (this.responseStatus == "301"
|| this.responseStatus == "302") {
var url = "";
for (var i = 0; i < this.responseheaders.length; i+=2) {
if (this.responseheaders[i] == "Location") {
url = this.responseheaders[i+1];
break;
}
}
var http = new HttpConn(url);
http.requestheaders = [ "User-Agent",
app.name + "/" + app.version + " "
+ "(" + $.os + ")",
];
http.execute() ;
this.response = http.response;
this.responseStatus = http.responseStatus;
}
return;
} else {
this.responseStatus = -1;
}
};
var http = new HttpConn("http://www.yahoo.co.jp/");
http.requestheaders = [ "User-Agent",
app.name + "/" + app.version + " "
+ "(" + $.os + ")",
];
//http.response = new File("/c/temp/robin.shtml");
http.execute();
alert(http.responseStatus);
alert(http.response);
// http.response.close();
てな感じで、HttpConnectionクラスのただWebから引っ張ってくるところだけ互換で使えるようなクラスHttpConnクラスを作っているんだけれども、今途中で止まっているのは、binaryで引っ張ってきてStringとして入れたコンテンツを如何にしてエンコーディングを変換しようか、ていうところです。Perlだったら、decode("utf8", $reply)の一文で済みそうなところなんだけれども、JavaScriptってどうすればいいんやろう。
2008.11.01
午後 06:13
[Script]
|
固定リンク
|
コメント
(2)
|
トラックバック
(0)
|
2008.10.31
Webブラウザの$関数とAdobeアプリの$オブジェクトは違うのだ
InDesign - JavaScript小技 - 名もないテクノ手 [d.hatena.ne.jp]
OSとバージョンを得る
var my_fileSys = $.os;
うちの環境だと "Macintosh OS 10.5.5"と返ります。JSTG p.198
やってみた。

▲$.osをコンソールで入力してEnter
なるほど、$はHelper Objectといって、ビルトインなオブジェクトなんですね。
MacIE5のWebばっかりやっていたもので、$はスクリプトの最初で
function $(id){ return document.getElementById(id); }
をおまじないのごとく唱えるものと思い込んでいました。
あと、この手のことはJavaScript Tool Guideを参照すればいいのですね。
[PDF] JAVASCRIPT TOOLS GUIDE : p.199 [www.adobe.com]
せうぞーさん、ありがとうございました!
2008.10.31
午前 02:05
[Script]
|
固定リンク
|
コメント
(0)
|
トラックバック
(0)
|
2008.10.25
Illustratorで現在のドキュメント名を入力するJavaScript
Illustrator 10~CS3のJavaScriptで、選択しているテキストパスに、現在のドキュメント名を入力します。ただし、Illustrator CS1では全く役に立ちませんw
用途として、Illustratorで手動面付けしている事業所さんなんかで、トンボ外にドキュメント名を表示することで、出力したものを取り違えないようにするのに使えます。
機能の割に長いのは、Illustrator 10~CS3対応するため、Illustrator 10においてCS以降のアクセス方法が使えるようなappオブジェクトを拡張しているからです。無駄だよね……
Filename: input_filename.jsx (Illustrator 10の場合は拡張子jsの方がいいのかな)
/*
input_filename.jsx : 選択したテキストにファイル名を入力します
*/
(function(){
// 機能拡張:AI10の場合、appオブジェクトを拡張
if (typeof app == "undefined") {
// Illustrator10の場合
app = {};
app.documents = documents;
if (app.documents.length != 0) {
// activeDocumentが存在していないとアクセスすらできない
app.activeDocument = activeDocument;
}
}
// main
if (app.documents.length != 0) {
// ドキュメントを1つ以上開いている
var objDoc = app.activeDocument;
var selObjs = objDoc.selection;
switch ( selObjs.length ) {
case 0: // 選択無し
alert("テキストパスを1つだけ選択してください。");
break;
case 1: // 1つだけ選択
if ( (selObjs[0].typename == "TextFrame") // AICS以降
|| (selObjs[0].typename == "TextArtItem") ) {
// TextFrameだった
selObjs[0].contents = objDoc.name;
}
else { // TextFrame以外だった
alert("テキストパスを選択してください。");
}
break;
default: // 2つ以上選択
alert("複数選択しています。"
+ "テキストパスを1つだけ選択しなおしてください。");
}
}
else { // ドキュメントを開いていない
alert("Illustratorで書類を開いてから実行してください。");
}
})();
CodeReposにIllustratorのディレクトリ掘っていいかなー
http://svn.coderepos.org/share/platform/illustrator
あたりかな。
2008.10.25
午前 02:07
[Script]
|
固定リンク
|
コメント
(2)
|
トラックバック
(0)
|
2008.10.23
InDesignやIllustratorのJavaScriptでオブジェクトの種類(クラス名)を調べる方法がたくさんあるよ
InDesignやIllustratorのJavaScriptで、選んでいるアイテムがなんであるか調べたいっていうことがあります。ブラウザのJavaScriptでいえば、DOMをdocument.getElementsByTagNameで絞ったあと、アイテムを1点ずつclassNameを見て照合するみたいなイメージになるでしょうか。
そんで、選んだオブジェクトが何であるか、というのを調べるコード、いろんなのが流通しているみたい。
(function(){
var objDoc = app.activeDocument;
var selObjs = objDoc.selection;
alert(selObjs[0].constructor.name); // JavaScript実装
alert(selObjs[0].typename); // PICTRIX風
alert(selObjs[0].toString() ); // 古籏一浩風
})();
さてこれのうちどれを使うのがいいのかな。
2008.10.23
午前 02:06
[Script]
|
固定リンク
|
コメント
(0)
|
トラックバック
(0)
|
2008.09.01
MacIE5でArray.pushを実装
MacIE5でArray.pushが必要になったんで、作りました。以下のコードをJavaScriptのコードに入れておくと、Arrayオブジェクトにpushメソッドが追加されます。pushメソッドが既にある場合は、上書きしません。
// Array.pushをMacIE5に実装
if (typeof Array.prototype.push != 'function') {
Array.prototype.push = function (f){
this[this.length] = f;
}
}
使うときは普通に
var x = ['hoge', 'fuga'];
x.push('hage');
alert(x.length); // 3
var s = '';
for (var i = 0; i < x.length; i++ ) {
s += i + ':' + x[i] + ',';
}
alert(s); // 0:hoge,1:fuga,2:hage,
となります。
作ってから検索してみたら、先人が同じコードを作ってた。よくあることだねー
IE5.5以前ではArray.push()が使えないらしいので - へぼいいいわけ [d.hatena.ne.jp]
あと、同様に昔作ったMacIE5でdecodeURIを実装もご覧ください。
2008.09.01
午後 06:12
[Script]
|
固定リンク
|
コメント
(2)
|
トラックバック
(0)
|
2008.01.14
CAM::PDFを使ったPDF内フォント埋め込み調査スクリプト
PerlのCAM::PDFモジュールを使って、PDFのフォント一覧を出し、特にフォントが埋め込まれているかどうか調べます。
実行例:
$ ./listfont.pl 2.pdf
$VAR1 = [
{
'subtype' => 'CIDFontType0',
'embedded' => 'yes',
'page' => 1,
'embeddedtype' => 'Type 1 (CID)',
'basefont' => 'RAUSIV+GothicBBBPro-Medium',
'fontfamily' => 'þÿA-OTF N-0´0·0Ã0¯BBB Pro Medium'
},
{
'subtype' => 'CIDFontType2',
'embedded' => 'yes',
'page' => 1,
'embeddedtype' => 'TrueType (CID)',
'basefont' => 'BCSASB+SymbolMT',
'fontfamily' => 'Symbol'
},
{
'subtype' => 'TrueType',
'embedded' => undef,
'page' => 1,
'embeddedtype' => undef,
'basefont' => 'ArialMT',
'fontfamily' => 'Arial'
}
];
$
ソースは次の通り。
Filename: listfont.pl
#!/usr/bin/perl
use strict;
use warnings;
use CAM::PDF;
use Data::Dumper;
binmode STDOUT => ':utf8';
my $infile = shift;
my $doc = CAM::PDF->new($infile) || die "$CAM::PDF::errstr\n";
my $fonts;
for my $page (1 .. $doc->numPages()) {
foreach my $fontname (sort $doc->getFontNames($page)) {
my $font = $doc->getFont($page, $fontname);
$font = parsefont($font);
push @$fonts,
{
page => $page,
embedded => $font->{embedded},
fontfamily => decode_fontfamily($font->{fontfamily}),
basefont => $doc->getValue($font->{BaseFont}),
subtype => $doc->getValue($font->{Subtype}),
embeddedtype => $font->{embeddedtype},
};
}
}
print Dumper($fonts);
exit;
sub parsefont {
my $font = shift;
my $fontdescriptor = $font->{FontDescriptor};
if ($fontdescriptor) {
my $ref = $doc->getValue($fontdescriptor);
$font->{fontfamily} = $doc->getValue($ref->{FontFamily});
my $fontfile = $doc->getValue($ref->{FontFile });
my $fontfile2 = $doc->getValue($ref->{FontFile2});
my $fontfile3 = $doc->getValue($ref->{FontFile3});
if ( ($fontfile) || ($fontfile2) || ($fontfile3) ) {
$font->{embedded} = 'yes';
$font->{embeddedtype} ="Type 1" if $fontfile;
$font->{embeddedtype} ="TrueType (CID)" if $fontfile2;
$font->{embeddedtype} ="Type 1 (CID)" if $fontfile3;
}
return $font;
}
my $descendantfonts = $doc->getValue($font->{DescendantFonts});
if ($descendantfonts) {
if (ref $font->{DescendantFonts}->{value}) {
return parsefont(
$doc->getObjValue(
$font->{DescendantFonts}->{value}->[0]->{value}
)
);
} else {
return parsefont(
$doc->getObjValue(
$doc->getObjValue(
$font->{DescendantFonts}->{value}
)->[0]->{value}
)
);
}
}
}
sub decode_fontfamily {
my $str = shift;
$str =~s/#([0-9A-F][0-9A-F])/pack('C', hex($1))/eg;
return $str;
}
__END__
再帰処理の部分で、戻り値を2通り持たせているのですけれども、これは、
1647 0 obj<</Subtype/Type0/DescendantFonts[1646 0 R]/BaseFont/DIEAIA+SymbolMT/ToUnicode 1644 0 R/Encoding/Identity-H/Type/Font>>
が
$VAR1 = {
'DescendantFonts' => bless( {
'gennum' => '0',
'value' => [
bless( {
'gennum' => '0',
'value' => '1646',
'type' => 'reference',
'objnum' => '1647'
}, 'CAM::PDF::Node' )
],
と取られ、
9 0 obj<</Subtype/Type0/DescendantFonts 15 0 R/BaseFont/RAUSIV+GothicBBBPro-Medium/Encoding/Identity-H/Type/Font>>
が
$VAR1 = {
'DescendantFonts' => bless( {
'gennum' => '0',
'value' => '15',
'type' => 'reference',
'objnum' => '9'
}, 'CAM::PDF::Node' ),
みたいに取られまして、
よくわかんないけれども元のPDFで2通りの記述があるのがそのままパースされちゃうので、分岐してみました。
こんな危なっかしいコード書いていることでもわかるとおり、これで決定版というわけではなく(もれなく間違いなく調べられるかどうかは僕も不明ということ)。普通にAcrobatやAdobe ReaderでCtrl+Dしてフォントタブを選択して調査したほうがいいかもしれません。
2008.01.14
午前 01:21
[Script]
|
固定リンク
|
コメント
(0)
|
トラックバック
(0)
|
2007.12.25
TitanURLみたいなの
hbkr : ハバカリ | TitanURL.com | URLを糞長くするサービス
で見つけた
TitanURL [titanurl.com]
TitanURLみたいなのを作ってみる場合。すべての文字をsplitで切り出して、md5をかけるとどうだろう?
!/usr/bin/perl
use strict;
use warnings;
use CGI;
use Digest::MD5;
my $q = CGI->new();
my $url = $q->param('url');
print $q->header();
print titanurl( $url )."\n";
exit;
sub titanurl {
my $url = shift;
my $str = q();
my @chars = split//, $url;
foreach my $char ( @chars ) {
my $ctx = Digest::MD5->new;
$ctx->add($char);
print $ctx->hexdigest;
}
return $str;
}
$ perl make.cgi url=http://blog.dtpwiki.jp/dtp/ Content-Type: text/html; charset=ISO-8859-1 2510c39011c5be704182423e3a695e91e358efa489f58062f10dd7316b65649ee358efa489f58062f10dd7316b65649e83878c91171338902e0fe0fb97a8c47a853ae90f0351324bd73ea615e64875176666cd76f96956469e7be39d750cc7d96666cd76f96956469e7be39d750cc7d992eb5ffee6ae2fec3ad71c777531578f2db95e8e1a9267b7a1188556b2013b33d95679752134a2d9eb61dbd7b91c4bccb2f5ff47436671b6e533d8dc3614845d5058f1af8388633f609cadb75a75dc9d8277e0910d750195b448797616e091ade358efa489f58062f10dd7316b65649e83878c91171338902e0fe0fb97a8c47af1290186a5d0b1ceab27f4e77c0c5d68865c0c0b4ab0e063e5caa3387c1a87418ce4b16b22b58894aa86c421e8759df3865c0c0b4ab0e063e5caa3387c1a87415058f1af8388633f609cadb75a75dc9d363b122c528f54df4a0446b6bab0551583878c91171338902e0fe0fb97a8c47a6666cd76f96956469e7be39d750cc7d98277e0910d750195b448797616e091ade358efa489f58062f10dd7316b65649e83878c91171338902e0fe0fb97a8c47a6666cd76f96956469e7be39d750cc7d9 $
これと前回のエントリの転送URLするやつをつなげばTitanURLもどきはできるのか。
でも、TitanURLは、どんなURL入れても2008文字のURLになるんですよねー。IEの最大URL長もその付近。2008文字に合わせるように、もうちょっと複雑なことやっているのかな。
2007.12.25
午後 06:44
[Script]
|
固定リンク
|
コメント
(0)
|
トラックバック
(0)
|
2007.12.24
転送URLをするPerl CGI
転送URLを実現するCGIを書いてみました。なんとなく仕事で必要なので。あと、このソースだと、転送URLの対応表は直書きですw
Filename: shorturl.cgi
#!/usr/bin/perl
use strict;
use warnings;
use CGI;
# main
package main;
my $q = CGI->new();
my $query = $q->param('q');
my $a = redirect->new();
$a->set_dict( \&list );
$a->query_redirect($query);
exit;
# replace function
sub list {
my $query = shift;
return undef unless defined $query;
my $hash_list =
{
'1' => 'http://www.dtpwiki.jp/',
'2' => 'http://dtpwiki.jp/',
};
return exists($hash_list->{$query})
?$hash_list->{$query}:undef;
}
# redirect
package redirect;
sub new{
return bless{ _DATA => { } }, shift;
}
sub dataref { $_[0]->{ _DATA } }
sub set_dict {
my $self = shift;
my $sub = shift;
$self->dataref->{'dict_sub'} = $sub;
return;
}
sub query {
my $self = shift;
my $query = shift;
return $self->dataref->{'dict_sub'}->( $query );
}
sub redirect {
require CGI;
my $self = shift;
my $url = shift;
my $q = CGI->new();
if ( defined $url ) {
print $q->redirect( $url );
return;
}
else {
print $q->header( -status => 404 );
print "404 not found\n";
return;
}
}
sub query_redirect {
my $self = shift;
my $q = shift;
$self->redirect(
$self->query( $q )
);
return;
}
1;
OOPにしてみたので、オブジェクトを生成した後、URLの対応付けを行うサブルーチンを参照渡しで設定するようなかんじになっています。だから、ナントカSQLによる辞書参照ルーチンを付けるといいんだけどめんどくさくなって放置。
なんつうか、TinyURLとかYouTubeみたいに、英字のパーマリンクみたいにしたいんですけれども、エンコード新たに作るのも億劫で。どっかにYouTubeのPermalink解説したページあったと思ったけど今探すと、YouTubeもPermalinkも一般的単語すぎて見つからんなー
2007.12.24
午前 01:05
[Script]
|
固定リンク
|
コメント
(0)
|
トラックバック
(0)
|




























































