《Java编程思想》读书笔记——字符串

Java编程思想可以证明,字符串操作时计算机程序设计中最常见的行为。

String对象是不可变的。查看JDK文档你就会发现,String类中每一个看起来会修改String值的方法,实际上都是创建了一个全新的String对象,以包含修改后的字符串内容。而最初的String对象则丝毫未动。 继续阅读

《代码的未来》读书笔记——支撑大数据的数据存储技术之memcached和它的伙伴们

代码的未来在程序的实现中,经常会忽略程序的运行时间。即便采用类似的实现方法,有时候运行速度也会相差很多。大多数情况下,这一速度上的差异是由数据访问速度的差异所导致的。

在程序中,虽然数据访问所消耗的时间看上去差不多,但实际上却有很大的差别。这是因为,数据访问所需要的时间,与数据存放的位置有很大关系。例如,内存中的数据与硬盘上的数据,其访问所需的时间可以相差数百万倍之多。

以机械旋转方式工作的硬盘,从驱动磁头到将盘片旋转到适当的扇区,需要几毫秒的时间,从CPU的速度来看这些时间都是需要等待的,而对内存的访问仅仅需要几纳秒的时间。相比之下,硬盘简直就像停止不动一样。此外,和位于外部的内存相比,位于CPU内部的寄存器和高速缓存的访问速度又能快上几倍。 继续阅读

《Java编程思想》读书笔记——通过异常处理错误

Java编程思想Java的基本理念是“结构不佳的代码不能运行”。

发现错误的理想时机是在编译阶段,也就是在你视图运行程序之前。然而,编译期间并不能找出所有的错误,余下的问题必须在运行期间解决。这就需要错误源能通过某种方式,把适当的信息传递给某个接收者——该接收者将知道如何正确处理这个问题。 继续阅读

《Java编程思想》读书笔记——持有对象

Java编程思想Java容器类类库的用途是“保存对象”,并将其划分为两个不同的概念:
Collection。一个独立元素的序列,这些元素都服从一条或多条规则。List必须按照插入的顺序保存元素,而Set不能由重复元素。Queue按照排队规则来确定对象产生的顺序(通常与它们被插入的顺序相同)。
Map。一组成对的“键值对”对象,允许你使用键来查找值。ArrayList允许你使用数字来查找值,因此在某种意义上讲,它将数字与对象关联在了一起。映射表允许我们使用另一个对象来查找某个对象,它也被称为“关联数组”,因为它将某些对象与另外一些对象关联在了一起;或者被称为“字典”,因为你可以使用键对象来查找值,就像在字典中使用单词来定义一样。Map是强大的编程工具。 继续阅读

《代码的未来》读书笔记——支撑大数据的数据存储技术之键-值存储

代码的未来键-值存储(Key-value store)是数据库的一种。在云计算愈发流行的今天,键-值存储正在受到越来越多的关注。以关系型数据库管理系统(RDBMS)为代表的现有数据库系统正接近其极限,而键-值存储则拥有超越这种极限的可能性。

键-值存储是通过由键对象到值对象的映像来保存数据的。

使用键-值存储方式的数据库,大多数都在数据查找技术上使用了散列表这种数据结构。散列表是通过调用散列函数来生成由键到散列值(一个和原始数据一一对应的固定位数的数值)的映射,通过散列值来确定数据的存放位置。散列表中的数据量无论如何增大,其查找数据所需的时间几乎是固定不变的,因此是一种非常适合大规模数据的技术。 继续阅读

《代码的未来》读书笔记——布隆过滤器

代码的未来布隆过滤器是一种可以判断某个数据是否存在的数据结构,或者也可以说是判断集合中是否包含某个成员的数据结构。布隆过滤器的特点如下:

  • 判断时间与数据个数无关(O(1))
  • 空间效率非常好
  • 无法删除元素
  • 偶尔会出错(!)

“偶尔会出错”这一条貌似违背了我们关于数据结构的常识,不过面对大量数据时,我们的目的是缩小查找的范围,因此大多数情况下,少量的误判并不会产生什么问题。 继续阅读

《代码的未来》读书笔记——“正常化偏见”

代码的未来所谓正常化偏见指的是人们的一种心理倾向,对于一些偶然发生的情况,一旦发生了便会不自觉地忽略其危害。

“一定没问题的”

程序员也是人,同样无法逃脱正常化偏见的影响。对于程序运行中所发生的异常情况,总是会觉得“这种情况一般不会出现的”、“所以不解决也没关系”。例如,大家可能会这样想:“配置文件肯定会被安装进去的,因此不必考虑配置文件不存在的情况”,“网络通信中丢包之类的问题TCP层会帮忙搞定的,因此应该不用考虑通信失败的情况”。总是把情况往好的方面设想,这样的心理在程序员中很常见。 继续阅读

使用OpenWrt下的OpenVPN在校园网环境中免费蹭网

Internet device学校的校园网账号分为内网账号与外网账号,内网账号免费,获得IP地址内网IP,本文中使用10.*.*.*表示,可访问学校内任意一台主机,也可被任意一台主机访问;外网账号收费,获得IP地址为教育网公网IP,本文中使用121.*.*.*表示,访问权限为整个互联网。值得注意的是,学校在121.*.*.*与10.*.*.*的网段之间也有路由,即这两个IP是可以互访的。 作为穷学生,从进入学校,了解了学校网络结构之后,就琢磨着通过使用免费的内网账号访问校内的代理或VPN来免费访问互联网。要架设代理或VPN,就需要找一台能够访问互联网的主机作为服务器,提供代理或VPN服务;另外在需要免费上网的主机需要对系统或软件设置代理服务器或运行VPN客户端。作为服务器的有互联网访问权限的主机可以找到,但是需要24小时开机,代理服务器设置和VPN客户端虽然也可以配置,但是使用起来还是有点麻烦,如果在手机上配置,体验更差。由于这两点,一直迟迟没有做出行动。一个偶然的机会,在了解到OpenWrt之后,发现在路由器上运行OpenWrt可以完美解决这两个问题。 继续阅读