没有灵魂的生物可怕又可悲 我的天空没有太阳,总是黑夜,但并不暗,因为有东西代替了太阳。虽然没有太阳那么明亮,但对我来说已经足够。凭借着这份光,我便能把黑夜当成白天。 这是女主人公西本雪穗对自己生活状态的陈述,童年时生活的创伤让这个女孩失去了阳光,直到男主人公桐原亮司的挺身而出,她抓住了这仅有的一点光亮仅仅的不放。书中直到结局才第一次正面描写两个人在同一地点出现,就是这样的两个人,两个人空空的灵魂产生的漩涡把他们紧紧的吸引在一起,影响着周围的一切。 互利共生这是老刑警给他们下的定义,一个做事不择手段,另一个为其心甘情愿,从小学到高中、大学再到各自拥有自己的事业,在其他人的眼中不相交的两条轨迹因为特殊的羁绊越缠越深,他们的灵魂早在那个交织点上离开了他们的肉体,而对方的存在恰好填补了这份空白。雪穗让自己活在别人的羡慕中,她在夺取身边一切可以得道的资源,亮司则在暗中为其扫清障碍,甘愿做强盗甚至杀手。 他们之间的关系到底是不是爱,或者只是另一半的单相思,作者给读者留下了想象的空间 雪穗正沿扶梯上楼,背影犹如白色的幽灵。 她一次都没有回头。 当亮司倒在血泊中的那一刻,她生命中唯一的亮光消失了,她仅存的那点精神支柱也被抽空,站在那里的只是一具剩下一具驱壳而已。 …
当爬虫遇到压缩页面&GBK编码
目标站点使用gzip或者中文编码 网络VIP账号爬虫工具执行时出错,首先使用浏览器访问检查页面样式是否变更,确认代码中样式规则仍然是适用的,后使用同样的方法访问站点首页正常,在访问账号页面时返回数据为乱码,使用curl查看页面同样返回乱码,查看浏览器请求,返回的头部确实有压缩标记,处理方法,需要在得到返回内容后使用对应的解压缩即可,这里给出Gzip的实现,如下: def getPageHTML(url): req = urllib2.Request(url); req.add_header('Accept-Encoding', 'gzip, deflate'); f = urllib2.urlopen(req, timeout=30) html = f.read() # gzip解压缩 if html[:6] == '\x1f\x8b\x08\x00\x00\x00': html = gzip.GzipFile(fileobj=cStringIO.StringIO(html)).read() html = html.decode('gbk') return html …
寻找数轴上相邻两个数之间的最大差值
Via python 中午在网上看到的一道面试题,最近再补Python就试着写了下 问题描述:N个未排序的整数,在线性时间内,求这N个整数在数轴上相邻两个数之间的最大差值 #!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = 'wei' def interval(array): "每次找到一组数中相对小的,距离最近,在所有集合中找到最大的即为结果" gap = [] for index, i in enumerate(array): set = [] for j in array[index + 1:]: set.append(abs(i - j)) if (len(set) != 0): gap.append(min(set)) return max(gap) if __name__ == '__main__': array = [6, 45, 23, 4, 1, -2] print(interval(array)) 时间复杂度为n(n-1)/2 …
Zookeeper (2) --典型应用场景
典型分布式应用场景有:数据发布/订阅、负债均衡、命名服务、分布式协议/通知、集群管理、Master选举、分布式锁、分布式队列等。 数据发布/订阅 主要应用场景如配置中心变更服务地址、数据库切换等,集群中的服务使用Zookeeper中的配置提供服务,解决服务规模大,配置修改频繁的问题。 负载均衡 可以提供一种动态的DNS服务,Zookeeper中维护最新的IP、域名映射关系,客户端根据需要使用Zookeeper急群众的DNS信息来解析域名对应的IP,达到动态路由的目的。 命名服务 命名服务是分布式系统最基础的公共服务之一,在分布式系统中,被命名的尸体通常可以是集群中的机器、提供的服务地址或远程对象等,这些我们都可以同城他们为名称(Name),其中较为常见的就是一些分布式服务框架(如RPC/RMI)中的服务地址列表,通过使用命名服务,客户端应用能够根据指定的名字来获取资源的实体、服务地址提供者的信息等。 分布式协议/通知 分布式协议/通知是协调不同组件协同供作的关键所在,例如分布式事务处理、机器间的相互协调等。引入这样一个协调者,便于将分布式协议的职责从应用中分离出来,从而可以大大减少系统之间的耦合性,而且能够显著提供系统的可扩展性。应用举例: Mysql数据复制总线:Mysql_Replicator 任务注册 任务热备份 记录执行状态 控制台协调 冷备切换 一种通用的分布式系统机器间通信方式 心跳监测 工作进度汇报 系统调度 集群管理 集群管理包括两部分: 集群监控(对集群运行时状态的手机) 集群控制(对集群进行操作与控制) 通常会有如下的需求: 需要知道集群中有多少机器在工作 对集群中的机器运行时状态进行收集(分布式日志收集系统) 对集群中的机器进行上下线操作(云主机管理) Master选举 当需要分布在不同机器上的相互独立的相同系统单元执行一个独立的操作时需要选出一个Master执行相应的操作。 分布式锁 分布式锁是控制分布系统之间同步访问共享资源的一种方式。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要通过一些互斥手段防止彼此之间的干扰,以确保一致性,在这种情况下,就需要使用分布式锁了。 分布式队列 使用Zookeeper可以实现FIFO:先进先出、Barrier:分布式屏障,确保在分布式的架构下系统工作流程的正确性。 …
java类继承中的一些规则
子类初始化的顺序 子类初始化时构造函数优于类中的字段 public class A { private int mSuperX; public A() {· setX(99); } public static void main(String[] args) { B sc = new B(); sc.printX(); } public void setX(int x) { mSuperX = x; } } class B extends A { private int mSubX = 1; public B() { } @Override public void setX(int x) { super.setX(x); mSubX = x; System.out.println("SubX is assigned " + x); } public void printX() { System.out.println("SubX = " + mSubX); } } 输出结果为 SubX is assigned 99 1 构造子类B需要先是调用A的构造函数,由于setX被重写,然后执行了B中的setX方法输出99,然后初始化B中的字段mSubX = 1,完成B对象的初始化。 构造子类时会先调用父类的无参构造方法,即使调用的是子类的有参构造方法 public class A { private int mSuperX; public A() { System.out.println("AAAAA");...…
ZooKeeper(1)--部署
ZooKeeper集群、单机、伪集群部署方式 Zookeeper部署 配置修改 主要修改文件zoo.cfg,修改内容如下: 集群 dataDir=/tmp/zookeeper/ server.1=ip1:2888:3888 server.2=ip2:2888:3888 单机 dataDir=/tmp/zookeeper/ server.1=ip1:2888:3888 伪集群 dataDir=/tmp/zookeeper/ server.1=ip1:2888:3888 server.2=ip1:4888:5888 在每台机器的指定的dataDir下创建myid文件内容为server后的数字 启动 sh zkServer.sh start 测试 使用telnet ip 2181测试,输入stat查看服务状态 停止 sh zkServer.sh stop bin目录下的命令 zkCleanup 清理ZK历史数据(事务日志、快照数据文件) zkCli ZK的建议客户端 zkEnv 设置ZK的环境变量 zkServer ZK服务器的启动、停止和重启脚本 Zookeeper使用的ZAB协议与Paxos算法的区别 两者的设计目标不同,ZAB协议主要用于构建一个高可用的分布式数据主备系统,Paxos用于构建一个分布式的一致性状态机系统。 …