28 December 2012

หัวข้ออักษรไทยใน LaTeX

ปกติผมมักจะใช้ LaTeX กับภาษาอังกฤษเป็นหลัก ด้วยหน้าที่การทำงานจะใช้ภาษาอังกฤษเป็นหลัก แต่สัปดาห์ก่อน มีความจำเป็นจะต้องเตรียมเอกสารที่เป็นภาษาไทย และจำเป็นจะต้องใช้ enumerate ที่เป็นลำดับ ก ข ค ง

หลังจากลองดูวิธีนิยาม \alph ก็เลยเลียนแบบตามข้างล่างนี้

\documentclass{article}

\usepackage{xltxtra}
\XeTeXlinebreaklocale "th"
\XeTeXlinebreakskip = 0pt plus 1pt
\setmainfont[Scale=MatchLowercase]{TH Sarabun New}

\makeatletter 
\def\thalph#1{\expandafter\@thalph\csname c@#1\endcsname} 
\def\@thalph#1{\ifcase#1\or ก\or ข\or ค\or ง\or จ\or ฉ\else\@ctrerr\fi} 
\makeatother 

\renewcommand{\theenumi}{\thalph{enumi}}

\begin{document}
 \begin{enumerate}
 \item หัวข้อแรก
 \item หัวข้อที่สอง
 \end{enumerate}
\end{document}

เมื่อคอมไพล์เอกสารนี้ด้วย XeLaTeX จะได้


แต่ตอนหลังเพิ่งมาพบว่า จริงๆ แล้ว Thai LaTeX มีคำสั่ง \thaialph กับ \thaiAlph อยู่แล้ว เพียงใช้ \usepackage[thai]{babel}

ที่มา: เรื่องวุ่น ๆ เกี่ยวกับสารบัญ

01 November 2012

เรียงหน้า PDF ด้วย PDFTK

ผมต้องการ scan เอกสาร โดยแต่ละแผ่นมีข้อความทั้งด้านหน้าและด้านหลัง แต่ scanner ที่มีอยู่ มี feeder ที่สามารถใส่เอกสารเป็นปึกได้ แต่ scan ได้แค่ด้านเดียว ผมก็เลยแก้ปัญหาด้วยการ scan สองรอบ
  • รอบแรก scan หน้าคี่ทั้งหมด  โดยเริ่มจากหน้าแรกของเอกสาร
  • รอบที่สอง scan หน้าคู่ แต่เริ่มจากหน้าสุดท้าย เพราะไม่ต้องเรียงกระดาษใหม่
สุดท้ายได้ไฟล์ PDF มาสองไฟล์ ไฟล์แรกเป็นหน้าคี่เรียงจากหน้าไปหลัง ไฟล์ที่สองเป็นหน้าคู่เรียงจากหลังมาหน้า ผมเอาสองไฟล์ที่มารวมกัน (ถ้าจะใช้ภาษาไทยแบบหรูๆ หน่อยก็ต้องเรียกว่า ผสาน มั้ง) โดยใช้ Pdftk ซึ่งเป็นโปรแกรมสำหรับช่วยจัดการเอกสาร PDF แบบ command-line ปรากฏว่าผมสามารถทำสิ่งที่ผมต้องการได้ด้วยคำสั่งเดียว คือ

$ pdftk A=front.pdf B=back.pdf shuffle A1-end Bend-1 output merged.pdf

คำสั่งนี้สั่งให้ pdftk โหลดไฟล์ PDF ขึ้นมาสองไฟล์ ไฟล์แรกเรียกว่า A ไฟล์ที่สองเรียกว่า B เสร็จแล้วใช้คำสั่ง shuffle ซึ่งเป็น operation สำหรับผสานเอกสาร 2 ฉบับ โดยกำหนดช่วงของหน้าที่ต้องการ ผมกำหนดว่าไฟล์แรกใช้ 1-end เพราะเรียงหน้าไปหลังตามปกติ ส่วนไฟล์ที่สองใช้ end-1 เพราะเรียงกลับจากหลังไปหน้า รวมเสร็จให้เอาไปเก็บไว้ในไฟล์ชื่อ merged.pdf เป็นอันเสร็จสิ้น

ทั้งๆ ที่รู้มาก่อนว่าควรจะใช้ Pdftk แต่ตอนแรกผมก็ไม่คิดว่าจะง่ายขนาดนี้ ประทับใจจริงๆ นี่แหละหนาที่ทำให้เลิกใช้ Linux ไม่ได้ (ถ้าต้องทำบน MS Windows เนี้ย ไม่รู้จะทำไงเลยนะ งมกันนานแน่ๆ)

01 September 2012

บวกเลข 128 บิต

เมื่อวานหลังจากสอนวิชา comp arch ซึ่งกำลังพูดถึงเรื่อง computer arithmetic ก็มีนักศึกษา (ที่ยังไม่ได้ถามว่าเจ้าตัวอยากจะให้ออกนามหรือเปล่า) สงสัยว่า ถ้าเราต้องการบวกเลขที่มีขนาดใหญ่กว่า 64 บิต ซึ่งเป็นขนาดที่คอมพิวเตอร์ปัจจุบันรองรับ จะทำย้งไง หลังจากอธิบายไปจนคิดว่าคนถามน่าจะเข้าใจแล้ว ก็เกิดอาการคันไม้คันมือเล็กน้อย เลยลองเขียนฟังก์ชันบวกเลขขนาด 128 บิต
ฟังก์ชันนี้ทำงานง่ายๆ คือ เก็บข้อมูลจำนวนเต็มขนาด 128 บิต โดยใช้ข้อมูลจำนวนเต็มขนาด 64 บิต 2 ตัวต่อกัน (เรียกเป็นครึ่งบน กับครึ่งล่างละกัน) เวลาจะบวกกัน ก็แค่ เอาครึ่งล่างบวกกัน เอาครึ่งบนบวกกัน แล้วถ้ามีทดจากครึ่งล่างก็ให้เอาไปบวกเพิ่มที่ครึ่งบนด้วย แค่นี้แหละ

#include <stdio.h>
#include <stdint.h>

typedef struct {
    int64_t hi;
    int64_t lo;
} int128_t;

int128_t add128(int128_t x, int128_t y) {
    int128_t z = {0,0};
    
    z.hi = x.hi + y.hi;
    z.lo = x.lo + y.lo;
    if (z.lo < x.lo) {
        z.hi++;
    }
    
    return z;
}

int main(int argc, const char * argv[])
{
    int128_t a = {0x0000000000000001, 0xffffffffffffffff};
    int128_t b = {0x0000000000000000, 0x0000000000000005};
    int128_t c;
    
    c = add128(a, b);
    
    printf("0x%016llx %016llx", c.hi, c.lo);
    
    return 0;
}

จากโปรแกรมนี้ จะได้ c = a+b โดยที่ทั้งหมดเป็นจำนวนเต็มขนาด 128 บิต ซึ่งเก็บในลักษณะ struct ประกอบด้วย hi กับ lo เป็นจำนวนเต็มขนาด 64 บิตทั้งคู่

จุดสำคัญของฟังก์ชันนี้ คือ การทดสอบว่าเกิดการทดเลขจากครึ่งล่างหรือไม่ โดยปกติ processor จะมี carry flag เอาไว้สำหรับเก็บค่าตัวทดหลังจากการบวกเลข แต่ภาษา C มีจุดอ่อนที่ไม่สามารถเรียกใช้ค่า carry flag ได้โดยตรง ถ้าจะทำแบบนั้นก็ต้องเขียน assembly ซึ่งดูไม่สะดวก ผมจึงใช้วิธีการตรวจสอบว่าเกิด overflow ขึ้นในการบวกเลขครึ่งล่างหรือไม่ ถ้าเกิด overflow ก็แสดงว่าจะต้องทดเลข หรือบวก 1 เข้าไปที่ผลบวกของครึ่งบน ตามลิงก์นี้ และต้องขอบคุณ @cutiening ที่ช่วยแสดงวิธี prove ว่า เมื่อ a+b แล้วเกิด overflow จะได้ว่าผลที่ได้ c < a และ c < b เสมอ ก็เลยได้ if statement ตามโปรแกรม เป็นอันเสร็จสิ้นการละเล่นแต่เพียงเท่านี้

ที่นี้บวกเลข 128 บิตได้แล้ว แต่ละแสดงผลลัพธ์ออกมาเป็นเลขฐานสิบได้ยังไง ก็ต้องเป็นคำถามต่อไป

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} 

06 June 2012

ssh/scp โดยไม่ต้องใช้ password

เนื่องจากผมใช้ rsync (ผ่าน scp) เป็นเครื่องมือหลักสำหรับสำรองข้อมูล โดยเก็บไว้ที่ server ซึ่งทำได้ง่ายโดยใช้คำสั่ง

$ rsync -avz --delete Documents cholwich@xxx.com:Backup

การทำงานแบบนี้โดยปกติ จะต้องใส่ password เพื่อ login เข้าไปที่ server ที่เราต้องการเอาไฟล์ไปวางไว้ ถ้าไม่ต้องการใส่ password ทุกครั้ง ก็สามารถทำได้โดยใช้ keypair สำหรับ authentication โดยเอา public key ไปวางไว้ที่ server และคนที่มี private key เท่านั้นที่จะสามารถ login เข้าไปได้โดยไม่จำเป็นต้องใส่ password

ขั้นตอนการตั้งค่า

  1. สร้าง keypair
    $ ssh-keygen -t rsa
    
    ระบุให้เก็บ keypair ไว้ที่ ~/.ssh/ โดยไม่ต้องระบุ passphrase เมื่อเสร็จแล้วจะได้ไฟล์มา 2 ไฟล์ คือ id_rsa เก็บ private key และ id_rsa.pub เก็บ public key
  2. เอาไฟล์ id_rsa.pub ไปวางไว้ที่ฝั่ง server โดยเอาไปต่อท้ายไฟล์ ~/.ssh/authorized_keys ซึ่งเป็นไฟล์สำหรับเก็บรายการของ key ที่ใช้ authentication
    $ cat id_rsa.pub >> ~/.ssh/authorized_keys
    
    หรือ ถ้ายังไม่มีไฟล์นี้อยู่ ก็เปลี่ยนชื่อไฟล์ id_rsa.pub ให้เป็นชื่อ authorized_keys เลย ก็ได้
    $ mv id_rsa.pub ~/.ssh/authorized_keys
    
    (จริงๆ คำสั่งแรกคำสั่งเดียว ก็ครอบคลุมทั้งสองกรณีอยู่แล้ว)

เพียงเท่านี้ ครั้งต่อไปที่เราเชื่อมต่อไปยัง server ก็จะไม่จำเป็นต้องใช้ password อีกแล้ว แต่ยังไงก็คงต้องเก็บรักษา private key เอาไว้ให้ดีๆ ถ้าจะย้ายไปใช้เครื่องอื่น หรือ install เครื่องใหม่ ก็แค่เอา private key กลับไปวางไว้ที่ .ssh ของเราในเครื่อง client ก็พอแล้ว

[C] แบ่งข้อความด้วย strtok

ฟังก์ชัน strtok เป็นฟังก์ชันใน standard C library ใช้สำหรับแบ่ง string ออกเป็นส่วนๆ ตามเครื่องหมาย (delimiter) ที่กำหนด รูปแบบการใช้งานก็เป็น

char *strtok(char *str, const char *delim);


str คือ string ที่ต้องการแบ่งเป็นหลายส่วน และ delim คือ string ของตัวแบ่ง (delimiter) ที่จะใช้แบ่ง string จะเห็นว่า type ของ str กำหนดเป็น char * เนื่องจากฟังก์ชัน strtok จะแก้ไข str เปลี่ยน delim ให้กลายเป็น null character เพื่อแบ่ง string

เมื่อมีการเรียกใช้งานฟังก์ชัน strtok แต่ละครั้ง ฟังก์ชันจะให้ string ที่แบ่งได้ 1 อัน โดยเริ่มจาก str ที่กำหนด ถ้าไม่สามารถแบ่งได้แล้ว เช่น เจอ null character ซะก่อน ก็จะให้ค่าเป็น ์๊NULL ถ้าข้อความที่ต้องการจะแบ่ง ประกอบด้วย token หลายๆ อัน เราจะต้องเรียก strtok หลายๆ ครั้ง แต่ครั้งที่สองเป็นต้นไป จะต้องกำหนดให้ str เป็น NULL เพื่อให้ strtok แบ่งต่อจากครั้งก่อน มิฉะนั้นมันจะเริ่มตั้งแต่ต้นใหม่

#include<stdio.h>
#include<string.h>

int main() {
char str[] = "5022771234,50,60,30";
char delim[] = ",";
char *token;

token = strtok(str, delim);
while(token != NULL) {
printf("Token: %s\n", token);
token = strtok(NULL, delim);
}

return 0;
}


จะได้ผลคือ

Token: 5022771234
Token: 50
Token: 60
Token: 30

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

01 June 2012

ลองใช้บริการเน็ต 3G ในญี่ปุ่น

ช่วงนี้มาทำวิจัยอยู่ที่แล็บในญี่ปุ่น คราวนี้มีชีวิตออนไลน์ที่สนุกสนานมากขึ้น เพราะ @t_maan ไปหาข้อมูลเจอมาว่าเดี๋ยวมี SIM 3G สำหรับใช้รับส่งข้อมูลอย่างเดียวขายแล้ว ชื่อ b-mobile เป็นของบริษัท Japan Communications Inc. เลยลองไปหาข้อมูลรายละเอียดเพิ่มเติมดู ก็เลยรู้ว่า b-mobile เป็น MVNO ที่ใช้เครือข่ายของ NTT Docomo แล้วก็ขาย SIM 3G และ LTE แบบ prepaid ไม่มีค่าบริการรายเดือน มาคราวนี้ก็เลยแวะร้านเครื่องใช้ไฟฟ้า แล้วก็ซื้อมาลองอันหนึ่ง เป็นแบบจำกัดปริมาณข้อมูลไว้ที่ 1GB ราคา 3,000 กว่าเยน ใช้ได้ 30 วัน ไม่แพงนะเมื่อเทียบกับใช้บริการ Data Roaming ซื้อมาเสร็จปรากฏว่า มีข้อจำกัดอันหนึ่งสำหรับเราที่มาแค่ชั่วคราว คือ จะต้องมีใช้โทรศัพท์มือถือโทรไปเปิดบริการ แต่ปัญหานี้ก็แก้ไม่ยาก ด้วยการเดินไปยืมโทรศัพท์เพื่อนในแล็บโทร แล้วเซ็ตค่า APN นิดหน่อยก็ใช้ได้แล้ว

จริงๆ แล้วสำหรับนักท่องเที่ยว b-mobile ก็มี SIM 3G แบบใช้ได้ 30 วัน เรียกว่า b-mobile SIM Visitor ไม่จำเป็นต้องเปิดบริการด้วยมือถือ แต่ดูเหมือนจะต้องซื้อผ่านทางเว็บ ในส่ง SIM มายังที่อยู่ในญี่ปุ่นเท่านั้น ก็เหมาะสำหรับนักท่องเที่ยวที่ไม่ได้รู้จักคนญี่ปุ่น หรือคนที่อยู่ในญี่ปุ่น

อ้อ ตอนซื้อคนขายขู่ว่า มันจะช้ามากนะ เอาจริงๆ แล้ว ความเร็วก็โอเคนะ สำหรับกระเหรี่ยงที่มาจากเมืองไทย


12 May 2012

ลองเล่น AngularJS

เดือนก่อนเห็น @kobkrit แนะนำ AngularJS ที่พัฒนาโดย Google ไว้ใน Google+ ลองอ่านดูก็น่าสนใจ เป็น JavaScript framework แบบ MVC สำหรับสร้าง web application วันนี้ต้องเขียน script สำหรับสร้าง password ใหม่ให้กับระบบที่ดูแลอยู่ เลยค้นไม้คันมือลองใช้ AngularJS ดูหน่อย ทำแอพพลิเคชันแบบง่ายๆ ให้ใส่ username แล้วจะสร้าง password ให้พร้อมทั้งเขียน SQL statement สำหรับเอาไปใช้ update เลยเอา code มาแปะไว้เผื่อมีคนสนใจ ใช้ง่ายดีทีเดียว

ส่วนแรกเป็น HTML ทำหน้าที่เป็น view ใน MVC
<!doctype html>
<html ng-app>
 <head>
  <title>Password Generator</title>
  <script src="./angular-1.0.0rc8.min.js"></script>
  <script src="./pwdgen.js"></script>
  <style type="text/css">
   pre { border: 1px dotted black; }
  </style>
 </head>
 <body>
  <div ng-controller="PasswordCtrl">
   <form ng-submit="genPassword()">
    <label>Name</label>
    <input type="text" ng-model="fullname" 
      placeholder="Enter name">

    <label>User Name</label>
    <input type="text" ng-model="username" 
      placeholder="Enter user name">

    <input type="submit" value="generate">
   </form>
   <div>
    <label>Output</list>
    <pre>{{outputs.list}}</pre>
    <label>SQL</list>
    <pre>{{outputs.sql}}</pre>
   </div>
  </div>
 </body>
</html>

ส่วนที่สองเป็น JavaScript สำหรับทำหน้าที่เป็น controller วิธีสร้าง password ก็ง่ายๆ แค่กำหนดชุดตัวอักษรที่จะใช้ใน password พยายามตัวตัวที่กำกวมออก แล้วก็ random มาต่อกัน 6 ตัว เป็นอันเสร็จสิ้น
function PasswordCtrl($scope) {
 $scope.outputs = {
  sql: '\n',
  list: '\n'
 };

 $scope.genPassword = function() {
  var characters = '23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghjklmnpqrstuvwxyz';
  var passwd = '';
  if ($scope.outputs.sql == '\n') {
   $scope.outputs.sql = '';
   $scope.outputs.list = '';
  }
  for(i=0;i<6;i++) {
   var r = Math.floor(Math.random() * characters.length);
   passwd += characters[r];
  }
  
  $scope.outputs.list += $scope.fullname + '\t' +
    $scope.username + '\t' + passwd + '\n';
  $scope.outputs.sql += 'update faculties set password=MD5(\'' +
    passwd + '\') where username=\'' + $scope.username + '\';\n';  

  $scope.fullname = '';
  $scope.username = '';
 };
}

10 May 2012

คำสั่งและ Package ของ LaTeX ที่ใช้บ่อย (3) -- Tabular

Tabular เป็น environment มาตรฐานของ LaTeX สำหรับวาดตารางในเอกสาร วิธีใช้งานก็ไม่ยาก คือกำหนดรูปแบบการจัดข้อความในแต่ละคอลัมน์ไว้ แล้วก็เขียนเนื้อหาไปที่ละแถว รูปแบบของคอลัมน์แบบมาตรฐานที่เราใช้ได้คือ l คือ ชิดซ้าย, r คือ ชิดขวา, c คือ กึ่งกลาง, p{length} เมื่อต้องการ ตัวอย่างเช่น

\documentclass[12pt]{article}
\begin{document}
 \begin{tabular}{|c|c|c|}
  \hline
  Hello & Hello & Hello \\
  \hline
  Hello & Hello & Hello \\
  \hline
  Hello & Hello & Hello \\
  \hline
 \end{tabular}
\end{document}


รวมคอลัมน์เข้าด้วยกัน

\multicolumn ใช้สำหรับรวมเซลล์หลายคอลัมน์เข้าเป็นเซลล์เดียว สามารถระบุการจัดตัวอักษรได้ด้วย รูปแบบคำสั่งคือ\multicolumn{#cells}{format}{content} โดย #cells คือจำนวนเซลล์ที่เราต้องการรวมเข้าด้วยกัน, format คือรูปแบบการจัดตัวอักษรชิดซ้าย กลาง หรือขวา และ content คือเนื้อหาของเซลล์ที่รวมกันแล้ว บางครั้งคำสั่ง \multicolumn นี้ก็ใช้สำหรับเปลี่ยนแบบรูปแบบการจัดตัวอักษรโดยไม่จำเป็นต้องรวมเซลล์ก็ได้ ตัวอย่างการใช้งาน

\documentclass[12pt]{article}
\begin{document}
 \begin{tabular}{|c|c|c|}
  \hline
  Hello & Hello & Hello \\
  \hline
  \multicolumn{2}{|c|}{Hello} & Hello \\
  \hline
  \multicolumn{3}{|c|}{Hello} \\
  \hline
 \end{tabular}
\end{document}


ลากเส้น

\hline ใช้สำหรับลากเส้นแนวนอน คั่นระหว่างแถว โดยคำสั่งนี้จะต้องใช้หลังจากเครื่องหมาย \\ ที่ระบุว่าหมดแถวแล้ว ถ้าต้องการขีดเส้นเฉพาะบางคอลัมน์ จะใช้คำสั่ง \cline{col1-col2} โดย LaTeX เริ่มนับคอลัมน์จากคอลัมน์ที่ 1 คำสั่ง \cline นี่จะใช้หลายๆ ครั้งในแถวเดียวกันได้ เพื่อให้เราสามารถขีดเส้นหลายช่วงได้ ตัวอย่างการใช้งาน

\documentclass[12pt]{article}

\begin{document}
 \begin{tabular}{|c|c|c|c|}
  \hline
  Hello & Hello & Hello & Hello \\
  \cline{1-2}
  Hello & Hello & Hello & Hello \\
  \cline{1-1}\cline{3-3}
  Hello & Hello & Hello & Hello \\
  \hline
 \end{tabular}
\end{document}


ยืดแถวให้สูงขึ้น

\arraystretch เป็นตัวกำหนดค่าสำหรับความสูงของแถว แต่ LaTeX จะกำหนดความสูงให้อัตโนมัติอยู่แล้ว การเปลี่ยนค่า \arraystretch จะกำหนดความสูงให้มากขึ้นหรือน้อยลง เป็นจำนวนเท่าของความสูงมาตรฐาน จะใช้คำสั่ง \renewcommand ในการเปลี่ยนแปลงค่านี้ เช่น การใช้คำสั่ง \renewcommand{\arraystretch}{1.5} ก่อนเริ่มตาราง จะทำให้ความสูงของแถวในตารางเป็นหนึ่งเท่าครึ่งของความสูงมาตรฐาน ตัวอย่างการใช้งาน

\documentclass[12pt]{article}

\begin{document}
 \begin{tabular}{|c|c|c|}
  \hline
  Hello & Hello & Hello \\
  \hline
  Hello & Hello & Hello \\
  \hline
  Hello & Hello & Hello \\
  \hline
 \end{tabular}
 
 \vspace{5mm}

 {\renewcommand{\arraystretch}{2.0}
 \begin{tabular}{|c|c|c|}
  \hline
  Hello & Hello & Hello \\
  \hline
  Hello & Hello & Hello \\
  \hline
  Hello & Hello & Hello \\
  \hline
 \end{tabular}}
\end{document}


เปลี่ยนระยะห่างขอบเซลล์

LaTeX กำหนดให้มีระยะห่างระหว่างเส้นแบ่งเซลล์กับเนื้อหาในเซลล์ไว้ขนาดหนึ่ง ซึ่งเราสามารถเปลี่ยนระยะห่างนี้ได้โดยใส่รูปแบบ @{} ระหว่างรูปแบบของแต่ละเซลล์ เช่น \begin{tabular}{|@{}l|r@{\hspace{1cm}} จะได้ตารางที่มีคอลัมน์แรกจัดข้อความเริ่มชิดเส้นขอบซ้ายของคอลัมน์โดยไม่มีช่องว่าง ส่วนคอลัมน์ที่
2 จัดข้อความชิดขวา แต่ห่าง 1cm จากเส้นขอบขวาของคอลัมน์ หลักการทำงานของ @{} ก็คือ คำสั่งที่ใช้กำหนดช่องว่างระหว่างคอลัมน์ จะถูกแทนที่ด้วยคำสั่งใดๆ ก็ตามที่อยู่ใน {} เราจึงกำหนดระยะห่างได้ตามต้องการ หรือจะใส่เครื่องหมายอะไรลงไปแทนก็ได้

\documentclass[12pt]{article}

\begin{document}
 \begin{tabular}{|@{}l|c|r@{\hspace{1cm}}|}
  \hline
  Hello & Hello & Hello \\
  \hline
  Hello & Hello & Hello \\
  \hline
  Hello & Hello & Hello \\
  \hline
 \end{tabular}
\end{document}


วันนี้พอแค่นี้ก่อนดีกว่า เอาไว้ว่างๆ ค่อยเขียนใหม่

03 May 2012

คำสั่งและ Package ของ LaTeX ที่ใช้บ่อย (2)

Verbatim

ผมชอบใช้ package fancyvrb เวลาแทรก source code ลงในเอกสาร เพราะสามารถกำหนดรูปแบบได้ต่างๆ ได้ง่าย เช่น สามารถทำกรอบรอบรูป สามารถกำหนดหมายเลขบรรทัดได้



fancyvrb ใช้คำสั่ง \fvset สำหรับระบุรูปแบบของเนื้อหา ในตัวอย่าง frame=single คือกำหนดให้มีเส้นกรอบเป็นเส้นเดี่ยว numbers=left ให้แสดงเลขบรรทัดทางซ้าย tabsize=2 กำหนดขนาดของ tab เป็น 2 ตัวอักษร เสร็จแล้วเวลาจะแทรก code ก็ใช้ Verbatim environment ตามปกติ ส่วน gobble=1 หมายถึง ไม่ให้นับตัวอักษร 1 ตัวทางซ้ายของทุกบรรทัดเป็นส่วนหนึ่งของเนื้อหา ทำให้เราสามารถจัด indentation ของ LaTeX ได้ตามใจ ในกรณีตัวอักษรตัวแรกทางซ้ายจะไม่แสดงในเอกสารผลลัพธ์

ความสามารถอีกอย่างหนึ่งที่ผมชอบมากๆ ของ fancyvrb คือ สามารถดึงข้อความจาก source file ภายนอกมาใช้งานได้ด้วย ทำให้สะดวกในการทำเอกสารที่มี source code ที่ยังมีการแก้ไขอยู่ เช่น



คำสั่ง \VerbatimInput{hello.c} กำหนดให้เอาเนื้อหาของ hello.c มาแสดงใน Verbatim environment คำสั่งนี้ช่วยทำให้สะดวกในการจัดการเอกสาร เพราะเราสามารถแก้ไข source code และตรวจสอบ source code นั้นได้ตลอดเวลา แค่คอมไพล์ LaTeX ใหม่ เอกสารก็จะถูกต้องสวยงาม ไม่มีปัญหาว่าลืมเอา source code ที่แก้ไขแล้วมาแปะใหม่หรือยัง

จุดอ่อนของ fancyvrb มีอยู่ที่เดียวคือ ไม่มี syntax highlight แต่ผมไม่ได้สนใจมาก ถ้าจะให้มี syntax highlight คงต้องไปใช้ package อื่น เช่น listings ซึ่งผมไม่ค่อยรู้สึกว่ามันสวยเท่าไหร่

02 May 2012

คำสั่งและ Package ของ LaTeX ที่ใช้บ่อย (1)

วันนี้มาเขียนรวมคำสั่งและ package ที่ใช้เองบ่อยๆ ไว้ดีกว่า เอาไปหาเองได้ง่ายๆ

กำหนดขนาดกระดาษและระยะขอบ

ผมชอบใช้ geometry สำหรับกำหนดระยะขอบกระดาษ
\usepackage[hmargin=2in,vmargin=1in,a4paper]{geometry}
hmargin เอาไว้กำหนดระยะขอบซ้ายขวา ส่วน vmargin ใช้กำหนดระยะขอบบนล่างของกระดาษ

หัวท้ายกระดาษ

ผมใช้ fancyhdr สำหรับระบุหัวท้ายกระดาษ
\usepackage{fancyhdr}
\pagestyle{fancy}
\lhead{ITS336/ITS451 Artificial Intelligence}
\chead{}
\rhead{Academic Year 2011}
\lfoot{}
\cfoot{}
\rfoot{SIIT, Thammasat University}
\renewcommand{\headrulewidth}{0.4pt}
\renewcommand{\footrulewidth}{0.4pt}
วิธีใช้ก็ไม่ยาก \[lcr]head ใช้ระบุหัวกระดาษซ้าย กลาง ขวา ตามลำดับ ส่วน \[lcr]foot ใช้ระบุท้ายกระดาษ ส่วน \headrulewidth และ \footrulewidth ใช้ระบุให้มีเส้นคั่นระหว่างส่วนหัวท้ายกับเนื้อหาหลัก ถ้าไม่อยากให้มีก็กำหนดให้เป็น 0pt

กำหนดเลขหน้า

คำสั่ง \thepage เป็น counter สำหรับระบุเลขหน้าปัจจุบัน เช่น เราจะระบุเลขหน้าไว้กลางท้ายกระดาษด้วยคำสั่ง
\cfoot{\thepage}
ถ้าต้องการกำหนดเลขหน้าให้เป็นค่าอื่น ไม่เริ่มจากศูนย์ก็ใช้
\setcounter{page}{100}

วันนี้เอาแค่นี้ก่อนละกัน ยังไม่เรื่องฟอนท์อีก

27 April 2012

The Help

คืนนี้เปลี่ยนบรรยากาศมาเขียนเรื่องที่ไม่เกี่ยวกับภาษา C บ้างดีกว่า ที่พยายามเขียนเรื่องภาษา C เยอะ ก็เพราะเห็นว่ามันน่าจะมีประโยชน์กับหลายๆ คน แต่ผมก็อยากเขียนด้วยแหละ ผมเป็นพวกเห็นแก่ตัว ถ้าไม่อยากก็ไม่ทำหรอก ถ้าอยาก แล้วสิ่งที่มันไปพ้องกับประโยชน์คนอื่น ก็ถือว่าโชคดี



วันนี้จะเล่าเรื่องหนังชื่อ The Help ที่ @cutiening แนะนำให้ดู แล้วก็ไปเดินหาซื้ออยู่หลายร้านกว่าจะซื้อ DVD มาได้ หนังเรื่องนี้เป็นหนังฟอร์มเล็กๆ ไม่ค่อยดังเท่าไหร่ เล่าเรื่องราวของสังคมอเมริกันในยุคที่กฎหมายแบ่งแยกสีผิวยังใช้บังคับอยู่ ทำให้คนผิวดำมีสิทธิไม่เท่ากับคนผิวขาวที่อยู่ร่วมในสังคมเดียวกัน

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

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

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

26 April 2012

[C] จัดการ Source code หลายไฟล์ ตอนที่ 3

วันนี้มาเล่าต่อว่า จะทำยังไง ถ้าต้องการแลกเปลี่ยนข้อมูลระหว่างโปรแกรมที่เขียนแยกไว้หลายๆ ไฟล์ หรือต้องการมีตัวแปรแบบ global ที่สามารถเรียกค่าของตัวแปรจากฟังก์ชันหลายๆ ฟังก์ชันที่อยู่คนละไฟล์

ภาษา C ยอมให้ประกาศตัวแปรแบบ global โดยใช้ keyword "extern" เพื่อระบุว่ามีตัวแปรนี้อยู่แล้ว เพียงแต่อ้างถึงตัวแปรตัวเดียวกันนี้ที่ถูกประกาศไว้ที่อื่น ลองดูตัวอย่างโปรแกรมข้างล่างนี้

/* foo.c */
#include<stdio.h>
void func();
int i = 10;
main() {
 printf("i = %d\n", i);
 func();
 return 0;
}

/* bar.c */
#include<stdio.h>

extern int i;

void func() {
 printf("i = %d\n", i);
}

เมื่อคอมไพล์โปรแกรมนี้ gcc foo.c bar.c จะได้ผลเป็น

i = 10
i = 10

เพราะตัวแปร i ที่อ้างถึงทั้งในฟังก์ชัน main และ func เป็นตัวแปรเดียวกัน จึงแสดงค่า เท่ากับ 10 เหมือนกันทั้งสองบรรทัด มีข้อกำหนดเกี่ยวกับตัวแปร extern อีกเล็กน้อย คือ ตัวแปรที่ประกาศเป็น extern จะไม่สามารถกำหนดค่าเริ่มต้นให้ได้ เนื่องจากตัวแปรนั้นไม่ใช่ตัวแปรจริง เป็นแค่การอ้างถึงตัวแปรที่ประกาศไว้ที่อื่น

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

25 April 2012

[C] จัดการ Source code หลายไฟล์ ตอนที่ 2

ต่อจากตอนที่แล้ว ต้นเหตุที่ทำให้ได้ผลไม่ถูก ก็คือการไม่กำหนด function prototype ถ้าคอมไพล์โปรแกรมนี้ใหม่ แต่ใช้คำสั่งเป็น

$ gcc -Wall -o prog2 main2.c func2.c

จะมี warning มาเตือนว่าไม่ได้มีการกำหนด function prototype ของฟังก์ชัน sum

main2.c:7:2: warning: implicit declaration of function ‘sum’ [-Wimplicit-function-declaration]

เมื่อไม่ประกาศ function prototype เอาไว้ คอมไพเลอร์ก็จะไม่ตรวจสอบ type ของ argument ที่ส่งไปที่ฟังก์ชัน และไม่มีการแปลง type ให้ตรงกับที่ฟังก์ชันต้องการ ดังนั้นเมื่อเรียกใช้งานฟังก์ชัน sum โดยกำหนดค่า 5.0 และ 10.0 ซึ่งมี type เป็น double ให้ ก็จะเอา binary representation ของ double ส่งไปให้ฟังก์ชัน แต่ฟังก์ชันบวกเลขแบบ int และส่งค่ากลับเป็น int ผลที่ได้ก็จะประหลาดๆ แบบนี้ที่เห็น

ถ้าต้องการให้ถูกต้อง เราก็จะต้องประกาศ function prototype ของฟังก์ชัน sum เอาไว้ใน main2.c เพื่อให้คอมไพเลอร์รู้ว่าฟังก์ชัน sum รับ argument 2 ตัวเป็น int ทั้งคู่ และจะส่งค่ากลับมาเป็น int คอมไพเลอร์ก็จะแปลงค่า 5.0 และ 10.0 ให้เป็น binary representation แบบ int ก่อนแล้วค่อยส่งไปยังฟังก์ชัน ทำให้ได้ผลลัพธ์ตามต้องการ (จริงๆ ต้องใช้ว่าใกล้เคียงกับที่ต้องการ เพราะการแปลงจาก double ไปเป็น int อาจจะทำให้ค่าของข้อมูลหายไปได้)

Function prototype นี้จะเขียนแยกต่างหาก เป็น header file (.h) ก็ได้ เพื่อความสะดวกในการนำ func2.c ไปใช้กับโปรแกรมอื่นๆ ได้อีก ไม่จำเป็นต้องยึดติดกับ main2.c เลยกลายเป็น 3 ไฟล์ใหม่นี้

/* main3.c */
#include<stdio.h>
#include"func3.h"
main() {
 int i;

 i = sum(5.0, 10.0); 
 printf("sum = %d\n", i);
}

/* func3.c */

int sum(int a, int b) {
 return a+b;
}

/* func3.h */
int sum(int, int);

เติมอีกหน่อยว่าตัวอย่างแรกในตอนที่แล้วทำงานได้ถูกต้อง เพราะไม่มีการส่ง argument ไป และค่าส่งกลับที่เป็น int นั้น เป็น type ปกติอยู่แล้ว

วันนี้เอาแค่นี้ก่อนละกัน พรุ่งนี้ค่อยมาต่อเรื่อง extern

23 April 2012

GVIM Warning

หลังจากเขียนบล็อคเมื่อกลางวันแล้ว ปัญหาก็ยังไม่หมด เวลาเรียก gvim มาใช้งาน อาจจะเจอ warning ประมาณนี้ได้

Unable to register window with path '/com/canonical/menu/xxxxxxx': Timeout was reached


คราวนี้ค้นดูแล้ว ดูเหมือนจะเป็นปัญหาของ Unity ที่ไม่สามารถดึงเมนูของ gvim มาใส่เป็น global menu ได้ เขาบอกว่าวิธีแก้คือให้เรียกใช้ด้วย gvim -f ก็เลยต้องไปแก้ .bashrc เติมอีกบรรทัดว่า

alias gvim="gvim -f"

เพื่อเรียก gvim เป็นแบบ foreground ตลอด หวังว่าจะไม่เจออะไรอีกแล้วนะ

อ้างอิง gvim occasionally shows error "Unable to register window with path... Timeout was reached"

กำจัด Gtk-WARNING ใน Ubuntu

ปกติผมชอบเรียกใช้โปรแกรมต่างๆ จาก command line ใน terminal เพราะว่าผู้ถนัดกับการใช้คีย์บอร์ดมากกว่าเลื่อนมือไปจับเมาส์ แต่เวลาเรียกใช้โปรแกรม Gtk ใน Ubuntu ผมมักจะเจอข้อความเตือนข้างล่างนี้ ซึ่งทำให้รำคาญ

Gtk-WARNING **: Unable to locate theme engine in module_path: "pixmap",

วันนี้เพิ่งเจอว่าเราสามารถแก้ได้ง่ายๆ ด้วยการลง package "gtk2-engines-pixbuf" ก็จะไม่เกิด warning อันนี้ เพราะมันจะหา engine เจอแล้ว

อ้างอิง: Gdk Gtk warnings and errors from the command line

21 April 2012

Ubuntu + XeTeX + THSarabunNew

เนื่องจากช่วงนี้จะต้องเตรียมเอกสารบางอย่างเป็นภาษาไทย และอยากใช้ LaTeX สำหรับทำเอกสาร ไม่อยากใช้โปรแกรม word processor ไม่ว่าตระกูลไหน รุ่นไหนก็ตาม วันนี้เลยลองใช้ XeTeX บน Ubuntu 11.10 เนื่องจาก XeTeX อนุญาตให้เราเอาฟอนท์ที่ติดตั้งไว้กับระบบปฏิบัติการมาใช้งานได้เลย ไม่จำเป็นต้องเตรียมอะไรให้ยุ่งยาก แถม XeTeX ยังเรียกใช้ ICU สำหรับตัดคำภาษาไทยให้อยู่แล้วด้วย

สิ่งที่ต้องเตรียม

  1. ฟอนต์สารบรรณ ดาวน์โหลดได้จาก http://www.f0nt.com/release/th-sarabun-new/ 
  2. Ubuntu ผมใช้รุ่น 11.10 อยู่ แต่อีกไม่กี่วันคงเปลี่ยนไปใช้ 12.04 ซึ่งก็คงใช้ได้เหมือนกัน
  3. TeXLive ที่มี XeTeX ผมติดตั้งด้วยคำสั่ง
    $ sudo apt-get install texlive-latex-recommended texlive-xetex


ขั้นตอน

  1. ติดตั้งฟอนต์สารบรรณ ให้ Ubuntu รู้จักก่อน โดย copy ไฟล์ ttf ที่ได้มา ไปไว้ที่ /usr/share/fonts/truetype จะสร้าง subfolder ในนั้นก็ได้ เสร็จแล้วก็สั่ง update ข้อมูลฟอนต์
    $ fc-cache -fv
  2. เตรียมไฟล์เอกสารตามตัวอย่าง
    \documentclass[12pt]{article}
    \usepackage{fontspec}
    \usepackage{xunicode}
    \usepackage{xltxtra}

    \XeTeXlinebreaklocale “th”
    \XeTeXlinebreakskip = 0pt plus 1pt
    \defaultfontfeatures{Scale=1.4}

    \setmainfont{TH Sarabun New}

    \begin{document}

    \section{ทดสอบหัวข้อ}
    ทดสอบภาษาไทยทดสอบภาษาไทยทดสอบภาษาไทย ทดสอบภาษาไทยทดสอบภาษาไทยทดสอบภาษาไทย ทดสอบภาษาไทยทดสอบภาษาไทยทดสอบภาษาไทย ทดสอบภาษาไทยทดสอบภาษาไทยทดสอบภาษาไทย ทดสอบภาษาไทยทดสอบภาษาไทยทดสอบภาษาไทย \textbf{ทดสอบภาษาไทย}ทดสอบภาษาไทย\textit{ทดสอบภาษาไทย} Test ฟุ้งฟุ้งฟุ้งฟุ้ง ฟุ้งฟุ้งฟุ้งฟุ้ง ฟุ้งฟุ้งฟุ้งฟุ้ง ฟุ้งฟุ้งฟุ้งฟุ้ง ฟุ้งฟุ้งฟุ้งฟุ้ง ฟุ้งฟุ้งฟุ้งฟุ้ง
    \end{document}
  3. สร้าง PDF จากไฟล์ LaTeX ที่เตรียม ก็จะได้ผลตามรูป


อ้างอิง

ทดสอบ MikTeX 2.9 + ฟอนต์ TH SarabunPSK

19 April 2012

Gnuplot and Lion

ผมมักจะใช้ Gnuplot สำหรับว่ากราฟผลการทดลองต่างๆ เวลาเขียนบทความวิจัย แต่ Gnuplot ก็เป็นไม้เบื่อไม้เมากับ Mac OS X มาตลอด ไม่ว่าจะใช้ Fink, MacPorts, หรือ Homebrew ก็ขึ้นอยู่กับ library มากมาย แถมบางทีก็เกิด error ระหว่างคอมไพล์ จุดนี้เป็นปัญหาหลักอย่างหนึ่งของผมที่ใช้ OS X ถ้าใช้ Ubuntu ปัญหาทุกอย่างจะคลี่คลาย เพราะติดตั้งได้สะดวกมาก แค่ apt-get install gnuplot ก็เรียบร้อยแล้ว

เมื่อวานผมเพิ่งค้นพบวิธีที่ง่ายที่สุดในการติดตั้ง Gnuplot บน Mac OS X คือ ไปเอา binary package มาจาก Octave-Forge เพราะ dmg ของ octave จะมี gnuplot มาด้วย แต่ถึงกระนั้นปัญหาก็ยังไม่จบ เพราะ Lion มีการปรับเปลี่ยน library อีก ต้องไปแก้ไฟล์ script สำหรับเรียก Gnuplot ซึ่งมีบอกไว้ละเอียดแล้ว แค่ทำตามทุกอย่างก็จบ

นิทานเรื่องนี้สอนให้รู้ว่า ถ้าจะทำงานกับ open source softwareใช้ Ubuntu ง่ายสุด