javascript

A collection of 5 posts
javascript

一次误用Promise后的体会

Promise的嵌套需要注意,一个返回Promise的Promise可能不会以你想象的方式运行。 最近有需求处理海量的并发任务(其实就是抓wikipedia的文章跳转关系),需要让所有的任务存在数据库中,而不是在内存里,否则像我的第一个版本一样,内存占用巨大,cpu爆表,还得关心断点续传(定时保存)。 写了一个叫做promiseWorker的工具函数,类似Promise.map,支持并发控制地处理一组Promise。不同之处在于,并不需要把Promise塞进去,而是传一个函数getWork,用来获取下一个要执行的Promise,如果没有下一个任务了,就返回null。 还是不难实现的,写了一个版本后,用之前发现一个问题,getWork里需要取数据库信息,这个也是异步的。所以我需要接受一个异步函数,返回一个Promise,这个Promise的结果是null或者是另一个Promise。 写了之后测,发现遇到诡异的情况,只取了一个任务,且执行完第一个任务后就停止了。 然后发现,await getWork() 得到的不是任务Promise,而是任务Promise的执行结果。它
2 min read
折腾

Ghost密码重置记录

登不上ghost了,几个常用的密码都不行,根本不知道发生了啥。 然后点Forget,半天没反应,一分钟后告诉我说“504 gateway timeout” 然后陷入了小小的恐慌 急中生智,临时改了下ghost的源码,直接把密码重置链接拿到手,解决问题。 chrome是这样的: ghost的log(可以在根目录下> ghost log查看)说这样: ??? 到现在还是不知道为什么。 估计是邮箱发送设置配置的不对。但是以前搭在别处的用本地mailer好好的。 好在ghost的源码目录结构很清晰。 根据url,很容易就猜到密码重置的逻辑在[ghost]/core/server/api/authentication.js。 然后,里面有个generateResetToken就是我们要改的地方了。 里面有个地方是生成resetToken,再转成resetUrl,再使用一个密码恢复邮件的模板发送邮件。 于是我在resetUrl的地方console.log一下试图把url输出出来。 然后发现并没输出。 可能log的并不是直接输到stdout的。不
2 min read
基于KeeWeb的个人密码管理系统
javascript

基于KeeWeb的个人密码管理系统

前一阵子bzoj发来邮件说我的账户在多个位置登录。顿时感觉之前的密码不是很可靠了。不过我也记不住那么多密码。于是思考能否有一个个人的密码数据库,每个网站的密码独立不同,全部随机生成。 然后看起来已经有大量解决方案了。 商业的解决方案有很多。如1Password,LastPass,Enpass等。不开源,解锁限制要花钱,没有网页端,不能自己搭这点违背了我们折腾的本质啊。。 不过没法否认他们做得很好。 开源的选择就少了。padlock有点简陋,passbolt好像侧重团队使用(功能也少)。 比较成熟的是Keepass。 keepass包含一个桌面端,也蕴含一个存密码的数据库文件(kdbx)的标准。好多开源的第三方客户端。有个keepass2android还是比较好看,不过感觉好多功能还没支持。 keepass2web也是个web端,不过长久没人维护了,而且是perl写的,不会改。 最棒的就是keeweb了。 keeweb是一个基于js的静态html网站,通过文件读写、webdav等api和localstorage等科技,做得和本地应用一样了。可以自己host一份
3 min read
javascript

给Ghost博客增加Latex支持

测试: $ x=\frac {-b\pm\sqrt{b^2-4ac}} {2a} $ $ x_1+x_2=-\frac b a, x_1x_2=\frac c a $ 网上显然是有把Mathjax直接放进Code injection里的做法。但是 1. 写的公式里的特殊字符会先被Markdown渲染,再传给Mathjax。所以写的时候还得处理这种问题。 2. 评论里的latex。 3. 编辑博客的时候无法预览效果。 于是... 为了摆脱特殊字符的麻烦,我把语法改了一下。一般都是$$包围,这样和普通字符一样会被处理,还有空格这样的麻烦。所以我改成了inline-code里面的$$。如图: 然后因为mathjax太过臃肿所以用了katex。速度很快。 再然后解决什么时候渲染的问题。 1. 页面加载完成后 2. 每隔500ms
2 min read
javascript

给Markdown编辑器HyperMD添加新功能

HyperMD是一个独特的Markdown编辑器。 和其他的编辑器不同,它的特色在于编辑和预览一体,在输入Markdown语法后自动在原位置渲染,当编辑指针指向/鼠标点击被渲染后的元素时,将自动展开Markdown编码以供编辑。 在这里可以在线尝试。 可是,虽然这是个很棒的idea,但这是一个已经被抛弃的项目,它的作者laobubu已经不再维护它,转而维护他的新作品MarkdownIME。后者我认为只能胜任简单的书写,而不是频繁地用Markdown编辑较长的内容——无法修改已经渲染的标签,而且想要修改格式简直是噩梦一般。做个评论框和普通的WYSIWYG编辑器配合还是可以的。 而HyperMD已经较难使用了。原因在于它有一些bug。我着手修复了其中的一部分。 基本功能修复 开始从github上pull的版本根本不能用。很多bug比如 控制台频频弹出错误(每次点击都会)、 公式不能正常显示/折叠、 代码区字体不是等宽的。 然后搞了一个东西可以按目录结构完整地保存远端网页。 用到的东西: 1. phantomjs,访问一下网页并延时一段时间,记录所有
6 min read