使用Visual Studio搭建Node C++ Addon 开发和调试环境

本文逐步讲述了如何配置Visual Studio 2017来使得能够在VS中对源生的NodeJS C++ Addon进行调试。

在开始之前,首先保证你的电脑中安装了:

1.Visual Studio 2017 (安装组件“使用C++的桌面开发”)
2.Git
3.python 2.x (用于编译node)

如果没有以上软件,请先去相关网站下载并安装。

下面开始我们的配置。

第一步 获取并编译Debug版本的Node

1.使用Git从Github获取Node源码 (此处使用cmd示例,命令为git clone https://github.com/nodejs/node)

2.切换分支到稳定版本分支(目前为v9.x) git checkout v9.x
3.使用cmd在node工作文件夹下进行build
命令为vcbuild.bat Debug x64 (32位系统请改为x86)

4.耐心等待编译完成(大概耗时约10分钟,这段时间里面可以继续第二步)

第二步 配置Visual Studio编译Node C++ Addon

1.首先创建一个空项目

2. 添加代码(此处我们用https://nodejs.org/api/addons.html上的官方hello作为示例)

添加完代码我们可以发现会有很多红色波浪的错误提示,这是因为我们还没有将所需要的头文件添加到include Path当中,接下来我们就要对其进行配置。
3.首先我们注意一下窗口上部的配置选择,默认是x86,由于我们待会使用的是64位node,所以首先要把它改成x64,将它作为活动的配置

4.然后我们选中当前的solution,然后按上边那个扳手按钮开启配置

5.在弹出的配置管理器中,首先在常规一栏,我们更改目标文件名为.node(因为这是node c++ addon的默认扩展名), 配置类型为dll动态链接库

6.接下来在左边列表中选择VC++ 目录,选择包含目录,点击右边的下拉箭头中的<编辑。
我们需要把编译node c++ addon所需的头文件文件夹加入这个目录列表中。一般来说,node c++ addon所需的目录为:

$(NODE_SRC)为第一步中下载的node源代码文件夹,

……

使用libuv开发C++ Addon实现Nodejs子进程同步通信

Electron

使用过Electron的同志们都知道,Electron中的渲染进程(renderer process) 和主进程间,可以使用ipc模块同时使用两种方法进行通信:

  1. 异步通信,渲染进程不阻塞,使用监听进行返回:
  2. 同步通信,渲染进程阻塞,从主进程得到返回值后将返回值直接作为该通信调用的返回值

而nodejs的源生childProcess模块fork出的非阻塞性子进程只

……

Next Chapter – Where?

深夜撸猫撸出贤者模式,瞎逼写写

在美帝短期校内打工的离职的时候,当时的老板问我

“How does it feel? Is it like an important chapter of your life has ended?”

“感觉怎么样,是不是感觉人生的一大篇章结束了?”

我已经忘记了英语拙劣的我是如何去回答的了,也许只是尴尬的笑笑来掩饰心中那种奇怪的感觉。

只记得回念想到以后不会再有机会进去那间办公室,确实有种说不出的怅然若失。

一个篇章的结束,意味着我需要去改变生活的方式,用新的工作,人际交往,兴趣爱好来重新填满生活的缝隙。

我害怕这种改变。

……

解决受Shrio保护的资源无法跨域请求(CORS)的问题

今天在调试前端程序时,发现对于兽Shrio保护的资源,跨域请求无法被完成。

目前使用的API的认证方式是使用自定义的Header来完成,而浏览器在请求跨域的XMLHttpRequest时,会先发送一个pre-flight请求,method类型为OPTIONS。而这个请求并不会加上自定的Header,从而导致请求失败。我这里是返回了302,跳转到登录页面。

为了解决这个问题,我们选择了重载 AuthenticatingFilter 中的 isAccessAllowed 方法,让它对任何OPTIONS的请求返回true。

……

JS for 循环的“优化”

今天在阅读angularjs 1.x源码的时候,发现作者写js的for循环时,往往采用的是定义两个变量的写法:

而我们在平常写到循环时,往往是使用的更为直观的方法

从逻辑和语法上来说,这两种方法完全等同。甚至angular作者的写法更有一种脱裤子放屁的多余感。

但是为什么实际上第一种方法才是更被推崇的呢?

原因是Array.length函数

……

AngularJS 1.0 源码学习笔记(二)- 依赖注入和module加载

最近创业的公司要上线新的产品功能,一直没能有机会静下来好好再继续Angularjs的源码阅读计划

这两天终于是找了点机会拜读完了Angularjs中最根基的几个部分之一 – 也就是Angularjs的依赖注入功能。

依赖注入(Dependency Injection)是一种常用的控制反转的设计原则。基本思想就是当我的代码需要某一个功能对象时,一个全局的调控对象会把相应的对象调用给我。

而我不需要去关心这个东西是什么时候创建的,生命周期又是如何被控制的,这都不关我的事情。打个比方,当我想看电视时,我只要优雅的葛优瘫在沙发上,说着,给我把遥控器拿来,那么就会有这么一个勤勤恳恳的人替我装好电池,调好频段,然后把遥控器交到我的手里。

而这个任劳任怨的家伙在Angular里面就是一个叫做$inject的Service.

不过在讲$inject之前,我们首先需要了解一下Angularjs的大家都很熟悉的angular.module系列函数.

angular.module的运作过程

angular.module就像它本身的名字一样,它是用来管理angular中的各个模块的函数。它具备了两个功能

……

AngularJS 1.0 源码学习笔记(一)- src目录结构

前言:

偶然发现在全职做程序员的这一年里,虽然接触的第三方代码很多,也hack过很多已有的库,但是却还没有好好完整的读过一份现在流行框架的源码,甚至对于使用得很熟练的angularJs,对于它的实现方式都没有做到完全透彻的理解,感觉真是相当惭愧。

为此,我在最近开始了两项纯粹的学习计划:
1. 阅读Angular1.0的源代码并且完整理解它的设计模式和理念
2. 学习Angular2.0的使用方法

由于这份笔记是边学边写,可能我会在初次发布时对于全局的代码有理解偏差或者错误的地方。如果存在这样的情况,我会尽量在之后回来进行勘误和修改。

为了能够学习AngularJS,首先当然应该就是获得它的代码,最直接的就是直接使用它的完整comment版本(目前稳定版本为1.5.7 -by 2016-07-20):https://ajax.googleapis.com/ajax/libs/angularjs/1.5.7/angular.js

对于中文语言的学习者,其实还有各种大牛们对于comment的中文翻译版本(大家可以自行google)

但是我选择学习angularjs github repository中的src部分,

……

OC Code Snippet #1 将视频转换成GIF图片

准备工作:

  1. UIImage+animatedGIF (用来展现GIF的UIImage Category)
  2. 要转换的视频源

基本思路

把视频转换成GIF图片的基本思路就是在视频中不同的时间点生成缩略图,然后将其拼接在一起

用到的选择器:

这个声明在AVAssetImageGenerator中的选择器,可以用来在请求的时间点生成视频的缩略图

完整代码:

UIImage+GIFFromMovie.h:

……