Thứ Ba, 18 tháng 11, 2014

NGÀY TRỞ LẠI??

Bỏ bẵng đi 1 thời gian do bận việc này việc khác, cũng bỏ quên không vào chăm sóc viết bài cho cái blog này. Tình hình nay quay lại vẫn thấy nhiều bạn ghé vào thường xuyên để ngâm cứu, cũng thấy vui vui.

Dự tính thời gian tới lại cày kéo tiếp không thì kiến thức nó mai một đi hết thì phí. Mình thấy số lượng các bạn quan tâm tới Cocos2d-x cũng ngày càng tăng lên đáng kể, mới làm quen lập trình game cũng có, chuyển đổi từ engine - ngôn ngữ khác sang cũng có, nhưng túm lại là có phát triển. Tương lai của Engine này không biết tới đâu vì còn tùy thuộc vào Team phát triển của nó ( đang phát triển 3.3 - 3.4 rồi), nhưng chắc chắn cũng đang có nhiều người quan tâm. Càng đông càng vui nhỉ. Và sẽ học hỏi được nhiều điều hơn.

Không biết từ Blog này có bạn nào đã tạo được dự án nào chưa? Mềnh cũng ủ làm vài cái nho nhỏ cho vui, mà giờ trượt tiến độ quá, hix. Chắc phải cày lại thôi

Đôi lời cùng những ai đang ghé qua đây, hi vọng sẽ trở lại sớm sớm!


Thứ Ba, 11 tháng 11, 2014

Bài 10: Thêm một ví dụ về TextView, EditText, CheckBox, Button và ImageButton trong Android

Để ôn tập kỹ hơn về TextView, EditText, CheckBox, Button và ImageButton, chúng ta sẽ làm thêm một ví dụ tổng hợp và nâng cao hơn. Để hiểu tốt bài này, các bạn cần có kiến thức về hướng đối tượng trong java, và việc triển khai, viết các class của nó. Chúng ta sẽ cùng nghiên cứu về bài tập này, và mình sẽ cố gắng giải thích một cách dễ hiểu nhất.


Đề bài: Viết một chương trình cho phép nhập tên của học sinh, giới tính, học lực. Sau đó thống kê tổng số học sinh, và thống kê số học sinh theo giới tính, học lực.

Giao diện Android
Giao diện chương trình

-Mô tả yêu cầu:
  • Khi bấm nút "Thêm", chương trình sẽ lưu lại kết quả vào trong một Arraylist.
  • Khi bấm nút  "Thống kê" chương trình sẽ hiển thị ra kết quả...
  • Khi bấm nút "Thoát" có biểu tượng như trên, chương trình sẽ hiện một hộp hội thoại AlertDialog hỏi có thoát hay không, và thực thi.
Nếu các bạn đã theo dõi từ các bài trước, mình chắc là việc thiết kế giao diện như hình trên là một điều hoàn toàn dễ dàng, không hề khó khăn. Việc sử dụng các control như TextView, Editext, hay Button đều quen thuộc. Trong bài này, vấn đề của chúng ta nằm ở việc lưu trữ dữ liệu và thống kê để hiển thị ra ngoài.

Theo yêu cầu đề bài, các bạn sẽ sử dụng một ArrayList để lưu trữ khi nhập dữ liệu của học sinh. Mỗi đối tượng học sinh có các thuộc tính: Tên học sinh, Giới tínhXếp Loại. Vì vậy các bạn cần phải tạo ra một class để lưu thông tin của học sinh và một class để lưu thông tin của danh sách học sinh.

Bạn tạo thêm 2 class Java trong package chứa MainActivity.Java  và đặt tên như sau:
Package Android


Và sau đây là toàn bộ code của chương trình:
+ activity_main.xml:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools"
     android:id="@+id/ScrollView1"
     android:layout_width="match_parent"
     android:layout_height="match_parent" >
<LinearLayout android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
   
    <TextView
        android:text="Thông Tin Học Sinh"
        android:textSize="18sp"
        android:textStyle="bold"
        android:textColor="#008000"
        android:background="#FFFF00"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />
   
    <TableLayout android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:stretchColumns="*"
        android:layout_weight="1">
       
        <TableRow android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:layout_marginLeft="10dp">
           
            <TextView
                android:text="Tên Học Sinh"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
            <EditText
                android:id="@+id/edtTenHS"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:ems="10"
                />
           
        </TableRow>
       
        <TableRow android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:layout_marginLeft="10dp">
           
            <TextView
                android:text="Giới tính"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
            <RadioGroup android:id="@+id/rgGioiTinh"
                android:orientation="horizontal">
                <RadioButton
                    android:id="@+id/rgNam"
                    android:text="Nam"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:checked="true"/>
                <RadioButton
                    android:id="@+id/rgNu"
                    android:text="Nữ"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content" />
            </RadioGroup>
           
        </TableRow>
       
        <TableRow android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:layout_marginLeft="10dp">
           
            <TextView
                android:text="Xếp Loại:"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
            <RadioGroup android:id="@+id/rgXepLoai"
                android:orientation="horizontal">
                <RadioButton
                    android:id="@+id/rgTB"
                    android:text="TB"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:checked="true"/>
                <RadioButton
                    android:id="@+id/rgKha"
                    android:text="Khá"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content" />
                <RadioButton
                    android:id="@+id/rgGioi"
                    android:text="Giỏi"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content" />
            </RadioGroup>
           
        </TableRow>
       
    </TableLayout>
   
    <LinearLayout android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_marginTop="10dp"
        android:layout_weight="1">
       
        <Button android:id="@+id/btnThem"
            android:text="Thêm"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"/>
        <Button android:id="@+id/btnThongKe"
            android:text="Thống kê"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"/>
    </LinearLayout>
   
     <TextView
        android:text="Thống kê"
        android:textSize="18sp"
        android:textStyle="bold"
        android:textColor="#008000"
        android:background="#FFFF00"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10sp"/>
   
     <TableLayout android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:stretchColumns="*"
        android:layout_weight="1">
        <TableRow android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1">
            <TextView
                android:text="Tổng học sinh: "
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
           
            <EditText
                android:id="@+id/edtTongHS"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:ems="10"  />
        </TableRow>
       
        <TableRow android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1">
            <TextView
                android:text="Học sinh Nam: "
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
           
            <EditText
                android:id="@+id/edtHSNam"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:ems="10"  />
        </TableRow>
       
        <TableRow android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1">
            <TextView
                android:text="Học sinh Nữ: "
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
           
            <EditText
                android:id="@+id/edtHSNu"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:ems="10"  />
        </TableRow>
        <TableRow android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1">
            <TextView
                android:text="Số học sinh giỏi: "
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
           
            <EditText
                android:id="@+id/edtHSGioi"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:ems="10"  />
        </TableRow>
        <TableRow android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1">
            <TextView
                android:text="Số học sinh khá: "
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
           
            <EditText
                android:id="@+id/edtHSKha"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:ems="10"  />
        </TableRow>
       
        <TableRow android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1">
            <TextView
                android:text="Số học sinh TB: "
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
           
            <EditText
                android:id="@+id/edtHSTB"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:ems="10"  />
        </TableRow>
       
     </TableLayout>
    
     <ImageButton
         android:id="@+id/imgbtnExit"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:src="@drawable/exit"/>
</LinearLayout>   
</ScrollView>


+MainActivity.java

package com.example.dshocsinh;

import com.example.tthoadon.R;

import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBar;
import android.support.v4.app.Fragment;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.RadioGroup;
import android.os.Build;

public class MainActivity extends ActionBarActivity {

private ImageButton imgbtnExit;
private Button btnThem, btnThongKe;
private EditText edtTenHS, edtTongHS,edtHSNam, edtHSNu, edtHSGioi, edtHSKha, edtHSTB;
private RadioGroup rgGioitinh, rgXepLoai;
private DanhSachHocSinh dshs = new DanhSachHocSinh();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

getControl(); //Hàm lấy control của các View trong activty_main.xml
doYourWork(); //Thực thi công việc theo yêu cầu
}


private void getControl() {
// TODO Auto-generated method stub

imgbtnExit = (ImageButton)findViewById(R.id.imgbtnExit);
btnThem = (Button)findViewById(R.id.btnThem);
btnThongKe = (Button)findViewById(R.id.btnThongKe);
edtTongHS = (EditText)findViewById(R.id.edtTongHS);
edtHSNam = (EditText)findViewById(R.id.edtHSNam);
edtHSNu = (EditText)findViewById(R.id.edtHSNu);
edtHSGioi = (EditText)findViewById(R.id.edtHSGioi);
edtHSKha = (EditText)findViewById(R.id.edtHSKha);
edtHSTB = (EditText)findViewById(R.id.edtHSTB);
edtTenHS = (EditText)findViewById(R.id.edtTenHS);
rgGioitinh = (RadioGroup)findViewById(R.id.rgGioiTinh);
rgXepLoai = (RadioGroup)findViewById(R.id.rgXepLoai);
}

private void doYourWork() {
// TODO Auto-generated method stub

btnThem.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//Tạo mới 1 đối tượng hs và gán thuộc tính
HocSinh hs = new HocSinh();
if(rgGioitinh.getCheckedRadioButtonId()==R.id.rgNam){
hs.setGioiTinh(true);
}else{
hs.setGioiTinh(false);
}
if(rgXepLoai.getCheckedRadioButtonId()==R.id.rgTB){
hs.setXepLoai(1);
}else if(rgXepLoai.getCheckedRadioButtonId()==R.id.rgKha){
hs.setXepLoai(2);
}else{
hs.setXepLoai(3);
}
//Thêm đối tượng hs vào trong dshs
dshs.addHocSinh(hs);
edtTenHS.setText("");
}
});

btnThongKe.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
edtTongHS.setText(""+dshs.tongHocSinh());
edtHSGioi.setText(""+dshs.hsGioi());
edtHSKha.setText(""+dshs.hsKha());
edtHSTB.setText(""+dshs.hsTB());
edtHSNam.setText(""+dshs.tongHSNam());
edtHSNu.setText(""+dshs.tongHSNu());
}
});

imgbtnExit.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub

AlertDialog.Builder builder=new AlertDialog.Builder(MainActivity.this);
builder.setTitle("Thoát chứ nhỉ");
builder.setMessage("Có là thoát này ...");
builder.setNegativeButton("Không", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});

builder.setPositiveButton("Có", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
});

builder.create().show();


}
});
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}

/**
* A placeholder fragment containing a simple view.
*/


}

+ HocSinh.java
package com.example.dshocsinh;

public class HocSinh {
private String tenHocSinh;
private boolean gioiTinh;
private int xepLoai;

public String getTenHocSinh() {
return tenHocSinh;
}
public void setTenHocSinh(String tenHocSinh) {
this.tenHocSinh = tenHocSinh;
}
public boolean isGioiTinh() {
return gioiTinh;
}
public void setGioiTinh(boolean gioiTinh) {
this.gioiTinh = gioiTinh;
}
public int getXepLoai() {
return xepLoai;
}
public void setXepLoai(int xepLoai) {
this.xepLoai = xepLoai;
}


public int checkXepLoai(){
return this.getXepLoai();
}
}

+ DanhSachHocSinh.java
package com.example.dshocsinh;

import java.util.ArrayList;

public class DanhSachHocSinh {

private ArrayList listHS = new ArrayList();

public void addHocSinh(HocSinh hs){
listHS.add(hs);
}

public int tongHocSinh(){
return listHS.size();
}

public int tongHSNam(){
int tong = 0;
for (HocSinh hs : listHS) {
if(hs.isGioiTinh()==true){
tong++;
}
}
return tong;
}
public int tongHSNu(){
int tong = 0;
for (HocSinh hs : listHS) {
if(hs.isGioiTinh()==false){
tong++;
}
}
return tong;
}

public int hsTB(){
int tong = 0;
for(HocSinh hs: listHS){
if(hs.getXepLoai()==1){
tong++;
}
}
return tong;
}

public int hsKha(){
int tong = 0;
for(HocSinh hs: listHS){
if(hs.getXepLoai()==2){
tong++;
}
}
return tong;
}

public int hsGioi(){
int tong = 0;
for(HocSinh hs: listHS){
if(hs.getXepLoai()==3){
tong++;
}
}
return tong;
}
}

*** Chú ý:
  •  Các bạn lưu ý cách xây dựng 2 class HocSinh.java và DanhSachHocSinh.java. Điều này rất quan trọng cho sau này khi các bạn muốn xây dựng ứng dụng Android phức tạp hơn.
  • Một mẹo nhỏ để code nhanh khi xây dựng một class tương tự HocSinh.java. Các bạn chỉ cần khai báo các thuộc tính sau: 
    private String tenHocSinh;
    private boolean gioiTinh;
    private int xepLoai;

Sau đó chuột phải vào nền soạn thảo của eclipse, chọn Source, chọn Generate Getters and Setters... Sau đó đánh dấu vào các ô vuông và OK. Trình soạn thảo sẽ tự sinh ra code của các hàm này.
Getter And Setter Android

Qua bài tập này, mình hy vọng các bạn đã nắm vững được việc sử dụng các control cơ bản: TextView, EditText, Checkbox... Mong rằng các bạn sẽ mở rộng và tự mầy mò thêm các bài tập để nắm vững kiến thức, tránh để học trước quên sau nhé :). Nếu các bạn có gì thắc mắc, hãy bình luận ngay tại đây. Hoặc các bạn có thể sử dụng anh Gu Gồ để thỏa mãn https://www.google.com.vn/

Thứ Năm, 2 tháng 10, 2014

Một số bài tập lập trình cho SIE

Bài 1. Tính điểm
Đầu vào: là một file text  (input.txt) chứa tên các thư mục của các bạn nộp bài tập theo tuần
Đầu ra: Số lượng bài tập nộp của từng sinh viên (lấy theo mã sinh viên) và điểm được in ra màn hình và xuất ra file output.txt

VD. File đầu vào: input.txt
DSA_20133_BuiDuyKhanh_20101702
DSA_20133_BuiTranLinh_20125640
DSA_20133_BuiVanKhanhDuy_20115499
DSA_20133_BuiVanQuan_20125730
DSA_20133_DANGTUNGQUAN_20115703
DSA_20133_DangVanToan_20115783
DSA_20133_DaoDieuThanh_20115770
DSA_20133_DinhHuyHung_20125577
DSA_20133_DoThiAnh_20115455
DSA_20133_DoVanTuan_20112412
DSA_20133_DngVnNhn_20136934
DSA_20133_Ha Minh Quyet_20122305
DSA_20133_HoangQuocViet_20112500
DSA_20133_Hoàng Minh Quyn_20125738
DSA_20133_LeHaiNam_20101907
DSA_20133_LuuAnhTai_20102116
DSA_20133_LyVanHieu_20115572
DSA_20133_LÊ MINH TRANG_20115796
DSA_20133_Lê Tun Anh_20104839
DSA_20133_Lê Ðc Anh_20115429
DSA_20133_LêCaoK_20115609
DSA_20133_LêVnHi_20090936
DSA_20133_Lu Trung Hiu _20101512
DSA_20133_LngVnAnh_20115434
DSA_20133_NguyenDaiPhong_20111979
DSA_20133_NguyenDangHoang_20101577
DSA_20133_NguyenDinhGiap_20121601
DSA_20133_NguyenDucDuy_20104833
DSA_20133_NguyenGiaVu_20112479
DSA_20133_NguyenHoangSon_20112073
DSA_20133_NguyenHuyHieu_20102652
DSA_20133_NguyenHuyHoang_20121749
DSA_20133_NGUYENHUYMEN_20136928
DSA_20133_NguyenManhSang_20115724
DSA_20133_NGUYENNGOCHIEU_20115573

File đầu ra output.txt

Tong so bai nop: 111
So bai nop trung binh: 4.05
Diem trung binh: 1.48
=================================
BuiDuyKhanh 20101702 5 2
BuiTranLinh 20125640 5 2


Điểm được tính theo số bài nộp theo công thức sau

5 bài : 2 điểm
4 bài : 1.5 điểm
3 bài: 1 điểm
2 bài 0.5 điểm
<=1 bài: 0 điểm

Download Data
https://drive.google.com/folderview?id=0B5nb3v94xY_WSVBzWnctQW9qeDA&usp=sharing


Bài 2. Xây dựng chương trình hiển thị giờ hiện tại của hệ thống

Yêu cầu: Viết chương trình hiển thị giờ hiện tại của hệ thống dưới dạng số dùng các ký hiệu giống dạng LED điện tử

12:35:00

*   ****         ****    ****        ****    ****
*         *           *    *           *     *   *    *
*   ****         ****    ****       *    *   *    *
*   *                 *          *     *     *   *    *
*   ****         ****    ****        ****    ****

Độ dài của mỗi số có thể thay đổi trong khoảng (5-9)

Bài 3. Xây dựng chương trình đọc số 

Mục đích: đọc số

123 -> mot tram hai muoi ba
12454 -> muoi hai nghin buon tram nam muoi bon
1013.678 -> mot nghin khong tram muoi ba phay sau tram bay tam

Các số này sẽ được nhập từ file hoặc bàn phím, kết quả sẽ được in ra màn hình và file tương ứng

Số được đọc có định dạng: số thực, phần nguyên tối đa 11 chữ số và phần thập phân tối đa 4 chữ số

XX XXX XXX XXX.YYYY

Bài 4. Xây dựng một chương trình quản lý danh ban tương tự chương trình quản lý danh bạ trên điện thoại.
Thông tin contact được lưu vào file (khi hiển thị sẽ được đọc ra từ file)
Các trường của một contact gồm

  • họ tên
  • giới tính
  • sdt
  • địa chỉ
  • email
Chương trình hỗ trợ tìm kiếm đơn giản theo họ tên hoặc địa chỉ

Bài 5. xây dựng tiện ích tìm kiếm các file trên windows 

Đầu vào là một pattern (một từ hoặc một phần tên file), và một thư mục sẽ tìm kiếm
Đầu ra là danh sách các file (kèm đường dẫn) mà có tên file chứa pattern

VD. pattern là ".mp3", và đường dẫn là C:\musics

Thì chương trình sẽ đưa ra tất cả các file có tên chứa ".mp3" trong phần tên của thư mục trên


Bài 6. Xây dựng chương trình tính và hiển thị góc giữa kim giờ và kim phút của đồng hồ.

VD. 9:00 thì kim giờ ở vị trí 9 và kim phút ở vị trí 10 -> góc là 90o
6:00 thì góc là 180o
(chỉ cần tính góc <=180o)

Đầu vào: Một giờ bất kỳ
Đầu ra: Góc giữa hai kim

Bài 7. Xây dựng chương trình tìm kiếm các tên riêng trong văn bản

Đầu vào: một file văn bản chứa một đoạn văn bản bằng tiếng anh lấy trên trang báo nước ngoài
Đầu ra: Danh sách các tên riêng xuất hiện trong văn bản đó và tần số

VD. Văn bản đầu vào là

"Come out of the shadows and get right with the law," urged President Barack Obama in a televised address.
Republicans say the action, without Congress, is beyond his authority and relations will now be poisoned.
There are about 11m illegal immigrants in the US and this year children coming across the border prompted a crisis.
Under the plan, undocumented parents of children who are US citizens or legal residents will be able to apply for work permits lasting three years.
Only parents who have lived in the US for five years will qualify - about 3.7m people are estimated to fit this criteria.

Các tên riêng và tần số xuất hiên tương ứng

President Barack Obama 1
Republicans 1
Congress 1
US 3



Bài 8. Thống kê số lượng câu, từ và độ dài của văn bản
Đầu vào: một file văn bản chứa một đoạn văn bản bằng tiếng anh lấy trên trang báo nước ngoài
Đầu ra: Số lượng câu, số lượng từ, số lượng ký tự, độ dài trung bình của một câu, một từ

Các từ trong tiếng nah được ngăn cách bởi dấu các trống và các dấu câu

Thứ Ba, 9 tháng 9, 2014

Một số card màn hình thế hệ mới - THDC_SIE_20141_TRANTHIPHUONG_20138355 baitaptuan3


Máy tính bảng và giáo dục phổ thông - THDC_SIE_20141_VũMinhTrí_20138474 baitaptuan3


Thực trạng thương mại điện tử ở Việt Nam - THDC_SIE_20141_VuTuanAnh_20138730 Baitaptuan3


Thực trạng thương mại điện tử ở Việt Nam - THDC_SIE_nguyenhoangphong_20138639 baitaptuan3

I. Khó khăn khách quan
1. Thị phần nhỏ bé
Hiện nay chỉ mới được khoảng hơn 2 triệu khách hàng mua hàng qua TMĐT – con số quá bé so với hơn 35 triệu người dùng Internet và dân số 90 triệu người dân Việt Nam.
Nếu xét về doanh số, tại Việt Nam rất khó thống kê chính xác nhưng ước tính đạt khoảng gần $500 triệu trong năm 2012. Đem so với các cường quốc về TMĐT trên thế giới như Mỹ (343 tỷ), Nhật (127 tỷ), Anh (124 tỷ) và Trung Quốc (110 tỷ) thì thị trường TMĐT thật quá nhỏ bé.
Chính vì thị phần bé như vậy, nên khi triển khai mô hình TMĐT cụ thể, việc lựa chọn đối tượng khách hàng khá khó khăn và phải rất thận trọng để đưa ra mô hình phục vụ phù hợp với phân khúc khách hàng mình lựa chọn.
Khi triển khai mô hình TMĐT cụ thể, việc lựa chọn đối tượng khách hàng khá khó khăn và phải rất thận trọng để đưa ra mô hình phục vụ phù hợp.

2. Thói quen mua hàng
Vẫn tâm lý ra cửa hàng tạp hoá đầu ngõ để mua những đồ dùng thiết yếu hay ra các cửa hàng offline để mua sắm các đồ dùng, đồ thời trang và đồ công nghệ.
- Thói quen thích nhìn tận mắt, sờ tận tay
- Thói quen thanh toán bằng tiền mặt

3. Niềm tin
Người tiêu dùng tại Việt Nam vẫn chưa đặt niềm tin vào mua sắm trực tuyến, họ vẫn có cái nhìn thiếu thiện cảm với các hình thức kinh doanh trên mạng. Thực tế, có rất nhiều khách hàng phản ánh rằng sản phẩm họ nhận được khác xa với những gì họ nhìn thấy trên website, do vậy niềm tin vào TMĐT cũng bị lung lay.
Nguyên nhân của thực trạng này là do TMĐT đang bị lạm dụng, bóp méo bởi sự làm ăn thiếu chuyên nghiệp của các đơn vị cung cấp sản phẩm. Điển hình như vụ việc MB24 đã lợi dụng danh nghĩa TMĐT để phục vụ lợi ích riêng cho mình khiến cho khách hàng hiểu sai về TMĐT.
Một số khác thì dùng kênh TMĐT để phân phối hàng giả, hàng nhái kém chất lượng nhằm qua mắt người tiêu dùng – một cách làm ăn rất chụp giựt.

4. Hạ tầng thanh toán
- Thanh toán qua thẻ còn ít
- Các bước thanh toán qua internet banking rắc rối và không nhất quán giữa các ngân hàng
- Thẻ chủ yếu dùng để nhận lương và rút tiền tại ATM
- Chi phí giao dịch cao
- Hình thức thanh toán chưa đa dạng
- Cơ chế hoàn tiền còn chậm và chưa rõ ràng
- Hành lang pháp lý còn lỏng lẻo

5. Dịch vụ giao nhận
- Chưa có đơn vị thứ 3 thực sự chuyên nghiệp để đảm bảo tốt dịch vụ giao nhận mà không ảnh hưởng đến chất lượng phục vụ, hầu hết các đơn vị làm TMĐT đều phải tự xây dựng đội ngũ giao nhận để nắm quyền chủ động trong việc kiểm soát và điều phối hiệu quả cũng như chất lượng phục vụ khách hàng.
- Do đặc thù địa lý Việt Nam trải dài, mặt khác volume thị trường còn bé đồng thời việc tự tổ chức đội ngũ giao nhận khiến cho chi phí giao nhận rất cao, chiếm từ 10-15% giá trị của 1 giao dịch.

6. Vốn đầu tư
Đầu tư vào TMĐT là dài hạn và đốt tiền, thậm chí đốt rất nhiều tiền. Chi phí cho nhân sự, marketing, stock hàng là những chi phí rất lớn. Nếu không có khoản đầu tư lớn thì chỉ đi được nửa đường là chết, khi mà lợi nhuận chưa thể bù đắp cho khoản tiền đầu tư để educate thị trường, để làm brand và hoàn thiện quy trình.
Do vậy bạn nào đang hi vọng làm TMĐT sẽ thu lời được ngay thì tốt nhất đừng dấn thân vào TMĐT làm gì. Theo nguồn tin cá nhân thì tất cả các đơn vị đang đầu tư cho TMĐT tại Việt Nam thì chưa có đơn vị nào có lãi (trừ một số dự án vertical e-commerce), mà ngược lại số tiền đầu tư đã lên đến hàng triệu đô.

II. Khó khăn chủ quan
Xét một cách toàn diện thì các đơn vị làm TMĐT vẫn đang ở tâm lý vừa làm vừa thăm dò thị trường và tìm cách phản ứng để phù hợp với tâm lý người tiêu dùng. Do vậy việc triển khai khó có thể diễn ra bài bản ngày từ đầu và xuyên suốt trong quá trình hoạt động.
Mặt khác, rất nhiều đơn vị làm TMĐT vẫn chưa hiểu rõ thấu đáo sự khác biệt của TMĐT với bán hàng offline truyền thống, vẫn bê nguyên tư duy vận hành offline lên online, dẫn đến sự phản ứng chậm chạp, thiếu chuyên nghiệp và không phát huy hết lợi thế của online, chưa đánh trúng tâm lý của người tiêu dùng online.
Người tiêu dùng online có những hành vi và tâm lý mua hàng khác với người tiêu dùng offline. Người làm TMĐT cần hiểu rõ tâm lý đối tượng khách hàng của mình để có thể đưa ra những phương thức phục vụ phù hợp.


III. Kết luận
Để triển khai TMĐT thành công, bạn phải hiểu rất rõ về những gì bạn đang có và hiểu rõ về ngành hàng cũng như phân khúc khách hàng bạn đang nhắm tới, nhằm phát triển và chiếm tối đa thị phần trong mảng mình kinh doanh.
Chất lượng dịch vụ và kiểm soát tồn kho, thất thoát là hai khó khăn lớn nhất trong việc triển khai TMĐT nhưng nó lại là yếu tố sống còn để quyết định mô hình TMĐT của bạn có thành công hay không.


Ví dụ khó khan trong một số mô hình TMĐT
a. Mô hình sàn giao dịch
- Người dùng thường tìm đến các website có nhiều tin để đọc, và ngược lại người bán cũng tìm đến website có nhiều người đọc để đăng tin rao. Do đó, khi thiết lập mới một sàn giao dịch TMĐT, cần phải có được ngay lượng thông tin phong phú để thu hút người đọc, đặc biệt việc làm SEO sẽ giúp cho website có được nguồn traffic tự nhiên cực lớn
- Giao dịch trên các sàn giao dịch hầu như không có, mà đó chỉ là nơi người bán và người mua gặp nhau, sau đó tự liên lạc và thoả thuận hình thức bán hàng và thanh toán. Vì thế độ tin cậy sẽ không cao.
- Bài toán kiếm tiền từ mô hình này khá đơn giản, khiến cho việc muốn tăng mạnh doanh số rất khó khăn. Các mô hình tiêu biểu bao gồm: bán banner quảng cáo, bán tin VIP, bán lượt hiển thị các trang đầu

b. Mô hình website bán lẻ
- Khó khăn lớn nhất của mô hình này là kiểm soát hàng tồn kho. Để hàng tồn kho quá lâu và không có sự kiểm soát chặt chẽ và thường xuyên thì tất cả những khoản lãi thu được đều không đủ để bù lỗ cho chi phí hàng tồn kho
- Khó khăn thứ 2 là tạo được sự tin cậy và minh bạch về thông tin hàng hoá, giá cả, để cho tỷ lệ chuyển đổi (CR) phải luôn ở mức cao nhất nhằm tiết kiệm chi phí marketing, nâng cao hiệu quả bán hàng. Theo kinh nghiệm của tôi thì các website TMĐT phải đảm bảo tỷ lệ chuyển đổi ở mức tối thiểu 1% (CR=1%), có nghĩa là 100 người truy cập vào website của bạn thì ít nhất phải có 1 người mua hàng. Nhưng thực tế rất ít đơn vị đầu tư cho việc tracking hiệu quả và liên tục cải tiến để tăng CR.
- Khó khăn thứ 3 là đảm bảo chất lượng dịch vụ logistic từ khâu giao hàng, hỗ trợ sau bán, bảo hành, đổi trả hàng hoá đều phải chính xác, thân thiện và nhanh chóng. Mỗi nhân viên giao hàng, nhân viên CSKH đều phải là đại sứ bán hàng của công ty.
- Khó khăn thứ 4 là về margin, nếu bạn bán được nhiều thì các nhà phân phối mới chiết khấu cao cho bạn, nếu không thì % chiết khấu sẽ thấp và khó cạnh tranh về giá với đối thủ và thị trường offline. Ngược lại, nếu bạn để giá cao thì khó bán hàng, dẫn đến sản lượng thấp. Do vậy bạn cần cân đối thật chắc chắn về chính sách giá cũng như doanh số bán hàng.
- Khó khăn thứ 5 là cá lớn nuốt cá bé. Các ông lớn sẵn sàng vung tiền để phủ thị trường, để đạt quy mô và được giá tốt, lúc này việc cạnh tranh giữa các đơn vị quy mô nhỏ sẽ khó khăn hơn rất nhiều.


c. Mô hình website khuyến mãi, giảm giá
Ở mô hình này thì ngoài khó khăn như mô hình website bán lẻ, nó còn có khó khăn rất lớn đó là làm việc và thuyết phục nhà cung cấp đồng ý giảm giá ở mức đủ để hấp dẫn khách hàng mà nhà cung cấp không được lỗ hoặc chỉ lỗ ít để mang lại nguồn thu cũng như khách hàng mới cho họ.
Khách hàng của mô hình này thông thường kém trung thành, nên việc giữ chân khách hàng là điều rất khó. Do vậy cần có những quyết định trong chiến lược để khai thác lợi nhuận ngắn hạn từ những khách hàng có được, tránh việc đầu tư dài hạn để lấy user với hi vọng sau đó sẽ khai thác từ tập khách hàng đó.

d. Mô hình website đấu giá trực tuyến
Rõ ràng rằng tại Việt Nam, mô hình này đang gặp rào cản rất lớn đó là thiếu niềm tin. Tôi không tin là tôi đấu giá có thể trúng với giá rẻ, tôi không tin các nhà cung cấp sẵn sàng cho đi sản phẩm của mình chỉ nhằm mục đích quảng bá… có hàng vạn lý do để người tham gia không tin vào hình thức này.
Để làm mô hình này thành công, trước hết website đấu giá phải đảm bảo mọi yếu tố đều minh bạch và show được nó cho khách hàng thấy để họ khỏi nghi ngờ chân gỗ hay sự thiếu trung thực.

e. Mô hình localize e-commerce và dịch vụ
- Về localize e-commerce, sự mở rộng thị trường rất khó khăn và chậm do yếu tố địa phương hoá. Mặt khác, yếu tố chất lượng dịch vụ được đặt lên hàng đầu. Do vậy áp lực về chất lượng dịch vụ rất lớn, đòi hỏi người làm mô hình này phải kiểm soát tốt, song song với đó là chi phí đầu tư cho dịch vụ phải cao thì mới đảm bảo được chất lượng theo yêu cầu. Ví dụ về mô hình gọi món online, nếu sau 30-45 phút mà không giao được đồ ăn cho khách thì khách sẵn sàng huỷ order ngay lập tức.

- Về các website dịch vụ như đặt bàn, đặt chỗ, đặt phòng khách sạn,… thì khó kiểm soát được chất lượng của nhà cung cấp. Bởi lẽ mô hình này chỉ là yếu tố trung gian kết nối khách hàng với merchant. Nếu merchant không làm hài lòng khách hàng thì sẽ khó chiêu dụ khách hàng quay lại sử dụng tiếp dịch vụ của website. Do vậy cần kết hợp với các merchant để cùng kiểm soát chất lượng dịch vụ của merchant.

Thứ Ba, 2 tháng 9, 2014

Hệ thống nhúng THDC_SIE_20141_LeMinhNguyen_20138317

Bài tập tuần 2: Tìm hiểu về hệ thống nhúng

Hệ thống nhúng (Embedded system) là một thuật ngữ để chỉ một hệ thống có khả năng tự trị được nhúng vào trong một môi trường hay một hệ thống mẹ. Đó là các hệ thống tích hợp cả phần cứng và phần phềm phục vụ các bài toán chuyên dụng trong nhiều lĩnh vực công nghiệp, tự động hoá điều khiển, quan trắc và truyền tin. Đặc điểm của các hệ thống nhúng là hoạt động ổn định và có tính năng tự động hoá cao.

Nói một cách đơn giản khi một hệ tính toán (có thể là PC, IPC, PLC, vi xử lý, vi hệ thống, DSP vv…) được nhúng vào trong một sản phẩm hay một hệ thống một cách hữu cơ và thực hiện một số chức năng cụ thể của hệ thống thì ta gọi đó là một hệ thống nhúng. Ví dụ quanh ta có rất nhiều sản phẩm nhúng như lò vi sóng, nồi cơm điện, điều hoà, điện thoại di động, ô tô, máy bay, tàu thuỷ, các đầu đo cơ cấu chấp hành thông minh vv. Ta có thể thấy hiện nay hệ thống nhúng có mặt ở mọi lúc mọi nơi trong cuộc sống của chúng ta.            Các nhà thống kê trên thế giới đã thống kê được rằng số chip vi xử lý ở trong các máy PC và các server, các mạng LAN, WAN, Internet chỉ chiếm không đầy 1% tổng số chip vi xử lý có trên thế giới. Hơn 99% số vi xử lý còn lại nằm trong các hệ thống nhúng.Như vậy công nghệ thông tin không chỉ đơn thuần là PC, mạng LAN, WAN và Internet như nhiều người thường nghĩ. Đó chỉ là bề nổi của một tảng băng chìm. Phần chìm của công nghệ thông tin chính là các ứng dụng của các hệ nhúng có mặt trong mọi ngành nghề của đời sống xã hội hiện nay.            Các hệ nhúng được tích hợp trong các thiết bị đo lường điều khiển và các sản phẩm cơ điện tử tạo nên đầu não và linh hồn của sản phẩm.Trong các hệ nhúng, hệ thống điều khiển nhúng đóng một vai trò hết sức quan trọng.            Hệ điều khiển nhúng là hệ thống mà máy tính được nhúng vào vòng điều khiển của sản phẩm nhằm điều khiển một đối tượng, điều khiển một qúa trình công nghệ đáp ứng các yêu cầu đặt ra. Hệ thống điều khiển nhúng lấy thông tin từ các cảm biến, xử lý tính toán các thuật điều khiển và phát tín hiệu điều khiển cho các cơ cấu chấp hành.            Khác với các hệ thống điều khiển cổ điển theo nguyên lý thuỷ lực, khí nén, rơ le, mạch tương tự, hệ điều khiển nhúng là hệ thống điều khiển số được hình thành từ những năm 1960 đến nay. Trước đây các hệ điều khiển số thường do các máy tính lớn đảm nhiệm, ngày nay chức năng điều khiển số này do các chip vi xử lý, các hệ nhúng đã thay thế. Phần mềm điều khiển ngày càng tinh sảo tạo nên độ thông minh của thiết bị và ngày càng chiếm tỷ trọng lớn trong giá thành của thiết bị.            Như vậy không phải tất cả các sản phẩm đo lường và điều khiển đều là các hệ nhúng. Hiện nay chúng ta còn gặp nhiều hệ thống điều khiển tự động hoạt động theo nguyên tắc cơ khí, thuỷ lực, khí nén, rơ le, hoặc diện tử tương tự…            Ngược lại phần lớn các sản phẩm cơ điện tử hiện nay đều có nhúng trong nó các chip vi xử lý hoặc một mạng nhúng. Ta biết rằng cơ điện tử là sự cộng năng của các công nghệ cơ khí, điện tử, điều khiển và công nghệ thông tin. Sự phối hợp đa ngành này tạo nên sự vượt trội của các sản phẩm cơ điện tử.         Sản phẩm cơ điện tử ngày càng tinh sảo và ngày càng thông minh mà phần hồn của nó do các phần mềm nhúng trong nó tạo nên. Các sản phẩm cơ điện tử là các sản phẩm có ít nhất một quá trình cơ khí (thường là một quá trình chuyển động), là đối tượng để điều khiển do vậy các sản phẩm cơ điện tử ngày nay thường có các hệ nhúng trong nó nhưng ngược lại không phải hệ thống nhúng nào cũng là một hệ cơ điện tử.


Các đặc điểm của hệ thống nhúng
Hệ thống nhúng thường có một số đặc điểm chung như sau:
• Các hệ thống nhúng được thiết kế để thực hiện một số nhiệm vụ chuyên dụng chứ không phải đóng vai trò là các hệ thống máy tính đa chức năng. Một số hệ thống đòi hỏi ràng buộc về tính hoạt động thời gian thực để đảm bảo độ an toàn và tính ứng dụng; một số hệ thống không đòi hỏi hoặc ràng buộc chặt chẽ, cho phép đơn giản hóa hệ thống phần cứng để giảm thiểu chi phí sản xuất.
• Một hệ thống nhúng thường không phải là một khối riêng biệt mà là một hệ thống phức tạp nằm trong thiết bị mà nó điều khiển.
• Phần mềm được viết cho các hệ thống nhúng được gọi là firmware và được lưu trữ trong các chip bộ nhớ ROM hoặc bộ nhớ flash chứ không phải là trong một ổ đĩa. Phần mềm thường chạy với số tài nguyên phần cứng hạn chế: không có bàn phím, màn hình hoặc có nhưng với kích thước nhỏ, dung lượng bộ nhớ thấp Sau đây, ta sẽ đi sâu, xem xét cụ thể đặc điểm của các thành phần của hệ thống nhúng.

- Giao diện
Các hệ thống nhúng có thể không có giao diện (đối với những hệ thống đơn nhiệm) hoặc có đầy đủ giao diện giao tiếp với người dùng tương tự như các hệ điều hành trong các thiết bị để bàn. Đối với các hệ thống đơn giản, thiết bị nhúng sử dụng nút bấm, đèn LED và hiển thị chữ cỡ nhỏ hoặc chỉ hiển thị số, thường đi kèm với một hệ thống menu đơn giản.
Còn trong một hệ thống phức tạp hơn, một màn hình đồ họa, cảm ứng hoặc có các nút bấm ở lề màn hình cho phép thực hiện các thao tác phức tạp mà tối thiểu hóa được khoảng không gian cần sử dụng; ý nghĩa của các nút bấm có thể thay đổi theo màn hình và các lựa chọn. Các hệ thống nhúng thường có một màn hình với một nút bấm dạng cần điểu khiển (joystick button). Sự phát triển mạnh mẽ của mạng toàn cầu đã mang đến cho những nhà thiết kế hệ nhúng một lựa chọn mới là sử dụng một giao diện web thông qua việc kết nối mạng. Điều này có thể giúp tránh được chi phí cho những màn hình phức tạp nhưng đồng thời vẫn cung cấp khả năng hiển thị và nhập liệu phức tạp khi cần đến, thông qua một máy tính khác. Điều này là hết sức hữu dụng đối với các thiết bị điều khiển từ xa, cài đặt vĩnh viễn. Ví dụ, các router là các thiết bị đã ứng dụng tiện ích này.

- Kiến trúc CPU
Các bộ xử lý trong hệ thống nhúng có thể được chia thành hai loại: vi xử lý và vi điều khiển. Các vi điều khiển thường có các thiết bị ngoại vi được tích hợp trên chip nhằm giảm kích thước của hệ thống. Có rất nhiều loại kiến trúc CPU được sử dụng trong thiết kế hệ nhúng như ARM, MIPS, Coldfire/68k, PowerPC, x86, PIC, 8051, Atmel AVR, Renesas H8, SH, V850, FR-V, M32R, Z80, Z8 … Điều này trái ngược với các loại máy tính để bàn, thường bị hạn chế với một vài kiến trúc máy tính nhất định. Các hệ thống nhúng có kích thước nhỏ và được thiết kế để hoạt động trong môi trường công nghiệp thường lựa chọn PC/104 và PC/104++ làm nền tảng. Những hệ thống này thường sử dụng DOS, Linux, NetBSD hoặc các hệ điều hành nhúng thời gian thực như QNX hay VxWorks. Còn các hệ thống nhúng có kích thước rất lớn thường sử dụng một cấu hình thông dụng là hệ thống on chip (System on a chip – SoC), một bảng mạch tích hợp cho một ứng dụng cụ thể (an application-specific integrated circuit – ASIC). Sau đó nhân CPU được mua và thêm vào như một phần của thiết kế chip. Một chiến lược tương tự là sử dụng FPGA (field-programmable gate array) và lập trình cho nó với những thành phần nguyên lý thiết kế bao gồm cả CPU.

-Thiết bị ngoại vi
Hệ thống nhúng giao tiếp với bên ngoài thông qua các thiết bị ngoại vi, ví dụ như:
• Serial Communication Interfaces (SCI): RS-232, RS-422, RS-485...
• Synchronous Serial Communication Interface: I2C, JTAG, SPI, SSC và ESSI
• Universal Serial Bus (USB)
• Networks: Controller Area Network, LonWorks...
• Bộ định thời: PLL(s), Capture/Compare và Time Processing Units
• Discrete IO: General Purpose Input/Output (GPIO)

-Công cụ phát triển
Tương tự như các sản phẩm phần mềm khác, phần mềm hệ thống nhúng cũng được phát triển nhờ việc sử dụng các trình biên dịch (compilers), chương trình dịch hợp ngữ (assembler) hoặc các công cụ gỡ rối (debuggers). Tuy nhiên, các nhà thiết kế hệ thống nhúng có thể sử dụng một số công cụ chuyên dụng như:
• Bộ gỡ rối mạch hoặc các chương trình mô phỏng (emulator)
• Tiện ích để thêm các giá trị checksum hoặc CRC vào chương trình, giúp hệ thống nhúng có thể kiểm tra tính hợp lệ của chương trình đó.
• Đối với các hệ thống xử lý tín hiệu số, người phát triển hệ thống có thể sử dụng phần mềm workbench như MathCad hoặc Mathematica để mô phỏng các phép toán.
• Các trình biên dịch và trình liên kết (linker) chuyên dụng được sử dụng để tối ưu hóa một thiết bị phần cứng.
• Một hệ thống nhúng có thể có ngôn ngữ lập trình và công cụ thiết kế riêng của nó hoặc sử dụng và cải tiến từ một ngôn ngữ đã có sẵn.
Các công cụ phần mềm có thể được tạo ra bởi các công ty phần mềm chuyên dụng về hệ thống nhúng hoặc chuyển đổi từ các công cụ phát triển phần mềm GNU. Đôi khi, các công cụ phát triển dành cho máy tính cá nhân cũng được sử dụng nếu bộ xử lý của hệ thống nhúng đó gần giống với bộ xử lý của một máy PC thông dụng.

-Độ tin cậy
Các hệ thống nhúng thường nằm trong các cỗ máy được kỳ vọng là sẽ chạy hàng năm trời liên tục mà không bị lỗi hoặc có thể khôi phục hệ thống khi gặp lỗi. Vì thế, các phần mềm hệ thống nhúng được phát triển và kiểm thử một cách cẩn thận hơn là phần mềm cho máy tính cá nhân. Ngoài ra, các thiết bị rời không đáng tin cậy như ổ đĩa, công tắc hoặc nút bấm thường bị hạn chế sử dụng. Việc khôi phục hệ thống khi gặp lỗi có thể được thực hiện bằng cách sử dụng các kỹ thuật như watchdog timer – nếu phần mềm không đều đặn nhận được các tín hiệu watchdog định kì thì hệ thống sẽ bị khởi động lại.
Một số vấn đề cụ thể về độ tin cậy như:
• Hệ thống không thể ngừng để sửa chữa một cách an toàn, ví dụ như ở các hệ thống không gian, hệ thống dây cáp dưới đáy biển, các đèn hiệu dẫn đường,… Giải pháp đưa ra là chuyển sang sử dụng các hệ thống con dự trữ hoặc các phần mềm cung cấp một phần chức năng.
• Hệ thống phải được chạy liên tục vì tính an toàn, ví dụ như các thiết bị dẫn đường máy bay, thiết bị kiểm soát độ an toàn trong các nhà máy hóa chất,… Giải pháp đưa ra là lựa chọn backup hệ thống.
• Nếu hệ thống ngừng hoạt động sẽ gây tổn thất rất nhiều tiền của ví dụ như các dịch vụ buôn bán tự động, hệ thống chuyển tiền, hệ thống kiểm soát trong các nhà máy …

-  Một số ví dụ điển hình về hệ thống nhúng
o   Các hệ thống dẫn đường trong không lưu, hệ thống định vị toàn cầu, vệ tinh.
o   Các thiết bị gia dụng: tủ lạnh, lò vi sóng, lò nướng,…
o   Các thiết bị kết nối mạng: router, hub, gateway,…
o   Các thiết bị văn phòng: máy photocopy, máy fax, máy in, máy scan,…
o   Các thiết bị y tế: máy thẩm thấu, máy điều hòa nhịp tim,…
o   Các máy trả lời tự động 
o   Dây chuyền sản xuất tự động trong công nghiệp, robots.
Các hệ thống nhúng tạo cơ sở cho kỷ nguyên hậu PC (post-PC era), các hệ thống xử lý thông tin chuyển dần từ PC sang hệ thống nhúng cho các ứng dụng cụ thể.


NOTE: Đặt tên các thư mục con cho các tuần sai!

So sánh lập trình trên PC và lập trình trên di động - THDC_SIE_20141_LêĐắcToàn_20138452 baitaptuan2

Lập trình trên thiết bị di dộng:        
1,Giới thiệu:

Trong guồng quay hối hả của cuộc sống hiện nay, thiết bị di động với ưu thế nhỏ gọn nhưng tích hợp cả một thế giới văn phòng và giải trí mini đã nghiễm nhiên trở thành người bạn đồng hành thân thiết của hầu hết mọi người, đặc biệt là giới trẻ năng động. Với sự tăng trưởng mạnh mẽ của thị trường này, không chỉ các hãng sản xuất di động mà cả các nhà phân phối và những doanh nghiệp công nghệ khác cũng chen chân vào cuộc đua phát triển ứng dụng mobile để khai thác hết các tính năng của thiết bị di động đỉnh cao như: iPhone, iPad, Samsung Galaxy, Nokia Lumia, Blackberry, HTC, … Việt Nam cũng không nằm ngoài xu hướng này. Điều đó đặt ra một yêu cầu là phải có đội ngũ nhân sự lập trình giỏi để cho ra đời các tiện ích độc đáo và thiết thực, đáp ứng đòi hỏi ngày càng cao của người dung.
2,Khái niệm:
Trước hết thế nào là lập trình và lập trình là gì thì có thể hiểu đơn giàn là thiết bị máy móc (Devices) không tự biết phải làm gì đề phục vụ một nhu cầu nào đó của con người. Nó chỉ có thể làm những gì được định sẵn với khả năng thực hiện nhanh và chính xác hơn con người (Keeper sẽ nói về AI - Artificial Intelligence sau, AI = Trí tuệ nhân tạo; khái niệm giúp máy móc thiết bị tự quyết định và tự đưa ra giải pháp tùy tình huống mà không cần con người vạch sẵn) vậy nên chúng ta phải lập trình cho máy tính.
3,Cơ bản khi lập trình cho thiết bị di động:
Vì vậy nếu muốn thiết bị cho ra kết quả của phép nhân từ 2 con số thì người lập trình phải viết 1 đoạn code cung cấp cho thiét bị 2 variables(biến số) represents (đại diện) cho 2 con số muốn tính toán(Calculate) và cách thức (Method) để cho ra kết quả phép nhân. Thiết bị khi đó không cần biết 2 con số là gì mà nó chỉ biết khi người sử dụng nhập 2 con số và click Enter thì nó chỉ việc lấy 2 số này và áp dụng công thức đã được lập trình viên định sẵn và trả về kết quả. Như vậy nếu chỉ có công thức nhân mà không có công thức cộng trừ hay chia thì nó chỉ có thể cho ra kết quả nhân. Do đó muốn nó cho ra kết quả cộng trừ hay chia thì người lập trình buộc phải cung cấp thêm cho nó công thức công trừ hay chia.

Lập trình cho các thiết bị di động như Mobile Phones, Portable Devices, Mobility Devices...Được gọi là lập trình di động.

Tùy thuộc vào khả năng, tính chất của từng loại mobile devices mà có những cách lập trình, ngôn ngữ, môi trường khác nhau. Hiện tại phổ biến nhất vẫn là Java MIDP/CLDC technology.
Ngôn ngữ để sử dụng lập trình cho những thiết bị di động hỗ trợ MIDP/CLDC được gọi là Java J2ME(Java 2 Micro Edition) và nó khác với J2SE , J2EE ... ở chỗ nó chỉ có những API và cơ chế tương thích với MIDP/CLDC và vì thế mới chạy được trên thiét bị hỗ trợ MIDP/CLDC.

Bên cạnh đó còn có Android SDK (Java Dalvik), iPhone SDK (iPhone OS) là những Software Development Kit dùng đề phát triển phần mềm cho các thiết bị chạy hệ điều hành Android hay iPhone OS.

Với loại này thì syntax, API, library và môi trường hoàn toàn khác với J2ME, và muốn lập trình cho Android hay iPhone OS... thì bắt buộc phải xem tài liệu về nó chứ không thể đem source code của J2ME rồi bắt chạy trên Android hay iPhone và ngược lại.

Mỗi chủng loại có những tools và material khác nhau nhưng programming concept thì không khác nhau. Tất cả đều vẫn phải sử dụng những thuật toán(Algorithm) như 

if satisfy this condition, do something, else, do something else

Các vòng loop như:

while this condition is still true, keep doing something until this condition is false

Programming concept thì như nhau nhưng khác nhau về câu lệnh(syntax) và library vì mỗi chủng loại khác nhau sẽ có những loại tài nguyên khác nhau giống như Window và Mac có giao diện khác nhau vì nó có library khác nhau do đó không thể sử dụng Window library mà cho ra giao diện của Mac 

          
Lập trình trên PC
1,Khái niệm:
Một lập trình viên viết mã nguồn bằng một ngôn ngữ lập trình cụ thể.
Các ngôn ngữ lập trình khác nhau hỗ trợ các phong cách lập trình khác nhau (còn gọi là các phương pháp lập trình). Một phần của công việc lập trình là việc lựa chọn một trong những ngôn ngữ phù hợp nhất với bài toán cần giải quyết. Các ngôn ngữ lập trình khác nhau đòi hỏi lập trình viên phải xử lý các chi tiết ở các mức độ khác nhau khi cài đặt các thuật toán. Thông thường, điều này dẫn tới thỏa hiệp giữa thuận lợi cho việc lập trình và hiệu quả của chương trình (thỏa hiệp giữa "thời gian lập trình" và "và thời gian tính toán").
Ngôn ngữ lập trình duy nhất mà máy tính có thể thực thi trực tiếp là ngôn ngữ máy (còn gọi là "mã máy"). Thời kỳ đầu, tất cả các lập trình viên viết chương trình toàn bằng mã máy, nhưng hầu như không ai làm việc này nữa. Thay vào đó, các lập trình viên viết mã nguồn, và một máy tính (chạy một trình biên dịch, một trình thông dịch hoặc đôi khiassembler) dịch nó qua một hoặc vài bước để bổ sung đầy đủ các chi tiết, trước khi bản mã máy cuối cùng được thực thi trên máy tính đích. Thậm chí khi cần điều khiển mức thấp của máy tính đích, các lập trình viên viết bằng hợp ngữ. Các lệnh của ngôn ngữ này có tính gợi nghĩa và tương ứng một-một với các lệnh trong ngôn ngữ máy.
Một số ngôn ngữ, thay vì được dịch ra mã máy, lại được dịch ra dạng nhị phân p-code (hoặc byte-code). Có các trình thông dịch tương ứng để thực thi dạng nhị phân này. Bytecode được sử dụng trong ngôn ngữ lập trình Java của Sun Microsystems cũng như họ ngôn ngữ lập trình .NET gần đây của Microsoft  Visual Basic trước phiên bản.NET


Sự khác nhau: cơ bản đó là lập trình trên thiết bị di động ngày nay đang la xu thế và được ưa chuộng hơn nhờ tính năng cơ động của nó,đem lại sự tiện lợi cho người sử dụng,đồng thời dung lượng cũng như bộ nhớ của các thiết bị di động nhỏ hơn nên khi lập trình cần tối thiểu input và tối đa output.Tuy nhiên lập trình trên pc vẫn là 1 chương trình gốc,nền tảng cho các lập trình trên di động sau này.

Bảng mã unicode - THDC_SIE_20141_DoVuHiep_20138151 baitaptuan2


Máy tính nhúng,máy tính gắn trên đồ dùng - THDC_SIE_20141_DaoHoangGiang_20138624 bai tap tuan 2

Máy tính nhúng  là một thuật ngữ để chỉ một máy tính có khả năng tự trị được nhúng vào trong một môi trường hay một hệ thống mẹ. Đó là các hệ thống tích hợp cả phần cứng và phần mềm phục vụ các bài toán chuyên dụng trong nhiều lĩnh vực công nghiệp, tự động hoá điều khiển, quan trắc và truyền tin. Đặc điểm của các máy tính nhúng là hoạt động ổn định và có tính năng tự động hoá cao

Đặc điểm:
 
    -  Các hệ thống nhúng được thiết kế để thực hiện một số nhiệm vụ chuyên dụng chứ không phải đóng vai trò là các hệ thống máy tính đa chức năng. Một số hệ thống đòi hỏi ràng buộc về tính hoạt động thời gian thực để đảm bảo độ an toàn và tính ứng dụng; một số hệ thống không đòi hỏi hoặc ràng buộc chặt chẽ, cho phép đơn giản hóa hệ thống phần cứng để giảm thiểu chi phí sản xuất.
    -Một hệ thống nhúng thường không phải là một khối riêng biệt mà là một hệ thống phức tạp nằm trong thiết bị mà nó điều khiển.
   - phần cứng hạn chế: không có bàn phím, màn hình hoặc có nhưng với kích thước nhỏ, dung lượng bộ nhớ thấp Sau đây, ta sẽ đi sâu, xem xét cụ thể đặc điểm của các thành phần của hệ thống nhúng.
   -Có thể không có giao diện(đối với máy đơn giản) hay đẩy đủ giao diện tương tác với người dùng như trong hệ điều hành của máy đa năng

  -Kiến trúc CPU: Các bộ xử lý trong hệ thống nhúng có thể được chia thành hai loại: vi xử lý và vi điều khiển. Các vi điều khiển thường có các thiết bị ngoại vi được tích hợp trên chip nhằm giảm kích thước của hệ thống. Có rất nhiều loại kiến trúc CPU được sử dụng trong thiết kế hệ nhúng như ARM, MIPS, Coldfire/68k, PowerPC, x86, PIC, 8051, Atmel AVR, Renesas H8, SH, V850, FR-V, M32R, Z80, Z8 … Điều này trái ngược với các loại máy tính để bàn, thường bị hạn chế với một vài kiến trúc máy tính nhất định. Các hệ thống nhúng có kích thước nhỏ và được thiết kế để hoạt động trong môi trường công nghiệp thường lựa chọn PC/104 và PC/104++ làm nền tảng. Những hệ thống này thường sử dụng DOS, Linux, NetBSD hoặc các hệ điều hành nhúng thời gian thực như QNX hay VxWorks.
-Các hệ thống nhúng thường nằm trong các cỗ máy được kỳ vọng là sẽ chạy hàng năm trời liên tục mà không bị lỗi hoặc có thể khôi phục hệ thống khi gặp lỗi. Vì thế, các phần mềm hệ thống nhúng được phát triển và kiểm thử một cách cẩn thận hơn là phần mềm cho máy tính cá nhân. Ngoài ra, các thiết bị rời không đáng tin cậy như ổ đĩa, công tắc hoặc nút bấm thường bị hạn chế sử dụng. Việc khôi phục hệ thống khi gặp lỗi có thể được thực hiện bằng cách sử dụng các kỹ thuật như watchdog timer – nếu phần mềm không đều đặn nhận được các tín hiệu watchdog định kì thì hệ thống sẽ bị khởi động lại.


 Ứng dụng

Đèn giao thông                          đồng hồ                                                   Máy rút tiền

Nén dữ liệu là gì ? THDC_SIE_20141_DangVuDuc_20138674 baitaptuan2

1.     Nén dữ liệu là gì?
 Nén(compression) là phương pháp mã hoá dữ liệu số nhằm làm giảm dung lượng và giảm đòi hỏi băng thông để truyền đi.  Thực chất của việc này chính là sử dụng một thuật toán giúp loại bỏ những phần tử được cho là không có ích trên một nội dung đa phương tiện để làm cho nó nhỏ hơn. Có hai phương pháp nén căn bản: nén có thất thoát (lossy), trong đó một số dữ liệu sẽ bị mất khi các tập tin được giải nén; nén bảo toàn (lossless), không làm mất dữ liệu khi tập tin được phục hồi định dạng gốc.

* Nén mất dữ liệu (lossy compression): Hay gặp nhất trong công nghệ thông tin là nén hình ảnh và âm thanh. Có nhiều giải thuật được đặt ra để đáp ứng yêu cầu giảm thiểu kích thước của file ảnh sao cho vẫn duy trì được chất lượng ở mức độ chấp nhận được. Những giải thuật này đều dựa trên nền tảng là loại bớt những màu mà mắt người không hoặc khó cảm nhận được, chỉ giữ lại những màu chủ yếu thực sự ảnh hưởng tích cực lên khả năng cảm nhận màu của mắt. Nếu đã từng biên tập hình ảnh bằng Photoshop, bạn sẽ dễ dàng nhận thấy sự khác biệt khá lớn giữa bảng màu chuẩn và bảng màu dùng cho hình ảnh tải lên web, tức là hình nén đấy. Trong bảng màu web, các màu trung gian, chuyển tiếp đã bị lược bỏ mất, thay vào đó là các màu tương đương cận kề. Tuy 2 bảng màu này dễ phân biệt như vậy nhưng khi xem một hình ảnh bạn không dễ dàng nhận biết được đó là file .bmp (chưa nén), .gif hay .jpg (ảnh nén). Còn một cách nữa cũng sử dụng kiểu mất dữ liệu để nén hình là giảm độ phân giải, tức là bớt số điểm ảnh trên một inch (dots per inch - dpi). Cách này khi được sử dụng, tùy trường hợp mà phải gia giảm cho phù hợp. Độ phân giải cao quá thì phí chỗ, nhưng giảm đi nhiều quá thì bị “vỡ hình”.

Đối với âm thanh, có nhiều chuẩn nén khác nhau như: Windows Media, MP3, Real G2, Liquid Audio, ACC, nhưng thông dụng nhất hiện nay là MP3. Nén theo chuẩn MP3, kích thước file audio có thể được thu nhỏ đi 8 lần so với kích thước ban đầu. Để làm được như vậy, người ta sử dụng một kỹ thuật gọi là lấy mẫu âm, thử nghiệm rồi bỏ bớt những tone mà tai người không nghe được hoặc kém nhạy. Do đó, chất lượng âm của MP3 rất khó phân biệt với âm của đĩa CD chuẩn. Hiện nay một chuẩn cải tiến của MP3 là MP3pro còn làm hơn thế. Nó tiến hành mã hóa sóng âm có tần số thấp bằng kỹ thuật mp3 và tạo phần sóng có tần số cao bằng kỹ thuật SBR. Khi phát lại sẽ kết hợp 2 phần sóng này với nhau thành nguồn âm đầy đủ, khắc phục được tình trạng file MP3 mất âm tần số cao khi truyền tải bằng modem quay số.

* Nén không mất dữ liệu (lossless compression): Dữ liệu, đặc biệt là văn bản, đồ họa luôn chứa trong nó những chuỗi thông tin giống hệt nhau lặp đi lặp lại. Việc nén dữ liệu được thực hiện bằng cách thay thế nhiều ký tự thông tin lặp đi lặp lại bằng các ký tự khác, và tạo ra chỉ một bản sao của những đoạn dữ liệu bị lặp lại này. Cũng có cách khác tỉ mỉ hơn là dùng những mã có độ dài khác nhau mã hóa cho các ký tự khác nhau giúp cho các ký tự này chiếm ít chỗ hơn. Cách gì thì cách nhưng phải làm sao vừa thu nhỏ được kích thước file vừa giữ được sự toàn vẹn của dữ liệu.

2.     Ưu nhược điểm của các thuật toán nén dữ liệu:

2.1: Mã hóa độ dài hàng loạt (Run-length encoding):
Loại dư thừa đơn giản nhất trong một tập tin là các đường chạy dài gồm các kí tự lặp lại, điều này thường thấy trong các tập tin đồ hoạ bitmap, các vùng dữ liệu hằng của các tập tin chương trình, một số tập tin văn bản... 


Ví dụ, xét chuỗi sau: 
AAAABBBAABBBBBCCCCCCCCDABCBAAABBBBCCCD 
Chuỗi này có thể được mã hoá một cách cô đọng hơn bằng cách thay thế chuỗi kí tự lặp lại bằng một thể hiện duy nhất của kí tự lặp lại cùng với một biến đếm số lần kí tự đó được lặp lại. Ta muốn nói rằng chuỗi này gồm bốn chữ A theo sau bởi ba chữ B rồi lại theo sau bởi hai chữ A, rồi lại theo sau bởi năm chữ B... Việc nén một chuỗi theo phương pháp này được gọi là mã hoá độ dài loạt. Khi có những loạt dài, việc tiết kiệm có thể là đáng kể. Có nhiều cách để thực hiện ý tưởng này, tuỳ thuộc vào các đặc trưng của ứng dụng (các loạt chạy có khuynh hướng tương đối dài hay không ? Có bao nhiêu bit được dùng để mã hoá các kí tự đang được mã ?). 
Nếu ta biết rằng chuỗi của chúng ta chỉ chứa các chữ cái, thì ta có thể mã hoá biến đếm một cách đơn giản bằng cách xen kẻ các con số với các chữ cái. Vì vậy chuỗi kí tự trên được mã hoá lại như sau: 
4A3BAA5B8CDABCB3A4B3CD 
Ở ÐÂY "4A" có nghĩa là "bốn chữ A"... Chú ý là không đáng để mã hoá các loạt chạy có độ dài 1 hoặc 2 vì cần đến hai kí tự để mã hoá. 
Ðối với các tập tin nhị phân một phiên bản được tinh chế của phương pháp này được dùng để thu được sự tiết kiệm ÐÁNG KỂ. Ý tưởng ở đây là lưu lại các độ dài loạt, tận dụng sự kiện các loạt chạy thay đổi giữa 0 và 1 để tránh phải lưu chính các số 0 và 1 đó. Ðiều này giả định rằng có một vài loạt chạy ngắn (Ta tiết kiệm các bit trên một loạt chạy chỉ khi độ dài của đường chạy là lớn hơn số bit cần để biễu diễn chính nó trong dạng nhị phân), nhưng khó có phương pháp mã hoá độ dài loạt nào hoạt động thật tốt trừ phi hầu hết các loạt chạy đều dài. 
Việc mã hoá độ dài loạt cần đến các biễu diễn riêng biệt cho tập tin và cho bản đã được mã hoá của nó, vì vậy nó không thể dùng cho mọi tập tin, điều này có thể hoàn toàn bất lợi, ví dụ, phương pháp nén tập tin kí tự đã được đề nghị ở trên sẽ không dùng được đối với các chuỗi kí tự có chứa số. Nếu những kí tự khác được sử dụng để mã hoá các số đếm, thì nó sẽ không làm việc với các chuỗi chứa các kí tự đó. Giả sử ta phải mã hoá bất kì kí tự nào từ một bảng chữ cái cố định bằng cách chỉ dùng các kí tự từ bảng chữ cái đó. Ðể minh hoạ, giả sử ta phải mã hoá bất kì một chuỗi nào từ một chữ cái đó, ta sẽ giả định rằng ta chỉ có 26 chữ cái trong bảng chữ cái (và cả khoảng trống) để làm việc. 
Ðể có thể dùng vài chữ cái để biểu diễn các số và các kí tự khác biểu diễn các phần tử của chuỗi sẽ được mã hoá, ta phải chọn một kí tự được gọi là kí tự "Escape". Mỗi một sự xuất hiện của kí tự đó báo hiệu rằng hai chữ cái tiếp theo sẽ tạo thành một cặp (số đếm, kí tự) với các số đếm được biểu diễn bằng cách dùng kí tự thứ i của bảng chữ cái để biểu diễn số i. Vì vậy, chuỗi ví dụ của chúng ta sẽ được biểu diễn như sau với Q được xem là các kí tự "Escape" 
QDABBBAABQHCDABCBAAAQDBCCCD 
Tổ hợp của kí tự "Escape", số đếm và một kí tự lặp lại được gọi là một dãy Escape. Chú ý rằng không đáng để mã hoá các đường chạy có chiều dài ít hơn bốn kí tự, vì ít nhất là cần đến ba kí tự để mã hoá bất kì một loạt chạy nào. 
Trong trường hợp bản thân kí tự "Escape" xuất hiện trong dãy kí tự cần mã hoá ta sử dụng một dãy "Escape" với số đếm là 0 (kí tự space) để biểu diễn kí tự "Escape". Như vậy trong trường hợp kí tự "Escape" xuất hiện nhiều thì có thể làm cho tập tin nén phình to hơn trước. 


Phương pháp mã hoá độ dài loạt thường được áp dụng cho các tập tin đồ hoạ bitmap vì ở đó thường có các mảng lớn cùng màu được biểu diễn dưới dạng bitmap là các chuỗi bit có đường chạy dài. Trên thực tế, nó được dùng trong các tập tin .PCX, .RLE. 
"ABRACADABRA" 
Nếu mã hoá chuỗi trên trong dạng mã nhị phân 5 bit ta sẽ có dãy bit sau: 
00001000101001000001000110000100100000010001010010 00001 
Ðể giải mã thông điệp này, chỉ đơn giản là đọc ra 5 bits ở từng thời điểm và chuyển đổi nó tương ứng với việc mã hoá nhị phân đã được định nghĩa ở trên. Trong mã chuẩn này, chữ D xuất hiện chỉ một lần sẽ cần số lượng bit giống chữ A xuất hiện nhiều lần. 
Ta có thể gán các chuỗi bit ngắn nhất cho các kí tự được dùng phổ biến nhất, giả sử ta gán: A là 0, B là 1, R là 01, C là 10 và D là 11 thì chuỗi trên được biễu diễn như sau: 
0 1 01 0 10 0 11 0 1 01 0 
Ví dụ này chỉ dùng 15 bits so với 55 bits như ở trên, nhưng nó không thực sự là một mã vì phải lệ thuộc vào khoảng trống để phân cách các kí tự. Nếu không có dấu phân cách thì ta không thể giải mã được thông điệp này. Ta cũng có thể chọn các từ mã sao cho thông điệp có thể được giải mã mà không cần dấu phân cách, ví dụ như: A là 11, B là 00, C là 010, D là 10 và R là 011, các từ mã này gọi là các từ mã có tính prefix (Không có từ mã nào là tiền tố của từ mã khác). Với các từ mã này ta có thể mã hoá thông điệp trên như sau: 
1100011110101110110001111 
Với chuỗi đã mã hoá này ta hoàn toàn có thể giải mã được mà không cần dấu phân cách. Nhưng bằng cách nào để tìm ra bảng mã một cách tốt nhất ? Vào năm 1952, D.Huffman đã phát minh ra một cách tổng quát để tìm ra bảng mã này một cách tốt nhất. 
- Bước đầu tiên trong việc xây dựng mã Huffman là đếm số lần xuất hiện của mỗi kí tự trong tập tin sẽ được mã hoá. 
- Bước tiếp theo là xây dựng một cây nhị phân với các tần số được chứa trong các nút. Hai nút có tấn số bé nhất được tìm thấy và một nút mới được tạo ra với hai nút con là các nút đó với giá trị tần số của nút mới bằng tổng tần suất của hai nút con. Tiếp theo hai nút mới với tần số nhỏ nhất lại được tìm thấy và một nút mới nữa lại được tao ra theo cách trên. Lặp lại như vậy cho đến khi tất cả các nút được tổ hợp thành một cây duy nhất. 
- Sau khi có cây nhị phân, bảng mã Huffman được phát sinh bằng cách thay thế các tần số ở nút đáy bằng các kí tự tương ứng. 
-Ưu điểm: đạt được hệ số nén cao (Hệ số nén tuỳ thuộc vào cấu trúc của các tập tin).
Nguyên tắc hoạt động của nó như sau: 
- Một xâu kí tự là một tập hợp từ hai kí tự trở lên. 
- Nhớ tất cả các xâu kí tự đã gặp và gán cho nó một dấu hiệu (token) riêng. 
- Nếu lần sau gặp lại xâu kí tự đó, xâu kí tự sẽ được thay thế bằng dấu hiệu của nó. 
Phần quan trọng nhất của phương pháp nén này là phải tạo một mảng rất lớn dùng để lưu giữ các xâu kí tự đã gặp (Mảng này được gọi là "Từ điển"). Khi các byte dữ liệu cần nén được đem đến, chúng liền được giữ lại trong một bộ đệm chứa (Accumulator) và đem so sánh với các chuỗi đã có trong "từ điển". Nếu chuỗi dữ liệu trong bộ đệm chứa không có trong "từ điển" thì nó được bổ sung thêm vào "từ điển" và chỉ số của chuỗi ở trong "từ điển" chính là dấu hiệu của chuỗi. Nếu chuỗi trong bộ đệm chứa đã có trong "từ điển" thì dấu hiệu của chuỗi được đem ra thay cho chuỗi ở dòng dữ liệu ra. Có bốn qui tắc để thực hiên việc nén dữ liệu theo thuật toán LZW là: 
-qui tắc 1: 256 dấu hiệu đầu tiên được dành cho các kí tự đơn (0 - 0ffh). 
-qui tắc 2: Cố gắng so sánh với "từ điển" khi trong bộ đệm chứa đã có nhiều hơn hai kí tự. 
-qui tắc 3: Các kí tự ở đầu vào (Nhận từ tập tin sẽ được nén) được bổ sung vào bộ đệm chứa đến khi chuỗi kí tự trong bộ đệm chứa không có trong "từ điển". 
-qui tắc 4: Khi bộ đệm chứa có một chuỗi mà trong "từ điển" không có thì chuỗi trong bộ đệm chứa được đem vào "từ điển". Kí tự cuối cùng của chuỗi kí tự trong bộ đệm chứa phải ở lại trong bộ đệm chứa để tiếp tục tạo thành chuỗi mới. 
Các loạt chạy dài có thể được cắt ra để mã hoá bằng nhiều dãy Escape, ví dụ, một loạt chạy gồm 51 chữ A sẽ được mã hoá như QZAQYA bằng cách dùng trên. 
- Ưu điểm: tiết kiệm đáng kể dung lượng file sau khi nén, dùng được cho các đoạn bit dài.
- Nhược điểm:không thể dùng được cho mọi loại tập tin.


2.2: Huffman:

Các tập tin của máy tính được lưu dưới dạng các kí tự có chiều dài không đổi là 8 bits. Trong nhiều tập tin, xác suất xuất hiện các kí tự này là nhiều hơn các kí tự khác, từ đó ta thấy ngay rằng nếu chỉ dùng một vài bit để biểu diễn cho các kí tự có xác suất xuất hiện lớn và dùng nhiều bit hơn để biểu diễn cho các kí tự có xác suất xuất hiện nhỏ thì có thể tiết kiệm được độ dài tập tin một cách đáng kể. Ví dụ, để mã hoá một chuỗi như sau: 
-Nhược điểm: bên nhận muốn giải mã được thông điệp thì phải có một bảng mã giống như bảng mã ở bên gửi, do đó khi nén các tập tin bé hệ số nén không được cao. 

2.3: LZW (Lempel-Zip & Welch):
Phương pháp nén LZW được phát minh bởi Lempel - Zip và Welch. Nó hoạt động đựa trên một ý tưởng rất đơn giản là người mã hoá và người giải mã cùng xây dựng bản mã. 
-Ưu điểm: bên nhận có thể tự xây dựng bảng mã mà không cần bên gửi phải gửi kèm theo bản tin nén. 

2.4: Burrows-Wheelers transform:
-Ưu điểm: vẫn giữ nguyên giá trị gốc không thay đổi, chỉ hoán vị.
- Nhược điểm: do chỉ hoán vị, giữ nguyên giá trị gốc nên kích thước giảm không nhiều.

2.5:  Chuẩn H.264/MPEG-4:
-Ưu điểm: nén được các file đa dạng, chất lượng video tốt hơn mà vẫn tiết kiệm, có thể xuất ra các cấu hình khác nhau. 

Bài đăng phổ biến