普通视图

发现新文章,点击刷新页面。
昨天以前陈华

为服务器配置静态 ip 地址

作者 陈华
2023年7月4日 13:10

求学生涯期间的最后一个暑假如期而至。因为今年或无法回家过年,这次便提前返回度假。每天的消遣就是做科研(再划水就没法毕业了 QAQ)、给家人做饭、以及带上(运动)相机骑着车闲逛乡野。小确幸不外如是。关于工作设备,我一般用笔记本外接一个显示器,尽量减小多台电脑来回折腾。但家里还闲置了一台疫情期间为写硕士学位论文买的台式机,放着甚为可惜,因此决定改成 Linux 服务器,通过远程连接来跑 MCMC 这样耗时的程序。

服务器放在路由器旁连着网线,而我在另一个房间里工作。为了方便远程连接,我将服务器 ip 地址改成静态的。首先在命令行输入 ip addr 查看 ip 地址。我的电脑列出了三个结果,分别是对应本地环路接口的 lo,对应有线连接的 enp3s,以及对应无线连接的 wlp4s01

网络配置文件 sudo /etc/netplan/00-installer-config.yaml 默认设置了动态 ip 地址 dhcp4: true。将其修改如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
network:
 version: 2
 renderer: networkd # 桌面端一般是 NetworkManager
 ethernets:
 enp3s0: # 网卡名称
 dhcp4: no # 静态 ip
 addresses: [192.168.1.100/24] # ip 地址和子网掩码
 routes: # 网关
 - to: default
 via: 192.168.1.1
 nameservers:
 addresses: [114.114.114.114] # DNS

之后,通过 VS Code 远程连接服务器,具体操作参考前文 VS Code 连接 WSL 的例子。


  1. 不同网卡的名称不同,但开头应当一致,例如 en (ethernet) 表示以太网,wl (wlan) 表示无线局域网。其后的 p 表示 PCI,o (on-board) 表示板载设备索引号,s (slot) 表示热插拔索引号,x 表示 MAC 地址等。 ↩︎

静态网站搭建流程

作者 陈华
2021年10月18日 19:41

此文记录本站的搭建流程,主要环境是 Windows 10 桌面系统和 Ubuntu 18.04 云服务器。逻辑是将本地桌面端每一次的更新推送到 GitHub 再同步到云服务器。大概思路如下

  1. 在 Windows 上通过 Hugo 架设网站,进行 Markdown 写作。
  2. 通过 Git 将更新推送到 GitHub 仓库。
  3. 配置工作流,一旦源站发生变动,Git Action 就会在虚拟环境中生成网站,并将其同步到绑定了域名的云服务器上。

备案的网站是需要存放在境内的服务器上,若不想备案,或是网站位于境外,则可以忽略最后一步,选择将网站托管到 Vercel。这样不仅省去了麻烦,而且国内的访问速度也不差1。本流程主要参考烂磁头的教程,其中详细介绍了工作流的具体作用。本文在此基础上增加了自动部署 Hugo 和 pandoc 的工作流,以简化本地操作2,同时也画蛇添足地增加了详尽的说明,既方便新手,也作为备忘录。整个过程虽然繁琐,配置好之后,就只需专注于写作。

Hugo

Hugo 是一个静态网站生成器,优点是网站生成速度非常快(以毫秒计),源站可移植性好,以及拥有多种主题,拿来即用;缺点是自定义主题需要熟悉 Hugo 语法,但自己动手岂不有趣。具体设置如下:

  1. 下载功能最全的 extended 压缩包,解压。这是可移植软件,无需安装,直接将文件夹移动到常用的软件安装文件夹中即可。

  2. 设置环境变量,以便在终端直接运行软件。在搜索栏中查找“编辑系统环境变量”,点击弹出窗口中的“环境变量”,选中“系统变量”下的 Path 变量,依次点击“编辑”、“新建”和“浏览”,最后选择 Hugo 路径。结果如下:

    将 hugo 文件夹加入环境变量

  3. 在搜索栏输入 cmd 打开 Windows 终端,键入 cd 路径 跳转到指定路径(直接拖动文件夹到终端,会显示相应的路径)。继续输入 hugo new site 网站文件夹名 在该路径下生成网站文件夹。该文件夹包含了所有的源文件,主要是模板(archetypes,预设文章扉页)、内容(content,博客文章)、布局(layouts,自定义网页布局、样式和脚本等)、静态资源(static,文档、图片和视频等文件)、主题(themes,引用别人的布局)和配置文件(config.toml,用以全局管理整个网站)。上述操作如下:

    本例在 Documents 中生成网站文件夹 blog,并得到了成功的提醒

  4. 设计网站布局。刚接触 Hugo 的朋友建议使用主题。挑选合适的主题,下载解压到 themes 文件夹中,拷贝覆盖 exampleSite 内的文件(如果有的话)到根目录。打开配置文件,确保 theme = "主题文件夹名"

  5. 在终端键入 cd 网站文件夹名 && hugo server,点击出现的链接,例如 http://localhost:1313/,在浏览器中预览网站。而键入 hugo 则会在 public 文件夹中生成一个完整的网站,但我们无需进行这个操作。关于其他命令可通过 hugo --help 查看。每个主题的构建逻辑和配置方式不同,一般会有详细介绍,依葫芦画瓢即可。

  6. 键入 hugo new 文件夹名/"标题.md" 在 content 目录下生成 Markdown 文档。打开后会看到扉页(front matter),用以填写标题、作者和链接等版权信息。以本文为例,输入 hugo new zh/"静态网站搭建流程.md",然后设置扉页(可通过模板自动生成相关信息)

    1
    2
    3
    4
    5
    6
    7
    
    ---
    title: "静态网站搭建流程"
    date: "2021-10-18T19:41:59+08:00"
    draft: true
    slug: "static website"
    description: "Introduction to build static website by Hugo, git action, cloud server, apache2."
    ---
    

    若要公开文章,需要设置 draft: false,或将其删除。推荐使用 Typora Markdown 写作,以及使用 VS Code 编辑网站。

GitHub

在本地写好博客之后,我们将源站推送(push)到 GitHub 上。

  1. 注册 GitHub,点击右上角加号新建一个仓库,确定仓库名,以及是否公开。

  2. 安装分布式版本控制软件 Git,然后在终端键入

    1
    2
    
    git config --global user.name "GitHub 用户名"
    git config --global user.email "邮箱地址"
    
  3. 转到网站根目录 cd 网站根目录,输入以下内容

    1
    2
    3
    4
    5
    6
    
    git init
    git add .
    git commit -m "first commit"
    git branch -M main
    git remote add origin 仓库链接
    git push -u origin main
    

    以上操作分别表示初始化仓库,添加所有内容到缓存区,提交,设置 main 为主分支,添加远程仓库,以及推送缓存区内容到 mian 分支。

  4. 需要注意的是,如果我们不想公开某篇文章,可以在扉页设置 draft: true。但第三步依然会将该文档推送到仓库中。因此我们在网站根目录新建一个文件 .gitignore,令 Git 忽略特定的文件。例如,我将所有私密文章命名为 文章名_d.md,然后在 .gitignore 文件中添加 *_d.md,这样 git 在推送时会忽略所有以 _d.md 结尾的文件。

  5. 每次写好文章之后,只需要输入以下命令将其推送到远程仓库即可:

    1
    2
    3
    
    git add .
    git commit -m "该次推送说明"
    git push
    

    关于 GitHub 的更多操作可参考官方文档

服务器

在进一步设置 GitHub 前,我们先配置好服务器。

  1. 将域名解析到服务器 IP 地址。以 domain.com 和阿里云为例,设置记录类型为 A,主机记录为指定的二级域名 @.domain.com 或三级域名(如 www.domain.com),解析线路默认,记录值为服务器 IP 地址,TTL 默认。

  2. 远程登陆到云服务器,为了方便起见,sudo su 进入管理员模式。安装和配置 apache2

    1
    2
    3
    
    apt update
    apt -y upgrade
    apt install -y apache2
    

    将 SSL 证书上传到服务器的 /etc/apache2/cert/ 路径下,然后配置 apache2

    1
    
    vim /etc/apache2/sites-available/blog.conf
    

    i 进入编辑模式,并输入(假设网站位于 /var/www/public/ 目录下)

     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
    41
    42
    43
    44
    45
    46
    47
    48
    
    <VirtualHost *:80>
    ServerName www.domain.com
    ServerAlias domain.com
    DocumentRoot /var/www/public
    <Directory /var/www/public/>
    Options +FollowSymlinks
    AllowOverride All
    
    SetEnv HOME /var/www/public
    SetEnv HTTP_HOME /var/www/public
    </Directory>
    
    # 设置 http 跳转到 https
    RewriteEngine on
    RewriteCond %{SERVER_PORT} !^443$
    RewriteRule ^(.*)$ https://%{SERVER_NAME}$1 [L,R]
    </VirtualHost>
    
    <VirtualHost *:443>
     ServerName domain.com
     DocumentRoot /var/www/public
     SSLEngine on
     SSLProtocol all -SSLv2 -SSLv3
     SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM
     SSLHonorCipherOrder on
     # 以下三行为证书路径,请自行修改
     SSLCertificateFile cert/domain.com_public.crt
     SSLCertificateKeyFile cert/domain.com.key
     SSLCertificateChainFile cert/domain.com_chain.crt
     # 设置 domain.com 域名跳转到 www.domain.com
     RewriteEngine on
     RewriteCond %{SERVER_NAME} =domain.com
     RewriteRule ^ https://www.%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
    </VirtualHost>
    
    #如果证书包含多个域名,复制以上参数,并将 ServerName 替换成第二个域名。
    <VirtualHost *:443>
     ServerName www.domain.com
     DocumentRoot /var/www/public
     SSLEngine on
     SSLProtocol all -SSLv2 -SSLv3
     SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM
     SSLHonorCipherOrder on
     # 以下三行为证书路径,请自行修改
     SSLCertificateFile cert/domain.com_public.crt
     SSLCertificateKeyFile cert/domain.com.key
     SSLCertificateChainFile cert/domain.com_chain.crt
    </VirtualHost>
    

    完成后,按 Esc 输入 :eq 保存退出。在终端输入

    1
    2
    3
    4
    
    a2ensite blog.conf ##使配置文件生效
    systemctl reload apache2 ##重新加载 Apache 服务
    a2enmod rewrite headers env dir mime ssl ##启用 ssl 模块
    systemctl restart apache2 ##重启 Apache 服务
    

    以上假设的域名为 www.domain.comdomain.com,并设置了后者自动跳转到前者。若需要设置 www.domain.com 跳转到 domain.com,可参考这篇文章

  3. 安装同步软件: apt install rsync

  4. 生成 SSH 密钥,用以授权 GitHub 远程修改网站根目录 /var/www/public/ 下的内容。

    1
    2
    3
    4
    
    ssh-keygen -t ed25519 -f ~/.ssh/blog_deploy_key
    cd ~/.ssh/
    mv blog_deploy_key.pub authorized_keys
    cat blog_deploy_key
    

    复制屏幕中出现的一长串密钥。

工作流

  1. 在 GitHub 仓库中点击 Settings、Secrets 和 New repository secret。添加 Name 为 BLOG_DEPLOY_KEY,Value 为上一步生成的密钥。同理新增 Name: DIR 和 Value: /var/www/public 以及 Name: HOST 和 Value: 服务器 IP 地址

  2. 授权 Actions 自动运行工作流。依次点击 Settings 和 Actions,选择 Allow all actions,保存。

  3. 在 Windows 网站根目录下的 .github 文件夹中新建 workflows 文件夹。打开 workflows 新建 main.yml 文件,复制粘贴以下内容:

     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
    
    name: Deploy on push events
    
    on:
     push:
     branches: [ main ] # 在推送到 mian 分支时触发工作流
    
    jobs:
     build:
     runs-on: ubuntu-18.04 # 服务器版本
     steps:
     - name: Checkout
     uses: actions/checkout@v2 # 检出最新代码到虚拟环境中
     with:
     submodules: 'recursive'
     fetch-depth: 0 # 拉取所有分支和标签的历史
     - name: hugo
     uses: klakegg/actions-hugo@1.0.0 # 在虚拟环境中运行 hugo 生成网站到 public 文件夹中
     with:
     command: --gc --minify
     image: ext-ubuntu
     pandoc_command: pandoc-default
     - uses: webfactory/ssh-agent@v0.4.1
     with:
     ssh-private-key: |
     ${{ secrets.BLOG_DEPLOY_KEY }} # 读取 secrets 中 BLOG_DEPLOY_KEY 的值
     - name: Scan public keys
     run: |
     ssh-keyscan ${{ secrets.HOST }} >> ~/.ssh/known_hosts # 匹配 secrets 中储存的密钥和服务器中的公钥
     - name: Deploy
     run: |
     rsync -av --delete public root@${{ secrets.HOST }}:${{ secrets.DIR }} # 同步虚拟环境中的 public 文件夹内容和服务器中的 DIR 文件夹内容。 
    

    其中,我使用 pandoc 将 Markdown 文档转换为网页。对于其他主题,直接删除上面的 pandoc_command: pandoc-default 即可。

  4. 推送本地内容到 GitHub,点击 GitHub 的博客仓库中的 Actions,查看是否设置成功。


  1. 针对境内访问,可将域名通过 CNAME 别名记录指向 cname-china.vercel-dns.com。 ↩︎

  2. 原工作流需要先在本地通过 hugo 生成网站到 public 文件夹,再同步到 GitHub 和服务器,比较繁琐。 ↩︎

科研工作流程

作者 陈华
2021年4月23日 14:44

每个科研工作者都有自己的科研工作流程,我倾向于利用不同的软件组合来提高工作效率。我一开始舍本逐末尝试了许多软件,导致工作流程越来越模糊,效率低下。后来才意识到形成正确的工作流程才是最重要的,软件只是工具,越精简越好。我目前的工作流程是:

  1. 确定课题,在电脑上建立课题文件夹,并通过 Git 同步到 GitHub上的私人仓库,进行版本控制。
  2. arXivinSPIRE 上查阅文献。
  3. 使用 ZoteroSumtraPDF 管理和阅读文献。
  4. Slack公式支持)上与课题组或合作者讨论问题。
  5. 使用 TyporaLyX镜像)做笔记和推导公式。
  6. 使用 VS Code 扩展 JupyterLaTeX Workshop 进行 Python 编程和论文写作。

以下具体展开我的工作流程。

确定课题

首先,强烈推荐使用同步云软件存储资料,以防电脑故障或者丢失。我的科研文件夹分成了以下几类:大纲、资源、笔记、工作、报告和教学。我在大纲中确立科研的目标和方向,一旦有想法就记录下来,由此确定课题。我收集的资源大概包括别人写的程序、演示文稿和教材讲义,文献也存放在这里。工作文件夹中的每一个课题都有对应的 GitHub 私人仓库,对该课题的笔记、论文、程序等进行版本控制。

管理和阅读文献

做科研首先是阅读文献,因此有效地管理文献至关重要。目前文献管理软件层出不穷,功能大同小异,基本包含了导入文献信息和导出引用格式这两个功能。由于 EndNote 太贵,Mendeley 太丑,Citavi 太强,我最终选择了免费开源、界面舒服、功能适中的 Zotero。它拥有丰富的插件,而且插件后缀 .xpi 与火狐浏览器的相同;也就是说,对火狐浏览器的插件稍加修改就可以直接应用到 Zotero 中。我的习惯是将所有文档放在同一个云盘目录中,这样不管在哪一个设备中都可以方便查询和编辑。但 Zotero 默认在 storage 文件夹中为每一个文档单独建立一个子文件夹,看起来非常凌乱。为此安装一个重要插件 ZotFile,用于管理附件和自动重命名等。安装插件的方式是点击 Tools - Add-ons,将下载好的插件拖放进去。安装好之后,点击菜单栏 tools - ZotFile Preferences 对 ZotFile 进行如下设置:

  • Source Folder Attaching New Files 中选择文档的存储路径(位于云盘中)。在浏览器中查看论文,可以通过官方扩展添加 PDF 文件到 Zetero,此时 ZotFile 会自动对其重命名和保存到该路径中。

    ZotFile_1

  • 若是通过本地添加文件,Zotero 依然会默认将其保存到 storage 文件夹中。可以在 Location of Files - Custom Location 中选择了上述路径。平时在添加本地文件后,右键选取该条目,点击 Manage Attachments - Rename and Move ,手动令 ZotFile 重命名附件并移动到上述路径。这个操作支持批量处理,即可以全选,右键批量重命名和移动。

  • 确保所有的文件都在同一个目录中,平时可以使用平板和手写板看论文和做笔记。

    ZotFile_2

    右键选取条目,点击 Manage Attachments - Send to Tablet,会自动复制该文档到 tablet 文件夹中。对 tablet 中的文档做笔记、加批注等。阅读完一篇文献后, 在 Zotero 左侧的 Tablet Files 选取,右键点击 Manage Attachments - Get from Tablet,附件会重命名为 *_annotated,并移动到原文献路径。具体如下图所示:

    Send to Tablet

    Get from Tablet

    在上述设置中,源文件与笔记互不影响。但需要注意的是,对同一个文档只能进行一次这样的操作,因为下次操作会覆盖之前的操作,令上次的笔记丢失!因此,要么不进行 Get from Tablet 操作,让笔记保留在 tablet 文件夹中;要么在完全消化一篇文章后,再递回源目录。

  • 设置重命名规则

    ZotFile_3

  • 高级设置

    ZotFile_4

其他常用的插件有:

  1. Markdown Here:将笔记替换成 Markdown 格式的文本。选中笔记,点击菜单栏 File -> Markdown Toggle 即可。
  2. Better BibTeX for Zotero:管理书目数据,自定义 BibTeX 导出规则。
  3. Jasminum:中文元数据支持。
  4. Zotero Storage Scanner:通过扫描存储来识别损坏和重复的附件。
  5. Zotero Citation Counts Manager:自动从 CrossrefinSPIRESemantic Scholar 抓取引用次数。
  6. PDF 预览

Zorero 支持 WebDAV 同步数据,所以配合坚果云相当方便。但我本身就在使用 OneDrive 同步云软件,而且它也不支持 WebDAV,因此我把附件的路径设置在前面所提到的 Resources 中。在 Zotero 的 Edit - Preferences - Advanced Files and Folders 中设置附件和数据路径,保证 Tools - ZotFile Preferences - General Settings 中的附件路径一致,并设置好文件夹和文件命名规则。

Zotero 中重复的文献条目会出现在 Duplicate Items 标签中,未分类的在 Unfiled Items 标签中,但同一文献条目可以同时出现在不同的分类文件夹中,不算作重复。我基本上把文献分成了四类,即待读、(技术)文档、紧急和工作,其中在工作分类中为每一个课题分别建立一个子分类。需要注意的是,如果想要删除某个条目,右键选择 Move Item to Trash...;若只是从某个分类中移除,则选择 Remove Item from Collection

此外,浏览器插件 Zotero Connector 是必须安装的,用于从网络上保存 PDF 文档。只需保持 Zotero 软件开启,点击插件,选择保存目录即可。阅读文献时,直接点击对应的条目就可以通过默认的 PDF 阅读器打开文档。我使用 SumtraPDF 这个轻量级的阅读器来阅读,它的优点是启动速度很快,而且拥有实用的快捷键

笔记和写作

无论是做笔记还是写论文,$\LaTeX$ 都是必备的。虽然现在流行通过 Overleaf 在线协作写论文,但我个人还是倾向于本地环境,因此安装了 TeX Live镜像)软件发行套装,并通过 VS Code 的扩展 LaTeX Workshop 写论文。具体的设置可以参考知乎一篇的教程。若只有少量的公式输入,我一般使用 Markdown 格式做笔记,尤其推荐 Typora,它不仅支持实时预览,而且主题丰富、操作简单而优雅。而对于大量的公式输入,特别是公式推导时,我更多地使用 LyX镜像)。它是据我所知最强大的所见即所得软件以及 $\LaTeX$ 编辑器,尤其是对于数学公式的输入和显示堪称完美。此外,有时候需要复制粘贴文献里的公式,这就需要用到 Mathpix Snip。使用快捷键 Ctrl + M 截图,会自动生成和复制对应的 $\LaTeX$ 代码。对于英文论文,可以安装 grammarly 免费检查拼写和语病。

编程

我一般使用 Mathematica 做科学计算,简单而优雅,但对于偏数值的情况,则更多地使用 Python。安装好 Python 之后,将 pip 源设置为清华镜像,然后安装需要的扩展程序库,例如:pip install jupyterlab numpy sympy matplotlib scipy pandas import-ipynb multiprocess。稳妥起见,最好通过 Conda 对 Python 的程序库进行版本控制。接下来在 VS Code 中安装 PythonJupyter 扩展就可以工作了。

个人觉得 Linux 对于 Python 的支持比 Windows 更好,因此也常常切换到 Linux 中工作。Win 10 系统的一个黑科技就是 WSL,即适用于 Linux 的 Windows 子系统。如今完全不再需要安装消耗资源的虚拟机,或者只能同时运行一个系统的双系统了。WSL 使我们可以一边在 Win 10 系统中愉快地进行日常工作和社交,一边运行 Linux 终端跑程序。这时不得不提到 VS Code 的一个大杀器,Remote - WSL 扩展。通过它,我们可以方便地切换到 Linux 环境下编程,而丝毫不影响 Win 10 的运行。WSL 的另一个好处是,Win 10 和 Linux 系统的文件目录可以直接互相访问和运行,真正做到了“我泥中有你,你泥中有我。”1

科研活动

Slack 是目前比较火的协作平台,我们课题组就是使用这个软件来管理日常的科研活动。GitHub 绝对是项目协作的一个利器,只是在科研社区中的受众还是太少了。

作报告常常需要制作幻灯片。Beamer 使用 $\LaTeX$ 编译,无须担心格式错乱。但 PowerPoint 还是更有灵活性,缺点是它对于公式的支持太弱了。我一般从 LyX 或 Typora 中复制 $\LaTeX$ 代码,粘贴到网页 TeXclip,生成透明背景的可缩放矢量图片(.svg),再拖曳到 PowerPoint 中,一气呵成。

其他

阅读英文文献时难免会遇到陌生词汇,网易有道词典是比较简单的查询和背诵单词的方式,而我选择另一种更自主的方法:GoldenDict 词典和 Anki 抽认卡。比较麻烦的是,GoldenDict 本身不具有词典,需要自己去下载 .mdd.mdx 后缀的词典文件。Anki 是很强大的一个记忆软件,拥有丰富的插件,我只用到其中的 AnkiConnectGD2Anki。使用流程是:点击陌生词汇按 Ctrl + C + C 快捷键,GoldenDict 会自动在相应的词典中查询,同时会把该词汇同步到 Anki 的记忆卡片中,通过记忆卡片和记忆曲线背单词。

资料多了就需要聚合,有趣的网页也需要适时剪藏,以免变成 404。印象笔记就是一款很好的剪藏和建立个人知识库的软件,只是,它现在已经变成印象广告了。作为替代,Trilium Notes 不仅开源、无广告还可以剪藏网页,建立连接图(Link map),高度定制页面和功能,以及部署在服务器等。但功能强大也意味着更多的学习成本。如果只是需要剪藏和编辑网页内容,那更方便的是安装浏览器插件 MarkDownload - Markdown Web Clipper
,直接将网页转换成 Markdown 格式,并下载到本地。默认是通过网络链接显示图片,为了避免将来出现死链无法显示图片(这是常有的事!),可以在扩展选项中设置保存图片到本地,建议和 Typora 的图片设置保持一致。


  1. 在 2021 年 5 月底发布的 Win 11 预览版支持在资源管理器中直接查看 WSL 目录。 ↩︎

我与咖啡

作者 陈华
2021年3月8日 16:54

2016 年大学毕业后,我决心考取研究生,便在校内租了一个单间复习。房间虽然不大,却也附带了一床、一柜、一桌、一空调、一卫生间和一小院子,而且房东爷爷和奶奶非常友善。

离开了限电 600 瓦的学生宿舍,我按耐不住想要尝试非速溶咖啡,于是入手了一台美式咖啡机,搭配 illy 的咖啡粉。当时对于咖啡还懵懂无知,但我至今能够回味刚打开咖啡粉罐子时扑面而来的香气,以及咖啡入口时味蕾的满足感。自此,我每天早晨煮一杯咖啡,蒸两个鸡蛋,然后去图书馆,生活充满了仪式感。当时我还领养了一只幼猫,取名跳跳,因为他走路一蹦一跳的,十分可爱。跳跳刚来家里有些怕生,对我却很依赖,在第一个夜晚就爬上了我的床,还趴在我的胸口睡觉。

后来,我不慎打破了咖啡壶,也因祸得福顺利考上了研究生。读研后,有了自己的办公桌,为了方便入手了一个法压壶,开始自己研磨咖啡豆。法压壶煮出来的咖啡更加浓郁,尽管有一些残渣影响口感。我的小老板也喜欢咖啡,就买了一台意式咖啡机放在办公室里。突然间的大升级,令我惊喜万分。本来我们计划开一个咖啡俱乐部,大家可以一边享受咖啡一边讨论科研。只是意式咖啡机煮咖啡有噪声,操作繁琐,而且气味比较重,喜欢的人寥寥。第二年办公室来了一些新生,位置不够用,意式咖啡机也就渐渐地闲置了。

尽管俱乐部开不下去了,意式咖啡还是极大地拔高了我对咖啡的追求。因此,我入手了一套手冲咖啡器具。手冲相比于其他类型有更大的自由度和更丰富的玩法,令我欣喜不已,成了我读研期间冲煮咖啡的首选方式。要通过手冲煮一杯好喝的咖啡并不容易,我至今也没有足够的技术,一是因为我懒得钻研,二是因为买不起好的单品咖啡豆,三是因为我更享受手冲时的那一刻。但潜移默化地我对咖啡的种类、生产流程、烘焙原理、冲煮方法等有了更多的了解。简单来说,从咖啡种植(地理和气候很重要)、采摘、加工(水洗、日晒、蜜处理等)、烘焙(轻度、中度、深度)、研磨(颗粒大小和形状)、到冲煮(水质、水温、时间和粉水比等)的每一个环节都会影响咖啡的酸度、苦感、风味和醇厚度等品质。

了解再多的常识也不妨碍我继续当一个菜鸟,但难免地会想要品尝更多的咖啡豆,尝试更多的玩法。手冲已经足够好玩,相比于意式还是缺少一些醇厚和爽滑的口感。只是学生寝室限电,无法使用意式咖啡机,手动的意式咖啡机又太贵,于是我便想入手低配版的摩卡壶。正好,我如今升学博士,住进了全校最“豪华”的二人间宿舍。而从这学期开始,我的室友基本上不在,也就是说我相当于一个人住,仿佛又回到了当初租房子的日子。乘此机会,我总算入手了摩卡壶。今天一收到就立马拆开用过期的豆子做实验。第一次咖啡豆研磨得太细,也不懂得如何把控,忙手忙脚的,感觉过度萃取了,就没有喝,权当作是在洗摩卡壶。第二遍我调整了研磨度,在咖啡溢出来的时候立马调小了火候,竟然成功了。入口真的非常爽滑和醇厚,跟手冲的口感完全不一样。我喜欢独处,我享受咖啡。我想,博士期间应该会是我最快乐的时光。

本想记录摩卡壶带给我的感受,不知不觉竟写成了我与咖啡的回忆录,而此时此刻我的口腔依然舒爽。

什么叫做自己

作者 陈华
2021年3月1日 14:50

这是果麦麦对罗翔老师的采访,版权归其所有。以下摘录部分内容,谨以自勉:

果麦麦:“罗老师,你觉得什么叫做自己呢?”

罗翔老师:“什么叫做自己?你自己都不知道你是谁,你怎么能做自己?”

罗翔老师:“其实小时候大家都想成为给科学家之类的,但我小时候想的比较多的还是想做个老师。其实很多时候我们人生都要去赋予我们所从事工作的意义,因为对于大部分工作,时间干长了呢,你都会觉得是机械劳动。

罗翔老师:“法律给我最多的信念呢,可能有两个方面。”

“第一呢,是对正义的向往。因为法律始终是追求公平和正义的。因为我们经常会感到一个事情不正义,那一定有与它相反对的正义这个概念。当我们厌恶黑暗的时候,一定有与黑暗相反对的光明这个概念。所以这是法律给我的一个深深的训练,我相信公平和正义是存在的。因为人嘛,他就是很复杂的。人有天使的一面,也有魔鬼的一面,(这也是)为什么说君子慎独嘛。人在向崇高迈进的过程中,一定会让别人觉得有点装,也会让自己觉得有点装。我们本来就很肤浅,我也很肤浅。我承认自己的肤浅,本来就是一个肤浅的人。”

“那第二呢,就是让我在看待世间万物的时候,可能会有一颗圆润的心,而不是一元化、刺猬式的一种思维态度。因为法律始终是在很多种美好的价值中选择一种平衡。很多时候这个世界不是善恶的对决,而是善和善的对决。”

“法律的事业让我知道,可能我们很难追求最优的选择,我们只能追求一个相对不坏的选择。所以作为人的话,可能更为重要的还是过一种正直的生活。”

“那有很多很多人呢可能陷入在一种怀疑主义的、虚无主义的深渊之中。我自己也曾经是这么经历过来的,但是你会发现怀疑的结果是两种。一种怀疑的结果是导向虚无,一种怀疑的结果是导向确定。那在逻辑上来说,怀疑只能导向确定,而不可能导向虚无。”(为什么?)

果麦麦问:“现在的年轻人对未来都是处于一个非常迷茫和焦虑的状态,对未来不确定的事情都不知道该怎么去面对,怎么抵抗这种不确定性的焦虑?”

罗翔老师答:“首先我们要接受这种不确定,因为人生唯一确定的就是不确定的人生。人的有限性就体现在,我们是无法寻找到从我们自己而来的一个确定。所以,第一还是阅读,跟人类伟大的灵魂对话,因为在两千多年前人类就已经有过这样的困惑。人类所有伟大的思想家都试图对抗这种困惑。但第二的话更重要的是去做,做一些事情,从身边的小事开始做起。每天都只是一个礼物,昨天的已经成为过去,明天的还没有到来。我们唯一能够拥有的就是今天,所以今天是一个礼物,是一个 gift,是一个 present。所以我们做好每天该做的事情,今生就是我们的哨岗,站好哨就可以。”

果麦麦:“你现在也是有非常多的社会角色、社会身份,那当这些角色同时赋予到你身上的时候,你有没有过一些些许的割裂,或者是小小的矛盾这种时候?”

罗翔老师:“那肯定会有,因为人的时间是有限的,人的精力也是有限的。所以呢,可能人是要去做减法。有很多的繁华并不属于你,你要试图地减掉它。”

罗翔老师:“说实话,非常地意外今年能拿到这样一个剧本,一个普法的剧本,一个走到聚光灯下的剧本。我希望自己能够演好这样的剧。”

罗翔老师:“人的内心始终有两面,有幽暗的一面,也有光明的一面。你做哪一面,是做幽暗的一面,还是做光明的一面。人不是做自己,人是朝着人性中良善的那一面去前进,去尽量地抑制内心的幽暗。这个叫做自己。”

吹雪

作者 陈华
2020年12月13日 21:13

昨日还沐浴在暖阳下,今天的武汉就突然狂风大作,枯叶乱舞。我白天如同往常一般躲在图书馆1,沉迷在自己的世界中。直到六点半才在饥饿中被迫出门,这时天已经黑下来了,天空烟雨朦朦,地面也湿漉漉的,路人正打着伞,仿佛要飞起来2。这种天气真叫人无奈,我问保安借了伞,激励自己速战速决。然而当我走到路灯下时,才发现空中飘着的竟然是雪!哇,下!雪!了!我连忙收起伞,迎面感受着雪的温度。而后我拿出手机试图记录下来,得到得画面却非常糟糕,当即决定放弃吃饭,改道回寝室拿相机。

从寝室出来,我一路疯狂地拍摄。期间遇到一个外国小哥,我因为太过兴奋,话不经大脑地开口问道:“Can I?”还没等我自己回过神来,他就直接回了个 Thumb up,我下意识地按下了快门。当时太过突然,没对上焦,但我的心情却极为舒畅——这,就是街拍!趁着这股兴奋劲,我不再顾忌路人的存在,脑子里只剩下了雪。这要放在以前,我是绝对敢想不敢做,虽然这次也还未达成怼脸的目标3

Thumb up

Thumb up

今年的初雪与往年很不一样,凛冽得不近人情,仿佛在控诉这该死的二零二零,也映照了这一年来我的心态变化。去年的雪虽然也是在凄风苦雨中到来,却自有一分暖意。当时,我才从失恋的打击中走出来,遇到了人与雪的救赎。2020 年不仅对国家、世界是一场灾难和考验,对处于得失幻灭中的我也是一次严峻的较量。尽管如此,我依然期待每一场雪4,因为雪的到来总是触不及防又沁人心怀,至少在落下的那一刻我的心也是纯粹的。

如今,我的心态越发地平和,也越发地感恩这珍贵的博士生涯。宽松的科研环境和充足的生活补贴令我可以心无旁骛地专注于重构自己的世界。现在的每一天都有事可做,每一天都活得纯粹,每一天都忘我地沉浸在图书馆,直到晚上十点。只是,“课题分离”并不容易,心态的建设依然任重而道远。我太过容易受影响了,这也是为什么图书馆对我来说如同疗养所一般。但另一方面,我需要继续坚持早睡和跑步来养成规律的作息,身体好了,情绪也坏不到哪里去。目前我最大的问题是,一旦对自己提高一点要求,心情就会急躁起来,然后牵一发而动全身,所有的事情就乱成了一锅粥。为了保持平和的心态,我不得不安慰自己做到最低限度的努力就好了。

下雪之后,我也逐渐开始反思自己。开这个博客的初衷是“对自己坦诚”,但我总是对以往的文章删删改改,早已经违背了初衷。首先是频繁地修改文章,这个倒还好,毕竟时过境迁,而且我把网站的源代码放在 GitHub 上,所有的修改都有迹可循,也算是最大程度的自我坦诚了。之所以急于发布不成熟的文章,是为了根治我行动力差的行事作风,因此我只能先做再说(Start by doing it badly)。这样的坏处是,若有客官使用 FreshRSS 和 Outlook 这样的 RSS 阅读器,那可能会经常看到重复的文章出现,因为它们默认把修改过的文章当成新的内容刷新。解决办法有三,一是忍受性情多变的我,二是单独对我的订阅关闭此功能,三是取消订阅。为了避免过多的重复内容,我也将 RSS 设置为只输出五篇文章。比修改更过分的是删除,这确实是一个很大的问题。且不说别人是否不在意,我自己看到过往的内容都会老脸通红。但既然是“对自己坦诚”,那就算是删除了,我也没法当它不存在,所以还是公开吧。想起中学时看的一部小说中有这样一句话:

登高者必自卑,行远者必自迩,在这个世界上,重要的不是你正站在哪里,而是你正朝什么方向移动!

与其绞尽脑汁摆脱过去,不如向前走一走,或许它就被甩在后面了。


  1. 图书馆真是个好地方。在人人专注的环境下,自己也自然地沉下心来。重要的是,虽然每天遇见的人差不多,却不必相识,更不用费心去维护人际关系。不过话说回来,我这段时间沉迷科研以及修改网站,时而叹气连连时而惊喜若狂,吓走了好几批同桌😅。 ↩︎

  2. 图书馆的大门外正好是通风口。 ↩︎

  3. 为了街拍和锻炼自己的社交能力,我特地买了 35 mm 的定焦镜头。也就是说,要拍半身人像就得怼着脸。实际上,这也是我唯一一枚镜头,因为穷。 ↩︎

  4. 好玩的是,北方人不懂得南方人对雪的期待(我对南北的定义是是否下雪)。每一次下雪时,我都能听到北方人说:“这雪很大吗?”抑或是“没见过雪吗?”嗯,没见过,今年的还没见过。 ↩︎

自己动手丰衣足食

作者 陈华
2020年6月12日 19:59

我外甥女在疫情期间上网课,有许多课后作业需要打印,大姐就想要买一台打印机。我比较了好久,选定了一款稍稍过千的三合一的墨仓式打印机。价格有些小贵,但优势在于除了可以无线连接以外,还自带官方的连供系统,也就是可以随时添加墨水而不需要更换墨盒,相当便捷而且长期看来很划算。然而,下边的人考虑得再周详也经不住上头的一句否决😅。尽管费尽口舌,我姐还是觉得没有必要破费,我只好退而求其次,选定了一款普通的喷墨式打印机,价格便宜了一半。其实这个价位的打印机已经很棒了,但问题在于,墨盒消耗不起(满满的套路啊)。官方的墨盒一套三百多,却只能打印小几百张,成本非常高。既想要便宜,又想要质量好,那就需要更多的折腾,而我姐绝对是不愿意花心思的。

无奈之下,我只好先买了将就用着。眼看墨盒很快就要消耗殆尽,我咬咬牙,买了副厂的墨盒,价格只有官方的一半。可是,这种墨盒大多质量不佳,基本上是低价收购废弃的原装墨盒,再经过改装和加墨水后,高价卖出去。果不其然,任凭卖家吹得天花乱坠,也阻止不了才使用了一半墨水的墨盒罢工。那么考虑第三方的连供系统如何呢?淘宝一查,嘿,这价格莫非是想要我的命?即便是简易改装过的“易加墨”墨盒也不便宜,而且不敢保证是原装的。

没有了墨盒的打印机那简直是巧妇难为无米之炊。在我绞尽脑汁一番后,终于领悟到了解决方案。网上卖的“易加墨”墨盒看起来改装得好,但无非就是打个孔,自己加墨水罢了。我为什么不自己动手呢?于是,我直接怼着墨盒钻了一个孔,然后将打印机的专用墨水注射进去,再用胶布把洞封起来。诶,可别急着打印。静置一会儿,使它充分入味,体验最佳。如此这般,看着成功打印出来的测试纸,我心里的成就感不言而喻。

果然,外表看起来复杂的东西,它的原理可能很简单,只是常人不了解罢了。进一步思考,市场上有太多被吹得天花乱坠的产品,特别是套用甚至生造一些专有名词之后,令人先入为主地产生高大上的感觉。应对方法也很简单,若是商家使用让人不知所云却又觉得高大上的词汇,那么请立刻避开。产品是服务于人的,而非是让人高不可攀。很多专有名词听起来很专业,其实一查就可大概知道其定义和适用范围,若是自己不了解就听人摆布,那只能多交一些税了。

除夕的惊喜

作者 陈华
2020年1月24日 21:49

除夕和父母一起看春晚时,突然收到了小老板的邮件:

Dear all,

Our paper was accepted in JHEP. Good news to welcome new year! Thank you so much for your support and patience. I will handle the copyright agreement.

Best regards,
TK

这是我的第一篇论文,从完成初稿到被接收花了将近一年的时间。在除夕这个特殊的夜晚收到这个消息,真的是喜上加囍。我马上跟我爸妈分享了,尽管他们听不懂,但还是好开心!

新的一年里,再接再厉,努力成为一个专业的科研工作者。

只有芸知道

作者 陈华
2019年12月27日 21:33

下午和 W 君去看《只有芸知道》,用一句话来概括就是,背景音乐略出戏,风景美如画,是我期待的爱情故事。

首先,虽然电影在豆瓣被吐槽成“新西兰旅游宣传片”,但我觉得画面本来就是电影最基本的要求,更何况这是爱情文艺片。其次,开头梦中的对话(以及配乐!)让我莫名地感觉有些突兀,情节本身没问题,但就是觉得跟后面的风格风马牛不相及。再次,剧情真的很“平淡”,需要静下心来慢慢地跟着节奏走;因为平淡的剧情下,有着丰富的心理变化。遗憾的是,我总感觉配乐和情节不合拍,让我频频地有些出戏。然后,电影的拍摄技巧很赞,在回忆与现实穿插之下,前半段影片描述 15 年平平淡淡的相伴,后半段影片才开始追忆相识的浪漫。最后呢,剧情虽然过于精致了些,但环环相扣;隐喻尽管过于明显了些,却也很到位。我认为这也是最大的败笔,剧情过度的象征化与其宣称的 80% 以上基于真实故事改编相互矛盾了,反而显得刻意了。

也许是拍得太过平淡,抑或是美得不真实,故事很凄美却毫无泪点。也许是我的阅历还不够吧,但我依然被感动着,依然会期待相伴到老的爱情。正如我向她所描述的我的爱情观:“于我而言,爱情、婚姻乃至于柴米油盐般的生活,一眼就能望到尽头,平淡无奇;可是,如果那个人是你,我会很想和你一起慢慢地经历。”

话说,我在武汉生活了那么多年,第一次发现武汉话竟然这么俏皮!

只有芸知道

只有芸知道

写在最后。看电影的时候,坐在我后面的一对情侣全程在打情骂俏,所以······最重要的不是电影本身,而是看电影时心里想着的那个人恰好就陪伴在身旁吧。回去的路上,我们一人啃着一个烤红薯,超级开心~

清肠刮肚

作者 陈华
2019年11月23日 09:50

昨日风和日暖,恰好图书馆闭馆,于是我便约上 F 君和 L 君去东湖踏青。我们从学校步行到东湖绿道入口,而后骑行饶了一圈,历时 3 个小时;一路上云若棉絮,天朗气清,好不畅快!

去时江上之清风

去时江上之清风

归来林下之黄昏

归来林下之黄昏

回来后,我们乘兴去街道口的小龙坎吃火锅。火锅的做法简单而美味,三勺蚝油、两勺蒜、一勺葱(以上的数字是我瞎编的),再将小龙坎自家的油倒满,即可配出一份咸香的味碟。火锅底料愈重口愈好,任何菜品放入其中都会变得美味;千张、金针菇、猪牛羊肉等基本款自不必多说,毛肚和黄喉却是火锅中的极品——味道与口感绝佳。

然而,所谓吃火锅一时爽(一直吃一直爽),过后就要饱受后遗症了。第一个后遗症便是“酒肉穿肠过”。这次我们点的是中辣的红油火锅,不太能吃辣的我,还在回去的路上肠胃就已经开始刺痛了,果真是穿肠而过。跑厕所是不可避免的,只是时间问题罢了。第二个后遗症则是“佛祖心中留”。我想吃过如此重口的火锅之后,大抵一两天内都不会想沾荤腥了,可谓是立地成佛了。

于我而言,火锅不仅是一种令人牵肠挂肚的美食,还是一剂清肠刮肚的“良药”;若是觉得肠胃不通畅,您一试便知。

❌
❌