给 vscode-R 的 httpgd 画图预览做一点微小的工作

过去两天我在自己的 fork 上给 vscode-R 的 httpgd 画图预览做了点修改,主要是两件事:支持选择输出格式(SVG/PNG),以及修一下在新加入的位图情况下在高分屏/多显示器上把清晰度和缩放问题


TL;DR

  • 画图格式现在可以选 SVG(svgp)PNG
  • HiDPI 修复:对 PNG 这种位图渲染会按 设备像素比(DPR) 放大请求的宽高,同时把 zoom (缩放等级) 也一起乘上 DPR,这样图标/文字大小在缩放时不会显得过小,移动窗口到不同 DPI 的屏幕也会自动刷新,保持清晰。
  • 切换历史图更快:加了一个按 plot id + 尺寸 + 缩放 + dpr + 渲染器 组合键的缓存;也确保图像大小变化的时候会正常重绘。难以想象之前官方版插件居然没有缓存()

1)加入位图让数据点太多的图流畅点

这次改动的直接动机,是在做单细胞 RNA-seq 分析时,散点图的数据点可能有几十万,httpgd 当前是只能用 SVG,会吃一吨内存而且卡得不能动。虽然 SVG 在矢量清晰度上有优势,但在这种点数爆炸的情况下,DOM 元素数量巨大,渲染和交互都非常慢。

这个问题我本来几百年前就想解决一下,但是当时想复杂了,想着要自己实现一下 SVG 的浏览器GPU加速渲染,这对我来说就肯定搞不定了… 但前两天发现 httpgd 其实本来就支持 png 输出… 之前想太复杂了。


2)位图的适应屏幕分辨率

位图在高分屏上如果直接用逻辑像素请求,会显得模糊。SVG 是没有这个问题的,因为它本来就是矢量的。我在前端把 devicePixelRatio(DPR)带给后端,请求时按 width * dpr / height * dpr 去生成位图。同时,把 zoom 也一起乘上 dpr,这样放大后文字和标记的视觉大小保持一致,只是清晰度提升。

如果窗口被拖到另一台 DPI 不同的显示器,DPR 变化会触发一次刷新,即使宽高没变也会重绘,从而保证始终是高清的。

2025-08-12    
一台机器上有好几套conda怎么办

其实这一篇也很水,可是又好几个月不更新了我能怎么办呢

背景

故事是这样的:

我们实验室用在我来之前就用全局安装的办法装了一套公用的conda,可是我当时没有管理员权限,不好换mamba或者进行类似的操作,所以用起来很难受,所以我就往自己的$HOME里装了自己的miniconda,但是给其它同学debug的时候经常要回到系统自带的conda环境里面,我就很烦,前两天就往自己的.zshrc里面写了个:

function use_system_conda(){
  __conda_setup="$('/lab_public/shared/applications/conda/miniconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
  if [ $? -eq 0 ]; then
      eval "$__conda_setup"
  else
      if [ -f "/lab_public/shared/applications/conda/miniconda3/etc/profile.d/conda.sh" ]; then
          . "/lab_public/shared/applications/conda/miniconda3/etc/profile.d/conda.sh"
      else
          export PATH="/lab_public/shared/applications/conda/miniconda3/bin:$PATH"
      fi
  fi
  unset __conda_setup
  export WHICH_CONDA__="system conda"
}

function use_own_conda(){
  __conda_setup="$('/home/my_user_name/anaconda/bin/conda' 'shell.zsh' 'hook' 2> /dev/null)"
  if [ $? -eq 0 ]; then
      eval "$__conda_setup"
  else
      if [ -f "/home/my_user_name/anaconda/etc/profile.d/conda.sh" ]; then
          . "/home/my_user_name/anaconda/etc/profile.d/conda.sh"
      else
          export PATH="/home/my_user_name/anaconda/bin:$PATH"
      fi
  fi
  unset __conda_setup
  export WHICH_CONDA__="own conda"
}

use_own_conda

function get_which_conda(){
    echo $WHICH_CONDA__
}

PROMPT="%F{blue}(\$(get_which_conda))%f$PROMPT"

这样就方便多了,我想用自己的conda就use_own_conda(默认)想用系统的conda就use_system_conda,最后面一行还往prompt里面加了个提示提醒我用的是哪一个(是的我今天用错了才加的),如果有使用bash的同学想抄作业记得改一下设置prompt的操作,这个是zsh only的,它设置颜色什么的要方便一些。

2021-10-07    
Surface Pro 6简评

辣鸡微软

图为已经卖出的Surface Book 2。 已经卖出的Surface Book 2

一拖拖了十一天,今天正式开始写一写吧。
首先介绍一下本人立场和用过的机器,曾为软粉,后认清资本家的丑恶嘴脸不再怀有感情,只是硬件确实还行继续捧场。买过几部Lumia(万恶之源),很是喜欢,后来Lumia没了;大学呢先被微软蛊惑当真以为寨版够用,购入899寨版一台,也还撑了一段时间;大一下学期正赶上SP4发售,很喜欢,找家里要钱买了(败家子);一直用到今年三月出来实习自己攒钱加东拼西凑复又找家里要一点换了Surface Book 2 13.5 i7 8G 256G版本,其实这台机器我本来也想写个体验,但是人懒嘛,鸽掉了;再后来呢,今年10月20号,终于因为嫌沉,卖掉了SB2换了SP6。仔细想想可能亏了吧,不过Surface Book对于我来说确实是徒增累赘(我在这三四年间维护有一台“忒修斯的台式机”,目前是E5 1620 + 16G + GTX 1070的状态),还是减重来的实在。
其实我拿到机器已经很有一段时间了,刚出不久就着急换上了,一来是终于用上了新的八代U(可惜是8250U之类少老的,不过也无妨),四核比双核强上不少;二呢就是上面说的,嫌沉;三…我能告诉你是因为酒红+纯黑配色深得我心吗?

我很喜欢这个红色

购买之前

微软这次与那隔壁奸贼苹果学坏,出新(实是旧)配色捞钱,浓眉大眼叛变革命,应当拖出去打死。官网售价虽然都是黑白同价,但是从58256版本开始才有黑色。听上去没有什么问题,但是58256要价8988,58128要价6988,(均为官网售价),也就是说你如果要买黑色,你必须多掏2000块钱(我上一台128G是完全够用的)。
另外,这一代的起售版本(乞丐版)终于不是可怜的4G内存了,价格上似乎也稍微良心了一点,相比于上一代的价格其实是略有下降的。去年54128版本要价7688,这代6988,详细对比不做了,没那闲工夫。Surface Go其实也在考虑范围,但是转念一想,我并不是那种硬核商务人士需要揣兜即走的便携性,Surface Pro系列在我看来是最符合我的需求的,因此还是买了SP6。

开箱

开箱过程略带一笔吧。熟悉的盒子,不一样的配色。阻尼适中,充电器依旧那么大,微软这一点应该改改了。 没错,这里本来有很多图的。 包装盒 键盘盖和鼠标 我非常喜欢磁吸的鼠标盖

日常体验

申明在先:仅为个人体验。我的使用环境是公司寝室两点一线,公司使用的软件主要是chrome连服务器jupyter和office偶尔Adobe Illustrator,和盯着发呆;个人使用主要看B站写东西,和盯着发呆。

听说是最棒的二合一产品

这个部分先夸夸吧,一会再骂个痛快,缺点就不说了。

系统

经过我已经见过上百遍的初始化过程,来到桌面。这次的Surface终于有自己的壁纸了(没记错的话)。还凑合吧,我就一直用着了。
Surface Pro 6默认壁纸
开机的Windows Hello非常快,不过应该是还没有到慢的时候,我想(一语成谶)。关掉一些中国人没处用的功能,忍受着割裂感堪比太平洋的UI界面和大概是bing机翻的设置选项,我将机器调到了我喜欢的样子,顺便装上了代号1809,十月推送又取消,等到十一月快结束了终于推送的这样一个系统更新(真的,你要相信我,真的是稳定版,微软情真意切地说)。 1809系统更新的系统信息截图
抛却bug,观感上略微好了一点,也终于加入了云剪贴板,实现了傻老板在家里复制在办公室粘贴的愿望。不过这个功能是默认关闭的,也没有什么提示,考虑到想必大多数Windows用户都是不看更新日志、也从来不会打开开始菜单里非常想被你点开的《使用技巧》的,和其他许多功能一样,这个功能应该直到大多数人换苹果都不会被发现,然后他们吹爆苹果。 云剪贴板的设置页面

硬件

这一代i5版本也没有风扇,永远不会听到嗡嗡声,这一点非常棒,就我的日常使用也没有出现过热的情况,温手是有的,特别是充电的时候比较热。不过由于我触摸屏使用的不多(原因在后面),不会有特别热的感觉。没有测温枪,仅供参考(私心广告,专业评测认准notebookcheck.net)。
屏幕方面加入了新的广色域模式(设置里叫增强模式),打开之后的直观感受是黑色更深,亮色更亮,确实舒服了很多(我就是这种老年人审美喜欢重口味)。我这台机器貌似有一点漏光,不过比起惊天地泣鬼神的SP4,还是好到不知道哪里去了。高分屏问题就是老生常谈了,无话可说。
续航方面略有加强,没有特别认真测过,没那个闲工夫。比SP4强上不少,比SB2吧,嘿嘿嘿。
2018年,8G起售的内存还是比4G不知道高到哪里去了。日常使用没有问题。CPU也完全满足我数框框的欲望。这里八代低压值得夸奖。 八代低压值得夸奖的线程数 便携性方面原地踏步,当然,已经很棒,几代无风扇版本重量没有变化。进步还是有的,合盖即走差不多可以实现了。我基本上不会主动去关机,都是合盖带走,晚上休眠。除了SSH连接不可避免的断开之外,几乎对我的工作没有什么打断,也不会在背包里异常发热(一个月内没有遇到,希望不要立下必倒的Flag)。
键盘手感没有大变化,依旧舒适。触摸板略小但也够用。玻璃表面比较顺滑,出汗除外。Alcantara表面触感舒适,看着没毛,摸着是有毛的触感,很棒。使用一月未见明显沾污。此处点名批评SP4,用几周就脏了。背光养眼,SB2背光和键盘手感明显不如SP系列,廉价感明显,明明贵那么多。 最后,支架,更大开合,爽。 除此之外体验与SP4无异。
欠图
什么,你问我笔和触摸屏?没事不会忘的,在批判一番部分。

如果它是最棒的二合一产品,一定是因为同行的衬托

初始化

其实从初始化过程开始就槽点满满。从Surface Pro 4开始,笔不再是随机附赠的配件,于是开机初始化过程中也没有了让你配对笔的提示(让你感觉你买的不是Surface)。还有吓人的小娜,我认为这个语音设置这个选项应当不默认打开,真的容易吓人一跳,特别是在小娜越来越人工智障的今天。这个功能呢,我在装完台式泡脚的时候最常用,也算得上是一个无障碍设计了吧。
对了,不知为何微软下调了备受好评的Cortana的开发优先级,连带着已经有的feature也改了回去,现在是一个彻头彻尾的人工智障了。

系统与BUG

进入系统,UI上的割裂感、翻译的错误不必多说(其实是懒,以后可能写两篇吧),让你感觉这不是一个这种体量的公司能做出来的产品。对了,微软说,这是正式版。实际上我没有感觉到这个“正式版”与预览版有什么差别。尽管当我装上1809的时候,微软已经推出了修复版本并宣称这种事情不会再发生,然而我发现我不能够顺利的使用映射网络驱动器功能(与台式机),上网一查,emmm。你问我为什么不用旧版?旧版有同步剪贴板吗? 微软被光速打脸的承诺 1809存在无法使用映射网络驱动器的BUG 还有我们的中文输入法呦!自定义词库云同步的问题不说了,我是没有成功过,手动导入导出吧标准一会一变,真是有能耐(隔壁Google一个样)。中文输入法的细胞词库是这个画风的。专业有着非常明显的重叠,并且你在中国做,连个诗词戏曲都没有,打个“铁骑突出刀枪鸣”都得费半天劲…(刚刚发现这句没有云联想可能是因为已经不念tie3 ji4了,改成tie2 qi2了。我不管,我念骑,保护有明确区分意义的多音字人人有责。) Windows内置输入法的细胞词库选项 上面还提到,合盖即走几乎可用,为什么说是几乎可用呢?因为微软会在不知道什么判断标准下,将你合盖的动作视为重启,尽管你的后台还挂着一大堆东西。这个问题我记得从1709就非常显著了,然而一直还在,可能微软想彰显手动休眠不可替代的传统意义吧。
对了,Windows Hello已经被拉回SP4的速度了哈哈哈哈哈哈哈哈一语成谶。

触摸屏与手写笔

罄竹难书啊罄竹难书。这还是第一页呢。这是一个横跨我用过的所有Surface产品的BUG。 在Google中搜索Surface触摸屏BUG的结果 真的,时不时就不能用。毕竟有的时候手戳一下比拿上鼠标移过去要方便许多,就指望着它工作的时候,哦嗬(hou),不能用;不指望吧,误触。真的是尴尬之极。触摸屏在我最密集的使用情景是晚上吊夹在床头看视频或是串流游戏。然而吊起来之后嘛,你自然是没有键盘鼠标可用,触屏有如此蛋疼,于是我时常需要取下调好再装上,使用体验可想而知。啊对了,触摸板也会有短暂失灵。
另外,Windows平台上的触摸输入法,一言难尽。英文输入法已经加入语音输入和滑行输入;中文嘛…嘿嘿嘿。要说是因为中文的难做,那早在砍掉的Windows Phone上就有了中文的语音输入和滑行,准确率相当不错,甚至还有调节键盘光标的小点点,一到电脑上就成了:“来来来大家都用触屏的Windows吧,只不过这个Windows触屏不大方便”。 英文输入法的语音输入 中文输入法的嘿嘿嘿 我的手写笔是4代赠送的,因为使用频率不高,一直没有更新换代。一来我既不会画画,字也丑;二来真的不好用,延迟也高支持的软件少,还经常跟随触摸屏一起失去响应。现在微软强化了Sticky Notes软件算是得以一用。(另外,Sticky Notes曾经用过便笺这一中文名出现在我的软件列表里,不知何故又改了回去) 辣鸡微软 显示屏也在这里说了吧,这才一个月,左下角已经出现三个亮斑,我是绝对没有撞过屏幕,爱惜得很。等下次有什么严重问题送修得了。
骂完了,只想说“这锭银子奴不要,与你娘做一个安家的钱”。

2018-11-14    
我为什么要把小米手环3批判一番

我为什么要把小米手环3批判一番

大家都知道今年五月底小米举行了它的八周年发布会,发布了小米8、小米手环3等等等等。米8骂得够多了,我今天来骂一骂小米手环。

1-屏幕

你看看隔壁荣耀手环4,玻璃!玻璃!小米手环这边从有屏幕开始就一直是塑料,实在是一言难尽。手环在手上戴着不摘下来,会面临各种脏污环境,甚至比手机屏幕还容易刮花,实在是不明白为啥还是用的塑料材质。

说完材质,继续看看隔壁荣耀,彩屏!彩屏!还有你家黑加也是彩屏,黑加也有NFC,你难道想告诉我你成本限制吗?还有你看看隔壁荣耀都支持支付宝二维码支付了,你呢?明明横过来肯定够显示一个条形码的。支付宝直接告诉我把小米手环当作沒有屏幕的设备,真是一言难尽。 小米手环被支付宝归类到无屏幕 然后是一如既往的频闪问题,你说你一个手环又不用调亮度闪什么闪。以及根据我在小米手环2的经验,这块屏幕多半会在一年之后烧屏到亮处几乎不可见。哦,对了,现在太阳底下也是基本看不见的。 小米手环严重的频闪

2-奇怪的操作逻辑

上下滑切换一级页面,左右滑进入二级页面,这个设计看上去非常合理嘛,为什么要批判一番呢?因为当你左右滑动之后,并不能直接上下滑动切换大菜单。也就是说我看完消息之后想看看天气,必须得先返回才能滑动。我不知道这样会带来什么好处。

3-续航

不同于二代的“虚假宣传”,宣传二十天实际一个多月。这代的虚假宣传…就是字面意思。标称20天的续航时间,我用了一天就掉了10%的电,感觉不大放心。

4-NFC,NFC

这是我整个使用过程中最一言难尽的部分了。

首先,不支持mipay,公交卡支持的城市也远不如小米手机多。更别提华为一向有的吸卡功能,小米从来就没有过,这可是能切切实实省掉开卡费的呀。当然,这样做可能有商业上的考量,但是从消费者的角度看,显然还是有很大的进步空间的。我还是抱着一丝支持mipay的希望,你不知道我有多讨厌二维码。

好了,下面是我感到最莫名其妙的部分—————门禁模拟。当然我知道这是处于实验阶段的一项功能,但我觉得下面这些错误,并不应该在小米这种体量的公司中出现。

首先,我公司的门卡绝对不是一张加密卡,也确实是一张符合小米手环模拟要求的卡,我的手机都能够读出来并且用第三方软件模拟作为门禁使用。然而小米手环识别了半天告诉我不能模拟,我不知道这是为什么。没有办法我只得买了cuid白卡,用手机dump下公司门卡之后写进去,再由小米手环进行模拟,嗯,成功了,我可以刷开公司分配的宿舍的门了,我开心的像个两百斤的孩子,完全没有意识到第二天会发生什么。

第二天,我拿着卡准备刷开公司大门的时候,发现刷卡机不理我。是的,不理我。好在我还是带了工卡的。坐到座位上,我用手机读取了工卡的信息(下图左),和手环的信息(下图右)。高斯模糊的是卡的id,打码原因是你要是拿去模拟了也能进我们小区。红圈圈住的是0扇区0块,也就是厂商块 (我不大想在这里科普过多NFC知识,感兴趣可以点链接看看,以后说不定懒癌好了自己写一篇)的后半部分,大多数情况下是不能改写的。可以看到,小米这个模拟并没有模拟这后面的一部分,导致我司验证较严的刷卡机不能识别。我并不知道为什么会做出这样的限制,反馈了也没人理我,很生气。

莫名其妙的模拟行为

当然,NFC这一个部分还是有值得表扬之处的。不像其他模拟门禁的手环仅仅模拟ID,小米手环这个NFC是有一张完整的卡的,也就是说即使是加密卡,用读卡器破解之后也能够写入到小米手环里面,后续如果我的懒癌好了大概也会写一篇我校加密校园卡塞进手环的文章,可惜我不在学校,不能测试是否能用。

5-总评

其实米环3做得还不错,个人觉得总体上比米环2好看,腕带也确实更结实米粒不那么容易掉。屏幕材质、色彩、续航等问题也都是普遍反馈的问题,希望小米能够做出改变(似乎并找不到有效反馈渠道)。销售的时候NFC版迟四个月我是觉得大大的败笔,以及初始表带仅有黑色,导致我想用红色的还得多花二十,只能安慰自己 “总会断的” 了。

这大概是这个blog上的第一篇文章了。

6-最近的更新(20181113)

得到消息说米环3固件更新了白卡功能,可以自行写入加密信息。测试后发现0扇区0块依旧无法修改、也依然会篡改0扇区0块,而之前模拟卡片的非0扇区本来就可以自行修改、写入加密信息,因此本次更新似乎意义不大。

2018-10-19