วันพฤหัสบดีที่ 10 ธันวาคม พ.ศ. 2552

Java Swing Example

เก็บไว้หน่อย link นี้มีตัวอย่างการเขียน Java GUI ที่ใช้ดูเข้าใจง่ายดี :-)

http://academicjava.com/Java_help/Tutorial_Examples_Swing_0.html

ธนาคาร LCL #2

วันนี้ก็ได้ไปเจอผู้จัดการที่ดูแลบัญชีเราของธนาคาร LCL (ชื่อว่าคุณ Alexandra) ตามเวลานัด 9.30 น. ตอนเช้า วันพฤหัส ที่ 10 ธ.ค. 53 ไปถึงก็เห็น พี่แกนั่งทำงานอยู่ พี่แกให้เรารอก่อน ทุกครั้งที่มีนัดเจอ ไปถึงก็ต้องรอทุกทีเลย ไม่รู้ว่ามันจะจัดการ statement อะไรนักหนาวะ หลังจากที่รอ ประมาณ 5-10 นาที ก็ถึงเวลาได้ชี้แจงปัญหา

เริ่มต้นพี่แกก็อธิบายสาเหตุ ซึ่งเราก็รู้ตั้งแต่ไอพนักงาน(เวร)นั่นบอกเราแล้ว ซึ่งดูเหมือนพี่แกจะเข้าใจเราแฮะ หาวิธีแก้ปัญหาให้เราได้เงินคืน โดยการไปแอบเปลี่ยน profile เรา ให้เป็นลูกค้าแบบนักเรียน ที่อายุ < 26 ปี ทำให้เราได้เงินคืนเยอะกว่าเดิมด้วย แล้วมันก็บอกว่า "Normalement, on ne fait pas..." (แปลว่าปรกติเราไม่ทำแบบนี้ให้นะ)

เออ... แบบนี้ค่อยคุยกันได้หน่อย เริ่มยิ้มได้ :-) ไม่ใช่ rien fait (แปลว่าทำอะไรไม่ได้) !!

พูดถึงประโยคนี้ก็นึกไปถึงอีกเรื่องตอนที่ยืมบัตร fnac ของแฟนพี่เจี๊ยบไปซื้อกล้อง Nikon D90 ซึ่งบัตรมันลดได้ 10% แต่ไอเงิน 10% นั้นมันดันไปอยู่ในบัตร ไม่ได้เป็น เชคเิงินสด เราก็เลยต้องใช้บัตรนั้นไปซื้อของ พอจะจ่ายเงิน ไอคนขายมันก็บอกว่า ต้องเป็นเจ้าของบัตรเท่านั้นจึงจะใช้เงินนี้ได้ เวร... ทั้ง ๆ ที่ก่อนหน้านี้เราก็ถามพนักงานแล้ว พนักกงานก็บอกว่าไม่มีปัญหาอะไร เราก็บอกมันว่า ก็พนักงานบอกว่าได้นี่หว่า มันก็ยังยืนยันว่าไม่ได้.... fu..k!! ก็เลยบอกมันไปแบบโกรธ ๆ ว่า "แม่ง.. (คำนี้พูดในใจนะ) ถ้ามึงไม่ให้ใช้เงินในบัตร กูก็ไม่ซื้อ เพราะกูไม่มีเงินจ่าย และบอกอีกว่า เจ้าของบัตรอนุญาตแน่นอน มึงลองคุยโทรศัพท์ดูมั้ยละ" ในที่สุดมันก็ตกลง และ มันก็พูดว่า "Normalement, on ne fait pas..." เราก็รีบขอบคุณมัน merci beaucoup, c'est gentil (ขอบคุณมาก ๆ , คุณใจดีจัง) แต่ก่อนหน้านี้ ด่าแม่ มันในใจไปแล้วละ

ฝรั่งเศสมันก็มีอะไรแปลก ๆ เยอะเหมือนกันแฮะ ถ้าไม่โวยวายเนี่ย โดนเอาเปรียบตลอดแน่ ๆ ใครอยู่ที่นี่ ก็มั่นตรวจสอบ + หมั่นโวยวายกันหน่อยนะครับ กับฝรั่งเนี่่ย จะมาใช้นิสัยขี้เกรงใจแบบคนไทย คงโดนเอาเปรียบหลายอย่าง (แต่ก็ไม่ทั้งหมด)

กลับมาเรื่องธนาคารต่อ ก็เลยถามมันต่อเรื่องการคิดดอกเบี้ย ได้ข้อมูลมาว่าดอกเบี้ยของบัญชีฝากประจำ ( Compt Livret) ซึ่งถอนได้ตลอด คิดดอกเบี้ยแค่ 1% โดยคิดดอกเบี้ยให้ ปีละ 1 ครั้ง เราก็ไม่แน่ใจว่า ไอยอดเิิงินที่เราถอน ๆ ไปใส่บัญชีออมทรัพย์ (Compt Epargne) มันไม่ครบ 1 ปี ไม่รู้มันคำนวนอย่างไรเหมือนกัน

แต่สุดท้ายได้ข้อสรุปว่า มีบัญชื่อแบบอื่น ๆ ที่ได้ดอกเบี้ยถึง 5-6% ซึ่งยังไง เราก็ยังอยู่ที่นี่อีก 3 ปี เงินจมอยู่เกือบ ๆ ล้านบาท ยังไงก็คุ้ม ก็เลยนัดเปิดบัญชีใหม่อีกที วันอังคารที่ 5 ม.ค. 53 เวลา 14.00 แล้วจะมา update ให้ฟังอีกรอบนะจ๊ะ

วันจันทร์ที่ 7 ธันวาคม พ.ศ. 2552

ธนาคาร LCL !!

วันนี้ อารมณ์เสียแต่เช้า เพราะ เข้าไปที่ธนาคาร เพื่อไปสอบถามว่า ทำไมเดือน ธ.ค. 09 จึงคิดค่าบริการ 7.35 ยูโร ทั้ง ๆ ที่ปรกติแล้วมัน 4 ยูโร ก็ได้คำตอบว่า เพราะบัตร นร. หมดอายุ ก็เลยเอาบัตร นร. ไปให้มัน มันก็ถ่ายเอกสารเก็บไว้แล้วบอกว่า จะเริ่มราคา นร. เดือนหน้านะ ผมก็เลยถามมันว่า แล้วเดือน ธค. นี้จะได้ เงินส่วนต่างคืน ใช่มั้ย มันก็บอกว่า ไม่ได้ เพราะ เราเอาบัตรไปให้มันช้าเกินไป ระบบ มันตัดไปแล้ว ผมก็เลยบอกมันว่า ตัดแล้ว ก็คืนได้ ก่อนหน้านี้ก็เคยทำ มันก็บอกว่า เพราะผมไม่ได้เอาบัตรนร. มาให้มันก่อนเดือน ธค. และ มันก็พูดว่า Je rien faire!!.... สาด...ด แม่ง ของขึ้นเลยกู ก็เลยเสียงดังใส่มันเลย ทำหน้าโกรธเต็มพิกัด ลูกค้าคนอื่นก็ยืนรอคิวอยู่

จนสรุปความได้ว่า วันพฤหัส นี้ จะไปคุยกับกับผู้จัดการบัญชี ของผม อีกที เนี่ย ถ้าเป็นคนที่ไม่ค่อยรู้ระบบของที่นี่ ส่วนใหญ่เวลาเจอมันบอกว่า Rien faire แบบนี้ ก็โดนแดกค่าส่วนต่าง ไปแน่ ๆ ไอคนบริการก็แม่ง ไม่คิดจะแนะนำอะัไรเลย เดี๋ยววันพฤหัสนี้ แม่ง ถ้าไม่คืนเงินให้กรู กูจะปิดบัญชีกับธนาคารมึงไปเลย สาด.......ด ให้มันรู้มั่ง

blog นี้เขียนไว้ให้คนไทยที่อยู่ในฝรั่งเศสได้รู้ว่า ถ้าได้รับ service ที่เฮงซวยจากประเทศนี้ ก็ด่าแม่(ง) มันไปเลย อย่าไปยอมมันมาก ไอพวกห่านี้ยิ่งยอมยิ่งได้ใจ นี่ขนาดกูพูดฝรั่งเศสไม่ค่อยได้นะ เวลาด่าก็มีติด ๆ ขัด ๆ มั่ง แต่มันก็คงรู้แหละ ว่าด่ามันอยู่ อย่าไปยอมมัน

ปล.
1. บริการดี ๆ ของฝรั่งเศสดี ๆ ก็พอมี แต่มีน้อยกว่าบริการแบบเฮงซวย!!
2. อ้าว เฮ้ย ขนาดเขียน blog ยังของขึ้นเลย พระ!!

วันอังคารที่ 1 ธันวาคม พ.ศ. 2552

Copy Binary File Java


import java.io.*;

public class CopyFile{
private static void copyfile(String srFile, String dtFile){
try{
File f1 = new File(srFile);
File f2 = new File(dtFile);
InputStream in = new FileInputStream(f1);

//For Append the file.
// OutputStream out = new FileOutputStream(f2,true);

//For Overwrite the file.
OutputStream out = new FileOutputStream(f2);

byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0){
out.write(buf, 0, len);
}
in.close();
out.close();
System.out.println("File copied.");
}
catch(FileNotFoundException ex){
System.out.println(ex.getMessage() + " in the specified directory.");
System.exit(0);
}
catch(IOException e){
System.out.println(e.getMessage());
}
}
public static void main(String[] args){
switch(args.length){
case 0: System.out.println("File has not mentioned.");
System.exit(0);
case 1: System.out.println("Destination file has not mentioned.");
System.exit(0);
case 2: copyfile(args[0],args[1]);
System.exit(0);
default : System.out.println("Multiple files are not allow.");
System.exit(0);
}
}
}


Ref: http://www.roseindia.net/java/beginners/CopyFile.shtml

UDP Socket Client


package file;

import java.net.*;
//import java.util.StringTokenizer;

class TestList {

public static void main(String argv[]) {

A a = new A();
a.start();
}
}

class A extends Thread {

final static int port = 8532;
final static int taille = 1024;
final static byte buffer[] = new byte[taille];

public void run() {
try {
InetAddress serveur = InetAddress.getByName("147.127.240.91");

//------------ send request ------------------
String s = "Song Request";
int length = s.length();
byte buffer[] = s.getBytes();
DatagramPacket dataSent = new DatagramPacket(buffer, length, serveur, 8532);
DatagramSocket socket = new DatagramSocket();
socket.send(dataSent);

//---------- received response ---------------
DatagramPacket dataReceived = new DatagramPacket(new byte[taille], taille);
socket.receive(dataReceived);
String songListRecieved = new String(dataReceived.getData(), 0, dataReceived.getLength());


String songName[] = songListRecieved.split("\\|");

for ( String tmpStr : songName )
System.out.println("Data received : " + tmpStr.trim() );


// --------- choose song ---------------------
length = songName[1].length();
buffer = songName[1].getBytes();
dataSent = new DatagramPacket(buffer, length, serveur, 8532);
socket.send(dataSent);


} catch (Exception e) {
e.printStackTrace();
}
}
}

UDP Socket Server

package catalog;

import java.net.*;

public class CatalogServer extends Thread {

final static int port = 8532;
final static int taille = 1024;
final static byte buffer[] = new byte[taille];
private String queryStr;
String songList = new String("Black or White.mp3Love Piano.mp3La Fleur.mp3Le Bapteme.mp3Amour Mathematique.mp3");
int length;
byte buffer1[];
String selectedSong;

public String getSelectedSong() {
return selectedSong;
}

public void setSelectedSong(String selectedSong) {
this.selectedSong = selectedSong;
}


public static void main(String argv[]) {

CatalogServer cs = new CatalogServer();
cs.start();
}

public void run() {
try {
DatagramSocket socket = new DatagramSocket(port);


while (true) {
//---------- serv recv ---------------
DatagramPacket data = new DatagramPacket(buffer, buffer.length);
socket.receive(data);
queryStr = new String(data.getData(), 0, data.getLength());
System.out.println(queryStr);


// --------serv send ------------
if (queryStr.equals("Song Request")) {
length = songList.length();
buffer1 = songList.getBytes();
DatagramPacket dataSent = new DatagramPacket(buffer1, length,
data.getAddress(), data.getPort());
socket.send(dataSent);
}

//---------- recv song -------------
else {
// socket.receive(data);
// queryStr = new String(data.getData(), 0, data.getLength());
setSelectedSong(queryStr);
}

//System.out.println(data.getAddress());
}

} catch (Exception ex) {
ex.printStackTrace();
}
}
}

Java XML Parser

ตัวอย่างการเขียน Java กับ XML แบบ Dom กับ SAX

- SAX ใช้ง่ายกว่า ทำงานได้เร็วกว่า เพราะอ่านอย่างเดียว
- DOM ทำงานได้ยืดหยุ่นกว่า อ่านกลับไป กลับมาได้

แต่ผมเลือก SAX เพราะว่า ผมอ่าน xml element ไปเก็บใน bean แล้วเอาไปฝังใน collection อย่างพวก array list หรือ hash map ก่อน จากนั้น ไปดึงข้อมูลจากพวกนี้ จะง่ายกว่าใช้ dom มา walk เอา (เหนื่อยนะเนี่ย)

(ความเดิมตอนที่แล้ว: 3. Java-XML )

=> http://www.totheriver.com/learn/xml/xmltutorial.html

วันจันทร์ที่ 30 พฤศจิกายน พ.ศ. 2552

Photoshop JS Exif

การเรียกใช้ java script จาก photoshop CS 4

//**********************************************************************
// Java Script For Photoshop Modify By Svrnuke
// Author Nattapong Roadmuang
// Date 2008 June 14
// Note Microsoft Windows Vista
// Note Adobe Photoshop CS3
// http://svrnuke.multiply.com
//**********************************************************************

var docRef = activeDocument;
var strExifTitle = new Array("Model,","Exposure Time,","F-Stop,","ISO Speed Ratings,","Date Time Original,","Focal Length,");
var strExifData = new Array("","","","","","","");
var strCurrent = new String();
var TextLayer = docRef.artLayers.add();
TextLayer.kind = LayerKind.TEXT;
var txtRef = TextLayer.textItem;

var j = 0;
var i = 0;
for (i=0; i < docRef.info.exif.length; i++)
{
strCurrent = docRef.info.exif[i].toString();
for (j=0; j < 6; j++)
{
if ((strExifData[j] == "") && (strCurrent.indexOf(strExifTitle[j]) >= 0))
{
strCurrent = strCurrent.substring(strExifTitle[j].length,strCurrent.length);
strExifData[j] = strCurrent;
break;
}
}
}
if (strExifData[4] != "")
{
strExifData[6] = strExifData[4].substring(11, 16);
strExifData[4] = strExifData[4].substring(8, 10) + "-" + strExifData[4].substring(5, 7) + "-" + strExifData[4].substring(0, 4);

}
for(i=0;i<6;i++)
{
strCurrent = "";
for (j=0;j
{
if (strExifData[i].substring(j,j+1)== ",")
{
break;
}
strCurrent += strExifData[i].substring(j,j+1);
}
strExifData[i] = strCurrent;
}

// You can change yourname here
//var textStr = "http://wwarodom.multiply.com\u000D";
var textStr = "";
textStr += strExifData[0];
textStr += " ISO "+ strExifData[3] +" " + strExifData[1];
textStr += " "+strExifData[2]+" "+ strExifData[5];

txtRef.contents = textStr;
txtRef.size = "6";

-----------------


=> copy ลงใน C:\Program Files\Adobe\Adobe Photoshop CS4\App\Photoshop\Presets\Scripts
=> เรียกใช้จาก file -> Scripts -> browse -> เปลี่ยน file type เป็น .js
=> เลือก Text Tool เปลี่ยน ขนาด และ สี ตามใจชอบ

วันพฤหัสบดีที่ 26 พฤศจิกายน พ.ศ. 2552

วันพุธที่ 18 พฤศจิกายน พ.ศ. 2552

การทำ Script ย่อรูป

การย่อรูปลงเว็บ

รูปที่เราถ่ายมาโดยทั่วไปนั้นมักจะมีขนาดใหญ่ ก่อนเอามาโพสต์ลงเว็บจึงต้องทำการย่อขนาดให้เหมาะสมเสียก่อน ผมจึงทำตัวอย่างการย่อรูปมาให้ดูกัน 2 แบบก่อนน่ะ
แบบที่ 1 คือการย่อรูปตามปกติโดยการใช้คำสั่ง Image Size
หลังจากที่เปิดรูปที่จะย่อขึ้นมาก็ไปที่ Menu Bar เลือก Image > Image Size
แล้วเปลี่ยนพารามิเตอร์ Width เป็น 850px(สำหรับ Section Webboard อนุญาตให้กว้างไม่เกิน 850px) แล้วก็คลิ๊ก OK เท่านี้ก็เรียบร้อยครับ



by Webmaster [on 10-06-2009, 17:53]

Re : การย่อรูปลงเว็บ #1

ผลลัพธ์ที่ได้จากการย่อด้วยการใช้คำสั่ง Image Size



by Webmaster [on 10-06-2009, 17:56]

Re : การย่อรูปลงเว็บ #2

หลังจากนั้นก็ Save ด้วยคำสั่ง Save for Web โดยการไปที่ Menu Bar เลือก File > Save for Web
- เลือกชนิดไฟล์เป็น "JPEG"
- เลือกค่า Quality ของรูป ซึ่งค่านี้ไม่ควรเลือกเกิน 60 เพราะไฟล์ยังมีขนาดค่อนข้างใหญ่ เมื่อเลือกค่า Quality แล้วให้สังเกตวงสีแดงด้านล่างซ้ายที่มีเครื่องหมาย "*" ค่าดังกล่าวจะเปลี่ยนแปลงไปตามค่า Quality และค่าดังกล่างไม่ควรเกิน 200k ครับ หากค่าดังกล่าวมากกว่า 200k ก็ลด Quality ลงเป็น 50, 40 แล้วแต่ความเหมาะสมครับ หลังจากนั้นก็คลิ๊ก Save เป็นอันเสร็จสิ้นการ Save for Web



by Webmaster [on 10-06-2009, 17:57]

Re : การย่อรูปลงเว็บ #3

แบบที่ 2 เป็นการย่อรูปด้วยการใช้คำสั่ง Image Size ร่วมกับคำสั่ง Unsharp Mask

การย่อด้วยวิธีนี้มีหลายขั้นตอน ผมจึงอธิบายพร้อมกับการทำ Action ไปในตัวด้วยเพราะเมื่อทำเสร็จแล้วก็สามารถเรียกคำสั่ง Action มาย่อรูปได้ด้วยการคลิ๊กเพียงครั้งเดียว ว่าแล้วก็เริ่มกันเลย
- ไปที่ Menu Bar เลือก Window > Action
- คลื๊ก Create New Set(ที่เป็นรูปโฟลเดอร์)
- ตั้งชื่อ New Set(ในที่นี้ผมตั้งชื้อว่า Image size) แล้วคลิ๊ก OK



by Webmaster [on 10-06-2009, 17:58]

Re : การย่อรูปลงเว็บ #4

- คลิ๊ก Create New Action
- ตั้งชื่อ New Action(ในที่นี้ผมตั้งชื้อว่า 850px เพราะจะย่อให้เหลือขนาด 850px)
- คลิ๊ก Record



by Webmaster [on 10-06-2009, 17:59]

Re : การย่อรูปลงเว็บ #5

มาถึงขั้นตอนนี้จะเห็นว่าปุ่ม Begin Recording จะเป็นสีแดง หมายถึงกำลังบันทึกการทำ Action ในช่วงนี้ต้องทำขั้นตอนที่เกี่ยวกับการย่อรูปเท่านั้น อย่าคลิ๊กอย่างอื่น เพราะทุกคำสั่งที่เราทำจะถูกบันทึกทั้งหมด

รูปในตัวอย่างนี้มี ความกว้าง ยาวคือ 3872x2592px ผมจะทำการย่อลงให้เหลือด้านกว้าง 2500px ก่อน
- ไปที่ Menu Bar เลือกคำสั่ง Image > Image Size
- เปลี่ยนค่า Width เป็น 2500px แล้วคลิ๊ก OK



by Webmaster [on 10-06-2009, 18:00]

Re : การย่อรูปลงเว็บ #6

หลังจากนั้นเราจะทำให้รูปมีความคมชัดขึ้นด้วยการใช้คำสั่ง Unsharp Mask
- ไปที่ Menu Bar เลือก Filter > Sharpen > Unsharp Mask
- ใส่ค่า Amount = 200%
- ใส่ค่า Radius = 0.2 pixels
- ใส่ค่า Threshold = 0 Levels



by Webmaster [on 10-06-2009, 18:01]

Re : การย่อรูปลงเว็บ #7

ย่อด้วย Image Size แล้วทำให้รูปคมชัดขึ้นด้วย Unsharp Mask สลับกันไปด้วยค่าดังนี้

รอบที่ 1 / Image Size ---> 2500 Pixels / Unsharp Mask ---> amount = 200, Radius = 0.2, Threshold = 0 /
รอบที่ 2 / Image Size ---> 1500 Pixels / Unsharp Mask ---> amount = 200, Radius = 0.2, Threshold = 0 /
รอบที่ 3 / Image Size ---> 850 Pixels / Unsharp Mask ---> amount = 200, Radius = 0.2, Threshold = 0 /

เมื่อทำครบขั้นตอนดังกล่าว ก็คลิ๊กที่ Stop Recording เป็นอันเสร็จการทำ Action



by Webmaster [on 10-06-2009, 18:01]

Re : การย่อรูปลงเว็บ #8

เมื่อเรามี Action แล้วทีนี้การย่อรูปก็สามารถทำได้อย่างรวดเร็วด้วยการ
- เปิดรูปที่ต้องการย่อขึ้นมา
- ไปที่ Menu Bar เลือก Window > Action
- เลือก New Action ที่ต้องการทำ(ในที่นี้ชื่อ 850px)
- แล้วคลิ๊ก Play Selection(เป็นรูปสามเหลี่ยมเหมือนปุ่ม Play ทั่วๆ ไป)
- แล้วก็ Save for Web(ตามตัวอย่างใน คห.2)

ที่นี้เรามาดูผลลัพธ์กันบ้าง
รูป A เป็นผลลัพธ์จากการ Image Size จากด้านกว้าง 3872px ลงมาเหลือ 850px ในครั้งเดียว
ส่วนรูป B เป็นผลลัพธ์จากการ Image Size และ Unsharp Mask
จะเห็นว่ารูปที่ค่อยๆ ย่อลงและทำ Unsharp Mask ไปพร้อมๆ กันจะมีความคมชัดมากกว่า




Reference: http://www.chalaom.com/forum/?id=6

วันพุธที่ 4 พฤศจิกายน พ.ศ. 2552

Mac on PC

หลังจากที่เคยพยายามติดตั้ง Mac บน PC จริง ๆ โดยที่ไม่ผ่าน Virtual Machine ก็เจอปัญหาเกี่ยวกับ Driver หลายอย่าง รวมไปถึง Boot loader ด้วย วันนี้มีโอกาสได้ทดลองไฟล์ image ของ Mac บน VMWare 6.5 ก็สามารถใช้งาน Mac บน PC ได้แล้ว เป็น OSX Leopard version 10.5.5


แต่รู้สึกว่ามันอืดกว่า Windows 7 อีกแฮะ -_-"

วันอังคารที่ 3 พฤศจิกายน พ.ศ. 2552

Ubuntu 9.10 on Virtual Box

หลังจากห่างหายจากการใช้ Linux ไประยะหนึ่ง วันนี้ ก็เลย load virtual Box บน Windows XP มาติดตั้ง Ubuntu 9.10 บ้าง หน้าจอการติดตั้งก็ดูสวยงามขึ้น ติดตั้งก็ไม่ยากอะไร แป๊บเดียวเสร็จ แต่หลังจากนั้น พอจะเริ่มใช้งาน ปรากฎว่าเจ้า Ubuntu ตัวนี้ มันดันหา Driver ของ การ์ดจอ Nvidia ไม่เจอ เลยกำหนดขนาดจอได้แค่ 800x600 ใช้งานขัดใจมาก

ก็เลยแก้ปัญหาโดยการติดตั้งพวก Nvidia driver ต่าง ๆ ไม่ว่าจะเป็นพวก nvidia-glx-185, nvidia-xconfig, nvidia-setting และพวก dependency ของมัน แต่ก็ไม่สามารถจะใช้งานได้ ก็เลย ซ้ำร้ายไปกว่านั้นพอ restart เครื่องใหม่ จอกระพริบ ใช้งานไม่ได้เลย

ผมก็เลยหาข้อมูลเพิ่มใน internet ได้ความว่าต้องติดตั้ง VBoxGuestAdditions แต่ก็ยัง งงอยู่พักหนึ่งว่าไอเจ้า VBoxGuestAdditions เนี่ย มันอยู่ตรงไหน เพราะใน web ที่ให้ download virtual box ก็ไม่มีเจ้านี่ให้ download แต่จริง ๆ แล้วนั้น VBoxGuestAdditions มันติดมาอยู่แล้ว

วิธีการคือ ไปที่หน้าต่าง Virtualbox ที่เราลง Ubuntu (หลังจากที่เรา Boot เข้า Ubuntu ของเราเรียบร้อยแล้ว) จากนั้นเลือก menu Device -> Install Guest Additions (หรือกด Ctrl+D) มันก็จะ Mount CD-Rom ให้เราเรียบร้อย

จากนั้นสั่ง sudo /media/cdrom/VBoxLinuxAdditions.run

แล้วก็ restart เครื่องเป็นอันเสร็จครับ ได้ display ที่ resolution สูงแล้ว :-)

วันศุกร์ที่ 30 ตุลาคม พ.ศ. 2552

J2EE EJB OSGi

J2EE, EJB, OSGi อ่านมาตั้งนาน กว่าจะสรุปได้แบบนี้ -_-"

J2EE - Application Server Specification ที่สนับสนุนการทำ Load balancing, Transaction, Resource Polling และ Message Oriented Service

EJB - Component Architecture ที่ทำงานบน Application Server (ที่กล่าวข้างบน)

OSGi - Dynamic Modules (คิดง่าย ๆ ว่าเป็น jar ที่สามารถ deploy แบบ dynamic คือ start, stop ได้โดยที่ไม่กระทบกับ module อื่น ๆ )

วันพฤหัสบดีที่ 29 ตุลาคม พ.ศ. 2552

วันพุธที่ 26 สิงหาคม พ.ศ. 2552

วันจันทร์ที่ 27 กรกฎาคม พ.ศ. 2552

คุยเรื่อง MPLS


MPLS (MultiProtocol Label Switching) ส่วนใหญ่ใช้ใน Service Provider จุดประสงค์หลัก ๆ ของตัวนี้คือ การทำ Routing ที่รวดเร็ว โดยการทำ forwarding machanism ซึ่งได้จากติด Label ให้กับ packet ทำให้มีการ forward packet ได้เร็วกว่า แบบ traditional IP ซึ่งต้องมาเทียบกับตาราง routing table (จะทำงานช้า ถ้า routing table มีขนาดใหญ่) ส่วนการทำ QoS นั้นเป็นผลพลอยได้ หรือเป็นส่วนหนึ่ง ของ MPLS เท่านั้น (ไม่ใช่จุดประสงค์หลัก) MPLS ทำ ลูกเล่น ท่าต่างๆ ได้เยอะ

ปกติแล้ว เดิมเวลา ip routing ทำงาน มันต้อง lookup ใน routing table ซึ่ง เรียงเป็นหลายร้อยแถว ทำให้ต้องดู ไล่ตั้งแต่ 1 - บรรทัดที่ match แต่ พอเอาเข้ามาใน โลก MPLS มันเป็น label เหมือน ทำ index ให้มัน มันก็จะเร็วขึ้น ซึ่ง พวก forwarding ตอนใช้ label แล้ว มันจะทำ โดย Hardware แล้วมันจะเร็วกว่า

ถ้าใน service provider ที่มี internet routing เยอะๆ มาก ๆ แต่ถ้า routing น้อยๆ ไม่กี่สิบบรรทัด ก็ไม่จำเป็นเท่าไหร่ เพราะแทนที่จะเร็วขึ้น กลับต้องไปเสีย overhead เพิ่มในการแปะ label แทนมากกว่า

ท่าแปลกๆ ที่ทำงานได้อีก ก็เช่น MPLS VPN เช่น เรา เป็น provider แต่มี ลูกค้า A มีหลาย ๆ สาขา แล้วต้องการ Route ข้าม สาขา ให้แต่ละสาขา link ถึงกันได้ เมื่อก่อน อาจจะ ใช้ lease line แต่ MPLS มันเอา route proprogate ไปให้ได้

Traffic Engineering ก็ทำได้ ปกติ เวลา ip route best path มันจะคือ hop ที่สั้น แล้ว ถ้า routing วิ่ง มันก็จะวิ่งขาเดียว แต่ MPLS TE สามารถ utilize ได้ ให้บาง traffic วิ่งเส้นนึง ให้อีก traffic วิ่งอีกเส้น ทำได้

มีหลายท่า มันจะไม่เลือก best path อย่างเดียว เหมือน ip routing

พอทำ TE ก็มี Fast Reroute อีก ท่า Fast Reroute นี้ downtime 50ms ซึ่งต่ำมาก

MPLS เอามาตอบโจทย์ หลายๆ อย่างที่ traditional IP ทำไม่ได้ แต่จริงๆ พื้นฐาน อยู่บน ip routing เดิมทั้งนั้น

ท่ายากสุด ก็ MPLS TE + Fast Re route แล้วล่ะ เรื่องการ configure ควรจะมีพื้นฐานเกี่ยวกับ BGP มาก่อน

Credit: เม้ง
เรียบเรียง: pleX

วันจันทร์ที่ 29 มิถุนายน พ.ศ. 2552

Dell XPS M1330

เมื่ออาทิตย์ที่แล้ว Notebook Dell XPS ผมเจ๊ง หน้าจอแสดงเป็นแถบเส้น ๆ บางทีก็มืดไปเลย หลังจากหาข้อมูลในเน็ตอยู่นาน จึงทราบว่าเป็นปัญหาจาก Graphic Card โชคดีของผมที่ยังเหลือประกันอีก 1 เดือน แต่โชคร้ายคือ ผมอยู่ที่ฝรั่งเศส กว่าจะโทรไปเรียกช่างมาซ่อมได้ ผมเพิ่งทราบว่าผมจะต้องทำการ Transfer Services Tag จาก เมืองไทย ไปที่ฝรั่งเศสก่อน ซึ่งใช้เวลาประมาณ 1 สัปดาห์ หลังจากนั้นได้ Services Tag ใหม่แล้วจึงค่อยติดต่อไป

เฮ้อ... อุตส่าห์เลือก Dell ที่มีประกัน World Wide แล้ว แต่ต้องรอเปลี่ยน Service Tag อีก (โทรไปถามที่เมืองไทย ได้คำตอบว่า ถ้าซื้อ Dell ที่ประเทศอื่นแล้ว เข้ามาประเทศไทย ช่างจะไป Service ได้เลย แต่ที่นี่ต้องเปลี่ยน :( อดใช้ Notebook ไปหลายวันเลย )

ดังนั้น ใครที่ซื้อ Dell จากไทย และจะหิ้วมาใช้ที่ฝรั่งเศสนาน ๆ ผมแนะนำให้เปลี่ยน Service Tag ไว้ตั้งแต่เนิ่น ๆ จะได้ไม่ต้องรอซ่อมนะครับ

เปลี่ยนได้ที่ Link นี้ครับ =>
http://www.dell.com/content/topics/reftopic.aspx/pub/ccare/transfer_intl?c=us&cs=19&l=en&s=biz

ยังดี ที่ประกันยังไม่หมด

เบอร์โทรติดต่อ Dell ฝรั่งเศส: 08 25 38 71 29 (ไม่โทรฟรีด้วย)

วันพุธที่ 24 มิถุนายน พ.ศ. 2552

ความแตกต่าง that กับ which

That - "That" is used with restrictive phrases. Restrictive phrases are phrases that are essential to the sentence.

Which - "Which" is used with nonrestrictive phrases. Nonrestrictive phrases are phrases that states non essential information. A phase is nonrestrictive phase if the phase can be from the sentence.

Examples:

  • The shirt that you lent me is in my bag.
  • The shirt, which is red, is in my bag.
  • The house that I wanted to buy has been sold.
  • The house, which I didn't want to buy, has been sold.
  • The food store that I go to all the time is closed today.
  • The store, which is near my house, is not open today.
Ref: http://www.english-the-easy-way.com/Determiners/That_Which.htm

IPSec on Linux

How to use IPSec on Linux (in the same machine)

1. Create IPSec configuration file

root@vosges:/home/wwerapun/Desktop# cat ipsec.conf.esp.1
flush;
spdflush;
add 147.127.240.91 127.0.0.1 esp 2000 -E 3des-cbc "12341234abcdabcd12341234" -A hmac-sha1 "kamekamekamekamekame";
add 127.0.0.1 147.127.240.91 esp 2001 -E 3des-cbc "12341234abcdabcd12341234" -A hmac-sha1 "kamekamekamekamekame";
spdadd 147.127.240.91 127.0.0.1 any -P in ipsec esp/transport//require;
spdadd 127.0.0.1 147.127.240.91 any -P out ipsec esp/transport//require;

root@vosges:/home/wwerapun/Desktop# cat ipsec.conf.esp.2
flush;
spdflush;
add 147.127.240.91 127.0.0.1 esp 2000 -E 3des-cbc "12341234abcdabcd12341234" -A hmac-sha1 "kamekamekamekamekame";
add 127.0.0.1 147.127.240.91 esp 2001 -E 3des-cbc "12341234abcdabcd12341234" -A hmac-sha1 "kamekamekamekamekame";
spdadd 147.127.240.91 127.0.0.1 any -P out ipsec esp/transport//require;
spdadd 127.0.0.1 147.127.240.91 any -P in ipsec esp/transport//require;

--------------- Description ---------------------
flush = delete previous SAs
spdflush = delete previous SPD
add = add SA, SA is uni-directional, then you have to add 2 ways.
2000 = SPI (actually, it's any number, you have to specific in the same number from 2 machines)
spdadd = add SPD , any = encrypt any protocol,
notice that =>
"out" = packet out from 147.127.240.91 to 127.0.0.1
"in" = packet in (enter) from 147.127.240.91 to 127.0.0.1

2. Ask linux to use IPSec using setkey command:

root@vosges:/home/wwerapun/Desktop# setkey -f ipsec.conf.esp.1

root@vosges:/home/wwerapun/Desktop# setkey -f ipsec.conf.esp.2

3. Check the result:

root@vosges:/home/wwerapun/Desktop# setkey -D
127.0.0.1 147.127.240.91
esp mode=transport spi=2001(0x000007d1) reqid=0(0x00000000)
E: 3des-cbc 31323334 31323334 61626364 61626364 31323334 31323334
A: hmac-sha1 6b616d65 6b616d65 6b616d65 6b616d65 6b616d65

....

root@vosges:/home/wwerapun/Desktop# setkey -PD
127.0.0.1[any] 147.127.240.91[any] any
in ipsec
esp/transport//require
created: Jun 24 14:53:38 2009 lastused:
lifetime: 0(s) validtime: 0(s)


4. Test by using:

root@vosges:/home/wwerapun/Desktop# tcpdump src 147.127.240.91
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes


wwerapun@vosges:~$ ping -I eth0 127.0.0.1


The result should be =>

root@vosges:/home/wwerapun/Desktop# tcpdump src 147.127.240.91
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
15:46:01.811793 IP vosges.enseeiht.fr > localhost: ESP(spi=0x000007d0,seq=0xe), length 100
15:46:01.812070 IP vosges.enseeiht.fr.38577 > aquitaine.enseeiht.fr.domain: 27037+ PTR? 91.240.127.147.in-addr.arpa. (45)
15:46:01.813388 IP vosges.enseeiht.fr.60957 > aquitaine.enseeiht.fr.domain: 21218+ PTR? 123.80.127.147.in-addr.arpa. (45)
15:46:02.812633 IP vosges.enseeiht.fr > localhost: ESP(spi=0x000007d0,seq=0xf), length 100
15:46:03.823621 IP vosges.enseeiht.fr > localhost: ESP(spi=0x000007d0,seq=0x10), length 100
15:46:06.810131 arp reply vosges.enseeiht.fr is-at 00:22:19:12:0a:4b (oui Unknown)

...

IKE

There are 2 phases in IKE:

Phase 1: Create key that used in IPSec
- Diffie Hellman
- Pre shared key to encrypt session key
- Asymetric key

Phase 2: Use the key that previous created to encrypt SA for IPSec
- Note: SA is uni-directional, then it needs to create SA in 2 ways.

Diffie-Hellman Key Exchange

(a)^b^c = (a)^c^b = (a)^bc


A puts a session key in side the box, encrypt with Ka and sends to B

A ------------------ B

[]Ka ------------>
[] ---------------->

B gets the box, encrypts with Kb and sends to A

<------------[]Ka
<------------[]Kb

A gets the box, decrypts with Ka and sends to B

[] ------------->
[]Kb--------->

B gets the box, descrypts with Kb and get the session key.

----------------[]
----------------[]

วันจันทร์ที่ 22 มิถุนายน พ.ศ. 2552

Video Capture บน Unbuntu 8

ใช้ xvidcap ในการ configure
ถ้ากด run แล้วมัน segmentation fault ให้ลอง disable audio ออกไป

เวลาจะ capture หน้าจอคอมพิวเตอร์ ให้ใช้ อีกโปรแกรมช่วย
คือ # recordmydesktop /tmp/myComputer.mpeg
เวลาอัดเสร็จแล้ว ก็กด Control + C (กดครั้งเดียว แล้วมันจะ encoding video ให้)
ถ้าเผลอไปกด 2 ครั้ง ที่อัดมาก็หายไปเลย ระวังด้วยละ

Although / in spite of / despite

Although แปลว่า แม้ว่า ใช้เชื่อมประโยคที่ มีความหมายขัดแย้งกัน

ส่วนคำว่า In spite of มีความหมายเหมือนกับ Although ต่างกันที่ว่า In spite of ตามด้วย Noun ส่วน Although ตามด้วยประโยค

ตัวอย่าง
We went out although it was raining.

ส่วนคำว่า In spite of มีความหมายเหมือนกับ Although ต่างกันที่ว่า In spite of ตามด้วย Noun ส่วน Although ตามด้วยประโยค

ตัวอย่าง
In spite of
the rain, we enjoyed our holiday.


สุดท้าย Despite เหมือนกับ In spite of คือ ตามด้วย Noun แต่ต่างกันตรงที่ต้องมี of เข้ามาด้วย เขียนสั้นกว่า

ตัวอย่าง
She wasn't well, but despite this she went to work, (not 'despite of this')

คล้าย ๆ กับ Because / Because of นะแหละ
Because + ประโยค , Because of + คำนาม

Not only ... but also

การใช้ not only... but also นั้น มีความหมายว่า ไม่เพียงแต่.... แต่ยัง.... อีกด้วย

ซึ่งใช้สำหรับสร้าง คำนาม หรือ สรรพนาม ที่เชื่อมกัน (หรือถ้าเป็นประโยค ก็ต้องเป็นประโยค ทั้งคู่)
ซึ่งหลาย ๆ คนยังใช้ผิด กันอยู่ ลองดูตัวอย่างประกอบ

Wrong: He not only painted the "Annunciation" but also [painted] the "Mona Lisa."
Right: He painted not only the "Annunciation" but also the "Mona Lisa."

Wrong: He not only played for Washington but also for Detroit and Pittsburgh.
Right: He played not only for Washington but also for Detroit and Pittsburgh.

Wrong: He not only coached soccer but also tennis.
Right: He coached not only soccer but also tennis.

Right: He taught not only physics and chemistry but also algebra and geometry.

Right: He not only taught five periods a day but also coached three sports.

อย่าใช้ให้ผิดละ

วันพฤหัสบดีที่ 28 พฤษภาคม พ.ศ. 2552

QoS + PDP

QoS
-> Mobile Node in UMTS -> SGSN + GGSN
-> WLAN -> IEEE 802.11e


PDP = Packet Data Protocol
PDP = Packet Data Protocol หรือพูดง่าย ๆ ก็คือ โครงสร้าง packet ข้อมูล เช่นพวก IP, X.25 และ Frame Relay เป็นต้น ที่อยู่ที่ Serving GPRS Support Node (SGSN) และ Gateway GPRS Support Node (GGSN) ซึ่งจะเก็บ ข้อมูล session ของผู้ใช้งาน เมื่อผู้ใช้งานได้เข้ามาใช้งานในระบบ ก่อนที่ผู้ใช้ (mobile node) ต้องการที่จะใช้งาน GPRS ผู้ใช้จะต้อง เชื่อมต่อ เข้ากับระบบเครือข่าย และ ทำการ active PDP context ซึ่งการ activate PDP context ก็คือ การสร้าง โครงสร้าง packet ข้อมูล ใน SGSN ที่ผู้ใช้ กำลังใช้งานอยู่ในขณะนั้น และ GGSN จะคอยเก็บจุดที่ผู้ใช้ได้ทำการเชื่อมต่อกับระบบ

สรุปง่าย ๆ
PDP Context = IP Address ของ Mobile Node + QoS Profile ( e.g., maximum delay, jitter etc..)

วันอังคารที่ 19 พฤษภาคม พ.ศ. 2552

Charmap + Ascii

ปรกติแล้วผมเป็นคนที่พิมพ์ได้รวดเร็ว แต่พอมาอยู่ที่ฝรั่งเศส เจอ Layout Keyboard แบบฝรั่งเศสทำให้พิมพ์ช้าลงไปมาก แทบจะเรียกว่าจิ้มเลยก็ว่าได้ แต่ถ้าจะ switch กับมาใช้ Layout แบบ US. ก็จะติดปัญหาที่พิมพ์อักขระ บางตัว ของภาษาฝรั่งเศสไม่ได้ ก็เลยใช้วิธีพิมพ์จาก Ascii code ของมันซะเลย หมดเรื่อง
วิธีพิมพ์ตัวอักษร โดยใช้ Ascii code นั้นก็ง่ายนิดเีดียว เพียงแค่ กดปุ่ม Alt ค้างไว้ แล้วก็ตามด้วยรหัส Ascii

ดังตัวอย่าง ข้างล่าง =>

backquote = Alt + 96
a\ = Alt + 0224
a/ = Alt + 0225
c = Alt + 0231
e\ = Alt + 0232
e/ = Alt + 0233

หากอยากรู้เพิ่มเติมว่า Ascii ของอักขระพิเศษตัวอื่น ๆ คืออะไร สามารถดูได้จาก
โปรแกรม charmap ใน windows ได้เลยครับ

วันจันทร์ที่ 23 กุมภาพันธ์ พ.ศ. 2552

The Future Tenses

เริ่มจากภาษาอังกฤษก่อน คำว่า "จะ" มี 2 คำ คือ will กับ be going to
แตกต่างกันดังนี้

เราใช้ will เมื่อตัดสินใจว่ากำลังจะทำบางอย่างในขณะที่กำลังพูดอยู่ แต่การใช้ be going to เป็นการใช้เมื่อมีการเตรียมการล่วงหน้า
เปรียบเทียบการใช้
- " George phoned while you were out " " OK. I'll phone him back "
แต่ " George phoned while you were out " " Yes, I know. I'm going to phone him back "

หากเปรียบเทียบกับภาษาฝรั่งเศส
Will -> Futur Simple
Be going to -> Futur proche (Aller + Infinitif) วิธีจำง่าย ๆ ก็คือ aller แปลว่าไป ก็คือ going to ^_^

สรุปอีกครั้ง
Will -> ไม่คิดไว้ก่อน, คาดการไม่มีหลักฐาน => futur sim -> เกิดไกล ออกไป, สั่ง, ใช้กับภาษาเขียนมากกว่าพูด
going to -> วางแผนไว้ก่อน, คาดการมีหลักฐาน => futur proche -> เกิดเร็ว ๆ นี้, ตั้งใจจะทำ, ใช้กับภาษาพูดมากกว่าเขียน

ตัวอย่างเช่น
I will have a baby. -> J'aurai un enfant. (อาจจะมีลูกวันพรุ่ง หรือ วันอื่น ๆ อีกนาน ในอนาคต ไม่ได้วางแผนคาดคิดไว้ คือ มีลูกแน่ ๆ แต่ยังไม่รู้ว่าวันไหน อีกนานแค่ไหน)
I'm going to have a baby. -> Je vais avoir un enfant. (จะมีลูกเร็ว ๆ นี้แน่ ๆ วางแผนไว้แล้ว ไม่ได้ อาจมีหลักฐาน เช่นหลังจากไปพบแพทย์เสร็จ ก็พูดประโยคนี้ โดยใช้ Futur Proche ได้เลย )

ทิ้งท้าย
Futur proche -> aller -> be going to -> วางแผนไว้แล้ว เกิดเร็วนี้ ๆ
Futur simple -> will -> ไม่ได้วางแผนไว้ ระยะเวลาที่ จะทำ นานกว่า futur proche

วันพฤหัสบดีที่ 22 มกราคม พ.ศ. 2552

Packet Data Protocol (PDP)

Packet Data Protocol (PDP)

PDP ก็คือ protocol ที่ใช้ในการแลกเปลี่ยนข้อมูลระหว่าง User Equipment (UE) กับ Network เช่น P-CSCF ใน IMS โดยมีวัตถุประสงค์หลัก 2 อย่างคือ
1. กำหนด IPv4 / IPv6 Address ให้กับ Mobile terminal คล้าย ๆ กับ DHCP
2. กำหนด logical connection กับ QoS profile และกำหนดค่า parameter ต่าง ๆ เพื่อใช้ใน PDP Context ของ Mobile terminal ในเครือข่าย UMTS

วันพุธที่ 21 มกราคม พ.ศ. 2552

Quality of Services #2

มีบทความทางวิชาการเกีึ่ยวกับ QoS ออกมามากมาย โดยเฉพาะ IntServ กับ Diffserv แต่ ผมก็เพิ่งรู้ไม่นานมานี้เองว่า
  • IntServ ใช้วิธีการจองเส้นทางก่อนที่จะทำ QoS ซึ่งมีความยุ่งยากซับซ้อนมาก ซึ่งจะเอามา deployment ใช้งานจริง ๆ แบบ multi-domain ไม่ได้ พูดง่าย ๆ ก็คือ Intserv เป็น idea อย่างหนึ่งในการทำ QoS มีการ implementation จริง ๆ ที่สามารถนำไปใช้ได้ แต่ในโลกของ internet ปัจจุบันนี้ ไม่ได้มีการนำ Intserv ไปใช้งานแต่อย่างใด (นอกจากจะมีใครเอาไปใช้ส่วนตัว) หรือพูดง่าย ๆ ว่ามีเฉพาะ idea + implementation แต่ไม่มีการนำไป deployment
  • DiffServ ใช้วิธีการให้คะแนน โดยติด Tag (รวมถึงการ Mark ที่ ToS ของ IP header ด้วย) วิธีการนี้ไม่ซับซ้อนมาก มีการ deployment ไปใช้งานจริง แต่ก็เฉพาะ ระหว่าง ISP บางแห่งเท่านั้น user ตามบ้าน ๆ อย่างเรา ไม่สามารถกำหนดเองได้ โดยมีการ กำหนด policy ระหว่าง border router ด้วยกัน
ปิดท้าย:
อ่าน QoS มาได้ระยะหนึ่ง นึกว่า จะมีใช้งานจริงกันเยอะ แต่จริง ๆ QoS นั้นเป็นเพียงแค่ทฤษฎีเป็นส่วนใหญ่ ส่วนที่ใช้งานจริง ยกตัวอย่างเช่น Skype ที่ว่าเสียงชัด ๆ ตอนแรกผมก็เข้าใจว่ามีการทำ QoS ด้วย แต่จริง ๆ แล้ว ที่ประสิทธิภาพของมันดีนั้น เกิดจากการที่ตัว Application ของมันเอง ใช้ bandwidth ที่น้อย (เพราะมีการ compression ที่ดี) รวมถึง การใช้ สถาปัตยกรรมแบบ P2P ด้วย ทำให้เสียงดังฟังชัด

แต่ถ้าพูดในเรื่องของการทำ QoS กันจริง ๆ ก็ยังไปได้ไม่ไกล ก็หวังว่าสักวันหนึ่งเราคงจะมี QoS ดี ๆ ใช้กันนะครับ

วันจันทร์ที่ 19 มกราคม พ.ศ. 2552

Policy-based Admission Control

Policy-based Admission Control

PEP - Policy Enforcement Point เป็นจุดตรวจสอบข้อมูล ซึ่งจะรับ RSVP request มาจาก router (จากผู้ใช้ที่ขอบริการ QoS) โดยใน request นั้นจะระบุข้อมูลต่าง ๆ สำหรับ flow ข้อมูล เช่น ต้องการ bandwidth เท่าไร จากนั้นก็จะส่งต่อไปให้ PDP ตัดสินใจ โดยส่ง Policy request ไปให้

PDP - Policy Decision Point จะตรวจสอบ request กับ resource ที่มีอยู่ในปัจจุบัน รวมถึง policy ของ user คนนั้น ๆ ว่าจะยอมให้ใช้หรือไม่ โดยส่ง Policy response ตอบกลับมาหา PEP


COPS เป็น protocol การเชื่อมต่อระหว่าง PDP และ PEP โดยใช้ใน IMS R7 แต่ปัจจุบันได้ถูกยกเลิกและใช้ Diameter (RFC 3588) แทนแล้ว

JAIN-SIP #1

JAIN-SIP คืออะไร?

Jain sip คือ Java api integrated network หรือ เรียกง่าย ๆ ว่า เป็น API ของ java ที่ใช้ในการเีขียนโปรแกรมในระดับ low-level ที่ใช้จัดการ signaling multimedia ที่ใช้งาน SIP protocol นั่นเอง

Jain sip แตกย่อยออกมา มากมาย เช่น jain sip servlet, jslee ไว้ มีโอกาสได้ทดลองจะเอามาเขียนไว้นะครับ

เรามาทดลองเล่น jain-sip เลยดีกว่า
1. load jain-sip จาก https://jain-sip.dev.java.net/ จากนั้นก็ upzip ออกมา

2. load apache ant มาจาก http://ant.apache.org/ จากนั้นก็ unzip ออกมา แล้วก็ทำการ set environment ดังนี้
=> ANT_HOME=C:\Program Files\Java\apache-ant-1.7.1
PATH= path เก่าแล้วก็เพิ่ม C:\Program Files\Java\apache-ant-1.7.1\bin เข้าไป

3. เข้าไปใน folder E:\java\sip\jain-sip\ (ที่ได้ unzip jain-sip ไว้) แล้ว ant (make) มันซะเลย

4. ทดลอง run IMS application เข้าไปที่ folder E:\java\sip\jain-sip\src\examples\ims
แล้วก็สั่ง ant shootme

5. จะเจอ error ดังนี้ =>
[java] javax.sip.PeerUnavailableException: The Peer SIP Stack: gov.nist.javax.sip.SipStackImpl could not be instantiated. Ensure the Path Name has been set

6. หลังจากที่ผมใช้เวลาอยู่หลายชั่วโมง ในการ หา error นี้ ก็ได้ความรู้ใหม่ โดยการทำดังนี้
สั่ง ant shootme -debug จะพบว่ามันหา lib ไม่เจอ ดังนั้นจึงต้องแก้ lib path ให้มันใหม่ โดยการ แก้ file E:\java\sip\jain-sip\src\examples\ims\build.xml

จากเดิม
< property name="log4j_jar" value="${root}/lib/${log4j}" >
< property name="junit_jar" value="${root}/lib/${junit}" >

เป็น
< property name="log4j_jar" value="${root}/${log4j}" >
< property name="junit_jar" value="${root}/${junit}" >


7. คราวนี้ก็ สั่ง ant shootme แล้วก็เปิด console อีกหน้าต่างสั่ง ant shootist
เราก็จะเห็น IMS message วิ่งวนไป ๆ มา ๆ หน้า console แล้ว



ส่วนเรื่องความหมายของ message ขอแยกไว้เป็นบทความหน้าแล้วกันนะครับ :-)

Quality of Services #1

Quality of Services (QoS)

ความหมายในมุมมองความคิดผม ก็คือ การจัดการ IP packet ให้ทันกับเวลาตามข้อจำกัดของโปรแกรมนั้น ๆ และ มีการรับประกันว่าจะสามารถทำตามที่ขอได้

Mechanisms for QoS

มี 2 กระบวนการด้วยกันคือ

1. Integrated Services (Intserv)

ใช้หลักการทำ QoS โดย จัดการกับ packet flow ซึ่ง router จะต้องสนับสนุนการทำงาน
2 ฟังก์ชันนี้คือ (คล้าย ๆ ใน ns2 เลย)
- the classifier: เป็นตัว mark IP packet เพื่อที่จะให้ router จัดการแยกประเภทของ packet
- the scheduler: เป็นตัวแยก packet ออกจากกัน ตามที่ classifier ทำการ mark ไว้

ในกระบวนการของ Intserv นั้น แบ่ง services ออกเป็น controlled load service [RFC 2211] กับ guaranteed service [RFC 2212] ก่อนจะเริ่มทำ Intserv จะต้องมีการจองเส้นทางก่อน เรียกว่า Resource Reservation Protocol (RSVP) เพื่อที่จะมั่นใจว่า ได้รับการให้บริการที่ดีพอ ซึ่งก็คล้าย ๆ กับแบบ Best-effort (ไม่มีการจัดการ QoS) แต่รับประกัน delay ตราบใดที่เส้นทางยังไม่เปลี่ยน และ อีกอย่างก็คือ router จะต้องมีความสามารถในการสร้าง RSVP ใหม่ หรือ Reject ทิ้ง โดยพิจารณาจาก ความสามารถในการจัดการ packet รวมถึง bandwidth ที่มีอยู่ เราเรียกว่า Admission control

เนื่องจากต้องมีการจองเส้นทางในการทำ RSVP ดังนั้น การส่ง ข้อมูลจะวิ่งเส้นทางนั้นตลอด การทำ RSVP จะเป็นแบบ uni นั้นก็คือ ต้องกำหนดทั้งขาไปและขากลับ โดย ผู้ส่งสามารถกำหนด RSVP request ไปยัง ปลายทาง และ ผู้รับก็จองเส้นทางกลับมาด้วย RESV

ปัญหาใหญ่ของ IntServ คือ scalability เพราะเครือข่ายต้องแบ่งทรัพยากรบางส่วนไปใช้กับ QoS routing โดยเฉพาะ ถ้าใช้งาน QoS routing กันมาก ๆ ทรัพยากรก็จะหมดไป นอกนี้ การจองทรัพยากรด้วย RSVP ไม่ได้กระทำอย่างถาวร จึงต้องมีการส่งแพคเก็ตของ RSVP ไปยังเราท์เตอร์เพื่อรีเฟรชการจองทรัพยากรตลอดเวลา จึงมี processing overhead สูง ปกติแล้ว IntServ จึงจำกัดให้ใช้งานเฉพาะใน Autonomous System (AS) เดียวกันเท่านั้น

2. Differentiated Services (Diffserv)

Diffserv ทำงานต่างกับ Intserv คือ แทนที่จะ คอยจัดการ flow ที่มีการจองเส้นทางเฉพาะ สำหรับ packet แต่ Diffserv นั้นจะจัดการในส่วนของ border router เท่านั้น โดย packet ที่วิ่งเข้าใน border router จะถูกติด tag เรียกว่า Differentiated Service Code Point (DSCP) จาก นั้น router ที่ได้รับ packet ที่ถูกส่งมา ก็จะดูเฉพาะใน DSCP packet ซึ่งถูก configuration ไว้ใน router ก่อนที่จะมีการใช้งาน Diffserv อยู่แล้ว โดยระบุคาพารามิเตอรตัวหนึ่ง คือ PHB (Per-Hop Behavior) สําหรับแพ็กเกตนั้น ๆ ทั้งนี้แพ็กเกตที่มี PHB เดียวกันจะถือวาอยูในกลุมเดียวกันและมีอัตราการสงผานแพ็กเกตไปตามโนดคอมพิวเตอรตาง ๆ เทากัน ดัง นั้นPHB จะเกี่ยวของกับการจัดการบัฟเฟอรรวมถึงกลไกในการใหลําดับของแพ็กเกตนั่นเอง

ชื่อก็บอกอยู่แล้วว่า เป็น Code Point (จาก DSCP) ดังนั้น เวลาพิจารณา มันก็จะใส่คะแนน ให้กับ packet แล้วเปรียบเทียบกับ rule ที่ตั้งไว้ใน router เหมือนกับเป็นการจัดการ priority

ซึ่งสามารถ กำหนดใน Type of Services (ToS) ของ IP header

วันอาทิตย์ที่ 4 มกราคม พ.ศ. 2552

CAF Remboursement

CAF Remboursement (แปลว่าเงินที่ CAF จะคืนให้เรา)

วันนี้รู้สึกว่าอยู่บ้านแล้วมันแคบลงเรื่อย ๆ อันเนื่องมาจากของใช้ภายในบ้านมันเยอะขึ้นตามกาลเวลา ก็เลยอยากอยู่บ้านที่มันกว้างกว่านี้ ยิ่งได้ข่าวว่า ถ้ามีลูกมาอยู่ด้วยเนี่ย (ก็คืออยู่บ้าน > 3 คน ) พื้นที่ในบ้านจะต้อง > 27 ตร.ม. ปัจจุบันมี 22 ตร.ม. ก็เลยอยากรู้ว่า CAF จะคืนเงินมาให้เราเท่าไร?

ก็เลยลองไปคำนวนใน http://www.caf.fr/

กรณีอยู่ 2 คน โดยที่ ผมเป็นนักเรียน และ ผู้ติดตามไม่ได้ทำงาน
ค่าเช่าสูงสุดจะได้ไม่เกิน 440 ยูโร และ CAF จะคืนเงินมาให้เรา 304 ยูโร โดยประมาณ

กรณีอยู่ 3 คน โดยที่ ผมเป็นนักเรียน และ ผู้ติดตามไม่ได้ทำงาน + ลูก
ค่าเช่าสูงสุดจะได้ไม่เกิน 490 ยูโร และ CAF จะคืนเงินมาให้เรา 350 ยูโร โดยประมาณ

ถ้าเช่าบ้านที่แพงกว่านี้ ส่วนต่างที่เกิน 440 ยูโร (หรือ 490 ยูโร) นั้น
CAF จะไม่ช่วย เราต้องออกเงินเอง...แป่ว!!....

โอ้ว.. ฝันสลายเลย ตอนแรกผมอยู่บ้าน 413 ยูโร ได้คืนมา 292 ยูโร ก็ประมาณ 70% ถ้าอยู่บ้าน 700 ยูโร ก็จะได้คืนมาประมาณ 490 ยูโร แบบนี้ ย้ายดีกว่าแฮะ แต่พอไปคำนวนดูจริง ๆ โอ้ว... บ้าน 700 ยูโร ก็ได้คืนแค่ 350 ยูโร (ถ้ามีลูก) หรือถ้าอยู่ 2 คนก็ได้คืน 304 ยูโรเองครับ ไม่ไหว ประมาณเดือนละ เกือบ 2 หมื่นบาท รวมค่าไฟกับค่า internet ก็เกินพอดี อยู่แคบ ๆ แบบเก่าดีกว่า -_-"

ในความเป็นจริงนั้น CAF ต้องการช่วยเหลือ นักเรียนที่ยังไม่ได้ทำงาน ให้สามารถเรียนหนังสือได้ แต่ก็ไม่ได้จะให้อยู่อย่างหรูหรา อลังการ ก็เลยกำหนดกฎเกณฑ์การช่วยไว้แบบนี้ ซึ่งจริง ๆ แล้ว ช่วยขนาดนี้ ถือว่าดีมากแล้วครับ ถ้าเป็นประเทศอื่น ไม่มีนะเนี่ย จะบอกให้

Chocolate!!



นาน ๆ จะได้มีโอกาสกิน chocolate Hi-so ราคาบ้านเราเม็ดละ 15 บาท อย่างเต็มคราบเสียที ก็เลยคว้า Ferrero และ Lindt รวมทุก ๆ แบบมากินให้สะใจไปเลย พอดีว่า ที่ Carefour สาขา Portet มันลดราคา 50% ก็เลยซื้อมาเต็มที่ ซึ่งเฉลี่ยแล้วราคาเม็ดละ 5 บาท หมดเงินไป 1500+ บาท จาก ราคาเต็มประมาณ 3000+ บาท




แล้วก็ได้ความรู้ใหม่ ภาษาฝรั่งเศส คำว่า "Remise" แปลว่า "ลดราคา"

ราคา chocolate ที่ซื้อทั้งหมดในรูปก็เท่ากับราคาที่ลดนะแหละ เพราะว่ามันลด 50% บางคนซื้อ Lindt กล่องใหญ่ ใส่เต็มตระกล้าเลย เป็นครั้งแรกที่ซื้อ chocolate เยอะขนาดนี้นะเนี่ย เพราะราคาถูกกว่าที่เมืองไทยมาก

แต่หลังจากได้กินแล้ว ผมชอบ Ferrero มากกว่า Lindt แฮะ :b อร่อย ๆ ๆ




วันศุกร์ที่ 2 มกราคม พ.ศ. 2552

VoIP Programs

โปรแกรมที่ใช้ในการโทรศัพท์ต่างประเทศราคาประหยัด

Skype: http://www.skype.com/prices/
VoIP Discount: http://www.voipdiscount.com/en/calling-rates.html
VoIP Buster: http://www.voipbuster.com/en/calling-rates.html
VoIP Zoom: http://www.voipzoom.com/en/calling-rates.html

หมายเหตุ: โปรแกรม VoIP ทั้งหมด เป็นโปรแกรมเดียวกัน แต่จัด promotion ต่างกัน

วันพฤหัสบดีที่ 1 มกราคม พ.ศ. 2552