• 愉悦与平和,久违了

    其实本来我今晚(应该说是昨晚)的任务是为了一场小讲课,要搜寻一些好的文献,以及去回顾一下近期的病例。然而自己拖拉的老毛病再次发作,不自觉地溜到了油管,无意间看到了《圆桌派》第二季中对尹烨(华大集团CEO,华大基因副董事长)的访谈。嘉宾和几位主持的发挥都非常好,从病毒、基因开始,聊到生命,继而聊到物理、人性、教育,甚至宇宙、宗教和哲学。其中提到了许多我所了解的、不了解的科学家和思想家,讨论了许多见解和观点。最后落脚于自由,落脚于多样性的可贵。虽然个中确有一些错误,但整体瑕不掩瑜。看罢心情既激动,又似乎有一种坦然的平静,这样的感觉我似乎曾经拥有,但已经睽违太久,今日终于再次寻得。

    自离开大学、来到医院之后,年纪渐长,而所关注的内容却趋于单一,兴趣逐渐消退,只在病房、门诊、手术、考试之类的任务中疲于奔命,在上级、同僚的训诫和品评中丧失自我,逐渐沦为一个失去灵魂、俗不可耐之人。今日看到这些访谈,仿佛自己暂时摆脱了种种世俗困扰,回到了仰望星空的中学时代。或许自己的科研烂到一塌糊涂,那又如何呢?那些坐拥多少文章、专利,掌握多少课题,获得多少荣誉的“大牛”们,和这些真正的思想者相比,又算得了什么?人与人的智识、成就、名望固然有高低之别,但天地之间,本无上下。众生平等,死亡是最公平的程序。至于我自己,或许永远无法取得什么世俗上的成就,但能和这些伟大的思想者神交,聆听他们的见解,这样似乎也就足够了。想到这里,再面对平日他人对自己的评价、要求,以及繁冗的日常工作,似乎真的变得坦然了不少。

    写到这里,我突然明白了白居易写“如听仙乐耳暂明”时的感受。日常生活的痛苦之源实在太多,无尽的工作,上级的责难,还有政治环境的压迫,无一不在打击、扰乱自己的心神。沉溺于社交网站可以获得暂时的逃避,却难以得到长久的平和。恐怕总是需要找些东西,这样将自己的思维解脱出来,仰观宇宙,才能真正得到一些释放。是时候抽些时间,拿起放置已久“闲书”,找回曾经的自己了。

    又及:尹烨是一个饱受争议的人,遭到饶毅“炮轰”我也有所了解。我觉得相比之下,饶毅是个更纯粹的科学家,或者说科研工作者,对商业运作,以及科普一类“动嘴皮子赚吆喝”的行为嗤之以鼻,也是可以理解。但从《圆桌派》这两期所聊到的内容看,尹烨绝不只是个哗众取宠的商人,他涉猎广泛,对很多问题有自己的简介,对社会、生命和自然有着自己的情怀,从这些方面来看,他是很值得敬佩的。

  • “Consider”的部分常见用法总结

    我发现自己在写英文句子时常想去使用“consider”这个词,但是对其用法却非常含糊,以致于常常不知对错。恰逢今日要回复期刊编辑,在查找中看到了一篇很好的总结,进一步简化后,供自己参考。

    Consider 主动用法:

    Alice is considering sending a mail.

    Alice is considering that she can send a mail.

    Consider + 宾语 + 不定式的用法:

    Alice considers Bob to be a genius.

    Alice considers Bob to work like a genius.

    Bob is considered to be a genius.

    Consider … as:

    注意:有观点认为此类用法有误。

    Alice considers Bob as a genius.

    Bob is considered as a genius.

    Considering:

    Considering his age, Alice did very well.

    Considering she’s young, Alice did very well.

  • Prevent foremost blank page when plotting to PDF in R (with survminer)

    When I was generating a a series of plots using package “survminer” in R, I often suffer from a blank page generated automatically at foremost of the PDF. For example:

    library(survival)
    library(survminer)
    
    # Using lung dataset.
    
    cairo_pdf(filename = "./temp_plot.pdf", onefile = TRUE)
    for (single_sex in unique(lung$sex)) {
        lung_single_sex = subset(lung, sex == single_sex)
        cox_result = coxph(Surv(time, status) ~ age + ph.ecog, data = lung_single_sex)
        print(ggforest(cox_result, data = lung_single_sex))
    }
    dev.off()
    

    Then there will be three pages in temp_plot.pdf and the first page will be blank.

    I don’t know the exact reason of the issue. But it seems ggforest() called ggpubr::as_ggplot(), which called gridExtra:::grid.newpage() or something similar, then caused the blank page before the plot. I searched the issue on the web and most people advised setting onefile = FALSE in cairo_pdf() to prevent the blank page. While it is not an ideal workaround because it makes the PDF contain only the last plot written to the file.

    After some attempts, I found a relatively better workaround. The key is the plot(s) must be generated BEFORE (but not after) the PDF device opened. We can use a list to store the plot(s) which will be plotted on the PDF. For example:

    p_list = list() # To store the plots.
    for (single_sex in unique(lung$sex)) {
        lung_single_sex = subset(lung, sex == single_sex)
        cox_result = coxph(Surv(time, status) ~ age + ph.ecog, data = lung_single_sex)
        p = ggforest(cox_result, data = lung_single_sex)
        p_list = c(p_list, list(p))
    }
    cairo_pdf(filename = "./temp_plot.pdf", onefile = TRUE)
    for (p in p_list) {
        print(p)
    }
    dev.off()

    Then the pages of PDF seem normal.

    References:

    https://github.com/hms-dbmi/UpSetR/issues/90

    https://github.com/wilkelab/cowplot/issues/24

    https://blog.csdn.net/weixin_34032827/article/details/85900976

  • 删除第三方应用安装的 Firefox 扩展(macOS) / Remove Firefox extensions installed by other software (macOS)

    前一段时间在 macOS 上安装了 Avira 反病毒软件,后来嫌拖慢系统,用官方的反安装程序给删掉了。但 Avira 自动给 Firefox 安装的扩展(Avira Browser Safety)却没有被删掉。Avira 官网给出的方法是在 Firefox 删除,但实际操作却发现新版 Firefox(>61.0)竟然不允许在浏览器中删除第三方安装的扩展,清除 Firefox 配制文件也没能把这个插件删掉插件。更诡异的是,在谷歌上竟然搜不到相关的资料。没办法,只好自己手动寻找插件,最后在/Library/Application Support/Mozilla/Extensions中发现了相应的扩展,手动删除后,一切终于清净了。

    //

    Recently I installed Avira AntiVir on macOS, but soon uninstalled on account of slowing down the system. Nonetheless the Firefox extension installed by Avira, Avira Browser Safety, was not been deleted. Avira official website recommended user to uninstall it manually inside Firefox, but the truth is newer Firefox (>61.0) just forbids uninstalling extensions installed by other software from the browser, clearing Firefox data is useless. More strangely, I searched on Google but didn’t find anyone suffered from this issue except for me. Then I have to find the extension manually. It locates at /Library/Application Support/Mozilla/Extensions. The problem is solved by deleting the directory of the extension, and everything works fine now.

  • 好累

    好累……好累……干不动了……好想休息……

  • 使用 homebrew-rmtree 自动删除软件依赖

    Mac 用户大概都听说过 Homebrew ,一款 mac OS 下的包管理软件,可以提供 Linux/Unix 用户熟悉的包管理实现模式和操作体验。然而总的来说 Homebrew 的体验比起几个知名发行版的包管理器还是差了许多,最遗憾的就是不支持卸载软件包时自动卸载该软件所依赖的包。但其实一个包被哪些软件所依赖,Homebrew 是有数的,如果卸载一个被依赖的软件包,Homebrew 就会给出提示。

    于是,homebrew-rmtree 横空出世,这款 Homebrew 插件可以自动解决依赖问题,在删除一个软件包的同时删除不被其它软件所依赖的包。使用也非常简单,首先按照上文 github 页面链接内的指导,添加好 rmtree 的 tap:
    brew tap beeftornado/rmtree
    然后就可以轻松地一键卸载软件包及其依赖:
    brew rmtree package

    不过软件作者也给出了警告,要注意有些打包者没有正确地写好依赖。此外有些包可能此前被单独安装过,但后来又安装了依赖该包的软件,那么在卸载这个后安装的软件时也可能将之前单独安装的软件包一并卸载掉。毕竟软件包的依赖问题比较复杂,还是要小心行事呀……

  • 做事情

    做内容的生产者,而不仅仅是内容的消费者……

  • 博客的微博化使用

    类似使用微博那样,文字力求简洁明确地表达意思,或仅是单纯表达当前的心情。

    优势:

    • 富文本支持
    • 良好的排版和阅读体验
    • 关键词系统更强大
    • 不受制于140字的限制

    劣势:

    • 发表和分享的便捷性均较差
    • 回复者与博文作者地位的不对等
    • 去中心化引起内容零散,不集中
  • 关于谷歌和苹果的开发者网站……

    因为最近想尝试一下简单的平台相关的开发,所以分别浏览了谷歌和苹果的开发网站,对比之下觉得还挺有趣的。

    谷歌的开发者网站(https://developers.google.com/)简洁而友善,开门见山,入口非常清晰,想关注什么产品直接点进去便知。进入Android开发者网站之后,也基本传承了简洁的特点,首页几个大大的区块是最新开发套件的下载、开发入门指南和实例。给我这样的初学者的感觉非常好,好像一切的踌躇都解决了。入门指南也是步步为营,解释得非常清楚。

    苹果的开发者网站(https://developer.apple.com/)则比较感性,有大量绚丽的图片和视频,宣传标语也极具吸引力。进入Develop页面之后文档入口也比较明确,然而再进入Guide之后觉得似乎比较混乱,不知从何入手。几个针对自家开发套件的介绍也缺少相对清晰的学习入口。

    那么其实我想说什么呢……其实我想说苹果的开发者网站里都什么玩意啊净是自己产品的广告除了吹牛没点正经东西你这是搞啥啊……

  • 语与文

    注:本来今晚我是要看专业书的,然而拖延的老毛病又犯了,于是为了理直气壮地虚掷光阴,我暂时扔掉了课本,把今天这样一个小小的思考化作文字,转述给大家。这段话其实是我写完正文后加上去的,随着写正文的过程,今天这个小小的思考也逐渐地完善与扩充,最终成为现在这个样子。

    自打幼儿园以来,便有一门课称为“语文”。语者说也,文者写也。“语文”的字面意思便是“说”和“写”。由是观之,“语文”这个词概括了这个学科最基础、最重要的两个能力。

    然而“说”和“写”其实是有很大的不同的。某些人(比如我)自认在说话上还有一些水平,然而真正落实在纸面,却时常觉得表达起来似乎远不如说话来得顺畅。对目前的我而言,最直接的反映就在书写病程记录的时候效率极低,严重拖慢工作进度。为何包括我在内的很多人常常说得头头是道,真正写起来就遇到很大的阻力?其中一个原因是就是文字表述较口头表述而言,本身就有着很多独特的难度所在。

    不论是听讲座的时候,还是练习英语听力的时候,每个人应该都有所体会。聆听他人讲话,绝大多数情况下获得的是讲者的内容大意、核心思想。至于具体的句子,哪怕是刚刚听到,想要逐字复述都是极为困难的。这就为演讲提供了很多方便:文辞稍显不通畅?问题不大,不影响理解就好。搜肠刮肚却词不达意?用省略词糊弄过去便可。顺序稍显混乱?通过流畅的转折引导读者的注意力和思维,很少有人会注意到这样的瑕疵。总之,讲也就讲一次,听也就听一次,有时没解释清楚的问题还能在答听者问的时候再追加解释,只要讲者想表达的思想本身是系统的、完善的,事后听者在脑中那么一组织、一加工,自然得到一种整体感。阅读文字则不同,所谓好书不厌百回读。作者无法掌控读者阅读的速度、深度和次数,作者也不可能根据读者的反馈即刻作出进一步说明。于是再精深的理论,再难表述的思想,终将落实到纸面的一个个个字符上,没有其它出路。想不出如何表达?反正不能画个横线空着,也不好说“我想到了一个绝妙的词语,但是这里地方太小,写不下”。文辞不够通畅?要么字斟句酌地修改,要么就赤裸裸地摆在纸上,随时供他人指摘。顺序不够工整?读者只要稍有察觉,回头一翻便一清二楚。此外,在演讲时,讲者的地位、语气、动作、神态,无一不对听者施加影响,而阅读时,前面这些干扰一一被排除(或许地位除外,但即便如此,由于本人不在面前,地位的效应也被大大削弱)。所以写文章,一就是一,二就是二,断绝了一切打马虎眼的可能,一字一句供读者任意地审阅与评判。

    所以写作这件事,就逼迫作者对表达的每个细节进行思考。光有个模糊思想是不够的,要把每个细节具象化,通过语言传达给读者。恐怕这就是写作对作者最大的锻炼与益处吧。