本篇的应用基本上是经常被使用到的,日常的部分是基本上每天都会用到的,偶尔的部分则是经常用的,开发部分则由于工作原因经常是用的,这部分可以选择性的看下就好了。
下面的这些工具基本上是每天中大概率会被用到的,所以优先推荐给大家。

| Question | Answer |
|---|---|
| 免费 | 是(订阅制,如果用 iCloud 同步可以免费) |
| 评分 | ★★★★★ |
1Password 应该是全球最受欢迎的密码管理器了,是存储和使用强密码的最简单方法,包括两步认证等。一键即可安全登录网站、填写表单。1Password 现在可以免费使用,但是如果需要将密码安全的保存、同步的话,需要订阅官方的服务。如果你所有的设备都是 Apple 的话,例如说 Mac、iPhone 等,可以选择使用 iCloud 保存、同步。目前我为了给家人保存以及共享密钥,所以选择的家庭订阅版本。
为了保证互联网个人账户的安全性,强烈推荐大家使用高强度的随机密钥,这样即使某一个网站账户泄漏,也不会导致其他网站的账户被攻破。

| Question | Answer |
|---|---|
| 免费 | 否(可买断) |
| 评分 | ★★★★☆ |
BetterZip 是一个压缩、解压软件,虽然有时候解压文本的时候,会出现一些意外的乱码,但是整体上跟免费的压缩、解压软件对比起来,功能已经算是非常完善、易用。

| Question | Answer |
|---|---|
| 免费 | 是 |
| 评分 | ★★★★★ |
Spark 是我认为 MacOS 上最好用的邮件客户端了,之前尝试了各种邮件客户端,例如系统自带的、Outlook、Airmail 等等,但是总归是有些小问题不尽人意,当试用了 Spark 之后就喜欢上了这款风格简洁、功能丰富的邮件客户端了。并且 Spark 支持各个平台,在 iOS 上面使用起来也非常顺手。

| Question | Answer |
|---|---|
| 免费 | 否(可买断) |
| 评分 | ★★★★★ |
Typora 是一个功能强大的 Markdown 编辑器,会即时渲染编写的 Markdown 内容,之前是免费,从 1.0 正式版开始收费,功能非常强大。如果想使用免费的 Markdown 编辑器,推荐使用 MacDown,也是一款很不错的选择。
这部分虽然不是每天使用,但也是基本上经常用的,都是很棒的应用,推荐给大家。

| Question | Answer |
|---|---|
| 免费 | 是 |
| 评分 | ★★★★★ |
Gridea 是一个免费开源的静态博客写作客户端,帮助你更容易地构建并管理博客或任何静态站点。例如当前你所看到的这个博客,就是使用该应用构建管理的。

| Question | Answer |
|---|---|
| 免费 | 否(可买断) |
| 评分 | ★★★★★ |
Movist Pro 是一个功能强大的视频播放器,是 MacOS 上最强大好用的视频播放器也不为过。可以轻松的播放 4K 高清视频,方便的切换音轨、字幕等,支持所有常见的视频格式。

| Question | Answer |
|---|---|
| 免费 | 否(可买断) |
| 评分 | ★★★☆☆ |
OmniGraffle 是 OmniGroup 家族中的一款专业绘图软件,可以通过导入模版支持更多绘图资源,完全能够满足日常工作画图需要,并且能够很完美的和 Sketch 协同工作。唯一的缺点就是价格太高,普通的用户非必要场景下使用成本过高,性价比过低。

| Question | Answer |
|---|---|
| 免费 | 否(可买断) |
| 评分 | ★★★★☆ |
Parallels Desktop 是一款虚拟机软件,但是一般主要用于在 MacOS 上安装 Windows 虚拟机,它可以无缝的将 MacOS 和 Windows 两个系统融合在一起,让你可以非常友好、无缝的使用 Windows 的应用。如果你偶尔有使用 Windows 应用的需要,这个应用可以很好的满足你的需要(玩大型游戏的就不要指望了)。
开发部分就是看大家喜好了,有些可以全部用 Vim 来开发,像我这种则喜欢尝试乱七八糟的应用,把合适的应用放在合适的场景上。当然,大家常用的 Xcode、jetbrains 家族、Visual Studio Code 这些,我就不在这里介绍了。

| Question | Answer |
|---|---|
| 免费 | 是 |
| 评分 | ★★★★★ |
iTerm 2 是 MacOS 上最强大好用的终端工具,它免费且功能强大,日常工作必备利器。

| Question | Answer |
|---|---|
| 免费 | 否(订阅) |
| 评分 | ★★☆☆☆ |
Tower 是一款非常强大的Git客户端,如果你使用git的过程中,感觉使用命令很困难,可以尝试使用Tower。不过价格很高,还不能买断,对于一些个人开发者就十分不友好了,当然大家可以选择使用免费的 SourceTree,大部分功能跟 Tower 基本上一致,只是在易用性上稍微欠缺一些。

| Question | Answer |
|---|---|
| 免费 | 否(可买断) |
| 评分 | ★★★☆☆ |
Sublime Text 是一款老牌的 MacOS 编辑器,具有漂亮的用户界面和非凡的功能,可以安装各种各样的插件进行个性化调整。当然在 Visual Studio Code 问世以来,更多的用户开始选择免费的 Visual Studio Code,不过从性能上来说,个人感觉还是 Sublime Text 更胜一筹。

| Question | Answer |
|---|---|
| 免费 | 否(可买断,开源社区贡献者可免费使用) |
| 评分 | ★★★★★ |
Araxis Merge 是一款可视化文件对比合并同步工具,支持文本比较、图像比较、二进制比较、文件夹比较等功能,可以和上面介绍的 Tower 协同工作。如果你有使用过 Beyond Compare,可以试用一下 Araxis Merge,相信你能获得更棒的使用体验。

| Question | Answer |
|---|---|
| 免费 | 否(可买断) |
| 评分 | ★★★★★ |
Dash 是一个 API 文档浏览器和代码片段管理器。Dash自带了丰富的API文档,涉及各种主流的编程语言和框架,也可以生成自己的文档集或请求包含文档集。

| Question | Answer |
|---|---|
| 免费 | 是 |
| 评分 | ★★★★★ |
Qt Creator 是一款免费开源的 C++ 集成开发环境(IDE)。如果你是一个 C++ 的开发人员,虽然你可以不使用 Qt,但是可以使用 Qt Creator 来开发纯 C++ 项目。
]]>这篇主要介绍在 MacOS 上常用的一些网络工具,这些工具有不少也是常驻于上篇介绍的 Menu Bar Extras 部分,没有将这些也列为插件,主要是为了保证文章比较简短,可以让大家快速找到想要的部分。
这一部分就简单介绍一下,不具体展开了,因为大家还是要在一个安全可靠的网络下,做一个守法守纪的好公民。

| Question | Answer |
|---|---|
| 免费 | 否(可买断) |
| 评分 | ★★★★☆ |
Shimo 是一个专业的 VPN 工具,国内还是有不少比较大的企业(尤其是多省市分布的),访问内网服务的时候,需要经过公司统一的 VPN 网络。虽然 MacOS 上配置 VPN 不是很复杂,但是 Shimo 做到了更好的易用性和稳定性,并且支持的协议也非常多。

| Question | Answer |
|---|---|
| 免费 | 否(可买断) |
| 评分 | ★★★☆☆ |
Surge 据说是 MacOS 上科学上网最好用的工具了,但是价格过高,让人望而止步,另外这方面目前免费的应用也越来越多,性价比较低。

| Question | Answer |
|---|---|
| 免费 | 是 |
| 评分 | ★★★★★ |
ClashX 是一款免费开源的科学上网工具,应该是除了 Surge 外最佳可选了,功能强大,被大家广泛推荐。

| Question | Answer |
|---|---|
| 免费 | 否(可买断) |
| 评分 | ★★★★☆ |
Proxifier 是一款本地的代理客户端,可以制定复杂的网络规则,让不支持通过代理服务器工作的应用能通过本地代理网络访问互联网。Proxifier 可以很好的跟 ClashX 等代理应用搭配使用,获得最佳体验。唯一的缺点是,Proxifier 目前不能运行在后台,通过 Menu Bar Extras 上的图标进行操作,而必须占用一个 Dock 的位置。
上面刚刚提到的 Proxifier 其实也是一个很好的过滤工具,可以通过规则,将符合规则的互联网请求进行一定的处理,但是更多是代理方面的处理,所以没有放在这一段中。

| Question | Answer |
|---|---|
| 免费 | 否(可买断) |
| 评分 | ★★★★☆ |
Little Snitch 是一款个人安全防护软件,能防止应用在你不知道的情况下自动访问网络,并且可以查看应用访问互联网的具体情况,功能非常强大。

| Question | Answer |
|---|---|
| 免费 | 否(可买断) |
| 评分 | ★★★★★ |
AdGuard 是一个功能强大的广告和弹出窗口的拦截工具,适用于所有安装的浏览器。Adguard 可以去除烦人的页面广告,减少了页面加载时间,并节省大量的流量,还可以拦截跟踪器和危险的网站,保证一定的安全性。我作为一个不太看网页的用户,一年间累计拦截广告 107798 次,拦截跟踪器 300393 次,节省 20.98G 流量,其效果非常明显。
这部分其实没有太多可以介绍的,简单介绍一些大家可能不太了解的工具,例如说各类网盘、迅雷这种常见的就不介绍了。

| Question | Answer |
|---|---|
| 免费 | 是 |
| 评分 | ★★★★☆ |
Aria2GUI 是一款基于 aria2 的免费开源下载工具,可帮助简化不同设备和服务器之间的下载过程。它支持磁力链接、BT 种子、HTTP 等类型的文件下载,Aria2GUI 有着优秀的性能及较低的资源占用,尤其适合于下载 HTTP 类型的大文件。缺点是该项目于 2018 年已停止更新,只是功能处于可用的状态而已,很多细节其实并不完善。

| Question | Answer |
|---|---|
| 免费 | 否(可买断) |
| 评分 | ★★★★★ |
Transmit 是一款功能齐全的上传/下载客户端。支持 FTP、SFTP、WebDAV、Amazon S3 等等各类协议,直接通过文件拖拽就能实现上传/下载功能,非常方便。

| Question | Answer |
|---|---|
| 免费 | 否(可买断) |
| 评分 | ★★★★★ |
Downie 是一个超级易于使用的视频下载工具,支持 YouTube,Vimeo 等大部分主流视频网站。可以非常方便的将页面上的视频下载下来,这样可以在没有网络的环境下,继续观看。
这部分主要是有开发或者测试相关需求的应用,这里只简单介绍几款常见的,其他就不展开介绍了,毕竟大多数人不是从事开发相关工作的。

| Question | Answer |
|---|---|
| 免费 | 是 |
| 评分 | ★★★★★ |
Wireshark 是一款开源免费的跨平台抓包工具,应该没有比 Wireshark 更强大的抓包工具了,大多数网络相关的开发、测试、运维等,都使用该工具来分析调查网络问题。

| Question | Answer |
|---|---|
| 免费 | 否(可买断) |
| 评分 | ★★★★★ |
Paw 是一款强大的 HTTP 客户端工具,可以用于开发测试 OpenAPI。相比免费的 Postman 来说,它更加易用,功能也更加强大,有丰富的扩展插件,并且用户也可以很快很方便的开发属于自己的扩展插件。曾经有一段时间,可以在 Twitter 上免费领取,不知道你上车了没?

| Question | Answer |
|---|---|
| 免费 | 否(可买断) |
| 评分 | ★★★★★ |
Charles 是 MacOS 上最强大的 HTTP 请求抓包的工具,可以快速有效的获得请求以及回复的 HTTP 信息。
]]>MacOS 从界面整体上,分为三大部分:顶部的 Menu Bar,中间的应用/桌面区域,底部的 Dock。这里插件主要指的是可以进入到 Menu Bar Extras 部分的那些应用。推荐的这些应用大部分都是免费,或者是可买断并且价格不高的,付费的建议大家先试用,如果满意请付费,给开发者更多的支持!

必备部分的 App 是可以适合大部分使用场景,对于所有使用 MacOS 的人都有所帮助的应用。

| Question | Answer |
|---|---|
| 免费 | 是(高级功能需要付费,可买断) |
| 评分 | ★★★★★ |
Alfred 是一款被称之为 Mac 效率神器的 App,有了 Alfred 你甚至无需鼠标就可以实现各种操作。Alfred 基本功能是可以免费使用的,一些高级功能则需要付费开通,好处是可以一次性买断。
推荐的常用功能有:

| Question | Answer |
|---|---|
| 免费 | 否(可买断) |
| 评分 | ★★★★★ |
Bartender 是一款实用的 Menu Bar Extras 管理工具。当你安装了很多插件时,Menu Bar Extras 会变得越来越长,此时可以使用 Bartender 将部分 App 有选择放进 Bartender 的二级菜单,不仅会看起来更整洁,使用起来也不会造成太大的麻烦。
尤其是 Bartender 可以将一些只需要在后台执行,完全不需要关心的 App 永远的隐藏起来,甚至不出现在二级菜单中,将 Menu Bar Extras 变成一片净土。

| Question | Answer |
|---|---|
| 免费 | 是 |
| 评分 | ★★★★★ |
Quitter 是一款极其简单的 App,它可以将一段时间没有使用或者收到新消息的应用进行隐藏或者退出,如果你的 Mac 内存不是足够大,那它将是一个得力的助手。
另外 MacOS 上很多应用,当你关闭它时,它实际上并没有真正的退出,例如说打开一张图片后关闭,预览应用并没有退出,所以此时 Quitter 可以很好的帮助到你。
Quitter 是可以配置好以后,使用 Bartender 永远隐藏起来的应用之一。

| Question | Answer |
|---|---|
| 免费 | 是 |
| 评分 | ★★★★★ |
Itsycal 是一款极简的日历的 App,可以在 Menu Bar Extras 上快速查看日期和事件。当然 MacOS 上最强大的日历应用当属 Fantastical 了,但是它目前是订阅制,价格较贵,大多数的人也不会用到它强大的功能,所以性价比较低。

| Question | Answer |
|---|---|
| 免费 | 否(可买断) |
| 评分 | ★★★★★ |
PopClip 是类似于 iOS 上长按一段文字,弹出复制、剪切等快捷操作的 App。它会在你选择一段文字后,自动出现在文字上方可进行的操作,这些操作可以在官方 Extensions 中自行下载安装,并且可以自己根据需要编写新的 Extension。

| Question | Answer |
|---|---|
| 免费 | 是 |
| 评分 | ★★★★★ |
iShot(App Store 下载)是一款功能全面的录屏、区域截图、窗口截图、长截图、延时截图、快速标注、贴图神器,有的窗口需要权限而无法进行截图,而iShot的全屏延时截图很好的解决了这种情况。
一般来说大多数的截图可以用 QQ 或者微信来解决,但是稍微复杂的延时截图(可能在截取某些快捷菜单时使用)、滚动截图、录屏时,就很难解决了,而 iShot 是解决这些问题的最佳 App。
另外,iShot 这个 App 的开发者还有其他知名的应用,例如超级右键、自动切换输入法、FastZip 解压工具等,也是很受大家欢迎。
推荐部分的 App 不是适合于大多数场景的,但是如果你刚好在相同的场景下,那这些 App 也会变成一款必备的软件。

| Question | Answer |
|---|---|
| 免费 | 否(可买断) |
| 评分 | ★★★★☆ |
CleanMyMac 是一款 MacOS 垃圾清理工具,可以清除 MacOS 多余的语言包、系统缓存、应用程序,并可以检索大文件、重复文件等,是硬盘瘦身的好工具。美中不足的是,在卸载应用程序时,没有将应用的一些缓存文件一起清理掉。

| Question | Answer |
|---|---|
| 免费 | 否(可买断) |
| 评分 | ★★★★★ |
Magnet(App Store 下载)是一款窗口管理工具,可以方便的管理桌面多窗口的布局和排列,也可以将一个窗口从一个屏幕移动到另外一个屏幕,并且支持快捷键操作。
当然,窗口管理工具可能有很多种,在试用了几种相关的 App 之后,Magnet 不是功能最强大的,但是基本功能足够使用,质量非常可靠,性价比也是最高的一款。

| Question | Answer |
|---|---|
| 免费 | 否(可买断) |
| 评分 | ★★★★★ |
Boom 3D 是一款音效增强和 3D 环绕音应用。如果让我从所有插件中只选一种的话,也许就是它了吧,我依旧记得第一次试用它时(当时是上一个版本 Boom2),被那种音效深深震撼着,发现再也离不开它了。
在这繁杂的生活中,听音乐与读书可能是唯一能让灵魂稍微放松的方式了吧,Boom 3D 可以更好的让你沉浸在这稍纵即逝的时光中。
不只是音效增强,它还可以控制每一个软件的音量,也可以控制输出音频的设备,也可以在某些工作场景中给到得力的帮助。

| Question | Answer |
|---|---|
| 免费 | 否(可买断) |
| 评分 | ★★★★★ |
Sip 是一款小巧、方便的取色软件,你只需要鼠标点一下即可取得当前位置的颜色值,并将数据自动存到剪切板,方便随时粘贴出来。

| Question | Answer |
|---|---|
| 免费 | 否(可买断) |
| 评分 | ★★★★★ |
SnippetsLab 是一个功能齐全、优雅且易于使用的代码收集及管理工具。支持多达 440 种语言的代码高亮、Markdown 编辑与预览,以及强大的组织和搜索功能;它的目标是帮助构建您的个人编程知识仓库,并确保您可以随时轻松访问它们。
并且 SnippetsLab 可以和 Alfred Workflow 搭配使用,使得搜索更加方便,是程序员日常工作的得力助手。

| Question | Answer |
|---|---|
| 免费 | 否(可买断) |
| 评分 | ★★★★☆ |
NTFS for Mac 是 MacOS 下读写 NTFS 格式磁盘的工具。在 MacOS 下,NTFS 格式的磁盘默认是只读的,所以只能访问磁盘上的文件,但是不能写入或者修改文件,这时就需要使用 NTFS for Mac 了。
试用了几款不同的 NTFS 磁盘 App,NTFS for Mac 是性能和稳定性最好的一款。缺点是价格较高,并且支持更多格式的磁盘,例如说 extFS,都需要再次购买,性价比较低。
这些 App 要看个人喜好,有些虽然没有什么实际的作用,但是会很有趣,但是还是相当推荐的。

| Question | Answer |
|---|---|
| 免费 | 否(可买断) |
| 评分 | ★★★★★ |
Dynamic Wallpaper(App Store 下载)是一款动态壁纸引擎,可以将动态视频作为壁纸,告别单调的静态壁纸。Dynamic Wallpaper 壁纸资源更新频率很高,并且价格很低,从下载壁纸使用的服务器带宽成本来说,已经非常实惠了,只能说非常感谢这个开发者给我们带来了这么优秀的作品。

| Question | Answer |
|---|---|
| 免费 | 否(可买断) |
| 评分 | ★★★★★ |
Typinator 是一款可以快速输入文字的 App,通过设置快速输入文字的缩略字符,如设置 address 的缩略字符为 addr,然后输入 addr 时,会自动替换为 address,对于经常要输入重复字符的工作很有帮助。

| Question | Answer |
|---|---|
| 免费 | 是 |
| 评分 | ★★★★★ |
MTMR My TouchBar My Rules,虽然 Apple 终于已经放弃了 TouchBar,但是对于现存的带有 TouchBar 的 MacBook 来说,MTMR 让 TouchBar 变得更有用。并且 MTMR 是一款开源的 App,你可以在这个基础上,做出更加出色的功能。

| Question | Answer |
|---|---|
| 免费 | 否(可买断) |
| 评分 | ★★★★☆ |
FilePane 是一个简单实用的文件快速处理工具,通过简单的拖拽,便可以实现文件的一些快速操作,例如拷贝、移动、分享、编辑、删除等等。如果日常有很多文件类的操作,可以很好的通过简单的拖拽来解决。
如果能够跟 PopClip 那样添加各种个样的 Extensions,或者自定义操作、菜单等,那就非常完美了。

| Question | Answer |
|---|---|
| 免费 | 否(可买断) |
| 评分 | ★★★★☆ |
Moment 是一款倒数日应用,可以创建倒数日、时间进度条、纪念日、生日等。唯一美中不足的是,目前还不支持农历,想要计算农历的日期,就很困难了。

| Question | Answer |
|---|---|
| 免费 | 是 |
| 评分 | ★★★★★ |
RunCat 是一个非常有趣的 MacOS 监控软件,它是一个根据 CPU 使用率来奔跑的小猫,当 CPU 使用率越高时,小猫会跑的越来越快。当然它不止提供 CPU 的监控,内存、硬盘、网络的监控数据都有支持。

| Question | Answer |
|---|---|
| 免费 | 是 |
| 评分 | ★★★★★ |
Battery Buddy 是带有表情的电池容量显示软件,能够根据电池的不同状态,展示不同的表情。当电量充裕或充电时,会展现微笑表情;当电池容量过半时,会展现冷漠脸;当电量不足时,会展现悲伤表情。当然它没有任何定制化的功能,仅此而已,但是非常有趣。

| Question | Answer |
|---|---|
| 免费 | 是 |
| 评分 | ★★★☆☆ |
MenubarX 还是一个刚发布不久的 App,是一个位于 Menu Bar Extras 的浏览器,可以固定任何网页,就像原生 App 一样使用。刚开始使用,稳定性和兼容性都不是特别出色,并且网页的显示也决定于网页的实际内容,对于没有针对手机优化过的网页来说,就是一个灾难,只能说期待未来有更出色的表现。
]]>使用 go mod 命令初始化目录,此步骤会创建 go.mod,go.sum 等文件。
# 例如
go mod init github.com/winking324/rzap
go mod tidy
可以参考 Standard Go Project Layout 进行目录结构的创建。
]]>用多级标题、行首缩进、下划线和数字编号等方法,突出文章的整体结构。
http://192.168.1.1/manager_dev_config_t.gch,选择导出配置;offzip.exe -a config.bin . 0 来解压配置文件;telecomadmin,对应的密码在相同位置;http://192.168.1.1,输入对应的用户名密码,登陆成功;192.168.1.5,则填写这个地址;They are recorded in:-
/usr/include/asm/errno.h
Here is a copy of that file as of Aug 2004 on RedHat 7.3
#define EPERM 1 /* Operation not permitted */
#define ENOENT 2 /* No such file or directory */
#define ESRCH 3 /* No such process */
#define EINTR 4 /* Interrupted system call */
#define EIO 5 /* I/O error */
#define ENXIO 6 /* No such device or address */
#define E2BIG 7 /* Arg list too long */
#define ENOEXEC 8 /* Exec format error */
#define EBADF 9 /* Bad file number */
#define ECHILD 10 /* No child processes */
#define EAGAIN 11 /* Try again */
#define ENOMEM 12 /* Out of memory */
#define EACCES 13 /* Permission denied */
#define EFAULT 14 /* Bad address */
#define ENOTBLK 15 /* Block device required */
#define EBUSY 16 /* Device or resource busy */
#define EEXIST 17 /* File exists */
#define EXDEV 18 /* Cross-device link */
#define ENODEV 19 /* No such device */
#define ENOTDIR 20 /* Not a directory */
#define EISDIR 21 /* Is a directory */
#define EINVAL 22 /* Invalid argument */
#define ENFILE 23 /* File table overflow */
#define EMFILE 24 /* Too many open files */
#define ENOTTY 25 /* Not a typewriter */
#define ETXTBSY 26 /* Text file busy */
#define EFBIG 27 /* File too large */
#define ENOSPC 28 /* No space left on device */
#define ESPIPE 29 /* Illegal seek */
#define EROFS 30 /* Read-only file system */
#define EMLINK 31 /* Too many links */
#define EPIPE 32 /* Broken pipe */
#define EDOM 33 /* Math argument out of domain of func */
#define ERANGE 34 /* Math result not representable */
#define EDEADLK 35 /* Resource deadlock would occur */
#define ENAMETOOLONG 36 /* File name too long */
#define ENOLCK 37 /* No record locks available */
#define ENOSYS 38 /* Function not implemented */
#define ENOTEMPTY 39 /* Directory not empty */
#define ELOOP 40 /* Too many symbolic links encountered */
#define EWOULDBLOCK EAGAIN /* Operation would block */
#define ENOMSG 42 /* No message of desired type */
#define EIDRM 43 /* Identifier removed */
#define ECHRNG 44 /* Channel number out of range */
#define EL2NSYNC 45 /* Level 2 not synchronized */
#define EL3HLT 46 /* Level 3 halted */
#define EL3RST 47 /* Level 3 reset */
#define ELNRNG 48 /* Link number out of range */
#define EUNATCH 49 /* Protocol driver not attached */
#define ENOCSI 50 /* No CSI structure available */
#define EL2HLT 51 /* Level 2 halted */
#define EBADE 52 /* Invalid exchange */
#define EBADR 53 /* Invalid request descriptor */
#define EXFULL 54 /* Exchange full */
#define ENOANO 55 /* No anode */
#define EBADRQC 56 /* Invalid request code */
#define EBADSLT 57 /* Invalid slot */
#define EDEADLOCK EDEADLK
#define EBFONT 59 /* Bad font file format */
#define ENOSTR 60 /* Device not a stream */
#define ENODATA 61 /* No data available */
#define ETIME 62 /* Timer expired */
#define ENOSR 63 /* Out of streams resources */
#define ENONET 64 /* Machine is not on the network */
#define ENOPKG 65 /* Package not installed */
#define EREMOTE 66 /* Object is remote */
#define ENOLINK 67 /* Link has been severed */
#define EADV 68 /* Advertise error */
#define ESRMNT 69 /* Srmount error */
#define ECOMM 70 /* Communication error on send */
#define EPROTO 71 /* Protocol error */
#define EMULTIHOP 72 /* Multihop attempted */
#define EDOTDOT 73 /* RFS specific error */
#define EBADMSG 74 /* Not a data message */
#define EOVERFLOW 75 /* Value too large for defined data type */
#define ENOTUNIQ 76 /* Name not unique on network */
#define EBADFD 77 /* File descriptor in bad state */
#define EREMCHG 78 /* Remote address changed */
#define ELIBACC 79 /* Can not access a needed shared library */
#define ELIBBAD 80 /* Accessing a corrupted shared library */
#define ELIBSCN 81 /* .lib section in a.out corrupted */
#define ELIBMAX 82 /* Attempting to link in too many shared libraries */
#define ELIBEXEC 83 /* Cannot exec a shared library directly */
#define EILSEQ 84 /* Illegal byte sequence */
#define ERESTART 85 /* Interrupted system call should be restarted */
#define ESTRPIPE 86 /* Streams pipe error */
#define EUSERS 87 /* Too many users */
#define ENOTSOCK 88 /* Socket operation on non-socket */
#define EDESTADDRREQ 89 /* Destination address required */
#define EMSGSIZE 90 /* Message too long */
#define EPROTOTYPE 91 /* Protocol wrong type for socket */
#define ENOPROTOOPT 92 /* Protocol not available */
#define EPROTONOSUPPORT 93 /* Protocol not supported */
#define ESOCKTNOSUPPORT 94 /* Socket type not supported */
#define EOPNOTSUPP 95 /* Operation not supported on transport endpoint */
#define EPFNOSUPPORT 96 /* Protocol family not supported */
#define EAFNOSUPPORT 97 /* Address family not supported by protocol */
#define EADDRINUSE 98 /* Address already in use */
#define EADDRNOTAVAIL 99 /* Cannot assign requested address */
#define ENETDOWN 100 /* Network is down */
#define ENETUNREACH 101 /* Network is unreachable */
#define ENETRESET 102 /* Network dropped connection because of reset */
#define ECONNABORTED 103 /* Software caused connection abort */
#define ECONNRESET 104 /* Connection reset by peer */
#define ENOBUFS 105 /* No buffer space available */
#define EISCONN 106 /* Transport endpoint is already connected */
#define ENOTCONN 107 /* Transport endpoint is not connected */
#define ESHUTDOWN 108 /* Cannot send after transport endpoint shutdown */
#define ETOOMANYREFS 109 /* Too many references: cannot splice */
#define ETIMEDOUT 110 /* Connection timed out */
#define ECONNREFUSED 111 /* Connection refused */
#define EHOSTDOWN 112 /* Host is down */
#define EHOSTUNREACH 113 /* No route to host */
#define EALREADY 114 /* Operation already in progress */
#define EINPROGRESS 115 /* Operation now in progress */
#define ESTALE 116 /* Stale NFS file handle */
#define EUCLEAN 117 /* Structure needs cleaning */
#define ENOTNAM 118 /* Not a XENIX named type file */
#define ENAVAIL 119 /* No XENIX semaphores available */
#define EISNAM 120 /* Is a named type file */
#define EREMOTEIO 121 /* Remote I/O error */
#define EDQUOT 122 /* Quota exceeded */
#define ENOMEDIUM 123 /* No medium found */
#define EMEDIUMTYPE 124 /* Wrong medium type */
Reference:
]]>这里把踩过的一些坑整理一下。
]]>这里把踩过的一些坑整理一下。
安装 APScheduler(Advanced Python Scheduler):
sudo pip3 install apscheduler
一个简单的定时任务如下:
import sys
import time
import atexit
from apscheduler.schedulers.background import BackgroundScheduler
def task():
sys.stdout.write('\nrun task\n')
sys.stdout.flush()
def main():
scheduler = BackgroundScheduler()
scheduler.add_job(func=task, trigger="interval", seconds=10)
scheduler.start()
atexit.register(lambda: scheduler.shutdown())
for i in range(60):
sys.stdout.write('.')
sys.stdout.flush()
time.sleep(1)
if __name__ == '__main__':
main()
输出内容如下:
..........
run task
..........
run task
..........
run task
..........
run task
..........
run task
..........
run task
这个简单的测试代码,说明了以下问题:
定时任务不是 start 时候立即执行,而是到期后执行第一次,所以对于读取数据库的任务,应该先调用触发一次,否则会有一段时间没有任何数据。
在 uwsgi + Flask 中使用 APScheduler 时,出现了以下问题:
当 uwsgi 设置 processes 个数不为 0 时,APScheduler 定期读取数据库更新的数据,只在父进程得到了更新,而在 worker 子进程中的数据没有更新。所以当用户请求到 worker 进程时,会获取最新的数据失败。
为了解决这个问题,尝试使用了几种方式:
以上两个方式,最终均以失败告终,原因如下:
解决这个问题,有两种方式:
这里使用第二种方式,第 1 种方式需要自己来单独写服务,并且要保证服务的可用性,其实实现难度增大。并且使用 Flask-APScheduler 来提供统一的 APScheduler。
安装 Flask-APScheduler:
sudo pip3 install Flask-APScheduler
实现逻辑如下:
import redis
import pymysql
import flask
import logging
from flask_apscheduler import APScheduler
app = flask.Flask(__name__)
app.logger.setLevel(logging.INFO)
app.config.from_mapping(
JOBS=[{
'id': 'reload_server',
'func': 'app:reload_server',
'args': (app.logger,),
'trigger': 'interval',
'seconds': 60
}],
SCHEDULER_API_ENABLED=True,
)
reload_scheduler = APScheduler()
reload_scheduler.init_app(app)
reload_scheduler.start()
redis_pool = redis.ConnectionPool(decode_responses=True)
redis_client = redis.Redis(connection_pool=redis_pool)
def reload_server(logger):
logger.info('reload servers scheduler start')
conn = pymysql.connect(host='127.0.0.1', port=3306,
user='root', passwd='root',
db='servers')
exec_sql = 'SELECT `ip` FROM `servers`'
cur = conn.cursor()
cur.execute(exec_sql)
for ip in cur:
redis_client.set(ip, '', ex=60)
conn.close()
logger.info('reload servers scheduler stop')
if __name__ == '__main__':
app.run()
在子进程中,则可以直接通过 redis 来读取数据。
测试过程中,发现 redis 从远端 mysql 获取到数据写到本地,速度是有点慢的,几千条数据需要花费几秒才能结束,所以针对写操作部分,进行了一定的优化。
使用 pipeline 的方式批量写入 redis:
def reload_server(logger):
logger.info('reload servers scheduler start')
conn = pymysql.connect(host='127.0.0.1', port=3306,
user='root', passwd='root',
db='servers')
exec_sql = 'SELECT `ip` FROM `servers`'
cur = conn.cursor()
cur.execute(exec_sql)
with redis_client.pipeline(transaction=False) as pipe:
for ip in cur:
pipe.set(ip, '', ex=60)
pipe.execute()
conn.close()
logger.info('reload servers scheduler stop')
]]>设备:
工具:
打包地址:
百度网盘 提取码: nb2k
这里安装的系统是 Armbian,是一个轻量级的 Debian 系统和为 ARM 开发板专门发行并重新编译的 Debian 系统。
Armbian_5.77_Aml-s905_Debian_stretch_default_5.1.0-rc1_20190408以boot以加入dtd、extlinux、uEnv.ini.img.xz 解压;Armbian_5.77_Aml-s905_Debian_stretch_default_5.1.0-rc1_20190408以boot以加入dtd、extlinux、uEnv.ini.img 烧录到 U 盘中;Mac 中,首先要安装 Android 工具包:
brew cask install android-platform-tools
N1 接入网络并插入电源上电;
查看 N1 的 IP,这里假设为 192.168.1.30;
在终端工具中输入 adb connect 192.168.1.30:5555 连上 N1;
在终端工具中输入 adb shell reboot update 使 N1 重启进入刷机模式;
此时立即插入 U 盘到 HDMI 旁边的 USB 口;
等待刷机结束;
刷机结束后,会在控制台中显示 IP(假设仍为 192.168.1.30)和 Login 提示;
在终端工具中输入 ssh [email protected],密码 1234 登陆到 Armbian 中;

随便输入一个新的密码(因为后面会重新刷系统,这个密码只是临时用);
提示创建用户,按 Ctrl-C 取消;
Windows 中,可以使用之前 N1 刷机工具中的 使N1进入线刷模式.zip 中脚本来代替第 3、4 步的操作。
完成上面的 Armbian 系统的安装后,此时已经在 Armbian 系统中了,接下来需要将 FastNas 作者已经打好的系统包:BACKUP-s9xxx-emmc.img.gz,刷到 N1 上。
打开一个新的终端,将文件传到 N1 上(Windows 中可以使用 WinSCP 等工具来上传文件);
scp -C -r BACKUP-s9xxx-emmc.img.gz [email protected]:~/
在已经登陆 N1 的终端中,将文件放到 /ddbr 路径下:
mkdir -p /ddbr
mv BACKUP-s9xxx-emmc.img.gz /ddbr
执行 ddbr 命令进行 FastNas 安装:

执行 poweroff 将 N1 盒子关机;
拔掉 U 盘,并重新上电开机;
开机完成后,就已经进入了安装好 FastNas 的系统了,此时用户名为 root,密码为 media1984。
目前系统的内核有个问题,每次重启,MAC 地址会变化,所以如果使用 DHCP 方式获取 IP,会导致每次重启,N1 的 IP 都发生变化。
解决的办法如下:
终端登陆 N1;
vi 打开编辑 /etc/network/interfaces 文件;
增加 hwaddress ether 6a:c8:0b:05:88:52 到 eth0(有线)配置中;

输入 reboot 重启,可以看到 MAC 地址不会再发生变化;
如果使用无线网络,使用 armbian-config 命令进行无线网络的配置。
在电脑中,打开浏览器,输入 http://192.168.1.30,便可以进入 OpenMediaVault 系统(用户名:admin,密码:openmediavault)。

但是看到斐讯 T1 盒子预留了红外模块,并且可以直接用红外遥控控制,所以又买了一个斐讯 T1 盒子,来达到红外控制的目的。
]]>但是看到斐讯 T1 盒子预留了红外模块,并且可以直接用红外遥控控制,所以又买了一个斐讯 T1 盒子,来达到红外控制的目的。
拿到盒子第一时间,不用说,先进行刷机,步骤和 N1 几乎完全一样,所以不再赘述,可以参考 N1 盒子来进行刷机。
这里唯一需要说明的是:
T1 在开机后,需要链接网络并进行账号注册,才能激活。需要跳过这一个步骤,进入到系统中,打开远程调试。
首先,扫描 T1 包装盒上面的二维码,下载手机遥控器 App:

这样用遥控器设置链接网络之后,就可以使用手机遥控 App 来操作 T1 盒子,此时按手机遥控 App 上的菜单按钮,就可以跳过注册,直接进入到盒子中了,并在设置中打开远程调试。
刷完机之后,关机,准备安装红外模块。
撕开一点防滑条,将后盖拆下来;

给红外模块开一个孔,这里我用乐高(伪,如图后面的小车)的一个透明块,挡在中间;

开孔结束,把乐高透明块放在中间;

拆下主板,将红外模块焊接在上面;

用小米手机的红外遥控测试工作是否正常,这里我用开博尔这个牌子的遥控,可以完美遥控,距离四到五米都没啥问题;

工作正常,将主板和盒子安装回去;
