Hatena::ブログ(Diary)

uncertain world

2012-03-19

GCALDaemonで繰り返しスケジュールが登録できないバグをなおす

| 21:07 | GCALDaemonで繰り返しスケジュールが登録できないバグをなおす - uncertain world を含むブックマーク GCALDaemonで繰り返しスケジュールが登録できないバグをなおす - uncertain world のブックマークコメント

・ソース修正

$ 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")

$ mv gcal-daemon.jar ../


これでなおた!

2010-03-27

チームラボ天下一武道会に参加した.

| 23:37 | チームラボ天下一武道会に参加した. - uncertain world を含むブックマーク チームラボ天下一武道会に参加した. - uncertain world のブックマークコメント

参加したって言っていいのかわかんないけど,天下一武道会(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」の解決策

| 04:00 | 「net.java.sen.ja.JapaneseTokenizer is invalid」の解決策 - uncertain world を含むブックマーク 「net.java.sen.ja.JapaneseTokenizer is invalid」の解決策 - uncertain world のブックマークコメント

Apache Lucene 入門 ~Java・オープンソース・全文検索システムの構築

Apache Lucene 入門 ~Java・オープンソース・全文検索システムの構築

OSを入れなおしてからLuceneの環境構築をしてなかったので、関口さんのLucene本を自前で購入(以前はバイト先のを借りてたのでw)したついでに環境構築をしてた際にハマったメモ。

net.java.sen.ja.JapaneseTokenizer is invalid

初期設定が終わって、さてテストだーって思ったらこんなエラーが出てた。

まぁコレって要するに辞書が可笑しいってコトらしいんですが、最初は分からなくてなんでやー!!って思ってうなってた。

で、Senの辞書を一回削除して再生成したらあっさり通ってしまったww

一日悩んでたボクがバカみたいでした・・・。

2008-09-23

document.elementFromPointって

| 01:32 | document.elementFromPointって - uncertain world を含むブックマーク document.elementFromPointって - uncertain world のブックマークコメント

Firefoxでは3からしか実装されてないのか…。

残念賞ー!111


ゲームプログラミングで学習するJava入門

ゲームプログラミングで学習するJava入門

久々に"プログラミング言語の本"を買った。

言語の勉強というよりも、Swingの逆引き辞書代わりなんですが。

amazonの評価はかなり悪いっぽいけど、直感で辞書には丁度いいかなーって思って買ってみました。

そろそろ結城さんのデザパタの本もほしいなぁ。

*追記

この本、とりあえずお気に召さなかった。

パッと見ていいなーって思ったんだけど、こんな一文が

通常、JComponentクラスを継承した新しい軽量コンポーネント上に必要な図形を描画〜中略〜。この方法は後述するので、この場ではJFrameクラスの背景に図を描画します。ただし、特別な理由がない限りこの方法は推奨されません。

じゃあ最初からそう書いてくれ…orz


今日はネットの知り合いの方と新検見川のカレー屋に行ってきました。

中々に上手かったので、布教して行こうと思いますw

2008-09-18

16進数のデータを32進数で圧縮!

| 20:01 | 16進数のデータを32進数で圧縮! - uncertain world を含むブックマーク 16進数のデータを32進数で圧縮! - uncertain world のブックマークコメント

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かけないから可笑しかったらゴメンナサイ><

MAS3MAS3 2008/09/19 20:45 モジュールを使っても良ければList::Utilにsumというのがあります。

use List::Util ’sum’;

my $moto = 19871024;
while($moto >= 10){
$moto = sum(split //, $moto);
}
print $moto;

rin1024rin1024 2008/09/19 23:51 おぉ!そんな便利なのがあったんだ…。ありがとうございます!
因みにこの問題においては、最初の数を9で割ったあまりが最後の答えになるっていう数学の方式もあるらしいです。