Cảm ơn bạn đã đọc và ủng hộ blog KTMT ʘ‿ʘ Từ bây giờ chúng tôi sẽ là kipalog.com !

Comments

bài viết trước, tôi đã giới thiệu về rất nhiều các thuật ngữ, cũng như khái niệm liên quan đến quảng cáo trên internet. Phần 2 sẽ thiên một chút về ‘lịch sử’ của quảng cáo trên internet, thông qua việc giới thiệu về các hình thức + cách tiến hành các chiến dịch quảng cáo. Thông qua đó cá bạn sẽ hiểu thêm tại sao chúng ta cần có các kĩ thuật quảng cáo ở mức hệ thống như DSP, hay SSP..

Đầu tiên tôi sẽ nói về các loại hình quảng cáo trên internet.

Quảng cáo thuần (pure adverstisement)

Đây có lẽ là loại hình quảng cáo dễ hiểu nhất và mặc dù xuất hiện từ thời ‘xa xưa’, nhưng loại hình này vẫn khá thông dụng cho đến hiện nay. Cách quảng cáo này thông qua việc liên lạc trực tiếp giữa ‘người bán’ và ‘người mua’ (người mua ở đây có thể là nhà quảng cáo (advertiser) hoặc cũng có thể là công ty trung gian (ad-agency)). Hình thức này thường có giới hạn thời gian với một cái giá cố định, ví dụ bạn muốn đăng banner trên vnexpress trong vòng một ngày, bạn liên lạc trực tiếp cho vnexpress, trả cho vnexpress một cái giá cố định, hoặc là trả theo ‘Impression’ (hay là số view). Hình thức quảng cáo này thường có giá trị về mặt ‘brand’, nên thường khách hàng sẽ là các nhãn hiệu lớn, muốn cho khách hàng nắm được thông tin về ‘campaign’ của mình, hoặc để cho hình ảnh ‘brand’ in đậm vào tâm trí người nhìn. Hình thức này có ưu điểm và nhược điểm là :

  • Ưu điểm: Thường các media lớn sẽ có lượng view rất lớn -> có lợi về quảng bá brand
  • Nhược điểm: Giá cao, không target được người dùng nên sẽ phí một lượng impression rất lớn cho những người không quan tâm.

Quảng cáo dựa vào search engine (listing adverstisement)

Đây là cách quảng cáo đem lại doanh thu chủ yếu cho các search engine thông dụng như google hay yahoo. Để hình dung về hình thức này, bạn chỉ cần tham khảo 2 ví dụ dưới đây mà mình chụp lại của google.

Ở hình thứ nhất, khi tôi search từ khoá liên quan đến quần áo, google sẽ đưa quảng cáo liên quan đến từ khoá đó lên đầu. Để mua được quảng cáo loại này, thì advertiser phải mua quảng cáo dưới dạng từ khoá (keyword). Dạng quảng cáo này chính là hệ thống Adwords nổi tiếng của google mà chắc bạn đã từng nghe qua.

Ở hình thứ 2, bạn có thể thấy khi search từ khoá liên quan đến nhãn hiệu hàng hoá montbell, google không chỉ đưa ra link dẫn đến trang web có món hàng, mà còn đưa ra cụ thể chi tiết của từng sản phẩm. Hình thức quảng cáo này vẫn dựa trên nên tảng là adwords (mua keywords), tuy nhiên ở một mức cao hơn gọi là listing ads. Để làm được việc này thì advertisers phải cung cấp cho google thông tin về sản phẩm (link ảnh, giá cả…) dựa trên hình thức feed (bạn có thể hình dung giống như RSS, advertiser cung cấp http://advertiser.com/feed.xml, google fetch thông tin về, đưa vào cơ sở dữ liệu của google).

Hình thức quảng cáo dựa trên search engine có ưu điểm và nhược điểm là:

  • Ưu điểm: ‘động lực’ của user rất cao -> tỉ lệ click rất tốt. (khi user đã ‘chủ động’ tìm kiếm thì khả năng click vào link một món hàng ưa thích sẽ rất cao)
  • Nhược điểm: Phụ thuộc vào keyword, một số keyword thông dụng có giá rất cao. Ngoài ra việc chọn lựa keyword một cách hợp lý cũng không hề dễ dàng.

Quảng cáo hiển thị (display advertisement - programmatic)

Loại hình quảng cáo này là loại hình thông dụng và ‘bình dân’ nhất, với đặc điểm chính là ‘tiến hoá’ từ quảng cáo thuần (pure advertisement). Pure advertisement có nhược điểm là phải có quá trình trao đổi trực tiếp giữa ‘người mua’ và ‘người bán’, và người bán ở đây thường chỉ là các media lớn, có lượng impression cực cao. Các media lớn này thường là các trang web báo chí (The NYTimes, Vnexpress…), hay các trang portal (như yahoo news..). Vậy các media nhỏ hơn làm sao để có thể bán inventory của mình (inventory là các ‘chỗ trống’ trên trang web để có thể đặt quảng cáo vào). Đây chính là vấn đề mà display advertisement-programmatic giải quyết, khi sinh ra các khái niệm mà tôi đã đề cập ở bài viết trước như : Ad-network, Ad-exchange, DSP, SSP…

Ad-network lớn nhất hiện nay có thể nhắc đến Google Display Network (GDN). GDN bao gồm cả hệ thống google adsense mà các bạn nào đã từng đặt quảng cáo adsense có thể đã biết. Khi đặt quảng cáo adsense thì bạn (media) đã gia nhập vào hệ thống network của google (GDN).

Mô hình quảng cáo này sẽ được tôi nhắc đến kĩ hơn trong bài viết sắp tới, tuy nhiên có thể lại các ưu nhược điểm như sau:

  • Ưu điểm: có thể điều chỉnh được giá thông qua việc ‘bid’ nhở có RTB (bạn có thể xem lại khái niệm về Real time bidding ở bài viết trước) -> về cơ bản giá sẽ rẻ hơn. Độ phủ sóng rộng hơn nhờ có ad-network. Ngoài ra nhơ việc tracking người dùng nên có thể sử dụng kĩ thuật retargeting để ‘kéo’ người dùng lại với service của mình.
  • Nhược điểm: advertiser sẽ không biết quảng cáo của mình sẽ được đặt ở đâu (RTB sẽ quyết việc này tại real-time), dẫn đến có thể quảng cáo của công ty X, sẽ lại được đặt ở … website của đối thủ của X (việc này có thể giải quyết dựa vào một số công ty 3rd-party chuyên đi đánh giá độ tin cậy của media). Một nhược điểm rất lớn nữa của loại hình này chính là các thuật toán RTB thường không đủ thông minh để xác định user nào ‘nên’ hiện và user nào ‘không nên’ hiện quảng cáo, khiến cho 90% impression sẽ bị qui vào thể loại quảng cáo gây khó chịu cho người dùng.

Các hình thức quảng cáo khác

Ngoài các hình thức trên thì hiện nay còn rất nhiều hình thức quảng cáo khác ‘mới nổi’ mà có thể kể đến điển hình như:

  • Quảng cáo trên mạng xã hội (facebook, twitter): hình thức này có lẽ tương lai sẽ thống trị quảng cáo trên internet nói chung, khi mà các mạng xã hội như facebook, twitter nắm ‘rất nhiều’ thông tin về người dùng, đủ cho họ có thể target được chính xác ‘ai cần gì’, khiến cho chỉ với một cái giá rất rẻ nhưng đem lại hiệu quả rất lớn cho advertiser.
  • Quảng cáo trên mobile (admob, apple ad..): có lẽ các bạn sử dụng smartphone, cũng như các nhà phát triển smartphone sẽ nắm rất rõ loại hình này. Loại hình này có ưu điểm là impression rất lớn, khi mà lượng smartphone user tăng cao + thời gian sử dụng smartphone chiếm tỉ lệ cao sơ với web. Tuy nhiên nhược điểm lớn của loại hình này là các công ty như admob hay apple vẫn đang ‘loay hoay’ tìm các ‘đăt’ quảng cáo sao cho ít gây trở ngại đến người dùng nhất. 99% quảng cáo trên mobile sẽ được qui vào dạng gây cực kì khó chịu cho người dùng. Hơn nữa, tracking người dùng web và mobile hiện là một công việc không hề dễ (cross-device tracking), nên làm cho độ chính xác của quảng cáo trên mobile đang là cực thấp.

Tổng kết

Ở bài viết này tôi đã giới thiệu một cách cơ bản nhất về các loại hình quảng cáo. Bài viết chủ yếu đi về các khái niệm, để làm nền tảng cho bài viết sắp tới tôi sẽ nói rõ hơn về khía cạnh kĩ thuật của hình thức quảng cáo hiển thị (display advertisement), cũng như các cách để ‘tracking’ người dùng.

Bài viết này là phần tiếp theo của bài viết Tôi đã xây dựng một phần mềm mã nguồn mở như thế nào. Cách sử dụng từ “Hacker” là thống nhất với phần 1.

Vai trò của cộng đồng

“Đem sản phẩm đến với cộng đồng” luôn là phần khó đối với một người làm kỹ thuật.

Chúng ta có thể say mê, thức ngày thức đêm để viết lib, viết tool, hoàn thành đoạn code mà bản thân cảm thấy tâm đắc. Tuy nhiên mọi chuyện thường kết thúc ở đó. Thiếu quảng bá và truyền thông sẽ khiến sản phẩm chỉ loanh quanh ở mức bạn bè dùng thử rồi bạn bè cho ý kiến, sản phẩm làm ra chẳng bao giờ thực sự đến được với cộng đồng.

Xây dựng xong Rainbow Stream. Tôi đã bắt đầu đi học hỏi và tìm cách quảng bá, giới thiệu. Bỏ bên lề những vấn đề kỹ thuật đã trình bày trong phần 1, phần 2 này sẽ tập trung nói về quá trình quảng bá và giới thiệu đó.

Kênh quảng bá

Người dùng của sản phẩm mã nguồn mở được xác định sẽ là chính những hacker như bản thân tác giả. Bước đầu tiên tôi đã thực hiện là tìm hiểu xem cộng đồng hacker trên thế giới đang đọc gì ? ở đâu ? Bản danh sách tóm tắt dưới đây sẽ đưa ra những câu trả lời theo thứ tự.

  • Hacker News là nơi tập trung nhiều view nhất. Lên được front page của Hacker News là ước mơ của mọi dự án mã nguồn mở, và featured trên front page là cột mốc đáng nhớ đối với mọi hacker. Thuật toán ranking của Hacker News đã được đề cập trong một bài biết khác của blog KTMT, có đặc điểm là sẽ đào thải những item cũ rất nhanh dù upvote có nhiều thế nào đi nữa.
  • Reddit là nguồn thông tin tiếp theo. Reddit có rất nhiều sub nhưng dành cho hacker thì chúng ta có r/programmingp, r/coolgithubprojects, v.v… Nếu giữ được upvote cao thì thời gian trên front page của Reddit sẽ dài hơn Hacker News. Tuy nhiên Reddit có rất nhiều downvoter (những user/bot chuyên đi downvote).
  • Github Trending tổng hợp những project có lượng star tăng nhanh trong ngày, trong tuần và có thể chia theo ngôn ngữ. Nếu một ngày tăng khoảng 50 star thì ngay lập tức sẽ “lên trend”, kéo theo hàng loạt các newsletter đưa tin, bạn “tự nhiên” sẽ nổi tiếng :D
  • Twitter của những blog/tạp chí/hacker nổi tiếng. Kênh này tỏ ra hiệu quả bát ngờ so với dự tính.
  • Các blog kỹ thuật - trang chủ của những tài khoản Twitter đề cập ở trên.

Chuẩn bị trước khi bắt đầu chiến dịch

Những kênh ở phần trước có thể đem lại cho bạn lượng view đầu vào rất lớn, nhưng để user nán lại và đọc hết, dùng thử sản phẩm và tốt hơn nữa là đi giới thiệu lại sản phẩm hộ bạn, bạn cần chuẩn bị thật tốt những chỉ mục sau đây

Một cái tên tốt

Một cái tên dễ nhớ, dễ đánh vần, và quan trọng hơn là chưa thuộc về một sản phẩm khác là điều đầu tiên cần thiết. Hãy dùng Chrome incognito mode để kiểm tra mọi ý tưởng.

Source code được open trên Github.

Hoặc Bitbucket hay Google Code. Tuy nhiên cộng đồng trên Github đang phát triển mạnh mẽ và nhanh chóng hơn cả. Host source code trên Github sẽ nhận được nhiều feedback và Pull Request.

Official homepage

Thực tế Github Project đã có thể làm official homepage. Tuy nhiên tôi vẫn mua thêm domain rainbowstream.org, làm một cái Github Page, lấy một cái theme đẹp và trỏ vào domain làm homepage thứ 2. Tại sao ư ? 2 link homepage sẽ đem lại 2 cơ hội giới thiệu trên Hacker News. Theme đẹp cho một trang homepage đơn giản có thể tìm thấy ở HTML5up.

README.md

README.md là cái đầu tiên đập vào mắt user khi họ đến homepage. Một file README tốt sẽ nói với user :

  • Project của bạn tạo nên cái gìtại sao user cần dùng nó.
  • Hướng dẫn cài dặt.
  • Hướng dẫn sử dụng.
  • Đường dẫn đến full document. Document cần phải làm riêng trên một file khác hoặc một dịch vụ khác.
  • License. License là một điểm rất quan trọng trong cộng đồng mã nguồn mở. Rất tiết bài viết này không có điều kiện trình bày cụ thể về các loại license. Ở đây Rainbow Stream dùng MIT license.
  • Nơi user có thể nhận được sự giúp đỡ của bạn (đặt câu hỏi, yêu cầu tính năng hay báo cáo bug).
  • Cách user có thể đóng góp cho project.
  • Ảnh minh hoạ. Đối với các sản phẩm về UI, ảnh minh hoạ sẽ gây ấn tượng mạnh nhất về thị giác. Tôi thậm chí đã dùng ttygif tạo ảnh gif để cho ấn tượng mạnh hơn nữa :D

Viết UT cho project

Chưa cần nói đến chất lượng sản phẩm, source code được viết test sẽ có độ tin tưởng khác hẳn với những source code không có. Đặc biệt nếu project của bạn là một library với mục đích được dùng lại, không có testcase là đồng nghĩa với không có người dùng.

Một tài khoản Twitter

Đối với cộng đồng hacker thì Twitter gần như trở thành định danh chính thức vậy. Twitter dùng để giao tiếp với user, phát đi thông báo nâng cấp hay tương tác với các tài khoản của người nổi tiếng.

Sử dụng các kênh quảng bá

Twitter và các blog kỹ thuật

Xác định được các tài khoản Twitter nổi tiếng là bước quan trọng đầu tiên. Bạn cần tìm ra keyword thể hiện được lĩnh vực mà sản phẩm của bạn đang hướng đến, lên FollowerWork và tìm kiếm account của các blogger xếp theo số lượng follower. Tìm được profile rồi, hãy google ra homepage của họ (hoặc của trang tin kỹ thuật), mở phần contact để lấy email. Bước tiếp theo là soạn một email để nhờ họ giới thiệu về sản phẩm của bạn. Hãy nhớ, nội dung phải lịch sự và nhã nhặn, tóm gọn được sơ lược về sản phẩm và có đường link đến homepage. Đừng tở ra ngại ngùng ở tư thế người đi nhờ. Bản thân các blogger cũng cần những sản phẩm hay để thu hút view cho trang web của chính họ.

Đến khi sản phẩm được nhắc đến trong 1 tweet hoặc được viết hẳn thành 1 bài trên trang tin thì bạn sẽ ngạc nhiên với độ lan truyền của nó :D

Nếu bạn dồn đủ số star tăng xấp xỉ 40~50 trong 1 ngày, Github sẽ liệt kê sản phẩm của bạn vào Trending list, là nơi rất nhiều các newsletter nhìn vào để gửi mail cho user của họ. Python Weekly sẽ nhìn Python Github Trending, Ruby Weekly sẽ nhìn Ruby Github Trending. Tương tự đối với IOS hay Android.

Tôi không biết chính xác tên của các newsletter nhiều người đọc nhất, nhưng biết chắc chắn tất cả đều lấy trên trang trending của Github. Hãy cố gắng giữ được độ tăng đều trong thời gian càng lâu, độ phủ sóng của sản phẩm lên các newsletter sẽ càng lớn.

Reddit

Giới thiệu sản phẩm mã nguồn mở trên Reddit là cách dễ dàng ở mức tiếp theo. Reddit được chia thành rất nhiều các subreddit(kênh nhỏ) về các chủ đề cụ thể khác nhau. Bạn cần tìm kênh đông thành viên và liên quan đến chủ đề của sản phẩm. Sau đây là danh sách các subreddit tôi đã thử với Rainbow Stream

Muốn tin đăng trông bắt mắt và gây ấn tượng với người đọc, bạn nên post kèm 1 ảnh được up thông qua Imgur. Một tin được tỉ lệ upvote cao (>70%) có thể ở nguyên trên frontpage của subreddit khoảng vài ngày.

Hacker News

Chúng ta sẽ nói về phần khó nhất. Đã có vô số bài nghiên cứu về traffic của Hacker News, thời gian nào up lên là tốt nhất, chiến thuật lên front, bám front (lên được trang chủ và trụ lại trang chủ) trong thời gian dài. Bất kỳ ai cũng có thể post link lên Hacker News, tuy nhiên để post link có phần đầu là [Show HN] thì đòi hỏi phải có account đăng ký được một thời gian. Tôi đã lập account và đọc Hacker News trước khi làm Rainbow Stream, nên may mắn có thể gửi link luôn khi hoàn thành sản phẩm.

Lên front được khoảng 20 tiếng đã đem lại 5000~6000 view và ít nhất 300+ star trên Github, rất ấn tượng phải không :) Sau đây là một vài lời khuyên nhỏ

  • Tiêu đề đăng link cần thể hiện được khả năng của sản phẩm theo một góc nhìn sáng tạo. Hãy tham khảo Show HN page
  • Cần điểm nhấn về thị giác khi user click vào link điến trang chủ của bạn (Ảnh gif trên README.md hay trang Github Page ấn tượng)
  • Cần phâi post link vào 1 giờ chiều giờ Mỹ.
  • Cần vận động bạn bè khoảng 5~10 người upvote luôn trong 10 phút đầu tiên Hãy nhờ bảo bạn bè của bạn vào thẳng trang chủ của Hacker News để vote, không thông qua link gửi trực tiếp.

Tổng kết

Bài viết này đã tổng kết các kinh nghiệm quảng bá của một sản phẩm mã nguồn mở đối với cộng đồng hacker trên thế giới. Mặc dù chúng ta có thể áp dụng rất nhiều các mẹo vặt, hướng dẫn để tăng view cho sản phẩm, nhưng bạn hãy nhớ, điều cốt yếu nhất vẫn là chất lượng sản phẩm của bạn.

Chất lượng bao gồm cả chất lượng trong quá trình làm ra và chất lượng support trong cả thời gian phát triển. Hãy cố gắng fix hết bug, trả lời mọi câu hỏi và review mọi Pull Request một cách cẩn thận. Bạn sẽ nhận lại không chỉ sự tôn trọng trong giới hacker mà cả những cơ hội từ trước đến nay chưa bao giờ nghĩ tới. Happy hacking!

Chúc mừng năm mới 2015 tới tất cả bạn đọc ktmt blog :) Chúc các bạn một năm mới coding thật productive! ^^

Năm mới chắc hẳn hầu hết mọi người đều có resolution của riêng mình. Một trong những resolution của tôi năm nay là học một ngôn ngữ lập trình mới, đến level có thể viết một chương trình không đơn giản với nó. (Bạn có thể tham khảo một danh sách các resolutions cho programmer ở đây). Ngôn ngữ mà tôi chọn là Haskell, một functional programming language, vì những ý tưởng trong ngôn ngữ lập trình này khác hẳn những ngôn ngữ lập trình tôi đã tiếp cận, như C/C++, Java, Python.

Tôi mới bắt đầu với Haskell được một vài tháng, và cảm thấy khá thích thú về những ý tưởng mới mẻ của nó. Tôi sẽ bắt đầu viết chia sẻ những kiến thức tôi thu thập được trong quá trình tìm hiểu ngôn ngữ này trên ktmt. Tuy nhiên, tôi phải nói trước là Haskell khá trừu tượng, và với một beginner như tôi, việc cố diễn giải các khái niệm khó của Haskell có thể sẽ không chính xác và dễ gây hiểu lầm. Vì thế, tôi sẽ tập trung vào viết những đoạn code để giải quyết một vấn đề to hoặc nhỏ nào đó và cố giải thích chúng làm được như thế bằng cách nào. Những khái niệm khó, tôi sẽ dẫn về những bài viết nổi tiếng để bạn đọc có thể tìm hiểu thêm.

Trong bài viết đầu tiên này, tôi sẽ hướng dẫn cách cài đặt những thành phần cơ bản để chúng ta có thể bắt đầu lập trình với Haskell. Cuối bài, sẽ có một chương trình Hello World rất đơn giản để chúng ta test xem môi trường của chúng ta đã hoàn thiện chưa.

Chú ý: Hiện tại tôi test trên máy tính của tôi (Windows 7). Tôi đã từng cài đặt môi trường trên Mac OS X và Ubuntu Linux, nhưng chưa có thời gian kiểm tra lại. Tôi sẽ thêm thông tin nếu cần thiết.

The Haskell Platform

Đây là cách đơn giản nhất để chúng ta có thể bắt đầu với Haskell. Trên Homepage, Haskell Platform được gọi là “Haskell: batteries included”. Trên homepage này, bạn có thể tải về cả package để cài đặt cho cả ba môi trường: Windows, Linux, Mac OS X. Sau khi cài đặt, bạn sẽ có rất nhiều thành phần tiêu chuẩn để bắt đầu lập trình với Haskell (List). Trong số đó, có những thành phần tiêu biểu sau:

GHC (Glassgow Haskell Compiler)

Đây là compiler cho Haskell.

GHCi

Đây là GHC interactive interpreter. Nếu bạn đã từng lập trình với Python hoặc Ruby, bạn có thể coi GHCi giống như khi bạn gõ python (với Python) hoặc irb (với Ruby) trên command line. GHCi cực kì hữu dụng trong quá trình bạn viết code Haskell.

Bạn sẽ dành khá nhiều thời gian trong GHCi, nên chúng ta sẽ dành chút thời gian để config GHCi sao cho thuận tiện nhất. File config của GHCi là .ghci, vị trí của file này tùy thuộc vào hệ thống bạn đang sử dụng, bạn tham khảo ở đây: GHCi dot files. Tôi tạo mới một file .ghci trong Home folder với nội dung:

1
:set prompt "h> "

Làm vậy, mỗi lần mở GHCi, prompt của bạn chỉ đơn giản là h> chứ không phải là tên tất cả các module đã load (bạn hãy thử xem khác nhau như thế nào nếu không có dòng setting trên)

Cabal

Cabal là viết tắt của Common Architecture for Building Applications and Libraries. Về chức năng, nó tương tự như pip của Python hay gem của Ruby, dùng để cài đặt những package chuẩn từ Hackage (Haskell Central package archive). Những người viết package sử dụng Hackage để publish các libraries hay programs của họ, và những Haskell programmer khác sử dụng các tool như cabal-install để download và cài đặt các package này.

Trên Windows 7, mỗi khi sử dụng cabal, các package sẽ được install vào $HOME$\AppData\Roaming\cabal. Trên Unix-based system, chúng được install vào ~/.cabal/.

Sau đây là những thao tác đầu tiên bạn nên làm với cabal:

1
$ cabal update

Dùng để update list các package phiên bản mới nhất trên hackage.haskell.org.

1
$ cabal install cabal-install

Dùng để update phiên bản cabal-install mới nhất

Code Editor: Sublime Text

Bạn có thể dùng bất cứ một text editor nào để viết code Haskell. Nếu bạn sử dụng Sublime Text, bạn nên cài plugin SublimeHaskell. Đây là plugin hỗ trợ Cabal build, error and warning highlighting, smart completion và tích hợp ghc-mod. Bạn có thể tham khảo thêm thông tin tại GitHub repo

Cabal sandbox

Với Haskell, sandbox cho phép chúng ta build các package một cách độc lập với package environment của hệ thống, bằng cách tạo ra một package environment riêng cho project hiện tại. Nếu bạn đã quen thuộc với Python’s virtualenv hoặc Ruby’s RVM, sandbox là một khái niệm tương tự.

Bài viết này trình bày khá dễ hiểu về tại sao nên sử dụng sandbox để tránh dependency hell, bạn có thể tham khảo thêm. Một số thao tác cơ bản với cabal sandbox gồm có:

1
2
3
4
$ cd /path/to/my/haskell/project
$ cabal sandbox init                    # Init the sandbox
$ cabal install --only-dependencies     # Install dependencies into the sandbox
$ cabal build                           # Build your package inside the sandbox

Chú ý ở đây, cabal sandbox là một feature của cabal từ version 1.18 trở đi, cho nên sau khi init một sandbox hoàn toàn mới, các command tiếp theo (như build hay install) đều sẽ sử dụng sandbox chứ không phải package environment của hệ thống.

Ví dụ đầu tiên: Hello World

Chúng ta sẽ bắt đầu với ví dụ muôn thuở khi bắt đầu ngôn ngữ lập trình mới: In ra màn hình consle dòng chữ Hello World.

1
2
3
$ mkdir haskell-hello-world
$ cd haskell-hello-world
$ cabal init

cabal init sẽ giúp chúng ta thêm thông tin cho project của mình, như: tên project, version, người phát triển, license,…

Tiếp theo, chúng ta edit file Cabal. Ví dụ sau khi edit, file haskell-hello-world.cabal của tôi có nội dung như sau:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
name:                haskell-hello-world
version:             0.1.0.0
synopsis:            Hello World!
description:         Print 'Hello World' to console screen
license:             BSD3
license-file:        LICENSE
author:              Viet Nguyen, 2015
maintainer:          viet.nguyen182@gmail.com
copyright:           Viet Nguyen
category:            Text
build-type:          Simple
cabal-version:       >=1.10

executable haskell-hello-world
  ghc-options:         -Wall
  hs-source-dirs:      src
  main-is:             Main.hs
  build-depends:       base >=4.7 && <4.8
  default-language:    Haskell2010

Một số điểm lưu ý từ file cabal trên:

  • Đặt hs-source-dirs là thư mục src để Cabal biết nơi lưu các file modules
  • Đặt main-is thành Main.hs để compiler biết đầu là main function của file binary build ra
  • ghc-options đặt thành -Wall để chúng ta có thể thấy các Warning từ GHC
  • build-depends là nơi khai báo các library cần sử dụng, có thể kèm theo các option về yêu cầu version.

File code của chúng ta nằm ở src/Main.hs có nội dung như sau:

1
2
3
module Main where

main = putStrLn "Hello World!"

Đây là một module rất đơn giản, và vì nó được dùng làm target cho main-is, nó phải có một function tên main và tên của module cũng phải tên là Main. Hiện tại, bạn chưa cần để ý vội đến cú pháp mà chỉ cần biết rằng chương trình in ra màn hình dòng chữ “Hello World!”. (Chú ý: Có thể bạn sẽ nghĩ putStrLn tương tự như printf hay cout ở C/C++, nhưng với Haskell, nguyên lý sẽ khác hơn so với bạn nghĩ, nhưng đó là câu chuyện ở những bài viết sau này.)

Tiếp theo, chúng ta tạo một Cabal sandbox để chứa toàn bộ các dependencies (ví dụ Hello World này của tôi hơi trivial, vì không dùng library nào cả, nhưng vì tính đầy đủ, tôi vẫn xin trình bày về sandbox ở đây):

1
$ cabal sandbox init

Sau bước này, chúng ta sẽ có file cabal.sandbox.config chứa thông tin về package environment, và sandbox nằm ở thư mục .cabal-sandbox

1
2
$ cabal install --only-dependencies
$ cabal install

Nếu build thành công, bạn sẽ có file binary haskell-hello-worlddist/build/haskell-hello-world. Thử chạy nó xem sao:

1
2
$ ./dist/build/haskell-hello-world/haskell-hello-world
Hello World!

Và chúng ta đã build thành công program đầu tiên!

Kết luận

Bài viết này là bài viết đầu tiên của tôi về Haskell. Chưa có gì nhiều về syntax, idea, concept, mà chỉ là những setup ban đầu để dễ dàng bắt đầu với Haskell. Trong những bài viết tiếp theo, tôi sẽ cố gắng từng bước một trình bày các ý tưởng của Haskell một cách dễ hiểu.

Hẹn gặp lại!

Copyright © 2015 kỹ thuật máy tính