使用Git、Beyond Compare遇到的一些问题

之前在项目中在向git提交代码的时候,由于是在Windows平台下,每次都会有一个warning:大致是说LF will be replaced by CRLF,因为当时纳品比较急,所以在确认不会有很大问题后,就没有再去追究。昨天同事在使用git的时候又遇到了同样的问题,关键是还遇到个问题导致Beyond Compare在比较本地SVN代码与git目录下代码的时候,很多source文件显示是不一样的,但是在打开之后又显示都一样。这样就很郁闷,本来想看修改文件的差异,这种情况直接就无奈了。

于是就做了一番调查。先说为什么git会报warning,普及一个知识,LF和CRLF在文本中都是代表new line的意思,只是LF用于Linux、Unix等系统下,而CRLF主要用于Windows下。而git设置里边有一个autocrlf的配置,默认情况下,他的设置是为true,你可以通过git config core.autocrlf来看你的配置。如果这个是true的话,每次在你向git本地库中添加文件的时候,都会默认的把所有的CRLF转为LF,而当你从git上checkout的时候,这些文件又会把LF转为CRLF。这个设置主要是为了支持一个项目中的跨平台开发而用的。Windows下设置为true还是比较合适的。

既然知道为什么会有waning了,那么Beyond Compare又是怎么回事?打开Beyond Compare的文件比较设置,会有一个比较的规则设定,如图 继续阅读

如何在Android程序Force Closed后自动重启

在开发Android程序中,都会或多或少的遇到程序被Force Closed,那么如何让程序在Force Closed后自动重启呢?可以通过以下两部来简单实现:
1、在Activity的onCreate方法里初始化一个PendingIntent,你可以在intent中put一个针对crash的code,这样下次Activity启动后,就可以通过get code来判断是否是restart,以此来做一些事情。

Intent intent = getIntent();
int code = intent.getIntExtra(RESTART_INTENT_KEY, 0);

if (CRASHED_CODE == code)
{
    /** You can do something here. */   
    Log.d(TAG, "So sorry that the application crashed.");
}

intent.putExtra(RESTART_INTENT_KEY, CRASHED_CODE);
m_restartIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, Intent.FLAG_ACTIVITY_NEW_TASK);

2、为当前Activity的Thread设置一个UncaughtExceptionHandler,当某个Thread因为未捕获的异常而终止的时候会回调到它,这样只需要在uncaughtException(Thread thread, Throwable ex)方法的实现中,设置一个alarm来启动程序,如下边代码,程序将会在Crash 3秒后自动重启。

private UncaughtExceptionHandler m_handler = new UncaughtExceptionHandler()
{
    @Override
    public void uncaughtException(Thread thread, Throwable ex)
    {
        Log.d(TAG, "uncaught exception is catched!");
        AlarmManager mgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 3000, m_restartIntent);
        System.exit(2);
    }
};
Thread.setDefaultUncaughtExceptionHandler(m_handler);

当然如果你觉得你的application在Force Closed后,自动重启并不是一个最佳的选择,也可以利用上述代码在程序Force Closed后保存一些程序Crash的Log,以便在以后的版本中修复Bug。

忙碌的日子

好长时间没更新博客了,最近项目做得很累,每天的生活轨迹就是:早上起来挤地铁,工作,下班坐地铁,睡觉。自己的一些计划又被打乱,看来总是希望通过大块时间来实施自己的计划并不是最好的选择,以后要多多利用碎片的时间,慢慢锻炼增快自己大脑线程的切换 :)

杂乱的生活有以下几个感悟:

不要低估我们某领导的精力,他的精力是无限的,无限的(彻夜加完班还要接着彻天)。

客户有的时候真的很让你无语,真的是很无语(我经历了从一开始不淡定到后来比较淡定)。

Google开发者大会是个好大会,以后每年都要参加。

找房子,好房子固然很重要,其实房东也很重要。

最后推荐一部好看的电影:《铁甲钢拳》,看得我很high,下边是电影的片尾曲。话说最近好电影很多啊,《猩球崛起》、《转山》都挺好看的。

如何在android中为Http连接设置超时

最近在项目中因为与服务器打交道,所以经常需要进行Http请求操作,最开始写代码的时候并没有在意超时的问题,一开始还没什么问题,后来在Debug的时候发现有的线程一直结束不了,很占用资源。于是通过DDMS分析之后得出线程一直运行是因为线程中的Http请求没有设置超时时间,而刚好服务器也没有设置超时时间,于是线程就悲剧了。

Android中(更准确说是Java中)支持两种Timeout:connect timeout 和 socket timeout。

那么如何设置超时呢?

在通过HttpClient进行Http请求的时候,可以通过以下代码来设置Timeout:

HttpClient httpclient = new DefaultHttpClient();
HttpParams params = httpclient.getParams();
HttpConnectionParams.setConnectionTimeout(params,NetworkConstant.CONNECT_TIMEOUT);
HttpConnectionParams.setSoTimeout(params, NetworkConstant.SOCKET_TIMEOUT);

在通过UrlConnection进行Http请求的时候,可以通过以下代码来设置Timeout:

URL url = new URL("http://www.google.com/");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(NetworkConstant.CONNECT_TIMEOUT);
conn.setReadTimeout(NetworkConstant.SOCKET_TIMEOUT);

既然有两种Timeout,那自然就有两种TimeoutException:ConnectTimeoutExceptionSocketTimeoutException,如果想分别处理的话分别Catch就可以了,如果要统一处理只要Catch住它们的父类InterruptedIOException

Follow your heart

你不可能充满预见地将生命中的点点滴滴串联起来。只有在回头看的时候,才会发现这些点滴之间的联系。所以,你要坚信,现在所经历的一切都将或多或少与你的未来产生关联。你必须相信某些东西——决心、命运、生活、因缘际会等等。这种信仰从来没有让我感到失望,它让我的人生变得与众不同。    ————————乔布斯

每次看都有不一样的感受,发现自己之前大三的时候也写过一篇,这次再次分享出来,与大家共勉,也激励自己。

最后为这样一位一直following heart生活的人祝福。

如何在C#中获得当前文件名和行数

在项目中有需求打印出当前函数调用处的行数,C++中可以用“__FILE__ and __LINE__”这个宏,那么在C#中应该如何实现类似的功能呢?

C#中提供了StackFrame这个类,通过调用它的方法即可简单的获得当前执行函数所在文件,以及在文件里的对应行数。

代码如下:

public static void WriteLog(String msg)
{
    StackFrame CallStack = new StackFrame(1, true);
    String SourceFile = CallStack.GetFileName();
    int lineNum = CallStack.GetFileLineNumber();
    WriteContent(msg, SourceFile, lineNum);
}

StatckFrame的构造函数中1代表堆栈上要跳过的帧数,也即用于构造StackFrame的帧当前指向了调用WriteLog这个方法的帧,true表示要捕获堆栈帧的文件名、行号和列号,如下图:

CSharp

这样获得了函数堆栈上正确的帧数之后,就可以通过调用StackFrame 中的GetLineNumber等函数获得你想要的信息了。

ps:注意StackFrame需要有PDB Files的支持。

ps1:最后再来首歌,挺好听的,还有爱熊行动 :mrgreen:

拿福能博主聚会

本来应该早写的,因为这周一直在学习痛苦的C++,每天处于脑细胞负增长状态,结果就给搁浅了。

上周末参加了由拿福能组织,奈米露赞助的博主聚会。好长时间没参加这种聚会,上次参加还是09年时候WordPress camp 北京聚会。

先介绍一下拿福能吧,它是一个在东南亚比较成功的一个专门做博客广告的公司,目前刚来到中国进行推广,正在进行给力的1000博主分50000元活动,感兴趣的点此链接

活动开始前,幸运的和他们这次来中国开辟市场的负责人David聊了会天(后来才知道的),马来西亚人,感觉很年轻,很有活力,也许经验上会有缺乏,但是肯定在与博主沟通以及听取意见上会有很大的优势,当然拭目以待了,话说他的中文说的挺好的。

活动细节就不叙述了,下面开始上图:

David在给大家介绍拿福能在东南亚一些国家的成功广告案例 继续阅读

六月杂记

这几天一直在关注一个骑车去西藏旅游的牛逼人士的微博,很向往,向往自己也能骑车的时候被猪撞了(微上说,路上遇到的一位女同胞骑车的时候被猪撞了,真原生态),自己什么时候也要去感受一下,这才叫生活,每天一尘不变的生活也是会让人厌烦的。

晚上突然得知一个在摩登音乐节认识的朋友今年毕业,月底就回老家大理了。好久没联系,突然收到这样一条消息还是挺意外的,大理也是我旅游地中向往的地方,我会去那找你玩的。问他为啥不在北京找个工作,他说不喜欢大城市的生活,能以自己喜欢的方式生活是一件很不错的事情,希望你在自己的故乡大理生活的快乐。

最近开始学习C++了,整天遨游在指针的海洋里不能自已。

今天就是父亲节了,帮爸爸在京东上买了几本回忆录的书籍,希望会喜欢(突然想到是不是可以办这样一个网站,专门为年轻人推荐一些父辈感兴趣的东西,需求应该挺大的)。

最后,文章开始的图片是从回大理的朋友豆瓣相册里拿来的,很美吧。

WPF中的数据验证

最近在写与用户交互程序的时候,经常需要对用户输入的数据进行有效性的判断,当然你可以直接就禁止用户输入某些字符,但这样感觉用户体验上不好,所以一般的处理方法是给用户开放性的输入,对于错误的情况给予友好的提示。而要实现对数据的验证,

简单的方法可以写一堆if判断来处理需求中的逻辑,这样比较麻烦,而且代码看起来比较臃肿,最近在学习wpf,通过它的数据绑定就可以比较清晰而且简单的实现数据验证的功能。

大体需要三步:

1.需要一个与你控件进行数据绑定的类;

class DataSource
{
    private String _name;

    public String Name
    {
        get { return _name; }
        set { _name = value; }
    }
    private String _num;

    public String Number
    {
        get { return _num; }
        set { _num = value; }
    }
}

继续阅读