GDAL 最近发布了 3.10 版本, 其中最重要的一个更新就是 栅格数据集只读线程安全 。 许多栅格算法,都需要独立和并发的方式读取栅格数据, 在以前的 GDAL 版本中, 由于 Dataset 不是线程安全的, 这些操作需要在单个线程中处理 I/O , 或者通过互斥锁来防止并发实用, 或者每个工作线程打开一个单独的 GDALDataset , 实现起来都会比较复杂。 因此 GDAL 在 3.10 版本中实现了 栅格数据集只读线程安全 , 提供可以从多个线程安全使用的特殊 GDALDataset 实例, 不需要用户再考虑线程安全的问题, 多线程读取栅格数据的操作将大大简化。 在 GD... 阅读全文
PostgreSQL 数据库的一大特征就是数组类型, 使用起来非常的方便, 但是 NHibernate 却一直没有添加对数组类型的支持,因此有必要扩展 NHibernate 以添加对数组类型的支持。 定义数据库方言 (Dialect) NHibernate 对不同提供了相应的数据库方言 (Dialect) ,要添加数组类型支持,自然要从数据库方言(Dialect)开始: public class NpgSqlDialect : NHibernate.Dialect.PostgreSQLDialect { public NpgSqlDialect() {} } 在 N... 阅读全文
现在 AI 非常的流行, 各方面的应用都非常多。 比如在代码提示这个赛道上, 就有很多基于 AI 大模型的代码提示工具, 比如最著名的 GitHub Copilot , 再比如阿里的 通义灵码 , 还有今天要重点介绍的 Continue 。 与其它类似的 AI 智能代码提示工具不同, Continue 是开源的, 支持调用本地部署的大模型服务, 可以在企业内部甚至是安全隔离的局域网中运行, 并且提供了完善本地运行的文档。如果是私有代码库, 无法使用基于互联网的 AI 智能提示, 那么使用 Continue 搭建本地的智能代码提示, 也能达到比较好的效果 (当然不能与收费的 GitHub... 阅读全文
Vite 是目前非常流行的前端的构建工具, 越来越多的项目开始使用 Vite 作为构建工具, 基于插件的扩展机制, 支持多种前端项目 (React、 Vue 等) 都构建, 甚至连 Angular 17+ 都开始采用 Vite 作为开发服务器。 Vite 对于单个前端项目的路由支持的非常好, 不用任何配置,就会自动回落 (Fallback) 到默认页面 /index.html , 因此对于单个前端项目来说非常的友好。 但是, 如果前端项目中采用了工作区 (monorepo) , 通常会有多个前端应用,这时 Vite 的支持就没那么好了。 以 pnpm 的工作区为例, 目录结构如下: ... 阅读全文
环境准备 在 MacBook 上本地运行大模型, 如要准备 Python 和 Xcode 以及 Git , 如果还没有安装的话, 按照下面的命令安装即可, 如果已经安装好了, 就可以跳过这两个步骤。 Python Python 目前建议安装 3.10 版本, 各方面支持都比较完善。 brew install python@3.10 Python 安装好之后, 再安装 torch torchaudio torchvision , 命令如下: pip3.10 install torch torchaudio torchvision Xcode Xcode 也是必须的,... 阅读全文
在操作 Linux 服务器时, 经常需要同时使用多个命令, 比如开着 htop 查看服务器负载, 同时调整配置等。虽然可以使用高级的客户端终端 (iTerm2, Microsoft Terminal) 同时建立多个连接到服务器, 但是有些服务器需要二次认证, 甚至不允许一个帐号进行多个连接,同时连接有的时候也会很不方便。 所以在服务器的终端内进行分屏也是有一定需要的。 GNU Screen 可以说是终端分屏/多任务的利器, 而且大多数的 Linux 服务器默认安装, 至少也是在默认的软件源中, 不需要添加第三方源, 安装与使用非常方便。 工作模式 Screen 的工作模式类似于 ... 阅读全文
useCallback 和 useMemo 是 React 函数组件开发中非常重要的两个函数, 分别用于缓存方法和变量, 可以避免不必要的渲染, 提升性能。 为什么要缓存? React 函数组件就是一个 TypeScript/JavaScript 函数,当组件状态变化时, React 会重新调用这个函数进行渲染, 如果不使用缓存的话, 会导致函数组件內定义的函数和变量都会被重新定义和初始化, 从而导致错误的更新和渲染。 比如下面的代码: import { useEffect, useState } from 'react'; export function MyComp() {... 阅读全文
React 组件既然有状态, 就肯定需要根据状态的进行交互和同步, 在 React Hooks 使用 useEffect 和 useLayoutEffect 函数进行同步。 吐槽一点, Effect 虽然是被用作同步的, 但是 Effect 本身的字面意思和同步没有任何关系, 导致很多中文文档中都翻译成 效应 , 副作用 之类的, 感觉有点儿不伦不类, 至少和同步不搭边。 这一点, React 官方也没有一个说法, 至今没有一个 信达雅 的中文翻译。 useEffect useEffect 的函数定义是这样的: function useEffect( effect: ... 阅读全文
最近打算在微信上写点儿 Web 应用, 想法很简单, 就是通过微信直接发送地址, 在微信的 Webview 中直接运行,不安装。 想法是好的, 然而没想到的是现在 (2023 年 3 月) 微信的 Webview 的版本居然还是 Chrome/86 , 而当前主流的版本已经是 Chrome/110 了, 差了 20 多个版本, 于是忍不住在 V2EX 发了一片吐槽的帖子: 2023 年又发现了一个 “IE6” ,那就是安卓版微信内置的 Webview , 得到了好多网友的回复。 更加没想到的是, 支付宝/钉钉等阿里系软件内嵌的 Webview 居然更低的 Chrome/69 ,... 阅读全文
之前一直使用 Angular 作为前端开发的基础框架, 虽然 Angular 一直是一个非常优秀的框架, 现在也是, 甚至未来也会是, 但是鉴于目前国内 (中国大陆) 的现状, 再掌握一个流行的前端框架是很有必要的, 在认真对比了 React 和 Vue 之后, 选择了 React 作为前端基础框架。 在我看来, React 的优势主要有: 生态好 主流的 IDE , 不管是 VSCode 及其衍生产品, 还是 JetBrains 家族的 IDE 及其衍生产品, 都内置 React 支持, 而 Angular 和 Vue 则都需要安装插件才行。TypeScr... 阅读全文
Ubuntu 升级到 Ubuntu 22.04 之后, 系统自带的 Wi-Fi 热点功能就不能用了, 共享的热点无法连接, 应该是 wpa_supplicant-2.10 导致的 (https://blog.incompetent.me/2022/07/27/workaround-ubuntu-22-04-hotspot-stops-working/) , 目前最容易的做法就是将这个包降级至 wpa_supplicant-2.9 , 然后就一切正常, 记录如下。 添加降级所需的旧的存储库 使用 nano 编辑 /etd/apt/source.list 文件: sudo nano /... 阅读全文
Ryujinx 模拟器安装与初始化 Ryujinx 是一个开源的任天堂 Switch 模拟器,由 gdkchan 创建, 用 C# 编写。 这个模拟器的目标是提供出色的准确性和性能, 一个用户友好的界面, 以及一致的构建。 为什么要装这个 Ryuginx 模拟器呢, 原因如下: 上面说了, Ryujinx 是用 C# 编写的, 作为一个多年使用 C# 程序的程序员, 倍感亲切, 肯定要支持一下; Ryujinx 适配了 Mac M1 芯片, 这更要体验一下了; 任天堂的游戏评价很高, 一直想体验一下, 至于为什么不买个 Switch 则不在本文讨论范围内。 Ryu... 阅读全文