存档

作者存档

《android视频教程》第一季 第15集 Handler的使用(二)

2011年5月2日 没有评论

本节视频主要内容:
1、Handler与线程

2、Bundle的用法

3、在新线程中处理消息的方法

handler类允许你发送消息和处理线程消息队列中的消息及runnable对象。handler实例都是与一个线程和该线程的消息队列一起使 用,一旦 创建了一个新的handler实例,系统就把该实例与一个线程和该线程的消息队列捆绑起来,这将可以发送消息和runnable对象给该消息队列,并在消 息队列出口处处理它们。

 

handler类有两种主要用途:1。按照时间计划,在未来某时刻,对处理一个消息或执行某个runnable实例。2。把一个对另外线程对象的操作请求放入消息队列中,从而避免线程间冲突。

 

时间类消息通过如下方法使用: post(Runnable), postAtTime(Runnable, long), postDelayed(Runnable, long), sendEmptyMessage(int), sendMessage(Message), sendMessageAtTime(Message, long), and sendMessageDelayed(Message, long)
methods. post之类函数可以传输一个runnable对象给消息队列,并在到达消息队列后被调用。sendmessage之类函数可以传送一个包含数据的 message对象,该message对象可以被Handler类的handleMessage(Message) 方法所处理。

 

post之类函数和sendmessage之类的函数都可以指定消息的执行时机,是立即执行、稍后一段时间执行,还是在某个确定时刻执行。这可以用来实现超时、消息或其他时间相关的操作。

 

当一个进程启动时,主线程独立执行一个消息队列,该队列管理着应用顶层的对象(如:activities、broadcast receivers等等)和所有创建的窗口。你可以创建自己的一个线程,并通过handler来与主线程进行通信。这可以通过在新的线程中调用主线程的 handler的post和sendmessage操作来实现。

参考代码:

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
1、HandlerTest.java:
 package com.cxybase.HandlerTest;
 
import android.app.Activity;
 import android.os.Bundle;
 import android.os.Handler;
 import android.util.Log;
 
/*
 * 1、验证了handler post()方法,调用的runnable和activity在同一个线程中执行,没有调用start()方法;直接调用线程run()方法
 * 2、采用标准JAVA创建线程,是另外的启动线程,调用了start()方法
 * 3、本例程包含两个文件,注意修改AndroidManifest.xml以启动你所想启动的例子
 * */
 public class HandlerTest extends Activity {
 
private final static String TAG ="cxybase";
 private Handler handler = new Handler();
 
/** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.main);
 
//使用handler调用线程
 //        handler.post(r);
 
//采用标准调的JAVA实现线程
 Thread t = new Thread(r);
 t.start();
 
//打印当前线程的ID和name
 Log.i(TAG, "activity--->" + Thread.currentThread().getId());
 Log.i(TAG, "activityName--->" + Thread.currentThread().getName());
 }
 
Runnable r = new Runnable()
 {
 
public void run() {
 // TODO Auto-generated method stub
 Log.i(TAG, "handler--->" + Thread.currentThread().getId());
 Log.i(TAG, "handlerName--->" + Thread.currentThread().getName());
 
try
 {
 Thread.sleep(1000);
 }catch(InterruptedException e)
 {
 e.printStackTrace();
 }
 }
 
};
 }

2、HandlerTest2.java

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
package com.cxybase.HandlerTest;
 
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.view.animation.BounceInterpolator;
 
public class HandlerTest2 extends Activity{
 
 private final static String TAG="cxybase";
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 // TODO Auto-generated method stub
 super.onCreate(savedInstanceState);
 setContentView(R.layout.main);
 
 Log.i(TAG, "activity-->" + Thread.currentThread().getId()+ " : " + Thread.currentThread().getName());
 
 //实现了使用looper来处理消息队列的功能
 //这个类由android框架提供
 HandlerThread handlerThread = new HandlerThread("handler_thread");
 handlerThread.start();
 
 MyHandler myHandler = new MyHandler(handlerThread.getLooper());
 Message msg = myHandler.obtainMessage();
 
//        msg.obj = "abc";
 Bundle b = new Bundle();
 b.putInt("age", 20);
 b.putString("name", "jim");
 msg.setData(b);
 
 msg.sendToTarget();
 
 }
 
 class MyHandler extends Handler
 {
 public MyHandler()
 {
 
 }
 
 public MyHandler(Looper looper)
 {
 super(looper);
 }
 
 @Override
 public void handleMessage(Message msg) {
 // TODO Auto-generated method stub
 //取出Bundle数据
 Bundle b = msg.getData();
 int age = b.getInt("age");
 String name = b.getString("name");
 
 
 Log.i(TAG, "handler--->"+Thread.currentThread().getId() + " " + Thread.currentThread().getName());
 Log.i(TAG, "handleMessage");
 
 Log.i(TAG, "Bundle value: " + "age:" + age + "  name:" + name );
 
 //取出obj数据
//            String s = (String)msg.obj;
//            Log.i(TAG, s);
 }
 
 
 }
 
 
}

《android视频教程》第一季 第14集 Handler的使用(一)

2011年5月2日 没有评论

handler类允许你发送消息和处理线程消息队列中的消息及runnable对象。handler实例都是与一个线程和该线程的消息队列一起使用,一旦 创建了一个新的handler实例,系统就把该实例与一个线程和该线程的消息队列捆绑起来,这将可以发送消息和runnable对象给该消息队列,并在消 息队列出口处处理它们。

 

handler类有两种主要用途:1。按照时间计划,在未来某时刻,对处理一个消息或执行某个runnable实例。2。把一个对另外线程对象的操作请求放入消息队列中,从而避免线程间冲突。

 

时间类消息通过如下方法使用: post(Runnable), postAtTime(Runnable, long), postDelayed(Runnable, long), sendEmptyMessage(int), sendMessage(Message), sendMessageAtTime(Message, long), and sendMessageDelayed(Message, long)
methods. post之类函数可以传输一个runnable对象给消息队列,并在到达消息队列后被调用。sendmessage之类函数可以传送一个包含数据的 message对象,该message对象可以被Handler类的handleMessage(Message) 方法所处理。

 

post之类函数和sendmessage之类的函数都可以指定消息的执行时机,是立即执行、稍后一段时间执行,还是在某个确定时刻执行。这可以用来实现超时、消息或其他时间相关的操作。

 

当一个进程启动时,主线程独立执行一个消息队列,该队列管理着应用顶层的对象(如:activities、broadcast receivers等等)和所有创建的窗口。你可以创建自己的一个线程,并通过handler来与主线程进行通信。这可以通过在新的线程中调用主线程的 handler的post和sendmessage操作来实现。

实例代码(略去布局文件):

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package com.cxybase.myHandler;
 
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
 
public class myHandler extends Activity {
 
 private final static String TAG = "cxybase";
 
 //声明控件对象变量
 private Button startButton = null;
 private Button endButton = null;
 
 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.main);
 
 //获取控件对象,并设置按钮的监听器
 startButton = (Button)findViewById(R.id.startButton);
 startButton.setOnClickListener(new startButtonOnClickListener());
 
 endButton = (Button)findViewById(R.id.endButton);
 endButton.setOnClickListener(new endButtonOnClickListener());
 }
 
 
 //设置startButton监听内部类
 class startButtonOnClickListener implements OnClickListener
 {
 
 public void onClick(View v) {
 // TODO Auto-generated method stub
 //将要执行的线程对象,加入队列中
 handle.post(updateThread);
 }
 
 }
 
 //设置endButton监听内部类
 class endButtonOnClickListener implements OnClickListener
 {
 
 public void onClick(View v) {
 // TODO Auto-generated method stub
 handle.removeCallbacks(updateThread);
 }
 
 }
 
 //创建一个Handler对象
 Handler handle = new Handler();
 
 //实现线程类
 //将要执行的操作写在线程对象的run()方法当中
 Runnable updateThread = new Runnable() {
 public void run() {
 // TODO Auto-generated method stub
 Log.i(TAG, "updateThread");
 handle.postDelayed(updateThread, 1000);
 }
 };
 
}

奥巴马证实本.拉登在巴基斯坦被击毙

2011年5月2日 没有评论

美国总统奥巴马刚在全国电视演讲证实,美国2001年“9·11”袭击事件的幕后总策划人、卡伊达组织首领奥萨马·本·拉登已被击毙。

他指,在今天的军事行动中,奥萨马在巴基斯坦境内被打死,尸体已被发现。

在奥巴马发表演讲前后,许多美国民众已高举国旗聚集到白宫附近,他们高呼口号,庆祝拉登之死。

2001年9月11日,美国指认本·拉登组织的恐怖分子劫持4架飞机撞击美国纽约世贸中心和华盛顿五角大楼,造成2998人死亡,世贸中心双塔垮塌、五角大楼严重受损。9·11成为美国历史上本土遭受的最大的恐怖袭击。

linux下使用mPlayer播放MMS在线电视

2011年5月2日 没有评论

在LINUX想看在线电视,听听新闻和音乐什么的。

首先,我们要安装mplayer播放器。开始的时候我装的是kmplayer,貌似直接播放还是不可以,应该还要装些编解码器什么的,懒了,没去搞。就试试mplayer了。

我用的是fedora 13系统,可以直接yum安装mplayer:

yum install mplayer

安装后,找到个电视台的mms地址,我用的是我们校园网的中央一套地址,在终端:

mplayer mms://210.45.224.10/tv3

然后,就可以在线看电视啦。。还是很爽的哈。。截个图个大家瞅瞅(美国报告拉登已经被击毙了,时间赶的正好,刚好截个图):

《赢家》在线视频(筷子兄弟)

2011年5月2日 没有评论

赢家出品人:赵鹏飞、古永锵总策划:王珂、魏明、朱向阳总制片人:赵鹏飞、潘沁监制:

尹萌、卢梵溪《赢家》讲述成功男人王大利在回顾自己的青春岁月时醒悟到什么…..

《android视频教程》第一季 第13集 Android常见控件(三)

2011年5月2日 没有评论

课程主要内容:

1、ProgressBar的使用方法

2、ListView的使用方法

LINUX辞典:stardict简介和安装

2011年5月1日 没有评论

在linux下一直使用在线词典,有些不方便。今天在网上查了查,看到stardict平价不错,中文是“星际译王”。

StarDict(星际译王)是利用GTK(GIMP TOOLKIT)开发的国际化的、跨平台的自由的桌面字典软件。它并不包含字典档,使用者须自行下载配合使用。它可以运行于多种不同的平台,如 Linux, Microsoft Windows , FreeBSD及Solaris,并使用GPL授权。
官方站点:http://stardict.sourceforge.net

具有模糊匹配、屏幕取词功能、通配符查词、单词朗读的功能,而且自带中文字体,独立于系统之外。目前支持的语言,除了简体、繁体中文与英文互译,还支持日文、俄文等。   当星际译王运行于扫描模式时,所选取的词语将会自己地在字典里找寻,并会将所有的结果展示于弹出选单。它亦能透过与Freedict的整合来翻译外文网站,虽不甚完善,但使用者亦能从中领略大概意思。

1. 功能强大!

在星际译王主页里有上千本 免费词典供用户选择使用。只需添加您喜爱的字典,日后使用相当方便。

2. 全文翻译:

打开星际译王软件,点击软件工具界面左侧的全文翻译图标即可进入全文翻译界面,星际译王收录了谷歌翻译,雅虎翻译,Altavi-sta翻译,SystranBox翻译,Excite Japan翻译等多个引擎,可进行多语种的在线互译,功能实用。

3. 网络词典:

点击软件工具界面右上角的图标弹出主菜单,设置首选项(也可通过右下角的首选项图标打开),在首选项的设置中点网络词典,即出现左侧所示图片。注册帐号或登陆已有帐号,不需要下载安装便可使用网络设置的词典。通过网络词典节省了硬盘空间,且不影响高效使用。

4. 鼠标取词:

打开星际译王软件,选中界面取词功能,如左侧图中底部红色区域的所示,便可以在浏览界面内随时查看翻译解释。

我用的fedora 13系统,默认没有安装stardict,开始的时候在官方网站下的rpm包,安装时候出现错误:

libgucharmap.so.6 is needed by stardict-3.0.1-1.fc8.i386

总共有三个依赖需要安装,前面两个我用yum都安装了。上面这个没搞定,在网上查了下,也没弄好,不过发现一个好网站。findrpm.net,具体好在哪里,你可以自己去看看。

最后我才发现可以直接用YUM安装stardic:

yum install stardict

即可。OK!

android控件:ProgressBar、RatingBar和SeekBar进度条控件

2011年5月1日 没有评论

1、android.widget. ProgressBar,继承自android.view.View 。在android.widget包中。对应对话框ProgressDialog。

ProgressBar有两种展示方式,表盘形式(普通、小、大)和条形填充形式。在layout定义时,需要通过设施style属性类设置展示方式。

2、android.widget. SeekBar拖动进度条,继承自android.widget.AbsSeekBar(android.widget. ProgressBar) 。在android.widget包中。

3、android.widget. RatingBar星式进度条,继承自android.widget.AbsSeekBar(android.widget. ProgressBar)。在android.widget包中。

详细可见:http://limingnihao.iteye.com/blog/852498

以下代码显示为ProgressBar进度调:

1、main.xml:

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
26
27
28
29
30
31
32
33
34
35
36
37
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 >
<TextView 
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:text="@string/hello"
 />
 
 <ProgressBar
 android:id="@+id/firstBar"
 android:layout_width="200dp"
 android:layout_height="wrap_content"
 android:visibility="gone"
 style="?android:attr/progressBarStyleHorizontal"
 android:max="100"
 />
 
 <ProgressBar
 android:id="@+id/secondBar"
 android:layout_width = "wrap_content"
 android:layout_height="wrap_content"
 style="?android:attr/progressBarStyle"
 android:visibility="gone"
 />
 
 <Button
 android:id="@+id/btn"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text="@string/btn"
 />
 
</LinearLayout>

2、strings.xml:

1
2
3
4
5
6
<?xml version="1.0" encoding="utf-8"?>
<resources>
 <string name="hello">Hello World, android进度条和列表组件</string>
 <string name="app_name">Control2</string>
 <string name="btn">开始</string>
</resources>

3、control.java:

 

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
package com.cxybase.Control2;
 
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.RatingBar;
 
public class Control2 extends Activity {
 
 //声明对象和变量
 private ProgressBar firstBar = null;
 private ProgressBar secondBar = null;
 private Button btn = null;
 private int i = 0;
 
 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.main);
 
 //根据控件的ID来获取控件对象
 firstBar = (ProgressBar)findViewById(R.id.firstBar);
 secondBar = (ProgressBar)findViewById(R.id.secondBar);
 btn = (Button)findViewById(R.id.btn);
 
 btn.setOnClickListener(new ButtonListener());
 }
 
 //给Button设置一个监听器
 class ButtonListener implements OnClickListener
 {
 
 public void onClick(View v) {
 // TODO Auto-generated method stub
 if(i == 0)
 {
 //设置进度条处于可见的状态
 firstBar.setVisibility(View.VISIBLE);
//                firstBar.setMax(100); //设置进度条的最大值
 secondBar.setVisibility(View.VISIBLE);
 }
 
 else if (i < firstBar.getMax())
 {
 //没有设置进度条最大值,默认为100
 //设置主进度条的当前值
 firstBar.setProgress(i);
 //设置第二进度条的当前值
 firstBar.setSecondaryProgress(i+10);
 
 //默认的进度条是无法显示进行的状态
 secondBar.setProgress(i);
 }
 else
 {
 //设置进度条处于不可见状态
 firstBar.setVisibility(View.GONE);
 secondBar.setVisibility(View.GONE);
 }
 
 i += 10;
 }
 
 }
}
 
 

 

android控件:RadioGroup、RadioButton、CheckBox和Toast的使用

2011年5月1日 没有评论

主要内容有:

1.RadioGroup和RadioButton的使用

所谓的RadioButton就是单选按钮,在一组单选按钮当中,只有一个能够选中;

2.CheckBox的使用

CheckBox是所选按钮,可以让用户一次性选中多个选项;

3.Toast的使用

Toast是一种弹出式的提示框,显示的时间可长可短。使用Toast可以很方便的显示一些提示用户的信息;

视频参见:

《android视频教程》第一季 第12集 Android常见控件(二)

代码分享:

1、页面布局文件radio.xml:

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent">
 <TextView
 android:id="@+id/textView1"
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:text="@string/hello"
 />
 
 <RadioGroup
 android:id="@+id/genderGroup"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:orientation="vertical"
 >
 <RadioButton
 android:id="@+id/femaleButton"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text="@string/female"
 />
 <RadioButton
 android:id="@+id/maleButton"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text="@string/male"
 />
 </RadioGroup>
 
 <CheckBox
 android:id="@+id/read"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text="@string/read"
 />
 <CheckBox
 android:id="@+id/speak"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text="@string/speak"
 />
 <CheckBox
 android:id="@+id/listen"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text="@string/listen"
 />
 
</LinearLayout>

2、字符串资源文件strings.xml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="utf-8"?>
<resources>
 <string name="hello">Hello World, myControl!</string>
 <string name="app_name">myControl</string>
 
 <string name="female"></string>
 <string name="male"></string>
 
 <string name="big">big</string>
 <string name="small">small</string>
 
 <string name="listen"></string>
 <string name="speak"></string>
 <string name="read"></string>
 
</resources>

3、程序主文件myControl.java:

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
package com.cxybase.myControl;
 
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Toast;
 
public class myControl extends Activity {
 /** Called when the activity is first created. */
 
 private final static String MYTAG="cxybase";
 
 //对控件对象进行声明
 private RadioGroup genderGroup = null;
 private RadioButton maleButton = null;
 private RadioButton femaleButton = null;
 
 private CheckBox readBox = null;
 private CheckBox listenBox = null;
 private CheckBox speakBox = null;
 
 @Override
 public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.radio);
 
 //通过控件的ID来获取控件的对象
 genderGroup = (RadioGroup)findViewById(R.id.genderGroup);
 maleButton = (RadioButton)findViewById(R.id.maleButton);
 femaleButton = (RadioButton)findViewById(R.id.femaleButton);
 
 readBox = (CheckBox)findViewById(R.id.read);
 listenBox = (CheckBox)findViewById(R.id.listen);
 speakBox = (CheckBox)findViewById(R.id.speak);
 
 //为RadioGroup设置监听器
 genderGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
 
 public void onCheckedChanged(RadioGroup group, int checkedId) {
 // TODO Auto-generated method stub
 if(femaleButton.getId() == checkedId)
 {
//                    System.out.println("female");
 Log.i(MYTAG, "选中了female");
 
 Toast.makeText(myControl.this, "选中了female", Toast.LENGTH_SHORT).show();
 
 }
 else if(maleButton.getId() ==  checkedId)
 {
//                    System.out.println("male");
 Log.i(MYTAG, "male");
 Toast.makeText(myControl.this, "选中了male", Toast.LENGTH_SHORT).show();
 }
 
 }
 });
 
 //为每一个CheckBox设置监听器
 readBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
 
 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
 // TODO Auto-generated method stub
 if (isChecked)
 {
//                    System.out.println("read is checked");
 Log.i(MYTAG, "read is checked");
 }
 else
 {
//                    System.out.println("read is not checked");
 Log.i(MYTAG, "read is no checked");
 }
 }
 });
 
 speakBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
 
 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
 // TODO Auto-generated method stub
 if (isChecked)
 {
//                    System.out.println("speak is checked");
 Log.i(MYTAG, "speak is checked");
 }
 else
 {
 Log.i(MYTAG, "speak is not checked");
//                    System.out.println("speak is not checked");
 }
 }
 });
 
 listenBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
 
 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
 // TODO Auto-generated method stub
 if (isChecked)
 {
//                    System.out.println("listen is checked");
 Log.i(MYTAG, "listen is checked");
 }
 else
 {
//                    System.out.println("listen is not checked");
 Log.i(MYTAG, "listen is not checked");
 }
 }
 });
 
 }
}

eclipse快捷键——选中一个单词

2011年5月1日 没有评论

ctrl+左右是跳过一个单词;
ctrl+shift+左右是选择一个单词,可以连点左右已选择多个。
ctrl+d是删除当前行。
当光标在一行的两端时,按住shift+home/end可以选择当前行。

fedora 13安装播放器播放mp4视频

2011年4月30日 没有评论

一、网上搜的

不知道为什么,Fedora 13没有自带搜索mp3插件的功能,需要自己寻找安装,下面来教大家一个在Fedora 13下听音乐看电影的方法:

在root权限下执行下面两个命令:

rpm -ivh http://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-stable.noarch.rpm
yum install gstreamer-plugins-bad gstreamer-ffmpeg gstreamer-plugins-ugly -y

完了之后在点击mp3文件就可以听了,rmvb/rm/mkv/mp4/wmv也可以看,我试过,可以用的!另外,Fedora是有音乐预听功能 的,即不用打开文件,只要把鼠标移到音乐文件上面就可以听到了!

二、

自己试了试,貌似还不可以。就yum install kmplayer。结果就OK了。

10种意想不到的验证码风格设计

2011年4月30日 没有评论

【本文转自CSDN】众所周知,验证码就是帮助我们的网站防止计算机生成答案。今天的这10个用户体验绝佳、令人意想不到的验证码设计风格,推荐给大家。

1. QapTcha

QapTcha–拖曳式jQuery验证码系统。作为用户,我们只需移动滚动条。

QapTcha

2. buttonCaptcha

这个要复杂点,需要拖动目标字母。

buttonCaptcha

3. Fancy Draggable Captcha

这个很有意思,我们要解决这个小谜题,拖曳式的。

4. Ajax Fancy Captcha

又一个很奇特的,我们需要拖动提示目标物到圈中。

5. Sexy Captcha

像小孩子玩儿的拼图游戏。

Sexy Captcha

6. simpleCaptcha

玩具验证码,选一个吧。

simpleCaptcha

7. slideLock

拖动滚动条来解锁吧。

slideLock

8. Captcha PHP

动画验证码。

Captcha PHP

9. NuCaptcha

输入flash视频中的红字母就对了。

NuCaptcha

10. identiPIC

看图识字游戏。

identiPIC

原文出自:Top 10 Really User Friendly Captchas (version 2)

译文出自:开源中国社区

分类: WEB 标签: ,

Facebook数据仓库揭秘:RCFile高效存储结构

2011年4月30日 没有评论

【CSDN】本文介绍了Facebook公司数据分析系统中的RCFile存储结构,该结构集行存储和列存储的优点于一身,在MapReduce环境下的大规模数据分析中扮演重要角色。

Facebook曾在2010 ICDE(IEEE International Conference on Data Engineering)会议上介绍了数据仓库Hive。Hive存储海量数据在Hadoop系统中,提供了一套类数据库的数据存储和处理机制。它采用类 SQL语言对数据进行自动化管理和处理,经过语句解析和转换,最终生成基于Hadoop的MapReduce任务,通过执行这些任务完成数据处理。图1显 示了Hive数据仓库的系统结构。

图1 Hive数据仓库的系统结构

基于MapReduce的数据仓库在超大规模数据分析中扮演了重要角色,对于典型的Web服 务供应商,这些分析有助于它们快速理解动态的用户行为及变化的用户需求。数据存储结构是影响数据仓库性能的关键因素之一。Hadoop系统中常用的文件存 储格式有支持文本的TextFile和支持二进制的SequenceFile等,它们都属于行存储方式。Facebook工程师发表的RCFile: A Fast and Spaceefficient Data Placement Structure in MapReducebased Warehouse Systems一文,介绍了一种高效的数据存储结构——RCFile(Record Columnar File),并将其应用于Facebook的数据仓库Hive中。与传统数据库的数据存储结构相比,RCFile更有效地满足了基于MapReduce的 数据仓库的四个关键需求,即Fast data loading、Fast query processing、Highly efficient storage space utilization和Strong adaptivity to highly dynamic workload patterns。

数据仓库的需求

基于Facebook系统特征和用户数据的分析,在MapReduce计算环境下,数据仓库对于数据存储结构有四个关键需求。

Fast data loading

对于Facebook的产品数据仓库而言,快速加载数据(写数据)是非常关键的。每天大约有超过20TB的数据上传到Facebook的数据仓库,由于数据加载期间网络和磁盘流量会干扰正常的查询执行,因此缩短数据加载时间是非常必要的。

Fast query processing

为了满足实时性的网站请求和支持高并发用户提交查询的大量读负载,查询响应时间是非常关键的,这要求底层存储结构能够随着查询数量的增加而保持高速的查询处理。

Highly efficient storage space utilization

高速增长的用户活动总是需要可扩展的存储容量和计算能力,有限的磁盘空间需要合理管理海量数据的存储。实际上,该问题的解决方案就是最大化磁盘空间利用率。

Strong adaptivity to highly dynamic workload patterns

同一份数据集会供给不同应用的用户,通过各种方式来分析。某些数据分析是例行过程,按照某种固定模式周期性执行;而另一些则是从中间平台发起的查 询。大多数负载不遵循任何规则模式,这需要底层系统在存储空间有限的前提下,对数据处理中不可预知的动态数据具备高度的适应性,而不是专注于某种特殊的负 载模式。

MapReduce存储策略

要想设计并实现一种基于MapReduce数据仓库的高效数据存储结构,关键挑战是在MapReduce计算环境中满足上述四个需求。在传统数据库 系统中,三种数据存储结构被广泛研究,分别是行存储结构、列存储结构和PAX混合存储结构。上面这三种结构都有其自身特点,不过简单移植这些数据库导向的 存储结构到基于MapReduce的数据仓库系统并不能很好地满足所有需求。

行存储

如图2所示,基于Hadoop系统行存储结构的优点在于快速数据加载和动态负载的高适应能力,这是因为行存储保证了相同记录的所有域都在同一个集群 节点,即同一个HDFS块。不过,行存储的缺点也是显而易见的,例如它不能支持快速查询处理,因为当查询仅仅针对多列表中的少数几列时,它不能跳过不必要 的列读取;此外,由于混合着不同数据值的列,行存储不易获得一个极高的压缩比,即空间利用率不易大幅提高。尽管通过熵编码和利用列相关性能够获得一个较好 的压缩比,但是复杂数据存储实现会导致解压开销增大。

图2 HDFS块内行存储的例子

列存储

图3显示了在HDFS上按照列组存储表格的例子。在这个例子中,列A和列B存储在同一列组,而列C和列D分别存储在单独的列组。查询时列存储能够避 免读不必要的列,并且压缩一个列中的相似数据能够达到较高的压缩比。然而,由于元组重构的较高开销,它并不能提供基于Hadoop系统的快速查询处理。列 存储不能保证同一记录的所有域都存储在同一集群节点,例如图2的例子中,记录的4个域存储在位于不同节点的3个HDFS块中。因此,记录的重构将导致通过 集群节点网络的大量数据传输。尽管预先分组后,多个列在一起能够减少开销,但是对于高度动态的负载模式,它并不具备很好的适应性。除非所有列组根据可能的 查询预先创建,否则对于一个查询需要一个不可预知的列组合,一个记录的重构或许需要2个或多个列组。再者由于多个组之间的列交叠,列组可能会创建多余的列 数据存储,这导致存储利用率的降低。

图3 HDFS块内列存储的例子

PAX混合存储

PAX存储模型(用于Data Morphing存储技术)使用混合存储方式,目的在于提升CPU Cache性能。对于记录中来自不同列的多个域,PAX将它们放在一个磁盘页中。在每个磁盘页中,PAX使用一个迷你页来存储属于每个列的所有域,并使用 一个页头来存储迷你页的指针。类似于行存储,PAX对多种动态查询有很强的适应能力。然而,它并不能满足大型分布式系统对于高存储空间利用率和快速查询处 理的需求,原因在于:首先,PAX没有数据压缩的相关工作,这部分与Cache优化关系不大,但对于大规模数据处理系统是非常关键的,它提供了列维度数据 压缩的可能性;其次,PAX不能提升I/O性能,因为它不能改变实际的页内容,该限制使得大规模数据扫描时不易实现快速查询处理;再次,PAX用固定的页 作为数据组织的基本单位,按照这个大小,在海量数据处理系统中,PAX将不会有效存储不同大小类型的数据域。本文介绍的是RCF i l e 数据存储结构在Hadoop系统上的实现。该结构强调:第一,RCFile存储的表是水平划分的,分为多个行组, 每个行组再被垂直划分, 以便每列单独存储;第二,RCFile在每个行组中利用一个列维度的数据压缩,并提供一种Lazy解压(decompression)技术来在查询执行时 避免不必要的列解压;第三,RCFile支持弹性的行组大小,行组大小需要权衡数据压缩性能和查询性能两方面。

RCFile的设计与实现

RCFile(Record Columnar File)存储结构遵循的是“先水平划分,再垂直划分”的设计理念,这个想法来源于PAX。它结合了行存储和列存储的优点:首先,RCFile保证同一行 的数据位于同一节点,因此元组重构的开销很低;其次,像列存储一样,RCFile能够利用列维度的数据压缩,并且能跳过不必要的列读取。图4是一个 HDFS块内RCFile方式存储的例子。

图4 HDFS块内RCFile方式存储的例子

数据格式

RCFile在HDFS分布式文件系统之上设计并实现,如图4所示,RCFile按照下面的数据格式来存储一张表。

RCFile基于HDFS架构,表格占用多个HDFS块。

每个HDFS块中,RCFile以行组为基本单位来组织记录。也就是说,存储在一个HDFS块中的所有记录被划分为多个行组。对于一张表,所有行组大小都相同。一个HDFS块会有一个或多个行组。

一个行组包括三个部分。第一部分是行组头部的同步标识,主要用于分隔HDFS块中的两个连续行组;第二部分是行组的元数据头部,用于存储行组单元的 信息,包括行组中的记录数、每个列的字节数、列中每个域的字节数;第三部分是表格数据段,即实际的列存储数据。在该部分中,同一列的所有域顺序存储。从图 4可以看出,首先存储了列A的所有域,然后存储列B的所有域等。

压缩方式

RCFile的每个行组中,元数据头部和表格数据段分别进行压缩。

对于所有元数据头部,RCFile使用RLE(Run Length Encoding)算法来压缩数据。由于同一列中所有域的长度值都顺序存储在该部分,RLE算法能够找到重复值的长序列,尤其对于固定的域长度。

表格数据段不会作为整个单元来压缩;相反每个列被独立压缩,使用Gzip压缩算法。RCFile使用重量级的Gzip压缩算法,是为了获得较好的压 缩比,而不使用RLE算法的原因在于此时列数据非排序。此外,由于Lazy压缩策略,当处理一个行组时,RCFile不需要解压所有列。因此,相对较高的 Gzip解压开销可以减少。

尽管RCFile对表格数据的所有列使用同样的压缩算法,不过如果使用不同的算法来压缩不同列或许效果会更好。RCFile将来的工作之一可能就是根据每列的数据类型和数据分布来自适应选择最好的压缩算法。

数据追加

RCFile不支持任意方式的数据写操作,仅提供一种追加接口,这是因为底层的HDFS当前仅仅支持数据追加写文件尾部。数据追加方法描述如下。

RCFile为每列创建并维护一个内存column holder,当记录追加时,所有域被分发,每个域追加到其对应的column holder。此外,RCFile在元数据头部中记录每个域对应的元数据。

RCFile提供两个参数来控制在刷写到磁盘之前,内存中缓存多少个记录。一个参数是记录数的限制,另一个是内存缓存的大小限制。

RCFile首先压缩元数据头部并写到磁盘,然后分别压缩每个column holder,并将压缩后的column holder刷写到底层文件系统中的一个行组中。

数据读取和Lazy解压

在MapReduce框架中,mapper将顺序处理HDFS块中的每个行组。当处理一个行组时,RCFile无需全部读取行组的全部内容到内存。

相反,它仅仅读元数据头部和给定查询需要的列。因此,它可以跳过不必要的列以获得列存储的I/O优势。例如,表tbl(c1, c2, c3, c4)有4个列,做一次查询“SELECT c1 FROM tbl WHERE c4 = 1”,对每个行组,RCFile仅仅读取c1和c4列的内容。在元数据头部和需要的列数据加载到内存中后,它们需要解压。元数据头部总会解压并在内存中维 护直到RCFile处理下一个行组。然而,RCFile不会解压所有加载的列,相反,它使用一种Lazy解压技术。

Lazy解压意味着列将不会在内存解压,直到RCFile决定列中数据真正对查询执行有用。由于查询使用各种WHERE条件,Lazy解压非常有 用。如果一个WHERE条件不能被行组中的所有记录满足,那么RCFile将不会解压WHERE条件中不满足的列。例如,在上述查询中,所有行组中的列 c4都解压了。然而,对于一个行组,如果列c4中没有值为1的域,那么就无需解压列c1。

行组大小

I/O性能是RCFile关注的重点,因此RCFile需要行组够大并且大小可变。行组大小和下面几个因素相关。

行组大的话,数据压缩效率会比行组小时更有效。根据对Facebook日常应用的观察,当行组大小达到一个阈值后,增加行组大小并不能进一步增加Gzip算法下的压缩比。

行组变大能够提升数据压缩效率并减少存储量。因此,如果对缩减存储空间方面有强烈需求,则不建议选择使用小行组。需要注意的是,当行组的大小超过4MB,数据的压缩比将趋于一致。

尽管行组变大有助于减少表格的存储规模,但是可能会损害数据的读性能,因为这样减少了Lazy解压带来的性能提升。而且行组变大会占用更多的内存, 这会影响并发执行的其他MapReduce作业。考虑到存储空间和查询效率两个方面,Facebook选择4MB作为默认的行组大小,当然也允许用户自行 选择参数进行配置。

小结

本文简单介绍了RCFile存储结构,其广泛应用于Facebook公司的数据分析系统Hive中。首先,RCFile具备相当于行存储的数据加载 速度和负载适应能力;其次,RCFile的读优化可以在扫描表格时避免不必要的列读取,测试显示在多数情况下,它比其他结构拥有更好的性能;再 次,RCFile使用列维度的压缩,因此能够有效提升存储空间利用率。

为了提高存储空间利用率,Facebook各产品线应用产生的数据从2010年起均采用RCFile结构存储,按行存储 (SequenceFile/TextFile)结构保存的数据集也转存为RCFile格式。此外,Yahoo公司也在Pig数据分析系统中集成了 RCFile,RCFile正在用于另一个基于Hadoop的数据管理系统Howl(http://wiki.apache.org/pig /Howl)。而且,根据Hive开发社区的交流,RCFile也成功整合加入其他基于MapReduce的数据分析平台。有理由相信,作为数据存储标准 的RCFile,将继续在MapReduce环境下的大规模数据分析中扮演重要角色。

原文地址:http://cloud.csdn.net/a/20110429/296900.html

php中包含头文件的两个函数 require(),require_once() ,include()区别

2011年4月29日 没有评论

1.   require()函数工作方式:   不管在程序的哪个部分使用了这个函数,只有程序一开始运行,头文件的内容就被作为程序本身的一部分来处理。因此,如果您在一个条件判定语句中使用了 require()函数,那么即使这个条件即使不为真,头文件也会被包含进来。 如果用了require()函数,而您指定的头文件并不存在,那么程序将会停止运行并产生错误。就是说再解析程序时即读取require的文件,而不是解 析后,   如果不能读取到被require的文件,就不能进行下一步动作。   所以,不被正确包含就会导致程序的文件,用require比较好。

2.   include()函数只是在执行到这一条语句时才会把头文件内容包含进来。如果程序没运行到这里,那 PHP是不会管它的。这就意味着,您在条件判定部分使用include时,它会完全按照您希望的那样工作。如果您用了include(),程序会产生一个 警告信息,但是会继续运行。

3. require_once() 语句在脚本执行期间包括并运行指定文件。此行为和 require() 语句类似,唯一区别是如果该文件中的代码已经被包括了,则不会再次包括。

实践下,例子如下:

included.php

<?php
echo “included.php 被包含了。”.”<br>”;
?>

include.php

<?php
echo “test include():<br>”;
for($i=0; $i<4; $i++)
include(“included.php”);
echo “test require():<br>”;
for($i=0; $i<4; $i++)
require(“included.php”);

echo “test \” if \” 语句, require():<br>”;
if(1>2){
require(“included.php”);
}
echo “test \” if \” 语句, include():<br>”;
if(1>2){
include(“included.php”);
}
?>

运行结果如下:

test include():
included.php 被包含了。
included.php 被包含了。
included.php 被包含了。
included.php 被包含了。
test require():
included.php 被包含了。
included.php 被包含了。
included.php 被包含了。
included.php 被包含了。
test ” if ” 语句, require():
test ” if ” 语句, include():

原文:http://hi.baidu.com/kkwtre/blog/item/bdb9cc35d1704a1291ef39e8.html

wordpress文章访问统计插件WP-PostViews使用

2011年4月29日 没有评论

wordpress热门文章插件:WP-PostViews使 用方法及下载。相信很多的wordpress博客都安装了WP-PostViews热门文章(日志)插件吧?WP-PostViews 插件用来统计一篇文章阅读次数,配合 WP-PostViews Widget 可以在侧边栏实现显示阅读次数最多的文章或者页面、某分类下阅读次数最多的文章等。热门文章插件可以把你博客上最火,人气最旺的文章展示出来,可以在一定 程度上增加博客的黏度。

不过由于WP-PostViews热门文章插件没有详细的安装使用说明,界面语言又是英文,所以,相信很多人和我一样,可能都是直接在 wordpress小工具(widget)中挂载吧?当然在wordpress小工具(widget)中挂载是比较方便,不过有时候你的博客主题不支持 wordpress小工具(widget)的话,那可能让你无从下手,其实,WP-PostViews热门文章插件也是可以通过代码来挂载的。

如果您使用的主题不支持小工具 ,别担心。您只要把下面的代码加入到 sidebar.php 中合适的地方即可:

显示阅读次数最多的文章或页面:

<?php if (function_exists(‘get_most_viewed’)): ?> <?php get_most_viewed(); ?> <?php endif; ?>

如果你只想显示阅读次数最多的文章,用下面这句:

<?php if (function_exists('get_most_viewed')): ?>
<?php get_most_viewed('post'); ?>
<?php endif; ?>

如果你只想显示10篇阅读次数最多的文章,用下面的代码:

<?php if (function_exists('get_most_viewed')): ?>
<?php get_most_viewed('post',10); ?>
<?php endif; ?>

说明:get_most_viewed 函数的第一个参数决定要显示的类别,可选 post ,page,both,第二个参数决定要显示的篇数。

如果你想显示显示某类别下的阅读次数最多的文章,用下面这段:

<?php if (function_exists('get_most_viewed_category')): ?>
<?php get_most_viewed_category(the_catagory_ID(false)); ?>
<?php endif; ?>

说明:get_most_viewed_category函数有三个参数,第一个值是类别ID,第二个值是类别,可选both,page,post,第三个值决定要显示的篇数。

本文转自:http://czkj.tk/index.php/2011/wordpress%E7%83%AD%E9%97%A8%E6%96%87%E7%AB%A0%E6%8F%92%E4%BB%B6wp-postviews%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95%E5%8F%8A%E4%B8%8B%E8%BD%BD/