ajax请求处理中导致页面暂时卡住的问题

事情起因是这样的,因为页面上有多个相似的异步请求动作,本着提高代码可重用性的原则,我封装了一个名为getData的函数,它接收不同参数,只负责获取数据,然后把数据return。基本的逻辑剥离出来是这样的:

这里的ajax不能用异步的,否则函数返回时,result还未赋值,会出错。所以我加了async:false。看起来好像没什么问题。我调用这个函数可以正常的得到数据。

接下来,要加另外一个功能,由于ajax请求有一定的耗时,所以我需要在发出请求前页面有个loading效果,即显示一张“正在加载”的gif图片,想必大家也都见过。所以我的处理函数就变成了这样:

请求之前显示loading图片,请求完成后把它隐藏。看起来也没什么问题。为了看清效果,我的p.php代码sleep了3秒,如下:

但是我运行的时候问题出现了,我点击按钮并未像预想的那样出现这个loading图片,页面什么反应也没有。排除良久找到了原因,就在async:false这里。

浏览器的渲染(UI)线程和js线程是互斥的,在执行js耗时操作时,页面渲染会被阻塞掉。当我们执行异步ajax的时候没有问题,但当设置为同步请求时,其他的动作(ajax函数后面的代码,还有渲染线程)都会停止下来。即使我的DOM操作语句是在发起请求的前一句,这个同步请求也会“迅速”将UI线程阻塞,不给它执行的时间。这就是代码失效的原因。

setTimeout解决阻塞问题

既然明白了问题在哪里,我们就来针对性想办法。为了不让同步ajax请求阻塞线程,我想到了setTimeout,把请求的代码放到sestTimeout中,让浏览器重启一个线程来操作,不就解决问题了吗?于是乎,我的代码就变成了这样:

setTimeout的第二个参数设为0,浏览器会在一个已设的最小时间后执行。不管三七二十一先运行起来看看。

结果loading图片显示出来了,但是!!!图片怎么不动呢,我明明是一张动态gif图。这个时候我很快就想到了,虽然同步请求延迟执行了,但是它执行期间还是会把UI线程给阻塞。这个阻塞相当牛逼,连gif图片都不动了,看起来像一张静态图片一样。

结论很明显,setTimeout治标不治本,相当于把同步请求“稍稍”异步了一下,接下来还是会进入同步的噩梦,阻塞线程。方案失败。

是时候用Deferred了

jQuery在1.5版本之后,引入了Deferred对象,提供的很方便的广义异步机制。详情可参看阮一峰老师的这篇文章

http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_deferred_object.html

于是我用Deferred对象改写了代码,如下:

可以看到我在ajax请求中去掉了async:false,也就是说,这个请求又是异步的了。另外请注意success函数中的这一 句:defer.resolve(data),Deferred对象的resolve方法可传入一个参数,任意类型。这个参数可以在done方法中拿到, 所以我们异步请求来的数据就可以以这样的方式来返回了。

至此,问题得到了解决。Deferred对象如此强大且方便,我们可以好好利用它。

我的全部测试代码如下,有意的同学可以拿去测一下:

 

发表在 Web前台开发技术 | 标签为 , , | 留下评论

Centos 6.5升级git版本的办法

安装依赖:

卸载Centos自带的git1.7.1

通过git –version查看系统带的版本,Cento6.5应该自带的是git版本是1.7.1

下载git2.2.1并将git添加到环境变量中

查看版本号

 

发表在 应用工具软件, 操作系统相关 | 标签为 | 留下评论

淘宝npm镜像使用方法

淘宝 npm 地址: http://npm.taobao.org/

如何使用:

1.临时使用

2.永久使用

  • 配置后可通过下面方式来验证是否成功
    npm config get registry

  • npm info express

3.通过cnpm使用

  • 使用
    cnpm install express
发表在 应用工具软件 | 标签为 , | 留下评论

如何申请Let’s Encrypt永久免费SSL证书过程教程

Let’s Encrypt作为一个公共且免费SSL的项目逐渐被广大用户传播和使用,是由Mozilla、Cisco、Akamai、IdenTrust、EFF等组织人员发起,主要的目的也是为了推进网站从HTTP向HTTPS过度的进程,目前已经有越来越多的商家加入和赞助支持。

Let’s Encrypt免费SSL证书的出现,也会对传统提供付费SSL证书服务的商家有不小的打击。到目前为止,Let’s Encrypt获得IdenTrust交叉签名,这就是说可以应用且支持包括FireFox、Chrome在内的主流浏览器的兼容和支持,虽然目前是公测阶段,但是也有不少的用户在自有网站项目中正式使用起来。

在今年黑色星期五的时候,Namecheap各种促销活动中也包括年费0.88美元的SSL证书,当时老左也有购买了2个备用学习和适当的放到一些网站中看看效果(据说英文网站谷歌会很喜欢),当时冷雨同学就建议到时候直接使用Let’s Encrypt免费SSL,毕竟有很多大公司支持的,比一些小公司提供的免费SSL证书靠谱很多。

虽然目前Let’s Encrypt免费SSL证书默认是90天有效期,但是我们也可以到期自动续约,不影响我们的尝试和使用,这篇文章分享申请的方法教程。

第一、安装Let’s Encrypt前的准备工作

根据官方的要求,我们在VPS、服务器上部署Let’s Encrypt免费SSL证书之前,需要系统支持Python2.7以上版本以及支持GIT工具。这个需要根据我们不同的系统版本进行安装和升级,因为有些服务商提供的版本兼容是完善的,尤其是debian环境兼容性比CentOS好一些。

比如CentOS 6 64位环境不支持GIT,我们还可以参考”Linux CentOS 6 64位系统安装Git工具环境教程”和”9步骤升级CentOS5系统Python版本到2.7″进行安装和升级。最为 简单的就是Debian环境不支持,可以运行”apt-get -y install git”直接安装支持,如果是CentOS直接运行”yum -y install git-core”支持。这个具体遇到问题在讨论和搜索解决方案,因为每个环境、商家发行版都可能不同。在这篇文章中,老左采用的是debian 7 环境。

第二、快速获取Let’s Encrypt免费SSL证书

在之前的博文中老左也分享过几篇关于SSL部署的过程,我自己也搞的晕乎晕乎的,获取证书和布局还是比较复杂的,Let’s Encrypt肯定是考虑到推广HTTPS的普及型会让用户简单的获取和部署SSL证书,所以可以采用下面简单的一键部署获取证书。

PS:在获取某个站点证书文件的时候,我们需要在安装PYTHON2.7以及GIT,更需要将域名解析到当前VPS主机IP中。

然后执行上面的脚本,我们需要根据自己的实际站点情况将域名更换成自己需要部署的。

看到这个界面,直接Agree回车。

然后看到这个界面表示部署成功。目前根据大家的反馈测试,如果域名是用的国内DNS,包括第三那方DNSPOD等,都可能获取不到域名信息。

这里我们可以看到有”The server could not connect to the client to verify the  domain”的错误提示信息,包括也有其他提示错误,”The server experienced an internal error :: Error creating new registration”我们在邮局的时候不要用国内免费邮局。所以,如果我们是海外域名就直接先用域名自带的DNS。

第三、Let’s Encrypt免费SSL证书获取与应用

在完成Let’s Encrypt证书的生成之后,我们会在”/etc/letsencrypt/live/laozuo.org/”域名目录下有4个文件就是生成的密钥证书文件。

cert.pem  – Apache服务器端证书
chain.pem  – Apache根证书和中继证书
fullchain.pem  – Nginx所需要ssl_certificate文件
privkey.pem – 安全证书KEY文件

如果我们使用的Nginx环境,那就需要用到fullchain.pem和privkey.pem两个证书文件,在部署Nginx的时候需要用到。在这篇文章中老左就不详细演示Let’s Encrypt证书证书的安装,后面再重新折腾一篇文章详细的部署证书的安装Nginx和Apache。

比如我们在Nginx环境中,只要将对应的ssl_certificate和ssl_certificate_key路径设置成我们生成的2个文件就可以,最好不要移动和复制文件,因为续期的时候直接续期生成的目录文件就可以,不需要再手工复制。

第四、解决Let’s Encrypt免费SSL证书有效期问题

我们从生成的文件中可以看到,Let’s Encrypt证书是有效期90天的,需要我们自己手工更新续期才可以。

这样我们在90天内再去执行一次就可以解决续期问题,这样又可以继续使用90天。如果我们怕忘记的话也可以制作成定时执行任务,比如每个月执行一次。

–force-renewal: 代表强制renew
–pre-hook: 是nginx关闭的命令,因为renew需要关闭nginx
–post-hook: 是nginx开启的命令,搞完证书后,开启nginx

自动续签可以使用crontab来完成,在linux中执行  crontab -e
添加代码:(www/web_logs/letsencry.log 为日志文件,您需要新建这个文件并设置可写)

开启http2

可以更快的加载https,关于http2的资料为:http://www.jianshu.com/p/47d02f10757f

nginx安装的时候需要添加:

然后在nginx的ssl配置将listen 443 ssl ;改为:

这样就开启http2了,http2可以更快的加载。

http2的资料:

http://www.infoq.com/cn/news/2015/02/https-spdy-http2-comparison/

强制使用https,http访问进行跳转

第五、关于Let’s Encrypt免费SSL证书总结

通过以上几个步骤的学习和应用,我们肯定学会了利用Let’s Encrypt免费生成和获取SSL证书文件,随着Let’s Encrypt的应用普及,SSL以后直接免费不需要购买,因为大部分主流浏览器都支持且有更多的主流商家的支持和赞助,HTTPS以后看来也是趋势。在Let’s Encrypt执行过程在中我们需要解决几个问题。

A – 域名DNS和解析问题。在配置Let’s Encrypt免费SSL证书的时候域名一定要解析到当前VPS服务器,而且DNS必须用到海外域名DNS,如果用国内免费DNS可能会导致获取不到错误。

B – 安装Let’s Encrypt部署之前需要服务器支持PYTHON2.7以及GIT环境,要不无法部署。

C – Let’s Encrypt默认是90天免费,需要手工或者自动续期才可以继续使用。

发表在 操作系统相关 | 标签为 , , , | 留下评论

用PHP实现POP3邮件的收取

本文简要说明了通过POP3协议收取邮件、MIME邮件的解码的原理;针对收取和MIME解码,提供了两个实用的PHP类,并提供了使用的样例。分为邮件收取、MIME解码两个部分。这里我们先向您介绍邮件的收取,解码部分会在以后的文章中为各位详细的介绍,敬请关注。

现在Internet上最大的应用应该是非Email莫属了,我们每天都习惯于每天通过Email进行交流,各大网站也几乎都推出了自己的基于WEB的免费邮件系统。在本文里,笔者将介绍一些Email实现的一些原理。同时我们假设你对于PHP的编程有一定的基础,对于TCP/IP协议也有一定的了解。

POP协议简介

POP的全称是PostOfficeProtoco,即邮局协议,用于电子邮件的接收,现在常用的是第三版,简称为POP3。通过POP协议,客户机登录到服务器上后,可以对自己的邮件进行删除,或是下载到本地,下载后,电子邮件客户软件就可以在本地对邮件进行修改、删除等。另外一种用于接收信件的邮件是IMAP协议,现在发展很快,在本文中,我们暂不讨论。

POP服务器一般使用的是TCP的110号端口,如果你用的是Foxmail的话,在其收邮件的时候,你可以看到其信息提示窗口有这么一些命令:

下面让我们来看一段与POP3服务器对话的实录:

以下对几个常用的POP3命令作一个简单的介绍 :

命令   参数   状态   描述

——————————————

USER   username 认可   此命令与下面的pass命令若成功,将导致状态转换

PASS   password 认可

APOP   Name,Digest认可   Digest是MD5消息摘要

——————————————

STAT   None   处理   请求服务器发回关于邮箱的统计资料,如邮件总数和总字节数

UIDL   [Msg#]  处理   返回邮件的唯一标识符,POP3会话的每个标识符都将是唯一的

LIST   [Msg#]  处理   返回邮件数量和每个邮件的大小

RETR   [Msg#]  处理   返回由参数标识的邮件的全部文本

DELE   [Msg#]  处理   服务器将由参数标识的邮件标记为删除,由quit命令执行

RSET   None   处理   服务器将重置所有标记为删除的邮件,用于撤消DELE命令

TOP   [Msg#]  处理   服务器将返回由参数标识的邮件前n行内容,n必须是正整数

NOOP   None   处理   服务器返回一个肯定的响应,不做任何操作。

——————————————

QUIT   None   更新退出

发表在 BS架构后台语言 | 标签为 , | 留下评论

git只clone仓库中指定子目录和指定文件的实现

我的使用场景:

1、想用一颗repository树来保存相互之间没有关联、没有依赖的运维子项目,而每个子项目代码量都很少,每一个子项创建一个repository太没有必要了;

2、公司的所有内部api也想统一放置到一颗repository树上,几十个api不能都创建一个repository吧(我现在是这么认为的,这个需求也可能不太合理)。

如果非要只clone repository中的几个子目录的话,那就用sparse clone,git从1.7.0开始支持,sparse clone也只是一个变通的方法:先拿到整个repository的object等元数据信息,然后在本地加一个叫.git/info/sparse-checkout的文件(即黑名单、白名单,支持正则,参见下文具体操作命令)来控制pull那些目录和文件(类似.gitignore文件,都是本地的概念),变通的实现《git只clone仓库中指定子目录和文件》,如果非要完美的满足这个需求那就用svn吧。

引用stackoverflow上对sparse clone的描述:

Implementing something like this in Git would be a substantial effort and it would mean that the integrity of the clientside repository could no longer be guaranteed. If you are interested, search for discussions on “sparse clone” and “sparse fetch” on the git mailinglist.

In general, the consensus in the Git community is that if you have several directories that are always checked out independently, then these are really two different projects and should live in two different repositories. You can glue them back together using Git Submodules.

具体做法:

一、svn的实现:svn因为是基于文件的集中控制方式,所有“原生”就支持只checkout指定子目录,并且还能很好的对子目录进行权限控制

➜  svn-test  svn co http://xxx.xxxx.com/ops/内网服务器情况   test
A    test/内网机器硬件配置详细
A    test/内网机器硬件配置详细/192.168.1.147.txt
A    test/最新全公司网络拓扑图.png

二、git的实现:基于sparse clone变通方法

截图:

文章来源:http://blog.csdn.net/xuyaqun/article/details/49275477

发表在 应用工具软件 | 标签为 , | 留下评论

如何给macos系统日历添加农历日期

如题,最近在用mac上的日历看时间时总是没有完整的农历日期,用起来很是不爽。

不包含农历日期

添加订阅农历日期的方法如下:

1、打开日历应用点击菜单上的文件->新建日历订阅操作

2、订阅地址填写 http://iweek.me/m/ical/nong.php?starty=2015&county=3

大功告成~~~

发表在 操作系统相关 | 标签为 , | 留下评论

SSH登陆后,如果长时间没有响应则自动LOGOUT的设置

操作系统:Centos
SSH登陆后,如果长时间没有响应则自动LOGOUT的设置如下,其时非常简单:
1)vi /etc/profile,编辑profile文件,在最后面添加如下行:

注:TMOUT是一个控制超时的环境变量,此处设置为60秒无响应,就会自动LOGOUT
2)使用SecureCRT工具登陆进行测试,60秒无操作会自动LOGOUT,如下所示:

发表在 操作系统相关 | 留下评论

crontab 每隔1小时 2小时的执行job写法

加任务:
查询任务是否加了:
基本格式 :
*  *  *  *  *  command
分 时 日 月 周 命令
第1列表示分钟1~59 每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令
crontab文件的一些例子:

上面的例子表示每晚的21:30重启apache。

上面的例子表示每月1、10、22日的4 : 45重启apache。

上面的例子表示每周六、周日的1 : 10重启apache。

上面的例子表示在每天18 : 00至23 : 00之间每隔30分钟重启apache。

上面的例子表示每星期六的11 : 00 pm重启apache。

每一小时重启apache

晚上11点到早上7点之间,每隔一小时重启apache

每月的4号与每周一到周三的11点重启apache

一月一号的4点重启apache
发表在 操作系统相关 | 标签为 | 留下评论

用命令行如何在github新建项目

众所周知,在github上新建项目无非是以下两种情况

  1. 代码从零开始。
  2. 本地已经存在项目代码,只是想放到github上开源或者存放。

然而,无论是哪种情况,都得先在github新建一个项目的仓库。登录github后,找到下图中的Repositories这个tab,然后点击红框中的new来新建一个项目仓库。

新建项目仓库的界面如下所示:

然后由上往下输入你项目的名字、项目的描述,选择这个项目是不是公开(Public)或是作为私人项目(Private)。

如果自己本地有很多项目需要导入到github上,再或者网络不太稳定,每次都打开github页面来创建岂不是很麻烦?

现在我就来教你如何通过命令行创建github项目

准备工作

1. 新建一个API token
打开github的个人设置页面,在Developer settings分组中找到Personal access tokens菜单,或点击 https://github.com/settings/tokens 直接进入。

然后选择Generate new Token按钮来创建一个token,写入description,选择scopes(设置此token持有者的权限)。

记住personal access token(也就是那一串字符和数字)!这一串东西只出现一次,下次查看不到。


2. 在本地建立仓库

通过控制台命令创建仓库

1. 命令行模式

这是最直接的一种形式,直接把参数写到命令行搞定:

注:这里需要把$username和$token分别换成实际的用户名和刚才记住的personal access token,把$repo_name换成任何想要的repo name。

如果想在github上自己创建的组织下新建,则需要把地址修改为https://api.github.com/orgs/$organization/repos

注:这里需要把$organization换成实际的组织名。

2. bash脚本形式

我们可以把命令行写成bash脚本,下次只要执行里面的简单命令就可以执行以上整条命令。

  • 把username和token写入(apend或者修改)~/.gitconfig,形式如下:
  • 把如下bash code写入(append)~/.bash_profile文件
  • 重新打开或新启动一个Termina,或者也可以在当前Terminal下运行如下命令
  • 然后就可以用如下命令创建远程仓库了

如果你不想用默认repo名(也就是当前目录名)创建repo可以重新输入另一个名字,否则直接按回车执行。

这是一种比较健壮的形式,其username,token,repo name 都有很大的自由度,接下来这种非常简单,但在不同情况下有时需要被直接修改。

以下是我用的简化版,仅供参考

 

发表在 BS架构后台语言, 应用工具软件 | 标签为 , | 留下评论