Leo Wang's Notepad

技术

我对Javascript中的闭包Closure的理解

怎样理解 Javascript Closure 也就是闭包的概念,想必很多人在为此头疼。

笔者先后参考了下面这些资料

MDN Javascript Closure https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Closures

阮一峰的博客 http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html

Frank Fang的博客 http://www.cnblogs.com/frankfang/archive/2011/08/03/2125663.html

作者们都声称自己搞懂了闭包的概念,可自己还是看的云里雾里。

直到笔者看到下面这篇文章,才开始真正理解闭包的概念和应用场景。

Jonathan D. Johnson的博客 http://jondavidjohn.com/javascript-closure-explained-using-events/

下面我试着把这篇文章边翻译边把自己的理解写出来。

先看一下下面这段程序,

效果:在第3次按下button的时候显示”Third time’s the charm”的消息框。

在sap hybris的accelerator中添加hybris cms组件(hybris cms component)的方法

在hybris的accelerator中新建CMS组件(hybris cms component)的步骤包括:

*注意:hybris addon中的步骤有所不同,将在另一篇文章中记述。

  1. 自定义hybris item,在extension的items.xml文件中定义,类似于任何其他hybris item。
  2. 一个继承AbstractCMSComponentController的Spring MVC控制器,或使用DefaultCMSComponentController。
  3. 用于在页面上呈现组件的JSP,根据需要使用HTML,CSS和Tag Libraries。

可以通过XML配置为组件自定义hybris WCMS Cockpit:

  1. editorArea_typeName.xml:WCMS Cockpit编辑器区域的配置文件。
  2. contentEditor_typeName.xml:用于LiveEdit模式和联机编辑的配置文件
  3. wizardConfig_typeName.xml:如果通过向导对话框添加组件,则通过此文件进行向导配置。

在SAP hybris中实行单体测试(Unit Test)的注意事项

在SAP hybris的单体测试中,出现如下错误信息:

sap hybris在新建自定义cms component时的注意事项

在SAP hybris中添加自定义的CMS Component,需要注意以下几点:

参考链接: https://wiki.hybris.com/pages/viewpage.action?pageId=294094319

  1. 在addon中添加,可免去对accelerator的修改
  2. 在/<addon-name>/resources/<addon-name>/web/spring/<addon-name>-web-spring.xml中添加renderer和rendererMapping的定义
  3. 使用ant命令安装addon

<addon-name>-web-spring.xml的代码示例如下:

有了uwsgi为什么还需要nginx

在python的web开发中,我用flask框架写了一个小程序,部署的时候,我用到了uwsgi来做容器。

在学习uwsgi部署的过程中,另一个关键词nginx频繁的跳出来。这两者通常是成对出现的。

你有没有和我一样的困惑,为什么有了uwsgi我们还需要nginx?

我是说,既然uwsgi能够展现你想要的内容,那nginx存在的意义在哪里?

首先,nginx是一个HTTP 服务器。如果你是学Java出身的,说到HTTP服务器你应该会想到Apache。

类似的uwsgi可以比喻为tomcat。

nginx官方网站上给出的一张图片很好的揭示了nginx的角色。

architecture-nginx

我所理解的nginx的主要功能,有以下几个部分:

  • nginx处理静态内容请求更专业、快速
  • nginx可以缓存请求。如果让uwsgi来直接接受请求的话,uwsgi需要花费大量的时间来等待request,这本身对web应用所在的主机是很大的资源浪费。
  • 分发请求。假如你有好几个web应用,分布在不同的主机上,nginx可以把请求分发到各自的web应用来进行处理。这一特点是nginx可以用来做负载均衡器。
  • 相比web容器,nginx的漏洞更少更安全
  • nginx可以更好的处理HTTPS
  • nginx有网关(gateway)的作用,可以过滤访问IP。

 …

在Python中将datetime字符串转换为utc timestamp

在python中有很多方法将datetime的字符串转换为 utc timestamp

网上找了好多,看起来都纷繁复杂。本文就想简单的做好一件事,就是将datetime的字符串转换为utc timestamp。

理解这个转换的关键,在于理解python中所有的日期字符串都被python解读为local time。

也就是说,同样是’2015/10/27 00:00:00’这个字符串,虽然身处东京的我和身在伦敦的你看到的是同一个字符串,但他们本身被python解读为两个不同地方的日期和时间。

如果想让python不去理会时差,而只想要utc格式的时间戳的话,用calendar.timegm()函数即可实现。

现举例如下:

Windows下SQL Server2008的定时备份策略

在windows下对SQL Server2008数据库进行定时备份,需要做以下工作:

1.编写备份数据库的bat文件,内容形似:

backup database testdb to disk=’d:\backup\testdb.bak’  >> .\backup.log

2.编写copy数据库备份文件并重命名的bat文件,形似:

SET DT=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%

COPY D:\backup.bak  D:\backup%DT%.bak >> .\copy.log

2.建立两个windows计划任务,分别选定时间和周期执行上述备份bat文件。

这样就可以实现sql server的定时备份策略了。…

Cookie 无法保存的另一个可能原因

在项目中需要往cookie中写数据,之前遇到的问题是如果写入的内容超出了单个cookie的大小限制(4096字节,4KB),则服务器端的response就会异常。

今天的问题则是,虽然已经把很长的内容分割成立个好几段,并分别写入了不同的cookie中,但服务器端同样不能正常响应。

查资料得知,不知浏览器对同一个站点的cookie的个数,单个cookie文件的大小有限制,服务器还对每一次请求的httpheader的大小有限制。

对tomcat服务器来说,需要修改server.xml中的响应配置,在形如

[sourcecode language=”xml”]
<Connector port=”8080″ protocol=”HTTP/1.1″
connectionTimeout=”20000″
redirectPort=”8443″ maxHttpHeaderSize=”40960″/>

[/sourcecode]

的部分进行相应配置,上面的maxHttpHeaderSize就规定了本服务器可以处理的HttpHeader的大小上限为40KB。

 …

Struts2无法写Cookie的原因分析

在struts2项目中,希望把用户的表单输入保存在本地,而不是保存在数据库上,于是想到了cookie。

在action中可以这样写:

[sourcecode language=”java”]

Cookie cookie=new Cookie("myCookie","cookieContent");

cookie.setMaxAge(3600*24);//过期时间为一天

ServletActionContext.getResponse.addCookie(cookie);

[/sourcecode]

但是始终不能保存到客户端的硬盘上,刚开始的时候以为cookie的读写操作只能写在jsp页面中,或者只能通过javascript来操作,

后来发现不是这么回事。

关键的原因在于cookie是有大小限制的,如果想写入的内容超过了4KB,写操作便不能完成。

Microsoft Internet Explorer 符合以下的 RFC 2109 推荐最小限制:

  • 至少 300 的 cookie
  • 至少每 cookie (如构成 cookie 非终端设置 Cookie 标头的语法描述中的字符的大小为单位) 的 4096 字节
  • 至少 20 cookie,每个唯一的主机或域名