星期四, 十二月 21, 2006

Tips,VBA里如何扩展一个注释的的长度,超过255限制

上一个Tips里,使用Excel的cell对象的NoteText属性,
但NoteText只能允许255个字符,这是经常不够的。

要想使用更多的字符VBA里的comment对象允许32K的字符说明。

同样,修改 上一个tips的代码如下,就可以使用最多到32K的字符了。

With Cells(1,1).AddComment
.text "说明,最多32k"
.Shape.TextFrame.AutoSize = False
.Shape.width = 400
End With

这里.AddComment是很重要的手法 。

星期三, 十二月 20, 2006

Tips,VBA里如何扩展一个注释的宽度,避免自动折行

With Cells(1,1)
.NoteText "我的注释啊。。。。。。。。。。。。。。"
.Comment.Shape.TextFrame.AutoSize = False
.Comment.Shape.width = 400
End With

.comment.shape.width 是关键语句

星期五, 十二月 08, 2006

Java 5 注释功能的一点小知识。

J2SE5.0还提供了四种用于注释的注释类型。有以下的四种:

1. Target:用来指定这个注释(Annotation)是为哪种类型而定义的。比如,这个类型可能只是为method定义的。比如override,不能用@override来修饰class或者field。

2.Retention:Retention的策略可以从以下三种中选取:
  • RetentionPolicy.SOURCE:编译器编译之后会会从class file中除去注释(Annotation)。
  • Retention.CLASS:注释(Annotation)保留在class file中,但是VM不会处理。
  • RetentionPolicy.RUNTIME,:注释(Annotation)保留在class file,VM会进行处理。

请注意,如果你希望在运行时查找到这些注释在什么地方被用到,一定要在定义注释的时候,选择RetentionPolicy.RUNTIME,否则即使你用注释修饰了类变量或者方法,在运行时也没有办法获得这个信息的。

3.Documented:这个注释(Annotation)将作为public API的一部分。

4.Inherited : 假设注释(Annotation)定义的时候使用了Inherited,那么如果这个注释(Annotation)修饰某个class,这个类的子类也被这个注释(Annotation)所修饰。

J2SE的内建注释(build-in annotation)

在程序中不仅可以使用自己定义的注释,还可以使用J2SE5.0中内建的注释类型。下面我们就详细来介绍J2SE5.0提供的注释类型。J2SE 5.0中预定义了三种注释注释类型:

Override :java.lang.Override 表示当前的方法重写了父类的某个方法,如果父类的对应的方法并不存在,将会发生编译错误。

Deprecated:java.lang.Deprecated 表示 并不鼓励使用当前的方法或者域变量。

SuppressWarnings: java.lang.SuppressWarnings关闭编译器告警,这样,在编译1.5之前的代码的时候,不会出现大量不关心的无关的告警



一个最小例子:

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)

@interface Copyright { String value();
}


星期二, 十一月 28, 2006

Java1.5泛型指南

Java1.5泛型指南


JDK1.5中引入了对java语言的多种扩展,泛型(generics)即其中之一。

这个教程的目标是向您介绍java的泛型(generic)。你可能熟悉其他语言的泛型,最著名的是C++的模板(templates)。如果这样,你很快就会看到两者的相似之处和重要差异。如果你不熟悉相似的语法结构,那么更好,你可以从头开始而不需要忘记误解。

Generics允许对类型进行抽象(abstract over types)。最常见的例子是集合类型(Container types),Collection的类树中任意一个即是。

下面是那种典型用法:


List myIntList = new LinkedList();// 1

myIntList.add(new Integer(0));// 2

Integer x = (Integer) myIntList.iterator().next();// 3
第3 行的类型转换有些烦人。通常情况下,程序员知道一个特定的list里边放的是什么类型的数据。但是,这个类型转换是必须的(essential)。编译器只能保证iterator返回的是Object类型。为了保证对Integer类型变量赋值的类型安全,必须进行类型转换。

当然,这个类型转换不仅仅带来了混乱,它还可能产生一个运行时错误(run time error),因为程序员可能会犯错。

程序员如何才能明确表示他们的意图,把一个list中的内容限制为一个特定的数据类型呢?这是generics背后的核心思想。这是上面程序片断的一个泛型版本:

以下是引用片段:

List<Integer> myIntList = new LinkedList<Integer>(); // 1

myIntList.add(new Integer(0)); // 2

Integer x = myIntList.iterator().next(); // 3
注意变量myIntList的类型声明。它指定这不是一个任意的List,而是一个Integer的List,写作:List< Integer>。我们说List是一个带一个类型参数的泛型接口(a generic interface that takes a type parameter),本例中,类型参数是Integer。我们在创建这个List对象的时候也指定了一个类型参数。

另一个需要注意的是第3行没了类型转换。

现在,你可能认为我们已经成功地去掉了程序里的混乱。我们用第1行的类型参数取代了第3行的类型转换。然而,这里还有个很大的不同。编译器现在能够在编译时检查程序的正确性。当我们说myIntList被声明为List<Integer>类型,这告诉我们无论何时何地使用myIntList变量,编译器保证其中的元素的正确的类型。与之相反,一个类型转换说明程序员认为在那个代码点上它应该是那种类型。

实际结果是,这可以增加可读性和稳定性(robustness),尤其在大型的程序中。
2. 定义简单的泛型

下面是从java.util包中的List接口和Iterator接口的定义中摘录的片断:

public interface List<E> {

void add(E x);

Iterator<E> iterator();

}

public interface Iterator<E> {

E next();

boolean hasNext();

}
这些都应该是很熟悉的,除了尖括号中的部分,那是接口List和Iterator中的形式类型参数的声明(the declarations of the formal type parameters of the interfaces List and Iterator)。

类型参数在整个类的声明中可用,几乎是所有可是使用其他普通类型的地方(但是有些重要的限制,请参考第7部分)。

(原文:Type parameters can be used throughout the generic declaration, pretty much where you would use ordinary types (though there are some important restrictions; see section 7))



在介绍那一节我们看到了对泛型类型声明List(the generic type declaration List)的调用,如List<Integer>。在这个调用中(通常称作一个参数化类型a parameterized type),所有出现形式类型参数(formal type parameter,这里是E)都被替换成实体类型参数(actual type argument)(这里是Integer)。

你可能想象,List<Integer>代表一个E被全部替换成Integer的版本:

public interface IntegerList {

void add(Integer x)

Iterator<Integer> iterator();

}
这种直觉可能有帮助,但是也可能导致误解。

它有帮助,因为List<Integer>的声明确实有类似这种替换的方法。

它可能导致误解,因为泛型声明绝不会实际的被这样替换。没有代码的多个拷贝,源码中没有、二进制代码中也没有;磁盘中没有,内存中也没有。如果你是一个C++程序员,你会理解这是和C++模板的很大的区别。

一个泛型类型的声明只被编译一次,并且得到一个class文件,就像普通的class或者interface的声明一样。

类型参数就跟在方法或构造函数中普通的参数一样。就像一个方法有形式参数(formal value parameters)来描述它操作的参数的种类一样,一个泛型声明也有形式类型参数(formal type parameters)。当一个方法被调用,实参(actual arguments)替换形参,方法体被执行。当一个泛型声明被调用,实际类型参数(actual type arguments)取代形式类型参数。

一个命名的习惯:我们推荐你用简练的名字作为形式类型参数的名字(如果可能,单个字符)。最好避免小写字母,这使它和其他的普通的形式参数很容易被区分开来。许多容器类型使用E作为其中元素的类型,就像上面举的例子。在后面的例子中还会有一些其他的命名习惯。


3. 泛型和子类继承

让我们测试一下我们对泛型的理解。下面的代码片断合法么?

以下是引用片段:

List<String> ls = new ArrayList<String>(); //1

List<Object> lo = ls; //2
第1行当然合法,但是这个问题的狡猾之处在于第2行。

这产生一个问题:

一个String的List是一个Object的List么?大多数人的直觉是回答:“当然!”。

好,在看下面的几行:

以下是引用片段:

lo.add(new Object()); // 3

String s = ls.get(0); // 4: 试图把Object赋值给String
这里,我们使用lo指向ls。我们通过lo来访问ls,一个String的list。我们可以插入任意对象进去。结果是ls中保存的不再是String。当我们试图从中取出元素的时候,会得到意外的结果。

java编译器当然会阻止这种情况的发生。第2行会导致一个编译错误。

总之,如果Foo是Bar的一个子类型(子类或者子接口),而G是某种泛型声明,那么G<Foo>是G<Bar>的子类型并不成立!!

这可能是你学习泛型中最难理解的部分,因为它和你的直觉相反。

这种直觉的问题在于它假定这个集合不改变。我们的直觉认为这些东西都不可改变。

举例来说,如果一个交通部(DMV)提供一个驾驶员里表给人口普查局,这似乎很合理。我们想,一个List<Driver>是一个 List<Person>,假定Driver是Person的子类型。实际上,我们传递的是一个驾驶员注册的拷贝。然而,人口普查局可能往驾驶员list中加入其他人,这破坏了交通部的记录。

为了处理这种情况,考虑一些更灵活的泛型类型很有用。到现在为止我们看到的规则限制比较大。
4. 通配符(Wildcards)

考虑写一个例程来打印一个集合(Collection)中的所有元素。下面是在老的语言中你可能写的代码:

以下是引用片段:

void printCollection(Collection c) {

Iterator i = c.iterator();

for (int k = 0; k < c.size(); k++) {

System.out.println(i.next());

}

}
下面是一个使用泛型的幼稚的尝试(使用了新的循环语法):

以下是引用片段:

void printCollection(Collection<Object> c) {

for (Object e : c) {

System.out.println(e);

}

}
问题是新版本的用处比老版本小多了。老版本的代码可以使用任何类型的collection作为参数,而新版本则只能使用Collection<Object>,我们刚才阐述了,它不是所有类型的collections的父类。

那么什么是各种collections的父类呢?它写作: Collection<?>(发音为:"collection of unknown"),就是,一个集合,它的元素类型可以匹配任何类型。显然,它被称为通配符。我们可以写:

以下是引用片段:

void printCollection(Collection<?> c) {

for (Object e : c) {

System.out.println(e);

}

}
现在,我们可以使用任何类型的collection来调用它。注意,我们仍然可以读取c中的元素,其类型是Object。这永远是安全的,因为不管collection的真实类型是什么,它包含的都是objects。但是将任意元素加入到其中不是类型安全的:

Collection<?> c = new ArrayList<String>();

c.add(new Object()); // 编译时错误

因为我们不知道c的元素类型,我们不能向其中添加对象。

add方法有类型参数E作为集合的元素类型。我们传给add的任何参数都必须是一个未知类型的子类。因为我们不知道那是什么类型,所以我们无法传任何东西进去。唯一的例外是null,它是所有类型的成员。
另一方面,我们可以调用get()方法并使用其返回值。返回值是一个未知的类型,但是我们知道,它总是一个Object,因此把get的返回值赋值给一个Object类型的对象或者放在任何希望是Object类型的地方是安全的。
4.1. 有限制的通配符(Bounded Wildcards)

考虑一个简单的画图程序,它可以用来画各种形状,比如矩形和圆形。

为了在程序中表示这些形状,你可以定义下面的类继承结构:

以下是引用片段:

public abstract class Shape {

public abstract void draw(Canvas c);

}

public class Circle extends Shape {

private int x, y, radius;

public void draw(Canvas c) { // ...

}

}

public class Rectangle extends Shape {

private int x, y, width, height;

public void draw(Canvas c) {

// ...

}

}



这些

这些类可以在一个画布(Canvas)上被画出来:

public class Canvas {

public void draw(Shape s) {

s.draw(this);

}

}

所有的图形通常都有很多个形状。假定它们用一个list来表示,Canvas里有一个方法来画出所有的形状会比较方便:

public void drawAll(List<Shape> shapes) {

for (Shape s : shapes) {

s.draw(this);

}

}

现在,类型规则导致drawAll()只能使用Shape的list来调用。它不能,比如说对List<Circle>来调用。这很不幸,因为这个方法所作的只是从这个list读取shape,因此它应该也能对List<Circle>调用。我们真正要的是这个方法能够接受一个任意种类的shape:

public void drawAll(List<? extends Shape> shapes) { //..}

这里有一处很小但是很重要的不同:我们把类型 List<Shape> 替换成了 List<? extends Shape>。现在drawAll()可以接受任何Shape的子类的List,所以我们可以对List<Circle>进行调用。

List<? extends Shape>是有限制通配符的一个例子。这里?代表一个未知的类型,就像我们前面看到的通配符一样。但是,在这里,我们知道这个未知的类型实际上是Shape的一个子类(它可以是Shape本身或者Shape的子类而不必是extends自Shape)。我们说Shape是这个通配符的上限(upper bound)。

像平常一样,要得到使用通配符的灵活性有些代价。这个代价是,现在像shapes中写入是非法的。比如下面的代码是不允许的:

public void addRectangle(List<? extends Shape> shapes) {

shapes.add(0, new Rectangle()); // compile-time error!

}

你应该能够指出为什么上面的代码是不允许的。因为shapes.add的第二个参数类型是? extends Shape ??一个Shape未知的子类。因此我们不知道这个类型是什么,我们不知道它是不是Rectangle的父类;它可能是也可能不是一个父类,所以这里传递一个Rectangle不安全。

有限制的通配符正是我们解决DMV给人口普查局传送名单的例子所需要的。我们的例子假定数据用一个姓名(String)到people(用Person或其子类来表示,比如 Driver)。Map<K,V>是一个有两个类型参数的泛型类型的例子,表示map的键key和值value。

再一次,注意形式类型参数的命名习惯??K代表keys,V代表vlaues。

public class Census {

public static void addRegistry(Map<String, ? extends Person> registry) { ...}

}...

Map<String, Driver> allDrivers = ...;

Census.addRegistry(allDrivers);
5. 泛型方法

考虑写一个方法,它用一个Object的数组和一个collection作为参数,完成把数组中所有object放入collection中的功能。

下面是第一次尝试:

static void fromArrayToCollection(Object[] a, Collection<?> c) {

for (Object o : a) {

c.add(o); // 编译期错误

}

}

现在,你应该能够学会避免初学者试图使用Collection<Object>作为集合参数类型的错误了。或许你已经意识到使用 Collection<?>也不能工作。会议一下,你不能把对象放进一个未知类型的集合中去。

解决这个问题的办法是使用generic methods。就像类型声明,方法的声明也可以被泛型化??就是说,带有一个或者多个类型参数。

static <T> void fromArrayToCollection(T[] a, Collection<T> c){

for (T o : a) {

c.add(o); // correct

}

}

我们可以使用任意集合来调用这个方法,只要其元素的类型是数组的元素类型的父类。

Object[] oa = new Object[100];

Collection<Object> co = new ArrayList<Object>();

fromArrayToCollection(oa, co);// T 指Object

String[] sa = new String[100];

Collection<String> cs = new ArrayList<String>();

fromArrayToCollection(sa, cs);// T inferred to be String

fromArrayToCollection(sa, co);// T inferred to be Object

Integer[] ia = new Integer[100];

Float[] fa = new Float[100];

Number[] na = new Number[100];

Collection<Number> cn = new ArrayList<Number>();

fromArrayToCollection(ia, cn);// T inferred to be Number

fromArrayToCollection(fa, cn);// T inferred to be Number

fromArrayToCollection(na, cn);// T inferred to be Number

fromArrayToCollection(na, co);// T inferred to be Object

fromArrayToCollection(na, cs);// compile-time error

注意,我们并没有传送真实类型参数(actual type argument)给一个泛型方法。编译器根据实参为我们推断类型参数的值。它通常推断出能使调用类型正确的最明确的类型参数(原文是:It will generally infer the most specific type argument that will make the call type-correct.)。

现在有一个问题:我们应该什么时候使用泛型方法,又什么时候使用通配符类型呢?

为了理解答案,让我们先看看Collection库中的几个方法。

public interface Collection<E> {

boolean containsAll(Collection<?> c);

boolean addAll(Collection<? extends E> c);

}

我们也可以使用泛型方法来代替:

public interface Collection<E> {

<T> boolean containsAll(Collection<T> c);

<T extends E> boolean addAll(Collection<T> c);

// hey, type variables can have bounds too!

}

但是,在 containsAll 和 addAll中,类型参数T 都只使用一次。返回值的类型既不依赖于类型参数(type parameter)也不依赖于方法的其他参数(这里,只有简单的一个参数)。这告诉我们类型参数(type argument)被用作多态(polymorphism),它唯一的效果是允许在不同的调用点,可以使用多种实参类型(actual argument)。如果是这种情况,应该使用通配符。通配符就是被设计用来支持灵活的子类化的,这是我们在这里要强调的。

泛型函数允许类型参数被用来表示方法的一个或多个参数之间的依赖关系,或者参数与其返回值的依赖关系。如果没有这样的依赖关系,不应该使用泛型方法。

(原文: Generic methods allow type parameters to be used to express dependencies among the types of one or more arguments to a method and/or its return type. If there isn’t such a dependency, a generic method should not be used.)

一前一后的同时使用泛型方法和通配符也是可能的。下面是方法 Collections.copy():

class Collections {

public static <T> void copy(List<T> dest, List<? extends T> src){...}

}

注意两个参数的类型的依赖关系。任何被从源list从拷贝出来的对象必须能够将其指定为目标list(dest) 的元素的类型??T类型。因此源类型的元素类型可以是T的任意子类型,我们不关心具体的类型。

copy方法的签名使用一个类型参数表示了类型依赖,但是使用了一个通配符作为第二个参数的元素类型。我们也可以用其他方式写这个函数的签名而根本不使用通配符:

class Collections {

public static <T, S extends T> void copy(List<T> dest, List<S> src){...}

}

这也可以,但是第一个类型参数在dst的类型和第二个参数的类型参数S的上限这两个地方都有使用,而S本身只使用一次,在src的类型中??没有其他的依赖于它。这意味着我们可以用通配符来代替S。使用通配符比声明显式的类型参数更加清晰和准确,所以在可能的情况下使用通配符更好。

通配符还有一个优势式他们可以在方法签名之外被使用,比如field的类型,局部变量和数组。这就有一个例子。

回到我们的画图问题,假定我们想要保持画图请求的历史记录。我们可以把历史记录保存在Shape类的一个静态成员变量里,在drawAll() 被调用的时候把传进来的参数保存进历史记录:

static List<List<? extends Shape>> history = new ArrayList<List<? extends Shape>>();

public void drawAll(List<? extends Shape> shapes) {

history.addLast(shapes);

for (Shape s: shapes) {

s.draw(this);

}

}

最终,再说一下类型参数的命名习惯。

我们使用T 代表类型,无论何时都没有比这更具体的类型来区分它。这经常见于泛型方法。如果有多个类型参数,我们可能使用字母表中T的临近的字母,比如S。如果一个泛型函数在一个泛型类里边出现,最好避免在方法的类型参数和类的类型参数中使用同样的名字来避免混淆。

星期五, 十一月 17, 2006

JBOSS如何同JVMSTAT 远程remote一起工作?

区分两种情况.
1.JBOSS 运行jdk 5.0
2.JBoss 运行 j2sdk 1.4.2

1.JBOSS 运行jdk 5.0

1.1 启动参数加入JAVA_OPTS="$JAVA_OPTS -XX:+UsePerfData"

1.2 然后在运行jstatd的地方建立一个policy文件。
jstatd.policy
grant codebase "file:${java.home}/../lib/tools.jar" { permission java.security.AllPermission; };
1.3 启动jstatd,直接在命令行运行jdk 5.0自带的 {jdk5.0_home}\bin\jstatd
1.4 确认Jboss和jstatd都一起运行 ,运行jdk 5.0自带的jps 得到如下结果:
5911 Main
5776 Jstatd
6075 Jps

1.5 再客户段 运行 jvmstat 3.0 bat或bin目录下的的visualgc.cmd 5911@szse199

注意:hostName必须用域名.

得到如下图片.


2.JBoss 运行 j2sdk 1.4.2
2.1 首先下载.jvmstat 2.0.
展开到一个目录下比如c:\jvmstat.及服务器上/root/jvmstat.

2.2 配置服务器端的policy.
设置 export JVMSTAT_HOME=/root/jvmstat
到 $JVMSTAT_HOME/policies 目录下 配置policy.
configurepolicy PerfAgentAll.tmpl PerfAgent.policy
2.3 运行 perfagent (rmi registry server)
$JVMSTAT_HOME/bin/perfagent -p 12345
注意:-p 选择 在有端口冲突(1099)的情况下使用.
这样在远程使用的时候,需要指定端口
2.4 得到运行的lvmid
运行$JVMSTAT_HOME/bin/jvmps 得到jboss的lvmid
7565 org.jboss.Main
7701 jvmps.jar
7632 perfagent.jar
2.5 在远程client机器上运行监控程序.
c:\jvmstat\bat\visualgc.cmd 7565@szse199:
12345
得到图形如上:

星期四, 十一月 16, 2006

如何使用JDK 5.0 Jconsole同Jboss 3.0.8 Later工作?

JDk 5.0 提供的从jvmstat来的jstat jps,jconsole系列工具监控系统。
是非常好的工具。

如何同JBOSS 3.0.8SP1一起工作,的确花了一定的时间才正确配置。
1.JBOSS 3.0.8 SP1是可以在JDK 5。0下工作的版本,比之小的版本只能运行在jdk 1.4下。
目前不能通过远程工作。不知道怎么回事。Linux下配置.

Jboss配置
修改 bin\run.sh
加入以下代码:
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.port=12345"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.authenticate=false"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.ssl=false"


然后在其他机器下运行 jConsole连接服务器。如图。


星期三, 十一月 01, 2006

如何用Ado从数据库复制数据到Excel的Sheets里?

方法一:
Sub runthis()

Dim conn As New ADODB.Connection
Dim rec As New ADODB.Recordset
Dim sql As String

connstr = "ODBC;DSN=development;Server=10.2.1.1;Port=3306;Database=Store;Uid=root;Pwd="
sql = "SELECT * FROM employee "
Sheets("test").Activate
With ActiveSheet.QueryTables.Add(Connection:=connstr, _
Destination:=Range("B1"), sql:=sql)
.Refresh
End With

Set rec = Nothing
Set conn = Nothing
Exit Sub
errorHandler:
MsgBox "RunThis 错误:" & Err.Description
End Sub

方法二:
Sub runthis()

Dim conn As New ADODB.Connection
Dim rec As New ADODB.Recordset
Dim sql As String

connstr = "Driver={MySQL ODBC 3.51 Driver};Server=10.2.1.1;Port=3306;Option=131072;Stmt=;Database=store;Uid=root;Pwd="
conn.Open connstr
rec.Open "SELECT * FROM employee ", conn
sql = "SELECT * FROM emp_M_BasicInfo "
Sheets("test").Activate
Sheets("test").Cells.Clear

'显示字段名
For lCount = 0 To rec.Fields.Count - 1
Cells(1, 1 + lCount).Value = rec.Fields(lCount).Name
Next lCount
'显示数据
linenum = 1
If Not rec.EOF Then
Cells(linenum + 1, 1).CopyFromRecordset rec
rec.NextRecordset
linenum = linenum + 1
End If

Set rec = Nothing
Set conn = Nothing
Exit Sub
errorHandler:
MsgBox "RunThis 错误:" & Err.Description
End Sub

星期一, 十月 23, 2006

Tips.Excle 格式化cells value to text 文本

花了半个小时,才发现正确答案是
with cells(1,1)
.Style.NumberFormat = "@"
End with

星期五, 十月 13, 2006

Linux用Sendmail 发送 附件

非常Cool脚本。

#!/bin/sh
From="sunose@g.com"
To="sunose@g.com"
Subject="Sendmmail with attachment use uuencode"
(
echo "Subject: $Subject"
echo "body"
echo ""
uuencode $1 $1
) | /usr/sbin/sendmail -f$From $To
exit 0

Linux下Sendmail 配置成为邮件转发及避免DNS查询

Sendmail 8.x 通过m4 /etc/mail/sendmail.mc来生成传统的sendmail.cf
一般语法转换为 m4 /etc/mail/sendmailmc > /etc/sendmail.cf

1。配置Sendmail作为邮件转发网关。
目的:做为内网,外网之间的Email集中,发散服务器。
可以把所有内网的Email通过一台Email发送到可以访问外网的服务器

配置.
1.1 直接修改sendmail.cf DS属性.
在Sendmail.cf里找到smart relay host DS 在后面加入需要转发到的中心Email网关
服务器的domain name
DSsmtp.microsft.com
1.2 修改sendmail.mc
加入:define(`SMART_HOST',`smtp.microsft.com')
然后用命令m4 编译成sendmail.cf.启动sendmail 就可以使用了。

上面的方法有个缺点,就是 网关服务器必须要有正规的域民,如果没有在发送email的时候,跟踪email
sendmail -v gate@microsft.com 会出现 (Reason 550 Host Unknown)的错误。
如何避免这个问题呢?这个问题就直接引出下面问题。
Sendmail发送Email的时候,如何避免查询DNS?


2. 配置Sendmail 发送Email不要查询DNS.
在sendmail.mc 文件里加入如下语句:
FEATURE(`nodns')dnl
然后通过 m4生成 sendmail.cf文件,并在提示下,建立/etc/mail/service.switch文件
文件内容包括如下:
hosts files
aliases files

注释:
hosts files 让sendmail的dns查询只查询/etc/hosts文件。
你可以在hosts文件里加入 ip 服务器名.
aliases files 让sendmail 查询/etc/mail/aliases

启动 sendmail /etc/init.d/sendmail restart 之后。
再用 sendmail -v xxx@microsft.com
就可以看到发送成功的消息了。如下

220 yourseve.name ESMTP Service ready at Fri, 13 Oct 2006 13:21:34 +0800
>>> EHLO localhost.localdomain
250-Email.Gateway Hello localhost.localdomain ([10.2.5.240]), pleased to meet you
250-HELP
250-SIZE 10240000
250 PIPELINING
>>> MAIL From: SIZE=5
250 root@localhost.localdomain... Sender OK
>>> RCPT To:
250 gate@microsft.com... Recipient OK
>>> DATA
354 Enter message, end with "." on a line by itself
>>> .
250 Message accepted for delivery
gate@microsft.com... Sent (Message accepted for delivery)
Closing connection to Email.gatway
>>> QUIT

星期二, 十月 10, 2006

Tips:Vba合并Excel的单元格

Range("A1:B4").Select
With Selection
.MergeCells = True
End With
任意多个对象都有.MergeCells的属性。

比如想把第一行合并。
With Rows(1)
.MergeCells = True
End With

星期四, 九月 28, 2006

Tips:Excle filter row copy to new sheet.

目的:根据用户选择复制满足一定条件的Excel行到另外一个行中。
注意红色的关键代码。

'把包含某一个数字的记录,
'全部复制到result 工作簿里
'用户选择的range范围
Sub findByNumber()
Dim rng As Range
Dim newrng As Range
Dim Tools As New Toolkit
Dim choice As Integer
Dim cell As Object
Dim rRow As Range
Dim inyes As Boolean
Dim realnumber As Integer
Dim name As String
Dim counter As Integer
inyes = False
On Error Resume Next
counter = 1
choice = Application.InputBox("输入包含的数字", "查找的数字", Type:=1)'必须为数字
Set rng = Application.InputBox("选择数据范围", "选择数据", Selection.Address, , , , , 8)
If rng Is Nothing Then
MsgBox "你没有选择数据,不能继续"
Exit Sub
End If
name = rng.Parent.name
Add_Sheet ("result")
realnumber = choice
Sheets(name).Activate

If realnumber = 0 Then
Else
On Error GoTo errorhandler
For Each rRow In rng.Rows
inyes = False
For Each cell In rRow.Cells
If cell.value = realnumber Then '行中某一列的值同用户输入的值相等,则该行复制到result
inyes = True
rRow.Copy
Sheets("result").Activate
Sheets("result").Cells(counter, 1).Select
Sheets("result").Paste
counter = counter + 1
Sheets(name).Activate
Exit For
End If

Next 'for
Next
End If
Sheets("result").Activate
Exit Sub
errorhandler:
MsgBox Err.Description & Err.Source
End Sub

星期二, 九月 26, 2006

Tips:Excel sort by Each Column of Row

1.Excel提供的按照 行 排序的功能,只能根据第一行,第一列来排序。
不能按照每一行第一列来排序。

必须自己编写一个方法来提供这个功能。
'iWhichWay as xlAscending 或 xlDescending,见Excel 2003 VBA 参考手册

Function SortRows(ByVal iWhichWay As Integer, rng As Range)
Dim rRow As Range
Dim parentSheet As String
parentSheet = rng.Parent.Name

Sheets(parentSheet).Activate '可以在任意sheet工作薄里对数据

'xlAscending,xlDescending
For Each rRow In rng.Rows
rRow.Sort Key1:=Range(rRow.Cells(1).Address), Order1:=iWhichWay , _
OrderCustom:=1, MatchCase:=False, Orientation:=xlLeftToRight, _
DataOption1:=xlSortNormal
Next
End Function

星期六, 九月 23, 2006

tips:excel vba 等待一段时间继续执行

方法 1: 使用空 For...Next 循环
对此方法缺点有是没有直接方法来确定准确的时间, 程序将运行循环量。 时间量取决于计算机的速度。 以下代码运行循环, 不起作用但占用时间。

Sub MyDelayMacro

For iCount = 1 to 1000
Next iCount

End Sub


方法 2: 使用 API 调用来暂停执行 Word
使用一个 API 调用来暂停执行 Word 用于固定的时间量。

Kernel32 包含函数, 暂停用于指定长的时间, 毫秒中指定程序的执行。 要使用函数, 必须首先在它将在其中使用模块的常规声明部分声明它:

Declare Sub Sleep Lib "kernel32" Alias "Sleep" _
(ByVal dwMilliseconds As Long)


使用以下语法来调用 Sleep 函数:

Sub Sleep()
Sleep 1000 'Implements a 1 second delay
End Sub


方法 3: 使用 OnTime 方法
使用 OnTime 方法来设置长的时间以运行其他宏命令之前暂停。 OnTime 方法使用以下语法:
表达式 .OnTime 时, 名称, Tolerance)
由于 名称 名称 参数需要, 运行一个宏的名称, 必须创建两个宏。 第一个宏包含 OnTime 方法调用和其他命令与宏相关。 第二个宏分配时间已过时运行。 第二个宏可以是 " 虚设 " 宏执行什么。

本示例运行名为 15 秒从示例宏 (MyMainMacro) 运行时间为 " MyDelayMacro " 宏。

Sub MyMainMacro()

' Pause for 15 seconds.
Application.OnTime When:=Now + TimeValue("00:00:15"), _
Name:="MyDelayMacro"

End Sub

Public Sub MyDelayMacro()

' Place your delayed macro commands here.
MsgBox "This macro runs after 15 seconds."

End Sub


有关获取与 VisualBasic 帮助 VisualBasicforApplications, 请单击文章编号以查看 Microsoft 知识库中相应:

星期五, 九月 22, 2006

Tips:Excel添加新的worksheet

1.添加新的worksheet并检查是否存在,如果存在,则清楚里面的所有数据。
Sub Add_Sheet(shtName As String)
Dim wSht As Worksheet
For Each wSht In Worksheets
If wSht.Name = shtName Then
Sheets(shtName).Cells.Clear '清除所有数据
Sheets(shtName).Activate 'focus
Exit Sub
End If
' MsgBox ActiveSheet.Name
Next wSht
Sheets.Add.Name = shtName
Sheets(shtName).Move After:=Sheets(Sheets.Count)
End Sub

星期四, 九月 21, 2006

tips:遍历(Iterator)Excel Range的数据。

方法一:
For i = 1 To rng.row
For j=1 to rng.column
cells(i,j).value=??.
Next

counter = 1
For Each cell In rng
Cells(21, counter).Value = cell.Value
counter = counter + 1
Next

星期三, 九月 20, 2006

Excel Developer Tip: Pausing a Macro to Get a User-Selected Range

目的,停止宏运行,然后让用户选择某个范围的数据range

Sub ProblemCode()
Dim oRangeSelected As Range
On Error Resume Next
Set oRangeSelected = Application.InputBox("Please select a range of cells!", _
"SelectARAnge Demo", Selection.Address, , , , , 8)
If oRangeSelected Is Nothing Then
MsgBox "It appears as if you pressed cancel!"
Else
MsgBox "You selected: " & oRangeSelected.Address(external:=True)
End If
End Sub

这里的inpubox可以改变为一个editor,如果标准Excel显示。


星期五, 九月 08, 2006

开源的数学工具包。

1. Scilab http://www.scilab.org/ 最著名的开源数据包,提供很多语言的接口。

http://jscience.org/ 是个提供一些数学方法的 java mathematics library

提供全部数学方法的函数库非常之少。

遗憾。

星期二, 八月 29, 2006

Cool Tips:Mathematica Notebook 输出文本控制

Mathematica里的文本输出是Print方法。
在Mathematica里,文本的被抽象为text和Form.
标准的对象构造方法为:Text.
Show[Graphics[Text["hi",{10,10}]]]


可以控制字体各种属性的构造方法为: StyleForm
StyleForm["2005 Year",
FontSize -> 24, FontWeight -> "Bold", FontColor ->
RGBColor[1, 0, 0],Background->GrayLevel]];

输出大字:2005 Year

StyleForm是最常用的用来控制艺术文字输出的。
但有时侯需要输出格式化的数学公式之类的,就需要用其他的Form
StyleForm的标准构造如下。
StyleForm[expr, options]
其中expr可以接受表达式的输入。
比如输出一个数学公式,需要用M的函数StandForm来格式化。
values=BesselJ[5,Range[20]];
ListPlot[values, PlotLabel -> StyleForm[
StandardForm[1/x^2],
FontSize -> 24, FontWeight -> "Bold", FontColor -> RGBColor[
1, 0, 0], Background -> GrayLevel[0.5]]]
得到如图:


Graphics有两个Hook方法.Prolog和Epilog分别是在绘画主图前和后调用来产生图形同主图形
透视的函数。
比如想在一个圆点内写上字,就应该如下:
Show[Graphics[{{PointSize[.075], RGBColor[1, 0, 0], Point[{0, 0}]}}], Epilog -> Text["1", {0, 0}, TextStyle -> {FontSize -> 24, FontStyle -> "BOLD", FontColor -> RGBColor[0, 1, 0]}]];

星期一, 八月 28, 2006

Mathimatica 里notebook的环境问题。

为了解决插值问题,简单几个语句,竟然无法得出正确的结果:
data={7,2,3,25,1,10};
f = InterpolatingPolynomial[data, x];
f
f /. x -> 5

得到一个很奇怪的结果。如图。
















经过在组里询问:mathgroup@smc.vnet.net 和GroupGroup.
http://groups.google.com/group/comp.soft-sys.math.mathematica
得到BOB及其他答案,认为是Mathemathica 的kernel不"干净"需要重新启动Mathematica 再看看。
最终。使用bob的方法。
:
data={7,2,3,25,1,10};
Clear[f];
f[x_]=InterpolatingPolynomial[data,x];
f[5]

终于得到正确的答案1

而且最近 被Mathematica的变量的范围问题(Variable Scope)弄的头大,
根据手册,Module和Block申明的变量应该是在外面不可见的。
但输入函数中的变量依然可以被看见,这就导致了,循环调用函数的时候,外部的
For 循环计数器同函数内部的变量冲突了。
Damned

星期六, 八月 26, 2006

Sun有发布两个新的服务网站,很不错

Javascript Development Center.
http://java.sun.com/javascript/

Development Services
http://developers.sun.com/services/

星期五, 八月 25, 2006

如何显示点图和连线图,在Mathematica 5

data = Import["E:/ebook/彩票数据/2006兰色球.txt", "TABLE"];
g1 = ListPlot[data, ImageSize -> {640,
480}, AxesLabel -> {"序号", "兰色球"}, PlotStyle -> {
PointSize[.04], RGBColor[1, 0, 0]}, PlotJoined -> True,
AxesOrigin -> {0, 0}](*好的*);
g2 = ListPlot[data, ImageSize -> {640,
480}, AxesLabel -> {"序号", "兰色球"}, PlotStyle -> {
PointSize[.04], RGBColor[1, 0, 0]}, PlotJoined -> False,
AxesOrigin -> {0, 0}](*好的*);

Show[g1,g2];

星期四, 八月 24, 2006

Mathematica 中的插值(Interpolation)函数及使用

Mathematica 支持所有的数学插值概念,比如拉格朗日(lagrange) 插值,牛顿(newTon)插值.
及其他插值方法。
各种插值方法:http://mathworld.wolfram.com/Interpolation.html
参考数值积分:http://mathworld.wolfram.com/NumericalIntegration.html


使用拉格朗日(lagrange) 插值的函数为InterpolatingPolynomial
参考: http://mathworld.wolfram.com/LagrangeInterpolatingPolynomial.html
最后的结果用Newton-Cotes formula 牛顿-科茨公式形式

NewTon插值没有实现可以参看一个实现:
http://math.fullerton.edu/mathews/n2003/NewtonPolyMod.html
或这里:http://mathworld.wolfram.com/NewtonsDividedDifferenceInterpolationFormula.html



f = Interpolation[lsdata[[All, {3, 4, 5, 6, 7, 8, 9}]][[1]]]
f[4]

NumericalMath`PolynomialFit`
InterpolatingPolynomial[lsdata[[All, {3, 4, 5, 6, 7, 8}]][[1]], x]
N[f /. x -> 3]
(*freeze lock*)
InterpolatingPolynomial[lsdata[[All, {3, 4}]], x]
(*dead*)

星期一, 八月 21, 2006

Mathematica 图形IO接口

打开一个文件选择:
两种方法:
4.0之后,Mathematica 提供函数包 <FileBrowse
选择文件后,返回选择的文件完全路径

比如打开一个Access数据库,需要用户选择文件所在目录
Needs["DatabaseLink`"]
(*DatabaseExplorer[]*)
conn= OpenSQLConnection[JDBC["sun.jdbc.odbc.JdbcOdbcDriver", "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ="<>Experimental`FileBrowse[]], "Name" -> "test",
"Description" -> "", "Username" -> "root", "Password" -> "",
"RelativePath" -> False, "Version" -> 1]

二,使用Java来编写一个跨平台的FileChooser
Needs["JLink`"]

FileChooserDialog[] := FileChooserDialog["Select a file:", "Open", Directory[]]

FileChooserDialog[title_String, okText_String, dir_String] :=
JavaBlock[
Module[{dlg, chosenFile, result = Null},
InstallJava[];
dlg = JavaNew["javax.swing.JFileChooser"];
dlg@setCurrentDirectory[JavaNew["java.io.File", dir]];
dlg@setDialogTitle[title];
If[dlg@showDialog[Null, okText] === JFileChooser`APPROVEUOPTION,
chosenFile = dlg@getSelectedFile[];
If[chosenFile =!= Null,
result = chosenFile@getPath[]
]
];
result
]
]
In[1]:=FileChooserDialog[]
返回选择文件路径。

星期六, 八月 19, 2006

Mathematica 有关微积分的函数包

Calculus`VariationalMethods`

里面包括Euler(?Lagrange) 方程的应用。

看到这里。我想得出 数学模型的建立和 数论之间的关系。

由此得出了,要想把模型建立的纯熟,<<数值分析>>Numerical Analysis的教材是必须要学习的。

所以 下载了一些教材。这里是老外的教材下载.
http://william.wang.googlepages.com/Numerical Analysis.rar

星期一, 八月 14, 2006

金山词霸 2005 XP 不能取词原因

必须保证XP的服务:
DCOM 服务器进程启动器
已经启动。

第二可能同数据执行保护(DEP)有关

微软提供的新功能??数据执行保护(DEP)惹的祸,要出现这个问题,需要满足以下两个条件:
1、系统支持数据执行保护(DEP)功能,目前知道2003sp1支持,估计XP sp2也支持
2、CPU支持硬件DEP,我的AMD Athlon64 2800+就有这个问题,而Athlon 1600+没有,单位的P4 2.66也没有。
(得到的结论就是:Athlon64支持硬件DEP。不支持硬件DEP的在设定DEP的界面有提示,说只能执行软件DEP云云。再给我偏爱的AMD做一次广告!)

解决办法:
我的电脑(鼠标右键)??〉属性??〉高级??〉性能(设置)??〉数据执行保护??〉添加金山词霸的主文件

需要重启系统才能生效

星期六, 八月 12, 2006

Mathematica 数据类型转换

如何把一个数字字符串,转换为数字?

方法:
使用ToExpression [expr]

比如:"33",使用
b=ToExpression["33"]
Head@b执行后得到:
Integer

非常隐秘的方法。

星期五, 八月 11, 2006

Mathematica 中的数据类型判断

如何判断一个变量的数据类型?

两种方法。
1.用Head方法
Head@变量名字.
如同Java InstanceOf,
2.用Q族方法。
NumberQ
NumericQ
IntegerQ
EvenQ
OddQ
PrimeQ;
ArrayQ
VectorQ
MatrixQ (for these there are nice element tests too)
PolynomialQ (element tests). There are built in "structural" tests
SameQ
UnsameQ
OrderedQ
MemberQ
FreeQ
MatchQ
ValueQ
AtomQ

星期四, 八月 10, 2006

Mathematica 快速访问 MS Access数据库

(*注意红色URL写法*)

Needs["DatabaseLink`"]
(*DatabaseExplorer[]*)
conn= OpenSQLConnection[JDBC["sun.jdbc.odbc.JdbcOdbcDriver", "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=D:\lottery\history.mdb"], "Name" -> "test",
"Description" -> "", "Username" -> "root", "Password" -> "",
"RelativePath" -> False, "Version" -> 1]

星期五, 八月 04, 2006

Mathematica 一些表达式语法

1.单值函数调用 用 @ 符号

2.字符串连接用<> 符号. "ddd"<>"bbb" 得到 dddbbb

3.函数返回值。 最后一个表达式的结果 默认为函数的结果。

星期三, 七月 26, 2006

Mathematica 中如何使用数据库?

http://documents.wolfram.com/mathematica/Add-onsLinks/DatabaseLink/

Needs["DatabaseLink`"]
DatabaseExplorer[]

1.如何把数据库的JDBC的驱动加入?
把JDBC的jar文件复制到Mathematica DataBaseResource 属性location 指定的目录下。如图





2.这样就可以建立了DatabaseResource资源了,然后就可以在notebook程序中使用了。
使用语法,如果熟悉ODBC或JDBC就非常容易理解了。

Needs["DatabaseLink`"]
(*DatabaseExplorer[]*)
conn= OpenSQLConnection[JDBC["org.gjt.mm.mysql.Driver", "jdbc:mysql://10.2.5.240:3306/HK_PCD55"], "Name" -> "test",
"Description" -> "", "Username" -> "root", "Password" -> "",
"RelativePath" -> False, "Version" -> 1]
(*建立连接,也可以通过配置文件的方式来设置,可参看具体的http://documents.wolfram.com/mathematica/Add-onsLinks/DatabaseLink/DatabaseConnections/EstablishingAConnection/DatabaseLink2.2.1.html*)
SQLSelect[conn,"att_L_LeaveType"]
SQLExecute[conn,"select * from att_L_LeaveType"]
CloseSQLConnection[conn]

可以通过:JDBCDriverNames[] 来得到当前Mathematica内所有的配置数据库
得到某个具体的数据源的具体配置通过命令: J
DBCDrivers["mysql"]

星期一, 七月 17, 2006

如何用HTML来显示对应UTF-8的汉字?

HTML默认支持Unicode的方式是UTF-8编码。
所以任何Unicode字符集的 字体要用HTML表示出来,必须得到对应的UTF-8编码。

比如符号:? 对应的Unicode的字符集合编码为:A87C.
但是对应的UTF-8的编码就为:8525(十六进制)
所以用HTML来表示就为 &#x2585;
显示出来:?
注意:要根据原来UNICODE字符集合的高低位顺序确定HTML的字节表示方法。
UTF-8根据:低位->高位来表示字符顺序

Encoding Representation
UTF-8 EF BB BF
UTF-16 Big Endian FE FF
UTF-16 Little Endian FF FE
UTF-32 Big Endian 00 00 FE FF
UTF-32 Little Endian FF FE 00 00

星期日, 七月 09, 2006

Mathematica 5.0 All 关键词的妙用

lotterydata={
{12,13,17,19,29,30,32,2006001},
{02,13,14,23,32,34,35,2006002},
{03,08,09,13,29,31,35,2006003},
{06,09,16,23,31,33,34,2006004},
{11,12,21,23,26,30,34,2006005},
{06,07,09,18,20,22,28,2006006},
{01,04,05,07,09,17,24,2006007},
{03,17,18,20,22,31,35,2006008},
{04,05,07,15,17,19,28,2006009},
{02,06,15,20,26,32,35,2006010},
{02,04,06,11,23,24,32,2006011},
{04,06,09,13,24,31,35,2006012},
{05,06,07,22,25,26,30,2006013},
{07,17,18,19,23,28,32,2006014},
{04,09,17,19,22,24,35,2006015},
{13,16,20,23,25,26,33,2006016},
{01,02,06,10,12,19,25,2006017},
{01,02,06,15,16,31,34,2006018},
{15,17,22,23,24,33,35,2006019}}
lotterydata[[All,3]](*取出每一纬第3个数据*)
得到结果:{17,14,9,16,21,9,5,18,7,15,6,9,7,18,17,20,6,6,22}

星期五, 七月 07, 2006

Java Headless 测试代码for jdk >1.3

import java.awt.*;
import java.io.*;
import java.awt.print.*;

import javax.imageio.*;
import java.io.*;
import java.util.logging.*;
import java.awt.image.BufferedImage;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Color;
import java.awt.Font;
import javax.imageio.ImageIO;
import java.awt.font.*;
import java.awt.geom.*;
import javax.naming.*;

public class HeadlessBasics
{
public static void main(String[] args) throws Exception
{
// Set system property.
// Call this BEFORE the toolkit has been initialized, that is,
// before Toolkit.getDefaultToolkit() has been called.
System.setProperty("java.awt.headless", "true");

// This triggers creation of the toolkit.
// Because java.awt.headless property is set to true, this
// will be an instance of headless toolkit.
Toolkit tk = Toolkit.getDefaultToolkit();
// Standard beep is available.
tk.beep();

// Check whether the application is
// running in headless mode.
GraphicsEnvironment ge =
GraphicsEnvironment.getLocalGraphicsEnvironment();
System.out.println("Headless mode: " + ge.isHeadless());
HeadlessBasics hb=new HeadlessBasics();

ImageIO.write(hb.DisplayTextPicture("dddd") , "png", new File("first"));

}
public BufferedImage DisplayTextPicture(String willtext)
{
int width = 48;
int height = 48;
float size = 8.0f;
int StringH = 8;
BufferedImage buffer = new BufferedImage(width,
height,
BufferedImage.TYPE_INT_RGB);
Graphics2D g2 =(Graphics2D)buffer.getGraphics();
Font font = new Font("serif", Font.BOLD, StringH);
font = font.deriveFont(size);
FontRenderContext fc = g2.getFontRenderContext();
Rectangle2D bounds = font.getStringBounds(willtext,
fc);
width = (int) bounds.getWidth();
height = (int) bounds.getHeight() * 2;
buffer = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
g2 = (Graphics2D)buffer.getGraphics();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2.setFont(font);
g2.setColor(Color.white);
g2.fillRect(0, 0, width, height);
g2.setColor(Color.red);
String[] tem = willtext.split("\n");
for (int i = 0; i < tem.length; i++)
g2.drawString(tem[i], 0,
(int) - bounds.getY() + i * StringH);
return buffer;
}
}

星期四, 六月 29, 2006

Java 把数字从低向高排序


import java.io.*;

public class Order
{
public static void main(String[] args) throws Exception
{
if(args.length<1) dataf=" new" style="font-weight: bold; color: rgb(255, 0, 0);">BufferedReader d = new BufferedReader(new InputStreamReader(new FileInputStream(dataf)));
String line="";
StringBuffer out =new StringBuffer();
while( (line=d.readLine())!=null)
{
String[] all=line.split("[\t,]");
int[] number = Str2Int(all);
java.util.Arrays.sort(number);
out.append(int2Str(number)).append("\n");
}
System.out.println(out);
}

/*
*把int数组转换为字符串数组
*/
static String int2Str(int[] ori)
{
StringBuffer result = new StringBuffer();
for(int i=0;i<ori.length;i++)
result.append(ori[i]).append("\t");
return result.toString();
}
/*
*把数组转换为字符int串数组
*/

static int[] Str2Int(String[] ori)
{
int[] result= new int[ori.length];
for(int i=0;i<result.length;i++)result[i]=Integer.parseInt(ori[i]);
return result;
}

}

星期三, 五月 31, 2006

Mathematica 中的常用函数

Mathematica 中的常用函数

如果你是第一次使用Mathematica,那么以下几点请你一定牢牢记住:

1. Mathematica 区分大小写,如 Name、name是不同的变量名或函数名。

2. 系统所提供的功能大部分以系统函数的形式给出,内部函数一般写全称,
以大写英文字母开头,如 Sin[x],Conjugate[z]等;
有时一个函数名是由几个单词构成,则每个单词的首写字母也必须大写
如:求局部极小值函数 FindMinimum[f[x],{x,x0]等

3. 乘法即可以用“*”,也可以用空格表示,如 2 3=2*3=6 等;
乘幂可以用“^”表示,如 x^0.5, Tan[x]^y 等

4. 自定义的变量可以取几乎任意的名称,但为了不与系统函数产生混淆,
我们自定义的变量应该是以小写字母开始,后跟数字和字母的组合,
长度不限,不可以数字开头。

5. 给变量赋值后,除非明显地改变该值或使用Clear[变量名]或“变量名=.”取消该值,
否则它将始终保持原值不变。

6. 一定要注意四种括号的用法:
() 圆括号表示项的结合顺序,如(x+(y^x+1/(2x)));
[] 方括号表示函数,如Log[x],BesselJ[x,1];
{} 大括号表示一个“表”(一组数字、任意表达式、函数等的集合),
如 {2x,Sin[2 Pi],{1+A,y*x}};
[[]] 双方括号表示“表”或“表达式”的下标,如a[[2,3]]、{1,2,3}[[1]]=1。

7. Mathematica的语句书写十分方便:
一个语句可以分为多行写,同一行可以写多个语句(但要以分号间隔)。
当语句以分号结束时,不做输出(输出语句除外),否则将输出计算结果。

常用函数

1.运算符及特殊符号

Linel   执行Line,不显示结果

Linel,line2 顺次执行Line1,Line2,并显示结果

?name 关于系统变量name的信息

??name 关于系统变量name的全部信息

!command 执行Dos命令

N! N的阶乘

!!filename 显示文件内容

<>filename 打开文件写

Expr>>>filename 打开文件从文件末写

() 结合率

[] 函数

{} 一个表

<*MathFun*> 在c语言中使用math的函数

(*Note*) 程序的注释

#n 第n个参数

## 所有参数

Rule& 把role作用于后面的式子

% 前一次的输出

%% 倒数第二次的输出

%%%(k) 倒数第k次的计算结果

%n 例出行Out[n])的结果(用时要小心)

Var::mote 变量var的注释

"Astring" 字符串

Context 上下文

A+b, a-b, A*b或a b, A/b 加减乘除

2.系统常量

Pi  3.1415的无限精度数值

E 2.17828的无限精度数值

Catalan 0.915966 Catalan常数

EulerGamma 0.5772 Euler常数

Khinchin 2.68545 Khinchin

Glaisher 0.915966 Glaisher

GoldenRatio 1.61803黄金分割数

Degree Pi/l80角度弧度换算

I 复数单位

Infinity 无穷大

-Infinity 负无穷大

Complexlnfinity 复无穷大

Indeterminate 不定式

3.代数计算

Expand[expr] 展开表达式

Factor[expr] 对表达式进行因式分解

Simplify[expr] 化简表达式

FullSimplify[expr] 将特殊函数也进行化简

PowerExpand[expr] 展开所有的幂次形式

ComplexExpand[expr,{x1,x2,...)] 按复数实部虚部展开

FunctionExpand[expr] 化简表达式中的特殊函数

Collect[expr,x] 合并同次项

Collect[expr,{x1,x2,...)] 合并x1,x2,...的同次项

Together[expr] 通分

Apart[expr] 部分分式展开

Apart[expr,var) 对var的部分分式展开

Cancel[expr] 约分

xpandAll[expr] 展开表达式

ExpandAll[expr,patt] 展开表达式

FactorTermsrpoly] 提出共有的数字因子

FactorTerms[poly,x] 提出与x无关的数字因子

FactorTerms[poly,(x1,x2,...)] 提出与xi无关的数字因子

Coefficient[expr,form] 多项式expr中form的系数

Coefficient[expr,form,n) 多项式expr中form^n的系数

Exponent[expr,form] 表达式expr中form的最高指数

Numerator[expr] 表达式expr的分子

Denominator[expr] 表达式expr的分母

ExpandNumerator[expr] 展开expr的分子部分

4. 解方程

Solve[eqns,vats] 从方程组eqns中解出Vats

Solve[eqns,vats,elims] 从方程组eqns中削去变量elims,解出vats

DSolve[eqn,y,x] 解微分方程,其中、y是x的函数

DSolve[{eqnl,eqn2,...},{y1,y2,...}] 解微分方程组,其中yi是x的函数

DSolve[eqn,y,{x1,x2,...}] 解偏微分方程

Eliminate[eqns,Vats] 把方程组eqns中变量vars约去

SolveAlways[eqns,vars] 给出等式成立的所有参数满足的条件

Reduce[eqns,Vats] 化简并给出所有可能解的条件

LogicalExpand[expr] 用&&和,将逻辑表达式展开

InverseFunction[f] 求函数f的反函数

Root[f,k] 求多项式函数的第k个根

Roots[1hs==rhs,var] 得到多项式方程的所有根

5. 微积分

D[f,x]  求f[x]的微分

D[f,{x,n}] 求f[x]的n阶微分

D[f,x1,x2,...] 求f[x]x1,x2,...偏微分

Dt[f,x] 求f[x]的全微分df/dx

Dt(f) 求f[x]的全微分df

Dt[f,{x,n}] n阶全微分df^n/dx^n

Dt[f,x1,x2..] 对x1,x2..的偏微分

Integrate[f,x] f[x]对x在的不定积分

Integrate[f,{x,xmin,xmax}] f[x]对x在区间(xmin,xmax)的定积分

Integrate[f,{x,xmin,xmax},{y,ymin,ymax}] f[x,y]的二重积分

Limit[expr,x->x0] x趋近于x0时expr的极限

Residue[expr,{x,x0}] expr在x0处的留数

Series[f,{x,x0,n)] 给出f[x]在x0处的幂级数展开

Series[f,{x,xO,nx},{y,y0,ny}] 先对y幂级数展开,再对x幂级数展开

Normal[expr] 化简并给出最常见的表达式

SeriesCoefficient[series,n] 给出级数中第n次项的系数

SeriesCoefficient[series,{n1,n2,...}] 一阶导数

InverseSeries[s,x] 给出逆函数的级数

ComposeSeries[seriel,serie2,...] 给出两个基数的组合

SeriesData[x,x0,{a0,a1,..},nmin,nmax,den] 表示一个x0处x的幂级数

O[x]^n n阶小量x^n

6. 多项式函数

Variables[poly] 给出多项式poly中独立变量的列表

CoefficientList[poly,var] 给出多项式poly中变量var的系数

CoefficientList[poly,{varl,var2,...)) 给出多项式poly中变量var(i)的系数列

PolynomialMod[poly,m] poly中各系数mod m同余后得到的多项式,m可为整式

PolynomialQuotient[p,q,x] 以x为自变量的两个多项式之商式p/q

PolynomialRemainder[p,q,x] 以x为自变量的两个多项式之余式

Po1ynomialGCD[polyl,poly2,...] poly(i)的最大公因式

PolynomialLCM[polyl,poly2....] poly(i)的最小公倍式

PolynomialReduce[poly,{polyl,Poly2,...},{xl,x2,...}]
得到一个表 I(a1,a2,...),b) 其中 Sum[ai*polyi]+b=poly


Resultant[polyl,poly2,var] 约去polyl,poly2中的var

Factor[poly] 因式分解(在整式范围内)

FactorTerms[poly] 提出poly中的数字公因子

FactorTerms[poly,{x1,x2,...)] 提出poly中与xi无关项的数字公因子

FactorList[poly],
FactorSquareFreeList[p01y],
FactorTermsList[poly,{x1,x2,...}] 给出各个因式列表


Cyclotomic[n,x] n阶柱函数

Decomposet[poly,x] 迭代分解,给出{p1,p2,...),其中P1(p2(...))=poly

InterpolafinSPolynomial[data,Var] 在数据data上的插值多项式

RootSum[f,form] 得到f[x]=0的所有根,并求得Sum[form[xi]]

7. 随机函数

Random[type,range]  产生type类型且在range范围内的均匀分布随机数

Random[] 0-1上的随机实数

SeedRandom[n] 以n为seed产生伪随机数

Randomldistribution] 可以产生各种分布

8. 数值函数

N[expr]  表达式的机器精度近似值
N[expr,n] 表达式的n位近似值,n为任意正整数


NSolve[lhs==rhs,val] 求方程数值解
NSolvel[eqn,Var,n] 求方程数值解,结果精度到n位


NDSolve[eqns,y,{x,xmirl,xmax}] 微分方程数值解
NDSolve[eqns,{y1,y2,...},{x,xmin,xmax}] 微分方程组数值解


FindRoot[1hs==rhs,{x,x0)1 以x0为初值,寻找方程数值解
FindRoot[1hs=--rhs,{x,xstart,xmin,xmax}]
以xstart为初值,在[xmin,xmax]范围内寻找方程数值解


NSum[f,{imin,imax,di}] 数值求和,出为步长
NSum[f,{imin,imax,di},{j,..},..] 多维函数求和


NProduct[f,{i,imin,imax,di}] 函数求积

NIntegrate[f,{x,xmin,xmax}] 函数数值积分

FindMinimum[f,{x,xO}] 以x0为初值,寻找函数最小值
FindMinimum[f,{x,xstart,xmin,xmax}]
以xstart为初值,在[xmin,xmax]范围内寻找方程解


ConstrainedMin[f,{inequ},{x,y,...}] inequ 为线性不等式组,
f 为x,y,...之线性函数,得到最小值及此时的x,y,...取值


ConstrainedMax[f,{inequ),{x,y,...}] 得到最大值及此时的x,y,...取值

LinearProgramming[C,m,b]
解线性组合c.x在m.x>=b&&x>=0约束下的最小值,x,b,c为向量,m为矩阵


LatticeReduce[{v1,v2...}] 向量组Vi的极小无关组


Fit[data,funs,vats] 用指定函数组对数据进行最小二乘拟合

Interpolation[data] 对数据进行插值

Lisfinterpolation[array] 对离散数据插值,array可为n维

ListInterpolafion[array,{{xmin,xmax},{min,ymax},..}]
在特定网格上进行插值


FunctionInterpolation[expr,{x,xmin,xmax},{y,ymin,ymax},..]
以对应expr[xi,yi]的数值为数据进行插值


Fourier[list] 对复数数据进行傅氏变换

InverseFourier[list] 对复数数据进行傅氏逆变换

9. 表的操作

制表函数

{e1,e2,...} 一个表,元素可以为任意表达式,无穷嵌套

Table[expr,{imax}] 生成一个表,共imax个元素

Table[expr,{i,imax}} 生成一个表,共imax个元素expr间

Table(expr,{i,imin,imax},{j,jmin,jmax},..] 多维表

Range[imax] 简单数表{1,2,..., imax}

Range[imin,imax,di] 以di为步长的数表

Array[f,n] 一维表,元素为fI¨(i从1到n)

Array[f,{n1,n2..}] 多维表,元素为玎i小.1 (各自从1到ni)

IdentityMatrix[n] n 阶单位阵

DiagonalMatrix[list] 对角阵


元素操作

Part[expr,i]或expr[[i]] 第i个元素

expr[[-i]] 倒数第i个元素

expr[{i,j,..}] 多维表的元素

expr[{i1,i2,..}] 返回由第i(n)的元素组成的子表

First[expr] 第一个元素

Last[expr] 最后一个元素

Head[expr] 函数头,等于expr[[0]]

Extract[expr,list] 取出由表list指定位置上expr的元素值

Take[list,n] 取出表list前n个元素组成的表

Take[list,{m,n}] 取出表list从m到n的元素组成的表

Drop[list,n] 去掉表list前n个元素组下的表

Rest[expr] 去掉表list第一个元素剩下的表

Select[USt,crit] 把crit作用到每一个list的元素上,为True的所有元素组成的表

Length[expr] expr第一层元素的个数

Dimensions[expr] 表的维数返回{n1,n2..},expr为一个nl*n2...的阵

TensorRank[expr] 秩

Depth[expr] expr最大深度

Level[expr,n] 给出expr中第n层子表达式的列表

Count[USt,paUem] 满足模式的list中元素的个数

MembefQ[1ist,form] list中是否有匹配form的元素

FreeQ[expr,form] MemberQ的反函数

FreeQ[expr,form] 表中匹配模式pattern的元素的位置列表

Cases[{e1,e2,...},pattem] 匹配模式pattem的所有元素ei的表


表的操作

Append[exp,elem] 返回在表expr的最后追加elem元素后的表

Prepend[expr,elem] 返回在表expr的最前添加elem元素后的表

Insert[1ist,elem,n] 在第n元素前插入elem

lnsert[expr,elem,{i,j,...}] 在元素expr[[{i,j,..}]]前插入elem

Delete[expr,{i,j,..}] 删除元素expr[[{i,j,..}]]后剩下的表

DeleteCases[expr,pattem] 删除匹配pattern的所有元素后剩下的表

ReplacePart[expr,new,n] 将expr的第n元素替换为new

Sort[list] 返回list按顺序排列的表

Reverse[expr] 把表expr倒过来

RotateLeft[expr,n] 把表expr循环左移n次

RotateRight[expr,n] 把表expr循环右移n次

Partition[list,n] 把list按每n个元素为一个子表分割后再组成的大表

Flatten[list] 抹平所有子表后得到的一维大表

Flatten[1ist,n] 抹平到第n层

Split[1ist] 把相同的元素组成一个子表,再合成的大表

10. 绘图函数

二维绘图

Plot[f,{x,xmin,xmax}] 一维函数f[x]在区间[xmin,xmax]上的函数曲线

Plot[{fl,f2..},{x,xmin,xmax}] 在同一图形上画几条曲线

ListPlot[{y1,y2,..}] 绘出由离散点对(n,yn)组成的图

ListPlot[{{x1,y1},{x2,y2},}} 绘出由离散点对(xrl,yrl)组成的图

ParametricPlot[{fx,fy},{t,tmin,tmax}] 由参数方程在参数变化范围内产生的曲线

ParametricPlot[{fx,fy},{gx,gy},...],{t,tmin,truax}]


二维设置

PlotRange->{0,1} 作图显示的值域范围

AspectRatio->1/GoldenRatio 生成图形的纵横比

PlotLabel->label 标题文字

Axes->{false,True} 分别制定是否画x,y轴

AxesLabel->{xlabel,ylabel} x,y轴上的说明文字

Ticks->None,Automatic,fun 用什么方式画轴的刻度

AxesOrigin->{x,y} 坐标轴原点位置

AxesStyle->{{xstyle},{ystyle}} 设置轴线的线性颜色等属性

Frame->True,False 是否画边框

FrameLabel->{xmlabel,ymlabel,xplabel,yplabel} 边框四边上的文字

FrameTicks 同Ticks 边框上是否画刻度

GridLines 同Ticks 图上是否画栅格线

Framestyle->{{xmstyle},{ymstyle}} 设置边框线的线性颜色等属性

ListPlot[data,PlotJoined->True] 把离散点按顺序连线

Plotsytle->{{style1},{style2},..} 曲线的线性颜色等属性

PlotPoints->15 曲线取样点,越大越细致


三维绘图

Plot3D[f,{x,xmin,xmax},{y,ymin,ymax}] 二维函数f[x,y]的空间曲面

Plot3D[{f,s},{x,xmin,xmax},{y,ymin,ymax}] 同上,曲面的染色由s[x,y]值决定

ListPlot3D[array] 二维数据阵array的立体高度图

ListPlot3D[array,shades] 同上,曲面的染色由shades[数据]值决定

ParametricPlot3D[{fx,fy,fz},{t,tmin,tmax}] 三维参数图形

ContourPlot[f,{x,xmin,xmax},{y,ymin,ymax}] 二维函数f[x,y]在指定区间上的等高线图

ListContourPlot[array] 二维函数fix,yJ在指定区间上的等高线图


三维设置

Contours->n 画n条等高线

Contours->{z1,z2,...} 在zi处画等高线

ContourShading->False 是否用深浅染色

ContourLines->True 是否画等高线

ContourStyle->{{stylel},{style2},..} 等高线线性颜色等属性


密度图

DensityPlot[f,{x,xmin,xmax},{y,ymin,ymax)] 二维函数f[x,y]在指定区间上的密度图

ListDensityPlot[array] 二维函数f[x,y]在指定区间上的密度图


图形显示

Show[graphics,options] 显示一组图形对象,options为选项设置

Show[g1,g2,...] 在一个图上叠加显示一组图形对象

GraphicsArray[{g1,g2,...}] 在一个图上分块显示一组图形对象

SelectionAnimate[notebook,t] 把选中的notebook中的图画循环放映


图元函数

Graphics[prim,options] prim为下面各种函数组成的表,表示一个二维图形对象

Graphics3D[prim,options] prim为下面各种函数组成的表,表示一个三维图形对象

SurfaceGraphics[array,shades] 表示一个由array和shade决定的曲面对象

ContourGraphics[array] 表示一个由array决定的等高线图对象

DensityGraphics[array] 表示一个由array决定的密度图对象

Point[p] p={x,y}或{x,y,2},在指定位置画点

Line[{p1,p2,..}] 经由Pi点连线

Rectangle[{xmin,ymin),{xmax,ymax}] 画矩形

Cuboid[{xmin,ymin,zmin},{xmaxffmax,zmax}] 由对角线指定的长方体

Polygon[{p1,p2,...}] 封闭多边形

Circle[{x,y},r] 画圆

Circle[{x,y},{rx,ry}] 画椭圆,rx,ry为半长短轴

Circle[{x,y},r,{a1,a2}] 从角度al-a2的圆弧

Disk[{x,y},r] 填充的园、椭圆、圆弧等参数同上

Raster[array,ColorFunction->f] 颜色栅格

Text[expr,coords] 在坐标coords上输出表达式

PostScrip["string"] 直接用Postscript图元语言写

Scaled[{x,y,...}] 返回点的坐标,且均大于0小于1


着色及其他

GrayLevel[level] 灰度level为0~1间的实数

RGBColor[red,green,blue] RGB颜色,均为0~I间的实数

Hue[h,s,b] 亮度,饱和度等,均为0~1间的实数

CMYKColor[cyan,magenta,yellow,block] CMYK颜色

Thicknessr[r] 设置线宽为r

PointSize[d] 设置绘点的大小

Dashing[{r1,r2,...}] 画一个单元的间隔长度的虚线

ImageSize->{x,y} 显示图形大小(单位为像素)

11. 流程控制

If[condition,t,f] 如果condition为True,执行t,否则执行f段

if[condition,t,f,u]
如果condition为Ture,执行t,为False执行f,既非True 又非False,则执行u


Which[test1,blockl,test2,block2,...] 执行第一为True的tesfi对应的blocki

Switch[expr,forml,blockl,form2,block2,...] 重复执行expr imax次

Do[expr,{imax}] 重复执行expr imax次

Do[expr,{i,imin,imax},{j,jmin,jmax}] 多重循环

While[test,body] 循环执行body直到test为False

For[start,test,incr,body] 循环执行body直到test为False

Throw[value] 停止计算,把value返回给最近一个Catch处理

Throw[value,tag] 停止计算,把value返回给最近一个Catch处理

Catch[expr] 计算expr,遇到Throw返回的值则停止

Catch[expr,form] 当Throw[value,tag]中Tag匹配form时停止

Return[expr] 从函数返回,返回值为expr

Return[] 返回值Null

Breakl[] 结束最近的一重循环

Continuel[] 停止本次循环,进行下一次循环

Goto[tag] 无条件转向Label[Tag]处

Label[tag] 设置一个断点

Check[expr,fmlexpr] 计算expr,如果有出错信息产生,则返回failexpr的值

Check[expr,failexpr,s1::t1,s2::t2,...] 当特定信息产生时则返回failexpr

CheckAbort[expr,failexpr] 当产生abort信息时返回failexpr

Interrupt[] 中断运行

Abort[] 中断运行

TimeConstrained[expr,t] 计算expr,当耗时超过t秒时终止

MemoryConstrained[expr,b] 计算expr,当耗用内存超过b字节时终止运算

Print[exprl,expr2,...] 顺次输出expri的值

Input[] 产生一个输入对话框,返回所输入的任意表达式

Input["prompt"] 同上,prompt为对话框的提示

Pause[n] 运行暂停n秒

Matchematica中有关建模的函数

优化函数:

FindMinimum[f, {x,x0}] 以x0为初值,寻找函数最小值
FindMinimum[f, {x, xstart, xmin, xmax}]
ConstrainedMin[f,{inequ},{x,y,..}]
inequ为线性不等式组,f为x,y..之线性函数,得到最小值及此时的x,y..取值
ConstrainedMax[f, {inequ}, {x, y,..}]同上
LinearProgramming[c,m,b] 解线性组合c.x在m.x>=b&&x>=0约束下的
最小值,x,b,c为向量,m为矩阵
LatticeReduce[{v1,v2...}] 向量组vi的极小无关组

数据处理:

Fit[data,funs,vars]用指定函数组对数据进行最小二乘拟和
data可以为{{x1,y1,..f1},{x2,y2,..f2}..}多维的情况
emp: Fit[{10.22,12,3.2,9.9}, {1, x, x^2,Sin[x]}, x]
Interpolation[data]对数据进行差值,
data同上,另外还可以为{{x1,{f1,df11,df12}},{x2,{f2,.}..}指定各阶导数
InterpolationOrder默认为3次,可修改
ListInterpolation[array]对离散数据插值,array可为n维
ListInterpolation[array,{{xmin,xmax},{ymin,ymax},..}]
FunctionInterpolation[expr,{x,xmin,xmax}, {y,ymin,ymax},..]
以对应expr[xi,yi]的为数据进行插值
Fourier[list] 对复数数据进行付氏变换
InverseFourier[list] 对复数数据进行付氏逆变换
Min[{x1,x2...},{y1,y2,...}]得到每个表中的最小值
变换
Min[{x1,x2...},{y1,y2,...}]得到每个表中的最小值
Max[{x1,x2...},{y1,y2,...}]得到每个表中的最大值
Select[list, crit] 将表中使得crit为True的元素选择出来
Count[list, pattern] 将表中匹配模式pattern的元素的个数
Sort[list] 将表中元素按升序排列
Sort[list,p] 将表中元素按p[e1,e2]为True的顺序比较list
的任两个元素e1,e2,实际上Sort[list]中默认p=Greater

星期五, 五月 26, 2006

各种函数算术

什么是导数?
设函数在点的某个邻域内有定义,当自变量在点处取得改变量()时,函数取得相应的改变量,如果极限

存在,则称函数在点可导,并称此极限值为函数在点处的导数(或变化率),记为

,或

如果上式极限不存在,就称函数在点不可导导数不存在

若令,则当时,有,所以函数在点处导数也可写成:

类似地,称

函数的导函数,简称导数

在处的左导数;

处的右导数。

关于处导数有如下两个结论:

(1) 存在的充分必要条件是存在且相等。

(2)可导与连续的关系是:如果函数在点处可导,则处连续。



1.幂函数y=xn (a为实数)的导数(变化率)
y'=n*xn-1

2.正弦函数Sin(x)的导数
Sinx'=Cosx.

3.对数函数y=loga(x)的导数(a>0,a<>1)
loga'(x)=1/(x*lna)