面壁人浮川 发布的文章 - 浮川的小窝
首页
休闲直播
4K壁纸
统计
更多
关于
留言
归档
搜 索
1
HelloWorld!
147 阅读
2
前端算法整理
138 阅读
3
关于服务器配置反代隐藏端口中遇到的问题
125 阅读
4
emby+alist3+cloudDriver2 emby无法播放网盘资源问题
124 阅读
5
maptalks 一些基础api的再封装(待解耦改装纯方法类)
110 阅读
生活
学习
随笔
吐槽
小秘密
小故事
登录
/
注册
搜 索
SnowLove
累计撰写
69
篇文章
累计收到
5
条评论
首页
栏目
生活
学习
随笔
吐槽
小秘密
小故事
页面
休闲直播
4K壁纸
统计
关于
留言
归档
用户登录
登录
注册
找到
67
篇与
面壁人浮川
相关的结果
2023-08-11
goLang数组初识
最近正在看golang基础 :@(小怒) :@(小怒):@(小怒)(又开新坑了这是= =) 看到数组部分 写demo测试的时候发现有个小不同package main import ( "errors" "fmt" "strconv" ) func main(){ // 指定数组长度 // 传入函数形参时会拷贝一份新的数组值 修改的是函数内部的拷贝副本 arr := [3]int updateArr(arr) // [1,2,3] // 不定数组长度 // 此处为一个切片为一个引用类型 传递的事指针地址遂等同于下方操作 arr := []int updateArrTwo(arr) // 指定数组长度并传入地址值 // 传入地址值好理解 直接修改了原数组数据 arr := []int updateArrThree(&arr) fmt.Println(arr) // [1,7,3] } func updateArr(arr [3]int){ arr[1] = 7 } func updateArrTwo(arr []int){ arr[1] = 7 } func updateArrThree(arr *[]int){ (*arr)[1] = 7 }然后就舔着个脸去问GPT :@(脸红):@(脸红)发现了切片这个概念 于是去官网去找 结合csdn一位博主所说:————————————————切片(slice)是golang中一种特有的数据类型数组有特定的用处,但是却有一些呆板(数组长度固定不可变),所以在 Go 语言的代码里并不是特别常见。相对的切片却是随处可见的,切片是一种建立在数组类型之上的抽象,它构建在数组之上并且提供更强大的能力和便捷。切片(slice)是对数组一个连续片段的引用,所以切片是一个引用类型。这个片段可以是整个数组,或者是由起始和终止索引标识的一些项的子集。需要注意的是,终止索引标识的项不包括在切片内。切片提供了一个相关数组的动态窗口。————————————————package main import ( "fmt" ) func main(){ //定义数组: intarr := [6]int //切片构建在数组之上 slice := intarr[1 : 3] //输出数组 fmt.Println("intarr:", intarr) // [3 6 9 1 4 7] //输出切片 fmt.Println("slice:", slice) // [6 9] 包头不包尾 //输出切片个数 fmt.Println("slice的元素个数", len(slice)) // 2 // 修改切片数据 slice[1] = 55 //输出修改后切片 fmt.Println("slice2:", slice) // [6 55] //输出修改后数组 fmt.Println("intarr2:", intarr) // [3 6 55 1 4 7] 原数组数据也更改了 }如果使用make创建一个空切片并将原值copy到空切片上 这两个变量的字面量是相同的package main import ( "fmt" ) func main(){ // 切片的定义 intarr2 := []int slice2 := intarr2[0:6] // 此处的切片slice2和intarr2共享同一个底层数组 但是两人堆中的地址值不相同 // 并不能简单的理解成地址值相同那这两个变量就是一个完全相同的引用类型变量 } 这句感觉很关键刚在学习阶段 理解的不是很透彻 记录一下 待以后学成而归再修正 :@(装大款) :@(装大款)
2023年08月11日
12
0
0
2023-08-08
node连接mongodb时出错问题
天杀的mongodb :@(愤怒) :@(愤怒):@(愤怒):@(愤怒):@(愤怒):@(愤怒):@(愤怒):@(愤怒)起因是升级了群晖DSM7.2 node版本随之而也升级了 之前的日志项目重新部署发现数据库连不上了...哎哟喂一天啊整整一天啥也没干就死磕这个倒霉数据库 死活连不上 现在记录一下自己解决的心路历程首先我怀疑的是打的docker镜像不是最新版的 然后我就去码云看我的提交记录 发现木的问题。然后我就翻docker日志 去看后端服务为啥连不上 发现就这么个破报错 :@(内伤) 遂谷歌百度了一通 大体意思如以下几个解决方法:修改链接地址 更换url localhost或者127.0.0.1 -> 0.0.0.0 修改 mongo 配置文件 vim /etc/mongod.conf.orig将其中的bindIp: 127.0.0.1注释掉bindIp: 127.0.0.1 或者改成bindIp: 0.0.0.0 即可开启远程连接修改mongodb docker配置文件 vim /etc/sysctl.conf"在文件中添加下面的配置" net.ipv4.ip_forward=1 添加此行配置查看是否修改成功 sysctl net.ipv4.ip_forward 如果返回net.ipv4.ip_forward = 1则表明成功以上方法均无效 :@(吐血倒地):@(吐血倒地):@(吐血倒地):@(吐血倒地):@(吐血倒地)最终的解决办法还是借鉴了n年前的easymock项目 因为在服务器上部署过easymock项目 所以就哼哧哼哧去gitub上翻源码 最后无奈把mongodb和node调用库分别由版本降级到 "mongoose": "^6.3.1"-> "^4.13.9" "mongo":"4.4.9" -> "3.4.1" 我又在easymock项目里写了个一测试js调用同网络下的easymock的mongodb 是能调通的(我比对过docker容器配置 关键参数都有相差不大) 遂我照葫芦画瓢 把mongo全部降低 然后特么的好使了= = 怀疑是升级DSM系统后 docker也进行了升级 要不就是node版本不兼容mongo调用库了 :@(惊喜) :@(惊喜) :@(惊喜) 这破问题太折磨人了 不过最终还是解决了系统跑起来了 过阵子等着重构重构啰啰嗦嗦一大堆没用的 下班!!! :@(呲牙) :@(呲牙) :@(呲牙)
2023年08月08日
15
0
0
2023-08-01
乞丐版虚拟键盘v0.0.1(已升级至v0.0.5)
:@(高兴) 大家好啊我破壁人今天又诈尸了 介于vue3.0发布好久了 最近参考了一下官方项目 发现他的项目结构很有意思 正好同事也在看 遂一起研究着搞个小项目练练手 左思右想 写个啥呢? :@(吐血倒地)于是就比着官方项目在加上一顿搜索再加上二顿虾基霸改 勉勉强强算是搭起来了 :@(呲牙) 这版写的比较急 再加上零零碎碎的时间写的 所以难免有些地方考虑的欠妥 实现的很不优雅 跟同事小伙伴一起(我那同事真大神没有他不会的)边请教着边尝试 写出了这个v0.0.1版 使用了 Monorepo+pnpm+typescript+vite+js原生 写了个简单的键盘 而且还才用了兼容性极差的css :@(赞一个) (想用table来着 但是心思心思也没用过grid 索性就拿他实验实验)实现了一套黑色主题颜色不支持联想和连续输入 :@(哭泣)支持中英切换支持npm安装实现数字键位布局(ps:不要关注版本跳了4次的问题 :@(狂汗) )下一步准备再加上 数字键盘的布局、多国语言选择、添加兼容性更好的css布局方式、自定义键盘背景 等功能 一步步来吧~ 测试版v0.0.1上线 测试版v0.0.5上线 添加数字键盘布局 todo... 删库跑路展示demo: ::(弱) ::(弱) ::(弱) 点击下面::(弱) ::(弱) ::(弱)
2023年08月01日
49
0
1
2023-08-01
被鬼夺走一切的叫柱,被人夺走一切的叫弦
作词 : LiSA/梶浦由記作曲 : 梶浦由記编曲 : 梶浦由記さよならありがとう声の限り嘶声呼喊出再见与感谢悲しみよりもっと大事なこと是比悲伤更重要的事情去りゆく背中に伝えたくて想传达给你远去的背影ぬくもりと痛みに間に合うように希望还能来得及感受你的温暖与痛楚このまま続くと思っていた曾以为会一直这样延续下去僕らの明日を描いていた也曾共同描绘过我们的未来呼び合っていた光が相互照映的那道光まだ胸の奥に熱いのに分明还在内心深处炽热无比僕たちは我们燃え盛る旅の途中で出会い相遇在熊熊燃烧的旅途之中手を取り一路携手作战そして離した未来のために可是为了未来 最终还是松开了手夢が一つ叶うたび每当实现一个梦想僕は君を思うだろう我都会想起你強くなりたいと願い泣いた痛哭着发誓要变得更强大決意を餞に以我的决意为你饯行懐かしい思いに囚われたり也曾受困于眷恋的回忆之中残酷な世界に泣き叫んで为这残酷的世界恸哭嘶喊大人になるほど増えてゆく越是成长越是得不到满足もう何一つだって失いたくない可我再也不愿有任何失去悲しみに飲まれ落ちてしまえば若是放任自己被悲伤吞噬痛みも感じなくなるけれど便不会再感到痛苦折磨吧君の言葉 君の願い然而 你的话语 你的愿望僕は守りぬくと誓ったんだ我发过誓会永远守护到底音を立てて崩れ落ちてゆく正发出轰鸣 逐渐崩塌陷落的ひとつだけのかけがえのない世界是那独一无二 无可替代的世界手を伸ばし我伸出手抱きとめた激しい光の束将那道耀眼刺目的光束揽入怀中輝いて消えてった未来のために为了未来 你就这样闪耀着消失远去託された幸せと約束を超えていく超越你托付于我的幸福和约定振り返らずに進むから我会绝不回头地前进前だけ向いて叫ぶから我会一往无前地呐喊心に炎を灯して 遠い未来まで点燃心之「炎 」 奔赴遥远的未来
2023年08月01日
24
0
0
2023-07-31
自动打包备份脚本
最近看着公司项目打包太过混乱 :@(小怒) 因为协同开发 需要随时更新代码到测试环境 虽然有git的自动化部署脚本 但是上了正式的内网环境(政府项目无互联网环境) 打包还是要手动部署的 所以想写个简单的备份脚本 发包的时候能知道最后发包人及发包时间和版本 :@(深思) 话不多说 上代码项目结构:添加tsconfig.run.json{ "compilerOptions": { "module": "commonjs", "target": "es2018", "strict": true, "esModuleInterop": true, "resolveJsonModule": true, "moduleResolution": "node" }, "include": ["build/index.ts"] }添加build下index.ts注意安装 npm install ts-node archiver @types/archiver -Dimport * as fs from "fs"; import path from "path"; import moment from "moment"; import from "child_process"; import archiver from "archiver"; // 文件数 let files = 0; // 获取文件路径 const getPath = (dir: string) => path.resolve(__dirname, "../", dir), archive = archiver("zip", { zlib: , }), // 获取git用户名 getGitUser = () => { return new Promise((resolve, reject) => { exec("git config user.name", (err, stdout) => { if (err) { console.log("未获取到当前打包人:", err); return reject("未知"); } console.log("当前打包人:", stdout.slice(0, -1)); resolve(stdout.slice(0, -1)); }); }); }, // 获取文件数 dirLen = (srcPath: string) => { fs.readdirSync(srcPath).forEach((dir) => { const filePath = path.join(srcPath, dir); if (fs.lstatSync(filePath).isDirectory()) { dirLen(filePath); } else files += 1; }); }, // 遍历读取文件 readDirErgodic = async ( srcPath: string, toPath: string, callback: () => void ) => { try { const dirList = fs.readdirSync(srcPath); for await (const file of dirList) { //拼接路径 const curPath = path.join(srcPath, file), toCopyPath = path.join(toPath, file); if (fs.lstatSync(curPath).isDirectory()) { fs.mkdirSync(toCopyPath); readDirErgodic(curPath, toCopyPath, callback); } else { const readable = fs.createReadStream(curPath), writable = fs.createWriteStream(toCopyPath); readable.pipe(writable); writable.on("finish", () => { files--; // files === 0 && console.log("finish", callback); files === 0 && callback && callback(); }); } } } catch (err) { console.log("------------读取dist文件失败------------", err); throw new Error(err + ""); } }, // 读取dist下所有文件 readDistDir = async (srcPath: string, toPath: string) => { try { // 计算多少文件数 dirLen(srcPath); // 创建复制过去准备打包的文件夹 fs.mkdirSync(toPath); console.log("打包文件个数:", files); return new Promise((resolve) => { readDirErgodic(srcPath, toPath, () => resolve(true)); }); } catch (err) { return Promise.resolve(false); } }, // 删除指定文件夹下所有文件并删除该文件夹 deleteFolderErgodic = async (folderPath: string) => { const files = fs.readdirSync(folderPath); for await (const filePath of files) { //拼接路径 const curPath = path.join(folderPath, filePath); if (fs.lstatSync(curPath).isDirectory()) { await deleteFolderErgodic(curPath); isEmptyDir(curPath) && fs.rmdirSync(curPath); } else { fs.unlinkSync(curPath); } } return Promise.resolve(true); }, // 是否为空文件夹 isEmptyDir = (folderPath: string) => { try { const list = fs.readdirSync(folderPath); return list && Array.isArray(list) && list.length === 0 ? true : false; } catch (e) { return true; } }, // 删除指定文件夹 deleteFolder = async (folderPath: string) => { await deleteFolderErgodic(folderPath); // 删除现在为空的文件夹 // console.log("isEmptyDir(folderPath)", isEmptyDir(folderPath)); isEmptyDir(folderPath) && fs.rmdirSync(folderPath); }, // 打包文件 compressFolder = async (fileName: string) => { if (fs.existsSync(fileName)) { console.log("------------打包压缩开始------------"); const output = fs.createWriteStream(`$.zip`); // 监听archive对象的错误事件 archive.on("error", (err: any) => { console.log("打包错误", err); throw err; }); output.on("close", () => { let times = 3; console.log("------------删除打包文件中....------------"); const timer: NodeJS.Timer = setInterval(() => { console.log(`$秒`); if (times == 1) { if (fs.existsSync(fileName)) { deleteFolder(fileName); console.log("------------打包压缩流程完成!------------"); return clearInterval(timer); } else console.log( "------------删除打包文件失败,请根据情况手动删除------------" ); } times--; }, 1000); }); // 将archive流导向输出文件 archive.pipe(output); // 添加要打包的文件 archive.directory(fileName, false); // 完成archive archive.finalize(); } }; // 将打包的dist文件存入文件备份中 (async function copyFileToBackFiles(srcFile: string, distFile: string) { console.log("------------打包压缩流程开始!------------"); !fs.existsSync(distFile) && fs.mkdirSync(distFile); const fileName = `$/$-${moment( new Date() ).format("YYYY-MM-DD HH:mm:ss")}-$`; // // console.log("fileName", path.basename(process.cwd())); // 读取dist文件夹下所有文件并拷贝到fileName文件夹下 if (!(await readDistDir(srcFile, fileName))) return console.log("------------打包压缩意外终止------------"); // 压缩文件 compressFolder(fileName); })(getPath("dist"), getPath("dist_back_files"));package.json添加运行脚本{ "build-only": "vite build && ts-node", "ts-node": "ts-node --project tsconfig.run.json build/index", }脚本将在构建完成后 创建一个压缩文件名组成: 项目名-日期-git最后一次提交人 :@(赞一个) 暂时性满足了我的需求 后期准备把他封装成一个插件包发上去 等着再说叭~
2023年07月31日
25
0
0
1
...
4
5
6
...
14