自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Keep It Simple, Stupid

新博客网址:https://ningto.com

  • 博客(399)
  • 资源 (24)
  • 收藏
  • 关注

原创 antd按需加载

Ant Design 是一个致力于提升『用户』和『设计者』使用体验的中后台设计语言,利用统一的设计规范、前端实现、设计/研发工具链对产品研发赋能,全面提高中后台产品体验和研发效率。本来react首页渲染速度就很慢,ant按需加载是非常有必要的。打开react-script/config/webpack.config.dev.js找到“Process JS with Babel.”在o...

2018-02-19 08:51:10 3234

转载 API设计原则(下)

API的语义和文档当传值为-1的参数给函数,函数会是什么行为?有很多类似的问题……是警告、致命错误还是其它?API需要的是质量保证。API第一个版本一定是不对的;必须对其进行测试。 以阅读使用API的代码的方式编写用例,且验证这样代码是可读的。还有其他的验证方法,比如 * 让别人使用API(看了文档或是先不看文档都可以) * 给类写文档(包含类的概述和每个函数)命名的艺...

2018-02-19 08:50:30 315

转载 API设计原则(中)

C++相关值 vs. 对象1. 指针 vs. 引用指针(pointer)还是引用(reference)哪个是最好的输出参数(out-parameters)?void getHsv(int *h, int *s, int *v) const;void getHsv(int &h, int &s, int &v) const;大多数C++书籍推...

2018-02-19 08:49:52 445

转载 API设计原则(上)

译序Qt的设计水准在业界很有口碑,一致、易于掌握和强大的API是Qt最著名的优点之一。此文既是Qt官网上的API设计指导准则,也是Qt在API设计上的实践总结。虽然Qt用的是C++,但其中设计原则和思考是具有普适性的(如果你对C++还不精通,可以忽略与C++强相关或是过于细节的部分,仍然可以学习或梳理关于API设计最有价值的内容)。整个篇幅中有很多示例,是关于API设计一篇难得的好文章。需...

2018-02-19 08:49:11 462

原创 mongodb模糊匹配正则转义

如果我要根据标题和内容搜索关键字,可以如下写法: return this.find({ '$or': [ {title: new RegExp(keyword, 'i')}, {content: new RegExp(keyword, 'i')} ] }) .sort({ 'pv': -1 }) .exec();但是,keyword关键字有特殊字

2017-11-04 12:21:41 6768

原创 19个JavaScript常用的简写技术

三元操作符当想写if…else语句时,使用三元操作符来代替。const x = 20;let answer;if (x > 10) { answer = 'is greater';} else { answer = 'is lesser';}简写const answer = x > 10 ? 'is greater' : 'is lesser';短路求值当给一个变量分配另一

2017-11-04 12:21:14 399

原创 nodejs批量ping

在一批大量的ip地址之中查找哪个地址是有效的并且应答的时间最快nodejs中可以使用net-ping模块ip地址所在的json文件格式如下,只粘贴部分信息,文件名:gui-config.json{ "configs" : [ { "remarks" : "德国", "server" : "172.104.155.76",

2017-11-04 12:20:46 6390 1

原创 koa2给所有页面渲染全局数据

场景给我的博客增加显示用户访问量,后台的每个请求访问量都新增1,每个页面的渲染都返回当前访问量计数。捕捉每次请求在所有路由之前新增 app.use(async (ctx, next) => { const totalhit = await Extends.addHit(ctx.path); ctx.state = Object.assign(ctx.state, { totalhi

2017-11-04 12:20:22 3192

原创 给marked增加TOC(Table of content)

一直使用marked库解析Markdown,现在想给它增加TOC功能 使用marked解析markdown文本是很简单的,如:marked(markdownText)就可以得到解析后的html内容初始化marked引入库var marked = require('marked');重写renderer.headingtocObj后面再介绍,返回的header中包含了用于定位的锚点。当然你也可以直接

2017-11-04 12:19:43 4024

原创 登录后自动跳转到登录前的页面

这个需求很常见,我们浏览自己写的博客文章的时候发现有些错误,此时想修改一下,所以必须得先登录才行。点击登录按钮后跳转到登录页面,登录成功后自动跳转到之前文章所在页面。实现方法就是在登录页面通过document.referrer获取进入到此页面前的地址,然后将地址写入到隐藏的表单元素中,提交表单后地址自然就传到后台了,后台判断登录成功后跳转到传过来的地址就可以了。signin.html页面html代码

2017-11-04 12:18:46 28862 3

原创 Markdown在线预览

Markdown在线预览上线了,拖动文件或者点击上传markdown文件就可以预览了。 服务器不保存文件副本,只是将上传的文件内容转换为html格式显示在网页上。点击地址访问:3inns.cn/mdviewer前端实现支持拖拽和点击打开文件夹选择文件的方式html代码<div id="content"> <div id="dropbox"> <h1>Drop file here

2017-10-20 15:59:44 3395

原创 mongodb部署分片集群

目标在3台CentOS 6服务器上部署mongodb分片集群,其中副本集(replica set)部署在不同的服务器上,每个服务器有一个配置(config)副本集,两个分片(sharding)副本集,以及一个mongos服务。所以3台服务器总共需要部署12个服务。3台服务器IP分别是:172.16.66.113,172.16.66.114,172.16.66.115,下面以113,114,115来代

2017-10-20 15:58:44 2091 5

原创 protobuf反射

C++本身是不支持反射的,但protobuf可以,下面介绍反射的两种主要的用途。通过proto对象的名字来创建一个对象google::protobuf::Message* ProtoHelp::createMessage(const std::string &typeName){ google::protobuf::Message *message = nullptr; const

2017-10-07 16:47:59 1110

转载 10个React小模式

在过去的几年,我经手过很多大大小小的React项目,在这个过程中,我不断的重复重复,逐渐的形成了一些模式,在这里分享给大家。如果你是刚开始接触React,能看到这篇文章,只能说你很幸运 :)。如果你没有接触过React,你可以跳过(3,6,8,10)节。1.数据向下和向上传递对于刚接触React新手,我通常都会告诉他们数据的传递模式,也就是父组件向子组件传递数据(比如一个对象,一个字符串等等),也可

2017-10-07 16:47:08 1274

转载 如何优雅的编写JavaScript代码

几乎每个大一点公司都有一个“运行时间长,维护的工程师换了一批又一批”的项目,如果参与到这样的项目中来,大部分人只有一个感觉——『climb the shit mountain』。所以我们经常会说谁谁谁写的代码就像排泄物一样,为了避免成为别人嘴里的谁谁谁,所以我写的代码一般不注明作者日期信息(抖机灵,其实是因为 Git 能够很好的管理这些信息),所以在项目中,我们应该编写可维护性良好的代码。同时,对于

2017-09-24 09:14:54 4413

原创 模拟QThreadPool实现

std::thread::hardware_concurrency()返回硬件线程上下文的数量,通常是CPU内核数量template numeric_limits根据当前平台,获取指定类型的信息 std::numeric_limits::min() 获取int最小值 std::numeric_limits::max() 获取unsigned long最大值std::unique_ptr

2017-09-24 09:13:57 1024

原创 std::move和右值引用

右值引用允许编程人员去避免不必要的内存拷贝,从而提高性能。 我们知道如果一个类A的成员变量中有指针,那么就要考虑深拷贝和浅拷贝了,深拷贝通常要实现下面几个函数: * 构造函数 * 拷贝构造 * 赋值操作符这样做是没问题的,但是会带来一个问题,会造成一些没必要的拷贝,如:std::string str("hello");str.resize(1024 * 1024 * 100);std::v

2017-09-24 09:13:24 537

原创 Qt只启动一个实例

要想实现这个需求,就涉及到进程间通信了,怎样让当前启动的程序知道在它之前有没有程序在运行。 其实实现方法还是蛮多的,简单介绍几种: * 两个进程读写同一个文件 * 创建一个有名字的事件CreateEvent * 共享内存下面是第三种方案的实现代码:#ifndef RUNGUARD_H#define RUNGUARD_H#include <QObject>#include <QShared

2017-09-24 09:12:42 1169

原创 Qt简单截屏

鼠标左键按下拉取截取范围,中间确认截图,右键取消截图。#ifndef GRABWIDGET_H#define GRABWIDGET_H#include <QWidget>#include <QMouseEvent>class GrabWidget : public QWidget{ Q_OBJECTpublic: explicit GrabWidget(QWidget *pa

2017-09-24 09:12:01 493

原创 mongodb 常用操作

连接mongodbmongo 默认连接到本地端口27017 mongo –host 123.57.244.111 –port 27017 连接远程数据库 插入数据插入一条数据: db.test.insert({title: “1111111111111111111”}) 循环插入数据: for (var i = 0; i < 100; i++) { db.test.insert(

2017-09-24 09:11:27 432

原创 Qt解决:warning : Z-order assignment

Qt中调整UI布局的时候,很容易出现如下警告:warning : Z-order assignment: '' is not a valid widget.warning : Z-order assignment: 'verticalSpacer' is not a valid widget.虽然编译后运行看起来没什么问题,但是对于有轻微代码洁癖的人肯定是忍受不了的,解决办法也很简单,如下步骤:

2017-09-24 09:10:54 5526 2

原创 WTL VS2013安装

WTL下载地址:https://sourceforge.net/projects/wtl/解压后双击运行WTL91_5321_Final\AppWiz\Setup.js,如果不能运行需要打开注册表HKEY_CLASSES_ROOT/.js将右边数据改为JSFile重新启动下就可以运行了。如果还是不行,打开cmd命令找到js所在目录执行:wscript Setup.js执行命令后没有安装上尝试使用管理

2017-09-24 09:10:20 476

原创 react native 配置方面的问题汇总

unable to load script from assets index.android.bundle(in project directory) mkdir android/app/src/main/assetsreact-native bundle –platform android –dev false –entry-file index.android.js –bundle-out

2017-08-23 20:31:09 340

转载 CSRF 攻击的应对之道(转载)

CSRF 背景与介绍CSRF(Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安全隐患之一。其他安全隐患,比如 SQL 脚本注入,跨站域脚本攻击等在近年来已经逐渐为众人熟知,很多网站也都针对他们进行了防御。然而,对于大多数人来说,CSRF 却依然是一个陌生的概念。即便是大名鼎鼎的 Gmail, 在 2007 年底

2017-08-23 20:30:32 324

原创 nodejs下载图片保存到本地

我们经常在使用别人图片url的时候发现图片显示不了,很可能对方做防盗链处理。在浏览器端有这个限制但是在后端就没有这个问题了。所以我们可以通过图片的url在服务端将这个图片下载下来保存在服务器上,然后客户端去访问我们自己的服务器,为了保证最小的改动,最好是保持原来url的图片路径,我们只需要换url前面的域名就可以了。分析源url,创建本地目录以及解析出新的写入路径使用mkdirSync函数同步的进行

2017-08-23 20:30:09 27470 2

原创 fetch跨域post,后端express

使用fetch中的post方法进行跨域请求,前提是后端是我们自己写的,比如用的框架是express。首先在express中设置支持跨域,然后使用fetch的时候注意参数的填写。这里我们向后端post json数据。fetch post写法如下export function postData(url, json) { return fetch(url, { method: 'POST',

2017-08-23 20:29:48 1696

原创 js库支持CommonJs和浏览器的标准写法

现在github上的很多开源js库都同时支持CommonJs和浏览器,简单的介绍一下写法。如有两个库A.js和B.js,B.js引用了A.js,如果我们要使用B.js库,那应该怎么写呢?A.js源码(function(global, factory) { /* CommonJS */ if (typeof require === 'function' && typeof module ===

2017-08-23 20:29:27 3423

原创 react判断滚动到底部以及保持原来的滚动位置

这里解决两个问题: * 判断某个组件是否滚动到底部 * 页面切换出去再切换回来后怎样保持之前的滚动位置 要保证这个组件就是那个滚动的组件,overflowY为scroll 判断某个组件是否滚动到底部组件代码如下,通过ref获取真实的dom节点<div ref={ node => this.contentNode = node }>在组件加载完成后增加监听scroll事件,组件将要卸

2017-08-23 20:29:05 21115 2

原创 使用flex固定头部和底部中间滚动

使用flex固定头部和底部中间滚动关键点: * root纵向布局高度充满整个浏览器界面并且隐藏滚动条 * content设置滚动,flex设置1,否则当所有item的高度太小时footer会离开底部 * item设置高度后,必须设置flexShrink为0,否则当所有item高度超过content高度时item会被压缩掉 ‘100vh’浏览器视口高度的百分比,这里是100%; fle

2017-08-23 20:28:39 4898

原创 nodejs根据url下载图片存储到当前目录

nodejs根据url下载图片存储到当前目录 开发的过程中有时候需要一些图片资源,但是在浏览器上输入url一个一个的去下载太慢了 使用nodejs很简单就可以把它们下载到本地目录并且保存原始的名字 。模块安装: npm install request –savevar request = require('request')var fs = require('fs')const imag

2017-08-23 20:28:12 8703

原创 javascript原型和继承

原文链接对象和类javascript到处都是对象,一个对象是由方法和属性(值)组成的实体(这里我们叫实例)。例如:javascript中的数组就是一个具有值的对象,同时也包括了push,reverse和pop等方法。var aArray = [1, 2, 3];aArray.push(3);aArray.reverse();aArray.pop();var length = aArray.l

2017-07-02 11:38:53 419

原创 qDebug日志写入本地文件

原文链接在Qt中使用qDebug打印日志信息是非常方便的,它可以直接打印Qt提供的复杂数据结构,如:QStringList,QVariantMap等。不做处理的话它只能在编辑器中打印调试信息,下面介绍将日志信息写入文件的实现方法。static struct LogWrap { LogWrap::LogWrap() { reset(); } LogWrap::~LogWrap() {

2017-07-02 11:38:13 3077

原创 javascript怎么实现类似如C++函数中使用静态数据

原文链接静态数据是一些不变的数据可以多次使用而不用频繁创建,C++中通常把他们放在cpp文件的include下面,或者如果其他地方不会用到的话可以直接写在要用到的函数里面。如果是javascript的话把它直接写在函数外面就是全局变量了这个肯定是不好的,放在函数里面每次运行函数的时候都会构建这个对象对运行时是有损耗的,那应该放到哪里呢?先看C++的通常做法:// xxx.cppstatic std

2017-07-02 11:37:07 397

原创 网页聊天气泡效果实现

原文链接模板收发消息模板(使用ejs),可以认为发消息在右边显示,收消息在左边显示。 每条消息有三部分组成:头像、名字、聊天内容。 头像和名字垂直布局,尖角和消息水平布局,消息整体水平布局,左边消息左对齐,右边消息右对齐,最后是调整各元素之间的间距。<script id="left-message-template" type="text/template"> <div class="l

2017-07-02 11:35:17 2506

原创 Robomongo连接远程MongoDB数据库

修改远程服务器上mongodb配置打开/etc/mongodb.conf配置文件将bind_ip注释起来,如:#bind_ip = 127.0.0.1创建管理员用户mongouse admindb.createUser({user:"admin",pwd:"admin",roles:[{"role":"userAdminAnyDatabase","db":"admin"}]})// 重启服务

2017-06-02 09:05:15 12738 1

原创 bootstrap 有省略点才显示tooltip

让太长的文本显示省略点如果table中的td内容太长了可以使用省略点,给td标签增加如下类:.autocut { max-width:180px; overflow:hidden; white-space:nowrap; text-overflow:ellipsis; -o-text-overflow:ellipsis; -icab-text-over

2017-06-02 09:03:46 4169

转载 CHROME开发者工具的小技巧

转载自:酷 壳 – CoolShellChrome的开发者工具是个很强大的东西,相信程序员们都不会陌生,不过有些小功能可能并不为大众所知,所以,写下这篇文章罗列一下可能你所不知道的功能,有的功能可能会比较实用,有的则不一定,也欢迎大家补充交流。 话不多话,我们开始。代码格式化有很多css/js的代码都会被 minify 掉,你可以点击代码窗口左下角的那个 { } 标签,chrome会帮你给格式化

2017-06-02 09:03:13 479

原创 css中position属性(absolute|relative|static|fixed)详解

转载自:脚本之家我们先来看看CSS3 Api中对position属性的相关定义static:无特殊定位,对象遵循正常文档流。top,right,bottom,left等属性不会被应用relative:对象遵循正常文档流,但将依据top,right,bottom,left等属性在正常文档流中偏移位置。而其层叠通过z-index属性定义。absolute:对象脱离正常文档流,使用top,right

2017-06-02 09:02:24 522

原创 无法定位程序输入点strnlen于动态链接库msvcrt.dll上(Qt XP)

Qt应用程序在XP(sp3)系统上出现上述错误使用的Qt版本是5.6.2,我的应用程序中包含D3Dcompiler_47.dll和opengl32sw.dll解决方法1:移除D3Dcompiler_47.dll文件只使用opengl32sw.dll是可以的解决方法2:毕竟xp现在用的人比较少,方法1为了适应xp而移除文件总感觉有些隐患(这些依赖库是通过windeployqt.exe工具打包来的)。

2017-06-02 09:01:28 6752

原创 QWebEngineView支持XP

Qt应用程序中如果用到了QWebEngineView组件,在XP上是有问题的。现象是网页内容显示不出来,直接运行QtWebEngineProcess.exe发现是起不来的,解决办法是下载Qt源码自己编译这个文件。 好在编译QtWebEngineProcess.exe比起编译整个Qt源码简单多了下载Qt源码我用的Qt版本是5.6.2,地址是:http://download.qt.io/offic

2017-06-02 09:00:49 3152 9

ntscreenshot_win10.zip

Qt截图工具 win10版本

2021-01-08

gowallpaper.exe

设置bing壁纸为桌面壁纸

2021-01-07

ntscreenshot

截图工具,源码:https://github.com/tujiaw/ntscreenshot

2021-01-06

emoji图片包

emoji图片包

2016-09-29

electron-v1.2.0-win32-x64

国外资源很难下载下来

2016-05-27

Visual_Assist_10.9.2073解决PYG解密小组弹框问题

visual assist x到期后解决PYG解密小组弹框问题

2016-02-14

xware-desktop_0.13.20141115_amd64.deb

在linux系统下,日常生活4个基本需求:办公软件 媒体播放 迅雷下载 QQ聊天,由于我不喜欢在linux下wine来运行exe程序,下面介绍实战用Xware Desktop实现迅雷下载,我分两种方法给大家介绍:第一种是作者介绍的比较复杂的模式,如下: 第二种是我自己分别为大家打包了32位和64位的deb包,大家只要下载DEB包安装,然后按照后面的使用说明就可以使用了: 简介: Xware Desktop的目标是提供与Windows平台上迅雷相当的功能。你可以这样认为: Xware Desktop是迅雷在Linux上的原生开源方案,无需Wine。 Xware Desktop是半官方半社区的迅雷:下载核心使用迅雷原版xware,界面使用开源的代码。 源码项目地址 https://github.com/Xinkai/XwareDesktop Ubuntu Kylin上编译安装说明如下: 编译环境 安装必备的软件。 sudo apt-get install git build-essential devscripts 下载源代码。 git clone git://github.com/Xinkai/XwareDesktop.git 这会在当前目录下生成一个名为XwareDesktop的子目录。 切换到源代码目录XwareDesktop。 cd XwareDesktop 打包 你需要切换到XwareDesktop的源代码目录。 列出缺失的编译依赖。 dpkg-checkbuilddeps 如果没有列出任何东西,跳过步骤2。 安装缺失的编译依赖。 sudo apt-get install <复制粘贴:上一步列出的缺失的编译依赖> 制作安装包。 dpkg-buildpackage 安装 回到图形化界面,在XwareDesktop的源代码目录的上级目录,你应该能找到名为xware-desktop_??????.deb的安装包文件, 双击它,按提示安装。 使用说明 第一次使用之前 启动前端,暂时不要登录。 设置下载文件夹。 文件->设置->挂载,点击添加,选择你的下载目的文件夹。点击确定。 注意: 永远把任务下载到X:\TDDOWNLOADS,不要下载到X:\下载或X:\。如果需要任务分类,请下载到X:\TDDOWNLOADS\音乐。 托管xwared并启动。 设置开机自动启动。 在文件->设置->启动与登录->xwared托管里选择由用户态systemd托管或者由用户态upstart托管,确定。 如果这两个选项都不能选,则选择简单的自动启动。 这样下次重启时,xwared会自动启动。 手动启动xwared。 因为上一步骤所做的操作需要下次启动才能生效,需要输入以下命令手动启动xwared。 systemd托管: systemctl --user start xwared upstart托管: start xwared 简单的自动启动: /opt/xware-desktop/xwared & 成功后,前端的左下角的xwared会变为绿色。 关闭xwared的方法。 在将来如果你需要关闭xwared,可以如下操作。 systemd托管: systemctl --user stop xwared upstart托管: stop xwared 简单的自动启动: 使用任务管理器,杀死名为xwared和EmbedThunderManager的进程 用迅雷账号登录。 设备激活。 稍等片刻,会出现一个添加设备的对话框。Xware Desktop会自动获取并填写激活码, 确认激活码自动填写后,点击激活按钮。激活过程应该是即时的。 浏览器扩展整合 Xware Desktop接受来自命令行的参数作为新任务的网址,格式为 xware-desktop http://www.website.com/file1 ftp://www.website.com/file2 ... 以Firefox上的Flashgot为例,打开其选项。添加一个新的下载器,程序设置为xware-desktop,参数设置为。 来自命令行的参数支持http,https,ftp,ed2k,magnet,flashget,qqdl,thunder等多种协议, 也同样支持本地的torrent文件。 ________________________________________________________________________________________________________华丽的分隔线,以上为复杂模式,以下为小白懒人模式,直接下载deb包安装就ok Xware Desktop 64位deb包下载地址:[url=http://pan.baidu.com/s/1pJFO93X]http://pan.baidu.com/s/1pJFO93X Xware Desktop 32位deb包下载地址:http://pan.baidu.com/s/1gdIgLu7 安装deb包后启动xware,仔细看使用说明部份 成功后的截图:

2015-09-19

window 管道

windows管道代码简单封装。

2014-09-04

C++.GUI.Qt.4编程(第二版)中文版1-5

C++.GUI.Qt.4编程(第二版)1-5 文件太大分割了几部分

2014-05-08

buffer应用缓冲区

buffer应用缓冲区 socket应用层

2013-07-30

MFC信息管理系统

MFC信息管理系统 毕业设计 SQL 数据库

2012-03-08

source insight3.5 注册码

很好的看代码的工具, 尤其看开源程序的时候很方便

2012-02-12

glib-2.30.2

glib-2.30.2源码, C语言进阶很好的资料

2012-02-03

Visual Assist X vc助手

Visual Assist X vc++助手

2011-12-15

我的emacs配置

将config-emacs改名为.emacs, 然后将.emacs和emacs-site文件夹放在用户目录下, 启用行号需在emacs中alt+x回车setnu-mode

2011-10-30

COM技术内幕.pdf 还比较清晰

《COM技术内幕》与《COM原理与应用》相对而言这本书要易懂些

2011-08-19

GDI+ SDK参考(翻译版本)

Microsoft Windows GDI+是为C/C++开发者提供的一个基于类的应用程序编程接口(API)。它使得程序可以同时在视频显示器和打印机上使用图形和格式化文本。基于Microsoft Win32的应用程序不能直接访问图形硬件,而是通过GDI+来协调设备驱动和程序动作的交互。GDI+同样支持Microsoft Win64。

2011-05-17

wtl81 支持vs2010

wtl81支持vs2010; 如AppWiz, 点击setup100.js运行即可, 如果你的vs2010是express版的话就点击setup100x.js。

2011-03-18

WTL81_9127

如果您打算写一个Win32 界面程序,我建议您在考虑MFC之前,先试试WTL.使用WTL来写您的代码, 程序将变得小巧些,也更有效率些. WTL8.1不需要更改可以支持vs2008

2011-02-26

C++必知必会(C++ Common Knowledge)

职业C++程序员必备常识 初学者登堂入室的阶梯 C++界20年经验结晶

2011-01-18

C++设计模式(用C++写的还有简单的介绍)

C++设计模式, 有完整的C++代码,还有作者的很多文字讲解,Gof23个设计模式是用C#讲解的, 对于不熟悉C#的人而言这个相对合适一些。

2011-01-18

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除