วันนี้ลองใช้ Bluetooth Mouse ที่มีอยู่ หลังจากที่ไม่ได้ใช้มานาน (หลังๆ ใช้แต่ touchpad จนนิ้วเริ่มสึก) ปรากฏว่าไม่สามารถใช้ scroll wheel ได้ แถม Ubuntu รุ่นหลังๆ ใช้ HAL ทำให้ไม่สามารถแก้ข้อกำหนดเกี่ยวกับ mouse ในไฟล์ xorg.conf ได้
วิธีการแก้ไขจะต้องไปสร้างไฟล์ชื่ /etc/hal/fdi/policy/mouse.fdi แล้วใส่
<?xml version="1.0" encoding="UTF-8"?>
<match key="info.product" string="Mouseemu virtual mouse">
<merge key="input.x11_options.ZAxisMapping" type="string">4 5</merge>
</match>
เพื่อเพิ่ม option ที่เกี่ยวกับ scroll wheel สำหรับ mouse สุดท้ายรีบูทเครื่องใหม่ ก็เรียบร้อย
linux
bluetooth, hal, X
การใช้ LaTeX ทำสไลด์สำหรับใช้สอนหนังสือ จะมีความลำบากนิดหน่อยในการเตรียม handout สำหรับแจกนักศึกษา (จริงๆ แล้ว ไม่ค่อยอยากแจกเท่าไหร่ พอมีสไลด์ครบแล้ว ส่วนใหญ่ก็จะคุยกันเยอะ) ถ้าใช้ Beamer ก็จะมีแพคเกจ pgfpages มาให้ใช้สำหรับพิมพ์สไลด์หลายๆ หน้ารวมกันในหน้าเดียวอยู่แล้ว แต่ผมชอบใช้โปรแกรม pdfnup ที่มาพร้อมกับแพคเกจ pdfjam บน Ubuntu มากกว่า วิธีใช้ก็ง่ายๆ เช่น
$ pdfnup --nup 2x2 --frame true myslides.pdf
จะได้ผลลัพธ์เป็นไฟล์ PDF ชื่อ myslides-2×2.pdf วางสไลด์สี่หน้าต่อหนึ่งแผ่น แบบ 2 คูณ 2
ทีนี้ทุกเทอมก็ใช้อย่างนี้มาตลอด มาเทอมนี้อยากให้มีเลขหน้าเพิ่มเข้าไปด้วย จะได้เรียงลำดับหน้าต่างๆ ได้ไม่ยาก (ปกติร้านถ่ายเอกสารจะใช้มือเขียนเลขหน้าให้) วิธีที่ง่ายที่สุดก็คือไปหา Adobe Acrobat ตัวจริงมา จะมีฟังก์ชันให้ใส่เลขหน้าโดยอัตโนมัติ แต่เนื่องจากเราไม่อยากเสียตังค์ ก็เลยมานั่งดูโปรแกรม pdfnup ว่าจริงๆ เป็นสคริปต์ที่สร้างไฟล์สำหรับ pdfLaTeX ที่ใช้แพคเกจ pdfpages เพื่อเอาหน้าหลายๆ หน้ามาเรียงไว้ในหน้าเดียวกัน ซึ่งจะเรียงแบบหนึ่งหน้าต่อหนึ่งหน้าก็ได้ เลยลองเล่นดู ใช้แพคเกจ fancyhdr ของ LaTeX มาช่วยกำหนดตำแหน่งเลขหน้า สุดท้ายได้ไฟล์สำหรับใส่เลขหน้าอัตโนมัติมา
\documentclass{article}
\usepackage[final]{pdfpages}
\usepackage[paper=a4paper,landscape,tmargin=2cm,bmargin=2.3cm,lmargin=2.5cm,rmargin=1.5cm]{geometry}
\usepackage{fancyhdr}
\setcounter{page}{..PAGE..}
\pagestyle{fancy}
\lhead{My Course}
\cfoot{}
\rfoot{{\LARGE\thepage}}
\renewcommand {\headrulewidth}{0pt}
\renewcommand {\footrulewidth}{0pt}
\begin{document}
\includepdfset{pages=-,pagecommand=\thispagestyle{fancy}}
\includepdf[fitpaper=true,scale=1]{..FILE..}
\end{document}
และเพื่อให้เกิดความสะดวกในการทำงาน ก็เลยไปเขียนสคริปต์มาอีกอันหนึ่ง ใช้ sed แก้ไข ..PAGE.. และ ..FILE.. ใน LaTeX ให้เป็นเลขหน้าเริ่มต้น และชื่อไฟล์ PDF ที่ต้องการ
#!/bin/sh
filename=$1
pagenumber=$2
newname=${1%.pdf}-p.tex
sed -e "s/\.\.FILE\.\./"$filename"/g" -e "s/\.\.PAGE\.\./"$pagenumber"/g" < page.tex > $newname
pdflatex $newname
pdflatex $newname
rm $newname
rm ${newname%tex}log
สุดท้ายจะได้โปรแกรมง่ายๆ สำหรับเติมเลขหน้าได้ตามต้องการ ส่วนที่ผมยังงงๆ อยู่ก็คือ ไม่เข้าใจว่าทำไมฟอนท์ใน LaTeX มันมีขนาดเล็กกว่าปกติ เลยต้องกำหนดให้ใช้ \LARGE สำหรับเลขหน้า คิดว่าอาจจะมีปัญหาอะไรบางอย่างเกี่ยวกับขนาดกระดาษ หรืออะไรซักอย่าง เลยแก้แบบง่ายๆ ไปก่อน ขี้เกียจไปค้นดูละเอียดๆ ส่วนคนอื่นถ้าจะเอาไปใช้ ก็สามารถปรับแต่งตำแหน่งๆ หรือระยะขอบกระดาษได้โดยแก้ที่ geometry ครับ
latex, linux
latex, pdf, pdflatex, pdfpages, sed
ผมมักจะมีปัญหากับการแบ็คอัพข้อมูลบ่อยๆ ถึงแม้ว่าจะมีอุปกรณ์ต่างๆ ที่ครบถ้วนอยู่แล้ว เนื่องจากเวลาเก็บไฟล์ไว้เยอะ ถ้าจะเก็บลงแผ่น CD หรือ DVD จะมีปัญหาที่จะต้องมานั่งจัดแบ่งไฟล์ออกเป็นแผ่นๆ บางไฟล์ก็ใหญ่เกินไปเขียนลงบนแผ่นเดียวกัน ก็จะต้องจำไฟล์นี้ไว้ก่อน แล้วไปหาไฟล์อื่นมาแทนถ้าจะทิ้งให้เหลือไว้อย่างนั้นก็รู้สึกว่าเปลือง ทำไปทำมาก็จะงงไปหมด เสียเวลาในการจัดการนานมาก จนกระทั่งขี้เกียจแบ็คอัพในที่สุด
วันนี้ลงค้นๆใน apt-get ของ Ubuntu ดู พบว่ามีคนทำเครื่องมือช่วยจัดการปัญหานี้ คือเป็นสคริปต์เล็กๆ ที่ชื่อว่า dirsplit ที่มาพร้อมกับแพคเกจ genisoimage โปรแกรมนี้ทำหน้าที่สร้างลิสต์ของไฟล์ เพื่อเขียนไดเรคทอรีใหญ่ๆ ลงแผ่น CD/DVD โดยโปรแกรมจะจัดไฟล์ให้เราตามขนาดไฟล์ เราสามารถกำหนดได้ว่าจะสร้าง catalog แต่ละแผ่นใหญ่แค่ไหน (default คือขนาด DVD) วิธีใช้ก็คือ
$ dirsplit -e2 --prefix mybackup ./mydir1 ./mydir2
ตัวเลือก -e2 ใช้กำหนดวิธีการคำนวณและรวมขนาดไฟล์ มีอยู่หลายวิธี ผมเห็นตัวอย่างใช้วิธีนี้ก็เลยใช้ตาม ส่วน –prefix ใช้กำหนดชื่อไฟล์ catalog ที่สร้างขึ้น อย่างกรณีนี้ ก็จะได้ mybackup1.list mybackup2.list … ไปเรื่อยๆ ตามไฟล์ที่เรามี
เมื่อสร้าง catalog เสร็จ ก็ต้องนำมาสร้าง ISO image ซึ่งจะเป็นการไปดึงไฟล์จริงมารวมไว้ วิธีใช้ของ dirsplit ก็มีวิธีสร้าง ISO มาให้ด้วย คือ
$ mkisofs -D -r --joliet-long -graft-points -path-list mybackup1.list -o mybackup1.iso
เพียงเท่านี้ก็จะได้ image สำหรับเขียนลงแผ่น ก็สามารถใช้โปรแกรมที่ชื่นชอบเขียนได้ ผมขี้เกียจใช้ GUI ก็ใช้โปรแกรม wodim โดยตรง
$ wodim -v dev=/dev/scd0 speed=8 mybackup1.iso
ก็จะได้แผ่นสำรองข้อมูล (ที่มีค่าหรือเปล่าก็ไม่รู้) ของเราไว้ได้ ข้อเสียของวิธีนี้ก็คือ ถ้าต้องการค้นหาไฟล์บางอย่างในภายหลังอาจจะยุ่งยากพอควร เพราะเราจะไม่รู้ว่าไฟล์นั้นเก็บไว้ที่ไหน ถ้าให้ดีก็เก็บไฟล์ catalog เอาไว้ด้วย จะได้ค้นหาได้เร็วขึ้น
linux
backup, cdrecord, dirsplit, unix, wodim
วันนี้ลองติดตั้ง Acrobat Reader บน Jaunty แล้วพลาดไปตอบว่า ให้เปิด acroread เป็น default application เวลาเปิดไฟล์ PDF แต่จริงๆ แล้ว โดยทั่วๆ ไปชอบใช้ evince มากกว่า ก็เลยต้องหาวิธีแก้ ซึ่งวิธีที่ง่ายที่สุดก็คือ reconfigure ตัวแพคเกจใหม่
$ sudo dpkg-reconfigure acroread
แต่ถ้าหากจะกำหนด default application เวลาเปิดไฟล์ประเภทต่างๆ จะทำได้โดยไปแก้ไขไฟล์ที่
~/.local/share/applications/mimeapps.list
หรือถ้าจะกำหนดให้กับผู้ใช้ทุกคนในเครื่อง ก็ให้ไปแก้ไขไฟล์
อ้างอิง: http://ubuntuforums.org/showthread.php?p=2161195
linux
gnome, linux, ubuntu
ขอพูดถึงคำสั่ง unix ต่ออีกอันหนึ่งละกัน เนื่องจากเมื่อวานพยายามเขียน script เพื่อสร้าง account แบบเยอะๆ โดยใช้ข้อมูลในไฟล์รายชื่อนักเรียน เพราะว่ามีนักเรียนอยู่ 120 กว่าคน ถ้าให้สร้างด้วยมืออาจจะหมดแรงก่อนได้ ปัญหาเกิดขึ้นตอนกำหนด password ที่แม้ว่าจะมีโปรแกรม pwgen สำหรับสร้าง password ให้โดยอัตโนมัติแล้วก็ตาม แต่โปรแกรม adduser ที่ใช้บน Ubuntu ไม่ยอมให้กำหนด password ไว้เป็น option จึงต้องหาวิธีอื่นๆ ซึ่งก็มีหลายวิธี เช่น เปลี่ยนไปใช้ useradd (ชื่อคล้ายกัน สับสนดีแท้) แทนเนื่องจากกำหนดรายละเอียดต่างๆ ได้เยอะ แต่ก็มีปัญหาที่จะต้องตามไปกำหนดเงื่อนไขต่างๆ ยุ่งยากพอสมควรในขณะที่ adduser มีอีกคนกำหนดค่าต่างๆ ไว้ให้แล้ว อีกวิธีหนึ่งก็จะต้องไปแก้ไฟล์ shadow เพื่อแก้ข้อมูลเอาเอง ซึ่งไม่อยากทำเท่าไหร่ กลัวผิดแล้วมีปัญหา
สุดท้ายมีคนแถวนี้แนะนำให้ใช้โปรแกรม expect ซึ่งสามารถจำลองการทำงานของโปรแกรมที่ต้องมีการตอบโต้กับผู้ใช้ ให้เราสามารถส่งค่าได้เหมือนกับสั่งงาน โดย expect นี้จะใช้ regular expression เพื่อเทียบข้อความที่โปรแกรมแสดงออกมา แล้วจึงสามารถใช้คำสั่ง send เพื่อส่งข้อความหรืออินพุตกลับไปได้ เช่น
#!/usr/bin/expect -f
spawn passwd [lindex $argv 0]
set password [lindex $argv 1]
expect "password:"
send "$password\r"
expect "password:"
send "$password\r"
expect eof
จากโปรแกรม คำสั่ง expect เป็นการกำหนดให้รอจนกระทั่งมีข้อความที่กำหนดแสดงขึ้นมา ส่วนคำสั่ง send ก็จะเป็นส่งข้อมูลซึ่งก็คือ password ของเราไปให้โปรแกรม ที่เรียกมาทำงานโดยใช้คำสั่ง spawn ทั้งหมดนี้ไม่ได้เขียนเองหรอก ดูจากที่อ้างอิงได้
อ้างอิง: http://floppsie.comp.glam.ac.uk/Glamorgan/gaius/scripting/5.html
linux, unix
scripting, unix
Recent Comments