ให้ intellij ทำ gofmt และ goimport ให้เราหลังจาก save


1. เพิ่มสร้าง script .sh ขึ้นมาไว้ที่ไหนซักที่ก่อน

#!/bin/sh

if [[ $1 == *.go ]]
then
goimports -w $1
gofmt -w $1
fi

2. เพิ่มสิทธิ์การรันให้กับ script นี้สมมุติชื่อ goauto.sh

chmod +x goauto.sh

3. เปิด Preferences และไปที่ External tools กดเครื่องหมาย +
Screen Shot 2558-10-14 at 6.37.33 PM

Screen Shot 2558-10-14 at 6.37.21 PM

4. ตั้งค่าไปที่ script ของเรา

Screen Shot 2558-10-14 at 6.39.35 PM

5. ok และกลับไป file ของเราสร้างไฟล์ขึ้นมาซักไฟล์ แล้วไปที่ Edit -> Macro
Screen Shot 2558-10-14 at 6.40.49 PM

6. เมื่อ start record แล้ว ให้รัน Tools->External tools-> script ของเรา

Screen Shot 2558-10-14 at 6.41.15 PM

7. แล้วก็ File -> save all
Screen Shot 2558-10-14 at 6.41.32 PM

8. แล้วก็หยุด macro ได้เลย
Screen Shot 2558-10-14 at 6.42.06 PM

9. ตั้งชื่อ macro เก็บไว้เดี๋ยวเราต้องเอาไปใช้ต่อ

Screen Shot 2558-10-14 at 6.42.29 PM

10. เปิด Preferences ขึ้นมาอีกรอบ และหา keymap จะมีอยู่ใน macro ชื่อตามที่เราตั้งเลยแต่ว่าจะยังไม่มี key

Screen Shot 2558-10-14 at 6.46.46 PM

11. ให้เราเพิ่ม command+s หรือ ctrl+s เข้าไปมันจะบอกว่าจะทับ keymap เดิมที่มีของ save all นะก็ให้มันทับแล้วลบของเก่าออกไปเลย

Screen Shot 2558-10-14 at 6.46.57 PM

Screen Shot 2558-10-14 at 6.47.23 PM

Screen Shot 2558-10-14 at 6.47.35 PM

12. OK แล้วก็ลองใช้ดูเป็นอันเสร็จพิธี

code เน่าๆ
Screen Shot 2558-10-14 at 6.48.44 PM

save แล้วกลายเป็น code เนียนๆ ด้วย gofmt และ goimport
Screen Shot 2558-10-14 at 6.48.53 PM

Advertisements

Telnet


เรื่องเล็กๆ น้อยเกี่ยวกับ telnet เนื่องจากระหว่างเขียน https://github.com/mossila/go-chat-simple ไอ้เจ้าตัวนี้อยู่แล้วทดสอบ socket บ่อยๆ ด้วย telnet แล้วก็พบว่าเราเข้าใจอะไรบางอย่างผิดมาตลอด(ที่คนอื่นอาจจะรู้มานานและ) ซึ่งนั้นก็คือ


telnet localhost 1234
Trying ::1...
Connected to localhost.
Escape character is '^]'.
test
Hello
^]
telnet>

ไอ้จังหวะที่เรา ^](control + ]) เนี่ยมันไม่ได้ตัด connection นะ, ผมนี่ก็โง่อยู่นะว่าเอ๊ะทำไมโปรแกรมผมทำไมมัน handle close connection ไม่ได้ซะที

ที่แท้ถ้าเรากด Escape character แล้วมันยังไม่ออกครับสามารถกลับไปส่งหรือรับข้อความใน telnet ต่อได้เลยด้วยการกด enter 1 ที, ส่วนถ้าเกิดว่าเราจะออกนั้นก็ง่ายๆ แค่ ctrl+C หรือไม่ก็ ctrl+D หลังจากที่กด escape character แล้วเท่านั้นเอง


$ telnet localhost 1234
Trying ::1...
Connected to localhost.
Escape character is '^]'.
Hello 1
^]
telnet>
Hello 2
^]
telnet> ^C
$


$ go run version4/main.go 1234
Hello 1
Hello 2
EOF
^Cexit status 2
$

ปล. จดบันทึกความโง่ ใครรู้อยู่แล้วให้ข้ามไป

KVO หรือ Key-Value Observing


KVO หรือ Key-Value Observing เป็นวิธีการหนึ่งในการเฝ้าดูการเปลี่ยนแปลงของ properties ของ object ใดๆ
เป็นกระบวนการที่มีประโยชน์อย่างยิ่งสำหรับการเขียน Code ที่มีการเชื่อมโยงกันระหว่าง Model กับ Controller โดยที่ Model ไม่ต้องมีส่วนเกี่ยวของใดๆ กับ Controller เลย

mvc
ภาพจากส่วนหนึ่งของ Slide จาก CS193p ของ stanford.edu CS193P

ตัวอย่างเช่นผมมี Model แบบนี้

@interface MagicCalculateModel : NSObject
/**
  * เมื่อมีการ set magicInput เข้ามาจะใช้เวลายาวนานในการคำนวณ
  * เมื่อคำนวณเสร็จก็จะ update magicOutput ให้
  * ให้ผู้ใช้ observe ดูที่ magicOutput เพื่อรอรับผลการคำนวณ
  */
@property (nonatomic,strong) NSString* magicInput;
@property (nonatomic, readonly) NSString* magicOutput;
@end

ถ้าเกิดมีการ set ค่าไปที่ magicInput โดยตรงแล้วผมต้องการ output ทันทีคงจะเป็นไปไม่ได้เพราะว่า output ของ model นี้ใช้เวลาในการคำนวณ, เราจะวน for ไปถาม magicOutput เพื่อขอดูว่าได้ผลลัพท์แล้วหรือยังก็คงไม่ไหว(UI กระตุกแน่นอนถ้าทำแบบนี้)

เพราะฉะนั้นการแก้ไขของเราก็คือการนำ KVO เข้ามาใช้โดยการให้ Controller ของเราไป Observe ที่ Model
ด้วย – (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath …;
โดยถ้า Controller จุดที่เหมาะสมที่จะไป addObserver ก็คือตอนที่สร้าง model ขึ้นมาจากตัวอย่างคือ add ที่ lazy instantiation เลย ,โดย KeyPath จะต้องตรงกับชื่อของ property ที่เราต้องการ observe

@interface ViewController ()
...
@property (nonatomic,strong) MagicCalculateModel* calculator;
...
@end

@implementation ViewController
@synthesize calculator = _calculator;
-(MagicCalculateModel *)calculator {
    if (!_calculator) _calculator = [[MagicCalculateModel alloc] init];
    // ให้ calculator รับเรา(ในที่นี้คือ Controller) เป็น observer
    // สำหรับ property ที่ชื่อว่า 'magicOutput'
    // ในกรณีที่มีการเปลี่ยนแปลงค่า'ใหม่' เกิดขึ้น
    // context คืออะไรผู้เขียนก็ยังไม่เคยใช้จ้า
    [_calculator addObserver:self
                  forKeyPath:@"magicOutput"
                     options:NSKeyValueObservingOptionNew
                     context:nil];

    return _calculator;
}

และเมื่อเราเป็นคนก่อเราก็ต้องเป็นคนเก็บ เมื่อ model นี้ไม่ได้ใช้เมื่อไหร่ก็ต้อง remove observer ออกด้วยเป็นเงาตามตัวเหมือนกับการ retain , release

-(void)setCalculator:(MagicCalculateModel *)calculator {
    if (_calculator != calculator) {
        // ยกเลิกการ observe เดิม
        [_calculator removeObserver:self
                         forKeyPath:@"magicOutput"];
        _calculator = calculator;
        //และถ้าค่าใหม่ไม่ใช่ nil ก็ขอ observe ต่อด้วย
        //ถ้า _calculator เป็น nil บรรทัดนี้ก็ไม่ error และก็จะไม่เกิดอะไรขึ้นด้วย
        [_calculator addObserver:self
                      forKeyPath:@"magicOutput"
                         options:NSKeyValueObservingOptionNew
                         context:nil];
    }
}

แล้วก็ไปรอรับผลจากการ observe ได้ที่ method observeValueForKeyPath:… ทำการ check ว่าให้ผลจากที่ model และ keyPath ที่เราต้องการหรือเปล่าเพื่อความถูกต้องถ้าเกิดมีการ observe ค่าไว้หลายตัว

-(void)observeValueForKeyPath:(NSString *)keyPath
                     ofObject:(id)object
                       change:(NSDictionary *)change
                      context:(void *)context {
    if (object == self.calculator && [keyPath isEqualToString:@"magicOutput"]) {
        self.output.text = self.calculator.magicInput;
    }
}

Code ตัวอย่าง
เอวัง

  1. ทำไมไม่ใช้ delegate
  2. เพราะว่า delegate รองรับ ‘ผู้รับ’ แค่ตัวเดียว(ส่วนใหญ่) ,KVO มี’ผู้รับ’กี่คนก็ได้ เช่นในกรณีที่ Model นี้ share กันใช้โดยหลาย Controller ,แล้ว KVO นั้น model ก็ไม่ต้อง implement อะไรเพิ่มเลยแต่ delegate จำเป็นต้อง implement เพิ่ม

  3. ทำไมไม่ใช้ NSNotificationCenter
  4. คนละจุดประสงค์การใช้กัน NSNotificationCenter เหมือนกระบอกกระจายเสียงที่ต้องการตะโกนให้ทั้ง Application ได้ยิน แล้วใครจะมารับก็ได้มีปัญหาการใช้ key ซ้ำซ้อนกันได้สูงกว่า, แต่ว่า KVO แค่จาก object หนึ่งไปอีก object หนึ่งเท่านั้น, อีกอย่าง NSNotificationCenter Model ก็ต้อง implement เพิ่มเหมือนกัน

ติดตั้ง ubuntu บน virturl box เพื่อเขียนโปรแกรม


if เพื่อนมีไฟล์ virtualbox หรือ ubuntu :
   ให้ขอเพื่อนมีกี่ไฟล์ขอให้หมด
   ข้ามไปที่ "เริ่มติดตั้ง"
else:

0. เป็น option ทำหรือไม่ทำก็ได้ คิดติดตั้ง firefox และส่วนเสริมที่ชื่อ DownThemAll เพื่อให้ download เร็วขึ้น
1firefox

2downthemall

1. Download virtualbox จาก https://www.virtualbox.org/wiki/Downloads บน Windows ให้เลือก “Windows hosts x86/amd64”
2. Download ubuntu version ล่าสุด(ตอนที่เขียนคือ 13.10 Saucy Salamander) จาก http://mirror1.ku.ac.th/ubuntu-releases/
แล้วก็เลือกเป็น i386 ก็พอ
ubuntu

เริ่มติดตั้ง
Read More »

เรื่องออมไม่ยาก


เขียนแบบสั้นๆ จะเอาแค่ 140 ตัวอักษรก็น้อยไป
สรุปเป็น วิธีการให้เลยละกัน เหตุผลท่านสามารถคิดและเติมเต็มได้จาก blog อื่นๆ มากมาย

1. ให้เก็บก่อนใช้ หักไว้ออมเลย 20-70% ตามความสะดวกของแต่ละบุคคล แต่ต้องหักสำหรับเก็บแล้วห้ามถอนนะ ใจแข็งไว้
2. เก็บเงินสำรองก่อน 1-3 เท่าของเงินเดือน
คิดจาก

เวลาที่ใช้หางานใหม่ได้ถ้าตกงาน x เงินที่ต้องใช้จ่ายในแต่ละเดือน

3. ประกัน เจ็บป่วย ล้มหายตายจาก คนข้างหลังไมเป็นภาระ อย่าไปจัดเต็มตามที่ประกันขายเอาแค่เหมาะสมกับตัวเรา (เงินเดือน 15,000 ทุนซักแสน ค่าชดเชยนอนโรงบาลซักพัน ก็พอได้แล้วนะ) ถ้าจะใช้ประกันสังคมก็ตามใจ(พอได้อยู่)

จะเจ็บจะตายไม่เป็นภาระใคร คุ้มครองแต่พอดี

เสียภาษีดู 4 ไม่เสียข้ามไป 6 แต่ถ้า 4-5 ไม่ชอบก็ 6 เลยก็ได้
4. LTF ลงทุนระยะกลาง หวังผล 5 ปี สำหรับคนเลือกลงทุนไม่ค่อยถูก เอาตัวนี้แหละง่ายผลตอบแทนใช้ได้ กำไรตั้งแต่ได้ลดหย่อนภาษี ซื้อแค่พอลดหย่อนภาษีก่อน

LTF ออมระยะยาว(ไม่มาก) แต่ผลตอบแทนไม่น้อย ลดหย่อนภาษีด้วย

5. RMF ลงทุนระยะยาวหน่อยเพราะใช้สำรองเลี้ยงชีพ ได้ผลตอบแทนดีกว่าประกันชีวิตเยอะ(มีความเสี่ยง) เก็บไว้ใช้ตอนเราไม่ได้ทำงานแล้วเพราะทุกคนไม่ได้มีบำนาญเหมือนข้าราชการ ซื้อประกันหมดได้ใช้ตอนตายนะ ตัวนี้ใช้ตอนแก่

ทำไมต้อง RMF
เพราะว่าชีวิตคนเราไม่ได้มีแค่เกิด เจ็บ ตาย(เจ็บกับตายประกันคุ้มครอง)
มันมี “แก่” ด้วย อันนี้ประกันไม่คุ้มครองนะครับ

6. เหลือเงินอีก!!! ศึกษาหาความรู้ หุ้น กองทุนรวมต่างๆ แล้วลองกับพวกนี้เลย หุ้นพื้นฐานดีๆ ถ้าทำได้ 3-5 อาจจะไม่จำเป็นกับคุณเลยก็ได้

ออมก่อนรวยก่อน การลงทุนที่ควรเริ่มต้นมากที่สุดคือความรู้

ถ้าคนเพิ่งเริ่ม กลัว ไม่อยากเรียนรู้เยอะ ก็ลองดู 4-5 ก่อน แต่ทั้งนี้ต้องทำ 1-3 ให้ได้ก่อนนะครับ

Install rails 4 on OSX Maverick


  1. ติดตั้ง command line tools จาก Xcode ก่อน
  2. แก้ปัญหาเรื่อง Permission ติดตั้งไฟล์
  3. sudo chmod go-w /usr/local/bin
    sudo chmod go-w /usr/local/
    

    มันจะถาม password user ก็ให้เค้าไปครับ

  4. ติดตั้ง rails
  5. sudo gem update --system
    sudo gem install rails
    sudo gem update rails
    
  6. ลองสร้าง app
  7. mkdir rails
    cd rails
    rails new testapp
    
  8. ถ้าสร้างไม่สำเร็จมันมักจะติดที่ว่า gem บางตัวขาดหายไปให้ install ตามที่มันบอก(ข้างล่างนี้คือตัวอย่างที่ผมโดน)
  9. sudo gem install multi_json
    sudo gem install coffee-script
    sudo gem install coffee-script-source
    sudo gem install coffee-rails
    sudo gem install jbuilder
    

    ถามอะไรมาตอบ Y เลยครับ

  10. ใครมีวิธีที่ไม่ต้อง install เยอะแยะแบบนี้บอกผมทีเถอะ ขอร้อง T^T