Khi làm các ứng dụng web, chúng ta luôn có nhu cầu lấy dữ liệu từ các remote server, API… các dữ liệu mạng xã hội, tin tức, shopping, thanh toán thì rất nhiều records, do đó chúng ta cần giải pháp phân trang để giảm tải sự hiển thị quá nhiều data gây khó chịu cho người dùng.
Hướng dẫn đơn giản sau đây giúp bạn dễ dàng phân trang trong app ReactJs
Ví dụ ở đây sử dụng API dữ liệu các quốc gia, 248 quốc gia tất cả. Chúng ta sẽ bắt đầu với ứng dụng react đơn giản.
Khi lập trình ứng dụng chúng ta hay gặp vấn đề làm sao cho tối ưu tài nguyên của hệ thống, tăng tốc độ trải nghiệm từ phía end user. Đặc biệt là các ứng dụng web.
Cache là gì ? Lý thuyết:Cache là tên gọi của bộ nhớ đệm – nơi lưu trữ các dữ liệu nằm chờ các ứng dụng hay phần cứng xử lý. Mục đích của nó là để tăng tốc độ xử lý (có sẵn xài liền không cần tốn thời gian đi lùng sục tìm kéo về).
Thực tế:Cache là các dữ liệu trong phiên làm việc trước của các ứng dụng, chương trình mà hệ điều hành lưu lại nhằm giúp việc tải data trong các phiên làm việc sau được nhanh hơn.
Tip này hướng dẫn các bạn cách implement cache vào ứng dụng, sử dụng thư viện đã được wrap lại từ Memery Cache & Redis Cache
Người xưa đã có câu “nhất nghệ tinh, nhất thân vinh, hay một nghề cho chín, còn hơn chín nghề.” Nhưng đọc thêm bài viết dài một chút cũng không hẳn là một ý tồi.
Đứa bạn 1: Tôi có thể thiết kế rất giỏi
Đứa bạn 2: Tôi là một huấn luyện viên gym rất xuất sắc
Đồng nghiệp 1: Tôi cực kỳ giỏi việc nịnh sếp
Đồng nghiệp 2: Tôi thực sự rất giỏi việc đóng clip hài
Tôi: Tôi có thể làm mọi thứ mà các ông làm
1. Có một sự thật là khi bạn giỏi mọi thứ, thực ra bạn lại chẳng thực sự giỏi một thứ gì. Ngoại trừ những “siêu nhân” biết tuốt, mỗi người trên cuộc đời này chỉ thực sự vĩ đại trong một lĩnh vực hay kỹ năng gì đó, và đó là thứ sẽ nuôi sống người đàn ông cả cuộc đời.
2. Trường học dạy chúng ta phải có điểm cao ở mọi môn, nhưng trường đời chỉ thực sự cần bạn là chuyên gia trong một lĩnh vực mà thôi. Như các cụ đã nói, một nghề cho chín còn hơn chín nghề.
3. Trong cuốn sách Average is Over (Tạm dịch: Sự chấm hết của trung bình), kinh tế gia Tyler Cowen cho rằng kỷ nguyên của sự “bình thường” sắp chấm dứt.
Chỉ vào chục năm nữa, khi robot bắt đầu thay thế các công việc đòi hỏi kỹ năng tầm thấp hoặc trung bình, chiến lược sống sót duy nhất của bạn là phải giỏi ở một thứ, chỉ cần một mà thôi.
5. Giỏi nhiều thứ mới dễ, xuất chúng ở một ngành nghề mới thực sự khó. Khi bạn nghe thấy một đứa bạn, vừa đánh đàn giỏi, vừa học giỏi, vừa kinh doanh giỏi, vừa làm chồng giỏi, vừa làm bố giỏi… nói chung cái gì cũng giỏi, thì tốt nhất hãy xem gia thế của bạn ấy là ai trước.
Vì sự thực là, sẽ luôn có chi phí cơ hội, cực kỳ hiếm người có thể xuất sắc ở mọi lĩnh vực. Ngoài ra, thì để cái gì cũng biết thì vô cùng dễ, để thực sự là chuyên gia đầu ngành của một lĩnh vực thì đòi hỏi sức kiên trì lớn hơn rất nhiều.
6. Quy luật 10,000 giờ. Để thực sự xuất chúng ở một chuyên ngành nào đó, bạn cần bỏ ra ít nhất 10,000 giờ cho chúng. Nghe thì không to lắm, nhưng để ngày nào cũng bỏ ra 2-3 tiếng “luyện công” thì bạn thực sự cần có kỹ năng kỷ luật bản thân rất tốt. Nhưng biết làm sao được, nếu ghế của cha bạn không to, nhà bạn không giàu, thì đó dường như là con đường duy nhất dẫn đến thành công.
7. “Tạm được là chưa đủ.” Chắc chắc đôi khi bạn sẽ gặp những sếp dễ tính, và khi bạn nộp một sản phẩm chưa hoàn hảo nhất với sức lực của mình, họ đã khen “Em làm tốt rồi”. Cái lợi của việc này là bạn cảm thấy được trân trọng, nhưng thực ra ông sếp đang làm hại bạn.
Thỏa mãn bản thân với những kết quả chưa thực sự “chín” sẽ làm bạn mất thái độ cầu toàn, và khó có thể leo lên tầm chuyên gia, khi những việc nhỏ còn làm chưa trọn vẹn.
8. Kiên nhẫn không phải dễ dàng. Nó đau đớn và cực kỳ nhọc nhằn. Thành công chưa bao giờ là dễ. Tập trung vào một điểm mạnh của mình và đưa nó lên “cấp” cao nhất chưa bao giờ là dễ dàng. Bạn sẽ gặp khó khăn, bạn sẽ nản và muốn nhảy vòng quanh để giỏi ở mọi thứ, nhưng đó là cái bẫy.
Thời trai trẻ, đừng lãng phí.
Từ năm 20-30 tuổi, siêu tập trung vào chỉ một lĩnh vực, trở thành chuyên gia hàng đầu trong lĩnh vực đó, ngành nghề gì cũng được, và bạn sẽ không phải hối hận.
Tạo app trên discord: https://discordapp.com/developers/docs/intro
Lấy token để sử dụng sau:
Sử dụng Visual Code để code.
Tạo file bot.js
Code:
npm install discord.js
const Discord = require('discord.js');
const client = new Discord.Client();
const commandPrefix = "!";
client.on('ready', () => {
console.log(`Logged in as ${client.user.tag}!`);
});
client.on('message', (message)=> {
if(!message.content.startsWith(commandPrefix)) return;
const args = message.content.slice(commandPrefix.length).trim().split(/ +/g);
const command = args.shift().toLowerCase();
switch(command){
case "hello":
hello(message);
break;
case "help":
help(message);
break;
case "ping":
sendText(message, "Pong");
break;
case "clear":
clear(message);
break;
case "cmc":
coinmarketcap(message);
break;
case "c":
chart(message, args);
break;
case "p":
price(message, args);
break;
default:
sendText(message, "Command not found.")
break;
}
});
client.login('NDQyMDAyMTAyODAyMzE3MzMz.DdMfbw.3eV-Qk5N2TpDIDgatQb1ILeD0Hc');
Các hàm chính trong bot
function hello(message){
message.channel.send("Hello " + message.author + "! Nice to meet you. :smiley: ");
}
function help(message){
let embed = new Discord.RichEmbed()
.setAuthor("Hello world", "http://icons.iconarchive.com/icons/froyoshark/enkel/256/Bitcoin-icon.png")
.addField("!hello", "Sends a friendly message!")
.addField("!help", "Sends this help embed")
.addField("!cmc", "Coin Market Cap")
.addField("!ping", "Ping")
.addField("!p", "Price of coin. Ex: BTCUSDT or price BTC")
.setTitle("Bot commands:")
.setFooter("Here you have all bot commands you can use!")
.setColor("AQUA");
message.channel.send({embed: embed});
}
function sendText(message, text){
message.channel.send(text).then(msg=>{msg.delete(10000)});
message.delete(12000);
}
function clear(message){
if (message.member.hasPermission("MANAGE_MESSAGES")) {
message.channel.fetchMessages()
.then(function(list){
message.channel.bulkDelete(list);
}, function(err){message.channel.send("ERROR: ERROR CLEARING CHANNEL.")})
}
else{
console.log("You don't have permission");
}
Hàm lấy giá trên coinmarketcap.com
npm install node-fetch
function coinmarketcap(message){
let url = 'https://api.coinmarketcap.com/v2/global/';
let bitcoin_percentage_of_market_cap='';
let total_market_cap= '';
let total_volume_24h = '';
let last_updated = '';
fetch(url)
.then(res => res.json())
.then(json => {
// console.log(json);
bitcoin_percentage_of_market_cap = json.data.bitcoin_percentage_of_market_cap;
total_market_cap = json.data.quotes.USD.total_market_cap;
total_volume_24h = json.data.quotes.USD.total_volume_24h;
last_updated = json.data.last_updated;
let embed = new Discord.RichEmbed()
.setAuthor("Coinmarketcap", "http://icons.iconarchive.com/icons/froyoshark/enkel/256/Bitcoin-icon.png")
.addField("Market Cap (USD):", numberFormat(total_market_cap))
.addField("24h Vol (USD): ", numberFormat(total_volume_24h))
.addField("BTC Dominance(%): ", bitcoin_percentage_of_market_cap)
.setFooter("Last Updated: " + timeConverter(last_updated))
.setColor("AQUA");
// Send the embed with message.channel.send()
message.channel.send({embed: embed}).then(msg=>{msg.delete(10000)});
message.delete(12000);
});
}
Thêm bot vào Server Discord
Open link & thay bằng client_id của bạn trên trình duyệt
Khi lập trình các bạn hay gặp vấn đề khó khăn khi lấy dữ liệu giữa các Dropdown List khác nhau. Ví dụ: Từ tỉnh thành -> quận huyện -> Xã phường…
Đây là khó khăn của rất nhiều bạn sinh viên khi mới bắt đầu học lập trình. Video dưới đây sẽ hướng dẫn bạn cách giải quyết, khá là đơn giản. Hoàn toàn có thể áp dụng nhiều trường hợp khác nhau.
Video không có tiếng, do mình làm trong lúc ngẫu hứng ngoài quán cafe. Các bạn có thể theo dõi, hoặc tải mã nguồn về phân tích thêm.
public class MyDbContext:DbContext
{
// Ở đây các bạn có thể khai báo trong Web.config.
private const string sqlConnection = @"Data Source=.\SQLExpress; Initial Catalog = CountryDb; User Id=sa; Password = sa";
public MyDbContext() : base(sqlConnection)
{
}
public DbSet<Country> Countries { get; set; }
public DbSet<Province> Provinces { get; set; }
public DbSet<District> Districts { get; set; }
public DbSet<Ward> Wards { get; set; }
}
public JsonResult GetAllCountries()
{
using(var db = new MyDbContext())
{
var data = db.Countries.OrderBy(x=>x.Name).ToList();
return Json(data, JsonRequestBehavior.AllowGet);
}
}
/// <summary>
/// Hàm lấy danh sách tỉnh thành theo CountryId.
/// Id = 237 là của Việt Nam. Do database mình quy định vậy
/// Test OK
/// </summary>
/// <param name="id">Id của country</param>
/// <returns></returns>
public JsonResult GetAllProvinceByCountryId(int? id=237)
{
using (var db = new MyDbContext())
{
var data = db.Provinces.Where(x=>x.CountryId== id).OrderBy(x=>x.Name).ToList();
return Json(data, JsonRequestBehavior.AllowGet);
}
}
/// <summary>
/// Hàm lấy tất cả danh sách quận huyện
/// Id = 1 là Hà Nội, do database mình quy định vậy
/// Test OK
/// </summary>
/// <param name="id">Id = ProvinceId</param>
/// <returns></returns>
public JsonResult GetAllDistrictByProvinceId(int? id = 1)
{
using (var db = new MyDbContext())
{
var data = db.Districts.Where(x => x.ProvinceId == id).OrderBy(x=>x.Name).ToList();
return Json(data, JsonRequestBehavior.AllowGet);
}
}
/// <summary>
/// Hàm lấy danh sách xã phường theo quận huyện
/// Id= 1 là Ba Đình. Do database quy định
/// Test OK
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public JsonResult GetAllWardByDistrictId(int? id = 1)
{
using (var db = new MyDbContext())
{
var data = db.Wards.Where(x => x.DistrictId == id).OrderBy(x=>x.Name).ToList();
return Json(data, JsonRequestBehavior.AllowGet);
}
}
Code js
// File javascript để lấy dữ liệu
// Khai báo URL service của bạn ở đây
var baseService = "/Service";
var countryUrl = baseService + "/GetAllCountries";
var provinceUrl = baseService + "/GetAllProvinceByCountryId";
var districtUrl = baseService + "/GetAllDistrictByProvinceId";
var wardUrl = baseService + "/GetAllWardByDistrictId";
$(document).ready(function () {
// load danh sách country
_getCountries();
$("#ddlCountry").on('change', function () {
var id = $(this).val();
if (id != undefined && id != '') {
_getProvince(id);
}
});
$("#ddlProvince").on('change', function () {
var id = $(this).val();
if (id != undefined && id != '') {
_getDistrict(id);
}
});
$("#ddlDistrict").on('change', function () {
var id = $(this).val();
if (id != undefined && id != '') {
_getWard(id);
}
});
$("#ddlWard").on('change', function () {
var countryText = $("#ddlCountry option:selected").text();
var provinceText = $("#ddlProvince option:selected").text();
var districtText = $("#ddlDistrict option:selected").text();
var wardText = $("#ddlWard option:selected").text();
var html = "Quốc gia: " + countryText + " Tỉnh thành: " + provinceText + " " + "Quận huyện: " + districtText + " " + "Xã phường: " + wardText;
html += "</br>Quê bạn thật là đẹp. Chúc mừng bạn!!!";
$("#divResult").html(html);
});
});
function _getCountries() {
$.get(countryUrl, function (data) {
if (data != null && data != undefined && data.length) {
var html = '';
html += '<option value="">--Không chọn--</option>';
$.each(data, function (key, item) {
html += '<option value=' + item.Id + '>' + item.Name + '</option>';
});
$("#ddlCountry").html(html);
}
});
}
// truyền id của country vào
function _getProvince(id) {
$.get(provinceUrl + "/"+id, function (data) {
if (data != null && data != undefined && data.length) {
var html = '';
html += '<option value="">--Không chọn--</option>';
$.each(data, function (key, item) {
html += '<option value=' + item.Id + '>' + item.Name + '</option>';
});
$("#ddlProvince").html(html);
}
});
}
// truyền id của province vào
function _getDistrict(id) {
$.get(districtUrl + "/" + id, function (data) {
if (data != null && data != undefined && data.length) {
var html = '';
html += '<option value="">--Không chọn--</option>';
$.each(data, function (key, item) {
html += '<option value=' + item.Id + '>' + item.Name + '</option>';
});
$("#ddlDistrict").html(html);
}
});
}
// truyền id của district vào
function _getWard(id) {
$.get(wardUrl + "/" + id, function (data) {
if (data != null && data != undefined && data.length) {
var html = '';
html += '<option value="">--Không chọn--</option>';
$.each(data, function (key, item) {
html += '<option value=' + item.Id + '>' + item.Name + '</option>';
});
$("#ddlWard").html(html);
}
});
}
Khi lập trình web, các vấn đề liên quan đến hình ảnh được sử dụng thường xuyên, ví dụ upload hình ảnh sản phẩm, banner, logo….
Từ đây nảy sinh vài vấn đề như: muốn thấy hình ảnh đại diện ngay khi chọn file. Resize hình ảnh để tiết kiệm dung lượng…. Trước khi HTML5 ra đời, chúng ta thường hay giải quyết mọi thứ trên server, tức là upload ảnh lên server, sau đó xử lý. VD: dùng ajax để upload ảnh lên server, sau đó trả về ảnh đại diện…. Điều này dẫn đến tốn thời gian xử lý cho máy chủ, hoặc file lớn, mạng chậm thì user phải chờ đợi rất lâu.
Thật may mắn khi HTML5 ra đời, nó giúp chúng ta cả 2 việc trên luôn. Đó là preview (xem trước) hình ảnh ngay khi vừa chọn xong, đồng thời resize ảnh luôn ngay trên trình duyệt. Sau đó chúng ta chỉ việc upload mã base64 này lên server, và convert lại thành hình ảnh là xong, hoặc lưu luôn base64 vào database cũng ok.
HTML sử dụng API FileReader, nó có thể đọc file ảnh, file txt, khá là thú vị.