2009 年 05 月

浏览模式: 标准 | 列表 | 图文
Anders将重返Delphi舞台?

Anders将重返Delphi舞台?

新闻来源:Microsoft Member
作为Delphi和C#架构的先驱,Anders Hejlsberg已在这两种语言上活跃了很久,而Anders应邀加入微软后,似乎Delphi多年来一直没有什么起色,处于相当被动的地位。现在,是Anders回归Delphi怀抱的时候了吗?据微软内部员工的透露,Delphi和C#的架构者Anders Hejlsberg将于下个月重拾Delphi,继续为Delphi的发展起到领头羊的作用。

而许多人所关心的,Anders回去做什么,至今还没有一个可靠的答复。

据称,当初Anders离开Borland,是因为与高层的思想不合拍,引起了冲突后,Anders一怒而去。而现在,是不是他又与微软的高层擦出了火。 在Delphi被Embarcadero(中文名称英巴卡迪诺公司)收购后,一年来有了比较大的起色,Anders或许是想借这个契机重回Delphi的 战线。

希望Anders能为Delphi,为Embarcadero旗下的CodeGear带来一个新的生命,这也是为无数的Delphi/Pascal爱好者带来第二次生命。

php优化:apc缓存

APC其实是PHP5自带的东西,只需要把xxx.dll前的注释去掉就可以用了,不象其他的加速 ,还需要装软件,什么xCache啦,eacceraltor之类的,都需要额外编译好之后放到扩展目录下才行(当然我说的是windows下面的,linux下面就不太一样了)

既然是自带的,又这么好,总要有个介绍的吧?

原文:http://blog.goguoguo.com/html/y2009/311.html

作者:土 豆

先说说php程序的执行流程吧,说明了这个,才好开始我们的优化之旅。

客户端(譬如浏览器)
—》请求Get hello.php
—-》cgi服务器接(譬如apache)收到请求,根据配置寻找php的处理程序(譬如mod_php)
—-》apache加载php的处理程序,php的处理程序读取php.ini初始化php的解释环境
—-》mod_php定位寻找hell.php,将其载入到内存中来
—-》mod_php编译源代码成为opcode树
—-》mod_php执行opcode树
—-》生成结果给浏览器

在这个过程中我们有哪些地方可以优化呢:
1 将mod_php fast-cgi化,避免每次都要加载这个模块,这个模块还要每次都去初始化php的解释环境
2 缓存php文件的opcode码,这样话,避免每次都去编译。

缓存opcode码有很多软件,apc、以及zend提供的cache等。
转载一个apc的配置和使用:

Alternative PHP Cache(APC)是 PHP 的一个免费公开的优化代码缓存。它用来提供免费,公开并且强健的架构来缓存和优化 PHP 的中间代码。

在 Windows 下,APC 要求有 c:\tmp 目录,并且该目录要对 Web 服务器进程可写。

1. 安装:

以PHP extension 形式安装.

2. 配置
apc.enabled boolean
apc.optimization optimization
选项在脚本中可以改变

APC PHP.ini配置选项详解

[APC]
; Alternative PHP Cache 用于缓存和优化PHP中间代码

apc.cache_by_default = On
;SYS
; 是否默认对所有文件启用缓冲。
; 若设为Off并与以加号开头的apc.filters指令一起用,则文件仅在匹配过滤器时才被缓存。

apc.enable_cli = Off
;SYS
; 是否为CLI版本启用APC功能,仅用于测试和调试目的才打开此指令。

apc.enabled = On
; 是否启用APC,如果APC被静态编译进PHP又想禁用它,这是唯一的办法。

apc.file_update_protection = 2
;SYS
; 当你在一个运行中的服务器上修改文件时,你应当执行原子操作。
; 也就是先写进一个临时文件,然后将该文件重命名(mv)到最终的名字。
; 文本编辑器以及 cp, tar 等程序却并不是这样操作的,从而导致有可能缓冲了残缺的文件。
; 默认值 2 表示在访问文件时如果发现修改时间距离访问时间小于 2 秒则不做缓冲。
; 那个不幸的访问者可能得到残缺的内容,但是这种坏影响却不会通过缓存扩大化。
; 如果你能确保所有的更新操作都是原子操作,那么可以用 0 关闭此特性。
; 如果你的系统由于大量的IO操作导致更新缓慢,你就需要增大此值。

apc.filters =
;SYS
; 一个以逗号分隔的POSIX扩展正则表达式列表。
; 如果源文件名与任意一个模式匹配,则该文件不被缓存。
; 注意,用来匹配的文件名是传递给include/require的文件名,而不是绝对路径。
; 如果正则表达式的第一个字符是”+”则意味着任何匹配表达式的文件会被缓存,
; 如果第一个字符是”-”则任何匹配项都不会被缓存。”-”是默认值,可以省略掉。

apc.ttl = 0
;SYS
; 缓存条目在缓冲区中允许逗留的秒数。0 表示永不超时。建议值为7200~36000。
; 设为 0 意味着缓冲区有可能被旧的缓存条目填满,从而导致无法缓存新条目。

apc.user_ttl = 0
;SYS
; 类似于apc.ttl,只是针对每个用户而言,建议值为7200~36000。
; 设为 0 意味着缓冲区有可能被旧的缓存条目填满,从而导致无法缓存新条目。

apc.gc_ttl = 3600
;SYS
; 缓存条目在垃圾回收表中能够存在的秒数。
; 此值提供了一个安全措施,即使一个服务器进程在执行缓存的源文件时崩溃,
; 而且该源文件已经被修改,为旧版本分配的内存也不会被回收,直到达到此TTL值为止。
; 设为零将禁用此特性。

apc.include_once_override = Off
;SYS
; 关于该指令目前尚无说明文档,参见:http://pecl.php.net/bugs/bug.php?id=8754
; 请保持为Off,否则可能导致意想不到的结果。

apc.max_file_size = 1M
;SYS
; 禁止大于此尺寸的文件被缓存。

apc.mmap_file_mask =
;SYS
; 如果使用–enable-mmap(默认启用)为APC编译了MMAP支持,
; 这里的值就是传递给mmap模块的mktemp风格的文件掩码(建议值为”/tmp/apc.XXXXXX”)。
; 该掩码用于决定内存映射区域是否要被file-backed或者shared memory backed。
; 对于直接的file-backed内存映射,要设置成”/tmp/apc.XXXXXX”的样子(恰好6个X)。
; 要使用POSIX风格的shm_open/mmap就需要设置成”/apc.shm.XXXXXX”的样子。
; 你还可以设为”/dev/zero”来为匿名映射的内存使用内核的”/dev/zero”接口。
; 不定义此指令则表示强制使用匿名映射。

apc.num_files_hint = 1000
;SYS
; Web服务器上可能被包含或被请求的不同源文件的大致数量(建议值为1024~4096)。
; 如果你不能确定,则设为 0 ;此设定主要用于拥有数千个源文件的站点。

apc.optimization = 0
; 优化级别(建议值为 0 ) 。
; 正整数值表示启用优化器,值越高则使用越激进的优化。
; 更高的值可能有非常有限的速度提升,但目前尚在试验中。

apc.report_autofilter = Off
;SYS
; 是否记录所有由于early/late binding原因而自动未被缓存的脚本。

apc.shm_segments = 1
;SYS
; 为编译器缓冲区分配的共享内存块数量(建议值为1)。
; 如果APC耗尽了共享内存,并且已将apc.shm_size指令设为系统允许的最大值,
; 你可以尝试增大此值。

apc.shm_size = 30
;SYS
; 每个共享内存块的大小(以MB为单位,建议值为128~256)。
; 有些系统(包括大多数BSD变种)默认的共享内存块大小非常少。

apc.slam_defense = 0
;SYS(反对使用该指令,建议该用apc.write_lock指令)
; 在非常繁忙的服务器上,无论是启动服务还是修改文件,
; 都可能由于多个进程企图同时缓存一个文件而导致竞争条件。
; 这个指令用于设置进程在处理未被缓存的文件时跳过缓存步骤的百分率。
; 比如设为75表示在遇到未被缓存的文件时有75%的概率不进行缓存,从而减少碰撞几率。
; 鼓励设为 0 来禁用这个特性。

apc.stat = On
;SYS
; 是否启用脚本更新检查。
; 改变这个指令值要非常小心。
; 默认值 On 表示APC在每次请求脚本时都检查脚本是否被更新,
; 如果被更新则自动重新编译和缓存编译后的内容。但这样做对性能有不利影响。
; 如果设为 Off 则表示不进行检查,从而使性能得到大幅提高。
; 但是为了使更新的内容生效,你必须重启Web服务器。
; 这个指令对于include/require的文件同样有效。但是需要注意的是,
; 如果你使用的是相对路径,APC就必须在每一次include/require时都进行检查以定位文件。
; 而使用绝对路径则可以跳过检查,所以鼓励你使用绝对路径进行include/require操作。

apc.user_entries_hint = 100
;SYS
; 类似于num_files_hint指令,只是针对每个不同用户而言。
; 如果你不能确定,则设为 0 。

apc.write_lock = On
;SYS
; 是否启用写入锁。
; 在非常繁忙的服务器上,无论是启动服务还是修改文件,
; 都可能由于多个进程企图同时缓存一个文件而导致竞争条件。
; 启用该指令可以避免竞争条件的出现。

apc.rfc1867 = Off
;SYS
; 打开该指令后,对于每个恰好在file字段之前含有APC_UPLOAD_PROGRESS字段的上传文件,
; APC都将自动创建一个upload_的用户缓存条目(就是APC_UPLOAD_PROGRESS字段值)。

3. 函数:

apc_cache_info - Retrieves cached information (and meta-data) from APC’s data store
apc_clear_cache - Clears the APC cache
apc_define_constants - Defines a set of constants for later retrieval and mass-definition
apc_delete - Removes a stored variable from the cache
apc_fetch - Fetch a stored variable from the cache
apc_load_constants - Loads a set of constants from the cache
apc_sma_info - Retrieves APC’s Shared Memory Allocation information
apc_store - Cache a variable in the data store

apc的用法比较简单,只有几个函数,列举如下。
apc_cache_info () 返回缓存信息
apc_clear_cache() 清除apc缓存内容。
默认(无参数)时,只清除系统缓存,要清除用户缓存,需用‚user‘参数。
apc_define_constants ( string key, array constants [, bool case_sensitive] ) 将数组constants以常量加入缓存。
apc_load_constants (string Key)。
取出常量缓存。
apc_store ( string key, mixed var [, int ttl] )。
在缓存中保存数据。
apc_fetch ( string key )。
获得apc_store保存的缓存内容
apc_delete ( string key )。
删除apc_store保存的内容。

apc的管理:
到pecl.php.net下载apc源码包有个apc.php,copy到你的web server可以访问到的地方,浏览即可访问。
管理界面功能有:
1. Refresh Data
2. View Host Stats
3. System Cache Entries
4. User Cache Entries
5. Version Check
apc


配置php.ini的时候一定要跟进编译选项来放置这些扩展的位置。
默认apc.so要放到php.ini同一个目录下,而不是传说中的extension目录。

Ubuntu创始人:Linux的未来并不在于对Windows的兼容性

Ubuntu创始人:Linux的未来并不在于对Windows的兼容性

Ubuntu的创始人Mark Shuttleworth最近对桌面Linux以及其未来发表了一些比较重要的言论,他说Linux的未来不在对Windows的兼容性上面。在其发言中,他特意提到了Wine这个程序——这是一个可以在Linux上提供对Windows程序的支持的程序,如果要想从Windows迁移到Linux,而你有些程序无法割舍,使用它再好不过,而且很多时候你会发现你想要的程序在Windows下才有。

Mark Shuttleworth称,类似Wine的兼容Windows的程序或者工程其重要程序不言而喻,但Linux的未来不在于对Windows的兼容性。 Linux与Windows有着本质的区别。linux作为自由软件,这个平台是否成功要依靠自身的发展,如果使用linux只是一种运行Windows 程序的媒介,那么linux永远不会有成功的那一天。
虽然他仅仅针对Ubuntu发表以上言论,但是很显然这番言论对任何linux版本都是合适的。正如他所说,在linux模拟运行 Windows程序并不能很好的抢占这个市场。linux开发者应该把重点放在核心应用上,让linux也可实现所有Windows才可实现的功能。

原文:alect
来自:http://www.cnbeta.com/articles/83517.htm
setInterval的郁闷之处

setInterval的郁闷之处

使用这个函数还是有点小郁闷的。网上的资料现在大多被AS的资料所覆盖,一般来说setInterval是传递两个参数,这与setTimeout 一样,第一个是方法,第二个是时间,但由于网上找的大多是AS下的setInterval,这就造成了理解错误,正常情况下AS下的 setInterval的参数也是(方法,时间),但setInterval也可以是(对象,方法,时间),甚至更多的参数用来传递给方法。

那么,JS下面的setInterval怎么使用对象中的方法呢?其实很简单,直接使用连接符就行了:setInterval("对象.方法()" , 时间 ),但参数好象是没有办法传递的,如果实在要传,你就只要自己写同名方法覆盖掉系统的setInterval了。

网上有个例子,但我没有运行成功,所以我也不在这里贴出来,主要还是那个callee,arguments这些东东,网上也有很多例子,类似于PHP的func_get_args,利用这个进行伪重载。

呵呵

Mysql设置NOT NULL 在pdo插入为空时候返回false

Mysql设置NOT NULL 在pdo插入为空时候返回false

本文来自向东的博客:http://www.xiangdong.org/blog/post/1756/

但本人有不同看法。。。

`source` char(255) NOT NULL,
`score` int(11) NOT NULL,


Mysql设置NOT NULL 在pdo插入该字段source为空时候返回false,初看你就奇怪了,为何设置的时候为not null,但是在插入的时候会为null呢?
是这样的,当时开发时候的需求不很明显,但是最后在开发收尾的时候发现这个字段可有可无,而且我们提供的是接口调用,人家就会问了,你这个参数填写什么, 而很有可能就说那个参数啊,可以为空啊,呵呵,这下好了,那个字段刚好可能会出现NULL,和NOT NULL冲突,于是插入数据库出现返回false,而我们又是接口调用,尽量做到给用户返回成功的代码,于是这个插入数据库错误的问题可能会隐藏,最后解 决办法是将数据库source字段改为可以为null!



ALTER TABLE `a` CHANGE `a` `a` INT( 11 ) NOT NULL DEFAULT NULL
ALTER TABLE `a` CHANGE `a` `a` INT( 11 ) NULL DEFAULT NULL

上面这段我还是觉得有问题的,一般情况话,如果设置了NOT NULL,那么default 还是设为0吧。除非你的0在系统中是特殊值。

90/10原理

90/10原理

本文来自向东的博客:http://www.xiangdong.org/blog/post/1756/,有删节
读过由Stephen Covey发现的90/10原理,您的一生或许会有所改变,至少,您对待事情的态度会与以前不一样了。

什么是90/10原理?即在您的一生中,只有10%的事情您无能为力,而90%的事情都在您的把握之中。

我们无法阻止汽车老化出故障,我们无法预料飞机晚点,我们的行程可能被司机耽误在路上,等等,这些都是我们没办法控制的事件。然而剩下90%则不一样了,比如您可能左右不了红灯,却能控制您等车的情绪。请看下面的例子:

您正与家人共进早餐,女儿不小心打翻了咖啡杯,弄脏了您的西服。这是突发事件,您无法阻止它发生,而接下来事情如何发展,则完全取决于您的反应。

您 勃然大怒,严厉地训斥女儿,她大哭起来。训斥完女儿,您转向您的太太,责怪她把咖啡杯放得离桌沿太近,您太太与您发生了争吵。之后您愤然上楼,换了件干净 衣服,下楼时发现女儿仍然在哭,耽误了早餐,也因此错过了校车。太太也要赶时间,所以您要负责送女儿去学校,由于已经迟到,您以40km/h的时速在限速 30km/h的区域飞驰。为此您被罚款60美金并且耽误了额外的15分钟。学校到了,女儿头也不回地径直奔向学校。当您到公司时,已经迟到了20分钟,而 且这时您发现忘了带公文包。接下来的这一天,事情变得越来越糟糕,您期盼着能够早点下班回家。回到家中,您能够明显感觉到女儿和太太对您的疏远。这一切都 是为什么?因为咖啡,女儿,或是警察,还是自己?答案是您自己。

对于打翻的咖啡杯,您无能为力,而接下来那五秒钟的表现,却决定了一天。下面是另外一种情形:

咖 啡杯不小心打翻,弄脏了您的衣服,女儿马上就要哭了,您温柔地说:“孩子,没关系,下次小心一点就好了。”您拿起餐巾稍加擦拭,然后上楼换了件干净衣服。 您提起公文包准时下楼,通过窗户目送女儿上了校车,女儿转身向您挥手再见。您提前五分钟到达公司,并愉快地跟同事们问好。

是不是区别很大?同样的开头,不一样的结局。有些事情您真的无能为力,但是大部分情况,您是可以掌控的。

我 们应该怎么做?如果有人说你坏话,别放在心上,不要让负面评论影响了你的行为。正确的反应,会为你挽回美好的一天,而不适当的表现,可能导致你失去朋友, 丢掉饭碗,或者背负沉重的压力。设想一下开车的你遇到交通堵塞时可能的反应,失去耐心?敲打方向盘(曾经有个朋友把方向盘捶掉了……)?漫骂?血压升高? 谁会在乎你迟到几分钟呢?为什么平静的一天要因此而黯淡?当你被开除了,想想90/10原理吧,为什么要辗转反侧,怒不可遏呢?没有用的,用这些时间和精 力来找新工作吧。飞机晚点,你的行程被延误,为什么要把气撒到飞机上,利用这点时间来学习,来观察一下行人,急躁只会让事情变得更糟。

现 在你知道了什么是90/10原理,把它应用到你的生活当中吧,你会发现效果很神奇,你甚至将不再失去任何东西。千百万的人被问题困扰,被压力和头痛折磨, 我们很需要90/10原理,它会改变你的生活,你需要的只是一点点意志力去执行它。期待回报之前,先看看自己有没有付出,也许付出了得不到回报,但是你仍 然心安理得,因为你的心灵已经打上了爱的烙印。

网站图标 网站头像 favicon.ico

网站图标 网站头像 favicon.ico

其实,贴这个文章还有一个用意。不知道大家看过自己的apache的errorlog没,每一次访问,其实浏览器都会查找这个favicon.ico文件,如果没有,就会生成一个404,也就是apache的ErrorLog记录。

而在网页中,一个404会堵塞浏览器的进程挺长时间,所以,在有可能的情况下,还是为自己的网站放上这个文件,一来是为自己的网站做个小广告,二来,也是提高游客的访问速度。

以下是原文:http://blog.goguoguo.com/html/y2009/298.html

作者:土豆

现在很多浏览器都会在地址栏、收藏栏、tab页上面显示一个网站的图标。这个图标就是你站点根目录下的favicon.ico文件。这是浏览器默认的动作,通过抓包工具可以很明显的看到,如tt浏览器,没有缓存的情况下,打开页面的时候就回去get一下/favicon.ico。
当然也可以显示去指定,这样的话可以控制ico图片所在的路径,以及这个图片的格式。在html文件中加入如下的代码就好了:

如何方便的来制作这个网站图标呢,参考如下的一些在线制作的工具,可以省去很大一部分的工作:

国产 制作ico图标 不过生成的ico文件稍微有一点大。
国外 制作ico图标 效果好一些。
更多参考和推荐

车东的博客还带有图片展示的,可以去看个究竟哦。

备注:
1 上传了ico到你的网站的根目录下后,如果通过地址获取的时候提示你保存的话,说明你的服务器不支持这种类型的mime-type,需要修改一下服务器的配置。
如lighttpd,在mime-type配置下,增加:
“.ico” => “image/x-icon”,
还不行的话,打开这个选项:mimetype.use-xattr = “enable”
2 对于很多服务器的设置都没有明显的针对ico类型的文件来设置过期时间的,由于ico文件很少进行变化,需要将其过期时间设置长一点。我的时一年。
lighttpd中修改配置如下:
$HTTP["url"] =~ “\.ico$” {
expire.url = ( “” => “access 1 years” )
}

3 如果你刷新了浏览器还是看不到你的网站图标的话,你需要清空一下浏览器的cache。重启浏览器试一下。

快去试试吧!

PHP语言中global和$GLOBALS[]的分析

PHP语言中global和$GLOBALS[]的分析

原来以为global和$GLOBALS除了写法不一样以为,其他都一样,可是在实际应用中发现,2者的区别还是很大的!
先看下面的例子:

<?php
// 例子1
function test_global() {
global $var1, $var2;
$var2 =& $var1;
}
function test_globals() {
$GLOBALS['var3'] =& $GLOBALS['var1'];
}
$var1 = 5;
$var2 = $var3 = 0;
test_global();
print $var2 ."\n";
test_globals();
print $var3 ."\n";
?>

执行结果为:
0
5

怎么会这样呢?不应该是2个5吗?怎么会出现1个0和1个5呢?

恩,我们保留以上问题,深入分析$GLOBALS和global的原理!

我们都知道变量其实是相应物理内存在代码中的"代号",假设我们上面声明的3个变量分配的内存如下图表示:

引用php手册的$GLOBALS的解释:

Global 变量:$GLOBALS
注意: $GLOBALS 在 PHP 3.0.0 及以后版本中适用。

由所有已定义全局变量组成的数组。变量名就是该数组的索引。

这是一个“superglobal”,或者可以描述为自动全局变量。
也就是说上面代码中的$var1和$GLOBALS['var1']是指的同一变量,而不是2个不同的变量!

下面来分析global到底做了什么?

我们都知道php中的函数所产生的变量都是函数的私有变量,那么global关键字产生的变量也肯定逃不出这个规则,为什么这么说呢,看下面的代码:

<?php
// 例子2
function test() {
global $a;
unset($a);
}

$a = 1;
test();
print $a;
?>

复制代码
执行结果为:
1
为什么会输出1呢?不是已经把$a给unset了吗?unset失灵了?php的bug?

都不是,其实unset起作用了,是把test函数中的$a给unset掉了,可以在函数后面加入
print $a;
复制代码
来测试!也就是说global产生了test函数外部$a的别名变量“$a”,为了和外面的$a区别,我把它成为--test->$a,那么例子1也这么命名的话,可得出下面的图:
[没有图,谢谢,忽悠你的]



接着回到上面的例子1,看test_global中的这一代码“$var2 =& $var1;”,上面是一个引用赋值运算,也就是$var2将指向var1所指向的物理内存地址,所以例子1执行过test_global函数以后,变量的变化由下图可以看出:
[没有图,谢谢,忽悠你的]
而test_globals执行过以后,看变量的变化:

此时,看图,就能理解为什么例子1执行完以后,$var2是0,而$var3是5了!

所以我们得出一个结论,在函数中global和$GLOBALS[]的区别在于:

global在函数产生一个指向函数外部变量的别名变量,而不是真正的函数外部变量,一但改变了别名变量的指向地址,就会发生一些意料不到情况,例如例子1.

$GLOBALS[]确确实实调用是外部的变量,函数内外会始终保持一致!

文章来自:向东的博客,http://www.xiangdong.org/blog/post/1749/

想重装系统,但一直很犹豫

想重装系统,但一直很犹豫

笔记本系统想重装一下,但,很犹豫。毕竟现在这么多的设置,如果要一一保存,又担心会有遗漏的。
如果不重装,总觉得那丢失的1G内存让我不开心。呵呵。

再加上又没有光驱,其实,重装一次也是很烦恼的事情。所以犹豫啊。
Windows7,windows2008,该装哪个,迷惘中

更新了PHPOO.COM的LOGO

昨天和小茗说了一下,请他帮忙做一个LOGO,今天下午一上班就收到他发来的LOGO,立马给phpoo.com替换了一下

给各位欣赏一下:


不要鸡肚,oh yeah

感谢小茗