สิ่งที่เรียนรู้วันนี้
บันทึกสั้น ๆ ที่ใช้ได้จริงจากทีม OOZOU บทเรียนเล็ก ๆ จากงานวิศวกรรมและการออกแบบในแต่ละวัน
รัน Claude Code แบบอัตโนมัติเต็มรูปแบบด้วย alias ชื่อ YOLO
flag --dangerously-skip-permissions ช่วยให้ Claude Code รันคำสั่งและแก้ไขไฟล์ได้โดยไม่ต้องมี prompt ยืนยัน แต่การพิมพ์มันทุกครั้งก็เบื่อเร็วอยู่เหมือนกัน
รันคำสั่งบน GPU Nvidia แบบ dedicated ของคุณบน GNU/Linux (เช่น ollama)
เพื่อให้แน่ใจว่าคำสั่ง (CLI) ใช้ NVIDIA GPU ของคุณบน GNU/Linux คุณสามารถใส่ environment variable \\NV\PRIME\RENDER\OFFLOAD=1 และ \\GLX\VENDOR\LIBRARY\NAME=nvidia ไว้ข้างหน้าคำสั่งของคุณได้
ใช้ Pundit Policy จัดการ permitted parameters ทั้งค่า default และแยกราย action
ในการจัดการ permitted params คุณสามารถเพิ่ม permitted\attributes และ permitted\attributes\for\#{action} ใน policy ของคุณได้ เช่น
ใช้ `requestSubmit` สำหรับการ submit form ร่วมกับ Turbo
Turbo คอยฟัง event submit ที่เกิดขึ้นบน form ดังนั้นให้ใช้ requestSubmit เสมอเมื่อจะ submit form ด้วย JS
ให้ Rubocop และ ESLint ignore gem ที่ bundle ไว้ใน GitHub Actions
โปรเจกต์ Rails มักติดตั้ง gem ลงใน vendor directory ใน GitHub actions เพื่อให้ cache ไว้ใช้ในรอบถัด ๆ ไปได้
เพิ่ม drop shadow สไตล์ macOS ให้ภาพแคปหน้าจอแบบ "บางส่วน" หรือภาพขอบเรียบของคุณ
โดยค่าเริ่มต้น ไม่ว่าคุณจะชอบหรือไม่ก็ตาม คีย์ลัดของ macOS สำหรับแคปหน้าจอแอปแบบเต็ม (⇧- ⌘- 5) จะเพิ่ม drop shadow จาง ๆ รอบภาพที่บันทึกไว้ ซึ่งช่วยให้ภาพดูสวยงามขึ้นเมื่อ…
สร้างหน้าจอโทนสีเดียวด้วยเลเยอร์ overlay ที่ใส่เอฟเฟกต์ hue fill
สร้างหน้าจอโทนสีเดียวด้วยเลเยอร์ overlay ที่ใส่เอฟเฟกต์ hue fill
กด ⌥option ค้างไว้แล้วคลิกลากตาม input field เพื่อปรับขนาด
กด ⌥option ค้างไว้แล้วคลิกลากตาม input field เพื่อปรับขนาด
git check-ignore
คำสั่งนี้ช่วยให้ debug ได้ว่าไฟล์หรือ path หนึ่ง ๆ ถูก ignore หรือไม่ และถ้าใส่ flag -v ก็จะแสดง exclude pattern ที่ match ให้ดูด้วย (Docs)
ทำให้วางโค้ด Ruby หลายบรรทัดใน Pry ได้เมื่อใช้ leading dot notation
ตอนนี้เราใช้ leading dot notation กันบ่อยมาก เช่น
Rails 6, Ruby 3, Bootstrap 5 และ Hotwire
ต่อยอด blogpost ของ Bootrails ด้วย Hotwire: ของใหม่สุดเท่ทั้งหมด (ณ ตอนที่เขียน TIL นี้):
แปลง Text Object เป็น Title Case ใน Figma
คุณสามารถตั้งค่า property ของ Text box ให้แปลงข้อความทั้งหมดเป็น Title Case โดยอัตโนมัติ (รวมถึงรูปแบบตัวพิมพ์ทั่วไปแบบอื่นด้วย)
ลดขนาด Slug ของ Heroku
ขั้นแรก ติดตั้ง plugin Heroku Repo:
รันคำสั่งแบบ incognito/ส่วนตัวสำหรับ Bash และ Zsh
แค่ใส่ space ไว้หน้าคำสั่ง คำสั่งนั้นก็จะไม่ถูกบันทึกลง ~/.bash\_history เช่น qrencode -o out.png "Some secret text"
แปลง SVG เป็น PNG
บน MacOS ให้ติดตั้ง inkscape (ผ่าน brew) แล้วใช้งานแบบนี้:
พฤติกรรมของ CMD+Click ใน Figma
การกด ⌘CMD ค้างไว้แล้วคลิกซ้ายใน Designer mode จะเลือกเลเยอร์ที่ลึกที่สุดที่อยู่ใน frame/group นั้น ขณะที่ทำแบบเดียวกันใน inspector/developer mode จะเลือก object/frame/group ชั้นนอกสุด…
Rails Cache-Control
สำหรับเปิดการตั้งค่า header cache-control ของ static asset และการใช้ CDN บน Heroku:
อัปเกรดฐานข้อมูล postgres ด้วย homebrew
การอัปเกรด postgres ทำได้โดยรัน
แก้ปัญหา input ใน rails console บน Heroku
ถ้าคุณวางโค้ดหลายบรรทัดลงใน rails console บน Heroku (หรือที่อื่น) อาจเจอปัญหาบรรทัด "เบียด" ทับกัน
Heredoc แบบไม่มี interpolation
บางครั้งคุณอาจอยากใช้ Heredoc ของ Ruby แบบไม่มี interpolation ('#{....}') ซึ่งทำได้โดยใส่ dash เดี่ยวรอบ keyword ของคุณ:
ID ที่ไม่ซ้ำกันสำหรับ DOM ใน Rails
Rails มี view helper ดี ๆ อยู่มากมาย หนึ่งในนั้นคือ dom\id:*
เพิ่ม type ใหม่ให้กับ attributes API ของ Rails 5
attributes API ของ Rails 5 ช่วยให้เราสร้าง form object ได้ง่ายมาก
เพิ่ม spacer ใน Dock ของ macOS เพื่อจัดกลุ่มแอป
เปิด term (หรือโปรแกรมที่คล้ายกัน) แล้ววางคำสั่งบรรทัดเดียวต่อไปนี้:
คัดลอกไฟล์ด้วย Amazon AWS S3 CLI พร้อมกำหนดสิทธิ์
เปิด term (หรือโปรแกรมที่คล้ายกัน) แล้ววางคำสั่งต่อไปนี้:
ล้าง Docker แบบถอนรากถอนโคน
ถ้าคุณเจอ error No Space left บน Docker นี่คือวิธีแก้แบบ brute force:
แนบไฟล์เข้า ActiveStorage โดยไม่ผ่าน HTTP
ถ้าคุณต้องการแนบไฟล์ที่สร้างไว้บนดิสก์ หรือไฟล์ที่ดาวน์โหลดมาจาก URL ที่ผู้ใช้ส่งเข้ามา ทำได้แบบนี้
สร้าง hashtable ระดับกลางให้อัตโนมัติใน Ruby
hashtable ระดับกลางทั้งหมดจะถูกสร้างขึ้นให้เองโดยอัตโนมัติ
แบ็กอัปไฟล์ด้วยชื่อเดิม + ส่วนต่อท้าย
หมายเหตุ: จริง ๆ แล้วคุณใช้ !#:1 ได้กับทุกคำสั่ง เพราะมันคือ argument สุดท้ายที่ส่งให้คำสั่งนั้น
Bash alias และเวทมนตร์เล็ก ๆ
เรามีไฟล์แยกต่างหากในโฟลเดอร์ผู้ใช้ชื่อ ~/.aliases ใช้เก็บ bash alias ทั้งหมด เราใช้ alias บ่อยและเพิ่ม alias ใหม่อยู่เป็นประจำ เลยสร้างฟังก์ชัน bash สำหรับเพิ่ม alias ใหม่…
คำนวณ anagram ใน Elixir
ตัวอย่างเช่น:
เปลี่ยนเวอร์ชัน Ruby สำหรับรันคำสั่งเดียวด้วย rbenv
คุณสามารถสลับเวอร์ชัน Ruby ชั่วคราวได้ด้วย rbenv local
เปลี่ยนชื่อระบบต่าง ๆ บน macOS
จาก term (หรือโปรแกรมที่คล้ายกัน) คัดลอกและวางคำสั่งต่อไปนี้:
เปลี่ยน Go to definition ของ VS Code ให้เป็น Cmd+Click
แค่เปิดไฟล์ user settings แบบ JSON แล้วใส่ตัวเลือกนี้:
เช็คว่าสินค้า IKEA มีของหรือยัง
ถ้าคุณกำลังรอสินค้า IKEA มาเติมสต็อก นี่คือวิธีที่ใช้ได้จริงในการติดตามสถานะแบบอัตโนมัติ บทความนี้จะอธิบายวิธีใช้ shell script เช็คสต็อกของ IKEA และรับ…
เช็คว่ามีคำสั่งอยู่หรือไม่ด้วย shell script
เช็คว่ามีคำสั่งอยู่หรือไม่ด้วย shell script
จัดการแท็บใน Chrome
บางครั้งเราอยากย้อนกลับไปหน้าที่ดูล่าสุด โดยที่ยังเปิดหน้าปัจจุบันค้างไว้ ซึ่งทำได้ง่ายมากด้วยคีย์ลัด
ล้าง formula เก่า ๆ บน brew
ใช้ brew cleanup เพื่อเรียกคืนพื้นที่ว่างกลับมา!
สร้าง Hash จาก Enumerable (Rails 6.0)
method ใหม่ที่ช่วยให้คุณสร้าง Hash จาก Enumerable ได้:
เขียน migration ให้เป็น idempotent
เมื่อต้องเขียน migration แบบทำลายข้อมูล ให้ใช้ if_exists: true ตอนที่จะลบตาราง และตรวจสอบก่อนว่าตารางมีอยู่จริงเมื่อต้องการเพิ่มหรือลบคอลัมน์…
สร้างคำสั่ง git ของคุณเอง (aliases)
เคยอยากย่อคำสั่ง git ให้สั้นลงไหม? จะใช้ shell alias ก็ได้อยู่ แต่คุณต้องใส่บริบทกำกับไว้เสมอเพื่อไม่ให้ลืมว่า alias แต่ละตัวย่อมาจากอะไร แต่จริง ๆ แล้วคุณสามารถกำหนดคำสั่งของตัวเอง…
ลบ branch ที่ merge ไปแล้วใน Git
คุณสามารถเพิ่ม branch ที่ไม่ต้องการให้ลบได้ใน egrep -v 'master|develop|foo|bar'
ลบ git branch ที่ merge ไปแล้ว
คำสั่ง git สุดสะดวกสำหรับลบ local git branch ทั้งหมดที่ merge ไปแล้ว git branch --merged | egrep -v "(^\\|master|dev)" | xargs git branch -d*
Destructuring assignment ใน JS
แบบง่าย ๆ javascript const [a, b, ...c] = [10, 20, 100,200] // a= 10, b=20, c=[100,200] const { first, second } = { first: 1, second: 2 } // first = 1, second = 2
เทียบ diff ไฟล์ local กับเวอร์ชันบน remote ใน Git
แค่รันคำสั่งด้านล่างก็ได้ diff เทียบกับเวอร์ชันบน remote แล้ว
หา branch จาก commit
c198bb715 Make default expired description logic pretty `
Force push commit ก่อนหน้าขึ้น repo
ถ้า push โค้ดไปแล้วและอยากจะ force push commit ก่อนหน้า ทำได้ด้วย shell git push origin +commit\sha^:branch\name
ดูชื่อ branch ปัจจุบันของ git
ดูชื่อ branch ปัจจุบันของ git
ดูรหัสผ่านของ wifi ที่เชื่อมต่ออยู่
password: "!forHackers" `
ไล่ดู Git history ของไฟล์ (GUI)
ไล่ดู Git history ของไฟล์ (GUI)
วิธีสร้าง HTML Element พร้อม Attribute ในบรรทัดเดียวด้วย JavaScript
เวลาทำโปรเจกต์ JavaScript การสร้าง HTML element แบบ dynamic เป็นเรื่องปกติ ตามวิธีดั้งเดิม คุณอาจต้องใช้โค้ดหลายบรรทัดเพื่อสร้าง element แล้วตั้งค่า attribute ทีละตัว…
วิธีหา god object ในโปรเจกต์ของคุณ (Rails)
ไปที่ root ของโปรเจกต์แล้ว cd เข้าไปที่ app/models (ผ่าน CLI แน่นอน) จากนั้นรัน wc -lw \ | sort -u*
วิธีออกจาก Vim
1. ติดตั้ง Vim เวอร์ชันล่าสุด 2. เปิดไฟล์ใน Vim 3. ⌘-Q แล้วปิด terminal 4. เปิด terminal ขึ้นมาใหม่
วิธีออกจาก vim แบบจริง ๆ!!
ใน terminal
วิธีเซฟไฟล์ด้วย sudo ใน VIM
วิธีเซฟไฟล์ด้วย sudo ใน VIM
HTML form ที่ submit ไปยัง action อื่น
รู้มานานแล้วว่าเราส่งค่าไปพร้อมกับปุ่ม submit ได้ ทำให้ track ได้ว่า form ถูก submit ด้วยปุ่มไหน เช่น
ถ้าอยาก override order ที่ตั้งไว้ก่อนหน้า
ถ้าอยาก override order ที่ตั้งไว้ก่อนหน้า (แม้จะถูกตั้งผ่าน default\_scope) ให้ใช้ reorder() แทน
เพิ่มประสิทธิภาพ Bundler
ยกระดับประสิทธิภาพ bundler ของคุณด้วยการรัน task ของ bundler แบบขนานหลาย jobs:
Kill rails ที่ค้าง
อยาก kill rails ที่รันอยู่บน port ที่ต้องการ (เครื่องรัน rails server อยู่หลายตัว)
Kill SSH session ที่ไม่ตอบสนอง
บางครั้ง SSH session ก็ไม่ตอบสนอง ซึ่งถ้าพักเครื่องแล้วปลุกขึ้นมา อาการนี้จะเกิดค่อนข้างบ่อย แทนที่จะปิด tab ทิ้ง เราใช้ SSH Escape Characters เพื่อ kill session ได้
จำกัดจำนวน has_many association
จำกัดจำนวน has_many association
แสดงโครงสร้าง directory โดยยกเว้นบาง dir
เคยอยากแสดงโครงสร้างของ directory ปัจจุบันโดยยกเว้นสักหนึ่งหรือสอง directory ไหม?
ลิสต์ชื่อ model ทั้งหมดของคุณ
หมายเหตุ: RUBYOPT=-W0 ช่วยลดความ verbose ตอนรันคำสั่ง rails เพราะมันจะ suppress warning
สร้าง pr จาก command line ด้วย hub
ติดตั้ง hub ด้วย brew ก่อน: brew install hub จากนั้นใช้คำสั่งง่าย ๆ ตามตัวอย่างด้านล่าง: hub pull-request -m "best pr ever" -b oozou:develop -h feature/awesome-improvements
Slack shortcut ที่ใช้บ่อยที่สุด
⌘-K (หรือ T) เปิด channel switcher (ปกติจะสลับ channel ด้วย shortcut นี้อย่างเดียว และตั้งค่า slack ให้ซ่อน channel ที่ไม่มีข้อความใหม่ทั้งหมด)
optional relation + RSpec กับ shoulda-matchers
User 1 - 0..1 Laptop
ฟังก์ชัน Postgres กับ Query แบบ Non-sargable
การใช้ฟังก์ชันของ postgres ใน where clause อาจทำให้ query กลายเป็น non-sargable
PostgreSQL UPDATE Join
query นี้แสดงวิธีใช้ syntax UPDATE join ของ PostgreSQL เพื่ออัปเดตข้อมูลในตารางหนึ่งโดยอิงจากค่าในอีกตารางหนึ่ง ตัวอย่างเช่น
ย้ายบรรทัดขึ้นลงอย่างรวดเร็วใน Vim ได้ทุก mode
เนื่องจากต้องย้ายบรรทัดไปมาใน vim บ่อย เลยสร้าง mapping ไว้ให้ทำได้ง่ายขึ้น โดย map เป็น ⌘-j สำหรับย้ายลง และ ⌘-k สำหรับย้ายขึ้น ใช้ได้ทั้ง normal, insert และ visual mode vim nnoremap <D-j> :m…
ลบ bundler ที่มากับ ruby 2.6
การ generate แอป rails 6 ด้วย ruby 2.6+ ในเครื่องที่ติดตั้ง bundler v2 ไว้ จะสร้าง binstub ที่ใช้งานไม่ได้ ถ้าคุณเจอ error You must use Bundler 2 or greater with this lockfile. สามารถลบ…
ลบ commit ที่ไม่ต้องการออกจาก branch ของคุณ
ลบ commit ที่ไม่ต้องการออกจาก branch ของคุณ
เปลี่ยนชื่อไฟล์ใน VIM
นี่คือฟังก์ชันสุดสะดวกที่ใช้เปลี่ยนชื่อไฟล์ใน VIM (ใช้งานได้ทั้งใน MacVIM และ Neovim ด้วย)
รีเซ็ต sequence ของตาราง Postgres หลังการ DELETE
เมื่อลบ record ล่าสุดออกจากตาราง คุณสามารถรีเซ็ตตัวนับ sequence ของตารางนั้นได้ ถ้าความต่อเนื่องของฟิลด์ auto-increment เป็นเรื่องสำคัญสำหรับคุณ ลองดูการทำงานกับตารางต่อไปนี้ users:
กู้คืนไฟล์ที่ถูกลบใน Git
กู้คืนไฟล์ที่ถูกลบใน Git
รัน rubocop กับ branch ปัจจุบันของคุณ
รัน rubocop กับ branch ปัจจุบันของคุณ
รัน rubocop ก่อน commit
Git hooks ทรงพลังมากสำหรับการทำงานแบบอัตโนมัติและการบังคับใช้มาตรฐานการเขียนโค้ดใน Git repository หนึ่งใน use case ที่พบบ่อยของ Git hooks คือการรัน test อัตโนมัติและเครื่องมือวิเคราะห์โค้ดก่อน...
รันคำสั่งเดิมกับ input ที่แตกต่างกัน
ถ้าคุณต้องรันคำสั่งเดิมซ้ำ ๆ กับ input ที่แตกต่างกัน
Scope or scope ใน Rails
scope :human, -> { user.or(author) } scope :terminator, -> { admin.or(robot) } `
ดูไฟล์ที่ถูกลบใน commit ก่อนหน้า [git]
ดูไฟล์ที่ถูกลบใน commit ก่อนหน้า [git]
ส่งข้อความไปยัง Slack ด้วย cURL
Slack ให้คุณส่งข้อความผ่านบริการ Webhooks ได้
Shallow clone repo เก่า
ถ้าคุณไม่ต้องการประวัติ git ทั้งหมดของ repo ที่คุณจะทำงานด้วย คุณสามารถระบุ depth ของการ clone เพื่อ clone แค่ x revision ของ repo ได้
แสดง TODO และโน้ตอื่น ๆ ใน Rails app ของคุณ
รู้ไหมว่าคุณสามารถแสดง TODO/OPTIMIZE/FIXME ทั้งหมดใน rails app ของคุณได้ด้วย rails notes?
สถาปัตยกรรม Flux แบบง่ายด้วย Vue.js
สำหรับแอปเล็ก ๆ ที่ต้องการแค่ pattern จัดการ state แบบง่าย ๆ ผู้เขียนมักใช้ component เดียวเก็บ state ของแอปไว้ เรียกว่า container ซึ่งทำหน้าที่เป็น single source of truth ให้แอปใช้อ้างอิง...
ปิด warning ของ rspec
$ RUBYOPT=W0 bundle exec rspec spec/ ...
Tag log ของ rails ด้วยข้อมูลที่มีประโยชน์
เพิ่งได้เรียนรู้เรื่อง tagged logging ใน rails รู้ไหมว่าคุณสามารถ tag log ได้โดยใช้
ใช้ตัวอักษรพิมพ์ใหญ่ใน mapping ของ VIM
หมายเหตุ: @joe อันนี้แก้ปัญหาของคุณได้เลย :D
ใช้ FFmpeg และ Apple Script บีบอัดวิดีโอ
สร้างแอปพลิเคชันที่คุณลากวิดีโอมาวางเพื่อบีบอัดให้เล็กลงได้อย่างมาก:
ใช้ `host` เพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับโดเมน
คุณอาจใช้ dig เพื่อหา record ประเภท A/CNAME/MX และอื่น ๆ ของโดเมนจาก DNS server แต่ถ้าแค่อยากได้ภาพรวมแบบเร็ว ๆ ให้ใช้ host:
ใช้ minItems/maxItems ใน JSON schema แบบ collection
เพื่อให้ JSON schema แบบ collection ของคุณน่าเชื่อถือยิ่งขึ้น ให้ใช้ minItems และ maxItems เพื่อให้คุณไว้ใจ API ของตัวเองได้
ใช้ Neovim เป็น git difftool
แค่วางโค้ดนี้ลงใน ~/.gitconfig ของคุณ
ใช้ฟีเจอร์ alias ของ Git
Git ให้คุณสร้าง alias ได้ในตัวผ่าน config โดย config แบบ global ของคุณควรอยู่ที่ ~/.gitconfig
เฝ้าดูสถานะ CI บน Github
ถ้าคุณติดตั้ง hub ของ Github ไว้ คุณสามารถดู ci-status ของ branch ปัจจุบันได้แบบนี้:
คุณใช้ FactoryBot กับ model ที่ไม่ใช่ ActiveRecord ได้
คุณสามารถใช้เมธอด initialize\with* ของ FactoryBot เพื่อ initialize object แบบไหนก็ได้ตามต้องการ ทำให้คุณสร้าง factory ให้กับ object ใดก็ได้ตามใจ
ฟังก์ชัน Zsh สำหรับแสดง file tree
เวลาไล่ดูไดเรกทอรีบน command line การได้เห็นโครงสร้างของไดเรกทอรีและไดเรกทอรีย่อยในรูปแบบ "tree" มักช่วยได้มาก แม้จะมีเครื่องมือให้เลือกมากมาย เช่น...