API และ RSS

>*บทความสรุปจาก [Battle for the planet of the APIs](http://adactio.com/journal/6291/)*

Anil Dash เคยกล่าวถึงเว็บในยุคหนึ่งไว้ในบทความ [The Web We Lost](http://dashes.com/anil/2012/12/the-web-we-lost.html)

>ห้าปีก่อน ถ้าคุณจะเอาเนื้อหาจากเว็บนึงหรือแอพนึงมาใส่ในเว็บหรือแอพของตัวเอง ก็แค่ทำตามรูปแบบที่เขียนไว้ในเอกสาร ไม่ต้องไปเจรจาธุรกิจ ทำสัญญาอะไรกัน ฉะนั้นแล้วประสบการณ์ของผู้ใช้จึงไม่ขึ้นอยู่กับการต่อสู้ทางธุรกิจระหว่างบริษัท แต่อยู่ที่สถาปัตยกรรมอันยืดหยุ่นของเว็บ

เวลาผ่านไป สมัยนี้บริการใหม่ๆ ไม่ได้มองตัวเองเป็นส่วนหนึ่งของเว็บแล้วแต่เป็นตัวของตัวเองโดดๆ

แล้วอะไรล่ะคือสาเหตุ?

Facebook

ในสมัยก่อน AOL เคยมีบริการที่ใช้แนวคิดว่า เราไม่ต้องเข้าเว็บอะไรยุ่งยากหรอก ข้างใน AOL เรามีบริการซะทุกอย่างครบถ้วนหมดแล้ว

แน่นอนว่า สุดท้ายแล้วมันก็ไม่เวิร์ค เหมือนที่ Yahoo จะทำสารบัญเว็บก็ไม่เวิร์ค เว็บมันโตเร็วเกินไปจนไม่มีบริษัทใดบริษัทหนึ่งสามารถจะมาแข่งขันกับมันได้ ทุกคนเลยเลิกพยายามและทำตัวเป็นส่วนหนึ่งของเว็บแทน นั่นคือ ไม่ได้ทำทั้งหมดทุกอย่าง แต่ทำบริการอย่างเดียวที่เพอร์เฟกท์ ไม่ว่าจะเป็นการแชร์ภาพแบบ Flickr จัดการลิงก์ด้วย Delicious เขียนบล็อคบน Blogger และถ้าจะต้องการมีความสามารถเพิ่มเติม ก็ส่งต่อผู้ใช้ไปหาเจ้าที่ดีที่สุด อาจจะใช้ API ก็ได้ และตัวเองก็มี API ให้ด้วย

เวลาผ่านไป Facebook โตขึ้นเรื่อยๆ ครั้งหนึ่งคนแนะนำ Facebook ให้ผม ผมถามว่า “มันใช้ทำอะไร” เหมือนที่ Flickr ใช้โชว์ภาพ Delicious ใช้โชว์ลิงก์ Facebook ใช้สำหรับทุกอย่าง

ผมไม่เข้าใจ มันแปลกมากที่เครือข่ายสังคมจะใหญ่โตได้ขนาดนั้นเพียงแค่สร้างเครือข่ายที่โต

แต่มันก็โต โตขึ้นเรื่อยๆ จนถึงจุดนึงสิ่งที่ AOL ทำไม่ใช่เรื่องแปลกแล้ว มันแค่ล้ำสมัยไปเท่านั้นเอง

ต่อมาเมื่อ Facebook แสดงให้เห็นว่าเว็บเดียวเอาทุกอย่างได้ ก็เลยเป็นต้นแบบ Startup ต่างๆ เลิกมองตัวเองเป็นเว็บ แต่อยากเป็นบริการเดียวที่ผู้ใช้ต้องการแบบ Facebook

พอกลายเป็นแบบนี้ การที่มีข้อมูลไหลข้ามบริการได้อย่างสะดวกด้วย API ก็ไม่ใช่เรื่องดีแล้ว API ไม่ใช่แค่ถูกปิดอย่างเช่น Social Graph API ของ Google แต่รูปแบบการแลกเปลี่ยนข้อมูลพื้นฐานก็หายไปแล้ว

ครั้งหนึ่ง Twitter, Flickr เคยใส่ hCard ในหน้าโปรไฟล์ของเรา และถ้ามีลิงก์ไปเว็บเราจะมี rel=”me” ใส่ไว้ สมัยนี้ก็ไม่มีแล้ว

ทีนี้ RSS…

มีคนเคยถามผมว่าถ้าจะทำ API จะเริ่มจากอะไรดี ผมตอบไปว่า ถ้าคุณมี RSS คุณก็มี API แบบ Read-only แล้ว

ใน RSS คือรูปแบบการแสดงรายการแบบเป็นมาตรฐาน มีการระบุเวลา ระบุชื่อ ระบุรายละเอียด และลิงก์ ถ้าอ่าน RSS ได้ ก็สามารถอ่าน RSS อันอื่นได้ และข้อมูลใน RSS ก็เอาไปใช้งานต่อได้มากมาย เช่น มีคนเอา RSS พยากรณ์อากาศในลอนดอนมาผูกกับ RSS เวลาที่ ISS บินผ่านท้องฟ้า ก็ได้บอต Twitter ที่จะแจ้งเมื่อสถานีอวกาศนานาชาติบินผ่านฟ้าไปและตอนนั้นฟ้าโปร่ง

ครั้งหนึ่ง ทุกครั้งที่มีเว็บที่แสดงรายการ มักจะมี RSS เสมอ ทั้งบล็อค ทั้งรูปภาพ สเตตัส ฯลฯ

ปัจจุบันก็ไม่ใช่แล้ว Twitter เคยมี RSS ที่แสดงทวีตของเรา ต่อมาก็เปลี่ยน link ไปอยู่ใน Twitter API ทำให้ใช้ได้ภายใต้ข้อกำหนดของ API และสุดท้ายก็ถอด RSS ทิ้งไปเลย การจะเอาทวีตของตัวเองมาแสดงในเว็บ ครั้งหนึ่งแค่อ่าน RSS ตอนนี้ก็ต้องมานั่งศึกษาการใช้ API แถมข้อตกลงการใช้งานก็[ไม่อนุญาตให้แสดงทวีตในรูปแบบตามใจชอบ](https://dev.twitter.com/terms/display-requirements)ได้

นี่ทวิตผมนะครับ แต่สิทธิการเอาทวิตของผมไปแสดงเป็นสิทธิของ Twitter

Twitter เคยกล่าวไว้ว่า RSS นั้น “ไม่ค่อยใช้แล้วสมัยนี้” และ Google ก็ใช้ข้ออ้างเดียวกันปิด Google Reader ก็เหมือนเข้าไปซื้อของแล้วเค้าบอกว่า “อ้อ ไม่มีของครับ ไม่มีใครสั่งเลย จะว่าไป วันนี้มีคนถามห้าคนแล้วนะ”

>”RSS ก็เหมือนท่อประปา มันมีใช้กันทั่วไป แต่มองไม่เห็น”

ข้อความนี้ Brent Simmons เคยกล่าวไว้ และเค้าได้เขียน[จดหมายรักถึง RSS](http://inessential.com/2013/03/14/why_i_love_rss_and_you_do_too)

>ถ้าคุณฟังพอดแคสท์ คุณใช้ RSS, Flipboard กับ Twitter ก็เป็น RSS Reader ถึงอาจจะไม่เคลียร์ และถึงมันอาจจะมีฟีเจอร์อื่นๆ ด้วยก็ตาม

เค้ายังกล่าวถึงข้อดีอื่นๆ ของ RSS อีก โดยเฉพาะการที่มันไม่มีศูนย์กลาง ทำให้ทุกคนเท่าเทียมกัน และนั่นก็เป็นปัญหาว่าพวกเราเอาของที่มันไม่มีศูนย์กลาง ไปรวมกันไว้ใน Google Reader แล้วพอเกิดศูนย์กลางแล้วก็กลายเป็นแบบที่เห็น

กลับไปที่บทความเว็บที่หายไปของ Anvil

>เรามีนักธุรกิจรุ่นใหม่ที่คิดทำผลิตภัณฑ์ใจแคบ เป็นศัตรูกับเว็บในลักษณะเดียวกันนี้ ก็เพราะมันทำให้คนรวยกลุ่มเล็กๆ รวยขึ้นไปอีก แทนที่จะทำให้คนหมู่มากสามารถสร้างนวัตกรรม โอกาสใหม่ๆ ด้วยเว็บ

ผมคิดว่าการมองง่ายๆ ว่าบริการนั้นคิดยังไงกับข้อมูลของเราก็ดูแค่ว่ามันมี RSS หรือเปล่า

– Instagram ไม่มี RSS ของภาพของผม
– Twitter ไม่มี RSS ของทวีตผม
– Facebook ไม่มี RSS ของเพจผม

(/ผู้แปล ผม subscribe Facebook Engineering ด้วย​ RSS อยู่นะ เหมือนว่า Facebook Timeline จะเอาลิงก์ RSS ออกไปแล้ว)

ถ้าพวกนี้ไม่ไว้ใจผมขนาดจะไม่ทำ RSS แล้วทำไมผมควรจะวางใจกับข้อมูลของผมในบริการพวกนั้นล่ะ

ลง Windows 8 แบบไม่มี SuperDrive

เพิ่งใส่ SSD มาให้แมคครับ เลยเอา DVD ออกแล้วใส่ harddisk แทน

ทีนี้ถ้าใช้ Mac รุ่นเก่าๆ ที่ยังมี DVD ในตัวเนี่ยมันจะไม่สามารถ boot from USB ใน BIOS mode ได้ทำให้ลง Windows ใหม่ไม่ได้ ก็ไปนั่งค้นวิธีมาครับ เลยก๊อปมาไว้ในบล็อคไว้เผื่อจะหายแล้วจะลง Windows ใหม่อีกไม่ได้

In English (original source): Installing Windows 8 or Windows 7 on a Mac without Superdrive with VirtualBox (backup)

วิธีการนี้ใช้ได้ทั้ง Windows 7, 8 นะครับ

ช่วงที่ 1

ขั้นที่ 1 ติดตั้ง Windows

  1. ติดตั้งโปรแกรม VirtualBox
  2. สร้าง virtual machine ขึ้นมาใหม่ ตั้งแรมมากน้อยได้ตามต้องการ
  3. ตั้ง harddisk เป็นชนิด VDI แบบ dynamically allocated ขนาดประมาณสัก 10GB (ขนาดที่เหมาะสมที่สุดคือควรจะพอดีกับ Windows เปล่าๆ พอดี เยอะไปจะกินที่และเสียเวลา) และเตรียมพื้นที่ใน harddisk ไว้ขนาด 3 เท่าของขนาดที่กำหนดไว้ (เช่น 10GB ต้องมีพื้นที่ 30GB) คนละไดรฟ์กันได้
  4. ติดตั้ง Windows ตามปกติ

(user ที่ create ตอนติดตั้งควรเป็นชื่อ user ชั่วคราวแล้วค่อยไปสร้าง user ใช้จริงในขั้นตอนหลัง และ user อันนี้ไม่สามารถลบ home folder ออกไปได้)

ขั้นที่ 2 ลบ Partition System Reserved

เวลาติดตั้ง Windows จะทำ partition ไว้ 2 อันสำหรับระบบ BitLocker ซึ่ง Windows จะบูทจาก partition ตัวนี้ ก็ต้องปิด partition ตัวนี้ให้ไปใช้ partition หลักแทน

ขั้นตอนทั้งหมดนี้ทำใน Windows ที่ติดตั้งไว้ในขั้นตอนแรก ไม่สามารถ copy paste ข้ามจากแมคไปได้นะครับ ต้องพิมพ์เองหรือต่อเน็ตใน Windows มาก๊อปไป

(ถ้าเคยใช้ VirtualBox ไม่แนะนำให้ติดตั้ง Guest Additions เพราะอิมเมจเครื่องนี้จะใช้ติดตั้งเป็น OS จริง)

  1. กด win+r พิมพ์ diskmgmt.msc
  2. คลิกขวาที่ system reserved กด change drive letter and path…
  3. กด add แล้วตั้งเป็นไดรฟ์อะไรก็ได้ (ในขั้นตอนต่อๆ ไปจะเรียกเป็น drive E: และสมมุติว่า drive ที่ install Windows คือ C:)
  4. เปิด Administrator Command Prompt ด้วยการกด start ค้นหา command prompt คลิกขวาในรายการ กด run as administrator
  5. เฉพาะ Windows 8 สั่ง reagentc /disable แล้วดูที่ folder C:\Windows\System32\Recovery ว่ามีไฟล์ winre.wim หรือไม่
  6. สั่ง reg unload HKLM\BCD00000000
  7. copy file bootmgr ด้วยคำสั่ง robocopy e:\ c:\ bootmgr (อย่าลืมเปลี่ยนเป็นไดรฟ์ที่ดูไว้ในข้อ 3)
  8. copy folder boot ด้วยคำสั่ง robocopy e:\Boot C:\Boot /s
  9. ตรวจสอบว่าใน drive C: มี folder “Boot” และ file “bootmgr”
  10. สั่ง bcdedit /store c:\boot\bcd /set {bootmgr} device partition=C:
  11. สั่ง bcdedit /store c:\boot\bcd /set {memdiag} device partition=C:
  12. กลับไปที่ disk management คลิกขวาที่ system reserved กด change drive letter and path…
  13. กดปุ่ม remove > yes
  14. คลิกขวาที่ partition Windows กด mark partition as active กด Yes จะเห็นว่าคำว่า Active จะย้ายจาก system reserved มาที่ windows
  15. เฉพาะ windows 8 สั่ง reagentc /enable
  16. Reboot เครื่อง Windows ใน VirtualBox
  17. กลับไปที่ Disk management (ขั้นตอนที่ 1)
  18. จะเห็นว่า partition Windows มีคำว่า Active และ System
  19. คลิกขวาที่ partition System Reserved กด Delete Volume > Yes จะเปลี่ยนพื้นที่เป็น Unallocated
  20. Reboot เครื่อง Windows ใน VirtualBox อีกครั้ง

ขั้นตอนที่ 3 เตรียม Windows

เวลาติดตั้ง Windows จะติดตั้งให้เหมาะสมกับ hardware แต่เราจะย้าย hardware จึงต้องมีการเตรียม Windows สำหรับการย้าย

  1. เปิด Administrator command prompt (ขั้นตอนที่ 2 ข้อ 4)
  2. สั่ง net stop WMPNetworkSvc (ถ้าขึ้นว่าปิดอยู่แล้วไม่เป็นไร) เสร็จแล้วปิดหน้าต่างได้เลย
  3. สร้างไฟล์ unattend.xml (ระวังเรื่องนามสกุลไฟล์ ควรเปิดตัวเลือก “Show extensions for known file type” ใน Folder options) และแก้ไขไฟล์ด้วย notepad มีข้อความดังนี้
<?xml version="1.0" encoding="utf-8"?>
<unattend xmlns="urn:schemas-microsoft-com:unattend">
     <settings pass="generalize">
          <component name="Microsoft-Windows-Security-Licensing-SLC"
processorArchitecture="x86" publicKeyToken="31bf3856ad364e35"
language="neutral" versionScope="nonSxS"
xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
                <SkipRearm>1</SkipRearm>
          </component>
      </settings>
</unattend>
  1. Save file แล้ว move (cut) ไฟล์ไปที่ C:\Windows\System32\sysprep
  2. ใน Folder sysprep จะมีโปรแกรม sysprep ให้เปิดขึ้นมาและเลือกตัวเลือกดังนี้
    • System Cleanup Action list: System Out-of-Box Experience (OOBE)
    • Generalise: ติ๊ก
    • Shutdown Options: Shutdown
  3. กด OK แล้วเครื่องจะ shutdown เป็นอันเสร็จเรียบร้อย​ (และอย่าเปิด Virtual Machine ขึ้นมาอีก)

ถ้าเจอ error “A fatal error occurred while trying to Sysprep the machine.” ลองใช้คำสั่ง sysprep.exe /generalize /oobe /shutdown /unattend:unattend.xml ใน Administrator command prompt

ช่วงที่ 2 ทำ partition BOOTCAMP

ในช่วงนี้ให้ใช้โปรแกรม Daemon Tools for Mac mount DVD Windows ที่มี / ต่อ external dvd ใส่แผ่น Windows แล้วใช้โปรแกรม Boot Camp Assistant ทำตามขั้นตอนในหัวข้อถัดไปตั้งแต่ข้อ 8

หรือ

Hack Boot Camp Assistant

  1. เข้าไปที่ /Applications/Utilities คลิกขวาที่ Boot Camp Assistant เลือก Show Package Contents
  2. เปิดไฟล์ Contents/Info.plist ด้วย TextEdit (หรือ TextMate/Sublime/ฯลฯ) ถ้ามี permission error ไม่ให้เซฟให้ก๊อปไฟล์ไปที่ desktop แล้วทำขั้นตอนต่อไปจนเสร็จจึงก๊อปกลับมาที่เดิม
  3. ที่เมนูรูปแอปเปิ้ลบนซ้ายสุดของจอ กด About This Mac > More Info > System Report
  4. จด “Model Identifier” (ในตัวอย่างเป็น MacBookPro6,2) “Boot Rom Version” (ในตัวอย่างจะเป็น MBP61.0057.B0C)
  5. ในไฟล์ Info.plist ที่เปิดไว้ มองหา <key>DARequiredROMVersions</key> จะเห็น <string> หลายๆ อันอยู่ข้างล่าง ให้ก๊อปบรรทัดแรกสุดมาไว้ด้านบนอีกบรรทัด แล้วเปลี่ยนข้อความระหว่าง </string><string>...</string> เป็น Boot Rom Version ที่จดไว้
  6. มองหา <key>USBBootSupportedModels</key> (ถ้ามีคำว่า Pre หน้า USBBoot ให้ลบ Pre ออก) จะเห็น <string> ในลักษณะเดิม ให้ก๊อปมาแบบเดิมแล้วเปลี่ยนข้อความเป็น Model Identifier
  7. เซฟ
  8. เปิด Boot Camp Assistant จะเห็นว่าสามารถทำ USB ได้แล้ว ให้ทำ USB ไว้และจัด partition ให้ตามขั้นตอน (แนะนำให้เตรียม driver ไว้ด้วยซึ่งโปรแกรมจะดาวน์โหลดมาให้)
  9. แมคจะ reboot และบูทไม่ขึ้น ให้กดปุ่ม power แช่ไว้แล้วดึง USB ออก ถ้ายังบูทไม่ได้ลองกด alt แช่ไว้ก่อนเสียงบูทดัง เมื่อเข้าได้แล้วเข้าไปที่ System Preferences ปรับ Startup Disk กลับเป็นแมคเหมือนเดิม

Partition เอง

ตอนลงผม Partition เอง ไม่ได้ทำตามขั้นตอนเค้านะ ก็คือใช้ Disk Utilities แบ่ง FAT32 ไว้อันนึง จบ แต่ห้ามมี partition มากกว่า 2 อันใน Disk Utilities

ช่วงที่ 3 Clone Virtual Machine

ขั้นที่ 1 เตรียม harddisk

ในขั้นตอนนี้ต้องใช้พื้นที่อีก 2 เท่าของขนาดที่กำหนดไว้ในขั้นตอนที่ 3 ในช่วงที่ 1 ขั้นที่ 1 (ไว้ใน harddisk ก็ได้)

  1. เปิด VirtualBox กดที่ File > Media Manager
  2. เลือก Disk ของเครื่องแล้วกด Copy
  3. กด Next ไปเรื่อยๆ แต่ตั้ง “Fixed size” และชื่ออิมเมจไม่ควรมีเว้นวรรค
  4. เปิด Terminal (/Applications/Utilities/Terminal หรือใช้ Spotlight)
  5. พิมพ์ sudo VBoxManage internalcommands converttoraw Win7_copy.vdi win7.raw ตรง Win7_copy.vdi ไม่ต้องพิมพ์เอง แต่ให้เปิด Finder ไปที่ folder “VirtualBox VMs” และลากไฟล์ตามชื่อที่ตั้งเอาไว้มาในหน้าต่าง Terminal ส่วนตรง win7.raw สามารถพิมพ์เป็น full path ได้ตามต้องการ (เช่น /Volumes/Old\ Bootcamp/win7.raw)
  6. ใส่รหัสผ่าน (จะไม่มีดาวออกมาตอนพิมพ์ เป็นปกติ) เสร็จแล้วรอโปรแกรมทำงาน (สังเกตจากขนาดของไฟล์ .raw จะโตขึ้นจนเท่ากับขนาดที่ตั้งเอาไว้ตอนแรก)
  7. พิมพ์ sudo hdiutil attach -imagekey diskimage-class=CRawDiskImage win7.raw ตรง win7.raw ให้ใช้ตำแหน่งไฟล์เดียวกับข้อ 5 จะเห็น disk “Untitled” บน Desktop

ขั้นที่ 2 Clone

  1. ติดตั้งโปรแกรม WinClone (ไม่ฟรีครับ ^^)
  2. แท็บ Image เลือก “Untitled” แล้วกด Image เซฟไฟล์ไว้ที่ไหนก็ได้
  3. เสร็จแล้วกดเลือกไฟล์ที่สร้างขึ้น กด Restore เลือก harddisk ที่ทำไว้ใน Boot Camp Assistant กด Restore
  4. Reboot แล้วกด alt ก่อนเสียงบูท จะมีให้เข้า partition Windows
  5. ติดตั้ง Windows ตามปกติ
  6. อย่าลืมติดตั้งไดรฟ์เวอร์ BOOTCAMP

แนะนำว่า Windows ควรจะ create user ใหม่แล้วค่อยใช้งานนะครับเพราะเหมือน user เดิมจะไม่ค่อยเสถียร

ถ้าใช้ iMac 2009 แล้วมีปัญหาจอดำ ให้ลบไฟล์ C:\WINDOWS\SYSTEM32\DRIVERS\ATIKMDAG.SYS ออก โดยหา driver NTFS สำหรับ OSX (เช่น tuxera หรือ ntfs-3g) แล้วลบออกด้วย OSX