Hardware
- HHKB
- Logitech MX Master 3 for Mac
- MacBook Pro (15-inch, 2017)
- DELL U2417H
- Bose QC 35
- NFAUDIO 二单元娄氏动铁 NF2u
- Sony A7M3
- iPhone 11 Pro
- Kindle Paper White
Software
Git
Design Tools
Pinboard
Workflow
Editor
Squirrel
输入法词库扩充 - 肥猫百万维基词库
下载 Releases 中的 zhwiki.dict.yaml
到 /Library/Rime/
下,我使用的是「朙月拼音・简化字」版本,因此可以在 luna_pinyin_simp.custom.yaml
中找到下面配置。
# 載入朙月拼音擴充詞庫
"translator/dictionary": luna_pinyin.extended
扩展的词库都配置在 luna_pinyin.extended.dict.yaml
中,添加需要扩展的词库即可。
import_tables:
- luna_pinyin
- luna_pinyin.sgmain
- luna_pinyin.hanyu
- luna_pinyin.poetry
- luna_pinyin.cn_en
- zhwiki
Chrome Extensions
在線詞典助手
和 Anki 配合记忆单词十分好用
Dark Reader
可以让浏览器的界面变成超级舒服的棕黄色,很适合阅读。
為什麼你們就是不能加個空格呢?
强迫症福音,可以给网页中英文之间自动加上空格。
The Great Suspender
将暂时不用的 Chrome Tabs 暂停,降低内存的使用。
RSSHub Radar
识别当前网站的 RSS
Language Reactor
提供 NetFlix、Youtube、TurtleTube、Video File、Text 的翻译,以及 Flashcards。
Modern for Hacker News
为 Hacker News 提供现代化的显示
Calibre
E-book viewer
字体设置,Preferences > Styles 中添加下面的 CSS。
body > *, span {
font-family: "LXGW WenKai Screen" !important;
}
Photos
因为现在 iCloud 导出的照片会将 Live photos 转换成 .MOV
格式的视频,所以先要删除这部份视频。
rm -f *[IMG]*.MOV
然后执行脚本分发照片。
import os
import io
import shutil
import pyheif
import exifread
import PIL.Image
import PIL.ExifTags
from os import listdir
from datetime import datetime
from os.path import isfile, join
def mkexifdirs (filedicts, timeStr):
dirlocal = dir
if len(timeStr) == 0:
timeStr = datetime.fromtimestamp(os.stat(filename).st_birthtime).strftime('%Y:%m:%d %H:%M:%S')
dirlocal = dir + 'no-exif/'
timeStr = datetime.strptime(timeStr, "%Y:%m:%d %H:%M:%S").strftime('%Y-%m')
filedicts['timeStr'] = timeStr
filedicts['directory'] = dirlocal + timeStr.split('-')[0]
filedicts['directorySec'] = dirlocal + timeStr.split('-')[0] + '/' + timeStr
def movefile (filedicts, joined):
directory = filedicts['directory']
directorySec = filedicts['directorySec']
if not os.path.exists(directory):
os.makedirs(directory)
if not os.path.exists(directorySec):
os.makedirs(directorySec)
else:
if not os.path.exists(directorySec):
os.makedirs(directorySec)
# 目标路径存在
# 目标路径下无相同文件存在
if directorySec and not os.path.exists(os.path.join(directorySec, filename)):
shutil.move(joined, directorySec)
else:
os.remove(joined)
# 目标文件夹
dir = '/Users/luciuschen/Dropbox/Media/Photos/Girl/'
# 存在 exif 信息并且当中含有 DateTime,则在当前目录下按照 DateTime 分类
# 不存在 exif 或者 exif 中不含有 DateTime,则在 no-exif 文件夹下进行分类
files = [f for f in listdir(dir) if isfile(join(dir, f))]
filedicts = {'timeStr': '', 'directory': '', 'directorySec': ''}
for filename in files:
if filename.startswith('.'):
continue
joined = os.path.join(dir, filename)
if filename.lower().endswith(('png', 'jpg', 'jpeg')):
img = PIL.Image.open(joined)
if img._getexif():
exif = {
PIL.ExifTags.TAGS[k]: v
for k, v in img._getexif().items()
if k in PIL.ExifTags.TAGS
}
if 'DateTime' in exif:
mkexifdirs (filedicts, exif['DateTime'][0:19])
else:
mkexifdirs(filedicts, '')
else:
mkexifdirs(filedicts, '')
movefile(filedicts, joined)
elif filename.lower().endswith(".heic"):
heif_file = pyheif.read(filename)
tags = {}
for metadata in heif_file.metadata:
# data 数据中前六个字符 b'Exif 是我们不需要的
file_stream = io.BytesIO(metadata['data'][6:])
tags = exifread.process_file(file_stream, details = False)
if tags:
break
if tags:
if tags.get("EXIF DateTimeOriginal"):
mkexifdirs (filedicts, str(tags.get("EXIF DateTimeOriginal")))
else:
mkexifdirs(filedicts, '')
else:
mkexifdirs(filedicts, '')
movefile(filedicts, joined)
优化版本,这里将处理没有 exif 信息和有 exif 信息的方法合并,不同的部分作为参数。(后续需要学一下 macro 和 generics 的区别和使用场景)
import os
import io
import shutil
import pyheif
import exifread
import PIL.Image
import PIL.ExifTags
from os import listdir
from datetime import datetime
from os.path import isfile, join
def mkexifdirs (filedicts, timeStr, dirlocal):
timeStr = datetime.strptime(timeStr, "%Y:%m:%d %H:%M:%S").strftime('%Y-%m')
filedicts['timeStr'] = timeStr
filedicts['directory'] = dirlocal + timeStr.split('-')[0]
filedicts['directorySec'] = dirlocal + timeStr.split('-')[0] + '/' + timeStr
def movefile (filedicts, joined):
directory = filedicts['directory']
directorySec = filedicts['directorySec']
if not os.path.exists(directory):
os.makedirs(directory)
if not os.path.exists(directorySec):
os.makedirs(directorySec)
# 目标路径存在
# 目标路径下无相同文件存在
if directorySec and not os.path.exists(os.path.join(directorySec, filename)):
shutil.move(joined, directorySec)
else:
os.remove(joined)
dir = '/Users/luciuschen/'
# 存在 exif 信息并且当中含有 DateTime,则在当前目录下按照 DateTime 分类
# 不存在 exif 或者 exif 中不含有 DateTime,则在 no-exif 文件夹下进行分类
files = [f for f in listdir(dir) if isfile(join(dir, f))]
filedicts = {'timeStr': '', 'directory': '', 'directorySec': ''}
for filename in files:
if filename.startswith('.'):
continue
joined = os.path.join(dir, filename)
filebirthtime = datetime.fromtimestamp(os.stat(filename).st_birthtime).strftime('%Y:%m:%d %H:%M:%S')
if filename.lower().endswith(('png', 'jpg', 'jpeg')):
img = PIL.Image.open(joined)
if img._getexif():
exif = {
PIL.ExifTags.TAGS[k]: v
for k, v in img._getexif().items()
if k in PIL.ExifTags.TAGS
}
if 'DateTime' in exif:
mkexifdirs (filedicts, exif['DateTime'][0:19], dir)
else:
mkexifdirs(filedicts, filebirthtime, dir + 'no-exif/')
else:
mkexifdirs(filedicts, filebirthtime, dir + 'no-exif/')
movefile(filedicts, joined)
elif filename.lower().endswith(".heic"):
heif_file = pyheif.read(filename)
tags = {}
for metadata in heif_file.metadata:
# data 数据中前六个字符 b'Exif 是我们不需要的
file_stream = io.BytesIO(metadata['data'][6:])
tags = exifread.process_file(file_stream, details = False)
if tags and tags.get("EXIF DateTimeOriginal"):
mkexifdirs (filedicts, str(tags.get("EXIF DateTimeOriginal")), dir)
else:
mkexifdirs(filedicts, filebirthtime, dir + 'no-exif/')
movefile(filedicts, joined)
break