如何在Java程序中使用JDBC Driver连接SQL Server

最近我开始支持Microsoft JDBC Driver for SQL server,它能够使Java应用连接到微软SQL Server。由于从未接触过Java开发,所以写下这篇文章记录如何创建一个最简单的控制台Java程序通过JDBC Driver来连接SQL Server。


2018年8月27日
阅读全文

理解HTTP CONNECT通道

为了确保数据通信的安全,HTTPS已广泛应用于互联网,浏览器与服务器之间的HTTPS通信都是加密的。然而当浏览器需要通过代理服务器发起HTTPS请求时,由于请求的站点地址和端口号都是加密保存于HTTPS请求头中的,代理服务器是如何既确保通信是加密的(代理服务器自身也无法读取通信内容)又知道该往哪里发送请求呢?为了解决这个问题,浏览器需要先通过明文HTTP形式向代理服务器发送一个CONNECT请求告诉它目标站点地址及端口号。当代理服务器收到这个请求后,会在对应的端口上与目标站点建立一个TCP连接,连接建立成功后返回一个HTTP 200状态码告诉浏览器与该站点的加密通道已建成。接下来代理服务器仅仅是来回传输浏览器与该服务器之间的加密数据包,代理服务器并不需要解析这些内容以保证HTTPS的安全性。


2018年8月12日
阅读全文

JavaScript AST初体验

最近在做一个工具自动把外部的Web Worker文件引用内联化,即碰到代码里有new Worker('worker.js'),就去读取worker.js的代码,然后把原Web Woker引用内联化为:new Worker(window.URL.createObjectURL(new Blob(["/* worker.js的内容 */"])))。这个功能看似简单,我一开始想用正则表达式来匹配出Web Worker的实例化参数,但发现有很多极端情况需要去做特殊考虑,最终在了解并尝试了JavaScript AST(Abstract Syntax Tree抽象语法树)Parser后,所有的问题迎刃而解。


2018年4月12日
阅读全文

Web Worker传输大量Transferable对象时的性能问题

最近正在做一个基于浏览器File Reader API的文本解析工具。为了让繁重的文本解析工作不影响页面线程的性能,使用Web Worker来负责处理文本解析应该是最优的。Web Worker需要将解析后的每行文本传回给页面,当需要传输的文本行数达到数十万、百万行时,性能问题就变得尤为重要,一方面是传输的耗时,一方面是内存的消耗。多数浏览器实现了结构克隆,允许你对Web Worker传入、传出更复杂的数据类型,如:File, Blob, ArrayBuffer, JSON对象等。然而当你使用postMessage()方法传输这些数据时,数据会被拷贝一份再进行传输,所以当你传输100MB的数据时,主进程和Worker进程都会增加100MB的内存使用,并且复制100MB的数据需要的时间可能达到几百毫秒。为了解决这个问题,postMessage()方法也支持传输Transferable数据类型,使用Transferable传输时,会直接把数据从一个执行环境(Worker线程或主线程)传输到另一个执行环境,这样不会额外增加一份内存消耗,并且传输速度极快因为不需要数据拷贝。可是在实际使用中,如果需要传输大量的Transferable数据时,这种方法仍存在显著的性能问题。


2018年1月23日
阅读全文

使用FileReader.readAsArrayBuffer()在浏览器中处理大文件

HTML5的FileReader API可以让客户端浏览器对用户本地文件进行读取,这样就不再需要上传文件由服务器进行读取了,这大大减轻了服务器的负担,也节省了上传文件所需要的时间。不过在实践中我发现用FileReader.readAsText()可以轻易地处理一个300k的日志文件,但当日志文件有1G、甚至2G那么大,浏览器就会崩溃。这是因为readAsText()会一下子把目标文件加载至内存,导致内存超出上限。所以如果Web应用常常需要处理大文件时,我们应该使用FileReader.readAsArrayBuffer()来一块一块读取文件。


2017年9月5日
阅读全文

探索ES6:箭头函数

匿名函数作为参数在JavaScript是很常见的,事件绑定、异步回调等都会用到匿名函数。ES6中引入了箭头函数,用于便捷地书写匿名函数。大致语法为:(参数) => {表达式或返回值},接下来让我们来看看箭头函数的用法。


2017年2月17日
阅读全文

JavaScript ES5中的Object.defineProperty()方法

JS中的对象类型:var obj = {a:1},可以通过变量.属性名的形式进行取值、赋值,这种方式虽然便捷,但其创建的属性值可以被任意修改,并可以通过for...in枚举。Object.defineProperty()可以定义、修改对象属性的值及其特性。如今流行的数据双向绑定的JS库中广泛使用了该方法。


2017年2月9日
阅读全文

企业IE11迁移指南:兼容性问题解决方案

在解决IE11网页兼容性问题时,我们首先要了解下兼容性问题的本质是什么,也就是说我们的目标是什么。基本上可以概括为以下两类:


2016年9月16日
阅读全文

企业IE11迁移指南:由IE11“Natural Metrics”造成的页面布局问题

升级至IE11后网页布局破坏最常见的原因是:IE11使用了较新的文档模式来渲染页面。但有时候会发现一个页面即使使用了相同的文档模式,IE11中显示的布局仍然被破坏了,这可能是由于IE11使用了一种全新的字体渲染模式:natural metrics,在IE11之前IE都是使用传统的gdi metrics


2016年8月20日
阅读全文

如何搭建要求客户端证书的IIS站点(使用自签名证书)

有些IE、IIS的问题会牵涉到客户端证书,每次搭建一个要求客户端证书的网站测试环境都要花费较长时间,痛定思痛决定把所有步骤:创建自签名根证书、服务端证书、客户端证书、配置IIS记录下来。


2016年7月31日
阅读全文

使用Gulp+Git自动部署Azure Web站点

我之前使用过 Visual Studio 来部署 Azure Web 站点,VS 和 Azure 的高度集成使网站部署变得十分简单。然而我另一个站点是通过 Gulp 自动构建静态页面、文件的,所以我希望能通过一条命令使 Gulp 自动完成网站的部署,如:gulp deploy。Azure Web 站点的部署方式有很多选择:Visual Studio、Git、Powershell、FTP、手动部署等。在权衡了利弊之后,我决定采用 Gulp+Git 来实现自动部署站点。每个 Azure Web 站点都允许创建一个 Git 仓库作为部署源,不过这个选项默认是关闭的,Local Git Deployment to Azure App Service介绍了如何从管理界面中开启 Git 仓库以及如何通过 Git 命令将本地站点发布到 Azure 上。本文将重点介绍如何使用 Gulp 将文中的手动部署操作转为自动化脚本。


2016年5月31日
阅读全文

使用nodemon通过监测文件修改来自动重启node应用

在调试 Node.js 项目时,每次修改代码都要重新运行node server.js才能生效,大大降低了效率。我们可以使用 nodemon 来通过监测文件变化自动重启 node


2016年3月25日
阅读全文

企业IE11迁移指南:了解和使用IE11企业模式

在IE11中,仅仅使用兼容性视图可能无法解决所有兼容性问题。2014年4月的IE11累积更新首次引入了企业模式。起初企业模式旨在模拟IE7、IE8浏览器行为以兼容更多的老旧站点,之后的更新中企业模式允许针对某个站点指定使用特定的文档模式(5~11)。所以为了使用到功能最全面的企业模式,请先将IE11更新至最新版本:KB4018271


2016年1月27日
阅读全文

如何通过Wireshark查看HTTPS、HTTP/2网络包(解码TLS、SSL)

最近正在做HTTP/2相关的研究,由于目前所有的浏览器仅支持在HTTPS上使用HTTP/2,所以通过Wireshark只能查看到加密后的TLS网络包。其实Wireshark提供了一些设置允许我们解码TLS、SSL网络包。


2015年12月15日
阅读全文

企业IE11迁移指南:详解兼容性视图模式和本地Intranet站点

兼容性视图是IE最常用的向下兼容方案,它可以通过兼容性视图设置、组策略、本地Intranet站点来实现。巧妙地利用这些配置可以控制不同的子域名有些在兼容性视图中显示,有些在默认模式中显示。


2015年11月19日
阅读全文

企业IE11迁移指南:详解浏览器模式、文档模式、User-Agent和X-UA-Compatible

浏览器模式决定了 Internet Explorer 发出请求时自带的 User-Agent,也决定了在默认情况下 Internet Explorer 使用哪一种文档模式来渲染页面。这篇文章就来梳理一下它们的关系。


2015年11月4日
阅读全文

如何解决IE11中遇到错误:“SEC7111: HTTPS 安全受到(null)的威胁”

最近在IE11中遇到网页不工作并报错: “SEC7111: HTTPS 安全受到(null)的威胁” 的问题。调试后发现这是由于在HTTPS页面调用 document.write() 方法所导致。


2015年10月21日
阅读全文

ES6新特性:使用 "let" 来定义JavaScript变量

ECMAScript 2015 (ES6) 提供了一种更加严谨的变量声明方法: let 用于取代之前的 varlet 声明的变量作用域为所处的块级内而不像 var 作用于整个函数体内。虽然 var 的使用是相当宽松的,但这种特性往往会带来许多意想不到的bug,尤其是在一个复杂的工程中。本文将比照 var 来介绍一下 let 的特性。


2015年8月8日
阅读全文

实战onscroll事件性能优化

在绑定onscroll事件时,我们应当着重关注其性能问题,因为onscroll与其他的鼠标、键盘等事件相比,它被触发的频次很高,间隔很近。如果onscroll事件中涉及到大量的位置计算、元素重绘等工作且这些工作无法在下一个onscroll事件触发前完成,就会造成浏览器掉帧。加之用户鼠标滚动往往是连续的,就会持续触发onscroll事件导致掉帧扩大、浏览器CPU使用率增加、用户体验受到影响。由于开发人员的机器配置普遍都不错,可能同一个onscroll的事件在开发机上只需要10ms,然而在普通配置的机器上需要30ms,因此这类问题常会被开发人员忽视。这篇文章将介绍如何避免onscroll事件潜在的性能问题。


2015年6月19日
阅读全文

IE XSS筛选器的误判

最近我在往博客文章中添加评论功能后,发现使用IE访问某一篇文章的页面总是弹出警告:“Internet Explorer 已对此页面进行了修改,以帮助阻止跨站点脚本”。通过Fiddler不断调试和测试,发现是因为这篇文章的标题以 JavaScript:开头,然后触发IE的XSS筛选器认为这是一个跨站点脚本攻击。其实文章标题中并不含有任何JavaScript脚本语句,只不过是以 JavaScript: 为开头,却最终导致XSS筛选器误判一个正常的页面。


2015年6月12日
阅读全文

网页性能优化:防止JavaScript、CSS阻塞浏览器渲染页面

网页中引用的外部文件: JavaScritp、CSS 等常常会阻塞浏览器渲染页面。假设在 <head> 中引用的某个 JavaScript 文件由于各种不给力需要2秒来加载,那么浏览器渲染页面的过程就会被阻塞2秒,直到该JS文件下载并执行完后才继续。前端性能调优时必须排除任何潜在的渲染阻塞点,让浏览器在最短时间内渲染出整体页面。


2015年6月5日
阅读全文

网页性能优化:设置永久缓存

当浏览器请求一个之前访问过的静态文件时,会在HTTP头中加上:If-Modified-SinceIf-None-Match以向服务器确认该文件是否有更新,如果没有更新,服务器则返回304 Not Modified,浏览器就会使用本地缓存而不是从服务器重新下载该文件。这是多数Web Server对于静态文件的默认缓存行为,然而这个缓存行为仍有优化空间。默认的缓存行为依然需要浏览器与服务器建立一个HTTP连接以确定每个文件是否更新过,从客户端建立连接、发送连接、服务器判断文件状态到最终客户端收到304 Not Modified之间仍需要几十甚至上百毫秒并且消耗一定的服务器资源。


2015年6月1日
阅读全文

详解JavaScript中attribute和property的区别以及最佳实践

使用JavaScript操作DOM元素时往往涉及到两个概念:attributepropertydocument.getElementById('test').getAttribute('id')$('#test').attr('id')document.getElementById('test').id$('#test').prop('id') 都能返回正确的id:"test"。这篇文章主要介绍一下 propertyattribute 的区别以及如何使用。


2015年5月23日
阅读全文

企业IE11迁移指南:创建IE11批量部署安装包

自2016年1月12日起,Windows 7上的旧版本IE浏览器(8~10)将停止支持。越来越多的企业和个人用户选择升级至最新的Internet Explorer 11,对于个人用户,升级IE11只需点几下鼠标。然而对于企业IT管理员,升级成百上千台计算机的IE并且确保成功,那可能就没那么容易了。


2015年4月15日
阅读全文