<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[SpringDou的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/SpringDou</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; SpringDou]]></copyright><item><title><![CDATA[Docker image with NodeJS]]></title><link>https://blog.youkuaiyun.com/SpringDou/article/details/118101044</link><guid>https://blog.youkuaiyun.com/SpringDou/article/details/118101044</guid><author>SpringDou</author><pubDate>Tue, 22 Jun 2021 11:26:53 +0800</pubDate><description><![CDATA[根据项目需要，我需要创建一个NodeJS的docker image, 就是创建一个微服务放到公司统一的云服务里面，以便其他人可以调用服务的接口，简单总结一下创建Docker image的过程:

1.安装Docker Desktop on windows，具体可以参考。

  通过网站可以查询怎么去下载安装该软件，但是我们在安装的时候要注意自己的windows系统是什么系统，不同的系统版本安装的时候要注意，比如支持wsl2的系统，会希望默认用wsl的方式运行docker,这样performance...]]></description><category></category></item><item><title><![CDATA[WSL2 部署K3S]]></title><link>https://blog.youkuaiyun.com/SpringDou/article/details/117510046</link><guid>https://blog.youkuaiyun.com/SpringDou/article/details/117510046</guid><author>SpringDou</author><pubDate>Mon, 07 Jun 2021 15:49:01 +0800</pubDate><description><![CDATA[最近有个全新的云项目，没有什么经验，在开发的过程中使用K3S和WSL2来进行相应的开发和测试，从而能够在开发过程中发现其中的一些问题，不至于在上云后才发现的问题。
]]></description><category></category></item><item><title><![CDATA[使用pkg编译打包nodejs程序成执行文件]]></title><link>https://blog.youkuaiyun.com/SpringDou/article/details/112237761</link><guid>https://blog.youkuaiyun.com/SpringDou/article/details/112237761</guid><author>SpringDou</author><pubDate>Wed, 06 Jan 2021 12:40:11 +0800</pubDate><description><![CDATA[NodeJS学习使用过的童鞋们都知道，可以利用V8来解析运行javascript程序， 我们在写一个server(一般都是使用NodeJS建立http/https server)， 如果是云平台，都会直接把js代码上传上去，因为云平台的账户都是自己的，那么客户端的用户是看不见server的code的，那么我们一般的应用server呢？比如你需要把程序安装在客户那边的时候，你的javascript code需要保密吧？同时为了运行javascript代码，我们需要安装node, 而node程序有很多版本，怎么]]></description><category></category></item><item><title><![CDATA[使用ffi-napi和NodeJS Buffer创建NodeJs addon]]></title><link>https://blog.youkuaiyun.com/SpringDou/article/details/110390623</link><guid>https://blog.youkuaiyun.com/SpringDou/article/details/110390623</guid><author>SpringDou</author><pubDate>Fri, 04 Dec 2020 09:23:54 +0800</pubDate><description><![CDATA[创建NodeJS AddOn的方式很多，在NodeJS开发出c/c++ addon with NAPI之后，大家基本上都用NAPI写addon了，最基本的原因就是NAPI可以脱离v8修改的依赖，NAPI对v8中的api进行了封装，不同版本的Node会自动适用v8底层的API变化。

node-ffi-napi是一个开源的module,该模块内部通过nodejs napi加载我们自己写的dll中输出的函数(输出函数必须是extern 'c'的),由于该模块在内部使用了napi，所以我们在下载该模块的时候，会自]]></description><category></category></item><item><title><![CDATA[使用Self-Signed Certificate构建HTTPS服务]]></title><link>https://blog.youkuaiyun.com/SpringDou/article/details/108121580</link><guid>https://blog.youkuaiyun.com/SpringDou/article/details/108121580</guid><author>SpringDou</author><pubDate>Thu, 20 Aug 2020 16:17:13 +0800</pubDate><description><![CDATA[HTTPS我们知道是比HTTP安全的协议，传输过程中，客户端和服务端都对对方进行了安全确认，并且传输的数据进行了加密，保证数据的完整性，防止传输过程中，中间有人对数据进行修改。

HTTPS和HTTP都是应用层的协议，监听端口都是走tcp协议，只不过应用处理是走的HTTPS/HTTP。所以我们在监听之前要设置好处理数据用什么协议。

要做HTTPS的服务器，最基本的一条就是需要SSL证书，申请证书可能是比较麻烦的事情，也需要花钱，或者每次都自动申请免费的证书，但是在开发阶段的话，我们可以用openssl自己]]></description><category></category></item><item><title><![CDATA[TypeScript中的声明文件（.d.ts）]]></title><link>https://blog.youkuaiyun.com/SpringDou/article/details/108059875</link><guid>https://blog.youkuaiyun.com/SpringDou/article/details/108059875</guid><author>SpringDou</author><pubDate>Mon, 17 Aug 2020 17:51:30 +0800</pubDate><description><![CDATA[我们知道，Typescript是微软开发的语言，主要是为了自动帮助大家类型检查以及更好的使用面向对象，让使用面向对象开发的人员可以更好的理解Javascript，当然在实际开发过程中TypeScript还是会编译为Javascript,这样才会正常运行，编译的时候，会进行类型检查。

由于Javascrtipt解释型语言的特性，每个相同类型的对象可以有不同的属性，但是TypeScript在编译的过程中可以实现类型检查，开发过程中进行类型提示，提高开发人员的开发效率。

我们新的project一般都会用Typ]]></description><category></category></item><item><title><![CDATA[CEF 源码的编译]]></title><link>https://blog.youkuaiyun.com/SpringDou/article/details/107860568</link><guid>https://blog.youkuaiyun.com/SpringDou/article/details/107860568</guid><author>SpringDou</author><pubDate>Fri, 07 Aug 2020 14:30:10 +0800</pubDate><description><![CDATA[CEF是基于chrominum的开源framework，但是与chrominum不同的是，chrominum是针对于Chrome浏览器的开发的，CEF可以让其他的应用程序创建一个基于chrominum的浏览器。类似功能的还有Electron, chrominum现在已经成为流行的框架，里面的blink（webkit）作为render引擎来render页面，V8作为JavaScript引擎去解析JavaScript。

CEF是用C &amp;C++写的所以是跨平台的，从而产生的其他的很多project,..]]></description><category></category></item><item><title><![CDATA[NodeJS中使用N-API(NODE-API)去调用已经存在的dll.]]></title><link>https://blog.youkuaiyun.com/SpringDou/article/details/107605030</link><guid>https://blog.youkuaiyun.com/SpringDou/article/details/107605030</guid><author>SpringDou</author><pubDate>Mon, 27 Jul 2020 15:54:42 +0800</pubDate><description><![CDATA[在之前的一篇文章中，介绍了编写NodeJS AddOn的三种方式，N-API已经是AddOn的未来，N-API摆脱了Node各个大版本引用的chrominumV8不一致导致的API修改的问题。在之前的文章中介绍了N-API是Node team自己维护的，N-API内部会做V8中api匹配的问题。下面用一个例子来学习写一个N-API来调用已经存在的dll.

1.写一个dll

利用机器上安装的vs2017(各个版本都可以)，创建一个c++的动态链接库工程。

在工程里创建一个接口文件InterfaceH..]]></description><category></category></item><item><title><![CDATA[NodeJS 中使用native module - 不同方式介绍]]></title><link>https://blog.youkuaiyun.com/SpringDou/article/details/98955612</link><guid>https://blog.youkuaiyun.com/SpringDou/article/details/98955612</guid><author>SpringDou</author><pubDate>Mon, 27 Jul 2020 09:19:14 +0800</pubDate><description><![CDATA[写NodeJS程序的时候，往往不会全是JS的，不管是什么原因需要利用原来的DLL去实现一些特定的业务，那么NodeJS怎么去实现对DLL的调用呢？

NodeJS对模块的调用都是通过require("module")来实现的，那么我们就需要编写一个binary可以通过require("")加载的。要想编译成.node文件，那就必须说node-gyp tool了。

node-gyp 是基于 GY...]]></description><category></category></item><item><title><![CDATA[NodeJs 多线程(worker_threads)]]></title><link>https://blog.youkuaiyun.com/SpringDou/article/details/107337686</link><guid>https://blog.youkuaiyun.com/SpringDou/article/details/107337686</guid><author>SpringDou</author><pubDate>Wed, 15 Jul 2020 08:50:58 +0800</pubDate><description><![CDATA[Javascript的运行，我们知道是单线程的，目的是为了解决内存冲突等的问题，同时单线程的设计也方便问题的查找和解决，在浏览器端，单线程基本都可以满足，但是在NodeJS服务端的话，如果有大规模的计算或者耗时业务流程就会堵塞后面的请求，比如有一个客户端请求，需要从数据库里面取出数据，然后进行各种计算，一般计算过程都是用JS写的，如果这个计算过程很耗时（假如需要10s），就会导致后面的请求得不到响应，之前我们的做法就是N-API写一个C++的addon去开辟新线程去计算或者直接用模块child-proces]]></description><category></category></item><item><title><![CDATA[正确理解网络端口]]></title><link>https://blog.youkuaiyun.com/SpringDou/article/details/106663513</link><guid>https://blog.youkuaiyun.com/SpringDou/article/details/106663513</guid><author>SpringDou</author><pubDate>Wed, 10 Jun 2020 14:03:38 +0800</pubDate><description><![CDATA[随着网络速度越来越快，费用越来越低，很多产品已经面向网络编程，不管是web服务器, socket通信，网络数据库等等，在我们开发过程中，很少注意的一个问题，就是端口，一般如果作为开发人员的话，服务端都会注意选择一个端口，但是客户端一般都不会注意着个问题，最近查了一下端口的问题，来分享一下这个问题。

一网络结构图



这是一张7层的网络结构图，不管是5层或者7层，基本都差不多，只是解释不同。

在网络传输的过程中，都是端到端的数据传输，不管是UDP还是TCP，那么什么是端到端呢，可以这么认为，我们知道IP]]></description><category></category></item><item><title><![CDATA[Sqlite: 在C#程序中的应用]]></title><link>https://blog.youkuaiyun.com/SpringDou/article/details/104919415</link><guid>https://blog.youkuaiyun.com/SpringDou/article/details/104919415</guid><author>SpringDou</author><pubDate>Tue, 17 Mar 2020 14:00:13 +0800</pubDate><description><![CDATA[Sqlite简单介绍:

1. 是一种关系型数据库，它是open source,不是open contribute的，也就是说所有人都可以拿到source code，但是只有相关的人员可以上传code，下载到本地之后，可以修改code自己是使用，但是不能上传，有专门的人维护，就是质量有保证。

2. 另外一个特色是，区别于其他的关系型数据库，它是跟应用程序一起的，不需要独立运行的服务器，只是对当...]]></description><category></category></item><item><title><![CDATA[Electron 开发应用程序]]></title><link>https://blog.youkuaiyun.com/SpringDou/article/details/99286120</link><guid>https://blog.youkuaiyun.com/SpringDou/article/details/99286120</guid><author>SpringDou</author><pubDate>Mon, 30 Dec 2019 14:10:41 +0800</pubDate><description><![CDATA[Electron结合了Chromium和NodeJS，使得用JS开发应用程序成为可能，比如微软的Visual Studio Code就是用Electron开发的。Electron利用了Chromium的前端显示功能（解析和显示HTML以及 javascript code）同时利用NodeJS可以访问本地文件的功能来解决浏览器本身的一些限制。

我们在用Electron做一些开发的时候，前端基本没...]]></description><category></category></item><item><title><![CDATA[C++11: using 的使用]]></title><link>https://blog.youkuaiyun.com/SpringDou/article/details/95188252</link><guid>https://blog.youkuaiyun.com/SpringDou/article/details/95188252</guid><author>SpringDou</author><pubDate>Fri, 12 Jul 2019 10:15:50 +0800</pubDate><description><![CDATA[using关键字的三种用法

1.指定命名空间，比如，在C++编码学习之初常用的 using namespace std;

2.在子类中引用父类中的变量，这种用法比较特殊，


class T5Base {
public:
    T5Base() :value(55) {}
    virtual ~T5Base() {}
    void test1() { cout &lt;&lt;...]]></description><category></category></item><item><title><![CDATA[c++: #define中的#和##]]></title><link>https://blog.youkuaiyun.com/SpringDou/article/details/95194576</link><guid>https://blog.youkuaiyun.com/SpringDou/article/details/95194576</guid><author>SpringDou</author><pubDate>Fri, 12 Jul 2019 10:07:16 +0800</pubDate><description><![CDATA[#define指令将标识符定义为宏，即指示编译器将其后出现的所有标识符都替换为替换列表，而它也可以被进一步处理。若该标识符已被定义为任何类型的宏，则除非这些定义都相同，否则程序非良构，比如：


#ifndefINCLUDE_   //一般用于防止inlcude的时候重复定义声明类型
#define INCLUDE_
// 做一些声明之类的，

#endif

当然也会定义一些宏去代替一些...]]></description><category></category></item><item><title><![CDATA[c++11: 右值引用(right value reference)]]></title><link>https://blog.youkuaiyun.com/SpringDou/article/details/95471713</link><guid>https://blog.youkuaiyun.com/SpringDou/article/details/95471713</guid><author>SpringDou</author><pubDate>Thu, 11 Jul 2019 16:32:48 +0800</pubDate><description><![CDATA[在c++ 11之前，我们所说的引用只有左值引用，现在我们通常所说的引用也是左值引用，但是准确一点说，c++11之后，除了左值引用，还有右值引用。

在之前所谓左值就是表达式左边的值，所谓右值就是表达式右边的值，比如：


int a = 10;
//其中 a就是左值， 10就是右值
int b = a;
//其中 b是左值，a 是右值

在c++11之后，又有了明确的定义：

L-value（左值...]]></description><category></category></item><item><title><![CDATA[MUI: 程序本地化（Localization）的问题]]></title><link>https://blog.youkuaiyun.com/SpringDou/article/details/93196697</link><guid>https://blog.youkuaiyun.com/SpringDou/article/details/93196697</guid><author>SpringDou</author><pubDate>Wed, 26 Jun 2019 07:58:35 +0800</pubDate><description><![CDATA[程序本地化的方式是为了让程序可以在不同的操作操作系统上，显示的字符串语言自适应（德文系统上显示的字符串为德文，英文系统上显示的字符串为英文）。但是有一些特殊情况需要单独处理，比如你应用程序没有做本地化处理，而应用程序调用的DLL做的本地化，那怎么办呢？这种情况下，你应用程序本身界面上的字符串是没有本地化处理的（比如是中文），但是由于程序运行在英文系统上，DLL内的字符串显示或者返回的字符串（Lo...]]></description><category></category></item><item><title><![CDATA[windbg: .Net 程序员的dump 分析]]></title><link>https://blog.youkuaiyun.com/SpringDou/article/details/90265813</link><guid>https://blog.youkuaiyun.com/SpringDou/article/details/90265813</guid><author>SpringDou</author><pubDate>Thu, 16 May 2019 16:24:47 +0800</pubDate><description><![CDATA[Dump文件是进程的内存镜像。可以把程序的执行状态通过调试器保存到dump文件中。在 Windows 系统上， dump 文件分为内核 dump 和用户态 dump 两种。前者一般用来分析内核相关的问题，比如驱动程序；后者一般用来分析用户态程序的问题。

WinDBG不是专门用于调试.Net程序的工具，它更偏向于底层，可用于内核和驱动调试。进行普通的.Net程序调试还是使用微软专为.Net开发的调...]]></description><category></category></item><item><title><![CDATA[Javascript for-in for-of]]></title><link>https://blog.youkuaiyun.com/SpringDou/article/details/84985069</link><guid>https://blog.youkuaiyun.com/SpringDou/article/details/84985069</guid><author>SpringDou</author><pubDate>Fri, 12 Apr 2019 16:03:14 +0800</pubDate><description><![CDATA[for-of是ES6引进的新语法，for-in循环是遍历对象的属性，for-of循环是遍历实现iterator接口的成员


Object.prototype.objCustom = function () {}; 
Array.prototype.arrCustom = function () {};

let iterable = [3, 5, 7];
iterable.foo = "hell...]]></description><category></category></item><item><title><![CDATA[非用户管理员权限下对系统目录的读写-virtual store]]></title><link>https://blog.youkuaiyun.com/SpringDou/article/details/87800080</link><guid>https://blog.youkuaiyun.com/SpringDou/article/details/87800080</guid><author>SpringDou</author><pubDate>Wed, 20 Feb 2019 15:32:17 +0800</pubDate><description><![CDATA[win7 下，个人的配置文件会自动保存在C:/Users/***XX/AppData/Local/VirtualStore/Program Files/MyApp/***.ini里，而原先安装在C:/Program Files/MyApp/***.ini则没有改变，产生这样的转存原理如下：

 

这个当权限不够时，保证兼容性的做法。
比如往program files 或某些系统目录要写入东西，会...]]></description><category></category></item></channel></rss>