科学网

 找回密码
  注册

tag 标签: 应用程序

相关帖子

版块 作者 回复/查看 最后发表

没有相关内容

相关日志

[转载]Matlab GUI封装-如何将gui生成exe
ChenboBlog 2011-11-7 16:04
如何将gui生成exe 方法一: 已有gui.m文件和gui.fig文件 1 在matlab的command窗口中输入 mcc -B sgl GUI.m 2.将上步生成的文件包括*m 文件和*.fig文件一起考到待运行的机器 此时仍需matlab所必需的动态连接库。 3. 将 matlab path /extern/lib/win32/mglinstallar.exel拷贝到到待运行机器上 4.在机器上先运行mglinstallar.exe, 然后选择解压目录,将在将在指定目录下解压缩出bin和toolbox两个子目录, 其中在bin\win32目录下就是数学库和图形库脱离MATLAB运行所需的所有动态连接库,共 有37个。可以将这些.dll考入system32, 也可以直接放在应用程序目录下。 而toolbox目录则必须与应用程序同一目录。 方法二: matlab编程很方便,强大的矩阵运算功能,很多好用的工具箱,但是一般程序都要在matlab环境中运行,能否脱离这个环境打包发布呢,matlab也提供了这样的工具。 1. 转化为c/c++程序并编译为.exe 先验证mcc是否可用,用matlab中的example验证即可 建议不用matlab默认的lcc 编译器(可能有问题),可使用VC6编译器(按默认路径安装) 由于带有界面,需要图像库支持,编译时应使用命令: mcc -B sglcpp pressure 编译生成若干c/c++源码,以及.exe文件、bin目录中figure菜单条/工具条文件(.fig)等 程序发布需要.exe、bin\、.fig 2. 在未装matlab的电脑上运行程序需要数学 运行时库、图像运行时库以及用到的工具箱mex文件 前两者已经在\matlab\extern\lib\win32mglinstaller.exe压缩包中,将其解压,并在环境变量path中添加解压到的路径 另外若程序中还用到其他工具箱的东西,那么需要将此工具箱中需要的mex文件也一并放在解压到的路径,子文件夹位置与matlab中的位置相同 3. 在确保.exe程序可以运行的情况下 可以用setup factory打包发布 以下通过注册表自动添加path路径 %-------------------------------------------------------------------------------------- Screen.Next(); -- 进入下一个屏幕 resultDialog = Dialog.Message("注意", "向环境变量中加入matlab数学库及图象库的安装路径?", MB_YESNO, MB_ICONINFORMATION, MB_DEFBUTTON1); if (resultDialog == IDYES) then --加入安装路径 strPath = Registry.Get(HKEY_CURRENT_USER, "Environment", "path", true); if strPath ~= "" then strPath = String.Concat(strPath, ";"); end strPathToAdd = SessionVar.Expand("%AppFolder%"); strPathToAdd = String.Concat(strPathToAdd,"//MATLAB6p5//bin//win32"); -- 如果路径中无该位置,则加入 if String.Find(strPath,strPathToAdd) == -1 then strPath = String.Concat(strPath, strPathToAdd); Registry.Set(HKEY_CURRENT_USER, "Environment", "path", strPath, REG_SZ); end end %-------------------------------------------------------------------------------------- 方法三: 在网上搜了一个方法,还没有用过, 贴在这里仅供参考: 一、 完全可以,而且生成的.exe文件可以在没有安装matlab的机器上使用,方法吗--- 首先,使用mcc编译得到.exe文件,具体参数见帮助文件; 其次,将.exe文件及相关资源文件以及一个称为mglinstaller.exe的软件包一起拷到别的机器上,运行mglinstaller.exe,并添加环境变量path,即可执行.exe文件 第三,在MATLAB环境,执行命令 mcc -m -B sgl file.m 或者 mcc -p -B sglcpp file.m 请键入help mcc看帮助。 mcc是在“command windows” 用的吗? 只要“mglinstaller.exe”,与.exe文件及相关资源文件就可以了吗. 还有“添加环境变量path”是path到.exe文件的环境中是吧? 二、 在matlab下的workspace里打comtool,点file-open project将我们先前建好的comtest.cbl工程文件打开,再点component--package component就实现了打包,此时到comtest\distrib文件夹里看,生成的comtest.exe就是打包后的解压程序,双击它会解压出一些文件,再点击解压出来的_install.bat就可以实现安装 三、 如何将gui生成exe ? 已有gui.m文件和gui.fig文件 1 在matlab的command窗口中输入 mcc -B sgl GUI.m 2.将上步生成的文件包括*m 文件和*.fig文件一起考到待运行的机器 此时仍需matlab所必需的动态连接库。 3. 将 matlab path /extern/lib/win32/mglinstallar.exel拷贝到到待运行机器上 4. 在机器上先运行mglinstallar.exe, 然后选择解压目录,将在指定目录下解压缩出bin和toolbox两子目录,其中在bin\win32目录下就是数学库和图形库脱离MATLAB运行所需的所有动态连接库,共有37个。可以将这些.dll考入system32, 也可以直接放在应用程序目录下。而toolbox目录则必须与应用程序同一目录。 5.大功告成。
18286 次阅读|0 个评论
[转载]vc++小技巧
Sunteresa 2011-11-3 15:55
窗口篇 让窗口一启动就最大化 把应用程序类(CxxxApp)的 InitInstance() 函数中的 m_pMainWnd-ShowWindow(SW_SHOW); 改为 m_pMainWnd-ShowWindow(SW_SHOWMAXIMIZED); 则窗口一启动就最大化显示。 如何设置窗口的初始尺寸 在将应用程序类(CxxAPP)的 InitInstance() 函数中加入: m_pMainWnd-SetWindowPos(NULL,x,y,Width,Height,SWP_NOMOVE); Width为窗口宽度,Height为窗口高度 SWP_NOMOVE表示忽略位置(x,y)。 如: BOOLCDzyApp::InitInstance() { AfxEnableControlContainer(); …… //Theoneandonlywindowhasbeeninitialized,soshowandupdateit. m_pMainWnd-SetWindowPos(NULL,0,0,750,555,SWP_NOMOVE);//设置窗口的初始大小为750*555 m_pMainWnd-ShowWindow(SW_SHOW); m_pMainWnd-UpdateWindow(); returnTRUE; } 让窗口居中显示 以下两种方法可任选其一: ①在应用程序类(CxxxApp)的 InitInstance() 函数中加入: m_pMainWnd-CenterWindow( GetDesktopWindow() ); ②在主框架类(MainFrm.cpp)的OnCreate()函数中加入: CenterWindow( GetDesktopWindow() ); 如: intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct) { if(CFrameWnd::OnCreate(lpCreateStruct)==-1) return-1; …… //TODO:Deletethesethreelinesifyoudon'twantthetoolbarto //bedockable m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockControlBar(m_wndToolBar); CenterWindow(GetDesktopWindow());//使窗口打开时处于屏幕正中 return0; } 如何修改窗口标题 窗口标题一般形式为: 文档标题 - 程序标题 1、设置文档标题: 在文档类(CxxxDoc)的OnNewDocument()函数中加入语句:SetTitle("文档名"); 如:TextEditorDoc.cpp: BOOLCTextEditorDoc::OnNewDocument() { if(!CDocument::OnNewDocument()) returnFALSE; //TODO:addreinitializationcodehere //(SDIdocumentswillreusethisdocument) SetTitle("未命名.txt");//设置文档标题 returnTRUE; } 2、设置程序标题: 在框架类(CMainFrame)的PreCreateWindow()函数中加入语句:m_strTitle = _T("程序标题"); 如:MainFrm.cpp: BOOLCMainFrame::PreCreateWindow(CREATESTRUCTcs) { if(!CFrameWnd::PreCreateWindow(cs)) returnFALSE; //TODO:ModifytheWindowclassorstylesherebymodifying //theCREATESTRUCTcs m_strTitle=_T("文本整理器");//设置程序标题 returnTRUE; } 以上两点比较适用于视图-文档结构的程序,在新建文档时,系统会自动运行OnNewDocument()函数,在其中可以设置合适的标题。对于未采用文档的程序可以用下面的方法修改标题: 3、修改窗口标题: 修改窗口标题一般在打开文件函数OnFileOpen()和另存为函数OnFileSaveAs()中进行,可以使用下面的函数: AfxGetMainWnd()-SetWindowText("文档标题"+" - "+"程序标题"); 其中文档标题和程序标题可使用定义过的串变量。 项目篇 如何干净的删除一个类? 1、先删除项目中对应的.h和.cpp文件,(选中后用Delete键删除) 2、保存后退出项目,到文件夹中删除实际的.h和.cpp文件; 3、删除.clw文件; 4、重新进入项目,进行全部重建(rebuild all)。 如何建立一个新类? 从“插入”(Insert)菜单中选择“新建类”(New Class),在弹出的对话框中选择基类(Base class),在Name中输入新类的名字(一般都以C开头)即可。 如果想要建立一个没有基类的自定义类,则在New Class对话框中把Class type设置为generic,再输入类名即可。 如何把外来文件添加到项目中? 先把外来文件复制到当前项目的目录下,从“项目”(Project)菜单下选择“添加项目”(Add to Project)下的“Files”菜单项,从弹出的打开文件对话框中把外来文件打开即可。 如何在一个工作区中打开多个项目? 一般编程者都有这样的经历:做了一个项目,由于不满意,想从头重做,但又想把旧项目的一些可用内容拷到新项目中来,以免做重复工作,这时就需要在新项目中打开旧项目。 先打开新项目,从“项目”(Project)菜单下选择“插入项目到工作区”(Insert Project into Workspace),从弹出的打开文件对话框中打开旧项目的.asp文件即可。 之后,可以利用“项目”(Project)菜单下的“设置活动项目”(Select Active Project)的选项中切换各打开的项目。 注意:在一个工作区中打开的各项目不能同名。 如何把项目中的文件分类存放? 当我们往项目中添加新类时,它会把源文件放在Source Files下,头文件放在Header Files下。当项目中文件很多时,管理不便,最好添加新节点,把文件分类放置。 右击项目节点树的根节点,选择“New Folder...”,在弹出的对话框中填入新节点名,则新节点就建立了,用鼠标节点树中的文件拖入新节点,就可以把文件分类了。 以上分类只是在项目的节点树中分类,它不影响文件在磁盘上的位置,所有.cpp文件和.h文件仍在项目的根目录下,最好文件本身也能分类存放在不同文件夹中。 在Windows下,用“新建文件夹”在项目的根目录下建立子文件夹,如DialogClass,把所有对话框类的.cpp文件和.h文件拖入其中。 回到VC下,右键单击项目树中更改了路径的节点,选择“Properties”,在弹出的对话框中修改文件路径,如:把原路径“.\Dialog1.cpp”改为“.\DialogClass\Dialog1.cpp”。 打开Dialog1.cpp文件,修改它包含的文件路径。如: #include "stdafx.h" #include "PluckBox.h" #include "Dialog1.h" 改为: #include "stdafx.h" #include "..\\PluckBox.h" #include "Dialog1.h" 打开ClassWizard,它会提示你文件不存在,单击“确定”后,从对话框中用“Browse...”选择文件所在路径,则ClassWizard也可正常使用了。 编辑篇 编辑代码时,跟随提示消失了怎么办? 单击“工具”(Tools)菜单中的“设置”(Options)菜单项,在弹出的Options对话框中选择Editor制表页,把它最下方的四个复选框都选中(Auto list member、Auto type info、Code comments、Auto parameter info),这样,当用户输入“-”或“.”时,会自动显示跟随提示,减少了输入负担。 对话框篇 如何修改对话框的背景色 在对话框的OnPaint()函数中加入下面语句: CRect rect; GetClientRect(rect);//计算对话框的尺寸 dc.FillSolidRect(rect,RGB(192,248,202));//绘制对话框背景色 如何让弹出式对话框具有统一的背景色 在应用程序类CxxxApp的InitInstance()函数中加入下面的语句: SetDialogBkColor( RGB(192,248,202) ); 则所有用户定义的弹出式对话框都以RGB(192,248,202)为背景色,就不需要逐个进行设置了。 如何让打开文件对话框能进行多项选择 在定制打开文件对话框时,增加OFN_ALLOWMULTISELECT属性,就可以使打开文件对话框进行多选了。 如: CFileDialog m_Dlg( TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_ALLOWMULTISELECT, NULL, NULL ); 之后,用GetStartPosition()函数获取选择的起始文件位置,用GetNextPathName()函数获取各位置上的文件名。 如: if( m_Dlg.DoModal() == IDOK ) { POSITION pos; pos = m_Dlg.GetStartPosition(); while( pos ) { m_Path = m_Dlg.GetNextPathName(pos); ………… } } 为什么用打开文件对话框选择多个文件到一定数目时,文件没有打开? CFileDialog为文件列表设置有缓冲区,当选择文件过多时,会造成缓冲区溢出,造成一些文件没有被打开。可以采用自定义大缓冲区代替系统缓冲区的方法解决。 如: CFileDialog m_Dlg( TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_ALLOWMULTISELECT, NULL, NULL );//定制打开文件对话框 char* pBuf = new char ;//申请缓冲区 m_Dlg.m_ofn.nMaxFile = 20480;//让pBuf代替CFileDialog缓冲区 m_Dlg.m_ofn.lpstrFile = pBuf; m_Dlg.m_ofn.lpstrFile = NULL; ………… delete ; GetModuleFileName( NULL, m_Path, MAX_PATH ); //获取程序路径(包括程序名) int i = 0, j; while( m_Path !=0 ) { if( m_Path =='\\' ) j = i; i++; } m_Path = '\0'; m_exePath.Format( "%s", m_Path );//分离路径名(去掉程序名) 这段程序执行后,字符串变量m_exePath中放置的就是程序所在路径,其中不包括程序名。 获取程序的位置有什么用呢? 1、打开与应用程序在一起放置的数据文件: 如果你运行程序过程中使用过打开文件对话框打开过其它路径下的文件,这时系统的默认路径就发生了改变,有可能使你原定的数据文件打不开了,如果采用以下方法就可以没问题了: CFile file; file.Open( m_exePath+"数据文件名", CFile::modeRead ); 2、放置程序运行中的临时文件: 同样,当系统的默认路径发生改变后,程序中生成的临时文件就会放得到处都是,成了一个个垃圾文件,采用以下方法可使临时文件只放在程序所在路径下: CFile file; file.Open( m_exePath+"临时文件名", CFile::modeCreate | CFile::modeWrite ); …… 程序结束时,用下面的方法删除临时文件: CFile::Remove( m_exePath+"临时文件名" ); 如何在你的程序中执行其它程序 在自己的程序中调用其它程序的方法有好几种,这里我介绍我用过的两种: 一、WinExec()函数: 一般用法:WinExec(m_PathName,SW_SHOWNORMAL); m_PathName为执行程序的路径名,必须为可执行文件。 如:WinExec("C:\\Program Files\\Internet Explorer\\iexplore.exe",SW_SHOWNORMAL);为打开IE浏览器 二、ShellExecute()函数: 一般用法:ShellExecute(NULL,NULL,m_PathName,NULL,_T("c:\\temp"),SW_SHOWNORMAL); m_PathName为打开的程序路径名; _T("c:\\temp")为工作目录; 与WinExec()不同的是ShellExecute()函数也可以打开非可执行文件,比如你指定的文件为.txt,结果会打开记事本装入该文件。我用这种方法调用自己制作的帮助文件(.chm)效果很好。 如果不使用串行化,如何在程序结束时保存文件? 在文档-视图结构中,用串行化自动保存文件在各种VC书上都有介绍。现在的问题是我不使用串行化,而是自己动手保存,当点击窗口的关闭按钮时,如何提示并保存文档。 用ClassWizard在文档类(CxxDoc)中添加函数CanCloseFrame(),再在其中加入保存文件的语句就可以了。 例: //退出程序 BOOL CEditDoc::CanCloseFrame(CFrameWnd* pFrame) { CFile file; if(b_Flag)//b_Flag为文档修改标志,在修改文档时将其置为True { int t; t=::MessageBox(NULL,"文字已经改变,要存盘吗?","警告", MB_YESNOCANCEL | MB_ICONWARNING);//弹出提示对话框 if(t==0 || t==IDCANCEL) return false; if(t==IDYES) { CString sFilter="Text File(*.txt)|*.txt||"; CFileDialog m_Dlg(FALSE,"txt",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,(LPCTSTR)sFilter,NULL); //定制文件对话框 int k=m_Dlg.DoModal(); //弹出文件对话框 if(k==IDCANCEL || k==0) return false; m_PathName=m_Dlg.GetPathName(); //获取选择的文件路径名 file.Open(m_PathName,CFile::modeCreate | CFile::modeWrite); file.Write(m_Text,m_TextLen); //数据写入文件 file.Close(); } } return CDocument::CanCloseFrame(pFrame); } 这样当你单击窗口上的关闭按钮时,如果数据已修改了,就会弹出一个提示保存数据的对话框,提示你保存数据。 程序中的b_Flag是数据修改标志,应该在修改数据时进行设置,m_Text是准备保存的数据,放在文档内。 POSITION怎么用? POSITION类型数据用于表征各种列表中元素的位置,它类似于数组的下标,但又有所不同。主要区别是: 我们不能访问POSITION型数据的值,也不能对POSITION数据型数据进行加减、比较等运算。 用POSITION型数据访问列表时,都是采用迭代法,一般格式为: POSITION pos; //定义pos型变量 pos = GetHeadPosition(); //获取列表起始元素位置 while( pos ) { x = GetNext(pos); //获取pos处的列表值,同时修改pos为下一个元素位置 } GetNext()就是一种迭代,其格式为: TYPE GetNext(POSITION rPosition); 首先,它返回当前pos位置处的元素;再就是把pos值修改为下一个元素位置。这样循环时,可依次取得列表中各元素的值;当到达列表尾时,pos为NULL,循环结束。 所以使用POSITION型数据时,你不要试图用加减等操作去修改它,只能用GetNext()(向后迭代)或GetPrev()(向前迭代)反复迭代来修改它的值。 如果你想直接到达指定值,还可以用Find()函数或FindIndex()函数获得指定值的POSITION值。 POSITION Find(TYPE Value);用于在列表中查找值为Value的元素的POSITION值; POSITION FindIndex(int nIndex);用于获取列表中第nIndex个元素的POSITION值,nIndex从0开始。 如: pos = FindIndex(5);//求列表中第5个元素的位置 x = GetNext(pos);//读取元素的值 总之,POSITION类型在多种涉及列表的类中提供,不同的类提供的函数有所不同,但用法都是类似的。 如何从完整的文件路径中分离文件名和路径名? 从路径中分离文件名: CStringGetFileName(CStringpathname) { for(inti=pathname.GetLength()-1;i=0;i--) { if(pathname =='\\') break; } returnpathname.Mid(i+1); } 从路径中分离路径名(去除文件名): CStringGetPath(CStringpathname) { inti=0,j; while(ipathname.GetLength()) { if(pathname =='\\') j=i; i++; } returnpathname.Left(j+1); }
个人分类: opencv学习|2514 次阅读|0 个评论
[转载]编写一个基本的Android应用程序
putin24 2011-9-18 23:24
[转载]编写一个基本的Android应用程序
本节展示如何构建一个 Android 应用程序。示例应用程序非常简单:一个修改后的 “Hello Android” 应用程序。您将进行一个微小的修改,使屏幕背景全部变为白色,以便把手机用作手电筒。这个例子不是很有创意,但是可以作为一个有用的例子。请 下载 完整的源代码。 为了在 Eclipse 中创建应用程序,选择 File New Android project ,这将启动 New Android Project 向导。 图 1. New Android project 向导 接下来,创建一个简单的应用程序,该应用程序有一个活动,并且在 main.xml 中有一个 UI 布局。布局包含一个文本元素,您将修改这个文本元素,以显示 Android FlashLight。下面的清单显示了这个简单的布局。 清单 1. Flashlight 布局 ?xml version="1.0" encoding="utf-8"? LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@color/all_white" TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" android:textColor="@color/all_black" android:gravity="center_horizontal"/ /LinearLayout 在 strings.xml 中创建两个颜色资源。 清单 2. strings.xml 中的颜色 ?xml version="1.0" encoding="utf-8"? resources string name="hello"Android FlashLight/string string name="app_name"FlashLight/string color name="all_white"#FFFFFF/color color name="all_black"#000000/color /resources 主屏幕布局有一个定义为 all_white 的背景色。在 strings.xml 文件中,可以看到 all_white 被定义为一个值为 #FFFFFF 的 RGB 三元组,即纯白。 布局包含一个 TextView,这实际上是一块静态文本。它是不可编辑的。文本被设为黑色,并通过 gravity 属性设为水平居中。 该应用程序有一个名为 FlashLight.java 的 Java 源文件,如以下清单所示。 清单 3. Flashlight.java package com.msi.flashlight; import android.app.Activity; import android.os.Bundle; public class FlashLight extends Activity { /** Called when the activity is first created. */ public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } } 该代码是直接来自 New Project 向导的模板代码: 它是 Java 包 com.msi.flashlight 的一部分。 它有两个 import: 一个用于 activity 类 一个用于 bundle 类 当该活动发起后,onCreate 方法被调用,传入一个 savedInstanceState。对于我们来说,不必关心这个 bundle。只有在暂停然后恢复活动时才会用到。 onCreate 方法覆盖了同名的 activity 类方法。它调用超类的 onCreate 方法。 对 setContentView() 的调用将关联 main.xml 文件中定义的 UI 布局。main.xml 和 strings.xml 中的任何内容都自动映射到 R.java 源文件中定义的常量。任何时候都不要直接编辑这个文件,因为它随着每次构建而改变。 运行该应用程序可以看到一个白色屏幕,其中有黑色文本。 图2:flashlight 的白色屏幕 下面显示用于 FlashLight 应用程序的 AndroidManifest.xml 文件。 清单 4. 用于 FlashLight 的 AndroidManifest.xml ?xml version="1.0" encoding="utf-8"? manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.msi.flashlight" android:versionCode="1" android:versionName="1.0.0" application android:icon="@drawable/icon" android:label="@string/app_name" activity android:name=".FlashLight" android:label="@string/app_name" intent-filter action android:name="android.intent.action.MAIN" / category android:name="android.intent.category.LAUNCHER" / /intent-filter /activity /application /manifest 该文件是由用于 Eclipse 的 Android Developer Tools 插件自动创建的。您不需要做任何事情。 FlashLight 源代码 os-android-devel-FlashLight.zip 参考资料 学习 The Open Handset Alliance 是一个由 47 家技术和移动公司组成的组织,这些公司共同致力于加快移动领域的创新,并提供更丰富、更廉价、更好的移动体验。他们一起开发了 Android,这是第一个完整的、开放的、免费的移动平台。 Android 开发人员站点 提供了文档、下载、日志等。 了解更多关于 Dalvik Virtual Machine 的信息。 观看 YouTube 上深入讨论 Dalvik VM 的 教程 。 Unlocking Android: A Developer's Guide 提供了 Android 操作系统和开发工具的简明、实用的说明。 要收听有关软件开发人员的有趣访谈和讨论,请浏览 developerWorks podcasts 。 随时关注 developerWorks 技术活动 和 网络广播 。 追随 developerWorks on Twitter 。 查阅最近将在全球举办的面向 IBM 开放源码开发人员的研讨会、交易展览、网络广播和其他 活动 。 访问 developerWorks 开放源码专区 ,获得丰富的 how-to 信息、工具和项目更新,帮助您用开放源码技术进行开发,并与 IBM 产品结合使用。 查看免费的 developerWorks 演示中心 ,观看并了解 IBM 及开源技术和产品功能。 获得产品和技术 下载 Android SDK 。 获得最新的 Eclipse IDE 。 使用 IBM 试用软件 改进您的下一个开发项目,这些软件可以通过下载获得。 下载 IBM 产品评估版 ,或者 在 IBM SOA Sandbox 中进行在线试用 ,获得来自 DB2®、 Lotus®、Rational®、Tivoli® 和 WebSphere® 的应用程序开发工具和中间件产品。
个人分类: 技术研究|3944 次阅读|0 个评论
Chrome Web Store“ 目前无法获取该应用程序”的解决办法
FrankZhao 2011-8-16 22:05
Chrome Web Store“ 目前无法获取该应用程序”的解决办法
Chrome是个异常强大的浏览器,前提是你选对应用程序和插件。 我最近在chrome的网络应用商城Chrome Web Store上安装应用程序的时候发现如下错误: 后来发现是因为被当局墙在外面了,普通的扩展可以在出现不能下载时把https中的s去掉,然后就可以下载了,但是这个办法对于应用程序的安装有时还是不可以,那么下面这个就是目前来说最好的解决办法: 打开hosts文件然后添加几条记录如下 ##Chrome 网上应用店 203.208.46.146 chrome.google.com 203.208.46.146 clients0.google.com 203.208.46.146 clients1.google.com 203.208.46.146 clients2.google.com 203.208.46.146 clients3.google.com 203.208.46.146 clients4.google.com 203.208.46.146 www.googleusercontent.com 203.208.46.146 lh0.googleusercontent.com 203.208.46.146 lh1.googleusercontent.com 203.208.46.146 lh2.googleusercontent.com 203.208.46.146 lh3.googleusercontent.com 203.208.46.146 lh4.googleusercontent.com 203.208.46.146 lh5.googleusercontent.com 203.208.46.146 lh6.googleusercontent.com 203.208.46.146 clients1.googleusercontent.com 203.208.46.146 clients2.googleusercontent.com hosts 所在位置: WindowsNT/2000/XP/Vista/win7(即微软NT系列操作系统): 默认位置为windows\system32\drivers\etc\ 一般在此位置直接修改会要求管理员权限,不知怎么处理的话可以将hosts文件复制到别处,以记事本形式进行修改之后再粘回去覆盖即可 也可以在桌面为hosts新建个快捷方式,需要用的时候就直接用记事本打开。
个人分类: 效率|13318 次阅读|0 个评论
谈谈网络实名和匿名的问题
热度 5 gzchengzhi 2011-8-3 11:08
  首先我这里想要明确一下的就是,就网络技术而言,并不存在什么实名和匿名之分,实名和匿名只是在网络的应用层之上,一种用户使用应用程序的习惯而已。如果在Internet的四个层次中可以采用匿名方式,则通信过程就不可能有效地进行下去,因为说到通信,就一定是涉及到通信双方的事情。   当然在应用层中还有一种公开密钥技术,能够实现数字签名,能够有效标志文件所有者的信息。这与我们平常理解的实名和匿名是不同的。还有一种叫做DDOS的黑客技术,利用了多台计算机同时向一台服务器发送数据请求,可以在一定程度上混淆发动攻击的黑客计算机信息,给调查取证带来一定的难度。这也有点类似于匿名的通信方式。   而最早的在应用层采用所谓匿名方式进行通信的可能是FTP协议。在使用FTP协议的时候,如果允许匿名登录,则用户不输入个性化的用户名和密码,只需要输入一个通用的anonymous作为用户名,任意一个电子邮件地址作为密码来进行登录。本质上来说,这并不能够起到完全隐藏自己的身份的作用。它只是采用了一个通用的用户名和密码而已。在客户机与主机建立连接的过程中,客户机已经通过各种网络协议将本机的所有重要信息都传给了服务器。但因为应用层之上的使用者并不了解网络技术各层次的工作原理,自信自己已经采用了一种神不知鬼不觉的方法来从服务器上下载文件,而服务器管理员又疏于时间去对日志文件仔细审查,匿名方式的神话也就逐渐为大家所知晓。   网络匿名方式在一段时间被人误解达到了高峰。记得在上个世纪九十年代,国外流传了一个很有趣的笑话,说的是:“在网络上没有人知道你是一条狗”。现在看起来笑话本身也成了笑话。当某些地区某些网友因为在某些贴吧中发表了对某些领导不满的言论以后,自以为采用的是匿名的方式,没有人知道是他说的。结果第二天还是被抓了起来。我们无疑应该对这种打击公民言论自由的行为进行谴责。但是作为网民,对网络进行了错误的解读也是一种深刻的教训。   我想指出的是在网络上,无论你采用的是匿名的方式,还是实名的方式进行讨论,对于网站管理机构、相关的主管机构、部门等来说,都是实名可以追查的。追查的方式也很简单,就是通过分析你通信过程中使用的通信线路、经过了那些网关、使用了那个ISP等等信息,很短时间就可以确定你发送信息的时候使用的是那台计算机、使用计算机的时间、计算机所在的街道、门牌号、楼层、房间等。这远比用户在登录时候使用的用户名、密码这点信息要丰富得多了。因此我认为实名方式对于一个人的身份信息确认的用处不大。但还是有一点用处的。比如在论坛中,其他用户除了阅读网友的帖子以外,还想了解这个网友的其他信息,则通过网友的用户名可以节省一些交流的时间。但有时这些信息也还不太够。比如我们在发表论文的时候,经常要书写详细的个人资料,这就是为了提供作者的基本信息,便于联系和交流。这要看每个人或机构的喜好不同。但我想,这应该跟一个人的责任感等道德方面的判断没有直接联系。   从上面的分析我们可以看出,匿名和实名的方式并不依赖于网络。因此匿名实名讨论方式并不是网络特有。早在网络出现之前就存在。一些非常专业的方式,比如论文的匿名评审、项目的匿名评审等。这些工作并不需要依赖网络来进行。而之所以采用了匿名的方式,则是期望评审专家能够专注于论文或项目质量问题,而不会受到其他无关因素的干扰。当然由于现实生活中,一些人士刻意隐藏自己的身份信息,犹如马季先生相声里所指出的那样:“只花八分钱,让那小子恶心半年”,这可能就是涉及到了个人道德修养问题了。   同网络时代进行对比,传统方式中,那种刻意隐藏自己身份信息的做法,类似于现在的黑客。而一般网络用户在符合论坛等网络交互场所规定的情况下,采用匿名的方式,则类似于论文项目的匿名评审。因为网络用户并没有刻意隐藏自己的身份信息,比如刻意使用代理服务器、恶意穿越防火墙等。   最后想谈一谈“网络实名制”的问题。本质上来说,网络实名制是一种制度,而我这里只是讨论实名和匿名的技术问题,二者有比较大的差距。但网络实名制的起源跟使用实名还是匿名方式来进行讨论是有联系的,故还是有必要在本文中略微涉及一下。   为何要提出“网络实名制”,其原因目前还不太清楚。形式上来说,网络实名制应该就是要确保每一个人上网的时候使用的是真实的身份。但这种真实的身份的显示到底应该是怎么样的程度,目前并没有一个标准。如果说是连接到网络必须实名,我想其关口应该是ISP。如果说是开设博客或进入论坛讨论需实名,则把关人应该是网站管理员。除此之外,还要考虑一下打开一个网站浏览信息是否应该使用真实身份登陆等。   尽管有些技术性的问题需要解决,不过已经有网络实名制实施的实例了,这就是韩国的网络实名制。韩国的网络实名制源于几年前出现的所谓“狗屎女”事件,相关资料可以在网络上搜索到。但我个人的看法,韩国之所以实行网络实名制,应该跟朝鲜半岛局势紧张有关。目前全世界只有韩国实行网络实名制也能说明这一问题。但韩国实行网络实名制以后效果如何,我并没有查阅到相关的研究资料,故这里就不好进行深入判断了。
10362 次阅读|22 个评论
[转载]本土化是国产智能机获胜的关键
dongzg101 2011-7-26 09:08
本土化是国产智能机获胜的关键 2011-07-20 22:01:01 归档在 通信市场 | 浏览 16155 次 | 评论 8 条 手机市场已经跑步进入智能时代,功能手机的出货量虽然还在增长,但智能手机所体现出来的超速前进动力已经让所有业内厂家动心。苹果的成功也好像给行业指明了方向,手机厂商只要抓住客户需求的变化,抓住市场快速发展的机遇,就一定会在智能手机市场上风声水起。 中国这个市场非常特殊,用户众多,习惯各异,消费存在严重的鸿沟,不仅仅是两级分化,而是多样分化,比如,像超大屏幕、超长待机等等,这是中国市场上两个特俗需求,却几乎成为决胜中国市场的关键因素。 智能手机是移动互联网发展的最重要终端,也是其最大的优势所在,而移动互联网的体验好坏并不仅仅依赖终端硬件的设计,其应用程序更需要本土化,否则再好的应用也无法给力。在这一点上,苹果也无能为力,应用程序商店上成千上万的好东西,但并不是为中国市场准备的,不要说中国本地资源结合的不够,就很多英文程序就绝不是绝大多数中国人能消受得起。 还有,苹果搞了一个云服务,据说是可以将很多应用给一揽子解决,帮助用户更好的在多终端之间享受同样的一致性的应用体验,但好像苹果提供服务的平台里面并不包括中国人最喜欢使用的一些互联网业务,这也让很多智能手机达人有些失望。 因此,在中国,移动互联网发展起来后,真正好用易用的智能手机或许并不是苹果谷歌诺基亚,很有可能是中国的本土品牌。其实,在 IT 领域早就有这样一个规律,当这个产品高高在上不需要本土资源支撑的时候一定是洋牌子最牛,但一旦开始普及深入基层之后,中国的本土品牌便可能后来居上。 在中国本土手机企业中,酷派算是在智能手机领域扎根时间很长的,作为一家专注于智能手机业务的主流终端制造商,其发展的整个历史都没有离不开过本土两个字。酷派与三家运营商都有紧密的合作,特别是在双网双待手机领域更是独占鳌头,此前酷派推出的 coolmart 这个类似苹果 app 的本地化应用商城以及酷云(本地化的手机云计算应用及服务平台),都是酷派基于本土化的需求提出的本土化应用和服务,假以时日必定会成为国内众多移动互联网用户的重要平台。此外,酷派的商业模式主要是与运营商绑定,同时借助社会化渠道做产品推广,酷派这种充分借助本地企业完成其相关服务的做法也对消费者更为便捷。 中国的移动互联网发展很快,中国的市场前景广阔,也希望更多的中国本土企业开发出更好的本土化应用集成的终端与平台,让中国的老百姓更好的享受信息服务的好处。
1164 次阅读|0 个评论
[转载]gcc、glibc和binutils模块之间的关系,以及在现有系统上如何
onewaystreet 2011-7-24 17:01
一、关于gcc、glibc和binutils模块之间的关系 1、gcc(gnu collect compiler)是一组编译工具的总称。它主要完成的工作任务是“预处理”和“编译”,以及提供了与编译器紧密相关的运行库的支持,如libgcc_s.so、libstdc++.so等。 2、binutils提供了一系列用来创建、管理和维护二进制目标文件的工具程序,如汇编(as)、连接(ld)、静态库归档(ar)、反汇编 (objdump)、elf结构分析工具(readelf)、无效调试信息和符号的工具(strip)等。通常,binutils与gcc是紧密相集成 的,没有binutils的话,gcc是不能正常工作的。 3、glibc是gnu发布的libc库,也即c运行库。glibc是linux系统中最底层的api(应用程序开发接口),几乎其它任何的运行库 都会倚赖于glibc。glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现,主要的如下: (1)string,字符串处理 (2)signal,信号处理 (3)dlfcn,管理共享库的动态加载 (4)direct,文件目录操作 (5)elf,共享库的动态加载器,也即interpreter (6)iconv,不同字符集的编码转换 (7)inet,socket接口的实现 (8)intl,国际化,也即gettext的实现 (9)io (10)linuxthreads (11)locale,本地化 (12)login,虚拟终端设备的管理,及系统的安全访问 (13)malloc,动态内存的分配与管理 (14)nis (15)stdlib,其它基本功能 二、在现有系统上如何升级(redhat9上实践的) 1、升级这些库时,最好不要覆盖系统中缺省的;因为这些库,尤其是glibc库,是系统中最核心的共享库和工具,如果盲目覆盖,很可能导致整个系统 瘫痪,因为一般更新glibc库时,其它所有以来libc库的共享库都需要重新被编译一遍。因此,为了调试某个程序进入glibc时,最好把glibc安 装到/usr/local/lib下。 2、首先编译glibc库。注意最好令建立一个glibc-build的目录,configure时加上--enable-add-ons=linuxthreads选项。make install安装到/usr/local下。 3、修改gcc的spec文件(/usr/lib/gcc-lib/i386-redhat-linux/3.2.2/specs),更改ld-linux.so.2为/usr/local/lib下的新的共享库装载器。 4、编译binutils库,此时被编译出的程序会连接到/usr/local/lib下的新的libc库。注意,在configure前,需要设 置ld缺省连接的路径(LIBRARY_PATH=/usr/local/lib:/lib:/usr/lib),否则binutils会 configure出错,找不到libc中的一些符号。具体步骤如下: (1)export LIBRARY_PATH=/usr/local/lib:/lib:/usr/lib (2)mkdir binutils-build cd binutils-build (3)../binutils-2.13.90.0.18/configure (4)make (5)make -C ld clean (6)make -C ld LIB_PATH=/usr/lib:/lib:/usr/local/bin(设置编译后的ld的缺省库搜索路径,后面的比前面的优先级高) (7)make install 三、总结 1、运行时,动态库的装载依赖于ld-linux.so.6的实现,它查找共享库的顺序如下: (1)ld-linux.so.6在可执行的目标文件中被指定,可用readelf命令查看 (2)ld-linux.so.6缺省在/usr/lib和lib中搜索;当glibc安装到/usr/local下时,它查找/usr/local/lib (3)LD_LIBRARY_PATH环境变量中所设定的路径 (4)/etc/ld.so.conf(或/usr/local/etc/ld.so.conf)中所指定的路径,由ldconfig生成二进制的ld.so.cache中 2、编译时,搜索库的路径顺序如下: (1)ld-linux.so.6由gcc的spec文件中所设定 (2)gcc --print-search-dirs所打印出的路径,主要是libgcc_s.so等库。可以通过GCC_EXEC_PREFIX来设定 (3)LIBRARY_PATH环境变量中所设定的路径,或编译的命令行中指定的-L/usr/local/lib (2)binutils中的ld所设定的缺省搜索路径顺序,编译binutils时指定。(可以通过“ld --verbose | grep SEARCH”来查看) 3、二进制程序的搜索路径顺序为PATH环境变量中所设定。一般/usr/local/bin高于/usr/bin 4、编译时的头文件的搜索路径顺序,与library的查找顺序类似。一般/usr/local/include高于/usr/include
个人分类: linux学习|1792 次阅读|0 个评论
Java调用dll之64bit篇
热度 1 xirongguo 2011-7-22 19:34
在64bit系统下调用32bit必须使用x86的JDK,这是由于64bit/32bit dll不能混合调用,而x64JDK默认调用64bit dll所致,具体原因如下: (转)64位应用程序的第一条规则是:你绝对不能把32位和64位代码混和在同一个应用程序内。如果你有一个64位应用程序,所有与这个应用程序相关的东西,包括DLL文件,必须是64位的。这就有一个有趣的挑战,因为有时候很多应用程序都依靠一个共同的DLL文件。幸运的是,Windows保持32位的DLL文件和64位的DLL文件处于隔离状态。   如果你查看一下在32位操作系统内的\Windows文件夹,你会发现两个子目录:一个名为SYSTEM,还有一个名为SYSTEM32。SYSTEM目录是Windows 3.x遗留下来的,用来保持Windows的对一些旧的应用程序的向下兼容性。一般说来,16位的DLL文件(以及其它的支持文件)被存放在\Windows\System文件夹里,32位DLL文件和不同支持文件被存放在\Windows\System32文件夹里。   32位版本的Windows保持16位和32位DLL文件的方式是非常简单的,但是64位版本的Windows保持64位和32位DLL文件的方式就不这么简单了。 理论上说,微软将要创建一个名为\Windows\System64的文件夹来用其存放64位DLL文件,但是取而代之的是,微软创建了一个新的名为SysWOW64的文件夹来存放32位的DLL文件。第一眼看起来,让人感觉这个文件夹应该存放64位应用程序的,但是注意,32位应用程序本来应该存放它们的DLL文件到\Windows\System32文件夹里面。   \Windows\System32文件夹在64位版本的Windows内仍然存在。但是微软使用这个文件夹做为64位DLL的仓库,而不是32位DLL文件的。我不清楚微软使用\Windows\System32文件夹来存放64位DLL的原因,但是我听说这么做是为了向下兼容性。   那么是不是所有32位应用程序该存放它们的DLL文件到\Windows\System32文件夹呢?这又让事情变得混乱。   如我之前所提及的,32位代码不能默认在64位版本的Windows内运行。为了运行32位的应用程序,Windows使用WOW64 emulator,来让这些应用程序还认为它们在32位版本的Windows内运行。   当你安装一个32位的应用程序,安装向导通过WOW64 emulato运行。32位和64位代码并不混和。一旦一个应用程序(包括一个安装向导)从WOW64 emulator开始运行,它必须接着在WOW64内继续运行。这意味着当你安装一个应用程序,安装向导并不知道这个程序被安装到64位版本的Windows内,并且和它运行在32位操作系统一样把DLL文件写到\Windows\System32文件夹里面。   当然,WOW64知道安装向导通过emulator来运行的32位应用程序。同时也知道64和32位代码不能混合在一起。所以,WOW64 emulator 给\Windows\SysWOW64创建一个别名。这意味着任何时候32位应用程序要写入到\Windows\System32文件夹或者从\Windows\SysWOW64文件夹读取,WOW64 emulator都能使其改道到\Windows\SysWOW64文件夹。   所有这些都意味着如果你需要手动操作\Windows\System32文件夹内的内容,你可能要非常的麻烦。我最近了解到一个管理员需要安装一些小的支持脚本到一个已经安装的应用程序,这个脚本的指导上说明这些脚本需要被存放到\Windows\System32文件夹。当然这些脚本的说明假定这个应用程序是在32位操作系统上运行的。   这些脚本没有引起系统崩溃。然而Windows给人幻想永远不用进行更新。当管理员运行应用程序,它将被改道到\Windows\SysWOW64文件夹。管理员知道他自己把这些脚本放到\Windows\System32文件夹并且能通过Windows浏览器看到这些脚本,但是不能指出为什么应用程序不能看到这些脚本。考虑到这个问题是和权限相关的,他花费了一些时间来研究这个,所以知道了关于64位版本的Windows保存DLL文件隔离的方法,所以他能够把这些脚本放到\Windows\SysWOW64文件夹。 附上一款好用的DLL依赖查看器:Dependence walker ( http://www.dependencywalker.com/ )
个人分类: 系统工程|11704 次阅读|3 个评论
[转载]mcc、mbuild和mex命令详解
songhaiyu 2011-7-16 22:15
http://www.matlabsky.com/thread-544-1-1.html 好多学习Matlab扩展编程的人经常把这几个命令给搞混淆的,下面我就给大家仔细讲讲,希望呢给大家讲明白! 先简单的说说mcc、mbuild和mex到底怎么回事: mcc将M文件转换成C/C++文件和相应的MEX包裹文件(需要Matlab编辑器),但在特定条件下可以自动调用mbuild或者mex mex将C/C++文件(入口函数为mexfunction())编译成MEX(DLL)文件(需要C/C++编辑器) mbuild将C/C++文件(入口函数为main())生成可独立运行的C应用程序(需要C/C++编辑器) 复制代码 一 mcc命令 Matlab编译器使用 mcc命令能将一个M文件翻译成C文件,同时生成一个相应的包裹文件 ,这个包裹文件包含了编译器产生的代码和它支持的可执行文件类型之间所需的接口。利用改包裹文件提供的接口,生成的C文件能用在任何编译器所支持的可执行文件类型(如MEX文件、EXE文件、DLL文件)中,这些C文件与最终生成的可执行文件是相互独立的。 Matlab编译器(Lcc)在 特定的条件下能自动调用mex和mbuild函数 ,尤其是mcc –x/-m/-p时。 (1)创建MEX文件 mcc –x filename (注意这个命令在2008a中已经去掉了) 将M文件filename.m翻译成C代码,并生成一个可被Matlab直接调用的C的MEX。 (2)创建simulink S函数 mcc –s filename 将M文件filename.m翻译成C代码,并生成一个相应的simulink S函数,该函数的输入输出变量的大小可动态改变。 (3)创建可独立执行的C程序 mcc –m filename 将M文件filename.m翻译成C代码,生成的可执行文件能独立于Matlab运行环境。 (4)创建可独立运行的C++程序 mcc –p filename 将M文件filename.m翻译成C++代码,生成的可执行文件能独立于Matlab运行环境。 (5)创建可独立运行的C图形库函数 mcc –B sgl filename 如果filename.m中包含了对Matlab图形处理函数的调用,上述命令,将filename转换成为C语言,并生成一个能独立于Matlab运行环境的可执行程序。 (6) 创建可独立运行的C++图形库函数 mcc –B sgl cpp filename 如果filename.m中包含了对Matlab图形处理函数的调用,上述命令,将filename转换成为C++语言,并生成一个能独立于Matlab运行环境的可执行程序。 (7)创建C函数库 mcc –m –W lib:libfoo –T link:libfoo.m 创建一个C函数库 二 mex命令 用户可以在Matlab中按简单的M文件语法规则设计出来完成特定计算的算法。然后用 Matlab编译器调用mex命令创建C共享库函数(DLL)或C++静态函数库 ,最后将它们整合到C/C++应用程序中,编译完这些C/C++应用程序,就可以用这些算法来实现特定的计算功能。当然这过程中也隐藏了算法和加快了代码的执行效率。 由于MEX文件执行效率高,故如果有文件重名的话,Matlab将优先调用MEX文件 ,下面以一个例子说明: function theimage=gasket(numpoits) theimage=zeros(1000); corners= ; startpoit= ; therand=ceil(rand(numpoits,1)*3); for ii=1:numpoits startpoit=floor((corners(therand(ii),:)+startpoit)/2); theimage(startpoit(1),startpoit(2))=1; end imagesc(theimage) colormap( ); axis equal tight 复制代码 现在直接调用 tic ,gasket(5000000);toc Elapsed time is 7.240129 seconds. 复制代码 接着把它编译成mex文件在调用试试 mcc -p tic gasket;tic ,gasket(5000000);toc Elapsed time is 1.23861 seconds. 复制代码 三 mbuild命令 要建立独立运行的C应用程序,系统中需要 安装Matlab、Matlab编译器、C/C++编译器以及Matlab C/C++数学库函数和图形库函数 。 Matlab编译器使用 mbuild命令可以直接将C/C++源代码编译为独立运行程序 ,在这些源代码中可以使用Matlab提供的接口来调用Matlab数学库函数。 虽然生成的 可执行程序可以脱离Matlab环境运行,但是它需要Matlab C/C++数学库文件或者图形库文件的支持才能运行 。但如果C/C++源代码完全是按传统C/C++源代码语法规则编写,没有包含Matlab数学库和图形库的调用,则不仅可以独立与Matlab环境,也不需要那两个库函数的支持。 对于如何在其他环境中运行那个生成的exe文件,大家看看这个帖子: http://www.matlabsky.com/thread-543-1-1.html 下面说说一些比较和区别: 1. MEX文件和EXE文件的差别 Mex文件与Matlab解释器在同一个过程空间运行,当用户调用一个MEX文件时Matlab解释器就会动态的连接到MEX文件。 可独立运行的C/C++应用程序(exe)可以独立于Matlab环境而运行, 而MEX文件则不行,它需要Matlab的支持 。还有EXE中可以调用MEX文件。 2.mex和mbuild编译的C/C++文件的差别 使用mbuild命令编译的C/C++源文件中, 必须包含main()函数 ,它能独立于Matlab运行。而mex命令编译的C/C++源文件中不含main()函数, 它是以mexfunction()函数作为入口的 ,编译后生成的是mex文件,被Matlab调用。 下面是我的一些使用心得 由于真正掌握C/C++接口编程比较麻烦, 故对初学者较少直接使用mex命令 (花费那么大的精力去学习那些接**术,接着利用接**术编写C/C++文件,再使用mex命令来编译它),一般大家都是先写好M文件再使用mcc –x命令让它生成MEX (DLL)文件。 但对纯正的C/C++大家却都比较熟悉,故mbuild命令还是有些市场的
个人分类: 程序设计|4843 次阅读|0 个评论
[转载]企业信息化应采用“五个一”
zlhua 2011-7-10 20:16
刘小兵早在2000年的时候就提出了五个一,即“一个机房、一个数据库、一套服务器、一套应用程序、一个维护班子”。在那时他所提的数据大集中,被很多专家认为是不可能实现的事。但是双汇这么多年一直坚持数据大集中,从一个几百人的小厂,发展到如今年销售400多亿的企业,这期间IT起到了不可或缺的作用。 “我参观过一些著名大型企业,为了显示企业实力,让我们看他有机房很大,分布在全国各地,结果,投入了大量资金、人力、物力去管理,IT支出惊人,形成了IT黑洞,这样不但无端增加了很多管理成本,更增加了能耗,关键是企业集团内的数据还不能共享,高层领导不能随时掌握集团各项数据,在数据大集中方面,双汇集团、工商银行都领先了一步。”刘小兵给记者算了一笔帐:“目前双汇只有一个机房,真正管机房的只有一个半人,而且完全满足了双汇集团这个年产销400亿规模的企业集团的所有信息化需求。”他介绍说,企业在取得上述丰硕信息化成果的同时,也收获了低碳这个“副产品”:由于库存水平显著下降,双汇集团的冷库使用量大大降低,节约了大量电力;运输线路优化和回程配货大大减少了车辆的无效运行,直接减少大量的尾气排放;无纸化办公不仅节省资源,而且保护了森林,有助于二氧化碳的吸收;减少差旅有效地降低了对社会运输资源和酒店等资源的占用和消耗…… 呼吁央企信息化采用“双汇模式” 刘小兵呼吁,央企应该采用双汇信息化管理模式,一个机房,一个数据库、一套程序,这样不但数据更新快,降低业务成本,同时也便于集团高层随时掌握全面数据,更能实现减少碳排放的这一全民目标。 “实现数据大集中是一个趋势,哪个企业不顺应这个趋势,他的信息化就会被淘汰掉,他的CIO就不是一个负责任的CIO。”刘小兵也同时指出,“企业实现数据大集中就像飞机飞行途中换发动机,风险确实大,但是,哪个企业先换,哪个企业就能赢得先机。” 中国缺少国家级CIO 令记者没有想到的是,一向低调的刘小兵在采访中竟然语出惊人,他认为:“要真正实现减少碳排放目标,中国缺一个国家级的CIO,应该在国家里面选择一个懂IT的人,这个CIO一定要对信息化非常理解,而且还得懂企业,懂管理。应该有一个国家CIO站的国家的高度,去整合我们国家的多元信息。” 他举例说:“像我们国家在物流行业,应该利用信息化手段加强资源的整合,把物流资源整合起来,还要把需求整合起来。比如对于食品行业,应该把各个企业的渠道和物流需求整合起来。现在我们企业的渠道是各走各的,蒙牛走蒙牛的渠道,双汇走双汇的渠道,娃哈哈走娃哈哈取得,可乐走可乐的渠道。各自走各自的渠道,各自有各自的物流。如果能够整合一下,协同起来,不但企业会降低成本,整个社会物流体系的效率也能提高很多。” 那么这种整合模式,与曾经的计划经济似有很多相似点,对此,刘小兵坦承:“事事无绝对,不能说计划经济不好,也不能说市场经济不好,它们两个,结合在一起最好。怎么样既满足市场需求,又能做到计划生产呢,当然只能靠信息化了。” 来源:双汇软件
个人分类: 快乐学习|1807 次阅读|0 个评论
[转载]多线程中使用CheckForIllegalCrossThreadCalls = false访问窗口
dolphinzhu 2011-7-2 14:39
如下: 在窗口构造函数中将CheckForIllegalCrossThreadCalls设置为 false public Form1() { InitializeComponent(); CheckForIllegalCrossThreadCalls = false; } 【msdn】 如何:对 Windows 窗体控件进行线程安全调用 使用多线程提高 Windows 窗体应用程序的性能时,必须注意以线程安全方式调用控件。 示例 访问 Windows 窗体控件本质上不是线程安全的。如果有两个或多个线程操作某一控件的状态,则可能会迫使该控件进入一种不一致的状态。还可能出现其他与线程相关的 bug,包括争用情况和死锁。确保以线程安全方式访问控件非常重要。 .NET Framework 有助于在以非线程安全方式访问控件时检测到这一问题。在调试器中运行应用程序时,如果创建某控件的线程之外的其他线程试图调用该控件,则调试器会引发一个 InvalidOperationException ,并提示消息:“从不是创建控件 control name 的线程访问它。” 此异常在调试期间和运行时的某些情况下可靠地发生。强烈建议您在显示此错误信息时修复此问题。在调试以 .NET Framework 2.0 版之前的 .NET Framework 编写的应用程序时,可能会出现此异常。 注意 可以通过将 CheckForIllegalCrossThreadCalls 属性的值设置为 false 来禁用此异常。这会使控件以与在 Visual Studio 2003 下相同的方式运行。 转自: http://www.cnblogs.com/lanru/archive/2010/07/15/1777892.html
个人分类: CSHARP|2843 次阅读|0 个评论
[转载]C# winform 自定义应用程序配置文件
dolphinzhu 2011-6-28 00:17
C#读取配置文件需要注意的一些问题: C#读取配置文件1.了解配置文件概述: 应 用程序配置文件是标准的 XML 文件,XML 标记和属性是区分大小写的。它是可以按需要更改的,开发人员可以使用配置文件来更改设置,而不必重编译应用程序。配置文件的根节点是 configuration。我们经常访问的是appSettings,它是由.Net预定义配置节。我们经常使用的配置文件的架构是象下面的形式。先大 概有个印象,通过后面的实例会有一个比较清楚的认识。下面的“配置节”可以理解为进行配置一个XML的节点。 常见配置文件模式: ﹤configuration﹥ ﹤configSections﹥ //配置节声明区域,包含配置节和命名空间声明 ﹤section﹥ //配置节声明   ﹤sectionGroup﹥ //定义配置节组 ﹤section﹥ //配置节组中的配置节声明 ﹤appSettings﹥ //预定义配置节 ﹤Custom element for configuration section﹥ //配置节设置区域 C#读取配置文件2.只有appSettings节的配置文件及访问方法 下面是一个最常见的应用程序配置文件的例子,只有appSettings节。 ﹤?xml version= "1.0" encoding= "utf-8" ?﹥ ﹤configuration﹥ ﹤appSettings﹥ ﹤add key= "connectionstring" value= "User ID=sa;Data Source=.; Password=;Initial Catalog=test;Provider=SQLOLEDB.1;" /﹥ ﹤add key= "TemplatePATH" value= "Template" /﹥ ﹤/appSettings﹥ ﹤/configuration﹥ 下面来看看这样的配置文件如何方法。 string _connectionString=ConfigurationSettings.AppSettings ; 使用ConfigurationSettings类的静态属性AppSettings就可以直接方法配置文件中的配置信息。这个属性的类型是NameValueCollection。 C#中读取配置文件3.自定义配置文件 3.1 自定义配置节 一个用户自定义的配置节,在配置文件中分为两部分:一是在﹤configSections﹥﹤/ configSections﹥配置节中声明配置节(上面配置文件模式中的“﹤section﹥”),另外是在﹤ configSections﹥﹤/ configSections ﹥之后设置配置节(上面配置文件模式中的“﹤Custom element for configuration section﹥”),有点类似一个变量先声明,后使用一样。声明一个配置文件的语句如下: ﹤section name= " " type= " " /﹥ ﹤section﹥:声明新配置节,即可创建新配置节。 name:自定义配置节的名称。 type:自定义配置节的类型,主要包括 System.Configuration.SingleTagSectionHandler、 System.Configuration.DictionarySectionHandler、 System.Configuration.NameValueSectionHandler。 不同的type不但设置配置节的方式不一样,最后访问配置文件的操作上也有差异。下面我们就举一个配置文件的例子,让它包含这三个不同的type。 ﹤?xml version= "1.0" encoding= "utf-8" ?﹥ ﹤configuration﹥ ﹤configSections﹥ ﹤section name= "Test1" type= "System.Configuration.SingleTagSectionHandler" /﹥ ﹤section name= "Test2" type= "System.Configuration.DictionarySectionHandler" /﹥ ﹤section name= "Test3" type= "System.Configuration.NameValueSectionHandler" /﹥ ﹤/configSections﹥ ﹤Test1 setting1= "Hello" setting2= "World" /﹥ ﹤Test2﹥ ﹤add key= "Hello" value= "World" /﹥ ﹤/Test2﹥ ﹤Test3﹥ ﹤add key= "Hello" value= "World" /﹥ ﹤/Test3﹥ ﹤/configuration﹥ 我们对上面的自定义配置节进行说明。在声明部分使用﹤section name="Test1" type="System.Configuration.SingleTagSectionHandler"/﹥声明了一个配置节它的名字叫 Test1,类型为SingleTagSectionHandler。在设置配置节部分使用﹤Test1 setting1="Hello" setting2="World"/﹥设置了一个配置节,它的第一个设置的值是Hello,第二个值是World,当然还可以有更多。其它的两个配 置节和这个类似。 下面我们看在程序中如何访问这些自定义的配置节。我们用过ConfigurationSettings类的静态方法GetConfig来获取自定义配置节的信息。 public static object GetConfig( string sectionName); C#读取配置文件之访问配置节的代码: //访问配置节Test1 IDictionary IDTest1 = (IDictionary)ConfigurationSettings.GetConfig( "Test1" ); string str = ( string )IDTest1 + " " +( string )IDTest1 ; MessageBox.Show(str); //输出Hello World //访问配置节Test1的方法2 string ; IDTest1.Values.CopyTo(values1,0); MessageBox.Show(values1 + " " +values1 ); //输出Hello World //访问配置节Test2 IDictionary IDTest2 = (IDictionary)ConfigurationSettings.GetConfig( "Test2" ); string ; string ; IDTest2.Keys.CopyTo(keys,0); IDTest2.Values.CopyTo(values,0); MessageBox.Show(keys + " " +values ); //访问配置节Test3 NameValueCollection nc=(NameValueCollection)ConfigurationSettings.GetConfig( "Test3" ); MessageBox.Show(nc.AllKeys .ToString()+ " " +nc ); //输出Hello World 通过上面的代码我们可以看出,不同的type通过GetConfig返回的类型不同,具体获得配置内容的方式也不一样。 配置节处理程序 返回类型 SingleTagSectionHandler Systems.Collections.IDictionary DictionarySectionHandler Systems.Collections.IDictionary NameValueSectionHandler Systems.Collections.Specialized.NameValueCollection 3.2 自定义配置节组 配置节组是使用﹤sectionGroup﹥元素,将类似的配置节分到同一个组中。配置节组声明 部分将创建配置节的包含元素,在﹤configSections﹥元素中声明配置节组,并将属于该组的节置于﹤ sectionGroup﹥元素中。下面是一个包含配置节组的配置文件的例子: ﹤?xml version= "1.0" encoding= "utf-8" ?﹥ ﹤configuration﹥ ﹤configSections﹥ ﹤sectionGroup name= "TestGroup" ﹥ ﹤section name= "Test" type= "System.Configuration.NameValueSectionHandler" /﹥ ﹤/sectionGroup﹥ ﹤/configSections﹥ ﹤TestGroup﹥ ﹤Test﹥ ﹤add key= "Hello" value= "World" /﹥ ﹤/Test﹥ ﹤/TestGroup﹥ ﹤/configuration﹥ C#读取配置文件之访问配置节组的代码: NameValueCollection nc=(NameValueCollection)ConfigurationSettings.GetConfig( "TestGroup/Test" ); MessageBox.Show(nc.AllKeys .ToString()+ " " +nc ); //输出Hello World C#读取配置文件的相关内容就向你介绍到这里,希望对你了解和学习C#读取配置文件有所帮助。 //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// 1. 配置文件概述: 应用程序配置文件是标准的 XML 文件,XML 标记和属性是区分大小写的。它是可以按需要更改的,开发人员可以使用配置文件来更改设置,而不必重编译应用程序。配置文件的根节点是configuration。我们经常访问的是appSettings,它是由.Net预定义配置节。我们经常使用的配置文件的架构是象下面的形式。先大概有个印象,通过后面的实例会有一个比较清楚的认识。下面的“配置节”可以理解为进行配置一个XML的节点。 常见配置文件模式: configuration configSections //配置节声明区域,包含配置节和命名空间声明 section //配置节声明   sectionGroup //定义配置节组    section //配置节组中的配置节声明 appSettings //预定义配置节 Custom element for configuration section //配置节设置区域 2. 只有appSettings节的配置文件及访问方法 下面是一个最常见的应用程序配置文件的例子,只有appSettings节。 ?xml version="1.0" encoding="utf-8"? configuration appSettings add key="connectionstring" value="User ID=sa;Data Source=.;Password=;Initial Catalog=test;Provider=SQLOLEDB.1;" / add key="TemplatePATH" value="Template" / /appSettings /configuration 下面来看看这样的配置文件如何方法。 string _connectionString=ConfigurationSettings.AppSettings ; 使用ConfigurationSettings类的静态属性AppSettings就可以直接方法配置文件中的配置信息。这个属性的类型是NameValueCollection。 3.自定义配置文件 3.1 自定义配置节 一个用户自定义的配置节,在配置文件中分为两部分:一是在configSections/ configSections配置节中声明配置节(上面配置文件模式中的“section”),另外是在configSections/ configSections 之后设置配置节(上面配置文件模式中的“Custom element for configuration section”),有点类似一个变量先声明,后使用一样。声明一个配置文件的语句如下: section name=" " type=" "/ section:声明新配置节,即可创建新配置节。 name:自定义配置节的名称。 type:自定义配置节的类型,主要包括System.Configuration.SingleTagSectionHandler、System.Configuration.DictionarySectionHandler、System.Configuration.NameValueSectionHandler。 不同的type不但设置配置节的方式不一样,最后访问配置文件的操作上也有差异。下面我们就举一个配置文件的例子,让它包含这三个不同的type。 ?xml version="1.0" encoding="utf-8" ? configuration configSections section name="Test1" type="System.Configuration.SingleTagSectionHandler"/ section name="Test2" type="System.Configuration.DictionarySectionHandler"/ section name="Test3" type="System.Configuration.NameValueSectionHandler" / /configSections Test1 setting1="Hello" setting2="World"/ Test2 add key="Hello" value="World" / /Test2 Test3 add key="Hello" value="World" / /Test3 /configuration 我们对上面的自定义配置节进行说明。在声明部分使用section name="Test1" type="System.Configuration.SingleTagSectionHandler"/声明了一个配置节它的名字叫Test1,类型为SingleTagSectionHandler。在设置配置节部分使用 Test1 setting1="Hello" setting2="World"/设置了一个配置节,它的第一个设置的值是Hello,第二个值是World,当然还可以有更多。其它的两个配置节和这个类似。 下面我们看在程序中如何访问这些自定义的配置节。我们用过ConfigurationSettings类的静态方法GetConfig来获取自定义配置节的信息。 public static object GetConfig(string sectionName); 下面是访问这三个配置节的代码: //访问配置节Test1 IDictionary IDTest1 = (IDictionary)ConfigurationSettings.GetConfig("Test1"); string str = (string)IDTest1 +" "+(string)IDTest1 ; MessageBox.Show(str); //输出Hello World //访问配置节Test1的方法2 string ; IDTest1.Values.CopyTo(values1,0); MessageBox.Show(values1 +" "+values1 ); //输出Hello World //访问配置节Test2 IDictionary IDTest2 = (IDictionary)ConfigurationSettings.GetConfig("Test2"); string ; string ; IDTest2.Keys.CopyTo(keys,0); IDTest2.Values.CopyTo(values,0); MessageBox.Show(keys +" "+values ); //访问配置节Test3 NameValueCollection nc=(NameValueCollection)ConfigurationSettings.GetConfig("Test3"); MessageBox.Show(nc.AllKeys .ToString()+" "+nc ); //输出Hello World 通过上面的代码我们可以看出,不同的type通过GetConfig返回的类型不同,具体获得配置内容的方式也不一样。 配置节处理程序 返回类型 SingleTagSectionHandler Systems.Collections.IDictionary DictionarySectionHandler Systems.Collections.IDictionary NameValueSectionHandler Systems.Collections.Specialized.NameValueCollection 3.2 自定义配置节组 配置节组是使用sectionGroup元素,将类似的配置节分到同一个组中。配置节组声明部分将创建配置节的包含元素,在configSections元素中声明配置节组,并将属于该组的节置于sectionGroup元素中。下面是一个包含配置节组的配置文件的例子: ?xml version="1.0" encoding="utf-8" ? configuration configSections sectionGroup name="TestGroup" section name="Test" type="System.Configuration.NameValueSectionHandler"/ /sectionGroup /configSections TestGroup Test add key="Hello" value="World"/ /Test /TestGroup /configuration 下面是访问这个配置节组的代码: NameValueCollection nc=(NameValueCollection)ConfigurationSettings.GetConfig("TestGroup/Test"); MessageBox.Show(nc.AllKeys .ToString()+" "+nc ); //输出Hello World 转自: http://fdm0111.blog.163.com/blog/static/813758200852523953920/ 转自: http://hi.baidu.com/huahua382811/blog/item/27d43cef3bd587f7b3fb956d.html
个人分类: CSHARP|6336 次阅读|0 个评论
[转载]构建正则表达式模式的技能
chnfirst 2011-6-2 08:56
http://blog.csdn.net/yishengxiao/archive/2008/07/28/2723312.aspx 磨练 构建正则表达式模式的技能 通过本文的学习,您可以增加一些有用的设计实际正则表达式 (regexp) 的技能。构建正则表达式是任何管理员日常工作中的一部分。为了构造返回所需条件的成功正则表达式,需要学习以模式匹配的角度进行思考,而这种技能需要花大量的时间进行练习。 引言 UNIX 管理员每天都需要构建和使用正则表达式 (regexp) 进行文本模式匹配。大多数语言都支持正则表达式的某种实现。有的应用程序(如 EMACS)具有正则表达式搜索功能,并且您可以通过各种命令行工具使用正则表达式。无论什么应用程序,构建正确的正则表达式的关键之处在于,识别仅满足需要匹配的数据的模式,以便在输入中排除其他不必要的内容。 出于这个目的,本文将逐步介绍几种正则表达式模式构建技巧,并介绍它们如何帮助您完成各种常规任务。 使用正则表达式 (regexp) 除非特别说明,否则本文中使用的示例都是扩展可移植操作系统接口(扩展 POSIX)的正则表达式。如果通过命令行(如使用 egrep 实用工具)使用它们,您应该根据需要引用各种正则表达式。请记住,不同的正则表达式实现之间存在一些区别,您可能不得不适应所使用的特定的工具、应用程序或语言中的具体实现。 匹配整行内容 ^ 元字符匹配行首,而 $ 匹配行尾,如果将它们组合在一起(如 ^$),它们将匹配空行。(这个表达式的镜像,即 $^,是不可能匹配成功的,它将永远 都无法匹配到有效行。)这个基本的正则表达式是许多复杂正则表达式的基础,如果您还不习惯使用这个基本的正则表达式,那么您应该逐步养成使用它的习惯。使用它来构建匹配整行内容 的模式。 在用户字典文件 (/usr/dict/words) 中搜索是一个很好的基本模式。(有些版本的 UNIX 将用户字典放在 /usr/share/dict/words 中。) 例如,假设您忘记了如何拼写单词 fuchsia。其中是否包含 sh 或 cs 呢?您所知道的只是,它以 fu 开头并以 ia 结尾。 尝试使用这个模式进行搜索: $ egrep -i '^fu.*ia$' /usr/dict/words -i 标志表示在搜索过程中不区分大小写。在这个示例中,因为 fuchsia 拼写正确,所以在返回的单词中包括这个单词。 根据长度匹配行 使用大括号元字符 ({ }) 指定前面的正则表达式匹配多少次,如表 1 所示。当您将它们添加到刚才介绍的整行搜索中时,您可以指定行的长度。 表 1. 大括号元字符的含义 示例 描述 {X} 这个字符对前面的正则表达式匹配 X 次。 {X,} 这个字符对前面的正则表达式匹配 X 或更多 次。 {X,Y} 这个字符对前面的正则表达式匹配至少 X 而不超过 Y 次。 并不是所有扩展正则表达式的实现都支持大括号。此外,根据具体的实现,您可能需要先使用反斜杠对其进行转义。 您可以使用这个正则表达式得到字典中以单词长度为顺序的报告。所获得结果的数目取决于本地系统的字典文件中单词的数目,然而,它应该与清单 1 所示类似。在这个示例中,最常见的单词长度是 9 个字母,该字典中有 32,380 个匹配单词。该字典中不包括 25 个字母或更长的单词,并且最长的单词并不是您认为的 21 个字母长的 disestablishmentarian(有 81 个同样长度的单词,包括 superincomprehensible 和 phoneticohieroglyphic),这个 UNIX 字典中最长的单词有 5 个,包括 pathologicopsychological。 清单 1. 计算字典中 X 个字母的单词的个数 $ for i in `seq 1 32` { echo "There are" `egrep '^.{'$i'}$' /usr/dict/words \ | wc -l` "$i-letter words in the dictionary." } There are 52 1-letter words in the dictionary. There are 155 2-letter words in the dictionary. There are 1351 3-letter words in the dictionary. There are 5110 4-letter words in the dictionary. There are 9987 5-letter words in the dictionary. There are 17477 6-letter words in the dictionary. There are 23734 7-letter words in the dictionary. There are 29926 8-letter words in the dictionary. There are 32380 9-letter words in the dictionary. There are 30867 10-letter words in the dictionary. There are 26011 11-letter words in the dictionary. There are 20460 12-letter words in the dictionary. There are 14938 13-letter words in the dictionary. There are 9762 14-letter words in the dictionary. There are 5924 15-letter words in the dictionary. There are 3377 16-letter words in the dictionary. There are 1813 17-letter words in the dictionary. There are 842 18-letter words in the dictionary. There are 428 19-letter words in the dictionary. There are 198 20-letter words in the dictionary. There are 82 21-letter words in the dictionary. There are 41 22-letter words in the dictionary. There are 17 23-letter words in the dictionary. There are 5 24-letter words in the dictionary. There are 0 25-letter words in the dictionary. There are 0 26-letter words in the dictionary. There are 0 27-letter words in the dictionary. There are 0 28-letter words in the dictionary. There are 0 29-letter words in the dictionary. There are 0 30-letter words in the dictionary. There are 0 31-letter words in the dictionary. There are 0 32-letter words in the dictionary. $ 匹配单词 围绕字符 \ 和 \ 是非常有用的模式构造器:它们将要匹配的整个单词 括起来,这表示,它们不会匹配带括号的模式,除非该模式本身就是一个单词。单词 定义为两侧由非单词字符描述的、任意数目组成单词的字符(数字、字母和下划线字符)。非单词字符包括下面的所有字符: •行首 •空白字符 •标点符号 •行尾 •任何除字母、数字或下划线以外的字符 这些围绕字符可以节省大量的时间,但是它们常常没有被充分地利用,可能是因为并非所有的正则表达式实现都支持它们。如果您的正则表达式实现支持它们,那么您应该逐步养成使用它们的习惯。 将需要单独匹配的单词括起来,如下所示: \system\ 这个示例中的正则表达式不会匹配单词 ecosystem、systemic 或 system/70,也不会匹配模式 system 出现在行中任意位置的那些行,它将仅仅 匹配 system 作为独立的单词出现的那些行。 围绕字符与圆括号中的分组结合在一起,可以用来匹配部分 单词。 要匹配包含以 pre 开头 的单词的那些行,可以使用: \\(pre\).*\ 前面的示例将匹配包含单词 preface 和 preposterous 的行,但不会匹配 spread 或 Dupre。 匹配重复单词 这里介绍一种使用单词围绕字符匹配重复单词的快速方法,重复单词表示一个单词在空格之后再次出现。您还可以使用逆向引用,这是大多数流行的正则表达式实现中的一种递归特性,它可以匹配模式本身的某一部分。(将模式中需要引用的部分使用圆括号括起来,然后使用反斜杠加上需要进行引用的围绕字符编号来调用逆向引用:1 表示第一个圆括号分组,2 表示第二个圆括号分组,依此类推。) 要查找重复的单词,搜索在任意数目的空格之后再次出现该单词的情况,可以通过对第一个使用圆括号的部分进行逆向引用来实现: (\.*\)( )+\1 这个示例匹配缩写形式和任何类型的单词,但是它不会匹配由标点符号分隔的重复单词,如 It's been a long, long time。 要匹配所有的重复单词,包括由空格和 任意标点符号分隔的重复单词,可以使用下面的表达式: (\.*\).?( )+\1 如果需要对这些正则表达式使用 grep,则务必使用 -i 标志,以便在搜索中不区分大小写。 匹配小时 让我们再来看另外一类常见的问题:时间和日期。这里介绍了一些设计匹配正确模式的正则表达式所需要考虑的事项。 您无法搜索任何两位的数字来匹配分钟和秒,因为它们仅仅是从 0 到 59,要匹配它们,您需要使用方括号将表示十位和个位的范围括起来: •要匹配标准的 12 或 24 小时格式的小时,可以使用下面的表达式: (( ? )|( )):( )(: )? •要匹配 12 小时 AM/PM 格式、带或不带秒数的时间,甚至匹配大写或小写、不带后缀 AM 或 PM 标识符的时间,可以使用下面的表达式: ( )( ? ){1}(((:( ){1}( ){1}){1,2})|(( )?( M)|( m)))? 如果在上一个示例中没有开始的否定语句,它将匹配不带冒号的时间,这将取决于输入数据,可能会匹配中波广播电台(在美国称为调幅 AM 电台),如 1450 AM。 匹配月份 匹配 12 个月中的任何月份需要一个使用 | 操作符进行分隔的列表,但有时会使用不同的方式对日期进行缩写: •要查找完整拼写或三字母缩写的 12 个月份,可以使用下面的表达式(位于一行): Jan(uary)?|Feb(uary)?|Mar(ch)?|Apr(il)?|May|Jun(e)?|Jul(y)?| Aug(ust)?|Sep(tember)?|Oct(ober)?|Nov(ember)?|Dec(ember)? •您可以加以想象并搜索完整拼写或三字母缩写的变形,即仅当后面紧跟着一个空格或点号的情况,可以使用下面的表达式(位于一行): Jan(uary| |\.)|Feb(uary| |\.)|Mar(ch| |\.)|Apr(il| |\.)|May( |\.)|Jun(e| |\.)|Jul(y| |\ .)|Aug(ust| |\.)|Sep(tember| |\.)|Oct(ober| |\.)|Nov(ember| |\.)|Dec(ember| |\.) 请注意,在上面的这两个示例中,May 是一个特殊的例外。在所有的月份中,它是唯一的完整拼写与三字母缩写相同的月份,所以成功的匹配必须包含这两种变形中的任何一种 作为其缩写,因此像“Mayflower”这样的单词不会导致误报。 当匹配模式前面的字符不是空格或行首时,这些示例还是会失败(返回误报的结果)。这不太可能会出现在英语散文中,但是可能出现在程序源代码中,因为其中可能使用了像 NumOct 这样的变量名。 要修复这些问题,可以执行下面的操作: •使用圆括号将整个正则表达式括起来,并在它的前面加上另一个限定符,用于匹配行首或者空格字符,如下所示(位于一行): (^| )(Jan(uary| |\.)|Feb(uary| |\.)|Mar(ch| |\.)|Apr(il| |\.)| May( |\.)|Jun(e| |\.)|Jul(y| |\.)|Aug(ust| |\.)|Sep(tember| | \.)|Oct(ober| |\.)|Nov(ember| |\.)|Dec(ember| |\.)) •另一种完成这个任务的方法是,在该正则表达式的前面加上一个限定符,以匹配非文字数字的字符,如下所示(位于一行): ( )(Jan(uary| |\.)|Feb(uary| |\.)|Mar(ch| |\.)| Apr(il| |\.)|May( |\.)|Jun(e| |\.)|Jul(y| |\.)|Aug(ust| |\.)| Sep(tember| |\.)|Oct(ober| |\.)|Nov(ember| |\.)|Dec(ember| |\.)) 但是仍然存在潜在的问题,对于搜索整篇英文散文,这些示例并不可靠,因为它们可能返回错误的匹配结果,如“Janelle”或“Augury”这样的单词。要修复这个问题,您必须使用单词围绕字符将每个月份括起来。 本文开头提到,正确的正则表达式应该仅返回需要匹配的数据,以便在输入中排除其他不必要的内容。这种措词是经过仔细考虑的,因为对于构建正则表达式来说,这与上下文有关。对于有些情况,前面的示例非常适合,无需添加额外的单词围绕字符。在其他的情况下,可以对其进行相当程度的简化,例如,如果您正在搜索仅包含大写的日期数值数据的日志文件,那么只需要使用像 这样的正则表达式来匹配包含月份名称的行。 匹配日期 您可以结合一些表 1 所示的数量匹配来匹配日期。 要匹配“month, day, years”,可以使用下面的正则表达式(因为撇号字符是该正则表达式的一部分,所以必须使用双引号将它括起来,如下所示): " {3,10}\.? {1,2}, ( {4}|'? {2})" 这个正则表达式匹配 9 种不同的日期格式: 1.MONTH D, YY 2.MONTH D, 'YY 3.MONTH D, YYYY 4.MON. D, YY 5.MON. D, 'YY 6.MON. D, YYYY 7.MON D, YY 8.MON D, 'YY 9.MON D, YYYY 这个正则表达式的误报包括“Order 99, 99”,要消除这些误报,可以将这个正则表达式与用于月份的正则表达式结合起来,如上所述,以便能够仅匹配实际的月份名称。另外,更改数值范围以避免错误的匹配,并且通过使逗号成为可选项,重复了 18 种可能的格式。 这将得到一个很长的正则表达式。尝试下面的表达式: "( )(Jan(uary| |\.)|Feb(uary| |\.)|Mar(ch| |\.)| Apr(il| |\.)|May( |\.)|Jun(e| |\.)|Jul(y| |\.)|Aug(ust| |\.)| Sep(tember| |\.)|Oct(ober| |\.)|Nov(ember| |\.)| Dec(ember| |\.)) ? {1}(,)? ( {4}|'? {2})" 同样,根据您的需要仔细设计正则表达式。匹配模式通常比较容易,这是因为它存在于特定输入的上下文中,而不是因为它可能独立于数据集而存在。后代人将会发现,前面那个很长的正则表达式中仍然存在 Y10K 错误,因为它能匹配的最大可能的年份为 9999。 匹配整数 正如您在前几个示例中看到的,使用方括号中的范围可以很好地匹配数值。 要匹配任意长度的整数,可以在数值范围后面加上 +;要包括负值,可以在它的前面加上可选的负号(连字号)匹配: -? + 前面的例子可以匹配 0,因为 0 是指定范围中可选的字符。 对于数值匹配,使用圆括号将某些部分括起来也非常有效。要匹配任意的十进制数值,可以使用包含小数点加上一个或多个数值的可选围绕字符,以此对前面的正则表达式进行扩展: -? +(\. +)? 可以使用方括号指定十进制数值的小数位数。例如,要匹配小数位数为 5 或更多小数位数的正数值,可以使用下面的表达式: +\.( ){5,} 更多实际的匹配 范围加上使用括号括起来的元字符,在查找符合任何特定格式的数值时非常有用。将前面介绍的一些技术结合起来,可以构建匹配各种数据的正则表达式: •要匹配美国的电话号码,可以使用: ((\( {2}\))?\ ?| {2}(?:\-?|\ ?)) {2} ? {4} 这个正则表达式可以匹配美国 15 种格式的电话号码: 1.(NPA) PRE-SUFF 2.(NPA) PRE SUFF 3.(NPA) PRESUFF 4.(NPA)PRE-SUFF 5.(NPA)PRE SUFF 6.(NPA)PRESUFF 7.NPA PRE-SUFF 8.NPA PRE SUFF 9.NPA PRESUFF 10.NPAPRE-SUFF 11.NPAPRE SUFF 12.NPAPRESUFF 13.PRE-SUFF 14.PRE SUFF 15.PRESUFF 它还可以匹配美国免费 WATS 号码,尽管 1-800 的“1-”前缀或其他的免费号码不是匹配的一部分,但它本身可以匹配 10 位的数值。对于以 1 或 1+ 开头的美国号码和任意数目的空格,也完全一样,长途电话拨号前缀本身无法匹配,但是只要它后面跟着实际的号码,这个正则表达式就能够将其找出来。 •要匹配两或三位域的电子邮件地址,可以尝试下面的表达式: \ +\@ +?\. {2,3} •要匹配如今所有流行的 URL,可以使用下面的正则表达式: (((http(s)?|ftp|telnet|news)://|mailto:) ]+) 这个表达式可以正常运行,但是匹配 URL 并不像您想象的那么简单。匹配任何可能的 URL 的正则表达式,如 RFC 1738 中的定义,发表在“Regexp for URLs”(请参见参考资料部分)一文中,它非常巨大并且看起来令人生畏。现在应该将它合并为一个 类(如果有用于处理类似数据种类的各种新的类,如 ,那就好了)。 结束语 本文涉及到一些用于编写正则表达式的模式构建技术,以及如何使用它们来完成管理员时常碰到的特定类型数据匹配的工作。在此过程中,向您介绍了大量有价值的实际正则表达式,您可以将它们添加到自己的管理工具库中。 本文来自CSDN博客,转载请标明出处: http://blog.csdn.net/yishengxiao/archive/2008/07/28/2723312.aspx
个人分类: 电脑、办公|0 个评论
[转载]云服务:降低风险,保持可用性
libing 2011-6-1 17:59
根据交付模型方案(SaaS、PaaS 或 IaaS),云服务安全策略关注云安全性的不同方面: 软件即服务 (SaaS) 策略主要关注对出租给消费者的应用程序的访问管理,无论消费者是个人、企业还是政府机构。黑客可能通过分配恶意实例资源的恶意软件攻击 SaaS 应用程序,策略应该降低这种风险。例如,一个应用程序允许得到授权的牙医助理在指定的办公时间段下载牙医记录,黑客可能把这个时间段恶意地改为早上很早的时候以便于攻击。 平台即服务 (PaaS) 策略主要关注保护数据,以及对在整个业务生命周期中由独立软件厂商、创业企业或大企业的部门创建和驻留的应用程序的访问管理。策略应该降低僵尸网络(botnet)使用 PaaS 作为命令和控制中心直接安装恶意应用程序(比如弄乱牙医记录)的风险。 基础设施即服务 (IaaS) 策略主要关注管理虚拟机,以及保护数据和管理对云环境中虚拟机底层的传统计算资源的基础设施的访问。这个策略应该实现治理框架以降低虚拟机面对的风险。僵尸网络曾经使用 IaaS 作为命令和控制中心直接恶意更新虚拟机的基础设施。 本文简要讨论云服务安全问题的重要方面,然后描述风险评估和降低风险的步骤。 云服务安全性 云服务安全性会受到以下方面的威胁: 有缺陷的虚拟化系统管理程序(hypervisor)、缺少阈值策略、膨胀的负载均衡、不安全的密码技术,我们来详细讨论每一项。 有缺陷的虚拟化系统管理程序 所有类型的云服务都在虚拟机上运行,虚拟机在底层的虚拟化系统管理程序上运行,虚拟化系统管理程序允许多个操作系统共享同一硬件主机。不同信任级别的群体访问这些服务:用户、租用者和云管理员。例如,一个租用者可能签订包含 1000 个用户许可证的合约以访问某个 SaaS。 如果虚拟化系统管理程序有缺陷或被攻破了,那么所有实例资源和数据请求队列就都暴露了。攻击者可以恶意地影响阈值策略;阈值策略用于在工作负载高峰期间监视实例资源的消耗和数据请求队列 。对虚拟机之间通信所用的内部虚拟网络的控制不够明确,难以实施安全策略。对虚拟机的网络和安全控制职责可能没有很好地分隔。 黑客可以伪装成具有管理控制权的高特权用户,控制虚拟机,然后在虚拟化系统管理程序上执行恶意程序。例如,他可以访问目录文件以及恶意地为另一个虚拟机重新分配实例资源。他可以破坏在相同虚拟机上的租用者之间隔离存储、内存和路由的机制。 黑客可以从虚拟机中重新分配的实例资源中获取还没有清除的残留数据,从中窃取敏感的信息。黑客可以利用有缺陷的系统管理程序识别健康的虚拟机的邻居并监视它们的活动。他可以进入邻居的虚拟机并在 PaaS 应用程序中添加恶意代码。 缺少阈值策略 在使用服务之前,最终用户应该评估服务提供商的安全策略。需要对比云计算与内部环境的安全状况,确保云服务安全策略包含 实例资源、用户和数据请求阈值策略。资源阈值策略用于监视在工作负载高峰期间额外消耗的实例资源量。用户阈值策略检查同时登录和退出云服务的用户数量,以及用户数量是否正在接近许可证指定的最大用户数量。如果不建立这些策略,会有以下风险: 如果没有资源阈值策略,就无法知道实例资源是否达到总容量,这会导致云服务提供商在不发出警告的情况下关闭服务。 如果没有用户阈值策略,就无法知道当前的用户数量是否接近最大数量,以及有多少用户在使用完云服务之后没有退出。黑客可以识别这些用户。 如果没有数据请求阈值策略,就无法知道数据请求队列的大小。黑客可以用恶意数据请求(比如 SQL 注入的请求)淹没队列,造成这些队列达到最大容量。 膨胀的负载均衡 负载均衡用于分发实例资源和数据请求。例如,每个实例资源的负载应该不超过容量的 50%,这样如果一个实例出现故障,健康的实例可以接管失败的实例的业务事务。每个队列的数据请求负载应该不超过队列容量的 50%,这样如果一个队列出现故障,健康的队列可以接管原本发给失败的队列的数据请求。如果虚拟机中的恶意软件破坏了实例资源的负载均衡,就可以用恶意事务淹没这些资源,导致每个资源达到容量的 100%。不可能把业务事务从失败的资源实例转移到健康的实例。膨胀的负载均衡无法实现故障转移机制,比如实例资源或负载共享冗余。 不安全的密码技术 需要用某种形式的加密技术保护数据的机密性和完整性。即使数据不是敏感数据或个人数据,在云中传输和操纵数据时也应该用密码技术加以保护。黑客可以利用密码分析技术或恶意的实例资源破解密码算法。他们可以寻找密码算法中的缺陷,然后恶意修改它们,让强的加密算法变弱。黑客还可以查明密码算法的最新版本,然后在自己的计算机上执行反向工程以了解算法的工作过程。 降低云服务的风险 可以按经济有效的方式通过应用安全控制降低风险,从而降低黑客攻破资产的漏洞并威胁到实现的可能性。 在尝试降低风险之前,需要识别要保护的资产。最简单的风险评估过程如下: 1、识别资产,2、分析风险,3、应用安全对策,4、执行运行后或事件后评估。 要记住的关键概念是,在任何阶段都可以再次执行前面的步骤,从而加入新增的或原来没有发现的变量。 首先识别资产 — 硬件、软件、网络组件、个人、用户、文档和设备;这些和其他资产是云服务的直接组成部分。在识别资产之后,尝试分析风险;在此期间,如果发现遗漏了某些资产,随时可以重复第一步以更新资产集,然后重复第二步。 如果在执行第三步(应用安全对策)期间发现没有考虑到某些风险,可以返回到第二步,分析这些风险,判断每个风险的潜在损失或发生的可能性。可以从第三步返回到第一步以更新要保护的资产集。 在第四步中,定期地重新评估风险,因为新的风险、安全控制措施、基础设施技术和法律会影响安全状况。 我们来详细讨论每个步骤。 步骤 1. 识别资产 云消费者和提供商需要识别硬件和软件资产,估算更换每个资产的成本。他们应该维护并定期更新资产集,当出现组织重组、能源效率更高的技术、更好的故障转移机制和新的数据私密性法律时,资产集可能会发生变化。 当使用 PaaS 模型和 IaaS 模型时,消费者有更多的控制能力,但是如果向 SaaS 提供商租用服务,消费者需要识别的硬件和软件资产要少得多。 现在,看看对于每个云服务类型需要识别的资产。 SaaS 资产 因为云消费者具有的控制能力只是从他的桌面、笔记本电脑或移动设备访问应用程序,所以他需要识别的资产只有移动设备操作系统、应用程序和默认程序。因此,把设备资产集限制为使用 SaaS 所需的程序是很重要的。把个人使用的程序(比如下载的游戏)与访问 SaaS 所需的程序放在同一设备上是不合适的。云提供商至少应该控制以下资产:操作系统、硬件、网络基础设施、访问管理应用程序、实例资源、SaaS 应用程序升级和补丁。消费者不负责识别它们。 PaaS 资产 云消费者需要识别的资产就是他们能够控制的资产:平台的整个业务生命周期中的所有应用程序(例如电子表格、文字处理、备份、帐单、工资处理、发票处理)。在 PaaS 模型中,云提供商至少应该控制以下资产:操作系统、硬件、网络基础设施、实例资源。云消费者不负责识别这些资产。 IaaS 资产 云消费者需要识别的资产就是他们能够控制的资产:操作系统、网络设备以及在虚拟机级部署的应用程序。消费者可以增加或减少实例资源和虚拟服务器的数量或存储区域块。云消费者无法控制基础设施和底层组件。提供商需要识别这些资产。 步骤 2. 分析风险 风险就是黑客利用云服务的漏洞可能导致的损失或发生这种情况的可能性。如果不应用经济有效的对策,云服务就很容易受到漏洞的影响,黑客可能利用漏洞发起攻击。 风险可能给资产带来的损失取决于风险对每个资产的影响(例如,对于总是可用的文档资产,没有影响;对于云环境中的实例资源资产,如果没有足够的保护措施,影响可能非常大)。风险可能给资产带来的损失还取决于威胁出现的频繁程度。 如何利用漏洞 我们通过一个简单的示例看看黑客如何综合利用以下漏洞发起对实例资源资产的攻击。这些漏洞是: 应用程序缺少阈值模块、在实例资源中残留的数据、在虚拟化网络中基于网络的控制不足、对特权用户的监视不足。 好的应用程序划分为模块,模块相互交互以执行一个或一系列任务;这意味着开发人员很容易通过重用现有模块或添加新模块修改应用程序。如果应用程序缺少阈值模块(它设置实例资源的最大容量和数据请求的数量),消费者和提供商就无法知道实例资源或数据请求是否已经达到限制。他们无法知道黑客是否在驻留健康虚拟机的物理服务器上创建了恶意虚拟机,等他们发现时已经太晚了(例如已经发生了拒绝服务攻击)。黑客可以用恶意实例资源和恶意数据请求淹没恶意虚拟机的邻居,由此实现拒绝服务攻击。他们诱使受害者增加虚拟机数量,直到达到物理服务器的最大容量。 如果以前分配的实例资源在没有完全清除数据的情况下重新分配给相同或不同的用户,就会出现残留的数据。实例资源包括内存、缓存、进程、会话、阈值和存储资源。黑客可以在实例资源中寻找受害者的个人信息。 如果网络级的安全控制在 IaaS 网络基础设施中无效,就会出现在虚拟化网络中基于网络的控制不足。这会限制得到授权的管理员对基础设施的访问。IaaS 管理员无法在虚拟网络中应用基于 IP 的网络分段等标准控制措施,黑客可以利用这一情况。IaaS 提供商可能不允许基于网络的漏洞扫描,因为他们无法区分善意的网络扫描和攻击活动。区分真实网络与虚拟网络上的通信流的控制也不足(例如,同一服务器上的系统管理程序上两个或更多虚拟机之间的通信)。 如果提供商对黑客的恶意活动没有进行足够的监视,就会出现对特权用户的监视不足。在这种情况下,黑客可能伪装成具有管理访问权的特权用户,从系统管理程序获得对虚拟机的访问权。例如,具有这种访问权的黑客可以创建恶意的实例资源和数据请求队列,而提供商无法发现他们在做什么。另一个示例是把健康虚拟机的实例资源恶意地重新分配给另一个虚拟机。 对漏洞的严重性进行分级 当然,您必须开发自己的分级系统,对不同类型的漏洞的潜在损失进行分级。我按照以下优先级对各种漏洞的潜在损失进行分级: 黑客如何进入、他在寻找什么、他有什么工具。 例如,黑客可以伪装成具有管理访问权的特权用户进入系统并执行恶意操作,而真正的系统管理员不会马上注意到。黑客还可以通过发送 SQL 注入找到文件名,然后寻找这些文件中的残留数据。 黑客进入虚拟机之后,他可以使用黑客工具启动恶意的网络扫描攻击活动,并把这些活动伪装成善意的网络扫描。攻击活动包括列出每个应用程序中的模块。如果黑客发现应用程序没有包含阈值模块,就可以通过使用或创建工具分配实例资源,直到达到最大容量。 步骤 3. 应用安全对策 安全评估的下一步在概念上相当简单,但是与许多事情一样,真正做起来有点儿困难 — 判断降低风险的对策是否经济有效,即实现对策的好处是否超过成本。应该降低黑客利用漏洞的可能性,同时提高 ROI。 有一点很重要:如果发现对策不是经济有效的,那么仍然会残留一些风险,无法降低这些风险。您需要学会承受它们,而不是花更多的钱解决它们。这是风险评估和应对中最不容易让人接受的概念之一:降低某些风险的成本太高,与它提供的好处相比不值得。 但是,如果有过多残留的风险 而且经济有效的对策太少,由于几个原因您应该重复风险评估步骤: 如果这是您在风险评估和应对方面最初的尝试之一,您可能希望重复风险评估步骤,以此提高识别资产、分析和了解风险以及判断对策的广度和深度及应用方法的技能。 还希望随时关注经济有效的新对策和云基础设施技术。 另外,如果购买保险比实现对策便宜的话,应该考虑通过购买保险转移一些残留的风险。 本文中提到的示例可以采用以下对策: 确保建立实例资源、用户和数据请求阈值策略。 在重新分配实例资源之前,彻底清除其中的残留数据。 实现故障转移机制、业务连续性和灾难恢复计划。 监视特权用户;检查这些用户的背景和登录活动,监视物理服务器、网络和其他基础设施组件的状态。 向消费者和提供商说明降低风险的对策的好处。 步骤 4. 执行后期评估 应该每三年进行一次风险评估。如果出现以下情况,可能需要更频繁地重新评估风险: 出现了新的云服务技术,它们可能影响软件、硬件和网络资产。 出现了新漏洞和新威胁。 出现了新的对策,它们可以有效地降低以前残留的风险。 想出了降低风险的新方法。 组织的变化(比如合并)对所有类别的资产产生了重大影响。 法律和法规出现了重大变化。 实际上,如果您负责组织的云服务的风险评估和应对,可能应该每周检查一次这些方面的信息。可以考虑通过新闻 feed 了解新的威胁和漏洞。 结束语 降低云服务的风险并保持高可用性需要前瞻性的风险计划,从而解决相关的问题,包括对于每个云类型要识别什么资产、要分析什么风险、哪些对策是经济有效的以及在降低风险 之后要评估什么。开发人员、用户和业务分析师需要相互协作以降低云服务的风险。团队会发现解决这些问题会让降低云服务风险的工作容易得多。
个人分类: 云与服务|2243 次阅读|1 个评论
[转载]移动云计算及开发应用程序的发展与变革
libing 2011-6-1 17:49
  新一代的信息服务将浏览器和设备视为同样的客户端。目前所面临的挑战是如何建立其这样的服务。   是否能利用本机代码开发移动应用程序或者利用诸如HTML和JavaScript等Web技术来进行部署?开发商们就此问题一直存在着分歧。   史蒂夫·乔布斯最初建议iPhone的开发人员们能够按照需要通过设备内置的浏览器部署任何应用程序。但那是在苹果公司推出了业界领先的iTunes应用程序商店之前。   从那时起,甚至网站的建立都往往选择利用本机应用程序向移动设备发布并提供他们的内容,而不是简简单单的试图将其硬塞进手机浏览器上。尽管在HTML5上有所改进,许多开发商仍然觉得针对智能手机和上网本的网络技术独特需求不足。   如果这是真的,那么,现在已经是时候让我们好好反思一下在线信息服务是如何进行开发和部署的了。在过去,发展商往往是首先兴建网站,然后再为移动应用程序改编相同的内容。但在如今的市场上,移动设备越来越多的成为用户上网的主要手段,之前的做法无疑可以说是相当落后的了。   我们需要的是移动设备的发展变革,类似于我们早期在Web应用程序发现的那样。第一批企业级Web应用程序只是将代码由传统大型机输出到了浏览器,使其看上去漂亮一些。但是,随着基于浏览器的计算变得日渐规范,应用程序逻辑移出主机和HTML输出成为主要目标。移动设备应用程序正在经历同样的转变。下一代的信息服务会将桌面浏览器和移动应用设备视为同样的客户端,同一逻辑应用程序将为这二者提供内容。   同样重要的是,在同一时间,这种转变在另一个重要的领域IT行业也发生着巨变,其正在向云计算方向大步迈进。随着平台即服务(PaaS)产品的日趋成熟,越来越少的信息服务提供商还在他们的私人基础设施上提供主机应用程序。   连接设备到云   对于应用程序开发人员来说,同时管理如此众多的应用程序的迁移绝对可以说是一项相当艰巨的任务。庆幸的是,平台供应商已经提供了相关的工具,使尽可能轻松的过渡到混合网络/移动应用程序。   近期,在旧金山举行的谷歌I/O开发人员大会上,这家搜索引擎巨头推出了其新的测试版本的谷歌插件Eclipse 平台(GPE)。该工具能够允许开发人员创建、测试,并上传应用程序到谷歌的应用程序引擎云平台(Google App Engine),所有的都是利用Java语言Eclipse IDE集成开发环境。   GPE的早期版本可以让开发人员利用集成支持为谷歌网页工具包(GWT)建立应用程序引擎,这是一个框架,用于创建复杂的基于Web的UI。新的2.4测试版GPE新增加了对Android应用程序的支持。实际上,开发人员可以为引擎应用构建应用程序逻辑,然后同时为Web和移动客户端生成I/O代码。   同样,微软也将其Windows Azure定位为一款移动应用程序的后端云平台。与人们所期望的相反的是,其不是仅仅限于为Windows Phone 7的操作系统而服务。新的Windows Azure工具包将适用于苹果IOS设备和Android设备。   很容易看出微软的雄心壮志。虽然IOS是目前最顶级的移动平台之一,远远超过Windows Phone 7,但苹果公司到目前为止,尚未推出一款可以和微软的Windows Azure、谷歌的Google App Engine、以及亚马逊的弹性计算云服务Elastic Compute Cloud相抗衡的云计算平台。该传闻说苹果可能正在研发相关产品,但除非iPhone的制造商们加快动作,否则,微软很有机会作为移动后端应用服务提供商赢得IOS。   未来的挑战   是否能利用本机代码开发移动应用程序或者利用诸如HTML和JavaScript等Web技术来进行部署使用?似乎看来是两者皆可。你可以投身到混合云平台。虽然这是一个好主意,但是,开发商必须意识到目前的移动应用程序云架构是一个重要的陷阱。   首先,目前在云基础设施上托管的任何应用程序都存在着一定的风险。至少存在中断的风险,这可能会削弱云备份应用程序。到目前为止,还没有云计算平台被证明是百分之百可靠的,亚马逊、谷歌和微软的用户都出现过中断。   同样重要的是,越来越多的开发人员抱怨移动平台供应商的“围墙花园”,云计算平台的用户还可能被供应商锁定。大型数据存储服务之间的移动可以说是非常具有挑战性,而且在许多情况下应用程序逻辑在提供商之间迁移的时候往往需要进行调整。 相当多的企业正在积极努力购买部署互操作性云计算服务 ,包括Apache软件基金会和美国电气和电子工程师协会(IEEE),但这些努力是不成熟的,几乎没有诱因促使云供应商们本身开展互助合作。   但最大的挑战可能是简单地寻找可以成功地开发云和移动开发程序的供应商。上述两种方法都相对较新。特别是移动开发人员的需求会持续不断的提升,许多公司都是通过采用外包或昂贵的再培训,以获得用于创建移动应用程序所需的技能。而想要找到建立了方便企业熟练应用的云平台的移动开发商似乎就显得要求要高得多了。   当然,对目前的项目经理们来说,想要招聘到新的人才貌似前景不容乐观,而聪明的开发商应该敞开大门。应用程序的开发也正在发生改变。再次重申,时间将证明一切。 原文链接: http://cloud.chinabyte.com/351/12090351.shtml
个人分类: 云与服务|2320 次阅读|0 个评论
VC6.0将程序打包成一个可执行文件
热度 1 dishengbin 2011-5-4 08:40
想用VC6.0生成一个可执行的.exe文件,但方法自己总是记不住,每次都需要Google。 一般情况下在编译之后的Debug文件中文生成一个.exe文件,但是该文件双击后立马消失。 为了下次的使用方便,把其设置粘贴至此: (1)控制台应用程序 首先打开程序,工程—设置,左侧下拉列表选择Win32 Release,右侧"Microsoft 基础类",不选择,确定。 然后选择组建—批组建,去掉debug前面的钩,保留release前面钩,确定,完成。完成之后会在主目录下生成Release文件夹,里面的exe文件拷出来可以独立运行。 (2)MFC程序 首先打开程序,工程—设置,左侧下拉列表选择Win32 Release,右侧"Microsoft 基础类",选择“使用MFC作为静态链接库”,确定。 然后选择组建—批组建,去掉debug前面的钩,保留release前面钩,确定,完成。 完成之后会在主目录下生成Release文件夹,里面的exe文件拷出来可以独立运行。
2509 次阅读|0 个评论
热度 1 zhudingju 2011-4-29 10:23
天 2011-4-29 天在眼里并不大,但没有谁知道天有多大 天下有很多看不见的蚂蚁,但蚂蚁能看见自己 蚂蚁在迷茫地,却不知迷茫地奔波 蚂蚁在无所谓快乐也无所谓不快乐地,却有时快乐地有时不快乐地奔波 蚂蚁在无所谓有意义也无所谓无意义地,却有时高昂有时失落地奔波 蚂蚁汗流浃背地奔波,囤积了很多在他们看来最重要的利 蚂蚁不厌其烦地舞动触角,争取在他们看来最重要的名 蚂蚁就像计算机代码一样,只要不按停机就会永不停息 蚂蚁就像计算机代码一样,似乎主宰着数据,却始终与数据分离 天下有很多蚂蚁看不见天 能看见天的蚂蚁没有时间停下来看看天 只有几只懒惰的能抬头看天的蚂蚁看见了天 古代有,现代也有 东方有,西方也有 有的蚂蚁看见了天书 有的蚂蚁看见了天路 看见天书的蚂蚁把天书告诉了其他蚂蚁,其他蚂蚁觉得没有用,如同计算机中的协议规范没有应用程序想去遵从 看见天路的蚂蚁把天路告诉了其他蚂蚁,其他蚂蚁开始捉摸如何上天折腾,如同计算机中的应用程序想控制操作系统 也许有一天,蚂蚁能真正看懂天,到那一天,蚂蚁会发现,天一直在任何地方 也许有一天,蚂蚁能真正看懂天,到那一天,蚂蚁会发现,懂它不一定要控制它,爱它不一定要占有它 也许有一天,蚂蚁能真正看懂天,到那一天,蚂蚁会停下奔波的脚步,与云一样悠然自得,与水一样源远流长
2298 次阅读|0 个评论
[转载]如何在MFC程序中使用Open Inventor
zhangbanglei 2011-3-14 17:52
本文将介绍如何在MFC程序中使用Open Inventor(以下简称OIV)开发库。文中将使用VC 2003作为开发环境,使用SIM公司( www.coin3d.org )公司提供的Coin3D OIV作为Open Inventor开发库。关于OIV在Visual C++中的设置,请阅读网站 “Open Inventor-Coin3D开发环境” 中的内容。 1.创建工程 首先启动VC 2003,使用MFC Wizards创建一个MDI 应用程序(本文只讨论MDI类型的应用程序,但SDI或Dialog程序只需要稍微做一些修改,也是同样可以使用OIV的)。我们假定MDI应用程序的名称叫做“MFCViewer”。 2.增加Coin和SoWin代码 1. 打开MFCViewer.cpp文件,在文件开始部分增加下列头文件: #include Inventor/Win/SoWin.h 编辑CMFCViewerApp::InitInstance(),在函数中增加上: SoWin::init(""); 这行代码将初始化SoWin和Coin库,必须在调用任何Coin或SoWin函数之前调用这行代码。 2. 打开MFCViewerView.h文件,增加下列头文件列表(增加到预编译头文件-#ifdef/#pragma once/#endif 序列之后) #include Inventor/Win/SoWin.h #include Inventor/Win/viewers/SoWinExaminerViewer.h 增加一个公共数据成员变量 SoWinExaminerViewer * viewer; SoWinExaminerViewer主要用于渲染我们的场景,以可以和显示的内容做交互式操作(像旋转物体,选择部分场景等) 3. 打开MFCViewerView.cpp文件,修改构造函数: CMFCViewerView::CMFCViewerView() { viewer = NULL; } 修改析构函数: CMFCViewerView::CMFCViewerView() { if (viewer != NULL) delete viewer; } 3.创建场景 我们希望当用户创建了一个新文档后(点击菜单File | New),新创建的窗口中会有一个OIV场景。 1. 打开MFCViewerDoc.h文件,在CMFCViewerDoc类定义之上增加下列代码: class SoSeparator; 这行代码主要是告诉编译器,我们要使用一个叫做SoSeparator的类。 2. 向CMFCViewerDoc类增加一个公共数据成员变量: SoSeparator *root; 这是我们场景的根节点。 3. 打开MFCViewerDoc.cpp文件,增加下列头文件: #include Inventor/nodes/SoSeparator.h #include Inventor/nodes/SoMaterial.h #include Inventor/nodes/SoCone.h #include Inventor/nodes/SoTranslation.h #include Inventor/nodes/SoText2.h 这些都是我们准备在场景中使用的节点,因此需要首先包含它们的头文件。 4. 修改函数OnNewDocument() BOOL CMFCViewerDoc::OnNewDocument() { if (!CDocument::OnNewDocument()) return FALSE; root = new SoSeparator; root-ref(); SoMaterial *myMaterial; root-addChild(myMaterial = new SoMaterial); myMaterial-diffuseColor.setValue(1.0, 0.0, 0.0); root-addChild(new SoCone); SoSeparator * instructsep = new SoSeparator; root-addChild(instructsep); instructsep-addChild(myMaterial = new SoMaterial); myMaterial-diffuseColor.setValue(0.5, 1.0, 1.0); SoTranslation * instructtrans = new SoTranslation; instructtrans-translation = SbVec3f(-2.0f, 1.3f, 2.0f); instructsep-addChild(instructtrans); SoText2 * instructions = new SoText2; const char * str[] = { "Instructions for the MFCViewer tutorial", "", "Left mouse button = rotate", "Middle mouse button = move", "CTRL + middle mouse button = zoom", "Right mouse button = options" }; instructions-string.setValues(0, sizeof(str) / sizeof(char *), str); instructions-justification = SoText2::LEFT; instructsep-addChild(instructions); return TRUE; } 我们通过向根节点增加子节点来建立场景。请记住,OIV会自己删除所有的场景对象,因此这里不需要程序员记住这些对象的指针,在以后的时候删除它们。(事实上如果这样做将会发生内存错误)。OIV是通过一种叫做引用计数的技术来实现这个功能的。 5. 修改构造和析构函数,增加上下列代码: CMFCViewerDoc::CMFCViewerDoc() { root = NULL; } CMFCViewerDoc::~CMFCViewerDoc() { if (root) root-unref(); } 调用root-unref(),告诉OIV,我们已经不再使用根节点对象了。所以OIV将会自动删除根节点。 6. 打开MFCViewerView.cpp文件,增加上下列代码: #include Inventor/nodes/SoSeparator.h 修改函数CMFCViewerView::OnDraw(CDC* pDC): void CMFCViewerView::OnDraw(CDC* pDC) { CMFCViewerDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (viewer == NULL) { viewer = new SoWinExaminerViewer( m_hWnd ); viewer-setDecoration(FALSE); SoSeparator *root = GetDocument()-root; viewer-setSceneGraph(root); } } 上面的代码将WinExaminerViewer嵌入到CMFCViewerView窗口中,其中WinExaminerViewer四周的 Toolbar(即Decoration)是不显示的。 编译并执行此应用程序 本文来自CSDN博客,转载请标明出处: http://blog.csdn.net/robinhao/archive/2007/09/03/1770580.aspx 本文来自CSDN博客,转载请标明出处: http://blog.csdn.net/robinhao/archive/2007/09/03/1770580.aspx
2826 次阅读|0 个评论
老外收集的windows软件替代品[转载]
osos 2009-8-27 19:47
老外收集的windows软件替代品 The Linux Equivalent Project Welcome to the Linux Equivalent Project. The goal is to provide an informational and available website for all linux users. The website is currently in beta form. I will be periodically updating the database with Windows software and the Linux equivalents and alternatives. http://www.linuxeq.com/ Comments and suggestions: submit@linuxeq.com . Read my blog about the site. New! There is now a form for submissions here. Windows Software Linux Equivalent 3D Studio Max Blender ( http://www.blender.org/ ) Adobe Audition Audacity ( http://audacity.sourceforge.net/ ) Adobe Illustrator Inkscape ( http://www.inkscape.org/ ) Karbon14 ( http://www.koffice.org/karbon/ ) Xara Xtreme for Linux ( http://www.xaraxtreme.org/ ) Adobe PageMaker Scribus ( http://www.scribus.net/ ) Adobe PhotoAlbum F-Spot ( http://f-spot.org/Main_Page ) digiKam ( http://www.digikam.org/ ) Adobe Photoshop Krita ( http://www.koffice.org/krita/ ) GIMP ( http://www.gimp.org/ ) Adobe Premier LiVES ( http://lives.sourceforge.net/ ) Kino ( http://www.kinodv.org/ ) Cinelerra ( http://cvs. cinelerra .org/ ) kdenlive ( http://kdenlive.sourceforge.net/ ) AOL Instant Messenger (AIM) Kopete ( http://kopete.kde.org/ ) Gaim ( http://gaim.sourceforge.net ) APC PowerChute Apcupsd ( http://www.apcupsd.com/ ) PowerD ( http://power.sourceforge.net/ ) CDex Sound Juicer ( http://www.burtonini.com/blog/computers/sound-juicer ) Rubyripper ( http://wiki.hydrogenaudio.org/index....tle=Rubyripper ) Grip ( http://nostatic.org/grip/ ) Dreamweaver Quanta Plus ( http://quanta.kdewebdev.org/ ) Nvu ( http://www.nvu.com/index.php ) Screem ( http://www.screem.org/ ) Bluefish ( http://bluefish.openoffice.nl/index.html ) DVDShrink k9copy ( http://k9copy.sourceforge.net/ ) OGMRip ( http://ogmrip.sourceforge.net/ ) Thoggen ( http://thoggen.net/ ) xdvdshrink ( http://dvdshrink.sourceforge.net/ ) qVamps ( http://vamps.sourceforge.net/ ) dvd::rip ( http://www.exit1.org/dvdrip/ ) AcidRip ( http://untrepid.com/acidrip/ ) FruityLoops LMMS ( http://lmms.sourceforge.net/ ) Hydrogen ( http://www.hydrogen-music.org/ ) iTunes Banshee ( http://banshee-project.org/Main_Page ) SongBird ( http://www.songbirdnest.com ) Exaile ( http://www.exaile.org/ ) Amarok ( http://amarok.kde.org/ ) Legacy Family Tree GRAMPS ( http://gramps-project.org/ ) Microsoft Frontpage Quanta Plus ( http://quanta.kdewebdev.org/ ) Nvu ( http://www.nvu.com/index.php ) Bluefish ( http://bluefish.openoffice.nl/index.html ) Microsoft HyperTerminal minicom ( http://alioth.debian.org/projects/minicom/ ) GtkTerm ( http://freshmeat.net/projects/gtkterm/ ) Microsoft Internet Explorer Opera ( http://www.opera.com/download/ ) Firefox ( http://www.mozilla.com/firefox/ ) Konqueror ( http://www.konqueror.org/ ) Microsoft Office KOffice ( http://www.koffice.org/ ) OpenOffice ( http://www.openoffice.org/ ) Microsoft Outlook (Express) Thunderbird ( http://www.mozilla.com/thunderbird/ ) Evolution ( http://www.gnome.org/projects/evolution/ ) Microsoft Project Planner ( http://live.gnome.org/Planner ) Microsoft Visio Dia ( http://www.gnome.org/projects/dia/ ) Kivio ( http://www.koffice.org/kivio/ ) Microsoft Windows Media Center Freevo ( http://freevo.sourceforge.net/ ) Elisa Media Center ( http://www.fluendo.com/elisa/ ) MythTV ( http://www.mythtv.org ) mIRC BitchX ( http://www.bitchx.org/ ) Xchat ( http://www.xchat.org/ ) ChatZilla! ( http://chatzilla.hacksrus.com/ ) irssi ( http://www.irssi.org/ ) Gaim ( http://gaim.sourceforge.net ) Mp3tag EasyTAG ( http://easytag.sourceforge.net/ ) Audio Tag Tool ( http://pwp.netcabo.pt/paol/tagtool/ ) MSN messenger aMSN ( http://amsn-project.net/ ) Gaim ( http://gaim.sourceforge.net ) Nero Burning Rom X-CD-Roast ( http://www.xcdroast.org/ ) Brasero ( http://perso.orange.fr/bonfire/index.htm ) GnomeBaker ( http://gnomebaker.sourceforge.net/ ) K3b ( http://www.k3b.org/ ) NetMeeting Ekiga ( http://www.gnomemeeting.org/ ) NetStumbler SWScanner ( http://www.swscanner.org/ ) Notepad gedit ( http://www.gnome.org/projects/gedit/ ) Scribes ( http://scribes.sourceforge.net/ ) tpad ( http://tclpad.sourceforge.net/ ) Quicken KMyMoney ( http://kmymoney2.sourceforge.net/ ) GNUcash ( http://www.gnucash.org/ ) Gnofin ( http://gnofin.sourceforge.net/ ) Grisbi ( http://www.grisbi.org/ ) SoulSeek Nicotine ( http://nicotine.thegraveyard.org/ ) Nicotine-Plus ( http://nicotine-plus.sourceforge.net/ ) Winamp XMMS ( http://www.xmms.org/ ) Windows Movie Maker LiVES ( http://lives.sourceforge.net/ ) Avidemux ( http://fixounet.free.fr/avidemux/ ) Cinelerra ( http://cvs. cinelerra .org/ ) kdenlive ( http://kdenlive.sourceforge.net/ ) WS_FTP gFTP ( http://gftp.seul.org/ ) FireFTP ( http://fireftp.mozdev.org/ ) ZoneAlarm Firestarter ( http://www.fs-security.com/ )
个人分类: 生活点滴|9878 次阅读|0 个评论
Linux下推荐应用程序列表【2008-07-24】(转自水木)
osos 2009-7-27 10:40
发信人: zhlyang (庄稼汉玩Linux), 信区: LinuxApp 标 题: Linux下推荐应用程序列表【2008-07-24】 发信站: 水木社区 (Mon May 12 12:04:21 2008), 站内 发信人: cyb (想去欧洲), 信区: LinuxApp 标 题: Linux下推荐应用程序列表【2008-07-31】 发信站: BBS 水木清华站 (Thu Aug 12 11:28:41 2004), 站内 * 特殊软件: windows下访问ext2fs, ext3fs: http://www.ext2fs-anywhere.com/ http://fs-driver.org/ 修复分区表:Disk Genius(原名DiskMan), diskfix 分区大小调整:parted,gparted(分区大小无损调整) * 批量更改文件名:rename (可能位于rename这个软件包) * 媒体播放: 1)mplayer/totem-xine + w32codecs,vlc 2)rm影片:realplayer11 for linux, mplayer 3)mp3: amarok, Audacious, beep media player, Banshee,MPD, songbird,moc 4)ape: xmms+monkey's audio plugin( http://supermmx.org/linux/mac/ ) http://www.sourceforge.net/projects/mac-port/ 5)cue支持:amarok,audacious 6)其他格式(wma, wmv, mkv, quicktime): mplayer * 各种格式的文档和文件 1)打开微软的office文档: openoffice wvware( http://wvware.sourceforge.net/ ) 2)查看pdf文件: evince, xpdf, acroread for linux, ggv, epdfview, okular 3)查看ps文件: gsview, ggv, kghostview 4)chm文件: archmage,chmsee, Xchm,kchmviewer, chmreader, gnochm 5)mht文件: ripmime,firefox+MAF插件,opera 6)图表绘制: dia, OpenOffice.org draw 7).bin虚拟光盘: 用bin2iso或bchunk转成iso后mount 8)压缩文件 .rar: rar for linux或unrar .zip: unzip .bz2: bunzip2 .tar/.tgz: tar .jar/.xpi: ark .deb:ar * 中文输入法: scim-pinyin,scim-python, fcitx, ibus-pinyin, fitx, sun-pinyin * BBS软件:qterm, fqterm, pcmanx-gtk2 {rxvt,xterm,gnome-terminal,...}+BBSbot * 即时通讯: 1) QQ: lumaqq, pidgin, eva, qq4lin 2) MSN: eMeSeNe, kopete, kmess, amsn 3) icq,yahoo: pidgin, kopete 4) skype 5) IRC: xchat, chatzilla, irssi, erc(emacs插件), konversation, weechat 6) 飞信:linux-fetion(libfetion) * web浏览器:mozilla-firefox, opera, konquerer, epiphany, midori * ftp客户端(图形界面) :gftp, Iglooftp, filezilla,kuftp,kftpgrabber * ftp客户端(终端) : lftp, ncftp * ftp服务器: pureftpd, proftpd(gproftpd), vsftpd * http下载: wget, aria, curl, prozilla, axel, DownloadThemAll(Firefox插件), Multiget * bt下载: bittorrent(终端), azureus(图形界面),mldonley(多协议支持), ctorrent * 电驴下载:amule、mldonkey * email软件(图形界面):thunderbird, sylpheed, evolution, opera M2, kmail * email终端:claws-mail, mutt, alpine, gnus * RSS:liferea * SMTP client: msmtp, esmtp * 编辑器 1) 文本: vim, emacs, jedit, nedit, gedit, kate, lyx, geany 2) 16进制: hexedit, ghex, mc * 图片浏览: gImageView, gqview, zgv(console), fbida(console), eog, gpicview, gthumb gwenview, digikam * 图片处理: gimp, ImageMagick * 屏幕抓图: 抓成图片: ksnapshot, ImageMagick 的 import, gimp, xwd, scrot http://addons.mozine.org/firefox/209/ (抓网页) 抓成视频: vnc2swf, vncrec, xvidcap * 录音、音频处理: audacity, mhwaveedit, glame * 视频处理: Cinelerra * 音频格式转换: SoX * 刻录: k3b, brasero, cdrecord, gnomebaker, Nero4Linux * 英汉字典: stardict(屏幕取词,词库大,英汉,汉英, 英英) ibmdict(包含科技词典,词库大,英汉,汉英) dictd:英汉 汉英 可以使用stardict的全部词库. cdict:英汉 汉英 使用安装方便,彩色显示. * 科学计算: matlab, octave, scilab * 科学作图: gnuplot, metapost,Asymptote * 虚拟机 1) win下虚拟linux: cygwin, 老版virtual-pc, colinux 2) Linux下虚拟机: vmware, bochs, qemu, virtualbox, kvm, xen 3) linux下运行windows程序: wine, cedega, crossover office 4) DOS模拟: dosbox * MindMap: semantik, freemind * 编程辅助: UML建模: Umbrello * 文件管理器: krusader, nautilus, pcmanfm, thunar, dolphin 其他软件: igal:从图片生成html的网络相册 kmymoney:理财软件 R rkward: 统计分析的,R的gui封装,模仿SPSS gretel: 回归分析/计量经济 g3data: 从折线图获取数据 last modified by yegle,2008-11-27 -- ※ 修改:xinliGG 于 Jul 12 20:49:50 2009 修改本文
个人分类: 生活点滴|5267 次阅读|0 个评论

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-5-19 07:19

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部