Thursday, January 23, 2014

Mô hình nhạc trực tuyến có trả phí

Vào thập kỷ cuối cùng của thế kỷ trước. Khi mà thị trường âm nhạc trực tuyến còn hỗn mang, quần hùng cát cứ khắp nơi. Đầu tiên với sự bùng nổ của Internet định dạng nhạc mp3, thiên hạ bắt đầu quen dần với phong cách nghe nhạc số cùng với sự ra đời của Winamp (1997). Sau đó ít lâu (1999) dịch vụ chia sẻ nhạc peer-to-peer Napster ra đời, và sau này là The Pirate Bay, Kazaa, Limewire cũng gây sóng gió cho ngành công nghiệp thu âm vì chủ yếu người dùng share nhạc được rip từ đĩa CD.

 Vào những năm đầu tiên của thập kỷ đầu tiên của thế kỷ thứ hai mốt. Cùng với sự ra đời của iTunes và iPod đã thay đổi hoàn toàn cách nghe nhạc của người dùng. Năm 2001, đánh dấu sự ra đời của chiếc iPod, tại thời điểm đó việc chứa hơn 1000 bài hát trong túi là một bước tiến lớn về dung lượng và trải nghiệm người dùng. Sau đó ngày 28/4/2003, Steve Jobs giới thiệu iTunes Store, và sự kiện này thay đổi cách kinh doanh âm nhạc mãi mãi.

Wednesday, December 11, 2013

Lỗi trong thuật toán xếp hạng của Reddit


Nhân dịp tình cờ lang thang trên Reddit gặp được một bài nói về lỗi trong thuật toán xếp hạng của Reddit.

Đầu tiên thì thuật toán xếp hạng các topic "hot" của Reddit được mô tả như sau:
  • Các bài mới được đăng thì được đánh giá cao hơn các bài cũ
  • Bài được nhiều  up vote thì được đánh giá cao hơn bài ít up vote
  • Và bài bị down vote càng nhiều thì bị đánh giá càng thấp.
Về logic thì không có gì sai, nhưng có một lỗi nhỏ trong chi tiết của thuật toán (source github):

Monday, November 18, 2013

Bài toán xếp ba lô 1/0


Bài toán xếp ba lô (Knapsack problem) là một bài toán tối ưu hóa tổ hợp (combinatorial optimization). Cho một tập hợp các phần tử, mỗi phần tử có trọng lượng và giá trị khác nhau, xác định các phần tử có thể đưa vào một tập hợp khác sao cho trọng lượng bé hơn hoặc bằng một giới hạn cho trước, và tổng giá trị các phần tử là lớn nhất. Tên của bài toán bắt nguồn từ việc phải xếp các đồ vật ba lô sao cho chứa được nhiều đồ có giá trị nhất.

Một cách phát biểu khác về bài toán:

Một tên trộm sau khi đột nhập vào nhà thì thấy có N loại đồ vật có kích thước và giá trị khác nhau. Vật gì hắn ta cũng muốn mang đi, nhưng lại chỉ mang một chiếc túi có dung lượng M (có thể chứa được một số đồ vật sao cho tổng kích thước chỉ nhỏ hơn hay bằng M). Vấn đề đặt ra cho tên trộm là hắn phải chọn lựa một danh sách các đồ vật sẽ mang đi sao cho tổng giá trị lấy cắp là lớn nhất.

Thursday, November 7, 2013

So sánh chuỗi trong PHP


Sử dụng toán tử so sánh 

Cách đơn giản và thô sơ nhất là dùng toán tử so sánh của PHP (comparison operators). Tuy nhiên không nên dùng toán tử Equal (==) mà nên dùng toán tử Identical (===). Bởi vì == không so sánh kiểu dữ liệu và có thể dẫn đến sai lệch trong việc so sánh. Ta hãy xem thử ví dụ sau:
$input = 0;
if('defaultpassword' == $input){
 echo 'true';
} else {
 echo 'false';
}

Viết ngắn sử dụng toán tử 3 ngôi (ternary operator):
$input = 0;
echo ('defaultpassword' == $input) ? ‘true’ : ‘false’;

Mặc dùng 0 và ‘defaultpassword’ hoàn toàn khác nhau nhưng kết quả trả về là ‘true’ thay vì ‘false’. Bởi vì khi PHP sẽ ngầm định ép kiểu về float để so sánh, và ép kiểu chuỗi ‘defaultpassword’ về kiểu float thì nó sẽ ra kết quả như sau: int(0); Xem thêm

Do đó khi so sánh 2 chuỗi ‘1e3’ và ‘1000’ bằng phép toán == ta được kết quả là true.
echo ('1e3' == '1000') ? 'true' : 'false';

Nhưng nếu dùng toán tử === ta sẽ được kết quả là false:

echo ('1e3' === '1000') ? 'true' : 'false';

Do 1e3 tương đương 1000 nếu như convert sang kiểu float. Vì vậy tốt hơn hết là ta dùng toán tử Identical (===) để so sánh hai chuỗi.

Sunday, October 27, 2013

Tìm hiểu về Mô hình không gian vector

Giới thiệu

Nói một cách ngắn gọn, Vector space model (Mô hình không gian vector) là một mô hình đại số (algebraic model) thể hiện thông tin văn bản như một vector, các phần tử của vector này thể hiện mức độ quan trọng của một từ và cả sự xuất hiện hay không xuất hiện (Bag of words) của nó trong một tài liệu.

Mô hình này biểu diễn văn bản như những điểm trong không gian Euclid n-chiều, mỗi chiều tương ứng với một từ trong tập hợp các từ. Phần tử thứ i, là $d_i$ của vector văn bản cho biết số lần mà từ thứ i xuất hiện trong văn bản. Sự tương đồng của hai văn bản được định nghĩa là khoảng cách giữa các điểm, hoặc là góc giữa những vector trong không gian.

Mỗi từ trong không gian vector sẽ có một trọng số, có nhiều phương pháp xếp hạng khác nhau, nhưng tf-idf (term frequency–inverse document frequency) là một phương pháp phổ biến để đánh giá và xếp hạng một từ trong một tài liệu. MySQL fulltext search cũng sử dụng phương pháp này. Về cơ bản thì tf-idf là một kỹ thuật (cụ thể là ranking function) giúp chuyển đổi thông tin dưới dạng văn bản thành một Vector space model thông qua các trọng số. Vector space model và tf-idf được phát triển bởi Gerard Salton vào đầu thập niên 1960s.

Mặc dù đơn giản, nhưng mô hình không gian vector và những biến thể của nó hiện nay vẫn là cách phổ biến để biểu diễn văn bản trong Data mining và Information retrieval. Tuy nhiên, một trong những điểm yếu của vector space model số chiều lớn (high-dimensonal), có khoảng cỡ chục triệu chiều trong không gian vector nếu như chúng ta áp dụng nó vào web search engine.

Monday, September 16, 2013

Giới thiệu về Fabric.js - P1


Hôm nay, tôi trân trọng giới thiệu với bạn về Fabric.js - một thư viện Javascript mạnh mẽ giúp bạn làm thỏa sức sáng tạo trên nền HTML5. Fabric cung cấp các object model (tạm dịch là: mô hình đối tượng) bị thiếu cho canvas, bộ SVG parser [để có thể load file svg và vẽ lên canvas, cũng như chuyển canvas thành là svg], các layer tương tác, và nhiều đồ chơi, công cụ khác. Fabric là open source, giấy phép MIT, với sự cộng tác trong nhiều năm của các lập trình viên khác trên thế giới.

Tôi (Juriy Zaytsev) bắt đầu phát triển bộ thư viện này khoảng 3 năm trước, khi cảm thấy hết sức đuối khi phải làm việc trên những hàm native của canvas. Váo thời điểm đó, tôi bắt đầu làm về printio.ru - một dự án startup cho phép người dùng có thể thiết kế mẫu áo quần trực tiếp. Với các tính năng mà chỉ xuất hiện trên Flash vào thời điểm đó. Thậm chí giờ đây có rất ít người biết được rằng với Fabric gần như chúng ta có thể làm được như Flash.

Vậy hãy "soi" kỹ hơn,

Friday, September 13, 2013

Sự sáng tạo - ghi chép từ khóa game design

Hai tuần rồi học được học môn Game Design với thầy Tony Manninen, CEO của công ty game LudoCraft. Công ty này là một start-up khởi đầu từ một công trình nghiên cứu ở Department of Information Processing Science thuộc đại học Oulu. Đây là những gì lởn vởn trong đầu và được ghi lại trong giờ học, cho nên nó cũng mang tính trà đá chém gió là chính.

Bàn về sự sáng tạo và cái mới


Cũng thật khó để định nghĩa thế nào là sáng tạo, wikipedia định nghĩa sự sáng tạo là một hiện tượng khi mà một cái gì đó mới và có giá trị được tạo ra, ví dụ như một ý tưởng, một truyện cười, một bản nhạc, một bức tranh, một giải pháp, một phát minh v.v

Ở đây chúng ta có thể thấy được hai yếu tố quan trọng của sự sáng tạo, đó là yếu tố “mới” và yếu tố “có giá trị”. Nếu như thiếu đi một trong hai yếu tố thì nó không còn là sự sáng tạo nữa. Ví dụ như vào năm 1858 ông Hymen Lipman gắn cục tẩy đầu sau của bàn chảy đánh răng thì nó chắc không được coi là sáng tạo, nhưng may mắn thay ông đã gắn nó vào bút chì và kiếm được $100,000 từ bằng sáng chế đơn giản của mình.

Monday, September 9, 2013

Alan Turing và máy Enigma

Alan Turing, một con người, một tính cách và một số phận


Alan Turing sinh ngày 23-6-1912 tại London, ông là một trong những nhà khoa học lớn bị lãng quên của thế kỷ XX, cho dù ông là cha đẻ của các máy tính, hay ít nhất cũng  là một phần lý thuyết của nó. Sự đóng góp to lớn của ông quyết định cho sự chiến thắng của phe Đồng Minh trong chiến tranh thế giới thứ 2 (theo vietsciences). Mặc dù trước công chúng Alan Turing có thể được coi như là một nhà khoa học xuất sắc, giúp quân đội đồng minh giải mã máy Enigma. Nhưng về cá tính, ông là một người nhút nhát, hay mắc cỡ và lập dị. Lúc còn học ở đại học Cambridge, Turing thường để tóc tai quần áo bê bối và không cạo râu, hơn nữa ông có thói quen đeo đồng hồ ở thắt lưng và đeo mặt nạ phòng độc khi đạp xe vì ông bị dị ứng với phấn hoa.

Friday, August 30, 2013

Chuyện về Thomas Edison và Nicola Tesla



Chắc hẳn cái tên Thomas Edison không còn xa lạ gì với chúng ta, từ bé mình đã nghe rất nhiều câu chuyện đầy cảm hứng về ông. Dạng như như thưở bé Edison bị đuổi học vì trí tuệ quá kém, nhưng ông nỏi tiếng về tinh thần ham học hỏi, chủ yếu tự nghiên cứu và thực nghiệm, truyện kể rằng năm 12 tuổi Edison bán báo trên tàu hỏa nhưng vì ham thích nghiên cứu ông đã "lén" lập hẳn một phòng thí nghiệm hóa học và in báo ngay trên một toa tàu hàng. Hơn nữa ông cũng nổi tiếng với rất nhiều phát minh như bóng đèn điện, máy ghi âm, máy chiếu phim v.v. Trong khi đó, Nicola Tesla được đánh giá là một thiên tài phát minh, từng là nhân viên của Thomas Edison nhưng là một cái tên ít được nhắc đến hơn hẳn mặc dù ông cũng có rất nhiều đóng góp cho khoa học. Nhưng đằng sau sự thành công và thất bại của một con người còn bao nhiêu chuyện chưa kể. Bài viết này chỉ đề cập tới một số mẩu chuyện nhỏ liên quan đến hai nhân vật trên mà không phải ai trong chúng ta cũng biết đến.

Sunday, August 18, 2013

Tìm hiểu về Apache Solr


Sơ lược


Apache Solr là một open source full-text search platform dựa trên Apache Lucence.  Lucene là một thư viện được viết bằng Java dùng để phân tích, đánh chỉ mục (indexing) và tìm kiếm thông tin được phát triển đầu tiên bởi Doug Cutting vào năm 2000. Cutting đồng thời cũng là tác giả của Hadoop lúc ông đang làm việc cho Yahoo vào năm 2005.

Apache Solr khởi đầu là một project nội bộ của CNET được tạo ra bởi Yonik Seeley, nhằm phục vụ chức năng tìm kiếm của website CNET vào nằm 2004 và được đóng góp cho Apache Software Foundation năm 2006. Solr không hoàn toàn là một RESTful interface của Lucene mà là sử dụng Lucene như là một component trong toàn bộ hệ thống. Sau phiên bản Solr 1.4, từ version 3.1 (tháng 3, 2011) thì Solr và Lucene dùng chung một codebase và version number.

Saturday, August 3, 2013

Sphinx và tìm kiếm tiếng Việt

Bài trước Cài và chạy thử Sphinx trên Windows
sphinx search tieng viet

Tham khảo cách cài đặt Sphinx ở đây trước. Đây là file cấu hình giúp Sphinx có thể đánh dấu chỉ mục (indexing) và tiếng kiếm tiếng Việt không phân biệt hoa/ thường có dấu hoặc không dấu (case-insensitive và accents-insensitive).

Về cơ bản, thì chúng ta phải cấu hình charset_table để mapping các ký tự có dấu (accents) trở về các ký tự không dấu (ví dụ như a,á,à,ạ,ã v.v --> a). Điều này rất quan trọng vì trong thực tế không phải lúc nào cũng gõ tiếng Việt có dấu. Và lưu ý, charset_table chỉ cấu hình trên một dòng duy nhất.

Monday, July 15, 2013

Character set và collation trong mysql


Character set = characters + encoding method

Một character set là một tập hợp các ký tự và các phương thức chuyển mã ký tự (encoding). Còn một collation là một tập hợp các qui tắc để so sánh hai ký tự trong một tập hợp ký tự. Giả sử ta có 4 chữ cái 'A','a','B','b' được encode là 'A'=65,'B'=66, 'a' = 97, 'c' = 98. Thì trong máy tính, chữ 'A' là một ký hiệu và 65 là mã của được chuyển của 'A'. Thì sự kết hợp của một tập các ký tự và cách chuyển mã của chúng được gọi là character set.

Bạn có thể thấy mỗi ngôn ngữ khác nhau sẽ có những tập hợp các ký tự khác nhau, cùng là bản chữ cái latin nhưng tiếng Việt lại có thêm nhiều ký tự mà các ngôn ngữ dùng chữ latin khác không có chẳng hạn như chữ  , Ă, Ê, Ô, Ư, Đ. Và có rất nhiều kiểu chuyển mã (encode) tiếng Việt khác nhau ngoài Unicode ra như TCVN3, VNI hay VISCII. Do vậy không thể dùng font VNI mà gõ theo kiểu gõ Unicode được, vì bộ gõ sẽ ánh xạ sai mã và ký tự tương ứng.