Archive

Archive for June, 2007

FoilTeX

June 29th, 2007
Comments Off

ปกติจะใช้ LaTeX-Beamer สำหรับทำสไลด์ประกอบการสอน เพราะใช้ง่าย และสบายกว่าโปรแกรมพรีเซนเตชันต่างๆ ไม่ว่าจะเป็น MS Powerpoint หรือ Keynote แต่พอใช้มานานๆ ก็รู้สึกว่าสไลด์ที่ได้มันดูยุ่งเหยิงยังไงก็ไม่รู้ อยากได้อะไรที่เรียบง่ายๆ ทำให้เกิดปฎิบัติการตามหา LaTeX class ใหม่ สำหรับทำสไลด์

พอดีไปเจอเว็บเป็น wiki ภาษาญี่ปุ่นแนะนำ class ที่เกี่ยวกับพรีเซนเตชันไว้หลายแบบ สุดท้ายเลยเลือก FoilTeX เพราะดูหน้าตาเรียบง่าย แต่ก็สามารถปรับแต่งได้พอสมควร สำหรับวิธีติดตั้งและใช้งานก็ง่ายมาก

เริ่มจาก เข้าไปที่ CTAN.org เอาแพคเกจรุ่นใหม่สุดมาก่อน หลังจากระเบิดไฟล์ออกมาแล้ว ก็รัน

$ latex foiltex.ins

ก็จะได้ไฟล์ต่างๆ ที่เกี่ยวข้องมาหลายไฟล์ ให้ไปสร้าง directory ไว้ใน texmf tree เช่น /usr/local/texmf.local/tex/latex/foiltex เอาไฟล์ตามระบุไว้ตอนท้ายของโปรแกรมติดตั้ง มาใส่ไว้ทั้งหมด แล้วก็

$ mktexlsr

เพื่อปรับปรุงฐานข้อมูลเกี่ยวกับไฟล์ก็เป็นอันเสร็จสิ้น เอาไฟล์มาลองสร้างสไลด์ได้เลย

\documentclass[30pt,Screen4to3]{foils}

\begin{document}
    \foilhead{This is my first slide}
    \begin{itemize}
        \item \dots
    \end{itemize}
\end{document}

สไลด์ที่ได้จะมีหน้าตาเรียบๆ (คือไม่มีอะไรเลย) แต่นี่แหละคือสิ่งที่อยากได้ตอนนี้ (ทั้งๆ ที่ก่อนหน้านี้เสียเวลาปรับแต่ง beamer ได้เป็นวัน)

latex

ActiveScaffold

June 28th, 2007

วันก่อนลองค้นไปค้นมา เจอ ActiveScaffold ซึ่งเป็น plugin สำหรับ Ruby on Rails ซึ่งสนับสนุน Ajax และสามารถปรับแต่งวิธีการแสดงผลต่างๆ ของ Scaffold ได้ง่ายๆ เลยกำลังคิดว่าจะเอามาใช้กับระบบที่กำลังทำอยู่

programming ,

เส้นทแยงมุมใน Tabular

June 11th, 2007

วันนี้จะทำตารางอันหนึ่งโดยใช้ tabular environment ของ LaTeX แล้วต้องการเส้นทแยงมุมบางหัวตาราง ลองหาดูพบว่ามีแพคเกจจัดการเรื่องนี้อยู่แล้ว ชื่อ slashbox.sty วิธีใช้งานก็เพียงแค่ใช้คำสั่ง \slashbox{}{} หรือ \backslashbox{}{} ตามแต่ลักษณะของเส้นที่ต้องการ ว่าจะให้ทแยงไปทางไหน รวมทั้งสามารถระบุข้อความในแต่ละส่วนได้ด้วย เช่น

\begin{tabular}{lccccc}
\backslashbox{Day}{Period} & 8:30-10:25 & ...
\end{tabular}

อ้างอิง: http://www.biwako.shiga-u.ac.jp/sensei/kumazawa/tex/slashbox.html

latex

qsort@stdlib

June 5th, 2007

ในไลบรารีมาตรฐานของภาษาซี มีฟังก์ชันสำหรับจัดการข้อมูลที่สำคัญอยู่ 2 ฟังก์ชัน คือ bsearch สำหรับการค้นหาข้อมูลแบบ binary search และ qsort สำหรับเรียงลำดับข้อมูลโดยใช้อัลกอริทึม quick sort โดยปกตินักศึกษาส่วนใหญ่มักจะไม่ใช้ เพราะมันดูเหมือนจะยุ่งยากซับซ้อน โดยเฉพาะเรื่องเกี่ยวกับ pointer วันนี้ต้องเขียนโปรแกรมเพื่อเรียงลำดับสายอักขระ เลยเอามาเขียนอธิบายวิธีการใช้ไว้หน่อย เผื่อจะเป็นประโยชน์ต่อตัวเอง และคนที่ผ่านมาเห็น

void qsort(void *base, size_t nmemb, size_t size, int(*compar)(const void *, const void *))

จาก function prototype จะเห็นว่าฟังก์ชันนี้ต้องการ argument 4 ตัว คือ

  1. base เป็น pointer ที่ชี้ไปยังอะเรย์ที่ใช้เก็บข้อมูลทั้งหมด
  2. nmemb ใช้ระบุจำนวนสมาชิกของอะเรย์ที่ต้องการเรียงลำดับ
  3. size กำหนดขนาดของข้อมูลแต่ละชุด ซึ่งจำเป็นต้องใช้เวลาย้ายข้อมูลสลับตำแหน่งกัน
  4. compar เป็น pointer ที่ชี้ไปยังฟังก์ชัน เพื่อเปรียบเทียบสมาชิกแต่ละตัวในอะเรย์ ฟังก์ชันนี้ควรจะให้ค่าน้อยกว่าศูนย์ เท่ากับศูนย์ และมากกว่าศูนย์ เช่นเดียวกับฟังก์ชัน strcmp

ตัวอย่าง ผมต้องการเรียงลำดับสตริง ซึ่งในภาษาซีจะใช้ char * ดังนั้นผมจึงสร้างตัวแปรแบบ char ** เพื่อเป็นอะเรย์สำหรับเก็บ pointer ที่ชี้ไปยังสตริงแต่ละตัว ส่วน nmemb ก็คือจำนวนสมาชิกของอะเรย์ กับ size ก็คือ sizeof(char) หาได้ไม่ยาก ปัญหาหลักอยู่ที่ฟังก์ชันสำหรับเปรียบเทียบข้อมูล ซึ่งจะเห็นว่าเรามีฟังก์ชัน strcmp สำหรับเปรียบเทียบสตริงอยู่แล้ว เพียงแต่ prototype อาจจะไม่เหมือนกัน เลยต้องทำฟังก์ชันขึ้นมาห่อไว้หน่อย

int compare(const void *a, const void *b) {
    const char **pa = (const char **)(a);
    const char **pb = (const char **)(b);
    return strcmp((*pa), (*pb));
}

อ้อ เวลาฟังก์ชัน qsort เรียก compar มาทำงาน จะเรียกโดยส่ง pointer ที่ชี้ไปยังสมาชิก 2 ตัวในอะเรย์ไปให้ ฉะนั้นจึงต้องมา cast ให้เป็น char ** ก่อน แล้วถึงจะไปเรียกใช้ strcmp ได้ ส่วนการเรียกฟังก์ชัน qsort ก็แค่

qsort(a, n, sizeof(char *), compare);

สุดท้ายที่อยากฝากไว้ก็คือ “don’t reinvent the wheel” เราควรจะใช้สิ่งที่มีอยู่แล้วให้เป็นประโยชน์ให้มากที่สุด โดยเฉพาะอย่างยิ่งฟังก์ชันมาตรฐานต่างๆ เพราะฟังก์ชันเหล่านี้ได้รับการพัฒนามายาวนาน ผ่านร้อนผ่านหนาวมาเยอะ น่าจะทำงานได้ดีกว่าการเขียนฟังก์ชันขึ้นมาใช้งานเอง แต่ทั้งนี้ไม่ได้บอกว่าไม่ควรทำเองนะ เพียงแต่พยายามปรับใช้สิ่งต่างๆ ที่มีอยู่ให้ดี เพื่อจะได้มีเวลาไปทำให้สิ่งใหม่ๆ

อ้างอิง: man qsort

programming , ,

BonEcho 2.0.0.4 (universal binary)

June 1st, 2007

ไหนๆ เมื่อวานก็คอมไพล์ BonEcho (Firefox) รุ่น 2.0.0.4 สำหรับ G4 ใช้เองแล้ว ก่อนนอนก็เลยตั้งให้คอมไพล์แบบ universal binary ด้วย (มันนานมากซะจนไม่อยากรอ) ตื่นเช้ามาก็เรียบร้อย เอาไปวางไว้ที่นี่แล้ว (ขนาดประมาณ 18MB)

ส่วน intel binary อย่างเดียว มีคุณ pittaya ทำไว้ที่นี่แล้ว (thanks Oakyman ที่ช่วยลิงก์ให้)

firefox, mac ,