2013年3月28日木曜日

Google App Engine for Java

GAEを使いServletを動作させてみた。
Webアプリケーションが予想していたよりも、簡単にできたのはとても意外でありEclipseの偉大さも改めて感じた。

ちょこっとしか弄っていないがこれからどんどん弄ろうかなと思う。

サンプルとして

import java.io.IOException;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@SuppressWarnings("serial")
public class H0tcakeAP1Servlet extends HttpServlet {
 //GETで呼ばれたときに呼ばれる。
 public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
  resp.setContentType("text/plain");
  resp.getWriter().println("http://h0tcakeap1.appspot.com");
 }
 //データがポストされたときに呼ばれる
 public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
  resp.setContentType("text/plain");
  
  String para=req.getParameter("api");//POSTされたパラメータ(api)を取得
  resp.getWriter().println(selector(para,req));
 }
 //リクエストによってAPIを判別
 private String selector(String para,HttpServletRequest req){
  if(para==null){
   return "null";
  }
  String respons=null;
  if(para.equalsIgnoreCase("ipaddress")){
   respons=req.getRemoteAddr();//グローバルIPアドレスを取得
  }else{
   respons="null";
  }
  
  return respons;
 }
 
}


データをポストするとdoPostが呼ばれるんだと知った。
実際に公開してみたが目に見える範囲はほとんどHTMLファイル。。。。

http://h0tcakeap1.appspot.com

内容としてはグローバルIPアドレスを取得できるものを作った。

サンプルコード

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

public class H0tcakeAP1TEST {

 /**
  * @param args
  * @throws IOException 
  * @throws MalformedURLException 
  */
 public static void main(String[] args) throws MalformedURLException, IOException {
  URLConnection uc= new URL("http://h0tcakeap1.appspot.com/h0tcakeap1").openConnection();
  uc.setDoOutput(true);
  OutputStream os = uc.getOutputStream();
  PrintStream ps = new PrintStream(os);
  ps.print("api=ipaddress");
  ps.close();
  //受信
  InputStream is = uc.getInputStream();//POSTした結果を取得
  BufferedReader reader = new BufferedReader(new InputStreamReader(is, "utf-8"));
  StringBuffer sb= new StringBuffer();
  String temp=null;
  while ((temp = reader.readLine()) != null) {
   sb.append(temp);
  }
  reader.close();
  
  System.out.println("IP Adress:"+sb.toString());
  
 }

}


雑記:
MacTypeというフォント関係のソフトをインストールしてみたが素敵だった。

2013年3月5日火曜日

壊れたMP3を少し治す

前に自作したダウンローダを利用して保存していたmp3データが壊れていた。

理由はダウンローダにバグがあり、ところどころに0が入っていてノイズになる。
mp3の構造を調べないといけないのかなと思いつつ、とりあえず0を除くプログラムを組んだ。
ちょっとだけましだった


import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class Repair {

 private File file;
 private int checkByte = 5;
 private int checkByte2 = 4;

 public Repair(File file) {
  this.file = file;
  if (!this.file.isFile())
   this.file = null;
 }

 public Repair(String file) {
  this.file = new File(file);
  if (!this.file.isFile())
   this.file = null;
 }

 public long execute() throws Exception {
  System.out.println("Repair");
  if (file == null)
   return -1;
  long start = System.currentTimeMillis();
  FileInputStream fis = new FileInputStream(file);
  File repair = new File(file.getAbsoluteFile() + ".repair.mp3");
  int d = 0;
  while (repair.isFile()) {
   repair = new File(file.getAbsoluteFile() + "." + Integer.toString(d++) + ".repair.mp3");
  }
  FileOutputStream fos = new FileOutputStream(repair);
  int ocount;
  int counter = 0;
  boolean skip = false;
  boolean wait = false;
  Integer ch;
  byte[] zerobuf = new byte[checkByte];
  byte[] buf = new byte[checkByte2];
  int zerosize = 0;
  int bufsize = 0;
  boolean first = true;
  while ((ch = fis.read()) != -1) {

   /////////
   if (first) {
    if (skip)
     if (ch != 0) {
      skip = false;
      first=false;
     }
    if (first)
     if (!skip) {
      if (ch == 0) {
       wait = true;
      } else {
       wait = false;
      }
      if (wait) {
       zerobuf[zerosize++] = 0;
       if (zerosize == checkByte) {
        //System.out.print("skip");
        skip = true;
        zerosize = 0;
       }
      } else {
       fos.write(ch);
       if (zerosize != 0) {
        fos.write(zerobuf, 0, zerosize);
        zerosize = 0;
       }
      }
     }
   }

   if (!first) {
    if (skip)
     if (ch != 0) {
      skip = false;
     }

    if (!skip) {

     buf[counter] = ch.byteValue();
     //System.out.println("byte"+buf[counter]);
     //System.out.println("\tInt->"+ch);
     //Thread.sleep(500);
     if (counter++ == checkByte2 - 1) {
      counter = 0;
      ocount = 0;
      for (int i = 0; i < checkByte2; i++) {
       if (buf[i] == 0) {
        ocount++;
       }
      }
      if (ocount == checkByte2) {
       //System.out.println("0 skipを見つけました");
       skip = true;
      } else
       fos.write(buf);
     }
    }

   }
  }
  fos.close();
  fis.close();
  return System.currentTimeMillis() - start;
 }

}

2013年3月4日月曜日

JFrame パネルの色を変更


getContentPane#setColor(new Color(0xFFFFFF));

JPanel panel = new JPanel();
panel#setColor(new Color(0xFFFFFF));

2013年3月1日金曜日

プログラムの多重起動を防止

参考になった
http://okwave.jp/qa/q2030088.html

キーワードとしてはミューテックスかな