| 次のページ >>

Javascript: オブジェクトからコンストラクタ名(クラス名)を得る

obj.constructor.name で取れますが MDC では nameプロパティは「非標準」とされています。 ちょっと試してみたところ Firefox、Google Chrome では同じように動きます。

function Foo(){}

function puts(x){ document.write( x + "\n" ); }

puts("<pre>");

var x = new Foo();

puts( typeof x.constructor  ); //=> "function"
puts( x.constructor         ); //=> "function Foo() {\n}"
puts( x.constructor == Foo  ); //=> true
puts( x.constructor === Foo ); //=> true

puts( "----" );

puts( typeof x.constructor.name   ); //=> "string"
puts( x.constructor.name          ); //=> "Foo"

puts( "----" );

puts( ("a").constructor.name          ); //=> "String"
puts( (1).constructor.name            ); //=> "Number"
puts( (Infinity).constructor.name     ); //=> "Number"
puts( ({}).constructor.name           ); //=> "Object"
puts( ([]).constructor.name           ); //=> "Array"
puts( (function(){}).constructor.name ); //=> "Function"
puts( (true).constructor.name         ); //=> "Boolean"
//puts( (null).constructor.name       ); //=> null has no properties
//puts( (undefined).constructor.name  ); //=> undefined has no properties

puts("</pre>");

その場でスクリーンショットを撮って挿入するマクロ(OpenOffice.org writer)

howm の ImageCapture を見ていて OpenOffice.org writer でもできるんじゃない? と思いつき、やってみたところなかなか便利そうでした。

直接呼び出すのは scrotScreen や importWindowOrRectangle といったプロシージャで、 これをツールバーに登録したりショートカットキーを割り当てて使うのがおすすめです。

OpenOffice.org Basic です。気が向いたら修正するかもしれません。

Linux では import を使えばできるだろう……と思っていたのですが、 一部のウィンドウが真っ黒になってしまう問題があったので scrot (Ubuntu の場合は apt でインストール可)も使えるようにしてみました。 ただし、scrot の場合は「選択したウィンドウ」ないし 「現在アクティブなウィンドウ」は取り込めないようです。

Windows の場合 WinShot または boxcutter が別途必要です。 ただし、boxcutter の場合は 「選択したウィンドウ」ないし 「現在アクティブなウィンドウ」は取り込めないようです。

個別のウィンドウのスクリーンショットは Alt + Print Screen でクリップボードにコピーして貼ればいいので特に問題ない気もしますが。

rem The MIT License
rem 
rem Copyright (c) 2010 sonota <yosiot8753@gmail.com>
rem 
rem Permission is hereby granted, free of charge, to any person obtaining a copy
rem of this software and associated documentation files (the "Software"), to deal
rem in the Software without restriction, including without limitation the rights
rem to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
rem copies of the Software, and to permit persons to whom the Software is
rem furnished to do so, subject to the following conditions:
rem 
rem The above copyright notice and this permission notice shall be included in
rem all copies or substantial portions of the Software.
rem 
rem THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
rem IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
rem FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
rem AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
rem LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
rem OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
rem THE SOFTWARE.


rem ----------------------------------------------------------------------
rem for scrot (Linux)

sub scrotScreen
  scrotCommon("")
end sub

sub scrotRectangle
  scrotCommon(" -s ")
end sub


rem ----------------------------------------------------------------------
rem for ImageMagick import (Linux)

rem 取り込みたいウィンドウをクリック、またはドラッグで矩形選択
sub importWindowOrRectangle
  importCommon(" -frame ")
end sub

sub importScreen
  importCommon(" -window root ")
end sub


rem ----------------------------------------------------------------------
rem for WinShot (Windows)

sub winshotRectangle
  winshotCommon(" -Bitmap -Rectangle -Close -File ")
end sub

sub winshotWindow
  winshotCommon(" -Bitmap -ActiveWindow -Close -File ")
end sub

sub winshotScreen
  winshotCommon(" -Bitmap -Desktop -Close -File ")
end sub


rem ----------------------------------------------------------------------
rem for boxcutter (Windows)

sub boxcutterRectangle
  boxcutterCommon("")
end sub

sub boxcutterScreen
  boxcutterCommon(" --fullscreen ")
end sub


rem ----------------------------------------------------------------------
rem コマンドのパスの設定 / set command path

sub scrotCommon(options as String)
  imageCapture("/usr/bin/scrot", options, "SHELL")
end sub

sub importCommon(options as String)
  imageCapture("/usr/bin/import", options, "SHELL")
end sub

sub winshotCommon(options as String)
  imageCapture("C:\xxx\winshot153a\WinShot.exe", options, "UNO_SYSTEM_SHELL_EXECUTE")
end sub

sub boxcutterCommon(options as String)
  imageCapture("C:\xxx\boxcutter.exe", options, "SHELL")
end sub


rem ----------------------------------------------------------------------


sub imageCapture(commandPath as String, options as String, wayOfExec as String)
  dim document   as Object
  dim dispatcher as Object
  dim tempImagePath as String
  dim platform as String
  dim waitMSec as Integer

  rem ----------------------------------------------------------------------
  rem 設定 / settings

  platform = "LINUX"
  rem platform = "WINDOWS"

  waitMSec = 5000

  rem ----------------------------------------------------------------------

  document   = ThisComponent.CurrentController.Frame
  dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

  select case platform
  case "LINUX":
    tempImagePath = "/tmp/image-capture-temp.png"
  case "WINDOWS":
    tempImagePath = Environ("TEMP") + "\image-capture-temp.png"
  end select

  rem ----------------------------------------------------------------------

  wait waitMSec

  beep
  wait 100

  select case wayOfExec
  case "SHELL"
    shell( convertToUrl(commandPath), 0, options + " " + tempImagePath, True) 
  case "UNO_SYSTEM_SHELL_EXECUTE"
    Dim oSvc as object
    oSvc = createUnoService("com.sun.star.system.SystemShellExecute")
    oSvc.execute( ConvertToUrl(commandPath), options + " " + tempImagePath, 0 )

    wait 1000
    rem スクリーンショット取得まで待つ代わりに
    msgbox("スクリーンショット取得後に押してください。") rem "Click after shoot"
  case else
    msgbox("コマンド実行方法の指定に誤りがあります。") rem "wayOfExec unknown"
    exit sub
  end select

  insertImage(tempImagePath)

  dispatcher.executeDispatch(document, ".uno:Escape", "", 0, Array())
  dispatcher.executeDispatch(document, ".uno:GoRight", "", 0, Array())
  dispatcher.executeDispatch(document, ".uno:InsertPara", "", 0, Array())

  rem ----------------------------------------------------------------------
  rem modify anchor

  dim oDoc as object
  oDoc = ThisComponent 
  oDrawPage = oDoc.DrawPage
  oDrawPageObj = oDrawPage.getByIndex(oDrawPage.Count - 1)
  oDrawPageObj.AnchorType = 1 rem 1: as char

  kill(tempImagePath)
end sub


sub insertImage(tempImagePath as string)
  dim document   as object
  dim dispatcher as object

  rem ----------------------------------------------------------------------

  document   = ThisComponent.CurrentController.Frame
  dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

  rem ----------------------------------------------------------------------

  dim args1(3) as new com.sun.star.beans.PropertyValue
  args1(0).Name = "FileName"
  args1(0).Value = converttourl(tempImagePath)
  args1(1).Name = "FilterName"
  args1(1).Value = "<すべての書式>"
  args1(2).Name = "AsLink"
  args1(2).Value = false
  args1(3).Name = "Style"
  args1(3).Value = "図"

  dispatcher.executeDispatch(document, ".uno:InsertGraphic", "", 0, args1())
end sub

dvd::rip 手順・設定メモ

毎回忘れるので定形的な使い方とオレオレ設定をチェックリスト的にメモ。 後で適当に加筆・修正するかも。

環境

Ubuntu Linux 9.04

大まかな流れ

* プロジェクト作成
* リッピング
* 変換設定
* 変換

プロジェクト

特に分かりにくい箇所はないので詳細は略。
保存しておけば、設定などそのままで作業を再会できる。
たとえば、今日リッピングだけやって保存・終了し
次の日にファイル変換するとか。

リッピング / RIP Title

Specify chapter mode:
  None:      全部ひとまとめ。連結される。
  All:       chapterごと。連結されない。
  Selection: 選択したものだけをchapterごと。連結されない。

Storageタブの「Choose a ripping mode」で「Encode DVD on the fly」
を選ぶと一発で AVI に変換までできそうだけどまだ使ったことがない。

変換設定

Clip & Zoom

特定のデバイス向けにサイズ変換せず
もっぱら PC で見るといった場合は
Adjust clip and zoom parameters > Presets で
「- No Modifications (anamorph) -」
を選択。

Transcode

とりあえずコンテナ=AVI、ビデオコーデック=xvid4 の組み合わせなら大丈夫。
divx とかだと(自分の環境では)うまく動かない。

2-pass encoding:
  Yes
  Reuse log にチェック入れる

Deinterlace mode:
  Smart deinterlacing(これが推奨らしい)

Video bitrate calculation > By quality:
  0.05:   悪い。ブロックノイズが目立つ。
  0.10:   普通はこれで良い?
          そんなに大事なものでなければこれで十分。
  0.20:   良い。そこそこ大事なものはこれで。
  0.30〜: きれい。こんなに必要ない?

  ウィンドウ下部の「Total size」なども参考にしつつ。

Audio options > MP3
  128 kbps, 44100 Hz
  音が大事なら 160 kbps とかで

Operate:
  「View」は変換後のファイルを再生する。
  リアルタイム・その場でチェックできる訳ではない。
  変換の最中にチェックしたい場合は VLC などで。

  Split files on transcoding:
    できあがったファイルを(700MBなど)ディスクに合わせて分割する。
    「By target size」で指定した大きさ?

General options > Frame range:
  変換対象のフレーム。
  目安として 30 fps なら
    300:   10秒
    900:   30秒
    1800:  1分
    3600:  2分
    9000:  5分
  全体を変換する前に一部を変換 → Operate > View で確認 → 設定を修正
  ……というようにできるといいのだろうけど、
  transcode の最後あたりでやけに時間を食うので
  実際は適当なタイミングで中止ボタンを押して止めたりしている。

2010-01: ERMasterのインストール

ERMaster が便利そうなので使いたいと思ったのですが、Eclipse を普段使わない自分には インストールの仕方などが分かりにくかったのでメモ。

とにかく使ってみたい、触って試してみたい、という人向け。

Linux版を使っていますが、Windows版でもほぼ同じだと思います。

環境など

Ubuntu Linux 9.04
Eclipse IDE for Java Developers(Build id: 20090920-1017)
ERMaster 1.0.0.v201001092341

手順

Eclipse Downloads の 「Eclipse IDE for Java Developers (92 MB)」 から eclipse-java-galileo-SR1-linux-gtk.tar.gz をダウンロードして解凍。
自分のやり方が悪かったのかもしれないが、Java EE では ERMaster を使えなかった。


ダウンロード - ERMaster - SourceForge.JP から org.insightech.er_1.0.0.v201001092341.jar (最新版)をダウンロードし、 Eclipse を解凍してできたフォルダの中にある plugins フォルダにそのまま入れる。


Eclipse を起動。


workspace をどこにするか聞かれるので、適当に入力するかそのまま「OK」押す。


「Welcome」というタブが開いた状態で起動するが、このタブは閉じていい。


メニューから File > New > Project...


General > Project を選択して「Next」で次へ。


プロジェクト名を適当に入力して「Finish」でプロジェクト作成完了。


メニューから File > New > Other...


一覧から「ERMaster」を選んで「Next」で次へ。


ファイル名を指定して「Next」で次へ。


データベースの種類を選択。お試しなので何でも良かったのですが、 とりあえず MySQL を選択して「Finish」で新規作成完了。


ここまでの手順でこの画面が表示され、編集できる状態になります。
ermaster-new-4

JsUnit: テスト実行とエラーメッセージ表示をキーボード操作で行う

JsUnit を使う場合、 エディタでコード書く→ブラウザでテストという一連の操作の途中で どうしてもマウス操作が必要になる場面があり、とてもだるいのでどうにかしたい。


自分が使う場合、操作の 9割は (1)テストの実行 (2)エラーメッセージの表示。 の 2つ。その他の操作はたまにしか行わないので、マウス操作でも構わない。


jsunit/app/main-data.html の 以下の行をコメントアウト。

giveFocusToTestFileNameField();

同じく jsunit/app/main-data.html の body 要素の最後に以下を追加。

新たに生成して画面左上に配置した input 要素 keyCapture でキー入力を拾い、 r, a キーでそれぞれテスト実行、エラーメッセージの表示(Show all)を行うようにした。 keyCapture からフォーカスが外れた場合はマウスでフォーカスを戻すかページをリロードする。

<script type="text/javascript">
(function(){
  var keyCapture = document.createElement("input");
  
  (function(rules){
    for(var key in rules){
      keyCapture.style[key] = rules[key];
    }
  })({
    border: "solid 1px red"
  , width: "20px"
  , height: "20px"
  , position: "absolute"
  , left: "10px"
  , top: "10px"
  });
  
  document.getElementsByTagName("body")[0].appendChild(keyCapture);
  keyCapture.focus();
  
  var operateByKeyInput = function(event){
    switch(event.keyCode){
      case 65: // a
        top.testManager.getUiManager().showMessagesForAllProblemTests();
        break;
      case 82: // r
        top.startTests();
        break;
    }
  };
  
  keyCapture.onkeydown = operateByKeyInput;
})();
</script>

あと、ページのロード時に自動でテストを行う方法を 併用すると便利 → testRunner.htmlの引数(js.nice-777.com)



** ホームに戻る

| 次のページ >>