代码 > 搞定cgo编译musl的pcre库了

2024-06-21

从alpine.pkgs.org 下载alpine的pcre和pcredev包。

配上对应的musl的libc,直接静态编译,结束。

代码大概是

export lib=`cd $(dirname $0)/../../lib/pcre-musl; pwd`

CGO_LDFLAGS="-L$lib -Wl,-rpath=$lib -s -w" CC="musl-gcc" CGO_ENABLED=1 go build -tags 'musl' -a --ldflags "-linkmode external -extldflags '-static'" --trimpath -o ../../bin/hellclient ../

提示找不到-lpcre时其实是找不到libpcre.so.a,从pcre-dev包里搞过来就行。

离开glibc,全身舒爽。

终于体会了lgp/lgpl传染的恶心了。

我不是不接受lgpl,我不是不能接受动态链接。

但是动态连接哪哪都提示glibc系统版本不够高太恶心了。

更何况引入pcre这种mit库的时候。

我只是开个cgo引个dll,压根不想用你牛逼轰轰的glibc好不……

我甚至都用netgo不用你那个破网络库了。

打包编译,在centos7上都能正常运行,一下子就舒服了。

接下去就做稳定性测试了。

 

代码 > 用了下github actions

2024-06-09

试用了下github actions自动发布。

总体感觉还行,的确是不从的功能。

唯一的问题是,yaml的依赖空格的语法是在是过于蛋疼。

代码 > hugo体验

2024-06-08

第一个用hugo的站点上线了。

怎么说呢,能用,某些很窄的场合好用,大部分情况不好用。

hugo或者类似的静态博客/网站做网站,特点是:

1.使用md这个对普通用户不友好的格式

2.发布方式极度依赖技术经验

3.有一套简单的模板系统,不能适用过于复杂的站点

4.不能方便套用表单,搜索等常用功能

总体来说,特别适合做

与计算机相关的(需要技术背景),团队较小(没专门的编辑),页面较多(不然不如手写html),更新较少的网站

基本就是软件/开源项目的官方站点的样子。

其他的场合未毕好用。

代码 > flutter选择背景和文字背景冲突

2024-05-29

具体来说,就是选择背景SelectionColor比背景色backgroundColor优先级低,所以在设置过前/背景色的文本上,选择色的设置无效。

一番搜索,已经有两个issus被提出来了

https://github.com/flutter/flutter/issues/79168

https://github.com/flutter/flutter/issues/96112

怎么说呢,虽然不算常见场景,但需要用的时候还挺蛋疼。

这么久也没修复,感觉真的要修复得接管整个选择目标的渲染流程了。蛋疼。

 

PS

用了个比较脏的Hack

用WidgetSpan(Container(Text())) 代替了TextSpan

将背景色和TextStyle分离

背景色设在Container上

TextStyle给Text

这样Text是没背景色的,选择色就能覆盖背景色了,

由于TextStyle是只读的,还不能单纯的去除背景信息,只能再封装一下原来的textstyle方法。

不得不说,真脏。

代码 > flutter的showDialog

2024-05-23

这次调代码的主要原因就是随着flutter sdk版本升级,showdiablog失效了……

 

怎么说呢。

 

flutter的showDialog虽然名字是showDialog,但它本质值是伪装成showDialog的功能。

本质是在导航里插入一个临时节点,然后在临时节点里显示Dialog的内容。

3.10-3.22不知道那个版本的更新修改了逻辑,showDialog会触发一次路由匹配……

 

正经来说

showDialog需要指定context和useRootNavigator。

理论上,按照传统的showDialog函数的用法。

少副作用的showDialog需要在容器里用一个Navigator组件来包住子元素。

然后通过指定Navigator的Key的方式,在运行时获取到Navigator的context。

然后,再取消useRootNavigator,这样才能限制showDialog的副作用在自定义的Navigator内。

完全理通的时候,能够理解这个逻辑。

但文档里没说清楚的话,刚开始用真的太容易踩坑了。

代码 > 修正flutter升级3.10升级到3.22后渲染出的问题

2024-05-22

具体来说,由于我的代码是按文字行渲染然后缓存的,发现部分行在linux桌面会随机丢失,统一版本mac os x 无此问题。

目测是异步没及时渲染成功的问题。于是调整了下代码。成功修复。

await recorder.endRecording().toImage()

调整为

recorder.endRecording().toImageSync()

问题解决。

基本是这个异步方法的问题。不知道是渲染问题,还是库的问题。

代码 > 使用了下清华开源的ChatGLM2-6B

2024-03-25

作了些简单的修正,轻松的架上了。

不得不说,还是有点东西的。

至少简单的文案能高个框架出来,感觉还是能解放点生产力的。

实际效果肯定不能和chatgpt比,但chatgpt肯定也不能在我的3060上跑阿。

不知道能否继续定制和学习,如果能方便的定制和学习的话,的确是非常不错的生产力工具。

代码 > flutter中强制Statefull子元素更新

2023-11-22

为了效率,flutter的setState是只更新依赖当前State的Widget的,维护自己独立Widget,通过listen event独立更新的子Widget是不会因为setState更新的。

但有时候整个Widget的刷新是必须的,一层层向下Bind Event是不可接受的。

这时候可以通过setState更新父元素的key来实现。不同的key的父元素代表不同的组件,自然会重建了。

元素添加一个属性

var _refreshKey = UniqueKey();
 

build时指定key

return RawKeyboardListener(
key: _refreshKey,
 

需要时重设key

setState(() {
_refreshKey = UniqueKey();
});
 

就能替换整个组件树了。

 

代码 > flutter中自适应缩放窗口

2023-11-21

做网页有个常见的偷懒方法,网页中设置一个最小宽度,这样手机浏览器小于这个宽度时会自动缩放。

flutter里用FittedBox实现这个功能

minWitdh是最小宽度。

height可选,不填写根据父元素约束的maxHeight计算

 

import 'package:flutter/material.dart';

class Fullscreen extends StatelessWidget {
const Fullscreen(
{super.key, required this.child, required this.minWidth, this.height});
final Widget child;
//fixed raw widget height
//Use constraints.maxHeight if null.
final double? height;
final double minWidth;
@override
Widget build(BuildContext context) {
return LayoutBuilder(builder: (cotext, constraints) {
Widget body = child;
final widgetHeight =
height jQuery33100915512005582535_1700544202060 constraints.maxHeight / constraints.maxWidth * minWidth;
if (constraints.maxWidth < minWidth) {
body = FittedBox(
fit: BoxFit.fitWidth,
child: SizedBox(
width: minWidth,
height: widgetHeight,
child: child,
));
}
return body;
});
}
}

代码 > flutter 感受4

2023-11-17

昨天折腾到3点,才把app架构理顺了。

flutter刚建立好的代码很有诱惑性,似乎一个app应该是树状结构。

实际并不是。

Widget本质不是树,只是一片叶子。负责渲染部分。

state更只是 当前页面的 显示用数据,只是一个vm。

APP本身必须组件一个自己的业务系统。

业务系统是全局的静态对象,随着应用进入进入,随着应用退出退出。

提供各种Listenable供Widget绑定接受数据(ViewModel)。

调用服务器数据更新自己的业务内容(Model)

本来说runApp就是buidui,不该当作入口,而应该是业务系统负责调起的一个显示子系统。