2011年11月

javascript杂记

合并两个数组

var a = [1, 2],
    b = [3, 4];
console.log(a.concat(b))

IE6,7 innerHtml未知的运行时错误

HTML错误的嵌套例如在p里嵌套div那修改div的innerHTML属性也会出现错误

ajax发送数据时的特殊符号

% & + 编码这几个符号


% %25
+ %2B
& %26

或者:encodeURIComponent

页面跳转

// 类似于HTTP跳转,浏览器无当前页面的历史记录
window.location.replace("http://type.so");

// 浏览器有历史记录
window.location.href = "http://type.so";

变量的作用域

php的变量作用范围

$str = 'something';
function infunction() {
    echo $str; //报错
}
function infunc() {
    $str = 'one two three';
    echo $str; //one two three
}
echo $str; //something
//不搭嘎啊

javascript变量作用范围

var str = 'something';
function infunction() {
    console.log(str); //something
    str = 'one two three';
}
console.log(str); //one two three
//想function里面的变量私有化,则需要var来定义

python变量作用范围

str = 'something';
def infunction():
    print(str) #something
def infunc():
    print(str) #报错
    str = 'one two three'
#在def中不对外部变量赋值时,外部变量可直接使用(global)
#一旦在def中对变量复制,def中的变量将会私有化(locale)

mysql杂记

导入备份的sql文件

use mydb;
source /var/www/data.sql;

导入txt数据

LOAD DATA INFILE 'path/to/file.txt'
INTO TABLE `tablename`
FIELDS TERMINATED BY ',';

时间戳和标准时间的转换

#时间戳 to 标准时间
FROM_UNIXTIME(xxxxxxxxxx);
#标准时间 to 时间戳
UNIX_TIMESTAMP('YYYY-MM-DD HH:MM:SS'');

Error: Cannot load from mysql.proc. The table is probably corrupted

mysql_upgrade -uroot -p

实时网站在线人数显示

javascript部分

使用的ajax长轮询 ajax long poll,为了便于使用,我将它封装成了一个jquery插件

(function($){
	$.fn.extend({
		visitors: function(options){
			var defaults = {
				script : "visitors/online.php",
				timeout : 50000,
			};
			var options = $.extend(defaults, options);
			return this.each(function(){
				var holder = $(this);
				refresh = function(sleep) {
					var sleep = sleep ? sleep : 1000;
					setTimeout('update()', sleep);
				}
				update = function() {
					$.ajax({
						url : options.script,
						type : 'get',
						dataType : 'json',
						async : true,
						cache : false,
						timeout : options.timeout,
						beforeSend : function() {
						},
						success : function(data) {
							holder.html(data.num);
							refresh(1000);
						},
						error : function() {
							refresh(15000);
						}
					});
				}
				update();
			});
		}
	});
})(jQuery);

php部分

待续...

位运算

基本概念

  • 左移 <<
    右边空位补0,其值相当于x2。
  • 右移 >>
    如果为正数左边空位补0,如果为负数则可能补0或补1(取决于所使用的计算机系统)。
  • 按位与 &
    两个都为1则为1
  • 按位或 |
    其中一个为1则为1
  • 按位异或 ^
    “半加”,不同的为1,相同的为0
  • 取反 ~
    ~1 = 0, ~0 = 1 涉及补码的算法:
    1. 正数的补码与原码相同
    2. 负数的补码是对其原码逐位取反,但符号位(第一位)除外;然后整个数加1。

常用算法

判断奇偶性

lambda x : x & 1

取二进制数的第k位

lambda x, k : x >> k & 1

二进制数k位清0

lambda x : x & ~ (1 << k)

二进制数k位置1

lambda x : x | (1 << k)

求平均值

lambda x, y : (x & y) + ((x ^ y) >> 1)

判断是否为2的幂

lambda x : ((x & (x-1)) == 0) && (x != 0)

交换两整数

a, b = 3, 4
a = a ^ b
b = b ^ a
a = a ^ b
print(a, b) #4 3

uploadify的使用

html

Upload photos

Uploading…
Empty the list

javascript

$(function() {
	var fileRemoved = false;
	function reset() {
		$("#fileInputQueue, #upload-tools").hide();
		$("#status").empty().hide();
		$("#doc-loading").hide();
	}
	$('#fileInput').uploadify({
		uploader: 'static/js/uploadify/uploadify.swf',
		script: 'uploadify.php',
		buttonImg: 'static/image/button.png',
		// rollover: true,
		width: 100,
		height: 30,
		cancelImg: 'static/image/cancel.png',
		// auto: false,
		multi: true,
		// method: 'POST',
		fileDesc: 'Photo(*.jpg; *.jpeg; *.gif; *.png)',
		fileExt: '*.jpg; *.jpeg; *.gif; *.png',
		sizeLimit: 31457280,
		// displayData: 'percentage',
		scriptAccess: 'always',
		scriptData: {
		},
		onSelect: function(event, queueID, fileObj) {
			if (parseInt(fileObj.size) > parseInt(31457280)) {
				size_limit = Math.round(31457280 / 1048576 * 100000) / 100000;
				//上传文件大小超出限制
				fileRemoved = true;
				return false;
			}
			$("#fileInputQueue, #upload-tools").fadeIn();
			if (!fileRemoved) {
				//成功选择文件
			} else {
				//...
			}
		},
		onCancel: function() {
			if ($('.uploadifyQueueItem').size() === 1) {
				reset();
			}
		},
		onClearQueue: function() {
			reset();
		},
		onComplete: function(evt, queueID, fileObj, response, data) {
			//console.log(eval('(' + response + ')').pid);
			//$.parseJSON
			$("#fileInput" + queueID + " .uploadifyProgressBar").css("background", "#6AE16A");
			$("#fileInput" + queueID + " .cancel").hide();
			return false;
		},
		onAllComplete: function(evt, queueID, fileObj, response, data) {
			//全部上传成功
			$("#upload-tools, #doc-loading").hide();
		}
	});
	$('#upload-button').click(function() {
		$('#fileInput').uploadifyUpload();
		$('#upload-tools').hide();
		$("#fileInputQueue").before($("#doc-loading").show());
	});
});

css

.uploadifyQueue{border:1px solid #CCC;display:none;max-height:300px;margin:16px 0 24px 0;overflow:auto;zoom:1;}
.uploadifyQueueItem{border-bottom:1px solid #E2E2E2;font-weight:bold;padding:8px;}.uploadifyQueueItem .cancel{float:right;}
.uploadifyQueueItem:last-child{border-bottom:0;}
.uploadifyError{background-color:#eeacac !important;color:#cc0000 !important;}
.uploadifyProgress{background:#EEE;height:6px;margin-top:8px;overflow:hidden;width:100%;zoom:1;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:inset 0 0 1px rgba(0, 0, 0, 0.05);-webkit-box-shadow:inset 0 0 1px rgba(0, 0, 0, 0.05);box-shadow:inset 0 0 1px rgba(0, 0, 0, 0.05);}
.uploadifyProgressBar{background:#333;height:6px;margin-left:-1px;width:1px;}
a.delete-item{background:url('static/images/icons/delete.png') center left no-repeat;padding-left:18px;line-height:18px;}

google地图overlay

就是添加一个自定义的层,使用方法(初始化一个):
new FastMarker();

function FastMarker(latlng, options) {
	this.latlng = latlng;
	this.options = options || {};
}
FastMarker.prototype = new google.maps.OverlayView();
FastMarker.prototype.onAdd = function(map) {
	var div = document.createElement('div');
	if (this.options.className) div.className = this.options.className;
	if (this.options.html) div.innerHTML = this.options.html;
	if (this.options.dom) div.appendChild(this.options.dom);
	if (this.options.id) div.id = this.options.id;
	div.style.position = 'absolute';
	this.map = map;
	this.div = div;
	var events = ['click', 'dblclick', 'contextmenu', 'mousedown', 'mouseup', 'mouseover', 'mouseout', 'mousewheel', 'DOMMouseScroll'];
	for (var i = 0; i < events.length; i++)
	 google.maps.event.addDomListener(div, events[i], this.stop, false);
	var panes = this.getPanes();
	panes.overlayLayer.appendChild(div);
};
FastMarker.prototype.draw = function(force) {
	var point = this.getProjection().fromLatLngToDivPixel(this.latlng);
	this.div.style.top = (point.y) + 'px';
	this.div.style.left = (point.x) + 'px';
};
FastMarker.prototype.onRemove = function() {
	google.maps.event.clearInstanceListeners(this.div);
	this.div.parentNode.removeChild(this.div);
	this.div = null;
};
FastMarker.prototype.getPosition = function() {
	return this.latlng;
};
FastMarker.prototype.stop = function(e) {
	if (navigator.userAgent.toLowerCase().indexOf('msie') != -1 && document.all) {
		window.event.cancelBubble = true;
		window.event.returnValue = false;
	} else {
		e.stopPropagation();
	}
};

重置mysql root密码

这里要说的是忘记root密码之后怎么去改密码。

killall -TERM mysqld #关闭mysql进程
/usr/local/mysql/bin/mysqld_safe --skip-grant-tables  --skip-networking & #安全模式启动mysql
mysql #直接mysql命令进去

注意该模式下进去是没有grant权限的,我们只能直接对表进行操作,下面是sql语句

USE mysql;
UPDATE user set password=password('new password') WHERE user='root';
FLUSH PRIVILEGES; #刷新权限

但是遇到徐老师这样的草泥马,把表清空了,N多的字段啊,果断从本地mysql的表里面搞出sql语句,插进去:

USE mysql;
INSERT INTO `user` VALUES ('%', 'root', PASSWORD('your password'), 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', '', '', '', '', 0, 0, 0, 0);
INSERT INTO `user` VALUES ('localhost', 'root', PASSWORD('your password'), 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', '', '', '', '', 0, 0, 0, 0);
FLUSH PRIVILEGES; #刷新权限

svn杂记

chmod +x hooks/pre-commit

svn强制要求填写注释

./hooks/pre-commit

REPOS="$1"
TXN="$2"

SVNLOOK=/usr/bin/svnlook

LOGMSG=`$SVNLOOK log -t $TXN $REPOS | wc -m`
if [ "$LOGMSG" -lt 48 ]
then
	echo "\n至少输入4个汉字" >&2
	exit 1
fi
exit 0

svn自动加版本号

enable-auto-props = yes
[auto-props]
*.php = svn:keywords=Date Author Id Revision HeadURL
*.css = svn:keywords=Date Author Id Revision HeadURL
*.html = svn:keywords=Date Author Id Revision HeadURL
*.js = svn:keywords=Date Author Id Revision HeadURL

svn同步到web目录

svn co file:///var/www/svn/sandbox /var/www/html/
#./hooks/pre-commit
svn up /var/www/html/