 | 标记说明: 转载 原创 1 2 3 First | Previous | Page 3 of 3 | Next | Last July 10, 2008 代码 Coding key_buffer_size 很多文章都告诉你越大越好,要为此分配一半左右的物理内存,这么干通常不会出问题,但肯定不是最优的,甚至可以说很无理头——分多少内存应该是根据需求决定,而不是不管什么机器,都砍掉一半内存用作 key_buffer_size ——有的时候可能是不够,还有的时候可能是浪费。 其实最关键的指标,还是看 SHOW GLOBAL STATUS 时的 Key_blocks_unused,只要还有剩余,就说明 key_buffer_size 没用满。有人说看 Key_reads 跟 Key_read_requests 的比值,至少要达到 1:100。这可以作为一个结果来衡量,但不够准确,因为在服务器刚启动的时候,大多数请求都要新建缓存,缓存命中比高不起来,需要运行稳定(几小时后)再观察。我个人建议还是看 Key_blocks_unused 如果不花很长时间在运行中调试,给出一个简单的计算方法,把数据库填满,达到设计时的最大值,看看这时候索引占了多大空间,然后把所有表的索引大小加起来,就是 key_buffer_size 可能达到的最大值,当然,还要留些余地,乘个 2 或 3 之类的。 这是我做测试的时候的 phpMyAdmin 截图,可以看到 key_buffer_size 被浪费了太多 
Posted by Platinum at 07:21 PM | Continue reading (4.7 KB) | Comments (4) February 15, 2008 代码 Coding 在此,有一点必须说明,程序员和职业计算机工作者都有一种强烈的性格倾向,而这点对于团队的多元化建设并不是好事情。澳大利亚的顾问如Rob Thomsett发现,五分之三的计算机工作者都属于一种性格体系,那就是:乐于实践、逻辑性强、尊重事实、非常现实,他们将精力集中于有用的事物和实际的问题之上。他们根本不是那种“喜欢与人打交道”的类型。在人类中只有不到20%的人是属于这种类型的。那么,具有这种性格的人也只适合当某几种类型的领导者,比如:实施者、润饰者、监控者,或者司机。他们中很少有能适应协调者或者支持者角色的,这两种角色需要极强的人际沟通能力;至于创始者,具有这种性格的人当中就更少有人可以担当了,因为这个角色最基本的特征就是,必须具有创造性地解决问题的能力。 Thomsetl认为,之所以会出现这种现象,是因为在培训和高等教育的人员挑选环节上出了一些问题,他还就此事进行了谴责,但是,我觉得也许还有其他因素的影响吧。我有一些在俄罗斯从事管理顾问工作的同事,他们曾经讨论过一个问题:计算机编程实际上代表了一种文化,具有极大的影响力,会让从业者逐渐融入其中,这种文化的影响力甚至超过了国家文化的影响力。他们的观点来源于一个现象:位于莫斯科的程序员与他们周围的非程序员同事,虽然住在同一个城市里,在一起工作,但是相互间存在很大差别,而与位于明尼阿波利斯的程序员相比,他们相互之间的差别却要小得多。不管造成这种现象的原因是什么,这种趋同现象对我们职业是一种真正的障碍,尤其是当我们以团队形式进行协同工作时。
有一次上厕所时没书看,老余推荐《人件集》,但是半年之后,我仍然不时想起这段文字。其实当时并非是觉得没有必要记下,而是实在懒得敲字进去。今天突然发现 china-pub 上的免费试读里恰好有这段。于我心有戚戚焉,看来它还是有人来负责挑选每本书的精彩章节的。但我还是无法宽恕这个网站在六年前以新书的价格卖了我一本夹着西单图书城借书单的旧书。china-pub 试读 pdf Posted by Platinum at 12:58 AM | No more content | Comments (0) December 6, 2007 代码 Coding 两年前初识 ImageMagick 时就碰到过一个问题:把一张图片缩略图缩小后体积依然很大。知道今天重新碰到这个问题时才想到正确解决方法 虽然四年前已经看过所谓的 XP 下缩略图跟原图不一样的戏法——你可以认为某些 jpg 文件实际上包含了另外一个 jpg 图片做缩略图,以便一些需要缩略图的地方不需要及时计算和裁减而直接用现成的就可以了,当然我认为更重要的意义在于一些图片可以做选择性的裁减,以便在缩略图中有更大面积展示其中的精华部分。就像很多个人 CG 作品展示的网站都会手工的为自己的作品做一些精致的缩略图,而不是简单的大小缩放。但是不知道为什么两年前的我没有想到这个问题,还是说当时没有搜到正确参数? 那个参数就是 +profile "*" 从输入图像中删除可能 存 在的 ICM,EXIF,IPTC 或其他配置,因为缩略图中不需要它们
这是从一个样式很奇怪的网页里找到的,很奇怪,为何如此重要的参数没有在官方 usage 里做个演示 Posted by Platinum at 04:50 PM | No more content | Comments (1) September 24, 2007 代码 Coding 这个内容实在是有些简单,封装的也很简单,但是有时候确实会用上…… <?PHP function sendMail($sAddress, $sSubject, $sContent) {
$sFrom = "user@gmail.com"; // 改成自己的信箱 $sPassword = "password"; // 密码
require_once("Net/SMTP.php");
$sData = "Subject: =?UTF-8?B?".base64_encode($sSubject)."?=\n" ."MIME-Version: 1.0\n" ."Content-Type: text/plain; charset=\"UTF-8\"\n" ."Content-Transfer-Encoding: base64\n" ."\n" .chunk_split(base64_encode($sContent));
$oMail = new Net_SMTP("ssl://smtp.gmail.com", 465); $oMail->connect(); $oMail->auth($sFrom, $sPassword, "LOGIN"); $oMail->mailFrom($sFrom); $oMail->rcptTo($sAddress); $oMail->data($sData); $oMail->disconnect(); }
$sAddress = "otherone@gmail.com"; $sSubject = "测试标题 ".date("H:i:s"); $sContent = "测试正文 ".date("H:i:s");
sendMail($sAddress, $sSubject, $sContent); ?> 搞了半天也没搞出来如何修改自己的称谓(“Nickname <user@gmail.com>”这种) 使用 smtp 发送还有一个原因就是,自己机器走 sendmail 据说被 gmail 检查的很严格,搞不好就成了 spam。而且程序在 win32 和 linux 之间切也很麻烦 Posted by Platinum at 07:14 PM | No more content | Comments (0) June 24, 2007 代码 Coding 就是在数据量变得单机难以承受(比方说 MySQL 上千万行、或者 Memcache 的用量超过 4G 而你用的服务器又都是 32 位机)的时候,可以通过很简单的一点小改动来让现有程序架构提升一两个数量级 这是一个基础课程,整个内容其实用两个词就可以概括了:hash、求余,通过将 key 转化成整数后求余,来决定数据装在哪个容器里。能明白不用继续看了。为了让尽可能的人看明白,我写的比较冗长。 最初是听说微软的 passport 是用的注册 E-mail 的 md5 来分割并存储帐号,当时还很傻的认为只能按 16 组或者 256 组(就是取前一个或者前两个字母的样子),经车东提醒才知道 crc32 更方便些,而且终于解明白了“进制”这个结 Posted by Platinum at 01:21 AM | Continue reading (10.7 KB) | Comments (1) June 17, 2007 代码 Coding 不想等日志分析的时候再去滤去自己的 ip,而是自己访问的时候压根就不产生日志 非得 google 英文网站才能出结果……说实话,这之前我还完全没去想过 SetEnvIf 是干嘛用的…… 通常的定制 log 应该是这么写 CustomLog logs/access.log combined
加一行 SetEnvIf ,以及原来的那行结尾加个 env=! SetEnvIf Remote_Addr "127\.0\.0\.1" dontLog CustomLog logs/access.log combined env=!dontLog
这只是 Apache 环境变量 所能实现的一个小应用之一。禁止外部引用、禁止某些爬虫之类都是用的这个功能实现的 其实所有带正则的功能我都有抵触心理,特别是当一个 site 有数十个 rewrite 的时候,总觉得是浪费了大量的 CPU
说实话,乔伦让我感到了压力,不过这是好事 Posted by Platinum at 01:02 AM | No more content | Comments (0) June 14, 2007 代码 Coding 说到字体,本来 Terminal 字体也不是很难看(在 SecureCRT 里我就用的 Terminal,编辑器里用 Fixedsys),但是在 640x480 下就尤其难看了,以前试用 Ubuntu 时看到 TualatriX 介绍几个 Grub 参数 就照着把 tty 终端的改成 1280x1024,发现字体也变化了,一种笔画只有 1 像素的字体,配合 linux 下的各种高亮颜色,看起来极为舒服。那种字符界面简直让人着迷。但是我在 X 里把所有字体非常耐心挨个找了几遍,都不是我想找的那种字体 今天看见同事刘涛在用 Ubuntu 做桌面环境,顺便问起可知道那种字体叫什么名字,他就帮我找了起来,在我俩 google 的过程中愈发觉得是包含在 Linux Kernel 中的几种缺省字体之一,接着刘涛便用一个叫 consolechars 的工具把字体提取了出来,而且知道字体是一种叫 PSF(PC Screen Font)的陌生格式,继续 google 到一个工具 PSF Tools 把它转成了 Windows 可用的 .FON 格式。 可当我把它设为编辑器的字体时效果可以说很难看,完全不是记忆里 tty 终端下的样子。把配色反转,黑底绿/灰/褐字,效果能好些,也不够理想,菜单工具栏的 Windows 配色又太亮了。总之需要在合适的配色下这种字体才能发挥作用,才能让人觉得这是一种清晰舒服的字体。曾经看着一个全屏的 vi 就觉得很爽,问题是谁让自己是写 Web 的,数年都是边写边用 IE 看效果的工作方式。 不多说了,有人想试试这字体的可以下一个看看,天啊,当时提出来才 10KB,包括转完的 .fon 一起 zip 打包后才 5KB。 Download - Linux Kernel Font
字体预览: 
最后,谁能告诉我这种字体叫什么名字?是否是绝大部分 Linux 发行版都会带这种字体? Posted by Platinum at 11:56 PM | No more content | Comments (1) March 8, 2007 代码 Coding 2.存储密码(或者说 md5),用 binary(16) 而不是 char(32) 一个 PHP 程序员第一次往数据库里存密码估计都是明码方式的,之后才知道 md5,而第一次存 md5 密码肯定都用的是 char(32) 或者 varchar(32),我甚至忽视了这个问题,很久后才意识到,应该用 binary(16) 比方说一个表只有 id、user、password 三个字段,你要创建个新用户,最终的 SQL 可能是这样: INSERT INTO members SET user = "platinum", password = "202cb962ac59075b964b07152d234b70"
现在则应该这样: INSERT INTO members SET user = "platinum", password = 0x202cb962ac59075b964b07152d234b70
就是说,你应该把一个 md5 串看成是 16 个 HEX 十六进制数,而非长度为 32 的英文数字混淆的字符串。在这里,好处仅仅是节省 16 个字节而已,但是以后,你会碰到需要用 guid 之类(而非自增长的整数 id)做主键的情况(举个例子,假设你写了个爬虫抓取整个 web,为了标识那无数的网址你只能用 md5 把它们缩短后作为主键),这时候效率会更明显,要知道,以二进制存储的时候,不需要考虑大小写、不需要考虑字符集,而且更适合被索引 hash。 Posted by Platinum at 01:29 PM | Continue reading (4.6 KB) | Comments (1) December 27, 2006 代码 Coding 即 %uXXXX 格式的,看着很不爽。iconv UNICODE 居然还不行,得是 UNICODEBIG <?PHP function fnJSUrlDecode($sOrg, $sCharset = "GBK") { $sPattern = "/%u[0-9a-f]{4}/i"; preg_match_all($sPattern, $sOrg, $aOut); $aSearch = array(); $aReplace = array(); foreach ($aOut[0] as $sValue) { $aSearch[] = $sValue; $aReplace[] = iconv("UNICODEBIG", $sCharset, pack("H*", substr($sValue, 2))); } $sOut = str_replace($aSearch, $aReplace, $sOrg); return $sOut; }
echo fnJSUrlDecode("word=%u6D4B%u8BD5%u6587%u5B57"); ?> Posted by Platinum at 06:11 PM | No more content | Comments (0) December 21, 2006 代码 Coding 整个思考过程是这样的,概念过于基本,让人不齿…… url 在传递时,如果有特殊字符需要 urlencode,但是这是一种很冗长的格式,比方说“测试”二字,如果是 GBK 编码的话是 4 个字节,可 urlencode 后是“%B2%E2%CA%D4”,12 个字节,是原来的三倍,这很不爽,如果你整个参数都只有中文,可能 HEX 形式(PHP 里是 bin2hex)表示能好点,就是没了 %,成了 B2E2CAD4(这两种方式类似 UTF-8 和 Unicode 的关系),不过也有两倍长 为什么会有两倍长?因为符号没有被充分利用,每一位只用了 0-9、A-F 共 16 种,如果充分利用 A-Z,再包括大小写,加上数字共 62 种,再找两种(比方说 _ 和 .)凑到 64 种,2 的幂次数。64 ^ 2 = 16 ^ 3 = 4k,既是说两位的 64 进制数与三位的 16 进制数表示的内容相当。 于是花了一个来小时,写完后先是挺美,又有不祥预感,google 了一下 RFC,才明白其实我实现的就是 base64……大悲 Posted by Platinum at 12:54 PM | Continue reading (4.3 KB) | Comments (0) December 19, 2006 代码 Coding 写东西写着写着突然想起一套经典老题 记得第一道题目是 a 和 b 两个整数变量,在不增加新变量的前提下,让它们两个的值对调。这题太老了。a = a + b,b = a - b,a = a - b 让我觉得最 NB 的一道是,判断一个混列的数组(“3,6,5,9”或者“123,94,741,628...”这类)是否能拼成一串连续整数(4,5,6,7)的算法,看到最优算法后我是精神抖擞……可就是忘了记下来了,只记得是只用了一次循环了,其他全忘 还有个以前在一个论坛看到的,13 枚珠子摆成环形,两个人轮流拿,一次可以拿一到两枚,但必须是连续的珠子,不能跳着拿,拿到最后一枚的算胜,应采用什么样的策略保证后手总能拿到最后一枚? Posted by Platinum at 02:34 PM | No more content | Comments (0) November 27, 2006 代码 Coding 最近两周快被搞疯了,没想到一个简单分析日志的小脚本被搞的这么复杂。 脚本是这样,每天从各个 web 服务器上抓取 apache log,约 8 - 10G,然后分析,并生成海量的 html(20K+ 个),约 3G+(求和需要很长时间,很少去算),数量上讲有点变态,但对于我这个需求来讲是合适的,我只需要保存大约 10 天的数量,再久的就可以打包了,打包后才 60MB/天。 在我自己机器上,一切都调配好了,于是放到了一台 FreeBSD 的机器上,发现随着文件数量急剧增加,创建新文件的速度直线下降,怀疑是 ext3 过于智能的减少文件碎片的算法所导致的,不过没时间研究问题所在了。直接重装成 win XP + NTFS,莫名其妙的问题又出现了——我那个脚本分析 60MB 数据需要约 14 秒,但是在新机器上怎么跑都是 39 秒,这意味着我原本计划每天 8 个小时能跑完的脚本可能 24 小时都跑不完。于是我毫无头绪的开始检查分区规划是否有问题、簇的大小、IDE 数据线是不是 ATA100 的、除了 Intel INF 还得装点什么驱动之类各种各样能想得到的点,但都不是 网管给我了一个叫 HD Tune 的软件让我确认,这台新机器装的跟我自己的机器一样健康,磁盘读写的测试结果几乎一模一样。最后我能找的到的区别是,我自己机器上的 PHP 是 5.1.6,而新机器我装的是 5.2.0 我把 PHP 目录换掉,php5ts.dll 覆盖掉,于是,新机器上跑起来也是 14 秒了。 我一直以为 fgets 是最底层的操作,比方说 PHP 里写一个文件应该在 shell 下用管道符生成一个文件的速度应该是非常接近的,瓶颈应该在磁盘 IO 上,但是我错了 我那个脚本主要就是这么个基本的循环读取每行数据的 <?PHP $fileHandle = fopen($sFileName, "r") while (!feof($fileHandle)) { $sLine = fgets($fileHandle); ... ?> 从现在的表面现象上看,相同读日志脚本在 5.1.6 跟 5.2.0 上效率差了两倍半,原因么…… A. 最近的 php 很多 fix,以至于连 fgets 这么古老的函数都受影响 B. 跟 fgets 没关系,我读取数据后将各种信息放到一个超大数组里,由于更 oo 的新版在某些内存分配、指针或者什么 ooxx 的不为人知的改动导致对这个大数组的操作变的缓慢(更不太可能,内存再慢也差不出 25 秒啊) 没有时间测试/分析具体原因了,只要这个脚本正常运行了就好(巧合编程?随鸭去吧)以及之前所说的怀疑 ext3 格式无法胜任这种写文件的方式,也只是猜测 任务缓存早已溢出,赶紧下一任务吧 Posted by Platinum at 02:52 PM | No more content | Comments (1) September 8, 2006 代码 Coding 在我眼里,只有两个网站既华丽,又能表现出与其品牌相称的品质,毫无悬念的,他们是 blizzard.com 和 appple.com 就 Blizzard 而言,找一页,比方说 这里,可以有这么几个看点: Blizzard 一直有大量的 table,但很明显,这并不是非常重要的问题(就像 google 首页到现在也还在 table 布局一样),因此到现在也没有多少改进。但不要以为他们是不懂,像这个模拟游戏中的加点功能的页面也不是一挥而就的。 注意到开头这三个 Gnomes 了吗?把鼠标指上去,你会发现 img 的 alt 属性在这里被用来表达一个冷笑话的台词了。同时,画面内容有些超过边框。而且这种超过边框的风格很常见,这会导致做的时候有不小的麻烦(布局、图片抗锯齿之类的),但是看起来设计师认为这种效果很有表现力,是值得的。 title 完全不理会 SEO。是的,这才是正确的阅读顺序,但可耻的我们一直为了 SEO 而牺牲了美观。想这种结构严谨 title 规则,应该是 google 换一种方式去收录,而不是我们去讨好 google。
极少数的这类网站在证明着 web designer 这个职业的存在。绝大多数网站从 UI 上讲工作的很好,但还谈不上艺术品的程度。 一些空谈家们成天在 YY 着都网页标准化了会多好、什么样才叫标准,可自己都做了些什么样的东西?以及我之前强调的成本,有过计算吗?有实践吗? Posted by Platinum at 06:05 PM | No more content | Comments (0) September 4, 2006 代码 Coding 用过 Linux 的请直接忽略 这两个工具是以前从同事那里看到的,Wget 和 cURL,都是源自 linux 下的工具,可以看到其典型特征:高扇入,全面的参数,以及可靠稳定的工作。 Wget 是下载工具,你可以简单认为是一个命令行版本的 FlashGet,不过功能要比 FlashGet 强大的多,比方说 -mrnp 可以认为是完整的镜像下载功能 cURL 可以模仿各种条件下的连接,我用的不多,一般仅仅是 -I 参数看看 header 什么的 -,- Posted by Platinum at 11:52 AM | No more content | Comments (0) May 30, 2006 代码 Coding 老版 P460 - 28.2 代码调整介绍 用代码调整的另一个原因是:掌握写出高效的代码的艺术是一个优秀程序员的必经之路,在网球中,你不会通过捡球得任何分,但是你仍需要学习正确的捡球方法,你不能只会弯下腰用手捡球。如果是你好的网球手,你应该拍头重击网球,等它反弹至腰部高度时接住它。重击超过三次,或第一次球没弹起都算捡球失败。捡网球并不是一个重要问题,但在网球文化中,捡球的方法能给你带来一定的声望,同样,除了你和其它程序员,没有人关心代码的紧凑程度,虽然这样,在编程文化中,写一个短小有效的代码,能证明你是一个极好的程序员。 Posted by Platinum at 03:04 PM | Continue reading (2.8 KB) | Comments (0) 代码 Coding 1. phpMyAdmin 限制访问 不要直接把 phpMyAdmin 放到 www 目录,那样看起来很不爽,同时,应该只允许 Localhost 访问,而不应该让其他人也能通过局域网访问到你的 phpMyAdmin。总之加了下面这个我觉得是一劳永逸的事情,而且是最可靠的(不会因为你换了 phpMyAdmin 的 config 文件或者别的什么原因导致别人又能看到了) Alias /phpMyAdmin/ "D:/Server/phpMyAdmin/" <Directory "D:/Server/phpMyAdmin/"> Order deny,allow Deny from all Allow from 127.0.0.1 </Directory>
Posted by Platinum at 11:39 AM | Continue reading (985 Byte) | Comments (0) April 28, 2006 代码 Coding 目前做的公司的一个网站运行了快一年了,我曾经说,如果让我重新选,我会选 charset=GB2312(实际是 GBK)。由于数据库用的是一个,你不可能让两个子域名用的是不同编码,这样就要求你所有的 Web 程序员都很了解处理编码问题的方法,包括美工也要知道怎么在 dreamwaver 里设置,让有使用 Zend Studio 的人换编辑器、因为那个狗屁 IDE 不支持 UTF-8,并且,基本不要有什么合作站点之类的,因为其他站点都是 GB2312 的,你要给他点什么自己网站的内容(比方说一个供对方程序读取的 csv 接口),那你同样要负责转码问题。更多的详细问题不一一列举。总之,各种琐碎的细节带来的成本(主要是时间成本)相比 UTF-8 可能带来的好处……太不值一提了。 Posted by Platinum at 04:39 PM | Continue reading (2.7 KB) | Comments (1) First | Previous | Page 3 of 3 | Next | Last |