Jun 30 2011

Discuz X2 打开 插件设计 菜单

Category: 技术ssmax @ 15:26:44

最近在搞discuz的插件,发现最新版的X2默认隐藏了插件设计的选项,找了一下才知道如何打开,具体如下

编辑 config/config_global.php

加入

$_config['plugindeveloper'] = 1;

如果设置该值为2的话,还可以打开language之类的设置。


Apr 07 2011

Test Syntax Highlighter

Category: 技术ssmax @ 18:47:55
bash
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

java

 public static final int[] sum = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
 public static final char[] check = { '1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2' };

 public static String getDate(int next)
 {
  Calendar caltime=Calendar.getInstance();
  caltime.add(Calendar.DAY_OF_MONTH,next);

  return  Config.objFormat.format(caltime.getTime());
 }
 public static boolean checkValid(String nid) {
  if(nid!=null)
  {
   nid = nid.trim();
  }
  nid = nid.toUpperCase();
  if(nid.length()>18 || nid.length()<16)
  {
   return false;
  }
  if (nid.matches("^\\d{15,17}[\\dX]$"))
  {
   return true;
  }
  return false;
 }


Apr 07 2011

玩转Windows 7文件关联

Category: 技术ssmax @ 18:07:33

遇到一位朋友紧急求助:系统是windows7,这位朋友因为桌面没有OFFICE图标,又急着要用WORD,就把一个桌面图标右击,选择打开方式中选择了Word,而且没有把“始终使用这种程序打开同类型文件”前的勾去掉。这一改之后,结果所有的快捷方式全变成了word文档了。可以再改成别的,比如再改为记事本方式打开,但就是没有办法恢复原状。

  这是一个文件关联的问题。这样的问题在xp下根本就不可能发生,看来这个具体问题是Win7下的新问题。网上大致搜了一下,发现出现这样问题的决不只是这位朋友,看来有解决的必要。

  为了解决这个问题,我们需要先谈一下文件关联的一些基本的知识,这样才能使朋友们做到知其然而知其所以然。

  文件关联,主要的是把文件类型与开放式命令关联起来。而 windows是通过文件的扩展名来识别文件类型的,这就首先需要把扩展名与文件类型关联起来。

  assoc命令

  要修改扩展名与文件类型的关联,我们需要用到一个命令:assoc

  点开始,搜索,输入cmd,打开cmd,在cmd中输入:assoc /? 回车。我们可以得到关于这个命令的帮助。

  assoc命令的作用有两个,一是显示扩展名与文件类型的关联,一是改写扩展名与文件类型的关联。

  让我们以快捷方式的关联为例来讲述这个问题。

  快捷方式的扩展名是.lnk,在 windows下,这个扩展名一般是不会显现出来的,如果出现了,必是它的文件关联出问题了。

  我们在cmd中输入:assoc .lnk ,回车后我们可以得到的命令结果是: .lnk=lnkfile 。这个命令结果显示了:扩展名.lnk与文件类型lnkfile是相关联的。凡是扩展名为.lnk的文件,都属于lnkfile这个文件类型。

  现在让我们输入命令: assoc .lnk=lnk ,按下回车键,lnk这个扩展名与文件类型的关联就被改写了。然后我们再输入命令: assoc .lnk ,按下回车键,我们得到的命令结果将是: .lnk=lnk ,这个结果显示了,扩展名.lnk已经是与文件类型lnk相关联,而不再是与lnkfile相关联。

  这个时候你去桌面上去看一下吧,你桌面上所有的快捷方式的后缀名.lnk全部显示出来了,所有的快捷方式都不再可用。双击时会提示:windows无法打开此文件。

  现在再让我们输入: assoc .lnk=lnkfile ,按下回车键,我们将会发现,一切又恢复了原状。

  总之,如果是快捷方式的扩展名与文件类型之间的关联出现了问题,我们只需要输入: assoc .lnk=lnkfile,回车后即可以解决问题。

  这样,如果我们知道一种扩展名所属的正确的文件类型,当这种扩展名与文件类型之间的关联出现问题的时候,我们只需要输入: assoc .ext=filetype ,按下回车键即可。 这个.ext代表的是文件扩展名,比如.lnk,这个filetype代表的是文件类型,比如lnkfile。如果我们不知道一种扩展名所关联的文件类型是什么,我们只需要在cmd中输入:assoc .ext回车。我们就能得到它所关联的文件类型是什么。

  每一个注册了的扩展名都会在注册表中存在着一个对应的注册表项: HKEY_CLASSES_ROOT\.ext ,

  这里的.ext代表的是扩展名,比如快捷方式对应的项就是: HKEY_CLASSES_ROOT\.lnk ,这个项有一个默认的值,这个默认的值的数据,就是这个快捷方式所关联的文件类型。因而assoc命令,主要的就是修改这个项的默认值的数据。但需要注意的是,assoc命令所修改的内容,并不仅仅是这个项的默认值的数据,它还会要修改其它的一些方面。所以我们直接在注册表中改这个值的数据,并不能完全代替assoc命令。

  fytpe命令

  我们现在知道了如何把扩展名与文件类型关联起来了,进一步地需要知道的是如何把文件类型与开放式命令关联起来。比如.txt扩展名所关联的文件类型是txtfile,而txtfile正常的情形下,总是用 notepad.exe(记事本)来打开的,这个notepad.exe就是打开txtfile文件类型的开放式命令。

  如何来修改这种文件类型与开放式命令之间的关联呢?这需要用到另外的一个重要的命令:ftype

  让我们在cmd中输入: ftype /? 回车。我们可以得到这个命令的帮助。

  ftype命令有两个作用,一是显示文件类型与开放式命令之间的关联,一是改写文件类型与开放式命令之间的关联。

  如果我们想知道一种文件类型与什么样的开放式命令相关联,我们只需要在cmd中输入: ftype fileType ,按下回车键,我们就能够得到我们想要得到的结果。

  这个fileType代表的是指定的文件类型,比如lnkfile,我们输入:ftype lnkfile ,按下回车键,正常情形下我们得到的命令结果是: 没有找到文件类型“lnkfile”或者与其相关的开放式命令,这个结果表明正常的情形下,lnkfile是没有与任何开放式命令相关联的。

  让我们输入:ftype lnkfile=notepad.exe ,按下回车键,再输入:ftype lnkfile ,按下回车键,我们将得到的命令结果是: lnkfile=notepad.exe 这个结果表明了:文件类型lnkfile就与开放式命令notepad.exe关联上了。

  这种情形下,仍然并不会影响快捷方式的打开。 那么,如何来清除这个关联,并且不与其它的开放式命令关联呢?我们只要输入: ftype lnkfile= ,然后回车即可。

  在 xp下,这个命令无效,但是,我们可以在xp下输入:ftype lnkfile= ,按下回车键,这个命令与前一个命令在外表上几乎看不出区别,区别就在于,前一个命令在=后面没有空格,而后一个命令在=后有一个空格。

  让我们输入:ftype txtfile ,按下回车键,正常情形下,我们可以得到的命令结果是: txtfile=”%SystemRoot%\system32\NOTEPAD.EXE” %1 ,这个结果表明了:文件类型txtfile与开放式命令txtfile=”%SystemRoot%\system32\NOTEPAD.EXE” %1相关联。

  如果一种文件类型与开放式命令之间的关联出现了问题,而我们知道正确的开放式命令是什么,这时我们只需要在cmd中输入如下命令并回车即可修复: ftype fileType=openCommandString ,这里fileType代表的是指定的文件类型,比如txtfile,这里openCommandString代表的是开放式命令,比如 notepad.exe

  如果我们的txtfile与开放式命令之间的关联出了问题,我们只需要在cmd中输入: ftype txtfile=”%SystemRoot%\system32\NOTEPAD.EXE” %1 ,按下回车键,这样我们也就修复了txtfile文件类型与它的开放式命令之间的关联。

  所谓开放式命令,其实就是对这种文件类型的打开方式。每一种注册了的文件类型,在注册表中都会存在着它的一个对应的注册表项,这个注册表项就是: HKEY_CLASSES_ROOT\filetype ,这个filetype代表的是文件类型,比如batfile文件类型所对应的注册表项就是: HKEY_CLASSES_ROOT\batfile ,ftype命令所修改的注册表项主要就是—HKEY_CLASSES_ROOT\filetype\shell\open\command—这个项的默认值的数据。

  但需要注意的是,ftype命令所修改的并不仅仅是这个默认值的数据。因而直接在注册表中修改这个数据,并不能代替ftype命令的修改。

  当然,ftype命令所修改的全部的东西都可以在注册表中找到,但是,我们那样一一地去找,远不如用 ftype命令简单修改来得爽。

  右键打开方式

  前面我们谈到了扩展名与文件类型的关联,文件类型与开放式命令的关联(也就是文件的打开方式),看起来好象我们关于文件关联的问题就谈完了,实则不然,还有另外的一个重要的方面我们没有谈到。这就是我们右击一个文件,选择打开方式(并不是所有文件右键都有打开方式这个选项的),然后我们选择一个程序,并把“始终使用这种程序打开同类型文件”前的勾选上,点确认。比如本文开头的那位朋友,把所有快捷方式都选择以word程序打开一样。这样之后,这个文件类型也就与这个开放式命令关联起来了。

  ftype命令是修改文件类型与开放式命令的关联的,而右键打开方式也可以修改文件类型与开放式命令的关联,这二者的关系是什么呢?

  我们发现,ftype命令和右键打开方式,这二者所修改的注册表项是不同的。Ftype命令所修改的注册表项是: HKEY_CLASSES_ROOT\filetype ,这个filetype代表的是文件类型,比如HKEY_CLASSES_ROOT\lnkfile ,而右键打开方式所修改的主要注册表项是: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.ext ,这个.ext代表的是文件扩展名,比如: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.lnk ,按照我的理解,ftype命令所修改的内容属于系统设置,而右键打开方式所修改的内容则属于用户设置,这二者所设置的实际对象是一样的,当二者不一致的时候,用户设置优先于系统设置。

  三个注册表项

  总之,文件关联所涉及到的注册表项主要是三个:

  HKEY_CLASSES_ROOT\.ext

  HKEY_CLASSES_ROOT\filetype

  HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.ext

  问题解决

  现在要回到我们在开头所说到的问题了。我教那位朋友首先输入:assoc .lnk ,返回的命令结果是: .lnk=lnkfile 中,这表明,扩展名.lnk与文件类型lnkfile之间的关联没有问题。 我再要他输入:ftype lnkfile ,返回的命令结果是:没有找到文件类型“lnkfile”或者与其相关的开放式命令,而这个结果是正常的,这表明,系统设置中的lnkfile与开放式命令之间的关联也没有问题。

  那么,问题只能出在用户设置中的lnkfile与开放式命令之间的关联出现了问题。 一般的情形下,右键打开方式的设置优先于ftype命令对文件关联的设置,这在xp和win7下都是一样的,但对于扩展名为.lnk的快捷方式,二者却具有不同。在win7下,即便是对于.lnk快捷方式,也是右键打开方式的设置优先于ftype命令的设置。

  找到了问题所在,我们就可以知道,对于这种快捷方式的文件关联错误,我们用assoc和ftype命令都是无法解决的。解决的办法就是:

  在注册表中右键删除下面这个注册表项: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.lnk\UserChoice 这个注册表项下的值和数据(具体就是名为progid的值和它的数据),是对应右键打开方式所设置的默认打开程序的。

  在删除后,重启电脑,或者重启explorer,问题完美得到解决。 除了这种解决办法,其它的解决办法暂时没有找到。

  顺便说一下,在XP 下,UserChoice这个注册表项是没有的。

  由于一些文件右键没有打开方式选项,在xp下,我们可以在我的电脑里面点工具—- 查看—-文件夹选项—文件类型,这里我们可以进行同样的设置,而在Win7下,我们可以在—-控制面板—程序—默认程序—-始终使用指定的程序打开此文类型—里面进行设置,xp下设置的可选项要多得多,而Win7下则的设置则极为简明。

遇到一位朋友紧急求助:系统是windows7,这位朋友因为桌面没有OFFICE图标,又急着要用WORD,就把一个桌面图标右击,选择打开方式中选择了Word,而且没有把“始终使用这种程序打开同类型文件”前的勾去掉。这一改之后,结果所有的快捷方式全变成了word文档了。可以再改成别的,比如再改为记事本方式打开,但就是没有办法恢复原状。

  这是一个文件关联的问题。这样的问题在xp下根本就不可能发生,看来这个具体问题是Win7下的新问题。网上大致搜了一下,发现出现这样问题的决不只是这位朋友,看来有解决的必要。

  为了解决这个问题,我们需要先谈一下文件关联的一些基本的知识,这样才能使朋友们做到知其然而知其所以然。

  文件关联,主要的是把文件类型与开放式命令关联起来。而 windows是通过文件的扩展名来识别文件类型的,这就首先需要把扩展名与文件类型关联起来。

  assoc命令

  要修改扩展名与文件类型的关联,我们需要用到一个命令:assoc

  点开始,搜索,输入cmd,打开cmd,在cmd中输入:assoc /? 回车。我们可以得到关于这个命令的帮助。

  assoc命令的作用有两个,一是显示扩展名与文件类型的关联,一是改写扩展名与文件类型的关联。

  让我们以快捷方式的关联为例来讲述这个问题。

  快捷方式的扩展名是.lnk,在 windows下,这个扩展名一般是不会显现出来的,如果出现了,必是它的文件关联出问题了。

  我们在cmd中输入:assoc .lnk ,回车后我们可以得到的命令结果是: .lnk=lnkfile 。这个命令结果显示了:扩展名.lnk与文件类型lnkfile是相关联的。凡是扩展名为.lnk的文件,都属于lnkfile这个文件类型。

  现在让我们输入命令: assoc .lnk=lnk ,按下回车键,lnk这个扩展名与文件类型的关联就被改写了。然后我们再输入命令: assoc .lnk ,按下回车键,我们得到的命令结果将是: .lnk=lnk ,这个结果显示了,扩展名.lnk已经是与文件类型lnk相关联,而不再是与lnkfile相关联。

  这个时候你去桌面上去看一下吧,你桌面上所有的快捷方式的后缀名.lnk全部显示出来了,所有的快捷方式都不再可用。双击时会提示:windows无法打开此文件。

  现在再让我们输入: assoc .lnk=lnkfile ,按下回车键,我们将会发现,一切又恢复了原状。

  总之,如果是快捷方式的扩展名与文件类型之间的关联出现了问题,我们只需要输入: assoc .lnk=lnkfile,回车后即可以解决问题。

  这样,如果我们知道一种扩展名所属的正确的文件类型,当这种扩展名与文件类型之间的关联出现问题的时候,我们只需要输入: assoc .ext=filetype ,按下回车键即可。 这个.ext代表的是文件扩展名,比如.lnk,这个filetype代表的是文件类型,比如lnkfile。如果我们不知道一种扩展名所关联的文件类型是什么,我们只需要在cmd中输入:assoc .ext回车。我们就能得到它所关联的文件类型是什么。

  每一个注册了的扩展名都会在注册表中存在着一个对应的注册表项: HKEY_CLASSES_ROOT\.ext ,

  这里的.ext代表的是扩展名,比如快捷方式对应的项就是: HKEY_CLASSES_ROOT\.lnk ,这个项有一个默认的值,这个默认的值的数据,就是这个快捷方式所关联的文件类型。因而assoc命令,主要的就是修改这个项的默认值的数据。但需要注意的是,assoc命令所修改的内容,并不仅仅是这个项的默认值的数据,它还会要修改其它的一些方面。所以我们直接在注册表中改这个值的数据,并不能完全代替assoc命令。

  fytpe命令

  我们现在知道了如何把扩展名与文件类型关联起来了,进一步地需要知道的是如何把文件类型与开放式命令关联起来。比如.txt扩展名所关联的文件类型是txtfile,而txtfile正常的情形下,总是用 notepad.exe(记事本)来打开的,这个notepad.exe就是打开txtfile文件类型的开放式命令。

  如何来修改这种文件类型与开放式命令之间的关联呢?这需要用到另外的一个重要的命令:ftype

  让我们在cmd中输入: ftype /? 回车。我们可以得到这个命令的帮助。

  ftype命令有两个作用,一是显示文件类型与开放式命令之间的关联,一是改写文件类型与开放式命令之间的关联。

  如果我们想知道一种文件类型与什么样的开放式命令相关联,我们只需要在cmd中输入: ftype fileType ,按下回车键,我们就能够得到我们想要得到的结果。

  这个fileType代表的是指定的文件类型,比如lnkfile,我们输入:ftype lnkfile ,按下回车键,正常情形下我们得到的命令结果是: 没有找到文件类型“lnkfile”或者与其相关的开放式命令,这个结果表明正常的情形下,lnkfile是没有与任何开放式命令相关联的。

  让我们输入:ftype lnkfile=notepad.exe ,按下回车键,再输入:ftype lnkfile ,按下回车键,我们将得到的命令结果是: lnkfile=notepad.exe 这个结果表明了:文件类型lnkfile就与开放式命令notepad.exe关联上了。

  这种情形下,仍然并不会影响快捷方式的打开。 那么,如何来清除这个关联,并且不与其它的开放式命令关联呢?我们只要输入: ftype lnkfile= ,然后回车即可。

  在 xp下,这个命令无效,但是,我们可以在xp下输入:ftype lnkfile= ,按下回车键,这个命令与前一个命令在外表上几乎看不出区别,区别就在于,前一个命令在=后面没有空格,而后一个命令在=后有一个空格。

  让我们输入:ftype txtfile ,按下回车键,正常情形下,我们可以得到的命令结果是: txtfile=”%SystemRoot%\system32\NOTEPAD.EXE” %1 ,这个结果表明了:文件类型txtfile与开放式命令txtfile=”%SystemRoot%\system32\NOTEPAD.EXE” %1相关联。

  如果一种文件类型与开放式命令之间的关联出现了问题,而我们知道正确的开放式命令是什么,这时我们只需要在cmd中输入如下命令并回车即可修复: ftype fileType=openCommandString ,这里fileType代表的是指定的文件类型,比如txtfile,这里openCommandString代表的是开放式命令,比如 notepad.exe

  如果我们的txtfile与开放式命令之间的关联出了问题,我们只需要在cmd中输入: ftype txtfile=”%SystemRoot%\system32\NOTEPAD.EXE” %1 ,按下回车键,这样我们也就修复了txtfile文件类型与它的开放式命令之间的关联。

  所谓开放式命令,其实就是对这种文件类型的打开方式。每一种注册了的文件类型,在注册表中都会存在着它的一个对应的注册表项,这个注册表项就是: HKEY_CLASSES_ROOT\filetype ,这个filetype代表的是文件类型,比如batfile文件类型所对应的注册表项就是: HKEY_CLASSES_ROOT\batfile ,ftype命令所修改的注册表项主要就是—HKEY_CLASSES_ROOT\filetype\shell\open\command—这个项的默认值的数据。

  但需要注意的是,ftype命令所修改的并不仅仅是这个默认值的数据。因而直接在注册表中修改这个数据,并不能代替ftype命令的修改。

  当然,ftype命令所修改的全部的东西都可以在注册表中找到,但是,我们那样一一地去找,远不如用 ftype命令简单修改来得爽。

  右键打开方式

  前面我们谈到了扩展名与文件类型的关联,文件类型与开放式命令的关联(也就是文件的打开方式),看起来好象我们关于文件关联的问题就谈完了,实则不然,还有另外的一个重要的方面我们没有谈到。这就是我们右击一个文件,选择打开方式(并不是所有文件右键都有打开方式这个选项的),然后我们选择一个程序,并把“始终使用这种程序打开同类型文件”前的勾选上,点确认。比如本文开头的那位朋友,把所有快捷方式都选择以word程序打开一样。这样之后,这个文件类型也就与这个开放式命令关联起来了。

  ftype命令是修改文件类型与开放式命令的关联的,而右键打开方式也可以修改文件类型与开放式命令的关联,这二者的关系是什么呢?

  我们发现,ftype命令和右键打开方式,这二者所修改的注册表项是不同的。Ftype命令所修改的注册表项是: HKEY_CLASSES_ROOT\filetype ,这个filetype代表的是文件类型,比如HKEY_CLASSES_ROOT\lnkfile ,而右键打开方式所修改的主要注册表项是: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.ext ,这个.ext代表的是文件扩展名,比如: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.lnk ,按照我的理解,ftype命令所修改的内容属于系统设置,而右键打开方式所修改的内容则属于用户设置,这二者所设置的实际对象是一样的,当二者不一致的时候,用户设置优先于系统设置。

  三个注册表项

  总之,文件关联所涉及到的注册表项主要是三个:

  HKEY_CLASSES_ROOT\.ext

  HKEY_CLASSES_ROOT\filetype

  HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.ext

  问题解决

  现在要回到我们在开头所说到的问题了。我教那位朋友首先输入:assoc .lnk ,返回的命令结果是: .lnk=lnkfile 中,这表明,扩展名.lnk与文件类型lnkfile之间的关联没有问题。 我再要他输入:ftype lnkfile ,返回的命令结果是:没有找到文件类型“lnkfile”或者与其相关的开放式命令,而这个结果是正常的,这表明,系统设置中的lnkfile与开放式命令之间的关联也没有问题。

  那么,问题只能出在用户设置中的lnkfile与开放式命令之间的关联出现了问题。 一般的情形下,右键打开方式的设置优先于ftype命令对文件关联的设置,这在xp和win7下都是一样的,但对于扩展名为.lnk的快捷方式,二者却具有不同。在win7下,即便是对于.lnk快捷方式,也是右键打开方式的设置优先于ftype命令的设置。

  找到了问题所在,我们就可以知道,对于这种快捷方式的文件关联错误,我们用assoc和ftype命令都是无法解决的。解决的办法就是:

  在注册表中右键删除下面这个注册表项: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.lnk\UserChoice 这个注册表项下的值和数据(具体就是名为progid的值和它的数据),是对应右键打开方式所设置的默认打开程序的。

  在删除后,重启电脑,或者重启explorer,问题完美得到解决。 除了这种解决办法,其它的解决办法暂时没有找到。

  顺便说一下,在XP 下,UserChoice这个注册表项是没有的。

  由于一些文件右键没有打开方式选项,在xp下,我们可以在我的电脑里面点工具—- 查看—-文件夹选项—文件类型,这里我们可以进行同样的设置,而在Win7下,我们可以在—-控制面板—程序—默认程序—-始终使用指定的程序打开此文类型—里面进行设置,xp下设置的可选项要多得多,而Win7下则的设置则极为简明。


Nov 09 2010

Java Mail 实现 POP3 收信 UIDL 命令

Category: 技术ssmax @ 17:18:33

今天有个项目要用到java mail 进行快速收信,但不删除邮件,所以需要用UIDL获取邮件唯一ID,上网找了一下java mail的实现,有一种改源代码提升效率的方法,不过改源代码比较难维护,所以我想java不至于连这个都没有实现吧,深入看了一下,发现java mail自带的方法就可以完成这个操作,在这里记录一下。

Session session = Session.getDefaultInstance(props, null);
session.setDebug(true);
//使用POP3会话机制,连接服务器
Store store = session.getStore(“pop3”);
store.connect(popServer, 110, popUser, popPassword);
POP3Folder folder = (POP3Folder)store.getFolder(“INBOX”);
//使用只读方式打开收件箱
folder.open(Folder.READ_ONLY);
//得到文件夹信息,获取邮件列表,此时列表中的对象是没有数据的初始化状态
Message[] msgs = folder.getMessages();
//执行UIDL指令,填入msgs对象中,只有POP3Message才有uid对象
FetchProfile fp = new FetchProfile();
fp.add(UIDFolder.FetchProfileItem.UID);
folder.fetch(msgs, fp);
//获取每个邮件的NUM 和 UID,默认就当你有一封信了,嘿嘿
System.out.println(msgs[0].getMessageNumber());
System.out.println(folder.getUID(msgs[0]));

set debug以后我们来看看输出:

DEBUG: setDebug: JavaMail version 1.4.3

DEBUG: getProvider() returning javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Sun Microsystems, Inc]

DEBUG POP3: connecting to host “pop.126.com”, port 110, isSSL false

S: +OK Welcome to coremail Mail Pop3 Server (126coms[f7aa0ed0270c139a0807240dd700906bs])

C: CAPA

S: +OK Capability list follows

TOP

USER

PIPELINING

UIDL

.

DEBUG POP3: server doesn’t support TOP, disabling it

C: USER *******

S: +OK core mail

C: PASS *******

S: +OK 11 message(s) [766874 byte(s)]

C: STAT

S: +OK 11 766874

C: NOOP

S: +OK core mail

C: UIDL

S: +OK 11 766874

1 1tbirAJ99EX9fhakLwAAs8

2 1tbirAJ99EX9fhakLwABs9

3 1tbi5w1-9EzBsjIZ6AAAsd

4 1tbirAd-9EX9fibK1AAAse

5 1tbi3RR-9EsL9JOV8AAAsA

6 1tbiGAyA9El1nWUOqgAAsA

7 1tbirB+B9EX9fjVf8gAAsY

8 1tbi0hWC9EgYwFaoYwAAs8

9 1tbiBR2D9EkAFOKknwAAsr

10 1tbi0gGD9EgYwGOBNgAAsg

11 1tbi0gGD9EgYwGOBNgACsi

.

1                                                                   <————-System.out.println(msgs[0].getMessageNumber());

1tbirAJ99EX9fhakLwAAs8              <————-System.out.println(folder.getUID(msgs[0]));

C: QUIT

S: +OK core mail


Apr 20 2010

mod_wsgi 的两种模式

Category: 技术ssmax @ 18:41:47

mod_wsgi 有两种运行模式,

第一种是嵌入模式,类似于mod_python,直接在apache进程中运行,这样的好处是不需要另外增加进程,但是坏处也很明显,所有内存都和apache共享,如果和mod_python一样造成内存漏洞的话,就会危害整个apache。而且如果apache是用worker mpm,mod_wsgi也就强制进入了线程模式,这样子对于非线程安全的程序来说就没法用了。

这种模式下只需要在apache下面设置
WSGIScriptAlias /path /path-to-wsgi

即可生效,对于小型脚本的话,直接用这种模式即可。

第二种是后台模式,类似于FastCGI的后台,mod_wsgi会借apache的外壳,另外启动一个或多个进程,然后通过socket通信和apache的进程联系。

这种方式只要使用以下配置即可开启:
#启动WSGI后台,site1是后台名字
WSGIDaemonProcess site1 processes=2 threads=15 display-name=%{GROUP}

#分配当前上下文应该使用哪个WSGI后台,可以放在Location里面指定
WSGIProcessGroup site1

#根据当前上下文的ProcessGroup分配到对应的后台
WSGIScriptAlias /path /path-to-wsgi

后台模式由于是与apache进程分离了,内存独立,而且可以独立重启,不会影响apache的进程,如果你有多个项目(django),可以选择建立多个后台或者共同使用一个后台。

比如在同一个VirtualHost里面,不同的path对应不同的django项目,可以同时使用一个Daemon:

WSGIDaemonProcess default processes=1 threads=1 display-name=%{GROUP}

WSGIProcessGroup default

WSGIScriptAlias /project1 “/home/website/project1.wsgi”

WSGIScriptAlias /project2 “/home/website/project2.wsgi”

这样子两个django都使用同一个WSGI后台。

也可以把不同的项目分开,分开使用不同的后台,这样开销比较大,但就不会耦合在一起了。

display-name是后台进程的名字,这样方便重启对应的进程,而不需要全部杀掉。

WSGIDaemonProcess site1 processes=1 threads=1 display-name=%{GROUP}

WSGIDaemonProcess site2 processes=1 threads=1 display-name=%{GROUP}

<Location “/project1”>
WSGIProcessGroup site1
</Location>
WSGIScriptAlias /project1 “/home/website/project1.wsgi”

<Location “/project1”>
WSGIProcessGroup site2
</Location>
WSGIScriptAlias /project2 “/home/website/project2.wsgi”

对于django 1.0以下的版本,由于官方认定不是线程安全的,所以建议使用多进程单线程模式

processes=n threads=1

但是我自己在用django 0.9.6,使用多线程模式在很多项目里面基本都没有问题,包括在worker模式下面使用mod_python,其实是一样的道理,呵呵。

升级到django 1.0以后,就可以放心的使用多进程多线程模式了:

processes=2 threads=64

这样子性能会更好。

下面是两种模式的英文原文:

When hosting WSGI applications using mod_wsgi, one of two primary modes of operation can be used. In ’embedded’ mode, mod_wsgi works in a similar way to mod_python in that the Python application code will be executed within the context of the normal Apache child processes. WSGI applications when run in this mode will therefore share the same processes as other Apache hosted applications using Apache modules for PHP and Perl.

An alternate mode of operation available with Apache 2.X on UNIX is ‘daemon’ mode. This mode operates in similar ways to FASTCGI/SCGI solutions, whereby distinct processes can be dedicated to run a WSGI application. Unlike FASTCGI/SCGI solutions however, a separate infrastructure is not needed when implementing the WSGI application and everything is handled automatically by mod_wsgi.

Because the WSGI applications in daemon mode are being run in their own processes, the impact on the normal Apache child processes used to serve up static files and host applications using Apache modules for PHP, Perl or some other language is much reduced. Daemon processes may if required also be run as a distinct user ensuring that WSGI applications cannot interfere with each other or access information they shouldn’t be able to.


Apr 09 2010

18位身份证号码的规则和简易验证算法JAVA版

Category: 技术ssmax @ 21:11:28

规则内容:

GB2011643199920B_1127449616

关于身份证第18是怎么计算的,原理如下:根据〖中华人民共和国国家标准 GB 11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
地址码(身份证前六位)表示编码对象常住户口所在县(市、旗、区)的行政区划代码。(所有区域的编码可以到统计局网站http://www.stats.gov.cn/tjbz/index.htm
查询到最新的县及县以上的行政编码资料。)
生日期码(身份证第七位到第十四位)表示编码对象出生的年、月、日,其中年份用四位数字表示,年、月、日之间不用分隔符。例如:1981年05月11日就用19810511表示。
顺序码(身份证第十五位到十七位)为同一地址码所标识的区域范围内,对同年、月、日出生的人员编定的顺序号。其中第十七位奇数分给男性,偶数分给女性。
校验码(身份证最后一位)是根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码。

第十八位数字的计算方法为:
1.将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
2.将这17位数字和系数相乘的结果相加。
3.用加出来和除以11,看余数是多少?
4余数只可能有0 1 2 3 4 5 6 7 8 9 10这11个数字。其分别对应的最后一位身份证的号码为1 0 X 9 8 7 6 5 4 3 2。
5.通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的Ⅹ。如果余数是10,身份证的最后一位号码就是2。

例如:某男性的身份证号码是34052419800101001X。我们要看看这个身份证是不是合法的身份证。
首先:我们得出,前17位的乘积和是189
然后:用189除以11得出的结果是17 + 2/11,也就是说余数是2。
最后:通过对应规则就可以知道余数2对应的数字是x。所以,这是一个合格的身份证号码。

刚好某个项目要用到,写了一个简单的jar包,可以查地区和生日、性别,更新上来 

cnnid.jar内附源代码

用法:

  1. import net.ssmax.commons.cnnid.*
  2. public class TestNid {
  3. public static void main(String[] args) {
  4.   NidCard nid = new NidCard(“xxxxxxxxxxxxxxx”);
  5.   System.out.println(nid.isValid());
  6.   System.out.println(nid.getArea());
  7.   System.out.println(nid.getBirthday());
  8.   System.out.println(nid.getSex());
  9. }
  10. }


Mar 23 2010

ubuntu 的多语言环境和 locale

Category: 技术ssmax @ 10:48:50

前两天准备材料的时候,在虚拟机上面装了个ubuntu玩了下,装的时候选择的是英文环境,刚好要准备字符编码的材料,试了一下
shell> export LANG=zh_CN.GBK

没反应,默认是C了,
shell> locale -a
C
en_US.utf8
POSIX

看了下,果然啥都没

shell> apt-cache search language

找到一大堆,装个中文的看看先

shell> apt-get install language-pack-zh language-pack-zh-base

装好了locale -a 看看
C
en_US.utf8
POSIX
zh_CN.utf8
zh_HK.utf8
zh_SG.utf8
zh_TW.utf8

竟然全部是utf8编码的,郁闷,哈哈

shell> ls /var/lib/locales/supported.d/
local zh

原来所有系统支持的编码都放在这里

编辑 /var/lib/locales/supported.d/zh
增加
zh_CN.GBK GBK
zh_CN.GB2312 GB2312

然后执行
shell> locale-gen
或者 shell> dpkg-reconfigure locales
重新生成locale

然后看看是不是增加成功了?
shell> locale -a
C
en_US.utf8
POSIX
zh_CN.gb2312
zh_CN.gbk
zh_CN.utf8
zh_HK.utf8
zh_SG.utf8
zh_TW.utf8


Mar 18 2010

Deprecate tcp_tw_{reuse,recycle}

Category: 技术ssmax @ 15:48:22

慎用 tcp_tw_{reuse,recycle} 内核参数
以前在我的blog里面写了解决TIME WAIT 连接过多的方法之一是设置tcp快速回收

但是最近经常爆出的一些bug表明,tcp_tw_recycle 开启的情况下,会对内网NAT出来的访问有一定影响,由于开启这个功能后,内核会认为同一个ip只会有一个timestamp生效,如果网关出来的timestamp不一样的话,服务器端就会drop掉这些tcp帧。

建议大家慎用tcp_tw_recycle 和 tcp_tw_reuse 这两个参数。具体原文如下:

We’ve recently had a long discussion about the CVE-2005-0356 time stamp denial-of-service
attack. It turned out that Linux is only vunerable to this problem when tcp_tw_recycle
is enabled (which it is not by default).
In general these two options are not really usable in today’s internet because they
make the (often false) assumption that a single IP address has a single TCP time stamp /
PAWS clock. This assumption breaks both NAT/masquerading and also opens Linux to denial
of service attacks (see the CVE description)
Due to these numerous problems I propose to remove this code for 2.6.26
Signed-off-by: Andi Kleen
Index: linux/Documentation/feature-removal-schedule.txt
===================================================================
— linux.orig/Documentation/feature-removal-schedule.txt
+++ linux/Documentation/feature-removal-schedule.txt
@@ -354,3 +354,15 @@ Why: The support code for the old firmwa
and slightly hurts runtime performance. Bugfixes for the old firmware
are not provided by Broadcom anymore.
Who: Michael Buesch
+
+—————————
+
+What: Support for /proc/sys/net/ipv4/tcp_tw_{reuse,recycle} = 1
+When: 2.6.26
+Why: Enabling either of those makes Linux TCP incompatible with masquerading and
+ also opens Linux to the CVE-2005-0356 denial of service attack. And these
+ optimizations are explicitely disallowed by some benchmarks. They also have
+ been disabled by default for more than ten years so they’re unlikely to be used
+ much. Due to these fatal flaws it doesn’t make sense to keep the code.
+Who: Andi Kleen
+


Mar 09 2010

Mysql 全文索引的中文问题 (Mediawiki搜索中文问题)

Category: 技术ssmax @ 15:24:59

今天翻了一下meidawiki的源代码,由于它的中文搜索不太准确,想查查原因,就看了一下它的搜索是如何实现的。

数据库是mysql,使用了全文索引表进行搜索

CREATE TABLE `searchindex` (
`si_page` int(10) unsigned NOT NULL,
`si_title` varchar(255) NOT NULL DEFAULT '',
`si_text` mediumtext NOT NULL,
UNIQUE KEY `si_page` (`si_page`),
FULLTEXT KEY `si_title` (`si_title`),
FULLTEXT KEY `si_text` (`si_text`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

mysql的FULLTEXT 对中文的支持一直不太好,如果直接用utf8字符串的话,没有分词分隔符,所以索引就没有效果,wiki通过取巧的方法,把utf8字符转换成U8xxxx进行保存,用英文空格分隔,所以就可以搜索了。

wiki的字符转换代码,比较有用,呵呵:

cat wiki/languages/classes/LanguageZh_cn.php

<?php
/**
* @addtogroup Language
*/
class LanguageZh_cn extends Language {
function stripForSearch( $string ) {
# MySQL fulltext index doesn't grok utf-8, so we
# need to fold cases and convert to hex
# we also separate characters as "words"
if( function_exists( 'mb_strtolower' ) ) {
return preg_replace(
"/([\\xc0-\\xff][\\x80-\\xbf]*)/e",
"' U8' . bin2hex( \"$1\" )",
mb_strtolower( $string ) );
} else {
list( , $wikiLowerChars ) = Language::getCaseMaps();
return preg_replace(
"/([\\xc0-\\xff][\\x80-\\xbf]*)/e",
"' U8' . bin2hex( strtr( \"\$1\", \$wikiLowerChars ) )",
$string );
}
}
}

上面的代码就会把汉字转换为U8xxxx空格,然后就可以使用mysql的full text索引了,其实5.0之后的mysql可以使用utf8字符做全文索引了,但是由于分词的问题,还是需要把每个汉字用空格分开,而且要设置最小索引字符长度才行,所以还是wiki的这种方式方便。

因为它是一个汉字作为一个词,没有按顺序搜索,所以最后结果和中国人的语言习惯不太一样,其实只需要改一下源代码,使用冒号封装短语,就可以得出比较精确的结果了。

vim wiki/includes/SearchMySQL4.php

找到以下代码

if( $this-&gt;strictMatching &amp;&amp; ($terms[1] == '') ) {
$terms[1] = '+';
}
$searchon .= $terms[1] . $wgContLang-&gt;stripForSearch( $terms[2] );

修改为

if( $this-&gt;strictMatching &amp;&amp; ($terms[1] == '') ) {
// $terms[1] = '+';
$terms[1] = '+"';
}
$searchon .= $terms[1] . $wgContLang-&gt;stripForSearch( $terms[2] ) . '"';

即可精确搜索。

已经修改仅是针对旧版本的wiki,如果是最新版本的话,已经自带了对应的逻辑,如果对这个结果还不满意的话,那只能用外部的扩展自己实现Mysql索引的这一块了,如果是公共网站的话最简单的方法就是用google搜索+site标签指定。呵呵。

附上新版的SearchMySQL.php中这部分的代码,写得比较隐晦,哈哈

		if( preg_match_all( '/([-+<>~]?)(([' . $lc . ']+)(\*?)|"[^"]*")/',
			  $filteredText, $m, PREG_SET_ORDER ) ) {
			foreach( $m as $bits ) {
				@list( /* all */, $modifier, $term, $nonQuoted, $wildcard ) = $bits;
				
				if( $nonQuoted != '' ) {
					$term = $nonQuoted;
					$quote = '';
				} else {
					$term = str_replace( '"', '', $term );
					$quote = '"';
				}

看上去中文的会匹配 $quote = ‘”‘; 这个结果,就是自动帮你加上引号了。


Feb 03 2010

Openvpn中tun和tap的区别

Category: 技术ssmax @ 22:25:03

tun devices encapsulate IPv4 or IPv6 (OSI Layer 3) while tap devices encapsulate Ethernet 802.3 (OSI Layer 2).

今天搞了一个下午,把几个地区的网络用openvpn连起来了,如果用tun的话,就是模拟了一个p2p的环境,虽然能够连接到同网段别的ip,但是无法广播,这样就无法实现到某些网段的跳转网关了。

后来才看到有tap方式,以前一直没留意这个有什么用,查了手册才发现这个是模拟一个局域网的环境,非常赞,广播有了,怎么指定网关都可以了,哈哈。

ps:今天终于买到火车票。。。真难买啊。


« Previous PageNext Page »