Thứ Hai, 31 tháng 8, 2015
FULL TEXT Searching In MySQL
I've been wanting to add a search feature to wp-click-track for a while now. After almost a year of writing 150 posts I have a lot of links; so many in fact that it's getting a little tough finding the links I want when I want them. I've written a few search engines in my time (some actually pretty good and some that just plain sucked) and thought this would be a simple addition to the program.
Boy, was I right.
Real quick; I'm going to be referencing a MySQL table below. Here's the SQL to create that table:
CREATE TABLE tracking_links ( `link_id` int(10) NOT NULL auto_increment, `link_title` varchar(255) NOT NULL default '', `link_desc` text NOT NULL, `link_destination` varchar(255) NOT NULL default '', `link_total_clicks` int(10) NOT NULL default '0', `link_unique_clicks` int(10) NOT NULL default '0', `creation_date` datetime NOT NULL default '0000-00-00 00:00:00', `last_modified` datetime NOT NULL default '0000-00-00 00:00:00', PRIMARY KEY (`link_id`) )
The traditional, no frills, way easy path, would be to build a basic "LIKE" query and attach it to a single text field. The queries would then look like this:
SELECT * FROM tracking_links WHERE link_title LIKE '%$_search%'
If you don't already know; the above query would match all the links with a title that has the string $_search anywhere within the column.The percent character (%) is a wild card; sandwiching $_search like it is basically says "Grab me everything that has this string anywhere within the column".
The above is the lowest of the low when it comes to elegance of design and sheer awesomeness though. It's pretty much the amateur version of a search mechanism.
For one thing performance is going to be an issue when dealing with a lot of rows in the table. The speed on a query like the above, even with an index on the "link_title" column, is going to crumble once you get more than a couple hundred thousand rows because the MySQL has to do a full table scan.
Another issue is that relevancy is completely absent. There's no way to remove elements or, really, do any boolean matching. You're going to get results that just seem... off.
If I want to search against multiple columns the SQL just gets horrifying:
SELECT * FROM tracking_links WHERE link_title LIKE '%$_search1%' OR link_destination LIKE '%$_search2% OR...'
And then there's the accompanying form for a query like the above. Traditionally, it would be x form fields for each column; in the case of wp-click-track that would be 3 individual fields. This would pretty much destroy the plugin interface or, worse, require a separate, dedicated, search page.
The answer to those problems is full text search. According to Wikipedia :
In a full text search, the search engine examines all of the words in every stored document as it tries to match search words supplied by the user.
This is a difficult concept to grasp, especially for someone coming from the LIKE camp; I know it took me a little bit to get it fully. Here are a couple notes that should help:
- String to search must be longer than 3 characters long.
- DB Type must be MyISAM
- Don't try for individual search fields
ex: SELECT * FROM table WHERE col1 = '$col1' AND col2 = '$col2'
instead
Have all fields setup as a single Fulltext field.
ex: SELECT table.* , MATCH (col1, col2, col3) AGAINST ('+( $text1) -($text2)') AS Score FROM table WHERE MATCH (col1, col2, col3) AGAINST ('+( $text1) -($text2)' IN BOOLEAN MODE) - IN BOOLEAN MODE is required for queries with the '-' attribute.
- Algorithm for relevance is:
w = (log(dtf)+1)/sumdtf * U/(1+0.0115*U) * log((N-nf)/nf)
Using fulltext searching allows your site users to do Google style searching like so:
+php -mysql +sqlite +temp*
The above search query breaks down to "Grab everything with "php", without "mysql" but with "sqlite" and any word that begins with "temp". Pretty snazzy and useful if your users are savvy in how to search effectively. Hell, even without knowing how to perform boolean searches the above is still useful and makes your code waycleaner.
In order to implement fulltext searching the table has to be setup with the MyISAM engine and a fulltext index has to be defined. To change a table to use the MyISAM engine just run the below query:
ALTER TABLE tracking_links ENGINE = MYISAM
To add a fulltext index you create it like so:
ALTER TABLE tracking_links ADD FULLTEXT search_index (link_title,link_desc,link_destination)
The complete fulltext search query for the above query (+php -mysql +sqlite +temp*) example would look like:
SELECT * FROM tracking_links MATCH(link_title,link_desc,link_destination) AGAINST('+php -mysql +sqlite +temp*' IN BOOLEAN MODE);
There's one other feature worth mentioning; the Score option. The Score
SELECT *, MATCH(link_title,link_desc,link_destination) AGAINST('+php -mysql +sqlite +temp*' IN BOOLEAN MODE) AS SCORE FROM tracking_links MATCH(link_title,link_desc,link_destination) AGAINST('+php -mysql +sqlite +temp*' IN BOOLEAN MODE);
The above query will return all the rows as well as the relevance of the column to the dataset. On initial inspection the number won't make much sense; it's usually something like 0.9843949302 and 2.9408509384 which is, admittedly, pretty useless by itself. But, using a simple formula you can turn it into something pretty relevant:
Using the above code against a SCORE of .9823475 results in a $score of 98.2% which is a simple way to let your users know the result is relevant.
As the above, hopefully, demonstrates FULL TEXT searching with MySQL is easy and adds an extra layer of awesome and fun to an application.
Chủ Nhật, 30 tháng 8, 2015
How to Install ImageMagick on CentOS, RHEL and Ubuntu
ImageMagick is a software suite to create, edit, compose, or convert bitmap images. It can read and write images in a variety of formats like GIF, JPEG, PNG, Postscript, and TIFF. We can also use ImageMagick to resize, flip, mirror, rotate, distort, shear and transform images, adjust image colors, apply various special effects, or draw text, lines, polygons, ellipses and Bézier curves.
ImageMagick is typically used from command line. Also we can use it from any programming language by using its interface like Magick.NET (.Net),IMagick (PHP), PerlMagick (Perl) etc.
Step 1. Install Required Packages
First we need to install required packages in order to install ImageMagic and IMagick PHP extension.
For CentOS,RHEL Users:
# yum installgcc php-devel php-pear
For Ubuntu Users:
$ sudo apt-getinstall gcc
Step 2. Install ImageMagick
After installing required packages, let’s install ImageMagick using following command.
For CentOS,RHEL Users:
# yuminstall ImageMagick ImageMagick-devel
For Ubuntu Users:
$ sudo apt-getinstall imagemagick
Step 3. Install ImageMagick PHP Extension
At this point you have successfully installed ImageMagick package on your system. Now are are going to install ImageMagick php extension, So that we can use it through php code.
For CentOS,RHEL Users:
# peclinstall imagick # echo "extension=imagick.so " > /etc/php.d/imagick.ini
For Ubuntu Users:
$ sudo apt-getinstall php5-imagick
Step 4. Restart Apache and Check Extension
After completing above steps you need to reload apache service to enable php exension using following command
CentOS,RHEL Users: # service httpd reloadUbuntu Users: # service apache2 reload
Siêu thị đã lừa bạn như thế nào?
Có lẽ như những người đàn ông bị phụ nữ phàn nàn vì không biết đi mua sắm lại thường là những người thông minh và tránh được những trò thao túng của Siêu Thị nhất: ”Ghi ra danh sách cần mua và mua đúng những thứ đó”.
1. Bắt đầu với xe đẩy. Phát minh năm 1938 này được thiết kế với mục đích ‘giúp’ khách hàng mua nhiều hàng hơn, với kích cỡ lớn hơn. Vì sao? Thử nghĩ tới lúc bạn đẩy xe đẩy trống trơn tới quầy tính tiền, bên trong chỉ có một chai ...dầu gội đầu? Và đúng lúc ấy, có khá đông người xung quanh cũng đang tính tiền. Ahh, bạn biết rồi đấy. Tính ghen tỵ và cái tôi của con người làm họ so sánh mình với người xung quanh. Một mẹo quá đơn giản và dễ hiểu.
2. Và mùi hương đầu tiên bạn thường cảm thấy chính là mùi Bánh mì. Theo nghiên cứu, mùi bánh mì sẽ đánh tan cảm giác xa lạ và đề phòng xung quanh của bạn. Một khi bạn cảm thấy thoải mái, bạn sẽ dễ chi tiền và nghe theo lời người khác hơn. Tất nhiên, điều trên cũng áp dụng với Hoa. Có khi nào bạn tự hỏi tại sao Siêu thị lại bán hoa không?
3. Bạn sẽ chẳng bao giờ nhận ra rằng, tại sao Siêu thị lại để những đồ nhu yếu phẩm, đồ ăn, sữa, trứng… ở góc tường và thướng nằm cuối siêu thị không? Để bạn phải đi qua hêt Siêu thị. Sẽ có cơ hội bạn bị bắt mắt bởi một hàng hóa nào đó khác.
4. Ở Việt Nam và nhiều nước có thói quen và hành vi lái xe bên phải cũng ảnh hưởng tới bạn. Đó là lý do bạn nên để ý tại sao những sản phẩm dễ bán được nhất chính là những sản phẩm nằm bên kệ hàng hóa bên tay phải của bạn. Và Siêu thị sẽ tính phí cao hơn hoặc để những sản phẩm có tính chiến lược hơn nằm bên tay phải của từng kệ hàng hóa.
5. Bạn cao 1m7??? Siêu thị sẽ tính chiều cao trung bình của bạn để đặt những hàng hóa vừa tầm mắt. Và đây cũng là kệ hàng hóa của những mặt hàng có giá trị đắt hơn so với kệ dưới hoặc trên của nó.
6. Những đứa trẻ to xác sẽ để ý điều này đây. Những mặt hàng dành cho trẻ con thường nằm thấp xuống phía dưới (như sôcôla, kẹo, bánh…) nhằm thu hút chúng.
7. Lớn hay nhỏ có tác động đấy. Ở những siêu thị đông người, mọi người thường shopping ngắn hơn, mua ít hơn và dễ nổi điên. Bạn muốn đi Siêu thị to hay nhỏ?
8. Màu ấm thu hút bạn đến cửa hàng và màu mát mẻ lại khiến bạn mua hàng nhiều hơn. Ngày mai bạn ghé thử Siêu thị và chú ý xem, bạn sẽ thấy ngay đấy!
9. Âm nhạc? Nghiên cứu chứng minh được rằng nhạc nhẹ và chậm khiến khách hàng ở lại lâu hơn và mua nhiều hơn. Thêm nữa, nhạc cổ điển có tác dụng mạnh nhất trong trường hợp này và khiến người mua sẽ mua hàng đắt hơn. Âm nhạc quá lớn hay quá nhanh sẽ khiến khách hàng từ bỏ bạn.
10. Khi đang chờ thanh toán, bạn bị buộc phải dừng lại. Đó là lý do tại sao ngay khu vực thanh toán thường trưng bày bánh kẹo, sing gum, dao cạo râu, tạp chí… Họ có thể mua nhanh vì nó rẻ và tiện.
11. Và cuối cùng, thẻ Khách Hàng Thân Thiết của bạn có tác dụng theo dõi hành vi và phân tích thói quen mua sắm của bạn.
1. Bắt đầu với xe đẩy. Phát minh năm 1938 này được thiết kế với mục đích ‘giúp’ khách hàng mua nhiều hàng hơn, với kích cỡ lớn hơn. Vì sao? Thử nghĩ tới lúc bạn đẩy xe đẩy trống trơn tới quầy tính tiền, bên trong chỉ có một chai ...dầu gội đầu? Và đúng lúc ấy, có khá đông người xung quanh cũng đang tính tiền. Ahh, bạn biết rồi đấy. Tính ghen tỵ và cái tôi của con người làm họ so sánh mình với người xung quanh. Một mẹo quá đơn giản và dễ hiểu.
2. Và mùi hương đầu tiên bạn thường cảm thấy chính là mùi Bánh mì. Theo nghiên cứu, mùi bánh mì sẽ đánh tan cảm giác xa lạ và đề phòng xung quanh của bạn. Một khi bạn cảm thấy thoải mái, bạn sẽ dễ chi tiền và nghe theo lời người khác hơn. Tất nhiên, điều trên cũng áp dụng với Hoa. Có khi nào bạn tự hỏi tại sao Siêu thị lại bán hoa không?
3. Bạn sẽ chẳng bao giờ nhận ra rằng, tại sao Siêu thị lại để những đồ nhu yếu phẩm, đồ ăn, sữa, trứng… ở góc tường và thướng nằm cuối siêu thị không? Để bạn phải đi qua hêt Siêu thị. Sẽ có cơ hội bạn bị bắt mắt bởi một hàng hóa nào đó khác.
4. Ở Việt Nam và nhiều nước có thói quen và hành vi lái xe bên phải cũng ảnh hưởng tới bạn. Đó là lý do bạn nên để ý tại sao những sản phẩm dễ bán được nhất chính là những sản phẩm nằm bên kệ hàng hóa bên tay phải của bạn. Và Siêu thị sẽ tính phí cao hơn hoặc để những sản phẩm có tính chiến lược hơn nằm bên tay phải của từng kệ hàng hóa.
5. Bạn cao 1m7??? Siêu thị sẽ tính chiều cao trung bình của bạn để đặt những hàng hóa vừa tầm mắt. Và đây cũng là kệ hàng hóa của những mặt hàng có giá trị đắt hơn so với kệ dưới hoặc trên của nó.
6. Những đứa trẻ to xác sẽ để ý điều này đây. Những mặt hàng dành cho trẻ con thường nằm thấp xuống phía dưới (như sôcôla, kẹo, bánh…) nhằm thu hút chúng.
7. Lớn hay nhỏ có tác động đấy. Ở những siêu thị đông người, mọi người thường shopping ngắn hơn, mua ít hơn và dễ nổi điên. Bạn muốn đi Siêu thị to hay nhỏ?
8. Màu ấm thu hút bạn đến cửa hàng và màu mát mẻ lại khiến bạn mua hàng nhiều hơn. Ngày mai bạn ghé thử Siêu thị và chú ý xem, bạn sẽ thấy ngay đấy!
9. Âm nhạc? Nghiên cứu chứng minh được rằng nhạc nhẹ và chậm khiến khách hàng ở lại lâu hơn và mua nhiều hơn. Thêm nữa, nhạc cổ điển có tác dụng mạnh nhất trong trường hợp này và khiến người mua sẽ mua hàng đắt hơn. Âm nhạc quá lớn hay quá nhanh sẽ khiến khách hàng từ bỏ bạn.
10. Khi đang chờ thanh toán, bạn bị buộc phải dừng lại. Đó là lý do tại sao ngay khu vực thanh toán thường trưng bày bánh kẹo, sing gum, dao cạo râu, tạp chí… Họ có thể mua nhanh vì nó rẻ và tiện.
11. Và cuối cùng, thẻ Khách Hàng Thân Thiết của bạn có tác dụng theo dõi hành vi và phân tích thói quen mua sắm của bạn.
Thứ Bảy, 29 tháng 8, 2015
Thứ Năm, 27 tháng 8, 2015
Aligning a float:left div to center?
We are living in 2015 now and CSS Flexbox is well supported. Go here for a good tutorial on flexbox.
This works fine in all newer browsers:
#container {
display: flex;
display: -webkit-flex; /* Safari */
flex-wrap: wrap;
-webkit-flex-wrap: wrap; /* Safari */
justify-content: center;
-webkit-justify-content: center; /* Safari */
}
.block {
width: 150px;
height: 150px;
background-color: #cccccc;
margin: 10px;
}
<div id="container">
<div class="block">1</div>
<div class="block">2</div>
<div class="block">3</div>
<div class="block">4</div>
<div class="block">5</div>
</div>
Thứ Tư, 26 tháng 8, 2015
[Encode/Decode] Mã hóa chuỗi unicode trong PHP
Mã hóa chuỗi unicode
Trường hợp bạn cần viết một chuỗi unicode được mã hóa mà không được sử dụng trực tiếp ký tự unicode vào code. Cách này đặc biệt hữu dụng trong việc sửa đổi bytecode của java để hiển thị tiếng việt.
Vậy thì làm thế nào?
Sử dụng hàm
Vậy thì làm thế nào?
Sử dụng hàm
json_encode sẽ giúp bạn tìm ra chuỗi mã hóa unicode.
1
2
| header('content-type:application/json'); #or text/plainecho json_encode(array('fullname'=>'hoang','address'=>'An Giang','LoanType'=>'Vay theo lương')); |
Kết quả ra chuỗi json thế này chứa các kỹ tự unicode mã hóa giống như thế này.
1
| [{"fullname":"hoang","address":"An Giang","loanType":"Vay theo l\u01b0\u01a1ng"}] |
Để hiển thị chuỗi giải mã đọc được từ ký tự unicode mã hóa bởi json_encode, chúng ta gọi hàm json_decode
1
| print_r(json_decode('["Vay theo l\u01b0\u01a1ng"]')); |
Kết quả chuyển thành mảng có chứa ký tự đã giải mã:
1
| Array ( [0] => Vay theo lương ) |
unescape unicode
Nếu bạn muốn hiển thị chuỗi unicode về phía người dùng như đầu vào, có thể đọc được hay nghĩa là đã giải mã, thì thêm tham số
Nếu bạn muốn hiển thị chuỗi unicode về phía người dùng như đầu vào, có thể đọc được hay nghĩa là đã giải mã, thì thêm tham số
JSON_UNESCAPED_UNICODE vào hàm json_encode. Ví dụ:
1
| json_encode(array('fullname'=>'hoàng'),JSON_UNESCAPED_UNICODE); |
Hiển thị nguyên ký tự unicode như đầu vào.
Cách khác cho kết quả tương tự như vậy, chúng ta mã hóa dạng entity trước khi gọi json_encode và decode entity sau khi được chuỗi json.
1
2
3
4
5
6
7
8
9
10
| <?php###same way$array = array('nome'=>'Paição','cidade'=>'São Paulo');$array = array_map('htmlentities',$array);//encode$json = html_entity_decode(json_encode($array));//Output: {"nome":"Paição","cidade":"São Paulo"}echo $json;?> |
Một số kiểu encoding có thể sử dụng
MD5 converter
SHA1 converter
Chatset converter / iconv
Base64 encode
Base64 decode
UTF8 encode
UTF8 decode
Raw url encode
Raw url decode
HTML entities encode
HTML entities decode
Unix Time to Human Date
Human Date to Unix Time Stamp
Remove duplicate lines
Sort text lines
Pirate Text
Backwards – Mirrored Text
SHA1 converter
Chatset converter / iconv
Base64 encode
Base64 decode
UTF8 encode
UTF8 decode
Raw url encode
Raw url decode
HTML entities encode
HTML entities decode
Unix Time to Human Date
Human Date to Unix Time Stamp
Remove duplicate lines
Sort text lines
Pirate Text
Backwards – Mirrored Text
Sử dụng công cụ chuyển đổi encoding/decoding chuỗi online:
http://www.cafewebmaster.com/online_tools/utf8_encode.
http://www.cafewebmaster.com/online_tools/utf8_encode.
Mã hóa đối tượng
Nhiều lúc việc mã hóa mảng thành chuỗi json không tiện cho lắm, dễ bị người khác đọc dữ liệu vì tính bảo mật. Có một cách khác giúp bạn mã hóa mọi đối tượng thành kiểu chuỗi, và WordPress cũng đã sử dụng cách mã hóa các đối tượng của nó với kiểu này.
Bằng cách sử dụng hàm
serialize() để mã hóa đối tượng và hàm ngược unserialize()sẽ biến nội dung kiểu chuỗi được mã hóa bởi serialize() thành chính object trước đó.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| <?php$data = array('name'=>"Hoang", "old"=>24);var_dump($data); /* array 'name' => string 'Hoang' (length=5) 'old' => int 24*/// Serialize array $data$text_serialize = serialize($data); var_dump($text_serialize); /* string 'a:2:{s:4:"name";s:3:"Hoang";s:3:"old";i:24;}' (length=44) */// Unserialize array $data$data_unserialize = unserialize($text_serialize);var_dump($data_unserialize);/* array 'name' => string 'Hoang' (length=5) 'old' => int 24*/?> |
Như ví dụ trên, ta thấy array $data được Serialize thành chuỗi:
1
| a:2:{s:4:"name";s:3:"Hoang";s:3:"old";i:24;} |
Rất tiện cho các bạn lưu các đối tượng PHP vào Database.
Lưu ý: Ta có thể sử dụng serialize() và unserialize() cho mọi đối tượng PHP: object, array, base object,…
Lưu ý: Ta có thể sử dụng serialize() và unserialize() cho mọi đối tượng PHP: object, array, base object,…
Trong WordPress có viết hàm giúp bạn kiểm tra một chuỗi được tạo bởi serialize từ một đối tượng, trước khi sử dụng hàm giải mã đối tượng unserialize bạn nên kiểm tra có hợp lệ không với hàm is_serialized của wordpress. Hàm này mình trích dẫn có sẵn trong wordpress rồi nhé:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| <?php//I didn't write this code, it's from WordPress actuallyfunction is_serialized( $data ) { // if it isn't a string, it isn't serialized if ( !is_string( $data ) ) return false; $data = trim( $data ); if ( 'N;' == $data ) return true; if ( !preg_match( '/^([adObis]):/', $data, $badions ) ) return false; switch ( $badions[1] ) { case 'a' : case 'O' : case 's' : if ( preg_match( "/^{$badions[1]}:[0-9]+:.*[;}]\$/s", $data ) ) return true; break; case 'b' : case 'i' : case 'd' : if ( preg_match( "/^{$badions[1]}:[0-9.E-]+;\$/", $data ) ) return true; break; } return false;}?> |
Cách sử dụng:
1
2
3
| if(is_serialized($str)){ var_dump(unserialize($str));} |
Chú ý: bạn không thể mã hóa hàm bằng serialize là không cho phép. Ngoài cách sử dụng hàm is_serialize của wordpress có thể dùng trực tiếp hàm có khả năng giải mã chuỗi thành đối tượng hay không:
1
2
3
4
5
6
7
| //Check to see if a string is serialized?$data = @unserialize($str);if ($str === 'b:0;' || $data !== false) { echo "ok";} else { echo "not ok";} |
Bạn có thể kết hợp giữa kiểu mã hóa mảng với serialize và base64, bảo mật 100% khiến người dùng không thể đọc chuỗi mã hóa cuối cùng của mảng.
1
2
3
4
5
| //best way to encode array use combination of base64 & serialize$safe_string_to_store = base64_encode(serialize($multidimensional_array));//to unserialize...$array_restored_from_db = unserialize(base64_decode($safe_string_to_store)); |
Đăng ký:
Nhận xét (Atom)


