Binary Life

诗人 方法论者 喝汤族 微微爸

Mac Tips: 对 Chrome 禁用 Cmd+Q

我有一个坏习惯, 开巨多 Chrome 标签页, 然后幻想着有一天可以一个一个看完并记录…

以前的解决方案是使用 OneTab, 实际情况是内存占满, 从未看完过.

在一天两次 Cmd+Q 把所有标签页都关掉之后, 我要继续 hack 这个问题. Quora 上已经有人遇到并解决了这个问题, copy 过来:

  • System Pref - Keyboard - Shortcuts - App Shortcuts - Add
    • App: Chrome
    • Title: Quit Google Chrome
    • Shortcut: Cmd+Opt+Q

Mac 重装/数据迁移

  • transfer 出来的 Mac 系统, 有一些地方需要重新设置
    1. 关闭 guest: Pref - User - Unlock - Guest User - Uncheck
    2. 修改机器名1: Pref - Share - Computer Name
    3. 修改机器名2: sudo scutil --set HostName <name>
    4. 修改 Terminal 提示符
1
2
3
4
5
vim ~/.bash_profile

export PS1="[\u@\h \W]\$ " # 增加这一行

source ~/.bash_profile
  • 开启 TRIM
  • 检查安装的软件
    • Dropbox
    • CloudStation -> 家用 ONLY
    • GoAgentX: 升个级吧 -> 买个 VPN 吧
    • Alfred: 设置 Spotlight 索引, 重建 Alfred 索引
  • 配置 hosts/ssh-config/known_hosts/vimrc/gitconfig/SwitchySharp
  • 各种清理
    • 清理个人的 Login Items: Pref - User - Login Items
    • 使用 CleanMyMac 清理全局的 Login Items
    • 使用 CleanMyMac 删除没用的软件
    • ~/ 下删除没用的目录和没用软件的残留
    • ~/Library/Application Support/Preferences, Caches, Logs 目录下删除没用软件的残留
  • 运行 Disk Utility
  • 修复 HomeBrew
    • 按照 brew doctor 的提示做即可

Update@2015.04.13: 修改"检查安装的软件"部分

Android: 捕获 Home 键

猿题库工作一年多, 新功能做了不少, bug 也改了许多, 近期开始做更多的优化工作. 本篇博客的内容来自"错题锁屏"功能的优化.

我们 2014 年 9 月开始做"错题锁屏"功能, 希望增加曝光, 提高存留. 开发该功能的同学现在已经结束实习出国工作了, 但做这个功能的时候我就知道坑很多, 而且上线前为了避免风险留了一些坑没改. 上线后, 发现该功能比较受欢迎, 所以又有了多次拉锯式的修改, 不过对于锁屏本身的坑并没有填.

关于如何防止锁屏进程被杀, 我可能会开另外一篇博客来说明, 不过其实你也可以逆向工程我们的 apk 自己去看. 还有就是错题锁屏变成一个独立进程之后, 进程间共享数据变成了一个新的大坑…

由于我们一开始就不想把错题锁屏做得很暴力, 所以虽然禁用了 Back 键(按 Back 键不能退出锁屏), 却还是保留了按 Home 键退出的可能性, 避免用户因为答不对题而无法解锁(我们可能低估用户了).

于是有一个问题, 按 Home 键退出锁屏之后, 用户可以在"最近使用"中重新打开锁屏界面, 而我们只想让用户在"最近使用"中看到猿题库本身. 我开始寻找如何在用户按 Home 键时让锁屏界面自己把自己 finish 掉的方法.

首先查到的方法是 onUserLeaveHint, 按 Home 键时确实会调用这个函数. 不过遇到的问题也很坑: 当有其它锁屏, 甚至 QQ 弹窗(实际上也是用类似锁屏的方法实现的)出现时, 我们的锁屏可能被挤掉(onUserLeaveHint 被调用).

然后开始寻找能够捕获 Home 键的方法:

  1. override onKeyDown, 不过 no longer works as of 4.0, 这里给出了完整的代码
  2. 这篇 vote 比较少的文章其实离最终答案很近了, 不过因为 vote 太少, 我一开始没有相信它…
  3. 中文网络上看起来有更多人搞过这个问题: 文章 A B C 大同小异, 这里分析得更详细一些. 其中 B 的代码更漂亮一些, 我试过可行 (Android4.+)

可行之后, 我发现又掉到了坑里: 即使 finish 掉了, 用户还是可以在最近使用中重新打开锁屏界面!!!

最后, 我解决这个问题的方法与捕获 Home 键没有任何关系, 只能把锁屏的 activity 设为最近不可见 (excludeFromRecents=“true”). 这充分体现了坚持做一个 SB 程序员的必要性: 过于相信一知半解的既有信息是错误的根源.

致 Weiwei: 我们期待着你的降临

记录

  • 圣诞节, Mimi 怀孕 14 周 2 天; 大风; 上线结束的时间还好, 9点到家.
  • 本周体重 51kg, 没有增加; 食欲仍然一般, 胃有胀气, 偶尔拉肚子; 睡 8 小时, 但梦比较多.
  • 第一次产前筛查已经过了一周; 约了 1 月 5 号的孕期课程第一节.

致 Weiwei

你的名字叫李 Weiling, 因为还不知道你是男宝宝还是女宝宝, 所以字还没有定. Weiling 这个名字是爸爸起的, 依照 willing 的发音, 希望你能够有自己的意志, 不随波逐流. 不过名字只是个祝愿, 健康快乐才最重要, 爸爸妈妈都清楚这一点.

因为你曾经离开过爸爸妈妈一次, 所以这一次爸爸妈妈都有点紧张. 说什么放轻松那是骗人, 但着急也没用却是真的. 一方面担心你是不是能顺利地到来, 另一方面也希望能在你到来之前做好更多的准备.

两个月前爸爸刚换了一份工作, 降薪来到了一家创业公司. 虽然心态好了不少, 也有了努力的方向, 但钱少了是个事实. 于是爸爸开始尝试理财, 赶上比特币大涨, 小赚了一笔. 投资还是投机, 一开始爸爸没有把握好, 赚了又赔, 身心疲惫. 反复几次之后, 爸爸开始尝试给自己设定几条规则:

  1. 投资自己(学习)最重要
  2. 投机没有关系, 但要自律, 不能违背第一条
  3. 设定合理的收益目标, 有助于平衡上述关系

这几条规则并不一定普遍适用, 但至少符合爸爸目前的情况. 同时, 爸爸也意识到目前物质基础还算牢固, 但快速增长也不现实, 应该更关注精神方面的准备. 这一点妈妈做得很棒呢! 从很久以前就开始看书, 还给爸爸普及了许多妈妈和宝宝相关的健康知识. 不过爸爸偶尔还是会神经兮兮地在削苹果的过程中洗 3 次手, 生怕妈妈吃到什么脏东西.

“对命运保持敬意, 对现实冷静分析”

想想这么多年都好好地过来了, 而且妈妈的体质很好, 爸爸也无非就是对于各种未知的指标有些焦虑, 应该可以尽快调整好的. 然后陪妈妈一起度过之后的 N 周, 一起期待着你的降临.

  • PS1, 爸爸会坚持锻炼身体, 减肥+增强体能, 带妈妈和你去看极光
  • PS2, 爸爸会逐步总结经验, 并分享给你, 也许在你焦虑/失望/恐惧的时候会用得上

Mac Chrome 升级

  1. 直接升级失败, Error 12
  2. 找到官方解决方案
1
2
~/Library/Google/GoogleSoftwareUpdate/GoogleSoftwareUpdate.bundle/Contents/Resources/GoogleSoftwareUpdateAgent.app/Contents/Resources/install.py --uninstall # Mac 10.9 上无此文件
sudo /Library/Google/GoogleSoftwareUpdate/GoogleSoftwareUpdate.bundle/Contents/Resources/GoogleSoftwareUpdateAgent.app/Contents/Resources/install.py --uninstall
  • 折腾半天还是不行, 最后从官网下载了最新版的 Chrome, 覆盖安装

  • Update@2016.03.10: 使用 Homebrew Cask
1
2
3
brew install caskroom/cask/brew-cask
brew cask search chrome
brew cask install google-chrome

Android 开发点滴

Manifest

弹出键盘

  • android:windowSoftInputMode 控制弹出键盘
    • stateHidden 为刚进入 activity 时不显示键盘

控件

EditText 与弹出键盘

  • 在 xml 中设置 android:inputType, 常用的有:
    • default, 中文手机会弹出中文输入法, 并切换到默认输入模式(通常是中文模式)
    • phone, 电话号码键盘, 不过我们通常还是会用 number 彻底限制只能输入数字
    • textEmailAddress, 虽然名字是 email, 但是也可以输入电话号码
  • java 中可以 setInputType, 对应的 type 在 InputType 找到:
    • 比如 textEmailAddress 对应 TYPE_TEXT_VARIATION_EMAIL_ADDRESS
    • 注意 textPassword 对应 TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_PASSWORD
  • 详见 官方文档

工具

sleep

  • SystemClock.sleep 不会抛出 InterruptedException, 同时也无法 thread.interrupt
    • Thread.sleep 则正相反

线程

UI 线程

  • UI 控件不是线程安全的, 所以只能在 UI 线程上操作
    • Activity.runOnUiThread
    • View.post/postDelayed
    • Handler
  • AsyncTask
    • doInBackground 在 worker 线程
    • onPre/PostExecute 和 onProgressUpdate 在 UI 线程

WebView

使用 HttpClient 的 cookie

1
2
3
4
5
6
7
8
9
10
11
12
/**
 * @param url - 形如 http://xxx.domain.com/yyy/zzz.z?mmm=nnn
 * @param cookie - 从 HttpClient 取得的 cookie
 */
public static void synCookies(Context context, String url, Cookie cookie) {
    CookieSyncManager.createInstance(context);
    CookieManager cookieManager = CookieManager.getInstance();
    cookieManager.setAcceptCookie(true); // 这句可能可以不要
    String cookieString = cookie.getName() + "=" + cookie.getValue() + "; domain=" + cookie.getDomain();
    cookieManager.setCookie(url, cookieString);
    CookieSyncManager.getInstance().sync();
}

Markdown Style

  • 本文仅用于有洁癖者(本人)统一 markdown 风格, 以及 check style

行文

标点

  • 除非必要, 所有标点都使用英文标点

强调

  • 说明性的词和短语用双引号(“”)强调
  • 提示性的词和短语用双星号(**)强调
  • 结论性的短语和句子用三星号(***)强调

删除

  • ~~删除的文字~~ -> 删除的文字

空格

  • 第一级列表标记(比如*)前不需要空格
  • 英文单词的前后都需要空格
    • 行首不需要前面的空格, 句尾不需要后面的空格
    • 如果英文单词在括号里, 则前后的空格写在括号外, 比如 “ (abc) ” 或 “ (abc 很不错)”
  • 左引号前和右引号后都需要空格
    • 行首不需要前面的空格, 句尾不需要后面的空格
  • 强调标记的前后都需要空格
    • 行首不需要前面的空格, 句尾不需要后面的空格