Wednesday, April 15, 2015

Cách sử dụng Page Fragment Caching của plugin W3 Total Cache để load dữ liệu động

W3 Total Cache là plugin hữu dụng cho Wordpress để cải thiện tốc độ và hiệu năng của website. Tuy nhiên để có thể load dữ liệu tùy biến thì nhiều khi bạn sẽ gặp khó khăn, chẳng hạn như: bạn muốn hiển thị một thông tin ngẫu nhiên trên footer của website

Để làm được điều đó ta có thể sử dụng kĩ thuật Page Fragment Caching như sau:

1. Thêm định nghĩa sau trong file wp-config.php


define('W3TC_DYNAMIC_SECURITY', 'somesecurestring');

2. Với đoạn code PHP cần load động (không sử dụng tính năng cache của W3 Total Cache) ta hoặc sử dụng 1 trong các cách sau:

 

Cách 1:
<!-- mfunc somesecurestring any PHP code --><!-- /mfunc somesecurestring -->

Cách 2:
<!-- mfunc somesecurestring -->any PHP code<!-- /mfunc somesecurestring -->

Cách 3:
<!--MFUNC somesecurestring -->
echo rand();
<!--/mfunc somesecurestring -->

Lưu ý: 
- Mọi người hay nhầm lẫn việc sử dụng W3TC_DYNAMIC_SECURITY thay vì somesecurestring đứng sau mfunc.
- Nhớ xóa Page Cache để thay đổi có tác dụng nhé!

Nếu không được thì có thể bạn phải thêm mfunc trong mục Ignored comment stems của Minify setting như hình dưới


[Genesis] Hiển thị nội dung bên dưới bài viết theo danh mục

Chào mọi người, hôm nay mình có 1 nhiệm vụ chỉnh sửa cho 1 website sử dụng Genesis Wordpress. Cụ thể:

- Thêm vào cuối mỗi bài viết (Post) một khung quảng cáo nhỏ mà nội dung của nó được lấy từ dữ liệu của danh mục của bài viết.



Sau đây là cách làm của mình:

1. Thêm 3 trường mới vào category để khi tạo mới / hoặc chỉnh sửa thì có thể thay đổi:

- Ảnh quảng cáo: ad_img
- Tiêu đề quảng cáo: ad_title
- Đường dẫn bài quảng cáo: ad_url

Trong file functions.php của theme đang sử dụng cho website Wordpress, thêm đoạn code sau:

//add extra fields to category edit form hook
add_action ( 'edit_category_form_fields', 'extra_category_fields');
//add extra fields to category edit form callback function
function extra_category_fields( $tag ) {    //check for existing featured ID
    $t_id = $tag->term_id;
    $cat_meta = get_option( "category_$t_id");
?>

<tr class="form-field">
    <th scope="row" valign="top"><label for="Cat_meta[ad_img]"><?php _e('Ad Image Url'); ?></label></th>
    <td>
        <input type="text" name="Cat_meta[ad_img]" id="Cat_meta[ad_img]" size="40" value="<?php echo $cat_meta['ad_img'] ? $cat_meta['ad_img'] : ''; ?>"><br />
        <span class="description"><?php _e('The image is shown on post pages of this category'); ?></span>
    </td>
</tr>
<tr class="form-field">
    <th scope="row" valign="top"><label for="Cat_meta[ad_title]"><?php _e('Ad Title'); ?></label></th>
    <td>
        <input type="text" name="Cat_meta[ad_title]" id="Cat_meta[ad_title]" size="40" value="<?php echo $cat_meta['ad_title'] ? $cat_meta['ad_title'] : ''; ?>"><br />
        <span class="description"><?php _e('The Ad Title is used for the ad title on page posts of this category'); ?></span>
    </td>
</tr>
<tr class="form-field">
    <th scope="row" valign="top"><label for="Cat_meta[ad_url]"><?php _e('Ad Url'); ?></label></th>
    <td>
        <input type="text" name="Cat_meta[ad_url]" id="Cat_meta[ad_url]" size="40" value="<?php echo $cat_meta['ad_url'] ? $cat_meta['ad_url'] : ''; ?>"><br />
        <span class="description"><?php _e('The Ad Url is used for the adlink on page posts of this category'); ?></span>
    </td>
</tr>
<tr class="form-field">
    <th scope="row" valign="top"><label for="Cat_meta[ad_text]"><?php _e('Ad Text'); ?></label></th>
    <td>
        <textarea name="Cat_meta[ad_text]" id="Cat_meta[ad_text]" rows="5" cols="50" class="large-text"><?php echo $cat_meta['ad_text'] ? $cat_meta['ad_text'] : ''; ?></textarea><br />
        <span class="description"><?php _e('The Ad Text is used for the ad copy on page posts of this category'); ?></span>
    </td>
</tr>
<?php
}

// save extra category extra fields hook
add_action ( 'edited_category', 'save_extra_category_fileds');
   // save extra category extra fields callback function
function save_extra_category_fileds( $term_id ) {
    if ( isset( $_POST['Cat_meta'] ) ) {
        $t_id = $term_id;
        $cat_meta = get_option( "category_$t_id");
        $cat_keys = array_keys($_POST['Cat_meta']);
            foreach ($cat_keys as $key){
            if (isset($_POST['Cat_meta'][$key])){
                $cat_meta[$key] = $_POST['Cat_meta'][$key];
            }
        }
        //save the option array
        update_option( "category_$t_id", $cat_meta );
    }
}
2. Lấy dữ liệu meta của Category và hiển thị trong mỗi bài viết:

Thêm đoạn code cũng vào functions.php:

add_action( 'genesis_entry_footer', 'wpsites_after_post_widget', 5 );
function wpsites_after_post_widget() {
    if ( is_single() ) {
        /* genesis_widget_area( 'after-post', array(
            'before' => '<div class="after-post" class="widget-area">',
            'after'  => '</div>',
        ) ); */
        $categories = get_the_category();
        $output = '';
        if($categories){
            foreach($categories as $category) {$cat_data = get_option("category_$cat_id");
                $cat_data = get_option("category_{$category->term_id}");
                if (isset($cat_data['ad_title'])) { ?>
                    <section class="author-box" style="border: #0E4E81 2px dashed;"><?php if (!empty($cat_data['ad_img'])): ?><img src="<?=$cat_data['ad_img']?>" class="avatar avatar-70 photo" width="70" height="70" alt="<?=$cat_data['ad_title']?>"><?php endif?><a href="<?=$cat_data['ad_url']?>" title="<?=$cat_data['ad_title']?>"><h4 class="author-box-title"><?=$cat_data['ad_title']?></h4></a><div class="author-box-content"><?=$cat_data['ad_text']?></div><a href="<?=$cat_data['ad_url']?>" title="<?=$cat_data['ad_title']?>"><img src="http://example.com/wp-content/uploads/2015/04/xem-bai-thuoc-chua-khoi-benh-tri.jpg" alt="<?=$cat_data['ad_title']?>" style="padding-top: 20px;display: block;margin: 0 auto;"/></a></section>
            <?php }
            }
        }
    }
}
Phần html sử dụng bên trên bạn hoàn toàn có thể thay đổi tùy ý.

Bạn có cách làm nào khác không? Đừng ngại comment chia sẻ bên dưới cho mọi người và mình biết cách làm khác của bạn nhé!

Tuesday, April 14, 2015

Dùng GMAIL để nhận hoặc gửi thay cho một địa chỉ email khác

Chào các bạn,

Có lẽ chúng ta đều biết tới dịch thư điện tử của Google (Gmail), phải nói đây là dịch vụ miễn phí và rất chất lượng. Vì việc quen dùng Gmail mà nhiều khi chúng ta muốn sử dụng chính Gmail để gửi/nhận từ một địa chỉ email khác ví dụ email@example.com.

Để thực hiện được việc gửi/nhận đó đòi hỏi email@example.com được cài đặt trên mail server có hỗ trợ các giao thức IMAP, POP.

NKTGL sẽ hướng dẫn các bạn cài đặt từng bước một để có thể gửi/nhận email@example.com bên trong Gmail.

1. Đăng nhập Gmail, ấn nút Settings ở góc phải trên

Vào trang cài đặt của Gmail
 2. Chọn Account & Import


Trong trang này ta có thể thực hiện:
- Thêm & cài đặt địa chỉ email khác mà bạn muốn nhận thư gửi tới địa chỉ đó cũng vào trong Gmail.
- Thêm & cài đặt địa chỉ email khác mà bạn muốn gửi được thư từ địa chỉ đó qua tài khoản Gmail.

3. Thêm địa chỉ email để nhận trong Gmail (Add a POP3 mail account you own)

Nhập địa chỉ email rồi Next Step để chuyển sang bước tiếp theo

Nhập các thông tin email username, password, cấu hình server (cái này phải hỏi nhà cung cấp dịch vụ email hoặc admin hệ thống). Sau đó ấn Add Account.

Nếu thành công thì sẽ xuất hiện thêm dòng email mới đăng ký như hình dưới:


4. Thêm địa chỉ email để gửi qua tài khoản Gmail

Nhập địa chỉ email, rồi chuyển qua bước dưới

Nhập các thông số mà nhà cung cấp dịch vụ email hoặc admin hệ thống báo cho bạn
Sau khi ấn Add Account thành công, sẽ có 1 email được gửi tới địa chỉ email của bạn (trong ví dụ là: email@example.com). Để hoàn tất bạn quá trình cài đặt ta phải click vào đường dẫn trong nội dung thư đó. Sau khi thành công bạn sẽ được kết quả:


Khi gửi thư từ Gmail ta có thể lựa chọn



Nếu bạn có thắc mắc hay không hiểu rõ cách làm này đừng ngại comment bên dưới hoặc email trực tiếp cho mình nhé!

Thân mến!

Monday, April 13, 2015

Cách chặn các dải địa chỉ IP bằng file .htaccess

Một cách hiệu quả để chặn truy cập vào website đối với 1 dải IP, chẳng hạn như IP đến từ 1 quốc gia, là dùng file .htaccess.

Hãy xem ví dụ sau để biết cách sử dụng file .htaccess để chặn IP đến từ Trung Quốc,  India (IN), Bangladesh (BD) and Pakistan (PK), Philippines (PH)

order allow,deny
allow from all

# Get up-to-date list (in .htaccess format) from http://www.wizcrafts.net/chinese-blocklist.html
# China IP Address Blocks
deny from 1.80.0.0/13 1.92.0.0/14 1.192.0.0/13 1.202.0.0/15 1.204.0.0/14 14.144.0.0/12 14.208.0.0/12 23.80.54.0/24 23.104.141.0/24 23.105.14.0/24 27.8.0.0/13 27.16.0.0/12 27.36.0.0/14 27.40.0.0/13 27.50.128.0/17 27.54.192.0/18 27.106.128.0/18 27.115.0.0/17 27.148.0.0/14 27.152.0.0/13 27.184.0.0/13 36.32.0.0/14 36.248.0.0/14 42.96.128.0/17 42.120.0.0/15 58.16.0.0/15 58.20.0.0/16 58.21.0.0/16 58.22.0.0/15 58.34.0.0/16 58.37.0.0/16 58.38.0.0/16 58.40.0.0/16 58.42.0.0/16 58.44.0.0/14 58.48.0.0/13 58.56.0.0/15 58.58.0.0/16 58.59.0.0/17 58.60.0.0/14 58.68.128.0/17 58.82.0.0/15 58.100.0.0/15 58.208.0.0/12 58.242.0.0/15 58.246.0.0/15 58.248.0.0/13 59.32.0.0/12 59.51.0.0/16 59.52.0.0/14 59.56.0.0/13 59.72.0.0/16 59.108.0.0/15 59.172.0.0/14 60.0.0.0/13 60.11.0.0/16 60.12.0.0/16 60.24.0.0/13 60.160.0.0/11 60.194.0.0/15 60.208.0.0/13 60.216.0.0/15 60.220.0.0/14 61.4.64.0/20 61.4.80.0/22 61.4.176.0/20 61.48.0.0/13 61.128.0.0/10 61.135.0.0/16 61.136.0.0/18 61.139.0.0/16 61.145.73.208/28 61.147.0.0/16 61.150.0.0/16 61.152.0.0/16 61.154.0.0/16 61.160.0.0/16 61.162.0.0/15 61.164.0.0/16 61.175.0.0/16 61.177.0.0/16 61.179.0.0/16 61.183.0.0/16 61.184.0.0/16 61.185.219.232/29 61.187.0.0/16 61.188.0.0/16 61.232.0.0/14 61.236.0.0/15 61.240.0.0/14 101.64.0.0/13 101.72.0.0/14 101.76.0.0/15 101.80.0.0/12 103.253.4.0/22 106.112.0.0/13 110.6.0.0/15 110.51.0.0/16 110.52.0.0/15 110.80.0.0/13 110.88.0.0/14 110.96.0.0/11 110.173.0.0/19 110.173.32.0/20 110.173.64.0/18 110.192.0.0/11 110.240.0.0/12 111.0.0.0/10 111.72.0.0/13 111.121.0.0/16 111.128.0.0/11 111.160.0.0/13 111.172.0.0/14 111.176.0.0/13 111.228.0.0/14 112.0.0.0/10 112.64.0.0/14 112.80.0.0/12 112.100.0.0/14 112.111.0.0/16 112.122.0.0/15 112.224.0.0/11 113.0.0.0/13 113.8.0.0/15 113.12.0.0/14 113.16.0.0/15 113.18.0.0/16 113.62.0.0/15 113.64.0.0/10 113.128.0.0/15 113.136.0.0/13 113.194.0.0/15 113.204.0.0/14 114.28.0.0/16 114.80.0.0/12 114.96.0.0/13 114.104.0.0/14 114.112.0.0/14 112.109.128.0/17 114.216.0.0/13 114.224.0.0/11 115.24.0.0/15 115.28.0.0/15 115.32.0.0/14 115.48.0.0/12 115.84.0.0/18 115.100.0.0/15 115.148.0.0/14 115.152.0.0/15 115.168.0.0/14 115.212.0.0/16 115.230.0.0/16 115.236.96.0/23 115.236.136.0/22 115.239.228.0/22 116.1.0.0/16 116.2.0.0/15 116.4.0.0/14 116.8.0.0/14 116.16.0.0/12 116.52.0.0/14 116.76.0.0/15 116.90.80.0/20 116.112.0.0/14 116.128.0.0/10 116.204.0.0/15 116.208.0.0/14 116.224.0.0/12 116.254.128.0/18 117.8.0.0/13 117.21.0.0/16 117.22.0.0/15 117.24.0.0/13 117.32.0.0/13 117.40.0.0/14 117.44.0.0/15 117.79.224.0/20 117.80.0.0/12 117.136.0.0/13 118.26.0.0/16 118.72.0.0/13 118.112.0.0/13 118.120.0.0/14 118.132.0.0/14 118.144.0.0/14 118.180.0.0/14 118.186.0.0/15 118.192.0.0/16 118.248.0.0/13 119.0.0.0/13 119.8.0.0/16 119.10.0.0/17 119.18.192.0/20 119.36.0.0/16 119.57.0.0/16 119.60.0.0/16 119.88.0.0/14 119.96.0.0/13 119.112.0.0/13 119.120.0.0/13 119.128.0.0/12 119.144.0.0/14 119.164.0.0/14 119.176.0.0/12 119.233.0.0/16 120.0.0.0/12 120.24.0.0/14 120.32.0.0/13 120.40.0.0/14 120.68.0.0/14 120.80.0.0/13 120.192.0.0/10 121.0.16.0/20 121.8.0.0/13 121.16.0.0/12 121.32.0.0/14 121.60.0.0/14 121.76.0.0/15 121.196.0.0/14 121.204.0.0/14 121.224.0.0/12 122.10.128.0/17 122.51.128.0/17 122.64.0.0/11 122.119.0.0/16 122.136.0.0/13 122.156.0.0/14 122.188.0.0/14 122.192.0.0/14 122.198.0.0/16 122.200.64.0/18 122.224.0.0/12 123.4.0.0/14 123.8.0.0/13 123.52.0.0/14 123.64.0.0/11 123.97.128.0/17 123.100.0.0/19 123.112.0.0/12 123.128.0.0/13 123.138.0.0/15 123.150.0.0/15 123.152.0.0/13 123.164.0.0/14 123.180.0.0/14 123.184.0.0/14 123.196.0.0/15 123.232.0.0/14 123.249.0.0/16 124.42.64.0/18 124.64.0.0/15 124.67.0.0/16 124.73.0.0/16 124.114.0.0/15 124.126.0.0/15 124.128.0.0/13 124.160.0.0/15 124.162.0.0/16 124.163.0.0/16 124.192.0.0/15 124.200.0.0/13 124.226.0.0/15 124.228.0.0/14 124.236.0.0/14 124.240.0.0/17 124.240.128.0/18 124.248.0.0/17 125.36.0.0/14 125.40.0.0/13 125.64.0.0/12 125.79.0.0/16 125.80.0.0/13 125.88.0.0/13 125.104.0.0/13 125.112.0.0/12 125.210.0.0/15 140.224.0.0/16 140.237.0.0/16 140.246.0.0/16 140.249.0.0/16 159.226.0.0/16 171.34.0.0/15 171.36.0.0/14 171.40.0.0/13 175.0.0.0/12 175.16.0.0/13 175.24.0.0/14 175.30.0.0/15 175.42.0.0/15 175.44.0.0/16 175.46.0.0/15 175.48.0.0/12 175.64.0.0/11 175.102.0.0/16 175.106.128.0/17 175.146.0.0/15 175.148.0.0/14 175.152.0.0/14 175.160.0.0/12 175.178.0.0/16 175.184.128.0/18 175.185.0.0/16 175.186.0.0/15 175.188.0.0/14 180.76.0.0/16 180.96.0.0/11 180.136.0.0/13 180.152.0.0/13 180.208.0.0/15 182.18.0.0/17 182.32.0.0/12 182.88.0.0/14 182.112.0.0/12 182.128.0.0/12 183.0.0.0/10 183.64.0.0/13 183.129.0.0/16 183.148.0.0/16 183.160.0.0/12 183.184.0.0/13 183.192.0.0/11 192.34.109.224/28 192.74.224.0/19 198.2.203.64/28 198.2.212.160/28 202.43.144.0/22 202.46.32.0/19 202.66.0.0/16 202.75.208.0/20 202.96.0.0/12 202.111.160.0/19 202.112.0.0/14 202.117.0.0/16 202.165.176.0/20 202.196.80.0/20 203.69.0.0/16 203.86.0.0/18 203.86.64.0/19 203.93.0.0/16 203.169.160.0/19 203.171.224.0/20 210.5.0.0/19 210.14.128.0/19 210.21.0.0/16 210.32.0.0/14 210.51.0.0/16 210.52.0.0/15 210.77.0.0/16 210.192.96.0/19 211.76.96.0/20 211.78.208.0/20 211.86.144.0/20 211.90.0.0/15 211.92.0.0/14 211.96.0.0/13 211.136.0.0/13 211.144.12.0/22 211.144.96.0/19 211.144.160.0/20 211.147.0.0/16 211.152.14.0/24 211.154.64.0/19 211.154.128.0/19 211.155.24.0/22 211.157.32.0/19 211.160.0.0/13 211.233.70.0/24 218.0.0.0/11 218.56.0.0/13 218.64.0.0/11 218.84.0.0/14 218.88.0.0/13 218.96.0.0/14 218.102.0.0/16 218.104.0.0/14 218.108.0.0/15 218.194.80.0/20 218.200.0.0/13 218.240.0.0/13 219.128.0.0/11 219.154.0.0/15 219.223.192.0/18 219.232.0.0/16 219.234.80.0/20 219.235.0.0/16 220.112.0.0/16 220.154.0.0/15 220.160.0.0/11 220.181.0.0/16 220.191.0.0/16 220.192.0.0/12 220.228.70.0/24 220.242.0.0/15 220.248.0.0/14 220.250.0.0/19 220.252.0.0/16 221.0.0.0/12 221.122.0.0/15 221.176.0.0/13 221.192.0.0/14 221.200.0.0/14 221.204.0.0/15 221.206.0.0/16 221.207.0.0/16 221.208.0.0/12 221.212.0.0/15 221.214.0.0/15 221.216.0.0/13 221.224.0.0/13 221.228.0.0/14 221.232.0.0/13 222.32.0.0/11 222.64.0.0/12 222.80.0.0/12 222.132.0.0/14 222.136.0.0/13 222.168.0.0/13 222.172.222.0/24 222.176.0.0/13 222.184.0.0/13 222.200.0.0/16 222.208.0.0/13 222.219.0.0/16 222.220.0.0/15 222.240.0.0/13 223.4.0.0/14 223.64.0.0/11 223.144.0.0/12 223.240.0.0/13

# India (IN), Bangladesh (BD) and Pakistan (PK)
deny from 14.96.0.0/14 14.139.0.0/16 14.194.0.0/15 27.248.0.0/14 27.255.0.0/18 27.255.128.0/24 39.32.0.0/11 49.15.0.0/18 49.200.0.0/14 49.248.0.0/17 59.88.0.0/13 59.96.0.0/14 59.160.0.0/14 59.164.0.0/15 9.176.0.0/13 59.184.0.0/15 61.247.238.0/24 101.56.0.0/13 112.110.0.0/16 113.19.0.0/16 113.212.64.0/19 114.31.224.0/20 115.108.0.0/14 115.167.24.0/24 115.240.0.0/12 116.72.0.0/14 116.202.12.0/22 116.203.0.0/16 117.192.0.0/10 119.152.0.0/13 119.160.0.0/17 120.56.0.0/13 120.138.98.0/24 121.240.0.0/13 122.160.0.0/12 122.176.0.0/13 122.184.0.0/14 123.49.0.0/18 123.236.0.0/14 124.124.0.0/15 124.247.235.0/24 124.253.8.0/21 125.209.64.0/18 139.190.0.0/16 171.48.0.0/12 180.215.0.0/16 182.64.0.0/12 182.176.0.0/12 183.82.0.0/15 193.53.87.0/24 202.54.0.0/16 202.63.160.0/19 202.87.240.0/20 202.137.232.0/21 202.154.224.0/24 203.76.176.0/20 203.92.47.0/24 203.115.80.0/20 203.135.62.0/24 203.188.247.0/24 203.192.231.0/24 203.197.0.0/16 206.214.208.0/20 210.211.128.0/17 210.212.64.0/20 218.248.0.0/20 223.130.4.0/22

# Philippines (PH)
deny from 27.110.144.0/20 37.0.120.0/21 85.92.152.0/21 110.5.64.0/21 111.235.80.0/20 112.201.128.0/17 112.202.0.0/16 120.28.64.0/18 122.54.125.73 125.60.128.0/17 125.212.52.0/22 125.212.56.0/22 180.193.64.0/19 202.52.54.0/23 202.133.192.0/24 202.146.184.0/23 222.127.32.0/19 222.127.64.0/19

[PHP] Cách kiểm tra địa chỉ IP có đến từ Việt Nam hay không?

Để xác định quốc gia của một địa chỉ IP truy cập website ta có thể sử dụng GeoLite2 (Tham khảo thêm tại: http://dev.maxmind.com/geoip/geoip2/geolite2/). Mặc dù dữ liệu GeoLite2 ít chính xác hơn so với dữ liệu GeoIP2 của MaxMind nhưng nó lại là miễn phí và vẫn được cập nhật thường xuyên vào các ngày thứ ba đầu tiên hàng tháng.

GeoLite2 không được MaxMind hỗ trợ tuy nhiên chúng ta có thể tìm thấy nhiều tài liệu, bài viết hướng dẫn sử dụng, gỡ rối trên mạng.

Lưu ý: GeoLite2 được phân phối theo License: Creative Commons Attribution-ShareAlike 3.0 Unported License.

Sử dụng GeoLite2 với ngôn ngữ PHP ta có thể sử dụng MaxMind-DB-Reader: https://github.com/maxmind/MaxMind-DB-Reader-php/tree/master/src/MaxMind/Db. Bạn có thể dùng file tôi đã sắp xếp theo thư mục và có 1 wrapper để gọi đơn giản liên kết sau:

https://drive.google.com/file/d/0B7AGuhjjjSK5b0N2T05RZ2hsVGc/view?usp=sharing

Cách sử dụng ví dụ trong 1 function PHP như sau:

function is_in_vietnam() {
    require_once 'duong_dan_toi_file_GeoLite2Helper.php';
    $helper = new GeoLite2Helper();
    return $helper->checkIpFromVietnam() === "VN";
}

Nếu bạn không thể sử dụng được hoặc muốn trao đổi thêm đừng ngần ngại comment hoặc email cho NKTGL.

Sunday, April 12, 2015

Cách khắc phục lỗi không khởi động được máy ảo dùng Windows Virtual PC

Cách khắc phục lỗi không khởi động được máy ảo dùng Windows Virtual PC
Khi tạo một máy ảo mới dùng Windows Virtual PC bạn có thể sẽ gặp phải lỗi sau:
banner3
Figure 1: Lỗi khi cài đặt máy ảo, source: http://www.howtogeek.com/
Nguyên nhân là do thứ tự khởi động cài đặt cho máy ảo thì ổ cứng ảo được khởi động đầu tiên, tuy nhiên bạn chưa cài đặt hệ điều hành nào trên ổ cứng này. Cách khắc phục như thế nào?
THAY ĐỔI THỨ TỰ KHỞI ĐỘNG CỦA MÁY ẢO
Ấn Ctrl + Alt + Del, như hình bên dưới
vpc_error2
Figure 2: Khởi động lại bằng cách ấn Ctrl+Alt+Del, source: http://www.howtogeek.com/
Máy ảo sẽ khởi động lại, nhanh tay ấn phím DEL (nếu không được, có thể là phím ESC hoặc F2) cho tới khi vào màn hình BIOS của máy ảo như bên dưới:
vpc_bios4
Figure 3: Ấn DEL để vào cài đặt BIOS, source: http://www.howtogeek.com/
Trong BIOS ảo, chọn Boot Device Priority trong mục Boot, sau đó lựa chọn thứ tự khởi động đúng. Ví dụ bạn đang muốn cài đặt hệ điều hành mới từ file ISO (dùng ổ CDROM/DVD ảo) thì chọn thứ tự khởi động đầu tiên là CDROM.
vpc_error4
Figure 4: Chọn thứ tự khởi động đúng cho máy ảo, Source: http://www.howtogeek.com/
Nhớ lưu lại bằng cách ấn F10, rồi OK
vpc_bios7
Figure 5: Lưu lại cài đặt và khởi động lại, Source: http://www.howtogeek.com/
Máy ảo sẽ khởi động lại và bạn có thể tiến hành cài đặt bình thường.

Tuesday, April 7, 2015

Tắt thông báo bản cập nhật mới của Wordpress và Plugin

Với các website xây dựng từ Wordpress, mỗi khi có phiên bản mới của Wordpress hoặc các Plugin đang sử dụng thì bạn sẽ nhận được các dạng thông báo như hình dưới đây:

Minh họa thông báo cập nhật của Wordpress & Plugin, source: wpoptimus.com
Nhiều khi những thông báo này khiến bạn khó chịu hay "ngứa mắt" và bạn muốn tắt chúng đi. Như vậy thì phải làm sao?

Dưới đây là một số cách bạn có thể tham khảo để thực hiện được "mong muốn" trên:

1. Viết thêm code trong theme hoặc plugin

Thêm đoạn mã sau vào theme hay plugin của bạn sẽ loại bỏ các thông báo cập nhật phiên bản mới, cài đặt mới của Wordpress

add_action('after_setup_theme','remove_core_updates');
function remove_core_updates()
{
 if(! current_user_can('update_core')){return;}
 add_action('init', create_function('$a',"remove_action( 'init', 'wp_version_check' );"),2);
 add_filter('pre_option_update_core','__return_null');
 add_filter('pre_site_transient_update_core','__return_null');
}

Thêm đoạn mã sau để loại bỏ hoàn toàn thông báo cập nhật của Plugin

remove_action('load-update-core.php','wp_update_plugins');
add_filter('pre_site_transient_update_plugins','__return_null');

Đoạn mã dưới sẽ loại bỏ toàn bộ các thông báo cập nhật bất kể của Wordpress Core, plugin hay theme

function remove_core_updates(){
global $wp_version;return(object) array('last_checked'=> time(),'version_checked'=> $wp_version,);
}
add_filter('pre_site_transient_update_core','remove_core_updates');
add_filter('pre_site_transient_update_plugins','remove_core_updates');
add_filter('pre_site_transient_update_themes','remove_core_updates');

Để tắt thông báo của chỉ 1 plugin cụ thể thì thêm vào plugin đó đoạn code sau:

function filter_plugin_updates( $value ) {
unset( $value->response['plugin_name/plugin_name.php'] );
return $value;
}
add_filter( 'site_transient_update_plugins', 'filter_plugin_updates' );

Trong đó plugin_name/plugin_name.php ta thay tương ứng với plugin đó. Ví dụ: better-wp-security/better-wp-security.php ứng với plugin Better Wordpress Security.

2. Sử dụng Plugin

Chúng ta có thể sử dụng các Plugin sẵn có để thực hiện việc bỏ thông báo cập nhật:
- Disable All WordPress Updates
- Disable WordPress Core Updates
- Disable WordPress Plugin Updates
- Disable WordPress Theme Updates

Bài viết tổng hợp từ Internet, nguồn: http://www.wpoptimus.com/626/7-ways-disable-update-wordpress-notifications/

Sunday, April 5, 2015

2 cách vô hiệu hóa plugin đã được kích hoạt trong Wordpress

Các bạn Blogger, Webmaster, Lập Trình Viên thân mến, đã bao giờ các bạn gặp phải tình huống sau khi cài đặt hay nâng cấp một plugin của Wordpress thì website bị lỗi thậm chí không vào được admin để sửa vì bị lỗi?

Ảnh minh họa website bị lỗi sau khi cài đặt plugin

KHI BỊ NHƯ VẬY THÌ TA PHẢI LÀM SAO?
Bạn hãy bình tĩnh đừng vội xóa hết đi và cài lại website. Có hai cách đơn giản có thể xử lý trường hợp này như sau:

Cách 1: Đổi tên hoặc xóa bỏ thư mục plugin gây ra lỗi

Trong Wordpress thông thường thì các plugins được lưu trong thư mục webroot/wp-content/plugins, từng plugin lưu thành 1 thư mục (có thể là 1 file php) riêng.

Ảnh minh họa thư mục chứa các plugins trong Wordpress
Sau khi đổi tên hay xóa thư mục thì plugin gây lỗi tương ứng sẽ tự động bị vô hiệu hóa. 

Lưu ý rằng nếu ta đổi tên thư mục plugin trở lại thì nó cũng sẽ không tự động được kích hoạt lại đâu nhé!

Cách 2: Gỡ bỏ plugin lỗi trong DATABASE

Vào sửa trực tiếp trong cơ sở dữ liệu (nếu hosting/server có hỗ trợ PhpMyAdmin, sxd hay Adminer... có thể sử dụng thay cho console).

Ảnh minh họa cấu trúc dữ liệu mặc định của 1 website wordpress
Trong bảng wp_options (wp_ là tiền tố của bảng dữ liệu cho website Wordpress, nếu bạn đã thay đổi tiền tố này thì phải lưu ý dùng đúng), chọn dòng có option_name là active_plugins:

SELECT * FROM wp_options WHERE option_name = 'active_plugins'

Ảnh mình họa option 'active_plugins'
Nếu muốn vô hiệu hóa toàn bộ plugins đang sử dụng thì chỉ cần xóa option này khỏi bảng wp_options. Nếu bạn muốn xóa 1 plugin nào đang active thì xóa dòng tương ứng với plugin đó trong option_value của 'active_plugins'. Sau khi xóa thì phải giảm index cho toàn bộ các plugin xếp sau trong giá trị option_value.

Ảnh minh họa xóa giá trị của option_value ứng với 'active_plugins'
Trên đây là 2 cách để vô hiệu hóa một hoặc nhiều plugin sử dụng trong Wordpress. Nếu bạn còn cách nào khác muốn chia sẻ đừng ngần ngại post lên trong comment hoặc email cho NKTGL nhé!

Monday, March 30, 2015

Dùng Skype có an toàn không? Có bị đọc trộm nội dung các đoạn chat không?

Chào bạn,

Phần mềm Skype đang được dùng rất phổ biến trong các công ty vì những tính năng hữu ích cũng như chất lượng mà nó mang lại. Tuy nhiên không phải ai cũng biết cách sử dụng Skype sao cho an toàn.

Bạn có biết nếu có file log (tự động ghi lại lịch sử sử dụng Skype), người ta có thể đọc được toàn bộ nội dung các cuộc trao đổi của bạn?

Chỉ cần lên Google và tìm kiếm với từ khóa: "đọc lịch sử chat Skype" hay "đọc chat Skype", các bạn sẽ thấy không ít phần mềm, hướng dẫn để thực hiện điều đó. Bản thân người viết bài này cũng đã sử dụng phần mềm Skype Logs View / Reader để đọc log Skype trên máy tính của mình.

Minh họa phần mềm đọc log của Skype (Source: nirsoft.net)
Do vậy nếu bạn không phải là người duy nhất sử dụng máy tính của mình, dùng máy của công ty hay người khác có thể truy cập vào đọc file lưu trên máy bạn thì tốt nhất hãy tắt bỏ chức năng lưu lại lịch sử chat của Skype. Cách thực hiện như sau:

1. Mở tùy chọn của phần mềm Skype: Tools -> Options

Mở cài đặt tùy chọn của Skype, source: guidingtech.com

2. Chọn Privacy settings, rồi Clear History để xóa lịch sử chát đã lưu

Xóa lịch sử đã lưu, source: guidingtech.com
3. Tắt tính năng lưu lại lịch sử chat

Tắt bỏ tính năng lưu lịch sử chat, source: guidingtech.com
Cách xóa bỏ lịch sử chát và tắt tính năng lưu lại lịch sử chat chỉ là một trong rất nhiều các thói quen sử dụng phần mềm một cách an toàn mà chúng ta nên biết và thực hiện. Hãy rèn cho mình các thói quen để bảo vệ thông tin và giữ các dữ liệu cá nhân được an toàn!

Sunday, March 22, 2015

Cách xử lý lỗi không edit (chỉnh sửa) được bài viết note trên Facebook

Chào bạn, nếu bạn viết note trên Facebook mà sau đó không chỉnh sửa được thì có thể là do vấn đề tương thích giữa hệ điều hành và trình duyệt (ví dụ: trình duyệt Chrome, IE trên Windows 8.1 sẽ bị lỗi này).

Cách xử lý trường hợp không edit được bài viết note trên Facebook này như thế nào?

Bạn hãy thử làm theo một số cách sau:

Cách 1: Dùng trình duyệt khác như Firefox (https://www.mozilla.org/en-US/firefox/new/).

Cách 2: Thay thế "www" ở đầu đường dẫn bằng "m" (dùng cho thiết bị di dộng) cụ thể đường dẫn để sửa sẽ là:

https://m.facebook.com/editnote.php

Cách 3: Nếu bạn đang dùng Chrome với Windows 8 thì hãy thử làm theo hướng dẫn sau:

https://www.facebook.com/notes/monica-ramos-brain-coach-and-social-media-trainer/having-trouble-editing-facebook-docs-in-chrome/441884955950713

Nếu làm theo các cách trên mà vẫn không khắc phục được bạn hãy để lại comment hoặc email cho mình minh.ngog at Gmail.com.

Chúc bạn thành công!


Sunday, March 15, 2015

Công cụ chỉnh sửa ảnh Paint.net gọn nhẹ cho ai không có máy cấu hình mạnh

Bài viết này dành cho các bạn đang dùng hệ điều hành Windows thôi nhé!

Đôi khi những chức năng cơ bản mà công cụ Microsoft paint đi kèm theo HĐH Windows không đáp ứng được yêu cầu chỉnh sửa ảnh nên chúng ta phải tìm những công cụ khác thay thế như: Photoshop, GIMP, Microsoft Photo Edior, Paint.net... Trong đó Paint.net được đánh giá là ứng dụng gọn nhẹ mà vẫn thỏa mãn nhiều yêu cầu chỉnh sửa ảnh chuyên nghiệp, hơn nữa Paint.net lại hoàn toàn MIỄN PHÍ nên chúng ta có thể sử dụng mà không hề lo lắng tới chuyện bản quyền.

Cá nhân NKTGL đã từng sử dụng 3 phần mềm chỉnh sửa ảnh Photoshop, GIMP và Paint.net. Cho tới hiện nay hầu như mình chỉ còn sử dụng Paint.net (có cài thêm 1 số plugins - chia sẻ trên cộng đồng) để thực hiện việc chỉnh sửa ảnh và hài lòng với hiệu quả nó mạng lại được.

Nếu bạn đang cần tìm phần mềm sửa ảnh hãy thử trải nghiệm với Paint.net nhé!

Tới thời điểm khi NKTGL viết bài này thì phiên bản mới nhất của Paint.net là 4.0.5, phiên bản ứng dụng này cần chạy trên HĐH Windows 7 SP1 hoặc mới hơn. Về yêu cầu phần cứng:
  • CPU tối thiểu 1GHz (nên dùng Dual Core)
  • RAM tối thiểu 1GB
Paint.net 4.0.5 cần chạy trên Microsoft.net Framework 4.5 (sẽ được tự động cài đặt nếu máy tính chưa cài sẵn).

LINK tải phiên bản mới nhất: http://www.getpaint.net/download.html
LINK tải plugin hỗ trợ tạo các hiệu ứng: http://forums.getpaint.net/index.php?/forum/7-plugins-publishing-only/

Tùy chỉnh hiển thị ngày theo định dạng Việt Nam trên Google Spreadsheets

Trong trường hợp Google Spreadsheets hiển thị ngày theo định dạng không đúng các bạn có thể thay đổi thành định dạng của Việt Nam ta hay sử dụng bằng cách:

1. Bôi đen lựa chọn các dữ liệu đang hiển thị không đúng.
2. Chọn Format -> Number -> More Formats -> More date and time formats...

Trong hộp thoại hiện ra sau đó bạn có thể lựa chọn định dạng phù hợp bên dưới ô lựa chọn hoặc ấn vào hình tam giác nhỏ quay xuống dưới để lựa chọn các thành phần hiển thị lần lượt. Xem hình minh hoa bên dưới:



3. Sau khi lựa chọn xong định dạng hiển thị, bạn ấn Apply để áp dụng cho tài liệu đang làm.

Chúc bạn thành công!

Hướng dẫn sử dụng Condition Format trong Google SpreadSheet

Google SpreadSheets là công cụ hữu ích cho việc tính toán, lưu trữ dữ liệu tương tự dùng Microsoft Excel, nhưng lại được thực hiện hoàn toàn trên nền web, nghĩa là để sử dụng bạn không cần một máy tính có cài đặt sẵn Microsoft Office mà chỉ cần máy có kết nối mạng, 1 tài khoản Google và thực hiện qua trình duyệt web.

Khi sử dụng Google SpreadSheets có tính năng khá hữu dụng là Condition Format (cũng tương tự như Excel) cho phép chúng ta thiết lập định dạng hiển thị dữ liệu theo các điều kiện. Ví dụ: Đổi màu nền của dòng dữ liệu nếu cột trạng thái là "Hoàn tất" như hình minh họa dưới đây.


Để thiết lập như trên ta vào menu: Format -> Condition formatting... Rồi cài đặt như hình bên dưới:

Lưu ý ở đây tôi dùng điều kiện là hàm tùy biến, các bạn có thể lựa chọn và dùng các điều kiện thích hợp với yêu cầu riêng của mình. 

Nếu có bạn nào sau khi đọc xong hướng dẫn này mà vẫn không làm được, vui lòng comment bên dưới bài viết tôi sẽ trả lời hướng dẫn từng trường hợp cụ thể.

Đừng quên các bạn có thể liên hệ với tôi qua email: minh.ngog@gmail.com khi cần nhé!