写了一个命令行的聊天室
完整项目gihub地址传送门>>>基本功能:
运行前端提示输入昵称,昵称不能和别人重复
可以创建聊天室,默认名字为 昵称+的聊天室
加入和创建聊天室是输入序号的
命令行的很简陋,因为不会画web界面,但是命令行很有科技感好嘛。。
更多详见 README.md
ps:做着玩的,不喜勿喷。
人生路
前段时间,wegame上出了一个新游戏叫《隐形守护者》,买来玩了玩。
人生何尝不是一次次选择,唯一的区别是不能重选罢了。和游戏里一样,不同的选择可能会有相同的结果,但是过程不一样啊,所以又回到了一个哲学问题,结果重要还是过程重要呢。都无所谓了,人生如戏,但不是游戏,选了就选了吧。不管结果如何,过程如何,反正不知道另一个选择的结果和过程对吧。
木业飞舞之处,火亦生生不息。
小小的总结一下
总结一下没有回答出来或者不熟练的问题吧。
redis怎么备份我所知道的备份就是conf文件内可以配合,它会自动定时保存一个rdb文件。然鹅还有:
SAVE 和 BGSAVE 两个命令都会调用 rdbSave 函数,但它们调用的方式各有不同:
SAVE 直接调用 rdbSave ,阻塞 Redis 主进程,直到保存完成为止。在主进程阻塞期间,服务器不能处理客户端的任何请求。
BGSAVE 则 fork 出一个子进程,子进程负责调用 rdbSave ,并在保存完成之后向主进程发送信号,通知保存已完成。因为 rdbSave 在子进程被调用,所以 Redis 服务器在 BGSAVE 执行期间仍然可以继续处理客户端的请求。
mysql除了的优化方案这个我所知道的最简单的就会加索引喽。然后就是设计表方面。我觉得设计一个合理的表结构是最重要的鸭。如果非要从业务代码方面优化。https://coolshell.cn/articles/1846.html
高阶函数我依稀记得高阶函数就是以函数作为参数。在数学和计算机科学中,高阶函数是至少满足下列一个条件的函数:
接受一个或多个函数作为输入
输出一个 ...
发现一个有意思的变量暴露问题
刚才撸代码调用一个变量,这个变量被暴露出去在其他文件改变了它的值,但是本文件调用时发现并没有改变,看了半天发现了一个问题。新建一个a.js
123456const b = require('./b');console.log(b.foo); // 1b.foo = 233;
新建b.js
123456789var foo = 1;module.exports.foo = foo;setTimeout(() => { console.log(foo); //1 console.log(exports.foo); //233 console.log(module.exports.foo); //233}, 1000);
使用node a.js启动,a.js先输出 1 然后b.js一秒后输出 1 ,233,233。所以为什么b.js的console.log(foo)输出是1呢。。暂时不清楚,看下一个列子:
新建a.js
123456const b = require('./b');console.log(b. ...
使用pm2管理node.js服务
今天研究了一下使用pm2来管理node服务器,这样不仅可以看到每个服务占用的内存和cpu,还可以很方便的启动和重启,也可以使用--watch,自动重启,而且官方说pm2 reload来重启服务器是‘无缝’重启的。。
官方快速入门文档传送门
简单的使用步骤:1.下载 npm install pm2 -g
2.启动服务 pm2 start < app name>
3.重启服务 pm2 restart < app name> pm2 reload < app name>
4.停止服务pm2 stop < app name>
5.查看所有服务状态pm2 list
6.删除服务,和stop不同的是,删除后不会存在list列表中。pm2 delete < id>
7.删除所有服务pm2 delete all
8.如果遇到稀奇古怪的问题可以使用pm2 kill慎用,会杀死所有服务,守护进程也会杀掉好像,和delete的区别不清楚。
9.高大上的监控界面,目前只知道用来看日志。pm2 monit
其他用法还不清楚。然后就是配置文件:
1234 ...
git的使用
看了几篇很好的文章,分享一下,git我都是当svn用的。就是 add . commit push.
入门 :git新手入门,介绍Git的基本概念。
Git的奇技淫巧
:git的常用语法。
更优雅的使用Git:更规范的使用git。
node的多进程
现行的软件架构主要有两种:多线程单进程(如:memcached、redis、mongodb等)和单线程多进程(nginx、node)。多线程单进程的主要特点:
快:线程比进程轻量,它的切换开销要少很多。进程相当于函数间切换,每个函数拥有自己的变量;线程相当于一个函数内的子函数切换,它们拥有相同的全局变量。
灵活: 程序逻辑和控制方式简单,但是锁和全局变量同步比较麻烦。
稳定性不高: 由于只有一个进程,其内部任何线程出现问题都有可能造成进程挂掉,造成不可用。
性能天花板:线程和主程序受限2G地址空间;当线程到一定数量后,即使增加cpu也不能提升性能。
单线程多进程的主要特点:
高性能:没有频繁创建和切换线程的开销,可以在高并发的情况下保持低内存占用;可以根据CPU的数量增加进程数。
线程安全:没有必要对变量进行加锁解锁的操作
异步非阻塞:通过异步I/O可以让cpu在I/O等待的时间内去执行其他操作,实现程序运行的非阻塞
性能天花板:进程间的调度开销大、控制复杂;如果需要跨进程通信,传输数据不能太大。
虽然实际上node.js也不完全是单线程,只有js代码是单线程的而已,I/O等操 ...
所以get和post到底有区别吗?
如题http://www.cnblogs.com/logsharing/p/8448446.html
说白了就是语义区别,和大家的约定,你可以不按套路来鸭。
ps:顺便整理几个问题
POST 和 PUT 有什么区别?POST 是新建 (create) 资源, 非幂等, 同一个请求如果重复 POST 会新建多个资源. PUT 是 Update/Replace, 幂等, 同一个 PUT 请求重复操作会得到同样的结果.
ps: 表面来看 post类似于mysql的insert,put类似于update呗?
cookie 与 session 的区别? 服务端如何清除 cookie?主要区别在于, session 存在服务端, cookie 存在客户端. session 比 cookie 更安全. 而且 cookie 不一定一直能用 (可能被浏览器关掉). 服务端可以通过设置 cookie 的值为空并设置一个及时的 expires 来清除存在客户端上的 cookie.
什么是跨域请求? 如何允许跨域?出于安全考虑, 默认情况下使用 XMLHttpRequest 和 Fetch 发起 HTTP 请 ...
网络安全之openssl
客户端和服务端的数据传输如果不加密就会被别人截取而泄露数据。对于开发者而言,加密和解密最好是放在传输层,而应用层的数据处理仍然是透明的。node在网络安全提供了,tls、https、crypto三个模块。tls类似net、https是http安全版。crypto提供了SHA1、MD5等加密算法。
TLS/SSL 结构node底层采用的是openssl实现TSL/SSL的,所以可以使用openssl生成公钥和私钥。
1.下载安装openssl我是在http://slproweb.com/products/Win32OpenSSL.html 下载windows安装包。然后配置环境变量。然后随便在一个地方打开cmd命令提示符,输入openssl就可以进入生成秘钥操作。2.生成私钥。
1234//生成服务器私钥genrsa -out server.key 1024//生成客户端私钥genrsa -out client.key 1024
上面生成了两个1024位长的RSA私钥文件。当前操作目录下会有server.key 和 client.key3.生成公钥
123rsa -in server.k ...
一个很有意思面试题
原文链接:https://zhuanlan.zhihu.com/p/25407758
看了下知乎上某位大佬分享的一个题,我自己分析一下:
1234567for (var i = 0; i < 5; i++) { console.log(i);}
上面这行代码明显是直接打印出 0-4,以下为chrome控制台复制的打印结果:
1234567891011column.raven.bcd2ad0d66eba703dd35.js:1 0column.raven.bcd2ad0d66eba703dd35.js:1 1column.raven.bcd2ad0d66eba703dd35.js:1 2column.raven.bcd2ad0d66eba703dd35.js:1 3column.raven.bcd2ad0d66eba703dd35.js:1 4
然后开始第一次进化:1234567891011for (var i = 0; i < 5; i++) { setTimeout(function() { console.log( ...