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)。

2014阅读清单

1.黑客与画家
IT名人阮一峰大神翻译的作品,作者为硅谷创业教父paul graham。最初也是在阮哥的个人网站上看到介绍马上购买阅读的,这本书很适合我们这种行业的人阅读,作者以自己亲身编程和创业经验告诫大家,作为程序员应该具备黑客思维方式,同时对各种不同的编程语言的特性要能理解深刻,在不同的开发工作中选择合适的开发语言;要想创业,应该具备独特的思维方式才能出奇制胜。还有更重要的一点,作者在文中极力推崇lisp语言,认为它是一种优秀的更适合黑客思维方式的程序员使用的语言,同时也用比较理性客观的方式推论出100年后编程语言的可能发展方向,其中提到java语言肯定会死(-_-!别冲动,必需理性看待)。

2.中国最穷的小伙子发财日记
4月份在医院住院期间在手机淘宝上看到的,是作者以自己亲身经历为样板编写的自传体励志小说,给当代中国年轻人以激励和指引,阅读后使我有所启发,值得推荐。

3.富爸爸穷爸爸系列
同上,住院期间看的,这是一套系列丛书,让我有相见恨晚之感,相信此丛书一定会改变我的财务观念。该系列好像有几十本,我看的是盗版(不好意思,同时也没分清自己看的是丛书中的哪几本),不过后面又买了正版《富爸爸销售狗》,《富爸爸财务自由之路》。简单讲,这套书讲述了作者的富爸爸和穷爸爸完全不一样的财务思维使得他们最终走上了完全不一样的财务之路:穷爸爸非常聪明,拥有多个博士学位,知识渊博,大学教授,最后又成为夏威夷州的教育部长,可谓无限风光,但穷爸爸认为自己是知识份子,不屑于谈论关于金钱的话题,认为唯有努力工作,省吃俭用,做好储蓄,才能有足够的钱来维持生活,才能活得体面,可惜穷爸爸终其一身都陷于财务窘境之中。而富爸爸具备不一样的财务观念,他认为不能成为金钱的奴隶,人不能为钱工作,而应该让钱为自己工作,让别人为自己工作,最终使得富爸爸成为了夏威夷首富。作者从小受两个爸爸的影响,在成长过程中,他慢慢接受了富爸爸的金钱观,最终使自己在40多岁时实现了财务自由(简单点讲,个人认为,财务自由就是让自己在达到一定年龄时就拥有了足够的金钱满足余生的一切财务支出,实现财务自由的年龄越年轻代表一个人的财务越成功)。
部分经典语录:
穷人会说,我没钱,我买不起;富人会说,我怎样才能买下这个东西。
穷人买的是负债,富人买的是资产。
穷人是为钱工作,富人是让钱为自己工作。
如果你象一个穷人那样思考问题,那么无论你赚多少钱,你仍旧会把钱全部花光而一无所有。
穷人害怕风险,不愿意从目前安全的环境中改变,而富人善于把握住风险中的机会。
邻居告诉我,他有个理财收益是5%,而我告诉他,我从政府的一个投资中获得的收益是16%。几天后,邻居拿着一份他收集的调查报告证明我的收益是十分危险的。可是这么多年过去了,他的收益依然是5%,而我的依然是16%。

4.马云传
想适当看看名人传记,首选了马云,关于它的传记市面上有不少,我是买的亚马逊kindle上的,作者赵建。其实之前看过一些零零碎碎的关于马云的文章,现在算是作了系统回顾,不过这本书的内容大概是截止于07,08年吧,内容有点旧了,至少现在余额宝都出来一年了。他的传奇故事让我肃然起敬,去掉书中对他充满的溢美之辞,也适当提到,马云也是人,也会犯错误,而且也犯过不少错误,但是在决定阿里巴巴的生死命运的节骨眼上,没有犯大错。虽屡次被骗,仍以诚信为本,服务天下客商,实乃不易。

5.史蒂夫 乔布斯管理日志
在此之前当然也知道他的一些事迹。本书不是那种连贯性很强的小说或散文类读物,但通过此书,更进一步了解了乔布斯的性格,成长经历,创业起伏。特别是他的蛮横霸道竟然能对企业的发展带来惊人的力量,这是我等受过小绵羊般正统文明教育的人所难以想像的。这说明世间万物,只要在合适的土壤生成,它就能打破人类的想像力。

6.富同学穷同学
从书名就可以看出,该书作者阅读了大量开启财富思维的书籍,并且一定读过《富爸爸穷爸爸》系列,与该书大概不同的是,穷爸爸在《富爸爸》一书中有一个具体的人物载体,而在该书中,并没有具体指出哪个同学是穷同学,只是泛指了一下。当然,这不是重点,该书同《富爸爸》的宗旨是一样的,都希望当今社会的人们能够树立正确的独立的财富观念,让自己实现真正的财务自由,从而享受美好的人生。同时,两书都反映了一个社会的现象:许多人都在抱怨工作,抱怨生活,想改变现状,甚至作出了计划,但终究成为了行动上的矮子,最终抱憾终生。至此,我也希望自己最终能够勇敢的跨出第一步。《富同学》一书,另外重点提到了一点,人生路上需要不断地编织自己的交际网,为自己的事业提供更多的支点,读到这里,我甚感惭愧,这是我最最薄弱的地方。看来,我还得从小事做起,有意识地自然地与人交际,练习自己的口才,培养自己的情商。

7.人生
路遥的《人生》,先于长篇小说《平凡的世界》。这是一部七八十年代的理想与现实发生碰撞,让人从不同的抉择中慢慢走向成熟的故事;这也是一个个与时代无关,却永远具有在任何时代保持意义的故事,这才是真实的人生。

8.穿布鞋的马云
又是一本关于马云的书,与前面看过的马云传差别不是很大。唯一最大区别是,这本书成书于阿里巴巴上市前夕,内容稍鲜活一点。看完这本,估计很长一段时间不会再看关于马云的书了。

9.路遥十五年祭
该书内容主要是路遥的亲友为缅怀这位过早去世的文学大师而写的纪念文章的合集,关于路遥的出生及成长背景,写《人生》和《平凡的世界》的前因后果,让我深深感受到一位对文学狂热的作家是怎样历尽艰辛才能炼成。特别是书中最后,路遥以较长篇幅描述了他创作《平凡的世界》的生活经历及心路历程。路遥的书是好书,我不仅要把《平凡的世界》再看一遍,以后也一定会再把他的全集买下,仔细看个够。路遥,好走!

10.乔布斯传(50%)

内容较长,暂只看了一半。感觉看《乔布斯传》,不仅仅是对乔布斯一生的传奇讲述,更像是一部近半个世纪以来IT行业的进化史,包括计算机硬件,网络和图形界面的发展,内容十分精彩。另外,值得称道的是,作者为了写乔布斯传,专门访问了与乔布斯一生有过交集的100多位人物,以尽可能客观的方式展现了一个人而不是神的方方面面,包括他的优点和各种性格上的缺点,毫不掩饰。这与前面看过的《马云传》(读马云传,感觉他就是神)比起来,不是一个级别,是收获最大的一本书,强烈推荐。

总结,2014年看的几本书主要是人物传记,不仅了解了几位我想了解的人物故事,更让我感觉到西方人做事的严谨(从写人物传记的角度),中国人应该值得学习。

新浪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自己手里,所以截获者最终拿到的是无意义的密文,从而保证了通讯的安全。

Chrome扩展开发中的桌面通知管理

第一次在扩展中使用桌面通知功能,默认使用的webkit API接口,实现很简单:

var notification; 
function showNotification(content){    
    notification = webkitNotifications.createNotification('','提醒',content);  
    notification.show();
    setTimeout("notification.close()",5000);
}

本来相安无事,但如果在5秒之内连续发出多个通知呢?毕竟notification对象只有一个,每调用一次showNotification方法,该变量就会指向最新创建的通知对象,也就是说,只有最后一个窗口才会“如约”在5秒后自动关闭。为了解决这个问题,搜索网络终不得结果,最后想到用一个数组来存放多个通知对象,思路如下:

1.假如有N个通知对象,按先后顺便,存放在一个数组里。

2.第一个通知显示5秒后,从数组中取出该对象,调用关闭方法并从数组中移除,第二个、第三个、第N个依此类推。

var notifications = new Array(); 
function showNotification(content){    
    notification = webkitNotifications.createNotification('','提醒',content);  
    notification.show();

    notifications.push(notification);
    var index = notifications.length - 1;
    setTimeout("notifications["+index+"].close();notifications.splice("+index+",1)",5000);
}

这样看着似乎可行,但实际上有问题,每个通知对象从数组中被删除时,需要依靠下标来定位,然而当一个对象被删除后,数组中的其余对象的下标也就发生了变化,也就是导致对象定位不准的问题。于是决定弃用数组,最终采用了JSON对象:

var notifications = {};//通知容器
function showNotification(content){
	notification = webkitNotifications.createNotification("","提醒",content);
	notification.show();
	
	var k = "_" + new Date().getTime() + Math.random();//生成随机key
	notifications[k] = notification;
	setTimeout("notifications['" + k + "'].close();delete notifications['" + k + "']",5000);
}

感觉很不错,采用JSON格式的优势就在于,不用考虑下标的问题,只需用一个随机字符串作为key与对象一同保存到json对象容器中,理论上可以容纳任意多个通知对象,并且可以有条不紊地依次删除。

用最简单的事实说话:什么是Cookie,Cookie数据泄漏的危害

一、什么是Cookie

        简单来说,Cookie是网站在用户浏览器中保存下来的一份个人信息,有了Cookie,用户下次访问该网站时就可以免输入用户名甚至密码了(比如登陆淘宝网,用户名一栏就自动填充了,而为了安全,密码是必须的),因网站而异。另外,用户使用账号登陆网站后,要靠Cookie来维持会话Session,以保持在线状态,一旦清空当前网站对应的所有Cookie数据,用户将立即下线。真啰嗦,看图:

这是在OSChina登陆状态下的Cookie。接下来把它清除,然后刷新,结果如下:

可以看出,没有了Cookie,用户马上变成了游客身份,也就是用户维持登陆状态的信息已经不存在了。所以说,如果没有Cookie,许多网站都登陆不上去了。再比如,当用户访问京东等购物网站时,在不登陆的状态下,可以直接将选中的商品加入购物车,其原理也是基于Cookie来记录用户的购物车数据,只要不清除它,下次再打开该网站时,购物车依然能够显示添加的商品。

二、Cookie数据泄漏的危害

        又以上面OSChina为例,如果我打开第二个浏览器(猎豹),以游客身份访问oschina.net,然后把之前浏览器(Chrome)Cookie中的oscid值取出来,注入第二个浏览器中,结果会怎么样呢。

通过脚本注入这个oscid值,然后刷新,即可看到,游客身份变成了在线用户。也就是说,有的网站就是通过一个或多个cookie值来映射到一个会员ID,只要任何一台电脑的任何一个浏览器中包含这些Cookie值,就可以实现会员自动登陆。当然,这个cookie值会有一个过期时间(由网站系统响应头决定),以保证一定的安全性,另外补充一点,oschina对cookie的oscid值禁用了js读取或者httponly,以防网站未知的XSS跨站脚本漏洞导致用户账户被盗,所以为了演示的需要,我是从浏览器的设置功能中取出来的。

    cookie的作用不小,给用户和网站经营者带来很大的便利,但同时不可避免带来一些安全隐忧,只要我们保持安全意识,不在公共电脑上登陆敏感账户,我们就能趋利避害,享受cookie。

KindEditor+SyntaxHighlighter个性化修改

        我的个人博客用的富文本编辑器是KindEditor,这是国产开源软件中的一款精品,但作为程序员,它的默认语法高亮用的是google prettify,整体色调比较素雅,为了满足实际需求,也引入了SyntaxHighlighter作为第二个语法高亮工具,国内许多著名网站都用了这个工具,如CSDN和开源中国。关于二者的结合方法,网上很容易找到,本文也会简单介绍。

        在我的wordpress博客中使用的对应插件是Kindeditor For WordPress+SyntaxHighlighter Evolved。我发现,大多情况下,使用SyntaxHighlighter进行语法着色即可,但如果代码行数较少,使用Kindeditor默认的prettify则更好看。于是我决定对Kindeditor做些微的改动,使我在输入代码时可自由选择使用何种着色效果:SyntaxHighlighter or prettify先看效果:

public static void main(String[] args){
    System.out.println("hello,this is colored by SyntaxHighlighter!");
}
public static void main(String[] args){
    System.out.println("hello,this is colored by prettify!");
}

两者唯一的区别就是在输入代码框时,我加入了一个自定义的复选框,如果勾选,则表示使用prettify,否则默认SyntaxHighlighter :

这样我就实现了两种语法高亮工具同时使用,鱼和熊掌兼得。下面再看我对源码的一点修改。

1.修改Kindeditor For WordPress/plugins/code/code.js

KindEditor.plugin('code', function(K) {
	var self = this, name = 'code';
	self.clickToolbar(name, function() {
		var lang = self.lang(name + '.'),
			html = ['<div style="padding:10px 20px;">',
				'<div class="ke-dialog-row">',
				'<select class="ke-code-type">',
				'<option value="js">JavaScript</option>',
				'<option value="html">HTML</option>',
				'<option value="css">CSS</option>',
				'<option value="php">PHP</option>',
				'<option value="pl">Perl</option>',
				'<option value="py">Python</option>',
				'<option value="rb">Ruby</option>',
				'<option value="java">Java</option>',
				'<option value="vb">ASP/VB</option>',
				'<option value="cpp">C/C++</option>',
				'<option value="cs">C#</option>',
				'<option value="xml">XML</option>',
				'<option value="bsh">Shell</option>',
				'<option value="">Other</option>',
				'</select>',
				'<label>&nbsp;&nbsp;<input type="checkbox" id="isPretty">使用prettify</label>',//1.加入自定义的选择按钮
				'</div>',
				'<textarea class="ke-textarea" style="width:408px;height:260px;"></textarea>',
				'</div>'].join(''),
			dialog = self.createDialog({
				name : name,
				width : 450,
				title : self.lang(name),
				body : html,
				yesBtn : {
					name : self.lang('yes'),
					click : function(e) {
						var type = K('.ke-code-type', dialog.div).val(),
							code = textarea.val(),
                                                        //2.根据是否选择prettify生成相应的样式
							cls = type === '' ? '' : (isPretty.checked ? (' lang-' + type) : type),
							html = '<pre class="' + (isPretty.checked ? 'prettyprint':'brush:') + cls + '">\n' + K.escape(code) + '</pre> ';
						if (K.trim(code) === '') {
							alert(lang.pleaseInput);
							textarea[0].focus();
							return;
						}
						self.insertHtml(html).hideDialog().focus();
					}
				}
			}),
			textarea = K('textarea', dialog.div);
		textarea[0].focus();
	});
});

其实很简单,其他代码不用太关注,就只修改了两处(有注释)。

2.修改Kindeditor For WordPress/plugins/code/prettify.css

.ke-content pre {
     border: 1px solid #ddd;
     border-left: 5px solid #6CE26C;
     background: #f6f6f6;
     margin-left: 2em;
     padding: 0.5em;
     font-size: 110%;
     display: block;
     font-family: "Consolas", "Monaco", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace;
     margin: 1em 0px;
     white-space: pre;
}

pre.prettyprint {
     border: 0;
     border-left: 3px solid rgb(204, 204, 204);
     margin-left: 2em;
     padding: 0.5em;
     font-size: 110%;
     display: block;
     font-family: "Consolas", "Monaco", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace;
     margin: 1em 0px;
     white-space: pre;
} 

更简单,在原来的样式pre.prettyprint前面加入一个样式.ke-content pre(其实就是对pre.prettyprint复制过来再修改了一点颜色)。这个样式文件的修改并不是必须的,他只是在文本编辑期间,让正在编辑的代码可以被简单预览,而在文章发布出去以后,这个样式基本就不会被使用了。

这样,我的两个着色工具就可以自由切换使用了。

最简单的SSH代理客户端实现

    我的SSH帐号是通过香港的虚拟主机附赠的,目前主要是用浏览器插件(比如SwitchySharp)+ MyEnTunnel/Bitvise + 远程主机SSH代理服务的模式实现的。

    一直以来相安无事,但前几天主机商把SSH服务的监听端口由默认的22改为了2289,在家里将相应的端口也改过来即可恢复正常,但在公司就没那么幸运了。公司内部网络对外网的端口访问作了限制,只能访问标准的如80,8080,21,22等端口,很不幸,2289端口不在此范围内。几天下来出不了墙,很是焦虑,后来在公司的几台测试用linux服务器上通过telnet myhost.com 2289测试可用,太幸运了,至少找到了一个可供代理出口的机器,但是在linux机器上我用什么软件来替代MyEnTunnel/Bitvise呢,后来基于这个思路去寻找相关替代品,终于在走了这段弯路之后,发现了SSH命令本身就具备动态转发的功能。十分简单:

usage: ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec]
           [-D [bind_address:]port] [-e escape_char] [-F configfile]
           [-I pkcs11] [-i identity_file]
           [-L [bind_address:]port:host:hostport]
           [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
           [-R [bind_address:]port:host:hostport] [-S ctl_path]
           [-W host:port] [-w local_tun[:remote_tun]]
           [user@]hostname [command]

只需挑出几个必需的参数即可:

root@testserver [~]# ssh -D 0.0.0.0:7077 -p 2289 myname@myhost 

然后根据提示输入相应的用户密码即可,这样就完成了在公司内网代理服务器的实现(相对于我的办公电脑它是服务器,相对远程虚拟主机它是客户端)。当然也可以写自动化shell脚本,但因为是公用测试机器,就没这个必要了,而且可避免其他人看到我的账密信息。

参数说明:
-D 表示启用基于socks的动态端口转发,监听本地7077端口,0.0.0.0:7077表示将所有IP发送到本地7077端口的请求转发到远程myhost主机2289端口

-p 远程接收请求的SSH服务端口

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配置,可根据自己机器配置情况调高或高低)

hibernate注解@Formula使用中要注意的一点

在工作中遇到一个@Formula使用中的小问题,记录一下。

以例子形式展现:

import javax.persistence.Entity;
import javax.persistence.Table;

import org.hibernate.annotations.Formula;

@Entity
@Table(name = "in_come")
public class Income {
	private int id;
	private double salary;// 薪水

	private double reward;// 奖金

	private double subsidy;// 补助

	@Formula("(select salary + reward + subsidy from in_come a where a.id=id)")
	private double total;// 总收入

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

        //省略其他getter和setter方法
} 

如上代码,我想通过@Formula来统计各类收入之和。但很不幸,每当新增或修改完一条记录后,自动跳转到记录列表页面时,total死活出不来,总是为0,需要将该列表页面重新查询一遍才行。

解决方法:当新增或修改完记录后,且在自动跳转到列表页面之前,将会对记录重新查询,在查询之前加入一句EntityManager.clear()即可。这句的目的是将刚刚操作过的记录彻底从缓存中清除,迫使程序查询时从数据库中获取最新的数据,这样@Formula中定义的SQL就能够真正被执行。