Đăng bởi

Phát triển Blockchain với PHP

Ở bài viết này ilook sẽ hướng dẫn các Phát triển Blockchain thông qua ngôn ngữ PHP. Hy vọng bài viết sẽ ít nhiều nắm bắt và thực hiện được công nghệ blockchain

Blockchain hiện nay đang là xu hướng mới, đi đến đâu cũng blockchain, và hầu hết 1 số hội thảo công nghệ thì chủ đề blockchain luôn được nhiều các bạn lập trình viên cũng như các nhà quản lý doanh nghiệp đều quan tâm đến, ở bài viết này mình sẽ hướng dẫn các bạn viết 1 blockchain trong php.

Mình sẽ lướt qua khái niệm về blockchain theo cách mình hiểu 1 chút, để bạn nào chưa biết thì có thể hiểu qua về nó và bạn nào biết rồi thì cũng có thể đóng góp ý kiến của các bạn,

Vậy, đầu tiên blockchain là gì ? mà sao đi đâu cũng thấy nhắc đến blockchain? blockchain ra đời khi nào ? Blockchain dùng để làm gì? ứng dụng vào những cái việc gì? nghe thoáng qua ở đâu nói rằng blockchain là bitcoin, hô hố, có phải không nhỉ ?

Bạn tạo 1 thư mục blockchain trong thư mục webservice của bạn nhé, và tạo luôn 1 file index.php để chúng ta viết code trong đó nhé:

Ban đầu chúng ta sẽ khởi tạo 1 class có tên là Block, Class này sẽ làm nhiệm vụ mã hóa toàn bộ dữ liệu vào thành 1 chuỗi khóa, đoạn code sẽ như sau:

Class Block{
 
public $index; // biến này là index key của 1 block dữ liệu, ở ví dụ này của mình, mình sẽ dùng nó là index, nhưng nếu chúng ta áp dụng thực tế, thì chúng ta có thể coi nó như 1 khóa chính, 1 transaction id, để định danh cho 1 block dữ liệu
public $previousHash; // biến này này hash của block trước block này
public $timeHash; // biến này là thời gian mã hóa của block này
public $data; // biến này là data của block này
public $hash; // biến này chính là hash của block này
 
    public function __construct($index = 0, $previousHash = '', $timeHash = '', $data = '')
    {
 
        $this->index = $index;
        $this->previousHash = $previousHash;
        $this->timeHash = $timeHash;
        $this->data = $data;
        $this->hash = $this->execHash();
    }
 
    public function execHash()
    {
         
        if(is_array($this->data))
        {
            $data_content = json_encode($this->data);
        }else{
            $data_content = $this->data;
        }
         
        return hash('sha256', $this->index.$this->previousHash.$this->timeHash.$data_content);
    }
 
}

Chúng ta chuyển sang tạo Class Blockchain như sau:

Class BlockChain extends Block{
 
    public $chain = array();
 
    public function __construct()
    {
 
    }
 
}

Class Blockchain này sẽ thực hiện các chức năng như tạo mới 1 block, check xem blockchain này có bị chỉnh sửa hay chưa ?

Như bên trên các bạn cũng thấy, mình khởi tạo 1 class có tên Blockchian và thừa kế lại class Block bên trên, trong class Blockchain này hiện chưa có gì ngoài biến $chain đang được khai báo public và 1 hàm __construct(), việc tiếp theo chúng ta sẽ làm là tạo 1 hàm có chức năng khởi tạo block ban đầu, block ban đầu này cũng khá quan trọng, nó là 1 block ban đầu tạo ra hash, các block sau đó sẽ lấy hashkey của block này để thực hiện việc mã hóa của mình, vậy mình sẽ tạo hàm này trong class Blockchain

public function createGenesisBlock()
{
    return new Block(0,'hash_dau_tien', time(), 'data');
}

Tiếp theo chúng ta sẽ gọi hàm này trong hàm __construct để khi new Blockchain thì hàm createGenesisBlock sẽ được tự động gọi vào

Class BlockChain extends Block{
 
    public $chain = array();
 
    public function __construct()
    {
        $this->chain[] = $this->createGenesisBlock(); 
    }
}

Tiếp theo chúng ta tạo 1 hàm có tên getLatestBlock, hàm này sẽ có nhiệm vụ get ra block cuối cùng trong blockchain, và hàm này có nội dung như sau:

private function getLatestBlock()
    {
        return $this->chain[(count($this->chain) - 1)];
    }

Hàm này thì đơn giản rồi nên mình sẽ không giải thích thêm về hàm này và đi vào viết 1 hàm tiếp theo, hàm này vô cùng quan trọng, hàm này sẽ giúp chúng ta thêm vào block những dữ liệu mới

public function addaBlock($index, $timeHash, $data)
    {
        $previousHash = $this->getLatestBlock()->hash;
        $this->chain[] = new Block($index, $previousHash, $timeHash, $data);
    }

Ở hàm này, mình phải lấy ra được hash của block trước, lấy nó để làm gì ạ? thưa rằng bạn nhìn dòng thứ 2 trong hàm này bạn sẽ thấy Class Block cần truyền vào 1 biến có tên $previousHash, biến này khi thực hiện hash nó sẽ giống như 1 key trong hash, sau này cái $previousHash nó cũng là 1 thành phần để nói rằng block này có hợp lệ không ? block này có bị chỉnh sửa không ?

Okie, có vẻ gần hoàn chỉnh rồi, chúng ra review lại class BlockChain 1 chút nhé

Class BlockChain extends Block{
 
    public $chain = array();
 
    public function __construct()
    {
        $this->chain[] = $this->createGenesisBlock(); 
    }
 
    public function createGenesisBlock()
    {
        return new Block(0,'hash_dau_tien', time(), 'data');
    }
 
    private function getLatestBlock()
    {
        return $this->chain[(count($this->chain) - 1)];
    }
 
    public function addaBlock($index, $timeHash, $data)
    {
        $previousHash = $this->getLatestBlock()->hash;
        $this->chain[] = new Block($index, $previousHash, $timeHash, $data);
    }
 
     
}

Tổng cả class Block bên trên chúng ta sẽ có một code cơ bản và hoàn chỉnh

<?php
 
Class Block{
 
    public $index;
    public $previousHash;
    public $timeHash;
    public $data;
    public $hash;
 
    public function __construct($index = 0, $previousHash = '', $timeHash = '', $data = '')
    {
 
        $this->index = $index;
        $this->previousHash = $previousHash;
        $this->timeHash = $timeHash;
        $this->data = $data;
        $this->hash = $this->execHash();
    }
 
    public function execHash()
    {
         
        if(is_array($this->data))
        {
            $data_content = json_encode($this->data);
        }else{
            $data_content = $this->data;
        }
         
        return hash('sha256', $this->index.$this->previousHash.$this->timeHash.$data_content);
    }
 
}
 
Class BlockChain extends Block{
 
    public $chain = array();
 
    public function __construct()
    {
        $this->chain[] = $this->createGenesisBlock(); 
    }
 
    public function createGenesisBlock()
    {
        return new Block(0,'hash_dau_tien', time(), 'data');
    }
 
    private function getLatestBlock()
    {
        return $this->chain[(count($this->chain) - 1)];
    }
 
    public function addaBlock($index, $timeHash, $data)
    {
        $previousHash = $this->getLatestBlock()->hash;
        $this->chain[] = new Block($index, $previousHash, $timeHash, $data);
    }
 
}

Chúng ta sẽ thêm đoạn này vào cuối file index.php và chạy thử nó nhé

$bl = new BlockChain();
$bl->addaBlock(1,time(), 'Data thứ 2');
$bl->addaBlock(2,time(), 'Data thứ 3');
$bl->addaBlock(3,time(), 'Data thứ 4');

Sau khi chạy, chúng ta sẽ có kết quả như sau:

BlockChain Object
(
    [chain] => Array
        (
            [0] => Block Object
                (
                    [index] => 0
                    [previousHash] => ma_chuoi_dau_tien
                    [timeHash] => 1530436111
                    [data] => data cua toi can tao
                    [hash] => 1067948d9484bb8bf7dcf5a625db12521e8a4f395861dd93b0025aa7714417c6
                )
 
            [1] => Block Object
                (
                    [index] => 1
                    [previousHash] => 1067948d9484bb8bf7dcf5a625db12521e8a4f395861dd93b0025aa7714417c6
                    [timeHash] => 1530436111
                    [data] => Data thứ 2
                    [hash] => 3f4752159b07a36c2bef5feeda6f4eb25a0472e08d9f3ed629ff9b4293a1a776
                )
 
            [2] => Block Object
                (
                    [index] => 2
                    [previousHash] => 3f4752159b07a36c2bef5feeda6f4eb25a0472e08d9f3ed629ff9b4293a1a776
                    [timeHash] => 1530436111
                    [data] => Array
                        (
                            [transaction_id] => 12ewe1e12e12eqwd12e1
                            [content] => test
                        )
 
                    [hash] => be72872e39785b6ccaea102166d278e74ef10b9b7af066edead2a6107e6da27a
                )
 
            [3] => Block Object
                (
                    [index] => 3
                    [previousHash] => be72872e39785b6ccaea102166d278e74ef10b9b7af066edead2a6107e6da27a
                    [timeHash] => 1530436111
                    [data] => Data thứ 4
                    [hash] => 46af491628171e95276986c996e3f5c155642411bfefc7936fc4688e1d088f98
                )
 
        )
)

Như vậy là chúng ta đã tạo ra được blockchain với php, thật quá đơn giản phải không các bạn, ở bài sau mình sẽ hướng dẫn các bạn việc kiểm tra xem 1 trong các block trong blockchain đã bị chỉnh sửa hay chưa ?

Thêm phát kết là bitcoin chỉ là 1 loại tiền sử dụng công nghệ blockchain, chứ bitcoin không phải là blockchain, không thể lấy bitcoin làm tên gọi cho blockchain, các bạn đừng nhầm lẫn nhé, ai đang nhầm lẫn thì sửa lại luôn nhé. Hẹn gặp các bạn ở các bài tiếp theo

Đăng bởi

Lộ trình cho mọi lập trình viên web trong năm 2020


Roadmap để trở thành 1 lập trình viên Web trong 2020

Bên dưới đây, bạn sẽ thấy 1 set biểu đồ chứng minh các hướng đi mà bạn có thể chọn. Và những công nghệ mà bạn sẽ muốn sử dụng để trở thành 1 front-end, back-end hay 1 chuyên gia devops để trở thành 1 lập trình viên Web. Mình đã làm những biểu đồ này cho 1 giáo sư cũ của mình. Người đã muốn chia sẻ cái gì đó với các sinh viên đại học của ông để cho họ viễn cảnh, ngoài ra tôi còn chia sẻ chúng ở đây để giúp đỡ cộng đồng. 

Mục đích của những Roadmap này

Mục đích của những Roadmap này là để cho bạn 1 ý tưởng về cảnh quan. Và để hướng dẫn nếu bạn đang bối rối về việc phải học gì cho tiếp theo. Mình không khuyến khích bạn chọn những gì đã và đang phổ biến. Bạn nên tìm hiểu thêm về việc tại sao 1 công cụ sẽ phù hợp cho vài trường hợp hơn những cái còn lại. Và ghi nhớ rằng ‘phổ biến’ không có nghĩa là nó luôn tốt nhất cho công việc.

Ghi chú cho Những người mới bắt đầu

Những roadmap này bao gồm mọi thứ để học hỏi cho các hướng đi được ghi bên dưới. Khoan hãy bị choáng ngộp, lúc bắt đầu bạn không cần phải học hết tất cả nếu bạn chỉ mới khởi động. Chúng mình đang làm về các phiên bản người mới bắt đầu cho roadmap này và sẽ xuất bản sớm, chỉ ngay sau khi chúng mình đã xuất bản xong roadmap cho Back-end và DevOps 2020.

Nếu bạn nghĩ có thể cải tiến những điều này, hãy cứ đề xuất nhé. 

Giới thiệu 

Nhà phát triển web

Front-end Roadmap

 Nhà phát triển web

   Top 10 khóa huấn luyện kỹ sư DevOps cho dân Dev

  Cách trở thành 1 Kỹ sư Phần mềm thực tập chỉ với 4 tháng tự học

Back-end Roadmap 

Nhà phát triển web
DevOps Roadmap 
Nhà phát triển web
Tóm tắt 

Nếu bạn nghĩ bất kì roadmap nào có thể phát triển. Cứ thoải mái tranh luận các vấn đề về nó. 

TopDev via GitHub và roadmap.sh

Đăng bởi

Lộ trình trở thành Backend Developer

Ngành lập trình web hiện nay đã khác trước rất nhiều, nó trở nên khó khăn hơn cho những người mới bước vào ngành. Đó cũng là một trong những lý do chúng tôi quyết định làm một bài hướng dẫn từng bước qua hình ảnh về tình hình này và giải thích rõ hơn những cái bạn cần follow nếu dấn thân vào nghề, từ đó định hướng được lộ trình backend cho bản thân.

Trước đây, con đường đến với backend thật sự không có gì rõ ràng, rằng bạn nên theo cái gì, tập trung vào đâu. Chúng tôi sẽ sắp xếp lại bức tranh này từng bước rõ ràng để cho bạn một idea tốt hơn.

Để tự vẽ lộ trình backend cho bản thân, truớc hết hãy nắm vững khái niệm về backend là gì?

Lộ trình trở thành Backend Developer

Bạn có thể xem full roadmap lộ trình backend trong ảnh dưới, sẽ có phần giải thích từng bước chi tiết ở bên dưới.

Lộ trình trở thành Backend Developer

Trước khi bắt đầu với lộ trình backend, mặc dù chúng tôi chưa list ra các kiến thức về HTML/CSS trên roadmap trên, bạn cũng nên tự tìm hiểu và ít nhất đã nắm được cách viết HTML/CSS căn bản.  FrontEnd là gì? BackEnd là gì ? và Fullstack là gì?

Các bước cần thiết cho lộ trình backend

Bước 1 – Học một ngôn ngữ mới

Có cả tá lựa chọn về ngôn ngữ dành cho bạn. Tôi có chia nhỏ nó ra các categories để bạn dễ lựa chọn hơn. Đối với những người mới thì tôi khuyên bạn nên chọn các ngôn ngữ scripting vì chúng có nhiều demand và cho phép bạn bắt kịp nhanh chóng. Nếu bạn có một ít kiến thức frontend, bạn sẽ thấy Node.js dễ hơn nhiều và có rất nhiều job về nó đang mở.

Nếu bạn đang làm backend và biết một số scripting language, tôi đề xuất không chọn một ngôn ngữ scripting language khác nữa mà chọn trong section “Functional” hoặc “Multiparadigm”. Ví dụ, nếu bạn đang làm PHP hoặc Mode.js, đừng nên chọn Python hoặc Ruby, mà hãy thử Erlang hoặc Golang. Nó sẽ giúp bạn tư duy xa hơn và open với những mảng khác hơn.

Bước 2 — Thực hành ngay những cái đã học

Học phải đi đôi với hành. Một khi bạn đã chọn được ngôn ngữ phù hợp và có được nền tảng căn bản về nó, hãy dùng nó ngay. Hãy tạo nên càng nhiều app nhỏ càng tốt. Dưới đây là một số gợi ý cho bạn:

  • Ứng dụng các command mà bạn dùng trên bash, ví dụ ứng dụng function ls
  • Viết một command để fetch và lưu các post reddit trên /r/programming dưới dạng file JSON
  • Viết một command cung cấp directory structure dưới dạng format JSON ví dụ jsonify dir-name cho ra file JSON có structure bên trong dir-name
  • Viết một command đọc JSON của bước trên và tạo ra directory structure
  • Nghĩ một vài task hằng ngày của mình và automate chúng

Bước 3 — Học Package Manager

Một khi đã học được những cái cơ bản của một ngôn ngữ và tại nên một vài app mẫu, hãy học cách dùng package manager ngôn ngữ đó. Các package manager sẽ giúp bạn dùng các thư viện ngoài  và phân phối các thư viện cho người khác dùng.

Nếu bạn chọn PHP thì bạn có thể học về Composer, Node.js sẽ có NPM hoặc Yarn, Python có Pip và Ruby có RubyGems. Dù cho bạn chọn cái nào đi nữa, hãy cứ tiếp tục và học về package manager.

Bước 4 — Các tiêu chuẩn và Best Practices

Mỗi ngôn ngữ có những tiêu chuẩn riêng và best practices (cách làm tốt nhất). Hãy tìm ra và học hỏi từ nó. Ví dụ, PHP có PHP-FIG và PSRs. Với Node.js sẽ có rất nhiều hướng dẫn phục vụ cộng đồng cũng như nhiều ngôn ngữ khác.

Bước 5 — Bảo mật

Hãy nhớ đọc về các best practices trong mảng bảo mật. Đọc OWASPguidelines để hiểu về nhiều vấn đề bảo mật khác nhau và cách phòng tránh nó đối với từng ngôn ngữ mà bạn chọn.

Bước 6 — Thực hành thêm nữa

Sau những nền tảng cơ bản, tiêu chuẩn và best practice, bảo mật cũng như cách dùng package manager, bây giờ là lúc tự tạo nên một package và phân phối nó đi cho người  khác dùng, nhớ follow các tiêu chuẩn và best practices đã học. Ví dụ như, nếu bạn chọn PHP, bạn có thể release nó trên Packagist, còn nếu chọn Node.js thì release trên Npm registry,…

Sau khi đã xong, bạn có thể search thêm một số project trên Github và mở một số pull request trong các projects. Dưới đây là một vài gợi ý cho bạn:

  • Refactor và ứng dụng những best practice mà bạn học được
  • Xem các vấn đề mở và thử giải quyết nó
  • Add thêm một số functionality

Bước 7 — Học thêm về Testing

Hiện có rất nhiều kiểu test, mục tiêu đó là phải hiểu rõ các loại này là gì. Nhưng trước mắt hãy cách viết Unit Test và Integration test cho app trước đã. Đồng thời hãy tìm hiểu thêm về các phương pháp testing như mocks, stubs,…

Bước 8 — Thực tế

Hãy viết thử unit test cho một số task thực tế mà bạn đã làm, đặc biệt là những cái bạn đã làm ở Bước 6.  

Đồng thời nhớ tính toán thử mức độ cover của các test đã viết.

Bước 9 — Học về Relational Database

Làm thế nào để bảo toàn data trên relational database (dữ liệu quan hệ). Trước khi bạn lựa chọn tool để học, hãy tìm hiểu trước về các phương pháp database terminologies khác nhau như các key, index, normalization, tuple, v.v

Có rất nhiều sự lựa chọn, tuy nhiên nếu bạn học một cái rồi, thì những cái còn lại sẽ trở nên dễ hơn. Một trong những cái lý tưởng để bắt đầu đó là MySQL, MariaDB (khá giống nhau và là một mảnh của MySQL) và PostgreSQL. Pick MySQL.

Bước 10 —  Thời gian thực tế

Bây giờ bạn sẽ đem tất cả những thứ bạn đã học ra để sử dụng. Tạo nên một ứng dụng đơn giản, bất cứ idea nào, ví dụ một ứng dụng viết blog, rồi áp dụng các feature dưới đây:

  • User Account  — Đăng ký và Đăng nhập
  • Những user đã đăng ký có thể tạo các bài blog
  • User có thể xem tất cả các bài blog mà mình đã viết
  • User có thể xoá bài blog
  • User chỉ xem được blog của mình chứ không xem của người khác được
  • Viết các unit/integration test cho app
  • Bạn có thể áp dụng index cho các query. Phân tích queries để biết chắc là các index đang hoạt động

Bước 11 — Học một Framework

Tuỳ vào project và ngôn ngữ mà bạn chọn thì bạn có thể cần hoặc không cần đến framework. Mỗi ngôn ngữ có rất nhiều lựa chọn, hãy tìm hiểu và xem xem ngôn ngữ của bạn có gì và chọn một cái liên quan.

Nếu bạn chọn PHP, tôi đề xuất bạn nên dùng Laravel hoặc Symfony hoặc đối với các framework nhỏ thì bạn có thể dùng Lumen hoặc Slim. Nếu bạn chọn Node.js thì cũng có rất nhiều lựa chọn nhưng cái mạnh nhất đến nay đó là Express.js.

Bước 12 — Thời gian thực hành

Để thực hành bước này, hãy convert app và bạn đã làm ở Bước 10 để áp dụng framework mình đã chọn. Nhớ port mọi thứ kể cả các test nhé.

Lộ trình trở thành Backend Developer
HTML and CSS code developing screenshot. Abstract web site source listing on black background with colored syntax

Bước 13 —  Học NoSQL Database

Đầu tiên hãy tìm hiểu nó là cái gì, chúng khác dữ liệu quan hệ chỗ nào và tại sao cần dùng đến nó. Có rất nhiều sự lựa chọn, chỉ cần tìm kiếm một chút và so sánh các feature sẽ thấy được sự khác nhau. Một số option phổ biến gồm có MongoDB, Cassandra, RethinkDB và Couchbase. Nếu phải chọn một thì bạn nên chọn MongoDB.

Bước 14 — Caching

Hãy tìm hiểu cách ứng dụng app level caching cho ứng dụng của mình. Hiểu được cách sử dụng mà bạn đã build ở Bước 12.

Bước 15 —  Tạo các RESTful API

Tìm hiểu về REST và học cách tạo ra các RESTful API và nhớ đọc về REST trong bài viết gốc của Roy Fielding, để cứ hễ ai bảo REST chỉ dành cho HTTP API là bạn sẽ có thể sửa lưng họ ngay.

Bước 16 —  Học các Auth Method khác nhau

Bạn cần phải biết chúng là gì, sử dụng thế nào và cái này khác cái kia ở chỗ nào

  • OAuth — Open Authentication
  • Basic Authentication
  • Token Authentication
  • JWT — JSON Web Tokens
  • OpenID

Bước 17 —  Các Message Broker

Cũng có nhiều lựa chọn cho bạn nhưng có 2 cái nổi bật hơn đó là RabbitMQ và Kafka. Nếu phải chọn một thì nên hãy học RabbitMQ trước.

Khi app đã bắt đầu phát triển, các query đơn giản dù cho trên dữ liệu quan hệ hay dữ liệu NoSQL sẽ không từ cắt ra và bạn sẽ phải resort riêng công cụ search. Bạn nên cân nhắc tuỳ nhu cầu, vì có rất nhiều option và mỗi option đều có những điểm đặc biệt riêng.

Bước 19 —  Học cách dùng Docker

Docker có thể giúp bạn rất nhiều trong quá trình lập trình ứng dụng, không chỉ tạo lặp một môi trường tương tự khi produce,  giữ cho hệ điều hành luôn sạch sẽ hoặc thúc đẩy code, test và deploy. Tôi sẽ cho bạn một câu hỏi để tìm hiểu và tự trả lời cho mình “Nó sẽ giúp tôi bằng cách nào?”. Cứ thế hãy tìm hiểu và học cách dùng Docker.

Bước 20 —  Trau dồi kiến thức về các Web Server

Nếu đã đến bước này, bạn chắc chắn đã phải tiếp xúc với nhiều server. Lúc này chủ yếu bạn sẽ tìm điểm khác nhau giữa các web server, hiểu được những giới hạn và các configuration option có sẵn cũng như cách viết app để tối ưu hoá các giới hạn này.

Bước 21 — Học cách dùng Web Socket

Mặc dù không bắt buộc, có thêm kiến thức này có thể giúp ích cho bạn rất nhiều. Tìm hiểu xem cách viết web app real-time và một số app mẫu bằng web-socket, bạn có thể dùng nó trên blog application để ứng dụng các update real-time trên blog posts listing.

Bước 22 —  Học GraphQL

Hiểu rõ nó khác chỗ nào REST và tại sao lại gọi nó là REST 2.0.

Bước 23 —  Xem các biểu đồ dữ liệu

Các Biểu đồ đồ thị sẽ giúp bạn linh hoạt hơn khi xử lý data, cũng như cung cấp cho bạn nguồn lưu trữ nhanh chóng và hiệu quả để dễ thu hồi hoặc query nó. Học thêm về Neo4j or OrientDB.

Bước 24 —  Không ngừng khám phá thêm

Một khi bạn đã bắt tay vào học và làm, chắc chắn bạn sẽ vấp phải thêm nhiều thứ mà chúng tôi chưa liệt kê hết trên đây. Hãy luôn ở trong tâm lý mở không ngại học cái mới, vì kết quả thế nào là do bạn chọn. 

Đặc biệt một điều quan trọng nữa: Hãy thực hành càng nhiều càng tốt. Ban đầu trông nó sẽ hơi “ghê” và bạn dễ cảm thấy lạc trôi nhưng điều này là hoàn toàn bình thường, và luyện tập thường xuyên bạn sẽ dần quen với nó và lên tay nhanh thôi. Hy vọng bạn đã tự hình dùng được lộ trình backend cho riêng mình.

Bài viết gốc được đăng tải tại Medium

Đăng bởi

Software architect roadmap

In general software architect is like the architect in real-life. Hes’s responsible for making high-level design decisions.

Objective 🚩

The objective of this document is giving an overview about the skills required by software engineers to level up and become a software architect. Still there’s no ideal skills required to be gained, but this is just a roadmap to be followed to highlight the main skills to be gained.

There’s no standard roadmap or specific methodology to follow to become an architect. Being a good architect is getting achieved by applying and implementing more than reading.

Below is a broadway roadmap that you can follow to start being a software architect.

map

Let’s define the 3 categories of software architects

Solutions architect [very detailed architect]

Solution architect is mainly the one responsible for translating requirements into code. Sometimes we can call him the “project development team lead” for a specific project. He’s responsible for the following:

  • Guiding the development team through the implementation process in every technical details.
  • Making sure that the developed solution meets the designed architecture.
  • Making sure that the developed solution meets the functional requirements.
  • Participate in choosing the right design patterns for solving problems.

Solution architect would be guided by the “Enterprise architect”.

Application architect

Application architect is the one responsible for the following:

  • Choosing the technologies that will be used to implement the application. He’ll be
  • Making sure that the team is meeting the standard of the technology used.
  • Responsible for choosing and cooperate in developing packages/frameworks that will be used by the team.
  • Reliability and scalability of the application.
  • Maintaining/refining the development life cycle of the application.

Sometimes they choose one of the development team to be the application architect.

Enterprise architect [highly abstracted architect]

Enterprise architect is the very highly abstracted architect responsible for the following:

  • Designing the high level organizational development process.
  • Designing UML that will be used by application/solution architects.
  • Should be engaged more with the business mission of the company and the IT strategy.
  • Raising the skills of the development team and maintaining their knowledge.

Contribution 💪

  • This project is created by Draw.io so for contribution just download the map.xml import it, edit it and update the exported images in images/map.png
  • If you want to discuss any ideas/suggestions just ping me on  or 📧
Đăng bởi

Cài đặt, chạy Apache Kafka, Apache Zookeeper trên windows

Cài đặt, chạy Apache Kafka, Apache Zookeeper trên windows

Trong bài này mình sẽ thực hiện cài đặt zookeeper và apache kafka sau đó tạo topics, producer và consumer để demo.

(Xem thêm: Code ví dụ Java Kafka consumer)
(Xem thêm: Code ví dụ Java Kafka producer)

Yêu cầu:

Máy bạn đã cài đặt và thiết lập biến môi trường Java (JRE/JDK)

(Xem lại: Cài đặt và thiết lập biến môi trường cho Java)

Cài đặt Apache Kafka và Apache Zookeeper

Download Zookeeper tại đây: zookeeper-3.4.12.tar.gz | http://zookeeper.apache.org/releases.html#download

Download Kafka tại đây: kafka_2.12-1.1.0.tgz | http://kafka.apache.org/downloads.html

1. Cài đặt Zookeeper

(Xem lại: Zookeeper là gì?)

B1: Giải nén file zookeper tải về, ở đây mình giải nén ra thư mục C:\app\zookeeper-3.4.12

B2: Đổi tên file zoo_sample.cfg trong thư mục conf thành zoo.cfg (zookeeper sẽ sử dụng file zoo.cfg để config)

Cài đặt, chạy Apache Kafka, Apache Zookeeper trên windows

B3: Mở file zoo.cfg (có thể mở bằng notepad hoặc notepadd++) và sửa dataDir=/tmp/zookeeper thành dataDir=zookeeper-3.4.12/data

B4: Tạo biến môi trường cho zookeeper với

  • System variable name = ZOOKEEPER_HOME; System variable value = C:\app\zookeeper-3.4.12
  • Thêm %ZOOKEEPER_HOME%\bin vào Path System Variable
Cài đặt, chạy Apache Kafka, Apache Zookeeper trên windows stackjava.com
Cài đặt, chạy Apache Kafka, Apache Zookeeper trên windows stackjava.com

B5. Start zookeeper bằng cách mở màn hình cmd và gõ zkserver

Kết quả: (Port mặc định của zookeeper là 2181, bạn có thể đổi nó trong file zoo.cfg)

Cài đặt, chạy Apache Kafka, Apache Zookeeper trên windows stackjava.com

2. Cài đặt Apache Kafka

B1. Download và giải nén kafka, ở đây mình giải nén ra thư mục: C:\app\kafka_2.12-1.1.0

B2: Mở file “server.properties” trong thư mục config và sửa “log.dirs=/tmp/kafka-logs”  thành “log.dirs=C:/app/kafka_2.12-1.1.0/kafka-logs”.

B2: Mở file "server.properties" trong thư mục config và sửa log.dirs=/tmp/kafka-logs” to “log.dir= C:\kafka_2.11-0.9.0.0\kafka-logs”.

Sửa”zookeeper.connect=localhost:2181” thành địa chỉ mà server zookeeper chạy. Ở đây mình chạy trên local và dùng port mặc định cho zookeeper là 2181 nên mình giữ nguyên.

B3: Start apache kafka (phải start zookeeper trước đó). Port mặc định của kafka là 9092.

Mở màn hình cmd:

  • Di chuyển tới thư mục kafka bằng cách gõ “cd C:\app\kafka_2.12-1.1.0” và enter
  • Start kafka server bằng cách chạy lệnh “.\bin\windows\kafka-server-start.bat .\config\server.properties”
Start apache kafka (phải start zookeeper trước đó). Port mặc định của kafka là 9092.

3. Tạo Topic

Ví dụ tạo topic với name = “test” (Phải chạy kafka server trước đó). Mở màn hình cmd và chạy các lệnh:

  • cd C:\app\kafka_2.12-1.1.0\bin\windows
  • kafka-topics.bat –create –zookeeper localhost:2181 –replication-factor 1 –partitions 1 –topic test
  • /bin/kafka-topics.bat –create \
  • –zookeeper <hostname>:<port> \
  • –topic <topic-name> \
  • –partitions <number-of-partitions> \
  • –replication-factor <number-of-replicating-servers>

4. Tạo Producer và Consumer thực hiện trao đổi thông qua topic test

Tạo Producer: mở màn hình cmd mới và gõ lệnh:

  • cd C:\app\kafka_2.12-1.1.0\bin\windows
  • kafka-console-producer.bat –broker-list localhost:9092 –topic test

Tạo Consumer: mở màn hình cmd mới và gõ lệnh:

  • cd C:\app\kafka_2.12-1.1.0\bin\windows
  • kafka-console-consumer.bat –zookeeper localhost:2181 –topic test

Kết quả: trên màn hình cmd của producer gõ bất kì message gì thì màn hình cmd consumer đều nhận được

Cài đặt, chạy Apache Kafka, Apache Zookeeper trên windows stackjava.com

Một số lệnh kafka hay dùng khác:

(Trên windows các file kafka-topics.bat, kafka-console-consumer.bat… sẽ nằm trong folder bin/windows; còn trên linux sẽ là các file .sh ở folder bin)

  • Liệt kê tất cả các topic: kafka-topics.bat –list –zookeeper localhost:2181
  • Hiện chi tiết 1 topic: kafka-topics.bat –describe –zookeeper localhost:2181 –topic [Topic Name]
  • Đọc tất cả các message của một topic: kafka-console-consumer.bat –zookeeper localhost:2181 –topic [Topic Name] –from-beginning
  • Xóa một topic: kafka-run-class.bat kafka.admin.TopicCommand –delete –topic [topic_to_delete] –zookeeper localhost:2181

Cài đặt, chạy Apache Kafka, Apache Zookeeper trên windows stackjava.com

Okay, Done!

References:

http://kafka.apache.org/

http://zookeeper.apache.org/

Đăng bởi

Làm an toàn thông tin thì học gì?

1 Giới thiệu

Tôi nhận được thư từ của nhiều bạn hỏi về việc nên học gì và như thế nào để có thể tìm được việc làm và làm được việc trong ngành an toàn thông tin (information security). An toàn thông tin là một ngành rộng lớn với rất nhiều lĩnh vực. Những gì tôi biết và làm được chỉ gói gọn trong một hai lĩnh vực. Có rất nhiều mảng kiến thức cơ bản mà tôi không nắm vững và cũng có nhiều kỹ năng mà tôi không thạo. Hack tài khoản Yahoo! Mail là một trong số đó. Tôi cũng không biết cách tìm địa chỉ IP của bạn chat :-(.

Xét theo năm mức ngu dốt thì tôi nằm ở mức “1OI – thiếu kiến thức” ở hầu hết các lĩnh vực trong an toàn thông tin. Cũng có lĩnh vực tôi nằm ở mức “2OI – thiếu nhận thức”. Nhiều lần đọc sách vở hoặc nói chuyện với đồng nghiệp, tôi hay nhận ra rằng có nhiều thứ tôi không biết là tôi không biết. Theo ý của anh Ngô Quang Hưng thì đây là chuyện bình thường:

Dân máy tính thường phải đọc/học rất nhiều để theo kịp sự phát triển với tốc độ ánh sáng của ngành mình. Trong quá trình này, với mỗi vấn đề X của ngành, ta sẽ chuyển dần dần từ 3OI xuống 1OI. Sau đó, nếu X là cái mà ta thật sự thích hoặc cần cho công việc thì sẽ chuyển nó lên 0OI. 

Rất nhiều sinh viên và nghiên cứu sinh KHMT ở mức 3OI khi mới bắt đầu đi học. Sau đó họ tìm hiểu về quá trình nghiên cứu, quá trình tìm các vấn đề và hướng nghiên cứu mới, quá trính cập nhật kiến thức về ngành của mình, và chuyển dần các thứ lên 2OI. Để có một quá trình hiệu quả từ 3OI lên 2OI không dễ chút nào. Ví dụ đơn giản: các journals, conference nào trong ngành mình là có giá trị, làm thế nào để tìm đọc các bài trong chúng, phương pháp lọc bài đọc thế nào, vân vân.

Tôi thấy anh Hưng nói có lý, nên mục tiêu chính của bài viết này là cung cấp một quá trình hiệu quả để bớt ngu về an toàn thông tin.

2 Làm an toàn thông tin là làm gì?

Tôi muốn viết phần này vì nhiều người tưởng tôi làm bảo vệ khi tôi nói tôi làm security. Ngoài ra có lẽ là do thị trường việc làm an toàn thông tin ở Việt Nam không phong phú nên hầu hết đều nghĩ rằng làm an toàn thông tin nghĩa là đảm bảo an toàn hệ thống mạng (network/system security), trong khi thực tế đây chỉ là một trong số rất nhiều công việc trong ngành.

Trong bốn phần nhỏ tiếp theo, tôi sẽ giới thiệu bốn nhóm công việc chính trong ngành. Đối với mỗi nhóm công việc, tôi sẽ bàn một chút về triển vọng nghề nghiệp ở Việt Nam và Mỹ, hai nơi mà tôi có dịp được quan sát. Nếu bạn không biết bạn thích làm gì thì cứ chọn một công việc rồi làm thử. Các công việc này đều có liên quan nhau, nên kiến thức mà bạn học được trong quá trình thử vẫn hữu ích cho những nghề khác.

2.1 An toàn sản phẩm (product security)

Công việc chính của nhóm này là làm việc với các đội phát triển sản phẩm để đảm bảo sản phẩm làm ra an toàn cho người dùng và an toàn cho hệ thống của công ty, cụ thể là:

  • Kiểm định mã nguồn và thiết kế của sản phẩm
  • Phát triển các giải pháp kỹ thuật và quy trình phát triển phần mềm an toàn để phát hiện và ngăn chặn những kỹ thuật tấn công đã biết
  • Đào tạo nhân lực để nâng cao nhận thức về an toàn thông tin cũng như kỹ năng viết mã an toàn 
  • Nghiên cứu các hướng tấn công mới có thể ảnh hưởng hệ thống sản phẩm và dịch vụ của công ty 

Tóm gọn lại thì nhóm này chuyên tìm lỗ hổng và kỹ thuật tấn công mới. Đây là công việc của tôi và tôi thấy đây là công việc thú vị nhất trong ngành :-).
Ở Mỹ thì thông thường thì chỉ có các hãng có phần mềm và dịch vụ lớn như Facebook, Google, Microsoft, Oracle, v.v. hay các tập đoàn tài chính ngân hàng lớn mới có đội ngũ tại chỗ để đảm nhiệm công việc này. Các công ty nhỏ thường chỉ thuê dịch vụ của các công ty tư vấn. IBM và Big Four đều có cung cấp dịch vụ tư vấn này. Dẫu vậy nếu được chọn lựa thì tôi sẽ chọn làm cho các công ty chuyên sâu như Matasano, iSec, Leviathan, Gotham, IOActive, Immunity, v.v.
Ở Việt Nam thì thị trường việc làm cho người làm an toàn sản phẩm có vẻ ảm đạm hơn. Cho đến nay tôi biết chỉ có một vài công ty ở Việt Nam là có nhân viên chuyên trách lĩnh vực này. Các công ty khác (nếu có quan tâm đến an toàn thông tin) thì hầu như chỉ tập trung vào an toàn vận hành. Các công ty tư vấn an toàn thông tin ở Việt Nam cũng không tư vấn an toàn sản phẩm, mà chỉ tập trung tư vấn chung chung về các quy trình và tiêu chuẩn an toàn thông tin.
2.2 An toàn vận hành (operations security)

Công việc chính của nhóm này là đảm bảo sự an toàn cho toàn bộ hệ thống thông tin của doanh nghiệp, với ba nhiệm vụ chính:

  • Ngăn chặn: đưa ra các chính sách, quy định, hướng dẫn về an toàn vận hành; kiện toàn toàn bộ hệ thống thông tin, từ các vành đai cho đến máy tính của người dùng cuối; cấp và thu hồi quyền truy cập hệ thống; quét tìm lỗ hổng trong hệ thống, theo dõi thông tin lỗ hổng mới và làm việc với các bên liên quan để vá lỗi, v.v.
  • Theo dõi và phát hiện: giám sát an ninh mạng.
  • Xử lý: phản hồi (incident response) và điều tra số (digital forensics) khi xảy ra sự cố an toàn thông tin, từ tài khoản của nhân viên bị đánh cắp, rò rỉ thông tin sản phẩm mới cho đến tấn công từ chối dịch vụ.

Đây là công việc khó nhất, nhưng lại ít phần thưởng nhất của ngành an toàn thông tin.

Tương tự như trên, chỉ có các hãng lớn của Mỹ mới có đội ngũ tại chỗ để phụ trách toàn bộ khối lượng công việc đồ sộ này, nhất là mảng xử lý và điều tra. Đa số các công ty chỉ tập trung vào ngăn chặn và sử dụng dịch vụ của bên thứ ba cho hai mảng còn lại. Các hãng như Mandiant, Netwitness hay HBGary cung cấp dịch vụ điều tra các vụ xâm nhập và có rất nhiều hãng khác cung cấp dịch vụ giám sát an ninh mạng.

Ở Việt Nam thì thị trường việc làm cho người làm an toàn vận hành tương đối phong phú hơn so với an toàn sản phẩm. Các công ty và tổ chức tài chính lớn đều có một vài vị trí chuyên trách về an toàn vận hành. Đa số người làm về an toàn thông tin ở Việt Nam mà tôi biết là làm trong lĩnh vực này. Dẫu vậy hầu như chưa có ai và công ty tư vấn nào làm về phản hồi và điều tra sự cố.

2.3 Phát triển công cụ (applied security)

Công việc chính của nhóm này là phát triển và cung cấp các công cụ, dịch vụ và thư viện phần mềm có liên quan đến an toàn thông tin cho các nhóm phát triển sản phẩm sử dụng lại.

Nhóm này bao gồm các kỹ sư nhiều năm kinh nghiệm và có kiến thức vững chắc về an toàn thông tin, viết mã an toàn và mật mã học. Họ phát triển các thư viện và dịch vụ dùng chung như phân tích mã tĩnh – phân tích mã động (static – dynamic code analysis), hộp cát (sandboxing), xác thực (authentication), kiểm soát truy cập (authorization), mã hóa (encryption) và quản lý khóa (key management), v.v.

Đây là dạng công việc dành cho những ai đang viết phần mềm chuyên nghiệp và muốn chuyển qua làm về an toàn thông tin. Đây cũng là công việc của những người thích làm an toàn sản phẩm nhưng muốn tập trung vào việc xây dựng sản phẩm hơn là tìm lỗ hổng.

Rõ ràng loại công việc này chỉ xuất hiện ở các công ty phần mềm lớn. Ở các công ty phần mềm nhỏ hơn thì các kỹ sư phần mềm thường phải tự cáng đáng công việc này mà ít có sự hỗ trợ từ nguồn nào khác. Ở Việt Nam thì tôi không biết có ai làm dạng công việc này không.

2.4 Tìm diệt mã độc và các nguy cơ khác (threat analysis)

Ngoài an toàn sản phẩm ra thì đây là một lĩnh vực mà tôi muốn làm. Công việc chính của nhóm này là phân tích, truy tìm nguồn gốc và tiêu diệt tận gốc mã độc và các tấn công có chủ đích (targeted attack). Mã độc ở đây có thể là virút, sâu máy tính, hay mã khai thác các lỗ hổng đã biết hoặc chưa được biết đến mà phần mềm diệt virút thông thường chưa phát hiện được. Các loại mã độc này thường được sử dụng trong các tấn công có chủ đích vào doanh nghiệp.

Tôi nghĩ rằng sau hàng loạt vụ tấn công vừa rồi thì chắc hẳn các công ty lớn với nhiều tài sản trí tuệ giá trị đều muốn có những chuyên gia trong lĩnh vực này trong đội ngũ của họ. Ngoài ra các công ty chuyên về điều tra và xử lý sự cố như Mandiant, HBGary hay Netwitness mà tôi đề cập ở trên đều đang ăn nên làm ra và lúc nào cũng cần người. Các công ty sản xuất phần mềm diệt virút dĩ nhiên cũng là một lựa chọn.

Ở Việt Nam thì tôi nghĩ hầu hết doanh nghiệp vẫn chưa thấy được nguy cơ đến từ các cuộc tấn công có chủ đích, thành ra họ sẽ không tuyển người chuyên trách vấn đề này. Tôi cũng không biết có công ty tư vấn nào ở Việt Nam chuyên về điều tra và xử lý sự cố hay không. Tôi nghĩ lựa chọn khả dĩ nhất cho những người thích mảng công việc này là các công ty phần mềm diệt virút.

Tuy nhiên cũng cần lưu ý rằng trong vài năm gần đây ở Việt Nam còn xuất hiện những loại mã độc nhắm vào đông đảo người dùng máy tính bình thường. Vấn nạn này có lẽ sẽ còn kéo dài trong nhiều năm tới và lẽ đương nhiên “phe ta” lúc nào cũng cần thêm những chiến sĩ lành nghề như anh TQN. Thành ra dẫu triển vọng nghề nghiệp không sáng sủa cho lắm, nhưng tôi rất hi vọng sẽ ngày càng nhiều người tham gia vào việc phân tích các mã độc nhắm vào người dùng máy tính ở Việt Nam. Đối với tôi họ là những người hùng thầm lặng, chiến đấu đêm ngày với các “thế lực thù địch” để bảo vệ tất cả chúng ta.

3 Học như thế nào?

Đa số những bạn viết thư cho tôi đều đang học đại học ngành CNTT và tất cả đều than rằng chương trình học quá chán, không có những thứ mà các bạn muốn học. Tôi nghĩ đây là một ngộ nhận.

Hối tiếc lớn thứ nhì trong sự nghiệp học tập mấy chục năm của tôi là đã không học nghiêm túc khi còn là sinh viên (hối tiếc lớn nhất là tôi đã không nghỉ hẳn, nhưng đó là một câu chuyện dài khác). Tôi cũng đã nghĩ rằng chương trình học ở đại học là lạc hậu và không cần thiết. Bây giờ nhìn lại thì tôi thấy nội dung và cách dạy của từng môn học thì đúng là lạc hậu (chỉ có mấy môn triết học Mác-Lênin là bắt kịp ánh sáng thời đại), nhưng toàn bộ giáo trình đại học vẫn cung cấp được một cái sườn kiến thức rất cần thiết cho một kỹ sư an toàn thông tin.

Ở đại học người ta có cách tiếp cận top-down, nghĩa là dạy từ đầu đến cuối những kiến thức nằm trong chương trình. Điều này dễ dẫn đến tình trạng là người học phải học những kiến thức mà họ không thấy cần thiết. Nếu chương trình học cũ kỹ và không có nhiều thực hành, hoặc người dạy không chỉ ra được bức tranh toàn cảnh, vị trí hiện tại của người học và bước tiếp theo họ nên làm là gì thì người học sẽ dễ cảm thấy rằng họ đang phí thời gian học những kiến thức vô bổ.

Trong khi khi đi làm thì cách tiếp cận là bottom-up, nghĩa là lao vào làm, thấy thiếu kiến thức chỗ nào thì học để bù vào chỗ đó. Lúc này tôi hoàn toàn chủ động trong việc học và tôi cũng hiểu rõ tôi cần học cái gì và tại sao. Điều thú vị là mỗi khi truy ngược lại nguồn gốc của những kiến thức tôi cần phải có, tôi thường thấy chúng nằm trong chương trình đại học.

Ví dụ như tôi muốn luyện kỹ năng dịch ngược mã phần mềm (reverse code engineering – RCE) thì tôi thấy rằng tôi cần phải có kiến thức về tổ chức và cấu trúc máy tính. Hoặc nếu tôi muốn học về mật mã học thì tôi phải học lý thuyết tính toán, mà khởi nguồn là lý thuyết automata. Nhưng tại sao trước đó tôi cũng đi làm nhưng không thấy được những lỗ hổng kiến thức này? Tôi nghĩ là do tôi làm không đủ sâu. Ví dụ như nếu bạn suốt ngày chỉ lập trình PHP thì bạn sẽ không thể hiểu được tại sao phải nắm vững tổ chức và kiến trúc máy tính. Hoặc giả như công việc của bạn là sysadmin thì cũng sẽ rất khó để bạn thấy được tại sao cần phải học lý thuyết automata.

Những gì tôi nói lan man ở trên có thể tóm gọn lại thế này:

  • Học dựa theo chương trình đại học. Nếu bạn đang học đại học các ngành công nghệ thông tin, khoa học máy tính hay toán tin thì nên tập trung vào việc học các môn trong trường. Các học liệu trong phần 4 cũng được soạn theo các đại học lớn trên thế giới.
  • Học kiến thức căn bản thật vững (cái gì là căn bản thì xem phần 4), những món còn lại khi nào cần (căn cứ vào nhu cầu công việc) thì hẵng học.
  • Tìm dự án lề (side project) mà bạn thích để làm để có thể nhanh chóng nhận ra những mảng kiến thức còn thiếu.
  • Thời điểm tốt nhất để học một cái gì đó là khi bạn đang là sinh viên. Thời điểm tốt thứ hai là ngay bây giờ!

Các lớp mà tôi liệt kê trong phần 4 đa số là của đại học Stanford. Bạn không cần phải đến tận nơi, ngồi trong lớp mới có thể học được. Tôi thấy trong nhiều trường hợp thì bạn chỉ cần đọc lecture notes, sách giáo khoa mà lớp sử dụng rồi làm bài tập đầy đủ thì vẫn sẽ tiếp thu đủ kiến thức. Một số lớp mà tôi liệt kê dưới đây được dạy miễn phí rộng rãi trên Coursera.

Bạn có thể tham khảo chương trình SCPD nếu muốn học chung với các sinh viên Stanford khác. Đây là chương trình học từ xa thông qua video. Buổi sáng lớp diễn ra thì buổi chiều bạn đã có video để xem. Thi cử như các sinh viên chính quy khác và điểm phải trên B mới được học tiếp. Đây là chương trình mà tôi theo học. Điểm thú vị là mỗi học kỳ bạn chỉ cần lấy một lớp, nhưng Stanford vẫn sẽ cho bạn xem video của tất cả các lớp khác.

Ngoài Stanford và Coursera ra, bạn cũng có thể tham khảo các lớp trên UdacityOCW và MITx. Khi tôi đang viết những dòng này thì MIT và Harvard công bố dự án edX. Chúng ta đang sống trong một thời đại cực kỳ thú vị! Bây giờ chỉ cần bạn chịu học thì muốn học cái gì cũng có lớp và học liệu miễn phí. Nhưng mà học cái gì bây giờ?
4 Học cái gì?

Có ba món quan trọng cần phải học: lập trình, lập trình và lập trình! Để làm việc được trong ngành này, bạn phải yêu thích lập trình. Không có cách nào khác. Thề luôn!

Tôi dành khá nhiều thời gian tìm hiểu giáo trình khoa học máy tính của các trường đại học lớn trên thế giới và tôi thấy tất cả các môn học đều có phần bài tập là lập trình. Học cái gì viết phần mềm cho cái đó. Học về hệ điều hành thì phần bài tập là viết một hệ điều hành. Học về mạng thì viết phần mềm giả lập router, switch hay firewall. Cá nhân tôi cũng thấy rằng lập trình là cách tốt nhất để tiếp thu kiến thức một môn học nào đó, biến nó thành của mình. Nói cách khác, lập trình là một cách mã hóa tri thức khá hiệu quả.

Ngoài ra nhìn vào mô tả công việc ở phần 2, bạn cũng có thể thấy kỹ năng lập trình quan trọng đến dường nào, bởi hầu hết các vấn đề và giải pháp của an toàn thông tin là đến từ phần mềm. Rõ ràng muốn tìm lỗi của phần mềm thì bạn phải hiểu được phần mềm thông qua mã nguồn trực tiếp hay trung gian của nó. Rất có thể bạn sẽ không phải lập trình hàng ngày, nhưng bạn phải viết được những công cụ nhỏ hay những thư viện hỗ trợ cho công việc và các lập trình viên khác.

Vậy làm thế nào để lập trình giỏi? Câu hỏi này làm tôi nhớ đến câu chuyện cười về ông lập trình viên không thể ra khỏi phòng tắm vì trên chai dầu gội có ghi hướng dẫn sử dụng là “cho vào tay, xoa lên đầu, xả nước và lập lại”. Từ khóa trong câu chuyện này là “lập lại”: muốn giỏi lập trình thì cách tốt nhất là lập trình nhiều vô!

Nhưng mà lập trình bằng ngôn ngữ gì bây giờ? Đây là câu hỏi dễ làm cho các lập trình viên oánh nhau nhất ;-). Cá nhân tôi thấy rằng người làm an toàn thông tin bây giờ cần phải thông thạo C, x86 Assembly, Python (hoặc Ruby) và JavaScript. Tôi có nói lý do tại sao trong phần giới thiệu sách tiếp theo.

Lập trình

  • Brian Kernighan, Dennis Ritchie, The C Programming Language (2nd Edition): kinh điển và phải-đọc cho tất cả những ai muốn học C! Linus Torvalds từng nói rằng “[…] all right-thinking people know that (a) K&R are _right_ and (b) K&R are right“. Tôi đã từng rất sợ C (vì nghĩ nó phức tạp), và cuốn này giúp tôi không còn sợ nữa.
  • Randal Bryant, David O’Hallaron, Computer Systems: A Programmer’s Perspective: cuốn này được dùng cho lớp CS107. Đọc cuốn này và làm bài tập của lớp CS107 sẽ rèn cho bạn kỹ năng lập trình C và x86 Assembly. Sau khi đọc cuốn này, bạn sẽ biết tại sao có lỗi tràn bộ đệm và cách khai thác chúng. Tôi rất thích các chương nói về x86 và sự liên kết giữa các công cụ như preprocessor, compiler và linker.
  • David Hanson, C Interfaces and Implementations: muốn mau “lên cơ” bida thì phải thường xuyên xem người khác chơi để mà học “đường” mới. Tương tự, muốn giỏi lập trình thì phải thường xuyên đọc mã của những cao thủ. David Hanson là một cao thủ C và cuốn sách này sẽ chỉ cho bạn nhiều “đường” mới trong việc sử dụng C. Tôi thích các bài tập của cuốn sách này. Tôi nghĩ chỉ cần luyện các bài này là đủ để trở thành một lập trình viên C hạng lông.
  • Justin Seitz, Gray Hat Python: Python Programming for Hackers and Reverse Engineers: cuốn này sẽ giúp bạn sử dụng Python để viết những công cụ nho nhỏ mà bất kỳ ai làm an toàn thông tin cũng sẽ phải viết một vài lần trong đời.
  • Douglas Crockford, JavaScript: The Good Parts: JavaScript là ngôn ngữ thống trị WWW. Nếu bạn muốn làm an toàn (ứng dụng và trình duyệt) web thì bắt buộc phải thành thạo ngôn ngữ. Cuốn sách rất mỏng này của tác giả JSON giới thiệu đầy đủ những vấn đề mà người làm an toàn ứng dụng cần phải biết về JavaScript. Cuốn này có thể dùng làm sách giáo khoa thay cho cuốn “Javascript: The Definitive Guide” trong lớp CS142 (xem bên dưới). Đọc cuốn này tôi mới hiểu closure là gì và bản chất prototypal của JavaScript.
  • Sẽ đọc: những cuốn được giới thiệu ở đây.

Hệ điều hành

  • Abraham Silberschatz, Peter Galvin, and Greg Gagne, Operating System Concepts, 8th Edition Update: cuốn này là giáo trình của lớp CS140. Tôi nghĩ không cần đọc cuốn này, chỉ cần đọc notes và làm bài tập (viết các phần khác nhau của một hệ điều hành!) là đủ. Đây là một lớp nặng. Tôi theo đuổi lớp CS140 này giữa chừng thì phải dừng lại do không có đủ thời gian.
  • Intel Software Developer Manuals: tôi thấy nên đọc tài liệu của 80386 trước, rồi sau đó hẵng đọc tài liệu của các CPU mới hơn.
  • Red Hat, Introduction to System Administration: tôi rất thích chương nói về “philosophy of sysadmin” của cuốn này và tôi nghĩ kỹ năng quản trị hệ thống là cực kỳ cần thiết khi muốn nghiên cứu các kỹ thuật tấn công/phòng thủ mới. Không thể làm an toàn vận hành nếu không có kỹ năng quản trị hệ thống.

Mạng máy tính

  • Richard Stevens, TCP/IP Illustrated Vol I: cuốn sách này quá nổi tiếng rồi nên tôi nghĩ không cần phải giới thiệu. Tôi chưa đọc Vol II, III nhưng nhất định sẽ tìm đọc trong thời gian tới. Lớp CS144 dùng một cuốn sách khác. Tôi chưa học lớp này, nhưng tôi thấy bài tập của họ khá thú vị.
  • Stephen Northcutt, Lenny Zeltser, Scott Winters, Karen Kent, Ronald W. Ritchey, Inside Network Perimeter Security, 2nd Edition: tôi thích cuốn này vì nó viết rất dễ hiểu về các vấn đề  và công cụ thường gặp trong an toàn mạng.
  • Sẽ đọc: Fyodor, Nmap Network Scanning.

Sau khi đã có những kiến thức cơ bản ở trên, bạn có thể theo đuổi lớp CS155. Lớp này có trên Coursera với tên Computer Security. Song song với lớp CS155, bạn có thể tìm đọc các sách sau:
Tìm lỗi phầm mềm

  • Mark Dowd, John McDonald, Justin Schuh, The Art of Software Security Assessment: Identifying and Preventing Software Vulnerabilities: Kinh điển và phải-đọc! Cuốn này là kinh thánh của lĩnh vực an ninh ứng dụng. Tôi thích nhất phần nói về tràn số nguyên và những vấn đề của ngôn ngữ C trong cuốn này.
  • Dafydd Stuttard, Marcus Pinto, The Web Application Hacker’s Handbook: Discovering and Exploiting Security Flaws: cuốn này tập trung vào ứng dụng web. Tôi không đọc cuốn này kỹ lắm, mà chỉ thường dùng nó để tham khảo. Dẫu vậy tôi nghĩ nó là một cuốn giới thiệu tốt cho những ai mới bắt đầu.
  • Michal Zalewski, The Tangled Web: cuốn này mới xuất bản gần đây nhưng đã ngay lập tức trở thành kinh điển! Cuốn này đúc kết quá trình nghiên cứu về an ninh web trong vài năm trời của một trong những hacker xuất sắc nhất thế giới. Tôi nghĩ chỉ cần đọc cuốn này là bạn đã có thể bắt đầu tìm lỗ kiếm tiền được rồi. Cuốn này và cuốn ở trên được dùng làm sách giáo khoa của lớp CS142.
  • Sẽ đọc: Tobias Klein, A Bug Hunter’s Diary: A Guided Tour Through the Wilds of Software Security

Dịch ngược mã phần mềm

  • Eldad Eilam, Reversing: Secrets of Reverse Engineering: mặc dù có rất nhiều người viết về RCE nhưng tôi thấy đây là cuốn duy nhất hệ thống hóa được các bước quan trọng cần phải làm khi cần dịch ngược mã của một tệp chương trình nào đó.
  • Chris Eagle, The IDA Pro Book: The Unofficial Guide to the World’s Most Popular Disassembler: IDA Pro là công cụ tốt nhất để làm RCE và đây là cuốn sách tốt nhất về IDA Pro. Nắm vững C và x86 Assembly thì chỉ cần đọc cuốn này là bạn có thể bắt đầu RCE các phần mềm phức tạp.
  • Tham khảo các tài liệu về dịch ngược mã phần mềm của lớp PenTest của đại học NYU.
  • Sẽ đọc: Michael Sikorski, Andrew Honig, Practical Malware Analysis: The Hands-On Guide to Dissecting Malicious Software

Điều tra số (digital forensics)

  • Brian Carrier, File System Forensic Analysis: Brian Carrier là tác giả của bộ công cụ forensic nổi tiếng The Sleuth Kit. Cuốn này đã giúp tôi “khai quật” được một đoạn video bị xóa lưu trong một máy camera quay lén các máy ATM.
  • Sẽ đọc: Cory Altheide, Harlan Carvey, Digital Forensics with Open Source Tools

Mật mã hóa

  • Niels Ferguson, Bruce Schneier, Practical Cryptography: tôi có nhiều kỷ niệm đẹp với cuốn này ;-). Hầu hết các kết quả làm việc của tôi trong vài năm vừa rồi là nhờ vào việc đọc cuốn này. Tôi chép lại đây giới thiệu rất hay của một người bạn: “The best security books, you can read “inside out”, taking any recommendation on what to do and looking for people to do the opposite to find flaws. “Firewalls and Internet Security” was like that. So was “Practical Unix Security”, and so is TOASSA. This is that book for crypto. It’s also the one book on crypto you should allow yourself to read until you start actually finding crypto flaws.
  • Jonathan Katz, Yehuda Lindell, Introduction to Modern Cryptography: Principles and Protocols: đây là sách giáo khoa của lớp CS255. Lớp này là lớp Cryptography trên Coursera.

Chú ý đây là những cuốn sách tập trung vào công việc hàng ngày và sở thích của tôi — nói cách khác, còn thiếu nhiều sách của các mảng công việc khác. Dẫu vậy tôi nghĩ những cuốn sách này sẽ giúp bạn có được một kiến thức nền tảng vững chắc để từ đó theo đuổi các nghề nghiệp khác nhau trong ngành an toàn thông tin. Trong thời gian tới tôi sẽ cập nhật thêm những cuốn sách mà tôi đang và sẽ đọc. Nếu bạn biết sách nào hay thì hãy giới thiệu cho tôi.

Ngoài ra trong các sách mà tôi vừa liệt kê không có cuốn sách toán (và lý thuyết khoa học máy tính) nào cả. Tôi nghĩ bạn sẽ tự có câu trả lời cho câu hỏi “Có nên học toán hay không?” khi bắt đầu học mật mã. Về hai mảng này thì tôi rất thích lớp “Great Ideas in Theoretical Computer Science” của Scott Aaronson và cuốn “A Computational Introduction to Number Theory and Algebra” của Victor Shoup. Thích đến nỗi tôi phải viết đoạn này chỉ để nhắc đến chúng ;-). Tôi cũng đã từng dành ra nhiều tháng để đánh vật với Introduction to the Theory of Computation của Michael Sipser. Nhưng thôi, tôi không muốn giới thiệu sách toán nữa vì tôi rất dốt món này!5 Bắt đầu nói nhảm và hết
Phew! Không ngờ là tôi cũng viết được cho đến đây (hi vọng là bạn vẫn đang đọc!). Tôi định viết dông dài về thái độ học tập này nọ, nhưng thôi bài đã dài và nhiều thông tin rồi, nên tôi chỉ nói ngắn gọn thế này:

Cái mà tôi vừa “vẽ” ra là một con đường. Thú thật là tôi không biết đích đến của nó là gì — tôi chỉ biết rằng hành trình mà tôi đã đi qua (và hi vọng là những chặng đường sắp tới) đã mang đến cho tôi rất nhiều niềm vui — niềm vui của một con người đi khám phá thế giới, chinh phục những thử thách, để rồi chia sẻ những câu chuyện hay ho với tất cả mọi người.

Mỗi ngày tôi đều dành thời gian đọc sách, làm bài tập, viết mã hoặc chứng minh một cái gì đó. Không ai bắt tôi phải làm những chuyện đó. Có những thứ tôi học cũng không (hoặc chưa) có liên quan gì đến công việc. Tôi học chỉ vì tôi thích và tò mò. Tôi học vì tôi muốn hiểu thêm những thứ mà tôi cho là hay ho. Tôi học vì tôi muốn đi mãi, đi mãi, đi đến tận cùng những cái mà người ta viết trong sách, để xem ở đó có gì hay không.

Hôm rồi tôi đọc một mẩu chuyện về Richard Feynman, trong đó có đoạn kể về lúc Feynman bị bệnh gần đất xa trời, ông tâm sự rằng, “[I’m going to die but I’m not as sad as you think because] when you get as old as I am, you start to realize that you’ve told most of the good stuff you know to other people anyway”. Đương nhiên những gì tôi biết làm sao mà “good” bằng những gì Feynman biết, nhưng dẫu sao thì tôi cũng sẽ học theo Feynman: có biết chuyện gì hay ho thì kể cho nhiều người khác cùng biết. Bài này là một chuyện như thế.

Happy hacking!

(cảm ơn đại ca M. đã đọc và sửa bản nháp của bài này)

Đăng bởi

Học Khoa Học Máy Tính nên đọc sách gì?

Bạn trantempo hỏi một danh sách các sách nên đọc trong KHMT. Bạn Nguyên đã đưa một danh sách sơ bộ. Tôi sẽ cập nhật từ từ vào danh sách dưới đây trong một vài tuần tới để có một danh sách hoàn tất hơn. (Cần về nhà duyệt lại tủ sách). Các bạn có thể bình luận và thêm vào các quyển sách mà bạn ưa thích.

  1. Phân tích thiết kế thuật toán cơ bản (cập nhật ngày 1 tháng 10, 2007)
  2. Phân tích thiết kế thuật toán nâng cao (cập nhật ngày 1 tháng 10, 2007)
  3. Combinatorics (bao gồm lý thuyết đồ thị và toán rời rạc) (cập nhật ngày 2 tháng 10, 2007)
  4. Xử lý ngôn ngữ tự nhiên (danh sách của anh Bạch Hưng Nguyên) (cập nhật ngày 2 tháng 10, 2007)
  5. Machine learning và statistics (danh sách của anh Nguyễn Xuân Long) (cập nhật ngày 8 tháng 10, 2007)

1. Phân tích và thiết kế thuật toán (cơ bản)

hiện nay có 3 quyển textbooks được dùng khá phổ biến, trong đó tôi thích quyển của Kleinberg và Tardos nhất. Tuy nhiên, từ quan điểm cá nhân thì tôi chưa thấy hài lòng với cả 3 vì các lý do khác nhau, mặc dù cả ba quyển đều rất tốt.

  1. Thomas H. Cormen, Charles E. Leiserson, Ronald Rivest, and Clifford Stein, Introduction to Algorithms (2e), 1180pp, ISBN: 0262032937, MIT Press, September 2001.
  2. Jon Kleinberg, Éva Tardos, Algorithm Design, 864 pages, Addison Wesley, ISBN-10: 0321295358, ISBN-13: 978-0321295354, March 16, 2005.
  3. S. Dasgupta, C.H. Papadimitriou, and U.V. Vazirani, Algorithms, McGraw Hill, 2007.

Hồi trước có quyển của Aho-Hopcroft-Ullman. Bây giờ đã khá lỗi thời, ít ai dùng.

  1. Alfred V. Aho John E. Hopcroft Jeffrey Ullman, Data Structures and Algorithms, 427pp. ISBN: 0201000237, Addison Wesley, January 1983.

Tiếc rằng Robert Tarjan không viết sách giáo khoa, nếu không sách về data structure của ông hẳn phải rất hay.

Hiện nay không thể dạy thuật toán cơ bản mà không dạy về NP-Completeness và các phương pháp xác suất. Do đó, các quyển sau đây cũng rất cần thiết:

  1. Michael R. Garey and David S. Johnson, Computers and Intractability: A Guide to the Theory of NP-Completeness, 338pp. ISBN: 0716710455, W. H. Freeman Company, November 1990.
  2. Michael Mitzenmacher and Eli Upfal, Probability and Computing: Randomized Algorithms and Probabilistic Analysis, Cambridge University Press (January 31, 2005)

Tôi xếp 3 tập của Knuth vào dạng “cao cấp hơn”, trong trường hợp bạn đang thắc mắc. Về lecture notes (dạng presentation) thì tôi thấy notes của … tôi khá tốt (từ từ đến cuối học kỳ sẽ có toàn bộ notes.)

2. Phân tích và thiết kế thuật toán (cao cấp hơn)

Khi nói đến phân tích và thiết kế thuật toán cao cấp, ta thường phải xem xét các đề tài cụ thể để giới thiệu. Các quyển sách cao cấp thường được viết về một đề tài nào đó: approximation algorithms, randomized algorithms, linear programming, convex programming, approximate counting, combinatorial optimization, network flows, algorithmic game theory, vân vân. Tôi sẽ gộp chung chúng lại và giới thiệu một vài quyển tiêu biểu.

  1. Donald Knuth, The Art of Computer Programming Volumes 1, 2, 3, Addison Wesley.

Vijay Vazirani, Approximation Algorithms, Springer-Verlag, 397 pages hardcover, ISBN: 3-540-65367-8, published 2001.

  1. Rajeev Motwani and Prabhakar Raghavan, Randomized Algorithms, 492 pages, Cambridge University Press (August 25, 1995), ISBN: 0521474655
  2. Vašek Chvátal, Linear Programming, W. H. Freeman, 1983; 478pp. ISBN: 0716715872, W. H. Freeman Company, January 1983.
  3. Dorit Hochbaum (Editor), Approximation Algorithms for NP-Hard Problems, 624 pages ; Brooks/Cole Pub Co; ISBN: 0534949681; 1st edition (July 26, 1996)
  4. Alexander Schrijver, Theory of Linear and Integer Programming, 484pp. ISBN: 0471982326, Wiley, John & Sons, Incorporated, June 1998.
  5. Christos H. Papadimitriou and Kenneth Steiglitz, Combinatorial Optimization: Algorithms and Complexity, Dover Publications; Unabridged edition (January 29, 1998).
  6. Mark Jerrum, Counting, Sampling and Integrating: Algorithms and Complexity (Lectures in Mathematics. ETH Zürich), Birkhäuser Basel; 1 edition (April 28, 2003)
  7. Ravindra K. Ahuja, Thomas L. Magnanti, and James B. Orlin, Network Flows: Theory, Algorithms, and Applications, Hardcover, 1st ed., 846pp., ISBN: 013617549X, Prentice Hall, February 1993.
  8. Noam Nisan, Tim Roughgarden, Eva Tardos, and Vijay V. Vazirani (editors), Algorithmic Game Theory, Cambridge University Press, 2007.
  9. Mark de Berg, M. van Krefeld, M. Overmars, and O. Schwarzkopf, Computational Geometry: Algorithms and Applications, Second Edition, Springer; 2nd rev. ed. edition (February 18, 2000).

Đây là tôi hoàn toàn chưa đụng tới rất nhiều các đề tài quan trọng khác: algorithmic number theory, algorithmic coding theory, computational biology, v.v.

Chú ý: Ngoài ra, không thể nghiên cứu thuật toán hiện đại mà không có hiểu biết sâu sắc về lý thuyết độ phức tạp (computational complexity theory), lý thuyết đồ thị và toán rời rạc, lý thuyết xác suất và lý thuyết thông tin, toán tối ưu và toán ứng dụng, thậm chí cả hình học và giải tích cơ bản (cần cho computational geometry), hay lý thuyết số (cần cho các thuật toán cryptography). Tôi sẽ giới thiệu vài quyển về các đề tài này trong vài ngày tới.

3. Combinatorics (bao gồm lý thuyết đồ thị và toán rời rạc).

Combinatorics rất rộng, liên quan mật thiết đến rất nhiều nhánh khác nhau của toán học và khoa học máy tính. Dưới đây tôi chỉ liệt kê một sanh sách các sách tôi đã đọc và thấy hữu dụng trong nghiên cứu và trong phát triển tư duy toán học cho KHMT. Nghĩa là không kể những thứ hữu dụng mà tôi không biết gì cả như Additive Combinatorics của bác Terry Tao và bác Vũ Hà Văn.

3.1 Toán rời rạc phổ thông. Hiển nhiên sinh viên học KHMT phải biết toán rời rạc. Tuy nhiên, tôi cực kỳ khó chịu với loại toán rời rạc thường được dạy ở bậc đại học nói chung, vì hai lý do: (1) lớp toán rời rạc kiểu này không chuẩn bị đủ kiến thức cho sinh viên học thêm lên, (2) và nó cho sinh viên một bức tranh bèm nhèm về toán rời rạc, dễ làm sinh viên hiểu không đúng về tầm mức của toán rời rạc. Dĩ nhiên tôi hiểu rằng chương trình đại học thì có giới hạn, còn bể kiến thức thì vô cùng, do đó cái “khó chịu” này của tôi không có cơ sở, Chỉ nhân đây càm ràm để “xả stress” là chính.

Có bốn quyển sách “phải đọc” về toán rời rạc cho sinh viên học KHMT (và cả sinh viên toán):

  1. J. H. van Lint and R. M. Wilson, A Course in Combinatorics, Cambridge University Press; 2nd edition (December 15, 2001). Rất tuyệt vời! Mỗi chương là một đề tài riêng biệt, từ đồ thị đến generating functions, từ design theory đến coding theory, từ q-series đến extremal set theory, v.v. đều có cả. Đa số các bài tập đều không tầm thường. Nếu bạn muốn biết combinatorics thật sự là gì, mà không có thời gian đọc nhiều quá, thì quyển này là bắt buộc!
  2. Ronald L. Graham, Donald E. Knuth, Oren Patashnik, Concrete Mathematics: A Foundation for Computer Science, Addison-Wesley Professional. Viết bởi computer scientists cho computer scientists. Tất cả những thứ sinh viên KHMT cần biết về asymptotic analysis. Kiểu Knuth. Nghĩa là cực kỳ cụ thể và chi tiết về phương pháp. Dĩ nhiên, phạm vi của quyển này rất hẹp, vì đề tài và đối tượng rất cụ thể.
  3. Laszlo Lovasz, Combinatorial Problems and Exercises, American Mathematical Society; 2 edition (June 26, 2007). Vừa ra 2nd edition. Cách duy nhất để học toán rời rạc là làm thật nhiều bài tập. Bạn hoàn toàn có thể trở thành một chuyên gia hạng ruồi về graph theory và extremal set theory bằng cách ngồi giải bài tập trong sách này. Nếu bạn đang lấy lớp combinatorics nào đó, nhiều khả năng là thầy của bạn lấy một vài bài tập trong này ra làm bài tập về nhà hoặc cả bài kiểm tra.
  4. Martin Aigner, Günter M. Ziegler, and K.H. Hofmann, Proofs from THE BOOK, Springer; 3rd ed. edition (November 13, 2003). Tôi không biết là quyển này đã ra đến 3rd edition, tôi chỉ có 1st edition. Nói đúng ra, quyển này không phải viết về toán rời rạc. Nhưng tư tưởng của nó lại rất tương đồng với tư tưởng của toán rời rạc mà tôi cảm nhận. Khi thấy một chứng minh đẹp như mơ, Erdos hay nói rằng “chứng minh này chắc là phải nằm trong một quyển sách của thượng đế, quyển sách chứa các chứng minh đẹp nhất”. Đó là tư tưởng chính của quyển sách. Nó chứa một bộ sưu tập các chứng minh đẹp như mơ. Dân yêu toán, ai lại không mơ?

3.2 Lý thuyết đồ thị (bao gồm cả algebraic graph theory). Không có nhánh nào của KHMT mà lại không cần kiến thức cơ bản về lý thuyết đồ thị. Sách mở đầu của lý thuyết đồ thị thì có cực kỳ nhiều. Tôi vẫn thường giới thiệu quyển của West cho sinh viên vì thấy nó vừa phải và phù hợp với dân máy tính. Quyển bài tập của Lovasz ở trên có vài chương về lý thuyết đồ thị rất hay. Tôi quan tâm đến algebraic graph theory nó là công cụ chính để phân tích các expander graphs (dùng cực kỳ nhiều trong complexity theory, algorithm design, randomized algorithms, coding theory, networking, v.v.)

  1. Douglas West, Introduction to Graph Theory, Prentice Hall; 3 edition (December 1, 2007). Tôi thấy phạm vi đề tài của quyển này rất thích hợp cho dân học KHMT, lại rõ ràng dễ hiểu. Sau khi đọc xong một quyển giới thiệu ngành như quyển này, các quyển kế tiếp đều phải đọc theo đề tài, như algebraic graph theory, extremal graph theory, graph coloring, matching theory, v.v.

Tommy R. Jensen and Bjarne Toft, Graph Coloring Problems, Wiley-Interscience; 1st edition (December 1994). Đây là tham khảo kinh điển về các bài toán tô màu đồ thị, dùng cực nhiều trong KHMT.

  1. L. Lovász and M.D. Plummer, Matching Theory, Annals of Discrete Mathematics, 29, North-Holland Mathematics Studies, 121. Tôi tin rằng dân làm về graph theory và combinatorial optimization đều … bí mật đọc quyển này Một đề tài rất đẹp và rất khó tìm thấy ở sách khác là về các Pfaffian và Permanent. Đặc biệt là về matching trên bipartite graphs thì tất cả những thứ tôi biết đều học từ quyển này ra, và đã dùng kiến thức học được trong ít nhất 5 bài báo!

Norman Biggs, Algebraic Graph Theory, Cambridge University Press. Quyển sách be bé này giới thiệu algebraic graph theory rất tốt. Đủ để dùng làm nhiều thứ, bao gồm hiểu các thứ liên quan đến expanders.

  1. Dragos M. Cvetkovic, Michael Doob, Horst Sachs, Spectra of Graphs: Theory and Applications, Academic Press; 3rd Revised edition (August 1, 1997). Đây là sách tham khảo chính về algebraic graph theory.
  2. Fan Chung, Spectral Graph Theory, American Mathematical Society (May 1997). Sách viết rất tốt và rõ ràng. Cái dở duy nhất là bà Fan Chung lại chọn bộ Lapacian eigenvalues thay vì bộ eigenvalues của đồ thị như trong các applications thường dùng. Chuyển qua chuyển lại các kết quả rất mất thời gian.

3.2 Phương pháp xác suất (bao gồm random graphs). Phương pháp xác suất là một trong những công cụ chính của theoretical computer science, với ứng dụng ở khắp mọi nơi. Trong complexity theory & algorithms ta dùng phương pháp xác suất phân tích và thiết kế PCP, randomized (approximation) algorithms, derandomization, pseudo-random number generation, v.v. Trong mạng máy tính ta có randomized routing, randomized MAC protocols, blocking analysis of switches and routers, v.v. Trong cơ sở dữ liệu gần đây phát triển mạnh probabilistic databases, v.v.

Tôi sẽ giới thiệu sách về xác suất và thống kê trong một đề mục riêng. Phần dưới đây chỉ nói riêng về phương pháp xác suất theo nghĩa của Erdos.

  1. Noga Alon and Joel H. Spencer, The Probabilistic Method, Wiley-Interscience; 2 Sub edition (August 24, 2000). Kinh điển! Không có gì phải bàn.
  2. Béla Bollobás, Random Graphs, Cambridge University Press. Lại một quyển kinh điển nữa!

Quyển của Mitzenmacher và Upfal đã giới thiệu trong phần giải thuật.

3.4. Enumerative combinatorics.

  1. Richard Stanley, Enumerative Combinantorics Vol. 1 & 2, Cambridge University Press. Kinh điển! Chứa hầu hết tất cả những thứ mà dân khoa học máy tính cần biết về enumerative combinatorics.

Dennis Stanton and Dennis White, Constructive combinatorics, Springer; 1 edition (May 15, 1986). Quyển này có lẽ ít người biết nhưng tôi thấy rất hay cho dân học máy tính. Nó viết về enumerative combinatorics từ góc nhìn thuật toán và bijective proofs. Tôi đã lấy lớp của cả hai vị Dennis. Bác Stanton là người thầy có ảnh hưởng lớn nhất đến triết lý giáo dục của tôi.

  1. David M. Bressoud, Proofs and Confirmations: The Story of the Alternating-Sign Matrix Conjecture, Cambridge University Press (August 13, 1999). Quyển này phải nói là trên cả tuyệt vời. Quyển sách nói về một conjecture rất nổi tiếng gọi là Alternating Sign Martrix Conjecture và duyệt lại toàn bộ quá trình người ta “tấn công” conjecture này. Tôi đã từng bỏ 6 tháng vật lộn với nó . Kết thúc bằng các công trình của Zeilberger và Kuperberg. Nó tuyệt vời ở chỗ, ngoài việc dùng làm sách giáo khoa cho một vài lớp enumerative combinatorics rất tốt, nó vẽ ra rất rõ ràng quá trình phát triển và phương pháp tư duy của một nhánh toán học dựa trên một câu chuyện cụ thể, một đề tài nghiên cứu cụ thể. Terry Tao có viết một bài hàm chứa ý tưởng tương tự về tính liên thông của các phát triển trong toán. Đến bây giờ mở sách này ra đọc tôi vẫn tìm thấy những cái mới, và cả các bài toán chưa giải được. Enumerative combinatorics là “tình yêu thời niên thiếu” của tôi, và quyển này là quyển tốt nhất giải thích tại sao tôi vẫn còn … day dứt (Trong quyển này có nói về một thuật toán tính định thức của tác giả truyện Alice lạc vào xứ thần tiên!)
  2. George E. Andrews, The Theory of Partitions, Cambridge University Press (July 28, 1998). George Andrews là người tìm ra những quyển sổ tay mất tích của Ramanujan. Quyển sách của ông nằm giữa giải tích, lý thuyết số, và enumerative combinatorics. Có lẽ định lý hay nhất trong sách là công thức tính tổng số integer partitions của một số nguyên bất kỳ. Đọc sách này ta sẽ thấy generating functions mạnh như thế nào, và được dùng như thế nào trong các vấn đề cực kỳ hóc búa của lý thuyết số. Ngoài ra, nó cũng là quyển sách rất tốt về các hyper-geometric series và q-series. Tuyệt cú mèo! Có một lần tôi nghe George Andrews trình bày ở một hội nghị, ông mang theo một cuộn giấy to oành in một chương trình ông viết từ hồi đầu thập niên 70 để tìm các conjectures trong enumerative combinatorics. Ông kéo cuộn giấy đi từ đầu đến cuối phòng, chưa hết một nửa.

3.5 Algebraic combinatorics. Tư tưởng của nhánh này rất gần, theo một nghĩa nhất định, với các phương pháp đại số dùng trong coding theory và complexity theory hiện đại. Nó lại liên quan mật thiết đến giải tích của các hàm vuông góc. Tôi làm M.S. Thesis Toán trong nhánh này. Mặc dù bây giờ không làm về nó nữa, nhắc lại vẫn còn thấy “nhiệt huyết” bừng bừng . Ngoài ra, nhánh này cũng là anh em cột chèo với algebraic graph theory, rất cần thiết trong cả complexity theory lẫn một số bài toán trong mạng máy tính! Đó là chưa kể liên minh sống còn với representation theory cũng lại được dùng trong KHMT (như trong loạt bài về nhân ma trận tôi đang viết dở).

  1. Chris Godsil, Algebraic Combinatorics, Chapman & Hall/CRC (April 1, 1993).
  2. Chihara, An Introduction to Orthogonal Polynomials, Routledge; 1 edition (January 1, 1978). Quyển kinh điển về các đa thức vuông góc.
  3. George E. Andrews, Richard Askey, Ranjan Roy, Special Functions, Cambridge University Press; New Ed edition (February 15, 2001). Tất cả những thứ bạn cần biết về các hàm đặc biệt!

William Fulton, Young Tableaux: With Applications to Representation Theory and Geometry, Cambridge University Press (December 28, 1996).

  1. I. G. Macdonald, Symmetric Functions and Hall Polynomials, Oxford University Press, USA; 2 edition (June 30, 1999). Quyển này và quyển của Fulton là kinh điển về symmetric functions.

3.6 Extremal set theory, extremal set systems, và design theory. Những thứ này thì dùng làm gì trong KHMT? Một vài ví dụ nhỏ: chúng liên quan mật thiết với lý thuyết thử nhóm (group testing) được dùng trong DNA library screening (bio-computing), trong thiết kế MAC protocols và thử lỗi của mạng quang (networking), và thiết kế thuật toán nói chung. Design theory lại cũng liên quan chặt chẽ với coding theory (sẽ giới thiệu sách sau) dùng trong communications và trong complexity theory.

  1. Konrad Engel, Sperner Theory, Cambridge University Press. Phát triển lý thuyết của một định lý rất đơn giản và hùng mạnh trong topology: định lý Sperner.
  2. Bela Bollobas, Combinatorics, Cambridge University Press. Nhỏ và hiệu quả!
  3. A. E. Brouwer, A. M. Cohen, A. Neumaier, Distance Regular Graphs, Springer (August 1989). Nhiều bài toán thiết kế các cấu trúc extremal có thể được mô hình hóa bằng distance regular graphs: một loại đồ thị rất giàu có về cấu trúc đại số, nhờ đó bài toán trở nên tổng quát hơn (dùng công cụ của đại số), và đôi khi dễ dàng hơn.
  4. Ding-Zhu Du and Frank K. Hwang, Combinatorial Group Testing and Its Applications, World Scientific Publishing Company; 2nd edition (May 2000). Quyển này là tham khảo chính (và duy nhất) cho lý thuyết thử nhóm. Nó là dạng monograph chứ không phải textbook, dùng làm tham khảo.

4. Xử lý ngôn ngữ tự nhiên (danh sách của anh Bạch Hưng Nguyên).

Sách cơ bản:[1] Manning & Schutze, Foundation of Statistical NLP – (có online nếu có access vào MIT library)[2] Jurasky & Martin, Speech&Language Procesing: An Introduction to Natural Language Processing, Computational Linguistics, and Speech Recognition, 2nd edition.

Tham khảo thêm:[3] James Allen, Natural Language Understanding[4] Fred Jelinek, Statistical Method for Speech Recognition[5] Xudong Huang et al, Spoken Language Processing

Lộ trình tự đọc & học trong 1 hoặc 2 học kì theo thứ tự sau

——–Chương 1+2+3+4 – [1]: Introduction / Mathematical Foundations/ Linguistic Essential / Corpus-based WorkChương 7 – [2]: Phonetics

——–Chương 6 – [1]: Statistical Inference: n-gram Models over Sparse DataChương 4 – [2]: N-grams

——–Chương 8 – [5]: Hidden Markov ModelsChương 2 – [4]: Hidden Markov ModelsChương 4 – [2]: Word Classes and Part-of-Speech TaggingChương 6 – [2]: Hidden Markov and Maximum Entropy Models

——–Chương 3 – [3]: Grammar and ParsingChương 12 – [2]: Formal Grammars of EnglishChương 11 – [1]: Probabilistic Context Free GrammarChương 12 – [1]: Probabilistic ParsingChương 13 – [2]: Parsing with Context-Free GrammarsChương 14 – [2]: Statistical Parsing

——–Chương 3 – [2]: Words and Transducers

——–Chương 22 – [2]: Information Extraction

——–Chương 25 – [2]: Machine Translation

——–Chương 15 – [1]: Topics in Information Retrieval

——–Chương 16 – [1]: Text Categorization

——–

Lộ trình này giới thiệu chuyên sâu về phương pháp thống kê NLP, mô hình n-gram , mô hình Markov ẩn, & kĩ thuật phân tích câu (parsing). Sau đó là giới thiệu sơ qua một số topics mà NLP đóng vai trò quan trọng như Trích chọn Thông Tin (Information Extraction), Dịch tự động (Machine Translation), Khai Thác Thông Tin (Information Retrieval), & Phân Loại Văn Bản (Text Categorization). Về cơ bản sau khi xong lộ trình này là đủ để bắt tay vào chuyên sâu các vấn đề trong NLP. Rất nhiều topics của NLP không đề cập trong lộ trình này ví dụ như: Các máy Hữu hạn trạng thái (Finite-state Machines), Các kĩ thuật học máy (Machine Learning techniques), Nhận dạng tiếng nói (Speech Recognition), Tổng hợp tiếng nói (Speech Synthesis), Hệ thống Hỏi-Đáp (Q&A systems).

5. Machine learning và statistics

Chuyển qua machine learning và statistics… What? Statistics là cả một chuyên ngành riêng biệt sao phải học? Có lần một người bạn tôi hỏi David Blackwell, khi cậu ta mới chập chững vào PhD program. Rằng, có cái gì hay ho tôi nên theo đuổi trong statistics? Blackwell trả lời, nên học machine learning và nonparametric statistics. Tôi gộp cả ML và Stats vì tôi coi hai ngành này là một, dẫu về truyền thống và định hướng hiện tại thì có những sự khác biệt nhất định. Có rất nhiều sách hay trong ngành, nhưng chỉ giới thiệu một số mà tôi quen thuộc hơn cả. Như vậy còn một số sách hay mà chưa được list, xin bạn đọc bổ sung qua comments. Những quyển đánh dấu sao (*) có thể dùng làm sách nhập môn tốt. Ngoài ra, (+) cũng là những quyển sách tôi ưa thích.

5.1. Sách giới thiệu với hương vị machine learning

  1. T. Michell, Machine Learning, Tom Mitchell, McGraw Hill, 1997.

Quyển này từng là quyển sách đầu tay cho dân ML, nhưng nay nó đã lạc hậu về nội dung.

  1. R. Duda, P. Hart and D. Stork. Pattern Classification. Wiley, 2000.
  2. K. Fukunaga. Statistical pattern recognition. AP, 1990.
  3. (*) J. Friedman, T. Hastie and R. Tibshirani. The elements of statistical learning. Springer, 2001.

5.2. Sách tập trung vào các dạng mô hình học thống kê

A. Các mô hình tương đối khái quát

  1. (*) C. Bishop, Neural networks for pattern recognition. Clarendon Press, 1995.
  2. S. Haykin, Neural networks: A comprehensive foundation. Prentice Hall, 2nd Edition, 1998.
  3. (*) B. Scholkopf and A. Smola, Learning with kernels. MIT Press, 2002.
  4. J. Shawe-Taylor and N. Cristianini, Kernel methods for pattern analysis. Cambridge Univ Press, 2004.
  5. J. Shawe-Taylor and N. Cristianini, Support vector machines and other kernel-based learning methods. Cambridge Univ Press, 2000.
  6. (+) S. Mallat, A wavelet tour of signal processing, Academic Press, 2nd Edition, 1999.
  7. (*) M. Jordan, An introducition to probabilistic graphical models. Quyển sách này tuy chưa xuất bản nhưng rất nhiều trường sử dụng làm tài liệu cho graduate course. Nếu bạn ở VN và định dạy một lớp về graphical models, có thể email tác giả để xin phép sử dụng cho lớp.

B. Các mô hình chuyên sâu và/hoặc hẹp hơn:

  1. T. Anderson, An Introduction to Multivariate Statistical Analysis (Wiley Series in Probability and Statistics), 3rd Edition, 2003. Kinh điển và hữu ích về (parametric) multivariate data, đặc biệt về gaussian (tốt cho việc tham khảo kết quả).
  2. (+) L Devroye, L. Gyorfi and G. Lugosi, A Probabilistic Theory of Pattern Recognition.

Tập trung nhiều vào lý thuyết về classification.

  1. (+) L. Gyorfi, M. Kohler, A. Kryzak and H. Walk, A Distribution-Free Theory of Nonparametric Regression, 2002.
  2. Anthony and P. Bartlett. Neural Network Learning: Theoretical Foundations, 1999.
  3. V. Vapnik, Statistical learning theory, 1998. Tác giả là một trong những người có đóng góp nền móng cho phát triển cả lý thuyết và thuật toán machine learning.
  4. M. Kearns and U. Varizani, An Introduction to Computational Learning Theory, MIT Press, 1994. Quyển sách serious đầu tiên của dân machine learning về machine learning theory.

C. Các mô hình cho spatial data:

  1. (+) G. Wahba, Spline models for observational data, SIAM, 1990.

Giới thiệu cách sử dụng RKHS trong regression.

  1. S. Banerjee, B. Carlin and A. Gelfand, Hierarchical Modeling and Analysis for Spatial Data.

(Các mô hình hierrchical Bayesian models).

  1. M. Stein, Interpolation of spatial data. Springer-Verlag, 1999. Lý thuyết hơn.
  2. N. Cressie, Statistics for spatial data, Wiley and Sons, 1993.

D. Các mô hình về sequential decision-making (such as reinforcement learning, online learning, etc…):

  1. (*) A. Barto & R. Sutton, Reinforcement learning: An introduction, MIT Press, 1998.

Giới thiệu về RL một cách nhẹ nhàng.

  1. D. Bersekas & J. Tsitsiklis, Neurodynamic programming, Athena Scientific, 1996.

Xây dựng lý thuyết RL một cách chặt chẽ hơn.

  1. D. Bertsekas, Dynamic programming and Stochastic control, Athena Scientific, 1995.

Cesa-Bianchi and Lugosi, Prediction, Learning, and Games, Cambridge Univ Press, 2006.

  1. (*) A. Wald, Sequential analysis, 1947. Quyển sách đã khởi đầu cho cả một branch (Bellman tổng quát lên thành dynamic programming and control).
  2. Shiryaev, Optimal stopping rules, 1978. Điển hình sách kiểu Nga, lý thuyết hơn. Đi sâu vào Bayesian formulations của những v/đ liên quan đến stopping rules, trong đó sequential analysis (sequential hypothesis testing, sequential change-point problems) chỉ là những trường hợp đặc biệt.
  3. D. Siegmund, Sequential analysis, 1985. Đi sâu hơn vào frequentist formulations.
  4. A. Sen, Sequential nonparametrics. Khá sâu.

E. Các dạng mô hình/topics khác

Ngoài ra, một số dạng mô hình cụ thể cũng có rất nhiều sách tham khảo, như mô hình về time series, mô hình về finance (stochastic calculus), mô hình linear/generalized linear/mixed linear các kiểu, mô hình state-space. Một số topics thú vị, như về active learning/ experiment design, concentration of measures,….Tuy nhiên scope hoặc hơi xa hoặc hơi sâu so với danh sách trên.

5.3. Phương pháp thống kê tổng quát

Phần lớn dân làm machine learning/statistics sẽ đi vào các dạng mô hình cụ thể, mỗi loại thích hợp cho một ứng dụng nào đó. Các mô hình đó giải quyết câu hỏi “how” khi cần học một mô hình (hay khái niệm). Để biết “why” thì cần đọc một số quyển sách về general statistical methodogy. Thực ra, một số quyển sách mang tính lý thuyết trong machine learning, như Vapnik, Devroye-Gyorfi-Lugosi, hoặc Anthony-Bartlett cũng có thể được xếp vào đây, nhưng focus của chúng còn hẹp so với các tác phẩm của các nhà thông kế.

Trường phái frequentist:

  1. (*) P. Bickel and K. Doksum, Mathematical statistics: basic ideas and selected topics, Prentice Hall, 2nd Edition, 2000.
  2. (*) R. Keener, Statistical theory: A Medley of Core Topics. Hình như sắp xuất bản. Viết rât rõ ràng, không sâu nhưng giới thiệu khá nhiều topics.
  3. (+) E. Lehmann & J. Romano, Testing statistical hypotheses, Springer, 3rd Edition, 2005.
  4. (+) E. Lehmann & G. Casella, Theory of Point Estimation, Springer, 2nd Edition, 1998.

Hai quyển sách trên của Lehmann (và các đồng tác giả ở các editions sau) được coi là bible của classical (frequentist) statistics.

Trường phái Bayesian:

  1. (+) J. Berger, Statistical decision theory and Bayesian analysis, Springer-Verlag, 2nd Edition, 1985. Được coi là một bible của Bayesian statistics. Tác giả có một cái nhìn rất cân bằng giữa frequentist và bayesian methodologies.
  2. (*) C. Roberts, The Bayesian choice, Springer, 2nd Edition, 2007. Có lẽ sẽ là một bible trong tương lai, hiện đại hơn quyển sách của Berger.
  3. (+) J. Bernardo and A. Smith, Bayesian theory, Wiley, 1994. Đi sâu vào nhiều vấn đề foundational của statistical inference.

5.4. Bayesian computation (Markov chain Monte Carlo)

  1. J. Liu, Monte Carlo Strategies in Scientific Computing, Springer, 2001.
  2. A. Gelman, J. Carlin, H. Stern and D. Rubin, Bayesian data analysis, Chapman and Hall, 2nd Edition, 2003.

5.5 Sách về information and communication theory

Thực ra tất cả các sách về information theory có thể xếp vào mục “asymptotic theory”. Tất nhiên xuất phát điểm thì hoàn toàn khác: đó là từ các vấn đề trong communication và data compression.

  1. (*) T. Cover & J. Thomas, Elements in information theory, Wiley, 2nd Edition, 2006.

Viết rất rõ ràng.

  1. R. Gallager, Information theory and reliable communication. Kinh điển!
  2. D. McKay, Information theory, inference and learning algorithms, 2003.

Free on-line!

5.6 Asymptotic theory

Mọi lý thuyết sâu sắc trong xác suất và thống kê đều phải đi về asymptotics! Tại sao? vì asymptotics là cách duy nhất (?) chúng ta có thể nói được một cách chắc chắn về tính chất của các hiện tượng không chắc chắn (uncertain phenomena).

  1. (*) van der Vaart, Asymptotic statistics, Cambridge Univ Press.
  2. (*) D. Pollard, Convergence of stochastic processes. Free on-line!
  3. (*) P. Billingsley, Convergence of probability measures, Wiley, 1968. Kinh điển.
  4. (+) A. van der Vaart & J. Wellner, Weak convergence and empirical processes, 1998.
  5. (+) S. van de Geer, Empirical processes in M-estimation, Cambridge Univ Press, 2000.
  6. L. Le Cam, Asymptotic Methods in Statistical Decision Theory, 1986.

Le Cam là một trong những nhà thống kê lý thuyết sâu sắc nhất của thế kỷ vừa rồi, nhưng quyển này khá khó nhằn.

  1. I. Johnstone. Theory of function estimation. Free on-line.
  2. P. Bickel, C Klassen, Y. Ritov & J. Wellner, Efficient and adaptive estimation for semiparametric models, Springer 1993. Nhiều bài báo trên Annals of Statistics hóa ra chỉ giải quyết một khía cạnh nào đó của một vấn đề tổng quát hơn trong quyển sách này. Tuy nhiên ngay cả các tác giả cũng khiêm tốn nói là họ chỉ phát triển những ý tưởng căn bản của Le Cam mà thôi.


Sẽ tiếp tục cập nhật! Không biết bao giờ mới xong.

Đăng bởi

CÁCH PHÂN BIỆT VÀ NHẬN BIẾT IPHONE ZIN (Chưa qua sửa chữa)

Chỉ cần một chút hiểu biết về phần cứng, các bạn có thể tự kiểm tra xem chiếc iPhone của mình có nguyên zin, chưa qua sửa chữa hay không.

Trong Phần II này, Hoàng Kiên xin giới thiệu các bước cơ bản nhất để phân biệt và nhận biết một chiếc iPhone zin (Chưa qua sửa chữa).

1. MÀN HÌNH

a. Kiểm tra bên ngoài

  • Tâm camera trước chính giữa khung camera
  • Với máy trắng thì phần kính trắng bao quanh ngả sang màu sứ trắng và đường cắt viền quanh lỗ tai nghe sẽ rất thẳng không có gợn song
  • Gioăng máy ôm bo đều lên phần kính, nếu có bị hở hoặc bập bênh cần yêu cầu mở máy ra xem ( hoặc màn ép hoặc pin đã bị phồng gây kênh màn )
  • Phần LCD đen hiển thị bên trong không bị xước hay có vết khi tắt màn hình.
  • Với iphone 6/6plus lấy tay miết nhẹ trên loa trong và phần nút home thấy có gợn tay vì phần kính đó được cắt cnc thẳng nên sẽ có gợn tay.Nếu khi thấy có vát thì đó là màn ép kính

b. Kiểm tra bên trong

  • Khi mở máy bên trong màn zin sẽ có tem của Apple còn màn ép và màn fake sẽ không có (Tem zin màn hình chính là tem màu đen góc trái của máy, Tem trên sẽ ăn trực tiếp trên kính của màn hình )
  • Bộ cáp trên màn để gắn trên chân main có màu đen đậm và phủ một lớp rám như bột đen. 
  • Trên các cáp màn có các thông tin của hãng.

2. VỎ

a. Kiểm tra bên ngoài

  • Với 5/5s các đường cắt CNC bao quanh thân máy sẽ mịn và sáng khi để nghiêng. Với vỏ thay loại thấp cấp thì thường khi nghiêng sẽ có những hình răng cưa quanh thân máy.( Ảnh chi tiết rất khó nhìn nên được minh họa bằng ảnh vỏ zin ). Khi lấy móng tay cạo trên thành của vỏ lô sẽ có tiếng rột roạt do không phẳng còn trên vỏ zin sẽ ko có.
  • Với 6/6 plus nhìn tâm camera sau không bị lệch và lỗ mic phụ sẽ rất tròn. Khi nghiêng nhìn vào đèn flash không bị xô lệch
  • Imei máy khắc trên vỏ có kích thước và độ sâu đồng đều, nét rất thanh và mịn
  • Khi nhìn nghiêng phần chân sạc các lỗ nhỏ trên mic chính và loa ngoài sẽ thấy có ánh gương. Vì các lỗ nhỏ trên mic chính và loa trong được gia công CNC quanh miệng lỗ.
  • Cầm trên tay vỏ zin thường có cảm giác mịn và rám đều. Còn vỏ fake có cảm giáp thô không mịn và thường có cảm giác sắc ở các cạnh cắt

b. Kiểm tra bên trong

Khi bóc máy nhìn bên trong vỏ zin iphone có khắc laze mã lô vỏ trong quá trình sản xuất. Mà vỏ lô không có những ký hiệu đó

  • Các tấm seal pin còn nguyên chưa bị mất

3. MAIN

  • Các tem dán mặc định của Apple phải còn nguyên vẹn
  • Các lồng thép trên main phải trắng thẳng và không cong vênh
  • Các chân hàn trên lồng chưa có giấu hiệu bị tháo bị khò
  • Các chip trên main còn độ đều mượt không phát hiện keo bẩn
  • Giấy quỳ trên main chưa đổi sang màu đỏ ( đổi màu đỏ là main đã bị rơi xuống nước )

Còn với những linh kiện khác như loa trong, loa ngoài, phím nguồn, phím tăng giảm âm lượng, pin ….. , do giá thành thay thế thấp và có thể lựa chọn thay thế bằng hàng chính hãng hoặc zin bóc máy, vì thế nên có thể tạm bỏ qua và check kỹ 3 phần trên.

Đăng bởi

Làm IT nên đọc ebook của nhà xuất bản nào?

Có lẽ dân làm IT thì không còn xa lạ với việc…đọc ebook. Mình hay gặp 1 số bạn hay than phiền là đọc ebook mỏi mắt và lại thường là tiếng Anh nên không hiểu do đó không đọc ebook được ^^!. Nếu các bạn đang trên con đường phát triển CNTT mà bị tình trạng như thế thì cũng hơi lo ngại cho bạn, bởi lẽ nếu bạn không đọc được ebook thì bạn khó mà “đứng” trong ngành với tốc độ và kỹ thuật “khắc nghiệt” như ngành này.

Mình xưa giờ là 1 tín đồ trung thành của ebook, chỉ khi nào gặp 1 cuốn sách cực kỳ hay thì mới phải in ra để nghiền ngẫm, chứ in hết ra có nước đầy nhà. Hồi trước cũng có làm 1 site “sinh viên phục vụ sinh viên”, cung cấp ebook cho người Việt Nam nhưng mình đã đánh giá sai lầm thì trường ebook ở Việt Nam nên dự án website đó đã thất bại ^^ với lại hồi đó sinh viên nên cũng không có gì để theo đuổi ngoài việc mua cái domain :D.

Mình cũng hay lang thang trên mấy diễn đàn và thấy hầu hết các câu hỏi liên quan đến IT đều nằm trong các cuốn sách cực kỳ căn bản, nhưng điều đáng buồn là những câu hỏi đó cứ lặp đi lặp lại và theo chu kỳ thì nó sẽ còn tiếp diễn :D. Thay vì ngồi chờ người ta trả lời sao không kiếm đại cuốn sách nào cùng chủ đề, lướt qua 1 lần mục lục hoặc index để tìm giải pháp hoặc google cho nhanh.

Bài viết này chẳng phải phê phán các bạn không chịu đọc ebook hay ý gì mà chỉ là lời khuyên cho những bạn nào hiện chưa coi ebook là 1 vũ khí đắc lực trong kho vũ khí kiếm tiền của mình. Bài viết này mình sẽ giới thiệu tới các bạn 7 nhà xuất bản sách nổi tiếng trong lĩnh vực CNTT mà cụ thể là ngành phát triển web, để nếu không có thời gian thì cũng nên đọc những sách của nhà xuất bản này trước vì cách viết sách và trình bày rất dễ hiểu và đọc tiếp thu nhiều hơn. Sách của các nhà xuất bản này khá dễ để nhận diện, hầu như nhìn cái bìa sách là biết của nhà xuất bản nào liền.

7 nhà xuất bản mình muốn đề cập tới trong bài viết này là: O’ReillyFor DummiesWroxApressPACKT PublishingManning và Addison Wesley.

1.O’Reilly


– Các sách của O’reilly khá dễ nhận diện. Thường với 2 tông màu chủ đạo là đen và trắng và 1 màu sắc khác như xanh, đỏ, cam…và mỗi cuốn sách thường có 1 hình minh họa (dạo này thấy toàn động vật ^^). Sách của O’Reilly tương đối dễ đọc và thường không dài. Bố cục sách thì ok và cách dùng từ cũng đơn giản nên không gây khó khăn cho anh em ta nhiều khi đọc hiểu tiếng anh.

2.For Dummies


– Sách của nhà xuất bản này rất dễ biết. Với tông màu chủ đạo là vàng và đen, ngoài bìa thì có hình 1 thằng đeo kính nhìn rất là..dummy. Sách thuộc nhà xuất bản này cũng dễ đọc, vì thể loại khá phong phú (hầu hết món nào cũng có: tin học, cuộc sống, kinh doanh….) và dàn trải nên các sách không chuyên sâu lắm. Tuy nhiên, bố cục rất dễ đọc, sử dụng tiếng anh đơn giản, thậm chí còn dễ hơn O’Reilly và cách tóm tắt cũng như hiển thị các ý chính khiến sách này rất dễ đón nhận.

3.Wrox


– Sách của Wrox khá dễ nhận ra, đó là một màu đỏ nằm ở nữa dưới cuốn sách và tựa đề có màu vàng. Phần trên thì in hình trắng đen của các tác giả.

– Sách của Wrox thuộc dạng Intermediate nên nếu bạn nào ở trình độ căn bản đọc sẽ khá phức tạp. Tuy nhiên, những sách của NXB này tập trung chủ yếu vào mảng Programmer (Programmer to Programmer) nên nó hầu hết các đầu sách về các công nghệ mới. Cách dùng từ thuộc dạng hơi khó hiểu, tuy nhiên nếu đọc quen thì sách của wrox đọc rất có giá trị vì tính thực tiễn của nó.

4.Apress


– Sách của Apress thì có 2 màu chủ đạo là đen và vàng nên cũng khá dễ nhận diện. Tiêu đề màu vàng trên nền đen kèm với 1 biểu tượng hoa văn bên góc trên bên phải của sách là 1 điểm độc đáo của bìa sách này.

– Mặc dù ra đời gần đây, nhưng các đầu sách của Apress cũng thuộc dạng nắm bắt kịp các công nghệ lập trình mới nên sách của Apress đọc cũng khá hay. Các sách của Apress thiên về Web Developer hơn các công nghệ khác. Nếu so về độ phức tạp thì dễ hơn của Wrox một chút và thường ít có sách nào có cấp độ Intermediate. Sách của Apress hầu hết là sách hay nên bạn cố gắng đừng bỏ qua cuốn nào nhé (đọc sách liên quan đến ngành mình thôi nha, nếu rảnh rỗi đọc hết thì quá tài ^^). Lối hành văn cũng không phức tạp lắm nên sách cũng dễ hiểu.

5.PACKT Publishing


– Sách của PACKT Publishing hao hao với sách của apress, bìa sách sử dụng 2 màu đen và cam làm chủ đạo và tựa đề là màu trắng trên nền đen. Nữa trên của cuốn sách thường là 1 hình gì đó mô tả về cuộc sống, tự nhiên…
– Về cách trình bày và sử dụng từ thì có thể nói nó cũng ngang tầm với Apress, sách trình bày khá tốt và số đầu sách cũng khá nhiều chủ đề trong IT, không như Apress thường tập trung vào đối tượng Web Developer.

6.Manning


– Sách của Manning rất dễ nhận diện đó là trên bìa sách sẽ có 1 dải màu chạy bên trái và có hình vẽ minh họa 1 nhân vật lịch sử nào đó. Kèm với dòng chữ “in action” trong tiêu đề là điểm nhận dạng của sách này.
– Sách của Manning viết cũng thuộc dạng khó và sách chủ yếu tập trung cho đối tượng Programmer nên đọc khá là khó hiểu. Tuy nhiên các sách của Manning viết khá hay về độ sâu và có nhiều kiến thức mới cũng như những đầu sách lạ. Đọc dạng sách này tiếng anh lên cũng khá lắm ^^.

7.Addison Wesley


– Sách của Addison Wesley thường không có một đặc điểm nhận dạng chung ngoài cái logo là 3 hình tam giác. Sách của Addison thiên về Programming, Network system nên các sách cũng khó đọc và cách dùng từ cũng thuộc dạng “xương”.
– Tuy nhiên, sách của Addison Wesley được mình liệt vào dạng sách quý hiếm vì hầu hết sách của NXB này đều là sách chuyên sâu và hay, đồng thời với các kiến thức mở rộng khá phong phú. Sách của NXB này thường khá dày, độ khoảng >600 trang / cuốn.
—————
Trên đây mình đã giới thiệu với các bạn 7 nhà xuất bản sách phục vụ cho dân IT mà nếu đã làm IT thì chắc hẳn đã từng 1 lần đọc sách của họ. Ngoài các nhà xuất bản này ra, còn rất nhiều nhà xuất bản mà có những sách rất hay, tuy nhiên những sách đó thuộc dạng hàn lâm nên cũng hơi bị khó đọc. Mặc dù nói như vậy, nhưng nếu đã thích đọc thì sách của của ai cũng đọc tuốt, cái gì cũng đọc, đâu nhất thiết là đọc sách IT đúng không 😀 !
Hãy tập thói quen đọc sách mỗi ngày nhé các bạn!