— Laravel — Hướng dẫn cài đặt Laravel trên Windows — February 20, 2016

— Laravel — Hướng dẫn cài đặt Laravel trên Windows

Giới thiệu Laravel Framework

Laravel là một PHP Framework phổ biến hiện nay. Laravel là một open source. Laravel được xây dựng theo mô hình MVC (Model – View – Controller ).

Yêu cầu cần có để sử dụng Laravel

  • Server PHP : có thể dùng XAMPP….
  • Composer : thành phần quản lý và  hỗ trợ cho Laravel. Trang dowload của composer : https://getcomposer.org/download/ , bạn tải về và cài đăt lên máy như các phần mềm thông thường.

 

Tiến hành dowload và cài đặt project Laravel

Ta tiến hành vào thư mục “htdocs” của XAMPP theo đường dẫn “C:\xampp\htdocs”. Tại đây, bạn nhấn giữ phím Shift + Chuột phải. Sau đó chọn : “Open command window here”.  Sau đó cửa sổ Command của window sẽ xuất hiện. Tiếp theo để tải về bộ source của Laravel ta tiến hành gõ dòng lệnh sau :

 

composer create-project --prefer-dist laravel/laravel tên_project

laravel

Với tên_project là tên tùy chọn mà bạn đặt. Quá trình dowload và cài đặt sẽ mất chút thời gian. Sau khi dowload thành công ta tiến hành chạy thử project Laravel vừa cài đặt.

 

Chạy thử Project Laravel

Bạn khởi động XAMPP và tiến hành chạy Localhost. Nhập địa chỉ : localhost/tên_project/public/ , kết quả như hình.

lrv5

Như vậy bạn đã cài đặt thành công Laravel 5. Ở những bài viết tiếp chúng ta sẽ tìm hiểu thêm về  những thành phần cơ bản của Laravel 5.

Design Patterns – Strategy Pattern — January 9, 2016

Design Patterns – Strategy Pattern

Trong Strategy pattern, hành vi của class hay xử lý của nó có thể thay đổi đa dạng trong lúc thực thi. Một ví dụ cụ thể là method có nhiều trường hợp xử lý khác nhau như dưới đây:

private int sampleMethod(int x, int y, String op)
{
if (op.equals(“+”))
return x + y;
else if (op.equals(“-“))
return x – y;
else if (op.equals(“*”))
return x * y;
else
return x/y;
}

Với method trên, khi các xử lý phức tạp hơn, code sẽ khó quản lý và mở rộng. Strategy pattern được ứng dụng để giải quyết vấn đề này.

Bước 1: Xây dựng interface Strategy

public interface Strategy
{
public int doOperation(int x, int y);
}

Bước 2: Hiện thực interface Strategy để xử lý từng trường hợp if trong method sampleMethod

public class Add implements Strategy
{
public Add()
{
}
@Override
public int doOperation(int x, int y)
{
return x + y;
}
}

public class Subtract implements Strategy
{
public Subtract()
{
}

@Override
public int doOperation(int x, int y)
{
return x – y;
}
}

public class Multiply implements Strategy
{
public Multiply()
{
}

@Override
public int doOperation(int x, int y)
{
return x * y;
}
}

public class Divide implements Strategy
{
public Divide()
{
}

@Override
public int doOperation(int x, int y)
{
return x / y; // chưa xử lý trường hợp chia cho 0
}
}

Bước 3: Xây dựng class Context làm trung gian để điều khiển các trường hợp xử lý

public class Context
{

private HashMap<String, Strategy> st = new HashMap<String, Strategy>();

public Context()
{
Add add = new Add();
st.put(“+”, add);
Subtract sub = new Subtract();
st.put(“-“, sub);
Multiply mul = new Multiply();
st.put(“*”, mul);
Divide div = new Divide();
st.put(“/”, div);
}

public int sampleMethod(int x, int y, String op)
{
if(st.containsKey(op))
{
Strategy s = (Strategy)st.get(op);
return s.doOperation(x,y);
}
else
return -1; // or throw Exception here
}
}

Bước 4: viết lại method sampleMethod

int sampleMethod(int x, int y, String op)
{
Context c = new Context();
return c.sampleMethod(x, y, op);
}

Với Strategy pattern, việc quản lý code của các case khác nhau sẽ dễ dàng vì code ở các class riêng biệt. Nếu thêm 1 case mới, chỉ cần tạo class mới hiện thực interface Strategy chứ không cần can thiệp vào code đã có.

Tuy nhiên, một hạn chế của Strategy pattern là sinh ra nhiều class cho các case.

 

THƯ VIỆN VOLLEY TRONG ANDROID — November 29, 2015

THƯ VIỆN VOLLEY TRONG ANDROID

I. Giới thiệu về thư viện Volley

  • Volley là một thư viện mạng( library network) được Google giới thiệu năm 2013 để quản lý các request Network và lưu trữ  những response trên các ứng dụng Android mà không cần các Developer viết nhiều code như trước. Các tools bên trong Volley cho phép cùng một lúc thục hiện nhiều request trên các thread (luồng xử lý dữ liệu) khác nhau với các mức độ ưu tiên (priority) khác nhau. Tất cả request được thực hiện và lưu trữ trong bộ nhớ cache giúp cho việc reload lại dữ liệu nhanh hơn. Nó đặc biện hữu dụng với những dữ liệu như JSON, Image, String,… Nhưng lại không phải là ý tưởng tốt cho việc sử dụng với các dữ liệu lớn như music hay movies.
  • Những class request có trong thư viện Volley này bao gồm : jsonObjectRequest, jsonArrayRequest, StringRequest, ImageLoader kết với các constructor đi kèm như : POST, GET, DELETE, PUT, COPY,…

II. Demo application liên quan tới thư viện Volley

– Mô tả về ứng dụng : Ứng dụng này sẽ tiến hành lấy thông tin đăng nhập của người dùng sau đó nó sẽ gửi request tới sever và sau đó nhận phản hồi từ sever trả về dưới dạng file JSON và đọc file JSON đó kiểm tra status xem có đúng là tài khoản người dùng hay không nếu đúng thì cho phép đăng nhập vào phía bên trong ( tức sẽ chuyển màn hình khác để tiếp tục thao tác ). Nếu sai thì hiện thông báo. Nhưng ở bài này chúng ta dừng lại ở việc biết cách sử dụng thư viện mạng volley để lấy file JSON về thôi. Ở bài tiếp theo mình sẽ hướng dẫn cụ thể cho các bạn cách đọc file JSON.

– Chi tiết về ứng dụng :

1

– Nội dung của file activity_main.xml dùng để thiết kế màn hình như trên :

2

3

Tiếp theo ta cần phải xây dựng một class để có thể kết nối giữa các client với server ở đây mình đặt là HttpClientSSL :

Bên trong class này chúng ta cần thiết lập một số phương thức cần thiết như hình bên dưới để phục vụ cho việc thiết lập các thông số khi giao tiếp với server ( các bạn chú ý đọc chú thích để có thể hiểu cặn kẽ hơn ) :

4

Nhưng ngoài ra nếu bạn muốn gửi request tới server mà có giao thức HTTPS  thì server sẽ yêu cầu một chứng thực sử dụng chữ ký số hay nói cách khác là phiên giao tiếp của bạn sẽ được được mã hóa thành một dãy các kí tự theo tiêu chuẩn chứng thực khóa công khai phổ biến nhất hiện này là X.509 do ITU-T ban hành để có thể giao tiếp với server điều này nhằm để đảm bảo an toàn cho gói thông tin dữ liệu bạn gửi lên server không bị đánh cắp bởi tin tặc trong quá trình truyền dữ liệu đến server chính vì lý do đó mà giao thức HTTPS an toàn hơn nhiều so với HTTP.

5

6

7

8

Mục đích của class này là nhằm đảm bảo rằng tất cả đã được chứng thực khóa công khai CA và theo tiêu chuẩn X.509

Đến đây coi như các công đoạn thiết lập kết nối với server đã xong. Và công việc còn lại chỉ là việc code để tiếp hành gửi các yêu cầu như POST, GET, PUT, … tới server và nhận lại sự phản hồi từ server bằng file JSON

Trong class MainActivity :

Ở đây mình sẽ đi thường vào vấn đề trọng tâm như đã nếu ở trên luôn còn các thao tác khởi tạo và ánh xạ của các control thì các bạn có thể coi ở mấy tutorials trước đó.

9

  • ResponseListener : là nơi bạn sẽ nhận dữ liệu trả về từ server khi request kết thúc.
  • ErrorListener : Nơi bạn nhận lại những problem bên trong request của bạn từ server.
  • getParams() : phần này là phần thông tin sẽ được gửi lên server
  • getHeaders() : thiết lập để yêu cầu server chấp nhận cho lấy dữ liệu mà server trả về dưới dạng file JSON.
  • setRetryPolicy() : Thiết lập một policy để thử lại trong trường hợp SocketTimeout & ConnectionTimeout Exceptions. Volley sẽ thử lại cho bạn nếu bạn đã thiết lập policy rồi.

Và một điều cuối cùng hết sức quan trong bạn cần phải làm đó là việc thiết lập quyền truy cập internet cho ứng dụng bằng cách thiết lập thẻ như hình bên dưới trong file AndroidManifest.xml :

10

– Ngoài ra bạn cũng cần phải biết một số loại Status-Code thông dụng mà server trả về cho client như sau:

1xx: information Message: các status code này chỉ có tính chất tạm thời, client có thể không quan tâm.

2xx Successful: khi đã xử lý thành công request của client, server trả về status dạng này:

  • 200 OK: request thành công.
  • 202 Accepted: request đã được nhận, nhưng không có kết quả nào trả về, thông báo cho client tiếp tục chờ đợi.
  • 204 No Content: request đã được xử lý nhưng không có thành phần nào được trả về.
  • 205 Reset: giống như 204 nhưng mã này còn yêu câu client reset lại document view.
  • 206 Partial Content: server chỉ gửi về một phần dữ liệu, phụ thuộc vào giá trị range header của client đã gửi.

3xx Redirection: server thông báo cho client phải thực hiện thêm thao tác để hoàn tất request:

  • 301 Moved Permanently: tài nguyên đã được chuyển hoàn toàn tới địa chỉ Location trong HTTP response.
  • 303 See other: tài nguyên đã được chuyển tạm thời tới địa chỉ Location trong HTTP response.
  • 304 Not Modified: tài nguyên không thay đổi từ lần cuối client request, nên client có thể sử dụng đã lưu trong cache.

4xx Client error: lỗi của client:

  • 400 Bad Request: request không đúng dạng, cú pháp.
  • 401 Unauthorized: client chưa xác thực.
  • 403 Forbidden: client không có quyền truy cập.
  • 404 Not Found: không tìm thấy tài nguyên.
  • 405 Method Not Allowed: phương thức không được server hỗ trợ.

5xx Server Error: lỗi của server:

  • 500 Internal Server Error: có lỗi trong quá trình xử lý của server.
  • 501 Not Implemented: server không hỗ trợ chức năng client yêu cầu.
  • 503: Service Unavailable: Server bị quá tải, hoặc bị lỗi xử lý.

– Một số hình ảnh sau khi hoàn tất demo :

  • Trường hợp đăng nhập thành công :

11

12

Ở trường hợp này mình đã tiến hành bóc tách dữ liệu từ file JSON được trả về từ server + sử dụng kĩ thuật truyền tham số dữ các màn hình nên như các bạn đã thấy ở trên sẽ hiện ra chuỗi “Hello” + tên người dùng ( từ trong file JSON)

  • Trường hợp sai : thì sẽ hiện bảng thông báo cho người dùng biết 13

 

 

[Ruby] – Bài 5 : Vòng Lặp — August 11, 2015

[Ruby] – Bài 5 : Vòng Lặp

Hôm nay chúng tôi sẽ tiếp tục giới thiệu cho các bạn bài học tiếp theo trong series bài hướng dẫn ngôn ngữ lập trình Ruby.

Bài viết hôm nay sẽ nói về Vòng Lặp :

Trong bài này ta sẽ nói về các ý chính sau :

  • while
  • until
  • for
  • break trong vòng lặp
  • next trong vòng lặp

WHILE


Cú pháp :

while 'Điều kiện lặp'
#Lệnh hoặc khối lệnh
end

Ta có thể thấy while trong Ruby rất giống Python. Các dùng vòng lặp while cũng giống với các ngôn ngữ lập trình khác.

Để dễ hiểu hơn ta xem ví dụ :

i = 0
while i < 5
print "#{i} "
i+=1
end

Kết quả ví dụ trên sẽ là 0 1 2 3 4
Rất đơn giản phải không nào.
UNTIL


Cú pháp :

until 'Điều kiện dừng'
#lệnh hoặc khối lệnh
end

Vòng lặp Until có đôi phần khác biệt. Cách thức mà until sử dụng là nếu điều kiện dừng sai thì vòng lặp tiếp tục chạy. Vòng lặp chỉ dừng khi có điều kiện dừng đúng.

Ta hãy xem ví dụ để hiểu rõ hơn :

i = 0
while i == 5
print "#{i} "
i+=1
end

Kết quả của ví dụ trên : 0 1 2 3 4

Vòng lặp chỉ dừng khi i = 5. Nếu ban đầu ta khởi tạo i có giá trị lớn hơn 5 thì vòng lặp sẽ chạy vĩnh cữu không dừng. Bạn hãy cẩn thận khi khởi tạo giá trị và điều kiện dừng khi dùng vòng lặp until.

FOR


Vòng lặp For rất quen thuộc với các bạn phải không ? Hầu hết các ngôn ngữ lập trình đều sử dụng vòng lặp For.

Trong Ruby vòng lặp For cũng được sử dụng với mục đích tương tự nhưng với cú pháp khác và đơn giản hơn rất nhiều.

for 'tên biến' in 'giá trị khởi tạo' ... 'giá trị cuối'
#câu lệnh hoặc khối lệnh
end

Ví dụ sau đây sẽ giúp các bạn nhanh hiểu hơn về vòng lặp For.

for i in 1...5
puts i
end

for i in 1..5
puts i
end

Ở vòng lặp 2 trong ví dụ đều có giá trị khởi tạo là 1 giá trị cuối là 5. Nhưng điểm khác biệt ở đây là “…” và “..” :

Ý nghĩa của “…” là giá trị khởi tạo sẽ tăng dần cho đến nhỏ hơn giá trị cuối 1 đơn vị cụ thể kết quả ở vòng lặp 1 là ‘1 2 3 4’

Còn dấu “..” là giá trị khởi tạo sẽ tăng dần cho đến khi bằng giá trị cuối. Kết quả vòng lặp 2 là ‘1 2 3 4 5’

BREAK


Lệnh break trong Ruby hoàn toàn giống với các ngôn ngữ lập trình khác.

Ví dụ sau đây sẽ giúp bạn hiểu hơn

i = 5
loop do
	i -= 1
	print "#{i} "
	break if i <= 0
end

Kết quả của ví dụ trên : 4 3 2 1 0
lệnh break sẽ kiểm tra điều kiện đúng của if. Nếu if trả về true thì sẽ thực hiện break thoát khỏi vòng lặp. Còn nếu trả về false thì vòng lặp sẽ tiếp tục lặp.
NEXT


Next trong Ruby giống với Continue trong lập trình C/C++. Cách dùng cũng tương tự.

Ta có ví dụ :

i = 20
loop do
	i -= 1
	next if i % 2 != 0
	print "#{i}"
	break if i <= 0
end

Kết quả của ví dụ sẽ là : 18 16 14 12 10 8 6 4 2 0
Ở ví dụ trên vòng lặp sẽ bỏ qua những số không chia hết cho 2 nhờ câu lệnh next if i % 2 != 0, và thoát khỏi vòng lặp khi gặp điều kiện i <= 0.

[Ruby] – Bài 4 : Các câu lệnh điều kiện – rẻ nhánh trong Ruby — August 7, 2015

[Ruby] – Bài 4 : Các câu lệnh điều kiện – rẻ nhánh trong Ruby

Trong bài viết tiếp theo này, chúng tôi xin giới thiệu về các câu lệnh điều kiện – rẻ nhánh trong Ruby. Cụ thể sẽ có những câu lệnh sau:

  • if
  • if…. else
  • if…. elsif …. else
  • unless
  • case…..

IF


Câu lệnh if trong Ruby cũng khá giống câu lệnh if trong hầu hết các ngôn ngữ lập trình khác, cụ thể ta có cú pháp của lệnh if như sau:

if (biểu thức điều kiện)

# lệnh hoặc  khối lệnh

end

Nếu như biểu thức điều kiện cho giá trị true (đúng) thì khối lệnh bên trong if sẽ được thực hiện và ngược lại nếu biểu thức điều kiện cho giá trị false (sai) thì khối lệnh sẽ không được thực hiện. Ta lấy một ví dụ đơn giản sau:

if (1<2)
     puts "Biểu thức điều kiện đúng"
end
# kết quả hiển thị sẽ là : 
==> Biểu thức điều kiện đúng.

IF … ELSE


Else … là một phần mở rộng của câu lệnh if. Ở câu lệnh if, nếu như biểu thức điều kiện cho giá trị false (sai), thì câu lệnh if sẽ không thực hiện gì. Để thực hiện một khối lệnh trong trường hợp biểu thức điều kiện sai, ta sử dụng if…else, nó có cú pháp như sau:

if (biểu thức điều kiện)

# khối lệnh 1

else

#khối lệnh 2

end

Hoạt động của if … else như sau: Nếu biểu thức điều kiện cho giá trị true (đúng) thì Khối lệnh 1 sẽ được thực hiện, ngược lại nếu biểu thức điều kiện cho giá trị false (sai) thì khối lệnh 2 sẽ được thực hiện. Để hiểu rõ hơn, ta có ví dụ sau:

if 1 > 2
      print   "Điều kiện đúng, sau if được thực hiện."
else
      print   "Điều kiện sai, sau else được thực hiện."
end

#Kết quả sau khi chạy đoạn code trên : 
==>    Điều kiện sai, sau else được thực hiện.
Vì 1 > 2 cho giá trị false, nên câu lên sau else sẽ được thực hiện.

 If … elsif … else ….


Bạn sẽ làm gì nếu như bạn muốn có nhiều hơn 2 lựa chọn trong câu lệnh if của mình ? Khí đó, cấu trúc elsif sẽ giúp bạn giải quyết vấn đề. Nó có cú pháp như sau:

if (biểu thức điều kiện 1)

# khối lệnh 1

elsif (biểu thức điều kiện 2)

#khối lệnh 2

else

#khối lệnh 3

Cách làm việc của cú pháp trên như sau: Khi vào lệnh if, biểu thức điều kiện 1 sẽ được kiểm tra, nếu cho giá trị true (đúng) thì khối lệnh 1 sẽ được thực hiện, ngược lại thì biểu thức điều kiện 2 được kiểm tra, nếu trả về giá trị true (đúng) thì khối lệnh 2 sẽ được thực hiện và ngược lại thì khối lệnh 3 sẽ được thực hiện. Để hiểu thêm, bạn xem ví dụ sau:

if x < y 
  puts "x nhỏ hơn y!"
elsif x > y
  puts "x lớn hơn y!"
else
  puts "x bằng y!"
end 
-----------------
Đây là ví dụ về so sánh 2 số. Ta thấy có sử dụng câu lệnh điều kiện if.. elsif .. else .. tạo ra 3 trường hợp cho các điều kiện.

 Như vậy, với cấu trúc if … elsif …, bạn có thể mở rộng ra được thêm nhiều lựa chọn, thêm nhiều điều kiện cho biểu thức if của mình. Xem cú pháp sau:

if (biểu thức điều kiện 1)

# khối lệnh 1

elsif (biểu thức điều kiện 2)

#khối lệnh 2

…….

elsif (biểu thức điều kiện n-1)

# Khối lệnh n -1

else

#khối lệnh n

Unless


Thỉnh thoảng bạn muốn sử dụng câu lệnh điều kiện để kiểm tra một điều kiện sai, thay vì kiểm tra tính đúng của điều kiện. Bạn hoàn toàn có thể sử dụng câu lệnh if/else để làm việc đó, nhưng trong Ruby, bạn có thể sử dụng một thứ tốt hơn, đó chính là câu lệnh unless. 

Ngược lại với câu lệnh if/else, câu lệnh unless có cú pháp như sau:

unless (điều kiện)

# khối lệnh 1

else

#khối lệnh 2

end

Câu lệnh unless sẽ thực hiện như sau, nó sẽ kiểm tra điều kiện, nếu điều kiện là false (sai) thì khối lệnh 1 sẽ được thực hiện và ngược lại, nếu điều kiện là true (đúng) thì khối lệnh 2 sẽ được thực hiện. Như vậy là nó hoàn toàn trái ngược với câu lệnh if/else. 

Ta có ví dụ sau:

hungry = true
unless hungry
  puts "Tôi chưa đói, tôi không ăn."
else
  puts "Tôi đói, tối muốn ăn!"
end
---------
Kết quả trả về sẽ là :  "Tôi đói, tối muốn ăn!"
Vì giá trị của biến hungrytrue, nên câu lệnh sau else sẽ được thực hiện.

Case


Khi bạn phải thực hiện các hành động khác nhau dựa trên giá trị của một biến duy nhất, nếu như sử dụng if..elsif thì sẽ khá là dài dòng và sẽ lặp đi lặp lại các đoạn code. Để tránh điều này, Ruby cung cấp cho chúng ta câu lệnh case.  Câu lệnh case bắt đầu với từ khóa case  cùng với tên biến mà nó cần kiểm tra. Cú pháp của case như sau:

case (Biến_kiểm_tra)
   when giá_trị_1 : khối lệnh 1
   when giá_trị_2 : khối lệnh 2
   ....
   when giá_trị_n: khối lệnh n
   else khối lệnh
end

Câu lệnh case sẽ kiểm tra giá trị của Biến_kiểm_tra nếu giá trị của Biến_kiểm_tra bằng với giá trị nào đó trong các trường hợp when, thì khối lệnh của trường hợp đó được thực hiện, nếu không có giá trị nào của các trường hợp when đúng với giá trị của Biến_kiểm_tra thì khối lệnh sau else được thực hiện.

Biến kiểm tra không bắt buộc là một biến đơn, nó có thể là một biểu thức, ví dụ: case (i+1) . Kiểu dữ liệu của biến kiểm tra và giá trị của mỗi when có thể là số nguyên hoặc chuỗi. Ví dụ:  when 1, ‘Monday’, ‘Mon’ then puts( “Yup, ‘#{i}’ is Monday” )

Ta có thể thay thế dấu hai chấm (:) trong các trường hợp when bằng từ khóa then. Ví dụ: when giá_trị_1 then khối lệnh 1

Bạn có thể thêm vào nhiều dòng lệnh sau câu lệnh điều kiện when và bạn có thể thêm vào nhiều giá trị so sánh cho mỗi trường hợp when bằng cách sử dụng dấu phẩy(,) để phân các giá trị. Ví dụ :

....
when 2, 3, 4, 5, 6 :
    puts("Thứ 2, 3, 4, 5,6 là ngày làm việc" )
    puts("Chúc bạn làm việc hiểu quả.")
when 7,8 : puts("Chúc bạn cuối tuần vui vẻ! ")
...

[Ruby] – Bài 3 : Toán Tử —

[Ruby] – Bài 3 : Toán Tử

Tiếp theo series bài viết giới thiệu về Ruby. Trong bài viết này chúng tôi sẽ giới thiệu về toán tử.

# Text1.rb
a = 2 ** 2
b = 3 * a + 2 
c = 28 / b;
d = 3 % c
printf("%d, %d, %d. %d\n", a, b, c, d);
print "#{a}, #{b}, #{c}, #{d}"

Nội dung của ví dụ đầu tiên.
Các toán tử được sử dụng ở ví dụ trên :

  • ” + ” :  phép cộng.
  • ” – ” : phép trừ.
  • ” * ” : phép nhân.
  • ” / ” : phép chia.
  • ” % ” : phép chia lấy dư.
  • ” ** ” : phép lũy thừa.

Các toán tử so sánh :

  • Lớn hơn: >
  • Bé hơn:  <
  • Lớn hơn hoặc bằng: >=
  • Bé hớn hoặc bằng: <=
  • Bằng : ==
  • Khác : !=

Các phép toán logic: 

  • Và : && hoặc and
  • Hoặc: || hoặc or
  • Phủ định: ! hoặc not

Phép gán: để thực hiện phép gán, ta sử dụng toán tử bằng: = . Ví dụ: a = 2

Các câu lệnh nhập xuất cơ bản :

  • printf(“%d”, a);  : lệnh xuất ra màn hình với %d là đặc tả tương ứng với kiểu dữ liệu của biến. %d là đặc tả kiểu số nguyên, %f đặc tả kiểu số thực, %s đặc tả kiểu chuỗi,..v . Câu lệnh này giống với printf trong ngôn ngữ C.
  • print “#{a}” : lệnh xuất ra màn hình với #{a}. với a là biến dữ liệu ta cần xuất ra màn hình.
  • puts “#{a}” : lệnh xuất ra màn hình, giống với lệnh print phía trên. Với puts thì sau khi in , con trỏ nháy sẽ xuống dòng mới.
  • Lệnh nhập : a = Integer(gets.chomp) đây là lệnh nhập cơ bản với a nhận kiểu giá trị kiểu nguyên.

Comment :

 #Đây là một chú thích.
=begin 
Những chuỗi này trong "=begin" và "=end" đều là chú thích. 
=end

Reserved words (Những tên không được dùng làm tên biến)

The reserved words are:

BEGIN	 class	  ensure   nil	    self     when
END	 def	  false    not	    super    while
alias	 defined  for	   or	    then     yield
and	 do	  if	   redo     true
begin	 else	  in	   rescue   undef
break	 elsif	  module   retry    unless
case	 end	  next	   return   until
SQLITE DATABASE TRONG ANDROID — August 5, 2015

SQLITE DATABASE TRONG ANDROID

Chào các bạn hôm nay mình vẫn sẽ dựa trên ứng dụng login trước đó nhưng thêm chức năng mới có liên quan tới SQLite Database để phần nào giúp các bạn có thể hiểu thêm về SQLite Database trong Android Studio . Cụ thể mình sẽ thiết kế thêm chức đăng kí và sử dụng SQLite Database để lưu trữ dữ liệu thông tin của người dùng đối với app của mình.

manhinhdangki

 

– Đầu tiên các bạn tiến hành tạo cho mình một file Blank Activity để có thể quản lý màn hình đăng kí thông tin của người dùng ( cách tạo file Blank Activity bạn có thể xem ở bài hướng dẫn trước ). Sau khi đã tạo xong các bạn tiến hành thiết kế các control như hình của mình như sau :

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:background="#400080"
    tools:context="demoapp.akiraaman.demo_sqlite.DangKy_Activity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="ĐĂNG KÍ THÔNG TIN"
        android:textSize="20dp"
        android:textColor="#FF0000"
        android:layout_centerHorizontal="true"
        android:textStyle="bold"/>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Tài Khoản : "
        android:textColor="#FFFF00"
        android:textSize="15dp"
        android:layout_marginTop="50dp"
        />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Mật Khẩu : "
        android:textColor="#FFFF00"
        android:textSize="15dp"
        android:layout_marginTop="100dp"/>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Xác Nhập MK : "
        android:textColor="#FFFF00"
        android:textSize="15dp"
        android:layout_marginTop="150dp"/>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Tên Chủ TK : "
        android:textColor="#FFFF00"
        android:textSize="15dp"
        android:layout_marginTop="200dp"/>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Địa Chỉ : "
        android:textColor="#FFFF00"
        android:textSize="15dp"
        android:layout_marginTop="250dp"/>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="SĐT : "
        android:textColor="#FFFF00"
        android:textSize="15dp"
        android:layout_marginTop="300dp"/>
    <EditText
        android:layout_width="200dp"
        android:layout_height="50dp"
        android:inputType="textPersonName"
        android:id="@+id/editTextTK"
        android:textColor="#FFFFFF"
        android:layout_marginTop="35dp"
        android:layout_marginLeft="100dp"/>
    <EditText
        android:layout_width="200dp"
        android:layout_height="50dp"
        android:inputType="textPassword"
        android:id="@+id/editTextMK"
        android:textColor="#FFFFFF"
        android:layout_marginTop="85dp"
        android:layout_marginLeft="100dp"/>
    <EditText
        android:layout_width="200dp"
        android:layout_height="50dp"
        android:inputType="textPassword"
        android:id="@+id/editTextXNMK"
        android:textColor="#FFFFFF"
        android:layout_marginTop="135dp"
        android:layout_marginLeft="100dp"/>
    <EditText
        android:layout_width="200dp"
        android:layout_height="50dp"
        android:inputType="textPersonName"
        android:id="@+id/editTextTenChuTK"
        android:textColor="#FFFFFF"
        android:layout_marginTop="185dp"
        android:layout_marginLeft="100dp"/>
    <EditText
        android:layout_width="200dp"
        android:layout_height="50dp"
        android:inputType="textPersonName"
        android:id="@+id/editTextDiaChi"
        android:textColor="#FFFFFF"
        android:layout_marginTop="235dp"
        android:layout_marginLeft="100dp"/>
    <EditText
        android:layout_width="200dp"
        android:layout_height="50dp"
        android:inputType="numberDecimal"
        android:id="@+id/editTextSDT"
        android:textColor="#FFFFFF"
        android:layout_marginTop="285dp"
        android:layout_marginLeft="100dp"/>
    <Button
        android:layout_width="100dp"
        android:layout_height="40dp"
        android:text="Đăng Ký"
        android:textStyle="bold"
        android:id="@+id/buttonDangKy"
        android:background="#39C65C"
        android:layout_below="@+id/editTextSDT"
        android:layout_marginTop="30dp"
        android:layout_centerHorizontal="true"/>
</RelativeLayout>

– Bước tiếp theo các bạn tiến hành ánh xạ qua file java để chút nữa chúng ta viết code xử lý cho nó ( thao tác này các bạn có thể coi ở bài trước ).

hinh1

 

– Sau khi các bạn thực hiện công đoạn ánh xạ xong thì công đoạn tiếp theo chúng ta cần có một kiểu dữ liệu tự tạo để có thể quản lý hết các thông tin của người dùng một cách dễ dàng hơn và thông qua nó có thể lưu trữ dữ liệu thông tin vào trong cơ sở dữ liệu. Ở đây chúng ta sẽ tạo ra một class với các thuộc tính là các thông tin về người dùng và một số phương thức setter() và getter() của các thông tin đó. Cụ thể như sau :

public class TaiKhoan {
    String m_TK, m_Matkhau, m_Ten, m_Diachi, m_Sdt;
    public String getM_TK() {
        return m_TK;
    }

    public void setM_TK(String m_TK) {
        this.m_TK = m_TK;
    }

    public String getM_Matkhau() {
        return m_Matkhau;
    }

    public void setM_Matkhau(String m_Matkhau) {
        this.m_Matkhau = m_Matkhau;
    }

    public String getM_Ten() {
        return m_Ten;
    }

    public void setM_Ten(String m_Ten) {
        this.m_Ten = m_Ten;
    }

    public String getM_Diachi() {
        return m_Diachi;
    }

    public void setM_Diachi(String m_Diachi) {
        this.m_Diachi = m_Diachi;
    }

    public String getM_Sdt() {
        return m_Sdt;
    }

    public void setM_Sdt(String m_Sdt) {
        this.m_Sdt = m_Sdt;
    }
    
    public void TaiKhoan(){
    }
}

– Để có thể tạo các getter cũng như setter một cách nhanh chóng các bạn có thể làm theo cách sau : Bên trong class các bạn bôi đen để chọn các thuộc tính cần tạo rồi nhấp chuột phải chọn Generate ( hoặc nhấn tổ hợp phím Alt + Insert ) sau đó chọn setter() hoặc getter() hoặc cả hai thì nó sẽ xuất hiện một hộp thư thoại các bạn chọn OK để hệ thống tiến hành phát sinh cho các bạn các getter() cũng như setter().

– Tiếp đó mình sẽ tạo ra một file class DatabaseHelper.java để quản lý công việc kết nối với cơ sơ dữ liệu. Class này sẽ kế thừa lại class SQLiteOpenHelper.
phuongthuctinh

– Các bạn khai báo các thuộc tính tĩnh để giúp cho việc xử lý sau này được dễ dàng hơn như : DATABASE_NAME, TABLE_NAME, VERSION và các cột COLUMN_ID, COLUMN_PASSWORD, COLUMN_NAME, COLUMN_IP, COLUMN_PHONE

lenhcreatetable

– Khai báo thuộc tính tĩnh dùng để tạo bảng dữ liệu có tên TABLE_CREATE . Lệnh tạo bảng có thể hiểu như sau : Tạo ra một bảng dữ liệu có tên DuLieuTaiKhoan với các cột dữ liệu thông tin id , pass, name, ip, nphone tất cả đều thuộc kiểu text trong đó id là khóa chính ( primary key ) và được ràng buộc bởi từ khóa not null tức là không được bỏ trống thông tin tại cột đó.

hinhbiendb

 

– Khai báo biến db thuộc kiểu SQLiteDatebase. Ở hàm khởi tạo OnCreate hàm này sẽ được chạy đầu tiên khi class này được khởi tạo. Trong hàm này mình sẽ tiến hành khởi tạo bảng dữ liệu bằng phương thức truy vấn execSQL(TABLE_CREATE) rồi sau đó gán cho biến db mà chúng ta đã khai báo phía trên tức là lúc này trong CSDL của chúng ta sẽ có 1 bảng được tạo ra. Còn hàm onUpgrade() được gọi khi ta nâng cấp ứng dụng và thay đổi giá trị của phiên bản CSDL (DATABASE_VERSION) ở trên. Trong ví dụ ở trên, khi có thay đổi phiên bản này, ta xóa CSDL cũ và tạo lại cái mới.

cochesuper

 

– Ta cũng tạo thêm một lớp cục bộ (lớp DatabaseHelper ở trên) để trợ giúp cho việc tạo CSDL và nâng cấp cấu trúc khi có sự thay đổi trong các phiên bản tiếp theo. Hàm dựng của lớp này sẽ gọi về hàm dựng bằng cơ chế super ( bên C# thì ta dùng cơ chế base) của lớp mẹ với tên và phiên bản CSDL của ứng dụng. Và để có thể thêm được một tài khoản vào CSDL thì các bạn làm như sau :

insert

 

– Ở phương thức insertTK này đầu tiên bạn phải mở kết nối tới CSDL với lựa chọn là ghi dữ liệu vào CSDL, thao tác này tương tự như thao tác mở file bên C++ khi chúng ta muốn ghi một dữ liệu nào đó lên file.  Khai báo và cấp phát một vùng nhớ cho biến values, biến này là cầu nối để có thể đưa thông tin người dùng vào CSDL, sau đó các bạn tiến hành thêm từng thông tin người dùng vào các cột tương ứng của bảng dữ liệu và kết thúc bằng việc đóng kết nối tới CSDL.

– Thiết lập phương thức update như sau :

update

 

– Hàm này có chức năng cập nhật lại mật khẩu của khách hàng khi họ thay đổi mật khẩu . Các bạn cũng có thể mở rộng hơn với toàn bộ dữ liệu của người dùng bằng cách truyền cho hàm một tham số là class Taikhoan . Các đối số trong phương thức update lần lượt là : tên bảng dữ liệu, tên cầu nối chứa giá trị cần cập nhật, tập điều kiện lọc, tập các giá trị của điều kiện lọc.

searchTK

 

– Ta tiếp tục thiết lập phương thức tìm kiếm tài khoản của người dùng theo id ở khung Tài Khoản mà người dùng nhập vào. Đầu tiên chúng ta vẫn phải tiến hành mở kết nối với CSDL sau đó dùng lệnh trong chuỗi query để truy vấn tới bảng dữ liệu cần thao tác lên nó tiếp đó bạn cần duyệt toàn bảng dữ liệu để tìm xem có tài khoản như khách hàng đã nhập vào không nếu có return true ngược lại return false và trước khi kết thúc hàm kiểm tra này bạn cần phải đóng kết nối CSDL lại.

searchPass

 

– Ở hàm searchPass() bạn cũng làm tương tự nhưng lúc truy vấn bạn cần thêm pass của người dùng app và lúc kết thúc hàm bạn sẽ return pass đã tìm thấy ứng với id của người dùng.

delete

 

– Hàm deleteUser() có chức năng xóa một tài khoản khi biết id của người dùng đó. Để có thể xóa ta sử dụng phương thức delete() với các tham số truyền vào lần lượt là : Tên bảng cần xóa dữ liệu, tập điều kiện lọc (dùng ? để tạo), tập các giá trị của điều kiện lọc. Bạn cũng thiết lập tương tự với hàm searchPass() nhưng tại khác đối số truyền vào cho phương thức delete bạn để null hết như hình bên dưới :

deletaAll

 

– Sau khi đã thiết lập xong các công đoạn để có thể thao tác và kết nối với CSDL, các bạn quay lại file .java quản lý bạn hình đăng ký để thiết lập sự kiện cho nút button đăng ký

sukienbtnDangKy

 

– Khi người dùng Click vào button Đăng Ký thì bạn sẽ phải tiến hành kiểm tra xem giữa 2 lần nhập mật khẩu có khớp nhau không nếu không khớp thì thông báo cho người dùng biết “mật khẩu không khớp nhau”. Ngược lại bạn khai báo một biến kh để đại diện cho một dùng đăng ký sau đó các bạn phải lấy tất cả các dữ liệu mà người dùng nhập vào ở các ô EditText cập nhật thông tin cho người dùng này. Cuối cùng bạn thêm vào dữ liệu nhờ phương thức insertTK() mà chúng ta đã thiết lập trước đó đồng thời thông báo cho người dùng biết đã đăng ký thành công

Main_Activity

 

– Các bạn quay lại với .java của màn hình đăng nhập để tiến hành thao tác xử lý . Khi người dùng click vào button Đăng Nhập các bạn hãy cho phát sinh sự kiện OnClick() cho button Đăng Nhập. Tiếp đó các bạn cần kiểm tra xem có tài khoản đó trong CSDL của chúng ta hay không nếu không thông báo “Tài khoản không tồn tại” . Ngược lại thì các bạn xét tới trường hợp liệu pass người dùng nhập vào có trùng với pass nằm trong CSDL ứng với tài khoản đó không nếu không thông báo lỗi “Mật khẩu không đúng” còn nếu trùng thông báo cho người dùng biết rằng đã “Đăng nhập thành công” và tiến hành chuyển sang màn hình thao tác của người dùng. Tại file .java quản lý màn hình này các bạn có thể thiết lập chức năng như thay đổi mật khẩu :

doipass

– Ngoài ra các bạn có thế thiết lập thêm chức năng thay đổi thông tin của người dùng, thay đổi avatar ( cái này mình sẽ hướng dẫn sau), v.v…Mặt khác các bạn cũng cần phải thiết lập 1 màn hình riêng dành cho người quản trị viên để có thể thiết lập các chức năng của quản trị viên ứng dụng đó như : Xóa tài khoản, Xem thông tin về tài khoản của khách hàng, xem tọa độ của khách hàng đang dùng app, khóa tài khoản, v.v…

xoa

– Hi vọng với tất cả những thứ mình trình bày ở trên sẽ giúp các bạn hiểu hơn về SQLite Database trong Android

[Ruby] – Bài 2 : Các kiểu dữ liệu, biến và hằng trong Ruby. — August 4, 2015

[Ruby] – Bài 2 : Các kiểu dữ liệu, biến và hằng trong Ruby.

Tiếp theo bài 1 trong series giới thiệu về Ruby. Trong bài viết này, chúng tôi sẽ giới thiệu về các kiểu dữ liệu, biến và hằng trong Ruby.

CÁC KIỂU DỮ LIỆU


Trong Ruby có các kiểu dữ liệu cơ bản sau (các kiểu dữ liệu khác chúng tôi sẽ đề cập ở những bài viết sau) :

  • Number 
  • Booleans
  • String

Number

Kiểu number trong Ruby được chia làm 2 loại. Là kiểu số nguyên (Interger) và kiểu số thực (Float). Vì mọi thứ trong Ruby đều là đối tượng, nên Number cũng là một đối tượng, có nghĩa là số nguyên và số thực trong Ruby đều có ít nhất một phương thức (methods). Ví dụ ta có đoạn code sau:

puts "Tôi sẽ đếm lần lượt tới 99..."
100.times {|number| puts number}
....

Ở trong ví dụ này, ta thấy số 100 đang sử dụng phương thức times và kết quả sau khi chạy đoạn code này sẽ hiển thị từ 0 tới 99 lên màn hình. Ở các bài viết sau, chúng tôi sẽ giới thiệu thêm về các phương thức của Number.

Booleans

Booleans là kiểu dữ liệu logic trong Ruby, nó chỉ có 2 giá trị đó là true (đúng) và false (sai).

Một điều cần lưu ý là không bao giờ đặt True và False trong cặp dấu nháy đơn(‘ true‘) hoặc dấu nháy kép(“false“) vì nếu như bạn làm vậy thì kiểu của True và False sẽ được chuyển thành kiểu trings(chuỗi).

logic = true # đúng
logic = "true" # sai

String

Chuỗi trong Ruby được đặt trong cặp dấu nháy kép (” “) hoặc dấu nháy đơn (‘ ‘). Ví dụ:

str_test = "Xin chào Việt Nam"
str_test2 = 'Hello World'
str_test3 = 'It\'s a computer'

Chúng tôi khuyên bạn nên sử dụng nháy kép(” “) khi sử dụng chuỗi, vì nó sẽ giúp bạn dễ dàng trong việc khai báo cũng như sử dụng chuỗi. String cũng là một đối tượng trong Ruby, cho nên, Ruby cung cấp khá nhiều phương thức (methods) cho String. Ví dụ:

"Hello".lenght # trả về độ dài của chuỗi
"Windows".reverse # đảo ngược chuỗi
.....

 Biến


Một khái niệm cơ bản trong ngôn ngữ lập trình đó  là Biến. Bạn có thể nghĩ biến như là một từ hoặc một tên mà nó có thể lưu giữ một giá trị.

Khai báo biến trong Ruby rất dễ dàng: bạn chỉ cần viết tên của biến giống như my_num, và sau đó sử dụng toán tử  = để gán giá trị cho nó, như vậy bạn đã hoàn thành việc khai báo 1 biến và gán giá trị cho nó.

my_num = 25 # khai báo biến có tên my_num và gán giá trị cho nó bằng 25
my_string = "Hello World" # khai báo biến my_string có kiểu string.
my_boolean = true #khai báo biến my_boolean có kiểu Boolean

Lưu ý : Giá trị của biến có thể thay đổi trong quá trình chạy chương trình. Ví dụ:

a = 25
puts a # in ra giá trị của a : 25
a = 30
puts a # in ra giá trị của a " 30

 Các loại biến

Biến cục bộ (local)

Biến cục bộ là một biến thông thường, được khai báo theo nguyên tắc khai báo biến. Phạm vi sử dụng của biến cục bộ phụ thuộc vào vị trí của biến khi khai báo. Ví dụ:

localvar = "hello" # khai báo biến localvar và gán giá trị
def var_test{
     localvar = 10 # khai báo biến localvar và gán giá trị
     puts localvar # in giá trị của localvar ra màn hình
}
var_test # gọi phương thức var_test
puts localvar #in giá trị của localvar ra màn hình

------
Kết quả : 
==> 10
==> hello
Như vậy ta thấy, mặc dù có cùng tên nhưng giá trị in ra là khác nhau,
 vì biến localvar ở trong phương thức var_test không có liên quan gì với
 biến localvar ở ngoài phương thức. Mặc dù chúng có cùng tên biến.

 Biến toàn cục (global)

Khác với biến cục bộ, biến toàn cục được khai báo với tên bắt đầu bằng ký tự $ và biến toàn cục có phạm vi sử dụng trong toàn bộ chương trình. Ví dụ:

Khai báo biến toàn cục $global = “I am global varialble”

Xét đoạn code ví dụ sau:

$localvar = "hello" # khai báo biến localvar và gán giá trị
def var_test{
     $localvar = 10 # khai báo biến localvar và gán giá trị
     puts $localvar # in giá trị của localvar ra màn hình
}
var_test # gọi phương thức var_test
puts $localvar #in giá trị của localvar ra màn hình

------
Kết quả : 
==> 10
==> 10
Ta thấy, khi giá trị của biến toàn cục thay đổi ở trong phương thức, 
thì sự thay đổi này ảnh hưởng ra tới bên ngoài phương thức.
 Như vậy, phạm vi của biến toàn cục là toàn bộ chương trình.

 Biến đối tượng (instance variable)

Biến được bắt đầu bằng ký tự @ được gọi là “Biến Đối Tượng”, có nghĩa là nó chỉ thuộc về một đối tượng riêng lẻ hoặc một đối tượng của một lớp. Ví dụ:

class Dog
    def set_name( aName )
         @myname = aName
    end
    def get_name
         return @myname
    end
   def talk
         return 'woof!'
   end
end
 
Ta thấy, biến được bắt đầu bằng ký tự @ chỉ sử dụng trong các phương thức của lớp, và nó là dành riêng cho lớp.

 Hằng


Một Hằng trong Ruby cũng giống như một biến, ngoại trừ một điều là giá  trị của hằng không đổi trong quá trình chương trình chạy. Trình thông dịch của Ruby không bắt buộc về sự cố định giá trị của Hằng, nhưng nếu có sự thay đổi giá trị của Hằng thì trình thông dịch sẽ có thông báo về sự thay đổi đó. Ví dụ:

A_CONST = 10
A_CONST = 20

Ở đây chúng ta làm thay đổi giá trị của hằng A_CONST từ 10 thành 20, và trình thông dịch của Ruby sẽ có thông báo như sau:
“ warning: already initialized constant A_CONST  ”

Tên của Hằng được đặt tên giống như tên của biến, nhưng tên Hằng phải bắt đầu bằng ký tự viết HOA. Theo quy ước thì hầu hết tên Hằng được viết hoa tất cả các ký tự và các từ của tên Hằng được phân cách bằng dấu gạch dưới (_) , ví dụ : LIKE_THIS.

Lưu ý: HẰNG không tồn tại cho tới khi một giá trị thực được gán cho nó. Có nghĩa là nếu bạn khai báo tên cho một Hằng, mà chưa gán giá trị cho nó, thì Hằng đó vẫn chưa tồn tại.


					
[Ruby] – Bài 1 : Giới thiệu và hướng dẫn cài đặt Ruby — August 3, 2015

[Ruby] – Bài 1 : Giới thiệu và hướng dẫn cài đặt Ruby

Ruby là một ngôn ngữ lập trình, được viết bởi Yukihiro Matsumoto, phiên bản đầu tiên được ra đời năm 1995.

Bạn có thể tìm hiểu thêm về lịch sử phát triển và các phiên bản của Ruby

Link : https://en.wikipedia.org/wiki/Ruby_(programming_language)

Ruby là một ngôn ngữ lập trình độngtheo hướng đối tượng, ngoài các thành phần hướng đối tượng như ta khai báo hoặc tạo lập các hàm. Trong Ruby thì một số nguyên, số thực cũng là đối tượng, một chuỗi cũng là một đối tượng. Hướng đối tượng có ở khắp các thành phần trong Ruby. Đặc điểm của Ruby là chạy không cần biên dịch (giống ngôn ngữ lập trình PHP)

* Tiếp theo mình sẽ hướng dẫn các bạn cài đặt Ruby.

1. Truy cập vào website http://rubyinstaller.org/downloads/ chọn phiên bản mới nhất và tải về.

2. Sau khi download về. Các bạn mở ra chọn lần lượt ở các cửa sổ “Select Setup Language” – Chọn English – Chọn OK.

Ruby1
1.1 Cài đặt Ruby

3. Tiếp theo chọn “I accept the License” Sau đó chọn “Next

1.2 Cài đặt Ruby

4.  Chọn “Add Ruby executables to your PATH” sau đó chọn “Install“. Như vậy là ta đã cài đặt xong Ruby ( trên hệ điều hành windows)

1.3 Cài đặt Ruby
1.3 Cài đặt Ruby

* Để khởi động và viết code trên Ruby :

-Chọn vào Start Menu – chọn Interactive Ruby, ta bắt đầu chạy chương trình đầu tiên gõ lệnh : print “Hello World”. Chương trình sẽ in ra “Hello World” trên khung Console.

1.4 Khởi động Ruby
1.4 Khởi động Ruby

– Ta cũng có thể viết code trên Notepad++, Sumline Text2, v..

Ta viết code trong Notepad++ : print “Hello” lưu với định dạng là Hello.rb

Mở CMD : sau đó gõ : ruby C:\Users\..đường dẫn vị trí lưu file Hello.rb..\Hello.rb

1.5 Chạy chương trình Ruby
1.5 Chạy chương trình Ruby

Khung console sẽ in ra nội dung “Hello”.

Vậy là ta đã tìm hiểu sơ lượt về Ruby. Cách cài đặt Ruby cũng như cách viết code và chạy chương trình. Ở bài tiếp theo chúng ta sẽ tìm hiểu Biến, Hằng và Các Kiểu Dữ Liệu.

Cách upload hình trong GitHub — July 29, 2015

Cách upload hình trong GitHub

Hướng dẫn upload hình ảnh lên GitHub

Vì GitHub không hỗ trợ upload hình ảnh(chỉ hỗ trợ code) vì vậy chúng ta không thể upload trực tiếp file hình ảnh lên GitHub. Sau đây mình xin hướng dẫn cách upload một số định dạng tệp PNG, JPG, GIF lên GitHub thông qua việc sử dụng chức năng ISSUSES của GitHub.

Bước 1: Click vào Issues tab:

Tạo một Issues với tiêu đề tương ứng với nội dung của hình ảnh


Bước 2: Tạo một Issues mới

Trong ví dụ dưới đây, tôi đang tải lên các hình ảnh sẽ được sử dụng trong các tài liệu của README.md, vì vậy tôi sẽ tạo tên cho vấn đề: Picture for README. Chú ý, các hướng dẫn ở dưới cùng của tab Write. Bạn có thể kéo-và-thả một hoặc nhiều hình ảnh vào hộp Leave a Comment và các tập tin sẽ được ngay lập tức tải lên cho người quản lý dữ liệu GitHub.

Sau mỗi lần upload, GitHub sẽ cập nhật các văn bản liên kết tới các hình ảnh.

Sau đó bạn nhấn vào Submit Issues để tiến hành cập nhật.

Hình ảnh của bạn đã upload thành công !!!