1.debug日志打印模块
主要实现功能:带命名空间(模块名)、时间戳、色彩输出日志;将日志写入文件;浏览器端使用;格式化函数;支持自定义方法。
实现思路:通过环境变量设置配置项如是否启用有彩色输出、设定打印方法、设定命名空间(模块名);
也可以通过require("debug").enable(namespace)添加命名空间,require("debug").enabled.useColors是否启用有彩色输出,require("debug").enabled.log自定义打印方法,require("debug").enabled.color社会颜色1|2|3|4|5|6,exports.formatters.a=function(){}添加格式化函数
2.使用:默认使用process.stderr('%s',"error")标准错误输出,替换%s字符
require("debug").enable("app") // 添加待测试模块 var debug=require("debug")("app") // 选择测试模块 debug("%o funciton(){}") // 打印日志
3.源码:服务器端启动文件为node.js,通过node.js加载debug.js
node.js
// package.json约定node.js为入口文件 var tty=require('tty'); var util=require('util'); exports=module.exports=require('./debug'); exports.log=log; // 带色彩打印消息 exports.formatArgs=formatArgs; // 更新process.env.DEBUG环境变量 exports.save=save; // 待测试的模块通过环境变DEBUG量赋值 exports.load=load; // 是否开启带颜色打印消息 exports.useColors=useColors; // 颜色码 exports.colors=[6, 2, 3, 4, 5, 1]; /** * The file descriptor to write the `debug()` calls to. * Set the `DEBUG_FD` env variable to override with another value. i.e.: * * $ DEBUG_FD=3 node script.js 3>debug.log */ var fd=parseInt(process.env.DEBUG_FD, 10) || 2; var stream= 1===fd ? process.stdout :// 标准输出 2===fd ? process.stderr :// 标准错误输出,默认 createWritableStdioStream(fd);// 流式写入文件 // 是否开启带颜色输出 function useColors(){ var debugColors=(process.env.DEBUG_COLORS || '').trim().toLowerCase(); if ( 0===debugColors.length ){ return tty.isatty(fd); }else{ return '0'!==debugColors && 'no'!==debugColors && 'false'!==debugColors && 'disabled'!==debugColors; } } // util.inspect(obj,showHidden,depth,color)方法将对象转换为字符串, // showHidden显示更多数据,depth递归的层数,color设置颜色 var inspect=( 4===util.inspect.length ? // node <= 0.8.x function (v, colors){ return util.inspect(v,void 0,void 0,colors);// } : // node > 0.8.x function (v, colors){ return util.inspect(v,{colors:colors}); } ); // 类型不是字符串时,使用util.inspect方法转化成字符串后输出 exports.formatters.o=function(v){ return inspect(v,this.useColors).replace(/\s*\n\s*/g, ' '); }; // 带色彩打印消息 function formatArgs() { var args=arguments; var useColors=this.useColors; var name=this.namespace; if ( useColors ){ var c=this.color; args[0]=' \u001b[3'+c+';1m'+name+' ' +'\u001b[0m' +args[0]+ '\u001b[3'+c+'m'+' +'+exports.humanize(this.diff)+'\u001b[0m'; }else{ args[0]=new Date().toUTCString()+' '+name+' '+args[0]; } return args; } /** * Invokes `console.error()` with the specified arguments. */ function log(){ return stream.write(util.format.apply(this,arguments)+'\n'); } // 更新process.env.DEBUG环境变量 function save(namespaces){ if ( null==namespaces ){ delete process.env.DEBUG; }else{ process.env.DEBUG = namespaces; } } // 待测试的模块通过环境变DEBUG量赋值 function load(){ return process.env.DEBUG; } /** * Copied from `node/src/node.js`. * * XXX: It's lame that node doesn't expose this API out-of-the-box. It also * relies on the undocumented `tty_wrap.guessHandleType()` which is also lame. */ // 写入文件 function createWritableStdioStream (fd){ var stream; var tty_wrap=process.binding('tty_wrap'); // Note stream._type is used for test-module-load-list.js switch (tty_wrap.guessHandleType(fd)) { case 'TTY': stream = new tty.WriteStream(fd); stream._type = 'tty'; // Hack to have stream not keep the event loop alive. // See https://github.com/joyent/node/issues/1726 if (stream._handle && stream._handle.unref) { stream._handle.unref(); } break; case 'FILE': var fs = require('fs'); stream = new fs.SyncWriteStream(fd, { autoClose: false }); stream._type = 'fs'; break; case 'PIPE': case 'TCP': var net = require('net'); stream = new net.Socket({ fd: fd, readable: false, writable: true }); // FIXME Should probably have an option in net.Socket to create a // stream from an existing fd which is writable only. But for now // we'll just add this hack and set the `readable` member to false. // Test: ./node test/fixtures/echo.js < /etc/passwd stream.readable = false; stream.read = null; stream._type = 'pipe'; // FIXME Hack to have stream not keep the event loop alive. // See https://github.com/joyent/node/issues/1726 if (stream._handle && stream._handle.unref) { stream._handle.unref(); } break; default: // Probably an error on in uv_guess_handle() throw new Error('Implement me. Unknown stream file type!'); } // For supporting legacy API we put the FD here. stream.fd=fd; stream._isStdio=true; return stream; } // 待测试的模块通过环境变DEBUG量赋值 exports.enable(load());
debug.js
// 使用前需要调用require("debug").enable(namespace)添加待测试模块,debug函数方可用 // 因此可用于区分开发环境和线上环境,开发环境用enable函数开启测试功能,线上则否 exports=module.exports=debug; // 若为错误,返回错误的堆栈信息或错误消息,否则原样输出 exports.coerce=coerce; // 更新process.env.DEBUG环境变量,没有清空exports.skips、exports.names忽略和待测试模块队列 exports.disable=disable; // exports.names、exports.skips添加待测试模块及忽略模块 exports.enable=enable; // 待测试的模块返回真值,其余返回否,exports.skips需要忽略的模块 exports.enabled=enabled; exports.humanize = require('ms'); exports.names=[];// 需要测试的模块 exports.skips=[];// 需要忽略的模块 // 以小写字母作为键(o存储非字符串时的格式化函数),存储debug函数打印信息的格式化函数 // require("debug").formatters={a:function(str){return str.replace(/%/,"")}} // var debug=require("debug").debug("app") // debug("%123") 将打印app 123 +0ms exports.formatters={}; var prevColor=0;// exports.colors起始位 var prevTime;// 缓存上次执行的时间 // 获取颜色码 function selectColor(){ // 取余数,选择颜色码,用以拼接颜色字符串"\u001b[3"+"6|2|3|4|5|1" return exports.colors[prevColor++ % exports.colors.length]; } // 参数namespace为模块名,返回函数,用于打印消息 function debug(namespace){ function disabled(){ } disabled.enabled=false; function enabled(){ var self=enabled; // 计算执行时间 var curr=+new Date(); var ms=curr-(prevTime || curr); self.diff=ms; self.prev=prevTime; self.curr=curr; prevTime=curr; if ( null==self.useColors ) self.useColors=exports.useColors();// 是否开启带颜色输出 if ( null==self.color && self.useColors ) self.color=selectColor();// 颜色码6|2|3|4|5|1 var args=Array.prototype.slice.call(arguments); args[0]=exports.coerce(args[0]);// 处理错误(返回错误堆栈或错误消息) // exports.formatters.o方法,类型不是字符串时,使用util.inspect方法转化成字符串后输出 if ( 'string'!==typeof args[0] ){ args=['%o'].concat(args); } var index=0; // match匹配项,format括号内匹配项,没有匹配项将不执行回调函数 args[0]=args[0].replace(/%([a-z%])/g, function(match,format){ // %% 起始原样打印 if ( match==='%%' ) return match; // %[a-z] 起始,且exports.formatters存在相应格式化函数,执行格式化、替换前两项后输出 index++; var formatter=exports.formatters[format]; if ( 'function'===typeof formatter ){ var val=args[index]; match=formatter.call(self, val); args.splice(index, 1); index--; } return match; }); // 带色彩打印消息 if ( 'function'===typeof exports.formatArgs ){ args=exports.formatArgs.apply(self, args); } // enabled.log用户自定义打印方法; exports.log利用stream流打印消息 var logFn=enabled.log || exports.log || console.log.bind(console); logFn.apply(self,args); } enabled.enabled=true; // 倘若namespace为待测试模块,fn引用enabled函数,否则引用disabled函数 var fn=exports.enabled(namespace) ? enabled : disabled; fn.namespace=namespace; return fn; } // 字符串形式设置待测试以及忽略的模块,多个模块以空格分割,忽略的模块以"-"起始 // 将模块的正则式推入exports.names或exports.skips中 function enable(namespaces){ exports.save(namespaces);// 更新process.env.DEBUG环境变量 var split=(namespaces || '').split(/[\s,]+/); var len=split.length; for ( var i=0; i<len; i++ ){ if (!split[i]) continue; // ignore empty strings namespaces=split[i].replace(/\*/g, '.*?'); if (namespaces[0] === '-'){ exports.skips.push(new RegExp('^'+namespaces.substr(1)+'$')); }else{ exports.names.push(new RegExp('^'+namespaces+'$')); } } } // 没有清空exports.skips、exports.names忽略和待测试模块队列,函数的意义何在??? function disable() { exports.enable(''); } // 待测试的模块返回真值,其余返回否,exports.skips需要忽略的模块 function enabled(name){ var i,len; for ( i=0, len=exports.skips.length; i<len; i++ ){ if ( exports.skips[i].test(name) ){ return false; } } for ( i=0, len=exports.names.length; i<len; i++ ){ if ( exports.names[i].test(name) ){ return true; } } return false; } // 若为错误,返回错误的堆栈信息或错误消息,否则原样输出 function coerce(val){ if ( val instanceof Error ) return val.stack || val.message; return val; }
4.存疑:日志输出为文件,客户端使用
相关推荐
在日常的开发和使用中,我们经常需要借助各种小工具来提高工作效率,例如快速启动常用的应用程序、管理文件等。一个简单但功能强大的集成工具箱可以帮助用户快速访问、启动并管理程序。今天,我们将以Python为基础,结合Tkinter和Win32API,开发一个类似Windows快捷方式的工具箱应用,能够让你轻松集成各种常用程序并一键启动
django自建博客app
《基于YOLOv8的智慧校园实验室高压灭菌锅安全联锁系统》(包含源码、可视化界面、完整数据集、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计
用于hifi测序数据的基因组组装程序
Microsoft Access 2010 数据库引擎可再发行程序包AccessDatabaseEngine-X64解压后的文件AceRedist
从大模型、智能体到复杂AI应用系统的构建——以产业大脑为例
自然语言处理之TF-IDF算法与TextRank算法的缠绵_textrank,tf-idf和两者的组合-CSDN博客.html
内容概要:2023版《科学智能 (AI4S)全球发展观察与展望》阐述了AI for Science(AI4S)在全球范围内的最新进展及其对科学和工业的深远影响。文章首先回顾了AI4S在过去一年中的快速发展,特别是在药物研发、材料科学、地质学、污染治理等多个领域的应用实例。AI4S通过结合深度学习、机器学习和其他AI技术,加速了从基础研究到实际应用的转化过程。例如,在药物研发中,AI4S帮助科学家克服了“反摩尔定律”的挑战,提高了新药研发的成功率;在材料科学中,AI4S实现了复杂材料的高效模拟,如人造钻石、石墨烯、碳纳米管等;在地质学中,AI4S通过模拟地球内部结构和物理过程,为地震学研究提供了新视角。此外,文章还探讨了大语言模型(LLMs)与科学方法的结合,指出LLMs不仅能辅助科学研究,还能生成新的科学假设并进行逻辑推理。 适合人群:具备一定科研背景或对AI技术感兴趣的科研人员、工程师、政策制定者及高校师生。
这个数据集包含了日常步数统计、睡眠时长、活跃分钟数以及消耗的卡路里,是个人健康与健身追踪的一部分。 该数据集非常适合用于以下实践: 数据清洗:现实世界中的数据往往包含缺失值、异常值或不一致之处。例如,某些天的步数可能缺失,或者存在不切实际的数值(如10,000小时的睡眠或负数的卡路里消耗)。通过处理这些问题,可以学习如何清理和准备数据进行分析。 探索性分析(发现日常习惯中的模式):可以通过分析找出日常生活中的模式和趋势,比如一周中哪一天人们通常走得最多,或是睡眠时间与活跃程度之间的关系等。 构建可视化图表(步数趋势、睡眠与活动对比图):将数据转换成易于理解的图形形式,有助于更直观地看出数据的趋势和关联。例如,绘制步数随时间变化的趋势图,或是比较睡眠时间和活动量之间的关系图。 数据叙事(将个人风格的追踪转化为可操作的见解):通过讲述故事的方式,把从数据中得到的洞察变成具体的行动建议。例如,根据某人特定时间段内的活动水平和睡眠质量,提供改善健康状况的具体建议。
框架结构天城商业办公楼5200平米(建筑图 结构图 计算书 开题报告 任务书 文献翻.zip
柴油机连杆加工工艺及夹具设计.zip
读书网首页的HTML信息
文字渐变颜色代码生成器:让文字绽放多彩魅力,演示:在信息交流日益丰富的今天,个性化的文字展示成为吸引目光的关键。这款文字渐变颜色代码生成器,便是为满足这一需求而生的绿色软件,无需安装,便捷实用。 它的操作极为简便。用户只需在软件界面中输入想要转换的文字内容,接着从丰富的色彩选项里挑选心仪的起始颜色与结束颜色,随后轻轻按下 “转换按钮”,神奇的事情就此发生 —— 适用于论坛、网页、QQ 空间等多种平台,以及自定义格式的渐变颜色代码便会即刻生成。不仅如此,生成的代码还能自动复制到剪切板,极大地节省了用户手动复制的时间。当你在论坛回帖、更新网页内容或是装扮 QQ 空间时,只需轻松粘贴代码,原本单调的文字瞬间就能拥有绚丽的渐变色彩,瞬间脱颖而出,为你的表达增添独特魅力,让文字不再平凡,轻松成为视觉焦点。 一款可以轻松把一段文字生成渐变颜色代码的绿色软件,当你在软件中输入完要转换的文字后,只需要挑选自己喜欢的起始颜色、结束颜色后,按一下―转换按钮即可生成相应的论坛/网页/QQ空间以及自定义格式代码,并且代码可以自动复制到剪切板中,回帖时直接粘贴代码即可不错得文字代码生成器,让你得文字更加漂亮.
1.【锂电池剩余寿命预测】Transformer锂电池剩余寿命预测(Matlab完整源码和数据) 2.数据集:NASA数据集,已经处理好,B0005电池训练、B0006测试; 3.环境准备:Matlab2023b,可读性强; 4.模型描述:Transformer在各种各样的问题上表现非常出色,现在被广泛使用。 5.领域描述:近年来,随着锂离子电池的能量密度、功率密度逐渐提升,其安全性能与剩余使用寿命预测变得愈发重要。本代码实现了Transformer在该领域的应用。 6.作者介绍:机器学习之心,博客专家认证,机器学习领域创作者,2023博客之星TOP50,主做机器学习和深度学习时序、回归、分类、聚类和降维等程序设计和案例分析,文章底部有博主联系方式。从事Matlab、Python算法仿真工作8年,更多仿真源码、数据集定制私信。
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。
Android项目原生java语言课程设计,包含LW+ppt
配套文章:https://blog.csdn.net/gust2013/article/details/146909670?spm=1001.2014.3001.5502
《基于YOLOv8的智慧社区儿童游乐设施安全监测系统》(包含源码、可视化界面、完整数据集、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计