ข้ามไปที่เนื้อหาหลัก

EJB development ด้วย Glassfish Server -- Part 3 EJB3Unit ( Unit Testing EJB3 Modules )

ตัวอย่าง EJB3Unit


ไปดู doc และ ตัวอย่างได้จาก Ejb3Unit homepage
หรือ
download Ejb3UnitSampleProject-2.0.0-RC-1.zip

how to import existing project in eclipse



วิธี1 จะก็อป jar ไฟล์เข้าโปรเจคเองก็ได้
วิธี2 จะ Properties > Java Build Path > libraries > Add External JARs ก็ได้
โดยโหลดจาก ejb3unit-jars.zip

extract ไฟล์ก่อนแล้วค่อย add นะ ย้ำ


จากนั้นลองรัน
Run As -> [Junit icon] Execute all ejb3 unit tests.

มันจะรัน 31 tests ผ่านโดยไม่มี errors




สร้าง new project เพื่อ test EJBs ของคุณ

ejbunit สร้าง on top of Junit ( ใช้ javaSE )

ไม่ต้อง export ก่อนรันเทส ejbunit จะ simulate environment

ทำ Part 2 ให้ work ก่อน

เพราะว่านี่จะทำต่อจาก Part 2 ( Eclipse/EJB/GlassFish/JPA )

ตอนนี้ก็มี Project titan-ejb ที่มี EJB module targeted for GlassFish

- มี entities Cabin, Customer, และ Phone

- มี stateless session bean ชื่อว่า TravelAgentBean และมี remote interface


- สร้าง new Java project ชื่อ titan-tests

add the external JARs for Ejb3Unit ให้เรียบร้อย


- บอก Eclipse ให้ reference unit test project (titan-tests) ไปยัง EJB module project (titan-ejb)

ทำให้สามารถเข้าถึง source classes ใน EJB module project ได้


add the titan-ejb project ไปยัง "Java Build Path" ในแท็บ "Projects"

และ add the titan-ejb project ใน "Project References"

สร้าง entity unit test

- เทส Phone entity ก่อนละกัน

ก่อนอื่น เราต้อง override equals() กับ hashCode() ในคลาส Phone
เพราะ detached entity ต้อง"เท่ากับ" และสร้าง hash code เดียวกันกับ attached version

กลับไปเพิ่ม code เพื่อ override the methods ที่คลาส Phone ใน titan-ejb project

@Override
public boolean equals(Object other) {
if (other != null && other instanceof Phone) {
final Phone that = (Phone) other;
final EqualsBuilder builder = new EqualsBuilder();
builder.append(this.id, that.id);
builder.append(this.number, that.number);
return builder.isEquals();
}
return false;
}
@Override
public int hashCode() {
final HashCodeBuilder builder = new HashCodeBuilder();
builder.append(this.id);
builder.append(this.number);
return builder.toHashCode();
}

โค้ดที่เราเพิ่มไป มันใช้คลาส EqualsBuilder ( อยู่ใน commons-lang-2.4.jar : Apache Commons Lang library และอยู่ในไฟล์ ejb3unit-jars.zip ที่โหลดมาตะกี้ ) add มันใส่ build path ด้วย


ตอนนี้ titan-ejb project มี commons-lang-2.4.jar แต่ dependency มันจะไม่โดนแพ็คไปกับ EJB JAR file ตอน deploy ขึ้น application server (จะเจอ errors ประมาณว่า "class not found" ตอนรันบน application server)
สำหรับ GlassFish, ให้ก็อบ JAR file ที่ต้องใช้ไปที่ glassfish/domains/domain1/lib/ext/ (assuming your domain is domain1) มันจะ available สำหรับทุกๆ components ที่ deployed ไปยัง domain1.


กลับมายัง titan-tests project เพิ่ม class PhoneTest ( package com.titan.entitytests )
public class PhoneTest extends BaseEntityFixture<Phone> {
public PhoneTest() {
super(Phone.class);
}
}

คลาสนี้ แค่ใช้ default behavior ของคลาส BaseEntityFixture เพื่อเทสคลาส Phone

รันได้ละ คลิกขวา Run As -> JUnit Test จะมี 5/5 tests pass

testNothing() ซึ่งเป็น คลาสที่ inherit มา แล้วก็ 4 คลาสที่สร้างขึ้น

Configure Ejb3Unit

โดยใช้ ejb3unit.properties configuration file

New -> Source Folder ชื่อ "resources" ที่ level บนสุดของ titan-tests project
เพิ่ม file ejb3unit.properties


ejb3unit.inMemoryTest=true
ejb3unit.show_sql=true

## values are create-drop, create, update ##
ejb3unit.schema.update=create-drop

โค้ดนี้บอก Ejb3Unit ว่าให้จำลอง database ใน memory เพื่อแสดง SQL queries ที่ส่งไปยัง database บน console ( ไม่ต้องต่อกับ database จริง, ถ้าอยากต่อ database จริง ก็ config ในนี้แหละ ดูวิธีจาก Ejb3Unit documentation )

และ drop and create necessary tables สำหรับ entites ทุกครั้งที่ Ejb3Unit starts up

Unit testing entities manually

Ejb3Unit สนับสนุน automated test entities ที่เป็นแบบ one-to-many bidirectional associations ( เทสโดยใช้คลาส BaseEntityFixture )

แต่ไม่ support automated เทส entities ที่เป็นแบบ unidirectional associations ( ไปใช้คลาส PojoFixture แทน )


Mapping Customer-to-Phone ของเราเป็น one-to-many unidirectional เราจึงไม่สามารถใช้ BaseEntityFixture สำหรับคลาส Customer


เริ่มจาก สร้าง hashCode() และ equals() ในคลาส Customer


@Override
public boolean equals(Object other) {
if (other != null && other instanceof Customer) {
final Customer that = (Customer) other;
final EqualsBuilder builder = new EqualsBuilder();
builder.append(this.firstName, that.firstName);
builder.append(this.lastName, that.lastName);
builder.append(this.id, that.id);
return builder.isEquals();
}
return false;
}
@Override
public int hashCode() {
final HashCodeBuilder builder = new HashCodeBuilder();
builder.append(this.firstName);
builder.append(this.lastName);
builder.append(this.id);
return builder.toHashCode();
}

และสร้าง test class ตามนี้


public class CustomerTest extends PoJoFixture {

private static final Class[] USED_ENTITIES = { Customer.class, Phone.class };

public CustomerTest() {
super( USED_ENTITIES );
}

public void testGetEntityManager() {
assertNotNull(this.getEntityManager());
}

public void testWriteCustomer() {
List<Customer> customers = generateTestCustomers();

// persist the graph and load it again
List<Customer> persisted = persist(customers);
List<Customer> allFromDB = findAll(Customer.class);

// assert the persisted graph and the loaded are equal
assertCollectionsEqual(persisted, allFromDB);
}

private List<Customer> generateTestCustomers() {
final List<Customer> customers = new ArrayList<Customer>();
Customer customer = new Customer();
customer.setFirstName( "Matthew" );
customer.setLastName( "Dailey" );
customer.addPhoneNumber( "+66851234567" );
customers.add( customer );
return customers;
}

// Manually delete customers with the entity manager so that
// the delete cascades to the dependent phone numbers.
private void deleteCustomers() {
EntityManager em = getEntityManager();
List<Customer> customers = findAll(Customer.class);
for ( Customer customer : customers ) {
em.remove( customer );
}
}

@Override
public void setUp() throws Exception {
super.setUp();
deleteCustomers();
deleteAll(Phone.class);
}

@Override
public void tearDown() throws Exception {
deleteCustomers();
deleteAll(Phone.class);
super.tearDown();
}
}
เหมือนเดิม คลิกขวา Run As -> JUnit Test
ปล. ต้องไปเพิ่ม method addPhoneNumber เข้า คลาส Customer เพื่อให้มันเรียก
customer.addPhoneNumber( "+66851234567" );
ได้ด้วย

Unit testing session beans ========================================

Ejb3Unit เทส session beans ได้มากมายมาก ดูจากตัวอย่างที่โหลดมาได้ ( DIFieldSessionBeanTest.java )

ตอนนี้เราจะเทส TravelAgentBean


เพิ่ม functionality ไปยัง TravelAgentRemote interface:


@Remote
public interface TravelAgentRemote {
public void createCabin( Cabin cabin );
public Cabin findCabin( int id );
public List<Cabin> getAllCabins(); //
public int createCustomer( Customer customer );
public Collection<Phone> phoneNumbersForCust( int id );
public EntityManager getEm(); //
}

เราจะ test dependency injection ของ entity manager ที่ initialization timeand each of the methods. นี่คือวิธี implement method ใหม่ :


public EntityManager getEm() {
return this.manager;
}

@SuppressWarnings("unchecked")
public List<Cabin> getAllCabins() {
Query query = manager.createQuery( "SELECT c FROM Cabin c" );
return Collections.checkedList( query.getResultList(), Cabin.class );
}

ใน ejb-tests project, สร้างคลาส TravelAgentBeanTest ( package com.titan.sessionbeantests )


public class TravelAgentBeanTest extends BaseSessionBeanFixture<Travelagentbean> {

private static final Class[] usedBeans = { Cabin.class }; // Entity ที่เกี่ยวข้อง ต้องใส่ลงไปให้หมด ( ไม่งั้นจะเจอ java.lang.IllegalArgumentException: Unknown entity: หรือไม่ก็ EntityManager could not be initialized to load the enities [com.midterm.domain.Cm, com.midterm.domain.BidInvitation]. Cause: org.ejb3unit.hibernate.AnnotationException: Use of @OneToMany or @ManyToMany targeting an unmapped class: com.midterm.domain.BidInvitation.bids[com.midterm.domain.Bid] )
private static final CSVInitialDataSet<Cabin> CSV_SET =
new CSVInitialDataSet<Cabin>( Cabin.class, "testCabins.csv", "id", "name",
"deckLevel", "shipId", "bedCount" );
public TravelAgentBeanTest() {
// super(sessionBeanToTest, introspector, usedEntityBeans, initialData)
super( TravelAgentBean.class, usedBeans, new CabinEntityInitialDataSet(), CSV_SET ); //
}
public void testDependencyInjection() {
final TravelAgentBean toTest = this.getBeanToTest();
assertNotNull(toTest);
assertNotNull(toTest.getEm());
}
public void testLoadData() {
final TravelAgentBean travelAgentBean = this.getBeanToTest();
assertNotNull(travelAgentBean);
List<Cabin> cabins = travelAgentBean.getAllCabins();
assertNotNull(cabins);
System.out.println( "cabins has " + cabins.size() + " entries" );
assertEquals( 6, cabins.size() );
assertEquals( cabins.get(0), new Cabin( 1, "Cabin 8", 1 ));
assertEquals( cabins.get(1), new Cabin( 2, "Cabin 12", 1 ));
}
public static class CabinEntityInitialDataSet extends EntityInitialDataSet<Cabin> {
public CabinEntityInitialDataSet() {
super(Cabin.class);
}
public void create() {
this.add( new Cabin( 1, "Cabin 8", 1 ));
this.add( new Cabin( 2, "Cabin 12", 1 ));
}
}
}

นี่เป็น dependency injection test สองวิธีที่จะสร้าง entity test fixtures
วิธี1 โหลดจาก resources/testCabins.csv ( resources เป็น sources folder )
วิธี2 manually adding entities โดยใช้คลาส EntityInitialDataSet
ตัวอย่างข้างบนใส่ initial data ทั้งสองวิธี

ในไฟล์ csv ใส่อะไรประมาณนี้ลงไป

100,"Cabin 345",1,1,2
101,"Cabin 346",1,1,3
102,"Cabin 347",2,1,2
103,"Cabin 348",2,1,3

แล้วก็เพิ่มเทสลงไป
public void testCreateCabin() {
final TravelAgentBean travelAgentBean = this.getBeanToTest();
// Get list of cabins before we do the create
List<Cabin> cabinsBefore = travelAgentBean.getAllCabins();
assertEquals(6, cabinsBefore.size());
EntityManager manager = travelAgentBean.getEm();
EntityTransaction transaction = manager.getTransaction();
transaction.begin();
for ( int i = 0; i < 10; i++ ) {
Cabin cabin = new Cabin();
cabinsBefore.add( cabin );
cabin.setShipId(3);
cabin.setName("New cabin " + i);
cabin.setDeckLevel(5);
cabin.setBedCount(2);
travelAgentBean.createCabin(cabin);
}
transaction.commit();
List<Cabin> cabinsAfter = travelAgentBean.getAllCabins();
assertEquals(16, cabinsAfter.size());
assertCollectionsEqual(cabinsBefore, cabinsAfter);
}
สังเกตว่า เราสร้าง entity manager transaction manually
ไม่งั้น ในเมธอด getAllCabins() ตอนเรา execute EJB QL query เพื่อ retrieve all persisted Cabins มันจะยัดลง database ไม่ได้

public void testFindCabin() {
final TravelAgentBean travelAgentBean = this.getBeanToTest();
// The cabin with name "Cabin 8" added in the create() method of the initial data
// set should have its ID generated as 118 by the time we get to this test case.
Cabin cabin = travelAgentBean.findCabin(118);
assertEquals(cabin, new Cabin(118, "Cabin 8", 1));
}


ref : mdailey

ความคิดเห็น

ติดตามบล็อกบนเฟซบุ๊คเพจ

โพสต์ยอดนิยมจากบล็อกนี้

เทคนิคคิดเลขเร็วโดยใช้ วิธีคิด แบบ เวทคณิต ( Vedic Mathematics example )

จากที่สงสัยเรื่อง ลูกคิด ของ จินตคณิต ที่ลองไปค้นดู
ปรากฎว่า เจอ เวทคณิต ซึ่งเขาบอกว่า อยู่ในคัมภีร์พระเวท

ลองอ่านดูแล้ว รู้สึกว่าฝึกสมอง ก็ทำให้คิดเลขเร็วดี
เลยสรุปมาให้ ตามนี้

Tutorial 1

การลบเลข
ALL FROM 9 AND THE LAST FROM 10
ทุกตัวลบจาก 9 และตัวสุดท้ายลบจาก 10

เช่น 1000 - 357 = 643
10,000 - 1,049 = 8951

ถ้า 1,000 - 83 ให้มองว่ามี 0 อยู่ข้างหน้า
เป็น
1,000 - 083 = 917

ฝึกบ่อยๆ ก็คล่อง แล้วก็ไม่ต้องใช้เครื่องคิดเลขด้วย
ลองทำดูสิ
1) 1000 - 777 =
2) 1000 - 283 =
3) 1000 - 505 =
4) 10,000 - 2345 =
5) 10,000 - 9876 =
6) 10,000 - 1011 =
7) 100 - 57 =
8) 1000 - 57 =
9) 10,000 - 321 =
10) 10,000 - 38 =

3,000 - 467 ก็ทำเหมือนกัน โดยลบตัวแรกสุดของ 3,000 ไป 1
จากนั้นก็ทำเหมือนเดิม จะได้ว่า 3,000 - 467 = 2,533

Tutorial 2
VERTICALLY AND CROSSWISE สำหรับตัวเลขที่น้อยกว่าฐานนิดหน่อย

ลอง 88x98

88 น้อยกว่า 100 อยู่ 12
98 น้อยกว่า 100 อยู่ 2
12x2 = 24
88-2 หรือ 98-12 ได้ 86
ดังนั้นตอบ 8,624

ดูอีกตัวอย่าง
หรือ

ลองทำนี่ดู
1) 87 x 98 =
2) 88 x 97 =
3) 77 x 98 =
4) 93 x 96 =
5) 94 x 9…

อยู่เหงาๆ เราไปเที่ยว - วัดอรุณราชวราราม ( วัดแจ้ง ) + วัดสระเกศ ( ภูเขาทอง )

เอนทรีนี้เป็นส่วนหนึ่งของ serie ท่องเที่ยว ดูบทความท่องเที่ยว อื่นๆ ของผม ได้ที่ ลิงก์นี้ นะครับ

คำเตือน เอ็นทรีนี้รูปเยอะมากกกก ควรปิดบิตก่อนดู

ผ่างๆๆ ท่านสามารถรับชมเอนทรีนี้ผ่าน url http://tinyurl.com/goldenMount ได้ด้วย

วันนี้ตั้งใจไปวัดอรุณฯ

เดินทางทางน้ำเหมือนเดิม

แต่คราวนี้นั่งเรือ ธงสีฟ้า ( คราวก่อน นั่งเรือ ธงสีส้ม )

พอถึงท่าสาทร เขาบอกว่า ให้ลงลำที่จอดอยู่ได้เลย เก็บตังในเรือ

ก็ งงๆ เดินลงไป

เหมือนเดิมครับ

ชูชีพอยู่ใต้ที่นั่งของท่าน
พอเรือออกสักพัก มีไกด์ มาบรรยาย

อ้าว กรำ

ขึ้นผิดเรือรึเปล่า

นี่มันเรือท่องเที่ยว 150 บาท ไม่ใช่เร๊อะ

กะลังอึ้งๆอยู่

แต่พอไกด์พูดไปสักพัก ก็เลยรู้ว่า 150 บาท มันราคาเหมาวัน

แล้วก็ได้ความรู้ของท่าเรือ แล้วก็สองข้างทาง




เรือธงฟ้านี่มันไปสุดที่ท่าพระอาทิตย์เท่านั้นเองนะ แล้วก็กลับ

ตอนไปมีสาวคนนึง ถามว่า จะไปวัดสระเกศ ไปทางไหน

ถ้าฟังไม่ผิด คนเก็บตังบนเรือ บอกว่า ท่ามหาราช

จากนั้นก็คุยอะไรกันไม่รู้ ไม่ได้ยินแล้วล่ะ




เรือธงฟ้า มันใหญ่กว่า น่าหวาดเสียวน้อยกว่า น้ำกระเด็นน้อยกว่า แพงกว่า เรือธงสีส้ม

คราวนี้รู้และ นั่งริมฝั่งธน ได้มาหลายรูปเหมือนกัน แต่วันนี…

อยู่เหงาๆ เราไปเที่ยว - วัดระฆังโฆสิตาราม

เอนทรีนี้เป็นส่วนหนึ่งของ serie ท่องเที่ยว ดูบทความท่องเที่ยว อื่นๆ ของผม ได้ที่ ลิงก์นี้ นะครับ



จากที่ คราวก่อน ไปวัดอรุณฯ เขามีให้ล่องเรือไปวัดระฆัง เลยเดาๆ ได้ว่า วัดอยู่ไม่ไกล

ประกอบกับได้ยินเรื่องของ สมเด็จพระพุฒาจารย์ (โต พรหมรังสี) มานาน



วันนี้เลยลองไปสักหน่อย

นั่งเรือธงสีสัม ( 13 บาทตลอดสาย ) ไปลงท่าช้าง

มองจากท่าช้าง ตรงกลาง เป็น สมาคม พุทธศาสนา อะไรซักอย่างทางซ้ายของรูป คือ พระอุโบสถ วัดระฆัง
แล้วนั่งเรือข้ามฟาก ( 3 บาท ) ไปท่าวัดระฆัง

วัดระฆังโฆสิตารามวรมหาวิหาร
นกเยอะมาก ปลาก็เยอะ

แบบว่า เขามีขายอาหารสำหรับเลี้ยงปลา ( แต่แอบได้ยินคนซื้อบ่นว่าขนมปังขึ้นรา - -! )


ปลาเยอะกว่าที่วัดยานนาวาอีก ตัวใหญ่ๆทั้งนั้น
คราวนี้เราไป มันเปิดแค่อุโบสถ วิหาร แล้วก็ หอไตร แหะ ไอตรง กรอบสีส้มเข้มๆ ซ่อมอยู่


แผนที่วัดระฆังท่าวัดระฆัง ( แม่น้ำเจ้าพระยา ) อยู่ด้านล่าง
คลิกที่ภาพเพื่อดูภาพขยาย
หรือ ดูต้นฉบับที่ เวปไซท์วัดระฆัง
ไปถึงก็เดินดูรอบๆ พระอุโบสถ คนเยอะเหมือนกันนะ

พระเจดีย์
พระเจดีย์ อีก 2 องค์
couple ?
พระปรางค์
สถาปัตยกรรมรัตนโกสินทร์ยุคต้น ยึดถือเป็นแบบฉบับของพระปรางค์ที่สร้างในยุคต่อมา
แล้ว…

อยู่เหงาๆ เลาไปเที่ยว - เที่ยวเชียงรายด้วยตนเอง โดยไม่มีรถ เช่ารถก็ไม่ได้เช่าน้ะจ้ะ นั่งรถสาธารณะล้วนๆแจร้ ตอนที่เจ็ด

วันจันทร์​ 11 ธันวาคม 
05.30 ใส่กางเกงขายาวตัวเดิม หรือ ใส่กางเกงขาสั้น

เช้านี้ตื่นเพราะเสียงนาฬิกาปลุกของห้องข้างๆ นาฬิกาปลุกเลาตั้งไว้หกโมง แต่ห้องข้างๆ ตีห้าครึ่ง ตื่นเลยก็ได้ว่ะ

จริงๆ เป็นเรื่องที่คิดตั้งแต่เมื่อคืนมาแล้วว่าจะใส่ขายาวหรือขาสั้น

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

ก็เลยคิดว่าจะใส่ยีนส์ขายาวไป
พาลไปว่าจะใส่ยีนส์ขายาวในวันที่สามอีกวัน เพราะไป วัดเหมือนกันอีก

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

07.00 ขนมแบบเชียงราย
ตลาดเช้า

รุ่งเช้าไปตลาดเช้า ส่วนใหญ่เป็นของสด ผักสด เนื้อสด
ชาวเขาซ้อนรถกระบะมา เอาของมาขาย ไหนลูกเจ้าของรีสอร์ตบอก ชาวเขาส่วนใหญ่เดินเอาไงฟร่ะ?

ไปสะดุด แป้งข้าวเหนียวปิ้ง ข้างในมีไส้หวานๆ…

วิธีใช้ ย่อๆ เกี่ยวกับ Matrix กับ Vector ( มาจาก CASIO-991MS manual )

Matrix

เปลี่ยน mode เป็น Matrix
กด mode ไปเรื่อยๆ จนเจอ MAT

วิธีใส่ Matrix เข้าไป
จิ้ม MAT ( ตรงเลข 4 )
DIM -- สร้าง Matrix ใหม่ - เราจะสร้าง Matrix เก็บไว้ในตัวแปรได้สามตัว คือ A, B, C ( Trick : ตอนใส่ค่า a11, a12, .. ถ้าอยากข้ามไปให้กดลูกศร ขึ้น ลง ซ้าย ขวา ได้เลย )
รุ่นนี้ มันใส่ได้มากสุด 3x3 นะ ถ้าใส่ 4 ไป มันจะ dimension error
EDIT -- แก้ไข Matrix ที่สร้างไว้แล้ว
MAT -- เอา Matrix ออกมาใช้งาน

Add : MatA + MatB
Subtract : MatA - MatB
Multiply with scalar : MatA x 3 หรือ 3 x MatA
Multiply : MatA x MatB
Det : Det MatA
Transpost : Trn MatA
Inverse :MatA -1
Absolute Value of Each Element : Abs MatA

ผลลัพธ์มันจะได้เป็น
MatAns11
ซึ่งเราสามารถกด ซ้าย ขวา ขึ้นลงได้เหมือนเลื่อนดู Element จาก Matrix เลย

Vector
เปลี่ยน mode เป็น Vector
กด mode ไปเรื่อยๆ จนเจอ VCT

วิธีใส่ Vector เข้าไป
จิ้ม VCT ( ตรงเลข 5 )
DIM -- สร้าง Vector ใหม่ - เราจะสร้าง Vector เก็บไว้ในตัวแปรได้สามตัว คือ A, B, C ( Trick : ตอนใส่ค่า a1, a2, .. ถ้าอยากข้ามไปให้กดลูกศร ซ้าย ขวา ได้เลย )
EDIT -- แก้ไข Vector ที่สร้างไว้แล้ว
VCT -- เอา Vector ออกม…

อยู่เหงาๆ เราไปเที่ยว - เที่ยวมาเลเซีย โจโฮห์ บาห์รู Johor Bahru Downtown 1 - JB Central, City Square

หยุดวันเสาร์หาทางไปเที่ยวตอนแรก นึกว่าจะไปทัวร์ของรัฐบาล เหมือนตอนเคยไปที่อินเดีย

แต่ทว่า พอไปถามที่ Tourism Office ที่ชั้น 2 ของตึกที่ติดกับ JB Sentral แล้วทัวร์ไม่เหมือนกันขรับ



ของอินเดีย จะเป็นของรัฐบาลจัดเอง แต่ของมาเลเซีย จะเป็น agent ที่ร่วมกับรัฐบาลจัด

นั่นหมายความว่า ต้องไปขึ้นรถที่ agent ซึ่งไกลจาก Tourism Office

โฮฮฮฮ อุตส่าห์ดีใจ ว่า หาทางมา Tourism Office ได้แล้ว นึกว่ายังไงๆ ก็ต้องมาขึ้นรถแถวนี้เพราะ Tourism Office กับ Head Quarter ก็อยู่ใกล้ๆกันด้วย

ปรากฎว่า ทริปที่เล็งไว้ city tour 1 วัน ที่มาเล กลับต้องไปขึ้นรถที่ Taman Universiti (บริษัท ทัวร์ ชื่อ PRIMA SIERRA HOLIDAYS SND BHD) ซึ่งไกลจาก City Square ต้องนั่งรถ แท็กซี่ ไป ถามๆพนักงานinformationของ City Square เขาบอกมี taxi meter นะ

ให้รูปเป็น Soft Copy เผื่อสนใจ หนังสือ ขอได้จาก Tourism Office รู้สึกจะมีทุกรัฐในมาเลเลยแหละ


เลยตัดสินใจเดินเล่น แถวๆนั้น

ตอนแรกขอแผนที่ของ Tourism Office แต่แม่ม สถานที่เล็กเท่าจิ๋มมด แถมไม่แยก Category ด้วย มั่วไปหมด เลยไปขอแผนที่ของโรงแรมแทน

ข้างล่างเป็นแผนที่ Downtown ที่ติดกับสิงคโปร…

อยู่เหงาๆ เราไปเที่ยว - พระปฐมเจดีย์ พระราชวังสนามจันทร์, นครปฐม Sanam Chandra Palace, Nakorn Pathom

เอนทรีนี้เป็นส่วนหนึ่งของ serie ท่องเที่ยว ดูบทความท่องเที่ยว อื่นๆ ของผม ได้ที่ ลิงก์นี้ นะครับ



กลับมาแบ้วแจ้~~ อันที่จริง ซี่รี่ส์ ท่องเที่ยวอินเดีย ยังไม่จบ น้ะจ้ะ

แต่ขอคั่นรายการด้วย การไปเที่ยว จังหวัด นครปฐม กันก่อนละกัน



ขอเท้าความ นิดหน่อย

สืบเนื่องมาจาก ปีนี้ วันเกิด ของเรา ตรงกับวันจันทร์

วันอาทิตย์ก่อนหน้าวันจันทร์ ไปบ้านอาม่า อาม่าบ่นอยากกิน ข้าวหลาม

ก็เล่าว่า พอลง รถไฟ นครปฐม ก็มีคนมาขายเลย



ทีแรกตั้งใจว่า เสาร์หน้าจะไปซื้อ แล้ววันอาทิตย์จะเอาไปฝาก

แต่ดูไปดูมา วันจันทร์หยุด ก็เลยไปวันจันทร์เลยละกัน

เป็นที่มา ของ ทริปนี้ แจ้ :)


นครปฐม จ้ะ
Nakorn Pathom, Thailand naja

อันที่จริง อยากจะขยับขยาย ไป ปริมณฑล นานแล้วจ้า

จากที่ ที่เที่ยว ใน กทม. เริ่มหมด ( ดูตอนเก่าๆ ได้ที่นี่ น้ะจ้ะ ) -- ปล. ใครมีที่เที่ยวใหม่ๆ แนะนำ จะเป็นพระคุณยิ่งจ้า

แล้วก็เริ่มเฉื่อยแฉะกับ plan revisit ฮา

แต่ตอนนั้น ยังติดที่ว่า จะไป จังหวัดใกล้เคียงได้อย่างไร

อย่าง พระปฐมเจดีย์ นี้ วางไว้ นานเหมือนกัน

แรกว่า จะขับรถไป แต่ก็ไม่แนวน้ะจ้ะ

พออาม่า เล่าเรื่องข้าวหลาม จึงนึกได้ ว่า นั่งรถไฟไปก็ได้นี่นา !



เที่ยวทั่…

ศูนย์ซ่อม Samsonite ย้าย แบ้วแจ้

และแล้วก็ได้ฤกษ์เอากระเป๋าที่พังไปซ่อมเสียที เป็นหนึ่งในภารกิจหลายอย่างที่ทำตอนวันศุกร์ที่ผ่านมาแจ้

แต่ก่อนเราเคยซ่อม ที่ อาคาร สีลม แกลเลอเรีย น้ะจ้ะ แต่พอวันนี้วกขึ้นไปจอด โทรถามหาเบอร์เก่า ก็ขึ้นเป็น Invalid

เลยลงไปถาม รปภ เขาบอกว่า ย้ายไปแล้ว

ประกาศ!

บริษัท เซ็นทรัลเทรดดิ้ง CMG ย้ายจาก อาคารสีลม แกลเลอเรีย ชั้น G ไปที่ อาคาร สิรินรัตน์ ชั้น 8 ตรงข้าม อาคาร มาลีนนท์ ( ช่อง 3 ) แล้วน้ะจ้ะ

เบอร์โทรใหม่ 02-229-7000

จึงประกาศให้ทราบโดยทั่วกัน ณ จ๊ะ

จะได้ไม่ต้องวกรถขึ้นไปชัั้น 6 เสียค่าจอดอีก 30 บาท แล้วก็เสียเวลาอีกด้วยแจ้

อยู่เหงาๆ เราไปเที่ยว : สวนนงนุช พัทยา ( Nong NoochTropical Garden, Pattaya Thailand )

เอนทรีนี้เป็นส่วนหนึ่งของ serie ท่องเที่ยว ดูบทความท่องเที่ยว อื่นๆ ของผม ได้ที่ ลิงก์นี้ นะครับ

วันนี้ ได้มีโอกาสไปเยี่ยมชม สวนนงนุช ซึ่งอยู่ไกลถึงพัทยาโน่น

ซึ่งเรา วางแผน ไป-กลับ ภายในวันเดียว เป็น one day trip น่ะ

อันที่จริง สวนนงนุช นี้ #เราเอง ได้ยินครั้งแรก จาก รายการพาเที่ยว รายการหนึ่ง ทางทีวี เห็นว่า เขาจัดสวนไว้ทั้งปี ไม่ต้องรอเทศกาล เหมือน งานพืชสวนโลก อันที่จริง พืชสวนโลก ก็น่าไปนะ เห็นตู้นอนของรถไฟ สวยดีเหมือนกัน ไว้ต้องหาโอกาสไปลองมั่ง

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


Stone Henge
สวนสวยมากเลยแจ้ ที่ชอบก็คือ มี Sky Walk ทำให้มองเห็นภาพมุมสูงได้ด้วย แทนที่จะเป็นแค่ภาพมุมมนุษย์เดินดิน ทั่วๆไปที่ได้เห็นกัน

ตอนแรกนั่ง สามล้อ เข้าไป
แบบว่า งงๆ เพราะว่า เขาเก็บตังค์ตั้งแต่ Main Gate เลย
หลังจากนั้น สามล้อ จะส่งเราที่ Pottery Garden
แบบว่า เง็งเบย เพราะว่า ไม่รู้ว่า สวนกว้างใหญ่ขนาดไหน

ถามคนขายน้ำ เขาก…

อยู่เหงาๆ เลาไปเที่ยว - เที่ยวเชียงรายด้วยตนเอง โดยไม่มีรถ เช่ารถก็ไม่ได้เช่าน้ะจ้ะ นั่งรถสาธารณะล้วนๆแจร้ ตอนที่หก

ดึกแล้ว


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


หลักกิโลเมตรที่ 0 ดอยแม่สลอง

ตอนอยู่บนรถหลังจากกลับจากตลาดชา ลูกเจ้าของรีสอร์ต ยังถามว่าจะแวะเซเว่นเอาอะไรไหม

แล้วตอนเช้าพรุ่งนี้จะพาไปตลาดเช้า ที่ชาวเขาเอาของมาขาย
ประมาณ 7.00 ก่อนกินข้าวเช้าเวลา 08.30 ใจดีจริงๆ

plan เดิมคือ 7.00 เดินไปไร่ชา 101 จากที่ก่อนมาได้โทรไปถามไร่ชาว่าเปิดเจ็ดโมง
แต่มีแนะนำโดยคนในพื้นที่ให้ไปตลาดเช้า
ยัง LINE ไปบอกเพื่อนที่กทม ว่า อาจจะไม่ได้ไปไร่ชาแล้ว
( แต่หลังจากนี้ก้อมีเรื่องจับพลัดจับผลูให้ได้ไปไร่ชาที่ใหญ่กว่า ไร่ชา101 นั่นก้อคือ ไร่ชาฉุยฟง อดใจไว้เด๋วเล่าให้ฟัง )

บรรยากาศยามเย็นที่ตลาดชาที่ดอยแม่สลอง จังหวัดเชียงราย
พอกลับที่พัก คุณเจ้าของรีสอร์ตถามว่าทานมื้อเย็นมายัง
บังเอิญว่าเลาทานมาแล้ว เลาเลยอุดหนุนโกโก้เย็น 60 THB แทน
มีหนุ่มสาวคู่นึงที่ไปด้วยกัน เขายังไม่ทานมา เขาก้อทานที่โรงแรมนั่นแหละ
หนุ่มนี่ม…