通过 nodeclub 项目源码来讲解如何做一个 nodejs + express + mongodb 项目

使用 nodeclub 搭建一个开源社区 项目地址:https://github.com/cnodejs/nodeclub 不保证 Windows 系统的兼容性 线上跑的是 Node.js v8.12.0,MongoDB 是 v4.0.3,Redis 是 v4.0.9。 1\. 安装 `Node.js[必须]` `MongoDB[必须]` `Redis[必须]` 2\. 启动 MongoDB 和 Redis 3\. `$ make ins... 阅读详情

1. About

1.1 what:

nodeclub 是 cnodejs.org 的源码,CNode 算是一个基本的博客系统,包含文章发布, 关注,评论等功能。这些功能可以说是任何一个网站的基础。从 nodeclub 里可以学到什么?

    1.基本的架构
    2.开发测试过程
    3.MVC 的设计
    4.middleware 的正确用法
    5.如何设计 Mongodb schema
    6.如何正确的使用 Mongoose
    7.如何实现一个标签系统
    8.plugins? services ?
    9.如何正确的使用 EJS helper
    10.到底该怎样写路由, restful?
    11.如何做基本的控制验证
    12.如何发邮件
    13.session
    14.GitHub 用户登录
    15.图片上传
    16.消息发送

nodeclub源码

1.2 why

对于想用 nodejs + express + mongodb 来做网站技术基础的项目, nodeclub 可以说是很好的源码级指南。

2. nodeclub 中用到了哪些开源技术

2.1 Node.js 项目一大优点就是有一个 package.json, 里边的 dependencies & devDependencies 可以看到这个项目所有的依赖。 对于有经验的开发者来说, 看完 package.json 基本就能知道项目的架构是怎样。

2.2 dependencies

express: 基础框架:
mongodb: 数据存储
mongoose: orm
connect-mongo: session (对于redis, 可以使用connect-redis)
nodemailer:邮件
validator:验证
passport,passport-github: passport,
loader: ejs-view-helper, 静态资源加载处理
其他: event-proxy, node-markdown, ndir

2.3 devDependencies

测试框架:mocha, should
运行: forever
请求模拟: supertest

2.4 nodeclub 以 express + mongodb + mongoose 作为基本框架, 典型的 MVC 应用

Model: 对应mongoose orm, models目录
view: ejs模板, views目录
controler:express middleware , contollers目录

2.5 目录结构:

  • common/
  • controllers/
  • libs/
    //express中间件, 基本的auth, session 验证
  • middlewares/
  • models/
    //消息, 邮件服务
  • services/
  • plugins/
    //可以看做是对model处理的加工库
  • proxy/
  • test/
  • views/
  • app.js
  • route.js
  • config.js

3. 应用入口 app.js

神圣的入口文件,几乎每个项目都会有一个 entry,对于了解一个应用熟悉入口逻辑很重要。 下面将分步来看看,nodeclub 的 app.js 做了什么:

3.1 require(./config)

3.1.1 应用相关的配置的设置, 主要分为

1.应用全局数据配置
2.数据库连接配置
3.session,auth 相关配置
4.rss配置
5.mail配置
6.第三方连接相关配置, github, weibo

配置文件也是了解应用的一个好地方, 在 config.default.js 中可以看到以下信息, 这些很可能是我们平时做应用开发的时候没有留意到的地方

//--应用数据统计
google_tracker_id: 'UA-41753901-5',

//--静态文件很可能使用cdn来做
site_static_host: '', // 静态文件存储域名

//--求解释
site_enable_search_preview: false, // 开启google search preview
site_google_search_domain:  'cnodejs.org',  // google search preview中要搜索的域名

//--运营数据
list_topic_count: 20,
post_interval: 10000,
admins: { admin: true },
side_ads:[]
allow_sign_up: true,

//--插件模式
plugins: []

3.1.2 当然这里的配置文件是 default 的,配置文件可以放在一个 config 的文件夹下面,多个文件的方式来整理。比如运营数据配置和其他数据配置分开,因为很有可能需要做一个小的工具来让非技术人员配置相关参数。这时候可以用一个 index.js 作为 facade,相当于一个大的 node module。

3.2 require(‘./models’)

3.2.1 之前已经讲了 models/ 目录对应 MVC 的 M 部分。
3.2.2 models/ 目录下面有 index.js, require(‘./models’) 相当于 require(‘./models/index’)

index 相当于一个模型的 facade, index.js 做得事情分别是

1.connect mongodb
2.require 各个 model 模块
3.exports 所有的 model

简单而言就是初始化了应用 model 层。

3.2.3 模型使用 orm 框架 mogoose 来写,了解 mogoose 过后, models 部分的代码也就是秒懂了

, 我说的只是代码,literaly, 一个项目的核心就是 model 的设计,以前做过的任何项目都是一样, 数据库 table 的设计好坏直接影响应用的开发以及性能。 下面来看看各个 model 的 schema 设计(几乎直接 ctr+c, ctr+v 加上了一点点注释) :

3.2.4 user

var UserSchema = new Schema({
  //--基本用户信息, index表示在mongodb中会建立索引
  //--unique: true 唯一性设置
  name: { type: String, index: true },
  loginname: { type: String, unique: true },
  pass: { type: String },
  email: { type: String, unique: true },
  url: { type: String },
  profile_image_url: {type: String},
  location: { type: String },
  signature: { type: String },
  profile: { type: String },
  weibo: { type: String },
  avatar: { type: String },
  githubId: { type: String, index: true },
  githubUsername: {type: String},
  is_block: {type: Boolean, default: false},

  //--用户产生数据meta
  score: { type: Number, default: 0 },
  topic_count: { type: Number, default: 0 },
  reply_count: { type: Number, default: 0 },
  follower_count: { type: Number, default: 0 },
  following_count: { type: Number, default: 0 },
  collect_tag_count: { type: Number, default: 0 },
  collect_topic_count: { type: Number, default: 0 },
  create_at: { type: Date, default: Date.now },
  update_at: { type: Date, default: Date.now },
  is_star: { type: Boolean },
  level: { type: String },
  active: { type: Boolean, default: true },

  //-mail
  receive_reply_mail: {type: Boolean, default: false },
  receive_at_mail: { type: Boolean, default: false },
  from_wp: { type: Boolean },
  retrieve_time : {type: Number},
  retrieve_key : {type: String}
});

3.2.5 topic 话题

//1 <- 多
//tag <- topic <- collect  
var TopicSchema = new Schema({
  title: { type: String },
  content: { type: String },
  author_id: { type: ObjectId },
  top: { type: Boolean, default: false },
  reply_count: { type: Number, default: 0 },
  visit_count: { type: Number, default: 0 },
  collect_count: { type: Number, default: 0 },
  create_at: { type: Date, default: Date.now },
  update_at: { type: Date, default: Date.now },
  //--这里reply的设计方式不知道是否合适, 因为mongdb不同于关系型数据库,这里每次读取文章都需要重reply集合里边查找遍历一边,文章是读繁忙的。
  //-- 一个document的大小为5Mb, 一本牛津词典的内容, 我觉得将reply放在这里应该不会有太大问题。 即便不存放reply 内容, 存放一个id数组也会好很多。
  //-- 客官们怎么看?  
  last_reply: { type: ObjectId },
  last_reply_at: { type: Date, default: Date.now },
  content_is_html: { type: Boolean }
});

var ReplySchema = new Schema({
  content: { type: String },
  topic_id: { type: ObjectId, index: true },
  author_id: { type: ObjectId },
  reply_id : { type: ObjectId },
  create_at: { type: Date, default: Date.now },
  update_at: { type: Date, default: Date.now },
  content_is_html: { type: Boolean }
});

//--话题集合
var TopicCollectSchema = new Schema({
  user_id: { type: ObjectId },
  topic_id: { type: ObjectId },
  create_at: { type: Date, default: Date.now }
});

//--话题标签
var TopicTagSchema = new Schema({
  topic_id: { type: ObjectId },
  tag_id: { type: ObjectId },
  create_at: { type: Date, default: Date.now }
});     

3.2.6 tag 标签系统

//tag <- collect
var TagSchema = new Schema({
  name: { type: String },
  order: { type: Number, default: 1 },
  description: { type: String },
  background: { type: String },
  topic_count: { type: Number, default: 0 },
  collect_count: { type: Number, default: 0 },
  create_at: { type: Date, default: Date.now }
});

var TagCollectSchema = new Schema({
  user_id: { type: ObjectId, index: true },
  tag_id: { type: ObjectId },
  create_at: { type: Date, default: Date.now }
});

3.2.7 关系

var RelationSchema = new Schema({
  user_id: { type: ObjectId },
  follow_id: { type: ObjectId },
  create_at: { type: Date, default: Date.now }
});

3.2.8 消息 消息 model 设计, 对于一个 blog 来说, 基本的只有回复消息, 这里加了关注和@消息。

/*
 * type:
 * reply: xx 回复了你的话题
 * reply2: xx 在话题中回复了你
 * follow: xx 关注了你
 * at: xx @了你
 */
var MessageSchema = new Schema({
  type: { type: String },
  master_id: { type: ObjectId, index: true },
  author_id: { type: ObjectId },
  topic_id: { type: ObjectId },
  reply_id: { type: ObjectId },
  has_read: { type: Boolean, default: false },
  create_at: { type: Date, default: Date.now }
});

3.3 require middlewares

3.3.1 express 的基础是 middleware,或者说 express 的基础是 connect,connect 的基础是 middleware。middleware 模式在 professional nodejs 中有一个专门的章节来讲解。何为 middleware 呢? middleware 模式 相当于一个加工流水线(大家叫 middleware stack),每一个 middleware 相当于一个加工步骤,当出现一个 http 请求的时候,http 请求会挨着每个 middleware 执行下去。
express 里处理一个请求的过程基本上就是请求通过 middleware stack 的过程: * -> middlewares -> 路由 -> controllers -> errorhandlering。

3.3.2 middleware 怎样做到的, 异步的方法呢? middleware 使用 promise 的方式来处理异步,所有每个 middleware 都有三个参数 req, res, next, 对于异步的情况, 必须要调用 next() 方法。不然后续的 middleware 就无法执行。 ps: debug 的时候没调用 next() 还不会报错,一定注意

3.3.3 auth.js

auth.js exports 出来的函数全部都是中间件,从变量名就完全清楚的知道到底在做什么了

//-- 需要admin权限
exports.adminRequired = function (req, res, next) {}

//-- 需要有用户
exports.userRequired = function (req, res, next) {}

//-- 需要有用户并登录
exports.signinRequired = function (req, res, next) {
    if (!req.session.user) {
        res.render('notify/notify', {error: '未登入用户不能发布话题。'});
        return;
    }
    next();   
}

//-- 屏蔽用户 -_-
exports.blockUser = function (req, res, next) {}

这里其实就可以看到中间件的作用了,我们以前写 php 的时候每次都需要判断用户是否登录, 没登陆 redirect 到 index.php ,只不过这里的方式是通过中间件来处理。
明白这里什么意思,其他的中间件模块也就秒懂了。

3.4 require(’./routes’)

3.4.1 express 的世界里另外一个很重要的就是route, Node.js 启动的是服务, 监听了某一端口, 接受 http or https or socket 请求, 那 url 中像 /index.php?blabla 这一串的存在怎么处理呢, express 的 route 功能就可以帮我们解析。

3.4.2 MVC 中如何将一个请求和 controller 联系起来呢, route 就是这样的纽带

//--get, post 请求
app.get('/signin', sign.showLogin);
app.post('/signin', sign.login);
//--使用中间件
app.get('/signup', configMiddleware.github, passport.authenticate('github'));
app.post('/:topic_id/reply', auth.userRequired, limit.postInterval, reply.add);

3.4.3 route 是了解一个应用最佳的地方,一个请求如何处理, 到相应的 controller 去看就知道了。 相比起在PHP环境下配置更加灵活。当然你说你通过nginx来配置也很灵活,好吧,我们说的不是一回事。

3.5 initialization

3.5.1 experess initialize: app.js 中其他大多部分就是express的初始化了, 初始化流程如下:

1.配置上传 upload_dir
2.模板引擎设置
3.express 通用中间件设置
4.pasport 中间件
5.自定义中间件
    1.auth_user
    2.block_user
    3.staticfile: upload
    4.staticfile: user_data
6.csrf
7.errorhandler
8.set view cache

@Note:配置的顺序很重要, 中间件的执行顺序是按照定义顺序来执行的, 如果一个中间件依赖另外的中间件, 而自己先执行了, 这种情况就会错误。 常见的问题就是session配置, 一定要记得配置 session 中间件的时候, 要先配置 cookieParser。

3.5.2 session 设置

这个步骤在 initialize 里边已经有了, 不过再单独讲一下, nodeclub 使用的是 connect-mongo 来作为 session 的存储

  //--cookieParser一定要在前面, 因为session的设置依赖cookie
  app.use(express.cookieParser());
  app.use(express.session({
    secret: config.session_secret,
    store: new MongoStore({
      db: config.db_name,
    }),
  }));

3.5.3 view helpers

使用过 ejs 的肯定知道, ejs 里边 view helper 设置很简单, 就像赋值变量一样。 当对于一些通用的 helper 可以这样设置:

    app.helpers({
      config: config,
      Loader: Loader,
      assets: assets
    });
    app.dynamicHelpers(require('./common/render_helpers'));

3.5.4 github pasport initialize

    // github oauth
    passport.serializeUser(function (user, done) {
      done(null, user);
    });
    passport.deserializeUser(function (user, done) {
      done(null, user);
    });
    passport.use(new GitHubStrategy(config.GITHUB_OAUTH, githubStrategyMiddleware));

3.5.5 start app

4. 用户注册

4.1 user 是每个应用都会处理的基本, 注册登录登出, 看看 nodeclub 做了哪些事情:

4.2 路由:

//--设置能否直接注册, 不能的话通过github注册
if (config.allow_sign_up) {
  app.get('/signup', sign.showSignup);
  app.post('/signup', sign.signup);
} else {
  app.get('/signup', configMiddleware.github, passport.authenticate('github'));
}
app.post('/signout', sign.signout);
app.get('/signin', sign.showLogin);
app.post('/signin', sign.login);

4.3 controller & model:sign.signup

sanitize = validator.sanitize;
check = validator.check;
exports.signup = function (req, res, next) {
  //--xss 消毒
  var name = sanitize(req.body.name).trim();
  name = sanitize(name).xss();
  ...
  //--validations
  try {
    check(name, '用户名只能使用0-9,a-z,A-Z。').isAlphanumeric();
  } catch (e) {
    res.render('sign/signup', {error: e.message, name: name, email: email});
    return;
  }
  ...
  //--用用户名登录或者email登录
  query = {'$or': [{'loginname': loginname}, {'email': email}]}
  User.getUserByQuery(query, {}, function(){
    ...
    pass = md5(pass);
    ...
    User.newAndSave(name, loginname, pass, email, avatar_url, false, function (err) {
      ...
      // 发送激活邮件
      mail.sendActiveMail(email, md5(email + config.session_secret), name);
      res.render('sign/signup', {
        success: '欢迎加入 ' + config.name + '!我们已给您的注册邮箱发送了一封邮件,请点击里面的链接来激活您的帐号。'
      });
    })
  })
}  

5. mongoose 的使用

5.1 使用User.newAndSave,

5.2 异步 callback pyramid

一个应用通常会遇到这样的情景, 一个页面需要的数据包括, 文章列表, 评论列表,用户数据,广告数据, other stuff… 问题是每个都是异步的, 怎么办。 user 数据获取过后的 callback 调用文章列表获取, 文章列表获取的 callback 调用评论列表的获取… 这样就太蛋疼了。 nodeclub 使用了 eventproxy 模块优雅的解决这样的问题:

 render = function(){}
  var proxy = EventProxy.create('tags', 'topics', 'hot_topics', 'stars', 'tops', 'no_reply_topics', 'pages', render);
  proxy.fail(next);
  Tag.getAllTags(proxy.done('tags'));
  Topic.getTopicsByQuery(query, options, proxy.done('topics'));
  User.getUsersByQuery({ is_star: true }, { limit: 5 }, proxy.done('stars'));

看完代码不言而喻。。。
当然异步处理的方法有很多:

1.基于事件的:eventProxy
2.基于promise的:Async.js Q.js, when.js
3.基于编译的:continuation, wind
4.基于语言语法的:yield, livescript

文章最后会讲一下我的异步选择方案

6. 消息

6.1 原先以为有动态的消息推送, 有队列处理, 错了, 木有

6.2 在 Sublime text 里边全局搜索 sendReply2Message 会发现是在 controller/reply.js 里边调用的, 也就是说,消息是直接触发的。

7. 开发

7.1 测试

7.1.1 一个项目必定离不开测试, nodeclub基于mocha BDD测试框架, 一切的前提假设至少能看懂jasmine或者mocha或者任何一个BDD风格的测试代码。

7.1.2 打开即看到app.js

var app = require('../app');
describe('app.js', function () {
  //--before, 执行it的前面会执行
  before(function (done) {
    //--done, 异步方法
    app.listen(3001, done);
  });
  after(function () {
    app.close();
  });
  it('should / status 200', function (done) {
    //--使用 app.request()就可以模拟请求了? 这个api哪里来的, 求解释?
    app.request().get('/').end(function (res) {
      res.should.status(200);
      done();
    });
  });
});
//--按理说应该是可以正常运行了但是我一直出现这个错误:
//--connect ADDRNOTAVAIL 知道的求解释
//--我尝试用supertest直接测试, 但是也是一直timeout, mocha
//--里边加大timeout时间, 结果就是一直没反应。 

//--分析原因, express版本问题, nodeclub中express的版本还是2.x, 所以才会有
//--app.request(), app.close()这些api
//--第二个原因, 到supertest官网, 发现人家都已经转战到superagent项目了, 于是我写了下面这个测试脚本, 可以通过了
var express = require('express');
var should = require('should');
var path = require('path');
var superagent = require('superagent');
var app = express()
app.get('/user', function(req, res, next) {
    res.send(200, {
        name: 'tobi'
    })
})
describe('myapp.js', function() {
    this.timeout(5000)
    before(function(done) {
        app.listen(21, done);
    })
    after(function() {
        // app.close()
    })
    it('should /status 200', function(done) {
        agent = superagent.agent()
        agent.get('http://localhost:21/user').end(function(err, res) {
          console.log(err, res)
          res.should.have.status(200);
          res.text.should.include('tobi');
          return done();
        });
    })
})

7.2 运行

nodejs是单线程应用, 如果我们用node命令来运行我们的应用, 当出现一个小错误, 它就挂了。 然后没有然后了。 避免这种问题的方法有如下工具:

1.forever
2.nodemon
3.supervisor nodeclub 使用 forever 来运行项目, 使用这类工具的好处就是, 当有代码改动过后, 会自动的重启应用。 不必每次自己去运行 node *.js

原文链接:http://cnodejs.org/topic/535601a20d7d0faf140303d8

ST-LINK_V2驱动安装与调试实战指南 ST-LINK/V2看似只是一个小小的调试器,但它串联起了整个嵌入式开发链条:从代码编写、烧录验证,到深度调试、性能优化。真正高手不会等到出问题再去查资料,而是早已建立起完整的知识体系:- 知道驱动怎么装、为何要验证;- 明白硬件连接背后的电气原理;- 懂得如何用SWO替代printf提升效率;- 更能在“变砖”时冷静恢复而非直接报废。下一次当你拿起那个蓝色小盒子时,希望你能感受到的不仅是便利,更是一种掌控感。💪毕竟, 阅读详情

相关推荐

开源的社区系统Nodeclub.zip

介绍 Nodeclub 是使用 Node.js 和 MongoDB 开发的社区系统,界面优雅,功能丰富,小巧迅速, 已在Node.js 中文技术社区CNode(http://cnodejs.org) 得到应用,但你完全可以用它搭建自己的社区。  安装部署不保证 Windows 系统的兼容性线上跑的是 io.js v2.3.3,MongoDB 是 v2.6,Redis 是 v2.8.9。1. 安装 `Node.js/io.js[必须]` `MongoDB[必须]` `Redis[必须]` 2. 启动 MongoDB 和 Redis 3. `$ make install` 安装 Nodeclub 的依赖包 4. `cp config.default.js config.js` 请根据需要修改配置文件 5. `$ make test` 确保各项服务都正常 6. `$ node app.js` 7. visit `http://localhost:3000` 8. done!  测试跑测试$ make test跑覆盖率测试$ make test-cov社区系统效果: 标签:社区系统

NodeClub - 开源的Node.js社区系统

是一款基于 Node.js 和 MongoDB 构建的开源社区系统。它旨在为开发者提供一个分享知识、交流想法的平台,并且可以根据自己的需求进行定制化开发。 ## 什么是 NodeClub? NodeClub 是一款以技术分享和讨论为核心的社区系统。它包含以下主要功能: - 发表主题:用户可以发表技术文章或问题,与其他人共同探讨。 - 回复评论:对其他人的主题或回复进行评价和回应。 - 用户关...

gitblog_00067的博客 672

nodeclub 架构

简洁明了的描述了nodeclub的架构,所需接口,和文件之间的联系

NodeClub:NodeJS构造开源交流社区

连接每一个想法,NodeClub让社区更生动

2401_83063795的博客 1219

pgsql行列转换

‌是PostgreSQL中的一个函数,用于将一个字符串根据正则表达式进行分割,并将结果返回为一个表格,每个分割后的部分作为一行‌‌。string_agg() 函数是 PostgreSQL 中的一个聚合函数,用于将一个列中的值连接成一个字符串。

chimchim66的博客 3503

KiCad自动布线实战:FreeRouting插件安装与使用指南

在PCB设计流程中,布线环节往往占据大量重复性工作,尤其对于中小型双面板,成百上千条飞线的手动连接既繁琐又易出错。自动布线技术通过算法在给定设计规则和元件布局的基础上自动规划走线路径,能显著提升布线效率。FreeRouting作为一款开源自动布线器,与KiCad通过DSN/SES标准中间格式无缝配合,让工程师将精力集中于关键信号和布局优化,而将常规网络交给工具处理。本文从自动布线的原理与边界出发,讲解了FreeRouting的安装、DSN导出、参数设置、自动布线及结果回传的完整流程,并结合实际案例展示了在S

weixin_32025789的博客 278

部署Nodeclub系统大坑总结

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33814685的博客 290

【纯干货分享】常用高速接口眼图模板合集

文章汇集了常见的高速接口的信号眼图测试模板技术要求,比如,LPDDR5/4、PCIe 5.0/4.0、USB、MIPI等等,方便工程师快速进行查询和使用。

一只豌豆象的博客 3116

【实习问题记录】Nodeclub本地部署

下面修改mongodb版本到4,但是发现自己安装的是wsl版本的Ubuntu22.04不支持版本4这么老的mongodb,于是安装wsl版本的Ubuntu18.04,结果发现Ubuntu18.04在wsl中被识别成了windows系统而不是Linux系统,因而在使用npm包管理工具的时候有问题。无奈,只能重新安装虚拟机进行进一步开发。

weixin_73074012的博客 304

华为面试手撕真题【求1-n的最小公倍数】

求1-n的最小公倍数

MISAYAONE的博客 2万+

dex2oat编译优化调试

dex2oat编译调试的一些技巧和方法

jidapenglin28的专栏 5045

计算机专用英语词汇1695个词汇表

特别感谢: 不愿意透露姓名的小虾同学提供的音标部分 1.单词说明:   command n. 命令,指令 [kə'mɑ:nd]   单词拼写 名词 单词含义 音标(发音)   提示:着重记忆单词对应的意思,有能力最好词性也记忆。 2.词性说明: n       v      vi                 vt      conj  prep  pron  adj  ...

惨绿少年 | 欢迎访问CLSN博客站点 http://clsn.io 6628

Vue3 - [兼容PC和手机H5] 详细监听浏览器刷新 / 关闭 / 前进后退事件,用户点击关闭和刷新页面前 “拦截“ 操作并弹出提示框(实时监听用户关闭或刷新网页,触发时文字提醒并执行自定义操作)

vue3监听页面关闭和刷新,vue3中如何监听页面刷新和关闭事件,vue3中监听浏览器窗口关闭事件,并在窗口关闭进行操作,vue3怎么只在某个页面监听,其他页面不监听,vue3监听刷新和关闭怎么离开页面时注销释放,vue3怎么阻止浏览器前进和后退并提示,页面跳转离开后依旧可以监听到刷新和关闭,vue3怎么知道用户关闭了网页,vue3如何监听刷新网页操作并截断,vue3移动端手机h5网页手机网站监听浏览器刷新关闭,vue3当页面关闭或刷新时怎么提示用户离开不保存数据,vue3项目监听浏览器窗口或标签页关闭,并

🏆 前端领域优质创作者 1万+

最新百度 阿里 华为 腾讯 谷歌面试笔试题及解析

8月15日,百度2道面试题: 1、来自《编程之美》的概率题:一个桶里面有白球、黑球各100个,现在按下述规则取球:的     i 、每次从通里面拿出来两个球;     ii、如果取出的是两个同色的求,就再放入一个黑球;     ii、如果取出的是两个异色的求,就再放入一个白球。 问:最后桶里面只剩下一个黑球的概率是多少? 2、算法题:给你一个自然数N,求[6,N]之内的所有素数中,两两

风云 5万+

【电机应用控制】——步进电机控制原理(四相五线/两相四线/细分驱动)&驱动器&梯形/S形加减速算法&直线/圆弧插补

步进电机是一种把电脉冲信号转换为角位移(左)或线位移(右)的电动机。两相通常1.8°,三相通常1.2°、无相通常0.72°,角位移=脉冲个数X步距角。在非超载且不超频的情况下,电机的旋转位置只取决于脉冲个数,转速只取决脉冲信号的频率。所以只需要统计脉冲个数和频率,不再需要编码器测速和位置,具有优秀的开环能力,当然也可接编码器反馈速度和位置数据,实现更加精准的闭环控制。永磁式动态性能好,输出力矩大,但步距角大通常7.5°;反应式(磁阻式)结构简单成本低,步距角小一般1.2°,但振动噪音大动态性能差;

weixin_51658186的博客 5万+

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

TowardsDataScience 博客中文翻译 2020(九百八十四)

作者通过Imgflip生成的图片图片由作者通过Imgflip生成softmax 函数是一个激活函数,它将真实值转化为概率。在一个正常的学年,此时此刻,我可能正坐在离家两个小时的咖啡店里,读着我计算机编程课前的讲座。或者,此时此刻,我可能正在上课,试图跟上我的教授对精确方程的解释。随着世界各地的学校关闭,像我这样的学生只能靠自己来对抗拖延症。一场可悲的斗争,一场我显然不会赢的斗争。在过去的几周里,尽管我的大学有大量的在线工作,但我已经决定这是学习我所能学习的关于深度学习的一切的最佳时间。

龙哥盟 4236

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

【docker】Docker核心技术快速入门及私有仓库搭建

更多内容请点击 我的博客 查看,欢迎来访。 什么是Docker? 官方文档翻译 Docker 是基于Go语言实现的开源容器项目。利用操作系统本身已有的机制和特性,可以实现远超传统虚拟机的轻量级虚拟化。它是内核级的虚拟化。期望达到使项目运行环境“一次封装,到处运行的目的”。 Docker作为一个软件集装箱化平台,可以让开发者构建应用程序时,将它与其依赖环境一起打包到一个容器中,然后很容易地发布和应用...

吾星喵的博客 4634

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

TowardsDataScience 博客中文翻译 2020(二百九十三)

脑机接口(Brain-Computer Interface,BCI)是一种提取对象(人或动物)的大脑活动模式并将其转换为交互式应用的消息或命令的系统。大脑活动模式是用脑电图(EEG)获得的信号。完全用我们的思想控制设备的概念并不新鲜。众所周知,科幻小说和好莱坞电影描绘了这一点。已经进行了几项研究和实验,如猴子控制机械臂自己进食、控制轮椅和控制光标每分钟打大约八个字。睡眠模式癫痫注意缺陷多动障碍意识障碍麻醉深度疲劳和精神负荷情绪情感。

龙哥盟 1万+

计算机精品视频教程合集

课程介绍:https://www.aihorizon.cn/72百度网盘地址: https://pan.baidu.com/s/1lrak60XOGEqMOI6lXYf6TQ?pwd=ns0j。

duoshehuan6005的博客 12万+

sqoop

1、解压安装包: sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz 2、修改配置文件: cd apps/sqoop-1.4.7.bin__hadoop-2.6.0/conf/ cp sqoop-env-template.sh sqoop-env.sh vi sqoop-env.sh 修改内容如下: #Set path to where bin/hadoop i...

Hi_this_is_ID的博客 8310

简单单词

a, an [ə] art. 一(个);任何一(个);每,每一(个) able [ˈeibl] a. 有能力的,能干的 be able to+inf. 能,会 about [əˈbaut] prep. 关于;在…周围;ad. 大约;到处;在附近 be about to+inf. 即将 above [əˈbʌv] prep. 在…上方;多于;高于;超过 ad. 在(或向)上面,在顶上;在上文 a. ...

xo_zhang的专栏 5万+

2023-10-29 游戏开发-CocosCreator游戏资源合集-记录

2023-10-29 游戏开发-Cocos Creator 资源合集-记录。

悟世之路 3022

话说linux内核连载1-5

话说linux内核连载目录1.内核和发行版的区别2.内核和驱动的关联3.内核和应用程序、根文件系统的关联4.linux内核的模块化设计5.选择合适版本的内核6.声明: 正文回到顶部1.内核和发行版的区别到底什么是操作系统linux、windows、android、ucos就是操作系统操作系统本质上是一个程序,由很多个源文件构成,需要编译连接成操作系统程序(vmlinz、zImage)操作系统的主...

青岛海珊瑚IT学习中心 1132

项目之文章管理系统nodeJS_mogonDB学习笔记及源码

项目之文章管理系统 一、express node布置 1、安装express生成器 2、项目初始化 需添加ejs模板引擎 3、进入项目 4、安装 5、运行项目 6、启动nodemon 实现代码的实时编译(无法检测php) 7、启动项目 8、进入项目 二、mongodb布置 1、项目右键用git启动 2、启动mongodb 也可设置logs 3、连接mongodb 4、nodejs使用express模块连接数据库(可查看官方文档 https://www.npmjs.com/package/mongodb) 5

weixin_42530002的博客 661

nodeclub 环境搭建记录

搭建nodeclub源码,准备学习一下。 项目地址 https://github.com/cnodejs/nodeclub 搭建步骤 按照说明步骤: 1. 安装 `Node.js/io.js[必须]` `MongoDB[必须]` `Redis[必须]`   mac环境下采用brew来安装 brew install mongodb ==> Downloading http...

weixin_30252155的博客 408
上一篇: phpstorm编辑器小技巧之自动换行与去掉右上角浏览器图标
下一篇: MySql性能分析工具之Show Profile
Anlior
博客等级 码龄10年 29粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值