外语学习与刻意练习

关于外语学习的一个误区, 以及什么是刻意练习及为什么要刻意练习

在 youtube 上听到一个会中文的外国哥们吐槽国人学英语时的一些问题, 有些启发, 就此展开聊聊.

他说国人学英语时有个误区, 比如通过看剧来学英语吧, 不是说看剧这个方式就不行, 但具体的操作方法值得商榷.

比如以看美剧 <<老友记>> 练听力为例吧, 很多人是这样的, 一天看一集, 甚至看好几集, 这样就算听了, 学了.

然而这样是不对的! 学习语言很关键的一点是 重复重复再重复, 你绝不应该一天看一集, 甚至看好几集; 相反, 你应该是在这一天里把这一集反复地看好几遍, 甚至好几天都是反复地看这一集! 把这一集看到滚瓜烂熟为止!

为什么呢? 其实严格地说起来, 我觉得关键可能还不在于重复, 重复只是一个必要的手段, 真正的关键我觉得是要理解 有效输入刻意练习 这两个概念.

继续阅读“外语学习与刻意练习”

mysql SQL_CALC_FOUND_ROWS 特性: 一条 sql 语句同时查出总数及分页结果

介绍了如何通过利用 mysql SQL_CALC_FOUND_ROWS 特性, 在一条 sql 语句里同时查出总数及分页结果

展示分页列表是一个常见的开发需求, 需要查询出总数及分页数据.

传统分页查询做法

传统上, 这个一般是通过两条 sql 去实现. 先是查询总数, 比如这样:

select count(*) from programmer where age >= 35;

然后再查分页结果:

select * from programmer where age >= 35 limit 0, 10;

如果是简单的查询还好, 但对于一些复杂的涉及很多条件的查询, 往往需要重复那些条件.

注: 在 mybatis 中, 你可以把公共的条件抽取出来做成一个可复用模块, 不过这样一来结构就相对复杂了, 也不是那么直观.

那么, 是否有方式可以避免上述麻烦, 一条语句就可以查出总数及分页结果呢? 那就要用到 mysql 里的 SQL_CALC_FOUND_ROWS 特性了.

继续阅读“mysql SQL_CALC_FOUND_ROWS 特性: 一条 sql 语句同时查出总数及分页结果”

几率相同的游戏, 你为什么还是输给了庄家?

为什么看似公平的游戏, 其实并不公平?

假设你跟庄家玩一个纯粹靠运气的骰子游戏, 请问谁会赢?

一个容易陷入的误区就是, 既然这是一个纯粹靠运气的游戏, 你可能会想, 那赢的几率应该是五五分, 也是一个纯粹靠运气的问题.

运气好, 你可能赢了庄家; 运气不好, 你则可能输给庄家. 我曾经也是这么想的, 直到后来我在 github 里看到李笑来老师在他的 别做“险盲” 里提到, 其实庄家赢的概率要高, 看了他的分析, 并认真想了想, 确实有道理.

下面就来说说为什么.

继续阅读“几率相同的游戏, 你为什么还是输给了庄家?”

勾股定理的一个简单证明

勾股定理的一个图形式的直观证明

勾股定律, 也即直角三角形, 斜边的平方等于另外两条直角边平方之和.

西方称为毕达哥拉斯定理(Pythagorean Theorem), 归功于古希腊数学家毕达哥拉斯(Pythagoras).

如图:

勾股定理的简单证明 a simple proof of pythagorean theroem

红色直角三角形两直角边长为 a 和 b, 斜边长为 c.

正方形 ABCD 与正方形 EFGH 边长相等, 均为 a + b, 因此两者面积相等.

正方形 EFGH 面积 = c2 + 4 × 红色三角形 = 正方形 ABCD 面积 = a2 + b2 + 4 × 红色三角形

约去四个红色三角形面积, 可得 c2 = a2 + b2 .

证毕.

配置 p6spy log 输出应用最终执行的 sql 语句

介绍了如何使用 p6spy log 输出应用最终执行的 sql 语句, 以方便调试

在上一篇的 配置 mybatis 打印出执行的 sql 及返回的结果集 中, 说到了在 mybatis 中如何打印出执行的 sql, 但是还是遗留了一个问题, 也即是它的输出的 sql 并不是最终可执行的, 而是类似于 jdbc 那种 PrepareStatement 的形式, 参数的值是用问号代替的, 如下:

select * from user where username = ? and password = ?

虽然其参数值通常也会一起输出, 但如果我们对查询的结果有疑问, 想去数据库里自己执行看看, 就不得不自己去拼凑那些最终的 sql:

select * from user where username = 'admin' and password = '123456';

如果参数特别多的查询, 这会成为一个麻烦. 那么, 是否有方式可以直接输出最终的 sql 呢? 一种方式就是下面将要介绍的 p6spy log.

p6spy log 输出效果

先看其输出的效果:

26:33 #1607390793732 | took 7ms | statement | connection 0| url jdbc:p6spy:mysql://localhost:3306/code_sample?serverTimezone=GMT%2B8
select * from user where username = ? and password = ?
select * from user where username = 'admin' and password = '123456';
26:33 list size: 1

可以看到, 除了那种 PrepareStatement 的形式, 还有最终的 sql. 那么, 要如何去实现这样的效果呢?

另注: 这里的日志布局我启用了一种极简的风格, 只有"分钟:秒数", 具体见 配置简化开发阶段日志输出布局 的介绍.

继续阅读“配置 p6spy log 输出应用最终执行的 sql 语句”