Sunday, August 1, 2021

Install pip

sudo -H python -m ensurepip
sudo -H python3 -m ensurepip

Friday, August 11, 2017

PostgreSQL on Ubuntu

Installing PostgreSQL on Ubuntu
To install both client and server with the newest version of Postgresql (the newest one on Ubuntu's repository), we can do it by apt-get

apt-get install postgresql

Setting up PostgreSQL
Installing via apt-get, everything (all configurations) has been set up, and Ubuntu's user 'postgres' will be created. We can access the database as this postgres user. Some tutorial talks about initdb command to create database cluster (database location on file system) but I can't find this command. However, database cluster has been created already after the installation.
There is a database has been created after install, the name is postgres. We can access this database to give the password of our postgres user.

sudo -u postgres psql postgres
\password


Start using database
We can create database with createdb command.

sudo -u postgres createdb mydb

To access it, use psql command. psql -h localhost mydb postgres

References
https://help.ubuntu.com/community/PostgreSQL

Thursday, July 4, 2013

My vimrc and bash_profile files

Every time I cleanly install my mac, I always to forget backup vimrc and bash_profile (or bashrc for Linux) files, and need to think how they look like. To solve this problem, I'll note here.

vimrc
set nu
set ai
set ic
set ts=2
set et
syntax on


bash_profile
alias ll="ls -la"
alias la="ls -a"
export CLICOLOR=1


Although, I can remember every set command for vim, I can't remember how to make vim colorful (i.e. syntax on). Same as bash.

Tuesday, June 14, 2011

Fork bomb in 13 characters

วันก่อนเล่นเน็ตไปมาแล้วก็ไปเจอบทความในวิกิเกี่ยวกับเรื่อง fork bomb เข้า ผมก็เลยนั่งอ่านๆดูครับ ผมเชื่อว่าพวก geek หลายคนถึงจะไม่รู้จัก fork bomb มาก่อนแต่ถ้าได้เห็นชื่อก็น่าจะพอเดาได้ว่า fork bomb คืออะไร

fork bomb ก็เป็นการทำ denial-of-service แบบนึง ที่จะพยายาม fork process บนเครื่องออกมาให้มากๆ ในเวลาสั้นๆ ถึงแม้ว่า process เหล่านั้นจะไม่ได้ทำอะไรก็ตาม แต่สุดท้ายแล้วพอมี process โดน fork ออกมาเยอะๆ process table ของ OS ก็จะเต็ม ทำให้ไม่สามารถรันโปรแกรมใดๆได้อีก แนวคิดของ fork bomb ก็ประมาณเท่านี้ครับ ไม่มีอะไรมาก โจมตีด้วยจำนวนเข้าว่าเหมือน DOS ปกติ แต่สิ่งที่ทำให้ผมติดใจจนต้องมาเขียนเป็นบล็อกก็คือ โค้ดโปรแกรมที่ใช้เขียน fork bomb ครับ

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

:(){ :|:& };:

หลังจากการก็อปปี้โค้ดนี้ไปลองรันดูก็พบว่ามันเป็นโค้ดทำ fork bomb ด้วย shell script จริงๆครับ (แต่เครื่องผมลองไม่ตายนะ คาดว่าคงมีระบบป้องกันการทำ fork bomb อยู่) โชคดีครับที่ในวิกิมีเขียนอธิบายการทำงานของโค้ดนี้ไว้ด้วย ไม่งั้นให้ตายผมก็คงงงอยู่ว่ามันทำได้ไง

โค้ดนี้เขียนโดยรวบเอาโค้ดทั้งหมดที่ปกติเราจะเขียนด้วยหลายๆบรรทัดมาอยู่บรรทัดเดียวกันครับ ถ้าแยกบรรทัดกันก็จะเห็นเป็นแบบนี้

:()
{
: | : &
}
;
:

โดยที่ : ตัวแรกในโค้ดถูกใช้เป็นชื่อฟังก์ชันครับ (ความรู้ใหม่ : สามารถใช้เป็นชื่อฟังก์ชันได้ด้วยแฮะ) ถ้าจะให้อ่านง่ายขึ้นก็ลองเปลี่ยน : เป็นชื่อ fork_bomb ดูครับ

fork_bomb()
{
fork_bomb | fork_bomb &
}
;
fork_bomb

จะเห็นว่าโค้ดนี้เป็นการเขียนฟังก์ชัน recursive แล้วมีการเรียกใช้ฟังก์ชันที่บรรทัดสุดท้ายของโค้ด จะเห็นว่าส่วนหลักๆของโค้ดนี้ก็คือบรรทัด

fork_bomb | fork_bomb &

จะเห็นว่าเราเรียกฟังก์ชัน fork_bomb (ตัวที่อยู่ด้านหน้า) ให้ทำงานแล้ว pipe ผลลัพธ์ไปให้ fork_bomb ตัวที่อยู่ด้านหลังทำงานต่อ การเรียกฟังก์ชันหนึ่งครั้ง มันจะโหลดตัวเองขึ้นมาอีกสองครั้ง ทวีคูณอย่างนี้ไปเรื่อยๆ ส่วน & ที่อยู่ข้างหลังเพื่อทำให้ประโยคนี้ทำใน background ครับ และถ้า fork_bomb ตัวหน้าตาย fork_bomb ที่โดนเรียกตัวต่อๆมาก็จะไม่โดน auto-kill

หลังจากที่พยายามเสิร์ชภูมิหลังของโค้ดนี้ก็พบว่าโค้ดนี้ได้รับการยกย่องว่าเป็น "The most elegant example of fork bomb code" ถูกเขียนโดย Jaromil

หลังจากที่อ่านจบแล้วก็ได้แต่ทอดถอนใจ เฮ่อ อยากเขียนโค้ดเท่ๆแบบนี้ได้บ้างจัง

Friday, February 18, 2011

Problem in swap code

Our only one blog fan, m3rlinez, told me that the one line swap code that I wrote in the previos entry cannot use when two variables are the same allocation such as

a[i] ^= a[j] ^= a[i] ^= a[j]; // when i = j

Thanks him to pointed this issue.

Wednesday, February 16, 2011

double fork magic

เริ่มที่ zombie process

zombie process คืออะไร
zombie process คือ process ที่ทำงานจบแล้วแต่ตัวมันยังอยู่ใน process table ของ OS เพื่อรอให้ parent process มาอ่านค่า exit status ของมัน แต่ก็ไม่มาอ่านซักที

แล้วเมื่อไหร่ parent process จะมาอ่าน exit status
เป็นไปได้สองทาง
  1. ในโค้ดเรียก function wait ( pid_t wait(int *stat_loc) ) แล้วโปรแกรมจะหยุดรอจนกว่า process ลูกจะทำงานเสร็จ
  2. เขียน signal handling ให้จัดการ SIGCHLD (SIGCHLD เป็น signal ที่ส่งมาบอกว่า process ลูกทำงานเสร็จแล้ว ให้ parent process ไปจัดการต่อด้วย)

double fork คืออะไร
double fork เป็นรูปแบบการเขียนโค้ดแบบหนึ่งที่ไว้ป้องกันการเกิด zombie process การเขียนโค้ดแบบ double fork นี้ใช้ประโยชน์จากการที่เมื่อ parent process จบการทำงานในขณะที่ child process ยังทำงานไม่เสร็จ โดย child process นั้นจะกลายเป็น process ลูกของ init process แทน ซึ่งจะคอยกำจัด child process พวกนี้ภายหลัง (init process คืออะไรอะเหรอ โอ๊ย เรื่องมันยาว)

แล้วตกลงมันทำงานยังไงหละว้อย
ยกตัวอย่างเปรียบเทียบให้เห็นภาพเลยละกัน
  1. ตัวอย่างแรกของการเกิด zombie สมมติว่ามี process A fork ลูกออกมาเป็น process B และเมื่อ B ทำงานเสร็จ A ไม่มาจัดการ SIGCHLD ที่ส่งมาทำให้ B กลายเป็น zombie
  2. ตัวอย่างการทำ double fork แทนที่ process A จะ fork B ออกมาเลย เราเขียนโค้ดให้ A fork process X ออกมาก่อน โดยหน้าที่อย่างเดียวของ X คือ fork B เมื่อ fork B เสร็จก็ให้ X จบการทำงาน ซึ่งเมื่อมาถึงขั้นนี้ B จะกลายเป็น orphan process และจะกลายเป็น process ลูกของ init เมื่อ B ทำงานเสร็จ init ก็จะมาจัดการเคลียร์ B ออกจาก process table ให้
ทีนี้ก็จะไม่มี zombie process อีกต่อไป

Friday, February 11, 2011

Swap two variable values code in one line.

First code pattern that comes to my mind when I want to swap two variable value is

int c;
c = a;
a = b;
b = c;

I found this code in every novice programming book, also in my programming class.
But I've heard one challenging problem (for me as a novice) that try to swap without temporary variable (that is c, in my code.) The code uses knowledge technique from logic class.

a = a ^ b;
b = a ^ b;
a = a ^ b;

The caret symbol (^) represents bitwise xor.
Recently, I found the code that written it in one line for making it more cool and less understanding that is

a ^= b ^= a ^= b;

Impressed!

Friday, January 28, 2011

ประสบการณ์การ submit patch ครั้งแรก (แต่ไม่สำเร็จ)

ปีที่แล้วผมได้งานเขียนโปรแกรมชิ้นนึงครับ ตอนนั้นภาษาที่ผมใช้ก็เลือกใช้ python (เหตุผลไม่มีอะไรมาก แค่อยากลองศึกษาภาษานี้ดู) โปรแกรมที่เขียนจะมีฟังก์ชันการทำงานอยู่อันนึงครับ ที่มันจะเปิด https connection แล้ว get เนื้อหาเว็บมาดู

โปรแกรมที่เขียนนี้ก็ติดตั้งให้เครื่องลูกค้าไปหลายเครื่องทีเดียว และก็ดูเหมือนไม่มีปัญหาอะไร แต่ปรากฎว่าอาทิตย์ที่แล้ว พี่ที่ทำงานเค้าลอง monitor เครื่องลูกค้าดู ปรากฎว่ามันมี https connection เปิดค้างอยู่มากมายหลายสิบ เลยถามผมว่ามันถูกต้องรึปล่าว ผมเห็นแล้วก็ค่อนข้างอึ้งเล็กน้อย นี่ตรูนู้บขนาดลืมปิด connection เลยเหรอฟระ

แต่หลังจากอ่านโค้ดของตัวเองดู ผมก็เห็นว่าสั่งปิด connection แล้วนี่หน่า แล้วทำไมตรวจสอบ socket ดูถึงยังเห็นมันเปิดค้างอยู่ หลังจากพยายามแก้โค้ดอยู่ซักพักก็ไม่สำเร็จ เลยลองเช็ค bug tracker ของ python ดู ปรากฎว่ามีคนเคยเปิด issue นี้แล้วครับ ตั้งกะ python 2.3 แล้วก็ปิดเป็น won't fix ไปแล้วด้วย (ผมใช้ python 2.6 อยู่ครับ)

อ่านจบตอนนั้นคิดไงไม่รู้อยากลองไล่บั๊กดู (library ของ python มันมีเป็นโค้ดติดตั้งอยู่ในเครื่องอยู่แล้วครับ ไม่ต้องโหลดมาเพิ่ม) ไล่ไปไล่มาก็เจอส่วนที่คิดว่าน่าจะเป็นปัญหา เหมือนว่าจะเช็ค condition ผิด ไปตอนสั่งปิด SSL socket ลองแก้โค้ดดูก็ปรากฎว่าทำงานได้ถูกต้อง (มั้งนะ ฮ่าๆๆ)

พี่ที่ทำงานก็ยุให้ลอง submit patch ไปดู ผมก็เลยลองโหลด python 2.7 มา หลังจากเช็คดูก็เห็นว่าตรงโค้ดส่วนนั้นยังเป็นเหมือนเดิม ผมก็เลยเปิด issue แล้วก็ submit patch ของผมไป แต่หลังจากคุยตอบโต้ไปมาก็มีคนมาบอกว่าให้ผมลอง python 2.7 ดู บั๊กนี้น่าจะโดนแก้ไปแล้ว ซึ่งปรากฎว่ามันก็โดนแก้ไปแล้วจริงๆด้วย ฮ่าๆๆ แต่ก็ไม่รู้ว่าไปแก้อีท่าไหนเหมือนกัน ทำไมโค้ดตรงส่วนที่ผมคิดว่ามันเป็นปัญหาถึงยังเหมือนเดิม เหอๆ

ก็ปรากฎว่า patch ที่ส่งไปก็ปล่าวประโยชน์ T_T

สำหรับ issue ที่ผมเปิดอยากเข้าไปดูก็ไปดูได้ตามลิงค์นี้นะครับ http://bugs.python.org/issue10993

Saturday, June 26, 2010

ภาษาโปรแกรมที่อยากเขียนเป็น

อยากเขียนเป็นและเก่งๆด้วย
  1. C
  2. C++
  3. Java
  4. perl
อยากเขียนเป็นเฉยๆ
  1. Python
  2. OCaml
  3. PHP
  4. javascript

Wednesday, June 23, 2010

How to change resolver configuration file?

Q: How to change resolver configuration file?
A: I don't know.

ตรงนี้ขอเกริ่นนำกับบ่นๆๆๆๆ ก่อนนะครับ
อยากรู้วิธีแก้ path ของไฟล์คอนฟิก ข้ามไปอ่านข้างล่างได้เลยครับ
เมื่อประมาณต้นปีผมต้องเขียนโปรแกรมนึงให้มันไปเปลี่ยน dns server ของระบบ (FreeBSD) ที่โดนตั้งไว้ ปัญหาคือตอนที่ FreeBSD จะทำการ nslookup ไปที่ dns server มันจะอ่านไฟล์คอนฟิกนึงว่า dns server ของเราคือเครื่องไหน ไฟล์นั้นก็คือ /etc/resolv.conf ซึ่งมันจะอ่านทุกครั้งที่เราจะ nslookup!!! (ใส่เครื่องหมายตกใจทำไม อ้าว ไม่ตกใจเหรอครับ เพราะผมไม่รู้มาก่อน นึกว่ามันจะทำการโหลดค่ามาเก็บไว้ตอนบู๊ทเครื่องทีเดียว ไม่คิดว่ามันจะอ่านไฟล์ใหม่ทุกครั้ง)

เนื่องจากว่านโยบายในการเขียนโปรแกรมครั้งนั้นมีอยู่ว่า โปรแกรมของผมจะไม่แตะต้องไฟล์ใน /etc เพราะมันเป็นไฟล์ของระบบ ถ้าเกิดทำอะไรเสียหายไปเดี๋ยวจะเดือดร้อน (/etc ของ appliance ในความคิดผมควรจะเป็น read-only) ซึ่งจากประสบการณ์ที่ได้แตะเซอร์วิสของ FreeBSD มาบ้าง เซอร์วิสส่วนใหญ่เราสามารถระบุได้ว่าจะให้มันไปอ่านไฟล์คอนฟิกที่ไหน (ระบุได้จากหลายๆทาง เช่น environment variable ฯลฯ) หรือไม่ก็สามารถคอนฟิกในไฟล์คอนฟิกให้มัน include ไฟล์คอนฟิกอื่นเพิ่มเข้าไปได้ เราก็จะได้เขียนไฟล์คอนฟิกนั้นแค่ทีเดียวแล้วไปแก้ไฟล์คอนฟิกอื่นๆที่ include เข้าไปแทน

หลังจากการค้นหาอยู่นานผมก็ค้นพบวิธีการที่ทำให้มันไม่ต้องยุ่งกับ /etc/resolv.conf ได้ด้วยการ
...
...
เลิกเขียนโปรแกรมซะ

โว้ย ทำไมมันไม่มีวิธีวะ หาแทบพลิกแผ่นดินแล้ว สุดท้ายโปรแกรมของผมก็จำต้องไปแก้ไขไฟล์ /etc/resolv.conf ไปก่อนเพราะงานมันเร่งต้องส่งลูกค้าแล้ว

แล้วช่วงนี้ต้องกลับมาแก้ไขโครงสร้างของระบบใหม่ คราวนี้ได้รับคำสั่งมาว่า /etc ต้องโดน mount เป็น read-only ก็เลยต้องกลับมาค้นดูอีกทีว่าจะทำไงดี หลังจากถามพี่ที่บริษัทก็พบว่าตัว resolver ของ FreeBSD นั้นมันใส่ชื่อไฟล์ลงไปในโค้ดเลย โอ้ว แม่เจ้า ทำงี้ได้ไงฟระ

วิธีแก้
หลังจากที่ไล่โค้ดดู (อยู่ใน /usr/include/resolv.h) ก็เห็นส่วนที่ไว้ระบุไฟล์คอนฟิก มันระบุโดยการใช้ define เอาครับ ดังนั้นเราสามารถ define ค่าของตัวแปรใหม่ได้ตอนสั่งคอมไพล์ ค่อยยังชั่วหน่อย ไม่ต้องแก้โค้ด แต่ว่าเราก็ไม่สามารถเปลี่ยน path ของไฟล์คอนฟิกแบบ dynamic ได้อยู่ดี (โลกนี้มันช่างโหดร้ายจริงๆ)

ตัวแปรที่ไว้กำหนด path ของไฟล์คอนฟิกของ resolver นั้นชื่อว่า

_PATH_RESCONF

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

Tuesday, June 22, 2010

ขำ ^ 2

joke[0]

Several scientists were all posed the following question: "What is 2 * 2 ?"

The engineer whips out his slide rule (so it's old) and shuffles it back and forth, and finally announces "3.99".

The physicist consults his technical references, sets up the problem on his computer, and announces "it lies between 3.98 and 4.02".

The mathematician cogitates for a while, then announces: "I don't know what the answer is, but I can tell you, an answer exists!".

Philosopher smiles: "But what do you mean by 2 * 2 ?"

Logician replies: "Please define 2 * 2 more precisely."

The sociologist: "I don't know, but is was nice talking about it".

Behavioral Ecologist: "A polygamous mating system".

Medical Student : "4"

All others looking astonished : "How did you know ??"

Medical Student : :I memorized it."



joke[1]

Biologists think they are biochemists,

Biochemists think they are Physical Chemists,

Physical Chemists think they are Physicists,

Physicists think they are Gods,

And God thinks he is a Mathematician...

Wednesday, April 14, 2010

GNOME บน FreeBSD 8.0

อีกหนึ่งโปรเจกต์ FreeBSD ของผมคือการเอา FreeBSD มาใช้เป็นเดสก์ท็อปครับ (ฮ่าๆๆๆ เท่มั้ยหละ) แน่นอนว่าจะเอามาใช้เป็นเดสก์ท็อปก็ต้องมีการติดตั้ง Desktop Environment ไม่งั้นจะใช้ไงหละ

DE ที่ผมเลือกแบบไม่ต้องคิดเลยก็คือ GNOME ครับ (เห็นบางคนอ่านมันว่า "กะโนม" (คล้ายๆแบบกะนู) แต่ผมอ่านมันว่าจีโนม) ขี้เกียจหาอันใหม่ เอาอันนี้แหละ คุ้นเคยกันดีเพราะผมเคยลองใช้บน FreeBSD 7.x มาก่อนแล้วรอบนึงครับ ก็เลยคิดว่าบน 8.0 ก็คงเหมือนๆเดิม ก็ลงตามเสต็ปเดิม ปรากฏว่าตอนสั่ง GNOME ทำงานมันดันฟ้องว่าไม่มีไฟล์ /var/run/dbus.pid

หลังจากโง่อยู่นานก็พบว่า GNOME บน 8.0 มันต้องการเซอวิส dbus ด้วย (ไอ้ error ที่มันฟ้องแปลว่ามันหาไฟล์ process id dbus ไม่เจอ นั่นเป็นเพราะว่า dbus มันไม่ได้รันอยู่) เพราะงั้นเราต้องสตาร์ทมันก่อนสตาร์ท GNOME

หลังจากที่รัน GNOME ขึ้นมาได้ก็พบปัญหาอีกอย่างนึงคือ touchpad มันไม่ทำงานครับ ผมไม่สามารถควบคุมเคอเซอร์ได้ ตอนแรกก็นึกว่าเป็นปัญหาที่ FreeBSD กับ touchpad ของผม แต่บน X ธรรมดามันดันทำงานได้แฮะ อืม แล้วเป็นเพราะอะไรหละเนี่ย

พอค้นไปค้นมาก็เจอว่า GNOME เนี่ยมันต้องการเซอวิส hald รันด้วย ดังนั้นเราก็ต้องไปสตาร์ทมันก่อนอีกเหมือนกัน
หลังจากที่สตาร์ทเซอวิส 2 ตัวนี้แล้ว GNOME ก็จะใช้งานได้ตามปกติ

ปล[0] การสตาร์ท dbus กับ hald สามารถสตาร์ทได้ด้วย rc script ใน /usr/local/etc/rc.d ชื่อสคิปท์คือ dbus และ hald (ถ้าตอนลงไม่ได้คอนฟิกอะไรเป็นพิเศษมันจะอยู่ที่พาธนี้แหละ)
ปล[1] ปกติผมสั่ง `gdm` จากคอมมานด์ไลน์เลย แต่วันนี้พึ่งนึกได้ มันต้องมี rc script สิ พอลองค้นดูก็เห็นอยู่ที่ /usr/local/etc/rc.d/gdm

Monday, April 12, 2010

[C code] string copy ใน C

ความสุขอย่างนึงในการเขียนโปรแกรมของผมคือการแก้โค้ดที่ทำงานได้ให้มันสั้นลงครับ (แล้วโค้ดที่ทำงานได้มันจะบั๊กก็ตอนแก้ให้สั้นเนี่ยแหละ ฮ่าๆๆ) ไม่รู้สิ รู้สึกว่่ามันเจ๋งดีนะเวลาได้เขียนโค้ด while หรือ for ปล่าวๆแบบให้การทำงานอยู่ในเงื่อนไขของลูปไปเลย เหอๆ
เมื่อวานผมก็อ่านโค้ด string copy ในหนังสือภาษาซีเล่มนึง โค้ดนี้เขียนโดยใช้ใช้พอยท์เตอร์ (เพราะมันอยู่ในบทเรื่องพอยท์เตอร์) โค้ดในหนังสือตอนแรกออกมาเป็นแบบนี้ครับ

void strcpy(char *s, char *t) {
while((*s = *t) != '\0') {
s++;
t++;
}
}

ไอ้คนอย่างผมก็เลยนั่งเขียนให้มันเหลือแค่บรรทัดเดียวไอ้ตรงวน while โค้ดผมได้ออกมาแบบนี้ครับ

void strcpy(char *s, char *t) {
while((*s++ = *t++) != '\0');
}

แฮ่ ในที่สุดมันก็เหลือบรรทัดเดียว ซึ่งพอผมอ่านหนังสือต่อไปมันก็ลดรูปมาเหลือเท่าที่ผมเขียนครับ
แต่ยังไม่หมด ตัวอย่างต่อมามันดันเขียนลูปได้สั้นกว่านี้อีก!!!

void strcpy(char *s, char *t) {
while(*s++ = *t++);
}

โห มันใช้ความบังเอิญที่ว่า character constant '\0' ดันมีค่าเป็น 0 พอดีมาเป็นเงื่อนไขในการเช็ค
สุดยอดไปเลยหวะ ชอบๆ

ก็เลยต้องมาเขียนบล็อกเก็บไว้หน่อย :)

Friday, April 9, 2010

[C code] if in C

ไปอ่านเจอมาจาก stackoverflow (แต่จำกระทู้ไม่ได้เลยไม่ได้ทำลิงค์ไป) เห็นมีคนมาถามว่าเวลาเขียน if เปรียบเทียบตัวแปรกับตัวเลข เขียนแบบนี้มันดีกว่ายังไง

if(4 == i)

งงดิครับ ตั้งแต่เกิดมาไม่เคยเห็นครูบาอาจารย์ที่ไหนบอกว่าเขียนแบบนี้มันดีกว่า ไอ้คนตั้งกระทู้มันก็ไม่รู้ไปได้ยินมาจากไหน แต่ก็มีคนเข้ามาตอบให้ได้ว่าดีกว่ายังไง
โค้ดแบบนี้จะดีกว่าเฉพาะในภาษาซีเท่านั้นครับ เพราะว่าเป็นการลดบั๊กจากการพิมพ์ผิด เพราะว่าในภาษาซีถ้าเราตั้งใจจะเปรียบเทียบค่าโดยพิมพ์แบบนี้

if(i == 4)

เป็น

if(i = 4)

จะได้ว่า if นี้เป็นจริงเสมอ (ส่วนจาวาจะคอมไพล์ไม่ผ่าน) ดังนั้นพอเขียนกลับกัน ถึงเขียนผิดเป็น

if(4 = i)

คอมไพเลอร์ก็จะฟ้องขึ้นมา
แหม่ ไอ้คนคิดวิธีเขียนโค้ดแบบนี้มันสุดยอดจริงๆ

Tuesday, March 17, 2009

Script ที่ไว้แก้หน้าเว็บเพจ

javascript:document.body.contentEditable='true'; document.designMode='on'; void 0

เจอมาจากซักที่ครับ เลยบล็อกเก็บไว้ซะหน่อย

วิธีใช้ก็กรอกโค้ดนี้ลงไปในช่อง URL จากนั้นก็ Enter แล้วหน้าเว็บนั้นก็จะแก้ไขได้เลยครับ (ถ้านึกไม่ออกลองทำตามดู)

จากนั้นก็ปรินท์สกรีนเก็บไว้ส่งรูปไปให้เพื่อนดูได้ตามอัธยาศัย

Sunday, March 1, 2009

Gmail อัพโหลดไฟล์ มีการบอกเปอร์เซนต์แล้ว!!!

วันนี้ส่งเมล์เข้าหาตัวเองครับ ส่งเพื่อเก็บไฟล์ตัวเองไว้บนจีเมล พอเลือกไฟล์เสร็จก็เจอเหตุการณ์ดังรูปขึ้นครับ


เจ๋งมากมาย

Saturday, February 28, 2009

FreeBSD เมื่อ loader.conf มีปัญหา

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

อาการ
ตอนที่ FreeBSD กำลังแสดงข้อความต่าง ๆ ของระบบอยู่ดีมันก็มาหยุดที่ ndis0 (เป็นโมดูลที่เกี่ยวกับเน็ตเวิร์กของ ndis ครับ) ผมสั่งให้มันโหลดขึ้นมาตอนบู๊ท มันก็แจ้งว่า failed แล้วก็ค้างอยู่ตรงนี้

สาเหตุ
เนื่องจากว่าผมไปแก้ไฟล์ loader.conf (/boot/loader.conf) ให้มันโหลดโมดูลไดรเวอร์ของการ์ดแลนผมขึ้นมา แต่ไม่รู้ว่ามันเกิดปัญหาอะไร มันถึงโหลดไม่สำเร็จ ก็เลยเป็นสาเหตุให้ค้างตอนบู๊ทครับ

วิธีแก้
ตอนบู๊ท FreeBSD ขึ้นมาแล้วมีออปชั่นให้เลือก ให้เลือกออปชั่นหมายเลข 6 ครับ (จำไม่ได้ว่ามันเขียนว่าอะไร) แล้วมันก็จะมี prompt ขึ้นมาว่า OK ให้เราป้อนค่าตามนี้ครับ (OK นั่นเป็น prompt นะครับ ไม่ต้องกรอกตาม)

OK unload
OK load kernel
OK snd_hda
OK boot

แล้วเราก็จะบู๊ทได้ โดยไม่อ่าน loader.conf ครับ

แต่เดี๋ยวก่อนครับ ผมยังเจออีกปัญหา ตอนบู๊ทขึ้นมาด้วยวิธีนี้ ปรากฏว่าผมไปแก้ไฟล์ /etc/rc.conf ด้วย และแก้ผิดไปครับ (มีเครื่องหมายคำพูดเกินมาตัว) ทำให้มันแจ้งเตือนว่าไฟล์ /etc/rc.conf ผิด จากนั้นมันให้กรอก path ของ shell ที่จะใช้งานครับหลังจากกรอกเสร็จมันก็เข้าสู่ระบบให้โดยอัตโนมัติ

แต่ผมพบว่ามันไม่ได้ mount file system ให้ซักตัวเลยครับ ผมต้องมา mount เอง ทั้ง /usr /var /tmp เพราะเนื่องจากว่ามันไม่ได้ mount /usr ให้ดังนั้นเราจะไม่เห็นคำสั่งหลาย ๆ คำสั่งครับ รวมถึง vi ด้วย ผมเลยต้อง mount /usr แต่ว่าการใช้ vi นั้นมันจะไปสร้างไฟล์ใน /tmp เลยจำเป็นต้อง mount /tmp ด้วย ส่วน /var นั่นก็ mount เผื่อ ๆ ไปครับ (ตอน mount ก็เรียกดูจากไฟล์ /etc/fstab)

หลังจากนั้นผมก็พยายามแก้ไฟล์ทั้งสองแต่ปรากฏว่าผมไม่สามารถบันทึกได้ครับ มันแจ้งเตือนว่า "Read-Only file system" หลังจากค้นดูก็พบวิธีแก้โดยใช้คำสั่ง

mount -u /

มันจะไปเปลี่ยนจาก Read-Only เป็น Read/Write ครับ ทีนี้เราก็จะสามารถแก้ไขไฟล์ที่เสียได้ตามที่ต้องการ

----

แถม
เนื่องจากตอนที่มันไม่ mount อะไรให้ซักอย่างผมเลยต้องมา mount เอง แต่ตอนค้นเรื่อง Read-Only ผมก็เจอคำสั่ง mount ทั้งหมดให้อัตโนมัติครับ

mount -a

มันจะ mount ตามไฟล์ /etc/fstab ให้อัตโนมัติครับ

Tuesday, February 24, 2009

โค้ดที่ทำให้ IE พัง

เมื่อวานไปค้นไฟล์ที่เก็บไว้ในคอมที่มหาลัยเจอโค้ด HTML ไฟล์นึงครับ จำได้ว่าเซฟมาจาก blognone เป็นโค้ดที่รันแล้วจะทำให้ Internet Explorer 6 พังครับ แบบว่าดับไปซะดื้อ ๆ เลย ก็เลยมาบล็อกเก็บไว้หน่อย โค้ดนั้นเป็นแบบนี้ครับ

<style>*{position:relative}<table><input></table>

สั้น ๆ แค่นี้แหละครับ

ลองกับไฟร์ฟอกซ์ได้ก็ไม่มีปัญหาครับ แล้วพอลองกับ IE 7 ก็ไม่ดับครับ แต่อาการแปลก ๆ (เหมือนมันค้าง ๆ ไงไม่รู้)

แปลกดี

Monday, February 23, 2009

เปลี่ยนภาษา

ช่วงนี้ขอเปลี่ยนภาษาหน่อยครับ ไม่งั้นเกรงว่าคงไม่ได้เขียนบล็อกนี้ไปอีกนานเลย
จะพยายามเขียนภาษาอังกฤษนะครับ ถ้ามีอารมณ์ ถ้าไม่มีอารมณ์ก็จะเขียนเป็นภาษาไทยนี่แหละ

Monday, January 5, 2009

Not roses. Not violets.

Exceptions are red.
Keywords are blue.
It compiles.
Because of you.