ログ日記

作業ログと日記とメモ

windows用のjava環境

cygwin+javaで検索したら沢山出てくるが、自分用メモとして。


cygwinは d:\cygwin にインストール済。
java
http://java.sun.com/javase/downloads/index_jdk5.jsp
ここからダウンロード。(なんか日本語サイトはリンクが繋がらなかったので)


カスタムインストールでディレクトリを d:\cygwin\usr\local\java\jdk1.5.0_15\ などに指定。


cygwinの.bashrcなどで PATH に /usr/local/java/jdk1.5.0_15/bin を追加。
私の場合は

alias javac="javac -source 1.4"

が必要なのでこれも追加。無名クラスとか間違って使わないためね。


あとはJAVA_HOMEの設定

export JAVA_HOME=/usr/local/java/jdk1.5.0_15


クラスパスなどは何もしなくても大丈夫だった。



emacsの設定。

(add-hook
 'java-mode-hook
 '(lambda ()
    (setq tab-width 4
          c-basic-offset 4
          c-hanging-comment-ender-p nil
          indent-tabs-mode nil)
    )
 )
class test
{
    static public void main(String args[])
        { // ←ここのインデントがおかしい気がする
            System.out.println("Hello");
        }
}

インデントが変だ。後で調べる。

文字列を入れ替える関数

twitterで見かけたので真面目に考えてみる。

引数で渡された2つの文字列(s1,s2)の中身を入れ替える関数を作りなさい。

http://d.hatena.ne.jp/tek_koc/20080518/1211095764

意図はなんだろう。
単純に数値を入れ替える関数の文字列版でいいのかな。

#define MAX 15
void strchange(char s1[], char s2[])
{
    char tmp[MAX];

    strncpy(tmp, s1,  MAX);
    strncpy(s1,  s2,  MAX);
    strncpy(s2,  tmp, MAX);
}

tmpを使って処理しなさいということならこれで良さそう。分解すると

#define MAX 15
void strchange(char s1[], char s2[])
{
    char tmp[MAX];
    int i;

    for (i = 0; i<MAX; i++){
        tmp[i] = s1[i];
    }
    for (i = 0; i<MAX; i++){
        s1[i] = s2[i];
    }
    for (i = 0; i<MAX; i++){
        s2[i] = tmp[i];
    }

}

こんな感じなのかな。
\0 があるかないかに関わらず動くので安全。
でもMAXが微妙だ。それを直すついでにfor文もまとめると

void strchange(char s1[], char s2[], int size)
{
    char tmp;
    int i;

    for (i = 0; i<size; i++){
        tmp = s1[i];
        s1[i] = s2[i];
        s2[i] = tmp;
    }
}


こうなる。
サイズを受け取る引数は無しなんだろうか。それは困る。
意外にむずい。


というかこれはポインタを使うという問題?コメントでもポインタ使ってるしなぁ。
ポインタを使えという意図なら機械的に置換で。

void strchange(char *s1, char *s2)
{
    char tmp;
    int count = 0;

    while(count != 3){
        tmp = *s1;
        *s1 = *s2;
        *s2 = tmp;

        if (*s1 == '\0')
            count |= 1;
        if (*s2 == '\0')
            count |= 2;
        s1++;
        s2++;
    }
}

(追記) コメントより。汎用的な関数と考えた場合に、長さが違うと短い方の変数の範囲を超えて入れ替えるのでこれは駄目ですね。ヘンテコなビット演算を使ってるし採点もしにくいので、解答には不向きだ。


長さが決まっていない場合はフラグ使わないとループ抜けれない気がしてきた。段々斜め上の方向に行ってしまう。
巡り巡って、素直に元日記の解答でいいのかもわからん。


ポインタの問題じゃなければ *(s1+i) より s1[i] と書いてくれる方が採点も楽なんだけれど。

 *(temp+i)=*(s1+i);

こことか、配列として宣言した変数にiを足してるところもちょっと気になる。

コンパイラとWeb

合わせて読みたい、を読んでみた。


読んでると感心してしまって、結局要点が分からなくなってしまったので抜粋する。

  • 「初心者にとって何が必要か」という話において
  • 難易度は文書だけに頼って一人で行った場合とする
  • コンパイラ → もっとも簡単なもので5辛
  • Web → 最も簡単なもので甘口
  • 本格的に Web プログラミングするのは、余りおすすめできない
  • Web プログラミングの世界ってのは、全体的に程度が低い
  • Web プログラミングってのが、余り面白くない
  • もしも「 Web プログラマーの程度は低くない」と思う Web プログラマーがいるのなら、ぜひ言葉ではなく、行動で私の主張を打破してもらいたい
  • つまり、 Web プログラミングを例えばコンパイラと同程度に知的な分野にしていただきたいのだ
http://d.hatena.ne.jp/scinfaxi/20080517/1210970917
  • Webプログラミングは程度が低いというよりも敷居が低いのは間違いない
  • フレームワークと呼ばれているものだって、テンプレートエンジンにしたって、ほとんどコンパイラと変わらない
  • 必要なのはサービスが落ちない工夫であって、それは一度起動したら何万時間も正常に動作しないといけない
  • 丸一年なんの問題もなく動くサービスというのは簡単なようでとても難しい
  • コンパイラやゲームのように、起動のたびにメモリ空間が再構築されるプログラムと違い、Webの世界は一度メモリに書いたら、原則としてデータ構造を変えられないわけで、設計時の緊張感というのは相当なものがあります
  • コンパイラの動作時間なんてせいぜい50時間くらいが最長ではないかと思うのですが、処理するものも明確化されているし、仮にメモりが一杯になったら「メモリオーバーフロー」とかやる気のないエラーを出せばプログラマが自分でなんとかしてくれる
  • どちらにせよ、ひとつの技術に特化していくと、それなりに味があるというか、深みが出てくる
  • なんでも面白がってやれるほうが、面白がれない人よりもずっと幸福
http://d.hatena.ne.jp/shi3z/20080518/1211093808

これらが本当に要点かどうかは分からないが、自分の中で気になった一文まとめ。



引っかかったのは、どうして

  1. Web プログラミングの世界ってのは、全体的に程度が低い
  2. 本格的に Web プログラミングするのは、余りおすすめできない

となるのだろう。
周囲の程度が低ければ自分が優位に立てるということにはならないだろうか。いくら掘り下げても何も出てこないよっていう認識なんだろうか。


webの方は境界が曖昧だよね。サーバもひっくるめてwebプログラミングと言っているんだったら、それは当然ながらやることは膨大にある。
web用プログラミング言語だけについて言っているなら、それほど深くはないだろう。



学術系に居る人は、知的なことが好きなんだろうなーとぼんやり思った。