易栈网-膘叔

浏览模式: 标准 | 列表 | 图文
转:如何设计一个优秀的API

转:如何设计一个优秀的API

说起来,提供API供客户端调用,已经都做了两年多了,这两年多里,辛酸泪一把,API上线后,随着客户端版本的不停升级,功能越做越多,API越来越复杂,这时候,你TMD还得兼容旧系统,一点点的累积,过了半年,一看,还有N多人在用旧系统,想死的心都有了。开新接口?旧接口就不管了?这也不是一个办法。。。

所以,看到这篇文章的时候,我转一下,顺便自己也学一下,别人说的不一定就是对的,偏听则暗,兼听则明嘛 。(作者提供的API和我提供的不算一致,但也差不了很多,原来。。。。都是两年多,被这两年折腾的吧?)

原文来自:http://www.biaodianfu.com/how-to-design-a-good-api.html

到目前为止,已经负责API接近两年了,这两年中发现现有的API存在的问题越来越多,但很多API一旦发布后就不再能修改了,即时升级和维护是必须的。一旦API发生变化,就可能对相关的调用者带来巨大的代价,用户需要排查所有调用的代码,需要调整所有与之相关的部分,这些工作对他们来说都是额外的。如果辛辛苦苦完成这些以后,还发现了相关的bug,那对用户的打击就更大。如果API经常发生变化,用户就会失去对提供方失去信心,从而也会影响目前的业务。

但是我们为什么还要修改API呢?为了API看起来更加漂亮?为了提供更多功能?为了提供更好的性能?还是仅仅觉得到了改变了时候了?对于用户来说,他们更愿意使用一个稳定但是看起来不那么时髦的API,这并不意味着我们不再改进API了。当糟糕的API带来的维护成本越来越大时,我想就是我们去重构它的时候。

如果可以回头重新再做一遍,那么我心目中的优秀的API应该是怎么样的?

判断一个API是否优秀,并不是简单地根据第一个版本给出判断的,而是要看随着时间的推移,该API是否还能存在,是否仍旧保持得不错。槽糕的API接口各种各样,但是好的API接口对于用户来说必须满足以下几个点:

  • 易学习:有完善的文档及提供尽可能多的示例和可copy-paste的代码,像其他设计工作一样,你应该应用最小惊讶原则。
  • 易使用:没有复杂的程序、复杂的细节,易于学习;灵活的API允许按字段排序、可自定义分页、 排序和筛选等。一个完整的API意味着被期望的功能都包含在内。
  • 难误用:对详细的错误提示,有些经验的用户可以直接使用API而不需要阅读文档。

而对于开发人员来说,要求又是不一样的:

  • 易阅读:代码的编写只需要一次一次,但是当调试或者修改的时候都需要对代码进行阅读。
  • 易开发:个最小化的接口是使用尽可能少的类以及尽可能少的类成员。这样使得理解、记忆、调试以及改变API更容易。

如何做到以上几点,以下是一些总结:

1、 面向用例设计

如果一个API被广泛使用了,那么就不可能了解所有使用该API的用户。如果设计者希望能够设计出被广泛使用的API,那么必须站在用户的角度来理解如何设计API库,以及如何才能设计出这样的API库。

2、 采用良好的设计思路

在设计过程中,如果能按照下面的方式来进行设计,会让这个API生命更长久

  • 面向用例的设计,收集用户建议,把自己模拟成用户,保证API设计的易用和合理
  • 保证后续的需求可以通过扩展的形式完成
  • 第一版做尽量少的内容,由于新需求可以通过扩展的形式完成,因此尽量少做事情是抑制API设计错误的一个有效方案
  • 对外提供清晰的API和文档规范,避免用户错误的使用API,尤其是避免API(见第一节)靠后级别的API被用户知晓与误用

除此之外,下面还列出了一些具体的设计方法:

  • 方法优于属性
  • 工厂方法优于构造函数
  • 避免过多继承
  • 避免由于优化或者复用代码影响API
  • 面向接口编程
  • 扩展参数应当是便利的
  • 对组件进行合理定位,确定暴露多少接口
  • 提供扩展点

3、 避免极端的意见

在设计API的时候,一定要避免任何极端的意见,尤其是以下几点:

  • 必须漂亮(API不一定需要漂亮)
  • API必须被正确地使用(用户很难理解如何正确的使用API,API的设计者要充分考虑API被误用的情况:如果一个API可能会被误用,那么它一定会被误用)
  • 必须简单(我们总会面临复杂的需求,能两者兼顾的API是更好的API)
  • 必须高性能(性能可以通过其他手段优化,不应该影响API的设计)
  • 必须绝对兼容(尽管本文一直提到如何保证兼容,但是我们仍然要意识到,一些极少情况下会遇到的不兼容是可以容忍的)

4、 有效的API评审

API设计完成以后,需要经过周密的设计评审,评审的重点如下:

  • 用例驱动,评审前必须提供完善的使用用例,确保用例的合理性和完备性。
  • 一致性,是否与系统中其他模块的接口风格一致,是否与对称接口的设计一致。
  • 简单明了,API应该简单好理解,容易学习和使用的API才不容易被误用,给我们带来更多的麻烦。
  • API尽可能少,如果一个API可以暴露也可以不暴露,那么就不要暴露他,等到用户真正有需求的时候再将它成为一个公开接口也不迟。
  • 支持持续改进,API是否能够方便地通过扩展的方式增加功能和优化。

5、 提高API的可测试性

API需要是可测试的,测试不应依赖实现,测试充分的API,尤其是经过了严格的“兼容性整合测试”的API,更能保证在升级的过程中不出现兼容性问题。兼容性整合测试,是指一组测试用例集合,这组测试用例会站在使用者的立场上使用API。在API升级以后,再检测这组测试用例是否能完全符合预期的通过测试,尽可能的发现兼容性问题。

6、 保证API的向后兼容

对于每一个API的设计者来说,都渴望做到“向后兼容”,因为不管是现在的API用户,还是潜在的API用户,都只信任那些可兼容的API。但向后兼容有多个层次上的意义,而且不同层次的向后兼容,也意味着不同的重要性和复杂度。

7、 保持逐步改善

过去我们总希望能将现有的“不合理”的设计完全推翻,然后按照现在“美好”的思路,重新设计这个API,但是在一段时间以后,又会碰到一样的状况,需要再推翻一次。 如果我们没有有效的逐步改善的办法,依靠推翻现有设计,重新设计API只能让我们回到起点,然后重现之前的过程。 要有一套行之有效的持续改善的办法来在API兼容的同时,改善API使之更好。

8、 把握API的生命周期

每一个API都是有生命周期的,我们需要让API的生命周期更长,并且在API的生命周期结束时能让其平滑的消亡。

  • 告诉用户我们是如何设计的,避免误用,提供指导,错误的使用往往是缩短API寿命的一大杀手
  • 提供试用期,API不可能一开始就是稳定,经过试用的API才能有更强的生命力
  • 为API分级:内部使用;二次开发使用;开发或试用中;稳定;弃用API。避免API被滥用的同时,我们可以通过调整API的级别,来扩大其影响力,也能更优雅的结束一个API的生命周期。

开发API的过程其实就是一个沟通交流的过程。沟通的双方就是API用户和API设计者。

9、 一些具体的实施方案

在一个API不可避免要消亡或者改变的时候,我们应该接受并且面对这个事实,下面列举了几种保证兼容性的前提下,对API进行调整的办法:

  • 将API标记为弃用,重新建立一个新的API。如果一个API不可避免要被消亡,这是唯一的办法。
  • 为其添加额外的参数或者参数选项来实现功能添加
  • 将现有API拆成两部分,提供一个精简的核心API,过去的API通过封装核心API上实现。这通常用于解决用户需要一个代码精简的版本时。
  • 在现有的API基础上进行封装,提供一个功能更丰富的包或者类

一些好的API示例:

  1. Flickr API,这里是文档的示例,同时提供了一个非常方便的API测试工具。
  2. Mediawiki API
  3. Ebay API,这里有一个非常详尽的文档示例。
----EOF---
总之,尽信书则不如无书,借鉴一下总还是没错的
thinkinlamp聚会

thinkinlamp聚会

本期thinkinlamp应该算是第三期了吧?每一期都有热点,这一期也不例外

只是这一期都集中在百度和微博的爆点上了,都在讲自己怎么优化怎么优化,怎么提高性能,他们也都用图例说明了自己的架构原来是多么的复杂,这些离我们都太远了,其实大家也都明白,PHP能做的事情很多,不仅仅局限于前台,但受限于语言的特性,对于多线程之类的不适合用它来做。也正因此,他们几个都在尝试用其他方式 来避开这个问题,让刀用在刀刃上。

其中有一点就是扩展的问题,百度的人在认为扩展能不用就不用。而鸟哥则认为合理的利用扩展可以有效的提高 性能

然后就是另外三个让我有兴趣的话题了:hm的全文检索/老高的开发规范/梁枫的PHP在web之外

hm的全文检索我是用过了,性能上还是不错,只是当时我的需求是任意字符都必须要能够出搜索结果,但是基于分词的话,就没有办法这么准确。所以,有时候就很纠结。。

老高的几个规范其实在开发中也已经遇到,但有时候真的是为了赶时间就忽略 了这些,不过,在review的时候,偶尔会对这些问题进行修复,但不是每次都保证一定能发现问题,如果到后期遇到了,恐怕就真的很难再改了

梁枫的在WEB之外,是真的让我耳目一新, 无论是直接读ttyACMD之类的文件来使得用PHP与其他设备交互,在linux中,所有的一些都是文件,所以什么都能操作,这点就比windows方便很多。梁枫演示的,用PHP在屏幕画图,视频播放器等功能,真的让我感觉PHP有很多功能没有开发出来。不要忽略了PHP在其他方面的作用。事实上,我就经常用PHP来做运维工具,毕竟用PHP写脚本,对我来说,比shell/bash之类的快很多,而且功能也更强劲

------

顺便,中午的时候,居然有演出,四位朋友的友情演出,才让我突然想起,原来今天是家驹的忌日。从第一次听他的歌到现在居然都快20年了,家驹走好

------

今天的分享中让我记忆犹新的就是几个:1、规范一定要能落地;2、尽量用技术来支撑规范;3、开发的时候就最好把安全都先考虑好;4、PHP能做很多事,就看你敢不敢想

性能有时候虽然重要,但我还是觉得,如果能够加速迭待,那才是更好的。准备开始尝试下一个项目中使用yaf了。理由真的有几点,一是纯C框架,效率有上升,2是有PHP的复刻版,即使真的装不了扩展,也能用这个复刻版

YAR,YAC都还可以考虑,先忍着点。。。。yar因为RPC的不是每个项目里都能够用得上,YAC的话,如果不是因为他无锁,都不太想用,但是又太新了,也不是每台机器上都能使用,所以就先不作考虑了,不过可以尝试在自己的项目里小小的应用一下。。。

鸟哥的扩展太多了。。。小心的用,哈

解决:Data truncated for column 'fieldname' at row 1

解决:Data truncated for column 'fieldname' at row 1

在修改数据库结构的时候,突然间报这个错:Data truncated for column 'xxxxx' at row 1,xxxxx是数据库的字段名。

检查了一下,原来刚才在修改字段的时候,加了一个允许 null,然后默认的值都变成null,可是后来我又修改表结构为not null default '';所以,报会这个错

到数据库里:update xxxx set xxx = '';,再修改表结构,一切Over。

一些流行的颜色及其RGB值

一些流行的颜色及其RGB值

虽然不是设计师,但还是会用到这些东西,所以还是记录一下。。我平时只知道 #CCC,#FFF,#888,#000,还有几个英文,什么black,red,blue之类的。所以保存一下,以后查起来也比较方便

白色 255 255 255 FFFFFF
红色 255 0 0 FF0000
绿色 0 255 0 00FF00
蓝色 0 0 255 0000FF
洋红 255 0 255 FF00FF
墨绿 0 255 255 00FFFF
黄色 255 255 0 FFFF00
黑色 0 0 0 0
爱丽丝兰 240 248 255 F0F8FF
碧绿 112 219 147 70DB93
巧克力色 92 51 23 5C3317
蓝紫色 159 95 159 9F5F9F
黄铜 181 166 66 B5A642
亮金 217 217 25 D9D919
褐色 166 42 162 A62AA2
青铜 140 120 83 8C7853
青铜2 166 125 61 A67D3D
藏青 95 159 159 5F9F9F
亮铜 217 135 25 D98719
铜色 184 115 51 B87333
珊瑚色 255 127 0 FF7F00
矢车菊兰 66 66 111 42426F
深褐色 92 64 51 5C4033
深绿色 47 79 47 2F4F2F
深铜绿色 74 118 110 4A766E
     
深橄榄绿 79 79 47 4F4F2F
紫色 153 50 205 9932CD
深紫色 135 31 120 871F78
深石板蓝 107 35 142 6B238E
深石板灰 47 79 79 2F4F4F
深黄褐色 151 105 79 97694F
深蓝玉色 112 147 219 7093DB
暗木色 133 94 66 8.55E+44
暗灰 84 84 84 545454
暗玫瑰色 133 99 99 856363
长石色 209 146 117 D19275
砖红色 142 35 35 8E2323
草绿 35 142 35 2.38E+25
金色 205 127 50 CD7F32
秋叶色 219 219 112 DBDB70
灰色 192 192 192 C0C0C0
铜绿色 82 127 118 527F76
黄绿色 147 219 112 93DB70
军绿 33 94 33 2.15E+23
印第安红色 78 47 47 4E2F2F
土黄 159 159 95 9F9F5F
浅蓝 192 217 217 C0D9D9
浅灰 168 168 168 A8A8A8
浅铜蓝 143 143 189 8F8FBD
浅木色 233 194 166 E9C2A6
     
浅绿 50 205 50 32CD32
橙色 228 120 51 E47833
栗色 142 35 107 8E236B
中绿 50 205 153 32CD99
中蓝 50 50 205 3232CD
中草绿 107 142 35 6B8E23
中秋叶色 234 234 174 EAEAAE
中紫色 147 112 219 9370DB
中海绿 66 111 66 426F42
中石板蓝 127 0 255 7F00FF
中春绿 127 255 0 7FFF00
中蓝玉色 112 219 219 70DBDB
     
中紫红色 219 112 147 DB7093
中木色 166 128 100 A68064
夜蓝色 47 47 79 2F2F4F
海蓝色 35 35 142 23238E
氖蓝色 77 77 255 4D4DFF
氖粉红色 255 110 199 FF6EC7
新夜蓝色 0 0 156 00009C
新黄褐色 235 199 158 EBC79E
暗金色 207 181 59 CFB53B
橘色 255 127 0 FF7F00
橘红 255 36 0 FF2400
淡紫 219 112 219 DB70DB
淡绿 143 188 143 8FBC8F
     
粉红 188 143 143 BC8F8F
棕色 234 173 234 EAADEA
石英色 217 217 243 D9D9F3
富兰色 89 89 171 5959AB
橙红色 111 66 66 6F4242
猩红 140 23 23 8C1717
海绿 35 142 104 2.38E+70
半甜巧克力色 107 66 38 6B4226
赭色 142 107 35 8E6B23
银色 230 232 250 E6E8FA
天蓝 50 153 204 3299CC
石板蓝 0 127 255 007FFF
     
香粉红 255 28 174 FF1CAE
春绿 0 255 127 00FF7F
钢蓝 35 107 142 236B8E
夏天的天空 56 176 222 38B0DE
黄褐色 219 147 112 DB9370
蓝玉色 173 234 234 ADEAEA
暗褐色 92 64 51 5C4033
亮灰 205 205 205 CDCDCD
紫罗兰色 79 47 79 4F2F4F
紫红 204 50 153 CC3299
麦色 216 216 191 D8d8BF
暗黄 153 204 50 99CC32
ios7试用一周多小记

ios7试用一周多小记

ios出来不少时间了,也从beta1升到了beta2,性能上感觉,也不卡了,终于也有一些话可以拿出来说了,beta1我实在是没什么好说的。。。。

说说特性吧,与ios6相比:
1、控制台可以单独呼出,类似android的管理,不过android是从上面往下呼出,ios从下往上(屏幕上一个向上,一个向下的箭头,看起来好恶心),不过方便是方便了。可以控制声音、亮度、还有快捷开关,还有电筒、计算器、闹钟等小工具;确实方便了很多,比如计算器我就不用再找了(突然觉得就是把下面的4个快捷方式变成了8个)
2、蜂窝管理:可以针对APP使用蜂窝数据,可以屏蔽某些APP用手机流量,很不错
3、照相的速度快了很多,增加了一个正方型的照相,以前打开HDR的时候,拍张照要等半天,现在就和以前一样快了,不知道是从哪里优化的。。。还是说因为支持了多进程,把它扔在后台而不影响拍照了?
4、APP更新自动下载。这个功能比较有意思,也比较方便,最起码你在无线的时候你就不用关心APP是否在更新,它会帮你悄悄的更新完了,如果。。。你用苹果皮带的无线功能,估计你会哭。。。(中国移动推出的td-scdma的苹果皮,我就是在上面吃药了,流量一下子超了200多M,看了下,还好,我都没有大型 APP,可就算更新一个淘宝,TMD也要40多M啊)
5、spotlight,原来是单独一屏,现在也没有了,只要在主界面手指下划,在顶部就会出现一个搜索框。感觉有点卡,不如以前的单独一屏。。。但方便是方便了
6、输入法更新了。原来的笔画输入,连丁、士这类词都打不出,只能用拼音,现在。。。。都可以输入了,听说要开放输入法API,但估计不太可能。。。
由于一些其他界面的东西,官网上、各种各样的网站都有说明,所以我这里就不多说了。。。
一些小问题:
1、微信,发表图文的时候,只能选择拍照。其他功能都会有小问题:长信息展开不正常,从相册选择照片不正常,文字信息看不到第一行等等。其实也就是朋友圈有各种小问题
2、锁屏的时候,桌面图片好象会有切边,不太好看
3、接电话的时候,偶尔会突然打开扬声器,有几次差点吓死我。。。
小瑕疵,可以忍受。
当然如果你要刷回去,可能是有点问题的,听说苹果已经不允许刷回6.1.2了。考虑一下再说哦

mac下的抓包工具Charles

在mac下面,居然没有好的抓包工具,这让我十分纠结,毕竟不可能为了抓一个http包就跑到win下折腾。或许有人说tcpdump这么好的工具,你怎么不用。说实话,tcpdump太复杂了,我还没有细看,再加上不是所见所得,所以,用起来不是那么习惯

又有人说,wireshark怎么不用?好吧,其实我是有装wireshark,只是启动的时候会启动XQuartz,有点慢,当然这不是主要的,而是wireshark功能太强大了,以至于都不会写过滤器。

也有人说,图方便的话,完全可以用chrome自带的抓包工具啊?在没有找到这个工具之前,你可以尝试在地址栏输入:chrome://chrome-urls/,你会发现chrome原来有这么多的隐藏工具,嗯。我要说的就是其中的一个:chrome://net-internals/ ,在Events中,你可以进行过滤,不过,针对https的包,内容没法显示

越来越怀念windows下面,smartsniff完全就是wireshark的简化版,抓起包来刷刷的,过滤数据也很方便。

当然,mac下面的charles就真心不错了,试用了一下,果然对于https的包也能够抓取。

这里有一个简单的教程(实际操作略有出入):

在Mac下做开发,用Fiddler抓包由于离不开Windows比较痛苦,还好有Charles,到官网http://www.charlesproxy.com/可下载到最新版本(若不支持rMBP可拖到Retinizer中把文字变清晰)

HTTP抓包

  1. 打开Charles程序
  2. 查看Mac电脑的IP地址,如192.168.1.7
  3. 打开iOS设置,进入当前wifi连接,设置HTTP代理Group,将服务器填为上一步中获得的IP,即192.168.1.7,端口填8888
  4. iOS设备打开你要抓包的app进行网络操作
  5. Charles弹出确认框,点击Allow按钮即可

HTTPS抓包

  1. 下载Charles证书http://www.charlesproxy.com/ssl.zip,解压后导入到iOS设备中(将crt文件作为邮件附件发给自己,再在iOS设备中点击附件即可安装;也可上传至dropbox之类的网盘,通过safari下载安装)
  2. 在Charles的工具栏上点击设置按钮,选择Proxy Settings…
  3. 切换到SSL选项卡,选中Enable SSL Proxying,别急,选完先别关掉,还有下一步
  4. 这一步跟Fiddler不同,Fiddler安装证书后就可以抓HTTPS网址的包了,Charles则麻烦一些,需要在上一步的SSL选项卡的Locations表单填写要抓包的域名和端口,点击Add按钮,在弹出的表单中Host填写域名,比如填api.instagram.com,Port填443

接下来就跟HTTP抓包一样了

---EOF---

上文中的一些操作,其实是有点出入的(HTTPS)抓包

1、如果没有设置ssl的话,那么你看到的ssl的接口中,会有一个报错:SSL Proxying not enabled for this host: enable in Proxy Settings, SSL locations,这个时候,在左侧的域名上点右键:enable ssl,就OK了。(其实就是上面的第4部,不过这个操作是简化操作,上面的第4步太麻烦了)
2、如果这样还是不能抓包,那么官方会有一个说明(http://www.charlesproxy.com/documentation/using-charles/ssl-certificates/):

MAC OS X

Download and unzip the Charles CA Certificate bundle. The bundle contains the Charles CA Certificate file.

Run the Keychain Access utility from the Applications/Utilities folder. This tool enables you to manage your certificates.

Choose the "login" keychain then go to the File menu and choose Import. Choose the .crt file you downloaded above, and ensure that the login keychain is chosen in the dropdown menu.

Complete the import and the Charles CA SSL Certificate will now be trusted for your login account.

Move the Charles Proxy SSL Proxying certificate from your login keychain to the System keychain by drag-and-drop if you want all users on the machine to trust it.

You will need to quit and reopen Safari to see the change.

GOOGLE CHROME

On Mac OS X, please follow the instructions for Mac OS X above. These instructions only apply on Windows.

Open the Options dialog, go to the "Under the Hood" tab, then click the "Manage certificates" button.

Go to the Trusted Root Certification Authorities tab and click Import.

Find the charles-proxy-ssl-proxying-certificate.crt file. On Windows and Linux it is in the docs directory in your Charles installation directory. On Mac OS X (or if you can’t find it) you can download and unzip ssl.zip.

Choose the charles-proxy-ssl-proxying-certificate.crt file, then click Next and Finish, leaving the default options, until you complete the import. Chrome will now always trust certificates signed by Charles.

After importing you can delete the charles-proxy-ssl-proxying-certificate.crt file if you downloaded it.

---如果用chrome,那就直接可以使用/如果firefox,会有插件提示你安装/如果是safari,则需要打开证书管理器,将刚才导入的证书把login改为system(这样所有用户就都能使用了,不过都是自己的电脑,无所谓了),safari可能需要重启下浏览器

经此,我终于可以抓包了。而且https包也不再只是一堆 乱码。黑黑

推荐APP:Retinizer

虽然rmbp出来不少时间了,但很多APP仍然顽固的不支持retina屏,这里面有一些代表APP,比如:google的picasa。在rmbp的屏幕下简直就是一个渣啊。

所幸,有牛人勇敢的站了出来,他在自己的APP里这么写到:

Retinizer is a small app I wrote that allows apps that aren’t retina ready and are displayed pixelated at 1x to displaytheir UI widgets at 2x. That way, only their custom images will look bad and not the whole app.
To use the app, just drag an app (and make sure it’s closed) into the window and click the Retinize! button.
It also allows de-retinization of an app, in case it has problems in 2x mode. Just drag an app that you retinized before and click the button below, which will now read De-retinize.
The app works per-user. That means, retinizing an app in your account will not affect the app in other accounts, where it will display at its usual 1x.
So far, it seems only apps that use Carbon, directly (like Snes9x) or indirectly (wxWidgets, Qt apps) draw their widgets at 1x on a retina display, while Cocoa apps seem to alwas draw widgets at 2x. But some apps, such as Eclipse, draw at 1x and use Cocoa (albeit with some weird Java bindings or something like that, not sure). This app also helps in that case.
Please note that this app won’t make apps get retina images. That means, custom icons in e.g. the Preferences window will still look ugly.
It has only been tested with 10.8 but should work fine with 10.7.4.
Known bugs:
  • Cannot tell if apps are retina ready unless they have set NSHighResolutionCapable in their Info.plist.
  • DON'T USE IT WITH ADOBE CREATIVE SUITE
  • It may have problems with apps that don’t use the defaults system
You must have Gatekeeper disabled or open the app with Ctrl-Click->Open, as I don’t (yet) have a Gatekeeper Certificate.
-----
看看,人家可是好好的说的:不要用在adobe的软件中,在使用前注意,如果你开了安全权限,需要按住 ctrl健,再打开APP。
试用了一下,office的图片明显清楚了一些。
下载地址:https://sites.google.com/a/mikelpr.com/files/home/Retinizer050.zip?attredirects=0
使用方法很简单,先打开 Retinizer 软件,然后将APP拖放到Retinizer的窗口即可
转:每个 Web 开发者都应该知道的关于 URL 编码的知识

转:每个 Web 开发者都应该知道的关于 URL 编码的知识

URL,对于每个搞Web开发的人来说都是一件必知必会的玩意,但究竟应该会到什么地步,就有一些说法了,常见的,比如URL不能太长,传递非ascii字符需要encode之类的都知道。有没有更深的内容?

开源中国的网站上,就有人翻译了一篇文章 ,先不谈翻译的怎么样,光长度就够吓人了。。

内容很长,我这里仅提供一个链接,当然为了方便各位查看,我还搞了个PDF提供下载

来源地址:http://www.oschina.net/translate/what-every-web-developer-must-know-about-url-encoding

原文地址:http://blog.lunatech.com/2009/02/03/what-every-web-developer-must-know-about-url-encoding

8de889eba3d3e33187f4354f3b0642d9

这里有一个摘要目录:

转:哪些人不适合开母婴用品店?

转:哪些人不适合开母婴用品店?

这篇文章,我在一个月前已经看到了,但是一直在犹豫,是否要转载,忍了很久很久,最后还是决定,转了。

内容并不多,只有11条,来自于http://www.tzkd.com/hou/5578.html:

(1)依赖性特别强的人:不管你是加盟还是自己创业,你自己是永远的主流,别人帮你都只是支流。

(2)只是想试试看的人:90年代初期你抱着试试看想开店,成功概率很高,现在竞争这样激烈的情况下假如你只是试试看,假如能成功那是运气。所以提醒那些蠢蠢欲动想试试看开个婴儿用品店的人请小心,你的开店失败可能性非常高。

(3)资金有40%以上是借来的人:资金会给你带来压力,压力会让你无法从长远考虑。

(4)自己不参与经营,只是出钱找别人操作的人:除非你是开大型超市,请得是职业经理人,假如只是一个小店还是请别人来经营,成功的概率是很低的。

(5)从没有经商过的人:假如从没有经商经验,做婴儿用品店是很累的,因为婴儿用品品种太多,你要从众多产品中选择出适合的商品是要很有经验的,假如你没有经验,那你只能靠天赋,事实告诉我们,没几人个天生有天赋的。

(6)朋友圈子很少的人:朋友圈子少证明你与人沟通能力不强,开店需要与客户沟通,与供应商沟通,与营业员沟通,假如你原本就不习惯与自己不喜欢的人沟通,想更改这种性格是很不容易的,而问题是:假如你没有很好的沟通能力,你是很难做零售服务业的。

(7)心很急的人:心急就容易出错.对于资金本身不多的业主,错三次以上就没什么戏了。

(8)很容易放弃的人:不管是开婴儿用品店还是做别的事情,容易放弃基本上成不了什么事,就算你再聪明也没用!

(9)理由很多的人:因为产品不全、因为资金不够、因为没人帮忙等等,假如你会经常无意识的说这些话,那千万别去经营婴儿用品。

(10)什么东西都觉得是别人好的人:感觉产品不如对手好;合作商也不如对手;地点也不如别人好;客户也不如别的店面客户好说话 。 这种人很容易对自己和身边的同事失去信心。

(11)想了很久都没动手的人:很多人都会说:我早就想开了,因为什么原因没有行动。假如你想开婴儿用品店已经有3个月以上了还没有开始,那不考虑了,一定不适合的。婴儿用品店是一个很需要行动力的行业。

在上面这十一点里,好象都是指婴儿用品,但仔细看看,对于任何一个创业者来说,难道不都是一个鞭策吗?如果你也是在这11点里,不要说婴幼儿用品店不能开,其他的创业机会也最好只是想想,否则就真是往坑里跳

小朋友生日快乐

小朋友生日快乐

一转眼,5岁了。

今天下午去买了块蛋糕,也算是为它庆祝了一下。时间真的过的好快啊

有些照片没法上传,所以暂时今天就不传了,明天补上

----

后记:一次意外操作,5天内的照片全部被删除了。。。。伤心