Thứ Tư, 27 tháng 4, 2011

Task Queues with google app engine

Thông thường với việc thực hiện crawler các trang web khác thì tại một thời điểm bạn chỉ có thể thực hiện một request đến trang craw,muốn tại một thời điểm gọi được nhiều request thì tương ứng bạn phải nhân lượng craw tại một thời điểm lên,công việc này thực sự không đem lại hiểu quả.Với task queues thì công việc này trở lên hết sức đơn giản,chỉ cần thực hiện một crawler bạn có thể thực hiện nhiều request tới url.Có thể hiểu một các đơn giản là task queues giúp bạn thực hiện các công việc được phân công một cách đồng thời.

Trước hết tạo file queue.xml trong WEB-INF có nội dung

<queue-entries>
<!--Change the refresh rate of the default queue to 1/s-->
<queue>
<name>default</name>  //ten tash queue se được gọi trong servlet
<rate>100/s</rate>  //số lầ thực hiện task queues trong 1s
</queue>
</queue-entries>

tạo một servlet để add các task queues.(DemoServlet.java)

package Showsiteinfo.cron;

import java.io.IOException;

import javax.jdo.PersistenceManager;
import javax.jdo.Query;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.google.appengine.api.taskqueue.Queue;
import com.google.appengine.api.taskqueue.QueueFactory;
import com.google.appengine.api.taskqueue.TaskOptions.Method;

import static com.google.appengine.api.taskqueue.TaskOptions.Builder.*;

@SuppressWarnings("serial")

public class DemoServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");

for(int i=0;i<100;i++)
{
Queue queue = QueueFactory.getDefaultQueue();  //goi defaulse task queues được config trong file queue.xml
queue.add(withUrl("/queue").method(Method.GET).param("name", "abc"));  // goi url queue sử dụng phương thức get vói parameter name=abc
}
}

}

Vào web.xml chỉnh đường dẫn tới DemoServlet.java là /demo

Giờ nhiệm vụ của chúng ta là chay link /demo,như vậy sau 1s (có thể trễ 1 chút) chúng ta đã thực hiện được 100 request tới url /queue.

Hạn chế của google là không cho chúng ta gọi link từ domain hay một app khác mà chỉ có thể thực hiện trong chính app ma bạn đang thực hiện task queues.

HANOI MOBILE DAY 201

MOBILE DAY 2011 (14/5/2011)
Nếu bạn có ý định chia sẻ kiến thức & kinh nghiệm liên quan tới Mobile cho cộng đồng!

MODILE DAY 2011
Sự kiện về Mobile tại Việt Nam.
Khoảng 500 người tham gia.
Số lượng diễn giả & topic: 12 topics chỉ nói về Mobile.
Số phòng hội thảo đồng thời: 2
Chi phí tham gia: miễn phí

ĐĂNG KÝ TOPIC & DANH SÁCH TOPIC
Bạn có thể trực tiếp thêm topic vào danh sách.
Ngày 05/05 danh sách sẽ được khóa.
https://spreadsheets.google.com/spreadsheet/ccc?key=t14PDT_pmPuAbUpmPAHeq5g&authkey=CNfcg7kH#gid=1

TOPIC
Đây là một số topic gợi ý, bạn có thể chọn bất kỳ topic nào.

Lập trình trên iPhone, Android
Lập trình trên Windows Phone, Bada, Symbian
Thị trường Mobile Việt Nam & Thế giới
Mô hình kinh doanh trên Mobile
Đặc trưng của mạng xã hội trên Mobile
User Experience & Thiết kế đồ họa trên Mobile

Chú ý là: thị trường Mobile còn rất trẻ, 80% người tham gia là junior, do đó nói các topic càng đơn giản dễ hiểu thì càng thu hút nhiều người quan tâm.

BẠN ĐƯỢC GÌ?
- Cơ hội chia sẻ cho cộng đồng
- Sự kính trọng & biến ơn từ cộng đồng
- Thử nói chuyện trước 100 ~ 200 người

BẠN MẤT GÌ?
- Thời gian
- Không có thù lao

BẠN CẦN CHUẨN BỊ GÌ?
- Thông tin tự giới thiệu về bạn, gửi sớm cho BTC để đưa lên website, để PR từ sớm.
- Nhớ gửi một / một vài bức ảnh của bạn, thật đẹp, cũng để đưa lên website

LƯU Ý
- Có một phòng VIP dành riêng cho BTC và diễn giả, khá đẹp.
- Đây là biệt khu, bạn có thể vào đó để chuẩn bị hoặc nghỉ ngơi.
- Buổi trưa BTC sẽ lo vụ ăn uống ngay trong phòng VIP

CHỖ ĂN NGHỈ?
- Bạn có thể nghỉ tại khách sạn Kim Liên (ngay bên cạnh khu hội thảo)
Số 7, Dao Duy Anh Str., Dong Da District, Ha Noi
Tel. 84.4.38522522; 25770328 Fax. 84.4. 35770463

Thứ Bảy, 23 tháng 4, 2011

Sinh mã số theo dải quy định trước

Như đã nói trong comment trước. Em sẽ trình bày một phương pháp sử dụng trường autoincrement để sinh mã số theo dải số quy định trước.

Như các bác thấy, trong thực tế, có rất nhiều trường hợp gặp phải ví dụ như là, mỗi một thành phố có một dải số chứng minh thư riêng chẳng hạn, hoặc trong một nhà máy, ID của mỗi sản phẩm họ quy định một dải số riêng như kem đánh răng thì từ 10000 đến 20000, còn bàn chải thì từ 20001 đến 30000...

Vậy thì làm thế nào? Cách đơn giản mà ta có thể nghĩ ra ngay là sử dụng một cơ chế khóa để luôn đảm bảo quá trình sinh mã được thực hiện theo thứ tự lần lượt. Em sẽ không comment gì cách này nữa.

Cách của em muốn đề cập ở đây là sử dụng một bảng như sau:

CREATE TABLE `seq` (
`CODE` varchar(255) NOT NULL,
`AUTO` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`CODE`),

UNIQUE KEY `CODE` (`CODE`,`AUTO`)

) ENGINE=MyISAM  DEFAULT CHARSET=latin1


Sau đó định nghĩa giá trị ban đầu của dải KEMDANHRANG là 9999 và dải BANCHAI là 20000

INSERT INTO `seq` (`CODE`, `AUTO`) VALUES ('KEMDANHRANG', '9999');
INSERT INTO `seq` (`CODE`, `AUTO`) VALUES ('BANCHAI', '20000');


Sau đó, nếu bạn muốn tính toán mã tiếp theo của bàn chải chẳng hạn, bạn sử dụng query sau:

replace into seq (`CODE`,`AUTO` ) values ('BANCHAI', '')

Lúc này, giá trị trả về của mysql_insert_id sẽ là auto number tiếp theo của bàn chải (là 20001).

Tương tự như vậy:

replace into seq (`CODE`,`AUTO` ) values ('KEMDANHRANG', '')

Sau truy vấn này, mysql_insert_id trả về 10000 (auto number của dải kem dánh răng).

Tất nhiên để kiểm soát giá trị trên của dài. Sau khi lấy được mã, chúng ta phải tự so sánh giá trị lấy được với giá trị trên để xem mã vừa lấy được có phù hợp hay không.

Thứ Năm, 21 tháng 4, 2011

Cài đặt gnome 3 trên ubuntu 10.10

Cách này cài gnome 3 thông qua gnome-shell

1.Cài mấy thư viện để build

sudo apt-get install curl libtiff4-dev libgstreamer0.10-dev libcroco3-dev xulrunner-dev mesa-utils mesa-common-dev libreadline5-dev libgl1-mesa-dev libwnck-dev librsvg2-dev libgnome-desktop-dev libgnome-menu-dev libffi-dev libgtk2.0-dev libgconf2-dev libdbus-glib-1-dev gtk-doc-tools gnome-common git-core flex bison automake build-essential icon-naming-utils autopoint libvorbis-dev libpam-dev libgcrypt-dev libtasn1-dev libtasn1-3-bin libgnome-keyring-dev libupower-glib-dev libxklavier16 libxklavier-dev xserver-xephyr python-dev libpulse-dev libjasper-dev jhbuild libgtop2-dev libsqlite3-dev libproxy-dev libdb-dev libproxy-dev libcups2-dev libusb-1.0-0-dev

2.Download build script

wget http://git.gnome.org/browse/gnome-shell/plain/tools/build/gnome-shell-build-setup.sh

3.Chạy build script

chmod +x gnome-shell-build-setup.sh
./gnome-shell-build-setup.sh


4.build

jhbuild build

Quá trình build có thể một số gói sẽ không cài được . Trong trùng hợp này hãy chọn option 2 để tiếp tục cài đặt


*** Installing gnome-power-manager *** [39/41]
make install
make: *** No rule to make target `install'. Stop.
*** Error during phase install of gnome-power-manager: ########## Error running make install *** [39/41]


[1] Rerun phase install
[2] Ignore error and continue to next module
[3] Give up on module
[4] Start shell
[5] Reload configuration
choice: 2

5. Dùng thử .

gnome-shell –-replace

6.Thình thoảng bạn build lại để cập nhật code mới từ gnome-git

Quyên show hàng http://i-php.net/Screenshot.png

Chủ Nhật, 17 tháng 4, 2011

Tại sao tôi lại được khuyến cáo không sử dụng TRIGGER và PROCEDURE của MySQL?

Chào các bác,

Em mới vào Sài Gòn chưa được ít lâu. Hiện đang đi phỏng vấn xin việc. Được mấy công ty rồi, ở trong này cách họ truy vấn lúc phỏng vấn khá là khác biệt so với các công ty em đã làm ở ngoài Hà Nội. Đại khái em thấy họ tập chung vào các kinh nghiệm làm việc thực tế, hơn là lý thuyết chung chung. Đặc biệt là họ chỉ focus vào các yêu cầu của công việc, chẳng đoái hoài gì đến giá trị gia tăng gì sất (cũng hơi là lạ lúc đầu nhưng sau 3 lần phỏng vấn em cũng thấy quen rồi và cũng cho thế là hợp lý, tuyển PHP, MySQL thì sức đâu mà lo đến Java, Python... khác). Khi xin tuyển công ty khác thì em cũng sửa sửa, xóa xóa tùy theo yêu cầu tuyển dụng :D.
À quay lại chủ đề chính. Có một công ty em tuyển có trao đổi một đoạn như sau (với anh xếp Việt Kiều Úc, công ty KiSS Concept):

...

- Em đã  bao giờ sử dụng tính năng như TRIGGER, PROCEDURE trên các dự án của mình chưa?

- Chưa. Em được khuyến cáo là không sử dụng những tính năng đó của MySQL. Thay vì thế, dùng mã PHP.

- Tại sao vậy? Không phải việc của CSDL thì để cho CSDL làm chẳng phải sẽ nhanh hơn rất nhiều sao?

- Việc đó thì em nghĩ là đúng. Em cũng chưa từng tự hỏi vì sao họ lại khuyến cáo như vậy. Về phần em, cũng không thấy phiền hà lắm với việc xử lý tất cả trên PHP. Đôi khi còn rất hữu dụng nữa...

...

Về nhà em cũng suy nghĩ lại đoạn đó, vả cũng cố nghĩ ra một cách giải thích, các bác xem có hợp lý không nhé:

- Tất nhiên, khai thác triệt để các tính năng do CSDL mang lại là tốt nhất.

- Tuy nhiên khi phát triển các ứng dụng trên PHP và MySQL, các bác nhà ta thường chuẩn bị tư thế sẵn sàng cho việc ... vì lý do nào đó, thay đổi cơ sở dữ liệu sử dụng (từ MySQL sang Oracle chẳng hạn). Code tất cả các tính năng trong PHP giảm được sự phức tạp cho việc chuyển đổi này. Vì thế, MySQL chỉ được coi là thùng chứa dữ liệu, chứ các tính năng xử lý dựng sẵn không được coi trọng.

- Xử lý bằng PHP, về sau hệ thống cần phải chịu tải lớn, cần phải tối ưu hóa một số đoạn, việc refactor lại code sẽ dễ sàng hơn.

Có ai có thích giải thích khác không ạ? Các dự án mà các bác làm thì thế nào, có hay dùng TRIGGER & PROCEDURE của MySQL không? Trường hợp nào thì nên sử dụng TRIGGER & PROC?

Thứ Tư, 13 tháng 4, 2011

Submit file sử dụng iframe

Chắc các bạn cũng đã quen với việc dùng ajax để submit form mà không phải load lại toàn bộ trang.Với bài viết này mình sẽ hướng dẫn các bạn

Thứ Sáu, 1 tháng 4, 2011

Hướng dẫn cài đặt và sử dụng sock5

I.Cài đặt nylon sock server.
- Download nylon sock servar tại http://monkey.org/~marius/nylon/nylon-1.21.tar.gz (wget http://monkey.org/~marius/nylon/nylon-1.21.tar.gz)
- tar xvfz nylon-1.21.tar.gz
- cd nylon-1.21
- ./configure
- make
- make install

->Đến đây quá trình cài đặt nylon sock server đã hoàn tất.

+ Để tạo một socks ta sử dụng lệnh
nylon -p 12347 -i 75.126.162.150 -a 118.70.169.148 -I174.37.84.24
Trong đó:
- 12347 : cổng để truy xuất vào socks
- 75.126.162.150 : ip của server
- 118.70.169.148 :cho phép ip 118.70.169.148 truy suất được vào socks.
- 174.37.84.24 : ip hiển thị.
+ Số lượng socks sẽ tương ứng với lượng ip có trên server.

II.Sử dụng socks để kết nối vào các server whois lấy thông tin.
1.Download class socks5 tại : http://www.phpkode.com/source/s/socks5/socks5/class.socks5.php

Ví dụ về sử dụng class socks5
<?php
function whois($server,$domain)
{
error_reporting(E_ALL);
ini_set("display_errors", true);

include "class.socks5.php";

// ip server 75.126.162.150
// cong connect vao socks 12347
$socks5 = new socks5("75.126.162.150", 12347);

$socks5->set_timeout(10);
$socks5->set_dnstunnel(false);
$buffer = '';
if($socks5->connect($server, 43) === true)
{
$buffer = $socks5->request("$domain\r\n\r\n");
}
unset($socks5);
return $buffer;
}
echo "<pre>";
echo whois("whois.godaddy.com","eroticaofsapphic.com");
echo "</pre>";
?>

Để giả lập 1 sock dùng thử bạn connect vào server sử dụng lệnh : ssh -D 9999 root@domain  (Để connect vào sock bạn dung ip 127.0.0.1 cổng 9999)