Netbeans vs Eclipse

ปกติงานของผมต้องเปิด project java ขึ้นมาลองแก้ลองรันโปรแกรมเพื่อเอาผลหรือ code ไปตอบลูกค้า ปกติผมก็ใช้ Eclipse แหละ เมื่อวานนึกได้ว่าลง Netbeans 8.0.2 ไว้นานแล้วก็ลองใช้มันทำงานหน่อยล่ะกัน

หลังจากเปิด Netbeans (ครั้งแรก) และ new project ขึ้นมา set up source code เสร็จ ก็นั่งจ้องมันอยู่สัก 2 นาที

ปิด Netbeans ลบ folder project ทิ้ง

เปิด Eclipse แล้วก็ใช้มันทำงานต่อไป…

วิธีสร้าง JSON Message ด้วย Java

ผมเขียนถึงวิธีการสร้าง JSON message บน Java ผ่าน entry นี้มาแล้วรอบนึง หลังจากนั้นผมก็ไปค้นเจอทีหลังว่าจริงๆ แล้ว Java มันสนับสนุน JSON โดยไม่ต้องพึ่ง 3rd Party lib แล้ว เลยมาแนะนำกันครับ

สิ่งที่ผมจะสร้างคือ JSON หน้าตาแบบนี้

{
   "service":"quote",
   "user":"plynoi",
   "symbols":["Nokia"],
   "fields":["BID","ASK","HIGH"]
}

ขอเปรียบเทียบกับวิธีใช้ 3rd Party ก่อน ตัวที่ผมเลือกเพราะ google เจออันดับแรกๆ คือ json-simple ซึ่งมันก็ใช้ง่ายๆ ตรงไปตรงมา doc อ่านง่ายดีมาก จะขอยกตัวอย่างตัดมาจาก entry Java อันนั้นอีกทีนะครับ

import org.json.simple.*;

private void createJSON(){

	JSONObject request_msg = new JSONObject();
	request_msg.put("service","quote");
        	request_msg.put("user","plynoi");

        	JSONArray itemArray = new JSONArray();
        	itemArray.add("Nokia");

        	JSONArray filterArray = new JSONArray();
        	filterArray.add("BID");
        	filterArray.add("ASK");
       	filterArray.add("HIGH");

        	request_msg.put("symbols",itemArray);
        	request_msg.put("fields",filterArray);
	
	//JSON message "request_msg" is ready to process
}

เทียบกับตัว Native ของ Java เองอย่าง JSR 353 แล้วส่วนตัวผมมองว่าที่ Java ให้มาอยู่แล้วยุ่งยากกว่าเยอะ แต่โชคดีที่ doc เขียนละเอียดดีโฮกๆ (แต่ก็อ่านยากกว่าเช่นกัน :p)

import javax.json.Json;
import javax.json.JsonObject;

private void createJSON(){

	JsonObject request_msg = Json.createObjectBuilder()
		.add("service","quote")
		.add("user","plynoi")
		.add("symbols",Json.createArrayBuilder()
                    		.add("Nokia")
               	 )
                	.add("fields",Json.createArrayBuilder()
                    		.add("BID")
                    		.add("ASK")
                    		.add("HIGH")
                	)
                .build();
	
	//JSON message "request_msg" is ready to process
}

จะไปใช้ตัวไหนก็แล้วแต่นะครับ ส่วนตัวผมชอบ simple-json มากกว่าตรงที่มันดูตรงไปตรงมากว่านี่แหละ

Java encoding French Language

เดือนก่อน ลูกค้าเจ้านึงในฝรั่งเศสส่ง issue มาว่า Sever ผม encode ภาษาฝรั่งเศสผิด แปลงตัว é กลายเป็น é ทั้งหมดเลย

สิ่งแรกที่ผมทำคือลอง Google ดูเกี่ยวกับปัญหานี้ ส่วนใหญ่เขาก็จะบอกกันว่าเป็นที่ encoding กันหมด

สิ่งที่สองที่ผมทำคือลอง test กับ server ผมเองว่ามันทำผิดจริงรึเปล่า เท่าที่ลองรัน test page หรือเขียน JavaScript มาลองดูมันก็แสดงผลเป็น é ตรงนี่หว่า -*- ถาม Dev ๆ ก็บอกว่าก็ส่งเป็น UTF-8 นะ สุดท้ายก็เลยลองถามลูกค้าไปว่า “เขาดึงข้อมูลจาก server ผมยังไง” ลูกค้าก็ให้โค๊ดประมาณแนวๆ นี้มา

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        //Create JSON POST 
        JSONObject request_msg = new JSONObject();
        request_msg.put("closure", "JAVA_CLIENT"); 
        JSONArray requestArray = new JSONArray();
        requestArray.add("language=France");
        request_msg.put("request", requestArray);

        try {
            PrintStream outt = new PrintStream(System.out, true, "UTF-8");

            HttpURLConnection urlConn = null;
            URL url = new URL("http://server:80/getdata");
            urlConn = (HttpURLConnection) url.openConnection();
            urlConn.setRequestMethod("POST");
            urlConn.setAllowUserInteraction(false);
            urlConn.addRequestProperty("Accept", "application/json,text/javascript, */*; q=0.01");
            urlConn.addRequestProperty("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.3");
            urlConn.addRequestProperty("Accept-Encoding", "gzip,deflate,sdch");
            urlConn.addRequestProperty("Accept-Language", "fr-FR,fr;q=0.8,en-US;q=0.8,en;q=0.4");
            urlConn.addRequestProperty("Content-Type", "application/json");
            urlConn.addRequestProperty("Connection", "keep-alive");
            // envoyer des params
            urlConn.setDoOutput(true);

            // poster les params
            PrintWriter paramWriter = new PrintWriter(urlConn.getOutputStream());

            paramWriter.print(request_msg.toString());
            // fermer le post avant de lire le resultat ... logique
            paramWriter.flush();
            paramWriter.close();
                        
            // Lire la reponse
            InputStream resp = urlConn.getInputStream();
            BufferedReader bufReader = new BufferedReader(new InputStreamReader(resp));
            String sLine;
            StringBuilder sb = new StringBuilder();
            String lineSep = "###";


            while ((sLine = bufReader.readLine()) != null) {
                sb.append(sLine);
                sb.append(lineSep);
            }

            out.println(sb.toString());

            // deconnection
            urlConn.disconnect();
            bufReader.close();
            out.close();
        } catch (Exception e) {
            System.out.println("Error " + e.toString());
            e.printStackTrace();
        }
    }

Code ข้างบนนี่จริงๆ ลูกค้าให้มาแค่ส่วนตัว HTTP ส่วน Sevlet ทั้งหลายนี่ผมเขียนเพิ่มเองเพื่อ Test ส่วน Logic การใช้ HttpURLConnection, PrintWriter, Buffer ทั้งหลายนั่นเอา code เขามา ส่วนการส่ง JSON ผมเลือกใช้ simple – json เพราะตอนนั้นไม่รู้ว่า Java support JSON แบบ native แล้ว
Continue reading “Java encoding French Language”