2007-05-31

PEP8 Version 53621 和訳

PEP8 を和訳した。われながら放置しすぎ。Version 53621 は、実は最新版ではない。しかも一箇所訳せないところがあるという、どうしようもない状態。



2007-05-30

書店くじに外れる

書店くじに外れる。ちょっと前に、本屋さんで買い物をしたときに「書店くじ」なるものをもらった。大当たりはギリシア旅行で、その後は図書カードとかが続く。ターゲットが非常に明確だ。最近はアマゾンばっかりで、久しく本屋さんで買い物をしていない。



2007-05-29

命名とは大変な作業らしい

職場の人が命名に苦労している。条件は



(1) 姓名判断でダメな結果が出ない
(2) ヨーロッパ言語(とくに英語)圏で発音しやすい
(3) 外国語で嫌な意味にならない



の3つ。姓名判断は流派によって、画数の数え方や計算の仕方が異なるらしく、そういうことも気にするらしい。で、Excel シートで計算するマクロを書いたそうだ。すげーな、おい。出てきた候補の中から、(2) と (3) の条件で絞るらしい。



曰く、予想以上に命名は大変な作業である。こういうのウェブサービスになって、しかも集合知で (2) とか (3) のルールが蓄積したらいいのになぁ、と嬉しそうに言っていた。



2007-05-23

英語で電話会議する

英語で電話会議なるものをした。1対1だったけれど、自分の英語力が恐ろしく低いことを痛感させられた。まともに言えたのは「イエース、イエース」くらい。ノーとは言えなかった。



2007-05-22

斎藤美奈子 / 趣味は読書。

[『やがて僕のボクサーショーツを下におろし、石のように硬くなったペニ(ry)』を引用して] そうそう、頼まれもしないのに、こんなこともやってくれちゃうんだよな、春樹文学のお姉さまたちは。(p.253)

頼まれなくても、してくれるっていう文脈なんじゃないのか、と思ってそのシーンだけ立ち読みしてみた。確かに頼みもせずに、こういう展開にならなさそうな文脈だった。




趣味は読書。



2007-05-17

ファミマ!! 芝パーク店オープン

職場近くにファミマ!!が開店しました。環境に合わせて店舗デザインや品揃えを自由に変えていく、というファミリーマートの別ブランドだそうで。衝動的に紅茶とカップを買ってしまいました。



ちなみにこの店はオフィスビル内にあって、恵比寿ガーデンプレイスみたいなおしゃれな立地ではありません。最大の特徴は、おそらく昼休み時に、レジが5台か6台くらい稼動することではないかと。しかも、店員さんのレベルが非常に高い印象があります。さて、道路を挟んだローソンや、近所のお弁当屋さんの商売にどのくらい影響があるのか気になります。観察観察。



2007-05-16

便益は何か? に答えるべし

Two Questions: Why does it matter? What's your contribution? によると、「プレゼンテーションの内容がなぜ問題となるのか、を伝えられない人が多いが、これこそ聴衆が知りたいことなのだ。」だそうです。



matter をうまく訳せていませんが、要は便益はなにか、ということかと。営業でもマーケティングでも、場合によっては技術サポートであっても、何かを提案するときには相手にとっての便益を伝えないといけません。が、これが難しいんですよねぇ。つい「従来より50%高速」とか言ってしまいます。



日本では、ほとんどの場合、プレゼンテーションの聴衆は、最後までお行儀良く聞いてくれます。そして、さんざん気持ちよく話した後、「質問がまったく出てこない」という形で、聴衆が興味を持たなかったことに気づくわけです。



久々にやってしまいました。つらかったです。おそらくは、聞いているほうも。



2007-05-13

PLAYSTATION3 の出力映像が見えない

まったくもって衝動的に PLAYSTATION3 を買いました。Virtua Fighter 5 という格闘ゲームのキャラのアイリーンに萌え萌えゆえ。うきうきして帰宅したのですが、所有しているモニタには何も映らず。がーん。



2007-05-05

横山ノック フック その他

横山ノック氏が亡くなったそうで、ご冥福をお祈りします。ところで、ノックはどうでもよくて、パンチです。私が尊敬して止まない上岡龍太郎は、横山ノックと横山フックと共に、横山パンチとして、漫才トリオをやっていました。って、そんなのリアルタイムでぜんぜん見ていないんですが。



で、横山ノックの報道を見て、あー上岡龍太郎どうしてるんだろう、パペポ懐かしいなぁ、などと連想して、Wikipedia や Googleの検索結果を漁っているうちに深夜ですよ。初めて2ちゃんねるを見たときくらいの、ネット漂流です。



ところで、ビリーズブートキャンプのセットを購入しました。筋肉痛です。



2007-05-01

Greasemonkey で、object 要素を経由して外部 HTML 文書を取得する

Greasemonkey づいている連休です。サーバからデータ受信して処理したいのですが、GM_xmlhttpRequest だと 5KB くらいしか取得できないっぽいです。しかもサーバが Range ヘッダを無視してくれるという状況です。



検索したのですが見つからなかった(ちゃんと調べてない奴ほど、こういうことを言う)ので、強引なスクリプトを書いてみました。



  1. データを取得する側の文書を receiver、取得される HTML 文書を sender とします。


  2. receiver 上のスクリプトが  GM_setValue('req',true) に指定する


  3. receiver に object 要素を埋め込み、sender の URL を表示させる。


  4. sender 上のスクリプトは GM_setValue('req',false) であることを確認したら、req を false にして、文書の一部を GM_setValue('buffer', ...) する


  5. receiver 上のスクリプトが req が false になっていることを確認したら、GM_getValue('buffer') する


  6. 2~5 を繰り返す。


以下がサンプル。httpget と httpsend がコアの関数です。Unicode のエスケープには、sawatの日記 - Unicodeエスケープ を使っています。長くてすみません。もっと、いいやり方ないかなぁ。



// ==UserScript==
// @name           voexample
// @namespace      http://localhost/
// @description    Emulating HTTP GET via object element
// @include        http://example.com/receiver.htm
// @include        http://example.com/sender.htm
// ==/UserScript==

(function (){

  var receiverurl = 'http://example.com/receiver.htm';
  var senderurl = 'http://example.com/sender.htm';

  function httpget(url, callback) {
    function receive(callback) {
      var data = "";
      
      function closure () {
        function unescapeUnicode(str) {
          return str.replace(/\\u([a-fA-F0-9]{4})/g, function(m0, m1) {
            return String.fromCharCode(parseInt(m1, 16));
          });
        }
       
        if (GM_getValue('req')==false) {
          var part = GM_getValue('buffer');
          if (part==false) {
            document.body.removeChild(document.getElementById('__externaldoc'));
            callback(unescapeUnicode(data));
          } else {
            data += part;
            GM_setValue('req', true);
            startClosure();
          }
        } else {
          startClosure();
        }
      }
      
      function startClosure(ms) {
        setTimeout(closure, ms ? ms : 10);
      }
      
      startClosure(0);
    }
   
    function loadDocumentInObject(url) {
      var o = document.createElement('object');
      o.setAttribute('id', '__externaldoc');
      o.data = url;
      document.body.appendChild(o);
    }
   
    GM_setValue('req', true);
    loadDocumentInObject(senderurl);
    receive(callback);
  }

  function httpsend() {
    function escapeUnicode(str) {
      return str.replace(/[^ -~]|\\/g, function(m0) {
        var code = m0.charCodeAt(0);
        return '\\u' + ((code < 0x10)? '000' :
                        (code < 0x100)? '00' :
                        (code < 0x1000)? '0' : '') + code.toString(16);
      });
    }
   
    var i = 0;
    var data = escapeUnicode(document.body.innerHTML);
    var step = 4098;
    var closure = function() {
      if (GM_getValue('rew')==false) {
        setTimeout(closure, 10);
      } else {
        if (i<data.length) {
          GM_setValue('buffer', data.substring(i, i+step));
          GM_setValue('req', false);
          i += step;
          setTimeout(closure, 10);
        } else {
          GM_setValue('buffer', false);
          GM_setValue('req', false);
        }
      }
    }
    setTimeout(closure, 10);
  }
 
  function callback(text) {
    var div = document.createElement('div');
    div.innerHTML = text.toUpperCase();
    document.body.appendChild(div);
  }
 
  if (document.location == receiverurl) {
    httpget(senderurl, callback);
  } else if (document.location == senderurl) {
    httpsend();
  }
 
})();