俺的 Java

Java ってのは結構美しい言語なのよふへふへみたいな意見っていうのは世の中で結構浸透してるような気がする。偏見かも。俺はわりと Generics 大好きだし、 ? 演算子も好きなんだけど、そういうのは Java 的には Java っぽいコードなんかなあ。
やあしかし、? 演算子ほど初見では嫌いで、慣れると好きになるもんは無いなあ。なんて楽なんだ。ああ、再帰も割とそうかも。? 演算子はプログラミング演習系の講義の課題程度のプログラムでよく使う。そういやあこの前後輩の課題見たら10進の入力から16進の出力せよ、とかあったなあ。こんなんかな。

#include <stdio.h>

#define hexchar(x) (x)<10?(x)+'0':(x)-10+'A'
void printhex(int x){
  if(x==0) return;
  printhex(x/16);
  putchar(hexchar(x%16));
}
int main(){
  int x=0, c;
  while((c=getchar()) && c>='0' && c<= '9'){
    x = x*10 + c - '0';
  }
  printhex(x);
  puts("");
  return 0;
}

うーん ? と再帰使ってますね。こんぐらい簡単な問題だと楽だ再帰も簡単だなあ。末尾再帰にできない問題だしねえ。つーか、こういう課題て超懐かしい。ナツい。

どこが Java の話なんだろう。Java の話をする。Graphics2D にね、 PathIterator ってクラスありますね。Graphics2D の Shape はみんな PathIterator 持ってんです。んで PathIterator ってみなさんご存知の通り、SEG_CLOSE, SEG_LINETO, SEG_MOVETO, SEG_CUBICTO, SEG_QUARDTO なセグメントの連続なんです。ここで Postscript をご存知の方は「おや?」と思うでしょうけど、これ全部 Postscript のパス作成する命令に対応してるんですよ。(QUARDTO はちょっと違うけど)
なんで、

public String getSegment(Shape s){
  PathIterator iter = s.getPathIterator(null);
  String segment = "newpath\n";
  double[] coords = new double[6];
  while(!iter.isDone()){
    int seg = iter.currentSegment(coords);
    switch(seg){
      case PathIterator.SEG_CLOSE:
        segment += " closepath\n";
        break;
      case PathIterator.SEG_LINETO:
        segment += coords[0]+" "+coords[1]+" lineto\n";
        break;
      case PathIterator.SEG_MOVETO:
        segment += coords[0]+" "+coords[1]+" moveto\n";
        break;
      case PathIterator.SEG_CUBICTO:
        segment += coords[0]+" "+coords[1]+" "+
          coords[2]+" "+coords[3]+" "+
          coords[4]+" "+coords[5]+" curveto\n";
          break;
          // CUBIC_TO, curveto はどちらも三次ベジエ曲線のこと
      case PathIterator.SEG_QUADTO:
        segment += coords[0]+" "+coords[1]+" "+
          coords[2]+" "+coords[3]+" "+
          coords[2]+" "+coords[3]+" "+
          " curveto\n";
          break;
          // これは適当。
          // 本当は QUARDTO は二次ベジエ曲線なので、
          // 次数上げをして curveto に渡せば良い。
       }
     iter.next();
    }
  }
  return segment;
}

こんな関数で Shape を Postscript のパスに変換できるんだよー。
ってのが、今回やってた Java 課題で得た一番の収穫、な気分。

Java ってこん程度でサーバー書けんのかー。楽しいなあ。これはエコーサーバー。めたくさ手抜き。手抜きっつか俺の現在のへぼい実力。

import java.io.*;
import java.net.*;

public class EchoServer{
  public static void main(String[] args) throws IOException {

    ServerSocket servSocket = null;
    try{
      servSocket = new ServerSocket(32731);
      System.out.println(servSocket);
    }
    catch(IOException e){
      System.err.println("Couldn't get the ServerSocket.");
      System.exit(1);
    }

    Socket clientSocket = null;
    PrintWriter cos = null;
    BufferedReader cis = null;
    try {
      clientSocket = servSocket.accept();
      cos = new PrintWriter(clientSocket.getOutputStream(), true);
      cis = new BufferedReader(new InputStreamReader(
            clientSocket.getInputStream()));
      System.out.println(clientSocket);
    }
    catch (IOException e) {
      System.err.println("Couldn't get the Socket.");
      System.exit(1);
    }

    String cinput;
    try{
      while ((cinput = cis.readLine()) != null) {
        System.out.println(cinput);
        cos.println(cinput);
      }
    }
    catch(SocketException e){
    }

    cos.close();
    cis.close();
    clientSocket.close();
  }
}

まあ、他の言語で書こうとしたことねえけどさあ。

test