|

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

その場でスクリーンショットを撮って挿入するマクロ(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

大まかな流れ

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

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)

Ruby メモ

APP/bin/foo から APP/lib にパスを通す

2011-06-03

実行ファイル bin/foo を含み lib/foo/bar.rb を利用して動作するライブラリ foo について、 普通に gem や setup.rb でインストールして使えるだけでなく、 「アーカイブファイルを展開しただけで bin/foo を呼び出せば動く」ようにしたい。

ディレクトリ・ファイル構成はこんな感じ

- APP
  - bin/
    - foo # 実行ファイル
  - lib/
    - foo/
      - bar.rb

begin
  require "foo/bar"
rescue LoadError
  $LOAD_PATH << File.expand_path(
                                 File.join(
                                           __FILE__,
                                           "..",
                                           "..",
                                           "lib"
                                           )
                                 )
  require "foo/bar"
end

非 Ruby ユーザ視点で見ると、 Ruby(製のツール)が使いたいのではなく単にそのツールを使って目的が達成できればいいはずで、 gem がどうとか setup.rb がどうという話を持ち出さずに 「アーカイブを展開して適当な所に置いたらあとは ruby /path/to/app/bin/foo で実行できる」 というかたちになっていると簡単で良いと思う。 作った側としても非 Ruby ユーザに薦めやすくなる。

というわけで anbt-sql-formatter では上記のようにパスを通してます。

You don't have write permissions into the /var/lib/gems/1.8 directory.

2011年  2月 26日 土曜日 15:06:23 JST
Ubuntu 10.10 Desktop
ruby 1.8.7 (2010-06-23 patchlevel 299) [i686-linux]
----
$ gem install foo
ERROR:  While executing gem ... (Gem::FilePermissionError)
    You don't have write permissions into the /var/lib/gems/1.8 directory.
----

/var/lib/gems/1.8 の書き込み許可がないのでインストールできないらしい。

----
$ ls -la /var/lib/gems/1.8
合計 8
drwxr-xr-x 2 root root 4096 2010-09-14 02:24 .
drwxr-xr-x 3 root root 4096 2011-02-25 23:50 ..
----

たしかに一般ユーザは書き込みできない。

----
$ echo $GEM_HOME
$ 
$ env | grep GEM_HOME
$
----

環境変数 GEM_HOME は存在していない。

----
RubyGems Environment:
  - RUBYGEMS VERSION: 1.3.7
  - RUBY VERSION: 1.8.7 (2010-06-23 patchlevel 299) [i686-linux]
  - INSTALLATION DIRECTORY: /var/lib/gems/1.8
  - RUBY EXECUTABLE: /usr/bin/ruby1.8
  - EXECUTABLE DIRECTORY: /var/lib/gems/1.8/bin
  - RUBYGEMS PLATFORMS:
    - ruby
    - x86-linux
  - GEM PATHS:
     - /var/lib/gems/1.8
     - /home/user/.gem/ruby/1.8
  - GEM CONFIGURATION:
     - :update_sources => true
     - :verbose => true
     - :benchmark => false
     - :backtrace => false
     - :bulk_threshold => 1000
  - REMOTE SOURCES:
     - http://rubygems.org/
----

GEM PATHS のところを見ると

  - /var/lib/gems/1.8
  - /home/user/.gem/ruby/1.8

の2つがあり、たぶん、
最初に /var/... へのインストールを試み、
次に /home/... へのインストールを試みるようになっているのではないかと
(詳しくは調べてない)。

ならば、GEM PATHS から /var/... の方を取り除いたり
/home/... の方が優先されるようにできないか、と一旦考えたが、
gem help install を見ていたらこういうのがあった:

  --[no-]user-install          Install in user's home directory instead
                               of GEM_HOME.

これを使うとユーザ側にインストールできた。

----
$ gem install foo --user-install
Successfully installed foo-0.30
1 gem installed
Installing ri documentation for foo-0.30...
Installing RDoc documentation for foo-0.30...
----

面倒なので .bashrc でエイリアス
alias gem-install='gem install --user-install'

ホームディレクトリを得る

File.expand_path("~")

環境変数 HOME が設定してある場合はその値、 設定されていない場合 Windows では C:/Documents and Settings/{USER}、 Linux では / が得られる。
(Ruby 1.8.7 で確認)

参考: File - Rubyリファレンスマニュアル

Lisp 由来なところ

直接の由来でなくても、少なくとも共通してるところ。 Common Lisp とかはちゃんと使ったことないのでよく分かってません。

- nil
- if などが式
- return の省略
- シンボル
- lambda(Proc, proc, ブロック)
- site-ruby
- 真偽値を返すメソッドは foo?(Lisp じゃなくて Scheme?)
- load, require (Emacs Lisp 由来?)
- "?" + 文字 でコードが取得できる
- 破壊的な処理をするメソッドには "!" を付ける
  参考: set! や delete-item! に代表される、名前の最後を ! で終わらせる命名方法は、
  変数やデータ構造を破壊的に変更する操作であることを示す Scheme の慣習です。プログラミングGauche p113)

- assoc
- intern
- eval
- autoload(Emacs Lisp 由来?)

参考: 2010-09-28 Togetter - 「RubyはメッセージのないSmalltalkか、に関するまとめ」

respond_to?


# こういうことをしない
begin
  foo.bar # bar がない場合エラーになる
rescue
  # ...
end

# respond_to? を使う
if foo.respond_to? :bar
  foo.bar
else
  # ...
end

ディレクトリを準備

* ディレクトリがすでにある場合は何もしない
* なければ作る
* ディレクトリではなく同名のファイルが存在する場合は例外を発生させる

def prepare_dir(path)
  if not File.exist?(path)
    Dir.mkdir(path)
  else
    if File.file?(path)
      raise IOError, %Q!file "#{path}" already exists!
    else
      # use existing directory
    end
  end
end

(solved) gem でインストールしたライブラリのドキュメントが見れない

2010-05-02
環境: Ubuntu 9.04 / Ruby 1.8.7

Rubyで、gem installした後、ざっとドキュメントを見たいとき、
どうするのが良いでしょうか?→gem serverで解決 - rubyco(るびこ)の日記

に書いてあるように gem server すると、gem でインストールしたものが出てこない。
(おそらく、sudo ではなくユーザ権限で gem install したものが見えていない)

$ gem --help
(略)
      gem help commands            list all 'gem' commands
(略)

$ gem help server
(略)
    -d, --dir=GEMDIR                 directory from which to serve gems
(略)

というわけで、以下で解決。

$ gem server --dir=~/.gem/ruby/1.8/ # ユーザ権限だとここにインストールされる
Starting gem server on http://localhost:8808/

その他

ディレクトリ内の "." と ".." を除いたパスのリストを得る

Dir.open(dir_foo).to_a - [".", ".."]

配列から nil を除く

[1, 2, nil, 3, nil] - [nil] #=> [1, 2, 3]

配列から重複のないように n 個ランダムに取り出す

irb(main):010:0> [1,2,3,4,5,6,7,8].sort_by{ rand }[0..3]
=> [3, 2, 6, 7]
irb(main):011:0> [1,2,3,4,5,6,7,8].sort_by{ rand }[0..3]
=> [7, 4, 5, 8]



** ホームに戻る

|
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。