12/26/2021

LaTeX cho người mới bắt đầu với 7 videos | Kỹ năng


Như các bạn đã biết, Latex là một công cụ soạn thảo các văn bản khoa học chuyên nghiệp, đặc biệt là các công thức Toán học với nhiều công dụng vô cùng hữu ích, có thể chạy hoàn toàn miễn phí trên hệ thống phần cứng và các hệ điều hành khác nhau.

Latex có rất nhiều ưu điểm nội nổi trội so với các công cụ soạn thảo khác, như:

  • Latex tạo ra văn bản chất lượng cao, chuyên nghiệp và đẹp mắt. Văn bản tạo ra bởi Latex có chất lượng in ấn rất cao

  • Hỗ trợ soạn thảo các công thức toán, các hình vẽ, mã nguồn lập trình, tạo các cấu trúc phức tạp như chỉ mục, mục lục, phụ lục, tài liệu tham khảo một cách dễ dàng.

  • Latex tạo ra văn bản có dung lượng tập tin nhỏ, tiện dụng trong việc lưu trữ trong đĩa mềm.

  • Latex cho phép tách nội dung văn bản độc lập ra khỏi hình thức trình bày. Điều này cho phép người soạn thảo chỉ cần tập trung vào nội dung mà không cần tốn thời gian làm đẹp phần trình bày.

  • Latex khắc phục được một số vấn đề của Word: không có sự thông nhất về định dạng trong toàn văn bản, thường có lỗi trong các tham chiếu chéo, khó khăn trong việc gõ các công thức...

  • Latex là phần mềm mã nguồn mở, liên tục được phát triển và cải tiến. Có cộng đồng người dùng rộng khắp trên thế giới và Latex community luôn sẵn sàng giải đáp mọi thắc mắc và khó khăn của bạn qua Internet.

Nếu các bạn theo các con đường nghiên cứu thì LaTeX chính là phần không thể thiếu vì nó là bắt buộc để viết một bài báo khoa học. Ngoài ra, nếu bạn sử dụng LaTeX để làm báo cho cho đồ án môn học hay đồ án tốt nghiệp thì sẽ được đánh giá rất cao (các trường hợp này mình đều đã gặp), báo cáo làm bằng LaTeX đẹp hơn rất nhiều so với một báo cáo bằng Word.

BCH Liên chi đoàn - Liên chi hội Viện Toán Ứng dụng và Tin học cũng đã từng rất nhiều lần tổ chức các khóa học LaTeX BASICS. Nhưng với quan điểm của mình, những thứ kiểu như "cho người mới bắt đầu", "BASICS" thì có thể tự học được, tham gia các khóa học mặc dù được chỉ bảo, hỏi đáp trực tiếp nhưng mất thời gian vào các khóa BASICS là không cần thiết.

LaTeX nó cũng gần giống như các ngôn ngữ lập trình mà các bạn học vậy, muốn sử dụng chúng ta phải cài vào môi trường và có một công cụ soạn thảo trên máy. Tuy nhiên, bây giờ có rất nhiều các trang web hỗ trợ soạn thảo LaTeX online cực kì tiện lợi, một công cụ phổ biến mà mình thấy các thầy/cô cũng thường sử dụng để viết các bài báo là https://www.overleaf.com/. Việc làm việc online cũng đem lại những lợi ích nhất định khi mọi người có thể cùng nhau chỉnh sửa một bài, có thể chia sẻ lẫn nhau xem trước khi xuất bản,...

Overleaf cũng giới thiệu chuỗi 7 video hướng dẫn học LaTeX cho người mới bắt đầu, các bạn có thể tham khảo toàn bộ khóa học TẠI ĐÂY (HUST & PI cũng mong muốn sẽ dịch được phần transcript của các video bài học này sang tiếng Việt để cho mọi người có thể tham khảo dễ hơn, tuy nhiên hiện tại vẫn chưa thể làm được do vấn đề thời gian và nhân lực).

LaTeX video tutorial for beginners: 

Video 1: 

Video 2: 

Video 3: 

Video 4: 

Video 5: 

Video 6: 

Video 7: 

12/17/2021

Hướng dẫn lab 5 | Môn lưu trữ và xử lý dữ liệu lớn


Các bạn học môn lưu trữ và xử lý dữ liệu lớn của thầy Đào Thành Chung sẽ phải làm 5 bài lab, trong bài viết này mình sẽ hướng dẫn mọi người chạy bài lab số 5 (lab về Spark Streaming), xem yêu cầu của bài lab TẠI ĐÂY

Chú ý

- Trong hướng dẫn của thầy, có một số hướng dẫn đã quá cũ và không thể chạy được nếu bạn làm theo y nguyên trong hướng dẫn của thầy. Mình đã sửa lại 2 project trong lab cho phù hợp, các bạn chỉ cần clone về và làm theo hướng dẫn của mình dưới đây.

- Project của thầy và project mình sửa lại đều chạy với Spark Single node, nên nếu bạn cài với cụm Multi node thì hãy sửa đổi các địa chỉ hostname từ localhost thành địa chỉ máy master, chỗ nào cần sửa mình đã lưu ý bôi đậm, các bạn chú để sửa lại cho đúng.

Bài 1: Socket Stream

Clone toàn bộ project sau về máy để chuẩn bị chạy nha: https://github.com/demanejar/socket-stream.

Trong project có 2 file chính, một là file SocketStream.scala:

object SocketStream {
    def main(args : Array[String]){
        val conf = new SparkConf().setAppName("Socket-Stream")
        val ssc = new StreamingContext(conf, Seconds(1))
        val lines = ssc.socketTextStream("localhost", 7777)
        val errorLines = lines.filter(_.contains("error"))
        errorLines.print()
        ssc.start()
        ssc.awaitTermination()
    }
}

  • Để có thể submit job này với spark-submit thì bạn phải build chúng thành một file .jar, với scala thì chúng ta sẽ sử dụng sbt

  • Lưu ý: nếu bạn chạy cụm Spark nhiều máy, thì hãy đổi địa chỉ hostname từ localhost thành địa chỉ máy master nha

Khởi động Spark và kiểm tra địa chỉ của master thông qua cổng 8080 (spark://PC0628:7077):

Build project vừa rồi thành file .jar với câu lệnh:

sbt clean package

Chạy spark-submit với file jar vừa bulid được:

spark-submit --master spark://PC0628:7077 --class SocketStream target/scala-2.11/socket-stream_2.11-0.0.1.jar

  • Tham số master là địa chỉ của master mà bạn vừa lấy ở bên trên

  • Tham số class là đường dẫn tới hàm main của project

Mở một terminal khác lên và chạy lệnh sau để bắt đầu gửi text qua cổng 7777:

nc -l 7777

Kết quả in ra màn hình và sẽ vụt qua rất nhanh:



Bài 2: Log Analyzer

Clone toàn bộ project về máy để chuẩn bị chạy nha: https://github.com/demanejar/logs-analyzer.

Mình sẽ đi qua giải thích từng file để mọi người hiểu hơn về project, đầu tiên là file đầu vào log.txt, file này chứa 1546 dòng log, các log đều có cấu trúc giống nhau, công việc của project này chính là nhận đầu vào từ file log này và đưa ra các phân tích, thống kê về trên tập log này.

File stream.sh là một file shell script với nhiệm vụ là đọc dữ liệu từ file log.txt và đẩy chúng qua cổng 9999.

File build.sbt thì giống với project trước, file này để khai báo các thư viện, phụ thuộc để có thể build project thành một file .jar

Cuối cùng là project của chúng ta viết bằng scala với 2 file ApacheAccessLog.scalaLogAnalyzerStreaming.scala. File LogAnalyzerStreaming.scala sẽ lắng nghe ở cổng 9999, lấy dữ liệu và tiến hành tổng hợp, phân tích chúng.

  • Lưu ý: nếu bạn chạy cụm Spark nhiều máy, thì hãy đổi địa chỉ hostname  trong file LogAnalyzerStreaming.scala từ localhost thành địa chỉ máy master nha

Khởi động Spark và kiểm tra địa chỉ của master thông qua cổng 8080 (spark://PC0628:7077):

Build project vừa rồi thành file .jar với câu lệnh dưới đây, lần đầu build có thể các bạn sẽ phải đợi khá lâu vì nó phải tải xuống các thư viện, trong các lần build sau sẽ nhanh hơn:

sbt clean package

Chạy spark-submit với file jar vừa bulid được:

spark-submit --master spark://PC0628:7077 --class LogAnalyzerStreaming target/scala-2.12/log-analyzer_2.12-0.0.1.jar

  • Tham số master là địa chỉ của master mà bạn vừa lấy ở bên trên

  • Tham số class là đường dẫn tới hàm main của project

Trong bài viết trước, chúng ta đã gửi dữ liệu thông qua socket bằng tay, trong bài này vẫn là socket tuy nhiên chúng ta sẽ viết một chương trình để chúng tự động gửi dữ liệu và chúng ta chỉ việc ngồi chờ kết quả thôi.

Như mình giải thích ở ban đầu, file stream.sh là một file shell script với nhiệm vụ là đọc dữ liệu từ file log.txt và đẩy chúng qua cổng 9999. Sử dụng câu lệnh sau để bắt đầu chạy:

./stream.sh log.txt

  • Với log.txt viết ở phía sau thể hiện log.txt là một tham số đầu vào của chương trình viết trong file .stream.sh

  • Lưu ý: nếu bạn chạy cụm Spark nhiêu máy thì file này phải được chạy trên máy master 

Kết quả in ra màn hình cũng sẽ vụt qua rất nhanh, các bạn có thể kéo terminal lên để nhìn

Mở cổng 4040 để xem lại chi tiết các job vừa thực hiện (localhost:4040):


Tham khảo: https://demanejar.github.io/

11/12/2021

C/C++ có thực sự cần thiết? Giới thiệu các IDE, Text Editor sử dụng cho lập trình C/C++


C/C++ có thực sự cần thiết?

C/C++ là ngôn ngữ dùng và giảng dạy trong hầu hết các môn học liên quan tới các môn cơ sở cốt lõi ngành CNTT như tin đại cương, cấu trúc dữ liệu, kỹ thuật lập trình, thuật toán ứng dụng,... tại Bách Khoa và hầu hết các trường đại học khác vì tính "nền tảng của C/C++".

Trong phần này mình sẽ giải thích cho các bạn vai trò của C/C++, và với sự phát triển mạnh mẽ của các ngôn ngữ lập trình bậc cao thì C/C++ có thực sự cần thiết?

- Câu trả lời của mình về C/C++ là cần thiết (*).

- Đầu tiên là mình muốn nói về C/C++ còn được các công ty sử dụng hay không?, chúng ta hãy xem danh sách các ngôn ngữ mà các công ty lớn đang sử dụng cho sản phẩm/dịch vụ của họ nha (Ảnh: Wiki - 2021): 

Như mọi người thấy C++ được hầu hết các ông lớn sử dụng ở phía server vì hiệu năng, tốc độ của nó là cực kì tốt.

- C/C++ gần với ngôn ngữ máy tính nhất nên qua đó, bạn có thể hiểu được bên dưới thật sự máy tính nó đang làm gì, cấp phát bộ nhớ ra sao, hoạt động như thế nào.

- C/C++ là cơ sở để xây dựng rất nhiều ngôn ngữ khác như Python, các thư viện hay core của Python đều được viết bằng C++, vì thế khi hiểu rõ bạn có thể tác động sâu hơn vào các ngôn ngữ này, cái này khá là hay mà khi mà mình đã bị bạn mình khuất phục bằng những thứ mình nghĩ là không thể nếu chúng ta chỉ là người giỏi ngôn ngữ Python mà không hiểu hệ thống bên dưới nó được chạy thế nào.

- Nhiều ngôn ngữ lập trình khác được phát triển dựa trên nền tảng C++, bao gồm C#, D, Java và các phiên bản mới hơn của C. Vậy nên các cấu trúc, câu lệnh, khai báo biến,... đều có phần giống với C/C++. Vì thế khi bạn học xong C/C++ thì tiếp cận các ngôn ngữ khác cũng dễ dàng hơn.

- Lập trình viên C/C++ được trả lương rất cao

Tuy nhiên chúng ta cần quay lại (*) ở bên trên, mình đã nói rằng C/C++ là cần thiết tuy nhiên chúng không phải là tất cả, bạn có thể bước vào và trở thành một lập trình viên mà không cần biết cũng như cần học qua C/C++. Với các bạn sinh viên và đặc biệt là sinh viên Bách Khoa thì C/C++ được sử dụng làm ngôn ngữ giảng dạy trong một số môn thì lời khuyên của mình là các bạn hãy cố gắng học cho tốt chú đừng cố kêu ca rằng nó đã lỗi thời và không còn được sử dụng.

Các IDE, Text Editor sử dụng cho lập trình C/C++

Khi năm nhất cũng mới học tin đại cương thôi, lúc ấy cũng là dân mới vào nghề, mình cũng không biết là dùng IDE gì để code C/C++, cũng đã thử cài vào rồi gỡ ra rất nhiều ứng dụng. Trong phần này mình sẽ chia sẻ tới mọi người một số IDE, Text Editor phổ biến cho lập trình C/C++ và các ưu, nhược điểm của nó để các bạn có thể chọn ra IDE, Text Editor phù hợp cho mình nha.

Dev-C/C++

Cái tên gạo cội thì phải nhắc tới Dev-C/C++, nó là IDE chính được sử dụng trong môn tin học đại cương, nó dễ cài đặt, dễ sử dụng và nhẹ tuy nhiên chưa phải là một IDE mạnh. Thường thì Dev-C/C++ sử dụng cho người mới bắt đầu.

Codeblocks

Codeblocks là IDE mà mình thấy là phù hợp cho việc học thuật toán và nó cũng được các thầy/cô giáo trong môn thuật toán ứng dụng gợi ý sử dụng. Codeblocks cũng rất dễ cài đặt, sử dụng và nhẹ. Với góc độ thuật toán thì Codeblocks là một IDE khá mạnh, tuy nhiên với project lớn phải chia các mô-đun thì mình thấy là Codeblocks chưa đủ mạnh.

Eclipse / Netbeans

C/C++ như là nghề tay trái khi nhắc tới 2 IDE này. Netbeans hay Eclipse đều là các IDE mạnh mẽ hỗ trợ Java và thường sử dụng cho các lập trình viên Java (Eclipse thì có cả 1 hệ sinh thái các ứng dụng của riêng chúng). 

Điểm mạnh của 2 IDE này là mã nguồn mở, hoàn toàn free cho người dùng và rất mạnh mẽ. Tuy nhiên thì việc sử dụng 2 IDE này trong 2 môn tin đại cương hay thuật toán ứng dụng có vẻ là hơi to và nặng.

Clion

Clion là một sản phẩm của Jetbrains và như mình đã viết trong một số bài viết thì các sản phẩm của Jetbrains là miễn bàn, ngon khỏi chê. 

Tuy nhiên Clion rất nặng, như với Netbeans và Eclipse thì Clion dành cho các project lớn. Còn nữa, Clion là không có bản miễn phí, nhưng với sinh viên chúng ta hoàn toàn có thể sử dụng miễn phí Clion mà không tốn một đồng nào từ mail edu của các bạn, bạn có thể xem lại bài hướng dẫn Mail edu của trường làm được gì để nhận và sử dụng miễn phí tất cả các sản phẩm của Jetbrains.

VSCode / Sublime Text

VSCode hay Sublime Text đều là các Text Editor, và muốn sử dụng chúng cho bất cứ ngôn ngữ hay framework nào thì các bạn phải cài thêm các extension hỗ trợ, và việc mày mò cài thêm  các extension cho từng ngôn ngữ là rắc rối. Thường thì những pro mới dùng editor để code, lời khuyên của mình nếu các bạn là newbie thì hãy lựa chọn Dev-C hoặc Codeblocks chứ đừng bem ngay vào 2 editor này.

Một editor nữa mình giới thiệu luôn ở phần này đó là vim, cũng giống như VSCode hay Sublime Text, bạn muốn sử dụng chúng cho các ngôn ngữ hay framework nào thì phải cài thêm các extension hỗ trợ. Vim thì sử dụng rất khó, cài đặt thêm các extension cũng khó. Thường thì các super-pro mới dùng vim để code.

replit

Cái này là một IDE online hỗ trợ khá nhiều các ngôn ngữ. Vì là online nên rất tiện vì các bạn không cần phải cài đặt, chỉ cần một trình duyệt có mạng là có thể vào code luôn, dùng mọi nơi chỉ cần là có máy tính nối mạng không cần phải cài môi trường hay gì cả. 

Tuy nhiên vì là online nên có rất nhiều hạn chế như các thư viện không đủ, các trình gợi ý code chưa đủ mạnh,...

Tham khảo: https://en.wikipedia.org/https://codelearn.io/

11/01/2021

Tổng hợp các câu hỏi về Apache Hadoop | Ôn tập cuối kì môn Lưu trữ và xử lý dữ liệu lớn


Câu 1: Mục tiêu chính của Apache Hadoop 

Lưu trữ dữ liệu khả mở và xử lý dữ liệu mạnh mẽ. Tiết kiệm chi phí khi lưu trữ và xử lý lượng dữ liệu lớn.

Bạn có thể xem thêm chi tiết mục tiêu của Hadoop [TẠI ĐÂY]

Câu 2: Hadoop giải quyết bài toán chịu lỗi thông qua kỹ thuật gì

- Hadoop chịu lỗi thông qua kỹ thuật dư thừa

- Các tệp tin được phân mảnh, các mảnh được nhân bản ra các node khác trên cụm

- Các công việc cần tính toán được phân mảng thành các tác vụ độc lập 


Câu 3: Mô tả cách thức 1 client được dữ liệu trên HDFS

Client truy vấn namenode để biết được vị trí các chunks. Namenode trả về vị trí các chunks. Client kết nối song song với các datanode để đọc các chunk.

Bạn có thể xem chi tiêt quá trình đọc dữ liệu này [TẠI ĐÂY]


Câu 4: Mô tả cách thức 1 client ghi dữ liệu trên HDFS

Client kết nối tới namenode để chỉ định khối lượng dữ liệu cần ghi. Namnode chỉ định vị trí các chunk cho client. Client khi chunk tới datanode đầu tiền, sau đó các datanode tự động thực thi nhân bản. Quá trình kết thúc khi tất cả các chunk và nhân bản đã được thực thi thành công. 

Bạn có thể xem chi tiêt quá trình ghi dữ liệu này [TẠI ĐÂY]


Câu 5: Các thành phần chính trong Hadoop Ecosystem

Hadoop Ecosytem là một nền tảng cung cấp các giải pháp để lưu trữ và xử lý lượng lớn dữ liệu. 

Các thành phần chính trong Hadoop Ecosytem là: 

- HDFS 

- Mapreduce framework 

- YARN

- Zookeeper


Câu 6: Cơ chế chịu lỗi của datanode trong HDFS

Sử dụng cơ chế heartbeat, định kì datanode sẽ gửi thông báo về trạng thái cho namenode. Khoảng thời gian mặc định mà datanode gửi heartbeat về cho namenode là 3s, sau 3s mà datanode không có gửi thông tin về cho namenode thì mặc định namenode coi là node đó đã chết và nhiệm vụ chưa hoàn thành của node đó sẽ được trao lại cho node mới.

Để cấu hình lại thời gian heartbeat thì bạn có thể thêm đoạn XML sau vào trong file hdfs-site.xml như sau: 

<property>

<name>dfs.heartbeat.interval</name>

<value>3</value>

</property>



<property>

<name>dfs.namenode.heartbeat.recheck-interval</name>

<value>300000</value>

</property>

Bạn có thể xem các cấu hình mặc định của hdfs-site.xml [TẠI ĐÂY]


Câu 7: Cơ chế tổ chức dữ liệu của datanode trong HDFS

Files trong HDFS được chia thành các khối có kích thước cố định được ( block-sized chunks) gọi là data block. Các block được lưu trữ như các đơn vị độc lập (kích thước của 1 block mặc định là 128MB). 

 Các chunk là các tập tin hệ thống trong tập tin cục bộ của máy chủ datanode


 Xem thêm[Vấn đề gì xảy ra nếu lưu trữ các file nhỏ trên HDFS?]

 

Câu 8: Cơ chế nhân bản dữ liệu trong HDFS

Các block của file được nhân bản để tăng khả năng chịu lỗi. Namenode là node đưa ra tất cả các quyết định đến việc nhân rộng các khối. 


Câu 9: HDFS giải quyêt bài toán single-point-of-failure cho namenode bằng cách nào 

Sử dụng Secondary Namenode theo cơ chế active-passive. Secondary Namenode chỉ hoạt động khi có vấn đề với Namenode

Các bạn có thể xem chi tiết về Secondary Namenode [TẠI ĐÂY]


Câu 10: 3 chế độ mà Hadoop có thể chạy? 

- Standalone mode: đây là chế độ mặc định, Hadoop sử dụng local FileSystem và 1 tiến trình Java duy nhất để chạy các dịch vụ Hadoop.

- Pseudo-distributed mode: triển khai Hadoop trên 1 node để thực thi tất cả các dịch vụ.

- Fully-distributed mode: triển khai Hadoop trên 1 cụm máy với namenode và datanode.


Câu 11: Giải thích Bigdata và tiêu chí 5V của Bigdata

Bigdata là thuật ngữ chỉ tập dữ liệu lớn và phức tạp và rất khó để xử lý bằng các công cụ dữ liệu quan hệ, các ứng dụng xử lý dữ liệu truyền thống. 

5V trong Bigdata là: 

- Volume: Volume thể hiện lượng dữ liệu đang tăng với tốc độ cấp số nhân, tức là bằng Petabyte và Exabyte.

- Velocity: Velocity đề cập đến tốc độ dữ liệu đang phát triển, rất nhanh. Hôm nay, dữ liệu của ngày hôm qua được coi là dữ liệu cũ. Ngày nay, mạng xã hội là một yếu tố đóng góp lớn vào tốc độ phát triển của dữ liệu.

- Variety: Variety đề cập đến sự không đồng nhất của các kiểu dữ liệu. Nói cách khác, dữ liệu được thu thập có nhiều định dạng như video, âm thanh, csv, v.v. Vì vậy, các định dạng khác nhau này đại diện cho nhiều loại dữ liệu.

- Veracity: Veracity đề cập đến dữ liệu bị nghi ngờ hoặc không chắc chắn của dữ liệu có sẵn do dữ liệu không nhất quán và không đầy đủ. Dữ liệu có sẵn đôi khi có thể lộn xộn và khó tin cậy. Với nhiều dạng dữ liệu lớn, chất lượng và độ chính xác rất khó kiểm soát. Khối lượng thường là lý do đằng sau sự thiếu chất lượng và độ chính xác của dữ liệu.

- Value: Tất cả đều tốt và tốt khi có quyền truy cập vào dữ liệu lớn nhưng trừ khi chúng ta có thể biến nó thành một giá trị.


Bài viết được tham khảo tại: https://demanejar.github.io/


10/18/2021

Chia sẻ các website học Machine Learning, Deep Learning và liên quan | Share


Nếu các bạn học Khoa học máy tính thì sẽ có 1 mô đun có môn học sâu và ứng dụng. Môn học sẽ giới thiệu tới mọi người các kĩ thuật cơ bản của học sâu, ứng dụng của học sâu, các phần cứng, phần mềm sử dụng trong học sâu,... Nhưng về cơ bản thì mọi thứ chỉ là mang tính giới thiệu là chính. 

Nếu muốn đi theo hướng này thì các bạn hãy tự mình tìm hiểu thêm, xin lên lab các thầy cô để được các thầy, các anh chị hướng dẫn và quan trọng hơn trên nếu cố gắng thì các bạn sẽ được các thầy cô giới thiệu tới các công ty để giành những suất học bổng, việc làm,...

Trong bài viết này mình sẽ chia sẻ tới mọi người một số website tốt nhất hỗ trợ việc học AI, ML, DL.

https://stanford.edu/~shervine/l/vi/

Blog của tác giả Shervine Amidi và người anh em song sinh của anh là Afshine Amidi. Website chia sẻ lại các nội dung là kết quả sau quá trình làm trợ giảng tại đại học Stanford gồm rất nhiều các phần, mục hay: 

  • Trí tuệ nhân tạo

  • Học máy

  • Học sâu

  • Phương trình vi phân thường

  • Xác suất và thống kê

Tek4 - tự học Tensorflow

Tensorflow là một thư viện deep learning mã nguồn mở được phát triển bởi Google và đây là một trong những công cụ phổ biến nhất sử dụng trong deep learning. Loạt bài viết này của Tek4 rất phù hợp cho người mới bắt đầu, biết ít hoặc chưa biết về tensorflow.

https://machinelearningcoban.com/

Chắc chắn là không thể thiếu website của anh Tiệp machinelearningcoban. Anh Vũ Hữu Tiệp là tiến sĩ ngành học máy và thị giác máy tính tại Đại học bang Pennsylvania (Pennsylvania State University), Hoa Kỳ. Blog này mình nghĩ khá là nổi tiếng vì có ranking khá cao trên Google và nếu mình không chia sẻ thì nhiều người cũng sẽ biết tới blog này rồi.

https://nttuan8.com/

Chúng ta đã có blog về machine learning cơ bản vậy thì cũng không thể thiếu blog deep learning cơ bản được. 


Blog deep learnig cơ bản được viết bởi tác giả Nguyễn Thanh Tuấn là thạc sĩ chuyên ngành Machine Learning, đại học Bristol, Anh Quốc. 

Anh Tuấn cũng là tác giả cuốn sách Deep Learning cơ bản. Blog của anh Tuấn cũng chia sẻ các các kiến thức về deep learning, Pytorch, mô hình GAN.

https://trituenhantao.io/

trituenhantao.io cũng là một cộng đồng lớn chia sẻ các kiến thức về AI, ML và DL, các bài viết về công nghệ, các tin tức về trí tuệ nhân tạo trên thế giới. Các bạn có thể tham gia đóng góp bài viết cùng với trituenhantao.io tại community.trituenhantao.io (bạn sẽ nhận được hoa hồng khi đóng góp các bài viết trên community.trituenhantao.io nhận từ Medium).

CS224N: Natural Language Processing with Deep Learning


Đây là loạt video bài giảng về xử lý ngôn ngữ tự nhiên với deep learning được đăng trên kênh youtube stanford online. Các bài giảng đều hấp dẫn và chi tiết với độ dài sấp xỉ 1 tiếng / 1 video.

Một số các blogs khác bạn có thể tham khảo thêm như là: 

10/16/2021

Native với Cross Platform: ưu và nhược điểm | Sharing


Khi mà chục năm trước thì web là sự theo đuổi của bao các lập trình viên kì nay kỉ nguyên của web đang dần khép lại, khép lại không phải là không tìm được việc nữa nha, mà là nó không còn hot, không còn là trend như chục năm về trước nữa chứ việc làm thì sẽ không bao giờ là thiếu. Thay vào đó thì ngày nay thiết bị di động, các thiết bị cầm tay đang dần trở lên phổ biến, vì thế phát triển ứng dụng cho các thiết bị di động đang dần trở lên phổ biến và tương lai trong mấy năm tới phát triển ứng dụng cho thiết bị di động sẽ là một trend mới.

Hiện nay có 4,4 triệu ứng dụng trên 2 chợ ứng dụng lớn nhất là Google Play và AppStore, nhắm vào thị trường 14 tỷ thiết bị di động trên toàn thế giới (xem biểu đồ bên trên). Dự kiến tới năm 2025 thì số thiết bị di động có thể lên tới 18,2 tỷ cái. Đây rõ ràng là một thị trường màu mỡ, giàu tiềm năng mà rõ ràng là ai cũng muốn chiếm lấy. Tiền lương trả cho các lập trình viên mobile cũng không hề thấp, với các bạn từ 2-3 năm kinh nghiệm thì mức lương 40 triệu đồng / tháng là bình thường, tuy nhiên vấn đề lương là khó nói chúng ta chỉ nhìn vào để làm động lực thôi. Mình sẽ không nói tới lương nữa vì nó là vấn đề nhạy cảm, các bạn chỉ biết rằng lập trình mobile app là một xu hướng và nếu các bạn giỏi thì các công ty hoàn toàn chải thảm đỏ mời các bạn về làm mới mức lương cực kì hấp dẫn.

OK! Nói qua vậy để mọi người thấy rằng phát triển ứng dụng cho thiết bị di động sẽ là xu hướng trong các năm tiếp theo. Vậy học lập trình mobile thì phải học cái gì? Có 2 loại ứng dụng mobile app là native app và cross platform app. Chúng ta sẽ đi từng vào từng loại một nha.

Native App Development

Phát triển ứng dụng native hay ứng dụng gốc tức là đề cập tới việc xây dựng ứng dụng dành riêng cho một nền tảng bằng các ngôn ngữ dành riêng cho nền tảng đó, ví dụ như Android sẽ là Java hoặc Kotlin, iOS sẽ là Swift hoặc Objective-C. 

Các ứng dụng gốc được hỗ trợ từ trực tiếp các nhà phát triển nền tảng nên các ứng dụng native là các ứng dụng có hiệu năng cao, trải nghiệm người dùng tốt. Tuy nhiên chi phí phát triển ứng dụng native là cao vì các công ty phải phát triển ứng dụng trên cả 2 nền tảng Android và iOS là độc lập với nhau. 

Ưu điêm việc phát triển ứng dụng Native: 

  • ‍Broad Functionality: bạn sẽ có quyền truy cập vào mọi API và công cụ do nền tảng mà bạn đang làm việc cung cấp. Về mặt kỹ thuật, không có giới hạn nào về cách các lập trình viên có thể làm việc với ứng dụng mới.

  • Hỗ trợ tốt hơn từ các store: một ứng dụng native sẽ dễ dàng xuất bản và được xếp hạng cao hơn trên các chợ ứng dụng vì chúng mang lại hiệu suất và tốc độ tốt hơn.

  • Khả năng mở rộng: các ứng dụng được xây dựng cho môi trường gốc cũng có xu hướng mở rộng hơn, nhờ sự linh hoạt trong quản lý tài nguyên và hàng loạt công cụ có sẵn.‍

  • Hiệu năng cao và trải nghiệm người dùng tốt: các ứng dụng native được hỗ trợ trực tiếp từ các nhà phát triển nền tảng nên mang lại hiệu năng tốt hơn, trải nghiệm người dùng tuyệt vời hơn.

Hạn chế của phát triển ứng dụng native: 

  • Giá thành và thời gian: việc phát triển ứng dụng native chỉ giúp cho ứng dụng của bạn chạy trên 1 nền tảng, điều đó dẫn tới bạn phải có 1 team khác để build lại 1 ứng dụng khác, mới hoàn toàn để chạy trên các nền tảng khác, điều này là rất tốn kém và mất thời gian.

Cross-platform App Development

Phát triển ứng dụng đa nền tảng chỉ ra quá trình tạo ra một ứng dụng hoạt động trên một số nền tảng. Điều này được thực hiện bằng cách sử dụng các công cụ như React Native, Xamarin và Flutter, nơi các ứng dụng được tạo có thể được triển khai trên cả Android và iOS.

Khi ứng dụng được viết một lần và có thể chạy đa nền tảng thì điều này giúp cho bạn có thể tiết kiệm được thời gian cũng như tiền bạc bỏ ra so với khi xây dựng các ứng dụng Native.

Về ưu điểm và hạn chế của cross-platform? Gần như mọi thứ là ngược lại so với app native. Khi phát triển các ứng dụng platform các bạn có thể gặp khó khăn khi truy cập vào các chức năng của điện thoại thông minh như micro, máy ảnh, ... (‍Limited Functionality), các ứng dụng đa nền tảng thường chậm hơn so với các ứng dụng gốc vì chúng cần một lớp khác ở giữa bổ sung, các ứng dụng đa nền tảng không thể tận dụng các UX gỗc nên mang lại trải nghiệm người dùng không tôt.

Ưu điểm duy nhất mà cross-platform mang lại chính là tiền, chi phí. Việc phát triển ứng dụng đa nền tảng sẽ giúp bạn chỉ cần viết 1 lần mà ứng dụng có thể chạy trên các nền tảng khác nhau. Ưu điểm tuy ít nhưng nó là mấu chốt để cho các nền tảng cross-platform phát triển ngày càng mạnh.

Tại trường Đại Học Bách Khoa Hà Nội các bạn có 2 môn học là "Phát triển ứng dụng cho thiết bị di động" và "Phát triển ứng dụng đa nền tảng" là được học về phát triển mobile app. Với môn "Phát triển ứng dụng đa nền tảng" các bạn được học về các nguyên lý đa nền tảng, các framework đa nền tảng như là React Native và Flutter. Với môn "Phát triển ứng dụng cho thiết bị di động" các bạn được dạy tập chung vào phát triển ứng dụng native trên Android với công cụ Android Studio, mình sẽ nói kĩ hơn về 2 môn này trong các bài viết sau nha.

Nếu các bạn muốn theo mobile app thì nên học gì? Với ý kiến của mình các bạn nên chọn cho mình 1 nền tảng  để phát triển app native để học (Android hoặc iOS) và 1 framework hỗ trợ phát triển các app cross-platform (React Native hoặc Flutter). Đó là ý kiến của mình thôi, còn dĩ nhiên các bạn có thể học tập chung vào Android, hoặc học tập chung vào iOS hoặc là học tập chung vào 1 trong các framework đa nền tảng cũng không hoàn toàn có vấn đề gì.

Tham khảo: https://www.uptech.team/https://www.statista.com/

10/05/2021

Công nghệ web và dịch vụ trực tuyến | Tài liệu, chuyên ngành


Công nghệ web và dịch vụ trực tuyến và một môn chuyên ngành, nằm trong module 4, module phát triển ứng dụng nghiệp vụ. Trong môn này các bạn sẽ được học tất cả những thứ có thể làm ra 1 trang web từ các ngôn ngữ phát triển phía máy khách như HTML, CSS, JS, các ngôn ngữ phát triển phía máy chủ PHP, Java, Nodejs, học về XML, DTD, học về các mô hình lập trình như MVC. Và dĩ nhiên rồi, vì kiến thức là rất nhiều mà khoảng thời gian học chỉ có 1 kì học nên có những thứ sẽ học kĩ, nhưng có những thứ chỉ mang tính chất giới thiệu là chính.

Ngôn ngữ backend chính được dạy trong môn học là PHP, vì thế nếu các bạn sử dụng các ngôn ngữ khác thì phải tự mày mò tìm hiểu là chủ yếu.

Nhìn chung thì mình thấy lý thuyết của môn này học cũng không cuốn hút, đa phần là lượng kiến thức mà các bạn đã biết chỉ có 1 số ít là các kiến thức mới thì lại học rất ít. Tuy nhiên thì bài tập lớn môn này rất là mở và sẽ thỏa mãn được đam mê của các bạn, thường và hầu hết các thầy/ cô dạy môn này sẽ cho mọi người xây dựng 1 trang web bất kì nào, nếu các bạn học Đào Thành Chung thì thầy sẽ không cho sử dụng framework trong bài tập lớn vì thế nếu bạn nào học thầy Chung thì xem xét nha, tuy nhiên thầy cho điểm rất thoải mái, nhóm có điểm bài tập lớn đứng đầu còn được miễn thi.

Ngoài ra môn này sẽ có bài tập hàng tuần về kiến thức đã học trong tuần đó, các thức kiểm tra bài tập tuần của mỗi thầy/cô là khác nhau nhưng nói chung là các bạn phải làm bài tập tuần nha. 

Tóm lại mình nhìn nhận về môn này là rất dễ kiếm điểm, các bạn có thể không cần học nhiều đâu, chỉ cần dựa vào kiến thức mà các bạn đã có về web từ trước tới giờ cộng với ôn tập 1 tí thôi là A+ rồi.

Tài liệu

  • Slide công nghệ web và dịch vụ trực tuyến mới từ viện: LINK 1 | LINK 2
    (Đường link 1 là slide mới hơn mà mình nhận được, nhưng link 2 lại có thêm 1 số slide về servlet và 1 số thứ khác mà các bạn có thể tham khảo thêm)

  • Slide công nghệ wb và dịch vụ trực tuyến - thầy Đào Thành Chung: TẢI VỀ SLIDE

Bài tập lớn

Bài tập lớn như mình đã nói bên trên là đề tài tự do và các bạn hoàn toàn có thể chọn làm bất cứ cái gì mà các bạn thích. Sau khi làm xong các bạn có thể đẩy web lên các host, việc đẩy web lên host và demo trực tiếp để mọi người cùng vào thử nghiệm sẽ được các thầy/cô đánh giá cao và ưu ái hơn trong việc cho điểm, dĩ nhiên là hơn hết các bạn phải tập chung vào sản phẩm của mình, còn thời gian hãy nghĩ tới việc này. Có nhiều thầy/cô không hẳn là thích giao diện đẹp đâu, vì các thầy/cô đều nghĩ đẹp hầu như là các bạn đi cop, vì thế hãy cố gắng tập chung vào logic và phần backend nha, giao diện có thể phèn phèn 1 tí nhưng website có nhiều chức năng sẽ là 1 điểm mạnh. Dĩ nhiên là phần giao diện cũng phải đáp ứng được các yêu cầu của thầy giáo đưa ra như responsive,...

Mình sẽ có 1 bài hướng dẫn đẩy 1 website viết bằng PHP lên host, các bạn theo dõi nha.

Cuối cùng là bạn có thể tham khảo 1 project của mình tại đây nha: https://github.com/trannguyenhan/selling-computer (mặc dù giao diện không đẹp bằng các nhóm khác tuy nhiên project may mắn có điểm cao nhất)

9/21/2021

Tính toán tiến hóa | Tài liệu, chuyên ngành


Trong CTDL hay thuật toán ứng dụng các bạn đã biết tới bài toán người du lịch (TSP) là 1 bài toán NP-Khó, tức là để có thể đưa ra lời giải của bài toán chúng ta chỉ có cách là duyệt toàn bộ. Tuy nhiên thì điều này chỉ thỏa mãn và hợp lí với những bài mà N nhỏ khi N lớn thì không gian tìm kiếm tăng nhanh và việc duyệt toàn bộ để tìm ra kết quả tối ưu là gần như không thể. Trong các môn CTDL hay thuật toán ứng dụng chúng ta cũng chỉ được làm quen bài toán TSP với những giá trị N nhỏ để thực hiện duyệt toàn bộ tìm ra lời giải tối ưu của bài toán.

Tuy nhiên khi N tăng thậm chí là N rất lớn chúng ta vẫn có thể tìm được lời giải tối ưu của bài toán này (chỉ là có thể thôi nha) bằng các giải thuật tiến hóa. Các giải thuật tiến hóa đang được phát triển và sử dụng rộng rãi trong việc giải quyết các bài toán tối ưu NP-Khó, NP-Đầy đủ.


Có thể các bạn hơi ngỡ ngàng nhưng tính toán tiến hóa là 1 nhánh của trí tuệ nhân tạo nghiên cứu các giải thuật tối ưu tìm kiếm dựa trên học thuyết tiến hóa Darwin.

Có nhiều bạn đọc từ đầu tới giờ cứ tưởng như là chúng ta đang làm quen với môn sinh học mất, nhưng chỉ là lấy ý tưởng từ sinh học thôi nha, giải thuật tiến hóa là các giải thuật mình thấy rất là hay và lab cô Bình là lab tối ưu làm rất nhiều về giải thuật tiến hóa, bạn nào quan tâm tới vấn đề tối ưu thì có thể xin vào lab cô Bình nha, mình sẽ có riêng 1 bài viết khác về lab cô Bình nên bài viết này mình không lan man nhiều về vấn đề này.

Môn học này theo mình biết thì hiện tại chỉ có cô Bình dạy thôi, cô dạy môn này thì nói chung là rất thoải mái cả về giờ giấc lẫn cách học, chủ yếu là các bạn sẽ được phân vào các nhóm nghiên cứu trên lab của cô để làm bài tập lớn thôi, giữa kì các bạn sẽ trình bày về 1 cái gì đó mà mình học được trong nhóm cùng các anh/chị như là trình bày lại 1 bài báo mà mình đọc được hay là trình bày cách giải quyết 1 đề tài được các anh/chị trong nhóm giao. Về cơ bản thì không nhất thiết phải sử dụng các giải thuật di truyền mà các bạn có thể sử dụng các giải thuật heuristic, trình bày về các giải thuật heuristic cô đều chấp nhận và đồng ý hết. 

Dưới đây mình chia sẻ tới các bạn 1 số bài giảng, tài liệu dành cho môn học này gồm có slide bài giảng, và 1 số bài báo đã được public về k-coverage, q-coverage: 

  • Slide môn học tính toán tiến hóa: PDF | PPTX | ZIP (các bạn lên mang slide đi in ra nha, nhớ khi in dùng bản powerpoint - pptx nha để có thể in được full các phần, bản pdf nhiều trang các hình ảnh sẽ bị đè nên chữ)

9/17/2021

Tạo biểu đồ ER Diagram cho cơ sở dữ liệu với MySQL Workbench | Share


ERD là một loại lưu đồ minh họa cách các “thực thể” như con người, đối tượng hoặc khái niệm liên quan với nhau trong một hệ thống. Sơ đồ ER thường được sử dụng để thiết kế hoặc gỡ lỗi cơ sở dữ liệu quan hệ trong các lĩnh vực kỹ thuật phần mềm, hệ thống thông tin kinh doanh, giáo dục và nghiên cứu.

Biểu đồ ER được sử dụng để lập mô hình và thiết kế cơ sở dữ liệu quan hệ, về mặt logic và các quy tắc nghiệp vụ (trong mô hình dữ liệu logic) và về công nghệ cụ thể sẽ được thực hiện (trong mô hình dữ liệu vật lý.) Trong kỹ thuật phần mềm, một sơ đồ ER thường là bước đầu tiên để xác định các yêu cầu cho một dự án hệ thống thông tin. Sau này nó cũng được sử dụng để lập mô hình một cơ sở dữ liệu hoặc các cơ sở dữ liệu cụ thể. Cơ sở dữ liệu quan hệ có một bảng quan hệ tương đương và có thể được biểu diễn theo cách đó khi cần thiết.

Hầu hết các công cụ UI hỗ trợ các cơ sở dữ liệu đều có chức năng chuyển trực tiếp từ cơ sở dữ liệu thành biểu đồ ERD, với MySQL Workbench thì hơi khó để tìm ra điều này, mình có một hướng dẫn ngắn để giúp mọi người có thể tạo ERD rất nhanh và ngắn gọn, cùng xem video dưới của mình nha.



Xem thêm về biểu đồ ERD bạn có thể tham khảo thêm TẠI ĐÂY

9/12/2021

Nhập môn học máy và khai phá dữ liệu | Phần 1


Trong seri bài này mình sẽ tóm tắt các phần liên quan tới học máy và khai phá dữ liệu dựa trên slide và bài giảng môn học được thầy Thân Quang Khoát giảng dậy https://bkai.ai/ (facebook BK AI fb.com/bk.ai ). Bài viết gạch ra một số ý mà theo mình thì nên trọng tâm, tuy nhiên mình khuyên các bạn nên học bài bản và xem video vì cá nhân mình xem 1-2 lần thì vẫn hơi mông lung :(  . Đây là môn học nên tảng, cung cấp kiến thức cơ bản nhất cho các bạn theo định hướng data scientis (hiểu sơ sơ  là sử dụng các kĩ thuật học máy (cluster analysis, decision trees, random forest, neural networks, logistics regression, ...) để xây dựng các mô hình toán học phục vụ các bài toán kinh doanh ), còn cụ thể data scientis, data engineer, data analysis như nào các bạn có thể tham khảo yt.com/dataGuyStory và theo mình tìm hiểu data scientis thường là người có mức lương cao nhất.

Bài này mình sẽ tóm tắt 2 phần giới thiệu chung và Hồi quy (Regression) , còn lại một số khác như -Phân cụm(Kmean) , Học dựa trên láng giềng KNN, Cây quyết định, ... có lẽ (chỉ là có lẽ :D ) mình sẽ ra ở bài sau. Tài liệu môn học này sẽ được đăng sau nha :D 

Giới thiệu chung

  • Học máy : xây dựng hệ thống tự cải thiện bản thân bằng cách học từ dữ liệu

  • Khai phá dữ liệu : tìm ra tri thức

  • Học : improve Performance at Task, following Experience.
    ví dụ với bài toán phân loại thư rác :
    • P : độ chính xác của phân loại thư đó là rác 

    • T : phân loại

    • E : tập thư thường/ rác đã có từ trước thời điểm phân loại 

  • Bản chất của việc học : học hàm f : x -> y. f còn gọi là model (dữ liệu theo 1 mô hình nào đó ). học model là học tham số của model đó.

  • Dữ liệu học : tập học (training set, tập quan sát ) gồm X, Y (tập các x và y tương ứng). x là dữ liệu đầu vào và y là đầu ra của dữ liệu đó 

  • Phân loại: 

    • Học có giám sát ( supervised learning): 

      • Classification : Multiclass (phân loại nó vào 1 lớp), Multilabel(phân nó vào nhiều lớp - gán nhiều nhãn)

      • Regression : khác với classification là đây đầu ra liên tục.

    • Unsupervised learning (không có y, dữ liệu không có nhãn)

      • Phân cụm

      • Phát hiện xu hướng

    • Học bán giám sát :  Semi-Supervised Learning

    • Học tăng cường : Reinforcement Learning

  • Vấn đề: 

    • Giải thuật học ( chủ yếu là lặp để tối ưu) không hội tụ : No-free-lunch. không có thuận toán luôn hiệu quả trên mọi ứng dụng. mỗi bài toán cần thử nghiệm nhiều thuật toán xem cái nào tốt nhất.

    • Lựa chọn dữ liệu : nhiễu, lỗi

    • Khả năng học: khả năng khái quát hóa ( generalization) tập học để có thể  phân loại tốt trên tập thực tế(tập dữ liệu mới, tập dữ liệu tương lại  ), tránh vấn đề overfitting.

    • Overfitting (xảy ra khi khái quát hóa tốt khi học nhưng với tập dữ liệu tương lai, cái cần thì lại rất tệ ) : mô hình quá phức tạp, dữ liệu lỗi, quá bé.

    • Mong muốn tổng quát hóa cao , tương đương với việc không dính overfitting

    • Giải quyết : 1 trong số đó là kĩ thuật Regularization

Hồi quy

  • Học hàm, đầu ra liên tục

  • Linear model

  • x là đầu vào(các x i là các thuộc tính của 1 dữ liệu đầu vào / trong tập dữ liệu đầu vào ), w là trọng số, là cái cần đi học, tương đương với việc xác định đầu vào x đóng góp bao nhiêu phần vào việc quyết định đầu ra cho mô hình 

  • Cách học :

    • Hàm lỗi(lost, cost function) : với tập w hiện tại , ta sẽ tính được đầu ra, đầu ra đó là đầu ra của model (linear model ), nó hoàn toàn có thể khác với thực tế. đại loại lấy sai khác 2 cái này (đầu ra dự đoán của model với thực tế) 

    • Mong muốn lỗi này trên tất cả dữ đầu vào mà mình sở hữu trung bình thấp nhất

    • Thuật toán học : 

      • Cực tiểu hóa lỗi ordinary least squares: dùng gradient descent(từ từ cập nhật trọng số cho phù hợp )  có thể giải bằng toán học : chuyển vị gì đấy …(cho đạo hàm bằng 0 tìm luôn w cho nhanh ), vấn đề không có ma trận chuyển vị ?

      • phương pháp trên quá tập trung vào dữ liệu,không có bất cứ gì để điều chỉnh  khả năng tổng quát hóa cho tương lai =>sinh ra Ridge regression  bằng cách thêm lamda nhân bộ w(một đại lượng hiệu chỉnh mà mình đã nhắc trong bài 1 -Regularization ), hiểu là sau khi cho vào thì bạn sẽ cố gắng ép bọn w vê càng 0 càng tốt => kéo theo mỗi thuộc tính sẽ đóng góp rất ít vào việc quyết định đầu ra, tổng quát hơn (đoán thế :D). Nói chung turning lamda sẽ điều chỉnh đc độ overfitting. lamda càng lớn w càng nhỏ, lỗi tập train tăng, độ tổng quát tăng. (đánh đổi). lamda > 0 thì ma trận luôn khả nghịch

      • Lasso : cái lamda nhân bộ w ở trên cụ thể là nhân với L2 bộ w. ở đây thay L2 bằng L1. điểm hay của L1 là giảm miền tìm kiếm, lựa chọn thuộc tính(sẽ có 1 số thuộc tính không tác dụng cho w của nó = 0 ). dùng cho các bài toán nghiệm thưa . mất tính chất luôn  khả nghịch.

Mong nhận được bình luận cảm nhận, góp ý từ các bạn :(