Friday, July 1, 2022

V2EX - 技术

V2EX - 技术


同一个 20 核 128GB RAM 无显卡虚拟机,在 Windows 10 2016 LTSB+Ubuntu 16.04 下用同版本同参数的 ffmpeg 压缩视频,为什么 Windows 总比 Ubuntu 快 25%?

Posted: 01 Jul 2022 12:30 PM PDT

测试了好几轮还是这样。区别是 Windows 任务管理器 看 CPU 占用始终 100%,Ubuntu top 命令看 CPU 经常会落到 50%左右 1 秒然后升回 100%。

都是刚安装完系统,没有第三方软件的状态(懒得装系统,8 年前装了两个系统磁盘镜像的备份一直留着,用到了现在,虚拟机需要装系统就替换上去很方便)

都是二进制文件,没有用包管理器装,确定同一版本

npm 实在是太慢了 ,各位都是怎么解决的?

Posted: 01 Jul 2022 11:27 AM PDT

我挂了影梭 好像没啥用

spring 的约定优于配置概念好吗?

Posted: 01 Jul 2022 11:02 AM PDT

尤其是 spring security+spring boot ,虽然几行代码就跑起来了,但想改却很难,因为不知道约定了啥,背后偷偷给我跑起来个啥,只能官方文档加源码配合着研究,没觉得学习成本有降低。

最终搞了个七七八八,但对于整体的结构与数据流还是没有完全理解,因为 spring boot 的自动配置会检测条件什么的,造成配置的动态化难以捉摸,虽然类都静态写在那里,但会不会实例化还要跑起来才知道。

而且 spring 里普遍的各个重要类之间的关系比较复杂,个人感觉不是线性也不是树形,而是网状的,比较纠缠。

国产操作系统的出路有没有可能是 chromeOS 这种类型

Posted: 01 Jul 2022 11:00 AM PDT

逼迫国内一些常用软件厂商做 web 版,各方面体验都不会太差感觉

最近发现好像大多数程序员都不太会用 Figma 和 PowerDesigner 不知道是不是这种情况

Posted: 01 Jul 2022 10:16 AM PDT

最近我发现我开源的 Lime 项目都没有人和我交流 Figma 和 PowerDesigner 相关的东西感觉有点尴尬,哈哈哈。

是不是 V 站基本都是程序员的原因,圈子不同所以技能点也不一样。

想了几个原因不知道是不是: 1.公司里没有用 Figma 和 PowerDesigner ,甚至都没有原型和物理模型。 2.公司里用的是其他的工具,比如:Axure RP ,墨刀,PDMan 等 3.我做的项目一般,看了感觉学不到什么东西,没兴趣。 4.没有时间,996 已经很累了,卷不动了。 5.学这些没啥用,公司里面还是以写代码为主,其他的不重要。 6.没有好的学习路径,不知道怎么学。 7.其他原因

不知道你是哪种呢 ?

《我是大冤肿的 7 月面试》之声网 Agora

Posted: 01 Jul 2022 09:48 AM PDT

《我是大冤肿的 7 月面试》之声网 Agora

总计 4 轮面试 1 轮(部门领导)(过!)(已同步期望薪资) 2 轮(交叉面)(过!) 3 轮(部门大 leader )(第一次因为领导时间原因未能如期,单方面改约时间)(过!)(同步期望薪资)

4 轮( HRBP )(过!)(同步期望薪资)

薪酬方案对接拟定流程…

沟通说三天后 7 月 1 日沟通薪酬方案~

微信同步说"同时也在推进对接其他候选人吧啦吧啦…不是很匹配…"

hahahahaha 整个大无语😑😑

这是谈薪酬方案的流程节奏????

我勒个大冤肿!!!!

疫情下时间很宝贵!!咋别这么整啊好不好…

(好歹你敷衍应付下给我个打折的薪酬方案也好啊?整个大无语😑)

https://imgtu.com/i/jQ6Bq0

https://imgtu.com/i/jQcEyn

远程服务器 RDP 断开之后,怎么保证 selenium 可以正常运行?

Posted: 01 Jul 2022 09:34 AM PDT

在这个从 2017 年讨论到 2022 年的 issue: https://github.com/microsoft/WinAppDriver/issues/147里面,有说过修改注册表、使用.bat 文件断开远程的方法,但是我试过都没用,不知道有没有大神有其他解决办法?

为什么没有一个 IDE 或者语言支持用图形等多媒体方式进行注释,大家探讨一下。

Posted: 01 Jul 2022 09:18 AM PDT

最近天天坐着写代码,有时候枯燥又烦躁,有些部分写起来比较绕脑,心想如果在旁边能够附上一张手绘的流程图就好了,用文字很多东西都表述不清楚,下次回看代码的时候又要理解半天,如果能够在旁边放一张图片,辅助文字那很多难以理解的逻辑一目了然就清楚了。为啥程序语言发展这么久,就没有出现过一款支持这种想法的产品呢?

是不是 gc 过程都会导致应用暂停

Posted: 01 Jul 2022 08:43 AM PDT

有 gc 的语言在 gc 过程中是不是都会暂停,这种暂停在什么情况下会难以接受。

如 c c++ rust ,他们在回收内存的过程中会暂停吗?

RowFish -- 一款美的无与伦比的主题

Posted: 01 Jul 2022 08:39 AM PDT

Rowfish是一套Docusaurus+Wordpress构建的用于知识分享及知识付费的主题,专为计算机从业者提升个人求职竞争力或从事网络授课 /自媒体等作为副业而打造! 🐳

🚀缘起

随着计算机相关工作的内卷日渐严重,许多同学急需一个通过多方位展示和分享自己技能的系统来提升求职竞争力以及方便找到业余的远程兼职,又或者想做网络授课 /自媒体等作为副业。对于长期与计算机打交道的同学,比如程序员,设计师,运维工程师等,由于缺少资源和交际能力,往往从事相关专业之外的副业会比较难,所以个人认为知识付费是一个不错的选择,本主题就是为此而开发。

站长研究过一些在线教育的系统,有开源的,有闭源的,甚至前几年自己还是用Laravel框架仿造php.cn写了一套类似的系统,但是发现这些系统(包括我前面写的)和网站都有一个共通的缺点 —— 那就是搭建出来的平台,整体上商业氛围太浓,对于想要做知识付费但处于起步初期的个人来说非常不友好,尤其在缺少内容和粉丝的情况下,直接拉开了你和粉丝间的距离。而那些某某课堂等 C2C 式的平台大部分要求会对资质要求比较高并且流量质量很低,非常依赖公众号等商业运作,这也偏离了我们搞技术的同学做知识付费的初衷。

站长认为个人知识分享与付费应该是一种轻松的,赞助和交友式的互动,但是目前符合这里要求的系统和平台并不多见。对于交友式的知识分享平台目前来说以博客或者个人主页类最为友好,然而纯粹的知识分享很难带来收益,这就导致了很多爱分享的同学无法长期坚持。当然也可以通过一些流量平台来获得收益,但是这些平台直接的收益微乎其微,创造的价值根本无法带来对等的收益。于是乎本人编写了这套结合用户友好度和收益同样重要的主题

经过一段时间的思考和摸索,站长认为以个人博客系统为核心,通过文档,视频,问答,作品展示等功能多方位结合的系统比较符合个人 IT 从业者做知识分享和付费使用。

于此,站长利用业余时间编写了这套用于个人搭建带有知识分享和付费的博客系统

🍃介绍

现有版本(V1)在功能和开发工作上都会围绕知识分享和付费的需求不断完善。后续版本重点工作不仅仅放在多端的开发上,也会更多的去考虑如何与社交平台进行融合。

这里是本主题暂时的功能和界面,后续会不断完善和增加新功能

🐱 简览

🐳 Rowfish

rowfish]rowfish是静态站,没有后台和付费等功能,所以预览直接看本站即可,无需简览,随便搞了张缩略图看一下 点此查看大图

🐬 Pro

以下提供的是pro的简览界面,同时你也可以访问v.pincman.com预览

点此查看大图

🌾功能列表

Rowfish本身是用于日常的知识分享及个人展示,不具备商业营运能力。而Rowfish Pro作为一个子系统存在,用于知识付费和会员体系

正确以及推荐的使用方式应该以Rowfish作为主站以Rowfish pro作为子站来搭建,可参考本站.

当然你也可以直接把Pro作为主站而不用Rowfish,因为Pro自带Rowfish的几乎所有功能,但是在样式设计,用户体验等方面站长原则上会把Rowfish做为优先级

两者的功能对比如下

功能 Rowfish
博客及评论系统
文档系统(支持在线运行 React 等演示代码)
个人介绍及作品展示
生态导航
全站搜索
护眼效果及暗黑模式切换
完美的移动端适配
联系和社交平台关注工具条
免费课程展示页
付费会员系统
付费视频课程系统
微信,支付宝等多个支付接口(支持个人使用)
问答系统
个人中心(包括收藏,消息,购买记录,充值,我的问答等)

🌴后续开发

后续所有版本对于购买过的用户会提供一键数据迁移支持

在 v2 版本之前会一直保持Docusaurus+Wordpress的组合模式。后续计划如下

  • 👉 V1 版本不断增加新功能并修复 BUG 以提升用户体验
  • 👉 计划 2022 年底释出 V2 版本的 Alpha ,从 V2 版本开始将使用Nextjs+Nestjs重构,变成一站式整体的系统、并会提供小程序端
  • 👉 从 V3 版本开始提供桌面端以及移动双平台客户端

🧑‍💻 适合人群

本主题适合以下同学

  • 👐 如果需要使用pro需要会使用服务器或云主机架设网站,主站不需要

  • 👐 会基本的 Markdown 语法编写文档

  • 👐 如果需要修改rowfish源码,则需要会一些 CSS ,会React就更好了

  • 👐 如果需要修改pro 子系统源码,需要懂PHP

  • 👐 需要搭建 UI 比较好看的静态博客系统,用于记录日常笔记

  • 👐 想要一个知识记录和分享系统来构建自己的知识体系

  • 👐 想要一个展示个人作品和技能的主页用于提升求职和远程工作的竞争力

  • 👐 需要一个比较好看的技术栈导航页面

  • 👐 想要通过知识付费赚取快外

  • 👐 想以视频教育作为副业

  • 👐 想通过自媒体运营盈利

☘️ 购买与服务

🪡定价

作为对第一批用户朋友的回馈,购买当前 V1 版本后后续版本不再收费,也就是一次付费永久升级使用

从 V2 版本开始按订阅制收费,将以每年使用费=V1 版本终身使用费来定价

定价:¥ 999 元(不包括Rizhuti的授权费用,如有需要请自行购买)

目前初始发布活动价:¥ 699 元😊(在帮助文档和视频做完之前的价格)

可联系站长(QQ:1849600177 )购买

🥤服务

目前说明文档正在编写中,暂时在购买后站长提供一对一指导

目前提供以下售后服务

  • ✍️ 定期更新官方使用教程
  • ✍️ 非紧急问题请在问答频道提交,站长将在 12 小时内回复
  • ✍️ 提供一对一使用,部署等指导(如看了教程还不会的话)
  • ✍️ 工作日(周一-周五)请直接联系站长 QQ解决
  • ✍️ 其它时间请到收费QQ 群交流,站长或其它管理员看到会帮忙解决

需要购买后加入

⚡️须知

  • 🍓 本系统不议价,一经售出概不退款,请考虑好后在付款
  • 🍉 本系统只售卖本身,云服务器,Rizhuti 授权等须自行购买
  • 🍍 为了方便可能会编程的同学可以随心修改源代码,系统没有加密。请尊重他人的劳动,购买后请不要随意传播主题,否则将对您停止提供服务

🛠️ 购买

需要购买本系统的朋友请直接联系我QQ: 1849600177

🔭使用

站长推荐的使用方式是Rowfish作为主站,Pro只用来搭建动态子站(用于付费课程,问答,会员中心等)

虽然站长也为Rowfish Pro子系统开发复刻了几乎Rowfish的全部功能,不过Pro整体上更偏向于门户,首页可以搭建出类似在线教育网站的既视感,可以参考这个演示,但是对于处于起步阶段的个人使用来说,不是很友好。为此如果直接把Pro作为单站的话,遇到的一些问题需要你自己去处理(前提是你会使用PHP),站长不保证没有 BUG...

🔥教程

具体的使用方法请直接查看Rowfish 使用教程

Rowfish使用非常简单,大概如下点此查看详细教程

  • 👉 Docusaurus的详细使用请查看官方文档,Wordpress就一个后台自己摸索一下就会
  • 👉 对于主站的文章和文档可以直接用ObsidianVscode打开./data/content目录来编辑,也可以使用 Typora 来编辑
  • 👉 对于主站的配置,使用vscode打开./data目录更改,如需修改源代码也请使用Vscode
  • 👉 对于知识付费系统直接进入后台进行内容和配置更改即可

✨技术栈

Rowfish采用Docusaurus+Wordpress(Pro)结合的方式构建而成,事实上他们是两个不同的系统,而本系统只是基于它们编写的一些主题,插件和组件等。具体采用的技术栈如下

再次提醒,Rizhuti-v2不需要授权也能使用,但是会有警告,如果介意,请自行购买主题

🐳 Rowfish Docusaurus的开发的主题。 因为 Docusaurus 本身是使用React编写的用来构建静态博客和文档系统的, 所以 Rowfish 只是在其之上进行扩展,其原本功能与 Docusaurus 一致。 需要注意的是,Rowfish 的样式全部使用 TailwindCSS 编写,并没有用到任何如 Antd 这类 UI 库, 所以很容易进行改动,十分轻量。 🐬 Pro 知识付费系统 会员系统等为动态功能,需要用到后端数据库,为了方便,知识付费子系统直接在Wordpress,之上编写一个主题来实现。 如果从头别写一个主题耗费的工作量比较大,所以站长直接在Rizhuti-V2上编写了一个子主题,并且整合了 DocspressAnspress等插件,实现了问答,课程,课程文档等功能

☄️部署方案

具体的使用部署方案请直接查看Rowfish 使用教程

简单的部署方案如下

  1. 👉 docusaurus部分可以使用腾讯云的 webify 或者国外的vercel
  2. 👉 wordpress部分可以使用宝塔面板来搭建,一个 2 核 4G 的服务器足够
  3. 👉 图片和视频可以选择腾讯云的 COS ,比较便宜

建议的部署方式如下

前提是你会一点 Linux

  1. 👉 购置一台 2 核 4G 的服务器
  2. 👉 安装Oneinstack
  3. 👉 创建两个网站并绑定域名,一个用于主站,一个用于付费系统
  4. 👉 安装Gitea
  5. 👉 安装Drone用于 CICD
  6. 👉 建立DroneGitea的通信
  7. 👉 把主站代码上传到Gitea中就可以自动部署了
  8. 👉 如果服务器带宽比较低,可以直接使用腾讯云的 COS 源站功能拉取后展示
  9. 👉 对于子站,请先安装wordpress
  10. 👉 上传Rizhuti V2,上传Rowfish pro主题
  11. 👉 安装所需插件,然后知识付费系统就搭建好啦

2022 年 VSCode 有啥好用的所见所得 md 插件吗

Posted: 01 Jul 2022 08:28 AM PDT

对 IM 聊天工具 不是特别了解,不过想知道 如 telegram 微信客户端是如何保证与服务器通讯的呢? 特别是当手机客户端进程都被杀死的情况下。

Posted: 01 Jul 2022 08:14 AM PDT

关于付费 APP 加密方式的一些疑问

Posted: 01 Jul 2022 08:00 AM PDT

可能因为我的水平有限,我所能想到的加密方式似乎都没有实际用处。

比如,某个业务场景是付费用户可以创建无限的素材,而非付费用户只能创建不高于某数量的素材。

虽然我已经用了各种方式来加密这个"某数量"的值,不过不管前面写的多绕,但是最终还是会回归到一个 if 逻辑判断。

比如,针对上述场景,我是这样写的:

    val a = "RWM="     val b = a.decodeBase64()?.string(Charset.forName("utf8")) ?: "${Char(0)}${Char(0)}"      val realNum = 10      if (realNum <= b.toCharArray()[1].code - b.toCharArray()[0].code) {         println("pass")     }     else {         println("you need pay first")     } 

但是反编译下来是这样的:

(节选)

      if (realNum <= var8 - var3) {          var4 = "pass";          System.out.println(var4);       } else {          var4 = "you need pay first";          System.out.println(var4);       } 

不管你前面写的有多复杂,最终还是会回归到简单的 if 逻辑判断,别人修改时只需要删除或者直接改一下这个判断就能轻松破解了。

判断是否付费同理,不管前面写的多复杂,最终会回归到简单的逻辑判断。

所以我现在加密完全依赖于加固,但是加固也只能防的住"脚本小子"一键破解,如果是有大牛专门破解的话,也很容易被脱壳。

虽然防住"脚本小子"已经满足我的需求了,但是我还是想知道,应该怎么在不加固的情况下避免被"一键"破解呢?

据我所知,某个业内有名的 APP ,就没有使用加固,但是就是至今没被破解,甚至作者还专门搞了个悬赏,让别人区破解它。据我了解的是,至今没人破解成功。

补充:

  1. APP 性质决定了没法将需要加密的逻辑放到服务器避免被本地破解
  2. 上述代码只是做了一个示例,实际使用比这个复杂,而且核心代码也是写在 c++ 中的,不过正如我上述说的,即使写在 c++ 中,最终也是回归到 java 调用 c++的代码,然后做一个简单的逻辑判断
  3. 我想到的是把加密和业务逻辑混合在一起,但是自己实际测试过,即使这样反编译后效果也不理想。

如何出版一本技术图书 -- 写在《C++20 高级编程》出版之时

Posted: 01 Jul 2022 07:59 AM PDT

原文地址:如何出版一本技术图书 -- 写在《 C++20 高级编程》出版之时

《 C++20 高级编程》介绍

我人生中第一本技术图书《 C++20 高级编程》即将上市,由机械工业出版社出版,目前下单链接:https://item.jd.com/10054930586115.html

C++语言至今拥有 40 多年的历史,目前最新的 C++标准已经到了令人兴奋的 C++20 ,它给我们带来了相当重要的四大特性:概念约束、ranges (范围)标准库、协程以及模块:

  • 概念约束 是一个编译期谓词,它根据程序员定义的接口规范对类型、常量等进行编译时检查,以便在泛型编程中提供更好的可读性与错误信息;
  • ranges 标准库 对现有的标准库进行了补充,它以函数式编程范式进行编程,将计算任务由一系列原子操作灵活组合而成,使得代码的正确性更容易推理
  • 协程 是一种可挂起可恢复的通用函数,它的切换开销是纳秒级的,相对其他方案而言占用极低的资源,并且可以非侵入式地为已有库扩展协程接口,它常常用于并发编程、生成器、流处理、异常处理等;
  • 模块特性 解决了传统上头文件编译模型的痛点:依赖顺序导致头文件难以组合、重复地解析、符号覆盖等问题,它从语言层面为程序员提供了模块化的手段。

本书将深入这些新特性,笔者为它们准备了丰富的代码样例,通过这些代码相信读者很容易掌握这些特性。作为一本讲解 C++高级编程的书,笔者还探讨很多元编程话题,这是作为库开发必不可少的技能,它们也随着 C++的演进而不断演进,大大提高了库开发者的编程体验,尤其是近年来 C++的标准提案经历了从模板元编程向 constexpr 元编程转换过程。

纵观 C++的演进历程可以发现,每一次演进提供的特性大多数和编译时相关,因为它的特点是零成本抽象,允许程序员表达抽象的概念而无需忍受不必要的运行时开销。而一些运行时特性相当少,在面向对象的虚函数特性之后再无运行时特性,或者它们通常以 的形式提供,例如 C++17 起标准库引入的 variant 类型,它通过元编程技术生成虚函数表。

C++对语言特性与库特性区分的非常清楚,它希望程序员能够在不引入语言机制的情况下实现一些功能,例如其他编程语言常常将元组 tuple 作为内建类型,而在 C++中它们以库的方式提供,程序员能够利用现有的语言特性实现这些组件。

如何合理的、高效的运用这些知识,它们背后通常蕴含着什么指导思想?那就是组合式思想,将问题分而治之,它能够应对许多难题。C++语言提供了足够多的抽象机制,允许程序员提出各种假设,并基于这些假设进行灵活组合

本书话题不局限于 C++20 ,现代 C++中一些很多重要的特性也会深入探讨,例如右值引用。一些编程原则,面向对象设计模式也会探讨。最后一章带领读者实现两个库:配置文件反序列库与协程库,它们大量使用 C++20 提供的特性,并使用元编程的方式构建,以对全书知识进行一个总结。

本书要求读者需要有 C++的基础知识,最好能够掌握一些现代 C++的知识,考虑到市面上的书籍以及网络上这方面的资料比较丰富,笔者在提及会引用相关链接供读者查阅。想要系统性的学习 C++20 ,并进阶 C++的技能,那么一定不要错过本书。

本书结构

笔者成书、编程环境采用 Debian bookworm/macOS Monterey/Windows 10 操作系统,编译器用的是 GCC 12.0.0/Clang 14.0.0/MSVC 19.30 ,采用 -std=c++2a/std:c++20编译选项,请读者自行安装这几个编译器。

在代码风格上,笔者力求代码简洁、精巧,例如花括号通常不独立成行,它们常常被压缩成一行;采用两空格缩进等。

全书共分为十章,C++20 的四大特性独立成章,一些小的特性则贯穿于全书,其他章节则探讨了一些面向对象、元编程、函数式编程、并发编程等话题。章节之间尽可能地按照前后依赖顺序组织,读者可以选择从头读到尾,也可以选择感兴趣的部分阅读。

类型与对象

介绍了 C++的类型系统,读者应该能认识到类型在语言中的重要性,类型安全即防止因为类型导致的错误,紧接着介绍 C++对类型处理能力的演进过程。

值类别将表达式划分为左值、右值与将亡值,从而能够表达移动语义;为了解决泛型编程中因为值类别导致重复实现多遍的问题,引入转发引用与完美转发来保留其引用性质。

介绍了类型推导相关知识,这部分知识在库开发中相当重要。

函数对象是另一个重要的概念,使用 lambda 可以简化定义函数对象的难度,标准库提供的函数适配器也能达到运行时多态。

随着union特性的限制放开,对其封装的std::variant更容易地表达运行时值语义多态,这也补充了运行时多态手段。

最后也最为重要的是调试手段,合理利用可事半功倍。

编译时多态

介绍了 C++语言在编译期进行多态的手段,最常见的是函数重载机制,支持这个特性的语言相当少。

函数重载方式给开发人员很大的灵活性,同一个语义拥有不同的实现,交由编译器进行重载决策;操作符重载可以大大提升计算的表达力。灵活的同时带来的复杂度就是语言需要很复杂的规则进行决策。

模板函数在重载过程中可能因为模板参数替换过程中可能失败,而仅仅从候选集中删除该函数并不触发编译错误,利用这个特点开发人员可以基于模板类型的特征( type traits )选择最佳的实现,例如可以针对不同迭代器的特点决策出最优的算法。

通过函数重载机制衍生了一系列相关技术:使用enable_if进行模板类型约束;使用标签分发技术进行偏序决策。使用奇异递归模板模式可以实现代码复用,做到静态多态。

最后介绍表达式模板,在编译期构造表达式树进行延迟计算,避免一些中间计算产生的临时变量,并生成高效的代码。

这些技术或多或少都是因为语言上的缺失导致的变通办法,我们即将看到 C++20 提供的新特性将代替这些技术。

概念约束

concept 非常容易地定义与使用,它解决了模板与泛型编程的很多痛点问题,极大改善了模板与泛型编程的代码质量。它就和基础的语言特性诸如函数、类一样,需要理解才能高效使用。

与未受约束的模板相比,它们没有引入额外的运行时开销。这也符合了 C++的设计原则,不要强迫程序员去做机器能做的更好的事,并且简单的事简单做,以及零成本抽象的哲学。它达到了最初所设想的 C++模板系统应有的样子,而不是语言特性的扩展。它以扩展transform变换算法结束这章。

元编程介绍

元编程技术是由编译器在编译时解析执行代码,并生成最终代码、数据的技术,它是高性能库开发必不可少的技术,通过最少的代价实现更多的功能、满足更大的灵活性,同时最大化复用代码。元编程特性是 C++语言提供的最高抽象手段。这章为后续章节做铺垫。

模板元编程

C++使用模板做元编程拥有足够悠久的历史,并且语言的发展使得元编程的体验越来越好。它为框架、库的开发提供了强有力的手段,通常是零成本抽象的基础。

在 C++中我们能够与编译器交互的工具是类型,通过强大的类型系统能够在编译期完成许多工作,并且能够生成最终高效的代码,元编程的本质是类型计算。

它以两个例子结束这章:定义图 EDSL 语言并于编译时计算最短路径、编译时生成数据表。理智的程序员发现,尽管模板元编程有着各种问题,但仍比起其他方案要好。当然,C++程序员必须学会限制编译期计算和元编程的使用,只有在值得为了代码紧凑性、表达力和运行时性能才引用它们。

constexpr 元编程

早在 2003 年,C++标准委员会提出了用于在 C++中进行常量表达式求值的一种根本不同且明显更好的机制。人们当时使用无类型的宏和简陋的 C 语言定义的常量表达式。另一些人则开始使用模板元编程来计算值,这既乏味又容易出错,constexpr一定程度上简化了元编程难度。

这章提供了constexpr元编程库,它将模板元编程数据结构TypeList以值的形式表达,并利用管道操作符组合对值进行编译时计算,然后使用它重构前一章的例子。最后以编译时操作、生成字符串为例结束这章。

Ranges 标准库

ranges 正式成为 C++20 标准库中的一部分,它的出现代表了标准库自 98 年以来最大的转变。这是重新实现 C++标准库的第一步,在这个标准库中,除了迭代器之外,接口还按照 ranges 指定。

除了提供高质量的 ranges 标准库之外,还从语言层面上使用 concept 提供支持以验证机制的完备性。

range 是对一系列数据的抽象,它即可以是一个有界容器,也可以是一个无穷列表,只要有头有尾。一旦我们有了这种抽象,那么我们可以进一步构造 range 的适配器,它们能够被管道操作符进行组合,以便对数据进行灵活、优雅与有趣地处理,而这些处理是延迟计算的。

它使你的程序通过消除循环来避免大量的状态操作,程序涉及的状态越少,代码的正确性越容易推理,因此 bug 也越少。最后以矩阵乘法、日历库为例结束这章。

无栈协程

协程提供了一种协作式的多任务模型,在并发计算领域,它通常要比多线程或多进程要高效地多。C++20 中的协程仅仅提供了机制,而没有标准库的支持,这将可能留给下一个标准 C++23 中提供。

这章深入探讨了协程机制所要求的接口,以及相关概念。最后通过三个例子结束这章:生成器是协程的经典应用,它是理解协程机制的基础;利用协程机制非侵入式地扩展标准库async接口;利用它封装异常处理流程。

协程机制的理解难度非常大,笔者在此章耗时最长,最初我在 2020 年开始学习协程机制,编写此章的时候仍花了 3 个月时间,期间通过反反复复阅读现有资料,以及编写协程库加深理解。所以读者可能需要花点功夫才能熟练掌握它。

模块

C++20 提供了模块特性,一个库与软件组件化的现代解决方案,它能够像头文件一样在源代码间共享符号,与头文件不同的地方在于,模块并不会泄露宏的定义以及一些私有实现细节。

模块容易被组合,它们能够精确地控制哪些接口需要暴露给导入它们的源文件,并且不会因为导入顺序、宏定义等改变一个模块的语义。

遗憾的是目前主流编译器中对模块的支持都不完备,因此这章对 C++模块的介绍比较保守,没有深入其中的细节,因为它们暂时还无法被验证。

综合运用

本书最后一章将分享笔者的两个的工程项目,它们分别为配置文件反序列化框架与 AsyncIO 协程库,以便对全书的知识进行融会贯通,它们都重度依赖现代 C++提供的特性,尤其是在协程库中。

传统的使用配置文件的方式是每添加一个配置文件都需要程序员去手写解析配置文件到数据结构中的代码,这个过程极其乏味,且容易出错,通过框架为数据结构定义 Schema ,元编程将能够生成读取的接口,避免了这个繁杂的过程。这部分讨论了静态反射话题,目前 C++标准仍没有提供静态反射机制,它依赖宏做代码片段生成。

AsyncIO 协程库是笔者仿照 Python 的标准协程库并使用 C++协程机制实现,它以单线程的事件驱动循环为根基,并在这基础之上封装协程表现层。在最后给出了协程的性能表现。

推荐序(吴咏炜)

我跟罗能认识已经有一年多了。初次相识是在我的一次关于嵌入式系统的 C++ 重构演讲之后,他——和一些其他人一起——就在会后加了我的联系方式。不过,跟其他大部分人不同,我们之间一直确实在"联系",而且是很频繁的双向联系。原因无他,我们都是真正的 C++ 和编程爱好者。他会把他的一些文章和代码发给我看,而我,在写了一些有( hěn )意( dé)思( yì)的代码和文章时,也会发给他交流。虽然他比我年轻了差不多一辈,但我在他面前并没有多少倚老卖老的资格,反而是有点身为前浪的压力。事实上,我有些实际的工作项目和演讲,已经借鉴了他的想法和代码。

有没有注意到我说的是"C++ 和编程爱好者"?罗能并不只会 C++,他对 Rust 和函数式编程语言(多半还有其他我不知道的语言)都有所涉猎。显然,C++ 仍是他看来最 有用(在没有更好的形容词的情况下,姑且这么说吧)的语言。所以,这本以 C++ 为主题的书,也就成了他的第一本关于编程的书籍。

C++20 是 C++ 在 C++11 之后最大的一次语言变革,里面引入了大量具有革命性的新特性。罗能从一个独特的视角,讲解了其中最重要的四大特性。虽然 C++20 的新特性不止这四种,但编程并不是只讲特性:罗能的独特着眼点在于外面讨论较少的一些高级编程技巧,尤其是模板元编程方面。这比起干巴巴地讨论语言特性,明显要有用得多——毕竟,参考资料我们从 cppreference.com 之类的网站上自己就能找到,而高手的心得并不常有。因此,他的内容编排,也不是基于语言特性,而更多是基于讲解高级编程的逻辑顺序。在讲解了所有这些高级编程的基本概念之后(包括 C++20 的新特性),他通过一章综合运用,把知识点串到一起,展示了非常有意思的实际项目应用。——学语言的关键(不管是编程语言,还是平时说的语言)在于应用,因此这样的讲解是能够真正展现现代 C++ 威力的。基于对高级编程及其应用的深入理解,他讲解相关的 C++ 特性,可谓得心应手、游刃有余。

罗能的书稿我完整地看了,也做了些小小的贡献。限于时间,我没有深入其中所有的细节,但我也已经从中感受到了他对 C++ 和编程的许多独特见解。不夸张地说,我在阅读中也学到了很多新东西。因此,我相信这本书对于 C++ 相关的编程爱好者,一定是有所裨益的——即使对编程老手都是如此。

是为序。

本书评论

吴咏炜,Boolan 首席咨询师,国内知名 C++ 专家

C++20 是 C++ 在 C++11 之后最大的一次语言变革,里面引入了大量具有革命性的新特性。罗能从一个独特的视角,讲解了其中最重要的四大特性。虽然 C++20 的新特性不止这四种,但编程并不是只讲特性:罗能的独特着眼点在于外面讨论较少的一些高级编程技巧,尤其是模板元编程方面。这比起干巴巴地讨论语言特性,明显要有用得多——毕竟,参考资料我们从 cppreference.com 之类的网站上自己就能找到,而高手的心得并不常有。

袁英杰,软件架构咨询师,C++ 资深专家

C++发展到 2x ,在继续坚守 C++的核⼼原则——你⽆需为你不需要的东⻄付出代价——的同时,已经演化为⼀⻔⾮常现代的语⾔,在保证运⾏时效率的同时,让你拥有更多的抽象⼿段,更加优雅地解决很多问题。为了更好地运⽤这⻔语⾔,你需要深刻理解每⼀个新特性的⽬的、机制和⽤法。罗能的这本《 C++20⾼级编程》通过详尽⽽深⼊的解释,丰富的例⼦,会⼤⼤加速掌握这⻔令⼈兴奋的语⾔的进程。

许胜军,华为 Camera 领域资深软件专家

这是一本能让人全面了解 C++20 特性以及高级模板编程的一本书。书中不仅对 C++语言新特性有着详细地描述,更难得的是对其这些特性的设计目的和方法也进行了描述。让人不再限于"会使用",知其然且知其所以然。虽然这些语言特性,我所在的项目并没有全部都用过,作为同事,也曾和作者本人进行过交流,其关于这些特性的理解能引发我们对 C++编程更深入地思考。总之这是一本独特的精神粮食,值得推荐!

孙孟越,清华大学,罡兴投资量化开发总监

这本书是少有的中文 C++20 精品读物,作者从实践的角度出发,带领大家学习了高级模板编程、ranges 库、协程、modules 等 C++20 的重要内容。作者把自己的经验掰开揉碎了介绍给大家,这是每个 C++程序员提升自我水平的大好机会。

为何编写本书?

我从大学起便有写博客的习惯,这个习惯更多是梳理对技术知识的总结,倘若要寻找人生中的价值,那么记录我曾经存在过这个世界无疑是令人心动的。

我从 14 岁开始接触编程,像我这个年龄接触编程的大多数是起因于学校的 NOI 竞赛,通过他可以保送某些名校(直到大学才知道有这么一条途径),而我却是因为一台 Linux 学习机提供了编程的窗口,从此便一发不可收拾,差点连高中都没考上。

我接触的前两门语言分别是 Bash 和 C 语言,时常用它们写些( Vim 编辑器便是那时学会的,直到工作仍然是我唯一的选择)小工具玩,当我写的越多,我发现 C 语言越简陋,尤其是语言机制上的不足带来的抽象手段有限,程序员不得不使用大量的宏技巧来展开代码避免性能上的开销,以及到处都是细节的面向过程思想。

高中时我开始学习 C++语言,便被它所吸引,只可惜学习机那羸弱的性能编译一个简单的 hello world 程序都需要半分钟,我只好沉浸在C++ Primer Plus的世界里,尤其是面向对象的多态、虚函数机制非常迷人。

C++是自由的,它允许你在遵守规则的情况下做任何事,包括 shoot yourself in the foot ,这就对 C++程序员要求相当高。语言是用来解决问题的工具,因而 C++演进过程中的大多特性都是基于问题与痛点出发的,如果程序员能理解这些特性背后的缘由,在遇到问题时便能使用合适的手段解决之。

直到大学时我才拥有第一台电脑,那时候便尝试写博客,鉴于国内主流博客平台需要审核文章,从此便选择了自建博客,然后同步到知乎平台。直到大学毕业工作的时候,写的多了便会有出版社编辑联系,经过某些原因,我在人民邮电出版社和机械工业出版社之间选择了后者。

在写博客的经历中,我也会时常看看其他大牛的博客、论文、CppCon 技术分享,主要和 C++相关,喜欢 C++并关注 C++的也主要是国外程序员,主要会看如下作者的:

  • Jeff Preshing ,加拿大程序员,主要涉及一些并发编程、语言特性相关话题
  • Bartosz Milewski ,波兰程序员,理论物理学家,参与 D 语言设计与实现,主要涉及并发编程、模板元编程、范畴论相关话题
  • Andrzej ,主要涉及 C++编程实践方面的知识,以及一些关于 C++设计和当前发展的理论背景,尤其是概念约束方面
  • Herb Sutter ,C++标准委员会成员,介绍 C++的现代化进程、最佳实践
  • Eric Niebler ,C++爱好者,ranges 标准库作者,主要涉及 C++技巧、函数式编程、协程、结构化并发等话题
  • Lewis Baker ,主要介绍无栈协程理论、特性方面
  • Bjarne Stroustrup ,C++之父,很多论文值得已读,即便他对 C++有很强烈想法,也未必能纳入标准,个人觉得他的代码风格很奇怪
  • 吴咏炜,最初认识他是在他博客上看到关于 C++实现 Y combinator 的代码,非常有意思
  • 袁英杰,我的启蒙恩师,对 C++以及软件设计理解、洞察力非常深,尤其是关于 C++技术层面的理解
  • 还有很多优秀的程序员,不再一一枚举,待续

在这期间正好编辑找上门来,问我能不能出一本 C++高级编程相关的书,以弥补国内出版社这方面话题的不足,国外同类书有Modern c++ design, C++ Templates: The Complete Guide等,要么年代比较久远,要么涉及语言细节过深,一下子便激发了我的写作热情:能否用更现代的 C++特性(尤其是 C++20 )去解决那些问题?而且当时国内也没有 C++20 相关的书籍。

从 2021 年 2 月起开始,每天下班后写作,到 2022 年 2 月交稿,正好历时一年,交由出版社走流程花了 4 个月,最近已经开始预售了。有趣的是,正好和另一本国外引进的《 C++20 高级编程》(原书名*Professional C++*)同名了,碰巧的是,我们都请到了吴咏炜作序。

写作部分,我很讨厌排版(尤其是 Word ),更倾向于使用 Markdown/AsciiDoc 等标记语言排版,它们从设计上就让作者更关注内容而不是排版,但考虑 Markdown 等工具不能很好地给出当前写了多少页,加上排版效果比不上 LaTeX ,因此整个过程中我选择了 LaTeX 进行写作。这就导致了最后交稿,出版社不支持 LaTeX 排版,而是从我出的 pdf 文件中重排,最终或多或少有细微影响如字体上的差异。

如果期待写书就能够获得很多收入是不现实的,目前技术书的销量相当确定,如果能达到三千本左右,便是畅销书了,而一本定价的 8%即作为作者的收入,扣掉税后剩下来的就更少了,而投入的时间却相当大。因此如果你计划出书,那一定要考虑收入之外的因素。

本书勘误

此部分留给本书勘误,由于笔者的水平有限,在写作过程中难免留有错误,恳请读者批评指正。

Seafile 同步至 COS 时只能同步目录。

Posted: 01 Jul 2022 06:24 AM PDT

Centos 7 挂载 腾讯云 COS ,使用图形化客户端同步至 COS 目录〔即下载服务器上的文件至 COS 而非使用 COS 作为存储后端〕,只能同步目录,不能同步文件。具体表现为:同时同步多个目录及文件则 COS 中只有空白目录,没有文件;单独同步一个文件,则可以同步文件。

请求各位指点。谢谢!

《十年死磕,从一线工程师到 CEO》

Posted: 01 Jul 2022 06:04 AM PDT

《十年死磕,从一线工程师到 CEO,我的一些切身经历和思考,分享给大家,欢迎留言交流。

"在 2016 年初,我们已经看到了云原生架构所带来的效率提升方面的潜力和趋势。当时面临两个决策,一是 K8s 和 mesos 的选型之争,二是开着飞机换引擎,节奏、风险如何把握。

事后来看,当时和团队一起,做出了正确的决策,我们从 2016 年初,开始往云原生架构转型,重度采用 K8s 和容器化技术栈,同时在架构转型的过程中,传统的物理机架构和云原生架构,持续的并存和交织,我们将稳定性保障、业务改造升级、弹性云计算平台建设三者做到了顺利的融合。"

"大的互联网企业,随着内部业务增速的逐步企稳和内部基础平台的逐步完善,技术团队,特别是 infra 团队,一般会面临能力溢出、资源溢出、以及团队长期健康发展的问题。解法无外乎两种:

1 、技术团队主动求变,用技术变现,让技术本身变成一个"业务",成为公司的第 n 条曲线。infra 层面最大的商业模式和机会就是云计算,但是商场如战场,需要面对激烈的市场竞争,抓住合适的时间窗口,考验团队认知转型升级的速度,以及经营意识和能力。

2 、技术团队控制规模和投入,从内部效率上要收益,但是内部效率挖掘的天花板是相对有限的,最终会导致团队的长期发展呈现螺旋状坍缩。"

"两个体会分享给大家:

1 、职业规划要趁早,普通人要成功,捷径越来越少,靠的就是尽早认准一个领域,持续积累,最终才能厚积薄发。

2 、技术要以创造用户价值为导向,工程师也要尽早找到属于你的用户,把自己的工作当做一个产品去经营。"

有没有什么比较好的 mysql to oracle 的实时同步工具

Posted: 01 Jul 2022 05:57 AM PDT

生产环境能用的,不用做加工,原封不动传就可以了。 如果不能实时,能够以定时任务的方式也是可以的

unraid 7 折了

Posted: 01 Jul 2022 05:55 AM PDT

广电 192 手机号段发布了,你的业务代码里适配了吗?

Posted: 01 Jul 2022 05:54 AM PDT

云计算(运维)的认证,选择哪家好

Posted: 01 Jul 2022 05:04 AM PDT

爱好,也是下一步想找工作换个行业,有的要求最好有运维认证文件。现在考哪家的认证好?只粗略看到华为、腾讯云

请教大家几个 Go 写业务的工程实践的上的问题

Posted: 01 Jul 2022 04:58 AM PDT

自己是 Java 后台开发,尝试用 Go 写了个小项目,有几个工程实践上的问题想咨询下各位都是怎么处理的?

  1. 如何统一各组件的 log 输出?例如我用 echo 、xorm 、grpc 去构建业务,这三个库的日志格式各自不同,Go 生态中有没有类似 slf4j 的东西能让三者用同一种日志规范输出?
  2. 如何在 log 中附上当前每一个 http 请求的 requestId 呢?不能是靠 Context 层层往下传吧? Java 中是依赖于日志框架 MDC 实现的,相关 requestId 会绑定在线程上,线程模型可能会有性能问题,但对于开发者写代码来说还是挺友好的。
  3. 如何妥善的处理异常?业务代码中的常见操作就是读数据、执行业务逻辑、保存新数据,这个过程中任何一步有异常我都可以认为是业务处理异常,Java 中只需要把这三步全部 try catch 起来就行了(只是个例子,实际处理粒度不会这么大),但 Go 中只能每一步都冒泡,然后写很多次 if err != nil 么?

抛开工程上的这些问题,Go 还是蛮好的,找回了刚上学时候写 C 的快感,真就是单纯地在一行一行写代码,感觉每一行都能映射到汇编上,掌控性很强。感觉更适合强规范的基础设施开发和工具开发。

接下来想去看看 Rust ,不知道会不会遇到类似的问题。毕竟语言再好,最终还是要用来干活儿的。对于业务开发,CRUD boy 来说,写代码和查问题这种场景搞不定,语言再好也是麻烦。

请教一下大佬.我们这个情况应该如何设计

Posted: 01 Jul 2022 04:50 AM PDT

我们做的项目,会有 N 个客户. 然后最基本的功能都是一样的,然后再根据客户的需求去改 目前的做法是从最基本的那一份源码 X 从 X copy 一份成立 A 项目 从 X copy 一份成立 B 项目 ... 这个有一个问题就是,出现一个通用 bug 每个项目都要去改 所以老板希望可以改 1 处大家就能修复 不知道这种情况 应该如何设计调整呢?

谷歌浏览器控制台出现了奇怪的东西,有大佬知道怎么解决吗

Posted: 01 Jul 2022 04:45 AM PDT

image-20220701165051414

vscode 有没有像 sublime text 一样能够自动缩进以及格式化文件内容的功能或插件啊?

Posted: 01 Jul 2022 04:14 AM PDT

因为公司不让使用 sublime text, 原来一直使用 sublime text 来临时格式化文件非常好用(都不需要保存文件, 直接 new 一个就能格式化), 最近切到 vscode, 没有找到这个功能, 连自动缩进都没有, 请问下大家, 有没有什么设置或者是插件可以实现这个功能的吗?

django 里面的原生的 sql 查询,会一直占用数据库连接吗

Posted: 01 Jul 2022 03:27 AM PDT

最近数据库连接一直报警。排查了一下是有一个 django 项目占用大量的数据库连接。按照用户量不太可能,有一个问题是这个 django 项目都是用原生 SQL 查询没有用 ORM 。

from django.db import connection  with connection.cursor() as cursor:      cursor.execute(sql, params=params_dict)     result = dictfetchall(cursor)  return result 

这种写法有问题吗?

scipy 非线性优化中 bounds 参数定义问题

Posted: 01 Jul 2022 03:12 AM PDT

scipy 非线性优化中 bounds 参数定义问题

例:optimize.linprog(c, A_ub=Aub, b_ub=bup, bounds=bounds)

bounds 参数 只能设置( min,max )吗?能否给定有限集合[0,10,20,30 ...]?

vimEasymotion 移动跳转,触发语法检查了怎么办呐?

Posted: 01 Jul 2022 02:22 AM PDT

如图,当我在 vscode 中按下 easymotion 任意快捷键时(如 leader w ),他的渲染好像是直接改了我的代码啊,然后直接出发编译器语法检查,然后报错。。 目前在 vscode 中用的是 neovim 插件,之前用 vim 插件时就没这个问题,这应该怎么解决?各位有遇到吗?

任务栏图标为啥在 IE 这里,把我逗乐了

Posted: 01 Jul 2022 02:19 AM PDT

%AppData%\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar

IE 都已经不在了。

kvm 虚拟机作为开发机,通过 spice 连接卡顿

Posted: 01 Jul 2022 01:44 AM PDT

之前看见过 v 友评论说,用这种方案很流畅(找不到出处了)。

我的配置

  • cpu 是 amd 5700g
  • 宿主机是 pve 7.2
  • 虚拟机是 arch linux+KDE Plasma
  • spice 的客户端是 win10, 4k 60hz 的显示器,spice 的两端在同一个局域网下

然而卡到无法接受,我之前用 rdp 连过同一局域网下的 win10 ,感觉很流畅,这是什么原因呢?

  • 虚拟化的 gpu 性能不够?
  • spice 协议的性能不够?
  • kde 太重了?

附上虚拟机的配置文件

$ ls /etc/pve/nodes/pve/qemu-server/100.conf  /etc/pve/nodes/pve/qemu-server/100.conf root@pve:~# cat /etc/pve/nodes/pve/qemu-server/100.conf  bios: ovmf boot: order=scsi0;net0 cores: 12 efidisk0: local-lvm:vm-100-disk-0,efitype=4m,size=4M memory: 20480 meta: creation-qemu=6.2.0,ctime=1656175435 name: work-arch net0: virtio=4A:01:FC:E3:83:08,bridge=vmbr0,firewall=1 numa: 0 ostype: l26 parent: init scsi0: local-lvm:vm-100-disk-1,size=320G scsihw: virtio-scsi-pci smbios1: uuid=e0b79fe7-9192-4b62-8ab4-c933bbe19dfa sockets: 1 vga: qxl,memory=48 vmgenid: affc6913-ad14-4001-bdb0-7575a5fb4bb7  [init] bios: ovmf boot: order=scsi0;net0 cores: 12 efidisk0: local-lvm:vm-100-disk-0,efitype=4m,size=4M memory: 20480 meta: creation-qemu=6.2.0,ctime=1656175435 name: work-arch net0: virtio=4A:01:FC:E3:83:08,bridge=vmbr0,firewall=1 numa: 0 ostype: l26 runningcpu: kvm64,enforce,+kvm_pv_eoi,+kvm_pv_unhalt,+lahf_lm,+sep runningmachine: pc-i440fx-6.2+pve0 scsi0: local-lvm:vm-100-disk-1,size=320G scsihw: virtio-scsi-pci smbios1: uuid=e0b79fe7-9192-4b62-8ab4-c933bbe19dfa snaptime: 1656605489 sockets: 1 vga: qxl,memory=48 vmgenid: affc6913-ad14-4001-bdb0-7575a5fb4bb7 vmstate: local-lvm:vm-100-state-init 

Redis 里 List 是耗内存最小的数据类型吗?

Posted: 01 Jul 2022 01:16 AM PDT

用官网的在线工具看了下同样的 kv 在不同数据类型中的内存使用,虽然差别细微,但是 List 类型耗内存最少 pic

然后看了下脚本数据类型及其底层数据结构的关系:

  • String: <=39byte 用 embstr 编码,>39byte 用 raw 编码并用动态字符串 SDS
  • Hash:元素长度<64byte&&元素数量<512 个,用 ziplist 编码,否则用 hashtable
  • List:元素长度<64byte&&元素数量<512 个,用 ziplist 编码,否则用 linkedlist 编码
  • Set:元素数量<512 个,用 intset 编码,否则用 hashtable
  • ZSet:元素长度<64byte&&元素数量<128 个,用 ziplist 编码,否则用 skiplist 编码

是双向链表省空间吗?小白不懂

neovim 中文群

Posted: 01 Jul 2022 01:15 AM PDT

neovim is the future of vim ,所以我建了一个 nvim 中文群,以 nvim 作为主力编辑器以及希望入坑 nvim 的用户,欢迎加入!



地址: https://t.me/nvim_zh

请教有没有这样一款管控 iPad 的软件?

Posted: 30 Jun 2022 10:21 PM PDT

请教有没有这样一款管控 iPad 的软件,在 iPad 上安装之后,这台 iPad 就处于受控状态,通过在 iPhone 或者其他手机上安装一个控制端,就可以控制 iPad 实现如下功能:

  1. 设定哪些 app 可以启动,以及可以运行的时长,最好是连 app store 以及相册这种系统自带的 app 都能控制到,未经允许,app store 以及相册也不能打开。因为相册也可以通过隔空投送来相互传输电影、看电影。这种控制是远程且实时的(方便让娃在完成作业后可以允许使用某些程序)。如果不能"真的"实现控制软件的启动,间接通过隐藏软件图标的方式实现也可以接受。

  2. 可以开启或者关闭 app store 的软件下载安装功能,如果能更进一步实现只能下载安装指定名单内的软件,并且还能实时调整这个名单就更好了。

  3. 可以实时开启或者关闭"隔空投送"功能。

看到这里,相信大家都能明白使用场景了,就是在大人不在家的情况下,娃能合理地使用 iPad ,现在让娃完全脱离 iPad 是不可能的,因为学校都开始在课堂上用 iPad 教学了。让他自动自觉合理使用 iPad 也不太可能(如果能有这么自觉,清华北大那都不算事),只能通过软件方式来实现更精准有效的管控。

如果目前没有现成的这种软件,能否大致介绍一下实现这种程度的管控所需要的技术栈?

adguardhome 和 smartdns 分流

Posted: 30 Jun 2022 10:13 PM PDT

adguardhome 自带分流,这是我整的规则
https://github.com/rxvb/adguardhome_upstream_dns
国内域名使用 tls://120.53.53.53 查询,其他的会用境外服务器查询。

smartdns 也有分流功能,我也整了 https://github.com/rxvb/smartdns_rules

两个都用了 Loyalsoldier/v2ray-rules-dat

nodejs mongodb

Posted: 30 Jun 2022 10:02 PM PDT

nodejs 连接 mongoDB 查询数据总返回[]

nodejs
------
app.post('/GetMail', function (req, res) {
Models.MAIL.find((err, items) => {
console.log(items)
})
})

db.js
-----
const mongoose = require('mongoose')
mongoose.connect('mongodb://localhost:27017/abc', { useNewUrlParser: true }, (err, db) => {
console.log(db);
if (err) {
console.log('********** [数据库连接失败] **********')
} else {
console.log('********** [数据库连接成功] **********')
}
})
const mail = new mongoose.Schema({
code: Number,
},
{
collection: 'mail'
})
const Models = {
MAIL: mongoose.model('mail', mail),
}
module.exports = Models

mongoDB
-----
数据库名字为 abc
下面有 mail => 20220602
想指定查询'20220602'表数据 总返回空呢

深夜提问 Java 如何判断是否为正确域名格式

Posted: 30 Jun 2022 09:15 PM PDT

如题,各位大佬,遇到个问题,套了许多正则也不能判断一个域名是否为正确的格式,或许正则不是最好的方式? 有没有懂的老哥指导一番🌚🌚

问一个终端 adb root 问题

Posted: 30 Jun 2022 08:50 PM PDT

公司有一个需要测试的 android 设备,限制了来自 adb 外部访问,想测试自动安装 app 之类的需要获得 root 权限。 交互步骤是 adb shell su 123456 回车 exit exit adb root

怎么把上面这个做成一个自动化脚本要求不需要手动键入密码的过程,尝试了一下子连续组合好像不行,不知道做到进入带参执行 su ,不太熟悉相关指令用法,有大佬知道解决方法或思路吗。

最近终于有点空了,将 Magician 发布了一个新版本

Posted: 30 Jun 2022 08:02 PM PDT

Magician 大家可能比较陌生,在介绍本次更新前 先简单介绍一下吧:

Magician 是一套 web 开发的工具集,开发者可以自由选择自己想用的工具,可以选择只用一个小型的 http 服务包开发一个微型服务,也可以搭配 MVC 来实现一个常规的 web 服务,也可以只选择 JDBC 框架 对数据库进行操作,也可以全部一起用,实现一个完整的 web 服务,同时我们也会提供各种小型组件库,来方便开发者。

目前已经发布了三个包,分别是 Magician ,Magician-Web ,Magician-JDBC ,他们分别对应,小型 http 服务器,MVC 框架,数据库操作框架。

本次更新的部分在于第一个包 - Magician (Magician 既是这一套项目的名称,也是核心组件的名称):

Magician 是一个基于 Netty 的小型 HTTP 服务包,可以很方便的启动一个 HTTP 服务,支持 WebSocket ,采用注解来配置 Handler 。

如果你想用 netty 开发一个 http 服务,但发现它很麻烦,那么 Magician 可能会帮到你。

本次更新的点

  • 支持自定义配置
  • 支持监听多端口
  • 同一个项目中,可以多地使用

自定义配置

以前,我们启动一个 Magician 服务,只能用默认的配置,现在有这么几个配置项支持自定义了

MagicianConfig magicianConfig = new MagicianConfig(); magicianConfig.setNumberOfPorts(3); // 允许同时监听的端口数量,默认 1 个 magicianConfig.setBossThreads(1); // netty 的 boss 线程数量 默认 1 个 magicianConfig.setWorkThreads(3); // netty 的 work 线程数量 默认 3 个 magicianConfig.setNettyLogLevel(LogLevel.DEBUG); // netty 的日志打印级别 magicianConfig.setMaxInitialLineLength(4096); // http 解码器的构造参数 1 ,默认 4096 跟 netty 一样 magicianConfig.setMaxHeaderSize(8192); // http 解码器的构造参数 2 ,默认 8192 跟 netty 一样 magicianConfig.setMaxChunkSize(8192); // http 解码器的构造参数 3 ,默认 8192 跟 netty 一样 

所有配置项都有默认值,所以在使用的时候 可以只选择自己需要更改的配置项进行设置,设置好了以后需要添加到 HttpServer 实例中

Magician.createHttp()         .scan("com.test")// 扫描范围(包名)         .setConfig(magicianConfig) // 添加配置         .bind(8080); 

监听多端口

很简单,只需要调用 bind 方法多次即可

HttpServer httpServer = Magician.createHttp()         .scan("com.test")// 扫描范围(包名)         .setConfig(magicianConfig); // 添加配置  httpServer.bind(8080); httpServer.bind(8081);  httpServer.bind(8082);  

同项目中,多地使用

有时候可能会遇到这种需求,同一个项目中,有些资源是对内的,有些资源是对外的,我们想把这两部分资源隔离开来,这个时候可能就需要启动两个服务了。 在本次升级的时候,为了实现监听多端口,bind 已经变成异步的方法了,在调用 bind 以后,不会阻塞,而是可以继续往下执行,所以这个需求得到了完美的解决, 有两个实现方案。

  1. 监听两个端口,把对外和对内分开

  2. 直接启动两个服务,把端口,配置,线程全都分开

第一种方法,不用多说,相信大家都知道怎么做了,咱们重点说说第二种方法,跟监听多端口差不多的思路,只不过变成了启动两个服务,比如:

启动一个对外服务

// 将 8080 端口做为对外的端口,并且 scan 只扫描对外的资源(接口,handler 等)  HttpServer httpServer = Magician.createHttp()         .scan("com.test")// 只扫描对外的资源         .setConfig(magicianConfig); // 添加配置  httpServer.bind(8080); 

启动一个对内服务

// 将 8081 端口做为对内的端口,并且 scan 只扫描对内的资源(接口,handler 等)  HttpServer httpServer = Magician.createHttp()         .scan("com.test")// 只扫描对内的资源         .setConfig(magicianConfig); // 添加配置  httpServer.bind(8081); 

想了解更多,可以访问官网

https://magician-io.com

dagger.js 使用示例 [7] three.js

Posted: 30 Jun 2022 07:46 PM PDT

今天分享一个有趣一点的dagger.js示例:

与 three.js 结合使用 demo

snapshot

更多示例请点击查看

欢迎大家体验试用 dagger.js ,提出宝贵意见和建议。您的支持和帮助是对我莫大的鼓励!!

这算不算是静态类型系统的缺憾

Posted: 30 Jun 2022 07:09 PM PDT

以这段 typescript 代码为例,f 期待一个类型为 10 的参数,x 等于 10 ,但是因为 x 的类型为 number ,所以不匹配

edge 在 mac 上的小问题咨询

Posted: 30 Jun 2022 06:09 PM PDT

最近尝试由 chorme 转到 edge ,但是在双指滑动对网页进行前翻或者后翻的时候,总是出现一个箭头,而这个箭头要反应个一会才会加载之前的网页就很难受,总感觉卡顿,有什么办法能去掉这个箭头吗?

No comments:

Post a Comment