博客 | Blog

关于 bottleneck 的几种含义

机器学习的语境中,经常可以看到 Bottleneck 这个词,其含义差别较大,为了解决自己的困惑,本文整理了几种常见的含义。

  1. information bottleneck theory 由 Naftali Tishby 2000 年的论文 The information bottleneck method 中提出,后来试图解释深度学习的泛化性能。当然关于这个理论本身也有不少反驳意见。

  2. ResNet 中的结构名称,bottleneck design 2015 年底最新给出的,也是当年的 imagenet 比赛冠军。可以说是进一步将 conv 进行到底,其特殊之处在于设计了“bottleneck”形式的 block(有跨越几层的直连)

  3. bottleneck 是我们经常用于描述网络最后一层之前的那些实际完成分类任务的网络层的一种非正式称谓 http://shartoo.github.io/tensorflow-retainmodel/

  4. MLP 中一类隐层 源于1994年的《CONNECTIONIST SPEECH RECOGNITION A Hybrid Approach》,里面首先提出到 BN 层应该要同时比input&output结点数都要少的概念。参考 https://www.zhihu.com/question/51793452

日常轻松制作 Anki 卡片

Anki 是一款能让记忆事物变得简单的程序。Anki 比传统的学习方法更为有效,因此你可以大幅减少花在学习上的时间,或是大幅提升学习量。(来自 anki 官方中文介绍)。

我个人很早就耳闻 anki 的大名,2019 年 10月份够买了 iOS 上的官方 APP。但是日常使用仅限于背诵单词,有一搭没一答的在使用。2020 年底学习了 Youtuber Ali 关于 Anki 的课程 Learn Anything With Flashcards The Ultimate Guide To Anki,了解到很多之前不知道的 anki 的强大功能。新的一年开始,希望能坚持 anki 打卡,背诵单词。下面简单介绍一下使用 anki 的 workflow。

我一直不太习惯背诵单词书,一来没有备考的压力,动力不足,其次没有语境的背诵单词,对我来说印象不够深刻。这么多年的英语学习经历,我几乎没有背诵过单词书。高中积累单词的方法是,在日常考试中遇到的生词,记录到生词本,之后有空没空多翻翻。这样的效果是十分显著的,在后期英语阅读理解速度比较同龄人提高了很多,个人积累的单词量也显著进步。这样的习惯一直断断续续保持着,这么多年使用过有道的单词本,欧陆词典的生词本,用来记录在互联网上浏览遇到的生词,但是效果不佳。原因主要是,互联网上遇到的生词数量太多(有些难度较大的文章可能一篇就会积累数十个),没有了应试压力后很难经常性地回顾,这就导致生词本中不熟悉的单词越来越多,定期背诵带来的沮丧感大增,很难坚持下去。

Anki 通过自己的算法可以完美的解决这个问题。所以要解决的问题是,如何将生词本迁移到 Anki 词库?

最直观的办法是,直接将生词本导出,简单处理下格式,并导入 Anki。这样当然是可行的,但是日常积累遇到的新词如何处理?定期从生词本导入到 Anki 当然是可以的,不过毕竟增加了额外的步骤。永远不要低估自己的惰性,时间长了可能就这多的一步阻碍你继续背诵单词。我们需要的方案是,能够将遇到的生词直接添加到 anki 中,非常幸运的是,现在有很多这样的工具。本文主要介绍我个人经常遇到的两种场景。

在浏览器中添加生词到 Anki #

幸运的是,有现成方案可以完美解决这个场景需求。大力推荐 在线词典助手 (含Anki制卡功能) 这个 Chrome 扩展,插件安装地址。项目的是开源的,代码托管在 Github

安装完毕,简单配置后,可以直接在浏览器进行划词翻译,一键添加到预先配置好的 Anki 词库。个人使用一年多,偶尔遇到不能制卡多是配置失效,重新配置即可。

查单词的同时添加到 Anki #

在非浏览器页面遇到生词,查单词后希望添加到 anki,如何解决这个需求呢?具体来说,我查单词的地方默认是命令行,感谢 ydcv,能够在命令行迅速方便的查询单词。但是该工具只是一个非常简单的查词工具,没有更复杂的,例如单词本这样的功能。 最初我是这样解决这个问题的,手动添加了生词本功能。实现的非常简单,就是在查单词的同时,将单词保存到一个文本文件。通过 shell 函数实现:

# youdao  
function s() {
    local spath="${HOME}/sh/ydcv.py"
    $spath $*
    echo $* >> ${HOME}/Dropbox/Dat/words.txt
}

在决定使用 Anki 之后,这个实现当然不够,如何能够让在 ydcv 中查询的单词保存到 Anki 词库呢?前段时间特地抽时间搜索了一下,找到了一个在命令行中与 anki 词库交互的工具 apy,该工具没有采用 Ankiconnect 等接口,可以在 Anki 没有运行的情况下,通过读取 Anki 数据库的方式,直接添加新卡片。那么问题就简单了,我们可以用该工具将使用 ydcv 查询的单词和返回的意思直接添加到 Anki 词库,简单升级下上面的 shell 函数:

...

socks 代理问题排查

昨天晚上 Roam 今天一直没办法同步,F12 查看后台发现是到 firebaseio.com 的请求全部失败了。一个示例请求是 https://firescript-577a2-dbs-0017.firebaseio.com/.lp?start=t&ser=83912017&cb=14&v=5

这个域名我这边需要使用代理访问,之前都正常,直到今天,浏览器无论是否使用代理都无法访问。已经做了如下测试

  1. 使用浏览器代理无法访问(浏览器尝试了 Chrome 和 Firefox,代理类型尝试了 socks5 和 http)
  2. 使用 curl 配置了 socks5 代理在终端直接请求正常,在境外 VPS 直接 curl 请求也没有问题
  3. 使用全局的 anyconnnect vpn,浏览器访问正常
  4. 检查了浏览器的 DNS 解析是正确的

上文是我在自己排查了很久找不到原因后在 V2EX 上发的求助帖子。同时我还在 Tuna 的技术群中发了类似的东西。 等了许久之后有人指出了问题,可能是 socks 代理的问题,最终确定是代理节点出现了故障(与此同时代理的群里也有人反馈节点问题,可是我没有仔细看)。 觉得困惑的原因主要在于,终端是可以访问的,但是浏览器无法访问。明明是用了同样的代理,VPN 和 境外 VPS 可以访问说明服务端没有问题,除了 firebaseio 这个域名,其他域名包括 Google 等的访问正常,说明代理服务器没有出问题(这里是重点),那么问题究竟在哪里呢?

事后来看,遇到这个问题无法解决的原因是,不懂浏览器和 curl 的 socks 代理机制差异,下面简单总结一下。

  1. 浏览器中无法访问的原因是,Chrome 和 Firefox 设置的 socks 代理,需要远程解析 DNS,而远程服务器节点解析 firebaseio 域名出现了问题,导致无法访问。(FIrefox 默认 socks5 代理是本地解析,然而我很久以前修改了)
  2. curl -x socks5://127.0.0.1:7891 会在本地解析,所以访问没有问题
  3. 全局的自然没有问题
  4. 浏览器本地解析的 DNS 并没有什么意义(应该是我在采用 Direct 模式解析到的 DNS 缓存)

在本地使用 curl -x socks5h://127.0.0.1:7891 请求失败,这种方式类似浏览器,在远程解析 DNS,重现出了浏览器碰到的故障。附上一个记录

...

Ubuntu LTS 版本升级

Ubuntu 16.04 升级到 18.04 过程中,出现了和 miktex 相关的一个错误。升级顺利完成,但是发生了这个错误。导致了一些包并没有更新,以及 apt 的依赖被搞崩了,提示如下

You might want to run 'apt --fix-broken install' to correct these.
The following packages have unmet dependencies
miktex : Depends: libcurl3 (>= 7.16.2) but it is not installed
E: Unmet dependencies. Try 'apt --fix-broken install' with no packages (or specify a solution).

这时候使用 apt remove miktex 也是没有用的,提示这个错误

Removing miktex (2.9.6650-1) ...
miktexsetup: /usr/lib/x86_64-linux-gnu/libcurl.so.4: version
`CURL_OPENSSL_3' not found (required by miktexsetup)
dpkg: error processing package miktex (--remove):
installed miktex package pre-removal script subprocess returned error exit status 1
Errors were encountered while processing:
miktex
E: Sub-process /usr/bin/dpkg returned an error code (1)

错误的原因是 Ubuntu 18.04 将 libcurl3 升级成 libcurl4,对应的库也进行了更新,导致依赖 libcurl3 的应用程序例如 miktex 崩坏,进而导致 apt 崩坏,小白用户面对这种情况基本就手足无措了。

...

Flexgate 苹果背光门事件

简介 #

Flexgate 背光门事件是指苹果公司 2016 或者 2017 款的 Macbook 在长期使用后出现的屏 幕质量问题,具体表现为屏幕背光完全消失(黑屏)或者出现严重的漏光现象,国内外很多 文章视频对此已经有详细的介绍1。美国也出现了针对 Flexgate 事件的集体诉讼。2019年5 月19日,苹果官方推出了 2016/2017 款 13 寸 Macbook Pro 的显示屏背光服务计划2,但是对于存在同 样问题的 2016 款 15 寸 Macbook Pro 却没有对应的服务计划。这也正是我购买的机型。

回顾 #

  • 2017-01-05 购买 2016 款 15寸 Macbook Pro 便携式笔记本电脑。
  • 2017-06-22 购买该设备的延长保修服务 Apple Care+。
  • 2020-12-14 因电池鼓包授权维修点送修,免费更换 C 面(尚在 Apple Care+ 保修期限内)。
  • 2020-03-24 晚间发现笔记本屏幕黑屏,不显示任何内容,显示器背光完全停止工作。上网搜索发现原因是苹果的产品设计缺陷 Flexgate 背光门确认。
  • 2020-03-25 电话苹果客服确认该问题,由于疫情期间行程受阻,未能送去线下维修。
  • 2020-06-28 前往长沙苹果官方授权维修点,确认该设备出现的问题,但是拒绝免费维修,付费维修费用高达 6100 元人民币。放弃维修
  • 2020-09-11 淘宝寄修
  • 2020-09-16 淘宝维修返回,测试机器,发现底部背光有问题,背光不均匀,在低亮度的时候尤其严重。和店家交涉,第二天重新寄回。
  • 2020-09-21 淘宝维修再次返回,测试完美。总计花费 800 CNY。淘宝商品地址3

总结 #

遇到同样问题的苹果用户,希望我们都能力所能及地投诉并关注这件事情。对于不想在官方换屏维修的用户,可以尝试在淘宝或者华强北维修,我个人的体验比较满意。

...

Clash 作为网关的透明代理

注意:作者目前使用的方案已经更新,请参考[最新文章]({% post_url 2023-07-14-clash-gateway %}),使用 TUN 方案,不需要自己维护 iptables 规则

一直以来的方式是在各个终端进行代理,因为没有一定网关/路由层面处理的理由。之前也在路由器上折腾过几次,成功大抵算是成功,但是偶尔的稳定性问题,以及不方便更改代理状态和调试,最终还是放弃。

前段时间折腾了 DIYNAS,安装了 PVE 系统,折腾了虚拟机好久。想着既然没什么后顾之忧,不如在虚拟机上试试软路由?使用 OpenWRT 原生系统 + openclash 使用了一周左右,稳定性尚可,就是更新频繁(强迫症无法不点更新啊),配置文件看得人眼花缭乱。

在翻 Clash 的 GitHub 仓库时,发现最近 TProxy 支持了转发 TCP1,遂想起来在 Ubuntu 上折腾一下透明代理作为网关,成功后发现这种方式相对于 OpenWRT + openclash 简单省心,维护一份配置文件,不用频繁更新。记录方案于此。

提前声明本人网络知识欠缺,配置大多参考他人,尽力给出原始链接供参考。

普通 linux 主机设置 #

首先,在网关机器上打开 ipv4 转发, echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf && sysctl -p Clash 配置文件添加如下

# Transparent proxy server port for Linux (TProxy TCP and TProxy UDP)
tproxy-port: 7893

设置路由和 iptables 的脚本

# ROUTE RULES
ip rule add fwmark 1 table 100
ip route add local 0.0.0.0/0 dev lo table 100

# CREATE TABLE
iptables -t mangle -N clash

# RETURN LOCAL AND LANS
iptables -t mangle -A clash -d 0.0.0.0/8 -j RETURN
iptables -t mangle -A clash -d 10.0.0.0/8 -j RETURN
iptables -t mangle -A clash -d 127.0.0.0/8 -j RETURN
iptables -t mangle -A clash -d 169.254.0.0/16 -j RETURN
iptables -t mangle -A clash -d 172.16.0.0/12 -j RETURN
iptables -t mangle -A clash -d 192.168.50.0/16 -j RETURN
iptables -t mangle -A clash -d 192.168.9.0/16 -j RETURN

iptables -t mangle -A clash -d 224.0.0.0/4 -j RETURN
iptables -t mangle -A clash -d 240.0.0.0/4 -j RETURN

# FORWARD ALL
iptables -t mangle -A clash -p udp -j TPROXY --on-port 7893 --tproxy-mark 1
iptables -t mangle -A clash -p tcp -j TPROXY --on-port 7893 --tproxy-mark 1

# REDIRECT
iptables -t mangle -A PREROUTING -j clash

最后在局域网的 DHCP 服务器设置网关为该机器 IP 即可,也可以手动在希望走代理机器的网关设置未该机器 IP。

...

self-hosting is good

最近折腾整理了一下服务器上自建的服务,顺便给添加上了 https,下面简单记录一下,推荐自建服务的同时,也大致给同样想要折腾的人提供一点记录。

密码管理服务 #

自从 2009 年 CSDN 爆出明文存储密码,密码泄漏事件之后,便开始使用密码管理软件。最初使用 LastPass,之后长期使用 Keepass,最近一年迁移到了 1Password,在论坛发现对 Bitwarden 的推荐后,顺手在服务器上部署了,目前使用几个月,体验良好。

推荐使用 docker 部署,官方仓库对性能要求比较高,推荐使用 Rust 重写的服务端 bitwarden_rs,采用 docker-compose 方式部署,注意为了使后面部署的其他服务也能使用 Caddy,我们不采用上面这个 repo 提供的 docker-compose.yaml,采用以下

$ cat docker-compose.yml 
# docker-compose.yml
version: '3'

services:
  bitwarden:
    image: bitwardenrs/server
    restart: always
    volumes:
      - ./bw-data:/data
    environment:
      WEBSOCKET_ENABLED: 'true' # Required to use websockets
      SIGNUPS_ALLOWED: 'false'   # set to false to disable signups
    ports:
      - "127.0.0.1:3012:3012"
      - "127.0.0.1:3011:80"

最后我们统一采用 Caddy 进行反向代理。

RSS 阅读器 #

2010 年前后开始使用 RSS 订阅,经历了 2012 年 Google Reader 关闭带来的晴天霹雳,后来在 Digg, feedly, inoreader 之间辗转,目前是 inoreader 的 Pro 付费用户,前几天在推上看到有人提到 miniflux,遂去瞄了一眼,看起来比较简洁,本着尝试的态度部署了一下,体验还可以,虽然暂时无法替代 inoreader,采用官方提供的 docker-compose.yaml 即可,如下:

...

关于笔记软件

作为一名资深的磨刀人,对于笔记软件自然使用过无数款。简单总结一下所有的产品和过往的一些记录。

  • Workflowy
    • 非常棒的大纲工具,我使用的时间并不长。界面流畅,交互体验顺滑。
  • 幕布
    • 国内的 Workflowy,添加了思维导图的功能,然而我几乎不用思维导图,长期付费会员,可惜还没到期就放弃不使用了,以后记得这类千万不要买超过一年的会员。
  • Bear
    • macOS 上的文本编辑,我怎么也不习惯用文件的方式记笔记。
  • Ulysess
    • 类似 Bear,本质上是个写作工具。
  • Vimwiki
    • 最早接触的,我最初公开分享的 wiki 页面就是 vimwiki 生成的。
  • Drafts
    • iOS 上的文本书写工具。
  • Simplenote
    • 简洁,共享功能很棒。
  • Google Keep
    • 日志记录,搜索功能强大, OCR 功能很棒。
  • Notes.APP
    • Apple 生态下的随手记录,可以尽量不使用。
  • Day One
    • 日记,界面优美,可惜不跨平台。
  • Evernote
    • 存放各种 Review 笔记,扫描的收据,剪藏的文章,目前个人用来做各种渠道的信息收集。还没放弃它的原因是可以检索图片中的文字。但是实在太重了。新人不建议使用了。
  • notion
    • 结构化信息,书评,主要笔记场所,但是中文搜索有问题
  • Jrnl
    • 作为日常随手笔记应用,记录工作日志,日常日志
    • 启发自 jrnl,一个 pyhton package 用于命令行记录的日志工具
    • integrated with Telegram, so I can journal by telegram messaging to the bot
    • developed a server API, so I can journal by command line using [[Alfred
  • Roam Research
    • 主力使用,存放任意类型笔记,读书观影万物皆可,目前的增量信息都使用 RR 来管理吧。关于是否可以替代 Day One 成为日常 log 工具还需要考虑。
    • 优点:
      • 省钱了,Day One 订阅费用一年 35 USD
      • 统一的集中数据库
    • 缺点
      • 移动端暂时没有好的方案
      • 私人信息会污染数据库
      • 没有华丽的 UI 和当年今日等回顾性质的内容
  • Joplin
    • an open source note taking and to-do application with synchronization capabilities for Windows, macOS, Linux, Android and iOS. Forum: https://discourse.joplinapp.org/
    • 没有使用过,可以将 Evernote 笔记导出为 markdown 文件,很棒。

附上8年前的一些想法:

...

红米 K30i 安装欧版 ROM

解锁 #

  • 手机登录小米账号。
  • 进入设置→我的设备→全部参数,反复点击MIUI版本开启开发者选项。
  • 进入设置→更多设置→开发者选项→设备解锁状态,按系统提示的步骤绑定账号和设备。
  • 下载官方解锁工具,按照工具自带的引导教程解锁即可,或参考图文教程。遇到问题可以参考小米手机解锁 Bootloader 教程和常见问题。一般新机会要求等待7天才能解锁。

安装ADB #

点击链接下载ADB:

刷入TWRP #

  • 下载地址 https://androidfilehost.com/?w=files&flid=50678 根据机型下载对应的 TWRP
  • 掏出手机,进入设置→更多设置→开发者选项开启USB调试后,用数据线连接电脑,手机会询问USB用途,选传输文件
  • 打开cmd,输入以下命令重启手机到Bootloader。 adb reboot bootloader
  • 重启至Bootloader后(屏幕内容为兔子修理安卓机器人),继续输入命令 fastboot devices -l, 若返回串号, 则说明手机连接成功。
  • 刷入 TERP
    fastboot flash recovery twrp_xxx.img
    fastboot boot twrp_xxx.img
    

刷入欧版MIUI #

MIUI v12 下载地址 https://sourceforge.net/projects/xiaomi-eu-multilang-miui-roms/files/xiaomi.eu/MIUI-STABLE-RELEASES/MIUIv12/ 根据机型下载对应 ROM

接着手机关机,长按“电源键”+“音量+”,重启手机到TWRP。

具体步骤

  • 进入TWRP首页,依次进入清除→格式化Data分区→输入yes格式化;
  • 返回上一级菜单,进入高级清除选项,勾选Dalvik/ART Cache,Data,内部储存,Cache,System并滑动滑块确认清除。
  • 返回TWRP首页,依次进入重启→Recovery。
  • 重启进入TWRP首页后,手机USB连接电脑,将下好的rom包放进手机内部储存根目录。
  • 从TWRP首页进入安装,选中你复制进去的ROM包,拖动底部滑块滑动确认刷入即完成了欧盟版MIUI的刷入。
  • 重启手机,等待首次启动读条,进去便是干净的欧盟版MIUI。

刷入Magisk取得Root权限 #

如果你需要Root(推荐root),则继续留在TWRP里操作:

  • 返回TWRP首页,依次进入高级→root系统,滑动滑块即可刷入Magisk。(由于K30 5G版的TWRP已内置root功能,所以能这样直接刷入。)
  • 如果你手机的TWRP没有内置root,则需要手动下载Magisk卡刷包,像刷入ROM一样刷入即可。

参考链接 #

KeePass 迁移到 1Password,再迁移到 Bitwarden

使用密码管理器有些年头了,2010 年前后最初选择的是 lastpass,后来短暂尝试过 1password,使用时间最为久远的是开源的 KeePass。 Keepass 的跨平台是基本满意的,Windows 下的客户端支持最全面,Linux 下使用 KeepassXC,macOS 下使用 macpass,iOS 下的客户端非常多, 免费付费的都有,我尝试过的有 MiniKeePass,Kypass,在这次迁移前一直使用的 Kypass。

迁移的原因无外乎 Kypass 的一些细节还是不如 1Password。简单记录一下迁移流程。

使用 Windows 上的 Keepass 客户端导出 csv 文件,使用 vim 对 csv 文件进行预处理,使得能够导入 1Password,涉及到的主要命令有

%s/\r/r/ 将 ^M 替换为换行

%s/\([^"]\)\n/\1 / 将注释中的换行符替换为空格

%g/^$/d 删除空行```

另外由于 1Password 支持两步验证,OTP 协议。所以将之前所有的两步验证从 Authy 迁移,参考 https://gist.github.com/gboudreau/94bb0c11a6209c82418d01a59d958c93#gistcomment-2224133

/Applications/Authy Desktop.app/Contents/MacOS/.Authy\ Desktop –remote-debugging-port=5858


不满意 1Password 的地方
- 没有文件夹管理
- 数据类型复杂(logins, Credit Cards, Secure Notes)导致的导出迁移困难

满意的地方
- OTP 集成
- 交互体验优于 KeePass (iOS macOS 上的自动填充等细节)


2020-11-20 Update:

最近又决定尝试一下 Bitwarden,很早之前就耳闻过,以为部署麻烦,没想到使用 docker 部署如此顺畅,
部署的细节参考另一篇[文章](https://www.wogong.net/blog/2020/11/self-host)。
跨平台的体验,产品细节各方面个人体验并不逊色于 1Password,还是开源自己部署服务器的方式,迁移过来不需要更多理由了吧?