先讲个笑话


我们程序员分两种,一种是:

if( #condition ){
    //codes
}

另一种是:

if( #condition )
{
    //codes
}

你是哪一种呢?


这个笑话比较冷,但是也说明了一个问题 —— 代码风格难以统一。

一个好的代码风格会使程序更容易阅读,提高团队合作的效率不说,自己看着也会赏心悦目,好像自己淫的一手好湿。

而混乱的代码轻则增加团队沟通成本,重则影响团队和谐。所以我认为不论是作为一个团队还是所谓一名开发者,必须坚持自己的程序编写风格。老高偶尔也会因为考虑到一致性而使用我不喜欢的代码风格,事实上这个行为是很不可取的。

所以今后老高今后要改正这个不良习惯,保持自己的代码风格,之前写的都不算 XD 。

我的风格

下面老高精(HU)心(LUAN)整理了一些PHP编码的习惯,不知道有没有和我一样的TX?

编码

编码推荐UTF-8,所以在处理文字长度的时候请使用mb_*系列函数

换行

由于UNIX/Linux、Mac与Windows在换行格式上的差别,请搞清楚运行环境, 再搞清楚CR(carriage return, 符号’r’表示, 十进制ASCII代码是13, 十六进制代码为0x0D), LF(line feed,使用’n’符号表示, ASCII代码是10, 十六制为0x0A), CR/LF的概念,然后在编辑器中把换行格式改为对应的格式即可。

系统 换行编码 正则
UNIX/Linux 换行 \r
Mac 回车 \n
Windows 回车+换行 \r\n

换行回车的历史,来自豆瓣

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

于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做“回车”,告诉打字机把打印头定位在左边界;另一个叫做“换行”,告诉打字机把纸向下移一行。

这就是“换行”和“回车”的来历,从它们的英语名字上也可以看出一二。

后来,计算机发明了,这两个概念也就被般到了计算机上。那时,存储器很贵,一些科学家认为在每行结尾加两个字符太浪费了,加一个就可以。于是,就出现了分歧。

Unix系统里,每行结尾只有“<换行>”,即“\n”;Windows系统里面,每行结尾是“<回车><换行>”,即“\r\n”;Mac系统里,每行结尾是“<回车>”。一个直接后果是,Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号。

注释

注释是为了程序更好理解,所以老高一般会把注释写在需要注释的代码之前,例:

function abc(){
    //先验证权限
    authorized();
}

而有些注释只是想说明执行结果,那么我会把它们放在代码的下一行:

echo date("M d Y H:i:s", mktime (0,0,0,1,1,2000));
//Jan 01 2000 00:00:00

=

=号一般用在赋值和比较,我会在=号链接的逻辑两边各加一个space,同理适用于||&&等逻辑运算,其他比较符号不管,例:

$a = array('I', 'Love', 'U');
if( count($b) == 0 )
{
    if( $a>=0 )
    {
        //code
    }
}

单双引号

这里不多说了,多少一个shift的事儿。

IF

if后直接跟(,$condition左右会有一个空格,而其他的函数则可以不加空格:

if( $a>0 )
{
    $number = strlen('abcde');
    echo 'positive!';
}

代码块

代码块其实就是{}包裹的内容,用在if,switch,while等条件或分支的时候会用到,老高的建议是每个{}必须独占一行。

删除结尾标记?>

这个标记是PHP代码闭合的格式,如果正在写一个纯PHP文件,请移除最后的?>,然后保持最后一行是空行。

参数

定义函数参数的时候,如果有多个参数,除了第一个参数,其他参数之前必须加一个space,例:

json_decode($html, true);

function A($a, $b, $c)
{
    //code
}

不要连续赋值

除非你是高手。。。。。。否则可能会出现意想不到的效果。

$a = $b = 1;
$a = 2;
echo $b;

$a = $b = new DateTime;
$a->setDate(2001, 2, 3);
echo $b->format('Y-m-d');

善用list()

list($a,$b)=array(10,20);

不要hard-coding

善用初始化方法和常量。

避免代码过长

适当换行,例:

if( $a = 'a' ||
    $b = 'b' ||
    $c = 'c')
{
    //code
}

代码中尽量写英文

除非你的英文很差或者有特殊要求。

如果一定有中文

请一定使用全角符号,而且不要忘了结尾的句号。

引用和借鉴

github上的代码如果用到了,请务必标明出处,表要以为开源就是免费午餐,小心你也会吃上官司!你又不是小米公司,就算fork了改了又吃了官司,人家也不怕。

多数源代码都是基于某种协议开放的,这里给出几个关键词:[GPL、APACHE、BSD、LGPL] + Licenses,协议还有版本之分。

推荐模板:

XXX的诞生离不开很多非常棒的开源项目,包括: xxx,xxx,xxx.

不要使用tab缩进

用四个空格缩进,这样不会引起格式的混乱,保证了代码在各IDE里视觉统一,Python同样适用。

总结

代码风格因人而异,如果你还没有悟出自己的风格,那就速度为自己整一个吧!

在此分享一个来自PHPCMS的编码规则,值得参考

老高的网盘链接

今天给老娘的Mi2S刷机,研究了一下在mac上刷机的方法,在此记录一下。

PS.本方法适用于所有Android机器

Android File Transfer

安装Android File Transfer

brew cask install android-file-transfer

要在OSX上管理Android手机上的文件,需要下载安装这个官方工具http://www.android.com/filetransfer/

由于某些特殊原因网站打不开不要紧,不会翻墙的TX可以到我的网盘下载到目前最新的Android File Transfer。

下载安装完成后运行,就可以轻松管理手机文件了,这个时候把下载好的ROM拷贝到手机目录下,再进入recovery刷机了。

如何安装Android File Transfer

命令行刷机

安装adb工具

brew cask install android-platform-tools

接下来再terminal中运行adbfastboot即可开始刷机

adb版本

**小提示:**刷机用到的命令可以参考博主的这篇文章adb,fastboot常用命令及刷机技巧

部分参考来自:

http://www.technobuzz.net/install-adb-fastboot-mac-linux-chrome-os-nexus-tool-script/?utm_source=tuicool

This article is post on https://coderwall.com/p/ggmpfa

configure: error: xslt-config not found. Please reinstall the libxslt >= 1.1.0 distribution

yum -y install libxslt-devel

configure: error: Could not find net-snmp-config binary. Please check your net-snmp installation.

yum -y install net-snmp-devel

configure: error: Please reinstall readline - I cannot find readline.h

yum -y install readline-devel

configure: error: Cannot find pspell

yum -y install aspell-devel

checking for unixODBC support... configure: error: ODBC header file '/usr/include/sqlext.h' not found!

yum -y install unixODBC-devel

configure: error: Unable to detect ICU prefix or /usr/bin/icu-config failed. Please verify ICU install prefix and make sure icu-config works.

yum -y install libicu-devel

configure: error: utf8mime2text() has new signature, but U8TCANONICAL is missing. This should not happen. Check config.log for additional information.

yum -y install libc-client-devel

configure: error: freetype.h not found.

yum -y install freetype-devel

configure: error: xpm.h not found.

yum -y install libXpm-devel

configure: error: png.h not found.

yum -y install libpng-devel

configure: error: vpx_codec.h not found.

yum -y install libvpx-devel

configure: error: Cannot find enchant

yum -y install enchant-devel

configure: error: Please reinstall the libcurl distribution - easy.h should be in /include/curl/

yum -y install libcurl-devel

LAOGAO added 20140907:

configure: error: mcrypt.h not found. Please reinstall libmcrypt.

wget ftp://mcrypt.hellug.gr/pub/crypto/mcrypt/libmcrypt/libmcrypt-2.5.7.tar.gz
tar zxf libmcrypt-2.5.7.tar.gz
cd libmcrypt-2.5.7
./configure
make && make install

added 20141003:

Cannot find imap

ln -s /usr/lib64/libc-client.so /usr/lib/libc-client.so

configure: error: utf8_mime2text() has new signature, but U8T_CANONICAL is missing.

yum -y install libc-client-devel

Cannot find ldap.h

yum -y install openldap
yum -y install openldap-devel

configure: error: Cannot find ldap libraries in /usr/lib

cp -frp /usr/lib64/libldap* /usr/lib/

configure: error: Cannot find libpq-fe.h. Please specify correct PostgreSQL installation path

yum -y install postgresql-devel

configure: error: Please reinstall the lib curl distribution

yum -y install curl-devel

configure: error: Could not find net-snmp-config binary. Please check your net-snmp installation.

yum -y install net-snmp-devel

configure: error: xslt-config not found. Please reinstall the libxslt >= 1.1.0 distribution

yum -y install libxslt-devel

checking for BZip2 support… yes checking for BZip2 in default path… not found configure: error: Please reinstall the BZip2 distribution

Fix:

yum -y install bzip2-devel

checking for cURL support… yes checking if we should use cURL for url streams… no checking for cURL in default path… not found configure: error: Please reinstall the libcurl distribution – easy.h should be in/include/curl/

Fix:

yum -y install curl-devel

checking for curl_multi_strerror in -lcurl… yes checking for QDBM support… no checking for GDBM support… no checking for NDBM support… no configure: error: DBA: Could not find necessary header file(s).

Fix:

yum -y install db4-devel

checking for fabsf… yes checking for floorf… yes configure: error: jpeglib.h not found.

Fix:

yum -y install libjpeg-devel

checking for fabsf… yes checking for floorf… yes checking for jpeg_read_header in -ljpeg… yes configure: error: png.h not found.

Fix:

yum -y install libpng-devel

checking for png_write_image in -lpng… yes If configure fails try –with-xpm-dir=

configure: error: freetype.h not found. Fix:

Reconfigure your PHP with the following option. --with-xpm-dir=/usr

checking for png_write_image in -lpng… yes configure: error: libXpm.(a|so) not found.

Fix:

yum -y install libXpm-devel

checking for bind_textdomain_codeset in -lc… yes checking for GNU MP support… yes configure: error: Unable to locate gmp.h

Fix:

yum -y install gmp-devel

checking for utf8_mime2text signature… new checking for U8T_DECOMPOSE… configure: error: utf8_mime2text() has new signature, but U8T_CANONICAL is missing. This should not happen. Check config.log for additional information.

Fix:

yum -y install libc-client-devel

checking for LDAP support… yes, shared checking for LDAP Cyrus SASL support… yes configure: error: Cannot find ldap.h

Fix:

yum -y install openldap-devel

checking for mysql_set_character_set in -lmysqlclient… yes checking for mysql_stmt_next_result in -lmysqlclient… no checking for Oracle Database OCI8 support… no checking for unixODBC support… configure: error: ODBC header file ‘/usr/include/sqlext.h’ not found!

Fix:

yum -y install unixODBC-devel

checking for PostgreSQL support for PDO… yes, shared checking for pg_config… not found configure: error: Cannot find libpq-fe.h. Please specify correct PostgreSQL installation path

Fix:

yum -y install postgresql-devel

checking for sqlite 3 support for PDO… yes, shared checking for PDO includes… (cached) /usr/local/src/php-5.3.7/ext checking for sqlite3 files in default path… not found configure: error: Please reinstall the sqlite3 distribution

Fix:

yum -y install sqlite-devel

checking for utsname.domainname… yes checking for PSPELL support… yes configure: error: Cannot find pspell

Fix:

yum -y install aspell-devel

checking whether to enable UCD SNMP hack… yes checking for default_store.h… no

checking for kstat_read in -lkstat… no checking for snmp_parse_oid in -lsnmp… no checking for init_snmp in -lsnmp… no configure: error: SNMP sanity check failed. Please check config.log for more information.

Fix:

yum -y install net-snmp-devel

checking whether to enable XMLWriter support… yes, shared checking for xml2-config path… (cached) /usr/bin/xml2-config checking whether libxml build works… (cached) yes checking for XSL support… yes, shared configure: error: xslt-config not found. Please reinstall the libxslt >= 1.1.0 distribution

Fix:

yum -y install libxslt-devel

configure: error: xml2-config not found. Please check your libxml2 installation.

Fix:

yum -y install libxml2-devel

checking for PCRE headers location… configure: error: Could not find pcre.h in /usr

Fix:

yum -y install pcre-devel

configure: error: Cannot find MySQL header files under yes. Note that the MySQL client library is not bundled anymore!

Fix:

yum -y install mysql-devel

checking for unixODBC support… configure: error: ODBC header file ‘/usr/include/sqlext.h’ not found!

Fix:

yum -y install unixODBC-devel

checking for pg_config… not found configure: error: Cannot find libpq-fe.h. Please specify correct PostgreSQL installation path

Fix:

yum -y install postgresql-devel

configure: error: Cannot find pspell

Fix:

yum -y install pspell-devel

configure: error: Could not find net-snmp-config binary. Please check your net-snmp installation.

Fix:

yum -y install net-snmp-devel

configure: error: xslt-config not found. Please reinstall the libxslt >= 1.1.0 distribution

Fix:

yum -y install libxslt-devel

这篇文章个人觉得很受用,故仔细翻译了一下,有些地方可能翻译的不好,请见谅!

翻译后发现貌似已经有人翻译过,但是翻译的水平就有点。。。。。那篇文章中不仅忽略了知识点,并且出现了明显的语义和语法错误,有一定的误导作用,所以请务必重新阅读老高的翻译。文章中容易出错的地方老高已经注释(在文章中以【】标出)。

如需转载,请注明出处!

web开发者在发布你的作品前需要考虑的技术细节 What technical details should a programmer of a web application consider before making the site public!

原文地址: 来自stackexchange.com quora的回答

界面和用户体验

  • 要意识到浏览器的实现标准不一,请确保你的网站在主流浏览器中的正常展现。至少要针对一个最新的Gecko引擎(火狐)的浏览器、一个基于Webkit引擎(Safari或者其他移动端)的浏览器、Chrome、你想要支持的IE浏览器(可以借助IE应用程序兼容性VPC镜像)和Opera浏览器。同时需要考虑到在不同的操作系统下浏览器是如何渲染你的网站
  • 需要考虑来自其他浏览器的用户如何使用你的网站:智能手机、屏幕朗读器和搜索引擎,举个例子。--一些易用性信息:网页易读性倡议(WAI)和网站508规范(Section508),移动站开发:移动互联网开发者论坛(MobiForge)。
  • 构架:如果在不影响用户的情况下部署升级。有一个或者多个用来更改架构、代码或者内容更新的可用测试或运行环境,确保他们部署的可控性,以防止造成破坏。有一个自动化部署方案,用来提交更改到生产环境。最优的解决方案是结合使用一个版本控制系统(CVS, Subversion等【译者注:为啥没GIT】)或一个自动构造机制(Ant,NAnt等)。
  • 不要直接给用户展现不友好的错误信息。
  • 不要用纯文本的形式呈现用户的Email,否则他们会被垃圾邮件骚扰。
  • 给用户生成的链接加上rel="nofollow"属性,以避免SEO作弊
  • 为你的站点建立合理的限制机制,这一条同时属于安全细则。
  • 理解什么是渐进增强(progressive enhancement)【译者注:与之相对的是优雅降级(graceful degradation)】。
  • 如果一个请求提交成功,请重定向至其他地方,防止用户的重复提交。
  • 不要忘了考虑无障碍阅读,这对网站的优化来讲是一个好主意,而且有些情况下他是法律强制必须有的。 无障碍网页应用(WAI-ARIA)和Web内容无障碍指南2(WCAG 2)在这方面可以帮到你!
  • 不要让用户思考该如何操作

安全

性能

  • 必要时使用缓存,理解并使用HTTP缓存技术HTML5的Manifest技术
  • 图片优化 - 不要使用一个20KB大小的的图片最为重复背景。
  • 学习如何使用gzip压缩内容
  • 合并/链接多个样式表或多个脚本文件以减少浏览器的请求数,并且使用gzip压缩文件中重复的内容。
  • 看一看雅虎高性能站点,有很多不错的点子,包括提高前端性能和他们的YSlow工具(需求使用Firefox、Safira、Chrome、或Opera浏览器)。同时,Google page speed使用浏览器插件)也是一个不错的性能调校工具,他同时也会优化你的图片。
  • 针对小并且相关的图片使用CSS image sprite技术
  • 访问量大的站点需要考虑将不用内容分至不同的域名下。
  • 静态内容(如图片、css、js脚本还有不需要cookie的普通内容)应该被分配到一个不使用cookie的域名下,因为一个域名下的所有cookie和子域下的cookie将会被包含在所有对应的域名下。一个好的主意是使用CND加速,但是考虑到CND可能会挂,到时候本地的拷贝也会提供服务。
  • 最小化一个浏览器需要渲染一个页面所需要的请求数。
  • 利用工具Google Closure Compiler最小化你的js文件,还有其他的最小化工具
  • 确保有一个favicon.ico在服务器的根目录,就算html里没有提到他,浏览器也会自动请求他。如果你没有一个favicon.ico,那么会导致很多的404错误,并浪费带宽。

SEO

  • 使用搜索引擎友好的URL,如使用www.phpgao.com/technical_details.html,而不用www.phpgao.com/index.php?p=XXX
  • 将你的#变为#!,然后再服务端使用$_REQUEST["escaped_fragment"]接收google机器人发来的请求,换句话说,google会把./#!page=1变为?_escaped_fragments_=page=1。同时,针对使用火狐beta4或者Chrome浏览器的用户,使用history.pushState({"foo":"bar"}, "About", "./?page=1");,是一个不错的选择。这样的话即使浏览器的地址栏有变化,但是页面不会重新加载。这样就允许你使用?代替#以保留动态内容,同时告诉服务器当你通过邮件发送的链接到底是什么页面,同时 ajax不需要额外的请求。【这一段如果看不懂:请参考URL的井号
  • 不要给你的链接添加诸如**点我**的说明。这样做是在浪费SEO优化的机会,同时让读者不容易理解。
  • 需要提供一个XML网站地图,最好使用默认的地址/sitemap.xml
  • 当你有多个URL指向相同的页面,请使用[指出你需要强调的页面,这个问题可以在Google Webmaster Tools被找到。
  • 使用谷歌站长工具Bing站长工具
  • 一开始就是用Google分析(或者一个开源分析工具,例如Piwik)。
  • 了解robots.txt和搜索引擎爬虫的工作机制。
  • 在(www.phpgao.com)或(phpgao.com)之间选择一个,然后使用301重定向将域名重定向到主域名,以防止分权。【博主选用了带www的域名www.phpgao.com,所以访问不带www的域名phpgao.com会被301重定向】
  • 要知道有一些不守规矩的爬虫。
  • 如果你有一些非文本的内容,可以借助Google's sitemap extensions for video 等工具。

技术

  • 理解HTTP,诸如GET,POST,sessions,cookies还有“无状态”的含义。
  • 使用符合W3C规则的XHTML/HTML + CSS页面并确保他们通过验证。此行的目的是避免出现浏览器的怪异模式,同时作为一个奖励,它会更加兼容非传统的浏览器,如屏幕朗读器和手机设备。
  • 理解js在浏览器中如何工作【dom原型】。
  • 理解js、样式表和其他资源如何被载入并解析为一个页面并考虑他们对渲染性能的影响。除非你在分析应用或者使用html5-shims做测试,否则把你的脚本放在html的最后是一个不错的选择。
  • 理解js的沙盒的工作机制,尤其是你在使用iframes的时候。
  • 意识到js是可以被禁用的,而Ajax也仅仅是一个扩展功能,而不是基准功能。尽管大部分用户多ajax置之不顾,但是要记住无脚本已经越来越流行,移动设备也可能不会像你期待的那样运行,并且Google在索引你的站点时几乎不会运行你的JS脚本。
  • 了解301和302重定向的区别(这也是一个SEO论题)
  • 尽可能的掌握你的产品部署平台。
  • 考虑使用样式表重置或者normalize.css.
  • 考虑js框架(jQueryMooToolsPrototypeDojoYUI 3),他们会屏蔽很多不同浏览器使用JS操作DOM的差异。【简化操作,屏蔽差异】
  • 同时考虑到渲染性能和js框架,建议使用诸如Google Libraries API的公共服务库载入框架,好处是浏览器在已经缓存的情况下不需要在从网站下载。【如果每个网站都是用公共库,命中率将大大提高】
  • 不要重复造轮子。再做任何事情之前先google之,看看有没有合适的组建或者已经实现的例子。有99%的几率你需要的功能已经被实现并开源。
  • 另一个方面,在你最终决定需求之前,不要一开始就上很多个库。尤其是针对客户端,最重要的是轻量、快速和灵活。

Bug修复

  • 你必须知道这个事实,纵观整个软件周期,你将花费20%的时间写代码,剩下80%的时间都在维护他,所以好好码吧!
  • 建立一个良好的错误报告解决方案。
  • 有一个客户反馈系统。
  • 将应用的工作原理写成文档,以便作为将来支持和运维的参考。
  • 有计划行的备份你的站点!(同时确保他们是可恢复的备份)Ed Lucas的回答中包含了一些建议。建立一个恢复机制,而不是备份机制。
  • 使用版本控制系统保存你的文件,如SubversionMercurialGit.
  • 不要忘了做验收检测。Selenium可以帮你的忙。
  • 确保你有足够的空间保存log4j, log4netlog4r生产的日志。如果你的生产环境出错,你可以用日志找到问题的根源。
  • 记录日志时请确保你同时记录了可处理和不可处理的错误。汇报/分析日志,他将会告诉你系统哪里出了问题。