Wednesday, August 4, 2021

V2EX - 技术

V2EX - 技术


有什么家庭内部可用的简单构建高速 NAS 的方案吗?包含商业产品,可以花一些钱

Posted: 04 Aug 2021 05:15 AM PDT

如题,目前家里有我的台式机+笔记本,以及老婆的台式机+笔记本,需要解决数据共享和储存问题,比如我的电脑里存了太多高清电影,一部就要几十 G,台式机挂满了硬盘也很快就用的没空间了。

想问一下有没有大佬跟我同样需求的做过解决方案,能不能分享一下。

我目前的设想是,有什么内网速度很高的无线路由,加上一个合适的 nas 来解决这个问题。

需求: 1 、网盘数据方便管理,远程网盘映射到 win 系统当中后可以进行常规文件管理操作。 2 、需求一定的容量,至少 3 个硬盘位,装上大容量硬盘的话应该有几十 T 。 3 、速度方面要求不高,家里能达到 usb2.0 时代的速度(物理传输 30MBps )在我看来已经勉强堪用,当然了能更高是更好了,如果有 100MBps 那就很开心了。 4 、不太需要异地式的远程访问功能,不过有的话当然更好。

谢谢大家

想做一个国内用的 APP,数据库选用什么比较好?

Posted: 04 Aug 2021 05:14 AM PDT

没有后端基础,想了解一下 2021 年当下基于个人小 APP 开发,主要面向国内用户,该怎么选用数据库?数据库想用于 APP 获取数据展示,主要数据由开发者提交创建,同时 APP 用户也有权限对部分数据进行操作修改。

目前了解到苹果的 CloudKit 有 public database,基本能满足我想做的,但是缺点是跨平台问题,同时担忧国内访问速度。然后 Firestore Datebase 也有了解了一下,也是担心国内访问问题,以及是否会有通信方面的安全问题。

因为没有开发过联网、有数据通信的 APP,所以真的很多疑问。现在想学习这方面的内容,请教大家有什么建议吗?

WPS Office Linux 版存储配置文件时,使用反斜杠作为文件路径分隔符

Posted: 04 Aug 2021 05:12 AM PDT

如图,猜测 WPS 产生的文件的保存路径是~/.local/share/kingsoft/office6/wpsbox/918298911/wpsbox.db,结果产生的文件是~/.local/share\kingsoft\office6\wpsbox\918298911\wpsbox.db

Dolphin

Terminal

大家如何同步多终端代码,以 idea 为例

Posted: 04 Aug 2021 04:59 AM PDT

比如说代码变更啥的,不 push 到远程分支的情况下,如何同步代码

VS Code,生于前端,成于前端

Posted: 04 Aug 2021 04:54 AM PDT

我在 NG+ 开发者大会上的演讲视频!

https://www.bilibili.com/video/BV1WU4y1J782

聊聊 VS Code 与前端密不可分的联系~
• VS Code 简介
• VS Code 使用到的前端技术栈( Electron, Monaco, LSP, DAP, Xterm.js 等)
• VS Code Remote,前后端分离
• Web 版 VS Code,带来更多可能
• VS Code 插件模型

PHP 请求超时,不晓得具体是哪里的配置?

Posted: 04 Aug 2021 04:21 AM PDT

每一条 post 请求都是在 10s 时中断,后台返回 502 Bad Gateway 。然后响应头显示 keep-alive: timeout 4

但是,在 php.ini 的 max_execution_time: 300,以及 php-fpm.conf 中的 request_terminate_timeout: 0 均已配置,同时也没有报错日志。

按理,服务器应该不会有 10s 的限制,数据库( mysql )更不会有。。

所以是哪里的配置。。好生奇怪。

关于面试时面试官提出的一些疑问,求解答

Posted: 04 Aug 2021 03:22 AM PDT

问题 1:mysql 给表中的 a,b,c 三个列建立联合索引,select * from t where a=1 and b > 2 order by c,面试官问会不会走这个联合索引,我说:会,因为满足了最左前缀匹配。面试说让我下去好好了解了解。

问题 2:面试官问 redis 缓存和数据库一致性问题,我说:增删改的时候先删 redis 缓存再操作数据库。面试官问如果 redis 删除失败了怎么办?我说:redis 操作失败了就抛出异常,不会再对数据库操作。面试官问:如果需要 redis 操作失败的情况下也需要对数据库增删改成功,并且避免读出脏数据,改怎么做?我没想出来。

不能升级 Windows11,还有没有体验 WSL GUI 的方法?

Posted: 04 Aug 2021 03:10 AM PDT

硬件不支持升级 Windows11,所以我的 insider program 里面只有一个 Release Preview channel 可以选。但是这个 channel 的版本应该是不够 WSL GUI 的要求。看着 WSL GUI 感觉好香,想用。也不知道正式的更新什么时候才能包含进来这个功能 55555

doxygen 用于 C++项目

Posted: 04 Aug 2021 03:03 AM PDT

各位公司、开源的 C++工程用 doxygen 给代码生成文档的多吗?使用体验如何?

mysql proxy 选择 ProxySQL 还是 KingShard

Posted: 04 Aug 2021 02:56 AM PDT

一旦有了辞职的念头,就挥之不去深入骨髓了��

Posted: 04 Aug 2021 02:50 AM PDT

每天因为各种琐事,看着自己辞职的进度条一点一点增加,感觉快要一点就炸了

咨询一个网络问题

Posted: 04 Aug 2021 02:27 AM PDT

公司有线网访问外网 ip(例如 22.22.22.223),post 请求会引发跨域,

►Access to XMLHttpRequest at 'http:ZZ192.168.101.lZpisa :xxxx/#Zlogin:1 ble/disable.htm?url type-%ETO^BFEE§%57&E%F7%ro£j$99/%49%50%E7%AB%99%E7%8 2%B9&plc name=%E6%99%AE%E9%80%9A%E5%91%98%E5%B7%A5' (redirected from 'htt p://xxxxxx/') from origin * http://xxxxx has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
►GET http://192.168.101.lZdisableZdisable.ht chunk-vendors.0731f280.js:189 m?url type=%E8%AE%BF%E9%97%AE%E7%BD%.J»99/%49%50%E7%AB%99%E7%82%B9&plc name=% E6%99%AE%E9%80%9A%E5%91%98%E5%B7%A5 net::ERR_FAILED

get 没问题,但是无线网不会出问题。同时热点访问该外网 ip 没有任何问题。

求问之前在 Github 上看到过可以把代码片段格式化成漂亮图片的开源库叫什么来着?

Posted: 04 Aug 2021 02:20 AM PDT

时间有点久了,当时也忘了 star,我记得是可以把代码片段格式化生成 mac window 风格的图片或者是 html.

希望找人兼职在 Linux 创建个 c++ .so package

Posted: 04 Aug 2021 01:46 AM PDT

大家好,

我们在 Linux 有个用 c++11 编写的应用程序。希望找人兼职在 Linux 创建个 c++ .so package 。

具体需求是:
- 创建个 OpenWRT package,初始简单的 c++ 程序。
- 将这个简单的 c++ 程序,编译成 .so
- 会提供我们的 c++ 程序的基础代码,希望能将您编写的 .so 动态链接进来。

有意者,请邮件联系: info@usb7.net

重新改造了下自己的 VuePress 2 主题,欢迎试用

Posted: 04 Aug 2021 01:36 AM PDT

文档地址: https://vuepress-theme-mix.netlify.app/

说明:刚开始在 V 站发过一次( https://v2ex.com/t/777272#reply3 ),那时的 UI 看起来还太过粗糙,就重新改造了下,欢迎大家使用,如果能提点建议那就更好了。另外,再次说明下,本人并非专业前端,也没有设计经验,对有些问题,仅凭个人有限的能力水平,实在难以解决,此次发帖,也希望有兴趣的小伙伴能够参与进来,共同维护。🖖

有没有内存数据库可以存矢量(比如 numpy 中的 ndarry)可以支持简单矢量运算

Posted: 04 Aug 2021 01:01 AM PDT

想把特征值矢量全都存 DB,一般只是存一个进去,然后与之前的所有的矢量进行比较。 拿到比较结果就行。

不想着全部取出来,拿到应用本地再计算。就想着在数据库层面做掉。

如果这个内存数据库能支持 ndarry 就更好了。

类似这样的效果,从图片或视频流中识别物品,目前有开源的算法吗?求指点

Posted: 04 Aug 2021 01:00 AM PDT

IMG_1.JPG

IMG_2.JPG

IMG_3.JPG

基本工资标准表数据库怎么设计

Posted: 04 Aug 2021 12:52 AM PDT

数据修改的时候怎么保留历史数据

岗位等级表
岗位 岗位等级 基本工资 岗位工资 基础工资
总经理 1 2000 4000 6000
2 2000 3500 5500
3 2000 3000 5000
总监、副总 4 800 2600 3400
5 800 2300 3100
6 800 2000 2800
部门经理 7 600 1800 2400
8 600 1600 2200
9 600 1400 2000
部门副经理 10 500 1300 1800
11 500 1200 1700
12 500 1100 1600
技术员 13 400 950 1350
14 400 900 1300
15 400 850 1250
16 400 800 1200
科员 17 400 850 1250
18 400 800 1200
19 400 750 1150
20 400 700 1100

关于防火墙规则丢失的一个疑惑

Posted: 04 Aug 2021 12:23 AM PDT

操作系统是 CentOS7.9

在执行完类似于下述命令之后,防火墙是正常的,新的规则也添加进去了。但是在服务器重启之后,使用这个命令添加的规则就失效了。我很不解,谷歌也没有任何相关的情况。

而且这不是我一个人出现的问题,是我所在的工作组,所有人这几年使用之后都切身感受到的。各种 CentOS 系统的机子,客户的、自己的、其他部门的,都这样。

firewall-cmd --permanent xxxxxxxxxxxxx firewall-cmd --reload 

我很不解。希望能有人解惑。

钉钉微应用开发 SpringBoot + VUE

Posted: 04 Aug 2021 12:20 AM PDT

logo

Prod Status

Dingtalk Springboot

目标与期望

基于钉钉微应用开发的实验室绩效管理系统,将实验室的绩效、学分、论文评审管理与钉钉对接。
主要功能有:绩效、学分申请与审核,论文评审投票及学分管理,实验室助研金计算等,导出绩效和助研金报表。

涉及的技术

SpringBoot

JPA

Mybatis

MySQL 8

Dingtalk SDK

Docker

Docker Compose

Github Actions

注意事项

  • 使用了 lombok 插件简化代码,idea 需要安装 lombok 插件,否则编译过不去
  • 由于目前钉钉小程序只支持 GET/POST, 考虑到兼容性这里的接口全部为 GET/POST 方式
  • 系统启动时,初始化操作会调用钉钉 SDK,拉取钉钉组织的所有用户, 请先在开发平台设置出口 IP

系统部署

本项目使用 GitHub Actions 实现 CI,受外网网速限制,没有采用在 GitHub 机器上构件镜像,再拉取到服务器上运行的方式。而是在每次 CI 触发后,GitHub 机器 ssh 登陆服务器,执行脚本来拉取最新代码,构建镜像,并运行容器,具体如下:

  1. 从 GitHub 仓库中拉去最新代码到服务器本地仓库
  2. 使用 mvn 构建项目
  3. docker-compose build 构建镜像
  4. docker-compose up -d 在后台启动容器
  5. docker image prune -f 清理无用的镜像

GitHub Actions 的 CI 脚本如下

  • 生产环境 CI 脚本:.github/workflows/prod.yml
  • 测试环境 CI 脚本:.github/workflows/test.yml
  • 与 CI 脚本对应的项目结构如下
    . |__ dingtalk     |__ dingtalk-springboot  // 后端代码     |__ dingtalk-vue         // 前端代码     |__ docker-compose.yml   // docker-compose 配置文件 

docker-compose 编排配置如下:

系统运维

前端预览

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

project-detail-1.png

project-detail-2.png

感觉对外的 API 层需要 gateway 网关,对内部核心服务是不是可以不需要网关

Posted: 03 Aug 2021 11:25 PM PDT

今天发现一个问题,就是 grpc 是不能支持像 http 那种 path 一样的,https://github.com/grpc/grpc/issues/14900 如果我开发一个服务 A 配了一个域名 A 服务 B 得再配个域名 B,这样显然是很不合理的。

所以针对这样有两个解决办法 1.使用统一网关。 2.本地从服务注册中心维护一份其它服务的 ip+端口,然后直接本地随机选取一个调用,这样就不需要网关了。 就有点类似于 service mesh 。它的理念是网关本地化,其实也是这么个道理- -

对内的服务的话可能不一定需要统一的鉴权之类的,所以网关感觉就很鸡肋

对外的 API 的话 我感觉还是有必要有一层网关的

redis 集群模式两分片,前置代理访问。其中一个分片内存满了,会怎么样?

Posted: 03 Aug 2021 10:51 PM PDT

最近发现一个 bug,set 数据时无异常不报错,但是 get 却取不到? 通过监控发现是其中一个分片内存 100%了。 哪位大神帮忙解惑下? (采买的是阿里云 redis 社区版本集群 2 分片)

Google 中国的 gTech TSC 是个什么职位

Posted: 03 Aug 2021 10:36 PM PDT

最近有收到 Google HR 的消息,推荐了一个 gTech Technical Solution Consultant 的工作。但稍微聊了下,发现既不是售前又不是售后,也不是产品研发。没有销售指标,也不写代码,也不接 ticket 。只知道属于广告业务。

就想问问有没有了解的好兄弟介绍一下这是个什么角色。职业发展会是什么样的?

推送小精灵支持群聊接口, 用 api 发消息到微信群,机器人很适合做监控。

Posted: 03 Aug 2021 08:56 PM PDT

老规矩先上项目地址, 大佬们请点一下星星支持

https://github.com/tans/push-bot

机器人的消息小弟都能看到的, 所以大家不要乱发啊。

加机器人到群, 就可以获得一个发送 api, 调用 api 就能发消息到群上了, 是不是很方便。

目前使用最多的场景是

  1. 数字货币行情信息
  2. 用户异常行为监控

果然都是开发者, 炒币花样多多。

有没有人想造一个自己的专属机器人,可以找我协助开发。这个机器人就免费给大家折腾。

加机器人体验一把新的群聊发送功能。

Result 的方式处理异常用的多吗,我看了下好像和比较受好评的 rust result 用法差不多

Posted: 03 Aug 2021 08:55 PM PDT

但是网上搜了下好像完全没什么热度

Paintinglite Sqlite3 SDK

Posted: 03 Aug 2021 08:23 PM PDT

Paintinglite [ Github ] https://github.com/CreaterOS/Paintinglite

Pod installation

pod'Paintinglite', :git =>'https://github.com/CreaterOS/Paintinglite.git'#, :tag => '2.1.1' Introduction

Paintinglite is an excellent and fast Sqlite3 database framework. Paintinglite has good encapsulation of data, fast data insertion characteristics, and can still show good resource utilization for huge amounts of data. Paintinglite supports object mapping and has carried out a very lightweight object encapsulation on sqlite3. It establishes a mapping relationship between POJOs and database tables. Paintinglite can automatically generate SQL statements and manually write SQL statements to achieve convenient development and efficient querying. All-in-one lightweight framework.

Database operation (PaintingliteSessionManager)

  1. Build a library

Create PaintingliteSessionManager, create a database through the manager.

-(Boolean)openSqlite:(NSString *)fileName;

-(Boolean)openSqlite:(NSString *)fileName completeHandler:(void(^ __nullable)(NSString *filePath,PaintingliteSessionError *error,Boolean success))completeHandler; **Paintinglite has a good processing mechanism. It creates a database by passing in the database name. Even if the database suffix is ​​not standardized, it can still create a database with a .db suffix. **

[self.sessionM openSqlite:@"sqlite"]; [self.sessionM openSqlite:@"sqlite02.db"]; [self.sessionM openSqlite:@"sqlite03.image"]; [self.sessionM openSqlite:@"sqlite04.text"]; [self.sessionM openSqlite:@"sqlite05.."]; **Get the absolute path of the created database. **

[self.sessionM openSqlite:@"sqlite" completeHandler:^(NSString * _Nonnull filePath, PaintingliteSessionError * _Nonnull error, Boolean success) { if (success) { NSLog(@"%@",filePath); } }]; 2. Close the library

-(Boolean)releaseSqlite;

-(Boolean)releaseSqliteCompleteHandler:(void(^)(PaintingliteSessionError *error,Boolean success))completeHandler; 3. Create a table

Three ways to create a table:

SQL creation [self.sessionM execTableOptForSQL:@"CREATE TABLE IF NOT EXISTS cart(UUID VARCHAR(20) NOT NULL PRIMARY KEY,shoppingName TEXT,shoppingID INT(11))" completeHandler:^(PaintingliteSessionError * _Nonnull error, Boolean success) { if (success) { NSLog(@"===CREATE TABLE SUCCESS==="); } }]; Table name creation [self.sessionM createTableForName:@"student" content:@"name TEXT,age INTEGER"]; Object creation User *user = [[User alloc] init]; [self.sessionM createTableForObj:user createStyle:PaintingliteDataBaseOptionsUUID]; Object creation can automatically generate primary keys:

Primary key Type UUID String ID Value 4. Update table

Three ways to update the table:

SQL Update

Table name update

[self.sessionM alterTableForName:@"cart" newName:@"carts"]; [self.sessionM alterTableAddColumnWithTableName:@"carts" columnName:@"newColumn" columnType:@"TEXT"]; Object update Update User table operation #import

NS_ASSUME_NONNULL_BEGIN

@interface User: NSObject

@property (nonatomic,strong)NSString *name; @property (nonatomic,strong)NSNumber *age; @property (nonatomic,strong)NSMutableArray *mutableArray;

@end

NS_ASSUME_NONNULL_END According to the mapping relationship between the table and the object, the table fields are automatically updated according to the object.

User *user = [[User alloc] init]; [self.sessionM alterTableForObj:user]; 5. Delete operation

Three ways to delete a table:

SQL operations Table name deletion [self.sessionM execTableOptForSQL:@"DROP TABLE carts" completeHandler:^(PaintingliteSessionError * _Nonnull error, Boolean success) { if (success) { NSLog(@"===DROP TABLE SUCCESS==="); } }]; Object deletion User *user = [[User alloc] init]; [self.sessionM dropTableForObj:user]; Table operation

  1. Query

**Query can provide the feature of query results encapsulated in array or directly encapsulated by object. **

General inquiry -General enquiries -(NSMutableArray *)execQuerySQL:(NSString *__nonnull)sql; -(Boolean)execQuerySQL:(NSString *__nonnull)sql completeHandler:(void(^ __nullable)(PaintingliteSessionError *error,Boolean success,NSMutableArray *resArray))completeHandler; [self.sessionM execQuerySQL:@"SELECT * FROM student" completeHandler:^(PaintingliteSessionError * _Nonnull error, Boolean success, NSMutableArray * _Nonnull resArray) { if (success) { for (NSDictionary *dict in resArray) { NSLog(@"%@",dict); } } }]; -Package query

Encapsulated query can encapsulate query results into objects corresponding to table fields.

-(id)execQuerySQL:(NSString *__nonnull)sql obj:(id)obj; -(Boolean)execQuerySQL:(NSString *__nonnull)sql obj:(id)obj completeHandler:(void(^ __nullable)(PaintingliteSessionError *error,Boolean success,NSMutableArray *resArray,NSMutableArray<id> *resObjList))completeHandler; Student *stu = [[Student alloc] init]; [self.sessionM execQuerySQL:@"SELECT * FROM student" obj:stu completeHandler:^(PaintingliteSessionError * _Nonnull error, Boolean success, NSMutableArray<NSDictionary *> * _Nonnull resArray, NSMutableArray<id> * _Nonnull resObjList) { if (success) { for (Student *stu in resObjList) { NSLog(@"stu.name = %@ and stu.age = %@",stu.name,stu.age); } } }]; Conditional query Conditional query syntax rules:

Subscripts start from 0 Use? As a placeholder for conditional parameters SELECT * FROM user WHERE name =? And age =? -(NSMutableArray *)execPrepareStatementSql; -(Boolean)execPrepareStatementSqlCompleteHandler:(void(^ __nullable)(PaintingliteSessionError *error,Boolean success,NSMutableArray *resArray))completeHandler; [self.sessionM execQuerySQLPrepareStatementSql:@"SELECT * FROM student WHERE name = ?"]; [self.sessionM setPrepareStatementPQLParameter:0 paramter:@"CreaterOS"]; NSLog(@"%@",[self.sessionM execPrepareStatementSql]); Fuzzy query -(NSMutableArray *)execLikeQuerySQLWithTableName:(NSString *__nonnull)tableName field:(NSString *__nonnull)field like:(NSString *__nonnull)like; -(Boolean)execLikeQuerySQLWithTableName:(NSString *__nonnull)tableName field:(NSString *__nonnull)field like:(NSString *__nonnull)like completeHandler:(void(^)(PaintingliteSessionError *error,Boolean success,NSMutableArray *resArray))completeHandler;

-(id)execLikeQuerySQLWithField:(NSString *__nonnull)field like:(NSString *__nonnull)like obj:(id)obj; -(Boolean)execLikeQuerySQLWithField:(NSString *__nonnull)field like:(NSString *__nonnull)like obj:(id)obj completeHandler:(void(^)(PaintingliteSessionError *error,Boolean success,NSMutableArray resArray,NSMutableArray<id> resObjList))completeHandler; [self.sessionM execLikeQuerySQLWithTableName:@"student" field:@"name" like:@"%t%" completeHandler:^(PaintingliteSessionError * _Nonnull error, Boolean success, NSMutableArray<NSDictionary *> * _Nonnull resArray) { if (success) { for (NSDictionary *dict in resArray) { NSLog(@"%@",dict); } } }];

Student *stu = [[Student alloc] init]; [self.sessionM execLikeQuerySQLWithField:@"name" like:@"%t%" obj:stu completeHandler:^(PaintingliteSessionError * _Nonnull error, Boolean success, NSMutableArray * _Nonnull resArray, NSMutableArray * _Nonnull resObjList) { if (success) { for (NSDictionary *dict in resArray) { NSLog(@"%@",dict); } } }]; Paging query -(NSMutableArray *)execLimitQuerySQLWithTableName:(NSString *__nonnull)tableName limitStart:(NSUInteger)start limitEnd:(NSUInteger)end; -(Boolean)execLimitQuerySQLWithTableName:(NSString *__nonnull)tableName limitStart:(NSUInteger)start limitEnd:(NSUInteger)end completeHandler:(void(^)(PaintingliteSessionError *error,Boolean success,NSMutableArray *resArray))completeHandler;

-(id)execLimitQuerySQLWithLimitStart:(NSUInteger)start limitEnd:(NSUInteger)end obj:(id)obj; -(Boolean)execLimitQuerySQLWithLimitStart:(NSUInteger)start limitEnd:(NSUInteger)end obj:(id)obj completeHandler:(void(^)(PaintingliteSessionError *error,Boolean success,NSMutableArray resArray,NSMutableArray<id> resObjList))completeHandler ; [self.sessionM execLimitQuerySQLWithTableName:@"student" limitStart:0 limitEnd:1 completeHandler:^(PaintingliteSessionError * _Nonnull error, Boolean success, NSMutableArray<NSDictionary *> * _Nonnull resArray) { if (success) { for (NSDictionary *dict in resArray) { NSLog(@"%@",dict); } } }];

Student *stu = [[Student alloc] init]; [self.sessionM execLimitQuerySQLWithLimitStart:0 limitEnd:1 obj:stu completeHandler:^(PaintingliteSessionError * _Nonnull error, Boolean success, NSMutableArray<NSDictionary *> * _Nonnull resArray, NSMutableArray<id> * _Nonnull resObjList) { if (success) { for (Student *stu in resObjList) { NSLog(@"stu.name = %@ and stu.age = %@",stu.name,stu.age); } } }]; Sort query -(NSMutableArray<NSDictionary *> *)execOrderByQuerySQLWithTableName:(NSString *__nonnull)tableName orderbyContext:(NSString *__nonnull)orderbyContext orderStyle:(PaintingliteOrderByStyle)orderStyle; -(Boolean)execOrderByQuerySQLWithTableName:(NSString *__nonnull)tableName orderbyContext:(NSString *__nonnull)orderbyContext orderStyle:(PaintingliteOrderByStyle)orderStyle completeHandler:(void(^)(PaintingliteSessionError *error,Boolean success,NSMutableArray *resArray))completeHandler;

-(id)execOrderByQuerySQLWithOrderbyContext:(NSString *__nonnull)orderbyContext orderStyle:(PaintingliteOrderByStyle)orderStyle obj:(id)obj; -(Boolean)execOrderByQuerySQLWithOrderbyContext:(NSString *__nonnull)orderbyContext orderStyle:(PaintingliteOrderByStyle)orderStyle obj:(id)obj completeHandler:(void(^)(PaintingliteSessionError *error,Boolean success,NSMutableArray resArray,NSMutableArray<id> resObjList) )completeHandler; Student *student = [[Student alloc] init]; [self.sessionM execOrderByQuerySQLWithOrderbyContext:@"name" orderStyle:PaintingliteOrderByDESC obj:student completeHandler:^(PaintingliteSessionError * _Nonnull error, Boolean success, NSMutableArray<NSDictionary *> * _Nonnull resArray, NSMutableArray<id> * _Nonnull resOb if (success) { for (Student *stu in resObjList) { NSLog(@"stu.name = %@ and stu.age = %@",stu.name,stu.age); } } }]; 2. Increase data

-(Boolean)insert:(NSString *__nonnull)sql; -(Boolean)insert:(NSString *__nonnull)sql completeHandler:(void(^ __nullable)(PaintingliteSessionError *error,Boolean success))completeHandler; -(Boolean)insertWithObj:(id)obj completeHandler:(void(^ __nullable)(PaintingliteSessionError *error,Boolean success))completeHandler; SQL Insert [self.sessionM insert:@"INSERT INTO student(name,age) VALUES('CreaterOS',21),('Painting',19)"]; Object Insertion #import

NS_ASSUME_NONNULL_BEGIN

@interface Student: NSObject @property (nonatomic,strong)NSString *name; @property (nonatomic,strong)NSNumber *age; @end

NS_ASSUME_NONNULL_END Student *stu = [[Student alloc] init]; stu.name = @"ReynBryant"; stu.age = [NSNumber numberWithInteger:21]; [self.sessionM insertWithObj:stu completeHandler:nil]; 3. Update data

-(Boolean)update:(NSString *__nonnull)sql; -(Boolean)update:(NSString *__nonnull)sql completeHandler:(void(^)(PaintingliteSessionError *error,Boolean success))completeHandler; -(Boolean)updateWithObj:(id)obj condition:(NSString *__nonnull)condition completeHandler:(void(^)(PaintingliteSessionError *error,Boolean success))completeHandler; SQL update data [self.sessionM update:@"UPDATE student SET name ='Painting' WHERE name ='ReynBryant'"]; Object update Student *stu = [[Student alloc] init]; stu.name = @"CreaterOS"; [self.sessionM updateWithObj:stu condition:@"age = 21" completeHandler:nil]; 4. Delete data

-(Boolean)del:(NSString *__nonnull)sql; -(Boolean)del:(NSString *__nonnull)sql completeHandler:(void(^)(PaintingliteSessionError *error,Boolean success))completeHandler; PQL Syntax (PaintingliteSessionManager) Through the PQL statement, Paintinglite can automatically help you complete the writing of the SQL statement.

PQL grammar rules (uppercase | the class name must be associated with the table) FROM + class name + [condition]

-(id)execPrepareStatementPQL; -(Boolean)execPrepareStatementPQLWithCompleteHandler:(void(^)(PaintingliteSessionError *error,Boolean success,NSMutableArray resArray,NSMutableArray<id> resObjList))completeHandler;

-(void)execQueryPQLPrepareStatementPQL:(NSString *__nonnull)prepareStatementPQL; -(void)setPrepareStatementPQLParameter:(NSUInteger)index paramter:(NSString *__nonnull)paramter; -(void)setPrepareStatementPQLParameter:(NSArray *__nonnull)paramter;

-(id)execPQL:(NSString *__nonnull)pql; -(Boolean)execPQL:(NSString *__nonnull)pql completeHandler:(void(^)(PaintingliteSessionError *error,Boolean success,NSMutableArray resArray,NSMutableArray<id> resObjList))completeHandler; [self.sessionM execPQL:@"FROM Student WHERE name ='CreaterOS'" completeHandler:^(PaintingliteSessionError * _Nonnull error, Boolean success, NSMutableArray * _Nonnull resArray, NSMutableArray<id> * _Nonnull resObjList) { if (success) { for (Student *stu in resObjList) { NSLog(@"stu.name = %@ and stu.age = %@",stu.name,stu.age); } } }]; [self.sessionM execPQL:@"FROM Student LIMIT 0,1" completeHandler:^(PaintingliteSessionError * _Nonnull error, Boolean success, NSMutableArray * _Nonnull resArray, NSMutableArray<id> * _Nonnull resObjList) { if (success) { for (Student *stu in resObjList) { NSLog(@"stu.name = %@ and stu.age = %@",stu.name,stu.age); } } }]; [self.sessionM execPQL:@"FROM Student WHERE name LIKE'%t%'" completeHandler:^(PaintingliteSessionError * _Nonnull error, Boolean success, NSMutableArray * _Nonnull resArray, NSMutableArray<id> * _Nonnull resObjList) { if (success) { for (Student *stu in resObjList) { NSLog(@"stu.name = %@ and stu.age = %@",stu.name,stu.age); } } }]; [self.sessionM execPQL:@"FROM Student ORDER BY name ASC" completeHandler:^(PaintingliteSessionError * _Nonnull error, Boolean success, NSMutableArray * _Nonnull resArray, NSMutableArray<id> * _Nonnull resObjList) { if (success) { for (Student *stu in resObjList) { NSLog(@"stu.name = %@ and stu.age = %@",stu.name,stu.age); } } }];

[self.sessionM execQueryPQLPrepareStatementPQL:@"FROM Student WHERE name = ?"]; [self.sessionM setPrepareStatementPQLParameter:@[@"CreaterOS"]]; NSLog(@"%@",[self.sessionM execPrepareStatementPQL]); Aggregate function (PaintingliteAggregateFunc) Paintinglite encapsulates Sqlite3 aggregation functions, and automatically writes SQL statements to get the aggregation results.

Count [self.aggreageteF count:[self.sessionM getSqlite3] tableName:@"eletest" completeHandler:^(PaintingliteSessionError * _Nonnull sessionerror, Boolean success, NSUInteger count) { if (success) { NSLog(@"%zd",count); } }]; Max [self.aggreageteF max:[self.sessionM getSqlite3] field:@"age" tableName:@"eletest" completeHandler:^(PaintingliteSessionError * _Nonnull sessionerror, Boolean success, double max) { if (success) { NSLog(@"%.2f",max); } }]; Min [self.aggreageteF min:[self.sessionM getSqlite3] field:@"age" tableName:@"eletest" completeHandler:^(PaintingliteSessionError * _Nonnull sessionerror, Boolean success, double min) { if (success) { NSLog(@"%.2f",min); } }]; Sum [self.aggreageteF sum:[self.sessionM getSqlite3] field:@"age" tableName:@"eletest" completeHandler:^(PaintingliteSessionError * _Nonnull sessionerror, Boolean success, double sum) { if (success) { NSLog(@"%.2f",sum); } }]; Avg [self.aggreageteF avg:[self.sessionM getSqlite3] field:@"age" tableName:@"eletest" completeHandler:^(PaintingliteSessionError * _Nonnull sessionerror, Boolean success, double avg) { if (success) { NSLog(@"%.2f",avg); } }];

Transaction (PaintingliteTransaction) Sqlite3 development defaults that an insert statement is a transaction. If there are multiple insert statements, the transaction will be repeated. This consumes a lot of resources. Paintinglite provides an operation to start a transaction (display transaction).

  • (void)begainPaintingliteTransaction:(sqlite3 *)ppDb;
  • (void)commit:(sqlite3 *)ppDb;
  • (void)rollback:(sqlite3 *)ppDb; Constraint In order to achieve better operation and comply with database specifications, table names are all lowercase.

有一个技术问题请大家帮忙指导,谢谢大家了

Posted: 03 Aug 2021 06:43 PM PDT

背景是这样的: 使用 Elasticsearch 存储数据,其中有一个字段需要表示包含的标记,一共会有大概 32 种,这 32 种是可以共存的,之后需要支持查询,比如查询被 1 、2 、3 这三种标记的数据 我想到的办法:

  1. 使用 32 位字符,初始位 0 占位, 每一位表示一种标记,有标记则为 1,则查询 es 时候需要使用正则来匹配,这好像没有办法走分词 导致性能会低
  2. 这 32 种标记使用编号逗号分隔,然后这个字段设置分词 然后使用模糊匹配 好像也不太行

我也是刚开始这么深入的使用 es, 不知道还有哪些办法,请熟悉 es 的朋友指点我一下 谢谢大家了!

Bitmap createBitmap 不分配内存问题

Posted: 03 Aug 2021 04:51 PM PDT

事情是这样的,我的同事让我帮他看这个代码为什么不分配内存,我看了两天没啥结果,水平不够就来问了

binding.button.setOnClickListener {     repeat(1000) {         list.add(Bitmap.createBitmap(10240, 1024 / 4, Bitmap.Config.ARGB_8888))     } } 

通过 Android studio 的 profiler 查看内存根本没动静,dump 出来看到都 bitmap 的 Native size 都已经 9 个 G 了(亲测),每个 java bitmao 也都有 NativePtr,还不是相同的,但是这应该是 bug 或者是虚拟内存空间的?搞不懂,然后看了两天代码,基础有点差,最后只看到确实分配了内存

sk_sp<Bitmap> Bitmap::allocateHeapBitmap(size_t size, const SkImageInfo& info, size_t rowBytes) {     // 应该是这里吧??     void* addr = calloc(size, 1);     if (!addr) {         return nullptr;     }     return sk_sp<Bitmap>(new Bitmap(addr, size, info, rowBytes)); } 

昨天也是搞到几点才睡觉,救😭

一加 9pro 无法开启 LocationReport 求助

Posted: 03 Aug 2021 01:11 PM PDT

系统是 ColorOS,Android11,system 里不存在 services.cn.google.xml 文件。LocationReport 开启时的报错内容跟一般网上说的不太一样,提示"读取此设置的状态时出现问题,请稍后重试。"。安装 Riru-LocationReportEnabler 模块也没有解决问题。
看 adb logcat 日志有一个报错:
java.lang.ClassNotFoundException: com.google.android.apps.gmm.shared.account.GmmAccount
不知道跟这个有没有关系,不过我看 gms 的状态是正常的。

困惑于 DNS 解析的完整过程

Posted: 03 Aug 2021 11:00 AM PDT

尝试用 dig +trace www.gov.cn 这条命令来了解 DNS 解析的完整过程。实验机器为 Ubuntu 18.04 。用 wireshark 抓包。本机地址 192.168.0.97

首先是把 /etc/resolv.conf 改成了自己本地路由器自带的 DNS 地址 192.168.0.1,否则各种 dns 请求都去到了 127.0.0.53 。

wireshark 显示本机先向 192.168.0.1 发送 DNS query,查询 root 的服务器。192.168.0.1 返回了 13 个根服务器的域名和地址。虽然根服务器的地址已经被包含在 192.168.0.1 的回复里,本机依然向 192.168.0.1 分别发送了 13 个根服务器域名的解析查询,并收到了回复。 问题一

随后本机在 13 个根服务器的地址中选取了 192.5.5.241 ( F 根服务器),发送了 www.gov.cn 的 query 。192.5.5.241 返回了 a.dns.cn, b.dns.cn .... g.dns.cn 以及 ns.cernet.net 。没有附加对应的地址。 问题二

于是本机又向 192.168.0.1 分别发送了多个 query,查询以上返回的 a.dns.cn 等域名对应的地址,并收到对应的回复。最后一个来自 192.168.0.1 的回复是:ns.cernet.net 的地址 是 103.137.60.44 。问题三

到这一步,算是找到了 .cn 的 DNS 服务器了。

然后本机向 103.137.60.44 发送 DNS query,查询 www.gov.cn 的地址。103.137.60.44 返回了另外三个 DNS 服务器,ns1.cdns.cnns2.cdns.cnns3.cdns.cn 。没有附加对应的地址。 同问题二

于是本机向 192.168.0.1 分别发送三个 query,查询以上返回的 ns1.cdns.cn 等域名对应的地址,并收到对应的回复。最后一个来自 192.168.0.1 的回复是:ns2.cnds.cn 的地址 是 125.208.46.1 。 同问题三

到这一步,算是找到了 gov.cn 的 DNS 服务器了。

最后,本机向 125.208.46.1 发送 query,查询 www.gov.cn 的地址,并收到一个 CNAME 回复。

问题一:为什么 192.168.0.1 已经返回了根服务器的地址,本机依旧要重新查询呢

问题二:这里为什么只返回域名,不返回地址呢?

问题三:这里 192.168.0.1 好像处于上帝视角。问题二通过 192.168.0.1 解决,可能是因为路由器去查询了 ISP 提供的 DNS 服务器。但是在没有上帝视角的情况下,问题二该怎么解决呢?

问题有点长,感谢阅读。如果需要提供抓包文件,可以商量一下怎么发送过去。

vcpkg 的 packages 和 installed 目录有什么区别?

Posted: 03 Aug 2021 10:50 AM PDT

今天 Windows 下 编译 qbittorrent, 但是过不去 qt5-tools

.\vcpkg install qt5-tools:x64-windows-static

log 里报错:

Error: dependent 'C:\vcpkg\installed\x64-windows-static\tools\qt5\lib\Qt5QmlDevToolsd.lib' does not exist.

发觉那个 lib 文件在下面的目录,所以就拷贝过去

C:\vcpkg\packages\qt5-declarative_x64-windows-static\tools\qt5\debug\lib

然后,又告诉我 Qt5QmlDevTools.lib ( lib 名里少个 d )找不到了。 我总不能编译一次再看看缺什么吧。 累死我了。

还能 ipv6 访问 google 么 ?

Posted: 03 Aug 2021 08:44 AM PDT

前几天在某路由群里群友发了张油罐的图,速度贼快 (记下来他的 ip,能 ping 通,也是 xxnet 里的 ip 列表之一)

ipv6 直连,勾起了我对直连的想法

国内的视频网站太操蛋,收费视频油罐上免费

所以上 gayhub 下了 xxnet, 导出 ip

测试一番,全部 ip 都会 404 页面

好多 ip 一查询是 1e100.net 的,而它是 google 的...

Android 怎么屏蔽 youtube 广告?

Posted: 03 Aug 2021 08:17 AM PDT

下了个 adblock plus,没效果。

No comments:

Post a Comment