วันพฤหัสบดีที่ 16 กุมภาพันธ์ พ.ศ. 2560

ใช้งานคำสั่ง screen และ tmux

เชื่อว่าใครที่ต้องทำงานผ่าน ssh ไปยังเครื่องแม่ข่าย (แหม.. ศัพท์วิชาการเชียว) บ่อยๆ ต้องเจอปัญหากวนใจเหล่านี้กันบ้าง

  • มีหน้าจอเดียว ต้องออกจากหน้าปัจจุบัน เข้าหน้านู้น ไปหน้านี้ แล้วกลับเข้าหน้าเดิม ดูเหนื่อย (งง ป่าว?)
  • ทำงานค้างอยู่ ยังไม่ได้ save เลย โชคร้าย ssh หลุด!!! กลับมาต้องมาเริ่มใหม่ เศร้า
  • ฯลฯ (ปัญหาใครปัญหามันละกันนะครับ)
เลยมีคนพัฒนา software ประเภท terminal multiplexer ขึ้นมาแก้ปัญหาเหล่านี้ ที่มีคนพูดถึงมากก็มี GNU Screen กับ tmux

คุณประโยชน์ที่ GNU screen และ tmux มีต่อเรา

  • เปิดหลายๆ shell ได้จาก ssh session เดียว (Multiple shell windows)
  • จอมันกว้างอยากแบ่งหน้าจอทำงาน
  • ไฟดับ เน็ตสดุด หลุดออกจาก ssh ก็ยังเก็บ Shell active ให้เราอยู่
  • ไฟมา เน็ตลื่น ต่อเข้า ssh ใหม่ก็เปิดเรียกงานที่ค้างอยู่มาทำต่อได้เลย
  • คืนนี้มีต้อง run process ยาวๆ ทิ้งเอาไว้ ก็ไม่มีปัญหา run เสร็จปิด ssh ไปดูต่อที่บ้านได้เลย
  • โชว์สาว เปิดหลายๆ หน้าจอ run นู้นนี้นั้นละลานตา ประหนึ่งเทพ Hacker หลุดออกมาจาก Matrix :)

GNU Screen


GNU Screen จัดได้ว่าเป็นรุ่นใหญ่ออกมาให้ใช้ตั้งแต่ปี ค.ศ. 1987 และมักจะติดตั้งมากับระบบ *nix ตลอดมาจนปัจจุบัน (กราบ) มาแนวแก่แต่เก๋า minimal เรียบง่ายแต่ทรงพลัง

หลักคิดของ Screen จะเป็นแบบ ใน Screen (Session) สามารถมีได้หลาย Windows จบแค่นี้ ส่วนการ split นั้นจริงๆ แล้วเป็นแค่การแบ่งหน้าจอออกเพื่อแสดงผล Windows ใน Screen เท่านั้นเอง (ถ้างงตอนนี้ให้ลองใช้งานดูแล้วจะรู้ได้ด้วยตัวเอง บ่ะ)

เริ่มการใช้งาน GNU Screen ด้วยการสั่ง
$ screen
การใช้งานจะสั่งเป็นลักษณะ prefix key แล้วตามด้วย command key สำหรับ prefix key ของ screen คือ "Ctrl-a" (กด Ctrl พร้อมกับ a แล้วปล่อย) 

ลองคำสั่งแรกกันเลยดีกว่า กด "Ctrl-a" "?" (กด Ctrl พร้อม a แล้วปล่อย หลังจากนั้นกด ? ตาม) ถ้าไม่มีอะไรผิดพลาดน่าจะเจอหน้า help ของ screen แบบนี้กันนะครับ
จะเห็นว่าเรามี command key ให้ใช้งานอีกเยอะแยะเลย แต่โพสท์นี้จะเอาแค่ที่จำเป็นสำหรับใช้งานก่อนนะครับ ที่เหลือไปลองกันเอาเอง แฮ่.. :P

สร้าง Windows เพิ่ม
กด "Ctrl-a" "c"
สลับไปมาระหว่าง Windows (next, previous) กด
กด "Ctrl-a" "n" , "Ctrl-a" "p"
แบ่งหน้าจอ (Split window)
กด "Ctrl-a" "S" 
** แบ่งหน้าจอแบบแนวนอน (Horizontally) 
กด "Ctrl-a" "|"
** แบ่งหน้าจอแบบแนวตั้ง (Vertically) *** แบ่งหน้าจอแบบนี้มีแค่ screen บาง distro เท่านั้น
สลับไปมาระหว่าง split (หน้าจอที่โดนแบ่ง)
กด "Ctrl-a" "Tab"
** หลังการ split หน้าจอของ screen เราต้องทำการ สลับไปยัง split ที่ต้องการแล้ว สร้าง window ใหม่ภายใน split นั้นอีกครั้งนะครับ หรือจะ "Ctrl-a" "n" เรียก windows เก่าที่เคยสร้างมาแล้วไปแสดงแทนก็ได้

ยกเลิก split
กด "Ctrl-a" "X"

ต่อไปเป็นส่วนที่ทรงพลังของ screen นั้นคือการ Detach และ Reattach

Detach ออกจาก screen
"Ctrl-a" "d"
หน้าจอจะกลับมาที่ shell หลักปกติของเรา หลังจากนี้เราสามารถออกจาก ssh ได้เลยโดยที่งานที่อยุ่ใน screen windows ไม่หายไปไหน

Reattach กลับเข้า screen
$ screen -ls
เป็นคำสั่งสำหรับแสดง list ของ screen ที่เราได้ทำการ Detach เอาไว้ เช่น จากภาพ เป็นหน้าจอที่ Detach เอาไว้ 2 screen
$ screen -r <pid>  # screen -r แล้วตามด้วยเลขชุดหน้าของ session เช่น screen -r 1861
เป็นการกลับเข้าไปยังหน้าจอ screen ที่เรา Detach ออกมา โดยถ้าเราเปิด screen ค้างไว้แค่อันเดียวก็ $ screen -r อย่างเดียวก็ได้ครับ

หยุดการใช้งาน Screen
"Ctrl-a" "k"
จะมี message มาให้ confirm คำสั่งอีกทีนึงก่อนนะครับ เป็นการ kill screen นั้นทิ้งเลย ระวังกันด้วยต้องแน่ใจว่าทำงานเสร็จแล้วจริงๆ นะครับ

tmux


เพิ่งกำเนิดเมื่อปี 2007 และเป็นที่นิยมมากในปัจจุบัน ด้วยหน้าตาลูกเล่นที่เยอะกว่าและคุณสมบัติอื่นๆ ที่ค่อนข้างจะคล่องตัวกว่า screen อยู่พอสมควร

tmux ไม่ได้ติดตั้งมากับ distro อยากได้ต้องลงเองตามสะดวกนะครับ
แนวคิดของ tmux จะต่างจาก screen อยู่เล็กน้อยตรงที่ tmux จะเริ่มที่ session ใน session มี windows และ panes

หลักการใช้งานก็จะเหมือน screen เลยนั้นคือกด prefix key แล้วตามด้วย command key ดังนั้นสำหรับ tmux จะไม่ขออธิบายมากเอาเป็นสรุป key ที่คิดว่าต้องใช้บ่อยๆ และจำเป็นไปเลยละกันเนอะ (แบบว่าขี้เกียจแล้ว)

เปิดใช้ tmux
$ tmux
หรือ
$ tmux new -s <session name>
แสดง Session ที่มีอยู่
$ tmux ls
Reattach กลับเข้า Session
$ tmux a -t <session name>

รวมคำสั่งสำหรับจัดการ Session, Windows, Panes เมื่ออยู่ใน tmux

Help me
"Ctrl-b" "?"
คำสั่งจัดการ Session
"Ctrl-b" "s"   // แสดงรายชื่อ session ที่มี สามารถใช้ ลูกศรเลือกไปยัง session นั้นๆ
"Ctrl-b" "$"   // ตั้งชื่อ Session ใหม่
"Ctrl-b" "d   // detach session ออกมาที่ shell หลัก
คำสั่งจัดการ Windows 
"Ctrl-b" "c"   // สร้าง Windows ใหม่
"Ctrl-b" ","   // ตั้งชื่อ Windows
"Ctrl-b" "w"   // แสดงรายชื่อ Windows ที่มี สามารถใช้ลูกศรเลือกไปยัง Windows นั้นๆ
"Ctrl-b" "n" , "p"   // สลับไปมาระหว่าง Windows
"Ctrl-b" "0-9"   // สลับไป Windows ตามหมายเลขกำกับ
คำสั่งจัดการ Panes
"Ctrl-b" "%"  // split Vertically Panes
"Ctrl-b" """   // split Horizontally Panes
"Ctrl-b" "{" , "}"  // โยกย้ายสลับ Panes
"Ctrl-b" "o"  // สลับไปมาระหว่าง Panes
"Ctrl-b" "!"   // ส่ง Panes ไปเป็น Windows
"Ctrl-b" "z"   // ขยาย/ย่อ Panes เต็มจอ (ต่างกับ "!" ตรงไม่ได้ขยายไปเป็น Windows
"Ctrl-b" "Ctrl-ลูกศร"   // ปรับขนาด Pane
"Ctrl-b" "x"   // ยกเลิก Panes
"Ctrl-d"   // ยกเลิก Panes (จริงๆ พิมพ์ exit ก็ได้เหมือนกัน)

เอาเท่านี้นะครับ เหนื่อยแล้ว - -"

สวัสดีครับ

วันพุธที่ 8 กุมภาพันธ์ พ.ศ. 2560

วิธีทำให้ USB Audio ใช้งานได้กับ Raspberry Pi 3

เคยบ่นเรื่องคุณภาพเสียงที่ออกมาทางช่อง 3.5mm audio jack ของ Raspberry Pi 3 ไปตั้งแต่ตอนเขียนเรื่องการติดตั้ง Raspbian แล้ว คราวนี้ถึงเวลากำจัดจุดอ่อนซะที :)

** บทความนี้น่าจะใช้ได้ทั้ง Raspbian และ RetroPie

เตรียมตัว

  • Raspberry Pi 3 ที่ลง Raspbian หรือ RetroPie แล้ว
  • จัดการเสียบ USB Audio (บ้านเราเรียก USB Sound Card) เข้ากับ Raspberry Pi ซะ ผมซื้อมาจากในเน็ตราคา 90 บาท ยังไม่รวมส่ง หน้าตาประมาณนี้ (ภาพประกอบจาก Internet)
    • จริงๆ จะใช้รุ่นอื่นก็น่าจะไม่มีปัญหาอะไร (แบบว่าอันนี้มันถูกสุดแล้วไงเลยจิ้มเอามาลอง)
    • ข้อดี คือมันกินไฟน้อย ราคาถูกมาก และเห็น review บน youtube ไปในแนวทางที่ดี 
    • ข้อเสีย ของรุ่นนี้คือ มันใหญ่เทอะทะ พอเสียบเข้าช่อง USB ด้านหลัง Raspberry Pi แล้วจะไปขวางช่อง USB อันอื่นๆ หมด โชคดีที่บ้านมีสายพ่วงมาต่ออีกที เลยรอดไม่ต้องออกเงินเพิ่ม - -"
  • เสียบๆ นู้นนี้นั้นครบแล้วก็ Boot Raspberry Pi ขึ้นมาเลย จากนั้นจะทำหน้าเครื่องหรือ ssh ก็แล้วแต่เลย

Setup

  • ลองตรวจสอบว่า Raspberry Pi ของเรามองเห็น USB Audio ที่เราเสียบเข้าไปแล้วหรือยังด้วย 

    • $ lsusb
  • หลังจากนั้นก็เช็คให้แน่ใจว่า USB Audio เราได้รับการ detected จาก os แล้ว
    • $ cat /proc/asound/modules
    • หน้าตา output น่าจะออกมาประมาณนี้
      • 0 snd_bcm2835
        1 snd_usb_audio 
    • เจ้า snd_bcm2835 ก็คือ built-in sound card นั้นเอง
  • ต่อมาจัดการบอก OS ให้มาใช้งาน snd_usb_audio โดยการสร้าง config file ดังนี้
    • $ sudo vim /etc/modprobe.d/alsa-base.conf
      จากนั้นก็ใส่ code พวกนี้ลงไป
      options snd_usb_audio index=0
      options snd_bcm2835 index=1
      options snd slots=snd-usb-audio,snd-bcm2835
  • เสร็จแล้วก็ Save และ reboot Raspberry Pi ซะก่อน
  • หลังจาก Reboot เสร็จแล้วลองตรวจสอบดูว่าตอนนี้ OS ใช้ Device ตัวไหนอยู่
    • $ cat /proc/asound/modules
    • หน้าตา output จะต้องออกมาประมาณนี้
      • 0 snd_usb_audio
        1 snd_bcm2835
  • จากนั้นก็ลองทดสอบดู
    • เปิด youtube เสียงต้องออกและคุณภาพเสียงต้องดีกว่าเดิม
    • สำหรับ omxplayer ต้อง redirect output ไปที่ alsa
      • $ omxplayer -o alsa video.mp4

จบ. :D