吴锴的博客

Life? Don't talk to me about life!

0%

那些年使用过的笔记软件

这些年我换过许多笔记软件,最开始使用的是 Evernote/印象笔记,因为可以实现电脑端和手机端的同步,加上方便的浏览器的剪藏扩展,成了我大学时期的主力应用。

后来我买了一台微软的 Surface3 平板,附赠一年的 Office365,其中就包含了 OneNote 应用。OneNote 笔记本的设置深得我心,搭配手写笔的体验很好,它的搜索功甚至能直接搜到图片上的文字。

虽然 OneNote 有着强大的格式功能,但是不原生支持 markdown 格式,笔记中的代码格式一直是个问题。之后我切换到了 Mac 平台,接触到了 Bear(熊掌记),第一次使用的感觉很惊艳,支持 markdown,内置了多款主题可供选择。为了获得设备间的同步功能,我选择了付费。Bear 也成了我这几年最常用的笔记应用。

阅读全文 »

如果想在博客中分享代码片段,我们可以直接把代码复制过来,也可以利用 Github 的 Gist 代码片段来分享代码。

现在考虑这样一种情况,如果想分享的代码来自于一个 repo 中的文件,博客中需要引用其中的代码。比如在我的上一篇文章使用 Nodejs 遍历文件夹中,所有的代码都来自于这个 repo: traverse-folder。如果直接复制代码,则不能保证 repo 和博客间的代码同步。当 repo 中的文件发生改动时,除非手动编辑博客相应位置,否则博客中的就是旧的代码。而在博客中引用 gist,虽然 gist 的更新会直接展示在博客中,但是仍然需要手动更新 gist。

基于此,我们可以采用这样的一种思路,通过某种方式自动将 repo 中的文件同步至 gist,然后在博客中引用 gist,从而保证更新了 repo 中的文件后,博客中的代码也会自动更新。

阅读全文 »

最近在写一个管理 markdown 文件的工具 knowledge-center,需要读取指定文件夹内所有 markdown 文件。因此需要用 Node.js 来实现遍历一个文件夹内所有文件的功能。

Node.js 中提供了这些有用的 API:

  • fs.readdir:异步读取文件夹
  • fs.readdirSync:同步读取文件夹
  • fs.statSync:同步获取文件属性
阅读全文 »

数独游戏的规则很简单,在9x9的矩阵中,每行、每列、每个九宫格中都需要填入1~9共九个数字,且不重复。

Peter Norvig 的这篇文章 Solving Every Sudoku Puzzle 详细介绍了一种解数独的方法。文中的代码基于 Python2 实现,我将其改写成了 JavaScript 的版本,项目可见 noiron/sudoku

这篇文章中记录了我的理解而非原文的翻译,如果需要更详情的解释,可以查看原文。

阅读全文 »

问题的起因

最近需要实现这么一个功能,通过拖动来改变窗口左侧的文件列表栏的宽度。我选择了用 styled-components 来实现这个功能,并写了如下的样式组件,其中将边栏当前的宽度 width 作为属性传入。

1
2
3
4
5
6
7
const StyledFileList = styled.div<{ width: number }>`
position: absolute;
top: 0;
left: 0;
width: ${props => props.width + 'px'};
height: 100%;
`;

但是当我快速拖动边栏时,width 变化得非常频繁,在控制台中展示了如下的 Warning。

控制台warning

阅读全文 »

Headless Browser 指的是没有图形用户界面(GUI)而是由程序控制的浏览器。Puppeteer 就是由 Google 推出的一种 headless browser。从 Puppeteer 的官方文档中可以看到它能做的事有很多:

  • Generate screenshots and PDFs of pages.
  • Crawl a SPA (Single-Page Application) and generate pre-rendered content (i.e. “SSR” (Server-Side Rendering)).
  • Automate form submission, UI testing, keyboard input, etc.

几乎所有能手动在 Chrome 进行的操作现在都可以用 Puppeteer 来完成。

我之前在工作中就用到了 Puppeteer 做了一些页面爬取的工作,这里把使用到或者玩过的一些功能做了下总结和记录。这篇文章并不是一个全面的 Puppeteer 的使用教程,毕竟 Puppeteer 的大部分 API 我也没有使用过🙂。

阅读全文 »

很多年前在学校的时候,中二期的我和朋友讨论过如果穿越到古代想去哪个朝代。我说去三国吧,和刘关张结义,一统天下,岂不美哉。朋友指出,这三人都比你年纪大,你去了只能做小弟。额,这点倒没想到,于是穿越计划无疾而终。去年又翻了下《三国演义》,在第一章桃园三结义中看到了这句“及刘焉发榜招军时,玄德年已二十八岁矣”,哦,看来我再也不用担心穿越到三国时期的年龄问题了。刘备二十八岁时就已经开始匡扶汉室了,而我二十八岁时还在写代码 ╮(╯_╰)╭。

阅读全文 »

在前段时间的工作中,我遇到了一个在桌面端和移动端进行图文混排编辑的需求。虽然如果只需要编辑纯文本和图片,不一定要使用富文本编辑器来实现。但是为了以后方便扩展,比如文本会有样式要求,我还是用 Draft.js 实现了一个功能较基础的富文本编辑器。

我将代码开源在了这个项目 draft-editor 中,也可以在这里在线预览。本文中我将介绍一下一些关于 Draft.js 的基础知识,并由此扩展到如何在 Draft.js 编辑器中插入图片功能的实现。

阅读全文 »

到了2018年快要结束的时候,才发现这一年什么也没做啊😂,上一篇博客还是3月份写的。感觉做这个总结就是在提醒自己荒废了一年,虽然不想这么做,但还是来写点什么吧。

阅读全文 »

前段时间用 React 写了个2048 游戏来练练手,准备用来回顾下 React 相关的各种技术,以及试验一下新技术。在写这个2048的过程中,我考虑是否可以在其中加入一个 AI 算法来自动进行游戏,于是我找到了这篇文章:2048-AI程序算法分析,文中介绍了 minimax 算法和 alpha-beta 剪枝算法。于是我决定先学习下这两种算法,并以此写了这个 tic-tac-toe 游戏:tic-tac-toe-js代码见此处)。本文将说明如何用 JavaScript 来简单地实现算法,并将其运用到 tic-tac-toe 游戏中。

阅读全文 »