influence.jpg

影响力的武器

动物可能会因为看到某种颜色的羽毛而变得具有攻击性或听到某种叫声就对自己的天敌呵护有加。动物这种愚蠢可笑的机械反应在人类身上也有,当某一个触发特征出现时,我们会不假思索的做出相应的反应。之所以会这样,就是因为我们被难以观察到的影响力武器摆布了。

互惠

互惠原理认为,我们应该尽量以类似的方式报答他人为我们所做的一切。简单地说,就是对他人的某种行为,我们要以一种类似的行为去加以回报。如果人家施恩于你,你就应该以恩情报之,而不能不理不睬,更不能以怨报德。于是,我们身边这一最有效的影响力武器,就被某些人利用了。

承诺和一致

承诺和一致原理认为,一旦做出了一个选择或采取了某种立场,我们就会立刻碰到来自内心和外部的压力,迫使我们的言行与它保持一致。在这样的压力之下,我们会想方设法地以行动证明自己先前的决定是正确的。

社会认同

社会认同原理认为,在判断何为正确时,我们会根据别人的意见行事,尤其是当我们在特定情形下判断某一行为是否正确时。如果看到别人在某种场合做某件事,我们就会断定这样做是有道理的。

喜好

我们大多数人总是更容易答应自己认识和喜爱的人所提出的要求,对于这一点,恐怕不会有人感到吃惊。令人吃惊的是,有些我们完全不认识的人却想出了上百种方法利用这条简单的原理,让我们顺从他们的要求。

权威

权威所具有的强大力量会影响我们的行为,即使是具有独立思考能力的成年人,也会为了服从权威的命令做出一些完全丧失理智的事情来。

稀缺

“机会越少见,价值似乎就越高“的稀缺原理会对我们行为的方方面面造成影响,对失去某种东西的恐惧似乎比对获得同一物品的渴望,更能激发人们的行动力。

即时影响力

正常情况下,促使我们做出顺从决策的几个最常用的信息,都可以引导我们做出正确的决策,这就是为什么我们在决策时频繁、机械地使用互惠、承诺和一致、社会认同、喜好、权威以及稀缺原理的原因。每个原理本身都能够极为可靠地提示我们,什么时候说“是”比说“不”更加有利。但现实中,大量的、极易伪造的信息被人利用,他们借此引诱我们做出机械的反应并从中获利,我们不得不防。

思源宋体出现了以后一直想用到自己博客上面,做法一般是用工具把现成的字体给子集化(subsetting),有印象的是 Fontmin,然后又找到一个 font-carrier 。

这些字体子集化的工具都是用 node.js 写的。但是对于思源字体的 otf 支持很差劲,fontmin 根本没有支持,font-carrier 据说有支持,但是根本跑不通。两个库依赖的旧版本 OpenType.js 不能正确处理思源字体(新版本修复了)。

搞了半天没成功的我在 GitHub 搜,搜到了 fonttools/fonttools ,Python 写的,看起来很靠谱的样子。有各种字体工具,包括一个字体子集化的工具,运行成功以后就是上面的图。
安装

pip3 install fonttools

基本使用

pyftsubset <字体文件> --text=‘abcde’ --output-file=<输出>

实际上 --help 以后选项非常非常多,非常健壮和实用。

比如说可以用 glyphname、文本文件、unicode 等指定字形,还有压缩、hinting、features…而这只是这个工具本身附带的一个小工具而已。

搜了一下中文网络对这个工具竟然知之甚少,反而造了那么多个轮子,本文用来指路。

这不光前端,个人应用或者游戏想要嵌入字体的话也很好用。

pyftsubset HanziPenSC-W3.ttf --text='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' --output-file=HanziPenSC-W3-2.ttf

您可以将外置驱动器或备用宗卷用作安装 Mac 操作系统的启动磁盘。

以下高级步骤主要适用于系统管理员以及熟悉命令行的其他人员。升级 macOS重新安装 macOS 不需要可引导安装器,但如果您要在多台电脑上安装 macOS,而又不想每次都下载安装器,这时可引导安装器就会很有用。

创建可引导安装器需要满足的条件

  • USB 闪存驱动器或其他备用宗卷(格式化为 Mac OS 扩展格式),至少有 14 GB 可用储存空间
  • 已下载 macOS Big Sur、Catalina、Mojave、High Sierra 或 El Capitan 的安装器

下载 macOS

在"终端"中使用"createinstallmedia"命令

  1. 连接要用于保存可引导安装器的 USB 闪存驱动器或其他宗卷。
  2. 打开"应用程序"文件夹内"实用工具"文件夹中的"终端"。
  3. 在"终端"中键入或粘贴以下命令之一。这些命令假设安装器位于您的"应用程序"文件夹中,并且"MyVolume"是您所使用的 USB 闪存驱动器或其他宗卷的名称。如果不是这个名称,请将这些命令中的 MyVolume 替换为您的宗卷名称。

Big Sur*:


sudo /Applications/Install\ macOS\ Big\ Sur.app/Contents/Resources/createinstallmedia --volume /Volumes/MyVolume 

Catalina*:


sudo /Applications/Install\ macOS\ Catalina.app/Contents/Resources/createinstallmedia --volume /Volumes/MyVolume 

Mojave*:


sudo /Applications/Install\ macOS\ Mojave.app/Contents/Resources/createinstallmedia --volume /Volumes/MyVolume 

High Sierra*:


sudo /Applications/Install\ macOS\ High\ Sierra.app/Contents/Resources/createinstallmedia --volume /Volumes/MyVolume 

El Capitan:


sudo /Applications/Install\ OS\ X\ El\ Capitan.app/Contents/Resources/createinstallmedia --volume /Volumes/MyVolume --applicationpath /Applications/Install\ OS\ X\ El\ Capitan.app 

* 如果您的 Mac 运行的是 macOS Sierra 或更低版本,请使用 --applicationpath 参数和安装器路径,具体方法与在适用于 El Capitan 的命令中完成这个操作的方法类似。

键入命令后:

  1. 按下 Return 键以输入这个命令。
  2. 出现提示时,请键入您的管理员密码,然后再次按下 Return 键。在您键入密码时,"终端"不会显示任何字符。
  3. 出现提示时,请键入 Y 以确认您要抹掉宗卷,然后按下 Return 键。在抹掉宗卷的过程中,"终端"会显示进度。
  4. 宗卷被抹掉后,您可能会看到一条提醒,提示"终端"要访问可移除宗卷上的文件。点按"好"以允许继续拷贝。
  5. 当"终端"显示操作已完成时,相应宗卷将拥有与您下载的安装器相同的名称,例如"安装 macOS Big Sur"。您现在可以退出"终端"并弹出宗卷。

使用可引导安装器

确定您使用的是不是搭载 Apple 芯片的 Mac,然后按照相应的步骤操作:

Apple 芯片

  1. 将可引导安装器插入已连接到互联网且与您要安装的 macOS 版本兼容的 Mac。
  2. 将 Mac 开机并继续按住电源按钮,直到看到启动选项窗口,其中会显示可引导宗卷。
  3. 选择包含可引导安装器的宗卷,然后点按"继续"。
  4. macOS 安装器打开后,请按照屏幕上的说明操作。

Intel 处理器

  1. 将可引导安装器插入已连接到互联网且与您要安装的 macOS 版本兼容的 Mac。
  2. 将 Mac 开机或重新启动后,立即按住 Option (Alt) ⌥ 键。
  3. 当您看到显示可引导宗卷的黑屏时,松开 Option 键。
  4. 选择包含可引导安装器的宗卷。然后点按向上箭头或按下 Return 键。
    如果您无法从可引导安装器启动,请确保"启动安全性实用工具"中的"外部启动"设置已设为允许从外部介质启动。
  5. 根据提示选取您的语言。
  6. 从"实用工具"窗口中选择"安装 macOS"(或"安装 OS X"),然后点按"继续",并按照屏幕上的说明进行操作。

进一步了解

可引导安装器不会从互联网下载 macOS,但却需要互联网连接才能获取特定于 Mac 机型的固件和其他信息。

要了解 createinstallmedia 命令以及可与它搭配使用的参数,请确保 macOS 安装器位于您的"应用程序"文件夹中,然后在"终端"中输入相应的路径:


/Applications/Install\ macOS\ Big\ Sur.app/Contents/Resources/createinstallmedia 

/Applications/Install\ macOS\ Catalina.app/Contents/Resources/createinstallmedia 

/Applications/Install\ macOS\ Mojave.app/Contents/Resources/createinstallmedia 

/Applications/Install\ macOS\ High\ Sierra.app/Contents/Resources/createinstallmedia 

/Applications/Install\ OS\ X\ El\ Capitan.app/Contents/Resources/createinstallmedia 

发布日期: 2021 年 05 月 13 日

https://support.apple.com/zh-cn/HT201372

WPF和WinForm技术有什么区别?哪个更加有前景?

https://www.zhihu.com/question/36859063

wpf的底层是DirectX,意味着你的显示效果不仅可以更炫更酷,同时显卡(集显独显均可)提供的加速也不会拖累你的运行速度。

v2-d51859134e096e2ffa8bafede3d914c3_r.png

winform的底层是GDI/GDI+,除非你明确使用DX的接口,不然永远都是CPU在画图,效果没那么炫,而且无法显卡加速。

v2-f00831a14f767a26eb89e39da4e3e3c6_r.png

wpf的界面设计和逻辑设计可以分离,界面设计师可以利用blend自主设计好看的界面,而不是最终让程序员来实现那个复杂的动画或者设计。winform设计师最多拖一拖,而这往往不够用。

wpf对于数据逻辑、业务逻辑、显示逻辑进行了解耦和,可以让不同部门协同工作更舒服一些,winform多少有一些搅在一起。

目前做windows桌面应用程序,MFC、QT、C#哪个更好?

首先说Web,我们明确一点,当下的桌面软件项目,必须具备完整的Web能力(包括开发/部署/运行/测试等),直观的说就是你的软件中必须包含浏览器。尤其是企业软件,发展到后期,除了核心功能之外,必然附带大量的增删改查模块,这部分不用Web你会极其难受。有些人可能native用的挺熟练的,觉得不就是表格表单报表么?我用native一样堆出来——相信我,你在浪费生命。

Web必然入选,但是注意,Web入选不意味着electron入选。事实上如果不是互联网公司的项目,我不建议使用electron。一方面,传统公司不需要迭代那么快,他们前端力量也有限,出了问题解决不了;另一方面,哪怕是互联网项目,发展到后期,也不约而同地开始约束前端随意调用nodejs API的行为。

建议使用libcef提供Web能力,同时native封装有限的API供Web调用。这里我不推荐使用框架原生的webview,比如QtWebEngine,以及winform自带的WebBrowser组件,这些工具比较冷门,资料少,出了问题不好排查,而且浏览器内核版本也未必符合要求。

结论:libcef入选,electron淘汰,原生webview淘汰。

接下来考察C#和Qt,这两个技术各有支持者,不是非黑即白的关系。比如我看韦大的答案下面很多人在争论工控领域应该用Qt还是C#,其实国内工控领域的老大浙大中控,这两个技术都在使用。

我个人比较推荐Qt,极其强大,跨平台,可以用C++单一语言(调试成本低),还有一些很贴心的功能,比如基于qss的换肤。不要觉得换肤不重要,实际上做项目卖软件的公司经常遇到这样的需求,要么是甲方想用专有皮肤,要么是你接到的项目是OEM项目,中间商要求换肤。

但如果使用Qt,我不推荐使用Quick(Qml),太非主流,而且对比Web没什么优势。建议能用Web的模块就用Web,需要深度开发的模块使用QWidget配合OpenGL深度开发。

结论:Qt入选,但是Quick淘汰。

C#能有一席之地,主要是因为传统。有些领域长期以来就是使用C#开发,人才比较集中(C#人才确实比C++好招,而且便宜,也更不易跳槽),开发效率也确实高。如果没有跨平台诉求,也不是前瞻性很强的项目,可以考虑沿用C#(关于前瞻性,多说一句,新冷战都要来了,你确定你的项目不需要跨平台嘛)。

用了C#,还要选择是用winform还是用WPF,按理说这不该是个问题——无脑WPF就完事儿了,毕竟开发效率高,对于高分屏等新问题微软也会有相应的支持。但是什么问题只要涉及到“传统”,就说不清楚了,只能说如果是新产品,不考虑技术资产继承的话,建议WPF。

结论:WPF入选,winform你看着办。

综上,如果是我来作架构师,通常情况下我会选择Qt+libcef。兼顾强大功能与开发效率,同时Qt和Web前端都是前景光明的主流技术,社区力量强大,技术风险小。如果考虑到特定行业的技术积累(不光是你自己的积累,还有供应商等等)和人才招聘,可以考虑WPF+libcef。

作者:欲三更
链接:https://www.zhihu.com/question/402080800/answer/1308065143
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  1. r2 是比较早期的替代品,算是 request next 早期比较通用的产品,core 大约 3.17kb
  2. node-fetch 是仿造 fetch API 写的 NodeJS HTTP 客户端,如果你对 fetch 比较熟悉考虑这个,有点是一直在更新,启动堆栈差不多 20k 。大家比较熟就不多说了。
  3. axios 是浏览器与 NodeJS 兼容的,比较重,因为兼容了浏览器的代码。这部分代码在运行时也会进入堆栈,尽管不会执行,因为不管什么 module 都不能 tree shaking 编程式的分发的代码块。API 有些土里土气,属于简单易懂的状态型编程风格。
  4. bent 也是浏览器与 NodeJS 兼容的,但比较小巧 (意味着功能没有那么多)。API 只有一个函数,但是目前没有基线测试不知道性能如何。
  5. got 专业的 NodeJS HTTP 客户端。非常非常非常大。亮点之一就是支持 pagination 与一些编程式的 hook,社区中有非常非常非常多的示例教你如何使用它,毕竟用的人多。开发者也是知名的开源狂魔 sindresorhus (他维护了 1000+ 的开源仓库),算是比较值得信赖吧。
  6. superagent ,一个有意思的 HTTP 客户端库吧,用的链式 API 。也是兼容浏览器和 NodeJS 。优势是支持 HTTP2,具体可以看这个 PR。早期是你们熟知的 TJ 一个人在写,现在已经是组织在维护。(体积也很大)

总结一下,如果你喜欢小巧一些可以考虑 node-fetchbent,需要功能比较强大就是 gotsuperagent
另外给你们强烈推荐一个适用于微服务的 http-client: zeit-fetch,支持 DNS 缓存、重试和 keep-http-agent,如果你正在写微服务,可以试一试。

最后说一句题外话,现在 NodeJS 的 API 非常的友好,如果你只是一个简单的 request(特别是 get ) 不用库也就几行而已。

首先通过rev-list来找到仓库记录中的大文件:

git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5 | awk '{print$1}')"

然后通过 filter-branch 来重写这些大文件涉及到的所有提交(重写历史记录):

git filter-branch -f --prune-empty --index-filter 'git rm -rf --cached --ignore-unmatch your-file-name' --tag-name-filter cat -- --all

https://harttle.land/2016/03/22/purge-large-files-in-gitrepo.html

生产环境请考虑使用 bfg 等效率工具

Linux系统,在服务器端的大多数常用软件都有足够多的使用者,所以就足够稳定,由于它在服务器端市场占有率远高于微软,所以服务器端就是比微软稳定,很正常的事。在桌面端,市场占用率远低于微软,不稳定也是自然的。为什么Linux下命令行程序往往又好用又稳定?是因为用户喜欢装逼吗?不是,因为命令行程序是服务器端跟桌面端通用的,而服务器端程序经过了足够多用户的使用,经过了足够的反馈开发迭代,所以稳定。而图形界面只有桌面用户用,桌面占有率那么低,这些程序往往缺乏足够的测试人力也缺乏足够的开发维护人力,所以并不会非常稳定。那么,你要想体验Linux稳定,怎么办?答案就是只使用市场占有率高,用户量大,因而获得了充分测试的软件,这就稳定了。比方说只使用服务器端。或者桌面端只使用最常用的那些,例如终端仿真器,浏览器,输入法,gcc编译器之类,肯定是稳定的。你看我就用浏览器,输入法,xterm,screen,编程ide,vim,以及一堆命令行的东西,稳定得很啊,六个月才重启一次电脑,重启的那一次还是因为ubuntu升级。

作者:pansz
链接:https://www.zhihu.com/question/301581684/answer/547761587
来源:知乎 著作权归作者所有。

高阶函数:对传入的函数进行增强, 并返回一个添加了额外行为的新函数。

const HoC = Component => EnhancedComponent 

高阶组件其实就是函数,它接收组件作为参数,对组件进行增强后返回。

npm-check 是用来检查 npm 依赖包是否有更新,错误以及不在使用的,我们也可以使用 npm-check 进行包的更新。

安装npm-check:

npm install -g npm-check

检查npm包的状态:

npm-check -u -g

通过上下键可以移动光标,使用空格键可以选择需要处理的包,回车直接进行处理。选择 npm@3.10.2 包升级到 3.10.3:

? Choose which packages to update. npm@3.10.3

$ npm install --global npm@3.10.3 --color=always

/usr/local/bin/npm -> /usr/local/lib/node_modules/npm/bin/npm-cli.js
/usr/local/lib
└─┬ npm@3.10.3
  ├── aproba@1.0.4
  ├── has-unicode@2.0.1
  └── read-package-tree@5.1.5

[npm-check] Update complete!
[npm-check] npm@3.10.3
[npm-check] You should re-run your tests to make sure everything works with the updates.

npm outdated 可查看那些包比较旧