当サイトで生成している RSS(野良feed):


M.C.P.C.:カテゴリー Script バックナンバー

2009.05.24
AppleScriptでレコード文字列をデシリアライズ はてなブックマーク - AppleScriptでレコード文字列をデシリアライズ
2009.05.01
AppleScriptでレコード文字列のデシリアライズのやり方がわからん はてなブックマーク - AppleScriptでレコード文字列のデシリアライズのやり方がわからん
2008.11.01
HttpConnectionクラス互換HttpConnクラスを作っているのだがJavaScriptで文字列のキャラクターエンコーディング変換する方法が不明 はてなブックマーク - HttpConnectionクラス互換HttpConnクラスを作っているのだがJavaScriptで文字列のキャラクターエンコーディング変換する方法が不明
2008.10.31
Webブラウザの$関数とAdobeアプリの$オブジェクトは違うのだ はてなブックマーク - Webブラウザの$関数とAdobeアプリの$オブジェクトは違うのだ
2008.10.25
Illustratorで現在のドキュメント名を入力するJavaScript はてなブックマーク - Illustratorで現在のドキュメント名を入力するJavaScript
2008.10.23
InDesignやIllustratorのJavaScriptでオブジェクトの種類(クラス名)を調べる方法がたくさんあるよ はてなブックマーク - InDesignやIllustratorのJavaScriptでオブジェクトの種類(クラス名)を調べる方法がたくさんあるよ
2008.09.01
MacIE5でArray.pushを実装 はてなブックマーク - MacIE5でArray.pushを実装
2008.01.14
CAM::PDFを使ったPDF内フォント埋め込み調査スクリプト はてなブックマーク - CAM::PDFを使ったPDF内フォント埋め込み調査スクリプト
2007.12.25
TitanURLみたいなの はてなブックマーク - TitanURLみたいなの
2007.12.24
転送URLをするPerl CGI はてなブックマーク - 転送URLをするPerl CGI

< 最後 « これより前10ä»¶ | 全件

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))

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

Applescriptdeserialize02
▲実行

うまくいきました。これで、外部のソフトを使って処理した結果をAppleScriptで受け取って処理しやすくなりました。楽でいいですね!

2009.05.24 午後 11:06 [Script] | 固定リンク | コメント (0) | トラックバック (0) | このエントリーをはてなブックマークへ追加 livedoor Clipでこのサイトを登録している人数livedoor Clipでこの記事をクリップ!

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) | このエントリーをはてなブックマークへ追加 livedoor Clipでこのサイトを登録している人数livedoor Clipでこの記事をクリップ!

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) | このエントリーをはてなブックマークへ追加 livedoor Clipでこのサイトを登録している人数livedoor Clipでこの記事をクリップ!

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) | このエントリーをはてなブックマークへ追加 livedoor Clipでこのサイトを登録している人数livedoor Clipでこの記事をクリップ!

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) | このエントリーをはてなブックマークへ追加 livedoor Clipでこのサイトを登録している人数livedoor Clipでこの記事をクリップ!

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) | このエントリーをはてなブックマークへ追加 livedoor Clipでこのサイトを登録している人数livedoor Clipでこの記事をクリップ!

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) | このエントリーをはてなブックマークへ追加 livedoor Clipでこのサイトを登録している人数livedoor Clipでこの記事をクリップ!

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) | このエントリーをはてなブックマークへ追加 livedoor Clipでこのサイトを登録している人数livedoor Clipでこの記事をクリップ!

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) | このエントリーをはてなブックマークへ追加 livedoor Clipでこのサイトを登録している人数livedoor Clipでこの記事をクリップ!

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) | このエントリーをはてなブックマークへ追加 livedoor Clipでこのサイトを登録している人数livedoor Clipでこの記事をクリップ!

< 最後 « これより前10ä»¶ | 全件