React native trên xcode
Hiện tại Xcode bản 9 cài được trên MacOS 10.12 High Sierra đã không dùng để sign code và build app được nữa nhé bạn. Không build và debug được luôn chứ đừng nói up lên store. Bạn buộc phải cài Xcode 11 trở lên. Và để cài được Xcode 11 bắt buộc bạn phải cài macos catalina 10.15 trở lên. Xài đồ apple thì "đã lên phải lên luôn" nhé bạn
Thắc mắc về thư viện Passport js
Hiện tại có vô vàn các service SaaS cung cấp dịch vụ authentication: Google, Amazon, Oauth... Mình có thể liệt kê 1 số lợi ích của việc dùng các "dịch vụ xác thực người dùng" online do các service SaaS cung cấp như sau:
- Single Sign On: User sẽ có thể đăng nhập 1 lần và vào được tất cả các dịch vụ vì bạn có thể dùng lại cùng 1 jwt token cho nhiều app (web, mobile...)
- User có thể đăng nhập bằng mail hoặc tài khoản mạng xã hội. Cái này tăng trải nghiệm người dùng vì họ sẽ k cần vào tạo tài khoản trên trang của bạn và lưu db của bạn nữa, người dùng họ phải tạo mật khẩu mới và thường quên mật khẩu vì nhiều trang trang nào cũng đòi 1 tài khoản. Thay vào đó họ chỉ cần dùng gmail hoặc facebook là xong.
- Người dùng thậm chí có thể dùng số điện thoại để đăng nhập và nhận pass bằng sms. Rất tiện lợi với người già, người không có email hoặc tk mạng xã hội.
- Bảo mật và chống ăn cắp tài khoản tốt hơn bạn tự code rất rất nhiều lần.
- Bạn sẽ rảnh háng lo làm ăn, code business. Các phần nặng nhọc về quản lý user và phân quyền giờ k còn trong db của bạn nữa, trong code cũng k cần xử lý gì nữa.
- Bảo mật 2 lớp. Ví dụ sau khi login email thì còn phải vào email lấy code xác nhận. Hoặc gửi sms OTP xác nhận. Các app thanh toán luôn cần có xác thực 2 lớp này. Nếu bạn code thì cần code nguyên hệ thống gen mã và gửi mail, rồi xác thực. Bạn to tay thì code nguyên hệ thống gửi sms cũng đc nhưng sẽ tốn tiền thuê nhà mạng gửi sms. Sau k thuê cloud authen luôn đi cho rồi.
Còn nhiều lợi ích nữa của việc dùng cloud authentication, tuy hơi đắt 1 tí nhưng đắt xắt ra miếng nhé bạn.
RegExp - JavaScript
Đây bạn nhé: https://regex101.com/r/f9u6X7/1
Ở đây bạn sẽ phải dùng đến Negative Lookahead, mình có giải thích kỹ ở bài này của mình: https://viblo.asia/p/hoc-regular-expression-va-cuoc-doi-ban-se-bot-kho-updated-v22-Az45bnoO5xY
Làm thế nào để thiết lập lịch trình cho Firebase Cloud Messaging sử dụng api?
Bạn có thể tham khảo:
https://fireship.io/lessons/cloud-functions-scheduled-time-trigger/
Javascript's Closures - "I need your help, please !!!"
Góp ý đầu tiên của mình: Bạn đang viết code khá lộn xộn và tư duy lập trình chưa vững.
Còn việc bạn không muốn dùng global var, theo mình hiểu là bạn chỉ khai báo 2 biến var đó tạm thời ra ngoài, khi nào dùng đến hàm countDown() thì mới tạo giá trị cho nó để đếm ngược (ví dụ bạn muốn đếm ngược 1 phút, hoặc 3 phút, tùy vào từng lúc gọi).
Vậy thì bạn cứ dùng global var như bình thường thôi, giá trị của biến Global sau khi dùng xong thì lại gán giá trị khác cho nó được và gọi sử dụng tiếp được mà bạn. Có vẻ bạn hiểu lầm Global var là không sửa được giá trị như Const var (hằng số const chỉ khai báo giá trị 1 lần và không được phép thay đổi giá trị).
Mình sẽ sửa lại hàm của bạn như sau:
//var minutes = 0; //Bình thường khai báo global var sẽ cần viết riêng ra ngoài như thế này.
//var seconds = 0; //Bình thường khai báo global var sẽ cần viết riêng ra ngoài như thế này.
Count10Minutes();
function Count10Minutes() {
minutes = 10; //Nhưng chúng ta có thể bỏ chữ var đi, và biến minutes sẽ trở thành global cho dù được khai báo ở trong 1 hàm local
seconds = 1; //Các biến khai báo và gán giá trị cho nó thành global thì có thể gọi được từ các hàm khác.
countdown();
}
function countdown() {
seconds--;
if (minutes !== -1) {
if (seconds !== -1) {
console.log((minutes + "").padStart(2, '0') + " : " + (seconds + "").padStart(2, '0'));
setTimeout(() => {
countdown()}, 1000); bạn,
} else {
minutes--;
seconds = 59;
setTimeout(() => {
countdown()}, 1000);
}
} else {
console.log("Time Out !!!");
}
}
Bạn có thể chạy thử online ở đây: https://playcode.io/263604?tabs=console&script.js&output
Hỏi cách xây dựng một trang web insert comment như trong Word ?
Có vẻ như bạn chưa dùng Google Docs bao giờ. Bạn hãy thử dùng nó xem sao nhé:
Học cái để làm một trang web giống như viblo?
Một câu hỏi xuất sắc. Bạn có thể bắt đầu bằng một con đường đúng đắn như sau.
Bạn hãy coi thời gian làm dự án này là nơi bạn học hỏi mọi thứ về làm web, cả front-end và back-end. Dự án làm một trang web hỏi đáp, chia sẻ kinh nghiệm lập trình thường là dự án tốt nghiệp của các bạn học CNTT.
-
Vì bạn nói bạn thích các trang web được load động, load từng phần chứ không load cả trang như là gõ url vào trình duyệt. Vậy thì bạn phải dùng đến AJAX và Jquery (Bạn phải học code ngôn ngữ Javascript). Nhưng cách đó hơi cổ xưa rồi. Hiện giờ cách hiện đại là sử dụng các front-end framework như là Angular hoặc ReactJS hoặc VueJS để load động được các phần giao diện màn hình. Do đó bạn hãy bỏ thời gian học một trong 3 framework đó nhé. Trong quá trình học làm giao diện front-end, bạn có thể phải học thêm về HTML5, CSS3 để thiết kế màn hình web nó được responsive (co dãn tùy kích cỡ, để xem trên điện thoại và MTB không bị vỡ, không bị cỡ chữ to nhỏ, cái này học về Media Query của css3 1 tí) hoặc bạn học luôn framework front-end nổi tiếng là Bootstrap 4.
-
Học xong phần front-end thì bạn phải chọn học một framework back-end nào đó. Vì bạn cần phải code phần login user, bình chọn bài viết, chia sẻ bài viết, upload ảnh nữa. Ngôn ngữ PHP với Framework Laravel khá là mạnh mẽ, kiến trúc theo kiểu MVC rất dễ học, rất dễ code. Ngoài ra nếu yêu thích Java bạn có thể chọn framework Spring MVC (cũng tương tự như Laravel) hoặc yêu C# thì chúng ta có Framework ASP.Net Core. Tất cả các framework back-end này đều có điểm chung là kiến trúc code theo MVC. Do đó bạn phải nắm rõ cách code theo mô hình mvc (bên cạnh kiến thức về lập trình hướng đối tượng).
-
Nếu bạn muốn trang web của mình có 1 app chạy trên mobile được và trỏ vào back-end của bạn để hiển thị lên màn hình mobile. Thì bạn có thể sử dụng lại các kiến thức ở front-end để làm ra một app mobile dạng hybrid (web app nhưng build ra bản cài đặt cho mobile). Bạn hoàn toàn có thể dùng Angular để làm một mobile app với framework Ionic 4, hoặc thích React thì dùng framework ReactNative.
Bạn có lẽ đang được tiếp cận kiến thức trong trường ĐH là lập trình php gọi form request bình thường nên khi chuyển trang thì phải load toàn bộ trang. Tuy nhiên các framework Back-end ngày nay đều giao tiếp với front-end bằng giao thức API, truyền tải JSON từ front-end sang back-end và ngược lại. Cho nên bạn phải học code back-end dưới dạng web API để dễ dàng nâng cấp về sau.
Con đường tự làm một trang web từ đầu thì là như vậy. Tuy nhiên hiện tại có rất nhiều opensource trên github về một trang chia sẻ kiến thức nhiều người dùng tham gia (dưới dạng forum như viblo).
Nếu bạn chọn cho mình 1 cặp front-end và back-end yêu thích, mình có thể tìm một bộ source code hoàn chỉnh để bạn tham khảo dựa theo sự lựa chọn của bạn.
Cách kiểm tra trạng thái Online or Offline thông qua Socket trong C#
Cái C# socket class này không có chế độ realtime. Khi gọi hàm socket.connected thì nó chỉ check 1 lần lúc chúng ta gọi. Vậy nên cách đơn giản đó là phải chạy một cái time Interval (lặp lại theo một khoảng thời gian) để gọi hàm check xem user còn connect không. C# đã có sẵn hàm socket.poll() phục vụ việc định kỳ gọi hàm cho chúng ta.
Bạn hãy tham khảo code tại đây https://stackoverflow.com/questions/2661764/how-to-check-if-a-socket-is-connected-disconnected-in-c
Xin giải pháp lưu trữ assets
Mình đồng ý với mod @thangtd90 đó là file data nên để ở Cloud Storage Services.
Bạn có thể tham khảo giá cả một số dịch vụ lưu trữ file (tính theo 1TB/tháng) xem sao nhé.
Tách chuỗi theo từng dòng php
Bạn có thể dùng Regular Expression.
Bạn hãy tham khảo bài viết sau đây nhé: https://viblo.asia/p/hoc-regular-expression-va-cuoc-doi-ban-se-bot-kho-updated-v22-Az45bnoO5xY
Cần giúp đỡ về FCM Token Thành Công Sẽ Hậu Tạ
"Có cách nào mình có thể bắn otp tới fcm token đã được đăng ký khi login để lấy mã otp xác thực không ạ."
Chỗ này mình chưa hiểu ý bạn muốn làm gì nữa.
FCM Token chính là registrationToken dùng để gửi nhận Push Notification từ Firebase Cloud Messaging.
Bạn đã có quyền gửi nhận được Notification rồi thì bạn sẽ có quyền authenticate (xác thực bảo mật 2 lớp) một số điện thoại bằng mã OPT. Bạn làm theo ví dụ ở đây:
Gọi từ web: https://firebase.google.com/docs/auth/web/phone-auth
Gọi từ Android: https://firebase.google.com/docs/auth/android/phone-auth
C# HtmlAgilityPack không load full html
HTMLAgilityPack thì không thể nào tự động bắt các request ajax và nhìn thấy html trả về trong đó được. Do đó nếu em muốn lấy data của 1 trang được load động bằng ajax thì em phải chịu khó dùng chrome debugging tool (F12) sau đó vào tab Network, chọn XHR để xem khi trang web load data động bằng ajax thì nó gọi đến url nào. Sau đó em dùng chính url đó để đưa cho HTMLAgilityPack nó parse cho em thì em sẽ lấy được ruột html của trang ajax đó nhé.
Có một cách nữa đó là dùng kết hợp với Selenium (theo như các anh khác đã gợi ý bên trên). Em có thể tham khảo code ở đây:
Có một comment nữa gợi ý là Dùng WebRequest thì sẽ k gen đầy đủ ajax, nhưng nếu dùng WebBrowser control thì lại đợi và lấy đủ được html gen động từ ajax. Em thử xem nhé:
https://stackoverflow.com/questions/10169484/htmlagilitypack-and-dynamic-content-issue/21955972
Xây dựng database kiến thức cho mình để sau này search lại.
Chào bạn, câu hỏi của bạn rất hay, rất rất lâu rồi anh mới thấy có người hỏi đúng cái tool cần cho dân lập trình như vậy!
Bản thân anh cũng lưu trữ rất nhiều code cho mình sau nhiều năm làm việc. Có 2 loại code mà mọi người hay lưu.
- Các đoạn code ngắn, nhỏ gọn và lặp đi lặp lại ở các dự án. Cái này tiếng Anh gọi là Code Snippet. Ví dụ:
- Các hàm nhỏ gọn về convert timezone về UTC, hàm Convert String về Datetime (của tất cả các ngôn ngữ khác nhau). Thường thì những hàm này lên mạng tra StackOverflow là ra, nhưng nếu ta đã áp dụng ngon lành vào dự án 1 vài lần, tức là có cách viết chuẩn, gọn, chạy không bug biếc gì, sao ta không lưu nó lại vào CSDL code của mình.
- Các template html, bootstrap, css, javascript (ví dụ trang login, trang remember pass, trang gửi email...) và thậm chí cả code logic cho phần này cũng nên lưu lại vào luôn.
- Các đoạn code cụ thể của từng ngôn ngữ lập trình ví dụ
Các code snippet này rất nhiều tool online để có thể tạo tài khoản free và upload code lên đó. Anh hay dùng trang này: https://snipsave.com/. Và hiện nay anh dùng thêm 1 tool Editor là Bracket (hay hơn Sublime) và đặc biệt là Bracket có sẵn tool để lưu code snippet. Bạn chỉ cần lưu vào lần sau bạn gõ từ khóa là nó tự paste đoạn code ra luôn cho, rất tiện.
-
Các code của cả 1 dự án, hoặc tài liệu phân tích, hoặc database đã thiết kế ngon. Đều nên lưu lại vào 1 nơi nào đó. Đừng lưu vào folder hoặc nén lại và nghĩ là ok. Như thế thì tìm kiếm nội dung code rất khó và rất dễ mất code vì cứ cất vào thư mục con sâu sâu bên trong thư mục cha. lỡ tay xóa 1 cục là xong. Hoặc cài lại win, thay ổ cứng. Sau 5 năm thì data rất dễ mất mát. Vì thế nên tạo 1 tài khoản github để lưu toàn bộ dự án lên đó. Nếu dự án là mật (private) k muốn share code thì hãy đưa lên gitlab.com nhé bạn (cho phép tạo private repository k mất đồng nào).
-
Có một loại nữa mà anh nghĩ là lập trình viên lão làng sẽ k quên lưu lại, đó là lưu lại các Bug và cách giải quyết. Cái này anh hay làm. Tại sao? Đó là vì có những bug ta gặp đi gặp lại nhiều lần ở nhiều dự án. Ví dụ quên save session cookies người dùng, Validate data sai. Nhiều khi vào dự án khó bạn gặp và fix mãi mới được cái bug (do bạn hoặc người khác gây ra) và chợt nhận ra mình đã từng fix con này rồi. Vậy làm thế nào để lưu lại được các bug? Không phải bug nào cũng nên log, mà lưu những cái khó nhằn, những bug bất ngờ và khó hiểu, những bug mà bạn fix xong cứ lâng lâng như lên tiên.
Vậy lưu cái gì? Lưu 2 cái:
- Cách gây ra bug (tình trạng bug, cách tái hiện, nền tảng xuất hiện, thao tác gây ra bug...), Tốt nhất là chụp ảnh và mô tả nguyên nhân
- Cách fix và chụp ảnh test lại. Lưu lại đoạn code đã fix.
Tool để lưu cái này thì cũng có thể lưu online hoặc a hay dùng Evernote.
Còn mở rộng ra hơn cho việc lưu các bài viết, các típ lập trình, thì trên viblo cũng đã có 1 cái chức năng Clip các bài viết hay. Nhưng theo anh cách hay nhất đó là hãy tự tạo ra một trang blog của riêng mình, và đưa các bài viết vào đó, chia làm các mục gọn gàng để dễ tham khảo. Không nhất thiết phải đưa blog online mà blog cho 1 mình mình tham khảo cũng được.
Bạn có thể tham khảo bài viết cách tạo ra 1 blog cá nhân của anh tại đây: https://viblo.asia/p/tay-trang-lam-nen-mot-trang-web-ca-nhan-chuyen-nghiep-khong-ton-mot-xu-4dbZNoB8lYM
Lựa chọn technical stack cho dự án chat
Mình sẽ phân tích một số ưu nhược điểm của 2 phương án để bạn dễ chọn nhé:
Phương án 1: Viết API backend hỗ trợ Real-time chat bằng ExpressJS+MongoDB+socketio (Mình refer dùng MongoDB hơn là MySQL vì dữ liệu chat rất đơn giản không có quan hệ nhiều giữa các bảng, viết kiểu No-SQL sẽ load nhanh hơn).
Ưu điểm ExpressJS+MongoDB+socketio:
- Dễ nâng cấp và bảo trì về sau, data là lưu trữ ở server của mình quản lý, cần thiết nâng cấp store (lưu ảnh, video, db...) thì tự mua thêm ssd về cắm vào (hoặc mua VPS)
- Dễ code, nhiều code base về chat sử dụng stack technologies này, bạn có thể search ra code ngay trên github.com
- Dễ dàng sửa đổi api để phù hợp với FrontEnd, vì bạn code cả 2 giao diện. Bạn có thể sử dụng thêm React hoặc Angular cho Frontend.
Nhược điểm ExpressJS+MongoDB+socketio:
- Phần push notification là phần khoai chuối nhất. Nếu bạn từng làm phần này thì sẽ thấy phần setup của Google và Apple là khác nhau và phải sử dụng API của họ để push được thông báo chat đến từng devices android hoặc iOS. Notification trên web thì dễ thở hơn vì có thể thông qua API được. Nhưng trên mobile thì k đơn giản như vậy.
- Phần quản lý User cũng là 1 phần nặng nhọc. Phải hỗ trợ token authentication để đăng nhập đăng ký được chát bằng google, facebook. Rồi phải tự bảo mật app của bạn để chống hack. Ví dụ cơ chế chống hack bằng upload fire lên server, XSS...
- Bạn phải code cả Backend và FrontEnd. Nặng nhọc. 2 team mà độc lập là dễ cãi nhau.
- Cần phải tự hosting Backend-API.
Phương án 2: Sử dụng API sẵn có của Firebase realtime database. Chả phải làm gì sất, kiếm cái theme chát ngon ngon và xử lý code client là chủ yếu.
Ưu điểm:
- Bớt được phần code Backend.
- Firebase hỗ trợ tận răng, có Push notification sang mobile+web luông. Có luông phần quản lý email user.
- Code base cũng gần như có sẵn rất nhiều trên github.
- Không mất phí hosting API.
- Hỗ trợ luôn cơ chế offline-sync DB (ở cả web, android và ios). Nghĩa là mất mạng chát cứ chát, có mạng lại nó sẽ tự cập nhật.
Nhược điểm:
- Giá cả đắt đỏ và leo thang. Bạn đừng dại mà nghĩ nó tính rẻ, cứ mỗi ngày mười nhìn lượt dòng chat thôi là tèo.
Nhìn thì có vẻ dùng firebase sẽ nhanh và ngon hơn nhưng thật ra nó đắng hơn đấy. Mình khuyên bạn là nếu app cho công ty bạn dùng thì dùng firebase.Còn làm app cho khách hàng của bạn dùng thì nên dùng bộ kia. Have fun!
Thắc mắc về Jquery Promise
Vấn đề của bạn là bạn chưa hiểu rõ cơ chế hoạt động của Promises sử dụng trong Jquery khi dùng hàm $.get() để LẦN LƯỢT lấy được data từ 2 api url trả về và nối lại đưa vào trang.
Bạn có thể đọc bài tham khảo của mình sau đây về cách hoạt động và cách sử dụng Javasript Promises nhé: https://viblo.asia/p/tu-javascript-thuan-den-rxjs-phan-1-m68Z0OJzKkG
async/await - foreach & for
Bạn viết forEach như sau thì sẽ chạy nhé:
(async() => {
[1, 2, 3, 4, 5, 6, 7, 8].forEach(async(item, key) => {
await setTimeout(function(){ console.log('Page ID Spawned', key)},1000*key);
});
})();
Cách giải thích rất đơn giản. for là một hàm sync, lần lượt các giá trị được lấy ra để tính toán. forEach là một hàm async, toàn bộ các giá trị trong mảng sẽ đồng thời được xử lý cùng lúc. Do đó hàm setTimeout() bình thường sẽ không chạy đc trong vòng forEach. Tại sao setTimeout lại k chạy đúng? bởi vì mỗi phần tử ta xét timeout cho nó 1s. và cả 9 phần tử sẽ cùng nhau đợi 1s. Rồi cả 9 thằng cùng được in ra. Nếu ta tăng lên timeout 10s. thì sẽ thấy cửa sổ console đợi 10s rồi cả 9 thằng cùng hiện ra. Nó khác với vòng for là lần lượt từng thằng hiện ra.
Thủ thuật mà tôi dùng ở đây đó là đối với mỗi phần tử trong mảng thì thời gian đợi là khác nhau. Do đó tất cả cùng xuất phát nhưng thời gian đợi của từng phần tử để được in ra là khác nhau => cảm giác in ra lần lượt các phần tử.
Thế tại sao await cũng không có tác dụng? vì promises.all() cũng là async. ta gọi async trong một hàm async? như thế thì sẽ không có tác dụng gì để khiến code của ta chạy sync đc cả.
Nếu bạn đã hiểu ra vấn đề thì bạn nên rút gọn lại đoạn code của mình. Code của bạn gọi bị thừa quá nhiều async và await. Viết như thế khiến tốn tài nguyên vô ích. Viết như sau là đủ. Vì forEach đã là async rồi.
[1, 3, 6, 4, 10, 6, 7, 8].forEach((item, key) => {
setTimeout(function(){ console.log('Page ID Spawned', key)},1000*key);
});
Còn với vòng for thì viết như sau là đủ:
const URLS = [1, 2, 3, 4, 5, 6, 7, 8];
for (let i = 0; i < URLS.length; i++) {
console.log('Page ID Spawned', i);
}
Các kĩ năng
Tổ chức
Chưa có tổ chức nào.