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>;

NOIP(二试)记

二试相比于一试 试题难度分配就较为合理了。
既没有特别水的题,也没有果断放弃的题。
第一题(factor)兵二的高三党应该都做出来了吧,打印一个杨辉三角,做个模取幂。后者我讲麦森数的时候讲过。中等的题就变水题了。
第二题(qb)果断二分,不过边界的判断还是拿不准;担心程序会崩溃,过70%应该没问题。
第三题(bus)貌似贪心,实则dp。我就贪心,然后杯具。不过10%应该没问题。

NOIP (一试)记

真让人头大。早上7点起床,无奈,路途遥远。
考下来感觉还不错。第一题果断AC。二题嘛,还有待考虑,不过目前还没想出什么漏洞。
不过 ,竟然在离考试还有60min的时候改题。果断BFS改DFS,可惜没时间调试了。最后只好放“-1”,算是能骗到一个点吧。
今天前两道题目过于简单,而且既没有DP也没有图论。明天恐怕就要难喽。

物理竞赛实验辅导 板书、照片、资料整理集

通过两天的辛苦努力,集子终于出炉了。这本集子是用word2010编辑的,省了不少时间。 用了些诸如“自动目录”“封面模板”之类的东西。
整体上感觉还是很不错的。

在此特别感谢陈诚提供部分照片。

电子版已经发到班级论坛上了 有需要的同学可以作参考

face

帖子地址

希望大家能更上一层楼。