月度归档:2013年08月

Android 将取代 Linux 成为面向物联网的开放平台

美国 Web 和移动技术专家、手机群聊服务 GroupMe 事业发展主管史蒂夫•切尼 (Steve Cheney) 近日撰文,对 iOS 和 Android 的未来前景进行了展望。

我们已经进入了一个新的时代。在这个时代里,iOS 和 Android 的影响力已经渗透到移动领域以外。就整个生态系统的发展而言,有许多事情正在发生。移动领域中的进步和投资正在推动所有硬件和软件聚合产品前进的步伐,而硬件的创新活动也正在凭借这种顺风而不断加速。以下是有关这两个占据主导地位的平台未来前景的一些想法。

1、据市场研究公司 IDC 公布的最新报告显示,Android 操作系统在全球移动市场上所占份额正在大幅增长。但据美国市场研究公司 Asymco 的报告显示,Android 可能已经见顶,目前正处于下滑趋势中

那么,当传闻中的低价“iPhone 5C”智能手机上市时,将会有什么情况发生呢?到那时,全球形势可能发生重大的变动。

2、与移动战争相比,平台战争更加激烈。在物联网和电视(Chromecast)等非移动市场上,Android 正在取得重大的腾飞。到目前为止,Linux 一直都是这个领域中占据主导地位的操作系统,但现在 Android 正在争取到原本会基于 Linux 系统运行的一些嵌入式设计产品。

Android 正在有效地解除与无线运营商之间的耦合关系,将自己的影响力扩展到非移动市场上;与此同时,Android 还拥有丰富的相关工具和现有的开发者生态系统,这很可能将巩固其作为下个十年中具有决定性优势的开源操作系统的地位。对谷歌来说,这不仅是一种优势,同时也会带来意外后果。

3、对于非移动(插入式)设备来说,“Android + ARM”是一种“足够好”的模式,将在嵌入式操作系统的全球市场上赢得多数份额。英特热将无法渗透这个市场,除非设备需要很高的功率(比如说游戏平台或机顶盒等)。

其原因在于,Chromecas 的整体物料清单价格仅为 20 美元,而英特尔无法一边提供足够低的价格来与其展开竞争,同时还能保持较高的利润率。与此同时,苹果将继续利用垂直整合的非移动设备(如传闻中的 iTV 和 iWatch 等)来谋取利润。

4、对于(电池供电的)移动设备来说,情况则完全不同。移动计算不仅整体上的表现足够好,而且在能耗方面的表现也足够好。来自于苹果的硬件和软件整合产品很可能将在性能表现这一方面保持优势,这些产品将不断优化多核芯片以便取得更好的能耗表现,同时还将对其软件进行升级,最近苹果发布的 iOS 7 操作系统即可为证。

谁都不知道苹果是否在任何给定的时间段里都比竞争对手领先 6 个月或 18 个月,但预计该公司将拥有这一范围内的领先优势是合理的。较低的能耗需求将推动产品设计的聚合。

5、有传闻称,三星将转向使用 ARM 芯片,原因是三星认为自己的片上系统(SoC)需要与苹果的 A6/A7 和高通 Krait(均使用定制设计的核心)展开竞争。除了苹果和三星(可能会在不久以后实现 100% 的垂直整合)以外,高通也将使用定制设计的核心来持续改善能耗表现,从而赢得剩余的高端 OEM(原始设备制造商)。

而与此同时,联发科技 (Mediatek) 则将占据中低端市场。这就意味着,博通和英伟达等公司的空间有限,而英特尔在这一领域中则更是毫无机会可言。

6、在 Android 平台上,碎片化 (Fragmentation) 将继续对 Android 造成不利影响,但现在将会上升至新的层面,开始对生态系统造成影响。明天的苹果将不再只是与硬件/软件整合产品有关,而是与整个生态系统有关。软件是事先开发的,而硬件则是随后设计定制的,开发者拥有你的应用程序接口(API),所有这些都可协同运作。

从某种程度上来说,谷歌将可利用其控制下的产品来做到这一点,但非一致性将开始在谷歌并未开发的智能手机网络服务上对 Android 造成越来越大的损害。

7、iOS 操作系统中用于本地网络的新应用程序接口将变得很大——开始时使用案例将集中在美国市场上(随后是欧洲和日本市场),这将巩固苹果在美国高端市场上所占据的地位。当 iOS 7 发布时,所有应用程序接口将可向后兼容两年时间(也就是可兼容 iPhone 4S 及以后产品)。

这意味着,95% 的苹果用户将可彼此共享文件,并使用蓝牙/iBeacon 进行支付活动,而 Android 则将在服务层面上进入非一致性“战争”的第二回合。

在最新版本的 Android 操作系统推出一年以后,仅有 30% 的用户会升级(或能够升级)至新版本。开发者不会在 Android 应用中为 BTE 和本地 WiFi 共享开发网络/支付服务,原因是未来 18 个月时间里仅有一小部分 Android 手机将可支持新版本。

在 Google Play 应用商店中有一些二级市场应用,但其兼容性相当差。Android 4.3 添加了低功耗蓝牙支持功能,但由于仅有 30% 设备将在一年时间里可运行新版本的操作系统,因此其被用户采用的时间将比 iOS 慢 12 到 24 个月。

8、近场通信(NFC)已死,但令人感兴趣的并非这一方面,而是苹果如何才能利用蓝牙 4.0 和 WiFi 来复制近场通信功能。在支持这种功能的同时,还需要向后兼容至 iPhone 4S。蓝牙一直存在,但到目前为止还没有什么价值。

蓝牙 LE(也称为蓝牙 Smart)将改变所有事情。连接、配对和设备管理等将在 100% 的时间里持续运作,而蓝牙将成为行业领先的技术。无线广播将在我们周围无处不在,带来令人难以置信的移动使用体验。传闻中的苹果 iWatch 也将在发布以后与 iPhone 协同运作。

9、非一致性将在位置共享和支付应用中对 Android 和谷歌造成损害。当只有你一个人受到影响时,碎片问题并不重要;但当你的 Android 手机无法与其他手机进行通信,或无法在 POS 终端进行通信时,就很难为此找到借口。在 Android 平台上,蓝牙 LE 正在发展中,但非一致性对开发者来说将变成一个“杀手”,这意味着先进的本地发现/无线应用很少会支持 Android 系统。

这种事情已经在发生,举例来说,Tile 已经从 50 万名支持者那里筹集了 300 万美元左右的资金,而且不会支持 Android 系统。

10、对于本地商务来说,未来两年时间将是最令人激动的时刻之一。共享和网络服务以及原生蓝牙应用程序接口最终将激活一个生态系统,带来新的使用案例,催生销售点商务。

举例来说,蓝牙将可在用户使用手机进行柜台支付时提供支持,或者可在消费者走入商店时为发送至用户 iPhone 上的优惠券提供支持。Suare 已经推出了“Square 钱包”(Square Wallet) 产品,成为了这一领域中的先驱;而现在 iOS 正在为整个生态系统制定标准。这将有助于推动在线到离线商务活动的发展。

在这个领域中,Android 将落后 12 到 24 个月时间。这意味着,Android 和 iOS 平台上的本地商务活动将是电子商务的真实写照(Android 平板电脑/手机用户的购买量不及 iOS 用户)。如果这种情况在高端市场上发生,那么从智能手机销售量来看,苹果仍将在美国市场上占据优势。从全球范围来看,想要判断这种使用案例将如何发展则比较困难一些。

整体而言,很明显低端和高端市场正在分层,各个地区之间也正呈现出这种趋势。由于嵌入式平台目前几乎仅受移动技术影响的缘故,所有事情都正在发生变化。这提供了更多的证据,表明移动平台很可能不会追随以往计算平台的发展模式。

本文来自物联网智库 编辑张超

 

http://tech2ipo.com/61246

开源无线连网硬件:Flutter

Flutter——两片电路板,或者再加一根天线,就打造出一个很强力的无线连网组件,信号可覆盖一公里距离。对于想要 DIY 可连网、可与手机交互的智能设备的同学们,这款产品能够帮助节省很多精力和时间。该开源组件如图。

你可以使用 Flutter 将灯泡、小汽车、空调都变作可以用手机遥控的智能产品。

 

该产品正在筹资,捐资人资助该项目 20 美元,便可获得一件产品作为回报。

标签: flutter

直接拿来用!10段超有用的Git命令行代码

 

摘要:本文分享了10条非常有用且先进的Git命令行语句,无论是运用在团队环境或是在私人项目中,你都可以直接来拿用。

本文分享了10条非常有用且先进的Git命令行语句,无论是运用在团队环境或是在私人项目中,你都可以直接来拿用。

1.  在最后提交中更改Export(Export changes done in last commit 

这个命令通常会使用定期发送已更改的项目,以方便其他人审查/集成。

 

1
git archive -o ../updated.zip HEAD $(git diff --name-only HEAD^)

 

2.  在两次提交之间更改Export文件(Export changed files between two commits)

同样地,如果你需要在两次提交之间更改文件,可以选择以下这段代码。

 

1
git archive -o ../latest.zip NEW_COMMIT_ID_HERE $(git diff --name-only OLD_COMMIT_ID_HERE NEW_COMMIT_ID_HERE)

3. 克隆一个特定的远程分支(Clone a specific remote branch) 

 

如果你想从远程资源库中克隆一个特定的分支,而无需克隆整个资源库分支,那么下面的这段代码将对你有用。
 

 

 

1
2
3
git init 
git remote add -t BRANCH_NAME_HERE -f origin REMOTE_REPO_URL_PATH_HERE 
git checkout BRANCH_NAME_HERE

4.  从不相关的本地资源库中应用补丁(Apply patch from Unrelated local repository) 

这里有个快捷方式可帮助你实现。

 

1
2
view plaincopy to clipboardprint?
git --git-dir=PATH_TO_OTHER_REPOSITORY_HERE/.git format-patch -k -1 --stdout COMMIT_HASH_ID_HERE| git am -3 -k

5.  检查分支是否在其它分支中遭到更改(Check if your Branch changes are part of Other branch)

 

cherry这个命令,能够检查你的分支在其他分支中是否被更改。它会在当前的分支上显示变化,并注明+或-标识符。+代表不存在,-表示在现有的分支中存在。

 

1
2
3
4
view plaincopy to clipboardprint?
git cherry -v OTHER_BRANCH_NAME_HERE
#For example: to check with master branch 
git cherry -v master  <br>

 

6. 启动一个无历史记录的新分支( Start a new Branch with No History)

有时,你想启动一个新的分支,但并不想运行漫长的历史记录,例如,你想将代码放置在一个公共的域中(开源),但又不想共享历史。

 

1
git checkout --orphan NEW_BRANCH_NAME_HERE

7. 从其他分支签出文件但无需切换分支( Checkout File from Other Branch without Switching Branches 

这里将教你如何获取想要的文件。

 

1
git checkout BRANCH_NAME_HERE -- PATH_TO_FILE_IN_BRANCH_HERE

 

8. 忽略追踪文件中的更改( Ignore Changes in a Tracked File )

如果你是在某个团队中工作,他们都在使用同一个分支,也许你会频繁使用提取/合并(fetch/merge),但这有时需要重置特定的配置文件,这就意味着在每次合并后你必须去做更改。现在,使用这个命令,你可以要求Git忽略更改特定文件。

 

1
git update-index --assume-unchanged PATH_TO_FILE_HERE

9. 检查已提交部分是否在发布的版本中遭到更改(Check if committed changes are part of a release)
 

name-rev这个命令可以告诉你已提交到最新版本的某个位置。使用这个代码可帮助你检查,提交的部分是否在已发布版本中遭到更改。

1
git name-rev --name-only COMMIT_HASH_HERE

10. 用复位替代合并(Pull with rebase instead of merge )

当某项特性分支被合并到主流中,此时该分支合并会在Git中以合并提交来进行记录。但是当团队中多个成员在同一个分支上工作时,常规的合并会导致多个合并消息在日志中呈现混乱状态。因此,你可以使用复位(rebase)来保持历史清晰,清除无用的合并消息。

 

1
git pull --rebase

此外,你还可以通过配置一个特定的分支来复位。
 

 

1
git config branch.BRANCH_NAME_HERE.rebase true

英文出自: Webdeveloperplus

 

http://www.csdn.net/article/2013-08-22/2816665-10-useful-advanced-git-commands

近期十大优秀jQuery插件推荐

摘要:当今,设计领域竞争越来越激烈,唯有做出最优秀的产品才能在该领域独树一帜。而jQuery插件为设计和开发提供了强大的支撑力。本文将推荐从jQuery网站的Plugin频道中推选出的近期十款优秀jQuery插件,以便开发者借鉴。

当有限的开发知识限制了设计进展,你无法为自己插上创新的翅膀时,jQuery可以扩展你的视野。本文将推荐从jQuery网站的Plugin频道中推选出的近期十款优秀jQuery插件。

1. jQuery URL Shortener

正如名字所清晰表达的那样,该jQuery插件利用Google URL shortener API可将URL转化成短链接。

 

下载 | 演示

2. Bootstrap Tokenfield

Bootstrap Tokenfield是一款针对输入框的高级标签插件,可获取键盘输入焦点,支持复制—粘贴。

 

下载 演示

3. Retinize

Retinize可将图片质量进行提升,以在Retina显示器上完美显示。在像素艺术中,当你不希望存储高质量版本的图片时,该jQuery插件显得特别有用。

 

下载 | 演示

4. jQuery Scrollbox

它是一款简单、轻量级的jQuery插件。利用它,用户可以像旋转木马、传统的滚动形式那样滚动展示列表。

 

下载 | 演示

5. jQuery Scanner Detection

这是一款小插件。可对用户所使用扫描仪(barcode, QR Code……)进行探测、跟踪,并给出特定的反馈。

 

下载 | 演示

6. jQuery finderSelect

该jQuery插件可激活文件管理器,高亮显示被选择的元素,支持Ctrl+单击、Command+单击、Ctrl+拖动、Command+拖动及Shift+单击操作。

 

下载 演示

7. Yet Another DataTables Column Filter (Yadcf)

利用Yadcf,用户可轻松地针对表格每列添加过滤器组件。该插件基于DataTables jQuery插件开发而成。

 

下载 | 演示

8. jQuery noInput

该插件用来显示输入字段预期值的提示信息,与HTML5的placeholder属性相似。

 

下载 | 演示

9. HeapBox

无论你是Web设计师,还是Web开发工程师,一定了解设置本地HTML表单外观及功能的艰辛。Heapbox现在可代替selectbox,用JavaScript编写,效果很不错。现在它只针对selectbox,还无法处理textbox、checkbox等。Heapbox基于jQuery设计,却改变了大部分人写JavaScript的方式。

 

下载 | 演示

10. QUAIL

该插件用来查找影响页面美观、亲和力的内容。它可查找现页面中的设计问题,如图片缺少替换文字等。

 

下载 | 演示

原文来自:The Design Blitz

http://www.csdn.net/article/2013-08-15/2816585

我从其他Shell脚本中学到了什么?

摘要:作者Fizer Khan是一位Shell脚本迷,他对有关Shell脚本新奇有趣的东西是如此的痴迷。本文他分享了八大Shell脚本技巧,希望你会喜欢,这些脚本可以直接拿来使用!

作者Fizer Khan是一位Shell脚本迷,他对有关Shell脚本新奇有趣的东西是如此的痴迷。最近他遇到了authy-ssh脚本,为了缓解ssh服务器双重认证问题,他学到了许多有用且很酷的东西。对此,他想分享给大家。

一、Colors your echo 

大多数情况下,你希望输出echo Color,比如绿色代表成功,红色代表失败,黄色代表警告。

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
NORMAL=$(tput sgr0)
GREEN=$(tput setaf 2; tput bold)
YELLOW=$(tput setaf 3)
RED=$(tput setaf 1)
function red() {
    echo -e "$RED$*$NORMAL"
}
function green() {
    echo -e "$GREEN$*$NORMAL"
}
function yellow() {
    echo -e "$YELLOW$*$NORMAL"
}
# To print success
green "Task has been completed"
# To print error
red "The configuration file does not exist"
# To print warning
yellow "You have to use higher version."

这里使用tput来设置颜色、文本设置并重置到正常颜色。想更多了解tput,请参阅prompt-color-using-tput
 

 

二、To print debug information (打印调试信息)

打印调试信息只需调试设置flag。

 

1
2
3
4
5
6
7
8
9
function debug() {
    if [[ $DEBUG ]]
    then
        echo ">>> $*"
    fi
}
# For any debug message
debug "Trying to find config file"

 

某些极客还会提供在线调试功能:
 

 

1
2
3
# From cool geeks at hacker news
function debug() { ((DEBUG)) && echo ">>> $*"; }
function debug() { [ "$DEBUG" ] && echo ">>> $*"; }

三、To check specific executable exists or not (检查特定可执行的文件是否存在) 

1
2
3
4
5
6
7
8
9
10
11
12
OK=0
FAIL=1
function require_curl() {
    which curl &>/dev/null
    if [ $? -eq 0 ]
    then
      return $OK
    fi
    return $FAIL
}

这里使用which来命令查找可执行的curl 路径。如果成功,那么可执行的文件存在,反之则不存在。将&>/dev/null设置在输出流中,错误流会显示to /dev/null (这就意味着在控制板上没有任何东西可打印)。
 

 

 

有些极客会建议直接通过返回which来返回代码。

 

1
2
3
# From cool geeks at hacker news
function require_curl() { which "curl" &>/dev/null; }
function require_curl() { which -s "curl"; }

四、To print usage of scripts  (打印使用的脚本) 

当我开始编写shell 脚本,我会用echo来命令打印已使用的脚本。当有大量的文本在使用时, echo命令会变得凌乱,那么可以利用cat来设置命令。

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
cat << EOF
Usage: myscript <command> <arguments>
VERSION: 1.0
Available Commands
    install - Install package
    uninstall - Uninstall package
    update - Update package
    list - List packages
EOF

这里的<<被称为<<here document,字符串在两个EOF中。 

五、User configured value vs Default value (用户配置值VS 默认值)

有时,如果用户没有设置值,那么会使用默认值。

 

1
URL=${URL:-http://localhost:8080}

检查URL环境变量。如果不存在,可指定为localhost。
 

六、To check the length of the string 检查字符串长度

 

1
2
3
4
5
if [ ${#authy_api_key} != 32 ]
then
  red "you have entered a wrong API key"
  return $FAIL
fi

利用 ${#VARIABLE_NAME} 定义变量值的长度。

七、To read inputs with timeout (读取输入超时)
 

 

1
2
3
4
5
6
7
8
READ_TIMEOUT=60
read -t "$READ_TIMEOUT" input
# if you do not want quotes, then escape it
input=$(sed "s/[;\`\"\$\' ]//g" <<< $input)
# For reading number, then you can escape other characters
input=$(sed 's/[^0-9]*//g' <<< $input)

八、To get directory name and file name  (获取目录名和文件名) 

 

1
2
3
4
5
6
7
8
# To find base directory
APP_ROOT=`dirname "$0"`
# To find the file name
filename=`basename "$filepath"`
# To find the file name without extension
filename=`basename "$filepath" .html`

英文出自:FizerKhan

趣文:为什么软件开发周期通常是预期的两三倍?

【感谢@袁欣_Jason 的热心翻译。如果其他朋友也有不错的原创或译文,可以尝试推荐给伯乐在线。】

导读:有国外开发者在 Quora 提了这个问题:“为什么软件开发周期通常是预期的两三倍?” 并补充问:“这是开发人员的错误? 是管理失误? 是因为做事方法不对, 或者说缺乏好的方法?还是说这就是软件开发流程的特点?” Michael Wolfe 在2012年1月28日给的回复,非常经典,截至我们发布时已有8016个赞。以下是译文。

让我们先沿着海岸线,从旧金山(SF)走路去洛杉矶(LA),去拜访我们住在Newport Beach的朋友,我拿出地图在上面画出了行进路线。

全程大约有400英里,如果我们每天走10小时每小时4公里的话,只用10天就可以到达目的地。立刻打电话给我们的朋友预定下周六的晚餐,告诉他们下周六晚上六点我们一定会准时出现,朋友们已经等不及了!

第二天清晨,我们带着准备冒险的兴奋起床,背起行囊,拿出地图,准备计划我们冒险的第一天,看一眼地图,噢,不!

哇,海岸线上有这么多迂回曲折的线路。每天行进40英里的话,10天后只能勉强到达Half Moon Bay(半月湾?)。这趟旅行至少有500英里,而不是400。赶紧打电话给我们的朋友,将晚餐顺延至下下周周二。人还是应该现实一点。朋友们有点失望,不过仍然盼望见到我们,况且花 12 天从 SF 到 LA 也不赖。

把不开心的事丢到一边,准备出发。两小时过后,我们才刚刚走出动物园。出了什么事?我们低头看了一下脚下的路:

天哪,这样走路也太慢了!有沙子、海水、阶梯、溪流,还有海边愤怒的海狮!这样我们只能按每小时2公里的速度前进,只有我们预估一般的速度。要么我们现在每天走20小时,要么再把晚餐推迟一个星期。好吧,让我们各退一步:每天走12个小时,把晚餐安排到下下周的周末。只好再打电话给朋友告诉他们这个情况。朋友们有些不高兴,但还是表示可以,到时候见。

在辛苦走了12小时后,我们准备在 Moss Beach 扎营休息。靠,要把帐篷在风中立起来根本不可能。直到半夜才开始休息。不过没什么大不了:明天在加快点速度就可以了。

第二天早上睡过头了,早上10点才醒,起来浑身酸痛精疲力尽。艹,今天没法走12个小时了,先走10个小时,明天可以走14个小时。收拾东西出发。

再缓慢行进了几个小时之后,我发现伙伴脚有点跛。妈的,是水泡。必须现在解决它,在这些问题开始减慢我们的速度前,必须将它们扼杀在萌芽状态。我慢跑了45分钟到达内陆3英里远的Pescadero,买了一些创可贴再快速跑回去给朋友包扎了一下。我快累坏了,太阳也快下山了,又浪费了一天的时间。到我们准备休息前今天只走了6英里。但是我们确实需要补充一下供给。一切都很好,明天我们就能赶上。

第二天醒来,扎紧脚上的绷带准备出发。转角之后突然发现,靠!这是个啥?

你妹的地图上怎么没标出它!现在我们只能往内陆走3英里,绕过这些被联邦政府用栅栏保护起来的区域,中途迷路了两次,在中午前才好不容易又回到了海岸线。今天的时间过了一大半,而我们才前进了差不多1英里。好吧,不过我们不会再打电话给朋友推迟了,今天我们会一直走到午夜试着赶上进度。

晚上在大雾里断断续续地睡了一夜。一大早被我的伙伴叫醒,他一阵阵的头疼,还有点发烧,我问他能不能坚持一下。“你在想什么呢,混蛋,我已经连续三天在这么冷的雾中赶路,没有休息过了。“好吧,今天看来只能黄了,只能在原地好好恢复了。现在我们已经有经验了,今天好好休息明天再走14个小时,还有几天的时间,我们一定能够做到!

第二天我们昏昏沉沉地起来了。我看了一眼随身的地图:

天啊!我们已经走了10天旅程里的第5天还没有离开海湾区域!太荒唐了!我们要重新估计一下准确的时间再打给朋友,搞不好会被骂,但至少得找一个现实一点的目标。

同伴说,我们在四天里走了40英里,这趟旅程至少又600英里,那就至少要60天,安全一点的说法说不定要70天,“没门…是,以前我是没走路从SF去过LA,但肯定不会要70天的时间,如果告诉他们我们要到复活节才能到,那要被他们笑死的“,我说。

我接着说,“如果你能保证每天走16个小时,我们就能把落下的时间补回来!我知道很困难,但现在是最关键的时刻,别抱怨了!”伙伴对我吼道 “一开始又不是我告诉别人下周日我们就能到的!因为你犯的这个错差点要我的命!”

两个人就这样不说话了。我还是没打出电话,等我的伙伴明天冷静一点我再决定,我也愿意做一些更合理的承诺。

第二天上午,我们一直待在各自的帐篷中直到一场暴风雨袭来。我们赶紧收拾好东西直到10点才摆脱危险。浑身酸痛,又长了好多新水泡。之前发生的事谁也没提,直到发现我那愚蠢的伙伴把水壶落下了,又被我指责了一顿,我们不得不再花30分钟回去取它。

我心里记得我们的厕纸已经快用完了,下次到一个小镇的时候应该囤一点。在我们又转个弯后,才发现一条湍急的河流挡住了去路,这时我突然感到肚子一阵难受……

http://blog.jobbole.com/45756/

分布式系统事务原子性的非阻塞实现

摘要:分布式系统中,常见的多对象更新操作实现却比较困难,如果将这些操作看作一个事务,实现事务的原子性就成了关键所在。通常情况下原子性都是通过锁实现的,作者提供了一种非锁的方式实现——NBTA。

本文作者Peter Bailis是美国Berkeley的研究生,主要研究方向是分布式系统与数据库。作者目前主要的研究内容是分布式数据的一致性,尤其是如何调和ACID特性和分布式一致性模型,以及如何在理论和实际中更好的理解最终一致性。

作者将分布式系统中的事务定义为针对多个服务器的同时操作,本文主要讨论了分布式系统事务的原子性的一种实现算法。通常情况下原子性都是通过锁实现的,这个算法并没有使用锁,原理很简单,采用了简单的多版本控制和存储一些额外的元数据,虽然作者只是在实验环境中实现了这个算法,并没有投入到实际生产中,但是作者思考问题的方式值得参考。

分布式系统事务原子性

在现实的分布式系统中,多对象更新的操作很常见,但是实现起来却并不简单。同时更新两个或多个对象时,对于这些对象的其他读取者,原子性很重要:你的更新要么全部可见,要么全部不可见。

这里所说的原子性和线性一致并不是一个概念,数据一致性在Gilbert和Lynch证明CAP原理时被提到过,后来通常被称为原子一致性。而线性一致化关注实时的顺序操作,是一个单对象的问题。这里的“原子性”源于数据库环境(ACID中的“A”),涉及对多个对象的执行和查询操作。为了避免混淆,我们称这个原子性为“事务原子性”。

许多场景中都会遇到这种问题,从社交网络图(例如Facebook的TAO系统,双向的朋友关系被保存在两个单向的指针中)到类似计数器(例如Twitter的Rainbird分层聚合器)和二级索引的分布式数据结构。本文中,我将假设我们的工作都是高可用的事务,原子性的多对象更新,或事务的原子性,是其首要特性。

现有的技术

多对象更新的事务操作通常采用以下三种策略之一:

 

 

使用锁来同时更新多个项目。执行更新操作时加写锁,执行读操作时加读锁,就可以保证事务的原子性。但是在分布式环境中,局部故障和网络延迟都意味着锁操作可能会导致Bad Time。

具体来讲,锁操作有可能会导致一些怪异的结果。如果客户端在持有锁时宕机,服务器本应该最终撤销这个锁。这需要某种形式的故障检测或超时(在异步网络中会导致一些尴尬的情况)以及在撤销锁前同时撤销以前的操作。但是在执行更新操作时阻塞读操作显然是不合理的,反之亦然。如果我们追求高可用性,锁不是一个值得考虑的方案。

 

实体组

 

将想要同时更新的对象放在一起。这种策略通常称为“实体组”,可以让事务性原子更简单:在一台机器上加锁很快,而且不会遇到分布式锁的局部故障和网络延迟的问题。不幸的是,这种解决方案会影响数据布局和分布,而且不适用于难于分割的数据。

 

Fuck-it模式

使用“fuck-it”模式,不进行任何并发控制的情况下更新所有的对象,并保持事务的原子性。这个策略是很常见的:扩展性良好,适用于任何系统,但是直到系统达到稳定状态后,才会提供原子性保证(例如聚合,或者说最终一致性)。

NBTA

 

在这篇文章中,作者会介绍一种简单的替代方案,作者称其为事务原子性的非阻塞实现,简称为NBTA(Non-blocking transactional atomicity),使用多版本和一些额外的元数据在不使用锁的情况下,保证事务的原子性。具体来说,这种方案不会由于过程错误而阻塞读取和写入操作。关键的想法是避免执行局部更新,并且利用额外的元数据代替副本间的同步。

NBTA示例

可以用这个简单的场景来说明NBTA:有两个服务器,server for x上存储x,server for y上存储y,初值都是0。假设有两个客户端,Client1要执行写入操作,使x=1,y=1,Client2要同时读取x和y,关于副本的问题稍后会讨论。作者将Client1要执行的写入操作称为一个事务,而这个事务的操作对象server for x和server for y被称为事务兄弟。

good和pending

将每台服务器的存储分为两中状态:good和pending。要保证同属于一个事务的写入操作,如果其中一个操作被存储为good状态,这个事务的其它写入操作要么被存储为good,要么被存储为pending。比如在上面所说的场景中,如果x=1在server for x上被存储为good,那么必须保证y=1在server for y被存储为good或pending。

首先,各服务器会收到到写操作请求保存为pending状态,然后一旦服务器知晓(可能是异步的)某个写入操作相关的事务兄弟都已经将操作请求保存为pending状态,这个服务器就会更新这个操作为good状态。客户端进行两轮通信,就可以使服务器得到写操作已经稳定的信息:第一轮通信中,server for x和server for y会将从Client1收到请求保存为pending状态,并将确认回复给Client1,Client1收到确认后会进行第二轮通信,通知server for x和server for y写操作已达到稳定状态。

竞争危害和指针

理想的状态是,只读取good状态的数据,就可以保证事务的原子性。但是存在一种竞争条件的情况:比如server for x已经更新x=1,并保存为good状态,但在其事务兄弟server for y中相关操作y=1依旧是pending状态,Client2如果只读取good状态的数据,得到的结果将是x=1,y=0,破坏了事务的原子性。我们希望这种情况下,第二个服务器能够自动调用pending状态的数据以供读取。

为了解决这个问题,可以在每个写入操作中加入一些额外的信息:事务兄弟的列表以及一个时间戳。这个时间戳是客户端进行多值更新前,为每个写操作唯一生成的,比如,可以是客户端ID+本地时间或一个随机数。这样的话,当一个客户端读取good状态的数据时,还会读到时间戳和具有相同时间戳的事务兄弟的列表。客户端也会在发送读取请求附带一个时间戳,服务器会根据时间戳从pending或good中取出数据交付给客户端。如果客户端的请求中没有附带时间戳,服务器会将good中时间戳最高的值交付给客户端。

优化

以下是NBTA算法的一些优化:

pending和good的规模

如果用在good中只保存最近的写入操作,那么一个写入操作的兄弟事务可能会被覆盖,为了避免这种情况的发生,服务器会在good中将历史数据保留一定的时间。

更快的写操作

有一种方案可以替代客户端的第二轮通信操作。服务器一旦将写操作存入pending中,就直接互相通信,可使用类似于PAXOS的算法实现。此外,客户端也可以异步发起第二轮通信。然而,为了确保客户端在这些情况下读取写操作,它们要保留元数据直到每个写操作都被存为good状态。

副本

目前为止的讨论都基于每个数据项只存储在一个服务器上。算法实现的前提条件是每个服务器的强一致性。服务器间的副本有两种情况:如果所有的客户端都只能访问一部分服务器,那么客户端只需要对这些对应的服务器集合进行更新,这组服务器都存有数据的副本。如果客户端可以访问任何服务器,那么需要花费较长的时间去同步数据。

读/写事务

以上讨论的算法同样适用于读/写操作。对于ANSI标准的可重复读模型,主要的问题是保证从一个事务的原子组中读取。可以在事务执行前,事先声明所有的读取操作或者通过类似向量时间的元数据实现。

元数据的规模

最谨慎的做法是将元数据一直保存,但是也可以在写操作在所有服务器中都达到good状态时,将元数据删除。

算法的实现

作者采用LevelDB数据库实现了NBTA算法及其改进。在Yahoo!的云平台上,8个操作的NBTA事务可以达到最终一致性的33%(所有都是写操作)至95.2%(所有都是读操作)峰值吞吐量。并且这种实现是线性扩展的,运行50个EC2实例,对于长度为8的事务(50%的读操作,50%的写操作),可以达到每秒执行250000次操作。

实验结果表明NBTA的性能大大优于基于锁的操作,因为不会发生阻塞。主要的花销来自于元数据以及将写入操作从pending更新为good。基于这些结果,作者已经开始将NBTA应用于其它数据存储和二级索引上。

结论

这篇文章展现了如何在不使用锁的情况下,实现在任意数据分片的原子性多对象更新。数据库中有很多类似于NBTA的算法。例如客户端第二轮通信的优化是通过PAXOS的算法实现的,使用额外的元数据保持并发更新类似于B树或其它非锁的数据结构。当然,多版本并发控制和基于时间戳的并发控制在数据库系统中也都有悠久的历史。但是NBTA的关键是实现事务的原子性,同时避免中央集权的时间戳或并发控制机制。具体来说要在数据读取操作前达到一个稳定状态,主要的挑战是解决竞争条件。在实际中,相比其它基于锁的技术,这个算法表现得很好。(编译/周小璐 审校/仲浩)

原文链接:Non-blocking transactional atomicity

http://www.csdn.net/article/2013-08-08/2816504-non-blocking-transactional-atomicity

 

java实现矩形,数字从四周到中心逐渐增大

打印效果:Matrix

public class TestMatrix {
public static void main(String[] args) {
testMatrix();
}

static void testMatrix() {
int row = 5, col = 3, x = 0, y = 0, start = 1000;
int[][] matrix = new int[row][col];
setMatrix(matrix, x, start);
printMatrix(matrix);
}

/**
* 递归实现.<br>
* 从四周到中心,数字逐渐递增
*
*/
static void setMatrix(int[][] matrix, int p, int start) {
int xLen = matrix.length, yLen = matrix[0].length;
int i, doublep = 2 * p;
if (yLen <= doublep || xLen <= doublep)
return;

// 上边
int topMax = yLen – p;
for (i = p; i < topMax; i++) {
matrix[p][i] = start++;
}

// 右边
int rightMax = xLen – p;
int rightY = yLen – p – 1;
for (i = p + 1; i < rightMax; i++) {
matrix[i][rightY] = start++;
}

// 没有右边情况
if (xLen == doublep + 1) {
return;
}

// 下边
int bottomX = rightMax – 1;
for (i = yLen – p – 2; i >= p; i–) {
matrix[bottomX][i] = start++;
}

// 没有下边
if (yLen == doublep + 1) {
return;
}

// 左边
for (i = xLen – p – 2; i > p; i–) {
matrix[i][p] = start++;
}
setMatrix(matrix, p + 1, start);
}

/**
* 打印数组
*/
static void printMatrix(int[][] matrix) {
for (int[] xl : matrix) {
for (int yl : xl) {
System.out.print(yl + ” “);
}
System.out.println();
}
}

相处越久越懂你,考拉FM借短节目组装你的个性广播电台

沈超 发表于 2013/08/02-19:43 车语传媒 /俞清木 /考拉FM

移动电台应用已经不是什么新鲜事物,除了司空见惯的各类音乐电台外,此前被我们报道过的就有蜻蜓FM窄播以及国外的TuneIn。但是旧行当也能玩出新花活,今年 6 月份上线的考拉FM从体验和模式上算是一个另类。

先从操作体验上看。打开考拉界面,进入视野的只有播放控制、节目页、用户账号三个元素,而操作方式也被极度精简:左右滑动节目页实现节目切换,上滑表示“喜欢”,下滑表示“踩”。

加上播放\暂停,可被执行的基本操作只有五种,连社交分享都隐藏在用户“喜欢”之后出现的二级选项中。如果可以的话,我真的很想在考拉所标榜的“极简主义”之前再加一个“丧心病狂的”作为修饰词。

再从内容上看。其他电台应用推给用户的多是内容连续的“频道”,而考拉 FM 提供的则是内容碎片化的“节目”。大多数“节目”都简短到几分钟左右,是为了与移动场景下用户分散的注意力相适应。

当然考拉要做的不止这些:把内容打散,以节目流的形式“喂”给听众,听众通过“喜欢”“踩”的动作表达个人偏好,后台通过算法不断优化节目流再反馈给听众,最终听众会拥有一部个性化定制的专属电台。以上都需要依靠一个包括普林斯顿博士、麻省理工硕士和斯隆商学院 MBA 的技术班底来实现,带着这一系列名校光环,相信考拉在数据挖掘和机器学习上的实力应该会比较扎实。

此外,值得一提的是考拉的出品公司。考拉 FM 由车语传媒推出,车语长期从事电台频道运营和广告代理业务,创始人俞清木曾任搜狐汽车频道主编。车语拥有十分丰富的内容储备和客户资源,包括:1200 个签约主播贡献的 14000 多个独立音频;优酷土豆、PPTV、爱奇艺等贡献的 300 档节目;有声读物公司鸿达以泰、酷听网、时代光华等贡献的 12000 多集的有声读物……再加上相对强大的自制内容能力,客观地说,考拉 FM 的版权风险可能是同类产品中最小的。

目前车语传媒已获 DCM、贝塔斯曼、君联资本三家投资,并且正在与其他机构接洽中。

36氪+

      提供
  • 考拉FM
    考拉FM

    www.kaolafm.com

    考拉FM,听我不同!考拉FM,一个不装B的电台,一个符合人性的radio,是移动互联网时代的个性化播放器。考拉FM,专业…

    北京

    文化艺术

     

如果你的数据可以让互联网公司盈利,为什么就不能替你赚钱?

boxi 发表于 12小时前 个人数据 /Reputation.com /Personal /Michael Fertik /consumer data vault

现在,典型的互联网商业模式都是这样的:提供免费服务,然后通过收集到的用户个人数据来赚钱。Facebook、Google、LinkedIn 皆如此。这些公司是如何根据你的兴趣爱好来推送定向广告的?是不是向其他公司出售数据来赚钱了?

你的数据应该能为你赚钱才对。虽然大家对这件事的讨论已经持续了几年,但是却一直没有人付诸实践。不过网上隐私和信誉管理初创企业Reputation.com打算要首开先河,其联合创始人兼 CEO Michael Fertik 透露,他的公司不久将会推出一项名为“消费者电子资料库”的新功能,如果用户将其特定的个人信息分享给其他公司的话,就能获得定的折扣和特别待遇。比方说,让航空公司了解你的收入情况可以换得积分并在下次飞行时获得升舱待遇。

Fertik 称他现在已经在跟若干感兴趣的大公司谈过。但是并未透露哪些数据可以交易,用于什么目的,但是他说主流的航空公司都比较喜欢这个主意。

Reputation.com 成立于 2006 年,迄今为止共筹得了 6700 万美元的融资。目前该公司提供的产品可帮助个人和公司在互联网和各种专有数据库上寻找有关自己的信息。付费后客户还可以让 Reputation.com 删除相关信息或记录。

Reputation.com 的这些产品已经拥有了数百万用户,这意味着许多人在 Reputation.com 上面已经有了数据可供交易。这些数据包括家庭住址、购买习惯、工作经历以及收入信息等。

虽然 Reputation.com 的用户数不可与 Facebook 的同日而语,但是 Fertik 说 Reputation.com 客户的数据对于营销人员来说更有价值。Reputation.com 还申请了数据挖掘方面的专利,可识别客户数据资料库中的内在价值。

但是宾州大学沃顿商学院的教授 Peter Fader 对此提出质疑,认为这些信息的价值未必像 Fertik 说的那么有用,相对而言,捕捉客户行为的数据会更加重要,而且许多公司通过与客户各种渠道的交互早已掌握那些信息。

至于消费者,Fader 预计他们对管理和交易自己数据的积极性也不会提高。因为管理个人数据要花费的精力要超过其得到的好处。

但是 Shane Green 不同意教授的观点。Shane Green 是提供个人信息存储的初创企业Personal的联合创始人兼 CEO,他说越来越突出的隐私问题表明许多人并不关心自己数据发生了什么事情。Personal 此前曾有过与 Reputation.com 类似的计划,但现在计划变了。不过,Green 仍认为 Fertik 的愿景是有意义的,他认为未来的营销市场将会越来越往基于用户许可的方向发展。

Green 举了一个租车到期的例子来说明个人控制个人数据带来的价值。只有一家汽车公司知道这一点,但是如果你的确想买车的话,其他汽车公司甚至会愿意付数百美元让你透露这一信息。

Personal 成立于 2009 年,目前已融资 1570 万美元。该公司目前的关注点是帮助用户核对和重用数据,比方说利用存储的数据完成大学和贷款的申请。

Personal 的目的也是要建立一个基础设施,让用户选择性地与其他公司分享数据从而获得折扣等好处。类似于用 Facebook 或 Google 账号登录其他网站,用户也可以用 Personal 账号与其他公司连接,然后控制该公司可访问的数据内容和访问时间。现在 Car and Driver 网站已经可以用 Personal 账号登录,用户可以通过授权页面选择允许网站访问的数据,包括制造商、汽车型号、驾龄等。Green 说:“数据市场的价值将超乎想象,但是我们现在关注的是盈利。”