分类目录归档:技术

阻止 GitHub Desktop 自动更新

我的 Mac 笔记本比较老,服役已经超过了 10 年,越来越多的软件在更新后就不再支持 Big Sur 了,碰到了好几例更新后不能用的情况,有的可以设置不要自动更新,有的则无法设置,GitHub Desktop 便是其中无法设置自动更新的。

GitHub 桌面版 GitHub Desktop 使用的是 Electron 框架开发,它的自动更新机制 Squirrel 非常「顽固」,软件设置中没有提供关闭自动更新的选项。

如果当前使用的操作系统不再被新版本的 GitHub 支持,更新后就无法使用,然后就得去寻找最后一个支持的版本,重新安装,这样反反复复比较麻烦,能阻止它自动更新就不用这样反反复复了。

在 Windows 系统中,GitHub Desktop 是使用 Update.exe 「如下图」这个文件来完成更新的,把这个文件删除或者随便找一个文件改成 Update.exe 这个文件名替换掉它,这样更新就找不到这个更新程序了。

mac 中最简单的就是将 GitHub Desktop 这个应用程序锁定,这样就不会覆盖这个应用程序了。在访达中打开「应用程序」文件夹,找到 GitHub Desktop,右键点击它,在弹出菜单中选择「显示简介」,在弹出的窗口中,勾选「已锁定」即可。

Windows 系统中好像也可以通过设定为「只读+关闭执行和写入权限」来解决。

另外更新要连接更新服务器检查,可以在 Hosts 文件中修改来阻止其连接更新服务器,操作 Hosts 文件需要系统管理员身份,Windows 的 Hosts 文件在 C:\Windows\System32\drivers\etc\hosts , macOS 的 Hosts 文件在 /etc/hosts

在文件的末尾添加下面这一行:

127.0.0.1 central.github.com

这样设置后,Github Desktop 认为当前没有网络连接或没有新版本。

最后在本地的硬盘上保留一份最后支持的版本,这样有问题就不用上网再去寻找了。

整理完这份文档后,发现 Visual Studio Code 也是出现了同样的问题,这主要都集中在我的 Mac 上,太老了,好在 Visual Studio Code 在设置中有关闭自动更新的选项,终归还是电脑太老了,虽然我看了网络上有跳过 Apple 限制升级到新系统的方法,还是先不要冲动。

比较崩溃的是 Notion 没有留存老版本,结果更新后直接不能用了,我寻找了半天,最后只寻得 2.1.2 版本,我决定直接在浏览器上先凑合用一下,平常由于慢和手机上操作不太方便,现在在 Notion 上记录的内容也少了很多,就记录一下我读书的记录,实在不行先在 Windows 本上用用。


最后,我还是把经常用的软件都加了个锁,看看今年苹果新发布的本,也是时候换一个新的开始投入战斗了。

AI 小练手

日常使用 AI 主要是与 AI 交互的过程中解决单一的问题,比如寻求问题的解答,文字或者图形的创建等等,这中间对我最有帮助的是使用 AI 学习。这次看看让 AI 自己独自完成编程开发是怎样的一种体验,并为自己建立一个学习其背后技术栈的直观的脚手架。

整个练手跟 AI 交互的时间大概是 30 分钟左右,统计计时如下图「当然这也是 AI 帮助统计的」。

最终的效果如下图「电脑浏览器和手机浏览器」。

下面记录一下练手的过程,大体上跟我在使用 AI 学习的过程类似,先写一个文档,依照程序员的惯例,来一个 README 文件,简单的将要做的工具做一个描述,其内容如下图所示。

这是一个 MarkDown 格式的文本文件,在文档包括两部分内容,一部分是描述想要做的工具的是什么样,另一部分是最下面三个短划线后的内容。

在这里大概说一下这个文档,我在平时也是基于这样的文档来进行学习的,先将我学习过程中理解的和有问题的部分都写一个这样的文档,然后在跟 AI 交流的过程中不断的丰富这个文档,当然是交互中 AI 帮我丰富的,然后我再阅读再交流,循环这样的过程来完成学习,还不错。在上面的图中下面有三个短划线,在这下面就是跟 AI 互动的过程中记录的内容,我在练手开发的同时,记录这些交互的过程便于我进行学习。

这次使用的开发 IDE 是 Windsurf,可以搜索或通过 https://windsurf.com 下载安装,具体的使用方法网上有很多教程,官网也有文档,可阅读后使用。安装后需要登录,登录后就可以使用了,目前有 GPT-4.1 模型可以使用,好像有 7 天限免,这次练手就是用的这个模型「好吧,现在好像已经过了限免期了」。

在电脑上为这个小工具建立一个目录,然后将 README 文件放在这个目录下,使用 Windsurf 打开这个目录,然后在右边的 Chat 录入框中录入「整个目录下有一个 README.md 文件,请按照文件中的要求帮我实现这个工具,目录自动创建。」,录入后回车,Windsurf 就开始了它的工作,一会就完成了。

整个过程基本上没啥问题,就是检测到我没有安装 next 而且 node_modules 目录缺失,我按照检测到的情况安装后就一次性完成了。

后续做了一些微小的调整,主要是添加分割线、二维码、给每个卡片增加随机渐变色、标题居中、二维码图片大小等这样的调整,它也很快的帮我完成了,就是上面最终的效果。

完成了这些工作后,我让它帮我统计了一下工作的时间,正如最上面的截图,它完成的也不错,完成这些后,我就让它把今天所有的过程交互信息「包括录入框上面的所有内容」都追加到 README 文件中,这样就有了一个完成今天工作的全过程记录,便于我学习这个技术栈的各部分内容。

这次练手的目的有两个,其一是体验一下使用 AI 相对完整地开发一个小工具,看看会碰到哪些问题或者带来哪些惊喜;其二是想学习一下 JavaScript(TypeScript)、Next.js、tailwindcss,先有个直观的展示,然后循序渐进开始学习。

这次的体验整体上不错,快速的实现了我想要的东西,这为我的学习算是搭了一个脚手架,从这个脚手架可以开始我的学习之旅了,我的目的算是达到了。

最后的一点儿个人想法:

我略微懂一些 JavaScript 和一些 CSS,对于 TypeScript 只了解一点大概的概要,而对 Next.js 则是听说不少人在用,自己则完全没有接触过,就我这样,在描述概要的文档后,这种带 AI 的 IDE 能快速帮我完成我想要的,确实给人来带来了效率的提升,那么不在 IT 行业的人,如果有好的想法,AI 工具就会是很好的助力让其一展身手。那在 IT 行业的程序员呢?我想应该让这些 AI 工具辅助提升自己工作效率的同时,应该不要忘记还要认真的对于背后的技术做长期系统的学习。

目前与 AI 的互动乍一看是通过自然语言进行的,但其实要想获得好的互动,这些自然语言是要有一定的结构化的,这些结构化的自然语言被称为 Prompt ,我个人的感觉是这并非最终的 AI 互动形式,只是一个中间的过渡期,如果从程序员的角度看,我个人的理解是可以把目前的 Prompt 看作一种新型的编程语言,只是这个编程语言扩大了使用人群的范围,我们使用 AI 就是在编程,人人都是程序员,想要编的好就要有跟 AI 模型匹配度高的结构化语言。


阅读笔记:读《博弈与社会》

《博弈与社会》是张维迎教授运用博弈论剖析社会现象的书,张教授通过理论与实例相结合的方式揭示了个体理性与集体理性的矛盾,以及如何通过制度设计促进合作共赢。

个体追求自身利益最大化的行为可能导致集体非最优结果,对一个社会来说,这是人们协调与合作的核心挑战之一。

重复博弈促进合作,通过联合抵制和积累的信任来强化合作。

法律是强制约束行为的,执行成本高,社会规范则更具灵活性,但时间成本高,两者应相辅相成。

技术也好、制度也好,有路径依赖和锁定效应,为变革带来了强大的阻力,有点《创新者的窘境》关于大企业创新窘境的意思,非破坏性不能为也。

针锋相对和胡萝卜加大棒是有效的;政府管制和声誉也是必要的。

重新看待儒家文化,有「民本」但没有「民主」,对「君主」约束没有好办法。

机制的设计是很有分量的,解决了很多问题,但也带来了很多的问题。

制度企业家这个词很有意思。

npm 学习笔记

npm[1] 是 JavaScript 包管理工具,它类似 Java 中的 Maven , Gradle , Python 中的 pip 。

npm 随着 Node.js 一起发布,在安装 Node.js 的时候,npm 也会随着 Node.js 的安装一起安装到电脑上。 npm 作为一个包管理工具,其自身更新比较频繁,它的最新版本也可以独立进行更新。

# 在终端执行下面的命令即可更新到 npm 的最新版本
npm install npm@latest -g

npm 安装一个包都命令是 npm install package_name , 执行此命令后,会在当前目录安装 package_name 包,并创建一个 node_modules 的目录,下载要安装的包到这个目录中。

npm 是通过 package.json 这个文件管理包到,通过这个文件对包的信息进行定义,以便在团队协作的时候对包的使用上统一一致。使用 npm install 命令安装的是包的最新版本,我们日常在进行的项目实际上不一定总是使用最新的版本,这时候同样可以通过对 package.json 文件进行配置获取指定版本的包。

一个 package.json 至少要包括包名和版本信息。

{
    "name" : "package_name",
    "version" : "1.0.0"
}

如何创建一个 package.json 文件呢? 答案是使用 npm init 命令,然后逐一回答问题即可完成创建。如果不想回答问题,可以使用 npm init –yes 命令创建默认的 package.json ,然后再修改之。

{
    "name" : "npm",
    "version" : "1.0.0",
    "description" : "",
    "main" : "index.js",
    "scripts" : {
        "test" : "echo \\"Error: no test specified\\" && exit 1"
    },
    "keywords" : [],
    "author" : "",
    "license" : "ISC"
}

以上就是默认创建的文件。要安装包,就要有下载的地址,同样也可以在 package.json 中用字段 repository 指定。

{
    "type" : "git",
    "url" : "https://github.com/example/package_name.git"
}

还有一些其他的字段可供设置,比如主页地址,作者邮件等等。一个包的 name 命名有一定的规范,包名需要使用小写字母,不允许有空格,可以使用下划线和横线。对于常用不太变化的字段值,可进行初始化设置,这样就不用每次都输入这些信息了。

# 初始化设定作者 email
npm set init.author.email "author@example.com"
# 初始化设定作者姓名
npm set init.author.name "Eric"
# 初始化设定许可协议
npm set init.license "MIT"

在使用 npm install 命令安装包的时候,会读取 package.json 文件来安装模块。模块在有时候有两种类型,一种是面向生产环境的,另一种是面向开发环境的,这时候可通过在命令后面添加 --save--save-dev 参数指定安装。

如果要更新包,使用 npm update 命令,卸载包用 npm uninstall package_name ,如果卸载的同时想要一并删除 package.json 文件,添加参数 --save

# 卸载 package_name 包,并删除 package.json 文件
npm uninstall --save package_name

上面说了,在默认情况下,包安装命令会将包安装在当前目录下,这只能在当前目录下使用。如果要使用一些全局的包,在安装的时候可以添加 -g 参数来安装,同理更新也是如此,卸载一个全局包也是如此。

# 安装 package_name 包为全局包
npm install -g package_name
# 更新全局包
npm update -g
# 卸载全局包
npm uninstall -g package_name

如果想知道当前都有哪些包需要更新,可以使用下面的命令查看。

# 查看哪些全局包需要更新
npm outdated -g --depth=0

包(package)是一个被 package.json 文件描述的文件或目录。模块(modules)是可以被 Node.js 引用的文件或目录。一个 Node.js 模块就是一个可以发布到 npm ,供其他开发者使用的模块。

如何创建一个 Node.js 模块呢?

  • 创建一个 package.json 文件,将模块信息添加到文件中;
  • 创建一个模块被引入就加载的文件,即 main 字段中指定的文件,默认为 index.js ,在此文件中将一个函数值赋给 exports 模块。
exports.printMsg = function() {
    console.log("This is a message from the first package.")
}

npm 的配置文件是 npmrc,项目级别的在项目所在目录下 .npmrc , 用户级别的在 ~/.npmrc , 全局的在 /etc/npmrc , 内置的配置文件在 npm 安装目录下。配置信息的优先级别为命令行参数级别最高,其次是环境变量 PATH ,再次是这些配置文件,要查看 npm 的配置信息,执行如下命令即可。

npm config list -l

默认下载包的源来自 npm 官网,如果感觉下载速度不理想,我们可以配置一些国内的镜像站点来加快下载速度。

我们可以在安装包的时候指定镜像源,也可以写到配置文件中。

# 在安装的时候指定「淘宝镜像」
npm install express --registr=https://registry.npmmirror.com
# 写到配置文件中
npm config set registry <https://registry.npmmirror.com>

# 查看配置是否成功
npm config get registry # npm info express 也可以

对于 npm 的学习暂时先告一段落,可能很长一段时间只是处于使用 npm 的阶段,了解以上的内容基本上应该可以开始使用了,使用中遇到问题随时查阅帮助解决即可。我看还涉及到发布自己的包等内容,这就是 long long after 以后的事情了。


本文中引用的资源
1:npm 的官方网站是:https://www.npmjs.com/

在 Ubuntu 20.04 LTS 上安装 SSL 证书

今天抽时间给自己的几个网站加上了 SSL 证书,SSL 证书是从腾讯云上申请的免费 SSL 证书,有效期为一年,从申请到配置比较顺利。

申请&下载

登录到腾讯云[1]上,搜索产品 SSL,找到 SSL 证书产品[2],进入该产品首页,也就是你的 SSL 证书概览,在这里左边是导航菜单,中间的内容区会显示证书申请状态和监控状态等概览信息,右边则是一些帮助信息,如下图所示。

在左边导航菜单中选择「我的证书」,会显示当前你申请的所有的证书,在中间功能按钮区选择「申请免费证书」按钮,如下图中红色箭头所指的按钮,即可开始进行免费证书的申请。

首先在弹出的页面上选择证书类型,免费版的目前只有一个,可以看到有效期只有一年,直接确定就行。

接下来是第一步提交材料,需要填写一些信息,要提交的资料主要是证书要绑定的域名以及申请邮箱,填写对应的信息即可,然后进入第二步「选择验证方式」。

第二步选择验证方式主要是验证你之前填写的绑定证书的域名是你的,使用推荐的「DNS验证」即可,选择下一步按钮进入第三步「验证域名」。

第三步验证域名需要你在你的域名中添加一条解析记录,在你的域名托管平台中找到你要绑定证书的域名,然后在域名解析中添加一条 CNAME 的解析记录,在解析记录中对应填写下图中的「主机记录」和「记录值」,解析记录添加完毕后,选择「查看域名验证状态」看看是否完成验证,如果完成验证,剩下就是等待证书的签发,基本上不到 1 分钟就能拿到发放的证书了。

这时候通过左边导航菜单回到「我的证书」菜单,如果上面操作无误,就能看到自己的证书了,在「我的证书」中签发下来的证书上选择「下载」,弹出如下图所示的页面。证书下来后我们需要安装到服务器上,所以我们可以先按照我们的服务器类型把证书下载下来,到这里我们的证书就已经申请完毕了,剩下的就是把下载的证书安装到服务器上。

上传&安装

我的服务器系统是 Ubuntu 20.04 ,Web 服务器软件使用的是 Apache ,所以在下载证书的时候选择服务器类型为 Apache 类型的下载,下载后解压缩,有四个文件,我们以申请证书的域名是 example.com 举例来说(在实际使用时将域名替换为自己到域名即可),那这四个文件分别是:

  • root_bundle.crt 证书文件
  • example.com.crt 证书文件
  • example.com.key 私钥文件
  • example.com.csr 系统在线生产文件,这个安装的时候不用

将证书文件和私钥文件拷贝到服务器上一个目录中,我是拷贝到了 /etc/apache2/ssl/example.com/ 这个目录下面,可以使用 scp 命令进行拷贝,也可以使用 scp 工具拷贝。

拷贝完成后,用 SSH 远程登录服务器,在虚拟主机配置文件中添加证书信息,比如在 /etc/apache2/sites-available 目录中,找到要配置 SSL 站点的配置文件,例如:example.com ,则对应到该目录下的 example.com.conf 文件,将配置信息修改为如下信息即可。

<VirtualHost *:443> 
	ServerAdmin admin@example.com 
	ServerName example.com 
	ServerAlias www.example.com 
	DocumentRoot /var/www/html/example.com/public_html/ 
	DirectoryIndex index.html 
	
	# SSL configuration 
	SSLEngine On 
	SSLCertificateFile /etc/apache2/ssl/example.com/example.com.crt 
	SSLCertificateKeyFile /etc/apache2/ssl/example.com/example.com.key
	SSLCACertificateFile /etc/apache2/ssl/example.com/root_bundle.crt 
	
	# Log files 
	ErrorLog /var/www/html/example.com/log/error.log 
	CustomLog /var/www/html/example.com/log/access.log combined 
</VirtualHost>

<VirtualHost *:80> 
	ServerName example.com 
	ServerAlias www.example.com 
	Redirect permanent / https://example.com/ 
</VirtualHost>

完成站点配置文件修改后, 在命令行运行 a2enmod ssla2ensite example.com 启用这个修改后的配置,紧接着 service apache2 restart 重启 Apache 服务器,这样证书就安装完了,再访问网站时域名前就能看见小锁了。


本文中引用的资源:

1: 腾讯云:https://cloud.tencent.com/
2: 腾讯云 SSL 证书产品:https://console.cloud.tencent.com/certoverview

– EOF –