通过 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

POSS-NH2:氨基化笼型聚半倍硅氧烷的合成与应用探索

本文详细介绍了氨基化笼型聚半倍硅氧烷(POSS-NH2)的合成方法与应用。通过水解缩合与官能团转化两种主流路线,可制备出这种关键的纳米增强材料。其核心价值在于通过表面的氨基与树脂基体形成化学键合,从而显著提升复合材料的热稳定性和机械性能。文章以环氧树脂改性为例,展示了POSS-NH2在航空航天、电子封装等高性能领域的应用潜力。

grpc6streamer的博客 499

PICO SCOPE 二次开发

基于C#开发一个简单的PICO示波器的上位机工作,与MCC600运动控制卡一起,实现数据自动采集

nixoncheng的博客 1147

部署Nodeclub系统大坑总结

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

weixin_33814685的博客 290

Pattern Recognition 投稿过程记录,含Elsevier Latex模板使用

Pattern Recognition 投稿过程记录,含Elsevier Latex模板使用 最近在Pattern Recognition投出了一个文章,纯纯属于是第一次投稿,感觉自己写了一坨屎,事实是这确实也是一坨屎,现在是投了之后在等待一个拒稿的状态。 但是还是记录一下一些流程 1. 下载模板 在出版商Elsevier的栏目里有对于稿件的结构要求,也提供了Latex模板。同时,也给作者提供了Guides, 可以仔细阅读。下面这个连接咱们可以下载到Guides以及看到一些文章的要求。 https://ww

weixin_44153180的博客 3万+

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

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

weixin_73074012的博客 304

4D毫米波雷达:高度信息与微多普勒效应

4D毫米波雷达:高度信息与微多普勒效应​ ,人工智能,计算机视觉,大模型,AI,本文深入解析4D毫米波雷达的高度信息获取与微多普勒效应。4D毫米波雷达通过MIMO技术、垂直天线布局及相位差计算等获取高度信息,相较传统雷达更精准。微多普勒效应由目标微运动引发,可用于目标识别、分类和运动监测。文中结合自动驾驶、安防监控案例,分析技术挑战与未来趋势,如信号干扰、数据处理复杂,未来将向高精度、与其他传感器融合发展,展现出在多领域的巨大应用潜力。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 9万+

SpringBoot整合LangChain4j实现RAG检索实战详解

本文介绍了使用LangChain4j框架在Java生态中构建RAG(检索增强生成)应用的最佳实践。作为最接近Python LangChain的Java实现,LangChain4j提供了文档解析、向量化存储到检索增强的全套组件,并与SpringBoot深度集成。文章通过电商智能客服场景,详细演示了从零搭建RAG系统的完整流程:包括使用PostgreSQL+pgvector作为生产级向量数据库、文档加载与向量化处理、声明式AI服务实现以及查询压缩、结果重排等进阶优化技巧。同时对比了内存模式与生产级向量库的差异,

分享AI、区块链技术及应用,未来已来 432

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

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

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

2023年GESP12月认证C++五级真题解析

例如,如果a=4,那么4是最⼩的幸运数,而1不是,但我们可以连续对1做3次+1操作,使其变为4,所以我们可以说,1幸运化后的结果是 4。【题目大意】给一个完全平方数的标准,推导出哪些是超级幸运数,然后判断N个数字中,哪些是超级幸运数,是的输出“lucky”,不是的输出离该数字最近的比它大的数字。前一个数字,下标是j的数字是偶数,后面的数字下标是j+1的是奇数,按照要求,偶数在奇数的后面,要交换。A函数时间复杂度是O(n/2),B函数算法是O(sqrt(n)),大部分情况后者是优的,值更小。

lan_in的博客 1007

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

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

风云 5万+

YOLOv11 损失函数进阶:SlideLoss 让小目标检测精度飙升

创建self.loss_fun = loss_fun # 基础损失函数(如BCEWithLogitsLoss)self.loss_coef = loss_coef # 损失系数# 计算滑动权重:根据预测与真实值的差异判断样本难度# 难度越高,权重越大该类在原有损失函数的基础上,通过diff计算样本预测与真实值的差异(差异越大,样本越难),进而生成动态权重,实现对难样本的重点学习。

m0_64661770的博客 218

9篇3章7节:基于 R 语言的 FAERS 数据提取与合并

本文主要探讨了 FAERS 数据提取与合并的操作流程。首先,通过程序化方法从本地存储的 FAERS ASCII 文件中提取指定季度或范围内的单药报告数据,并可通过参数设置控制数据存储位置、处理方式、计算资源分配以及报告者职业类别等。随后,通过批量读取的方式对多个季度的 DRUG 文件进行循环处理,并将其合并为一个综合数据框。

MD Code 1265

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

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

龙哥盟 4237

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

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

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

吾星喵的博客 4634

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

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

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

龙哥盟 1万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

计算机精品视频教程合集

课程介绍: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 资源合集-记录。

悟世之路 3028

话说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、付费专栏及课程。

余额充值