题目

昨天参加腾讯旗下某公司的笔试,其中唯一的算法题是这样的(大致描述):

某数组中有正数也有负数,相邻的一个或多个元素组成一个子集,求所有子集中元素和的最大值。
例如数组[-2, -4, 3, 5, -6, -3, 2, 4], 其子集和最大值为8,对应子集为[3, 5]

思路

第一反应是穷举,即列举所有长度从1到全集的所有子集的和,但是这肯定是效率很低的方法。

当时解题的思路就是分析人工计算时,会以何种方式进行:

  1. 从第一个元素开始往后累加,更新记录过程中的最大和
    2.如果和为负,则抛弃前面的和,从后续元素开始重新累加
    3.直到数组尾,得到最大值

Read More

  最近需要在项目中使用到消息队列,虽然之前有过使用经验,但是因为当时并无具体要求,所以只是在看完RabbitMQ的tutorial之后就自行实现了,并不知道合理性和效率如何。所以在新的项目设计时,打算借鉴一下Openstack中AMQP的使用经验

Nova消息队列

  Openstack云选用AMQP作为其消息技术。AMQP代理,不管是RabbitMQ或者Qpid,位于两个Nova组件之间并允许它们以松耦合的风格通信。更准确地说,Nova组件之间使用RPC通信。但是这个机制是建立在发布/订阅机制之上的,它有以下优势:

  • 解耦client和Server(Client不需要知道Server的具体引用)

  • Client和Server完全异步(Client不需要Server在收到RPC call时同时执行)

  • 随机平衡远程调用(多个Servant时,优先分配空闲者处理调用)

  Nova使用direct, fanout,和topic Exchange。其架构如下图所示

  Nova通过一个封装和解封装消息到调用的类来实现RPC功能,包括请求/响应(rpc.call), 单向(rpc.cast)。每个Nova服务(计算,调度等)在初始化时都实现两个AMQP队列,一个接收带有NODE-TYPE.NODE-ID的routingkey(如 compute.hostname)的消息,另一个接受通用的带有NODE-TYPE的routingkey(如compute)的消息。前者将消息传递给特定的物理节点,例如,终止某个虚拟机实例时使用。这个API在调用是“请求/响应”类型时充当consumer,rpc.cast时仅为publisher。

Read More

接触过Linux开发的人都知道从源代码安装需要执行类似以下的步骤:

1
2
3
./configure
make
make install

目前为止我执行上述命令已经很多次了,但是并不知道它背后的逻辑。在跟进一个还在开发中的项目的时候,上要述步骤并不能完美执行,需要针对作一些修改,是时候挖掘这些咒语背后的操作了。

configure

configure脚本负责在特定的系统上执行build的准备工作。这确认后续的build和install的依赖关系已经满足,找出使用这些依赖需要知道的所有信息。

Linux程序通常是用C编写的,所以我们需要C编译器,configure脚本通常会检查系统有合适的C编译器,它在哪里以及如何调用。

Build

一旦configure完成,我们就可以执行make命令来build软件。它执行一系列在Makefile中定义的操作来编译写好的源代码。

通常下载的源文件tarball中不包含Makefile,取而代之的是一个模板文件Makefile.in,configure脚本产生一个针对你的系统定制的Makefile文件。

Read More

repo用法的基本形式为:

1
repo <COMMAND> <OPTIONS>

可选项在[]中表示,例如许多命令接收一个项目列表作为参数,你可以通过一组名字或者p本地源目录的path来指定项目列表.

1
2
repo sync [<PROJECT0> <PROJECT1> <PROJECTN>]
repo sync [</PATH/TO/PROJECT0> ... </PATH/TO/PROJECTN>]

help

使用help命令可以获得最新的帮助文档,由各子命令来组织.

你也可以查看子命令的帮助

1
repo help <COMMAND>

init

1
$ repo init -u <URL> [<OPTIONS>]

在当前目录安装repo, 将创建一个.repo目录,内含源代码的git仓库和标准android manifest 文件, 同时还有一个manifest.xml文件,指向.repo/manifests/目录中的定manifest.
参数:

-u URL,指定manifest位置

-m 选择仓库中的manifest文件,缺省为default.xml

-b 指定revision, 如一个特定的manifest分支.

repo的其它命令需要在.repo的父目录或者某一子目录中执行

Read More

sqlite3

通过adb shell可以使用sqlite的命令来接入应用创建的sqlite数据库。sqliste3包含很多有用的命令,如.dump可以打印数据库内容,.schema可以打印现在table的sql create声明,而且执行的速度很快。

你可以先连接到目标设备的远程shell再使用sqlite3命令,或者同时指定你要连接的数据库的full path,sqlite3的数据库保存在如下目录:/data/data/<package_name>/databases/

以下是一个例子:

1
2
3
4
5
6
adb -s emulator-5554 shell
# sqlite3 /data/data/com.example.google.rss.rssexample/databases/rssitems.db
SQLite version 3.3.12
Enter ".help" for instructions
.... enter commands, then quit...
sqlite> .exit

进入sqlite3后就可以使用sqlite3的命令了,退出可使用exit或者ctrl+d.

Read More

BASH中的shortcut

  可能很多人不知道,BASH中有许多有用的快捷键,它能使你在shell下的工作更加高效。或者有些人已经使用了部分的快捷键,但是不知道它其实是BASH提供的功能,比如ctrl+c可以发送中断信号,ctrl+l可以实现clear命令的效果。事实上不仅是bash可以用一些快捷键,在一些其它的命令行工具中,也有可能可以使用这些组合键,因为这是由gnu 的 readline库定义的,所以使用了这个库的任何工具都提供这些能力。另外有些CLI虽然没有使用gnu的readline库,但是为了符合使用习惯,也会兼容这些操作。

  某些shortcut,特别是alt开头的,可能会与terminal menu等菜单冲突,此时可以找到terminal的设置菜单将其关闭。

编辑命令

ctrl+a/e 移动光标到行首、尾

ctrl+u/k 删除自光标位置到行首、尾的内容

alt+d
ctrl+w 删除自光标至词尾、首的内容

Read More

activity manager (am)

  在android设备shell中,可以使用am执行一系列的系统操作,如启动一个activity,关闭一个进程,广播一个intent,修改设备屏幕属性等等,命令形式如下:

1
am <command>

  也要可以不进入shell直接执行命令:

1
adb shell am start -a android.intent.action.VIEW

am命令及参数

start [options] <INTENT>

  通过指定Intent启动activity。

  options有:

-D 开启debug

-W 等启动结束

--start-profiler <FILE> 启动profiler,发送结果到FILE

-P <FILE> 类上,但是profiler在app闲置时停止

Read More

adb是一个能与android模拟器/设备交互的非常有用的工具,它由以下三部分组成。

  • Client 用户界面,运行于开发机上,ADT,DDSM也会创建adb client
  • Server 后台进程,同时与用户与android设备连接
  • daemon 运行于设备/模拟器上的后台进程

  此命令位于<sdk>/platform-tools下。

  当你使用adb client时,它首先尝试与server进程连接,如果没有则启动server,server使用5037端口来监听来自所有client的连接。随便server扫描所有5555-5585之间的奇数端口来发现与开发机连接的设备/模拟器。每个android设备/模拟器要求开发一对连续的端口,其中偶数用于console,奇数用于adb,例如

1
2
3
4
Emulator 1, console: 5554
Emulator 1, adb: 5555
Emulator 2, console: 5556
Emulator 2, adb: 5557

  因为有Server的存在,你可以从任意CLI中连入任何与开发机相连的android设备。

Read More

  本方介绍如何在Debian/Ubuntu系统中快速地使用apt工具安装、卸载和查询软件包。

什么是apt-cache

  这个命对搜索软件包缓存非常有用,简单地说,它就是用来搜索和收集软件包信息,查找可安装包的。 下面介绍5个基本命令

pkgnames-查询安装包名

  如果要显示所有可安装包信息,可以用以下命令

1
$ sudo apt-cache pkgnames
1
2
3
4
5
6
7
8
9
10
11
account-plugin-yahoojp
ceph-fuse
dvd+rw-tools
e3
gnome-commander-data
grub-gfxpayload-lists
gweled
libannotation-indexer-java-doc
libboost-timer-dev
libdune-istl-dev
……

Read More

配置vnc server实在是一个特别诡异的事,我在不同的ubuntu机器上配置服务时,总是遇到千奇百怪的问题,大部分情况下比较顺利,将~/.vnc/xstartup最后一句x-window-manager&替换为gnome-session&就能顺利地出现桌面,而有些则不行,需要改为gnome-session --session=ubuntu-2d&……

问题

而今天遇到的ubuntu 14.04,则死活不行,用realvnc viewer连接之后,只有灰灰的一个背景,没有桌面,没有terminal。

查阅了很多博文,有说需要安装gnome-session-fallback的,有说需要安装gdm的,也有用kde的,除了kde我没有尝试,另外两种验证无效,依然只有一个灰色背景。

最后用xfce4桌面解决,选择些方案一是因为xfce相对较小,gnome-session死活不行的情况下,再将一个kde未免太过兴师动众,xfce我使用过一段时间,是一个相当轻量级的GUI环境,清爽易用,功能一点不含糊。决定之后,一次尝试即成功。

Read More