2005年07月02日

以前没听不怪你,现在听说了,不用绝对是你的损失。

主页地址:www.codeblocks.org

特性比较:(http://www.codeblocks.org/index.php?name=PNphpBB2&file=viewtopic&t=100)

IMO (please correct me if i’m missing something)

Debugger:
CDT: debugger is very complete and useful
C::B: debugger in this moment is very basic

Project handling:
CDT: For simple projects it’ ok. For more complex projects, although it’s possible to estabilish project dependencies, it does not offer a real multi-target project manager.
C::B: It was a nice surprise for me to find a _real_ multitarget project handling in codeblocks.

Memory Occupation
CDT: AAAAARRRGG!!
C::B: Reasonable

Startup Times
CDT: AAAAARRRGG!!
C::B: Very Quick

Refactory
CDT: Present ad seems to works well
C::B: Not present (AFAIK)

Class browsing ecc ecc
CDT: Very nice and useful _BUT_ i’m really disappointed by C++ indexing times. May be i’m missing something, but trying to handle C::B code with CDT, the first global C++ indexing tooks more than one hour to complete!!
C::B: Present but quite buggy and code completion doesn’t handle typedefs and templates.

Extensibility
CDT: Can be extended with plugins.
C::B: Can be extended with plugins. I quote Yiannis:

mandrav wrote:
Yes, almost everything can be done with plugins. A tutorial on plugins is planned shortly.



Future
CDT: Latest CDT official release is dated Dec 2004. I wasn’t able to find any info about CDT delepment process. This open source licensed project is not so "open".
C::B: Yiannis seems to be very active, in development and support. C::B source code hasn’t many comments, but it’s quite easy to understand. Plugins can extend many aspects of IDE and can be written in C++.

目前仍在迅速发展中,相信很快就会有好用的RAD插件出现。

2005年06月16日

[Setup]
ShowLanguageDialog=yes
AppCopyright=版权所有(C) 2005, BitWorld Inc.
AppName={cm:License} {cm:Packagename}
AppVerName={cm:License} {cm:Packagename} {cm:Packagever}
LicenseFile=
OutputDir=E:\install
UninstallFilesDir={code:getmingwdir}\uninstall
ExtraDiskSpaceRequired=0
UserInfoPage=false
VersionInfoVersion=2.0
VersionInfoCompany=BitWorld Inc.
VersionInfoDescription=BitWorld
EnableDirDoesntExistWarning=true
AppID={{007F4590-89DE-4F87-9608-10F07CEFBBE9}
LanguageDetectionMethod=uilanguage
UsePreviousSetupType=true
DisableStartupPrompt=true
DirExistsWarning=no
WizardImageFile=D:\Program Files\Inno Setup 5\WizModernImage-IS.bmp
WizardSmallImageFile=D:\Program Files\Inno Setup 5\WizModernSmallImage-IS.bmp
OutputBaseFilename=Binutils-2.15-MingW32-Msys-setup
VersionInfoTextVersion=2.0
AppPublisher=heromyth
AppPublisherURL=http://www.donews.net/heromyth
AppVersion=1.0
AppContact=zxpmyth@yahoo.com.cn
UsePreviousTasks=false
UsePreviousAppDir=false
AllowRootDirectory=true
CreateAppDir=false

[Languages]
Name: en; MessagesFile: compiler:Languages\English.isl; LicenseFile: E:\install\gnu-readme-en-mingw32.txt
Name: chs; MessagesFile: compiler:Languages\ChineseSimp-11-5.1.0.isl; LicenseFile: E:\install\gnu-readme-zh-mingw32.txt
[Messages]
en.BeveledLabel=Created by Heromyth
chs.BeveledLabel=由张雪平创建
[Components]
Name: bininstall; Description: {cm:installBinFile}; Types: full compact; Flags: disablenouninstallwarning
Name: libinstall; Description: {cm:installLibFile}; Types: full; Flags: disablenouninstallwarning; Languages:
[_ISTool]
OutputExeFilename=E:\install\Binutils-2.15-MingW32-Msys-setup.exe
[Files]
Source: dd\vv\logo_board.gif; DestDir: {code:getmingwdir}\vv\; Components: libinstall
Source: dd\33\logo_board.jpg; DestDir: {code:getmsysdir}\33\; Components: bininstall
Source: dd\33\cppunit-1.10.2.tar.gz; DestDir: {code:getmsysdir}\33\; Components: bininstall
Source: dd\ttt.bmp; DestDir: {code:getmsysdir}; Components: bininstall
[Dirs]
Name: {code:getmingwdir}\vv; Components: libinstall
Name: {code:getmsysdir}\33; Components: bininstall

[CustomMessages]
License=GNU
Packagename=Binutils
Packagever=2.15

en.installBinFile=install EXE files
chs.installBinFile=安装可执行文件
en.installLibFile=install LIB files
chs.installLibFile=安装库文件

en.choicedirCaption=Select Destination Location
chs.choicedirCaption=选择目标位置
en.choicedirDescription=Where should %1 be installed?
chs.choicedirDescription=你想将 %1 安装在什么地方?
en.SelectDirLabel=Setup will install %1 into the following folder.
chs.SelectDirLabel=安装程序将安装 %1 到下列文件夹中。
en.choicedir=Choice for installation directory of %1
chs.choicedir=选择%1的安装目录

en.SelectDirBrowseLabel=To continue, click Next. If you would like to select a different folder, click Browse.
chs.SelectDirBrowseLabel=单击“下一步”继续。如果您想选择其它文件夹,请单击“浏览”。
en.Button1Browse=&Browse…
chs.Button1Browse=浏览(&B)…
en.Button2Browse=B&rowse…
chs.Button2Browse=浏览(&R)…

en.msyslabel=(store something that run in Shell)
chs.msyslabel=(主要用于存放一些需要在Shell环境里使用程序及数据)
en.mingwlabel=(store something that run in win32 with mingw)
chs.mingwlabel=(主要用于存放一些需要在win32模式下使用的头文件和库)

en.installedDir=installation directory of %1
chs.installedDir=%1安装目录
[Code]
//Source: dd\cppunit-docs-1.10.2.tar.gz; DestDir: {code:getmsysdir}; Components: bininstall
//Source: dd\vv\headbg.jpg; DestDir: {code:getmingwdir}\vv\; Components: libinstall
var
  Mingwdir: TLabel;
  Msysdir: TLabel;
  BitmapImage1: TBitmapImage;
  Label1: TLabel;
  Label2: TLabel;
  Edit1: TEdit;
  Edit2: TEdit;
  Button1: TButton;
  Button2: TButton;
  NewStaticText1: TNewStaticText;
  NewStaticText2: TNewStaticText;

procedure ChoseMingwFoldersClick(Sender: TObject);
var
 choicedDIR:String;
begin
 if BrowseForFolder(ExpandConstant(‘{cm:choicedir,Mingw}’),choicedDIR,True) then
  Edit1.Text := choicedDIR;
end;

procedure ChoseMsysFoldersClick(Sender: TObject);
var
 choicedDIR:String;
begin
// if BrowseForFolder(‘选择Msys的安装目录’,choicedDIR,True) then
 if BrowseForFolder(ExpandConstant(‘{cm:choicedir,Msys}’),choicedDIR,True) then
  Edit2.Text := choicedDIR+’\1.0′;
end;

procedure choicedir_Activate(Page: TWizardPage);
begin
end;

function choicedir_ShouldSkipPage(Page: TWizardPage): Boolean;
begin
  Result := False;
end;

function choicedir_BackButtonClick(Page: TWizardPage): Boolean;
begin
  Result := True;
end;

function choicedir_NextButtonClick(Page: TWizardPage): Boolean;
begin
  Result := True;
end;

procedure choicedir_CancelButtonClick(Page: TWizardPage; var Cancel, Confirm: Boolean);
begin
end;

function choicedir_CreatePage(PreviousPageId: Integer): Integer;
var
  Page: TWizardPage;
begin
  Page := CreateCustomPage(
    PreviousPageId,
    ExpandConstant(‘{cm:choicedirCaption}’),
    ExpandConstant(‘{cm:choicedirDescription,{cm:Packagename}}’)
  );

  { Mingwdir }
  Mingwdir := TLabel.Create(Page);
  with Mingwdir do
  begin
    Parent := Page.Surface;
    Left := ScaleX(0);
    Top := ScaleY(88);
    Width := ScaleX(24);
    Height := ScaleY(16);
//    Caption := ‘Mingw安装目录’+ExpandConstant(‘{cm:NameAndVersion,fdd,1.0}’) ;
    Caption := ExpandConstant(‘{cm:installedDir,Mingw}’) ;
    Font.Color := -16777208;
    Font.Height := ScaleY(-13);
    Font.Name := ‘Tahoma’;
    Font.Style := [fsBold];
  end;

  { Msysdir }
  Msysdir := TLabel.Create(Page);
  with Msysdir do
  begin
    Parent := Page.Surface;
    Left := ScaleX(0);
    Top := ScaleY(160);
    Width := ScaleX(24);
    Height := ScaleY(16);
    Caption := ExpandConstant(‘{cm:installedDir,Msys}’) ;
    Font.Color := -16777208;
    Font.Height := ScaleY(-13);
    Font.Name := ‘Tahoma’;
    Font.Style := [fsBold];
  end;

  { BitmapImage1 }
  BitmapImage1 := TBitmapImage.Create(Page);
  with BitmapImage1 do
  begin
    Parent := Page.Surface;
    Left := ScaleX(8);
    Top := ScaleY(8);
    Width := ScaleX(57);
    Height := ScaleY(41);
//Bitmap.LoadFromFile(BitmapFileName);
  end;

  { Label1 }
  Label1 := TLabel.Create(Page);
  with Label1 do
  begin
    Parent := Page.Surface;
    Left := ScaleX(16);
    Top := ScaleY(136);
    Width := ScaleX(18);
    Height := ScaleY(13);
//    Caption := ‘(主要用于存放一些需要在win32模式下使用的头文件和库)’;
    Caption := ExpandConstant(‘{cm:mingwlabel}’);
    Color := -16777206;
    Font.Color := 32768;
    Font.Height := ScaleY(-12);
    Font.Name := ‘Tahoma’;
  end;

  { Label2 }
  Label2 := TLabel.Create(Page);
  with Label2 do
  begin
    Parent := Page.Surface;
    Left := ScaleX(16);
    Top := ScaleY(216);
    Width := ScaleX(18);
    Height := ScaleY(13);
//    Caption := ‘(主要用于存放一些需要在Shell环境里使用程序及数据)’;
    Caption := ExpandConstant(‘{cm:msyslabel}’);
    Font.Color := 32768;
    Font.Height := ScaleY(-12);
    Font.Name := ‘Tahoma’;
  end;

  { Edit1 }
  Edit1 := TEdit.Create(Page);
  with Edit1 do
  begin
    Parent := Page.Surface;
    Left := ScaleX(16);
    Top := ScaleY(112);
    Width := ScaleX(313);
    Height := ScaleY(21);
    TabOrder := 0;
    Text := ‘C:\mingw’;
  end;

  { Edit2 }
  Edit2 := TEdit.Create(Page);
  with Edit2 do
  begin
    Parent := Page.Surface;
    Left := ScaleX(16);
    Top := ScaleY(184);
    Width := ScaleX(313);
    Height := ScaleY(21);
    TabOrder := 1;
    Text := ‘C:\MSYS\1.0′;
  end;

  { Button1 }
  Button1 := TButton.Create(Page);
  with Button1 do
  begin
    Parent := Page.Surface;
    Left := ScaleX(336);
    Top := ScaleY(112);
    Width := ScaleX(75);
    Height := ScaleY(23);
    Caption :=ExpandConstant(‘{cm:Button1Browse}’);
    TabOrder := 2;
    OnClick := @ChoseMingwFoldersClick;
  end;

  { Button2 }
  Button2 := TButton.Create(Page);
  with Button2 do
  begin
    Parent := Page.Surface;
    Left := ScaleX(336);
    Top := ScaleY(184);
    Width := ScaleX(75);
    Height := ScaleY(23);
    Caption := ExpandConstant(‘{cm:Button2Browse}’);
    TabOrder := 3;
    OnClick := @ChoseMsysFoldersClick;
  end;

  { NewStaticText1 }
  NewStaticText1 := TNewStaticText.Create(Page);
  with NewStaticText1 do
  begin
    Parent := Page.Surface;
    Left := ScaleX(16);
    Top := ScaleY(16);
    Width := ScaleX(22);
    Height := ScaleY(17);
    Caption := ExpandConstant(‘{cm:SelectDirLabel,{cm:Packagename}}’);
    Font.Color := -16777208;
    Font.Height := ScaleY(-13);
    TabOrder := 4;
  end;

  { NewStaticText2 }
  NewStaticText2 := TNewStaticText.Create(Page);
  with NewStaticText2 do
  begin
    Parent := Page.Surface;
    Left := ScaleX(16);
    Top := ScaleY(50);
    Width := ScaleX(22);
    Height := ScaleY(17);
//    Caption := ‘单击“下一步”继续。如果你想选择其它文件夹,请单击“浏览”。’;
    Caption := ExpandConstant(‘{cm:SelectDirBrowseLabel,{cm:Packagename}}’);
    Font.Color := -16777208;
  end;


  with Page do
  begin
    OnActivate := @choicedir_Activate;
    OnShouldSkipPage := @choicedir_ShouldSkipPage;
    OnBackButtonClick := @choicedir_BackButtonClick;
    OnNextButtonClick := @choicedir_NextButtonClick;
    OnCancelButtonClick := @choicedir_CancelButtonClick;
  end;

  Result := Page.ID;
end;

function getmingwdir(Param: String): String;
begin
 Result := Edit1.Text;
end;

function getmsysdir(Param: String): String;
begin
 Result := Edit2.Text;
end;

procedure InitializeWizard();
begin
  choicedir_CreatePage(wpUserInfo);
end;

2005年04月29日

使用MingW32编译GCC 4.0.0

heromyth(zxpmyth at yahoo.com.cn)

GCC 4.0.0出来有一周多了,网上也不断有讨论使用MingW32来编译它。这里我使用的几个步骤:

一、解压gcc-core-4.0.0.tar.bz2和gcc-g++-4.0.0.tar.bz2到同一目录
二、进入msys,运行

$ mkdir dist-gcc && cd dist-gcc

$ ../gcc-4.0.0/configure –with-gcc –with-gnu-ld –with-gnu-as –host=mingw32
–target=mingw32 –prefix=/mingw –enable-threads –enable-languages=c,c++ –di
sable-win32-registry –disable-shared –enable-sjlj-exceptions –disable-java-a
wt –without-x –enable-interpreter –enable-hash-synchronization –enable-libs
tdcxx-debug

将所有目录里的Makefile里的"-g -O2" 替换为"-O3",为的是一次性得到最终的GCC程序

$ make CFLAGS="-O2 -march=i686 -fomit-frame-pointer" CXXFLAGS="-mthreads -march
=i686 -fno-omit-frame-pointer -O2" LIBCFLAGS="-O2" LIBCXXFLAGS="-O2 -fno-implic
it-templates" LDFLAGS="-s" bootstrap

$ make DESTDIR=/local/GCC install
如果以后进行了个别文件的修改需要再次bootstrap,可以执行:
make restrap

三、将/local/GCC/mingw目录里的内容复制到原来mingw目录下,这样就可以得到最新的GCC 4.0.0了

总结:
编译安装过程基本算是顺利,至于得到的GCC是否稳定,由于条件的限制,没有作详细的测试。所有问题只有在进一步的实际使用当中来发现啦。

2005年03月02日

根据delphi版本的实例,自己做了个实例程序,感兴趣的朋友去下载来看看吧。在我的网络硬盘(http://bitworld.ys168.com)下载Qcard32_In_wxWidgets.rar。

工具:MingW+Dialogblocks+wxWidgets+QCard32

更新记录:
1. 现在实现了扑克的重画,不至于在窗口刷新后看不到扑克了。友情提醒:画图的顺序和重绘的顺序不参乱了,否则会天下大乱;
2.可以管理副牌了;
3.实例程序完成了,不太完美的地方在于定时收牌的演示。
4.再次做了修正更新,应该没什么问题了。

2004年11月25日

Index: lang/en.php
===================================================================
RCS file: /cvsroot/phpldapadmin/phpldapadmin/lang/en.php,v
retrieving revision 1.106
retrieving revision 1.119
diff -u -r1.106 -r1.119
— lang/en.php 22 Dec 2004 14:12:16 -0000 1.106
+++ lang/en.php 16 Mar 2005 20:57:45 -0000 1.119
@@ -1,5 +1,5 @@
 <?php
-// $Header: /cvsroot/phpldapadmin/phpldapadmin/lang/en.php,v 1.106 2004/12/22 14:12:16 uugdave Exp $
+// $Header: /cvsroot/phpldapadmin/phpldapadmin/lang/en.php,v 1.119 2005/03/16 20:57:45 wurley Exp $
 
 
 /*        —   INSTRUCTIONS FOR TRANSLATORS   —
@@ -31,7 +31,6 @@
 $lang['base_dn'] = ‘Base DN’;
 $lang['search_scope'] = ‘Search Scope’;
 $lang['show_attributes'] = ‘Show Attributtes’;
-$lang['attributes'] = ‘Attributes’;
 $lang['Search'] = ‘Search’;
 $lang['predefined_search_str'] = ‘Select a predefined search’;
 $lang['predefined_searches'] = ‘Predefined Searches’;
@@ -74,13 +73,13 @@
 $lang['create_new_entry_in'] = ‘Create a new entry in’;
 $lang['login_link'] = ‘Login…’;
 $lang['login'] = ‘login’;
-$lang['base_entry_does_not_exist'] = ‘The base entry does not exist.’;
+$lang['base_entry_does_not_exist'] = ‘This base entry does not exist.’;
 $lang['create_it'] = ‘Create it?’;
 
 // Entry display
 $lang['delete_this_entry'] = ‘Delete this entry’;
 $lang['delete_this_entry_tooltip'] = ‘You will be prompted to confirm this decision’;
-$lang['copy_this_entry'] = ‘Copy this entry’;
+$lang['copy_this_entry'] = ‘Copy or move this entry’;
 $lang['copy_this_entry_tooltip'] = ‘Copy this object to another location, a new DN, or another server’;
 $lang['export'] = ‘Export’;
 $lang['export_lcase'] = ‘export’;
@@ -127,13 +126,10 @@
 $lang['add_new_value'] = ‘Add New Value’;
 
 // Schema browser
-$lang['the_following_objectclasses'] = ‘The following objectClasses are supported by this LDAP server.’;
-$lang['the_following_attributes'] = ‘The following attributeTypes are supported by this LDAP server.’;
-$lang['the_following_matching'] = ‘The following matching rules are supported by this LDAP server.’;
-$lang['the_following_syntaxes'] = ‘The following syntaxes are supported by this LDAP server.’;
 $lang['schema_retrieve_error_1']=’The server does not fully support the LDAP protocol.’;
 $lang['schema_retrieve_error_2']=’Your version of PHP does not correctly perform the query.’;
-$lang['schema_retrieve_error_3']=’Or lastly, phpLDAPadmin doesn\’t know how to fetch the schema for your server.’;
+$lang['schema_retrieve_error_3']=’phpLDAPadmin doesn\’t know how to fetch the schema for your server.’;
+$lang['schema_retrieve_error_4']=’Or lastly, your LDAP server doesnt provide this information.’;
 $lang['jump_to_objectclass'] = ‘Jump to an objectClass’;
 $lang['view_schema_for_oclass'] = ‘View the schema description for this objectClass’;
 $lang['jump_to_attr'] = ‘Jump to an attribute type’;
@@ -233,19 +229,15 @@
 $lang['could_not_connect'] = ‘Could not connect to LDAP server.’;
 $lang['could_not_connect_to_host_on_port'] = ‘Could not connect to “%s” on port “%s”‘;
 $lang['could_not_perform_ldap_mod_add'] = ‘Could not perform ldap_mod_add operation.’;
-$lang['bad_server_id_underline'] = ‘Bad server_id: ‘;
 $lang['home'] = ‘Home’;
 $lang['help'] = ‘Help’;
 $lang['success'] = ‘Success’;
 $lang['server_colon_pare'] = ‘Server: ‘;
 $lang['look_in'] = ‘Looking in: ‘;
-$lang['missing_server_id_in_query_string'] = ‘No server ID specified in query string!’;
 $lang['missing_dn_in_query_string'] = ‘No DN specified in query string!’;
 $lang['back_up_p'] = ‘Back Up…’;
 $lang['no_entries'] = ‘no entries’;
-$lang['not_logged_in'] = ‘Not logged in’;
 $lang['could_not_det_base_dn'] = ‘Could not determine base DN’;
-$lang['please_report_this_as_a_bug']=’Please report this as a bug.’;
 $lang['reasons_for_error']=’This could happen for several reasons, the most probable of which are:’;
 $lang['yes']=’Yes’;
 $lang['no']=’No’;
@@ -254,13 +246,16 @@
 $lang['back']=’Back’;
 $lang['object']=’object’;
 $lang['delete_all']=’Delete all’;
-$lang['url_bug_report']=’https://sourceforge.net/tracker/?func=add&group_id=61828&atid=498546′;
 $lang['hint'] = ‘hint’;
 $lang['bug'] = ‘bug’;
 $lang['warning'] = ‘warning’;
 $lang['light'] = ‘light’; // the word ‘light’ from ‘light bulb’
 $lang['proceed_gt'] = ‘Proceed &gt;&gt;’;
-
+$lang['no_blowfish_secret'] = ‘phpLDAPadmin cannot safely encrypt & decrypt your sensitive information, because $blowfish_secret is not set in config.php. You need to edit config.php and set $blowfish_secret to some secret string now.’;
+$lang['jpeg_dir_not_writable'] = ‘Please set $jpeg_temp_dir to a writable directory in the phpLDAPadmin config.php’;
+$lang['jpeg_dir_not_writable_error'] = ‘Could not write to the $jpeg_temp_dir directory %s. Please verify that your web server can write files there.’;
+$lang['jpeg_unable_toget'] = ‘Could not fetch jpeg data from LDAP server for attribute %s.’;
+$lang['jpeg_delete'] = ‘Delete photo’;
 
 // Add value form
 $lang['add_new'] = ‘Add new’;
@@ -294,8 +289,8 @@
 $lang['invalid_template'] = ‘%s is an invalid template’;
 $lang['using_template'] = ‘using template’;
 $lang['go_to_dn'] = ‘Go to %s’;
-+$lang['structural_object_class_cannot_remove'] = ‘This is a structural ObjectClass and cannot be removed.’;
-+$lang['structural'] = ’structural’;
+$lang['structural_object_class_cannot_remove'] = ‘This is a structural ObjectClass and cannot be removed.’;
+$lang['structural'] = ’structural’;
 
 //copy_form.php
 $lang['copyf_title_copy'] = ‘Copy ‘;
@@ -307,8 +302,9 @@
 $lang['copyf_recursive_copy'] = ‘Recursively copy all children of this object as well.’;
 $lang['recursive_copy'] = ‘Recursive copy’;
 $lang['filter'] = ‘Filter’;
-$lang['search_filter'] = ‘Search Filter’;
 $lang['filter_tooltip'] = ‘When performing a recursive copy, only copy those entries which match this filter’;
+$lang['delete_after_copy'] = ‘Delete after copy (move):’;
+$lang['delete_after_copy_warn'] = ‘Make sure your filter (above) will select all child records.’;
 
 //create.php
 $lang['create_required_attribute'] = ‘You left the value blank for required attribute (%s).’;
@@ -356,10 +352,8 @@
 $lang['standard_ldap_search_filter'] = ‘Standard LDAP search filter. Example: (&(sn=Smith)(givenname=David))’;
 $lang['search_filter'] = ‘Search Filter’;
 $lang['list_of_attrs_to_display_in_results'] = ‘A list of attributes to display in the results (comma-separated)’;
-$lang['show_attributes'] = ‘Show Attributes’;
 
 // search_form_simple.php
-$lang['search_for_entries_whose'] = ‘Search for entries whose:’;
 $lang['equals'] = ‘equals’;
 $lang['starts with'] = ’starts with’;
 $lang['contains'] = ‘contains’;
@@ -386,6 +380,7 @@
 $lang['cancel'] = ‘Cancel’;
 $lang['you_made_no_changes'] = ‘You made no changes’;
 $lang['go_back'] = ‘Go back’;
+$lang['unable_create_samba_pass'] = ‘Unable to create samba password. Please check your configuration in template_config.php’;
 
 // welcome.php
 $lang['welcome_note'] = ‘Use the menu to the left to navigate’;
@@ -397,8 +392,6 @@
 // Donate.php
 $lang['donation_instructions'] = ‘To donate funds to the phpLDAPadmin project, use one of the PayPal buttons below.’;
 $lang['donate_amount'] = ‘Donate %s’;
-$lang['wish_list_option'] = ‘Or perhaps you would prefer to purchase an gift for a phpLDAPadmin developer.’;
-$lang['wish_list'] = ‘View Dave\’s phpLDAPadmin wish list’;
 
 $lang['purge_cache'] = ‘Purge caches’;
 $lang['no_cache_to_purge'] = ‘No cache to purge.’;
@@ -437,15 +430,15 @@
 $lang['could_not_bind'] = ‘Could not bind to the LDAP server.’;
 $lang['anonymous_bind'] = ‘Anonymous Bind’;
 $lang['bad_user_name_or_password'] = ‘Bad username or password. Please try again.’;
-$lang['redirecting_click_if_nothing_happens'] = ‘Redirecting… Click here if nothing happens.’;
 $lang['successfully_logged_in_to_server'] = ‘Successfully logged into server <b>%s</b>’;
 $lang['could_not_set_cookie'] = ‘Could not set cookie.’;
 $lang['ldap_said'] = ‘LDAP said: %s’;
 $lang['ferror_error'] = ‘Error’;
 $lang['fbrowse'] = ‘browse’;
 $lang['delete_photo'] = ‘Delete Photo’;
-$lang['install_not_support_blowfish'] = ‘Your PHP install does not support blowfish encryption.’;
-$lang['install_not_support_md5crypt'] = ‘Your PHP install does not support md5crypt encryption.’;
+$lang['install_not_support_ext_des'] = ‘Your system crypt library does not support extended DES encryption.’;
+$lang['install_not_support_blowfish'] = ‘Your system crypt library does not support blowfish encryption.’;
+$lang['install_not_support_md5crypt'] = ‘Your system crypt library does not support md5crypt encryption.’;
 $lang['install_no_mash'] = ‘Your PHP install does not have the mhash() function. Cannot do SHA hashes.’;
 $lang['jpeg_contains_errors'] = ‘jpegPhoto contains errors<br />’;
 $lang['ferror_number'] = ‘Error number: %s (%s)’;
@@ -521,9 +514,7 @@
 $lang['csv_spreadsheet'] = ‘CSV (Spreadsheet)’;
 
 // logins
-$lang['could_not_find_user'] = ‘Could not find a user “%s”‘;
 $lang['password_blank'] = ‘You left the password blank.’;
-$lang['login_cancelled'] = ‘Login cancelled.’;
 $lang['no_one_logged_in'] = ‘No one is logged in to that server.’;
 $lang['could_not_logout'] = ‘Could not logout.’;
 $lang['unknown_auth_type'] = ‘Unknown auth_type: %s’;
@@ -535,6 +526,7 @@
 $lang['user_name'] = ‘User name’;
 $lang['password'] = ‘Password’;
 $lang['authenticate'] = ‘Authenticate’;
+$lang['login_not_allowed'] = ‘Sorry, you are not allowed to use phpLDAPadmin with this LDAP server.’;
 
 // Entry browser
 $lang['entry_chooser_title'] = ‘Entry Chooser’;
@@ -565,7 +557,6 @@
 $lang['could_not_rename'] = ‘Could not rename the entry’;
 
 // General errors
-$lang['php5_unsupported'] = ‘phpLDAPadmin does not yet support PHP 5. You will likely encounter many weird problems if you continue.’;
 $lang['mismatched_search_attr_config'] = ‘Your configuration has an error. $search_attributes must have the same number of attributes as $search_attributes_display.’;
 
 // Password checker
@@ -577,7 +568,6 @@
 
 // Templates
 $lang['using'] = ‘Using the’;
-$lang['template'] = ‘template’;
 $lang['switch_to'] = ‘You may switch to the ‘;
 $lang['default_template'] = ‘default template’;
 
@@ -671,4 +661,22 @@
 // default template
 $lang['t_check_pass'] = ‘Check password…’;
 
+// compare form
+$lang['compare'] = ‘Compare’;
+$lang['comparing'] = ‘Comparing the following DNs’;
+$lang['compare_dn'] = ‘Compare another DN with’;
+$lang['with'] = ‘with ‘;
+$lang['compf_source_dn'] = ‘Source DN’;
+$lang['compf_dn_tooltip'] = ‘Compare this DN with another’;
+$lang['switch_entry'] = ‘Switch Entry’;
+$lang['no_value'] = ‘No Value’;
+$lang['compare_with'] = ‘Compare with another entry’;
+$lang['need_oclass'] = ‘You need one of the following ObjectClass(es) to add this attribute %s.’;
+
+// Time out page
+$lang['session_timed_out_1'] = ‘Your Session timed out after’;
+$lang['session_timed_out_2'] = ‘min. of inactivity. You have been automatically logged out.’;
+$lang['log_back_in'] = ‘To log back in please click on the following link:’;
+$lang['session_timed_out_tree'] = ‘(Session timed out. Automatically logged out.)’;
+$lang['timeout_at'] = ‘Inactivity will log you off at %s’;
 ?>

2004年11月13日

安装 wxWidgets 2.5.3
中文翻译:张雪平(heromyth)
原文:wxWidgets 2.5.3 安装说明
————————–
 
用于Microsoft Windows 9x/ME、 Windows NT、Windows 2000 它还是个不稳定的发行版。
注意这里的不稳定并不意味着会经常崩溃,只是在2.5分支的生命期间,API库在向后兼容方式可能会产生一些变化。
 
重要注意: 如果你安装里遇到了问题,请在给wx用户发邮件之前,再仔细读读这篇说明以及其它相关的文件(changes.txt, readme.txt, FAQ)。最好是能先试着解决这个问题,然后将补丁上传到SourceForge:
 
  http://sourceforge.net/patch/?group_id=9863
 
请使用SourceForge错漏跟踪器(bug tracker)报告错漏:
 
  http://sourceforge.net/bugs/?group_id=9863
 
解压
===========
 
提供的安装程序(setup.exe)会自动把文件复制到你硬盘上的某个目录里。不要安装到一个包含有空格的路径里。
 
安装程序包含了下面的内容:
 
- 所有常见的、一般的和MSW类型的wxWidgets源码;
- 样例和演示;
- MS HTML Help 格式的文档;
- 针对大部分Windows编译器的make文件,包括CodeWarrior、BC++ 和 VC++ IDE 文件;
- JPEG 库源码;
- TIFF 库源码;
- 图形对象库、Tex2RTF、wxSTC等等。
 
另外,你也可以通过手工解压.zip:
wxMSW-x.y.z.zip,这里x.y.z是版本号。
 
将必需的文件加上一些可选的文档解压到一个合适的目录,例如:c:\wx。
 
一般的安装注意事项
==========================
 
如果是从CVS服务器安装的话,就将include/wx/msw/setup0.h复制为include/wx/msw/setup.h,然后编辑该文件,选择你想要(或不想要的)功能,编译wxWidgets。
 
编译
===========
 
下面这部分说明的是如何使用每一个所支持的编译器来编译wxWidgets。查找Microsoft/Borland/Watcom/Symantec/Metrowerks/
Cygwin/Mingw32其中之一,快速定位针对你的编译器帮助说明。
 
所有的make文件和工程文件都位于build\msw目录里。
 
编译后的文件存放的地方。
——————————-
 
在成功编译之后,你就会发现整个库都在一个lib目录的子目录里,该目录是根据编译器和DLL/static(动态/表态)设置来命名。
一此实例:
 
  lib\vc_lib                    VC++ 编译后的静态库
  lib\vc_dll                    VC++ 动态库
  lib\bcc_lib                   Borland C++ 的静态库
  lib\wat_dll                   Watcom C++ 动态库
 
编译后的wxWidgets库的名字遵循下面的规则:不依赖于GUI组件的库会以”wxbase”开头,紧跟着是版本号,然后的字母表明这个库是否是编译为Unicode (‘u’)和/或是否编译成debug(‘d’)。名字中的最后部分是wxWidgets组件的名字(除非你想建立个单一完整的库;查看后面的”配置build”)。这个是一套典型的ANSI build发行库(发行版在左边,debug版在右边):
 
  wxbase25.lib              wxbase25d.lib
  wxbase25_net.lib          wxbase25d_net.lib
  wxbase25_xml.lib          wxbase25d_xml.lib
  wxmsw25_core.lib          wxmsw25d_core.lib
  wxmsw25_html.lib          wxmsw25d_html.lib
  wxmsw25_adv.lib           wxmsw25d_adv.lib
 
在wx世界里它们的Unicode debug版本就会是:
 
  wxbase25ud.lib
  wxbase25ud_net.lib
  wxbase25ud_xml.lib        (注意这些库对于wx世界和wxMSW是一样的)
  wxmswuniv25ud_core.lib
  wxmswuniv25ud_html.lib
  wxmswuniv25ud_adv.lib
 
这些目录还包含有一个子目录,里边存放的是wx/setup.h。这个目录是port、Unicode、wxUniv和debug设置来命名的,而且在你编译你的应用程序时,你必须把它增加到include(包含)路径里。 一些例子:
 
  lib\vc_lib\msw\wx\setup.h          VC++ static, wxMSW
  lib\vc_lib\mswud\wx\setup.h        VC++ static, wxMSW, Unicode, debug
  lib\vc_lib\mswunivd\wx\setup.h     VC++ static, wxUniversal, debug
 
下面先是对特定编译器的说明,紧接着是针对所有编译器(搜索”配置build”)的一般说明。
 
Microsoft Visual C++ 编译
——————————–
 
想要更多更详细的说明,你可以访问http://wiki.wxwindows.org/wiki.pl?MSVC
 
请注意VC++ 6.0工程文件也适用于VC++ .NET。
 
还要注意,你可以使用VC++ 5.0来make工程文件,只是你事先需要手工编辑 .dsp 文件(把 .dsp 文件里开关部分里的版本号从6.0更改为5.0)。
 
使用工程文件(VC++ 6及以后版本):
 
1. 解压wxWidgets-x.y.z-vc.zip和VC++ 6 工程make文件(已经包含在wxMSW-x.y.z.zip和安装版本中)。
2. 打开build\msw\wx.dsw,里边是关于静态编译或DLL编译的配置,而且还提供了Unicode/ANSI,Debug/Release(调试/发行)和wxUniversal 或 native variations(本地环境)的选项设置。通常,你可以使用静态连接ANSI配置。 选择Win32 Debug或Win32 Realease配置(或者其它适合你需要的),然后使用Batch Build(批处理建立)来编译所有的项目。 如果有些库你不需要(例如html部分),你可以不编译它。它也会生成类似jpeg.lib,png.lib,tiff.lib,zlib.lib和regex.lib这样一些库。如果你想建立DLL,你必须一个一个依着正确的顺序(jpeg,png,tiff,zlib,regex,expat,base,core,其它的任意)来编译它们,或使用wx_dll.dsw(里边有正确的依赖关系)。
3. 打开一个样板工程文件,使用Build | Set Active Configuration选择一种配置,如Win32 Debug,然后编译。该文件没有使用预编译头文件,为的是节省磁盘空间,不过你可以把PCH编译打开,这样可以得到更快的速度。 注意:你也可以使用samples/samples.dsw来访问所有的工程实例,而无需逐个去打开。 你可以使用Batch Build(批处理建立)功能来在同时make多个样例。
 
使用makefiles:
 
1. 改换目录到build\msw。 输入:
 
  ‘nmake -f makefile.vc’
 
   来建立release DLL类型的wxWidgets核心库。 查看”Configuring the build(配置build)”可以得到更多的关于如何建立调试库或静态库的说明。
 
2. 切换目录到samples,然后输入’nmake -f makefile.vc’来make所有的样例。你也可以单个地来make它们。
 
Makefile注意:
 
  使用’clean’目标来清理所有的对象文件、库文件和可执行文件。
 
注释(1):如果你想使用样板文件(templates),请编辑include\wx\msw\setup.h,设置wxUSE_DEBUG_NEW_ALWAYS为0。不这样做的话,’new’的重新定义(redefinition)就会在头文件中引起问题。另外,在包含样板头文件之前使用 #undef new 也可以。如果想要使用样板的话,你还需要把wxUSE_IOSTREAMH设置成0,以避免非样板流(non-template stream)文件被包含进入wxWidgets。
 
注释(2): 使用makefiles和工程文件生成的库和应用程序现在(很有希望的)与涉及到静态库的地方是兼容的,不过还是要小心,可能的话就使用一种方法或其它的。
 
注释(3): 有些崩溃的问题可能要归因于不正确的编译器选项。如果出现了奇怪的/不可思议的/不可能的的事情,就请检查(如果有必要,就导出IDE工程文件为makefile,然后进行文本的比较)工程的设置,尤其是符号(symbols)的定义列表、结构包等等,对于工程里的所有条目来说实际上是相同的。这样做了之后,把所有内容删除掉(包括PCH),重新编译。
 
注释(4):想要建立你自己的IDE文件,你可以从已有的wxWidget样例中复制.dsp和.dsw文件,然后调整它们,或访问http://wiki.wxwindows.org/wiki.pl?MSVC
 
Borland C++ 5.0/5.5 编译
——————————-
 
使用makefile(更新到24 Sept 02)编译:
 
1. 改换目录到build\msw。 输入’make -f makefile.bcc’来建立wxWidgets核心库。忽略编译器的警告信息。这样在lib\bcc_lib目录下就会生成一些库。
 
2. 切换到样例或演示目录,如samples\minimal,然后输入’make -f makefile.bcc’。这样就会生成一个windows的exe文件——默认在bcc_mswd子目录里。
 
注释(1): wxWidgets的makefiles假定的是dword structure alignment(双字节结构对齐方式)。请确认你自己的工程或makefile弃置使用的是同样的对齐方式,否则你能会遇到一些奇特的错误。想要更改对齐方式,需要改变build\msw\config.bcc里的CPPFLAGS。
 
注释(2): 如果你在连接里看到”undefined _SQL… “这样的符号,表示需要从BC++ 光盘安装odbc32.lib到你的BC++库目录里,或者在include\wx\msw\setup.h里把设置wxUSE_ODBC设置为0,然后重新编译wxWidgets。如果使用IDE来编译,需要做同样的工作。
 
注释(3): 如果你希望以调试模式的方式将调试信息发送到控制台(console),那么就编辑makeifle.bcc,在连接命令处把/aa改为/Tpe。
使用Borland C++ 5.0的IDE来进行编译: 不支持——请使用2.4.1版本(使用make工具,以命令行模式工作不错)。使用CBuilder (v1-v6)来编译: 不支持——请使用2.4.1版本(使用make工具,以命令行模式工作不错)。
 
** 记住 **
 
在你所有的wxWidgets应用程序中,你的源码应该包含预处理块:
 
#ifdef __BORLANDC__
#pragma hdrstop
#endif
 
(更多信息可以查看样例——如\wx2\samples\minimal\minimal.cpp)
 
使用Windows 3.1下的Borland 16 位编译器
——————————————
 
wxWidgets支持使用Borland的16位的编译器的最新版本是2.27——请下载阅读该发行版的说明。
 
使用Watcom C++ 10.6/11 和 OpenWatcom 的编译说明
———————————————
 
1. 改换目录到build\msw。 输入’make -f makefile.wat’来建立wxWidgets核心库。
 
2. 切换目录到samples\minimal,然后输入’wmake -f makefile.wat’来make这个样例。 对其它感兴趣的样例可以重复这个操作。
 
注释(1):如果你安装的Watcom里没有odbc32.lib文件,而你又需要它(如你使用了wxUSE_ODBC=1),那么你可以从lib\watcom目录里使用这个文件。看看那个目录里的说明。
 
注释(2): 如果编译variant.cpp时带上了date/time类选项,则连接器会出错。 因此对于Watcom C++就最好将date/time选项关闭。
同样,wxAutomationObject也不能使用Watcom C++ 10编译。
 
注释(3): 目前RawBitmaps还不能工作,因为他们使用了不被支持的样板类(template classes)。
 
注释(4): 如果在编译样例时Watcom不能读取预编译头文件,试试把build\msw\wat_*里的 .pch 文件删除,然后再编译。
 
使用Metrowerks CodeWarrior编译
———————————-
 
1. 格式为XML的CodeWarrior Pro7工程文件已经包含在了wxMSW-2.5.3.zip 和安装版本中。
 
2. 查看一下文件include\wx\msw\setup.h (或 include\wx\msw\setup0.h,如果你是从CVS版本工作的话),确认那些设置是你所想要的。  如果你还不敢确认,就别管它,使用默认值就行了。一些注意项:
       – 不要使用wxUSE_DEBUG_NEW_ALWAYS: 它与MSL兼容不好
       – wxUSE_GLOBAL_MEMORY_OPERATORS 可以工作,不过内存峰值会因为MSL ANSI 和 runtime libs(运行库)的交替影响让人感到迷惑。
 
3. 用来编译Win32的wxWidgets库的工程文件依赖于”Batch File Runner”插件。 这个插件并没有做为CW7一般安装的部分。 
不过,你可以在CodeWarrior Reference CD中找到这个插件,位于Thrill Seekers目录里面;它会调用”Batch File Post
Linker”。
 
4. 如果你安装不选择Batch File Runner插件,那么你需要手工执行以下操作:
      (1) 建立目录 lib\cw7msw\include\wx ,然后复制文件 include\wx\msw\setup.h (或 include\wx\msw\setup0.h 如果你工作在CVS版本上) 到 lib\cw7msw\include\wx\setup.h
      (2) 建立目录 lib\cw7mswd\include\wx ,然后复制文件 include\wx\msw\setup.h (或 include\wx\msw\setup0.h 如果你工作在CVS版本上) 到 lib\cw7mswd\include\wx\setup.h
 
5. 通过导入 src\wxWidgetsW7.xml 来建立工程文件 wxWidgetsW7.mcp。 将这个工程文件存放在src目录里。可能会有警告信息提示你有些工程路径没有找到;忽略就行了,相关的路径会在使用Batch File Runner来build(建立)的过程中创建。
 
6. 选择输出 wxlib Win32 debug 或 wxlib Win32 Release ,然后build(建立)。你会看到关于隐藏虚拟函数的警告信息,以及关于从常量指针转换为指针的非法转换的信息等等,所有这些你都可以安全地忽略不管。 ***注意:如果有错误提示编译器不能找到”wx/setup.h”,只需要停止build,然后再次build。这些错误的发生是因为编译器有时在复制 setup.h 还没完成之前就开始编译了。
 
7. 根据你的选择下列库就可能产生
   目标库:
       – wx_x86.lib             ANSI Release (static)
       – wx_x86_d.lib           ANSI Debug (static)
 
8. 实在对不起,我没有时间来建立和测试unicode或DLL版本了。欢迎自愿者加入(对我来说build DLL和unicode并不重要)。
 
9. 也一些实例提供了CodeWarrior Pro7的工程文件(XML格式)。像minimal,controls,dialogs,dnd,nd docview等实例都有。可以使用这些工程文件做为样板用于其它实例和你自己的工程。
       – 例如,为实例”grid”创建工程文件,就只需要复制”minimal”的工程文件——minimalW7.mcp(将minimalW7.xml导入CodeWarrior来生成),到sample/grid目录,命名为gridW7.mcp。打开newgridW7.mcp,然后修改这个工程文件:删除里边的minimal.rc和minimal.cpp,增加griddemo.rc 和 griddemo.cpp。  Build 然后 run(运行)….
 
 
使用Cygwin/MinGW来编译
————————
 
wxWidgets 2 支持 Cygwin (以前的 GnuWin32) beta版和发行版,以及MinGW。 下载Cygwin可以从:
 
    http://sources.redhat.com/cygwin/
 
而下载MinGW则可以从:
 
    http://www.mingw.org/
 
Cygwin 和 MinGW 都可以使用configure (对于MinGW,假设你安装了的MSYS)。 你需要一个较新的MinGW版本,最好是MinGW 2.0 (带有 gcc3) 或者最低也要1.0 (gcc-2.95.3). GCC 版本早于 2.95.3 的话,可能不工作;对于它们你可以使用 wxWidgets 2.4 。
 
注意: 一些注意项是针对老版本的Cygwin (< 1.1.x)的,它们就在这段的后面(查看OLD VERSIONS)。
 
有两种方法可以编译wxWidgets:使用提供的makefiles或使用’configure’。
 
下载安装最新版的 Cygwin或MinGW,参考个自包里的说明。
 
如果使用MinGW,你可以下载附加包 MSYS——它提供了类Unix的工具,你在使用configure来build(建立)wxWidgets 时会使用到。
 
直接使用makefile
————————


注意: makefile.gcc 是用在MinGW里的,而MinGW使用的是本地make和Windows命令解释器(command.com/cmd.exe),在其它环境里(如UNIX或类Unix,例如MSYS,此时你必须使用configure)它们不会工作。
 
这里是使用提供的makefile所必须的几个步骤:
 
- 如果你使用的是gcc-2.95,则编辑 build\msw\config.gcc 并且设置变量 GCC_VERSION 为 “2.95″。
 
- 如果你使用 GCC 3.x 来编译,而且使用makefiles,而wxUSE_STL == 1,那么你就需要把 -DNO_GCC_PRAGMA 手工增加到config.gcc里CXXFLAGS 。
 
- 使用文件makefile.gcc 来编译 wxWidgets 和实例,例如编译一个调试(debugging)版本的 wxWidgets:
  > cd c:\wx\build\msw
  > make -f makefile.gcc BUILD=debug
  > cd c:\wx\samples\minimal
  > make -f makefile.gcc BUILD=debug
  (更多选项请看下面。)
 
  忽略关于默认入口点(default entry point)的警告信息。
 
- 使用命令 ’strip’来减小executable(可执行文件)/dll 的大小(注意strip一个executable/dll会移除调试信息!)。
 
所有的target(目标)都有一个’clean’,可以用来清除目标文件和其它临时编译文件。
 
使用configure
—————
 
不使用makefile的话,你可以使用configure系统来生成相关的makefile,就象在Unix和Mac OS X系统上一样。
 
切换路径到wxWidgets的安装目录,创建一个build目录,然后运行configure,接着在这个目录里make。
 
举例:
 
  cd $WXWIN
  mkdir build-debug
  cd build-debug
  ../configure –with-msw –enable-debug –enable-debug_gdb –disable-shared
  make
  make install % 这一步是可选的,查看下面的“注释(8)”。
  cd samples/minimal
  make
  ./minimal.exe
 
注释:
 
1. 关于与这些编译器一起使用wxWidgets的更多信息,可以查看Cygwin/MinGW 的网页或光盘。
 
2. libwx.a 有 100 MB 或更大 – 不过如果编译时使用no debug info (-g0)(不带调试信息)和level 4 optimization (-O4)(4级优化),它会更小些
 
3. 如果你在MinGW 2.95.2 下看到下面的连接错误信息:
 
   EnumDAdvise__11IDataObjectPP13IEnumSTATDATA@8
 
   那么你需要编辑文件objidl.h 的663行,增加漏掉的关键启事PURE:
 
   STDMETHOD(EnumDAdvise)(THIS_ IEnumSTATDATA**) PURE;
 
4. MinGW早期发行的版本里的头文件有个bug。
 
   在include/windows32/defines.h里,显示为:
 
   #define LPSTR_TEXTCALLBACKA (LPSTR)-1L)
 
   的地方,应该是:
 
   #define LPSTR_TEXTCALLBACKA ((LPSTR)-1L)
 
   (漏了一个括号)。
 
5. OpenGL的支持本来应该可以和MinGW一起工作的。 不过,  如果你想生成导入库(import libraries) 用做MS OpenGL 库或SGI OpenGL 库,那么就到include/wx/msw/gl里,使用:
 
     dlltool -k -d opengl.def -llibopengl.a
 
   来用于SGI DLLs,或
 
     dlltool -k -d opengl32.def -llibopengl32.a
 
   而于对于glu[32].def有类似的操作。
 
6. ‘make install’这一步是可选项的,然后复制下列文件:
 
   /usr/local/lib – wxmswXYZd.dll.a 和 wxmswXYZd.dll
   /usr/local/include/wx – wxWidgets 头文件
   /usr/local/bin – wx-config
 
   如果你使用带有默认根路径的wx-config,就可能需要这样做。
 
7. 对于Cygwin,你可以使用gdb –nw myfile.exe来调试一个可执行文件。 如果有内存漏洞的号,在程序退出时他们会给出标识。你可以使用Cygwin gdb来调试MinGW执行文件。
 
对于老版本:
 
- 修改文件 wx/src/cygnus.bat (或 mingw32.bat 或 mingegcs.bat) 来设置相关的变量,如果有必要就加载驱动器(mounting drives)。 在编译之前运行。
 
- 对于Cygwin,请确认在你的Windows系统里有 \tmp 目录,否则“小牛(bison)”会发疯的(实际上对于一般的wxWidgets编译,你并不需要“bison”: 提供有文件pre-generated .c)。
 
- 如果使用 GnuWin32 b18,你会需要把 windres.exe 从例如MinGW发行包一样的工具集,复制到你的path(路径)上的一个目录里。
 
 
使用Symantec & DigitalMars C++ 编译工具
————————————–
DigitalMars编译器是Symantec编译器的免费后继者,可以从http://www.digitalmars.com/下载到。
  
1. 你需要下载然后解压(最新的文件会覆盖以前的)
      Digital Mars C/C++ 编译器,版本为8.40 或以后的
      基本的工具可以从
   http://www.digitalmars.com/download/freecompiler.html下载得到
 
2. 切换目录到build\msw ,接着输入’make -f makefile.dmc’ 来建立(make)wxWidgets核心库。
 
3. 切换目录到samples\minimal,然后输入’make -f makefile.dmc’来make这个样例。 对于其它大部分的样例同样有效。
 
 
注意,如果你没有文件makefile.dmc,你可以使用bakefile工具自己建立一个,参考build\bakefiles\README里的说明:
 
    cd build\bakefiles
    bakefile_gen -f dmars -b wx.bkl
    bakefile_gen -f dmars -b ../../samples/minimal/minimal.bkl
 
 
16-bit 编译已经不再被支持。
 
Configuring the build(配置build)
=====================
 
目前,本指导只解释了如何build(建立)wxWidget的发行版DLL,而并没有涉及任何配置。它可以要改动到build的方方面面,包括debug/release和ANSI/Unicode设置。build\msw目录下的所有文件都使用了相同的选项(除了一些例外的,下面有说明),而且两者间唯一的不同在于目标文件名和库目录名以及make命令格式。
 
更改设置
———————
 
更改设置有两种方式: 在调用make时通过参数把值传过去;或编辑 build\msw\config.$(compiler) 文件,这里的 $(compiler) 与你使用的makefile文件具有相同的扩展名(看下面)。 第二种比较适合于设置这样的选项:它们在你的开发过程中基本上不会变化(例如 GCC_VERSION 或 VENDOR)。 如果你想build多个wxWidget版本,并一起使用它们,则前一个方法相对要更好引起。文件config.*里的设置被所有的makefiles(样例,contrib,主要库)所共享,但是如果你把这些选项做为参数传递,你就必须要使用你在build样例或contrib库时所使用过的相同的参数!
 
以Unicode debug build 方式(下面所描述的其它选项也相应地被设置)调用make的例子:
 
Visual C++:
  > nmake -f makefile.vc BUILD=debug UNICODE=1
 
Borland C++:
  > make -f makefile.bcc -DBUILD=debug -DUNICODE=1
  (注意,必须使用 -D 来设置变量,和其它的make工具有些不一样!)
 
Watcom C/C++:
  > wmake -f makefile.wat BUILD=debug UNICODE=1
 
MinGW 使用本地 makefiles:
  > mingw32-make -f makefile.gcc BUILD=debug UNICODE=1
 
MinGW 使用 configure 或 Cygwin:
  > ./configure –enable-debug –enable-unicode
  (使用 ./configure –help 查看详细信息;在这里并不涉及configure)
 
 
选项的简要说明和可能的取值都在各自的 build\msw\config.* 文件里;更详细的信息描述如下。
 
基本选项
————-
 
BUILD=debug
  建立debug(调试)版本的库(默认是 ‘release’)。这个会影响库的名字(增加一个’d'),会定义__WXDEBUG__,而且调试信息也会被编译进目标文件和执行文件里。
 
SHARED=0
  建立静态库,而不是DLL(动态库)。默认是建立DLL(SHARED=1)。
 
UNICODE=1
  要建立Unicode版本的库,需要增加UNICODE=1命令行(默认是UNICODE=0)。如果你想在Windows9x上使用 Unicode 版本,你另外还需要设置 MSLU=1。
 
  这个选项会影响库的名字(增加 ‘u’)和目录名(里边存放有库和setup.h),同上。
 
WXUNIV=1
  建立xUniversal而非本地wxMSW (查看 http://www.wxwidgets.org/wxuniv.htm 可以获得更多信息)。
 
高级选项
—————-
 
MONOLITHIC=1
  从版本2.5.1开始,wxWidgets可以build为多个小库,而不象在过去的2.4版本和更早版本里,只能是一个单独的大库。这个叫做
“multilib build(多库建立)” ,而且它是makefile的默认动作。你仍然可以建立单个库(“monolithic build”),方法是设置变量MONOLITHIC为1
 
USE_GUI=0
  禁止建立库的GUI 部份,只建立控制台(console)程序使用的 wxBase 组件。注意如果你设置 USE_GUI=1 ,那么wxBase 和 GUI 库都要建立。 如果你正在建立monolithic库,那么你就应该在setup.h里把 wxUSE_GUI 设置为1
 
USE_OPENGL=1
  建立带有集成OpenGL的类wxGLCanvas的wxmsw25_gl.lib 库. 你必须修改setup.h 里的 #define wxUSE_GLCANVAS 1。注意OpenGL库总是build成为附加库,即使是以monolithic build方式!
 
USE_ODBC=1
  以multilib模式建立两个附加库:一个带有数据库类;另一个带有wxGrid数据库支持。你必须在 setup.h 设置:#define wxUSE_ODBC 1
 
USE_HTML=0
  不建立wxHTML库。 如果 MONOLITHIC=1,那么你也必须在 setup.h 里设置:#define wxUSE_HTML 1


USE_XRC=0
  不建立XRC资源库。如果MONOLITHIC=1,那么你就必须在setup.h里设置:#define wxUSE_HTML 1
 
RUNTIME_LIBS=static
  连接静态版本的C和C++ 运行库到执行文件,这样程序就不会依赖编译器(如果Visual C++的msvcrt.dll 或
Borland的cc3250mt.dll)所提供的DLL。 小心: 在建立DLL(SHARED=1)时,不要使用静态运行库!
 
MSLU=1
  启用MSLU (Microsoft Layer for Unicode)。这个设置只有与UNICODE=1一起使用才有意义。如果你想在Windows9x上使用 Unicode 版本,你就会需要 MSLU (Microsoft Layer for Unicode) 运行DLL和导入库(import lib)。 前者可以从Microsoft下载到,后者是Microsoft的最新SDK平台的一部份(更多信息请看msdn.microsoft.com)。 导入库的另外一个实现工具可以从http://libunicows.sourceforge.net(与官方有所不同)下载到,这个可以与其它编译器一起工作,而且不会要求更新到大于300M的SDK平台。
 
DEBUG_FLAG=0
DEBUG_FLAG=1
  如果设置为1,就会定义符号 __WXDEBUG__ ,附加 ‘d’ 到库名里,而且会在运行里做sanity(心智健全)检查。如果设置为0,这种事就不会发生。 默认地,这个由BUILD选项管理(如果是’debug’,那么DEBUG_FLAG=1,如果是’release’,那么它就为0),不过有时会希望修改默认行为,例如即使在建立发行版时定义 __WXDEBUG__ 。
 
DEBUG_INFO=0
DEBUG_INFO=1
  动作同 DEBUG_FLAG 一样,这个选项会影响在可执行文件中是否要包含调试信息。
 
VENDOR=<你的公司的名字>
  如果你计划在你的应用程序发行版中带上 wxWidgets DLLs ,那么设置这个短字符串来标识你的公司。 默认值是 ‘custom’。这个串会做为DLL名字的一部分而被包含。wxWidgets DLLs 包含了编译器名、版本信息和产商名称。 例如wxmsw250_core_bcc_custom.dll 就是这样一个DLL——使用Borland C++ 和默认设置来建立的。 如果你设置VENDOR=mycorp,则名字就会变为 wxmsw250_core_bcc_mycorp.dll。
 
CFG=<配置的名称>
  设置配置的名称为的是让你可以使用都存在于相同目录树里的不同 setup.h 设置来实现多个 wxWidgets builds。更多信息请看下面的”目标文件和库文件目录”。
 
特殊的编译器选项
————————-
 
* MinGW
 
如果你使用gcc-2.95 而不是 gcc3的话,你就必须要设置 GCC_VERSION 成为 2.95。 在 build\msw\config.gcc里,更改
> GCC_VERSION = 3

> GCC_VERSION = 2.95
 
* Visual C++
 
DEBUG_RUNTIME_LIBS=0
DEBUG_RUNTIME_LIBS=1
  如果设置为1,msvcrtd.dll 就会使用到;如果设置为0,则会用到msvcrt.dll。默认情况下,只要执行文件包含了调试信息就会用到msvcrtd.dll,而如果不有就会用到msvcrt.dll。有时希望在build时带上调试信息,而且仍然连接到 msvcrt.dll(例如你想把应用程序发布给用户,而且还要带上可用的带有调试信息的 .pdb 文件),那么就可以使用这个设置了。
 
微调编译器
————————
 
所有的makefile都有这样的一些变量——你可以用来指定附加的选项传递给编译器或连接器。大部分情况下你不需要这样做,不过如果你想的话,只须简单地增加想要的标识到 CFLAGS (对于C编译器)、CXXFLAGS (对于C++ 编译器)、CPPFLAGS (对于 C 和 C++ 两种编译器) 和 LDFLAGS (连接器)。
 
目标文件和库文件目录
——————————
 
在建立库文件期间所有生成的目标文件都存放在build\msw目录下。 它的名字继承于build设置和CFG变量以及编译器名字。 目录名的例子:
 
  build\msw\bcc_msw            SHARED=0
  build\msw\bcc_mswdll         SHARED=1
  build\msw\bcc_mswunivd       SHARED=0, WXUNIV=1, BUILD=debug
  build\msw\vc_mswunivd        ditto, with Visual C++
 
库和DLLs 都被复制到lib目录下的的某子目录里——它的名字来源于编译器、static/DLL 设置,而setup.h会被复制到这样一个目录——其名字包含了其它人设置:
 
  lib\bcc_msw
  lib\bcc_lib\msw\wx\setup.h
  lib\bcc_dll
  lib\bcc_dll\msw\wx\setup.h
  lib\bcc_lib
  lib\bcc_lib\mswunivd\wx\setup.h
  lib\vc_lib
  lib\vc_lib\mswunivd\wx\setup.h
 
正如上面看到的,每一个lib\子目录里都有带着setup.h的 wx 子目录。这个文件是从include\wx\msw\setup.h复制来的(如果它不存在,可以使用include\wx\msw\setup0.h),而且它是被所有的样例使用的setup.h的复本,也应该在你的程序中使用。如果你更改了setup.h,你应该在这个文件里完成,而不要更改 include\wx\msw\setup.h。
 
如果你给CFG进行了设置,该值会被添加到目录名里。例如 CFG=MyBuild,你就会在下面的目录里找到目标文件:
 
  build\msw\bcc_mswMyBuild
  build\msw\bcc_mswdllMyBuild
  等等。
 
而库文件存放在:
 
  lib\bcc_libMyBuild
  lib\bcc_dllMyBuild
  等等。
 
现在清楚CFG是什么了吧: 在build时,使用不同的CFG设置并不会共享任何文件,而且使用不同的setup.h文件。 例如这就允许你有两个静态调试库,一个带有wxUSE_SOCKETS=0,而另一个带有可用的socket(没有CFG,它们两个都会放到相同的目录里,而在它们之间会有冲突)。
 
注意事项
=============
 
- 调试: 在 Windows 95 下,调试的输出与 NT 或 Windows 3.1下的输出是不一样的。  
请在http://www.sysinternals.com查看DebugView。
 

2004年10月24日

安装Python-LDAP

本文主要讲述将Python-LDAP安装到Zope平台里的Python中。

一、下载


http://python-ldap.sourceforge.net/
http://www.zope.org/Members/volkerw/LdapWin32
下载windows版本的程序

地址:http://zope.org/Members/volkerw/LdapWin32/python-2.3-ldap/python-2.3-ldap-2.0.0pre11.win32.zip

下载LDAPUserFolder 2.4:http://www.dataflake.org/software/ldapuserfolder/ldapuserfolder_2.4/LDAPUserFolder-2_4.tgz/download

下载ldap32.dll http://zope.org/Members/barryp/win32_ldap

二、安装

1、将ldap32.dll复制到zope里的python安装目录下(我的是D:\Program Files\Zope-2.7.0\bin)

2、解压python-2.3-ldap-2.0.0pre11.win32.zip,将释放出的lib目录下的所有内容复制到python安装目录的lib目录下。其结果是会在其下面的子目录site-packages中多出一个ldap目录。(我的结果是:D:\Program Files\Zope-2.7.0\bin\Lib\site-packages\ldap)

3、安装OpenLDAP服务器(参考我的另外一篇关于在“FreeBSD下安装OpenLDAP服务器”的文章)

三、启动测试

在dos窗口中

> “D:\Program Files\Zope-2.7.0\bin\python.exe”

执行以下命令进行测试

>>> import ldapurl

>>> ldap_url=ldapurl.LDAPUrl(‘ldap://locahost:389/cn=Manager,dc=example,dc=com??base?(objectClass=*)’)

>>> ldap_url.dn

‘cn=Manager,dc=example,dc=com’

四、实例演示

利用本人写的“FreeBSD中安装OpenLDAP”中的例子进行演示

 启动Python

>>> import ldap >>> l=ldap.initialize("ldap://localhost:389") >>> l.simple_bind_s("","") >>> l.search_s("dc=example,dc=com",ldap.SCOPE_SUBTREE,"objectclass=*") [ ('dc=example,dc=com', {'objectClass': ['dcObject', 'organization'], 'dc': ['example'], 'o': ['Example Corporation'], 'description': ['The Example Corporation']}), ('cn=Manager,dc=example,dc=com', {'objectClass': ['organizationalRole'], 'cn': ['Manager'], 'description': ['Directory Manager']}), ('ou=People,dc=example,dc=com', {'objectClass': ['top', 'organizationalUnit'], 'ou': ['People'], 'description': ['User Info']}), ('cn=Admin,dc=example,dc=com', {'objectClass': ['top', 'person', 'organizationalPerson'], 'userPassword': ['Admin'], 'description': ['Administrator for example.com'], 'cn': ['Admin'], 'sn': ['Admin']}), ('uid=abc,ou=people,dc=example,dc=com', {'objectClass': ['person', 'organizationalPerson', 'inetOrgPerson'], 'userPassword': ['abcabc'], 'cn': ['zs'], 'uid': ['abc'], 'sn': ['zhangs']}), ('uid=aaa,ou=people,dc=example,dc=com', {'objectClass': ['person', 'organizationalPerson', 'inetOrgPerson'], 'userPassword': ['abcabc'], 'cn': ['aadA '], 'uid': ['aaa'], 'sn': ['aaaa']})] >>> aa=l.search_s("dc=example,dc=com",ldap.SCOPE_SUBTREE,"uid=abc") >>> aa [('uid=abc,ou=people,dc=example,dc=com', {'objectClass': ['person', 'organizationalPerson', 'inetOrgPerson'], 'userPassword': ['abcabc'], 'cn': ['zs'], 'uid': ['abc'], 'sn': ['zhangs']})] >>> aa[0] ('uid=abc,ou=people,dc=example,dc=com', {'objectClass': ['person', 'organizationalPerson', 'inetOrgPerson'], 'userPassword': ['abcabc'], 'cn': ['zs'], 'uid': ['abc'], 'sn': ['zhangs']}) >>> aa[0][1] {'objectClass': ['person', 'organizationalPerson', 'inetOrgPerson'], 'userPassword': ['abcabc'], 'cn': ['zs'], 'uid': ['abc'], 'sn': ['zhangs']} >>> aa[0][0] 'uid=abc,ou=people,dc=example,dc=com' >>> aa[0][1]['sn'] ['zhangs'] 

总结:

    使用ldap.open的方法始终没调试通过,还有在python-ldap的windows中使用
       aa.simple_bind_s(”,”)和aa.protocol_version = ldap.VERSION3
也有问题。在FreeBSD下使用问题没那么严重,但结果也出不来。
    另外在http://www.siosistemi.it/~mcicogni/也有一个windows版本,而且版本还比较新,问题也没那了么多,安装也相对比较简单,它主要是面对单独的Python安装版,如在Zope中使用可以直接解压,再手工安装。好象现在的Python-LDAP它不再需要ldap32.dll了,这是好事情:)
    面对这些问题,还好可以使用ldap.initialize,这些问题的解决还是等以后再说吧。

参考

    http://python-ldap.sourceforge.net/docs.shtml

 

FreeBSD下安装OpenLDAP

一、下载安装

# cd /usr/ports/net/openldap22-server/

# make install -D WITH_SASL -D WITH_SHELL -D WITH_OPENSSL_PORT

安装后显示的主要信息:

************************************************************ The OpenLDAP server package has been successfully installed. In order to run the LDAP server, you need to edit /usr/local/etc/openldap/slapd.conf to suit your needs and add the following lines to /etc/rc.conf: slapd_enable="YES" slapd_flags='-h "ldapi://%2fvar%2frun%2fopenldap%2fldapi/ ldap://0.0.0.0/"' slapd_sockets="/var/run/openldap/ldapi" Then start the server with /usr/local/etc/rc.d/slapd.sh start or reboot. Try `man slapd' and the online manual at http://www.OpenLDAP.org/doc/admin22/ for more information. NOTE: Some variable names have been changed to conform with rc.subr(8) If you are upgrading, you may want to check your configuration with grep ^slapd_ /etc/rc.conf slapd runs under a non-privileged user id (by default `ldap'), see /usr/local/etc/rc.d/slapd.sh for more information. ************************************************************ ===> Registering installation for openldap-server-2.2.15 ===> SECURITY REPORT: This port has installed the following files which may act as network servers and may therefore pose a remote security risk to the system. /usr/local/libexec/slapd This port has installed the following startup scripts which may cause these network services to be started at boot time. /usr/local/etc/rc.d/slapd.sh /usr/local/etc/rc.d/slurpd.sh If there are vulnerabilities in these programs there may be a security risk to the system. FreeBSD makes no guarantee about the security of ports included in the Ports Collection. Please type 'make deinstall' to deinstall the port if this is a concern. For more information, and contact details about the security status of this software, see the following webpage: http://www.OpenLDAP.org/ 

 

二、编辑rc.conf

# vi /etc/rc.conf

新增内容:

slapd_enable=”YES”  

slapd_flags=’-h “ldapi://%2fvar%2frun%2fopenldap%2fldapi/ ldap://0.0.0.0/”‘  

slapd_sockets=”/var/run/openldap/ldapi”

三、启动

# /usr/local/etc/rc.d/slapd.sh start

正确启动后的信息:

Starting slapd.

四、查询测试

# ldapsearch -x -b ” -s base ‘(objectclass=*)’ namingContexts

结果显示

# extended LDIF # # LDAPv3 # base <> with scope base # filter: (objectclass=*) # requesting: namingContexts # # dn: namingContexts: dc=my-domain,dc=com # search result search: 2 result: 0 Success # numResponses: 2 # numEntries: 1

 

五、修改配置文件

# vi /usr/local/etc/openldap/slapd.conf

注意修改红色部分

#系统只包含了第一项,想要加入其它项就只好手工来了, #注意其中的排列顺序,不然会造成服务器不能启动。 #如果不添加其它的则在实际应用过程中会造成很多的属性或对象类不能用。 include /usr/local/etc/openldap/schema/core.schema include /usr/local/etc/openldap/schema/corba.schema include /usr/local/etc/openldap/schema/cosine.schema include /usr/local/etc/openldap/schema/dyngroup.schema include /usr/local/etc/openldap/schema/java.schema include /usr/local/etc/openldap/schema/nis.schema include /usr/local/etc/openldap/schema/inetorgperson.schema include /usr/local/etc/openldap/schema/openldap.schema # Define global ACLs to disable default read access. # Do not enable referrals until AFTER you have a working directory # service AND an understanding of referrals. #referral ldap://root.openldap.org pidfile /var/run/openldap/slapd.pid argsfile /var/run/openldap/slapd.args # Load dynamic backend modules: # modulepath /usr/local/libexec/openldap # moduleload back_bdb # moduleload back_ldap # moduleload back_ldbm # moduleload back_passwd # moduleload back_shell # Sample security restrictions # Require integrity protection (prevent hijacking) # Require 112-bit (3DES or better) encryption for updates # Require 63-bit encryption for simple bind # security ssf=1 update_ssf=112 simple_bind=64 # Sample access control policy: # Root DSE: allow anyone to read it # Subschema (sub)entry DSE: allow anyone to read it # Other DSEs: # Allow self write access # Allow authenticated users read access # Allow anonymous users to authenticate # Directives needed to implement policy: # access to dn.base="" by * read # access to dn.base="cn=Subschema" by * read # access to * # by self write # by users read # by anonymous auth # # if no access controls are present, the default policy # allows anyone and everyone to read anything but restricts # updates to rootdn. (e.g., "access to * by * read") # # rootdn can always read and write EVERYTHING! ####################################################################### # BDB database definitions ####################################################################### database bdb #suffix "dc=my-domain,dc=com" #可以根据你的域名来进行设置 suffix "dc=example,dc=com" rootdn "cn=Manager,dc=example,dc=com" #rootdn "cn=Manager,dc=my-domain,dc=com" # Cleartext passwords, especially for the rootdn, should # be avoid. See slappasswd(8) and slapd.conf(5) for details. # Use of strong authentication encouraged. #设置管理员密码,实在搞不懂就用明码 rootpw secret directory /var/db/openldap-data # Indices to maintain index objectClass eq 

再请特别注意suffix和rootdn部分的内容,因为后面使用ldapadd时会使用到。
关于配置文件中的字母缩写,可以参考文件core.schema(位于/usr/local/etc/openldap/schema/core.schema),它标识了所有这些缩写(有二三十个那么多)。

存盘后重启openldap

# /usr/local/etc/rc.d/slapd.sh restart

六、增加初始条目到目录里

# vi entries.ldif

输入内容:

dn:dc=example,dc=com objectClass: dcObject objectClass: organization dc:example o:Example Corporation description: The Example Corporation dn:cn=Manager,dc=example,dc=com objectClass: organizationalRole cn:Manager description: Directory Manager

注意ldif文件内容的格式(参考http://www.openldap.org/doc/admin22/dbtools.html:
1、首尾不能有空格或空行;
2、’#'符号是注释符;
3、如果一行的开头是一个空格或tab,则表示该行内容与上一行是一个整体;或者说以空格开头的行是上一行的继续——这个小技巧可让你浏览时不至于毫无头绪;
4、如果在一个ldif文件里有多个条目,则各条目之间用空行隔开;
5、更多的空白可用于指令中:指令可以有参数,甚至多个参数。这些参数使用空白隔开。带有空白的参数必须附上双引号:如”loud argument.” 包含双引号或者反斜线符号的参数退出时必须使用反斜线:如 “really \”loud\” argument,”
6、An attribute description may be a simple attribute type like cn or objectClass or 1.2.3 (an OID associated with an attribute type) or may include options such as cn;lang_en_US or userCertificate;binary;
7、Trailing spaces are not trimmed from values in an LDIF file. Nor are multiple internal spaces compressed. If you don’t want them in your data, don’t put them there.
8、新增的条目不能是已经存在的,否则在增加时遇到这样的条目工作就会立刻,致使后面的条目不能增加进去。
9、条目中属性值对中文支持好象不是很好。

ldif实例:

dn: dc=example, dc=com objectClass: top objectClass: organization o: example.com dn: ou=People, dc=example, dc=com objectClass: top objectClass: organizationalUnit ou: People description: User Info dn: cn=Admin, dc=example, dc=com objectClass: top objectClass: person objectClass: organizationalPerson cn: Admin sn: Admin userPassword: Admin description: Administrator for example.com dn: uid=abc, ou=people, dc=example, dc=com objectclass: person objectclass: organizationalPerson objectclass: inetOrgPerson uid: abc sn: abc01 cn: abc02 userpassword: abcabc dn: uid=aaa, ou=people, dc=example, dc=com objectclass: organizationalPerson objectclass: inetOrgPerson uid: aaa sn: aaa01 cn: aaa02 userpassword: abcabc # Barbara's Entry dn: cn=Barbara J Jensen,dc=example,dc=com cn: Barbara J Jensen cn: Babs Jensen objectClass: person sn: Jensen # Bjorn's Entry dn: cn=Bjorn J Jensen,dc=example,dc=com cn: Bjorn J Jensen cn: Bjorn Jensen objectClass: person sn: Jensen # Base64 encoded JPEG photo jpegPhoto:: /9j/4AAQSkZJRgABAAAAAQABAAD/2wBDABALD A4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQ ERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVG # Jennifer's Entry dn: cn=Jennifer J Jensen,dc=example,dc=com cn: Jennifer J Jensen cn: Jennifer Jensen objectClass: person sn: Jensen # JPEG photo from file jpegPhoto:< file:///path/to/file.jpeg

开始增加

# ldapadd -f entries.ldif -x -D “cn=Manager,dc=example,dc=com” -w secret

注意红色部分,应该与前面配置文件中相应部分一致。出现这样的信息:
ldap_bind: Invalid credentials (49)
则通常就是这两处不一致所造成的。

再一次进行查询

# ldapsearch -x -b ‘dc=example,dc=com’ ‘uid=*’

显示结果:

# extended LDIF # # LDAPv3 # base <dc=example,dc=com> with scope sub # filter: uid=* # requesting: ALL # # abc, people, example.com dn: uid=abc,ou=people,dc=example,dc=com objectClass: person objectClass: organizationalPerson objectClass: inetOrgPerson uid: abc sn: zhangs cn: zs userPassword:: YWJjYWJj # aaa, people, example.com dn: uid=aaa,ou=people,dc=example,dc=com objectClass: person objectClass: organizationalPerson objectClass: inetOrgPerson uid: aaa sn: aaaa cn:: YWFkQSA= userPassword:: YWJjYWJj # search result search: 2 result: 0 Success # numResponses: 3 # numEntries: 2 

删除条目

# ldapdelete -D “cn=Manager,dc=example,dc=com” -w secret “cn=Manager,dc=example,dc=com”

修改条目(没有测试)

/opt/openldap/bin/ldapmodify -D “cn=Admin,dc=info,dc=net” -w Admin -f modfile
modfile的格式如下:
dn: id=1, ou=People, dc=info, dc=net
add: shenfenno
shenfenno: 3101037108002

dn: card_id=ABC001, ou=Account, dc=info, dc=net
replace: card_pass
card_pass: DEF001

 

七、利用IE进行查询

在地址栏输入:
ldap://210.41.183.111:389/cn=Manager,dc=example,dc=com??base?(objectClass=*)

显示结果:

关于LDAP URL

一个LDAP URL,和其他的URL相似,具有如下格式:

ldap://<host>/<base>?<attrs>?<scope>?<filter>

这包含了执行一个LDAP搜索所需要的所有元素:服务器的名称<host>,LDAP DN搜索的基<base>,用来获取LDAP属性的<attr>,搜索范围<scope>,<scope>可以使下面的3个选项之一:“base”,“one”或者“sub”,最后是LDAP的搜索过滤<filter>。因为该搜索是在本地机器上执行的LDAP DN搜索,<host>部分将被忽略。基于相同的原因,<attr>部分也被忽略,因为只有DN才是有用的。这两个元素在URL格式中保留是为了使得什么信息在字符串中的什么地方更加清楚。

 

八、使用ldap客户端浏览程序查询

http://www.ldapbrowser.com/下载LDAP Browser 2.6,如果刚开始没有用户请一定选择使用Anonymous bind(在Server properties->Creddentials中选择)

结果图示:

如果一定要使用用户,则用户名应该是配置文件中rootdn部分的内容,即cn=Manager,dc=example,dc=com,密码为rootpw部分的内容secret

 

 参考:

    用OpenLdap建立网络数据库 http://www.chinalinuxpub.com/read.htm?id=1159
    LDAPman RFC page http://www.ldapman.org/ldap_rfcs.html  

 

 

2004年10月21日

Windows下搭建zope开发平台

一、安装Zope

从www.zope.org下载Zope-2.7.2-0(http://zope.org/Products/Zope/2.7.2/Zope-2.7.2-0-win32.exe),直接安装。

安装后,可爱的程序启动文件没有了,在程序组里个与zope相关的组,里边有两个可以执行的快捷项目:一个是用来删除程序用的,而另外一就是建立配置文件用的叫做“Make Zope Instance”(其指向的内容是:”C:\Program Files\Zope-2.7.0\bin\python.exe” “c:\Program Files\Zope-2.7.0\bin\mkzopeinstance.py”)。

建立文件夹C:\www\zope,做为平台的第一个实例根目录。

点击“Make Zope Instance”:

1、在Directory :处输入上而建立的那个文件夹(注意是完整路径);

2、接着输入管理员用户名及密码(请记住了,以后管理的时候要用到);

进入C:\www\zope目录,修改etc目录下的配置文件zope.conf。请根据需要修改,如更改zope服务器的两个端口等。

执行D:\www\zope\bin\runzope.bat,就可以启动zope了。接着打开IE,输入地址(注意应该是完url,而且没有更改配置文件中在端口):http://localhost:8080/,一个页面是不是就出来了呢?

如果访问http://locahlost:8080/manage/,则会进行zope的管理界面,以后的工作主要就在这里边完成!

二、打补丁

补丁的作用主要是增强zope平台对中文的支持。有两种方式

参考:http://www.czug.org/docs/plone/plonebook/Plone_e7_9a_84_e4_b8_ad_e6_96_87_e6_94_af_e6_8c_81/wikipage_view

1、手工操作(没试过,我用的是第2种)

参考:http://www.czug.org/docs/zope/zopehelpcenter/faq/zope-zmi-chinese

在ZMI中,在根的properties页面中,增加一个属性:

 Name:management_page_charset type:string value:utf-8或者mbcs或者gb2312或者big5等 

注意:mbcs仅仅适合于服务器运行在windows平台

2、下载程序修补

下载CMF:http://www.zope.org/Products/CMF/,我用的是CMF-1.4.7.zip;

下载ZopeChinaPak: http://zope.org/Members/panjunyong/ZopeChinaPak,我用的是zopechinapak-0_4.tgz

关闭zope服务器

解压CMF-1.4.7.zip,复制CMFCalendar,CMFCore,CMFDefault,CMFTopic,DCWorkflow到D:\www\zope\Products下;

解压zopechinapak-0_4.tgz,复制ZopeChinaPak到D:\www\zope\Products下

启动zope服务器,补丁完成。

三、在zope做每一个简单的项目

使用到的对象包括:文件夹、页面模板(ZPT)

参考:http://www.czug.org/docs/zope/zopebook/X_e5_88_9b_e5_bb_ba_e5_9f_ba_e6_9c_ac_e7_9a_84Zope_e5_ba_94_e7_94_a8

四、进一步提高

使用到的对象包括:DTML、python script、DTML Method

参考:http://www.czug.org/docs/zope/zopebook/X_e4_bd_bf_e7_94_a8Zope_e7_9a_84_e5_9f_ba_e6_9c_ac_e5_af_b9_e8_b1_a1

      http://zope.org/Documentation/Books/ZopeBook/2_6Edition/ScriptingZope.stx

 

的运用Script来编写程式逻辑和运用Method部分

五、扩展增强zope

1、通过写Product来实现(我还没来得急试)

参考:http://www.czug.org/docs/zope/zopebook/X_e6_89_a9_e5_b1_95Zope

2、使用External Methods

因为zope里的python script功能有限(主要是出于安全的考虑),想要使用其它的主要可能直写python程序,再通过Zope里的External Methods来加入。

参考: http://www.zope.org/Documentation/How-To/ExternalMethods

具体实例:

(1)编写python程序:demo.py

def helloWorld(self):

          ”"”A simple external method.”"”

          return ‘Hello World!’

(2)将demo.py复制到Extensions里

注意这里的Extensions,应该是位置实例根目录下(我的是C:\www\zope\Extensions),而非安装目录下(至少我放到它的下边,操作不成功),还有请注意字母大小写!

进入Zope,在一个测试目录里增加一个External Methods对象

注意,demo.py的装置要放对,还有模块名和函数名也要写正确,不然点击增加时会出现404网页错误!

成功增加后在管理器中的图标,注意中间哪一项

(3)测试test,得到正确输出

 

总结:

   Zope的开发模式与LAMP真的有很大不同,这里只是我这两天参考网上资料后的入门之做,敬请大家指正补充。

相关站点:

http://zope.org/  Zope官方站点

http://zope.cn/   Zope/Plone中文社区

http://www.czug.org/  中文Zope用户组

 

2004年09月30日

FreeBSD 5.2.1 里实现中文桌面

一、安装系统FreeBSD 5.2.1 带X-Server及KDE-3.1.4

使用中文的gnome比较简单,跳过下面的QT升级步骤就行了。

如果想要让gnome的界面也是中文的,只需要在~/.cshrc里加入(因为我的shell是csh,其它的shell需要做相应的调整):

setenv LANG zh_CN.gbk

setenv LC_ALL zh_CN.gbk

setenv LC_ALL zh_CN.eucCN

setenv LANG zh_CN.eucCN

呵呵,就这么简单。

二、利用port升级QT至qt-3.3.3

先更新port树

# cp /usr/share/examples/cvsup/ports-supfile ~

# vi ~/ports-supfile

修改 *default host=CHANGE_THIS.FreeBSD.org
为 *default host=cvsup.cn.FreeBSD.org
注释掉 ports-all 一行
注释掉后面所有不感兴趣的port目录,如:
#ports-french
#ports-german
#ports-hungarian
#ports-japanese
#ports-korean

# cvsup -g -L 2 ~/ports-supfile

删除以面安装的QT

# pkg_info | grep qt

# pkg_delete qt-3.2.1

正式安装

# cd /usr/ports/x11-toolkits/qt33

# make install clean

升级内容:

===>  Cleaning for nas-1.6

===>  Cleaning for libiconv-1.9.2_1

===>  Cleaning for autoconf-2.53_3

===>  Cleaning for gettext-0.13.1_1

===>  Cleaning for gmake-3.80_2

===>  Cleaning for imake-4.4.0

===>  Cleaning for libtool-1.3.5_2

===>  Cleaning for libtool-1.5.8

===>  Cleaning for m4-1.4.1

===>  Cleaning for p5-gettext-1.01_4

===>  Cleaning for pkgconfig-0.15.0_1

===>  Cleaning for qmake-3.3.3

===>  Cleaning for jpeg-6b_3

===>  Cleaning for lcms-1.13,1

===>  Cleaning for libmng-1.0.8

===>  Cleaning for png-1.2.6

===>  Cleaning for tiff-3.6.1_2

===>  Cleaning for perl-5.6.1_15

===>  Cleaning for help2man-1.33.1

===>  Cleaning for cups-base-1.1.19.0

===>  Cleaning for freetype2-2.1.5_1

===>  Cleaning for expat-1.95.8

===>  Cleaning for fontconfig-2.2.3,1

===>  Cleaning for libXft-2.1.6

===>  Cleaning for XFree86-libraries-4.4.0_1

===>  Cleaning for qt-3.3.3

 

三、使用win2000下的字体simsun.ttc及tahoma.ttf

字体放在~/.fonts下面,如果要放到其它的什么地方,建议在/etc/X11/XF86Config中或在~/.fonts.conf加入说明,请参相关的帮助

提示:如假设你将字体安装在/usr/local/zhfonts

如果在XF86Config中使用Load “xtt” ,需要在~/.fonts.conf加入:
     <dir>/usr/local/zhfonts</dir>

如果你在XF86Config中使用Load “freetype”,则需要在/etc/X11/XF86Config中加入:
        FontPath     ”/usr/local/zhfonts/” 

以便系统能在该目录下查找字体发,如果这里设置不当,进入KDE后,在字体列表就可能会找不到自已所安装的字体。在这里我使用的是Load “xtt”

# mkdir ~/.fonts

# cp simsun.ttc ~/.fonts

# cp tahoma.ttf ~/.fonts

# cd ~/.fonts

生成fonts.dir及fonts.scale

提示:生成的工具基本上有三个:

1、使用ttfm.sh

参考:http://www.freebsdchina.org/forum/viewtopic.php?t=1735
http://netlab.cse.yzu.edu.tw/~statue/freebsd/zh-tut/ttfm.html 

让XFree86支持TrueType字体,安装SimSun字体
即使不打算使用FreeBSD做文本编辑这样的工作,安装SimSun字体也是非常必要的,XFree86自带的中文字体看起来很不习惯。
随 FreeBSD 4.7 Release 发行的 Xfree86 版本是 4.2.1 ,Xfree86 4.x已经内建支持 TrueType 字体。有两个不同的模块能够起动这个功能:freetype 和xtt。这里使用的是 xtt 模块。在 /etc/X11R6/lib/X11/XF86Config文件中加入:
Load “xtt”
安装TrueType字体管理软件ttfm,步骤如下:
#cd /usr/ports/chinese/ttfm
#make
#make install
#cd /usr/X11R6/lib/X11/fonts/TrueType
#ttfm.sh –add xttfm simsun.ttf
如果将simsun.ttf文件存放在其他目录下,执行ttfm.sh会自动创建 /usr/X11R6/lib/X11/fonts/TrueType 目录,并在这个目录下创建符号链接simsun.ttf,指向simsun.ttf的实际存储位置。执行完ttfm.sh后,在 /usr/X11R6/lib/X11/fonts/TrueType目录下创建了fonts.scale,fouts.dir和encodings.dir文件。
在/etc/X11R6/lib/X11/XF86Config文件中加入:
FontPath “/usr/X11R6/lib/X11/fonts/TrueType”

2、使用ttmkfdir

此工具对*.ttc字体支持不太好,建议将*.ttc更名为*.ttf,再执行

# ttmkfdir > fonts.dir
# cp fonts.scale

3、使用mkfontdir及mkfontscale

我用的就是这个,注意先后顺序

# mkfontscale
# mkfontdir 
# cat fonts.dir

21

simsun.ttc -misc-SimSun-medium-r-normal–0-0-0-0-p-0-iso8859-1

simsun.ttc -misc-SimSun-medium-r-normal–0-0-0-0-p-0-koi8-r

simsun.ttc -misc-SimSun-medium-r-normal–0-0-0-0-p-0-jisx0208.1983-0

simsun.ttc -misc-SimSun-medium-r-normal–0-0-0-0-p-0-jisx0208.1990-0

simsun.ttc -misc-SimSun-medium-r-normal–0-0-0-0-p-0-gb2312.1980-0

simsun.ttc -misc-SimSun-medium-r-normal–0-0-0-0-p-0-iso10646-1

tahoma.ttf -microsoft-Tahoma-medium-r-normal–0-0-0-0-p-0-iso8859-1

tahoma.ttf -microsoft-Tahoma-medium-r-normal–0-0-0-0-p-0-iso8859-2

tahoma.ttf -microsoft-Tahoma-medium-r-normal–0-0-0-0-p-0-iso8859-3

tahoma.ttf -microsoft-Tahoma-medium-r-normal–0-0-0-0-p-0-iso8859-4

tahoma.ttf -microsoft-Tahoma-medium-r-normal–0-0-0-0-p-0-iso8859-5

tahoma.ttf -microsoft-Tahoma-medium-r-normal–0-0-0-0-p-0-iso8859-8

tahoma.ttf -microsoft-Tahoma-medium-r-normal–0-0-0-0-p-0-iso8859-9

tahoma.ttf -microsoft-Tahoma-medium-r-normal–0-0-0-0-p-0-iso8859-10

tahoma.ttf -microsoft-Tahoma-medium-r-normal–0-0-0-0-p-0-iso8859-11

tahoma.ttf -microsoft-Tahoma-medium-r-normal–0-0-0-0-p-0-iso8859-13

tahoma.ttf -microsoft-Tahoma-medium-r-normal–0-0-0-0-p-0-iso8859-15

tahoma.ttf -microsoft-Tahoma-medium-r-normal–0-0-0-0-p-0-koi8-e

tahoma.ttf -microsoft-Tahoma-medium-r-normal–0-0-0-0-p-0-adobe-standard

tahoma.ttf -microsoft-Tahoma-medium-r-normal–0-0-0-0-p-0-microsoft-cp1252

tahoma.ttf -microsoft-Tahoma-medium-r-normal–0-0-0-0-p-0-iso10646-1

# fc-cache -fv             ;这一步可以不执行,系统会自动扫描

修改XF86Config

# vi /etc/X11/XF86Config

# cat /etc/X11/XF86Config

Section “ServerLayout”
        Identifier     ”XFree86 Configured”
        Screen      0  ”Screen0″ 0 0
        InputDevice    ”Mouse0″ “CorePointer”
        InputDevice    ”Keyboard0″ “CoreKeyboard”
EndSection

Section “Files”
        RgbPath      ”/usr/X11R6/lib/X11/rgb”
        ModulePath   ”/usr/X11R6/lib/modules”
#       FontPath     ”/usr/X11R6/lib/X11/fonts/TrueType/”
        FontPath     ”/usr/X11R6/lib/X11/fonts/misc/”
        FontPath     ”/usr/X11R6/lib/X11/fonts/Speedo/”
        FontPath     ”/usr/X11R6/lib/X11/fonts/Type1/”
        FontPath     ”/usr/X11R6/lib/X11/fonts/75dpi/”
        FontPath     ”/usr/X11R6/lib/X11/fonts/100dpi/”
EndSection

Section “Module”
        Load “xtt”
#       Load “freetype”
        Load  ”dbe”
        Load  ”dri”
        Load  ”extmod”
        Load  ”glx”
#下面一个要不要注释并不重要
#       Load  ”record”
        Load  ”xtrap”
        Load  ”speedo”
#下面一个要不要注释并不重要
#       Load  ”type1″
EndSection

Section “InputDevice”
        Identifier  ”Keyboard0″
        Driver      ”keyboard”
EndSection 

Section “InputDevice”
        Identifier  ”Mouse0″
        Driver      ”mouse”
        Option      ”Protocol” “auto”
        Option      ”Device” “/dev/sysmouse”
        Option      ”ZAxisMapping” “4 5″
EndSection

Section “Monitor”
        #DisplaySize      280   210     # mm
        Identifier   ”Monitor0″
        VendorName   ”___”
        ModelName    ”d556″
        Option      ”DPMS”
EndSection

Section “Device”
        Identifier  ”Card0″
        Driver      ”nv”
        VendorName  ”nVidia Corporation”
        BoardName   ”NV5M64 [RIVA TNT2 Model 64/Model 64 Pro]“
        BusID       ”PCI:1:0:0″
EndSection

Section “Screen”
        Identifier “Screen0″
        Device     ”Card0″
        Monitor    ”Monitor0″
        SubSection “Display”
                Depth     1
        EndSubSection
        SubSection “Display”
                Depth     4
        EndSubSection
        SubSection “Display”
                Depth     8
        EndSubSection
        SubSection “Display”
                Depth     15
        EndSubSection
        SubSection “Display”
                Depth     16
        EndSubSection
        SubSection “Display”
                Depth     24
        EndSubSection
EndSection

修改.fonts.conf,以使字体显示得更为美观,内容各不相同,具体可参考网上相关内容

# vi ~/.fonts.conf

# cat ~/.fonts.conf

<?xml version=”1.0″?>
<!DOCTYPE fontconfig SYSTEM “fonts.dtd”>
<fontconfig>

 <match target=”font” >
  <edit mode=”assign” name=”rgba” >
   <const>rgb</const>
  </edit>
 </match>

        <match target=”font”>
                <test name=”family”><string>SimSun</string></test>
                <edit name=”antialias”><bool>true</bool></edit>
                <edit name=”hinting”><bool>true</bool></edit>
                <edit name=”autohint”><bool>false</bool></edit>
        </match>  

        <match target=”font”>
                <test name=”family”><string>NSimSun</string></test>
                <edit name=”antialias”><bool>true</bool></edit>
                <edit name=”hinting”><bool>true</bool></edit>
                <edit name=”autohint”><bool>false</bool></edit>
        </match>  

        <match target=”font”>
                <test name=”family”><string>SimSun</string></test>
                <test name=”size” compare=”less_eq”><int>16</int></test>
                <edit name=”antialias” mode=”assign”><bool>false</bool></edit>
                <edit name=”hinting” mode=”assign”><bool>true</bool></edit>
        </match> 

        <match target=”font”>
                <test name=”family”><string>NSimSun</string></test>
                <test name=”size” compare=”less_eq”><int>16</int></test>
                <edit name=”antialias” mode=”assign”><bool>false</bool></edit>
                <edit name=”hinting” mode=”assign”><bool>true</bool></edit>
        </match>

        <match target=”font”>
                <test name=”family”><string>NSimSun</string></test>
                <edit name=”globaladvance”><bool>false</bool></edit>
        </match>

</fontconfig>

重新登录一下,然后进入KDE

# startx

呵呵,上网,中文正常显示出来了!如果想用中文的界面,那就继续往下做吧,安装中文包

四、安装汉化包kde3-i18n-zh_CN

# cd /usr/ports/chinese/kde3-i18n-zh_CN/

# make install clean

注意kde3-i18n-zh_CN只是个汉化包,并非中文的KDE,所以安全之前不要把英文的KDE包给删除了,不然安装的时候会遇到困难(我就遇到过),只要安装freebsd系统时,小心选包,安装此汉化包应该没什么问题。

重新登录一下,然后进入KDE

# startx

按下面步骤设定汉化包:

Control Center -> Country/Region &Language -> Locale -> Country -> 选择Asia/China -> Language -> Add Language ->Other -> Simplified Chinese -> Apply

再次呵呵,中文界面也出来了。