大象笔记

知者行之始,行者知之成

DotNet 8 Minimal API with AOT (三): Ubuntu Server 生产环境部署

在使用 HTMX 调用 .NET 8 Minimal API 实现的接口后,这个小的练手项目就算是开发完了。现在需要部署到生产服务器上。 编译 > dotnet publish 可执行文件的大小 > ls bin/Release/net8.0/linux-x64/publish/ -lah total 32M 4.0K ./ 4.0K ../ 11M app* 21M app.dbg* 127 appsettings.Development.json* 151 appsettings.json* 4.0K wwwroot/ app 就是生成的独立的可执行的 ...

阅读全文...

HTMX - Make HTML Great Once Again

之前在了解 Rust Axum 框架时,发现好多 reddit 上的 Rust 开发者在使用 HTMX 来实现网页端。 而且对 HTMX 赞不绝口。简洁实用,拒绝花里胡哨,永久告别磁盘杀手 NPM。最近正好在实现一个简单的基于 web 的服务器小工具,所以想​借此机会正好试试 HTMX。 HTMX 是什么 官方的介绍是: htmx is a library that allows you to access modern browser features directly from HTML, rather than using javascript. 简言之,就是不使用 js 来实现网页 ...

阅读全文...

DotNet 8 Minimal API with AOT (二): 编写接口

书接上回 DotNet 8 Minimal API with AOT: Part 1 这是使用 DotNet 8 Minimal API with AOT 系列的第二部分,开始实行一个 API 接口。 一个最简单的 API 接口 app.MapGet("/hello", () => "Hello World!"); 测试一下: > curl http://localhost:5141/hello Hello World!¶ get 请求就是 MapGet; post 请求就是 MapPost。 独立的处理函数 我还是觉得上面那种 lamb ...

阅读全文...

DotNet 8 Minimal API with AOT (一): 新建项目

我想用 DotNet 8 的 Minimal API 实现一个简单的服务器操作界面, 点击页面中的一个按钮,自动执行 Linux 服务器中的一行命令。(为何不用 PHP 或是 golang 去实现,因为我想换个口味) 初步构想是: api 提供接口 html 放 wwwroot 目录下 尝试一下 AOT 版本的 Minimal API 部署方式 为何选择 Native AOT 虽然有几种不同方式可以部署 ASP.NET 8 Minimal API 服务,但是我部署想试试 AOT。 Native AOT is a deployment model that uses an ahead-of ...

阅读全文...

docker 默认不支持 crontab 计划任务,导致 Magento 批量上传产品后无法被搜索到

又一次被 docker 坑到。 问题现象 在 Magento 中批量上传产品信息后,新增的商品信息无法通过 Magento 的搜索功能被检索到。 猜测是批量上传功能,没有自动触发 ES 全文检索的索引功能。 手动解决方案 执行: > bin/magento cron:run Ran jobs by schedule. 然后,产品信息就能被搜索到了。 但是,这样操作太麻烦,总不能每次在浏览器后台上传成功之后,都去服务器上再敲一段命令行吧。 尝试通过服务器端的系统计划任务实现。 docker 中 magento 自动创建的计划任务失效 执行 magento 命令,创建计划任务: > ...

阅读全文...

git cherry-pick 将一个 commit 应用到多个分支

需求场景 公司的一个控制设备运行的 android 平板蓝牙 app,针对每个客户都有一个独立的版本, 功能和界面都有所不同。而有的客户又针对他们自己的客户,又做了功能和 UI 区分,但是差异很小。 所以就放到了一个 git 代码仓库中进行管理,但是不同版本使用了不同的 branch 分支进行管理。 在维护多个分支时,会遇到需要同时向多个分支添加同一个功能的需求。 手动去每个分支修改一遍代码可太麻烦了,这时候,git cherry-pick 就排上了用场。 可以将一个 commit 应用到多个不同分支上。 操作流程 先在某个分支 A 上,将功能开发好,提交一个 commit。 然后,切换到另一 ...

阅读全文...

DotNet 8 AOT 测试,还是不如 Golang 交叉编译方便

什么是 .Net 的 AOT 简言之,就是类似 Golang 将代码编译成一个独立的二进制文件,直接扔到服务器上就能运行,也不需要任何的 runtime 依赖。 Publishing your app as Native AOT produces an app that's self-contained and that has been ahead-of-time (AOT) compiled to native code. Native AOT apps have faster startup time and smaller memory footprints. These apps ...

阅读全文...

在命令行下新建一个 .NET 8 MVC 项目

最近在看砖头书 《C# 10 和 .NET 6 入门与跨平台开发,第六版》(.NET 8 那本太贵买不起),真是堪称废话大全,全是没用的八股和 IDE 截图,我甚至怀疑作者和译者都没有实际开发经验。有点看不下去,所以干脆直接动手吧,边重写这个博客,边学习吧。 首先需要安装 .NET8, 参考 Windows PowerShell 中通过 winget 命令行下载安装 .Net 8。 .NET 版本 > dotnet.exe --version 8.0.301 新建项目 WSL 下直接执行,或者 PowerShell 中也可以 > dotnet.exe new mvc -n Blo ...

阅读全文...

docker 误朕,Joomla 发送邮件超时失败,原因竟是 docker 默认不支持 IPv6

前几天迁移 Joomla 服务器到半夜 11 点多,最后发现发送邮件失败,总是报超时。太困实在扛不住了,而且第二天要上线公司内部的 CRM 微信小程序,老板要体验,不敢怠慢,于是决定速速睡觉,缓缓再排查邮件发送失败的问题。今天,CRM 小程序终于上线了,赶紧定位了一下邮件问题。 Joomla 是何物 Joomla 是一个开源的内容管理系统(CMS),用于构建网站和在线应用程序。 适用于构建各种类型的网站,包括企业网站、电子商务平台、小型企业网站、社区门户网站、学校网站,以及个人主页。类似于 Wordpress,也是由世界上最好的语言 PHP 开发。 问题现象 提交数据后,默认会将提交信息发送 ...

阅读全文...

将微信小程序版 CRM 的客户清单页面改造成手机通讯录,按拼音排序

之前做的微信小程序版 CRM 客户管理系统,里面的客户清单列表页,是按照客户加入的顺序排列的。但是这样不方便查找,不如按照汉字拼音排序,直观便于查找。 于是,经过一天折腾。将首页换成了通讯录的样式,按照拼音排序。 golang 拼音库 首先是服务端接口的支持,需要基于已有的客户姓名,获取其对应的拼音字母。 可以参考下面这个 golang 库。 https://github.com/mozillazg/go-pinyin 但是需要注意的是,如果客户姓名是英文,这个库会返回空字符串。所以,判断是英文时,用英文作为拼音字段的返回。 微信小程序通信录前端组件 https://developers.we ...

阅读全文...

微信小程序服务器迁移流程

最近开发了一个公司内部使用的微信小程序,类似一个小程序版的简化版的 CRM 客户管理系统。这个小程序是在原有的内部办公小程序的基础上,扩展的功能。而之前的小程序是我刚加入这家公司时开发的,那时候公司一个云服务器也没有,于是为了快速上线,就直接部署到了我个人的服务器上。但是我个人的阿里云服务器马上就要到期了,也面临着迁移的麻烦,所以想顺便把这个小程序的 golang 后台部分直接迁回公司的服务器。毕竟,CRM 客户数据并不适合放到我的私有服务器上,目前调试测试阶段还好,正式上线就不能这么随便了。 昨天迁移了半天,发现还是挺麻烦的。 迁移流程 [x] 新建程序部署目录。更原服务器统一 [x] 迁 ...

阅读全文...

有时候程序有 bug 也未必是件坏事

塞翁失马,焉知非福。上周天晚上,我都准备睡觉了,突然接到一个长期合作客户的微信消息,说我写的一个程序不好用了,让我帮忙看看是怎么回事。 我也很疑惑,这套程序是三年前开发的,稳定运行了这么多年没出现过任何问题,怎么会突然就不好用了呢(๑•̌.•̑๑)ˀ̣ˀ̣ 登录上阿里云服务器,发现进程消失了,客户说自己发现程序不好用,就重启了服务器,但是重启后还是不好用。这就奇怪了,这个 golang 写的服务,配置了 systemd,按理说天塌了也能正常自动重启哇🤔 突然想到了磁盘空间,一看,果然磁盘满了。 原来罪魁祸首是我记录的日志太多,三年了,终于把磁盘空间用完了。算是一个小小的 bug 吧,为了偷懒 ...

阅读全文...