2011 年 01 月

浏览模式: 标准 | 列表 | 图文
Yii Rewrite中遇到的困惑

Yii Rewrite中遇到的困惑

用Yii开发的时候,总是会有涉及到rewrite,否则,网址里一堆 index.php?r=xxxx那就真的太长了。

关于rewrite,可以参考官方的guide,不过上面只有针对apache的htaccess配置。如果是nginx,你还可以搜索一下官方的wiki,有介绍nginx的配置的。只是官方上面用的方法是try_file,只针对高版本的。如果是低版本还是得用 if (!e $request_filename)这类的【更多设置请搜索google】我这里不详细说了。

今天在用官方推出的这一种rewrite功能【Parameterizing Hostnames 】的时候,出了点问题,该功能是:

Parameterizing Hostnames

Starting from version 1.0.11, it is also possible to include hostname into the rules for parsing and creating URLs. One may extract part of the hostname to be a GET parameter. For example, the URL http://admin.example.com/en/profile may be parsed into GET parameters user=admin and lang=en. On the other hand, rules with hostname may also be used to create URLs with paratermized hostnames.

In order to use parameterized hostnames, simply declare URL rules with host info, e.g.:

array(
'http://<user:\w+>.example.com/<lang:\w+>/profile' => 'user/profile',
)

The above example says that the first segment in the hostname should be treated as user parameter while the first segment in the path info should be lang parameter. The rule corresponds to the user/profile route.

Note that CUrlManager::showScriptName will not take effect when a URL is being created using a rule with parameterized hostname.

Also note that the rule with parameterized hostname should NOT contain the sub-folder if the application is under a sub-folder of the Web root. For example, if the application is under http://www.example.com/sandbox/blog, then we should still use the same URL rule as described above without the sub-folder sandbox/blog.

我在rules里写上了 "http://user.xxx.com/<_c:\w+>/<_a:\w+>"=>"user/<_c>/<_a>/"

然后发现访问 http://user.xxx.com/aaa/bbb/id/1的时候出现了404错误,找问题死活找不到在哪里。再转过头去看了很多其他的配置,发现都不正常。

然后,我尝试访问默认页,即没有参数的:http://user.xxx.com/default/index,咦,居然正常了。。但问题随之而来,其他链接都不正常,经过不停的测试测试再测试。最终发现,把""user/<_c>/<_a>/" 中最后一个 / 去掉就正常了。

那么,'<_m:\w+>/<_c:\w+>/<_a:\w+>' => '<_m>/<_c>/<_a>/' 和 '<_m:\w+>/<_c:\w+>/<_a:\w+>' => '<_m>/<_c>/<_a>' 的区别是什么呢?

仔细看了一下生成的链接,如果用第二种的时候,如果有多个参数,就转为 m/c/a?a=b&c=d 而如果用第一种就是生成 m/c/a/a/b/c/d 。这时候,系统可能会识别不出我这种用二级域名做rewrite的方式。于是,我去掉了最后一个“/”,一切都正常了。

期间,HM和Horadric.Cube多次对我帮助,告诉我不同的nginx参数的配置。灰常感谢。

Creating a absolute path from a relative URL

Creating a absolute path from a relative URL

上午hihiyou问我,如何把“http://www.ss126.com/shop/../../bigimg/../bigimg/china-ef.com_200951117215473416.jpg”转换成实际路径的时候,我写了一个简单的方法:

$url = 'http://www.ss126.com/shop/../../bigimg/../bigimg/china-ef.com_200951117215473416.jpg';

$pathinfo = array(
'path'=>'???',//相当于项目的根目录
'url'=> 'http://www.ss126.com/'
);

$url = realpath(str_replace($pathinfo['url'],$pathinfo['path'],$url)); //获取实际路径
//然后
if(strpos($url,$pathinfo['path'])!==false){//防止路径乱掉,或者进入其他目录
$url = str_replace($pathinfo['path'],$pathinfo['info'],$url);
}else{
$url = $pathinfo['url'];
}

结果,他告诉我,不是本地程序。然后找了这样的代码 。。。

<?php

$url = "http://www.goat.com/money/dave.html";
$rel = "../images/cheese.jpg";

$com = InternetCombineURL($url,$rel);

// Returns http://www.goat.com/images/cheese.jpg

function InternetCombineUrl($absolute, $relative) {
$p = parse_url($relative);
if($p["scheme"])return $relative;

extract(parse_url($absolute));

$path = dirname($path);

if($relative{0} == '/') {
$cparts = array_filter(explode("/", $relative));
}
else {
$aparts = array_filter(explode("/", $path));
$rparts = array_filter(explode("/", $relative));
$cparts = array_merge($aparts, $rparts);
foreach($cparts as $i => $part) {
if($part == '.') {
$cparts[$i] = null;
}
if($part == '..') {
$cparts[$i - 1] = null;
$cparts[$i] = null;
}
}
$cparts = array_filter($cparts);
}
$path = implode("/", $cparts);
$url = "";
if($scheme) {
$url = "$scheme://";
}
if($user) {
$url .= "$user";
if($pass) {
$url .= ":$pass";
}
$url .= "@";
}
if($host) {
$url .= "$host/";
}
$url .= $path;
return $url;
}

?>

好吧。我承认,上面这个更方便一点。

Python学习资源

Python学习资源

学习Python的时候,还是翻了一些资料,也看到了一些资源。收集着,以后慢慢看。

http://woodpecker.org.cn/abyteofpython_cn/chinese/index.html
嗯,http://woodpecker.org.cn/,这个网上有很多Python的资源哦。
然后在这个网站还有这些链接哦

都挺不错。也几乎点开看了。。相对于这个,我其实更喜欢这样的CHM文件,

这两个链接里,可是有CHM文件下载的哦。

转:PHP工程师面临的成长瓶颈

转:PHP工程师面临的成长瓶颈

不说太多的东西,做PHP做到后面,剩下的就不是代码问题了。而是对系统有多么深入的了解以及更多的架构问题,工匠和大师的区别在于,工匠只能、只会砌房子,而大师在砌房子 时候会思考。当然我只是一个工匠,说的难听一点就是代码编写员,再难听一点叫做埋雷手。

嗯,这是一篇关于PHPer未来成长热趋势的文章,它来自于PHP工程师面临的成长瓶颈:很不错。可以看看,内容如下:

  作为开发中应用最广泛的语言之一,PHP有着大量的粉丝,那么你是一名优秀的程序员吗?在进行自我修炼的同时,你是否想过面对各种各样的问题,我该如何突破自身的瓶颈,以便更好的发展呢?
PHP工程师面临成长瓶颈

  先明确这里所指的PHP工程师,是指主要以PHP进行Web系统的开发,没有使用其的语言工作过。工作经验大概在3~4年,普通的Web系统(百万级访问,千成级数据以内或业务逻辑不是特别复杂)开发起基本得心应手,没有什么问题。但他们会这样的物点:

  ◆除了PHP不使用其它的语言,可能会点shell 脚本。

  ◆对PHP的掌握不精(很多PHP手册都没有看完,库除外)。

  ◆知识面比较窄(面对需求,除开使用PHP和mysql ,不知道其它的解决办法)。

  ◆PHP代码以过程为主,认为面向对象的实现太绕,看不懂。

  这些PHPer在遇到需要高性能,处理高并发,大量数据的项目或业务逻辑比较复杂(系统需要解决多领域业务的问题)时,缺少思路。不能分析问题 的本质,技术判断力比较差,对于问题较快能找出临时的解决办法,但常常在不断临时性的解决办法中,系统和自己一步步走向崩溃。那怎么提高自己呢?怎么可以 挑战难度更高的系统?

  更高的挑战在那里?

  结合我自己的经验,我列出一些具体挑战,让大家先有个感性的认识。

  高性能系统的挑战在那里?

  ◆如何选择Web服务器?要不要使用fast-cgi 模式;

  ◆要不要使用反向代理服务?选择全内存缓存还是硬盘缓存?

  ◆是否需要负载均衡?是基于应用层,还是网络层? 如何保证高可靠性?

  ◆你的PHP代码性能如何,使用优化工具后怎么样? 性能瓶颈在那里? 是否需要写成C的扩展?

  ◆用户访问有什么特点,是读多还是写多?是否需要读写分离?

  ◆数据如何存储?写入速度和读出速度如何? 数据增涨访问速读如何变化?

  ◆如何使用缓存? 怎么样考虑失效?数据的一致性怎么保证?

  高复杂性系统的挑战在那里?

  ◆能否识别业务所对应的领域?是一个还是多个?

  ◆能否合理对业务进行抽象,在业务规则变化能以很小的代价实现?

  ◆数据的一致性、安全性可否保证?

  ◆是否撑握了面向对象的分析和设计的方法

  这里所列出的问题,你都能肯定的回答,说明在技术上你基本已经可能成为架构师了。如何你还不能回答,你需要在以下几个方向加强。

  怎么样提高,突破瓶颈

  如何你还不能回答,你需要在以下几个方向加强:

  ◆分析你所使用的技术其原理和背后运行的机制,这样可以提高你的技术判断力,提高你技术方案选择的正确性;

  ◆学习大学期间重要的知识, 操作系统原理,数据结构和算法。知道你以前学习都是为了考试,但现在你需要为自己学习,让自己知其所以然;

  ◆重新开始学习C语言,虽然你在大学已经学过。这不仅是因为你可能需要写PHP扩展,而且还因为,在做C的应用中,有一个时刻关心性能、内存控制、变量生命周期、数据结构和算法的环境;

  ◆学习面向对象的分析与设计,它是解决复杂问题的有效的方法。学习抽象,它是解决复杂问题的唯一之道。

loadMask

loadMask

loadmask 这个小插件不错,可以让指定的DIV上出现那种类似于extjs的等待框,当内容加载完毕后,可以通过 unmask方法来解除等待框的状态。。。

程序也很小,不到2K。当然不是我写的。。是google上的一个小插件。嗯,其实我也会写,但我真不会CSS。。。

看介绍:

LoadMask jQuery plugin can mask DOM elements while their content is loading or changing to prevent user interactions and inform that some background task is still running. It is very light (~2Kb) and easy to use.

The behavior of this plugin is largely based on handy Element.mask() method from ExtJS Framework.

也有例子:You can try online demo here.

内容在这里:http://code.google.com/p/jquery-loadmask/

百姓网:把市场费用给用户,而不给牛B的网址站和徐牛哥

其实,我是在chinaz站长站看到这篇博客的内容的,我才知道有这回事。
也就是证明,至少,我对于百姓网的官方博客还是不关心的(事实上,我也只对一些技术型的网站、博客等感兴趣)
原文是这样的:

最近很多朋友发现,百姓网慢慢的从很多网址站上消失了,比如2345之类的。很快,百姓网也会被从HAO123撤下来。

很多用户在问我们,怎么了?在这写篇文章解释一下,原因是我们不愿意付这个买路钱给徐牛哥。

和大家说一个刚刚发生的事情,帮助大家理解一下现在的网址站有多牛x,刚刚打电话给北京一个和hao123相当有内部关系著称徐姓牛哥,买 HAO123位置号称别人搞不定他都搞的定。徐牛哥上来第一句话:“你们有多少钱?你说说我听听?”。我说:“你总要报个价格吧?”,徐牛哥马上说:“你说说看,我看看你能不能达到报价的一半?”,我说:“你先说说报价吧”,徐牛哥说:”100万一个月,真正买只能比这还贵“,我说:“接受的话啥时候能有位置?”,徐牛哥说:“你们真想买,成交价肯定比这还高的多,接受或许等半年,如果只想按刊例买,一辈子都买不到。“。我说:”你是不是搞不定在这忽悠我呢?算了吧。”就挂了电话。

不到20秒,徐牛哥打电话给我问:“你刚刚说啥?说我搞不定?”,我说:“我是这么说的。”。徐牛哥马上说:“好,妈的,你敢这么说,我保证让你们一辈子上不去中国的3大网址站。”我说:“好,那我们看着。”

看见没,原来到底啥网站能上到中国3大网址站,不是用户说的算,不是李彦宏说的算,甚至钱说的都不算,原来是徐牛哥说的算。以后要是有机会见到李彦宏,一定要当面问问他。

也正是因为这个原因,百姓网选择把市场费用发给我们的用户,而不是发给网址站和徐牛哥。100万一个月,可以每天送5个iphone、8个ipad、10根金条、100个ipod shuffle、1000个收音机、10000个记事本。

看看http://x.baixing.com,作为百姓网的一员来帮助百姓网一起宣传,领百姓网的答谢礼物吧。让牛B的牛站、牛哥们见鬼去吧。

想了很久,觉得要最后补一句,是说给徐牛哥的:如果未来百姓网出现在中国3大网址站上,徐牛哥你就是公牛养的。

徐牛哥事件最新更新:今天(事情发生的第二天),徐牛哥打电话过来,全盘否认说过以上所有的话,说我在胡编乱造对他进行诽谤,并且说下周要来上海找我对证。我已经在律师的监督下对所有的对话进行了录音,并且建议他去移动调出所有的通话记录和录音后,来上海和我们对质公堂,一定让大家知道真相。有任何进展,我会随时在这更新。本来还觉得他是个牛哥,但是现在觉得原来不是真牛,不过很欣赏这种吐出来了还能吃回去的人。

看了上面的内容,其实也很好理解。目前百姓网的名气在业内也不象初创时那样了,当然也有自己强硬 的理由 。就象评论里说的:炒作 吧。其实,推广、炒作,不TMD都是一回事嘛,只要能够成功的推出去,只要不违法,什么方式都可以用,难道不是吗。
当然现在百姓网也是可以牛起来了。

DBA Notes:说说技术型创业团队的技术选型

DBA Notes:说说技术型创业团队的技术选型

做技术的人除了在工作外,总想着创业,虽然不一定成功,但总想着要做点什么 。
而且,做技术的大多是偏执狂,追求完美什么的,所以往往都会创业失败,因为,总想着程序做成功了才开始运行,但其实这时候往往会错过了什么 。
看到Fenng的这篇选型类的文章,里面有一段是这样:

拥抱开源技术,避免过度炫技,如果技术型团队创业(做互联网),这两条都能坚持的话,我想你已经抓住了问题的 80% 的部分,基本上你不会做太多的无用功。

好吧,上原文吧。。。原文来自于:http://www.dbanotes.net/startup/Startup_tech_style_choosing.html

看到微博上《程序员杂志》在征集"一分钟先生"的话题:如何做好公司/团队的技术选型?其实大公司或者大一点的团队选型几乎不需要太多讨论的 -- 最后会不可避免的绕到技术官僚的话题上去。这里我想简单说说技术型创业团队技术上的选型问题。

拥抱开源技术

如果只能选择微软的技术路线,比如团队几个人只会用微软的技术做开发,甚至也不想学别的,那么似乎没有别的办法,将就一下吧。如果还有的选择,尽量 选择使用开源技术。这样的好处是你不但可以有效的降低软硬件成本,还有更多的部署方案供选择,服务器上线甚至还能避免病毒的侵袭。开源技术的好处是出了问 题,你总有办法可以找到答案,避免再次犯类似的错误。而用了微软的产品之后,可能平时不出问题,但一旦出了问题,你根本没什么办法,实际上,微软的产品使 用门槛倒是低,但是复杂度可是一点都不小,而且随着发展,成本越来越高。国内有几个大中型网站,比如天涯、5173、大众点评、京东等,怕是深有感触吧, 有的因为成本太高而继续被捆绑在贼船上,有的则破釜沉舟要摆脱这种束缚,但不管怎么说,总要付出一定的开销才可以掉头了。

好了,恭喜你选择了红色药丸,现在选择开源技术路线了,离开了微软的专卖店,进入到一个超级庞大的百货商店,这里还有数种分支供你选择呢,然后怎么 办?选择大路货,选择可以掌控的技术产品,开源语言、开源程序、开源框架,乃至开源的解决方案。比如 PHP,比不上 Ruby 阳春白雪,但是用户基数大,你总能找到不错的工程师。PHP 虽然粗糙,但是管用。以 PHP 作为开发语言的成功产品不计其数,甚至很多东西根本不需要你再开发了,稍加定制即可使用。技术本身没有高下之分,差别在于使用技术的人。

Note:Paypal 和 X.com 合并之后,果断的将整个架构从微软的平台迁移到 Unix 平台;用微软技术体系构建的 MySpace 至今还在用微软的平台,被全面使用开源技术的 Facebook 短时间内全面超越。技术体系的选择是成功与否的唯一因素么?肯定不是。但至少是因素之一吧。

避免过度炫技

技术人员创业最容易犯的一个错误就是"炫技"。什么新用什么,使用最时髦的开发语言、部署的软件产品、调试最新版本的开发工具... 没错,用最新的东西容易给技术人员以满足感,但也很快会将你的时间资源消耗进去,除非你准备做的是一款基础产品。否则的话,你要花时间去学新的规范、熟悉 新的功能、对付新出现的软件BUG... 可是这时候,最需要你做的是开发你要开发的产品,而不是捣鼓其它东西。一些新的技术或者方案,可以花一些时间分析一下但没必要立刻就用,确保将来有一天能 真的使用上的时候,对一些重大的陷阱或是缺陷能够了然即可。

很多人神往 37Signals 的成功,但你一定要知道类似 37Signals 的团队,默默无闻的夭折掉的不知道有多少。每当我看到创业团队的就那么一两个人还整天在捣鼓 Go 、Erlang 这些东西,并想硬生生的用到他们的产品中去,我就知道,这样的团队要悬了。有这些精力,有这样的能力,应该想办法尽快让技术变现,研究一下怎么改进产品, 怎么给用户带来更大的价值,这些不一定用最好的技术才能做出来。想办法尽快让产品发布,尽快接受更多人给你第一轮反馈,只凭创业团队几个人闭门冥想是很难 出来好产品的,有的时候,产品推出的时机比完备的功能更为重要。要知道 GroupOn 最早也不过是搭建在 WordPress 上的几个页面,而阿里巴巴网站最初也不过是一个论坛,你又何必等到所有细节都打磨好呢?

拥抱开源技术,避免过度炫技,如果技术型团队创业(做互联网),这两条都能坚持的话,我想你已经抓住了问题的 80% 的部分,基本上你不会做太多的无用功。

再说说如何找到合适的技术伙伴,刚刚启动的时候不要直接上来就找什么技术总监、技术经理、架构师这些看起来级别很高的人,因为这样级别的人未必认同 你的想法和你的现在的团队,相反,我建议找能实现你产品想法的人。找一个合作者要比找一个管理者更为重要。最后有一点必须要说一下,不要因为一个人的技术 喜好而舍弃整个技术团队,在任何时候这都是很愚蠢的事情。

这篇文章是比较有针对性写的,所以不具有普遍性,路过的朋友不要挑刺。

--EOF--
我想说的这篇文章里对我们这些从事技术类的人想要明白的就是,只要能达到目的,不要老是想着完美,事实上,大多数成功的人,都是靠运营的。纯技术创业实在太难了。。

php2python

php2python

极有意思的网站,比较适合我们这些初学者,当然是对PHP有一些基础的初学者
网站主把常用的一些PHP的函数,用Python实现了一遍(或者是显示Python的自有函数),方便我们查找例子

例如:PHP常用的addslashes函数,用来对特殊字符进行转义,

该网站则显示:

def addslashes(s):
d = {'"':'\\"', "'":"\\'", "\0":"\\\0", "\\":"\\\\"}
return ''.join(d.get(c, c) for c in s)

s = "John 'Johny' Doe (a.k.a. \"Super Joe\")\\\0"
print s
print addslashes(s)
#John 'Johny' Doe (a.k.a. "Super Joe")\
#John \'Johny\' Doe (a.k.a. \"Super Joe\")\\\

实现方法虽然有点不一样,但对于我们这些初学者已经了解了很多用法,比如for in,join ,dict的get用法。当然还有定义函数的def方法。

这个网站是什么呢?http://www.php2python.com,黑黑,已经加入我的收藏夹了。感谢小缘缘的推荐

初学python

初学python

初学python,小缘缘出了几道题:
有一 list
a = [1, 2, 3, 4, 5, 6]
請將 a 依
0, 1
1, 2
2, 3
3, 4
4, 5
5, 6
打印輸出,
2.將a list 倒序成 [6, 5, 4, 3, 2, 1]
3.將a 中的偶數挑出 *2 ,結果為 [4, 8, 12]

基本上实现:

a=[1,2,3,4,5,6]

for i in a:
print a.index(i),',',i

a.reverse();

print a

for i in a:
if i%2==0
print i*2

虽然都完成了,但小缘缘说回答的不好,他这样回复

for k,v in enumerate(a):
print k,v
print a[::-1]
print [i*2 for i in a if not i%2]

当时我就傻眼了,后来缘缘又出了道题目:

造一個 200 個隨機正整數(1~15)的list
統計其中 正整數的出現次數,並排序輸出結果

开始的时候,不清楚random居然还要import。。。。

后来花了好久做出来:

>>> import random
>>> mylist = [random.randint(1,15) for i in range(1,200)]
>>> s={}
>>> for i in mylist:
if not s.has_key(i):
s[i]=0
else:
s[i]+=1


>>> cmplist = sorted(s.items(),key=lambda(d):d[1])
>>> result = cmplist[::-1]
>>> print result
[(8, 20), (13, 19), (12, 16), (9, 15), (6, 15), (3, 14), (2, 12), (14, 11), (4, 11), (15, 10), (7, 10), (11, 9), (5, 9), (1, 9), (10, 4)]

缘缘点评循环的时候,可以用Get比如

for i in mylist:
s[i]=s.get(i,0)+1

然后说sorted可以有从大到小的倒排,后来找了一下资料,发现可以这样

sorted(d.items(),cmp=lambda x,y:cmp(x[1],y[1]),reverse=True)

第一次写python,鸭梨太大了。。。