开发人员长期以来对于 Microsoft Windows
操作系统总抱以嗤之以鼻的态度,笔者亲身经历了Windows XP
、Windows 7
到Windows 10
的版本演变过程,抛开众所周知的偏见,事实上是能够感觉到系统稳定性、用户体验方面的大幅改善的,叠加近年来
Cmder、Neovim
等辅助开发工具的出现与逐渐成熟,作为软件开发环境,其使用体验已经完全可以与
Linux 媲美,并在图形界面的稳定性以及交互的友好性方面胜于后者。
但是对于广大硬件电子工程师而言,Altium Designer、Pads、Allegro 等商业 EDA 工具仅提供支持 Windows 操作系统的版本,而高频高速 PCB 电路设计基本离不开 Windows 操作系统环境,因而 Windows 和 Linux 在笔者日常工作里都各自拥有着其不可替代性。本文主要用于记录一些笔者使用 Windows 10 操作系统的配置和习惯,便于切换到新的工作环境时快速的展开,因而全文也将会持续保持更新。
使用 Linux 作为日常开发和工作环境近
5
年时间,尝试过Debian
、Fedora
、Ubuntu
、Mint
等桌面发行版。虽然
Linux 作为服务器运行稳定可靠,但是在桌面 GUI
体验一直有待改进,显卡驱动兼容性与 CPU
占用率过高等问题一直悬而未决。而日常工作当中经常需要使用到的Altium Designer
、Keil uVision
等商业软件仅提供
Windows 10 版本,因此笔者时常需要在两款操作系统之间来回进行切换。
Linux Mint 提供了嵌入式开发当中必不可少的交叉编译环境,也能够直接安装
KiCAD
、STM32CubeIDE
、VSCode
、Sublime
等生产力工具;Windows 10 则提供了
Altium Designer
、开发板串口驱动等大量无法跨平台使用的商业软件支持。本文主要用于备注两款操作系统当中一些常用的开发与工作环境配置,便于后续在全新工作环境中展开部署,以方便的移植个性化的使用习惯至新设备。
早期桌面应用的开发主要借助原生 C/C++ API 进行,由于需要反复经历编译过程,且无法分离界面 UI 与业务代码,开发调试极为不便。后期出现的 QT 和 WPF 在一定程度上解决了界面代码分离和跨平台的问题,却依然无法避免较长时间的编译过程。近几年伴随互联网行业的迅猛发展,尤其是 NodeJS、Chromium 这类基于 W3C 标准开源应用的不断涌现,原生代码与 Web 浏览器开发逐步走向融合,Electron 正是在这种背景下诞生的。
Electron 是由 Github 开发,通过将Chromium和NodeJS整合为一个运行时环境,实现使用 HTML、CSS、JavaScript 构建跨平台的桌面应用程序的目的。Electron 源于 2013 年 Github 社区提供的开源编辑器 Atom,后于 2014 年在社区开源,并在 2016 年的 5 月和 8 月,通过了 Mac App Store 和 Windows Store 的上架许可,VSCode、Skype 等著名开源或商业应用程序,都是基于 Electron 打造。为了方便编写测试用例,笔者在 Github 搭建了一个简单的 Electron 种子项目Octopus,读者可以基于此来运行本文涉及的示例代码。
Django是一款基于 Python 编写并且采用 MVC 设计模式的开源的 Web 应用框架,早期是作为劳伦斯出版集团新闻网站的 CMS 内容管理系统而开发,后于 2005 年 7 月 在 BSD 许可协议下开源,并于 2017 年 12 月 2 日 发布 2.0 正式版。虽然近几年 Go 语言在 Web 开发领域异军突起,但是在框架成熟度以及语言生态方面与 Python 还存有一定差距,针对于需要快速开发的原型类项目以及性能要求不高的 CMS 和 Admin 类型项目,已经发展了 12 年之久的 Django 依然是非常明智的选择。
本文基于《Django 官方
Tutorials》以及《Django REST framework
官方 Tutorials》编写,发稿时所使用的 Django
版本为2.1.4
,Python
版本为3.6.6
,文中涉及的代码都已经由笔者验证运行通过,最终形成了一个简单项目并推送至笔者Github上的jungle项目当中,需要的朋友可以基于此来逐步步完善成为一个产品化的项目。
JTAG(Joint Test Action
Group,联合测试行动组)是一种用于芯片内部测试的国际标准协议,ARM、DSP、FPGA等主流
IC 都对其提供了良好支持,标准 JTAG
接口拥有TMS
模式选择、TCK
时钟、TDI
数据输入、TDO
数据输出共
4 条信号线。笔者当前使用的 Mini2440 开发板原厂提供的 JTAG
调试器是采用并口的H-JTAG,由于现在的计算机设备早已经不提供并口支持,因此笔者选择了较为通用的J-Link作为
ARM9 仿真调试器。
J-Link是德国SEGGER公司推出的一款专用于 ARM 内核微控制器的 JTAG 仿真调试设备,能够与 ARM 官方提供的 Keil 集成开发环境无缝衔接,支持 Cortex-A/R、Cortex-M、ARM7、ARM9、ARM11、Renesas RX、Microchip PIC、Silicon Labs 8051、RISC-V 等系列的微控制器。笔者 7 年前购置了一台 J-Link V8 版本的J-Link调试器,当时由于使用不当造成固件丢失,因此特别撰写此文来记录一下固件恢复的过程。
全文翻译自React 16.6.0 英文文档,适当精简了生产环境不经常使用的内容,并对部分较为复杂的概念进行了更加翔实的解读,以及与 Vue2 进行了一些特性方面的比较。本文首先会介绍React 16带来的一系列变化与新特性,然后解读 React 官方文档Docs当中Quick Start和Advanced Guides的内容,最后基于项目上的使用实践,开源了一个较为完整的脚手架项目Rhino,适合已经具备组件式前端框架开发经验的同学快速上手。
2017 年 9 月 Facebook
释出React v16.0.x
,宣布使用对商业使用更加友好的 MIT license
开源许可,并带来了全新的render()
函数返回类型、更加健壮的错误处理机制、全新的Fragment
和Portal
特性,并完全重写了类库的核心架构,带来更为优异服务器端渲染性能的同时,有效缩小了类库代码本身的体积,更重要的意义在于杜绝了
Preact
等衍生框架对 React 社区所造成的分裂。
Vue
是一款高度封装的、开箱即用的、一栈式的前端框架,既可以结合
webpack 进行编译式前端开发,也适用基于 gulp、grunt
等自动化工具直接挂载至全局window
使用。本文成文于 Vue2.4.x
版本发布之初,笔者生产环境当前使用的最新版本为
2.6.12
。在经历多个前端重度交互项目的开发实践之后,笔者结合官方文档对
Vue 技术栈进行了全面的梳理、归纳和注解,因此本文可以作为 Vue2 官方《Get Started》
的补充性读物。
Vue 2
框架体系及技术栈日趋完善,相较于React+Reflux/Redux/MobX
技术栈,Vue
更加贴近 W3C 技术规范(例如实现仍处于 W3C
草案阶段的<template>
、<slot>
、is
等新特性,提供了良好易用的模板书写环境),并且开源生态更加完整且易于配置,将
React 手动编码才能处理的细节,整合成为最佳实践并抽象为语法糖(比如 Vuex
中提供的store
的模块化特性),使得开发人员得以将注意力聚焦于业务逻辑本身。
成都市南门 2016 年 8 月开启的的这一波房价上涨,确实出乎大家意料,打乱了不少同学的置业计划。写这篇文章是希望另辟蹊径,从成都市的产业结构、收入水平 2 个纬度入手,理性探讨当前成都房价背后值得 IT 从业者思索的问题。本次房价大幅度上涨,从年初看房的经验来看,先是从天府一、二、三、四、五街兴起,然后经由开发商和中介的放大与炒作,结合自贸、政务中心南移等利好消息,而逐渐蔓延至整个南延线,从而引爆恐慌情绪,造成刚需、改需提前一拥而上,最终引发当前踩踏式入市的局面。
首先,笔者认为,天府
一
、二
、三
、四
、五
街房价过去两年确实被低估,从周边的综合配套、区域定位的角度而言,合理上调属于正常市场反应。截止
2016 年 5
月底的时候,整个地块的新盘基本全部出清(存量较少),当时整体均价较为合理,总价
、月供
、利率
各方面都比较理想。其次,成都市南门
CBD 周边的企业以 IT 行业为主,而成都 IT
企业大部分属于外向型,即本地大型企业不多,主要吸引国外、省外企业来蓉设立分支机构或研发中心,这一点大部分知友应当有所了解。产业先寥寥几句讲到这里,暂且按书不谈,接下来从企业的角度继续走起。
Flux是由
Facebook 在 2014 年 7 月提出的一种 React
应用体系架构,主要用于解决多层级组件之间数据传递以及状态管理的问题。并由此派生出了Reflux、Redux、MobX等一系列单向数据流框架。为 Web
前端页面实现组件化拆分之后,组件间的通信与协同机制提供了一套较为完善的方法学。其核心理念在于将所有应用状态放置在Store
内进行统一管理,视图层组件只能通过触发Action
修改Store
中的应用状态。
本文首先系统的概括 Facebook
官方的Flux以及单向数据流思想,然后遵循近几年Flux
衍生框架的发展历程,逐步进行概括性的分析与比较,并顺带介绍了
Vue 技术栈当中的类 Flux 框架 VueX,最后,由于通常将Action
视为
Flux 工作流的核心与起点,本文还对《Flux
Standard Action》自述文档进行了翻译,以期更为全面的展现 Flux
生态的演进过程。
Webpack 是现代
Web
应用程序的静态模块打包工具,它会递归的构建应用程序各个模块的依赖关系图,然后将所有模块打包成一个或多个bundle
。目前
Webpack 已经更新至 4.29.6
版本,增加了诸多打包和执行性能相关的支持,是目前应用最广泛、社区最活跃的
Web 前端代码打包方案。而更新版本的 Webpack 5 已经进入 Beta
发布阶段,未来将会带来更多构建性能的提升,本文依然以更为稳定的 Webpack 4
为讲解对象。
Webpack
提出了入口entry
、输出output
、加载器loader
、插件plugin
这四个核心概念,本文将会在简单介绍
Webpack
相关基础概念之后,对其原生实现的import
模块导入机制进行分析,以清晰的展现
Wepback
在底层所进行的工作;最后逐步备注笔者在开发、生产环境下使用到的各类插件和加载器,并分享在aves和rhino两个开源脚手架项目当中(分别基于
Vue2 和 React16)所使用到的最佳配置实践。
数据结构自 1968 年以来被设置为一门独立课程,是关于结构化编程(以模块功能和处理过程为主的编程范式)的一门方法学,主要研究的是数据的逻辑结构与物理结构以及它们之间的相互关系,并定义与这些结构相适应的算法。这里的算法描述的是一种确定并且有效的,适合用于计算机程序来实现和解决问题的方法。某种意义上,数据结构和算法是计算机科学与技术领域研究和应用的核心。
编写程应用序解决问题,首先需要从实际问题域当中抽象出一个模型,然后设计出求解该模型的算法。模型抽象的过程,实质是分析问题并从中找出操作对象,然后寻找出这些操作对象之间的关系,最终用程序语言加以描述的过程。本文采用
Linux C
语言进行描述,主要讲解了线性表
、栈
与队列
、串
、图
共
5 种主要的数据结构,以及查找
和排序
这 2
种常用算法。
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 的Django、Tornado,还是 Java 的Servlet或者是 Go 上的BeeGo,其本质上都是基于HTTP 协议的封装。因此了解 HTTP 相关协议规范能够提升 Web 开发的透明度,能够从协议角度理解 Web 报文的通信过程,而非仅仅从各类 Web 开发框架及其 API 封装的角度。
开发团队当前正在全面切换到ES6 + Vue/React + Webpack
这套技术栈,小伙伴们在开发过程中对编码规范以及
ES6 使用约定方面存在诸多困惑,所以参考了 Github 以及互联网企业 UED
的相关技术文档,结合团队之前积累的大量开发约定和范式,整理了这篇
code style 并且开源出来,计划在 Team
小伙伴们熟练掌握以后,逐步在项目中推广使用 ESLint 校验代码风格。
本文撰写过程中参考了爱彼迎的 《Airbnb JavaScript Style
Guide》,以及网易 NEC 团队的《CSS
基础库命名约定》等开源规范,结合笔者之前撰写的 《HTML5
语义化标签概览》一文,总体上分为总体原则
、JavaScript/ES6
、CSS/SCSS
、HTML
四个部分,分门别类的从命名约定、选择器使用、DOM
结构组织等纬度进行阐述,以帮助小组成员形成良好的编码习惯。
1885
年,德国工程师卡尔·本茨
制造了第一辆安装有两冲程单缸汽油机的三轮汽车;而在
1886
年,德国人哥特里布·戴姆勒
又制造出了安装有四冲程汽油机的四轮汽车;1908
年,美国人亨利·福特
设计出了著名的 T 型汽车,并于 1913
年在底特律建成了世界第一条汽车装配流水线,从而创造出了庞大的汽车产业。伴随工业化大批量生产时代的当来,美国
、欧洲
、日本
的汽车产业相继崛起,涌现出了博世、采埃浮、德尔福、博格华纳、麦格纳、爱信、电装等著名主机厂。
时至今日,中国已经成为了全球最大的汽车产销单一市场,而伴随近几年新能源技术的快速普及,整车技术快速从机械化过渡电气化,全球汽车工业的产业重心开始逐步向中国转移。国内也相继涌现出了比亚迪、宁德时代等极具竞争力的新能源供应商。在这个传统燃油车与新能源技术交替换代的时间点,撰写本文主要用于记录一些现代汽车机械与电气结构方面知识,同时也会记录自己购车、用车以及保养方面的心得体会。
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 的全套技术栈特性。
最早的 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、进程间通信、多线程、网络编程等应用程序开发方面的内容。
Sass
是成熟、稳定、强大的CSS
预处理器,截止到目前为止已经发展有 10 年,前当最新 release
版本为3.5.5
。而SCSS是Sass3版本当中引入的新语法特性,完全兼容
CSS3 的同时继承了Sass强大的动态功能。本文翻译自《Sass Guide》和《Sass
Syntactically Awesome
StyleSheets》两篇官方文档,讲解了现代化前端开发当中经常使用的 SCSS
语法特性,便于开发小组的同学快速上手。
基于 Gulp 完成前端自动化的年代,出于快速上手以及 npm 安装方便的考虑,开发团队一直沿用Less和gulp-less作为 CSS 预处理工具,但是 Sass 提供了更加丰富的动态语法特征,因此逐步淘汰基于 Gulp 的beaver前端项目脚手架以后,新项目全部基于 Webpack 的node-sass和sass-loader作为预处理工具。Sass 和 Less 的详细比较可以参考sass-vs-less和Sass 与 Less 比拼两篇文章,里面对两者的优劣做了非常详实的比较。
伴随着 W3C 协议规范的不断更新,以及现代化浏览器技术的快速进步,Web 前端技术整体取得了日新月异发展,交互体验更加丰富与多样化,与此同时业务逻辑也在极速的膨胀。开发人员函需从大量 DOM 底层处理的劳动中解放出来,更加从容的面对纷繁复杂的各式交互需求。本文开头先简单的梳理一下历史,然后基于现代化前端框架的主要特性,逐一与 Backbone 进行比较和剖析。
从前端技术发展趋势的角度而言,目前层出不穷的现代化前端框架的诞生,都可以认为是 Angular 和 Backbone 等古典前端框架设计思想走向融合之后的产物。虽然截至到本文执笔的时间点,Backbone 已经略微old school,但之所以依然单独对 Backbone 着重笔墨,主要是在组件化和作用域控制等方面,Backbone 更加接近于现代化前端框架的设计理念,而这两点又正好是同一时期的 Angular 并没有解决好的问题。