如果遇到困难,别急着忧虑,也许这将成为又一次发现惊喜的机会。
复习OM,结识Markdown
本周迎来了三门课程的期末考。其中由德彪老师授课的OM考试可以说紧紧抓住了所有人的心。学期伊始,李老师就用最简单的方式,解决了在职读研最容易出现的“出勤低,专注少”问题,对此,有同学生动地做出了一个微信表情
按照李老师的说法,期末试题必将继续延续课堂上“扣人心弦”的紧张气氛,充分考虑在难度和题量上降低大家的“合作能力”。
简而言之,“复习不到位,咱们重修见!”
此话一出,全班都沸腾了,作为“老父亲”的班长更是比大家还着急,很快找到我们几个OM课活跃分子,希望我们整理一份比较全面的复习文档帮助一下大家巩固知识。本来学习这事情就没有谁必须帮助谁的说法,但是班长这“老父亲”的诨名也不是白叫的,在这一年半的时间里,为了班级,他可谓是劳心劳力,于是,这活就很自然地接了下来。
等我们几人一拿出各自的笔记就发现了问题,大家用来记笔记的软件各不相同,有的是page,有的是印象笔记,有的是微软Note,甚至还有原始的手写笔记。所谓的整合笔记,自然不是简单地把几个人笔记全部导出一份pdf拼接起来,而是要尽可能整出一份让上课走神的人也能根据笔记大致摸清复习思路的“OM小百科”。这就涉及到多个文档的矫正、融汇、标注和排版了。
一开始我们想到了使用“腾讯文档”这一在线多人同步编辑工具。但是在多次导出成doc后,发现一些字符可能会变成奇怪的“口”字,而且同时编辑的人越多,文档格式越容易出现问题。更为要命的是,OM涉及大量数学公式,腾讯文档中却只能以图片的方式添加数学公式,想要稍微做一些修改都极其困难。
最终,我们能想到的最好方式就是大家通过语音会议对笔记进行校对,然后将所有文档发到一个人手中进行“融合”,自然,这个融合任务就光荣地落在了我身上。
拿到这些五花八门的文档时,我感到一阵晕眩。用word整合,耗时太长;印象笔记排版不错,但是排好的文档却无法导出。仿佛手头上拿了一袋米,却找不到煮饭的工具。现在这样的紧张时刻,适合再去学习一个新工具吗?
我这次的答案是,如果学习成本低,现学现用也不错。
那一刻,我想到了一个朋友多次推荐给我的工具——markdown,它是一种有点像代码一样的标记语言,在产生之初就是为专注于内容而不善排版的程序员而开发。可以理解为内置了多种样式的文本编辑方案,当需要改变段落样式时不需要用鼠标拖拽文字或者右键点击,仅需在文字前输入一些指定的字符便可以做到。比如设置各级别标题,只需要输入若干个“#”符号即可,而加粗就在文字两头加上“**”即可。更有甚者,这个编辑方案可以输入几乎所有的数学公式,不管是分号、开方,还是微积分符号都轻而易举,这简直就是我此次完成任务最理想的工具了。
说干就干,我迅速将文档整理分成了几步:
- 利用印象笔记的OCR功能,识别手写笔记里的内容,转为电子版文字。
- 将所有纯文字保存到初始MD中
- 提取其他文档中的图片内容,存放在制定文件夹
- 使用代码,批量给已定的章节名称添加MD标记
- 使用MD语法将公式嵌入到笔记中
- 使用相对路径把剩下的图片全部粘到笔记中
- 对笔记进行内容调整
到了第七步时,我已经完全不需要考虑格式问题了,只需要放心大胆地给笔记增加各种“备注”即可。所有的排版与格式,都交给了markdown解决。
而整个过程除了在输入数学公式时稍微耽搁了片刻,其他操作都非常顺畅。只用了一晚,我就将markdown语法背得烂熟,并且把大家的笔记也整合完毕。当我把markdown格式的文件发给大家时,能感受到大家眼前一亮的喜悦。
打印出来的样子
而实际上在编辑器中的样子是这样的
在这之后,我也有所思考。往日我用习惯了印象笔记,虽然也常遇到一些不方便的情况,却想着学习其他文档工具的成本过大,便懒于寻找新的解决方案。而这次借着复习OM,有幸接触到了Markdown,一见如故,竟十分后悔没早一些使用。可见我对于新事物的接受程度,是一个飞跃式的上升曲线。这也反过来说明一些商业问题,许多自以为“无法被取代”的商品,也许顾客的忠诚度并没有商家所想的那样坚挺。这有点像社交软件的更替,当我第一次听到微信时,我是不削一顾的,因为从QQ切换到微信太麻烦;当我第二次听到微信,内心有了一点波动;当我第三次听到微信时,终于开始尝试将常用社交软件换成微信。而最终由QQ到微信的切换,也完全没有我想象的那样痛苦和麻烦。
是否可以设想,客户对某一商品的忠诚度,一方面来自于客户对品牌本生的信赖,另一方面来自于客户心中虚高的“转换成本”呢?
读英文,自编单词学习卡
这段时间依然揪着些零碎时间啃《The Innovator's Dilemma》,不过和复习期末考一比,进度就有点催人泪下了。
读着读着,依然发现一些问题。
我读英文一直都有边读边背单词的习惯。用的工具是“扇贝单词”,但是最近背单词总会有一种背了忘、忘了背的痛苦情况。一番自我审查下,我觉得是背的方法出了问题,虽然单词都来自于平日的阅读,但是因为词汇量已经有了一些基础,所以往往查的词意都并不一定是单词的常用词意,而网络上流行的这些背单词软件又不会刻意标明你需要的是哪个词意。这就容易出现查个“save”,在书中是“除非”的意思,结果到了扇贝单词里,背到的意思依然是“安全”。结果就是,阅读做了,单词背了,但是英语能力却没怎么提高。
毫不夸张地说,市面上90%的背单词软件我都尝试过,包括“墨墨”、“百词斩”、“蜗词”、“流利说”等,能满足我需求的软件没有一个。
脑子一转,既然我好歹算个程序员,不如自己编写一个背单词工具吧。
想罢,我将目标瞄准了初中时代我使用过的纸质背诵小卡片——卡片正面写上单词,背面写上释义,闲时就掏出口袋背一背,由于每一张卡片都是自制的,内容十分精准,所以效果不赖。
首先,我在Github上找到了一个背诵小卡片的源码,是Anki的源码,能实现自定义卡片的复习安排。接着,我的问题就只剩如何“制作卡片”了。
制作卡片最重要的就是收集信息。单词的信息来源很简单,就是Kindle,通过一阵摸索,我找到了其数据库文件的存放位置,还意外发现其数据库文件格式用的是sqlite,这意味着如果我使用python来分析它的数据,连第三方模块都能省下了。通过读取它的“vocab.db”文件,我发现查词时的例句也一并存于其中。用下面这个语句,就可以把数据库中最关键的时间戳、单词、单词原型、例句、书名尽数查出,并存于pandas的DataFrame中。
sql = """SELECT b.timestamp,a.word,a.stem,b.usage,c.title FROM words a,lookups b,book_info c WHERE c.id=b.book_key and a.id=b.word_key"""
with sqlite3.connect('vocab.db') as db:
data = pd.read_sql(sql,con=db)
这下,单词卡的正面内容有了,还差背面内容,即翻译内容。
这回,我想到了两种方式:
- 使用爬虫技术去访问柯林斯的官方在线页面,通过读取返回的html文档,抓取出单词的准确释义。
- 利用其他翻译软件的API接口,直接获取翻译内容
最终,出于稳定性考虑,我选择了第二种方式,用的是有道云的付费查询接口。这个接口不仅能提供单词与例句的释义,还包含单词音标和发音的媒体文件。其官网提供了python调用的案例代码,复制粘贴再稍作修改即可,这里我仅取了音标的美式发音。
def search_word(word):
q = word
data = {}
data['from'] = 'EN'
data['to'] = 'zh_CHS'
data['signType'] = 'v3'
curtime = str(int(time.time()))
data['curtime'] = curtime
salt = str(uuid.uuid1())
signStr = APP_KEY + truncate(q) + salt + curtime + APP_SECRET
sign = encrypt(signStr)
data['appKey'] = APP_KEY
data['q'] = q
data['salt'] = salt
data['sign'] = sign
response = do_request(data)
res_content = str(response.content, encoding = "utf8")
res_content_json = json.loads(res_content)
tword={}
tword["tword"]=''
tword["us-phonetic"]=''
if res_content_json["errorCode"]=="0":
try:
tword["tword"] = "<br>".join(res_content_json["basic"]["explains"])
tword["us-phonetic"]=res_content_json["basic"]["us-phonetic"]
except KeyError:
print("%s可能存在查询异常。"%word)
else:
print("%s查询完毕。"%word)
time.sleep(5)
return tword
再之后就简单了,利用pandas把这些信息都拼好后,添加分隔符,直接输出成txt文档。再导入到那个卡片代码中,一个专属于我个人的单词学习卡组就做好了。
为了让自己以后使用方便,我还设置了时间戳,以此避免单词的重复添加,这样即使不清空kindle数据库,每次制作的卡片,也不会和过去的卡片重复。
最终的卡片效果如下:
卡片正面点击“usage”之前
卡片正面点击“usage”之后
卡片背面
题外话:本篇简书正是由Markdown语法写成
网友评论