Sử dụng grunt

Grunt là 1 Javascript task runner. Tại sao phải dùng Javascript task runner? Vì ta cần automation code. Tức là khi làm việc trong 1 project, cứ mỗi sau khi sửa file sass, javascript… ta không thể nén file javascript (có hàng chục file), không thể ghép các file javascript lại với nhau (file nặng, ghép có thể gây ra lỗi)… Chỉ cần cài grunt vào, Grunt sẽ lo việc nén file, merge các file lại với nhau, ta không cần phải bận tâm vào việc đó mà chỉ cần tập trung vào build project sao cho tốt là được. Ngoài Grunt, bạn có thể chọn gulp để làm việc này. Nhìn chung bạn cần phải học cả grunt và gulp vì một số nơi dùng grunt, một số nơi dùng gulp, bạn sẽ dùng công nghệ nào tùy thuộc vào môi trường mà bạn làm việc.

Grunt

1) Update npm:

npm update -g npm

2) Install grunt CLI:

npm install -g grunt-cli

3) Tạo pakage.json:

{
  "name": "my-project",
  "version": "0.0.1",
  "devDependencies": {
    "grunt": "~0.4.5",
    "grunt-contrib-sass": "~0.9.2",
    "grunt-contrib-watch": "~0.6.1",
    "grunt-contrib-concat": "~0.5.1",
    "grunt-contrib-uglify": "~0.9.1"
  }
}

Continue reading Sử dụng grunt

PHP Mongodb query Embedded document

Do you know if we query by find function on embedded document, the result is “OR” condition? Example:

$cursorFrom = $collection->find(array(
    'messages.is_read'              => 0,
    'messages.is_sent_notify'       => 0
))->limit(1);

We can solve that problem by use “elemMatch” condition:

$cursorFrom = $collection->find(array(
	'messages' => array(
		'$elemMatch' => array(
			'is_read'              => 0,
			'is_sent_notify'       => 0
		)
	)
))->limit(1);

Cài redis trên php xampp 5.4


– Download extension tại:
http://windows.php.net/downloads/pecl/snaps/redis/2.2.5/
+ hoặc
http://windows.php.net/downloads/pecl/snaps/redis
– Download the redis64-latest.zip native 64bit Windows port of redis
https://raw.github.com/ServiceStack/redis-windows/master/downloads/redis64-latest.zip
– Extract redis64-latest.zip in any folder, e.g. in d:/xampp/redis64
– Run the redis-server.exe using the local configuration

cd d:/xampp/redis64
	redis-server.exe --service-install redis.windows.conf --loglevel verbose

– Start service:

redis-server --service-start

– Tạo service.bat có nội dung:

d:\xampp\redis64\redis-server --service-start

– Stop service:

redis-server --service-stop

– Uninstall service:

redis-server --service-uninstall

Giải pháp để fix production bugs bằng Git Stash

Giả sử trường hợp là project chúng ta đang làm ổn định. Và chúng ta đã đi được gần hết task, đùng 1 cái thì cấp trên báo rằng có bug trên live, nhờ ta fix. Vậy giải pháp lúc đó là như thế nào?

GIT

Đầu tiên bạn gọi:
git stash
# Lệnh này sẽ save lại những việc bạn đã làm trong task vừa qua và cất nó đi 1 nơi an toàn nào đó, đồng thời code se quay về thời điểm trước khi ta commit (tức là = với git reset –hard)

Sau đó bạn fix production bugs, và commit, sau đó up lên live luôn.

Sau khi done việc mà cấp trên báo, giờ là lúc bạn keep working những việc bạn đang làm dở dang. Lúc này bạn chỉ việc gọi:
git stash pop
# Lệnh này sẽ cut những file bạn đã change trước đó, và paste vào project của bạn(tương tự git pull trên server về). Việc còn lại là resolve những file bị conflict nếu có.

Tổng hợp lại git stash giống như là pause công việc của bạn lại, và sau đó git stash pop sẽ giúp bạn continue tiếp sau khi bạn pause.

Cannot connect Hope Speak?

Google Public DNS is a free, global Domain Name System (DNS) resolution service. Using that one will let you access our website in Vietnam if you could not.

It’s not so difficult to setup even without experience, but if you have some geek nearby ask her/him to change the settings. :)

Changing DNS server settings on Microsoft Windows 7:

1. Go the Control Panel.
2. Click Network and Internet, then Network and Sharing Center, then Manage network connections.
3. Select the connection for which you want to configure Google Public DNS. For example:
To change the settings for an Ethernet connection, right-click Local Area Connection, and click Properties.
To change the settings for a wireless connection, right-click Wireless Network Connection, and click Properties.
If you are prompted for an administrator password or confirmation, type the password or provide confirmation.
4. Select the Networking tab. Under This connection uses the following items, click Internet Protocol Version 4 (TCP/IPv4), and then click Properties.
5. Click Advanced and select the DNS tab. If there are any DNS server IP addresses listed there, write them down for future reference, and remove them from this window.
6. Click OK.
7. Select Use the following DNS server addresses. If there are any IP addresses listed in the Preferred DNS server or Alternate DNS server, write them down for future reference.
8. Replace those addresses with the IP addresses of the Google DNS servers: 8.8.8.8 and 8.8.4.4.
9. Restart the connection you selected in step 3.
10. Test that your setup is working correctly; see Testing your new settings below.
11. Repeat the procedure for additional network connections you want to change.

If you have trouble with this method, try replacing DNS servers with Open DNS project servers as follows:

208.67.222.222 (instead of 8.8.8.8)
208.67.220.220 (instead of 8.8.4.4)

Otherwise the instructions are same as above.

Hope Speak Team

Hope Speak – những trang đầu

Vậy là sau 1 quá trình dài, hôm nay mình cũng release được trang account của Hope Speak, nhìn chung thì giao diện cũng khá bắt mắt (theo ý mình) và mình khá tự hào về điều đó. Hi vọng website sẽ phát triển hơn nữa !!!

———

So after a long time, today I release Hope Speak account page. In general, the interface is quite stunning ( according to me), and I am pretty proud of that. Hopefully, the website will grow more !!!

———

Hope Speak account page
Hope Speak account page

View more on: https://www.hopespeak.com

Jquery sticky banner follow on scroll

[script language=”javascript”]
var $itemScript = $(‘.advertising-script-left-right’);
if ($itemScript.offset()) {
var stickyTop = [];
$itemScript.each(function (index) {
stickyTop.push($(this).offset().top);
});
$(window).scroll(function() {
var windowTop = $(window).scrollTop();
$itemScript.each(function (index) {
if (stickyTop[index] < windowTop) {
$(this).css({ position: 'fixed', top: 0 });
} else {
$(this).css('position', 'static');
}
});
});
}
[/script]

Building a Social Profile Widget: Get Your Follower Count

A feature that’s becoming more common with websites is the social media profile widget. The widget consists of icons and text that link to a number of social network profiles to which the website is associated. Some of these widgets also show the number of followers on each of their respective social network.

There are a lot of free and premium social profile widget plugins available for WordPress that one can use in linking to his/her personal or website social network’s profiles.

In this two-part series, I will show how to get the count of Facebook page Likes, Twitter and Google+ Followers, and how to build a social profile WordPress widget.

We’ll be focusing on Facebook, Twitter, and Google+ because they are three of the biggest social networks.

Read more at: tutplus

select2 3.* insert data without replace content

<li class="list-group-item" data-id-user="3"><span class="badge">+</span>Song Ph'"a'"m</li>
<input type="hidden" name="partners" value="" class="multiselect-partner" style="width:100%"/>
<script type="text/javascript">
window.dataPartners = [
{ id: 4, text: "Xuân Hồng" },
{ id: 5, text: "Văn Luyện" },
{ id: 6, text: "Sau Ngu" },
];
</script>
$(document).ready(function () {
    /**
     * select2 function
     */
    if ($().select2) {
        $(".multiselect-partner").select2({
            multiple: true,
            query: function (query){
                var data = {
                    results: window.dataPartners
                };
                query.callback(data);
            },
            dropdownCssClass: "multiple", // apply css that makes the dropdown taller
            escapeMarkup: function (m) { return m; } // we do not want to escape markup since we are displaying html in results
        });
		$newItem = $('.list-group-item');
		$newItem.on('click', function () {
			var isValid = true,
				$me = $(this),
				$fieldMultiselect = $('.multiselect-partner'),
				objectData = {
					id: $me.data('id-user'),
					text: $me.text().substr(1)
				};
			$.each(window.dataPartners, function (index, value) {
				if (value.id == $me.data('id-user')) {
					isValid = false;
					return false;
				}
			});
			if (isValid === true) {
				window.dataPartners.push(objectData); /* update list dataPartners */
				/**
				 * insert this user to group chat
				 */
				var data = $fieldMultiselect.select2('data');
				data.push(objectData);
				$fieldMultiselect.select2("data", data, true);
			}
			$me.remove();
		});
    }
});