<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
<channel>
<atom:link href="https://xxu.do/feed" rel="self" type="application/rss+xml"/>
<title>Jayden's site</title>
<link>https://xxu.do</link>
<description>为天地立心,为生民立命, 为往圣继绝学,为万世开太平。</description>
<language>zh-CN</language>
<copyright>© Jayden Tseng </copyright>
<pubDate>Tue, 07 Apr 2026 04:42:46 GMT</pubDate>
<generator>Mix Space CMS (https://github.com/mx-space)</generator>
<docs>https://mx-space.js.org</docs>
<image>
    <url>https://lh3.googleusercontent.com/a/ACg8ocJFtTpFtQapYMHK_6AI6Iku0SDaTjsAvlUuIs2UCvXjrJDhMadX=s96-c</url>
    <title>Jayden's site</title>
    <link>https://xxu.do</link>
</image>
<item>
    <title>从 FRP 被制裁到 Docker EasyConnect</title>
    <link>https://xxu.do/posts/geek/From-FRP-Crackdown-to-Docker-EasyConnect</link>
    <pubDate>Thu, 20 Nov 2025 15:17:08 GMT</pubDate>
    <description>Intro

此前，为了随时随地能访问校内资源，于是写了 使用「Surge + Snell v5 +</description>
    <content:encoded><![CDATA[
      <blockquote>该渲染由 marked 生成，可能存在排版问题，最佳体验请前往：<a href='https://xxu.do/posts/geek/From-FRP-Crackdown-to-Docker-EasyConnect'>https://xxu.do/posts/geek/From-FRP-Crackdown-to-Docker-EasyConnect</a></blockquote>
      <h3>Intro</h3>
<p>此前，为了随时随地能访问校内资源，于是写了 <a href="https://xxu.do/posts/geek/seamless-access-to-campus-resources">使用「Surge + Snell v5 + frp」无感访问校内资源</a>。</p>
<p>后来有了随时随地访问实验室资源的需求后，便在实验室分配的工作电脑上也如法炮制了一个。好景不长，我的工作电脑网络在 2 天后就被封禁，IT 表示这种方式是不可接受的；我表示实验室不给学生开放 VPN 权限，因此只能自己解决这个问题。于是过了两天，IT 告诉我决定给我开放 VPN 权限。</p>
<p>尽管 VPN 连接的缺点有很多，在上一篇文章中已经说过了，但也没办法。</p>
<h3>问题解决</h3>
<p>昨天我拿到了 VPN 连接连接方式，以及账号和密码。不出我所料，果然是深信服。</p>
<p>此前在寻找解决方案的时候，了解到了这个 <a href="https://github.com/docker-easyconnect/docker-easyconnect">docker-easyconnect</a>，其通过在 Docker 当中起一个深信服的 VPN，并开放 SOCKS5、HTTP 代理服务，其他应用便可通过这个响应的端口将流量进行代理。</p>
<p>于是心生一计：</p>
<ul>
<li>使用 docker-easyconnect 连接 VPN 并提供 SOCKS5、HTTP 代理</li>
<li>使用 Surge 进行分流</li>
</ul>
<p>目前测试下来，这个方案的体验和 <a href="https://xxu.do/posts/geek/seamless-access-to-campus-resources">使用「Surge + Snell v5 + frp」无感访问校内资源</a> 基本一致：</p>
<ul>
<li>不会让所有的流量一股脑全部走 VPN</li>
<li>无需频繁开关 VPN</li>
</ul>
<p>甚至还有一些优势：</p>
<ul>
<li><p>无需一台处于校园网环境中，24 小时开机的电脑/服务器</p>
</li>
<li><p>无需具有公网 IP 且线路稳定的服务器进行内网穿透</p>
</li>
<li><p>最重要的是：不会违反任何实验室的规定</p>
</li>
</ul>
<p>搭建的部分非常简单，几乎就是一行代码的事儿，略过了。</p>
<p>使用 Surge 分流的部分，在<a href="https://xxu.do/posts/geek/seamless-access-to-campus-resources">上一篇文章</a>中也已经写过，也不再赘述了。</p>
<h3>Tail</h3>
<p>本文提到的解决方案，实际上对于学校的 VPN 来说，也是通用的。</p>
<p>目前因使用时间不是那么长，所以会遇到什么问题暂时未知，我猜保活可能会是一个问题。</p>
<p>如果你也遇到和我类似的困扰，可以试试这里提到的方案</p>

      <p style='text-align: right'>
      <a href='https://xxu.do/posts/geek/From-FRP-Crackdown-to-Docker-EasyConnect#comments'>看完了？说点什么呢</a>
      </p>
    ]]>
    </content:encoded>
  <guid isPermaLink="false">691f30f41708f2dbc05ba099</guid>
  <category>posts</category>
<category>折腾</category>
 </item>
  <item>
    <title>使用 「Surge + Snell v5 + frp」无感访问校内资源</title>
    <link>https://xxu.do/posts/geek/seamless-access-to-campus-resources</link>
    <pubDate>Mon, 03 Nov 2025 15:30:27 GMT</pubDate>
    <description>Intro

由于实验室不在校内，而实验室的网络环境并没有办法通过 IP 认证的方式，来访问学术期刊</description>
    <content:encoded><![CDATA[
      <blockquote>该渲染由 marked 生成，可能存在排版问题，最佳体验请前往：<a href='https://xxu.do/posts/geek/seamless-access-to-campus-resources'>https://xxu.do/posts/geek/seamless-access-to-campus-resources</a></blockquote>
      <h3>Intro</h3>
<p>由于实验室不在校内，而实验室的网络环境并没有办法通过 IP 认证的方式，来访问学术期刊，而这恰恰是一个非常高频的需求。</p>
<p>因此解决方案就只剩下了通过 VPN 进行访问，但这也带来了一些问题：</p>
<ul>
<li>若仅在需要访问相关资源的时候连接 VPN，长此以往可能在这件事情上会浪费掉大量的时间；</li>
<li>若一直连接 VPN，在切换网络的时候会遇到重连的问题，同时 VPN 的连接体验下来并不稳定，带宽也并不高，体验非常差；</li>
<li>由于 VPN 会接管所有的流量，因此一些并不需要使用 VPN 访问的资源也绕了一大圈，而本地内网的资源又无法连接了；</li>
</ul>
<p>于是我花了一点点时间，研究出了一套使用「<strong>Surge Snell v5 + frp + Subnet 策略组</strong>」的方案，来无感知地解决这个问题。</p>
<h3>Prerequisite</h3>
<p>简单来说，整个过程分为以下几个步骤：</p>
<ol>
<li>Snell v5 代理建立在校园网环境中的一台 24 小时开机的服务器中；</li>
<li>校园网打洞非常困难，因此为了省事，直接使用 frp 将 Snell v5 代理穿透到具有公网 IP 的服务器上；</li>
<li>使用安装了 Surge for Mac 的 MacBook，写一些简单的规则后，通过 Subnet 策略组进行愉快上网。</li>
</ol>
<p>如果你也希望尝试这套方案，你需要：</p>
<ul>
<li>一台处于校园网环境中，24 小时开机的电脑/服务器</li>
<li>使用 macOS，并购入 Surge for Mac 软件</li>
<li>有一台稳定的，具有公网 IP 的服务器，以使用 frp 进行内网穿透</li>
</ul>
<h3>Example</h3>
<p>具体的部署非常简单，就不演示了，如果遇到问题，可以在评论区讨论。</p>
<p>实现无感的关键是建立一个 Subnet 策略组，我这里的策略是：</p>
<ul>
<li>连接校园网（SSID 为 eduroam/ShanghaiTech/Jayden）时，本策略组的流量走直连，此时不会走校内代理绕一圈。</li>
<li>除以上情况外，本策略组的流量一律走校内代理。</li>
</ul>
<p></p>
<p>随后将相关的域名，例如 pnas.org(PNAS)、nature.com(nature)、cell.com(Cell)、science.com(Science) 等设置为上述的 Subnet 策略组即可。</p>
<p>除了域名以外，也可以将校内的一些 IP 走上述 Subnet 策略组，从而实现对校内资源的访问。</p>
<p></p>
<h3>Tail</h3>
<p>后来 VLESS 也推出了反向代理的功能，但由于本方案已经稳定用很久了，所以也不想折腾了，感兴趣的朋友可以试试。</p>
<p>另外，运行 frp 的公网服务器，对中国大陆的线路也需要有保障，否则用起来也是一言难尽。此前尝试过一台位于香港的服务器，本想着物理距离更近，理论上用起来应该更无感才对，实际上由于其线路不够优质，以至于某些时候卡顿严重。后来使用了一台线路质量较高的美国服务器，相当稳定。</p>
<p>而 frp 其实也有其他的替代，但有点折腾不动了，于是直接选用了 frp。</p>
<p>如果你有和我一样的困扰，我希望这篇内容对你有帮助。</p>

      <p style='text-align: right'>
      <a href='https://xxu.do/posts/geek/seamless-access-to-campus-resources#comments'>看完了？说点什么呢</a>
      </p>
    ]]>
    </content:encoded>
  <guid isPermaLink="false">6908ca931708f2dbc053d701</guid>
  <category>posts</category>
<category>折腾</category>
 </item>
  <item>
    <title>好久不见</title>
    <link>https://xxu.do/notes/137</link>
    <pubDate>Thu, 09 Oct 2025 13:45:51 GMT</pubDate>
    <description>半年不见，聊聊最近的一些想法。

AI 时代

近半年来没有更新什么文章，出游的也好，学术的也好。我</description>
    <content:encoded><![CDATA[
      <blockquote>该渲染由 marked 生成，可能存在排版问题，最佳体验请前往：<a href='https://xxu.do/notes/137'>https://xxu.do/notes/137</a></blockquote>
      <p>半年不见，聊聊最近的一些想法。</p>
<h3>AI 时代</h3>
<p>近半年来没有更新什么文章，出游的也好，学术的也好。我可以给自己找借口，说太忙没时间，这也是客观事实。但最主要是因为在当下，我很难写出高质量且不可替代的内容。</p>
<p>没有照片的游记不是好游记，而作为一个修图党，修图和选图全是会用掉不少时间，这也导致有好几次出游的照片到现在都还没碰。此外，单纯的游记分享单纯是对自己生活的记录，私以为，他人能从我的游记中收获的内容太少，花时间看我的游记不如上小红书搜一搜来的全面（毕竟有人专门吃这碗饭）。</p>
<p></p>
<p>而学术内容的写作更是让我感到头疼。想起来 ChatGPT 3.5 的发布也就是大概三年前的这时候，那时的生成式人工智能还充满着各种幻觉，及其不可信；同时也无法联网，这也导致无法对内容进行鉴定；思考能力的缺失也导致其逻辑常常出现混乱，这也导致了输出基本不可信，只能拿来写点充满 AI 味儿的文本。</p>
<p>而现在已经大有不同了。在 coding 领域，Cursor 和 Claude Code 太强大了，各种 MCP 的运用也是眼花缭乱；而在文生图领域，Nano Banana 也是让人叹为观止；而在科研领域，拥有联网以及思考能力的 ChatGPT 也已经能给我提供很多助力了。这也让我感叹，现在的 AI 真是太强了，强到一个月花 20 美金，就可以极大的提高一个人的竞争力。</p>
<p>前两年还常常在新闻中看到，有人坚持在工作当中不使用 AI，公司对此也没有任何要求。现如今，一个不使用 AI 的员工，几乎可以说不会被任何公司青睐，甚至会被厌恶。有人说 AI 的发展速度其实远远不及预期，但事实上从 ChatGPT 到现在也就 3 年时间而已。AI 发展的速度之快，每隔一段时间就会出现大量新知，看都看不过来；每隔一段时间就会出现某个改变行业的产品（Cursor、Nano Banana 等等），这种发展速度让我时常觉得跟不上时代，我也不由得害怕自己在这一波时代浪潮里面没有把握住机会，甚至失去饭碗（尽管概率实在太低）。</p>
<p>这也让我想到一个问题，在这个时代，我的护城河到底是什么？这是最近让我焦虑的一个问题。</p>
<blockquote>
<p>ChatGPT 5：</p>
<p>护城河来自“选对问题 + 掌握独占数据与样品 + 建立可扩展的实验/计算平台 + 严格的验证与合规 + 跨学科整合执行力”。AI 是加速器，但“问题选择、因果推断、实验约束与质量体系”决定不可替代性。</p>
</blockquote>
<p>论知识储备、阅读速度，机器的高通量太高，人类无论如何都比不上。将同一个问题抛给博士生和 AI，目前 AI 的回答大概率比博士生要全面和完整。而这种机器只需要 20 美金就可以获得，人类却需要二十多年的训练。这也不由得让我感到悲观，这让迫使我思考，如何用好 AI。</p>
<p>最近刚看完<a href="https://www.bilibili.com/video/BV1hNJ1zLEb8/">老罗和红衣大叔的播客节目</a>，里面也多次提到所谓护城河的问题，讨论对象主要是公司。红衣大叔的观点是，能够及时调整战略，这件事情本身就是一家公司的护城河。这件事情放到个人发展上来说，私以为，也有道理。</p>
<p>可惜到目前为止，我对于 AI for academic career 的探索还仅仅局限于与 ChatGPT 对话的阶段，甚至越想越觉得自己应该 quit，进入另一个行业。因此焦虑了一段时间，确实目前也没什么太好的办法，但转念一想，能意识到这一点、并尝试做出改变，这件事情本身就蛮好的了。</p>
<h3>CCP4 Shanghai School</h3>
<p>据说，<a href="https://www.shanghaitech.edu.cn/eng/2019/1031/c1688a46045/page.htm">上一次 CCP4 Shanghai School</a> 还是在五年前，这次能参加说来也是巧，正好在附近举行，机会太难得了。</p>
<p></p>
<p>听完第一天的上午就收获许多，于是坚持把 10 天的 Lecture 几乎全听了，也混进去听了几天的 Tutorial，收获确实不少，让我对晶体学有了更深刻的认识。尽管没有这些知识，也能顺利解析蛋白质晶体结构并完成投递，但总有一种，缺乏训练的感觉。</p>
<p>本考虑将此次会议学到的东西，加以完善并分享出来，但新建文件夹后发现，我能够分享的事情也很有限。一方面我也只是懂得皮毛而已，只是相比之下可能了解更多；在可预见的未来，我能够真正上手做晶体学机会非常少，这还挺遗憾的；另一方面，CCP4 官方的教程已经比较详细了，我也不想去做重复造轮子的事情。这种文章意义不是太大，不如把时间放到其他地方，于是又删除了文件夹。</p>
<p>当然，如果您有什么想和我沟通的，我非常乐意，可以联系我。</p>
<h3>计算生物学 or 生物信息学</h3>
<p>这也是最近在思考的问题。</p>
<p>单纯的结构生物学，已经让我感觉有点疲软了。首先结构本身，很多时候并不能说明太多问题，尽管它是一个很好的工具；其次，想持续保持竞争力，有两个部分我觉得必须得考虑，一方面是点出更多技能树，另一方面是往药物研发上靠拢。否则，单纯的做结构生物学，而不往应用上走，感觉会错失很多机会。</p>
<p>身边有不少做生信的朋友，他们的生活状态令我比较向往，且做生信的前辈们出路都不差，这也不由得让我思考是否可以将生信和结构生物学结合一下。</p>
<p>但探索的结果让我还是有点失落。生物信息学和结构生物学的交叉实在有限，计算生物学却非常适合，于是计划趟一趟计算生物学的坑，包括但不限于：</p>
<ul>
<li>分子动力学模拟</li>
<li>分子对接/虚拟筛选</li>
</ul>
<p>再深入的就先不涉足了，毕竟本职工作还是结构生物学，避免本末倒置。看看有没有机会做一些有意思的东西出来。</p>
<p>当然，这些我还是打算 Powered by AI，这样会更快一些。</p>
<h3>尾巴</h3>
<p>感觉还有蛮多可以聊的，但已经写不动了，先到这里吧，也暂时不知道下一篇是啥时候。</p>

      <p style='text-align: right'>
      <a href='https://xxu.do/notes/137#comments'>看完了？说点什么呢</a>
      </p>
    ]]>
    </content:encoded>
  <guid isPermaLink="false">68e7bc8f0bf9e924aae0658e</guid>
  <category>notes</category>
false
 </item>
  <item>
    <title>使用 ChimeraX 绘制晶体结构小分子密度</title>
    <link>https://xxu.do/posts/x-ray/Using-ChimeraX-to-plot-crystal-structure-small-molecule-density</link>
    <pubDate>Mon, 28 Apr 2025 14:32:29 GMT</pubDate>
    <description>Intro

你需要：

已安装 ChimeraX
晶体结构坐标 PDB 文件
和 PDB 文件对应</description>
    <content:encoded><![CDATA[
      <blockquote>该渲染由 marked 生成，可能存在排版问题，最佳体验请前往：<a href='https://xxu.do/posts/x-ray/Using-ChimeraX-to-plot-crystal-structure-small-molecule-density'>https://xxu.do/posts/x-ray/Using-ChimeraX-to-plot-crystal-structure-small-molecule-density</a></blockquote>
      <h3>Intro</h3>
<p>你需要：</p>
<ol>
<li>已安装 ChimeraX</li>
<li>晶体结构坐标 PDB 文件</li>
<li>和 PDB 文件对应的电子密度 mtz 文件</li>
</ol>
<p>本文以 <a href="https://www.rcsb.org/structure/7VH8">7VH8</a> 为例，参照<a href="https://xxu.do/posts/academic/Retrieve-structure-from-PDB-and-view-density">这篇文章</a>得到 PDB 和 MTZ 文件。</p>
<h3>TL;DR</h3>
<ol>
<li><p>打开 ChimeraX 安装 Clipper，有两种安装方式:</p>
<ol>
<li>图形界面中，在 <code>Tools</code> -&gt; <code>More Tools...</code> 中找到安装即可。</li>
<li>执行 <code>toolshed install clipper</code> 命令进行安装。</li>
</ol>
</li>
<li><p>打开 PDB 文件后，将 mtz 文件拖入，会出现弹窗，选择对应的 PDB。

打开后应该是这样的：
</p>
</li>
<li><p>展示密度：</p>
<ol>
<li><p>我们先将背景颜色改为白色：</p>
<pre><code class="language-chimeraX">set bgcolor white</code></pre></li>
<li><p>随后选中小分子：</p>
<pre><code class="language-chimeraX">sel #1.2:4WI</code></pre></li>
<li><p>仅展示小分子附近的密度：</p>
<pre><code class="language-chimeraX">clipper isolate sel surroundDistance 0 contextDistance 5 maskRadius 2.5 hideSurrounds true focus true</code></pre><table>
<thead>
<tr>
<th>参数</th>
<th>描述</th>
</tr>
</thead>
<tbody><tr>
<td>sel</td>
<td>指的是当前选中的原子（即小分子）</td>
</tr>
<tr>
<td>surroundDistance</td>
<td>指定扩展选择的距离，默认为0埃。这个参数决定了除了选中的原子外，额外包括哪些原子来计算地图覆盖区域。</td>
</tr>
<tr>
<td>contextDistance</td>
<td>这个参数设置了额外显示的上下文区域的距离，默认为5埃。这些原子会被显示但不会被地图覆盖。</td>
</tr>
<tr>
<td>maskRadius</td>
<td>指定地图掩码的半径，默认为3埃。这决定了地图在选定区域周围延伸多远。</td>
</tr>
<tr>
<td>hideSurrounds</td>
<td>如果为true，不在 surroundDistance 范围内的原子将被隐藏（卡通显示不受影响）</td>
</tr>
<tr>
<td>focus</td>
<td>如果为true，视图将重置并居中显示覆盖区域</td>
</tr>
</tbody></table>
<p></p>
</li>
<li><p>调整 Contour Level 并赋予颜色：</p>
<p>需要注意的是：Coot 和 ChimeraX 所采用的 Contour Level 存在差异：</p>
<table>
<thead>
<tr>
<th>软件</th>
<th>Contour Level</th>
</tr>
</thead>
<tbody><tr>
<td>Coot</td>
<td>默认使用标准差(sigma)单位来表示等值线水平(尽管在软件中显示为 rmsd）。<br />当在 Coot 中设置 Contour Level 为 1.0 时，它实际上表示显示密度值大于或等于平均密度加上1.0个标准差的区域。</td>
</tr>
<tr>
<td>ChimeraX</td>
<td>通常以绝对电子密度值（electron/Å³）来表示等值线水平。<br />当运行命令 <code>volume #1 level 1.0</code> 时，它表示显示密度值等于或大于1.0 electron/Å³的区域。</td>
</tr>
</tbody></table>
<p>因此：</p>
<ul>
<li><p>如果希望在 ChimeraX 中以标准差(standard deviation)为单位设置等值线水平，可使用 <code>sdLevel</code>，这与 Coot 中的概念相同。</p>
</li>
<li><p>如果希望在 ChimeraX 中表示以均方根偏差(root-mean-square deviation)为单位设置等值线水平，可使用 <code>rmsLevel</code>.</p>
</li>
</ul>
<pre><code class="language-chimeraX">volume #1.1.1.2 sdLevel 1.0 color blue</code></pre><p></p>
<ul>
<li>这里可以使用 <code>color blue</code> 来赋予颜色。</li>
</ul>
<p>对于mFo-Fc差异图，你可能想要设置正负值：</p>
<pre><code class="language-chimeraX">volume #1.1.1.4 sdLevel 3.0 color green sdLevel -3.0 color red</code></pre><blockquote>
<p>[!TIP]</p>
<p>如果 ChimeraX 中间有一个指示三轴中心，你可以通过 <code>cofr show false</code> 来关闭它。</p>
</blockquote>
</li>
<li><p>对光影和颜色进行简单调整后，一张漂亮的图就制作完成了。
</p>
</li>
</ol>
</li>
</ol>
<h3>Outro</h3>
<p>网上有很多教你如何对冷冻电镜密度进行展示和着色的教程，而晶体结构似乎较少，希望对你有帮助。</p>
<p>欢迎留言讨论。</p>

      <p style='text-align: right'>
      <a href='https://xxu.do/posts/x-ray/Using-ChimeraX-to-plot-crystal-structure-small-molecule-density#comments'>看完了？说点什么呢</a>
      </p>
    ]]>
    </content:encoded>
  <guid isPermaLink="false">680f917d8791c066707d3986</guid>
  <category>posts</category>
<category>X-Ray</category>
 </item>
  <item>
    <title>2025 新年伊始</title>
    <link>https://xxu.do/notes/136</link>
    <pubDate>Sat, 19 Apr 2025 07:37:54 GMT</pubDate>
    <description>已经好几个月没有更新文章了，最近发生了一些事。

申博和毕业

从去年 12 月开始决定留下深造，到</description>
    <content:encoded><![CDATA[
      <blockquote>该渲染由 marked 生成，可能存在排版问题，最佳体验请前往：<a href='https://xxu.do/notes/136'>https://xxu.do/notes/136</a></blockquote>
      <p>已经好几个月没有更新文章了，最近发生了一些事。</p>
<h3>申博和毕业</h3>
<p>从去年 12 月开始决定留下深造，到现在反反复复，出现了很多事。</p>
<p>先是快乐接受老板发来的 Offer；再到 3 月份因为申请材料中出现的瑕疵，被老板教育了一顿（我很感激，确实是我的问题）；再到 3 月底得到消息说老板要离职；很快又出来方案，录取后转组；短短一个多月心情一直在过山车。所幸申博得到了另一位老师的帮助，目前已经拿到 Offer，但转去哪个组，一切还未尘埃落定，静候结果。</p>
<p>不过毕业就得靠自己了，最近改完了盲审意见，也不知道找谁帮忙看看，希望一切顺利。</p>
<h3>内容</h3>
<p>最近又打开了南开师兄的<a href="https://laiyz.cn/">结构生物学学习网站</a>，不得不说比上次看内容丰富了许多。不过上次发现的小错误还在，于是给师兄指出，得到了肯定。</p>
<p>想到这次申博的时候，本希望将个人网站加入到简历和 Slides 当中，大师兄说网站的内容太宽泛，没有垂直在学术领域，建议拿掉，我觉得有道理。</p>
<p>于是我想着是否需要做一个网站，专门聚焦于学术内容。后来想想作罢，我还是决定将其放入到个人网站当中，否则我的个人网站的内容过于干瘪，毕竟作为生物学学生，总不能个人网站全是折腾相关的内容，不过我打算做出一些改变：</p>
<ul>
<li>将文稿和手记重新分类：文稿中仅包含折腾和学术相关的内容，并进行分类，不管是 Cryo-EM、X-Ray 还是其他科研相关，都更清晰，容易找到。而感悟、游记等其他内容都放到手记当中。</li>
<li>将一些不希望公开的教程放入文稿的 <code>内部教程</code> 专栏中：过去有一些教程总觉得不适合公开，就一直放在本地了，借助手记的 <code>需要密码</code> 功能可以实现这个目标。</li>
<li>内容的质量：也是首师兄内容的启发，很多内容写得不是很详细，因为写起来耗费的时间可能比较多，这也是需要改变的，后期创作的内容还是聚焦于质量。</li>
</ul>
<h3>打印照片</h3>
<p>过年的时候把相机和照片打印机带回家了，给家人拍了照并打印了出来。有些遗憾的是今年忘记组织拍全家福了，明年有机会的话一定要补上。</p>
<p>这个过程我觉得太有仪式感了，且非常具有纪念意义，因此最近买了一堆相纸，将过去 2-3 年的照片都打印出来了，计划做一个相册。</p>
<p>用的照片打印机是女朋友去年送我的生日礼物，<a href="https://www.mi.com/photoprinter">小米米家照片打印机1S</a>，可以打 3 寸 和 6 寸相纸：</p>
<ul>
<li>3 寸相纸是正方形的，这也就导致了照片比例和大小和普通的 3 寸差异比较多，个人觉得不好掌握。</li>
<li>6 寸相纸大小是我比较喜欢的，比例差不多是 3:2。<ul>
<li>风景照等可以直接打印 6 寸；</li>
<li>如果觉得 6 寸太大，也可以使用美图秀秀将两张图拼到一起，比例选择 3:2，间隔为 60，然后在打印的时候加上边框，这样可以正好打印成 2 张 4 寸的照片。</li>
<li>另外可以打印成人生 4 格这种风格的，参考<a href="https://www.xiaohongshu.com/explore/647495cc000000000800c394?source=webshare&xsec_token=AB0fk96_8mBUUi_CKn2u7uujdmNkdKMlZVknWRoHRdKkc%3D">这篇笔记</a></li>
</ul>
</li>
</ul>
<p>总之玩法很多就是了，如果你们感兴趣的话我可以写一篇教程来教你们怎么打印。</p>
<h3>日常</h3>
<p>从家回到学校之后，发现 MacBook 的第一个 Type-C 口居然接触不良了。本身就只有 2 个 Type-C 口，现在只剩一个能用了。</p>
<p>网上查了下可能是 Type-C 的小板氧化等原因造成的，网上淘宝只要十几块钱就可以买一块；找了个上海的商家包换好 100 元。但也可能是主板出问题，这样的话就比较麻烦了。</p>
<p>不过目前还没去换，暂时不影响使用，平时的需求也就是连接显示器和充电。</p>

      <p style='text-align: right'>
      <a href='https://xxu.do/notes/136#comments'>看完了？说点什么呢</a>
      </p>
    ]]>
    </content:encoded>
  <guid isPermaLink="false">680352d28791c0667078b882</guid>
  <category>notes</category>
false
 </item>
  <item>
    <title>重新部署 MixSpace+Shiroi</title>
    <link>https://xxu.do/posts/geek/redeploy-MixSpace%2BShiroi</link>
    <pubDate>Sat, 19 Apr 2025 06:22:38 GMT</pubDate>
    <description>Intro

昨天刚对博客的架构进行了一波更新，今早醒来发现服务器到期了，导致网站直接 Down，甚</description>
    <content:encoded><![CDATA[
      <blockquote>该渲染由 marked 生成，可能存在排版问题，最佳体验请前往：<a href='https://xxu.do/posts/geek/redeploy-MixSpace%2BShiroi'>https://xxu.do/posts/geek/redeploy-MixSpace%2BShiroi</a></blockquote>
      <h3>Intro</h3>
<p>昨天刚对博客的架构进行了一波更新，今早醒来发现服务器到期了，导致网站直接 Down，甚至没有到期提醒的邮件。</p>
<p>本计划到期后不再续费，而到期后已经无法连接上服务器了，里面的数据也取不出来。所幸之前有良好的备份习惯，定时将数据备份到 OneDrive，具体可参见<a href="https://xxu.do/posts/geek/Backup-Mix-Space-to-Onedrive">这篇文章</a>。</p>
<p>但尴尬的是，此前仅备份了数据，没有备份部署的环境变量，这导致了一些问题，我认为值得记录一下。</p>
<h3>后端部署</h3>
<p>和<a href="https://xxu.do/posts/geek/Mix-Space">此前部署的文章</a>一致，唯一需要注意的也是本次部署中遇到的麻烦是 .env 文件的撰写。在 <code>ALLOWED_ORIGINS</code> 中仅填写域名即可，不要填写 <a href="https://xxu.do%E3%80%82">https://xxu.do。</a></p>
<pre><code class="language-.env">JWT_SECRET=XXXXXX #随便填写，长度在 16-32 之间
ALLOWED_ORIGINS=xxu.do #这里需要注意的是，仅填写域名即可，不要填写 https://xxu.do，这会导致前端无法连接
ENCRYPT_ENABLE=false
ENCRYPT_KEY=</code></pre><h3>前端部署</h3>
<p>本次部署的方式：<a href="https://github.com/innei-dev/shiroi-deploy-action">利用 GitHub Action 去构建 Shiroi 然后部署到远程服务器</a>，主要参考了<a href="https://blog.lolita.best/posts/blog/MxspaceDeployShiro">这篇文章</a>。</p>
<p>首先在服务器中进行以下操作：</p>
<ol>
<li>安装 <code>Nodejs</code> 和 <code>unzip</code></li>
</ol>
<pre><code class="language-bash"># 安装 unzip
sudo apt update && sudo apt install -y unzip

# 安装 NVM (Node Version Manager)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
# 重新进行 SSH 连接或者 source .bashrc 来生效

nvm install node
node -v
npm -v</code></pre><ol start="2">
<li>安装 <code>Node.js</code>, <code>npm</code>, <code>pnpm</code>, <code>pm2</code>, <code>sharp</code></li>
</ol>
<pre><code class="language-bash">npm i -g sharp pm2 pnpm </code></pre><ol start="3">
<li>在你的服务器家目录，新建 <code>shiro</code> 的目录，然后新建 <code>.env</code> 填写你的变量。</li>
</ol>
<pre><code class="language-bash">cd && mkdir shiro && cd $_
vi .env</code></pre><ol start="4">
<li>然后填入相应的环境变量，单域名的话 <code>NEXT_PUBLIC_API_URL</code> 和 <code>NEXT_PUBLIC_GATEWAY_URL</code> 如下填写即可，<code>GH_TOKEN</code> 可从<a href="https://github.com/settings/tokens">这里</a>新建，权限勾选 repo 即可。</li>
</ol>
<pre><code class="language-.env">NEXT_PUBLIC_API_URL=http://localhost:2333
NEXT_PUBLIC_GATEWAY_URL=http://localhost:2333

TMDB_API_KEY=
GH_TOKEN=</code></pre><ol start="5">
<li>Fork 项目后，在 <code>Settings -&gt; Secrets and variables -&gt; Actions -&gt; Repository secrets</code> 中添加以下内容：</li>
</ol>
<ul>
<li><code>HOST</code> 服务器地址</li>
<li><code>USER</code> 服务器用户名</li>
<li><code>PASSWORD</code> 服务器密码</li>
<li><code>PORT</code> 服务器 SSH 端口</li>
<li><code>KEY</code> 服务器 SSH Key（可选，密码 key 二选一）</li>
<li><code>GH_PAT</code> 可访问 Shiroi 仓库的 Github Token</li>
</ul>
<p>其中 GH_PAT 可以和上面的 <code>GH_TOKEN</code> 保持一致。</p>
<ol start="6">
<li><p>在 Fork 仓库下的 Action 中，启用 workflow；随意修改 build_hash 文件后，workflow 就启动了，如果运行成功就可以到自己的服务器里 <code>/root/shiro</code> 文件夹下看是否有构建好的文件了；一开始运行失败，后查明原因是没有部署 pm2，供参考。</p>
</li>
<li><p>Action 定时执行：进入Github Fork的项目中，修改 <code>.github/workflows/deploy.yml</code>文件，去掉 <code>schedule:</code> 和 <code>-corn: &#39;0 3 * * *&#39;</code> 两行的注释即可。</p>
</li>
</ol>
<h3>Nginx 反代</h3>
<p>单域名的示例：</p>
<pre><code class="language-nginx">## xxu.do
    
    server {
        listen       80;
        server_name  xxu.do;
        rewrite ^(.*)$ https://$host$1 permanent;
    }

    server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;

        server_name xxu.do; # 替换为你的域名
        index index.html; 
        proxy_set_header Host $host; 
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
        proxy_set_header X-Forwarded-Host $server_name; 
        proxy_set_header Upgrade $http_upgrade; 
        proxy_set_header Connection "upgrade"; 
        ssl_certificate     /etc/pki/xxu.do/server.crt;
        ssl_certificate_key /etc/pki/xxu.do/server.key;
        ssl_stapling on;
        ssl_session_timeout 1d;
        ssl_protocols TLSv1.2 TLSv1.3;

        location /socket.io {
            proxy_set_header Upgrade $http_upgrade; 
            proxy_set_header Connection "Upgrade"; 
            proxy_buffering off; 
            proxy_set_header Host $host; 
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
            proxy_set_header X-Forwarded-Proto $scheme; 
            proxy_pass http://127.0.0.1:2333/socket.io; 
        }
        ## API 地址
        location /api/v2 {
            proxy_pass http://127.0.0.1:2333/api/v2; 
        }
        ## 简读 render 地址
        location /render {
            proxy_pass http://127.0.0.1:2333/render; 
        }
        ## Kami 地址
        location / {
            proxy_pass http://127.0.0.1:2323; 
        }
        ## 后台地址
        location /proxy {
            proxy_pass http://127.0.0.1:2333/proxy;
        }
        location /qaqdmin {
            proxy_pass http://127.0.0.1:2333/proxy/qaqdmin;
        }
        ## RSS 地址
        location ~* \/(feed|sitemap|atom.xml) {
            proxy_pass http://127.0.0.1:2333/$1; 
        }
    }</code></pre><h3>Outro</h3>
<p>本次重新采取新的前端部署方式，确实是解决了内存占用过高的问题。</p>
<p>另外，也带来一个教训，一定要备份好 <code>.env</code> 文件，这对于重新部署来说会避免很多麻烦。</p>

      <p style='text-align: right'>
      <a href='https://xxu.do/posts/geek/redeploy-MixSpace%2BShiroi#comments'>看完了？说点什么呢</a>
      </p>
    ]]>
    </content:encoded>
  <guid isPermaLink="false">6803412e8791c0667078a6f9</guid>
  <category>posts</category>
<category>折腾</category>
 </item>
  <item>
    <title>RSS 解决方案：RSSHub+WeWe RSS+FreshRSS+Reeder</title>
    <link>https://xxu.do/posts/geek/rss</link>
    <pubDate>Fri, 18 Apr 2025 12:04:38 GMT</pubDate>
    <description>Intro

RSS（Really Simple Syndication 或 RDF Site Su</description>
    <content:encoded><![CDATA[
      <blockquote>该渲染由 marked 生成，可能存在排版问题，最佳体验请前往：<a href='https://xxu.do/posts/geek/rss'>https://xxu.do/posts/geek/rss</a></blockquote>
      <h3>Intro</h3>
<p>RSS（Really Simple Syndication 或 RDF Site Summary），是一种消息来源格式规范，用以聚合多个网站更新的内容并自动通知网站订阅者。</p>
<p>能看到这篇文章，想必你大概知道 RSS 是什么了，不过多赘述了。</p>
<p>本解决方案使用以下服务：</p>
<ul>
<li><a href="https://github.com/DIYgod/RSSHub">RSSHub</a>：用于将大多数服务转 RSS</li>
<li><a href="https://github.com/cooderl/wewe-rss">WeWe RSS</a>：用于将微信公众号转 RSS</li>
<li><a href="https://github.com/FreshRSS/FreshRSS">FreshRSS</a>：用于定时抓取，替代 Inoreader</li>
<li><a href="https://reederapp.com/">Reeder</a>：一个简洁舒适的 RSS 阅读器</li>
<li><a href="https://createfeed.fivefilters.org/">Feed Creator</a>、<a href="https://politepol.com/en/">PolitePol</a>：通过可交互的方式将网站转 RSS</li>
</ul>
<p>本解决方案的好处是：</p>
<ul>
<li>将信息中心化：无需在多个网站、APP 或者社交媒体反复刷新，在一个地方看到你想看的所有内容</li>
<li>可控的抓取频率：即便发布的内容因为各种原因被下架和谐，只要已经被抓取过，你的服务器上就保存有这些内容，可供查看</li>
<li>完全自建：不担心信息泄漏，所有内容保存在本地或服务器上</li>
</ul>
<p>完成这一切你只需要一台服务器，废话不多说，我们现在开始。</p>
<h3>安装 RSSHub</h3>
<ol>
<li>安装 Docker</li>
</ol>
<pre><code class="language-bash">curl -fsSL https://get.docker.com | bash -s docker</code></pre><ol start="2">
<li>通过 Docker Compose 安装 RSSHub</li>
</ol>
<pre><code class="language-bash">wget https://raw.githubusercontent.com/DIYgod/RSSHub/master/docker-compose.yml
vi docker-compose.yml  # or your favorite editor
docker-compose up -d</code></pre><ol start="3">
<li><a href="https://chromewebstore.google.com/detail/rsshub-radar/kefjpfngnndepjbopdmoebkipbgkggaa">RSSHub Radar</a> 是一个 Chromium 内核浏览器插件，通过它可以很方便得知目前该网站是否提供 RSS 订阅地址，或 RSSHub 中是否存在该网站的相应规则。</li>
</ol>
<h3>安装 Wewe RSS</h3>
<ol>
<li>安装</li>
</ol>
<pre><code class="language-bash">mkdir wewerss && cd $_
wget https://github.com/cooderl/wewe-rss/raw/refs/heads/main/docker-compose.yml
vi docker-compose.yml #更改服务接口请求授权码等信息</code></pre><ol start="2">
<li>启动容器</li>
</ol>
<pre><code class="language-bash">docker compose pull && docker compose up -d</code></pre><ol start="2">
<li>进入 <a href="http://ip:4000%EF%BC%8C%E8%BE%93%E5%85%A5%E6%AD%A4%E5%89%8D%E6%9B%B4%E6%94%B9%E7%9A%84%E6%9C%8D%E5%8A%A1%E6%8E%A5%E5%8F%A3%E8%AF%B7%E6%B1%82%E6%8E%88%E6%9D%83%E7%A0%81%E5%90%8E%E5%8D%B3%E5%8F%AF%E8%BF%9B%E5%85%A5">http://ip:4000，输入此前更改的服务接口请求授权码后即可进入</a></li>
<li>先在账号管理处添加一个账号，然后即可根据提示添加订阅</li>
</ol>
<h3>安装 FreshRSS</h3>
<ol>
<li>在本地创建文件夹，这两个文件夹将映射到 Docker 容器内</li>
</ol>
<pre><code class="language-bash">mkdir -p /root/FreshRSS/data /root/FreshRSS/extensions</code></pre><ol start="2">
<li>使用 Docker 启动</li>
</ol>
<pre><code class="language-bash">docker run -d --restart unless-stopped --log-opt max-size=10m \
  -p 127.0.0.1:8080:80 \
  -e TZ=Asia/Shanghai \
  -e 'CRON_MIN=1,16,31,46' \ #每小时拉取 4 次
  -v /root/FreshRSS/data:/var/www/FreshRSS/data \
  -v /root/FreshRSS/extensions:/var/www/FreshRSS/extensions \
  --name freshrss \
  freshrss/freshrss</code></pre><ol start="3">
<li>因为 docker 启动参数中监听 127.0.0.1，因此需要先使用 nginx 等反代服务。如果你不需要域名，将 127.0.0.1 改为 0.0.0.0 后即可直接通过 http://域名:端口 的形式访问。</li>
<li>创建新用户后，进入设置。在认证中将允许 API 访问勾选，随后在账户的 API 密码中输入用于阅读器登陆的密码。</li>
</ol>
<h3>RSS 阅读器</h3>
<p>选择一个支持 Google Reader compatible API 的阅读器，比如 Reeder。</p>
<p>在 Reeder 中选择 FreshRSS，填入端口（通过 http://域名:ip/api 查看）、用户名和密码（刚才设置的 API 密码）后，即可添加你想要的订阅源，开始快乐阅读吧。</p>
<h3>Outro</h3>
<p>如果一个网站/服务，官方没有提供 RSS 订阅地址，而 RSSHub 中也没有相应的路由规则，那么可以通过以下方式进行订阅：</p>
<ol>
<li>根据 RSSHub 的规则，向 RSSHub 贡献一个路由规则。</li>
<li>通过 <a href="https://createfeed.fivefilters.org/">Feed Creator</a>、<a href="https://politepol.com/en/">PolitePol</a> 等服务进行订阅，其中 <a href="https://createfeed.fivefilters.org/">Feed Creator</a> 可带 Cookie。</li>
</ol>

      <p style='text-align: right'>
      <a href='https://xxu.do/posts/geek/rss#comments'>看完了？说点什么呢</a>
      </p>
    ]]>
    </content:encoded>
  <guid isPermaLink="false">68023fd6890e9881db2560fe</guid>
  <category>posts</category>
<category>折腾</category>
 </item>
  <item>
    <title>使用 infuse 挂载百度网盘</title>
    <link>https://xxu.do/posts/geek/mount-BaiduNetdisk-on-infuse</link>
    <pubDate>Fri, 21 Feb 2025 15:53:02 GMT</pubDate>
    <description>[!NOTE]
20250412 更新：目前 infuse 官方已经支持百度网盘挂载，无需此曲线救国</description>
    <content:encoded><![CDATA[
      <blockquote>该渲染由 marked 生成，可能存在排版问题，最佳体验请前往：<a href='https://xxu.do/posts/geek/mount-BaiduNetdisk-on-infuse'>https://xxu.do/posts/geek/mount-BaiduNetdisk-on-infuse</a></blockquote>
      <blockquote>
<p>[!NOTE]
20250412 更新：目前 infuse 官方已经支持百度网盘挂载，无需此曲线救国的方式。</p>
</blockquote>
<h3>TL；DR</h3>
<ol>
<li><p>使用 Alist 挂载百度网盘。</p>
</li>
<li><p>在 infuse 内通过 WebDAV 连接 Alist。</p>
</li>
<li><p>使用 Surge 为 ^*baidupcs.com 添加 User-Agent: pan.baidu.com。</p>
<pre><code class="language-conf">[Header Rewrite]
http-request ^*baidupcs.com header-add User-Agent pan.baidu.com</code></pre></li>
</ol>
<h3>Intro</h3>
<p>目前 infuse 官方提供了 WebDAV、OneDrive、阿里云盘等挂载支持，但尚不支持百度网盘直接挂载。</p>
<p>阿里云盘虽然资源多，但由于在线播放速率限制，也不太想多花钱开一个会员，作罢。</p>
<p>百度网盘的资源同样不少，部分缺失的资源也可以通过离线下载的方式补齐，还有优质的播放、下载速度等等。最重要的是，已经开通的百度网盘会员是刚需，能再发挥一下余热，何乐而不为呢？</p>
<h3>踩坑</h3>
<p>有了这个想法后，首先在 infuse 官方群内求助，但似乎大家并没有 infuse 挂载百度网盘这种需求，可能是需求太过小众，并没有相关的讨论，作罢。</p>
<p>考虑到 VidHub 已经提供了百度网盘的直接挂载，既然 infuse 已经支持了阿里云盘，那支持百度网盘应该也不是什么难事，因此给 infuse 官方发了一封邮件，得到回复如下：</p>
<p></p>
<p>看样子官方支持可能遥遥无期了。</p>
<h3>另辟蹊径</h3>
<p>早就知道可以使用 Alist 对百度网盘进行挂载，然后用 WebDAV 的方式接入到 infuse 中。</p>
<p>对于百度网盘会员来说，Alist 官方提供了两种在线播放的方式。</p>
<ol>
<li>修改 UA，可以正常播放。</li>
<li>本地代理，需要大流量大带宽的服务器。</li>
</ol>
<p>众所周知 infuse 无法修改 UA，于是一开始我的目光转向了第二条。实操发现速率是一个问题，对服务器的流量消耗也是一个问题，只好作罢。</p>
<p>过了几日和另一位 infuse 用户说起此事，了解到可以使用网络工具对 UA 进行修改。突然想到我日常使用的 Surge，遂进行尝试。</p>
<p>在 Surge 的配置文件中添加以下内容后，顺利进行了在线播放：</p>
<pre><code class="language-conf">[Header Rewrite]
http-request ^*baidupcs.com header-add User-Agent pan.baidu.com</code></pre><h3>Outro</h3>
<ol>
<li>这本是非常简单的事情，但似乎互联网上对此没有太多讨论，在 linux.do 论坛中也有用户提出了相同的问题，却没有答案，于是将此法发布，为各位节约时间。</li>
<li>对于 Apple TV 的用户来说，Surge 应该也可以接管 infuse 的流量，值得尝试。</li>
</ol>

      <p style='text-align: right'>
      <a href='https://xxu.do/posts/geek/mount-BaiduNetdisk-on-infuse#comments'>看完了？说点什么呢</a>
      </p>
    ]]>
    </content:encoded>
  <guid isPermaLink="false">67b8a15e37887ee270c0e098</guid>
  <category>posts</category>
<category>折腾</category>
 </item>
  <item>
    <title>从 PDB 获取结构并查看密度</title>
    <link>https://xxu.do/posts/academic/Retrieve-structure-from-PDB-and-view-density</link>
    <pubDate>Tue, 14 Jan 2025 16:09:20 GMT</pubDate>
    <description>TL;DR

找到感兴趣的结构，这里以目前数据库中分辨率最高（0.48 Å）的结构 5D8V 为例。</description>
    <content:encoded><![CDATA[
      <blockquote>该渲染由 marked 生成，可能存在排版问题，最佳体验请前往：<a href='https://xxu.do/posts/academic/Retrieve-structure-from-PDB-and-view-density'>https://xxu.do/posts/academic/Retrieve-structure-from-PDB-and-view-density</a></blockquote>
      <h3>TL;DR</h3>
<ol>
<li><p>找到感兴趣的结构，这里以目前数据库中分辨率最高（0.48 Å）的结构 <a href="https://www.rcsb.org/structure/5D8V">5D8V</a> 为例。</p>
</li>
<li><p>下载模型和密度</p>
<ol>
<li>PDB format 的模型</li>
<li>Validation 2fo-fc coefficients 文件，解压得到 cif 格式文件</li>
<li>Validation fo-fc coefficients 文件，解压得到 cif 格式文件</li>
<li>得到 3 个文件：<ol>
<li>5d8v.pdb</li>
<li>5d8v_validation_2fo-fc_map_coef.cif</li>
<li>5d8v_validation_fo-fc_map_coef.cif</li>
</ol>
</li>
</ol>
</li>
<li><p>转换格式：</p>
<ol>
<li><p>使用 CCP4 套件中的 cif2mtz</p>
<pre><code class="language-bash">cif2mtz hklin 5d8v_validation_2fo-fc_map_coef.cif hklout 2fo-fc.mtz &lt;&lt; EOF
EOF

cif2mtz hklin 5d8v_validation_fo-fc_map_coef.cif hklout fo-fc.mtz &lt;&lt; EOF
EOF</code></pre></li>
<li><p>使用独立 python 包 gemmi</p>
<pre><code class="language-bash">pip3 install gemmi

gemmi cif2mtz 5d8v_validation_2fo-fc_map_coef.cif 2fo-fc.mtz
gemmi cif2mtz 5d8v_validation_fo-fc_map_coef.cif fo-fc.mtz</code></pre></li>
</ol>
</li>
<li><p>在 COOT 中加载 PDB 模型和 2fo-fc.mtz 以及 fo-fc.mtz 即可</p>
</li>
</ol>
<h3>Reference</h3>
<ol>
<li><a href="https://www.rcsb.org/docs/general-help/x-ray-electron-density-maps">X-ray Electron Density Maps</a></li>
</ol>

      <p style='text-align: right'>
      <a href='https://xxu.do/posts/academic/Retrieve-structure-from-PDB-and-view-density#comments'>看完了？说点什么呢</a>
      </p>
    ]]>
    </content:encoded>
  <guid isPermaLink="false">67868c30204e1988cb264dc0</guid>
  <category>posts</category>
<category>科研</category>
 </item>
  <item>
    <title>De novo assemble RNA-seq sequence</title>
    <link>https://xxu.do/posts/bioinfo/De-novo-assemble-RNA-seq-sequence</link>
    <pubDate>Wed, 18 Dec 2024 09:39:44 GMT</pubDate>
    <description>Intro

A research paper published on biorxiv deter</description>
    <content:encoded><![CDATA[
      <blockquote>该渲染由 marked 生成，可能存在排版问题，最佳体验请前往：<a href='https://xxu.do/posts/bioinfo/De-novo-assemble-RNA-seq-sequence'>https://xxu.do/posts/bioinfo/De-novo-assemble-RNA-seq-sequence</a></blockquote>
      <h3>Intro</h3>
<p>A research <a href="https://www.biorxiv.org/content/10.1101/2024.11.26.625429v1">paper published on biorxiv</a> determined a new coronavirus subgenus, I would like to figure out is there any changes on protease. However, the sequence data has not been publish. </p>
<p>Fortunately, the similar sequence is do available on NCBI, unfortunately, only RNA-seq data is available.</p>
<p>So I need to assemble the RNA-seq reads first, and BLAST the sequence I need with the assembled data.</p>
<h3>TL;DR</h3>
<ol>
<li><p>Setup the environment with conda:</p>
<pre><code class="language-bash">conda create -n sra_env -y
conda activate sra_env
conda install -c bioconda -y sra-tools trinity transdecoder blast fastp fastqc</code></pre></li>
<li><p>Fetch the data:</p>
<pre><code class="language-bash">prefetch SRR11301086
fasterq-dump SRR11301086
mkdir -p analysis_results/SRR11301086/{raw_fastqc,clean_fastqc,fastp,trinity,transdecoder,blast_results}</code></pre></li>
<li><p>Data quality check</p>
<pre><code class="language-bash">fastqc  SRR11301086_1.fastq SRR11301086_2.fastq \
        -o analysis_results/SRR11301086/raw_fastqc \
        -t 28 \
        2&gt;&1 | tee analysis_results</code></pre></li>
<li><p>Quality control using fastp</p>
<pre><code class="language-bash">fastp -i SRR11301086_1.fastq \
      -I SRR11301086_2.fastq \
      -o analysis_results/SRR11301086/fastp/SRR11301086_1.clean.fastq \
      -O analysis_results/SRR11301086/fastp/SRR11301086_2.clean.fastq \
      --qualified_quality_phred 20 \
      --length_required 50 \
      --thread 28 \
      --html analysis_results/SRR11301086/fastp/SRR11301086_fastp.html \
      --json analysis_results/SRR11301086/fastp/SRR11301086_fastp.json \
      2&gt;&1 | tee analysis_results/SRR11301086/logs/SRR11301086_fastp.log</code></pre></li>
<li><p>Data quality check (post-cleaning data)</p>
<pre><code class="language-bash">fastqc analysis_results/SRR11301086/fastp/SRR11301086_1.clean.fastq \
       analysis_results/SRR11301086/fastp/SRR11301086_2.clean.fastq \
       -o analysis_results/SRR11301086/clean_fastqc \
       -t 28 \
       2&gt;&1 | tee analysis_results/SRR11301086/logs/SRR11301086_fastqc_cleaned.log</code></pre></li>
<li><p>Assemble with Trinity</p>
<pre><code class="language-bash">nohup Trinity --seqType fq \
        --left analysis_results/SRR11301086/fastp/SRR11301086_1.clean.fastq \
        --right analysis_results/SRR11301086/fastp/SRR11301086_2.clean.fastq \
        --CPU 28 --max_memory 48G \
        --output analysis_results/SRR11301086/trinity \
        2&gt;&1 &gt; analysis_results/SRR11301086/logs/SRR11301086_trinity.log &

mv analysis_results/SRR11301086/trinity.Trinity.fasta* analysis_results/SRR11301086/trinity/</code></pre></li>
<li><p>Check the Trinity result:</p>
<pre><code class="language-bash">TrinityStats.pl analysis_results/SRR11301086/trinity/trinity.Trinity.fasta \
2&gt;&1 | tee analysis_results/SRR11301086/logs/SRR11301086_trinity_stats.txt</code></pre></li>
<li><p>BLAST sequence of interest </p>
<ol>
<li><p>Put your sequence in query.fasta.</p>
<pre><code class="language-bash">vi query.fasta</code></pre></li>
<li><p>Make BLAST database and run:</p>
<pre><code class="language-bash">makeblastdb -in analysis_results/SRR11301086/trinity/trinity.Trinity.fasta -dbtype nucl -out analysis_results/SRR11301086/trinity/SRR11301086_nuc_db

tblastn -query query.fasta \
        -db analysis_results/SRR11301086/trinity/SRR11301086_nuc_db \
        -out analysis_results/SRR11301086/blast_results/SRR11301086_nuc_blast.txt \
        -evalue 1e-5 \
        -word_size 2 \
        -outfmt "6 qseqid sseqid pident length mismatch gapopen qstart qend sstart send evalue bitscore qseq sseq" \
        -num_threads 28</code></pre></li>
</ol>
</li>
<li><p>Check the BLAST result:</p>
<pre><code class="language-bash">cat analysis_results/SRR11301086/blast_results/SRR11301086_nuc_blast.txt</code></pre></li>
<li><p>Extract the sequence from <code>trinity.Trinity.fasta</code></p>
<pre><code class="language-bash"># Build index
samtools faidx analysis_results/SRR11301086/trinity/trinity.Trinity.fasta
# Extract the sequence
samtools faidx analysis_results/SRR11301086/trinity/trinity.Trinity.fasta TRINITY_DN284_c0_g1_i7 &gt; analysis_results/SRR11301086/blast_results/SRR11301086_TTRINITY_DN284_c0_g1_i7.fasta</code></pre></li>
</ol>
<h3>Tail</h3>
<ol>
<li><p>You can also blast with the Predicted sequence:</p>
<pre><code class="language-bash">TransDecoder.LongOrfs -t analysis_results/SRR11301086/trinity/trinity.Trinity.fasta\
    2&gt;&1 | tee analysis_results/SRR11301086/logs/SRR11301086_transdecoder_long.log

TransDecoder.Predict -t analysis_results/SRR11301086/trinity/trinity.Trinity.fasta \
    2&gt;&1 | tee analysis_results/SRR11301086/logs/SRR11301086_transdecoder_predict.log

mv *.transdecoder* analysis_results/SRR11301086/transdecoder/</code></pre></li>
<li><p>Make BLAST database and run:</p>
<pre><code class="language-bash">makeblastdb -in analysis_results/SRR11301086/transdecoder/trinity.Trinity.fasta.transdecoder.pep \
            -dbtype prot \
            -out analysis_results/SRR11301086/transdecoder/SRR11301086_db \
            2&gt;&1 | tee analysis_results/SRR11301086/logs/SRR11301086_makeblastdb.log

blastp -query query.fasta \-db analysis_results/SRR11301086/transdecoder/SRR11301086_db \
       -out analysis_results/SRR11301086/blast_results/SRR11301086_prot_blast.txt \
       -evalue 1e-5 \
       -outfmt "6 qseqid sseqid pident length mismatch gapopen qstart qend sstart send evalue bitscore qseq sseq" \
       -num_threads 28 \
       2&gt;&1 | tee analysis_results/SRR11301086/logs/SRR11301086_blast.log</code></pre></li>
</ol>

      <p style='text-align: right'>
      <a href='https://xxu.do/posts/bioinfo/De-novo-assemble-RNA-seq-sequence#comments'>看完了？说点什么呢</a>
      </p>
    ]]>
    </content:encoded>
  <guid isPermaLink="false">67629860d55727e0ba7b85d5</guid>
  <category>posts</category>
<category>生信</category>
 </item>
  
</channel>
</rss>