これまでのようにカンボジアの一般的なことや日々の生活のことやライフハックのことを混ぜていると、ブログとして、読者にとってのS/N比が低すぎるのがつねづね課題でした。
そこで、このブログは今後、カンボジアで自動組版とDTP企業社長&IT部長やってますという立場からそのへんの技術について特化して書いていくブログにしていこうと思っています。
2015年5月17日日曜日
2015年2月28日土曜日
Slackの導入を検討中です。
ChatOps、ただしLAN内、という制約条件下の解としてUnrealIRCdを自社鯖に導入して数ヶ月。各人のsavebuffが半月に1度くらい復号不能になりログ消滅。chanservが1月に1度くらい設定消滅。こんなシステムのお守りはもう嫌だ!(>_<) LAN内って条件をomitしてSlackの導入を検討中です。Hubotはadapter換えるだけでいいし。
2014年11月10日月曜日
オナ禁102日目
8月1日から始めたオナニー禁止令が、今日で102日目を迎えた。
本当は100日目のキリ番で書き込みをしようとおもっていたが、すっ飛ばしてしまった。すっ飛ばしてしまうほどに、もはやオナ禁は日常と化してしまった。
生産性は非常に高い。ただ、最近気持ちが落ち込む出来事が立て続いたため、気分はそれと相殺してしまっているが。生産性自体は非常に高いのだ。むしろ意識が高すぎて、時々、意図的にクールダウンを挟まないといけない。この45歳の身体がもたない。
体重は78 kgを切った。これはオナ禁効果か、禁fb効果かは、わからないが。意欲的に働いているので、脳が非常にカロリーを消費しているのだろうとおもう。2ヶ月前の体重は85 kg強であった。ちなみに結婚当初2006年の体重記録が出てきて、何と89.6 kgであった。12 kg重かった自分というのが、今となっては想像できない。
もっとも、2001年にカンボジアへ来た時の僕は70 kgぐらいしかなくて痩せていた。カンボジアが僕を太らせたのである。ならばこの贅肉はカンボジアへお返しせねばなるまい。
意欲的に働けるためにもう一つ気をつけていることは、例によって水野あおいの標語
「眠くなったらすぐ寝よう」
である。皆さん笑うが、これは本当に人生において最も大切な標語であると最近になってようやくわかってきた。
ある研究によると、睡眠時間6時間の後の知的生産性は、酒を2~3杯呑んだ後の知的生産性と同じだったそうだ。
すなわち、6時間しか寝ないで仕事に来るヤツというのは、酒を2~3杯呑んで出勤してくる不埒なヤツとまったく同程度に、仕事に対して不真面目であるということだ。
40過ぎたら人間は健康に気を遣わねばならない。このことは40過ぎないと本当にはわからない。30代の頃の自分や、今30代の皆さんへ声を大にしてお伝えしたいが、どうせ聞きやしないだろう。これは体操やスポーツをやれば良いというだけのことではないからだ。
本当は100日目のキリ番で書き込みをしようとおもっていたが、すっ飛ばしてしまった。すっ飛ばしてしまうほどに、もはやオナ禁は日常と化してしまった。
生産性は非常に高い。ただ、最近気持ちが落ち込む出来事が立て続いたため、気分はそれと相殺してしまっているが。生産性自体は非常に高いのだ。むしろ意識が高すぎて、時々、意図的にクールダウンを挟まないといけない。この45歳の身体がもたない。
体重は78 kgを切った。これはオナ禁効果か、禁fb効果かは、わからないが。意欲的に働いているので、脳が非常にカロリーを消費しているのだろうとおもう。2ヶ月前の体重は85 kg強であった。ちなみに結婚当初2006年の体重記録が出てきて、何と89.6 kgであった。12 kg重かった自分というのが、今となっては想像できない。
もっとも、2001年にカンボジアへ来た時の僕は70 kgぐらいしかなくて痩せていた。カンボジアが僕を太らせたのである。ならばこの贅肉はカンボジアへお返しせねばなるまい。
意欲的に働けるためにもう一つ気をつけていることは、例によって水野あおいの標語
「眠くなったらすぐ寝よう」
である。皆さん笑うが、これは本当に人生において最も大切な標語であると最近になってようやくわかってきた。
ある研究によると、睡眠時間6時間の後の知的生産性は、酒を2~3杯呑んだ後の知的生産性と同じだったそうだ。
すなわち、6時間しか寝ないで仕事に来るヤツというのは、酒を2~3杯呑んで出勤してくる不埒なヤツとまったく同程度に、仕事に対して不真面目であるということだ。
40過ぎたら人間は健康に気を遣わねばならない。このことは40過ぎないと本当にはわからない。30代の頃の自分や、今30代の皆さんへ声を大にしてお伝えしたいが、どうせ聞きやしないだろう。これは体操やスポーツをやれば良いというだけのことではないからだ。
InDesignスクリプトで配列要素オブジェクトを扱う際のハマり所
以下のInDesign CS3スクリプトのコード素片は、ものすごく間違いである。
どこが間違いか、ちゃんとわかってる方なら一瞬でわかるだろう。
一瞬でわからない方は、1分考えてみて、答えを読んでほしい。
...
var oRect = oPage.rectangles[iRect];
var oRect2 = oPage.rectangles.add();
oRect2.geometricBounds = [oRect.geometricBounds[0], 215, oRect.geometricBounds[2], oRect.geometricBounds[3] + 215 - oRect.geometricBounds[1]];
答えは…
配列要素を代入したこのoRectは、値ではなく、参照である。
従って、.add()した時点で、oRectは、当初とは異なるオブジェクトを指し示している可能性がある。
僕はここで20分ハマった。
今脱出したところだ。
これがJavaScriptの性質なのか、それともInDesign CS3のExtendScriptの性質なのか、ナンチャッテプログラマーの僕にはわかりましぇ~ん。
どこが間違いか、ちゃんとわかってる方なら一瞬でわかるだろう。
一瞬でわからない方は、1分考えてみて、答えを読んでほしい。
...
var oRect = oPage.rectangles[iRect];
var oRect2 = oPage.rectangles.add();
oRect2.geometricBounds = [oRect.geometricBounds[0], 215, oRect.geometricBounds[2], oRect.geometricBounds[3] + 215 - oRect.geometricBounds[1]];
答えは…
配列要素を代入したこのoRectは、値ではなく、参照である。
従って、.add()した時点で、oRectは、当初とは異なるオブジェクトを指し示している可能性がある。
僕はここで20分ハマった。
今脱出したところだ。
これがJavaScriptの性質なのか、それともInDesign CS3のExtendScriptの性質なのか、ナンチャッテプログラマーの僕にはわかりましぇ~ん。
絵文字の人種差別問題、Unicodeに肌色濃度修飾子導入へ
絵文字の人間は白い人ばかり…高まる批判を受け、Unicodeに、肌色濃度を指定する修飾子が導入される見通し。
各社これを支持しており、さまざまな環境への実装はかなり早く進むと見られる。
各修飾子に対して具体的にどのようなレンダリングを行うかは実装系に委ねられており、今後はその実装の色味や独自性へと話題の焦点は移っていくと思われる。
2014年11月7日金曜日
InDesignスクリプトで選択セル群を扱う際の注意
今日は、InDesign CS3で選択表列群のすべてのセルのすべての段落がセルに収まりかつセル先頭段落が1行になるよう長体をかける汎用スクリプトとか、列幅を広げる汎用スクリプトとかを作った。
もちろん純粋に趣味で作るプログラムなど意味はない。明日からの案件で使うのだ。それこそが僕の趣味である。
注意すべき点として、InDesign文書で複数のセルを選択している時、app.selection.length = 1となる。セル個数ではない。
そしてそのセルが属する表列がほしい時、oCell.parentColumnを直接取ると、それのindexプロパティとかconstructorを得ようとするとなぜかオブジェクトエラーとなることが多い。選択範囲由来のセルオブジェクトないし表列オブジェクトはちょっと何かが不完全らしい。セルのindexは選択範囲内で何番目という値が返されてくる。
セルIDは正しく取れたので、以下のように、上から目線でこのセルでしょというやり方(該当部分抜粋)でうまくいったが、もっとやりようないんですかねこれ…。
// 選択されている各セルについて
var oCells = oSelection.cells;
var nCell = oCells.length;
var iColumnBefore = -1;
for (var iCell = 0; iCell < nCell; iCell++){
var oCell = oCells.item(iCell);
var qCell = oCell.id;
var oTable = oCell.parent.parent;
var oCellTables = oTable.cells;
var nCellTable = oCellTables.length;
for (var iCellTable = 0; iCellTable < nCellTable; iCellTable++){
var oCellTable = oCellTables.item(iCellTable);
var qCellTable = oCellTable.id;
if (qCellTable == qCell){
var oColumn = oCellTable.parentColumn;
var iColumn = oColumn.index;
if (iColumnBefore != iColumn){
// 表列のすべてのセルのすべての段落がセルに収まり
// かつセル先頭段落が1行になるよう長体をかける
shrinkInCellsColumn(oColumn);
iColumnBefore = iColumn;
}
break;
}
}
}
もちろん純粋に趣味で作るプログラムなど意味はない。明日からの案件で使うのだ。それこそが僕の趣味である。
注意すべき点として、InDesign文書で複数のセルを選択している時、app.selection.length = 1となる。セル個数ではない。
そしてそのセルが属する表列がほしい時、oCell.parentColumnを直接取ると、それのindexプロパティとかconstructorを得ようとするとなぜかオブジェクトエラーとなることが多い。選択範囲由来のセルオブジェクトないし表列オブジェクトはちょっと何かが不完全らしい。セルのindexは選択範囲内で何番目という値が返されてくる。
セルIDは正しく取れたので、以下のように、上から目線でこのセルでしょというやり方(該当部分抜粋)でうまくいったが、もっとやりようないんですかねこれ…。
// 選択されている各セルについて
var oCells = oSelection.cells;
var nCell = oCells.length;
var iColumnBefore = -1;
for (var iCell = 0; iCell < nCell; iCell++){
var oCell = oCells.item(iCell);
var qCell = oCell.id;
var oTable = oCell.parent.parent;
var oCellTables = oTable.cells;
var nCellTable = oCellTables.length;
for (var iCellTable = 0; iCellTable < nCellTable; iCellTable++){
var oCellTable = oCellTables.item(iCellTable);
var qCellTable = oCellTable.id;
if (qCellTable == qCell){
var oColumn = oCellTable.parentColumn;
var iColumn = oColumn.index;
if (iColumnBefore != iColumn){
// 表列のすべてのセルのすべての段落がセルに収まり
// かつセル先頭段落が1行になるよう長体をかける
shrinkInCellsColumn(oColumn);
iColumnBefore = iColumn;
}
break;
}
}
}
2014年11月4日火曜日
Hubotでコマンドの引数を省略可とする場合の注意
module.exports = (robot) ->
# コマンド受け付け
# 引数1: サブコマンド
# 引数2: 非負整数
# 引数3: 非負整数または非負小数
robot.respond /([a-zA-Z]+) ([a-zA-Z_]+) ([0-9]+) ([0-9\.]+)/i, (msg) ->
cmd = msg.match[1]
type = msg.match[2]
qty = msg.match[3]
avept = msg.match[4]
switch cmd.toLowerCase()
# 作業種別指定・点数指定・平均pt指定の引き合い
when 'inq'
# 引き合い(今発注、今入稿)に対する最早予想納品時刻を算出
typeRedmine = typeHubot2Redmine type
etd = calcEtd typeRedmine, qty * avept, new Date()
typeJa = typeHubot2Ja type
msg.send "#{String.fromCharCode(0x16)}#{typeJa}#{qty}点(平均#{avept}pt)を今発注、今入稿していただくと最早予想納品時刻は#{etd}です。" # 反転表示
のようなコマンドをHubotで実装した。
たとえば
cdr inq cut 100 1.5
とIRCで打つと、この.coffee内のサブルーチンで実装された生産スケジューラが計算を行い、最早予想納品時刻を回答するというしくみだ。なお、cdrはこれまでにも出ている我らがHubotの名前である。またcutは「切り抜き」という当社のひとつの作業種別を指す。
このとき、最後の引数の+を*に変えても、その引数は省略可能とはならないことに注意が必要だとおもった。すなわちmsg.matchに対する*はあまり意味がない。引数を省略可としたければ、もうひとつrobot.respondを書く必要がある。
※なお、上のスクリプト中、typeHubot2RedmineはIRCで打たれた作業種別文字列をRedmine用に正規化するサブルーチン、typeHubot2Jaは同じく日本語への変換ルーチンである。calcEtdは生産スケジューラが最早予想納品時刻を回答するサブルーチンであり、その最終引数に予約入稿日時を指定することができるようになっている。スクリプトは今入稿の場合である。
# コマンド受け付け
# 引数1: サブコマンド
# 引数2: 非負整数
# 引数3: 非負整数または非負小数
robot.respond /([a-zA-Z]+) ([a-zA-Z_]+) ([0-9]+) ([0-9\.]+)/i, (msg) ->
cmd = msg.match[1]
type = msg.match[2]
qty = msg.match[3]
avept = msg.match[4]
switch cmd.toLowerCase()
# 作業種別指定・点数指定・平均pt指定の引き合い
when 'inq'
# 引き合い(今発注、今入稿)に対する最早予想納品時刻を算出
typeRedmine = typeHubot2Redmine type
etd = calcEtd typeRedmine, qty * avept, new Date()
typeJa = typeHubot2Ja type
msg.send "#{String.fromCharCode(0x16)}#{typeJa}#{qty}点(平均#{avept}pt)を今発注、今入稿していただくと最早予想納品時刻は#{etd}です。" # 反転表示
のようなコマンドをHubotで実装した。
たとえば
cdr inq cut 100 1.5
とIRCで打つと、この.coffee内のサブルーチンで実装された生産スケジューラが計算を行い、最早予想納品時刻を回答するというしくみだ。なお、cdrはこれまでにも出ている我らがHubotの名前である。またcutは「切り抜き」という当社のひとつの作業種別を指す。
このとき、最後の引数の+を*に変えても、その引数は省略可能とはならないことに注意が必要だとおもった。すなわちmsg.matchに対する*はあまり意味がない。引数を省略可としたければ、もうひとつrobot.respondを書く必要がある。
※なお、上のスクリプト中、typeHubot2RedmineはIRCで打たれた作業種別文字列をRedmine用に正規化するサブルーチン、typeHubot2Jaは同じく日本語への変換ルーチンである。calcEtdは生産スケジューラが最早予想納品時刻を回答するサブルーチンであり、その最終引数に予約入稿日時を指定することができるようになっている。スクリプトは今入稿の場合である。
登録:
投稿 (Atom)