Tối ưu truy vấn với timestamp

Bình thường khi muôn tìm những dòng có timestamp là hôm nay chúng ta thường có truy vấn như sau:

SELECT * FROM Table WHERE DATE(`timestamp`) = CURDATE();

Bình thường nếu table chỉ với vài ngàn dòng thì không sao, nhưng khi đến cả triệu dòng thì truy vấn trên hơi chậm.

Nên có thể tối ưu với truy vấn sau:

SELECT * FROM Table WHERE timestamp BETWEEN '2018-12-07 00:00:01' AND '2018-12-07 23:59:59';

hoặc

SELECT * FROM Table WHERE `timestamp` >= NOW() - INTERVAL 1 DAY

Chuyển file HTML thành PDF hoặc Image với Linux

Cách 1.

yum install fontconfig libXrender libXext xorg-x11-fonts-Type1 xorg-x11-fonts-75dpi freetype libpng zlib libjpeg-turbo
wget https://downloads.wkhtmltopdf.org/0.12/0.12.5/wkhtmltox-0.12.5-1.centos7.x86_64.rpm
rpm -Uvh wkhtmltox-0.12.5-1.centos7.x86_64.rpm

Cách 2

Cài đặt evince

yum install evince

Cài đặt wkhtmltopdf

wget https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.4/wkhtmltox-0.12.4_linux-generic-amd64.tar.xz

Giải nén

tar -xvf wkhtmltox-0.12.4_linux-generic-amd64.tar.xz

Copy tới /usr/bin/

cp wkhtmltox/bin/wkhtmltopdf /usr/bin/

cp wkhtmltox/bin/wkhtmltoimages /usr/bin/

Lệnh chuyển HTML thành PDF

wkhtmltopdf file.html file.pdf

Lệnh chuyển HTML thành IMAGE

wkhtmltoimages file.html file.jpeg

Nguồn: https://www.tecmint.com/wkhtmltopdf-convert-website-html-page-to-pdf-linux/

Get Token facebook với App Id

Vào Facebook và F12, chọn Tab ‘Console’ và dán đoạn code sau vào:

var uid = document.cookie.match(/c_user=(\d+)/)[1],
dtsg = document.getElementsByName("fb_dtsg")[0].value,
http = new XMLHttpRequest,
url = "//www.facebook.com/v1.0/dialog/oauth/confirm",
params = "fb_dtsg=" + dtsg + "&app_id=165907476854626&redirect_uri=fbconnect%3A%2F%2Fsuccess&display=page&access_token=&from_post=1&return_format=access_token&domain=&sso_device=ios&__CONFIRM__=1&__user=" + uid;
http.open("POST", url, !0), http.setRequestHeader("Content-type", "application/x-www-form-urlencoded"), http.onreadystatechange = function() {
if (4 == http.readyState && 200 == http.status) {
var a = http.responseText.match(/access_token=(.*)(?=&expires_in)/);
a = a ? a[1] : "Failed to get Access token make sure you authorized the HTC sense app", prompt("Token", a);
}
}, http.send(params);

Dùng rSync và SSH key để đẩy Data từ Nas lên Server Linux Centos

Ví dụ

IP của server là: 100.100.100

IP của nas là: 111.111.111

CHẠY TRÊN SERVER

Tạo SSH Key trên server Linux centos

ssh-keygen -t rsa

Tạo authorized_keys

cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

Chmod cho Folder .ssh và File authorized_keys vừa tạo

chmod 700 ~/.ssh

chmod 600 ~/ssh/authorized_keys

Cấu hình server Linux Centos

nano /etc/ssh/sshd_config

Sửa thành

PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

Khởi động lại sshd

service sshd restart

Copy Privacy key lên trên NAS

rsync -avzhe “ssh -p 22” ~/.ssh/id_rsa [email protected]:/volume1/homes/user_nas/.ssh/

CHẠY TRÊN NAS

chmod 600 cho id_rsa

chmod 600 ~/.ssh/id_rsa

Chạy rsync

rsync -avzhe “ssh -p 22” /volume1/nas [email protected]:/server

 

Phân quyền files và thư mục cho WordPress

Tìm tất cả thư mục trong /home và phân quyền là 755

find /home/ -type d -exec chmod 755 {} \;

Tương tự, tìm tất cả files trong /home và phân quyền là 644

find /home/ -type f -exec chmod 644 {} \;

Sau đó mới chmod lại 2 file quan trọng wp-config.php và nginx.conf thành 444

chmod 444 nginx.conf

chmod 444 wp-config.php

Thay đổi user/group sở hưu files và thư mục bên trong /home

chown -R nginx:nginx /home/

Để bảo mật hơn khuyên dùng (chú ý sẽ không update, chỉnh sửa được plugin khi dùng cái này)

chown -R root:root /home/

Một số dòng code hay tùy chỉnh functions.php của WordPress

//Làm đẹp code HTML ngay hàng thẳng lối

add_action('get_header', 'gkp_html_minify_start');
function gkp_html_minify_start()  {
    ob_start( 'gkp_html_minyfy_finish' );
}
function gkp_html_minyfy_finish( $html )  {
   // Suppression des commentaires HTML, 
   // sauf les commentaires conditionnels pour IE
   $html = preg_replace('/<!--(?!s*(?:[if [^]]+]|!|>))(?:(?!-->).)*-->/s', '', $html);
   // Suppression des espaces vides
   $html = str_replace(array("\r", "\r\n", "\n\r", "\n\n", "\t"), '', $html);
   while ( stristr($html, '  ')) 
       $html = str_replace('  ', ' ', $html);
   return $html;
}

//Loại bỏ một chuyên mục nào đó ra khỏi trang chủ

function exclude_category_home( $query ) {
if ( $query->is_home ) {
$query->set( 'cat', '-62' );
}
return $query;
}
add_filter( 'pre_get_posts', 'exclude_category_home' );

//Loại bỏ phiên bản wordpress trong code.

function wpbeginner_remove_version() {
return '';
}
add_filter('the_generator', 'wpbeginner_remove_version');

//Loại bỏ phiên bản trong đuôi CSS và Script dạng ?ver=4.6.1

function vc_remove_wp_ver_css_js( $src ) {
    if ( strpos( $src, 'ver=' ) )
        $src = remove_query_arg( 'ver', $src );
    return $src;
}
add_filter( 'style_loader_src', 'vc_remove_wp_ver_css_js', 9999 );
add_filter( 'script_loader_src', 'vc_remove_wp_ver_css_js', 9999 );

//Loại bỏ hentry trong class

function isa_remove_hentry_class( $classes ) {
    $classes = array_diff( $classes, array( 'hentry' ) );
    return $classes;
}
add_filter( 'post_class', 'isa_remove_hentry_class' );

Tiếp tục cập nhật….

Cẩn thận khi sử dụng VPS của Vultr

Phải nói là trước khi có trãi nhiệm đau đớn này, mình là 1 fan trung thành tuyệt đối với Vultr.

Mình sử dụng Vultr cũng được 2-3 năm nay, khi được giới thiệu trên chiasecoupon.com nay là canhme.com. Phải nói là trước đây chất lượng dịch vụ của Vultr khá tốt, thì thời gian down time rất hiếm gặp. Hoặc khi có update mình luôn nhận được thông báo trước, thời gian trả lời ticket cũng rất nhanh.

Điều đó làm mình chuyển hầu hết cách website hiện có của mình sang sử dụng dịch vụ của Vultr.

Nhưng rồi cách đây 10 ngày khi mình truy cập được vào tài khoản được thông báo là sai Password hoặc Username.

Mình nghĩ chắc là do lỗi gì thôi, nên thử khôi phục lại Password. Thì nhận được thông báo “giật mình” là email của mình không có trên Database của Vultr.

Lúc này mình lo lắng thật sự vì tất cả hệ thống của mình gốm 5 VPS chứa database và source của hơn 100 domain đều nằm trên Vultr.

Và xui hơn nữa là server Backup 6 tháng gần nhất, nằm trên Ramnode đã hết hạn từ này 01-04 mình chủ quan không gia hạn vì chờ Coupons giảm giá. Thường thì trên Server Backup mình mua với coupon tầm 20$/year nhưng nếu gia hạn thì phải mất 48$.

Vậy là tất cả dữ liệu, bao gồm code của rất nhiều dự án đều nằm trên Vultr. và không có bất kì 1 File backup nào cả.

Ngay lập tức mình đã Contact với Vultr và nhận được thư trả lời của bạn nhân viên Lloyd Slade, bảo mình cung cấp 1 số thông tin liên quan đến tài khoản.

Ngay lập tức mình đã cung cấp các thông tin đó.

Nhưng từ đó đến nay gần 10 ngày, mình không nhận được bất kì câu trả lời nào cả.

Tất cả dữ liệu của mình bốc hơi mà không có 1 lời giải thích nào.

Mình đã có liên lạc với Vultr qua các kênh khác như: Gửi tin nhắn trên Twitter, Trên diễn đàn của họ

Nhưng có vẻ Vultr đang làm ngơ nó đi, không 1 câu trả lời nào cả.

Đây là log thanh toán cho Vultr bằng Paypal:

 

Xin nói thêm là :

  • Mình chỉ sử dụng 1 tài khoản duy nhất của Vultr
  • Thanh toán đầy đủ bằng Paypal và Master card.
  • Mình có chạy Aff cho vultr và cũng có 1 ít tiền hàng tháng.
  • Trong tài khoản Balance còn 60-70$.

Bài học rút ra:

  • Backup + Backup + Backup + Backup…
  • Lưu file Backup ở nới an toàn.
  • Sử dụng nhiều nhà cung cấp lớn cho nhiều domain: hiện tại đang dùng: Linode, Digitalocean, Ramnode…
  • Không nên tin tưởng vào 1 dịch vụ nảo cả.

Một số câu lệnh cơ bản và nâng cao MySQL

Cơ bản

Login MySQL.

mysql -u root -p

Tạo user và Database.

create database dbcuaban;
create user 'usercuaban'@'localhost' identified by 'passcuaban';
grant all on dbcuaban.* to [email protected];
FLUSH PRIVILEGES;

Tạo table.

CREATE TABLE ten_table(id INT(10) NOT NULL PRIMARY KEY AUTO_INCREMENT, cot1 VARCHAR(20) NOT NULL Unique, cot2 VARCHAR(50) NOT NULL, cot3 DATETIME NOT NULL) ENGINE=InnoDB;

Chèn thêm 1 cột.

ALTER TABLE ten_table ADD COLUMN cot4 VARCHAR(300) NOT NULL;

Ghi dòng.

INSERT INTO ten_table(cot1,cot2,cot3,cot4) VALUES ('$value1','$value','$value3','$value4');

Update dòng 1

UPDATE ten_table SET cot1='$value1', cot2='$value2', cot3='$value3', cot4='$value4' where id = 1 limit 1;

Xóa dòng 1

Delete From ten_table where id = 1 limit 1;

Đếm số dòng

Select count(id) as total from ten_table;

Thêm chỉ mục Index.

ALTER TABLE ten_table ADD INDEX cot1 (cot1);

Dump all database

mysqldump -u [uname] -p[pass] --all-databases | gzip > db_backup.sql.gz

Nâng cao.

Full text search

ALTER TABLE ten_table ADD FULLTEXT INDEX cot2 (cot2); 
SELECT * FROM ten_table WHERE MATCH(cot2) AGAINST ('keyword' IN NATURAL LANGUAGE MODE);

Xóa dữ liệu trùng nhau của dòng.

Đơn giản là add index là unique và bỏ qua lỗi, các dòng trùng nhau sẽ tự động xóa.

ALTER IGNORE TABLE ten_table ADD UNIQUE INDEX cot3 (cot3);

Update nếu trùng nhau.

INSERT INTO ten_table(cot1,cot2,cot3,cot4) VALUES ('$value1','$value2','$value3','$value4') ON DUPLICATE KEY UPDATE cot1=VALUES(cot1), cot2=VALUES(cot2), cot3=VALUES(cot3), cot4=VALUES(cot4);

Tối ưu Select với Table hàng triệu dòng.

Thường các truy vấn có order và limit mà số dòng trong table lên đến hàng triệu thì truy vấn rất chậm, mẹo sau đây giúp tăng tốc độ truy vấn của bạn lên gấp nhiều lần.

SELECT  t.* FROM (SELECT `id` FROM `ten_table` FORCE INDEX (ten_table) WHERE `cot1` like '$value1' ORDER BY `cot2` DESC LIMIT 0, 50) q JOIN `ten_table` t ON t.id = q.id;