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代の皆さんへ声を大にしてお伝えしたいが、どうせ聞きやしないだろう。これは体操やスポーツをやれば良いというだけのことではないからだ。

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の性質なのか、ナンチャッテプログラマーの僕にはわかりましぇ~ん。

絵文字の人種差別問題、Unicodeに肌色濃度修飾子導入へ

絵文字の人間は白い人ばかり…高まる批判を受け、Unicodeに、肌色濃度を指定する修飾子が導入される見通し。

各社これを支持しており、さまざまな環境への実装はかなり早く進むと見られる。

各修飾子に対して具体的にどのようなレンダリングを行うかは実装系に委ねられており、今後はその実装の色味や独自性へと話題の焦点は移っていくと思われる。

http://www.unicode.org/reports/tr51/#Diversity

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;
      }
    }
  }

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は生産スケジューラが最早予想納品時刻を回答するサブルーチンであり、その最終引数に予約入稿日時を指定することができるようになっている。スクリプトは今入稿の場合である。

2014年11月3日月曜日

Moore and Hodgson Algorithmって、これ実装してますとはなかなか公言しづらいよね

少数のお客様に多大な納期遅れを集中させることにより大多数のお客様を納期遅れにしない手法。

各種のジョブ順序決定法の比較と演習
http://www.oit.ac.jp/dim/~honiden/Exercise/Scheduling/Sch_3.pdf
http://www.mi.s.osakafu-u.ac.jp/~hojo/lecture/jugyo7.pdf
http://www.mi.s.osakafu-u.ac.jp/~hojo/lecture/jugyo8-ans.pdf

ちなみに、より多くのお客様に納期遅れを薄く広げるのは、このサンプルによれば単純EDD法。

貴女はどちらを選びますか?

(もちろん、納期遅れを発生させないマネジメントをするべきですが)

Which method should 
I implement in our system?

生産計画法について勉強中…

誰もが必要とすることなのに、意外と、決め手となる理論や解法はなく、みんな苦労してるんだなぁ、というのが率直な感想。
自社ではどうする、も含めてメモってみた。

○APS=Advanced Planning and Scheduling(事実上、生産スケジューラのマーケティング用語)

http://monoist.atmarkit.co.jp/mn/articles/0901/23/news132_2.html
オーダーが出発点(インプット)だからプル生産向き
cf. MRPは材料供給と同期して製造指示をリリースする考え方が根底にあるから、プル型の製造工程コントロールとは折り合いが悪い

○生産座席予約

http://www2.odn.ne.jp/scheduling/SCM/Onepoin6.html#label00004
ラフカット能力計画に基づく将来の生産能力(capaticy)を、各時刻に対して、いくつかの基本モデルベースについて「この基本モデルベースからできる最終製品をご発注の場合には何個できる」という数量換算(時間でなく)の形で社外に開示し、それに対して「予約」という法的にあいまい(日本的)なアポを受け付ける。その予約をもとに最終製品品目を確定させ生産計画をアウトプットする。
cf. MRP IIのATP(Available to Promise)では逆に、最終製品生産計画をもとに、引き合いに対し数量・納期回答する。生産能力を社外に開示しない。

○作業負荷のフォワード展開

http://ci.nii.ac.jp/els/110003423442.pdf?id=ART0003956455&type=pdf&lang=jp&host=cinii&order_no=&ppv_type=0&lang_sw=&no=1414977177&cp=
時刻0(現在)から始まる各時点について順に、最遅開始時刻(工程が1つしかない仕事の場合には、納期から所要時間を引いた時刻=最小slack法だろう)が最も早い作業を優先して割り当てるようスケジュールしていく。(PERT山崩し法=PERT/Manpower)
ある時点において、もし割り当てることができる作業がなければ、1つ後の時刻について同様の操作を繰り返す。
cf. 納期が最も早い作業を優先するD.DATE法

○作業負荷のバックワード展開

フォワード展開の逆のアルゴリズムで良いのだろう:
工程が1つしかない仕事の場合:
すべての仕事の納期のうち最も遅い納期時刻tmaxから遡る各時点について順に、納期が最も遅い仕事を優先して割り当てていく。
ある時点において、もし割り当てることができる作業がなければ、1つ前の時刻について同様の操作を繰り返す。
結果、いずれかの仕事の開始時刻がその入稿時刻か現在より前と算出された場合、その仕事はこのままでは納期に間に合わないことを意味する。

○納期回答法

既存のすべての仕事をバックワード展開で割り当てたのち、問い合わせの仕事をフォワード展開でそこへ追加割り当てし、その算出された終了時刻を回答納期とする。