Thứ Sáu, 30 tháng 4, 2010

So sánh về hiệu năng giữa MongoDB và SQLServer 2008

MongoDB -> đọc ở đây

Chưa biết về SQLServer 2008 -> đọc ở đây

---

Kết quả là

  • MongoDB có hiệu năng tốt hơn SQLServer 2008 một trăm (100) lần.

  • MongoDB cần ít tài nguyên & phần cứng máy chủ để triển khai hơn so với cùng yêu cầu truy vấn.

  • Tốc độ query gấp vài chục đến vài trăm lần.

  • Xử lý dữ liệu lớn cũng vẫn ngon hơn.


Tham khảo:

http://www.michaelckennedy.net/blog/2010/04/29/MongoDBVsSQLServer2008PerformanceShowdown.aspx

Thứ Năm, 22 tháng 4, 2010

Security sandbox violation

Nhờ admin xem giùm:

- Upload ảnh xong không thấy hiện ra gì?

Khi viết flash application, bạn có thể gặp lỗi sau:
Error #2048: Security sandbox violation:...swf cannot load data from...

Với flash phiên bản mới hiện nay, lỗi trên có thể gặp ngay cả khi flash lấy dữ liệu từ cùng domain (vd: trường hợp flash lấy dữ liệu qua socket).
Định nghĩa file cross-domain policy file của adobe:

workflow


Như vậy flash từ domain a.com muốn lấy dữ liệu của b.com thì phải được b.com cho phép. Thông thường  file cross-domain-policy.xml được  đặt ở root của b.com.

Policy file xác định loại dữ liệu, xác  định các domain được phép truy cập.

Trường hợp socket server hosts policy file: Trong trường hợp flash a.com lấy dữ liệu qua socket với server b.com, mỗi khi lấy dữ liệu, flash sẽ gửi một single node XML document chứa <policy-file-request /> tới server. Socket server sẽ trả về policy file cần thiết về flash, flash dựa vào đó để xác định tiếp tục được lấy dữ liệu, hay đóng kết nối. Adobe dành cổng 843 làm cổng mặc định để flash gửi request và lắng nghe policy file trả về.  Do đó mỗi khi có request từ flash với server, nếu ở server lắng nghe ở cổng 843 sẽ nhận được dòng "<policy-file-request />" nói trên.

Dưới đây là một mẫu code policy server nhặt được trong dự án game tá lả (có vấn đề đâu không chịu tránh nhiệm , có gì thì cứ đè đại ka ra ;)) )

Viết bằng perl:
#!/usr/bin/perl
#
# policyd.pl
# Simple socket policy file server
#
# Usage: policyd.pl [--port=N] --file=FILE
# Logs to stdout
#

use strict;
use Socket;

my $NULLBYTE = pack( 'c', 0 );

my $port = 843;
my $filePath;
my $content;

### READ ARGS

while ( my $arg = shift @ARGV )
{
if ( $arg =~ m/^--port=(\d+)$/ )
{
$port = $1;
}
elsif ( $arg =~ m/^--file=(.*)/ )
{
$filePath = $1;
}
}

unless ( $filePath )
{
die "Usage: policyd.pl [--port=N] --file=FILE\n";
}

### READ FILE

-f $filePath or die "No such file: '$filePath'\n";
-s $filePath < 10_000 or die "File probably too large to be a policy file: '$filePath'\n";

local $/ = undef;
open POLICYFILE, "<$filePath" or die "Can't open '$filePath': $!\n";
$content = <POLICYFILE>;
close POLICYFILE;

$content =~ m/cross-domain-policy/ or die "Not a valid policy file: '$filePath'\n";

### BEGIN LISTENING

socket( LISTENSOCK, PF_INET, SOCK_STREAM, getprotobyname( 'tcp' ) ) or die "socket() error: $!";
setsockopt( LISTENSOCK, SOL_SOCKET, SO_REUSEADDR, pack( 'l', 1 ) ) or die "setsockopt() error: $!";
bind( LISTENSOCK, sockaddr_in( $port, INADDR_ANY ) ) or die "bind() error: $!";
listen( LISTENSOCK, SOMAXCONN ) or die "listen() error: $!";

print STDOUT "\nListening on port $port\n\n";

### HANDLE CONNECTIONS

while ( my $clientAddr = accept( CONNSOCK, LISTENSOCK ) )
{
my ( $clientPort, $clientIp ) = sockaddr_in( $clientAddr );
my $clientIpStr = inet_ntoa( $clientIp );
print STDOUT "Connection from $clientIpStr:$clientPort\n";

local $/ = $NULLBYTE;
my $request = <CONNSOCK>;
chomp $request;

if ( $request eq '<policy-file-request/>' )
{
print STDOUT "Valid request received\n";
}
else
{
print STDOUT "Unrecognized request: $request\n\n";
close CONNSOCK;
next;
}

print CONNSOCK $content;
print CONNSOCK $NULLBYTE;
close CONNSOCK;

print STDOUT "Sent policy file\n\n";
}

# End of file.

Cái này bằng python:
#!/usr/bin/env python
#
# flashpolicyd.py
# Simple socket policy file server for Flash
#
# Usage: flashpolicyd.py [--port=N] --file=FILE
#
# Logs to stderr
# Requires Python 2.5 or later

from __future__ import with_statement

import sys
import optparse
import socket
import thread
import exceptions
import contextlib

VERSION = 0.1

class policy_server(object):
def __init__(self, port, path):
self.port = port
self.path = path
self.policy = self.read_policy(path)
self.log('Listening on port %d\n' % port)
try:
self.sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
except AttributeError:
# AttributeError catches Python built without IPv6
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error:
# socket.error catches OS with IPv6 disabled
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.sock.bind(('', port))
self.sock.listen(5)
def read_policy(self, path):
with file(path, 'rb') as f:
policy = f.read(10001)
if len(policy) > 10000:
raise exceptions.RuntimeError('File probably too large to be a policy file',
path)
if 'cross-domain-policy' not in policy:
raise exceptions.RuntimeError('Not a valid policy file',
path)
return policy
def run(self):
try:
while True:
thread.start_new_thread(self.handle, self.sock.accept())
except socket.error, e:
self.log('Error accepting connection: %s' % (e[1],))
def handle(self, conn, addr):
addrstr = '%s:%s' % (addr[0],addr[1])
try:
self.log('Connection from %s' % (addrstr,))
with contextlib.closing(conn):
# It's possible that we won't get the entire request in
# a single recv, but very unlikely.
request = conn.recv(1024).strip()
if request != '<policy-file-request/>\0':
self.log('Unrecognized request from %s: %s' % (addrstr, request))
return
self.log('Valid request received from %s' % (addrstr,))
conn.sendall(self.policy)
self.log('Sent policy file to %s' % (addrstr,))
except socket.error, e:
self.log('Error handling connection from %s: %s' % (addrstr, e[1]))
except Exception, e:
self.log('Error handling connection from %s: %s' % (addrstr, e[1]))
def log(self, str):
print >>sys.stderr, str

def main():
parser = optparse.OptionParser(usage = '%prog [--port=PORT] --file=FILE',
version='%prog ' + str(VERSION))
parser.add_option('-p', '--port', dest='port', type=int, default=843,
help='listen on port PORT', metavar='PORT')
parser.add_option('-f', '--file', dest='path',
help='server policy file FILE', metavar='FILE')
opts, args = parser.parse_args()
if args:
parser.error('No arguments are needed. See help.')
if not opts.path:
parser.error('File must be specified. See help.')

try:
policy_server(opts.port, opts.path).run()
except Exception, e:
print >> sys.stderr, e
sys.exit(1)
except KeyboardInterrupt:
pass

if __name__ == '__main__':
main()

Một ví dụ về policy file (không nên dùng :D)
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "/xml/dtds/cross-domain-policy.dtd">
<!-- Policy file for xmlsocket://socks.example.com -->
<cross-domain-policy>
<!-- This is a master socket policy file -->
<site-control permitted-cross-domain-policies="all"/>
<!-- Instead of setting to-ports="*", administrator's can use ranges and commas -->
<allow-access-from domain="*" to-ports="*" />
</cross-domain-policy>

Thứ Hai, 12 tháng 4, 2010

Tạo MediaHelper trong CakePHP

Hi, hôm nay mình xin mạn phép post 1 bài để share Helper này cho mọi người.

Thật sự thì công việc này cũng rất dễ dàng nhưng sẽ rất mất thời gian nếu bạn có ý định làm 1 website chia sẻ nhạc, hình ảnh, các clip hay...

- Tại sao lại mất thời gian?

xin trả lời: nếu bạn không tạo 1 function  thì tại mỗi trang bạn muốn hiển thị ảnh, clip nhạc. Công việc phải làm của bạn lúc này là :

  • lấy tên file.

  • kiểm tra file tồn tại không.

  • kiểm tra định dạng file.

  • hiển thị.


Vậy, chỉ có 1 việc mà phải copy, parse ra từng trang 1 làm j` cho khổ. Hãy tạo cho website của bạn 1  file media.php trong helper có nội dung như sau:
<?php
class MediaHelper extends AppHelper {

/**
* @author tungnd
* @return embed or img tag.
* */

function create($file_name,$w = null,$h = null)    {
// tao duong dan file
$path = WWW_ROOT . 'img' . DS. $file_name;
// kiem tra file co ton tai ko
if (file_exists($path)) {
// lay thong tin file
$path_info = pathinfo($path);
// kiem tra dinh dang file (image)
if ($path_info['extension'] == 'jpg' || $path_info['extension'] == 'gif' || $path_info['extension'] == 'png')    {
$obj = '<img height="'.$h.'" width="'.$w.'" border="0" src="img/'.$file_name.'"/>';
}
else if ($path_info['extension'] == 'swf' )    {
$obj = '<embed src="img/'.$file_name.'" quality="high" bgcolor="#ffffff" width="'.$w.'" height="'.$h.'" name="Untitled.swf" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash" autostart="true" pluginspage="http://www.macromedia.com/go/getflashplayer">';
}
else if ( $path_info['extension'] == 'mp3' || $path_info['extension'] == 'wma')    {
$obj = '<embed type="application/x-mplayer2"
Autostart="1"
Pluginspage="http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=6,0,0,0"
Src="img/'.$file_name.'"
Showstatusbar="1"
Showcontrols="1"
Showdisplay="1"
Showaudiocontrol="1"
Enablecontextmenu="0"
Enabled="1"
Autorewind="1"
Volume="100"
AudioStream="1"
AutoSize="1"
AnimationAtStart="-1"
AllowScan="-1"
AllowChangeDisplaySize="-1"
Balance="0"
BufferingTime="5"
CaptioningID="5"
ClickToPlay="-1"
CursorType="0"
CurrentPosition="-1"
CurrentMarker="0"
DisplayBackColor="0"
DisplayForeColor="16777215"
DisplayMode="0"
DisplaySize="4"
EnablePositionControls="-1"
EnableFullScreenControls="0"
EnableTracker="-1"
InvokeURLs="-1"
Language="-1"
Mute="0"
PreviewMode="0"
Rate="1"
SelectionStart="-1"
SelectionEnd="-1"
SendOpenStateChangeEvents="-1"
SendWarningEvents="-1"
SendErrorEvents="-1"
SendKeyboardEvents="0"
SendMouseClickEvents="0"
SendMouseMoveEvents="0"
SendPlayStateChangeEvents="-1"
ShowCaptioning="0"
ShowGotoBar="0"
ShowTracker="-1"
TransparentAtStart="0"
VideoBorderWidth="0"
VideoBorderColor="0"
VideoBorder3D="0"
WindowlessVideo="0"
Width="300">';
}
else    {
$obj = 'Sai định dạng file. ';
}
}
else    {
$obj = 'Không tìm thấy file yêu cầu. ';
}
return $obj;
}

}
?>

Bây giờ, khi muốn hiển thị ảnh, clip nhạc của bạn tại views thì chỉ việc:
<?php echo $media->create('tenfile.dinhdang','chieu rong','chieu cao'); ?>

// chieu rong va chieu cao co the de trong.

Ở đây tôi chỉ xét các file: jpg, gif, png, swf, mp3, wma. Nếu dự án của bạn cần hiển thị 1 vài định dạng file khác thì hãy thêm các else if, nhiều quá thì chuyển code sang switch- case cho dễ nhìn.