本文总结常见的使⽤node操作redis服务,redis的key是唯一的,如果一个key所对应的存储类型是string,则不能再次覆盖式设置key为hash;
docker run -d --name redis -p 6379:6379 redis:2.8
const redis = require('redis');
const client = redis.createClient( 6379, '127.0.0.1');
const util = require('util');
client.set('hello', 5, function(err, obj) {
client.incr('hello', function(err,data) {
client.get('hello', function(err,data) {
console.log(data); // 6
})
})
})
var obj = {
name:'sss',
age:223
}
client.hset("test", obj, function(err, obj) {
client.hgetall('test', (err, obj) => {
console.log(`hgetall:${JSON.stringify(obj)}`);
console.log(obj.age);
})
clie
刚刚开始学js,本文是基于node.js和websocket实现一个简单的在线聊天室系统(聊天群)。
本文适合纯小白阅读。
废话不多说,我们正式开始。
在B/S架构中,我们要得到一个数据,要向服务器请求,然后服务器响应。那么如果我们客户端不发送请求,服务器会不会主动给我们的客户端(浏览器)发东西呢?
答案是不会的,客户端和服务器通过TCP/IP协议进行连接,然后通过HTTP协议进行请求连接。而HTTP协议是一个请求—响应式的协议,而且它是一个无状态的协议,即每一次请求—响应之间是没有关系的。
而我们的聊天室需要什么呢?
1.发送消息 2.接收消息
在接收消息中:一个客户端给服务器发送消息,服务器接收消息,然后主动发给另一个客户端。
所以HTTP满足不了我们的要求。这里我们就要用到socket协议。当服务器与客户端连接后,两者都会时刻做着收发消息的准备。
首先在npm中下载socket.io模块(之前要安装了node.js才行)。打开cmd。
(我创建了一个node.js chat文件夹,文件都放在这里面)
然后开始写我们的服务器代码,创建文件server.js。
//server.js
var http = require('http');
var fs = require('fs');
var ws = require('socket.io'); //引入socket.io
var server = http.createServer(function (req, res) {
var html = fs.readFileSync('./client.html');
//client.html是发送给客户端的文件(客户端界面)
res.end(html);
}).listen(8000);
var io = ws(server); //http服务与ws服务相关联, 返回io服务实例
//监听用户的连接事件
io.on('connection',function (socket) {
//发生在用户连接io服务器时
console.log('有新用户进入房间');
//消息
$("#startDate").datetimepicker({
format: "yyyy-mm-dd hh:ii",
autoclose: true,
todayBtn: true,
pickerPosition: (App.isRTL() ? "bottom-right" : "bottom-left"),
minuteStep: 10
}).on('change',function(ev){
var startDate = $('#startDate').val();
$("#returnDate").datetimepicker('setStartDate',startDate);
$("#startDate").datetimepicker('hide');
});
$("#returnDate").datetimepicker({
format: "yyyy-mm-dd hh:ii",
autoclose: true,
todayBtn: true,
pickerPosition: (App.isRTL() ? "bottom-right" : "bottom-left"),
minuteStep: 10
}).on('change',function(ev){
var returnDate = $("#returnDate").val();
$("#startDate").datetimepicker('setReturnDate',returnDate);
$("#returnDate").datetimepicker('hide');
});
————————————————
版权声明:本文为CSDN博主「kevin_zhuzj」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhu
一、为什么要做CMMI认证?
大部分做CMMI认证的企业都是软件公司,这种公司都是做项目开发的,数据管理的,这个时候就出现了我们常听说的程序员,软件公司有开发业务,在完成一个软件产品或实施项目时,常常会出现以下的状况:
1、开发人员不懂客户业务,一个高大上的规划,落地后的软件,只是机械的满足了基本功能,毫无易用性和科学性可言。
2、项目只有简单的里程碑计划,细节处理粗糙,需求不断扩大,工期一再延后。
3、项目需求、设计等由一人跟踪,然后再口述给其他人,最后验收前疯狂补文档,应付验收。一段时间后,这些人离职了,新来的同事看着文档,牛头不对马嘴,完全不知所云。
4、做完了N个类似的项目了,面对一个新项目,大部分工作还得重新开始,无法复用,对公司来讲,资产和经验都没得到积累。
5、项目过程中的问题,没有有效跟踪,还没有解决,就不了了之了。
6、项目过程中的风险,没有有效识别。风险发生后,局面无法控制,后期因为要验收,又草草处理。
以上小编说的现象其实是实际软件开发过程中常见的,最后产出的产品质量可想而知。如果一家企业在做了CMMI认证的情况下,就可以很好地帮助到企业。
二、CMMI的概念核心是什么?
CMMI全称是Capability Maturity Model Integration,即能力成熟度模型集成(也有称为:软件能力成熟度集成模型) ,是美国国防部的一个设想,1994年由美国国防部与卡内基-梅隆大学下的软件工程研究中心以及美国国防工业协会共同开发和研制的。
换句话说,就是给你公司一个软件开发管理可执行的框架,这个框架具有自动性和可扩展性。实行CMMI体系的过程就是改进的过程。最终的目的,就是在保证工期和预算的前提下,输出高质量的软件。
只要按照这个框架执行,我们开发工作每一个环节都有规程和文档为依据,我们的需求、设计、测试各个环节都有评审,变更将得到有效管理,项目成果和经验能得到积累和应用……
大家熟知的信息系统项目管理师和PMP,是两个对个人层面的认证,而CMMI是对企业层面的认证。
三、CMMI体系结构是怎样的?
5个等级。CMMI模型把企业的软件能力成熟度划分为5个等级——第1到第5级。数字越大,成熟度越高
在执行git clone命令时报错:fatal: early EOF。解决办法如下:
关闭压缩
git config --global core.compression 0
然后执行部分clone
git clone --depth 1 <repo_URI>
其中代表你的远程代码仓库地址,这里我的是用https://github.com/dyc87112/SpringBoot-Learning.git。
如果起作用了,clone剩下的代码:
git fetch --unshallow
以后执行常规操作就行了
git pull --all
出错原因应该是git版本的问题,msysgit版本1.8.x导致的,因此另一个解决的办法是使用git早起版本,比如git 版本小于1.8.3。
转载自:https://stackoverflow.com/questions/21277806/fatal-early-eof-fatal-index-pack-failed
查看RestBaseController的源文件
...
protected $allowedDeviceTypes = ['mobile', 'android', 'iphone', 'ipad', 'web', 'pc', 'mac', 'wxapp'];
...
private function _initUser()
{
$token = $this->request->header('XX-Token');
$deviceType = $this->request->header('XX-Device-Type');
...
}
...
前端发送token和机器设备代码已写好,用户登录非常方便
安装步骤如下:
安装 yum install subversion
输入rpm -ql subversion
查看安装位置:
我们知道svn在bin目录下生成了几个二进制文件。
输入 svn --help
可以查看svn的使用方法。
启动svn版本库
svnserve -d -r /home/svn
mkdir -p /home/svn/svnrepos
创建版本库
svnadmin create /home/svn/svnrepos
执行了这个命令之后会在/var/svn/svnrepos目录下生成如下这些文件
进入conf目录(该svn版本库配置文件)
authz文件是权限控制文件
passwd是帐号密码文件
svnserve.conf SVN服务配置文件
设置帐号密码
vi passwd
在[users]块中添加用户和密码,格式:帐号=密码,如dan=dan
设置权限
vi authz
在末尾添加如下代码:
[/]
dan=rw
w=r
意思是版本库的根目录dan对其有读写权限,w只有读权限。
修改svnserve.conf文件
vi svnserve.conf
打开下面的几个注释:
anon-access = read #匿名用户可读
auth-access = write #授权用户可写
password-db = passwd #使用哪个文件作为账号文件
authz-db = authz #使用哪个文件作为权限文件
realm = /var/svn/svnrepos # 认证空间名,版本库所在目录
检查3690端口是否开放
netstat -tln
最近在学习自己搭建SVN服务,意外的报错
svnserve: Can’t bind server socket: Address already in use
于是google了下,原来是 已经启动了SVN 服务了
我们可以按照以下方法解决。
ps -aux | grep svn
kill pid(pid为ps出的pid这样就停止服务了)
我们可以试着重新指定一个端口8081 使用 –list
[ SQL ] SELECT `post`.* FROM `cmf_portal_post` `post` INNER JOIN `cmf_portal_category_post` `relation` ON `post`.`id`=`relation`.`post_id` WHERE `post`.`post_type` = 1 AND `post`.`post_status` = 1 AND `relation`.`category_id` = 5 AND `relation`.`post_id` < 2 AND ( `post`.`published_time` < 1638691195 and `post`.`published_time` > 0 ) ORDER BY `published_time` DESC LIMIT 1 [ RunTime:0.003768s ]
[ EXPLAIN : array ( 'id' => '1', 'select_type' => 'SIMPLE', 'table' => 'post', 'partitions' => NULL, 'type' => 'range', 'possible_keys' => 'PRIMARY,type_status_date', 'key' => 'PRIMARY', 'key_len' => '8', 'ref' => NULL, 'rows' => '1', 'filtered' => '5.55', 'extra' => 'Using where; Using filesort', ) ]
当搜索结果数据为1时,运行时间0.003768s
[ SQL ] SELECT `post`.* FROM `cmf_portal_post` `post` INNER JOIN `cmf_portal_category_post` `relation` ON `post`.`id`=`relation`.`post_id` WHERE `post`.`post_type` = 1 AND `post`.`post_status` = 1 AND `post`.
Response类用于http下载返回信息的类,它有几个子类:TextResponse 、 HtmlResponse 、 XmlResponse
其中 parse(self, response) 中的response就是HtmlResponse 类型的
class scrapy.http.Response(url[, status=200, headers=None, body=b'', flags=None, request=None])
参数说明:这些参数跟上一篇Scrapy详解之Request一样,可以参考,这里不再累赘讲述
属性和方法:
url
str 返回的url
status
int http返回的状态码 如: 200 404
headers
dict 返回headers
若要获取特定的值用get('keyname') getlist('keyname')
get('keyname') : 获取指定key的第一个value值 返回str
getlist('keyname') : 获取指定key的所有value值 返回list
body
byte 返回body,若需要返回unicode版本用 TextResponse.text
request
返回Request对象,具体请参考上一篇Scrapy详解之Request,这里不再累赘讲述
meta
返回meta,具体请参考上一篇Scrapy详解之Request,这里不再累赘讲述
flags
返回请求标志,具体请参考上一篇Scrapy详解之Request,这里不再累赘讲述
urljoin(url)
返回的url链接新的url,返回新的url
print('url:', response.url)
print('new url:', response.urljoin('Zarten'))
follow(url, callback=None, method='GET', headers=None, body=None, cookies=None, meta=None, encoding='utf-8', priority=