Hiển thị các bài đăng có nhãn web. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn web. Hiển thị tất cả bài đăng

Thứ Năm, 8 tháng 10, 2015

[GUIDE] Tạo accordion menu nhiều cấp bằng CSS

Bài viết hướng dẫn tạo một CSS accordion menu đơn giản nhưng hỗ trợ nhiều level của các item bên trong. Cách làm này, có thể chạy trên nhiều trình duyệt khác nhau: IE9+, Safary, Chrome, Firefox.


Trong bài hướng dẫn này, menu chỉ dùng CSS, với việc apply :checked pseudo-class selector của CSS trên các element input checkbox.
Ngoài ra, trong phần demo cũng có một phiên bản sử dụng jQuery, nếu bạn muốn có thêm các hiệu ứng animation để tăng phần sinh động.


DEMO   DOWNLOAD SOURCE

Tạo cấu trúc HTML của menu


Cấu trúc HTML của menu này khá đơn giản: đó là sử dụng 1 list các item. Nếu một item trong list, lại có các item con, thì chúng ta sử dụng một input[type=checkbox] kèm với label của nó để làm top row. Và đồng thời, chúng ta sẽ thêm .has-children class vào item đó trên list. Tất cả các item ở list lớp ngoài cùng, mà không có item con, thì chỉ cần để môt thẻ link a là được.

Chi tiết code như dưới đây:


<ul class="cd-accordion-menu">
<li class="has-children">
<input type="checkbox" name="group-1" id="group-1" checked>
<label for="group-1">Group 1</label>

<ul>
<li class="has-children">
<input type="checkbox" name ="sub-group-1" id="sub-group-1">
<label for="sub-group-1">Sub Group 1</label>

<ul>
<li><a href="#0">Image</a></li>
<li><a href="#0">Image</a></li>
<li><a href="#0">Image</a></li>
</ul>
</li>
<li><a href="#0">Image</a></li>
<li><a href="#0">Image</a></li>
</ul>
</li>

<li><a href="#0">Image</a></li>
<li><a href="#0">Image</a></li>
</ul> <!-- cd-accordion-menu -->


Thêm style CSS

Chúng ta sử dụng một cách khá đơn giản (ngày nay thường làm thế này), để phát hiện ra item được click, và show các item con của nó, chỉ bằng CSS: đó là như đã đã nói ở trên, ta dùng một checkbox input element. Với việc select class :checked của input checkbox đó, ta sẽ bắt được element đó có checked hay chưa, và tiến hành show/hide các item con của nó bằng cách change display từ "none" thành "block" (và ngược lại nếu để hide đi).

Cụ thể step-by-step từng bước một như sau:

1) Đầu tiên, chúng ta phải kiểm tra lại rằng tất cả các item lớn bên ngoài mà có chứa các item con bên trong, thì cần phải có input checkbox như đã làm sample HTML ở trên
2) Chúng ta cũng phải chắc chắn rằng, khi mà chúng ta click vào label của nó, thì checkbox đó cũng tự động được check. Nếu bạn quen thuộc với HTML rồi, thì việc này khá là đơn giản, ở input checkbox bạn cần đặt cho nó một id value, và ở label, bạn cần đặt value id của checkbox vào thuộc tính for của nó.


Dưới đây là code CSS mà chúng ta sẽ sử dụng để hiển thị Menu bằng CSS ở trạng thái ban đầu:


.cd-accordion-menu input[type=checkbox] {
/* hide native checkbox */
position: absolute;
opacity: 0;
}
.cd-accordion-menu label, .cd-accordion-menu a {
position: relative;
display: block;
padding: 18px 18px 18px 64px;
background: #4d5158;
box-shadow: inset 0 -1px #555960;
color: #ffffff;
font-size: 1.6rem;
}


Bây giờ, ta nhận thấy rằng cấu trúc HTML cho input, label, list các item đã được xếp theo thứ tự. Tiếp theo, chúng ta dùng cơ chế select :checked của CSS để thực hiện hiển thị các element con bên trong nó bằng cách thay đổi value display từ "none" thành "block";


.cd-accordion-menu ul {
/* by default hide all sub menus */
display: none;
}

.cd-accordion-menu input[type=checkbox]:checked + label + ul,
.cd-accordion-menu input[type=checkbox]:checked + label:nth-of-type(n) + ul {
/* use label:nth-of-type(n) to fix a bug on safari (<= 8.0.8) with multiple adjacent-sibling selectors*/ /* show children when item is checked */ display: block; }


Như vậy là ta đã hoàn thành một menu accordion chỉ bằng CSS.

Nếu bạn muốn menu có thêm các hiệu ứng chuyển động animation khi cụp xoè (show/hide) item con, thì chỉ việc include thêm javascript vào.

DEMO:



Bài viết được dịch dựa vào nguồn: https://codyhouse.co/gem/css-multi-level-accordion-menu/

Thứ Sáu, 29 tháng 5, 2015

Google Photos - Ứng dụng và dịch vụ mới của Google từ IO 2015

Trong buổi thuyết trình ngày 28/5/2015 tại Google IO 2015, Google cũng giới thiệu dịch vụ Photos mới của mình.
Dịch vụ này được tách từ Google+ Photos ra thành một sản phẩm độc lập. Đồng thời Google bổ sung thêm nhiều tính năng mới để giúp việc sử dụng nó trở nên dễ dàng hơn. Đầu tiên là khả năng tìm kiếm và phân loại ảnh thông minh mà không cần bạn phải đánh tag hay đổi tên gì cả, kế tiếp là những cử chỉ mới để việc duyệt ảnh trở nên tiện lợi hơn trên app Photos mới (có cho Android, iOS và nền web). Nhưng điểm đáng chú ý nhất đó là Photos cho phép chúng ta lưu file ảnh độ phân giải cao đến 16MP và video 1080p mà không phải tốn đồng xu nào cả. Ứng dụng Photos đã có thể tải về ngay từ bây giờ.


Tải về:


1. Lưu ảnh/video độ phân giải cao không giới hạn


Với mục tiêu trở thành một khu vực lưu trữ và tổng hợp nội dung đa phương tiện cho người dùng, Google Photos cho phép chúng ta lưu ảnh và video lên đây mà không có bất kì sự giới hạn nào về dung lượng hay số lượng tập tin cả. Thứ duy nhất mà Photos hạn chế độ là độ phân giải: với ảnh là tối đa 16MP, còn với video là tối đa Full-HD. Tuy nhiên chỉ với hai độ phân giải này thì cũng đã dư dùng cho đa số chúng ta rồi. Google hứa hẹn sẽ nói thêm về không gian lưu trữ trên Photos trong thời gian tới.


2. Tìm kiếm, phân loại thông minh


Trong bài thuyết trình của mình, Google có trình diễn những tính năng thông minh này bằng một số ví dụ sau:

  • Gõ chữ "bão tuyết ở thành phố X", Photos tự động tìm các ảnh nào chụp trong khoảng thời gian thành phố X bị bão tuyết. Tương tự cho việc tìm kiếm các ảnh nào có xe, có chó, có đồng hồ... hiện diện
  • Tự động nhận biết gương mặt có trong ảnh, sau đó liệt kê và tìm kiếm các ảnh khác có gương mặt của người đó xuất hiện, và tất nhiên là không cần sự can thiệp nào từ người dùng một cách thủ công.
  • Hỗ trợ sắp xếp ảnh thông minh theo ngày giờ, sự kiện chụp
  • Tự động tinh chỉnh, áp dụng hiệu ứng (bao gồm cả HDR) cho ảnh
  • Tự động tạo các đoạn video vui vẻ bằng cách ghép nhiều ảnh hoặc video clip lại với nhau. Điều này khá giống tính năng Auto Awesome của Google+ Photos, có điều trong Photos thì tính năng này đổi tên thành Assistant. Cũng từ Assistant bạn có thể ghép ảnh theo kiểu collage, tạo câu chuyện ảnh... giống trên Google+.


​

3. Các cử chỉ duyệt ảnh mới


  • Với ứng dụng Photos trên Android và iOS, bạn có thể dùng một số cử chỉ cảm ứng sau để việc duyệt ảnh trở nên tiện và nhanh hơn:
  • Vuốt hai ngón tay vào trong (zoom out) để chuyển giữa chế độ xem ảnh chụp theo tuần, tháng hoặc năm
  • Vuốt hai ngón tay ra ngoài (zoom in) để làm điều ngược lại
  • Khi đang xem một ảnh nào đó, dùng một ngón tay vuốt lên để thu nhỏ ảnh và quay trở lại giao diện trước
  • Có thể chọn cùng lúc nhiều ảnh bằng cách nhấn giữ ngón tay rồi quét trên màn hình, giống như cách xài chuột để chọn nhiều file trên máy tính. Không cần nhấn chọn từng tấm một như trước nữa.


​

4. Chia sẻ nhanh


Dù bạn đang xem từng tấm ảnh lẻ hay đang coi một album cả trăm tấm thì Photos vẫn hỗ trợ chia sẻ cực kì nhanh chóng. Bạn chỉ việc nhấn một hai thao tác lên màn hình là đường link dẫn đến ảnh/album sẽ được tạo ra. Bạn có thể gửi đường link này cho bạn bè hay người thân xem, và người được chia sẻ không cần phải đăng nhập hay làm thêm chuyện gì phức tạp. Họ chỉ việc mở link đó bằng trình duyệt là đã có thể bắt đầu thưởng thức ảnh/video độ phân giải cao.

​

Bài viết được tổng hợp và trích dẫn từ: TinhTế và Google Photos Blog.

Thứ Ba, 12 tháng 5, 2015

Sublime Text 3 - Tuỳ chỉnh để tiện lợi cho develop ứng dụng PHP

Sublime Text 3 hiện đang là tools đình đám được các developer ưa dùng. Có thể bạn chưa biết hoặc đã biết, nhưng tôi không kìm được vẫn muốn nhắc tới mấy điểm mà tôi thích nhất khi sử dụng tools này để phát triển (không chỉ để làm web, mà còn tận dụng cho nhiều dự án khác nữa):


  • Chạy QUÁ NHẸ NHÀNG so với một full IDE mà vẫn thường được dùng trước kia như Eclipse, IntelljIDEA, VS, ... Bây giờ tôi mở cả chục projects, với hàng trăm hàng nghìn files không phải lăn tăn như trước nữa.
  • Do đang ở bản Beta, nên nó miễn phí, tuy nhiên bạn cứ yên tâm là chạy rất ổn định, hầu như không thấy bị crashed bao giờ cả (nếu bạn muốn crack nó thì làm theo hướng dẫn ở đây) và đa nền tảng: Mac OSX, Linux, Windows đều có, nên bạn không cần thiết phải đổi môi trường dev ưa thích của mình
  • Các extensions nhiều, phong phú, tiện lợi, cài đặt dễ dàng, và cũng hầu hết miễn phí
  • Open file nhanh bằng suggestion theo text mình gõ. Bạn không cần nhớ file nó nằm ở đâu, gõ tên, ST3 sẽ gợi ý file bạn muốn mở.
  • Chế độ tìm kiếm, replace, highlight rất dễ sử dụng
  • Chế độ Intelligent Suggestion hoạt động smooth, phù hợp nhu cầu sử dụng (tất nhiên không bằng tool chuyên dụng nhưng quá đủ để xài)
  • Có nhiều themes cả về text và giao diện tools, tha hồ chọn và tuỳ chỉnh theo cách bạn cho là chuyên nghiệp nhất
  • Sử dụng thêm phím Ctrl, bạn có thể edit cùng lúc nhiều chỗ khác nhau.
  • Tích hợp sẵn terminal vào nó luôn
  • Có nhiều extensions giúp bạn phát triển nhanh các PHP project dựa trên các OpenSource framework như Laravel, CakePHP,...
  • Vice versa.... :)


Dưới đây là một số các extensions mở rộng để cài đặt tiện lợi cho việc phát triển của chúng ta. Bạn nên cài chúng khi sử dụng Sublime Text 3 để phát triển ứng dụng của mình. Cách cài đặt cụ thể cũng như cách dùng tôi nghĩ là không làm khó được các developers chúng ta nên tạm thời không nêu ra ở đây.


Pack­age Con­trol (https://sublime.wbond.net)

Đây là ext để giúp bạn quản lý và cài đặt các exts khác dùng trong Sublime Text 3. Cách cài đặt, cũng như cách dùng thì bạn vào trang chủ của exts để xem. Nhờ có ext này mà việc cài đặt các plugin khác dễ dàng hơn rất nhiều và không tốn thời gian.


Sub­lime­CodeIn­tel (https://github.com/SublimeCodeIntel/SublimeCodeIntel)

Gói mở rộng này được dùng trong hầu hết trường hợp. Nó hỗ trợ cho bạn việc hiển thị các gợi ý ngay khi bạn code, về các functions, biến, object, string, ... Nó chính là bộ xương sống của tính năng Intelligent Suggesstion.

Sub­limeLin­ter (https://sublime.wbond.net/packages/SublimeLinter)

Gói mở rộng này sẽ giúp bạn biết ngay khi bạn gõ, rằng có thể bạn đã làm một điều gì đó sai, ví dụ, mở ngoặc mà quên đóng, quên dấu ; ở cuối dòng lệnh,...
Với riêng PHP + CSS + Javascript, bạn nên cài một số thành phần phụ cho SublimeLinter này, nhờ vào Package Control:
  • SublimeLinter-php
  • SublimeLinter-jshint
  • SublimeLinter-json
  • SublimeLinter-csslint

Side­BarEn­hance­ments (https://sublime.wbond.net/packages/SideBarEnhancements)

Cung cấp bạn một số tuỳ chỉnh khi bạn nhấn chuột phải vào các thành phần đang hiển thị ở sidebar bên trái (file, folders). Rất tiện lợi.


VCS Gut­ter (https://sublime.wbond.net/packages/VCS%20Gutter)

Exts hỗ trợ bạn trong khi làm việc với git/mercurial. Nó sẽ cập nhật thông tin & status tại real-time (thời gian thực) của một file. Nhờ đó bạn nhanh chóng biết được file nào đã được thêm, xoá, hoặc sửa đổi ....

Trail­ing­Spaces (https://github.com/SublimeText/TrailingSpaces)

Tiện lợi ở chỗ là các dấu trắng ở cuối dòng lệnh, hoặc dòng trắng cuối file sẽ tự động trim. Có thể bạn không biết, khi chúng ta dùng các tools/IDE khác nhau để code, có một số tools sẽ thêm vào các ký tự trắng này vào cuối dòng lệnh.

Brack­etHigh­lighter (https://github.com/facelessuser/BracketHighlighter)

Nhờ exts này, bạn khi di chuột đến dấu mở { / hoặc đóng } thì cả cặp sẽ tự động được highlight lên để bạn biết.

Ter­mi­nal (http://wbond.net/sublime_packages/terminal)

Chức năng của Terminal thì bạn biết rồi. Ext này sẽ đính sẵn terminal để bạn sẵn sàng sử dụng ngay trong Sublime Text 3.

Xde­bug Client (https://sublime.wbond.net/packages/Xdebug%20Client)

Xdebug Client tích hợp Xdebug vào ST3, bạn dễ dàng debug ứng dụng PHP của mình>

Một số gói khác ít dùng hơn, nhưng cũng tiện lợi, bạn nên thử:

- Sass (https://sublime.wbond.net/packages/Sass): Giúp bạn làm việc với file sass dễ dàng như là: highlight các từ khoá,...
- Sub­limerge (http://www.sublimerge.com/): Công cụ so sánh file, hay dùng khi bạn merge code, hoặc apply patch từ người khác vào code của mình.


Một số tuỳ chỉnh khác bạn nên dùng

Tôi rất hay dùng các tuỳ chỉnh cá nhân này, bạn có thể tham khảo:

Để sử dụng phần settings này, các bạn vào **Menu Sublime Text > Preferences > Settings - User** (Mac OS X, tương tự cho Windows hoặc Linux) để chỉnh.


{
"auto_indent": true,
"bold_folder_labels": true,
"caret_style": "phase",
"detect_indentation": false,
"draw_indent_guides": true,
"draw_white_space": "selection",
"fade_fold_buttons": false,
"find_selected_text": true,
"fold_buttons": true,
"font_size": 15.0,
"highlight_line": true,
"highlight_modified_tabs": true,
"ignored_packages":
[
"Vintage",
"Sublimerge Pro"
],
"line_padding_bottom": 2,
"line_padding_top": 2,
"rulers":
[
80,
120
],
"tab_size": 4,
"theme": "Soda Dark 3.sublime-theme",
"todo":
{
"case_sensitive": true,
"patterns":
{
"CHANGED": "CHANGED[\\s]*?:+(?P\\S.*)$",
"FIXME": "FIX ?ME[\\s]*?:+(?P\\S.*)$",
"NOTE": "NOTE[\\s]*?:+(?P.*)$",
"TODO": "TODO[\\s]*?:+(?P.*)$"
}
},
"translate_tabs_to_spaces": true,
"trim_automatic_white_space": true,
"trim_trailing_white_space_on_save": true,
"use_tab_stops": true,
"word_separators": "./\\()\"'-:,.;<>~!@#$%^&*|+=[]{}`~?",
"word_wrap": true
}

Thứ Sáu, 13 tháng 2, 2015

Các công ty tuyển dụng cần gì ở lập trình viên PHP?

Để tuyển dụng được một lập trình viên tốt, thì nhà tuyển dụng thường đặt khá nhiều kỳ vọng vào các kỹ năng mà lập trình viên đã tự trang bị được cho mình, chẳng hạn như: làm việc nhóm, độc lập, tư duy tốt, tự tìm tòi và học hỏi, nghiên cứu nhanh,...
Trong bài này, chỉ bàn riêng về chuyên môn trong lĩnh vực PHP, các nhà tuyển dụng cần gì ở một lập trình viên? Bạn đã chuẩn bị được những kỹ năng gì để đi xin việc làm một lập trình viên PHP.


Những kỹ năng bắt buộc

Những kỹ năng dưới đây là bắt buộc khi bạn làm một lập trình viên PHP.

Bắt buộc 1: Nắm chắc kiến thức cơ bản về lập trình web với HTML, CSS (và cả JS thì là tốt nhất)

PHP là để lập trình web, mà HTML+CSS(+JS) là bộ cơ sở đi với nhau, và do đó, bạn muốn làm web mà không biết HTML+CSS thì chắc chắn là không thể được. Thực tế, với HTML+CSS bạn không cần phải biết tường tận mọi ngõ ngách, không cần phải siêu đẳng, thế nhưng những thứ thường gặp bạn cần phải nắm rõ.
Ví dụ:
- Với HTML bạn cần hiểu biết trong đầu về thẻ là gì, các thẻ thường làm có meta, div, các thẻ h, span, p, a, form, ...
- Với CSS bạn cần hiểu biết về: border, padding, margin, float, overflow, z-index, background, color, :hover,...
- Với JS: bạn có thể làm chưa quen, nhưng bạn cũng cần phải đọc được các câu lệnh JS đơn giản để: show/hide element, get/change/remove css class,...

Những thứ trên là các kiến thức rất cơ bản, nếu bạn không nắm chắc, hãy kiếm những quyển sách rất đơn giản và học lại, làm theo những bước trong sách hướng dẫn, thử thay đổi các tham số để hiểu rõ hơn về việc mình thực hành.

Nhấn mạnh lại một điều nữa để bạn hiểu rõ, Không nắm được HTML+CSS, đừng nghĩ đến chuyện làm WEB, và cũng đừng nghĩ đến chuyện làm PHP.


Bắt buộc 2: Về ngôn ngữ PHP

Bạn làm về PHP, rõ ràng bạn phải hiểu được cơ bản về nó. Cách bạn đặt biến như nào, đặt hàm như nào, làm thế nào để gọi,... rồi những vấn đề cơ bản như: hiển thị một chuỗi lên HTML bằng PHP như thế nào, PHP kết nối đến DB như là MySQL ra làm sao,... Bạn có thể quên quên nhớ nhớ, nhưng khi đưa code có sẵn ra bạn phải đọc được và hiểu được, rồi mới tính đến chuyện tự tay code được. Bạn đọc hiểu code có sẵn không được thì làm sao mà code được.

Những kỹ năng cạnh tranh, làm lợi thế

Nếu bạn tu luyện được một trong các kỹ năng dưới đây, ngoài việc tăng khả năng kiếm được một công việc như ý về PHP, bạn còn có lợi thế nhất định khi đàm phán lương bổng.

Thành thạo một, hoặc nhiều thì càng tốt, các PHP framework

Với cộng đồng PHP lớn mạnh, cũng như vị trí của bộ sậu PHP-MySQL trong thế giới web, thì việc mà có vô số các sản phẩm opensource, hoặc có phí là điều dễ hiểu. Tương tự đó, rất ít các công ty phát triển web làm từ đầu sản phẩm của mình, mà thường dựa vào một nền tảng framework nào đó để tuỳ biến. Nhất là các công ty ở Việt Nam, có rất ít công ty bỏ tiền ra đầu tư làm từ đầu sản phẩm của mình. Do đó, bạn nắm được nhiều framework thì bạn lại càng có nhiều lợi thế hơn khi xin việc cũng như khi đàm phán lương bổng.

Các framework đáng chú mà các bạn cần bỏ thời gian nghiên cứu, làm thử gồm:
- Về CMS: Wordpress, Joomla, CakePHP, Yii, Laravel, ...
- Về eCommercer: Magento, OpenCart, Shopify,...
- Ngoài ra, còn có một số khác, mặc dù ít gặp ở VN nhưng không phải là không cần: CRM như Sugar hoặc Tiger,...

Thành thạo làm Responsive



Với thời điểm bùng nổ smartphone, tablet iOS, Android như hiện tại, việc có thêm kỹ năng làm web Responsive là cực kỳ quan trọng. Các website lớn, hoặc chuyên nghiệp sẽ yêu cầu điều này. Việc học cách để làm responsive này cũng không tốn nhiều thời gian, vì cũng như PHP, hiện có rất nhiều framework giúp cho các bạn về việc này. Và do đó, tôi recommend, hoặc xúi các bạn cũng có thể nói là vậy, nên học thêm Bootstrap, sau đó là Foundation framework. Ngoài ra cũng nên dành thời gian tìm hiểu thêm việc ứng dụng HTML5, các hiệu ứng CSS mới,...

Thành thạo các Javascript framework, tối đặc biệt JQuery

Tương tự với các quan điểm trên, bạn cũng nên nắm được vững cách sử dụng JQuery. Tài liệu hướng dẫn rõ ràng dễ hiểu, các biện pháp giải quyết khó khăn bằng JQuery nhiều vô kể. Và cũng có vô số người sẵn sàng giúp bạn trên StackOverflow.


Một số kỹ năng, hoặc hiểu biết khác

Ngoài những điểm đề cập trên, thật tuyệt vời nếu nhà tuyển dụng cũng biết được bạn thành thạo, hoặc đã từng làm, hoặc có hiểu biết, hoặc thậm chí là có nghe nói đến một số các thứ sau đây:
- Kỹ thuật về AJAX với JQuery.
- JSON
- Restful Webservices
- Tương tác với web API, request header, response header
- AngularJS
- Thành thạo các tool như Sublime Text, Notepad++, IntelliJ IDEA,...
- Cách deploy một web PHP lên hosting bằng FTP, CPanel,...


Bạn cũng nên theo dõi blog này thường xuyên, tôi sẽ post các bài hướng dẫn lập trình từ cơ bản đến phức tạp trên một số lĩnh vực như web, android, ios...


Thứ Ba, 10 tháng 2, 2015

AngularJS Tutorial - Bài 1: Giới thiệu

Angular là một MVW Javascript framework rất hấp dẫn để xây dựng nên những ứng dụng web. Angular được xây dựng, phát triển bởi Google, và nó cung cấp những tính năng rất hiện đại cho việc xây dựng web. MVW là viết tắt của Model-View-Whatever, bạn có thể thấy rằng tham vọng cũng như những gì nó mang lại là rất lớn, và nó sẽ hỗ trợ chúng ta một cách mềm dẻo flexible để phát triển mọi thể loại ứng dụng. Trong MVW, chữ W có thể được thay thế để bạn có thể đi theo các hướng MVC (Model-View-Controller) hoặc MVVM (Model-View-ViewModel), do đó bạn có thể thấy được sự quen thuộc nhất định khi bắt tay vào tìm hiểu và sử dụng Angular.

Bài này là một trong series các bài viết:


Trước khi biết về Angular JS, bạn sẽ không thể ngờ rằng HTML còn có thể trở nên "ĐỘNG" và tiện dụng đến như vậy. Bạn thử tưởng tượng rằng, web của bạn sẽ kết nối với server API, lấy về result dưới dạng JSON, Angular JS sẽ đóng vai trò data-driven để biến JSON đó thành những Models. Bạn có thể nhanh chóng update lên HTML content mà không cần phải refresh lại trang,...


Angular thì miễn phí và open-source do đó bạn có thể thoải mái sử dụng và tuỳ biến theo ý thích của mình.

Dưới đây là một sơ đồ mà tôi vẫn hay sử dụng khi làm việc với AngularJS:




Angular thích hợp sử dụng nhất cho những ứng dụng có 1 trang SPA - Single Page Application.
Thông qua các bài tutorial này, bạn sẽ lần lượt làm quen với những tính năng nổi trội mà Angular JS mang lại.

Đối tượng hướng đến

Các bài trong series này hướng đến những người đã có ít nhiều kinh nghiệm lập trình web, làm việc với Javascript.
Do đó, bạn cần tham khảo phần các yêu cầu chuẩn bị trước khi theo dõi các bài tutorial này.

Điều kiện để học Angular JS

Để làm quen và sử dụng Angular, bạn phải có những kiến thức, hiểu biết cơ bản về những môn sau:
Ngoài ra, bạn có thêm được các kiến thức công nghệ về JQuery, HTML5, AJAX, JSON, Restful Webservices,... thì lại càng lợi thế hơn khi học Angular.


Các tính năng Cơ bản của Angular JS


Nhìn tổng quát ở sơ đồ trên, ta có thể thấy được những tính năng chính do Angular JS cung cấp gồm có:
  • Data-binding Sự gắn kết data lưu trong model với view

    Angular có khả năng tự động đồng bộ hoá data giữa Model và View. Data được thay đổi trên View (thông qua input field) sẽ ngay lập tức được cập nhật vào Model javascript object. Ngược lại, javascript object khi có thay đổi, có thể là từ JSON phía server API trả về, sẽ được tự động cập nhật hiển thị lên HTML view ngay mà bạn không cần phải can thiệp vào. Đây chắc chắn là thế mạnh mà bạn sẽ cực kỳ thích thú.
  • Scope

    Scope có thể hiểu là những objects model ở tầng application (chú ý, nó không chỉ là Model để lưu các giá trị thuộc tính của object trong OOP, mà nó còn lưu cả các cài đặt cho application ở thời điểm hiện tại nữa). Và chúng sẽ đóng vai trò kết nối giữa controller với view. Chẳng hạn, bạn sẽ gán action cho button đến một hàm trong scope.
  • Controller

    Controller trong Angular JS sẽ chứa các javascript method, và giới hạn trong một scope cụ thể.
  • Services

    AngularJS cung cấp một vài services sẵn, ví dụ như $http để thực hiện một lời gọi AJAX (XMLHttpRequest) đến server API. Những services này là những object duy nhất, dùng chung trong toàn app, và nó chỉ được khởi tạo một lần. Bạn sẽ có thể sẵn sàng sử dụng các object này ngay bất cứ lúc nào, và Angular framework sẽ quản lý những object này giúp bạn.
  • Filters - Các bộ lọc

    Bạn sẽ sử dụng các bộ lọc này để lọc ra được những item từ một arrays nào đó.
  • Directives - Điều hướng

    Các điều hướng là những đánh dấu (markers) trên các thành phần DOM. Nó có thể là bản thân cả element, thuộc tính, css,... để giúp bạn thao tác với element đó. Directives cũng có thể được sử dụng để tạo ra những thẻ HTML tuỳ biến, các widgets. AngularJS cung cấp sẵn một số directive thường dùng, mà sau này bạn sẽ quen thuộc, ví dụ như ngBind, ngModel, ...
  • Templates - Mẫu giao diện

    Template sẽ những view hiển thị các thông tin từ model do controller chỉ thị. Nó có thể là một file (ví dụ index.html), có thể là nhiều view như là những thành phần con (partials) để ghép lại thành một màn hình.
  • Routing - chuyển hướng trang web

    Nếu bạn đã từng làm việc với các framework MVC, bạn sẽ hiểu khái niệm này. Routing sẽ giúp bạn chỉ định view nào sẽ hiển thị, nếu người dùng truy cập vào URL có patterns như thế nào. Nghĩa là nó sẽ thay đổi views hiển thị tương ứng với ngữ cảnh.
  • MVW - Model View Whatever

    MVW là một design pattern mà chia một ứng dụng thành các phần Model, View, và thường là Controller tương tự là MVC truyền thống. Mỗi phần sẽ có khả năng và vai trog đáp ứng riêng. So với MVC truyền thống, MVW còn pha trộn thêm MVVW (Model-View-ViewModel). Và cái tên MVW Model View Whatever là do Angular JS team đặt ra.
  • Deep Linking - Liên kết sâu

    Deep linking liên kết sâu cho phép ta mã hoá tình trạng của ứng dụng vào URL, và ta có thể bookmark lại được. Sau đó, ứng dụng có được dựng lại hoàn toàn trạng thái của nó sau này khi ta access vào URL đó.
  • Dependency Injection

    AngularJS có sẵn một hệ thống injection để developers có thể dễ dàng tạo, hiểu, và kiểm tra ứng dụng.



Ưu điểm của AngularJS

  • Với concept ý tưởng, cũng như những thành phần có sẵn mà Angular cung cấp, ta có thể thấy là những ứng dụng SPA Single Page Application - Ứng dụng một trang, sẽ rất thực hiện một các rõ ràng clean, và dễ cho bảo trì code.
  • Với việc mà binding được data vào HTML DOM, nó rất nhanh update data qua lại giữa view và model.
  • Code viết với AngularJS rất dễ test.
  • AngularJS sử dụng injection để bạn ngăn cách và hiểu một cách tách bạch được những thứ liên quan đến nhau.
  • Có thể viết theo hướng tái sử dụng.
  • Với AngularJS, các lập trình viên developers sẽ chỉ cần code ít hơn cho những tính năng lớn.
  • Trong AngularJS, các views là những trang HTML code thuần; các Controller thì được viết bằng javascript để thực hiện các nghiệp vụ business.
  • Và điều quan trọng nhất, ứng dụng viết bằng AngularJS sẽ chạy trên hầu hết các trình duyệt hiện nay, bao gồm cả các trình duyệt trên smart phones, tablets máy tính bảng, đương nhiên là bao gồm cả iOS và Android :)

Nhược điểm của AngularJS

Mặc dù có nhiều lợi ích khi sử dụng AngularJS, tuy nhiên không có gì là hoàn hảo, bạn cũng cần xem xét một số nhược điểm của Angular để có kế hoạch cho mình khi develop app bằng AngularJS. Điều may mắn là những nhược điểm này có thể khắc phục hoặc hạn chế được, đủ để ta yên tâm coding app bằng AngularJS.
  • Không an toàn: Vì nó là nền tảng dựa trên javascript, có nghĩa là nó chạy phía client. Điều này đồng nghĩa với việc người dùng có hiểu biết về coding, có mục đích mờ ám, thì họ có thể sửa đổi code phía client trước khi submit lên server. Do đó, một số các tác vụ quan trọng, bạn nên thực hiện phía server, ví dụ: Authenticate và Authorization (xác thực và kiểm tra quyền của người dùng); thực hiện validation với những data được submit lên API trước khi save hoặc thao tác với data do người dùng submit lên đó. Do đó cách tốt nhất là dùng AngularJS để query vào các WebService API, không nên save trực tiếp data vào database mà không check.
  • Nếu người dùng ứng dụng, bật chức năng chặn Javascript, bạn sẽ không thể làm gì được, webpage sẽ chỉ hiển thị được những thông tin cơ bản, và đương nhiên là các thao tác business sẽ không hoạt động. Tuy nhiên điều này có lẽ ít xảy ra, nhưng bạn cũng cần consider chuyện này.





Tài liệu tham khảo

Bạn có thể tham khảo các ví dụ, cũng như hướng dẫn từ trang chủ Angular JS.

AngularJS Tutorial: Hướng dẫn lập trình web với AngularJS

Tôi đã thực sự ngạc nhiên và thích thú với những gì mà AngularJS có thể làm được. Thậm chí tôi đã liên tục thấy xuất hiện suy nghĩ trong đầu rằng: "Tất cả web, hay ứng dụng hybrid từ giờ về sau sẽ hướng theo việc sử dụng những tính năng tuyệt vời do AngularJS mang lại để tiết kiệm công sức, thời gian". Trong thời gian tới, với việc HTML5 dần phổ biến, các thiết bị di động với các trình duyệt có bộ dựng tốt hơn, thì đây sẽ là xu hướng có rất nhiều ích lợi. Bạn sẽ dần mê mẩn AngularJS như tôi hiện tại sau khi bắt tay vào tìm hiểu và lập trình với AngularJS.

Đây sẽ là một loạt các bài viết hướng dẫn lập trình web với thư viện Javascript là AngularJS.



Thứ Sáu, 6 tháng 2, 2015

Giới thiệu về Ruby, Ruby on Rails - Introduction of Ruby, Ruby on Rails

Ruby đang phát triển chóng mặt, dần trở thành ngôn ngữ lập trình được ưa thích và dễ kiếm ra tiền từ nó.

Ở vào thời điểm hiện tại, bạn có rất nhiều lựa chọn một ngôn ngữ lập trình để theo đuổi. Ví dụ như học Java: bạn có thể làm được phần mềm chạy trên PC, hoặc cross-platform đa nền tảng, làm web, phát triển ứng dụng cho các thiết bị Android - nghề mới đang rất hot. Tương tự như Java, các công nghệ development bằng bộ .NET Framework của Microsoft cũng đã hấp dẫn rất nhiều lập trình viên trong mấy chục năm qua. Hay là bạn có thể làm web với bộ PHP-MySQL...

Tuy nhiên, Ruby đang là một "HOT TREND", một xu hướng mới thu hút nhiều lập trình viên tham gia phát triển các ứng dụng của mình bằng ngôn ngữ này.


Vậy, Ruby là gì?

Đọc đến đây, bạn đang tự hỏi vì sao Ruby đang dần trở nên phổ biến?
Các fans của Ruby thì khen nó là một ngôn ngữ lập trình "beautyful - đẹp", "artful - đầy nghệ thuật". Không chỉ thế, họ còn nói rằng nó rất tiện dụng dễ học dễ làm.

Những lời khen có cánh đó không phải là vô lý nếu bạn tiếp tục theo dõi bài viết này, và có thể ngay sau đó, bạn sẽ hào hứng bắt tay vào học Ruby.

Ý tưởng của Người tạo ra Ruby

Ruby là ngôn ngữ rất quan tâm đến sự cân bằng. "Cha đẻ" ra nó, Yukihiro Matsumoto "Matz" (người Nhật Bản), đã pha trộn những phần tuyệt vời nhất mà ông nhận thấy ở những ngôn ngữ ông ưa thích trước đó (Perl, Smalltalk, Eiffel, Ada, Lisp) vào một ngôn ngữ mới, cân bằng giữa yếu tố: lập trình chức năng với sở thích lập trình.

Ông thường nói rằng ông "cố gắng làm cho Ruby trở nên tự nhiên, không phải đơn giản". Và thế là coding bằng ngôn ngữ Ruby được hiển thị (appearance) một cách rất đơn giản, nhưng bên trong nó lại rất phức tạp, giống như cơ thể con người vậy.

Về sự phát triển của Ruby

Kể từ khi được giới thiệu vào năm 1995, Ruby đã không được sự ủng hộ của giới coder. Tuy nhiên, đến năm 2006, nó đã được chấp nhận rộng rãi.
Khắp nơi người ta đã nói đến Ruby, và vào top 10 các ngôn ngữ được bàn luận nhiều nhất.
Hiện tại cũng có vô vàn các group nhỏ vẫn đang thảo luận về Ruby. Đặc biệt là RoR - Ruby on Rails.

Ruby cũng Hoàn Toàn Miễn Phí. Bạn không phải trả một xu nào, thoải mái sử dụng, sửa chữa, phân phối lại cho người khác.

Những điểm nổi bật của Ruby so với ngôn ngữ khác


Trong Ruby - mọi thứ đều được coi là một Object
Khởi đầu, Matz đã tham khảo các ngôn ngữ khác để tìm một ý tưởng về cú pháp các câu lệnh. Nhớ lại lúc đó, ông nói: "Tôi đã muốn một ngôn ngữ kịch bản mà có nhiều sức mạnh hơn Perl, và hướng đối tượng Object-Oriented hơn là Python2".

Trong Ruby, mọi thứ là một đối tượng object. Mỗi bit thông tin, và code có thể sở hữu các thuộc tính cũng như actions của chúng. Lập trình hướng đối tượng gọi các properties là các biến instance, và các actions thường được biết như là những methods phương thức. Phương thức thuần hướng đối tượng của Ruby thể hiện qua một dòng code dưới đây, đó là áp dụng action vào một số.

5.times { print "We *love* Ruby -- it's outrageous!" }

Dòng code trên nghĩa là thực hiện 5 lần liên tiếp việc in ra dòng text: "We *love* Ruby -- it's outrageous!"


Trong nhiều ngôn ngữ, numbers số và một số kiểu dữ liệu gốc primitive types không phải là object (ví dụ trong java boolean, int, float,...). Ruby thì làm theo cách của ngôn ngữ Smalltalk bằng cách cung cấp các methods cũng như là các properties cho toàn bộ các kiểu data.

Tính mềm dẻo của Ruby’s Flexibility
Ruby được thấy là một ngôn ngữ khá mềm dẻo, khi mà nó cho phép người dùng tự do thay đổi các thành phần của nó. Ngay cả những thành phần nòng cốt của Ruby cũng có thể bị loại bỏ đi, hoặc có thể định nghĩa lại nếu muốn. Các phần đang sẵn có thì có thể thêm vào tuỳ thích. Ruby cố gắng không hạn chế coder.

Ví dụ, phép cộng được thực hiện thông qua ký tự (+). Nhưng, bạn nếu muốn nó trở nên dễ đọc hơn nữa, bạn có thể thêm mới 1 method vào lớp Numeric có sẵn của Ruby như dưới đây:


class Numeric
def plus(x)
self.+(x)
end
end


y = 5.plus 6
# kết quả là y = 11



Blocks - Khối: a Truly Expressive Feature Một tính năng thực sự Ấn tượng
Khối trong Ruby, cũng được xem là nguồn gốc của tính mềm dẻo tuyệt vời của nó. Một coder có thể gán một closure (tôi cũng không biết được từ tương đương trong tiếng Việt nữa) cho mọi method, mô tả method đó sẽ làm gì. Closure được gọi là một block và trở thành một tính năng phổ biến nhất đối với những người mới chuyển sang code Ruby từ các ngôn ngữ khác như PHP hoặc VB.

Block được lấy cảm hứng từ tính năng của ngôn ngữ. Matz nói, "trong Ruby closures, tôi muốn bày tỏ sự cảm ơn đến văn hoá của ngôn ngữ Lisp."


search_engines =
%w[Google Yahoo MSN].map do |engine|
"http://www." + engine.downcase + ".com"
end

Trong đoạn code trên, block được mô tả bên trong cấu trúc do ... end. Phương thức map được gán cho block để cung cấp một danh sách các từ.
Có nhiều method trong Ruby để lại một lỗ trống mở cho code có thể tự viết block của mình nhằm thực hiện việc mà method cần làm.

Ruby và Mixin
Không giống như nhiều ngôn ngữ hướng đối tượng khác, Ruby chỉ cho phép thừa kế đơn. Nhưng Ruby cũng có những concept về modules (trong Objective-C thì gọi là Categories). Modules là một tập các methods.

Trong lập trình hướng đối tượng, mixin là một class tổng hợp chứa nhiều methods từ các class khác.
Các class có thể mixin một module, và ngay lập tức có được các methods có trong module đó. Ví dụ


class MyArray
include Enumerable
end

Trong đoạn code trên, class MyArray sẽ đồng thời có cả những method do class Enumerable cung cấp.

Thông thường, những Ruby developer nhìn việc này là cách rõ ràng hơn là đa thừa kế, đa thừa kế vốn rất phức tạp và quá hạn chế.


Ruby’s Visual Appearance - Cái nhìn về Ruby (sự hiển thị code để bạn có thể đọc được)
Trong khi Ruby thường sử dụng rất hạn chế các dấu chấm, và thường sử dụng các từ khoá bằng English, thậm chí phép đánh dấu chấm thường chỉ để sử dụng trang trí. Ruby không phải khai báo biến, nó sử dụng một quy tắc rất đơn giản để hiển thị phạm vi scope của biến.


  • var là local variable.
  • @var là instance variable.
  • $var là global variable.

Việc đánh dấu như vậy cải thiện việc đọc code, cho phép lập trình viên dễ dàng xác định được vai trò của các biến. Và rõ ràng là việc sử dụng các self., hoặc this. cũng trở thành không cần thiết nữa.


Xa hơn những điều cơ bản trên
Ngoài những điều cơ bản trên, Ruby còn rất giàu có các tính năng khác như dưới đây:

  • Ruby cũng có các tính năng để bắt các exception như là Java hoặc Python, giúp ta dễ dàng xử lý lỗi.
  • Ruby có cơ chế tự thu dọn rác với tất cả các objects. Như Matz nói, "Điều này tốt hơn cho sức khoẻ của bạn."
  • Viết các phần mở rộng bằng C trong Ruby thì dễ hơn là Perl hoặc Python, và cũng rất dễ dàng cho gọi các Ruby API từ C. Bao gồm cả việc gọi Ruby nhúng trong một phần mềm, để sử dụng như là một ngôn ngữ kịch bản. Một giao diện SWIG cũng được cung cấp sẵn.
  • Ruby có thể tải các thư viện mở rộng một cách động, nếu OS cho phép.
  • Ruby độc lập với OS theading. Vì thế, với mọi nền tảng mà Ruby có thể chạy, bạn sẽ có khả năng đa luồng multithreading, không cần biết là OS có hỗ trợ hay không, ngay cả MS-DOS!
  • Ruby cơ động cao: Nó có thể được develop trên hầu hết GNU/Linux, và có thể hoạt động trên nhiều máy UNIX, Mac OS X, Windows, DOS, BeOS, OS/2, ...



Các biến thể của Ruby
Ruby, là một ngôn, nó có một vài biến thể khác. Mặc định Ruby thường được hiểu là MRI ("Matz's Ruby Interpreter") hoặc CRuby (vì nó được viết bằng C). Nhưng có một số biến thể khác nhằm những mục đích riêng, ví dụ như là cung cấp các tính năng kết nối mở rộng đến các ngôn ngữ khác, hoặc các môi trường khác, hoặc các tính năng đặc biệt khác mà MRI không có.

Danh sách một số biến thể thông dụng:
  • JRuby là đỉnh của JVM, lợi dụng được các tối ưu hoá của trình biên dịch JIT, bộ dọn rác, concurrent threads, các thư viện,...

  • Rubinius là ‘Ruby được viết bằng Ruby’. Sử dụng bộ LLVM, Rubinius cũng có một VM tốt như là các ngôn ngữ top khác.
  • MacRuby là Ruby được viết để kết hợp với bộ thư viện Cocoa trên các nền tảng của Apple như là Mac OS X, cho phép bạn viết các ứng dụng desktop một các dễ dàng.
  • mruby là một bản gọn nhẹ của Ruby, có thể được nhúng vào trong một ứng dụng khác. Nó được phát triển, và dẫn dắt bởi "cha đẻ" của Ruby Yukihiro “Matz” Matsumoto.
  • IronRuby là một bản Ruby có thể kết hợp với .NET Framework.

Thứ Ba, 3 tháng 2, 2015

Hướng dẫn Setup môi trường development APACHE-MYSQL-PHP trên Mac OS X 10.10 Yosemite

Bài viết này hướng dẫn cách tạo dựng một môi trường Apache-MySQL-PHP (còn gọi tắt là AMP) đầy đủ, thuận tiện cho develop các ứng dụng PHP ở local trên HĐH Mac OS X 10.10 Yosemite.

Các thành phần sẽ cài đặt gồm có:

Apache / Web Sharing

Mặc định, Mac Yosemite đã được cài sẵn một phiên bản Apache và được kích hoạt để chạy sẵn. Chúng ta không được cung cấp một tuỳ chọn, hoặc một GUI cài đặt nào để có thể tuỳ chỉnh, cũng như ON/OFF chức năng này. Do đó, hầu hết việc thay đổi sẽ được dựa vào Terminal để thực hiện. Đối với anh em lập trình viên thì điều này cũng không phải là khó khăn gì, và rất nhanh thôi chúng ta sẽ quen thuộc với việc gõ lệnh trên Termanal tiện dụng hơn nhiều lần so với tool Command Prompt trên Windows :)

Để START Apache, chúng ta gõ lệnh:
sudo apachectl start

Để STOP Apache, chúng ta gõ lệnh:
sudo apachectl stop

Để RESTART Apache, chúng ta gõ lệnh:
sudo apachectl restart

Và để kiểm tra lại version Apache hiện có, ta gõ lệnh:
httpd -v

Nếu mọi thứ hoạt động một cách bình thường, thì ngay lập tức ta đã có thể kiểm tra bằng cách mở trình duyệt Safari và gõ vào địa chỉ
http://localhost/
kết quả:



Root Document

Document Root là nơi chứa các files, thư mục phục vụ cho việc vận hành một website. Và thường được đặt bởi các tên thông dụng như "public_html", "htdocs",...

Trong Mac Yosemite, thì mặc định sẽ có 2 Document Root được thiết lập. Một dành cho system level, một dành cho user level. Với system level thì cả hệ thống sẽ dùng chung, còn với user level thì mỗi user trong máy có thể thiết lập riêng một thư mục làm Document Root cho mình.

Nếu bạn có quyền, bạn có thể cài đặt lại để có thể dùng chung cả system level và user level vào chỉ một thư mục.

System Level Web Root

Mặc định, System Level Web Root có địa chỉ web là:
http://localhost/
và được đặt ở thư mục vật lý có đường dẫn (path):
/Library/WebServer/Documents/


User Level Web Root

User Level Web Root đặt ở địa chỉ "~/Sites" trong Home của mỗi User. Và mặc định thì thư mục này không được tạo sẵn. Do đó chúng ta phải tạo thư mục "Sites" trong Home của user của mình thì nó sẽ hoạt động bình thường.

Ngay sau khi chúng ta tạo ra thư mục "Sites" thì có thể thấy hệ thống tự động thay đổi icon của thư mục thành một icon dễ dàng nhận biết là thư mục web.

Để bắt đầu làm việc với thư mục này, chúng ta cần phải có một vài tweaks (tinh chỉnh sửa đổi) nho nhỏ trước, theo các bước dưới đây.

Thêm file config tuỳ chỉnh theo username

Tạo một file “username.conf” bằng cách gõ các lệnh sau trong Terminal:
cd /etc/apache2/users/

Thay username.conf trong câu lệnh dưới đây bằng username của user mà bạn đang dùng. Nếu bạn không rõ thì cõ thể gõ lệnh "whoami" trong Terminal để biết username mà mình đang dùng.
sudo nano username.conf

Sau khi gõ vào mật khẩu Admin, trình Terminal sẽ chuyển sang chế độ soạn thảo, và bạn cần đưa vào nội dung dưới đây:

<Directory "/Users/username/Sites/">
AddLanguage en .en jp .jp vi .vn
LanguagePriority en jp vn
ForceLanguagePriority Fallback
AllowOverride All
Options Indexes MultiViews FollowSymLinks
Order allow,deny
Allow from localhost
Require all granted
</Directory>


Nhấn nút control + O để tiến hành write file.
Nhấn nút control + X để thoát chế độ soạn thảo trên Terminal.

Thay đổi quyền truy cập file username.conf như dưới đây:
sudo chmod 644 username.conf

Thay đổi các tuỳ chọn ở cài đặt gốc của apache httpd - add modules

Gõ vào Terminal lệnh sau để có thể tiến hành thay đổi nội dung file httpd.conf:
sudo nano /etc/apache2/httpd.conf

Chắc chắn rằng 3 module sau cần được cài đặt (bỏ dấu # đầu dòng nếu có):
LoadModule authz_core_module libexec/apache2/mod_authz_core.so
LoadModule authz_host_module libexec/apache2/mod_authz_host.so
LoadModule userdir_module libexec/apache2/mod_userdir.so

Đồng thời, bỏ comment (dấu # đầu dòng) trước dòng có nội dung sau:
Include /private/etc/apache2/extra/httpd-userdir.conf

Nhấn nút control + O để tiến hành write file.
Nhấn nút control + X để thoát chế độ soạn thảo trên Terminal.


Thay đổi các tuỳ chọn ở cài đặt httpd-userdir.conf

Gõ lệnh:
sudo nano /etc/apache2/extra/httpd-userdir.conf

Bỏ comment (dấu # đầu dòng) trước dòng có nội dung sau:
Include /private/etc/apache2/users/*.conf

Nhấn nút control + O để tiến hành write file.
Nhấn nút control + X để thoát chế độ soạn thảo trên Terminal.


Khởi động lại Apache để các thay đổi trên được kích hoạt

Gõ lệnh:
sudo apachectl restart

Sau khi Apache đã được khởi động, kiểm tra lại hoạt động bằng cách truy cập vào địa chỉ sau ở Safari:
http://localhost/~username/

Nếu trình duyệt không báo lỗi, một giao diện web hiển thị directory tree hiện lên nghĩa là mọi việc đã làm đúng.


Tips & Info

- Bạn có thể thay đổi Document Root thành một thư mục ở ổ đĩa khác bằng cách:
  • Tạo thư mục mong muốn làm Document Root, ví dụ /Volumes/WORK/WWW
  • Gõ lệnh sau vào Terminal:
    ln -s /Volumes/WORK/WWW /Users/username/Sites
  • Gõ lệnh để khởi động lại Apache
- Xem video:




.htaccess, mod rewrites

Để có thể override URL, một phương pháp để có những URL rút gọn dễ nhớ, thì bạn cần enable module mod_rewite cũng như là .htaccess.

Enable cho phép .htaccess hoạt động

Sửa file httpd.conf, tìm kiếm và thay đổi settings AllowOverride thành
AllowOverride All

Enable mod_rewrite hoạt động

Uncomment dòng dưới đây:
LoadModule rewrite_module libexec/apache2/mod_rewrite.so



PHP

Mặc định, Mac OS X Yosemite đã có Apache và PHP version 5.5.14 đi kèm. Dù Apache được cài đăt để hoạt động bình thường, ngay từ đầu, nhưng PHP thì không. Để có môi trường phát triển PHP, ta cần phải enable PHP trong Apache config để nó có thể hoạt động.

Config PHP

Chỉnh sửa file httpd.conf, bỏ comment (xoá dấu # ở đầu dòng) cho dòng sau:
LoadModule php5_module libexec/apache2/libphp5.so

Lưu lại và sau đó khởi động lại Apache.
Để kiểm tra xem PHP đã hoạt động chưa, tạo một file ở đường dẫn "~/Sites/index.php, nội dung:




Mở trình duyệt Safari và truy cập vào:
http://localhost/~username/

Nếu PHP hoạt động bình thường, bạn sẽ thấy nội dung như sau được hiển thị:




MySQL

Với lập trình PHP thì MySQL là hệ cơ sở dữ liệu phổ biến đi cùng thành một cặp. Nhắc đến PHP thì đồng thời cũng cần có MySQL nếu nói về CSDL tương tự như khi nói tới ASP.NET thì nói tới MS SQL Server vậy.

MySQL thì không được cung cấp kèm với Mac OS X Yosemite như là Apache. Bạn bắt buộc phải download bộ cài đặt từ website. Hãy chọn bộ cài đặt Mac OS X 10.9 (x86, 64-bit), DMG Archive (chạy được trên Mac Yosemite 10.10). Khi download, bạn có thể bấm chọn No thanks, just start my download. ở bên dưới, để tiến hành ngay mà không cần Login hoặc Sign Up.
Có một vấn đề là phiên bản này sẽ không tự khởi động lại mỗi lần khởi động Mac, mà ta phải chạy nó bằng command line.

Nếu trước đó đã có một bản MySQL khác hoạt động trên Mac rồi, thì bạn có thể yên tâm rằng nó vẫn sẽ hoạt động tiếp. Và nếu bạn đang sử dụng bản MySQL cũ hơn, mà muốn nâng cấp lên thì bạn cần chú ý là TẮT MySQL Server đi trước khi upgrade tránh tình trạng data bị hư hỏng.

Cài đặt MySQL


Sau khi download, ta tiến hành mở file .DMG và tiến hành cài đặt bằng trình Installer.



Ở bước cuối cùng quá trình cài đặt, ta nhận được thông báo cài đặt không thành công. Tuy nhiên thực tế là MySQL Server đã được cài đặt và có thể chạy được đầy đủ, lý do báo failed là vì script để restart MySQL Server mỗi lần reboot bị lỗi trên Mac Yosemite.
Ta sẽ khắc phục được vấn đề này sau.

Nếu ta chọn tuỳ biến cài đặt, nhớ chú ý bỏ chọn ở Startup Item. Khi khởi động lại Mac, ta sẽ có thể khởi động lại MySQL Server thông qua System Preferences hoặc Command Line ở Terminal.


Chạy MySQL


Bạn có thể khởi động MySQL Server từ System Preferences hoặc thông qua command line, hoặc nếu nó đang chạy mà muốn restart thì có thể dùng command line.

Command Line để start MySQL Server trên Terminal: (bạn cần có mật khẩu Admin để làm việc này)
sudo /usr/local/mysql/support-files/mysql.server start

Command line để restart MySQL Server trên Terminal:
sudo /usr/local/mysql/support-files/mysql.server restart

Để kiểm tra version hiện tại của MySQL, dùng command sau:
/usr/local/mysql/bin/mysql -v

Đặt mysql vào shell path

Để thao tác bằng command line mysql ngắn gọn mà không phải gõ full path trong Terminal, ta nên làm thêm bước này.
Việc này được hoàn thành bằng cách chỉnh sửa file .bash_profile có trong thư mục Home của user.
Nếu file .bash_profile không tồn tại, bạn có thể tạo nó bằng vi hoặc nano.
cd; touch .bash_profile

Command line để mở file này ra để edit:
sudo nano .bash_profile

Thêm dòng sau vào nội dung của file, khi Terminal chuyển sang chế độ soạn thảo sửa file (chú ý dấu nháy kép cần được gõ chính xác):
export PATH="/usr/local/mysql/bin:$PATH"

Nhấn nút control + O để tiến hành write file.
Nhấn nút control + X để thoát chế độ soạn thảo trên Terminal.

Ra lệnh tải lại file vừa chỉnh sửa bằng command:
source ~/.bash_profile

Bây giờ thì ta có thể dùng lệnh ngắn gọn để thao tác với mysql. Ví dụ như kiểm tra version, có thể gõ ngắn gọn như sau:
mysql -v


Cài đặt root password cho MySQL

Trong MySQL thì root là user cao cấp nhất có toàn quyền. Do đó root cần phải có mật khẩu mạnh để đảm bảo an toàn dữ liệu.
Nhớ rằng root user này không liên quan gì đến root user của linux hay là Mac OS X.

Dùng lệnh sau để cài đặt password cho user root của MySQL, cần nhớ password này, hoặc take note nó:
/usr/local/mysql/bin/mysqladmin -u root password 'yourpasswordhere'
Chú ý: password được bao quanh bởi dấu nháy đơn '.

Sửa lỗi 2002 MySQL Socket error

Trong quá trình hoạt động ta có thể gặp lỗi 2002. Lỗi này xảy ra khi MySQL muốn truy cập vào các socket trong thư mục /tmp, tuy nhiên Mac OSX lại tìm trong thư mục /var/mysql/.

Các command cần thực hiện:
sudo mkdir /var/mysql
sudo ln -s /tmp/mysql.sock /var/mysql/mysql.sock

Sửa vấn đề với auto-start MySQL Server khi reboot

Làm theo hướng dẫn sau đây sẽ sửa được lỗi auto start MySQL khi reboot Yosemite:

Edit file bằng trình nano trong Terminal:
sudo nano /Library/LaunchDaemons/com.mysql.mysql.plist


Paste vào nội dung dưới đây:

<!--?xml version="1.0" encoding="UTF-8"?-->
<plist version="1.0">
<dict>
<key>KeepAlive</key>
<true />
<key>Label</key>
<string>com.mysql.mysqld</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/mysql/bin/mysqld_safe</string>
<string>--user=mysql</string>
</array>
</dict>
</plist>


Lưu lại và thoát chế độ soạn thảo.
Chỉnh lại quyền permission cho các file:
sudo chown root:wheel /Library/LaunchDaemons/com.mysql.mysql.plist
sudo chmod 644 /Library/LaunchDaemons/com.mysql.mysql.plist
sudo launchctl load -w /Library/LaunchDaemons/com.mysql.mysql.plist

Sau đó thì MySQL có thể tự khởi động lại khi hệ điều hành khởi động.





phpMyAdmin

phpMyAdmin là web tool rất quen thuộc để thao tác với MySQL để thực hiện việc quản lý users cũng như là dữ liệu.

Cài đặt và Config phpMyAdmin

Download phpMyAdmin từ trang chủ.
Unzip vào thư mục Document Root, và đổi tên thư mục của nó thành phpmyadmin.

Tạo bên trong thư mục đó, thư mục con có tên là config.
mkdir ~/Sites/phpmyadmin/config

Đổi quyền truy cập cho thư mục đó:
chmod o+w ~/Sites/phpmyadmin/config

Mở Safari, tiến hành cài đặt phpmyadmin bằng cách truy cập vào địa chỉ: http://localhost/~username/phpmyadmin/setup/ hoặc http://localhost/phpmyadmin/setup/

Bạn cần tạo mới một Server connection, nhấn vào nút New server


Chuyển sang tab Authentication, và đưa vào root user, password (root password đã được cài đặt ở bước trên, khi mà ta cài đặt xong MySQL Server).

Nhấn vào nút Save để lưu lại thông tin cài đặt. Khi đó một file config.inc.php được tạo ra trong thư mục /phpmyadmin/config/.
Di chuyển (move,cut) file này ra ngoài thư mục gốc /phpmyadmin. Xoá thư mục trống /config đi.

Bây giờ truy cập lại http://localhost/~username/phpmyadmin/ sẽ có thể thao tác được với MySQL databases.

Nâng cấp phpMyAdmin

Để nâng cấp, đơn giản chỉ cần tiến hành download bản mới. Đổi tên thư mục sau khi xả nén thành phpmyadmin, và copy file config.inc.php từ thư mục backup của bản cũ hơn vào là xong.




Trên đây là toàn bộ các bước để cài đặt đủ một bộ môi trường phát triển Apache-PHP-MySQL trên Mac OS X Yosemite.
Nếu có vấn đề gì khó khăn, bạn có thể để lại comment.