Contents

ARST打卡第260周

lc2639_查询网格图中每一列的宽度 当你集中注意力的时候大脑会发生什么?【TED演讲】 DNSCache实现 反射获取 grpc Invoke any参数具体类型

Algorithm

lc2639_查询网格图中每一列的宽度

按照题意模拟就行了

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
class Solution {
public:
    vector<int> findColumnWidth(vector<vector<int>>& grid) {
        int m = grid.size();
        int n = grid[0].size();
        vector<int> ans(n, 1);
        for (int j = 0; j < n; j++) {
            for (int i = 0; i < m; i++) {
                int item_len = std::to_string(grid[i][j]).length();
                if (item_len > ans[j]) {
                    ans[j] = item_len;
                }
            }
        }
        return ans;
    }
};

Review

当你集中注意力的时候大脑会发生什么?【TED演讲】

人类的专注分为眼前专注力和内隐专注力。

眼前专注力专注眼前的事物,内隐专注力则会感知周围事物,并且过滤掉不重要的信号,这样就能专注到关注的信号上。

可以通过模拟注意力时脑电波一一映射,从而确定人在想什么,从而可能实现一个脑机接口。

Tips

DNSCache实现

App层加 DNSCache 缓存,减少 DNS 服务器压力。

juiceFS 也使用了这个库。

Share

反射获取 grpc Invoke any参数具体类型

 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
33
34
35
 func (channel *KRpcChannel) Invoke(ctx context.Context, methodDescriptor string, args any, reply any, opts ...grpc.CallOption) error {
-       // 将结构体数据编码为 JSON 格式
-       reqData, err := json.Marshal(args)
+       // 通过反射获取args的类型,并将数据编码为protobuf的二进制码
+       reqType := reflect.TypeOf(args).Elem()
+       req := reflect.New(reqType).Interface().(pb.Message)
+       reflect.ValueOf(req).Elem().Set(reflect.ValueOf(args).Elem())
+       // fmt.Println("[Debug] reflect req: ", req)
+       reqData, err := pb.Marshal(req)
        if err != nil {
-               fmt.Println("Error encoding JSON:", err)
+               fmt.Println("Error encoding:", err)
        }
        // 创建一个 Buffer 来存储请求内容
        body := bytes.NewReader(reqData)
        // ...
        headers := map[string]string{
-               "Content-Type":   "application/json",
+               "Content-Type":   "application/binary",
                "Content-Length": fmt.Sprintf("%d", body.Len()),
        }
@@ -116,13 +121,20 @@ func (channel *KRpcChannel) Invoke(ctx context.Context, methodDescriptor string,
-               err = json.Unmarshal(respStr, reply)
+               // fmt.Println("[Debug] RespStr: ", respStr)
+
+               // 反射解包reply,暂时装载到 replyMsg 中
+               replyType := reflect.TypeOf(reply).Elem()
+               respMsg := reflect.New(replyType).Interface().(pb.Message)
+               err = pb.Unmarshal(respStr, respMsg)
                if err != nil {
-                       return fmt.Errorf("error decoding JSON: %w, str: %s", err, respStr)
+                       return fmt.Errorf("error decoding : %w, str: %s", err, respStr)
                }
+               // 把结果复制到 reply
+               reflect.ValueOf(reply).Elem().Set(reflect.ValueOf(respMsg).Elem())