代码 > 修正flutter升级3.10升级到3.22后渲染出的问题
2024-05-22
具体来说,由于我的代码是按文字行渲染然后缓存的,发现部分行在linux桌面会随机丢失,统一版本mac os x 无此问题。
目测是异步没及时渲染成功的问题。于是调整了下代码。成功修复。
从
await recorder.endRecording().toImage()
调整为
recorder.endRecording().toImageSync()
问题解决。
基本是这个异步方法的问题。不知道是渲染问题,还是库的问题。
Linux > 修复ceph失效问题
2024-04-11
今天修复了自建pve的ceph失效问题。
症状是pve中ceph操作都超时,命令行ceph任何操作没反应,pveceph status 的话authenticate timed out after 300
折腾了一天,最后排除下来
5个mon节点,2个掉队了,一个磁盘出错,ceph-mon文件损坏,启动服务就bus error。
只剩2个mon不够投票,ceph就卡死了。
最后用文件占位法,把ceph文件mv成其他名字,reinstall下,搞定,赶紧把还有两个Mon重建了。
明天换磁盘重建。
老了,真的有点折腾不动了。
代码 > 使用了下清华开源的ChatGLM2-6B
2024-03-25
作了些简单的修正,轻松的架上了。
不得不说,还是有点东西的。
至少简单的文案能高个框架出来,感觉还是能解放点生产力的。
实际效果肯定不能和chatgpt比,但chatgpt肯定也不能在我的3060上跑阿。
不知道能否继续定制和学习,如果能方便的定制和学习的话,的确是非常不错的生产力工具。
Linux > 看了下hugo
2024-03-18
想搞个静态站,看了下hugo,试了下模板……
只能说,挺蛋疼的。
只能说,hugo之类静态发布的站点有其优点。
主要是不需要数据库,以及随之而来的高性能和安全。以及可以在github/文件服务/ftp空间上直接发布。
剩下的都是缺点,特别是发布和更新上。
发布麻烦,又不适合非IT人员。
最适合的场景个人觉得完全不是博客,而是相对内容发布较少的项目网站或组织首页。
Linux > 好用的socks proxy server microsocks
2023-12-18
https://github.com/rofl0r/microsocks
不错的单文件代理程序。
配合ufw的限制,很容易就能作出一个通过密码访问的proxy。
其他的dante/squid都太重了。
自己写的话不小心出bug容易被滥用。
代码 > 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,不该当作入口,而应该是业务系统负责调起的一个显示子系统。