自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

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

首先是分片,html的file类型input元素可以从本地选择文件,js里可以识别为一个Blob对象,它的方法slice(start, end)可以返回一个新的Blob对象,我们可以把Blob对象添加到formdata里,post到服务器以完成分片上传的功能。各分片的start,end分别是[0,5M-1],[5M,10M-1],最后一个分片也许不足5M,那么end参数需要设置为准确的值么,比如size-1?大文件分片会很多,当然不要一下子并发将所有分片上传,这样前端会先挂掉,那么并发限制为多少合适呢?

2024-04-26 14:09:16 254

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

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

2024-04-21 15:57:27 414

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

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

2024-04-19 10:38:03 183

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

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

2024-04-16 16:39:12 254

原创 webuploader后端开发要点

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

2024-04-15 15:37:44 325

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

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

2024-04-15 10:39:55 143

原创 MySQL批量修改记录

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

2024-04-11 17:27:41 276

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

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

2024-04-08 14:43:14 244

原创 版本号递增

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

2024-04-08 09:52:40 66

原创 IPv4子网判断

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

2024-04-03 09:46:17 494

原创 nodejs的express负载均衡

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

2024-04-02 09:43:42 775

原创 动态加载json文件

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

2024-04-01 11:25:08 290

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

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

2024-03-29 15:23:24 299

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

我们可以定义从某层正向看小方块数组序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 280

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

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

2024-03-27 21:44:04 303

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

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

2024-03-22 17:03:17 121

原创 邮箱验证码登录

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

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

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

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

2024-03-19 19:29:34 520

原创 nginx的简单web接口配置

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

2024-03-17 21:41:18 182

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

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

2024-03-16 13:03:28 199

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

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

2024-03-15 09:10:37 211

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

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

2024-03-14 10:39:21 149

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

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

2024-03-13 13:28:20 215

原创 excel文件转json

说到文件交互,excel文件就没有这么高大上了,两人都是用excel,那么相互提供excel文件是最适合的,这边用excel文件,那边用的是其他软件或系统,不一定能很好地识别使用excel文件,那么就涉及到文件格式的转换,其实你提供的并不是文件本身,而是要将文件里的数据提供给对方。当然node和python可以很好地处理excel文件,其他软件或系统就不太好说了。就像普通人只发挥其潜能的10%,如果能发挥到100%,就像电影永无止境和超体里的男主女主,已经超脱凡人之躯可以为所欲为了。

2024-03-12 10:05:23 311

原创 用python制作带logo和标签的二维码图片

首先右上,左上,左下3个边角方框形状的标识区域是不能遮挡,总的遮挡面积不超过总面积的三分之一,一般来说都是没问题的,可以正常识别出来。python的第三方库很是丰富,前人造了很多好用的轮子,我们拿来即可使用。制作一张普通的没有啥标识度的二维码图片,显然不能满足我们了,至少要在中间打个logo,在底下再带上一行文字标签,才能方便自己和别人查看。具体原理是先生成一张普通的二维码图片,然后拉伸下,底下留出一块空白区域,将标签文字以特定字体画到该区域,最后把logo图片放在二维码图形的中央区域。

2024-03-12 09:33:30 168

原创 二维码生成与显示

验证码就是让人来识别的,不应该让前端轻易地得到图片内容,要靠人眼识别,当然了,现在自动图片识别也有了,而且识别率也高,速度还快,这样说来图片验证码技术也算有些落伍了。二维码主要是方便让设备识别,提交到后端的是识别后的代码,而且二维码的图片或编码存在后端并没有太大意义,在前端生成就够了,而且二维码并没有加密验证的功能,存到前端也不涉及到泄密。当然了,如果在前端快速直接获取了二维码的文本内容,跳过扫码环节,算不算漏洞呢,是不是应该后端生成前端显示呢,好像也有一定的道理。//生成的二维码图片大小。

2024-03-11 14:14:55 206

原创 验证码图片显示

我们知道svg的图片可以在html里直接显示。这样,后端随机生成一串字符串,和对应的svg代码,把svg代码发送给前端,前端拿到后,把该svg替换到页面中div元素的innerHTML,即可在该div的位置显示svg图片。用户输入识别出来的验证码字符串,提交到后端,后端根据生成时记录的验证码字符串核验用户提交的验证码字符串。有一个npm的轮子svg-captcha,用于生成svg格式的验证码图片,非常好用,用过的都知道,没用过你值得尝试下。//页面加载即显示验证码。//点击图片更新验证码。

2024-03-11 10:36:08 148 1

原创 关于html中的form与submit

需要提交到后端的信息,采用ajax方式传递form的所有元素,data: $(‘#formx’).serialize(),可将原先的type为submit按钮更改为type为buttion的按钮,添加onclick事件函数以提交ajax请求,这样不仅可以保留之前的html风格特性,还可以提交不跳转页面,在页面内,根据服务器的请求处理返回结果做进一步的处理。当然form本身也有不好的地方,比如提交的信息只包含该form中的元素,页内其他元素的值还没有包含在该请求参数中,而采用ajax提交就没有这个限制。

2024-03-10 09:54:49 202

原创 通过webservice接口启动一个蓝凌EKP审批流程

attachmentForms是一个json列表,每一项大概是这样子 { fdKey:“fd_enclosure”,fdFileName:“filename”,fdAttachment:fileimgBase64} 注意文件或者图片是base64编码的,大文件的话就不太适合放在流程附件里了,要传大文件的话,建议将大文件上传到某web服务器上,然后把链接放到formValues 里的某个属性的字符串中。启动审批流程的话,docStatus 得指定"20",当然不指定的话,默认也是"20";

2024-03-09 10:42:15 209

原创 查询表中某属性最大值的行中的其他属性的值

我介绍另外一种方法,在没有索引的情况下,可能查询效率比第一种还高,在DB中只执行一次遍历即可得到结果。为简化,假设我们要查询colx列最大值的那行另外几个属性cola,colb,colc,都是字符串类型,而且其中不包含某个字符比如"$",那么我们可以这样操作。实际上该语句在DB中执行了两次查询,一次遍历取到最大值,一次查询取到最大值的行,当然如果colx列建立的索引了的话,应该能会很快得到结果。这个确实会返回colx最大的行,不过我们知道排序比取最大值的复杂度高,这个的效率比前面那个还低。

2024-03-08 15:51:28 114 1

原创 通过flowable流程的rest api启动一个流程

认证采用Basic HTTP access authentication方式,可以将认证信息写在header中的authentication属性中,大致是这样的,Authorization: Basic [base64编码的"username:password"字符串],也可以直接将账号密码放在url中,https://username:password@flowableserver:port/apipath。一些简单的流程可以不用借助其他应用环境,在flowable-ui里就可以完成。

2024-03-07 14:57:34 257

原创 为邮件中继做一个web接口

一些应用需要发送邮件,可以直接允许这些应用的服务器访问SMTP,自行配置和开发邮件发送的功能界面。还有一种方式是把SMTP封装成web服务,应用以https访问调用接口,这样可以更安全(可以仅允许该接口服务器访问SMTP中继)更有效地管理应用的邮件发送(可以得到详细的邮件发送日志信息用于后续分析)。给需要调用接口发送邮件的各应用服务器分配apikey,以识别发送端,可以增加功能以记录详细的发送日志。应用可以自行定制开发邮件发送界面或无界面,调用接口即可实现邮件发送。

2024-03-07 11:09:30 215

原创 VBScript将字符串保存为UTF-8编码不带BOM的文本文件

后来看到有网友推荐了一个高级玩法,说前面的处理方式是要将整个字符串编码写入两个流,当字符串很长时,有空间和性能的较多开销,可以在文本流中仅写入一个字符,然后Copy到二进制流,然后在二进制流中进行以下操作:设置结尾标识,计算下流长度,然后重新定位到起始位置,更改流类型为文本流,UTF-8编码,然后再定位到第一个字符编码位置后,写入原字符串后面的所有字符信息,然后再定位到起始位置,更改流类型为二进制流,然后写入文件,这样也可以一个得到没有BOM的UTF-8的文本文件了。没有毛病,我也是这样处理的。

2024-03-06 13:34:27 219 1

原创 微软IIS授权的修改

我们什么情况下需要删除一些授权呢,比如FTP根默认授权是所有人可读,假设我们在根下创建了用户目录,需要授予用户读写权限,其他人则不可访问,那么得把从根目录继承下来的所有人可读这个授权给删除掉,图形管理界面当然可以删除,但是脚本中怎么弄呢,微软又没有告诉我们呀。微软的IIS是windows server上的一款后台服务,它包含web服务和FTP服务和管理工具,在域的环境下,可以直接关联域用户,简单易用,至少不像其他web或ftp软件还需要经历创建分配用户账号这个比较头疼的环节。

2024-03-04 10:30:32 313 1

原创 padavan上openvpn客户端证书仅一年有效期的解决方法

一些朋友可能注意到了,在padavan上openvpn的配置界面可以申请证书,并有有效期的选项,CA证书你可以申请10年有效期,而客户端证书有效期你虽然可以申请10年有效期,但是如果你拿到证书去检查下,就会发现仅有1年有效期,实际使用中,一年以内没有问题,超过一年就无法通过认证建立连接了。当然再说明一下,客户端证书有效期一般是比较短,1年很正常,因为时间越长风险越高,到期重新申请即可,当然我们直接给颁发10年期证书,是自己承担安全风险,主要是设备上不给申请这么长时间得证书,我们自己动手实现罢了。

2024-03-04 09:23:37 298

原创 服务及网络资源监测

我们运行的系统可能会依赖本地运行的一些服务和外部的一些网络服务,它们的正常状态对系统的运行很重要,如果其中有异常,可能会导致系统的功能问题,所以系统有必要对这些服务进行监测,一旦发现有异常要及时通知到运维去处理。当然会有一些专门的管理工具通过配置可以实现对这些目标的监测,我们现在通过nodejs编程来达到同样的效果。网络服务可以通过Socket来连接尝试,就像telnet host port一样,如果可以建立连接,那么网络服务正常,否则异常。

2024-03-03 17:57:23 186

原创 关于汉字串的传输编码

我们经常会遇到前端与后端、后端与后端、前端与前端之间传递字符串参数,首先我们得保证接收端收到的信息能正确还原为发送端发送的信息,那么需要字符串编码以避免原始字符串包含的一些特殊符号在传输过程中因为各种原因被处理掉的风险。在http传输数据的方式中,可以通过body、header还有url里的params和query来传递数据,其实各种方式还都有一些保留字需要注意,不能在编码中出现。汉字不能直接转base64,得先encodeURIComponent转一道,再通过atob转一道。

2024-03-03 10:56:18 207

原创 异步并发控制避坑

Promise.any() 这个用于所有任务都返回reject,这个调用才返回reject(这个时候会返回所有reject原因),如果有一个任务resolve,那么整个任务就被resolve(这个时候返回的是该任务的resolve值)Promise.all() 这个用于所有任务都返回resolve,这个调用才返回resolve(这个时候会返回所有任务结果),如果有一个任务reject,那么整个任务就被reject(这个时候返回的是该任务的reject原因)注意这个和前面的注意事项又有所不同了。

2024-03-01 11:23:30 308 1

原创 javascript日期标准化处理

为了便于入库和分析,我们希望日期的格式是YYYY-MM-DD,可有些网站显示文章的发表日期不是这个套路,今天和昨天的就直接显示今天和昨天,一周以内的显示星期一、二。日,再往前本年的显示几月几日,不带年份,而且月和日是个位数的前面也没有0,去年的才完整显示年月日,不过也不按我们希望的那样个位数的月日前面带有0,那么我们只好自己动手来把这个采集到的日期字符串格式化成我们期待的样子吧。pubdaytxt是我们采集到的日期字符串,pubsdata是我们最终期待格式的字符串。

2024-02-29 12:49:56 200

原创 web大文件下载一种推荐方法

大文件下载我首先会推荐采用ftp方式,如果一定要用web方式下载的话,网上其实也有很多方案,大家可以尝试比较下,我自己采用的是一种简单易行而且效果还很好的方案:stream+pipeline,单任务下载。stream+pipeline,速度挺快(当然也依赖用户接入网络和服务器之间的线路情况),对服务器和客户端的资源占用比较低,我这边十几GB到几十GB的文件通过这种方式下载,也还都挺顺的。

2024-02-27 15:49:21 281

空空如也

空空如也

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

TA关注的人

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