一个奇葩问题

今天运行一个java工程时出现问题,总是提示某个配置文件的数据无法读取。百思不得其解,后来检查相关配置文件,发现一个有趣的问题:工程依赖的一个jar包里(这个jar包是我用gradle打包的),竟然在同级目录下有两个完全一样的文件(我的环境是ubuntu15.04),把该文件放到windows下显示效果一样,说明不是障眼法。我试着在jar包中删除其中一个,结果同名的两个xml文件同时被删除了,这又说明这两个文件其实是同一个文件。

 

检查发现,原来是用gradle打包这个jar文件时多复制了一次hivemodule.xml文件,不知这算不算操作系统中文件系统的bug。总之,改正过来后,一切正常了。
 


Gradle打包的war文件部署到tomcat后运行解压出错的问题

自从用了gradle来构建公司的所有新旧项目,总会涌出一堆各式各样的问题,看似配置比maven简单了,但问题却更多。究其原因,一方面团员成员都比较菜,我要一个一个为他们解决相关问题,但过不了几天,又冒出新问题,没养成自我解决问题的能力,又得找我,作为苦逼的项目经理这一职务,我还真羡慕他们,想当年,哪有谁帮我这样处理问题啊;另一方面是gradle作为开源软件,项目比较活跃,版本更新比较快,但问题也比较多,这次就遇到了编码问题。

    说到编码问题,我在这家公司也是深受其害而又无可奈何。首先公司的固有框架比较老,N年未改变,里面utf-8和GBK编码的源码文件都有,当拿过来作为新项目的开发基础框架时,却又要结合现代的gradle、eclipse、tomcat等开发工具,在这个过程中仅编码问题就令人头大,有时真是犯了强迫症,恨不得把老框架里的每个文件编码都改一遍,但老框架是依赖的一个外部封装的jar包,而这个jar包对应的源码SVN库我没有权限。。。

    回到正题,最初用gradle时的版本是2.2,当打包时提示编码问题,后来我在build.gradle文件中加入

[compileJava, javadoc, compileTestJava]*.options*.encoding = 'UTF-8'

强制以utf-8编码编译源文件,虽然有警告提示,但编译部署都能成功。最近的项目已经有人在用grade2.6了,随之而来的问题就是:有的人编译就直接报错;有的人有警告但能编译成功,在部署war包时报错。首先值得一提的是,本人一直用的ubuntu,系统默认编码为UTF-8,一直运行良好,而这些小伙伴都是用的中文windows,系统环境默认编码为GBK,在eclipse中开发时各种报错。经过尝试,最终在基于eclipse的gradle插件中配置了一项JVM参数,才使小伙伴们感受到阳光明媚(建议把上面build.gradle文件中的对应配置注释掉):

-Dfile.encoding=UTF-8



ubuntu系统中chrome浏览器的代理配置

工作环境迁入linux后,一般都会遇到一个普遍问题:怎样在linux环境下寻找windows常用程序的替代品?QQ,Office,邮件客户端等等。QQ目前我暂时用的webQQ,office用的ubuntu内置的libreOffice和金山wps for linux,其它的也都一一寻找到了替代品,如果实在不行,试试wine之类的模拟器。然而这都不是重点,最重要的是我习惯使用的chrome浏览器在linux下的版本无法使用代理功能。

    最终使用的一个曲线解决方案:

1、安装好google-chrome(或者chromium也行)后,我们发现浏览器的设置中,代理配置功能失效,显示为:

在受支持的桌面环境中运行google-chrome时,将使用系统代理设置。但您的系统不受支持,或启动系统配置时出现问题。

但您仍可通过命令行进行配置。如需详细了解各项实验功能和环境变量,请参见 man google-chrome。

2、关闭该google-chrome,并重新从命令行启动,加入一个参数:

yzy@thinkpad:~$ google-chrome --proxy-server="socks5://localhost:7077"

值得注意的是,由于我平常windows环境下使用的代理工具为:chrome+SwitchyOmega插件+MyEntunnel,配置是SSH+socks5,所以一开始没有在–proxy-server参数中指定socks5,导致启动后代理失效。(可通过google-chrome –help了解详细参数)

chrome成功启动后,打开百度输入“ip”,可显示我的代理服务器IP,说明代理成功启用。

3、此时我就可以在chrome中登陆google帐户了,然后我的所有扩展也就随之慢慢下载并安装完成,其中就包括我的SwitchyOmega(如果有没安装,可自行去google store下载)。接下来在SwitchyOmega中配置好我的ssh代理即可成功恢复之前windows环境下的代理配置了。

linux下我的代理工具为:chrome+SwitchyOmega+gSTM(代替windows下的MyEntunnel)。

新浪sae体验

    首先,我想提下云计算的概念。长期以来大街小巷都提到“云计算”,但我一直没弄懂,因为我不知道我能从中获得什么便利,直到开发上接触并用到了PaaS,才有所认识。我对云计算的理解是:云是一台可以无限伸缩的计算机,有无限的带宽,CPU,内存,存储,操作系统,软件服务等资源,用户所有的信息化处理业务都可以接入云,并按需计费,就像我们家中的水电煤气一样,我们需要用多少就支付多少费用,丰俭由君,这是面向大众用户的一种解释。至于云底层的实现,是通过虚拟化的技术将现实中的无数物理服务器,带宽,操作系统等各种资源整合在一起,形成一个具有无限伸缩能力的虚拟计算机。

    另外,从服务层次理解,云计算分为IaaS,PaaS,SaaS三种。IaaS表示基础设施即服务,正如前面讲到的,将所有资源整合成一台虚拟计算机,完成这个步骤的厂商往往是IT巨头企业,如google,amazon,IBM等,这些厂商能将自己遍布全球的数据中心所有资源进行整合,然后面向上层PaaS服务商推出基础设施服务;在此基础上,PaaS(平台即服务)厂商对云的功能进一步丰富,提供各种开发语言的支持及程序的运行环境(web应用服务器,数据库),再加上对应的资源配置功能,即可面向上层用户(SaaS服务提供商)提供服务,PaaS这一层的提供商提供的产品有Google的GAE,Microsoft的Azure,国内的有新浪的SAE,百度的BAE等;最上面这层SaaS,表示软件即服务,这一层服务的提供商利用PaaS提供的程序运行环境,搭建自己开发的程序或现成的软件,面向普通大众消费者提供资讯网站,手机APP访问等网络服务。

    一般而言,PaaS服务的消费者主要是中小企业和个人软件开发者,尤其是IT行业创业的个人或企业,往往基于PaaS平台可以极大地降低创业成本,提供更好的SaaS服务给客户。

    好了,回归正题,有了上面的模型,作为开发人员,我能很好地找准自己在云计算平台中的定位,我所能直接利用的就是PaaS服务,把自己的软件放上去,然后就可以通过浏览器访问了,这里介绍的就是新浪sae(sina app engine)。

    选择sae是因为它可以免费试用,注册后有赠送的云豆用于服务计费。sae目前支持java,php,python语言,用户可以上传web应用和移动应用,提供mysql,kvdb,memcache等传统关系数据库,key-value分布式数据库和用于分布式内存缓存的数据库,另外还为开发者提供了Storage用于分布式的文件存储服务,基于这些高大上的服务,当然少不了后台管理功能。

    首先,我要布署一个java web应用,需要用到后台mysql数据库。我在控制台创建一个新应用,输入对应的二级域名和应用名称,配置好运行所需资源。

第二步,进入该新建应用的管理界面,进入代码管理,上传代码。

第三步,很简单进入服务管理-MySQL,初始化数据库,可以得到一个与应用名称对应的数据库。

第四步,访问应用。

    综上,这是一个sae最简单的应用部署流程,其中需要注意的是,布署的应用是基于本地环境开发的,可能放到sae时会运行出错,此时就要具体问题,具体分析了。比如我发布这个java web demo时,就遇到了jdk的问题,本地用jdk1.7编译,而sae上的jre环境是用的Open JDK 1.6,导致java.lang.UnsupportedClassVersionError: t : Unsupported major.minor version,此时需要本地版本降级编译一下再部署。另外,数据库的用户名和密码是该应用对应的AccessKey和SecretKey,直接在应用代码中修改一下数据库配置即可,或者在应用代码中调用sae的API动态获取,我个人倾向前者,因为不想与运行环境API粘在一起。

数字证书

         前段时间接手了一个兄弟公司移交过来的项目,其中涉及资金交易安全的模块,采用了数字证书进行加密通讯,学习过程中走了不少弯路。目前工作终于告一段落,总算可以好好整理一下数字证书加密通讯相关的知识了。

         数字证书是一个经证书授权中心数字签名的包含公开密钥拥有者信息以及公开密钥的文件。最简单的证书包含一个公开密钥、名称以及证书授权中心的数字签名(来源:百度百科)。换句话说,数字证书就是公钥、签名者及被签名者身份信息的载体,也就是说,签名者证明被签名者的真实有效的身份。比如支付宝首页打开就可看到url地址栏中的绿色标识,点击可看到该证书是第三方证书机构VeriSign公司证明了支付宝的真实身份(如果VeriSign系统被攻破,黑客用它来给危险的网站签名身份,那就危险了。。。当然这种可能性应该微乎其微,毕竟VeriSign可是第三方证书机构的佼佼者)。

        提到证书,就离不开加密,加密算法主要分两种:对称加密非对称加密。两者很好区分,加密解密使用的是同一个密钥,则属对称加密;而非对称加密解密使用的是两个不同的密钥——公钥和私钥,其中公钥加密,私钥解密。对称加密包括DES(Data Encryption Standard),3DES(DES的增强),RC2,RC4,RC5,Blowfish以及IDEA(International Data Encryption Algorithm,也是对DES的增强)等;非对称加密有RSA(使用最广泛)Elgamal、背包算法、Rabin、D-H(Diffie-Hellman)ECC(椭圆曲线加密算法)。算法真多,具体内容可百度谷歌。

        公司的项目中主要用的是RSA非对称加密算法,所以它是本文的重点。非对称加密,简单讲,就是数据发送方用公钥加密,数据接收方用私钥对密文解密(公钥和私钥成对出现,两者中任意一个都可作为公钥,而另一个作为私钥)。使用非对称加密通讯的基本原理是:

1.两个系统A和B之间要加密通讯,首先A和B都要分别生成自己的公钥和私钥。

2.A和B的公钥交换:A的私钥自己保密,把公钥告诉B;B的私钥自己保密,把公钥告诉A

3.A给B发送信息时,A用B的公钥加密信息,然后发送给B。

4.B收到A发过来的消息后,B用自己的私钥解密该消息。

5.同样的,B可以用A的公钥将响应信息加密后发送给A,然后A用自己的私钥解密。

在整个通讯过程中,即便有人截获了A与B之间的通信报文,但由于用来解密的私钥在A与B自己手里,所以截获者最终拿到的是无意义的密文,从而保证了通讯的安全。

sqldeveloper4.0无法启动的问题

    sqldeveloper4.0的配置在windows环境有所变化。当我下载并打开sqldeveloper4.0时,会提示本机JRE安装路径,设置好后,会接着弹出一个错误提示,如下:

网上目前的解决方案都是针对4.0以前版本,目前在windows版本中如下配置即可(以XP为例):

1.在系统安装盘搜索sqldeveloper用户数据目录
    找到C:\Documents and Settings\Administrator\Application Data\sqldeveloper

2.点击进入,最终找到文件C:\Documents and Settings\Administrator\Application Data\sqldeveloper\1.0.0.0.0\product.conf

3.修改配置项AddVMOption
将AddVMOption -Xmx800m修改为AddVMOption -Xmx600m

重新启动sqldeveloper.exe,运行成功!
(关于AddVMOption配置,可根据自己机器配置情况调高或高低)

UltraEdit配置C、C++及Java的编译和运行环境

前提条件:

请自行安装好UltraEdit文本编辑器和C/C++、java编译环境。我使用的是UltraEdit 17.20.0.1013,C/C++环境使用的是MinGW,java版本为1.7.0_11,另外,因为editplus使用的版本不同及是否汉化,界面会有所差异,请对号入座。

一、C环境配置

打开UltraEdit–>高级–>工具栏配置,点击“插入”,然后依次输入如下:

菜单项目名称:C编译
命令行:gcc %n%e -o %n.exe
工作目录:%p

如下图:

说明:%n表示文件名称,%e表示文件扩展名,%p表示当前文件所在目录。

同样,再新增一个C运行工具,配置更简单,如下:

菜单项目名称: C运行
命令行:%n
工作目录%p

演示:
写一个简单的hello world程序,然后点击菜单中的工具–>用户工具组–>C环境,这样我自定义的C环境就出现在高级菜单栏的下方了,如图:

然后运行,结果如下:

二、C++环境配置
与C环境的配置基本相同,只是编译命令改为了g++,对此不再赘述,仅贴出C++编译及运行的菜单配置项:
菜单项目名称: C++编译
命令行:g++ %n%e -o %n.exe
工作目录:%p

菜单项目名称: C++运行
命令行:%n
工作目录:%p

三、Java环境配置

菜单项目名称: java编译
命令行:javac -d . %n%e
工作目录:%p

菜单项目名称: java运行
命令行:java -cp . %n
工作目录:%p

如果java文件是带包名的,则上面的java运行方式会报错,需要新建一个java运行菜单项:

菜单项目名称: java运行(带package)
命令行java -cp . %sel%.%n
工作目录:%p

当运行带package的java程序时,一定要选择对应的package名,如上图。

结束:
EditPlus配置C、C++及Java的编译和运行环境

Fiddler初次使用时应注意的几点

一、概述

        Fiddler是一个比较强大而又实用的Web调试工具,它能以代理的方式记录所有客户端和服务器的http和https请求,允许你监视,设置断点,甚至修改输入输出的数据,从而大大提高调试开发效率。

        同类的工具还有httpwatch,firebug,wireshark,google审查元素。与这些基于网页浏览器的工具不同,fiddler是一个富客户端桌面工具,不仅能监听浏览器对网页的请求和对浏览器的响应,而且可以监听其他程序(比如java桌面应用)的http请求(当然需要额外的设置,在此不赘述)。另外,值得一提的是,即便在浏览器的调试中,它也能胜任其他工具,比如IE浏览器,当我们需要弹出一个模式对话框(modalDialog)时,这些浏览器监听插件就派不上用场罗,看来还得fiddler出场。

二、基本原理

    fiddler实现原理,如下图:

    fiddler在客户浏览器及web服务器之间充当了一个请求及响应的代理角色,它会在本地建立一个默认代理服务,端口为8888,为此我们访问一下此端口,可见如下效果:

 

三、注意的问题及解决方法

      在我初次使用fiddler时,遇到了几个问题:

1.chrome和firefox浏览器无法被监听

fiddler安装之后,默认会在IE浏览器中安装一个fiddler的插件,所以它对IE及国内基于IE内核的各类浏览器都能实现监听,但其他内核的浏览器无法被监听。

解决办法:禁用chrome和firefox中具有代理功能的插件,比如我的chrome安装了switchSharp,禁用它或选择“使用系统代理设置”,或在switchSharp中新配置一个代理项(比如名为fiddler,用于指向代理127.0.0.1,端口8888,如下图),即可实现监听。

2.无法代理本地web服务器的访问请求

使用fiddler的时候,我们更多的是基于本地程序的调试,可惜fiddler捕捉不了本地(localhost或127.0.0.1)的http请求。难道fiddler就束手无策了吗?当然不是。

一般我们访问安装在本地的服务器程序时,使用的localhost或127.0.0.1,默认会绕过代理,直接访问目标服务器,通过fiddler特有的请求方式,可以使本地请求及响应都被fiddler拦截。

方法一:在localhost后增加.fiddler

比如请求http://localhost:8080改为http://localhost.fiddler:8080即可

方法二:更简单,在localhost或127.0.0.1后增加一个点即可

比如http://localhost.:8080

(全文完

EditPlus配置C、C++及Java的编译和运行环境

前提条件:
请自行安装好editplus文本编辑器和C/C++、java编译环境。我使用的是editplus v3.30,C/C++环境使用的是MinGW,java版本为1.7.0_11,另外,因为editplus使用的版本不同及是否汉化,界面会有所差异,请对号入座。

一、C环境配置
打开editplus–>工具–>配置用户工具–>工具–>用户工具–>工具组(任意一个工具组都可以),点击右边的组名,取名为“C环境”,确认后回到父窗口,点击“添加工具”,选择“应用程序”,然后依次输入如下:

菜单文字:C编译
命令:gcc
参数:$(FilePath) -o $(FileDir)\$(FileNameNoExt).exe
初始目录:$(FileDir)
动作:选择“捕获输出”

如下图:
C环境编译
注意:
1.其中的命令gcc这种写法的前提条件必须是已经将C编译环境的目录加入了系统PATH环境变量,否则必须写出此gcc命令的全路径,如:D:\Program Files\MinGW\bin\gcc.exe
2.编译参数也可简单配置为:$(FilePath) -o $(FileNameNoExt)

同样,再加入一个C运行程序,再次点击“添加工具”,选择“应用程序”,然后依次输入如下:

菜单文字:C运行
命令:$(FileNameNoExt)
参数(为空):
初始目录:$(FileDir)
动作:选择“无”

如下图:
C环境运行
注意:动作之所以选择为“无”,是因为如果程序需要与命令行交互,比如输入一些指令时,editplus无法提供输入功能,从而导致程序阻塞,所以必须释放,让windows的命令行自动弹出来执行此程序。

演示:
写一个简单的hello world程序,然后点击菜单中的工具–>用户工具组–>C环境,这样我自定义的C环境就出现在工具菜单栏的最下面了,如图:
C环境编译及运行菜单

 依次点击相应的“C编译”及“C运行”,效果如下:

C运行demo

二、C++环境配置
与C环境的配置基本相同,只是编译命令改为了g++,对此不再赘述,仅贴出C++编译及运行的工具配置:

菜单文字:C++编译
命令:g++
参数:$(FilePath) -o $(FileNameNoExt)
初始目录:$(FileDir)
动作:选择“捕获输出”

菜单文字:C++运行
命令:$(FileNameNoExt)
参数(为空):
初始目录:$(FileDir)
动作:选择“无”

三、Java环境配置
菜单文字:java编译
命令:javac -d .
参数:$(FileName)
初始目录:$(FileDir)
动作:选择“捕获输出”

菜单文字:java运行
命令:java
参数:$(FileNameNoExt)
初始目录:$(FileDir)
动作:选择“无”

如果java文件是带包名的,则上面的java运行方式会报错,需要改为如下配置方式:
1.新建一个组

菜单文字:java运行(带package)
命令:java
参数:$(CurSel).$(FileNameNoExt)
初始目录:$(FileDir)
动作:选择“无”

2.当运行带包名的.class文件时,需要选择包名(这点非常重要),然后点击菜单项“java运行(带package)”,即可,如下图:


结束:
另外一个稍强点的编辑器UltraEdit,也能对相关编程语言进行类似本文的配置,见本博客UltraEdit配置C、C++及Java的编译和运行环境

Eclipse下maven依赖报错问题

记得很久很久以前,有过一次类似的经历,在Eclipse下的maven工程名上会出现一个红色的惊叹号,而今天终于又遇到鸟。。。
大家对Eclipse工程中的惊叹号并不陌生,当我们把别人的工程导入本地或从svn之类的代码仓库导入时,经常会遇到这个标志,一般来说,这个问题比较单纯,原因是依赖的第三方jar在本地的保存路径与工程中默认的路径不一致,所以解决方式也很简单。
但今天这个却让我折腾了好几个小时。由于在maven工程中,如果有依赖缺失,可以通过更新依赖来解决,当然,前提是你必须在pom.xml中配置好了此依赖的来源maven仓库,而且确保它在此仓库中存在。而我的工程属性-java build path也好,maven依赖配置文件pom.xml也好,都检查过了,配置正常,然后project-clean清理,这个惊叹号依然存在,编译后的class目录中的.class文件也不完整,可见这个惊叹号并不是误判(eclipse经常抽风提示错误)。
解决办法:
最后在工程的workspace\.metadata目录下看到一个.log日志文件,打开才发现原来eclipse对编过程中的错误是有记录的,直接提示commons-httpclient-3.1.jar包出错,于是找到maven工程在本地的repository仓库,找到对应的jar删除,右击工程-maven-update dependencies,重新依赖更新后问题解决。
补充:
这.log日志文件也可以在eclipse直接看到,点击Window-Show view-Error log,即可看到。