0

Một điểm rất hay của Yii Model

Posted by datgs on Jan 11, 2012 in CakePHP, php

Hôm nay xem overview của Yii Framework, khám phá ra cách tổ chức validation rules của Yii rất là hay. Tôi hay sử dụng CakePHP và không thỏa mãn với cách thiết lập validation rules của nó:

CakePHP

Model::$validate = array(); # là một biến trong một class. Vì thế rất là bất tiện khi muốn có một validation rule tùy biến tham số được (ví dụ password pattern lấy ra từ configuration, hoặc database). Thông thường sẽ phải viết một hàm callback cho cái rule mới này.

Yii

public function rules() {

return array(

array(‘title, content, status’, ‘required’),
array(‘title’, ‘length’, ‘max’=>128),
array(’status’, ‘in’, ‘range’=>array(1,2,3)), # range này có thể tùy biến được
array(‘tags’, ‘match’, ‘pattern’=>’/^[\w\s,]+$/’,
‘message’=>’Tags can only contain word characters.’),
array(‘tags’, ‘normalizeTags’),
array(‘title, status’, ’safe’, ‘on’=>’search’),

);

}

Model::rules(); # trả về một mảng các validation rules. Vì vậy rất tiện lợi nếu như chúng ta cần tùy biến tham số từ database.

Một điểm có thể học tập được từ Yii validation rules là cách tổ chức theo nhóm. Bạn thử tưởng tượng bạn đang sử dụng CakePHP để làm điều này? Một table có khoảng 20 fields mà thực hiện validation theo chuẩn CakePHP thì quá oải.

Copied from http://datgs.wordpress.com/2012/01/11/mot-diem-rat-hay-cua-yii-model/

Tags: , , , , ,

 
0

Tại sao nên sử dụng kiểu ENUM khi thiết kế Database?

Posted by datgs on Jan 9, 2012 in CakePHP, mysql

Trước đây khi thiết kế database tôi thường sử dụng kiểu INT để cho các trường dữ liệu. Ví dụ kiểu boolean là 0 = No, 1 = Yes. Sau đó khi code định nghĩa các constant tương ứng:

const YES = 1;
const NO = 0;

Hoặc

const STATUS_ACTIVE = 1;
const STATUS_PENDING =2;
const STATUS_APPROVED = 3;

Tuy nhiên kiểu thiết kế này rất bất lợi cho việc bảo trì hệ thống. Bởi vì khi đọc trực tiếp trên database, các giá trị 0,1,2,3… không có ý nghĩa. Buộc phải đọc code để hiểu các giá trị trên là gì. Điều này đã ngốn không ít thời gian của tôi.

Khi đã có kinh nghiệm hơn, tôi chuyển sang sử dụng kiểu ENUM lúc này Yes sẽ là ‘Yes’, No sẽ là ‘No’. Nhờ vậy, tôi chỉ cần đọc dữ liệu là hiểu được ý nghĩa của nó. Giảm đi một thao tác vô ích.

Tags: ,

 
0

Cài đặt resin webserver trên centos

Posted by ngocbd on Dec 20, 2011 in php

Resin là webserver/servlet container rất mạnh . Có thể nó là nhanh nhất , với cở 10k  concurrent connection  .

1. Cài jdk (tốt nhất là jdk7)

http://download.oracle.com/otn-pub/java/jdk/7u2-b13/jdk-7u2-linux-x64.rpm

wget http://download.oracle.com/otn-pub/java/jdk/7u2-b13/jdk-7u2-linux-x64.rpm

rpm -i jdk-7u2-linux-x64.rpm

2.Cài resin

wget http://www.caucho.com/download/resin-4.0.24.tar.gz

tar xzf resin-4.0.24.tar.gz

start thử :

cd resin-4.0.24

sh bin/resin.sh start

3.Cài thành service

cd resin-4.0.24

./configure

make

make install

Chú ý tại bước này có thể script configure sẽ không làm việc vì đoạn code sau

tmpname=”/tmp/java$$.out”

$JAVA_EXE -version 2> $tmpname

grep “1\.[678]” $tmpname 1> /dev/null
if test “$?” != “0″; then
echo “no”
java_version=`cat $tmpname`
as_fn_error $? “Java 1.6 required. ${JAVA_EXE} returned: ${java_version}” “$L
NENO” 5

Đoạn code này sẽ check xem vesion của java có phải là 1.6[7,8] hay không . Nhưng cái java version thì lại là 1.6.0_23 hay 1.7.0

Vì vậy có thể code lại đoạn trên grep “1\.[678]” sửa thành grep “1\.[678]\.[0-9]\”

Xong bước này là bạn đã có thể chạy resin service

service resin restart

Các công việc cần làm tiếp theo : config admin username/password

config virtual host

config memory/heap

Tags: , ,

 
0

Làm việc với mongodb trong java

Posted by chinhvd on Nov 1, 2011 in php

Để  làm việc được với mongodb trước hết bạn download thư viện mongo tại link sau : http://www.mongodb.org/downloads

Cũng như bất kỳ loại CSDL nào để làm việc được trước hết bạn cần kết nối với CSDL của mongodb :

Mongo m = new Mongo(“localhost”); //connect tới server mongo trên local,nếu bạn đặt mongo trên một server khác ,bạn cũng có thể kết nối tới bằng cách thay localhost = tên server mà bạn đặt mongo.Điểm hay của mongo là bạn có thể đặt code và CSDL của bạn ở 2 server hoàn toàn khác nhau -> điều này giúp cho việc dùng chung CSDL một cách hết sức thuận tiện

DB db = m.getDB(“demomongo”); // connect tới database demomongo

DBCollection coll = db.getCollection(“demo”); // connect tới bảng demo

Ok,vậy là việc kết nối với mongodb đã hoàn tất,giờ tới việc insert và select cũng hét sức đơn giản,thư viện mongodb cung cấp cho bạn các hàm để có thể thao tác với mongodb một cách thuận tiện .

Để insert một record và bảng demo ta làm như sau :

        BasicDBObject doc = new BasicDBObject(); // khái báo một đối tượng BasicDBObject 

        doc.put("name", "MongoDB"); //put dữ liệu và đối tượng vừa tạo ra
        doc.put("type", "database");
        doc.put("count", 1);

        coll.insert(doc); //insert vào bảng

Để select ra 1 phần tử :

          DBObject myDoc = coll.findOne();
          System.out.println(myDoc);

Select ra nhiều phần tử :
          DBCursor list = coll.find(new BasicDBObject("name","MongoDB")); // tim tất cả những record có name="MongoDB"

Để update 1 record :
DBObject myDoc = coll.findOne();

myDoc.put(“update”,”true”);

coll.save(mydoc); //up date đối tượng myDoc

 
0

Một bài viết khá hay về việc tạo một theme wordpress

Posted by datgs on Sep 30, 2011 in php

http://www.phpeveryday.com/articles/Wordpress-Theme-Showing-the-Post-Excerpt-on-the-Front-Page-P169.html

Tags: ,

 
2

JoomFish and VirtueMart

Posted by tuannh on Aug 28, 2011 in joomfish, joomla

Sử dụng JoomFish và VirtueMart để làm website bán hàng đa ngôn ngữ :

Ở đây mình dùng Joomla 1.5.22 – JoomFish 2.1.7 – VirtueMart 1.1.9

B1 : Cài JoomFish

B2 : Cài VirtueMart

B3 : Cài đặt gói ngôn ngữ bạn muốn sử dụng (ở đây mình cài gói ngôn ngữ là tiếng việt)

B4 : Sau khi đã cài đặt gói ngôn ngữ, bạn vào joomfish và active cho nó :

Components >>> Joom!Fish >>> Content Languages

joomfish-active language

B5 : Vào phpMyAdmin , chọn database bạn đang dùng, gõ lệnh sau :

ALTER TABLE `jos_vm_product_attribute_sku` ADD `attribute_sku_id` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST ;

joomfish-active language

B6 : Download VM_Ce.zip, giải nén, copy paste vào thư mục :

your_root_folder/administrator/components/com_joomfish/contentelements

B7 : Download file shop_browse_queries.zip giải nén , copy rồi paste đè lên file cũ :

your_root_folder/administrator/components/com_virtuemart/html

Vậy là xong, bây giờ vào joom!Fish , chọn content element rồi dịch thôi.

Components >>> Joom!Fish >>> Translation

Joomfish-translate

Tags: , ,

 
7

Sử dụng layout trong CakePHP

Posted by thaiphong on Aug 6, 2011 in CakePHP

Khi sử dụng Framework để lập trình , có rất nhiều vấn đề mà người lập trình viên cần phải quan tâm . Trong đó có phần xử lý dao diện là một phần không thể thiếu . Trong bài viết này , mình sẽ hướng dẫn các bạn làm sao sử dụng layout trong CakePHP Khi ta viết một ứng dụng cho CakePHP . mặc định CakePHP đã hổ trợ cho chúng ta dao diện sẵn . Nhưng đôi khi tùy theo sở thích, nhu cầu , xu hướng … nên bắt buộc người thiết kế cũng như người lập trình cần có những giao diện (layout) cho riêng mình. Bài viết sẽ hướng dẫn cách chúng ta tạo 1 layout cho riêng mình và cách áp dụng 1 Helper CakePHP vào ứng dụng của mình. Khi phân tích 1 trang web , nhìn chung ta thấy gồm các phần chính như sau : null

Để vận dụng được sự hổ trợ mạnh mẽ chắc năng load layout của FrameWork CakePHP , ta phân tích các thành phần cố định và thành phần động : null

Như vậy ta để tránh việc xử lý các thành phần cố định ở controller ta chỉ cần viết 1 class Hepler để hiển thị nó . Còn thành phần động sẽ được xử lý thông qua Controllers. Cái file cần chuẩn bị trong Tutorial Layout CakePHP như sau :

 app/controllers/templates/ : -templates_controller.php (Controller chính để load layout)

 app/views/templates/ :

- index.ctp

- view.ctp

app/views/helpers/ :

- common.php (Tạo các thành phần cố định : menu , header,footer)

 app/views/layouts/ :

- template.ctp (File chứa nội dung layout)

 app/webroot/css/ :

- style.css (file CSS của layout)

Tạo file common.php (app/views/helpers/)

[php]

<?php
class CommonHelper extends HtmlHelper {

// Hàm tạo menu
function create_menu(){
$menu  = ”<ul>”;
$menu .= ”<li>”.$this->link(“CodeIgniter”,array(“controller”=>”templates”,”action”=>”view”,1)).”</li>”;
$menu .= ”<li>”.$this->link(“CakePHP”,array(“controller”=>”templates”,”action”=>”view”,2)).”</li>”;
$menu .= ”<li>”.$this->link(“Zend”,array(“controller”=>”templates”,”action”=>”view”,3)).”</li>”;
$menu .= ”</ul>”;
return $menu;
}

[/php]

//Hàm tạo các thành phần cho header và footer
function general(){
$data = array(
“header” => ”QHOnline.info”,
“footer” => ”Copyright 2011 © | QHTeam”,
);
return $data;
}
?>

Tạo file templates_controller.php (app/controllers/templates/) :

<?php
class TemplatesController extends AppController {
var $layout = ”template”; // load file chứa nội dung layout : views/layouts/template.ctp
var $helpers = array(“Html”,”Common”); // Thành phần Helper Common được gọi để tạo menu,header,footer trong view

function  index(){
$this->set(‘title_for_layout’, ’Templates By QHOTeam’);
$this->set(“content”,”QHO Team”);
}

function view($id){
switch($id){
case 1 :{
$this->set(‘title_for_layout’, ’CodeIgniter FrameWork’);
$this->set(“content”,”CodeIgniter FrameWork”);
}
break;
case 2 :{
$this->set(‘title_for_layout’, ’CakePHP FrameWork’);
$this->set(“content”,”CakePHP FrameWork”);
}
break;
case 3 :{
$this->set(‘title_for_layout’, ’Zend Framework’);
$this->set(“content”,”Zend Framework”);
}
break;
default :
$this->set(“content”,”Framwork”);
break;
}
}

}
?>

Tạo file layout template.ctp (app/views/layouts/template.ctp) : File này chứa nội dung layout bao gồm các thành phần cố định và thành phần động như ban đầu mô tả. Nội dung file này gồm mã HTML và PHP…

<!DOCTYPE html PUBLIC ”-//W3C//DTD XHTML 1.0 Transitional//EN” ”http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />
<title><?php echo $title_for_layout;?></title>
<?php echo $this->Html->css(“style”); // link oi file style.css (app/webroot/css/style.css)?>
<?php $general = $this->Common->general(); // Lấy các giá trị của thành phần tĩnh : header,footer ?>
</head>
<body>
<div id=”top”>
<center><h2><?php echo $general['header']; ?></h2></center>
</div>
<div id=”main”>
<div id=”menu”>
<?php echo $this->Common->create_menu(); // goi ham tao menu tu common helper?>
</div>
<div id=”content”>
<h1><?php echo $content; // Thành phần động ?></h1>
</div>
</div>
<div id=”footer”>
<center><?php echo $general['footer'];?></center>
</div>

</body>
</html>

Tạo file style.css (app/webroot/css/style.css)

Hình mô ta khi file template.ctp sử dụng file helper Common.phpbody {
	margin: auto;
	width: 1000px;
	font-family: Verdana, Geneva, sans-serif;
}
#top {
	float: left;
	width: 1000px;
	height: 100px;
	background-color: #F36;
	color: #FFF;
}
#main {
	float: left;
	width: 1000px;
}
#menu {
	float: left;
	width: 200px;
	background-color: #F96;
}
#menu ul {
	margin: 0px;
}
#menu a {
	color: #FFF;
	font-size: 12px;
}
 

#content {
	float: left;
	width: 800px;
}
#content h1 {
	font-size: 18px;
	color: #0CF;
	padding-left: 50px;
}

#footer {
	float: left;
	width: 1000px;
	height: 50px;
	background-color: #96C;
	font-size: 12px;
	font-weight: bold;
	color: #FFF;
}

Hình mô ta khi file template.ctp sử dụng file helper Common.php
null

Như thường lệ , khi tạo 1 fuction cho 1 Controller , thì ta phải tạo file view tương ứng để hiển thị nội dung trong file view đó.Trong ví dụ này ta có Controller Templates với 2 function là index() và view(), cần phải có 2 file view là : index.ctp và view.ctp để hiển thị nội dung tương ứng.

Tuy nhiên chúng ta đang sử dụng layout template.ctp (app/views/layouts/template.ctp) ,nên chỉ cần tạo 2 file index.ctp và view.ctp ,nội dung của 2 file này các bạn bỏ trống. Ví dụ function index() được gọi , nó sẽ load file index.ctp và tự động nạp file layout vào (app/views/layouts/templates.ctp).

Hình mô tả khi file view load file template.ctp

null

Chạy thử ứng dụng :

http://localhost/cakephp/templates

null
null
Khi click vào link của Menu : http://localhost/cakephp/templates/view/1
null

 
1

CouchDB cơ bản cho lập trình viên PHP

Posted by hoangnd on Aug 3, 2011 in CakePHP, Html / Css, Khái niệm, NoSQL, mysql, php

Là lập trình viên PHP thì chắc hẳn mình đã quá quen thuộc với việc tương tác cơ sở dữ liệu (CSDL), dám cá là phần nhiều trong số các bạn đọc bài này dùng MySQL cho công việc/học tập hàng ngày :)

Thực tế chứng minh MySQL là lựa chọn tốt cho dữ liệu có cấu trúc[1] và nhiều ràng buộc[2]. Mình bắt đầu bằng thiết kế các schema, tạo các bảng, định nghĩa kiểu dữ liệu cho các cột và tiếp theo là viết code cho các thao tác CRUD[3]. Vấn đề là trong dự án sẽ có nhiều trường hợp dữ liệu không đoán trước được kiểu, định dạng, độ lớn, hay các đặc tính cần có. Nếu mình thiết kế schema để đón đầu, CSDL sẽ theo thời gian chứa nhiều field bị null, hoặc phát sinh các ràng buộc phức tạp, câu lệnh SQL cũng vì thế mà rắc rối lên nhiều.

Với dự án như này, hãy thử một hướng đi khác, ko liên quan đến CSDL quan hệ. Vậy cái mình cần là 1 CSDL dạng document-based, schema free, ad-hoc.

Question: Với một Web developer thì tại sao lại phải biết SQL để lập trình web (?).

CouchDB là gì?

Theo Apache CouchDB website, CouchDB là

  • document database server, truy vấn thông qua RESTful JSON API[3].
  • ad-hoc, flat, và schema-free[4].
  • distributed.
  • sử dụng Javascript để query dữ liệu.

Cấu tạo một CouchDB như sau

- database

- document

+ _id

+ _rev

+ {“field” : “value”}

+ {“field” : “value”}

Ví dụ

- database: contacts

{

_id: 528c3917ed78a2ce16ddc130f700063f

_rev: 1-901de5ccbf8ff7faf4ad09475939f160

fullname: "Black Jack"

occupation: "IT"

skills: ["web", "desktop", "ajax", "php", "javascript","HTML"]

}

Trong document trên, _id là UUID[5], _rev là phiên bản tài liệu, 3 trường chứa giá trị là fullname, occupation, skills thể hiện dạng JSON.

Việc truy vấn dữ liệu được thực hiện thông qua các phương thức RESTful JSON API. Trên thực tế, nếu mình biết về Javascript, Ajax, JSON thì mình không cần phải biết về SQL để làm website(!)

Cài đặt CouchDB

Trên Ubuntu thì

sudo apt-get install couchDB
sudo /etc/init.d/couchdb start

Vậy là xong thôi. Service couchDB được chạy mặc định ở cổng 5984. Từ trình duyệt, gõ http://127.0.0.1:5984 mình sẽ thấy đại loại như

{"couchdb":"Welcome","version":"1.0.2"}

Tiếp theo, chạy trình quản lý Futon được tích hợp vào CouchDB, nó giống như PhpMyAdmin

http://localhost:5984/_utils/

Bước tiếp theo sẽ là thực sự xài CouchDB

Sử dụng CouchDB API

Tại thời điểm này, mình sử dụng cURL[6] để gửi các phương thức GET, PUT, POST, DELETE thông qua HTTP tới CouchDB

Câu lệnh đầu tiên

curl http://127.0.0.1:5984/

Kết quả:

{"couchdb":"Welcome","version":"1.0.2"}

Tạo CSDL mới

curl -X PUT http://127.0.0.1:5984/contacts

Khi bạn nhận được thông tin {"ok":true}, CSDL contacts đã được tạo

Lấy về tất cả cơ sở dữ liệu

curl -X GET http://127.0.0.1:5984/_all_dbs

Tạo 1 record mới trong contacts

curl -X PUT http://127.0.0.1:5984/contacts/*id* -d '{ *json_data* }'

ví dụ:

curl -X PUT http://127.0.0.1:5984/contacts/contact1 -d '{ "fullname":"Doraemon",
 "type":"cat" }'

Lấy thông tin về record vừa tạo

curl -X GET http://127.0.0.1:5984/contacts/contact1

Cái đáng phải quan tâm là, với việc gửi đi các phương thức khác nhau, CouchDB sẽ thực thi các hành động khác nhau. Trong ví dụ trên, GET là lấy về, PUT là tạo mới. Bên cạnh đó, CouchDB không phải là object oriented database[7] nên tránh dùng persistent data layer[8].

Đón xem phần 2: hoàn thiện phần 1 và giới thiệu cách kết hợp PHP & CouchDB

Tags: , , , , ,

 
8

Giảm độ lớn của INDEX trong MySQL

Posted by datgs on Jul 8, 2011 in php

Hi All,

Trong quá trình tìm giải pháp cho vấn đề của mình, bắt được một bài viết khá hay ở đây:

http://kevin.vanzonneveld.net/techblog/article/create_short_ids_with_php_like_youtube_or_tinyurl

Đây là bài viết nói về cách làm giảm chiều dài của ID trên URL (giống như của YouTube).

Tuy cái này hay, nhưng chưa giúp mình trong việc giải quyết vấn đề sau đây.

Mình có một CSDL các sản phẩm (khoảng 1 tỉ). Khi INSERT một sản phẩm mới, mình muốn kiểm tra xem tên sản phẩm này có trong CSDL hay chưa.

Nếu sử dụng Zend Lucene hoặc MySQL Index thì dung lượng index khá là lớn. Vì vậy mình muốn HASH các tên sản phẩm vào một trường khác với chiều dài nhỏ hơn.

Khi so sánh tên sản phẩm thì sử dụng HASH CODE này.

Giải pháp của mình là sử dụng mã md5 raw, với chiều dài là 16 bytes. Với 1 tỉ records thì nó ngốn xấp xỉ 15 GB.

Mình chấp nhận khả năng trùng lặp ở một số trường hợp.

Tuy nhiên mình muốn giảm chiều dài của HASH CODE xuống nữa thì nên sử dụng biện pháp gì.  Mình chấp nhận khả năng bị trùng lặp nhiều hơn (tức là có 2 sản phẩm khác tên nhưng hashcode có thể vẫn giống nhau)?

Bởi vì mình nghĩ có 1 tỉ item, vẫn chỉ là INT(11) = 4 bytes, xài 16 bytes thì … thấy hơi phí. Nếu có giải pháp giúp mình giảm xuống 8 bytes thì tốt nhất :D

Tags: , , ,

 
2

HTML5 đã hoàn thiện ở mức độ nào?

Posted by datgs on Jun 30, 2011 in php

http://slides.html5rocks.com

Lang thang trên mạng tìm hiểu về làm game thì em thấy cái này.

Em xin được chỉ giáo về HTML5. Em muốn biết HTML5 đã hoàn thiện ở mức độ nào rùi (nhất là tính tương thích trình duyệt). Em cũng đã có tìm hiều qua, nói chung vẫn mỗi trình duyệt một phách, khó xử quá.

Ngoài ra em muốn học hỏi một chút về làm game (chạy bằng trình duyệt chứ không phải app) trên mobile thì cần chú ý những điểm gì không. Chủ yếu là Andoid và Iphone. Em cũng xin được list ra những băn khoăn của em cho vấn đề này luôn:

1) Lựa chọn công nghệ: Flash, Silverlight, HTML5 cái nào?

2) Những sự khác biệt giữa mobile browser & desktop browser

3) Có nên làm game theo kiểu vector rùi resize tùy màn hình (cái này có thể áp dụng nếu trả lời của câu 2) là không khác nhau là mấy), hay là nên làm game nhiều bản phục vụ các loại user agent khác nhau.

Tags: , , ,

 
0

Build Check Google PageRank app with Prapi API

Posted by habogay on Jun 24, 2011 in C#

Hôm vừa rồi tớ có code demo cai’ app để check free Google Pagerank.

Giới thiệu về app này nhé :

Check Google Pagerank  là một app free dùng để check Google Pagerank cho website của bạn. Trong app này, tớ có sử dụng sẵn api của Prapi để có thể lấy về và show ra google pagerank một cách dễ dàng ^^

Cả nhà có thể down app tại đây

Còn source code ở đây

PS: trong source code đã comment đầy đủ

Tags: , ,

 
0

Mongo DB free với mongohq.com

Posted by ngocbd on Jun 9, 2011 in php

mongohq.com miễn phí một online mongo db max 16M .
Đủ để làm thử nghiệm các ứng dụng .

 
3

Một số thuật ngữ hay chém

Posted by hoangnd on Jun 2, 2011 in CakePHP, Drupal, NoSQL, flex, mysql, php

Chào bà con,

Hôm nay lang thang tự dưng thấy mấy từ viết tắt như này: OOP, ORM, RAD, DRY, KISS, TDD, YAML, PEAR

Ai diễn đạt tốt (trừ đại ka) thì giải thích ý nghĩa kèm minh họa mấy cái trên phát, ổn thì tớ bao chơi điện tử 1 buổi :D

Tags: , , ,

 
0

Cài đặt opencv trên ubuntu

Posted by ngocbd on May 20, 2011 in php

Cài đặt opencv trên ubuntu thật sự rất đơn giản .
Các bước :

1.sudo apt-get install build-essential

Thường thì build-essential đã được cài .
2.sudo apt-get install libavformat-dev
Cũng có thể đã được cài
3.sudo apt-get install ffmpeg
Cũng không cần thiết lắm nhưng nên cài
4.sudo apt-get install libcv2.1 libcvaux2.1 libhighgui2.1 python-opencv opencv-doc libcv-dev libcvaux-dev libhighgui-dev

Lib cho python cài hay không cũng được

Sau khi cài đặt thành công . Bạn có thể mày mò example .
Tốt nhất là copy example về home (~) cho tiện
cd ~
cp -r /usr/share/doc/opencv-doc/examples .
cd c
cd c
./build_all.sh
Để build hết các example
Chạy thử :
./morphology

Bạn có thể học bàng cách giải nén các example khác trong thu mục này . Edit code , thay file ảnh , rồi build lại …

Tags:

 
1

Mẹo mực với Eclipse PDT

Posted by datgs on May 13, 2011 in CakePHP

Khi làm việc với Eclipse PDT, đôi khi bạn gặp phải những tình huống như:

1/ Mất chức năng AutoComplete?

Đơn giản là hãy xóa file .project đi và refresh lại. Lỗi này thường gặp khi bạn Create Project from SVN

2/ Khi làm việc với những đối tượng như CakePHP, giả sử với AuthComponent bạn muốn gọi trong Controller như sau: $this->Auth->something, nếu có AutoComplete cho cái something kia thì tốt hơn đúng không ạ.

Những lúc thế này mình phải khai báo biến Auth cho controller mình đang sử dụng:

/**
* @var AuthComponent
*
* @var Auth
*/
var $Auth;

3/ Với template thì sao, template thì ná ná giống functional based code. Do đó mẹo như sau:

Đưa file này https://github.com/markstory/story-scribbles/blob/master/eclipse/code-completion-in-views.php vào bất cứ thư mục nào (trừ thư mục gốc của project). Bạn sẽ có AutoComplete cho form.

4/ Về Code AutoComplete cho CakePHP em đã tham khảo ở đây:

http://mark-story.com/posts/view/code-completion-for-cakephp-in-eclipse

Tags: , , , , , , , ,

 
0

Angry Birds gets a web version

Posted by ngocbd on May 12, 2011 in php

Phiên bản HTML5 của game Angry Birds, chơi ngay trên trình duyệt .

check it out : http://chrome.angrybirds.com

plan and zombie : http://chrome.plantsvszombies.com/

 
1

Google music free

Posted by ngocbd on May 12, 2011 in php

Hàng mới trong google IO day 1 . http://music.google.com/about/
US only và free nhé . Dùng proxy hoặc sock đề vào

Content in the cloud:

  • Currently: apps and books
  • New: Google Music Beta. [4]
    • Upload via app (on Windows and Mac)
    • Up to 20,000 songs.
    • Free while in beta.
    • Play music via web or Android app.
    • Offline: automatic caching of recently played music. Manually mark artists, albums, or playlists, for offline use.
  • New: movies, including rentals. They can be “pinned” (cached) for offline use.

Tags:

 
0

HTTPs có dấu cả request path không?

Posted by datgs on May 6, 2011 in php

Chào các bác,

Em có một liên kết như sau: https://domain.com/private/75415d70-79e3-11e0-819a-0800200c9a66

Em muốn hỏi là request này có mã hóa cái đoạn /private/75415d70-79e3-11e0-819a-0800200c9a66 trước khi chuyển đi không?

Sau mấy ngày tìm hiểu hỏi han khắp nơi. Em nhận được câu trả lời là có.

Tags: , ,

 
0

Task Queues with google app engine

Posted by chinhvd on Apr 27, 2011 in java, web server

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.

 
2

HANOI MOBILE DAY 201

Posted by ngocbd on Apr 27, 2011 in php
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

Copyright © 2012 $i->php(); All rights reserved. Site Safe Rank page rank domain i-php.net Java Blackbelt