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

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

ความคิดเห็น

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

ปีอธิกสุรทิน อธิกมาส อธิกวาร และ การทดปฏิทิน

 ปีที่แบ่งตามรอบพระอาทิตย์ (สุริยคติ) มี 2 แบบ คือ 1. ปกติสุรทิน คือ มี 365 วัน 2. อธิกสุรทิน คือ มี 366 วัน (เดือนกุมภาฯมี 29 วัน) การคำนวน ปีอธิกสุรทิน ตรงนี้บางท่านจะจำได้แต่เพียง ว่า หาร 4 ซึ่งไม่ใช่แค่นั้นครับ ความจริงแล้ว จะมีสูตรคำนวณที่ถูกต้องคือ ให้เอา ค.ศ.ตั้ง แล้วเอา 4 หาร หากหารลงตัวก็ใช่ ยกเว้น 100 หารลงตัว แต่หาก 400 ลงตัวก็ให้นับเป็นอธิกสุรทินด้วย (เช่น ปี 1900 ไม่เป็นอธิกสุรทิน แต่ปี 2000, 2004 เป็นปีอธิกสุรทิน) ปีที่แบ่งตามรอบพระจันทร์ (จันทรคติ) แบ่งเป็น 3 คือ 1. ปกติมาส-ปกติวาร  (บางที่เขียนย่อ เป็น ปกติมาส-วาร)       คือ ปีที่เป็นปกติ มีเดือนคู่ ข้างขึ้น 15 วัน ข้างแรม 15 วัน       และมีเดือนคี่ ข้างขึ้น 15 วัน ข้างแรม 14 วัน       รวมวันใน 1 ปี เป็น (30*6+29*6) = 354 วัน 2. ปกติมาส-ปีอธิกวาร (บางที่เรียกเป็น อธิกวาร)       คือ ปีที่เป็นปกติ แต่เดือน 7 จะมีข้างแรม 15 วัน        รวมวันใน 1 ปี เป็น 354+1 = 355 วัน 3. ปีอธิกมาส-ปกติวาร (บางที่จะเรียกเป็น อธิกมาส)       คือ ปีที่มีเดือนแปดเพิ่มอีกเดือน หรือที่เรียกกันว่า มีเดือนแปดสองหน       รวมวันใน 1 ปี เป็น 354+30

วิธีการไป อย. กระทรวงสาธารณสุขจากหัวลำโพง

ทางไป : รถไฟฟ้า MRT หัวลำโพง ไปลงที่ สถานี กระทรวงสาธารณสุข  ถ้ากดที่ตู้ต้องเปลี่ยนไปหน้าจอสายสีม่วง สนน ราคา 48 53 บาท ต่อมอไซด์ ถ้าไป อย. 20 บาท จากหน้าทางเข้า  ถ้าฝนตกแนะนำให้โบกแท็กซี่จากข้างหน้า ข้างในหาแท็กซี่ยากมาก ถ้าจะเดินประมาณ 2.4 km ให้ระวังหลงเข้าไปรพ ศรีธัญญา รพ ศรีธัญญาพื้นที่ข้างในใหญ่มาก และเหมือนจะล้อมด้วยคลอง เหมือนจะมีทางออกแค่ทางที่เข้าไปนั่นแหละ ทางกลับ : รถเมล์ 97 จาก อย. ตรงข้ามประกันสังคม ทางที่ 1 : ถ้าจะใกล้ลงหน้าปากซอยขึ้นสายสีม่วงที่สถานีกระทรวงสาธารณสุขที่เดิม ทางที่ 2 : ผ่าน ท่าน้ำนนท์​ กลับเรือได้ ทางที่ 3 : ผ่านหน้าพระจอมพระนครเหนือด้วยนะ ผ่าน สถานีรถไฟฟ้า MRT บางซื่อ  ( จาก อย. ไป MRT บางซื่อ 17 บาท,  จาก MRT บางซื่อ ไป MRT หัวลำโพง 44 บาท นั่งกลับได้ 2 ทาง ทางหัวลำโพง กับ ไปเปลี่ยนที่ท่าพระ ไม่รู้ว่าทางไหนเร็วกว่ากัน ) ทางที่ 4 :  ผ่าน สะพานควาย  ทางที่ 5 :  นั่งถึงอนุสาวรีย์ชัยสมรภูมิได้ ค่ารถเมล์ 21 บาท ค่ารถไฟฟ้าไป BTS สะพานตากสิน 47 บาท 

สอบสัมภาษณ์ MBA คำถามและการเตรียมตัว

 * “แนะนำตนเอง” การแนะนำตนเองไม่ใช่แค่บอกชื่อ-นามสกุล ตำแหน่งงาน สถานที่ทำงาน หรือ ประวัติการศึกษาเท่านั้น ข้อมูลเหล่านี้ต้องพูดถึง แต่ไม่ใช่ประเด็นสำคัญ ส่วนที่สำคัญในการแนะนำตนเองก็คือต้องขายความเป็นตัวตนของเรา ความสามารถของเรา และ/หรือวัตถุประสงค์ในการเลือกเรียนหลักสูตรนี้  พยายามตอบคำถามให้สอดคล้องกับ MBA ไม่ต้องนาน ประมาณ 2–3 นาที เน้นเนื้อ ไม่เน้นน้ำ ซ้อมพูดเยอะๆ ถือว่าเป็น First Impression * ทำไมจึงเลือกสมัครเข้าเรียนหลักสูตรนี้  ทำไมถึงมาเรียน MBA ทำไมอยากเรียน MBA ทำไม อยากเรียนตอนนี้  * ทำไม ต้องเรียน MBA ที่นี่ -- ลองศึกษา Program ของมหาลัยที่จะไปดูน้าว่ามหาลัยมีอะไรเด่น * คิดว่าถ้าเรียน MBA จะมี Challenge อะไรบ้าง * สนใจโปรแกรมอะไรบ้าง * หลังเรียนจบอยากทำอะไร * ต้องการอะไรจากหลักสูตรนี้  เรียนแล้วคิดว่าจะได้อะไร เอาไปใช้อะไรในชีวิต * ทำไมไม่เรียนสาขาอื่น ถ้าอายุงานถึงเรียนอย่างอื่นได้ * ในองค์กรที่ทำงานอยู่สามารถเติบโตได้ถึงตำแหน่งไหน * Performance ปัจจุบันเป้นยังไง  * ดูดีอยู่แล้ว แล้วมาเรียน MBA ทำไม เพราะงานที่ทำอยู่ก็มีโกาสก้าวหน้าในสายอาชีพบริหารอยู่แล้ว * ไม่ได้เรียนม

วิธีใช้ ubuntu ต่อ อินเทอร์เน็ตทรู ( true ) โดยโมเด็ม billion bipac 7000 usb adsl modem

ก็อปไฟล์ cxacru-fw.bin ไปที่ /lib/firmware ไฟล์ cxacru-fw.bin download ได้ที่นี่ ก็อปไฟล์ br2684ctl ไปที่ /usr/sbin ไฟล์ br2684ctl download ได้ที่นี่ $ sudo pppoeconf nextๆ ไปเรื่อยๆ ใส่ username, password ของทรู ตามปกติ แล้วเขียนไฟล์ดังนี้ true.sh #!/bin/sh modprobe cxacru modprobe br2684 sudo /usr/sbin/br2684ctl -b -c 0 -a 0.100 # Communicating over ATM 0.0.100, encapsulation: LLC sudo ifconfig nas0 up pon dsl-provider # Plugin rp-pppoe.so loaded เสร็จแล้วสั่ง รัน shell script $ . ./true.sh คราวต่อไปรัน . ./true.sh อย่างเดียวก็ได้แล้วๆ reference : siamgeek บทความอื่นๆเกี่ยวกับ ubuntu

เทคนิคคิดเลขเร็วโดยใช้ วิธีคิด แบบ เวทคณิต ( 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

เรื่อง matrix ที่อาจจะลืมกันไปแล้ว

Rank ของ matrix Rank ของ matrix A คือ จำนวน independent columns (หรือ rows) ของ A นั่นคือ square matrix จะ full rank ถ้า ทุกคอลัมน์ independent กัน เมื่อ full rank, det จะ = 0 วิธีหา rank อาจหาได้โดย [U, W, V] = svd(A) แล้วดูว่า rank คือ จำนวน residual ของ W ที่ไม่เป็น 0 full rank = singular matrix = หา inverse ได้ สมบัติของ rank 1. rank(AB) <= min(rank(A), rank(B)) ย้ำว่า < หรือ = นะ ดูสมบัติอื่นๆ ได้จาก wiki Null Matrix เมตริกซ์ศูนย์ (Zero Matrix หรือ Null Matrix ) คือ เมตริกซ์ที่มีสมาชิกทุกตัวเป็นศูนย์หมด Orthogonal Matrix Cramer's rule Ax = b Cramer's rule ใช้ได้เมื่อ A เป็น square matrix เท่านั้น กรณีที่มีจำนวน สมการ มากกว่าจำนวน ตัวแปร ( A mxn เมื่อ m > n ) หรือเราเรียกว่า over parameter เราไม่สามารถหา inverse ของ rectangular matrix ได้ ให้ไปใช้ psudoinverse แทน x = A + b หรือ หรือ หรือ ไปใช้ SVD แก้สมการซะ คำตอบคือ last col of v ! Gaussian elimination method ใช้แก้สมการ เช่นเดียวกับ กฏของ คราเมอร์ วิธีคิดหลักๆ คือ ทำให้สามเหลี่ยมล่างเป็น 0 ให้หมด โดย

เลขฐานสอง ติดลบ เรื่องที่อาจจะลืมกันไปแล้ว

คอมพิวเตอร์ใช้การเปิดปิด หลอดสุญญากาศ ดังนั้นค่าที่เป็นไปได้คือ 0 กับ 1 ไม่มีติดลบ จึงกำหนดให้ใช้ 2's complement มากำหนดเลขลบ วิธีทำคือ เปลี่ยนเลข 1 เป็น 0 เปลี่ยนเลข 0 เป็น 1 แล้ว บวกหนึ่ง เช่น 1 คือ 00000001 เปลี่ยนเป็น 11111110 บวก 1 ได้ 11111111 บิตที่อยู่หน้าสุดจะบอกว่าเป็นเลขบวกหรือลบ ( 0 = +, 1 = -) พิสูจน์ จาก สมการคณิตศาสตร์​ 1 + (-1) = 0 00000001 + ???????? = 0 00000001 + (11111110 + 000000001 ) = 0 นั่นเอง วิธีที่ง่ายกว่านั้นในการทำ 2's complement คือ 1. หา 1 ตัวสุดท้าย 010100 1 2. invert ตัวหน้า 1 ทั้งหมด 101011 1 สำหรับคนที่ลืมไปแล้ว 1's complement คือเปลี่ยนเลข 1 เป็น 0 เปลี่ยนเลข 0 เป็น 1 ตามปกติ เช่น ~1 1 = 00000001 ~1 = 11111110 ซึ่งมีค่าเท่ากับ -2 ที่มา : วิชาการดอทคอม , wikipedia

ส่งไปรษณีย์ทีละมากๆ ที่ช่องไปรษณีย์สำหรับธุรกิจ

  ถ้าเราส่งไปรษณีย์ทีละ 10 กล่องขึ้นไป สามารถไปส่งโดยใช้ช่องทางธุรกิจได้ โดยต้องกรอกใบรับฝากรวม ( Receipt for bulk Posting ) เป็นลิสต์รายการให้เขาไปด้วย โดยกรอกพัสดุแต่ละรายการ และ ไปยื่นให้เขาพร้อมกับพัสดุที่จะส่ง วิธีกรอก คือ ให้กรอกพัสดุแบบเดียวกันไว้แผ่นเดียวกัน  เช่น พัสดุ10 กล่อง กล่องขนาดเท่ากัน น้ำหนักเท่ากันหมด กรอกไว้ 1 แผ่น ถ้าน้ำหนักต่างกัน ขนาดกล่องต่างกัน กรอกแยกแผ่นไว้ดีที่สุด ซึ่งใบนี้สามารถไปขอได้ที่ไปรษณีย์ฝ่ายธุรกิจ สามารถนำมาทำใส่ A4 ก็ได้ ขอบคุณคุณพี่ amarin.ch ที่ไปรษณีย์กลาง ( BANGKOK G.P.O. ) มากๆ นะครับ สำหรับคำแนะนำ ขอบคุณที่ช่วยคีย์ให้ทีละรายการสำหรับมือใหม่ที่ยังไม่รู้ว่ามีใบรับฝากรวมอย่างผมด้วยครับ คราวหน้าผมจะทำใบรับฝากรวมไปครับ

ข้อแตกต่างระหว่าง Mahalanobis distance กับ Euclidean Distance : ทำไม และ เมื่อไหร่ ต้องใช้ Mahalanobis distance ใน data mining

Euclidean Distance นิยาม EuclideanDistance = sqrt(sum( (A - B) .^ 2 )) โชว์เหนือ เขียนแบบ linear algebra EuclideanDistance = norm(A - B) ข้อเสียของ Euclidean distance 1. sensitive to scales ของตัวแปร ในกรณี geometric ตัวแปรทุกตัวมีหน่วยเดียวกันหมด คือ ระยะทาง แต่เมื่อพิจารณาตัวแปรที่มีข้อมูลหลายชนิดพร้อมๆกัน เช่น ใน data mining เราอาจจะพิจารณา อายุ, ความสูง, น้ำหนัก ฯลฯ พร้อมๆกันหมด สเกลมันเอามาเปรียบเทียบกันไม่ได้ 2. Euclidean distance ใช้กับตัวแปรที่ correlated กันไม่ได้ เช่น สมมติว่าเรามี data set 5 ตัวแปร ที่ซึ่งค่าของตัวแปรหนึ่งเหมือนกับอีกตัวแปรหนึ่งเด๊ะๆ ( กรณีนี้เหมือนเด๊ะ เลยเป็น completely correlated ) Euclidean distance จะคำนวณโดย weight ข้อมูลที่ซ้ำกันมากขึ้น ทำให้มีปัญหา Mahalanobis distance นิยาม เมื่อ S คือ covariance matrix และ x, y มี distribution เดียวกัน Mahalanobis distance มันพิจารณ่า covariance matrix ไปด้วย เลยขจัดปัญหาเรื่อง scale และ correlation ที่ Euclidean Distance มีได้ ใน MATLAB ใช้ฟังก์ชั่น mahal() หรือ pdist() ดูตัวอย่าง mahaldist.m ของคุณ Peter J. Ackl

แจก คัมภีร์ ไบเบิล ภาษาไทย รวมเล่ม ( download thai bible pdf version )

แปลกใจว่า ทำไม ไม่มี ebook พระคัมภีร์ ที่สามารถ print อ่านได้เลย เลยเอา พระคัมภีร์ภาษาไทย ฉบับ KJV ( Thai Bible King James Version ) มาเย็บรวมเล่ม สร้างไว้เฉพาะ พันธสัญญาเดิม ( Old Testament ) ดาวน์โหลดได้จาก Thai Bible ย้ายแล้วจ้า ย้ายมา อันนี้ จะยัดลง iPhone หรือ iPod Touch ก็ได้ เพราะว่า มันอ่าน pdf ได้อยู่แล้ว จาก iBook ง่าย และ ฟรี ไม่ต้อง crack โปรแกรมให้ผิดศีล ถ้าไม่ชอบรูปแบบยังไง checkout มาแล้ว compile latex เองได้เลย จัดรูปแบบสวยงามแล้ว commit กลับมา จักเป็นพระคุณยิ่ง NOTE: ถ้าท่านต้องการสนับสนุนเรา ท่านสามารถดาวน์โหลด App ของเราได้ทางมือถือ Android ที่ App Words of God เนื้อหาจะเป็นเนื้อหาเดียวกันกับที่แจกฟรีนี้  ซึ่งใน App ท่านสามารถศึกษาพระคัมภีร์ได้แบบ Offline ซึ่งสามารถใช้งานได้โดยไม่ต้องต่ออินเตอร์เน็ต ท่านสามารถพกไปที่ไหนก็ได้ นอกจากนี้ ใน App ท่านสามารถ Search เพื่อค้นหาพระคัมภีร์ได้ และ ใน App เราไม่ได้เก็บข้อมูลใดๆ ของท่าน (เช่น การติดตามว่าท่านอ่านหน้าไหน, การติดตามว่าท่านค้นหาอะไร)  เดิมทีเราเองทำไว้ให้ทุกท่านสามารถเข้าถึงได้ฟรีทางเว็ปไซท์  ที่นี