.ssh/config: สร้าง shortcut สำหรับ ssh ที่ใช้บ่อยๆ กันเถอะ

เวลาจะ SSH แล้วต้องมานั่งนึกมั้ยครับว่า server นี้ใช้ user/port อะไร, domain บางทีก็ยาวจนขี้เกียจพิมพ์ คำสั่ง ssh ใช้ option -p ระบุ port ส่วน scp ต้องใช้ -P (พีใหญ่) พิมพ์ผิดพิมพ์ถูกหลายครั้งกว่าจะส่งไฟล์ได้

ssh -p 2345 satoshi@gym1.pewter.com
scp -P 2345 satoshi@gym1.pewter.com:~/pikachu.txt .

ไฟล์ ~/.ssh/config

ไฟล์ ~/.ssh/config ช่วยให้เราตั้งค่า username, port, domain สำหรับ host ที่เราใช้บ่อยๆ เก็บไว้ได้

Host gym1                   # ตั้งชื่อเล่น
        HostName gym1.pewter.com    # หรือใช้ IP ก็ได้
        User satoshi
        Port 2345
Host red                    # มีได้หลายๆ host เลย
        HostName team-rocket.com
        User nyarth
        Port 4529

เวลาจะใช้ ssh ก็พิมพ์เพียงแค่ชื่อ Host สั้นๆ ก็พอ

ssh gym1
scp gym1:~/pikachu.txt .

ปล. ลอง man ssh_config ดูได้นะครับว่ามี options อะไรให้ใช้อีกบ้าง

Tetraodontidae – Pufferfish vs Porcupinefish

Originally posted on Divers Who Want To Learn More:

Fact: Sometimes porcupinefish and pufferfish are collectively known as pufferfish (this is where confusion often sets in)

The Tetradontiformes are represented by 10 families with about 360 different species overall; most are marine and they are most diverse in the tropics with very few species in temperate waters, they are completely absent from cold waters. A few species are found in freshwater streams and estuaries.

This post is mostly focused on the difference between porcupinefish and pufferfish because during a conversation with a friend today we were unsure whether the fish we were discussing were called porcupinefish, balloonfish or pufferfish. So this post is for my dear friend and big brother Kana :D

Common name Porcupinefish / Balloonfish  Pufferfish
Family Diodontidae Tetraodontidae
Defence mechanisms Puff up body by drawing in water or air through the mouth into a small chamber near the stomach.

Their body is covered with sharp spines which…

View original 445 more words

“วิถีแบบไทยๆ” กับคำตอบว่าทำไมความคิดใหม่ๆ ถึงเกิดขึ้นได้ยากบนแผ่นดินนี้

Originally posted on Geekjuggler's Think Tank:

ข้อความข้างต้นฟังดูแล้วอาจแทงใจดำ แต่นี่คือความจริงที่คนไทยกำลังเผชิญหน้าอยู่ (และไม่มีใครกล้าที่จะออกมาบอก)

หัวข้อนี้ผมได้มาจากการไปฟังเสวนา “Very Thai: Cultural Filter” โดย Philip Cornwel-Smith ผู้เขียน “Very Thai” หนังสือที่ว่าด้วยวัฒนธรรม “แบบไทยๆ” ที่เราเองก็ไม่เคยสงสัย หาความหมาย หรือ ตั้งคำถามกับพวกมันมาก่อน เช่น การเอาทิชชู่สีชมพูมาห่อช้อนส้อม หรือ ทำไมไฮโซต้องตีกระบัง

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

Foreign Designers of ‘Thai Style’ were more Freedom
นักออกแบบชาวต่างชาติมีอิสระมากกว่า (คนไทย) ในการเล่นกับ ‘ความเป็นไทย’ 

View original 203 more words

เลิก host blog เองละครับ

ก่อนหน้านี้เคย

  1. เขียน web blog เอง -> บั๊กๆ บึ้มๆ ขี้เกียจ maintain (ฝากไว้โฮสต์ฟรี แล้วไม่ได้ดูแล ข้อมูลหายหมดเลย T_T)
  2. เขียนกะ blogspot ซักพัก
  3. self-hosted wordpress บน shared web hosting ทั่วไป
  4. ย้ายมาใช้ wordpress.com ครับ มีข้อจำกัดเรื่องการ customize หน้าตา + การใช้ html tag ตามนี้ครับ

อัพโหลดไฟล์บางนามสกุลไม่ได้ ตัวอย่างโค้ดเลยไปฝากไว้กับ github page แทน

แต่ไม่ต้อง maintain เอง เย้!

ส่ง patch ไปโปรเจค open source

เคยใช้ SMACK library ในการทำงานครับ ต้องเขียนโปรแกรมคุยผ่านโปรโตคอล XMPP (ที่ใช้ใน GTalk)

ระหว่างหัดเขียนอย่างงงๆ ก็ใช้ feature IBB (In-Band Bytestream) เพื่อส่งไฟล์ครับ

ปรากฏว่าเจอปัญหาแปลกๆ เหมือน SMACK มันคุยกับ server คนอื่นไม่รู้เรื่อง เลยไปไล่ๆ อ่าน XEP (XMPP Extension Protocol) ปรากฏว่า น่าจะมีสักคนที่ implement ไม่ตรงตาม protocol

ก็ส่ง patch เข้าไป เขาก็รับครับ… ดีใจ :)
http://community.igniterealtime.org/message/234808

ผ่านไป 3 ปี, protocol มีการปรับปรุงแก้ไขนิยามที่คลุมเคลือ จาก

The base64-encoded data to be sent, prior to any wrapping in the element and IQ or message stanza, MUST NOT be larger than the ‘block-size’ determined in the bytestream negotiation.

XEP-0047 (version 1.3)

เป็น

The data to be sent, prior to base64-encoding and prior to any wrapping in XML, MUST NOT be larger than the ‘block-size’ determined in the bytestream negotiation.

XEP-0047 (version 2.0)

กลายเป็นว่า protocol โดนปรับให้ตรงกับ implementation ที่มีแพร่หลายครับ และ patch ก็โดน reverse แล้วครับ

เล่น OX กัน

minimax

เผอิญค้นไปเจอรูปนี้ในเครื่อง :) หยิมมาแปะไว้บนบล็อกกันหาย

เคยมั้ยครับ? เล่นเกมแล้วสงสัยว่า คอมมันคิดยังไงนะ… ผมเคยเล่นเกมต่อจุดแล้วแพ้มันตลอดเลย (เกมที่ใครต่อจุด 5 จุดเป็นเส้นตรงได้ก่อนชนะ)

พอไปเข้าค่าย อาจารย์ก็ให้ลองเขียนเกม OX ขึ้นมา ให้คอมคิดเองได้บนตาราง 3×3 แล้วเราก็ WOW!!

ผมได้รู้จักกับ Minimax ครั้งแรกก็ตอนเขียนโปรแกรมในค่ายหละครับ พอดีมีน้องๆ ที่โรงเรียนอยากทำ project เกมหมากรุก… ให้คอมเล่นสู้กับคนได้ เลยลองวาดๆ รูปข้างบน อธิบายให้น้องฟัง

ไม่แน่ใจว่าน้องฟังเข้าใจรึเปล่า แต่ก็เห็นเขียนออกมาได้แฮะ :D

เกม OX: ใครเรียง O หรือ X ได้ครบ 3 ในแนวตั้ง แนวนอน หรือทแยงมุมได้ก่อนเป็นผู้ชนะ

ภาพข้างบนอธิบายวิธีคิดของ คอม กับ คน(จำลอง) ในแต่ละตาครับ

คอม จะลองลงในช่องว่างที่เหลือ แต่ละช่อง และตัดสินใจเลือกว่า ลงช่องไหนแล้วทำให้ตัวเองชนะได้
คน จะลองลงในช่องว่างที่เหลือ แต่ละช่อง และพยายามเลือกว่า ลงช่องไหนแล้วทำให้ตัวเองชนะได้

ถ้าการลงครั้งนั้น ยังไม่รู้ว่าผลจะออกมาเป็นยังไง ก็คิดต่อไปจนกว่าจะจบเกมส์… คิดลึกลงไปเรื่อยๆ ตาม Pseudocode นี้

เกม OX ที่มีตารางขนาด 3×3 เราสามารถคิดรูปแบบที่เป็นไปได้จนจบเกมส์ได้…

แต่เกมส์ที่ซับซ้อนขึ้นเช่น OX ขนาด 4×4 (คอมคิดนานหน่อย) หรือหมากรุกไทย หมากรุกฝรั่ง

โปรแกรมอาจไม่สามารถคิดล่วงหน้าไปจนจบได้… เพราะรูปแบบที่เป็นไปได้เยอะมากกกก

คนเขียนโปรแกรมเลยต้องตัดสินใจว่าจะคิดล่วงหน้าไปกี่ตา… แล้ววัดว่า กระดานหมากรุกนั้น คอมหรือคนมีโอกาสชนะ/แพ้มากน้อยแค่ไหน :)

ข้อจำกัดใน iOS ที่มีผลต่อ UX ของ Notification

ผมใช้มือถือ Android มาโดยตลอด แต่ตอนตัดสินใจซื้อ tablet ได้ไปลองเล่น iPad 2 กับ Galaxy Tab 10 เทียบกันดู ปรากฏว่าความลื่นไหลของ iPad 2 นี่มันสุดยอดจริงๆ (ณ เวลานั้นน่ะนะ ตอนนี้เปลี่ยนมาใช้ Nexus 7 ละ :P)

ระหว่างใช้ iPad ก็นึกสงสัย ว่าทำไมแอพดังๆ หลายตัวมันถึงมี User Experience (UX) แบบนี้เนี่ย ถ้าปรับปรุงอีกหน่อย ผู้ใช้จะสะดวกขึ้นอีกเยอะเลย

วันนึงผมมีโอกาสได้เขียนโปรแกรมบน iOS แล้วได้พบกับข้อจำกัดหลายๆ อย่างของ Apple Push Notification (APN) ซึ่งมีทั้งข้อดี/ข้อเสีย และก่อให้เกิดข้อจำกัดกับ UX ของแอพใน iOS เอง

วันนี้เลยอยากแชร์ข้อจำกัดนั้น (“ทำไมแอพมัน…ฟระ”), ข้อดีข้อเสียของ APN, และท่า Compromise เทพๆของแอพ Facebook เพื่อปรับปรุง UX ครับ

คำถาม

  1. เวลา Twitter เตือนว่ามี Direct Message ใหม่
    ทำไมเรากดเข้าไปแล้วไม่เจอข้อความทันที?
    ทำไมต้องรอโหลด message อีกรอบ รอให้โหลด message เสร็จแล้วค่อยเตือนไม่ได้เหรอ? จะได้กดเข้าไปเจอ message ทันทีไม่ต้องรอ
  2. เวลา LINE เตือนว่ามีข้อความใหม่ ทำไมบางทีกดเข้าไปแล้วไม่เจอข้อความ?

ตอนแรกผมก็โทษโปรแกรมเมอร์ครับ… ทำไมแกไม่ออกแบบแอพให้ดีกว่าเน้!
พอได้เขียนโปรแกรมกับ APN แล้วเริ่มเข้าใจหัวอกคนทำแอพมากขึ้น

Continue reading ข้อจำกัดใน iOS ที่มีผลต่อ UX ของ Notification

Catch kill signal in Python

We can check for Ctrl-C with KeyboardInterrupt exception as follows:

try:
    while True:
        print "Echo ", raw_input(">")
except KeyboardInterrupt:
    print "Good bye"

When python process was killed, we will not get KeyboardInterrupt. But we can instead catch SIGTERM sent by kill command.

In order to catch SIGTERM, we can do:

import signal
import sys

def signal_term_handler(signal, frame):
    print 'got SIGTERM'
    sys.exit(0)

signal.signal(signal.SIGTERM, signal_term_handler)

List of signal is available in POSIX Signals. Note that SIGKILL cannot be caught.