分类 "CK猪是程序员" 的存档.

内存管理及垃圾回收相关知识

内存管理模块是任何服务器应用程序不可回避的基本功能,初级应用为内存池
  1. 使服务器内存不至于严重碎片化
  2. 控制内存使用量,避免服务器内存耗尽而停止响应
  3. 将程序员从繁杂的内存管理中解放出来专注于业务功能的开发
内存管理的终极境界是垃圾回收,垃圾回收在内存池基础上增加以下功能
  1. 对象缓存
  2. 自动跟踪对象使用状况并自动回收不再使用的对象,程序员无需显式FREE
以上只是我的一些个人认识,可能有误。下面是相关的论文,内容包括
手动内存管理(malloc,free)
半自动内存管理(Memory Pool, C++ Custom Memory Allocation)
全自动内存管理(Garbage Collection)
相关论文索引:http://www.cs.kent.ac.uk/people/staff/rej/gcbib/gcbibG.html
Richard Jones’s Garbage Collection page:http://www.cs.kent.ac.uk/people/staff/rej/gc.html#FAQ
GC FAQ(Inlcuding language interface, basic algorithims, etc.)http://www.iecc.com/gclist/GC-faq.html

HTML不常用标签属性备忘

<input type=”text” /> autocomplete打开或者关闭自动完成功能。

<a hideFoucs=”fasle”> 不显示focus虚线,只对IE有效。标准浏览器用CSS样式 outline: none;

Mootools Bug – Date.getWeek

mootools-1.2.2.1-more.js

 getWeek: function(){
  var day = (new Date(this.get('year'), 0, 1)).get('date');//应该为get('day');
  return Math.round((this.get('dayofyear') + (day > 3 ? day - 4 : day + 3)) / 7);
 },

mootools-1.2.3.1-more.js

 getWeek: function(){
  return (this.get('dayofyear')  / 7).ceil();
 },

这个完全错

WEB前端开发的一些问题备忘

懒得整理了,权当备忘,IE的一些BUG
========================
多语言字体baseline不统一
背景和边框渲染错误,设置zoom:1,触发hasLayout可以解决
IE FLOAT BUG
viewfile
第一个图片比其它的高一个像素。。。
 <ul class=”people-list tidy” style=”margin-left:20px;”>
  <?php for ($i=0; $i<12; ++$i): ?>
  <li>
   <div><img src=”/img/photo_default.gif” /></div>
   <div class=”info”><a class=”font12″ href=”/”>Warren</a></div>
  </li>
  <?php endfor; ?>
 </ul>
 
 <ul class=”people-list tidy” style=”margin-left:20px;”>
  <?php for ($i=0; $i<12; ++$i): ?>
  <li>
   <img src=”/img/photo_default.gif” />
   <a class=”font12″ href=”/”>Warren</a>
  </li>
  <?php endfor; ?>
 </ul>
 
IE6: Whatever:hover只能实现<style></style>标签里的hover样式,CSS文件中的无法实现。
点击hover元素后有时会导致onhover类没有被去除
 
8以下版本的IE在渲染非ASCII字符时是不考虑字体的baseline的。直接将区域顶部与字体顶部对齐,这是导致我们做中文布局要是对不齐的根本原因。IE8解决了这个问题。
 
div被图片挡住

慎用iframe

最近在实现一个web编辑器,于是乎用到了传说中人见人怕的iframe。经过四天的拼搏,总算是弄出了个雏形。实现了插入图片,字体修改功能没做,不打算做,个人觉得不是很必要。另外还想实现插入flash,不过最终确认不可能(完美)实现,原因请看下文。

为什么要慎用iframe?

iframe在不同浏览器的行为各异,而且几乎都存在足以把开发者折磨致死的问题。

IE(trident)

问题:

  1. designMode下无法显示flash(这个待确认,似乎是这样的)
  2. iframe失去焦点后再得到焦点时,光标位置将丢失(解决办法下面再说)
  3. 选中非文本区域或未选中任何对象(光标仍在iframe内)将丢失光标位置(QQ邮箱好像实现了,看了它的实现方法后再回来确认)

解决方案:

  1. 无法解决
  2. 在window.onbeforeactivate事件中记录光标位置,在进行编辑操作时恢复光标位置
  3. 待解决

代码:

光标的记录与恢复

var bookmark;
var range = document.selection.createRange();
if (range.type.toLowerCase() == "text") {
    bookmark = range.getBookmark();
}

var newRange = document.body.createTextRange();
newRange.moveToBookmark(bookmark);//将光标移到原来的选中区域
newRange.collapse();
newRange.select();

 

Firefox(gecko)
问题:

  1. designMode下无法显示flash
  2. 某些情况下不会加载src指定的页面(解决办法下面再说)

解决方案:

  1. 无法解决
  2. 使用javascript重置iframe的src或者用javascript动态生成iframe并插入到相应节点

Opera(presto)
问题:

  1. designMode下无法显示flash

解决方案:

  1. 无法解决

唯一能正确处理iframe的是webkit,越来越喜欢它了,chrome快点出插件,Maxthon3快点完成开发吧。

待续。。。。

支付宝集成经验之技术支持问题

经过三天的努力,终于把接口调通了。在调试的过程中,遇到了一些文档中未提到的问题。而且也发现了文档和PHP编程接口的一些缺陷和错误。
这些缺陷和错误可能给开发者带来了一些误导。

文档错误:
1)所有的文档中都把错误代码HAS_NO_PRIVILEGE(没有权限访问该服务)写成HASNO_PRIVILEGE。

 
文档缺陷:
1)文档《标准快速付款接口文档 V2.0》和《批量付款到帐号》中关于数字签名部分有内容不明确。
《标准快速付款接口文档 V2.0》5.2.4. 支付宝系统返回处理结果:

支付宝系统接收到商户系统发起的请求,处理成功后返回的参数中同样包含有参数sign、sign_type,商户需根据sign_type 计算sign 值,最终检验支付宝系统返回的sign 值,这里要注意的是商户需要对每一个返回参数的值先进行decode 后再验证sign。

这里的decode我的理解应该是转换编码的意思吧?!但第一次看会很直觉地以为是urldecode。

2)文档中没有提到,本地以某种编码提交给支付宝,支付宝在发通知的时候就会以该编码对数据进行编码并发回本地。虽然这是比较容易想到的,但是文档还是应该说清楚。毕竟,搞错编码是网络传输中经常会出问题。
3)支付宝返回到我的return_url中的参数中,is_success这个参数没有说明,虽然字面就看得出来,但是写到文档里也没什么不好吧。
4)文档《标准快速付款接口文档 V2.0》中没有错误代码TRADE_SELLER_NOT_MATCH,网上查了好像是网址不匹配还是什么原因,不清楚。重现方法:用测试帐号***@***.com发个out_trade_no为1的请求就会出现。
5)文档中还没提到,当网站使用非第三方权威机构签名的SSL证书时,将收不到支付宝的notify。确认已经加了notify_url。

PHP编程接口缺陷:
1)编程接口及示例代码写得过于随便,出现明显的错误
批量支付示例代码index.php中

"pay_date" => date(Ymd),  //付款日期 格式20070412

应为

"pay_date" => date('Ymd'),  //付款日期 格式20070412
"batch_no"  => date(Ymdhms) , //批量付款订单号

应为

"batch_no"  => date('Ymdhms') , //批量付款订单号

出现这个错误,说明了支付宝在发demo代码给用户时没有先测试,至少是发给我的这份没有,因为这个demo是不可能运行得起来的。

2)alipay_service.php中

if($parameter['_input_charset'] == "")

应为

if (array_key_exists('_input_charset', $parameter))

否则,当传进来的$parameter不包含_input_charset项是会出现错误Undefined index: _input_charset

3)编程接口能写得完善一些,实现DSA签名和RAS签名功能

另外,demo代码中把提交表单的按钮放到form外面了。一开始我没注意为什么要这么做,后来遇到签名错误时,弄了一个小时才发现,原来的我把提交按钮放到了FORM里面,并给了提交按钮一个name属性。这导致了提交到支付宝的数据中多了一项,导致签名错误。这是一个很隐蔽的陷阱,在文档中明确提醒集成开发者,相信会对集成开发者有很大的帮助。避免像我一样浪费了一个小时才找到错误原因。

httpd、php编译参数

PHP编译参数

CFLAGS="-O2" ./configure --prefix=/usr/local --with-config-file-path=/etc \
--with-apxs2=/usr/local/httpd/bin/apxs  --with-libdir=lib --with-mysql=no  \
--disable-ipv6 --disable-tokenizer --disable-short-tags --enable-mbstring=shared  \
--with-gettext=shared --with-regex=php --with-freetype-dir=/usr/local --with-gd=shared \
--with-png-dir=/usr/local --with-jpeg-dir=/usr/local --with-pdo-mysql=shared,/usr/local/mysql \
--enable-pdo=shared --with-pdo-sqlite=shared --with-sqlite=shared --with-openssl-dir=/usr/local/openssl \
--with-openssl=/usr/local

APR编译参数

CFLAGS="-O2" ./configure --prefix=/usr/local

APR-UTIL编译参数

CFLAGS="-O2" ./configure --prefix=/usr/local/apr-util/ --with-apr=/usr/local/apr --with-mysql=/usr/local/mysql/

HTTPD编译参数

LDFLAGS="-L/usr/local/apr/lib" ./configure --prefix=/usr/local/httpd --with-apr=/usr/local/apr  \
--with-ssl=/usr/local/openssl --enable-mods-shared=all --enable-so --with-apr-util=/usr/local/apr-util \
--enable-modules=all --enable-isapi=shared --enable-cgi=shared --enable-ssl=shared

MySQL安装步骤

  1. 添加mysql用户组和mysql用户
  2. 从源码编译安装
  3. 把mysql/support-files/my-small.cnf(根据实际情况可选择my-large.cnf或者my-medium.cnf)复制到/etc/my.cnf
  4. 把mysql/support-files/mysql.server复制到/etc/init.d/mysqld,并添加可执行权限;
  5. 运行 mysql/bin/mysql_install_db安装数据库文件
  6. 将mysql/var的所有者设置成mysql
  7. 设置用户权限和密码
GRANT ALL PRIVELEGES ON *.* TO root@'%' IDENTIFIED BY 'password';

操作系统:CentOS 5.2

关闭防火墙

在家做开发开着防火墙是没什么意义的,只会惹来一堆麻烦,关掉为好。

临时关闭

/etc/init.d/iptables stop

永久关闭

chkconfig --level 35 iptables off

CentOS国际化配置

配置文件

/etc/sysconfig/i18n

设置为相应的区域和编码就行了

LANG="zh_CN.UTF-8"