Leo の Blog Where there is a will there is a way! Trust youself can do it!

28六/090

Ubuntu 8.04 无线网卡驱动

重新装了 Ubuntu 8.04 到我的老本本里。 本想以前安装 无线网卡的驱动巨费劲的。不料如今安装驱动如此方便了。由于我的老本上的无线网卡是 Broadcom 公司的产品。直接在源里就可以安装。

安装前还是确认一下比较好。 查看一下网卡信息。

1
lspci -vnn | grep 14e4

结果:

02:0e.0 Ethernet controller [0200]: Broadcom Corporation BCM4401-B0 100Base-TX [14e4:170c] (rev 02)
10:00.0 Network controller [0280]: Broadcom Corporation BCM4311 802.11b/g WLAN [14e4:4311] (rev 01)

然后到到 http://linuxwireless.org/en/users/Drivers/b43#devicefirmware 上对照一下。 很幸运的是网卡被列入firmware支持名单中。 happy. 安装一下即可。

1
sudo apt-get install b43-fwcutter

安装后重启系统。 然后 system => administrator => network setting => 启动无线网卡。 属性里设置一下自己的无线路由连接信息。重启系统。 OK, 无线网卡工作正常咯!

28六/090

Ubuntu 8.04 使用 ibus

Ibus 越来越好来, 试用了一下。 感觉是放弃 Fcitx 的时候了。

刚好今天新装了 Ubuntu 8.04.2 不过升级了一下。 发现已经到 8.04.3 了。 LTS 版本就是不一样啊。 呵呵。 8.04 是我比较喜欢的一个版本。 稳定的没话说。

安装一下 ibus , 因为是 英文环境。 所有有点不同。 参考了网上的资料。 大概来说这样就可以了。

先修改一下源。 添加 CN99 的中文源到 /etc/apt/sources.list

deb http://ubuntu.cn99.com/ubuntu-cn/ hardy main restricted universe multiverse

再更新一下源

1
sudo apt-get update

接下来 打开“新里德包管理器” 搜索 ibus 选择 ibus, ibus-pinyin 安装即可。 也可以用命令行安装

1
sudo apt-get install ibus ibus-pinyin

接下来 Ctrl + Alt + backspace 退出, 重新进入系统。 修改一下文件:

1
sudo /usr/lib/gtk-2.0/2.10.0/immodule-files.d/libgtk2.0-0.immodules

最后面添加下面两行:

"/usr/lib/gtk-2.0/2.10.0/immodules/im-ibus.so"
"ibus" "X Input Method" "gtk20" "/usr/share/locale" "en:zh"

修改 ~/.bashrc 文件。 添加下面两行进去:

export XMODIFIERS=@im=ibus
export QT_IM_MODULE=ibus

再 Ctrl + Alt + backspace 退出, 重新进入系统。应该可用了。

如果启动失败, 打开 Terminal。 运行 ibus 命令 , 可能会提示 no module name gconf 安装一下即可。

1
sudo apt-get install python-gconf

如果ibus 启动没有问题, 无法使用 engine 的话, 打开 Terminal 运行 ibus-setup 可能回提示 no module name xdg 同样安装一下即可。

1
sudo apt-get install python-xdg

现在 ibus 可以正常工作了。 在状态栏右键点击 ibus 图标, 选择 preferences => engine => chinese 把 pinyin 的2个勾选上。 OK, 中文输入正常了。 另外可以自己设置一下拼音的属性。

总体来说 我个人认为 ibus 是目前 linux 下最好的中文输入法了。

标签: 没有评论
24六/090

分享2个 PHP 十进制和二进制互转的函数

有时候想看一个整数的二进制数据换算挺麻烦的. 留2个函数方便使用.

从十进制转成二进制.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
 * 有符号整型数据转换成二进制形式.
 *
 * @param int $si 要转换的整型数据
 * @param int $bits 计算机CPU位宽
 * @return string
 */
function si2bin($si, $bits=32) {
	//检查数据大小是否在范围内.
    if ($si >= -pow(2,$bits-1) and $si <= pow(2,$bits-1) ){
        if ($si < 0) {
            $si = -$si-pow(2,$bits);
        }
        $bin = base_convert($si,10,2);
        $bin_length = strlen($bin);
        if ($bin_length < $bits) $bin = str_repeat ( "0", $bits-$bin_length).$bin;
        return $bin;
    }
    return '';
}

从二进制转到十进制:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
 * 二进制数据转换成有符号整数.
 *
 * @param string $bin 二进制数据
 * @param int $bits 计算机CPU位宽
 * @return int
 */
function bin2si($bin,$bits=32) {
    if (strlen($bin)==$bits) {
    	$si = base_convert($bin,2,10);
        if (substr($bin,0,1) == 1) { //负数
            $si = -(pow(2,$bits)-$si);
        }
        return $si;
    }
    return 0;
}
分类: PHP 没有评论
23六/090

Prototype 1.6 资料打包

找了下 prototype 的资料. 打个包放在这里. 方便到拿去. 包里文件  prototype 1.6 中文, 英文文档. CHM 格式. 还有 1.60 的API, PDF格式. 还要一个 cheatsheet 也是 1.6 版本到. 资料应该比较齐全了. 剩下到花点时间去看吧.

下载地址: 点击这里下载

23六/090

JavaScript 常用函数封装.

近来工作任务涉及到 JavaScript 方面了. 顺手整理了一下 常用函数, 帖出来方便使用.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
/**
 * Mm Javascript code
 * 未完待续...
 *
 * @author: Guya
 * @email: camworkster@gmail.com
 * @version: 1.0 beta
 */
 
//使用对象
var MmJs = {
version: '1.0 beta',
author: 'Guya'
};
 
/**
 * 浏览器判断. COPY jQuery
 *
 */
var userAgent = navigator.userAgent.toLowerCase();
MmJs.browser = {
	version: (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [0,'0'])[1],
	safari: /webkit/.test( userAgent ),
	opera: /opera/.test( userAgent ),
	msie: /msie/.test( userAgent ) &amp;&amp; !/opera/.test( userAgent ),
	mozilla: /mozilla/.test( userAgent ) &amp;&amp; !/(compatible|webkit)/.test( userAgent )
};
 
/**
 * 加入 window.onload 执行函数.
 */
MmJs.addOnload = function(fnHandler) {
    var oldOnload = window.onload;
	if( typeof window.onload != 'function' ) {
		window.onload = fnHandler;
	} else {
		window.onload = function() {
			oldOnload();
			fnHandler();
		}
	}
};
 
/**
 * 加入 window.onunload 执行函数.
 */
MmJs.addOnUnload = function(fnHandler) {
    var oldOnUnload = window.onunload;
	if( typeof window.onunload != 'function' ) {
		window.onunload = fnHandler;
	} else {
		window.onunload = function() {
			oldOnUnload();
			fnHandler();
		}
	}
};
 
/**
 * 增加 DOM 事件监听.
 */
MmJs.addEventHandler = function (oTarget, sEventType, fnHandler) {
 
    if (oTarget.addEventListener) {
 
        oTarget.addEventListener(sEventType, fnHandler, false);
 
    } else if (oTarget.attachEvent) {
 
        oTarget.attachEvent("on" + sEventType, fnHandler);
 
    } else {
 
        oTarget["on" + sEventType] = fnHandler;
 
    }
 
};
 
/**
 * 删除 DOM 事件监听.
 */     
 
MmJs.removeEventHandler = function (oTarget, sEventType, fnHandler) {
 
    if (oTarget.removeEventListener) {
 
        oTarget.removeEventListener(sEventType, fnHandler, false);
 
    } else if (oTarget.detachEvent) {
 
        oTarget.detachEvent("on" + sEventType, fnHandler);
 
    } else { 
 
        oTarget["on" + sEventType] = null;
 
    }
 
};
 
MmJs.formatEvent = function (oEvent) {
 
    if (MmJs.browser.msie) {
 
        oEvent.charCode = (oEvent.type == "keypress") ? oEvent.keyCode : 0;
 
        oEvent.eventPhase = 2;
 
        oEvent.isChar = (oEvent.charCode &gt; 0);
 
        oEvent.pageX = oEvent.clientX + document.body.scrollLeft;
 
        oEvent.pageY = oEvent.clientY + document.body.scrollTop;
 
        oEvent.preventDefault = function () {
 
            this.returnValue = false;
 
        };
 
        if (oEvent.type == "mouseout") {
 
            oEvent.relatedTarget = oEvent.toElement;
 
        } else if (oEvent.type == "mouseover") {
 
            oEvent.relatedTarget = oEvent.fromElement;
 
        }
 
        oEvent.stopPropagation = function () {
 
            this.cancelBubble = true;
 
        };
 
        oEvent.target = oEvent.srcElement;
 
        oEvent.time = (new Date).getTime();
 
    }
 
    return oEvent;
 
};
 
/**
 * 获取事件.
 */
MmJs.getEvent = function() {
 
    if (window.event) {
 
        return this.formatEvent(window.event);
 
    } else {
 
        return MmJs.getEvent.caller.arguments[0];
 
    }
 
};
 
/**
 * 依据ID属性查找DOM节点
 */
MmJs.getById = function(dom_id_string) {
    if(!dom_id_string) { return null; };
    if(document.getElementById) {
        return document.getElementById(dom_id_string);
    };
    return null;
};
 
/**
 * 创建DOM节点.
 */
MmJs.createElement = function(tag_type, attr, append_to_element) {
    if('string' != typeof tag_type) {
        tag_type = 'div';
    };
    if('object' != typeof append_to_element) {
        append_to_element = document.body;
    };
    var d = document.createElement(tag_type);
    append_to_element.appendChild(d);
    if('object' == typeof attr) {
        if('object' == typeof attr.dom) {
            for(var i in attr.dom) {
                d.setAttribute(i,attr.dom[i]);
            };
        };
        if('object' == typeof attr.style) {
            for(var i in attr.style) {
                d.style.i = attr.style[i];
            };
        };
        if('object' == typeof attr.event) {
            for(var i in attr.event) {
                if('function' == typeof attr.event[i]) {
                    this.addEventHandler(d, i, attr.event[i]);
                };
            };
        };
    };
};
 
/**
 * 获取DOM元素位置
 */
MmJs.getPos = function(elObj, posName) {
    if('string' == typeof elObj) {
        elObj = this.getById(elObj);
    }
    var iPos = 0;
	while(elObj != null) {
		iPos += elObj["offset" + posName];
		elObj = elObj.offsetParent;
	}
	return iPos;
};

脚本不是很完整. 等以后有时间再补充其他到函数了.