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

Online Dictionary Helper

和 Anki 配合记忆单词十分好用

Dark Reader

可以让浏览器的界面变成超级舒服的棕黄色,很适合阅读。

為什麼你們就是不能加個空格呢?

强迫症福音,可以给网页中英文之间自动加上空格。

The Great Suspender

将暂时不用的 Chrome Tabs 暂停,降低内存的使用。

RSSHub Radar - Chrome Web Store

识别当前网站的 RSS

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

No notes link to this note