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, 无线网卡工作正常咯!
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 下最好的中文输入法了。
分享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; } |
Prototype 1.6 资料打包
找了下 prototype 的资料. 打个包放在这里. 方便到拿去. 包里文件 prototype 1.6 中文, 英文文档. CHM 格式. 还有 1.60 的API, PDF格式. 还要一个 cheatsheet 也是 1.6 版本到. 资料应该比较齐全了. 剩下到花点时间去看吧.
下载地址: 点击这里下载
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 ) && !/opera/.test( userAgent ), mozilla: /mozilla/.test( userAgent ) && !/(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 > 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; }; |
脚本不是很完整. 等以后有时间再补充其他到函数了.