Hi there 👋

Welcome to cloxnu’s creative space.

Telegram Bot 简明教程 II - 收指令与指令键盘

在此之前 Telegram Bot 简明教程 I - 注册与发消息 收指令 python-telegram-bot wiki 页面 介绍了如何使用 Python 脚本实现与 Bot 交互。 以下是根据这个 wiki 页面编写的例程。 接收 /start 指令 from telegram import Update from telegram.ext import Updater, CallbackContext, CommandHandler token = '2110628450:AAHQ78uj42ddtdsx0gKfaZGyFUhpnQ13vyM' def start(update: Update, context: CallbackContext): context.bot.send_message(chat_id=update.effective_chat.id, text="Let's start!") # 或 # update.message.reply_text("Let's start!") if __name__ == '__main__': updater = Updater(token=token, use_context=True) #1 start_handler = CommandHandler('start', start) #2 updater.dispatcher.add_handler(start_handler) #3 updater.start_polling() #4 updater.idle() #5 首先根据 token 创建一个 updater 对象; 定义 start 函数,在函数体中实现给发指令的那个 chat_id 发送消息「Let’s start!...

November 17, 2021 Â· 2 min Â· Sidney Liu

Telegram Bot 简明教程 I - 注册与发消息

Telegram Bot,简而言之就是运行在 Telegram 上的可交互的「机器人」,你可以给它发送指令让它完成操作或是实现一些功能(付钱、游戏等等),或者可以在 Channel 或 Group 中发送特定消息。 这是 官方介绍。它的主要原理就是开发者通过调用 Telegram Bot API 来实现接收指令、发消息以及实现各种功能。 注册 与 @BotFather 对话,发送指令 /start 开始,/newbot 申请一个新的 Bot 账号。 接着,BotFather 会要求你输入这个 Bot 的名字和 ID。创建完成后,BotFather 会同时给你一个 token,记住这个 token。 此时,已经可以和这个 Bot 互动了,但是想要这个 Bot 也可以主动发消息,这时就要建立一个 Channel,并把这个 Bot 设置为管理员。这个 Channel 如果是 public,其链接可以自定义。这里以 private 为例。 由于 Channel 是 private,我们需要这个 Channel 的 ID 来操作,这里可以通过将 Channel 内的消息转发给 @JsonDumpBot 来查看。可以看到此 Channel 的 ID 是 -1001790411176。 发消息 在官方文档的 Making requests 介绍中讲到,可以使用 GET 或 POST 请求以下 URL。...

November 10, 2021 Â· 1 min Â· Sidney Liu

如何用 Git 命令修改历史提交

在实际工程中,有时我们在以往的提交中忘记提交部分代码,当想起来的时候已经提交过很多笔了。于是想要把当前的更改提交到历史 commit 中去。 假设当前我们提交了三次: $ git log commit 0e162000e27ba998d5a92cc04b489e3d3ec0e30d (HEAD -> master) Author: cloxnu <[email protected]> Date: Fri Nov 5 13:46:08 2021 +0800 3rd commit commit f5f470406634bb255e4f19bf62780868afeed32d Author: cloxnu <[email protected]> Date: Fri Nov 5 13:45:21 2021 +0800 2nd commit commit cf8c580d322e459fa1acf4ef1e6d08163aeb1a21 Author: cloxnu <[email protected]> Date: Fri Nov 5 13:41:30 2021 +0800 1st commit 这几次提交就只涉及一个文件 1.txt $ cat 1.txt 11111111 22222222 33333333 其中第一行为第一次提交,第二行为第二次提交,第三行为第三次提交。 此时如果想要将第二次提交增加一个新文件 2.txt,该怎么操作呢? 步骤 首先新建 2.txt $ cat 2....

November 5, 2021 Â· 3 min Â· Sidney Liu

使用渐进式 JPEG 图片优化 blog 阅读体验

从写好第一篇多图大图的 blog 那一刻起,我就一直在思考访问者如何快速加载这些图片提高阅读体验,因为这些图片动辄几兆甚至几十兆,而我又不希望压缩这些图片导致质量下降。 所以在以往的多图 blog 中,访问者往往要等待很久的加载时间。 既然是图片大小导致的「硬伤」,加载这些图片几乎都取决于访问者的网速,那么有没有办法从图片本身的角度出发,来优化这种加载时间? 什么是渐进式 JPEG(Progressive JPEG) 我们知道,JPEG 格式是目前兼容性最高,使用范围最广的图片有损压缩格式。而其中的编码方式分为多种,这里主要讨论两种:Baseline JPEG 和 Progressive JPEG。 对于 Baseline JPEG,图片是从上到下一行行顺序存储的,因此在加载图片的时候能看到图片从上到下慢慢显现出来。 而 Progressive JPEG,图片会由模糊到清晰渐进式地分多次存储,因此在加载图片时看到的图片是由模糊到清晰渲染的。 图片来自「简书」 这种渐进式 JPEG 显然可以在图片未加载完全的时候就能看到它的「预览」,而且渐进式 JPEG 的文件大小要略小于 Baseline JPEG。不过渐进式 JPEG 在 Windows 7 以前的 IE 等浏览器不受支持,会在完全加载完成后才显示图片。 目前多图 blog 之所以加载时间很长,是因为这些图片存储的编码方式都是 Baseline JPEG。 🎬 于是,我在之前的 GitHub Actions 配置文件中补充了将这些图片转换为 Progressive JPEG 的命令,当前的 blog 在合并入主干分支后 GitHub Actions 会先使用 hugo 命令创建 HTML1,然后 Progressive JPEG 命令再将所有 JPEG 图片批量处理。 在 Linux 中,使用 ImageMagick 处理图片。其中的 -interlace 选项有提供将图片转换为 Progressive JPEG。...

October 30, 2021 Â· 1 min Â· Sidney Liu

如何使用相机拍摄包含精准地理位置信息的照片

🤔 当我们使用手机拍照时,按下快门的那一刻,程序会自动获取当前地理位置,并将其写入照片中。而当我们拥有海量包含地理位置并通过 iCloud 或者 NAS 管理的照片时,这些照片会被程序自动归类,因此可以省去大量整理照片的时间。 可是当拍照的设备转移到成像质量更好的相机时,我们却很难方便地获取地理位置信息,因为现在大多数的单反/无反相机都不带有 GPS 模块。因此目前这些相机的解决方案是通过手机蓝牙连接来获取 GPS 信息以写入照片。 在实际使用中,相机需要手机打开对应相机 App 并连接数秒才能更新正确位置,否则相机要么不会写入地理位置,要么写入一个老的地理位置。在拍照时如果总是需要用手机来连接,那一定相当影响拍摄体验。 于是经过一段时间的思考,找到了一个可行的方案:在拍照期间,可以用含有 GPS 模块的设备(例如手机)记录自己的轨迹信息,此后可以根据照片拍摄时间和这些轨迹信息计算拍摄的地点,因而写入照片 EXIF 信息中。 动手 起初,我打算自己实现通过轨迹信息计算拍摄地点的脚本。 首先通过手机上的轨迹记录软件得到一个 GPX 文件,GPX 文件的数据格式本质上是 XML。 <trk> <name>...</name> ... <trkseg> <trkpt lat="30.313094" lon="120.382447"> <ele>8.456302</ele> <extensions> <speed>0.059180</speed> </extensions> <hdop>14.278474</hdop> <vdop>10.027264</vdop> <course>-1.000000</course> <time>2021-05-08T13:31:10Z</time> </trkpt> <trkpt lat="30.313110" lon="120.382330"> <ele>9.418098</ele> <extensions> <speed>0.938084</speed> </extensions> <hdop>14.331614</hdop> <vdop>9.951165</vdop> <course>286.357989</course> <time>2021-05-08T13:32:06Z</time> </trkpt> </trkseg> </trk> 类似这样,每个 GPX 文件由 <trk> 标签对组成,<trk> 标签对又由 <trkseg> 标签对组成。事实上在 GPX 记录软件中可以通过暂停、继续在同一个 GPX 文件中记录多个轨迹。因此每个 GPX 文件可以解析出由 TrackSegment 为单位的多组数据。...

October 7, 2021 Â· 2 min Â· Sidney Liu

如何用命令行将 Linux 服务器上的文件备份至 Dropbox

又进入了新的一月,又到了服务器续费的时候。由于我前些天把我的 travel blog 变成静态页面了,因此原本 serve 了它一段时间的服务器也可以注销掉了,不过服务器上还存有一些需要保留的文件,于是今天想把这些文件放到 Dropbox 中。 参照 官方安装页面,先运行以下命令下载并解压 Dropbox。 $ cd ~ && wget -O - "https://www.dropbox.com/download?plat=lnx.x86_64" | tar xzf - 然后在 home 目录就会产生一个 .dropbox-dist 目录,同样参照以上官方安装页面,运行这个目录下的 dropboxd 来启动 Dropbox 守护进程。 $ ~/.dropbox-dist/dropboxd 我在运行这句命令之后这段程序执行了一些指令后报错。(我使用的是 Ubuntu 20.04 LTS) 于是立马在 DigitalOcean 中找到答案,我缺少了一些依赖,运行以下命令解决此问题。 $ sudo apt install libc6 libglapi-mesa libxdamage1 libxfixes3 libxcb-glx0 libxcb-dri2-0 libxcb-dri3-0 libxcb-present0 libxcb-sync1 libxshmfence1 libxxf86vm1 安装依赖后,运行上述命令,得到以下输出: 根据提示需要打开 URL 登录自己的账号以绑定这台服务器。打开后界面如下。 如果自己的 Dropbox 账号是通过 Google 或者 Apple 登录的话,需要先登录自己的账号设置一个密码才能在这里登录。 登录之后,控制台会出现一句话,...

September 1, 2021 Â· 1 min Â· Sidney Liu

如何在 iPad Pro 上高效地使用 Taio 创建 Hugo blog

本文来自生产力 ℙ𝕣𝕠𝕕𝕦𝕔𝕥𝕚𝕧𝕚𝕥𝕪 系列文章。 我们知道,在一台安装了 Hugo 命令行工具的电脑上,只需运行命令 $ hugo new ... 即可创建一个新的 blog。 为了发挥 iPad Pro 的「生产力」属性,我使用 Taio 的「动作」实现了此命令,因此可以在 iPad Pro 上高效快速地撰写 blog。 首先使用「Working Copy」拉取 GitHub 上的 blog 远程仓库。 然后打开 Taio,将刚刚拉取下来的远程仓库的本地地址添加到 Taio 的「添加的位置」中。 添加完成后,在「动作库」中创建新动作,取名叫「Create a Hugo blog」。 以下是一个创建新 blog 的简单版本,运行之后会要求输入 blog 目录名,标题,以及类别,然后会在当前目录下创建这个目录,以及这个目录下的 index.md。 PS:这里添加到 blog 的当前日期符合 ISO 8601 标准,时间格式为 yyyy-MM-dd'T'HH:mm:ssxxx 然后将写好的动作拖移到「编辑器」文件夹中,意味着可以在编辑器的快捷动作里运行。 在某一分类文件夹下的任意文件里,点击右上角的闪电标志,运行「Create a Hugo blog」即可。 使用 Taio 写完整篇文章后,最终回到「Working Copy」,Commit & Push 自己的更改。剩下生成 HTML 的环节就交给 Travis CI 或者 GitHub Actions 去完成,详细配置请看 使用 Travis CI 自动部署 Hugo 站点...

August 30, 2021 Â· 1 min Â· Sidney Liu

使用 GitHub Actions 自动部署我的 travel blog 站点

前情提要:在我的 travel blog 的仓库根目录下,有一个叫 gotravel 的文件,运行该文件即可自动生成网站,因此 GitHub Actions 只需要在我每次 push 之后运行这个文件再提交一次就可以了。 在 GitHub 仓库内点击菜单栏的 Actions,然后选择 set up a workflow yourself 然后就会跳转至新建文件页面,以及 GitHub 自动生成最初的 main.yml 文件。 # This is a basic workflow to help you get started with Actions name: CI # Controls when the workflow will run on: # Triggers the workflow on push or pull request events but only for the master branch push: branches: [ master ] pull_request: branches: [ master ] # Allows you to run this workflow manually from the Actions tab workflow_dispatch: # A workflow run is made up of one or more jobs that can run sequentially or in parallel jobs: # This workflow contains a single job called "build" build: # The type of runner that the job will run on runs-on: ubuntu-latest # Steps represent a sequence of tasks that will be executed as part of the job steps: # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - uses: actions/[email protected] # Runs a single command using the runners shell - name: Run a one-line script run: echo Hello, world!...

August 14, 2021 Â· 2 min Â· Sidney Liu

HackMD 的使用与思考

本文来自生产力 ℙ𝕣𝕠𝕕𝕦𝕔𝕥𝕚𝕧𝕚𝕥𝕪 系列文章。 说到 Markdown 团队协作,就不得不提到 HackMD。 我有一段时间在寻找 Markdown 合作 & 同步的过程中,偶然间发现了 HackMD,当时使用了一下,意外地发现相当好用。 HackMD 支持 MathJax 公式,以下是官方宣传的特色功能:(当时觉得这正是我想要的) 注册账号登录以后,在个人页面可以建立不同的空间,给不同的文件放置不同的标签。这里的标签就已经起到了分类的作用,所以 HackMD 没有「文件夹」。 我立马新建了一个团队空间,新建了一个新的笔记,写作页面相当干净简洁,该有的功能都有。 在团队协作方面,正在编辑这篇文章的人可以同时看见其他协作者正在编辑的位置,编辑一段文字后还可以看见这段文字是谁写的,不同作者用不同颜色表示在这段文字的左边或者下面,如上图编辑页面。 在「共享」弹窗中还可以修改阅读或编辑这篇文章的权限,URL 以及浏览方式。 另外,GitHub 同步只能绑定一个 GitHub 账号的其中一个仓库中的一个文件,这样每次新建一个文件就得手动在 GitHub 新建一个文件了,如果它可以自动同步并且不同账号可以同步不同 GitHub 账号就好了。 HackMD 还有大量的功能与操作,这是 官方文档。...

March 30, 2021 Â· 1 min Â· Sidney Liu

初识 React Native

安装 由于开发需要,稍稍玩了玩 React Native 开发一个 App 的简要流程。 官网 安装使用时,可以使用 Expo ,可以省去在 Xcode 或者 Android Studio 配置的过程。 运行以下命令安装 Expo npm install -g expo-cli 注意这里在 npm 前不要加 sudo,请提前确保权限通顺 sudo chown -R $(whoami) ~/.npm sudo chown -R $(whoami) /usr/local/lib/node_modules 安装好后,我试图运行 Expo,但是得到了 Expo 不支持当前的 Node 版本的错误,于是运行 nvm 来安装最新版本 Node(以下是未安装 nvm 的版本): sudo npm install -g n sudo n latest 或者,使用 yarn yarn global add expo-cli 开始 安装好后,生成第一个项目: expo init rn_proj 进入目录并运行 cd rn_proj expo start 然后同时会打开一个 Web 控制台...

March 1, 2021 Â· 1 min Â· Sidney Liu