December 2014
Phan Nhật Chánh - Official website

Tạo trang báo lỗi Error 404 đẹp cho Blogger/Blogspot

   Dec 24, 2014   
Khi bạn truy cập vào một địa chỉ, một đường dẫn của một website hay một blog nào đó mà đường dẫn đó không còn tồn tại hoặc đả bị xóa thì bạn sẽ được đưa đến trang thông báo lỗi 404 Page Not Found, nó nhằm thông tin cho bạn rằng địa chỉ mà bạn đang truy cập hiện không còn tồn tại hoặc đả bị tác giả xóa. Nay xin chia sẽ cho bạn một giao diện thông báo lỗi 404 đơn giản và đẹp mắt cho blog khi bạn sử dụng blogspot
Huong dan tao trong bao loi 404 Page Not Found cho Blogger/Blogspot
Xem thêm: Blogger 404 Redirection - Chuyển hướng trang báo lỗi 404 cho Blogger
Nếu bạn thích giao diện thông báo lỗi 404 như trên, bạn có thể cài đặt nó cho blogspot của bạn bằng cách dưới đây.

- Có nhiều cách để tạo trang thông báo lỗi cho Blogspot, ở đây ta sử dụng biểu thức điều kiện trong blogspot để tạo, nó có cấu trúc đơn giản như sau:
<body>
<b:if cond='data:blog.pageType != "error_page"'>
//Thành phần chính Blog của bạn
</b:if>
<b:if cond='data:blog.pageType == "error_page"'>
//Nội dung thông báo lỗi 404 của bạn
</b:if>
</body>
Xem thêm: Hướng dẫn cách sử dụng Biểu thức điều kiện if- else trong Blogspot
- Bước 1: Chèn đoạn css dưới đây vào template của bạn bằng cách vào Mẫu >> Chỉnh sửa HTML và chèn nó sau </b:skin>
<b:if cond='data:blog.pageType == "error_page"'>
#error-page{background-color:#142D3A;position:fixed!important;position:absolute;text-align:center;top:0;right:0;bottom:0;left:0;z-index:99999}
#error-inner{margin:11% auto}
.box-404{position:relative;font-weight:bold;width:700px;height:210px;color:#fff;margin:0 auto;}
#error-inner h2{text-transform:uppercase;color:#fff;font-size:50px;margin:0 auto 20px;font-family:monospace;background-color:#34647E;margin:5px}
#error-inner h1{text-transform:uppercase;color:#FFB616;padding-top:10px}
#error-inner p{line-height:0.7em;font-size:15px;color:#999}
#social-icons li{float:left;width:147px;height:147px;margin:10px 6px 6px 0;padding:0 0 0 0;border-bottom:none;list-style:none}
#social-icons li a{line-height:1px;display:block}
#social-icons li a:hover img{-webkit-opacity:0.8;-moz-opacity:0.8;opacity:0.8}
#social-icons li a span{display:none!important}
</b:if>
- Bước 2: Sao chép mã dưới đây và đặt nó ngay dưới <body>
<b:if cond='data:blog.pageType != "error_page"'>
- Bước 3: Cuối cùng, copy đoạn HTML dưới đây và đặt nó trước thẻ đóng </body>
</b:if>
<b:if cond='data:blog.pageType == "error_page"'>
<div id='error-page'>
<div id='error-inner'>
<h2>404: KHÔNG TÌM THẤY TRANG</h2>
<h1>RẤT TIẾT, TRANG KHÔNG TÌM THẤY</h1>
<p>Trang bạn đang tìm không tồn tại, hoặc có thể đả bị xóa<br/><br/> Quay lại trang chủ <a expr:href='data:blog.homepageUrl' expr:title='data:blog.title'><data:blog.title/></a> hoặc liên hệ với tôi <a href="http://nhatchanh.info/p/contact-me.html" title="Liên hệ với tôi"><span style="color: blue;">tại đây</span></a></p>
<div class='box-404'>
<ul id='social-icons'>
<li class='rss-icon'><a href='http://feeds.feedburner.com/nhatchanh' target='_blank'><img height='147' src='https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCKcydxlYKhswfHdaTtHrWyeiAdNa-_JtrFCRtrpbD7rTvKQOl-y3rIRmABzCh2PJE2PPf-tvJrq4C9v22XNk5jyre-qkEdrIHq_fMvwuF7nQ057afgeyMqn5Y59EMR91UKDNrFAI7_aXY/s1600/rss.png' width='147'/></a></li>
<li class='twitter-icon'><a href='http://www.twitter.com/tv0656m006' target='_blank'><img height='147' src='https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8hFy9kbq-sOAGnDuUV3xRYbvYIgRR52bWqg3fTBjUYoYGq0mKV40MHiL7Jv9n7tkmt2qnHqO_6Y_oUHw5whYikTct7aO_6IpMeUStX__udKezYPgr-Y01tXaUj8sOTYfsb7ygKg7LipOa/s1600/twitter.png' width='147'/></a></li>
<li class='facebook-icon'><a href='http://www.facebook.com/pnchanh' target='_blank'><img height='147' src='https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzHLWAQxZRH-XnBkiVZGkuo-PG65aiVnbJfqqs4acX9mTvDKtTXhRda_fD681MKdtZ56Un2jLfY5Zi6H6nIc7VhQpnbOQzgZj-AtXjN-vf9Qp3q50a8zVSsSjc59hl-UCkMwUfzRUnvjMd/s1600/facebook.png' width='147'/></a></li>
<li class='google-icon'><a href='https://plus.google.com/113291429631989826321' target='_blank'><img height='147' src='https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNQ9RnrqORuZCO693Q6cFhD2vzYIc4cbgqoBXYW6eB-CBkTX7bb-6IELF3HHhShNaZdJY4DnYii5uD9CgXlWnEN7a5x00db2pJTqqEp5jZrTIMnje6VzNM1wUAboih7tQ0xWh9rRdO4BSy/s1600/google.png' width='147'/></a></li>
</ul>
</div>
</div></div>
</b:if>
Bước 4: Là bước khó khăn và quan trọng nhất là Lưu lại và kiểm tra kết quả :D Chúc thành công!

Kiểm tra kết quả bằng cách gõ vào thanh địa chỉ một đường dẫn không đúng
VD: http://địa-chỉ-blog-của-bạn/abcdefghizklmn và nếu xuất hiện trang báo lỗi 404 là bạn thành công

Google reCaptcha v2 - "Tôi không phải là người máy"

   Dec 16, 2014   
Google đã nâng cấp reCaptcha của họ thân thiện cho người dùng với một tag "Tôi không phải là người máy (I'm not a Robot)". Thông thường, với phiên bản củ bạn cần phải nhập các ký tự mã xác nhận loằng ngoằng, nhưng điều này sẽ được cải thiện ở phiên bản reCaptcha mới mà không cần phải sử dụng để nhập các ký tự xác nhận. Tuy nhiên, bạn cũng phải nhập các ký tự xác nhận nếu có sự nghi ngờ từ google.

Ví dụ đăng nhập cơ bản bằng PHP kết hợp reCaptcha

- Để bắt đầu, bạn cần phải đăng ký SiteKeySecretKey từ https://www.google.com/recaptcha
- Đăng ký:
Huong dan su dung Google reCaptcha v2 don gian bang PHP
Sau khi đăng ký, bạn sẽ nhận được Google Site KeyGoogle Secret Key

- Google Site Key: bạn sẽ  sử dụng mã này cho trang HTML

- Google Secret Key: mã này sẽ giúp trang web của bạn tiếp xúc với Google

- Tiếp theo, tạo một trang HTML đơn giản như sau index.html (thay đổi data-sitekey của riêng bạn)
<!DOCTYPE html>
<html lang="vi">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="">
<meta name="author" content="">
<title>Google reCaptcha v2 - Demo Login</title>
<link href="http://getbootstrap.com/dist/css/bootstrap.min.css" rel="stylesheet">
<link href="http://getbootstrap.com/examples/signin/signin.css" rel="stylesheet">
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->
</head>
<body>
<div class="container">
<form class="form-signin" role="form" action="validateform.php" method="POST">
<div id="status"></div>
<h2 class="form-signin-heading">Đăng nhập</h2>
<label for="inputEmail" class="sr-only">Username</label>
<input type="text" name="txtuser" id="inputEmail" value="" class="form-control" placeholder="Tên đăng nhập" required autofocus>
<label for="inputPassword" class="sr-only">Password</label>
<input type="password" name="txtpass" id="inputPassword" value="" class="form-control" placeholder="Mật khẩu" required>
<div class="g-recaptcha" data-sitekey="6LcnV_8SAAAAAGBwDp38k-tY1c9sugh27MJqPuO4"></div>
<button class="btn btn-lg btn-primary btn-block" type="submit" name="ok">Đăng nhập</button>
</form>
<div style=" text-align:center;font-size:12px;margin-top:20px"><span class="msg">Chú ý:</span> Tên đăng nhập: <strong>nhatchanh.info</strong> | Mật khẩu: <strong>admin</strong></div>
</div> <!-- /container -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="http://getbootstrap.com/dist/js/bootstrap.min.js"></script>
<script src="https://www.google.com/recaptcha/api.js" async defer></script>
</body>
</html>
Huong dan su dung Google reCaptcha v2 - Login don gian bang PHP

Nếu bạn muốn sử dụng theme dark và xác minh reCaptcha bằng Audio thì bạn thay đoạn <div>...</div> trên thành
<div class="g-recaptcha" 
data-sitekey="6LcnV_8SAAAAAGBwDp38k-tY1c9sugh27MJqPuO4" data-theme="dark" data-theme="dark" data-type="audio"></div>

- Tạo một trang validateform.php để kiểm tra các giá trị đầu vào: (thay đổi $secret_key của riêng bạn)
<?php
//@author = nhatchanh.info
require_once "recaptchalib.php";
// reCAPTCHA hỗ trợ hơn 40 ngôn ngữ, xem tại: https://developers.google.com/recaptcha/docs/language
$lang = "en";
// Phản ứng từ reCAPTCHA
$resp = null;
// Thông báo lỗi từ reCAPTCHA nếu có
$error = null;
$secret_key = "6LcnV_8SAAAAAJB-F7XM3l9JUQF3s8SrDxuTjN5E"; //Thay đổi secret_key của bạn - https://www.google.com/recaptcha/admin
$reCaptcha = new ReCaptcha($secret_key);

if(isset($_POST['ok'])){
if($_POST['txtuser'] != "nhatchanh.info"){
echo "<p style='color:#FF0000'>Tên đăng nhập không đúng.</p>";
}else{
$u=$_POST['txtuser'];
}
if($_POST['txtpass'] != "admin"){
echo "<p style='color:#FF0000'>Mật khẩu không đúng.</p>";
}else{
$p=$_POST['txtuser'];
}

if ($_POST["g-recaptcha-response"]) {
$resp = $reCaptcha->verifyResponse(
$_SERVER["REMOTE_ADDR"],
$_POST["g-recaptcha-response"]
);
//print_r($resp);
} else {
echo "<p style='color:#FF0000'>Bạn chưa xác nhận Recaptcha</p>";
}
if ($resp != null && $resp->success && $u && $p) {
echo "<p style='color:#0099FF'>Bạn đả đăng nhập thành công!</p>";
//Hiển thị thông tin khi đăng nhập thành công
echo "Tên đăng nhập: <a href='http://".$u."'>".$u."</a>";
}
}
?>
Chúc thành công!

HTML5 Canvas: Ajax Loading không sử dụng ảnh GIF

   Dec 14, 2014   
HTML5 Canvas Ajax Loader Animation hiển thị trong trình duyệt mà không cần bất kỳ hình ảnh đồ họa JPG, GIF nào
HTML5 Canvas Ajax Loading không sử dụng ảnh động GIF

Bắt buộc phải có đoạn này trước tài liệu HTML của bạn
<!doctype html>
Mã code:
<!doctype html>
<html><head>
<meta charset="utf-8" />
<title>HTML5 No Image AJax Loader</title>
</head>
<body>
<div id="container">
<div id="in"></div>
</div>


<script>
/*
* Sonic 0.1
* --
* https://github.com/jamespadolsey/Sonic
* --
* This program is free software. It comes without any warranty, to
* the extent permitted by applicable law. You can redistribute it
* and/or modify it under the terms of the Do What The Fuck You Want
* To Public License, Version 2, as published by Sam Hocevar. See
* http://sam.zoy.org/wtfpl/COPYING for more details. */

(function(){

var emptyFn = function(){};

function Sonic(d) {

this.data = d.path || d.data;
this.imageData = [];

this.multiplier = d.multiplier || 1;
this.padding = d.padding || 0;

this.fps = d.fps || 25;

this.stepsPerFrame = ~~d.stepsPerFrame || 1;
this.trailLength = d.trailLength || 1;
this.pointDistance = d.pointDistance || .05;

this.domClass = d.domClass || 'sonic';

this.fillColor = d.fillColor || '#FFF';
this.strokeColor = d.strokeColor || '#FFF';

this.stepMethod = typeof d.step == 'string' ?
stepMethods[d.step] :
d.step || stepMethods.square;

this._setup = d.setup || emptyFn;
this._teardown = d.teardown || emptyFn;
this._preStep = d.preStep || emptyFn;

this.width = d.width;
this.height = d.height;

this.fullWidth = this.width + 2*this.padding;
this.fullHeight = this.height + 2*this.padding;

this.domClass = d.domClass || 'sonic';

this.setup();

}

var argTypes = Sonic.argTypes = {
DIM: 1,
DEGREE: 2,
RADIUS: 3,
OTHER: 0
};

var argSignatures = Sonic.argSignatures = {
arc: [1, 1, 3, 2, 2, 0],
bezier: [1, 1, 1, 1, 1, 1, 1, 1],
line: [1,1,1,1]
};

var pathMethods = Sonic.pathMethods = {
bezier: function(t, p0x, p0y, p1x, p1y, c0x, c0y, c1x, c1y) {

t = 1-t;

var i = 1-t,
x = t*t,
y = i*i,
a = x*t,
b = 3 * x * i,
c = 3 * t * y,
d = y * i;

return [
a * p0x + b * c0x + c * c1x + d * p1x,
a * p0y + b * c0y + c * c1y + d * p1y
]

},
arc: function(t, cx, cy, radius, start, end) {

var point = (end - start) * t + start;

var ret = [
(Math.cos(point) * radius) + cx,
(Math.sin(point) * radius) + cy
];

ret.angle = point;
ret.t = t;

return ret;

},
line: function(t, sx, sy, ex, ey) {
return [
(ex - sx) * t + sx,
(ey - sy) * t + sy
]
}
};

var stepMethods = Sonic.stepMethods = {

square: function(point, i, f, color, alpha) {
this._.fillRect(point.x - 3, point.y - 3, 6, 6);
},

fader: function(point, i, f, color, alpha) {

this._.beginPath();

if (this._last) {
this._.moveTo(this._last.x, this._last.y);
}

this._.lineTo(point.x, point.y);
this._.closePath();
this._.stroke();

this._last = point;

}

}

Sonic.prototype = {
setup: function() {

var args,
type,
method,
value,
data = this.data;

this.canvas = document.createElement('canvas');
this._ = this.canvas.getContext('2d');

this.canvas.className = this.domClass;

this.canvas.height = this.fullHeight;
this.canvas.width = this.fullWidth;

this.points = [];

for (var i = -1, l = data.length; ++i < l;) {

args = data[i].slice(1);
method = data[i][0];

if (method in argSignatures) for (var a = -1, al = args.length; ++a < al;) {

type = argSignatures[method][a];
value = args[a];

switch (type) {
case argTypes.RADIUS:
value *= this.multiplier;
break;
case argTypes.DIM:
value *= this.multiplier;
value += this.padding;
break;
case argTypes.DEGREE:
value *= Math.PI/180;
break;
};

args[a] = value;

}

args.unshift(0);

for (var r, pd = this.pointDistance, t = pd; t <= 1; t += pd) {

// Avoid crap like 0.15000000000000002
t = Math.round(t*1/pd) / (1/pd);

args[0] = t;

r = pathMethods[method].apply(null, args);

this.points.push({
x: r[0],
y: r[1],
progress: t
});

}

}

this.frame = 0;
//this.prep(this.frame);

},

prep: function(frame) {

if (frame in this.imageData) {
return;
}

this._.clearRect(0, 0, this.fullWidth, this.fullHeight);

var points = this.points,
pointsLength = points.length,
pd = this.pointDistance,
point,
index,
frameD;

this._setup();

for (var i = -1, l = pointsLength*this.trailLength; ++i < l && !this.stopped;) {

index = frame + i;

point = points[index] || points[index - pointsLength];

if (!point) continue;

this.alpha = Math.round(1000*(i/(l-1)))/1000;

this._.globalAlpha = this.alpha;

this._.fillStyle = this.fillColor;
this._.strokeStyle = this.strokeColor;

frameD = frame/(this.points.length-1);
indexD = i/(l-1);

this._preStep(point, indexD, frameD);
this.stepMethod(point, indexD, frameD);

}

this._teardown();

this.imageData[frame] = (
this._.getImageData(0, 0, this.fullWidth, this.fullWidth)
);

return true;

},

draw: function() {

if (!this.prep(this.frame)) {

this._.clearRect(0, 0, this.fullWidth, this.fullWidth);

this._.putImageData(
this.imageData[this.frame],
0, 0
);

}

this.iterateFrame();

},

iterateFrame: function() {

this.frame += this.stepsPerFrame;

if (this.frame >= this.points.length) {
this.frame = 0;
}

},

play: function() {

this.stopped = false;

var hoc = this;

this.timer = setInterval(function(){
hoc.draw();
}, 1000 / this.fps);

},
stop: function() {

this.stopped = true;
this.timer && clearInterval(this.timer);

}
};

window.Sonic = Sonic;

}());

</script>
<script>

var loaders = [
{
width: 100,
height: 50,
padding: 10,

stepsPerFrame: 2,
trailLength: 1,
pointDistance: .03,

strokeColor: '#FF7B24',

step: 'fader',

multiplier: 2,

setup: function() {
this._.lineWidth = 5;
},

path: [

['arc', 10, 10, 10, -270, -90],
['bezier', 10, 0, 40, 20, 20, 0, 30, 20],
['arc', 40, 10, 10, 90, -90],
['bezier', 40, 0, 10, 20, 30, 0, 20, 20]
]
}
];


var html5_canvas_obj, container = document.getElementById('in');

function load_loader(){

//Created Sonic Object
html5_canvas_obj = new Sonic(loaders[0]);

//Append this Canvas to a DIV
container.appendChild(html5_canvas_obj.canvas);

//Let the Canvas Execute / Play
html5_canvas_obj.play();
}

//Call Ajax Loader Function
load_loader();
</script>
</body>
</html>
- Đoạn mã màu xanh là cần phải có
- Thay đoạn mã màu đỏ bằng 1 trong các kiểu dưới đây

Demo 1

var loaders = [
{
width: 100,
height: 50,
padding: 10,

stepsPerFrame: 2,
trailLength: 1,
pointDistance: .03,

strokeColor: '#FF7B24',

step: 'fader',

multiplier: 2,

setup: function() {
this._.lineWidth = 5;
},

path: [

['arc', 10, 10, 10, -270, -90],
['bezier', 10, 0, 40, 20, 20, 0, 30, 20],
['arc', 40, 10, 10, 90, -90],
['bezier', 40, 0, 10, 20, 30, 0, 20, 20]
]
}
];

Demo 2

var loaders = [
{
width: 100,
height: 100,

stepsPerFrame: 4,
trailLength: 1,
pointDistance: .01,
fps: 25,

fillColor: '#FF7B24',

setup: function() {
this._.lineWidth = 10;
},

step: function(point, i, f) {

var progress = point.progress,
degAngle = 360 * progress,
angle = Math.PI/180 * degAngle,
angleB = Math.PI/180 * (degAngle - 180),
size = i*5;

this._.fillRect(
Math.cos(angle) * 25 + (50-size/2),
Math.sin(angle) * 15 + (50-size/2),
size,
size
);

this._.fillStyle = '#63D3FF';

this._.fillRect(
Math.cos(angleB) * 15 + (50-size/2),
Math.sin(angleB) * 25 + (50-size/2),
size,
size
);

if (point.progress == 1) {

this._.globalAlpha = f < .5 ? 1-f : f;

this._.fillStyle = '#EEE';

this._.beginPath();
this._.arc(50, 50, 5, 0, 360, 0);
this._.closePath();
this._.fill();

}


},

path: [
['line', 40, 10, 60, 90]
]
}
];

Demo 3

var loaders = [
{
width: 100,
height: 100,

stepsPerFrame: 1,
trailLength: 1,
pointDistance: .025,

strokeColor: '#05E2FF',

fps: 20,

setup: function() {
this._.lineWidth = 2;
},
step: function(point, index) {

var cx = this.padding + 50,
cy = this.padding + 50,
_ = this._,
angle = (Math.PI/180) * (point.progress * 360);

this._.globalAlpha = Math.max(.5, this.alpha);

_.beginPath();
_.moveTo(point.x, point.y);
_.lineTo(
(Math.cos(angle) * 35) + cx,
(Math.sin(angle) * 35) + cy
);
_.closePath();
_.stroke();

_.beginPath();
_.moveTo(
(Math.cos(-angle) * 32) + cx,
(Math.sin(-angle) * 32) + cy
);
_.lineTo(
(Math.cos(-angle) * 27) + cx,
(Math.sin(-angle) * 27) + cy
);
_.closePath();
_.stroke();

},
path: [
['arc', 50, 50, 40, 0, 360]
]
}
];

Demo 4

var loaders = [
{
width: 100,
height: 50,

stepsPerFrame: 1,
trailLength: 1,
pointDistance: .1,
fps: 15,
padding: 10,
//step: 'fader',

fillColor: '#FF2E82',

setup: function() {
this._.lineWidth = 20;
},

path: [
['line', 0, 20, 100, 20],
['line', 100, 20, 0, 20]
]
}
];

Demo 5

var loaders = [
{
width: 100,
height: 100,

stepsPerFrame: 7,
trailLength: .7,
pointDistance: .01,
fps: 30,

setup: function() {
this._.lineWidth = 10;
},

path: [
['line', 20, 70, 50, 20],
['line', 50, 20, 80, 70],
['line', 80, 70, 20, 70]
]
}

];

Demo 6

var loaders = [
{
width: 100,
height: 100,

stepsPerFrame: 4,
trailLength: 1,
pointDistance: .01,
fps: 25,

fillColor: '#FF7B24',

setup: function() {
this._.lineWidth = 10;
},

step: function(point, i, f) {

var progress = point.progress,
degAngle = 360 * progress,
angle = Math.PI/180 * degAngle,
angleB = Math.PI/180 * (degAngle - 180),
size = i*5;

this._.fillRect(
Math.cos(angle) * 25 + (50-size/2),
Math.sin(angle) * 15 + (50-size/2),
size,
size
);

this._.fillStyle = '#63D3FF';

this._.fillRect(
Math.cos(angleB) * 15 + (50-size/2),
Math.sin(angleB) * 25 + (50-size/2),
size,
size
);

if (point.progress == 1) {

this._.globalAlpha = f < .5 ? 1-f : f;

this._.fillStyle = '#EEE';

this._.beginPath();
this._.arc(50, 50, 5, 0, 360, 0);
this._.closePath();
this._.fill();

}


},

path: [
['line', 40, 10, 60, 90]
]
}
];

Demo 7

var loaders = [
{
width: 100,
height: 100,

stepsPerFrame: 3,
trailLength: 1,
pointDistance: .01,
fps: 30,
step: 'fader',

strokeColor: '#D4FF00',

setup: function() {
this._.lineWidth = 6;
},

path: [
['arc', 50, 50, 20, 360, 0]
]
}
];

Demo 8

var loaders = [
{
width: 100,
height: 100,

stepsPerFrame: 1,
trailLength: 1,
pointDistance: .02,
fps: 30,

fillColor: '#05E2FF',

step: function(point, index) {

this._.beginPath();
this._.moveTo(point.x, point.y);
this._.arc(point.x, point.y, index * 7, 0, Math.PI*2, false);
this._.closePath();
this._.fill();

},

path: [
['arc', 50, 50, 30, 0, 360]
]
}
];

Demo 9

var loaders = [
{
width: 100,
height: 100,

stepsPerFrame: 1,
trailLength: 1,
pointDistance: .05,

strokeColor: '#FF2E82',

fps: 20,

setup: function() {
this._.lineWidth = 4;
},
step: function(point, index) {

var cx = this.padding + 50,
cy = this.padding + 50,
_ = this._,
angle = (Math.PI/180) * (point.progress * 360),
innerRadius = index === 1 ? 10 : 25;

_.beginPath();
_.moveTo(point.x, point.y);
_.lineTo(
(Math.cos(angle) * innerRadius) + cx,
(Math.sin(angle) * innerRadius) + cy
);
_.closePath();
_.stroke();

},
path: [
['arc', 50, 50, 40, 0, 360]
]
}
];

Tweet mở khóa nội dung ẩn sử dụng jQuery & Twitter API

   Dec 8, 2014   
Cũng giống như facebook, chia sẻ nội dung thông qua twitter là một trong những cách tuyệt vời để thúc đẩy lượng truy cập đến blog của bạn, góp phần tăng lưu lượng truy cập đến trang blog của bạn. Tương tự như bài chia sẽ Facebook để mở khóa nội dung Ẩn bằng cách sử dụng jQuery và Facebook API hôm nay xin chia sẽ cho bạn cách làm thế nào để tạo ra một Tweet đơn giản để mở khóa nội dung ẩn bằng cách sử dụng jQuery & Twitter API. với chức năng này sẽ cho phép đọc giả chia sẻ nội dung hay một thông điệp của bạn lên twitter và sau khi chia sẻ thành công, sẻ hiển thị nội dung ẩn mà bạn muốn chia sẻ cho họ.
Hướng dẫn tweet mở khóa nội dung ẩn sử dụng jQuery & Twitter API, tweet to unlock content using jquery

- Xem Demo dưới đây:
Xem thêm: Chia sẻ lên Facebook để mở khóa nội dung được ẩn sử dụng jQuery và Facebook API
- Bước 1: Thêm đoạn javascript dưới đây template của bạn (nên đặt trước thẻ </body>)
<script type="text/javascript" src="//platform.twitter.com/widgets.js"></script>
- Bước 2: Thêm doạn mã dưới đây vào template:
<script type="text/javascript">
twttr.events.bind(
'tweet',
function (event) {
var secret_data = "<center><strong>Nội dung cần hiển thị!</strong></center>";
jQuery("#results").html(secret_data);
}
);
</script>
Khai báo thư viện jQuery (nếu template của bạn chưa có thì paste nó sau thẻ </head>)
<script src='//ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js' />
- Bước 3: Đặt đoạn mã HTML dưới đây vào bất kỳ nơi nào trong trang của bạn. Có rất nhiều kiểu hiển thị nút tweet cho bạn, xem thêm tại: https://dev.twitter.com/web/tweet-button
<div id="results">
<a class="twitter-share-button" href="https://twitter.com/share"
data-via="tv0656m006" data-text="Chia sẻ thủ thuật Blogger/Blogspot,..." data-size="medium" data-url="http://nhatchanh.info" data-count="vertical">
Tweet</a>
</div>
Thay đổi các dữ liệu:
        data-via="địa chỉ tweet của bạn"
        data-text="mô tả về blog của bạn"
        data-url="địa chỉ trang blog của bạn"

Hy vọng tiện ích này sẻ làm bạn thích, Chúc thành công!

Responsive YouTube Embed

   Dec 6, 2014   
YouTube cho phép người dùng nhúng video vào trong trang web hay blog của chính họ. Tuy nhiên youtube không hỗ trợ chức năng responsive video khi ta sử dụng mã nhúng (Embed Code). Tức là những video đó sẽ không tự động thu nhỏ lại mỗi khi kích thước màn hình trình duyệt thay đổi. Và điều này thật sự sẽ gây khó khăn cho người dùng những thiết bị di động vốn dĩ có kích thước hiển thị nhỏ hơn rất nhiều so với máy tính để bàn hay laptop. Hôm nay, mình xin chia sẽ đến các bạn thủ thuật responsive youtube embed sử dụng css cho chúng ta nhúng nó vào web hay blog.

Huong dan Responsive YouTube Embed bang css

- Để được responsive khi chèn mã nhúng youtube vào blog chỉ cần copy mã CSS dưới đây vào template
.video-container {
position: relative;
padding-bottom: 56.25%;
padding-top: 30px; height: 0; overflow: hidden;
}
.video-container iframe,
.video-container object,
.video-container embed {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
- Sử dụng bằng cách thêm thẻ <div class="video-container">...</div> bao quanh mã nhúng, ví dụ:
<div class="video-container">
<iframe src="http://www.youtube.com/embed/dFVxGRekRSg" frameborder="0" width="560" height="315"></iframe>
</div>
Xem thêm: Responsive Plugin Comment Facebook

Responsive YouTube Demo



Nguồn: Internet