Thứ Năm, 19 tháng 6, 2014

Bạn đã xây dựng được 1 website ASP.NET chạy hoàn hảo trên localhost và muốn đưa nó lên mạng Internet để "show hàng" với nhiều người. Việc tìm được 1 máy chủ - hosting ASP miễn phí, chất lượng tốt, ổn định là khá khó thay vì đối với hosting PHP thì lại có rất nhiều hosting miễn phí.

Sau khi tìm nhiều hosting ASP miễn phí, mình thấy chỉ có SOMEE.COM là trang cho chúng ta đăng ký 1 host miễn phí, chất lượng tốt, chạy được cả webform và mô hình MVC, chạy MS SQL khá ổn định. Đặc biệt hosting này không hay bị "die host" - vấn đề rất thường gặp ở các hosting PHP. Nói chung đây là 1 hosting rất phù hợp với những newbie đang tập tẹ vào lập trình ASP.NET.

Bài này mình sẽ hướng dẫn các bạn tạo 1 website trên somee và cách upload code lên host.

1. Đăng ký tài khoản trên somee.com

- Để đăng ký web hosting .NET miễn phí bạn vào trang http://somee.com/. Trong mục FREE .NET HOSTING chọn Learn More như hình bên dưới.
 Đăng ký hosting miễn phí - Upload website ASP.NET lên hosting

- Somee.com hỗ trợ ASP.NET từ phiên bản 1.1 đến 4.5, với 150MB bộ nhớ, 5GB băng thông hàng tháng, 15MB Microsoft SQL Server 2005, 2008 R2 hoặc 2012.

- Trong trang tiếp theo hiện ra. Click vào Order now như hình bên dưới để vào trang đăng ký.
Đăng ký hosting miễn phí - Upload website ASP.NET lên hosting

- Điền đầy đủ các thông tin đăng ký như hình dưới đây. Yêu cầu Email phải chính xác để xác minh tài khoản. Mục Zip/Postal code nhập 70000 nếu ở TP. HCM, các mục: Primary phone, Secondary phone, Fax number không cần nhập cũng được. Sau đó click Register new user and continue.
Đăng ký hosting miễn phí - Upload website ASP.NET lên hosting

- Trong trang mới hiện ra. Check vào 2 ô bên dưới. Sau đó Click Continue.
Đăng ký hosting miễn phí - Upload website ASP.NET lên hosting

- Ở trang mới hiện ra. Chúng ta thiết lập những thông tin cơ bạn như tên website trong mục Site name; Operating system chọn Windows server 2012, ASP.NET verson chọn 4.5. Site tile và Site Description do bạn tự đặt. Sau đó click vào Create website.
Đăng ký hosting miễn phí - Upload website ASP.NET lên hosting

- Trong trang tiếp theo hiện ra sẽ thông báo website của bạn đã được tạo thành công. Bạn click vào dòng Manage website để xem những thông tin cơ bản của webhosting somee miễn phí mà chúng ta vừa tạo.
Đăng ký hosting miễn phí - Upload website ASP.NET lên hosting

- Những lần sau, để truy cập vào panel điều khiển của webhosting vừa tạo. Ta vào trang somee.com rồi chọn CONTROL PANEL như hình dưới đây. Sau đó đăng nhập với đăng nhập và tài khoản vừa đăng ký. Ở đây bạn có thể thấy thông tin FTP, IP hãy lưu ý chỗ này để liên kết FTP về sau.
Đăng ký hosting miễn phí - Upload website ASP.NET lên hosting

- Như vậy vấn đề đăng ký ASP.NET webhosting miễn phí cơ bản hoàn tất. Và giờ chúng ta truy cập vào địa chỉ website mới vừa đăng ký. Ở ví dụ này là: http://www.nhatnghe.somee.com/. Và màn hình giao diện mặc định của website sau khi đăng kí như sau
Đăng ký hosting miễn phí - Upload website ASP.NET lên hosting

2. Upload code lên host

- Nén tất cả code, resource, database của bạn vào 1 file .zip duy nhất để tiện cho việc upload

-  Trong màn hình quản trị control pannel của hosting, bên tay trái các bạn chọn File Manager, sau đó xoá trang Default.asp là trang mặc định của hosting đi. Các bạn xem hình bên dưới.
Đăng ký hosting miễn phí - Upload website ASP.NET lên hosting

- Sau đó, bên tay phải ta chọn Upload, rồi tiến hành chọn file mà bạn vừa tải về được Upload lên hosting.
Đăng ký hosting miễn phí - Upload website ASP.NET lên hosting


Như vậy là bạn đã tạo được một trang web ASP.NET đơn giản trên 1 hosting miễn phí và đã up được code lên trên đó. 
Việc upload database, config website mình sẽ hướng dẫn trong 1 bài khác. 

Thân!

Nguồn tham khảo: doanweb, nhatnghe

Thứ Tư, 18 tháng 6, 2014

Đôi khi chúng ta cần lưu trữ thông tin nào đó liên quan đến người dùng, do người dùng cài đặt. Những thông tin này phải được lưu trữ một cách lâu dài, xuyên suốt từ phiên làm việc này đến phiên làm việc khác. Tức là ta phải có cách để lưu thông tin cài đặt của người dùng

Có nhiều cách để lưu thông tin cài đặt chương trình, sau đây là một số cách phổ biến, dễ sử dụng

1. Lưu thông tin cài đặt vào Registry

Registry là bộ nhớ lưu trữ các thông tin cài đặt của hệ điều hành cũng như của các phần mềm trên nó. Do vậy ta có hoàn toàn có thể lưu trữ và lấy các thông tin trên Registry.

Ưu điểm của cách này là truy xuất nhanh, ít bị thay đổi bởi người không hiểu biết, người dùng và chỉ có lập trình viên mới có thể biết được cấu trúc, vị trí lưu trên Registry.

Nhược điểm là khi muốn lưu, đọc dữ liệu trên Registry đều phải thực thi nhiều code và yêu cầu lập trình viên phải nắm vững cấu trúc của Registry. Các thông tin cài đặt này chỉ có tác dụng với máy đã tạo ra, khi copy ứng dụng sang máy khác thì thông tin cài đặt bị mất.

2. Lưu trực tiếp trên phần mềm

Nền tảng .NET FrameWork cho phép người dùng phần mềm chỉnh sửa và lưu các thông tin cài đặt ngay trên ứng dụng. Cách lưu thông tin cài đặt này rất dễ sử dụng, lập trình. Khi thêm 1 đối tượng setting thì .NET tự động sinh ra 1 class để quản lý các thông tin setting đó.

Để bắt đầu với cách này bạn click đúp vào "Properties" trong tab "Solution Explorer". Sau đó trong tab "Settings" hãy thêm những trường cài đặt mong muốn. Ở đây .NET hỗ trợ nhiều kiểu dữ liệu: bool, string, int, datetime...
Các cách lưu thông tin cài đặt cho ứng dụng C# - Apps setting

Sau khi đã lưu các thông số này, chúng ta đọc, lưu thông tin vào như sau:
// Đọc thông tin
string MySetting = ShowGridView.Properties.Settings.Default.MySetting;

// Ghi thông tin
ShowGridView.Properties.Settings.Default.CheckBox = true;
// Lưu lại
ShowGridView.Properties.Settings.Default.Save();

3. Lưu trên file bên ngoài

Một cách lưu trữ thông tin cài đặt nữa là lưu chúng ra một file text thông thường hoặc một file được mã hóa. Với cách này cũng có nhiều kiểu lưu trữ, tùy vào cách xử lý của lập trình viên:
  • Lưu vào 1 file text thông thường đặt cùng thư mục của ứng dụng. Các thông tin sẽ được lưu trữ theo tiêu chuẩn của lập trình viên. Sau đó lập trình viên phải đọc nội dung của file và xử lý chuỗi để lấy được các thông tin đã ghi trước đó.
  • Lưu vào 1 file XML với quy cách nhất định. Với cách này khi dùng các thủ tục đọc, ghi xml thì công việc đọc, lưu thông tin cài đặt sẽ dễ dàng hơn.
  • Lưu file vào thư mục AppData của từng User. Khi đó với các User khác nhau cùng sử dụng máy tính sẽ có những thông tin cài đặt khác nhau.
  • Lưu thông tin ra file .INI. Cách này bạn có thể tham khảo tại đây.
Vì các thông tin được lưu trên một file riêng biệt nên người dùng có thể dễ dàng thay đổi, hoán chuyển các thông tin cài đặt khi cần thiết (chỉ cần việc cut/paste file ra 1 chỗ khác).

Thứ Ba, 17 tháng 6, 2014

Trong các bài trước tôi đã giới thiệu tới các bạn cách làm việc với GridView, cách fill dữ liệu, Binding với GridView - Grid Control của DevExpress. GridView trở thành 1 đối tượng khá quan trọng với các dự án quản lý danh mục, và ta chắc hẳn phải sử dụng đến nó vì công dụng cũng như sự tiện lợi của DevExpress mang lại.

DevExpress thực sự là một bộ thư viện tuyệt vời với nhiều chức năng cũng như giao diện hoàn hảo. Đối với GridView, DevExpress không chỉ cung cấp khả năng làm việc tùy biến linh động nhiều chế độ mà chúng ta còn có thể tùy biến giao diện, tùy chỉnh ngôn ngữ của từng menu item trong GridView. Sau đây tôi sẽ hướng dẫn các bạn cách Việt hóa ngôn ngữ của GridView
Việt hóa giao diện GridView của DevExpress

Trong thư mục Project add một class với nội dung như sau:
class MyGridLocalizer : GridLocalizer
{
public override string GetLocalizedString(GridStringId id)
{
if (id == GridStringId.FindControlFindButton)
return "Tìm";
if (id == GridStringId.FindControlClearButton)
return "Bỏ";
if (id == GridStringId.GridGroupPanelText)
return "Kéo thả cột vào đây để gom nhóm";
if (id == GridStringId.MenuColumnSortAscending)
return "Sắp xếp tăng dần";
if (id == GridStringId.MenuColumnSortDescending)
return "Sắp xếp giảm dần";
if (id == GridStringId.MenuColumnClearSorting)
return "Bỏ sắp xếp";
if (id == GridStringId.MenuColumnGroup)
return "Gom nhóm theo cột này";
if (id == GridStringId.MenuGroupPanelShow)
return "Hiện hộp gom nhóm";
if (id == GridStringId.MenuGroupPanelHide)
return "Ẩn hộp gom nhóm";
if (id == GridStringId.MenuGroupPanelFullExpand)
return "Mở tất cả các nhóm";
if (id == GridStringId.MenuGroupPanelFullCollapse)
return "Thu tất cả các nhóm";
if (id == GridStringId.MenuColumnUnGroup)
return "Bỏ gom nhóm";
if (id == GridStringId.MenuColumnRemoveColumn)
return "Ẩn cột này";
if (id == GridStringId.MenuColumnShowColumn)
return "Hiện cột này";
if (id == GridStringId.MenuColumnColumnCustomization)
return "Tùy chỉnh cột";
if (id == GridStringId.CustomizationCaption)
return "Tùy chỉnh cột";
//if (id == GridStringId.CustomizationColumns)
// return "Kéo và thả cột vào đây để tùy chỉnh";
//if (id == GridStringId.CustomizationBands)
// return "Kéo và thả cột vào đây để tùy chỉnh";
//if (id == GridStringId.CustomizationFormBandHint)
// return "Kéo và thả cột vào đây để tùy chỉnh";
if (id == GridStringId.CustomizationFormColumnHint)
return "Kéo và thả cột vào đây để tùy chỉnh";
if (id == GridStringId.MenuColumnBestFit)
return "Căn chỉnh";
if (id == GridStringId.MenuColumnBestFitAllColumns)
return "Căn chỉnh tất cả";
if (id == GridStringId.MenuColumnFilterEditor)
return "Cài đặt lọc";
//if (id == GridStringId.MenuColumnFilter)
// return "menu filter";
if (id == GridStringId.PopupFilterCustom)
return "(Tùy chọn)";
if (id == GridStringId.PopupFilterAll)
return "(Tất cả)";
if (id == GridStringId.FilterPanelCustomizeButton)
return "Sửa lọc";
if (id == GridStringId.FilterBuilderCaption)
return "Cài đặt lọc";
if (id == GridStringId.FilterBuilderOkButton)
return "Đồng ý";
if (id == GridStringId.FilterBuilderApplyButton)
return "Áp dụng";
if (id == GridStringId.FilterBuilderCancelButton)
return "Hủy bỏ";
if (id == GridStringId.MenuColumnAutoFilterRowShow)
return "Hiện hàng lọc tự động";
if (id == GridStringId.MenuColumnAutoFilterRowHide)
return "Ẩn hàng lọc tự động";
if (id == GridStringId.MenuColumnFilterMode)
return "Chế độ lọc";
if (id == GridStringId.MenuColumnFilterModeDisplayText)
return "Văn bản";
if (id == GridStringId.MenuColumnFilterModeValue)
return "Giá trị";
if (id == GridStringId.CustomFilterDialogCancelButton)
return "Hủy bỏ";
//if (id == GridStringId.CustomFilterDialog2FieldCheck)
// return "2FieldCheck";
if (id == GridStringId.CustomFilterDialogCaption)
return "Hiển thị những hàng có:";
//if (id == GridStringId.CustomFilterDialogClearFilter)
// return "Clear";
if (id == GridStringId.CustomFilterDialogEmptyOperator)
return "(Chọn phép toán)";
if (id == GridStringId.CustomFilterDialogEmptyValue)
return "(Điền giá trị)";
if (id == GridStringId.CustomFilterDialogFormCaption)
return "Tùy chọn lọc tự động";
//if (id == GridStringId.CustomFilterDialogHint)
// return "fil hint";
if (id == GridStringId.CustomFilterDialogOkButton)
return "Đồng ý";
if (id == GridStringId.CustomFilterDialogRadioAnd)
return "Và";
if (id == GridStringId.CustomFilterDialogRadioOr)
return "Hoặc";
return base.GetLocalizedString(id);
}
}


Trong form chính (cần Việt hóa) ta thêm đoạn sau vào hàm khởi tạo class:
// Tùy biến giao diện Grid
GridLocalizer.Active = new MyGridLocalizer();

Lưu ý trong cả class và form đều phải:
using DevExpress.XtraGrid.Localization;

Với cách làm tương tự các bạn có thể Việt hóa các string khác của Dev.

Ví dụ: XtraMessageBox - một điều khiển khá quen thuộc các bạn có thể tham khảo tại đây

Chúc thành công.

Thứ Sáu, 13 tháng 6, 2014

Trong bài "[LINQ] LinQ là gì và tại sao nên dùng LinQ?" tôi đã giới thiệu đến các bạn sơ qua về LINQ và Binding, trong đó có 1 thành phần quan trọng đó là GridView của DevExpress. GridView có vai trò rất quan trọng trong việc hiển thị các dữ liệu dạng bảng, danh sách trong các phần mềm quản lý danh mục... và là thành phần không thể thiếu trong Binding dữ liệu.
Ở lần trước tôi chỉ giới thiệu các bạn về cách kéo thành phần GridView tự động từ cửa sổ "Data Source" phục vụ việc Binding, trong bài này tôi sẽ hướng dẫn cách làm việc với GridView thủ công, tùy chỉnh giao diện của nó - một trong những tính năng vượt trội, thành công lớn của DevExpress.

I. Tạo và thiết lập nguồn dữ liệu cho GridView

Tạo đối tượng GridView - Grid Control

Để tạo 1 đối tượng các bạn search trong toolbox "GridControl" và kéo vào form
Làm việc với GridView - Grid Control của DevExpress

Thiết lập nguồn dữ liệu cho GridView

Bây giờ chúng ta sẽ khai báo nguồn dữ liệu (data source) cho GridView, để gridview tự động lấy các giá trị và fill vào. Đây là tiện ích lớn nhất của việc Binding: có thể tự động lấy các dữ liệu điền vào grid và liên kết với phần detail. 
Để chọn data source cho gridView ta click vào hình tam giác ở góc trên cùng bên phải GridView. Trong phần "Choose Data Source" ta chọn data source đã có sẵn hoặc click chọn "Add Project Data Source" nếu chưa có.
Làm việc với GridView - Grid Control của DevExpress

Khi chọn Add Project Data Source các bạn có thể chọn thêm 1 database, service, object, sharepoint nhưng bạn nên chọn object để nó có thể kết nối tới file ".dbml" đã tạo trong phần giới thiệu LINQ.
Làm việc với GridView - Grid Control của DevExpress

Sau khi chọn object ta sẽ chọn bảng/view/đối tượng làm datasource cho GridView. GridView sẽ tạo ra các cột tương tự như các trường của bảng/view/đối tượng đã chọn.
Làm việc với GridView - Grid Control của DevExpress

Bây giờ chỉ cần thêm một vài câu lệnh để set nguồn dữ liệu thực cho datasource này. Việc này đã được giới thiệu trong bài giới thiệu LINQ.

Lưu ý:

  • Data Source cho GridView không chỉ là 1 table/view thực trong database mà có thể là 1 object ảo các bạn tạo ra trong file ".dbml" hoặc 1 đối tượng của Dataset... Với những object ảo này các bạn có thể tùy chỉnh, xử lý dữ liệu cho GridView.

II. Phần giao diện của GridView

Để tùy chỉnh giao diện, dữ liệu trong các hàng/ô của GridView ta có thể xem trong cửa sổ "Properties" tương ứng của GridView hoặc đơn giản hơn có thể mở giao diện tùy chỉnh của DevExpress:
Làm việc với GridView - Grid Control của DevExpress

Trong phần "Run Designer" này các bạn có thể tùy chỉnh một số thuộc tính của header, phần hiển thị của các ô, việc sửa đổi dữ liệu trong ô, sắp xếp theo cột, thay đổi màu sắc, font chữ... và cả các kiểu hiển thị dữ liệu trong từng ô. Chẳng hạn:

1. Tùy chỉnh giao diện

Thêm/bớt, thay đổi thứ tự các cột

Làm việc với GridView - Grid Control của DevExpress

Với "gridView1" ta vẫn có các sự kiện như ở GridView thông thường như: RowClick, RowCellClick...
Làm việc với GridView - Grid Control của DevExpress


Tùy chỉnh Layout

Làm việc với GridView - Grid Control của DevExpress

Thay đổi font chữ, căn lề của header, ô trong từng cột


Ấn giữ Ctrl để chọn nhiều cột 1 lúc. Các thuộc tính trong phần AppearanceCell & AppearanceHeader như font, Col Name, Text Options, Filter, Allow Edit, Visible... 

Phân biệt hàng chẵn, lẻ

Trong tab Views, phần Appearance > EvenRow, OddRow ta có thể thay đổi một số thuộc tính như màu nền, font chữ, text options... như ở phần header:
Làm việc với GridView - Grid Control của DevExpress

Kéo xuống phần OptionsView, chọn EnableApearanceEvenRow hoặc EnableApearanceOddRow bằng true
Làm việc với GridView - Grid Control của DevExpress

2. Kiểu dữ liệu hiển thị trong ô

Mặc định khi ta chọn Data Source cho GridView thì các cột trong GridView sẽ có 1 kiểu hiển thị dữ liệu tương ứng với kiểu dữ liệu của data source. Chẳng hạn nếu ở kiểu dữ liệu data là nvarchar thì control edit dữ liệu là textEdit (của Dev)... 
Giả sử bây giờ ta có 1 cột là idNhanVien nhưng ta muốn nó hiển thị là Họ tên của Nhân viên thì phải làm thế nào??!

Bằng cách dùng bảng NhanVien để tham chiếu từng idNhanVien với HoTen tương ứng ta sẽ lấy được họ tên của nhân viên ứng với id. Chắc hẳn việc này là rất khó khăn nếu ta dùng code thông thường, không dùng Binding vì phải tương tác qua lại giữa idNhanVien và HoTen trong tất cả các công việc sau này. Khi đã có Binding + DevExpress thì việc đó trở lên tương đối easy.

Ở Run Desinger, tab Columns, với cột tương ứng ta  chỉ cần thêm 1 đối tượng "ColumnEdit" tương ứng với kiểu dữ liệu, trường thông tin muốn hiển thị. Chẳng hạn muốn hiển thị họ tên của nhân viên, vì đây là trường có sẵn (chỉ việc select), số lượng có thể rất nhiều nên ta chọn ColumnEdit là một đối tượng SearchLookupEdit (giống kiểu ComboBox nhưng có tìm kiếm của Dev). Hay như với cột ghi thông tin ghi chú (độ dài nhỏ) thì ta có thể chọn là TextEdit để sau này có thể sử dụng các thuộc tính của TextEdit như MaxLength, Mask...

Quay trở lại với bài toán của chúng ta, sau khi đã thêm đối tượng SearchLoopupEdit cho cột idNhanVien thì ta có 1 đối tượng SearchLookupEdit thông thường, có thể đặt Data Source cho nó, trường hiển thị (DisplayMember), trường giá trị tương ứng (ValueMember). Ở đây ta đặt Data Source là 1 đối tượng trong file ".dbml" tham chiếu đến bảng NhanVien, DisplayMember là HoTen, ValueMember là idNhanVien.
Làm việc với GridView - Grid Control của DevExpress

Sau khi đặt ...bindingSource.DataSource = bla bla; thì kết quả được như này
Làm việc với GridView - Grid Control của DevExpress

Như vậy đã hiển thị được họ tên nhân viên và chức vụ tương ứng mà không cần dùng quá nhiều code, trong khi đó khi cần thiết vẫn có thể lấy được các giá trị id một cách dễ dàng.

Bây giờ nảy sinh một vấn đề nữa là khi ta edit cái SearchLookUp vừa tạo ở trên nó có giao diện không đẹp lắm, đặc biệt phiền phức nếu cái bảng nhân viên có vài chục trường mà ta chỉ muốn hiển thị một vài trường như họ tên, quê quán...
Như này chẳng hạn
Làm việc với GridView - Grid Control của DevExpress

Tất nhiên các kiểu hiển thị này chỉ cần quan tâm khi ta để dữ liệu ở cột dạng AllowEdit.

Để tùy chỉnh cũng không có gì quá phức tạp, chỉ là trên cái giao diện rối rắm vì quá nhiều chức năng của DevExpress khiến ta bối rối. Trong phần Columns > cột cần thay đổi > ColumnEdit (vừa tạo ở trên) > View
Làm việc với GridView - Grid Control của DevExpress

Để đơn giản ta click vào biểu tượng dấu 3 chấm "...". Nó sẽ ra một cửa số mới để tùy chỉnh cái SearchLookupEdit này tương tự với cái tùy chỉnh GridView ta làm việc từ đầu đến giờ.
Ta cũng có thể tùy chỉnh Layout, thêm/bớt cột, đặt caption, thay đồi font chữ header, phân biệt hàng chẵn/lẻ...
Làm việc với GridView - Grid Control của DevExpress

Và kết quả cuối cùng:
Làm việc với GridView - Grid Control của DevExpress

Enjoy!!!

Thứ Sáu, 6 tháng 6, 2014

Đôi khi bạn có 1 ảnh với kích thước nhỏ, bạn muốn resize nó (phóng to) thì cách được nghĩ đến đầu tiên là Photoshop.
Để có 1 bức ảnh scale không làm giảm chất lượng (tất nhiên là có giảm nhưng hạn chế) khá dễ dàng với Photoshop
 Cách phóng to ảnh không làm giảm chất lượng

Đây là 1 icon được resize từ 24x24 lên 512x512 trông không được hoàn hảo cho lắm nhưng cũng chấp nhận được với tỉ lệ resize này. Thậm chí nhờ việc resize này ta có thể gần như thấy rõ các pixel riêng rẽ của bức ảnh cũ, rất thích hợp cho việc thiết kế đồ họa theo phong cách "8 bit" cổ xưa  :D

Nếu không dùng thủ thuật này thì được 1 bức ảnh "mờ tịt" như này  :p
Cách phóng to ảnh không làm giảm chất lượng

Cách resize vô cùng đơn giản như sau:

Mở file ảnh bằng Photoshop

Chọn Image > Image Size (CTRL + ALT+ I)

Trong cửa sổ Size chọn kích thước cần resize, Constrain Proportions, > Nearest Neighbor (preserve hard edges) >> OK
Cách phóng to ảnh không làm giảm chất lượng


Cách khác

Nếu muốn resize với chất lượng tốt hơn bạn có thể dùng phần mềm hỗ trợ ngoài Photoshop. Chẳng hạn như Reshade.
Trang chủ: http://reshade.com/

Giao diện chương trình

Với chương trình này bạn có thể resize ảnh với nhiều tùy chọn khác nhau, làm sao để có được bức ảnh đẹp nhất.

Thứ Sáu, 30 tháng 5, 2014

Đây là 1 cách tạo bìa facebook theo phong cách ảnh xếp ngẫu nhiên
Ảnh bìa Facebook phong cách ảnh xếp ngẫu nhiên

DEMO: Trang cá nhân

File PSD gốc: DownLoad (tham khảo bên VietDesigner, đã edit)

Các bạn down về, edit ảnh, text hoặc một vài thứ khác tùy ý.

Hướng dẫn cho những ai không edit được:

Edit ảnh

Chọn layer Don't touch this. Vào File > Place > Chọn ảnh > OK
Ảnh bìa Facebook phong cách ảnh xếp ngẫu nhiên

Click chuột phải vào layer ảnh vừa thêm, chọn Create Clipping Mask.
Ảnh bìa Facebook phong cách ảnh xếp ngẫu nhiên

Và kết quả
Ảnh bìa Facebook phong cách ảnh xếp ngẫu nhiên

Edit text

Vào group Main Text để tắt chữ mặc định và chèn chữ của bạn vào.

Tạo phần gạch chéo cho ảnh bìa

Gộp tất cả các layer lại thành 1: Trỏ chuột vào Group Some Adjustments ấn tổ hợp Ctrl + Shift + Alt + E
Copy style của Layer Final và Paste vào layer vừa gộp.

Enjoy!

Chúc bạn thành công!!!

Chủ Nhật, 18 tháng 5, 2014

Cuối tuần rảnh rỗi, dở hợp ngữ ra học, sau một hồi mày mò, nghịch nghịch viết được mấy chương trình chia sẻ cho mọi người:
[ASSEMBLY] Chia sẻ code một số bài toán



Máy tính đơn giản


Chương trình thực hiện các phép tính đơn giản như cộng trừ nhân chia. Phạm vi số: 16bit, số nguyên dương:
; ScanNum luu trong BX
ScanNum MACRO
LOCAL Nhap, KetThuc
PUSH AX
MOV BX, 0
Nhap:
MOV AH, 1
INT 21h
CMP AL, 13
JE KetThuc
PUSH AX
MOV AX, BX
MUL ten
MOV BX, AX
POP AX
AND AL, 0fh
ADD BL, AL
JMP Nhap
KetThuc:
POP AX
ENDM
; Macro in text
PrintText MACRO n
PUSH AX
PUSH DX
MOV DL, n
OR DL, 30h ; Chuyen so thanh ma ASCII tuong ung
MOV AH, 2
INT 21h
POP DX
POP AX
ENDM

; Chuogn tring chinh
.MODEL SMALL
ORG 100H
.DATA
MSG1 DB " My calculators", 0Ah, 0Dh, "$"
MSG2 DB "Input a: $"
MSG3 DB 0Ah, 0Dh, "Operator: (+, -, *, /): $"
MSG4 DB 0Ah, 0Dh, "Input b: $"
MSG5 DB 0Ah, 0Dh, "Result: $"
num1 DW ?
num2 DW ?
oper DB ?
ten DW 10
.CODE
MOV AX, @DATA
MOV DS, AX

MOV AH, 9
LEA DX, MSG1
INT 21h
LEA DX, MSG2
INT 21h
; Nhap so 1
ScanNum
MOV num1, BX
; Print label
MOV AH, 9
LEA DX, MSG3
INT 21h
; Nhap phep tinh
MOV AH, 1
INT 21h
MOV oper, AL
; Print label
MOV AH, 9
LEA DX, MSG4
INT 21h
; Nhap so 2
ScanNum
MOV num2, BX

CMP oper, '+'
JE PhepCong

CMP oper, '-'
JE PhepTru

CMP oper, '*'
JE PhepNhan

JMP PhepChia

PhepCong:
MOV AX, num1
MOV BX, num2
ADD AX, BX
JMP Exit
PhepTru:
MOV AX, num1
MOV BX, num2
SUB AX, BX
JMP Exit
PhepNhan:
MOV DX, 0
MOV AX, num1
MOV BX, num2
MUL BX ; AX = AL * BL
JMP Exit
PhepChia:
MOV DX, 0
MOV AX, num1
MOV BX, num2
DIV BX ; AX = AL / BL
Exit:
; Print Label
PUSH AX
MOV AH, 9
LEA DX, MSG5
INT 21h
POP AX
; Print res

MOV CX, 1 ; Co danh dau
MOV BX, 10000
Begin_Print:
CMP BX, 0
JE End_Print ; BX = 0

CMP CX, 0
JE Calc ; CX = 0

CMP AX, BX
JB Skip ; AX < BX
Calc:
MOV CX, 0
MOV DX, 0
DIV BX ; AX = DX AX / BX
PrintText AL ; In AL nhu 1 ky tu binh thuong
MOV AX, DX

Skip: ; Giam BX 10 lan
PUSH AX
MOV DX, 0
MOV AX, BX
DIV ten
MOV BX, AX
POP AX
JMP Begin_Print

End_Print:
RET



Tìm ước chung lớn nhất của 2 số


Nhập vào 2 số 16bit rồi in ra UCLN của chúng:
; MACRO
; MACRO khong lam thay doi gia tri cua bien vao, chi thay doi gia tri thanh ghi
Nhan MACRO reg, num
LOCAL next, continue, exit
PUSH AX
PUSH DX
PUSH CX

MOV AX, reg
MOV CX, num
XOR DX, DX
next:
CMP CX, 0
JE exit
TEST CX, 1b ; Ky tu cuoi cua AL = 1=> ZF = 0
JZ continue ; ZF = 1
ADD DX, AX
continue:
SHL AX, 1
SHR CX, 1
JMP next
exit:
MOV reg, DX

POP CX
POP DX
POP AX
ENDM

; Nhap so, luu vao AX
ScanNum MACRO
local Nhap, exit
PUSH BX
MOV AH, 1
XOR BX, BX ; Tuong duong mov bx, 0
Nhap:
INT 21h
CMP AL, 13
JE exit
AND AL, 0Fh
Nhan BX, 10
ADD BL, AL
JMP Nhap
exit:
MOV AX, BX
POP BX
ENDM

; In 1 so bat ky o AX
PrintNums MACRO
LOCAL next, exit, print
PUSH BX ; Cat cac gia tri vao stack
PUSH CX
PUSH DX

MOV BX, 10 ; So chia
XOR CX, CX ; MOV CX, 0
next:
CMP AX, 0
JE exit ; Neu AX = 0 thi dung lai
XOR DX, DX ; MOV DX, 0
DIV BX
PUSH DX ; DX la so du cua phep chia
INC CX ; Tang CX
JMP next ; Lap lai
exit:
MOV AH, 2

print:
XOR DL, DL ; MOV DL, 0
POP DX
OR DL, 30h ; Chuyen so thanh ma ASCII tuong ung
INT 21h
LOOP print ; Lap den khi nao CX = 0

POP DX
POP CX
POP BX
ENDM

; In so co 1 chu so
PrintNum MACRO reg
PUSH AX
PUSH DX
MOV DL, reg
MOV AH, 2
OR DL, 30h
INT 21h
POP DX
POP AX
ENDM

; Tim uoc chung lon nhat, xuat ket qua vao DX
UCLN MACRO m, n
PUSH AX
PUSH BX

MOV AX, m
MOV BX, n
next:
CMP AX, BX
JE exit
JB less
SUB AX, BX
JMP next
less:
SUB BX, AX
JMP next
exit:
MOV DX, AX

POP BX
POP AX
ENDM

; Chuong trinh chinh
.MODEL small
ORG 100h
.DATA
Enter DB 0Dh, 0Ah, '$'
num1 DW ?
num2 DW ?
.CODE
MOV AX, seg Enter
MOV DS, AX

ScanNum ; Xuat ra AL
MOV num1, AX

PUSH AX
MOV AH, 9
LEA DX, Enter
INT 21h
POP AX

ScanNum
MOV num2, AX


PUSH AX
MOV AH, 9
LEA DX, Enter
INT 21h
POP AX

XOR DX, DX
UCLN num1, num2
MOV AX, DX
PrintNums

Chương trình in ra n số hạng đầu tiên trong dãy Fibonacy


Nhập vào 1 số n (từ 1~22) rồi in ra n số hạng đầu tiên trong dãy Fibonacy
; MACRO
; MACRO khong lam thay doi gia tri cua bien vao, chi thay doi gia tri thanh ghi
Nhan MACRO reg, num
LOCAL next, continue, exit
PUSH AX
PUSH DX
PUSH CX

MOV AX, reg
MOV CX, num
XOR DX, DX
next:
CMP CX, 0
JE exit
TEST CX, 1b ; Ky tu cuoi cua AL = 1=> ZF = 0
JZ continue ; ZF = 1
ADD DX, AX
continue:
SHL AX, 1
SHR CX, 1
JMP next
exit:
MOV reg, DX

POP CX
POP DX
POP AX
ENDM

; Nhap so, luu vao AX
ScanNum MACRO
local Nhap, exit
PUSH BX
MOV AH, 1
XOR BX, BX ; Tuong duong mov bx, 0
Nhap:
INT 21h
CMP AL, 13
JE exit
AND AL, 0Fh
Nhan BX, 10
ADD BL, AL
JMP Nhap
exit:
MOV AX, BX
POP BX
ENDM

; In 1 so bat ky o AX
PrintNums MACRO
LOCAL next, exit, print
PUSH BX ; Cat cac gia tri vao stack
PUSH CX
PUSH DX

MOV BX, 10 ; So chia
XOR CX, CX ; MOV CX, 0
next:
CMP AX, 0
JE exit ; Neu AX = 0 thi dung lai
XOR DX, DX ; MOV DX, 0
DIV BX
PUSH DX ; DX la so du cua phep chia
INC CX ; Tang CX
JMP next ; Lap lai
exit:
MOV AH, 2

print:
XOR DL, DL ; MOV DL, 0
POP DX
OR DL, 30h ; Chuyen so thanh ma ASCII tuong ung
INT 21h
LOOP print ; Lap den khi nao CX = 0

POP DX
POP CX
POP BX
ENDM

.MODEL SMALL
ORG 100h
.DATA
count DB ?
Enter DB 0Ah, 0Dh, '?'
ten DW 10
.CODE
ScanNum
MOV count, AL

XOR DX, DX

; In dau Enter
MOV AH, 2
MOV DL, 0Ah
INT 21h
MOV DL, 0Dh
INT 21h

CMP count, 1
JE in1
CMP count, 2
JE in11

OR BX, 1
PUSH BX
PUSH BX
; In ra '1 1'
MOV DL, '1'
INT 21h
MOV DL, ' '
INT 21h
MOV DL, '1'
INT 21h

SUB count, 2
; Dung stack de luu mang cac so Fibonacy
next:
MOV AH, 2
MOV DL, ' '
INT 21h
MOV BP, SP
MOV BX, [BP]
ADD BX, [BP+2]
PUSH BX
MOV AX, BX
PrintNums

PUSH AX
MOV AL, count
DEC AL
CMP AL, 0
JE exit
MOV count, AL
POP AX
JMP next

JMP exit
; In so Fibonacy
in1:
MOV DL, '1'
INT 21h
JMP exit
; In 2 so dau trong day
in11:
MOV DL, '1'
INT 21h
MOV DL, ' '
INT 21h
MOV DL, '1'
INT 21h
exit:


Thứ Bảy, 17 tháng 5, 2014

Trong lập trình hợp ngữ, nhiều lúc bạn muốn thực hiện phép nhân hoặc chia nhưng kết quả lại lưu ở trong thanh ghi AX, và bạn lúng túng không biết in chúng ra như thế nào?! Trong bài này tôi sẽ hướng dẫn các bạn 2 cách đơn giản để in ra 1 số bất kỳ (số nguyên dương, 16bit) trong AX.
[ASSEMBLY] In một số nguyên dương bất kỳ


Với cùng 1 tư tưởng đó là: chia số muốn in thành các chữ số riêng biệt, rồi in từng chữ số đó như 1 ký tự bình thường

Nhắc lại: lệnh DIV 
Cú pháp DIV reg   ; AX = AX / reg => kết quả phép chia nguyên lưu vào AX, số dư lưu vào DL

Cách 1: Duyệt các chữ số từ hàng đơn vị, lưu chúng vào Stack rồi in ngược lại

Với cách này chúng ta chia số muốn in thành các chữ số, thực hiện từ chữ số hàng đơn vị cho đến các chữ số có trọng số cao hơn. Để thực hiện ta tiến hành dùng lệnh DIV để lấy ra số dư phép chia AX cho 10 - chính là chữ số hàng đơn vị của AX. Chữ số này sẽ được cất trong Stack, trở thành đáy Stack (trong phạm vi của thủ tục này), quá trình này lặp lại đến khi AX bằng 0, chữ số có trọng số cao nhất sẽ là đỉnh stack, sẽ được in ra đầu tiên.
Dùng biến CX để đếm số ký tự trong số, phục vụ cho việc lặp in.
[ASSEMBLY] In một số nguyên dương bất kỳ

Để in ra, ta lần lượt lấy các giá trị trong Stack  rồi in chúng như những ký tự bình thường. Việc in sẽ thực hiện từ chữ số có trọng số cao nhất đến chữ số có trọng số thấp nhất (hàng đơn vị). Số lần in sẽ do CX kiểm soát.

Code cụ thể như sau:
; In 1 so bat ky o AX
PrintNums MACRO
LOCAL next, exit, print
PUSH BX ; Cat cac gia tri vao stack
PUSH CX
PUSH DX

MOV BX, 10 ; So chia
XOR CX, CX ; MOV CX, 0
next:
CMP AX, 0
JE exit ; Neu AX = 0 thi dung lai
XOR DX, DX ; MOV DX, 0
DIV BX
PUSH DX ; DX la so du cua phep chia
INC CX ; Tang CX
JMP next ; Lap lai
exit:
MOV AH, 2

print:
XOR DL, DL ; MOV DL, 0
POP DX
OR DL, 30h ; Chuyen so thanh ma ASCII tuong ung
INT 21h
LOOP print ; Lap den khi nao CX = 0

POP DX
POP CX
POP BX
ENDM

Cách 2: Duyệt các chữ số từ hàng cao nhất đến hàng đơn vị, in trực tiếp (không dùng Stack)

Cũng dùng phép chia để phân tách số ban đầu thành các chữ só riêng biệt nhưng lần này lấy kết quả để in trực tiếp (không lấy in số dư như cách trên). Việc in sẽ tiến hành từ ký tự có trọng số cao nhất đến hàng đơn vị.
Trong mỗi bước ta chia AX cho BX = 10000, sau đó giảm BX xuống còn 1000, 100, 10, 1 (cũng dùng phép chia để giảm BX). 
Dùng CX để lưu trạng thái, tránh việc in những số 0 ở đầu kết quả.

Code cụ thể như sau:
Print PROC
MOV CX, 1 ; Co danh dau
MOV BX, 10000
Begin_Print:
CMP BX, 0
JE End_Print ; BX = 0

CMP CX, 0
JE Calc ; CX = 0

CMP AX, BX
JB Skip ; AX < BX
Calc:
MOV CX, 0
MOV DX, 0
DIV BX ; AX = DX AX / BX
PrintText AL ; In AL nhu 1 ky tu binh thuong
MOV AX, DX

Skip: ; Giam BX 10 lan
PUSH AX
MOV DX, 0
MOV AX, BX
DIV ten
MOV BX, AX
POP AX
JMP Begin_Print

End_Print:
Print ENDP

Phần PrintText
; Macro in text
PrintText MACRO n
PUSH AX
PUSH DX
MOV DL, n
OR DL, 30h ; Chuyen so thanh ma ASCII tuong ung
MOV AH, 2
INT 21h
POP DX
POP AX
ENDM


Chúc bạn thành công!!!

Thứ Sáu, 9 tháng 5, 2014

Trước đây khi thiết kế Style cho website bạn thường dùng cách nào để sinh ra mã màu phù hợp cho từng đối tượng? Dùng Dreamweaver, Photoshop hay là tự ước lượng màu (o_0)??? Chắc hẳn những công cụ, cách làm đấy rất phức tạp (nhất là khi đang code ở 1 trình không phải Dreamweaver, Notepad++ hay trình biên tập dành riêng cho thiết kế web khác)
Mình xin giới thiệu tới các bạn 2 công cụ rất hữu ích trong việc chọn mã màu phù hợp trong việc thiết kế CSS, hơn nữa hai công cụ này rất tiện lợi, bạn có thể sử dụng trực tiếp trên trang này mà không cần phải cài đặt hay thiết lập gì cả
Công cụ sinh mã màu tự động - Color Code Genarator

Thứ nhất, công cụ sinh mã màu này sẽ không còn là lạ lâm gì với những người quen sử dụng Photoshop, hay sử dụng Photoshop để sinh mã màu. Bạn chỉ cần kéo thành "Hue" rồi chọn màu phù hợp. Cách khác bạn có thể sửa mã màu trực tiếp trong các ô điều khiển ở dưới, màu tương ứng sẽ hiển thị ở trên. Bây giờ chỉ cần chọn màu tương tự thích hợp với ý đồ thiết kế.
Sau khi chọn xong màu để lấy mã màu chỉ cần Copy mã màu ở ô điều khiển phía dưới.

Thứ hai, công cụ này cũng có chức năng tương tự cái trên, bạn chọn 1 màu trong các màu mẫu có sẵn, hoặc điền mã màu vào ô >> chọn "Update". Công cụ sẽ hiển thị màu tương ứng với mã màu đã nhập vào cùng các màu cùng tông màu. Để lấy mã màu bạn cũng chỉ việc chọn và copy mã màu trong ô TextBox



Hy vọng nó sẽ hữu ích!!

Thứ Năm, 8 tháng 5, 2014

Trong nhiều trang web bạn thấy có phần bình luận của facebook??? Bạn hoàn toàn có thể thêm phần mở rộng đó vào website của mình.
 Thêm bình luận Facebook vào web - Sửa lỗi không hiển thị bình luận Blogger

I. Thêm bình luận Facebook

Để thêm bình luận ta add một phần mở rộng cảu facebook vào website. Cụ thể như sau:

Thêm đoạn code sau vào trước thẻ </head>
<script type='text/javascript'>
//<![CDATA[
var purl= location.href; // Lấy URL của trang
var fb_href = purl.substring(0,purl.indexOf(".html")+5); // Phần tùy chọn thêm của blogger
var fbcm ='<div class="fb-comments" data-href="'+fb_href+'" data-num-posts="5" data-width="540"></div>'; // Phần div hiển thị khung bình luận
//]]>
</script>

Lưu ý: Phần data-num-post (số bình luận hiển thị), data-width (độ rộng của thẻ div) bạn có thể thay đổi

Thêm đoạn sau vào trước thẻ </body>
<div id="fb-root"></div>
<script>(function(d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) return;
js = d.createElement(s); js.id = id;
js.src = "//connect.facebook.net/en_US/all.js#xfbml=1";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));</script>

Đặt đoạn code này vào vị trí mà bạn muốn hiển thị phần bình luận:
<script type='text/javascript'>
document.write(fbcm);
</script>

Bạn vào trang Plugin bình luận của Facebook để có thêm nhiều lựa chọn khác

II. Bình luận của Blogger

Ẩn bình luận Blogger

Phần bình luận (comment) của Blogger là phần mặc định được thêm vào trong blog. Đôi khi bạn muốn ẩn nó đi (do đã có bình luận của Facebook chẳng hạn), hãy làm như sau:

Trong phần Cài đặt Blog >> Bài đăng và nhận xét >> Chọn vị trí nhận xét là "Ẩn" >> Nhấn "Lưu cài đặt"
Thêm bình luận Facebook vào web - Sửa lỗi không hiển thị bình luận Blogger

Hiện, sửa lỗi không hiển thị bình luận Blogger

Khi bạn muốn dùng bình luận Blogger lại (dùng song song 2 bình luận hoặc bỏ bình luận Facebook...), hãy làm như sau, và chắc chắn làm theo từng bước nếu bị lỗi không hiển thị được phần bình luận trong bài đăng:

Trong phần Cài đặt Blog >> Bài đăng và nhận xét >> Chọn vị trí nhận xét là "Được nhúng" >> Nhấn "Lưu cài đặt"
Thêm bình luận Facebook vào web - Sửa lỗi không hiển thị bình luận Blogger

Trong từng bài đăng muốn cho hiển thị bình luận bạn phải cài đặt phần nhận xét của người đọc là "Cho phép"
Thêm bình luận Facebook vào web - Sửa lỗi không hiển thị bình luận Blogger

Nếu vẫn bị lỗi không hiển thị được bình luận thì bạn hãy xem lại phần code Blog, nó đã include phần comments hay thread_comments chưa... Nếu ít am hiểu về code Blogger thì bạn có thể cài lại mẫu cho trang blog của mình... (như thế sẽ hơi mất công sức sửa lại những phần khác)

Hy vọng sẽ giúp được các bạn!!!

Categories

Sample Text

Được tạo bởi Blogger.

Must Read

Biểu mẫu liên hệ

Tên

Email *

Thông báo *

Popular Posts

Video

Popular Posts

Our Facebook Page