Bash Shell 脚本编程实践

Shell 既是一套命令行工具(交互式地解释和执行用户输入的命令)也是一种脚本设计语言(定义有变量与参数,并提供了控制、循环、分支结构)。Bash Shell 是由 GUN 官方项目提供的 Shell 解释器,名称源自于 Bourne Again SHell 的英文缩写,整合了传统 Korn Shell 以及 C Shell 的有效特性,并且尽量遵循IEEE POSIX P1003.2/ISO 9945.2规范,同时在编程与交互使用方面提供了大量的功能改进,因而在提供丰富功能的基础之上,展现出了良好的兼容特性,大多数.sh脚本可以无需移植修改即可交由 Bash Shell 来执行。

当用户登入任意一款 Linux 操作系统时,初始化程序init都将会为用户启动一个Bash Shell命令解析器,其即可以用于解析命令行输入并与内核进行交互,也可以作为高效的脚本编程语言,运用其提供的变量、参数、循环、分支等编程语法特性,完成一些批量的自动化的任务处理工作,本文将会围绕 Bash Shell 的脚本编程特性,加以进行详细的分析、说明与示例。

阅读更多

Qt 5 桌面应用程序开发指南 - QtWidgets 篇

Qt 5.14.2 是跨平台应用开发框架 Qt 的最新版本,除了采用基于 C++11 的经典 Qt Widgets 进行桌面应用程序开发以外,还支持通过 Qt Quick 快速开发适用于移动端设备的用户界面,因为 Qt 5 底层图形渲染引擎基于 GPU 硬件加速,所以其能够保持与原生 C++ 近乎等同的运行效率。笔者计划通过两篇文章分别对这 2 种技术进行介绍,但是无论如何,在传统跨平台桌面应用开发领域,Qt Widgets 依然是 Qt5 最为基础与核心的内容。

虽然 Qt 6 发布在即,但是官方声明将会依然保持 API 的兼容与稳定性,因此本文依然基于当前最新的 Qt5 稳定版本撰写。全文将会分别对 Qt Widgets 当中使用较为频繁的窗口部件布局管理应用主窗口事件系统对象模型风格与样式国际化等部分内容进行深入介绍,同时展示完善的示例代码以及程序运行效果,并结合《QtQuick 篇》一文讲解混合编程相关的技术。

阅读更多

Qt 5 桌面应用程序开发指南 - QtQuick 篇

由于 Material Style 这样富含动画效果的用户界面风格,并不能简单的加入到以静态图形作为主要显示单元的QWidget当中。所以 Qt 官方推出了一种声明式编程语言 QML(Qt 元对象语言,Qt Meta-Object Language),其提供了一种具有更高可读性的声明式语法,并附带了必要的 JavaScript 语句和动态属性绑定支持。QML 的语言特性和引擎框架由 Qt QML 模块提供,该模块同时提供了 QMLC++ 两套接口。

Qt Quick 是一款基于 QML 的应用程序标准库,包含有可视化类型、交互类型、动画、模型和视图、粒子特效等特性,这些都是由 Qt5 上的Qt Quick模块提供,通过import语句即可方便的进行导入。Qt Quick 同样提供了 QMLC++ 两套接口,可以轻松构建具有流畅动画效果的动态 QML 用户界面。而 Qt 5.7 版本以后推出的 Qt Quick Controls 更是提供了丰富的开箱即用控件,让快速开发成为了可能。

阅读更多

玩转 Raspberry Pi 4B 开源硬件

万众期待的 Raspberry Pi 4B 终于发布,之前由于产品原型的需要,一直计划采购 3B+,后来供应商透露新版 4B 稍晚就会面市,所以稍微等待了一段时间,今天终于拿到了一块 2G 内存的板子。一直以为 4B 只会简单的更新一下 SoC 并增大 DDR 容量,但是实际上还带来了 Type-CBluetooth 5.0Micro HDMIUSB 3.0 乃至 DDR4 等诸多崭新升级。而官方推荐的应用范围,开始从教育渗透至工业领域,逐步发展为一套完整的嵌入式生态链。

本文基于树莓派基金会官方提供的 《Raspberry Pi Documentation》,笔者翻译了其中较为常用的配置章节,便于读者拿到板子以后能够快速上手,并避免使用一些官方不推荐的操作和工具库。此外,本文也会涉及 OpenCVdlib 的编译,以及 Electron 在树莓派上的部署等话题。文章内容将会伴随笔者的日常使用而长期进行更新,欢迎各位爱好者朋友持续关注与勘误。

阅读更多

Android 物联网应用开发实例

Android 可以采用 Kotlin、Java、C++ 语言编写应用程序,Android SDK 会将这些代码连同相应的数据和资源文件编译为 Android 软件包,即一个带有.apk后缀的归档文件,也就是 Android 应用程序的安装文件。本质上 Android 系统是一种多用户的 Linux 系统,每个应用程序都运行在独立的 Linux 用户 ID进程之下,从而为每个 Android 应用都提供了独立的安全沙盒,体现了最小权限的设计原则。

鉴于 Google 官方提供了完善的文档,本文并不过多过深的涉及 Android SDK 开发的具体知识细节,仅会在简单介绍 Android 开发当中的一些基本概念之后,着重分析经典/低功耗蓝牙NFCWIFI指纹识别5G 等硬件外设的通信协议概念以及相应的实现步骤,并且展示一些比较典型的应用场景与示例代码,从而为读者在进行物联网相关项目的开发时,在移动设备应用控制端提供即有的现成经验。

阅读更多

STLink V2 调试编程器应用图解

STLink 是由意法半导体公司推出的在线调试编程器,采用5VUSB2.0全速接口进行供电与数据传输,可以方便的对内部固件进行升级,同时支持以 JTAGSWD 模式连接至 STM32 系列微控制器,或者以 SWIM 模式连接至 STM8 系列微控制器,操作温度介于0 ~ 50℃之间。由于 ST 公司极为重视中国市场,因此 STLink 的销售价格相对其它国外大厂的在线仿真设备要实惠许多,基本成为国内嵌入式工程师人手上必备的工具。

本文详细介绍 Keil uVision 5 开发环境下 ST-LINK/V2 版本的调试编程器使用方法,并介绍了相关接口的详细定义与接线方法,文中部分内容翻译至意法半导体官方提供的《用于 STM8 与 STM32 的 ST-LINK/V2 在线调试编程器用户手册》,以确保使用方法与解释的规范性。

阅读更多

从 GNU Make 到 CMake 快速入门

GNU Make用于控制如何从程序的源代码文件编译并链接为可执行文件,通过make命令从名称为makefile的文件中获取构建信息,该文件定义了一系列规则来指定源文件的编译先后顺序、是否需要重新编译、甚至于进行更为复杂的操作。通过makefile文件可以方便的实现工程的自动化编译,只需要执行make命令即可完成编译动作,从而极大的提高了开发人员的工作效率。

CMake 3.17是一款源代码构建管理工具,最初作为各种 Makefile 方言的生成器,后来逐步发展为现代化的构建系统,广泛用于 C 和 C++ 工程源代码的构建。官方提供的《CMake Tutorial》 为开发人员提供了一个循序渐进的指南,涵盖了 CMake 构建过程中常见问题的解决方案。如果需要构建从第三方发布的源代码包,则可以参考《User Interaction Guide》。而《Using Dependencies Guide》则主要针对需要使用第三方库的开发人员。

阅读更多

模拟与数字电子技术入门读物

自本世纪六十年代开始,数字半导体技术席卷了全球电子工业,伴随工艺与制程的持续演进,高频高速电子信号的处理需求愈加旺盛,电子技术的发展重心逐步由模拟时代,过渡至全面的数字化阶段。虽然模拟电路以及分立式电子元器件的使用频率逐年下降,但是在电磁兼容性处理、开关电源设计等场景当中,传统的模拟电子技术以及相关分立式元器件依然扮演着不可或缺的角色。

本文定位为一篇导论性质的文章,用于帮助当前开发团队里的嵌入式软件工程师,快速了解模拟数字电子技术相关的术语与概念,因此行文中并不涉及各类电路原理的深入数学分析,仅仅言简意赅的汇总了日常工作相关的模拟、数字电路知识。文章中的部分公式与原理图摘取自Wikipedia 维基百科,写作过程当中参考了《Understanding Basic Electronics》第 2 版一书。

阅读更多

嵌入式 Linux C 原生应用程序开发

嵌入式 Linux 是将日益流行的 Linux 操作系统进行裁剪与修改,使之能在嵌入式硬件上运行的一种操作系统,拥有许多开源的参考与移植,也出现了 RTLinux 等实时性更强的发行版本。嵌入式 Linux 应用开发过程当中,会大量运用到 C 语言去开发原生的 Linux 应用程序,从而获得较小的存储空间占用,以及更高的执行效率,并且能够兼顾较好的代码维护效率。

本文首先会介绍文件 IO进程与进程间通信多线程网络编程等 Linux 原生应用程序开发的内容,然后分门别类的对串口GPIOSPII2C 等常用的协议开发进行了介绍。阅读本文前需要具备 C 编程语言基础,并且理解 GNU 编译器、链接器、调试器的相关概念。

阅读更多

面向对象的 C++ 11 程序设计语言

2011 年,C++ 标准委员会发布了 ISO C++ 标准的一个重要修订版 C++ 11;该修订版是 C++ 语言演进过程当中的重要一步,也是当前获得编译器(GCCLLVMQt5Visual C++支持较多,兼容性最为优秀的一个版本。增添了类型说明符autodecltypeLambda 表达式智能指针 unique_ptr shared_ptr weak_ptr空指针 nullptr等诸多新特性,语言风格更加灵活统一的同时,极大提升了程序的编写效率。

本文基于《C++ Primer》一书最新的第 5 版撰写而成,该书作为 C++ 语言学习的经典读物,同样与时俱进增添了 C++ 11 的诸多新特性。因此,本文也选择了支持 C++ 11 标准的 Qt5 作为开发编译环境。由于 C++ 面向过程的语法与 C 语言类似,而笔者之前已经在《Linux C 标准程序设计》一文对相关内容进行了详尽的表述,因而本文将会着重笔墨水介绍 C++ 面向对象以及标准库方面的内容。

阅读更多

基于 Linux 的 GCC 与 GDB 应用程序调试

GNU 的正确发音为[g'noo],名称由英文句子GNU's Not Unix递归缩写组成,是一项由自由软件基金会推动的操作系统计划。GNU 计划最早开始于 1984 年 1 月,目标是完成一个由Hurd内核与一系列应用程序、系统库、开发工具组成的GNU 操作系统。但由于 Hurd 的开发工作迟迟未能完成,因而普遍选择采用 Linux Kernel 作为操作系统的内核,这一套技术组合正是闻名遐迩的 GNU/Linux 操作系统。

GCCGDB 组成的编译套件正是 GNU 计划下诞生的优秀开源项目,也是 GNU/Linux 技术体系不可或缺的构成要素。虽然当前 ClangLLVM 编译套件的发展风头正劲,但是由于嵌入式 Linux 设备通常只提供基于 GCC 的交叉编译工具链,加之两者在使用上差异不大,而 GDB 又同时提供了两者编译后程序的完整 Debug 支持,因而笔者依然选择 GCCGDB 组合来作为本文的撰写的目标。

阅读更多

言简意赅 の Python3

Python 诞生于 20 世纪 90 年代初,是一款非常简洁易读的解释型脚本语言;擅长于科学计算与图形处理,传统的计算机视觉库 OpenCV、三维可视化库 VTK、医学图像处理库 ITK都提供了 Python 调用接口,Python 也原生提供了 NumPySciPymatplotlib等强大的科学计算扩展库。Web 应用开发方面,Python 也提供有 DjangoTornado 等开发框架。概而言之,得益于强大的开源社区支持,Python 已经成为一门功能丰富的胶水语言。

本文示例代码基于Python 3.6.6版本编写,在简单介绍相关语法以及 pipvirtualenv 等扩展库的使用之后,将会实现一个基于官方 XML 解析库ElementTree的 SVG 图片合并小程序。文中涉及的代码已经提交至笔者的 Github,需要的朋友可以直接进行克隆,任何缪误或者建议请向我提交issue。如果需要采用 Python 进行 Web 开发,可以参见我的《使用 Django2 快速开发 Web 项目》一文。

阅读更多

Windows 工作环境 Config 札记

开发人员长期以来对于 Microsoft Windows 操作系统总抱以嗤之以鼻的态度,笔者亲身经历了Windows XPWindows 7Windows 10的版本演变过程,抛开众所周知的偏见,事实上是能够感觉到系统稳定性、用户体验方面的大幅改善的,叠加近年来 CmderNeovim 等辅助开发工具的出现与逐渐成熟,作为软件开发环境,其使用体验已经完全可以与 Linux 媲美,并在图形界面的稳定性以及交互的友好性方面胜于后者。

但是对于广大硬件电子工程师而言,Altium DesignerPadsAllegro 等商业 EDA 工具仅提供支持 Windows 操作系统的版本,而高频高速 PCB 电路设计基本离不开 Windows 操作系统环境,因而 Windows 和 Linux 在笔者日常工作里都各自拥有着其不可替代性。本文主要用于记录一些笔者使用 Windows 10 操作系统的配置和习惯,便于切换到新的工作环境时快速的展开,因而全文也将会持续保持更新。

阅读更多

Linux 工作环境 Config 札记

使用 Linux 作为日常开发工作环境近 5 年时间,尝试过DebianFedoraUbuntuMint等桌面发行版。虽然 Linux 作为服务器运行稳定可靠,但是在桌面 GUI 体验一直有待改进,显卡驱动兼容性与 CPU 占用率过高等问题一直悬而未决。而日常工作当中经常需要使用到的Altium DesignerKeil uVision等商业软件仅提供 Windows 10 版本,因此笔者时常需要在两款操作系统之间来回进行切换。

Linux Mint 提供了嵌入式开发当中必不可少的交叉编译环境,也能够直接安装 KiCADSTM32CubeIDEVSCodeSublime 等生产力工具;Windows 10 则提供了 Altium Designer、开发板串口驱动等大量无法跨平台使用的商业软件支持。本文主要用于备注两款操作系统当中一些常用的开发与工作环境配置,便于后续在全新工作环境中展开部署,以方便的移植个性化的使用习惯至新设备。

阅读更多

使用 Electron 打造跨平台桌面应用

早期桌面应用的开发主要借助原生 C/C++ API 进行,由于需要反复经历编译过程,且无法分离界面 UI 与业务代码,开发调试极为不便。后期出现的 QT 和 WPF 在一定程度上解决了界面代码分离和跨平台的问题,却依然无法避免较长时间的编译过程。近几年伴随互联网行业的迅猛发展,尤其是 NodeJS、Chromium 这类基于 W3C 标准开源应用的不断涌现,原生代码与 Web 浏览器开发逐步走向融合,Electron 正是在这种背景下诞生的。

Electron 是由 Github 开发,通过将ChromiumNodeJS整合为一个运行时环境,实现使用 HTML、CSS、JavaScript 构建跨平台的桌面应用程序的目的。Electron 源于 2013 年 Github 社区提供的开源编辑器 Atom,后于 2014 年在社区开源,并在 2016 年的 5 月和 8 月,通过了 Mac App StoreWindows Store 的上架许可,VSCode、Skype 等著名开源或商业应用程序,都是基于 Electron 打造。为了方便编写测试用例,笔者在 Github 搭建了一个简单的 Electron 种子项目Octopus,读者可以基于此来运行本文涉及的示例代码。

阅读更多

使用 Django2 快速开发 Web 服务

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项目当中,需要的朋友可以基于此来逐步步完善成为一个产品化的项目。

阅读更多

J-Link 仿真器固件恢复小记

JTAG(Joint Test Action Group,联合测试行动组)是一种用于芯片内部测试的国际标准协议,ARMDSPFPGA等主流 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.x 全新全译

全文翻译自React 16.6.0 英文文档,适当精简了生产环境不经常使用的内容,并对部分较为复杂的概念进行了更加翔实的解读,以及与 Vue2 进行了一些特性方面的比较。本文首先会介绍React 16带来的一系列变化与新特性,然后解读 React 官方文档Docs当中Quick StartAdvanced Guides的内容,最后基于项目上的使用实践,开源了一个较为完整的脚手架项目Rhino,适合已经具备组件式前端框架开发经验的同学快速上手。

2017 年 9 月 Facebook 释出React v16.0.x,宣布使用对商业使用更加友好的 MIT license 开源许可,并带来了全新的render()函数返回类型、更加健壮的错误处理机制、全新的FragmentPortal 特性,并完全重写了类库的核心架构,带来更为优异服务器端渲染性能的同时,有效缩小了类库代码本身的体积,更重要的意义在于杜绝了 Preact 等衍生框架对 React 社区所造成的分裂。

阅读更多