如何判断转录组测序是否为链特异性建库

一般而言,我们让公司测序都是知道链特异性建库的方法,除非你觉得他们给的结果不对,或者说你是从公共数据库中获取的转录组数据,并不确定采取的是什么建库方法。

关于链特异性测序的详细介绍,见链特异性测序那点事, 本文只是介绍如何使用RseQC的 infer_experiment.py 命令进行推断而已。

需要注意的是infer_experiment.py 的运行需要一个记录基因注释信息的bed文件,也就是没有注释文件就执行不了。

首先是安装这个RseqQC, 以及准备bedops,可以直接创建一个新的conda环境.

1
2
3
mamba create -n RseqQC -c bioconda -c conda-forge rseqc bedops -y
# 启动环境进行后续分析
conda activate RseqQC

我们需要先将给定的gff文件转成bed文件,假设你的gff文件名是 input.gff

1
gff2bed < input.gff > input.bed12

接着,准备你需要分析样本的BAM文件,如果你只有fastq,那么需要用STAR或者HISAT2进行比对,假设输出结果为 output.bam。

最后就可以使用 infer_experiment.py进行分析

1
2
3
4
5
6
7
infer_experiment.py --input-file output.bam -r input.bed12

# 输出信息如下
This is PairEnd Data
Fraction of reads failed to determine: 0.0160
Fraction of reads explained by "1++,1--,2+-,2-+": 0.0178
Fraction of reads explained by "1+-,1-+,2++,2--": 0.9663

结果表明,read基本都是”1+-,1-+,2++,2–”,也就是最常用的基于dUTP的链特异性建库。

如果是非特异性建库,那么结果大概都是50%-50%。

1
2
3
4
This is PairEnd Data
Fraction of reads failed to determine: 0.0172
Fraction of reads explained by "1++,1--,2+-,2-+": 0.4903
Fraction of reads explained by "1+-,1-+,2++,2--": 0.4925

后续的参数设置,就见链特异性测序那点事

如何让服务器不再龟速下载github的数据

思路

  1. 基于clash的代理,配置本地的代理转发
  2. 配置环境变量,http_proxyhttps_proxy

第一步:购买代理服务器,我推荐使用熊猫翻滚,即PandaFan, 注册的时候可以考虑填写邀请ID, 185780。

第二步:安装clash,你可以考虑在服务器上直接下载,但是大概率会遇到龟速。百度网盘链接: https://pan.baidu.com/s/1xErNbHOCsOeCnW44WfZQyg?pwd=zgnh 提取码: zgnh . 密码 xuzhougeng.top

1
wget https://github.com/Dreamacro/clash/releases/download/v1.18.0/clash-linux-amd64-v1.18.0.gz

在服务器上的家目录中,解压缩clash,并赋予可执行权限。

1
2
3
4
5
6
# 配置clash
mkdir clash
mv clash-linux-amd64-v1.18.0.gz clash
cd clash
gzip -d clash-linux-amd64-v1.18.0.gz
chmod +x clash-linux-amd64-v1.18.0

第三步,配置clash

clash的运行需要一个Country.mmdb文件,虽然会自动下载。但是速度比较慢,所以我也放在了百度盘中。按照如下方法进行手动配置

1
2
mkdir -p ~/.config/clash
mv ~/Country.mmdb ~/.config/clash

另外clash还需要一个yaml文件,配置代理规则,因此,你需要在clash的目录下新建一个config.yaml文件,内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
port: 7890
socks-port: 7891
allow-lan: true
mode: Rule
log-level: info
external-controller: :9090
proxies:
- name: "trojan"
type: trojan
# interface-name: eth0
# routing-mark: 1234
server: 服务器地址
port: 服务器端口
password: 密码
proxy-groups:
- name: science
type: url-test
proxies:
- trojan
url: http://www.gstatic.com/generate_204
interval: 300
rules:
- DOMAIN-SUFFIX,amazonaws.com,science
- DOMAIN-KEYWORD,github,science
- DOMAIN-SUFFIX,github.com,science
- DOMAIN-SUFFIX,github.io,science
- DOMAIN-SUFFIX,githubapp.com,science
- DOMAIN-SUFFIX,githubassets.com,science
- DOMAIN-SUFFIX,githubusercontent.com,science
- DOMAIN-KEYWORD,github,science
- DOMAIN-SUFFIX,github.com,science
- DOMAIN-SUFFIX,github.io,science
- DOMAIN-SUFFIX,githubusercontent.com,science
- DOMAIN-SUFFIX,rawgithub.com,science
- DOMAIN-SUFFIX,github.com,science
- DOMAIN-SUFFIX,github.io,science
- DOMAIN-SUFFIX,githubapp.com,science
- DOMAIN-SUFFIX,githubassets.com,science
- DOMAIN-SUFFIX,githubusercontent.com,science
- GEOIP,CN,DIRECT

注意上面的server, port, password都需要自己配置。我们可以从pandafan的账号后台中获取

配置方法

第四步:在你需要从github上下载数据到时候, 我们先通过./clash-linux-amd64-v1.18.0 -f config.yaml &启动代理,然后配置环境变量http_proxyhttps_proxy,如下

1
2
export http_proxy=http://127.0.0.1:7890
export https_proxy=http://127.0.0.1:7890

那么后续从github上获取数据就非常方便了。例如从github上克隆singularity

1
git clone --recurse-submodules https://github.com/sylabs/singularity.git

速度如下

git clone的速度

参考资料

编译安装容器singularity

Singularity的编译不是完全需要root权限,但是有root权限会更加简单,如果你的服务器上没有singularity,用的是ubuntu,可以把这篇文章发给管理员,让他帮你装一个。

编译的Singularity的环境是Ubuntu 20.04,先安装必要的依赖环境

1
2
3
4
5
6
sudo apt-get update && sudo apt-get install -y \
build-essential \
libssl-dev \
uuid-dev \
libgpgme11-dev \
squashfs-tools

然后你需要安装大于1.20的GO,否则无法编译新的singularity,这里用的GO版本是1.21。

1
2
wget https://go.dev/dl/go1.21.0.linux-amd64.tar.gz 
sudo tar -C /usr/local -xzf go1.21.0.linux-amd64.tar.gz

添加到自己的环境变量中

1
2
3
echo 'export GOPATH=${HOME}/go' >> ~/.bashrc
echo 'export PATH=/usr/local/go/bin:${PATH}:${GOPATH}/bin' >> ~/.bashrc
source ~/.bashrc

接着,我们需要从github上克隆一份singularity到本地,并切换到对应目录中

1
2
3
4
mkdir -p $GOPATH/src/github.com/sylabs
cd $GOPATH/src/github.com/sylabs
git clone https://github.com/sylabs/singularity.git
cd singularity

克隆之后,还需要下载这个库中的一些GO依赖库

1
2
git submodule update --init
go get -u -v github.com/golang/dep/cmd/dep

最后就是编译安装

1
2
3
./mconfig
make -C builddir
sudo make -C builddir install

最后会得到两个文件,一个是执行文件/usr/local/etc/singularity,一个是配置文件/usr/local/etc/singularity/singularity.config

需要注意的是,由于安装过程中,需要从GitHub上下载数据,因此要求服务器能够顺畅的访问GitHub,否则会因为网络原因失败。

关于申请OpenAI的API的几点补充

除了课程介绍如何使用第三方API外,可能大家也想申请一个OpenAI的官方账号。尽管在课程中,我们的演示过程非常顺利,中间没有出现意外,但考虑到不同学员的网络环境非常不同,所以这里做点补充。

网络环境

如果你使用wildcard,可以使用他们提供的美国家庭的浏览器环境。

首先,一定要打开隐私模式或无痕模式或Edge浏览器的InPrivate模式。不同浏览器有不同的说法,以Edge为例

InPrivate模式

其次,打开全局代理。并且网络环境只能选择的非大陆地区,例如英美、新加坡等。部分线路由于使用人数过多,会被OpenAI或者谷歌邮箱拉黑,因此如果在操作过程中遇到这类问题,就需要切换线路。

注意,如果切换了线路,需要你重新打开一个隐私模式或无痕模式或Edge浏览器的InPrivate模式

关于网络环境的提供商,我个人使用的是PandaFan,它的价格比较贵,因此也就比较稳定。只不过,目前用的人好像多起来了,估计用于注册OpenAI和谷歌邮箱,可能不太好用,只能出现问题就换个地区了。

由于GFW的存在,因此PandaFan域名有很多个 https://pandafan.website/,https://pandafan.soccer/, https://pandafan.bid/ ,任选一个就行。(如果注册的时候想填写邀请码,可以考虑写185780)

谷歌邮箱申请

虽然OpenAI的账号不是所有人都需要,但是谷歌邮箱确实很实用。

如果自己有多年前申请的谷歌账号,那是最好的。如果没有,就需要单独申请一个。

部分同学可能在申请过程中,不需要借助短信验证。

如果需要短信验证,就需要使用到 https://sms-activate.org/cn。

注册的谷歌账号,一定要注意,要先用一周(每天能够登录下),确保这个邮箱,不会被封号(俗称养号,不要被当做机器注册号),才能确保注册OpenAI后,能够一直使用谷歌邮箱登录。

OpenAI注册

如果使用自己的环境在短信验证阶段、绑卡阶段出现被ban的情况,就不要在同一环境下继续尝试,建议换个环境,有群友换了,7、8次才成。
OpenAI注册时要用到短信验证,从下面中选择一个方法

方法1: https://sms-activate.org/cn 选择英、美地区,非虚拟的手机号>

image-6k3guac8v9.png1692925772336.png

方法2:使用bewildcard提供的5条免费短信(因为是免费,所以可能资源紧缺)。

OpenAI绑卡付费

如果使用wildcard的环境也失败,联系下wildcard的客服进行解决。绑卡失败最大的问题就是网络环境,以及卡段问题。我当初就在这一步失败了很久。因此,课程中才介绍了使用第三方使用OpenAI的API方法。

在决定绑卡付费前,请先明白 https://chat.openai.com/ 的使用是不收钱的(当时要求网络环境),所以,如果不是刚需官方的api,可以先用一会 https://chat.openai.com/。

OpenAI的API的使用是收费的,并且由于常年被薅羊毛,新用户的免费额度一降再降,可能部分用户注册后连5美元都没有,甚至,你需要先存钱才能够调用,这都是正常的。因此,为了能够正常使用OpenAI的API付费,需要绑定信用卡。

早年间,我在折腾OpenAI付费的时候,经常遇到下面这个提示:

你的卡被拒绝

your card is declined

后来,我发现导致这个情况出现的的两个原因,就是虚拟信用卡的发卡商和网络环境。
经过不断的筛选,确定了课程中使用的WildCard。这是因为我发现,只有wildcar都可以自动扣费,其他都会有问题。

另外请大家在绑卡的时候,最好使用他们提供的远程环境,他们的环境相比于我们自己的代理对OpenAI而言,绑卡更容易被通过。

这也是wildcard提供的解决方法 https://help.bewildcard.com/zh-CN/articles/8075545-%E7%BB%91%E5%AE%9A-openai-%E6%8F%90%E7%A4%BA-your-card-has-been-declined-%E6%80%8E%E4%B9%88%E5%8A%9E

网络环境

OpenAI绑卡之后,会每个月自动根据你的这个月的使用量给你扣费(每月5号出账,确保卡上优余额),因此绑卡之后,后续原则上就用不上内部环境了。如果OpenAI扣款失败,请联系发卡商的客服进行解决。

最后,如果不打算继续使用OpenAI的API服务了,强烈建议取消付费计划,避免账号被盗导致扣费。

取消

API使用

大部分基于OpenAI API开发的工具默认地址是OPENAI官方的API,即 https://api.openai.com/ 。但是,官方的API地址在使用时需要一定的网络条件。如果需要为亲朋好友、师长等提供帮助,建议用第三方,他们通常会为国内环境做优化。如果一定要使用官方的接口,可以参考 https://www.openai-proxy.com/ 自建转发服务器。

部分应用的API地址有特别的填写要求,例如utools的ChatGPT好友,需要加上 /v1/chat/completions。 请在使用的时候注意修改。

从halo迁移到hexo

在距今很久的是2016年,我学会了购买域名,然后在一次课程中,我了解到了可以用github page搭建自己的网站,于是我倒腾了下Hexo,尝试这搭建了自己的博客。

但是由于水平不行,也不懂什么是github,最后也只是昙花一现,没能持久,所以,后来我用了简书、CSDN,将自己的技术博客发表在互联网上,让自己的内容更好被检索到。

然而,我内心还是有一个梦想的,我希望大家都可以通过访问包含我的名字拼音(xuzhougeng)的网站来看我的文章,后面机缘巧合下,我找到了一个博客搭建工具,叫做Halo。于是我就把自己的网站搬迁到Halo上,并坚持了多年。但是,由于我的服务器是在国外,就导致每次想把内容复制到微信公众号时,图片都会裂掉,我就需要花很多时间,做图片的重新复制工作。一种解决方案,就是我上个月重新买了一台国内服务器,然后重新部署了一个新版本的Halo。但是,让我难受的是,从1.x到2.x是一个不向下兼容的过程,就导致这个过程很痛苦。同时,每次登陆他的后台写东西也不是我中意的,我还是希望能够在本地写作,然后到处分发。

于是,我想了我的老朋友Hexo。我从之前的服务器上把数据导出成包含front-matter的markdown文件,然后将图片上传到腾讯的COS上,在把之前的图像URL做了替换,代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import re

cos_url = ""

os.makedirs('result', exist_ok=True)

for file in md_file:
with open(file, 'r', encoding='utf-8') as f:
content = f.read()
# print(content)
# print(re.findall(r'\(/upload/.*?\)', content))
for img in re.findall(r'\(/upload/.*?\)', content):
#print(img)
# print(img[2:-1])
content = content.replace(img, f'({cos_url}/' + img[2:-1] + ')')
#print (content)
# print(content)
new_file = os.path.join('result', os.path.basename(file))
with open(new_file, 'w', encoding='utf-8') as f:
f.write(content)

参考,https://hexo.io/zh-cn/docs/github-pages.html 实现自动化部署,就得到了当前的xuzhougeng.top。

上面说到,为了保证图片的随处使用,我用了腾讯云的COS作为图床,用的是utools的图床插件,他的配置如下

image-x0oiw2pb6n.png1692345113829.png

但是目前的博客还是有点小问题,那就是这个tag不太好,同时内容也不是特别的全,缺少我简书里的内容,后续慢慢的优化吧。现在,让我们来发布这篇推文吧

1
2
3
4
5
6
hexo generate
git add *
git commit -m "从halo迁移到hexo"
# $Env:http_proxy="http://127.0.0.1:7890";$Env:https_proxy="http://127.0.0.1:7890"
# export http_proxy="http://127.0.0.1:7890";export https_proxy="http://127.0.0.1:7890"
git push -u origin main

Oatk:利用HiFi Read进行细胞器组装

Oatk是我见过的一个非常实用、高效的植物细胞器基于PacBio HiFi测序的基因组组装工具。这里有两个限定语,一个是植物,一个是PacBio HiFi。如果不满足这两个需求,那就无法使用这个工具。

Oatk包括三个组件,syncasm用于从HiFi read中组装细胞器基因组。hmm_annotation会利用OatkDB的HMM profile对组装结果进行组装。最后的pathfinder 会根据注释信息和组装结果,得到环状的DNA序列。

Oatk软件编译本身仅有一个依赖,zlib,下载源码,就可以编译安装。

1
2
3
git clone https://github.com/c-zhou/oatk.git
cd oatk
make -j

在实际运行过程中,由于需要用到nhmmscan ,因此还需要额外安装了HMMER,可以使用conda安装。

另外还需要一个OatkDB,里面是作者预处理过的HMM profile,

1
git clone https://github.com/c-zhou/OatkDB.git

你可以设置一个环境变量,hmm_db_dir,用于后续分析。

1
hmm_db_dir=/path/to/OatkDB/v20230210/

Oatk的运行只需要一个命令,如下

1
2
3
4
5
6
input_hifi=/path/to/your/hifi_reads.fq

oatk -k 1001 -c 150 -t 8 \
-m $hmm_db_dir/angiosperm_mito.fam \
-p $hmm_db_dir/angiosperm_pltd.fam \
-o oatk $input_hifi

其中-k和-c用于设置syncmer大小和深度。所谓的syncmer,类似Minimizers ,用于从序列中高效的选取K-mers(也就是长度为K的序列)。因此-k 1001 表示,kmer长度最小为1001 bp, -c 150 表示该类型的kmer至少要出现150次。

在后续自己分析设置参数时,-k可以保持1001,-c必须根据实际的测序深度来,作者推荐该值在平均测序深度的5-10倍,用于有效的过滤核基因组序列,确保只筛选出细胞器的序列。

-t 时线程数,根据实际的情况调整。

-m和-p对应的你实际物种的线粒体和叶绿体的HMM profile。

-o则是输出文件名的前缀。

最终的输出结果为

  • oatk.mito.fasta: 线粒体的fasta
  • oatk.pltd.fasta:叶绿体的fasta

整体来说,oatk和作者之前开发的工具一样,非常的简洁,高效,并且实用。正如他所用的编程语言C一样。如果你用Hi-C用来搭基因组的话,强烈推荐用他的yahs。

在Windows中搭建一个基于WSL的Python数据科学环境

安装WSL,提供Linux环境

如果你发现后续的命令无法运行或者说软件商城中找不到,这可能意味着你的操作系统不符合要求。WSL安装要求 Windows 10 version 2004(Build 19041 )及以上,或者是Windows11.

以管理员身份(也就是右击命令提示符)打开Windows下的CMD或PowerShell(后续,我们统一称之为终端

然后终端中,执行如下命令

1
wsl --install

中间可能会出现几次弹窗,需要用户进行确定,如下是命令运行时的界面。

或许?,你也可以通过Microsoft Store依序下载Windows Subsystem for Linux 和 Ubuntu(命令行的等价操作)。

image_JZmsOMk0iJ

最后安装完成后,需要你重启一下系统。

重启之后,会自动出现终端,让你输入用户名和密码,该用户还用sudo权限。

image__lfZbSc_Fw

如果你没有出现,或者自己手滑了,把它关闭了,这也问题不大,这意味着后续启动将以root用户启动。

PS:启动wsl的方式很简单,就是在终端里输入wsl并回车,或者在应用里搜索ubuntu

image_vySieCziap

如果你觉得权限太大,还是希望以普通用户的方式登录。我们可以在root下用adduser 增加一个用户【WSL环境内】

image_HsYiTQ8y_i

然后将刚才新建的用户添加到sudo组中,例如xzg

1
usermod -a -G sudo xzg

最后在终端增设置我们刚才的用户为默认启动用户【直接打开的终端环境】

1
ubuntu config --default-user xzg

后续启动wsl 的时候就不再是root,而是新建的用户,并且该用户也能使用sudo。

配置WSL环境

可选:系统代理

由于很多软件都需要从GitHub上下载,因此需要先为Linux系统配置一个系统代理。

先确定下自己的WSL版本

1
2
3
4
5
wsl -l -v
# 输出结果如下
NAME STATE VERSION
* Ubuntu Running 2

我的是WSL2,它是基于Hyper-V运行,因此与Windows系统在网络上是两台独立的机器。需要让WSL代理指向Windows的IP

1
2
3
# 这部分代码可以放在.bashrc中,启动wsl时自动配置环境
host_ip=$(cat /etc/resolv.conf |grep "nameserver" |cut -f 2 -d " ")
export ALL_PROXY="http://$host_ip:7890"

如果是WSL1,那么就只需要用下面这个代码

1
2
host_ip=127.0.0.1
export ALL_PROXY="http://$host_ip:7890"

之后,在Windows上打开Allow LAN,也就是允许本地区域网的访问。

image_sSacJUuilI

这样子后续数据下载走的都是代理。

可选:oh-my-zsh

之后,我们还需要简单的配置一个oh-my-zsh

1
2
3
4
5
# 安装zsh
sudo apt install zsh
# 安装oh-my-zsh
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

需要注意,我们后续安装conda之后,oh-my-zsh是没有conda配置的,因此我们还需要在bash环境中初始化下zsh相关的配置

1
conda init zsh

另外,配置在.bashrc里的一些内容,也应该需要自己手动加到.zshrc文件中

可选:NVIDIA驱动

因为我的电脑需要做深度学习相关的分析,所以需要配置深度学习的分析环境。

配置命令参考自:https://developer.nvidia.com/cuda-downloads

image_yV0UklJJNt

只需要在WSL的Ubuntu中运行如下命令行

1
2
3
4
5
6
7
8
9
wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-wsl-ubuntu.pin
sudo mv cuda-wsl-ubuntu.pin /etc/apt/preferences.d/cuda-repository-pin-600
# 2.6G的数据下载
wget https://developer.download.nvidia.com/compute/cuda/12.1.1/local_installers/cuda-repo-wsl-ubuntu-12-1-local_12.1.1-1_amd64.deb
sudo dpkg -i cuda-repo-wsl-ubuntu-12-1-local_12.1.1-1_amd64.deb
sudo cp /var/cuda-repo-wsl-ubuntu-12-1-local/cuda-*-keyring.gpg /usr/share/keyrings/
sudo apt-get update
sudo apt-get -y install cuda

之后,只要在wsl的命令行中输入nvidia-smi 有输出就算成功。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
nvidia-smi
# 我的输出如下
Wed Jun 21 23:26:37 2023
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 525.85.05 Driver Version: 528.24 CUDA Version: 12.0 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 NVIDIA GeForce ... On | 00000000:01:00.0 On | Off |
| 0% 32C P8 13W / 450W | 2884MiB / 24564MiB | 1% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| 0 N/A N/A 32 G /Xwayland N/A |
+-----------------------------------------------------------------------------+

如果系统上安装了pytorch,可以检查下,是否能够调用

1
2
3
import torch
torch.cuda.is_available()
# True 表示能够盗用

必选:安装conda

我们使用conda管理不同的环境,避免不同软件的依赖间冲突,导致环境崩溃。

打开你的wsl,我们下载mambaforge,使用mamba作为包管理器,并默认增加conda-forge源

1
2
3
4
5
# 下载mambaforge(需要不错的网络环境)
curl -L -O "https://github.com/conda-forge/miniforge/releases/latest/download/Mambaforge-$(uname)-$(uname -m).sh"
# 安装mamba
bash Mambaforge-$(uname)-$(uname -m).sh
# 安装时会有一些的选项,注意选择

之后,就可以用mamba隔离不同的环境。例如,我们需要安装一个pytorch环境(带GPU)

1
2
mamba create -n pytorch2.0.1 pytorch=2.0.1 torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia -y
# 大约要下载3.1GB

需要注意的是,mamba与镜像的兼容性不是特别好,因此不推荐使用mamba的时候修改镜像,而是使用官方源。

安装vscode

VScode从微软官方站点(https://code.visualstudio.com/)下载安装

image_mH35pSo5-l

配置插件

未安装插件的VSCode只是一款普通的编辑器,为了能让它满足我们后续分析数据的需求,我们需要为其配置一些插件。

我们需要先配置“Remote Development”,有了它,我们才能够连接到WSL系统。安装方式如下(其他插件也类似)

image_VoS35suINB

之后用快捷键shift + ctrl +p 调出,然后输入wsl,我们连接到WSL。

image_VjdKtZP-0C

需要等待一会的后台初始化

image_Iw04LJcB3A

VSCode实现Jupyter

Jupyter 是一个开源的数据科学和机器学习工具,支持多种编程语言和平台。它允许用户在单个交互式笔记本中创建和共享文档,并且支持实时的代码编辑和运行。此外,Jupyter 还提供了一系列的库和扩展,可以用来完成各种数据分析、机器学习和科学计算任务。

通过VSCode中上安装一些插件,也可以通过终端访问 Jupyter Notebook

  • Python: 使得VSCode能选择不同的Python内核
  • Pytlance:类型检查等功能
  • Jupyter: 在VSCode提供类Jupyter的界面

需要注意的是WSL系统下的插件和Windows下插件并不互通,要单独安装。

之后新建一个以.ipynb结尾的文件,就可以切换不同的Python内核

image_t8wThT-sZh

第一次运行代码时,可能会弹出如下提示,选择“安装”即可。

image_RUBxu4j7TX

后续就跟网页版的Jupyter Notebook体验一致,你可以在其中画图,处理数据。

image_ml67PloBt2

那么以上,我们就算实现Windows系统下配置WSL,并使用VSCode作为我们的分析平台,用于处理数据

参考资料:

用Colab缓解我的GPU焦虑

大型语言模型(LLM)非常的火热,我就想着能不能自己在本地上部署一个开源的模型,比如说chatGLM-6B。尽管苹果公司自己的芯片支持pytorch的图形加速运算,但是真实体验下来,也只能说有待提高。

另一个方法就是配一个4090显卡的主机了,毕竟4090有24Gb的显存,跑个chatGLM-6B还是绰绰有余的。奈何,我多看了一眼LLaMA-60B,光模型文件都差不多80G了,总不可能去买一张A100 80G吧。

思来想去,还是听别人劝,用Google Colab吧。我测试了

那么问题来了,每次都要重新开资源,岂不是要花很多时间在环境配置和数据下载上?

事实上,你从Colab获取HuggingFace的模型时,速度是400Mb/s。

掌握了一个关于Bcrypt加密的知识

我发现,人的表达欲是看场景的,当涉及到我最感兴趣的技术类的话题时,我其实就知道该说什么了。

最近在搞一个简单的后台管理的源码的二次开发,原项目中,不允许直接在后台添加用户,只能通过注册,或者前期初始化的时候实现。最终,在GPT的协助下,我完成了这个工作。

首先,通过阅读源码,我发现项目中的密码不是明文存放(这个年头了,不会真有人还明文吧),是经过加密的,加密代码如下

1
const hashedPassword = bcrypt.hashSync(password, 10);

于是,我就让GPT根据这行命令给我写了一个脚本,结果如下

1
2
3
4
5
6
7
8
9
10
11
12
// encryptPassword.js 
const bcrypt = require('bcryptjs');

function encryptPassword(password) {
const hashedPassword = bcrypt.hashSync(password, 10);
console.log("Hashed Password: ", hashedPassword);
return hashedPassword;
}

// Get the password from command line arguments
const password = process.argv[2];
encryptPassword(password);

然后,我就发现了一个问题,那就是两次哈希的结果,居然是不一样的

1
2
3
4
$ node encryptPassword.js 123456
Hashed Password: $2a$10$Xp6RIApHxvQJsFT2FrzNUeKfyJoHOlcSUdqHD2tU/YnnYCSuMniVK
$ node encryptPassword.js 123456
Hashed Password: $2a$10$rDs3aQs221In0FsastR7PuarxwruyKOQ3Qd9T6p6dO81z/AUstz8q

我第一次遇到这个情况,于是我把结果返回给了了GPT,它给的回复如下:

两次加密结果不一样是因为 bcryptjs 使用了盐(salt)的概念来增加密码的安全性。盐是一个随机生成的值,与密码混合后进行哈希运算,生成最终的加密结果。

每次调用 bcrypt.hashSync 方法时,bcryptjs 会生成一个新的随机盐,然后将该盐与密码混合后进行哈希运算。因此,即使输入的密码相同,由于使用了不同的盐,最终生成的加密结果也会不同。

这种做法是为了增加密码的安全性,即使两个用户使用相同的密码,最终的加密结果也是不同的。这样做可以避免通过比较加密结果来判断用户是否使用相同的密码。

如果需要在后续验证密码时,可以使用 bcrypt.compareSync 方法将输入的密码与存储的加密结果进行比较,bcryptjs 内部会自动提取盐并进行相应的比较验证。

原来如此,于是我让GPT写一个测试脚本,让我来测试下,是不是真的如此

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//comparePasswords.js
const bcrypt = require('bcryptjs');

function comparePasswords(password, hashedPassword) {
const isMatch = bcrypt.compareSync(password, hashedPassword);

if (isMatch) {
console.log("Password matches!");
} else {
console.log("Password does not match!");
}
}

// Get the user input and hashed password from command line arguments
const userInput = process.argv[2];
const hashedPassword = process.argv[3];
comparePasswords(userInput, hashedPassword);

我运行之后,发现两个不match啊,GPT你是不是骗我

1
2
$ node comparePasswords.js 123456 $2b$12$RJhc7WSsbRhkg2QxZuDG6.qgPXhFlrbvfOtw0SWDHkElgt1thSPD2
Password does not match

当我把这段内容给GPT时,它敏锐的观察到,我的输入有问题,它的回复如下

在你的示例中,你在命令行中传递了哈希值作为一个参数。这在许多命令行解释器中可能会引起问题,因为哈希字符串中的$符号可能会被视为变量的开头,然后尝试去解析它。结果就是,你的程序可能没有接收到完整的哈希字符串,而是只接收到了一部分。

你可以尝试用引号将哈希字符串括起来,以避免命令行解释器对$符号进行解析。

你的命令应该这样写:

1
node comparePasswords.js 123456 "$2b$12$RJhc7WSsbRhkg2QxZuDG6.qgPXhFlrbvfOtw0SWDHkElgt1thSPD2"

在这个版本中,哈希字符串被括在双引号中,这会防止命令行解释器将$符号视为变量的开头。

看来可能是因为$导致的。不过遗憾的是,我运行上述的代码还是失败了。因为$在双引号内还是会作为变量的开头,使用单引号才行,因此正确形式是

1
node comparePasswords.js 123456 '$2b$12$RJhc7WSsbRhkg2QxZuDG6.qgPXhFlrbvfOtw0SWDHkElgt1thSPD2'

不管如何,我在GPT的帮助下,了解了一个新的库,Bcrypt,还知道了它能够保证每次加密的结果都是随机的,但又保证了,同一个密码能够正确的验证。比如说我让GPT写了一个python版本,虽然输出的结果很不一样,但是依旧能够通过验证。

我不知道说些什么

这篇不是一个技术文章,只是我最近的一些感想吧,记录下来,给以后的我看。

今年清明的时候,村委会的人问我回不回去,因为他们需要我上台讲点东西。我没有回去,因为我不知道说些什么。

在写毕业论文时,我在致谢这一部分拖了好久,明明有很多感受,有很多话要说,但是落笔却非常艰难,因为我不知道写的内容是否合适。

答辩结束的时候,主席老师问我想不想说些什么,我拿起话筒,刚准备说什么的时候,由于其他人没听到刚才那句话,以为已经结束了,就开始了下一个环节。我有点庆幸,因为我不知道说些什么。

毕业典礼快到了,研究生部希望我们录制一点视频,说说自己的一些感想。我本来想录制的,但是我发现一个问题,我不知道说些啥。

前些时候,给熊当伴郎帮忙,我问他婚礼上应该没有环节需要伴郎说两句吧,他说没有。还好没有这个环节,因为我不知道说些什么。

当我处于一个都是陌生人的环境时,我都会非常局促,我不知道应该如何开口,我不知道自己应该说些什么?

或许,不知道说些什么,是情绪太过复杂了?

或许,不知道说些什么,是因为我认为存在一个标准回答模式?

或许,不知道说些什么,是因为我之前根本没有类似经历,所以大脑直接宕机了?

哎,想不明白啊。