FIELD NOTES: 書を持って街へ出よう

合同会社フィールドワークス プログラマ兼代表のブログ

ブログ移転のお知らせ

2012年3月より,本ブログは下記URLへ引越します(Tumblrの独自ドメイン機能を利用しています)。

http://blog.field-works.co.jp/

今後ともどうぞよろしくおねがいいたします。

2012/11/17

はてなブログがMarkdown記法に対応しました。

これを機会に,はてなダイヤリーの過去記事をはてなブログに移行すると共に,しばらくはTumblerとはてなブログを併用していきたいと思います。

Google Apps Script でメールをタイマー送信する方法

メールの送信を予約して,決まった日時に送りたいことがあります。

そのようなことを実現するためのアプリケーションもあるようですが,常にPCの電源を入れておく必要があります。
一方,外部のASPサービス(「ステップメールサービス」など)も存在するようですが,有料であったり,無料であってもメール本文に広告が入ったりするので,気軽に使うことができません。

そこで,Google Apps Script を使ってメールのタイマー送信を実現してみました。

スプレッドシートの作成

まずは,Googleドキュメントでスプレッドシートを作成します。
シートを一つ追加し,「template」と「schedule」という名前に変更します。

templateシートには,2行目以降にメールの件名と,メール本文のテンプレートを記入します。
件名またはメール本文中の「${ … }」という文字列は,メール送信時に可変のパラメータに置き換えられます。

f:id:fet:20120117164330j:image:w640

scheduleシートには,送信予定日時,テンプレートの番号,宛名,メールアドレスを記入します。
templateシートの2行目のテンプレートがテンプレート番号1に対応します。

f:id:fet:20120117164331j:image:w640

スクリプトの作成

次にスクリプトを作成します。

「ツール/スクリプトエディタ…」メニューを選択し,コードを入力します。

変数BCCには,BCCの送信先を設定します。
不要であれば,空文字列にしてください。

/**
 * Send mail according to a schedule.
 * スケジュールに合わせて自動でメールを送信する。
 *
 * Created by: Field Works, LLC / 合同会社フィールドワークス
 * Reference: http://www.field-works.co.jp/
 * Date: 2012/01/17
 */

var BCC = 'admin@sample.com';

function format(templ, params) {
  return templ.replace(/\${(.*?)}/g, function($0, $1) {
    return (params[$1] && typeof(params[$1]) != "object") ?
      params[$1].toString() : JSON.stringify(params[$1]);
  });
}

// メール本文を取得する
function getMessage(ss, row, params) {
  var templ = ss.getSheetByName('template');
  var r = templ.getRange('A2:B99');
  var subject = r.getCell(row, 1).getValue();
  var body = r.getCell(row, 2).getValue();
  return {subject: format(subject, params), body: format(body, params)};
}

// メール送信
function sendEMail(to, subject, body, opt) {
  try {
    MailApp.sendEmail(to, subject, body, opt);
  } catch (e) {
    return {result: 'NG', message: e.message};
  }
  return {result: 'OK', message: ""};
}

// 送信スケジュールをチェックする
function checkSchedule() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var schedule = ss.getSheetByName('schedule');
  var r = schedule.getRange('A2:F999');
  var row = r.getNumRows();
  var now = (new Date()).getTime();
  for (var i = 1; i <= row; ++i) {
    // 「送信予定日時」が空ならデータの終わりと判断
    if (r.getCell(i, 1).getValue() == "") {
      break;
    }
    var tm = r.getCell(i, 1).getValue().getTime();
    var status = r.getCell(i, 5).getValue();
    if (status == "" && tm < now) {
      // メール送信
      var no = r.getCell(i, 2).getValue();
      var to =  r.getCell(i, 4).getValue();
      var params = {
        TO: r.getCell(i, 3).getValue(),
      };
      var msg = getMessage(ss, no, params);
      var ret = sendEMail(to, msg.subject, msg.body, {bcc: BCC});
      // 処理結果を書き込み
      r.getCell(i, 5).setValue(ret.result);
      r.getCell(i, 6).setValue(ret.message);
    }
  }
}

トリガーの設定

「トリガー/現在のスクリプトのトリガー…」メニューを選択して,タイマートリガーを設定します。
ここでは,15分毎にチェックするように設定しました。

f:id:fet:20120117164332p:image:w640

現在時刻が「送信予定日時」を超えるとメールを送信し,処理結果を「結果」欄に設定します。
メール送信処理中に例外が発生した場合は,「エラーメッセージ」欄に例外メッセージを残します。

IPAmj明朝フォントの研究 ― 実装編 ―

前回の調査結果を元に Field Reports 1.4 に以下の機能を盛り込みました。

fet2011-12-23

サロゲートペア対応

従来は,PDFで定義済みのCMapである「UniJIS-UCS2-H」を使ってエンコーディングを行なっていましたが,これでは1文字=2バイトのコードまでしか対応できませんでした。

そこで,フォントファイルが存在する場合はエンコーディングとして「Identity-H」を使用することにしました。
Identity-Hの場合,文字コードは(0〜65,535)のCIDベースになります(TrueTypeフォントの場合はGID)。
UnicodeからCIDへの変換は,フォント自身が持っているcmapを使って行います。

これで,サロゲートペアで表現される文字もCIDまたはGIDに変換して,PDFに埋め込むことができるようになりました。

ただし,プログラミング言語によっては2バイトを超えるUnicode文字をエスケープシーケンスなどで表現できないので,数値参照文字も使えるようにしました。

&#dddd; または &#xhhhh; (ddddは10進数,hhhhは16進数)

ついでに,CIDまたはGIDで直接グリフを指定できるよう「グリフ参照文字」も使えるようにしました。

&@#dddd; または &@#xhhhh;l

異体字セレクタ

異体字セレクタ(IVS)の情報は,フォントファイルのcmapテーブルの中の「Format 14 」のサブテーブルに格納されています。

Field Reports は内部的には文字コードをUCS4で持っています。UCS4をCIDまたはGIDに変換する際に1文字先読みし,2文字目が異体字セレクタ(0x0E0100〜0x0E01EF)であれば,IVSを使って変換するようにしました。

グリフ名参照

前回触れたとおり,IPAmj明朝フォントの場合「post」テーブルにグリフ名→GIDの対応表が収納されています。

文字参照を独自拡張した「グリフ名参照」により,グリフ名を指定できるようにしました。
以下のような書式になります。

&@<グリフ名>;

使用例

以下に,サロゲートペア・異体字セレクタ・グリフ名参照を使用してPDFを作成した例を示します。

実行には,Field Reports のコマンドラインプログラムを使用しました。
下記のパラメータファイルを作成してコマンドラインプログラムに掛けると,先頭の実行例の様なPDFが作成されます。

サロゲートペア」では,Unicode 6.0に含まれるCJK統合漢字拡張漢字B集合〜D集合の文字の一部を表示しています。

異体字セレクタ」では,異体字セレクタを使って「邊」の異体字等を表示しています。

「グリフ名参照文字」では,IPAmj明朝に収納されている文字のうちUCSが未実装かつIVS実装されていない7,160文字の一部を表示しています。

{
    "resources": {
        "font": {
            "IPAmjMincho": {
                "path": "./ipamjm.ttf",
                "embed": true,
                "subset": true
            }
        }
    },

    "template": {"size": "A4"},

    "context": {
        "text": [
            {
                "new": "Tx",
                "font": "IPAmjMincho",
                "font-size": 14,
                "rect": [50, 750, 550, 780],
                "value": "【サロゲートペア】"
            },
            {
                "new": "Tx",
                "font": "IPAmjMincho",
                "font-size": 24,
                "multiline": true,
                "rect": [50, 650, 550, 750],
                "charref": true,
                "value": "&#x2000B;&#x20089;&#x200A2;&#x200A4;&#x201A2;
&#x20213;&#x2032B;&#x20371;&#x20381;&#x203F9;&#x2044A;&#x20509;
&#x205D6;&#x20628;&#x2074F;&#x20807;&#x2083A;&#x208B9;&#x2097C;
&#x2099D;\n&#x2A716;&#x2A729;&#x2a72a;&#x2a72c;&#x2a738;&#x2a73d;
&#x2a746;&#x2a752;&#x2a758;&#x2a75f;\n&#x2B740;&#x2B741;&#x2B742;
&#x2B743;&#x2B744;&#x2B745;&#x2B746;&#x2B747;&#x2B749;&#x2B74A;
&#x2B74C;&#x2B74D;"
            },
            {
                "new": "Tx",
                "font": "IPAmjMincho",
                "font-size": 14,
                "rect": [50, 600, 550, 630],
                "value": "【異体字セレクタ】"
            },
            {
                "new": "Tx",
                "font": "IPAmjMincho",
                "font-size": 24,
                "multiline": true,
                "rect": [50, 500, 550, 600],
                "value": "\u9089\U000E010F\u9089\U000E0119\u9089\U000E011B
\u9089\U000E011A\u9089\U000E011C\u9089\U000E011D\u9089\U000E0117
\u9089\U000E0116\u9089\U000E0115\u9089\U000E0114\u9089\U000E0118
\u9089\U000E0113\u9089\U000E0112\u9089\U000E0111\u9089\U000E0110\n
\u908A\U000E0108\u908A\U000E0109\u908A\U000E010A\u908A\U000E010B
\u908A\U000E010C\u908A\U000E010D\u908A\U000E010E\u908A\U000E010F
\u908A\U000E0110\n葛飾区 葛\U000E0102城市/蓮田市 蓮\U000E0104田市"
            },
            {
                "new": "Tx",
                "font": "IPAmjMincho",
                "font-size": 14,
                "rect": [50, 450, 550, 480],
                "value": "【グリフ名参照文字】"
            },
            {
                "new": "Tx",
                "font": "IPAmjMincho",
                "font-size": 24,
                "multiline": true,
                "rect": [50, 350, 550, 450],
                "charref": true,
                "value":"&@mj000007;&@mj000008;&@mj000012;&@mj000022;&@mj000023;
&@mj000028;&@mj000029;&@mj000036;&@mj000037;&@mj000045;&@mj000046;
&@mj000047;&@mj000048;&@mj000073;&@mj000074;&@mj000089;&@mj000105;
&@mj000106;&@mj000129;&@mj000130;&@mj000143;&@mj000144;&@mj000145;
&@mj000146;&@mj000156;&@mj000157;&@mj000175;&@mj000176;&@mj000183;
&@mj000184;&@mj000185;&@mj000206;&@mj000207;&@mj000208;&@mj000209;
&@mj000241;&@mj000242;&@mj000264;&@mj000265;&@mj000266;&@mj000267;
&@mj000269;&@mj000270;&@mj000276;&@mj000277;&@mj000278;&@mj000302;
&@mj000303;&@mj000309;&@mj000310;&@mj000311;&@mj000312;&@mj000317;
&@mj000318;&@mj000332;&@mj000333;&@mj000380;&@mj000381;&@mj000405;
&@mj000406;"
            }
        ]
    }
}

Jimdoでソースコードを整形して表示するならPygmentsが便利

Webサイトにソースコードを整形して貼り付ける時の定番は,SyntaxHighlighterのようです。
ただ,SyntaxHighlighter付属のCSSファイルをサイトにアップロードする必要があり,Jimdoで使うのはちょっと面倒なので躊躇していました。

先日,Pygmentsというソフトを見つけたので試してみました。

Pygmentsとは

Pythonで作成された“syntax highlighter”で,Sphinx, rts2pdf, Trac, GitHubなど様々なプロダクトで使用されています。

以下の出力形式に対応しています。

  • HTML
  • ANSI sequences (console output)
  • LaTeX
  • RTF

また,入力として受付可能なプログラミング言語が非常に多く,OCamlにも対応しているのがポイント高いです。

インストール

easy_installがインストールされていれば,pigmentsのインストールは非常に簡単です。

$ sudo easy_install pygments

使い方

pigmentsをインストールすると,pygmentizeというコマンドラインプログラムが作られます。

以下のように実行すると,HTMLのコード片が作成されます。

$ pygmentize -f html -l ruby -o foo.html foo.rb

出力されたHTMLを表示するのに必要なスタイル指定は,以下のコマンドで作成できます。
`default'スタイルでは,61行のコンパクトなCSSが出力されました。

$ pygmentize -S default -f html > pygments.css

スタイル指定を含んだHTMLを出力したい場合は`-O full'オプションを付けます。

$ pygmentize -f html -O full -l ruby -o foo.html foo.rb

Jimdoでの設定

CSSの設定

Jimdoの管理画面の「独自画面/CSS」に,先ほど作成したCSSの中身をペーストします。

ソースコードの貼りつけ

ソースコードを貼りつけたい場所で「ウィジェット」を追加し,pygmentizeで作成したHTMLをペーストします。

fet2011-12-21