Thursday, December 15, 2011

Google员工自曝心得:13招在手面试不发愁 (转来的)


2005年底,我开始了我的“休耕期”。地,需要休耕,才能继续长出好作物;人,也需要休耕,才能走更长远的路。

列出了计划,每天仍然有待办事项,我开始做一些很久以来一直想做而未能做的事,包括:开始着手写这本书,多陪陪妈,日子好不悠哉!还带妈去台北101吃生鱼片。

休耕了近半年,突然有一天,接到人力中介电话,问我有没有兴趣跟一家公司谈谈。

按照惯例,他们是不能透露客户的名字,却会给对方一些方向:全世界领导性的因特网公司,强调创新,等等。我深吸了一口气:“Google!”对方说:“Bingo!”(这样他们并未违反NDA--保密协议)。这是我梦寐以求的公司!本来我在休耕期间,根本就没想去找工作,但这家公司,我从2001 年即开始注意,2003年差点加入,这一次,我决定不再让机会擦身而过。

2001年,我还在世界级顶尖的智能型手机Handspring公司担任国际产品营销负责人,我们的Treo(产品名)在美国该领域高居销售冠军,因为,简单好用的Palm操作系统,结合PDA功能(如行事历、通讯簿),加上还可上网!我们买了一个Stanford的团队,他们做了一个很棒的手机用的浏览程序叫Blazer,有非常强的串流技术,不用等整页下载才显示网页,而是边下载边显示,减少使用者等待的时间。这么好的浏览程序当然要配上一个好的首页,我们那时选的不是Yahoo而是Google,因为 Google简洁干净的界面,完全符合我们的品牌精神与设计理念。

有些人可能听说过Handspring,其实是Palm的创办人所设立,其中有位Palm操作系统接口易学好用的幕后功臣,是日裔美国人灰谷先生(RobHaitani)。他有一个很有名的理论,叫“Palm的禅学” (TheZenofPalm),他每次就这个题目演讲时,都会用一个非常具禅意的问题做总结,就是“如何把一座山,放进一个小茶杯?”当然每次都是在大家搔头不解下,秀出当头棒喝的答案──“挖出山中的钻石放进杯中,谁需要整座山的泥土呢?”

所以那时就对Google有一种“惺惺相惜”的激赏。离开Handspring以后,在思考下一步时,曾经想到Google,那时人还在美国,于是上网看有何职缺,居然有国际产品营销的缺,正是我的本行!赶紧整理资料寄过去,不久果然接到回信,对方安排了电话访谈。本来有点失望,怎么只有电话?想当初Handspring一看到我的履历,立刻打电话给我,安排与灰谷先生面谈,总共只谈了三个人,就给我工作机会了!

但我按捺住我的急性子,经过了两个电话访谈!接到面试的通知,去了之后,谈得非常顺利。但不巧的是,2003年妈出了车祸,事情急转直下,决定回亚洲好就近照顾妈,自然无心恋栈,就自动放弃了继续面谈的机会而退出了。所以,这一次接到人力中介的电话,觉得也许是一种缘份,决定姑且一试。

很多朋友事后知道我进Google,往往说:“你进Google当然很容易啊!你Stanford毕业,你们的共同创办人也都是Stanford的!”殊不知比我优秀、条件好的多如过江之鲫,而且Google那时平均要经过十一二关 interview(面试),我可是通过13关才进来的,朋友戏称这好像是“少林寺的十八铜人阵”,一点都没有侥幸。所以我想分享一下,在这漫长过程中所用的13个“绝招”。

1、见面三分情

如前所述,Google前几关通常是电话访谈,这对很多英语非母语的人而言,是最困难的,所以很多优秀的人才在前头就惨遭滑铁庐,因为只能用声音,没法用身体语言的辅助,你也无法看见对方的反应,往往在回答问题时,只是面对一片沉默,无法透过四目交接,了解对方是否对答案满意或是已不耐烦。那怎么办?

你或许能要求可否改为视讯会议,若对方拒绝,甚至可用激将法说对方是高科技公司,这应不算难事。

2、化被动为主动

事先准备好企划案,把你对这个职位应如何做好的计划事先送给对方。在面谈开始时,就可问对方有无收到,有何问题,如果企划案写得不错,通常对方会请你就内容做说明,等于你掌握了面谈的主导权。

3、知己知彼,百战百胜

尽可能事先探听好面试者的姓名、头衔、工作范围等,然后Google他们(动词,指“上网搜寻”的意思)。有几关面谈者,我不仅在面试前上网找到他们过去的经历,甚至找得到他们的照片!

所以有一次,两位面谈者同时面试我,都是第一次见面,我立刻说“A先生,您好!”、“B先生,幸会!”他们很讶异我怎么知道谁是A,谁是B。我说:“第一,两位都是鼎鼎大名的人物;第二,我Google过你们。”效果是一石二鸟,既恭维了他们,又表明我熟悉Google的产品与服务。

4、第一印象

如何在众人中脱颖而出?第一印象实在是关键!除了一般的履历表或简历,一定要附一些能让人更认识你或更突出你长处的数据,可以是自传,可以是得奖纪录,也可以是个人创作的作品。

我当初是用coverletter(说明为何对此职务有兴趣的信)和履历,加上两篇我写的文章,后来我老板告诉我他颇喜欢我的文章,尤其是我写妈的《我最怕穿的一双鞋》。我曾雇用很多人,就是因为这方面也很用心。我在《天下杂志》第一次当小主管时,要找一个业务,《天下》是知名企业,应征函件一大叠,实在不知从何看起。其中有一位辅大的学生,连信封都是自己设计的,最后获得面试的机会,而且也被雇用了。

5、为他人设想

和我老板面谈前夕,好不容易才把所有的数据整理好,虽然也把电子文件寄过去了,但心想,我的企划案就将近100页,通常还是要打印出来才容易阅读,但我老板是出差来台湾,住在饭店,打印既不方便又贵,不如我帮忙印好送过去吧﹗但人力中介不肯告诉我他们住哪,他们已经够帮忙了,我之前问的所有东西都告诉我了:人名、办公室在台北101等。于是我心想,他们一定是住五星级饭店,在台北101附近,那肯定不是住君悦就是远企。打了电话去问,果然在君悦。

于是把所有数据用彩色打印出来,放到一个活页数据夹里,专程送到君悦,向柜台说明这是急件,务必立刻送到他们房间。君悦不愧是五星级酒店,没让我失望,老板事后告诉我,果然我的数据是面试前一天就拿到的。

6、做好功课

这也是老生常谈,但我不管是在Google或是之前的公司,一再失望且惊讶的发现:太多人没能做到这点。

很多人以为,他只要能让主考官对他之前的“丰功伟业”印象深刻,觉得他是个不可多得的人才,自然会当下立刻雇用。殊不知一个人再优秀,干卿底事?优秀的人很多,一个公司要找的是既优秀,又对公司了解及有热忱的人,所以Google很喜欢问:

“你在用Google哪些产品及服务?”

“你对它们有什么看法及建议?”

“你了解你所应征的工作内容吗?”

“你若进来,要如何把这份工作做好?”

其实我不是泄露Google的“天机”,这真的是放诸四海皆准的通则。

记得在之前一家公司,要找一个营销专才,面谈了数次有相关产业经验的人,但都未留下深刻的印象。反倒是一个没有任何相关产业经验,而是一家食品公司的营销人员,先是给我看她的杰作,放在整理得井然有序的档案夹内,然后回答我上述的问题,居然对我们的产业动态、竞争态势及她想加入这产业的动机及对这份工作的想法,都能有条有理、侃侃而谈。当然,她也被录取了。

其实,现在要收集这些数据实在比以前容易得多,随便上网都可以找到一大票,再不做好,实在该打屁股!

7、沙盘推演想个案

我非常喜欢考case(个案)。MBA的训练,几乎都是个案分析,知名的企管顾问公司也爱考case。因为一个人可以吹牛他过去有多棒,也可以拾人牙慧、现学现卖,上网找一堆产业新闻及市场数据,就把这份工作该如何做,“盖”得天花乱坠。但考case很容易看出一个人的思路是否清晰?推理是否具逻辑性?更重要的是,还可以看出一个人的个性。

有一次,有一个年轻女生应征Google,那天不知怎的与人事部门间的协调出了些小问题,把时间搞错了,结果我只有不到30分钟的时间跟她谈,只好单刀直入问case。我常扮演“奥客”(台语:爱找麻烦的客人)的角色,初生之犊不畏虎的她心平气和,颇有大将之风地响应我的反对,显示她对我们产品的价值及定位有正确的认识,而且还举了一个很好的例子。那时正值春暖花开的季节,她建议客户可以设计一个去日本赏樱的企划案。在短短不到30分钟的面谈里,她成功地赢得我这一票,是我目前看到ROI(时间上投资报酬率)最高的范例。

说也奇怪,有些身经百战的人,不仅抓不到重点,甚至会不耐烦到动气,觉得我这“奥客”简直不可理喻。记得有一次面谈,有一个人实在无法说服我,正准备放弃时,我放出一个饵,说:“如果这个方案,你可以提供这些使用者细部的资料,我立刻跟你签600万的合约。”他居然一口答应。我替他找台阶下,说:“不急!你回去确认一下系统是否可以做到这些,再回报给我,我还是会签600万合约给你。”他还是自信满满地说:“不必了!Google这么大、技术这么好的公司,应该不成问题的!”这种想当然尔的态度,让我当场傻眼。我心想,如果有这样的员工在外面对客户乱开支票,不是给自己找麻烦吗?

其实条件再好、阅历再丰富的人,碰到面谈,难免会紧张,加上case需要随机应变,临场做反应,难度更高。但有时就是要看到一个人的抗压性,及面对一连串的“NO”之后,仍否保持优雅从容的气度,不是吗?

8、善用视觉辅助工具

我在和Google面谈时,也被问到很多棘手的个案,这时我通常喜欢在白板或纸上画一些流程图,或一些架构,来帮助自己整理思绪及引导对方了解我的思路。当然最棒的是对方问你的问题,是你“考前猜题”就已想到,且写在你的企划案中的,此时就可从容地说:“让我们翻到第×页,来回答你的问题……”

9、先讲结论或解决方案,再引申

这其实是中英文思考及写作模式的相反之处。从小用中文思考及写作,都是先讲故事或先讲一堆理由,最后“好酒沈瓮底”,才是结论或这故事的道德意涵。但英文是相反的,第一段就是总结,若有三个主题,接着每一段就是一个主题,每段的第一句就是重点。

例如,我们中国人常讲“因为……所以……”。“因为设计的产品规格未考虑到周边的产品兼容性,导致测试失败,现在需要修改规格,把生产线暂停,因此可能无法赶在圣诞节出货。”

美国人会说:“Badnews!(坏消息)新产品出货可能赶不上圣诞节,将对本公司今年财务造成重大影响!”(这时他已成功地引起所有人的注意)。

“根据我们过去这两周跨部门的密切研究发现,原来根本原因是新产品规格未考虑周边产品的兼容性。所以已暂停生产线,修改规格中。接下来我们有两个选择:方案一及方案二。”

10、注意细节

在给Google的履历表上,我的电子邮件是gmail的账号。我至今仍然很讶异地发现,很多人来申请Google的工作,不仅是用别的账号,连gmail是什么也不知道。并不是说我们排外,你用别家的电子邮件,就别想到Google上班,而是walkthetalk言行一致,如果你真的对这家公司充满热情,你难道不会想试用他们的产品吗?

此外,我也很喜欢面谈时再问一次应征者,哪一年自大学毕业?哪一年到哪一年在某家公司上班?不只一次,我发现他们说的与写在履历表上的不符合,这时他们通常会很不好意思地说,是记错了或写错了。如果你是主考官,你会不会对这个人打上问号?

11、一图真的胜千言吗?

很多人问我,应征函件上,倒底该不该放上照片。这其实是见仁见智的事,我的建议是“Itdepends!”(视情况而定)。我们必须承认,人通常是喜欢看美的人和事物,所以如果你是潘安再世,或是有闭月羞花之貌,当然要附!但不要忘记,最好找一两位知心朋友,帮忙确认一下。因为你也许觉得你这张照片酷到不行,但别人看来,可能觉得这个人看起来很高傲,反而扣分。所以我建议要么就不放,要放不如用点创意,与其放写实的照片,不如放些强调个人特征或特色的插画。自己不会画?没关系!那干脆放自己在SecondLife(虚拟世界)的Avatar(分身)或是wii中的mii喽!(指虚拟游戏中自己的人物形象)

12、表达感谢

《圣经》中有个故事,耶稣治好了10个大麻疯的病人,只有一个回来谢谢耶稣,耶稣不禁感叹:“另外9个人,我不是也治好了吗?”

其实这1/10的比例已经算高了,面谈过这么多人,只有非常少数会发封电子邮件谢谢我。我自己则是每关面谈完后,都会这么做。有时没要到对方的联络方式,就请人事部门转寄。这是一个礼貌,更是一种纪律的表现!

13、实地勘察

有时和应征者面谈,对方不仅迟到,而且出现时满头大汗,连声抱歉说:“走到购物中心那儿,找不到地方上来办公大楼……”我不禁心想,你之前怎么不来实地勘察一番呢?

也许是经过联考的“洗礼”,在“一试定终身”的年代,我们哪一个不是乖乖地在考前顶着酷暑去看考场?从坐几号公交车、走哪条路到哪所学校,到哪间教室自己坐第几排、最近的厕所在哪里?如果该厕所人太多,还有哪些厕所可去,等等,这不都是“基本动作”吗?

与Google面谈,有一关是在一家日本料理餐厅。我前一天晚上就先去看过,确定好地方不说,连菜单都先看一遍,想好自己要点什么。

另一次是在美国总部,我也是事先在GoogleMap上找好行车路径,然后前一天先去一趟,还看到他们在办一个Dogparty(狗狗聚会),好多人带着自己的宠物狗和同事交换养狗心得。第二天面谈时我提到这个party。主考官问我怎么知道有这个party,我说我昨天来“勘察场地”。他讶异地说:“你昨天特地跑一趟来看场地?”我答道:“对!因为我非常重视今天的面谈,不想走错路或迟到。”从他惊讶的表情,我知道很少人这么做,从他满意的点头,我知道他对我的肯定。

这13个心得,不仅是我从应征者的角色加以应用、最后得到Google青睐的关键,也是多年来当主管,从“主考官”的角色,阅人无数所累积的观察。

Sunday, December 11, 2011

父类指向子类实例

1.父类的引用,指向子类的实例(里氏替换原则)
OOP的思想里关于继承的描述:
子类对象可以代替父类对象;
父类对象不能代替子类对象;
父类的方法可以在子类中重写。

plate p = new helicopter()

plate: 父类
helicopter: 子类,继承自plate

把子类当做父类来用

只用父类的方法,这样当子类改成别的,比如客机,那下边的方法可以不用变,只改子类就可以了,增加程序的灵活性。

Friday, October 7, 2011

@"" in C#

1.
string file = "C:\\MyFolder\\MySubFolder\\MyFile.txt";
if use @
string file = @"C:\MyFolder\MySubFolder\MyFile.txt";

2.
<%= Html.TextBox("Title", Model.Title, new { size = 30, @class="myclass" } )%>
using a @ character because class is a reserved keyword in C#

Tuesday, October 4, 2011

Perl -- sent email

1) sent email

($message = $message) =~ s/<[^]*>//gs;  ##remove Html text 为了防止被放到spam文件夹

@rudewords = qw(rudeword1 rudeword2);
$rude = "no";
foreach $word (@rudewords)
{
  if($message =~ m/$word/gi or $subject =~ m/$word/gi)
  {
     $rude = "yes";
  }
}

unless ($rude eq "yes"){
   open(MAIL, '| /usr/lib/sendmail -t -oi'); ##sometimes not use lib and use sbin
   print MAIL <
   To: you\@yourserver.com
   From: them\@theirserver.com
   Subject: $subject

   $message

   EOF
   close MAIL;

   print "Thanks for your email!";
}

Perl -- print a block text; file test; chmod

1)
print <
test line one
test line two
...
EOF

2)-e 测试文件或文件夹是否存在
print -e "directory1/file.txt"; ##true while return 1;

if(-e "directory1/file.txt"){
print "file exists. \n";
}else{
print "file doesn't exists. \n";
}

-z 测试文件是不是零size true返回1
-s 测试none 零size 返回文件的尺寸数
-d 测试是不是文件夹 true返回1

3)chmod set file permissions
chmod 0644, 'directory1/file.txt';
chmod 0755, 'directory1';

@files = ("directory1/file1.txt", "directory1/file2.txt");
chmod 0644, @files; ##成批文件更改

#files 0644, 0666
#directorys 0755, 0777
#perl scripts 0755

Perl -- Text File

1)
open (FILE, "file.txt");
print ;
close(FILE);

open(handle名,"文件名");

2)

open (FILE, "file.txt") or die("Error");
print ;
close(FILE);

or die("Error")如果文件不存在,显示Error message。

3)
open (FILE, "file.txt");
@array = ;
close(FILE);

print @array;
foreach $line (@array)
{
chomp($line);
$line = uc($line);
print "$line";
}

chomp 去掉结尾的\n;
chop 是去掉最后一个字符;
uc Upper Case;

4)Write to Text file
open(FILE, ">file.txt");
flock(FILE,2);
print FILE "Hello\n";
close(FILE);

">" 是准备写入的开始
flock 是将文件锁上,以防止其他人操作同一个文件

5)append to text file
open(FILE, ">>file.txt");
print FILE "Hello\n";
close(FILE);

">>" 是准备添加到文件


is associated with the keyboard.Use this handle when you wish to read from the keyboard.
"<>" is operator directs Perl to read a line from the file handle specified within the angled brackets. 

6)Rename file
rename "file.txt", "file2.txt";

7)Copy file (use perl module)
use File::Copy;
copy("file.txt", "copied.txt");

8)delete file
unlink "file.txt";

9)
$file = "copied.txt";
$size = (stat $file)[7];

stat function不同的参数用于不用的作用,比如7代表的是文件的字节数。

10)Open Directory
opendir(DIR, 'directory1');
@files = readdir(DIR);
closedir(DIR);

readdir 读取文件夹里有什么文件和文件夹。

11)Change Directory
chdir 'directory2';  ##开始使用另一个文件夹
mkdir 'newdirectory'; ##文件夹改名
chdir '..';  ##返回上一级文件夹

12)Ddelete Directory
rmdir 'newdirectory';

13)Glob function for Directory
@files = glob('directory1/*');
print "@files\n";

结果打印出包括 文件夹名/文件名 directory1/file1.txt


@files = glob('directory1/*.txt'); ##only .txt 文件 

push (@files2, glob('directory1/*.bmp");
print "@files2\n";

push的作用是是上边直接付给@files一样的结果

直接print出来用join
print join("\n", glob('directory1/*.cgi'));

or

while ()
{
print "$_\n";
}



Perl -- Regular Expressions

A是检查是不是在首位,$是检查是不是在末位, "."点是替代一个字符,"+"代表one or more; "?"问号是代表0个,1个或多个
\w Match a "word" character (alphanumberic plus "_")
\W Match a non-word character
\s Match a whitespace character
\S Match a non-whitespace character
\d Match a digit character
\D Match a non-digit character

1)m match operator
$string = "hErE Is a STriNg";
if($string =~ m/here is a string/i)
{
 print "It's a match!\n";
}

m//  ##match 匹配
i    ##忽略大小写
可以写成 /.../; m!...!; m#...#;

2)s subsitution
$string =~ s/here/There/i;
结果是There Is a STriNg

s/ / /i ##substution用后一个字符串取代前一个字符串

3)
$string = "I see the road.";
$string =~ tr/r/t/;

结果是"I see the toad";
tr/r/t/; 用后一个字符取代前一个字符。

4)
$string = "Perl is coooooooooool!";
$string =~ s/o+/oo/g;
结果是"Perl is cool!";
s/o+/oo/g

5) number
$number = 123;
if($number =~ /^\d+$/){
print "it is a number!\n";
}
/^\d+$/检查是不是number

6)
$letters = "abc";
if($letters =~ /^[A-Za-z]+$/)
{print "Letter only!";}

7)去掉空格
$stirng1 = "     Leading whitespace.";
$string2 = "Trailing whitespace.    ";

$string1 =~ s/^\s+//;
$string2 =~ s/\s+$//;

Saturday, October 1, 2011

Perl

$random = rand(100);

sprintf "%.3f", $random;  ##小数点后面保留3位。

time

localtime(time); ##Thu Dec 23 13:25:02 2011
gmtime(time); ##Thu Dec 23 00:25:02 2011
time; ##1196347834

($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);


Subroutines
sub doit
{
......
}

$value = 10;
if($value<10){
doit;
}

Friday, September 30, 2011

Perl function

split, join
$words = "the cat is white";
($w1, $w2, $w3, $w4) = split(/ /,$words);

结果是: the cat is white;
split可以写成这个样: (@words) = split(/ /, $words);

Join
$joined = join(" ", ("A", "black", "dog"));
print "$joined\n";
结果: A black dog #有


lc, uc, lcfirst, ucfirst

$words = "nz";
$words = lc($words);
all lower case,都要小写;

lcfirst第一个字母小写
$words = "ADADSFS";
$words = lcfirst($words);
print $words; 结果是aDADSFS;

length, substr, index, rindex

length("thursday"); 结果是8;

$string = "It was hot on thursday.";
substr($string, 14, 6);
从第14个字母开始(从0数),6个字母
结果是thursd;

substr($string, 14, 8, "tuesday");
结果是It was hot on tuesday.

$string = "There, here & everywhere";
$index = index($string, "here");
print "First 'here', position $index\n";
结果是: First 'here', position 1

rindex是last position;
$string = "There, here & everywhere";


Perl Hashes - reverse, sort, merge,


$hash{$some_key} = "value";

eg. $hash{name} = Raymond;
    $hash{age}  = 29;
    $hash{city} = Hamilton;

%hash = ();     #"%" 百分号就是hash的意思

$hash{name} = Raymond;
 $hash{age}  = 29;
$hash{city} = Hamilton;


print "@{[%hash]}\n";
结果是: city Hamilton name Raymond age 29

单个hash值
print "$hash{city}\n";

如果key有多余一个words 就要用'', $hash{'my name'} = "Raymond nz";


另一种创建hash方法
%hash = (
   'name', 'Raymond',
   'age', '29',
   'city', 'Hamilton'
);

%hash = qw(
 name john
 age 28
 city Hamilton
);

looping hash
%hash = qw(
  food sandwich
  desert donut
  drink coke
);

while(($key, $value) = each(%hash)){
  print "$key --- $value\n";
}

foreach $key (keys %hash){
  pring "$key\n";
  $value = $hash{$key};
  print "$key => $value\n";
}

if(exists($hash{animal})){
  print "Key does exist!\n";
}else{
  print "key doesn't exist!\n";
}
结果:key不存在

defined 和 exists的区别
defined检查有没有值value, exists检查又没key

Reverse, sort, merge
reverse: 把key变成value,把value变成key

%hash = qw(
  food sandwich
  desert donut
  drink coke
);
%reversed = reverse %hash;
foreach $key (keys %reversed){
 print "$key - $reversed{$key};
}

sort:
foreach $key(sort key %hash){
print "key\n";
}

merge:
%hash2 = qw(
 drink coffee
 sugar 1
 milk yes
);

%hash3 = (%hash, %hash2);
print "$hash3{drink}\n";  结果是coffee;

Perl -- uc, grep, $_

@array = (1..10);
map {$_ = $_ * 2}(@array);
结果是@array里的每个元素都乘以2.

@array = qw(apple orange banana plum);
map {$_ = uc($_)} (@array);
#uc 是大写字母

@array = (1..10);
@array2 = grep{$_ > 5} @array;
取array里大于5的元素;

@array = qw(apple orange banana plum);
@array2 = grep{$_ =~ "n"}@array;
显示包含字母"n";

Perl -- Loop, foreach, if, unless, while

1. foreach

@array = qw(red orange blue green);

$count = 1;
foreach $color (@array)
{
     print "Color $count: $color \n";
    $count++;
}

@numbers = {1..10};

foreach $number (@numbers)
{
$number = $number + 10; //add 10 to $number
print "$number \n";
}

2. if

$number = 10;

if($number > 10)
{...}
elseif($number < 10)
{...}
else{...}

unless($number == 20)
{
 ...
}else{
 ...
}

3.

$number++; 后计算;
++$number; 先计算后赋值;

4.立方

$sum = 2 ** 3;

5. mod
$sum = 10 % 3;
the result is 1;

6.
use integer
$sum = 10 / 3;
print $sum;
the result is 3;

7. string equal use "eq" and number use "=="
if ($word eq "hel"){...}

not equal use "ne" and number use "!="

8. while


$count = 1;
while($count <= 10){
 ...
$count++;
}

9. until

$count = 0;
until(){

$count++;
}

Perl -- Array

Array

1. 输入array

@array(1,2,3);
@array("one", "two", "three");
简单的array建立
@array = qw(red blue organ white);
qw相当于“”,

简单方法建立数字array
@numbers = (1..5); 这个相当于@numbers(1,2,3,4,5);


2. 从右边添加或减少

@array("one", "two", "three");
push(@array, "one"); 添加
结果("one", "two", "three", "one");

@array("one", "two", "three");
pop(@array); 减少
结果("one", "two");

@array("one", "two", "three");
如果是 $popresult = pop(@array);
$popresult是"three";

3. 从左边添加或减少

@array("one", "two", "three");
unshift(@array, "zero");
结果("zero", "one", "two", "three")

@array("one", "two", "three");
shift(@array);
结果("two", "three");


4. 合并array
@array1("one", "two", "three");
@array2("four", "five", "six");
@array3(@array1, @array2);
结果:@array3 is ("one", "two", "three", "four", "five", "six")

5. 反向排列reverse:
reverse(@array3);
结果: @array3 is ("six", "five", .....,"one");

6. 排序 sort
sort(@array);

sort{$a <=> $b)(@array);

7. 反向排序
sort{$b <=> $a}(@array);

$a and $b 变量是perl默认的排序的变量.
如果是string排序 <=> 换成 cmb

sort{$b cmb $a}(@array);

8. 输出100次array
@array = (1) x 100;
print @array;

9. count array number
$#array

Friday, September 16, 2011

Thursday, September 1, 2011

Install memcache and APC on Mac OS X Server (snow leopard 10.6)

Looking to speed up your SocialEngine, Drupal, or other PHP/MySQL web site? The combination of APC and Memcache can really speed up sites based on these platforms. If you’re an admin of a server running Mac OS X Server (10.6), here’s how to install APC and memcache on Mac OS X server:
Download and install MacPorts from http://macports.org.
The following steps are performed in the Terminal:
Force MacPorts to update:
sudo port -v selfupdate
Now, install memcached:
sudo port install memcached
Set memcached to load on startup:
sudo port load memcached
Install the PHP5 module for memcache:
sudo port install php5-memcache
Copy the newly created shared object for memcache into Mac OS X’s default PHP5 extension directory:
sudo cp /opt/local/lib/php/extensions/no-debug-non-zts-20090626/memcache.so /usr/lib/php/extensions/no-debug-non-zts-20090626/
Install APC (Alternative PHP Cache):
sudo port install php5-apc
Copy the newly created shared object for APC into Mac OS X’s default PHP5 extension directory:
sudo cp /opt/local/lib/php/extensions/no-debug-non-zts-20090626/apc.so /usr/lib/php/extensions/no-debug-non-zts-20090626/
Next, you need to edit php.ini to add the extensions. Find the phrase Dynamic Extensions, and add:
extension=memcache.so
extension=apc.so

And finally, restart Apache:
sudo apachectl restart
To confirm installation, create a new PHP document called phpinfo.php with the following contents:
< ?php phpinfo(); ?>
Point your browser to that file. If all went well, you’ll see these blocks: from http://www.gigoblog.com/2011/01/23/install_memcache_and_apc_on_mac_os_x_server/

Wednesday, August 24, 2011

Linux Server commands

1. 更改password:passwd username
2. 更改port: vi /etc/ssh/sshd_config 找到Port 更改为比如:7777 还有找到PermitRootLogin 改为no 之后存盘退出,别忘了添加一个不是root的user和pw,adduser newuser, passwd newpassword, 重启ssh:service sshd restart

3. 查找文件: find / -name filename

4.更改iptable: vi /etc/sysconfig/iptables 查找 -A RH-Firewall-i-INPUT -p top -n state -m tcp --dport 22 --state NEW -j ACCEPT 把-dport 22 改成刚才那个-dport 7777,存盘退出,重启iptable:service iptable restart

Tuesday, August 23, 2011

Domain unable to unsuspend in Plesk 9.5

After upgrading plesk to latest release one of our domain on plesk server was unable to unsuspend thus giving the following error.

“Warning: The domain is still suspended for the following reason: Domain is temporarily suspended for backing up or restoring”

Though it appear to be backup issue but backups were not running for the domain making it quite confusing, So we had the following method to unsuspend the domain.

Login into shell and ran the following command.

/usr/local/psa/bin/domain -u domain.com -status enabled

Segmentation fault

Voila !! So here is the problem plesk binaries is showing segmentation fault so it appears that the plesk upgrade didn’t go properly. Plesk itself work on these binaries which here appears to be a problem. Now Login into plesk and under “Updates ” select the plesk base package option and re-install the Plesk Base packages to make the plesk binaries working again. You should receive a email when the updates are completed.

Follow the steps to reconfigure the domain in plesk database.

Reconfigure Domain:

/usr/local/psa/admin/sbin/websrvmng –reconfigure-vhost –vhost-name=domain.com

Change the status for domain

/usr/local/psa/bin/domain -u domain.com -status enabled

You should get a message the Object successfully enabled, Thats it the domain should be unsuspended in Plesk.


Domain unable to unsuspend in Plesk 9.5

Thursday, August 18, 2011

Configuration manager 里的build是干什么用的

Build->Configuration Manager

如果不想在debug的话,可以把Build的选项点掉。

Wednesday, August 17, 2011

JQuery 基础知识

1. do something after page ready to load:

$(document).ready(function(){
$('#message').fadeIn('slow');
});

2. how to use 'this':

<p onclick="$(this).hide();">hide this paragraph</p>

3. after a image loaded do sth.

$('#image').load(function(){
alert('something');
});

$('img').load(funtion(){ //each images have been loaded then do this thing.
...
});

4. after window load.
$(window).load(funciton(){
...
});

5. unload 当离开页面的时候启动.and confirm().
$(window).unload(function(){...
var c = confirm('are you sure?');
if(c){return ture;}else{ return false;}
});

5. serialize的用法,显示url里的一系列的值
$("form").serialize() 就是submit form之后在url里显示的值.也就是url里问号?之后的一系列的值

6. post
$.post(url, function(data){

}); 这里的data是从url的里得来的.

7. each(function)

$('.option:checked').each(funciton(){ total += $(this).val();});
$('.option:not(:checked)').each(function(){...});

8. form validation
http://bassistance.de/jquery-plugins/jquery-plugin-validation/
<script type="text/javascript" charset="utf-8">
$(document).ready(function(){
$('#edit_blog').validate({
rules:{
title: { required: true,},
blog_category: {required: true, email: true,},
blog_body: {required: true,},
}
});
});
</script>

8 Array
var arr = ['cat', 'dog', 'fish'];
1) 显示在页面里要用
$('#array').html(arr.toString());
or
$('#array').html(arr.join("+ "));
2)
arr.splice(0, 1); 去掉从第一个到第二个之前的值,结果是: dog,fish
arr.slice(0,1); 取得第一个到第二个之前的值, 结果是:cat
arr.pop(); 删除最后一个值,结果是:cat,dog
arr.push("duck"); 添加值到最后, 结果是: cat, dog, fish, duck
arr.shift(); 减去第一个值,结果是: dog, fish
arr.unshift("duck"); 在第一个值之前添加一个值,结果是: duck, cat, dog, fish
arr.length; array的长度;
3)
<input id="submit" type="submit" rel="21|cat|dog" />

var data = $('#submit').attr('rel'); 得到的结果是:21|cat|dog
变成数组可以这样做:
data = data.split('|');

4) each()
$.each(data, function(key, val){
$("#array").append(key+" => " + val + "<br />");
});

9. position()
var position = $('#player').position();
如果想要向左:$('#player').css('left', position.left - 10 + 'px');
向下: $('#player').css('top', position.top + 10 + 'px');

$(document).keydown(function(e){
//e在这里是event.
});


里氏代换原则

里氏代换原则:
如果每个C1类型的对象O1,都有一个C2类型的对象O2,使得以C1定义的程序里面的O1都可以换成O2,那么就说C2是C1的一个子类。
里氏代换原则要求在使用基类的地方其子类也一定适用,这条原则是在进行OOD时候对对象抽象过程中的一个验证方法。比若说设计了一个超类A,我们又设计了 A的子类,那么检查我们的设计是否合理,就应该根据里氏代换原则,看看应用代码中使用到A的对象的地方,时候可以换成其子类对象也同样成立,如果不成立那 么则证明子类并不真正是超类的孩子。

接口和抽象类的区别

关心有相同的功能---用接口
关心将来重复使用,重复功能的扩展---用抽象类(继承)

创建多个组件版本---抽象类
设计小而简练的功能块---接口
设计大型功能单元,搭建框架---抽象类

接口的显式实现

如果一个类,继承了2个接口,并且这两个接口有相同的方法.
public interface IFile{void Close();}
public interface IWindow(void Close(); }

public class FileWindow:IFile;IWindow
{
void IFile.Close(){...} //这样没有public字样的就是显式实现.他们默认地都是私有的
void IWindow.Close(){...}

public void Close(){
(this as IFile).Close(); //如果想调用其他的接口的方法, 必须先把相关对象转换成相应的接口类型. this是当前class的实例.
((IWindow)this).Close();
}//自己的close方法

}

//调用时
public static void Test(){
IFile file = new FileWindow();
IWindow = new FileWindow();
FileWindow fw = new FileWindow();

file.Close();
window.Close();
fw.Close();
}

判断类型转换 is and as

is 是先判断是不是指定接口类型(是不是实现了接口)

if(obj is IFlyable)
{
IFlyable fly = (IFlyable)obj;
fly.starfly();
}

as 是先执行转换(委婉型转换)然后再判断转换是否成功

IFlyable fly = null;
fly = obj as IFlyable; //as 在这里是把...当作...

IFlayable fly2 = obj as IFlyable; //如果成功转换,fly不为null,否则,就为null
if(fly == null){
...
}else{...}

Tuesday, August 16, 2011

#region 这个是一个可以把一段程序收缩显示的方法

#region 需要显示的名称

#endregion

这个是一个可以把一段程序收缩显示的方法

Thursday, August 4, 2011

Symfony2 Install on Mac: Mysql Error – SQLSTATE[HY000] [2002] No such file or directory

I recently changed up the configuration of my Mac (running 10.6.4) and I was installing a fresh copy of Symfony2 when I ran into the following error when I got to the database credentials: SQLSTATE[HY000] [2002] No such file or directory.

I did some Googling around and came across someone that seemed to have a similar issue, though not with Magento. So I figured I’d give it a shot. Well, it worked. The unfortunate part is that, being not all too familiar with how all this configuration stuff works, I don’t know why it works (if you know why, please let me know).
The Solution

Open up your php.ini file (mine was in /etc/). Look for the following line:

pdo_mysql.default_socket=/var/mysql/mysql.sock

If that line exists for you, try changing it to:

pdo_mysql.default_socket=/tmp/mysql.sock

Restart apache after saving, and that’s all I had to do. One thing to keep in mind though is that I am using the stock php (with 10.6), and I’m using mysql installed with homebrew.

ref: http://prattski.com/2010/08/05/magento-install-mysql-error-sqlstatehy000-2002-no-such-file-or-directory/

mac – mysql does not connect on localhost but connect’s on 127.0.0.1

his issue came to me after i got “Can’t connect to local MySQL server through socket ‘/var/mysql/mysql.sock’” on a mysql connection on php on a fresh installed mac – php connect’s correctly to 127.0.0.1 , but does not connect to localhost .

On a mac the default mysql socket is ‘/private/tmp/mysql.sock‘ and not ‘/var/mysql/mysql.sock’, you can confirm it by using $ locate mysql.sock on a Terminal.

So basically you have to change the php default connection socket to mysql to ‘/private/tmp/mysql.sock‘ . To do this you have to edit your php.ini – probably located at ‘/private/etc/php.ini‘ – via:

* $ sudo nano /private/etc/php.ini
* ctrl+w (where is) “mysql.default_socket“
* alter to “mysql.default_socket = /private/tmp/mysql.sock”
* crtl+x followed by y and enter to save php.ini
* $ sudo httpd -k restart to restart Apache 2

Retry connecting to mysql localhost on php – should be working :)

Update:
if you use mysqli you also must set “mysqli.default_socket = /private/tmp/mysql.sock” on php.ini;

from: http://techtrouts.com/mac-mysql-does-not-connect-on-localhost-but-connects-on-127001/

Wednesday, August 3, 2011

Fatal error: Uncaught exception 'RuntimeException' with message 'Failed to write cache file

Fatal error: Uncaught exception 'RuntimeException' with message
'Failed to write cache file

give your catch folder a permission to write and also need give the log folder a write permission as well.

Friday, July 29, 2011

Composition, Aggregation and Inheritance

Composition: A object owns B object. such as University composition of Department objects

Aggregation: A object has B object. A is an Aggregation of B. such as Department has Professor objects, and those professor exist outside the department, they maybe a member of another Department.
           class A contains references to a class B whose instances exist and are accessible outside of A. We say A is an aggregation of B

Inheritance: A object is B object. such as a professor is a person. A is an extension of B
            when a class A includes all the members of a class B, we say that A is an extension of B, and that it inherits all the properties of B.

Wednesday, July 6, 2011

口语

low key 低调
I've been back and forth.我犹豫不定。
squeezed juice 鲜榨的果汁
juice with pulp 带果肉的果汁
side effect 副作用
he can't come to the phone now.他现在不能接电话
herbal tea 花草茶
ready for a refill?我再给你倒一杯吧?
I love what you have done with this place.我喜欢这里的布置。
what was tonight?今晚本来要做什么?
I can't feel my hands.我手麻了。
have an affair 外遇
will anyone miss me if i weren't here?我在不在这里有什么区别吗?
I saw a lot of stuff.我大开眼界了、
call security 通知警卫
dog walker 遛狗的人
does sth. mean squat to you?对你来说sth狗屁不是吗?
what's up with the greedy?怎么这么贪啊?
work an extra shift 多轮一班
go on, i dare you!有种你就去!
you are a freak!你这个变态!
I sensed it was you.我感觉到是你了、
I apologize on behalf of him.我替他道歉。
why are you changing the subject?为什么要转移话题?
this is so meant to be!这就是天意!
there's no need to place blame.没有指责的必要。
curling iron 卷发机
it's gonna leave a stain。这要留印子的。
I have part of the fault.我也有责任。
distract her with a doll 拿娃娃哄她开心
they are all well received 收到的反响都很好
talk you up 说你的好话
stand firm to 努力坚持
I was just leering 我只是用余光看看
organize my thoughts 整理思绪
get a little preoccupied 事先有事
no way to recover 没有掩饰的机会了
bouncy 活泼
Intern 实习生
mug抢劫
drug dealer 毒贩子
admire your candor你还真胆大
we are rolling摄像机正在拍摄
hairnet发罩
go through this stack 看看这一叠
are you spying on me?你监视我?
just messing with you!跟你开玩笑呢!
enough is enough!闹够了
flyers 寻人(物)海报
it's insensitive of me。我这么做很伤人
you don't have to brag。拽什么啊?
nod along 跟着点头
a totally different subject 完全题外话
I thought it was the other way around 我以为是反过来的
close my account 注销银行卡
cuff him up 把他铐起来
Woody,tingly 痒
creep me out 雷死我了
no peeking不要偷看啊
sneakbite kit毒蛇解药
I feel wild today 我今天好亢奋!
I'm kind of beat 我有点累了
my ears are ringing so bad.我耳鸣得厉害。
can you get the door please?你能去开门吗
make a huge fool of myself 出了洋相
are you mocking me?你嘲笑我?
hatrack 草包
sth.is beyond crap 那是扯淡
any luck?找到了吗?
don't you rush me.别催我!
it doesn't count.那不算。
she's gonna be crushed.她会崩溃的。
she's healed.她好了。(病或者伤害)
goose bumps 鸡皮疙瘩
overreact 反应过度
patch things up with sb.和某人修复关系
pierce my ears 打耳洞
cross that off my list 从单子上划掉
how did it go?怎么样?
present an award 颁奖
natural charisma 天生丽质
cut him some slack 放他一马
get over with it 忘记
get in line 排队(everybody get in line)大家排好队
I don't have the energy for this我没有能力应付这个
you got me.你还真问住我了

Monday, June 27, 2011

痣的一些说法

脚心上的痣: 走四方
脚背上的痣: 男的是有风骚运,女的没有多大的含义
脚跟上的痣: 做事稳扎稳打,有点官运,做事情踏实
手臂上的痣: 好一点
手掌上的痣: 不好
肩上有痣: 一痣在肩,种田打铁
耳朵下的痣: 耳朵根软

Wednesday, March 9, 2011

Raymond: Install moodle under linux plesk

Raymond: Install moodle under linux plesk: "I have had so many issues installing Moodle and in searching the forums have found that many people had similar issues, though mine perssist..."

Install moodle under linux plesk

I have had so many issues installing Moodle and in searching the forums have found that many people had similar issues, though mine perssisted. So I figured I'd write a little guide with my experiences in it to help others in their search.

I'm running moodle with mediatemple.net on a dedicated virtual server. Specs are:

* CentOS release 5 (Final)
* Apache (version 2.2.3)
* Perl (version 5.8.8)
* PHP (version 5.2.5)
* MySQL (version 5.0.22)

This should help with pretty much any Linux/Unix OS on a Vhosts/Plesk setup.

First skip the install.php process and edited the config.php file directly. In order to do this you need to make the folder moodledata outside of your httpdocs directory.

Unfortunately you likely can't do that without root access. So SSH into the server with root and mkdir moodledata in your vhosts/domain.com/ directory.

chmod the directory to 777 (try different permissions once you get it to work). chown the directory with -apache -apache

Now you need to turn off php safe_mode in your php.ini file likely located in your /etc/ folder. Just change safe_mode on to safe_mode off. Then restart your appache server, but if you follow the rest of the instructions you'll need to do that later anyway.

Funny thing is - this will get you past the installation phase. Unfortunately, won't let you do anything inside Moodle. You won't be able to create courses or add users. If you follow your error log it will say open_basedir restrictions in effect, is outside the specified path(s). Or something similar.

There are many posts in the forum for ways to deal with open_basedir restrictions and only one of them worked for my vhosts setup...

in /var/www/vhosts/domain.com/conf create a file called vhost.conf

Inside put:



php_admin_flag engine on

php_admin_value open_basedir "/var/www/vhosts/domain.com/httpdocs/:/var/www/vhosts/domain.com/moodledata:/tmp"



If you do this you'll be able add users and even upload users from a csv file with the right plugin. You'll need to enter this command in your SSH console:

/usr/local/psa/admin/sbin/websrvmng --reconfigure-vhost --vhost-name=domain.com

And restart your server.

Unfortunately, if your setup is like mine, this will still leave you with one more problem. If you try to upload files to sitefiles or to courses it will say "the site administrator needs to fix file permissions". And if you check your server logs it will give you the same open_basedir restrictions error as before.

You also need to create another entry in your vhost.conf file:



php_admin_flag engine on

php_admin_value open_basedir "/var/www/vhosts/domain.com/httpdocs/moodledata/:/var/www/vhosts/domain.com:/tmp"



The first entry ensures that httpdocs can write to moodledata but this second one ensures moodledata can write back to httpdocs. Don't forget to:

/usr/local/psa/admin/sbin/websrvmng --reconfigure-vhost --vhost-name=domain.com

and restart your apache server.

As an alternative, if you want, you MIGHT be able to turn off open_basedir restrictions inside your php.ini file. I didn't get to trying this but have a feeling that it won't work.

The reason it won't work on a vhost setup is that the open_basedir command is located in A LOT OF PLACES, not just php.ini. In some places it's turned on, in others it's turned off. You essentially need to specify whether it's on or off on a PER DOMAIN but also PER DIRECTORY basis.

Hope this helps someone,





Me, again. Just encountered and resolved a strange behavior involving the "php_admin_value open_basedir is in effect" error message.

I spent much of today struggling with installing Moodle on a different domain also hosted on my new VPS Plesk account. I went through exactly the same procedures described above by Tarik as I did yesterday, but instead of sweet success, I encountered the "open_basedir in effect" error message from hell on the second page of the Moodle installation process. Arghhh!!!

Looking carefully at the error message, I noticed an inconsistency in the message-- the first part of the error message mentions the directory "moodledata" is not in the permitted directory "moodledata1"-- which is true since I had named the moodle data directory placed above the web root "moodledata1". But here was the Moodle install.php file apparently looking for the directory moodledata, seemingly before it had asked me for the name of the data directory. Odd. I've never seen that script behavior before.

So I decided to try feeding install.php what it seemed to be asking for. I renamed moodledata1 to moodledata, changed the references in my vhost.conf file, reconfigured vhost, restarted Apache2, and then pointed my browser to install.php-- and this time Moodle sailed through the installation without a hiccup!

This is very strange, I think, because I have installed Moodle several other times on non-VPS hosts (shared hosting with Cpanel access) using various custom names for the Moodle data directory without Moodle ever complaining.

Has anyone else run into this problem?

I was hoping to install a second Moodle on the same domain to serve as an archive, but if I can only name and use ONE Moodle data directory... then that's a problem.

Puzzled for now. But at least my single Moodle installation is working. thoughtful




http://download1.parallels.com/Plesk/PPP9/Doc/en-US/plesk-9.0-administrators-guide.pdf

让 CodeIgniter 支持 $_GET

方法一:
CI默认过滤了$_GET

需要传递get参数时一般直接 /参数一/参数二
详见手册说明:http://codeigniter.org.cn/user_guide/general/controllers.html#passinguri

但是有时候需要传递很长的复杂的url,比如常用的 http://www.nicewords.cn/index.php/controller/method/?backURL=http://baidu.com/blog/hi

这时 这种模式就行不通了。参数中本身的/会与默认的分隔符冲突

解决方案:

1) 在config.php 中,将‘uri_protocol’ 设置为 ‘PATH_INFO’.
PHP
$config['uri_protocol'] = "PATH_INFO";
复制代码


2) 在需要使用$_GET的之前加:
PHP
parse_str($_SERVER['QUERY_STRING'], $_GET);
复制代码


这样,形如 index.php/blog/list?parm=hello&page=52 就可以运行了。

官网说明:
http://codeigniter.com/wiki/QUERY_STRING_GET/
也许您还可能感兴趣:

* • PHP搭建基于CI框架的REST服务架构


方法二:
我在官網討論區看到一篇很不錯的解法 http://codeigniter.com/forums/viewthread/68698/#389281
他只有二個步驟

1.config.php的設定
$config['uri_protocol'] = "REQUEST_URI";
$config['enable_query_strings'] = TRUE;


2.將以下程式存檔,檔名叫MY_URI.php
存檔路徑 自己的system/application/libraries/ folder

PHP

class MY_URI extends CI_URI {

function MY_URI() {
parent::CI_URI();
}

// --------------------------------------------------------------------

/**
* Override the _parse_request_uri method so it allows query strings through
*
* @access private
* @return string
*/
function _parse_request_uri()
{
if ( ! isset($_SERVER['REQUEST_URI']) OR $_SERVER['REQUEST_URI'] == '')
{
return '';
}

$uri = explode("?",$_SERVER['REQUEST_URI']); // This line is added to the original
$request_uri = preg_replace("|/(.*)|", "\\1", str_replace("\\", "/", $uri[0])); // This line changed
// Everything else is just the same

if ($request_uri == '' OR $request_uri == SELF)
{
return '';
}

$fc_path = FCPATH;
if (strpos($request_uri, '?') !== FALSE)
{
$fc_path .= '?';
}

$parsed_uri = explode("/", $request_uri);

$i = 0;
foreach(explode("/", $fc_path) as $segment)
{
if (isset($parsed_uri[$i]) AND $segment == $parsed_uri[$i])
{
$i++;
}
}

$parsed_uri = implode("/", array_slice($parsed_uri, $i));

if ($parsed_uri != '')
{
$parsed_uri = '/'.$parsed_uri;
}

return $parsed_uri;
}

}

?>
复制代码

Monday, February 21, 2011

@在php里的作用或用法

使用@来抑制单个错误
例如:
@include(‘conn.php’);//不显示包含文件不存在的错误
$num=@(8/0);//不显示除以0的错误
注意:@符号只能处理表达式,不能在条件语句、循环语句、函数定义之前使用等。
原则:将@用于那些执行失败时不影响脚本整体功能的函数

Saturday, February 12, 2011

交替种植

都说入了乡要随俗,而随新西兰的俗是少不了料理和种植花园的。这几年,自家拥有大小不等的蔬菜园风行全国,时髦程度似乎正在朝着全民运动的方向发展。本人也在一些社交聚会场合下,多次看到有人自豪地带来自己种植的蔬菜,而讨论菜园子或赞赏果实之类的话题,也成为生人和半熟人之间的“破冰”工具。已经拥有菜园子的、没有但希望有的、拿不定主意该不该有的,都愿和有种植经验的人一起津津乐道,好像大家都找到了一把打开话匣子的钥匙。

菜园的流行,除了人们想吃到自己种的全天然新鲜蔬菜外,也不能不归功于菜园在搭建上越来越简化,甚至是模式化的革新——这就是建在地面上的、不用挖土就搞定的菜园。

在地面上直接搭建菜园,不但种东西非常容易,对这些腰腿不便或喜欢“偷懒”的人来说,也更加容易打理。如果您有读这篇文章的这点时间,就差不多够安置一个有格调、易打理的厨房菜园并种上作物,然后开始等候您的收成吧。

NZ Herald“周末户外工程”DIY专家Justin Newcombe说:“我推荐你的这个办法不需要挖地种植,这意味着你能从头到尾在20分钟内搞定这个菜园。”

直接在土地上搭围栏

照 Newcombe的解释,地面上种植,正像名字所建议的一样,种植东西不需要在花园中挖坑。与在地下种植所不同的是,每次你打算种新的东西了,只需在原来种植后的覆土上,再加一层覆土就可以了。你可能会想,嗯,那会不会菜地因为一次又一次地种植,添加一层又一层的覆土,最终还不会堆得像草垛一样高了? 这个不用担心。因为原先铺在下面的草已经充分分解,变成了天然肥料。这样做的主要原理是不干扰花园基础土层。因为如果土地不被一次次地挖掘,土地本身就不需要一次次地重新建立新的生物环境,这样土壤会有更高的生产效益,由此也为所种植物提供更高的营养成分。

这种方式的另一种叫法是“薄层(草类残株树皮、木屑等)覆盖”。这是一种被动式,将还未完全降解的生物变成肥料的一种办法。这种办法利用您将要用来做肥料用的生料,一层一层地铺下,每层大致10公分,这样就可以建立起菜园的种植基础床了。

程序的开始应该是先在地上放一层薄板,来防止杂草丛生,然后放一层动物的粪(最普遍使用的是羊粪,有包装好的干的在商店里出售,也有新鲜的在农场里出售)。如果这太麻烦,可以用厨房里的丢弃食物、剪下来的草或这两种的混合物,然后铺一层干的碎叶子或干草,最后再铺上天然肥料或土,亦或这两种的混合。

重要的是,你每放一层,都要重新洒水,每次种新一茬植物都重复这个操作。这样不但能建立新的土壤环境,也能明显地提高现有土壤的质量。

下面的步骤是Justin Newcombe为人们设计的快速菜园。此程序简化掉了使用薄层覆盖的方式,而换成市售的花园混合土。具体材料为:两根铁轨枕木,纸板和花园混合土。你也可以根据自己的需要,用整齐的枕木加大尺寸,一定要记住,花园的好坏关键在于土壤的质量。

第一步:剪下你想用来做菜园的那块地儿的草。

第二步:用两条铁轨枕木,从中间切开,修理一下粗糙的木边儿。

第三步:把枕木在地上摆成个方块儿。检查好确实是直角,然后钉钉子。

第四步:在方块菜园里铺一层剪下的草,淋透水。

第五步:在草层上放纸板,淋透水。

第六步:用新鲜肥料土或土,或者两种混合物填满池子。

第七步:每次在菜园里种新植物,就在老菜园的土层上,放上一两层报纸,然后放一层新鲜肥料或土。不用费心拔掉原先的老植物和根,从土层底部剪掉它就行了。

花园的革新

Justin Newcombe 解释说,交替种植绝对是让你的花园高产的关键。

花园里的交替种植,就像驾驶时的换档。在饥饿的中世纪欧洲,人们实行两档轮种,但是决定性改变,是在他们添加了第三档后发生的,而当他们以高涨的情绪,用近乎亵渎神圣的实验精神,轮种了第四档后,不知不觉中,这些“缺德”的农奴们开始像疯了一样地一茬茬地种植和收获。他们的耕作方式,竟也被当作是最好的耕作技术传了下来。

实际上,最科学的办法是采用交叉轮作耕种,这样可以免使土地贫瘠,也能减少致病菌、害虫和疾病的出现。

在播种升级到四档轮种之前,历史上土地都是隔年休耕,也就是说一年耕种,下一年空闲。一个240英亩的土地,一年只用120英亩,不是很有效率。Newcombe为人们提供的轮作系统是一个可以提高土地质量的四部曲:大多数轮作的重点都围绕着生产和消耗氮元素进行的。

下面是这四部曲中,在作物的应用方面的一个快速总结:

1. 豆类

大多数用肥料的庄稼比如羽扇豆,都是增加土壤氮含量的工具,因为它们能够把空气中的氮转化到土地里去,扁豆和豌豆也是如此。在种植时,可以加上一杯烧过的木灰在里面。氮一旦浸入到了土壤里,它的消耗程序随即就开始了。

2. 叶子产品

生菜、菠菜、洋白菜以及它们的同类是下一步。很多人也在此阶段种植西兰花和菜花。我把这种菜当作“衔接”品种,因为这两种菜在氮少些的土壤里长得最好。

3. 果类植物

西红柿、茄子、玉米、南瓜、西瓜和柿子椒,都是在几乎没有氮的土壤环境下才能结出好的果子来的。但是在种植它们的时候应加上肥料,这样它们的茎干在开花之前很结实。如果氮多了,作物将是叶茂果小。

4. 根类

胡萝卜、欧洲萝卜(parsnip)和甜菜, 都是痛恨太多氮的同类,它们在土地氮缺乏的轮种周期底层,表现最为出色。Newcombe把土豆、白薯和葱蒜类蔬菜划为另外一族。它们的种植时间是在根类植物之前和果类植物之后的中间。

中世纪实施的让土地自燃恢复的休耕方式,也不是都不可行了,只是我们可以用种植调味草、草和花,来重新为疲惫的土壤增加生命力。这叫作“草地轮作”,一般都是在果类植物收获之后进行。
这样做的目的是把土地在种植根类食物之前调理好。最流行的草地轮作植物是苣荬菜,这种植物的根很深,能够从土壤的深处结构中开采出微元素。在你暂停一两个月的空余种植时间里,菜地轮作是个很好的做法。

“如果您还没有采用过植物交叉轮作的方式,我建议您试一试,这是一个耕作学上最基本的概念。就像我这个925公克的西红柿所显示的,结果胜于雄辩。我这可不是显耀,我只是说说而已。”

Friday, January 21, 2011

寿司

寿司米饭的蒸法!
大米用水滔干净直到水清澈见底为止,然后放在筛子里滤干水分!
等大米晾干后,一般我们用大米和水的比例为 1:1.2 这个比例来蒸米饭!也就是说你要是放1000毫升的米就要放1200毫升的水!这个比例是比较通用的!比较正规的是一般买米回来要测试米的吃水性,每种米的吃水性都不一样!一般新米的吃水性会高一点可能是1:1.3 ! 我们一般买回来米第一次一般用1:1的比例来蒸测试一下哦!硬的话下次就用1:1.2 !在硬的话就用1:1.3! 这个比较专业我就是和大家讲一下! 一般用我给的1:1.2不会有问题! 蒸米饭的时候可以在里面放一小块昆布(干海带)!可以增加寿司米饭的香味!


米饭跟寿司醋的调和比例

200毫升的米 蒸好饭后!加50毫升的寿司醋就可以了!

寿司醋的调制方法
日本白菊醋 500 毫升 这个一般日本超市有卖,白醋不能代替
盐 100 克
糖 220克
干昆布(大干海带)少许
醋 盐 糖 比例为
5:1:2
以上东西放一起搅拌到醋变的清澈.可以稍微加热,但是不能加热到沸腾!昆布可以不放.
这个做好之后就可以做寿司饭里! 就是把这个醋均匀的加到蒸好的米饭里!均匀的倒在米饭上,然后用饭铲一直搅拌直到米饭变凉!

Thursday, January 20, 2011

Best Practices for Speeding Up Your Web Site

http://developer.yahoo.com/performance/rules.html

linux下的文件结构

linux下的文件结构,看看每个文件夹都是干吗用的
/bin 二进制可执行命令
/dev 设备特殊文件
/etc 系统管理和配置文件
/etc/rc.d 启动的配置文件和脚本
/home 用户主目录的基点,比如用户user的主目录就是/home/user,可以用~user表示
/lib 标准程序设计库,又叫动态链接共享库,作用类似windows里的.dll文件
/sbin 系统管理命令,这里存放的是系统管理员使用的管理程序
/tmp 公用的临时文件存储点
/root 系统管理员的主目录(呵呵,特权阶级)
/mnt 系统提供这个目录是让用户临时挂载其他的文件系统。
/lost+found 这个目录平时是空的,系统非正常关机而留下“无家可归”的文件(windows下叫什么.chk)就在这里
/proc 虚拟的目录,是系统内存的映射。可直接访问这个目录来获取系统信息。
/var 某些大文件的溢出区,比方说各种服务的日志文件
/usr 最庞大的目录,要用到的应用程序和文件几乎都在这个目录。其中包含:
/usr/x11r6 存放x window的目录
/usr/bin 众多的应用程序
/usr/sbin 超级用户的一些管理程序
/usr/doc linux文档
/usr/include linux下开发和编译应用程序所需要的头文件
/usr/lib 常用的动态链接库和软件包的配置文件
/usr/man 帮助文档
/usr/src 源代码,linux内核的源代码就放在/usr/src/linux里
/usr/local/bin 本地增加的命令
/usr/local/lib 本地增加的库

通常情况下,根文件系统所占空间一般应该比较小,因为其中的绝大部分文件都不需要
经常改动,而且包括严格的文件和一个小的不经常改变的文件系统不容易损坏。
除了可能的一个叫/ v m l i n u z标准的系统引导映像之外,根目录一般不含任何文件。所有
其他文件在根文件系统的子目录中。
1. /bin目录
/ b i n目录包含了引导启动所需的命令或普通用户可能用的命令(可能在引导启动后)。这些
命令都是二进制文件的可执行程序( b i n是b i n a r y - -二进制的简称),多是系统中重要的系统文件。
2. /sbin目录
/ s b i n目录类似/bin ,也用于存储二进制文件。因为其中的大部分文件多是系统管理员使
用的基本的系统程序,所以虽然普通用户必要且允许时可以使用,但一般不给普通用户使用。
3. /etc目录
/ e t c目录存放着各种系统配置文件,其中包括了用户信息文件/ e t c / p a s s w d,系统初始化文
件/ e t c / r c等。l i n u x正是*这些文件才得以正常地运行。
4. /root目录
/root 目录是超级用户的目录。
5. /lib目录
/ l i b目录是根文件系统上的程序所需的共享库,存放了根文件系统程序运行所需的共享文
件。这些文件包含了可被许多程序共享的代码,以避免每个程序都包含有相同的子程序的副
本,故可以使得可执行文件变得更小,节省空间。
6. /lib/modules 目录
/lib/modules 目录包含系统核心可加载各种模块,尤其是那些在恢复损坏的系统时重新引
导系统所需的模块(例如网络和文件系统驱动)。
7. /dev目录
/ d e v目录存放了设备文件,即设备驱动程序,用户通过这些文件访问外部设备。比如,用
户可以通过访问/ d e v / m o u s e来访问鼠标的输入,就像访问其他文件一样。
8. /tmp目录
/tmp 目录存放程序在运行时产生的信息和数据。但在引导启动后,运行的程序最好使用
/ v a r / t m p来代替/tmp ,因为前者可能拥有一个更大的磁盘空间。
9. /boot目录
/ b o o t目录存放引导加载器(bootstrap loader)使用的文件,如l i l o,核心映像也经常放在这里,
而不是放在根目录中。但是如果有许多核心映像,这个目录就可能变得很大,这时使用单独的
文件系统会更好一些。还有一点要注意的是,要确保核心映像必须在i d e硬盘的前1 0 2 4柱面内。
10. /mnt目录
/ m n t目录是系统管理员临时安装( m o u n t )文件系统的安装点。程序并不自动支持安装到
/mnt 。/mnt 下面可以分为许多子目录,例如/mnt/dosa 可能是使用m s d o s文件系统的软驱,
而/mnt/exta 可能是使用e x t 2文件系统的软驱,/mnt/cdrom 光驱等等。
11. /proc, /usr,/var,/home目录
其他文件系统的安装点。



下面详细介绍;

/etc文件系统
/etc 目录包含各种系统配置文件,下面说明其中的一些。其他的你应该知道它们属于哪个
程序,并阅读该程序的m a n页。许多网络配置文件也在/etc 中。
1. /etc/rc或/etc/rc.d或/etc/rc?.d
启动、或改变运行级时运行的脚本或脚本的目录。
2. /etc/passwd
用户数据库,其中的域给出了用户名、真实姓名、用户起始目录、加密口令和用户的其
他信息。
3. /etc/fdprm
软盘参数表,用以说明不同的软盘格式。可用setfdprm 进行设置。更多的信息见s e t f d p r m
的帮助页。
4. /etc/fstab
指定启动时需要自动安装的文件系统列表。也包括用swapon -a启用的s w a p区的信息。
5. /etc/group
类似/etc/passwd ,但说明的不是用户信息而是组的信息。包括组的各种数据。
6. /etc/inittab
init 的配置文件。
7. /etc/issue
包括用户在登录提示符前的输出信息。通常包括系统的一段短说明或欢迎信息。具体内
容由系统管理员确定。
8. /etc/magic
“f i l e”的配置文件。包含不同文件格式的说明,“f i l e”基于它猜测文件类型。
9. /etc/motd
m o t d是message of the day的缩写,用户成功登录后自动输出。内容由系统管理员确定。
常用于通告信息,如计划关机时间的警告等。
10. /etc/mtab
当前安装的文件系统列表。由脚本( s c r i t p )初始化,并由mount 命令自动更新。当需要一
个当前安装的文件系统的列表时使用(例如df 命令)。
11. /etc/shadow
在安装了影子( s h a d o w )口令软件的系统上的影子口令文件。影子口令文件将/ e t c / p a s s w d
文件中的加密口令移动到/ e t c / s h a d o w中,而后者只对超级用户( r o o t )可读。这使破译口令更困
难,以此增加系统的安全性。
12. /etc/login.defs
l o g i n命令的配置文件。
13. /etc/printcap
类似/etc/termcap ,但针对打印机。语法不同。
14. /etc/profile 、/ e t c / c s h . l o g i n、/etc/csh.cshrc
登录或启动时b o u r n e或c shells执行的文件。这允许系统管理员为所有用户建立全局缺省环境。
15. /etc/securetty
确认安全终端,即哪个终端允许超级用户( r o o t )登录。一般只列出虚拟控制台,这样就不
可能(至少很困难)通过调制解调器( m o d e m )或网络闯入系统并得到超级用户特权。
16. /etc/shells
列出可以使用的s h e l l。chsh 命令允许用户在本文件指定范围内改变登录的s h e l l。提供一
台机器f t p服务的服务进程ftpd 检查用户s h e l l是否列在/etc/shells 文件中,如果不是,将不允
许该用户登录。
17. /etc/termcap
终端性能数据库。说明不同的终端用什么“转义序列”控制。写程序时不直接输出转义
序列(这样只能工作于特定品牌的终端),而是从/etc/termcap 中查找要做的工作的正确序列。
这样,多数的程序可以在多数终端上运行。


/dev文件系统
/dev 目录包括所有设备的设备文件。设备文件用特定的约定命名,这在设备列表中说明。
设备文件在安装时由系统产生,以后可以用/dev/makedev 描述。/ d e v / m a k e d e v.local 是
系统管理员为本地设备文件(或连接)写的描述文稿(即如一些非标准设备驱动不是标准
makedev 的一部分)。下面简要介绍/ d e v下一些常用文件。
1. /dev/console
系统控制台,也就是直接和系统连接的监视器。
2. /dev/hd
i d e硬盘驱动程序接口。如: / d e v / h d a指的是第一个硬盘, h a d 1则是指/ d e v / h d a的第一个
分区。如系统中有其他的硬盘,则依次为/ d e v / h d b、/ d e v / h d c、. . . . . .;如有多个分区则依次为
h d a 1、h d a 2 . . . . . .
3. /dev/sd
s c s i磁盘驱动程序接口。如有系统有s c s i硬盘,就不会访问/ d e v / h a d,而会访问/ d e v / s d a。
4. /dev/fd
软驱设备驱动程序。如: / d e v / f d 0指系统的第一个软盘,也就是通常所说的a:盘,
/ d e v / f d 1指第二个软盘,. . . . . .而/ d e v / f d 1 h 1 4 4 0则表示访问驱动器1中的4 . 5高密盘。
5. /dev/st
s c s i磁带驱动器驱动程序。
6. /dev/tty
提供虚拟控制台支持。如: / d e v / t t y 1指的是系统的第一个虚拟控制台, / d e v / t t y 2则是系统
的第二个虚拟控制台。
7. /dev/pty
提供远程登陆伪终端支持。在进行te l n e t登录时就要用到/ d e v / p t y设备。
8. /dev/ttys
计算机串行接口,对于d o s来说就是“ c o m 1”口。
9. /dev/cua
计算机串行接口,与调制解调器一起使用的设备。
10. /dev/null
“黑洞”,所有写入该设备的信息都将消失。例如:当想要将屏幕上的输出信息隐藏起来
时,只要将输出信息输入到/ d e v / n u l l中即可。


/usr文件系统
/usr 是个很重要的目录,通常这一文件系统很大,因为所有程序安装在这里。/usr 里的
所有文件一般来自l i n u x发行版( d i s t r i b u t i o n );本地安装的程序和其他东西在/usr/local 下,因为这样可以在升级新版系统或新发行版时无须重新安装全部程序。/usr 目录下的许多内容是
可选的,但这些功能会使用户使用系统更加有效。/ u s r可容纳许多大型的软件包和它们的配置
文件。下面列出一些重要的目录(一些不太重要的目录被省略了)。
1. /usr/x11r6
包含x wi n d o w系统的所有可执行程序、配置文件和支持文件。为简化x的开发和安装,
x的文件没有集成到系统中。x wi n d o w系统是一个功能强大的图形环境,提供了大量的图形
工具程序。用户如果对microsoft wi n d o w s或m a c h i n t o s h比较熟悉的话,就不会对x wi n d o w系统感到束手无策了。
2. /usr/x386
类似/ u s r / x 11r6 ,但是是专门给x 11 release 5的。
3. /usr/bin
集中了几乎所有用户命令,是系统的软件库。另有些命令在/bin 或/usr/local/bin 中。
4. /usr/sbin
包括了根文件系统不必要的系统管理命令,例如多数服务程序。
5. /usr/man、/ u s r / i n f o、/ u s r / d o c
这些目录包含所有手册页、g n u信息文档和各种其他文档文件。每个联机手册的“节”
都有两个子目录。例如: / u s r / m a n / m a n 1中包含联机手册第一节的源码(没有格式化的原始文
件),/ u s r / m a n / c a t 1包含第一节已格式化的内容。l联机手册分为以下九节:内部命令、系统调
用、库函数、设备、文件格式、游戏、宏软件包、系统管理和核心程序。
6. /usr/include
包含了c语言的头文件,这些文件多以. h结尾,用来描述c语言程序中用到的数据结构、
子过程和常量。为了保持一致性,这实际上应该放在/usr/lib 下,但习惯上一直沿用了这个名
字。
7. /usr/lib
包含了程序或子系统的不变的数据文件,包括一些s i t e - w i d e配置文件。名字l i b来源于库
(library); 编程的原始库也存在/usr/lib 里。当编译程序时,程序便会和其中的库进行连接。也
有许多程序把配置文件存入其中。
8. /usr/local
本地安装的软件和其他文件放在这里。这与/ u s r很相似。用户可能会在这发现一些比较大
的软件包,如t e x、e m a c s等。


/var文件系统
/var 包含系统一般运行时要改变的数据。通常这些数据所在的目录的大小是要经常变化
或扩充的。原来/ v a r目录中有些内容是在/ u s r中的,但为了保持/ u s r目录的相对稳定,就把那
些需要经常改变的目录放到/ v a r中了。每个系统是特定的,即不通过网络与其他计算机共享。
下面列出一些重要的目录(一些不太重要的目录省略了)。
1. /var/catman
包括了格式化过的帮助( m a n )页。帮助页的源文件一般存在/ u s r / m a n / m a n中;有些m a n页
可能有预格式化的版本,存在/ u s r / m a n / c a t中。而其他的m a n页在第一次看时都需要格式化,
格式化完的版本存在/var/man 中,这样其他人再看相同的页时就无须等待格式化了。
(/var/catman 经常被清除,就像清除临时目录一样。)
2. /var/lib
存放系统正常运行时要改变的文件。
3. /var/local
存放/usr/local 中安装的程序的可变数据(即系统管理员安装的程序)。注意,如果必要,
即使本地安装的程序也会使用其他/var 目录,例如/var/lock 。
4. /var/lock
锁定文件。许多程序遵循在/var/lock 中产生一个锁定文件的约定,以用来支持他们正在
使用某个特定的设备或文件。其他程序注意到这个锁定文件时,就不会再使用这个设备或文
件。
5. /var/log
各种程序的日志( l o g )文件,尤其是login (/var/log/wtmp log纪录所有到系统的登录和注
销) 和syslog (/var/log/messages 纪录存储所有核心和系统程序信息)。/var/log 里的文件经常不
确定地增长,应该定期清除。
6. /var/run
保存在下一次系统引导前有效的关于系统的信息文件。例如, /var/run/utmp 包含当前登
录的用户的信息。
7. /var/spool
放置“假脱机( s p o o l )”程序的目录,如m a i l、n e w s、打印队列和其他队列工作的目录。每
个不同的s p o o l在/var/spool 下有自己的子目录,例如,用户的邮箱就存放在/var/spool/mail 中。
8. /var/tmp
比/tmp 允许更大的或需要存在较长时间的临时文件。
注意系统管理员可能不允许/var/tmp 有很旧的文件。


/proc文件系统
/proc 文件系统是一个伪的文件系统,就是说它是一个实际上不存在的目录,因而这是一
个非常特殊的目录。它并不存在于某个磁盘上,而是由核心在内存中产生。这个目录用于提
供关于系统的信息。下面说明一些最重要的文件和目录(/proc 文件系统在proc man页中有更详
细的说明)。
1. /proc/x
关于进程x的信息目录,这一x是这一进程的标识号。每个进程在/proc 下有一个名为自
己进程号的目录。
2. /proc/cpuinfo
存放处理器( c p u )的信息,如c p u的类型、制造商、型号和性能等。
3. /proc/devices
当前运行的核心配置的设备驱动的列表。
4. /proc/dma
显示当前使用的d m a通道。
5. /proc/filesystems
核心配置的文件系统信息。
6. /proc/interrupts
显示被占用的中断信息和占用者的信息,以及被占用的数量。
7. /proc/ioports
当前使用的i / o端口。
8. /proc/kcore
系统物理内存映像。与物理内存大小完全一样,然而实际上没有占用这么多内存;它仅
仅是在程序访问它时才被创建。(注意:除非你把它拷贝到什么地方,否则/proc 下没有任何
东西占用任何磁盘空间。)
9. /proc/kmsg
核心输出的消息。也会被送到s y s l o g。
10. /proc/ksyms
核心符号表。
11. /proc/loadavg
系统“平均负载”; 3个没有意义的指示器指出系统当前的工作量。
12. /proc/meminfo
各种存储器使用信息,包括物理内存和交换分区( s w a p )。
13. /proc/modules
存放当前加载了哪些核心模块信息。
14. /proc/net
网络协议状态信息。
15. /proc/self
存放到查看/proc 的程序的进程目录的符号连接。当2个进程查看/proc 时,这将会是不同
的连接。这主要便于程序得到它自己的进程目录。
16. /proc/stat
系统的不同状态,例如,系统启动后页面发生错误的次数。
17. /proc/uptime
系统启动的时间长度。
18. /proc/version
核心版本。

Thursday, January 13, 2011

Codeigniter and Ajax

在使用codeigniter前,我已经接触过一段时间的jquery了。Jquery高效的开发速度,良好的封装和简洁而灵活的语法都给我留下了很深刻的印象。 而它的ajax类让开发ajax成为了一种乐趣。你可以ajax类轻易的POST或者GET request。 它能帮助用户完成codeigniter不能完成的功能。 我才刚开始接触ci时间不长,ci轻巧而高效的框架同样给我留下了很深的印象。CI 的MVC 分离也做的非常的好,令人眼前一亮。但不可否认,ci也有它存在的问题。那就是对新技术的支持不够。类似json, ajax这些我们在网络开发中已经十分普及的技术,它都没有完成支持。 前些时间,由于自己想写一个php的项目,前段时间我调查了一下, 似乎大多数人都在使用xajax和其它封装好的php类。对此,我不是很喜欢,因为我一直认为框架会降低程序的执行效率。 所以我尝试着在ci框架中直接使用js框架jquery。 前天经过反复的试验,我找到了一个我自认为满意的方法, 并且发现在ci中实现ajax远比自己想像的简单。而且也没有像我自己想像的那样,破坏了MVC的完整性。



下面我把我的代码贴出来,和大家分享一下。 



控制器:

PHP


function getPhoto()

{

          //query the picture from model

         $query = $this->photomodel->getPic($_POST['picID']);

                        

          if($query->num_rows() > 0)

          {

                     $row = $query->row();

                     $output = "<div class='winBar'><ul><li>_</li><li>x</li></ul></div><div class='winContent'><div id='photo_title'>" . $row->photoName . "</div><div id='photo_item'>" . $row->photoLink . "</div><div id='photo_comment'>" . $row->comment . "</div></div>";

           }

           else

                  $output = "no picture was found";

          echo($output);  

 }


复制代码



视图:

JS


$(".photoblock").click(function(){

                  $("#photoboard").fadeOut("slow");

                  $(this).css("background-color","#7c2916");

                  $("#loading_message").show();

                                                

                  //post the pictureID to controller and return the picture and embed it to the photoboard.

                   $.ajax({

                               type:"post",

                              data: "picID=" + $(this).attr("id"),

                              url:"<?=base_url()?>photogallery/getPhoto",

                               success: function(result)

                               {

                                          $("#photoboard").fadeTo("slow",0.85).fadeIn("normal").html(result);

 

                                          $("#loading_message").hide();

                                },

                                                            

                               error: function()

                               {

                                          $("#loading_message").hide();

                                                                        alert("ajax error");

                               }

             });

                                                

});


复制代码



这是我写的 photo gallery 的部分代码。目的是在 php 页面中通过点击网页中图片的缩略图,来打开对应的图片进行浏览。

Code 很简单,我也不多解释了。大家需要注意的只是在用 jq post 或者 get 的时候, url 路径一定要用 base_url() 或者 site_url()。

在今后的日子里,如果我对 ci+jq 这一组合有了什么新的体会,我也会在这里和大家分享的。

什么是json



JSON
(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScript Programming LanguageStandard ECMA-262 3rd Edition - December 1999的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。

JSON建构于两种结构:

“名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。

值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。

这些都是常见的数据结构。事实上大部分现代计算机语言都以某种形式支持它们。这使得一种数据格式在同样基于这些结构的编程语言之间交换成为可能。

JSON具有以下这些形式:

对象是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。

数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。

值(value)可以是双引号括起来的字符串(string)、数值(number)、true、false、 null、对象(object)或者数组(array)。这些结构可以嵌套。

字符串(string)是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。

字符串(string)与C或者Java的字符串非常相似。

数值(number)也与C或者Java的数值非常相似。除去未曾使用的八进制与十六进制格式。除去一些编码细节。

空白可以加入到任何符号之间。 以下描述了完整的语言。(以上部分摘自:http://www.json.org/json-zh.html)

 

JSON举例(javascript中使用json):

先来个最简单的:



  1. <script type="text/javascript">

  2.         var user = {"Id":1,"Name":"Hubery","Age":23,"Email":"hubery@163.com"};

  3.         alert(user.Id); //这样访问也没问题alert(user["Id"]);

  4.         alert(user.Name);

  5.         alert(user.Age);

  6.         alert(user.Email);

  7. </script>



我们添加Address属性,定义更细的用户信息结构:



  1. <script type="text/javascript">

  2. var user = 

  3.           {

  4.             "Id":1,

  5.             "Name":"Hubery",

  6.             "Age":23,

  7.             "Address":

  8.               {

  9.                   "City":"Beijing","ZipCode":"111111"

  10.               },

  11.             "Email":"hubery@163.com"

  12.           };

  13.           

  14.           alert(user.Id);

  15.           alert(user.Name);

  16.           alert(user.Age);

  17.           alert(user.Address.City);

  18.           alert(user.Address.ZipCode);

  19.           alert(user.Email);

  20. </script>



下面我们把Address属性定义成数组,用户有两个Address:



  1. <script type="text/javascript">

  2. var user = 

  3.           {

  4.             "Id":1,

  5.             "Name":"Hubery",

  6.             "Age":23,

  7.             "Address":

  8.               [

  9.                 {"City":"Beijing","ZipCode":"111111"},

  10.                 {"City":"Langfang","ZipCode":"222222"}

  11.               ],

  12.             "Email":"hubery@163.com"

  13.           };

  14.           

  15.           alert(user.Id);

  16.           alert(user.Name);

  17.           alert(user.Age);

  18.           alert(user.Address[0].City);//还可以这样:alert(user.Address[0]["City"]);

  19.           alert(user.Address[0].ZipCode);

  20.           alert(user.Address[1].City);

  21.           alert(user.Address[1].ZipCode);

  22.           alert(user.Email);

  23. </script>



如果我们想要一个用户列表,能行吗?答案是,没问题!



  1. <script type="text/javascript">

  2. var user = 

  3.           [

  4.               {

  5.                 "Id":1,

  6.                 "Name":"Hubery",

  7.                 "Age":23,

  8.                 "Address":

  9.                   [

  10.                     {"City":"Beijing","ZipCode":"111111"},

  11.                     {"City":"Langfang","ZipCode":"222222"}

  12.                   ],

  13.                 "Email":"hubery@163.com"

  14.               },

  15.               {

  16.                 "Id":2,

  17.                 "Name":"Chris",

  18.                 "Age":24,

  19.                 "Address":{"City":"Beijing","ZipCode":"100085"},

  20.                 "Email":"chris@163.com"

  21.               }

  22.           ]

  23.           

  24.           alert("Id: "+user[0].Id+"\r\nName: "+

  25.           user[0].Name+"\r\nAge: "+

  26.           user[0].Age+"\r\nAddress: ("+

  27.           user[0].Address[0].City+","+user[0].Address[0].ZipCode+") ("+user[0].Address[1].City+","+user[0].Address[1].ZipCode+")\r\nEmail: "+

  28.           user[0].Email);

  29.           

  30.           alert("Id: "+user[1].Id+"\r\nName: "+

  31.           user[1].Name+"\r\nAge: "+

  32.           user[1].Age+"\r\nAddress: ("+

  33.           user[1].Address.City+","+user[1].Address.ZipCode+")\r\nEmail: "+

  34.           user[1].Email);

  35. </script>


Tuesday, January 11, 2011

db->select();

允许你在SQL查询中写 SELECT 部分:

$this->db->select('title, content, date');

$query = $this->db->get('mytable');

// Produces: SELECT title, content, date FROM mytable
注意: 如果你要查询表中的所有行,你可以不用写这个函数。省略后,CodeIgniter 会认为你要查询全部行(SELECT *)。

$this->db->select() 可接受一个可选的第二个参数。如果你把它设为FALSE, CodeIgniter 将不会使用反引号保护你的字段或者表名。这在进行复合查询时很有用。

$this->db->select('(SELECT SUM(payments.amount) FROM payments WHERE payments.invoice_id=4') AS amount_paid', FALSE);
$query = $this->db->get('mytable');

Saturday, January 8, 2011

驴打滚的做法

做法:

  1、取糯米粉150克放入盆中,再徐徐注入150克清水,其间不停用筷子搅拌,使糯米粉均匀吸收水分;

  2、将结块的糯米粉用手团和在一起,使其成为一个完整的面团,再放入盆中稍稍压平;

  3、将盆放入蒸锅中,用大火蒸制20分钟,从蒸锅中取出放至温热;

  4、取适量椰蓉和熟芝麻备用;

  5、保鲜膜上涂上一层色拉油,放入面团,在盖上一片涂好色拉油的保鲜膜,用擀面杖将面团擀成薄片;

  6、取掉上面的保鲜膜,在面片上面均匀地铺上一层豆沙馅;

  7、从糯米皮一边卷起,直至完全卷成卷状;

  8、用刀将卷好的糯米卷从中间切成两份,其中一份裹上一层熟芝麻,另一份裹上一层椰蓉,用刀切成小段即可。

  喜欢自己做豆馅,豆香更浓也更健康,豆馅的做法见豆馅馒头。以前觉得自己做豆馅很麻烦,其实掌握以关键的几点也很简单。

  豆馅的做法:

  1、要用清水泡好放入冰箱泡一晚,熟得快;

  2、加足量水大火煮开,小火煮一个小时。(至于水量的多少也不一定要按以前在书上看的加三倍的水,只要加足量的水,煮一个小时后豆馅软烂了,可以把多出来的水滤出来,拌入砂糖才炒干就行了,我现在加的水量一般都刚刚合适)。在书上看到日式红豆馅的做法,还要把第一次和第二次煮红豆的水倒出去,为了去涩。不过我就一直煮,觉得豆香更浓更健康。如果想要红豆沙的话,可以用细筛网过筛,加糖的时候可以少加一点盐,可以中和甜味。

  备注:

  正宗的驴打滚的做法外面裹的是熟的黄豆面,用熟黄豆面做的话,可以直接在面板上铺上熟黄豆面,再放入温热的糯米面团,上面再撒上一层熟黄豆面,用擀面杖擀成薄片即可。黄豆面和涂了油的保鲜膜一样,都是起到防粘的作用。

Thursday, January 6, 2011

Codeigniter Framwork

载入辅助函数
$this->load->helper('name');
name 是辅助函数文件的名字(不带.php后缀 和"helper" 部分)。