Tổng hợp kiến thức Jquery, JavaScript

Delay khi onkeyup

//Sử dụng function này
function delay(callback, ms) {
  var timer = 0;
  return function() {
    var context = this, args = arguments;
    clearTimeout(timer);
    timer = setTimeout(function () {
      callback.apply(context, args);
    }, ms || 0);
  };
}

//Demo bên dưới 500ms sẽ chạy Log 1 lần, Bình thường thì gõ tới đâu chạy đến đó.
$('#input').keyup(delay(function (e) {console.log('Time elapsed!', this.value);}, 500));

Checked nhiều input radio chung ID cùng lúc

jQuery(document).ready(function($) {
	$("input[id^='delete_option1']").prop("checked", true);
});

Vòng lặp Get hoặc Set tất cả giá trị cho TABLE

$('table tr').each(function() {
    $(this).find("td").text('Hello');    
 });

Hành động Checked hoặc Unchecked trong checkbox

$("#checkbox").change(function() {
  if(this.checked){      
      alert('Đã check');
   }
   else{
      alert('Đã uncheck'); 
   }               
});

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/

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

Để 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ả.

Hướng dẫn cách khôi phục Google doanh nghiệp bị đối thủ phá

Hiện tai trên một số diễn đàn có hướng dẫn cách để report  google doanh nghiệp nên mình thấy rất nhiều người bị đối thủ report chơi xấu. Cá nhân công ty của mình cũng vậy bị đối thủ report thường xuyên, khắc phục riết nên có 1 số kinh nghiệm chia sẻ với Anh Em.

Mình cũng đã nói chuyện với 1 số ACE làm bên google và họ báo là đây là đặc thù của Local Việt Nam chứ các nước trên thế giới không có chuyên report để chơi xấu như vậy. và họ khuyên mình nếu có bị report thì nên thông báo cho bên google để họ khắc phục kịp thời. Nói chung Google là 1 công ty lớn làm việc thì trách nhiệm khỏi chê luôn.

Thôi không dài dòng nữa vào vấn đề chính thôi.

Bước 1:

Đăng nhập vào email quản lý cái Google doanh nghiệp.

Bước 2:

Truy cập vào đường link bên dưới

https://business.google.com/manage/

Bạn sẽ thấy doanh nghiệp của bạn như sau:

Bước 3:

Click vào “QUẢN LÝ VỊ TRÍ” để quản lý doanh nghiệp của bạn.

Bước 4:

Click vào “Hỗ Trợ” bên góc trái.

Bước 5:

Trong phần “Liên hệ với chúng tôi” Bạn click vô “Bạn cần trợ giúp thêm” như bên dưới.

Bước 6:

Click “Không thể tìm thấy doanh nghiệp chúng tôi trên Google.”

Bước 7:

Click vào “Cải thiện xếp hạng địa phương của bạn”

Bước 8:

Kéo xuống dưới cùng và chọn 1 hình thức liên hệ, như mình thì mình chọn “Gọi” để khi giải quyết xong có thể gọi cho mình để thông báo.

Bước 9:

Nhập một số thông tin mà google yêu cầu:

Mối quan hệ của bạn với doanh nghiệp là gì?

Tôi là chủ sở hữu hoặc người lao động của doanh nghiệp này.

Mô tả vấn đề của bạn

Không thể tìm thấy doanh nghiệp của tôi trên Google

Tên doanh nghiệp

CÔNG TY TNHH DVKT CƠ ĐIỆN LẠNH SỐ ĐỎ

Địa chỉ doanh nghiệp

122 Đường TTH21, Phường Tân Thới Hiệp, Quận 12, Thành Phố Hồ Chí Minh, Việt Nam

URL công khai cho trang của doanh nghiệp bạn là gì?

https://plus.google.com/u/0/+dienlanhsodo
Bạn quản lý doanh nghiệp của mình trên Google bằng cách nào?

Google Doanh nghiệp của tôi trên máy tính của bạn

Nếu có yêu cầu thì nhập thêm Email + Số Điện Thoại.

 

Thường google sẽ giải quyết trong 1-2 ngày làm việc, tùy theo lúc bạn gửi email là ngày thường hay ngày nghĩ.

Chúc các bạn thành công.

 

Cập nhật:

Ngoài ra, google mới cập nhật thêm 1 cái link mới để cho người dùng có thể gửi báo cáo cho họ, bạn chỉ cần đăng nhập và truy cập vào link sau để gửi báo cáo nhé:

https://support.google.com/business/contact/local_pages_disabled

Làm thế nào để lấy nội dung từ Facebook về site WordPress.

Nhiều bạn là dân SEO chắc cũng biết, nội dung trên Facebook rất tươi mới và tự nhiên. Vì chính sách bảo mật nên hầu như Facebook rất hạn chế cho Google index nội dung trên trang của nó.

Đặt biệt là những Groups đóng, hay Profile cá nhân không Public ra ngoài thì Google không thể nào với tay tới được.

Ngoài ra những Status đó được cập nhật hàng ngày với hàng trăm ngàn comment tự nhiên.

Câu hỏi đặt ra là làm thế nào để get nội dung trên tường của Facebook về website WordPress.

Lúc trước mình có code một site php để get content nhưng nhận thấy một site thuần php sẽ rất mất thời gian nếu muốn làm nhiều site và tối ưu cho SEO cũng khó khăn hơn nên quyết định làm 1 cái Plugin WordPress.

Bạn có thể download tại đây: Get Content WordPress

Chức năng:
Có thể lấy nội dung trên tường của Fanpage, Groups và User bất kì.
Có thể lấy bình luận của trên Facebook và tạo thành bình luận trên WordPress.
Tự động lấy post mới trên feed Facebook theo giờ, hoặc ngày tùy chọn.
Lưu hình ảnh (nếu có) trên Facebook về hosting.
Có thể chọn lấy nội dung theo từ khóa. (Ví dụ chỉ get cái Status nào có từ khóa là “Apple” chẵng hạn).
Chỉ lấy nội dung có số Likes > 1 số tùy chọn.
Chỉ lấy bài viết nếu số ký tự lớn hơn 1 số tùy chọn.
Tương tự với comment.
Ngoài ra có rất nhiều chức năng hay ho khác.
Sử dụng:
Rất đơn giản Plugin chỉ cần 2 thông tin là UID của Page, Groups hoặc User. Và Token của user Facebook.

UID của Facebook bạn có thể get tại đây: https://findmyfbid.in

Token bạn có thể làm theo hướng dẫn này:

Bước 1: Vào trang https://fb.com/me.
Bước 2: Nhấn 2 phím Ctrl + U để View Source.
Bước 3: Nhấn 2 phím Ctrl + F để Find.
Bước 4: Gõ vào ô Find dòng: “access_token”.

Hoặc đơn giản hơn là làm theo video này:

Tại sao nên dùng Plugin này:
Nội dung Facebook là tươi mới, tự nhiên rất tốt cho SEO phù hợp với mấy bạn làm site vệ tinh.

Rất đơn giản để Backup một trang Facebook về website, tài khoản của mình 1000 bài viết mà lấy trong 15 phút là xong.

Là cách tuyệt vời để làm trang tin tức tổng hợp, thường các thông tin trên Facebook đến nhanh hơn các site báo chí. Vì vậy lấy tin tức từ Facebook sẽ giúp người dùng tiếp cận nhanh hơn.

Hướng dẫn sử dụng Varnish làm Reverse Proxy

Yêu cầu:

  1. Đã có 1 webserver dùng Apache hoặc Nginx.
  2. 1 Server cài sẵn Centos 6.5 64 bit để cài đặt varnish.

Tiến hành.

Chú ý: Sẽ không có bất kì chỉnh sửa nào trên web server, mình chỉ cài đặt varnish lên server mới rồi trỏ IP về web server thôi.

Hướng dẫn cài đặt Varnish

Thao tác 100% trên Server Varnish nhé.

Update centos

yum update

Cài đặt varnish

yum install epel-release
rpm --nosignature -i https://repo.varnish-cache.org/redhat/varnish-4.0.el6.rpm
yum install varnish

Khởi chạy varnish

service varnish start

Cho varnish khởi động cùng centos

chkconfig varnish on

Set port mặc định cho varnish là 80

nano /etc/sysconfig/varnish

tìm

VARNISH_LISTEN_PORT=6085

đổi thành

VARNISH_LISTEN_PORT=80

Cấu hình cho VCL

Tạo file dự phòng

cp /etc/varnish/default.vcl /etc/varnish/default.vcl.bak

Edit file này

nano /etc/varnish/default.vcl

Thay đổi toàn bộ nội dung bằng nội dung bên dưới.

#
# This is an example VCL file for Varnish.
#
# It does not do anything by default, delegating control to the
# builtin VCL. The builtin VCL is called when there is no explicit
# return statement.
#
# See the VCL chapters in the Users Guide at https://www.varnish-cache.org/docs/
# and https://varnish-cache.org/trac/wiki/VCLExamples for more examples.

# Marker to tell the VCL compiler that this VCL has been adapted to the
# new 4.0 format.
vcl 4.0;

# Default backend definition. Set this to point to your content server.
backend default {
 .host = "IP của Web server";
 .port = "80";
}

acl purge {
 "127.0.0.1";
}

sub vcl_recv {
 if (req.method == "PURGE") {
 if (!client.ip ~ purge) {
 return(synth(405,"Not allowed."));
 }

if (req.http.X-Purge-Method == "regex") {
 ban("req.url ~ " + req.url + " && req.http.host ~ " + req.http.host);
 return (synth(200, "Banned."));
 } else {
 return (purge);
 }
 }

### Do not Authorized requests.
 if (req.http.Authorization) {
 return(pass); // DO NOT CACHE
 }

### Pass any requests with the "If-None-Match" header directly.
 if (req.http.If-None-Match) {
 return(pass); // DO NOT CACHE
 }

### Do not cache AJAX requests.
 if (req.http.X-Requested-With == "XMLHttpRequest") {
 return(pass); // DO NOT CACHE
 }

### Only cache GET or HEAD requests. This makes sure the POST (and OPTIONS) requests are always passed.
 if (req.method != "GET" && req.method != "HEAD") {
 return (pass); // DO NOT CACHE
 }

### Static files: Do not cache PDF, XML, ... files (=static & huge and no use caching them - in all Vary: variations!)
 if (req.url ~ "\.(doc|mp3|pdf|tif|tiff|xml)(\?.*|)$") {
 return(pass); // DO NOT CACHE
 }

# Unset the header for static files
 if (req.url ~ "\.(gif|jpg|jpeg|swf|ttf|css|js|flv|mp3|mp4|pdf|ico|png)(\?.*|)$") {
 unset req.http.cookie;
 set req.url = regsub(req.url, "\?.*$", "");
 }

if (req.url ~ "\?(utm_(campaign|medium|source|term)|adParams|client|cx|eid|fbid|feed|ref(id|src)?|v(er|iew))=") {
 set req.url = regsub(req.url, "\?.*$", "");
 }

if (req.url ~ "wp-(login|admin)" || req.url ~ "preview=true" || req.url ~ "xmlrpc.php") {
 return (pass);
 }

if (req.http.cookie) {
 # Google Analytics
 set req.http.Cookie = regsuball( req.http.Cookie, "(^|;\s*)(__utm[a-z]+)=([^;]*)", "");
 set req.http.Cookie = regsuball( req.http.Cookie, "(^|;\s*)(_ga)=([^;]*)", "");

# Quant Capital
 set req.http.Cookie = regsuball( req.http.Cookie, "(^|;\s*)(__qc[a-z]+)=([^;]*)", "");

# __gad __gads
 set req.http.Cookie = regsuball( req.http.Cookie, "(^|;\s*)(__gad[a-z]+)=([^;]*)", "");

# Google Cookie consent (client javascript cookie)
 set req.http.Cookie = regsuball( req.http.Cookie, "(^|;\s*)(displayCookieConsent)=([^;]*)", "");

# Other known Cookies: remove them (if found).
 set req.http.Cookie = regsuball( req.http.Cookie, "(^|;\s*)(__CT_Data)=([^;]*)", "");
 set req.http.Cookie = regsuball( req.http.Cookie, "(^|;\s*)(WRIgnore|WRUID)=([^;]*)", "");


 # PostAction: Remove (once and if found) a ";" prefix followed by 0..n whitespaces.
 # INFO \s* = 0..n whitespace characters
 set req.http.Cookie = regsub( req.http.Cookie, "^;\s*", "" );

# PostAction: Unset the header if it is empty or 0..n whitespaces.
 if ( req.http.cookie ~ "^\s*$" ) {
 unset req.http.Cookie;
 }
 }
}

sub vcl_backend_response {
 if ( (!(bereq.url ~ "(wp-(login|admin)|login)")) || (bereq.method == "GET") ) {
 //unset beresp.http.set-cookie;
 set beresp.ttl = 1h;
 }
 # Remove some headers we never want to see
 unset beresp.http.Server;
 unset beresp.http.X-Powered-By;

if (bereq.url ~ "\.(gif|jpg|jpeg|swf|ttf|css|js|flv|mp3|mp4|pdf|ico|png)(\?.*|)$") {
 unset beresp.http.cookie;
 set beresp.ttl = 365d;
 }

set beresp.ttl = 10s;
 set beresp.grace = 1h;
}

sub vcl_deliver {
 if (obj.hits > 0) {
 set resp.http.X-Cache = "HIT";
 } else {
 set resp.http.X-Cache = "MISS";
 }
}

Khởi động lại varnish

service varnish restart

Kiểm tra thử varnish đã sử dụng cổng 80 hay chưa.

[root@vps ~]# netstat -ntlup
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 15219/varnishd
tcp 0 0 127.0.0.1:6082 0.0.0.0:* LISTEN 15217/varnishd
tcp 0 0 0.0.0.0:6085 0.0.0.0:* LISTEN 15490/varnish-agent
tcp 0 0 :::80 :::* LISTEN 15219/varnishd

Bây giờ trỏ domain về server varnish là xong.

Rất đơn giản phải không.

Hướng dẫn cài đặt Varnish Agent

Tất nhiên trước hết bạn cần cài varnish như trên trước đã.

Xong chạy lệnh dưới để cài varnish agent

yum install varnish-agent

Khởi chạy varnish agent

service varnish-agent start

Cho varnish agent chạy khi reboot server.

chkconfig varnish-agent on

Vào trang quản lý của Varnish agent

IP-của-server-varnish:6085/html/

Khi được hỏi pass thì gõ lệnh này để cat user + pass

cat /etc/varnish/agent_secret

 

Tham khảo: https://hocvps.com