ผู้สนับสนุน

วันพฤหัสบดีที่ ๒๔ ธันวาคม พ.ศ. ๒๕๕๒

ไปถ่ายโฆษณากับ google มา

ยังไม่เขียน blog เกียวกับเรื่องไปถ่ายโฆษณามาเลยแต่ถ่ายมานานแล้วแหละ

อันนี้เบื้องหน้าครับ



อันนี้เบื้องหลัง



เบื้องหน้าแอบติดอยู่นิดนึงหุหุ 1:31, คนที่เห็นหน้าคนที่ 3 จากซ้าย

วันอังคารที่ ๒๒ ธันวาคม พ.ศ. ๒๕๕๒

Use google docs as blog editor(เขียน blog ด้วย Google docs)









เข้าไปที่  docs.google.com/ แล้วเริ่มสร้างเอกสารจากเมนู สร้างเอกสารใหม่แล้วตั้งชื่อ(ชื่อจะไปเป็นชื่อ blog ด้วย)



ใส่ image หรือตารางได้ด้วยรวมถึงพิมพ์พวก  code html ในนี้ก็จะง่ายกว่าเยอะเลย ^^

สร้างตารางขึ้นมา ขนาด 1 ช่อง แล้วก็จะได้ block code มาแล้ว

<html>
   <head><title>Test Google docs block code</title></head>
  <body>
   <h1>It work!</h1>
  </body>
</html>
โดยอาจจะเปลี่ยน font ของใน table เป็นพวกขนาดตัวอักษรคงที่ (Courier new) เพื่อความสวยงาม

















และก็ post ขึ้น blog ด้วยเมนูทางขวา Share, Publish as web page.. 

และมันจะมี เมนู post to blog ซึ่งเราจะต้อง set up  ก่อน เท่านี้ก็เขียน  blog ง่ายขึ้นด้วย google docs แล้ว

วันอังคารที่ ๒๔ พฤศจิกายน พ.ศ. ๒๕๕๒

Build ChromeOS

THIS PAGE IS DEPRECATED ใช้ไม่ได้แล้วครับ

ดูต่อที่นี่แทน
ที่มา chromium.org/ แล้วก็เอามาย่อ
Prerequire
- Host Ubuntu karmic
- sudo apt-get install git-core
1. get source tarball
wget http://build.chromium.org/buildbot/archives/chromiumos-0.4.22.8.tar.gz tar xvfz chromiumos-0.4.22.8.tar.gz mv chromiumos-0.4.22.8 chromiumos cd chromiumos gclient config http://src.chromium.org/git/chromiumos.git
gclient sync
2. make local repo
cd chromiumos/src/scripts
./make_local_repo.sh
wait for download....
3. make chroot
./make_chroot.sh
4. Download Chromium(browser) tarball
mkdir -p ../build/x86/local_assets
cd ../build/x86/local_assets
wget http://build.chromium.org/buildbot/archives/chromium-chromiumos-r32516.zip
mv chromium-chromiumos-r32516.zip chrome-chromiumos.zip
cd -
(ลอง check link บนเว็บด้วย)
5. enter chroot
./enter_chroot.sh
6. enable a local user account (ยังไม่รู้เลยเอาไว้ทำไร)
( cd ../platform/pam_google && ./enable_localaccount.sh USERNAME )
7. Set shared user password
./set_shared_user_password.sh
(กรอก password แล้วมันจะถูกเข้ารหัสเก็บไว้ที่ ./shared_user_password.txt)
8. Build packages/image
./build_platform_packages.sh ./build_kernel.sh
./build_image.sh
exit image ที่ได้จะมีทั้ง mbr.image(master boot record), rootfs.image อยู่ใน chromiumos/src/build/images/999~~/ 9. Add Droidsans-th fonts, Add keyboard switching key (via http://forum.ubuntuclub.com/forum/topic,12115.0.html)
cd chromiumos/src/build/images/999~~/
sudo mount -o loop rootfs.image rootfs
mkdir droidsans-th
cd droidsans-th/
unzip DroidSansWithThaiFontsv1.zip
sudo cp fonts/* ../rootfs/usr/share/fonts/truetype/ttf-droid/
9.2 add keyboard switch
edit(vi,nano,gedit) ../rootfs/etc/X11/xorg.conf
add to Bold lines
---------------------
Section "InputDevice" Identifier "Keyboard1" Driver "kbd" Option "AutoRepeat" "250 30" Option "XkbRules" "xorg" Option "XkbModel" "pc104" Option "XkbLayout" "us,th" Option "XkbOptions" "grp:alt_shift_toggle,grp_led:scroll" Option "CoreKeyboard" EndSection
----------------------
cd ..
sudo umount rootfs
10. Copy the image to a USB(this can use to install) or VMWare
USB
cd chromiumos/src/scripts/ ./image_to_usb.sh --from=~/chromiumos/src/build/images/SUBDIR --to=/dev/sdc VMWare
./image_to_vmware.sh --from=~/chromiumos/src/build/images/SUBDIR --to=~/chromiumos/src/build/images/SUBDIR/ide.vmdk

วันศุกร์ที่ ๓๐ ตุลาคม พ.ศ. ๒๕๕๒

Chromium 4 review บ้านๆ

feature ใหม่ 
1. Pin tab/ตรึงแท็ ประหยัดที่ + กันปิดพลาด

2. Extension ตอนนี้มี menu ให้เลือกดูแล้ว
3. bookmark synchronization (มีเมนูให้เห็นแล้ว แต่ยังไม่น่าใช้)
4. Native Client ถูก build in มาแล้วแต่ถูกปิดไว้เป็นค่าปริยาย (อยากลองต้องเปิดเอง)
5. Bookmark all tab << ส่วนตัวคิดว่ามันทำมาเพื่อทดสอบ sync bookmark
6. Bookmark และ Master password ถูกรวมเป็นเรื่องเดียวกัน (คือน่าจะเป็น เรื่องใช้ account เดียวเก็บทุกอย่าง)
7. fix บัคมากมาย และเพิ่มความเร็ว
  1. ภาษาไทยบน Linux พิมพ์ได้แล้ว
  2. "ปิดไฟล์" --> "เลือกไฟล์"

คาดว่ากว่าจะออกคงจะได้เห็นอะไรอีกเยอะ อันนี้เอาแค่ที่เห็นได้ง่ายๆ และไปเห็นมา

Chromium บน linux แสดงผลภาษาไทยได้แล้ว แล้วก็พิมพ์ไทยได้แล้วด้วย

Update!! พิมพ์ ไทยได้แล้วจ้าาา 4.0.229.0 (30549) 16279
เก่าๆ เอามาอัพเดตอีกรอบ
1. Chrome บน windows พิมพ์ไทยได้แล้วนะจ๊ะ issue 3523
2. ปุ่ม Choose file ของ Chrome เปลี่ยนเป็นคนว่า "เลือกไฟล์" แล้ว เดิมเป็นคำว่า "ปิดไฟล์" issue 1759

-----
หลังจากออกมาได้ซักพักแล้ว สำหรับ Chrome บน Linux และ Mac แต่ว่ายังมีปัญหาอยู่ที่ ไม่สามารถแสดงผลภาษาไทยได้ ซึ่งตอนนี้ปัญหานี้ได้รับการแก้ไขเป็นที่เรียบร้อยแล้ว [รุ่นที่ทดสอบ 3.0.193.0 (20219) ] สามารถโหลดมาลองได้จาก ที่นี่สำหรับ Linux และ ที่นี่สำหรับ Mac(ผมไม่ได้ทดสอบ)  สำหรับรุ่น Beta ที่เป็น Google Chrome คงจะออกตามมาเร็วๆ นี้

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


Compile Chrome บน windows

Update!! อาจจะใช้ไม่ได้แล้ว ที่มา

Android source ๔

ต่อจาก ตอนที่แล้ว [เนื่องจากงง ทำหลายข้อต่อไปไม่ได้ เลยขอข้ามเลย]
ตอนที่แล้วถึงช่วงเพิ่ม memory ให้ eclipse

เมื่อคุณต้องการ sync โปรเจค
ซึ่งกรณีที่จะต้องทำได้แก่ตอนที่คุณใช้ repo sync หรืออื่นๆ เช่น เปลี่ยนแปลงไฟล์ จากนอก eclipse (เช่นไฟล์ .classpath) ดังนั้นคุณต้อง refresh eclipse

  1. Window > show view > navigator
  2. แล้วก็ไปที่ navigator tab > คลิ๊กขวาที่โปรเจค("mydroid" หรืออะไรก็ตามที่คุณตั้งชื่อมัน)
  3. คลิ๊กที่ refresh

Adding apps to the build path
[ไม่ค่อยเข้าใจข้าม... -_-]
Eclipse setup to work on developer tools
[ไม่ค่อยเข้าใจข้าม... -_-]
Eclipse setup to work on DDMS
[ไม่ค่อยเข้าใจข้าม... -_-]

จัด Format ให้ eclipse
  1. คลิ๊กที่ project ของท่าน ("mydroid" หรืออะไรก็ตามที่คุณตั้งชื่อ)
  2. Project>properties
  3. เมนูทางซ้าย Java code style > Formatter
  4. Enable project specific setthings > import
  5. เลือกไฟล์ android-formatting.xml จาก development/ide/eclipse
    [ต้นฉบับบอกว่าให้เพิ่ม
    android.importorder ด้วยแต่ผมหาไม่เจอ]
  6. เลือก Active profile ให้เป็น Android แล้วก็กด OK

Debug emulator ด้วย eclipse
    คุณสามารถที่จะใช้ eclipse ในการ debug emulator ได้ แล้วก็ step ตามการทำงานของ code ได้
[อันนี้ไม่เข้าใจว่า eclipse ได้ไงนะ เพราะต้องเปิด terminal ขึ้นมาเพื่อรัน emu]

cd myandroid/
. build/envsetup.sh
lunch 1 #เพื่อสร้าง emulator
make #ในกรณีที่คุณยังไม่ได้ทำขั้นนี้ ถ้าทำแล้วก็อย่าทำอีกนะมันนาน
emulator #รัน emulator ขึ้นมา ซักพักคุณจะเห็นเครื่อง android emu gui [กด num lock แล้วกด 7 ,9 เพื่อตะแคงมันเล่น]

เปิด terminal อีกอันขึ้นมา แล้วเปิด DDMS ( Dalvik debug manager)

cd myandroid/
. build/envsetup.sh
ddms #เพื่อสร้าง emulator

จะมี console อะไรที่อ่านไม่ค่อยรู้เรื่องขึ้นมา(เป็น gui)

แล้วก็ไปที่ eclipse
  1. เปิด run > debug configurations
  2. คลิ๊กขวาที่ Remote Java Application
  3. ตั้งชื่อให้มัน เช่น android-debug
  4. ตั้งชื่อโปรเจค (ตามปกติมันมันจะมีชื่อโปรเจคเดิมเรามาให้อยู่แล้ว)
  5. เปลี่ยน port เป็น 8700
  6. กด Debug
ปล1. [16:20]ของผมมัน Error อีกแล้ว T^T
ปล2. [16:21]เหตุน่าจะมาจาก เคยลง sdk มาก่อนใน eclipse มาก่อนเพราะฉะนั้นเอามันออกไปซะ
ปล3. [16:36]แต่ก็ยังไม่ได้อยู่ดีเศร้าหว่ะ T^T ใช้แบบบน shell แหละดีแล้ว

port  8700 จะเชื่อมต่อกับ process อะไรก็ตามที่ถูกเลือกอยู่ใน console ของ DDMS ดังนั้นคุณควรจะดูให้ดีว่า DDMS เลือก process ถูกต้องหรือเปล่า[process ที่คุณจะ debug]


คุณอาจต้องการเปิด Debug perspective (Window > Open perspective > Other , Debug > OK) แล้วก็เลือกสลับระหว่าง java กับ debug ได้ที่มุมขวา ของ eclipse ส่วนใช้ยังไงใช้ไม่เป็นอ่ะยัง connect ไม่ได้ (-_-) [ต้นฉบับมีบอก]


เพิ่ม plug in 

eclipse มีระบบ plugin  ที่จะสามารถให้ผู้อื่นสามารถเพิ่มความสามารถให้ IDE ได้ และนี่คือ plugin บางตัวที่ทำให้ eclipse ใช้ง่ายขึ้นเพื่อเขียน android

  • AnyEdit เครื่องมือสำหรับ ฟิกเรื่อง whitespace เมื่อบันทึกไฟล์ คือจะเปลี่ยน tab เป็น space ตัด space หลังบรรทัด และใส่ end-of-line ที่ท้ายไฟล์ [มันต้องเป็น eof end-of-file หรือเปล่าฟระ]

Eclipse มันง๊องแง้ง ทำไงอ่ะ

ดูอีกทีให้ดีว่า:

  • ทำตาม step ถูกต้องหรือเปล่า
  • Your Problems view doesn't show any errors.
  • Your application respects the package/directory structure.

ถ้ายังไม่ได้อีกติดต่อ contact list ของ android หรือไม่ก็ที่ช่อง irc (freenode.net #android) (เคยติดต่อมารอบแล้ว)


Android NDK(เขียนเล่นๆ)

Android NDK

• จำเป็นต้องมี SDK 1.5
• บน windows จำเป็นต้องลง http://www.cygwin.com/ (จะมี  gmake และ gcc มาให้)
• ทำให้เขียน c/c++ เพื่อรันบน android ได้
• native code จะถูกเรียกใช้ผ่าน JNI
• เขียนไม่ดีจะกลายเป็นว่าซับซ้อนกว่าเดิมโดยใช่เหตุเพราะว่ามันต้องรันบน dalvik VM อีกชั้นอยู่แล้ว
• ในอนาคต code ของ native อาจจะใช้ไม่ได้บ้างบางส่วนเพราะว่ามันมียังมีการปรับอยู่เรื่อยๆ
• ต้องเขียน android.mk และ application.mk เองด้วย
• c++ ใช้ .cpp เป็นพื้นฐาน สามารถ config ให้รับ .cxx อื่นๆ ได้
• ประกอบด้วย
    ∘ cross-toolchains  ( compilers, linker, etc) ที่สามารถสร้าง native ARM binaries บน Linux, OSX, Windows(ที่มี Cygwin)


NDK แบบคร่าวๆ
หลังจากโหลด ndk มาและแตกไฟล์ออกมาจะมีโครงสร้าง dir ดังนี้

code c/c++ จะเขียนใน dir sources/ และเมื่อ compile แล้วจะได้ผลออกมาที่ dir out/ และ apps/
โดย
  • code ที่เขียนออกมาจะไม่ได้กลายเป็น app โดยตรง
  • เมื่อ compile แล้วมันจะสร้าง lib native ให้อยู่ใน apps/
  • เรียกผ่าน JNI ของ android อีกทีหนึ่ง 

    จากรูป libs/armeabi/lib[name].so เป็นสิ่งที่เมื่อ compile code c/c++ แล้ว NDK จะสร้างให้ และ dir อื่นๆ  src/, assets/ , res/ , bin/, gen/ เป็นสิ่งที่ต้องสร้างขึ้นมาโดยเป็น project android ทั่วไปโดยจะเรียกใช้ native c/c++ ผ่านทาง lib เท่านั้น
    โดยที่เราจะต้องเขียน Application.mk (makefile) และ AndroidManifest.xml เพิ่มเติมเองเพื่อให้มันเรียกใช้ได้


    sources/ จะมี Android.mk ที่เป็นตัวกำหนดว่าต้อง build หรือ compile ไฟล์ใด dir ใดบ้าง เพราะฉะนั้นมันจะมีอยู่แทบทุก subdir
สำหรับ code ของ c/c++ ที่เขียนใน sources จะมีลักษณะที่ทำไว้ให้  jni เรียกได้ด้วย แล้วไฟล์ที่ว่านั้นอาจจะไปเรียก code c อื่นๆ ก็ได้
** second.c **
#include "first.h" // เรียกใช้ func อื่น
#include <jni.h> // เรียก jni

jint
Java_com_example_twolibs_TwoLibs_add( JNIEnv*  env, // Java_com_example_twolibs_TwoLibs_ < คือชื่อ pkg และ class, add คือชื่อ method
                                      jobject  this,
                                      jint     x,
                                      jint     y ) // argument พื้นฐานคือ JNIEnv*  env,jobject  this argument เพิ่มเติมคือ jint x, jint y
{
    return first(x, y);    // เรียกใช้ function จากไฟล์อื่น (first.c)
}

** first.c **
#include "first.h"

int  first(int  x, int  y)
{
    return x + y;
}

** first.h **
#ifndef FIRST_H
#define FIRST_H

extern int first(int  x, int  y);

#endif /* FIRST_H */
หมายเหตุ  Java_com_example_twolibs_TwoLibs_add <<คือ JNI นี่เอง

และจะเรียกใช้ผ่าน JNI ได้ในลักษณะนี้
package com.example.twolibs;

import ...


public class TwoLibs extends Activity
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        /* do something */
        int       x  = 1000;
        int       y  = 42;
        // dynamically load the library at runtime
        // before calling the native method.
        System.loadLibrary("twolib-second");
        int  z = add(x, y);

        /* show z output */
    }

    public native int add(int  x, int  y);
}

STABLE lib ที่สามารถเรียกใช้ได้
C standard, <stdlib.h>, <stdio.h>, etc...  และ <pthread.h><math.h>
C++ <cstddef>   <new>   <utility>   <stl_pair.h>

C lib เฉพาะของ android <android/log.h>

Zip
<zlib.h> <zconf.h>
เริ่มใช้ android NDK
1. ตรวจสอบ system requirement
  • SDK 1.5
  • GNU Make 3.81 ขึ้นไป ทดสอบโดยการ พิมพ์ make -v
2. Download NDK แล้วทำการรัน setup script
    build/host-setup.sh
3. เขียน source แล้วเก็บไว้ที่ source/<mysrc>/...
4. เขียน sources/<mysrc>/Android.mk เพื่ออธิบาย source code ให้ NDK build ได้ถูกต้อง
    - เขียน source code
5. เขียน apps/<myapp>/Application.mk เพื่ออธิบายโปรแกรม และ native code มันจำเป็นต้องใช้กับ  NDK build system
   - เขียน app ที่เรียก native code
6. Build Native code ด้วย คำสั่ง make APP=<myapp> ที่ root dir ของ NDK
7. Generate .apk ด้วย Eclipse
Configurating the NDK





วันจันทร์ที่ ๒๘ กันยายน พ.ศ. ๒๕๕๒

git สำหรับผู้เริ่มต้น(หรือเปล่า?)

อันนี้ผมลองมั่วๆ ทำใช้เองนะ

สร้าง

สร้าง git repository
cd root/of/project
git init-db
เพิ่มเข้า repository

เข้าไปที่ root directory ของ project แล้วรันคำสั่ง

git add .
git commit -a
แสดงความแตกต่างกับ code ก่อนหน้านี้

เช่นเมื่อมีการแก้ไข อะไรไปบางอย่างใน project แล้วอยากเทียบตอนนี้กับการ commit ครั้งล่าสุด

cd root/of/git
git diff
แสดงว่ามีใครแก้ไขอะไรเมื่อไหร่บ้าง
git log

จะแสดงว่ามีการแก้ไขโดยใคร , เมื่อไหร่ และแสดง comment ที่เขียนไว้

ตย. ผลการ git

commit 1cca3256fe2f37338c65aa5df43ed65ccad720b0
Author: Sutean <mossila@localhost.(none)>
Date: Fri Sep 25 16:33:55 2009 +0700

Change text in helloworld

commit 05b9a561259bfbbcf5184be0d0bfa293d804adcc
Author: momo <momo@
localhost.(none)>
Date: Fri Sep 25 12:05:35 2009 +0700

remove while(1) in helloworld

commit 27b96f3b59ebf663d379249b1c853d1ba8490117
Author: momo <momo@
localhost.(none)>
Date: Fri Sep 25 11:58:23 2009 +0700

Init git

Branch

การทำสำเนา source code แยกออกมาจะ code หลัก(master) และเมื่อแก้ไขเสร็จค่อยนำมารวมกันอีกครั้ง(merge)

ตัวอย่างการทำ branch ตั้งแต่เริ่ม project

สร้าง project สำหรับ git

mkdir exam
cd exam
git init-db
cat > hellomaster.c
#include <stdio.h>
int main () {
printf ("Hello master plant.\n");
}
<กด ctrl+d>
git add .
git commit -a -m "Init"

สร้าง branch

ใช้ git branch

ตรวจสอบว่ามี branch อะไรอยู่บ้าง ผลในตอนแรกขณะยังไม่ได้สร้าง branch อะไรเลยจะเป็นแบบนี้

$ git branch
* master


สร้าง branch ด้วยคำสั่ง

$ git branch <ชื่อ branch>
$ git branch hello
$ git brachh
hello
* master
$
ใช้ git checkout

เราสามารถ สร้าง branch และ switch ไปทันทีได้ด้วยคำสั่ง

git branch -b <ชื่อ branch ใหม่>
$ git branch -b hellogit
$ git status
# On branch hellogit
nothing to commit (working directory clean)
$ git branch
hello
* hellogit
master

เปลี่ยน branch

เปลี่ยน branch ด้วยคำสั่ง checkout. เมื่อมีการเปลี่ยน branch ใหม่ครั้งแรกจะมี code เหมือนเดิมทุกประการ

$ git checkout hello
$ git status
# On branch hello
nothing to commit (working directory clean)
$ ls
hello.c

git status ที่ต่อจากบรรทัด git checkout คือการแสดงว่าเราอยู่ที่ branch ไหนในที่นี้คือ branch hello. เมื่อเราลอง ls ดูจะเห็นว่ามี hello.c ของเดิมอยู่ด้วย

ลองแก้ไขใน branch นี้

$ rm hello.c
$ git commit -a -m "remove hello from master"
Created commit 3288d10: delete hello.c of master
1 files changed, 0 insertions(+), 6 deletions(-)
delete mode 100644 hello.c
$ ls
$

ลองลบ hello.c ของ master ทิ้งเลย, แล้วค่อยลอง switch กลับไปที่ master

$ git checkout master
Switched to branch "master"
$ ls
hello.c
$

จะเห็นว่า hello.c ของ master ยังอยู่ :)

revert version of file

เรียกคืนไำฟล์ version ก่อนหน้า

git checkout master~2 <filename>

เรียกไฟล์ของ branch master เมื่อ 2 รุ่นก่อนกลับมา

และในอีกกรณีคือการลบไฟล์ผิด(ยังไม่ได้ commit) สามารถเรียกกลับมาได้แบบนี้

git checkout <filename>

หรือหลายไฟล์ด้วย

git checkout *

วันพฤหัสบดีที่ ๑๐ กันยายน พ.ศ. ๒๕๕๒

Complement join(Outer join) ของ MySql

อยากทำ complement join(outer join) แล้วทำไม่ได้เลยมึนไปพักแล้วก็ได้แบบนี้มา
foo
idfoo_value
210
310

bar
idbar_value
21
31
41
51

จะเอาข้อมูลจาก bar มาแค่นี้ได้อย่างไร
idbar_value
41
51

ทำแบบนี้

SELECT * FROM `bar` WHERE `bar`.`id` NOT IN (SELECT `foo`.`id` FROM `foo`);

ปล. คำสั่งสร้างตาราง foo, bar
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

CREATE TABLE IF NOT EXISTS `foo` (
  `id` int(11) NOT NULL,
  `foo_value` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO `foo` (`id`, `foo_value`) VALUES
(2, 10),
(3, 10);

CREATE TABLE IF NOT EXISTS `bar` (
  `id` int(11) NOT NULL,
  `bar_value` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO `bar` (`id`, `bar_value`) VALUES
(2, 1),
(3, 1),
(4, 1),
(5, 1);


วันพุธที่ ๙ กันยายน พ.ศ. ๒๕๕๒

เอา ubuntu-desktop ออกอย่างสมบูรณ์

หลังจาก ลอง apt-get remove ubuntu-desktop แล้วไม่ได้ผลก็ไปเจอ 
http://psychocats.net/ubuntu/purekde คำสั่งเทพที่เอา pkg ubuntu-desktop ออกทั้งยวง แบบว่า... ยาวคอดๆ เลยแหละเมื่อเอามาแปะ

sudo apt-get remove alacarte app-install-data-partner apport-gtk apturl at-spi binfmt-support bluez-gnome brasero brltty-x11 capplets-data checkbox checkbox-gtk cli-common compiz compiz-core compiz-fusion-plugins-extra compiz-fusion-plugins-main compiz-gnome compiz-plugins compizconfig-backend-gconf computer-janitor computer-janitor-gtk contact-lookup-applet dcraw desktop-file-utils dmz-cursor-theme doc-base docbook-xml ekiga eog esound-clients esound-common espeak espeak-data evince evolution evolution-common evolution-data-server evolution-data-server-common evolution-exchange evolution-indicator evolution-plugins evolution-webcal example-content f-spot fast-user-switch-applet file-roller firefox firefox-3.0 firefox-3.0-branding firefox-3.0-gnome-support firefox-gnome-support gamin gcalctool gconf-editor gconf2 gconf2-common gdebi gdm gdm-guest-session gedit gedit-common ggzcore-bin gimp gimp-data gksu gnome-about gnome-accessibility-themes gnome-app-install gnome-applets gnome-applets-data gnome-cards-data gnome-codec-install gnome-control-center gnome-desktop-data gnome-doc-utils gnome-games gnome-games-data gnome-icon-theme gnome-keyring gnome-mag gnome-media gnome-media-common gnome-menus gnome-mime-data gnome-mount gnome-nettool gnome-orca gnome-panel gnome-panel-data gnome-pilot gnome-pilot-conduits gnome-power-manager gnome-screensaver gnome-session gnome-session-canberra gnome-settings-daemon gnome-system-monitor gnome-system-tools gnome-terminal gnome-terminal-data gnome-themes-selected gnome-themes-ubuntu gnome-user-guide gnome-utils gstreamer0.10-alsa gstreamer0.10-gnomevfs gstreamer0.10-plugins-base gstreamer0.10-plugins-base-apps gstreamer0.10-plugins-good gstreamer0.10-pulseaudio gstreamer0.10-schroedinger gstreamer0.10-tools gstreamer0.10-x gtk2-engines gtk2-engines-murrine gtk2-engines-pixbuf gucharmap guile-1.8-libs gvfs gvfs-backends gvfs-bin gvfs-fuse human-icon-theme human-theme indicator-applet indicator-messages jockey-gtk language-selector libart2.24-cil libasound2-plugins libatspi1.0-0 libaudiofile0 libavahi-glib1 libavahi-gobject0 libavahi-ui0 libavc1394-0 libbabl-0.0-0 libbeagle1 libbonobo2-0 libbonobo2-common libbonoboui2-0 libbonoboui2-common libbrasero-media0 libcairo-perl libcairomm-1.0-1 libcamel1.2-14 libcanberra-gtk-module libcanberra-gtk0 libcanberra0 libcdio-cdda0 libcdio-paranoia0 libcdio7 libcompizconfig0 libcroco3 libcryptui0 libdecoration0 libdmx1 libdv4 libebackend1.2-0 libebook1.2-9 libecal1.2-7 libedata-book1.2-2 libedata-cal1.2-6 libedataserver1.2-11 libedataserverui1.2-8 libegroupwise1.2-13 libesd-alsa0 libespeak1 libevdocument1 libevview1 libexchange-storage1.2-3 libexempi3 libflickrnet2.1.5-cil libfreezethaw-perl libgadu3 libgail-common libgail-gnome-module libgail18 libgamin0 libgconf2-4 libgconf2.24-cil libgcr0 libgdata-google1.2-1 libgdata1.2-1 libgdict-1.0-6 libgdiplus libgegl-0.0-0 libggz2 libggzcore9 libggzmod4 libgimp2.0 libgksu2-0 libglade2-0 libglade2.0-cil libglew1.5 libglib-perl libglib2.0-cil libglibmm-2.4-1c2a libglitz-glx1 libglitz1 libgmime-2.0-2a libgmime2.2a-cil libgnome-desktop-2-11 libgnome-keyring0 libgnome-keyring1.0-cil libgnome-mag2 libgnome-media0 libgnome-menu2 libgnome-pilot2 libgnome-speech7 libgnome-vfs2.24-cil libgnome-window-settings1 libgnome2-0 libgnome2-canvas-perl libgnome2-common libgnome2-perl libgnome2-vfs-perl libgnome2.24-cil libgnomecanvas2-0 libgnomecanvas2-common libgnomecups1.0-1 libgnomekbd-common libgnomekbd3 libgnomekbdui3 libgnomepanel2.24-cil libgnomeprint2.2-0 libgnomeprint2.2-data libgnomeprintui2.2-0 libgnomeprintui2.2-common libgnomeui-0 libgnomeui-common libgnomevfs2-0 libgnomevfs2-bin libgnomevfs2-common libgnomevfs2-extra libgp11-0 libgpod-common libgpod4 libgsf-1-114 libgsf-1-common libgsm1 libgtk-vnc-1.0-0 libgtk2-perl libgtk2.0-cil libgtkhtml-editor-common libgtkhtml-editor0 libgtkhtml2-0 libgtkhtml3.14-19 libgtkmm-2.4-1c2a libgtksourceview-common libgtksourceview1.0-0 libgtksourceview2.0-0 libgtksourceview2.0-common libgtkspell0 libgtop2-7 libgtop2-common libgucharmap7 libgvfscommon0 libgweather-common libgweather1 libhesiod0 libidl0 libiec61883-0 libindicate1 libjpeg-progs libkpathsea4 liblaunchpad-integration1 liblircclient0 liblpint-bonobo0 libmbca0 libmetacity0 libmldbm-perl libmono-addins-gui0.2-cil libmono-addins0.2-cil libmono-cairo2.0-cil libmono-corlib2.0-cil libmono-data-tds2.0-cil libmono-data2.0-cil libmono-getoptions2.0-cil libmono-i18n2.0-cil libmono-posix2.0-cil libmono-security2.0-cil libmono-sharpzip2.84-cil libmono-sqlite2.0-cil libmono-system-data2.0-cil libmono-system-web2.0-cil libmono-system2.0-cil libmono0 libmono2.0-cil libnautilus-burn4 libnautilus-extension1 libndesk-dbus-glib1.0-cil libndesk-dbus1.0-cil libnet-dbus-perl libnotify1 liboil0.3 liboobs-1-4 libopal3.6.1 liborbit2 libpam-gnome-keyring libpanel-applet2-0 libpangomm-1.4-1 libpisock9 libpisync1 libpolkit-gnome0 libpoppler-glib4 libportaudio2 libprotobuf3 libproxy0 libpt2.6.1 libpt2.6.1-plugins-alsa libpt2.6.1-plugins-v4l2 libpulse-browse0 libpulsecore9 libpurple-bin libpurple0 librarian0 librsvg2-2 librsvg2-common libschroedinger-1.0-0 libscim8c2a libsexy2 libsgutils1 libshout3 libsilc-1.1-2 libsndfile1 libsoup-gnome2.4-1 libsoup2.4-1 libspeexdsp1 libsqlite0 libstartup-notification0 libtdb1 libtie-ixhash-perl libtotem-plparser12 libtrackerclient0 libunique-1.0-0 libuuid-perl libv4l-0 libvisual-0.4-0 libvisual-0.4-plugins libvte-common libvte9 libwmf0.2-7-gtk libwnck-common libwnck22 libxml-twig-perl libxml-xpath-perl libxres1 libzephyr3 metacity metacity-common mobile-broadband-provider-info mono-2.0-gac mono-2.0-runtime mono-common mono-gac mono-jit mono-runtime mousetweaks mtools nautilus nautilus-data nautilus-sendto nautilus-share network-manager-gnome notification-daemon notify-osd onboard openoffice.org-gnome openoffice.org-gtk pidgin pidgin-data pidgin-libnotify pidgin-otr pkg-config policykit-gnome pulseaudio pulseaudio-esound-compat pulseaudio-module-gconf pulseaudio-module-hal pulseaudio-module-x11 pulseaudio-utils python-brlapi python-cairo python-fstab python-gconf python-gdata python-glade2 python-gmenu python-gnome2 python-gnome2-desktop python-gnomecanvas python-gst0.10 python-gtk2 python-gtkhtml2 python-gtksourceview2 python-launchpad-integration python-notify python-pkg-resources python-pyatspi python-pyorbit python-rdflib python-sexy python-virtkey python-vte rarian-compat rhythmbox rss-glx scim scim-bridge-agent scim-bridge-client-gtk scim-gtk2-immodule scim-modules-socket screen-resolution-extra screensaver-default-images seahorse seahorse-plugins sg3-utils sgml-data software-properties-gtk ssh-askpass-gnome synaptic syslinux system-config-printer-gnome system-tools-backends tangerine-icon-theme tomboy totem totem-common totem-gstreamer totem-mozilla totem-plugins transmission-common transmission-gtk tsclient ubufox ubuntu-artwork ubuntu-desktop ubuntu-docs ubuntu-gdm-themes ubuntu-sounds ubuntu-system-service ubuntu-wallpapers update-manager update-notifier usb-creator usplash-theme-ubuntu vinagre vino whois xbitmaps xdg-user-dirs-gtk xsane xsane-common xscreensaver xscreensaver-data xscreensaver-gl xsltproc xterm xulrunner-1.9 xulrunner-1.9-gnome-support yelp zenity && sudo apt-get autoremove && sudo apt-get autoclean

อันหลังสองอันนี้ใครจะไ่ม่ใส่ก็ได้นะ แต่ถ้าใส่จะเกลี้ยงมาก

วันอังคารที่ ๘ กันยายน พ.ศ. ๒๕๕๒

find replace text หลายไฟล์หลาย directory

#! /usr/bin/sh
for file in `find . -type f`
do sed -i 's/เก่า/ใหม่/g' $file
done


http://forums.devshed.com/unix-help-35/how-to-use-sed-to-search-replace-files-throughout-a-184662.html

แล้วจทำให้มัน print ผล หรือ print เพื่อ confirm ก่อนไงอ่าาาาา TT^TT

วันจันทร์ที่ ๗ กันยายน พ.ศ. ๒๕๕๒

ติดตั้ง codigniter

บน windows
1. download จาก http://codeigniter.com/download.php
2. ติดตั้ง appserv
3. เอาไฟล์ zip ที่โหลดมาแตกไปไว้ที่ที่ install appserv (โดยทั่วไปเป็น C:\appserv\www\)
4. เปลี่ยนชื่อ dir Codeigniter/ >> myproject/ อะไรทำนองนี้ 
5. เปิดไฟล์ system/application/config/config.php แก้ base_url เป็น http://localhost/myproject/

ปล. ที่เหลือลองดูตาม video Hello-form-~~.avi http://dl.getdropbox.com/u/599479/Videos/code.rar

บน linux 
1-2. คล้ายๆ กันกับ windows แตกต่างกันไปแต่ละ dist
3. แตกไฟล์ไว้ที่ /var/www หรือ public_html
4. เหมือน windows
5. เหมือน windows ; อาจจะเป็นประมา๊ณว่า http://hostname.domain.com/~username/myproject, หรือ http://name.domain.com/myproject, http://domain.com/ , ... แล้วแต่คนจะตั้งแล้วแหละ

วันอังคารที่ ๑ กันยายน พ.ศ. ๒๕๕๒

เขียน my_helper ให้โหลด helper ใน Codeigniter

<?php
//my_datetime_helper.php in system/application/helper/         
function unix_time_to_mysql_time($time){
   $ci=& get_instance();
   $ci->load->helper('date');
   $datestring = "%Y-%m-%d %h:%i:%s";
   $time = now();
   return mdate($datestring, $time);
}
?>
ง่ายได้อีก! แค่ไม่รู้เท่านั้นเอง และก็ไม่รู้จะ search ด้วย keyword อะไร
ที่มาจร้า stackoverflow ,ci user guide-> create_lib
keyword (ที่ทำให้หาหน้า stackoverflow เจอ) : helper load other helper codeigniter

วันจันทร์ที่ ๓๑ สิงหาคม พ.ศ. ๒๕๕๒

ทดลอง compile chromium (Linux)

Update 2/Nov/2009 
   ตอนนี้ได้มีการเปลี่ยนระบบการ compile ใหม่เป็นใช้ make แล้ว (ไม่ใช้ hammer) 
   และอาจจะมี pkg ที่ขาดหาย ให้ลองติดตั้ง install-build-deps.sh คือ solution ที่เค้าว่ากันว่าง่ายที่สุดที่จะแก้ปัญหานี้
ถ้าไม่ทำจะมีปัญหาประมาณว่า  /usr/bin/ld: error: cannot find -lbz2


1.get source tarball download ไฟล์จากที่นี่  http://build.chromium.org/buildbot/archives/chromium_tarball.html
2.install depot_tools เครื่องมือในการจัดการ source
apt-get install subversion (ถ้ายังไม่มี)
svn co http://src.chromium.org/svn/trunk/tools/depot_tools
3.get prerequire software
    สำหรับ ubuntu 32 bit
sudo apt-get install subversion pkg-config python perl g++ g++-multilib bison flex gperf libnss3-dev libgtk2.0-dev libnspr4-0d libasound2-dev libnspr4-dev msttcorefonts libgconf2-dev libcairo2-dev libdbus-1-dev
4.untar source และเข้าไป sync ใน source directory 
cd downloads/
tar xvfz chromium.rXXXXX.tgz
mv home ~/workspace/chomium/home
export CRROOT=/home/mossila/workspace/chromium/home/chrome-svn/tarball/chromium
cd $CRROOT
gclient sync --force
5.compile แค่ chrome อย่างเดียว
cd $CRROOT/src/build
hammer chrome 
6.จะได้ executable ออกมาที่ $CRROOT/src/sconsbuild/Debug
---------

ผล compile: fail
ด้วย
ram 1 GB
cpu pentium D 3.00 Ghz
harddisk ว่างมากกว่า 20 GB
ubuntu 9.04 desktop 32 bit
(T^T) อารายยว้าาาา....

Update!
compile สำเร็จด้วย 
virtual box
ram 1.5 GB
cpu 1.7 Ghz
harddisk 12 GB
ubuntu 9.04 desktop 32 bit
---------
แถม
force SCons ให้ re-scan dependency 
hammer --implicit-deps-changed

update tarball หรือ checkout version ล่าสุด
ให้ดูจาก http://build.chromium.org/buildbot/waterfall/ ก่อนว่า tree อยู่ใน สถานะอะไร ถ้า open คือดี update มา compile ได้ แต่ถ้าเป็น closed ให้รอไปก่อนแล้วกลับมาดูใหม่
 
Hammer tools ที่ใช้ในการ build ของ chrome หรือ scons ดูเพิ่มได้ที่ http://www.scons.org/
    "SCons is a fantastic build system, written in Python (1.5.2) that does lots of nice things like automated dependencies, cross platform operation, configuration, and other great stuff. I would have to say that it is probably going to be the best thing for building C/C++ projects in the near future."
    ข้อดี
  • configuration file เป็น python เป็นภาษาโปรแกรมมิ่งจริงซึ่งทำให้แก้หลายๆ ปัญหาในการ build ได้
  • สามารถวิเคราะห์ dependency ให้อัตโนมัติสำหรับ c,c++ และ fortran ไม่จำเป็นต้องใช้ "make depend" หรือ "make clean" อีกต่อไป เพื่อที่จะให้ได้มาซึ่ง dependency. การวิเคราะห์ dependency ง่ายที่จะให้ user เพิ่มหรือกำหนดเองว่าให้ไป scan เพิ่มจากภาษาอื่นๆ หรือชนิดของไฟล์


วันพุธที่ ๑๙ สิงหาคม พ.ศ. ๒๕๕๒

VI Editor

เป็น editor ที่เริ่มใช้ตัวที่ 2 ต่อจาก notepad เรื่องจริงนะ ;) 1

เริ่มเป็น programmer ตัวน้อยๆ ก็โดน vi ยัดเข้าปากเลยครับ T^T แม่มใช้ยากโพด
บ่นพอแระเริ่มเลยละกัน vi มี 2 version หลักๆ ที่เราจะได้ใช้กัน 1. vi 2. vim
vi -ของจริง ไม่ได้แต่ keyboard ฝั่งขวาเลย (ให้ถูกคือแตะไม่ได้เลย) พวก numpad ,ลูกศรต่างๆ
vim -ใช้ง่ายขึ้นเพราะว่า keyboard ฝั่งขวาใช้งานได้แล้ว
ในบางเครื่องเค้าก็จะให้พิมพ์ vi แล้วไปเรียก vim มาใช้เลยถ้าใครได้เจอ vim ก็ถือว่าโชคดีกว่านิดหน่อยละกัน แต่ว่าใน blog นี้ก็จะเรียกรวมกันไปเลยว่า vi นะครับ
vi มี 3 mode
1.พิมพ์ 2. command 3. last line
1.พิมพ์ 2
เข้าสู่ mode นี้ได้ด้วยการพิมพ์ i , a , s , o
i - insert พิมพ์แทรก ข้างหน้าตัวอักษร ,shift i พิมพ์แทรก หน้าบรรทัด
a - append พิมพ์ต่อท้ายตัวอักษร , shift a พิมพ์ต่อท้ายบรรทัด
s - sub... 3 แทนตัวอักษรหรือ replace นั่นเอง เช่น 3s replace 3ตัว, shift s แทนทั้้งบรรทัด
o - open newline ขึ้นบรรทัดใหม่ , shift o แทรกบรรทัดก่อนหน้า
ออกจาก mode นี้้ด้วยการกด escape (esc)
**ระหว่างพิมพ์ สามารถ auto-complete word ได้ด้วย ctrl+n เลือกคำด้วยการกด n ไปเรื่อยๆ โดยกด ctrl ค้างไว้ (เป็น word ที่เคยพิมพ์ไปแล้วเท่านั้น ไม่รู้ว่าถ้าจะเอาจาก lib ของภาษาต้องทำไง)
2. command เป็น mode แรกสุด ที่เข้ามาใน vi เพื่อที่จะทำการเปลี่ยนเป็น mode อื่น
ใน mode นี้ จะมีการเลื่อน key ได้ด้วย h j k l (ซ้าย ลง ขึ้น ขวา) ถ้าเป็น vim ก็เลือกด้วยลูกศรได้เลย
yy copy line
yw copy word
y10w copy 10 words
10yy copy 10 lines
dd cut line
dw cut word
d10w cut 10 words
10dd cut 10 lines
p วาง ,shift p วางก่อนหน้า
w เลื่อน cursor 1 word
10w เลื่อน cursor 10 words
3. last line การพิมพ์เข้าไปเป็นชุดคำสั่งโดยเริ่มจากการพิมพ์ : หรือ / ใน command mode ชุดคำสั่งที่นี่สนใจมีดังนี้
syntax highlight
:syntax off
:syntax on
line wrap
:set wrap
:set nowrap
goto line number
:16
ไปบรรทัดที่ 16
show line number
:set nu
:set nonu
แบ่ง vi เป็น 2 หน้า
:split <filename>
:split myhead.h
สลับ 2 หน้าด้วย ctrl+ww
บันทึก/ออก
:w #บันทึก
:wq #บันทึกแล้วออก
:q #ออก
:q! #บังคับออก
search word
/someword
สามารถกด n เพื่อหน้าต่อได้ next ๆๆๆ , หรือ shift n เพื่อหาย้อนกลับ

  1. เรื่องนี้มีเขียนไว้ที่อื่นด้วยนะ เช่น http://www.thaiopensource.org/?q=node/47
  2. ในตอนลบของ vi ถ้าลบด้วย backspace จะไม่เห็นว่าตัวอักษรหายไปแต่พิมพ์แทนได้เลย แต่ถ้าเป็น vim จะเห็นว่าตัวอักษรหายไป
  3. อะไรไรซักอย่างจำไม่ได้

ระบบภาวะการมีงานทำของบัณฑิต : กรอกตั้งนานได้แค่เนี้ย ต้องใช้ ie6

มหาวิทยาลัยบูรพา
นายหางานดี   มีตังใช้
เลขประจำตัวประชาชน
 :  xxxxxxxxxxxxx
รหัสประจำตัว
 :  xxxxxxxx
คณะ
 :  คณะxxx
สาขาวิชา
 :  xxxx
ได้ตอบแบบสอบถามภาวะการมีงานทำของบัณฑิตเรียบร้อยแล้ว
เมื่อวันที่  xx สิงหาคม  2552
ลงชื่อ...............................................
( นายหางานดี   มีตังใช้ )
xx สิงหาคม 2552


กรอกตั้งนานได้แค่เนี้ย ต้องใช้ ie6 ด้วยถ้าไม่ใช้ สุดท้ายก็ฝืนไม่ใช้ เพราะว่าอยู่บน linux ไม่มี ie กรอกตั้งนานกว่าจะผ่าน แถมกรอกว่าเป็นโปรแกรมเมอร์ดันไม่ผ่าน ผ่านตอนไปกรอกว่าเป็น dancer อืม - -'

สามารถโหลดไฟล์เพื่อแก้ไขมา print ได้ที่นี่

apt-get

คำสั่ง install program (package) ใน ubuntu 

เป็นคำสั่งที่ใช้บ่อยเมื่อต้องการลงโปรแกรมต่างๆ ทั้งๆ ที่มีระบบกราฟิกอยู่แล้ว (synaptic) แต่ว่าถ้าเราพอจำชื่อ pkg ได้ apt-get install จะเร็วกว่ากันเยอะ

- install pkg คำสั่งต้องการสิทธิ์ root ดังนั้นต้อง sudo ก่อน ทดสอบด้วย gcc compiler
sudo apt-get install build-essential #พิมพ์ถึงตัว e แล้วกด tab ได้

มันก็จะให้ใส่ password หรือมีให้เลือกยืนยันอะไรซักหน่อย ส่วนใหญ่จะมีให้กด y หรือ n เท่านี้มันก็จะ download อะไรต่อมิอะไรมาให้เราเสร็จ พร้อมใช้ทันที พิมพ์ gcc ได้เลย

- remove/uninstall pkg ทำคล้ายๆ กันแค่เปลี่่ยนเป็นคำว่า remove

sudo apt-get remove build-essential #พิมพ์ถึงตัว e แล้วกด tab ได้

แต่ว่าในการ remove บางครั้ง pkg ที่โหลดมาและเป็น dependency จะไม่ได้ถูกลบออกไปด้วย ให้ใช้คำสั่ง autoremove อีกทีเพื่อเอาให้เกลี้ยง

sudo apt-get autoremove

และในกรณีที่โหลด pkg มาเยอะๆ ก็อาจจะมีบางตัวที่ไม่ได้ใช้แล้ว นานๆ ที่เราอยากได้ freespace เราก็ต้องสั่ง autoclean ซัก 1 ครั้ง

sudo apt-get autoclean

ถ้าเราหา pkg ไม่เจอ(ด้วยการพิมพ์แล้วกด tab) อาจจะเป็นเพราะว่า pkg นั้นมีการเปลี่ยนแปลงชื่อหรือเราพิมพ์ผิด ให้ลองค้นหาด้วยคำสั่ง apt-cache search ก่อน

apt-cache search flash java font #ไม่ต้องใช้สิทธิ์ root

หา pkg สำหรับ flash java font ที่ควรจะมีใน ubuntu ก็จะมีผลออกมาดังนี้ 

libming-util - Library to generate SWF (Flash) Files - Utilities
ming-fonts-dejavu - Ming format DejaVue Fonts
ming-fonts-opensymbol - Ming format Opensymbol Fonts
ubuntu-restricted-extras - Commonly used restricted packages
xubuntu-restricted-extras - Commonly used restricted packages

ซึ่ง pkg ที่เราลงเพื่อใช้แก้ไขปัญหานี้ก็คือ ubuntu-restricted-extras หลังจากได้ชื่อ pkg ที่เราต้องการแล้วก็สั่ง install ปกติ

sudo apt-get install ubuntu-restricted-extras

อย่างไรก็ตามถ้าท่านยังไม่รู้ชื่อของ pkg ที่ถูกต้องจริงๆ แนะนำว่าให้ลองหาใน synaptic หรือ google ก่อน

เพิ่มเติมเนื้อหาหรือแก้ไขบอกกันได้นะครับ ;)

Sudo

คำสั่ง sudo ใน ubuntu คือคำสั่งที่ทำให้เราสามารถใช้ตำสั่งด้วยสิทธิ์ root ได้ 1 ครั้ง โดยเราจะต้องกรอก password ของเราเข้าไป(ไม่ใช่ password root) แต่ว่า user เรานั้นต้องมีสิทธิ์ sudo ด้วย

มีประโยชน์ตอนที่เราจะลงโปรแกรมหรือว่า แก้ไขไฟล์ config ต่างๆ ของระบบ คำสั่งที่เราได้ใช่บ่อยๆ ได้แก่

install pkg ต่างๆ 
sudo apt-get install <pkg>
sudo apt-get remove <pkg>

restart/start/stop service 
sudo /etc/init.d/gdm restart

เปลี่ยนเป็น root
sudo su -

แก้ไขไฟล์ config
sudo vi /.../.../configfile

reboot/shutdown ใน text mode
sudo shutdown -r now     #restart เครื่องทันที
sudo shutdown -h 20:00  #ปิดเครื่องตอน 2 ทุ่ม

ถ้าต้องการให้ sudo แสดง prompt ออกมาเป็น gui ให้ใช้คำสั่ง gksu แทน
เช่น
gksu gedit somefile.txt &

เปิด file text ด้วยสิทธิ์ของ root ด้วย gedit(text editor ที่เป็น graphic mode)

วันจันทร์ที่ ๑๗ สิงหาคม พ.ศ. ๒๕๕๒

เพิ่ม user ให้ sudo ได้

sudo <editor> /etc/group

เช่น 
sudo vi /etc/group
sudo gedit /etc/group
(เลือกอย่างใดอย่างหนึ่ง)

เพิ่ม ชื่อ user ที่ต้องการให้ sudo ได้

admin:x:106:user1,user2,เพิ่มตรงนี้

save ไฟล์
แล้วลอง su ไป user นั้น user นั้นก็จะ sudo ได้แล้ว


วันศุกร์ที่ ๒๔ กรกฎาคม พ.ศ. ๒๕๕๒

เพื่อนให้มาลองทำ

โจทย์:
1. เขียนโปรแกรม random string ความยาวเท่ากับ 3
2. รัน 1 ล้านรอบ
3. เก็บ และนับว่ามีจำนวน string ที่ได้ออกมาไม่ซ้ำกันกี่ตัว
4. ท้าทายใช้เวลาในการรันเท่าไหร่

ตัวอย่างเช่น
lfX = 2
Fd1 = 4
gg2 = 1
มีทั้งหมด 3 ตัว
รัน 7 รอบใช้เวลา 3 millisec


ลองตั้งเป้าไว้ที่ 1 ล้านรอบไม่เกิน 30 วินะ ภาษาอะไรก็ได้

แก้ยังไงดี
1. random string ความยาว = 3
solution(ของผม).

  1. String ที่ว่าเอาตัวอะไรบ้าง น่าจะเป็น  พวกอักษรพิเศษอย่าง :,;'"}[]{|\ "... เราคงไม่เอา
    ABCEDFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 (62 ตัว)
    แต่ว่าถ้าจะเอาไปทำ captcha ก็ตัด ไอ(I), แอล(l), โอ(O,o), ศูนย์(0), หนึ่ง(1) ออกไปเพื่อป้องกันอักษรอ่านยากก็จะเหลือ (หรือตัวไหนที่เห็นสมควรก็ลองตัดออกเองนะ)
    ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz23456789 (56 ตัว)
    เก็บพวกนี้ใส่ตัวแปรไว้เลยเพราะว่าเดี๋ยวได้ใช้ตลอด
    starting_str = "ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz23456789";
  2. random ความยาวเท่ากับ 3
        random อักษรทีละตัวจากชุดตัวอักษรที่เรามีไว้ให้เลย โดยปกติแต่ละภาษาจะมี fn ที่ใช้ random ตัวเลข integer อยู่แล้วโดยจะมีลักษณะประมาณนี้ rand_int(begin,end) ก็จะได้เลขในช่วงตั้งแต่ begin ถึง end มาเราก็เอามา get ตำแหน่งของตัวอักษรใน String เริ่มต้นเลย
        a_char = starting_str.charAtIndex(rand_int(0,56)) // ไม่ใช้ length(starting_str) มันเสียเวลา
        ถ้าจะเอาความยืดหยุ่นเราก็คงต้องทำ function ให้กำหนดความยาวของ String ได้แต่ว่าถ้าจะเอาความเร็วเราก็คงจะให้มันต่อกันไปเองเรื่อยๆ เลย
        rand_str = strcat(
                                starting_str.charAtIndex(rand_int(0,56)),

                                starting_str.charAtIndex(rand_int(0,56)),
                                starting_str.charAtIndex(rand_int(0,56))
                               )

2. รันและนับ
  1. รัน ล้านรอบ นี่มันก็เป็นแค่ loop อ่ะ เดี๋ยวค่อยครอบทีหลัง
  2. เรื่องการเก็บข้อมูลและนับ
    1. มีตารางสำหรับเก็บแบบนี้
      String
      count
      "xyz"
      1
      "aBc"
      3
    2. พอมีข้อมูลใหม่ก็เอามานับเพิ่ม count ถ้า random มาใหม่ไม่มีในตารางก็เพิ่มเข้าไป
  3. เท่านี้โปรแกรมก็น่าจะทำงานได้แล้ว ถ้าจะนับว่ามันมีตัวที่ไม่ซ้ำกันกี่ตัวก็ดูที่แถวของตารางว่ามีเท่าไหร่  
3. เร็ว
    เรื่องนี้น่าจะเป็นเรื่องโครงสร้างข้อมูลที่ใช้ในการเก็บตารางที่ว่าแล้วจะทำได้เร็วขนาดในที่นี้ผมก็คิดว่าน่าจะใช้ hashtable ที่มีของแต่ละภาษาไปเลยน่าจะเร็วที่สุดแล้ว (dict ใน python, array ของ php, Hashtable ของ java)


ตัวอย่างที่ลองเขียนด้วย python

import random
from    datetime import datetime
instr = '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
def ranstr():
     return instr[random.randint(0,61)] + instr[random.randint(0,61)] + instr[random.randint(0,61)]
begin = datetime.now()
buffer = {}
for i in range(1000000):
    mystr = ranstr()
     if mystr in buffer:
         buffer[mystr] += 1
     else:
         buffer[mystr] =1
print "all string", buffer
print "distinct :",len(buffer)
end = datetime.now()
print "begin :",begin
print "end    :",end
print "diff :",(end - begin)

core2 1.7G, RAM 3 GB, ประมาณ 8 วิ :)

วันศุกร์ที่ ๑๗ กรกฎาคม พ.ศ. ๒๕๕๒

วันอังคารที่ ๑๔ กรกฎาคม พ.ศ. ๒๕๕๒

ศูนย์บริการ ดี/แย่ ลองวัดด้วย SEO

เนื่องจากถ้าใครเครื่องมีปัญหาส่วนใหญ่ก็จะมองหา ศูนย์บริการก่อนแล้วแต่ในบางครั้งหาไปแล้วไม่เจอก็จะเป็นความลำบากสำหรับผู้ใช้อย่างยิ่งวันนั้นเลยลองหาวิธี list ดูว่าของที่ไหนบ้างที่ว่าถ้าเกิดเรามีปัญหาแล้วเราหาศูนย์ได้ไม่ยากแน่ๆ เพราะว่าเราหาเจอด้วย google
ด้วย keyword เดียวกัน "ศูนย์ _ชื่อยี่ห้อ_"
ผลออกมาเป็นแบบนี้

แย่
ดี
acer
hp/compaq
Lenovo
msi

toshiba
apple
svoa
asus
sony
samsung
dell

โปรดใช้วิจารณญาณในการอ่าน :P

วันเสาร์ที่ ๔ กรกฎาคม พ.ศ. ๒๕๕๒

สลับค่าตัวแปรด้วย xor

ลืมไปนานจนมีคนมาถามเนี่ยแหละสลับค่าตัวแปรอย่างไรดีที่สุด แล้วก็ไปเห็นตัวอย่างนึงเค้าเขียนไว้ว่า
php code
$a = $a ^ $b;
$b = $a ^ $b;
$a = $a ^ $b;

เอ๋เค้าทำอะไรกันหว่า?
หาก็ไม่ค่อยเจอเพราะว่าไอ้เครื่องหมาย ^ caret เนี่ยมันหาใน google เจอซะที่ไหน ก็เลยไปถามนู๋เนยรู้เรื่องเลย ว่าไอ้ ^  มันหมายความว่า xor หรือ exclusive or โดยจะมีตารางค่าความจริงเป็นดังนี้

abxor
110
101
011
000

มีประโยชน์อย่างยิ่งในการสลับค่าตัวแปรโดยที่ไม่จำเป็นต้องประกาศตัวแปรเพิ่มเติม ไม่ต้องจอง buffer ให้มากมาย
หลักการ (a xor b) xor b จะเท่ากับ a
ตัวอย่างการทำงาน
a = 14  >> 1110
b = 5    >> 1010

1) a = a xor b2) b = a xor b3) a = a xor b
a111001000101
b101010101111
result0100 --->  a1110 ---> b0101 ---> a

a กับ b สลับค่ากันแล้ว! wow จริงๆ แล้วมันเป็นเรื่องที่ไม่น่าลืมนะเนี่ย

วันอาทิตย์ที่ ๒๘ มิถุนายน พ.ศ. ๒๕๕๒

ไปดู Transformers 2 มา

แล้วรอบนี้ก็เจอเรื่องไม่ประทับใจอีกแระ
  • ดูที EGV Grand โรง 7
  • รอบ 19:30 วันเสาร์
  • ไปกัน 3 คน(เยอะกว่ารอบที่แล้ว)
ก็ไปถึงกันก่อนเวลามากันตั้งก่ะประมาณ 5:30 โมง นัดกันที่เพนตากอน ซักพักเพื่อนอีกคนแล้วก็ @fukurokung ก็ตามมา(ที่จริงมาก่อนแล้วไปเดินไหนมาไม่รู้) แล้วก็ไปดูกันที่ โรง imax ก่อน แล้วก็แอบได้ยิน พริ๊ตตี้โรงหนังคุยกับลูกค้าด้านหน้าว่า
พรุ่งนี้เหลือ 3 แถวหน้าค่ะ
ไม่ต้องมีคำใดจะกล่าวกับเพื่อนฝูงแล้วไปหาที่อื่นกันเถอะ ต่อให้วันนี้มีที่คงไม่พ้น 3 แถวหน้าเหมือนกัน ก็เลยว่าไปไหนกันดี ก็เลือกไปเป็น EGV Grand ครับใกล้ดี ไปถึงจองตั๋วรอบทุ่มครึ่งชิวๆ ครับเพิ่งเลิกงานหิวหาไรกินก่อนเผื่อเวลานิดนึง(วันนี้ทำงาน T^T) ไปกิน ฮาจิบังกัน คนเยอะมากกกก ไม่มีที่ว่างเลย - -'
ลองไปดู food court กันมะ
ได้ๆ ไปโล้ด ไปถึง
กลับไปกินฮะจิบังกันมะ
เหอๆ เพราะอะไรหน่ะหรอ เหอๆ คือดูราคาแต่ละอย่างแล้ว
ข้าวจานละ 160฿
ไหงโหดงี้ฟระ ฮะจิกันเถอะเพื่อนฝูง กลับมาฮะจิ มีที่ว่าง 4 ที่เหมาะสมพอดีเลย แต่มากัน 3 คนนะก็กินกันไปอย่างสบายจายย แล้วก็ไปนั่งรอหน้าโรงหนัง (หน้าเบื่อเนอะไม่มีเรื่องตื่นเต้นเลย) วิวที่นี่ดีมากเลย ~c~ แต่มาเป็นคู่นี่สิแย่จริง แล้ว 19:30 ก็มาถึง (เล่ามาน้ำเยอะชิบหายเลยกว่าจะถึงเรื่องที่โรง) เข้าไปในโรงนั่งลงไปความรู้สึกแรก
เบาะแxร่งเหมือน major วันนั้นเลยโว้ยยย
เหตุการณ์คงไม่เกิดซ้ำกันง่ายๆ งืมๆ ดู โฆษณา ไปเรื่อย เรื่อย เรื่อย เรื่อย เรื่อย เอ้ยยย โฆษณา มันเยอะจังฟระ เยอะมากๆ ประมาณ 30 นาที แล้วระหว่างที่เริ่มเซ็งกับ โฆษณา ก็เริ่มได้ยินเสียงประหลาดที่ไม่ควรได้ยินในโรงหนัง?
เสียงน้ำหยด!
ไม่สิหยดเราต้องไม่ได้ยิน
เป็นเสียงน้ำไหลจิ๊กๆ เลยคร้าฟฟฟ
อะไรของมันฟระแสรดดด โรงหนังนะเฟร้ยยยย เฮ้อ... เซร็งๆๆ กว่าหนังจะมา แล้วมาก็มาแล้ว Yeahh! ^^ หนังมาก็ดึงสมาธิเราจากเสียงกวนประสาทนั่นได้ซะที สมกับคาดหวังมาพอสมควร แม้ขาดไป 4 ฉากอลังการ(อันไหนไม่รู้) ที่เดาๆ น่าจะมีฉากสู้ตอนแรกๆ และตอนจบมันแลจะจบการต่อสู้ง่ายไป แต่เรื่องที่เจอและเซ็งมากกกกกกกกกกกกกกกก ย้ำมากกกกกกกกกกกกกกกกกก
ระหว่างดูๆ อยู่จอดับพรึบ หายไปทั้งภาพและเสียง และไฟในโรงหนังก็เปิด..
อ้าว เวรประจำวันใครวะเนี่ย อยู่ๆ มันดับไปเฉยเลยพักใหญ่เลย 1-3 นาที เซ็งๆๆๆ ยังดีที่มันกลับมา -_- ข้าพเจ้าเกลียด egv เกลียด major ฮึ่มๆๆๆ ถ้าหนังไม่สนุกนี่จะไม่ให้อภัยเลย ยังดีวันนี้หนังสนุกมากพอใจอารมณ์หายบูด แต่ว่าตอนออกจากโรงหนังอ้าว พนง.มันไปไหนกันฟระ? ประตูไม่เปิดอีก จะออกเฟร้ยยยยยย พวกxรึงทำห่านนน อะไรกันอยู่ ฮ่วยย ยังมีเรื่องให้เซ็งนิดๆ ตอนท้ายอีกฮ่วยๆ เฮ้อๆ ช่างมันไม่มีอะไรเรื่องเล็กน่าหนังสนุกให้อภัย กลับมาเขียน blog ด่าดีกว่า ^^ (ทำหน้าให้อภัยสุดๆ อารมณ์ดี ฮี่ๆ)

วันพุธที่ ๑๐ มิถุนายน พ.ศ. ๒๕๕๒

Pidgin-msn-ubuntu

โปรแกรมนี้อยู่ที่ menu > Internet > Pidgin Internet messager
จะได้โปรแกรมหน้าตาประมาณนี้มา กดเพิ่ม account (หรือไปที่ menu ของ pidgin Accounts > Manage Accounts)


ในตอนแรกจะยังไม่มี wlm เลย

download .deb ถ้าเป็น ubuntu ,exe ถ้าเป็น windows >> http://code.google.com/p/msn-pecan/downloads/list

ลงได้เหมือน exe บน window เลย
set up account เป็นแบบนี้

เสร็จแล้ว

วันศุกร์ที่ ๒๙ พฤษภาคม พ.ศ. ๒๕๕๒

Android note

จากครั้งก่อนๆ ที่ cap ภาพ ของ out/ ที่ได้จาก compile แล้วก็ไม่รู้จะเอาไปทำอะไรต่อ ลองไปถาม @nuuneoi ดูเค้าก็บอกว่าให้เอาผลที่ออกมาได้ไปแทน .img ใน emulator ดูเลยก็เลยไปเปิดดู sdk ดูแล้วก็เจออะไรบางอย่างดังรูปพวกนี้ ซึ่งเดี๋ยวจะเอามันมาลองทับกันดู จะผิดจะมั่วเดี๋ยวคงได้รู้กัน :P


ทดสอบ twitterfeed

เนื่องจากอยากให้ blog ของเรา update ผ่าน twitter ได้บ้าง วันนี้เลยลอง tweet ถามไปใน twitter นั่นแหละก็มี @thangman22 กับ @medkung ตอบมาว่า ลอง twitterfeed สิ ซึ่งผมก็ไม่รู้ว่ามันทำงานยังไงแล้วจะทดสอบยังไง นอกจาก ลอง blog ดูละกัน อิอิ

วันพฤหัสบดีที่ ๒๘ พฤษภาคม พ.ศ. ๒๕๕๒

Compiling android ๓

ต่อจากนี้ ระดับความมั่วอาจจะสูงกว่าเดิม
เค้าบอกว่าให้ Using Eclipse โอเคย์จัดไปตามเค้าว่าครับ

Basic setup
ขั้นแรกเค้าบอกว่าเรา set up Android devlopment system เรียบร้อยแล้วหรือยัง?

cd /path/to/android/root
make # and wait a while, if you haven't done this

อันที่ว่า /path/to/android/root  อันนี้ก็น่าจะเป็น directory เดียวกับที่เรา get source มานั่นแหละครับ
[สำหรับใครที่ make แล้วไม่ต้องทำอีกรอบนะครับ มันนานมากๆ ]

สำคัญมั่กๆ ยังไงคุณก็ยังต้องใช้ make เพื่อ build ไฟล์ที่คุณจะเอาไปรันบน emulator หรือเครื่องจริง. ที่คุณใช้ eclipse เพื่อแก้ไขไฟล์ และทดสอบว่ามัน compile ได้ แต่เมื่อคุณต้องการที่จะเอามันไปใช้ คุณต้องดูให้แน่ใจว่าไฟล์ ได้ถูก  save ใน eclipse แล้ว และต้องมารัน make ใน shell อีกรอบ เพราะการ build ของ eclipse นั้นทำไปเพื่อตรวจสอบ error เท่านั้น

Eclipse ต้องการ list ของ directory เพื่อที่จะค้นหาไฟล์ java หรือที่เรียกว่า Java build path ที่จะถูกกำหนดไว้ใน .classpath แล้วเค้าก็บอกว่ามี version เริ่มต้นให้เรา [ตัวอย่างไฟล์]

cd /path/to/android/root
cp development/ide/eclipse/.classpath .
chmod u+w .classpath # ทำให้ตัว copy นี้สามารถเขียนได้

แล้วก็แก้ไขไฟล์ .classpath ถ้าจำเป็น (สำหรับคนที่ไม่รู้ว่าจำเป็นหรือเปล่าอย่างผม ..ข้ามโล้ดอย่าไปยุ่งอะไรกับมัน -_-)

Increase Eclipse's Memory Settings

ต่อไปเพิ่มพลังให้ eclipse เด๋วม่อง (Increase Eclipse's Memory Settings)
Android project ทำให้เครื่องคุณม่องได้สบาย [java ก็เยอะแล้ว eclipse ด้วย android อีก ไม่รอดแน่ๆ JVM มันจะ run out of memory ได้ง่ายๆ] เพื่อป้องกันปัญหาดังกล่าวให้ เราแก้ไข eclipse.ini ซึ่งมันจะอยู่ใน directory  eclipse ที่เราลง อันนี้ของใครของมันนะ ของ Mac เค้าบอกมาด้วยว่าอยู่ที่ /Applications/eclipse/Eclipse.app/Contents/MacOS/eclipse.ini เปิดไฟล์ขึ้นมาแก้ไขเลยครับ
ของเดิม
-Xms40m
-Xmx256m
-XX:MaxPermSize=256m

แนะนำสำหรับโปรเจค android
-Xms128m
-Xmx512m
-XX:MaxPermSize=256m

คือ set ให้ eclipse มี Java heap size ต่ำสุดเป็น 128MB และเพิ่มสูงสุดเป็น 512MB และให้ maximum permanent generation เป็นเหมือนเดิม

เสร็จแล้วก็เปิด eclipse ^^
eclipse &
หรือจะด้วยการเข้าไป click หรืออะไรก็แล้วแต่ 1 2
ถ้าเป็นการพบกับ Eclipse ครั้งแรกของคุณ
  1. มันจะถามหา workspace เลือกเป็น default เลยก็ดี
  2. เจอ welcome screen สวัสดีมันแล้วปิดมัน มันจะเข้าสู่หน้าจอ Java perspective.
  3. File > New > Java Project
  4. เลือกชื่อ Project อะไรซักอย่างที่คุณต้องการเช่น myandroid
  5. เลือกที่ Create project from existing source แล้วใส่ path ไปยัง directory ของ android
  6. รอจนมัน import project เสร็จตรงมุมขวาล่างจะมี progress อยู่ด้วยนะครับ

เมื่อเปิดโปรเจคมาครั้งแรก eclipse จะเริ่ม build ตามปกติมันจะ build ขึ้นมาโดยไม่มี error เกิดขึ้น และคุณก็จะไปต่อได้อย่างสบายใจ แล้วถ้ามันยังมีอะไรไม่น่าชื่นใจก็ลอง uncheck แล้วก็ recheck ที่ Project > Build Automatically เพื่อบังคับให้มัน rebuild

Note: บางครั้ง eclipse มันจะเพิ่ม import android.R เข้ามาให้ที่ด้านบน ของไฟล์ ที่มีการเรียกใช้ resource โดยเฉพาะตอนที่คุณสั่งให้ eclipse sort หรือทำอย่างอื่นเพื่อจัดการการ import ซึ่งอาจจะทำให้เกิด error ได้ ลองมองหา import ที่ผิดที่ว่านั้นแล้วก็ลบออก[ยังไม่ได้ลองเพราะฉะนั้นมันยังไม่เกิดขึ้นกับผม]

  1. & คือ ให้ทำงานเป็น background terminal จะคือ cursor มาให้เราไม่งั้นมันจะค้างอยู่อย่างนั้น
  2. ทำให้ eclipse รันเป็นเหมือน command ทั่วไปทำได้โดยไปเพิ่ม ใน $PATH ใน .bashrc เหมือนตอนที่ 2 ที่เพิ่ม repo

Compiling android ๒

วิธีการ Compile (ในแบบของผม ผิดถูกช่วยวิจารณ์ด้วย)
มาๆ วิธีการกันมั่ง  จริงๆ มีวิธีมีอยู่แล้วที่ http://source.android.com/download เขียนไว้เผื่อไม่อยากอ่านภาษาฝรั่ง

ขั้นแรก เลิกใช้ windows
(จริงจังนะ)

ในที่นี้ลง Ubuntu 9.04 32 bit นะ(วิธีลง เหมือนๆ ของเก่า)

ขั้นที่ 2 เราต้องลงโปรแกรมตามนี้ (ต้องการ internet นะ)
  1. Git 1.5.4 หรือใหม่กว่า
  2. JDK 5.0 หรือใหม่กว่า ในที่นี้เค้าบอกว่า Java 6 ไม่ support เพราะฉะนั้นผม uninstall ออกเลย
    sudo apt-get remove sun-java6-jdk sun-java6-jre sun-java6-bin
  3. flex, bison, gperf, libsql-dev, libesd0-dev, libwxgtk2.6-dev (optional), build-essential, zip, curl.

ด้วยคำสั่งนี้บรรทัดเดียว(ย้าวยาว รอพักนึงตามความเร็ว internet)

sudo apt-get install git-core gnupg sun-java5-jdk flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev

เค้า บอกต่ออีกว่าเราอาจจะต้องการ Valgrind เครื่องที่จะช่วยให้เราหาว่าเกิดปัญหากับ memory ขึ้นหรือเปล่า(leaks, stack corruption, array bounds overflows, etc.) ไม่รู้มันเป็นไงเหมือนกันเค้าว่าไงก็ว่าตามนั้น

sudo apt-get install valgrind

แล้วก็ถ้าเป็นบน 8.10 คุณก็คงต้องการ version ใหม่ของ libreadline ด้วย (คือไรฟระ ตู 9.04 เออๆ เอาด้วย)

อันนี้ของเดิมของเค้า
sudo apt-get install lib32readline5-dev

มันไม่ได้เลยเปลี่ยนเป็นอันนี้(ด้วยความวิสาสะ)
sudo apt-get install libreadline5-dev

เสร็จแล้วขั้นที่ 2 สำหรับ ubuntu 64, และ Mac กระผมไม่ได้ลองนะ

ขั้นที่ 3 install Repo (ถ้าจะเริ่มมั่วมันก็ตั้งก่ะอันนี้แหละ)
  1. สร้าง directory ขึ้นมาอันหนึ่งสำหรับใส่ repo


    cd
    mkdir bin
    vi .bashrc

    กด i เพื่อพิมพ์ใน vi เพิ่มบรรทัดนี้เข้าไป

    export PATH=${PATH}:/home/ชื่อusernameของเครื่องคุณ/bin

    กด :wq เพื่อออกจาก vi และบรรทึกไฟล์
    แล้วก็เพิ่มเข้าไปใน bash ปัจจุบัน โดยใช้คำสั่งข้างล่าง (จุด เว้นวรรค จุดแบชอาซี)

    . .bashrc

    ทดสอบด้วย

    echo $PATH

    ผลที่ถูกต้องคือควรจะมี /home/ชื่อusernameของเครื่องคุณ/bin  เป็นส่วนประกอบของข้อความที่พิมพ์ออกมา

  2. download repo

    curl http://android.git.kernel.org/repo >~/bin/repo
    chmod a+x ~/bin/repo
ขั้นที่ 4 init repo
  1. สร้าง directory สำหรับเก็บ source code

    mkdir myandroid
    cd myandroid

  2. รัน repo init

    repo init -u git://android.git.kernel.org/platform/manifest.git

  3. ใส่ชื่อ และ email ถ้าเกิดต้องการจะ submit code อันนี้ผมกรอกไปเลยแม้ไม่เคยคิดจะส่งกลับก็ตาม

เมื่อเสร็จแล้วควรจะได้อะไรทำนองนี้แบบนี้
  repo initialized in /mydroid

ขั้นที่ 5 เอาไฟล์มันลงมา 
    คำสั่งนี้จะโหลด ไฟล์ทั้งหมดของ project จาก repositories ลงมาเลย
repo sync

พักกินข้าวกินหนมหรืออะไรก็ว่าไป นานโขตามความเร็ว internet

ขั้นที่ 6 Verifying Git Tags (อันนี้แหละที่มั่ว)

ให้ทำสั่งนี้เพื่ออะไรซักอย่าง งงๆ
gpg --import

มันจะขึ้น promt ให้เราใส่อะไรซักอย่างให้ใส่สิ่งนี้ลงไปแล้วกด ctrl+d
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.2.2 (GNU/Linux)

mQGiBEnnWD4RBACt9/h4v9xnnGDou13y3dvOx6/t43LPPIxeJ8eX9WB+8LLuROSV
lFhpHawsVAcFlmi7f7jdSRF+OvtZL9ShPKdLfwBJMNkU66/TZmPewS4m782ndtw7
8tR1cXb197Ob8kOfQB3A9yk2XZ4ei4ZC3i6wVdqHLRxABdncwu5hOF9KXwCgkxMD
u4PVgChaAJzTYJ1EG+UYBIUEAJmfearb0qRAN7dEoff0FeXsEaUA6U90sEoVks0Z
wNj96SA8BL+a1OoEUUfpMhiHyLuQSftxisJxTh+2QclzDviDyaTrkANjdYY7p2cq
/HMdOY7LJlHaqtXmZxXjjtw5Uc2QG8UY8aziU3IE9nTjSwCXeJnuyvoizl9/I1S5
jU5SA/9WwIps4SC84ielIXiGWEqq6i6/sk4I9q1YemZF2XVVKnmI1F4iCMtNKsR4
MGSa1gA8s4iQbsKNWPgp7M3a51JCVCu6l/8zTpA+uUGapw4tWCp4o0dpIvDPBEa9
b/aF/ygcR8mh5hgUfpF9IpXdknOsbKCvM9lSSfRciETykZc4wrRCVGhlIEFuZHJv
aWQgT3BlbiBTb3VyY2UgUHJvamVjdCA8aW5pdGlhbC1jb250cmlidXRpb25AYW5k
cm9pZC5jb20+iGAEExECACAFAknnWD4CGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIX
gAAKCRDorT+BmrEOeNr+AJ42Xy6tEW7r3KzrJxnRX8mij9z8tgCdFfQYiHpYngkI
2t09Ed+9Bm4gmEO5Ag0ESedYRBAIAKVW1JcMBWvV/0Bo9WiByJ9WJ5swMN36/vAl
QN4mWRhfzDOk/Rosdb0csAO/l8Kz0gKQPOfObtyYjvI8JMC3rmi+LIvSUT9806Up
hisyEmmHv6U8gUb/xHLIanXGxwhYzjgeuAXVCsv+EvoPIHbY4L/KvP5x+oCJIDbk
C2b1TvVk9PryzmE4BPIQL/NtgR1oLWm/uWR9zRUFtBnE411aMAN3qnAHBBMZzKMX
LWBGWE0znfRrnczI5p49i2YZJAjyX1P2WzmScK49CV82dzLo71MnrF6fj+Udtb5+
OgTg7Cow+8PRaTkJEW5Y2JIZpnRUq0CYxAmHYX79EMKHDSThf/8AAwUIAJPWsB/M
pK+KMs/s3r6nJrnYLTfdZhtmQXimpoDMJg1zxmL8UfNUKiQZ6esoAWtDgpqt7Y7s
KZ8laHRARonte394hidZzM5nb6hQvpPjt2OlPRsyqVxw4c/KsjADtAuKW9/d8phb
N8bTyOJo856qg4oOEzKG9eeF7oaZTYBy33BTL0408sEBxiMior6b8LrZrAhkqDjA
vUXRwm/fFKgpsOysxC6xi553CxBUCH2omNV6Ka1LNMwzSp9ILz8jEGqmUtkBszwo
G1S8fXgE0Lq3cdDM/GJ4QXP/p6LiwNF99faDMTV3+2SAOGvytOX6KjKVzKOSsfJQ
hN0DlsIw8hqJc0WISQQYEQIACQUCSedYRAIbDAAKCRDorT+BmrEOeCUOAJ9qmR0l
EXzeoxcdoafxqf6gZlJZlACgkWF7wi2YLW3Oa+jv2QSTlrx4KLM=
=Wi5D
-----END PGP PUBLIC KEY BLOCK-----

หลังจากนั้นคุณจะสามารถ verify tag ได้ด้วยคำสั่ง
git tag -v tagname
แต่ว่าผมไม่รู้นี่สิว่าไอ้ tagname เนี่ยมันเอามาจากไหน แล้ว tag ในที่นี้คือไรฟระ?

ขั้นที่ 7 Building the code (ข้ามมาอย่างไม่สนใจ -_- )

ง่ายมากๆ ถ้าโหลดไอ้พวกนั้นมาเสร็จแล้ว มันจะมี Makefile มาให้เข้าไปใน directory นั้นแล้วพิมพ์ make ก็พอ

cd mydroid

make

รอไปเลยครับนาน ของผม  2 ชม.
ผมเข้าไปปิด gdm ก่อน( gui บน ubuntu) เพื่อให้มันทำงานให้เต็มที่
ctrl + alt + f6
login
sudo /etc/init.d/gdm stop
ใส่ password
แล้วค่อยไปสั่ง make

ถ้าเกิดมันล้มเหลว เพราะว่า ไม่มี run-java-tool อะไรทำนองนี้ ให้ลอง set ANDROID_JAVA_HOME เป็น $JAVA_HOME ด้วยอะไรทำนองนี้
export ANDROID_JAVA_HOME=$JAVA_HOME

แต่ปัญหานี้ไม่เกิดขึ้นกับผม
แล้วก็ run ไปเป็น ชม. นั่นแหละ

แล้วตอนนี้ก็ไม่รู้จะทำไรต่อแล้ว หุหุ