Tuesday, August 10, 2021

V2EX - 技术

V2EX - 技术


多个数据库同时执行同一个 SQL 文件一般都是怎么处理的?

Posted: 10 Aug 2021 04:05 AM PDT

业务需要,需要同时维护几百个相同的数据库,在更新系统的时候比较痛苦,每个数据库都需要执行相同的 SQL 。

之前一直都是通过 web 页面去批量执行 sql,但是太慢了。

目前想法: 1. DBeaver 的 database task,但是每一个数据库都要建一个连接,很麻烦。 2. 使用存储过程

大家有什么方法吗? 求教。

两次从 Linux 逃离到 os x 又逃回来的感受

Posted: 10 Aug 2021 04:02 AM PDT

逃离到 os x 的主要原因是觉得苹果笔记本的屏幕细腻,次要原因是可以方便使用企业微信。

硬件方面:
mac book pro 的屏幕没的说,但是屏幕过于光滑反光很难受。键盘的按键反馈还是很清晰,就是键程过短,有点难受。再有就是没有实体的 F1-F2,ESC,对于 vim 用户来说,过于难受。后来把大小写切换映射成了 esc,但是又和 tab 键容易弄混。反正就是很别扭。

软件方面:
一些常用命令行工具的版本和 linux 系统不一样,使用上有点不习惯,例如 cp 命令的参数必须紧跟在 cp 命令后面。而不能放到一行的后面。

终端软件用的系统默认的,也用过 terminal2 啥的,大概是这么一个名字。 但是因为要使用 tmux,没有 alt 键做快捷键,也是很麻烦。

说到终端,linux 下,选中内容,然后鼠标中键或者 Ctrl+ins 键就能粘贴的功能,在 os x 上没有,只有终端勉强支持。

窗口管理虽然可以方便的用触控版切换,但是步骤繁琐,没有在 linux 上直接用功能键切换窗口方便,例如按 F1 切换到终端,F2 切换到浏览器。在 os x 上当然也可以定义快捷键,但是正如前面说的。没有实体 F 功能键,只能绑定到奇怪的组合上面。终归还是繁琐了一点。

加上 os x 的窗口切换,即便关闭了动画。窗口直接的切换还是有点迟滞的感觉。

以上就是使用 os x 比较不爽的点,所以还是回到了更低分辨率但是更流畅的 linux.

其他云厂商的对象存储为啥都没默认提供像阿里云 oss 的上传回调功能?

Posted: 10 Aug 2021 03:58 AM PDT

有知道 其他云厂商的对象存储为啥都没默认提供像阿里云 oss 的上传回调功能的吗? 是基于什么考虑?

看下来基本都是要通过 lambda, 或者配合云厂商的 mq, 自己写代码来实现.很是麻烦

有没有什么好的方案可以做到远程 debug 别人手机上安装的自己的软件。

Posted: 10 Aug 2021 03:56 AM PDT

像在局域网可以通过端口转发,WiFi 连接调试一样,实时连接远程外网手机。

有人遇到过 Golang select case 语句和 default 语句都没执行的情况吗?

Posted: 10 Aug 2021 03:53 AM PDT

程序大致逻辑如下,会正常运行一段时间,receiving msgsleeping会交替打印,但运行一段时间后最后输出一段pipeline sleeping之后就再也没有日志了,没有pipeline terminate,没有 panic,也没有到 defer 那一步

var sigChan = make(chan os.Signal, 1)  func init() { 	signal.Notify( 		sigChan, 		os.Kill, 		os.Interrupt, 		syscall.SIGHUP, 		syscall.SIGINT, 		syscall.SIGTERM, 		syscall.SIGQUIT, 	) }  func (ip *InnerPipeline) Run() {  	defer func() { 		log.Infof("pipeline<%s> defer exit", ip.name) 	}()  	for {  		select { 		case im := <-ip.messageQueue: 			log.Debugf("receiving msg %+v", im)  			// some logic ....                         xxxxxxxxxxxxxxx  			log.Debugf("quit case")  		case <-sigChan: 			log.Infof("pipeline terminate") 			return  		default: 			log.Debugf("current chan len: %d", len(ip.messageQueue)) 			 			// some logic ....                         xxxxxxxxxxxxxxx              			log.Debugf("pipeline<%s> sleeping...", ip.name) 			time.Sleep(50 * time.Millisecond) 		} 	} } 

官网开发的需求是找现成的 cms 系统还是自己定制化开发一个呢

Posted: 10 Aug 2021 03:30 AM PDT

有一个大公司的官网开发需求,

按照需求定制开发一个前后端分离的网站服务。
或者找一个现成的 cms 系统,改造一下去支持。

大佬们有什么建议吗?如果找开源框架 选择哪个比较好呢?

用了 5 年的 Ubuntu 16.04 桌面系统来谈谈感受

Posted: 10 Aug 2021 03:08 AM PDT

自从从事编程之后一直都是用的 Ubuntu 16.04 ,为什么偏爱 16.04 是因为个人感觉 unity 这个桌面挺好用,可惜后面版本都改了 gnome,无爱,所以一直没更新,而且自己用着也挺好。虽然发行版版本比较老,但是内核版本我已经升级到了 5.10 。

1.硬件配置

  • i7-8700k
  • 240GB 三星 970 SSD
  • 16GB 内存
  • 4T 机械盘
  • LG 4k 显示器

之前有一个 1070ti 独显,前端时间显卡涨价,由于我不咋玩游戏,就给卖了回血了,等矿难再换个。其实吧,Intel 的集显在 Linux 下表现丝毫不输几千块的独显,我这个 CPU 集显是 UHD620,支持 4k 分辨率毫无压力(板得有 DP 口)。

2.高分屏

个人强烈推荐 4k 屏幕,能够极大提高体验,众所周知,苹果笔记本之所以显示细腻,是因为其屏幕分辨率真不低,笔记本大约是 3k,IMac 直接上的 5k 分辨率。

个人感觉 Linux 下的 4k 渲染体验仅次于 Mac OS,贴一张 200%缩放下 v 站的截图给大家看看

唯一比较麻烦的是很多应用的支持并不是太友好,不过大部分都可以搞定,关于缩放倍率这块大家可以参考我之前的文章: Ubuntu 4K 显示器缩放设置

3.常见应用

  • 开发工具,其实 Linux 最不缺开发工具了,该有的都有,比如 vscode 、atom,IDE 的话直接 jetbrains 全家桶就行了。
  • 通讯这块,可以用 deepin 微信、deepinQQ,基本上问题不大,可用性很高,这块得感谢 deepin
  • 下载这块,BT 下载可以用 qbittorrent,百度网盘有官方客户端,但是 16.04 安装不了。迅雷的话,我是用 vbox 整个了 win7 虚拟机,映射磁盘,直接下载到宿主机里面,也不麻烦。
  • 浏览器,太多了,推荐 chrome,也有 Firefox,Edge ( u1s1,这个速度是真快),甚至 360 也有 Linux 版本。。。
  • 文档处理,WPS 最良心,无广告弹窗
  • 输入法,我主要用搜狗,无广告弹窗,但是有些应用下光标不跟随,比如 jetbrains 家的 IDE,我是有点醉,虽然影响不大,但是官方一直不解决。
  • 视频播放器,开源的 smplayer,其实底层是 mpv,还有 vlc 都可以用
  • 直播录屏工具,鼎鼎大名的 obs,开源跨平台的,很多知名主播都在用
  • 音乐,本地播放器倒是挺多,但是国内真正可用的软件,目前只有网易云音乐支持,其它的可以用网页版
  • 截图,flameshot,这个开源的工具很强大,比自带的好使
  • 游戏,俗话说用 Linux 还玩啥游戏,我都是双系统随时切换 Windows,真要玩也有,下载一个 steam 就行,最起码 dota2 跑的很顺畅。

其它比较少见的就不说了,比如一些视频编辑软件 kdenlive 、达芬奇、Blender 等等,专业性太强,俺不会,只是安装过,可惜 adobe 全家桶并不支持 Linux 。

其实平时用的最多的还是浏览器,chrome 对 Linux 的支持是相当好,所以这点保证了体验不会很差,其它软件偶尔用,虽然平时也会遇到一些小问题,但是只要懂点手花点功夫都能解决,可以参考一下本人博客里面积累的一些文章: https://wangbjun.site/tags/Ubuntu

Java on Visual Studio Code 的更新 – 2021 年 7 月

Posted: 10 Aug 2021 03:01 AM PDT

大家好,欢迎来到 7 月版的 Visual Studio Code Java 更新。在这篇文章中,我们将分享我们整体产品路线图的进展,并重点介绍我们全新的测试体验,以及在 Maven 和项目管理相关的改进。让我们开始吧!

全新的 Java 测试体验

随着 Visual Studio Code 1.59.0 正式版本的发布,全新的插件测试 API 也从试验版本进入了正式版本。自 2020 年 9 月起至今,经过了将近一年及数次版本迭代的打磨,不管是 API 的功能性还是易用性,与首个预览版本相比都获得了极大的提升。其中 Java Test Runner (包含在 Java 扩展包中)作为首批采用了测试 API 的插件,也发布了全新的 0.31.0 版本,在功能和用户体验上迎来了许多新的提升和亮点。接下来我们就通过 Java Test Runner 插件,看看新的测试 API 能帮助插件在测试的使用场景下提供哪些功能!

全新的 Testing Decoration

现在用户可以在编辑器左侧区域看到一排新的按钮( Testing Decoration ),直接点击会立即运行该行对应的测试用例,右键则能看到更多的选项。与过去的 Code Lens 不同,它可以减少在编辑区域内对用户的干扰。

test decoration

功能更强大的测试浏览器

测试浏览器( Testing Explorer )焕然一新,现在用户可以自定义浏览器的显示方式和排序方式,以满足不同的场景和习惯。用户也可以直接通过测试浏览器来运行或者调试测试。

testing explorer

另外新的测试浏览器内嵌了搜索栏的支持,帮助用户快速查找目标测试用例,加速开发效率。

search box

内容更丰富的 Test Message

新的测试 API 允许插件在编辑区域内嵌显示测试执行结果等内容,更方便快捷地查看错误和堆栈信息:

test message

想了解更多关于新测试功能的特性, 请访问 官方文档

Maven 依赖管理体验改进

除了测试体验,我们还对 Maven 依赖管理做了一些改进。具体来说,我们改进了 Maven 依赖树的界面,使其更加人性化。此外,我们意识到 Maven 依赖冲突有时会较难处理,有时 Maven 可能无法按照我们希望的方式自动解决冲突,这可能会导致我们在运行应用程序时出错。因此,我们对 Maven 扩展进行了一些更改,以更好地在界面中展示 Maven 如何解决依赖冲突。另外,Maven POM 中的冲突将直观地出现在 Terminal 的错误 Tab 中。在用户单击这些错误后,Visual Studio Code 将提示开发人员修复冲突并选择要使用的依赖项。下图展示了如何帮助用户快速解决冲突的案例。

maven dependency

项目管理

除了测试和依赖管理,我们还改进了项目管理相关的功能。具体而言,我们修复了项目浏览器无法正常工作的几个问题。这是我们所做的增强 /错误修复的列表。

  • 在没有构建工具的情况下创建项目时,默认明确设置输出路径 (Issue #523)
  • 编辑时 Java 项目资源管理器意外扩展 (Issue #502)
  • 从 Java Project Explorer 中删除包时无法自动刷新 (Issue #458)
  • 当我保存文件时,"EXPLORER"会自动展开并显示 (Issue #430)
  • 打开不在类路径上的文件时观察到异常 (Issue #494)

产品路线图进展更新

上个月,我们分享了未来几个月的路线图。在博客中,我们提到了几个领域作为我们的重点

  • 基本开发体验的持续改善
  • 构建工具 ( Maven / Gradle)
  • 远程开发 / Codespaces 支持
  • 测试
  • 安全
  • 调试 (探索虚拟线程)

作为 7 月博客的一部分,我们希望给大家更新一下目前的进展。绿色标记的文字是我们取得重要进展的领域。正如前面部分所述,我们在改进整体测试 API 体验方面迈出了一大步。在接下来的几个月中,我们还将继续添加更多与测试相关的功能(例如测试覆盖率)。在构建工具方面,我们一直在改进我们的 Maven 体验,与此同时我们将继续致力于更好的 Gradle 支持。最后,我们已经在 Java 开发环境中支持了受信任 /不受信任的工作区,因此我们在安全方面也有了较显著的进展。

对于路线图中提到的其他领域,我们一直在积极改善相关的体验,并将在取得重要进展时提供更新。

反馈与建议

请积极使用我们的产品!您的反馈和建议对我们非常重要,并将帮助我们做得更好。 有几种方法可以给我们留下反馈

  • 在这个帖子下留言
  • 在我们的 GitHub repo 上创建Issue

资源

以下链接和资源能帮助您更好地了解 Java on Visual Studio Code 的相关信息

ES 存在 namespace 吗?测试环境和生产环境分离

Posted: 10 Aug 2021 03:00 AM PDT

类似 k8s 的 namespace 用于资源隔离。测试环境和生产环境用同一个 ES,因为 index 名称是写在程序里的,所以数据会造成污染吧!如果不存在 namespace 这种操作,我只能多命名一个测试用的 index 吗?例如:生产环境-v2ex,测试环境:v2ex_test 。

看到放桌上的 Pixel 突然想到

Posted: 10 Aug 2021 02:26 AM PDT

如果把群晖的 moment 文件夹挂载到 Android 下,Google photo 直接同步这个目录,是不是就不用再用 Syncthing 把照片从群晖再同步到 Pixel 的相册目录,再由 Google photo 同步了?

这样还有一个好处就是,不占用 Pixel 的空间.

不知道是否可行.

NAS====>Syncthing====>Pixel====>Google Photo

NAS====>Pixel mount=====>Google Photo

Syncthing 同步的方案是之前 V 友教我的,用了快小半年了吧,挺稳定的,就是 Pixel 发烫厉害...

求 前端代招聘, 即面试官.

Posted: 10 Aug 2021 02:26 AM PDT

小公司,位置上海浦东. 需要招个前端 web 开发. 但我是后端的,以前虽然做过前端, 但是前端工程化后,我就一窍不通了.

有没有人可以代理招聘面试, 主要工作如下:

* 简历筛选. 每天我会给出一定量的简历,你需要对建立进行筛选. * 面试. 视频面试或者电话面试,你自己定. 如果你能来公司,那肯定更好,不强求. * 价格. 我不了解行情,还请各位给个参考.    我自己想的价格公式 (单价 X 面试人数 + 招聘成功奖励)   如 300 * 10 + 2000 = 5000. 

如果担心信用问题,可以签合同.

前端 web 开发要求 3-7 年, 具体的岗位要求, 我们之后细谈.

各位大佬,有没有更好的给 Golang struct 初始化值的方式

Posted: 10 Aug 2021 01:47 AM PDT

我之前一直接触的都是面向对象的编程语言,突然到 Golang 还有点不习惯,我这种方式 OK 不,我的想法是创建一个"类"的对象,但是 stuct 本身我没有找到初始化值的更好的方式

type GameStart struct{   cloudNumber int   gameStartLayers [8]*ebiten.Image   layerPosition [8][2]float64   menuList [3]*Menu }  func (g *GameStart) Init(){   g.cloudNumber = 3   g.layerPosition  = [8][2]float64{     {0, 0}, {0, 0}, {0, 230}, {0, 250},     {0, 250}, {0, 0}, {0, 0}, {0, 0},   } }  func main(){   var gameStart *GameStart = new(GameStart)   gameStart.Init() } 

iPad 上使用 Terminus 如何选中文本

Posted: 09 Aug 2021 11:32 PM PDT

请教,如何选择 Session 中的文本

使用 raft 作为共识算法的注册中心,欢迎 starr

Posted: 09 Aug 2021 10:57 PM PDT

钉钉微应用~求 star 呀

Posted: 09 Aug 2021 10:25 PM 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

请教一个关于线程条件变量的问题

Posted: 09 Aug 2021 10:11 PM PDT

两个线程,线程 1(processData)生成数据 p 并写入数据库,另一个线程 2(someSocket)将线程 1 生成的数据 p 通过 socket 发送到客户端。

当线程 1 中的for循环结束时,如何通知线程 2 while(res == TRUE)应当结束了,线程 2 因为 pthread_cond_wait 一直在阻塞,但是此时线程 1 不会再发出信号了。这是不是就是死锁了。。。

代码如下

#include <string.h> #include <stdio.h> #include <stdlib.h> #include <sys/time.h> #include <unistd.h> #include <mysql.h> #include <errno.h> #include <pthread.h> #include <sys/socket.h> #include <sys/types.h> #include <sys/wait.h> #include <netinet/in.h> #define TRUE 1 #define FALSE 0 #define MAX_STRING 128 #define PORT 3389 #define SA struct sockaddr  pthread_cond_t pready = PTHREAD_COND_INITIALIZER; pthread_mutex_t plock = PTHREAD_MUTEX_INITIALIZER;  // 存储温湿度结构体 typedef struct {     int temp;     int humd; }humiture;  // 可变长消息体 typedef struct {      int nLen;      char data[ 0]; }MyMessage;  //全局变量 humiture p; int res = TRUE;  void error(char *msg) {     fprintf(stderr, "%s: %s\n", msg, strerror(errno));     exit(1); }  void info(char *msg) {     fprintf(stdout,"%s\n",msg); }  void finish_with_error(MYSQL *con) {   fprintf(stderr, "%s\n", mysql_error(con));   mysql_close(con);   exit(1); }  // socket 发送数据 int sendall(int s, char *buf, int *len) {     int total = 0;     int bytesleft = *len;     int n;      while(total < *len) {         n = send(s, buf+total, bytesleft, 0);         if (n == -1) { break; }         total += n;         bytesleft -= n;     }      *len = total;      return n==-1?-1:0; }   // 生成数据 humiture  collectData() {     int temperature,humidity;     srand((unsigned)time(NULL));    // 根据时间来播种随机数种子     // 生成数据     temperature = rand()%40+10;     // 生成 10~50 的随机数 当做温度     humidity = rand()%70+10;    // 生成 10~80 的随机数当做湿度          humiture p = {humidity, temperature};          return p; }  // 启动 MySQL 建立连接 MYSQL* startMysql() {     MYSQL *con = mysql_init(NULL);      if (con == NULL)     {                 fprintf(stderr, "%s\n", mysql_error(con));         exit(1);     }      if (mysql_real_connect(con, "localhost", "root", "root#admin","test", 0, NULL, 0) == NULL)     {         finish_with_error(con);     }      return con; }  // 生成数据并存入数据库 void * processData() {     MYSQL * con = startMysql();      for(int i = 0; i <20;i++)     {                 pthread_mutex_lock(&plock);         p = collectData();         pthread_cond_signal(&pready);         pthread_mutex_unlock(&plock);          char query[MAX_STRING] = {0};          snprintf(query,MAX_STRING,"INSERT INTO humiture (temperature,humidity) VALUES (%d,%d)", p.temp, p.humd);          if (mysql_query(con, query))          {             finish_with_error(con);         }         sleep(2);     }       // 循环结束给出信号     res = FALSE;      mysql_close(con);      mysql_library_end();     return NULL; }  void * someSocket() {     int sockfd, connfd;     struct sockaddr_in servaddr, cli;     socklen_t len;     char buff[10];          sockfd = socket(AF_INET, SOCK_STREAM, 0);     if (sockfd == -1) {         error("socket creation failed...");     }     else         info("Socket successfully created...");      memset(&servaddr, 0, sizeof(servaddr));     servaddr.sin_family = AF_INET;     servaddr.sin_addr.s_addr = htonl(INADDR_ANY);     servaddr.sin_port = htons(PORT);      int reuse = 1;     if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (char *)&reuse, sizeof(int)) == -1)         error("Can't set the reuse option on the socket...");      if ((bind(sockfd, (SA*)&servaddr, sizeof(servaddr))) != 0) {         error("socket bind failed...");     }     else         fprintf(stdout,"%s\n","Socket successfully binded...");      if ((listen(sockfd, 5)) != 0) {         error("Listen failed...");     }     else        info("Server listening...");          while(TRUE)     {         len = sizeof(cli);                 connfd = accept(sockfd, (SA*)&cli, &len);             if (connfd < 0) {             error("server acccept failed...");         }         else             info("server acccept the client...");                  MyMessage * myMessage = (MyMessage*)malloc(sizeof(MyMessage)+sizeof(humiture));         int needSend = sizeof(MyMessage)+sizeof(humiture);           char *buffer =(char*)malloc(needSend);          while(res == TRUE)         {             myMessage->nLen = htonl(sizeof(humiture));             pthread_mutex_lock(&plock);             pthread_cond_wait(&pready,&plock);             memcpy(myMessage->data,&p,sizeof(humiture));             pthread_mutex_unlock(&plock);             memcpy(buffer,myMessage,needSend);             sendall(connfd,buffer,&needSend);             recv(connfd,buff,sizeof(buff),0);         }         // 当需要停止的时候发送 0 字节信息让客户端停止循环         if(res == FALSE)          {             // 将发送消息定义为 0             myMessage->nLen = htonl(res);             char *buffer =(char*)malloc(sizeof(int));             memcpy(buffer,myMessage,sizeof(MyMessage));             send(connfd,buffer,sizeof(MyMessage),0);             shutdown(connfd,SHUT_RDWR);             free(buffer);         }          free(myMessage);         free(buffer);         close(connfd);         break;     }     close(sockfd);         return NULL; }  int main(void) {     pthread_t t0,t1;      if(pthread_create(&t0, NULL,processData,NULL)==-1)     {         error("Can't create thread processData");     }     if(pthread_create(&t1,NULL,someSocket,NULL)==-1)     {          error("Can't create thread someSocket");     }      void *reslut;     if(pthread_join(t0,&reslut)==-1)     {         error("Can't reclaim thread t0");     }     if(pthread_join(t1,&reslut)==-1)     {         error("Can't reclaim thread t1");     }      return 0; } 

关于 Python 包导入的问题

Posted: 09 Aug 2021 09:37 PM PDT

RT:假如此时我要导入 serializers 里边的内容,假如 serializers 里边有 100 个 serializer 类,那么我在引用的时候是 from serializers import x1,x2,x3,x3...,一个个导入, 还是 import serializers as xx_serializers之后,xx_serializers.x1 这样使用呢?我趋向于第二种,但是不知道比较合适的是哪种

Vscode 有办法在 vue 文件中显示 jsdoc 的注释吗?

Posted: 09 Aug 2021 09:01 PM PDT

如果是 js 文件引入方法,hover 上去会自动显示 jsdoc 的注释, 而.vue 文件的 script 中引入的方法,hover 上去并不会显示注释, 所以想问问大家有办法能够显示吗

m3-6y30 4g+128 有必要换 16+512 吗

Posted: 09 Aug 2021 07:14 PM PDT

如题,有一台 win 板 m3-6y30 4g+128,感觉抖屏出不掉了,想修屏幕,看到老板有给 win 板升级的 16g+512g 不知道有没有必要升,升了的话还能再战三年吗,板子平时也就看个 chrome,用 onenote 写写画画,开个 vscode 什么的

其他语言尝试转 golang 学习,有无好的入门项目或者框架推荐?

Posted: 09 Aug 2021 03:57 PM PDT

现在打算跟着 https://tour.go-zh.org/

过一遍基础语法之类的,然后后续找一些入门级的项目或者框架玩玩,我目前知道的有 beego 、goframe 之类的,老哥们有好的推荐学习学习么?

我认为基础语法大致掌握,找项目学习上手应该会快一些些,虽然刚开始有点不习惯 go 的语法哈哈

另外插个话,如果老哥们有 wechat 群或者其他群的能否带带弟弟,懂的都懂哈哈,giao ~

用从 binlog 中解析出的 id,立即向数据库(主库),会存在查不到的情况吗?

Posted: 09 Aug 2021 09:18 AM PDT

插入数据到数据库,然后监听 binlog,从 binlog 拿新插入的 id 查询数据库,有可能会查不到吗?

参考下面的文章,这篇文章描述了该场景: https://www.git2get.com/av/109130438.html

并且工作中也确实遇到过一次(没有从库)。

上面的文章解释如下: 可以看到发起提交事务后主要经过 3 个阶段:

  1. redo 日志的 prepare 阶段,在这个阶段 innodb 会将 undo, redo 日志进行刷盘;
  2. binlog 的 prepare 和 commit 阶段,这里 binlog 的 prepare 其实什么也没有做,而在 commit 的时候刷新 binlog 到磁盘,在这个时候,其实事务是已经确定要提交了(无论后面是否发生宕机);
  3. redo 日志的 commit 阶段,这个时候会清除 undo 日志,把 redo 日志刷数据盘,也就是 mysql 的存储数据真正落库;

他认为第二步就写入了 binlog,此时 canal 可以获取到 binlog,但事务还未提交,因为第 3 步还没执行。

但是在我的理解中,数据是首先写到内存中的,并没有同步写入磁盘,第 3 步只是把 redo log 写入磁盘而已,不会同步写入数据到磁盘中(这里指写入 B+树中)。 所以,mysql 应该可以首先尝试从内存中获取,应该能获取到的吧。

求大佬解答

大公司的前端项目和个人项目有什么区别?

Posted: 09 Aug 2021 09:13 AM PDT

对于后端项目,大公司和个人项目区别挺大的:微服务、中间件、高可用、统一的项目结构规范等等,个人觉得这些还蛮重要的。平时自己也会写些小前端,但都是个人项目,简单粗暴。很好奇对于前端,大公司项目和个人项目会有哪些区别?自己能想到的有:

  1. 有统一的内部组件库
  2. 遵守一定的代码规范
  3. 对于 toC 项目,性能优化要求(包体积、加载速度等)

各位 V 友有什么补充么?

有啥快速扫描端口的工具吗?

Posted: 09 Aug 2021 08:34 AM PDT

看看是哪个不自觉把远程端口暴露在公网上了

求 ubuntu 不同分辨率显示器的优雅解决办法

Posted: 09 Aug 2021 07:45 AM PDT

最近出售了一台 2k 显示器,又购置了一台新的 4k 显示器,原来不是很明显的分辨率问题现在暴露了出来。
在 ubuntu20.04 下,笔记本内建 1080p 显示器和外置显示器无法良好协同工作:
1. 将主显示器设置为外置显示器,并对其使用合适的放缩倍率时,内建显示器会一致放大;
2. 外置显示器帧数被限制在 30 帧;
3. 在某些设置情况下,会使得内建显示器无法输出图像,只有把英伟达显卡驱动卸载才可使用,但重装驱动以后,内建显示器继续无法输出。
笔记本是 intel 核显,英伟达独显,外置显示器使用 typec 连接。
翻阅了论坛的帖子,采用了如 xrandr 方法(会导致情况 3 ),切换英伟达显卡设置等操作,并没有好的现象
希望大家可以提供一些建议,个人希望不要涉及到到太大的魔改,工作电脑…不敢折腾了

OpenHarmony 几乎 fork 了大部分第三方常用库并移植到 HMOS

Posted: 09 Aug 2021 02:43 AM PDT

https://gitee.com/organizations/openharmony-tpc/projects

粗略看了下,
-大部分的 Android API 和控件都接近"无缝"切换到了 HM API;
-连这些第三方库都刻意在源码中去掉了 Android 相关字段
https://gitee.com/openharmony-tpc/lottie-ohos/commit/f668cd2dd811ced5e882e4c69df78275937edb32

不懂就问, 这样直接 fork 修改之后"去掉原项目相关的一切信息", 是否违反了开源协议
(如常见的 apache v2, 在延伸的代码中(修改和有源代码衍生的代码中)需要带有原来代码中的协议,商标,专利声明和其他原来作者规定需要包含的说明)

No comments:

Post a Comment