トップ 最新 追記

Onion開発日記

2004|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|

ToDo:


2007-03-05

_ [その他]花粉症

今日は暖かくて風が強いせいか、花粉がかなり飛び交っているらしく、花粉症の症状がなかなかひどい。鼻水が次から次へと出てきてきりが無い。

本日のリンク元 | 37 | 35 | 16 | 15 | 15 | 13 | 12 | 11 | 11 | 11 | TrackBack(0)

2007-03-06

_ [Onion]ソースいじり

ものすごーーーーーーーーく久しぶりに、Onionの開発を再開。とりあえず、自分でもだいぶソースコードの構成を 忘れているので、まずは当たり障りの無い部分から修正していくことに。コンパイル時に出力ファイルの生成に途中で失敗した場合に、生成したファイルを 削除するように修正した。

_ [研究]PPL2007発表練習

PPL2007のショートプレゼンの発表練習を研究室の教官と先輩、友人に見てもらった。発表時間がたった5分間なので、何を説明して何を省略すべきかが難しい。

本日のツッコミ(全3件) [ツッコミを入れる]

_ ささだ [おお、PPL2007。いいなぁ。]

_ しゅ [急遽行くことに>PPL2007]

_ みずしま [>ささださん 今からでも遅くないので(ry。いや、嘘ですが。 >しゅ さん おお。当日お会いしたらよろしく..]

本日のリンク元 | 320 | 65 | 47 | 36 | 36 | 23 | 23 | 21 | 20 | 19 | TrackBack(0)

2007-03-10

_ [その他]帰還

PPL2007から帰還。色々感想はあるが、とりあえず疲れた。片道約6時間の道のりは遠い。今日はさっさと風呂入って寝よう。

本日のリンク元 | 154 | 41 | 38 | 37 | 28 | 26 | 24 | 23 | 22 | 20 | TrackBack(0)

2007-03-14

_ [その他]確定申告

去年の今頃は、確定申告のためにわざわざ自転車で土浦まで行って、迷いまくって大変だったが、今年は友人が車を出してくれたおかげでスムーズに行ってくることができた。ありがたいことだ。

本日のツッコミ(全4件) [ツッコミを入れる]

_ M田 [Webで作ったのを印刷して郵送するだけでいいんでは?]

_ みずしま [それはそうなんですが、税務署の人に相談したいことが あったのと、直前まで書類を作成してなかったので(単なる 怠慢..]

_ M田 [郵送の場合は3/15必着じゃなくて3/15消印有効ですが...]

_ みずしま [そ、そうだったのですか。知らなかった…。 調べてみると、確かに消印有効ですね。 どうもありがとうございます。]

本日のリンク元 | 416 | 56 | 51 | 42 | 34 | 29 | 29 | 26 | 26 | 23 | TrackBack(0)

2007-03-21

_ [Java]マップ != ハッシュテーブル

odz bufferより引用:

主要プログラミング言語におけるハッシュテーブルの実装

  • JavaにおけるMap、HashMap、TreeMap、LinkedHashMap、Hashtable クラス(またはインタフェース)

ハッシュテーブル - Wikipedia

まて。Map は実装じゃないし、TreeMap はその名のとおり木だ。

Wikipediaのハッシュテーブルの項目書いた人は、キーと値を対応付ける抽象データ型(マップなどの名前で呼ばれる)と、それを実装するためのデータ構造の一つであるハッシュテーブルの区別がついてないんだろうなあ。というわけで、抽象データ型データ構造の区別は大事ですよ、と。

あと、メジャーなスクリプト言語(Perl, Rubyなど)で、マップのことをハッシュと呼ぶことが多いことも誤解に拍車をかけている気がする(別にこれらスクリプト言語の作者がこの辺のことを理解してないと思っているわけではない。念のため。たぶん、標準ではマップの実装がハッシュテーブルによるもののみであることが多いから、そう呼んでいるだけなのだと思う)。

本日のツッコミ(全3件) [ツッコミを入れる]

_ yach [人のことは言えませんぜ、旦那]

_ みずしま [過去にその辺を勘違いした発言したことがあったっけ? もしあったなら訂正するけど。]

_ yach [ただいまの判定に物言いが付きました 協議の結果、真犯人は、とあるPERLerではないかという結論に至りました 誤..]

本日のリンク元 | 152 | 47 | 39 | 32 | 31 | 20 | 20 | 19 | 19 | 19 | TrackBack(0)

2007-03-26

_ [Java]バカなプログラムを作ろう

きしだのはてなより:

で、今回は「int型の配列を並べ替えて表示」

つまり

print(new int[]{14, 13, 71, 2, 24, 19});
print(new int[]{3, 2});
print(new int[]{5});
print(new int[]{});
print(null);

とすると

2 13 14 19 24 71
2 3
5
空です
nullです

と表示するprintメソッド。

で、今回の制限は

  • while, if, switch, try, throws, 3項演算子は使わない
  • forは1回だけ。形は問わない。使わないほうがえらい
  • APIはjava.langの範囲で。System.out.println/print/printfはOKです。
  • できたコードが面白くなるなら上記の制約は無し。

とのこと。面白そうなので、自分も書いてみた。ソートアルゴリズムについては特に指定は無いが、とりあえずバブルソートでやることにする。メソッドはいくつ作っても良いようだが、それだと再帰を使えばどうとでもなるので、メソッドはmainメソッドとお題のprintメソッド以外は作らない事にする。

いきなり条件を満たすコードを書くのは面倒なので、まずは、ifやforを2つ以上使った、正攻法から。

import static java.lang.System.*;
public class SortPrint {
  static void print(int[] a) {
    if(a == null){
      out.printf("nullです%n");
      return;
    }
    if(a.length == 0){
      out.printf("空です%n");
      return;
    }
    for(int i = 0; i < a.length; i++){
      for(int j = a.length - 1; j > i; j--){
        if(a[j - 1] > a[j]){
          int tmp = a[j - 1];
          a[j - 1] = a[j];
          a[j] = tmp;
        }
      }
      out.printf("%d ", a[i]);
    }
    out.printf("%n");
  }
  public static void main(String[] args){
    print(new int[]{14, 13, 71, 2, 24, 19});
    print(new int[]{3, 2});
    print(new int[]{5});
    print(new int[]{});
    print(null);
  }
}

まずは一番内側の比較とswapを行っている箇所のif文を除去する。3項演算子が使えないので、&&演算子を使うことにする。Javaの場合、通常の演算子だけから成る式は式文になれないため、やや面倒だが、それ以外はさほど難しく無い。

  static void print(int[] a) {
    if(a == null){
      out.printf("nullです%n");
      return;
    }
    if(a.length == 0){
      out.printf("空です%n");
      return;
    }
    for(int i = 0; i < a.length; i++){
      for(int j = a.length - 1; j > i; j--){
        boolean c = a[j - 1] > a[j] && (t = a[j - 1]) == t
                                    && (a[j - 1] = a[j]) == a[j - 1]
                                    && (a[j] = t) == a[j];
      }
      out.printf("%d ", a[i]);
    }
    out.printf("%n");
  }

次に、null判定と配列の長さが0かどうか判定している箇所のif文を除去する。ここでは、return文を使っているため、上の例ほど直接的に置き換えることはできないが、基本的には同じ。

  static void print(int[] a) {
    boolean b = a == null && out.printf("nullです") != null 
                          && (a = new int[0]) != null
             || a.length == 0 && out.printf("空です") != null;
    int i = a.length;
    b = a != null && (i = 0) == i ;
    for(i = 0; i < a.length; i++){
      for(int j = a.length - 1; j > i; j--){
        boolean c = a[j - 1] > a[j] && (t = a[j - 1]) == t
                                    && (a[j - 1] = a[j]) == a[j - 1]
                                    && (a[j] = t) == a[j]
      }
      out.printf("%d ", a[i]);
    }
    out.printf("%n");
  }

最後に、内側のforループを除去して、終了。

  static void print(int[] a) {
    boolean b;
    b = a == null && out.printf("nullです") != null 
                  && (a = new int[0]) != null
      || a.length == 0 && out.printf("空です") != null;
    int i = a.length, j = 0;
    b = a != null && (i = 0) == i 
                  && (j = a.length - 1) == j;
    for(;i < a.length;){
      int t;
      boolean c;
      c = j > i && a[j - 1] > a[j] 
                && (t = a[j - 1]) == t
                && (a[j - 1] = a[j]) == a[j - 1]
                && (a[j] = t) == a[j];
      j--;
      c = j <= i && out.printf("%d ", a[i]) != null
                 && i++ != -1 
                 && (j = a.length - 1) == j; 
    }
    out.printf("%n");
  }

_ [Java]printfメソッドの返り値がthisである件

上のプログラムを作るために調べていて初めて知ったんだが、

java.io.PrintStream#printf(String format, Object... args)

の返り値って、そのPrintStream自身(this)だったのね。printとかprintlnの返り値がvoidだったから、てっきりprintfの返り値もvoidかと思ってた…。他にもformatやappendもthisを返すようだ。たぶん、

out.printf("public class %s {%n", class_name)
   .printf("  public static void main(String[] args) {%n")
   .printf("  }%n")
   .printf("}%n");

みたいな使い方をするためなんだろうなあ。

本日のリンク元 | 16 | 10 | 10 | 9 | 8 | 7 | 7 | 6 | 6 | 6 | TrackBack(0)

Mizushima Kota/e-mail: i021216{at}coins.tsukuba.ac.jp/SKype ID: mizu_standard