HTTP 协议深入解析

HTTP 是基于 TCP/IP 协议而建立 Web 基础协议,从 1989 年早期的简单 HTTP/0.9 单行协议开始,至 1996 年逐步扩展了状态码、协议头等特性发展到 HTTP/1.0,然后在 1997 年的 HTTP/1.1 增加了 TCP 连接复用、流水线支持、响应分块、缓存控制、内容协商等特性。2015 年 HTTP/2 协议正式标准化之后,传统 HTTP 的文本协议被二进制协议替代,让并行的请求在同 1 个 TCP 连接中处理,并移除了header中的重复数据,大幅提升通信效率。

在各类现代化 Web 服务器与开发框架群雄并起的年代,无论是 Python 的DjangoTornado,还是 Java 的Servlet或者是 Go 上的BeeGo,其本质上都是基于HTTP 协议的封装。因此了解 HTTP 相关协议规范能够提升 Web 开发的透明度,能够从协议角度理解 Web 报文的通信过程,而非仅仅从各类 Web 开发框架及其 API 封装的角度。

阅读更多

Web 前端开发遵循的一些规范与约定

开发团队当前正在全面切换到ES6 + Vue/React + Webpack这套技术栈,小伙伴们在开发过程中对编码规范以及 ES6 使用约定方面存在诸多困惑,所以参考了 Github 以及互联网企业 UED 的相关技术文档,结合团队之前积累的大量开发约定和范式,整理了这篇 code style 并且开源出来,计划在 Team 小伙伴们熟练掌握以后,逐步在项目中推广使用 ESLint 校验代码风格。

本文撰写过程中参考了爱彼迎的 《Airbnb JavaScript Style Guide》,以及网易 NEC 团队的《CSS 基础库命名约定》等开源规范,结合笔者之前撰写的 《HTML5 语义化标签概览》一文,总体上分为总体原则JavaScript/ES6CSS/SCSSHTML四个部分,分门别类的从命名约定、选择器使用、DOM 结构组织等纬度进行阐述,以帮助小组成员形成良好的编码习惯。

阅读更多

现代汽车机械电气结构与驾驶技术分享

1885 年,德国工程师卡尔·本茨制造了第一辆安装有两冲程单缸汽油机的三轮汽车;而在 1886 年,德国人哥特里布·戴姆勒又制造出了安装有四冲程汽油机的四轮汽车;1908 年,美国人亨利·福特设计出了著名的 T 型汽车,并于 1913 年在底特律建成了世界第一条汽车装配流水线,从而创造出了庞大的汽车产业。伴随工业化大批量生产时代的当来,美国欧洲日本的汽车产业相继崛起,涌现出了博世采埃浮德尔福博格华纳麦格纳爱信电装等著名主机厂。

时至今日,中国已经成为了全球最大的汽车产销单一市场,而伴随近几年新能源技术的快速普及,整车技术快速从机械化过渡电气化,全球汽车工业的产业重心开始逐步向中国转移。国内也相继涌现出了比亚迪宁德时代等极具竞争力的新能源供应商。在这个传统燃油车新能源技术交替换代的时间点,撰写本文主要用于记录一些现代汽车机械与电气结构方面知识,同时也会记录自己购车、用车以及保养方面的心得体会。

阅读更多

NodeJS 快速上手指南

NodeJS 开源项目于 2009 年由 Google Brain 团队的软件工程师 Ryan Dahl 发起创建,后被美国云计算企业 Joyent 招入麾下,2015 年后正式被 NodeJS 基金会 接管,三星公司于 2016 年完成了对 Joyent 的收购。经过将近 10 年的发展,NodeJS 已经成为现代化前端开发过程中不可或缺的基础架构,即可以作为页面渲染的分布式服务器,也可以作为前端自动化的宿主环境。

本文基于笔者在 2015 年所写的一篇读书笔记整理,彼时 node.js 的版本号还停留在v0.12.x,社区也还未完成与 io.js 的最终合并,文中出现的部分 API 时至今日已经被废弃或者迁移。但是这些 API 层面的变化都可以对照 《官方文档》找到相应说明以及替代 API,总体上并不会影响通过本文快速了解 NodeJS 的全套技术栈特性。

阅读更多

Linux C 标准程序设计语言

最早的 C 编程语言标准由美国国家标准协会(ANSI)在 1989 年首次发布(C89 版本),后于 1990 年由国际标准化组织(ISO)修订后发布(C90 版本)标准,而后经历了 C99、C11 等一系列主要版本的演进,截止目前最新的版本是 2018 年 10 月发布的 C18 版本。笔者当前使用的 Linux C 编译工具是 2018 年 1 月 25 日释出的GCC 7.3.0版本,提供了 C89/C90 、C99、C11 等一系列 ISO 标准特性的支持。

本文将分为《语法规范》《应用程序》两个姊妹篇,前者侧重于介绍 Linux C 各个数据类型的存储模型,并概括了函数、条件编译、动态内存管理、位运算、指针等嵌入式 C 程序设计的常用概念。后者将涉及 Linux 文件系统 IO、进程间通信、多线程、网络编程等应用程序开发方面的内容。

阅读更多

SCSS 3.5.5 简明上手指南

Sass 是成熟、稳定、强大的CSS 预处理器,截止到目前为止已经发展有 10 年,前当最新 release 版本为3.5.5。而SCSSSass3版本当中引入的新语法特性,完全兼容 CSS3 的同时继承了Sass强大的动态功能。本文翻译自《Sass Guide》《Sass Syntactically Awesome StyleSheets》两篇官方文档,讲解了现代化前端开发当中经常使用的 SCSS 语法特性,便于开发小组的同学快速上手。

基于 Gulp 完成前端自动化的年代,出于快速上手以及 npm 安装方便的考虑,开发团队一直沿用Lessgulp-less作为 CSS 预处理工具,但是 Sass 提供了更加丰富的动态语法特征,因此逐步淘汰基于 Gulp 的beaver前端项目脚手架以后,新项目全部基于 Webpack 的node-sasssass-loader作为预处理工具。Sass 和 Less 的详细比较可以参考sass-vs-lessSass 与 Less 比拼两篇文章,里面对两者的优劣做了非常详实的比较。

阅读更多

为什么认为 Backbone 是现代化前端框架的基石

伴随着 W3C 协议规范的不断更新,以及现代化浏览器技术的快速进步,Web 前端技术整体取得了日新月异发展,交互体验更加丰富与多样化,与此同时业务逻辑也在极速的膨胀。开发人员函需从大量 DOM 底层处理的劳动中解放出来,更加从容的面对纷繁复杂的各式交互需求。本文开头先简单的梳理一下历史,然后基于现代化前端框架的主要特性,逐一与 Backbone 进行比较和剖析。

从前端技术发展趋势的角度而言,目前层出不穷的现代化前端框架的诞生,都可以认为是 Angular 和 Backbone 等古典前端框架设计思想走向融合之后的产物。虽然截至到本文执笔的时间点,Backbone 已经略微old school,但之所以依然单独对 Backbone 着重笔墨,主要是在组件化作用域控制等方面,Backbone 更加接近于现代化前端框架的设计理念,而这两点又正好是同一时期的 Angular 并没有解决好的问题。

阅读更多

AngularJS 1.6.x 最佳实践总结

开发小组在 2015 年 11 月的时候,就已经开始尝试使用webpack+babel+react+reflux技术栈,但是团队对这种编译式前端开发的反馈并不友好,一方面 webpack 1.x 版本的打包效率仍然较差,每次保存操作后页面 reload 的速度缓慢如蜗牛,非常影响开发过程中的心情愉悦指数。另一方面,团队的同学们对于传统jQuery+backbone+handlebar+requirejs开发方式带有思维惯性,不太能接受 JSXES6 模块化的写法。

对于 React 的组件化思想,笔者本人非常推崇,但是遗憾 facebook 并未提供出解决组件间通讯的官方实现,其 Virtual DOM 与 Webpack.sourcemap 结合使用后,debug 变成一件非常困难的事情,并未在实际开发中体现其性能和效率上的优势。且因为社区驱动的 Reflux**、Redux** 的存在,实质上又为开发带来了额外的复杂度。更具有决定因素的是,截至在 2015 年底 React 依然停留在 0.14.x 版本,技术栈本身还处于不断成熟的过程,API 也一直在调整与变化。最终从技术成熟度的角度考量,还是稳妥的选择了 **Angular 1.6.x** 版本。

阅读更多

宏晶 STC89C52RC 微控制器实践小书

伴随 NB-IOT、LoRa、5G 等无线物联网通信技术的快速成熟,已经诞生近四十余年的 8051 系列微处理,在功耗、性能、开发难易程度方面,已然全面落后于 ARM Cortex-M3 等主流嵌入式微控制器方案。但是由于其技术架构较为经典,寄存器配置相对简洁,在一些低成本场景中依然有所沿用。笔者当前使用的开发板基于宏晶STC89C52RC嵌入式微控制器方案,虽然购置于六年以前,但是依然集成有各类常用的 UART、I²C、SPI 总线模块。

笔者日常开发工作当中,经常需要使用到此类嵌入式总线通信协议,因此参考了官方文档以及相关技术资料,逐步将本文涉及的各类模块驱动移植至当前开发板,便于用作与其它嵌入式设备联调测试之用。近几年,意法半导体的STM32F103C8T6量产价格不断下探,已经逐步接近宏晶的STC8051系列产品,可以预见后者将会逐渐面临市场淘汰,作为一款极为经典的 8 位微控制器,用作测试和实验目的依然是不错的选择。

阅读更多

Linux 常用命令行速查手册

Linux Mint 最早于 2006 年开始发行,是一款基于 DebianUbuntu 的 Linux 发行版,提供了更为友好稳定的桌面环境,在进行快捷键、开源字体等方面的设置,并安装了诸多的工具软件之后,笔者将其作为日常工作环境已有近 5 年的历史,伴随近几年开源团队不断的改进与升级,其兼容性与用户体验渐入佳境。从程序编写到 PCB 电路绘制,日常工作已经愈加依赖这款 Linux 操作系统。

基于 2019 年圣诞节发布的 Linux mint 19.3 发行版,采用的 Shell 命令解释器版本为 Bash Shell 5.0.3,文章总结了笔者日常所经常使用到的 Linux 命令,在简明扼要的介绍相关命令与参数之后,还展示了各条命令的实际执行结果,便于读者更加直观的了解其功能与用途。限于文章篇幅以及命令行的使用频率,有关 Bash Shell 脚本编程部分的内容,将会新开一篇文章再行介绍。

阅读更多

基于三星 S3C2440 的嵌入式 Linux 攻略

由于 Linux 操作系统内核具备可裁剪定制的特性,因而能够运行于 ARM 架构的嵌入式设备当中。伴随近几年,硬件性能的飞速提升以及价格的快速下降,Raspberry PiNano PiRock PiOrange Pi等可运行完整桌面 Linux 操作系统的卡片电脑大量涌现,通用计算机与嵌入式系统之间的界限愈来愈模糊。各个 IC 厂家不断提升 MCU 性能的同时,也推出了相应的公版外围电路、通用操作系统、驱动程序支持等一揽子完善的嵌入式技术解决方案,与笔者七年以前接触嵌入式技术伊始,早已经不可同日而语。

笔者手上这款 Mini2440 开发板于 2013 年购置,是由广州友善电子科技有限公司于 2010 年推出的 ARM9 开发板,虽然板载的三星 S3C2440 嵌入式微处理器已然廉颇老矣,且对应的Linux 2.6.32.2内核版本也早已壮士暮年。但由于最近涉及 Linux 嵌入式操作系统相关的工作,因此重新上电使用,同时以怀旧心态执笔撰写本文,用于记录一些心得体会,同时也作为日后备忘。

阅读更多

面向对象设计模式温故知新

设计模式(Design Pattern)代表了面向对象程序设计的最佳实践,是一套软件工程化背景下,用于提高代码可复用性的解决方案。设计模式这一术语起源于 1995 年《设计模式 - 可复用面向对象软件的基础》一书的出版,该书 4 位作者被称为四人帮 GoFGang of Four,全书一共收录了常用的 23 种模式,该书的出版是软件工程领域的一座里程碑,标志着 Java C++ 等面向对象的程序设计语言,迈向了更加具有标准范式的工程化方向。

面向对象的编程思想,通过封装继承多态降低代码的耦合度,而设计模式在此基础上强调了代码的可复用性。本文代码采用 C++ 语言进行描述,然后搭配 UML 示意图进行描述。

阅读更多

Vim 常用键位生存指南

Vim 是从 UNIX 下的 Vi 发展出来的一个文本编辑器,近几年,伴随 VSCodeAtomSublime 等一众轻量级编辑器的快速发展,涌现了大量基于这些编辑器平台的 Vim 快捷键插件,甚至 Chrome 和 Firefox 上都已经分别提供 VimiumVimFx 等优秀插件。虽然 Vim 本身因为其繁琐的配置,日常开发中已经较少直接使用,但是其快捷键操作习惯得以保留,因此 Vim 逐渐从一套自由软件发展为可以在诸多平台上使用的快捷键套装。

本文总结了笔者运用 Vim 作为日常开发工具的过程当中,经常使用到的一些快捷键和命令,并简单的按照操作进行了一个分类,帮助Vim Junior在纷繁的快捷键位里快速适应并生存下来,逐步成为一名熟练的Vim Addict。文章部分命令和键位的解释参考了《简明 VIM 练级攻略》一文,快捷键位示例图则取自《Graphical vi-vim Cheat Sheet and Tutorial》,除此之外还参考了《Vim 用户手册》

阅读更多

英文语法学以致用

近几年出于工作需要,阅读到了大量的英文技术文档,在翻译一些文章的过程当中,对于语法的重要性有了较为理性的认识。只有具备扎实的语法知识,才能够准确的理解复杂艰涩的各种长句结构,也才能正确领会句子所要表达的含义。翻阅了一些市面上一些大而全的语法教材,动辄上七八百页的厚度让人望而生畏。对于非英语专业工作人士,自然无需进行如此详尽与面面俱到的语法剖析,仅仅需要具备常见的构词造句知识即可。

笔者在翻阅了《Cambridge English Grammar in Use》等相关书籍以后,通过这篇读书笔记整理了常用的词类、时态、语态、句型、并列句、复合句等语法知识,便于在后续阅读到长难句时,能够及时的查阅到相关的信息,便于查缺补漏的同时,也为后续进一步学习《Cambridge Interchange》四册丛书做好铺垫,循序渐进提高英文听说读写译的实际运用能力。

阅读更多

宏晶 STC90C516RD+ 数据手册精读

8051 微处理器是指兼容Intel MCS-51体系架构的一系列单片机,全球有众多的半导体厂商都有基于这一体系架构的产品,例如:Atmel 的AT89C52、NXP 的P89V51、宏晶科技的STC89/90系列等。截至本篇文章成文之前,意法半导体推出的STM8系列单片机风头正劲,同为 8 位单片机产品,虽然 8051 在架构、功耗乃至价格上基本已无优势,但作为比较经典的嵌入式微处理器解决方案,依然具备着不错的学习价值。

本文介绍的STC90C516RD+属于5V单片机(工作电压为5.5V-3.3V),属于相对比较廉价和常见的国产单片机解决方案,片上拥有中央处理器CPU程序存储器Flash数据存储器RAM定时/计数器UART串口IO接口EEPROM看门狗等常用资源。

阅读更多

jQuery 那些容易被忽略的问题

伴随VueAngularReact等编译式前端框架的崛起,前端开发人员逐渐从繁琐的 DOM 操作当中解脱出来。但是在项目实践过程当中,依然存有诸多问题需要通过直接操作 DOM 来解决,虽然现代化浏览器已经支持selectAll()等 HTML5 新特性,但是针对一些强调页面兼容性的场景,为了屏蔽各款浏览器解析引擎所遵循规范的差异,依然需要借助于jQuery来完成 DOM 文档操作。

因此jQuery这款诞生于 2006 年的 JavaScript 库,依然在现代化前端开发当中扮演着较为重要角色。本文结合笔者 Web 前端开发工作当中积累的实践经验,较为系统的总结了jQuery实践过程当中一些比较容易被开发人员所忽略的问题。例如 jQuery 对象与 DOM 对象的相互转换、jQuery 选择器性能、异步对象$.Deferred()以及 JavaScript 性能优化相关的话题。

阅读更多

概览 HTML 5 语义化标签

本文翻译自 Mozilla 社区的《HTML Reference》,包含了 HTML5 新增的元素标签及属性,并对使用场景、语义化用法进行了简要说明,便于快速定位日常开发所需要的 HTML 标签,书写更加优雅的语义化 DOM 结构。本文所涉及的 HTML 元素全部通过 Can I use 进行了兼容性校对,在标注各个 HTML 元素兼容性状态的同时,提供了 W3CMozilla 推荐的标准 Demo 用例,便于快速开发格式良好的 Web 页面,体现更加语义化的文档结构。

HTML 超文本标记语言(Hypertext Markup Language)是构建 Web 页面的基石,用于结构化的组织页面元素与内容,可以嵌入图像、视频等多媒体,也可以用于创建交互式表单,并在一定程度上描述文档的外观和语义。HTML 语义化Semantic HTML)则是指合理的使用 HTML 元素编写 Web 页面内容,强调 Web 页面编码信息的含义凌驾于其表现样式之上,有利于 Web 浏览器执行规范化解析,改善网页文档的可访问性,方便搜索引擎爬虫索引。

阅读更多

CSS 3 典型概念与布局详解

层叠样式表CSS,Cascading Stylesheet)用于指定 Web 浏览器的渲染样式,CSS 2.1 规范于 2011 年发布之后日益变得丰富与庞大,因此 W3C 工作组将规范分散至不同模块,每个模块都独立的进行版本更新。其中,全部 CSS 2.1 特性模块都被升级至 3 作为版本号,而全新的功能模块则从版本号 1 开始进行定义。因而 CSS 3 并非实际意义上的 W3C 规范,准确的描述应该为 CSS 标准规范第 3 版与部分新规范第 1 版的集合

伴随 Web 浏览器技术的日新月异,现代 CSS 开发的重点,已经不在于处理浏览器碎片化引发的各类兼容性问题,而是在确保代码可维护性前提下,符合 Web 页面的语义标准,从而尽可能准确的表达各类交互创意。在阅读 W3C 工作组成员 Lea Verou 的《CSS Mastery》之后,开始重新审视前端重度交互下 CSS 提供的各类全新特性,结合 Mozilla 社区的 《CSS Reference》 一文,重新讨论 CSS 技术相关的一些主题。

阅读更多