月度归档:2019年08月

2019 年 8 月月度总结

TLDR

这个月最大的事情莫过于去台湾了,去台湾的 10 天,让我有了全新的体验。

在台湾,我见到了不一样的人生、世界、开源观,当然,也认识了不少的台湾好朋友,希望以后可以再有机会去一趟台湾。

月度总结

工作

辞职了,开源新一轮求职面试

  • 杭州某农业互联网创业公司,之前在网易的同事介绍的。
  • 广州微信团队
  • 腾讯云 Serverless 团队
  • 腾讯云 小程序云开发团队
  • 深圳某珠宝 SaaS 团队(腾讯的朋友出来创业的)
  • 南京某安全公司(LCTT 的朋友介绍的)
  • 支付宝小程序团队(阿里的朋友内推的)

不过,最后因为自己下半年的会议事情太多,最后还是放弃了固定工作,暂时考虑以 Freelancer 的形态来过活。

说起来,工作年限太短也是个问题,年轻对于我来说,是最大的优势,但,也正是因为年龄,导致我无法获得腾讯的 Offer, 因为太年轻,无法定级,即使按照你的能力,足以定级到 2-3 ,但是因为工作年轻太短,招聘方会被 HR 挑战,为了不给朋友们添麻烦,还是放弃了。

生活

这个月因为去了台湾,大吃大喝了一顿,不过不知道为啥,没有胖,实际上,还瘦了几斤。接下来有空了,要好好开始减肥。

Side Project

  • 这个月并没有花太多时间在 Side Project 方面有太多投入。

写作

  • 本月因为去了趟台湾,拖更严重。

财务状况

其他

  • 本月的最后两天,开始考虑使用 Windows 替代 macOS ,开始整理自己的常用软件,看看有没有什么好的解决方案。

年度对标

读书

  • 《闪电式开发》:很不错的书,不过不知道大陆有没有卖的,因为是我在台湾诚品买的。

旅行

  • 台湾
    • 台北
    • 台南

电影·电视剧

  • 《逃避虽然可耻但却有用》:gakki 真好看

课程学习

  • 知乎私家课:搞定面试,11招带你拿到心仪 Offer
  • 知乎私家课:求职面试通关秘籍,15招搞定高薪好工作

其他实证

  • 投资实证
  • 项目实证

Windows Terminal 的 WSL 配置

我在考虑将自己的笔记本从 macOS 转为 Windows,所以就开始研究 Windows 下我常用的软件的替代品,于是,便试了试 Windows Subsystem For Linux ,这一试,发现 WSL 的确不错,很好用,便下载了 Windows Terminal ,作为自己的新的开发环境。

在使用 Windows Terminal 的时候,我遇见了一个问题,我希望在 Windows Terminal 中添加一个新的配置文件,从而让我的 Windows Terminal 在启动的时候就自动进入 Linux 子系统,因此,在互联网上搜索了一些教程后,我将我自己的配置改成了这个样子的。

{
    "globals" :
    {
        "alwaysShowTabs" : true,
        "copyOnSelect" : false,
        "defaultProfile" : "{58ad8b0c-3ef8-5f4d-bc6f-13e4c00f2530}",
        "initialCols" : 120,
        "initialRows" : 30,
        "keybindings" :
        [
            {
                "command" : "closePane",
                "keys" :
                [
                    "ctrl+shift+w"
                ]
            }
        ],
        "requestedTheme" : "system",
        "showTabsInTitlebar" : true,
        "showTerminalTitleInTitlebar" : true,
        "wordDelimiters" : " ./\\()\"'-:,.;<>~!@#$%^&*|+=[]{}~?\u2502"
    },
    "profiles" :
    [
        {
            "acrylicOpacity" : 0.5,
            "background" : "#012456",
            "closeOnExit" : true,
            "colorScheme" : "Campbell",
            "commandline" : "powershell.exe",
            "cursorColor" : "#FFFFFF",
            "cursorShape" : "bar",
            "fontFace" : "Consolas",
            "fontSize" : 12,
            "guid" : "{61c54bbd-c2c6-5271-96e7-009a87ff44bf}",
            "historySize" : 9001,
            "icon" : "ms-appx:///ProfileIcons/{61c54bbd-c2c6-5271-96e7-009a87ff44bf}.png",
            "name" : "Windows PowerShell",
            "padding" : "0, 0, 0, 0",
            "snapOnInput" : true,
            "startingDirectory" : "%USERPROFILE%",
            "useAcrylic" : false
        },
        {
            "acrylicOpacity" : 0.75,
            "closeOnExit" : true,
            "colorScheme" : "One Half Dark",
            "commandline" : "debian",
            "cursorColor" : "#FFFFFF",
            "cursorShape" : "bar",
            "fontFace" : "Consolas",
            "fontSize" : 11,
            "guid" : "{58ad8b0c-3ef8-5f4d-bc6f-13e4c00f2530}",
            "historySize" : 9001,
            "icon" : "ms-appx:///ProfileIcons/{9acb9455-ca41-5af7-950f-6bca1bc9722f}.png",
            "name" : "Debian Path",
            "padding" : "0, 0, 0, 0",
            "startingDirectory" : "/home/bestony",
            "snapOnInput" : true,
            "useAcrylic" : true
        }
    ],
    "schemes" :
    [
        {
            "background" : "#282C34",
            "black" : "#282C34",
            "blue" : "#61AFEF",
            "brightBlack" : "#5A6374",
            "brightBlue" : "#61AFEF",
            "brightCyan" : "#56B6C2",
            "brightGreen" : "#98C379",
            "brightPurple" : "#C678DD",
            "brightRed" : "#E06C75",
            "brightWhite" : "#DCDFE4",
            "brightYellow" : "#E5C07B",
            "cyan" : "#56B6C2",
            "foreground" : "#DCDFE4",
            "green" : "#98C379",
            "name" : "One Half Dark",
            "purple" : "#C678DD",
            "red" : "#E06C75",
            "white" : "#DCDFE4",
            "yellow" : "#E5C07B"
        }
    ]
}

这个配置项目中,需要注意的是 profiles.[1].commandline 你会发现,我设置的是 debian 这个和很多教程是不一样的,不少教程使用的是 wsl -d debian 这样的,但是实际上,如果你使用的是 wls -d debian ,你会发现,你配置的 startingDirectory 就会失效,但是如果你的启动命令是 debian, 不会影响你的 startingDirectory 的配置,非常舒服。

Reference

  • https://lwz322.github.io/2019/06/01/Terminal.html
  • https://github.com/microsoft/terminal/issues/1183

乐在其中,才会无限精彩:记 COSCUP 2019 台湾行

在 2018 年的时候,COSCUP(Conference For OpenSource Coders, Users & Promoters) 我虽然知道,但因为自己的缘故,没有办法参会,于是在 COSCUP 2019 的消息出来之后,我便主动提交了自己的议题,希望可以去台湾参加一次 COSCUP ,感受一下台湾最大的 FLOSS 社群会议活动。

幸运的是,我提交的两个议题「从 GRANK 到 GITRANK ,我们是这样针对开源项目建模的」和「一个 P0rnHub 周边项目的诞生和成长」都通过了筛选,成功被组委会选中,也便有了此次的台湾之行,有了这篇 COSCUP 后记。

前路坎坷:艰难的台湾之行

停办的个人自由行签注

在台湾之前,我在西藏出差了三个月,因为时间的关系,当时只来得及办理台湾自由行个人签注。在西藏出差期间,因为没有时间回深圳,导致我一直没有办理入台证,后续,8 月 1 日,国台办停办了所有的个人自由行签注,更是让我陷入了十分紧张的状态,担心自己能否前往台湾,参加本届的 COSCUP。

入台证
入台证

幸运的是,在我 13 号回到深圳后, 提交资料,加急办理后,还是成功的在前往台湾前,成功办理了入台证,获取了前往台湾的许可。

艰难的飞行之旅

在确定了议题被选中后,我就订了从香港飞往台湾的机票(毕竟从香港飞比从大陆飞能便宜 1000 左右),但是,后续因为环境原因,我不得不选择退掉我从香港起飞的机票,改为从大陆直飞台湾。

一开始订的票是从广州直飞台北,结果,到了出发的早上,因为前一天晚上休息的时间太晚了,导致我醒来以后,无法赶上从深圳到广州的列车,不得已,我将飞机改签,转而从深圳飞上海转机飞台湾。

马上就要登机飞✈️往台北了
马上就要登机飞✈️往台北了

经过这么一番折腾,最终,我在 8 月 16 日的下午,成功抵达台北。

看到远处的台北 101 大厦了么?
看到远处的台北 101 大厦了么?

Happy Hacking:愉快的 COSCUP 参会体验

Welcome Party

COSCUP 在会议的前一天晚上,安排了会前派对,参加派对的大家可以在 Party 现场见面、聊天,讨论关于开源等一切事务。

邮件中为
邮件中为

我在 Airbnb 完成入驻后,就尽快赶到了 Party 的会场,参与现场的交流。会场选在了台北 101 大厦的附近,我们在 Party 的现场只需要抬头,就可以看到台北 101 大厦,非常的漂亮。

中间的尖塔状建筑,就是台北 101 大厦
中间的尖塔状建筑,就是台北 101 大厦

整个 Party 的氛围可惜因为我还是太过于腼腆,并没有和太多在场的台湾同胞交流,倒是和大陆一同前往台湾演讲的各位讲师聊的很开心。

大家得知附近刚好有个诚品书店,便一致决定,去看看这个“网红”书店,我还在诚品书店买到了几本不错的书,都带回了大陆看。

左起分别是王蕴博老师(滴滴)、吴晟老师(Apache Skywalking)、我、Ted 刘(开源社理事)
左起分别是王蕴博老师(滴滴)、吴晟老师(Apache Skywalking)、我、Ted 刘(开源社理事)

COSCUP Day 1

今年的 COSCUP 是在台北的台湾科技大学举办,租借了台科大的一栋大楼来做会议。相比于大陆的会议主要是一个主会场,所有人都去听,COSCUP 的主办方的看法有所不同,在他们看来,他们需要的是更多的会场,让更多的开发者可以勇敢的 Show 出自己。

OPasss
OPasss

参会的话,首先需要下载一个 OPass App,安装了这个 App ,就可以在现场使用 App 进行签到,十分的方便,值得大家学习。

现场的各项基础设施,也做的非常的棒,有大的议程台,可以帮助参会者了解议程。

现场照片
现场照片
COSCUP 会场之 IB101
COSCUP 会场之 IB101

大陆来的讲师的议程基本在第一天,所以我第一天的事情主要是去听一听大陆这边的讲师的议程,听一听大家都讲的是什么,并选一些我感兴趣的其他议程听一下

Ted Liu 的议程
Ted Liu 的议程

Ted Liu 讲的是自己在 Apache 基金会看到的一些东西,以及他作为 Apache Member ,看到的不同的内容、开源项目能够从中学习到什么。

吴晟老师的议程
吴晟老师的议程

吴晟老师则分享了他的项目 Skywalking 如何从一个个人项目进入 Apache 基金会的项目孵化器、成为 Apache 顶级项目的历程。

马全一老师分享了他在阿里巴巴、腾讯、华为等多家企业从业看到的大陆的企业的开源的现状,因为他说他的议程不能拍照不能录像,所以这里没有图片。

李辉老师则以自己的个人经历,为大家介绍了一个普通程序员如果变成一个全栈工程师、如何成为一个项目的 Core Maintainer 等等的一些信息。

水歌则分享了其在 Web Components 中的实践,帮助大家了解了 Web Components 的前世今生,并介绍了他自己基于 Web Components 实现的框架, WebCell。

其他几位老师的议程,因为时间的缘故,没有能去参加。

除了听议程以外,第一天我还去参加了 LPI 在 COSCUP 举办的考试,毕竟作为 Linux 中国的一员我还真没有正经的参加过 Linux 相关的考试,刚好这次有机会,就参加一下考试。

LPI 在 COSCUP 的展台
LPI 在 COSCUP 的展台

总体来说,LPI 的考试还是不错的,会考到一些比较基础的,平时可能根本想不到的知识点。

第一天的议程结束后,开源社成员 Richard 和 Kevin (他们是台湾人)作东,邀请了来台湾参会的讲师么,一同聚餐。

聚餐合影
聚餐合影

台湾菜,很好吃!

COSCUP Day 2

第二天,因为我自己有两场演讲,所以也仅仅参加了两个议程和一场 BoF(有相同喜好的人大家坐在一起聊聊天的活动)。

王伟老师的议程
王伟老师的议程

王伟老师在议程中,分享了他自己在大陆做的开源相关的教育的事情,并分享了自己的一些成果。

水歌的分享
水歌的分享

水歌的分享则介绍了他如何借助 Hexo 去建立一个开放透明的开源组织,介绍了他自己的实践,还进行了一个 WorkShop,帮助大家上手。

在 BoF 上,大家则讨论了关于开源、教育等一些实践、大家的思考。

关于我自己的议程,因为我在演讲,所以只能等后续组委会放出的视频和照片了?。

One More Thing:会后采访

这次来台湾参会,我给自己留了10天时间,除去来回的2天,我还有8天时间,以及 2 天的会议时间,我仍然有 6 天的自由时间,除了在台湾游玩,我还能为两岸的开源、IT 界做些什么呢?

那就来做采访吧!

得益于 COSCUP 的关系,很多人对于我有一个初始的印象,也借此,我可以成功的在台湾访谈一些很好的朋友,包括 Anti996 License 的主导者 Suji Yan、Hexo 的开发者 Tommy、台湾的 Ruby 社群的高见龙、Ubuntu TW 的负责人 BlueT、台北 iOS 开发社群的早期负责人豆花、COSCUP 的总办 Bobchao、台湾 Laravel Dojo 的创办人范圣佑等人, 如果你对他们的访谈感兴趣,就持续关注我吧,我会在后续将这些采访都发出来。

当然,如果你对于其他的开发者有兴趣,也可以告诉我,我后续会一一进行访谈。

学而时习之:COSCUP 值得学习的小细节

在参加 COSCUP 中,我也发现一些值得我们去学习的细节,这里也分享给大陆的同行,帮助大家更好的去举办大陆自己的会议。

He、She、Ze

在 COSCUP 中,每一个人可以在自己的卡片上贴上一个标签,这个标签分为 He、 She、Ze,其中 He 和 She 就不多说, Ze 则是针对一些跨性别者,或性别认知与其天然性别不同的人。对于跨性别者,或者性别认知不同的人来说,直接称呼其 He、 She 都略不尊敬,而 Ze 则很好的避开了这个问题,而且参会者可以根据自己的需要,选择标签,他人在称呼自己的时候,可以根据你的选择了填写。

共笔系统

共笔系统也是我在 COSCUP 中认为的一个值得我们学习的点。共笔系统,是指 COSCUP 为每一场活动都提供了一个可以在线协作的文档,每一个参会者都可以打开这个文档,然后为文档共享内容,大家共创会议笔记,这种方式,可以让大家更好的去参与这个会议,每个人对于会议的理解不同,能够结合自己的经历,写出一些不同的东西,帮助更多人去理解。

总结

最后,做一个小的总结,这一次的 COSCUP ,其实让我感受到非常多大陆和台湾的不同,大陆这边我们会关于效率,项目,成长。台湾则会更关注娱乐,就像我在标题中写的那样 「乐在其中,才会无限精彩」,因为乐在其中,所以我们可以更加持久的做下去,至于精彩,就听天由命了。

对于大陆的开源人来说,我想,我们需要做一些改变,不应仅仅是为了工作目标而开源,为了快乐去做一些事情,不也很棒么?

Vlog 两则

视频托管在 Youtube,需要你懂的通道才能查看。

在西藏我们都吃什么

https://www.youtube.com/watch?v=jk99ErRA0pM&feature=youtu.be

西藏:无题

https://www.youtube.com/watch?v=6qF0cEj1maU&feature=youtu.be

WebSocket 如何实现服务端向客户端发送消息?

我们都知道, Websocket 是一个双向的通讯方式,一般情况下,我们都是根据 Client 的情况返回信息,但是在一个更加健壮的系统,我们可能需要主动的向客户端发送消息。我试图在中文网络去搜索,查找相关信息,无果。因此便开始搜索英文世界中的内容。如今已经实现我想要的需求,便写一篇文章分享一下。

需求

需求是 Websocket 服务端作为中心控制服务器,会对外提供一个 RESTFul API,其他部件通过 RESTFul API 来链接 WebSocket 服务端发起请求,由 WebSocket 服务端进行设备相关的控制。

实现

首先,前提是我们的服务端和设备端是保持着 websocket 的长链接操作的,那么,我们在 RESTFul 中只要获取到这个链接,就可以发送消息了。

而 websocket 中,我们如果想要获取到一个特定的链接,就需要使用 websocket 的 socket.id 来完成我们的需求。这就要求我们提前将 socket.id 存储起来,这样当我们需要的时候,我们就可以直接拿 socket.id 来发送消息。

在 Socket.io 中,你需要使用 io.sockets.connected[socketID].emit(“greeting”, “Howdy, User 1!”); 来发送消息。

在 egg.js 中,则是 app.io.sockets.connected[socketID].emit(‘res’, ‘send From app’);

有了这个代码,你就可以实现在 RESTFul API 中向 Client 中发送消息了。

参考代码

说明

本例中使用的是 Socket.io + Egg.js 实现的

服务端代码

//config/config.default.js
config.io = {
    namespace: {
      '/': {
        connectionMiddleware: [ 'auth' ],
        packetMiddleware: [],
      },
    },
  };
// app/io/middleware/auth.js
'use strict';
module.exports = () => {
  return async (ctx, next) => {
    const { socket, app } = ctx;
    const id = socket.id; // 获取 Socket ID
    app.redis.set('pid', id); // 设置 Socket ID
    ctx.socket.emit('res', `Your id is ${id}`);
    await next();
  };
};
// app/controller/home.js
'use strict';
const Controller = require('egg').Controller;
class HomeController extends Controller {
  async send() {
    const { ctx, app } = this;
    const id = await app.redis.get('pid'); // 获取 ID
    app.io.sockets.connected[id].emit('res', 'send From app');// 发送数据
    ctx.body = 'ok';
  }
}
module.exports = HomeController;

参考文章

https://michaelheap.com/sending-messages-to-certain-clients-with-socket-io/

关于感情、节日,在推特看到的一些东西和一些感想

这段话看到以后很感慨,因为这段话我曾经看见过一次。

从我自己的视角来看,会出现这样的问题有以下几种情况:

首先,需要判断他不陪你的情况是良性的还是恶性的?

这里的良性与恶性更多是社会认知层面的良性与恶性,良性是指工作、奋斗;恶性是指消磨时间、做无意义的事。

良性与恶性的判断实际上看到的是,女性对于男性看重的点是什么?关注的是男生当前的状态,还是长久的发展。

当然,这样说可能会略显功利,但是确实也是一个点,有一些女生会看重一个人的当下;一些女生会看重一个人的未来。

我们无法评价某一种是好是坏,关注的点不同,自然也有不同的结果。

这里的良性和恶性判断可以聚个例子:

  1. 男生在打游戏(恶性)
  2. 男生在加班工作(良性)

其次,女生是否提醒过男生自己希望有一个更好的情人节?

实际上,部分男生可能不会太过在意节日(比如我),可能是工作的压力太大,抑或是脑海中要处理的事物太多,导致对于节日并不够敏感。

这个时候就有一个问题,如果一个人没有关注,而另一个人十分关注,那她是否应当以某种隐晦的方式来提醒,自己想要更好的节日?因为每个人对于事物的关注度是不同的,如果提醒一下,表明自己很关注,可能结局不同。

当然,久了女生也会觉得,wow,好累哦,那我谈恋爱干嘛呢?


女生到底要的是什么?

其实到了这一步,我们会发现,实际上,现代的女性对于感情和婚姻的看法已经与之前的几代人完全不同了。

现代的女性相比于前面的几代女性因为更加的独立,因此对于配偶的要求更低,不在绝对要求上迁婚。基于这样的考虑,男性的独立自主、奋斗不再成为这一代女士择偶的第一标准,因为女性完全可以自己生存,不同于过去的时代,不再是“男怕入错行,女怕嫁错郎”的时代了,女性可以离婚,男性可以跳槽,一切不同于过去了。

在这种情况下,女性的关注点就会完全放在能够让自己愉悦的点上了,比如“陪我看电影”、“陪我逛街”、“陪我旅行”,而绝大多数的男生在认知上依然停留在过去的情感观念中,认为“有钱、有未来就是好的男生”,这种供需的错配,使得不少男生依然在走所谓“老实人的路线”,努力的提升自己,然后成家立业。这样有错么?没有错,但是这样的思路,只能吸引具有相同情感/婚姻认知的人。

如果你希望自己能够去吸引其他情感/婚姻认知的人,那么你必须更新自己的情感认知/更新认知,以去适配新的情感和婚姻的环境。

男性策略的变化

基于这样的认知,男性应当如何调整自己的策略呢?

首先,你需要明确的是,你所交往的女性看重的到底是什么?这个很重要,当你明确了你的配偶/女朋友想要的是什么,才能够去提供她想要的东西,然后拥有一段愉快的恋爱体验。

其次,你需要认可并接受这种存在,因为我们每个人的成长环境都会有所不同,因此对于同一个问题的看法是有所偏差的,如果你的配偶/女朋友在此问题上与你的看法不同,你要学会接受这样的情况,并去接纳这种情况的存在。如果你无法接纳,那么后续的就无法进行。

再次,当你明确了自己的策略以后,所需要做的就是去践行你的策略。

对于仍处于单身情况下的男生的建议

先脱贫,后脱单

这句话很现实,但是确实是事实,实际上,现在的女生在选择配偶的时候,会希望配偶不至于拉低自己的生活品质,应当是对等的。如果你喜欢的女孩子个人的能力很强,那么你自己能力的不足将会成为你们最终分开的导火索。

作为男生,大多数时候可以接受下迁婚的存在,所以,即使你比喜欢的女孩子更强,也没有问题。但是如果你比你喜欢的女孩子更弱,就会成为问题。所以,为了能够在遇到喜欢的女孩子时,勇敢的去追,并长久的走下去,你的确需要先脱贫。

这里需要注意的是,这里的先脱贫再脱单和父辈所说的“你奋斗吧,等你牛逼了,什么样的女生找不到”是不同的。后者是基于传统的婚恋观,女性依附于男性生存,在这种情况下,女性只关注你是否成功。但是,如今的婚恋观不再是仅仅关注经济条件。在你经济条件尚可的情况下,女生并不介意你当前事业不够完美。

当你开始一段恋情以后,关注你的配偶的情感生活

当你开始一段恋情后,需要关注一下你的配偶的情感生活,以更好的状态来维护两性关系。让你们的关系可以持久。

明确世界已经变了!

如今的世界已经不同于过去的世界,你看到了丁克家庭,台湾也举起了彩虹旗,更新你的婚恋观,适应这个新的世界吧!

致谢

感谢我在写文章过程中提供建议的 aime 老师,aime 老师在这方面给我提供来自女性视角的看法,对于我的认知升级有极大的帮助。

一些可以帮助你理解这篇文章的信息

Homebrew 使用指北

对于习惯了使用命令来完成一切的程序员来说,安装软件这种小事,自然是能够用命令解决,就不用图形界面选择。但是在 Linux 中,我们有 yumaptdnfpkg等命令来完成软件的安装,macOS 却并未为我们提供一个好用的包管理器,帮助我们更好的使用 macOS。

好在,虽然官方没有提供,我们却可以使用 Homebrew 这一神器,来完成类似的工作,就如同 Homebrew 的 Slogan :“The missing package manager for macOS (or Linux)”

Homebrew

Homebrew 由开发者 Max Howell 开发,并基于 BSD 开源,是一个非常方便的包管理器工具。在早期, Homebrew 仅有 macOS 的版本,后续随着用户的增多,Homebrew 还提供了 Linux 的版本,帮助开发者在 Linux 同样使用 Homebrew 来配置环境。

Homebrew 的几个核心概念

在正式介绍 Homebrew 的使用之前,我先为你介绍一下 Homebrew 中的一些核心的概念,了解这些概念,就可以帮助你更好的去使用 Homebrew。

词汇含义
formula (e)安装包的描述文件,formulae 为复数
cellar安装好后所在的目录
keg具体某个包所在的目录,keg 是 cellar 的子目录
bottle预先编译好的包,不需要现场下载编译源码,速度会快很多;官方库中的包大多都是通过 bottle 方式安装
tap下载源,可以类比于 Linux 下的包管理器 repository
cask安装 macOS native 应用的扩展,你也可以理解为有图形化界面的应用。
bundle描述 Homebrew 依赖的扩展

其中,最关键的是 tap 、cask,我们在后续会经常用到。

Homebrew 常用操作

安装 Homebrew

在使用 Homebrew 之前,首先我们需要完成 Homebrew 的安装工作。Homebrew 的安装工作非常简单,只需要执行如下代码,就可以自动开始安装流程,后续根据提示操作即可。

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

安装软件

当你完成了 Homebrew 以后,就可以使用 Homebrew 来完成软件的安装了,安装命令行软件的时候非常简单,只需要执行 brew install [软件名] 就可以安装软件了,比如说,我们要安装 wget,那么只需要执行 brew install wget 就可以了。

搜索软件

很多时候,我们不知道自己想要的软件是否有,或者说具体的名字是什么,这个时候你有两种方式来完成搜索

1. 使用命令搜索

在命令行中,你可以直接使用 brew search [关键词] 来进行搜索

命令行搜索软件

输入你想要的关键词,来搜索即可得到结果。

在搜索时应当遵循宁可少字,不能错字的原则来搜索。

2. 使用网页搜索

除了使用命令行搜索以外,你可以使用网页端的搜索工具来辅助你进行搜索。在 Homebrew 的官网,你可以找到 formulae 的链接,或者直接访问 https://formulae.brew.sh/ 来进行搜索。你只需要在界面的输入框中输入你要搜索的命令,然后就会出现对应的候选命令

搜索软件

选择其中你要使用的那个,点击就会进入到软件的介绍页面

查看软件介绍

你就可以看到 Homebrew 中的软件具体信息。

查看已经安装的包

如果你想要查看你都安装了哪些包,你可以执行 brew list 命令,来查看所有你已经安装的软件。

查看所有软件

更新一个已经安装的包

我们安装的软件并不会自动更新,因此,我们可以根据自己的需求,批量更新软件,或者更新单个软件。

你可以先使用 brew outdated 来查看所有有更新版本的软件。

查看需要更新的软件

然后使用 brew upgrade 来更新所有的软件,或者是使用 brew upgrade [软件名]来更新单个软件。

卸载某个已经安装的包

如果你想要卸载某个包,你可以执行 brew uninstall [软件名] 来卸载一个特定的软件,比如卸载 wget 是这样的。

卸载某个已经安装的包

查看包的信息

如果你想要查看某个特定软件的信息,你可以执行命令 brew info [软件名] 来查看该软件的详情。

查看包的信息

清理软件的旧版

Homebrew 用久了,会有一些历史版本的软件遗留在系统里,这个时候,你可以使用 brew cleanup 命令来清理系统中所有软件的历史版本,或者可以使用 brew cleanup [软件名]来清理特定软件的旧版。

清理软件的旧版

管理后台软件

诸如 Nginx、MySQL 等软件,都是有一些服务端软件在后台运行,如果你希望对这些软件进行管理,可以使用 brew services 命令来进行管理

  • brew services list: 查看所有服务
  • brew services run [服务名]: 单次运行某个服务
  • brew services start [服务名]: 运行某个服务,并设置开机自动运行。
  • brew services stop [服务名]:停止某个服务
  • brew services restart:重启某个服务。
管理后台软件

检查 Hombrew 环境

如果你的 Hombrew 没有办法正常的工作,你可以执行 brew doctor 来开启 Homebrew 自带的检查,从而确认有哪些问题,并进行修复。

检查 Hombrew 环境

更新 Homebrew

Homebrew 经常会在执行命令的时候触发更新,不过如果你想要主动检查更新,可以执行 brew update 来唤起 Homebrew 的更新。

添加一个新的 tap

homebrew 官方在安装的时候会有一些 tap 但是在使用时,依然会需要安装一些特殊的 tap ,这个时候,我们就要用到 tap 的命令来添加新的 tap.

在添加 tap 时,输入命令 brew tap [user/repo] ,就可以完成添加 tap 了

常用 tap

在使用 homebrew 时,我们一般会添加几个常用的 tap,来确保我们有足够的软件来安装。

1. Caskroom

Caskroom 是 Homebrew 下一个非常出名的 tap ,有了 caskroom,我们就可以安装一些有图形化界面的软件了,比如 VSCode、Typora 等软件。

使用起来也非常简单,最新版 Homebrew 中,你可以直接使用 brew cask install [软件名] 来安装特定的软件,homebrew 会自动安装 Caskroom。

2. homebrew-cask-fonts

程序员难免要安装一些代码字体,这样才能更好的写代码,Homebrew 也提供了方便我们安装字体的 tap。

在使用时,你需要先添加对应的 tap ,然后执行安装即可了,比如我们要安装 source code pro ,只需要执行如下命令。

brew tap homebrew/cask-fonts
brew cask install font-source-code-pro

使用技巧

切换国内的镜像源

Homebrew 默认使用的是国外的源,在下载时速度可能会比较慢。好在国内的清华大学和中科大提供了 Homebrew 的镜像源,我们可以很轻松的切换源,从而提升我们的下载速度。

使用中科大的镜像

执行如下命令,即可切换为中科大的镜像

cd "$(brew --repo)"
git remote set-url origin git://mirrors.ustc.edu.cn/brew.git
cd "$(brew --repo)/Library/Taps/homebrew/homebrew-core"
git remote set-url origin git://mirrors.ustc.edu.cn/homebrew-core.git

使用清华大学的镜像

执行如下命令,即可切换为清华大学的镜像

git -C "$(brew --repo)" remote set-url origin https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew.git
git -C "$(brew --repo homebrew/core)" remote set-url origin https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core.git

使用 Brewfile 完成环境迁移

设备永久了,我们的电脑中会有大量的软件,如果你需要迁移环境,重新安装会是一个大麻烦,好在 Homebrew 本身为我们提供了一个非常好用的环境迁移的工具 —— Homebrew Bundle

你首先需要在之前的电脑中执行 brew bundle dump 来完成当前环境的导出,导出完成后,你会得到一个 Brewfile

然后将 Brewfile 复制到新的电脑中,并执行 brew bundle 来开始安装的过程。

使用网页搜索 Caskroom 的软件

Brew Caskroom 并没有提供搜索的命令,不过我们可以借助一些网站来进行搜索,一个是 Homebrew 官方的 Caskrrom 页面:https://formulae.brew.sh/cask/

在这个页面,你可以看到所有被收录的页面,在命令行中输入对应的软件就可以安装了。

你也可以访问 http://macappstore.org/,在网站中输入你要安装的软件,点击搜索,在弹出的页面中,查看安装指南即可。

辅助软件

除了命令行,还有两款软件可以帮助我们更好的使用 Homebrew ,他们分别是 Cakebrew 和 launchrocket。

Cakebrew

Cakebrew 是 Homebrew 的 GUI 管理器,在 Cakebrew 中,你可以看到当前所有已经安装的软件,并可以在 Caskbrew 中对其他软件执行升级等操作。

你只需要执行 brew cask install cakebrew 就可以完成 Cakebrew 的安装。

安装完成后,在 LaunchPad 中打开即可。

launchrocket

launchrocket 可以用于管理 Homebrew 安装的服务,在使用时,你需要先添加对应的tap,然后再安装软件。

brew tap jimbojsb/launchrocket
brew cask install launchrocket

安装完成后,在 LaunchPad 中打开即可。

Reference

  • Homebrew 官网:https://brew.sh
  • Homebrew Github:https://github.com/Homebrew/brew
  • Homebrew 的 Manpage 说明书:https://docs.brew.sh/Manpage