amp@java

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  99 随笔 :: 0 文章 :: 228 评论 :: 0 Trackbacks

#

昨天在调试一段Android程序的时候发现总是出现NullPointerException,是来自一句System.out.println(),但是把里面的内容分拆了几次都找不到哪里有null,最后发现居然是因为最终输出的字符串是null!

一直以来,在JavaSE里,如果字符串本身是null,System.out.println()打印该字符串,会在终端输出“null”,而在Android里却是直接抛出NullPointerException,整个程序都会被终止。

大家可以测试一下下面的语句在两种环境下的运行结果:
1 String s = null;
2 System.out.println(s);
posted @ 2012-02-13 14:49 amp@java 阅读(1370) | 评论 (1)编辑 收藏

这是mars课程里面关于handler和线程的一个例子:
package mars.handler;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;

public class HandlerTest extends Activity {
    Handler handler 
= new Handler();
    
/** Called when the activity is first created. */
    @Override
    
public void onCreate(Bundle savedInstanceState) {
        
super.onCreate(savedInstanceState);
        System.out.println(
"1");
        handler.post(r);
        System.out.println(
"2");
        setContentView(R.layout.main);
        System.out.println(
"activity---->"+Thread.currentThread().getId());
        System.out.println(
"activity name--->"+Thread.currentThread().getName());
    }
    
    Runnable r 
= new Runnable() {
        
        @Override
        
public void run() {
            
// TODO Auto-generated method stub
            System.out.println("handler---->"+Thread.currentThread().getId());
            System.out.println(
"handlername---->"+Thread.currentThread().getName());
            
try {
                Thread.sleep(
10000);
            } 
catch (InterruptedException e) {
                
// TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println(
"3");
        }
    };
}

根据mars的解释,handler所在的线程跟Activity的线程是同一个线程,所以在
handler.post(r);
语句后,执行的是Runnable里面的run函数,这个函数没有在新开的线程中执行,只是简单地调用了run函数,所以这个app在模拟器运行时要过10秒才会显示界面,因为run函数里面睡眠了10秒,等它返回后才执行setContentView函数设置界面元素。
根据实际运行结果,的确是过了10秒才能显示界面。

但是奇怪的是System.out语句似乎没有受到影响,下面是日志:
log
02-09 11:12:43.553: INFO/System.out(591): 1
02-09 11:12:43.553: INFO/System.out(591): 2
02-09 11:12:43.674: INFO/System.out(591): activity---->1
02-09 11:12:43.674: INFO/System.out(591): activity name--->main
02-09 11:12:43.713: INFO/System.out(591): handler---->1
02-09 11:12:43.713: INFO/System.out(591): handlername---->main
02-09 11:12:53.775: INFO/System.out(591): 3

从日志可以看出,除了run函数里面睡眠后才执行的打印函数推迟了10秒才执行之外,其他都是没有受到任何延时,顺序执行的,在
handler.post(r);
语句前后的打印函数都被按顺序执行了,唯独
setContentView(R.layout.main);
需要在run函数返回后才执行,这是什么道理?难道打印函数的优先级更高,不会堵塞?如果是这样的话为什么在run函数里面还是要等睡眠结束才执行呢?
posted @ 2012-02-09 19:25 amp@java 阅读(1833) | 评论 (6)编辑 收藏

很想搞点Android的小程序玩玩,但是却万事开头难,不知道从哪里开始,看了官方的文档,结果一天都看不了几段,还是英文的,比较痛苦。找了些电子书,也是看过目录就不知道放哪里了。这种编程的入门没有强大的决心真的很难静下心来学习。
前几天又心血来潮,搜索了一下android开发的网站,发现了一些视频,看起来还挺有意思,连续看了几个,慢慢地也摸着一点门路了,以前没有试过用这种方法学习,都是看书,现在发现看视频似乎更高效,起码眼睛没那么累,有人在念,很多时候只要用耳朵听就行了,而且所有软件的界面、步骤都很清楚,这些东西通过书是没法表现出来的。
现在学会了让一个Activity显示出来,放上点控件,处理一下点击,页面布局等,算是入门了,但很多东西还要继续看,那些视频还有好多。
入门系列视频地址:
http://www.marsdroid.org/
还有一个深入浅出系列:
http://www.eoeandroid.com/thread-109361-1-1.html
由于没有入门,所以还在看第一个系列,第二个系列只看了两个。
到现在发现android界面的构建很像web界面,android是通过layout来排布控件,而web是通过css,android可以通过java来操纵控件,而web则是通过javascript操纵控件,回调函数则跟JavaSE一样。



不过有时候很容易忘记了一个步骤导致程序运行出错,一般来说,要让一个Activity成功运行,需要做以下步骤:
1、有一个继承与Activity的类
2、有一个layout文件,里面是各种控件的布局,在Activity里面应该用setContentView加载这个layout
3、有一个strings文件,里面是界面的各种字符串,用于国际化
4、在AndroidManifest里面加入这个Activity
第4步很容易忘记。
posted @ 2012-02-08 14:55 amp@java 阅读(257) | 评论 (0)编辑 收藏

前段时间听了一家公司介绍分布式存储产品,号称性能超过传统的磁盘阵列+小型机,但价格却比这种组合低,而且具有维护简单、数据安全等优点,其核心就是把一些PC服务器通过网络连接起来,把数据分散存储在这些服务器上,查找的时候把任务分配到这些服务器上,让它们分别完成各自的小任务,最后再汇合出结果,核心就是:每个节点都是一个数据存储单元和运算单元的结合,这些节点性能要求不高,可以是各种各样的配置,只要在上面运行集群要求的软件即可,一台挂了不要紧,换上去一台就能自动恢复,增加一台就能提高性能,减少一台也不会有很大影响,只是性能稍微下降,每份数据都有多个备份,能够平衡分布在各服务器上。这种架构的缺点是,只要用上了这套东西,所有的软件就必须从这家公司购买,因为整个集群的控制和访问接口都是他们提供的。
该公司也坦言这其实就是google的服务器应用技术,实际上就是google提出来的云计算。

今天看了一些文章介绍,发现上面介绍的东西实际上已经通过Apache的一个项目Hadoop实现,不知道那家公司是不是就是简单包装了一下这个项目。

Hadoop包含两个主要的模块,分别是HDFS分布式文件系统和MapReduce集群计算机制。刚刚发布了1.0.0版本。

主页: http://hadoop.apache.org/

blogjava有位高手已经翻译了HDFS的架构说明:http://www.blogjava.net/killme2008/archive/2008/06/05/206043.html,但对应的是上一个版本0.20的,里面说到了很多没有实现的东西,不知道是否已经在1.0版本实现,目前官方网站上该文章的版本还是0.20的。

这里有三篇文章介绍Hadoop在单机环境、多机环境下的安装和配置,还有应用程序的开发:http://www.ibm.com/developerworks/cn/linux/l-hadoop-1/index.html

看起来还是挺有意思的,以前就曾经有过想法,把单位淘汰下来的那一大堆台式电脑组成一个存储或者计算的小集群,也许能够代替一两台PC服务器,现在看来可以试试,以后的趋势就是云计算了,先自己搞点小云看看效果如何。
posted @ 2012-01-19 14:47 amp@java 阅读(222) | 评论 (0)编辑 收藏

这个不仅仅是IE6的错,而是所有IE的错!!
IE有一个特别随意的功能,就是能够通过Element的name来操作一个Element,有些人觉得这个功能很方便,实际它不仅不符合标准,还会导致IE自己变得莫名其妙。
假如你的Form有一个提交按钮的name="submit",那么,很遗憾,你这个form无论如何都不能通过Javascript来提交,只要你一调用了这个form的submit()方法,IE就会告诉你它不支持这个方法!这不是搞笑吗?哪个浏览器会不支持form的submit()方法?虽然IE不标准,也不至于这样吧?对不起,就是这样。

因为当你调用form的方法submit(),它首先想到的是你的提交按钮!
theForm.submit()
这个语句在IE看来并不是调用theForm的submit方法,而是调用了名字为submit的提交按钮!如果你在某个元素对象后面加个括号,会有什么效果?当然就是出错。在IE的独特视角下,上面这个语句与下面这个语句的效果一样:
(theForm.submit)();
前一个括号代表了名称为submit的按钮对象,后面那个括号就无法理解了,所以IE告诉你不支持这个方法。

IE整个家族都是如此的丑陋!

posted @ 2010-12-09 15:02 amp@java 阅读(285) | 评论 (0)编辑 收藏

一直都看到很多人说,IE6是Web开发人员的恶梦,以前我单位的内部网络,所有电脑装的都是IE6,我只针对IE6开发,似乎没什么感觉,反正在我的电脑上看到什么样的,其他电脑上看到也是一样的。
后来因为某公司给我们做的一个系统运行速度实在太慢,我把自己的电脑更新到IE8,发现速度快了很多,但是有些东西不兼容,我对那些不兼容的功能使用得比较少,就不管了。
终于,我自己又要开发一个小项目,用了一个网上下载的CSS模板,发现里面很多针对IE的注释,从IE 5到IE 8都有,反正我电脑上看着效果不错,于是就用了。
辛苦了好几天,我那项目基本完工了,想在IE6上看看效果,Shit,本来显示在页面右方主要区域的表格掉在了左边导航栏的下面,表格里面一些DIV的下划线莫名其妙地不见了,这些东西在我的电脑上显示得好好的,也没用到什么特别的东西,怎么差别会这么大呢?
一个个问题排查:
表格问题,在IE6上表现得有些诡异,显示完之后表格是在下面的,但是鼠标晃过导航栏里面的链接,表格又会自动跳到右方区域,真见鬼。改了一下布局的padding,一个表格好了。另外一个却还是掉下去,仔细研究了一下,把表格的宽度减少10px,好了。
下划线问题,我用的是:
border-bottom:1px solid grey
结果IE6不会显示出这条下划线。搜索一下才知道这是IE6的bug,它理解不了这么长的句子!必须写成这样:
border-bottom-width:1px;
border-bottom-style:solid;
border-bottom-color:grey;
还有比这更傻逼的吗?有!
它显示出的线是黑色的,不是grey的!而且根据DIV里面内容的颜色不同,它还会变色!如果里面是红色的字,那么它下面的线也是红色,如果是绿色的字,下面的线也是绿色,如果没有指定颜色,它就是黑色,非常智能,但就是不显示你要的颜色!
后来知道原来它根本不知道grey的意思,必须指定颜色代码才能解决。


这就是IE6,没想到微软这么大一个公司还出了这么一个垃圾,而且出了那么多年,至今还占据中国浏览器市场的半壁江山!



posted @ 2010-12-08 20:51 amp@java 阅读(539) | 评论 (4)编辑 收藏

有一台WIN2003的服务器,在单位的局域网内,与互联网是物理隔离的,最近上面运行的一个WEB服务器经常出错,查看日志发现是因为数据库不能连接,因为系统的所有端口都已经被占用完。使用netstat -abn查看发现svchost.exe开启了大量状态为SYN_SENT的连接,目标端口都是445,但是连接的IP各种各样的都有,由于机器不能建立Internet连接,所以状态都是SYN_SENT,重启一下这些连接都没有了,但是过一会又会迅速建立起来,很快就把系统的所有端口都占用了。
根据端口找出哪个服务真不容易,通过netstat -abn只能查到是svchost.exe,最多还能得到一个PID,确定是哪个svchost.exe,然后通过tasklist /svc可以查到那个svchost对应了哪些服务,但是一看,很多服务都是使用那个svchost,包括Server,Workstation等等,根本不知道是哪个产生的连接。
找了半天发现有人和我一样:http://www.petri.co.il/forums/showthread.php?t=36427,讨论了半天最后也找到了解决方法:http://www.symantec.com/security_response/writeup.jsp?docid=2009-011316-0247-99,原来是W32.Downadup这个病毒惹的祸,下载了专杀工具回来查了一下,果然找到了两个被感染的文件,一个是jpg文件,在IE的缓存里,一个是dll文件,在system32里。
根据dll文件名在注册表里查到了它注册的服务,原来又是之前处理过的那种,服务名随机、服务描述为空、启动类型为自动、状态为未启动、dll名随机,但是我记得这台服务器已经打过补丁,也没有出现svchost错误,所以就忽略了服务的检查,没想到这种东西还有不同的症状。
这个病毒利用的是KB958644的漏洞,到微软下载了补丁回来,一看才发现原来那台服务器以前已经装过这个补丁。补丁的作用也许就是只能防止再出问题,但不能解决已有的问题,所以那台服务器虽然装了补丁,但是可能已经被感染了,于是就没治好。

posted @ 2010-06-30 11:33 amp@java 阅读(11891) | 评论 (1)编辑 收藏

把APE、FLAC等无损压缩音频文件刻录成CD的软件有很多,搜索一把,出现频率最多的是用NERO+插件,但是现在的NERO体积实在庞大,我尝试下载一个NERO 10,大小不过200多M,结果安装的时候解压到临时文件夹,我的C盘1G多的空间都不够它解压,根本就安装不了,为了这么一点事情用这么大一个软件实在没必要,仔细搜索一下,刻录的软件其实有很多,都能自动地把APE刻录到CD上,方法远比NERO简单。
第一个软件是Burrrn
Burrrn是个专门干这事的软件,它支持的文件包括ape、flac、mp3、ogg等,实际上也是通过插件来完成编码解码工作的,不过这些插件都是内置在程序包里,不用再逐个下载。它的界面非常简单,使用也非常简单,基本一打开就会使用。
第二个软件是ImgBurn
这个软件比较强大,不但能够刻录APE,还可以把光盘提取成镜像、把文件或文件夹生成镜像、把文件或文件夹刻录到光盘上、把镜像刻录到光盘上,基本上NERO常用的功能都有了,软件只有几MB,十分环保。我下载这个软件的时候只是想使用它的生成镜像功能,因为下载下来一些蓝光原盘需要制作成ISO文件才能用POWERDVD播放。后来发现有人说这个软件还可以刻录APE,不过也需要使用相关的解码器,只是这些解码器在安装常用的播放器的时候一般都已经安装过了,例如我以前装过终极解码,其中包含APE解码器,就不需要另外安装了。
使用的时候只需要选择刻录镜像到光盘功能,选中与APE相关的cue文件,然后就可以分轨刻录了。

这两个软件的体积都很小,而且都是免费软件,不但环保还合法。

第一次使用Burrrn刻录APE的时候,用KMPlayer播放,发现直接播放APE的效果跟播放刻录出来的CD效果不一样,CD的效果动态范围明显不如直接播放APE,我以为是刻录软件的问题,后来使用ImgBurn刻录,也是一样的效果。仔细对比之后发现KMP播放的时候是使用不同的滤镜,可能是这个原因导致效果不同,但是播放APE和播放CD又不可能使用相同的滤镜,所以到底是什么原因也很难说得清楚,不过CD机上不认APE,也只能这样了。


posted @ 2010-06-22 15:30 amp@java 阅读(580) | 评论 (0)编辑 收藏

1、服务命名。Oracle的服务命名就跟计算机的名称一样。一般来说,在局域网里面,计算机名称是与IP一一对应的,通信的时候需要使用IP,所以就有了DNS,把计算机名翻译成IP。同样的道理,在Oracle体系里,服务命名对应计算机名,服务名(SID)+IP+端口+协议(TCP/IP)就对应了计算机的IP,Oracle体系里的DNS其实就是一个配置文件,把服务命名翻译成可以用于通信的服务名(SID)+IP+端口+协议(TCP/IP)。有趣的是,与计算机里的ping命令一样,Oracle里面也有个TNSPing命令,通过“TNSPing 服务命名”,就会得到像ping命令相似的结果,验证该命名对应的数据库是否有效。

2、主机身份验证。Oracle的一些维护工作往往需要输入主机身份验证信息,但是默认情况下,即使输入了正确的用户名和密码,系统也会提示“用户口令错误”,让人十分困惑。其实真实的原因是,你输入的用户必须在“作为批处理作业登录”里面,否则就会出现上述错误。操作方法如下:运行-gpedit.msc-计算机配置-Windows设置-安全设置-本地策略-用户权利指派-作为批处理作业登录-添加用户或组...-加入要登录的用户。
执行数据库迁移操作的时候,可能需要在源数据库主机和目标数据库主机都进行上述操作才能成功。

更多问题待续
posted @ 2009-11-12 10:23 amp@java 阅读(271) | 评论 (0)编辑 收藏

9月10号,CHDBits开放了注册权限,赶紧注册了一个帐户,这是我第一次登录PT站。每个文件都有几个甚至几十个种子在等待下载者,真是“僧多粥少”。下载速度果然很猛,下了几个文件,基本上可以达到ADSL的上限,甚至遇到了前所未有的极速,不过持续时间较短,但是平均速度都接近上限。
然而,ADSL小水管终究不是玩PT的料,严格的分享率要求和ADSL龟速的上传带宽使得我两天之后就变成了冰人,如果20天之内再不提高分享率,我的帐户将会被封禁。仔细考虑了一下,我还是“过把瘾就死”算了,因为以我这8:1的上传和下载带宽,要长期达到要求基本上是不可能的事情,如果要我的分享率达到1:1,那我4M的下载带宽就等于缩水成和上传带宽一样,只有512K了,我装这4M的宽带还有什么意义?
其实在PT站外下载,速度也是不错的,无论是emule还是BT都能达到上限的80%以上,当然,是在种子刚刚放出的一段时间,只要热度一过,速度马上下降,这是与PT没法比的。
还是等到哪一天光纤到户再玩PT吧,现在的任务就是趁着20天没过,赶紧“过瘾”,嘿嘿!
posted @ 2009-09-14 19:44 amp@java 阅读(286) | 评论 (2)编辑 收藏

仅列出标题
共10页: 上一页 1 2 3 4 5 6 7 8 9 下一页 Last