碎语

  • 春有百花秋有月,夏有凉风冬有雪。若无闲事挂心头,便是人间好时节。

  • 长大也许就是:学会了把亲情放在第一位、把友情放在第二位、把爱情放在够不到的位置;学会了不和父母顶嘴,学会为了维护友谊让步;学会了不想着依赖别人,做好自己,让别人依赖你;学会了认清自己,不是很好,也不算坏,不把头扬的很高,也不拿眼睛盯别人的脚;学会把喜欢的人放在心底,默默的不张扬。

  • 爱自己最好的方式,就是成就自己!

  • 这世界上,败给谁都可以释怀,败给自己最不能原谅!

  • 启蒙就是有勇气去运用你自己的理性。

  • 一件事你犹豫去不去做,那就是该立即动身做的。一个东西你犹豫买不买,那就是该买的。喜欢是非常难得的,尽管去争取你喜欢的,而不是费心找廉价点的替代品。对事物,对人都该如此。

  • I’d rather be a failure at something I love than a success at something I hate.

  • 世间凡人皆慵于懒,天下才子皆毁于疏! 困难,只是用来被击败的存在而已,只是因为现在的你不够强大。

  • 如果懒惰暂时还未产生恶习或祸患,那通常也一定会产生沮丧。懒惰就像生锈一样,比操劳更能损害身体!

  • 人应该是自己的主宰,主宰自己的身体和思想,而不应该让身体或者贪婪控制自己!!!

  • 回归本质,学习编程语言还是为了低成本高效的解决实际的业务问题。

  • 如果只看合乎自己口味的书,那你永远只能知道你已经知道的事情。

  • 读万卷书不如行万里路,行万里路不如阅人无数!

  • 怕什么真理无穷,进一寸有一寸的欢喜。

  • 生活中真正的勇士向来是默默无闻的 喧哗不止的永远是自视清高的一群 。

  • 黑暗既然一定要存在,就让阳光尽量多的普照大地吧。

  • 声音比文字更能表达一个人的想法,和人花点时间坐下来交谈是不能代替的。

  • 工作中积极发挥主观能动性是非常重要的,主动的去交流工作任务,完工后积极的去和同事进行反馈;这样可以减少一些交流或者说是等待成本,可以非常高效的完成任务!!!

  • 迷茫的时候,才是学习的时候,才是认知世界的时候,才是真正走出自己的认知面见到世界的时候。

  • 成熟的人需要面具。戴上,坚强面对社会;摘下,温柔面对家人。

  • 当你知道了许多真实,虚假的东西,就没有那么多酸情了,你越来越沉默,越来越不想说。

  • 最快的脚步不是跨越,而是持续;最慢的步伐不是小步,而是徘徊。

  • 想要不再受人欺负,努力让自己变得更强大吧! 想要保护身边的人,那就让自己变得更加强大吧!

  • 你之所以一边埋怨自己,一边又安于现状,是因为你还没走到无路可走的时候。真正的选择,是别无选择!

  • 以前很喜欢抱怨,后来每次抱怨前仔细想想,常发现其实最应该抱怨的对象是自己,是自己没能力改变这个状况,让自己脱困。… 这么想的好处是:抱怨频率少了,自己也努力要变得更强。

  • 情怀就是,生活不只是眼前的苟且,还有诗(吃)和远方。

  • 忙起来你觉得什么都不缺,空下来才知道你什么都没有。

  • 穷在闹市无人问,富在深山有远亲。

  • 岂能尽如人意,但求问心无愧!

  • 你若笃定,社会便不浮躁!!!

  • 想要不可替代,就必须与众不同!!!

  • 真正的勇气是:无所畏惧地接受上天给你的一切!

  • 进步,从鄙视自己开始。跟贱人吵架,不仅仅让人分不清谁是贱人,更容易让你停留在跟贱人一个层次;为烂事操心,不仅仅是对我们精力的一种浪费,更悲惨在这会麻痹神经,让我们误人为这就是生活常态并最终成为常态。

  • 心情再差,也不要写在脸上,因为没有人喜欢看;日子再穷,也不要挂在嘴边,因为没有人无故给你钱;工作再累,也不要抱怨,因为没有人无条件替你干;生活再苦,也不要失去信念,因为美好将在明天; 品性再坏,也要孝顺父母,因为你也有老的那天。

  • 人往往把自己看得过重才会患得患失,觉得别人必须理解自己。 其实,人要看轻自己,少一些自我,多一些换位,才能心生快乐。 所谓心有多大,快乐就有多少;包容越多,得到越多。

  • 做人的最高境界不是一味低调,也不是一味张扬,而是始终如一的不卑不亢!

  • 你是什么样的人,就会遇见什么样的人。让自己变得闪闪发光,努力站在人生的高处,自然会遇见更好的人和风景。

  • 学会用一种幽默面对生活,不要把那些生命的历练当做生命的坎,记住一句忠告,生活因为感谢才倍加温暖,生活中的那些苦水,越吐才越苦,睁大眼睛去发现生活的光明与希望,内心多一些冷静与宽阔,不在乎苦难,苦难又奈何。

  • 找伴侣就要找大度,大气的,一点亏都不肯吃的人,说一万遍“爱你”也别信。爱你的人会心甘情愿输给你。学会了迁就,懂得了忍让,才能证明深爱着你。他给你的或许不多,但有了宽容,就等于给了你全部!

  • 我对全栈开发工程师的定义是,他们能够自己构建和部署一个完整的、可以工作的应用程序,而不需要其他任何人的帮助。那意味着他们能够编写前端、后端代码,能够配置服务器,当然还能够设计数据库表。

语录

  • “没手,没脚,没烦恼” ——尼克·胡哲

  • 大胆假设,小心求证。 ——胡适

  • 读书的目的是为了认识事物原理。为挑剔辩驳去读书是无聊。但也不可过于迷信书本。求知的目的不是为了吹嘘炫耀,而是为了寻找真理,启迪智慧。 ——培根

  • 成长的很大一部分,是接受。接受分道扬镳,接受世事无常,接受孤独挫折,接受突如其来的无力感,接受自己的缺点。然后发自内心地去改变,找到一个平衡点。跟世界相处,首先是和自己相处。天黑开盏灯,落雨带把伞,难过先难过,但也不作死。—— 卢思浩

  • 年轻人不要试图追求安全感,特别是年轻的时候,周遭环境从来都不会有绝对的安全感,如果你觉得安全,很可能暗藏危机。真正的安全感,来自你对自己的信心,是你每个阶段性目标的实现,而真正的归属感,在于你的内心深处,对自己命运的把控,因为你最大的对手永远都是自己。—— 李嘉诚

  • 胜利迟早都属于有信心的人。换句话说,你若仅仅接受最好的,你最后得到的常常也就是最好的,只要你有自信。一个人胜任一件事,85%取决于态度,15%取决于智力,所以一个人的成败取决于他是否自信,假如这个人是自卑的,那自卑就会扼杀他的聪明才智,消磨他的意志。—— 杜根定律

  • 你不应该给软件装后门,因为你不能保证这个后门只有好人能够使用。 —— 苹果CEO 库克

  • 思考和知识应该是经常同步而行。不然,知识就是个死物,而且会毫无成果地消亡。—— 弗兰西斯.培根

  • 阅读使人充实,会谈使人敏捷,写作使人精确。读史使人明智,读诗使人灵秀,演算使人精密,哲理使人深刻,伦理学使人庄重,逻辑修辞使人善辩. —— 培根

  • 士人读书,第一要有志,第二要有识,第三要有恒。有志,则断不甘为下流。有识,则知学问无尽,不敢以一得自足;如河伯之观海,如井蛙之窥天,皆无见识也。有恒,则断无不成之事。此三者缺一不可。—— 曾国藩

  • 好好珍惜身边的人,因为你不知道意外和明天哪一个会先到来。 —— 天津塘沽大爆炸。

  • 人类面临有三大问题,顺序错不得。先要解决人和物之间的问题,接下来要解决人和人之间的问题,最后一定要解决人和自己内心之间的问题。 —— 梁漱溟

  • 世界不是想象的那样,恐惧是世间最强大的武器!你是因为恐惧,所以你才愤怒;因为恐惧你才选择了逃避,让自己成为一个连是非都不分的人,你不知道,你永远不知道,要走在正确的路上需要多么大的勇气。别再因为害怕,找理由一次次为自己开脱。 —— 《痞子英雄》

  • 我不敢休息,因为我没有存款;我不敢说累,因为我没有成就;我不敢偷懒,因为我还要生活;我能放弃选择,但是我不能选择放弃。所以坚强,拼搏是我唯一的选择!—— 致此时的你。

  • 圣佛朗西斯·培根

前记

今天,收到一个bug fixed:用户在支付一个订单后收到N条短信提醒!

排查

因为支付只能在生成环境调试,于是远程连接服务器,找到有返回值的地方,记录返回值,然后开始测试,支付了N次没有发现一个有问题,于是问测试部门,怎么出现这个问题的!测试部门问了下用户,是因为未付款,但是卖家点了发货,听到此消息,我不禁一呆,坑能不能有个底限啊!这种逆天的逻辑怎么能出现呢!!!为啥这么说呢,接下来洒家给你详细分析。

先说下支付的逻辑:众所周知,不管是微信支付 还是 支付宝支付,都是异步进行的。也就是说用户在微信或者支付宝支付成功后,微信或者支付宝并不会第一时间把这个支付成功的消息返回给你,而是在接下来的一个小时或者更长时间内分N次给你支付成功的通知(有时候接收到第三方服务器返回success的时候还会发起多次的异步通知),所以一般业务逻辑在此处都会有一防止重复更新数据库的逻辑判断,在成功更新订单为已付款状态后,如果还收到异步通知,直接返回true。

但是因为未付款发货这种逆天逻辑的存在,在网速慢或者服务器访问量大的时候,用户支付成功,服务器未收到支付成功的异步通知,这时候,脑残卖家点了发货,并且成功了更新了数据库的订单状态,这时候,服务器收到支付成功的通知(在收到支付成功时的业务逻辑是更新未付款的订单),这时候去更新数据表,发现数据不存在(因为订单状态为已发货,而不是未付款),更坑的是,订单表的类型居然是MyISAM类型的,居然不是InnoDB类型的,如此事务完全不能进行,在发现未更新数据的时候不能rollback,这样造成了,之前成功返回异步通知的逻辑不能执行,造成微信或者支付宝异步通知一次,则更新一次数据库……

这样的逻辑简直太坑爹了!!!以此提醒同僚们:“ 程序有风险,入行需谨慎” 啊!!!

解决方案

  • 更新订单表以及订单相关表为Innodb类型(MyISAM不支持事务处理);
  • 更新响应支付通知条件,只要支付方返回支付成功通知,这边就更新为已付款状态,而不关心订单状态是否是未付款;

这种逻辑真的不要再出现了啊!!!

不说了,继续修复脏数据了……o(╯□╰)o,囧……

设计模式

设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编制真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。

设计框架

可复用面向对象软件系统一般划分为两大类:应用程序工具箱和框架(Framework),我们平时开发的具体软件都是应用程序,Java的API属于工具箱;而框架是构成一类特定软件可复用设计的一组相互协作的类,EJB(EnterpriseJavaBeans)是Java应用于企业计算的框架。
框架通常定义了应用体系的整体结构类和对象的关系等等设计参数,以便于具体应用实现者能集中精力于应用本身的特定细节。框架主要记录软件应用中共同的设计决策,框架强调设计复用,因此框架设计中必然要使用设计模式。
另外,设计模式有助于对框架结构的理解,成熟的框架通常使用了多种设计模式,如果你熟悉这些设计模式,毫无疑问,你将迅速掌握框架的结构,我们一般开发者如果突然接触EJB、Spring等框架,会觉得特别难学、难掌握,那么转而先掌握设计模式,无疑是给了你剖析EJB或J2EE系统的一把利器。

设计原则

为什么要提倡“Design Pattern呢?根本原因是为了代码复用,增加可维护性。那么怎么才能实现代码复用呢?面向对象有几个原则:
开闭原则(Open Closed Principle,OCP)、
里氏代换原则(Liskov Substitution Principle,LSP)、
依赖倒转原则(Dependency Inversion Principle,DIP)、
接口隔离原则(Interface Segregation Principle,ISP)、
合成/聚合复用原则(Composite/Aggregate Reuse Principle,CARP)、
最小知识原则(Principle of Least Knowledge,PLK,也叫迪米特法则)。
开闭原则具有理想主义的色彩,它是面向对象设计的终极目标。其他几条,则可以看做是开闭原则的实现方法。
设计模式就是实现了这些原则,从而达到了代码复用、增加可维护性的目的。
高内聚、低耦合

基本模式

设计模式分为三种类型,共23种。

  • 创建型模式:单例模式、抽象工厂模式、建造者模式、工厂模式、原型模式。
  • 结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。
  • 行为型模式:模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式、访问者模式。

按字典序排列简介如下:

  • Abstract Factory(抽象工厂模式):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

  • Adapter(适配器模式):将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

  • Bridge(桥接模式):将抽象部分与它的实现部分分离,使它们都可以独立地变化。

  • Builder(建造者模式):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

  • Chain of Responsibility(职责链模式):为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它。

  • Command(命令模式):将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可取消的操作。

  • Composite(组合模式):将对象组合成树形结构以表示“部分-整体”的层次结构。它使得客户对单个对象和复合对象的使用具有一致性。

  • Decorator(装饰模式):动态地给一个对象添加一些额外的职责。就扩展功能而言, 它比生成子类方式更为灵活。

  • Facade(外观模式):为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

  • Factory Method(工厂模式):定义一个用于创建对象的接口,让子类决定将哪一个类实例化。Factory Method使一个类的实例化延迟到其子类。

  • Flyweight(享元模式):运用共享技术有效地支持大量细粒度的对象。

  • Interpreter(解析器模式):给定一个语言, 定义它的文法的一种表示,并定义一个解释器, 该解释器使用该表示来解释语言中的句子。

  • Iterator(迭代器模式):提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。

  • Mediator(中介模式):用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

  • Memento(备忘录模式):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到保存的状态。

  • Observer(观察者模式):定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。

  • Prototype(原型模式):用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象。

  • Proxy(代理模式):为其他对象提供一个代理以控制对这个对象的访问。

  • Singleton(单例模式):保证一个类仅有一个实例,并提供一个访问它的全局访问点。 单例模式是最简单的设计模式之一,但是对于Java的开发者来说,它却有很多缺陷。在九月的专栏中,David Geary探讨了单例模式以及在面对多线程(multi-threading)、类装载器(class loaders)和序列化(serialization)时如何处理这些缺陷。

  • State(状态模式):允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它所属的类。

  • Strategy(策略模式):定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法的变化可独立于使用它的客户。

  • Template Method(模板方法模式):定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

  • Visitor(访问者模式):表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

简介

\r是回车符,\n是换行符,各个系统的换行标志:

win 用 \r\n
linux/unix 用 \n
Mac OS 用 \r

CR用符号’\r’表示, 十进制ASCII代码是13, 十六进制代码为OxOD
LF使用’\n’符号表示, ASCII代码是10, 十六制为0x0A
所以:
Windows下用的是OAOD,即CR&LF,
linux/unix用的是OA,即LF
MacOS用的是OD,即CR

CRLF来历

计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失。

于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做“回车”,告诉打字机把打印头定位在左边界;另一个叫做“换行”,告诉打字机把纸向下移一行。这就是“换行”和“回车”的来历,从它们的英语名字上也可以看出一二。

后来,计算机发明了,这两个概念也就被般到了计算机上。那时,存储器很贵,一些科学家认为在每行结尾加两个字符太浪费了,加一个就可以。于是,就出现了分歧。Unix 系统里,每行结尾只有“<换行>”,即“\n”;Windows系统里面,每行结尾是“<回车><换行>”,即“ \r\n”;Mac系统里,每行结尾是“<回车>”。一个直接后果是,Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号。

Q&A

问题一:Windows下编写的纯文本文档在Linux下使用,例如Windows下编写的SH脚本,放到Linux下执行可能会出错

  • 方法一:
    不用系统记事本,自己下载一个Ultraedit或者Nodepad++文本编辑器,在Ultraedit下将该文件执行“File->conversions->Dos to Unix”,执行这个转化后的sh文件能够直接在linux下执行。这步操作能够就是将\r\n转换成\n。

  • 方法二:
    在windows下将txt文件保存为ANSI格式,然后在Linux终端输入:

    1
    cat ms.txt | col -b > linux.txt
  • 方法三:我的另一个方法
    利用cat -v test.txt可以显示test.txt中的\r(显示为^M),然后去掉^M即可。
    输入:

    1
    cat -v test.txt >te.txt

然后cat te.txt可见行尾有^M,即\r。我们把^M去掉即可:

1
vi te.txt

在vi中输入替换命令

1
:%s/\^M//g

再保存即可。

问题二:Linux下新建的文档在Windows下用记事本打开内容会挤在一起(没有了换行符)。原因是记事本不支持\n换行(它只支持\r\n形式的换行)

  • 解决方法:在Windows中使用Ultraedit或者Nodepad++文本编辑器,执行转换。

  • 另外,有两个偏方:
    1)在Windows中把txt后缀改成doc或者c,用Word或VC6.0来打开,然后复制到txt文件中。
    2)在Linux下新建文本文档的时候,不要用Vim或者Gedit,用Open Office,保存成doc格式。

  • 打开文本文件可以用:
    1)gedit xx.doc
    2)vim xx.doc(vim可能不支持繁体字,如果不涉及繁体字以及古怪的符号,就可以用vim)
    3)找到文件,直接用Open Office打开。选择字符集(系统),字符(SYSong18030),语言(中文简体),换段落:CR&LF(或者LF)。

  • 注意:如果文件名是中文(比如vim 测试.txt),那有可能找不到,须要ls一下,然后复制文件名,然后再gedit 粘贴文件名。

  1. CR&LF,即\r\n,这是Windows下记事本的格式,Linux是完全支持的;(推荐)
  2. CR,即\r,记事本不支持,没有换行效果,也没有\r效果;Word下有换行效果,也有\r;
  3. LF,即\n,linux/unix系统下的换行符。(shell脚本就需要这个格式)

PS:
\r效果是:在每一行的末尾,默认的光标定位是下一行的行首,也就是说在行尾输入的内容实际上是下一行的行首,\r才是真正的换行,而\n是回车,原本指打字机的纸张往下移动一位,后来在Unix-like系统下,\n成为了实际上的换行符。

\r和\n的区别看下面的例子就知道了:

1
2
3
4
5
6
#include
int main()
{

printf("938517\r10086\n");
return 0;
}

无论是Linux系统还是Windows平台,输出均是

1
10086

因为\r已经换行了,所以938517就不再显示了。而\n并不是真正意义上的换行,它实际上是把纸张(或屏幕)向下移动一位(以便显示下一行的内容)。

问题三:Windows下编写的doc文档,在Linux下查看(用Open Office)一般都会乱码

  • 解决方法:先用Open Office打开,然后再全选,把字体设置为SYSong18030,OK中文简体和繁体都显示正常了。

问题四:在不同平台间使用FTP软件传送文件时, 在ascii文本模式传输模式下, 一些FTP客户端程序会自动对换行格式进行转换,经过这种传输的文件字节数可能会发生变化

  • 解决方法:如果你不想ftp修改原文件, 可以使用bin模式(二进制模式)传输文本。

前记

今天在表单提交验证的时候,需要检测商品是否有规格,因为商品有多个规格,所以用到了jquery的each,循环读取每个规格,如果值为空,则return false;但是,后来发现return false 表单还是提交了,百思不得其解。

排查

后来查看manual才发现:jquery的each函数中,return false只能提前终止循环,相当于break;return true相当于 continue。

解决

那么,如何才能阻止表单的提交呢,想了N久,想到在each循环前,先定义一个变量为true,然后在循环读取规格的时候,如果值为空,则把变量定义为false,同时return false,代码如下:
出现bug的代码

1
2
3
4
5
6
7
$(".spec").each(function(){
var s =$(this).val();
if(!s){
alert('规格不能为空');
return false;
}
})

这样return false,只是终止循环,并没有终止程序。
更新后的代码

1
2
3
4
5
6
7
8
9
10
11
12
var real_true = true;
$(".spec").each(function(){
var s =$(this).val();
if(!s){
alert('规格不能为空');
real_true = false;
return false;
}
})
if(!real_true){
return false;
}

暂时想到了这个方法,如果大家有更好的方法,欢迎一起探讨~

前记

今天测试返回一个API调用接口不对的bug,查看API发现变量是通过$_REQUEST来获取参数的,难道获取方法有问题?

排查

既然有了怀疑,那么我们来打印下变量吧,通过实验发现:
$_REQUEST获取的参数 和URL中的不一致
为啥会不一致呢,请教了下Google大神,查看ini的设置,发现

1
$ variables_order = "EGPCS";

打印EGPCS时发现cookie 和 get中有相同的变量,原来是cookie中的参数覆盖了get中的参数,囧~

(腹诽:cookie中应该加个前缀啥的吧……):

结论

php版本< 5.3时 会 根据variables_order的设置读取参数;

PHP版本 > 5.3时 会根据request_order的设置读取参数;

PHP version < 5.3时默认读取顺序为:E G P C S,即 :

1
$ variables_order = "EGPCS";

variables_order 系统在定义PHP预定义变量,EGPCS 是 Environment, Get, Post, Cookie, and Server 的简写。

这个变量主要是在php执行时,对超级变量创建的设置。EGPCS对应的超级变量为$_ENV, $_GET, $_POST, $_COOKIE, $_SERVER。如果variables_order被设置为””,则对应的超级全局变量的值都为空数组。

所以,要想$_REQUEST包含的预定义变量的值,variables_order必须有对应的设置。例如,variables_order = “G”,则$_REQUEST中肯定不会有post的值。

register_globals=on的情况,这个配置的顺序将影响对应变量的值,重复key,后边的会覆盖前边的。

1
$ request_order = "PGC"

这个变量,说明$_REQUEST包含哪些类型的外部数据、数据加载的顺序。这个是有顺序的,如果key重复,后边的就会覆盖前边的值。

比如:
$_GET里面有个 $_GET['id']=2 , $_POST 里有一个 $_POST['id'] =3
如果request_order = “PG”的形式设置,那么 $_REQUEST['id']=2
如果request_order = “GP”的形式设置,则 $_REQUEST['id']=3

自2011年一月25号培训毕业以来,我参加的大大小小的面试(不包括远程的)也有将近二十多次了,在这二十多次的面试中,我不知不觉当了一次‘面霸’,也发现了面试的一些好处,特作文以记之,也希望对即将参加工作的童鞋有一些帮助吧。

首先,多次的面试可以很好的锻炼体力,在这么多次的面试中,我记得最长的一次是从北京的最北边到北京的最南边,那次面试从上午十一点出门到下午六点回家,很好的锻炼了我的‘艰苦奋斗’精神,我的抗疲劳能力也大大增强。

其次,多次的面试可以加深对行业的了解,每次面试前,我都会上网查找面试企业的相关信息,以及该企业的优势与发展空间,甚至是我面试的岗位的发展空间,通过多次的面试,对网站开发行业有了更深层次的了解,对自己的职业定位更加明确。

再次,多次的面试可以更好的巩固职业相关知识,每次的面试题中,或多或少的都会出一些自己没有涉及到的知识面,通过面试可以更好的认识自己的不足,从而加深自己的知识储备,以备将来知识的升级换代起到很好的承上启下作用。

再再次,多次面试可以很好的锻炼口才,由开始的内向不敢说到最后的侃侃而谈,甚至是主动挑起话题;这些都是面试时意想不到的收获;

另外面试最重要的一点,就是认清自己的能力、价值和升值空间,不要因为怕没工作而不知所措的降低自己的身价,坚持自己的薪金要求,不仅仅是对自己能力的肯定,有时候还会换来HR的青睐有加,获得意想不到的收获。

呵呵,以上都是一些经验心得,在我看来,面霸其实是最了解行业的人之一。

最后,预祝我和童鞋们都能找到一份称心如意的工作。