2013年10月6日星期日

Netty 4.0.9.Final 发布,网络服务编程框架

Netty 提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。
体系结构图
Netty 4.0.9.Final 发布了,值得关注的改进内容有:
  • internalNioBuffer(...) lead to races when using from derived ByteBuf implementations (#1801)
  • LengthFieldBasedFrameDecoder produces IllegalArgumentException when frame is too big (#1798)
  • AbstractByteBuf.skipBytes(..) accept negative value and so set the readerIndex to a negative value (#1797)
  • HttpContentCompressor and HttpContentDecompressor not working (#1789)
  • GZIP decoding CRC32 and ISIZE in JdkZLibDecoder (#1788)
  • HTTP Chunk, wrong delimiter written (#1787)
完整列表请看 here

IBM再向Linux投资10亿美元 欲破微软垄断局面

据《华尔街日报》报道,IBM在当地时间周二宣布,公司将斥资10亿美元进一步鼓励客户使用完全免费开源的Linux操作系统,并希望借此同微软Windows Server操作系统展开直接竞争。
IBM再向Linux投资10亿美元 欲破微软垄断局面
事实上,这已经是IBM有史以来第二次对Linux投下血本以抗衡微软的动作了。早在2000年,IBM也曾经为当时还羽翼未满,并刚刚开始进军企业数据中心领域的Linux操作系统投资了10亿美元。
多年以来,微软对于这一操作系统十分抱有十分强烈的戒心,甚至不惜通过向消费者鼓吹“Linux侵犯了多达235项专利,所有使用这一操作系统的公司都有可能面临起诉”的论调试图迫使消费者远离这一产品。
然而,微软的这一如意算盘最终没能如愿,Linux的用户使用率一直在逐年攀升,而这同IBM对该操作系统表现出的信心密不可分。目前,我们已经很 难找到一个完全没有使用Linux系统的企业数据中心,而诸如谷歌、Facebook这些全球知名的科技企业也都将该操作系统视为自己服务器系统选择的一 个重要方案。
但平心而论,目前的Linux还远远没有强大到足以“杀死”Windows Server系统的地步。
据知名市场调研机构IDC公布的最新季度数据显示,目前企业购置的新服务器中大约有23%都运行着Linux操作系统,而运行Windows Server操作系统的比例则达到了49%。
据悉,IBM希望利用此次向Linux投资的10亿美元结合自己旗下的Power服务器产品进一步拓展公司在云端业务领域的发展。而且,公司客户也可以利用这一服务免费远程测试Linux应用的稳定性。

Android性能测试工具 Emmagee

Emmagee是监控指定被测应用在使用过程中占用机器的CPU、内存、流量资源的性能测试小工具。
支持SDK:Android2.2以及以上版本

Emmagee功能介绍
1、检测当前时间被测应用占用的CPU使用率以及总体CPU使用量
2、检测当前时间被测应用占用的内存量,以及占用的总体内存百分比,剩余内存量
3、检测应用从启动开始到当前时间消耗的流量数
4、测试数据写入到CSV文件中,同时存储在手机中
5、可以选择开启浮窗功能,浮窗中实时显示被测应用占用性能数据信息
6、在浮窗中可以快速启动或者关闭手机的wifi网络

Emmagee如何使用
1、安装Emmagee应用
2、启动Emmagee,列表中会默认加载手机安装的所有应用
3、选择你需要测试的应用,点击“开始测试”,被测应用会被启动

4、开始你的功能测试吧,测试过程中会自动记录相关性能参数
5、测试完成后回到Emmagee界面,点击“结束测试”,测试结果会保存在手机指定目录的CSV文件中

生成的CSV文件内容见图:


6、使用Excel打开CSV文件,使用自带的统计图标功能生成统计图:

Android网络通信库Volley简介


Posted on May 27, 2013 by liubin
1. 什么是Volley

在这之前,我们在程序中需要和网络通信的时候,大体使用的东西莫过于AsyncTaskLoader,HttpURLConnection,AsyncTask,HTTPClient(Apache)等,今年的Google I/O 2013上,Volley发布了。Volley是Android平台上的网络通信库,能使网络通信更快,更简单,更健壮。
这是Volley名称的由来: a burst or emission of many things or a large amount at once
在Google IO的演讲上,其配图是一幅发射火弓箭的图,有点类似流星。见下图
Volley's Name
其实,从这幅图,我们也可以看出来,Volley特别适合数据量不大但是通信频繁的场景。

1.1. Volley引入的背景
在以前,我们可能面临如下很多麻烦的问题。

比如以前从网上下载图片的步骤可能是这样的流程:

在ListAdapter#getView()里开始图像的读取。
通过AsyncTask等机制使用HttpURLConnection从服务器去的图片资源
在AsyncTask#onPostExecute()里设置相应ImageView的属性。
而在Volley下,只需要一个函数即可,详细见后面的例子。

再比如,屏幕旋转的时候,有时候会导致再次从网络取得数据。为了避免这种不必要的网络访问,我们可能需要自己写很多针对各种情况的处理,比如cache什么的。

再有,比如ListView的时候,我们滚动过快,可能导致有些网络请求返回的时候,早已经滚过了当时的位置,根本没必要显示在list里了,虽然我们可以通过ViewHolder来保持url等来实现防止两次取得,但是那些已经没有必须要的数据,还是会浪费系统的各种资源。

1.2. Volley提供的功能
简单来说,它提供了如下的便利功能:

JSON,图像等的异步下载;
网络请求的排序(scheduling)
网络请求的优先级处理
缓存
多级别取消请求
和Activity和生命周期的联动(Activity结束时同时取消所有网络请求)
2. 使用前的准备

引入Volley非常简单,首先,从git库先克隆一个下来:

1
git clone https://android.googlesource.com/platform/frameworks/volley
然后编译为jar包,再在自己的工程里import进来。

注意,这个库要求最低SDK版本为Froyo,即至少要设置android:minSdkVersion为8以上。

3.使用例子
下面简单看看如何使用Volley

3.1. 最简单的get请求
这个例子很简单,从网络取得JSON对象,然后打印出来。

1
2
3
4
5
6
7
8
9
mQueue = Volley.newRequestQueue(getApplicationContext());
mQueue.add(new JsonObjectRequest(Method.GET, url, null,
            new Listener() {
                @Override
                public void onResponse(JSONObject response) {
                    Log.d(TAG, "response : " + response.toString());
                }
            }, null));
mQueue.start();
3.2. 给ImageView设置图片源

1
2
3
4
5
// imageView是一个ImageView实例
// ImageLoader.getImageListener的第二个参数是默认的图片resource id
// 第三个参数是请求失败时候的资源id,可以指定为0
ImageListener listener = ImageLoader.getImageListener(imageView, android.R.drawable.ic_menu_rotate, android.R.drawable.ic_delete);
mImageLoader.get(url, listener);
ImageLoader的方法都需要从主线程里来调用。

3.3. 使用NetworkImageView

Volley提供了一个新的控件NetworkImageView来代替传统的ImageView,这个控件的图片属性可以通过

mImageView.setImageUrl(url, imageLoader)

来设定。而且,这个控件在被从父控件detach的时候,会自动取消网络请求的,即完全不用我们担心相关网络请求的生命周期问题。
示例代码如下:

1
2
NetworkImageView view = (NetworkImageView) findViewById(R.id.network_image_view);
view.setImageUrl(url, new ImageLoader(mQueue, new BitmapCache()));
3.4. 使用ImageLoader

1
2
3
4
5
6
7
mImageLoader = new ImageLoader(mRequestQueue, new BitmapLruCache());
... ...

if(holder.imageRequest != null) {
    holder.imageRequest.cancel();
}
holder.imageRequest = mImageLoader.get(BASE_UR + item.image_url, holder.imageView, R.drawable.loading, R.drawable.error);
注意,这里使用的不是ImageView控件,而是Volley新提供的com.android.volley.NetworkImageView。

另外,注意这里:

1
mImageLoader = new ImageLoader(mRequestQueue, new BitmapLruCache());
ImageLoader构造函数的第二个参数是一个ImageCache的实例(严格来说,是实现ImageCache接口的某具体类的实例)
ImageCache的定义如下(在ImageLoader.java里):

1
2
3
4
5
6
7
8
9
/**
 * Simple cache adapter interface. If provided to the ImageLoader, it
 * will be used as an L1 cache before dispatch to Volley. Implementations
 * must not block. Implementation with an LruCache is recommended.
 */
public interface ImageCache {
    public Bitmap getBitmap(String url);
    public void putBitmap(String url, Bitmap bitmap);
}
下面的网址一个lru的cache实现例子,请参考:

https://github.com/suwa-yuki/VolleySample/blob/master/src/jp/classmethod/android/sample/volley/BitmapCache.java

3.5. 使用自己定制的request

我们也可以通过继承Request根据自己的需求来定制自己的request

1
2
3
4
5
6
7
8
9
10
11
12
13
@Override
protected Response parseNetworkResponse(NetworkResponse response) {
    try {
        String json = new String(
                response.data, HttpHeaderParser.parseCharset(response.headers));
        return Response.success(
                gson.fromJson(json, clazz), HttpHeaderParser.parseCacheHeaders(response));
    } catch (UnsupportedEncodingException e) {
        return Response.error(new ParseError(e));
    } catch (JsonSyntaxException e) {
        return Response.error(new ParseError(e));
    }
}
这段代码节选自: https://gist.github.com/ficusk/5474673

里面使用的gson(com.google.gson.Gson)是JSON的序列化和反序列化的库,可以在JSON和java model object之间进行转换。

以下是使用自定制request的例子:

1
2
3
4
5
6
7
8
mRequestQueue.add( new GsonRequest(url, ListResponse.class, null,
    new Listener() {
        public void onResponse(ListResponse response) {
            appendItemsToList(response.item);
            notifyDataSetChanged();
        }
    }
}
4. Volley的架构设计

Volley使用了线程池来作为基础结构,主要分为主线程,cache线程和network线程。
主线程和cache线程都只有一个,而NetworkDispatcher线程可以有多个,这样能解决比并行问题。
具体可以参考下图,此图节选自Google I/O 演讲
Volley Thread image

Main Thread

如果在一个Activity里面启动了网络请求,而在这个网络请求还没返回结果的时候,如果Activity被结束了,则我们需要写如下代码作为防守:

1
2
3
4
5
6
@Override public void onPostExecute(Result r) {
    if (getActivity() == null) {
        return;
    }
    // ...
}
Activity被终止之后,如果继续使用其中的Context等,除了无辜的浪费CPU,电池,网络等资源,有可能还会导致程序crash,所以,我们需要处理这种一场情况。

使用Volley的话,我们可以在Activity停止的时候,同时取消所有或部分未完成的网络请求。

Volley里所有的请求结果会返回给主进程,如果在主进程里取消了某些请求,则这些请求将不会被返回给主线程。
比如,可以针对某些个request做取消操作:

1
2
3
4
5
6
7
@Override
public void onStop() {
    for (Request <?> req : mInFlightRequests) {
        req.cancel();
    }
    ...
}
或者,取消这个队列里的所有请求:

1
2
3
4
@Override pubic void onStop() {
    mRequestQueue.cancelAll(this);
    ...
}
也可以根据RequestFilter或者Tag来终止某些请求:

1
2
3
4
5
6
@Override public void onStop() {
    mRequestQueue.cancelAll( new RequestFilter() {})
    ...
    // or
    mRequestQueue.cancelAll(new Object());
    ...
5.总结

从演讲的例子来看,Volley应该是简化了网络通信的一些开发,特别是针对如下两种情况:

JSON对象
图片加载
但是这个东西也有不实用的地方,比如大数据(large payloads ),流媒体,这些case,还需要使用原始的方法,比如Download Manager等。
总之,如果你要编写网络程序,是不是可以考虑开始使用Volley呢?
更多内容,可以从源代码获取,见下面附录的连接1.



附录、参考link:
1. Volley主页 https://android.googlesource.com/platform/frameworks/volley
2. Google I/O Volley演讲 http://www.youtube.com/watch?v=yhv8l9F44qo&feature=player_embedded
3. Android Tips #51 ネットワーク通信・キャッシュ処理をより速く、簡単に実装できるライブラリ “Volley” を使ってみた http://dev.classmethod.jp/smartphone/android/android-tips-51-volley/
4. Google I/O 2013 – Android : Volley: Easy, Fast Networking for Android http://y-anz-m.blogspot.jp/2013/05/google-io-2013-android-volley-easy-fast.html?m=1

Google工程师将语言翻译变成向量空间数学问题

现有的基于统计翻译的在线工具如巴比鱼和Google翻译,翻译的结果勉强可用,但离完美还相去甚远。现在,Google工程师在预印本网站上发表论文,介绍了一种不依赖于统计翻译的新技术。他们的方法是将语言翻译变成向量空间数学问题,利用数据挖掘技术建模一种语言的结构,然后与另一种语言的结构进行对比。
新 的方法是基于一个概念,即每一种语言都有一套相似的理念,因而使用单词的方式也存在相似性。例如,大多数语言中都有描述相同动物的单词,如狗、猫和牛,这 些单词很可能以相同的方式在句子中使用,如“猫是一种比狗小的动物”。语言中单词之间的关系集合被称为“语言空间”,可类比为一个点到另一个点的向量集 合,能以数学的方式进行处理,例如王减去男性加上女性等于女王(‘king’–‘man’+‘woman’=‘queen’)。在向量空间中,许多语言都 有共通之处,可以利用向量空间线性变换将一种语言翻译成另一种语言。Google工程师表示,新的方法非常有效。

物联网将改变人们的工作方式:10 大理由

随着互联网的快速发展,物联网也在阔步前行,与此同时,物联网对人们的影响也越来越大。如今,诸多IT公司都大量投资物联网,以此将人与设备、设备与设备以及系统与系统连接起来。据市场研究机构IDC的研究人员估算,到2020年时,物与物联网的规模将是比人与人联网的规模高26倍。

如今,从人们与周围事物互动的角度来看,物联网已经在影响人们的日常工作。预计将来物联网还将发挥全新的作用,并将改变人们的交通、交流和协作的方式。为什么呢?以下10大原因将对此问题作出更好的解释。

1、让人们路途中的交通更加快捷

人们约有15%的交流时间花费在路上,约有17%的燃料消耗在等待红灯的过程中。道路上的传感器、交通视频摄像头以及道路的中央分隔带都将影响着汽车与驾驶员的“谈话”方式。通过监控行驶速度、交通信号灯、事故以及当前的路况等信息,编入程序的汽车,甚至是道路都将给驾驶员的移动设备发去最有效的行驶路线,从而减少交通时间,节省燃料,并让人们出行更安全。

2、预测产品的稳定性

在产品出货之后,买方与卖方之间的互动往往就会减少,如果双方没有新的交易或产品出现问题,那么买方与卖方之间的交流也几乎没有。预测技术能够监控产品的“稳定性”,从而在问题出现之前就能够及时地发现问题。在倡导消费者为先的时代,一家公司如果掌握了预测产品性能的监控技术,那将意味着这家公司将能够让消费者感到满意,并避免问题的出现。

3、创建更多的工作职位

数字朝代已经开创了IT工作职位的新时代。随着物联网的兴起,云和大数据相关的工作也越来越专业化。市场研究机构Gartner去年就发布报告称,首席数码官(CDO)的数量正在不断上升。Gartner还预测称,到2015年时,约有25%的公司将设立这样的工作职位,以此来管理公司数字,在这样的形势之下,数据专家也将成为公司的重要资产。在获得了大数据和分析的价值之后,人们也将开始看到更多的首席数据科学家、分析师、甚至是客户满意官员等相关的工作职位,甚至还会出现我们目前还没有想到的职位。

4、提供工作能力

社交媒体的崛起已经为人们的交流和团队协作开创了新的时代。像Box、Skype、Jive和Facebook等有价值的社交工具已经吸引了下一代工人的关注。视频交流和图像交流等也将节省人们的交流时间,同时也让这些社交工具与现代化的协调工作系统不分上下。

5、便于将非结构化数据转化成结构化数据

大数据不仅仅是“大”,而是“巨大”。大数据如果被很好地利用的话,那么将会给商业创造更多的价值,特别是在非结构化数据转化成结构化数据之后。分析数据并将这些分析后的数据整合到有用的信息之后,这些数据将会提供消费者、产品行为、市场状况、员工生产力以及更多的相关有用信息。

6、更利于环境保护

如今,感应器已经在一些办公大楼和家庭内运行,但展望未来,这种感应器将成为现代建筑基础设施的必需品。随着用户在房间或卧室内的移动,安装后的动作感应器也将能够按照用户需求打开或关闭灯光设施、加热器、空调、咖啡机和电视机等设备。这些感应器如今已经整合到盲人设备之中,并利用温度和光线等决定打开和关闭相关设备的时长。最终,这种感应器很好地帮助人们节能,节省资金并保护了环境。

7、更好地定位

物联网让位置追踪服务更加简捷。目前,手机、汽车甚至是医院内的联网设备都能够被定位,从而节省有价值的资源。诸多公司将能够很快地追踪他们业务的每一个细节,包括从库存到订单履约情况等,并根据这些位置信息来部署现场服务和员工。工具、工厂和汽车都将能够连接基于位置技术的网络之中,从而让整个链条更加有效。

8、更加智能化的沟通与服务

即使是水冷却机也能够连接到物联网,从而更好地让人们利用更多的时间。例如,水冷却机(或咖啡机、快餐店等)都能够更加智能化的记忆用户的个人偏好,并根据声音和动作激活技术提供相应的服务,甚至是按照用户的需求传递饮料,而不需要用户等候。

9、改变医生工作方式

物联网正在改变医生的工作方式、病人的体验以及整个医患关系。如今,病人的病情必须经过医生当面确诊后才能作出评估。将来,物联网将能够让医生直接读到病人身体相关的数据信息,从而让医生远程实时的掌握病人的信息。

10、根据天气状况安排工作

如今,天气预报主要依赖一些卫星和地面天气监测的结果而进行。将来,大量的感应器将会整合到不同的设备之中,以及空中和地面的数据接受站。使用大数据分析来更好地预测地球状况,将有利于人们更加熟练准确的掌握天气状况和气候变化情况,这样将能够进行更加准确的天气预报,从而让人们更好的规划一周的工作。从全球范围来看,物联网将意味着人们能够更加准确地预测气候变化趋势和自然灾害情况。