手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表2024年11月的文章

jQuery UI中sortable的表单提交

 jqueryUI库中提供了一些封装好的,性能也算是比较好的一些工具,比如排序:sortable

在做分类的时候,这个功能就有点好了,直接拿它来排序,但是大家都觉得sortable怎么提交呢?提交的时候怎么把ID和数据传过去呢?要知道这。。TMD只是一个li,连form都没有,怎么办?

其实也算是比较方便的

JavaScript代码
  1. $('.xxx').sortable(function(){    
  2.     'update':function(event,ui){  
  3.         var ids = $(this).sortable('toArray').toString();    
  4.         $.post('xxx',{"id":ids},function(){    
  5.             //..    
  6.         })    
  7.     }  
  8. })  
  9. $('.xxx').disableSelection();     

主要就那个sortable('toArray'),看了一下手册,默认是使用了id,所以偷懒的话,你就把你的信息扔在id里就OK了。虽然就html规范来说,id不能是数字,但是你可以自己组装,然后post过去的时候,再解析嘛。

就是这样简单

Tags: jquery, sortable

转:如何设计一个优秀的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应该算是第三期了吧?每一期都有热点,这一期也不例外

只是这一期都集中在百度和微博的爆点上了,都在讲自己怎么优化怎么优化,怎么提高性能,他们也都用图例说明了自己的架构原来是多么的复杂,这些离我们都太远了,其实大家也都明白,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的话,如果不是因为他无锁,都不太想用,但是又太新了,也不是每台机器上都能使用,所以就先不作考虑了,不过可以尝试在自己的项目里小小的应用一下。。。

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

Tags: thinkinlamp

解决: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值

 虽然不是设计师,但还是会用到这些东西,所以还是记录一下。。我平时只知道 #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

Tags: color