软件授权是为了限定软件部署后的部分或者全部功能在特定时间点之后不可用。Standard.Licensing 提供了基于非对称加密的许可生成、验证功能
让WSL2使用上Windows中的ssh-agent
目标: 使用pageant作为ssh链接的agent/bridge,做到只需在pageant启动时中输入一次passphrasse,精简WSL2 + Windows中所有ssh相关(ssh、git等)的认证流程。
本文假设ssh key已经正确生成。
使用Clickhouse的materialized view实现By Time Alignment的预聚合
常规的视图(View)可以看作一个预先保存好的查询,而Clickhouse的物化视图(materialized view,MV)功能类似于数据的插入触发器,会在来源数据插入的时候按照定义更新MV对应的数据
关于任务调度/分发系统的设计总结(0)
以数据采集系统为例,简单记录一下如何设计一个相对可用的任务调度/分发系统
使用YARP初步替代静态文件+API转发
这是一篇在github.dev上编辑出来的blog
简单实现一个SSH连接池
使用 ObjectPool + Microsoft.Extensions.Caching.Memory 通过缓存SshClient来实现简单的SSH连接池
一些GitHub上发现的项目(一)
主要用来记录一些在GitHub上发现的项目。
AspNetCore 基于EF Core + HotChocolate 实现的GraphQL查询
GraphQL: A query language for your API
在开发常见的CRUD应用时,最长遇到的需求是对特定的几个实体进行增删改查,比较常见的方式是手写对应的CRUD逻辑,麻烦且重复,即使引入了EFCore这类ORM,本文介绍如何在常见的CRUD项目中集成GraphQL,减少我们手写重复相关逻辑的麻烦。
本文相关代码都在 https://github.com/Itoktsnhc/demo-graphql 中,为了简单起见,数据库使用SQLite。
EF Core的一种动态排序实现
当我们使用EF的时候,有时候需要到处理运行时才可以确定的排序规则字符串,例如
-Name,Type,-Age
这样的排序规则串代表按照Name降序,然后按照Type升序,最后按照Age倒序。可以使用 System.Linq.Dynamic.Core 来实现。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33class Person //entity定义
{
public string Name { get; set; }
public int Age { get; set; }
public string Type { get; set; }
}
//query:IQueryable<T>; sortStr类似`-Name,Type,-Age`
//首先将IQueryable<T> 转换为 IOrderedQueryable<T>
var orderedQuery = query.OrderBy(_ => 0);
//获取类型的所有属性,映射为 (全大写)->原属性的字典
var props = typeof (Person)
.GetProperties()
.ToDictionary(s => s.Name.ToUpper(), s => s.Name);
//确定排序条件
var sorts = sortStr.Split(',', StringSplitOptions.RemoveEmptyEntries)
.Select(s =>
{
var tmp = s.Trim().ToUpper();
return (!tmp.StartsWith("-"), tmp.TrimStart('-'));
});
//按照可用的属性名
foreach(var (isAsc, sort) in sorts) {
if (props.TryGetValue(sort, out var propName))
{
orderedQuery = orderedQuery.ThenBy(propName + (isAsc ? " ASC" : " DESC"));
}
}
query = orderedQuery;