Saturday, September 11, 2021

V2EX - 技术

V2EX - 技术


低效能程序员的行为与思维,共勉

Posted: 11 Sep 2021 04:48 AM PDT

不是感情宣泄,因为其中有些行为或思维也是我以前作为低效能程序员的总结。

排过序

  1. 不写单元测试
  2. 不主动学习,不看书
  3. 总是拿没时间作为借口
  4. 不会做任务拆解,也没有记录拆解的任务。
  5. 做事没耐心。
  6. 不 Review 自己的代码,做过的事情,犯的错误。
  7. 从不了解架构,不了解设计(设计就是架构)。
  8. 不了解敏捷开发,更没有想了解的意愿,也不会去实施。Scrum Standup 、Kanban Board 是能提高工作效率的。
  9. 喜欢埋怨别人,说在公司学不到技术,也不积极主动学习。
  10. 认为重复的 CRUD 很无趣,总想着换个工作能好点。
  11. 对每天做的事情不做记录。这里不是指日报,这里指的是你对每天工作是否有计划,将大的任务,拆成足够小的子任务。按优先级,有次序得完成任务。
  12. 喜欢口述需求,不做文本化记录、转达。来自同事
  13. 喜欢 "多线程" 处理任务。也就是同时做多件事。
  14. 命名无关紧要。
  15. 从不重构以前的代码。
  16. 喜欢一个方法写一大段代码。
  17. 对自己的代码质量没有追求。没有匠心精神,只是个开发( Developer ),而不是工程师( Engineer )。
  18. 和上面一样,认为敲代码来钱快,觉得以后要转其他职业的。来自以前的一些同事。
  19. 喜欢盲目追逐新技术,不深入了解类似技术的本质。
  20. 喜欢闭门造车,不了解业界成熟的内容本质,不会多维度比较。
  21. 喜欢看"垃圾博客"(这里特指 CSDN 上的大部分博客),而不是看书了解技术。
  22. 对别人产生严重依赖。例子:连 SQL 的关键字 AFTER 也要去问别人得到答案,而不是自己搜索。
  23. 工作能力很差,但总喜欢教别人工作之外的事情(例如 "做人" 的那些 "大道理")。
  24. 思维固化,不听取他人意见,只会反对(无理无据,没有拿出实际论证的内容那种)。
  25. 在没有完全掌握或了解的情况下,擅自使用 "新技术"。例如在没有完全掌握多线程和函数式编程的情况下,喜欢 "滥用" 多线程、函数式编程。我说的掌握,前提是看过相应的书籍,例如《 Java 8 实战》、《函数式编程》、《 Java 并发编程实战》这些书籍,并且真正理解其中的内容。在不了解 Kafka Streams 的情况下,直接引入对应的 Spring Cloud Stream 进行新项目的开发,从而引入天坑。
  26. 碎片化工作。上班一半以上时间都是在刷手机摸鱼,没有完整的大段的深度工作的时间,把工作时间碎片化了。
  27. 喜欢将 5 天的事情,拖到 6 天 "做完"。当然,这里和公司也有关系,垃圾公司是比较喜欢 996,大小周,以为能多压榨下员工。
  28. 从不看计算机操作系统的相关内容。
  29. 喜欢过度设计。这个 "过度",仁者见仁,智者见智,分不同场景下有不同的解释。
  30. 引用别人的内容,从不标注出处。

参考自

正例

《高效能人士的七个习惯》

《深入理解计算机操作系统》

《 Clean Code 》

《 Clean Architecture 》

《重构》

The skill of self confidence | Dr. Ivan Joseph | TEDxRyersonU - YouTube

芯片工程师的一天 | 我如何每天高效工作 12 小时? [经验分享]

《 10x 程序员工作法》

如果你没有看过《高效能人士的七个习惯》、《金字塔原理》、《 Clean Architecture 》、《重构》、《实现领域驱动设计》、《微服务架构设计模式》、《测试驱动开发》、《敏捷软件开发:原则、实践与模式》(后面两年本我也没看过,只看过相关的书籍,例如大学学的《软件工程》),你又想短时间内提升自己,你可以挑着这个专栏,如果和你意你可以考虑买一下。我没收过极客或者作者一分钱,只是觉得还行,有一定收获。当然,看了专栏不代表这些书就可以不看了,这些书籍我也看了大半,尤其是《 Microservices Patterns 》也就是《微服务架构设计模式》,力荐。

反例

一年前的自己

历任同事(不包括所有)

我知道我不能说 CSDN 上全是垃圾博客,全是讲一半害人,抄书上的内容,你可以很 "轻易" 得找出能反驳我的博客。每个人都有自己不同的看法,我的看法就是认为 CSDN 是垃圾网站。

——来自一个告 "深山猿" 直接抄袭复制《 MySQL 实战 45 讲》的人,询问 CSDN 客服,告诉极客时间专栏作者。

你们的 win 本贴摄像头吗?

Posted: 11 Sep 2021 04:41 AM PDT

不贴总感觉会被人黑了... 当我认真时,偷窥我帅气的脸。

还有三天就 JDK17 了,大家还在用 8 吗

Posted: 11 Sep 2021 04:40 AM PDT

https://ww1.sinaimg.cn/large/006fIJNLly1gucqrztu62j60cf03x3yu02.jpg 每次想要用新的 JDK,总感觉到一股冥冥的阻力

安装 Flask 的时候提示没有 flask 这个 module,无解?

Posted: 11 Sep 2021 04:30 AM PDT

新手学习 Python 和 搭建 Flask 服务。

按照新手村教程,一开始 pip3 install flask 安装完毕后,运行新手村 HelloWorld 程序,提示 ImportError: No module named 'flask'

于是,pip3 uninstall flask

采用手工安装的方式,git 了 flask 到本地

cd flask 进入目录

执行安装

python3 setup.py install

然后,

提示:ImportError: No module named 'flask'

好吧,我去考驾照,交警告知我没有驾照,所以不允许考驾照……

Flutter 8 分钟制作滚动视差效果

Posted: 11 Sep 2021 04:09 AM PDT

之前有小伙伴反馈说视频中代码字体有点小,移动端观看体验不佳,这次尝试新的敲代码方式,优化移动端观看体验,希望大家喜欢

B 站地址: https://www.bilibili.com/video/BV1JL411t7Xr/

源码已上传至 https://github.com/FlutterDance/movie

V 友们轻喷

os.path.isdir 判断目录还是文件出错?

Posted: 11 Sep 2021 04:07 AM PDT

# 最近使用 os 库判断的时候出现了一个不可思议的错误 path = "/Users/xxx/path/a b/name" os.path.isdir(path)    # False os.path.isfile(path)   # False # 大概去机器上看了一下这个是一个目录, os.path.isdir 判断错了, 但是 os.path.isfile 是正确的 # 系统版本: mac 11.2.3 # python 版本: 3.7.9 

有大佬们帮忙看一下么

Windows11 22454 是不是开始菜单位置右移了

Posted: 11 Sep 2021 03:55 AM PDT

更新之前没注意,但是总感觉他变了

你们的手机贴摄像头吗

Posted: 11 Sep 2021 03:53 AM PDT

如题🐶

镜像问题:你们的 win 本贴摄像头吗?

Qca6174 网卡固件谁能给指个明路

Posted: 11 Sep 2021 03:50 AM PDT

ubuntu2004 之前的版本官方固件也是有问题的,但是起码 GitHub 上总能找到可用固件。最近 ubuntu 更新了 5.11.0-27 所有的固件都不可用了。

有 x 靠谱的解决办法请指教

wireguard-go armv7, 在 hw 光猫上可以 ping wireguard 网关, pc 上不行。

Posted: 11 Sep 2021 03:43 AM PDT

RT,

见之前讨论的帖子。v2ex.com/t/800905

现在遇到新的情况,因为在光猫上无法用 wg-quick,有很多命令光猫上没有,所以看了下 wg-quick 脚本,用原始命令直接敲

load hisi tun.ko

insmod  /lib/modules/4.4.197/kernel/drivers/net/tun.ko 

create wg0 interface

LOG_LEVEL=debug wireguard-go  wg0 

configuration

 #set ip ip -4 address add 10.0.1.88 dev wg0  #up wg0 ip link set mtu 1280 up dev wg0  #add route, ONLY ALLOW .1 through wg, just for test. ip -4 route add 10.0.1.1 dev wg0  #set conf wg setconf wg0 wg0.conf 

result

[root@x6 /mnt/jffs2/hw] # route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 0.0.0.0 0.0.0.0 U 10 0 0 ppp257 10.0.1.1 0.0.0.0 255.255.255.255 UH 0 0 0 wg0  #ping test on x6 [root@x6 /mnt/jffs2/hw] # ping 10.0.1.1 PING 10.0.1.1 (10.0.1.1): 56 data bytes 64 bytes from 10.0.1.1: seq=0 ttl=64 time=19.197 ms 64 bytes from 10.0.1.1: seq=1 ttl=64 time=20.565 ms  #ping on pc C:\Users\xxx>ping 10.0.1.1  Pinging 10.0.1.1 with 32 bytes of data: 

go web 和 Java spring 比优势在哪里?

Posted: 11 Sep 2021 03:22 AM PDT

最近接手一个 go 的项目,gin 框架写的,main.go 各种 init 手工拼接日志、路由、orm 、grpc 等,c *context 之类的指针满天飞,日志都得自己定义,还定义的乱七八糟,相比 spring 一把梭一点都不顺滑啊,所以,很多项目转 go 是为了个啥?就为了省那么点内存?

Windows 中的调整以优化性能各项指的是?

Posted: 11 Sep 2021 02:47 AM PDT

有两个选项,一个是程序,一个是后台服务
我想知道 Windows 是如何判断程序和后台服务的
亦或者是后台服务实际上是所有进程都均匀分配 CPU 么?

部署 省钱之旅路漫漫, 论我在阿里云 k8s 的一次实践

Posted: 11 Sep 2021 02:07 AM PDT

原文是我首发在 ruby-china 上, 也分享给 V2EX 的朋友

前置说明

如果你的业务在快速增长, 且你的技术栈比较单一(比如就只有 rails 和 前端 nginx ), 请你直接忽略掉这篇文章 本文主要对象为: 业务较为稳定, 捉摸着省钱的, 开发任务不重的团队。 至于技术栈, 无所谓复杂不复杂

我花了两周的时间,才摸到了 k8s 的基本规则, 并理论验证了阿里云 k8s 在高可用的情况下做到省钱。 把我的痛苦经历写出来, 希望能对想碰这块的朋友做出一点贡献。

为啥想起来研究 k8s

想省钱。利用 k8s 的弹性扩容: 在低峰期开固定的资源, 之后在高峰期再怼临时资源, 高峰回落, 关闭多余资源。

虽然很多运维使用 k8s 的原因是因为他能隔离环境, 以及比较轻松就能实现的滚动更新, 但是对于我这种 单一技术栈 rails 的人来说, 意义反而不大。

依次遇到的困难

  1. k8s 知识的复杂度 这是最大的困难,概念太多。 我并非运维出生, 很多概念太多太复杂, 这里仅仅指出以下名词,这是我觉得必须要知道的

master worker node pod service ingress-controller

  1. 搭建 k8s 上我的选择

最开始的想法是自建 k8s 。 对于入门 k8s 的人来说, 这简直是史诗级灾难, 最后发现最简单的方式就是利用 rancher, 先用一个 docker 跑起来, 之后在 rancher 的指引下, 新建一个集群, 这种操作只用点鼠标以及拷贝命令执行, 集群几乎就是点击就送。

但是, 如果自建 k8s, 除非你的 k8s 有完善的管理工具可以去开启或关闭你的 worker 节点, 否则,k8s 本身的弹性伸缩 pod, 对你是没有意义的, 因为 pod 是跑在机器上的,pod 减少了, 机器没减少, 费用并不会减少, 这点一定要想清楚。

rancher 这个 k8s 管理工具其实已经实现了 aws 的 EC2 以及 ALIYUN 的 ECS 的伸缩。 但是这里有个问题,ECS 启动, 是在是慢的抠脚,从 ECS 启动到 k8s 初始化完默认的 pods,最终能在这个 node 上跑自己的 pod,前前后后要 3-5 分钟。 这种长时间的等待, 是肯定没办法接受的。

另外, 自建集群还有一个烦恼: 如果你要实现高可用, 那 master 就不能只有一台, 且 master 是不能当 node 使用的。 这就意味着, 至少我得出两台 2C2U 的机器做 master 节点。

那么, 我就走向了另一种方式, 托管式的 k8s, 因为我司使用的是 aliyun, 所以我这就以阿里云的 托管 k8s 作为解说

阿里云的 k8s 我主要研究了两种

  • ack 即 阿里云官方提供 master,我们提供 ECS 当 worker 节点即可。
  • ask 即 阿里云官方提供 master,以及虚拟的 worker 节点, 我们启动的 POD 会跑在一个叫做 ECI 的东西上, 而 ECI 就是个容器。
  1. 阿里云 托管 k8s 的费用简析

固定支出

咱先说啥都不干的情况下的费用

两个负载均衡: 一个作为内网 API SERVER 的负载均衡, 即你的 worker 之间的互相通信, 这个没办法省。 还一个是 ingress 使用的外网的负载均衡, 如果你的集群是对外暴露服务, 那也没办法省, 二者这个还要被收流量费 忽略流量费, 两个负载均衡都选最便宜的, 总价大概是 0.12 * 24 * 30 = 86.4 流量是 8 毛 1G 咱估算一个月跑 100G 就 160 块

SNAT, 用来 worker 节点上上网工作。 这个费用是 0.24 每小时 再 加上个 CU 的计算。 一个月算下地就是 172 + CU, 咱估算成 200 。 但是, 如果你有另外一台机器配了外网 IP, 且你知道如何自建 SNAT 的话, 这个钱可以省, 只不过需要多算下这台机器的成本,比如你预估是 80 块

小破存储日志 可以几乎忽略, 咱按 20 算

最终, 固定支出是 160 + (200 | 80) + 20 = 380 | 260

工作节点支出

说到了重点,ASK 和 ACK 的重要差别,worker 节点的费用:

从维护性角度上来说,ask 明显更利于 管理, 毕竟少了一层 worker 的管理。

但是, 同志们,ASK 使用的 ECI 是史诗级的贵,ECI 只有 按量收费 一种模式,其中 CPU 的收费是接近 0.45/小时 /1vCPU, 内存是接近 0.05 每小时。也就是说, 单纯的 1C1G 的 ECI, 跑满一个月, 收费是 150 元 /月。 同时我看了 ECS, 如果是包年包月,1C1G 大概是 30 块左右, 如果是按量付费, 大概是 80 块左右 , 所以在 1C1G 的情况下 ECI 的收费是 ECS 按量的 2 倍, 包年包月的 4 倍

ASK 的模式是 所有的服务都会按照 ECI 来跑。 比如我在 k8s 肯定是要跑 PUMA 提供服务的, 比如我们现在的服务 www.admqr.com 的 puma 是跑了两台包年包月的 4C8G 的机器上的, 那如果我要在 ASK 的 k8s 上跑, 哪怕不算 k8s 的固定费用, 我想打平 ECS 的成本, 则只能开两个 1C2G 的 ECI,且不能有任何弹性扩充。 这明显的感觉就是非常之不划算。

所以, 阿里这种 ASK 的 k8s, 应该重点是想解决土豪玩家解决部署难, 运维难的问题, 而不是穷玩家解决省钱的问题

那么 ACK 模式吧

ACK 模式的 k8s 是将 ECS 加入到工作节点, 看起来似乎是 跟 私有部署 rancher 差不多的弹性扩展方式, 然而, 阿里云还是考虑到了这个扩容慢的问题,ACK 上, 通过增加 virtual-kubelet-autoscaler 应用, 就可以实现在 ACK 模式下, 直接跑启动起来非常快的 ECI 了

等等, 刚不是说 ECI 贵的抠脚么, 咋还用?

重点来了, 咱可以把常驻的 pod, 跑在我们开的 ECS 上呀, 而且, 咱可以利用 k8s 开了的 SLB 对抗抢占式实例的释放风险, 直接开抢占式实例的 ECS 来降低成本!

这里有个小技巧, 阿里云在创建 ACK k8s 的时候会默认新建 ecs, 此时非常坑的只能选择又贵又坑的实例, 但是其实你可以向我一样, 选择 加入已有实例, 之后再在 ECS 面板上, 开通两台抢占式实例, 之后限制抢占式实例的最高限价为 按量收费, 比如我这里开通的 2c4u 的服务器, 目前的价格是 0.07 每小时, 运气好的话一个月只要 50 块 最贵估计也不会超过 300

所以, 在没有弹性的时候, 运气最好的情况两台就是 100 块

virtual-kubelet-autoscaler 的作用就是, 当你的 ecs 因为资源问题, 没办法再添加新的 pod 的时候, 他会帮你开启 pod 所需的能达到你 pod 硬件条件的 ECI, 咱只需要这个 ECI 启动时间不超过 6 个小时, 就相当于省下了 1C1G 不停运转的钱

最后 我拿 www.admqr.com 来规划下,ack 的使用情况 目前毛驴是使用了 2 台 4C8G 跑 puma ,和 1 个 sidekiq, 1 台 4c8g 跑 4 个 sidekiq, 平时他们的 cpu 都不会超过 10% 高峰期出现在 9-11 点 晚 7-10 点 以及 0-1 点的 sidekiq 结算时间

于是乎,puma 我平时跑 0.25 CPU 最大 0.5 个 CPU 1G 的内存 cpu 超过 80, 内存 80% 开始扩展 为了高可用, 咱闲时就跑 2 个 pods 就好, 估计第一个扩展 pod 开启都不需要 ECI 。 因为 sidekiq 本身不需要做高可用, 所以就平时跑一个 0.5 CPU 1G 即可, 需要时候再扩展都来得及。

压力时刻 ECI 会开启, 根据之前的 pod 的性能约束, 其实它最多也只会开启 0.5 1G 的那种 ECI 型号, 因为之前咱算了下, 高峰时间是 2 + 3 + 1 即 6 个小时。 好处是,ECI 是按秒计费, 估计实际时间应该在 5 个小时左右。 咱按高峰时刻, 会启动 2 个 0.5 CPU 1G 内存的机器, 即 1C2G 的费用*6 个小时

综上所述, 类似 www.admqr.com 这种项目跑在 k8s,

最终使用 ACK 的 worker 的估算成本, 就是

100 + 1C2G 的小时费用* 6 小时 30 即 100 + ( 0.45 + 0.1 ) 30 = 100 ECS+ 16 弹性 ECI = 116 块

最终, 咱再加上 K8S 在阿里的固定支出 300 左右( 260 ~ 380 ), 最终 k8s 的全部支出估计在 500 左右

我们再回过头来看看 ACK 与现在 传统的 ECS 省钱省在哪里:

  1. 原来常驻的两台 4C8G 的 puma, 被 2 台 2C4G + 偶尔启动的 0.5C1G 的 ECI 代替了
  2. 原来的 跑 sidekiq 的主力机型 4C8G, 被偶尔启动的 ECI 以及 前面两台 2C4G 的机器跑完 puma 剩余的性能,代替了

但是 k8s 多出了固定支出 SNAT + 2 个负载均衡。 严格意义上来说, 只是多了一个负载均衡, 因为本质上,ecs 这种传统模式, 最终还是要接一个负载均衡才能规避单点风险, 另外 SNAT 收费这块, 我真没经验到底会跑出多少钱, 作为省钱小能手, 我一般选择开一台机器做手动 SNAT

那么传统的, 费用是多少呢?

三台 4c8g 虽然我们开的是包年包月, 但是按照最省钱的方式的话, 可以以抢占模式开通性能突发性能型, 之后开启突破性能积分 目前华南 C 区是 0.18 / 小时 算下地就是 130, 再加上性能突破, 咱按 150 算, 即 3 台是 450 块, 再加上一个 SLB, 差不多就是 500 多了呗

当然这么便宜是有风险的, 抢占式服务器, 会有 3%的几率释放, 如果要完全避免这种风险, 就可以用的倒霉的 包年包月计算型,ecs 的费用差不多就是 1200 元最后估计 1300

结论

在想做到极致成本控制的情况下, 其实 能弹性伸缩的 ACK 以最省钱的模式运行 和 传统的 ECS 以抢占式实例+性能突发+性能突破, 最后的费用是差不多的。 如果你之前是搞了 抢占式+ 性能突发, 说实在话, 单纯为了省钱折腾 k8s, 没有太大意义。如果是其他方式运行的 ecs, 则 k8s 能省点钱, 但是需要你付出极大的运维代价(我被 k8s 折磨的死去火来的两个星期, 现在天快亮了我还在含泪发帖), 之后你还能收货常见的部署统一, 滚动发布, 进一步健壮系统的 k8s 带来的好处。

k8s 就算在坑爹的硬件条件下, 还是可以保持了高可用, 哪怕节点被回收, 只要不是同时回收两个节点, 系统都可以自行恢复。 量突然增大, 只要前面的 SLB 不倒, 系统也可以做到自动扩展。

ecs 在 slb 的加持下可以做到某个 ecs 挂了还能残血支撑, 但是性能就没办法自动恢复, 需要人工参与, 流量增大因为没弹性, 就一点办法没有了。

后记

k8s 真是太复杂了, 经过大量折腾, 最后得出这个结论, 一度让我觉得我浪费了 2 周的时间。 然而在跟朋友在群里吹牛 k8s 后, 最后觉得还是值了, 毕竟技多不压身, 祝各位坛友学富五车

pycharm 导入其他项目文件夹求助

Posted: 11 Sep 2021 12:13 AM PDT

步骤:
1. 之前在其他电脑上写的项目工程,现在用新的电脑装了最新的 pycharm 打开。
2. 打开 pycharm → 左上角 File →Open,选择之前的文件夹打开。
3. 补上之前脚本缺失的 package,准备输出 exe
4. Terminal 中输入 pyinstaller 的打包命令,提示如下信息


网上查了一下,貌似是环境变量没搞对,跟着几个教程弄也没弄好

求问:
1. 针对我这种情况,如何解决,是哪里做错了
2. 正确打开项目文件夹的姿势(可以直接继承安装项目需要的所有 package,环境)

请各位大佬不吝赐教,小弟感激不尽!!

请教一个生产环境 Python 多版本管理的问题

Posted: 10 Sep 2021 11:58 PM PDT

目前场景是这样的:
服务需要部署在物理机上(不希望服务进容器,这个是客观限制没法变动)
物理机均为较旧版本的 Ubuntu Server (比如 14.04 、16.04 ,可以尝试用过 deadsnake 的 ppa 里的包,是可以正常部署的)
不能对原有的 python 环境产生破坏性,必须独立于原有的 python 环境( Ubuntu 系统工具中存在一些依赖自带 python2 、3 的工具,尝试过强制更新,会造成一些无法预料的问题)
pip 需要独立出来 (python3.4 、3.5 能用的 pip 版本的 setuptools 不兼容较新的包,使用 Pipenv 进行包管理)


项目使用的特性至少需要依赖于 python3.7 以上(需要用些 asyncio 的新功能),之前尝试在 14.04 3.4 的环境下使用 pipenv ( 16.04 可以正常用 pipenv ),均会有至少 python3.5 的版本要求限制,所以需要一套完全独立于系统的 python 和 pip 环境。

项目的开发环境都是使用 pipenv+pyenv 进行多版本、pip 隔离的,所以希望尽量可以在线上使用 pipenv 。

目前初步想法是编好一套完全独立于系统的 python 环境丢在专门的目录下,然后写一个独立的环境变量文件,启动使用 shell 脚本启动(这样内部运行时会携带进去专用指向的 python 环境参数),不知道这样是否可行?或者大家有什么更好的办法吗?

react 项目开发站点的问题

Posted: 10 Sep 2021 10:44 PM PDT

1.本地跑项目 http://localhost:10000/ 默认会去查找本地 storage 的 token,没有的话跳转到某个站点去请求。通过 NAS 登录,请求完后跳转到 https://cargo.xxxx.lt/的地址,存入的此域名下的 local 。 现在问题是,跳转后回不到我本地开发地址,因为跨域存在我也获取不到,只能手动 copy 放入,对开发非常不友好。 能否通过什么方法,让我跳转后也能全局获取到 storage 的 token 获取能否代理跳转回本地?

红米 K40 在刷了 LineageOS 后信号强度似乎下降了

Posted: 10 Sep 2021 09:49 PM PDT

刚买到手就(等待 7 天后)解了 bootloader 锁,然后没过多久就刷了 LOS 。
刷完后感觉信号格数似乎下降了,原先 MIUI 下,我记得是很容易满格或接近满格,现在 LOS 下好像通常都是只有一半。
正好手边还有一台 K40,这个 K40 没解锁 bootloader,除了颜色不一样之外配置参数全都一样,进去*#*#4636#*#*看了一下:

LOS 18.1 的 K40 甲:-113 dBm 27 asu
MIUI 12.5.4 的 K40 乙:-108 dBm 32 asu
用的是同一张 SIM 卡,数据网络类型都是 NR_SA

确实,现在这样不是同一台机器,并没有严格控制变量。如果是 K40 甲在刷成 LOS 之前也监测数据、最好再取个平均值什么的才真正严谨,但现在要刷回 MIUI 还是太麻烦……

MariaDB 遇到个奇怪的现象,空表无缘无故消失、

Posted: 10 Sep 2021 08:56 PM PDT

例表:t_table,表中无数据。

生产环境下( MySQL )这个表一切正常,我本地环境下( MariaDB 10.4.10-MariaDB-log )都出现好几次表无缘无故消失不见(只剩 .ibd 文件,.frm 文件消失了)。

表结构如下:

CREATE TABLE `t_table` (   `id` char(36) NOT NULL,   `assem_ref` varchar(20) NOT NULL,   `as_id` char(36) NOT NULL,   `goods_id` char(36) NOT NULL,   `period` varchar(20) NOT NULL DEFAULT '',   `in_date` date DEFAULT NULL,   `in_pici` varchar(20) NOT NULL,   `in_count` int(20) unsigned NOT NULL,   `in_count_total` int(20) unsigned NOT NULL,   `cost_price` decimal(18,2) NOT NULL DEFAULT '0.00',   `cost_material` decimal(18,2) unsigned NOT NULL,   `cost_labor` decimal(18,2) unsigned NOT NULL,   `cost_prod` decimal(18,2) unsigned NOT NULL',   `input_user_id` char(36) NOT NULL,   `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,   `update_time` datetime DEFAULT NULL,   `cost_fuli` decimal(18,2) NOT NULL DEFAULT '0.00',   `cost_power` decimal(18,2) NOT NULL DEFAULT '0.00',   `cost_low_value` decimal(18,2) NOT NULL DEFAULT '0.00',   `cost_house` decimal(18,2) NOT NULL DEFAULT '0.00',   `cost_depr` decimal(18,2) NOT NULL DEFAULT '0.00',   `cost_leasing` decimal(18,2) NOT NULL,   `cost_soft` decimal(18,2) NOT NULL DEFAULT '0.00',   `cost_dev` decimal(18,2) NOT NULL DEFAULT '0.00',   `cost_init_material` decimal(18,2) NOT NULL DEFAULT '0.00',   PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC; 

当用 drop table t_table 时,提示:Unknown table 't_table',但是在数据目录下还有 t_table.ibd 文件存在,对应的 .ifm 消失了。

删除 t_table.ibd 文件后,重新建表时又提示:Table 't_table' already exists,t_table.ibd 文件自动恢复了、、

大家有遇到这种情况吗?求解是什么导致的,因为只有这一张表隔三差五出现这个问题。

有什么好的途径,发掘感兴趣的项目写代码练手

Posted: 10 Sep 2021 02:53 PM PDT

白天工作每天都处理一些垃圾代码和问题,好久都没静下心写代码了,但是又不知道写个什么。 github 上瞎逛了一圈,也没什么想法,总感觉自己能看到的很有限

实现 Windows 系统远程控制某一个软件有没有可能

Posted: 10 Sep 2021 02:08 PM PDT

如题,例如 A 电脑控制 B 电脑的微信,在 A 电脑里有一个远程对话窗口,内容只有 B 电脑微信界面

HiSuite 不 root 也能备份与还原 data/data 应用的原理是什么

Posted: 10 Sep 2021 02:07 PM PDT

有了解 pdf 电子签章、电子签名的大佬吗,如果我自己购买 pdf 签名证书,是不是就不需要买第三方的电子签章服务(或者 SDK)了?

Posted: 10 Sep 2021 01:46 PM PDT

有没有这块的大神,可以给科普一下。最近在调研电子签章的东西,但是业内的公司都是采购电子签章服务商提供的服务或者 SDK,配合授信的 CA 颁发证书,完成 PDF 的电子签章(数字签名+电子签章一起,也有叫域签章的)。

但我用程序完全可以实现啊,只要我购买了证书,配合 PDF 库(比如 ITEXT ),同样可以完成签章+数字签名的操作。

这样一来,还买这些厂商提供的电子签章服务干啥?直接买个证书一年几千块钱就搞定了, [数安] 的 PDF 证书连 ADOBE 都信任,它不香吗?

Angular 开发小程序

Posted: 10 Sep 2021 12:02 PM PDT

Angular开发小程序

  • 通过修改Angular实现使用Angular开发小程序
  • 本项目实现的目的很简单也很纯粹,就是告诉大家.框架无高低,使用的人,有高低

视频简介

开发模板

修改内容

  • builder

    修改用于支持自定义构建

  • component 编译时

    通过提前解析获得模板与样式,转换为小程序所需的

  • 全局变量

    用来支持ngZoneAngular默认全局引用

  • platform

    通过实现自定义的 platform,给予小程序的启动上下文支持

  • renderFactory

    原渲染工厂支持的是 dom 渲染,但是小程序不需要

  • 主出口重建

    主出口预先加载相关依赖,为后面的 page 做准备

  • 文件系统监听修改

    需要在预处理结束时,清除文件缓存

增加内容

  • 组件与页面的注册函数

    只有被注册,还会自动的查询依赖关系与生成

  • 相关生命周期的传递

    小程序自带的一些生命周期

  • 小程序相关 token.

    APP_TOKEN可以获得 App 实例 COMPONENT_TOKEN,PAGE_TOKEN可以获得组件对应的小程序组件实例

已实现内容

  • 变更检测
  • Input,Output
  • 依赖注入
  • ng-content
  • ngIf,ngSwitch,ngFor

    对于其他指令及自定义指令,暂未实现

  • 小程序大部分功能

未实现

可实现的功能

  • http
  • 管道
  • 非结构型指令
  • 结构型指令的非引用传递或有限传递
  • 路由的部分实现

    路由是否实现主要看小程序的使用场景需不需要路由这个东西

  • 表单
  • 自定义组件

不可能实现的功能

  • 无限制的结构型指令

    除非模板运行动态按需加载

其他平台的支持

  • 目前功能尚未完善,不对多余的平台做支持
  • 目前仅支持微信小程序,但是未来重构完善后,会添加其他平台的小程序支持

准备做的

component 的 template 重写

  • 之前是通过完全重写实现的值绑定与更新,但是是因为有一个技术没法实现所以才采取点方案.
  • 目前已经可以通过替换调用函数实现这个,所以重新 template
  • 重写后将会使管道,表单,非结构型指令的支持

来补课,教你怎么省下插件,用 vim 自带的功能完成大部分的事情

Posted: 10 Sep 2021 10:40 AM PDT

有没有那种一键迁移系统缓存位置的软件

Posted: 10 Sep 2021 10:09 AM PDT

想把系统的多数缓存迁移出非系统盘。
只记得以前魔方能做到把我的文档、音乐、视频什么的该位置的功能
有没有更彻底的修改软件

React Dashboard 仪表板解决方案

Posted: 10 Sep 2021 08:29 AM PDT

React Dashboard Pro

npm version npm version npm version npm version npm version npm version

开箱即用的一站式仪表板解决方案

只需简单几步即可拥有动态仪表板功能

解决的是"千人千面"的 B 端几乎都要用到的 Dashboard + Widget 客制化需求。

repository-open-graph-template 副本

Repository

https://github.com/yuanguandong/react-dashboard-pro

Live demo

https://yuanguandong.github.io/react-dashboard-pro/

Install

npm i react-dashboard-pro -S  git clone https://github.com/yuanguandong/react-widgets 

How to use

import React, { useState } from 'react'; import type { LayoutsIF } from 'react-dashboard-pro'; import Dashboard from 'react-dashboard-pro'; import allWidgets from '../widgets';  export default () => {   const [layout, setLayout] = useState<LayoutsIF>([]);   const onLayoutChange = (layout: LayoutsIF) => {     setLayout(layout);   };   return (     <Dashboard       widgets={allWidgets}       onLayoutChange={onLayoutChange}       layout={layout}     />   ); }; 

Props

property description type defaultValue required
widgets 可选的小程序对象集合 { [key: string]:widget} true
editMode 是否编辑状态 boolean false false
defaultLayout 默认布局 layoutItem[] [] false
widgetWrapClassName widget 容器类名 string false
widgetWrapStyle widget 容器样式 React.CSSProperties false
layout 布局数据 layoutItem[] null false
minHeight 最小高度 number 300 false
maxWidgetLength 当前仪表板最大可添加的 widget 数量 number 20 false
toolbar 是否显示默认工具栏 {type: 'left' | 'right' | 'top' | 'bottom'; speed: number;} true false
storageKey 本地存储唯一标识 boolean 'default' false
onLayoutChange 布局改变的回调 (layout: LayoutsIF) => void false
onReset 清空按钮的回调 (dirtyCurrentLayout: LayoutsIF, currentLayout: LayoutItem) => void false
onRemoveWidget 删除小程序的回调 (widget: widgetIF,dirtyCurrentLayout: LayoutsIF,currentLayout: LayoutsIF) => void false
onAddWidget 添加小程序的回调 (widget: widgetIF,dirtyCurrentLayout: LayoutsIF,currentLayout: LayoutsIF) => void false
onReload 刷新按钮的回调 (currentLayout: LayoutsIF) => void false
onCancelEdit 取消编辑的回调 (dirtyCurrentLayout: LayoutsIF,currentLayout: LayoutItem) => void false
onEdit 进入编辑的回调 (currentLayout: LayoutsIF) => void false
onSave 保存按钮的回调 (currentLayout: LayoutsIF) => void false
onRevert 恢复按钮的回调 (dirtyCurrentLayout: LayoutsIF, currentLayout: LayoutItem) => void false

Widget

widget 可以是开放式的任何内容,可以自由扩展,入口文件需要导出一个对象来描述这个 widget, 对象格式如下,更多 widget 可以看这里

预设的 widget 基本都依赖了 antd,使用了 less, 注意依赖的安装

property description type defaultValue required
name 小程序名称 string true
description 小程序描述 string true
tags 标签,被用作小程序选择器分类依据 string[] true
component 小程序组件 ReactElement true
configComponent 小程序对应的配置组件 ReactElement true
maxLength 该小程序在当前仪表板最大可添加数量 number true
snapShot 小程序快照图片,用于小程序选择器显示 ImageBitmapSource true
icon 小程序图标,用于小程序选择器显示 ReactElement true
iconBackground 小程序图标背景,用于小程序选择器显示 string true
size 小程序尺寸信息 {defaultWidth: number;defaultHeight: number;maxWidth: number;maxHeight: number;minWidth: number;minHeight: number} true
// todo/index.tsx import { CalendarOutlined } from '@ant-design/icons'; import Panel from './component'; import snapShot from './snapshot.png';  export default {   name: 'Todo',   description: 'todo list',   tags: ['all','list'],   component: Panel,   configComponent: null,   maxLength: 2,   snapShot,   icon: <CalendarOutlined />,   iconBackground: 'linear-gradient(-20deg, #b721ff 0%, #21d4fd 100%)',   size: {     defaultWidth: 3,     defaultHeight: 11,     maxWidth: 12,     maxHeight: 16,     minWidth: 2,     minHeight: 4,   }, } // **/**.index ……  // widgets/index.tsx import Clock from './clock'; import Column from './column'; import Guide from './guide'; import Popular from './popular'; import Ring from './ring'; import Todo from './todo';  export default{ Clock,Guide,Popular,Todo,Column,Ring };  

Layout

布局信息一般情况下不需要太关注,只需要序列化的以字符串方式存储下来即可,若想实时获取仪表板布局数据(比如要设置默认布局时),可以聚焦(鼠标点击)到对应的仪表板,按快捷键 <Text keyboard>Ctrl</Text>+<Text keyboard>Shift</Text>+<Text keyboard>C</Text> 复制布局数据到剪切板,同时 console 面板也会打印出来布局数据

property description type defaultValue required
i 唯一标识, 以小程序的唯一标识加中划线开头,如 'widgetKey-1234567' string true
w 宽度份数,总共 12 份 number true
h 高度份数,1 份大概 30px number true
x 横向位置,总共 12 份 number true
y 纵向位置,1 份大概 30px number true
minW 最小宽度 number true
maxW 最大宽度 number true
minH 最小高度 number true
maxH 最大高度 number true
export default [   {     w: 3,     h: 16,     x: 0,     y: 0,     i: 'Popular-81735522335293475546087951289435',   },   {     w: 3,     h: 11,     x: 3,     y: 5,     i: 'Todo-53084247679600442035440807237732',   } ] 

实例方法

可通过 ref 获取组件实例,实例对象上挂载了一些方法和 dom 对象,可以方便拓展自定义的 Toolbar 和 WidgetSelector

property description type
dom DOM 对象 HTMLDivElement
addWidget 添加小程序 (widget)=>void
removeWidget 删除小程序 (i:widgetKey)=>void
reload 刷新 ()=>void
edit 进入编辑 ()=>void
cancelEdit 取消编辑 ()=>void
revert 重置 ()=>void
save 保存 ()=>void
import React,{useRef} from 'react'; import Dashboard from 'react-dashboard-pro'; import allWidgets from '../widgets';  export default () => {   const ref = useRef()   const addWidget = ()=>{     ref.current.addWidget('Todo-1234567')   }   return (<>       <Dashboard         ref={ref}         widgets={allWidgets}       />       <button onClick={addWidget}>新增</button>     </>   ); }; 

Todo

✅ configPanel

☑️ gap

☑️ modern theme

☑️ dark theme

☑️ more widget

☑️ widget-cli

☑️ 国际化

The End

  • 欢迎大家提 issue, 有需求我会尽力满足大家的痛点
  • 这个项目我会一直维护下去,大家放心使用

觉得有用的话点个 star 吧 🙊,支持一下吧!

No comments:

Post a Comment