This is so simple but so complicated at the same time. It's amazing what creative ways have to figure all of this out!
Wenchao WANG's Blog
Telematics, where the future starts from!
Monday, January 17, 2022
Wednesday, December 29, 2021
ML and CUDA
It's been long time that I haven't updated blogs in this space.
Recently, I finally understood what is the idea behind machine learning and what is CPU acceleration and why CUDA is so pop.
ML, in fact, ML is just to use calculus (matrices mainly) to make questions that lead too many solutions into some question that the final result can be "inferred/concluded" by probability problem + calculus. (e.g. how to identify a number in picture, this can analogized as how to make a complex matric that to check each single pixel value and formulize a formula so to say "modeling" to predict if new input can be predicted as well); (https://www.youtube.com/watch?v=_RPHiqF2bSs)
GPU acceleration, as ML in fact is just some very complex calculus operation, and for computer, calculus operation can be treated as quite a mount of arithmetical operations, of which, this is just fits into GPU scope. GPU is designed for very strong arithmetical operation but very weak on system controls. (https://www.youtube.com/watch?v=kUqkOAU84bA&t=879s)
Tensorflow or any ML framework, as data scientists or ML Engineers do not really care about how the "model" is trained by computer, therefore CUDA is not visible directly for ML engineer, the integration is done by Tensor flow (https://www.tensorflow.org/install/gpu). And for more detailed optimization, needs to be customized by different in-house system engineer for that.
Tuesday, January 10, 2017
微信小程序开发的技术原理
- JavaScript: 微信小程序的 JavaScript 运行环境即不是 Browser 也不是 Node.js。它运行在微信 App 的上下文中,不能操作 Browser context 下的 DOM,也不能通过 Node.js 相关接口访问操作系统 API。所以,严格意义来讲,微信小程序并不是 Html5,虽然开发过程和用到的技术栈和 Html5 是相通的。
- WXML: 作为微信小程序的展示层,并不是使用 Html,而是自己发明的基于 XML 语法的描述。
- WXSS: 用来修饰展示层的样式。官方的描述是 “ WXSS (WeiXin Style Sheets) 是一套样式语言,用于描述 WXML 的组件样式。WXSS 用来决定 WXML 的组件应该怎么显示。” “我们的 WXSS 具有 CSS 大部分特性...我们对 CSS 进行了扩充以及修改。”基于 CSS2 还是 CSS3?大部分是哪些部分?是否支持 CSS3 里的动画?不得而知。
微信小程序运行在三端:iOS、Android 和 用于调试的开发者工具
在 iOS 上,小程序的 javascript 代码是运行在 JavaScriptCore 中 在 Android 上,小程序的 javascript 代码是通过 X5 内核来解析 在 开发工具上, 小程序的 javascript 代码是运行在 nwjs(chrome内核) 中
NW.js (previously known as node-webkit) lets you call all Node.js modules directly from DOM and enables a new way of writing applications with all Web technologies.
- 应用程序入口不同:Electron 入口是一个 javascript 脚本,脚本里要自己负责创建浏览器窗口,加载 html 页面。而 nwjs 的入口就是一个 html 页面,框架自己会创建浏览器窗口来显示这个 html 页面。
- Node.js 集成方式不同:Electron 直接使用 Node.js 的共享库,不需要修改 Chromium 代码。而 nwjs 为了集成 Node.js ,需要修改 Chromium 代码,以便在浏览器里能通过 Node.js 访问系统原生 API。
- Multi-Context: nwjs 有多个上下文,一个是浏览器的上下文,用来访问 Browser 相关 API,比如操作 DOM ,另外一个是 Node 上下文,用来访问操作系统 API。Electron 没有使用多个上下文,对开发者更友好。
- 打包后的文件大小:Electron 打包后文件会比 nwjs 小不少。一个 18M 的程序,使用 Electron 打包后是 117M,而使用 nwjs 打包后的程序是 220M。微信小程序开发工具打包后是 219M (v0.10.102800)。没有亲测,评价来源参考文档。
- 代码保护:Electron 只支持代码混淆来保护,而 nwjs 把核心代码放在 V8 引擎里,不但可以保护代码,还可以提高执行效率。
- 开源社区活跃度:Electron 应该是完胜的。看看使用 Electron 构建的应用程序就知道了。而据说 nwjs 的开发文档有些都没有及时更新。
- 应用程序启动时间:Electron 会稍微快一点。没有亲测,评价来源参考文档。
- 微信 App 里包含 javascript 运行引擎。
- 微信 App 里包含了 WXML/WXSS 处理引擎,最终会把界面翻译成系统原生的控件,并展示出来。这样做的目的是为了提供和原生 App 性能相当的用户体验。
- 用户点击打开一个小程序
- 微信 App 从微信服务器下载这个小程序
- 分析 app.json 得到应用程序的配置信息(导航栏,窗口样式,包含的页面列表等)
- 加载并运行 app.js
- 加载并显示在 app.json 里配置的第一个页面
- 不支持从 node_modules 中加载模块。这样无形中就把 npm 排除在外了。从开发生态角度,这个应该是微信小程序下一步要重点解决的问题吧。
- 开发工具自带的代码编辑器还是太简陋了。不知道为什么微信要重复发明轮子。理论上,给流行的代码编辑器 (sublime/atom/vscode etc.) 开发个插件。然后用户直接到小程序后台上传提交审核就好了。程序员是挑剔到近乎偏执的物种,代码编辑器又是程序员时刻打交道的工具,要做好实属不易。
Monday, October 3, 2016
Linux 进程状态浅析
#includevoid main() {if (!vfork()) sleep(100);}
kouu@kouu-one:~/test$ ps -ax | grep a.out4371 pts/0 D+ 0:00 ./a.out4372 pts/0 S+ 0:00 ./a.out4374 pts/1 S+ 0:00 grep a.out
#includevoid main() {if (fork())while(1) sleep(100);}
kouu@kouu-one:~/test$ ps -ax | grep a.out10410 pts/0 S+ 0:00 ./a.out10411 pts/0 Z+ 0:00 [a.out]10413 pts/1 S+ 0:00 grep a.out
2、在一个死循环中等待其子进程的退出事件,并调用waitid系统调用来完成“收尸”工作;
2、执行系统调用主动进入TASK_INTERRUPTIBLE状态(如nanosleep系统调用)、或TASK_DEAD状态(如exit系统调用);或由于执行系统调用需要的资源得不到满足,而进入TASK_INTERRUPTIBLE状态或TASK_UNINTERRUPTIBLE状态(如select系统调用)。