自建服务 Google Gemini
以下介绍由 Google Gemini 生成 Google Gemini 简单介绍一下 Google Gemini Google Gemini 是谷歌公司推出的一款对话式人工智能模型,可以进行更为复杂的对话。Gemini 具有以下特点: 知识广博:Gemini 拥有海量的知识,可以回答各种各样的问题。 对话式交互:Gemini 可以进行对话式的交互,就像你在和人聊天一样。 个性化体验:Gemini 可以根据你的喜好和兴趣来调整自己的回复,为你提供个性化的体验。 创造性思维:Gemini 可以进行创造性的思维,可以生成故事、诗歌、笑话等内容。 强大的推理能力:Gemini...
在博客中使用 UnoCSS!
演示1<div text="center 10 primary">你可以设置字体样式</div> 你可以设置字体样式 1<div text-10 animate-bounce>轻松设置动画</div> 轻松设置动画 123456789101112<div flex items-center justify-center gap-3> <div>设置一个图标</div> <div i-mdi-emoticon-cool-outline h-10 w-10></div> <div flex="~ col" items-center> <div i-mdi-emoticon-angry-outline animate="wobble count-infinite" h-15 w-15 bg-red></div> ...
2023 年度总结
今年是感觉到了累的一年,更多的是精神压力。依然 间歇性踌躇满志,持续性混吃等死。 工作工作上更得心应手了,感觉现代程序猿到了后期就是手握一堆开源库,要什么功能找哪个库 换了工作,当前技术栈以 capacitor 为主,一个跨平台框架,用前端技术开发 Android、iOS 应用,也可以通过 electron 打包桌面应用 除了前端也搞一搞 nodejs 之类的,简单写写 iOS 相关的,于是变成了这样 加班略多,也学到不少新鲜东西 生活出现了严重拖延,感觉有种死循环。明知道不能睡太晚,但还是不太想睡,放下手机睡觉吧睡不着,至少得半小时一个小时才能睡着,于是就一两点了 但即使是这样感觉自己的时间还是很少,很多想做的、得做的一直排着队 以前工作之余还做做自己的项目,现在回家直接摆烂,边看 “一口气看完 XXX”...
Safari 浏览器踩坑记录
音频加载近期做了个小游戏,需要用到 mp3 文件,为了不让用户等待做了预加载,实现方式就是 123const audio = new Audio()audio.src = '音频地址'audio.load() 这样再监听 canplay 事件,即可拿到是否加载完成,加载多个并做了进度条 但后来朋友反馈发现,iPhone 手机进度一直是 0%,原因有两个 iOS 加载音频非 WIFI 下不能预加载,需要用户同意 也就是 audio.load() 需要在一个用户操作事件中,比如 onClick 本想着这就解决了,在同一个点击事件里先加载,做了个异步,等待加载完成后继续执行播放,结果又不对了 播放前不能有 await 也就是调用 audio.play() 之前不能有 await,需要先执行加载,再进行播放 于是最后做了设备类型判断,如果是 iOS 设备,就需要先点击加载音频,加载完后才会出现开始按钮 滚动回弹近期工作中遇到了这个问题,Safari...
Fedora Docker 自动关闭的问题
事件回放之前在做 Homelab 的时候用到了 Fedora 这个系统,做显卡直通后,在系统中单独跑一个 Jellyfin 可以开启硬件解码 但后面发现 Jellyfin 时不时就打不开了,最开始没发现什么问题,也找到了一个简易解决方案,就是执行以下 docker ps 就启动了 之后感觉是系统休眠问题,于是就搜了一下 Fedora 怎么关闭自动休眠,但没搜到命令 关闭自动休眠昨天仔细找了找,发现了关闭自动休眠的命令,Fedora 也可以用 1sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target 记录一下 添加自动重启之前加了个音乐服务,使用频率大幅增加 然后发现即使是不进入休眠,过几天也会莫名其妙挂,甚至 SSH 也连不上,所以设置了自动重启 打开计划任务 crontab -e,根据自己需要添加启动时间,我这里设置每天 5 点重启 10 5 * * * reboot 添加 NAS 挂载重试2024-04-20 更新 最近发现 NAS 有一次没挂上,用的是...
Nodejs 对接 TSCLIB
开始最近工作中有这么个课题。曾几何时我基于 electron 做了个打印功能,按照官网文档的描述,原理其实是 electron 启动一个渲染进程,加载一个网页,并且调用 electron 给的打印函数实现打印 这种方式其实就是打印网页,但后面发现推到 Windows 打印队列中的数据比较大,有 300 到 500 KB,相比友商足足大了 100 倍! 于是又被派来研究一下友商的解决方案,友商的解决方案也很容易猜到,其实就是推送了打印指令,而不是整个网页的渲染物 虽说容易猜到,但实际调研过程还是困难重重,但这篇文章就不展开说了,直奔主题 TSCLIBTSCLIB 是个打印机函数库,它提供了一些基础的打印封装,并提供了推送二进制数据的方法 根据 官方文档 描述,你可以调用 TSCLIB.dll 中封装的函数来实现打印 这就引出第二个问题,nodejs 如何调用 dll 调用 DLL使用 ffi-napi 和 ref-napi 这两个开源库,能做到 nodejs 调用 dll 中的方法 首先将你用到的函数,函数名、返回值类型、参数类型一一声明 12345678910import...
Hexo 主题开发 hexo-theme-imba97 —— 第零篇
使命近一年中我了解到数字游民这个概念,就深受吸引,想逐步达成这一目标 不管以后找远程工作还是全职开源开发转商业化,都需要一个完善的开源项目 加上一直想自己动手做一个自己博客的主题,于是就有了这个项目 地基模板的开发是在 Hexo 默认模板的基础上,最开始没有直接写页面,而是丰富开发工具,会让开发变得更简单 TypeScript第一个就是 TypeScript,这让项目有更好的规范性,代码写起来也不容易出问题 Rollup主题开发在代码层面分为 Hexo 运行时执行的代码和实际博客页面中的代码 在开发或打包时,先使用 tsc 将 ts 编译为 js,再通过 rollup 根据不同目录转成相应格式的代码 比如 Hexo 运行时识别的 cjs,浏览器执行的 iife UnoCSSUnoCSS 是个原子化 CSS 引擎,可以根据关键词生成具体的样式 这样就不用为 class 起名发愁了,并且按需生成,不会有大量重复样式 功能除了自带的图片预览,目前还加了 Pjax、nprogress、smooth-scrollbar 开发层面有自动引入 js 库并支持权重,比如要在其他库之前引入...
参与一下 unocss 开发
Unocssunocss 是个强大的原子化 CSS 引擎,可以让你无需考虑样式的命名,按需生成样式 比如 1<div mt-5></div> 就会自动生成样式 1[mt-5=""]{margin-top:1.25rem;} 发现需求最近在做一个 Hexo 的主题,用到了 unocss 1234567891011import { defineConfig, presetUno, presetAttributify, presetIcons } from 'unocss'export default defineConfig({ presets: [presetUno(), presetAttributify(), presetIcons()], cli: { entry: { patterns: ['layout/**/*.ejs'], outFile:...
这个全平台远程桌面软件我必须安利!
我太激动了今天发现一个 全平台、远程桌面、免费开源、支持自建服务器 的软件!可以说是 Buff 都让它叠满了! 我这么激动的原因就是,没有对比就没有伤害,平时深受某几个远程桌面软件的迫害 工作中经常需要连接同网络下的 mac mini 进行打包等操作,时不时也会连接客户的电脑排查异常 那某几个软件不但画面糊!有时候能把 1 显示成 2 我就觉得离谱 而且我是连接本地设备,它还要去那破破烂烂的服务器绕一圈我就不是很理解,撒我像素是吧? 软件本体请记住,它叫:rustdesk 它有多良心,如果说全平台和提供免费中继服务器,是一个远程桌面软件最基本的条件,那么开源和支持自建服务器就实属是格局大开了 下载仅 19M 大小的可执行文件,打开后直接就可以远程,你甚至都不用安装。使用完整功能才需要安装 它真的,我哭死! 服务端官方有开源的服务端项目:rustdesk-server 还有 Docker 镜像:rustdesk/rustdesk-server 这次浅浅尝试了一下,在软路由 Docker 跑起来一个服务端,使用 NPS...
nestjs 联表查询
联表查询浅浅记录一下 nestjs 开发的联表查询 用户表和上传表,需求是获取用户列表时联表查询上传表的用户头像 1234567891011121314151617async findAll(page: number, limit: number) { const list = await this.userRepository .createQueryBuilder('user') .select([ 'user_id', 'name' ]) .leftJoin(Upload, 'upload', 'upload.upload_id = user.avatar') .addSelect(['upload.filename as avatar']) .offset(limit * (page - 1)) .limit(limit) ...