06 June 2012

ssh/scp โดยไม่ต้องใช้ password

เนื่องจากผมใช้ rsync (ผ่าน scp) เป็นเครื่องมือหลักสำหรับสำรองข้อมูล โดยเก็บไว้ที่ server ซึ่งทำได้ง่ายโดยใช้คำสั่ง

$ rsync -avz --delete Documents cholwich@xxx.com:Backup

การทำงานแบบนี้โดยปกติ จะต้องใส่ password เพื่อ login เข้าไปที่ server ที่เราต้องการเอาไฟล์ไปวางไว้ ถ้าไม่ต้องการใส่ password ทุกครั้ง ก็สามารถทำได้โดยใช้ keypair สำหรับ authentication โดยเอา public key ไปวางไว้ที่ server และคนที่มี private key เท่านั้นที่จะสามารถ login เข้าไปได้โดยไม่จำเป็นต้องใส่ password

ขั้นตอนการตั้งค่า

  1. สร้าง keypair
    $ ssh-keygen -t rsa
    
    ระบุให้เก็บ keypair ไว้ที่ ~/.ssh/ โดยไม่ต้องระบุ passphrase เมื่อเสร็จแล้วจะได้ไฟล์มา 2 ไฟล์ คือ id_rsa เก็บ private key และ id_rsa.pub เก็บ public key
  2. เอาไฟล์ id_rsa.pub ไปวางไว้ที่ฝั่ง server โดยเอาไปต่อท้ายไฟล์ ~/.ssh/authorized_keys ซึ่งเป็นไฟล์สำหรับเก็บรายการของ key ที่ใช้ authentication
    $ cat id_rsa.pub >> ~/.ssh/authorized_keys
    
    หรือ ถ้ายังไม่มีไฟล์นี้อยู่ ก็เปลี่ยนชื่อไฟล์ id_rsa.pub ให้เป็นชื่อ authorized_keys เลย ก็ได้
    $ mv id_rsa.pub ~/.ssh/authorized_keys
    
    (จริงๆ คำสั่งแรกคำสั่งเดียว ก็ครอบคลุมทั้งสองกรณีอยู่แล้ว)

เพียงเท่านี้ ครั้งต่อไปที่เราเชื่อมต่อไปยัง server ก็จะไม่จำเป็นต้องใช้ password อีกแล้ว แต่ยังไงก็คงต้องเก็บรักษา private key เอาไว้ให้ดีๆ ถ้าจะย้ายไปใช้เครื่องอื่น หรือ install เครื่องใหม่ ก็แค่เอา private key กลับไปวางไว้ที่ .ssh ของเราในเครื่อง client ก็พอแล้ว

[C] แบ่งข้อความด้วย strtok

ฟังก์ชัน strtok เป็นฟังก์ชันใน standard C library ใช้สำหรับแบ่ง string ออกเป็นส่วนๆ ตามเครื่องหมาย (delimiter) ที่กำหนด รูปแบบการใช้งานก็เป็น

char *strtok(char *str, const char *delim);


str คือ string ที่ต้องการแบ่งเป็นหลายส่วน และ delim คือ string ของตัวแบ่ง (delimiter) ที่จะใช้แบ่ง string จะเห็นว่า type ของ str กำหนดเป็น char * เนื่องจากฟังก์ชัน strtok จะแก้ไข str เปลี่ยน delim ให้กลายเป็น null character เพื่อแบ่ง string

เมื่อมีการเรียกใช้งานฟังก์ชัน strtok แต่ละครั้ง ฟังก์ชันจะให้ string ที่แบ่งได้ 1 อัน โดยเริ่มจาก str ที่กำหนด ถ้าไม่สามารถแบ่งได้แล้ว เช่น เจอ null character ซะก่อน ก็จะให้ค่าเป็น ์๊NULL ถ้าข้อความที่ต้องการจะแบ่ง ประกอบด้วย token หลายๆ อัน เราจะต้องเรียก strtok หลายๆ ครั้ง แต่ครั้งที่สองเป็นต้นไป จะต้องกำหนดให้ str เป็น NULL เพื่อให้ strtok แบ่งต่อจากครั้งก่อน มิฉะนั้นมันจะเริ่มตั้งแต่ต้นใหม่

#include<stdio.h>
#include<string.h>

int main() {
char str[] = "5022771234,50,60,30";
char delim[] = ",";
char *token;

token = strtok(str, delim);
while(token != NULL) {
printf("Token: %s\n", token);
token = strtok(NULL, delim);
}

return 0;
}


จะได้ผลคือ

Token: 5022771234
Token: 50
Token: 60
Token: 30

ข้อควรระวัง strtok จะเปลี่ยนแปลง string ที่นำไปแบ่ง จนมีค่าไม่เหมือนเดิม เพราะตัวแบ่งจะถูกแทนที่ด้วย null character จนหมด ถ้าจำเป็นจะต้องเอา string นี้ไปใช้งานอื่นอีก ควรจะเก็บไว้เองก่อน

01 June 2012

ลองใช้บริการเน็ต 3G ในญี่ปุ่น

ช่วงนี้มาทำวิจัยอยู่ที่แล็บในญี่ปุ่น คราวนี้มีชีวิตออนไลน์ที่สนุกสนานมากขึ้น เพราะ @t_maan ไปหาข้อมูลเจอมาว่าเดี๋ยวมี SIM 3G สำหรับใช้รับส่งข้อมูลอย่างเดียวขายแล้ว ชื่อ b-mobile เป็นของบริษัท Japan Communications Inc. เลยลองไปหาข้อมูลรายละเอียดเพิ่มเติมดู ก็เลยรู้ว่า b-mobile เป็น MVNO ที่ใช้เครือข่ายของ NTT Docomo แล้วก็ขาย SIM 3G และ LTE แบบ prepaid ไม่มีค่าบริการรายเดือน มาคราวนี้ก็เลยแวะร้านเครื่องใช้ไฟฟ้า แล้วก็ซื้อมาลองอันหนึ่ง เป็นแบบจำกัดปริมาณข้อมูลไว้ที่ 1GB ราคา 3,000 กว่าเยน ใช้ได้ 30 วัน ไม่แพงนะเมื่อเทียบกับใช้บริการ Data Roaming ซื้อมาเสร็จปรากฏว่า มีข้อจำกัดอันหนึ่งสำหรับเราที่มาแค่ชั่วคราว คือ จะต้องมีใช้โทรศัพท์มือถือโทรไปเปิดบริการ แต่ปัญหานี้ก็แก้ไม่ยาก ด้วยการเดินไปยืมโทรศัพท์เพื่อนในแล็บโทร แล้วเซ็ตค่า APN นิดหน่อยก็ใช้ได้แล้ว

จริงๆ แล้วสำหรับนักท่องเที่ยว b-mobile ก็มี SIM 3G แบบใช้ได้ 30 วัน เรียกว่า b-mobile SIM Visitor ไม่จำเป็นต้องเปิดบริการด้วยมือถือ แต่ดูเหมือนจะต้องซื้อผ่านทางเว็บ ในส่ง SIM มายังที่อยู่ในญี่ปุ่นเท่านั้น ก็เหมาะสำหรับนักท่องเที่ยวที่ไม่ได้รู้จักคนญี่ปุ่น หรือคนที่อยู่ในญี่ปุ่น

อ้อ ตอนซื้อคนขายขู่ว่า มันจะช้ามากนะ เอาจริงๆ แล้ว ความเร็วก็โอเคนะ สำหรับกระเหรี่ยงที่มาจากเมืองไทย