2009年3月31日星期二

TIF文件格式初探

一、前言

  因工作需要,本人经常接触一些图像方面的编程工作。目前图像领域中的格式很多且大部分官方说明都是英文文档,实在令人头疼,我想受此困扰的程序员朋友不在少数吧。这里本人不揣浅陋,写了一个将TIF格式转换成BMP格式图像的程序,供大家参考。请不吝赐教。
  注:TIF是可扩充标记的文件,所以理论上是不可能编写一个能识别所有类别TIF格式的读写程序,这里只是给大家提供一个思路, 将TIF图像转换成BMP图像后就可以使用Windows提供的API函数对其进行编辑并方便直观地显示出来,测试代码中包含 了一个用于测试的TIF图。本代码也只能针对这一种类别的TIF图进行操作,如何对其他类别的TIF图进行编码,读完本例子自然就能融会 贯通了。

二、TIF图像格式概览

TIF图由四个部分组成:
1、图像文件头(Image File Header简称IFH):


图一 IFH结构描述



  IFH数据结构包含3个成员共计8个字节,Byte order成员可能是“MM”(0x4d4d)或“II”(0x4949),0x4d4d表示该TIFF图是摩托罗拉整数格式 0x4949表示该图是Intel整数格式;Version成员总是包含十进制42(0x2a),它用于进一步校验该文件是否为TIF格式,42这个数并不是一般人 想象中的那样认为是tif软件的版本,实际上,42这个数大概永远不会变化;第三个成员是IFD(接下来要说的第二个数据结构)相对文件开始 处的偏移量。

2、图像文件目录(Image File Directory简称IFD):



图二 IFD及DE结构描述


  IFD是TIF图中最重要的数据结构,它包含了一个TIF文件中最重要的信息,一个TIF图可能有多个IFD,这说明文件中有多个图像,每个IFD标识1个图像的基本属性。 IFD结构中包含了三类成员,Directory Entry Count指出该结构里面有多少个目录入口;接下来就是N个线性排列的DE序列,数量不定(这就是 为什么称TIF格式文件为可扩充标记的文件,甚至用户可以添加自定义的标记属性),每个DE标识了图像的某一个属性;最后就是一个偏移量, 标识下一个文件目录相对于文件开始处的位置,当然,如果该TIF文件只包含了一幅图像,那么就只有一个IFD,显然,这个偏移量就等于0;

3、目录入口(Directory Entry简称DE):
  共12个字节,见图二。简单说,一个DE就是一幅图像的某一个属性。例如图像的大小、分辨率、是否压缩、像素的行列数、一个像素由几位 表示(1位代表黑白两色,8位代表256色等等)等。其中:tag成员是该属性的编号,在图像文件目录中,它是按照升序排列的。我们可以通过读 这些编号,然后到TIF格式官方白皮书中查找相应的含义。属性是用数据来表示的,那么type就是代表着该数据的类型,TIF官方指定的有5种数据类型。 type=1就是BYTE类型(8位无标记整数)、type=2是ASCII类型(7位ASCII码加1位二进制0)、type=3是SHORT类型(16位无标记整数)、type=4是LONG 类型(32位无标记整数)、type=5是RATIONAL类型(2个LONG,第一个是分子,第二个是分母)。length成员是数据的数量而不是数据类型的长度。 第4个成员valueOffset很重要,它是tag标识的属性代表的变量值相对文件开始处的偏移量。如果变量值占用的空间小于4个字节,那么该值就存放在 valueOffset中即可,没必要再另外指向一个地方了。

4、图像数据 本例提供的图像是基于256灰度级的,即一个字节代表一个像素点,它是0x00~0xff区间中256个灰度级的任意一个整数。通过使用UltraEdit工具观察, 我们发现该图像文件的组织形式是:IFH--数据--IFD。以下的示例说明遵循了这一观察结果。

三、实战

1、VC创建一个MFC AppWizard(exe)工程取名TiffTest,选择单文档程序。
2、添加TiffStruct.h文件,定义IFH和DE结构(参考前面的结构描述),用来接收读TIF文件的信息。

#ifndef _TIFFSTRUCT_
#define _TIFFSTRUCT_

typedef struct tagIMAGEFILEHEADER
{
WORD byteOrder;
WORD version;
DWORD offsetToIFD;
}IFH;

typedef struct tagDIRECTORYENTRY
{
WORD tag;
WORD type;
DWORD length;
DWORD valueOffset;
}DE;

#endif
3、在文档类中添加4个公有变量,并将其初始化为0。在TiffTestDoc.cpp中#include "TiffStruct.h"
DWORD m_dwBmSize; //图象的数据部分的大小
CPalette m_palDIB; //BMP图象调色板
HANDLE m_hDIB; //BMP图象内存块句柄
CSize m_sizeDoc; //图象的长和宽
4、在文档类的OnOpenDocument函数中定义局部工具变量并读文件
DWORD dwFileLength = 0;
CString strTemp = _T("");
WORD wDECount = 0;
BYTE* pDIB = NULL;
int i = 0;

IFH ifh;
ZeroMemory(&ifh, sizeof(IFH));

CFile file;
CFileException fe;

if(0 == file.Open(lpszPathName, CFile::modeRead | CFile::shareDenyWrite, &fe))
{
AfxMessageBox("打开文件失败");
return FALSE;
}
dwFileLength = file.GetLength();
读IFH文件头
if(sizeof(IFH) != file.Read(&ifh, sizeof(IFH)))
{
AfxMessageBox("读TIF文件头失败");
return FALSE;
}

if(0x2a != ifh.version)
{
AfxMessageBox("该文件不是TIF格式,读文件失败");
return FALSE;
}

if(0x4949 != ifh.byteOrder)
{
AfxMessageBox("该TIF文件不是IBMPC字节序,读文件失败");
return FALSE;
}

file.Seek(ifh.offsetToIFD, CFile::begin);//将文件指针定位到IFD
读文件有多少个目录入口
if(2 != file.Read(&wDECount, 2))
{
AfxMessageBox("无法获得TIF文件目录入口数量");
return FALSE;
}
strTemp.Format("该TIF文件有%d个目录入口", wDECount);
AfxMessageBox(strTemp);
创建DE数组,接收信息,数组中有wDECount个元素
DE* pde = new DE[wDECount];
DE* pTemp = pde;
memset(pde, 0, sizeof(DE)*wDECount);
if(sizeof(DE)*wDECount != file.ReadHuge(pde, sizeof(DE)*wDECount))
{
AfxMessageBox("读图象文件目录失败");
delete []pde;
return FALSE;
}
显示图像文件目录信息
for(i=0; itag, i, pTemp->type, i, pTemp->length, i, pTemp->valueOffset);
AfxMessageBox(strTemp);
}
把图像的大小和图像数据的容量保存到成员变量中
for(i=0; i<wDECount; i++)
{
pTemp = pde + i;
if(256 == pTemp->tag) //tag为256的目录入口中的变量标识了图象宽度
{
m_sizeDoc.cx = pTemp->valueOffset;
}
if(257 == pTemp->tag) //图象高度
{
m_sizeDoc.cy = pTemp->valueOffset;
}
if(273 == pTemp->tag) //计算图象数据占用字节数
{
//m_dwBmSize = pTemp->valueOffset - sizeof(IFH);
//或者把tag=256的valueOffset乘以tag=257的valueOffset
m_dwBmSize = m_sizeDoc.cx * m_sizeDoc.cy;
}
}
在文档类中创建一个成员工具函数CreateBmpBuffer,申请全局内存块以存放BMP文件结构数据
BOOL CTiffTestDoc::CreateBmpBuffer()
{
//申请BMP内存块
m_hDIB = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT,
sizeof(BITMAPFILEHEADER) +
sizeof(BITMAPINFOHEADER) +
256*sizeof(RGBQUAD) +
m_dwBmSize);
if(NULL == m_hDIB)
{
AfxMessageBox("申请BMP内存块失败");
return FALSE;
}
else
{
return TRUE;
}
}
回到OnOpenDocument成员函数中调用工具函数并获得全局内存块指针
//构造BMP图象内存块
if(!CreateBmpBuffer())
{
AfxMessageBox("构造BMP图象内存块失败");
delete []pde;
return FALSE;
}

//获得BMP内存块指针
pDIB = (BYTE*)GlobalLock(m_hDIB);
if(NULL == pDIB)
{
AfxMessageBox("获得BMP内存块指针失败");
GlobalUnlock(m_hDIB);
delete []pde;
return FALSE;
}
   以下是将图像信息填充到BMP内存块中,网上介绍BMP格式的文章很多,这里就不详述了。因测试图像数据表达的是0x00-0xff灰度,正好和BMP文件调色板索引值巧合。 故在代码中直接把图像数据信息当成索引即可,减少了编码复杂度。注:BMP文件中图像数据的第一行代表的是最终显示光栅的最后一行,所以在数据排列中要颠倒过来。
//构造BITMAPFILEHEADER并复制到BMP内存块
BITMAPFILEHEADER bmfHdr;
memset(&bmfHdr, 0, sizeof(BITMAPFILEHEADER));
bmfHdr.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) +
256*sizeof(RGBQUAD);
bmfHdr.bfReserved1 = 0;
bmfHdr.bfReserved2 = 0;
bmfHdr.bfSize = bmfHdr.bfOffBits + m_dwBmSize;
bmfHdr.bfType = 0x4d42;

memmove(pDIB, &bmfHdr, sizeof(BITMAPFILEHEADER));

//构造BITMAPINFOHEADER并复制到BMP内存块
BITMAPINFOHEADER bmiHdr;
memset(&bmiHdr, 0, sizeof(BITMAPINFOHEADER));
bmiHdr.biBitCount = 8;
bmiHdr.biClrImportant = 0;
bmiHdr.biClrUsed = 0;
bmiHdr.biCompression = 0;
bmiHdr.biHeight = m_sizeDoc.cy;
bmiHdr.biPlanes = 1;
bmiHdr.biSize = sizeof(BITMAPINFOHEADER);
bmiHdr.biSizeImage = 0;
bmiHdr.biWidth = m_sizeDoc.cx;
bmiHdr.biXPelsPerMeter = 2834;
bmiHdr.biYPelsPerMeter = 2834;

memmove((BITMAPFILEHEADER*)pDIB + 1, &bmiHdr, sizeof(BITMAPINFOHEADER));

//构造256个RGBQUAD并复制到BMP内存块
RGBQUAD* pRgbQuad = (RGBQUAD*)(pDIB + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER));
RGBQUAD* pOldQuad = pRgbQuad;
RGBQUAD rgbQuad;
memset(&rgbQuad, 0, sizeof(RGBQUAD));
for(i=0; i<256; i++)
{
rgbQuad.rgbBlue = i;
rgbQuad.rgbGreen = i;
rgbQuad.rgbRed = i;
rgbQuad.rgbReserved = 0;
pRgbQuad = pOldQuad + i;
memmove(pRgbQuad, &rgbQuad, sizeof(RGBQUAD));
}

//填充所有像素数据, 颠倒图象数据从最后一行开始读起
int j = 0;
for(i=m_sizeDoc.cy-1; i>=0; i--)
{
file.Seek(sizeof(IFH) + i*m_sizeDoc.cx, CFile::begin);
file.Read((BYTE*)(pRgbQuad + 1) + j*m_sizeDoc.cx, m_sizeDoc.cx);
j++;
}
初始化BMP调色板,为显示BMP文件做准备
//初始化专用调色板
BYTE buf[2+2+4*256];
LOGPALETTE* pPal = (LOGPALETTE*)buf;
pPal->palVersion = 0x300;
pPal->palNumEntries = 256;
for(i=0; i<255; i++)
{
pPal->palPalEntry[i].peBlue = i;
pPal->palPalEntry[i].peFlags = 0;
pPal->palPalEntry[i].peGreen = i;
pPal->palPalEntry[i].peRed = i;
}
m_palDIB.CreatePalette(pPal);
最后是OnOpenDocument成员函数返回前的清理工作
GlobalUnlock(m_hDIB);
delete []pde;
return TRUE;
  至此,TIF文件信息已转换为BMP图像并保存在全局内存块中了,接下来就可以在OnDraw中调用WinAPI函数StretchDIBits来显示它。
if(NULL == pDoc->m_hDIB)
{
return;
}
HDC hdc = pDC->m_hDC;
BYTE* pBuf = (BYTE*)GlobalLock(pDoc->m_hDIB);
pBuf += sizeof(BITMAPFILEHEADER);
BYTE* pData = pBuf + sizeof(BITMAPINFOHEADER) + 256*sizeof(RGBQUAD);

CPalette* pOldPal = pDC->SelectPalette(&pDoc->m_palDIB, TRUE);
pDC->RealizePalette();

::SetStretchBltMode(hdc, COLORONCOLOR);
::StretchDIBits(hdc, 10, 10, pDoc->m_sizeDoc.cx, pDoc->m_sizeDoc.cy,
0, 0, pDoc->m_sizeDoc.cx, pDoc->m_sizeDoc.cy, pData,
(BITMAPINFO*)pBuf, DIB_RGB_COLORS, SRCCOPY);

pDC->SelectPalette(pOldPal, FALSE);
GlobalUnlock(pDoc->m_hDIB);

最后别忘了在文档类析构函数~CTiffTestDoc中销毁全局内存块
if(NULL != m_hDIB)
{
GlobalFree(m_hDIB);
m_hDIB = NULL;
}
四、结束语
  测试用的TIF文件在工程目录下,文件名为SSS00.TIF。本人学习图形图像编程不久,文章难免挂一漏万,请高手指教。

Mac OS X Java虚拟机选项

Mac OS X的Java虚拟机除了具有标准的HotSpot虚拟机的选项之外,还支持很多非标准的选项(-X和-XX),本章列出了这些选项以及一些值得注意的例外事项。

请注意: 除非特别声明,否则在一个选项中指定的bytes(字节)都是作为参数。您也可以分别通过k或者m这两个字母来指定千个字节或者兆个字节(大小写都可以)。例如,下面的几种形式都是表示字节数:4194301,4096k,4096K,4m,和4M。
一般选项
-server
在Mac OS X中没有特别的服务器虚拟机(server VM)。在激活java的时候可以使用 -server 选项,但这并不是启动另外的虚拟机,它还是启动客户虚拟机(client VM),只是这个虚拟机针对服务器的使用环境进行了调优。这些调优包括:
在共享档案的生成过程中使用不同的类列表,这个列表中不包括GUI类(见“Mac OS X的Java共享档案”部分)。
增加Java堆的尺寸。
增加Eden代的内存空间的尺寸。
打开线程的本地Eden垃圾收集器(garbage collection)。

-X
显示一个非标准虚拟机选项的简要描述。
-Xbootclasspath:path
指定一个目录以及JAR和ZIP档案的列表,作为搜索启动类的范围。列表中各项之间的分隔符为冒号(:)。
-Xfuture
对类文件执行严格的格式检查。这个选项强制Java对是否遵守类文件规范做更加严格的检查,而缺省的检查只是基于Java 1.1.x的标准。您应该使用这个选项来对代码进行测试,以便确保这些代码在未来的Java版本中能够工作,这些未来的版本可能强制进行更为严格的类文件格式检查。
-Xprof
把运行程序详细的行为分析数据发送给标准输出。在产品级的代码中不能使用这个选项。
-Xrs
和-XX:+ReduceSignalUsage选项一样。
-XX:+ReduceSignalUsage
正常情况下,Java响应SIGHUP,SIGINT,和SIGTERM信号。如果指定了这个选项,则Java会忽略这些信号,您要根据具体的需要在本地代码中实现这些信号的处理函数,同时还要在System.exit()中实现相关的关闭例程。
-XX:ReservedCodeCacheSize=size in bytes
设置最大的代码缓存的大小,缺省情况下是32(32M)。
-XX:-PrintJavaStackAtFatalState
缺省情况下,当本地代码崩溃时,Java会产生回溯(backtraces)信息。如果您在Java的错误报告中看到了崩溃的信息,则可以把这个选项关闭。
Mac OS X 专用选项
-Xdock:name=applicationName
设定应用程序在Dock和菜单条上显示的名称。如果这个选项没有被设定,则缺省情况下Mac OS X会显示主类的全名。您只需要对那些从命令行或者JAR文件中启动的程序设定这个选项,那些可以双击的应用程序包则从Info.plist文件中读取正确的显示名。
-XX:+UseFileLocking
这个选项用来激活Carbon文件的锁定功能,缺省情况下关闭。如果您的Java应用程序和一些文件相互作用,而这些文件同时又受到一些Carbon应用程序的影响,则您需要使用这个选项,它可以避免应用程序修改那些正在被别的程序访问的文件。
堆的尺寸
-Xmssize in bytes
设定Java堆的初始尺寸,缺省尺寸是2097152 (2MB)。这个值必须是1024个字节(1KB)的倍数,且比它大。(-server选项把缺省尺寸增加到32M。)
-Xmnsize in bytes
为Eden对象设定初始Java堆的大小,缺省值为640K。(-server选项把缺省尺寸增加到2M。)
-Xmxsize in bytes
设定Java堆的最大尺寸,缺省值为64M,(-server选项把缺省尺寸增加到128M。) 最大的堆尺寸达到将近2GB(2048MB)。
请注意:很多垃圾收集器的选项依赖于堆大小的设定。请在微调垃圾收集器使用内存空间的方式之前,确认是否已经正确设定了堆的尺寸。
垃圾收集:内存的使用
-XX:MinHeapFreeRatio=percentage as a whole number
修改垃圾回收之后堆中可用内存的最小百分比,缺省值是40。如果垃圾回收后至少还有40%的堆内存没有被释放,则系统将增加堆的尺寸。
-XX:MaxHeapFreeRatio=percentage as a whole number
改变垃圾回收之后和堆内存缩小之前可用堆内存的最大百分比,缺省值为70。这意味着如果在垃圾回收之后还有大于70%的堆内存,则系统就会减少堆的尺寸。
-XX:NewSize=size in bytes
为已分配内存的对象中的Eden代设置缺省的内存尺寸。它的缺省值是640K。(-server选项把缺省尺寸增加到2M。)
-XX:MaxNewSize=size in bytes
允许您改变初期对象空间的上限,新建对象所需的内存就是从这个空间中分配来的,这个选项的缺省值是640K。(-server选项把缺省尺寸增加到2M。)
-XX:NewRatio=value
改变新旧空间的尺寸比例,这个比例的缺省值是8,意思是新空间的尺寸是旧空间的1/8。
-XX:SurvivorRatio=number
改变Eden对象空间和残存空间的尺寸比例,这个比例的缺省值是10,意思是Eden对象空间的尺寸比残存空间大survivorRatio+2倍。
-XX:TargetSurvivorRatio=percentage
设定您所期望的空间提取后被使用的残存空间的百分比,缺省值是50。
-XX:MaxPermSize=size in MB
长久代(permanent generation)的尺寸,缺省值为32(32MB)。
垃圾收集: 一般设定
-Xincgc
Mac OS X不支持这个选项,不支持这种训练式的垃圾收集器。
-Xnoclassgc
禁用类的垃圾收集。
-XX:+UseConcMarkSweepGC
激活标志和清除同时进行的垃圾收集活动,这个选项对多处理器的计算机有效。
-XX:+UseParallelGC
激活并行的垃圾收集活动,这个选项只对多处理器的计算机有效。
-XX:-DisableExplicitGC
忽略代码中对System.gc()的显式调用。虚拟机仍然按照正常的机制进行垃圾收集。这个选项禁止在代码中强制执行垃圾收集。
-XX:+PrintTenuringDistribution
打印初期代中已分配内存的对象占用内存时间的信息。
编译
-Xint
只在解释(interperated)模式下运行虚拟机。如果使用这个选项,系统将不编译任何字节码。
-XX:CompileThreshold=value
在编译开始前改变方法调用(程序分支)的数目,缺省值是1000。
-XX:-InlineUnreachableCalls
缺省情况下,虚拟机对所有可能的代码进行方法内联处理(method inlining),以方便编译器进行优化。对这个选项进行设定会使较少的代码按照内联方法被编译。这样,那些正常情况下不会运行的代码,如例外处理,就不会被处理为内联代码,而只能在运行时进行解释。设定这个选项可能会大大降低性能。
-XX:+CITime
显示有多少时间花在编译过的代码上。
-XX:+PrintCompilation
在Java的方法被编译时,打印其的跟踪信息。
Threading
-XX:NewSizeThreadIncrease=size in KB
允许您指定每个活动线程会增加多少初期对象空间。这个选项在调节由于线程增加而增加的分配率时可能会有用。它的缺省值为16(16 kilobytes)。
-XX:ThreadStackSize=size in KB
改变线程栈的大小。缺省情况下,线程栈的大小就是操作系统所使用的栈的缺省大小。
-XX:+UseTLAB
激活线程本地的分配缓冲区。 使用这个缓冲区将使线程任务繁重的应用程序的内存分配更加具有可扩展性,大大提高内存分配的性能。这个选项在多处理器的计算机和Mac OS X Server上缺省打开。
共享
-XX:+PrintSharedSpace
打开共享的冗长输出。
-XX:-UseSharedSpaces
关闭共享。

MyEclipse XXX

MyEclipse 7.0 安装包太大了,启动后什么都不干,内存350MB,虚拟内存300MB,天呀,让我想起了IBM的大家伙WSAD,那还是Eclipse 2.1的时代,IBM的大家伙安装后1G空间,启动后也是慢的要死。看来基于Java的IDE,吃内存这几乎是个通病。下面是XXX:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

// MyEclipse 7.0 keygen
public class MyEclipseGen {
  private static final String LL = "Decompiling this copyrighted software is a violation of both your license agreement and the Digital Millenium Copyright Act of 1998 (http://www.loc.gov/copyright/legislation/dmca.pdf). Under section 1204 of the DMCA, penalties range up to a $500,000 fine or up to five years imprisonment for a first offense. Think about it; pay for a license, avoid prosecution, and feel better about yourself.";

public String getSerial(String userId, String licenseNum) {
  java.util.Calendar cal = java.util.Calendar.getInstance();
  cal.add(1, 3);
  cal.add(6, -1);
  java.text.NumberFormat nf = new java.text.DecimalFormat("000");
  licenseNum = nf.format(Integer.valueOf(licenseNum));
  String verTime = new StringBuilder("-").append(
  new java.text.SimpleDateFormat("yyMMdd").format(cal.getTime())).append("0").toString();
  
  String type = "YE3MP-";
  String need = new StringBuilder(userId.substring(0, 1)).append(type)
.append("300").append(licenseNum).append(verTime).toString();

  String dx = new StringBuilder(need).append(LL).append(userId).toString();
  int suf = this.decode(dx);
  String code = new StringBuilder(need).append(String.valueOf(suf)).toString();

  return this.change(code);
}

private int decode(String s) {
  int i;
  char[] ac;
  int j;
  int k;
  i = 0;
  ac = s.toCharArray();
  j = 0;
  k = ac.length;
  while (j <>
     i = (31 * i) + ac[j]; j++; }
  
   return Math.abs(i); 
}

 private String change(String s) { 
  byte[] abyte0; 
  char[] ac; 
  int i; 
  int k; 
  int j; 
  abyte0 = s.getBytes(); 
  ac = new char[s.length()]; 
  i = 0; 
  k = abyte0.length; 
while (i <>
    j = abyte0[i]; 

    if ((j >= 48) && (j <= 57)) { 
      j = (((j - 48) + 5) % 10) + 48; 
    } else if ((j >= 65) && (j <= 90)) { 
      j = (((j - 65) + 13) % 26) + 65; 
    } else if ((j >= 97) && (j <= 122)) {
      j = (((j - 97) + 13) % 26) + 97;
    }

    ac[i] = (char) j;
    i++;
  }
  
  return String.valueOf(ac);
}

public MyEclipseGen() {
  super();
}

public static void main(String[] args) {
  try {
    System.out.println("please input register name:");
    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

    String userId = null;
    userId = reader.readLine();
    MyEclipseGen myeclipsegen = new MyEclipseGen();
    String res = myeclipsegen.getSerial(userId, "5");
    System.out.println("Serial:" + res);
    reader.readLine();
  } catch (IOException ex) {
  }
}
}

2009年3月26日星期四

Linux下常用网络端口

1 tcpmux TCP 端口服务多路复用
5 rje 远程作业入口
7 echo Echo 服务
9 discard 用于连接测试的空服务
11 systat 用于列举连接了的端口的系统状态
13 daytime 给请求主机发送日期和时间
17 qotd 给连接了的主机发送每日格言
18 msp 消息发送协议
19 chargen 字符生成服务;发送无止境的字符流
20 ftp-data FTP 数据端口
21 ftp 文件传输协议(FTP)端口;有时被文件服务协议(FSP)使用
22 ssh 安全 Shell(SSH)服务
23 telnet Telnet 服务
25 smtp 简单邮件传输协议(SMTP)
37 time 时间协议
39 rlp 资源定位协议
42 nameserver 互联网名称服务
43 nicname WHOIS 目录服务
49 tacacs 用于基于 TCP/IP 验证和访问的终端访问控制器访问控制系统
50 re-mail-ck 远程邮件检查协议
53 domain 域名服务(如 BIND)
63 whois++ WHOIS++,被扩展了的 WHOIS 服务
67 bootps 引导协议(BOOTP)服务;还被动态主机配置协议(DHCP)服务使用
68 bootpc Bootstrap(BOOTP)客户;还被动态主机配置协议(DHCP)客户使用
69 tftp 小文件传输协议(TFTP)
70 gopher Gopher 互联网文档搜寻和检索
71 netrjs-1 远程作业服务
72 netrjs-2 远程作业服务
73 netrjs-3 远程作业服务
73 netrjs-4 远程作业服务
79 finger 用于用户联系信息的 Finger 服务
80 http 用于万维网(WWW)服务的超文本传输协议(HTTP)
88 kerberos Kerberos 网络验证系统
95 supdup Telnet 协议扩展
101 hostname SRI-NIC 机器上的主机名服务
102 iso-tsap ISO 开发环境(ISODE)网络应用
105 csnet-ns 邮箱名称服务器;也被 CSO 名称服务器使用
107 rtelnet 远程 Telnet
109 pop2 邮局协议版本2
110 pop3 邮局协议版本3
111 sunrpc 用于远程命令执行的远程过程调用(RPC)协议,被网络文件系统(NFS)使用
113 auth 验证和身份识别协议
115 sftp 安全文件传输协议(SFTP)服务
117 uucp-path Unix 到 Unix 复制协议(UUCP)路径服务
119 nntp 用于 USENET 讨论系统的网络新闻传输协议(NNTP)
123 ntp 网络时间协议(NTP)
137 netbios-ns 在红帽企业 Linux 中被 Samba 使用的 NETBIOS 名称服务
138 netbios-dgm 在红帽企业 Linux 中被 Samba 使用的 NETBIOS 数据报服务
139 netbios-ssn 在红帽企业 Linux 中被 Samba 使用的NET BIOS 会话服务
143 imap 互联网消息存取协议(IMAP)
161 snmp 简单网络管理协议(SNMP)
162 snmptrap SNMP 的陷阱
163 cmip-man 通用管理信息协议(CMIP)
164 cmip-agent 通用管理信息协议(CMIP)
174 mailq MAILQ
177 xdmcp X 显示管理器控制协议
178 nextstep NeXTStep 窗口服务器
179 bgp 边界网络协议
191 prospero Cliffod Neuman 的 Prospero 服务
194 irc 互联网中继聊天(IRC)
199 smux SNMP UNIX 多路复用
201 at-rtmp AppleTalk 选路
202 at-nbp AppleTalk 名称绑定
204 at-echo AppleTalk echo 服务
206 at-zis AppleTalk 区块信息
209 qmtp 快速邮件传输协议(QMTP)
210 z39.50 NISO Z39.50 数据库
213 ipx 互联网络分组交换协议(IPX),被 Novell Netware 环境常用的数据报协议
220 imap3 互联网消息存取协议版本3
245 link LINK
347 fatserv Fatmen 服务器
363 rsvp_tunnel RSVP 隧道
369 rpc2portmap Coda 文件系统端口映射器
370 codaauth2 Coda 文件系统验证服务
372 ulistproc UNIX Listserv
389 ldap 轻型目录存取协议(LDAP)
427 svrloc 服务位置协议(SLP)
434 mobileip-agent 可移互联网协议(IP)代理
435 mobilip-mn 可移互联网协议(IP)管理器
443 https 安全超文本传输协议(HTTP)
444 snpp 小型网络分页协议
445 microsoft-ds 通过 TCP/IP 的服务器消息块(SMB)
464 kpasswd Kerberos 口令和钥匙改换服务
468 photuris Photuris 会话钥匙管理协议
487 saft 简单不对称文件传输(SAFT)协议
488 gss-http 用于 HTTP 的通用安全服务(GSS)
496 pim-rp-disc 用于协议独立的多址传播(PIM)服务的会合点发现(RP-DISC)
500 isakmp 互联网安全关联和钥匙管理协议(ISAKMP)
535 iiop 互联网内部对象请求代理协议(IIOP)
538 gdomap GNUstep 分布式对象映射器(GDOMAP)
546 dhcpv6-client 动态主机配置协议(DHCP)版本6客户
547 dhcpv6-server 动态主机配置协议(DHCP)版本6服务
554 rtsp 实时流播协议(RTSP)
563 nntps 通过安全套接字层的网络新闻传输协议(NNTPS)
565 whoami whoami
587 submission 邮件消息提交代理(MSA)
610 npmp-local 网络外设管理协议(NPMP)本地 / 分布式排队系统(DQS)
611 npmp-gui 网络外设管理协议(NPMP)GUI / 分布式排队系统(DQS)
612 hmmp-ind HMMP 指示 / DQS
631 ipp 互联网打印协议(IPP)
636 ldaps 通过安全套接字层的轻型目录访问协议(LDAPS)
674 acap 应用程序配置存取协议(ACAP)
694 ha-cluster 用于带有高可用性的群集的心跳服务
749 kerberos-adm Kerberos 版本5(v5)的“kadmin”数据库管理
750 kerberos-iv Kerberos 版本4(v4)服务
765 webster 网络词典
767 phonebook 网络电话簿
873 rsync rsync 文件传输服务
992 telnets 通过安全套接字层的 Telnet(TelnetS)
993 imaps 通过安全套接字层的互联网消息存取协议(IMAPS)
994 ircs 通过安全套接字层的互联网中继聊天(IRCS)
995 pop3s 通过安全套接字层的邮局协议版本3(POPS3)

UNIX 特有的端口
512/tcp exec 用于对远程执行的进程进行验证
512/udp biff [comsat] 异步邮件客户(biff)和服务(comsat)
513/tcp login 远程登录(rlogin)
513/udp who [whod] 登录的用户列表
514/tcp shell [cmd] 不必登录的远程 shell(rshell)和远程复制(rcp)
514/udp syslog UNIX 系统日志服务
515 printer [spooler] 打印机(lpr)假脱机
517/udp talk 远程对话服务和客户
518/udp ntalk 网络交谈(ntalk),远程对话服务和客户
519 utime [unixtime] UNIX 时间协议(utime)
520/tcp efs 扩展文件名服务器(EFS)
520/udp router [route, routed] 选路信息协议(RIP)
521 ripng 用于互联网协议版本6(IPv6)的选路信息协议
525 timed [timeserver] 时间守护进程(timed)
526/tcp tempo [newdate] Tempo
530/tcp courier [rpc] Courier 远程过程调用(RPC)协议
531/tcp conference [chat] 互联网中继聊天
532 netnews Netnews
533/udp netwall 用于紧急广播的 Netwall
540/tcp uucp [uucpd] Unix 到 Unix 复制服务
543/tcp klogin Kerberos 版本5(v5)远程登录
544/tcp kshell Kerberos 版本5(v5)远程 shell
548 afpovertcp 通过传输控制协议(TCP)的 Appletalk 文件编制协议(AFP)
556 remotefs [rfs_server, rfs] Brunhoff 的远程文件系统(RFS)

2009年3月25日星期三

这一天终于要来了⋯⋯

支付宝将发布Mac平台Safari安全控件

支付宝经过内部数次技术方案的评估,以及与 Apple 公司的技术沟通,最终支付宝将单独发行一个Mac平台上的Safari安全控件。

该控件定于4月1日(对,是在愚人节,但今天不是愚人节)正式发布。对于 Windows 平台的 Safari 浏览器,我们将在晚些时候发布对应的安全控件支持。事实上,控件本身已经研发完毕,但因为该版本 Safari 浏览器有一个网络连接特性比较特殊,需要支付宝改动官方网站的部分配置,故计划单独发布。

这将是在支持 Firefox 和 Google Chrome 之后走出的又一步,”罗马不是一天建成的”,敬请期待。

CentOS 5综合服务器安装详记(4)再战Oracle

一.安装centos 5.0
一定要安装图形界面,最好不要启动selinux

二.准备安装的软件:(这个很重要,第一次安装失败就是因为软件包没有打全)
binutils
compat-libstdc++
elfutils-libelf
elfutils-libelf-devel
glibc
glibc-common
glibc-devel
gcc
gcc-c++
libaio
libaio-devel
libgcc
libstdc++
libstdc++-devel
make
sysstat
unixODBC
unixODBC-devel

这些软件直接从安装光盘上找就可以(名字后面的版本没写全,用CENTOS5光盘的就可以正常安装)

三.建立用户和组
/usr/sbin/groupadd oinstall
/usr/sbin/groupadd dba
/usr/sbin/useradd -g oinstall -G dba oracle
passwd oracle


四.建立目录和权限
mkdir /oracle
mkdir /oracle/10g
chown -R oracle:oinstall /oracle


五.编辑变量
1.
# vi /etc/sysctl.conf
kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
net.ipv4.ip_local_port_range = 1024 65000
net.core.rmem_default=4194304
net.core.rmem_max=4194304
net.core.wmem_default=262144
net.core.wmem_max=262144


2.
# vi /etc/security/limits.conf
oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536


3.
# vi /etc/pam.d/login
session required /lib/security/pam_limits.so
session required pam_limits.so


4.
# vi /etc/profile
if [ $USER = "oracle" ]; then
if [ $SHELL = "/bin/ksh" ]; then
ulimit -p 16384
ulimit -n 65536
else
ulimit -u 16384 -n 65536
fi
fi

5.
# cd /home/oracle
# vi .bash_profile
ORACLE_BASE=/oracle
ORACLE_HOME=$ORACLE_BASE/10g
ORACLE_SID=wilson
PATH=$ORACLE_HOME/bin:$PATH

export ORACLE_BASE ORACLE_HOME ORACLE_SID PATH


6.安装libXp
# yum -y install libXp


7.
# vi /etc/redhat-release
将CentOS release 5 (Final) 修改成redhat 4

六.用oracle用户进入linux
进入终端
sh /ORACLE的目录/runInstaller
正常安装就可以,关于权限的错误可以忽略

七.安装后运行
由于安装后ORACLE不可以自动启动,需要手动启动ORACLE,方法有2种。

1.手动启动
su - oracle
export ORACLE_HOME=/oracle安装目录
export ORACLE_SID=sid名字
sqlpuls /nolog
出现
sql> conn sys/密码 as sysdba
sql> startup
sql> exit

cd /oracle目录/bin
./lsnrctl start
应该不会报错了,这下ORACLE就应该完全启动起来了。


2.自动启动,有时候会出问题,不知道怎么回事
第2种需要添加脚本
cd /etc/init.d/
touch oracle
vi oracle
写入:
#!/bin/bash
#
# chkconfig: 2345 80 05
# description: Oracle 10g Server
# /etc/init.d/dbora
#
# Run-level Startup script for the Oracle Instance, Listener, and
# Web Interface

export ORACLE_BASE=/oracle
export ORACLE_HOME=$ORACLE_BASE/10g
export ORACLE_SID=resume
export PATH=$PATHORACLE_HOME/bin

ORA_OWNR="oracle"

# if the executables do not exist -- display error

if [ ! -f $ORACLE_HOME/bin/dbstart -o ! -d $ORACLE_HOME ]
then
echo "Oracle startup: cannot start"
exit 1
fi
# depending on parameter -- startup, shutdown, restart
# of the instance and listener or usage display

case "$1" in
start)
# Oracle listener and instance startup
echo -n "Starting Oracle: "
# su $ORA_OWNR -c "$ORACLE_HOME/bin/lsnrctl start"
su $ORA_OWNR -c $ORACLE_HOME/bin/dbstart
touch /var/lock/oracle

su $ORA_OWNR -c "$ORACLE_HOME/bin/emctl start dbconsole"
echo "OK"
;;
stop)
# Oracle listener and instance shutdown
echo -n "Shutdown Oracle: "
# su $ORA_OWNR -c "$ORACLE_HOME/bin/lsnrctl stop"
su $ORA_OWNR -c $ORACLE_HOME/bin/dbshut
rm -f /var/lock/oracle

su $ORA_OWNR -c "$ORACLE_HOME/bin/emctl stop dbconsole"
echo "OK"
;;
reload|restart)
$0 stop
$0 start
;;
*)
echo "Usage: `basename $0` start|stop|restart|reload"
exit 1
esac
exit 0

保存退出

直接运行service oracle start就可以了

2009年3月24日星期二

2009年3月23日星期一

常用200Javascript技巧(1)









例:
点击时文字消失,失去焦点时文字再出现

CentOS 下home目录的重新挂载

1.cp -a /home/* /media/disk
2.修改/etc/fstab,增加下面内容。
/dev/sda5 /home ext3 defaults 0 2
3.重启
一切正常的话,用root登录,umount /home,删除/home(umount后为原/home)下的所有文件,保留/home目录为挂载点。再mount /home即可。

CentOS 5综合服务器安装详记(4)引言

以下为网上最流行的CentOS5下安装Oracle数据库的详情的版本,可是这个记录真的很烂⋯⋯我没查到任何人使用这个流程安装成功的,大家不过是你抄我来,我抄它而已⋯⋯


centos5.0安装oracle 10g步骤

最近测试了一下在centos5上安装oracle10g的试验,查了很多的资料,才搞定.现在把我实践的步骤给贴出来,给大家分享:
Centos5安装Oracle database 10g:
1. 安装centos5;
2. 下载oracle的安装程序:文件名10201_database_linux32.zip;
3. unzip 10201_database_linux32.zip解压;
4. 编辑/etc/sysctl.conf文件,加上如下的行:
kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
# semaphores: semmsl, semmns, semopm, semmni
kernel.sem = 250 32000 100 128
fs.file-max = 65536
net.ipv4.ip_local_port_range = 1024 65000
net.core.rmem_default=262144
net.core.rmem_max=262144
不说别的,官方数据资料就和这个大相径庭⋯⋯
net.core.wmem_default=262144
net.core.wmem_max=262144
5.运行下列命令,让修改的参数生效:
/sbin/sysctl -p
6.编辑/etc/security/limits.conf文件:
soft nproc 2047
hard nproc 16384
soft nofile 1024
hard nofile 65536
7.安装如下的包,在第一 二 三张光盘中
rpm -Uvh setarch-2*
rpm -Uvh make-3*
rpm -Uvh glibc-2*
rpm -Uvh libaio-0*
rpm -Uvh compat-libstdc++-33-3*
rpm -Uvh compat-gcc-34-3*
rpm -Uvh compat-gcc-34-c++-3*
rpm -Uvh gcc-4*
rpm -Uvh libXp-1*
rpm -Uvh openmotif-2*
rpm -Uvh compat-db-4*
8.创建用户和组:
groupadd oinstall
groupadd dba
useradd oracle –g oinstall –G dba
mkdir /oracle
mkdir /oracle/10g
chown oracle –R /oracle
9.修改/etc/redhat-release文件中的内容,把原来的内容改成如下:
CentOS release 5 (Final)修改前;CentOS release 4.5 (Final)修改后。
10.修改~/.bash_profile文件,内容如下:
export ORACLE_BASE=/oracle
export ORACLE_HOME=$ORACLE_BASE/10G
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib:/lib/usr/lib
export PATH=$PATH:$ORACLE_HOME/bin:$HOME/bin
11.最后安装:
/runInstaller进行安装
12.完成后修改/etc/redhat-release文件,改成如下内容:
CentOS release 5 (Final)
13.修改/etc/oratab文件,内容如下:
TSH1:/oracle/10g:Y
搞定OK!

2009年3月22日星期日

CentOS 5综合服务器安装详记(3)

今天极端失败⋯⋯

现在局面这么不好,我却在和丫头玩的时候扭伤了胳膊,脱臼,全治要一个月⋯⋯

CentOS下aMule还是乱码,我想和我的系统有关。因为我用英文的系统,但是想在程序中完美支持中文,不是不可能,现在的方法不对。

下面的方法在网上抄来的,聊胜于无:

vi /etc/sysconfig/i18n

LANG="zh_CN.GB18030"
LANGUAGE="zh_CN.GB18030:zh_CN.GB2312:zh_CN"
SUPPORTED="zh_CN.GB18030:zh_CN:zh"
SYSFONT="lat0-sun16" 
这个lato很奇怪,我的系统默认是"latarcyrheb-sun16"
SYSFONTTACH="8859-15"


没做深入研究,不是很懂⋯⋯
但是很明显的,这个设置不符合我的要求⋯⋯

2009年3月21日星期六

CentOS 5综合服务器安装详记(2)

我计划的是要先让服务器支持web服务,因此必须使用vsftpd。
控制台里输入:
yum -y install vsftpd
(呵呵,再次犯懒⋯⋯)
[root@gxlcs vsftpd-2.1.0]# yum -y install vsftpd
Loading "fastestmirror" plugin
Loading mirror speeds from cached hostfile
* base: ftp.jaist.ac.jp
* updates: ftp.jaist.ac.jp
* addons: ftp.jaist.ac.jp
* extras: ftp.jaist.ac.jp
Setting up Install Process
Parsing package install arguments
Resolving Dependencies
--> Running transaction check
---> Package vsftpd.x86_64 0:2.0.5-12.el5 set to be updated
filelists.xml.gz 100% |=========================| 3.4 MB 00:01
filelists.xml.gz 100% |=========================| 2.7 MB 00:01
filelists.xml.gz 100% |=========================| 148 kB 00:00
filelists.xml.gz 100% |=========================| 150 B 00:00
--> Finished Dependency Resolution

Dependencies Resolved

=============================================================================
Package Arch Version Repository Size
=============================================================================
Installing:
vsftpd x86_64 2.0.5-12.el5 base 136 k

Transaction Summary
=============================================================================
Install 1 Package(s)
Update 0 Package(s)
Remove 0 Package(s)

Total download size: 136 k
Downloading Packages:
(1/1): vsftpd-2.0.5-12.el 100% |=========================| 136 kB 00:00
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
Installing: vsftpd ######################### [1/1]

Installed: vsftpd.x86_64 0:2.0.5-12.el5
Complete!
列出上面一长串代码,不管怎么说,这就安装好了,而且还是系统管理的,尽管最新版是2.2.1,我装的是2.0.5⋯⋯

CentOS 5综合服务器安装详记(1)

昨天夜里决定重新制作服务器(这也是生活的一部分),原因是因为觉得fedora在网络服务方面管理不够强大(其实是因为selinux的误操作,发现更改该设置简直是忒复杂了),决定换回原来的CentOS 5。

操作系统方面继续使用x86_64位系统,从网上下载CentOS(网站明显不如fedora的漂亮和实用,毕竟人家是做个人桌面的),然后mount刻到光盘,光盘本地安装。package基本上是默认,语言栏去掉其他不用的,加入Chinese,Japanese,French(不是说偶会说法语,只是一时兴起)⋯⋯web服务里加入tomcat5的3个package,和php的。偶懒,除了万不得已的时候,是不肯去编译源代码的⋯⋯

然后一路OK,设置什么的偶就不详说了,大家都很清楚,或者等有时间的时候,偶重新讲安装。

对于我来讲,一个很重大的失误就是错误地估计了linux的兼容性。挂载home分区的时候,我没有选择格式化,但是很明显地,fedora下的home目录并不能被CentOS利用,当我启动系统的时候,很惊讶地发现文件没了,取而代之的是一个干干净净的home分区⋯⋯靠

第一,我要加入amule服务。这是服务器的一个重要功能,我的业余生活全靠她。amule是从rpm.pbone.net上download的。amule的rpm没有CentOS5版本,fedora和RedHat的64位版本都可以用。我选了RedHat EL5的64位版本。安装时,好大一堆关联错误⋯⋯郁闷,一个一个来吧,好在pbone上都有。根据我的系统构成,最终需要的是:
wxGTK-2.8.4-6.el5.kb.x86_64.rpm
cryptopp-5.5.2-1.el5.rf.x86_64.rpm
libupnp-1.6.6-1.el5.rf.x86_64.rpm
按顺序安装,最后下载amule-2.2.2-1.el5.rf.x86_64.rpm。源码最新版是2.4.6,但是对应64位的rpm只有这个,安装时会有未认证安全警告(fedora,centos,linux都有,怀疑是不是linux系的操作系统都存在这个认证警告),无视,然后顺利安装。在菜单栏里Application-internet会有amule的选项,安装成功。我用的是英文,第一次是无法正确显示汉字的,变更顶部图标的preference的语言选项,重新启动amule就OK了。

2009年3月20日星期五

Linux下oracle常见安装错误总结

先声明,以下内容并不适用于Fedora x86_64位系统,只是作为参考,存放在这里⋯⋯

错误一:

/tmp/OraInstall2007-12-30_02-16-11PM/jre/1.4.2/lib/i386/libawt.so: libXp.so.6: cannot open shared object file: No such file or directory occurred..

原因是:缺少支持打印的图形化动态链接库libXp.so.6
(用yum install libXp可以在fedora下直接安装,可惜是64位版,fedora64位下,32位版和64位版source并不能共存⋯⋯

这个错误是由于缺少系统安装包,在RHEL5以前的版本,可以安装xorg-x11-deprecated-libs包即可,这个安装包可以在系统光盘第三张盘中找到(对于redhat as4.2以前,redhat as4.4是在第四张安装光盘)

我下载的文件如下:

xorg-x11-deprecated-libs-6.8.2-31.i386.rpm

错误二:

Exception :java.lang.UnsatisfiedLinkError:/usr/java/j2sdk1.4.2_06/jre/lib/i386/libawt.so: libXt.so.6: cannot open shared object file: No such file or directory
这个错误是也是由于缺少系统安装包造成的,只需安装XFree86-libs包即可,这个安装包可以在系统光盘中找到。

在上面两个错误如果出现在redhat as5版本中,解决如下:

在RHEL5中上面的包被libXp所取代了,因此rpm -ivh libXp-1.0.0-8.i386.rpm将包打上后问题即可解决。
(在pbone我没能找到该文件对应fedora 10的rpm包,因此最终决定放弃Oracle10g,全面投向Oracle11g的怀抱)

错误三:

error while loading shared libraries: libstdc++-libc6.1-1.so.2

只用执行如下操作 ln -s libstdc++-libc6.2-2.so.3 libstdc++-libc6.1-1.so.2

参考案例

案例一:

在RHEL5上测试安装oracle10g,本以为之前转过11g,这次会比较顺利,结果还是遇到两个问题。

首先,在执行runInstaller时,系统报错:

You do not have sufficient permissions to access the inventory '/oracle11g/oraInventory'. Installation cannot continue. Make sure that you have read/write permissions to the inventory directory and restart the installer.: Permission denied

这里采用的是新建一个10g用户的方法让10g,11g并存,实际上在启动安装程序的时候,oracle会去找/etc/oraInst.loc和oratab这两个文件(hp是/var/opt/oracle)

而在oraInst.loc里面定义了inventory_loc的位置和inst_group,由于之前装过了一个11g,里面的定义都是针对11g用户设置的,所以才会报错。解决办法是执行runInstaller -invPtrLoc /oracle10g/oraInst.loc 命令就可以绕过去了,oracle会创建一个新的loc文件。

上一步成功通过之后,紧接着报了下面的错:

Exception java.lang.UnsatisfiedLinkError: /tmp/OraInstall2007-08-30_02-16-11PM/jre/1.4.2/lib/i386/libawt.so: libXp.so.6: cannot open shared object file: No such file or directory occurred..
java.lang.UnsatisfiedLinkError: /tmp/OraInstall2007-08-30_02-16-11PM/jre/1.4.2/lib/i386/libawt.so: libXp.so.6: cannot open shared object file: No such file or directory

在RHEL5以前这个错误是因为缺少XFree86-libs或xorg-x11-deprecated-libs这两个包其中一个(版本不同包不同),而在RHEL5中前面的包被libXp所取代了,因此rpm -ivh libXp-1.0.0-8.i386.rpm将包打上后问题解决。之后一切顺利。



案例二:

参考 http://moto.debian.org.tw/viewtopic.php?t=8055&sid=eb2524337903c5af7ce1e839e0a35b68
进行前期的安装准备
在开始安装时出现以下错误:

对于error while loading shared libraries: libstdc++-libc6.1-1.so.2
我的解决办法是
ln -s libstdc++-libc6.2-2.so.3 libstdc++-libc6.1-1.so.2
对于
Exception :java.lang.UnsatisfiedLinkError:/usr/java/j2sdk1.4.2_06/jre/lib/i386/libawt.so: libXp.so.6: cannot open shared object file: No such file or directory
的解决办法是
apt-get install libXp.so.6
apt-get install libXt.so.6
apt-get install libxtst6



案例三:

在RH Linux7.3上使用JasperReport作为报表引擎时,碰到了一样的问题:
Exception :java.lang.UnsatisfiedLinkError:/usr/java/j2sdk1.4.2_06/jre/lib/i386/libawt.so: libXt.so.6: cannot open shared object file: No such file or directory

在各位前面回复的提示下,经过一上午的google,终于得以解决这个问题
原因是:缺少支持打印的图形化动态链接库libXp.so.6(也许还有相关的其他库)
解决办法:下载并安装XFree86-libs-4.2.0-8.i386.rpm,/usr/X11R6/lib下就会出现需要的libXp.so.6.2

附上XFree86-libs-4.2.0-8.i386.rpm的一个下载地址:
ftp://ftp.nluug.nl/vol/1/schoollan/os/linux/RPMS/XFree86-libs-4.2.0-8.i386.rpm

Fedora10安装ORACLE数据库

 昨天为了继续学习ORACLE数据库而准备在我的fedora10上安装Oracle10g数据库(谁叫俺拿的是10g的BRONZE呢),参考了很多网上的资料,纯扯淡⋯⋯多数是用spider什么的抄来抄去的,大家都一样⋯⋯最狠的就是原封不动翻译英文的,原封不动发出来的⋯⋯

 但是偶得出个结论就是fedora并不适合安装oracle数据库(事实上结果也是这样,尽管没有测试,但是感觉上fedora下oracle比在同一台机器上安装CentOS的oracle慢多了⋯⋯)

 在这里我不想就细节过多说明,Oracle的文档说的比谁都详细。我只想说,想在Fedora10上装Oracle10g的,如果不能很顺利地完成安装的话(甚至都不能编译,和我一样),你可以试试Oracle11g。我想你会明白什么叫Lucky⋯⋯

 至于设置什么的,我会做个wiki来详细说明的。敬请期待。

2009年3月19日星期四

Linux下完全卸载ORACLE 10G的方法

1. 运行 $ORACLE_HOME/bin/localconfig delete
2. rm -rf $ORACLE_BASE/*
3. rm -f /etc/oraInst.loc /etc/oratab
4. rm -rf /etc/oracle
5. rm -f /etc/inittab.cssd
6. rm -f /usr/local/bin/coraenv /usr/local/bin/dbhome /usr/local/bin/oraenv
7. 删除oracle用户和组。

此方法同样适用与AIX系统,已经测试,其他平台没有验证过。

Linux下使用grub.conf清除grub密码

[root@localhost grub]# cat grub.conf   //显示grub.conf内容
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You do not have a /boot partition. This means that
# all kernel and initrd paths are relative to /, eg.
# root (hd0,0)
# kernel /boot/vmlinuz-version ro root=/dev/sda1
# initrd /boot/initrd-version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
hiddenmenu
title Fedora Core (2.6.15-1.2054_FC5)
root (hd0,0)
kernel /boot/vmlinuz-2.6.15-1.2054_FC5 ro root=LABEL=/1 rhgb quiet
initrd /boot/initrd-2.6.15-1.2054_FC5.img
title windows
rootnoverify (hd0,3)
chainloader +1

删除上文中任何关于password的记录(一般只有一条),该conf文件一般位于/etc/grub/下,或者直接位于/etc/下

Linux下编译PHP时遇到的安装libmcrypt库的问题

Linux下编译PHP时遇到的安装libmcrypt库的问题

./configure –prefix=/usr/local/php-5.2.3 –enable-module=so –with-mysql=/usr/local/mysql-5.1.20 –with-apxs2=/usr/local/apache-2.2.4/bin/apxs –enable-mbstring –with-mcrypt

通过以上命令配置PHP时,遇到错误,总说找不到libmcrypt。由于这服务器是个裸机,很多必须的库都没装,必须一个一个的手动安装,可libmcrypt这个库我的确装过了。重试n遍,无解。在网上找了半天,终于在phpbuilder.com的一个maillist里发现一个哥们儿遇到的问题跟我差不多,按照他的方法做了一下,居然解决了。原文在这:http://www.phpbuilder.com/lists/php-install/2004032/0090.php

做为一个懒人,我就不逐句翻译了,摘抄解决办法如下:

——————————-
the solution
——————————-
Then I visited
http://mcrypt.hellug.gr/mcrypt/index.html
an learned that I have to install not only libmcrypt
but also mcrypt and libmhash.

Here is the to do:

libmcrytp:
———–
download libmcrypt-xxx.tar.gz
create the following directory: / usr / local / libmcrypt
copy the libmcrypt-xxx.tar.gz into that directory and move to it
run the following shell (>) commands: (’xxx’ is the version number)
> gunzip -c libmcrypt-xxx.tar.gz | tar xf -
> cd libmcrypt-xxx
> ./configure –disable-posix-threads
> make
> make check (note: ‘make check’ is optional)
> make install
then (update your environment) add in / etc / profile the following path:
/usr/local/libmcrypt/libmcrypt-xxxx
(note: as I run Red Hat 7.3 I set the line a f t e r the if-part
(id -u = 0 …) with: pathmunge /usr/local / libm….)
and add in / etc / ld.so.conf the following path: /usr/local/lib
then run ldconfig:
> ldconfig
now comes the important part:
> cd /usr/local/libmcrypt/libmcrypt-xxx/libltdl
> ./configure –enable-ltdl-install
> make
> make install

(maybe not needed: I also added a link in / usr / bin: )
(> cd /usr/bin)
(> ln -s /usr/lib/libltdl.so.3.1.0 ltdl)

mhash:
———–
download mhash-xxx.tar.gz
create the following directory: / usr / local / mhash
copy the mhash-xxx.tar.gz into that directory and move to it
run the following shell (>) commands: (’xxx’ is the version number)
> gunzip -c mhash-xxx.tar.gz | tar xf -
> cd mhash-xxx
> ./configure
> make
> make check (note: ‘make check’ is optional)
> make install

mcrypt:
———–
download mcrypt-xxx.tar.gz
create the following directory: / usr / local / mcrypt
copy the mcrypt-xxx.tar.gz into that directory and move to it
run the following shell (>) commands: (’xxx’ is the version number)
> gunzip -c mcrypt-xxx.tar.gz | tar xf -
> cd mhash-xxx
> ./configure
> make
> make check (note: ‘make check’ is optional)
> make install

back to PHP:
————–
move into your PHP installation directory
then the following command worked on my computer:
>
./configure –with-apache=/usr/local/apache/apache_1.3.29 –with-mysql –wit
h-mcrypt=/usr/local/mcrypt/mcrypt-2.6.4
> make
> make install

————–
that‘s it

Hopefully that will help you to save some hours deep in the night :-)

Linux下让编译安装的Apache自动启动

Linux下让编译安装的Apache自动启动
在Linux系统中我一般采用编译源码的方式来安装Apache,有两种方法可以让Apache在系统启动时自动启动。
1. 在/etc/rc.d/rc.local中增加启动apache的命令,例如:/usr/local/httpd/bin/apachectl start

2. 将apache注册为系统服务

首先将apachectl命令拷贝至/etc/rc.d/init.d目录下,改名为httpd

使用编辑器打开httpd文件,并在第一行#!/bin/sh下增加两行文字如下

# chkconfig: 35 70 30
# description: Apache

接着注册该服务

chkconfig --add httpd

一切OK了,启动服务

service httpd start

其中所增加的第二行中三个数字第一个表示在运行级别3和5下启动apache,第二、三是关于启动和停止的优先级配置,无关紧要。