ยังไม่เขียน blog เกียวกับเรื่องไปถ่ายโฆษณามาเลยแต่ถ่ายมานานแล้วแหละ
อันนี้เบื้องหน้าครับ
อันนี้เบื้องหลัง
เบื้องหน้าแอบติดอยู่นิดนึงหุหุ 1:31, คนที่เห็นหน้าคนที่ 3 จากซ้าย
ผู้สนับสนุน
วันพฤหัสบดีที่ ๒๔ ธันวาคม พ.ศ. ๒๕๕๒
ไปถ่ายโฆษณากับ google มา
วันอังคารที่ ๒๒ ธันวาคม พ.ศ. ๒๕๕๒
Use google docs as blog editor(เขียน blog ด้วย Google docs)
<html> <head><title>Test Google docs block code</title></head> <body> <h1>It work!</h1> </body> </html> |
วันอังคารที่ ๒๔ พฤศจิกายน พ.ศ. ๒๕๕๒
Build ChromeOS
THIS PAGE IS DEPRECATED ใช้ไม่ได้แล้วครับ
วันศุกร์ที่ ๓๐ ตุลาคม พ.ศ. ๒๕๕๒
Chromium 4 review บ้านๆ
- ภาษาไทยบน Linux พิมพ์ได้แล้ว
- "ปิดไฟล์" --> "เลือกไฟล์"
Chromium บน linux แสดงผลภาษาไทยได้แล้ว แล้วก็พิมพ์ไทยได้แล้วด้วย
Android source ๔
ต่อจาก ตอนที่แล้ว [เนื่องจากงง ทำหลายข้อต่อไปไม่ได้ เลยขอข้ามเลย]
ตอนที่แล้วถึงช่วงเพิ่ม memory ให้ eclipse
เมื่อคุณต้องการ sync โปรเจค
ซึ่งกรณีที่จะต้องทำได้แก่ตอนที่คุณใช้ repo sync หรืออื่นๆ เช่น เปลี่ยนแปลงไฟล์ จากนอก eclipse (เช่นไฟล์ .classpath) ดังนั้นคุณต้อง refresh eclipse
- Window > show view > navigator
- แล้วก็ไปที่ navigator tab > คลิ๊กขวาที่โปรเจค("mydroid" หรืออะไรก็ตามที่คุณตั้งชื่อมัน)
- คลิ๊กที่ refresh
Adding apps to the build path
[ไม่ค่อยเข้าใจข้าม... -_-]
Eclipse setup to work on developer tools
[ไม่ค่อยเข้าใจข้าม... -_-]
Eclipse setup to work on DDMS
[ไม่ค่อยเข้าใจข้าม... -_-]
จัด Format ให้ eclipse
- คลิ๊กที่ project ของท่าน ("mydroid" หรืออะไรก็ตามที่คุณตั้งชื่อ)
- Project>properties
- เมนูทางซ้าย Java code style > Formatter
- Enable project specific setthings > import
- เลือกไฟล์ android-formatting.xml จาก development/ide/eclipse
[ต้นฉบับบอกว่าให้เพิ่ม android.importorder ด้วยแต่ผมหาไม่เจอ] - เลือก 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
- เปิด run > debug configurations
- คลิ๊กขวาที่ Remote Java Application
- ตั้งชื่อให้มัน เช่น android-debug
- ตั้งชื่อโปรเจค (ตามปกติมันมันจะมีชื่อโปรเจคเดิมเรามาให้อยู่แล้ว)
- เปลี่ยน port เป็น 8700
- กด Debug
ปล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 ที่เขียนออกมาจะไม่ได้กลายเป็น app โดยตรง
- เมื่อ compile แล้วมันจะสร้าง lib native ให้อยู่ใน apps/
- เรียกผ่าน JNI ของ android อีกทีหนึ่ง
โดยที่เราจะต้องเขียน 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 */ |
และจะเรียกใช้ผ่าน 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
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/projectgit init-db
เพิ่มเข้า repository
เข้าไปที่ root directory ของ project แล้วรันคำสั่ง
git add .git commit -a
แสดงความแตกต่างกับ code ก่อนหน้านี้
เช่นเมื่อมีการแก้ไข อะไรไปบางอย่างใน project แล้วอยากเทียบตอนนี้กับการ commit ครั้งล่าสุด
cd root/of/gitgit diff
แสดงว่ามีใครแก้ไขอะไรเมื่อไหร่บ้าง
git logจะแสดงว่ามีการแก้ไขโดยใคร , เมื่อไหร่ และแสดง comment ที่เขียนไว้
ตย. ผลการ git
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 examcd 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 masterSwitched 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
foo
id | foo_value |
2 | 10 |
3 | 10 |
id | bar_value |
2 | 1 |
3 | 1 |
4 | 1 |
5 | 1 |
id | bar_value |
4 | 1 |
5 | 1 |
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 ออกอย่างสมบูรณ์
วันอังคารที่ ๘ กันยายน พ.ศ. ๒๕๕๒
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
2. ติดตั้ง appserv
วันอังคารที่ ๑ กันยายน พ.ศ. ๒๕๕๒
เขียน 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); } ?> |
วันจันทร์ที่ ๓๑ สิงหาคม พ.ศ. ๒๕๕๒
ทดลอง compile chromium (Linux)
2.install depot_tools เครื่องมือในการจัดการ source
3.get prerequire software
สำหรับ ubuntu 32 bit
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
hammer chrome
---------
ด้วย
ram 1 GB
cpu pentium D 3.00 Ghz
harddisk ว่างมากกว่า 20 GB
ubuntu 9.04 desktop 32 bit
(T^T) อารายยว้าาาา....
แถม
force SCons ให้ re-scan dependency
update tarball หรือ checkout version ล่าสุด
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
- เรื่องนี้มีเขียนไว้ที่อื่นด้วยนะ เช่น http://www.thaiopensource.org/?q=node/47
- ในตอนลบของ vi ถ้าลบด้วย backspace จะไม่เห็นว่าตัวอักษรหายไปแต่พิมพ์แทนได้เลย แต่ถ้าเป็น vim จะเห็นว่าตัวอักษรหายไป
- อะไรไรซักอย่างจำไม่ได้
ระบบภาวะการมีงานทำของบัณฑิต : กรอกตั้งนานได้แค่เนี้ย ต้องใช้ ie6
|
apt-get
คำสั่ง install program (package) ใน ubuntu
Sudo
คำสั่ง sudo ใน ubuntu คือคำสั่งที่ทำให้เราสามารถใช้ตำสั่งด้วยสิทธิ์ root ได้ 1 ครั้ง โดยเราจะต้องกรอก password ของเราเข้าไป(ไม่ใช่ password root) แต่ว่า user เรานั้นต้องมีสิทธิ์ sudo ด้วย
วันจันทร์ที่ ๑๗ สิงหาคม พ.ศ. ๒๕๕๒
เพิ่ม user ให้ sudo ได้
sudo <editor> /etc/group
วันศุกร์ที่ ๒๔ กรกฎาคม พ.ศ. ๒๕๕๒
เพื่อนให้มาลองทำ
โจทย์:
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(ของผม).
- String ที่ว่าเอาตัวอะไรบ้าง น่าจะเป็น พวกอักษรพิเศษอย่าง :,;'"}[]{|\ "... เราคงไม่เอา
ABCEDFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 (62 ตัว)
แต่ว่าถ้าจะเอาไปทำ captcha ก็ตัด ไอ(I), แอล(l), โอ(O,o), ศูนย์(0), หนึ่ง(1) ออกไปเพื่อป้องกันอักษรอ่านยากก็จะเหลือ (หรือตัวไหนที่เห็นสมควรก็ลองตัดออกเองนะ)
ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz23456789 (56 ตัว)
เก็บพวกนี้ใส่ตัวแปรไว้เลยเพราะว่าเดี๋ยวได้ใช้ตลอด
starting_str = "ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz23456789"; - 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))
)
- รัน ล้านรอบ นี่มันก็เป็นแค่ loop อ่ะ เดี๋ยวค่อยครอบทีหลัง
- เรื่องการเก็บข้อมูลและนับ
- มีตารางสำหรับเก็บแบบนี้
String count "xyz" 1 "aBc" 3 - พอมีข้อมูลใหม่ก็เอามานับเพิ่ม count ถ้า random มาใหม่ไม่มีในตารางก็เพิ่มเข้าไป
- มีตารางสำหรับเก็บแบบนี้
- เท่านี้โปรแกรมก็น่าจะทำงานได้แล้ว ถ้าจะนับว่ามันมีตัวที่ไม่ซ้ำกันกี่ตัวก็ดูที่แถวของตารางว่ามีเท่าไหร่
เรื่องนี้น่าจะเป็นเรื่องโครงสร้างข้อมูลที่ใช้ในการเก็บตารางที่ว่าแล้วจะทำได้เร็วขนาดในที่นี้ผมก็คิดว่าน่าจะใช้ 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
$a = $a ^ $b; $b = $a ^ $b; $a = $a ^ $b; |
a | b | xor |
1 | 1 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
0 | 0 | 0 |
1) a = a xor b | 2) b = a xor b | 3) a = a xor b | |
a | 1110 | 0100 | 0101 |
b | 1010 | 1010 | 1111 |
result | 0100 ---> a | 1110 ---> b | 0101 ---> a |
วันอาทิตย์ที่ ๒๘ มิถุนายน พ.ศ. ๒๕๕๒
ไปดู Transformers 2 มา
- ดูที EGV Grand โรง 7
- รอบ 19:30 วันเสาร์
- ไปกัน 3 คน(เยอะกว่ารอบที่แล้ว)
พรุ่งนี้เหลือ 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 เท่านั้น
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 ครั้งแรกของคุณ
- มันจะถามหา workspace เลือกเป็น default เลยก็ดี
- เจอ welcome screen สวัสดีมันแล้วปิดมัน มันจะเข้าสู่หน้าจอ Java perspective.
- File > New > Java Project
- เลือกชื่อ Project อะไรซักอย่างที่คุณต้องการเช่น myandroid
- เลือกที่ Create project from existing source แล้วใส่ path ไปยัง directory ของ android
- รอจนมัน import project เสร็จตรงมุมขวาล่างจะมี progress อยู่ด้วยนะครับ
เมื่อเปิดโปรเจคมาครั้งแรก eclipse จะเริ่ม build ตามปกติมันจะ build ขึ้นมาโดยไม่มี error เกิดขึ้น และคุณก็จะไปต่อได้อย่างสบายใจ แล้วถ้ามันยังมีอะไรไม่น่าชื่นใจก็ลอง uncheck แล้วก็ recheck ที่ Project > Build Automatically เพื่อบังคับให้มัน rebuild
Note: บางครั้ง eclipse มันจะเพิ่ม import android.R เข้ามาให้ที่ด้านบน ของไฟล์ ที่มีการเรียกใช้ resource โดยเฉพาะตอนที่คุณสั่งให้ eclipse sort หรือทำอย่างอื่นเพื่อจัดการการ import ซึ่งอาจจะทำให้เกิด error ได้ ลองมองหา import ที่ผิดที่ว่านั้นแล้วก็ลบออก[ยังไม่ได้ลองเพราะฉะนั้นมันยังไม่เกิดขึ้นกับผม]
Compiling android ๒
วิธีการ Compile (ในแบบของผม ผิดถูกช่วยวิจารณ์ด้วย)
มาๆ วิธีการกันมั่ง จริงๆ มีวิธีมีอยู่แล้วที่ http://source.android.com/download เขียนไว้เผื่อไม่อยากอ่านภาษาฝรั่ง
ขั้นแรก เลิกใช้ windows (จริงจังนะ)
ขั้นที่ 2 เราต้องลงโปรแกรมตามนี้ (ต้องการ internet นะ)
- Git 1.5.4 หรือใหม่กว่า
- JDK 5.0 หรือใหม่กว่า ในที่นี้เค้าบอกว่า Java 6 ไม่ support เพราะฉะนั้นผม uninstall ออกเลย
sudo apt-get remove sun-java6-jdk sun-java6-jre sun-java6-bin - 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 (ถ้าจะเริ่มมั่วมันก็ตั้งก่ะอันนี้แหละ)
- สร้าง directory ขึ้นมาอันหนึ่งสำหรับใส่ repo
cd
mkdir bin
vi .bashrc
กด i เพื่อพิมพ์ใน vi เพิ่มบรรทัดนี้เข้าไป
export PATH=${PATH}:/home/ชื่อusernameของเครื่องคุณ/bin
กด :wq เพื่อออกจาก vi และบรรทึกไฟล์
แล้วก็เพิ่มเข้าไปใน bash ปัจจุบัน โดยใช้คำสั่งข้างล่าง (จุด เว้นวรรค จุดแบชอาซี)
. .bashrc
ทดสอบด้วย
echo $PATH
ผลที่ถูกต้องคือควรจะมี /home/ชื่อusernameของเครื่องคุณ/bin เป็นส่วนประกอบของข้อความที่พิมพ์ออกมา - download repo
curl http://android.git.kernel.org/repo >~/bin/repochmod a+x ~/bin/repo
- สร้าง directory สำหรับเก็บ source code
mkdir myandroid
cd myandroid - รัน repo init
repo init -u git://android.git.kernel.org/platform/manifest.git - ใส่ชื่อ และ 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----- |
หลังจากนั้นคุณจะสามารถ 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 ไปเป็น ชม. นั่นแหละ
แล้วตอนนี้ก็ไม่รู้จะทำไรต่อแล้ว หุหุ