Theppitak's blog

My personal blog.

17 มีนาคม 2550

command-not-found

ตาม ubuntu feisty เล่น ๆ มาพักนึงละ ส่วนหนึ่งก็ตรวจสอบแพกเกจภาษาไทยที่ยังไม่ sync กับ debian ไปด้วย ปรากฏว่ารายการที่ขอ sync ไปยังไม่มา.. แต่รอหน่อยน่ะ บางอย่างก็ต้องรอผ่านกระบวนการก่อน โดยเฉพาะช่วง freeze อย่างนี้

แต่วันนี้ ระหว่าง upgrade เจอแพกเกจใหม่ถูกดึงเข้ามาโดย ubuntu-standard โดย recommends แพกเกจชื่อ "command-not-found" ด้วยความสงสัยก็ลอง show ดู (prompt เป็น prompt ของ root ไม่ใช่ผ่าน sudo เพราะเรียกผ่าน ubuntu chroot ใน debian):

# aptitude show command-not-found
Package: command-not-found
New: yes
State: installed
Automatically installed: yes
Version: 0.2.2
Priority: optional
Section: admin
Maintainer: Michael Vogt <michael.vogt@ubuntu.com>
Uncompressed Size: 102k
Depends: python, python-central (>= 0.5.8), command-not-found-data
Description: Suggest installation of packages in interactive bash sessions
 This package will install handler for command_not_found that lookups programs
  not currently installed but available from the repositiories.

โว้ว.. มาแล้วรึ feature แบบนี้ ลองสั่งดูซิ โดยเรียก vlc ที่ยังไม่ได้ install:

ก่อน:

# vlc
bash: vlc: command not found

หลัง:

# vlc
The program 'vlc' is currently not installed.  You can install it by typing:
apt-get install vlc-nox
Make sure you have the 'universe' component enabled
bash: vlc: command not found

อืม แนะนำให้แบบนี้ก็ดีแฮะ เดิมเคยคิดไว้ตั้งแต่สมัยเคอร์เนล 2.4 ประมาณว่า ให้มีตัว detect hardware แล้ว apt-get driver module ให้เลย แต่ตอนนี้คงไม่ต้องแล้ว เพราะเคอร์เนล 2.6 มันรวมไดรเวอร์มาเกือบครบหมดแล้ว

เท่าที่อัปเดต ubuntu ผ่าน chroot ก็รู้สึกว่า ubuntu เขาคิดอะไรเพิ่มเยอะดี แต่ดูเหมือนจะขาดเรื่องการรองรับการอัปเดตผ่าน chroot ไปนะ บางแพกเกจที่ต้อง restart system service จะอัปเกรดใน chroot ไม่ผ่านเลย ต้องบูตเข้าไปซ่อม จริง ๆ mount proc มันก็อาจจะผ่าน แต่คงไปตีกับ system service ของ host OS อยู่ดี ในขณะที่ debian สนับสนุนเรื่องนี้ค่อนข้างแนบเนียน โดยจะ detect ก่อน ว่าถ้าอยู่ใน chroot environment ก็จะไม่พยายามทำอะไรกับ system service ทำให้ maintain project ย่อย ๆ ใน chroot ได้สบายกว่ามาก

ป้ายกำกับ:

4 ความเห็น:

  • 17 มีนาคม 2550 12:31 , Blogger Taniya แถลง…

    ตอนนี้ build iceweasel โดยใช้ cygwin / mingw ผ่านแล้วครับ เล่นไปซะ 7 วันเกือบถอดใจเหมือนกัน (เกือบเปลี่ยนไปใช้ MSVC build แทนแล้ว) ผม build จาก debian-source ครับ
    Files:
    ff8f7a501070f2bb6466c1ab76063302 44925067 iceweasel_2.0.0.2+dfsg.orig.tar.gz

    ทีนี้รบกวนขอวิธี patch ให้ใช้ libthai ตัดคำหน่อยครับ

    แล้วก็ขอสรุปปัญหาที่ผมเจอในการ build ด้วย cygwin / mingw ไว้ตรงนี้เลยนะครับ
    1. ต้อง downgrade make ของ cygwin ให้เป็น version 3.80
    2. mingw-win32api ต้องเป็น version 3.7
    3. mingw-binutil ต้องเป็น
    version 2.17.50-20060824-1
    4. mingw-runtime-3.10
    5. มี source code อยู่ 1 ไฟล์ที่มีการใช้ exception handling __try , __except ซึ่ง mingw-gcc กับ mingw-win32api ไม่รองรับ ผมเลยแก้แบบกำปั้นทุบดินด้วยการ comment code ส่วนนั้นไว้ ไม่รู้ว่าจะมีปัญหาทีหลังรึเปล่า

     
  • 17 มีนาคม 2550 19:55 , Blogger Taniya แถลง…

    จากที่คุณเทพถามเรื่อง library กับ header ใน windows นะครับผมจะตอบตามความเข้าใจของผมผิดถูกยังไงก็ช่วยแก้ไขด้วย ในที่นี้เอาเฉพาะ C กับ C++ นะครับ แบ่งเป็นข้อ ๆ เลยนะครับ

    1. การพัฒนาโปรแกรมตามแบบฉบับ microsoft นั้น ตัว compiler กับ linker นั้นจะอยู่ในชุดเดียวกันคือ MSVC มีทั้ง free และ commercial version ครับ ตัว free version นั้นจะมี header และ library พื้นฐานมาให้เท่าที่จำเป็น ย้ำว่าพื้นฐานจริงๆ และ เป็น commandline ไม่มี IDE ให้ครับ สำหรับ library กับ header เสริมจะมีให้ download ฟรีแบบมีเงื่อนไข อาทิ เช่น PSDK(platfrom SDK) , .Net Framework SDK, DirectX SDK เป็นต้น ส่วน commercial version นั้นมีครบพร้อม IDE,Debugger (ครบหรือไม่อันนี้ต้องลองถามคนเคยใช้ บอกตรงๆ ผมเคยใช้ msvc เป็นเรื่องเป็นราวครั้งเดียวมั้ง ตอนนั้นใช้ compile 3D game engine ที่ชื่อ Orge กับ crystal space ) โดยการติดตั้ง tools ต่างๆ เหล่านี้ก็เป็นแค่การขยายไฟล์ลงใน directory ที่ต้องการ ประมาณว่าตามใจฉัน แล้วก็ใช้วิธี set variable กับ flags ต่างๆ เอาด้วย commandline จากนั้น ก็ compile และ link ไปตามขั้นตอน อันนี้สำหรับพวก hardcore นะครับ ส่วนพวก IDE wizard ก็จะใช้วิธีการสร้าง project file หรือ solutions file เพื่อใช้ build ก็ว่ากันไป

    สำหรับ cygwin นั้นติดตั้งจากตัวติดตั้งที่จะไปดึงไฟล์จาก mirror ต่างๆ มาตามความต้องการของเรา จริงๆ มันก็แค่แตกไฟล์ออกมาละครับ จะแตกไว้ที่ไหนก็แล้วแต่เรา โดยจะมี shell และ software ที่ทำงานแบบ unix หรือ POSIX ให้เราค่อนข้างเยอะครับ software ของ cygwin นั้น link กับ cygwin1.dll (เป็นของ cygwin เอง, อาจมี dll อื่นด้วยครับยังศึกษาไม่ถึง) เป็นหลัก โดย cywin จะทำงานเป็น POSIX layer ข้างบน windows อีกที software ต่างๆ ที่ port มา ก็จะทำงานได้โดยผ่าน POSIX layer นี้ ผมเข้าใจว่าอย่างนี้นะ

    ส่วน mingw นั้นต่างจาก cygwin ตรงที่ mingw จะไม่มีการเตรียม POSIX layer หรือ POSIX API ให้แบบ cygwin นั่นคือไม่ต้อง link กับ dll พิเศษใดๆ แต่จะ link ตรงๆ กับ dll มาตรฐานบน windows เลย อย่างเช่น msvcrt.dll( C Run-Time Library ของ windows , ใน linux คงเทียบกับ libc/glibc มั้งครับ ) , user32.dll (Windows User API Client Library) , comctl32.dll (Common Control Library) , shell32.dll(Windows Shell ) เป็นต้น (dll สามตัวหลังนี่ผมไม่รู้จะเทียบกับ lib ไหนใน linux ครับ) ดังนั้นข้อดีของมันคือ software ที่ port ด้วย mingw จะทำงานเร็วกว่า software ที่ port ด้วย cygwin แต่ข้อเสียของมันคือ เราไม่สามารถ port software ที่เรียกใช้ POSIX API ด้วย mingw ได้ และต้องกลับไปใช้บริการของ cygwin แทน ดีนะครับที่ libthai port ด้วย mingw ได้ ;) เพราะว่ามันน่าจะทำงานเร็วกว่า (รึเปล่า) ส่วนการติดตั้ง mingw ก็ไม่ได้ซับซ้อนครับแค่แตกไฟล์ไปไว้ที่ไหนก็ได้ โดย จะมี unix-liked shell ชื่อ msys ซึ่งทำงานเหมือน bash ให้ด้วย ส่วน library หรือ package เสริมนั้นสามารถใช้จาก project GNUwin32 (http://gnuwin32.sourceforge.net/) หรือ UnxUtils project (http://unxutils.sourceforge.net/UnxUtils.html)ได้ หรือหากต้องการใช้ IDE ก็มีหลายตัวเช่น Dev-C++ , codeblocks , Mingwstudio(อันนี้คนเขียนชื่อเหมือนคนไทยครับ http://www.parinyasoft.com/mingwstudio.html )

    ขอสรุปเปรียบเทียบ tools chian ต่างๆ แบบคร่าวๆ เลยนะครับ
    title : microsoft | cygwin | mingw | linux
    API : native win32api | POSIX layer | native win32api | POSIX
    C compiler : cl.exe | gcc | gcc | gcc
    linker : link.exe | ld | ld/windres | ld
    make system : gmake, nmake | make | mingw32-make | make
    shell : cmd.exe | bash cygwin-ported | msys bash | bash or other
    static lib: foo.lib , libfoo.a , libfoo.a , libfoo.a
    shared lib/dll : foo.dll ,foo.ocx | foo.dll | foo.dll | libfoo.so


    2. ว่าด้วยเรื่องการติดตั้ง library ใน windows นะครับ
    - run-time lib ( ซึ่งได้แก่เจ้าตัว foo.dll ทั้งหลายนั้น , ใน linux อาจเทียบกับ shared lib พวก foo.so ต่างๆ) อันนี้เกี่ยวกับ user โดยตรง เช่น ตัว dll ที่เป็น API พื้นฐานของ OS เช่น kernel32.dll user32.dll shell32.dll พวกนี้จะอยู่ที่ \windows\system หรือ windows\system32 ครับ สมมติว่าเรา run software ที่ link แบบ shared กับ foo.dll windows ก็จะเริ่มหา foo.dll จาก directory ที่ software ตัวนั้นติดตั้งอยู่ ถ้าไม่เจอก็ไปที่ \windows\system และ \windows\system32 ตามลำดับ ถ้าไม่เจออีกก็จะไปอ่านค่าจากตัวแปร PATH เป็นลำดับสุดท้าย( บน win9x ตัวแปร PATH ตั้งค่าจาก autoexec.bat , บน XP/2K น่าจะอยู่ใน registry นะครับ ) ดังนั้นหมายความว่า software ตัวใดก็ตามที่มีการ link กับ dll ของตัวเองนอกเหนือจากของ windows เอง ก็อาจติดตั้ง dll ของตัวเองลงใน install_dir ของมันเองหรือไม่ก็ \windows\system หรือ \windows\system32 หรือเอาไว้ตรงไหนก็ได้แล้วเพิ่มค่าในตัวแปร PATH เอา

    - development lib ( foo.lib สำหรับ msvc , libfoo.a สำหรับ cygwin/mingw ) กับ header นั้นผมว่ามันเป็นหน้าที่ของ programmer เองนะครับที่ จะต้อง include header-path หรือ lib-path เอาเอง แต่ก็ขึ้นกับ tools ที่ใช้ด้วยครับ บางคนใช้ commandline ก็เหนื่อยหน่อย ส่วนพวกสาวก IDE ก็สบายกว่าครับ

    ส่วนเรื่อง pkg-config นั้นก็มีใช้ใน windows แล้วครับ มีทั้งแบบ cygwin-ported และ mingw-ported (ตัว mingw-ported ใช้ร่วมกับ msvc ได้ครับ) คือขอแค่มีไฟล์ .pc อยู่ใน PKG_CONFIG_PATH ก็เป็นอันใช้งานได้ แต่ที่ต้องระวังคือการอ้างอิง path จะต่างกัน เช่น
    path ใน windows เป็น c:\libfoo\share\doc ใน cygwin จะเป็น /cygdrive/c/libfoo/share/doc ส่วนใน mingw เป็น c:\libfoo\share\doc หรือ c:/libfoo/share/doc หรือ /c/libfoo/share/doc

    สำหรับ libthai ซึ่ง port โดย mingw นั้น ตัว installer ยอมให้กำหนด install_dir ได้อยู่แล้ว ในมุมมองของ user ก็น่าจะแค่เพิ่ม PATH ของ install_dir\bin ลงไป( libthai-0.dll อยู่ใน bin ) โปรแกรมที่ link กับ libthai ก็น่าจะทำงานได้แล้ว ในส่วนของ programmer นั้นหากจะใช้ pkg-config ก็คงต้องแก้ prefix ใน .pc ให้เหมาะสมก่อน ส่วนพวกใช้ IDE นั้นคงไม่น่าห่วง

    โดยตัวของ lib ทั้ง foo.dll , libfoo.a ,foo.lib นั้นสามารถแปลงไปมาซึ่งกันและกันได้อยู่แล้ว ดังนั้นจะใช้ libthai mingw-ported หรือ msvc-ported ก็น่าจะไม่ต่างกันครับ คุณเทพอยากให้เพิ่ม .lib สำหรับ msvc ลงไปใน installer ด้วยมั้ยล่ะครับ ( ผมจะลองใช้ วิธี convert ดู เพราะใช้ msvc compile ใหม่ก็ไม่ถนัด )

    ผมว่าเราไม่น่าห่วง programmer ฝั่ง windows เกินไปนะครับ ( เดี๋ยวจะมีกรณีแบบ linus เหน็บ GNOME ว่า GNOME มักจะคิดว่าคนใช้ GNOME ทำอะไรไม่ค่อยเป็น ผลลัพธ์คือ UI ของ GNOME เลยเห่ย อ้ะ... ล้อเล่น ) สมมติฐานของผมคือ porgrammer มัมต้องรู้เรื่องพวกนี้อยู่แล้ว เป็นความเห็นส่วนตัวครับนะครับ ยังไงก็แล้วแต่คนกำหนดทิศทางก็ต้องคุณเทพแหละครับ ท่านว่าไงผมว่างั้น (เชื่อผู้นำชาติพ้นภัย ;).. )

     
  • 17 มีนาคม 2550 21:24 , Blogger Thep แถลง…

    โอ้.. ตอบละเอียดยิบเกินคำถามเลยครับ ขอบคุณมาก

    สำหรับคนที่มาอ่าน blog แล้วงง คำถามผมอยู่ที่ อีก blog หนึ่ง นะครับ

    ว่าแต่ว่า เราคุยกันทาง mail จะดีกว่าโพสต์ใน blog อย่างนี้ไหม? ตอบผมได้ที่ thep ณ linux thai net นะครับ

    เรื่องของ mingw/cygwin นั้น พอจะรู้อยู่บ้างครับ เคยใช้ในเครื่องคนอื่นมาแล้ว

    แต่ที่ถามเกี่ยวกับวิธีติดตั้ง library นั้น ก็เพื่อจะทำให้ถูกต้องตามหลักการ (ถ้ามี) น่ะครับ อย่างใน GNU/Linux เรามีตำแหน่งแห่งที่ให้ชัดเจนสำหรับไฟล์ต่าง ๆ ก็ไม่มีปัญหาอะไร แต่ของ Windows ดูมันไม่ชัดเจน ก็ต้องพยายามเลือกวิธีการที่มีเหตุมีผลมากที่สุด

    โดยเฉพาะ ถ้าจะใช้ libthai กับ free software อื่น ๆ ที่ระบบ build ค่อนข้างอัตโนมัติ ตัวอย่างที่คงเห็นได้คือ mozilla นี่แหละครับ (รวมทั้งโปรแกรมทั้งหลายที่ใช้ GNU autotools) มันจะมีขั้นตอน configure ที่ detect หาไลบรารีต่าง ๆ ในระบบ ถ้าเราเอาไฟล์ของเราไปหย่อนให้ถูกที่ ก็จะทำให้ระบบ build ไม่ติดขัดนะครับ

    เรื่องนี้ไม่ใช่คิดว่าโปรแกรมเมอร์ทำอะไรไม่เป็น แต่มันเป็นธรรมเนียมนิยมของโปรแกรมเมอร์ GNU ที่อะไร ๆ ค่อนข้างมีหลักการกว่า Windows น่ะครับ

     
  • 18 มีนาคม 2550 15:56 , Blogger NOI แถลง…

    อยากให้ Linux ทุก distro. มีความสามารถแก้ไขตัวที่พิมพ์ผิดเพราะลืมสลับคีย์บอร์ดด้วยครับ เช่นจะพิมพ์ภาษาไทย แต่ดันลืมพิมพ์ไปแล้วเป็นตัวอังกฤษ ก็ให้กด Ctrl + Back space เพื่อแก้ไขตัวอังกฤษนั้นกลับมาเป็นภาษาไทยครับ :)

     

แสดงความเห็น (มีการกลั่นกรองสำหรับ blog ที่เก่ากว่า 14 วัน)

<< กลับหน้าแรก

hacker emblem