博文

你绝对没想到的 python 小技巧:定义一个类但出现三个类

 前言 跟同事聊天时同事有的一个很怪的需求:衍生类,也就是说定义一个类,但希望还能同时出现两个与它强相关的衍生类。不多说了,看代码吧: def test(cls): class A(cls): @staticmethod def test(): print('A', cls.__name__) class B(cls): @staticmethod def test(): print('B', cls.__name__) globals()[cls.__name__ + 'A'] = A globals()[cls.__name__ + 'B'] = B return cls @test class T(object): ... TA.test() TB.test() 原理很简单,装饰器test输入一个类,同时基于该类在全局注册两个类,然后返回原类,实际使用时就会发现我们定义了一个类却一下子得到了三个类。用这种方法可以做很坏的事情: 比方说我们在全局注册类的时候,让新类的命名与旧类完全无关,同时不返回原类,用户看到我们调用某个类却找不到该类在哪里定义的,通常的 IDE 对于这种做法完全无能为力。 更进一步,如果新类的类名是通过某种运算得到的,那么用户就算用搜索也找不到这个类定义的位置。 还有更坏的做法,可以挂羊头卖狗肉。比如实现了A类和B类,但是通过装饰器让A和B功能互换,接口却保持一致,一般人阅读代码时绝对想不到它们发生了这种变化。 最后,如果你想做这种坏事,要记得保护你的这个装饰器,把它混淆起来让人没办法阅读就对了。

外文阅读者的福音:生词提示功能

图片
 前言 某天浏览网页发现kindle有一个“生词提示”的功能,可以在英文书籍上面显示中文或英文释义,这样就免得查字典了。由于kindle上只有部分从商店购买的正版书支持该功能,在网上查询发现一个“wisecreator”可以让任意书籍支持生词提示。 只有kindle能用还不够,我也希望digital paper支持该功能,而digital paper只支持PDF。这时我想起以前在真白萌论坛看到有一种给汉字上加假名注解的方法,即html ruby标签,便写了一个简单的小工具自动为epub添加注解,然后使用calibre转换为PDF即可。 使用说明 for kindle 使用pip安装 wisecreator : git clone https://github.com/tmilovanov/wisecreator.git 装上还不能运行,参考 https://github.com/tmilovanov/wisecreator/issues/42 ,还需要替换wisecreator/third-party中的KindleUnpack为 这里的最新版 安装:pip install . 安装calibre(或它自带的ebook-convert) 然后就会出现一个wisecreator的命令,用它给mobi或azw3加入生词提示功能。 fore epub https://gist.github.com/the0demiurge/b88fd09221d205beb2b8fd5cdc17cc6f 装上依赖项,用python运行该代码即可。词典可以从 https://github.com/mahavivo/english-wordlists 下载,建议用GRE红宝书 NAME     add_annotations.py - dictionaries can be found at https://github.com/mahavivo/english-wordlists SYNOPSIS     add_annotations.py BOOK_PATH SAVE_PATH <flags> [DICT_LIST]... DESCRIPTION     add annotations for english words of zip-based ebooks such a

macOS 的命令行补全工具推荐:fig

图片
前言 命令行 shell 里面我使用 fish-shell 已经很久了,fish 真的非常好用,配合 omf 之后命令行就变成了完全体,zsh 的各种终端增强插件与 fish 自带的功能里面相比都不值一提(因为 zsh 的插件真的太慢了)。 前不久读过小众软件的 这篇文章 推荐的 fig,感觉很有趣,试用了一下也不错,因此推荐给大家。 正文 这个软件仅限于 macOS 使用,不过对于 fish 用户来说只是一个锦上添花的功能,所以 Linux 没有也无伤大雅。安装方法很简单,直接 brew install homebrew/cask/fig 即可。 使用效果直接看图就行,就是把命令行补全从类似于 ipython 的 cli 显示改成了类似于 Spyder 的gui 显示。 最后稍微提一下,这个软件的教学做得非常好,值得学习一下。

macOS Launchpad 备份与整理工具推荐:lporg

 前言 我使用软件都会整理得非常整洁,比如 macOS 上面各种软件都要分类排序整理好。不凑巧 macOS 内部 bug 特别多,就包括这个 launchpad。 最近我的 launchpad 出了个问题,几十个整理好的软件被弄得乱七八糟,试过 launchpad manager,可就这么差的一个软件居然还要花钱。在 GitHub 上一搜就找到同样功能的一个命令行工具: lporg 。 使用 按照 lporg 主页说的用brew安装好后,可以先save一下,把软件列表保存下来,然后手动整理一下yaml,再load回去。以后只需保存这个yaml,就能快速恢复了。该工具当前还有些小问题,部分系统软件似乎不听管教,load之后不会按照设置来走,不过这些问题无伤大雅。

在iOS使用原生输入法自然码双拼方案

前言 自从 上篇文章:在macOS使用原生自然码双拼方案 介绍了macOS使用自然码方案后,自然就能发现其实苹果早就实现了多种双拼方案,却只让部分双拼方案可选,这着实令人不解。后来在网上搜了一下, 发现iOS也能够选择原生自然码方案了。  方法流程  使用系统自带的备份软件Finder或者iTunes备份一下iOS设备,文件路径在 /Users/$USER/Library/ApplicationSupport/MobileSync/Backup/ 。 用iOS备份提取器把备份提取出来,我这里用的是文章里推荐的iMazing。不太推荐这个软件,因为没注册的话用起来有些麻烦。 修改备份文件中的 /HomeDomain/Library/Preferences/com.apple.InputModePreferences.plist ,把双拼方案改为5,这与macOS如出一辙。 如果没有Xcode,可以使用苹果电脑内置的命令 plutil 。 先用 plutil -convert json com.apple.InputModePreferences.plist 把配置文件转换为json 然后把里面的数字改成5,变为 {"ShuangpinType":5} 最后用 plutil -convert binary1 com.apple.InputModePreferences.plist 转换为二进制。 使用备份提取器把修改过的 com.apple.InputModePreferences.plist 放回去覆盖掉原来的文件。如果能直接把这个备份还原回去就大功告成了,不然就走到下一步。 前一步我用的iMazing不花钱不让还原备份,所以我把备份导出为原始文件格式,发现与Finder(或iTunes)备份的格式是一样的,所以就直接把文件拷贝到 /Users/$USER/Library/ApplicationSupport/MobileSync/Backup/ ,先删除原来的备份,然后放入修改后的备份。接下来再使用Finder(或iTunes)还原备份。  手机还原成功后会重启,然后发现双拼方案变成自然码了。 多一句嘴,如果在使用自然码之前已经在用别的双拼方案了,键盘上面还会有个分号。这个不必担心,在设置中删掉双拼键盘再加回来,双拼键盘就没有分号了。 参考资料

谈手表、智能手表与智能穿戴

前言 我从小学开始就天天戴手表,从几块钱的到上千块钱的也都戴过一些,电子表到机械表各有涉猎。最近想换表了,谈谈这些年来我对于手表的心得,也许对于想购买手表的朋友们可以作为些参考。 懵懂时期 小学时戴过家里的中古机械表,海鸥、北极星,还拆坏过一个北极星。没有人能抵抗得了复杂机械结构的魅力,所以当时的心里就种下了一颗想要机械表的种子。 当时作为一名小学生,肯定不会让我戴太贵的表,所以几块钱的玩具手表也戴过,三十多块的运动手表也戴过。这种廉价的手表防水性能不好,并且还不错的手表电池能坚持一年,不好的只能用三个月,时间准确度当然也不能有太高要求。那时电脑还没普及,手机更少见,时间基准只能靠上课下课铃声或者新闻联播作为参照物。 卡西欧时期 初中时家人走在路上捡到一块卡西欧的Baby-G,外观非常丑,功能却非常丰富,竟然还能储存通讯录。当时家里也没人认识这个品牌,也就当作一块便宜的电子表给我戴了,我也没把它当做什么好表,不过确实感觉挺好用,和以前戴过的手表都不一样。 前面也说了,我也没把卡西欧当做什么好表,所以怎么折腾就怎么戴。天天把手表泡在水池里玩,当球抛着玩,拆开看结构再装回去。因为看起来就结实,而且怎么折腾也没坏,所以就越玩越过分。就这样,这一块卡西欧我戴了好几年。 有一年冬天,这块卡西欧放在了羽绒服里面忘记了,结果有一整年没找到它。换成以前戴的手表后总感觉各种不方便,这就是所谓的失去了才知道它的美好。第二年找到了这块表之后,发现即便过了一整年,也不用调时间,感叹了一下手表确实不错之后,又继续了手表的虐待之旅。摔在地上次数大概有三位数之后,手表终于坏了。 一块二手卡西欧在手里戴了三四年,没怎么调过时间,没有换过电池,经历过那么多虐待才损坏,给我留下了深刻的印象。可惜当时心里想的全都是机械表,认为自动上链功能意味着永远不用换电池。手里拿着手表店也修不好的卡西欧,想着下回买个机械表吧。也是这时才知道,原来这个手表算是名牌的一种,价格也要几百块。 机械表时期 卡西欧坏了,初中也结束了,正式步入高中校园。我和许多手表小白一样,被淘宝爆款百元机械表深深吸引住了。价格只要一百块,还能从正反两面欣赏裸露出来的机芯和齿轮,走时误差大些可以忍受,大不了每星期都调整一两次时间;自动上链效率低一些也没关系,大不了手动再上发条补充一下;不能放水也没关系,小心点对待就好了。直到有一天,自动上链的摆

关于电子游戏的随想

我的兴趣十分广泛,电子游戏是其中之一。我非常喜欢电子游戏,因为它带给了我大量的快乐。电子游戏曾被游戏从业者自封为“第九艺术”,那么电子游戏能被称为一门独立的艺术吗?它与其他艺术形式有什么区别和联系呢?我不时会思考这个问题。 既然会被称为“第九艺术”,那么就相应存在着其他八大艺术,也就是绘画、雕刻、建筑、音乐、文学、舞蹈、戏剧、电影。音乐、舞蹈、戏剧与电影之间关联性非常强,其中戏剧和电影仅仅是舞台与演出形式略有不同,而音乐和舞蹈也可以直接组成歌剧。电子游戏也存在着多种类别,其中许多类别与八大艺术的关联性非常强。带着前面提出的两个问题,我回顾了我所喜爱的各种类型游戏。 第一类:文本类游戏 我在小学和中学时最大的娱乐就是阅读,《傲慢与偏见》、《少年维特之烦恼》为我的爱情观带来了很大的影响;凡尔纳的几十本科幻小说带我体验了大航海时代的旅行;《歇洛克·福尔摩斯》从细微之处找到关键信息,剧情反转妙趣横生;《百万英镑》和《漂亮朋友》让我见识到了好运眷顾的人生。阅读的优点同时也是遗憾之处在于,必须要发挥想象力。我想象不出维特所爱的绿蒂的美,总担心自己所想象出的美达不到歌德所爱的少女那般;只靠想象,也很难想象出《神秘岛》中生活的多姿多彩;仅靠“美髯公”三个字也难以在心中复现出能够获得如此称号的朱仝的胡须。说实话,看到莫泊桑对于“漂亮朋友”的外表描述时,只能在脑海中浮现出一名小人物。 当然,为了弥补文字的缺憾,有的小说会加入插图,比如文库版的日本轻小说。《凉宫春日》系列提前画好了团长的人设,以此为基础创作的漫画和动画中各个角色都十分一致。这就比《哈利·波特》系列好不少。我在阅读该小说之前看过《哈利·波特》的电影,也看过《哈利·波特》的动画,还见过《哈利·波特》系列的游戏,其中人设不一致的地方相当多,曾带给了我不少混乱。 文本类游戏我接触得比较晚,玩过的第一个游戏是PSP模拟器中的《我的妹妹不可能那么可爱!》系列。当时一玩就比较上头,几天时间内不光刷完了所有线路,还看完了所有同名小说和动漫。现在的文本类游戏包括galgame,但在游戏分类上除了被分类为电子小说,还常常被分类为冒险类游戏(Adventure Game, AVG),实在是有点名不副实,这要从此类游戏的起源讲起。 冒险游戏的始祖《巨洞冒险》(Colossal Cave Adventure),最初的游戏名称就叫《Adventur

此博客中的热门博文

Flash被淘汰后打开swf文件的最佳方法

[SOLVED] Supermicro cannot connect to VGA video port or iKVM

MacBook日文键盘四种输入模式输入法切换(同样适用于其他布局的键盘)