jrunscriptでGMailを送信してみる

| 2011年12月15日木曜日

jrunscriptを使ってGMailを送信してみる。

まず、JavaでMailを送信するためのライブラリをダウンロードする。

JavaMail API 1.4.4
http://www.oracle.com/technetwork/java/javamail/index.html

ダウンロードした、”javamail1_4_4.zip”を解凍し、中から”mail.jar”だけ適当な場所にコピーする。

下記のコードのアドレスやパスワードを実際に自分の利用するGMailアドレスに変更して、”mail.jar”をコピーしたフォルダと同じ場所に置き、下記のように実行する。

> jrunscript.exe -cp mail.jar -f SendGMail.js

--- SendGMail.js ---
  1. var user = "送信元アドレス@gmail.com";  
  2. var password = "パスワード";  
  3. var to = "送信先アドレス";  
  4. var subject = "件名";  
  5. var body = "本文";  
  6.   
  7. var props = new java.util.Properties();  
  8. props.put("mail.smtp.host""smtp.gmail.com");  
  9. props.put("mail.smtp.port""587");  
  10. props.put("mail.smtp.auth""true");  
  11. props.put("mail.smtp.starttls.enable""true");  
  12.   
  13. var session = Packages.javax.mail.Session.getInstance(props);  
  14. var mimeMessage = new Packages.javax.mail.internet.MimeMessage(session);  
  15.   
  16. mimeMessage.setFrom(new Packages.javax.mail.internet.InternetAddress(user));  
  17. mimeMessage.setRecipient(Packages.javax.mail.Message.RecipientType.TO, new Packages.javax.mail.internet.InternetAddress(to));  
  18.   
  19. mimeMessage.setSubject(subject, "ISO-2022-JP");  
  20. mimeMessage.setText(body, "ISO-2022-JP");  
  21.   
  22. mimeMessage.setSentDate(new java.util.Date());  
  23.   
  24. var transport = session.getTransport("smtp");  
  25. transport.connect(user, password);  
  26. transport.sendMessage(mimeMessage, mimeMessage.getAllRecipients());  

jrunscriptで自作のstaticなクラスメソッドを呼んでみる

| 2011年11月6日日曜日

足し算をするだけのstaticなクラスメソッドをjrunscriptで呼んでみる。

カレントフォルダに下に書いたMyMethod.javaがあるとしてコンパイルしてから、classpathの指定に”.(ピリオド)”でカレントフォルダにパスを通して利用する。

CMD > javac MyMethod.java
CMD > jrunscript -classpath .
js> Packages.MyMethod.add(1, 2);
3
js>

--- MyMethod.java ---
  1. class MyMethod {  
  2.   public static int add(int a, int b) {  
  3.     return (a + b);  
  4.   }  
  5. }  

jrunscriptで複数のClass、複数のJarに同時にパスを通して使う

|

前々回と前回でClassもJarも使えるようになった。
複数のClass、複数のJarを同時に使いたい時もあるので調べてみた。

複数にパスを通すには、”;(セミコロン)”でパスを区切ればいけそうだ。

通すファイルは前々回と前回に作ったClassとJar
ここではカレントフォルダのMy.classとMy.jarにパスを通して使う。

CMD > jrunscript -classpath ".;My.jar"
js> var myClass = new Packages.My("class");
js> myClass.getName();
class
js> var myJar = new Packages.foo.bar.My("jar");
js> myJar.getName();
jar
js>

jrunscriptで自作したJarを使ってみる

|

自分で作ったJarをjrunscriptから使ってみる。
前回書いたClassとの違いはあまりないけど、1つだけ注意が必要。
クラスパスを通すとき、クラスを使う場合は、そのクラスファイルのあるフォルダを指定してパスを通してあげればよかったけど、Jarの場合は使いたいJarファイル自体のパスを引数に渡してやる必要がある。

Jarを作るところから順番に書いていく。

カレントフォルダの下に
foo
└─bar
     └─My.java
があるとして

CMD > javac foo\bar\My.java
CMD > jar cvf My.jar foo\bar\*.class
マニフェストが追加されました。
foo/bar/My.class を追加中です。(入 = 446) (出 = 274)(38% 収縮されました)

CMD > jrunscript -classpath My.jar
js> var my = Packages.foo.bar.My();
js> my.setName("foo");
js> my.getName();
foo
js>

--- My.java ---
  1. package foo.bar;  
  2.   
  3. class My {  
  4.   private String name;  
  5.   
  6.   public String getName() { return this.name; }  
  7.   public void setName(String name) { this.name = name; }  
  8.   
  9.   public My() {  
  10.   }  
  11.   
  12.   public My(String name) {  
  13.     this.name = name;  
  14.   }  
  15. }  

jrunscriptで自作したClassを使ってみる

|

自分で作ったBeansを使えれば既存のJavaコードを利用できるし、Webアプリの一部機能をバッチ化する場合に便利なので試してみた。
Javaの標準クラスを使うサンプルは多かったけど自作クラスを使うのは見当たらなかった。
いくつかのサイトを見て、どうやら使えるらしいということはわかっていたけど、どうやって使ったらいいのかよくわからなかった。
試行錯誤した結果、下の方法でなんとか使えるようになった。

jrunscriptでは自分で書いたクラスを使うには起動時に、使いたいクラスのパスを引数で渡してやる必要があるみたいだ。
jrunscript -classpath に  ”.(ピリオド)” を渡すとカレントフォルダをクラスパスに指定できる。

カレントフォルダにMy.javaがあるとして、My.javaをコンパイルするところから使い方を順番に書いていく。

CMD > javac My.java
CMD > jrunscript -classpath .
js> var my = new Packages.My();
js> my.setName("foo");
js> my.getName();
foo
js> var my2 = new Packages.My("bar");
js> my2.getName();
bar
js>

--- My.java ---
  1. class My {  
  2.   private String name;  
  3.   
  4.   public String getName() { return this.name; }  
  5.   public void setName(String name) { this.name = name; }  
  6.   
  7.   public My() {  
  8.   }  
  9.   
  10.   public My(String name) {  
  11.     this.name = name;  
  12.   }  
  13. }  

jrunscriptを試してみる

|

WindowsでもLinuxでもSunOS(かなり古いが)でも、どこでも動くバッチが必要になったので”jrunscript”というJavaで動くJavaScriptを使ってみる。
知らなかったが、Java6からJDKに入ってるらしい。

少しだけ試してみた。

※JDKのbinフォルダにパスを通しておいたほうが楽。

■インタラクティブ シェルで使う
CMD > jrunscript
js>print("Hello World!\n");
js>quit(); //終了


■ワンラインでスプリクトを実行する
CMD > jrunscript.exe -e "print('Hello World!\n');"


■スプリクトを書いたファイルを実行する
CMD > jrunscript -f helloworld.js
Hello World!

--- helloworld.js ---
  1. print("Hello World!\n");  

PowerShellでCD-ROMドライブを開閉する

|

ドライブを開けることは知っていたけど、閉めることもできるんじゃないかと調べてみたらどうやらできるようだ。
⇒ http://thepowershellguy.com/blogs/posh/archive/2008/08/04/powershell.aspx

紹介されていたのは開閉どちらにでも使えるものだったけど、自分としては開ける、閉めるは別コマンドの方がよかったので分けてみた。
コードが重複しているけど、分けた方が使いやすいと思ったので。

--- Open-CDDrive.ps1 ---
  1. $winnm = Add-Type -memberDefinition @ 
  2.   [DllImport("winmm.dll", CharSet = CharSet.Ansi)]  
  3.   public static extern int mciSendStringA(  
  4.   string lpstrCommand,  
  5.   string lpstrReturnString,  
  6.   int uReturnLength,  
  7.   IntPtr hwndCallback);  
  8. "@  -ErrorAction 'SilentlyContinue' -passthru -name mciSendString  
  9.   
  10. $winnm::mciSendStringA("set cdaudio door open" ,$null ,0 ,0)  
--- Closed-CDDrive.ps1 ---
  1. $winnm = Add-Type -memberDefinition @ 
  2.   [DllImport("winmm.dll", CharSet = CharSet.Ansi)]  
  3.   public static extern int mciSendStringA(  
  4.   string lpstrCommand,  
  5.   string lpstrReturnString,  
  6.   int uReturnLength,  
  7.   IntPtr hwndCallback);  
  8. "@  -ErrorAction 'SilentlyContinue' -passthru -name mciSendString  
  9.   
  10. $winnm::mciSendStringA("set cdaudio door closed" ,$null ,0 ,0)  


VBScriptで数値を0で埋めて表示してみる

| 2011年10月12日水曜日


VBScriptでは0埋めでフォーマットする関数は標準で用意されていないようだ。

こんな感じで書いて

Format("0000000000", 120)

0000000120

っと表示したかったけど楽にはできないみたい。

そこでちょっとしたものを書いてみた。

普通に0埋め用のフォーマットをする関数なら他でも紹介されていたので、ここではエラー処理などは無視して、関数にするほどもない、一箇所だけそんな0埋めでフォーマットをしたい人向けにした。

内容は単純で、

  • 表示したい桁 - 数値の桁
  • その結果の数値をSpace関数で数値分の空白文字にする
  • 空白文字をReplace関数を使って指定した文字に置き換える
っというのを一行でしているだけ。
VBScriptでちょっとしたバッチのために、だらだらと関数を書いたり、共通関数を外だしするのもなんだし。
小さいバッチはあっさりしてた方がメンテナンスも楽だからね。
  1. 'VBScriptで数値を0で埋めて表示する  
  2.   
  3. '表示したい桁数  
  4. length = 10  
  5.   
  6. '表示する数値  
  7. value = 120  
  8.   
  9. '0で埋める  
  10. character = 0  
  11.   
  12. '10桁表示で120を表し、空いている部分は0で埋める  
  13. result = Replace(Space(length - Len(value)) & value, Space(1), character)  
  14.   
  15. WScript.Echo result ' => 0000000120  

Windowsでvimのopsplorer.vimを使ってみた。

| 2011年10月10日月曜日


vimをIDEっぽくできないかと探していると、opsplorer.vimなるものを見つけた。

  1. vim onlineからダウンロード。 リンク:opsplorer.vim
  2. pluginフォルダにopsplorer.vimを配置。(KaoriYaのvimを使っているなら runtime/pluginの下)
  3. vimを起動して :opsplorer
見つけたのはいいが、使ってみるも動かない。

どうやら、Windowsには対応していないようだ。
紹介サイトのスクリーンショットがMacばっかりだったからなんとなく察したけど。
他にも困っている人がいるだろうとさらに調べると対応版を作ってくれている人がいた。


mattn
opsplorer.vimをwin32でも動くようにしてみた。便利かどうかは知らない。http://gist.github.com/333696


十分に便利でありがたいです。
githubで公開されているようなのでダウンロードして、pluginフォルダにおいてみる。

起動するとうまく動いてくれたようだ。

が!

ここでちょっとした問題が・・・
フォルダの展開やファイルの選択系はWindowsに対応してくれたようだけど、コマンド系(ファイルのコピーやリネーム、削除)ができない。

ソースを見てみると、ファイルを削除しているであろう関数FileDelete()の中で呼び出してるコマンドが"rm"だった・・・
これはWindowsでは動かんだろうな。

system()関数で呼び出されるのは、たぶん、CMDのコマンドだろうからここは"del"でないといけないはず。

PowerShellを常時使ってるから、このあたりの機能はなくてもいいんだけど、連休中にやることもなかったので、vimマクロはほとんど触ったことがないけどいじってみた。

詳細は一番下にリンクを張ったコードをダウンロードして見てもらえばいいけど、外部コマンドを呼んでいるっぽいところを変更しただけ。

let i=system("rm -f ".filename)


if has("win32")
let filename = substitute(filename,".*[\\/]",'','')
let i=system("del /Q ".filename)
else
let i=system("rm -f ".filename)
endif

Windowsならフォルダの区切り文字を整理して、"del"コマンドを呼ぶ。
削除、コピー、リネーム、移動を変更してみた。
大体動いているようだけど、なぜか移動だけは動かなかった。
わかる人、助けて下さいm(_ _)m

他にも困ってる人がいると思うので変更したソースを公開する。
本来はgithubを使ったほうがいいんだろうけど、アカウントを持ってないので今回はやめておく。



Windows7のPowerShellでDVDドライブからのディスク取り出し

| 2011年7月18日月曜日

Windows7を使い始めて、リムーバブルディスクの取り出しをやってみると動かなかったので修正。

前のようにWScript.Shellを使って

> $shell = New-Object -ComObject WScript.Shell
> $Shell.Application.NameSpace(17).ParseName('D:\').InvokeVerb("取り出し(&J)")

っとやろうとしたけどShellの下にApplication.NameSpaceってのがないらしく呼び出せなかった。
そこで調べてみるとWMPlayerの機能を呼び出しても取り出しができそうだったので、そっちでやってみた。

> $wmp = New-Object -ComObject WMPlayer.OCX.7
> $wmp.cdromCollection.Item(0).Eject()

自分の場合はドライブが1つしかないので試せないけど、複数ドライブなら”Item(0)”の部分を変えればいけると思う。

Oracle SQLでDATE型とUNIXタイムを相互に変換する

| 2011年5月4日水曜日
SQLだけでやると一文が長くなってしまうので、頻繁に利用するなら
PL/SQLで関数を作っておいた方がいいと思う。

自分の場合は一回限りなのでSQLのみでやりたかった。

※Oracle XEで検証

-- DATE型からUNIXタイムに
select trunc(to_number(
to_date('調べたい日時を入れる', 'YYYY/MM/DD HH24:MI:SS')
- to_date('1970/01/01 00:00:00', 'YYYY/MM/DD HH24:MI:SS')
) * (24 * 60 * 60)
) as unixtimestmp
from dual;

-- 例 2011年5月4日 午前1時20分30秒
select trunc(to_number(
to_date('2011/05/04 01:20:30', 'YYYY/MM/DD HH24:MI:SS')
- to_date('1970/01/01 00:00:00', 'YYYY/MM/DD HH24:MI:SS')
) * (24 * 60 * 60)
) as unixtimestmp
from dual;

結果: 1304472030

-- UNIXタイムからDATE型に
-- ここではわかりやすいようにto_charで変換して出力している
select to_char((
to_date('1970/01/01 00:00:00', 'YYYY/MM/DD HH24:MI:SS')
+ (調べたいUNIXタイムを入れる/ (24 * 60 * 60))
), 'YYYY/MM/DD HH24:MI:SS') as utc
from dual;

-- 例 1304472030 (2011年5月4日 午前1時20分30秒)
select to_char((
to_date('1970/01/01 00:00:00', 'YYYY/MM/DD HH24:MI:SS')
+ (1304472030 / (24 * 60 * 60))
), 'YYYY/MM/DD HH24:MI:SS') as utc
from dual;

結果: 2011/05/04 01:20:30

-- 調べたいUNIXタイムが標準時で記録されていた場合
-- 日本標準時で出力したければ、9時間足す必要がある
select to_char((
to_date('1970/01/01 00:00:00', 'YYYY/MM/DD HH24:MI:SS')
+ ((1304472030 + (9 * 60 * 60))/ (24 * 60 * 60))
), 'YYYY/MM/DD HH24:MI:SS') as jst
from dual;

結果: 2011/05/04 10:20:30