首页
码农说码
运维自嗨
茶话四海
留言板
友链
许可
Search
1
批量将 discuz 数据库编码从 utf8 转为 utf8mb4
99,313 阅读
2
Windows 下生成 SSL 数字证书
98,510 阅读
3
rsync 多进程并发执行同步数据
97,347 阅读
4
正则表达式 - 模式修饰符(PHP)
97,101 阅读
5
PHP 获取文件真实路径(清理路径信息)
96,663 阅读
一个全栈攻城狮的纯技术干货分享 ~
登录
Search
标签搜索
linux
shell
ubuntu
php
nginx
windows
mysql
batch
js
ip
docker
esxi
macos
k3s
kubernetes
域名
svn
matomo
k8s
转载
若海
累计撰写
170
篇文章
累计收到
176
条评论
首页
栏目
码农说码
运维自嗨
茶话四海
页面
留言板
友链
许可
搜索到
9
篇与
的结果
2022-05-25
基于 nginx 搭建 jsdelivr 镜像站
最近 jsdelivr 可谓国内站长圈的头条常客,这不,又双叒叕(yòu shuāng ruò zhuó)打不开了。如何解决这个问题?最简单的方法当然是使用别人建立的jsd镜像站,但是稳定性和可靠性就只能看镜像站长的心情了吧。自己动手丰衣足食,还是自己搞个镜像吧。创建 jsdelivr 镜像站首先,你需要有一台安装了 nginx 的服务器。推荐使用腾讯云轻量服务器的Matomo镜像,其中集成了最新稳定版 nginx、php、mariadb、Matomo 等服务端软件。把下面的 nginx 配置保存为 jsdelivr.conf,然后上传到你的 nginx 站点配置目录中, 一般为 /etc/nginx/include 或者 /etc/nginx/http.d。使用上面提到的 Matomo 镜像,请上传到 /usr/local/lighthouse/softwares/nginx/conf/include 目录使用宝塔镜像,可以替换下其生成的站点配置server { listen 80; listen 443 ssl http2; # 请更改为你的证书路径 ssl_certificate certs/default.cer; ssl_certificate_key certs/default.key; # 请更改为你的镜像域名 server_name jsd.rehiy.com; location / { proxy_pass https://cdn.jsdelivr.net; proxy_set_header Host $proxy_host; proxy_set_header Accept-Encoding ''; proxy_ssl_server_name on; proxy_ssl_name $proxy_host; proxy_redirect / /; # Proxy Cache proxy_cache jsdelivr; proxy_cache_lock on; proxy_cache_lock_timeout 15s; proxy_cache_use_stale updating; proxy_cache_background_update on; proxy_cache_key $host$request_uri; proxy_cache_valid 200 301 302 30d; proxy_cache_valid 500 501 502 503 15s; proxy_cache_valid any 5m; # Replace Domain sub_filter_once off; sub_filter_types application/javascript application/json text/xml text/css; sub_filter '$proxy_host' '$host'; } } # 缓存路径请根据需要更改 proxy_cache_path /var/tmp/nginx/jsdelivr levels=1:2 use_temp_path=off keys_zone=jsdelivr:300m inactive=30d max_size=30g;使用 jsdelivr 镜像站在你的站点源码中批量替换 cdn.jsdelivr.net 为 jsd.rehiy.com 即可使用自己的jsd镜像了。当然,也可以把下面的代码插入到你的站点 nginx 配置中,不修改站点源码替换为自己的镜像站。sub_filter_once off; sub_filter_types application/javascript application/json text/xml text/css; sub_filter 'cdn.jsdelivr.net' 'jsd.rehiy.com';
2022年05月25日
90 阅读
0 评论
0 点赞
2021-10-08
NodeJS 通过魔术封包唤醒局域网计算机
国庆假期就这么过去了,今天分享下NodeJS如何通过魔术封包唤醒局域网计算机的代码吧。/** * 通过魔术封包唤醒局域网计算机 * @author 若海 <
[email protected]
> * @website http://www.rehiy.com * @wiki https://en.wikipedia.org/wiki/Wake-on-LAN * @docs http://support.amd.com/TechDocs/20213.pdf */ const net = require('net'); const udp = require('dgram'); /** * 创建魔术封包 * @param {string} mac 网卡MAC地址 * @returns {Buffer} */ function createMagicPacket(mac) { mac = mac.replace(/[^0-9a-fA-F]/g, ''); if (mac.length != 12) { throw new Error(`Bad MAC address "${mac}"`); } const bufMac = Buffer.from(mac, 'hex'); let bufRes = Buffer.alloc(6, 0xff); for (let i = 0; i < 16; i++) { bufRes = Buffer.concat([bufRes, bufMac]); } return bufRes; } /** * 通过网络唤醒 * @param {string} mac 网卡MAC地址 * @param {object} options 可选项 * @returns {Promise<boolean>} */ function wakeOnLAN(mac, options) { options = Object.assign({ address: '255.255.255.255', port: 7 }, options); return new Promise((resolve, reject) => { const packet = createMagicPacket(mac); const socket = udp.createSocket( net.isIPv6(options.address) ? 'udp6' : 'udp4' ); socket.on('error', function (err) { socket.close(); reject(err); }); socket.once('listening', function () { socket.setBroadcast(true); }); socket.send( packet, 0, packet.length, options.port, options.address, function (err, res) { socket.close(); if (err) { return reject(err); } resolve(res == packet.length); } ); }); }来个例子~wakeOnLAN('30:9C:FF:FF:FF:FF').then( res => { console.log(res); }, err => { console.log(err.message); } );
2021年10月08日
90,447 阅读
0 评论
0 点赞
2021-03-27
基于 Wechaty 的微信机器人
出于好奇,决定研究下这个项目。在此致敬Wechaty项目的维护者,并贡献一份自己的力量。
2021年03月27日
12,372 阅读
0 评论
0 点赞
2014-05-21
js 中 escape、encodeURI、encodeURIComponent 的区别
三个函数均可把字符串作为 URI 组件进行编码。escape/unescape该方法不会对 ASCII 字母和数字进行编码,也不会对下面这些 ASCII 标点符号进行编码: * @ - _ + . / 。其他所有的字符都会被转义序列替换。ECMAScript v3 反对使用该方法,应用使用 encodeURI() 和 encodeURIComponent() 替代它。encodeURI/decodeURI该方法不会对 ASCII 字母和数字进行编码,也不会对这些 ASCII 标点符号进行编码: - _ . ! ~ * ' ( ) 。该方法的目的是对 URI 进行完整的编码,因此对以下在 URI 中具有特殊含义的 ASCII 标点符号,encodeURI() 函数是不会进行转义的:;/?:@&=+$,#如果 URI 组件中含有分隔符,比如 ? 和 #,则应当使用 encodeURIComponent() 方法分别对各组件进行编码。encodeURIComponent/decodeURIComponent该方法不会对 ASCII 字母和数字进行编码,也不会对这些 ASCII 标点符号进行编码: - _ . ! ~ * ' ( ) 。其他字符(比如 :;/?:@&=+$,# 这些用于分隔 URI 组件的标点符号),都是由一个或多个十六进制的转义序列替换的。请注意 encodeURIComponent() 函数 与 encodeURI() 函数的区别之处,前者假定它的参数是 URI 的一部分(比如协议、主机名、路径或查询字符串)。因此 encodeURIComponent() 函数将转义用于分隔 URI 各个部分的标点符号。
2014年05月21日
27,422 阅读
0 评论
0 点赞
2013-07-16
正则表达式 - 元字符
字符 描述 \ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个 后向引用、或一个八进制转义符。例如,'n' 匹配字符 "n"。'\n' 匹配一个换行符。序列 '\\' 匹配 "\" 而 "\(" 则匹配 "("。 ^ 匹配输入字符串的开始位置。如果设置了 **RegExp** 对象的 **Multiline** 属性,^ 也匹配 '\n' 或 '\r' 之后的位置。 $ 匹配输入字符串的结束位置。如果设置了 **RegExp** 对象的 **Multiline** 属性,$ 也匹配 '\n' 或 '\r' 之前的位置。 * 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。 * 等价于{0,}。 + 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。 ? 匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。 {*n*} *n* 是一个非负整数。匹配确定的 *n* 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。 {*n*,} *n* 是一个非负整数。至少匹配*n* 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。 {*n*,*m*} *m* 和 *n* 均为非负整数,其中*n*
2013年07月16日
91,890 阅读
0 评论
0 点赞
2013-07-16
正则表达式 - 分组语法(捕获/断言/注释)
分类 代码/语法 说明 捕获 (exp) 匹配exp,并捕获文本到自动命名的组里 (?exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp) (?:exp) 匹配exp,不捕获匹配的文本,也不给此分组分配组号 断言 (?=exp) 匹配exp前面的位置 (?匹配前面不是exp的位置 注释 (?#comment) 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读
2013年07月16日
9,897 阅读
0 评论
0 点赞
2013-02-17
谷歌制图服务 (Google Chart) 接口生成二维码
Google公布了制图服务(Google Chart)的接口,这项服务用起来相当简单,只使用浏览器就可以用来为统计数据自动生成图片。目前谷歌制图服务提供折线图、条状图、饼图、Venn图、散点图、二维码图等。下面我们来看下如何使用这个简单的服务来生成二维码。接口地址 http://chart.apis.google.com/chart?chs=宽高值x宽高值&cht=qr&chld=等级|边距&chl=内容参数说明:宽高值:生成二维码尺寸,单位是像素,目前生成的二维码都是正方形的,所以两个宽高值都设置为一样的值等级:四个等级,L-默认:可以识别已损失的7%的数据;M-可以识别已损失15%的数据;Q-可以识别已损失25%的数据;H-可以识别已损失30%的数据边距:生成的二维码离图片边框的距离内容:生成二维码的内容,但一定要URLENCODE下面给一个JS生成二维码地址的函数function qrcode(data, size, level, margin) { size = size || 320; level = level || 'L'; margin = margin | 0; return [ 'http://chart.apis.google.com/chart?cht=qr', '&chs='+size+'x'+size, '&chld='+level+'|'+margin, '&chl='+encodeURIComponent(data) ].join(''); } //测试 var url = qrcode('http://www.rehiy.com/post/748'); window.location.href = url;
2013年02月17日
16,976 阅读
0 评论
0 点赞
2011-10-22
JavaScript 获取浏览器 Flash 版本
/*! * 获取浏览器Flash版本号 */ function get_flash_version() { var SF, FV = 0, BR = window.navigator; if(BR.plugins && BR.mimeTypes.length) { SF = BR.plugins["Shockwave Flash"]; if(SF && SF.description) { FV = SF.description.replace(/[^\d\.]/g,"").split(".")[0]; } } else if(BR = window.ActiveXObject) { try { SF = new BR("ShockwaveFlash.ShockwaveFlash.7"); FV = SF.GetVariable("$version").split(" ")[1].split(",")[0]; } catch(e) {} } return +FV; }
2011年10月22日
6,567 阅读
0 评论
0 点赞
1
2