Laters WordPress

Raw copypasted from my new blog.

After 2 years relationship with wordpress I’ve decided to move along. This time I kinda want a more simple and static blogging system. I’ve heard about Octopress and Jekyll since I started working with ruby a year ago and that time I had no idea how to use it. Now I quite understand how things work in this static-generated blogging much more, and I choose Octopress first.

Next up would be porting posts from the old blog. Oh yeah and this time I feel more comfortable to write things in English. Things changed, I’ve grown up, at least that’s what I think.

Like said, I would keep host this blog and all of its article for goods, might port some of the posts to a new blog as well. Allow me to enjoy this unboxing feelings :)

So, laters WordPress. We might meet again someday.

Making PHP-FPM Use A Unix Socket

ปกติ php-fpm จะทำงานบน 127.0.0.1:9000 ครับ เราสามารถให้มันไปใช้ Unix socket ได้ ต้องไปปรับที่ /etc/php5/fpm/pool.d/www.conf

sudo vim /etc/php5/fpm/pool.d/www.conf

# ; listen /var/run/php5-fpm.sock
# listen = /tmp/php5-fpm.sock

sudo service php5-fpm restart

ผมเจอว่าบางที /var/run/php5-fpm.sock มันใช้ไม่ได้ เลยไปใช้ที่ /tmp/php5-fpm.sock แทนครับ

แล้วก็ไปปรับ Config ของ Nginx ด้วย

sudo vim /etc/nginx/sites-available/default

# fastcgi_pass unix:/tmp/php5-fpm.sock;

sudo service nginx restart

Connect to remote MySQL on a VPS

ลอกมาจากโพสนี้ซะส่วนใหญ่นะครับ เรื่องมีอยู่ว่าผมต่อ MySQL บน VPS ไม่ได้ เจอ Error ประมาณนี้

$ mysql -h 192.168.1.8 -u root -p
Enter password:
ERROR 1130: Host '192.168.1.4' is not allowed to connect to this MySQL server

$ telnet 192.168.1.8 3306
host 192.168.1.4 is not allowed to connect to this mysql server

สิ่งที่ต้องทำ ก็ตามนี้เลยครับ

  1. นอกจากไปเปิดพอร์ต 3306 ที่ Firewall
  2. ปรับ Config ของ MySQL

    sudo vim /etc/mysql/my.cnf

    แล้วก็ไปคอมเม้น skip-networking ออก และแก้บรรทัด bind-address=YOUR-SERVER-IP ตามโพสนี้ครับ แล้วก็ Restart MySQL

    sudo service mysql restart
  3. แล้วก็ต้องไปปรับ Privileges ให้เราใช้ IP ของเครื่องเราต่อได้ด้วยครับ (ตามโพสนี้)

    $ mysql -u root -p Enter password:
    mysql> use mysql
    mysql> GRANT ALL ON *.* to root@'192.168.1.4' IDENTIFIED BY 'your-root-password';
    mysql> FLUSH PRIVILEGES;

    ใช้ @'%' ถ้าอยากให้ IP อะไรก็ได้ครับ

อีกอย่างคือลอง mysqladmin -u root -p variables แล้วดูว่าได้ค่า skip_networking เป็น ON หรือเปล่า (ตามโพสนี้) อาจจะต้องแก้ตรงนี้ด้วยครับ

Setting up Node.js on a VPS

เร็ว ๆ นี้เพิ่งลองหัดเซ็ตอัพ VPS ไว้ใช้เองครับ ตั้งใจจะเอาไว้โฮสทั้ง Rails, Node.js แล้วก็ PHP ด้วย แล้วก็ให้แอพนึงอยู่กับ Subdomain อันนึง ได้ @chakrit มาช่วยเซ็ต Node.js ให้ครับ :D

ก่อนอื่นก็ต้องมี NVM ก่อน ตามโพสนี้ใน SO

$ sudo apt-get install build-essential libssl-dev curl git-core
$ git clone git://github.com/creationix/nvm.git ~/.nvm
$ echo "~/.nvm/nvm.sh" >> .bashrc
$ bash

จากนั้นก็ไปสร้าง Config ของ upstart ใน /etc/init สมมติว่าชื่อว่า /etc/init/www-mediagrid.conf ครับ

#!upstart
description "node.js mediagrid"
author "phatograph"

# REF: http://clock.co.uk/tech-blogs/upstart-and-nodejs
start on filesystem and started networking
stop on shutdown
respawn

setuid phatograph
env NODE_ENV=production
chdir /home/phatograph/apps/nodejs/mediagrid

exec /home/phatograph/.nvm/v0.8.19/bin/node /home/phatograph/apps/nodejs/mediagrid/app.js >> /var/log/www-mediagrid.log 2>&1

เวลาจะเริ่มใช้งาน ก็

sudo start www-mediagrid

ทีนี้ก็เป็น Config ของ Nginx

upstream www-mediagrid.conf {
        server 0.0.0.0:3000;
}

server {
        listen 80;
        server_name twitmediagrid.phatograph.com;

        location / {
                proxy_pass http://www-mediagrid;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
        }
}

แล้วก็เหลือแค่สร้าง A Record ให้ชี้มาที่ IP ของ VPS เรา ก็จะใช้งานได้แล้วครับ

Active Record Associations

BAUG2QZCMAA5BCA.jpg-large

ช่วงนี้กำลังเห่อ 4S ที่เพิ่งซื้อมาใหม่ครับ ฮ่า ๆ พี่นอร์ทแนะนำให้ไปอ่านเพิ่มเติมเกี่ยวกับเรื่อง Active Record Associations ที่หน้า API ของมันเลย

Class Macro

คิดว่าจะสร้างไอ้ที่เหมือนกับ attr_accessor ของ Rails ขึ้นมา โดยใช้ Class Macro ได้ประมาณนี้ครับ

class A
  def self.define_something(symbol)
    define_method(symbol) do |*args|
      puts args
    end
  end

  define_something :a_method
end

A.new.a_method('test') # test

svnX + DiffMerge

พอดีอยากจะให้ svnX ใช้ DiffMerge แทนที่จะใช้ FileMerge ครับ

แต่จาก Ticket นี้ บอกว่า DiffMerge เวอร์ชั่นหลัง ๆ จะไม่ได้เอา diffmerge.sh ใส่ไว้ใน /usr/bin ของเราให้ ดังนั้นเราจึงต้องเอาไปใส่เองครับ โดยก๊อบมาจาก /Applications/DiffMerge.app/Contents/Resources/diffmerge.sh นั่นเอง

How to Slice Images into Tiles with jQuery and CSS3 Transitions

สงสัยมานานแล้วเหมือนกันว่า jQuery Image Gallery Plugin ที่มันซอยรูปเป็นรูปเล็ก ๆ มันทำยังไง ก็ไปเจอโพสนี้เข้า ก็เลยรู้ว่าไอเดียมันมาจากซอยเอา div หลาย ๆ อันไปแปะทับรูป แล้วให้รูปนั้นเป็น background-image ของ div นั่นเอง

ลองปรับจากของดั้งเดิมเค้านิดหน่อย มาได้ประมาณนี้ครับ

Easy Image Hover Effects

ช่วงนี้กลับมาสนใจเรื่อง Interactive Design มากขึ้นครับ ไม่รู้จะเริ่มยังไงเลยว่าจะกลับมาลองเล่น CSS3 ซะเลย แล้วก็มาเจอโพสนี้ เลยเอามาแปะไว้ตรงนี้ด้วยครับ

Disable unwanted Rails generators

เวลาเรา rails g อะไรต่าง ๆ ไฟล์จะออกมามากมาย บางอันเราอาจจะไม่อยากได้ เช่นพวก assets, test หรือ fixture เราสามารถทำให้มันไม่สร้างพวก test, fixture ได้จากการ rails new appname -T ได้ แต่ถ้าลืมทำตั้งแต่แรก ก็ต้องไปปรับใน application.rb แทนครับ

อันนี้ rails new appname ปกติ

require 'rails/all'

อันนี้ rails new appname -T

# Pick the frameworks you want:
require "active_record/railtie"
require "action_controller/railtie"
require "action_mailer/railtie"
require "active_resource/railtie"
require "sprockets/railtie"
# require "rails/test_unit/railtie"

แล้วก็ใน application.rb เช่นกัน แต่อยู่ใน Mixandmatch::Application เราสามารถเอาอย่างอื่นออกได้อีกครับ ส่วนที่คอมเมนท์ออกไว้นั้น (คิดว่า) เป็น generator ของ rspec ครับ

config.generators do |generate|
  generate.helper false
  generate.assets false
  # generate.test_framework :rspec
  # generate.view_specs false
  # generate.helper_specs false
  # generate.model_specs false
  # generate.controller_specs false
  # generate.request_specs false
  # generate.routing_specs false
end

โพสต้นแบบจาก ThoughtBot และออฟชั่นเต็ม ๆ หาได้จาก Configuring Generators ครับ