ST3内网安装插件手札

去ST的官网下载最新版(Sublime Text 3),免费用户会不时有弹窗,不过不影响使用。

http://www.sublimetext.com/3

安装好ST3之后,安装Package Control。

因为内网需要使用代理,故默认的安装Package Control的方式无效,只能手动安装。

手动安装Package Control

  1. 运行ST3,点击Preferences > Browse Packages
  2. 返回上级目录,并进入Installed packages目录
  3. 下载Package Control.sublime-package,并且复制到Installed Packages目录里面
  4. 重启ST3即可

装好Package Control之后,直接使用 Package Control: Install Package 是无效的,此时需要去手动配置ST3的代理。

设置代理

点击Preferences > Package Settings > Package Control > Settings – User

输入内容

保存重启即可。

更多可定制配置,可以查看Preferences > Package Settings > Package Control > Settings – Default

结语:

ST3的Proxy配置,配置起来,比ST2要容易好多,一直觉得ST2的配置文件很混乱。

nginx自动补齐结尾斜杠

在Nginx下面,每次访问WordPress的后台,如果不带上结尾斜杠,就会在你访问后台wp-admin/下面的二级页面的时候,出现404错误。

例如访问了http://www.mxgw.info/wp-admin,进入了wp的后台,然后点击任意二级菜单,例如插件。本来是该访问http://www.mxgw.info/wp-admin/plugins.php的,但是由于当前路径是http://www.mxgw.info/wp-admin,少了结尾斜杠,而WP后台的链接用的都不是./这样的链接,而是直接的文件名,导致实际请求了一个不存在的文件http://www.mxgw.info/wp-adminplugins.php。

解决方案:

在nginx的conf配置里面,添加对/wp-admin请求的重定向。

参考来源:

http://codex.wordpress.org/Nginx

在复杂陌生的Linux设备上,编译安装PHP

起因

在一台陌生的SUSE Linux Enterprise上面迁移之前做的一个服务器端接口,需要用到phpredis

而安装phpredis,需要用到phpize,phpize在php5-devel这个包里面。

然后,很直接的,使用yast2 –install php5-devel进行安装的时候,麻烦来了。

这台Server是一台部署在一线的生产环境,意味着稳定第一。而使用yast2进行安装的时候,也不知道是不是很久没更新的缘故,提示有大量的包需要更新,甚至连一些系统核心的依赖包也需要更新。

敌情不明,不敢轻举妄动,找来Leader咨询一下,他看了一会,也没弄出个头绪来,决定先不要更新,选择其他方法吧,于是乎,就由了下文。

find / -name apxs2

编译安装PHP的时候,由于Apache是默认使用yast2进行安装的,所以编译PHP的时候,–with-apxs2没有找到对应的依赖文件。

网上搜索一下,提问一下,答案就来了。感谢SF。

得到结果/usr/sbin/apxs2,好了,接下来可以编译安装了。

后面的都没什么好说了,make && make install,当然,最好分开一步步执行,留意出错信息。

感触

Linux在某些方面上的设计,真是很不错。比如你可以装很多个Apache,装很多个php,并且可以做到每一个都互相独立工作,互不干扰。不过,一台电脑上面的端口号是唯一的,假如是给浏览器用的,那80端口就一个咯。

Design For Mobile Web

这两天专门制作了一个手机页面,现在分享一下里面常用的一些技巧。

通过viewport来匹配设备宽度

网上常见的做法:

上面这段代码,源自Google的Best Practices for Web Apps,但在实际使用过程中,并不能完全适应iOS、Android平台,至于WP,我的注意力暂时还没在它身上。

今天终于找个一个兼容Android和iOS的方法了。

这样,设计Mobile Web页面的时候,只需要按照640px的宽度进行设计就可以了。测试结果是Android 2.2+自带浏览器、iOS5+自带浏览器、Chrome移动版、Firebox移动版和UC8+以上版本皆能完美自适应。

PS:

  • 刚才搜索了一下viewport这个概念博大高深,里面还涉及到dpi等,我这里只是一种偷懒的方法。
  • viewport和响应式设计理念不同,响应式设计是一套html结构适配全平台,而viewport仅仅是给移动平台使用,并不打算兼容PC平台,如需兼容PC浏览器,需要另外写判断。

iOS中的WebApp

html5有多强大?看看之前Facebook在iOS上面的客户端就知道。

这里贴一些制作WebApp可能会需要用到的代码。

例如最常见的,隐藏导航栏,隐藏菜单栏等,不过这类效果,必须要用户把Web添加到主屏幕上,并且通过主屏幕上面的图标进入才生效。

同时,如果从WebApp中跳到了外部的浏览器或者其他软件,想再次返回到WebApp的时候,必须重新打开,不能够保存上次的访问结果。估计这事应该有解决方法。

导航了太占位了,如何在浏览器中就隐藏掉呢

就这么简单,当页面加载成功的时候,页面自动向上滚动,导航了就看不到了,第一页的高度就多了50px。

下面的菜单栏也很占位,如何隐藏?

404,这个,还真没找到方法…

各种Kill跨域Boss的方法

一个应用场景,需要跨域获取json数据以及html页面

方案1-JSONP:

对于JSON数据,可以很容易的获取。不过在结合Android的WebView后会存在一个很严重的问题。

在Android的WebView下面,会给每一次JSONP进行一次缓存,使用Eclipse+Android模拟器会发现apk的data目录下,会生成很多缓存文件,每一个文件就是一个JSONP的函数。

随着越来越多的请求,该目录下面的缓存文件也会越来越多。对于桌面浏览器而言,性能强大,影响不是很大,但对于寸土寸金的移动客户端,这细节是必须注意滴。

感谢某同事发现这一问题。

方案2-iframe:

一直以来,我都把iframe和frame给混为一谈,每当人们提到iframe,我总是极力想避开。

其实iframe和frame是两码事,iframe就是用来加载远程html用的。不过对于加载远程html里面的JS脚本,依然会和父html页面存在跨域问题。

方案3-设置Access-Control-Allow-Origin:

除去IE9、其他浏览器都完美支持,包括Andorid和iOS自带的。浏览器兼容性

对于IE9和IE8,需要把XMLHttpRequest请求改为XDomainRequest,IE10开始支持XMLHttpRequest。

测试的时候,直接设置为任意源,实际部署的时候,再根据实际情况,设置允许跨域源即可。

JerryQu的文章也写到了《也谈跨域数据交互解决方案》,他把CORS列为Kill Boss的终极必杀技。

方案4-各种Proxy手段:

PHP很容易就file_get_contents()一个远程源,然后再吐出来个自己用。

简单方便,不过和我实际场景有点不一致,这里不使用,拿来测试还OK。

结语:

我认为浏览器的同源限制,有它当初设计的考虑,在我还不了解背后的安全性因素的时候,贸贸然的使用各种方法去跨越这道安全屏障、去越狱,是不明智的,尤其是如果要部署到生产环境的话。很有可能会打开了潘多拉的盒子,各种XSS攻击随即而至。

 

用PHP来执行定时任务

上个月有个需求,用PHP写了一个接口给SDK使用,原始数据使用MySQL进行记录。热数据用Redis进行+1的原子操作。每隔一定时间,由一个PHP脚本(姑且就命名为cron.php)把Redis中的数据取出,放入MySQL中,并销毁Redis中的数据。

计划总是美好,现实总是残酷。

cron.php通过浏览器访问,很正常,可以捕获到Redis中的数据,并顺利写入到MySQL中。

然而,通过crontab设置定时执行cron.php后,却总是出错。

Google之后发现,通过CLI模式运行PHP,有可能不加载php.ini文件。

我的PHP支持Redis操作,是通过给PHP外挂第三方库实现的,运行的时候,必须要加载php.ini,但是我安装PHP的时候,因为不是在干净的系统上装的,某些原因导致我运行PHP必须手动加载php.ini。

So,最终解决的方法就是:

/usr/local/php/bin/php -c /usr/local/php/lib/php.ini /usr/local/nginx/html/pj1/cron.php

执行PHP-CLI的时候,加上-c参数,手动加载php.ini文件即可。

PS:我没怎么研究过Shell,用php-cli也不错呀~~

使用开源phpmailer发送邮件

网上也有几篇教程,不过我是为了给自己的服务可以发送邮件给自己用,所以只是用phpmailer的base功能,不需要使用smtp。

先去phpmailer官网下载,然后把里面的class.phpmailer.php放到自己的class库中。

我自己再定义一个mail.function.php的函数,里面new一个phpmailer的对象。

好吧,之前我是自己用PHP原生mail()函数写的邮件功能,但因为一直没看懂该如何对邮件正文进行重编码,导致邮件正文在部分收件工具中总是存在各种乱码情况。

需要用到发邮件的时候,只需要postmail($body);即可,当然,记得把mail.function.php给include进去。

jQuery Select菜单二级联动

应用:

参考地址:
http://wlog.cn/javascript/jquery-select.html

但文中代码只是在UI上实现了要求,在功能上,还会遇到问题。

假如这是一个表单,那么,在提交的时候,POST里面,会有多组city所对应的值。

解决方法:

1、给city所在的select去掉name标签,使其无法提交到POST
2、给选中的city的select添加name标签,使其该选中的city的值可以通过POST等方法进行传递

代码重现:

通过该方法,POST中就会得到city的唯一值

使用监控宝监控DirectAdmin中Apache的status模块信息

DirectAdmin在默认情况下,Apache的Status模块是开启的,但其配置内容并不是在我们常见的httpd.conf文件中。

而是在下面目录中:

20120103145307.png

打开文件后,将status部分内容改为下面内容

这样,监控宝的Apache监控就能正常监控到你的DirectAdmin服务器了。

这里面默认是Deny全部来源,只允许两个监控宝的IP访问该status页面,当然,你也可以改成其他需要的。