Archive

Posts Tagged ‘C++’

Mathematical expression eval

September 7th, 2009 Fu4ny 2 comments

1 bài viết nho nhỏ trong stackoverflow, đơn giản chỉ là 1 cái challenge nho nhỏ để thi xem ai viết ngắn gọn và tối ưu nhất bài toán: nhập vào 1 dãy phép tính kiểu string và trả lại kết quả.

Ờ thì mọi chuyện vẫn bình thường như thế ( bài toán dễ ẹc =)) ), nếu ko có bài viết này ;)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
static string Calc(string exp)
{
    WebRequest request = WebRequest.Create("http://google.com/search?q=" + 
                                           HttpUtility.UrlDecode(exp));
    using (WebResponse response = request.GetResponse())
    using (Stream dataStream = response.GetResponseStream())
    using (StreamReader reader = new StreamReader(dataStream))
    {
        string r = reader.ReadToEnd();
        int start = r.IndexOf(" = ") + 3;
        int end = r.IndexOf("< ", start);
        return r.Substring(start, end - start);
    }
}

Mặc dù hơi tricky, nhưng mà just take a look ;))

Categories: Post Tags: , ,

Singleton class, nó là gì ?

June 18th, 2009 Fu4ny No comments

Bạn đã nghe thấy thuật ngữ Singleton class ? Đó là 1 class mà trong toàn bộ chương trình chúng ta chỉ có thể tạo 1 "instance" ( thực thể ) duy nhất của nó.

Với bài viết này, tôi mong các bạn có 1 cái nhìn tổng quan về Singleton class, và cách cài đặt nó trong Java và C++.

Đầu tiên là về ý tưởng.

Đối với Singleton class, thì chương trình chỉ được phép tạo 1 instance duy nhất của nó, vì vậy

  1. Constructor của class là private
  2. Class phải có reference ( tham chiếu ) đến cái instance duy nhất đó, tức là chúng ta dùng 1 tham chiếu tới class = 1 biến static
  3. Do ko có constructor public, nên ta cần có 1 phương thức để khởi tạo class.

Đó là các yêu cầu dành cho Java.

Giả sử chúng ta xây dựng 1 class SingleTon trong Java.
Đúng tinh thần phải có 1 tham chiếu đến thực thể duy nhất, ta tạo 1 biến static. Và đương nhiên là 1 constructor thuộc tính private. Trong constructor này bạn cài đặt như bạn muốn.

1
2
3
4
public class SingleTon {
    private static SingleTon _singleRef = new SingleTon();
    private SingleTon() {};
}

Tiếp theo là 1 hàm getInstance để lấy địa chỉ của thực thể của class đó.

1
2
3
4
5
6
7
8
9
10
11
12
13
public class SingleTon {
	private static SingleTon _singleRef = new SingleTon();
	private SingleTon() {};
	public static SingleTon getInstance() {
		if ( _singleRef == null ) {
			_singleRef = new SingleTon();
		}
		return _singleRef;
	}
	public void sayHello () {
		System.out.println("Hello! I'm the one!");
	}
}

Giải thích: nếu tham chiếu chưa chỉ đến vùng nhớ nào, thì ta tạo 1 thực thể mới ( thực ra việc này để đảm bảo rằng instance luôn có ). Nếu nó đã trỏ đến 1 vùng nhớ thì ta trả giá trị vùng nhớ.

Sử dụng nó thế nào ? Có 2 cách
1. Tạo class trỏ đến vùng nhớ

1
2
3
4
5
public static void main(String[] args) {
	SingleTon obj = SingleTon.getInstance();
	if ( obj == null ) System.err.println("Cannot creat instance");
	obj.sayHello();
}

2. Sử dụng trực tiếp không qua khai báo

1
2
3
public static void main(String[] args) {
	SingleTon.getInstance().sayHello();
}

Đây là toàn bộ cài đặt dành cho Java, cài đặt cho C++ có 1 vài cái khác phức tạp hơn mà tôi sẽ trình bày ở trang sau

Categories: Post Tags: , ,

Match Demo Report: Logo

March 10th, 2009 Fu4ny No comments

Dính phải 3 ngày tiền 8-3, 8-3 và hậu 8-3 nên giờ mới post cho xong được :P

Mặc dù vậy thì có 1 tin mừng là đã có giao diện ban đầu cho việc add ảnh vào database

Match Web Interface

Match Web Interface

Công việc đã phần nào trở nên dễ dàng hơn :).

Trở lại nội dung chính, trong bài viết này tui sẽ report về việc sử dụng match để demo cho nhận dạng logo của các đài truyền hình.

Dữ liệu ban đầu gồm có tập ảnh như ở dưới đây, được resize mặc định 800x600, và được add vào database. Cái ảnh Yuna là for testing nhé, ko phải ảnh chơi đâu.

Database Images List

Database Images List

Các ảnh được mã hóa lần lượt như sau

ID     Pose    Vector      Name

1        1             45            VTV
2        1             187          ESPN Channel
3        1             219          Cinemax Channel
3        2            325           Cinemax Channel
2        2            164            ESPN Channel
4        1             57              VTV1
5        1            46              VTV2
6        1            53              VTV3
7       1             361           Yuna Fantasy

Thử nghiệm 1: Sử dụng ảnh ngay trong dữ liệu có sẵn, cụ thể ở đây là ảnh ESPN trắng nền đen. Dữ liệu ra duy nhất ảnh số 2 match 100%. Kết luận: Chính xác.

Thử nghiệm 2: Sử dụng ảnh logo của kênh ESPN màu đỏ, có độ cao gấp đôi độ cao của ảnh trong dữ liệu. Kết quả :

ESPN Logo

ESPN Logo

ID     Pose    Số vector trùng
2         1           100
2        2            6
3        1            3
3        2            5
5        1            1
7        1            6

Dễ thấy có trên 50% (53%) số vector của file này trùng với ảnh có ID = 2 pose = 1( chính là ảnh ESPN logo trắng nền đen) còn hầu như ko trùng với ảnh có ID = 2 pose = 2 ( ảnh ESPN logo đen nền trắng).

Kết luận: Chính xác ở mức độ chấp nhận được nếu có ảnh tốt.

Thử nghiệm 3: Sử dụng ảnh logo VTV1 nền đen được cắt ra từ ảnh chụp Tivi.

VTV1

VTV1

ID         Pose            Số vector trùng
2             1                     6
3            1                      2
3             2                    4
4            1                      1
6            1                       1
7            1                      23

Một điều khá dễ thấy là...hoàn toàn ko chính xác, có thể do 2 ảnh khác nhau quá nhiều ( có thể nhận thấy một cách tương đối bằng mắt ). Vấn đề này có thể sẽ được giải quyết khi có một bộ chọn lọc ảnh tốt.

Các thử nghiệm trên được tiến hành với Surf chế độ mặc định, ảnh 800x600 mặc định và hệ số R là 1.02, K=20.

Có 1 thử nghiệm khác được tiến hành với chế độ surf -thres 1 và -d để tăng lượng vector lên, tuy nhiên kết quả còn xấu hơn ( thử nghiệm này với bộ dữ liệu tương tự nhưng đã add thêm 1 số ảnh mới )

ID              Pose           Số vector

1                   1                85
1                2                61
1                3                59
2                1                100
3                1                14
3               2                33
4                1                24
5                1                35
6                1                31
7                1                163
8                1                18
8                2                75

Ko tiện tính % lắmở đây do thử nghiệm này là thử nghiệm rác :P, nhưng hầu như số vector trong thử nghiệm này đều là giống khoảng trên 50%. Chứng tỏ việc đặt thres -1, -d ( tăng size ảnh ) có thể làm tăng lượng điểm ảnh rác, khiến việc so sánh trở nên sai số nhiều hơn.

Kết luận cuối cùng: chủ yếu vẫn cần 1 bộ phận để lọc ảnh chất lượng tốt và vector tốt, do các bộ ảnh chọn bằng mắt ko có được độ tin cậy cần thiết.

Categories: Featured, Post Tags: , , ,

Fu4ny@17/02

February 17th, 2009 Fu4ny 2 comments
Nokia N81

Nokia N81

Tự nhiên thấy chán thế...cảm giác dạo này giống như mình đang sống 1 mình vậy.

Nghe chuyện của mod Thần Long thấy buồn thật, mình ko bằng người ta, thiếu nghị lực quá...tự hứa sẽ chìm vào project, ba chuyện tình cảm lăng nhăng thì kệ xác nó nào :D.

Hết tháng này là có 140$ trong tài khoản Payoneer, + thêm 2 mil đang có nữa là có gần 4,5 mil rồi :P, cuổi tuần về xin bố 1 mil nữa ta mua N81 :">.

Anh Nam cho em project ác liệt quá, hơn 1 chục quyển ebook từ đông sang tây về Distributed ComputingGrid Computing mà em chả đọng lại được cái gì :P. Trước mắt phải viết lại project đã, đọc qua Thinking in C++ và OOP in C++ để lấy chút ý tưởng  :(. ( Lúc đầu em tưởng là làm Machine learning thì lại có ý tưởng rồi  :P ).

Thread nên chọn  POSIX hay Boost đây :-s

Categories: Post Tags: , ,

Class: SomeOne

February 16th, 2009 Fu4ny 3 comments

Cũng ko phải là hết việc làm, nhưng mà ngồi viết chơi cái này :)).
Đọc mỗi tiếng Anh thôi cũng hiểu nhá, chứ ko phải chỉ là lập trình đâu :))
Class SomeOne {
private:
//Basic info
char* name;
char* nickName;
int age;
Date ngaySinh;
//Extra info
double knowFor; //number of year that this person knew me, <0 mean didn't know each other
SomeOne refer; //The one introduce this person to me
//Flag
int isFriend;//-1 mean not know each other, 0 mean not a friend, >1 mean is friend
int isLove;//<0 mean HATE, 0 mean NORMAL friend and ?1 mean LOVE
public:
SomeOne(); //Default constructor
SomeOne( char* newName, int newAge, Date ngaySinh );
void setBirth( Date newNgaySinh );
void setName( char* newName );
void setNickNam( char* newName );
//To be continue
};

Categories: Post Tags: , ,

Fu4ny@30/11

November 30th, 2008 Fu4ny No comments

Delay mãi rồi cũng viết xong được cái phần match.

Lỗi thì thật là vớ vẩn, lỗi của class IPoint..ko phải do mình xây dựng.

May là anh Nam nhắc dùng Ubuntu 64bit nên mình mới dám test, chứ ko cứ stuck với vista thì bao giờ mới mò ra lỗi =)). Nhân đây phát hiện ra là backtrace của Vista cực kém, ko = 1 phần của Ubuntu.

Hăm hở làm test case, cầm máy ảnh làm 1 tràng, ngồi viết auto generate input, rồi thì hăm hở chụp và dò thử.

Kết quả...ko được như mong đợi. Mặc dù match, nhưng vẫn có những tấm hình độ match rất cao, nhưng thực tế thì...chả giống gì nhau cả.

Đây là thời điểm của môn xác suất thống kê đây. Khốn nỗi lười dùng excel quá :P.

Mai phải đi chụp 1 số ảnh chuẩn chỉ 1 chút, làm test lại và thống kê 1 chút thôi.

Categories: Post Tags: , ,

C++ Coding Convetion

November 4th, 2008 Fu4ny 2 comments

Bài viết này sẽ nói về quy tắc viết mã nguồn dành cho C++. Mình ko định làm nó thành 1 guide chuẩn, vì vậy ko cần thiết phải theo quy tắc, hay table of content gì cả... Read more...

Coding Convention – Quy tắc code

November 3rd, 2008 Fu4ny No comments

Đang ngồi dịch thì mất điện, 4 ngày nghỉ rồi, chả làm gì cả. Ngồi đọc Coding Convetion kết hợp viết bài cho nó nhớ. Read more...

Visual C++/C#/PHP – Confusing

October 13th, 2008 Fu4ny No comments

Quá nhiều NNLT, quá nhiều ứng dụng...

Mặc dù mỗi NNLT đều làm được tất cả những thử NNLT khác làm được, nhưng chọn 1 cái thật là khó

C++: Đang học ở trường, học theo trường và ko muốn học thêm về nó làm gì, theo như nhiều người nói thì OOP của C++ ko được trong sáng do kế thừa từ C-NNLT ko có OOP.

C#: Tốt nhưng lại cần .Net :|

PHP: Web developer.

NNLT mình am hiểu nhất hiện giờ có lẽ là PHP....nhưng web developer thì cần 1 tí skill designer nữa, mà trò này thì ko có năng khiếu =)).

Chọn 1 cái, mà khó quá

Categories: Post Tags: , , ,

[C++]Chia để trị – Divide and conquer: Part 1

October 1st, 2008 Fu4ny 1 comment

Viết theo lời nhờ của 1 vài người bạn. Tui ko mong rằng nhiều người sẽ hưởng ứng, kể cả khen hay chê. Bài viết tổng hợp từ những gì tui được học và kinh nghiệm về phương pháp xây dựng 1 bài toán, tập trung vào 2 phần là algorithms và coding. Read more...

Categories: Post Tags: ,