Archive

Archive for December, 2011

virtual จำเป็นหรือไม่สำหรับ Method ที่เป็นตัว Override ของคลาสที่สืบทอดไป

เวลา Override method คนส่วนมากมักจะใช้ virtual บน Method ที่เป็นตัว Override แบบด้านล่าง

class Root
{
public:
	Root()
	{
	}

	virtual ~Root()
	{
	}

	virtual void Bar()
	{
	}
};

class Foo : public Root
{
public:
	Foo()
	{
	}

	virtual ~Foo()
	{
	}

	virtual void Bar()
	{
	}
};

แต่ในความเป็นจริงแล้ว มันไม่มีความจำเป็นเลย Code ด้านล่างนี้ทำงานเหมือนกับ Code ข้างบน

class Root
{
public:
	Root()
	{
	}

	virtual ~Root()
	{
	}

	virtual void Bar()
	{
	}
};

class Foo : public Root
{
public:
	Foo()
	{
	}

	~Foo()
	{
	}

	void Bar()
	{
	}
};

และด้านล่างนี้คือ Code ตัวอย่างพร้อมผลลัพธ์การทำงาน

#include <stdio.h>

class Root
{
public:
	Root()
	{

	}

	virtual ~Root()
	{
		printf("In ~Root()\n");
	}

	virtual void Boo()
	{
		printf("In Root::Boo()\n");
	}

	virtual void Bee()
	{
		printf("In Root::Bee()\n");
	}
};

class Foo : public Root
{
public:
	Foo()
	{

	}

	~Foo()
	{
		printf("In ~Foo()\n");
	}

	void Boo()
	{
		printf("In Foo::Boo()\n");
	}

	virtual void Bee()
	{
		printf("In Foo::Bee()\n");
	}

	virtual void Bam()
	{
		printf("In Foo::Bam()\n");
	}
};

class Bar : public Foo
{
public:
	Bar()
	{

	}

	~Bar()
	{
		printf("In ~Bar()\n");
	}

	void Boo()
	{
		printf("In Bar::Boo()\n");
	}

	void Bam()
	{
		printf("In Bar::Bam()\n");
	}
};

int main(int argc, char *argv[])
{
	Foo *foo = new Bar();
	Root *root = foo;

	foo->Boo();
	foo->Bam();
	root->Bee();

	delete root;

	return 0;
}

ผลลัพธ์

In Bar::Boo()
In Bar::Bam()
In Foo::Bee()
In ~Bar()
In ~Foo()
In ~Root()

Advertisements

ทำไมบางโปรแกรมใน Android ถึงชอบเปิดขึ้นมาเองทั้งๆที่เราไม่ได้เปิด?

เหตุที่ได้เขียนเรื่องนี้ขึ้นมา เพราะเมื่อคืนวันศุกร์ที่ผ่านมา ผมได้ไปเอาเสื้อผ้าที่ฝากไว้กับพี่สาวที่โรงพยาบาลจุฬาลงกรณ์ตอนที่หนีน้ำท่วม แล้วเขามาถามผมว่า “ทำไมโปรแกรมพวกนี้มันชอบเปิดขึ้นมาเองทั้งๆที่ไม่ได้กดเปิดมันเลย พอกด Kill มันก็เปิดขึ้นมาใหม่อีก ปิดยังไงก็ไม่ได้” พร้อมกับเปิด Task Killer ให้ผมดูรายชื่อโปรแกรมที่มันทำงานขึ้นมาเอง บวกกับเห็นคำค้นหาที่มีคนค้นหาเกี่ยวกับเรื่องนี้เข้ามาด้วย ก็เลยตัดสินใจเขียนเรื่องนี้ขึ้นมา

เหตุผลที่โปรแกรมเหล่านั้นมันทำงานขึ้นมาเอง เพราะตัวมันเองเป็นโปรแกรมประเภท Service กล่าวคือ ตัวมันเป็นโปรแกรมที่ต้องการทำงานเบื้องหลังตลอดเวลา เช่น Whatsapp ที่ต้องรอรับข้อความตลอดเวลา

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

Hash Generator 1.0.40.0 โปรแกรมสำหรับคำนวน Hash (เช่น SHA-2)

โปรแกรมสำหรับคำนวน Hash จากข้อความ (ตอนนี้มีแค่ SHA-2 256 Bits นะ เพราะเขียนแบบเร่งรีบมาก ขนาดเร่งรีบยังใช้เวลาทั้งวันในการเขียน) เหตุที่ต้องเขียนขึ้นมาใหม่เพราะอยู่ๆก็จำเป็นต้องสร้าง SHA-2 256 Bits แล้วไปหาใน Google ก็เจอแต่แบบบนเว็บ ซึ่งอันตรายมาก เพราะส่วนมากมันจะดักข้อความที่เราเอาไปทำ Hash เพื่อไว้ใช้ทำ Reverse Hash Lookup

หน้าตาโปรแกรม

Main Window (Windows 7 Aero)

จิ้ม ที่นี่ เพื่อดาวน์โหลด

ระบบขั้นต่ำที่ต้องการคือ Windows XP (หรือถ้าเอาไปรันได้ต่ำกว่า XP ก็ไม่ว่ากัน) หากรันไม่ขึ้น ให้ทำการติดตั้ง Microsoft Visual C++ 2010 SP1 Redistributable Package (x86) เสียก่อน หากต้องการ Hash ชนิดอื่นลอง Comment ขอไว้ดู เผื่อทำให้ได้ก็จะทำให้

อ๋อ โปรแกรมนี้เป็น Open Source โดยใช้ Apache License 2.0 นะ ปิด src ไว้แล้วเดียวอาจจะหาว่าแอบดักข้อความทำ Hash ส่งกลับมาให้ผม ถ้าไม่มั่นใจกับ Binary ที่ผมทำก็ตรวจสอบ Code แล้วคอมไพล์เอาเองเด้อ

Categories: Software, Windows Tags: ,

Stock Kernel ของ I9100TDCKK3

อันนี้ผมดั้มจากเครื่องศูนย์ DTAC ที่อัพเดต 2.3.6 ตัวล่าสุดนะคับ ดาวน์โหลดได้จาก ที่นี่

Update

พึ่งจะเห็นว่ามันมีใน http://samsung-updates.com/gt-i9100-galaxy-sii/ แล้ว แต่จากการตรวจสอบ พบว่า Kernel มันเป็นคนละตัวกันกับอันที่ผมดั้มจากเครื่องศูนย์ DTAC

อะไรจะเกิดขึ้นเมื่อทำการเรียก Default Assigment Operator กับคลาสที่มี Constant Member

ปรกติแล้ว ตามมารตฐาน C++ คอมไพล์เลอร์จะทำการสร้าง Assignment Operator มาให้ทุกคลาสโดยอัตโนมัติหากเราไม่สร้างมันขึ้นมา ซึ่งการทำงานของ Default Assignment Operator ตัวนี้ จะทำการเรียก Assignment Operator ของ Member ทุกตัวภายในคลาสหาก Member ตัวนั้นเป็น Object แต่หาก Member ตัวนั้นเป็นตัวแปรทั่วๆไป (เช่น int) รวมถึงตัวแปรแบบ struct ก็จะทำการ Copy ข้อมูลแบบปรกติ

หาก Member ของคลาสมีตัวที่เป็น Constant อยู่ละจะเกิดอะไรขึ้น? ผลลัพธ์คือ…

สรุป

หาก Member ของคลาสมี Constant อยู่ Assignment Operator จะไม่ถูกสร้างขึ้นมาโดยอัตโนมัติ