存档
“白银帝国”观后感
评星:***
影评:女导演,拍得比较感性。
自由、平等、人性本源,是导演要宣扬的现时代理念。
商战、权谋等内容展现不足,显得有些无力。
至于情感纠结,伦理道德,比雷雨还是简单多了。
总的来讲,演员表演还都比较到位。
用 ImageMagick 转换图片大小
ImageMagick 是一套很好的图片处理工具包,而且开源免费,使用非常广泛。
贴一个转换图片大小的命令,可以批量的对很多文件进行瘦身,比较实用。
Linux 下:
find . -name '*.JPG' -print -exec convert {} -resize 1024x768 ../resized_1024x768/{} \;
Windows 下:
for %I in (*.jpg) do convert %I -resize 1024x768 ..\resized_1024x768\%I
Windows Cygwin 下:
find . -iname "*.jpg" | xargs -l -i convert -resize 800x600 {} ../resized_800x600/{}
另外,因为镜头的横拍和竖拍的关系,有些图像是侧的,需要90度翻转下,不然就得把脑袋侧过来看了:-)
也有个命令行的小工具 jhead 可以帮助自动的校正图像的翻转,需要注意的是还需要配合 jpegtran,把两个小工具下载放到在 %PATH% 中的某个目录下,然后执行下面的命令就好了。
# Windows / Linux 处理当前目录中的图片 jhead -autorot *.jpg # Windows 下处理当前目录及子目录中的图片 jhead -autorot **\*.jpg # Linux 下处理当前目录及子目录的图片。 注意 JPG 大小写 find ./ -name '*.JPG' -exec jhead -autorot {} {} \;
除了改变图像旋转之外,jhead 还可以通过命令行提取和修改图像的 Exif 信息,具体用法见其主页,这里也提供下打包下载。
当然,使用一些其他的工具也是可以实现同样的目的的。方法有很多种,不管黑猫白猫,抓到老鼠的就是好猫。这几个命令的好处是比较方便写批量的脚本。
在 Java 程序中释放 RMI 端口
通过 LocateRegistry.createRegistry(port) 创建了一个 rmiregistry 监听 port 所在端口,
如果想要在程序中把这个端口关闭,也就是关闭 RMI registry 服务,可以参考以下的代码。
注:似乎在2003年的时候,这个方法还行不通,到了 JDK6 的版本才解决这个问题的。
参考 Sun bug 4457683, bug 4508962, 以及 这个 mail archive。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | import java.rmi.NoSuchObjectException; import java.rmi.Remote; import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; public class RMITest { public void testRMIPortRelease() { System.out.println("Testing port release"); System.out.println("Acquiring port... "); Remote reg = null; try { reg = LocateRegistry.createRegistry(1102); } catch (RemoteException ex) { ex.printStackTrace(); } System.out.println("releasing port... "); try { java.rmi.server.UnicastRemoteObject.unexportObject(reg, true); } catch (NoSuchObjectException ex1) { ex1.printStackTrace(); } reg = null; } public static void main(String[] args) { RMITest s = new RMITest(); s.testRMIPortRelease(); } } |
[转] Java Prime number check
原文出处: http://ventrix.nsdc.gr/code_folds/2008/10/07/java-prime-number/
Information about the author: http://kospol.nsdc.gr/
========================================================================
This is one approach to check if the given number is a prime number. It can take a very big number as an argument. It uses no threads and has no comments. Think it as version 0.01.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 | /* * Prime.java * * Copyright 2008 Ventrix <ventrix@gmail.com> * * http://ventrix.nsdc.gr/code_folds/ * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ import java.math.BigInteger; public class Prime { private static long start; private static long end; public static void main(String[] argv) { boolean isprimen; //http://java.sun.com/j2se/1.4.2/docs/api/java/math/BigInteger.html#isProbablePrime(int) //http://primes.utm.edu/lists/small/small.html //for i in `seq 1 1000`; do java Prime $i >> primes; done //cat primes | grep "is a" start = System.currentTimeMillis(); try { BigInteger bigNumber = new BigInteger(argv[0]); if (bigNumber.compareTo(new BigInteger("2147483647")) == 1) { if (bigNumber.compareTo(new BigInteger("9223372036854775807")) == -1) { Long longNumber = new Long(argv[0]); bigNumber = null; isprimen = isNorPrime(longNumber); } else { isprimen = isBigPrime(bigNumber); } } else { bigNumber = null; Integer intNumber = new Integer(argv[0]); isprimen = isPrime(intNumber); } if (isprimen) { System.out.println(argv[0] + " is a prime!"); } else { System.out.println(argv[0] + " is NOT a prime!"); } end = System.currentTimeMillis(); System.out.println("Completed in +" + (end - start) + "ms"); } catch (Exception e) { e.printStackTrace(); } } private static boolean isBigPrime(BigInteger number) { System.out.println("You gave me a BIG number"); BigInteger[] remain; remain = number.divideAndRemainder(new BigInteger(new Integer("2").toString())); if (remain[1].compareTo(new BigInteger("0")) == 0) { return false; } remain = number.divideAndRemainder(new BigInteger(new Integer("3").toString())); if (remain[1].compareTo(new BigInteger("0")) == 0) { return false; } int y = 2; int x = (int) Math.sqrt(number.doubleValue()); for (int i = 5; i <= x; i += y, y = 6 - y) { remain = number.divideAndRemainder(new BigInteger(new Integer(i).toString())); if (remain[1].compareTo(new BigInteger("0")) == 0) { return false; } } return true; } private static boolean isNorPrime(Long number) { System.out.println("You gave me a normal number"); if (number % 2 == 0) { return false; } if (number % 3 == 0) { return false; } int y = 2; int x = (int) Math.sqrt(number); for (int i = 5; i <= x; i += y, y = 6 - y) { if (number % i == 0) { return false; } } return true; } private static boolean isPrime(Integer number) { System.out.println("You gave me a small number"); if (number < 2) { return false; } if (number == 2) { return true; } if (number % 2 == 0) { return false; } if (number == 3) { return true; } if (number % 3 == 0) { return false; } int y = 2; int x = (int) Math.sqrt(number); for (int i = 5; i <= x; i += y, y = 6 - y) { if (number % i == 0) { return false; } } return true; } }//class</ventrix@gmail.com> |
Windows XP 下 Chrome 浏览器 SOCKS 代理设置
时间真的过的很快,Google 的 Chrome 浏览器出来也有一年多了。一出来的时候就装了用过,却发现还是有很多待完善的地方,很多方面还是比不上 Firefox,也不是很稳定,除了速度快这个最大的优点以外。
但是最近重新装了 3.0.x 的 DEV 版和 4.0.x BETA 版的 Chrome 以后,真的觉得很不错,浏览器本身的速度和打开网页的速度仍旧很快,甚至更快了,而且一些以前棘手的问题也在一个个的被消灭了,比如这个点击 Tab 会导致到另外一个独立的 Window 的bug,也可以像 Firefox 一样点击 Ctrl + Shift + T 打开之前关闭的 Tab 页了,对 Linux 的支持也越来越好,用了原生的 GTK;MAC 的版本也在稳步前进中,一些新的功能比如插件的支持也在实现了并在不断的完善中,开发文档也发布了,等等等等。所以最近用 Chrome 越来越多,其他的浏览器反而少了。
不过还是有个问题非常困扰,就是不支持 SOCKS 代理。因为在公司上网,由于政策的限制,有些网站是被屏蔽的,幸好有一些代理可以用。IE 下用 PAC 文件代理设置,只要类似于 “SOCKS x.x.x.x:1080” 就可以了,Firefox 下用插件 FoxyProxy,问题都不大。
Chrome 的代理设置用的是跟 IE 一样的系统代理设置,结果发现通过 SOCKS 代理出去的时候,总是报错:
- 错误 320 (net::ERR_INVALID_RESPONSE): 未知错误。
所以访问那些被屏蔽的网站,都需要特地在开 IE 才行,很是不方便。
后来注意到其他人给 Chrome 提的那个 issue 被解决了,但是试过,Windows 下还是不行,Linux 下倒是可以的了。
再过了半个月,看这个问题就要沉下去了,就也去那里提了自己的问题, 在跟回复的人讨论了之后,才发现了一个解决的办法,其实只要用 “SOCKS5 x.x.x.x:1080” 就可以了,其中一定要写上 5 这个版本。
办法虽然是找到了,但其实还是有两个疑问的:
- 为什么 IE 下面不用配置 socks5 的版本但是代理也是用的好好的?
- 即使这个方案,也还是不够完善,代理工作的并不是很稳定,时好时坏,坏的时候,点“刷新”,网卡上都抓不到包的,也就是说 Chrome 并没有发出浏览的请求包。
不管怎样,总算是找到了一个让 WIndows 下 SOCKS 代理工作的办法了,大部分时候也都还是可以用的。
真的是希望自己也有能力,可以把第2个问题自己查出来解决掉,呵呵。
下班回家是个问题
自从公司调整,城西到滨江的接送车班次也减少了,从此下班回家就成了一个很大的问题。
已经连续好多次有在公司等车等半个小时到一个小时才等到车过来的事情发生,都是因为司机晚点了或是车坏了。
昨天就是,打算坐 18:20 的车回的,结果车出故障开去维修厂了;而下一趟 18:40 的等到 50 才过来,整整耽搁了半个小时。
于是想今天早点回,第一次坐 18:00 的车试试看,结果又是不顺。
这一趟车倒是确实还比较准时,不过开到快到一桥的时候就不对劲了,前面的车堵的相当的厉害,跟司机聊,说今天这个路况还算好的,那好吧,毕竟第一次坐这趟车,心想司机应该比我们有经验吧。可等起起停停到了一桥中间的时候,整个队伍就干脆停滞不动了。这一停就是半个小时。
应该是前面出故障了,否则不会这样的。不过我们也确实够倒霉的。
好的一面是下车欣赏了会夜晚的江景。
白天还在公司说起,现在早晚的路况都很差,路上花的时间比以前要多十几二十分钟,不知道是因为今年车市的火爆,或是跟阿里搬到滨江也有关系。
唉,现在下班回家真是个问题了。
[转] Wireshark的Pcap文件格式分析
转自:http://blog.chinaunix.net/u2/82392/showart_1870732.html
前段时间因工作要求,需要对各种数据包进行分析和操作,内容涉及网路协议分析,socket,文件操作等。在此分享下学习和实践的经验。
首先介绍下网络抓包、协议分析的必备软件Ethereal,新版(Wireshark)以下还以 Ethereal代之,目前最新版本已经支持在无线局域网抓包了。Linux和Windows均有对应安装包,它们分别是gcc和VC++编译的。不过 Windows下是基于Winpcap而Linux下则是Libcap。Ethereal作为网路协议分析、学习、开发的敲门软件,其使用技巧及其原理机 制(BPF)网上都有比较详尽的介绍,当初我收集的相关资料随后也会上传,不再多说。下面主要介绍下Ethereal默认的*.pcap文件保存格式。

Pcap文件头24B各字段说明:
1 Ethernet, and Linux loopback devices
6 802.5 Token Ring
7 ARCnet
8 SLIP
9 PPP
10 FDDI
100 LLC/SNAP-encapsulated ATM
101 “raw IP”, with no link
102 BSD/OS SLIP
103 BSD/OS PPP
104 Cisco HDLC
105 802.11
108 later OpenBSD loopback devices (with the AF_value in network byte order)
113 special Linux “cooked” capture
114 LocalTalk

========================================================
这里再把pcap文件头的结构定义添上:
typedef unsigned long DWORD; typedef unsigned short WORD; typedef unsigned char BYTE; typedef struct PCAP_FILE_HEADER { DWORD magic; WORD versionMajor; WORD versionMinor; DWORD thisZone; DWORD sigfigs; DWORD snapLen; DWORD linkType; }PcapFileHeader, *PPcapFileHeader;
2011-02-17 补充两篇文章:
Wireshark hub 下抓不到包问题解决
在同一个 hub 下接笔记本和机顶盒(STB),需要在笔记本上抓包查 STB 的问题。
如果不用 capture filter ,能抓到经过 hub 的所有的包,包括 http 的。
因为包太多,想只过滤出 http 的包用于分析,于是加 capture filter 为 “port 80“, 结果一个包都抓不到了。
尝试了各种办法,都没有结果。于是到 Wireshark 的 maillist 发帖求助,很快就有了结果。
原来因为所接的 Hub 其实是电信的 Adsl 猫,有四个 RJ45 网口, STB 是通过猫拨号上网的,所以 capture filter 需要用 “pppoes && port 80“,其中的 pppoes 不可少!
从刚开始以为是 Wireshark 的一个 bug,到发帖求助,到得到结果,也就是短短几天的时间。
在这个过程中,对网络方面的知识也有了更多一点的了解。开源社区确实很好很强大,真正的牛人专家很多,参与其中确实能学到很多的知识。
不顺利的一天
今天对我和包包都是不顺利的一天。
白天在公司,各自都和其他的同事有争执,并都是属于那种本来并不完全是自己的职责范围之内,提出来是为了以后的改进的考虑,结果都遭到了反对。尽管事情并不大,但是心里都有些不快。
下班坐402去吴山广场,先是等车等了有20多分钟,然后车开到海潮路,熄火了之后再也点不着了!
不想耽搁耗着,打车过去了。
接下来总算还好,刻了章,吃了饭,写了藏头诗。
看着时间的,去吴山广场的西面坐25路去了,看是包包的手表。末班车是21:40,还来得及。
结果又是等了20多分钟还不见车来,看表上40已经过了,接着发现,表慢了半个小时!只能打车回了城西。
。。。
真的是,人不顺,喝凉水都塞牙,什么都掉链子,算是最近这阵最不顺的一天了,也是难得,记录之。


