16 August 2012

Virtual Method คืออะไร? (1)

Virtual method เป็นแนวคิดของ object-oriented programming ที่ไม่ค่อยเห็นกันเท่าไหร่ เพราะภาษาส่วนใหญ่ อย่างเช่น Java และ Python จะกำหนดให้ method ทุกอันเป็น virtual method ทั้งหมด คนที่เรียนใหม่ๆ จึงรับแนวคิดนี้ไปโดยไม่รู้ตัว ภาษาที่สามารถกำหนด metho d ได้ว่าเป็น virtual หรือไม่ ที่ผมพอรู้จักก็มี C++ และ C# พอดีวันก่อนผมโดนถามเกี่ยวกับเรื่องนี้ในภาษา C# ก็เลยขอเอามาเขียนเล่าไว้หน่อย เผื่อจะเป็นประโยชน์เวลาโดนถามอีก

Virtual method เกิดมาจากความคิดของ OOP ที่ต้องการขยายความสามารถของ class ที่สร้างไว้ก่อนแล้ว ด้วยวิธี inherit แล้ว override method เพื่อแก้ไขการทำงานบางส่วนของ class การใช้ virtual method ทำให้เราไม่ต้องตามไปแก้ไข method อื่นๆ ที่เรียกใช้ method ที่เราปรับปรุงทั้งหมด การระบุว่า method เป็น virtual method หมายความว่าให้เรียก method นั้นตาม object ที่สร้างขึ้นจริง ไม่ใช่เรียกตาม class ของตัวแปรที่สร้างขึ้น ลองดูตัวอย่างดีกว่า

ตัวอย่างแรกเป็น method แบบที่ไม่ใช่ virtual method

using System;

class A {
 public void print() {
  Console.WriteLine("This is A.");
 }
}

class B : A {
 public new void print() {
  Console.WriteLine("This is B.");
 }
}

class MyProgram {
 public static void Main() {
  A a1 = new A();
  a1.print();

  A a2 = new B();
  a2.print();

 }
}

โปรแกรมแรกนี้กำหนด Class A ซึ่งมี method ชื่อ print แล้วกำหนด Class B ให้เป็น subclass ของ A มี method ชื่อ print เช่นเดียวกัน (สังเกตว่าจะมี keyword ว่า new อยู่หน้า print ใน B อันนี้ C# เขาเรียกว่า method hiding คือการซ่อน method ของ superclass) เสร็จแล้วเรามี class MyProgram เอาไว้เป็น main program จะเห็นว่า ผมกำหนดตัวแปรสองตัว คือ a1 กับ a2 ตัวแปร a1 ชี้ไปที่ object ของ class A, ส่วน a2 ชื้ไปที่ object ของ class B (ปกติเราสามารถกำหนด object ของ subclass ให้กับตัวแปรของ superclass ได้อยู่แล้ว เพราะถือว่า subclass มีคุณสมบัติทุกอย่างของ superclass) เมื่อเรียกโปรแกรมนี้มาทำงาน จะได้

This is A.
This is A.

เหตุที่ผลลัพธ์เป็นอย่างนี้เพราะตัวแปร a1 และ a2 เป็นตัวแปรของ Class A เมื่อเรียก print ก็จะไปเรียก method แรกของ Class A มาทำงาน เราต้องคิดว่า object ของ Class B มีคุณสมบัติของ Class A รวมอยู่ด้วยแล้ว

ยังไม่ถึงเรื่อง virtual method เลย แต่วันนี้เอาไว้แค่นี้ก่อน วันหลังจะมาเขียนต่อ

14 August 2012

เขียนโปรแกรม C# บน Ubuntu

พอดีมีโอกาสได้ลองเขียนโปรแกรม C# บน Ubuntu โดยใช้ผ่าน Mono เลยขอจดกันลืมไว้หน่อยว่า จะต้องติดตั้ง package สองอัน คือ

$ sudo apt-get install mono-runtime mono-gmcs 

เมื่อติดตั้งเสร็จแล้ว ก็สามารถใช้งานได้ โดยลองเขียนโปรแกรม Hello, World ดู

using System;

class Hello {
 public static void Main() {
  Console.WriteLine("Hello, World");
 } 
}

ลอง compile ด้วยคำสั่ง gmcs จะได้ไฟล์ .exe สามารถทำงานได้

$ gmcs hello.cs

$ ./hello.exe
Hello, World

ที่มา: How to Compile and Run C# .NET application on Ubuntu

10 August 2012

LaTeX (5) -- เพิ่มระยะห่างระหว่างบรรทัดของ Equation

ปกติเวลาพิมพ์สมการใน LaTeX ผมมักจะใช้ align environment ที่มากับ amsmath เพราะดูเหมือนจะจัดบรรทัดได้สวยพอดี แต่ก็จะมีปัญหาบ้างเวลาที่จะต้องพิมพ์สมการที่เป็นเศษส่วนหลายๆ บรรทัดติดกัน เพราะระยะระหว่างบรรทัดจะน้อยเกินไป ดูอึดอัดชอบกล ลองปรึกษา Google ดู ก็ไปเจอว่ามีวิธีเปลี่ยนระยะระหว่างบรรทัด โดยเปลี่ยนค่าของ \jot ทำให้ได้ระยะที่ห่างขึ้นอึดอัดน้อยลง

\documentclass[12pt]{article}

\usepackage[margin=1in,a4paper]{geometry}
\usepackage{amsmath,amssymb}

\begin{document}

\begingroup
\addtolength{\jot}{5mm}
\begin{align}
 \textit{CPU time} 
 &= \textit{CPU clock cycles}\times\textit{Clock cycle time}\\
 &= \frac{\textit{CPU clock cycles}}{\textit{Clock rate}}\\
 &= \frac{\textit{Instruction count}\times\textit{CPI}}{\textit{Clock rate}}\\
 &= \frac{\sum_{i=1}^{n}(\textit{Inst count}_i\times\textit{CPI}_i)}
 {\textit{Clock rate}}
\end{align}
\endgroup

\begin{align}
 \textit{CPU time} 
 &= \textit{CPU clock cycles}\times\textit{Clock cycle time}\\
 &= \frac{\textit{CPU clock cycles}}{\textit{Clock rate}}\\
 &= \frac{\textit{Instruction count}\times\textit{CPI}}{\textit{Clock rate}}\\
 &= \frac{\sum_{i=1}^{n}(\textit{Inst count}_i\times\textit{CPI}_i)}
 {\textit{Clock rate}}
\end{align}

\end{document}

จะได้ผลตามรูปข้างล่าง จะเห็นว่าระยะห่างดูดีขึ้น ไม่อึดอัด




คำสั่ง \begingroup และ \endgroup ใช้กำหนดให้การเพิ่มระยะ มีผลเฉพาะในส่วนนี้เท่านั้น ไม่กระทบกับส่วนอื่นของเอกสาร

ที่มา: http://tex.stackexchange.com/questions/14679/amsmath-align-environment-row-spacing

03 August 2012

คำสั่งและ Package ของ LaTeX ที่ใช้บ่อย (4) -- กำหนดขนาดฟอนท์ด้วย extsizes

ในกรณีที่เราใช้ LaTeX แบบดั้งเดิม (เช่น ใช้ pdfLaTeX) ไม่ได้ใช้ XeLaTeX การกำหนดขนาดฟอนท์ของเอกสาร จะไม่สะดวกเท่าที่ควร Class มาตรฐาน อย่างเช่น article จะมีขนาดฟอนท์ให้เลือกได้แค่ 3 ระดับ คือ 10pt 11pt และ 12pt ถ้าเราจะเตรียมเอกสารที่มีขนาดตัวอักษร (สำหรับข้อความเนื้อหา) ใหญ่กว่าปกติ หรือเล็กกว่าปกติ จะต้องใช้ package ที่ชื่อว่า extsizes ซึ่งจะทำให้เรากำหนดขนาดตัวอักษรได้ตั้งแต่ 8pt ไปจนถึง 20pt สะดวกมากขึ้นสำหรับเตรียมเอกสารที่ไม่ใช้บทความแบบปกติ

\documentclass[14pt]{extarticle}

\begin{document}
This document uses the font sized 14 points. 
\end{document}