◉ Marketing Technology (Martech): khái niệm không mới nhưng những xu hướng của nó thì luôn luôn có sự đổi mới!
〉〉〉 Những xu hướng mới này không chỉ đến từ những tiến bộ và thay đổi về mặt công nghệ, mà còn đến từ sự thay đổi về hành vi của người dùng, thay đổi về mặt thuật toán của các nền tảng quảng cáo lớn, thay đổi về nền tảng pháp luật khu vực hay địa phương, v.v… 〈〈〈
Những xu hướng và thay đổi này ảnh hưởng rất nhiều đến hiệu quả công việc thường ngày của những người làm marketing. Để làm tốt hơn công việc của mình, chúng ta không phải chỉ giỏi trong việc xử lý những thứ ngày qua ngày, mà còn cần nắm bắt và hiểu rõ xu hướng của tương lai (gần) để từ đó có những hoạch định hoặc những chuẩn bị cần thiết ✅
Hãy cùng anh Bùi Quang Tinh Tú | CMO Asia _ Ringier AG điểm qua những xu hướng nổi bật về martech / adtech đang diễn tiến và sắp tới có thể trở thành một phần của những công việc hằng ngày của người làm digital marketing. Hi vọng nội dung chia sẻ này sẽ cho bạn một số góc nhìn thú vị về tương lai của martech và định hướng phát triển của ngành.
💯 Hãy giữ chắc tấm vé trên tay để có cơ hội lắng nghe anh Tú cùng 100+ các chuyên gia khác chia sẻ tại ngày hội công nghệ & mobile được mong đợi nhất năm nay nhé! ĐÔI CHÚT VỀ DIỄN GIẢ:
Anh Bùi Quang Tinh Tú | CMO Asia _ Ringier AG
Cộng đồng Marketer Việt Nam chắc hẳn sẽ không còn xa lạ khi nghe thấy tên anh Bùi Quang Tinh Tú. Anh hiện đang là CMO Asia của Ringier AG – tập đoàn truyền thông đa quốc gia tư hữu lớn nhất của Thụy Sĩ; đồng thời là CEO của Marry Network, trực thuộc Ringier Vietnam. Với kinh nghiệm chinh chiến phong phú, anh Tú chính là một trong những chuyên gia đáng được mong đợi khi đến với Vietnam Mobile Day 2019. Cùng “nghía” qua xem tiểu sử của anh Tú có gì nào:
👉 Founder của UAN – Cộng Đồng Marketing và Truyền Thông
👉 Blogger tại trang conversion.vn
👉 Từng là CMO và là founding member của GO-VIET / GO-JEK VN
👉 Từng là Marketing Director của MuaBanNhaDat
👉 Từng là Digital Manager tại Wall Street English và SEO / Affiliate Manager của Lazada Việt Nam
Một nhân vật với những kinh nghiệm “xịn sò” như vậy sẽ chia sẻ những thông tin bổ ích nào tại Ngày hội Công nghệ lớn nhất Việt Nam năm nay? Nhanh tay lấy ngay cho mình những tấm vé vàng để có cơ hội lắng nghe anh Tú cùng hơn 100 chuyên gia đầu ngành khác chia sẻ tại Vietnam Mobile Day 2019 các bạn nhé!!
============================
🎟 VIETNAM MOBILE DAY lần thứ 9 mang đến hơn 100 chuyên đề hấp dẫn xoay quanh 6 nhóm chủ đề chính, đó là:
➖ Digital Transformation & Mobilization
➖ Woman in Tech
➖ 5G & Internet of things, Machine Intelligence and future of Mobile Technology
➖ Fin-Tech/ Mobile Payment/Ecommerce & Mobile commerce
➖ Digital Marketing & Mobile Marketing
➖ Mobile content (AR/VR/Livestream) and gaming
============================
🔎 Website: https://mobileday.vn/
📌 Time: Hồ Chí Minh – 06/06/2019 | Hà Nội – 14/06/2019
🔥🔥🔥 VÉ COMBO dành cho nhóm 5-10-20-30 người với những giá cực ưu đãi nhưng vẫn giữ nguyên quyền lợi TIÊU CHUẨN!!!
Sự kiện Tech Talent Fest 2019 đang bùng nổ trên khắp cộng đồng Công nghệ tại Việt Nam. Các Developer tài năng, bạn đã sẵn sàng cho cuộc hội ngộ cùng những Doanh nghiệp hàng đầu?
Tech Talent Fest 2019là sự kiện tuyển dụng công nghệ lập trình quy mô lớn diễn ra trên nền tảng Online và Offline do TopDev tổ chức, giúp kết nối các ứng viên IT với các nhà tuyển dụng.
Tech Talent Fest 2019 diễn ra từ ngày 06.05.2019 cho đến hết ngày 30.06.2019, diễn ra trên Online và Offline tại 2 thành phố Hồ Chí Minh & Hà Nội, dự kiến thu hút 4,000 lượt tham dự.
50 NGÀY PHỦ SÓNG CÙNG CÁC DOANH NGHIỆP
Tech Talent Fest 2019 tập trung bao phủ thông tin của các doanh nghiệp tham gia đến toàn bộ cộng đồng Công nghệ Việt Nam, xuyên suốt 50 ngày trên toàn bộ các kênh Fanpage, Facebook Group, Website công nghệ chuyên công nghệ cũng như tiếp cận trực tiếp đến từng ứng viên trong kho dữ liệu 300,000+ hồ sơ IT của TopDev.
Không đơn giản chỉ là tuyển dụng, Tech Talent Fest 2019 sẽ đem đến cái nhìn toàn cảnh nhất về thị trường tuyển dụng IT năm 2019 tại Việt Nam cũng như cung cấp các giải pháp tuyển dụng cao cấp nhất đến từ các hoạt động employer branding, networking và human resource marketing mang lại sự đột phá cho các doanh nghiệp Việt.
Hoạt động chính tại Tech Talent Fest 2019
DEVELOPER – BẠN ĐÃ SẴN SÀNG NHẬP CUỘC?
Đâu sẽ là lựa chọn con đường sự nghiệp cho chính mình?
Hơn cả một bản tin tuyển dụng, tại Tech Talent Fest 2019 bạn có cơ hội tìm hiểu về văn hóa, môi trường làm việc cũng như công nghệ của các Doanh nghiệp. Và đừng quên cuộc hội ngộ “face to face” cùng các Nhà tuyển dụng tại sự kiện Offline, rất nhiều cơ hội phỏng vấn trực tiếp tại sự kiện đang chờ bạn!
Định vị bản thân – Hiểu được chính mình
Những con số tổng quan nhất về thị trường IT kết hợp cùng chuỗi hoạt động “Giao lưu cùng Doanh nghiệp” sẽ mang đến cho các IT-ers câu trả lời hoàn chỉnh nhất cho con đường sự nghiệp của mình.
Và cuối cùng, đừng quên hết mình với “Tech Talent Challenge” diễn ra trong khuôn khổ sự kiện, Developer sẽ có có cơ hội trải nghiệm các thử thách và “Tăng giá” bản thân trong mắt các Nhà tuyển dụng.
Đừng quên cập nhật những thông tin HOT nhất về sự kiện tại:
Hiện nay đang có quá nhiều Framework Web Development xuất hiện làm cho ngay cả những lập trình viên dày dặn kinh nghiệm nhất cũng phải hoang mang. Và phải nói rằng, số phận website tương lai của bạn phụ thuộc khá nhiều vào sự lựa chọn framework của bạn lúc này đấy.
Ngành lập trình web thay đổi liên tục, và việc hiểu được chiều hướng phát triển của nó là vô cùng quan trọng. Để giúp bạn cập nhật liên tục với những xu hướng phát triển web mới nhất, chúng tôi quyết định giới thiệu đến các bạn danh sách tổng hợp các framework phát triển web phổ biến nhất năm 2019. Hy vọng sẽ giúp bạn có sự lựa chọn tốt nhất cho mình.
Angular.JS là một thư viện Javascript nguồn mở phổ biến nhất của Google. Ngoài thư viện tiêu chuẩn phong phú, Angular.JS còn được user viết thêm rất nhiều bản mở rộng. Tuy nhiên, việc sử dụng mô hình MVC mới là một trong những tính năng nổi bật nhất của framework này.
Angular.JS cung cấp entry threshold thấp và nhiều cài đặt tính năng. Để bắt đầu viết những ứng dụng nhỏ trong nó, bạn sẽ cần một vài tiếng đợi. Tuy nhiên sẽ mất hàng tháng trời để nghiên cứu tất cả những khả năng của nó và học cách sử dụng chúng.
Angular.JS có hỗ trợ Ajax, quản lý cấu trúc DOM, hiệu ứng, pattern, routing, và nhiều tính năng khác. Framework mạnh với nhiều chức năng phong phú này đang được sử dụng ngày càng nhiều trong các ứng dụng web.
Laravel
Laravel là một framework ứng dụng web với syntax gọn và khá ấn tượng. Nó là 1 giải pháp full-stack cho cả lập trình viên front-end và lập trình viên back-end. Nhiều chuyên gia cho rằng platform doc của nó là gần như tuyệt hảo.
Laravel liên tục được cải tiến, bắt kịp xu hướng hiện đại. Nếu bạn nghiên cứu Laravel, bạn sẽ không bao giờ bị tụt hậu trong ngành phát triển web. Điểm cốt lõi không phải là tập trung vào phiên bản cụ thể nào của Laravel mà là luôn phát triển bản thân cùng với nó.
React.js
React.js là một trong những thư viện phổ biến nhất được sử dụng để đem đến các giải pháp cho lập trình front-end phức tạp. Được giới thiệu bởi Facebook vào năm 2013 và nhanh chóng trở nên phổ biến. Ngày nay nhiều công ty nổi tiếng, bao gồm cả Instagram, AirBnB, eBay, Netflix, Yahoo,… đều sử dụng nó để làm sản phẩm. (Tìm hiểu thêm về React.js tại đây.)
React dựa trên khái niệm chia giao diện người dùng thành nhiều phần độc lập tách biệt – là các component khá đơn giản để duy trì và mở rộng. Thậm chí bạn có thể tạo ra những component riêng biệt và sử dụng chúng với những project khác nhau, dễ dàng chuyển đổi từ project này sang project khác. (Xem thêm component là gì?)
Tính năng chính của React.js là tự do tương tác, cho phép bạn có thể sử dụng một số lượng lớn các ứng dụng có sẵn ( như redux, mobx,…). Chúng không thuộc React.js nhưng lại thuộc các kiến trúc thượng tầng, nên chúng rất dễ phát triển.
Ruby on Rails
Đây là một framework hoàn chỉnh, đa cấp độ, được thiết kế để xây dựng các ứng dụng web sử dụng cơ sở dữ liệu, và dựa dựa trên cấu trúc MVC. Từ lúc được ra mắt, framework này đã nhanh chóng trở thành một trong những công cụ mạnh mẽ được dùng để làm ứng dụng web cho các startup và mọi loại website.
Ưu điểm chính của Ruby on Rails là tốc độ phát triển. Trước hết, tốc độ phát triển cao là nhờ 1 bộ công cụ RoR tiêu chuẩn sẵn sàng để sử dụng, một nhóm các giải pháp cho cộng đồng, ngôn ngữ Ruby, và code đơn giản.
Những tiêu chuẩn để thêm file vào 1 project, tiêu chuẩn để viết code trong 1 project, và quy tắc ngôn ngữ chung trong Ruby on Rails có thể hỗ trợ bất cứ project lớn nào. Nhờ cách tiếp cận này, project sẽ dễ đọc hơn, những người mới cũng có thể tham gia vào project nhanh chóng mà không bị trì hoãn hay gián đoạn gì cả.
ASP.NET MVC
ASP.NET MVC là một framework được thiết kế để tạo các website và ứng dụng web triển khai mô hình MVC. Các coder thích công nghệ này vì những tiện ích, linh hoạt và sự sử dụng rộng rãi của nó. (Xem thêm so sánh ASP.NET MVC và ASP.NET Web Forms)
Nó cung cấp một mô hình code với hiệu suất cao, cho phép user viết code sạch hơn, phát triển thông qua thử nghiệm, và khả năng mở rộng với tất cả các lợi thế của ASP.NET đã có.
Nhờ những tính năng này mà khái niệm chia sẻ trách nhiệm được ra đời. Kết quả là, dễ quản lý công việc hơn với các component riêng biệt. Hơn thế nữa, ứng dụng cũng dễ được test hơn nhờ tính năng này.
YII
YII là 1 trong các framework PHP hiệu quả cao được thiết kế để làm những ứng dụng web lớn nhanh chóng. Nó cho phép bạn tái sử dụng code một các tối đa và có thể tăng tốc phát triển web đáng kể.
Nó là 1 framework tổng quát có thể dùng trong mọi loại ứng dụng web. Nhờ cấu trúc component và hỗ trợ caching xuất sắc, nó thích hợp cho các project lớn, như là cổng thông tin, forum, CMS, storestore và các ứng dụng RESTful.
Lợi ích và tính năng chính của framework YII là:
Tỉ lệ performance cao;
Cho phép bạn cache cả page hoặc từng phần;
Cho phép bạn làm việc với form, chức năng đảm bảo cấu trúc và xác nhận;
Cho phép tự động test và phát triển theo dạng TDD;
Hỗ trợ REST.
Symfony
Symfony là một framework PHP phổ biến nhất thế giới. Nó bao gồm toàn bộ các công cụ được dùng để phát triển ứng dụng web nhanh chóng, cùng lúc, và không thêm bất cứ thứ gì vào app của bạn.
Symfony là một bộ component đứng riêng lẻ. Các component kết nối với nhau tạo ra một web platform – một hệ sinh thái độc nhất. Hơn thế nữa, lựa chọn các component hoàn toàn phụ thuộc vào bạn và mục tiêu cảu bạn.
Điểm mạnh của framework này là:
Tỉ lệ performance cao nhờ các công cụ template được sử dụng; (Xem thêm bí quyết tối ưu Web Performance)
Tuỳ chỉnh linh hoạt;
Có thể mở rộng app bất cứ lúc nào, kết nối với các bundle mới có ảnh hưởng nhỏ đến các bundle khác, nhưng vẫn có thể cấu hình hoạt động đồng thời của chúng;
Ổn định và hỗ trợ lâu dài;
Tiện lợi cho developer: giảm bớt công việc hàng ngày, sử dụng các lệnh đặc biệt, console tiện lợi cho viết code thay vì cần đến một software engineer.
Django
Django là một framework dành cho ứng dụng web sử dụng Python. DRY (Don’t Repeat Yourself) là một trong những nguyên tắc chính của platform này. Hệ thống web Django được xây dựng từ 1 hoặc nhiều app được đề xuất để lập trình có kết nối lẫn có thể tháo rời được. Nhờ tính năng này mà cấu trúc của framework Django khác biệt hơn so với một vài framework khác (như Ruby on Rails).
Ưu điểm:
Tốc độ: Django được thiết kế để giúp các lập trình viên tạo một ứng dụng trong thời gian ngắn nhất có thể, đem lại giải pháp phù hợp nhất cho các lập trình viên có deadline gấp rút.
Package hoàn chỉnh: Django hoạt đồng bằng cách dùng hàng tá tính năng bổ sung, giúp hỗ trợ cho user rất nhiều với authentication (Xem thêm Authentication là gì?), website map, quản lý content, RSS,…
Bảo vệ project khỏi các lỗi bảo mật
Khả năng mở rộng: Django là sự lựa chọn tốt để làm việc với các dự án nhắm vào website có traffic cao.
Tổng kết
Chúng tôi mong rằng danh sách framework trên có thể hữu ích cho các bạn. Mỗi platfrom trên đều có thế mạnh riêng, nhưng quyết định cuối cùng vẫn nên dựa trên các tính năng phù hợp nhất với dự án của bạn.
Ngoài việc lựa chọn các chức năng cơ bản, bạn cũng nên đánh giá khả năng áp dụng các tính năng đó để đạt được kết quả tốt nhất và có cho mình sự lựa chọn chính xác.
Python là ngôn ngữ lập trình hướng đối tượng, thông dịch, mã nguồn mở, đa mục đích và là ngôn ngữ lập trình được dùng khá phổ biến trên thế giới hiện nay.
Python là ngôn ngữ có hình thức rất sáng sủa, cấu trúc rõ ràng, được đánh giá là một ngôn ngữ khá dễ học và là lựa chọn đáng cân nhắc cho những ai mới bắt đầu học lập trình.
10 sách tự học Python miễn phí rất hay
Invent Your Own Computer Games with Python
Invent Your Own Computer Games with Python sẽ hướng dẫn bạn làm thế nào để tạo ra các trò chơi máy tính sử dụng ngôn ngữ lập trình Python – ngay cả khi bạn chưa biết gì về lập trình trước đó. Bắt đầu bằng cách xây dựng trò chơi cổ điển như Hangman, đoán số, Tic-Tac-Toe, rồi đến các trò chơi phức tạp hơn như trò chơi săn kho báu, trò chơi va chạm với hiệu ứng âm thanh,…. Xuyên suốt quyển sách, bạn sẽ học được các khái niệm về lập trình và toán học quan trọng, các kiến thức khoa học máy tính cơ bản. Đọc sách và làm theo các hướng dẫn, bài tập bạn sẽ có được nền tảng vững chắc về lập trình Python và rất thú vị khi bạn có được những game do chính tay bạn lập trình.
Cuốn sách Making Games with Python & Pygame là một cuốn sách lập trình hướng dẫn sử dụng thư viện trò chơi Pygame trên ngôn ngữ lập trình Python. Thay vì giảng dạy các
khái niệm lập trình và để bạn loay hoay xây dựng chương trình với các khái niệm đó, cuốn sách này sẽ giới thiệu bạn các chương trình, các game rồi sau đó giải thích các khái niệm lập trình được ứng dụng thế nào trong game đó.
Bạn nên đọc lần lượt các chương của sách theo thứ tự. Mỗi chương sẽ tập trung vào một chương trình trò chơi và đều có giải thích kỹ ý nghĩa của các đoạn mã lệnh của trò chơi. Bạn sẽ gặp lại nhiều lần cùng khái niệm trong nhiều ứng dụng trò chơi khác nhau, nhưng thường thì chương đầu tiên thì các khái niệm mới sẽ được giải thích kỹ nhất. Cuốn sách này rất phù hợp cho các trẻ em từ 10 đến 12 tuổi để tự học lập trình game trên Python nhưng cuốn sách cũng rất tuyệt cho những ai muốn tự học Python qua lập trình game.
Think Python – How to think like a computer scientist là cuốn sách nhập môn lập trình Python khá hay dành cho người mới bắt đầu. Cuốn sách được thiết kế cẩn thận giúp bạn dễ dàng nắm vững các khái niệm cơ bản về lập trình và các thuật ngữ lập trình từ dễ đến khó, rất logic và có nhắc lại, bổ sung thêm sau đó để bạn dễ hiểu các khái niệm này. Những phần phức tạp như lập trình đệ quy hay lập trình hướng đối tượng, bạn sẽ gặp trong nhiều chương và có nâng cấp từng chút một từ cơ bản đến chuyên sâu. Bài tập của sách khá hay, đôi lúc bạn phải “động não” mới có thể thực hiện được.
Có thể xem cuốn sách Python for Everybody – Exploring Data in Python 3 như là phần bổ sung, mở rộng cho sách Think Python – How to think like a computer scientist với các ví dụ minh họa và bài tập liên quan đến việc xử lý dữ liệu hơn. Nếu bạn không phải là chuyên CNTT, không muốn trở thành lập trình viên Python chuyên nghiệp trong tương lai nhưng bạn muốn ứng dụng CNTT hiệu quả trong công việc kinh doanh, nghiên cứu, quản lý,… của mình thì đây là quyển sách dành cho bạn. Cuốn sách gồm 16 chương tập trung xử lý các vấn đề, tình huống trong thực tế liên quan đến dữ liệu với Python, rất hay và hữu ích cho những bạn lập trình Python không chuyên.
Bạn sẽ tìm thấy trong cuốn sách Autom ate the Boring Stuff with Python những bài tập, ví dụ đơn giản, thấy ngay kết quả cho dù bạn mới bắt đầu làm quen với lập trình Python. Bạn sẽ được học lập trình Python qua các ví dụ nhỏ, thực hiện tự động hóa các công việc đơn giản nhưng lặp đi lặp lại khá thông dụng trong thực tế như :
• Tìm kiếm những tập tin có đoạn văn bản cần thiết
• Tạo, cập nhật, di chuyển, và đổi tên cùng lúc nhiều tập tin và thư mục
• Tìm kiếm thông tin trên Web và download về máy tính
• Cập nhật và định dạng dữ liệu trong bảng tính Excel một cách tự động.
Problem Solving with Algorithms and Data Structures using Python
Cuốn sách viết khá kỹ và chi tiết về thuật giải, cấu trúc dữ liệu và giải thuật với các ví dụ minh họa có đầy đủ mô hình flow diagrams và mã lệnh Python. Đây là các kiến thức mà bất kỳ sinh viên CNTT nào cũng phải học và nhắc đi nhắc lại trong các chương trình chính quy. Rèn luyện các kiến thức này giúp bạn nâng cao kỹ năng giải quyết vấn đề, và kỹ năng tư duy logic rất nhiều. Nếu bạn mới bắt đầu học lập trình và muốn có kiến thức nền tảng về giải thuật, giải quyết vấn đề thì đây là cuốn sách bạn nên đọc và nên đọc nhiều lần. Ngoài ra, bạn sẽ tìm thấy nhiều vấn đề cơ bản về khoa học máy tính rất hay trong cuốn sách này bên cạnh những khái niệm liên quan đến lập trình Python.
Cuốn sách Test-Driven Development with Python sẽ đưa bạn qua lần lượt các giai đoạn xây dựng ứng dụng web trong thực tế với Python, bạn không những được học về Python mà còn biết thêm rất nhiều, từ việc xây dựng cơ sở dữ liệu cho ứng dụng, sử dụng JavaScript đến các công cụ test tự động như Selenium, cùng các chủ đề nâng cao như NoSQL, Web Sockets và lập trình async. Cuốn sách không những hướng dẫn bạn lập trình web với Python trên Django mà còn giúp bạn hiểu phương pháp phát triển ứng dụng và làm sao để có những đoạn mã lệnh có phong cách, làm sao xây dựng ứng dụng web chuyên nghiệp, dễ bảo trì sau này hơn.
Python CookBook không phải là một cuốn sách được thiết kế cho người mới bắt đầu học lập trình Python. Cuốn sách này dành riêng cho các lập trình viên Python đã có những kiến thức nhất định về lập trình Python, muốn hiểu sâu hơn về ngôn ngữ Python, cốt lõi của các vấn đề và các kỹ thuật nâng cao để có thể lập trình tốt hơn, xây dựng được các ứng dụng có tốc độ xử lý tối ưu và sử dụng hiệu quả tài nguyên hệ thống hơn. Cuốn sách không giúp bạn tra cứu nhanh các hàm, module nào đó mà tập trung vào các chủ đề lập trình cụ thể, đưa cho bạn các giải pháp khả thi cùng các link trực tuyến để bạn dễ dàng tham khảo tiếp.
Think Complexity là cuốn sách chuyên về thuật toán, cấu trúc dữ liệu dành cho các lập trình viên Python muốn nâng cao kỹ năng lập trình trên Python. Để hiểu rõ các nội dung trình bày trong sách, người đọc cần đọc kỹ về kỹ thuật, thực hành và đánh giá cách giải, nghĩ thêm cách giải quyết khác để có thể hiểu sâu – hiểu chắc về Python.
Nếu bạn làm trong lĩnh vực sinh học, công nghệ sinh học,… thì sách Python for Biologists là dành cho bạn. Sách tập trung vào việc ứng dụng lập trình Python trong lĩnh vực sinh học, xử lý chuỗi DNA và protein,… Thông qua các ví dụ có liên quan trong sinh học, mã lệnh và bài tập trong sách bạn có thể hiểu rõ hơn về việc ứng dụng lập trình Python trong các công việc không chuyên, đặc biệt là lĩnh vực sinh học.
Trước khi các bạn đọc bài viết này thì hãy thử nán lại và tự hỏi chính mình rằng: “mình đã bỏ lỡ những gì khi làm lập trình viên nhỉ?” “Mình có thật sự thỏa mãn khi đang làm công việc hiện tại hay không?” Nếu các bạn đã Tự hỏi chính mình xong rồi thì đọc tiếp nhé. Trong bài viết này mình muốn chia sẻ với các bạn những điều mà mình cảm thấy hối tiếc khi không biết chúng sớm hơn. Mong rằng sau bài viết này, các bạn sẽ có những định hướng tốt hơn cho công việc của mình sau này.
Trước khi quyết định trở thành một web developer, mình đã từng là một kỹ sư phần mềm. Mình cũng từng làm việc với các phần mềm trước đây, chủ yếu là với robot và các máy móc – những khối kim loại vô tri vô giác. Mình chợt nảy ra ý nghĩ: “Liệu chuyển sang web developer có phải là một quyết định thú vị không nhỉ?”. Mình chỉ nghĩ rằng đó là một công việc về lập trình. và mình cũng cảm thấy khá hứng thú với nó, vậy thì tại sao không thử?
Thú thật với các bạn, đến bây giờ mình vẫn cảm thấy đó là quyết định đúng đắn nhất trong cuộc đời của mình. Nhưng đời không phải lúc nào cũng màu hồng, cũng có vài điều mình ước có thể biết sớm hơn trước khi đưa ra quyết định này.
Web developer sẽ không làm việc với thuật toán.
Từ kiến thức nền tảng về lập trình của mình, mình tưởng tượng sẽ đụng đến toán học rất nhiều. Mình cứ nghĩ để trở thành một web developer sẽ phải dùng đến tất cả những thuật toán điên rồ và biến chúng thành những đoạn code. Trong đầu mình nảy ra hàng tá suy nghĩ rằng mình phải cố gắng hết mình với đống thuật toán để đi xa hơn trên con đường trở thành web developer.
Nhưng mọi thứ lại không như thế, web developer nói không với các thuật toán. Việc phát triển web mang thiên hướng nghệ thuật hơn là khoa học, và tất nhiên sẽ không có những thuật toán điên rồ mà mình từng nghĩ trước đây. Việc tìm hiểu ngọn nguồn của một vấn đề, cách giải quyết cũng như tối ưu một task nào đó mới là kỹ năng quan trọng. Mình phải mất một khoảng thời gian để hiểu được điều đó và bỏ ra vài đêm để tự học những kiến thức cơ bản.
Bạn sẽ phải giao tiếp với mọi người thường xuyên
Thành thật mà nói, khi nhắc đến web developer thì trong đầu mình nghĩ ngay đến những con người cả ngày ngồi trên ghế, bấm những dòng code mà không cần phải giao tiếp với người khác, nghe như môi trường làm việc “yên tĩnh”? Có vẻ các web developer chỉ cần ai đó đưa ra yêu cầu cho mình, rồi tìm một góc nào đó và làm xong phần việc của mình. Nghe khá nhàm chán, nhưng lại là điều mình mong đợi khi bắt đầu làm phát triển web.
Những ngày đầu đi làm, mình được học về mô hình agile và các yêu cầu của khách hàng. Đảm bảo với các bạn là những ngày đó mình không muốn nói chuyện với bất cứ ai, nhưng điều kiện lại không cho phép. Mình buộc phải nói chuyện rất rất nhiều người mỗi ngày là đằng khác. Hàng loạt câu hỏi được đưa ra, những cập nhật mới về dự án, khách hàng thay đổi yêu cầu… Những việc đó đòi hỏi mình phải giao tiếp suốt cả ngày với mọi người. Dần dần mình nhận ra, kỹ năng giao tiếp là yếu tố quan trọng đối với bất cứ người làm phát triển web giỏi nào.
Nếu bạn đang tìm một công việc hạn chế tương tác với người khác, thì web developer không phải là một lựa chọn tốt. Mình thật sự shock khi làm việc với các web developer, họ không như những gì chúng ta thường nghĩ. Họ thân thiện, nói nhiều, năng động và sẵn sàng giúp đỡ mình bất cứ lúc nào trong công việc.
Ngôn ngữ lập trình và các framework hỗ trợ sẽ được cập nhật mọi lúc mọi nơi. Cả kể các IDE cũng được cập nhật và nó có thể thay đổi quy trình làm việc thường ngày của bạn. Công ty của bạn có thể yêu cầu bạn chuyển từ Angular sang React hoặc từ MCV sang .NET Core bất cứ lúc nào.
Thậm chí bạn còn có thể bị yêu cầu nhận một công việc mới và phải sử dụng hàng tá công nghệ hoàn toàn khác nhau. Cách tốt nhất để xử lý các tình huống này là bạn cần trang bị cho mình những khái niệm cũng như những kiến thức cơ bản về các công nghệ mới đó, sau đó chỉ là vấn đề về thời gian để tìm ra cách triển khai mà thôi. Nhưng hãy cố gắng nắm bắt cách triển khai nó trong thời gian sớm nhất có thể nhé. Công ty không thể đợi bạn được đâu. Vậy mới nói, để trở thành một web developer, bạn phải học cách chạy đua với thời gian.
Một cách vừa học vừa làm nữa đó là tận dụng thời gian nghỉ để đọc một bài viết liên quan nào đó hoặc thử làm một project cá nhân để củng cố khác khái niệm và cú pháp của ngôn ngữ bạn đang học. Đừng ngại khi bạn phải tìm kiếm trên google nhiều lần, đến cả các nhà phát triển lâu năm cũng phải tìm kiếm mọi thứ trên đó.
Các dự án của bạn thường không phải là tạo nên trang Web mới hoàn toàn
Theo các tutorial và các lớp học phát triển web, mình luôn nghĩ mọi dự án sẽ xuất phát từ những công đoạn đầu tiên. Nhưng không, hầu hết các công ty đã có sẵn phần mềm tạo trang web và họ chỉ muốn bạn cập nhật cũng như bảo trì web mà thôi.
Đó là lý do tại sao việc hiểu các khái niệm cốt lõi lại quan trọng như vậy. Bạn sẽ đọc qua các đoạn code của người khác và phải tìm hiểu những gì họ đã làm và tại sao họ lại làm như vậy. Biết cách đọc code cũng là một kỹ năng quan trọng đấy.
Mình mất vài tháng để tìm hiểu về các đoạn code mà chắc chắn rằng lần đầu bạn xem qua sẽ rất đáng sợ vì bạn không thể hiểu nổi một số khái niệm cốt lõi trong đó. Đó có thể là điểm trừ của bạn trong mắt cấp trên nếu họ không thấy bất cứ sự cố gắng nào ở bạn đấy.
Sẽ không có bất kỳ quy định nào
Thực sự điều này làm mình hơi mất tập trung. Theo quy trình kỹ thuật, có một số quy định bạn phải đáp ứng nếu không sản phẩm của bạn sẽ bị gửi trả lại hoặc tệ hơn là bị loại bỏ hoàn toàn. Điều không thể tránh khỏi là Bạn sẽ phải theo dõi rất nhiều công việc và có vô số giấy tờ cần bạn xin chữ ký. Trong ngành phát triển web, có một số quy tắc giúp công việc này dễ dàng hơn, nhưng chúng có thể sẽ được thay đổi cho phù hợp với cách làm việc của từng công ty.
Ví dụ, không phải công ty nào cũng áp dụng Agile theo cùng một cách. Cũng không phải mọi công ty đều dành thời gian để viết các bài kiểm tra hoặc họ có thể bỏ qua những phần nhất định mà họ cảm thấy không cần thiết.
Công việc phát triển web là một công việc đầy màu sắc. Tại sao mình lại nói như vậy? Vì công việc này phụ thuộc vào ngôn ngữ bạn sử dụng, môi trường bạn làm việc cũng như những người bạn làm việc cùng mà đem đến cho bạn những trải nghiệm khác nhau.
Trên đây chỉ là một vài điều mình ước là mình có thể biết ngay từ đầu. Hiện tại thì đã có nhiều bài viết đề cập đến vấn đề này rồi, nhưng không nhiều bài viết dành thời gian để giải thích cho mọi người hiểu về những gì mà một nhà phát triển chuyên nghiệp thực sự làm mỗi ngày. Hy vọng rằng bài viết nhỏ này có thể cung cấp cho những bạn mới bắt đầu vào con đường này có một cái nhìn sâu sắc hơn một chút.
Có bất ngờ nào đến với bạn khi trở thành một web developer không? Bạn có kỳ vọng mình sẽ bị thổi bay bởi những điều mới lạ trong công việc mà trước đây bạn chưa bao giờ nghĩ tới không ? Hãy tự mình trả lời những câu hỏi này nếu bạn đang chuẩn bị chuyển sang một lĩnh vực hoàn toàn không liên quan tới những gì bạn làm trước đây nhé.
TypeScript chắc hẳn không quá xa lạ đối với các lập trình viên, tuy nhiên, bạn có thật sự hiểu hết về TypeScript, giữa TypeScript và JavaScript có mối quan hệ gì không? Trong bài viết hôm nay của TopDev, chúng ta sẽ cùng tìm hiểu cặn kẽ TypeScript là gì và tại sao nên sử dụng ngôn ngữ này thay vì các ngôn ngữ lập trình khác.
TypeScript Là gì?
TypeScript là gì?
TypeScript (viết tắt là TS) là một ngôn ngữ lập trình mã nguồn mở (OOP) được phát triển và duy trì bởi Microsoft vào năm 2012. TypeScript được xem là một phần mở rộng của JavaScript, sử dụng cú pháp của JavaScript và bổ sung thêm các tính năng mạnh mẽ như kiểu tĩnh và hướng đối tượng để hỗ trợ Type (các kiểu dữ liệu).
TypeScript là ngôn ngữ tĩnh (Static typed) có nghĩa là nó nghiêm ngặt và có trật tự trái ngược với free-type.
Với TypeScript, ta có thể bê nguyên xi code JavaScript vào trong cùng một file và chạy cùng nhau bình thường, bởi vì TypeScript duy trì cú pháp của JavaScript và mở rộng nó bằng một loạt tính năng mới. Nhờ đó mà hiệu năng làm việc được tăng lên đáng kể.
Tuy nhiên một project viết bằng TypeScript cần có compiler (trình biên dịch) để biên dịch những dòng code đó thành JavaScript để browser có thể đọc hiểu được. Tại sao vậy? Nhắc lại kiến thức căn bản đó là browser chỉ hiểu được HTML, CSS và JavaScript, vì vậy cần phải có TypeScript Compiler.
TypeScript hỗ trợ kiểm tra null và undefined thông qua option strictNullChecks. Tính năng này giúp ngăn chặn lỗi do sử dụng giá trị null hoặc undefined trong quá trình phát triển. Bạn có thể chỉ định một biến không được chứa giá trị null hoặc undefined bằng cách sử dụng các kiểu dữ liệu phù hợp.
letname: string | null = null; // cho phép null letage: number = 25; // không cho phép null
Generics
Generics cho phép bạn định nghĩa các kiểu dữ liệu mà không xác định trước kiểu cụ thể. Điều này giúp xây dựng các hàm, lớp, hoặc interface có thể tái sử dụng mà vẫn đảm bảo tính an toàn về kiểu.
function identity<T>(arg: T): T {
return arg;
}
Access Modifiers
TypeScript hỗ trợ các modifier truy cập (access modifiers) cho thuộc tính và phương thức của lớp, bao gồm: public, protected, và private. Điều này giúp kiểm soát quyền truy cập tới các thuộc tính hoặc phương thức của một lớp.
Namespaces trong TypeScript cung cấp cách để tổ chức mã và quản lý các biến, hàm, và lớp trong một không gian tên cụ thể. Điều này giúp giảm thiểu xung đột tên và cải thiện khả năng bảo trì mã.
Type Annotations cho phép bạn xác định loại dữ liệu của biến, tham số hàm, và giá trị trả về, giúp TypeScript hiểu rõ hơn về kiểu dữ liệu mà bạn đang làm việc.
letusername: string = "user123";
functionadd(a: number, b: number): number {
return a + b;
}
Static Typing
TypeScript cung cấp kiểu tĩnh, cho phép kiểm tra kiểu dữ liệu tại thời điểm biên dịch. Điều này giúp phát hiện lỗi ngay trước khi mã được chạy, nâng cao độ tin cậy và dễ bảo trì của ứng dụng.
Tất cả các tính năng này kết hợp lại giúp TypeScript trở thành một công cụ hữu ích trong phát triển ứng dụng, đặc biệt khi làm việc với mã nguồn lớn hoặc theo nhóm.
Hỗ trợ OOP (Lập trình hướng đối tượng)
TypeScript hỗ trợ các khái niệm OOP như lớp (classes), kế thừa (inheritance), đa hình (polymorphism), và đóng gói (encapsulation).
Ưu điểm của Typescript là gì?
TypeScript thật sự thuận tiện và hoàn toàn miễn phí
Đối với loại ngôn ngữ lập trình tĩnh như TypeScript, tất cả những số liệu, thông số của bạn sẽ dễ dàng được lấy hơn nhờ IDE và trình biên dịch.
TypeScript hỗ trợ quá trình tìm kiếm giúp bạn tiết kiệm thời gian kiểm tra lại code, không cần thông qua bất cứ một ai để có thể tìm thông tin dữ liệu, ngoài ra TypeScript làm giảm phần trăm va chạm lỗi trong thời gian vận hành.
Ngoài ra, đây cũng là một trong những phần mềm nổi trội được Microsoft hỗ trợ hoàn toàn miễn phí.
Thao tác nhanh chóng và đơn giản hơn
Ngôn ngữ TypeScript có thao tác khá đơn giản, tiết kiệm thời gian hơn nhưng lại đem đến kết quả tốt đến bất ngờ, nó khắc phục tình trạng xuất hiện lỗi và dễ đọc hơn.
Cụ thể là, đối với ngôn ngữ thông thường người dùng thường thao tác theo các bước như:
Restart lại hàm, tạo đối số, hoàn thành đoạn mã
Sau khi apply hết các đoạn mã, công cụ cần thiết thì cho vận hành
Trong quá trình vận hành nếu phát hiện lỗi thì sửa chữa lại.
Tái cấu trúc
Chắc chắn trong quá trình viết code, các lập trình viên sẽ thường xuyên mắc phải nhiều lỗi nhỏ và cần chỉnh sửa, việc sử dụng TypeScript sẽ giúp bước chỉnh sửa code trở nên dễ dàng hơn nhờ hiệu quả của lệnh Rename Symbol/Find All Occurrences.
Đối với các ngôn ngữ khác, khi muốn sửa chi tiết nào đó thì thường phải thay đổi luôn những tập tin khác nếu có liên quan hoặc sử dụng RegEx
Trong trường hợp người dùng TypeScript muốn nâng cấp hệ thống của mình (thêm hoặc xóa thuộc tính, đổi tên,…) thì TypeScript sẽ giúp bạn tái cấu trúc lại sao cho phù hợp với nhu cầu tìm kiếm của bạn mà không gây náo loạn trong hệ thống. Trong trường hợp code của bạn không match được bất cứ dữ liệu nào thì sẽ được báo đến bạn ngay để được xử lý ổn thỏa.
Giảm tỷ lệ mắc lỗi trong hệ thống
Nhờ vào việc cảnh báo lỗi ngay khi viết code, nên tỷ lệ mắc lỗi trong hệ thống khi sử dụng TypeScript khá thấp, TypeScript sẽ trả lại giá trị null hoặc gợi ý thay đổi chỉnh sửa. Mỗi lần chỉnh sửa sau khi được TypeScript báo lỗi thì phần trăm hệ thống hoạt động mà không mắc phải lỗi là rất cao, có thể dễ dàng thấy được TypeScript giúp người dùng tiết kiệm không ít thời gian để sửa lỗi.
Hạn chế thử nghiệm Boilerplate
Với quy trình kiểm tra và báo lỗi tự động ngay khi code, khi bạn đã chắc chắn rằng các biến dữ liệu của mình nằm ở đúng chỗ thì bạn không cần phải lo hệ thống không vận hành hoặc không cần phải kiểm tra lại nữa.
Điều này sẽ giúp bạn tiết kiệm thời gian, không đặt quá nhiều chú ý vào những thao tác đơn giản cho việc kiểm tra mà có thể tận dụng thời gian tối ưu hơn bằng cách kiểm tra chất lượng logic của hệ thống.
Việc hạn chế được các bước thử nghiệm sẽ giúp tiết kiệm được thời gian hơn, nâng cao hiệu quả công việc của các lập trình viên.
Hợp nhất mã đơn giản
Sau khi hoàn thiện được một đoạn code và cho chúng chạy thử nghiệm, có thể ngay trong môi trường đó mọi thứ đều hoạt động trơn tru, nhưng bạn có chắc được đoạn code đó cũng sẽ hoạt động tốt khi ở trong môi trường điều kiện khác?
Một trong những điểm mạnh của TypeScript là bạn có thể hợp nhất mã một cách đơn giản để có thể dễ dàng kiểm tra đánh giá đoạn mã bạn vừa mới cho ra đời kia bằng cách sử dụng Typedef – kiểm tra biên dịch.
Lại một lần nữa, TypeScript lại giúp người dùng tiết kiệm thời gian và công sức!
Hỗ trợ tối ưu hóa quy trình làm việc
TypeScript sẽ không khuyến khích người dùng nhảy bước, thực hiện sai thao tác. TypeScript khuyến khích người dùng đưa ra quyết định về kiểu dữ liệu khi sử dụng ngôn ngữ kiểu tĩnh trước khi thực hiện thao tác, các bước tiếp theo. Chính vì những quy luật như thế sẽ giúp cho các lập trình viên tối ưu được quy trình làm việc hiệu quả hơn.
Nhược điểm của Typescript là gì?
Bất kỳ ngôn ngữ nào cũng có điểm yếu và hạn chế của nó, và TypeScript cũng vậy, điểm hạn chế của TypeScript là:
Bắt buộc dùng biên dịch
Để có thể vận hành một tệp TypeScript với đuôi .js trên nền tảng Node.js bạn bắt buộc phải dùng trình biên dịch để có thể sử dụng.
Bước thiết lập cồng kềnh
Trước khi có thể sử dụng được TypeScript, bạn cần đảm bảo rằng máy chủ Node.js, trình thử nghiệm và webpack đều có thể hoạt động với TypeScript, nếu không thì bạn sẽ không sử dụng được.
Bên cạnh đó, mỗi khi bạn apply thêm bất kỳ library nào như Redux, React và Styled-Component thì bạn cũng phải thêm Typedef vào.
Chỉ là phần ngôn ngữ mở rộng hỗ trợ
Sau cùng, chức năng của TypeScript cũng chỉ là để biên dịch về JavaScript, nó không phải là một ngôn ngữ có thể vận hành độc lập và nó cũng đồng thời không thể thay thế được vai trò của JavaScript. Chức năng của TypeScript bị giới hạn bởi chức năng của JavaScript, TypeScript chỉ là được nâng cấp từ điểm yếu của JavaScript.
Chỉ với mỗi TypeScript, người dùng không thể nào hoàn thiện được các công đoạn của dự án, công dụng của TypeScript chỉ thực sự nổi bật khi được kết hợp nhuần nhuyễn và tối ưu với các ngôn ngữ, nền tảng và tool khác.
TypeScript có thực sự là một mã nguồn mở?
Có nhiều luồng ý kiến cho rằng TypeScript là một mã nguồn mở, và đó cũng là một trong những lý do họ thích sử dụng TypeScript. Nhưng liệu đó có phải sự thật?
Đúng! TypeScript thực sự là một mã nguồn mở nhưng nó vẫn nằm dưới sự chi phối của Microsoft – công ty phần mềm nổi tiếng về các phiên bản phần mềm độc quyền.
Nhiều người dự đoán, TypeScript là một sản phẩm marketing của Microsoft dùng để thu hút người dùng về công năng và sự miễn phí. Tuy nhiên sau cùng, việc Microsoft có kéo dài việc miễn phí này hay không vẫn phụ thuộc rất nhiều vào Microsoft và người dùng hoàn toàn bị động trong chuyện này.
Hướng dẫn cài đặt TypeScript
Cách dễ nhât để thiết lập TypeScript là thông qua trình quản lý NPM (Node.js).
Bước 1: Cài đặt Node.js và npm
Trước hết, bạn cần cài đặt Node.js và npm. Bạn có thể tải Node.js từ trang web chính thức Node.js. Khi cài đặt Node.js, npm cũng sẽ được cài đặt cùng.
Chọn phiên bản LTS (Long Term Support) và tải về.
Thực hiện theo các hướng dẫn để cài đặt.
Sau khi tải xuống và cài đặt thành công, mở command prompt/terminal và chạy lệnh sau để kiểm tra:
node -vnpm -v
Bước 2: Cài đặt TypeScript
Sau khi cài đặt Node.js và npm, bạn có thể cài đặt TypeScript thông qua npm.
Cài đặt TypeScript toàn cầu: Chạy lệnh sau trong terminal:
npm install -g typescript
Kiểm tra cài đặt TypeScript: Kiểm tra xem TypeScript đã được cài đặt thành công bằng cách chạy lệnh sau:
tsc -v
Cài đặt TypeScript trong một dự án cụ thể
Nếu bạn muốn cài đặt TypeScript cho một dự án cụ thể, bạn có thể cài đặt nó dưới dạng một devDependency trong thư mục dự án của bạn.
Tạo một thư mục dự án mới:
mkdir my-typescript-project
cd my-typescript-project
Khởi tạo một dự án npm mới:
npm init -y
Cài đặt TypeScript cục bộ cho dự án:
npm install --save-dev typescript
Tạo tệp cấu hình TypeScript (tsconfig.json): Tạo một tệp tsconfig.json trong thư mục dự án của bạn để cấu hình TypeScript:
Biên dịch mã TypeScript: Chạy lệnh sau để biên dịch mã TypeScript thành JavaScript:
npx tsc
Chạy mã JavaScript đã biên dịch: Mã đã biên dịch sẽ được lưu trong thư mục dist. Chạy mã JavaScript bằng Node.js:
node dist/index.js
TypeScript vẫn đang liên tục được phát triển, nếu bạn đọc được bài viết này thì chắc hẳn bạn là một dev JS (Nếu không phải tôi khuyên bạn nên tiếp cận JS ES6 trước khi học Typesript). Vì vậy trong khuôn khổ bài viết tôi sẽ không chỉ rõ cách sử dụng cơ bản. Bạn nên tham khảo thêm tại website của TypeScript để cập nhật tính năng mới.
cURL là một command line tool và thư viện được sử dụng để truyền dữ liệu thông qua nhiều giao thức khác nhau (như HTTP, HTTPS, FTP, FTPS, SCP, SFTP, FILE, IMAP, SMTP, POP3, RTSP và RTMP…). Được đời từ năm 1997 viết bởi Daniel Stenberg viết bằng C. Với giao thức HTTP, cURL hỗ trợ việc gửi đi một request với tất cả các phương thức hiện có như GET, POST, PUT, DELETE…
Cơ bản về sử dụng cURL PHP
Với giao thức HTTP, cURL hỗ trợ việc gửi đi một request với tất cả các phương thức hiện có như GET, POST, PUT, DELETE…Trong PHP có cung cấp các API để làm việc với thư viện này với các chức năng khá đầy đủ cURL PHP.
cURL có hỗ trợ việc truyền dữ liệu qua giao thức HTTPS. Ta có thể dùng cURL trong Php để GET và POST dữ liệu, truy cập REST API service có kết hợp với JSON hoặc xác thực OAUTH.
Khi sử dụng cURL thường có 3 bước cơ bản:
Khởi tạo cURL
Cấu hình tham số cho cURL
Thực thi cURL
Ngắt cURL, giải phóng dữ liệu
$ch = curl_init(); //khai báo curl
curl_setopt($ch, CURLOPT_URL,"https://topdev.vn"); // xác định địa chỉ cần thực thi
curl_setopt($ch, CURLOPT_POST, 1); // POST
// và các tham số khác ... dùng curl_setopt để dịnh giá trị cho mỗi tham số.
curl_exec ($ch); // thực thi curl
curl_close ($ch); // đóng curl để giải phóng vùng nhớ
?>
Thiết lập cURL
Bạn có thể cấu hình thêm một hoặc nhiều option nữa cho curl bằng curl_setopt. Các curl_setopt này phải được đặt trước curl_exec thì mới có hiệu lực. Đây là một hàm quan trọng trong cURL để xử lí các dữ liệu vào:
CURLOPT_RETURNTRANSFER: TRUE để curl_exec() trả về chuỗi chứ không xuất thẳng ra màn hình.
CURLOPT_CONNECTTIMEOUT: Thời gian cho phép cURL cố gắng kết nối (giây), 0 vô tận
CURLOPT_USERAGENT: Nội dung của dòng User-Agent: trong header của HTTP khi gửi yêu cầu
CURLOPT_URL: URL mà cURL gửi yêu cầu
CURLOPT_POST: TRUE – Thiết lập yêu cẩu gửi theo phương thức POST
CURLOPT_POSTFIELDS: Mảng dữ liệu để POST
Bạn có thi hành nhiều thiết lập một lúc bằng hàm curl_setopt_array():
//Dữ liệu để POST
$data = array(
'name' = 'TopDev',
'data' = array(1,2,3,4),
'value' = 'Viec Lam IT'
);
//Có thể phải dùng thêm hàm chuyển tham số mảng thành chuỗi URL encode
//$data = http_build_query($data) nếu POST
$curl = curl_init();
$options = array(
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_URL => 'https://topdev.vn/api/',
CURLOPT_POST => true,
CURLOPT_USERAGENT => "Safari/8.0",
CURLOPT_POSTFIELDS => $data
);
curl_setopt_array($curl, $options);
Gửi request với cURL
Tạo tài nguyên cURL và thiết lập xong như trên, ta tiến hành gửi request với cURL bằng hàm curl_exec(). Kết quả trả về false hoặc true và giá trị là chuỗi trả về khi CURLOPT_RETURNTRANSFER thiết lập true.
$curl = curl_init();
// code khác
$result = curl_exec($curl);
if ($result === FALSE) {
echo "CCURL Error";
} else {
//Succeess!, kết quả trong $result
}
$result trả về có thể là JSON, string…
Sau khi gửi yêu cầu thành công, nhận hết giá trị trả về bạn cần đóng CCURL bằng hàm curl_close($curl);
Nói tới nền tảng Artificial Intelligence, sẽ thật thiếu sót khi không nhắc tới FPT.AI. Nền tảng FPT.AI là sản phẩm mới ra đời, áp dụng các kỹ thuật học máy tiên tiến về xử lý ngôn ngữ tự nhiên. Sản phẩm hỗ trợ xây dựng hệ thống giao tiếp tự động để tích hợp vào các nền tảng hội thoại (Facebook Messenger,…), các ứng dụng hội thoại do doanh nghiệp tự phát triển và các thiết bị thông minh như robot, điện thoại di động, thiết bị điều khiển… FPT.AI hỗ trợ các ứng dụng sử dụng giao diện tương tác với người dùng bằng giọng nói hoặc văn bản.
Video này sẽ cho bạn thấy hướng đi mà FPT.AI đã chọn khi ứng dụng AI trong việc “Mô phỏng bộ não con người” do chính chuyên gia Nguyễn Thượng Tường Minh – Product Manager của FPT.AI Platform chia sẻ!
Hẳn là một “thu hoạch” thú vị phải không nào! Hơn thế nữa, bạn sẽ còn tìm thấy nhiều topics “hợp gu” của mình hơn tại Vietnam Mobile Day 2019 cùng với các chuyên gia “SIÊU CHẤT”!! Đừng bỏ lỡ session nào bạn nhé, theo dõi fanpage để update nào!
HÉ LỘ MỘT SỐ TOPICS HOT NĂM NAY:
▶️ “Khởi nghiệp game: Làm sao để sống sót và kinh nghiệm khởi nghiệp game studio” | Nguyễn Đình Khánh – CEO/Founder at ▶️ “Building a server-less DApp on Mobile using Blockchain” | Lê Yên Thanh – CTO, CoFounder at ▶️ “Unity và những lời khuyên tốt nhất cho Indie và small studio” | Lê Huy Hoàng at Field Engineer at ▶️ “How small mobile applications with the use of AI / Data projects can help big problems. A Vietnam Case Study” | Vương Hoàng Kim – Head of Products at . ▶️ “WhatsApp-clone Real-Time & Offline Serverless Messaging Mobile/Web App using AWS Amplify & AppSync” | Nguyễn Nhất Thanh – Director of Technology & Agile Digital Transformation at . ▶️ “The State of Mobile in Vietnam: 2019 Insights and Benchmarks” | Nana Phan – SEA Sales Manager at ▶️ “High-performance image recognition application with 50 millions records in real-time” | Hoàng Tùng – CEO at ▶️ “Doing online experiments the proper way: true effect or due to chance?” | Uyên Nguyễn – Data Scientist at ▶️ “X3 tốc độ phát triển dự án game với Scrumban” | Lê Giang Anh – Head of Product at ▶️ “Cross Platform Development: Flutter vs React Native” | Đặng Ngọc Đức – Mobile Developer at
============================
THÔNG TIN CHI TIẾT VÀ ĐĂNG KÝ:
Book now: http://topdev.vn/s/X5D57UHI
Website: https://mobileday.vn/
Time: Hồ Chí Minh – 06/06/2019 | Hà Nội – 14/06/2019
Event team: event@applancer.net | 028 6681 3236 hoặc Ms. Thoa | thoa.nguyen@applancer.net | 038 5098 969
CODE giảm 30% vé tham dự cho độc giả: TOPDEVBLOG@VMD19
Hệ thống của các bạn bình thường xử lý được 10 request/s. Nếu bây giờ số lượng request đó tăng lên thành 100, 1000 request/s thì bạn có dám khẳng định hệ thống của bạn sẽ chạy ngon không?
Để có thể phán đoán được nó chạy ngon hay không thì việc test tải hệ thống trở nên vô cùng quan trọng.
Nói là test tải hệ thống, nhưng nếu mà yêu cầu bạn lên plan để test chắc hẳn các bạn cũng chẳng biết nên bắt đầu từ đâu, làm thế nào để đánh giá quá trình test của mình là thành công. Hay đơn giản chỉ cần chạy mấy tool benchmark là xong?
Vậy hãy cùng đọc bài này để giải đáp được thắc mắc đó nhé.
Mục tiêu bài viết:
Hiểu được việc test tải hệ thống là làm những gì.
Biết cách làm thế nào để cải thiện hệ thống.
Bài này hơi dài 1 tí, các bạn cố gắng đọc hết nhé. Sau khi đọc xong sẽ hoàn toàn tự tin để có thể lên được plan test tải hệ thống.
Mục đích của việc test tải hệ thống
Dưới đây là 3 mục đích chính của việc test tải hệ thống:
**Tìm điểm bottleneck (nút cổ chai): **Đưa ra 1 số Use Case có thể xảy ra trong tương lai (ví dụ như sắp tới đưa ra campaign hot, số lượng người đăng kí lúc đó sẽ tăng đột biến …). Sau đó ứng với mỗi Use Case sẽ đo xem thời gian response của hệ thống là bao nhiêu. Tìm điểm bottleneck (nút cổ chai).
**Cải thiện hệ thống: **Sau khi biết được điểm bottleneck sẽ tiến hành đi cải thiện hệ thống.
Xác nhận tính scale của hệ thống.
Cụ thể cùng đi xem những Use Case nào hay gặp trong thực tế nhé.
Đưa ra Use Case và đo response của hệ thống
Dưới đây là 1 vài Use Case mình thấy hay gặp nhất trong quá trình vận hành hệ thống.
Đối với mỗi Use Case, chúng ta sẽ đi đo đạc xem thời gian response của hệ thống là bao nhiêu và tiến hành cải thiện hệ thống nếu có.
Use Case 1: Sau khi hệ thống được đưa ra, số lượng người dùng đăng kí vào hệ thống tăng đột biến.
Với những hệ thống mà nhiều người quan tâm thì khi release sẽ có rất nhiều người vào đăng kí hệ thống.
Ví dụ như tuần sau sẽ release hệ thống ”dự đoángiá đề chuẩn 80%” chẳng hạn. Nếu có hệ thống đó ra đời, mình khẳng định sẽ có rất nhiều người vào đăng kí vào thời điểm đó.
Vậy để đảm bảo hệ thống của bạn chạy không vấn đề gì với số lượng lớn người đăng kí vào thời điểm đó thì việc test tải hệ thống trước khi release là điều vô cùng quan trọng.
Use Case 2: Sau khi hệ thống chạy được 1 thời gian thì dữ liệu càng ngày càng nhiều.
Khác với Use Case 1 thì Use Case này chủ yếu tập trung vào vấn đề dữ liệu trong DB càng ngày càng to ra, dẫn đến tốc độ query trong DB cũng càng ngày càng chậm xuống. Kể cả có đánh index chuẩn đi chăng nữa, nhưng nếu dữ liệu trong DB mà tăng lên thì dẫn đến việc index không thể lưu hết trên Memory được. Kết quả hiệu năng của câu query sẽ giảm xuống.
Với Use Case này thì việc test tải hệ thống cũng khá quan trọng để đảm bảo thời gian response hệ thống là nhanh nhất có thể.
**Use Case 3: **Nhờ vào việc đưa ra campaign mà số lượng người dùng access vào hệ thống tăng đột biến.
Với Use Case này mình thấy hay gặp nhất và việc đưa ra plan để test tải trước khi release là điều không thể thiếu.
Ví dụ như nhà mạng Viettel chuẩn bị có đợt khuyến mãi nạp thẻ 100k sẽ được tặng 500k. Các bạn nghĩ sao về campaign này. Chắc hẳn số lượng người nạp thẻ lúc đó phải kinh khủng lắm.
Cải thiện hệ thống
Bình thường chúng ta hay làm việc với dữ liệu nhỏ thì mình khẳng định ít ai để ý đến vấn đề hiệu năng hay 1 số lỗi xảy ra như out of memory … Nhưng 1 khi chạy hệ thống đó với dữ liệu lớn thì chắc chắn sẽ ra nhiều vấn đề.
Như ngày trước mình có làm 1 chức năng upload file csv về thông tin người dùng và gửi tin nhắn đến tất cả người đó. Bình thường mình chỉ test file csv tầm 100 record, cùng lắm 1000 record thấy chạy khá ok.
Nhưng khi đưa cho khách hàng dùng, bên họ upload file csv toàn tầm 1 triệu, 10 triêu record. Lúc đó hệ thống lăn quay ra chết. Vì mình toàn load tất cả dữ liệu trong file csv vào 1 biến duy nhất. Kết quả tràn bộ nhớ.
Do đó ở đây mình muốn nói rằng để đảm bảo hệ thống chạy có ngon hay không, có đáp ứng được dữ liệu lớn hay không thì việc test hệ thống với dữ liệu lớn là điều cực kì quan trọng.
Vừa test vừa đi cải thiện hệ thống là 1 trong những mục đích quan trọng nhất.
Xác nhận tính scale của hệ thống
Đặc thù của những hệ thống đang được xây dựng trên môi trường Cloud như AWS, GCP, Azure đó là nếu số lượng request tăng lên thì sẽ tăng thêm server, nếu số lượng request giảm xuống thì sẽ giảm server.
Để đáp ứng được nhu cầu này thì cần phải nắm rõ tính scale của hệ thống. Cụ thể phải nắm bắt được những điểm sau:
Cấu trúc hệ thống có thể xử lý được 1 số lượng throughput nào đó (ví dụ như 100 request/s, 1000request/s, 2000 request/s, 5000 request/s)
Hệ thống xử lý tối đa throughput là bao nhiêu?
Cái ý thứ nhất là điểm quan trọng nhất cần phải nắm bắt được.
Ví dụ như throughput tăng lên 2 lần thì chỉ cần tăng số lượng web server lên 2 lần là được ak? Hay phải tăng số lượng DB lên 2 lần? Ngược lại khi số lượng request giảm đi 2 lần thì cần giảm cái nào đi thì được? Những điểm như này cần phải nắm bắt.
Cái ý thứ 2 thì không cần phải nắm bắt cũng được. Nhưng nếu tương lai muốn cung cấp hệ thống xử lý nhiều request hơn nữa thì việc phán đoán xem với cấu trúc hiện tại thì có scale được hay không? cần phải thiết kế lại hệ thống không? là điều không thể thiếu.
2 chỉ báo quan trọng khi đo hiệu năng
Mình chắc hẳn khi tối ưu hệ thống, ai cũng gặp những case kiểu như: ví dụ như nếu đưa cái plugin này vào thì wordpress sẽ chạy nhanh gấp 10 lần …
Tuy nhiên, cái việc “nhanh gấp 10 lần” ở đây tức là đang nói đến vấn đề gì? thì chúng ta cần nên để ý tới.
Có thể đang nói về tốc độ của hệ thống?
Thế nhưng để đánh giá về tốc độ thì hiện nay có 2 chỉ bảo chắc hẳn mọi người cũng thường hay nghe thấy đó là throughput (lưu lượng) và latency (thời gian trễ).
Cùng nhau tìm hiểu xem 2 chỉ báo này khác nhau thế nào nhé.
Throughput
Chỉ báo Throughput muốn nói đến lượng công việc xử lý trong 1 đơn vị thời gian. Về Website thì muốn nói đến số lượng request xử lý trong 1 giây. Nó còn được gọi là rps (Request per second).
Quay lại ví dụ trên, 「sau khi đưa plugin này vào hệ thống thì tốc độ wordpress sẽ tăng lên gấp 10 lần」nếu đang nói về throughput thì tức là số lượng page hiển thị trong 1 giây tăng lên 10 lần.
Latency
Chỉ báo Latency là tổng thời gian xử lý của 1 việc nào đó.
Quay lại ví dụ trên, 「sau khi đưa plugin này vào hệ thống thì tốc độ wordpress sẽ tăng lên gấp 10 lần」nếu đang nói về latency thì tức là thời gian response của hệ thống đang từ 1s bây giờ giảm xuống còn 0.1 giây.
Throughput và Latency trong hệ thống
Đa số các hệ thống ngày nay sẽ không chỉ gồm 1 web server mà còn bao gồm rất nhiều thành phần khác nữa như database server, cache server …
Hiệu năng của từng con server đó cũng có thể gây ảnh hưởng đến hiệu năng của toàn bộ hệ thống. Ví dụ như tốc độ query của DB chậm thì cho dù con web có xử lý nhanh đi chăng nữa thì thời gian xử lý của toàn bộ hệ thống vẫn chậm. Vì con DB nó gây ảnh hưởng đến con Web.
Throughput của toàn bộ hệ thống là giá trị throughput nhỏ nhất của từng hệ thống con.
Latency của toàn bộ hệ thống là giá trị tổng cộng của lantecy của từng hệ thống con.
Đến đây có vẻ hơi trừu tượng đúng không. Vậy mình lấy 1 ví dụ để các bạn dễ hình dung nhé.
Thay vì lấy ví dụ hệ thống gồm web server, database server … thì mình lấy ví dụ về đường cao tốc.
Mình thấy khá dễ hiểu khi áp dụng vào throughput và latency.
Nhìn vào hình ảnh bên trên ta có thể thấy được:
throughput của đoạn đường trên là 500 xe / 1 tiếng
latency của đoạn đường trên là 15 tiếng (15 = 3 + 4 + 8)
Cải thiện hệ thống
Để cải thiện hệ thống thì chúng ta cần phải tăng số lượng throughput và giảm latency.
Cùng đọc phần tiếp theo để hiểu xem cụ thể là làm thế nào nhé.
Cải thiện throughput
Vậy làm thế nào có thể cải thiện được throughput của hệ thống.
Như ví dụ về đoạn đường ở bên trên ta thấy, nếu ta cải thiện sai chỗ thì hiệu năng của hệ thống cũng không thể tăng được.
Ví dụ như trong đoạn đường từ Hà Nội đến Thanh Hoá, cho dù có thêm mấy làn đường để tăng số lưu lượng xe từ 1000 đến 5000 xe đi chăng nữa thì tổng throughput của hệ thống cũng không thể tăng được, vẫn chỉ là 500 xe thôi. Lí do tại sao?
Bởi vì throughput của đoạn từ Vinh đến Đà Nẵng đang gây cản trở đến toàn bộ hệ thống, bởi vì 5000 xe mà đi vào đoạn đường chỉ max 500 xe thì đương nhiên vẫn bị tắc rồi. Có cố cũng không thể đi được.
Nên nếu cải thiện thì nên cải thiện đoạn đường này là tốt nhất.
Và cái đoạn từ Vinh đến Đà Nẵng này người ta gọi là bottleneck (nút cổ chai).
Nhờ vào việc xác định được bottleneck mà có thể khiến ta dễ dàng cải thiện throughout của toàn bộ hệ thống.
Ví dụ về cải thiện throughput
Quay lại ví dụ về đoạn đường ở bên trên. Giả sử như đoạn đường từ Vinh đến Đà Nẵng đang thi công và xảy ra tắc đường. Hiện tại số lượng xe lưu thông trên 1 giờ chỉ còn có 100 xe.
Khi này throughput của toàn bộ hệ thống giảm xuống còn 100 xe / 1 giờ.
Nếu như chúng ta giải quyết được vấn đề tắc đường này thì chắc chắn throughput của hệ thống sẽ tăng lên. Giả sử như sau khi giải quyết xong tắc đường đoạn từ Vinh đến Đà Nẵng thì bây giờ lưu lượng xe đã tăng lên thành 2000 xe / 1 giờ.
Lúc này throughput của hệ thống đã chuyển sang đoạn từ Thanh Hoá đến Vinh và là 800 xe / 1 giờ (trước khi cải thiện là 100 xe / 1 giờ).
Nếu như chúng ta tăng thêm làn đường mới ở đoạn này thì chắc chắn throughput của toàn bộ hệ thống sẽ tăng lên.
Nhưng chẳng may chúng ta lại đi thêm làn đường ở đoạn mà không phải bottleneck thì sẽ như thế nào?
Chẳng hạn như chúng ta thêm làn đường ở đoạn Thanh Hoá – Vinh để số lương xe lưu thông tăng lên thành 1200 xe / 1 giờ.
Vậy throughput của toàn bộ hệ thống theo các bạn có tăng lên không? Câu trả lời là không nhé.
Vì đoạn ở Vinh – Đà Nẵng vẫn còn đang tắc mà. Số lượng xem lưu thông ở đoạn này có 100 xe. Nên cho dù ở Thanh Hoá – Vinh mà nhiều xe lưu thông đi chăng nữa thì đến đoạn Vinh – Đà Nẵng thì vẫn phải chịu cảnh tắc đường thôi. Nên đoạn này mà không cải thiện thì throughput của hệ thống sẽ không thể tăng được.
Ở ví dụ trên là mình đang nói về vấn đề lưu thông xe trên đường. Nhưng với hệ thống website hiện nay thì hoàn toàn có thể áp dụng được.
Chính vì vậy, để có thể cải thiện được throughput của hệ thống thì điều đầu tiên mình nên làm là tìm ra chính xác đâu là điểm bottleneck.
Cải thiện Latency
Latency là tổng thời gian xử lý của từng bộ phận trong hệ thống, bao gồm cả thời gian đợi.
Để cải thiện được Latency thì chúng ta sẽ đi xem xét xem bộ phận nào xử lý đang chiếm nhiều thời gian nhất thì sẽ đi cải thiện bộ phận đó trước. Sau đó sẽ đi cải thiện các bộ phận tiếp theo.
Nhưng nếu mà thời gian xử lý của từng bộ phận đã nằm trong khoảng thích hợp rồi thì cho dù muốn cải thiện thêm nữa thì cũng không thể được. Tức là nó đã đạt đến ngưỡng rồi ấy.
Ví dụ như với web application, những bộ phận nào đang xử lý chiếm thời gian nhất thì tìm hiểu xem xem thuật toán của nó đã tối ưu chưa, có dùng lãng phí memory không, nếu là DB thì kiểm tra xem đã gắn index chưa …
Để đo xem thời gian chạy của từng chức năng là bao nhiêu, có bao nhiêu lời gọi hàm thì có 1 tool sẽ giúp các bạn làm được điều đó là Profiler.
Ví dụ các bạn đang dùng php thì search google là: Profiling Tools For PHP
Nếu là java thì các bạn cũng search tương tự.
Ví dụ về cải thiện Latency
Quay lại ví dụ ở bên trên, đoạn đường Vinh – Đà Nẵng đang tắc đường. Nên lúc này latency của toàn bộ hệ thống là 18 giờ.
Sau khi giải quyết được vấn đề tắc đường thì latency đã được cải thiện thành 13 giờ.
Thế nhưng nếu chúng ta đi cải thiện nhầm ở đoạn đường mà không xảy ra bottleneck thì mặc dù throughput không được cải thiện nhưng mà latency ít nhiều cũng được cải thiện, vì nó chỉ còn 16 giờ.
Từ đó chúng ta có thể thấy được, so với việc cải thiện throughput thì cải thiện latency sẽ hơi khác 1 chút. Đó là chúng ta chỉ cần cải thiện latency của 1 bộ phận nào đó trong hệ thống cũng kéo theo latency của toàn bộ hệ thống giảm xuống.
Tổng kết
Đọc qua bài này các bạn thấy thế nào ak? Đã nắm rõ được test tải hệ thống là sẽ làm thế nào chưa? Hơi lắm chữ 1 chút nhưng nó khá cần thiết đấy.
Mình hi vọng qua bài này sẽ giúp các bạn có chút hình dung xem việc test tải hệ thống sẽ làm những gì, và để cải thiện hệ thống thì chúng ta nên làm gì.
Bài này mình sẽ chỉ tập trung vào phần lý thuyết thôi nên đọc sẽ hơi mệt nhưng cũng khá dễ hiểu. Có thể bài tới mình sẽ viết 1 bài dạy các bạn cách test tải sẽ như thế nào, dùng tool nào hợp lí, cách tìm bottleneck ra sao.
Viết 1 bài mất nhiều năng lượng quá, cũng giống như các bạn làm việc trên giường ấy. Mà thôi nói đến đây các bạn tự hiểu. 😀
Vì mình mới sử dụng git, nên mình muốn chia sẻ với các bạn một vấn đề mình gặp trong lúc dùng git. Đây là vấn đề cơ bản, nhưng lại tốn thời gian cho những người mới như mình. Bởi vậy, bài viết này là dành cho các bạn mới làm quen với Git như mình. Các pro xin đừng ném đá. Trong bài viết này mình sẽ hướng dẫn các bạn cách tạo SSH Key cho Github trên Window và Ubuntu. Sau đó là config SSH Key này trên Github để mỗi lần thực hiện các thao tác với git (clone, commit, push, pull,..) thì Github không yêu cầu nhập mật khẩu nữa.
Lúc clone một repository trên git về máy của mình, chúng ta sẽ thấy có 2 lựa chọn là Clone with HTTPS và Clone with SSH:
Việc Clone with HTTPS khá đơn giản, git chỉ yêu cầu chúng ta nhập thông tin đăng nhập khi clone, và trong quá trình sau này khi thao tác một số câu lệnh của git nó vẫn tiếp tục yêu cầu chúng ta nhập mật khẩu. Điều này khiến mình cảm thấy hơi phiền lòng. Việc Clone with SSH sẽ giúp ta tránh được nỗi phiền này, song nó lại bắt chúng ta cấu hình trước khi dùng. Vậy là một cái là đau khổ triền miên, cái kia là khổ trước sướng sau. Lúc ban đâu, mình đã thử Clone with SSH như cách mình Clone with HTTPS dĩ nhiên là lúc đó mình chưa cấu hình gì cho SSH Key cả, người mới mà, thì mình nhận được thông báo như sau:
Cuối cùng các bạn hãy clone lại và tận hưởng kết quả đi nhé, từ nay về sau sẽ không còn gặp phiền phức khi git yêu cầu nhập mật khẩu nữa rồi.
Với những bạn không tìm thấy file: github_rsa.pub, hãy làm như sau: 1. Mở cmd với quyền administrator. 2. Chạy câu lệnh:
ssh-keygen -t rsa -C "your_email@example.com"
=>> Thế là các bạn đã tạo xong file github_rsa.pub rồi. Quay lại bước 1 và làm tiếp nhéVới các bạn sử dụng Ubuntu:
Đầu tiên các bạn mở Terminal lên và chạy các lệnh sau:
cd ~/.ssh ls id_* cat < ~/.ssh/id_rsa.pub
Sau khi có ssh-key, các bạn tiến hành cấu hình tiếp tương tự như trên Window (Trường hợp tìm không thấy ssh-key cũng thực hiện tương tự như cách trên window.
Redis là gì? – Redis (REmote DIctionary Server) là một mã nguồn mở được dùng để lưu trữ dữ liệu có cấu trúc, có thể sử dụng như một database, bộ nhớ cache hay một message broker.
Nó là hệ thống lưu trữ dữ liệu với dạng KEY-VALUE rất mạnh mẽ và phổ biến hiện nay. Redis nổi bật bởi việc hỗ trợ nhiều cấu trúc dữ liệu cơ bản như:hash, list, set, sorted set, string… Tất cả dữ liệu được ghi và lưu trên ram, do đó tốc độ đọc ghi dữ liệu rất là nhanh.
Các ứng dụng của Redis
Sau khái niệm redis là gì thì chúng ta hãy đi đến ứng dụng của Redis ngoài tính năng lưu trữ KEY-VALUE trên RAM thì Redis còn hỗ trợ tính năng xắp xếp, query, backup dữ liệu trên đĩa cứng cho phép bạn có thể phục hồi dữ liệu khi hệ thống gặp sự cố…và có thể nhân bản (Chạy nhiều Server Redis cùng lúc).
Caching: Sử dụng làm bộ nhớ đệm. Chính tốc độ đọc ghi nhanh mà Redis có thể làm bộ nhớ đệm, nơi chia sẻ dữ liệu giữa các ứng dụng hoặc làm database tạm thời. Ngoài ra Redis có thể sử dụng để làm Full Page Cache cho website. Cũng vì tính nhất quán của Redis, cho dù restart Redis thì người dùng cũng không có cảm nhận chậm khi tải trang.
Counter: Sử dụng làm bộ đếm. Với thuộc tính tăng giảm thông số rất nhanh trong khi dữ liệu được lưu trên RAM, sets và sorted sets được sử dụng thực hiện đếm lượt view của một website, các bảng xếp hạng trong game chẳng hạng. Redis hỗ trợ thread safe do đó nó có thể đồng bộ dữ liệu giữa các request.
Publish/Suscribe (Pub/Sub): Tạo kênh chia sẻ dữ liệu. Redis hỗ trợ tạo các channel để trao đổi dữ liệu giữa publisher và subscriber giống như channel trong Socket Cluster hay topic trong Apache Kafka. Ví dụ: Pub/Sub được sử dụng theo dõi các kết nối trong mạng xã hội hoặc các hệ thống chat.
Queues: Tạo hàng đợi để xử lý lần lượt các request. Redis cho phép lưu trữ theo list và cung cấp rất nhiều thao tác với các phần tử trong list, vì vậy nó còn được sử dụng như một message queue.
Các kiểu dữ liệu trong Redis
Khác với RDMS như MySQL, hay PostgreSQL, Redis không có table (bảng). Redis lưu trữ data dưới dạng key-value. Thực tế thì memcache cũng làm vậy, nhưng kiểu dữ liệu của memcache bị hạn chế, không đa dạng được như Redis, do đó không hỗ trợ được nhiều thao tác từ phía người dùng. Dưới đây là sơ lược về các kiểu dữ liệu Redis dùng để lưu value.
– STRING: string, integer hoặc float. Redis có thể làm việc với cả string, từng phần của string, cũng như tăng/giảm giá trị của integer, float.
– LIST: List là một danh sách của strings, sắp xếp theo thứ tự insert. Redis có thể thêm một phần tử vào đầu hoặc cuối list. List phù hợp cho các bài toán cần thao tác với các phần tử gần đầu và cuối vì việc truy xuất này là cực nhanh, cho dù insert cả triệu phần tử. Tuy nhiên nhược điểm là việc truy cập vào các phần tử ở giữa list rất chậm.
– SET: tập hợp các string (không được sắp xếp). Redis hỗ trợ các thao tác thêm, đọc, xóa từng phần tử, kiểm tra sự xuất hiện của phần tử trong tập hợp. Ngoài ra Redis còn hỗ trợ các phép toán tập hợp, gồm intersect/union/difference.
– HASH: lưu trữ hash table của các cặp key-value, trong đó key được sắp xếp ngẫu nhiên, không theo thứ tự nào cả. Redis hỗ trợ các thao tác thêm, đọc, xóa từng phần tử, cũng như đọc tất cả giá trị.
– SORTED SET (ZSET): là 1 danh sách, trong đó mỗi phần tử là map của 1 string (member) và 1 floating-point number (score), danh sách được sắp xếp theo score này. Các phần tử của zset được sắp xếp theo thứ tự từ score nhỏ tới lớn.
Ngoài ra, Redis còn hỗ trợ các data types khác như: Bit arrays, HyperLogLogs, Streams. Để cài đặt bạn tham khảo docs của Redis nhé.
Bên cạnh việc lưu key-value trên bộ nhớ RAM, Redis có 2 background threads chuyên làm nhiệm vụ định kỳ ghi dữ liệu lên đĩa cứng.
Có 2 loại file được ghi xuống đĩa cứng:
RDB (Redis DataBase file)
RDB thực hiện tạo và sao lưu snapshot của DB vào ổ cứng sau mỗi khoảng thời gian nhất định.
Ưu điểm
RDB cho phép người dùng lưu các version khác nhau của DB, rất thuận tiện khi có sự cố xảy ra.
Bằng việc lưu trữ data vào 1 file cố định, người dùng có thể dễ dàng chuyển data đến các data centers, máy chủ khác nhau.
RDB giúp tối ưu hóa hiệu năng của Redis. Tiến trình Redis chính sẽ chỉ làm các công việc trên RAM, bao gồm các thao tác cơ bản được yêu cầu từ phía client như thêm/đọc/xóa, trong khi đó 1 tiến trình con sẽ đảm nhiệm các thao tác disk I/O. Cách tổ chức này giúp tối đa hiệu năng của Redis.
Khi restart server, dùng RDB làm việc với lượng data lớn sẽ có tốc độ cao hơn là dùng AOF.
Nhược điểm
RDB không phải là lựa chọn tốt nếu bạn muốn giảm thiểu tối đa nguy cơ mất mát dữ liệu.
Thông thường người dùng sẽ set up để tạo RDB snapshot 5 phút 1 lần (hoặc nhiều hơn). Do vậy, trong trường hợp có sự cố, Redis không thể hoạt động, dữ liệu trong những phút cuối sẽ bị mất.
RDB cần dùng fork() để tạo tiến trình con phục vụ cho thao tác disk I/O. Trong trường hợp dữ liệu quá lớn, quá trình fork() có thể tốn thời gian và server sẽ không thể đáp ứng được request từ client trong vài milisecond hoặc thậm chí là 1 second tùy thuộc vào lượng data và hiệu năng CPU.
AOF (Append Only File)
AOF lưu lại tất cả các thao tác write mà server nhận được, các thao tác này sẽ được chạy lại khi restart server hoặc tái thiết lập dataset ban đầu.
Ưu điểm
Sử dụng AOF sẽ giúp đảm bảo dataset được bền vững hơn so với dùng RDB. Người dùng có thể config để Redis ghi log theo từng câu query hoặc mỗi giây 1 lần.
Redis ghi log AOF theo kiểu thêm vào cuối file sẵn có, do đó tiến trình seek trên file có sẵn là không cần thiết. Ngoài ra, kể cả khi chỉ 1 nửa câu lệnh được ghi trong file log (có thể do ổ đĩa bị full), Redis vẫn có cơ chế quản lý và sửa chữa lối đó (redis-check-aof).
Redis cung cấp tiến trình chạy nền, cho phép ghi lại file AOF khi dung lượng file quá lớn.
Trong khi server vẫn thực hiện thao tác trên file cũ, 1 file hoàn toàn mới được tạo ra với số lượng tối thiểu operation phục vụ cho việc tạo dataset hiện tại. Và 1 khi file mới được ghi xong, Redis sẽ chuyển sang thực hiện thao tác ghi log trên file mới.
Nhược điểm
File AOF thường lớn hơn file RDB với cùng 1 dataset.
AOF có thể chậm hơn RDB tùy theo cách thức thiết lập khoảng thời gian cho việc sao lưu vào ổ cứng. Tuy nhiên, nếu thiết lập log 1 giây 1 lần có thể đạt hiệu năng tương đương với RDB.
Developer của Redis đã từng gặp phải bug với AOF (mặc dù là rất hiếm), đó là lỗi AOF không thể tái tạo lại chính xác dataset khi restart Redis. Lỗi này chưa gặp phải khi làm việc với RDB bao giờ.
Kết luận redis là gì?
Redis là một sự lựa chọn tuyệt vời khi ta cần đến một server lưu trữ dữ liệu đòi hỏi tính mở rộng cao (scaleable) và chia sẻ bởi nhiều tiến trình, nhiều ứng dụng và nhiều server khác nhau.
Composer được ra mắt vào ngày 1/3/2012, và kể từ đó đến nay, Composer được phổ biến rất rộng rãi như là công cụ thiết yếu cho những anh em lập trình PHP.
Trước khi Composer ra đời, chúng ta thường gặp khó với hàng chục các thư viện của bên thứ ba cần phải quản lý. Việc update rất khó khăn và chưa kể các khâu cài đặt rất là khó nhớ. Vớ sự ra đời của Composer đã làm thay đổi hoàn toàn mọi thứ. Trong bài viết này chúng ta sẽ tìm hiểu về Composer – một công cụ quản lý các thư viện trong các project.
Composer là gì?
Composer là một Dependency Management trong PHP, công cụ quản lý các thư viện mà project Php của bạn sử dụng. Một cách chính xác hơn Composer quản lý sự phụ thuộc các tài nguyên trong dự án. Nó cho phép khai báo các thư viện mà dự án của bạn sử dụng, composer sẽ tự động tải code của các thư viện. Nó tạo ra các file cần thiết vào project của bạn, và cập nhật các thư viện khi có phiên bản mới.
Lợi ích của composer
Ý tưởng của composer không phải là mới, nó được lấy cảm hứng từ các công cụ như npm của Node. Phần hoạt động của nó cũng rất giống APT (có trên Ubuntu) hay Yum (có trên CentOS), tuy nhiên composer chỉ ở phạm vi dự án Php chứ không phải trên toàn bộ OS như 2 thằng trên.
Trước đây khi bạn triển khai các dự án dựa trên các, bạn sẽ phải đối mặt một số việc sau:
Dự án của bạn có sử dụng một số thư viện ở ngoài. Bạn phải tải chúng rồi cho vào folder của project rồi mới sử dụng được.
Một số các thư viện đó lại sử dụng (phụ thuộc) các thư viện khác.
Bạn sẽ gặp những khó khăn trong việc cập nhật phiên bản của các thư viện. Nếu thư viện A, có sử dụng thư viện B, thư viện B sử dụng thư viện C. Thì nếu một trong các thư viện này có update, bạn sẽ phải tự mình lần mò về phần gốc của nó để update.
Tuy nhiên, công việc sẽ thật dễ dàng với Composer, bạn sẽ làm được:
Khai báo các thư viện mà dự án sử dụng. Quản lý tập trung các thư viện đang sử dụng cho project và cả phiên bản của chúng dễ dàng qua file composer.json.
Tìm các phiên bản của package có thể cài đặt và cần thiết cho dự án, sau đó cài đặt chúng vào dự án tức là tải chúng về project.
Sử dụng Composer
Để sử dụng composer, ta cần phải có 1 file composer.json. File này chứa thông tin mô tả các dependencies mà ta cần trong project. Nội dung của file có thể là:
Các yêu cầu về dependencies sẽ được liệt kê trong key require. Phía trên là 1 ví dụ cho file composer.json mặc định của laravel framework version 5.8. Phần * nghĩa là ta chấp nhận phiên bản update mới như 5.8.11 hay 5.8.12 chẳng hạn.
Bằng cách sử dụng terminal, trong project folder chúng ta thực hiện lệnh composer install. Nó sẽ tìm trong thư mục hiện có file composer.json và thực hiện các công việc mà file đó yêu cầu bao gồm đưa tất cả dependencies vào project và thực hiện các công việc cần thiết khác.
Autoloading
Trong file chính của project, hãy thêm dòng này vào:
include_once'./vendor/autoload.php';
Tất cả các package bạn cần bây giờ đã được thêm vào project, sẵn sàng cho bạn sử dụng. Hay như trong Laravel bạn chỉ cần đơn giản gõ:
composer dump-autoload
thì tất cả các thư viện trong composer sẵn sàng để sử dụng trong toàn bộ project.
Cập nhật package
Bạn chỉ cần gõ composer update . Composer sẽ tự động cập nhật các package đang sử dụng. Nếu muốn cập nhật lên các phiên bản mới hơn hoặc các bản release, hãy chỉnh sửa file composer.json
Note: Không bao giờ chạy lệnh composer update trong môi trường production mà hãy kiểm tra trên máy để tránh tình trạng không tương thích.
Kết luận
Composer được sử dụng ở mọi nơi trong thế giới PHP, vì vậy đã là một lập trình viên Php bạn cần trang bị thêm kiến thức cơ bản composer. Sau đó thì chúng ta chỉ cần chuyên tâm vào product và gạt bớt suy nghĩ về việc cập nhật package.
Những diễn giả được giới thiệu lần trước có làm bạn hài lòng? Nếu chưa thì chắc chắn các Marketing speaker đợt này sẽ chinh phục những khán giả khó tính nhất.
Let’s have a look:
🔥 Anh Bùi Quang Tinh Tú – CMO Asia – Ringier AG
>>Topic: Martech Trends That You Should Watch Out
Anh Bùi Quang Tinh Tú – CMO Asia của Ringier AG kiêm CEO của Marry Network với kinh nghiệm từng đảm đương nhiều vị trí khác nhau như: Founder của UAN, CMO và là founding member của GO-VIET / GO-JEK VN, Marketing Director của MuaBanNhaDat,… cũng như là diễn giả của các buổi hội thảo lớn.
🔥 Anh Trần Quốc Kỳ – CEO Chin Media
>>Topic: How to Optimize Conversions with Google Analytics (về website)
Thêm một diễn giả với hơn 10 năm kinh nghiệm trong lĩnh vực marketing và truyền thông đó là anh Trần Quốc Kỳ. Anh không những là chuyên gia về Data Analytics, Performance Marketing, Social Ads,..mà còn kinh qua những vị trí quan trọng trong những công ty, tập đoàn lớn như: IDD VIETNAM, Panpages VIETNAM,… Qua nhiều lần làm diễn giả tại các sự kiện lớn về Digital Marketing như: ADdays, DMA, UAN, TOPDEV,….
🔥 Anh Phạm Phước Nguyên – Head of Performance – Biz-eyes / Square Group
>>Topic: 10 Tips for Successful Launch of a Mobile App
Góp mặt trong đội ngũ Marketing Speaker không thể thiếu anh Phạm Phước Nguyên. Một chuyên gia với hơn 9 năm kinh nghiệm trong mảng Sale-Marketing và hơn 7 năm trong lĩnh vực Digital/Performance Marketing tại thị trường Việt Nam và Đông Nam Á.
>>Topic: Mobile App Funnel Optimization with Data Analytics
Chị Lê Ngọc Hạnh – một chuyên gia với hơn 8 năm kinh nghiệm trong lĩnh vực Thương mại Điện tử và Digital Marketing. Trước khi sáng lập PMAX, chị đã có hơn 4 năm kinh nghiệm trong ngành Thương Mại Điện Tử tại Lazada Việt Nam được bổ nhiệm qua nhiều vị trí và lĩnh vực từ Digital marketing cho đến Campaign và Merchandising tại Lazada
🔥 Anh Huỳnh Hữu Tài – Founder of WeTransform
>>Topic: Platform Strategy in Digital Transformation
Anh Huỳnh Hữu Tài với background “khủng” về lĩnh vực công nghệ thông tin-viễn thông (ICT) lẫn dịch thuật là một trong những gương mặt sáng giá trong làng speaker năm nay. Anh là diễn giả về các chủ đề: Chiến lược nền tảng, Cuộc dịch chuyển đại dương xanh…và thường được mời tham gia các event được tổ chức bởi TopDev, FirstNews & BizHub, Alpha Books, Đà Nẵng Co-working Space, Sihub,…
🔥 Anh Lại Tuấn Cường – CEO – Repu Digital
>>Topic: Marketing Automation: Building a Silent Conversion Machine
Anh Lại Tuấn Cường có hơn 13 năm làm việc trên cương vị CEO, Founder, Manager ở nhiều công ty khác nhau như: SocialReach, LinksLead.vn, Young Lim Won SoftLab (Korea),… Để nói về digital marketing thì không thể thiếu anh – “cha đẻ” của Repu Digital – đơn vị Digital Marketing Agency từng tư vấn & triển khai các chiến dịch quảng cáo cho các doanh nghiệp lớn như: Vincom (VinGroup), Tập đoàn Bảo Việt, Bảo Việt Nhân Thọ, Chứng khoán BIDV, NH VPBank, NH PVCombank, Tập đoàn Trung Nguyên, NovaLand, Lotte Cinema.
🔥 Anh Don Ho – Co-founder của Quanstamp
>>Topic: The Future of Blockchain Security and Mass Adoption. The Future of Security Token Offerings.
Anh Don Ho – Co – founder của Quanstamp. Anh quan tâm đến việc gặp gỡ những người sáng lập, doanh nghiệp và nhà đầu tư; cũng như đã xây dựng hệ sinh thái đổi mới về công nghệ ở San Francisco, Los Angeles và Đông Nam Á. Anh sẽ đưa ra những góc nhìn trực quan về Blockchain Security và Mass Adoption tại VMD2019.
🔥 Anh Nguyễn Kim Hưng – Digital Marketing Manager at WeFit.vn
>>Topic: Chiến lược làm Content 2019: công thức marketing giúp phát triển bền vững.
Một chuyên gia digital marketing với kinh nghiệm xây dựng, phát triển và quản lý đội ngũ team Marketing các kênh Digital của sản phẩm tập luyện WeFit sẽ là lựa chọn hoàn hảo cho các nhà marketer muốn tìm hiểu và nắm rõ chiến lược content marketing để phát triển doanh nghiệp.
Bạn đã choáng ngợp với đội ngũ diễn giả của chúng tôi chưa? Còn rất nhiều thông tin mà bạn không muốn bỏ lỡ tại Ngày hội về Công nghệ & Mobile lớn nhất năm nay. Nhanh tay đăng ký và giữ những slots đẹp đẹp cho mình để có cơ hội gặp gỡ các chuyên gia về marketing và technology nào!!!
Tôi không biết chính xác nó là cái gì mà làm cho bao nhiêu developer phát cuồng và lưu trữ session information trong local storage, nhưng dù gì đi nữa: việc này cần phải ngừng lại. Mọi thứ đang dần ngoài tầm kiểm soát.
Gần như ngày nào tôi cũng tình cờ thấy một website mới chứa thông tin nhạy cảm của user trong local storage và tôi cảm thấy rất bối rối khi có quá nhiều developer đang dần gửi gắm hết lên đó.
Hãy cùng ngồi lại, nói về local storage và tại sao bạn nên ngừng sử dụng nó đi.
Local Storage là gì?
Có lẽ với một số người cũng chưa biết local storage là gì nữa. Hãy bắt đầu từ cái căn bản: local storage là một feature mới của HTML5 cho phép bạn lưu trữ bất kì info nào bạn muốn trong browser dùng JavaScript. Nó rất là đơn giản.
Thực tế thì local storage chỉ là một object JavaScript bự và cũ kĩ cho phép bạn attach data (hoặc remove cũng được). Đây là một ví dụ của một vài JavaScript code lưu trữ một vài thông tin cá nhân trong local storage:
// Bạn có thể store local storage sử dụng syntax
localStorage.userName = "TopDev";
localStorage.setItem("favoriteColor", "Red");
// Một khi dữ liệu ở trong Local Storage, nó sẽ ở đó mãi mãi cho đến khi nó được
// explicitly removed
alert(localStorage.userName + " Thích màu " + localStorage.favoriteColor + ".");
Nếu bạn chạy code JavaScript này trong browser trên trang HTML test, bạn sẽ test phrase “TopDev thích màu đỏ” trong alert message. Nếu bạn sử dụng các tool developer của mình, bạn sẽ thấy cả hai biến userName và favoriteColor đều được lưu trữ trong local storage trong browser.
Có thể bạn sẽ thắc mắc liệu có có cách nào data bạn lưu trữ một lúc nào đó tự động xóa và bạn không cần phải xóa từng cái thủ công mỗi biến bạn để vào không. May mắn thay HTML5 working group thêm sessionStorage vào HTML5 hoạt động đúng y như local storage trừ một điểm là tất cả data lưu trữ sẽ tự động xóa đi khi user đóng tab browser lại.
Sau khi hiểu về local storage, chúng ta sẽ bàn về những gì đặc sắc của nó. Mặc dù bài viết này nhằm mục đích thuyết phục bạn từ bỏ local storage, tôi vẫn thừa nhận là nó cũng có vài điểm thú vị.
Đầu tiên: nó là JavaScript thuần! Một trong những thứ gây ức chế nhất về cookies (đặc trưng khác của local storage) đó là nó cần được tạo bởi web server. Nếu bạn đang build một static site (ví dụ như một app đơn trang), việc dùng local storage đồng nghĩa là các web page của bạn có thể chạy độc lập với bất kì web server nào. Chúng không cần ngôn ngữ backend hay logic nào để lưu data trong browser: chúng có thể làm nếu muốn.
Đây là một concept táo bạo và là một trong những lí do chính mà local storage trở nên hot như thế trong giới lập trình.
Một thứ khác tuyệt vời về local storage đó là nó không có nhiều size constraint như cookies. Local storage cung cấp ít nhất 5MB data storage qua tất cả các web browser, hơn nhiều so với cookie (maximum 4KB).
Chính điều này làm cho local storage trở nên hữu ích nếu bạn cache một số app data trong browser để dùng sau. Vì 4kB là không nhiều, local storage là một trong những option thay thế duy nhất.
Local Storage có gì không tốt
Chúng ta đã nói về những cái tốt, bây giờ sẽ chuyển sang cái xấu.
Local storage cực kì basic, API rất đơn giản. Tôi cảm thấy hầu hết các developer không nhận ra nó basic cỡ nào:
Nó chỉ có thể lưu trữ string data. Nó trở nên vô dụng cho việc lưu trữ các loại data phức tạp hơn cho dù chỉ một chút. Và chắc chắn rằng, bạn có thể nhận ra mọi thứ bao gồm các loại data trong local storage, nhưng là một các hack khác ugly.
Nó có đồng bộ. Đồng nghĩa rằng với mỗi local storage operation bạn chạy sẽ chỉ được một lần một lúc.
Các web worker không thể dùng nó. Nó có nghĩa rằng nếu bạn muốn build một app tận dụng background process để tăng hiệu suất, các chrome extension, những thứ như: bạn không thể dùng local storage vì nó không có sẵn cho các web server.
Nó vẫn giới hạn size của data bạn có thể lưu trữ (khoảng 5MB qua các browser). Đây là một khoảng khá hạn hẹp cho những người build app mà có lượng data lớn hoặc cần phải function offline.
Bất kì JavaScript code trên trang của bạn có thể truy cập vào local storage: nó không có cái gì để bảo về data. Một điểm trừ quá lớn về tính bảo mật.
Nói tóm lại, chỉ có duy nhất một trường hợp mà bạn cần dùng local storage: khi bạn cần các info có sẵn mà không quá nhạy cảm, không cần dùng cho các app cao cấp, không quá 5MB, và chỉ chưa string data. Phần 2 sẽ đi sâu vào các phân tích bảo mật và giải đáp cho câu hỏi: Tại sao Local Storage không an toàn và bạn không nên dùng nó để lưu trữ data nhạy cảm?
1 phút quảng cáo: TopDev đang có nhiều công ty quốc tế tuyển JS, Php để đánh global. Anh em ra biển lớn thì đừng ngại xem qua nhé. Link tại đây: https://topdev.vn/viec-lam-it
Chắc hẳn ai trong số chúng ta cũng đã từng dùng 1 số dịch vụ thiết kế URL Shortening (rút gọn link) như Bit.ly hay TinyURL.
Đối với 1 software engineer thì việc dùng là 1 chuyện, nhưng làm thế nào để thiết kế được 1 hệ thống chịu tải hàng tỉ click mỗi tháng chắc hẳn cũng nhiều người quan tâm.
Hôm nay mình viết bài này để đào sâu vào những hệ thống đó xem họ đã thiết kế như thế nào nhé.
Mục tiêu của bài viết
Sẽ giúp các bạn có cái nhìn tổng quan về cách thiết kế hệ thống hàng triệu người dùng, hàng tỉ click mỗi tháng nó như thế nào. Từ cách tư duy đến cách tiếp cận bài toán.
Có thể tự mình xây dựng được 1 hệ thống URL Shortening giống Bitly, TinyURL.
Giúp các bạn có kinh nghiệm đi phỏng vấn vào vị trí system design.
Hệ thống URL Shortening là gì?
Chắc hẳn cũng có 1 số bạn chưa từng dùng dịch vụ rút gọn link bao giờ. Vậy để mình giải thích ngắn gọn xem URL Shortening là gì đã nhé.
URL Shortening (rút gọn link) là 1 dịch vụ giúp chúng ta có thể làm ngắn link gốc lại được.
Bây giờ nếu chúng ta mở link http://bit.ly/2VXBAw4 ở trình duyệt thì nó sẽ chuyển hướng đến link gốc.
Tại sao cần dùng rút gọn link?
Đây chắc hẳn là câu hỏi mà nhiều người quan tâm. Ví dụ như: cứ gửi link gốc cho người xem chứ cần gì phải rút gọn link làm gì cho nó mất thời gian? Rồi bây giờ có ai phải tự nhập link bằng tay nữa đâu mà phải làm mất công? …
Công nhận những thắc mắc đó của mọi người không sai.
Mục đích chính của việc dùng rút gọn link là:
Nhìn link ngắn gọn trông đẹp mắt hơn.
Có thể thống kê lượng người click vào link để phân tích, đánh giá kết quả. Phục vụ cho marketing.
Có thể ẩn 1 số link tiếp thị liên kết với mục đích là kiếm tiền.
Yêu cầu về mặt chức năng hệ thống
Hầu hết các hệ thống rút gọn link phải đáp ứng được những yêu cầu sau:
Yêu cầu về mặt chức năng:
Đầu vào là 1 link gốc, hệ thống sẽ rút gọn link gốc đó thành 1 dạng link ngắn hơn và duy nhất
Khi người dùng access vào link rút gọn, hệ thống sẽ chuyển nó đến link gốc
Người dùng có thể lựa chọn customize link rút gọn của mình theo ý muốn.
Link rút gọn sẽ hết hạn sau 1 khoảng thời gian mặc định nào đó. Tuy nhiên người dùng có thể điều chỉnh cái khoảng thời gian này.
Yêu cầu phi chức năng:
Hệ thống có tính available (sẵn sàng) cao. Vì sao phải cần cái này? Vì nếu hệ thống die thì toàn bộ link rút gọn lúc đó cũng die theo.
Khi click vào link rút gọn để chuyển sang link gốc, thì thời gian redirection đó phải tối thiểu (minimal latency).
Link rút gọn không thể đoán được.
Yêu cầu mở rộng:
Có thể phân tích được bao nhiêu lần click vào link rút gọn?
Cung cấp API cho bên thứ 3 có thể dùng được.
Phân tích hệ thống
Ở phần này mình sẽ trình bày cho các bạn cách ước lượng số lượng request hàng tháng, dung lượng disk, dung lượng memory cần dùng, băng thông mạng tiêu tốn là bao nhiêu …
Đa số những hệ thống rút gọn link này sẽ có lượng access khá là cao.
Giả sử như hệ thống chúng ta thiết kế sẽ có tỉ lệ read:write là 100:1. (Các bạn nhớ tỉ lệ này nhé vì nó dùng trong suốt bài viết)
Trong đó:
tỉ lệ read ở đây tức là số lượng người click vào link rút gọn
tỉ lệ write là số người tạo ra link rút gọn.
Ước lượng traffic
Giả sử như hệ thống của chúng ta có 500 triệu link rút gọn trong 1 tháng.
Với tỉ lệ read:write là 100:1 thì khi đó số lượng read sẽ là: 500M * 100 = 50B (M là milion, B là bilion)
200 * 100 = 20K URL/s (vì tỉ lệ read:write là 100:1)
Ước lượng storage
Giả sử như chúng ta sẽ lưu tất cả link rút gọn trong 5 năm.
Do chúng ta có 500M link rút gọn trong 1 tháng, khi đó 5 năm chúng ta sẽ có:
500M * 12 months * 5 years = 30B URLs
Giả sử mỗi 1 link rút gọn chúng ta sẽ dùng mất 500 bytes để lưu nó trong storage. Dung lượng ổ đĩa lưu 500M URL trong 5 năm sẽ là:
30B * 500 bytes = 15TB
Ước lượng bandwith (băng thông mạng)
Trước tiên mình giải thích qua về bandwith (băng thông mạng) là gì.
Băng thông mạng là thuật ngữ chỉ lượng truyền dữ liệu (data size) trong khoảng thời gian 1 giây.
Trong đó lượng truyền dữ liệu sẽ bao gồm 2 loại là incoming data với outgoing data:
incoming data là lượng dữ liệu truyền đến server (giống như kiểu upload ấy)
outgoing data là lượng dữ liệu từ server trả về cho người dùng (giống như download)
Vì hệ thống của chúng ta có 200 URL mới trong 1 giây thì khi đó:
total incoming data = 200 * 500 bytes = 100 KB/s
Với read request thì hệ thống của chúng ta có 20K URL/s thì khi đó:
total outgoing data = 20K * 500 bytes = 10MB/s
Ước lượng memory
Để hệ thống có thể chạy nhanh hơn thì giải pháp tốt nhất đó là cache lại những cái link rút gọn nào mà có nhiều người dùng click.
Vậy chúng ta sẽ cần bao nhiêu memory?
Nếu chúng ta đi theo quy tắc 80:20 nghĩa là 20% số lượng link rút gọn tạo ra 80% traffic hệ thống. (Hiểu đơn giản là chỉ có 20% số lượng link rút gọn là nhiều người dùng access, còn lại 80% ko có ai access cả. Nên 20% link rút gọn sẽ tạo ra 80% traffic là vì lí do đó).
Vì chúng ta có tổng cộng 20K URL/s (hay 20K requests/s) thì khi đó 1 ngày sẽ có:
20K * 3600 seconds * 24 hours = 1.7B request/day
Để cache được 20% số request này thì chúng ta sẽ cần:
0.2 * 1.7B * 500 bytes = 170GB memory
Tóm tắt lại kích thước hệ thống
Hệ thống của chúng ta có 500M URL trong 1 tháng, và có tỉ lệ read:write là 100:1. Khi đó đặc tả về hệ thống của chúng ta sẽ như sau:
200 URL được tạo ra mỗi giây
Số lượng access: 20K request/s
Incoming data (giống như upload): 100KB/s
Outgoing data (giống như download): 10MB/s
Dung lượng ổ đĩa trong 5 năm: 15TB
Dung lượng memory dùng cho cache: 170GB
Thiết kế API
Chúng ta có thể dùng SOAP hoặc là REST APIs để thiết kế API của hệ thống. Xem thêm RESTful API là gì?
Qua những yêu cầu ở bên trên, thì ta thấy hệ thống của chúng ta ít nhất cần 2 api sau:
api_dev_key (string): là API developer key của người dùng đã đăng kí tài khoản. Key này được sử dụng để định danh người dùng, giới hạn số lượng request của người dùng (hay còn gọi là rate-limiting)
original_url (string): link gốc
custom_alias (string – optional): customize key cho URL
expire_date (string – optional): ngày hết hạn của link rút gọn
Giá trị trả về (string):
Nếu thành công sẽ insert vào trong cơ sở dữ liệu và trả về link rút gọn
Nếu thất bại sẽ trả về error code.
deleteURL
API thứ 2 cũng khá cần thiết đó là xoá đi link rút gọn đã đăng kí.
deleteURL(api_dev_key, url_key)
Trong đó:
api_dev_key (string) là API developer key của người dùng đã đăng kí tài khoản
url_key (string): là link rút gọn.
Giá trị trả về (string):
Nếu thành công sẽ trả về link rút gọn đã bị xoá.
Nếu thất bại sẽ trả về error code.
Làm thế nào ngăn chặn hacker?
Hacker có thể dùng api để tạo ra thât nhiều link rút gọn vượt quá thiết kế hệ thống hiện tại. Với mục đích cho hệ thống của chúng ta “đắp chiếu luôn”.
Ví dụ như hệ thống hiện tại của chúng ta đang thiết kế đáp ứng 1 tháng 500 triệu URL được tạo ra.
Và hacker tấn công sẽ tạo gấp 100 lần hiện tại là khoảng 50 nghìn tỉ URL để hệ thống sẽ tiêu thụ nhiều tài nguyên hơn, dùng nhiều memory hơn, tốn nhiều ổ đĩa hơn. Khi đó chắc chắn hệ thống sẽ bị down. Và toàn bộ link rút gọn sẽ bị tan biến.
Vậy làm thế nào để giải quyết đc bài toán này? Cách đơn giản nhất là sẽ hạn chế số lần call api thông qua api_dev_key (kĩ thuật này được gọi là kỹ thuât rate-limiting mà Grab sử dụng). Ví dụ như mỗi api_dev_key sẽ chỉ cho tạo tầm 100 link rút gọn trong 1 ngày chẳng hạn.
Tuy không phải là cách hoàn hảo 100% nhưng ít nhiều cũng hạn chế được 1 số vấn đề.
Thiết kế database
Yêu cầu về database của chúng ta sẽ như sau:
Cần lưu hàng tỉ record
Mỗi 1 object sẽ lưu càng nhỏ càng tốt (tầm dưới 1KB)
Không cần mối quan hệ dữ liệu giữa các record.
Hệ thống có tỉ lệ read khá cao
Database schema:
Chúng ta sẽ cần 2 bảng chính: 1 bảng lưu thông tin người dùng, và 1 bảng lưu thông tin về URL.
Loại Database nào nên sử dụng?
Vì chúng ta đã dự đoán trước là sẽ lưu đến hàng tỉ record, hơn nữa các bảng không có mối quan hệ nào với nhau cả nên việc dùng loại NoSQL key-value có lẽ sẽ là lựa chọn tốt nhất. Ví dụ như DynamoDB, Cassandra mình thấy đều ok cả. Xem thêm so sánh SQL và NoSQL.
Thuật toán và thiết kế hệ thống cơ bản
Vấn đề cần giải quyết ở đây là làm thế nào có thể tạo ra được 1 link rút gọn và nó duy nhất từ 1 link gốc.
Thì phần này chúng ta sẽ đi thiết kể để tạo ra được phần rút gọn, chính là 2VXBAw4.
Encoding URL
Chúng ta có thể sử dụng 1 số hàm băm (như MD5 hay SHA256) để băm giá trị đầu vào URL. Sau đó sẽ dùng 1 số hàm mã hoá để hiển thị. Ví dụ như base36 ([a-z, 0-9]), hoặc base62 ([a-z, A-Z, 0-9]) và base64 ([a-z, A-A, 0-9, -, .]).
1 câu hỏi được đặt ra ở đây là chúng ta sẽ dùng độ dài key là bao nhiêu? 6,8 hay là 10?
Nếu dùng base64 cho 6 kí tự thì tổng chúng ta có 64^6 = 68.7B URL
Nếu dùng base64 cho 8 kí tự thì tổng chúng ta có 64^8 = 281 nghìn tỉ URL
Do hệ thống của chúng ta có 500M URL được tạo ra mỗi tháng, hệ thống dùng trong 5 năm sẽ có tổng:
500M * 12 months * 5 = 30B URLs / 5 years.
Do đó với 68.7B URL (với 6 kí tự) là có thể dùng được trong 5 năm rồi.
Nếu chúng ta dùng thuật toán MD5 như hàm băm, thì khi đó nó sẽ tạo ra giá trị hash có chứa 128 bit. Sau đó base64 để encode giá trị băm, nó sẽ tạo ra ít nhất 21 kí tự (vì mỗi kí tự base64 sẽ encode 6 bits giá trị hash).
Trong khi đó không gian khoá của chúng ta chỉ cần 6 kí tự thôi. Vậy làm thế nào có thể chọn ra khoá? Chúng ta có thể chọn ra 6 kí tự đầu tiên cũng được. Mặc dù có trường hợp nó trùng nhau. nhưng mà xác suất chỉ tầm 1/(64^6). Nó rất là nhỏ. Nên có thể chấp nhận được.
Nếu an toàn thì mỗi lần generate ra thì sẽ check trong DB xem có hay chưa? Nếu chưa có thì ok, còn nếu có rồi thì sẽ thêm xâu random nào vào trước URL và lại lặp lại cho đến khi sinh ra unique thì thôi.
※ Cách lấy 6 kí tự đầu tiên này chỉ là 1 giải pháp thôi nhé. Các bạn có thể tự cài đặt cho mình thuật toán khác, miễn nó sinh ra được 6 kí tự unique là được.
Đây là 1 ví dụ về trường hợp lấy 6 kí tự đầu tiên:
Nhiều người dùng có thể cùng dùng chung 1 link gốc, do đó link rút gọn sẽ bị trùng lặp. Và điều này không thể chấp nhận được.
Điều gì sẽ xảy ra nếu như 1 phần nào đó trong URL bị mã hoá. Ví dụ như http://example.com/index.php?id=design và http://example.com/index.php%3Fid%3Ddesign là 2 URL hoàn toàn giống nhau nhưng mà 1 phần URL đã bị mã hoá.
Giải quyết vấn đề trên như thế nào?
Có 2 cách tiếp cận có thể giải quyết được vấn đề này.
Chúng ta có thể sử dụng 1 số nguyên tăng dần và gắn vào đầu mỗi link gốc. Khi đó nó sẽ luôn đảm bảo link gốc của chúng ta là duy nhất, kể cả có nhiều người cùng điền vào 1 link duy nhất đi chăng nữa thì link rút gọn sẽ luôn khác nhau. Và sau khi tạo xong link rút gọn thì số nguyên này sẽ tăng thêm 1. Nhưng mà có 1 vấn đề là nếu tăng mãi thì có thể số nguyên này sẽ bị tràn số. Hơn nữa việc xử lý tăng dần này cũng ảnh hưởng đến hiệu suất của hệ thống.
Cách khác là chúng ta có thể thêm user_id vào đầu mỗi URL. Tuy nhiên nếu người dùng chưa đăng nhập mà muốn tạo link rút gọn, khi đó chúng ta phải yêu cầu nhập vào 1 khoá nữa. Và khoá này phải duy nhất (Nếu khoá nhập vào không duy nhất sẽ yêu cầu nhập lại, đến khi nào duy nhất thì thôi).
Và dưới đây sẽ là flow của hệ thống:
Đầu tiên người dùng nhập link muốn rút gọn, và ấn Enter. Khi đó request sẽ được gửi đến Server.
Ở Server sẽ nhận request và chuyển nó đến bộ phận chuyên xử lý việc rút gọn link. Mình gọi đó là Encoding Service đi.
Encoding Service sẽ thực hiện xử lý rút gọn URL.
Nếu như URL đó chưa tồn tại trong hệ thống thì sẽ xử lý, lưu link đã rút gọn vào trong database đồng thời trả về cho server kết quả.
Nếu như URL đó đã tồn tại trong hệ thống (tức là có ai đó đã sử dụng URL này rồi). Thì khi đó nó sẽ thêm 1 sequence (số nguyên tăng dần) vào đầu URL và thực hiện rút gọn link. Sau đó lưu link đã rút gọn vào trong database đồng thời trả kết qủa về cho server.
Phía Server nhận kết quả và sẽ trả về cho người dùng.
Data Partitioning and Replication
Nếu chúng ta lưu tất cả 30 tỉ URL vào trong DB, và có tới 20K request/s call vào DB. Thì khi đó có thể DB sẽ chịu tải khá lớn và dẫn đến down. Để giải quyết vấn đề này thì có 2 giải pháp:
Phân vùng dữ liệu trong database (Data Partitioning). Tức là chúng ta sẽ tách DB ra thành nhiều con DB khác nhau. Mỗi con sẽ chứa 1 phần dữ liệu.
Cache lại URL nào mà hay gọi để giảm thiểu query đến DB (mình sẽ giải thích cái này trong phần tiếp theo)
Đối với Data Partitioning thì sẽ có 2 loại:
Range Based Partitioning
Loại phân vùng này sẽ dựa vào chữ cái đầu tiên trong URL hoặc hash key để phân chia dữ liệu.
Ví dụ như những URL (bỏ qua phần https:// hay http://) mà bắt đầu bằng từ “a” thì sẽ cho vào DB loại “a”. Những URL nào bắt đầu bằng chữ “b” sẽ cho vào trong database loại “b”.
Nếu như phân vùng dựa vào chữ cái đầu tiên này thì chúng ta sẽ cần 26 con database khác nhau (từ a -> z)
Nhưng mà giải pháp này có thể gặp vấn đề là giả sử chúng ta cho tất cả URL bắt đầu bằng chữ “f” vào trong database loại “f”. Nhưng chẳng may tất cả URL bắt đầu bằng chữ “f” này lại là những URL có access lớn nhất. Khi đó con DB loại “f” này lại chịu tải khá lớn.
Chú ý: Kiểu phân vùng dựa vào chữ cái đầu tiên này chỉ là 1 ví dụ thôi nhé, các bạn có thể tự nghĩ ra thuật toán riêng cho mình để phân vùng dữ liệu cho hợp lí và hiệu quả. Chứ không nhất thiết cứ phải chọn chữ cái đầu tiên để phân vùng.
Hash-Based Partitioning
Loại này chúng ta sẽ lấy giá trị hash của object đang được lưu trữ. Sau đó sẽ tính toán xem phân vùng nào sẽ được xử dụng dựa vào hàm băm. Chúng ta có thể lấy giá trị hash của primary key, hoặc là link gốc để xác định xem phân vùng nào sẽ được lưu trữ dữ liệu.
Cache
Đối với hệ thống hàng tỉ click mỗi tháng thì cache server là thứ không thể thiếu được.
Lí do tại sao chúng ta cần 1 cache server?
Flow chuẩn sẽ là:
Bước 1: người dùng accees đến link rút gọn
Bước 2: chúng ta phải vào DB để lấy ra link gốc từ link rút gọn
Bước 3: chuyển hướng người dùng đến link gốc.
Nếu không có cache server thì cứ mỗi lần như vậy sẽ phải vào trong DB để lấy kết quả. Và dẫn đến DB sẽ phải chịu tải khá lớn. Để giảm thiểu query đến DB, chúng ta sẽ cache lại kết quả truy vấn trước đó. Để từ lần sau nếu người dùng có truy cập vào link rút gọn thì lúc này chúng ta chỉ cần vào cache lấy ra là xong, mà không phải query vào DB để lấy kết quả nữa.
Vì Cache Server sẽ luôn lưu dữ liệu trên memory. Nên so với việc lấy kết quả từ DB thì việc lấy kết quả từ memory sẽ nhanh hơn rất nhiều lần.
Chúng ta cần dùng Cache Server nào?
Hiện nay thì có rất nhiều cache server như Redis, Memcache. Mình thấy nó khá nổi tiếng và cũng đang được dùng khá rộng rãi trên các hệ thống lớn trên thế giới.
Trước mình làm công ty về Game và hệ thống bên mình lúc đó dùng Redis và mình thấy nó khá ổn và support rất nhiều chức năng. Ví dụ như tự động xếp hạng ranking kết quả, có thể sync dữ liệu giữa memory và storage để phòng tránh mất dữ liệu…
Nên nếu bạn nào chưa biết nên dùng cái nào thì mình khuyên nên tìm hiểu và implement thằng Redis này.
Chúng ta cần bao nhiêu GB memory?
Như phần trước mình đã tính toán là hệ thống này sẽ dùng đến 170GB memory để cache 20% URL. Mà hiện nay server có 256GB memory cũng khá nhiều nên thừa sức giải quyết vấn đề này.
Ngoài ra chúng ta có thể tổ hợp nhiều server nhỏ (mỗi server có 8GB memory chẳng hạn) để cache các URL đó lại cũng được cả.
Nếu cache full thì làm thế nào?
Đa số hệ thống cache đều thực hiện theo 1 số cơ chế như LRU (Least Recently Used) hay LFU (Least Frequently Used).
LRU (Least Recently Used): bỏ đi các item trong cache ít được dùng gần đây nhất.
LFU (Least Frequently Used): bỏ đi các item trong cache ít được sử dụng nhất.
Do có các cơ chế này nên cache sẽ luôn được làm mới để tránh việc dùng full.
Cơ chế hoạt động của Cache Server:
Mình sẽ giải thích qua về cơ chế của Cache Server nhé:
Đầu tiên người dùng access đến link rút gọn.
Khi đó, application server sẽ check xem có kết quả ở trong cache không?
Nếu kết quả không có trong cache, thì nó sẽ thực hiện truy vấn đến DB để lấy kết quả và trả về cho người dùng. Đồng thời update kết quả vào trong cache để phục vụ cho lần sau.
Nếu kết quả có trong cache thì sẽ lấy luôn kết quả và trả về cho người dùng.
Các bạn thấy cơ chế khá đơn giản phải không nào.
Load Balancer
Với hệ thống nhiều access như hệ thống này thì 1 web server chưa chắc đã chịu tải được. Để giải quyết bài toán này thì mình sẽ dùng nhiều web server. Mỗi web server sẽ chịu 1 phần request từ người dùng. Xem thêm Web Server là gì?
Câu hỏi đặt ra là làm thế nào có thể tự động phân request đến từng con web server khác nhau?
Và Load Balancer đã ra đời để giải quyết vấn đề này.
Ví dụ như dưới Load Balancer có 1 số con web server. Lần 1 request từ Client gửi đến Load Balancer sẽ được forward đến con web server 1. Lần 2 sẽ được gửi đến con web server 2 ….
Hiện nay 1 số nhà cung cấp server như AWS, Google hay Azure đều support Load Balancer cả. Nên các bạn không cần phải lo lắng về việc phải build 1 con load balancer. Chỉ việc cài đặt và dùng là xong.
Kiến trúc toàn bộ hệ thống
Sau khi đã hiểu qua hết các thành phần thì mình tổng hợp lại kiến trúc tổng thể của hệ thống như sau:
Kết luận
Đọc qua bài này chắc hẳn các bạn cũng có 1 chút tư duy trong việc thiết kế hệ thống lớn phục vụ hàng triệu người dùng nó như thế nào rồi phải không?
Sau khi đã có tư duy rồi thì mình nghĩ nếu gặp phải 1 hệ thống tương tự như thế thì các bạn cũng thừa sức để giải quyết. Nếu gặp khách hàng thì có thể chém ra bão ra gió được.
Vì nhiều bạn mới ra trường hay những bạn chưa từng làm trong các hệ thống lớn chắc chưa hình dung được nên bắt đầu từ đâu, nên sử dụng công nghệ nào. Thì qua bài này hy vọng sẽ giúp các bạn giải đáp những thắc mắc đó.
Học Machine learning (ML)!!! nghe có vẻ là nhiệm vụ bất khả thi, đặc biệt là khi bạn học sai cách.
Tuy nhiên, sau khi dành trọn 1 tuần để học những thức căn bản của ML, mình nhận thấy nó dễ tiếp cận hơn nhiều so với những gì mình tưởng tượng.
Trong bài viết này mình sẽ giới thiệu các bạn một lộ trình bắt đầu học ML như thế nào từ những kinh nghiệm thực tế trong tuần đầu mình học.
Background cần có
Trước khi mình học ML, mình đã đọc trước về nó một chút, và có tham gia một nửa khoá học của Andrew Ng trên Coursera và một vài khoá học lý thuyết khác. Nhờ vậy mà mình có được một ít kiến thức về ML, nhưng mình vẫn không thể dùng mớ kiến thức đó để viết code, cũng như ứng dụng thực tiễn. Và mình muốn thay đổi việc này.
Mình muốn có khả năng giải quyết vấn đề với ML vào cuối tuần học đó, mặc cho việc bỏ qua rất nhiều nguyên tắc cơ bản, và phải tiếp cận theo hướng từ trên xuống dưới, thay vì từ dưới đi lên.
Sau khi tham khảo trên Hacker News, mình đi đến kết luận rằng module Scikit Learn của Python là điểm xuất phát tuyệt vời nhất. Module này cung cấp cho bạn rất nhiều thuật toán machine learning để lựa chọn, đưa việc học máy thực tế xuống chỉ còn một vài dòng code.
Ngày Thứ 2: Học một số thứ thực tế
Mình bắt đầu tuần học bằng cách tìm kiếm video tutorial về Scikit Learn. Cuối cùng mình cũng tìm được tutotial của Sentdex về cách sử dụng ML để đầu tư cổ phiếu, tutorial này cung cấp cho mình một số kiến thức cấn thiết để chuyển sang bước tiếp theo.
Ưu điểm của tutorial của Sentdex là người hướng dẫn giới thiệu bạn toàn bộ các bước thu thập data. Khi bạn xem hết, bạn sẽ nhận ra việc tìm nạp và dọn dẹp data có thể tốn nhiều thời gian hơn cả việc học máy thực sự. Vậy nên kỹ năng viết script để scrape data từ các file hoặc crawl trên web là những kỹ năng cần thiết cho những người đam mê ML.
Mình cũng phải xem lại một số video mỗi khi gặp vấn đề, và mình nghĩ các bạn cũng nên như thế.
Tuy nhiên, nếu bạn đã biết cách scrape data từ website, tutorial này có lẽ sẽ không phù hợp với bạn vì có nhiều video cũng nói về tìm nạp dữ liệu rồi. Trong trường hợp đó, Intro to Machine Learning của Udacity sẽ là nơi xuất phát tốt nhất dành cho bạn.
Vào ngày thứ 3, mình muốn thử xem là mình đã có thể sử dụng những kiến thức vừa học để giải quyết một vấn đề thực tế chưa. Có 1 lập trình viên khác trong team code của mình đang tham gia cuộc thi data visualization của Ngân hàng Anh, mình cùng anh ta kiểm tra bộ dữ liệu mà ngân hàng công bố. Data thú vị nhất chính là các khảo sát hộ gia đình của họ. Đây là một khảo sát hàng năm mà ngân hàng thực hiện trên một vài nghìn hộ gia đình có liên quan đến tiền.
Vấn đề mà chúng mình phải giải quyết là: “Với thông tin về trình độ học vấn, tuổi tác và thu nhập của một người, máy tính có thể dự đoán được giới tính của người đó không?”
Mình lượn một vòng quanh bộ dữ liệu, dành một vài giờ clean data, và sử dụng Scikit Learn map để tìm thuật toán phù hợp cho vấn đề trên.
Cuối cùng bọn mình có được tỉ lệ thành công là 63%, cũng không ấn tượng là mấy. Nhưng ít nhất thì máy tính cũng đã có thể dự đoán tốt hơn một chút so với tỉ lệ 50% của việc tung đồng xu.
Xem kết quả giống như tự tạo động lực cho bản thân, nên mình khuyên các bạn hãy tự làm giống mình khi đã biết sơ cách sử dụng Scikit Learn nhé.
Và đó cũng là khoảnh khắc bạn nhận ra bạn có thể sử dụng ML để giải quyết các vấn đề thực tế trong cuộc sống.
Ngày thứ 4: Học lên tiếp
Sau khi mần đủ các module Scikit Learn, mình quyết định thử viết một thuật toán hồi quy tuyến tính mặc dù chưa biết gì. Mình muốn làm điều này bởi vì mình cảm thấy là mình không thể thực sự hiểu được nếu không thực hành.
May mắn là vào thời điểm này mình tìm đươc khoá học Coursera có dạy chi tiết về cách một vài thuật toán làm việc. Cụ thể hơn, nó mô tả khái niệm cơ bản về việc sử dụng linear regression với gradient descent
Đây hoàn toàn là kỹ thuật hiệu quả nhất, vì nó giúp bạn hiểu được các bước từ đầu đến cuối. Mình cực kì khuyến khích các bạn nên làm thử.
Mình dự định viết lại cách triển khai của mình đối với các thuật toán phức tạp hơn khi mình thực hành, nhưng mình thích làm việc này sau khi mình đã “ngâm” hết các thuật toán tương ứng trong Scikit Learn hơn.
Ngày thứ 5: Đi thi thố
Vào ngày thứ 5, mình bắt đầu làm bài hướng dẫn giới thiệu của Kaggle. Kaggle là một platform dành cho các cuộc thi ML, nơi bạn có thể gửi các giải pháp cho các vấn đề mà công ty hay tổ chức nào đó đưa lên.
Mình khuyên bạn nên thử Kaggle sau khi có một ít thuật toán và kiến thức thực tế về Machine Learning để bắt đầu với nó. Nếu không thì lại chuyển từ có ích sang bực bội mà thôi.
Tutorial của Bag of Words hướng dẫn bạn từng bước tham gia bài dự thi, và cung cấp cho bạn một bản giới thiệu ngắn gọn và thú bị về Natural Language Processing (NLP). Mình thấy hứng thú với NLP hơn nhiều khi coi xong tutorial này.
Ngày thứ 6: Trở lại trường
Mình tiếp tục làm việc với những tutorial của Kaggle vào ngày thứ 6, và cũng bắt đầu dùng Intro to Machine Learning của Udacity. Mình đã đi được nửa chặng đường và mọi thứ khá thú vị.
Nó dễ hơn khoá học Coursera nhiều, vì nó không đào sâu vào các thuật toán. Nó cũng thực tế hơn, vì nó dạy Scikit Learn giúp việc áp dụng vào thực tế dễ hơn nhiều so với viết thuật toán trong Octave khi bạn học Coursera.
1 tuần vừa rồi rất vui với mình, mình nhận thấy được sự hữu ích của ML trong xã hội. Càng tìm hiểu, mình càng thấy nó có thể sử dụng để giải quyết mọi vấn đề.
Nếu bạn hứng thú với machine learning, mình mạnh dạng khuyên bạn nên dành một vài ngày hoặc vài buổi tối để đắm chìm với nó.
Chọn cách tiếp cận từ trên xuống nếu bạn không sẵn sàng học nhiều thứ nặng nề và muốn giải quyết các vấn đề nhanh nhất có thể.
Marketer, Business owner, Designer, Engineer hay là Freelancer thì việc cập nhật và ứng dụng các yếu tố công nghệ sẽ là điều xếp hạng thứ 3 chỉ sau kỹ năng và kiến thức khiến bạn trở thành master trong lĩnh vực của mình.
Cạnh tranh khoa học và công nghệ không thể thiếu cập nhật, công nghệ di động ngày càng lên ngôi và thành công vẫn còn tiếp diễn, một khi doanh bạn đã “dấn thân” vào cuộc chiến thì điều tất yếu là nên biết xung quanh bạn đang diễn ra điều gì?
Vietnam Mobile Day 2019 trở lại, đại hội công nghệ lĩnh vực di động lớn nhất trong năm sẽ trở thành một sân chơi không thể thiếu cho những anh tài cùng nhau chia sẻ những bí kíp, xu hướng, công nghệ đang lên trong ngành di động. Hé lộ nhóm speaker đầu tiên đều là những “lão làng” trong lĩnh Marketing và Technology của chương trình:
Vietnam Mobile Day năm thứ 9 sẽ được đầu tư từ quy mô đến chất lượng, với nội dung xoay quanh 6 nhóm chủ đề chính với hơn 100+ nội dung được trình bày, đó là:
Digital Transformation & Mobilization
Woman in Tech
5G & Internet of things, Machine Intelligence and future of Mobile Technology
Fin-Tech/ Mobile Payment/Ecommerce & Mobile commerce
Digital Marketing & Mobile Marketing
Mobile content (AR/VR/Livestream) and gaming
Dù bạn là dev, marketer hay là những doanh nghiệp về công nghệ mong muốn phát triển hơn trong tương lai, đây chính là sân chơi dành riêng cho bạn!!
Vấn đề bảo mật website có thể nói là rất quan trọng. CSRF là một kiểu tấn công diễn ra khá phổ biến hiện nay trên các website không bảo mật. Nếu bạn là một lập trình viên thì cần nắm rõ kiểu tấn công này để đảm bảo tính bảo mật cho ứng dụng web của mình.
Vậy CSRF là gì?
CSRF hay còn gọi là kỹ thuật tấn công “Cross-site Request Forgery“, nghĩa là kỹ thuật tấn công giả mạo chính chủ thể của nó. CSRF nói đến việc tấn công vào chứng thực request trên web thông qua việc sử dụng Cookies. Đây là nơi mà các hacker có khả năng sử dụng thủ thuật để tạo request mà bạn không hề biết. Vì vậy, một CSRF là hacker lạm dụng sự tin tưởng của một ứng dụng web trên trình duyệt của nạn nhân.
Cách thức hoạt động
CSRF là một kiểu tấn công gây sự nhầm lẫn tăng tính xác thực và cấp quyền của nạn nhân khi gửi một request giả mạo đến máy chủ. Vì thế một lỗ hổng CSRF ảnh hưởng đến các quyền của người dùng ví dụ như quản trị viên, kết quả là chúng truy cập được đầy đủ quyền.
Khi gửi một request HTTP, trình duyệt của nạn nhân sẽ nhận về Cookie. Các cookie thường được dùng để lưu trữ một session (Đọc thêm bài Session là gì? để hiểu thêm cách hoạt động của Session và cookies) để định danh người dùng không phải xác thực lại cho mỗi yêu cầu gửi lên.
Nếu phiên làm việc đã xác thực của nạn nhân được lưu trữ trong một Cookie vẫn còn hiệu lực, và nếu ứng dụng không bảo mật dễ bị tấn công CSRF. Kẻ tấn công có thể thử dụng CSRF để chạy bất cứ requets nào với ứng dụng web mà ngay cả trang web không thể phân biệt được request nào là thực hay giả mạo.
Ví dụ để hiểu rõ hơn, khi ứng dụng web có một chức năng đơn giản đó là thay đổi mật khẩu người dùng. Việc gửi lên server theo phương thức HTTP GET thông thường. Nội dung gửi lên là password mới và confirm lại password vừa nhập:
Người dùng đã đăng nhập trên web của bạn, cookie sẽ được tạo và lưu trữ dưới trình duyệt, khi bạn vào site lần sau bạn không cần phải đăng nhập lại. Giả sử bạn chưa đăng thoát, lúc này cookies của bạn vẫn còn hạn trong phiên làm việc.
Lúc này nếu website của bạn mắc lỗi CSRF, người dùng vô tình vào một trang hacker giả mạo với mục đích lấy tài khoản từ ứng dụng web của bạn. Trong trang giả mạo hacker sẽ dùng script để chạy một url để cố ý reset mật khẩu người dùng trên trang của bạn:
Như vậy khi Victim (User) vô tình vào trang web-hacker-gia-mao .com đã reset password của bản thân tại trang website-cua-ban .com. Hacker nếu biết thông tin username sẽ thử vào với password đã cài đặt:hacked và có thể vào một cách bình thường.
Cách phòng chống tấn công CSRF
Dựa trên nguyên tắc của CSRF “lừa trình duyệt của người dùng (hoặc người dùng) gửi các câu lệnh HTTP”, thông thường để tránh tấn công ta sẽ chia làm hai đối tượng, một là cách một là phái client (người dùng cuối) và hai là phía server.
Để tránh trở thành nạn nhân của các cuộc tấn công CSRF nên thực hiện một số lưu ý sau:
Nên đăng xuất khỏi các website quan trọng: Tài khoản ngân hàng, thanh toán trực tuyến, các mạng xã hội, gmail… khi đã thực hiện xong giao dịch.
Nên login vào một máy riêng và không cho người thứ 2 tiếp xúc với máy đó.
Không nên click vào các đường dẫn mà bạn nhận được qua email, qua facebook … Khi bạn đưa chuột qua 1 đường dẫn, phía dưới bên trái của trình duyệt thường có địa chỉ website đích, bạn nên lưu ý để đến đúng trang mình muốn.
Không lưu các thông tin về mật khẩu tại trình duyệt của mình. Không nên chọn các phương thức “đăng nhập lần sau”, “lưu mật khẩu” …
Trong quá trình thực hiện giao dịch hay vào các website quan trọng không nên vào các website khác, có thể chứa các mã khai thác của kẻ tấn công.
Phía Server
Cho đến nay vẫn chưa có biện pháp nào có thể phòng chống triệt để CSRF. Sau đây là một vài kĩ thuật sử dụng.
Sử dụng captcha, các thông báo xác nhận: Captcha được sử dụng để nhận biết đối tượng đang thao tác với hệ thống là con người hay không. Các thao tác quan trọng như “đăng nhập” hay là “chuyển khoản” ,”thanh toán” thường là hay sử dụng captcha. Những chức năng quan trọng như reset mật khẩu, xác nhận thay đổi info của account cũng nên gửi url qua email đã đăng ký để người dùng có thể click vào xác nhận.
Sử dụng csrf_token: token này sẽ thay đổi liên tục trong phiên làm việc, và khi thay đổi thông tin gửi kèm thông tin token này. Nếu token được sinh ra và token được gửi lên ko trùng nhau thì loại bỏ request.
Sử dụng cookie riêng biệt cho trang admin: Nên để trang quản trị ở một subdomain riêng để chúng không dùng chung cookies với front end của sản phẩm. Ví dụ nên đặt là admin.topdev.vn hay hơn là topdev.vn/admin.
Kiểm tra IP: Một số hệ thống quan trọng chỉ cho truy cập từ những IP được thiết lập sẵn, hoặc chỉ cấp phép truy cập quản trị qua IP local hoặc VPN.
TopDev vừa giới thiệu xong các kiến thức về CSRF là gì? Tìm hiểu kỹ thuật tấn công CSRF cũng như cách phòng chống tấn công giả mạo CSRF. Hy vọng những thông tin trong bài viết sẽ giúp ích cho các bạn đang tìm kiếm thông tin. Chúc các bạn vui vẻ!
Microsoft vừa giới thiệu Windows Terminal! một terminal app mới ra lò, hiện đại, nhanh chóng, hiệu quả, mạnh mẽ và giúp tăng năng suất cho người dùng các công cụ command-line, Command Prompt, PowerShell và WSL.
Windows Terminal sẽ được gửi đến người dùng thông qua cửa hàng Microsoft trên Windows 10 và sẽ được cập nhật thường xuyên, đảm bảo rằng bạn luôn luôn được cập nhật và có thể trải nghiệm những chức năng mới nhất cùng với những cải tiến tốt nhất.
Có thể nói chức năng được mong đợi nhất trên Terminal đó là hỗ trợ đa nhiệm và Windows terminal cuối cùng cũng được cung cấp chức năng quý giá này. Ngay bây giờ bạn sẽ có thể mở một số lượng tab bất kỳ, mỗi tab sẽ được kết nối đến 1 command-line shell hoặc 1 ứng dụng mà bạn chọn, như Command Prompt, PowerShell, Ubuntu trên WSL, hoặc 1 Raspberry Pi thông qua SSH,..
Làm đẹp văn bản
Windows Terminal sử dụng công cụ kết xuất văn bản được tăng tốc dựa trên DirectWrite/ DirectX. Công cụ kết xuất văn bản mới này sẽ hiển thị những ký tự, glyphs, và các biểu tượng thể hiện cùng với các phông chữ trên PC của bạn, bao gồm CJK chữ tượng hình, biểu tượng cảm xúc, các biểu tượng powerline, icon, programming ligatures,… Công nghệ này cũng kết xuất văn bản nhanh hơn rất nhiều so với công nghệ Console/s GID trước đây.
Bên cạnh đó, bạn cũng sẽ có nhiều sự lựa chọn về cách sử dụng phông chữ mới mà Windows Terminal mang lại.Phông chữ mà Windows Terminal mang lại sẽ cho bạn sự mới mẻ cũng như tầm nhìn hiện đại hơn cho Terminal. Phông chữ này không chỉ bao gồm programming ligatures, mà nó cũng sẽ được mở nguồn và có kho lưu trữ riêng. Hãy theo dõi để biết thêm thông tin về dự án phông chữ mới!
Cài đặt và cấu hình
Dựa trên nhu cầu tùy chỉnh ứng dụng terminal và command-line của người dùng. Windows Terminal cung cấp rất nhiều lựa chọn về cài đặt và cấu hình để bạn nắm quyền kiểm soát hoàn toàn đối với giao diện Terminal và mỗi shells/profile mà bạn mở sẽ như là 1 tab. Cài đặt sẽ được lưu trữ trong 1 tệp văn bản có kết cấu đơn giản giúp người dùng hoặc công cụ dễ dàng cấu hình.
Sử dụng cơ chế cấu hình Terminal, bạn sẽ có thể tạo ra nhiều “profile” cho mỗi shell/app/tool mà bạn muốn sử dụng, cho dù đó là PowerShell, Command Prompt, Ubuntu, hoặc cả kết nối SSH tới Azure hay thiết bị IoT. Các cấu hình này là sự kết hợp giữa các kiểu phông chữ với kích thước, chủ đề, màu sắc, độ trong/mờ của nền khác nhau.… Ngay bây giờ bạn có thể tạo ra các kiểu tinh chỉnh Terminal theo hướng cá nhân hóa đầy độc đáo phù hợp với phong cách của riêng bạn.
Theo thông tin từ phía nhà phát hành, sau khi cung cấp Windows Terminal, Microsoft dự định sẽ bắt đầu với nhiều tính năng còn tồn đọng trong backlog của họ, ngoài ra còn có rất nhiều tính năng mà bạn cũng như cộng đồng có thể sẽ thích thêm vào !
Khi nào bạn có thể chạm tay vào nó ?
Ngay hôm nay, Windows Terminal và Windows Console đã được tạo nguồn mở và bạn có thể sao chép, build, run, và test code từ kho lưu trữ GitHub: https://github.com/Microsoft/Terminal
Theo thông tin từ phía Microsoft:
Mùa hè trong năm 2019 này, bản xem trước của Windows Terminal sẽ được đưa ra trên Cửa hàng Microsoft để những người dùng đầu tiên sử dụng cũng như đưa ra phản hồi.
Mùa đông năm 2019, mục tiêu của Microsoft là khởi chạy Windows Terminal 1.0 và họ sẽ tương tác với cộng đồng để đảm bảo rằng nó đã sẵn sàng trước khi họ đưa ra phổ biến bên ngoài.
Windows Terminal là nguồn mở?
Microsoft xác nhận rằng đang mở nguồn không chỉ cho Windows Terminal, mà cả Windows Console – nơi lưu trữ cơ sở hạ tầng của command-line trong Windows và cung cấp các Console UX truyền thống.
Theo Microsoft chia sẻ, họ không thể chờ đợi phản hồi từ phía cộng đồng để cải thiện và tăng cường trải nghiệm cho Windows command-line.
Nghe rất là đáng kinh ngạc, nhưng tại sao Microsoft không cải thiện Windows Console hiện giờ?
Mục tiêu chính của Windows Console là duy trì khả năng tương thích ngược với các công cụ command-line, scripts, … Trong khi Microsoft quản lý để giới thiệu rất nhiều cải tiến chính cho các chức năng của Console ( thêm VT và hỗ trợ màu 24-bit ), họ không thể giới thiệu những cải tiến sâu hơn cho giao diện Console mà không “ phá vỡ thế giới “.
Windows Terminal cài đặt và chạy cùng với ứng dụng Windows Console in-box hiện có. Nếu bạn chạy Cmd/PowerShell/… nói đúng ra, họ sẽ bắt đầu gắn vào 1 Console truyền thống một cách chính xác giống như cách họ làm hôm nay. Bằng cách này, khả năng tương thích ngược vẫn còn nguyên trong khi vẫn có thể cung cấp cho bạn các tùy chọn trải nghiệm Windows Terminal nếu/khi bạn muốn làm như vậy. Windows Console sẽ tiếp tục gửi đến Windows trong nhiều thập kỷ tới để hỗ trợ những ứng dụng và hệ thống sẵn có hoặc lâu đời.
Việc đóng góp cho dự án/ứng dụng terminal nguồn mở sẽ ra sao?
Microsoft đã cẩn thận dò xét tùy chọn này trong quá trình lập kế hoạch và định rõ sự tham gia của họ vào một dự án sẵn có sẽ yêu cầu thay đổi các yêu cầu và kiến trúc của dự án một cách rất phá cách.
Thay vào đó, bằng cách tạo một ứng dụng terminal nguồn mở mới và Windows Console nguồn mở, giờ đây họ có thể mời cộng đồng cộng tác để cải thiện mã và tận dụng nó trong các dự án riêng của mỗi người.
Họ tin rằng có rất nhiều nơi trên thị trường cho những ý tưởng mới / khác nhau về những gì một terminal có thể và nên làm và họ hướng đến việc giúp hệ sinh thái của các terminal (và có liên quan) càng ngày càng phát triển thông qua việc giới thiệu những ý tưởng mới, cách tiếp cận và những đổi mới thú vị trong thời điểm này.
Microsoft đã phát hành Windows Terminal! Làm thế nào bạn có thể tải về?
Truy cập repo tại https://github.com/Microsoft/Terminal để sao chép, build, test và chạy Terminal! Bạn có thể gửi lỗi và chia sẻ phản hồi với họ và cộng đồng cũng như khắc phục các sự cố và cải thiện trên GitHub.
Bắt đầu từ mùa hè này, hãy thử cài đặt và chạy Windows Terminal từ Cửa hàng Microsoft. Nếu bạn gặp phải bất kỳ lỗi nào, hãy chia sẻ phản hồi thông qua Feedback Hub hoặc GitHub để biết thêm chi tiết các vấn đề/thảo luận.
“Trí tuệ nhân tạo (Artificial Intelligence – AI) đang thâm nhập vào hàng loạt lĩnh vực, mang lại những thay đổi quan trọng trong đời sống hằng ngày của con người” – Anh Lê Mai Tùng | CEO – EyeQ Tech
Một vài năm gần đây có thể được xem là năm lên ngôi của công nghệ tìm kiếm bằng hình ảnh dựa vào AI. Các công cụ nhận diện hình ảnh sẽ giúp các thương hiệu nắm bắt được các ý kiến phản hồi về sự trải nghiệm của khách hàng để có những bước điều chỉnh phù hợp về giá cả, kiểu dáng… của hàng hóa.
Cùng xem qua một số ví dụ mà anh Tùng chia sẻ để hiểu rõ hơn về việc ứng dụng AI trong bán lẻ là như thế nào bạn nhé!
***Trí tuệ nhân tạo (Artificial Intelligence – AI) đang thâm nhập vào hàng loạt lĩnh vực, mang lại những thay đổi quan trọng trong đời sống hàng ngày của con người. Đặc biệt, ngành bán lẻ trực tuyến cũng đang biến chuyển mạnh mẽ nhờ áp dụng các tính năng mới dựa trên nền tảng công nghệ mới này.
============================
🎟 VIETNAM MOBILE DAY lần thứ 9 mang đến hơn 100 chuyên đề hấp dẫn xoay quanh 6 nhóm chủ đề chính, đó là:
➖ Digital Transformation & Mobilization
➖ Woman in Tech
➖ 5G & Internet of things, Machine Intelligence and future of Mobile Technology
➖ Fin-Tech/ Mobile Payment/Ecommerce & Mobile commerce
➖ Digital Marketing & Mobile Marketing
➖ Mobile content (AR/VR/Livestream) and gaming
============================
📌 Time: Hồ Chí Minh – 06/06/2019 | Hà Nội – 14/06/2019
🔥🔥🔥 VÉ COMBO dành cho nhóm 5-10-20-30 người với những giá cực ưu đãi nhưng vẫn giữ nguyên quyền lợi TIÊU CHUẨN!!! Đăng kí tại: https://mobileday.vn/vi/goi-ve-doanh-nghiep/
ĐỘC GIẢ topdev blog ĐĂNG KÝ VÉ VỚI MÃ CODE TOPDEVBLOG@VMD19:ƯU ĐÃI GIẢM 30% GIÁ VÉ