python 多个with 语句一起使用
在读《流畅的Python》时,偶然看到下面的语句:
1 | with urlopen(URL) as remote, open(JSON, 'wb') as local: |
突然才发现,原来多个with语句可以写到一起!
在读《流畅的Python》时,偶然看到下面的语句:
1 | with urlopen(URL) as remote, open(JSON, 'wb') as local: |
突然才发现,原来多个with语句可以写到一起!
使用ffmpeg可以方便地从视频中抽取图像帧:
1 | ffmpeg -i /path/to/video.mp4 image-folder/%06d.jpg |
但实际测试发现,抽取的图像帧比较模糊,有明显的块效应。
搜索时有人说可以加-q:v 1 -qmin 1 -qmax 1
来提高图像质量
1 | ffmpeg -i /path/to/video.mp4 -q:v 1 -qmin 1 -qmax 1 image-folder/%06d.jpg |
测试发现确实有一些提升,但还是能看到明显的模糊。
最后发现,把抽取的图像格式从.jpg
修改为.png
,结果就是高清且无块效应的了:
1 | ffmpeg -i /path/to/video.mp4 image-folder/%06d.png |
另外PNG格式的图像存储大小要大一些,但不会太大,还是能接受的。
前段时间突然发现,我之前对git stash
的使用都是错误的。
具体说来,我是这么使用的:在远端有新的提交,需要git pull
来拉取合并时,发现本地有一些未提交的修改,功能也没实现,不适合做一次commit。这时候我执行git stash
隐藏本地的修改,然后执行git pull
来拉取远端的更新,在最新代码基础上重新实现stash的那些代码中的功能。
这里的问题是,重新实现stash代码中的那一步,其实完全可以用git stash pop
来替代,执行这个命令会在最新代码基础上作用stash的代码,不用再重新实现一遍了(不过这时可能会有代码冲突需要解决)。所以我之前是把git stash
当git checkout -- .
来用了,也就是抛弃了本地的代码更新,显然是有问题的。
正确流程基本上是这样:
1 | git stash # 或者 git stash push,效果一样 |
下面记录一下 git stash 提供的功能和一些参数。
多年以后,想起2022,我会回忆起哪个画面?为了解答这个问题,我回想过去的这些年份,2021,2020,……2005,看能想到什么。除了有些年份里,我结婚,毕业,所以有记忆深刻的事件,大部分年份我甚至想不起任何事情。对于一个模糊的数字,在多年以后,我们确实难以将它和自己一天天度过的日常事情关联起来。虽然2022年发生了很多事情,但大部分还是会被遗忘,但我还是尽量想用详细的文字记录下来,这样当以后想会看那年我身上发生了什么的时候,我知道只要在浏览器里面输入vra.github.io/2022/12/31/summary-2022
,这些时刻都会清晰地浮现在我眼前。
有时候我们在git commit后才发现,之前的一些提交有些问题,比如有些代码忘提交了或者有一些typo需要修改。如果要修改的地方是需要添加到最后一次提交上的,那么可以参考我的这篇博文修改,如果是在非最后一次提交上的,那么就需要用git rebase
来操作。这里简单记录一下操作的过程。
TL;DR
操作命令简要来说是这样:
1 | # 使用git log 查看历史提交,得到需要修改的那次提交的commit id |
后面会使用一个具体的(假)例子来演示这个过程。
在我们使用Python中的dict时,常常需要判断某个关键字是否已经在dict中,如果不存在则创建,非空则进行另外的操作。例如统计一篇文章中所有单词出现次数的代码,大致写法如下:
1 | words_num = {} |
这样写总是需要判断key是否在dict中,不是很优雅。
Python标准库collections中defaultdict类可以很好的解决这个问题。这个类使用与dict几乎一样,除了可以在初始化时设置key的默认类型和数值。类的声明格式为defaultdict(default_factory=None, /[, ...])
,default_factory
是一个callable
的变量。
别的使用与dict无异,正常使用即可。
有时候,在git commit后,我们会发现一些文件忘了提交了,或者需要修改,而且这些提交和修改是与上一次commit的主题一致的,这时候再执行一遍相同的git commit就会让提交记录显得比较冗余,有没有办法将修改后的文件加到最后一次的提交记录里面呢?搜索后发现这里给了一个解决办法,git add文件后调用git commit --amend -no-edit
即可:
1 | git add <file_path> |
注意:如果之前的代码已经提交的话,需要执行git push --force
来推送代码以替代之前的提交记录。
在Linux和Mac下,执行du -sh
来统计目录大小时,默认不统计以点开头的文件或者目录,比如.local
,因此得到不准确的统计结果。从这里知道,要统计隐藏文件和目录,可以这么用:
1 | # 只统计隐藏文件或者目录 |
结合 sort -h
,可以快速得到比较大的目录:
1 | du -sh .[^.]* * |sort -h |
今年我和团队成员一起组织了了ECCV上的一个学术比赛。从1.31日开始准备材料开始,到前两天(10.28日) 把奖金和奖状发给选手,活动结束,整个周期持续了近9个月,真的是出乎意料。整体流程包括Workshop Proposal编写和申请、Workshop合并(多个申请团队合并成一个Workshop),网站搭建,比赛数据和baseline准备,比赛平台搭建,比赛奖金申请,比赛宣传和选手招募、比赛论文评审、参加线上Workshop介绍比赛,奖金和证书颁发等等,第一次参与组织这种比赛,学到了挺多东西,这里记录备忘,下次参考。需要说明的是,这里的分享的都是个人观点,与我所在公司无关。
假如有张1000x1000的图像,我们要将它切成20x20的小patch,该怎么处理呢?
最简单的方法就是采用两重for循环,每次计算小patch对应的下标,在原图上进行crop:
1 | import numpy as np |
但这样总共需要循环50*x50=2500次,而我们知道 Python 的 for 循环比较慢,因此整体开销还是比较大的,有没有更快的方式呢?