自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(65)
  • 收藏
  • 关注

原创 日志按不同类型记录到不同文件

当然日志在一个文件中的话,可以清晰的展示事件时序,包括信息类的和告警类的,不同类型的日志存在不同文件,也另有优点,可以专门查看错误日志,各有优势,具体视业务场景和运维需求而定。log4js是很好用的日志模块,提供丰富的日志功能。不仅可以在一个文件里记录不同类型的日志,也能支持配置多个日志文件用于记录不同类型的日志。以下nodejs例程实现日志按不同类型记录到不同文件。注意:例程中日志文件存于logs文件夹下。

2024-05-22 17:27:53 142

原创 ipv4的掩码长度到掩码地址转换

啊,这个是JavaScript语言的锅,在JavaScript里位操作是按32位二进制操作的,1左移32位的话,还会变成1,而不是期待的2**32,虽然用比较判断,添加些逻辑也可以用位操作搞,不过代码就更复杂了,也不清晰明了,感觉纯属添乱了。ipv4的地址用32位二进制数表示,为了显示方便,一般是按4段十进制数表示,每段取值范围是0-255,对应二进制数00000000-11111111。掩码的IP地址用二进制表示的话,看起来很直观,掩码就是一个32位的二进制数,掩码长度就是它从左到右的连续的1个个数。

2024-05-21 11:35:51 113

原创 前端输入IPv4地址的方法

最简单的是4个input框,中间隔着3个点,要做下输入检查,确保每个编辑框里输入的是0到255之间的数字,是否允许带前导0视用户要求而定。网上有很多朋友用vue做出来了ipv4地址输入框,不过需要导入vue组件,其他的js实现方式估计也能搜到一些,这样可以在html里直接用,不过我个人不推荐在这个ip地址栏的地方使用别人造的轮子,主要原因是要引入非必要的js代码,可能存在一些bug或者安全风险。在前端页面输入ipv4地址的场景很常见,实现方式不一样,编码难易程度不一样,实现效果不一样,用户体验也不一样。

2024-05-20 16:43:29 219

原创 axios post和get写法的区别

注意啊,post传query参数的话,params参数是放在axios.post()调用参数中的第三项config参数中,第二项是body参数,没有的话,要用{}标识。而在get传query参数时,params参数是放在axios.get调用参数的第二项config参数中,axios.get是不支持通过body传递参数的。一般来说get通过query串传递参数,post除了跟get一样可以query串传递参数外,主要还可以通过body传递参数。调用时,query串可以拼接在url里,类似url?

2024-05-20 10:51:15 100

原创 jQuery元素选择器遍历时的this

1 each()里用this的话,得用function(){}这种形式定义,不能用箭头函数()=>{},因为箭头函数里this不是当前元素,可能是window对象。2 this是html对象,可以取它的属性值,比如checkbox的checked属性,value属性。3 $(this)是jquery对象,可以反复应用元素选择器定位到指定元素。取的是input元素里的value值。取的是label标签里的text内容。html文件里有以下几条复选框数据。

2024-05-17 14:47:41 200

原创 浏览器下载附件流建议

该例程可以直接在新标签页打开链接执行下载,不过这种访问方式被限定为GET,参数包含在url中,不太安全,也有一些长度和字符编码限制。form的target属性设为_blank,可以在新窗口里提交表单,如此可以实现POST方式在新窗口打开url。大文件下载可采用附件流的方式,后端设置一下响应参数,然后以流的方式返回前端。那么能否以POST方式在新标签页打开链接执行下载呢?前端直接浏览器下载最好,不用干预下载过程。

2024-05-16 14:17:01 114

原创 JavaScript中的多值匹配检查

前面介绍过VBScript里的多值匹配检查方法,包含条件表达式,数组项匹配,正则表达式等方式,这些方法在JavaScript里一样适用,其中数组方式在匹配项较多的情况下更适用。

2024-05-15 14:38:18 80

原创 历史文件清理

应用系统中可能会被要求保存一些文件记录,比如配置文件修改的备份,日志文件,备份文件。不过历史文件不一定是要求永久保留的,一般会有合规要求和业务要求,超过一定期限的可以删除,以释放空间,提高查询检索效率。下面的例程中,ftp下用户目录的文件夹按15天以上清理,filezilla服务器配置文件users.xml的备份文件按5天以上清理,上传文件临时目录按8小时以上清理。这个历史文件清理可以做成定时任务,将各种需要清理的文件分类,根据不同的文件生命周期要求进行清理。

2024-05-12 10:26:47 269

原创 VBScript字符串赋值注意事项

单引号’在VBScript里是注释符,不过如果要放在字符串里的话,直接写在双引号的字符串里就可以,跟其他字符比起来,并不特殊。因为VBScript用双引号当转义符感觉有些怪怪的,不像其他语言里的转义符那样合理。双引号如果要放在字符串里,则需要处理一下,可以用连续的两个双引号""的表示。字符串拼接中包含双引号的,还可以用chr(34)表示一个只包含"的字符串。字符串拼接可以用加号+或者与号& 不过有些区别。VBScript中字符串是用双引号"来包裹。&号还可以支持字符串或数字的拼接。

2024-05-11 22:42:58 259

原创 接口错误处理

如果需要重新传输的话,需要定义一下重传策略,比如几分钟之后再次尝试,尝试几次,这几次之间时间间隔是怎样的。或者保存到需要重传的队列中,定时重传或者人工调用时重传。现在应用开发中,大量的数据交互是通过web接口传输的,而系统外部的接口存在大量不可控因素,不一定都处于长期可用状态,某一时刻,访问接口传数据出错怎么处理呢?这个不好给出固定的对策,要跟数据源提供方和使用方共同确定,其实应该是数据owner说了算。下面给一个例子,重传队列持久化到本地json文件,计划任务重传,也支持接口调用重传。

2024-05-10 17:25:05 237

原创 应用访问多个DB的方法

开发一般还可以尝试使用mysql的FEDERATED引擎,开启FEDERATED引擎后,在远程DB中创建连接用户并授权库表权限,然后在本地DB中使用FEDERATED引擎连接远程DB创建表,之后就可以像访问本地DB库表一样操作远程DB的库表。应用开发一般情况只会使用一个DB视图(多DB集群同步复制的可以视为一个DB,它们之间的数据同步策略可以由DBA来配置,跟开发人员无关),如果需要访问其他应用的DB,不建议直接连到DB操作,而是通过封装好的web服务接口来访问。

2024-05-10 15:25:08 222

原创 VBScript与文件的编码

VBScript源码里如果有汉字串,那么它应该是ansi编码的,你从文件里得到的相应内容如果是其他编码的,比如utf-8的,如果要进行比较,那么需要转换成同样的编码,或者干脆要求提供内容的源文件也是ansi编码的,免得在脚本中还要处理编码转换。注意了,此处Charset的默认值是Unicode,例程中设置的是GBK而不是ansi 因为ansi并不是一个特定的编码格式,windows环境下的不同语言的版本下可能不一样,比如中文简体的ansi可能是GBK,而中文繁体下ansi可能是Big5。

2024-05-08 12:52:38 272

原创 VBScript中的多值匹配检查

实际场景中有这样一个需求,判断某个对象的某个属性,如果它的字符串值中包含某些特定的字符串,那么要进行开始过程A,否则开始过程B。逻辑是对的,不过每多一个匹配条件,在语句中要加一个or项,用于防御性编程是OK的,一般情况是不推荐这样写的,改成下面这样怎样呢。嗯,这下似乎可以满意了,虽然代码看起来多了一些,不过配置参数和功能逻辑分离是一个好的编程习惯。数据放在代码里还是不好,把匹配值移到同文件夹下的配置文件params.json中。不过这样用字符串数组匹配还不够优化,可以考虑用正则表达式匹配。

2024-05-07 13:06:11 228

原创 json转excel

前面有介绍过excel文件转换成json文件的方法,那json文件转excel文件呢?如果json文件里数据格式都是统一的话,那么也比较容易就转。在项目文件夹下有待转换json文件,转出的xlsx文件也存放在此,这样就可以执行以下命令转换json文件到excel文件了。

2024-05-03 10:30:24 546 1

原创 npm许可证检查

我们作为开源软件的受益者,即使可能还不能算开源的贡献者,遵守开源软件许可证协议是最基本要求,也是道德底线。开源软件的许可有很多种,公认的可能都超过80种,比较常见的MIT,BSD,Apache,GPL,Mozilla等,有些是要求如果你的项目包含了使用了该许可的软件,那么你的项目也要开源,比如GPL许可,所以GPL也被称为带有传染性,如果你的项目现在不适合开源,不想开源,那么就不要在项目里包含GPL许可的软件,其他许可还好了,大多没有要求开源,你可以认为是比较友好和宽松,没有强制开源的要求。

2024-05-02 20:56:34 597

原创 关于前后端的参数传递

以前端javascript,后端nodejs+express为例,后端可以从前端发来的request里获取这些属性:header、query、url、params、body,其中params和query是从url中解析获得,不过express已帮我们做好了,就不用我们自己再折腾处理url里的这些参数,除了body外,其他位置传递参数的话,后端直接取就可以了,不用再通过解析器来处理,不过由于浏览器对参数长度的限制,参数较多或参数较长的话,就只能通过body来传递参数了,这时候就需要考虑参数的编码和解析了。

2024-05-02 09:51:33 547

原创 关于npm命令

重点来了,虽然仅把依赖包复制到node_modules文件夹下,项目就可以正常运行了,但是最好把弄好的package.json文件也一并放在项目目录中,否则的话,万一不小心手贱在服务器上执行了npm命令,比如npm uninstall,即使访问不到外网,但是删依赖包是可以正常执行的,如果没有package.json文件的话,node_modules下整个文件下的内容都会被咔嚓,是不是坏事了。package-lock.json文件也一样,最好都在,从在线安装这些依赖包的机器上一起复制到目标机器上。

2024-04-30 17:20:22 458

原创 大文件分片上传前端手写

首先是分片,html的file类型input元素可以从本地选择文件,js里可以识别为一个Blob对象,它的方法slice(start, end)可以返回一个新的Blob对象,我们可以把Blob对象添加到formdata里,post到服务器以完成分片上传的功能。实际上并不需要,仍然按start,start+5M,分片blob并不会把实际不足的部分填充,传到服务器上仍然是不足5MB的最后一片。有兴趣的朋友可以思考实现,想设计完成一个能满足大多数用户需求的轮子,着实不易,向无私的开源奉献者致敬。

2024-04-26 14:09:16 493

原创 关于文件上传的前后端优化

假设读写一个分片的开销都是1,那么写入分片读取分片写入目标的开销就是3了,而实际上我们直接写入目标就可以了,代价是1,相当于我们的效率只有1/3,做了2/3的无用功。webuploader在前端分片上传,后端收到的分片存为临时文件,全部传完后,前端发消息到后端执行分片合并,表面上没有毛病,其实我完全是被webuploader给忽悠瘸了,因为分片合并根本就不是必要的!更改后,前后段代码一下子减少了一大半,没有分片合并了,没有合并进度查询了,对服务器空间占用需求也减少了,速度还大幅度提升了。

2024-04-21 15:57:27 440

原创 一种简单的许可证设计

首先肯定需要使用加密方法,输入明文是机器ID和时间范围(就设置下到期时间吧),使用强度较高的密钥和算法(比如aes-256-cbc),也别太高,太高的话影响加解密效率。一般来说系统限制在特定的机器特定的时间段内可用,超出范围应该禁止使用,需要使用的话,要申请许可证,导入许可证后,可以在新的特定范围也可用。许可到期时间,跟当前时间比较,已超期则退出,否则保存到全局变量中。3 参数重新加载时 业务服务比较忌讳启停,许可证替换更新后,可以调用服务的重载参数接口,把全局变量许可到期时间更新下。

2024-04-19 10:38:03 197

原创 大文件上传分片合并java并发开发要点

java的话,不太熟悉去搜的话,一下子能找到很多关于文件操作的类,为了支持从指定偏移量开始写入数据,那么只能使用这个RandomAccessFile,另外好像MappedByteBuffer这个看起来比较高级,但是在文件分片合并场景下并不简明,除了需要维护FileChannel外,还需要在内存中申请分配空间容纳文件分片内容,并发的话,则还需要申请更多的内存,而RandomAccessFile配合流操作,内存资源占用低。多分片并发写入采用线程池,限制一下并发线程数 FixedThreadPool。

2024-04-16 16:39:12 268

原创 webuploader后端开发要点

1 文件(分片)上传 大文件是要分片上传的,不分片的话,受浏览器设置限制,最大似乎2GB,另外从客户端到服务器如果路上有nginx、F5等网关代理转发设施的话,也都会限制文件大小;百度fex团队的webuploader是一个很方便的web页面文件上传轮子,可以很方便地集成到前端html和js里,当然了,后端需要咱们自己开发实现。3 合并进度查询 这个不是必须的,但是为了消减用户传完大文件后的等待焦虑,可以考虑在前端动态展示后端的合并进度,完成后再允许后续操作,否则,用户盲点可能导致后台任务冲突。

2024-04-15 15:37:44 333

原创 iphone连接windows10移动热点问题

以前公司的wifi虽然做了802.1x无线接入认证,不过限制不严,采用的是账号认证,所以手机等无线设备也是可以接入的,后来采用计算机认证,只有加域的电脑才能接入,这下手机不能直接接入了,所幸电脑虽然没有管理员权限,还是可以开启移动热点,这样手机可以通过电脑接入网络,虽然跟电脑一样受上网行为约束,但是像邮件,微信,oa等还是可以使用的,总是省了下数据流量。有类似困扰的朋友,可以参考借鉴下,注意移动热点选2.4GHz,手机wifi不要限制IP地址跟踪,可能就能解决你无线设备接入win10的移动热点了。

2024-04-15 10:39:55 163

原创 MySQL批量修改记录

update语句是不支持批量提交的,不过可以用replace into或者insert into on duplicate key update曲线救国。需要注意的是要在table中定义主键,replace into是对重复记录先删后填加,后者是更改,如果values不全的话,前者会丢失这些信息,后者则保留这些信息。所以推荐采用后一种方法。我们知道MySQL支持批量添加记录,用法也比较简单,不过需要编码需要注意一下,因为很容易搞错。

2024-04-11 17:27:41 284

原创 关于微信公众号开发的“中控服务器”

2 考虑并发锁机制,缓存有效时没有影响,缓存无效时,要访问微信服务器去获取新的access_token,注意这时候一定要进行加锁操作,不然在极端情况下,会造成大量无效操作,甚至返回过期的错误的结果,第一个获得锁的可以访问微信去拿token,其他的得不到锁,等待一段时间后从缓存中获取更新内容。是不是觉得Stable Access token就完全够用了,不用考虑什么中控服务器了,最佳实践是仍然建议构建中控服务器,这样一是可以减少对微信服务器的访问流量,减少网络意外的发生,二是可以突破访问频次的限制。

2024-04-08 14:43:14 265

原创 版本号递增

业务打算对数据进行版本管理,要求版本号从A0开始,每次更新保存为自动生成的后继版本号,0-9A-Z,这样每款数据最多可以支持26*36个版本。

2024-04-08 09:52:40 73

原创 IPv4子网判断

一个IPv4的地址,就是4段0-255之间的数字以.隔开(实际上按二进制的话有效位数是32位),而一个子网的地址则是一个IPV4地址加掩码构成,掩码也是4段0-255之间的数字以.隔开(实际上按二进制的话有效位数是32位,一般说的掩码位数是指32位中从左到右连续1的个数),定义很简单。虽然现在早已经进入IPv6时代,不过IPv4在局域网仍广泛使用,它的定义规则相对简单,本文介绍的是IPv4子网判断的算法。有时候,服务后端需要对客户端的所属组进行判断,以决定何种访问策略权限。

2024-04-03 09:46:17 506

原创 nodejs的express负载均衡

一般有两种方式来解决,一种是利用nodejs的cluster模块创建多个子进程来处理请求以充分利用cpu的多核,还有一种是nodejs运行多个服务分别监听在不同的port,利用nginx创建一个upstream池,来分发请求到nodejs的不同服务端口来处理。由于我们是要负载均衡express,涉及到用户的会话保持就很重要,不然原先建立请求的是进程A,下次请求转到进程B处理,进程B没有之前用户在进程A的上下文信息,那么处理就会出现问题。这样会话保存在redis中,不同进程可以共享session信息。

2024-04-02 09:43:42 806

原创 动态加载json文件

nodejs有多种方法读取json文件,包含同步和异步方式,一般情况下我们主要用同步方式,除非json文件很大,我们还希望在加载json文件同时进行其他操作,这时可以采用异步操作,此时需要注意后续的操作依赖json加载完成的话,需要做一下异步并发控制,比如多个大json文件加载,可以用promise.all()来搞搞。如果await的话,其实跟sync操作其实也没有多大区别。比如定时从一个系统中导出数据到json文件,另外一个系统定时从json文件里导入数据,这两个系统本身不需要有接口和网络连接。

2024-04-01 11:25:08 301

原创 前端网页之间传递参数

由于localStorage同域名下是本地全局级的,也就是说它不适用同一客户端的多实例,因为当你已经打开了一个赋值页面并进行了一次赋值,尚未跳转到获值页面,再在第二个标签页再次打开赋值的页面并进行了一次赋值,实际上会将你之前赋过的值覆盖掉,这样你再在第一个标签页进入获值页面,那么它获取的实际上是最后一次的赋值,也就是说它是不支持多赋值并行的。在多页面应用中,我们可能面临着前端页面之间传递参数的情况,在一个页面获取到一些参数信息后,到另一个页面去进行后续处理,需要将前一个页面得到的一些参数带到第二个页面。

2024-03-29 15:23:24 326

原创 三维坐标系中的三阶魔方旋转

我们可以定义从某层正向看小方块数组序0-8对应色块中心坐标为(-1,-1),(0,-1),(1,-1),(-1,0),(0,0),(1,0),(-1,1),(0,1),(1,1)。那么它们的内层这两个坐标跟外层是一样的,不同的是表示层的另一个坐标。如果只是画出转完后的状态,那非常简单,但是没有旋转的过渡效果,视觉体验是比较差的,为此,我们可以加入一些旋转中间状态的图形,比如15度,30度,45度,60度,75度,这样旋转的过程就更富有动画感,平滑过渡,而不是像变魔术一样,闪变成目标状态。

2024-03-28 10:33:14 290

原创 log4js里numBackups设置存在无效的情况

后记:估计是找到原因了,日志文件创建和删除的逻辑跟我想象的不一样:在同一个进程实例中,日志是按这个逻辑执行的,如果进程实例重新执行,那么硬盘上已经存在的文件跟这个numBackups设定就没有什么关系了,它只管本次这个实例创建的日志文件。按照文档介绍numBackups是允许的旧日志文件数量,实际使用中,确实有些配置是按这个定义表现的,但是也存在没有按这个定义表现的,我看了半天没有发现有什么区别,奇怪了。记录下备忘,node版本v20.12.0 LTS log4js版本6.9.1。

2024-03-27 21:44:04 322

原创 JS二维数组行列互换与一维化

多维数组一维化有一个函数flat(),挺好。那么二维数组行列互换后再一维化呢,用下面这段代码?

2024-03-22 17:03:17 131

原创 邮箱验证码登录

登录采用邮箱验证码方式,用户输入邮箱,点击发送验证码,app调用webwrite向后端web接口请求发送验证码,在邮箱中查收验证码后,在验证码栏输入验证码,点击登录按钮,调用webwrite向后端web接口发起验证,获取返回成功消息后,登录成功,关闭登录窗,进入功能窗,否则提示返回信息,继续停留在登录窗口。本文介绍的邮箱验证码方案比较简单通用,客户端开发只要支持http访问即可实现,不限于matlab,其他各种软件环境其实也没与多大区别。加入了下发送邮件频次的限制,每个客户端每分钟只能请求一次邮箱验证码。

2024-03-20 13:03:28 531 1

原创 el-table原始列表转换成树形数据

element-ui的el-table可以显示树形数据,不过对数据格式有要求,只有带children属性的行才能树形展开和收起,假设原始数据是json列表,数据已经按colx排序,我们希望在el-table中同colx值得只显示一条,有多条数据的可以树形展开和收起。下面我们用js来实现,该转换功能在node后端或者javascript前端都可以。

2024-03-19 19:29:34 555

原创 nginx的简单web接口配置

不过有不少朋友以为这套操作是标准的,唯一的,其实就误了,手头没有openwrt路由器就安装vmware+openwrt虚拟机,这个空间不会太小,耗时耗力。其实解锁SSH原理是利用小米换机助手,需要的两个条件一是不带DHCP的无线AP,二是一个WEB接口,我自己就是用nginx简单配了个接口就把手里的几台CR6606 CR6609给解锁SSH了。下面是openwrt的 Luci – Web定义的一个接口,如果熟悉小米路由器AX6000解锁SSH的朋友可能有印象了。是不是简洁了很多呢。

2024-03-17 21:41:18 189

原创 浏览器自动化的扫码或验证码处理

Selenium是一个浏览器器自动化的神器,能自动完成一些简单重复的浏览器工作,比如打开网址,对页面特定元素进行特定操作,截图。网页中图片的获取有多种方法,Selenium可以截图,不过区域是整个网页,虽然后面可以再抠图,不过没有必要,也可以找到img的src,如果是图片文件那么可以按源路径再抓文件下来,不过这个也不一定好,因为有可能脱离浏览器的http get会遇到一些麻烦,我比较推荐的一个方法是通过js处理一下,将img在canvas中重绘,保存为base64编码。

2024-03-16 13:03:28 211

原创 python实现一个网页缓存服务接口

我们暂不考虑这么完整的方案,先把文章正文和图片抓下来保存,至少可以本地看到文本内容和图片,至于其他的部分,大家可以自行脑补加上。文章抓取完后,会返回本地文章路径,当然这个路径如果绑定了某web服务器的静态路径,也可以把该web静态路径替换在源码中,浏览器可以直接访问打开了。

2024-03-15 09:10:37 217

原创 python处理一个双色球问题(二)

前一篇文章给出了一个反向算法,本章给出一个正向的算法。并且增加了多进程处理,并给出按中奖等级和次数排序的top100个注号的文本文件。

2024-03-14 10:39:21 153

原创 python处理一个双色球问题(一)

先说下空间占用,如果是打算用文本文件存放统计结果,那么每种组合假设占14个字符,每级奖的中奖次数占4个字符(到2024-3-13为止开了1683期),6级奖占24个字符,那么得38个字符,不算换行符的话,总计得六百多兆字节了。中国福利彩票双色球游戏规则:双色球投注区分为红色球号码区和蓝色球号码区,红色球号码区由1-33共三十三个号码组成,蓝色球号码区由1-16共十六个号码组成。算法可以正向和反向,正向是枚举所有组合,在所有开奖信息中查每个组合得中奖情况,反向是根据每期开奖信息,查出所有中奖组合。

2024-03-13 13:28:20 226

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除