技术分享 ’ 目录下的文章存档

内存管理技巧:如何避免JavaScript的内存泄露

高效的JavaScript Web应用必须流畅,快速。与用户交互的任何应用程序,都需要考虑如何确保内存有效使用,因为如果消耗过多,页面就会崩溃,迫使用户重新加载。而你只能躲在角落哭泣。

自动垃圾收集是不能代替有效的内存管理的,特别是在大型,长时间运行的Web应用程序中。在这次讲座中,我们将演示如何通过Chrome的DevTools对内存进行有效的管理。

并了解如何解决性能问题,如内存泄漏,频繁的垃圾收集暂停,和整体内存膨胀,那些真正让你耗费精力的东西。

Addy Osmani在他的PPT中展示了很多会在Chrome V8中产生内存泄漏的示例:

1) Delete一个Object的属性会让此对象变慢(多耗费15倍的内存)

var o = { x: 'y' };
delete o.x; //此时o会成一个慢对象
o.x; //

var o = { x: 'y' };
o = null;  //应该这样

阅读全文

实现动态验证码的思路

示例

201407-captcha

 

zswang-captcha

 

背景

验证码主要是防止机器暴力破解。之前的验证码都是以静态为主,现在一些产品开始使用动态方式,增加破解的难度。动态方式以 gif 最为简单可靠。gif 兼容性好,尺寸小。这里分享的就是一种:用 JS 实现 gif 动态验证码的思路。感谢关注。

任务分解

  1. 绘制旋转的文字
  2. 计算每个字符出现位置和角度
  3. 生成 gif 图片

逐步求精

如何绘制旋转的文字?

了解能用的 API

  • context.rotate(angle) 使当前坐标系旋转 angle,单位弧度
  • context.translate(x, y) 使当前坐标系偏移 x, y,单位像素
  • context.font 设置字体
  • context.strokeText(text, x, y [, maxWidth ]) 给文本描边
  • context.fillText(text, x, y [, maxWidth ]) 给文本填充

怎么以文字的中心位置旋转?

void function() {
  // ...
  var x = 100;
  var y = 100;
  var angle = 1 / 8 * Math.PI;
  context.translate(x, y);
  context.rotate(angle);
  context.strokeText('A', 0, 0);
  // ...
}()

以文字的左下角为圆心旋转,不符合预期,见下图效果
阅读全文

Java数组操作的10大方法

下面是精心整理的Java数组操作的10大方法,大部分代码都来自Stack Overflow。

0、定义一个Java数组

String[] aArray = new String[5];
String[] bArray = {"a","b","c", "d", "e"};
String[] cArray = new String[]{"a","b","c","d","e"};

第一种是定义了一个数组,并且指定了数组的长度,我们这里称它为动态定义。

第二种和第三种在分配内存空间的同时还初始化了值。
阅读全文

2014年最火的21个JavaScript框架

JavaScript 框架是预先编写好的 JavaScript 库,为基于 JavaScript 的应用提供更简单的开发方式。这些 JavaScript 框架提供大量的函数,帮助你改善网站任务。现在网络上有着各种各样繁杂的 JavaScript 框架,这里我们列举 2014 年最火的 21 款 JavaScript 框架。这些框架将为 web 开发提供很好的便利,希望大家能从中找到自己喜爱和需要 JavaScript 框架:)

Ionic

Ionic 是非常漂亮而且是开源的前端框架,使用 HTML5 来开发混合移动端应用。

b3

 

Reactive Coffee

Reactive Coffee 是轻量级的 CoffeeScript 库/DSL,为反应式编程和声明式构建可扩展 web UIs 提供帮助。

b4

 

SKEL JS

SKELJS 是 JavaScript 框架,用来构建响应式网站和应用。
阅读全文

JavaScript构建(编绎)系统大比拼:Grunt vs. Gulp vs. NPM

Nicolas Bevacqua进行了一个比较JavaScript构建(编绎)系统的任务。他对三巨头: Grunt, Gulp and NPM进行了比较,并讨论了每种的优缺点。

By Nicolas Bevacqua

决定采用何种技术总是很难的。一旦遇到问题,你不想推翻你之前的选择。但是你必须选一个,然后让它按照着你的思路做。实施一套构建(编绎)系也是一样的,你应该把它看作一个非常重要的选择,让我们以Grunt为例。

Grunt有一个完善的社区,即使是在Windows上
它不仅仅应用在Node社区
它简单易学,你可以随便安装插件并配置它们
你不需要多先进的理念,也不需要任何经验

这些都是用Grunt构建编绎工具的充分理由,但我想澄清一点,我不认为Grunt不是唯一最好的选择。还有一些同样流行的选择摆在那里,有些方面可能比Grunt做得更好。

我写这篇文章,以帮助您了解Grunt,Gulp和npm之间的差异,这是我在前端开发工作中使用最多的三种构建工具。
阅读全文

如何让你的JavaScript代码更加语义化

语义化这个词在 HTML 中用的比较多,即根据内容的结构化选择合适的标签。其作用不容小觑:

  • 赋予标签含义,让代码结构更加清晰,虽然我们可以在标签上添加 class 来标识,但这种通过属性来表示本体的形式会显得不够直接,而且在一定程度上也有冗余。
  • 优化搜索引擎(SEO),结构良好的网页对搜索引擎的亲和力是很高的,百度和 google 也给出了很多网页结构化的建议(规范),方便他们抓取网页。
  • 利于设备解析,如盲人阅读器对页面的分析,目前淘宝很多网页都是支持盲人阅读的,这种体验上的优化得利于网页的良好结构和语义化表达。
  • 便于开发者维护,在参加工作之前,很多程序员都是单人开发模式,单人开发无所谓代码结构,自己看得懂就差不多了,一旦走向工作岗位,会发现,以前的鄙习有点让自己捉襟见肘了。

W3C Group 工作组在 web 规范上持续贡献,他们的目标也是期望整个互联网的发展态势稳定统一起来。不扯远了,回到本文需要阐述的重点:如何语义化 JavaScript 代码?

一、先看看那些不易读懂的 JavaScript 代码

1. 判断

// 数据类型判断
if(Object.prototype.toString.call(str) === “[object String]”){
    // doSomething();
};

// 文件类型判断
if(/.*\.css(?=\?|$)/.test(“/path/to/main.css”)){
    // doSomething();
}

2. 清空一个队列

var Queue = ["test1", "test2", "test3"];
// 常见方式
Queue.length = 0;
Queue = [];

3. 注册一个变量

// 注册
var repos = {};

repos[“a”] = {
   name: “a”,
   content: {}
};

repos[“b”] = {
   name: “b”,
   content: {}
};

上面几个例子倒不至于看不懂,程序都特别简单,第一个例子中,我们通过 Object 原型链上的 toString 方法来判断一个变量是否为 string 类型,以及使用正则来判断一个文件是不是 css 文件。代码写起来比较轻松,倘若我们同时需要判断多个对象是否为多个类型中的一种呢?再比如我们需要在一串代码中提取 require 依赖关系呢,是否应该思考下如何组织自己的代码?
阅读全文

加快网站访问速度的9大方法

一、 网站程序中采用DIV+CSS这种模式,不用Table

目前DIV+CSS是主流的编程语言,这与其体积小加载快的优点是密不可分的。主流的网站和CMS采用的也都是这种模式。因此建议大家也采用这种模式来编程,而不要采用原始的Table结构。Table结构不但管理不方便,网页体积也会变大,降低网站的加载速度

二、 采用Gzip技术对网页进行压缩

采用Gzip技术对网页进行压缩是减少网页体积的一个很好的方式.一般情况下这是需要你的网站空间支持的,像我用的A5的合租主机,压缩率可以达到80%。网页体积小了,自然加载速度就快了。

三、 减少CSS文件数量和体积

在采用DIV+CSS过程中,CSS文件是非常重要的。如果在编写过程中有多个CSS文件,建议将多个CSS文件进行合并,这样可以加快网站加载速度。另外,可以采用专业的网页减肥软件对CSS文件进行减肥,以减少CSS文件的体积。
阅读全文

改变开发者工作方式的15种技术

现在,开发人员要和分布在不同大洲的团队成员一起工作,这些成员使用不同字符集的语言,更坏的情况是有的团队成员可能会使用不同版本的编译器。但是这些都不是什么不可逾越的障碍,来看看是哪些技术帮我们实现目标。

以前,开发人员写的汇编代码轻巧而且运行速度快。运气好的话,如果预算充足,他们可以雇佣一些人来帮助完成这些代码的输入。运气不好的话,只能靠自己完成复杂的输入工作。

ddd

 

现在,开发人员要和分布在不同大洲的团队成员一起工作,这些成员使用不同字符集的语言,更坏的情况是有的团队成员可能会使用不同版本的编译器。一些代码是新编的,一些库是从很多年前创建的,源代码已经无法获得。所以,要想成为一个程序员,必须要拥有团队精神和吃苦耐劳的信念。

下面我们就来梳理一下正在改变基本开发工作的15种科技技术。这些技术改变着我们与其他团队成员的合作方式,与客户的沟通方式以及我们的编程方式。

1、持续集成(Continuous integration

当把代码提交到库中以后,你就有足够的时间休息一下,喝杯咖啡,甚至可以去吃个午饭。这个时候,代码库已经与一个持续运行的编译系统绑定,开始重新编译你提交的代码,仔细检查你的代码结构,初始化多个测试程序,标记你代码中可能的问题。在离你办公桌5英尺的范围内,编译系统就通过邮件或短信将需要修复的问题发到你的手机上。重新回到工作岗位,持续运行的编译系统又有新的任务给你了。
阅读全文

如何查看Linux上程序或进程用到的库

问题:我想知道当我调用一个特定的可执行文件在运行时载入了哪些共享库。是否有方法可以明确Linux上可执行程序或运行进程的共享库依赖关系?

查看可执行程序的共享库依赖关系

要找出某个特定可执行依赖的库,可以使用ldd命令。这个命令调用动态链接器去找到程序的库文件依赖关系。

$ ldd /path/to/program

rrr

注意!并不推荐为任何不可信的第三方可执行程序运行ldd,因为某些版本的ldd可能会直接调用可执行程序来明确其库文件依赖关系,这样可能不安全。
阅读全文

Java程序员须知的七个日志管理工具

ffff

 

Splunk vs. Sumo Logic vs. LogStash vs. GrayLog vs. Loggly vs. PaperTrails vs. Splunk>Storm

日志管理工具有Splunk、Sumo Logic、LogStash、GrayLog、Loggly和PaperTrails等等,数不胜数。日志就像石油,二十多年了我们一直想摆脱它,却一直没有做到。

为了处理日益增长的数据,近年来出现了一大批分析和管理日志的工具,开发和管理人员能够借助这些工具来了解增长的数据。在这篇文章中,我将站在开发者的角度,分析一下这些工具的特点。

Splunk

作为这个领域中最大的工具,我决定将 Splunk 做一个单独的分类。并不是说这个工具是最好的,而是对这个产品给予肯定,因为它从本质上创造了一个新的领域。

优点

在这个领域内功能最齐全的可能就是 Splunk 了。它有数百个来分析各种形式日志信息的程序(我计算的是537个)——从安全领导到商业分析,再到底层监控。Splunk 的搜索和图表工具如此丰富,没有通过它(UI和API)得不到的数据。

缺点

Splunk 主要有两个缺点。第一,这个因素可能有些主观,我觉得这个解决方案太复杂了。如果要在一个高度复杂的环境中部署,就需要安装和配置一个专用集群。作为一个开发者,通常会因为这点而不把这个方案作为第一选择。
阅读全文