让jar包可以双击运行,其实很简单
1.写一个manifest.mf文件,里面只有两行
第一行为Main-Class
第二行为空行
注意冒号后面有一个空格
Main-Class: YourClassName
2.用jar命令打包
jar -cvfm xxx.jar xxx.mf classfiles
3.然后就可以运行了
要注意,双击运行jar包时,
系统会调用javaw而不是java,
因此命令行输出是看不到的。
Learn and share.
让jar包可以双击运行,其实很简单
1.写一个manifest.mf文件,里面只有两行
第一行为Main-Class
第二行为空行
注意冒号后面有一个空格
Main-Class: YourClassName
2.用jar命令打包
jar -cvfm xxx.jar xxx.mf classfiles
3.然后就可以运行了
要注意,双击运行jar包时,
系统会调用javaw而不是java,
因此命令行输出是看不到的。
三大UNIX为:
IBM AIX, HP UNIX,SUN Solaris
UNIX,BSD,Linux被统称为×nix系统。
BSD与Linux系统的区别:
BSD is what you get when a bunch of UNIX hackers sit down to try to port a UNIX system to the PC.
Linux is what you get when a bunch of PC hackers sit down and try to write a UNIX system for the PC.
| boolean | Z |
| byte | B |
| char | C |
| double | D |
| float | F |
| int | I |
| long | J |
| short | S |
| class/interface | Lclassname |
| array | [ |
1.Java代码CallApi.java
class CallApi{
private native String showMessageBox(String msg);
private native double getRandomDouble();
static{
try{
System.loadLibrary("CallApi");
System.out.println("Loaded CallApi");
}catch(UnsatisfiedLinkError e){
//nothing to do
System.out.println("Couldn't load CallApi");
System.out.println(e.getMessage());
}
}
public static void main(String args[]){
CallApi api = new CallApi();
double randomNumber = api.getRandomDouble();
String retval = api.showMessageBox("Hello from Java!\n"+
"The native random number: "+randomNumber);
System.out.println("The native string: "+retval);
}
}
2.生成dll的CallApi.h文件
javah -classpath . -jni CallApi
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class CallApi */
#ifndef _Included_CallApi
#define _Included_CallApi
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: CallApi
* Method: showMessageBox
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_CallApi_showMessageBox
(JNIEnv *, jobject, jstring);
/*
* Class: CallApi
* Method: getRandomDouble
* Signature: ()D
*/
JNIEXPORT jdouble JNICALL Java_CallApi_getRandomDouble
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
3.手写dll的CallApi.c文件
#include"CallApi.h"
#include <windows.h>
#include <time.h>
//#pragma comment(lib,"user32.lib")
JNIEXPORT jstring JNICALL Java_CallApi_showMessageBox
(JNIEnv *env, jobject thisObject, jstring js)
{
//first convert jstring to const char for use in MessageBox
const jbyte* argvv = (*env)->GetStringUTFChars(env, js, NULL);
char* argv =(char *) argvv;
//Call MessageBoxA
MessageBox(NULL, argv, "Called from Java!", MB_ICONEXCLAMATION | MB_OK);
return js;
}
JNIEXPORT jdouble JNICALL Java_CallApi_getRandomDouble
(JNIEnv *env, jobject thisObject)
{
double num1;
srand((unsigned)(time(0)));
num1 = ((double)rand()/(double)RAND_MAX);
return num1;
}
4.编译
注意1:要引用jdk下的include目录下文件,因此要增加引用文件路径
注意2:用MT而不是MD
5.运行
java -Djava.library.path=. CallApi
Winexec UINT WinExec( LPCSTR lpCmdLine, UINT uCmdShow ); ShellExecute HINSTANCE ShellExecute( HWND hwnd, LPCTSTR lpOperation, LPCTSTR lpFile, LPCTSTR lpParameters, LPCTSTR lpDirectory, INT nShowCmd ); CreateProcess BOOL CreateProcess(LPCTSTR lpApplicationName, LPTSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCTSTR lpCurrentDirectory, LPSTARTUPINFO lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation );
1、static_cast
这是应该首先选用的转换方式,一般用于在相关类型间进行转换或在继承链中进行转换。
其运作方式类似于隐式转换 (比如int转为float,或指针转换为 void*), 而且它可以调用显示转换(当然包括隐式转换)。
在很多情况下, 显示声明static_cast是不必要的,
但有一点需要指出的是应当尽量避免type(XXX) 与(type)XXX 语法(详情见下文)。
然而type(XXX,YYY) 是安全的,而且一定会去调用构造函数。
static_cast也可以在父类及子类之间进行。 当子类向父类转换时是可以顺利进行的。但父类向子类转换时,只要子类没有继承virtual父类,就可以一直进行。但是它从父类转为子类时,不会做任何检查,即使类型不完全匹配。
2、const_cast
用来向一个变量增加或删除const属性。 其他任何C++ casts都无法完成此任务。
需要指出的是,当变量为const,该操作符是未定义的。
用它来声明一个非const类型的const引用是安全的。
当重载const类型的类成员变量时,该转换十分有用。
它也可以用来把一个对象增加const属性,比如调用重载的方法。
const_cast也适用于volatile,但很少见。
3、dynamic_cast
一般用来解决多态问题。你可以把指针或参考转换为任何继承链上的类型。
(一个多态类型至少用一个虚函数,无论是声明还是继承的)。
当从子类转换为父类时,dynamic_cast一定会成功。但从父类转换为子类,dynamic_cast会确保对象为子类的一个完全实现。
dynamic_cast将返回其是否可能。如果无法转换,他将返回NULL(对指针),或抛出std::bad_cast异常(对参考)。
dynamic_cast有一些限制:
如果在继承链中,同一类型有多个对象(dreaded diamond)同时你没有使用虚接口,转换不会进行。
他也只能应用于public继承,当protect或private继承时,会失败。
注意:
dynamic_cast需要编译器支持RTTI(运行时类型识别)。
4、reinterpret_cast
这是最危险的转换方式,慎用。 它直接把一种类型转换为另一种
(比如把值从一种指针转换为另一种指针,或把指针储存在int中, 或其他让人讨厌的事情)
使用reinterpret_cast,唯一能保证的是,当你从结构转回为原类型时,你能得到相同的结果。
当然,reinterpret_cast也有一些转换无法进行。
他通常用于比较奇怪的转换,或bit操作,比图把raw数据流转换为实际数据,或把数据储存在对齐指针的低字节。
当其他转换无法使用时,可以尝试reinterpret_cast
5、C-style cast
C-style cast 是使用(type)object 或 type(object)的转换方式。
C-style cast 被定义为下列转换中第一个成功返回的:
const_cast
static_cast
static_cast, then const_cast
reinterpret_cast
reinterpret_cast, then const_cast
在一些时候,他可以被用来替代其他casts,但用于他最后可能会调用reinterpret_cast(应显示调用),因此C-style cast是十分危险的。
除非你能保证,不会调用reinterpret_cast,或者reinterpret_cast一定会失败,否则不要轻易使用。即使如此,也应该考虑显示调用上面的转换。
当使用static_cast时,C-style casts 也可以忽略权限控制,这意味着他可以进行其他cast无法进行的操作。
这是避免C-style casts的一个不错的理由。
(翻译自Stack Overflow的一个帖子,水平有限,哈哈)
参考资料:
http://stackoverflow.com/questions/332030/when-should-static-cast-dynamic-cast-and-reinterpret-cast-be-used
http://www.cplusplus.com/doc/tutorial/typecasting/
http://en.wikibooks.org/wiki/C%2B%2B_Programming/Programming_Languages/C%2B%2B/Code/Statements/Variables/Type_Casting
很久很久以前,用于统计公司工时的一个VBA脚本,只使用了一小段时间。
代码写的有些傻傻的,哈哈哈。
Sub Summary()
'统计行数
Dim TotalLine As Integer
TotalLine = 1
Dim i, j As Integer
i = 1
j = 1
Dim name As String
'清空上次统计信息
Sheet32.Range("A2:F301").ClearContents
'计算人名
name = Sheet1.Cells(2, 2)
name = Right(name, Len(name) - 3)
'遍历所有sheets
For i = 1 To 31
'每个sheets中有效行数
For j = 4 To 12
'判断一行是否为空
If (Worksheets(i).Cells(j, 1) = "" And Worksheets(i).Cells(j, 2) = "" And Worksheets(i).Cells(j, 3) = "" And Worksheets(i).Cells(j, 4) = "" And Worksheets(i).Cells(j, 5) = "") Then
'空行,不做处理
Else
'非空行,进行统计
TotalLine = TotalLine + 1
Sheet32.Cells(TotalLine, 1) = Worksheets(i).Cells(j, 4)
Sheet32.Cells(TotalLine, 2) = Worksheets(i).Cells(j, 5)
Sheet32.Cells(TotalLine, 3) = name
If (Worksheets(i).Cells(j, 2) = "/") Then
Sheet32.Cells(TotalLine, 4) = "0"
Else
Sheet32.Cells(TotalLine, 4) = Worksheets(i).Cells(j, 2)
End If
If (Worksheets(i).Cells(j, 3) = "/") Then
Sheet32.Cells(TotalLine, 5) = "0"
Else
Sheet32.Cells(TotalLine, 5) = Worksheets(i).Cells(j, 3)
End If
Sheet32.Cells(TotalLine, 6) = Sheet32.Cells(TotalLine, 4) + Sheet32.Cells(TotalLine, 5)
End If
Next j
Next i
'清空上次统计信息
Sheet33.Range("A2:F301").ClearContents
'任务行数
Dim TaskLine As Integer
TaskLine = 1
'本条记录是否添加
Dim bFind As Boolean
'效率低下的循环
For i = 2 To TotalLine
bFind = False
For j = 2 To TaskLine
If (Sheet32.Cells(i, 1) = Sheet33.Cells(j, 1) And Sheet32.Cells(i, 2) = Sheet33.Cells(j, 2)) Then
Sheet33.Cells(j, 4) = Sheet33.Cells(j, 4) + Sheet32.Cells(i, 4)
Sheet33.Cells(j, 5) = Sheet33.Cells(j, 5) + Sheet32.Cells(i, 5)
Sheet33.Cells(j, 6) = Sheet33.Cells(j, 6) + Sheet32.Cells(i, 6)
bFind = True
Exit For
End If
Next j
If (Not bFind) Then
TaskLine = TaskLine + 1
Sheet33.Cells(TaskLine, 1) = Sheet32.Cells(i, 1)
Sheet33.Cells(TaskLine, 2) = Sheet32.Cells(i, 2)
Sheet33.Cells(TaskLine, 3) = Sheet32.Cells(i, 3)
Sheet33.Cells(TaskLine, 4) = Sheet32.Cells(i, 4)
Sheet33.Cells(TaskLine, 5) = Sheet32.Cells(i, 5)
Sheet33.Cells(TaskLine, 6) = Sheet32.Cells(i, 6)
End If
Next i
MsgBox ("任务完成咯 :)")
End Sub
1、修改为UTF-8
chcp 65001
并在CMD属性中,将字体设置为Lucida Console
2、修改为ANSI
chcp 936
并在CMD属性中,将字体设置为Raster Fonts
在JDK6下运行Jboss4.x的web service时,会报下面的错误:
java.lang.UnsupportedOperationException: setProperty must be overridden by all subclasses of SOAPMessage
原因在于:
1、Jboss4.x是在JDK5下开发的
2、JDK6调整了SOAPMessage,setProperty要被强制重载
3、这样,在JDK6下运行Jboss4.x的程序,就会报上面的错误
解决方案:
强制使用JBoss endorsed目录下的lib
-Djava.endorsed.dirs=$JBOSS_HOME/lib/endorsed
大家都知道,
Linux发行版=Linux内核+包管理系统
当下,Linux的主要包管理系统分为两大阵营,RPM和DEB,
(其主要原因是,子发行版多沿用了父发行版的包管理系统)
但每种有特色的发行版,又都会开发自己独特的包管理系统。
主要Linux发行版的管理统系统计如下:
RPM:
RHEL;Fedora;CentOS;
openSUSE;SUSE Linux Enterprise;
PCLinuxOS;
Mageia;
Fuduntu;
Mandriva Linux;
Scientific Linux;
Oracle Linux;
DEB:
Debian;
Ubuntu;Kubuntu;Xubuntu;Ubuntu Studio;
Lubuntu;
Linux Mint;
Ultimate Edition;
Bodhi Linux;
Pinguy OS;
Zorin OS;
MEPIS Linux;
KNOPPIX;
BackTrack;
Pacman:
Arch Linux;
Chakra GNU/Linux;
Portage:
Gentoo
PET:
Puppy
TCE:
Tiny Core Linux
Entropy:
Sabayon Linux
TXZ:
Slackware Linux
TBZ:
FreeBSD;
DragonFly BSD;
TGZ:
OpenBSD
PBI/TGZ:
PC-BSD
IPS, pkgadm:
Oracle Solaris
pkgin:
MINIX