第 25 期:没有消息就是消息

@Author : Lewis Tian (taseikyo@gmail.com)

@Link : github.com/taseikyo

@Range : 2021-04-18 - 2021-04-24

Weekly #25

readme | previous | next

本文总字数 2703 个,阅读时长约:5 分 15 秒,统计数据来自:算筹字数统计

*Photo by Masjid Pogung Dalangan on Unsplash

苟日新,日日新,又日新。

Table of Contents

  • review

    • Python 中的 ...(three dots)

  • tip

    • Word 中使用 bib 管理参考文献

    • 右键文件选择发送到 CMD 执行命令

    • draw.io 使用形状填充矩形

      • 取消 word 单词首字母大写

  • share

    • 没有消息就是消息

algorithm 🔝

review 🔝

这篇文章介绍了 ... 在 Python 中的用法。

文章第一部分我觉得有问题,作者说:Here I am using normal python lists so each dimension needs to be indexed separately

>>> b = [[1, 2, 3], [4, 5, 6]]
>>> b[:][:]
[[1, 2, 3], [4, 5, 6]]
>>> b[1][:]
[4, 5, 6]

我对某个维度不加索引一样可以,比如 b b[1]

1、在 numpy 中使用

>>> import numpy as np
>>> c = np.array(b)
>>> c
array([[1, 2, 3],
       [4, 5, 6]])
>>> c[:,:]
array([[1, 2, 3],
       [4, 5, 6]])
>>> c[...]
array([[1, 2, 3],
       [4, 5, 6]])

创立一个三维的列表来说明其作用:

>>> d = np.array([[[i + 2*j + 8*k for i in range(3)] for j in range(3)] for k in range(3)])
>>> d
array([[[ 0,  1,  2],
        [ 2,  3,  4],
        [ 4,  5,  6]],

       [[ 8,  9, 10],
        [10, 11, 12],
        [12, 13, 14]],

       [[16, 17, 18],
        [18, 19, 20],
        [20, 21, 22]]])
>>> d[1,...]
array([[ 8,  9, 10],
       [10, 11, 12],
       [12, 13, 14]])
>>> d[...,1]
array([[ 1,  3,  5],
       [ 9, 11, 13],
       [17, 19, 21]])
>>> d[1,...,1]
array([ 9, 11, 13])

不能使用多个省略号:

>>> d[...,1,...]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: an index can only have a single ellipsis ('...')

在这种情况下,必须在其他维度中使用 :

2、类似 pass 的作用(nop)

def do_something():
    ...

def do_something():
    pass

3、在类型注解(type annotation)中使用

这个用法有意思

async def something(q: str = Query(..., min_length=10))

上面是个 FastAPI 中一个类似的函数,参数要求是必选的、如果是 str 类型则打印错误,如果是 int 类型则转化为 int(大概意思是传入 "123",转化为 123?),然后该参数有个最小长度,至少为 10。

作者解释说将缺省值设置为 ... 会生成 API 中所需的参数,大概是 ... 会自动将参数解包?

试了下,确实:

class Query:
    def __init__(self, qstr: str, min_leng: int = 10):
        self.qstr = qstr
        self.min_leng = min_leng

    def __repr__(self):
        return f"{self.qstr}: {self.min_leng}"


def foo(x=Query(..., 10)):
    print(x)


if __name__ == '__main__':
    foo(Query("15")) # 15: 10
    foo(Query("a", 15)) # a: 15

tip 🔝

使用一个名为 Bibtex4Word 的宏来进行转换,下载好之后将解压好的 bibtex4word.dot 移到 "%APPDATA%/Microsoft/Word/STARTUP"

然后启动 word 可以看到多了一个 "加载项" tab 页,里面一共大概 6 个按钮。

首先点击打开按钮(Define Bibtex File),加载 bib 文件。然后在想引用文献的位置点击插入按钮(Insert Citation),在弹出的窗口中输入 bib 的关键词。

搞完之后,移动到最后参考文献的章节,点击插入旁边那个有数字的按钮(Insert/Update Bibliography),然后就会自动生成参考文献列表,还是挺方便的。

还可以自定义样式,点击笔刷按钮(Define Bibtex Style),可以输入样式名(比如换成 hustthesis),注意需要是安装的 LaTeX 支持的样式,比如我安装的 MiKTeX 在 "%SCOOP_GLOBAL%/apps/latex/current/texmfs/install/bibtex/bst/" 目录下有所有样式,也可以自行下载样式放到这个目录,完了之后需要刷新数据库:

sudo texhash

更新:可以修改样式为 hustthesis/^/nschp

  • n,表示强制文献以引用顺序排列,不管选用的样式文件是著者年还是顺序方式的

  • s,表示 "sort",将顺序引用的标记 [2, 4, 1, 3] 整理为 [1, 2, 3, 4]

  • c,表示 "compress",将顺序引用的标记 [1, 2, 3, 4] 压缩为 [1-4]

  • h,表示 "hyperlink"(如:plain/h;acm/h),将引用标记与文后文献的对应条目之间建立超链接关系,按住 "ctrl" 键用鼠标左击标记即可跳转至对应的文献条目,返回则是按住 "alt" 键后按一下方向键中的 "left" 键即可

  • ^,表示上标引用方式,即 $^{[4]}$ 样式

  • [,表示引用标记采用方括号样式,例如 [4-9]

  • (,表示引用标记采用圆括号样式,例如(Smith, 2000)

  • p,表示使用 UTF-8 编码,解决中文乱码问题

至于超过三个人名会出现 "et al",而不是 "等",需要加一个键值对,具体看样式文件种的定义。比如我使用 hustthesis 样式,查看 hustthesis.bst 文件,其中由下面代码:

FUNCTION {bbl.etal}
{ "et~al." }

FUNCTION {bbl.cn.etal}
{ "等." }

lang empty$
  { ", " * bbl.etal * }
  { lang "chinese" =
     { ", " * bbl.cn.etal * }
     'skip$
    if$
  }
if$

很显然,没有加 lang 这个键就会使用 "bbl.etal",从而就是 "et al",所以需要加上 lang = {chinese} 这个键值对。

参考:https://www.cnblogs.com/PiaYie/p/14457485.html

2. 右键文件选择发送到 CMD 执行命令

我也不知道这个 trick 该怎么取名,应该是去年是在知乎看到的,当时没记下来,如今再去搜怎么也搜不到(毕竟也不知道搜什么关键词,另外也不知道当时是在什么问题下看到的),通过摸索还是自行搞定了,目前就两个功能,如下图所示:

第一个会格式化 bib 文件,第二个会将 pdf 转化为 jpg。

具体实现很简单,靠 cmd 和 Python 脚本配合。

首先在资源管理器地址栏输入 "shell:sendto",打开 SendTo 文件夹,然后新建 cmd 脚本,以 "-----" 取名会使得此脚本在右键菜单中排列靠前,然后循环对每一个参数调用 Python 脚本,这里需要使用 shift goto 等关键词。

----------PDF转JPG.cmd

echo off
:parse
IF "%~1"=="" GOTO endparse
python F:/Codes/Python/sendto/pdf2img.py %1
SHIFT
GOTO parse
:endparse
pause

而 Python 脚本则来真正实现功能

pdf2img.py

import os
import sys
from pdf2image import convert_from_path

if __name__ == '__main__':
    for x in sys.argv[1:]:
        if not x.endswith("pdf"):
            continue
        print(x)
        name, ext = os.path.splitext(x)
        pages = convert_from_path(x, 500)
        for page in pages:
            page.save(f"{name}.jpg", "JPEG")

至于为啥不直接把 Python 放到 SenTo 文件夹使得直接运行,试过就知道了,它根本不会出现在右键菜单。

3. draw.io 使用形状填充矩形

选中矩形 - 勾选 Sketch - 设置 Jiggle 为 0 - 填充(Fill)选择形状

4. 取消 word 单词首字母大写

文件 - 选项 - 校对 - 点击 "自动更正选项" - 取消 "句首字母大写"

share 🔝

1. 没有消息就是消息

这句话是《一代宗师》的一句台词,我觉得跟 实力至上主义教室 中绫小路清隆的那句话有异曲同工之妙,我也很喜欢这句。

*绫小路清隆:少来探究我

该让你知道的就会让你知道,不想让你知道你就别打听,没有消息就是消息。

一方面好奇心是好东西,对新鲜事务不感兴趣那也太怪了;但是太过也不好,打破砂锅问到底会惹人烦,不是你的就别再勉强,最好的尊重是不打扰。

readme | previous | next

最后更新于

这有帮助吗?