Kindle PaperWhite 2 修砖记

适用条件:

  • 设备是 Kindle PaperWhite 2
  • uboot正常

需要的工具:

  • 螺丝刀
  • USB-TTL转换器(某宝有售,几块钱一个)
  • 杜邦线(一般买转换器会送,最好是一头带针的)
  • 一台装有Mac或Linux系统的电脑

注意:

  • 本方法未在KPW2以外硬件上测试,如果测试成功,请回复告知,方便大家参考。注:已有KPW1成功的先例。
  • 本方法仅在Mac系统下实际测试,Linux系统大同小异。Windows系统某些工具可能需要自行到网上搜索,欢迎吃螃蟹。

如果你连uboot也搞坏了,那就只能上编程器了,先刷uboot,然后再根据本文刷MMC。

这里解释一下这几个名词:

  • uboot:全名 Universal Boot Loader,在kindle中充当启动器的角色,即kindle先启动到uboot,再由uboot引导操作系统内核。
  • MMC:全名 MultiMediaCard,即存储卡。国行和美版是2GB,日版为4GB。而MMC中则存储了kindle操作系统(本质是一个Linux发行版)和用户数据。注意:uboot并不是写在MMC中的,而是有一块单独的ROM用于存储uboot。

那什么情况算uboot坏了呢?正常情况下,刷挂系统,uboot也是不会挂掉的;甚至是系统内核挂了,uboot也不会受到影响。不手动刷uboot,uboot一般是不会因为其他原因坏掉的。

其实网上已经有很多修砖教程了,但都是针对特定问题修砖(比如升级屏保变砖、卡大树 等等),具有一定的局限性。而本文的方法,可以直接将kindle刷回出厂状态(未注册前的状态),无论你之前是怎么坏的(当然啦,硬件坏了是无法靠刷固件解决的)。

刷机前声明:本文忽略了一部分技术细节(换言之,我假设读着有一定的硬件基础),如果你卡在某一步搞不定,可以Google一下,一般都会找到答案。如果搜索无果,可以在评论中提出,我会尽可能予以协助。刷机需要细心和耐心,第一次刷机会感觉整个过程颇为繁琐,一般会折腾数个小时,请读者在尝试前做好心理准备。

准备工作:

  • 安装USB-TTL转换器的驱动程序
  • 测试一下转换器是否正常工作。测试方法:短接转换器的RX和TX,在串口终端中输入任意一串字符,如果屏幕回显则说明转换器正常工作
  • 拆开你的kindle(方法见参考资料2、3)
  • 连接kindle和转换器(方法见参考资料2、3)。由于焊点又小又密,焊接方案对新手颇有难度。推荐找个一公一母的杜邦线,想办法将带针的杜邦头固定在PCB板上(如果实在固定不了,可以找个人帮你按着线-_-//)。

修复步骤:

  • 下载需要用到的固件程序(如果可以进入recovery模式,可以直接跳过本前两步)
  • 刷入基础系统
  • 进入recovery模式
  • 擦除MMC(如果分区表没有被破坏请跳转至第_步)
  • 重新分区
  • 初始化分区
  • 扩展分区
  • 开启USB
  • 拷入系统镜像,断开USB
  • 写入系统

参考资料:

[1] https://gist.github.com/TobiasWooldridge/22f0cdca75190b9a473f
[2] http://blog.sina.com.cn/s/blog_4d66a3cb0101klkm.html
[3] http://www.izheteng.com/teardown/fix-kindle-paperwhite.html

如果文章有写得不对的地方,欢迎指正~~~

本文可以自由转载,转载请注明出处。

线粒体夏娃理论模拟

引子

由于线粒体严格遵循母系遗传,只能有母本传给子代。然而,科学家对世界不同地区和民族的人群进行线粒体DNA的调查,发现其线粒体DNA高度相似。因此可以判断,全人类很有可能拥有同一个母系祖先。

看到这个结论感觉难以置信,怀着疑问,对这个问题进行了一点研究:

初探

为了能够较为直观地看到母系遗传的子代情况,使用计算机进行了模拟。为了简化模型,这里假定:

  1. 每一代的种群数量恒定,程序中取n=100000
  2. 在上一代中查找母本时,每个个体的可能性相等

R代码(部分):

n 

代码解释:

  • child
  • ra
  • child

这里不得不吐槽一下,虽然R代码写起来简洁,但运行效率真心太差了。100k的量还可以较快得算完,1M算是勉勉强强,10M就得运行很久了。。。。

整理出数据:

图一:横轴表示向前追溯的代数,纵轴表示家族数量

图二:100代前的种群,横轴表示拥有共同祖先的家族的个体数,纵轴表示家族个数(数据经过排序)

图三:1000代前的种群,横轴表示拥有共同祖先的家族的个体数,纵轴表示家族个数(数据经过排序)

图四:100代前的种群,横轴表示个体编号,纵轴表示所属母本编号(数据经过排序)

图五:1000代前的种群,横轴表示个体编号,纵轴表示所属母本编号(数据经过排序)

分析

图一,从形式上来看很像次数为负的幂函数,近似服从幂律。在不断向祖先追溯的过程中,家族逐渐消亡、个体越来越向大家族集中,即“富者更富”。

图二和图四,近似服从正态分布(由于数据排过序,图示仅为正太分布的一半),对比图二和图三可以看出,样本逐渐向样本中心集中,样本方差逐渐缩小。

图四和图五,近似为均匀分布,这是由于模拟祖先选择时使用的是均匀随机函数。对比两图可以看出,随着代数的不断增加,部分家族消亡,使得更多的人拥有同一个祖先,因此直线变得越来越起伏不平。

虽然经历了1000代,100k的种群依然没有连为一颗家族树,我们不禁要问,多少代后才能找到线粒体夏娃呢?经过模拟,当代数至少为种群数量的1.7倍时,找到线粒体夏娃的可能性比较大。

瀚海星云3.0快速配置指南

瀚海星云3.0拥有更完善的界面,更大的默认配额以及高度的可配置性。下面我们就来一起快速建立一台云服务器吧

注册

1.在主页点击注册按钮

1.1.主界面

2.打开注册页面,填写相应信息

1.2.注册

3.进入邮箱查收验证邮件并点击邮件中的验证链接

4.登录你的账户

下面我们来看看目前(测试期间)的配额

1.3.配额

网络

瀚海星云3.0使用SDN技术,允许用户灵活、快捷得配置网络。

定义网络

1.在左侧导航栏点击”网络”

2.在网络配置界面点击”创建网络”

2.1.网络(空)

3.输入网络名称

2.2.创建网络

4.切换到子网选项卡,输入子网名称、网络地址和网关。注意地址和网关要在同一网段中。

2.2.创建网络.子网

5.切换到子网详细选项卡,输入地址池范围(需要在刚配置的子网网段中)及DNS服务器(可以设置为科大DNS:202.38.64.56 和 202.38.64.17);主机路由项留空

2.2.创建子网.子网详情

6.点击”已创建”回到网络页面

2.3.网络(有)

创建路由

1.在左侧导航栏点击”路由”,进入路由配置页面

2.点击”新建路由”按钮

2.4.路由(空)

3.输入路由名称,点击”新建路由”回到路由配置页面

2.5.新建路由

4.点击设置网关

2.6.路由(有)

5.外部网络选择ext-net,点击”设置网关”回到路由配置页面

2.7.设置网关

6.点击刚生成的路由(图中为route),进入路由详情页面

2.7.路由(有-2)

接口

1.点击增加接口

2.8.路由详情

2.”IP地址”栏留空,点击”增加接口”按钮

2.9.增加接口

创建云主机

1.从左侧导航栏中点击“云主机”,进入云主机管理界面。

2.点击“启动云主机”按钮

3.1.云主机(无)

3.输入云主机名,选择云主机类型(注意不要超过配额),输入云主机数量,云主机启动源选择“从镜像启动(创建一个新的云硬盘)”,选择需要的镜像(20140429注:windows8镜像无法使用),输入设备大小,设备名称保持默认;输入完成后点击进入“访问&安全”选项卡

3.2.新建云主机.详细.win

4.输入管理员密码、如果需要可以配置密钥对(这里略过),完成后切换到“网络”选项卡

3.3.新建云主机.访问安全

5.添加刚才建立的网络(图中为Switches),完成后点击“运行”按钮

3.4.新建云主机.网络

6.此时可以看到云主机正在创建

3.5.云主机.创建中

我们可以在网络拓扑页面看到当前的网络拓扑结构

3.6.网络拓扑

绑定外网地址

1.待云主机新建完成后,点击“更多”按钮

4.1.云主机.创建完成

2.选择绑定浮动IP

4.2.云主机.更多

3.点击“选择一个IP地址”右侧的“+”号

4.3.绑定浮动IP

4.点击“分配IP”

4.4.分配浮动IP

5.点击“关联”

4.5.绑定浮动IP.已选择IP

至此,云主机以及配置完成

登陆云主机

对于Windows云主机:请使用Windows自带的远程桌面连接,地址为刚才绑定的外网IP,用户名为Administrator,密码为刚才设置的密码。

如果您的本地系统不是Windows,可以在使用VNC登陆云主机(在“更多”下拉列表中),或使用相应平台的的远程桌面工具(OSX在美国AppStore中可以下载Microsoft Remote软件)

对于Linux云主机:请使用SSH客户端登陆,windows下推荐使用putty(下载地址:http://the.earth.li/~sgtatham/putty/latest/x86/putty.exe),*inx平台可以使用openSSH。地址为绑定的外网IP,用户名:root,密码为刚才设置的密码。

对于ubuntu云主机:也可以使用镜像默认的用户名:ubuntu,密码:cloudlab210@ustcnic,为了确保安全性,请尽快登陆修改密码。

写在后面

瀚海星云升级后可配置性上升N个档次,但也相对复杂许多,使用难度有所上升。本文旨在快速搭建云服务器,瀚海星云还有许多强大的功能,有待大家探索。

c++11特性之一 模板(1) 模板函数的默认模板参数

c++11特性之一 模板(1) 模板函数的默认模板参数

在c++98中,由于实现的问题,编译器不支持模板函数的类型参数带默认值。这一特性在c++11中得到支持。

为什么引入

请看如下例子:

template<typename T>
void fun(T val = 0){
    cout<<val;
}

int main(){
    fun(1);//编译通过
    fun();//编译失败
}

可以看到,在main函数中实例化fun()函数时,由于编译器无法推导出T的类型,导致便以失败。因此,在c++11中为了解决这类问题,为模板函数的模板参数增加了默认值功能,使编译器在无法推导类型时,也能正常编译。

P.S.编译器仅根据实参推导类型,不会根据形参默认值推导!

如何使用

template<typename T=int>
void fun(T val = 0){
    cout<<val;
}

这样一来,编译器就会在无法推导类型时,使用int类型作为模板实例类型。

模板类型推导规则

优先级由高到低:

  1. 显式指定类型 ,如fun(10);
  2. 推导类型,如fun(3.14); 编译器将推导出float类型。
  3. 模板参数默认值,如fun(); 上例中默认为int。

[译]c++中模板类声明与实现分离的处理方法

查看原文

when instantiating a template, the compiler creates a new class with the given template argument.

当初始化一个模板时,编译器会用给定的参数建立一个新的类

For example

比如:

template<typename T>
struct Foo
{
    T bar;
    void doSomething(T param) {/* do stuff using T */}
};

// somewhere in a .cpp
Foo<int> f;

When reading this line, the compiler will create a new class (let’s call it FooInt), which is equivalent to the following:

当编译到这行时,编译器将创建一个新类(这里权且称为FooInt),它与以下代码等价:

struct FooInt
{
    int bar;
    void doSomething(int param) {/* do stuff using int */}
}

Consequently, the compiler needs to have access to the implementation of the methods, to instantiate them with the template argument (in this case int). If these implementations were not in the header, they wouldn’t be accessible, and therefore the compiler wouldn’t be able to instantiate the template.

因此,编译器需要扫描所有方法的实现,以便能够用模板参数(这里是int)实例化这些类。如果这些实例不在头文件中,他们将无法被访问,因此编译器也无法实例化模板。

A common solution to this is to write the template declaration in a header file, then implement the class in an implementation file (for example .tpp), and include this implementation file at the end of the header.

这个问题的通用解决方法是在头文件中进行模板声明,然后在实例文件中实例化这个类(比如 .tpp),并且将这个实例文件包含在头文件的末尾。

// Foo.h
template <typename T>
struct Foo
{
    void doSomething(T param);
};

#include "Foo.tpp"

// Foo.tpp
template <typename T>
void Foo<T>::doSomething(T param)
{
    //implementation
}

This way, implementation is still separated from declaration, but is accessible to the compiler.

这样一来,实现依然与声明相分离,并且可以编译了。

Another solution is to keep the implementation separated, and explicitly instantiate all the template instances you’ll need:

另一种解决方案是,保持实现分离,并且明确支持所需要的所有模板实例:

// Foo.h

// no implementation
template <typename T> struct Foo { ... };

//----------------------------------------
// Foo.cpp

// implementation of Foo's methods

// explicit instantiations
template class Foo<int>;
template class Foo<float>;

ubuntu下搭建使用pptpd搭建VPN服务器

1.安装pptpd

sudo apt-get install pptpd

2.配置内网ip策略

sudo vim /etc/pptpd.conf

在# TAG: localip后增加2行

localip 192.168.0.1

remoteip 192.168.0.234-238,192.168.0.245

3.配置dns

sudo vim /etc/ppp/pptpd-options

在#ms-dns后增加2行,也可以配置其他dns

ms-dns 8.8.8.8

ms-dns 8.8.4.4

4.配置VPN帐号

sudo vim /etc/ppp/chap-secrets

添加账号、服务器名、密码和IP限制,一个帐号一行,每个参数中间用空格间隔。如:

user * passwd *

5. TCP/IP策略配置

sudo vim /etc/sysctl.conf

插入一行:

net.ipv4.ip_forward=1

保存并退出vim

执行

sudo sysctl –p

提示net.ipv4.ip_forward = 1,说明配置生效

6.开放网络端口

安装iptables(已安装请忽略)

sudo apt-get install iptables

开放1723端口

sudo iptables -I INPUT -p tcp –dport 1723 -j ACCEPT

7.配置NAT网络地址转换

sudo iptables –table nat –append POSTROUTING –out-interface eth0 –jump MASQUERADE

8.重启pptpd

sudo /etc/init.d/procps restart

搭建完毕,客户端可以连接了。

Netbeans7的安装与配置-windows

1. 推荐先安装依赖包,再安装Netbeans安装所需的依赖包

         1.1由于Netbeans是使用JAVA编写的,首先安装JAVA虚拟机(必须)

http://java.com/download

         1.2 对于JavaSE开发,需要安装JDK(选装)

http://www.oracle.com/technetwork/java/javase/downloads/index.html

         1.3 对于JavaEE开发,需要安装Java EE SDK(需要先安装JDK)(选装)

http://www.oracle.com/technetwork/java/javaee/downloads/index.html

注:如果JDK是64位版本,安装JavaEE可能需要手动指定JDK的位置

         1.4 对于Python开发,需要安装Python解释器(选装)

http://www.python.org/getit/

         1.5 对于ROR开发,需要安装Ruby+Rails

https://www.ruby-lang.org/zh_cn/downloads/

然后运行 gem install rails

由于国内访问rubygems非常慢,这里给大家推荐一个rubygems镜像,http://ruby.taobao.org/(淘宝的镜像),访问飞快

也可以直接使用RailsInstaller

http://www.railsinstaller.org

         1.6 对于c++开发,需要安装gcc,g++,make

首先下载cygwin

http://cygwin.com/install.html

运行安装文件。

接受缺省设置,直至转入 “Select Your Internet Connection” 页。在此页中选择最适合的选项。单击“下一步”。

在 “Choose A Download Site” 页中,选择一个方便下载的站点。单击“下一步”。

在 “Select Packages” 页中,选择要下载的软件包。单击 “Devel” 旁边的 “+” 号以展开此开发工具类别。可能需要调整窗口大小,以便能够一次查看更多内容。

单击要下载的每个软件包旁边的 “Skip” 标签以将其选中。至少需要选择 “gcc-core: C compiler”、”gcc-g++: C++ compiler”、”gdb: The GNU Debugger” 和 “make: The GNU version of the ‘make’ utility”。

现在将编译器目录添加到 Path 变量中:

打开“控制面板”(“开始”>“设置”>“控制面板”),然后双击“系统”程序。

选择“高级”标签,然后单击“环境变量”。

在“环境变量”对话框的“系统变量”面板中,选择 “Path” 变量,然后单击“编辑”。

将 cygwin-directorybin 目录的路径添加到 Path 变量中,然后单击“确定”。缺省情况下,cygwin-directory 为 C:cygwin。目录名称之间必须用分号进行分隔。

在“环境变量”和“系统属性”对话框中分别单击“确定”。

2.安装Netbeans

https://netbeans.org/downloads/

选择自己需要的版本,并进行安装。注意:必须先安装jre(见1.1)

         2.1 配置Python

由于Netbeans7不再原生支持Python。我们需要手动安装插件。

在Netbeans中,依次打开 工具->插件->设置->添加

名称随便填,如Developer,URL填写:http://deadlock.netbeans.org/hudson/job/nbms-and-javadoc/lastStableBuild/artifact/nbbuild/nbms/updates.xml.gz

回到”可用插件”标签,搜索Python并安装。

         2.2 配置ROR

由于Netbeans7不再原生支持ROR,oracle将它交给了开源社区,因此需要单独下载插件

http://plugins.netbeans.org/plugin/38549

下载之后解压,在update文件夹中有一个updates.xml文件,记下它的绝对路径。

在Netbeans中,依次打开 工具->插件->设置->添加

名称随便填,如Developer,URL填写解压出的updates.xml的绝对路径(注意转换成URL),比如:file:/C:/updates/updates.xml

回到”可用插件”标签,选择Ruby on Rails并安装。

3.其他插件

         3.1 vim插件

http://sourceforge.jp/projects/sfnet_viex/releases/

在Netbeans中,依次打开 工具->插件->已下载->添加插件,选择解压出来的start-module-myvim.nbm文件,并安装

安装完成后,在工具栏中会有一个VI图标,单击该图标启动vim编辑模式。

二进制加法器的诞生历程

选题(2012年9月8日)。“百团大战”之时没经住诱惑,一不留神报了4个社团,格物致知社(以下简称格物社)就是其中之一。格物社的第一个活动就是团队完成一个制作,题目给定(当然也可以自己选),材料报销(^o^)/~。当时选择制作二进制加法演示器,一是因为这玩意儿比较有意思,二是因为自己没思路(一看就有思路的题目完成起来就没什么意义了)。
电路图设计(9月15日)。设计电路比想象的要困难。一方面是因为大家都没什么思路,二是,提出的少数方案也被否决了。不过正所谓抛砖引玉,刘仲驰的方案虽然有致命缺陷,但是想法很好。所以我就在此基础上进行了改进,得到了最初的设计。后来为了使连线更加方便,在不改变原理的基础上对电路做了一次较大的改动。
1bit原理图
Figure 1最终电路(1位)
购买材料(9月22日—10月13日)。其实这个过程是最纠结的。因为卖家嫌金额过少不给开发票,结果竟然拖了3周。拿到材料,那叫一个激动啊。
破土动工(10月13日)。由于买材料的时候没有买到面包板(定购的话要¥80),导致只能往木板上装元件。少花80元,后果很严重——13日一整天都在当木匠。锯木板,钻孔,挖洞全都学会了-_-//。
元件安装(10月20日—10月27日)。这方面是我最为拿手的。由于连线较多,进展比较缓慢,星期六作得就比较晚。最令人不爽的是:晚上0:15回宿舍,宿管故意不给偶们开门,一直耗到0:40左右。第二次就有经验了,做的太晚就直接不回去了,俺睡实验室,总比锁在外面强。
测试(11月3日)。测试过程中问题不断,还发现了一个大悲剧——买回来的元件是坏的。如果返回去换新的少说也得再耽搁1个星期。思来想去,想出了一个绝妙的替换方案:由于三刀双掷开关只用了2组半,而且坏掉的开关只坏了半组,决定直接把坏掉的半组悬空,只利用好的2.5组。除了元件问题,还有好几处焊接不牢(接触不良)。
完成(11月3日晚22:00)。激动人心的时刻终于到来了。

宣传海报(11月10日)。
总的来说,事情比我想象中的顺利,尤其是电路,它竟然没出问题o(╯□╰)o。当初我用Visco制完图还以为多多少少会有一些问题。集体的智慧是无穷的啊。。。
虽然以前也曾经做过不少小制作,但是团队协作,这却是第一次。当自己黔驴技穷之时,总有人能够提出很好的想法,或许这正是团队的意义所在吧。

高一凡
2012-11-12