购物记录:TP-LINK TL-MR12U

之前买了一个TP-LINK的迷你路由器,平时也只是一直拿他当当3G网卡扩充成WiFi,当当充电宝,我觉得始终没有把它充分利用起来,想着还有没有其他的使用方法。我一直想着能不能给配一个微型网卡,手机周边WiFi信号扩充给手机平板用,可惜中午这点时间没找到解决方案。

不过中午突发想起来这个事情倒使我找了半天我在哪个网站买了这个路由器了。从亚马逊到当当到易迅我都买过东西,让我不知道这个从哪个网买的了。我用惠惠网比价下单,哪个便宜就买哪个,倒使我找不到订单了。惠惠这个网易旗下不大点的网站或许会从获取到些微妙的东西吧。用户自愿告诉惠惠订单,网站也会愿意给这个不大点的网站爬数据比价,或许等惠惠长大了就不好做了,但是目前还是对个大电子商城木有影响的。不罗嗦了。写这篇文章也只是想做些记录罢了,以免哪天又异想天开却找不到任何资源,想不起来任何关键字了。

我在亚马逊下单 TP-LINK TL-MR12U 5200mAh移动电源+150M无线便携式3G路由器
单上付费¥ 155.00 
TP-LINK官网该产品地址:http://www.tp-link.com.cn/product_150m_288.html

CVS

CVS是Concurrent Version System(并行版本系统)的缩写,用于版本管理.如果大家曾经参与过多人协作开发的项目,大家肯定有这样的痛苦经历:由于多个人同时修改同一个文件, 自己辛辛苦苦修改的程序被别人彻底删除了.另外,如果你的软件/程序已经发布了三个版本, 而这时候用户需要你修改第二个版本的东西,也许你会因为只保留了最新版本而痛哭流涕。还有就是你对程序做了一些修改,但是修改很少,你只想给远方的同事发 一个两个版本之间的差别文件,这样可以免于邮箱不够大,网速太慢之类的问题.为了解决类似这样的问题,以及诸如生成补丁文件,历史版本修改等,一帮黑客 (褒义)在原先 Unix 体系里很成熟的 SCCS 和 RCS 的基础上,开发了 CVS。(SCCS:Source Code Control System,RCS:Revision Control System)。
CVS 的基本工作思路是这样的:在一台服务器上建立一个仓库,仓库里可以存放许多不同项目的源程序。由仓库管理员统一管理这些源程序.这样,就好象只有一个人在 修改文件一样.避免了冲突.每个用户在使用仓库之前,首先要把仓库里的项目文件下载到本地。用户做的任何修改首先都是在本地进行,然后用 cvs 命令进行提交,由 cvs 仓库管理员统一 修改.这样就可以做到跟踪文件变化,冲突控制等等.
由于 CVS 是典型的 C/S 结构的软件,因此它也分成服务器端和客户端两部分。不过大多数CVS 软件都把它们合二为一了。我们这里就分别从服务器和客户端的角度讨论cvs的使用。

Cvs服务器安装

首先确保系统安装有cvs:
[root@mail xinetd.d]# rpm -qa|grep cvs
cvs-1.11.1p1-3
如果命令输出类似于上面的输出则说明系统已经安装有cvs,否则就需要从安装光盘中安装cvs的rpm包。

一 创建CVS属主用户:
# useradd -d /cvsroot cvs
# chmod 771 /cvsroot

二、建立CVS仓库(初始化cvs)

# su cvs
$ cvs -d /cvsroot init
$exit
#

四、启动cvs服务器

在/etc/xinetd.d/目录下创建文件cvspserver,内容如下:
# default: on
# description: The cvs server sessions;

service cvspserver
{
socket_type = stream
wait = no
user = root
server = /usr/bin/cvs
server_args = -f --allow-root=/cvsroot pserver
log_on_failure += USERID
only_from = 192.168.0.0/24
}
其中only_from是用来限制访问的,可以根据实际情况不要或者修改。
修改该文件权限:
# chmod 644 cvspserver
然后重新启动xinetd:
# /etc/rc.d/init.d/xined restart
然后察看cvs服务器是否已经运行:
[root@mail xinetd.d]# netstat -lnp|grep 2401
tcp 0 0 0.0.0.0:2401 0.0.0.0:* LISTEN 7866/xinetd
则说明cvs服务器已经运行。

五、创建用来访问cvs的用户

前面创建的cvs用户是cvs仓库管理用户,而为了让用户访问则还需要一个访问用户:
# useradd cvspub
# usemod -G cvs cvspub
这里添加了一个用户cvspub,并且将该用户添加到cvs组中。

六、管理cvs服务器

管 理 cvs 服务器.服务器可以用了,现在大家最关心的就是如何管理服务器,比如,我想让一些人有读和/或写 CVS 仓库的权限,但是不想给它系统权限怎么办呢?不难,cvs初始化结束以后,在管理员用户(这里是cvs用户)的主目录里有一个 CVSROOT 目录,这个目录里有三个配置文件:passwd, readers, writers。我们可以通过设置这三个文件来配置 CVS 服务器,下面分别介绍这几个文件的作用:
passwd:cvs 用户的用户列表文件,它的格式很象 shadow 文件:
{cvs 用户名}:[加密的口令]:[等效系统用户名]
如果你希望一个用户只是 cvs 用户,而不是系统用户,那么你就要设置这个文件,刚刚安装完之后这个文件可能不存在,你需要以cvs管理员身份(su cvs)用户手工创建,当然要按照上面格式;
第 二个字段是该用户的加密口令,就是用 crypt (3) 加密的,你可以自己写一个程序来做加密,也可以用两个偷懒的方法:先创建一个系统用户,名字和 cvs 用户一样,口令就是准备给它的 cvs 用户口令,创建完之后从 /etc/shadow 把该用户第二个字段拷贝过来,然后 再把这个用户删除.这个方法对付数量少的用户比较方便,人一多就不合适了,而且还有冲突条件(race condition)的安全隐患,还要 root 权限,实在不怎么样,不过权益之计而已;另外一个方法就是利用apche的htpasswd命令创建passwd用户,添加用户只需要htpasswd passwd username即可添加用户到passwd文件中,不过需要在文件中对应行的最后添加一个":"冒号和对应的等效系统用户名;最好的就是自己编写一个程 序了来生成这个passwd文件了。
第三个字段就是等效系统用户名,实际上就是赋与一个 cvs 用户一个等效的系统用户的权限,看下面的例子你就明白它的功能了。
readers:有 cvs 读权限的用户列表文件,就是一个一维列表。在这个文件中的用户对 cvs
只有读权限。
writers:有 cvs 写权限的用户的列表文件,和 readers 一样,是一个一维列表。在这个文件中的用户对 cvs 有写权限。
上面三个文件在缺省安装的时候可能都不存在,需要我们自己创建,好吧,现在还是让我们用一个例子来教学吧.假设我们有下面几个用户需要使用 cvs:
laser, gumpwu, henry, betty, anonymous
其中 laser 和 gumpwu 是系统用户,而henry, betty, anonymous 我们都不想给系统用户权限,并且 betty 和 anonymous 都是只读用户,而且 anonymous 更是连口令都没有。
然后编辑 cvs 管理员家目录里 CVSROOT/passwd 文件,加入下面几行:

laser:$xxefajfka;faffa33:cvspub
gumpwu:$ajfaal;323r0ofeeanv:cvspub
henry:$fajkdpaieje:cvspub
betty:fjkal;ffjieinfn/:cvspub
anonymous::cvspub
注意:上面的第二个字段(分隔符为 :)是密文口令,你要用程序或者用我的土办法生成。
编辑 readers 文件,加入下面几行:
anonymous
betty
编辑 writer 文件,加入下面几行:
laser
gumpwu
henry
这样就 ok 了,你再用几个用户分别登陆测试,就会发现一切都 ok 了。这里面的原理和说明我想就不多说了,其实很简单,和系统管理用户的概念是一样的。

七、建立新的CVS项目

一般我们都已经有一个或多个项目了,这样我们可以用下面步骤生成一个新的CVS项目。
将一个工程文件置于CVs中进行版本控制,在CVS 术语中称作导入(import)。从名字上就可以看出,在导入前需要为此作些准备工作。
输 入操作的基本要求是有个"干净"的目录结构。"干净"的意思是不需要版本控制的文件都被移走了(如编译生成的文件,备份文件等等)。如果工程已经开始一段 时间了,这就显得很重要。在目录中也许有些是不打算将其置于版本控制下的文件,但是又想将他们放在这里,这种情况下,你要在输入之前将它们移走,然后再移 回来。
注意的是CVS 认为空目录是不存在的。如果想增加一个既不包含文件又不包含子目录的目录,需要在其下创建一个哑文件。建议你创建一个名为 README.txt 的文件,其内容为对目录的简要说明。
进入到已有项目的目录,比如叫 cvstest:
$cd cvstest
运行命令将项目文件导入到cvs仓库中:
$cvs import -m "this is a cvstest project" cvstest v_0_0_1 start
说明:import 是cvs的命令之一,表示向cvs仓库输入项目文件.
-m参数后面的字串是描述文本,对项目进行描述,如果不加 -m 参数,那么cvs会自动运行一个编辑器(一般是vi,但是可以通过修改环境变量EDITOR来改成你喜欢用的编辑器)让你输入信息,cvstest 是项目名称(实际上是仓库名,在CVS服务器上会存储在以这个名字命名的仓库里)
v_0_0_1是这个分支的总标记.没啥用(或曰不常用)
start 是每次 import 标识文件的输入层次的标记,没啥用。
这样我们就建立了一个CVS仓库了,然后,我们可以把这个测试项目的文件删除,试验如何从仓库获取文件这会在后面的客户端文章进行说明。

Timer详解

概览

这个小例子可以说明一些用Timer线程实现和计划执行一个任务的基础步骤:
  • 实现自定义的TimerTask的子类,run方法包含要执行的任务代码
  • 实例化Timer类,创建计时器后台线程。
  • 实例化任务对象 (new RemindTask()).
  • 制定执行计划。这里用schedule方法,第一个参数是TimerTask对象,第二个参数表示开始执行前的延时时间(单位是milliseconds,这里定义了5000)。还有一种方法可以指定任务的执行时间,如下例,指定任务在11:01 p.m.执行:
//Get the Date corresponding to 11:01:00 pm today.
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUROFDAY, 23);
calendar.set(Calendar.MINUTE, 1);
calendar.set(Calendar.SECOND, 0);
Date time = calendar.getTime();
timer = new Timer();
timer.schedule(new RemindTask(), time);

终止Timer线程

默认情况下,只要一个程序的timer线程在运行,那么这个程序就会保持运行。当然,你可以通过以下四种方法终止一个timer线程:
  • 调用timer的cancle方法。你可以从程序的任何地方调用此方法,甚至在一个timer task的run方法里。
  • 让timer线程成为一个daemon线程(可以在创建timer时使用new Timer(true)达到这个目地),这样当程序只有daemon线程的时候,它就会自动终止运行。
  • 当timer相关的所有task执行完毕以后,删除所有此timer对象的引用(置成null),这样timer线程也会终止。
  • 调用System.exit方法,使整个程序(所有线程)终止。
Reminder的例子使用了第一种方式。在这里不能使用第二种方式,因为这里需要程序保持运行直到timer的任务执行完成,如果设成daemon,那么当main线程结束的时候,程序只剩下timer这个daemon线程,于是程序不会等timer线程执行task就终止了。
有些时候,程序的终止与否并不只与timer线程有关。举个例子,如果我们使用AWT来beep,那么AWT会自动创建一个非daemon线程来保持程序的运行。下面的代码我们对Reminder做了修改,加入了beeping功能,于是我们需要加入System.exit的调用来终止程序。
import java.util.Timer;
import java.util.TimerTask;
import java.awt.Toolkit;

/**
* Simple demo that uses java.util.Timer to schedule a task to execute
* once 5 seconds have passed.
*/

public class ReminderBeep {
    Toolkit toolkit;
    Timer timer;

    public ReminderBeep(int seconds) {
        toolkit = Toolkit.getDefaultToolkit();
        timer = new Timer();
        timer.schedule(new RemindTask(), seconds*1000);
    }

    class RemindTask extends TimerTask {
        public void run() {
            System.out.println("Time's up!");
    toolkit.beep();
    //timer.cancel(); //Not necessary because we call System.exit
    System.exit(0);   //Stops the AWT thread (and everything else)
        }
    }

    public static void main(String args[]) {
System.out.println("About to schedule task.");
        new ReminderBeep(5);
System.out.println("Task scheduled.");
    }
}
  • schedule(TimerTask task, long delay, long period)
  • schedule(TimerTask task, Date time, long period)
  • scheduleAtFixedRate(TimerTask task, long delay, long period)
  • scheduleAtFixedRate(TimerTask task, Date firstTime, long period)
当计划反复执行的任务时,如果你注重任务执行的平滑度,那么请使用schedule方法,如果你在乎的是任务的执行频度那么使用scheduleAtFixedRate方法。 例如,这里使用了schedule方法,这就意味着所有beep之间的时间间隔至少为1秒,也就是说,如果有一个beap因为某种原因迟到了(未按计划执行),那么余下的所有beep都要延时执行。如果我们想让这个程序正好在3秒以后终止,无论哪一个beep因为什么原因被延时,那么我们需要使用scheduleAtFixedRate方法,这样当第一个beep迟到时,那么后面的beep就会以最快的速度紧密执行(最大限度的压缩间隔时间)。

进一步分析schedule和scheduleAtFixedRate

(1)2个参数的schedule在制定任务计划时, 如果指定的计划执行时间scheduledExecutionTime<=systemCurrentTime,则task会被立即执行。scheduledExecutionTime不会因为某一个task的过度执行而改变。
(2)3个参数的schedule在制定反复执行一个task的计划时,每一次执行这个task的计划执行时间随着前一次的实际执行时间而变,也就是scheduledExecutionTime(第n+1次)=realExecutionTime(第n次)+periodTime。也就是说如果第n次执行task时,由于某种原因这次执行时间过长,执行完后的systemCurrentTime>=scheduledExecutionTime(第n+1次),则此时不做时隔等待,立即执行第n+1次task,而接下来的第n+2次task的scheduledExecutionTime(第n+2次)就随着变成了realExecutionTime(第n+1次)+periodTime。说白了,这个方法更注重保持间隔时间的稳定。
(3)3个参数的scheduleAtFixedRate在制定反复执行一个task的计划时,每一次执行这个task的计划执行时间在最初就被定下来了,也就是scheduledExecutionTime(第n次)=firstExecuteTime+nperiodTime;如果第n次执行task时,由于某种原因这次执行时间过长,执行完后的systemCurrentTime>=scheduledExecutionTime(第n+1次),则此时不做period间隔等待,立即执行第n+1次task,而接下来的第n+2次的task的scheduledExecutionTime(第n+2次)依然还是firstExecuteTime+(n+2)periodTime这在第一次执行task就定下来了。说白了,这个方法更注重保持执行频率的稳定。
http://blog.csdn.net/gtuu0123/article/details/6040159
  1. schedule方法:“fixed-delay”;如果第一次执行时间被delay了,随后的执行时间按 照 上一次 实际执行完成的时间点 进行计算
  2. scheduleAtFixedRate方法:“fixed-rate”;如果第一次执行时间被delay了,随后的执行时间按照 上一次开始的 时间点 进行计算,并且为了”catch up”会多次执行任务,TimerTask中的执行体需要考虑同步
  3. schedule方法:下一次执行时间相对于 上一次 实际执行完成的时间点 ,因此执行时间会不断延后
  4. scheduleAtFixedRate方法:下一次执行时间相对于上一次开始的 时间点 ,因此执行时间不会延后,存在并发性

一些注意的问题

每一个Timer仅对应唯一一个线程。 Timer不保证任务执行的十分精确。 Timer类的线程安全的。 参考
void
cancel() Cancels the Timer and all scheduled tasks.
int purge() Removes all canceled tasks from the task queue.
void schedule(TimerTask task, Date when, long period) Schedule a task for repeated fixed-delay execution after a specific time has been reached. 直到when设定的时间开始,间隔period时间执行一次task,间隔时间是从task完成之后开始计时
void schedule(TimerTask task, long delay, long period) Schedule a task for repeated fixed-delay execution after a specific delay. 等待delay时间,每间隔period时间执行task
void
schedule(TimerTask task, Date when) Schedule a task for single execution. 直到when执行一次task
void
schedule(TimerTask task, long delay) Schedule a task for single execution after a specified delay. 等待delay时间执行一次task
void
scheduleAtFixedRate(TimerTask task, long delay, long period) Schedule a task for repeated fixed-rate execution after a specific delay has passed. 等待delay设定时间,间隔period时间执行一次task,间隔时间是从task开始之后计时,可能task完成需要的时间超过period的时间,则有可能同时有多个task在执行。
void
scheduleAtFixedRate(TimerTask task, Date when, long period) Schedule a task for repeated fixed-rate execution after a specific time has been reached. 直到when设定的时间开始,间隔period时间执行一次task,间隔时间是从task开始之后计时
public class TimeThread extends Thread {

 Handler handler = new Handler(){

  @Override
  public void handleMessage(Message msg) {
   // TODO Auto-generated method stub
   super.handleMessage(msg);
   switch (msg.what) {
   case 1:
    long sysTime = System.currentTimeMillis();
    CharSequence sysTimeStr = DateFormat.format("hh:mm:ss", sysTime);
    tv.setText(sysTimeStr);
    break;

   default:
    break;
   }
  }
 };
 
 @Override
 public void run() {
  do {
   try {
    Thread.sleep(1000);
    Message msg = new Message();
    msg.what = 1;
    handler.sendMessage(msg);
    
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
   
  } while (true);
 }
}

测试Timer

测试Android中Timer使用MainActivity,以下只是一个简简单单的测试工程,关于Timer的详细讲解在这里
package com.einverne.testtimer;

import java.util.Timer;
import java.util.TimerTask;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {

 private static String TAG = "EV_DEBUG";
 private Timer timer;
 Integer integer;

 private TextView tv;
 private Button button_start;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  tv = (TextView) findViewById(R.id.textView_time);
  button_start = (Button) findViewById(R.id.button_start);

  integer = new Integer(0);
  new TimeThread().start();

  findViewById(R.id.button_start).setOnClickListener(
    new OnClickListener() {

     @Override
     public void onClick(View v) {
      // TODO Auto-generated method stub
      timer = new Timer();
      integer = 0;
      timer.schedule(new timerTask(), 0, 1000);
      button_start.setEnabled(false);
     }
    });

  findViewById(R.id.button_end).setOnClickListener(new OnClickListener() {

   @Override
   public void onClick(View v) {
    // TODO Auto-generated method stub
    timer.cancel();
    button_start.setEnabled(true);
   }
  });
  
  

 }

 public class timerTask extends TimerTask {

  @Override
  public void run() {
   // TODO Auto-generated method stub
   integer++;
   String time = integer.toString();
   Log.d(TAG, time);
  }
 }

 public class TimeThread extends Thread {
  Handler handler = new Handler() {
   @Override
   public void handleMessage(Message msg) {
    super.handleMessage(msg);
    switch (msg.what) {
    case 1:
     tv.setText(integer.toString());
     break;

    default:
     break;
    }
   }
  };
  @Override
  public void run() {
   do {
    try {
     Thread.sleep(1000);
     Message msg = new Message();
     msg.what = 1;
     handler.sendMessage(msg);

    } catch (InterruptedException e) {
     e.printStackTrace();
    }

   } while (true);
  }
 }

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  // Inflate the menu; this adds items to the action bar if it is present.
  getMenuInflater().inflate(R.menu.main, menu);
  return true;
 }

}

Android 下载图片

为了学习AsyncTask,网络连接下载图片,我就随便参照教程写了一个例子.代码如下:
MainActivity:
package com.einverne.testdownloadpic;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.widget.ImageView;

public class MainActivity extends Activity {

 ImageView iv;
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  
  iv = (ImageView)findViewById(R.id.imageView1);
  String url = "http://f.hiphotos.baidu.com/album/pic/item/aa64034f78f0f7366a7c4bdf0a55b319eac41369.jpg?psign=6a7c4bdf0a55b319ebc4b74543a98226cefc1e178b823751";
  
  new setImageViewData().execute(url);
 }

 /**
  * 
  * 异步加载图片
  *
  */
 public class setImageViewData extends AsyncTask{

  @Override
  protected Bitmap doInBackground(String... params) {
   Log.d("EV_DEBUG", "setImageViewData doInBackground");
   return getBitmap(params[0]);
  }

  @Override
  protected void onPostExecute(Bitmap bitmap) {
   Log.d("EV_DEBUG", "setImageViewData onPostExecute");
   iv.setImageBitmap(bitmap);
  }

  @Override
  protected void onPreExecute() {
   Log.d("EV_DEBUG", "setImageViewData onPreExecute");
  }
 }
 
 /**
  * get url and return Bitmap
  * @param url
  * @return Bitmap
  */
 public Bitmap getBitmap(String url){
  URL myFileurl = null;
  Bitmap bitmap = null;
  try {
   myFileurl = new URL(url);
  } catch (MalformedURLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
   return null;
  }
  try {
   HttpURLConnection  httpURLConnection = (HttpURLConnection) myFileurl.openConnection();
   httpURLConnection.setDoInput(true);
   httpURLConnection.connect();
   InputStream inputStream = httpURLConnection.getInputStream();
   bitmap = BitmapFactory.decodeStream(inputStream);
   inputStream.close();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  return bitmap;
 }
 
 
 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  // Inflate the menu; this adds items to the action bar if it is present.
  getMenuInflater().inflate(R.menu.main, menu);
  return true;
 }

}

最后别忘了在Android权限中添加Internet权限.很重要的,不然会出错.

Android Context几种获取方法区别

在Android开发中常常遇到Context(上下文)这个参数,调用很多函数的时候经常要传递这个参数过去.而默认Android中有好几个函数返回值是Context变量,而这些函数也不知道原理是啥.所以Google搜了一下在stackoverflow上看到有人回答,就顺便贴过来,备忘吧.


getApplicationContext() Application context is associated with the Application and will always be the same throughout the life cycle.
这个函数返回的这个Application的上下文,所以是与app挂钩的,所以在整个生命周期里面都是不变的

getBasecontext() should not be used just use Context instead of it which is associated with the activity and could possible be destroyed when the activity is destroyed.
stackoverflow上面写的是,这个函数不应该被使用,用Context代替,而Context是与activity相关连,所以当activity死亡后可能会被destroyed

getApplication() is available to Activity and Services only. Although in current Android Activity and Service implementations, getApplication() and getApplicationContext() return the same object, there is no guarantee that this will always be the case (for example, in a specific vendor implementation). So if you want the Application class you registered in the Manifest, you should never call getApplicationContext() and cast it to your application, because it may not be the application instance (which you obviously experienced with the test framework).
getApplication只能被Activity和Services使用,虽然在现在的android的实现中,getApplication和getApplicationContext返回一样的对象,但也不能保证这两个函数一样(例如在特殊的提供者来说),所以如果你想得到你在Manifest文件里面注册的App class,你不要去调用getApplicationContext,以为你可能得不到你所要的app实例(你显然有测试框架的经验)。。。。

getParent() returns object of the activity if the current view is a child..In other words returns the activity object hosting the child view when called within the child.
返回activity的上下文,如果这个子视图的话,换句话说,就是当在子视图里面调用的话就返回一个带有子视图的activity对象

在语句 AlertDialog.Builder builder = new AlertDialog.Builder(this); 中,要求传递的 参数就是一个context,在这里我们传入的是this,那么这个this究竟指的是什么东东呢? 这里的this指的是Activity.this,是这个语句所在的Activity的this,是这个Activity 的上下文。网上有很多朋友在这里传入getApplicationContext(),这是不对的。 AlertDialog对象是依赖于一个View的,而View是和一个Activity对应的。 于是,这里涉及到一个生命周期的问题,this.getApplicationContext()取的是这个应 用程序的Context,Activity.this取的是这个Activity的Context,这两者的生命周期是不同 的,前者的生命周期是整个应用,后者的生命周期只是它所在的Activity。而AlertDialog应 该是属于一个Activity的,在Activity销毁的时候它也就销毁了,不会再存在;但是,如果传 入getApplicationContext(),就表示它的生命周期是整个应用程序,这显然超过了它 的生命周期了。 所以,在这里我们只能使用Activity的this。

在找以上四个区别的时候又发现360DOC上面的Context的介绍文
Android上的Context

不过查一遍我还是没找到区别,我可能还是不知道区别在哪里....
update:2013/12/24
今天重新回顾一下,貌似有点明白了,和生命周期有关系,Context上下文,依赖关系。

《他们》主题曲

從《致老去的我》起,邵夷贝这个名字我就没有忘记。虾米上她的歌我听了一遍又一遍。今天又看到她创作的另一首歌《他们》

在宽阔的马路边狭窄的小巷
我们蜗居着仰望远方的富丽堂皇
陋室里现实的哀伤
被涂上幻想的蜜糖
我们试着去相信美好未来的想像
在和平的年代里一片繁荣的景象
我们创造并承担发展带来的影响
肩上负担着重量
很难看清楚前方
只能努力去修补残缺的现状
我们一直在等待 我们努力去坚强
我们在忍耐中磨练内心的宽广
我们渴望被关爱 我们呵护着希望
我们相信这时代会被真诚改良
在晃动的公车里塞满空荡的心房
我们始终在遵循人生的奔波匆忙
创造太多繁华风光
从来没有机会欣赏
我们还在寻找幸福的模样
在闪动的屏幕前激动而焦急地观望
我们无助却渴望能给他人力量
平凡不平庸的愿望
无声却格外地响亮
我们一直在传递温暖的火光
我们一直在等待 我们努力去坚强
我们在忍耐中磨练内心的宽广
我们渴望被关爱 我们呵护着希望
我们相信这时代会被真诚改良
我们不断在挫败中微笑着启航

YouTube稍后

安装VC的纠结过程


帮同学安装VC 6.0

安装vc6.0出现如下错误:
C:\program files\commonfiles\microsoft shared\Repostry\RepcDlg.ocx
注册失败,是由于瑞星的进程在起作用.解决办法:启动的时候按F8进入安全模式安装,就好了.

上面这段是网上找到的解决方案,不过我在安全模式下,安装VC6.0.的时候还是有问题......然后我进入系统,卸载瑞星,金山,(随便删除了我看的不爽的百度工具栏,SOSO工具栏啦.. :) )然后重试.果然,OK了...

好无语...害我之前还找什么注册反注册OCX,DLL....无语.

Galaxy Nexus Root 4.2.2

准备工作

Root你的手机需要用到以下工具 ClockworkMod (CWM) Recovery 6.0.2.3 第三方的recovery SuperSU v1.04

先决条件

  • Galaxy Nexus I9250应该运行的是Android 4.2.2 JDQ39固件.你可以到"设置"-"关于手机"查看版本号码
  • Galaxy Nexus手机的USB驱动要安装好
  • 开启USB调试模式
  • 在root之前备份你的数据,应用和设置
  • 你的手机最好有充足的电量
  • PS.以下教程针对已经解锁的GN手机

Root

  • Step1:下载 SuperSU v1.25
  • Step2:将手机用USB线与电脑相连
  • Step3:将SuperSu zip文件拷贝到手机SD卡目录,确保你能够找到这个文件(最好在SD卡根目录)
  • Step4:下载 recovery-clockwork-touch-6.0.2.3-maguro(recovery-clockwork-touch-6.0.2.3-maguro.img)解压获取压缩包中img文件
  • Step5:进入Fastboot/bootloader模式.关闭手机,等待手机关闭之后,同时按住音量上+音量下+电源键,等待数秒
  • Step6:运行命令行进入有recovery-clockwork-touch-6.0.2.3-maguro.img文件的目录,运行一下命令:
fastboot flash recovery recovery-clockwork-touch-6.0.2.3-maguro.img
  • Step7:在fastboot界面选择recovery选项,你会进入新刷入的ClockworkMod recovery
  • Step8:在ClockworkMod recovery,选择"flash zip from SD card"
  • Step9:利用电源键选择"choose zip from sdcard"
  • Step10:使用音量键选择"UPDATE-SuperSU-v1.25.zip",用电源键选择
  • Step11:一旦刷入成功,选择"reboot system now"重启手机.成功
注:如果提示是否清除recovery flash,请选No,否则下次推送时无法进行OTA更新
1、按照我的步骤root不会影响OTA更新,因为在退出recovery模式时提示是否清除recovery flash,你要选择No,这样重启后recovery会自动恢复官方版本(不过OTA之后需要重新root);
2、万一你选择了Yes,也没关系,官方镜像已经出了,重新刷入官方镜像的recovery即可;
3、这里提供的clockwork recovery是触屏版的,直接用手点就可以了,不过小心别点错了。
个人认为这种root方式最完美,因为几乎没有改动任何文件,而且几乎适合任何机型。
4.2.2 takju官方recovery
参考:1 2

我到底要不要买树莓派

树莓派这个词一直在我的Any.DO中,最早是从G+兔纸那里知道树莓派这个东西,后来又在各种媒体上面看到这个树莓派的东西,还知道了Google赠送个某个学校多少多少的树莓派,于是这个东西是什么,就是我必须弄明白的了。

树莓派究竟是什么

一句话概括:他就是一台微型电脑主机,没有外设,但是电脑的各种功能一样都不缺,只要你能够想得到就能够用他来实现。 具体请看官方解释,或者维基百科

到底要不要买树莓派

Google+果然是个极客的地方,后来又发现了一个中文树莓派社群 虽然很想买树莓派,可是我是那种非常理性的买家,我不会想到就去买,但是我又说服不了我自己去购买,因为没有充分的理由。而各种设备的缺失却让我更加不敢买这个设备了。 1.没有显示器 2.没有外接键盘和鼠标 3.可能还需要购置微型无线网卡 4.学校的网络环境实在不敢恭维,还需要网页验证,一个账号只能登陆一次,树莓派买来联网也是一个问题,不过这个问题回到家就能解决了 .还有很多。。。
看到兔纸分享的用树莓派搭载的下载器或许多了一个购买的理由
社群中看到有人在这里买的.还有人在这里 http://item.taobao.com/item.htm?spm=2013.1.w18205233029.10.4Dl4Y4&id=21433912601
陈少举买的
树莓派 raspberry pi 送外壳 国标红板 升级版 Rev2 512M
树莓派官方Taobao,不过假的很
ickey团购

其他资料

各种版本的区别
关于树莓派红版和绿版 红版是国内厂家代工的,功能上完全一样。 红版用的是现代的内存颗粒,绿版用的是三星的内存颗粒。 所以 2013.2月以前的镜像不能直接写入红版使用,需要替换部分文件。 绿板电源芯片是安森美(ON)的,红板是其他厂家。 红版去掉了CE和FC的标识,生产地“made in china”是打印在板上的,并非以前的贴标设计。 个人买家的个人消费记录
通过树莓派学习计算机
树莓派Raspberry Pi与主机进行文件同步
雷锋网中一份很详细的测评
论坛上的一份测评
Raspberry Pi教学手册
其实以上内容我都是从Google+搜索得到的.

结论

目前我还是不买了.等到我能够在稳定的网络环境中,等我赚了足够的钱,我立马下手.

Quote Of The Day