2021年6月28日月曜日

Google apps script とスプレッドシートでスプレッドシート比較ツールを作ってみる

Google apps scriptというのをたんなるエクセルのマクロのような存在と思いこんでいたりすると、大きなまちがいだなと最近すごく感じています。

実際に、これを使うと、簡単なウェブアプリケーションが作れたりします。例えば、Slackの会話を添付ファイル込みでエクスポートするWebアプリケーションも作れたもします。

 また、Google apps scriptとスプレッドシートをの組み合わせもいい基盤です。入力と出力を必要とするようなツール基盤としていろいろ便利な存在です。

以下の具体例を交えて説明しておきます。

Google apps scriptを使うとカスタムメニューを追加することができます。

コードは簡単です。こんな風に書くだけです。

function onOpen() {
  SpreadsheetApp.getUi()
      .createMenu('比較ツール')
      .addItem('比較実行''executeCompare')
      .addToUi();
}

Spreadsheetのうち一つのシートをパラメータ設定用のシートにして、結果を出力するシートをもう一つ作ると、
パラメータをセットした後に、ツールを実行ということができるようになります。

イメージとして、実際のサンプルツールを作ってみました。
こちらは、2つのスプレッドシートを比較するツールになります。


こちらのスプレッドシートをコピーして実行してみてください。

使い方も簡単に書いておきます。

上の図のようにvarsのシートに
  1. 比較したいスプレッドシートのURLを記載します。
  2. 比較したいシートの名称を記載します。
  3. キーとなるカラムを指定します。(複数時には、カンマ区切り)
  4. 比較したいカラムを指定します。(複数時には、カンマ区切り)
これらをセットして、メニューの比較ツール→比較実行から実行すると、Resultタブに結果が出てきます。
それ以外のシートは作業用です。

結果の例)



比較に使えるサンプルも用意してみましたのでそのまま実行できるのではないかと思います。

30分くらいでぱっと作ったものなので、バグってたらすいません。

2つのファイルを比較するって比較的ニーズはありそうなんですが、もしも、こんなこともやれるようにしたいなどのご要望があったら、
コメント欄からいただければ、ちょっとここから改善してみるかもしれません。

声がなくても、自分用にいろいろ改善していこうかと思っています。

2021年3月22日月曜日

Googleスプレッドシートのフィルタに別シートのListを使ってフィルタしたい

 フィルタするときのフィルタに指定する値を別表に書いているものを使ってフィルタしたいという例があると思います。

例えば、

表1:

A1
B2
C3
D4
B5
A6
B7
C8
C9
D10

表2:

A
B

があり、表1をA,Bでフィルタをかけたいというようなイメージです。


SQLのイメージ的にいうと

SELECT * from 表1 where ID in (SELECT ID from 表2)

みたいなイメージのことをSpreadSheetを使ってやりたいなというところです。


これどうやってやるのが一番簡単なのかちょっといろいろ探ってみたのですが、

おそらく、FILTER関数とMATCH関数を使って実現するのがよさそうです。


書き方は下記の感じです。

=FILTER(フィルタしたい票の範囲,MATCH(フィルタしたい範囲の条件部分,フィルタを掛けたい値の別表,0))

実例はこちらになります。

=FILTER(A1:B10,MATCH(A1:A10,'別表2'!A1:A2,0))


実際のサンプルスプレッドシートはこちらです。

https://docs.google.com/spreadsheets/d/1tSr8mukLFhREQCYxy6gsp2QUz9-Ie6liPV7uHt3fOh0/edit?usp=sharing



2020年11月30日月曜日

Spreadsheetにて正規表現にマッチした値を取り出す。

例えば、Google spread sheetで数字の部分だけを取り出したいとかいうニーズがあったりします。

そんな時に利用できるのが、REGEXTRACT関数です。

正規表現を使って文字列を抽出することができます。

例えば、「10円」というセルから10を取り出そうと思うと、

=REGEXEXTRACT(A2,"[0-9]+")

と記述することにより、10の部分を取り出すことができます。


他の例だと、例えば、メールのアドレス部分が、

サンプル太郎 <spreadsheet@example.com>」のような形式で入っていた場合。

下記のように記述すると、名前の部分が取り出せます。

=REGEXEXTRACT(E2,"(.+)<")

また、下のように書くとメールアドレスの部分を取り出せますね。

=REGEXEXTRACT(E2,"<(.+)>")


このように、文字列を自由自在に分解できると、また、spreadsheetの活用範囲が広がるのではないでしょうか。 

本日の関数の実サンプルはこちらのリンクを参照ください。

2020年11月27日金曜日

Google Spread Sheetですべての値の一覧化をしたいときに使う関数(UNIQUE)

ある列に入っている値の一覧を取得したいと思うことがあると思います。

そんな時に使う関数が、UNIQUE関数です。

利用方法は簡単です。A列に入っている値の一覧が取得したいときには、下記のように記述します。

=UNIQUE(A2:A10)

 このように書くと、ここから下に、一意な値が並びます。

それをさらに並べ替えたい場合には、SORT関数を使います。

=SORT(UNIQUE(C2:C10))

これで、一覧を作成したうえで並び替えることができます。

実際のSpreadsheetのサンプルのURLはこちら


2020年11月5日木曜日

Google spreadsheetを使って自動応答メールの作成

 Google Apps scriptを使ってSpreadSheetを開いたらメールを送る例は、前回の記事でも紹介しました。

似たようなユースケースですが、今回は、フォームを使って自動送信メールを実現する方法を紹介します。メール送信プログラムは前回の記事で紹介したので本日は割愛します。

また、フォームの作成は、以前の記事で紹介しているのでこれも割愛します。

メールのプログラムを書いた後に、スクリプトエディタ上の「編集」→「現在のプロジェクトのトリガー」より、トリガを作成のボタンを押していただき、イベントの種類を選択から「フォーム送信時」を選ぶとフォームを提出したときに自動的にメールを送信することができます。


前回の記事のあて先部分を下記のようにすると、提出者に対してメールを送信することができますね。

    var toAdr = Session.getActiveUser().getEmail() ;


これを使うと例えば下記のようなことが実現できます。

  • フォーム回答時にお礼のメールを送信する
  • 下記の内容で受け付けました的なお知らせメール
  • 申込者に対して秘密のURLなどを送付する。アンケート回答のお礼のクーポンとかもそのたぐいですね。
便利ですね。日々の仕事とかちょっとした部分に色々使えそうです。

コメント欄に、こういう使い方がしてみたとか、こういう使い方ってできるかなどの質問なども気軽にいただけるとありがたいです。

2020年11月4日水曜日

Google App Script でメールを送信する

 例えば、下記のようなことをしたくないでしょうか。

例えば、鍵が開錠されたら通知をしたいけど、鍵は、単なる物理鍵なので、通知は難しい。


そんな時に、下記のような構成にすることによって、疑似的に実現可能かなと思っています。

・暗証番号などのカギをGoogle spreadsheetに書いておく。

・Google spreadsheetが開かれたら、誰が開いたかを管理者にメールする

このようなことが、Google spreadsheetとGoogle apps scriptを使うと簡単にできます。

暗証番号型のカギで鍵をかけてその暗証番号などの秘密のファイルをどこかにおいておき、

そのファイルが開封されたら、通知してほしい。

まず、Google spreadsheetから「ツール」→「スクリプトエディタ」を開きます。

その後下記のようなコードを書きます。

<pre>

function send_mail(){

    var toAdr = "xxxxxxx9999@gmail.com";

    var ccAdr = "";

    var bccAdr = "";

    var subject = "";

    var name = "";

    var files = new Array();

    var body = Session.getActiveUser().getEmail() +

      "さんから訪問がありました。\n";

  

    MailApp.sendEmail({to:toAdr, cc:ccAdr, bcc:bccAdr, subject:subject, name:name, body:body, attachments:files});

}

</pre>

Session.getActiveUser().getEmail() は接続者のメールアドレス情報を取得します。

MailApp.sendEmailはメールの送信をする関数です。


toAdrに送信したいあtメールアドレスをいれてください。

その後、スクリプトエディタ上で、実行→関数を実行→send_mailを選択すると許可を求める画面が出てきます。今ログインしているユーザの代わりにメールを送信する許可を求められるので、問題がなければ許可をします。

すると、メールが送信されると思います。

次に、スクリプトエディタ上の「編集」→「現在のプロジェクトのトリガー」を選択すると、この関数をいつ発火するかを選択できます。「トリガーを追加」を押して起動時に発火するように下記の通り、選択します。

イベントの種類を「起動時」とすることでファイルを開いたときにメール送信関数を呼び出すようにすることができます。

以上のステップのみで、冒頭に述べたことが実現できます。

とても簡単ですね。。。


2020年10月30日金曜日

Google spreadsheetの関数を使ってみる(QUERY)

 前回の記事では、集計の方法として、SUMIFなどの関数を紹介しました。

今回の集計に使える関数の紹介です。SQLなどになじみのある方は、この関数が便利に感じると思います。

前回の記事と同じように、支払い種別、用途、金額という表があった時に、支払種別と用途ごとに集計したいというような場合に、SQLだと、

select 支払い,用途,sum(金額) from xxx group by 支払い、用途  

というようなSQLで集計するとおもいます。これはSpreadsheetでも同様に描くことができます。

支払い用途金額
現金食費¥1,000
現金交通費¥1,000
現金食費¥600
現金娯楽費¥1,500
現金食費¥500
クレジットカード医療費¥30,000
現金薬代¥1,500
現金医療費¥3,000
クレジットカード医療費¥18,000

セルに下記のように書いてみましょう。

=QUERY(A2:C10,"select A,B,sum(C) group by A,B",-1)

SQLの集計関数と同じ文法が書けます。最初の引数は、範囲。次がQuery文字。

これを書くと下記のように表示することができます。

クレジットカード医療費48000
現金交通費1000
現金医療費3000
現金娯楽費1500
現金薬代1500
現金食費2100

Joinなどはできませんが、それでもSQLに慣れている人にとっては非常に便利な関数です。

SQLに慣れ親しんでいる人は、いろいろ関数を組んで書くよりも楽かもしれませんね。

今回のスプレッドシートの例は、こちら

2020年10月29日木曜日

Google spreadsheetの関数を使ってみる(SUM/SUMIF/SUMIFS)

昨日は、件数を算出する関数について書きました。

昨日の記事。 

本日は、似たような関数の集計系の関数について記載します。

まず、一番有名でシンプルな関数は、単純にすべての数字を足す関数です。

これは、シンプルに下記のように書きます。

=SUM(C2:C100)

C列の2行目から100行目を足すときにつかします。

次に条件に一致したときに足すという関数SUMIFです。

=SUMIF(B2:B100,"食費",C2:C100)

B列に用途、C列に金額というような表があった時には、上のように書くと、食費の合計値を算出することができます。

さらに、複合条件にしたい場合には、SUMIFSという関数を利用します。

=SUMIFS(C2:C100,B2:B100,"医療費",A2:A100,"クレジットカード")

A列に支払い種別、B列に用途、C列に金額というような表があった時にクレジットカード払いの医療費というのを集計したい場合には、SUMIFなどの関数を利用します。

いりいろと便利な関数が多いですね。

本日のサンプルスプレッドシートはこちらになります。

2020年10月28日水曜日

Google spreadsheetの関数を使ってみる(COUNT/COUNTIF/COUNTIFS)

Google Spreadsheetには、アンケートフォームを作って、その結果をspreadsheetに転記する機能があります。これは、「挿入」→「フォーム」で作成できます。

例えばこんなフォームができます。

そして、これに回答すると、こんな感じのシートに自動的に転記されます。

さて、このような状況の中、今回は、これらと一緒に集計をしていきたいというようなケースに利用可能なCOUNT系の関数を紹介します。
  • アンケートの合計数
  • 男性数
  • 20代の数
 という3つのパターンを集計する方法を紹介します。

アンケートの合計数は、 =COUNT(FormResponses3!A2:A10001) という感じです。
単純にA2からA10001までの件数を返してくれます。

男性数は、 =COUNTIF(FormResponses3!B2:B10002,"男") という感じです。
引数の最初の部分は、範囲、2番目は条件です。つまりB列が"男"の件数が返ってきます。

20代の数は、COUNTIFSという関数を使います。

=COUNTIFS(FormResponses3!C2:C10002,">=20",FormResponses3!C2:C10002,"<30")

という感じです。範囲と条件を繰り返して書いていきます。上は、C列が20以上で30未満のものの件数が返却されます。

これらを応用すると、例えば下記のようなこともできるでしょう。
  • 男女比率の算出
  • 年代の割合の算出
  • 年代のグラフの追加
アンケートを実施しながら、同時に集計結果が出てしまうのはありがたいですね。
Google spreadsheetの関数を覚えれば覚えるほど、いろいろと便利になると思います。

実際の利用例は上のシートと同じところに書かれています。

2020年10月27日火曜日

Google spreadsheetの関数を使ってみる(CONCATENATE/CELL)

 昨日の記事で紹介した

=IMPORTRANGE("1CoJnqVABFhSx0CNgl7hSgGn-_w6hqtCq3PhBVUJ3VCM","Sheet1!B3")

という記述ですが、2番目の引数が文字型になってしまっていることにより、実はちょっと不便な感じになってます。行を追加してコピーすると、通常の方式であれば参照部分が行に対応して、

B4,B5

と増えていってくれる部分が、文字列のままなのでB3のままになってしまう問題があります。

それを解消するために、文字列結合関数のCONCATENATEとCELL情報を取得するCELLという関数を使って下記のように書き換えられます。

=IMPORTRANGE("1CoJnqVABFhSx0CNgl7hSgGn-_w6hqtCq3PhBVUJ3VCM",CONCATENATE("Sheet1!",Cell("address",B3)))


"Sheet1!B3" の部分が CONCATENATE("Sheet1!",Cell("address",B3)) にリファクタリングされています。


CONCATENATEは、複数の文字列を結合する関数です。

CELL関数は、Cell("address",B3)のアドレス情報を文字列化してくれます。実際には、$B$3が返却されます。


文字列の結合とかってあんまり利用しないと思われがちですが、こういう関数を使いこなそうと思った時には、あると便利に使えたりしますね。


本日の関数を使ったサンプルのスプレッドシートはこちらになります。

https://docs.google.com/spreadsheets/d/1wgeeUHpZfemXc0cg0QhEwKHbHw3QxpiNxs0Gi9d9zVA



2020年10月26日月曜日

Google spreadsheetの関数を使ってみる(IMPORTRANGE)

 昨日に続き、Import系の関数サンプルです。

本日は、IMPORTRANGEという、他のSpreadSheetを取り込むための関数です。

個人的には、こちらの関数が一番実用的かなと思っています。

SpreadSheetだと、毎月、同じフォーマットで値を出すことも多いかと思います。

例えば、簡単な例として、9月分の家計簿10月分の家計簿を作ってみました。もちろん、こちらは架空の家計簿です。

ここでシートが分かれていると、困るのが、前月との差額を計算したいときに困ります。

その問題を解決してくれる関数がIMPORTRANGEという関数です。別ファイルに作成された票をあたかも自分の表にあるかのように扱えるのが素晴らしい点です。

使い方は簡単です。

=IMPORTRANGE("https://docs.google.com/spreadsheets/d/1d2EW-83Jd68q8oeuzww_Mrnz23pVnedQdFSgXyeIn7w","Sheet1!B3")

のように書くと、リンク先のSheet1のB3列目を取得することができます。

=IMPORTRANGE("1CoJnqVABFhSx0CNgl7hSgGn-_w6hqtCq3PhBVUJ3VCM","Sheet1!B3")

というように省略して書くことも可能です。

また、範囲を指定すると、複数列・複数行を取り込むことも可能です。

=IMPORTRANGE("1CoJnqVABFhSx0CNgl7hSgGn-_w6hqtCq3PhBVUJ3VCM","Sheet1!A1:B3")

これも他の関数と組み合わせることにより、可能性は無限に広がっていきます。

サンプルのSpreadsheetはこちらです。

https://docs.google.com/spreadsheets/d/1CoJnqVABFhSx0CNgl7hSgGn-_w6hqtCq3PhBVUJ3VCM/edit#gid=0


こちらも、こんな風に使っているなどの情報を下記のコメントかメールで送信していただけるとありがたいです。

2020年10月24日土曜日

Google spreadsheetの関数を使ってみる(IMPORTHTML)

 2日連続で書いてみます。とりあえず、なるべく毎日書くように頑張ってみようと現段階では考えてます。

昨日紹介した(IMPORTDATA)関数とやりたいことは似ているんですが、本日は、IMPORTHTML関数を使ってみます。

昨日はcsvファイルなどを取り込むときに使う関数でしたが、この関数は、HTML上のテーブルやリスト値を取得することができます。

csv形式での後悔はしてないけど、ブラウザ上に表示されているような場合には便利です。

例えば、Yahooの株情報を表示するページを例にとってみます。

https://info.finance.yahoo.co.jp/ranking/?kd=8&mk=1&tm=d&vl=a

このページでは、配当利回りが高い順に表示されるページですが、これをGoogleSpread Sheetに下記のように記述することにより取り込むことが可能になります。

=IMPORTHTML("https://info.finance.yahoo.co.jp/ranking/?kd=8&mk=1&tm=d&vl=a","table",1)

これだけだと、正直あまりうれしくないと思いますが、これと他の関数を組み合わせてやることによりいろいろ便利にすることができます。

例えば、ほかに用意された関数を使って自分が買おうと思っている株価を別のシートで管理しておいて、配当利回りが4%を超えるようなものを絞り込むとか、そいういう応用をすることができるようになります。こういう応用例もおいおい紹介していければいいかと思ってます。

また、Google App Scriptなどを組み合わせて使うと、一定条件を満たしたときに通知するとかもできるようになると思います。

下記が実際に使ってみたサンプルです。

https://docs.google.com/spreadsheets/d/16a3TRguKFndLx3oGFZPgFml91F8h4xxgMN4le1gtB-4/edit?usp=sharing

こちらも、こういう風に利用したなどの情報をコメントやメールで頂けるとありがたいです。

2020年10月23日金曜日

Google spreadsheetの関数を使ってみる(IMPORTDATA)

 久々の更新になりますが、Google spreadsheetはいろいろと使いこなせば日々の仕事にも役に立ちそうな気がするので、そこら辺を追及していこうかと思ってます。

しばらくは、Google spreadsheetの関数を使っていろいろ遊んだ結果を残していこうということで、暫くいろいろな関数で遊んだ結果を書いていこうかと思っています。

初回は、IMPORTDATAという関数です。こちらは、どういう関数かというと、インターネット上からダウンロードできるcsvファイルをSpreadsheetに取り込むことができるというものです。

例えば、コロナの陽性者数情報を厚生労働省のホームページからcsvファイルとしてダウンロードできます。下記を見ていただくと、いろいろな情報をcsvファイルとして公開しています。

https://www.mhlw.go.jp/stf/covid-19/open-data.html

この中の陽性者情報を取得するcsvファイルのURLを確認して、下記のようにspreadSheetに書いてみましょう。

=IMPORTDATA("https://www.mhlw.go.jp/content/pcr_positive_daily.csv")

すると、データが取得できます。これに、チャートを追加してみるとこんな感じで表示することが可能です。




このサンプルに利用したspreadsheetは下記にリンクをしておきます。

https://docs.google.com/spreadsheets/d/1MSh4XPO8LdBJkNhHbnD9QCW9nV1qKVnjdtvuo9MMpeQ/edit?usp=sharing

なんかいろいろと他にも応用できそうですね。

こんな風に利用したなどの情報をコメント欄でいただけると嬉しいです。

2019年10月6日日曜日

Google ドキュメントで章番号・節番号を付与

Google ドキュメントで見出しに章番号を付与しようといろいろ調べてみたけど標準ではそういう機能がなさそうな感じ。

ということで、スクリプト使ってできそうだったのでちょっと作成してみました。

基本的に、必要な概念は、

var pars = DocumentApp.getActiveDocument().getBody().getParagraphs();

でパラグラフを取得してループを回していきます。


  var hdg = par.getHeading();
    if (hdg == DocumentApp.ParagraphHeading.HEADING1

ここでヘッダ1なら章番号を加算して出力するという感じでやってます。

par.setText(counterh1+'.\t'+chunks[0]);


初めて書いてみましたが、なるほどなかなか便利ですね。

コード例:

2012年12月2日日曜日

findbugsプラグインを作ってみる

findbugsプラグインを作ってみました。
とりあえず、簡単なチェックなら簡単にできそうだということがわかっりました。

作り方は、下記のページを参考にしました。
・FingBugsのプラグインのTutorial http://code.google.com/p/findbugs/wiki/DetectorPluginTutorial

・DM_DEFAULT_ENCODINGを検出するfindbugsのソースコード http://code.google.com/p/findbugs/source/browse/trunk/findbugs/src/java/edu/umd/cs/findbugs/detect/DefaultEncodingDetector.java?r=14166

とりあえず、ある関数を呼び出しているというのを検出するものを書いてみました。

そして、BigDecimal.divide(java.math.BigDecimal)を呼んでいる箇所を 検出する場合には、下記のように書けばいい感じになりました。

あとは、Tutorialに書いているようにmessages.xmlとfindbugs.xmlと必要であればmessages_ja.xmlを 書いてあげてjarファイルにでもしてあげて、Findbugsのpluginフォルダに入れて 実行してあげれば、チェックを追加してあげることができます。

import edu.umd.cs.findbugs.BugInstance;
import edu.umd.cs.findbugs.BugReporter;
import edu.umd.cs.findbugs.MethodAnnotation;
import edu.umd.cs.findbugs.ba.XFactory;
import edu.umd.cs.findbugs.ba.XMethod;
import edu.umd.cs.findbugs.bcel.OpcodeStackDetector;

public class BigDecimalDevide9Detector extends OpcodeStackDetector{
 private final BugReporter bugReporter;
 public BigDecimalDevide9Detector(BugReporter bugReporter) {
        this.bugReporter = bugReporter;
    } 
 @Override
 public void sawOpcode(int seen) {
        switch (seen) {
        case INVOKEVIRTUAL:
        case INVOKESPECIAL:
        case INVOKESTATIC:
            XMethod callSeen = XFactory.createXMethod(MethodAnnotation.fromCalledMethod(this));
            XMethod badMethod = XFactory.createXMethod("java.math.BigDecimal", "divide","(Ljava/math/BigDecimal;)Ljava/math/BigDecimal;", false);
            if (badMethod.equals(callSeen)) {
                bugReporter.reportBug(new BugInstance(this, "TUTORIAL_BUG", HIGH_PRIORITY).addClassAndMethod(this)
                  .addClassAndMethod(this).addSourceLine(this));
            }
        }
 }
}

本当は、もっと細かいロジックも書いてみたいのだけど、今後、いろいろとFindBugsのソースを 見ながらちょっとずつ見ていこうかなと思っています。

2012年10月13日土曜日

SVNKitでShowLogするサンプル

SVNKit(http://svnkit.com/)を利用してSVNのログ表示を実行してみた。 こんな感じで書けばいけるようである。
import java.io.File;

import org.tmatesoft.svn.core.ISVNLogEntryHandler;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNLogEntry;
import org.tmatesoft.svn.core.SVNURL;
import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager;
import org.tmatesoft.svn.core.internal.io.dav.DAVRepositoryFactory;
import org.tmatesoft.svn.core.internal.io.fs.FSRepositoryFactory;
import org.tmatesoft.svn.core.internal.io.svn.SVNRepositoryFactoryImpl;
import org.tmatesoft.svn.core.wc.SVNLogClient;
import org.tmatesoft.svn.core.wc.SVNRevision;
import org.tmatesoft.svn.core.wc.SVNWCUtil;


public class SVNLogSample {
 private static class LogEntryHandler implements ISVNLogEntryHandler{

  @Override
  public void handleLogEntry(SVNLogEntry arg0) throws SVNException {
   System.out.print(arg0.getDate());
//   System.out.print(arg0.getChangedPaths());
   System.out.print(arg0.getAuthor());
   System.out.println(arg0.getMessage());
  }
  
 }
 private static final String SVN_USER="svnuser";
 private static final String SVN_PASS="svnuserpass";
 public static void main(String[] args) throws SVNException {
  new SVNLogSample().execute();
 }

 private void execute() throws SVNException {
  System.out.println("start");
  init();
  ISVNAuthenticationManager auth = SVNWCUtil.createDefaultAuthenticationManager(new File("tmp"),SVN_USER,SVN_PASS,false);
  SVNLogClient lc = new SVNLogClient(auth,null);
  SVNURL targetUrl=SVNURL.parseURIEncoded("svn://xxxxxxx");
  ISVNLogEntryHandler handler = new LogEntryHandler();
  String[] path = new String[]{"/path1","/path1"};
  lc.doLog(targetUrl,path,SVNRevision.HEAD, SVNRevision.HEAD, SVNRevision.create(0), true, true, 50, handler);
 }

 private void init() {
  DAVRepositoryFactory.setup();
  SVNRepositoryFactoryImpl.setup();
  FSRepositoryFactory.setup(); 
 }
}

SVNKitでSvnDiffのサンプルコード

SVNKit(http://svnkit.com/)を利用してSVNDiffを実行してみた。
こんな感じで書けば実行できるようである。
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.UnsupportedEncodingException;
import org.tmatesoft.svn.core.ISVNLogEntryHandler;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNLogEntry;
import org.tmatesoft.svn.core.SVNURL;
import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager;
import org.tmatesoft.svn.core.internal.io.dav.DAVRepositoryFactory;
import org.tmatesoft.svn.core.internal.io.fs.FSRepositoryFactory;
import org.tmatesoft.svn.core.internal.io.svn.SVNRepositoryFactoryImpl;
import org.tmatesoft.svn.core.wc.ISVNDiffStatusHandler;
import org.tmatesoft.svn.core.wc.SVNDiffClient;
import org.tmatesoft.svn.core.wc.SVNDiffStatus;
import org.tmatesoft.svn.core.wc.SVNLogClient;
import org.tmatesoft.svn.core.wc.SVNRevision;
import org.tmatesoft.svn.core.wc.SVNWCUtil;
public class SVNDiffSample {
 private static class DiffStatusHandler implements ISVNDiffStatusHandler{
 @Override
 public void handleDiffStatus(SVNDiffStatus arg0) throws SVNException {
  System.out.print(arg0.getPath());
  System.out.print(":");
  System.out.println(arg0.getModificationType());
 }
}
 private static final String SVN_USER="svn_user";
 private static final String SVN_PASS="svn_pass";
 public static void main(String[] args) throws SVNException, UnsupportedEncodingException {
  new SVNDiffSample().execute();
 }
 private void execute() throws SVNException, UnsupportedEncodingException {
  System.out.println("start");
  init();
  ISVNAuthenticationManager auth = SVNWCUtil.createDefaultAuthenticationManager(new        File("tmp"),SVN_USER,SVN_PASS,false);
  SVNDiffClient lc = new SVNDiffClient(auth,null);
  SVNURL targetUrl=SVNURL.parseURIEncoded("svn://urlstring");
  ISVNDiffStatusHandler handler = new DiffStatusHandler();
  //lc.doDiffStatus(targetUrl, SVNRevision.create(revNo), targetUrl,SVNRevision.create(revNo),   true, true, handler);
  ByteArrayOutputStream bao = new ByteArrayOutputStream();
  lc.doDiff(targetUrl, SVNRevision.create(revNo), targetUrl,SVNRevision.create(revNo),       SVNDepth.INFINITY, true, bao);
  System.out.println("SIZE:"+bao.size());
  System.out.println(bao.toString("MS932"));
 }
 private void init() {
  DAVRepositoryFactory.setup();
  SVNRepositoryFactoryImpl.setup();
  FSRepositoryFactory.setup();
 }
}

GWTでCookieを扱う

GWTでCookieを扱ってみた。

クライアント側のコード
import com.google.gwt.user.client.Cookies; 

略
  Cookies.setCookie("COOKIE_NAME", edUserName.getText());

サーバ側でこれらを取得する場合
Cookie[] cookies = getThreadLocalRequest().getCookies();
 if (cookies != null) {
  for (Cookie cookie : cookies) {
 System.out.println(cookie.getName()+cookie.getValue());
 } 
}

2012年8月26日日曜日

AutoItを利用して定期的に処理を実行する

あるbatファイルの処理を10分に一回実行させたいなと思ったのですが、
標準のDOSコマンドではそれらしきものがなかったのでAutoItを利用してやってみた


下記がサンプルです。 10分に1回exec.batを起動するというのを100回繰り返す というサンプルです。 SW_HIDEを指定しているのは、画面を出したくないためです。

For $i = 1 to 100 Step 1
RunWait('exec.bat','.',@SW_HIDE)
sleep(1000*60*10)
Next
MsgBox(0, "情報","ループ終了")

2012年7月22日日曜日

GWTのCellTableで行選択をする

GWTのCellTableで行選択をする方法。 SelectionModelをCellTableに割り当てるという方法をとる
final SelectionModel gsm=new SingleSelectionModel();
celtable.setSelectionModel(gsm);
もしも複数選択可能なタイプならばSingleSelectionModelではなく MultiSelectionModelを利用する。
final SelectionModel gsm=new MultiSelectionModel();
celtable.setSelectionModel(gsm);
その後、プログラム内で選択行にするには下記のような感じになる。
//giはCellTableに表示されたオブジェクトをさします。
gsm.setSelected(gi, true);