RSS
 

ubuntu配置PPPOE后有线网络失效

13 Oct

先介绍下Ubuntu下怎么配置PPPOE,

打开终端输入

sudo pppoeconf

如果没有安装pppoeconf的话

sudo apt-get install pppoeconf

设置用户名和密码,还有一些相关设置

开启连接

sudo pon dsl-provider

关闭连接

sudo poff dsl-provider

查看连接信息

plog

PPPOE配置完以后,NetworkManager applet上有线连接会显示device not managed

什么原因至今没有发现,但是修改/etc/NetworkManager/nm-system-settings.conf文件中的配置可以解决这一问题

sudo gedit /etc/NetworkManager/nm-system-settings.conf

文件内容如下:

[main]
plugins=ifupdown,keyfile

[ifupdown]
managed=true

将managed=false改为true后,重启系统即可。

 
2 Comments

Posted in linux, ubuntu

 

[翻译]再议如何确定Java对象的大小

10 Oct

原文地址:http://www.jroller.com/maxim/entry/again_about_determining_size_of

译文地址:http://www.yeeyan.com/articles/view/104091/62930

再议如何确定Java对象的大小

有时计算java对象在内存中的大小是必要的。这篇文章将介绍一种借助于Java Instrumentation API的方法。

适用场景

计算java对象大小适用于如下场景

  • 缓存 缓存通常用来提高频繁访问数据的性能。由于受到Java进程可分配内存大小的限制,它们通常不能从数据库(或者其他存储)中加载所有数据。也就是说,为了确保其内存大小不超过预设,缓存必须计算已加载数据的大小并且丢弃旧数据。
  • 检测内存泄漏 在某些情况下你能在存在泄漏的指令的前后量测堆内存的大小并发现内存泄漏。如果你怀疑某些对象存在泄漏,你需要精确量测他们的大小并和泄漏的内存进行比较。有许多专门的大工具用可供使用,但是他们通常都太重量级了,并影响性能。在某些情况下如果有一种简单的对象大小计算方法,你能够更快的解决问题。
  • 其他内存估算 例如,你能估算JVM最大堆内存的设置,如果你知道有多少对象将在你的应用程序中创建。
  • 纯属娱乐 :)

常见方法概述

有几种不同的方法可用于确定java对象的大小。他们大多是在JDK 5.0之前已经出现。

  • http://jroller.com/page/mipsJava?entry=sizeof_java_objects -使用System.gc(),Runtime.freeMemory(), Runtime.totalMemory()方法来计算java对象的大小。这个方法通常需要许多资源才能精确计算出对象的大小。它必须创建许多的需要估算对象的实例(最好是几千个),在创建的前后量测堆内存的大小。这个方法对于使用缓存机制的生产系统并不奏效。这个方法的优点是可以得到较为精确的结果,而不受Java实现版本和操作系统的影响。
  • 另一个更好的方法:http://www.javaspecialists.co.za/archive/Issue078.html - 它更加的巧妙。他使用真实的原始类型大小的对照表来确定整个对象的大小。使用反射API遍历对象继承链上的成员变量并且计算所有原始类型变量的大小。这个方法不像上一方法那样需要很多的资源并能够用于缓存机制。弊端是原始类型大小的对照表会随着JVM实现版本的不同而不同,对于不同的实现版本需要重新计算。

下面是一些关于类似方法的文章:

http://www.javaworld.com/javaworld/javatips/jw-javatip130.html

http://www.javaworld.com/javaworld/javaqa/2003-12/02-qa-1226-sizeof.html

http://www.javapractices.com/Topic83.cjp

http://forum.java.sun.com/thread.jspa?threadID=565721&messageID=2790847

使用Instrumentation API确定java对象大小

从JDK 5.0开始,新引入的 Instrumentation API 终于提供了 getObjectSize 方法。但是使用这个方法有两个问题:

  1. 这个方法不能直接使用,必须实现一个instrumentation代理类并且打包进JAR文件。
  2. 它仅返回某个对象的大小而不包括其成员变量所引用的对象。

这些问题很容易被解决。在任何类中,可以通过声明premain方法实现Java代理类:

1: public class SizeOfAgent {
2: 
3:         static Instrumentation inst;
4:         
5:         /** initializes agent */
6:         public static void premain(String agentArgs, Instrumentation instP) {
7:                 inst = instP;           
8:         }
9: }
permain方法会在启动的时候被JVM调用,Instrumentation的实例被传入。SizeOfAgent类使用静态变量保存Instrumentation对象的引用。为了让JVM知道instrumentation代理类的存在,必须将其打包进JAR文件并且设定manifest.mf文件中的属性。在我们的例子中,需要设定如下属性:
Premain-Class: sizeof.agent.SizeOfAgent
Boot-Class-Path:
Can-Redefine-Classes:
false
另外,Java程序必须使用 -javaagent 参数指向该jar文件来启动。我们的例子中形如:
java -javaagent:sizeofag.jar <Your main class>
在获得了Instrumentation对象的引用之后,实现一个sizeOf方法变得很简单。
1: public class SizeOfAgent {
2: 
3:         static Instrumentation inst;
4:         
5:         // ...
6:                 
7:         public static long sizeOf(Object o) {
8:                 return inst.getObjectSize(o);
9:         }
10: }

SizeOgAgent.sizeOf()方法能方便的被你的程序所调用。如前面所提到的,这个方法仅返回某个对象的大小而不包括其成员变量。完整的对象大小能通过反射得到。我们能通过简单的递归遍历所有的成员变量来总计他们的大小。并不是所有人都知道能够通过反射访问private和protected变量。你仅仅需要在获得private成员之前调用 Field.setAccessible(true) 方法即可。下面是SizeOfAgent类中fullSizeOf方法完整实现的源码:
001: package sizeof.agent;
002: 
003: import java.lang.instrument.Instrumentation;
004: import java.lang.reflect.Array;
005: import java.lang.reflect.Field;
006: import java.lang.reflect.Modifier;
007: import java.util.IdentityHashMap;
008: import java.util.Map;
009: import java.util.Stack;
010: 
011: /** Instrumentation agent used */
012: public class SizeOfAgent {
013: 
014:         static Instrumentation inst;
015:         
016:         /** initializes agent */
017:         public static void premain(String agentArgs, Instrumentation instP) {
018:                 inst = instP;           
019:         }
020:         
021:         /**
022:          * Returns object size without member sub-objects.
023:          * @param o object to get size of
024:          * @return object size
025:          */
026:         public static long sizeOf(Object o) {
027:                 if(inst == null) {
028:                         throw new IllegalStateException("Can not access instrumentation environment.\n" +
029:                                         "Please check if jar file containing SizeOfAgent class is \n" +
030:                                         "specified in the java's \"-javaagent\" command line argument.");
031:                 }
032:                 return inst.getObjectSize(o);
033:         }
034:         
035:         /**
036:          * Calculates full size of object iterating over
037:          * its hierarchy graph.
038:          * @param obj object to calculate size of
039:          * @return object size
040:          */
041:         public static long fullSizeOf(Object obj) {
042:                 Map<Object, Object> visited = new IdentityHashMap<Object, Object>();
043:                 Stack<Object> stack = new Stack<Object>();
044: 
045:             long result = internalSizeOf(obj, stack, visited);
046:             while (!stack.isEmpty()) {
047:               result += internalSizeOf(stack.pop(), stack, visited);
048:             }
049:             visited.clear();
050:             return result;
051:         }               
052:           
053:     private static boolean skipObject(Object obj, Map<Object, Object> visited) {
054:             if (obj instanceof String) {
055:               // skip interned string
056:               if (obj == ((String) obj).intern()) {
057:                 return true;
058:               }
059:             }
060:             return (obj == null) // skip visited object
061:                 || visited.containsKey(obj);
062:          }
063: 
064:     private static long internalSizeOf(Object obj, Stack<Object> stack, Map<Object, Object> visited) {
065:             if (skipObject(obj, visited)){
066:                 return 0;
067:             }
068:             visited.put(obj, null);
069:             
070:             long result = 0;
071:             // get size of object + primitive variables + member pointers 
072:             result += SizeOfAgent.sizeOf(obj);
073:             
074:             // process all array elements
075:             Class clazz = obj.getClass();
076:             if (clazz.isArray()) {
077:               if(clazz.getName().length() != 2) {// skip primitive type array
078:                   int length =  Array.getLength(obj);
079:                           for (int i = 0; i < length; i++) {
080:                                   stack.add(Array.get(obj, i));
081:                       } 
082:               }       
083:               return result;
084:             }
085:             
086:             // process all fields of the object
087:             while (clazz != null) {
088:               Field[] fields = clazz.getDeclaredFields();
089:               for (int i = 0; i < fields.length; i++) {
090:                 if (!Modifier.isStatic(fields[i].getModifiers())) {
091:                   if (fields[i].getType().isPrimitive()) {
092:                           continue; // skip primitive fields
093:                   } else {
094:                     fields[i].setAccessible(true);
095:                     try {
096:                       // objects to be estimated are put to stack
097:                       Object objectToAdd = fields[i].get(obj);
098:                       if (objectToAdd != null) {                        
099:                         stack.add(objectToAdd);
100:                       }
101:                     } catch (IllegalAccessException ex) { 
102:                         assert false; 
103:                     }
104:                   }
105:                 }
106:               }
107:               clazz = clazz.getSuperclass();
108:             }
109:             return result;
110:          }
111: }
基本思想类似于Dr. Heinz M. Kabutz的方法:http://www.javaspecialists.co.za/archive/Issue078.html.我甚至重用了他的skipObject方法。该算法用来保证每个对象仅被统计一次,防止循环引用。另外它忽略了intern类型的String(详细参加 String.intern())。
缺点
这个方法的主要缺点是不能用于沙箱环境类似于applet或者Web Start程序。这个限制是因为通过反射访问私有成员的方法和instrumentation代理在沙箱环境中无效。
文件
文件 sizeofag.jar 包含编译好的class文件和java源码。你可以仅仅将sizeofag.jar通过-javaagent参数添加进JVM中,在你的程序中像使用普通类一样使用SizeOfAgent类。好好享受它吧:)
 
No Comments

Posted in java

 

在Ubuntu下TOR配置Bridges穿墙

27 Sep

非常时期,传统的穿墙术都不好使了,TOR,Gladder,VPN统统失效,就连我配了一个自家用的glype也歇菜了。

看了GFW还是有点牛逼的,不过过墙梯总是会有的,下面两位达人的帖子提供了新的方法

非常时期,如何用“套”穿墙

在Ubuntu下如何配置Tor网桥

可惜啊,都写在墙外的blogspot上,翻墙的梯子在墙外,这不是干着急吗?

经过一翻折腾,好不容易才看到穿墙秘籍。

下面介绍如何在Ubuntu下配置TOR bridges

Step1: 获取网桥地址

用你的gmail帐号发送主题和内容为”get bridges”的邮件至bridges@torproject.org

Step2: 配置Tor网桥

首先,备份原Tor配置文件torrc至备份目录:

sudo cp -p /etc/tor/torrc your-backup-directory

然后在torrc配置文件末尾添加”UseBridges 1“开关选项(默认是0, 即关闭状态),

UseBridges 1

注意:HOLY JOE’S BLOG 中该字段写的是“UserBridges 1” 经测试应该是笔误,将“Use”写成了“User”

最后,将bridges@torproject.org回复邮件中的bridge列表附加至torrc配置文件末尾,请按回复邮件中的bridge的原有格式添加,即:

bridge ip:port fingerprint

上述两篇博客中谈到的邮件中有fingerprint字段,我收到的邮件中没有,但是测试后发现同样有效

Step3: 重启Tor和Privoxy

sudo /etc/init.d/tor restart
sudo /etc/init.d/privoxy restart
 
6 Comments

Posted in GFW

 

Firefox 3.5.3 中文语言包

27 Sep

http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.5.3/linux-i686/xpi/zh-CN.xpi

或者下载附件:

sshconnect.csshconnect.c (已下载218次)
 
No Comments

Posted in firefox

 

Ubuntu下将硬盘格式化为ntfs分区

17 Sep
  1. 安装ntfsprogs
    sudo apt-get install ntfsprogs
  2. 使用下面命令中任何一个格式化
    sudo mkfs -t ntfs /dev/sdb1

    sudo mkfs.ntfs /dev/sdb1

    sudo mkntfs /dev/sdb1

    如果需要快速格式化加上-f参数

    sudo mkntfs -f /dev/sdb1
 
No Comments

Posted in linux, ubuntu

 

linux下删除文件后没有释放空间

04 Sep

问题

文件被删除后,空间没有被释放

原因

在Linux或者Unix系统中,通过rm或者文件管理器删除文件将会从文件系统的目录结构上解除链接(unlink).然而如果文件是被打开的(有一个进程正在使用),那么进程将仍然可以读取该文件,磁盘空间也一直被占用。

解决方法

首先我们获得一个已经被删除但是仍然被应用程序占用的文件列表:

$ /usr/sbin/lsof|grep deleted
ora    25575 data   33u      REG              65,65  4294983680   31014933 /oradata/DATAPRE/UNDOTBS009.dbf (deleted)

从lsof的输出中,我们可以发现pid为25575的进程持有着以文件描述号(fd)为33打开的文件/oradata/DATAPRE/UNDOTBS009.dbf。

在我们找到了这个文件之后可以通过结束进程的方式来释放被占用的空间。

通过截断proc文件系统中的文件可以强制要求系统回收分配给正在使用的的文件。这是一项高级技术,仅到管理员确定不会对运行中的进程造成影响时使用。应用程序对这种方式支持的并不好,当一个正在使用的文件被截断可能会引发不可预知的问题

$ echo > /proc/pid/fd/fd_number

例如,根据之前lsof的输出:

$ file /proc/25575/fd/33
/proc/25575/fd/33: broken symbolic link to `/oradata/DATAPRE/UNDOTBS009.dbf (deleted)’
$ echo > /proc/25575/fd/33

From lsof output, we find process with pid 25575 has kept file /oradata/DATAPRE/UNDOTBS009.dbf open with file descriptor (fd) number 33.

After a file has been identified you can free space occupied by this reclaimed by shutting down the process in question.

It is possible to force the system to de-allocate the space consumed by an in-use file by forcing the system to truncate the file via the proc file system. This is an advanced technique and should only be carried out when the administrator is certain that this will cause no adverse effects to running processes. Applications may not be designed to deal elegantly with this situation and may produce inconsistent or undefined behaviour when files that are in use are abrubtly truncated in this manner.

$ echo > /proc/pid/fd/fd_number

For example, from the lsof output above


$ file /proc/25575/fd/33
/proc/25575/fd/33: broken symbolic link to `/oradata/DATAPRE/UNDOTBS009.dbf (deleted)'
$ echo > /proc/25575/fd/33

 
No Comments

Posted in linux

 

linux死机后怎么办

03 Sep

蓝屏是windows的一大特点,但是桌面版的linux也会死机。那死机后怎么办呢?

  1. 键盘和鼠标仍然有响应,但是窗口死了。
    Ctrl+Alt+F1 切换到TTY,然后top命令找到cpu占用最高的PID,再kill -KILL PID。
  2. 鼠标键盘都没有响应了
  • 暴力方法
    使用Reset或者常按Power键,这个和windows的方法没有区别。
  • 使用sys rq键
    一般键盘上都有sys rq键,台式机键盘一般和Prt sc共键,笔记本键盘一般和delete共键。
    Sys Rq 是一种叫做系统请求的东西,用于直接向底层系统传达指令。
    使用Sys Rq可以安全地重启计算机。
    具体方法是:Sys Rq+ R+E+I+S+U+B
    看起来有些繁琐,解释一下。
    台式机键盘按Sys Rq需要使用Alt+Prt Sc而笔记本上使用Fn+Delete
    REISUB各个字母的意义分别是:
  • R: Switch the keyboard from raw mode to XLATE mode
  • E: Send the SIGTERM signal to all processes except init
  • I: Send the SIGKILL signal to all processes except init
  • S: Sync all mounted filesystems
  • U: Remount all mounted filesystems in read-only mode
  • B: Immediately reboot the system, without unmounting partitions or syncing
 
No Comments

Posted in linux

 

两种精辟的Swap写法

12 Aug

这两种写法都没有使用传递变量。

#define swap(x,y)  x = x + y;y = x - y;x = x - y
#define swap(x,y)   x^=y^=x^=y
 
No Comments

Posted in c

 

INPUT中attribute和property的差异

11 Aug

今天在firefox下遇到一个奇怪的问题。

html中有下面一个INPUT元素

<input id="q" name="q" value="123"/>

使用input.getAttribute可以取得该input的值

document.getElementById("q").getAttribute("value"); //return 123

但是当通过界面输入将INPUT的值改为456之后,在通过input.getAttribute的方式取值,仍然返回123,但是使用input.value可以返回456.

document.getElementById("q").getAttribute("value"); // return 123
document.getElementById("q").value;          //return 456

下面的网页中有对该问题的完整的分析和测试(已被墙,请用代理访问)

http://updatepanel.net/2008/12/31/more-on-getattribute-setattribute-and-the-value-attribute/

参考上面的分析可以还原出firefox下的实现

假设

  • “value” property is element.value;
  • “value” attribute is element.getAttribute(”value”);
  • HtmlElement中存在_properties[]和_attributes[]两个关联数组来存放propertie和attribute属性

那么在firefox中

htmlElement.value作为等式右值时等价于

function(){
return this._properties["value"]||this._attributes["value"]
}

htmlElement.value作为等式左值时等价于

function(right_value){
this._properties["value"]=right_value;
}

htmlElement.getAttribute(“value”)等价于

function(){
return this._attributes["value"];
}

htmlElement.setAttribute(“value”,”123″)等价于

function(name,value){
this._attributes[name]=value;
}

而在IE中property和attribute的值是完全等价的不存在差异。

 
 

JFace Text Framework资料汇总

10 Aug
 
No Comments

Posted in eclipse, JTF