Windows環境でwcdを快適に使う設定

Windows環境で UATとwcdを共存させる方法

wcdとはunix出自のwherever change directory の事てす。
例えば "wcd *dows" と打てば、 Windows ディレクトリーにジャンプできます、
うろ覚えでもワイルドカード表記でOK
Windows コマンドプロンプト派の私にとっては完全必須ツールとなっております。
ただしこのツールはc:\ にcdて移行するバッチファイルを都度つくるので WindowsのUATと相性が悪いです。
UATを無効化するものよろしくないので、下記のような方法で対応できます。

例えば
C:\TOOL\WCD にwcd関連ツールを配置します。

そこに仮の
treedata.wcd
stack.wcd
wcdgo.bat
という中身は何でも良いファイルをAdministrator権限でない通常の権限で作成した後。

fsutil hardlink create c:\stack.wcd c:\TOOL\WCD\stack.wcd
fsutil hardlink create c:\treedata.wcd c:\TOOL\WCD\treedata.wcd
fsutil hardlink create c:\wcdgo.bat c:\TOOL\WCD\wcdgo.bat

と打ち、c:\に対してハードリンクを貼ります、これによるc:\へのファイル作成確認UATを回避します。

以上


wcd
http://waterlan.home.xs4all.nl/

PDF Renamer つくりました

[Groovy][Windows] PDF Renamer
G* Advent Calendar 2013の21日目です。
PDFファイルを一気に"Title"のメタデータで置換するスクリプト

よくありがちなことに、PDFはファイル名がファイルの内容と関連性がないものになっている事があります。
例えばIBM Redbookをダウンロードするとファイル名が、"sg123456.pdf" の様な名前になっていて、内容と関連性のない連番となってしまいます。
こういう意味のないファイル名は、やはりPDFファイル中の"Title"メタデータで置換したくなる訳ですが、何故かそういうことをしてくれるツールは有料版しか見当たりません、買っても良いのですがこの程度は作るべきだろうということで作りました。
PDFのメタデータ抽出は pdftk というものを使っています、cygwin系譜のwindows版なのでパス指定が "/cygdrive/c/xxx" のような書き方で、パス指定が煩雑になりそうだったのでWindows版の現行directoryを実行時に移動させる手法で、現行directoryを操作するjnaライブリーを使用して、directory指定は簡易化しました。つまり処理対象に対して同じ場所にChange Directory しながら処理していき、相対パスの記述を簡素化しています。

使い方:
1: pdftk windows実行版をdownloadします http://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/
2: 同じ場所に このPDFRenamer.groovyを置きます
3: PDFRenamer の pathToPdftk のパスをセットします
4: PATH に pdftkがある場所をセットします
5: 変換対象のファイル置いてあるdirectoryのルートの位置を現行directoryとして、PDFRenamerを起動します

すると無意味なファイル名のPDFをメタデータ内のタイトルで置き換えてくれます。

https://gist.github.com/nemo-kaz/8065628

Sublime Text2 ショートカット集

編集

Ctrl+C 選択していなければ行をコピー
Ctrl+X 選択していなければ行を切り取り
Ctrl+Shift+K 行を削除
Ctrl+Enter 後ろに行を挿入
Ctrl+Shift+Enter 前に行を挿入
Ctrl+Shift+↑ 複数行を上に移動
Ctrl+L 行を選択 (繰り返すと次の行も選択)
Ctrl+D 単語を選択(繰り返すと複製選択のために次の単語も選択)
Ctrl+M カッコの終わりに飛ぶ。繰り返すとカッコの始まりに飛ぶ
Ctrl+Shift+M 括弧内をすべて選択
Ctrl+KK 行末まで削除
Ctrl+K+BackSpace 行頭まで削除
Ctrl+] 現在の行をインデント
Ctrl+[ 現在の行をインデント
Ctrl+Shift+D 行を複製
Ctrl+J 下の行と結合
Ctrl+ / コメント/アンコメント
Ctrl+Shift+/ ブロックコメント
Ctrl+Y もとに戻すあるいは最後のキーボードショートカットコマンドを繰り返す
Ctrl+Shift+V インデントをつけてペースト
Ctrl+Space 次のオートコンプリートを選択する
Ctrl+U カーソルの移動レベルで最後の変更を元に戻す
Home 行頭に移動
End 行末に移動
Ctrl+Shift+Space スコープ選択
Shift+右ドラッグ 矩形選択
Ctrl+Alt 複数行選択
Alt+→ 次の単語に移動
Alt+F3 同一単語全ての同時編集

ナビゲーション/移動

Ctrl+P ファイルをすぐ開く
Ctrl+R 特定のfunctionやclassに飛ぶ Ctrl+P を押して @ と同じ
Ctrl+; 特定の単語に飛ぶ Ctrl+P を押して # と同じ
Ctrl+G 特定行に飛ぶ Ctrl+P を押して : と同じ
Ctrl+Shift+j 同一インデント部分の一括選択

一般

Ctrl+Shift+P コマンドプロンプト
Ctrl+KB サイドバー表示切り替え

検索/置換

Ctrl+F 検索
Ctrl+H 置換
Ctrl+Shift+F ファイルで検索

タブ

Ctrl+N タブを作成する
Ctrl+Shift+T 最後に閉じたタブを開く
Ctrl+PgDn 次のタブに移動する
Ctrl+Tab 最後に使用したタブに移動する

ウィンドウ

Alt+Shift+2 2列
Alt+Shift+1 1列
Alt+Shift+5 4グリッド
Ctrl+[1,2,3,4] グループに飛ぶ
Ctrl+Shift+[1,2,3,4] ファイルをグループに移動する

ブックマーク

Ctrl+F2 ブックマーク
F2 次のブックマークへ移動
Shift+F2 前のブックマークへ移動
Ctrl+Shift+F2 ブックマークをクリアする

テキスト操作

Ctrl+KU 選択範囲を大文字にする
Ctrl+KL 選択範囲を小文字にする

出典 : mdでない書式で見るために転載
https://gist.github.com/1736542 とコメント
https://gist.github.com/wizard-paso/4129408

Markdown to HTML converter つくりました

[Groovy][Markdown]Markdown to HTML converter つくりました

Git の README.md でおなじみになってきたMarkdown表記ですが、Groovy版のHTMLへのconverterがなかったので作りました。
作り方のコアな部分は markdownj のライブラリをいただいています。javaのライブラリを外側からgroovyで包むという
groovyistっぽい、薄皮饅頭アーキテクチャーで作ってます。

使い方はいつもどおりの簡単操作
例 : md2html.groovy README.md
で README.md.html ファイルが作れます。

コードはこんな感じです


// Markdown to HTML converter
// Usage example : md2html.groovy README.md
// README.md.html will be generated


@Grapes([
//    @Grab('org.markdownj:markdownj:0.3.0-1.0.2b4')
      @Grab('org.markdownj:markdownj:latest.release')
])
import com.petebevin.markdown.*

if (args.length ==0) {
    println """Markdown to HTML converter
Usage: md2html.groovy <Makrdown filename>"""
    return   
} 
m = new MarkdownProcessor(); 
outputMd =""
inputMd = new File(args[0]).eachLine { line  -> 
   outputMd += line +"\n"
}
String html = m.markdown(outputMd)

println html

htmlFile=new File(args[0]+".html").newWriter()
htmlFile.writeLine(html)
htmlFile.close()

println "Markdown to HTML conversion done! "


gitはこちら

https://github.com/nemo-kaz/md2htmlg.git

PDFの専門書を取り揃えるGeb スクリプト


it-ebooksという、大量のIT専門書をPDFで紹介しているサイトがあります。
別に古い本と、限らす、新しい本もけっこう紹介しています、1200冊位あります。
なぜこのような素敵なサイトが存続できるか不明な感じもありますが。
サイト規約を見ると、個人の学習に限ってダウンロード可能書いてあるので、
個人のスキルアップのためにここにあるPDFを適当に見繕ってダウンロードしたいと思います。
ただ、このサイトのデザインは、各書籍間のリンクが存在せず、PDFの実体へのリンクは見えないので
wget的なクローラーでは自動では落とせません。
そこで、Gebで自動で落としてみたいと思います。
ディレクトリー構造はシンプルなのでgeb向きなサイトだと思います。


動かし方
今回はfirefoxのブラウザを自動運転することを想定しています。
groovyを動かすコマンドラインから"firefox"が起動できるようにpathを通しておいてください。
gebでライブラリーをダウンロードしています、Proxyが効いていると動かなかったりするので、
会社の中とかでは、動かないことがあるかもしれません。
firefoxの設定でpdfをクリックすると、デフォルトでは、どうするか選択画面のポップアップが出ますが
問い合わせなくファイルを保存するように設定しておきます。このgebコードではポップアップウィンドウは
制御できません。
スクリプトを動かすと一回目はgebのライブラリーをダウンロードするので起動にすごく時間がかかります、
気長に待ちましょう。
しばらくすると firefox自動起動してして、PDFのクリックに対する処理の問い合わせウィンドウが開くので
以降は全て同様にダウンロートするようにチェックボックスをチェックします。
2冊目以降は自動で落ち続けます。
ただしマルチスレッド的な管理はないので、ダウンロード間隔は7分とか、長めにしておきましょう。

コードはこちら

2013/1/25 消しました レギュレーションが変わって "Direct download only" と追記されています。

画像整理スクリプトを作ってみた。


私は、普段iPhoneで写真を撮影していて、その写真をPicboxというiPhoneアプリDropboxにアップロードとして保存しています。
写真の保存がワンタッチで実行できて便利なのですが、あえて不満点を挙げると

 

  1. ファイル名が、例えば FCA01FAD-146A-4155-86C9-B881C1CC0643.JPG みたいな、人間にとって意味のないファイル名になってDropboxに保存されるいる。
  2. 写真そのものの上下が必ずしもファイルとしての上下と一致せず、横倒しになったままの写真が交じる。
  3. 解像度がそのままなので画像の大きさがまちまちになりやすい。なのでブログに貼ったりPicasaにアップロードするのには不適切。
    という点があります。

そこで対応策として Dropbox Automator http://wappwolf.com/dropboxautomator というWebサービスDropboxディレクトリーをアクセスさせて、画像の自動ローテートでの上下合わせなどに使っていたのですが、処理量が多いとうまく動かなくなるなどの課題があり、やはり手作りすることにしました。

このスクリプトは、PCの特定のディレクトリーに置かれたjpegファイルに対して、Automatorと同じくPROCESSED と ORIGINALという2つのサブディレクトリを作って、ORIGINALに原本を保存し、PROCESSEDには、加工済みのファイルを置きます。
加工は3段階

  1. ファイル名を日付名に変更、ファイルタイムスタンプを撮影日に直す
  2. exif情報に合わせた上下自動回転合わせ
  3. 1024x768ピクセルにリサイズ

です。

 

 

動作イメージ図



convert.exe は ImageMagikのものを使用します。http://www.imagemagick.org/script/index.php
jhead.exe は http://www.sentex.net/~mwandel/jhead/ あたりから落とします。

コードの特徴としてJNA(Java Native Access)を使って、Java単独ではできない現行ディレクトリーの移動を行なっていなす。

※  uehajさんの Groovy+JNA を参考にさせて頂きました。 http://d.hatena.ne.jp/uehaj/20091215/1260872851

 マイ・コーディング・チートシート

[Groovy] マイ・コーディング・チートシート

Groovy Codingする時に、ちょっと書き方を思い出せない時にちら見するためのカンニングペーパーです。
色々なところから集めてきています。

/** Cheat sheet */

/** List */
ll = [11, 12, 13, 14]
[11, 12, 13, 14].add(2, 15)     // [11, 12, 15, 13, 14]
[11, 12, 13, 14].add([15, 16])  // [11, 12, 13, 14, 15, 16]
[11, 12, 13, 14].get(1)         // 12
[11, 12, 13, 14].isEmpty()      // false
assert ll.size()                ==4
[11, 12, [13, 14]].flatten()    // [11, 12, 13, 14]
assert ll.getAt(1)              == 12
assert ll.getAt(1..2)           == [12, 13]
[11, 12, 13, 14].getAt([2, 3])  // [13, 14]
[11, 12, 13, 14].intersect([13, 14, 15]) // [13, 14]
assert ll.pop()                 ==14
[11, 12, 13].add(14)            // [11, 12, 13, 14]
assert ll.reverse()             == [13, 12, 11]
assert ll.sort()                == [11, 12, 13]
assert ll.max()                 == 13

List lst = [1,2,3,4,5,6,7]
assert lst.count {it % 2 == 0 } == 3
assert lst.grep {it % 2 == 0 } == [2,4,6]
assert lst[0] == 1
assert lst[-1] == 7 // 最後の要素
assert lst << [8,9,10] == [1,2,3,4,5,6,7,[8,9,10]]


/** Map */
def mp = ['Ami':111, 'Bob':222 ]
mp.put('Carl',333) 
assert mp.containsKey('Bob') == true
assert mp.get('Ami', 111)    == 111
assert mp.get('Bob')         == 222
assert mp.get('Billy')       == null
println mp.keySet()          // [Ami, Bob, Carl]
assert mp.size()             == 3
assert mp['Bob']             == 222
assert mp.count {k,v -> k == 'Bob' || v==111 } == 2
assert mp.containsKey('Ami')


/** range */
def twentiethCentury = 1900..1999 // Range literal
def reversedTen = 10..1     // Reversed Range
assert twentiethCentury.size()    == 100
assert twentiethCentury.get(0)    == 1900
assert twentiethCentury.getFrom() == 1900
assert twentiethCentury.getTo()   == 1999
assert twentiethCentury.contains(2000) == false
assert twentiethCentury.subList(0, 5) == 1900..1904
assert reversedTen[2] == 8
assert reversedTen.isReverse() == true


/** String */
def hello='Hello'
assert hello.compareToIgnoreCase('hello')  == 0
assert hello.concat('world')           == 'Helloworld'
assert hello.endsWith('lo')            == true
assert hello.equalsIgnoreCase('hello') == true
assert hello.indexOf('lo')             == 3
assert 'Hello world'.indexOf('o', 6)   == 7
assert hello.matches('Hello')          == true
assert hello.matches('He')             == false
assert hello.replaceAll('l', 'L')      == 'HeLLo'
assert 'Hello world'.split('l')        == ['He', '', 'o wor', 'd']
assert hello.substring(1)              == 'ello'
assert hello.substring(1, 4)           == 'ell'
assert hello.toUpperCase()             == 'HELLO'
assert hello.center(11)                == '   Hello   '
assert hello.center(3)                 == 'Hello'
assert hello.center(11, '#')           == '###Hello###'
hello.eachMatch('.') { ch -> print ch }  // print H e l l o 
assert hello.getAt(0)                  == 'H'
assert hello.getAt(0..<3)              == 'Hel'
assert hello.getAt([0, 2, 4])          == 'Hlo'
assert "ABCDEFG".getAt( [0, 2, 4] )    == "ACE"
hello.leftShift('world')              // 'Helloworld'
hello << 'world'                      // Hello world  
assert hello.minus('ell')              == 'Ho'
assert hello - 'ell'                   == 'Ho'
assert hello.padLeft(4)                == 'Hello'
assert hello.padLeft(11)               == '      Hello'
assert hello.padLeft(11, '#')          == '######Hello'
assert hello.padRight(4)               == 'Hello'
assert hello.padRight(11)              == 'Hello      '
assert hello.padRight(11, '#')         == 'Hello######'
hello.plus('world')                // Hello world
hello + 'world'                    // Hello world
hello.replaceAll('[a-z]') { ch -> ch.toUpperCase() } // HELLO
assert hello.reverse()                 == 'olleH'
assert hello.toList()                  == ['H', 'e', 'l', 'l', 'o']
hello = 'Hello world'
hello.tokenize()                   // ['Hello', 'world']
hello.tokenize('l')                // ['He', 'o wor', 'd']

assert 'hello my friend.'.tokenize(/ +/)*.capitalize().join(' ') == 'Hello My Friend.'

// 部分除去
str = "goooooooooooooogle"
str = str.toList()
str[1..14] = ''
str = str.join()
assert str == "ggle"

/** Metaclass操作*/
Object.metaClass.divIt = { ->
	if (delegate != 0 ) {
		return Math.round(Math.floor(delegate.toInteger()/2.toDouble()))
	} else {
		return delegate
	}
}
assert 101.divIt()==50
assert 0.divIt()==0

/** Regular expression */
assert "aaa" =~ /a/         // 内包一致
assert "a"   ==~/a/         // 完全一致
assert "AAABBBCCC".replaceAll(/(.*)BBB(.*)/) {m0, m1, m2 -> "${m1}${m2}" } == "AAACCC" // 中間部分削除

/** for */
for (int i: 1 .. 3) { print i+ " " }         // 1 2 3
for (String s: "a" .. "c") { print s + " " } // a b c
String input = "ABC"
for (int i: 0 .. input.size()-1) {print input.getAt(i) + " "}  // Java形式は型宣言必要
for (  i in 0 .. input.size()-1) {print input.getAt(i) + " "}  // Groovy独自形式

/** Math  */
assert Math.round(876.543) == 877 // 四捨五入
assert Math.ceil(876.543)  == 877 // 切り上げ
assert Math.floor(876.543) == 876 // 切り捨て
assert Math.abs(-1)        == 1
assert Math.max(10,20)     == 20
assert Math.sqrt(9)        == 3.0

/** swap */
def list = [1, 2]
Collections.swap(list, 0, 1)
assert [2, 1] == list

def a = 1, b = 2
(a, b) = [b, a]
assert a == 2
assert b == 1

def map = [x:1, y:2]
map.with {
  (x, y) = [y, x]
}
assert [x:2, y:1] == map

class Person {
	def firstname
	def lastname
	Person(f,l) {
		firstname=f
		lastname =l
	}
}
Person p = new Person('First','Last')
println "\nBefore : "+ p.firstname +" "+ p.lastname 
p.with { (firstname, lastname) = "First2 Last2".split() } // ok
println "After  : "+ p.firstname +" "+ p.lastname 

/** Random */

IntRange.metaClass.define {
    random {
        int from = delegate.isReverse() ? to : from
        int to   = delegate.isReverse() ? from : to
        int size = to - from + 1
        (Math.floor(Math.random() * size) + from) as int
    }
}    // 範囲内でランダム

// パーセント計算
Number.metaClass.getProperty = { propertyName ->
    if (propertyName == 'percent') { delegate / 100 }
    else { delegate }
}
assert 20.5.percent== 0.205
assert 20.percent == 0.2


1000.times{
    assert (0..4).random() in (0..4), '0〜4の値がランダムに返ってくるはず'
}
//println (0..4).random() in (0..4)

/** char number  conversion*/
def charset = 'us-ascii'
assert  'groovy'.getBytes(charset) == [103, 114, 111, 111, 118, 121]
assert 'groovy' == new String([103, 114, 111, 111, 118, 121] as byte[], charset) // character codes to string
String.metaClass.static.fromBytes << { charsetName, List bytes -> new String(bytes.toArray() as byte[], charsetName) }
String.metaClass.static.fromBytes << { charsetName, Object... bytes -> new String(bytes as byte[], charsetName) }
assert 'groovy' == String.fromBytes(charset, [103, 114, 111, 111, 118, 121])
assert 'groovy' == String.fromBytes(charset, 103, 114, 111, 111, 118, 121)


/** コレクション操作 */
list = ['a','b','c','d'] 
newList = [] 
list.collect( newList ) { 
  it.toUpperCase() 
} 
assert newList == ["A", "B", "C", "D"]


/** クロージャー */
def clos = { aa, bb ->  aa+bb } 
assert clos( 5, 7 ) == 12


//エルビス演算子 nullなら初期値を代入
def name 
displayName = name ?: 'Anonymous'