Development machine setup

เมื่อวานผมคิดอยู่ว่าอนาคตที่จะต้องเจอแน่ๆ คือต้องทำงานใน Windows เพราะลินุกซ์เองผมยังไม่รู้สึกว่าใช้งานเป็นเครื่องหลักผมได้ (แต่สำหรับอีกเครื่องหนึ่งหรือจะ dual boot ค่อนข้างจะโอเค) ก็เลยลองหาดูว่าแล้ว #คนใช้วินโดวส์เค้าทำงานกับอะไร ก็ไม่ค่อยเจออะไรน่าสนใจเท่าไร

ก็คิดว่าน่าจะเขียนบ้างว่าแล้วบนแมคล่ะ ผมเซตอะไรไว้บ้าง ไว้เป็น checklist เวลาผมลงใหม่ด้วย และเผื่อคนที่หลงเข้ามาจะเอาไปใช้ตามด้วย


Dark mode

เปิด Dark mode ได้ใน System Preferences > General > Use dark menu bar and Dock

OS X for Hackers

มีคนเขียน shell script OS X for Hackers ไว้สักพักแล้ว ผมเห็นทีแรกแล้วก็พบว่ามันมี option หลายตัวเลยที่ผมรำคาญมากแล้วมันมีทางแก้ให้ ปกติผมก็ไม่ได้รันทั้งสคริปต์แต่จะตัดเฉพาะท่อนที่สนใจเข้ามา (เพิ่งเห็นแฮะว่าตอนนี้มันใช้ y/n question แล้ว แต่ก่อนต้องก๊อปแปะรันเอง)

อันที่เคยใช้ก็จะมี

  • Set computer name
  • Expand save panel by default (ปกติแมคเวลาเซฟงานจะขึ้นแค่ให้ใส่ชื่อไฟล์กับ dropdown เลือก folder แล้วต้องกดขยายเพื่อ browse folder อันนี้จะทำให้มันขยายให้เอง)
  • Reveal IP address, hostname, OS version, etc. when clicking the clock in the login window (เอาจริงๆ ก็ไม่ได้ใช้นะ แต่ว่าเปิดไว้ก็ไม่เสียหาย)
  • Disable hibernation (เครื่องผมมีปัญหา hibernate แล้วเครื่องจะหน่วง)
  • Enabling full keyboard access for all controls​
  • Disabling press-and-hold for special keys in favor of key repeat
  • Setting a blazingly fast keyboard repeat rate (อันนี้มันเซตเร็วไป ผมปรับเพิ่มขึ้นจากค่า default เค้า)
  • Enabling subpixel font rendering on non-Apple LCDs
  • Enabling HiDPI display modes (ทำให้ใน Display สามารถเลือกปรับ resolution แบบ retina บนจอที่ไม่ใช่ retina ได้ อย่างจอผม 1440×900 ถ้าเปิด HiDPI จะเหลือ 720×450)
  • Show all filename extensions in Finder by default
  • Show status bar in Finder by default
  • Avoid creation of .DS_Store files on network volumes
  • Enabling Safari’s debug menu
  • Enabling the Develop menu and the Web Inspector in Safari
  • Adding a context menu item for showing the Web Inspector in web views

แอพ

(ถ้าไม่ได้ทำ link ไว้แสดงว่าลงจาก cask ได้ แต่บางอันผมอยากให้มันอยู่ใน /Applications ก็จะลงด้วยมือ)

  • Homebrew
  • Homebrew Cask
  • XCode
  • รัน xcode-select ใน Terminal เพื่อลง compiler ด้วย
  • iTerm 2
  • Google Chrome
  • Sublime Text 3 (ใน Cask เป็น 2)
  • Steam
  • Slate
  • Karabiner
  • MagicPrefs
  • gfxCardStatus (ผมไม่ได้ใช้ปรับการ์ดจอนะ ใช้แค่ดูว่า GPU ตัวไหนทำงานอยู่)
  • Dropbox
  • Caffeine (ตอนหลังๆ ผมไม่ได้ใช้แล้วนะ เขียน script มาแทนซึ่งมันจะพูดถ้ามีคนดึงปลั๊กด้วย)
  • Java
  • Dash — ไม่ฟรี ใช้ DevDocs.io แทนได้
  • F.lux
  • Trim Enabler
  • ImageOptim
  • ForkLift — ไม่ฟรี ใช้ Cyberduck แทนได้
  • ชุด iWork
  • XQuartz

เมาส์ & Keyboard

OS X

Screen Shot 2558-03-26 at 5.49.58 PM

ตั้งค่า Magic Mouse ที่ผมใช้ก็จะมี

  • Secondary click: click on right side
  • ปิด Smart zoom
  • ปิด Swipe between full screen apps
  • Swipe between pages: Swipe left or right with two fingers

Mission control เนี่ยปกติแล้วผมจะใช้ gesture ที่ตั้งใน MagicPrefs แทน ส่วนที่ใช้ two finger swipe between pages เพราะใช้นิ้วเดียวมันจะลั่นบ่อยมากเวลาใช้ browser พอปรับเป็นสองนิ้วแล้ว effect ตอน swipe จะหายไปด้วย แต่ใช้ได้เหมือนกัน ผมว่ามันเหมาะกับใช้งานจริงมากกว่านะ

สำหรับ Swipe between apps ผมปัดบน Touchpad เอาเพราะว่า gesture มันจะทับกันกับ Swipe between pages

Screen Shot 2558-03-26 at 5.52.44 PM

สำหรับ keyboard ไม่มีอะไรต้องตั้ง แต่สำหรับ PC Keyboard ผมจะตั้ง modifier keys ให้ตรงตำแหน่งกับคีย์บอร์ดแมค จะได้กดสะดวกๆ ซึ่งใน Karabiner ก็จะอ้างอิง key จากที่แก้ไขตรงนี้แล้วด้วย

Karabiner

เวลาตีดอทในแมคผมจะใช้แอพ Karabiner ปรับปุ่มนิดหน่อย โดยจะมี profile ปกติและ profile Dota แยกกันไปเลย option ที่ใช้ก็มีดังนี้

Karabiner: Default

Screen Shot 2558-03-26 at 1.11.27 PM

setting ตัวนี้ผมใช้เซตให้ USB keyboard ผมทำงานคล้ายๆ กับ keyboard ภายใน

  • Don’t remap internal keyboard
  • F1..F12 to Functional Keys
  • Enter to Return
  • Use PC Style Home/End #2
  • Use PC Style PageUp/PageDown
Karabiner: Dota

Screen Shot 2558-03-26 at 5.50.25 PM

  • Change Command_L Key to Option_L
  • Change Option_L Key to Command_L
  • F1..F12 to Function Keys

สำหรับ setting นี้เวลาเปลี่ยนภาษาจะต้องกด opt+space แทน แต่เวลาตีดอทปุ่ม alt จะอยู่ที่เดียวกับ Windows ในคอมทั่วไป (คือผมใช้ PC mechanical keyboard บนแมค ไม่ได้ใช้ Apple keyboard) แต่ข้อเสียคือจะกด pause ไม่ได้ ก็จะใช้คอนโซลสั่ง dota_pause แทน

MagicPrefs

Screen Shot 2558-03-26 at 1.12.33 PM

อีกแอพนึงที่ใช้ก็คือ MagicPrefs ซึ่ง settings ที่ใช้ก็จะมี

  • Tracking speed ปรับไปที่ 3 ขีด
  • One Finger Middle Axis Click: Middle Click (เอาไว้ปิดแท็บใน chrome)
  • Two Finger Swipe Up: Desktop
  • Two Finger Swipe Down: Mission Control

Sublime Text

สำหรับเจ้า Editor ตัวนี้ อย่างแรกเลยที่ต้องทำคือลง subl ใน command line

sudo ln -s /Applications/Sublime Text.app/Contents/SharedSupport/bin/subl /usr/bin/subl

ถัดมาลง Package Control และลงแพคเกจต่อไปนี้

  • ColorPicker
  • JSHint Gutter
  • SublimePythonIDE (ตัวนี้ดี แต่ทำ editor หน่วง)
  • EasyMotion
  • Emmet
  • tern_for_sublime (ผมก็ไม่แน่ใจว่ามันดีจริงป่าว)

สำหรับ config ผมใช้อันนี้

Slate

Slate เป็นแอพที่เอาไว้จัดหน้าจออัตโนมัติ ปกติแล้วเวลาผมทำงานจะเปิด chrome ประมาณ 80% จอ แล้วอีก 20% เป็น Twitica Desktop ซึ่งแต่ก่อนก็ต้องมาจัดจอเอง แล้วก็จะมีปัญหาว่าจัดแคบไป เว็บเข้า responsive design ซะอีก พอใช้ Slate แล้วก็สามารถกำหนดขนาดได้พอดี

ตัว config อยู่ที่ ~/.slate.js เขียนด้วย JavaScript ผมใช้อันนี้

ก็คือกด ctrl+1 จะจัด chrome ให้เป็น layout ตามที่บอกไว้ กด ctrl+2 จะให้ terminal โผล่ขึ้นมาและปรับเป็นขนาดมาตรฐาน 80 column และ ctrl+3 จะได้ grid สำหรับ resize app ซึ่งผม define ไว้ 2 ขนาดตามจอที่ผมใช้

Terminal

มาถึง part มันๆ กันสักที

ZSH

ถ้าไม่ใช้ zsh คุณพลาดแล้วแหละ ผมเองใช้ zsh มาได้หลายปีแล้ว แต่ก่อนใช้ grml แต่สมัยนี้จะใช้ oh-my-zsh ซึ่งของเล่นเยอะกว่า แต่ผมว่ามันช้ากว่าเยอะ

  1. ลง zsh: brew install zsh
  2. เปลี่ยน shell: chsh (ใส่เป็น /usr/local/bin/zsh)
  3. ลง oh-my-zsh: curl -L https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh | sh
  4. ปรับ ~/.zshrc ที่ผมใช้ก็จะมี
  • ZSH_THEME="agnoster" ถ้าใช้ธีมนี้ต้องลง font และปรับ terminal ให้ใช้ font นั้น และเซต DEFAULT_USER=whs ก่อนบรรทัด source
  • DISABLE_UNTRACKED_FILES_DIRTY="true"
  • plugins=(git brew composer django forklift git laravel4 mosh node npm osx pip sudo sublime) (บางอันเป็น autocomplete ครับ ที่น่าสนใจก็จะมี osx ซึ่งจะทำให้มีคำสั่ง quick-look เพื่อเปิดไฟล์ดูด่วนๆ ได้)
  • อื่นๆ
export PATH="/Users/whs/bin:/usr/local/opt/php56:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"`
export EDITOR=nano
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
alias mosh="LC_ALL=en_US.UTF-8 mosh"
alias bc="bc -l"
export ANDROID_HOME=/usr/local/opt/android-sdk/

Brew

ของเล่นเยอะแยะที่ควรลงครับ

brew install wget git gnupg graphviz mobile-shell mpv-player/mpv/mpv node ssh-copy-id youtube-dl
brew install ffmpeg --with-ffplay --with-freetype --with-libass --with-openssl --with-rtmpdump --with-theora --with-speex --with-tools
brew install imagemagick --with-fontconfig --with-webp --with-x11

ของที่ผมใช้ทำงาน (ซึ่งบางคนอาจจะไม่ได้ใช้เหมือนผม) ก็จะมี

brew install android-sdk ansible mariadb homebrew/php/php56 homebrew/php/php56-redis homebrew/php/phpmyadmin pypy python3 redis s3cmd
brew cask install intellij-idea android-studio firefox teamviewer

(ผมว่า Android Studio กับ IntelliJ มันซ้ำซ้อน แต่ในอนาคตถ้าไม่มี license นักศึกษาแล้วคงจะเลิกใช้ IntelliJ ก็เลยต้องใช้ทั้งคู่ไปก่อนแล้วตัดออกทีหลัง)

Git

อย่าลืม setup git

git config --global user.name "My Name"
git config --global user.email myemail+git@gmail.com
git config --global core.excludesfile ~/.gitignore_global
git config --global push.default simple

และใส่ในไฟล์ ~/.gitignore_global ว่า

.DS_Store

เพื่อ ignore .DS_Store ออกไป หรือจะมีไฟล์อื่นก็ใส่ที่นี่ได้ จะมีผลต่อทุก repository

เน็ตไม่ห่วย เราท์เตอร์ห่วย

เวลาเล่นดอทมีปัญหาพื้นฐานที่ผมรำคาญมาก

คือ ping มันวิ่งตั้งแต่ 80-200 บางทีจะตีกันอยู่ ping 500 พอเดินออกมาหาย ที่แย่กว่าคือตอนจะตีกัน ping อย่างดี พอจะถอย dc lag ไปเลย ทีมก็ ping รัวๆ เฮ้ยยืนเฉยๆ ทำไร ส่วนผมน่ะหรอ กลับมาอีกทีเห็นแต่ ping รัวๆ กับศัตรูไล่ดันข้ามศพผมมาถึงหน้าป้อมแล้ว

ผมก็ลองหลายๆ วิธีดู เริ่มจากง่ายๆ เสียบแลนเล่น ทีแรกเหมือนจะดี แต่เปล่าเลย placebo ชัดๆ สุดท้ายก็อาการเดิม

ถัดมา ผมมี Cisco-Linksys WAG320N อยู่ตัวนึงตั้งแต่สมัยบ้านผมใช้ xDSL ก็เลยเอามาต่อแล้ว bridge จากโมเด็มทรู (Cisco) เข้าตัวนี้ ให้ตัวนี้ทำ NAT

แรกๆ นี่อย่างลื่นครับ ping 80-100 สนุกเลย

จนกระทั่งวันนึง ping 500 ทั้งเกม ผมบ่นใน team chat จนทีมด่ามันก็ไม่หาย lag จนกระทั่งผม dc lag ผมหันไปดูแล้วพบว่า…. router ดับ!!! คือเคเบิลโมเด็มยังติดอยู่ แต่ว่า WAG320N ดับชนิดที่ว่าเหมือนชักปลั๊กออก (แต่ไม่มีใครไปแตะอะไรมัน)

nrsAU[1]

ผมเล่าให้พ่อฟัง พ่อคิดว่าน่าจะเป็นเพราะสัญญาณเน็ตมากกว่า (บ้านผมอยู่เกินระยะเดินสายฟรีและต้องใช้สายอีกชนิดเดินเข้า)

แต่ผมไม่เชื่อว่ามันจะเป็นที่เน็ตจริงๆ ก็เลยคิดว่าจะเก็บตังซื้อ Ubiquiti EdgeRouter มาใช้ (สรรพคุณมันคือ router ที่เป็นแค่ router จริงๆ ครับ ต่อเน็ตไม่ได้ ไม่มีไวไฟ และไม่มีสวิทช์ด้วย คือแต่ละช่องคือ network แยกกันอิสระไม่เกี่ยวกันเลย จะตั้งให้มันเป็น switch ก็ได้แต่ performance ก็จะต่ำเพราะมันใช้ software ทำ)

พ่อถามว่าบ้าป่าว จะเล่นเกมต้องซื้อ router ตัวหลายพัน หันไปหันมาเจอกับ PC เก่าผมที่รัน whsgroup.ath.cx ก็เลยเอามาทำ router ซะเลยละกัน


สำหรับ Config ที่ผมใช้ก็ไม่มีอะไรมากครับ เป็น Ubuntu 12.04 ลง EBox (ปกติผมไม่อยากลง Ubuntu นะ แต่จะใช้ EBox เลยต้องลง) ที่เลือก Ebox เพราะอยากได้ระบบแชร์ด้วยครับ (ใช้เป็น NAS นั่นแหละ) จริงๆ ก็เซตมือก็ได้แต่ถ้ามี GUI ให้ครบเลยก็จบ และอีกเหตุผลนึงคือมันอยู่บน Ubuntu ปกติที่ผมจะลงอะไรเล่นก็ได้ ถ้าเป็นดิสโตรแบบที่รันแต่ firewall จะลงอะไรก็ลำบาก (เอาเข้าจริงก็แทบไม่ได้ลงอะไรเลยอยู่ดี)

ส่วนการต่อก็จะต่อเป็น Cable modem > server > WAG320N (ใช้ปล่อย Wifi)

Capture

หลังลงเซิร์ฟเวอร์เสร็จแล้วพบความเปลี่ยนแปลงอย่างมากเลยครับ ping dota ผมจาก 80-100 กลายเป็น 80 ทั้งเกมไม่มีกระตุก!! ผมนี่เหลือเชื่อเลย

แต่ก็มีอยู่วันนึงนะครับที่ dota มัน ping 80-500 อยู่ ผมก็งงว่า อ้าว ตกลงมันได้ผลมั้ยเนี่ย ซึ่งตรงนี้ก็เป็นข้อดีของการที่ทุกอย่างผ่าน server คือเราก็แอบดักฟังได้ ผมเลยใช้โปรแกรม iftop ดักเลยครับ

Capture

ด้วยพลังแห่ง iftop ก็จะมองเห็นได้เลยครับว่ามีการต่อไปที่ ip ไหนอยู่บ้างตอนนี้ ใช้ bandwidth เท่าไร อย่างตอนที่กระตุกครั้งนั้นผมเปิดดูแล้วก็พบว่าไม่ใช่อะไร น้องผมดูซีรีส์อยู่นั่นเอง….

>my sister is watching series

>kill your sister

— Teammate, 2015


ปล. พอมี server แล้วเลยลองปรับ wifi ที่บ้านให้ใช้ WPA2-Enterprise ด้วยครับ โดนทั้งบ้านบ่นเลยเพราะว่ามันต่อยากมาก ใน Android มี dropdown 3 ช่อง input 3 ช่องให้กรอก (ซึ่งไม่ต้องกรอกทั้งหมดก็ได้) ถ้าไม่เคยใช้นี่งงแน่นอน