แก้ปัญหาข้อความเตือนเวลาเรียก php cli

หากเกิดข้อความเตือนเมื่อเรียกคำสั่ง php แบบ cli (Command line) เช่น

$ /usr/bin/php --help
PHP Warning:  PHP Startup: memcache: Unable to initialize module
 Module compiled with module API=20050922, debug=0, thread-safety=0
 PHP    compiled with module API=20060613, debug=0, thread-safety=0
 These options need to match
 in Unknown on line 0
...

สามารถแก้ปัญหาโดยการใช้ option -n  ซึ่งหมายถึง php จะไม่ไปอ่านค่าต่างๆ ในไฟล์ php.ini   ตัวอย่างการใช้งานเช่น

$ /usr/bin/php --help -n

Change your Network Card MAC Address on Ubuntu

เมื่อมีการเปลี่ยนเน็ตเวิร์คการ์ด แล้วไม่สามารถ start network service ได้จะต้องแก้ไขไฟล์ /etc/network/interfaces ด้วยคำสั่ง

# sudo vi /etc/network/interfaces

และให้เพิ่ม MAC address ของการ์ดเข้าไปดังตัวอย่างด้านล่างนี้

auto eth0
iface eth0 inet dhcp
       hwaddress ether 01:02:03:04:05:06

จากนั้นให้ restart network service

sudo /etc/init.d/networking restart

Google URL Shortener

Google เปิดให้บริการ URL Shortener ที่ http://goo.gl

เราสามารถสร้างลิ้งก์ได้ทันที่โดยพิมพ์ลิ้งก์ที่ต้องการย่อผ่านเว็บ  ถ้าหากใช้งาน Chrome อยู่แล้ว ก็สามารถติดตั้ง goo.gl URL Shortener ได้จาก http://goo.gl/41Jvi (ดู source ของ extension นี้ได้ที่นี่ http://goo.gl/4pkr3)

หากเราต้องการให้มีการเก็บประวัติลิ้งก์่ย่อไว้ด้วย  ก็สามารถได้โดยการล็อกอินโดยใช้ Gmail account โดยนอกจากประวัติลิ้งก็แล้ว เราสามารถดูสถิติการคลิกของลิ้งก์ย่อแต่ละอันได้ด้วย

นอกจากนี้หากใช้บริการ Google Apps อยู่แล้ว ก็สามารถสร้าง  URL Shortener ภายใต้ชื่อโดเมนของเราได้ด้วย  เช่น http://link.engr.tu.ac.th/history โดยสามารถติดตั้งได้จาก Google Apps Margetplace ที่ http://goo.gl/kEtso และสามารถดูข้อมูลเพิ่มเติมได้จาก http://goo.gl/jlDm5

[Varnish] วิธีบันทึก Client IP บนเครื่อง backend

เราสามารถทำการบันทึก Client IP ทีเครื่อง backend  แทนที่จะให้ปรากฎเป็น IP ของ varnish เช่น 127.0.0.1  สามารถทำได้โดยการ แก้ไขไฟล์ /etc/varnish/default.vcl

sub vcl_recv {
  # Add a unique header containing the client address
  remove req.http.X-Forwarded-For;
  set    req.http.X-Forwarded-For = client.ip;
  # [...]
}

และเพิ่มบรรทัดต่อไปนี้ในไฟล์ /etc/httpd/conf/httpd.conf

LogFormat "%{X-Forwarded-For}i %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" varnishcombined

และใน VirtualHost directive ให้ใช้ CustomLog ดังตัวอย่างต่อไปนี้

<VirtualHost *:80>
  ServerName www.example.com
  # [...]
  CustomLog /var/log/apache2/www.example.com/access.log varnishcombined
  # [...]
</VirtualHost>

ที่มา: http://varnish-cache.org/wiki/FAQ#HowcanIlogtheclientIPaddressonthebackend

แชร์ไดเรกทอรีระหว่าง Linux กับ Mac OS X

ผมติดตั้ง CentOS linux 5.5 ใน parallels virtual machine แล้วหาทางส่งไฟล์ระหว่างกัน วิธีการหนึ่งที่สามารถทำได้คือผ่าน samba ซึ่งมีขั้นตอนดังนี้ครับ

  1. ติดตั้ง samba ใน linux ด้วยคำสั่ง
    #yum install samba
  2. แก้ไขไฟล์ /etc/samba/smb.conf ให้มีเนื้อหาในส่วนของ [homes] เป็น
    [homes]
    comment = Home Directories
    browseable = yes
    writeable = yes
    read only = yes
  3. สั่งให้ samba ทำงานด้วยคำสั่ง
    #/etc/init.d/smb start
  4. กำหนด password ให้ user  โดย user นั้นจะต้องมีจริงในระบบ (local user)
    # smbpasswd -a username
  5. ที่เครื่อง mac เปิด Finder เลือก Go และ Connect to Server
  6. ป้อน smb://หมายเลข ip ของ linux เช่น
    smb://192.168.1.11

@font-face

@font-face ใน CSS3 จะช่วยให้เราสามารถนำฟ้อนต์ที่เราต้องการไปใช้ในเว็บได้ อย่างไรก็ตามปัจจุบันบราวเซอร์แต่ละชนิดก็รองรับชนิดของฟ้อนต์แตกต่างกัน เช่น IE ต้องการเฉพาะ .eot (Embedded OpenType)  ในขณะที่ Safari, Firefox, Chrome และ Opera รองรับทั้ง .ttf  (TrueType Font ) และ .otf  (OpenType PS) โดยสามารถดูตาราง Browser Supprot for @font-face ได้ที่นี่

อย่างไรก็ตามวันที่ 8 เม.ย. 53 ที่ผ่านมา Microsoft, Mozilla และ Opera ได้ยื่นข้อเสนอมาตรฐานรูปแบบฟ้อนต์ที่ใช้บนเว็บ WOFF (Web Open Font Format) กับ  W3C    ซึ่งคงต้องรออีกพักหนึ่งกว่าที่จะกลายมาเป็นมาตรฐานที่ใช้กันได้ทั่วไป   ดังนั้นในเวลานี้เราก็คงต้องใช้รูปแบบฟ้อนต์ที่บราวเซอร์ในปัจจุบันใช้งานได้ไปก่อน

รูปแบบของการเขียน @font-face มีดังนี้

@font-face {
   font-family: AnyFontName; /* required */
   src: source; /* required */
   font-weight: weight; /* optional */
   font-style: style; /* optional */
}

ตัวอย่างรูปแบบการกำหนด source ของ font

@font-face {
   font-family: AnyFontName;
   src: url('../fonts/fontname1.eot');
   src: local('fontname2'),
   url('../fonts/fontname3') format('opentype'),
   url('../fonts/fontname4') format('svg');
}

จากตัวอย่างข้างต้น  เราสามารถตั้งชื่อ  font-family ได้ตามต้องการ  ซึ่งจะมีการเรียกใช้ชื่อฟ้อนต์ที่ตั้งไว้ดังนี้

h3 {
   font-family: AnyFontName, arial, helvetica, sans-serif;
}

ข้อความที่อยู่ระหว่าง <h3> และ </h3> ก็จะถูกแสดงด้วยฟ้อนที่ชื่อ AnyFontName    แต่เนื่องจาก browser รองรับฟอนต์ได้ไม่เหมือนกัน โดยเฉพาะ IE จึงมีผู้ทำการทำสอบว่าจะเขียน @font-face ในรูปแบบใดจึงจะเหมาะสมที่สุด

Useful links:

http://snook.ca/archives/html_and_css/becoming-a-font-embedding-master
http://xmlgraphics.apache.org/batik/tools/font-converter.html
http://www.fontsquirrel.com/fontface/generator
http://code.google.com/p/ttf2eot/
http://webfonts.info/wiki/index.php?title=@font-face_browser_support

MySQL: ย้ายข้อมูลระหว่างฐานข้อมูล

วิธีการง่ายๆ ในการย้ายข้อมูลระหว่าง  database สามารถทำได้ดังนี้

  1. สร้างฐานข้อมูลใหม่ เช่น  new_database
  2. ใช้คำสั่ง mysqldump ดังนี้
    #mysqldump -uroot -p old_database | mysql -uroot -p -D new_database

สิ่งที่ควรทำหลังจาก upgrade MySQL server

หลังจากทำการ upgrade MySQL server ควรจะใช้คำสั่งต่อไปนี้
#mysql_upgrade -uroot -p
และ

#mysqlcheck -uadmin -p --auto-repair --check --optimize --all-databases

เพื่อตรวจสอบว่ามีปัญหาระหว่างการ upgrade หรือไม่ เนื่องจากผมเจอปัญหาที่ดูเหมือนว่าฐานข้อมูลหายไป เมื่อตรวจสอบแล้วก็พบว่าฐานข้อมูลยังอยู่ แต่ถูกเติมข้างหน้าด้วย #mysql50#

If you have databases or tables from a version of MySQL older than 5.1.6 that contain special characters and for which the underlying directory names or file names have not been updated to use the new encoding, the server displays their names with a prefix of #mysql50# in the output from INFORMATION_SCHEMA tables or SHOW statements.

ที่มา http://dev.mysql.com/doc/refman/5.1/en/identifier-mapping.html

วิธีการติดตั้ง MediaWiki หลายเว็บโดยใช้ source code ร่วมกัน

เราสามารถทำการติดตั้ง MediaWiki หลายเว็บ โดยการใช้ source code ร่วมกันได้   โดยสามารถทำได้หลายวิธีดูได้จาก http://www.mediawiki.org/wiki/Manual:Wiki_family

ผมได้ทำการติดตั้งในเซิร์ฟเวอร์ที่ใช้ Plesk control panel  โดยมีขั้นตอนดังนี้

สมมติว่าเราจะติดตั้ง http://www.domain.com/mywiki1  และ http://www.domain.com/mywiki2 โดยใช้ source code ของ MediaWiki จาก http://www.domain.com/wiki

  1. ทำการดาวน์โหลด source code และแตกไฟล์ลงในไดเรกทอรีหลัก  โดยตั้งชื่อไดเรกทอรีว่า wiki (http://www.domain.com/wiki)
  2. สร้าง database หลักใน MySQL ที่ mywiki1 และ mywiki2 จะมาใช้ร่วมกัน
  3. ใช้ browser เปิดเรียก wiki ที่เพิ่งติดตั้งลงไปในข้อ  1
  4. ทำการติดตั้ง MediaWiki ตามขึ้นตอนปกติ   โดยให้ใส่ข้อมูลที่ต้องการของ mywiki1  และใช้ database ที่สร้างในข้อ 3  โดยจะต้องใส่ Database table prefix ให้แตกต่างกัน เช่นตั้งเป็น mywiki1_
  5. หลังจากดำเนินการตามข้อ 4 เรียบร้อยแล้ว เราจะได้ไฟล์ LocalSettings.php ในไดเรกทอรี config   ให้ย้ายไฟล์นี้ออกมาที่ไดเรกทอรีหลักของ wiki  โดยเปลี่ยนชื่อเป็น LocalSettings_mywiki1.php
  6. แก้ไขไฟล์ LocalSettings_mywiki1.php โดยแก้ค่าของตัวแปร $wgScriptPath ให้เป็น path ของ mywiki1 (http://www.domain.com/mywiki1) เช่น  $wgScriptPath       = “/mywiki1”;
  7. ทำตามข้อ 3-5 อีกครั้ง  สำหรับ mywiki2   โดยใส่ Database table prefix เป็น mywiki2_   และย้ายไฟล์ LocalSettings.php ไปไว้ในไดเรกทอรีหลัก wiki ในชื่อ LocalSettings_mywiki2.php   และ $wgScriptPath       = “/mywiki2”
  8. สร้าง symbolic link สำหรับ mywiki1 และ mywiki2   ไปที่ ไดเรกทอรี wiki ด้วยคำสั่ง
    ln -s wiki mywiki1  และ ln -s wiki mywiki2
  9. เพิ่ม option FollowSymLinks สำหรับไดเรกทอรี httpdocs ในไฟล์ ~/conf/vhost.conf ของโดเมน domain.com เช่น
    <Directory /home/www/vhosts/domain.com/httpdocs>
    Options FollowSymLinks
    </Directory>
  10. สั่งให้ plesk reconfigure ข้อมูลจากไฟล์ vhost.conf  โดยใช้คำสั่ง
    #/usr/local/psa/admin/sbin/websrvmng –reconfigure-vhost –vhost-name=domain.com
  11. ทำการ restart Apache web server
    #service httpd restart
  12. สร้างไฟล์ LocalSettings.php โดยให้มีโปรแกรมดังนี้

 

$callingurl = strtolower($_SERVER['REQUEST_URI']); //get the calling url
if ( strpos( $callingurl, 'mywiki1', 0) ) {
   require_once( 'LocalSettings_mywiki1.php' );
}
else if ( strpos( $callingurl, 'mywiki2', 0) ) {
   require_once( 'LocalSettings_mywiki2.php' );
}
else {
   echo "This wiki (in ". $callingurl . ") is not available. Check configuration.";
   exit(0);
}

 
ทดลองเปิดเว็บ http://www.domain.com/mywiki1 และ  http://www.domain.com/mywiki2