https://winking324.github.io Winking 2022-01-28T02:46:12.245Z https://github.com/jpmonette/feed 还愣着干啥!点赞啊! https://winking324.github.io/images/avatar.png https://winking324.github.io/favicon.ico All rights reserved 2022, Winking <![CDATA[MacOS 必备应用 - 日常篇]]> https://winking324.github.io/post/macos-apps-daily/ 2022-01-27T11:24:26.000Z 工欲善其事,必先利其器。对比 Windows 来说,MacOS 是一个干净纯粹的系统,8 年前,当我第一次用上这个系统时,我就立马跟 Windows 说“再见”了。这么多年使用下来,沉淀了一些对于开发者来说是必备的应用。当然大部分对于普通用户来说,也可以说是必备利器,能让你更好的上手 MacOS,然后拍手称快!

]]>
工欲善其事,必先利其器。对比 Windows 来说,MacOS 是一个干净纯粹的系统,8 年前,当我第一次用上这个系统时,我就立马跟 Windows 说“再见”了。这么多年使用下来,沉淀了一些对于开发者来说是必备的应用。当然大部分对于普通用户来说,也可以说是必备利器,能让你更好的上手 MacOS,然后拍手称快!

本篇的应用基本上是经常被使用到的,日常的部分是基本上每天都会用到的,偶尔的部分则是经常用的,开发部分则由于工作原因经常是用的,这部分可以选择性的看下就好了。

1 日常

下面的这些工具基本上是每天中大概率会被用到的,所以优先推荐给大家。

1.1 1Password

Question Answer
免费 是(订阅制,如果用 iCloud 同步可以免费)
评分 ★★★★★

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

1.2 BetterZip

Question Answer
免费 否(可买断)
评分 ★★★★☆

BetterZip 是一个压缩、解压软件,虽然有时候解压文本的时候,会出现一些意外的乱码,但是整体上跟免费的压缩、解压软件对比起来,功能已经算是非常完善、易用。

1.3 Spark

Question Answer
免费
评分 ★★★★★

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

1.4 Typora

Question Answer
免费 否(可买断)
评分 ★★★★★

Typora 是一个功能强大的 Markdown 编辑器,会即时渲染编写的 Markdown 内容,之前是免费,从 1.0 正式版开始收费,功能非常强大。如果想使用免费的 Markdown 编辑器,推荐使用 MacDown,也是一款很不错的选择。

2 偶尔

这部分虽然不是每天使用,但也是基本上经常用的,都是很棒的应用,推荐给大家。

2.1 Gridea

Question Answer
免费
评分 ★★★★★

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

2.2 Movist Pro

Question Answer
免费 否(可买断)
评分 ★★★★★

Movist Pro 是一个功能强大的视频播放器,是 MacOS 上最强大好用的视频播放器也不为过。可以轻松的播放 4K 高清视频,方便的切换音轨、字幕等,支持所有常见的视频格式。

2.3 OmniGraffle

Question Answer
免费 否(可买断)
评分 ★★★☆☆

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

2.4 Parallels Desktop

Question Answer
免费 否(可买断)
评分 ★★★★☆

Parallels Desktop 是一款虚拟机软件,但是一般主要用于在 MacOS 上安装 Windows 虚拟机,它可以无缝的将 MacOS 和 Windows 两个系统融合在一起,让你可以非常友好、无缝的使用 Windows 的应用。如果你偶尔有使用 Windows 应用的需要,这个应用可以很好的满足你的需要(玩大型游戏的就不要指望了)。

3 开发

开发部分就是看大家喜好了,有些可以全部用 Vim 来开发,像我这种则喜欢尝试乱七八糟的应用,把合适的应用放在合适的场景上。当然,大家常用的 Xcode、jetbrains 家族、Visual Studio Code 这些,我就不在这里介绍了。

3.1 iTerm 2

Question Answer
免费
评分 ★★★★★

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

3.2 Tower

Question Answer
免费 否(订阅)
评分 ★★☆☆☆

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

3.3 Sublime Text

Question Answer
免费 否(可买断)
评分 ★★★☆☆

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

3.4 Araxis Merge

Question Answer
免费 否(可买断,开源社区贡献者可免费使用)
评分 ★★★★★

Araxis Merge 是一款可视化文件对比合并同步工具,支持文本比较、图像比较、二进制比较、文件夹比较等功能,可以和上面介绍的 Tower 协同工作。如果你有使用过 Beyond Compare,可以试用一下 Araxis Merge,相信你能获得更棒的使用体验。

3.5 Dash

Question Answer
免费 否(可买断)
评分 ★★★★★

Dash 是一个 API 文档浏览器和代码片段管理器。Dash自带了丰富的API文档,涉及各种主流的编程语言和框架,也可以生成自己的文档集或请求包含文档集。

3.6 Qt Creator

Question Answer
免费
评分 ★★★★★

Qt Creator 是一款免费开源的 C++ 集成开发环境(IDE)。如果你是一个 C++ 的开发人员,虽然你可以不使用 Qt,但是可以使用 Qt Creator 来开发纯 C++ 项目。

]]>
<![CDATA[MacOS 必备应用 - 网络篇]]> https://winking324.github.io/post/macos-apps-network/ 2022-01-25T11:13:25.000Z 工欲善其事,必先利其器。对比 Windows 来说,MacOS 是一个干净纯粹的系统,8 年前,当我第一次用上这个系统时,我就立马跟 Windows 说“再见”了。这么多年使用下来,沉淀了一些对于开发者来说是必备的应用。当然大部分对于普通用户来说,也可以说是必备利器,能让你更好的上手 MacOS,然后拍手称快!

]]>
工欲善其事,必先利其器。对比 Windows 来说,MacOS 是一个干净纯粹的系统,8 年前,当我第一次用上这个系统时,我就立马跟 Windows 说“再见”了。这么多年使用下来,沉淀了一些对于开发者来说是必备的应用。当然大部分对于普通用户来说,也可以说是必备利器,能让你更好的上手 MacOS,然后拍手称快!

这篇主要介绍在 MacOS 上常用的一些网络工具,这些工具有不少也是常驻于上篇介绍的 Menu Bar Extras 部分,没有将这些也列为插件,主要是为了保证文章比较简短,可以让大家快速找到想要的部分。

1 代理

这一部分就简单介绍一下,不具体展开了,因为大家还是要在一个安全可靠的网络下,做一个守法守纪的好公民。

1.1 Shimo

Question Answer
免费 否(可买断)
评分 ★★★★☆

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

1.2 Surge

Question Answer
免费 否(可买断)
评分 ★★★☆☆

Surge 据说是 MacOS 上科学上网最好用的工具了,但是价格过高,让人望而止步,另外这方面目前免费的应用也越来越多,性价比较低。

1.3 ClashX

Question Answer
免费
评分 ★★★★★

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

1.4 Proxifier

Question Answer
免费 否(可买断)
评分 ★★★★☆

Proxifier 是一款本地的代理客户端,可以制定复杂的网络规则,让不支持通过代理服务器工作的应用能通过本地代理网络访问互联网。Proxifier 可以很好的跟 ClashX 等代理应用搭配使用,获得最佳体验。唯一的缺点是,Proxifier 目前不能运行在后台,通过 Menu Bar Extras 上的图标进行操作,而必须占用一个 Dock 的位置。

2 过滤

上面刚刚提到的 Proxifier 其实也是一个很好的过滤工具,可以通过规则,将符合规则的互联网请求进行一定的处理,但是更多是代理方面的处理,所以没有放在这一段中。

2.1 Little Snitch

Question Answer
免费 否(可买断)
评分 ★★★★☆

Little Snitch 是一款个人安全防护软件,能防止应用在你不知道的情况下自动访问网络,并且可以查看应用访问互联网的具体情况,功能非常强大。

2.2 AdGurad

Question Answer
免费 否(可买断)
评分 ★★★★★

AdGuard 是一个功能强大的广告和弹出窗口的拦截工具,适用于所有安装的浏览器。Adguard 可以去除烦人的页面广告,减少了页面加载时间,并节省大量的流量,还可以拦截跟踪器和危险的网站,保证一定的安全性。我作为一个不太看网页的用户,一年间累计拦截广告 107798 次,拦截跟踪器 300393 次,节省 20.98G 流量,其效果非常明显。

3 下载/上传

这部分其实没有太多可以介绍的,简单介绍一些大家可能不太了解的工具,例如说各类网盘、迅雷这种常见的就不介绍了。

3.1 Aria2GUI

Question Answer
免费
评分 ★★★★☆

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

3.2 Transmit

Question Answer
免费 否(可买断)
评分 ★★★★★

Transmit 是一款功能齐全的上传/下载客户端。支持 FTP、SFTP、WebDAV、Amazon S3 等等各类协议,直接通过文件拖拽就能实现上传/下载功能,非常方便。

3.3 Downie

Question Answer
免费 否(可买断)
评分 ★★★★★

Downie 是一个超级易于使用的视频下载工具,支持 YouTube,Vimeo 等大部分主流视频网站。可以非常方便的将页面上的视频下载下来,这样可以在没有网络的环境下,继续观看。

4 开发

这部分主要是有开发或者测试相关需求的应用,这里只简单介绍几款常见的,其他就不展开介绍了,毕竟大多数人不是从事开发相关工作的。

4.1 Wireshark

Question Answer
免费
评分 ★★★★★

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

4.2 Paw

Question Answer
免费 否(可买断)
评分 ★★★★★

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

4.3 Charles

Question Answer
免费 否(可买断)
评分 ★★★★★

Charles 是 MacOS 上最强大的 HTTP 请求抓包的工具,可以快速有效的获得请求以及回复的 HTTP 信息。

]]>
<![CDATA[MacOS 必备应用 - 插件篇]]> https://winking324.github.io/post/macos-apps-plugins/ 2022-01-19T11:15:59.000Z 工欲善其事,必先利其器。对比 Windows 来说,MacOS 是一个干净纯粹的系统,8 年前,当我第一次用上这个系统时,我就立马跟 Windows 说“再见”了。这么多年使用下来,沉淀了一些对于开发者来说是必备的应用。当然大部分对于普通用户来说,也可以说是必备利器,能让你更好的上手 MacOS,然后拍手称快!

]]>
工欲善其事,必先利其器。对比 Windows 来说,MacOS 是一个干净纯粹的系统,8 年前,当我第一次用上这个系统时,我就立马跟 Windows 说“再见”了。这么多年使用下来,沉淀了一些对于开发者来说是必备的应用。当然大部分对于普通用户来说,也可以说是必备利器,能让你更好的上手 MacOS,然后拍手称快!

MacOS 从界面整体上,分为三大部分:顶部的 Menu Bar,中间的应用/桌面区域,底部的 Dock。这里插件主要指的是可以进入到 Menu Bar Extras 部分的那些应用。推荐的这些应用大部分都是免费,或者是可买断并且价格不高的,付费的建议大家先试用,如果满意请付费,给开发者更多的支持!

1 必备的

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

1.1 Alfred

Question Answer
免费 是(高级功能需要付费,可买断)
评分 ★★★★★

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

推荐的常用功能有:

  • 输入 App 名字打开 App;
  • 打开粘贴板历史,快速查找并粘贴历史内容,这样可以省的安装一个粘贴板管理 App;
  • 查找并打开浏览器书签;
  • 查找并打开文件;
  • 安装或者自己编写 Workflow,和其他 App 互动,进一步提高工作效率;

1.2 Bartender

Question Answer
免费 否(可买断)
评分 ★★★★★

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

1.3 Quitter

Question Answer
免费
评分 ★★★★★

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

1.4 Itsycal

Question Answer
免费
评分 ★★★★★

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

1.5 PopClip

Question Answer
免费 否(可买断)
评分 ★★★★★

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

1.6 iShot

Question Answer
免费
评分 ★★★★★

iShot(App Store 下载)是一款功能全面的录屏、区域截图、窗口截图、长截图、延时截图、快速标注、贴图神器,有的窗口需要权限而无法进行截图,而iShot的全屏延时截图很好的解决了这种情况。
一般来说大多数的截图可以用 QQ 或者微信来解决,但是稍微复杂的延时截图(可能在截取某些快捷菜单时使用)、滚动截图、录屏时,就很难解决了,而 iShot 是解决这些问题的最佳 App。
另外,iShot 这个 App 的开发者还有其他知名的应用,例如超级右键、自动切换输入法、FastZip 解压工具等,也是很受大家欢迎。

2 推荐的

推荐部分的 App 不是适合于大多数场景的,但是如果你刚好在相同的场景下,那这些 App 也会变成一款必备的软件。

2.1 Clean My Mac

Question Answer
免费 否(可买断)
评分 ★★★★☆

CleanMyMac 是一款 MacOS 垃圾清理工具,可以清除 MacOS 多余的语言包、系统缓存、应用程序,并可以检索大文件、重复文件等,是硬盘瘦身的好工具。美中不足的是,在卸载应用程序时,没有将应用的一些缓存文件一起清理掉。

2.2 Magnet

Question Answer
免费 否(可买断)
评分 ★★★★★

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

2.3 Boom 3D

Question Answer
免费 否(可买断)
评分 ★★★★★

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

2.4 Sip

Question Answer
免费 否(可买断)
评分 ★★★★★

Sip 是一款小巧、方便的取色软件,你只需要鼠标点一下即可取得当前位置的颜色值,并将数据自动存到剪切板,方便随时粘贴出来。

2.5 SnippetsLab

Question Answer
免费 否(可买断)
评分 ★★★★★

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

2.6 NTFS for Mac

Question Answer
免费 否(可买断)
评分 ★★★★☆

NTFS for Mac 是 MacOS 下读写 NTFS 格式磁盘的工具。在 MacOS 下,NTFS 格式的磁盘默认是只读的,所以只能访问磁盘上的文件,但是不能写入或者修改文件,这时就需要使用 NTFS for Mac 了。
试用了几款不同的 NTFS 磁盘 App,NTFS for Mac 是性能和稳定性最好的一款。缺点是价格较高,并且支持更多格式的磁盘,例如说 extFS,都需要再次购买,性价比较低。

3 其他的

这些 App 要看个人喜好,有些虽然没有什么实际的作用,但是会很有趣,但是还是相当推荐的。

3.1 Dynamic Wallpaper

Question Answer
免费 否(可买断)
评分 ★★★★★

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

3.2 Typinator

Question Answer
免费 否(可买断)
评分 ★★★★★

Typinator 是一款可以快速输入文字的 App,通过设置快速输入文字的缩略字符,如设置 address 的缩略字符为 addr,然后输入 addr 时,会自动替换为 address,对于经常要输入重复字符的工作很有帮助。

3.3 MTMR

Question Answer
免费
评分 ★★★★★

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

3.4 FilePane

Question Answer
免费 否(可买断)
评分 ★★★★☆

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

3.5 Moment

Question Answer
免费 否(可买断)
评分 ★★★★☆

Moment 是一款倒数日应用,可以创建倒数日、时间进度条、纪念日、生日等。唯一美中不足的是,目前还不支持农历,想要计算农历的日期,就很困难了。

3.6 RunCat

Question Answer
免费
评分 ★★★★★

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

3.7 Battery Buddy

Question Answer
免费
评分 ★★★★★

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

3.8 MenubarX

Question Answer
免费
评分 ★★★☆☆

MenubarX 还是一个刚发布不久的 App,是一个位于 Menu Bar Extras 的浏览器,可以固定任何网页,就像原生 App 一样使用。刚开始使用,稳定性和兼容性都不是特别出色,并且网页的显示也决定于网页的实际内容,对于没有针对手机优化过的网页来说,就是一个灾难,只能说期待未来有更出色的表现。

]]>
<![CDATA[GoCookbook - 初始化]]> https://winking324.github.io/post/gocookbook-init/ 2022-01-18T11:45:09.000Z 当你准备开始写一个 Go 的项目,第一件事肯定是考虑创建一个工程文件夹,但是文件夹中的结构是怎样组成的呢?

]]>
当你准备开始写一个 Go 的项目,第一件事肯定是考虑创建一个工程文件夹,但是文件夹中的结构是怎样组成的呢?

1 Go mod init

使用 go mod 命令初始化目录,此步骤会创建 go.modgo.sum 等文件。

# 例如
 go mod init github.com/winking324/rzap
 go mod tidy

2 Project Layout

可以参考 Standard Go Project Layout 进行目录结构的创建。

]]>
<![CDATA[金字塔原理要点汇总]]> https://winking324.github.io/post/the-minto-pyramid-principle/ 2021-11-29T01:43:54.000Z 读完了号称“美团四大名著”之一的《金字塔原理》,总结一句话:食之无味弃之可惜。为什么这么说呢?书中介绍的方法论非常值得学习,但是不知是否翻译原因,整书内容枯燥乏味,一本介绍如何写文章的书却写成这样,实在可惜。

]]>
读完了号称“美团四大名著”之一的《金字塔原理》,总结一句话:食之无味弃之可惜。为什么这么说呢?书中介绍的方法论非常值得学习,但是不知是否翻译原因,整书内容枯燥乏味,一本介绍如何写文章的书却写成这样,实在可惜。

第1章 为什么要用金字塔结构

  1. 为了交流方便,必须将思想(观点、结论、要点、论点、论据、建议、行动、步骤等)归类分组;
  2. 将分组后的思想按照不同层次进行抽象提炼、总结概括,构建金字塔结构;
  3. 向读者介绍(传递、阐述、论证)思想最有效的途径是结论先行,自上而下地表达;
  4. 金字塔中的思想应遵守 3 个基本原则;
  5. 要做到条理清晰,关键是把思想组织成金字塔结构,并在写作前用金字塔原理检查;

关键概念

金字塔结构的 3 个基本原则

  • 结论先行:每篇文章只有一个中心思想,且应放在文章的最前面;
  • 以上统下:每一层次的思想必须是对下一层次思想的总结概括;
  • 归类分组:每一组中的思想必须属于同一逻辑范畴;
  • 逻辑递进:每一组中的思想必须按照逻辑顺序排列;

第2章 金字塔内部的结构

  1. 金字塔结构的各个层级包括各种思想,思想使受众(包括读者、听众、观众或学员)产生疑问;
  2. 在纵向上,各层级思想将与读者进行疑问-回答式对话;
  3. 在横向上,各种思想以演绎推理或归纳推理的方式回答读者的疑问,但两种方式不可同时使用;
  4. 序言通过讲故事提醒读者,文章将回答读者最初的疑问;
  5. 序言包括背景、冲突、读者的疑问和作者的回答。冲突因背景而产生,背景和冲突都是读者已知的事实;
  6. 冲突导致读者提出疑问,而文章将回答读者的疑问;

关键概念

金字塔结构中的逻辑关系

  • 各种思想纵向相关(疑问-回答式对话);
  • 各种思想横向相关(演绎/归纳);
  • 金字塔顶端思想回答读者心中已有的疑问;
  • 序言引出读者最初的疑问;

第3章 如何构建金字塔

  1. 自上而下法:
    • 确定作者想论述的主题;
    • 设想读者的疑问;
    • 给出答案;
    • 检查背景和冲突是否引发读者提出疑问;
    • 证实答案;
    • 填写关键句要点;
  2. 自下而上法:
    • 列出作者想表达的所有要点;
    • 找出各要点之间的关系;
    • 得出结论;
    • 倒推出序言;

关键概念

构建金字塔结构

  • 确定主题;
  • 设想疑问;
  • 给出答案;
  • 检查背景和冲突是否会引发读者的疑问;
  • 证实答案;
  • 填写关键句要点;

第4章 序言的具体写法

  1. 序言的目的是提示读者已知的信息,而不是提供新信息;
  2. 序言通常包括背景、冲突、读者的疑问和作者的答案;
  3. 序言的长短取决于读者的需要和主题的要求;
  4. 为每个关键句要点写一段引言;

关键概念

写序言

  • 说明背景;
  • 指出冲突;
  • 冲突引发读者提出疑问;
  • 文章正文给出答案;

第5章 演绎推理与归纳推理

  1. 演绎推理是一种论证,其中第二个论点对第一个论点加以评论,第三个论点说明前两个论点同时存在时的含义;
  2. 对演绎推理的概括就是把最后一个论点作为主体,概括整个推理过程;
  3. 归纳推理是把具有相似性的思想归类分组,根据各要点具有的共同性得出结论;
  4. 在关键句层次,使用归纳推理比演绎推理更方便读者理解;

关键概念

逻辑推理

  • 演绎推理是一个线性推理过程;
  • 归纳推理是把相似的思想或相关的行动加以归类;
  • 在关键句要点层次,使用归纳推理比演绎推理更方便读者理解;

第6章 应用逻辑顺序

  1. 应用逻辑顺序可以确保你不会:
    • 把新闻当做思想;
    • 遗漏某组中的重要思想;
  2. 任一组思想的逻辑顺序都呈现了该组思想的分组基础:
    • 时间顺序:通过设想某一流程得出的思想;
    • 结构顺序:通过评论某一结构得出的思想;
    • 程度顺序:按程度或重要性分组得出的思想;
  3. 如果你在某一组思想中找不到以上顺序,说明这些思想之间不存在逻辑关系,或者你的思考还不周全;
  4. 为了检查一组思想的逻辑顺序,你可以:
    • 先把每一个句子改写成能说明其实质的短句(即只保留主语、谓语、宾语,删除定语、状语和补语,只保留动词、名词,删除形容词、副词);
    • 再把相匹配或具有共同点的句子归为一组;
    • 最后选择适当的顺序排列;
  5. 如果是行动性思想(即说明行动、活动、行为、动作、步骤、流程等),那么应该:
    • 明确说明每项行动产生的最终结果(效果、目标);
    • 把最终能产生同样结果的行动(行为、步骤等)归为一组;
    • 确定每组思想的分组基础(类别),并依此排序;
    • 检查是否有遗漏的步骤;
  6. 如果是描述性思想(即介绍观点、情况、信息等),那么应该:
    • 把说明类似事务或具有共同点的思想归为一组;
    • 确定每组思想的分组基础(找出相似之处、共同点);
    • 把所有思想转换成完整的句子,确定其顺序;
    • 检查是否有遗漏的步骤;

关键概念

将行动性思想(说明行动、活动、行为、步骤、流程)排序

  • 明确说明每一行动产生的最终结果;
  • 把能产生相同结果的思想合并、归类、分组;
  • 确定该组思想的分组基础,并依此排序;
  • 检查是否有遗漏的步骤;

将描述性思想(介绍观点、论点、论据、情况、信息)排序

  • 把说明类似事务或具有共同点的思想归类、合并、分组;
  • 确定每组思想的分组基础;
  • 把所有思想转换成完整的句子,确定其顺序;
  • 检查是否有遗漏的步骤;

第7章 概括各组思想

  1. 避免使用“缺乏思想”的句子(比如,存在3个问题…);
  2. 分组应遵守“相互独立不重叠,完全穷尽无遗漏”原则(MECE 原则);
  3. 行动总是按时间顺序进行,通过说明行动产生的直接结果可以概括行动性思想;
  4. 将描述性思想归类分组,是因为每组思想具有共同特性,它们都:
    • 针对同一类主语;
    • 针对同一类谓语(动作或对象);
    • 包含同一类判断;
  5. 对行动性思想进行分组时,要求:
    • 发掘每项行动的本质;
    • 区分不同的抽象层次(比如,采取一项行动,只是时间上必须在另一行动之前,还是为了完成另一行动?);
    • 明确说明行动产生的最终结果;
    • 直接由行动概括出结果;
  6. 对描述性思想进行分组时,要求:
    • 找出句子结构的共同点;
    • 确定包括这些思想的最小范畴;
    • 说明共同点隐含的意义;

关键概念

概括各组思想

  • 通过说明行动产生的直接结果,概括行动性思想(概括一组行动);
  • 通过说明各项思想具有的共同点、相似性,概括描述性思想(概括一组信息);

寻找思想共同点

  • 各思想是否针对同一类主题;
  • 各思想是否涉及同一类行动;
  • 各思想是否针对同一类对象;
  • 各思想是否包含同一类观点;

行动性思想分组

  • 发掘每项行动的实本质;
  • 区分行动的不同层次;
  • 明确说明行动性思想产生的最终结果(效果、目标);
  • 直接由行动概括出结果;

描述性思想分组

  • 找出主语、谓语、宾语或含义的共同点;
  • 确定包括这些思想的最小范畴;
  • 说明共同性隐含的意义;

第8章 界定问题

  1. 展开“问题”的各要素:
    • 切入点/序幕(产生问题的具体领域、方面);
    • 困扰/困惑(它的发生打乱了该领域的稳定);
    • 现状(R1,非期望结果);
    • 目标(R2,期望结果);
    • 答案(到目前为止,针对问题已经采取的措施,如果采取了的话);
    • 疑问(为了解决问题,必须做什么);
  2. 把界定的问题转换成序言:
    • 从左往右再往下;
    • 读者最后知道的事实就是冲突;

关键概念

界定问题

  • 设想问题产生的领域;
  • 说明什么事情的发生打乱了该领域的稳定(困扰/困惑);
  • 确定非期望结果(现状,R1);
  • 确定期望结果(目标,R2);
  • 确定是否已经采取了解决问题的行动;
  • 确定通过分析所要回答的疑问;

第9章 结构化分析问题

  1. 运用诊断框架呈现问题领域的详细结构,展示一个系统内的各个部分是如何相互影响的;
    • 查找存在因果关系的活动;
    • 对产生问题的可能原因进行分类;
  2. 收集资料,以证明或排除结构中导致问题产生的部分;
  3. 使用逻辑树进行分析;
    • 提出和检验解决方案;
    • 揭示树状图中各思想的内在关系;

关键概念

结构化分析问题

  • 界定问题;
  • 使用诊断框架,呈现问题领域的详细结构;
  • 假设产生问题的可能原因;
  • 收集资料,以证明或排除所做假设;

第10章 在书面上呈现金字塔

用多级标题、行首缩进、下划线和数字编号等方法,突出文章的整体结构。

  1. 表现金字塔结构中主要组合之间的过渡;
  2. 表现金字塔结构中主要思想组之间的过渡;

第11章 在PPT演示文稿中呈现金字塔

  1. 制作文字幻灯片应尽量简明扼要;
  2. 制作图表幻灯片可以使传达的信息更简单易懂,在幻灯片的上部说明要传达的信息;
  3. 运用故事梗概,简要说明整体结构;
  4. 排练、排练,再排练!

第12章 在字里行间呈现金字塔

  1. 画脑图(在大脑中画出图像或思维导图);
  2. 把图像转化成文字;
]]>
<![CDATA[F460 路由器端口映射]]> https://winking324.github.io/post/f460-nat/ 2019-10-18T02:17:47.000Z 家装电信,很多都采用中兴 F460 光猫(路由器),家里自己部署了一个服务器,想要映射到公网上,SSH 登陆上来。但是默认情况下,为了保证安全和防止黑客攻击,光猫上面是不允许将内部端口映射到公网上的。所以这里需要获取到光猫的超级管理员权限,进行端口映射的配置。

]]>
家装电信,很多都采用中兴 F460 光猫(路由器),家里自己部署了一个服务器,想要映射到公网上,SSH 登陆上来。但是默认情况下,为了保证安全和防止黑客攻击,光猫上面是不允许将内部端口映射到公网上的。所以这里需要获取到光猫的超级管理员权限,进行端口映射的配置。

1 获取密码

  1. 链接电脑到光猫上,注意不要用第三个网口,这个网口是给 IPTV 预留的,分配的 IP 跟其他网口不一样;
  2. 打开浏览器,访问 http://192.168.1.1/manager_dev_config_t.gch,选择导出配置;
  3. 下载 Offzip,默认情况有 Windows 下的 offzip.exe,可以直接用,其他平台,执行 make 编译一下;
  4. 在命令行下,执行 offzip.exe -a config.bin . 0 来解压配置文件;
  5. 解压后会有多个文件,用文本编辑器打开各个文件,搜索 telecomadmin,对应的密码在相同位置;
  6. 打开浏览器,访问 http://192.168.1.1,输入对应的用户名密码,登陆成功;

2 配置端口映射

  1. 超级管理员登陆;
  2. 点击菜单栏 应用
  3. 选择 高级 NAT 配置
  4. 选择 虚拟主机配置
  5. 勾选 应用,打开虚拟主机配置;
  6. 名称填写自己的命名;
  7. 广域网主机起始 IP 地址,广域网主机结束 IP 地址:允许任意地址访问则不填写,否则填写指定的 IP 地址;
  8. 广域网连接:选择路由模式的连接,也就是当前电脑使用的联网模式,一般下拉菜单中只有一项,选择即可;
  9. 广域网起始端口,广域网结束端口:打开给外网访问的端口;
  10. 启用 MAC 映射:不勾选;
  11. 虚拟主机 IP 地址:局域网内部 IP 地址,例如说你内网服务器地址是 192.168.1.5,则填写这个地址;
  12. 虚拟主机起始端口,虚拟主机结束端口:局域网内部服务器允许对外访问的端口;

3 参考链接

]]>
<![CDATA[Linux 系统错误码]]> https://winking324.github.io/post/linux-error-codes/ 2019-10-10T06:26:56.000Z When system requests fail, error code are returned. To understand the nature of the error these codes need to be interpreted.

]]>
When system requests fail, error code are returned. To understand the nature of the error these codes need to be interpreted.

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:

]]>
<![CDATA[Flask 中使用定时任务]]> https://winking324.github.io/post/flask-scheduler/ 2019-09-25T05:29:30.000Z 最近在使用 Flask 时,需要定期从远端服务器拉取 IP 数据,以提供相关 API 使用。所以使用了 apscheduler 这个定时任务框架来执行数据库读取以及本地数据更新等功能。

这里把踩过的一些坑整理一下。

]]>
最近在使用 Flask 时,需要定期从远端服务器拉取 IP 数据,以提供相关 API 使用。所以使用了 apscheduler 这个定时任务框架来执行数据库读取以及本地数据更新等功能。

这里把踩过的一些坑整理一下。

1 如何设置定时任务

安装 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 时候立即执行,而是到期后执行第一次,所以对于读取数据库的任务,应该先调用触发一次,否则会有一段时间没有任何数据。

2 使用 APScheduler 遇到的问题

在 uwsgi + Flask 中使用 APScheduler 时,出现了以下问题:

当 uwsgi 设置 processes 个数不为 0 时,APScheduler 定期读取数据库更新的数据,只在父进程得到了更新,而在 worker 子进程中的数据没有更新。所以当用户请求到 worker 进程时,会获取最新的数据失败。

为了解决这个问题,尝试使用了几种方式:

  1. 为每个 process 设置一个 APScheduler;
  2. 将父进程的更新同步到子进程;
  3. 使用 Flask-APScheduler;

以上两个方式,最终均以失败告终,原因如下:

  1. APScheduler 官方文档中,有是否能够在多个 worker 间共享一个定期任务,答案是否定的,并给出了相关的推荐做法;
  2. 多个进程间共享数据,有读写锁的问题,解决更加复杂;
  3. Flask-APScheduler 仅仅是将 APScheduler 与 Flask 结合在一起,没有改变实际的实现方式,但是提供了更适合 Flask 的实践方式;

3 如何解决

解决这个问题,有两种方式:

  1. APScheduler 官方建议的,通过单独的一个服务来提供数据访问;
  2. 使用 redis 等数据库来达到数据同步;

这里使用第二种方式,第 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 来读取数据。

4 解决 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')
]]>
<![CDATA[斐讯 N1 盒子搭建 NAS]]> https://winking324.github.io/post/n1-nas/ 2019-08-08T05:51:46.000Z T1 盒子安装红外模块,并刷完系统后,N1 盒子就放在家里落灰了。为了充分发挥它的作用,把它刷成了一个 NAS,来管理家里的存储设备。

]]>
T1 盒子安装红外模块,并刷完系统后,N1 盒子就放在家里落灰了。为了充分发挥它的作用,把它刷成了一个 NAS,来管理家里的存储设备。

1 刷机准备

设备:

  1. N1 盒子一台;
  2. U 盘一个;
  3. 显示器一台;
  4. 网线一根;
  5. 键盘一个;
  6. 网络环境;
  7. 电脑一台;

工具:

  1. 烧录工具:balenaEtcher;
  2. 终端工具:iTerm;
  3. 刷机系统:Armbian;

打包地址:

百度网盘 提取码: nb2k

2 制作 Armbian 系统盘

这里安装的系统是 Armbian,是一个轻量级的 Debian 系统和为 ARM 开发板专门发行并重新编译的 Debian 系统。

  1. Armbian_5.77_Aml-s905_Debian_stretch_default_5.1.0-rc1_20190408以boot以加入dtd、extlinux、uEnv.ini.img.xz 解压;
  2. 使用 balenaEtcher,将解压后的 Armbian_5.77_Aml-s905_Debian_stretch_default_5.1.0-rc1_20190408以boot以加入dtd、extlinux、uEnv.ini.img 烧录到 U 盘中;
  3. Armbian 系统盘制作成功;

3 安装 Armbian

Mac 中,首先要安装 Android 工具包:

brew cask install android-platform-tools

  1. N1 接入网络并插入电源上电;

  2. 查看 N1 的 IP,这里假设为 192.168.1.30

  3. 在终端工具中输入 adb connect 192.168.1.30:5555 连上 N1;

  4. 在终端工具中输入 adb shell reboot update 使 N1 重启进入刷机模式;

  5. 此时立即插入 U 盘到 HDMI 旁边的 USB 口;

  6. 等待刷机结束;

  7. 刷机结束后,会在控制台中显示 IP(假设仍为 192.168.1.30)和 Login 提示;

  8. 在终端工具中输入 ssh [email protected],密码 1234 登陆到 Armbian 中;

  9. 随便输入一个新的密码(因为后面会重新刷系统,这个密码只是临时用);

  10. 提示创建用户,按 Ctrl-C 取消;

Windows 中,可以使用之前 N1 刷机工具中的 使N1进入线刷模式.zip 中脚本来代替第 3、4 步的操作。

4 安装 FastNas

完成上面的 Armbian 系统的安装后,此时已经在 Armbian 系统中了,接下来需要将 FastNas 作者已经打好的系统包:BACKUP-s9xxx-emmc.img.gz,刷到 N1 上。

  1. 打开一个新的终端,将文件传到 N1 上(Windows 中可以使用 WinSCP 等工具来上传文件);

    scp -C -r BACKUP-s9xxx-emmc.img.gz [email protected]:~/
    
  2. 在已经登陆 N1 的终端中,将文件放到 /ddbr 路径下:

    mkdir -p /ddbr
    mv BACKUP-s9xxx-emmc.img.gz /ddbr
    
  3. 执行 ddbr 命令进行 FastNas 安装:

  4. 执行 poweroff 将 N1 盒子关机;

  5. 拔掉 U 盘,并重新上电开机;

5 网络设置

开机完成后,就已经进入了安装好 FastNas 的系统了,此时用户名为 root,密码为 media1984。

目前系统的内核有个问题,每次重启,MAC 地址会变化,所以如果使用 DHCP 方式获取 IP,会导致每次重启,N1 的 IP 都发生变化。

解决的办法如下:

  1. 终端登陆 N1;

  2. vi 打开编辑 /etc/network/interfaces 文件;

  3. 增加 hwaddress ether 6a:c8:0b:05:88:52 到 eth0(有线)配置中;

  4. 输入 reboot 重启,可以看到 MAC 地址不会再发生变化;

如果使用无线网络,使用 armbian-config 命令进行无线网络的配置。

6 OMV 设置

在电脑中,打开浏览器,输入 http://192.168.1.30,便可以进入 OpenMediaVault 系统(用户名:admin,密码:openmediavault)。

7 参考链接

]]>
<![CDATA[斐讯 T1 增加红外遥控]]> https://winking324.github.io/post/t1-ir/ 2019-08-01T06:08:42.000Z 在用树莓派获取斐讯 N1 盒子遥控器红外信号时,发现读取不到信息,查了一下,N1 盒子是通过蓝牙遥控器来控制的。虽然网上有各路神仙给 N1 盒子加红外模块,但是没看到有成功的。

但是看到斐讯 T1 盒子预留了红外模块,并且可以直接用红外遥控控制,所以又买了一个斐讯 T1 盒子,来达到红外控制的目的。

]]>
在用树莓派获取斐讯 N1 盒子遥控器红外信号时,发现读取不到信息,查了一下,N1 盒子是通过蓝牙遥控器来控制的。虽然网上有各路神仙给 N1 盒子加红外模块,但是没看到有成功的。

但是看到斐讯 T1 盒子预留了红外模块,并且可以直接用红外遥控控制,所以又买了一个斐讯 T1 盒子,来达到红外控制的目的。

1 刷机

拿到盒子第一时间,不用说,先进行刷机,步骤和 N1 几乎完全一样,所以不再赘述,可以参考 N1 盒子来进行刷机。

这里唯一需要说明的是:

T1 在开机后,需要链接网络并进行账号注册,才能激活。需要跳过这一个步骤,进入到系统中,打开远程调试。

首先,扫描 T1 包装盒上面的二维码,下载手机遥控器 App

这样用遥控器设置链接网络之后,就可以使用手机遥控 App 来操作 T1 盒子,此时按手机遥控 App 上的菜单按钮,就可以跳过注册,直接进入到盒子中了,并在设置中打开远程调试。

2 安装红外

刷完机之后,关机,准备安装红外模块。

  1. 撕开一点防滑条,将后盖拆下来;

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

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

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

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

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

3 参考链接

]]>