OWenT's blog
  • Introduction
  • About Me
  • 2020
    • 近期对libatapp的一些优化调整(增加服务发现和连接管理,支持yaml等)
    • xresloader转表工具链增加了一些新功能(map,oneof支持,输出矩阵,基于模板引擎的加载代码生成等)
    • 在游戏服务器中使用分布式事务
    • libcopp接入C++20 Coroutine和一些过渡期的设计
    • libatbus 的大幅优化
    • nftables初体验
    • 容器配置开发环境小计
  • 2019
    • PALM Tree - 适合多核并发架构的B+树 - 论文阅读小记
    • 跨平台协程库 - libcopp 简介
    • C++20 Coroutine 性能测试 (附带和libcopp/libco/libgo/goroutine/linux ucontext对比)
    • 尝鲜Github Action
    • 一些xresloader(转表工具)的改进
    • protobuf、flatbuffer、msgpack 针对小数据包的简单对比
    • 协程框架(libcopp) 小幅优化
    • Excel转表工具(xresloader) 增加protobuf插件功能和集成 UnrealEngine 支持
    • Anna(支持任意扩展和超高性能的KV数据库系统)阅读笔记
    • C++20 Coroutine
    • libcopp merge boost.context 1.69.0
    • Google去中心化分布式系统论文三件套(Percolator、Spanner、F1)读后感
    • Rust玩具-企业微信机器人通用服务
  • 2018
    • 使用ELK辅助监控开发测试环境服务质量和问题定位
    • Webpack+vue+boostrap+ejs构建Web版GM工具
    • 2018年的新通用伪随机数算法(xoshiro / xoroshiro)的C++(head only)实现
    • Rust的第二次接触-写个小服务器程序
    • 理解和适配AEAD加密套件
    • atsf4g-co的进化:协程框架v2、对象路由系统和一些其他细节优化
    • 协程框架(libcopp)v2优化、自适应栈池和同类库的Benchmark对比
    • 可执行文件压缩
    • 初识Rust
    • 使用restructedtext编写xresloader文档
    • atframework的etcd模块化重构
    • C++的backtrace
  • 2017
    • ECDH椭圆双曲线(比DH快10倍的密钥交换)算法简介和封装
    • protobuf-net的动态Message实现
    • pbc的proto3接入
    • atgateway内置协议流程优化-加密、算法协商和ECDH
    • 整理一波软件源镜像同步工具+DevOps工具
    • Blog切换到Hugo
    • libcopp v2的第一波优化完成
    • libcopp(v2) vs goroutine性能测试
    • libcopp的线程安全、栈池和merge boost.context 1.64.0
    • GCC 7和LLVM+Clang+libc++abi 4.0的构建脚本
    • libatbus的几个藏得很深的bug
    • 用cmake交叉编译到iOS和Android
    • 开源项目得一些小维护
    • atapp的c binding和c#适配
    • 对象路由系统设计
    • 2016年总结
    • 近期的一个协程流程BUG
  • 2016
    • 重写了llvm+clang+libc++和libc++abi的构建脚本
    • atsf4g完整游戏工程示例
    • atframework基本框架已经完成
    • 游戏服务器的不停服更新
    • 对atbus的小数据包的优化
    • Android和IOS的TLS问题
    • pbc的一个陈年老BUG
    • boost.context-1.61版本的设计模型变化
    • 接入letsencrypt+全面启用HTTP/2
    • 理解Raft算法
    • libatbus基本功能及单元测试终于写完啦
    • 博客文章和文档迁移到gitbook
  • 2015
    • 博客文章和文档迁移到gitbook
    • 给客户端写得LRU缓存
    • 近期活动比较零散
    • 关于BUS通信系统的一些思考(三)
    • 针对Java JIT的优化(转表工具:xresloader)
    • libcopp更新 (merge boost 1.59 context)
    • 小记最近踩得两个C++坑
    • Redis全异步(HA)Driver设计稿
    • Vim常用命令
    • 关于firewalld和systemd的一些命令速记
    • Jenkins(hudson)插件记录
    • 我们的Lua类绑定机制
    • LLVM+Clang+Libcxx+Libcxxabi(3.6)工具链编译(完成自举编译)
    • 回顾2014
    • Android NDK undefined reference to ___tls_get_addr 错误
    • gitlab腾讯企业邮箱配置
  • 2014
    • 回顾2013
    • C++11动态模板参数和type_traits
    • C++又一坑:动态链接库中的全局变量
    • tolua++内存释放坑
    • [转]类似github的框架
    • Lua性能分析
    • 集成Qt Webkit 到cocos2d-x
    • Gitlab环境搭建小计
    • 近期研究VPN的一些记录(OpenVPN,pptp,l2tp)
    • LLVM + Clang + Libcxx + Libcxxabi 工具链编译
    • 关于BUS通信系统的一些思考(二)
    • 关于BUS通信系统的一些思考(一)
    • [libiniloader] Project
    • 记录一些在线编辑器
    • [WP Code Highlight.js] Project
    • 再议 C++ 11 Lambda表达式
    • 基于Chrome插件的开发工具链
    • [ACM] HDU 1006 解题报告
    • Linux 编译安装 GCC 4.9
    • 又碰到了这个解谜游戏,顺带记下地址
    • 简单C++单元测试框架(支持一键切到GTest或Boost.Test)
    • 捣鼓一个协程库
  • 2013
    • std和boost的function与bind实现剖析
    • 不知道是哪一年的腾讯马拉松题目 照片评级 解题报告
    • Lua 挺好用的样子
    • VC和GCC成员函数指针实现的研究(三)
    • VC和GCC成员函数指针实现的研究(二)
    • VC和GCC内成员函数指针实现的研究(一)
    • 一个C++关于成员变量偏移地址的小Trick
    • ptmalloc,tcmalloc和jemalloc内存分配策略研究
    • POJ 2192 Zipper HDU 2059 龟兔赛跑
    • 从Javascript到Typescript到Node.js
    • 网络编程小结
    • 试试Boost.Asio
    • Lnmp yum 安装脚本 (for CentOS)
    • ARM 交叉编译环境搭建
    • Linux 编译安装 GCC 4.8
    • [记录]虚拟硬盘的压缩|磁盘写零
  • 2012
    • Boost.Spirit 初体验
    • “C++的90个坑”-阅读笔记
    • AC自动机
    • C++ 标准过渡期
    • 程序员修炼之道 -- 阅读笔记
    • [转载]狼与哈士奇
    • C++ 新特性学习(八) — 原子操作和多线程库[多工内存模型]
    • C++ 新特性学习(七) — 右值引用
    • 理解Protobuf的数据编码规则
    • 忆往昔ECUST的ACM时代
    • Linux编译安装GCC 4.7
    • JSON显示库 -- showJson (Javascript)
    • C++ 新特性学习(六) — 新的字符串编码和伪随机数
    • C++ 新特性学习(五) — 引用包装、元编程的类型属性和计算函数对象返回类型
    • C++ 新特性学习(四) — Bind和Function
  • 2011
    • C++ 新特性学习(三) — Regex库
    • C++ 新特性学习(二) -- Array、Tuple和Hash库
    • C++ 新特性学习(一) -- 概述+智能指针(smart_ptr)
    • Linux 和 Windows PowerShell 常用工具/命令 记录
    • 非常帅气的Linq to sql
    • 2011 Google Code Jam 小记
    • C++总是很神奇
    • 大学生创新项目[国家级]经费使用记录
    • 常用官方文档整理
    • 我们学校的IPV6很不错嘛
  • 2010
    • 线段树相关问题 (引用 PKU POJ题目) 整理
    • 2010 ACM 赛前笔记
    • POJ PKU 2596 Dice Stacking 解题报告
    • POJ PKU 3631 Cuckoo Hashing 解题报告
    • POJ PKU 1065 Wooden Sticks 3636 Nested Dolls 解题报告
    • HDU 3336 Count the string 解题报告
    • Hash模板 个人模板
    • ZOJ 3309 Search New Posts 解题报告
    • POJ PKU Let's Go to the Movies 解题报告
    • 注册表常用键值意义
    • PKU POJ 1724 ROADS 解题报告
    • 《神奇古今秘方集锦》&《民间秘术大全》
    • PKU POJ 1720 SQUARES 解题报告
    • POJ PKU 2155 Matrix 解题报告
    • PKU POJ 1141 Brackets Sequence 解题报告
    • PKU POJ 2728 Desert King 解题报告
    • PKU POJ 2976 Dropping tests 解题报告
    • PKU POJ 3757 Simple Distributed storage system 解题报告
    • GCD Determinant 解题报告
    • Southeastern European 2008 Sky Code 解题报告
    • HDU HDOJ 3400 Line belt 解题报告
    • 线性筛法求质数(素数)表 及其原理
    • HDU HDOJ 3398 String 解题报告
    • 树状数组模块(个人模板)
    • 浙江理工 省赛总结 team62 By OWenT of Coeus
    • POJ PKU 3659 Cell Phone Network 解题报告
    • USACO 2008 March Gold Cow Jogging 解题报告
    • C#格式化输出(记录)
    • 参加有道难题笔记
    • POJ PKU 2446 Chessboard 解题报告
    • POJ PKU 1986 Distance Queries 解题报告
    • 计算几何算法概览[转载]
    • 关于差分约束(转载)
    • POJ PKU 2826 An Easy Problem?! 解题报告
    • 数论模板(个人模板)
    • 简易四则运算(ACM个人模板)
    • Catalan 数
    • The 35th ACM/ICPC Asia Regional Tianjin Site —— Online Contest 1009 Convex 解题报告
    • JQuery扩展插件--提示信息
    • ACM 计算几何 个人模板
    • 解析网站字符串型参数 Javascript QueryString 操作 TQueryString类
    • POJ PKU 1474 Video Surveillance 解题报告
  • 2009
    • 模式匹配(kmp)个人模板
    • 并查集 模板
    • POJ 3267 The Cow Lexicon 解题报告
    • C/C++语言常用排序算法
    • POJ 2606 Rabbit hunt 2780 Linearity 1118 Lining Up 解题报告
    • 打造最快的Hash表(转) [以暴雪的游戏的Hash为例]
    • ECUST 09年 校赛个人赛第六,七场总结
    • ECUST 09年 校赛个人赛第三场部分解题报告(A,D,F,I)
    • 牛顿迭代解方程 ax^3+bX^2+cx+d=0
    • 09年8月9日 ECUST ACM 练习赛总结
    • 连接最多点直线 (OWenT 个人模板)
    • 点到直线距离 和 线段间最短距离 (OWenT 模板)
    • ECUST 09年 校赛个人训练赛第五场总结
    • ECUST 09年 校赛个人赛第八场(最后一场)总结
    • 09年8月14日 ECUST ACM 练习赛总结
    • 矩阵相关 (增强中)
    • Prime最小生成树(个人模板)
    • 最长单调子序列 复杂度nlog(n)
    • POJ PKU 2549 Sumsets 解题报告
    • POJ PKU 3277 City Horizon 解题报告
    • 我的ACM生涯
    • POJ PKU 2528 Mayor's posters 解题报告
    • POJ PKU 2378 Tree Cutting 解题报告
    • POJ PKU 1990 MooFest 解题报告
Powered by GitBook
On this page
  • Javascript
  • 关于对象
  • 闭包
  • 原型模型
  • Javascript的坑
  • 工具
  • Typescript
  • 类型限定
  • 变量限定
  • 接口Interface
  • 模块Module
  • 类class
  • Node.js
  • C++
  • Debug
  • 最后

Was this helpful?

  1. 2013

从Javascript到Typescript到Node.js

最近看了点typescript的东西,加上以前看过的一点点Node.js,所以就想把他们系统地整理一下。

Javascript

这玩意搞过Web开发的应该都知道吧,Javascript的语法我就不废话了,挺简单的。这里总结几个Javascript的核心机制部分吧。

关于对象

Javascript里所有东西都是对象,数字是Number,数组是Array,字符串是String,函数也是Function对象。而所有对象都基于Object对象。

闭包

闭包在Javascript里是很重要的概念,很多实现机制都会利用这点。闭包由function确立,子闭包可以访问外部的变量,但是外部的不能访问字闭包内的成员。特别是涉及回掉函数的地方,可以利用这一点来避免透传参数。

原型模型

Javascript的一个重要特点就是它是原型模型的(什么是原型模型请参考《设计模式》)。function是一个原型为Function实例的对象,同时可以由它来创建新的对象。在Javascript对象查找成员的时候,如果当前对象不存在,就会去其原型中查找。按照原型链找到头为止。如果还没找到,就返回undefined。 每一个function都可以通过设置prototype成员指定它的类型原型实例,要注意这里是原型的实例而不是原型的类型。比如

a.prototype = new b();

然后在new这个function的时候,新对象的原型就回指向这个原型实例。 另外,由于Javascript没有类似protected和private之类的关键字。所以在模拟面向对象继承的时候,只能使用私有成员(通过var申明)和公有成员(使用this.[成员名字]或[function名称].[成员名字]申明)。

Javascript的坑

作为一个脚本语言,果断是要有坑滴。且不说弱类型语言在复杂项目中类型混用的问题。单就boolean类型就有一个小坑。

比较符号

和大多数脚本语言一样,javascript是可以隐式类型转换滴,而且Number类型的0和字符串类型的空串转换成boolean的时候都是false。所以如果出现 0 == false 和 “” == false 之类的比较,返回的都是true。如果要加类型判断要用 0 === false 和 “” === false 这样,这就返回false了,对应的不等号是!==,和PHP一样。

eval

eval函数的作用闭包是当前闭包,所以执行完

eval('var abc = 123;');

之后,abc就变成Number类型的值为123的东东了,后面也可以用到。 忽略var关键字 有的时候会忽略或者忘记掉var关键字,比如:

var a = b = 123;

这行代码会把b写到window对象(浏览器)或global对象(Node.js)中。 同样,一不注意可能写出这样的代码

for(key in list){
...
}

同样这会把key带出,导致一些未预料的错误,所以应该补全var关键字

for(var key in list){
...
}

工具

Javascript部分的最后记录一点Javascript和网页相关的工具。

Typescript

要使用Javascript做大型的东西还是有不少坑的。首先它是弱类型的,一旦项目庞大了就很难保证类型不出错。并且有时候不经意间就会用到浏览器特有的东西。而Typescript就可以用来帮助你约束一些脚本行为,并编译成兼容各种浏览器的Javascript代码。 Typescript由微软开发,提供了Visual studio编译插件、Web版转换器(话说这个在线IDE真心给力)和Node.js插件,向上兼容Javascript语法。

类型限定

Typescript的特点之一是增加了类型限定。比如:string, number, boolean, any等等。在定义变量的时候,可以在后面加 : [类型名]来指定类型。如果发现类型不匹配或者出现非法的隐式类型转换就会编译报错。如:

var a: number;
var b: string;
var c: any;

为了向上兼容Javascript,所以如果不声明类型的话,默认是any。有一个特殊的类型,函数。函数类型的申明有点像lambda表达式。比如:

var a: (Number, string) => string

表示a是一个函数,第一个参数类型是Number,第二个是string,返回值是string类型。 另外,数组类型就是在普通类型后面加方括号[],如:

var a: string[];

变量限定

除了对类型进行规范以外,typescript还可以对未申明变量进行检查,避免前面说到的忘记写var的问题。 在typescript中,如果直接使用未定义的变量,会编译错误。而如果想要申明外部变量,可以用declare关键字,比如:declare var jQuery;

接口Interface

在typescript中,可以用interface关键字来申明接口。而使用这个接口的地方,编译程序会检查传入的变量和常量的类型是不是包含接口中声明的全部功能,并且类型一致。

模块Module

module关键字用于声明模块,其实就是Javascript里的闭包啦,需要注意的是module里的默认的东西都是private的,也就是用var申明的,如果要把它变成public的要在前面加export,比如:

export function getEnvironment() {
    return new TEnvironment();
};

export interface IEnvBrowserInfo {
    getBrowserName: () => string;
    getBrowserVersion: () => TEnvVersionInfo;
    getBrowserKernelName: () => string;
    isCompatMode: () => bool;
    isCookieEnabled: () => bool;
 };

类class

Typescript增加了class关键字,用于定义一个类。类里面的constructor方法作为构造函数。 对于typescript的类,仅支持单继承和private与public关键字。不支持protected。其内部private由var实现,public由[类名|this].[成员名实现]。而继承呢,就是前面说的prototype实现的。但是可以继承多个interface,因为interface只是一个类型限定而已。 在构造函数里,可以使用super关键字访问父类的成员,而且这个关键字也只能在构造函数里使用。

其他特性其他特性像什么common.js和AMD的推荐和define Property要求第三方组件和高版本js引擎就略过啦。前两个是异步加载公共模块的东东,后一个是模仿C#的set和get的玩意。

Node.js

用Node.js实现网络服务十分简单,比如官方的HTTP服务器例子:

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');

C++

如果要把Node.js和C++结合起来也比较easy(至少我觉得比lua简单多了,可能是因为它设计上就是面向对象的)。要把C++代码和Node.js打通,就需要Google V8引擎、Node.js的node::ObjectWrap包装基类。所有要导出到Javascript的类都需要继承node::ObjectWrap。

所有要导出的C++模块都要实现一个初始化函数,初始化函数的申明式为void Initialize (Handle exports); 的形式。然后要通过Node.js的一个宏NODE_MODULE([模块名称], [初始化函数])来定义模块。 然后在初始化函数中通过 exports->Set(String::NewSymbol("符号名称"), 符号内容); 来注册函数或者类符号。 之后要建立node-gyp的编译配置文件bind.gpy

{
  "targets": [
    {
      "target_name": "编译目标文件名",
      "sources": [ "源码文件集合" ]
    }
  ]
}

然后执行 node-gyp configure build 编译就好了。编译完后默认会放在build/Release/addon里。然后node.js里用js代码require进来就好

var addon = require('./build/Release/[编译目标名]);
console.log( 'call:', addon.[注册的符号调用] );

Debug

Node.js调试起来也比较Nice,大致上3种方式。

  • 第一种是类似gdb的调试方法,直接 node debug [javascript文件名],后面的操作类似gdb

  • 第三种是直接拿Chrome浏览器来调试,这个比较Nice。首先要通过npm install -g node-inspector安装node-inspector扩展;再启动Node.js程序并加–debug或者–debug-brk选项;最后,浏览器端的使用方式类似Android设备Chrome的远程调试,地址栏里输入http://[IP地址]:[ node-inspector端口号,默认8080]/debug?port=[Node.js的Debug选项的端口号] 来连接调试服务,就完啦。

最后

其他Node.js的功能就不介绍了,都是些功能模块,需要用到就在如然后用呗,官方文档挺简单易懂的。主要是Node.js利用了Javascript里伪多线程的全异步的设计思路。然后借由无锁操作来让开发人员可以快速地开发比较高效的服务程序。

PreviousPOJ 2192 Zipper HDU 2059 龟兔赛跑Next网络编程小结

Last updated 6 years ago

Was this helpful?

jQuery – – 是个人都知道的跨浏览器底层框架

qunit – – 单元测试框架

CoffeeScript – – Javascript生成语言

Typescript – – Javascript超集, Javascript生成语言虽然CoffeeScript更受欢迎一点,但是我不喜欢那种用缩进来做分隔符的语法。所以,下面要介绍的是Typescript。

Node.js是用于服务端的Javascript开发框架。Javascript部分基于Google V8引擎,据说性能非常之不错。 它采用了Javascript回调那种优雅的设计模式,最初是为了解决高连接数下的服务器性能消耗问题。并且其申称不会用锁,所以不会有死锁。 Node.js的作者实现了一些底层系统操作,并交付到javascript接口使用。比如进程、网络、加解密、内存管理、文件系统等。还实现了global对象替代浏览器里的window对象,作为最外层的闭包使用。 Node.js的功能都是按模块划分的,具体模块可以见 。而且Typescript可以作为Node.js的插件供其使用。

这样,基本的Node.js插件的开发就完成了,具体可以参照:

第二种是Google为V8引擎做的Eclipse插件,具体使用方法可以参考这里 ,然后用node –debug-brk[=端口号] [javascript文件名] 来启动远程调试。

http://www.jquery.com/
http://qunitjs.com/
http://coffeescript.org/
http://www.typescriptlang.org/
http://nodejs.org/api/
http://nodejs.org/api/addons.html
http://cnodejs.org/blog/?p=911