使用 redroid 等安卓虚拟环境,可能会发现 google play 用不了的问题。
虽然系统集成了 gapps,但系统提示 “设备未获得play保护机制认证”,无法登录 play 商店。
可能的原因比较多,这里大概是因为虚拟机的型号没在google的数据库里。
解决方案就是,获取 GSF ID 注册到 Google。
HomeBrew 与无 root 权限 Linux 环境包管理
一些公用的 Linux 服务器,处于维护以及安全考虑,一般只会提供普通权限用户给使用者。
普通用户的权限满足日常使用是够了,但是难以配置自己的开发环境,安装一些自己需要的包。
如果都从源码编译安装软件,依赖的维护过于复杂,初始编译工具链的版本可能也不满足需求,如 gcc 版本过低。
如果申请 sudo 权限或者请求更新系统或安装 docker,后期责任难以界定,运维和管理员一般也不会同意。
所以,最优方案还是有需求的用户在个人目录维护自己的工具链和环境。下文方案为围绕 HomeBrew 构建。
给 macOS 词典增加生词本功能
macOS 系统的自带词典应用非常强大,与其他应用整合很好,快捷取词很方便(command+control+d)。
但是美中不足的是缺少生词本功能,查了单词又很容易忘记,对语言学习者来说就有些不便了。
经过本强迫症的探索,终于找到基于 Karabiner-Elements + Automator + Logseq 的完美生词本方案。
最后的效果是,快捷键取词的同时记录单词卡片到Logseq对应的笔记。
关闭子进程打开的文件描述符
我们在测试代码时,由于需要经常重启服务,经常会发现服务端口被占用。
一般kill掉后台进程就ok了,但是如果服务有启动一些常驻的后台程序,可能也会导致端口不能释放。
在类UNIX系统中,一切被打开的文件、端口被抽象为文件描述符(file descriptor)
从python3.4开始,文件描述符默认是non-inheritable,也就是子进程不会共享文件描述符。
容器内进程优雅退出
在使用 docker 时,常常会碰到进程退出时资源清理的问题,比如保证当前请求处理完成,再退出程序。
当执行 docker stop xxx
时,docker会向主进程(pid=1)发送 SIGTERM
信号
如果在一定时间(默认为10s)内进程没有退出,会进一步发送 SIGKILL
直接杀死程序,该信号既不能被捕捉也不能被忽略。
一般的web框架或者rpc框架都集成了 SIGTERM
信号处理程序, 一般不用担心优雅退出的问题。
但是如果你的容器内有多个程序(称为胖容器,一般不推荐),那么就需要做一些操作保证所有程序优雅退出。
bash 语法备忘
bash 语法作为程序员好像都了解一些,但又缺少体系化学习,需要使用到某些功能时又经常手忙脚乱地查。
本文主要参考阮一峰的bash教程,对bash的知识点进行了梳理。
本文目的是作为bash的语法备忘录、语法速查表。
hexo 站内搜索内容不完全问题修复
在使用 Hexo 的站内搜索时,发现搜索的内容不全。单步调试发现xml解析不完整,有部分内容被截断了。
在浏览器中打开/search.xml发现以下错误。显然xml中有非法字符,xml解析产生了错误。
Windows 网络共享
要在不暴露 client 的情况下共享网络,一般就只能使用 nat(Network Address Translation), linux 下可以使用 iptables 很轻松地搞定。
nat 包含 DNAT 和 SNAT, 要想双向互通,必须两者都实现。
windows下的网络共享只有SNAT那一部分,比如各自免费wifi软件。少了DNAT,外部网络就无法访问内部。
还好windows下可以配置端口转发,实现等效的DNAT