2012-03-19
GCALDaemonで繰り返しスケジュールが登録できないバグをなおす
Java | |
![]()
・ソース修正
$ cd path/to/GCALDaemon
$ vi dev/src/org/gcaldaemon/core/GCalUtilities.java
- 1214 // Set when - 1215 When startAndEnd = new When(); - 1216 startAndEnd.setStartTime(toDateTime(startDate)); - 1217 startAndEnd.setEndTime(toDateTime(endDate)); - 1218 entry.addTime(startAndEnd); - 1219 + 1220 boolean skipWhen = false; + 1221 if (start != null && end != null) { + 1222 Property rRule = event.getProperty(Property.RRULE); + 1223 if (rRule != null) { + 1224 skipWhen = true; + 1225 } + 1226 } + 1227 if (!skipWhen) { + 1228 When startAndEnd = new When(); + 1229 startAndEnd.setStartTime(toDateTime(startDate)); + 1230 startAndEnd.setEndTime(toDateTime(endDate)); + 1231 entry.addTime(startAndEnd); + 1232 }
・コンパイルし直す
$ javac -classpath .:lib/gcal-daemon.jar:lib/gdata-client.jar:lib/gdata-calendar.jar:lib/commons-httpclient.jar:lib/commons-logging.jar:lib/commons-codec.jar:lib/commons-lang.jar:lib/activation.jar:lib/logger.jar:lib/ical4j.jar:lib/mail.jar dev/src/org/gcaldaemon/core/GCalUtilities.java
・classファイル移動
$ mv dev/src/org/gcaldaemon/core/GCalUtilities.class lib/gcal-daemon/org/gcaldaemon/core/GCalUtilities.class
・jarを作り直す
$ cd lib/gcal-daemon
$ jar cvf gcal-daemon.jar $(find ./ -name "*.class")
これでなおた!
2010-03-27
チームラボ天下一武道会に参加した.
Java | |
![]()
参加したって言っていいのかわかんないけど,天下一武道会(http://www.team-lab.com/news/index.php?itemid=581)に参加してきました.
社内外問わず,なんか凄そうな人集めて速かったり短いコードを書いて競おうといった感じのコンテストでした.
今回のお題は,Javaだったので,todesking先生のコード見て勉強したいなーって思って行ったんですが,居ませんでした><
最近コードを殆ど書いてなかったので,久々に考えながら色々出来て楽しかった!
(その多くの時間をJavaのコンテナ検索に使ったとかはおいといて...)
クラスがいっぱいありすぎて,どれを使えばいいのかが3時間では把握しきれなかったですw
答え合わせをdiffを使わず,Excel上で目視して確認してて,最後まで気付かなかったのですが,
提出したコードだと,「0.00」と出力ファイルでは書かれてないといけないのが「0.0」とかになってて,diffするとかなり差が出る結果となってしまいました...
まぁでも,多分答えはあってたはずだからいいやとか自己満足してます.
提出したコード(インデントと改行は削除したものを提出しました):
import java.io.*; class cosine{ public static void main(String[] p){ int u=1002,d=502,i; int[][] im=new int[u][d]; String[] z=new String[d]; try{ BufferedReader r=new BufferedReader(new FileReader(p[0]));r.readLine(); String l=""; while((l=r.readLine())!=null){String[] el=l.split(",");im[Integer.parseInt(el[0])][Integer.parseInt(el[1])]+=1;} r.close(); PrintWriter o=new PrintWriter(new BufferedWriter(new FileWriter("out.csv"))); for(int ad=1;ad<d;ad++){ int as=0; for(int bd=1;bd<d;bd++){ int bs=0,sm=0; for(i=0;i<u;i++){ if(bd==1)as+=im[i][ad]*im[i][ad]; bs+=im[i][bd]*im[i][bd]; sm+=im[i][ad]*im[i][bd]; } double s=(sm/(Math.sqrt(as)*Math.sqrt(bs))); if(Double.isNaN(s))s=0.0; if(z[ad]==null)z[ad]=""; if(z[ad].length()>0)z[ad]+=","; z[ad]+=Math.round(s*100.0)/100.0; } o.println(z[ad]); } o.close(); } catch(Exception e){} } }
で,結果発表の後にtanakhさんのコードを見てたら,
実はPrintWriterでprintfが使えたらしい...
ので,その点を修正して正解データ多分出せてたのが以下のコード
import java.io.*; class cosine{ public static void main(String[] p) throws Exception{ int u=1002,d=502,i; int[][] im=new int[u][d]; BufferedReader r=new BufferedReader(new FileReader(p[0])); r.readLine(); for (String l="";(l=r.readLine())!=null;){ String[] el=l.split(","); im[Integer.parseInt(el[0])][Integer.parseInt(el[1])]++; } r.close(); PrintWriter o=new PrintWriter(new BufferedWriter(new FileWriter("out.csv"))); for(int ad=1;ad<d;ad++){ int as=0; for(int bd=1;bd<d;bd++){ int bs=0,sm=0; for(i=0;i<u;i++){ if(bd==1)as+=im[i][ad]*im[i][ad]; bs+=im[i][bd]*im[i][bd]; sm+=im[i][ad]*im[i][bd]; } double s=(sm/(Math.sqrt(as)*Math.sqrt(bs))); if(Double.isNaN(s))s=0.0; if(bd>1)o.print(","); o.printf("%.2f", s); } o.print("\n"); } o.close(); } }
上のソースファイルが800byteで,下のソースファイルが716byteくらいだった.
コンパイルしたら1.4KB前後でした.
実行速度は,コンテストで使われてたマシンだと7秒ちょいでした(全体ではかなり遅い方).
僕のは,変数名とか色々短くして姑息な手段を使ってこのサイズだったのですが,優勝したtanakhさんはインデントとか削除しないで,そのまま書いててクラスファイルが1.37kbくらい?だったので,すげーと関心してました.
しかも綺麗だし.
悔しかったので,次回なんかあったらもっと頑張ろうと思います.
まる.
2008-11-21
「net.java.sen.ja.JapaneseTokenizer is invalid」の解決策
Java | |
![]()
Apache Lucene 入門 ~Java・オープンソース・全文検索システムの構築
- 作者: 関口宏司
- 出版社/メーカー: 技術評論社
- 発売日: 2006/05/17
- メディア: 大型本
- 購入: 5人 クリック: 156回
- この商品を含むブログ (25件) を見る
OSを入れなおしてからLuceneの環境構築をしてなかったので、関口さんのLucene本を自前で購入(以前はバイト先のを借りてたのでw)したついでに環境構築をしてた際にハマったメモ。
net.java.sen.ja.JapaneseTokenizer is invalid
初期設定が終わって、さてテストだーって思ったらこんなエラーが出てた。
まぁコレって要するに辞書が可笑しいってコトらしいんですが、最初は分からなくてなんでやー!!って思ってうなってた。
で、Senの辞書を一回削除して再生成したらあっさり通ってしまったww
一日悩んでたボクがバカみたいでした・・・。
2008-09-23
document.elementFromPointって
JavaScript, Java, 雑記 | |
![]()
Firefoxでは3からしか実装されてないのか…。
残念賞ー!111
- 作者: 赤坂玲音
- 出版社/メーカー: 毎日コミュニケーションズ
- 発売日: 2006/07
- メディア: 単行本
- クリック: 10回
- この商品を含むブログ (4件) を見る
久々に"プログラミング言語の本"を買った。
言語の勉強というよりも、Swingの逆引き辞書代わりなんですが。
amazonの評価はかなり悪いっぽいけど、直感で辞書には丁度いいかなーって思って買ってみました。
そろそろ結城さんのデザパタの本もほしいなぁ。
*追記
この本、とりあえずお気に召さなかった。
パッと見ていいなーって思ったんだけど、こんな一文が
通常、JComponentクラスを継承した新しい軽量コンポーネント上に必要な図形を描画〜中略〜。この方法は後述するので、この場ではJFrameクラスの背景に図を描画します。ただし、特別な理由がない限りこの方法は推奨されません。
じゃあ最初からそう書いてくれ…orz
今日はネットの知り合いの方と新検見川のカレー屋に行ってきました。
中々に上手かったので、布教して行こうと思いますw
2008-09-18
16進数のデータを32進数で圧縮!
Java | |
![]()
16進数(0-9,A-F)を36進数(0-9,A-Z)に圧縮させようと思ったんだけど、36進数だとキリが悪いので32進数(0-9,A-V)にして圧縮してみた。
圧縮してみたと書いたけど、実際どの程度効果あるのかはわかんないw
MD5で受け取る値が16進数になってるんで、もう少し圧縮できないかな?という程度です。
public static void main(String[] args) throws NoSuchAlgorithmException {
String name = "たこ焼きハッちゃん";
byte[] messageArray = MessageDigest.getInstance("MD5").digest(name.getBytes());
byte checkByte = 32;
for (int i=0;i<messageArray.length;i++) {
System.out.print(Integer.toString( (~(~messageArray[i] | checkByte) & 0x3f), 36) );
}
}
圧縮前:4bc6ca5464b4a282534d39f8a4a548ed
圧縮後:b6ak4k22jdpo458d
こんな感じ。
ビット反転させて、32でANDかけて、NORで元に戻すと丁度桁あふれしない感じで動きました。
チェック用のビットを反転させてANDすればよかった。A∧~B
System.out.print( Integer.toString((messageArray[i] & 0xff), 16) );
素のMD5はこんな感じで出力。
ただ、上記のソースだと上位2ビット破棄してるんで、ここはちゃんとビットシフトでちょこちょこ見て行かなきゃいけないかなって思います。
Javaかけないから可笑しかったらゴメンナサイ><

use List::Util ’sum’;
my $moto = 19871024;
while($moto >= 10){
$moto = sum(split //, $moto);
}
print $moto;
因みにこの問題においては、最初の数を9で割ったあまりが最後の答えになるっていう数学の方式もあるらしいです。