购物记录: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+搜索得到的.

结论

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

Google的DNS服务器

DNS服务器

DNS叫做域名解析服务,DNS服务器在现在的网络环境中有着非常重要的作用,DNS服务器扮演的角色就是将你在地址栏中输入的域名(比如,www.google.com)解析成IP地址,然后通过IP地址去访问该网站,所以解析域名的快慢直接影响到你访问网站的速度.所以Google在2009年推出了Google的DNS解析服务

DNS劫持

DNS劫持就是通过劫持了DNS服务器,通过某些手段取得某域名的解析记录控制权,进而修改此域名的解析结果,导致对该域名的访问由原IP地址转入到修改后的指定IP,其结果就是对特定的网址不能访问或访问的是假网址,从而实现窃取资料或者破坏原有正常服务的目的。DNS劫持通过篡改DNS服务器上的数据返回给用户一个错误的查询结果来实现的。
DNS劫持症状:在某些地区的用户在成功连接宽带后,首次打开任何页面都指向ISP提供的“电信互联星空”、“网通黄页广告”等内容页面。还有就是曾经出现过用户访问Google域名的时候出现了百度的网站。这些都属于DNS劫持。
再说简单点,当你输入google.com这个网址的时候,你看到的网站却是百度的首页。
参考
中国特殊的网络环境,有的时候通过修改DNS服务器就能让你上网的速度更快,能上的网站更多.

如何设置DNS

言归正传,在Windows 7下设置DNS,只要在"网络与共享中心"-本地连接-属性-Internet协议版本里面设置DNS服务器就行了.
IPv6 DNS服务器地址:
2001:4860:4860::8888
2001:4860:4860::8844
IPv4 DNS服务器地址:
8.8.8.8
8.8.4.4
如果身在一个IPv6的环境使用IPv6的DNS服务还是挺快的.

其他

我在其他网站上面还看到有未被透露的Google DNS服务器地址:4.3.2.1 很可惜我做Ping测试和nslookup测试的时候,这个地址已经不行了.
参考:1 2

我为什么要写博客

可能吧
因为在中国,所以有话题
我认为博客应该是输出价值观的,文章中应该体现人的思想,而不是冷冰冰的文字。
编程随想的博客
为啥俺要写这个博客——动机的自我分析
提升思维能力,扩大知识面,加深理解,表达能力······
土木坛子
生命不息,博客不止
生命不息,博客不止。我写博客不是为了其它什么东西,只是记录一下我自己的想法,记录我所经历的一些事、一些人。就算没有一个朋友来阅读,我也会是最后一个读者。

分享一些歌曲

北京遇上西雅图中我觉得非常好听的插曲,虽然其中很多都已经都是经典了.

语法高亮

我Blogger上面的代码语法高亮是使用的Syntaxhighlighter,这是一个非常著名的开源代码高亮,作者使用JavaScript实现.
Syntaxhighlighter官网上面已经将他的功能讲述的非常清楚了,我在这里这是做一个简单的介绍,然后稍微做一下笔记,以免自己忘记使用他的语法.

<pre class="brush:java;">
代码
</pre>

今天查看又发现了另一个开源高亮代码项目,貌似还是Google发布的.
主页:https://code.google.com/p/google-code-prettify/

国旗女孩

#台灣加油
台灣加油讚微電影 國旗女孩篇(上)
「國旗女孩」是一個愛旅行的男孩,和愛拍照的女孩的愛情故事。女孩是從小生長在國外的­台灣人,雖然總聽媽媽講台灣,但從來沒回去過;男孩來自台灣,愛拿著國旗旅行,希望讓­國旗飄揚在世界各地。兩人在異鄉偶然相遇,女孩好奇國旗對男孩到底有什麼重要的意義。­男孩送了女孩一個國旗胸章,兩人約好某天一起帶著胸章、揮舞著國旗看球賽。然而,期待­的那天終於來到,女孩在球場前從白天等到黑夜,男孩卻遲遲沒有現身......
台灣加油讚微電影 國旗女孩篇(下)
眾所期待的台灣加油讚浪漫愛情微電影「國旗女孩」下集終於出爐囉!! 遲遲沒有現身的男孩,到底是發生了什麼事? 現在就讓謎底揭曉吧.......

Windows Live Writer配置

因为最近使用Blogger,也因为在G+知道了电脑玩物博客博主是用Windows Live Writer(简写WLW)写作的,这也是一个偶然的机会,因为我发现电脑玩物博文中的插图网址和我在Blogger在线编辑时插入的图片外链地址是不一样的,但是我们都是将图片托管到Picasa上面的。后来在Google+社群中问才知道可能是因为esor huang(电脑玩物博主)是使用WLW写作的。
Blogger中插入图片的问题,我看到有的Blogger上面外链地址是 ggpht.com开头的,而我的是 blogspot.com 开头的。
结论是:
1.我是通过在线的blogger编辑器编写的,所以插入图片默认的都是*.*.blogspot.com调用的Picasa中的图片
2. +esor huang 他是使用Windows Live Writer撰写之后编辑上传的,此时外链地址就是  ggpht.com
3.目前可能Google Picasa替换了ggpht.com,在Picasa网页上查看Picasa外链地址,得到的是 googleusercontent.com 这个域名的。
不过最重要的是无论哪个,其实后面的参数都是一样的,只要把前面的域名地址更换一下,访问的都是同一张图片,并且通过更改参数能够得到不同分辨率的图片
所以这两天想安装一个WLW来解决离线写作的问题,可惜我没有想到过程如此之复杂。

WLW安装

首先从安装Windows Live Writer说起,可能是我的电脑在之前安装过Windows Live包卸载时没有完全清理赶紧,所以安装Live2012时总是会遇到一个错误。

windows软件包安装错误
win7下安装windows软件包出错
错误:0x80040607
源:d3dx10-i386
后来Google了很多解决方案,最后还是在微软官网上找到了解决方案


彻底删除之前安装的程序,然后尝试安装离线包:
1.开始-控制面板-程序-卸载程序-卸载所有程序名含有Windows Live的程序;
2.分别在C:\Program FilesC:\Program Files\Common Files删除Windows Live文件夹 64位系统对应的路径:C:\program files (86)\C:\program files (x86)\common files\
3.重置浏览器(控制面板-网络和因特网-网络选项-高级选项卡-重置按钮);
4.开始-所有程序-Windows Update
5.重新启动您的电脑;
6.下载安装离线安装包

或者
因为用windows自带的卸载不能把它卸载干净,在网上下载Glary Utilities这个软件,安装完成后点击工具→清除和修复→卸载管理器,找到windows live messenger和它相关的软件,点卸载。然后你就可以重新安装了。

WLW添加WordPress.com

安装好WLW就像添加Blogger,可是怎么添加都会遇到各种各样的问题,所以我就想添加WordPress.com先试试,可是没想到的是WordPress.com也是各种问题。
首先就是基础连接的错误
“基础连接已经关闭”的解决办法
账户类型选择WordPress,填写网址的时候故意填错,(我是在http://einverne.wordpress.com/随便填写几个字母)。点击“下一步”,就会弹出提示框,要求选择日志类型。这里需要在下拉菜单中选择“WrodPress 2.2+”(不要选择WordPress.com或者WordPress)。选择之后,将发布地址改为http://你的地址.wordpress.com/xmlrpc.php。然后一直选择“下一步”就可以完成设置了。
设置成功之后又会遇到如下的错误:


解决方案:
设置代理,选项|Web代理服务器,写成Proxy SwitchySharp中的HTTP代理127.0.0.1:8087,好了。原来是因为被墙奸。以前一直没有软件设置代理的经历,现在看来,有些软件因GFW无法使用时,设个代理地址就行了。至于这个地址,明白人应该立马就知道这个代理地址是GoAgent的代理地址。
参考:1

然后通过上面的设定就终于进去了,这个是我之前安装的14版本的,后来升级安装到了Live 2012.


WLW添加Blogger

网上很多人都写了,不过不同的网络环境和配置导致各种各样的问题。

WLW添加Google Blogger日志帐户时出错:尝试连接到您的日志时出错:基础连接已经关闭:接收时发生错误。必须先纠正此错误才能继续操作。
WLW添加wordpress.com帐户时,同样也出错,显示:
尝试连接到您的日志时出错:网络连接错误-尝试连接到以下日志时出错:……基础连接已经关闭:接收时发生错误。必须先纠正此错误才能继续操作。
而连接到WordPress的基础连接错误上面已经解决了,现在来了个Blogger的,只能再行Google了,幸运的是我找到了这篇文章,解决了我大部分的问题。


 以上两个问题:“使用指定的用户名和密码无法访问该日志帐户。请确保这些值正确,然后才能继续操作。”的解决方案:因为我启用了Google二步验证,所以必须使用Google生成的密码才能登陆。

 然后无法连接到你的日志服务,什么基础连接错误,这篇,文章里面都讲到了,需要用代理,需要用代理,但是我用代理会发现,GoAgent已经不支持Blogger了,有人在反馈中说了,却还是没有人去解决。至此我已经放弃了,我想最后应该只有用VPN才能翻了吧。万恶的GFW



参考:完志驿站 电脑玩物1 2

Picasa插件
资料

Windows Live Writer 安装遇到问题与解决办法

Windows Live Writer 安装遇到问题与解决办法:
     现在很多Blog网站都提供后台操作平台,但是对于很多经常在Blog上面写文章的同仁来说,这确实不是个明智之举,一个是Blog后台的编辑能力比较弱,不适合写长篇文章;再一个原因是不能离线操作,写起来不方便。介于以上两点,很多同仁都选择Windown Live Writer 来做了写作的首选工具,具体操作方法笔者就不在这里的介绍了,电脑玩物有一篇文章介绍的很好【如何用Windows Live Writer寫Blog】,是一篇非常好的入门教材,如果有兴趣可以看看,而且里面还有很多相关的文章可以学习。现在Writer已经升级到2011了,界面做的非常干净漂亮,而且功能也非常好。
       由于众所周知的原因,在国内很多国外的Blog平台都不能使用,比如笔者现在用的Blogger,平台无法登陆,那Writer也在无从谈起,下面我将介绍一下在国内如果用Writer链接Blogger.
       首先下载【Windows Live Essentials】,(微软的软件包,Vista W7),然后运行该程序,选择Windows Live Writer 安装,安装好之后可以看到下面的图片。

图像005

由于Blogger 不再实现提供的日志里面,我们选择其他日志服务,点击下一步。

图像000
图像001

填入网络日志的地址,用户名,和密码,这里特别强调的是如果你事先开启了Google两步验证,那么在密码这一栏就要填写Google生成的验证码,否则提示你“用户名或密码不正确,请重试

图像002
      这是点击下一步,会弹出一个窗口,“无法连接到您的日志服务,基础连接已经关闭,接收时发生错误,请尝试解决问题,然后重试”。遇到这种情况,我们就无能为力了,必须借助代理的力量才可以。我们可以看到在第二幅图片的左下角有一个设置代理服务器,点击可以看到下面的弹出窗口
图像003

我这里用的是GOAGENT,具体见猫理会  goagent教程详细版
看到下面这个窗口,你就进入的成功的大门

图像004
至此,相信各位都可以利用Writer来写Blog了,祝各位同仁写的开心。

密码管理

一个人总是和密码离不开,上网需要各种各样的密码,银行卡,信用卡各种卡都需要一个密码,甚至到手机充值会需要一个手机卡的密码。那么你是怎么管理那么多的密码的呢?如果你使用同一个密码,当网络上发生大规模的密码泄露的时候?你害怕吗?
下面就讲讲我吸收整合了网上无数优秀作者博主的密码管理方案之后形成我自己独特的密码管理方案吧。
在平时生活中我们使用密码最频繁的时候就是上网,而输入密码最频繁的地方就是在浏览器中,所以最先我想介绍的就是LastPass这项服务,这项服务提供了几乎所有平台的应用,而我因为使用Chrome作为主要浏览器,LastPass Chrome插件就成为了必不可少的一款插件了。当然如果你要注册LastPass点击这里,通过我的邀请,你我都可以享受一个月的高级用户待遇。
这个图就是LastPass在Chrome中的样子,我这个是在Box页面上点击的,看到下面Box的密码,我就保存在LastPass中。蓝色的向下箭头就是自动填充用户名和密码,后面三个分别是复制用户,复制密码,复制网址到剪贴板。

LastPass就是一个在线的密码库,能够生成随机密码,并且保存到他的服务器,你只要你记住LastPass的密码就能获取你所有的密码,虽然LastPass服务器的安全性常常会引起敏感人士的质疑,但是LastPass在浏览器中的便捷性,让我使用这项服务至今。而LastPass的情况就是在注册新服务的时候,在这个网站生成一个随机的密码注册,你不用花时间想密码,不用花时间记住密码,LastPass全部帮你完成。并且下次登录这个网站的时候能够帮你自动填写,也正是这个自动填写的功能让我舍弃了KeePass而用LastPass作为常用工具。
 点击生成安全密码之后就会看到下面的界面,一个随机密码
你不用担心这个随机密码,因为LastPass默认会保存这个密码。
介绍完LastPass,就说说密码的分级管理,wzyboy的文章中其实已经说的非常完善了。
分级法是指将网站分为不同的级别,我分了三级,第一级是“不重要”的国内网站,包括但不仅限于各种为了下载个附件而注册的论坛;第二级是不甚重要的国外网站以及稍微重要些的国内网站比如亚马逊、京东的账号;第三级则是最重要的,如 Twitter、Google 账号等。其中第三级密码又用了“词根法”,即有一个固定的词根(由复杂大小写、数字、符号组成),再根据不同的服务加以不同的变化。
而我将不重要的网站的密码全部都由LastPass生成随机密码保存在LastPass的服务器中,而二级重要的密码和三级非常重要的密码都由某种规律记在自己的脑子里。因为那些网站本来就是极少数,所以记住那些并不是很困难的事情,并且那些网站因为经常使用,在桌面版,移动端都需要使用,所以使用随机密码本来就是非常一件麻烦的事情。如果你不嫌麻烦的话其实可以参考wzyboy的文章使用KeePass,桌面版安装一个KeePass,Android,或其他平台安装相应的应用,每次登陆都可以额外的打开一个软件或者应用来输入密码,当然这样做无疑增加了密码的安全系数,但是却是折腾了自己,我是没有采用wzyboy的密码管理方案。虽然我也在用KeePass,但是却不是拿来作为主要的密码管理工具,只是作为一个密码备份工具而已。
当然由于LastPass的重要性,我还是建议你启用LastPass的二步验证的,需要你在输入LastPass密码之后再输入手机上Google二步验证之后的6位随机数,加强了安全性,即使别人得到了你的LastPass密码之后拿不到你的手机也是进不去你的帐户的。

其他博客平台对LastPass的介绍
小众软件
月光博客

异次元软件讲了一篇关于1Password的服务,只是需要付费,等我赚钱了我也要试试
如果你想学习其他密码管理工具KeePass之类,以下网址可以给你参考

KeePass密码管理教程
http://terrychen.info/keepass-tutorial/
KeePass密码管理对Terry Chen的补充
http://www.freewarecn.com/keepass-keep-your-password-safe/
有效率的管理帳號與密碼
http://newsletter.ascc.sinica.edu.tw/news/read_news.php?nid=1629
将LastPass数据导入到KeePass
http://www.gaojinan.com/transfer-passwords-lastpass-to-keepass.html
强大的开源密码管理软件KeePass及其配合Chrome、BlackBerry的使用教程
http://penpenguanguan.com/1459.html

高考作文

今天翻阅OneNote笔记,偶然翻到两篇高考作文,突然思绪飞扬,虽然高考已经离我已有三年之久,但大家都知道高考对于一个人的影响。
那年我们的高考语文作文是《绿色生活》,我也不清楚我OneNote中的这篇文章是什么时候摘录下来的,不过既然翻出了这篇文章,也就贴出来看看了。也不知道这篇文章是谁写的,反正文言在高考作文中没有点文学功底是没有人敢写的。这篇文章的作者应该还是挺胆大的吧。至于好坏我也评价不出来,就简简单单的铁在这里吧。


《绿色生活》
呱呱小儿,但饮牛湩,至於弱冠,不明犍壮。佌佌之豚,日食其羓,洎其成立,未识豜豭。每啮毚臑,然竟不知其(夋兔)之三窟也。方彼之时,窋咤之态,非闤闠之中所得见也。
今北方久熰,瀵氿甃眢,坌(土盍)坲坲,焘天幠日。土地皴崩,罅可容人。南疆霶霈,洚水肆虐,当此之滈,茅舍尽走。欲苫不能,啼(口立)啾啾。
凡此异态,非天之咎。
君不见斵楩焚樟,岵之为屺,睇眄之下,万山尽屼,百尺篔簹,化为竹箸。于彼幼蛇,匌不盈寸,巴蛇王虺,尽化柈馐。玈气烰烰,上格瑶池,贫地徕贾,以丰其赀。然千丈方圆,莱菔不生,九天之上,星河不见。
呜呼!漫山设棙,遍地尽罘。此天灾也?人祸也!河海黟然,浊水仍倾,此天灾也?人祸也!斵木(算刂)竹,彍弮待兽,以至鹿不得走,翬不得飞,蚁不得宭,髬髵不见。此天灾也?人祸也!
翕合沴气,终日涽涽。天不复蓝,水不复清。未有乌云,天何暝暝?赤乌既出,焜耀无复。看天下,鸟飞不下,鲜见狉狉,当此之时,何处貣青天?
所幸者,人知之也,人更之也。然,上作纲法,下偩几何未可知也。
今天下多灾。北国井冞。阵朱复至,当与孔张俱歾。南域之霖,大禹洊存,只得扼腕而叹息。人不咎己而咎旱魃,不诮己而诼共工。未知可也。闤闠所趋,不可恈恈。当思子孙后代,人己知之。然行之效则体躆庙堂者思之,媕娿之徒,弃不婟嫪,国之大蠹,捐而必究。
吾所思者,河泮水墺,杨槐蓁蓁,町疃之间,柳榆其秝。苾葌柅柅游屮葳蕤,见柳而人不攦,视草而众不蹸。日驾双軑之车,斐斐闾巷之间,目不复睺,鼻不再鼽。鸟不惊人,鲋游沴然。
人者,天地孕育。今其反万物,此獍也。今其不宜瞡瞡,遗祸孥孙,当修长远之道以藾万世。
今吾执笔聿於此,所思者,舍旁早蟠一株,今当唪唪,攲枝水上,当复驾舴艋,(扌玄)其落桃,投於苙。坐银杏树下,观儿童嬉於树下,(廴止)於砖裓,搤腕而惜水中未置菱藕几株。燠热之时,而可摘菱冣菂,爇之为饘,以奉亲房。

后面这篇《怀想天空》是之前那年的作文题目

被细细的窗棂剪辑成四四方方的蔚蓝格子的,是天空。被短短的睫毛和长长的绿树枝丫分割成闪亮遥远的小碎片的,是天空。 
天空投影在水的碧波中,于是有了梭罗坐在瓦尔登湖畔,垂钓水中一望无垠的夜空繁星。天空投影在人的明眸中,于是有了楚国的屈原仰望天空,吟诵奇丽诡谲的《天问》。哲人的天空,孕育了他们的灵魂。他们因此有了天空般辽阔的情思与胸襟。 
星晨是天空的眼睛,天空的脸颊上生满了无数只大大小小的眼睛。太阳是一只炽热的眼睛,让我们不敢直视它的烈焰金光,有如人们对炙手可热的权贵的向往与敬畏。月亮是一只温柔的眼睛,不论阴晴圆缺,悄然看着从古到今的人们。“今月曾经照古人”,静谧流淌的淡黄色光芒中,人们获得了安宁温和的一刻。至于数不尽的星辰,则如同昆虫的复眼中呈现的景象。《小王子》中写道,我们肉眼看到的星辰,也许在亿万年前已爆裂死亡,此刻它们的光芒到达我的瞳孔,是最神秘的意外。 
云朵则是天空的粉妆。清晨的云被染成鲜嫩的粉红,如初生的婴儿的脸颊,血色柔和。黄昏的云被镀上金橙色,如斑斑锈迹,闪耀着孤独岁月逝去的光辉。有一个成语叫做“白云苍狗”,天空每日便上演着一部《白云苍狗》的电影,观众有稚嫩的孩童,有迟暮的老人,他们从变幻莫测的云朵中,或找到了童年时品尝的甜蜜的棉花糖,或找到了童话故事里云的国度。 
孟浩然诗曰:“微云淡河汉,疏雨滴梧桐。”天空的粉妆融化了,晶莹的雨水便落了下来。我们无法亲吻辽远的天空,却能亲吻到天空的眼泪——雨。点点滴滴的雨,愁煞过词人李清照,愁煞过贺铸:梅子黄时雨。我们坚硬却裂缝百出的心,被雨润泽,然后从心灵的旱地上长出一株新绿,从心灵的尘埃上开出一朵洁白。这柔弱的植物吸饱了天空的泪,在风中摇曳生长,离天空近了一点,又近了一点…… 
凭着日晷上的投影,我们可以知道天空在走向永恒。宇宙多大,银河多宽?此刻都已不重要。 
我们何曾看清了天空?不过是在怀想中,梦见永恒。

uTorrent屏蔽ipv4流量

ipv6的bt近来在教育网很火,速度快而且免流量费。但是下载中时不时出现的ipv4的peer让人很不爽。于是想找办法去禁止ipv4的连接。

写这篇主要是有一个来访记录,查的就是如何使uTorrent屏蔽IPv4流量,其实方法很简单,我这里只是把官方教程解释一下。

uTorrent 官方关于 ipfilter 的教程:http://www.utorrent.com/intl/zh_cn/help/faq/misc

1. 首先打开 uTorrent 所在目录,如果不知道在哪,通常在 %appdata%\utorrent (按Win+R后输入这个缩写点确定即可)。在“C:\Documents and Settings\用户名\Application Data\uTorrent”(xp)或“C:\Users\用户名\AppData\Roaming\uTorrent”(vista/win7)

2. 这个目录中有一个 ipfilter.dat 文件,如果没有的话创建一个,然后用记事本打开。

3. 按照以下格式输入IP段,每行一条(//后为解释,不需要输入):

x.x.x.x //过滤单个IPv4地址
x.x.x.x-y.y.y.y //过滤IPv4段
[a:b:c:d:e:f:g:h] //过滤单个IPv6地址
[a:b:c:d:e:f:g:h]-[i:j:k:l:m:n:o:p] //过滤IPv6段
[a:b:c:d::]/nn //过滤IPv6子网

例如,过滤全部IPv4则输入: 0.0.0.0-255.255.255.255 。过滤全部 IPv6 则输入: [::]/0 。
(注意:仅用ipfilter并不能很好的过滤 IPv4 或 IPv6,有时候还可能产生流量,建议配合防火墙使用。)



4. 保存这个文件。要使设置立即生效,可以在 uTorrent 中的“用户”页面上右键--“载入IP过滤”。

来源:http://t.du9l.com/post/24

Quote Of The Day