วิธีสร้าง 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 มากกว่าตรงที่มันดูตรงไปตรงมากว่านี่แหละ

Call of Duty: Ghosts

Call of Duty: Ghosts เป็นภาคใหม่ล่าสุดของเกมซีรีย์ Call of Duty และเป็นภาคล่าสุดที่ได้รับการพัฒนาโดย Infinity Wardและผองเพื่อนครับ

ภาคนี้ reboot เนื้อเรื่องใหม่เลยครับ ไม่เกี่ยวกับ Call of Duty 1 -2, Modern Warfare 1-3 เลย แน่นอนว่าไม่มี Captain Price แล้ว เนื้อเรื่องกล่าวถึงอเมริกาที่ล่มสลายเพราะการโจมตีของ the Federation ที่เป็นการรวมตัวกันของประเทศในอเมริกาใต้ อเมริกาเลยตั้งหน่วย Ghosts ขึ้นมาปฏิบัติการลับในการขับไล่และทำลาย the Federation ออกไปจากประเทศอเมริกาครับ

ภาคนี้เป็นภาคที่ผมซื้อวันตั้งแต่วันแรกที่มันออกแล้วก็รีบเล่นมันจนจบในเวลาประมาณ 4 – 5 วัน (วันละฉากสองฉาก) ต่อไปนี้จะเป็นการรีวิวเฉพาะส่วน Single Player ที่เป็นจุดแข็งของเกมตระกูล Call of Duty มาตลอดนะครับ

สำหรับครึ่งเกมแรกนั้นต้องบอกว่าโอเคตามมาตราฐาน Call of Duty เลย หลายๆ ฉากแปลกใหม่ดี เล่นสนุก โดยเฉพาะฉากที่มีน้องหมา Riley อันนี้ผมว่าเจ๋งที่สุดแล้วครับ ฉากเปิดตัวแม้จะไม่เจ๋งเท่า Modern Warfare ภาคแรก แต่ก็ถือว่าดีกว่าภาค 3 มีของเล่นให้เล่นเยอะดีด้วย

แต่หลังจากนั้นจนจบเกมยัน end credit นี่เกมเฉยๆ มาก ไม่มีอะไรเลย เดินยิงไปเรื่อยๆ เนื้อเรื่องไม่สามารถบิ๊วอารมณ์ร่วมให้เรารู้สึกอินได้เลย ฉากเพื่อนตายก็เฉยๆ มีฉากขับรถถังอยู่ 1 ฉากที่ผมบอกตามตรงว่าสู้ฉากรถถังของ Call of Duty 1 ไม่ได้ด้วยซ้ำ -*-

พอเล่นจบผมว่าภาคนี้ห่วยครับ คือแย่กว่า MW 3 ที่แย่ที่สุดในตระกูล MW แล้ว อันนั้นแม้ game play จะไม่มีอะไรแปลกใหม่แต่เนื้อเรื่องที่ทรงพลังกับอารมณ์ร่วมมันยังได้อยู่ แต่ Ghosts ขาดทั้งเนื้อเรื่องและการสร้างอารมณ์ร่วมของเราในเกมครับ

ส่วนตัวผมชักเสียวๆ กับอนาคตของ Infinity Ward เพราะหลังๆ staff ระดับ head ออกไปหลายคนเลย ในขณะที่ Treyarch ก็ดีขึ้นๆ เรื่อยกับ Black Ops series

สรุป Call of Duty: Ghosts single player ผมไม่โดนอย่างแรง

ruby/python จัดการ command line arguments

มี server นึง (เขียนด้วย C/C++) ในบริษัทผมที่ผมต้องใช้งาน ต้องขอข้อมูลจากมันเป็นประจำ การที่จะเอา software เต็มๆ ไปขอข้อมูลจากมันบางทีก็เป็นเรื่องยุ่งยาก เขาก็เลยมีตัว test connection (เขียนด้วย C/C++ เช่นกัน) ไว้ทดสอบขอข้อมูลจาก server ตัวนั้นเพื่อดูว่ามันได้ข้อมูลไหม หรือเราลงถูกรึเปล่า ทีนี้ไอ้ตัว simple tool ตัวนี้มันใช้ยากพอดูเลย

$> ./runaction -s <server service> -h <server IP/Host> -e <encryption ไหม ตอบได้ yes/no> -p <server port> -f <file ใส่ชื่อ item ที่จะขอ>

จะเห็นว่าชื่อ parameter มันยาก แถมผมต้อง save ชื่อ item ที่จะขอลง file ถ้าจะขอหลาย item ก็ต้องเคาะบรรดทัดไปเรื่อยๆ แบบนี้

$> cat item.txt
facebook
oracle
ibm

แล้วก็ต้องใส่ item.txt ลงไปใน -f ข้างบน แล้ว server ก็จะส่งข้อมูลของ facebook, oracle และ ibm มาให้ แถมยังต้องใส่ env variable “ACTION_PATH” ไปที่ folder ของตัว simple tool นั้นอีก

ที่นี้ผมมีเรื่องที่จะต้องเปลี่ยน item บ่อยๆ เพื่อทดสอบอะไรบางอย่าง เลยอยากจะให้ใส่ชื่อ item ลงใน command เลยไม่ต้องไปสร้าง file เอง แถมทดสอบกับ server เดียวกันซ้ำๆ ก็ใส่ค่า default ไปเลย สรุป requirement ได้ดังนี้

  • ผมใส่ชื่อ item เป็น facebook,apple,vodaphone แล้วมันไปสร้าง file ชื่อ item ให้
  • มี default host, service, port, encryption ผมไม่จำเป็นต้องใส่ถ้าต่อกับ default server แต่ถ้าผมจะต่อกับ server ตัวอื่น ก็ต้องใส่ parameter อะไรไปในรูปแบบที่ง่ายกว่านี้
  • เฉพาะ item เป็น field ที่ต้องใส่เสมอ

Continue reading “ruby/python จัดการ command line arguments”