精华内容
下载资源
问答
  • 用于工具栏和导航栏的标准按钮

    千次阅读 2011-12-20 14:34:27
    表10-1所示的这些按钮具有两种样式,分别用于下列不同情况: 边框样式—例如,电话联系人应用程序导航栏中的“添加”按钮。这种样式对于导航栏和工具栏都适用。 无格式样式—例如,邮件应用程序工具栏中...



    以下内容摘自:iPhone人机界面指南


    iPhone OS为您准备了在工具栏和导航栏中常见的标准按钮。表10-1所示的这些按钮具有两种样式,分别用于下列不同情况:

    • 边框样式—例如,电话联系人应用程序导航栏中的“添加”按钮。这种样式对于导航栏和工具栏都适用。

    • 无格式样式—例如,邮件应用程序工具栏中的“撰写”按钮。这种样式只适用于工具栏。事实上,即使您指定一个导航栏中的按钮为无格式样式,它也会被转换为边框样式。

    如同所有系统提供的按钮一样,请不要将表10-1中的按钮用于其设计用途之外的操作。尤其要避免只根据外观选择按钮,而不考虑这个按钮的文档描述。请参考“使用系统提供的按钮和图标”一节,这部分内容讨论了正确使用图标的重要意义。(有关这些按钮的符号名称和可用性的信息请参考UIBarButtonSystemItem的文档。)

    表 10-1 可用于工具栏和导航栏的标准按钮(以无格式样式显示)

    按钮

    含义

    名称

    image: ../art/UIButtonBarAction.jpg

    打开动作表单,允许用户执行应用程序特定的动作

    动作

    image: ../art/UIButtonBarCamera.jpg

    打开动作表单,显示相机模式下的照片选择器

    相机

    image: ../art/UIButtonBarCompose.jpg

    打开新消息的编辑模式视图

    撰写

    image: ../art/UIButtonBarBookmarks.jpg

    显示应用程序特定的书签

    书签

    image: ../art/UIButtonBarSearch.jpg

    显示搜索框

    搜索

    image: ../art/UIButtonBarNew.jpg

    创建一个新项

    添加

    image: ../art/UIButtonBarTrash.jpg

    删除当前项

    回收站

    image: ../art/UIButtonBarOrganize.jpg

    在应用程序中将某一项移动或路由至指定目的地,如文件夹

    组织

    image: ../art/UIButtonBarReply.jpg

    将某一项发送或路由至另一位置

    回复

    image: ../art/UIButtonBarStop.jpg

    停止当前进程或任务

    停止

    image: ../art/UIButtonBarRefresh.jpg

    刷新内容(只在必要时使用;其他情况下自动刷新)

    刷新

    image: ../art/UIButtonBarPlay.jpg

    开始播放媒体或幻灯片

    播放

    image: ../art/UIButtonBarFastForward.jpg

    快进当前播放的媒体或幻灯片

    快进

    image: ../art/UIButtonBarPause.jpg

    暂停当前播放的媒体或幻灯片(请注意,这意味着上下文保存)

    暂停

    image: ../art/UIButtonBarRewind.jpg

    快退当前播放的媒体或幻灯片

    快退

    除了表10-1所示的按钮之外,在您的应用程序中,您也可以使用表10-2中由系统提供的“编辑”,“取消”,“保存”和“完成”按钮,以支持编辑或其他类型的内容操作。(有关这些按钮的符号名称和可用性的信息请参考介绍UIBarButtonSystemItem的文档。)这些按钮对于导航栏和工具栏都适用,但只能以有边框样式提供给用户。如果您使用上述按钮,即使您将其指定为无格式样式,它也会被转换为有边框样式。

    表 10-2 用于导航栏的有边框样式的动作按钮

    按钮

    含义

    名称

    image: ../art/UIBarSystemItemEdit.jpg

    进入编辑或内容操作模式

    编辑

    image: ../art/UIBarSystemItemCancel.jpg

    退出编辑或内容操作模式而不保存更改

    取消

    image: ../art/UIBarSystemItemSave.jpg

    保存更改,并在合适的情况下退出编辑或内容操作模式

    保存

    image: ../art/UIBarSystemItemDone.jpg

    退出当前模式并保存修改(如果有的话)

    完成



    展开全文
  • Git 是一个分布式版本控制工具

    千次阅读 2016-07-31 23:45:30
    Git 是一个分布式版本控制... Git 是用于 Linux 内核开发的版本控制工具。与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持,使源代码的发布和交流极其方便。 Git 的

    Git 是一个分布式版本控制工具


    前言:

    Git常用命令: 速查手册

    Git — The stupid content tracker(傻瓜内容跟踪器),Linus 是这样给我们介绍 Git 的。

    Git 是用于 Linux 内核开发的版本控制工具。与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持,使源代码的发布和交流极其方便。 Git 的速度很快,这对于诸如 Linux kernel 这样的大项目来说自然很重要。 Git 最为出色的是它的合并跟踪(merge tracing)能力。

    实际上内核开发团队决定开始开发和使用 Git 来作为内核开发的版本控制系统的时候,世界开源社群的反对声音不少,最大的理由是 Git 太艰涩难懂,从 Git 的内部工作机制来说,的确是这样。但是随着开发的深入,Git 的正常使用都由一些友好的脚本命令来执行,使 Git 变得非常好用,即使是用来管理我们自己的开发项目,Git 都是一个友好,有力的工具。现在,越来越多的著名项目采用 Git 来管理项目开发,例如:wine, U-boot 等。

    作为开源自由原教旨主义项目,Git 没有对版本库的浏览和修改做任何的权限限制,通过其他工具也可以达到有限的权限控制,比如:gitosis、CodeBeamer MR。原本 Git的使用范围只适用于 Linux / Unix 平台,但逐步并成熟了在 Windows 平台下的使用,主要归功于Cygwin与msysgit环境与TortoiseGit这样易用的 GUI 工具。其实 Git 的源代码中已经加入了对 Cygwin 与 MinGW 编译环境的支持并被逐步完善,对于 Windows 使用者是个福音。


    一、为什么选择Git

    对于流行的软件版本开源管理软件,元老级的CVS、后来新秀的SVN,今天我在CHIP.CN Dowload中看到了一篇文章:《2008年度最佳开源软件大奖》(http://download.chip.eu/cn/standardbeitrag_cn_3640079.html)。其中提到了GIT版本管理系统。

    我很奇怪,为什么 SVN 没有入围并获奖呢?当初,我在从 CVS 转移到 SVN 时就曾经就 SVN 的一系列优势进行过一些粗浅的学习。SVN 在版本库的管理上较 CVS 有明显的优势。那么与 SVN 相比,Git的优势又在哪里呢?

    经过强大的Google,我从网上找到了这些内容:

    From 《Git入门教程》:(http://hi.baidu.com/eehuang/blog/item/37af8d54242d6351564e00b5.html

    1. 傻瓜都会的初始化,git init, git commit -a, 就完了。对于随便写两行代码就要放到代码管理工具里的人来说,再合适不过。也可以拿git做备份系统,或者同步两台机器的文档,都很方便。

    2. 绝大部分操作在本地完成,不用和集中的代码管理服务器交互,终于可以随时随地大胆地check in代码了。 只有最终完成的版本才需要向一个中心的集中的代码管理服务器提交。

    3. 每次提交都会对所有代码创建一个唯一的commit id。不像CVS那样都是对单个文件分别进行版本的更改。所以你可以一次性将某次提交前的所有代码check出来,而不用考虑到底提交过那些文件。(其实SVN也可以做到这点)

    4. branch管理容易多了,无论是建立新的branch,还是在branch之间切换都一条命令完成,不需要建立多余的目录。

    5. branch之间merge时,不仅代码会merge在一起,check in历史也会保留,这点非常重要。

    1、更方便的 Merge

    分布式管理必然导致大量的 Branch 和 Merge 操作。因此分布式版本控制系统都特别注意这方面。在传统的 CVS 里面制作 Branch 和 Merge 简直就是噩梦,Subversion 作为一个用于替代 CVS 的系统,专门改进了 Branch 操作。然而似乎人们没有注意到,Branch 是轻松了,可是 Merge 呢?如果不能很方便地 Merge 回来,做 Branch 仍然是噩梦。事实上,我就经历过在开发团队里面由于队友操作不对而在 Merge 的时候把我的许多代码都覆盖掉了。当时正是使用的 subversion 。虽然源代码仍然在历史里面,但是要去一个一个地找出被覆盖掉的文件并恢复过来确实是一件很难忘的事情。

    2、更方便的管理

    传统的版本控制系统使用中央仓库,一些仓库相关的管理就只能在仓库上进行。赋予开发团队每一个人中央仓库的管理权限是非常不好的。但是有时候确实会比较不方便的地方。

    3、更健壮的系统

    分布式系统一般情况下总是比单服务端的系统要健壮,因为当服务端一旦挂掉了整个系统就不能运行了。然而分布式系统通常不会因为一两个节点而受到影响。

    4、对网络的依赖性更低

    虽然现在网络非常普及,但是并不是随时随地都有高速网络,甚至有时候根本没有网络可以访问。低速的网络会让人心情烦躁,有时候就呆呆地盯着屏幕上的 commit 进度,什么事情也干不了。而没有网络连接更是致命的:你无法 commit !这表示你进行任何改动以前都必须小心翼翼,否则你可能再也找不会你曾经写的一些代码了。

    5、更少的“仓库污染”

    有时候你要做一个模块,它不是太大,所以没有必要为它新建一个 branch ,但是它又不是那么小,不可能一次提交就做好。于是便会提交一些不完整的代码到仓库,有时候会导致整个程序无法运行,严重影响团队里其他人的开发。大多数人在这种情况下的解决办法都是写完之后再提交。但是作为习惯了版本控制的人来说,进行不计后果的大幅修改是经常的事情,到后来突然发现自己先前的代码没有提交,就后悔莫及了。如果是分布式系统的话就不会存在这样的问题,因为本地仓库的修改不会影响到别人的仓库。当你完成并测试以后,就可以在邮件列表里面说:我已经把这个模块做好了。然后感兴趣的人就可以从你这里 pull 你的成果了。

    虽然网上各种对Git的誉美之词决不止于此,但是在Git的主站上,还是尽可能客观的对Git和Subversion进行了一番比较。(GitSvnComparsion:http://git.or.cz/gitwiki/GitSvnComparsion)。另外,Subversion目前通过SVK也已经提供了一定程度上的源代码库分布式的管理能力。能够实现源代码的离线提交等功能。

    二、Git与CVS 的区别

    分支更快、更容易。
    支持离线工作;本地提交可以稍后提交到服务器上。
    Git 提交都是原子的,且是整个项目范围的,而不像 CVS 中一样是对每个文件的。
    Git 中的每个工作树都包含一个具有完整项目历史的仓库。
    没有哪一个 Git 仓库会天生比其他仓库更重要。
    

    Git 不仅仅是个版本控制系统,它也是个内容管理系统(CMS)、工作管理系统等。如果你是一个具有使用SVN背景的人,你需要做一定的思想转换,来适应GIT提供的一些概念和特征。所以,这篇文章的主要目的就是通过介绍GIT能做什么、它和SVN在深层次上究竟有什么不同来帮助你认识它。那好,这就开始吧…

    1. GIT是分布式的,SVN不是

      这是GIT和其它非分布式的版本控制系统,例如SVN,CVS等,最核心的区别。如果你能理解这个概念,那么你就已经上手一半了。需要做一点声明,GIT并不是目前第一个或唯一的分布式版本控制系统。还有一些系统,例如Bitkeeper, Mercurial等,也是运行在分布式模式上的。但GIT在这方面做的更好,而且有更多强大的功能特征。

      GIT 跟SVN一样有自己的集中式版本库或服务器。但GIT更倾向于被使用于分布式模式,也就是每个开发人员从中心版本库/服务器上chect out代码后会在自己的机器上克隆一个自己的版本库。可以这样说,如果你被困在一个不能连接网络的地方时,就像在飞机上,地下室,电梯里等,你仍然能够提交文件,查看历史版本记录,创建项目分支,等。对一些人来说,这好像没多大用处,但当你突然遇到没有网络的环境时,这个将解决你的大麻烦。

      同样,这种分布式的操作模式对于开源软件社区的开发来说也是个巨大的恩赐,你不必再像以前那样做出补丁包,通过email方式发送出去,你只需要创建一个分支,向项目团队发送一个推请求。这能让你的代码保持最新,而且不会在传输过程中丢失。GitHub.com就是一个这样的优秀案例。

      有些谣言传出来说subversion将来的版本也会基于分布式模式。但至少目前还看不出来。

    2. GIT把内容按元数据方式存储,而SVN是按文件

      所有的资源控制系统都是把文件的元信息隐藏在一个类似.svn,.cvs等的文件夹里。如果你把.git目录的体积大小跟.svn比较,你会发现它们差距很大。因为,.git目录是处于你的机器上的一个克隆版的版本库,它拥有中心版本库上所有的东西,例如标签,分支,版本记录等。

    3. GIT分支和SVN的分支不同

      分支在SVN中一点不特别,就是版本库中的另外的一个目录。如果你想知道是否合并了一个分支,你需要手工运行像这样的命令svn propget svn:mergeinfo,来确认代码是否被合并。感谢Ben同学指出这个特征。所以,经常会发生有些分支被遗漏的情况。

      然而,处理GIT的分支却是相当的简单和有趣。你可以从同一个工作目录下快速的在几个分支间切换。你很容易发现未被合并的分支,你能简单而快捷的合并这些文件。

    4. GIT没有一个全局的版本号,而SVN有

      目前为止这是跟SVN相比GIT缺少的最大的一个特征。你也知道,SVN的版本号实际是任何一个相应时间的源代码快照。我认为它是从CVS进化到SVN的最大的一个突破。因为GIT和SVN从概念上就不同,我不知道GIT里是什么特征与之对应。如果你有任何的线索,请在评论里奉献出来与大家共享。

      更新:有些读者指出,我们可以使用GIT的SHA-1来唯一的标识一个代码快照。这个并不能完全的代替SVN里容易阅读的数字版本号。但,用途应该是相同的。

    5. GIT的内容完整性要优于SVN

      GIT的内容存储使用的是SHA-1哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。这里有一个很好的关于GIT内容完整性的讨论 –http://stackoverflow.com/questions/964331/git-file-integrity

    GIT和SVN之间只有这五处不同吗?当然不是。我想这5个只是“最基本的”和“最吸引人”的,我只想到这5点。如果你发现有比这5点更有趣的,请共享出来,欢迎。

    三、常用版本控制工具比较-GIT、CVS、SVN

    首先介绍几个版本控制软件相互比较的重要依据,更详细的比较请参考文中链接:

    • 版本库模型(Repository model): 描述了多个源码版本库副本间的关系,有客户端/服务器和分布式两种模式。在客户端/服务器模式下,每一用户通过客户端访问位于服务器的主版本库,每一客户机只需保存它所关注的文件副本,对当前工作副本(working copy)的更改只有在提交到服务器之后,其它用户才能看到对应文件的修改。而在分布式模式下,这些源码版本库副本间是对等的实体,用户的机器出了保存他们的工作副本外,还拥有本地版本库的历史信息。

    • 并发模式(Concurrency model): 描述了当同时对同一工作副本/文件进行更改或编辑时,如何管理这种冲突以避免产生无意义的数据,有排它锁和合并模式。在排它锁模式下,只有发出请求并获得当前文件排它锁的用户才能对对该文件进行更改。而在合并模式下,用户可以随意编辑或更改文件,但可能随时会被通知存在冲突(两个或多个用户同时编辑同一文件),于是版本控制工具或用户需要合并更改以解决这种冲突。因此,几乎所有的分布式版本控制软件采用合并方式解决并发冲突。

    • 历史模式(History model):描述了如何在版本库中存贮文件的更改信息,有快照和改变集两种模式。在快照模式下,版本库会分别存储更改发生前后的工作副本;而在改变集模式下,版本库除了保存更改发生前的工作副本外,只保存更改发生后的改变信息。

    • 变更范围(Scope of change):描述了版本编号是针对单个文件还是整个目录树。

    • 网络协议(Network protocols):描述了多个版本库间进行同步时采用的网络协议。

    • 原子提交性(Atomic commit):描述了在提交更改时,能否保证所有更改要么全部提交或合并,要么不会发生任何改变。

    • 部分克隆(Partial checkout/clone):是否支持只拷贝版本库中特定的子目录。

      差距比较

    主要参考链接:

    http://en.wikipedia.org/wiki/Comparison_of_revision_control_software#cite_note-47

    http://www.softeng.rl.ac.uk/media/uploads/publications/2010/03/cvs-svn.pdf

    http://www.smashingmagazine.com/2008/09/18/the-top-7-open-source-version-control-systems/

    http://jon.limedaley.com/plog/archives/2004/10/15/version-control-comparison

    版本控制软件中Trunk和Branch的区别:

    Trunk— 软件开发过程中的主线,保存了从版本库建立到当前的信息。 Branch—软件开发过程中的分支,保存了从版本库的某一特定点(不一定是版本库建立时)到当前的信息。分支主要用于在不影响Trunk其它用户情况下进行一些关于新功能的探索性或实验性的开发,待新功能完善后它也可以合并到Trunk中。

    展开全文
  • 在PyQt5中的菜单栏和工具

    千次阅读 2017-12-24 02:59:32
    在这一部分,我们学习创建状态栏,菜单栏和工具栏。一个菜单是位于菜单栏的一组命令。一个工具栏有一些按钮,这些按钮在应用程序中拥有一些...Statusbar(状态栏)一个状态栏是用于显示状态信息的一个组件。 #!/usr/bin/

    在这一部分,我们学习创建状态栏,菜单栏和工具栏。一个菜单是位于菜单栏的一组命令。一个工具栏有一些按钮,这些按钮在应用程序中拥有一些常用命令。状态栏显示状态信息,通常位于应用窗口下方。

    QMainWindow

    QMainWindow类提供了一个主应用窗口。这允许我们创建一个带有状态栏,工具栏和菜单栏的经典程序框架。

    Statusbar(状态栏)

    一个状态栏是用于显示状态信息的一个组件。

    
    #!/usr/bin/python3
    # -*- coding:utf-8 -*- 
    
        import sys
        from PyQt5.QtWidgets import QMainWindow, QApplication
    
        class Example(QMainWindow):
    
            def __init__(self):
                super().__init__()
    
                self.initUI()
    
            def initUI(self):
                self.statusBar().showMessage("Ready")
    
                self.setGeometry(300,300,250,150)
                self.setWindowTitle("StatusBar")
                self.show()
    
        if __name__ == '__main__':
            app = QApplication(sys.argv)
    
            ex = Example()
    
            sys.exit(app.exec_())
    

    状态栏在QMainWindow组件的帮助下被创建。

    
        self.statusBar().showMessage("Ready")
    

    为了获取状态栏,我们调用类QtGui.QMainWindowstatusBar()方法。该方法的第一个调用创建一个状态栏。子序列调用返回状态栏对象。showMessage()展示在状态栏上的信息。

    下面是这个小例子程序的运行结果:
    enter description here

    简单的菜单

    菜单栏是GUI应用程序的通用组件。他是一组位于多个菜单的命令。(Mac OS以不同的方式对待菜单栏。为了获得相似的输出,我们可以添加下列一行:menubar.setNativeMenubar(False)。)

    
    #!/usr/bin/python3
    # -*- coding:utf-8 -*-
    
    import sys
    from PyQt5.QtWidgets import QMainWindow,QAction, QApplication, qApp
    from PyQt5.QtGui import QIcon
    
    class Example(QMainWindow):
        def __init__(self):
            super().__init__()
    
            self.initUI()
    
        def initUI(self):
            exitAct = QAction(QIcon('exit.png'),'&Exit',self)
            exitAct.setShortcut('Ctrl+Q')
            exitAct.setStatusTip("Exit application")
            exitAct.triggered.connect(qApp.quit)
    
            self.statusBar()
    
            menubar = self.menuBar()
    
            fileMenu = menubar.addMenu("&File")
            fileMenu.addAction(exitAct)
    
            self.setGeometry(300,300,300,200)
            self.setWindowTitle("Simple menu")
            self.show()
    
    if __name__ == '__main__':
    
        app = QApplication(sys.argv)
    
        ex = Example()
    
        sys.exit(app.exec_())
    

    在上面的例子程序中,我们创建了一个带有一个菜单的菜单栏。这个菜单包含一个动作,如果选中的话,将会终止该应用程序。当然,也创建了一个状态栏。这个动作也可以使用Ctrl+Q快捷键。

    
    exitAct = QAction(QIcon("exit.png"),"&Exit",self)
    exitAct.setShortcut("Ctrl+Q")
    exitAct.setStatusTip("Exit application")
    

    QAction是一个运行在菜单栏,工具栏和定制键盘快捷键的抽象类。在上面三行中,我们使用特定的图标和一个’Exit’标签创建了一个行为。进一步说,一个快捷键为了这个行为被定义。第三行创建了一个状态提示,当鼠标经过该菜单选项的时候,被显示在状态栏上。

    
    exitAct.triggered.connect(qApp.quit)
    

    当我们选中这个特定的行为的时候,一个触发的信号被提交。该信号被连接到QApplication组件的quit()方法。这个会终止这个程序。

    
    menubar = self.menuBar()
    fileMenu = menubar.addMenu("&File")
    fileMenu.addAction(exitAct)
    

    menuBar()方法创建了一个菜单栏。我们使用addMenu()创建了一个文件按钮,并且使用addAction()方法添加一个行为。

    下面是该小例子的截图:

    ![enter description here][2

    子菜单

    一个子菜单是位于另外一个菜单中的一个菜单。

    
    #!/usr/bin/python3
    # -*- coding:utf-8 -*-
    
    import sys
    from PyQt5.QtWidgets import QMainWindow, QAction, QMenu, QApplication
    
    class Example(QMainWindow):
    
        def __init__(self):
            super().__init__()
    
            self.initUI()
    
        def initUI(self):
            menubar = self.menuBar()
            fileMenu = menubar.addMenu("File")
    
            impMenu = QMenu("Import",self)
            impAct = QAction("Import mail",self)
            impMenu.addAction(impAct)
    
            newAct = QAction("New", self)
    
            fileMenu.addAction(newAct)
            fileMenu.addMenu(impMenu)
    
            self.setGeometry(300,300,300,200)
            self.setWindowTitle("Submenu")
    
            self.show()
    
    if __name__ == '__main__':
    
        app = QApplication(sys.argv)
    
        ex = Example()
    
        sys.exit(app.exec_())
    

    在这个例子中,我们有两个菜单选项;一个位于文件菜单中,另一个位于文件的Import子菜单中。

    
    impMenu = QMenu("Import", self)
    

    新的菜单使用QMenu创建。

    
    impAct = QAction("Import mail", self)
    impMenu.addAction(impAct)
    

    一个行为通过使用addAction()被添加到子菜单中。

    enter description here

    选项菜单

    在下面的例子中,我们创建了一个按钮可以被选中或者是不被选中。

    
    #!/usr/bin/python3
    # -*- coding:utf-8 -*-
    
    import sys
    from PyQt5.QtWidgets import QMainWindow,QApplication,QAction
    
    class Example(QMainWindow):
    
        def __init__(self):
            super().__init__()
    
            self.initUI()
    
        def initUI(self):
    
            self.statusbar = self.statusBar()
            self.statusbar.showMessage("Ready")
    
            menubar = self.menuBar()
            viewMenu = menubar.addMenu("View")
    
            viewStatAct = QAction("View statusbar",self,checkable=True)
            viewStatAct.setStatusTip("View statusbar")
            viewStatAct.setChecked(True)
            viewStatAct.triggered.connect(self.toggleMenu)
    
            viewMenu.addAction(viewStatAct)
    
            self.setGeometry(300,300,300,200)
            self.setWindowTitle("Check menu")
            self.show()
    
        def toggleMenu(self,state):
            if state:
                self.statusbar.show()
            else:
                self.statusbar.hide()
    
    
    if __name__ == "__main__":
        app = QApplication(sys.argv)
    
        ex = Example()
    
        sys.exit(app.exec_())
    

    这个代码例子创建了带有一个行为的视图菜单。这个行为显示或者是隐藏状态栏。当状态栏可视的时候,菜单选项被选中。

    
    viewStatAct = QAction('View statusbar', self, checkable=True)
    

    使用checkable选项,我们创建了一个可选择菜单。

    
    viewStatAct.setChecked(True)
    

    因为状态栏在一开始的时候是可视的,我们使用setChecked()方法来设置该行为。

    
    def toggleMenu(self, state):
        if state:
            self.statusbar.show()
        else:
            self.statusbar.hide()
    

    依赖于行为选中的状态,我们设置状态栏是否显示。

    enter description here

    上下文菜单

    一个上下文菜单,也被称作弹出菜单,一个出现在一些上下文中的一个命令列表。例如,在一个Opera网页浏览器中,当你在一个网页中右击的时候,我们获得一个上下文菜单。在这里我们可以重新加载一个页面,回退,或者是查看页面源码。如果我们右击一个工具栏,我们将会得到管理工具栏的另一个上下文菜单。

    
    #!/usr/bin/python3
    # -*- coding:utf-8 -*-
    
    import sys
    from PyQt5.QtWidgets import QMainWindow, qApp,QMenu,QApplication
    
    class Example(QMainWindow):
    
        def __init__(self):
            super().__init__()
    
            self.initUI()
    
        def initUI(self):
            self.setGeometry(300,300,300,200)
            self.setWindowTitle("Context menu")
    
            self.show()
    
        def contextMenuEvent(self,event):
            cmenu = QMenu(self)
    
            newAct = cmenu.addAction("New")
            opnAct = cmenu.addAction("Open")
            quitAct = cmenu.addAction("Quit")
            action = cmenu.exec_(self.mapToGlobal(event.pos()))
    
            if action == quitAct:
                qApp.quit()
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
    
        ex = Example()
    
        sys.exit(app.exec_())
    

    为了能够使用上下文菜单,我们必须重新集成contextMenuEvent()方法。

    
    action = cmenu.exec_(self.mapTpGlobal(event.pos()))
    

    该上下文菜单被exec_()方法显示。他们从事件对象中获得鼠标指针的坐标。mapToGlobal()方法传递组件的坐标到全局的屏幕坐标。

    
    if action == quitAct:
        qApp.quit()
    

    如果从上下文菜单返回的行为等于退出行为,则程序被终止。

    工具栏

    在一个应用程序中,菜单栏组织了所有的命令。工具栏提供了常用命令的快速访问途径。

    
    #!/usr/bin/python3
    # -*- coding:utf-8 -*-
    
    import sys
    from PyQt5.QtWidgets import QMainWindow, QAction, qApp,QApplication
    from PyQt5.QtGui import QIcon
    
    class Example(QMainWindow):
    
        def __init__(self):
            super().__init__()
    
            self.initUI()
    
        def initUI(self):
    
            exitAct = QAction(QIcon("exit.png"),"Exit",self)
            exitAct.setShortcut("Ctrl+Q")
            exitAct.triggered.connect(qApp.quit)
    
            self.toolbar = self.addToolBar("Exit")
            self.toolbar.addAction(exitAct)
    
            self.setGeometry(300,300,300,200)
            self.setWindowTitle("Toolbar")
            self.show()
    
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
    
        ex = Example()
    
        sys.exit(app.exec_())
    

    在上面的例子中,我们创建了一个简单的工具栏。工具栏有一个工具行为,一个退出行为,当触发的时候终止程序。

    
            exitAct = QAction(QIcon("exit.png"),"Exit",self)
            exitAct.setShortcut("Ctrl+Q")
            exitAct.triggered.connect(qApp.quit)
    

    和上面例子中的菜单栏一样,我们创建了一个行为对象。该对象有一个标签,图标和一个快捷方式。Qt.QMainWindow中的一个quit()方法被连接到触发信号中。

    
         self.toolbar = self.addToolBar("Exit")
         self.toolbar.addAction(exitAct)
    

    工具栏被addToolBar()被创建。我们使用addAction()方法添加一个行为对象到工具栏中。

    把他们放到一起

    在最后一个例子中,我们将会创建一个菜单栏,工具栏和一个状态栏。我们也将会创建一个中心的组件。

    
    #!/usr/bin/python3
    # -*- coding:utf-8 -*-
    
    import sys
    from PyQt5.QtWidgets import QMainWindow, QTextEdit, QAction,QApplication
    from PyQt5.QtGui import QIcon
    
    class Example(QMainWindow):
    
        def __init__(self):
            super().__init__()
    
            self.initUI()
    
        def initUI(self):
    
            textEdit = QTextEdit()
            self.setCentralWidget(textEdit)
    
            exitAct = QAction(QIcon("exit.png"),"Exit",self)
            exitAct.setShortcut("Ctrl+Q")
            exitAct.setStatusTip("Exit application")
            exitAct.triggered.connect(self.close)
    
            self.statusBar()
    
            menubar = self.menuBar()
            fileMenu = menubar.addMenu("&File")
            fileMenu.addAction(exitAct)
    
            toolbar = self.addToolBar("Exit")
            toolbar.addAction(exitAct)
    
            self.setGeometry(300,300,350,250)
            self.setWindowTitle("Main Window")
            self.show()
    
    if __name__ == "__main__":
    
        app = QApplication(sys.argv)
    
        ex = Example()
    
        sys.exit(app.exec_())
    

    在这里,我们创建了一个文本编辑组件。我们也把它设置成为QMainWindow的中心组件。中心组件被分为剩余空间的所有空间。

    在这篇文章中,我们学习了菜单栏,工具栏和状态栏,还有一个主程序窗口。

    展开全文
  • Android稳定性测试工具Monkey的使用

    万次阅读 2017-01-15 13:07:12
    Monkey是一个命令行工具,它可以运行在我们的模拟器或者设备当中。它可以发送一些伪随机(pseudo-random)的用户事件流,例如点击,触摸,手势等。我们能够使用Monkey工具来对我们所开发的应用进行压力测试。Monkey...

    综述

      Monkey是一个命令行工具,它可以运行在我们的模拟器或者设备当中。它可以发送一些伪随机(pseudo-random)的用户事件流,例如点击,触摸,手势等。我们能够使用Monkey工具来对我们所开发的应用进行压力测试。Monkey测试是一种为了测试软件的稳定性,健壮性的快速有效的方法。

    Monkey程序介绍

      Monkey是Android自带的系统工具,是由java语言编写。他在Android文件系统存放的路径是:/system/framework/monkey.jar
    启动moneky.jar的shell脚本文件在Android文件系统存放的路径为:/system/bin/monkey。打开这个monkey文件我们可以看一下这个脚本文件很简单。

    # Script to start "monkey" on the device, which has a very rudimentary
    # shell.
    #
    base=/system
    export CLASSPATH=$base/framework/monkey.jar
    trap "" HUP
    exec app_process $base/bin com.android.commands.monkey.Monkey $*

      我们可以看到他调用的是com.android.commands.monkey.Monkey包。

    Monkey常用命令

      下面我们就来执行这个monkey脚本。我们执行如下命令。

    adb shell monkey

      这时候,monkey将以无反馈模式进行启动,并把事件任意发送到安装在目标环境下中的全部包。运行结果如下所示。

    LiJiangdongdeMacBook-Pro:~ lijiangdong$ adb shell monkey
    usage: monkey [-p ALLOWED_PACKAGE [-p ALLOWED_PACKAGE] ...]
                  [-c MAIN_CATEGORY [-c MAIN_CATEGORY] ...]
                  [--ignore-crashes] [--ignore-timeouts]
                  [--ignore-security-exceptions]
                  [--monitor-native-crashes] [--ignore-native-crashes]
                  [--kill-process-after-error] [--hprof]
                  [--pct-touch PERCENT] [--pct-motion PERCENT]
                  [--pct-trackball PERCENT] [--pct-syskeys PERCENT]
                  [--pct-nav PERCENT] [--pct-majornav PERCENT]
                  [--pct-appswitch PERCENT] [--pct-flip PERCENT]
                  [--pct-anyevent PERCENT] [--pct-pinchzoom PERCENT]
                  [--pkg-blacklist-file PACKAGE_BLACKLIST_FILE]
                  [--pkg-whitelist-file PACKAGE_WHITELIST_FILE]
                  [--wait-dbg] [--dbg-no-events]
                  [--setup scriptfile] [-f scriptfile [-f scriptfile] ...]
                  [--port port]
                  [-s SEED] [-v [-v] ...]
                  [--throttle MILLISEC] [--randomize-throttle]
                  [--profile-wait MILLISEC]
                  [--device-sleep-time MILLISEC]
                  [--randomize-script]
                  [--script-log]
                  [--bugreport]
                  [--periodic-bugreport]
                  COUNT
    

      这时候可以看到monkey并没有运行起来,只是显示了usage,这是因为少了一个重要的参数,这是指发送的事件数。如果我们需要发送500个随机事件,执行如下命令。

    adb shell monkey 500

      这时候我们可以看到手机已经疯狂的运行起来了。moneky的基本语法为

    $ adb shell monkey [options] <event-count>

      monkey的option操作都是根据具体需求设定的,主要分为常规类,事件类,约束类和调试类。下面就对这些命令进行说明。

    Category Option Description
    常规类 --help 显示moneky参数帮助信息usage
    -v 打印日志信息,每个-v将增加反馈信息的级别。-v越多日志信息就会越详细,不过目前最多支持三个-v。Level0:一个-v,除启动提示、测试完成和最终结果之外,提供较少信息。Level1:两个-v,提供较为详细的测试信息,如逐个发送到Activity的事件。Level2:三个-v,提供更加详细的设置信息,如测试中被选中的或未被选中的Activity。
    事件类 -s <seed> 伪随机数生成器的seed值。如果用相同的seed值再次运行 Monkey,它将生成相同的事件序列。
    --throttle <milliseconds> 后面接时间,单位为毫秒,表示事件之间的固定延时(即执行每一个指令的间隔时间),若不接这个选项,monkey则不会延时
    --pct-touch <percent> 后面接触摸事件的百分比。(触摸事件是一个down-up事件,它发生在屏幕上的某单一位置)
    --pct-motion <percent> 后面接动作事件的百分比。(动作事件由屏幕上某处的一个down事件、一系列的伪随机事件和一个up事件组成)。
    --pct-trackball <percent> 后面接轨迹事件的百分比(轨迹事件由一个或几个随机的移动组成,有时还伴随有点击)。
    --pct-nav <percent> 后面接“基本”导航事件百分比(导航事件主要来自方向输入设备的上,下,左,右事件)
    --pct-majornav <percent> 后面接“主要”导航事件的百分比(这些导航事件通常引发图形界面中的动作,如:5-way键盘的中间按键、回退按键、菜单按键)
    --pct-syskeys <percent> 后面接“系统”按键事件的百分比(这些按键通常被保留,由系统使用,如Home、Back、StartCall、End Call及音量控制键)。
    --pct-appswitch <percent> 后面接启动Activity的百分比。在随机间隔里,Monkey将执行一个startActivity()调用,作为最大程度覆盖包中全部Activity的一种方法。
    --pct-anyevent <percent> 调整其它类型事件的百分比。它包罗了所有其它类型的事件,如:按键、其它不常用的设备按钮、等等。
    约束类 -p <allowed-package-name> 如果用此参数指定了一个或几个包,Monkey将只允许系统启动这些包里的Activity。如果你的应用程序还需要访问其它包里的Activity(如选择取一个联系人),那些包也需要在此同时指定。如果不指定任何包,Monkey将允许系统启动全部包里的Activity。要指定多个包,需要使用多个-p选项,每个-p选项只能用于一个包。
    -c <main-category> 如果用此参数指定了一个或几个类别,Monkey将只允许系统启动被这些类别中的某个类别列出的Activity。如果不指定任何类别,Monkey将选择下列类别中列出的Activity:Intent.CATEGORY_LAUNCHER或Intent.CATEGORY_MONKEY。要指定多个类别,需要使用多个-c选项,每个-c选项只能用于一个类别。
    调试类 --dbg-no-events 设置此选项,Monkey将执行初始启动,进入到一个测试Activity,然后不会再进一步生成事件。为了得到最佳结果,把它与-v、一个或几个包约束、以及一个保持Monkey运行30秒或更长时间的非零值联合起来,从而提供一个环境,可以监视应用程序所调用的包之间的转换。
    --hprof 设置此选项,将在Monkey事件序列之前和之后立即生成profiling报告。这将会在data/misc中生成大文件(~5Mb),所以要小心使用它。
    --ignore-crashes 通常,当应用程序崩溃或发生任何失控异常时,Monkey将停止运行。如果设置此选项,Monkey将继续向系统发送事件,直到计数完成。
    --ignore-timeouts 通常,当应用程序发生任何超时错误(如“ApplicationNot Responding”对话框)时,Monkey将停止运行。如果设置此选项,Monkey将继续向系统发送事件,直到计数完成。
    --ignore-security-exceptions

    一条常用的Monkey命令

    adb shell monkey -v -v -v -p [PackageName] --ignore-crashes --ignore-timeouts --ignore-security-exceptions --monitor-native-crashes --ignore-native-crashes --throttle 1000 100000 > monkey.txt

      执行这条命令后会在当前文件夹下面生成一个名为monkey.txt的日志文件,我们可以通过搜索exception和ANR来找到monkey测试中所出现的Crash和ANR。

    停止Monkey

      对于正在运行的monkey应用。如果我们想要停止monkey测试可以如下命令。

    $ adb shell
    
    shell@lte26007:/ $ top | grep monkey
    26194  0   0% S    10 461848K  23012K     shell    com.android.commands.monkey
    26194  0   0% S    10 461848K  23012K     shell    com.android.commands.monkey
    26194  0   0% S    10 461848K  23012K     shell    com.android.commands.monkey
    
    $ kill -9 26194 $ kill -9 26194

      在这里是通过杀死正在运行的monkey的进程来终止monkey的测试。

    如何编写Monkey脚本

      我们了解了一些Monkey的基本命令以后,但这通过这些命令运行Monkey测试所有的事件都是随机的,只会在手机屏幕进行随机点击。那么我们如何使用monkey做到自动填写,选择,提交呢?在这就来看一下如何编一个Monkey脚本。

    常用Monkey Api介绍

    1.启动应用

    LaunchActivity(String pkg_name, String cl_name)

      启动应用的Activity。参数为包名和启动的Activity。
    2.轨迹球事件

    DispatchTrackball(long downTime, long eventTime, int action, float x, float y, float pressure, float size, int metaState, float xPrecision, float yPrecision, int device, int edgeFlags)

      这里参数很多,只需要关注action,x,y.对于参数action值为0代表按下(KeyDown),1代表弹起(KeyUp)。如果使用这个方法实现点击事件,这个方法就应该成对出现,先传入0,然后在传入1。对于x,y就是定位的坐标点。下面列出其中参数含义。

    • long downTime:键最初被按下时间
    • long eventTime:事件发生时间
    • int action:动作ACTION_DOWN=0,ACTION_UP=1,ACTION_MULTIPLE=2
    • float x:x坐标
    • float y:y坐标
    • float pressure:当前事件的压力,值为0~1
    • float size:触摸的近似值,范围为0~1
    • int metaState:当前按下的meta键的标识
    • float xPrecision:x坐标精确值
    • float yPrecision:y坐标精确值
    • int device:事件来源,范围0~x,0表示不来自物理设备
    • int edgeFlags:坐标是否超出了屏幕范围

    3.输入字符串事件

    DispatchString(String text)

      输入一个不加引号的字符串
    4.点击事件

    DispatchPointer(long downTime,  long eventTime, int action, loat x, float y, float pressure, float size, int metaState,  float xPrecision, float yPrecision, int device, int edgeFlags)
    与轨迹球事件类似

    5.等待事件

    UserWait(long sleeptime)

    6.按下事件

    DispatchPress(int keyCode)

    7.单击事件

    Tap(int x,int y) 

    8.长按事件

    LongPress()

    9.发送键值

    DispatchKey(long downTime, long eventTime, int action, int code, int repeat, int metaState, int device, int scancode)

    10.开关软键盘

    DispatchFlip(boolean keyboardOpen)

    编写Monkey脚本

      在写Monkey脚本之前首先看一下怎么获取包名和应用名,已经怎么怎么获取点击坐标。

    获取包名和应用名

    1.查看包名

    $ adb shell
    # ls data/data

    2.查看应用(主界面)名

    $ adb shell
    # logcat | grep START

      以QQ为例看一下输出结果

    LiJiangdongdeMacBook-Pro:~ lijiangdong$ adb shell
    shell@lte26007:/ $ su
    root@lte26007:/ # logcat | grep START
    I/libmc   ( 9161): received event[index:0,mask:0x80,name:SYSTEM_RESTART@1487131192515.txt]
    D/MSF.C.NetConnInfoCenter(18238): receive broadcast Intent { act=android.intent.action.MEDIA_SCANNER_STARTED dat=file:///system/media flg=0x10 cmp=com.tencent.mobileqq/.msf.core.NetConnInfoCenter }
    D/MSF.C.NetConnInfoCenter(18238): receive broadcast Intent { act=android.intent.action.MEDIA_SCANNER_STARTED dat=file:///storage/emulated/0 flg=0x10 cmp=com.tencent.mobileqq/.msf.core.NetConnInfoCenter }
    D/AndroidRuntime(19635): >>>>>> AndroidRuntime START com.android.internal.os.RuntimeInit <<<<<<
    I/ActivityManager(17556): START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.tencent.mobileqq/.activity.SplashActivity bnds=[34,466][170,602]} from pid 17844

      从cmp=com.tencent.mobileqq/.activity.SplashActivity这句话可以看出QQ应用的主界面名为SplashActivity。

    获取点击坐标

    $ adb shell getevent

      之后我们手指在屏幕上操作就可以看到输出的事件信息。下面看一下输入信息。

    /dev/input/event1: 0003 0039 00003809
    /dev/input/event1: 0003 0035 00000172
    /dev/input/event1: 0003 0036 000002aa
    /dev/input/event1: 0001 014a 00000001
    /dev/input/event1: 0000 0000 00000000
    /dev/input/event1: 0003 0039 ffffffff
    /dev/input/event1: 0001 014a 00000000
    /dev/input/event1: 0000 0000 00000000
       (DeviceName)  (Type)(Code)(Value)

      当Code出现0030和0032时,表示有触屏事件发生,而0035和0036出现时则代表实际触屏时的绝对坐标x,y。比如这里点172和2aa,这个是16进制,对应10进制为370和682。

    Monkey脚本

      上面api明白以后Monkey脚本的编写就很简单了,下面就以QQ为列变了一段monkey脚本。对于头文件是必须的。Monkey脚本是没有文件格式限制的。

    #头文件信息  
    type=raw events  
    count=10  
    speed=1.0  
    start data >>  
    
    #具体的脚本内容  
    LaunchActivity(com.tencent.mobileqq,com.tencent.mobileqq.activity.SplashActivity)  
    UserWait(1000)  
    DispatchPointer(10,10,0,165,189,1,1,-1,1,1,0,0)
    DispatchPointer(10,10,1,165,189,1,1,-1,1,1,0,0)
    UserWait(1000)  
    DispatchString(1234567)  
    DispatchFlip(false)  
    UserWait(5000)
    Tap(359,257)

      上面这段脚本执行的命令是:启动QQ->点击搜索->输入1234567->点击QQ号为1234567的人。下面就来看一下如何执行这段脚本代码。

    $ adb push monkey_test /mnt/sdcard/
    $ adb shell monkey -f /mnt/sdcard/monkey_test 1

    总结

      在这里介绍了Monkey的使用,对于我们的应用通过monkey进行压力测试,也能够发现众多的ANR以及Crash。对于Monkey也有一定缺点的,它是不支持截屏,录制回放等操作的。

    附录

    Monkey源码

    展开全文
  • JVM 监控工具和调优工具[图形化]

    千次阅读 2017-09-24 10:33:47
    之前有总结过JVM监控和调优的工具JVM 监控工具和调优工具 不过这些都是命令行和设置JVM参数的方式,现在来总结归纳下一些图形化的工具JConsoleJConsole 是一个基于JMX 的图形监控工具用于连接正在运行的JVM,可以...
  • 线框图工具可以让设计师的灵感快速呈现,在任何项目最开始的阶段,选择一款得心应手的线框图工具不失为一种最佳选择。如今,线框图工具的出现用雨后春笋来形容也不会过于夸张,各色工具唾手可得,过多的选择却也确...
  • MIPS架构的交叉编译工具问题

    万次阅读 2009-03-31 13:40:00
    MIPS架构的交叉编译工具问题某些MIPS架构的机顶盒提供了六种交叉编译工具GCC,如下:· mipsel-linux-gcc· mipsel-linux-uclibc-gcc· mipsel-uclibc-gcc· mips-linux-gcc· mips-linux-uclibc-gcc· mips-uclibc-...
  •  本文介绍了在 Linux 下能用于 C 应用程序开发和调试的工具. 本文的主旨是介绍如何在 Linux 下使用 C 编译器和其他 C 编程工具, 而非 C 语言编程的教程.GNU C 编译器GNU C 编译器(GCC)是一个全...
  • 今天在写一个C#数据插入工具时,提示以下错误: “INSERT 失败,因为下列 SET 选项的设置正确: ARITHABORT”最后在网上搜索了下,看到以下内容 当你在SQL Server上试图更新一个索引视图引用的表时,你可能回收到...
  • 数据泵 EXPDP 导出工具的使用

    万次阅读 2010-10-07 18:10:00
    --=================================--数据泵 EXPDP 导出工具的使用--================================= 对于Oracle 数据库之间的导入导出,可以使用Oracle提供的导入导出工具EXP/IMP来实现。EXP/IMP是Oracle早期...
  • 知道的,F12开发者工具调试技巧

    万次阅读 多人点赞 2019-10-26 09:11:54
    知道的,F12开发者工具调试技巧 1. 调试伪类 (点击styles 选择:hov 在下方选择元素的状态即可) 方式二 (在elments中选中节点然后右键选中元素前状态,点击后 节点前就会出现一个橘色小球,然后在右侧就可以...
  • 数据泵IMPDP 导入工具的使用

    万次阅读 2010-10-08 09:11:00
    --=================================--数据泵IMPDP 导入工具的使用--================================= 数据的导入导出时数据库经常处理的作业之一,Oracle 提供了IMP和IMPDP以及SQL*Loader等工具来完成数据的...
  • MySQL Binlog 解析工具 Maxwell 详解

    万次阅读 多人点赞 2019-03-11 09:56:44
    Maxwell是一个实时读取MySQL二进制日志binlog,并生成 JSON 格式的消息,作为生产者发送给 Kafka,Kinesis、RabbitMQ、Redis、Google Cloud Pub/Sub、文件或其它平台的应用程序。它的常见应用场景有ETL、维护缓存...
  • VC/MFC 工具完全用法

    千次阅读 2010-09-04 11:08:00
    <br />工具条,在MFC编程中是常常用到的,其实创建的方法也很简单,待我慢慢说来。 一 新建一个ToolBar资源,设ID号为ID_FULLTOOLBAR; 二 在MainFrm.h中,添加一变量: CToolBar m_...
  • 项目启动,要搭架子,第一件事,当然是选择一个包管理工具。Go的包管理还是挺混乱的,没有一个像Java的Maven一样足够强大&一统天下,尽管优秀的第三方工具已有十来种,且官方也开始着手开发(快统一江湖吧)。 (ps:...
  • JDK内置工具

    千次阅读 2017-12-18 11:40:24
    JDK是一个功能强大的Java开发套装,它仅仅为我们提供了Java运行环境,还给开发人员提供了许多有用的开发组件(位于bin目录中,如下图所示)。仅仅使用JDK,就能够解决我们在Java开发过程中遇到的许多问题。 下面...
  • Oracle expdp/impdp工具使用

    万次阅读 2012-08-11 15:35:52
    Oracle数据泵   一、数据泵的作用:  1.实现逻辑备份和逻辑恢复  2.在数据库用户之间移动对象  3.在数据库之间移动对象 ... 4.... 1.EXP和IMP是客户段工具程序, EXPDP和IMPDP是服务端的工具程序  2.EXP...
  • Modbus测试工具与控件介绍

    万次阅读 2015-09-22 10:32:06
    Modbus测试工具与控件:Modbus Poll,Modbus Slave、WSMBT 、WSMBS、MBAXP
  • 大数据工具千千万,到底谁才是最强王者?

    千次阅读 多人点赞 2019-01-05 17:38:30
    虽然确实如此,可是面对那么多的选择,想理清这么多的工具谈何容易。 哪一种工具适合你的技能组合?哪一种工具适合你的项目? 为了替你节省一点时间,并帮助你首次选对工具,我们列出了我们青睐的几款数据工具,涉及...
  • 1、套索工具:可以绘制规则的选区 2、多边形套索工具:可以绘制直线型的多边形选区。 在绘制的过程中,要涂抹刚绘制的直线段,可以按下Delete键。 3、如果需要选择的图像轮廓是由直线和曲线组合而成,在选择的过程...
  • Gacutil.exe(全局程序集缓存工具

    千次阅读 2016-06-22 20:16:36
    Gacutil.exe(全局程序集缓存工具) 全局程序集缓存工具使您可以查看和操作全局程序集缓存和下载缓存的内容。...安装 Visual Studio 和 Windows SDK 时会自动安装... 您可以使用这些实用程序轻松运行工具,而
  • 我们会注意到谷歌浏览器(以下简称Chrome)和其他一些软件既允许用户选择安装路径,也没有安装到Program Files目录下,而是在C:\Users\[当前用户名]\AppData\Local路径下创建了专用的文件夹。要理解这些软件为什么...
  • UML建模工具

    千次阅读 2012-06-04 13:27:14
    简介:Enterprise Architect来源澳大利亚,它是一个全功能的、基于UML的visual CASE工具,主要用于设计、编写、构建并管理以目标为导向的软件系统。它支持用户案例、商务流程模式以及动态的图表、分类、界面、协作、...
  • rsyslog工具

    万次阅读 2019-05-10 10:15:04
    Rsyslog是一个开源软件实用程序,用于UNIX和类Unix计算机系统,用于在IP 网络中转发日志消息,收集日志。它实现了基本的syslog协议,通过基于内容的过滤,丰富的过滤功能,灵活的配置选项扩展了它,并添加了诸如使用...
  • 英特尔有下列牛逼的开发工具与辅助套件,如何应用到实践中去,让自己的软件变得更加大,软件开发更加容易,软件拥有更多的性能呢英特尔® 图形性能分析器 3.0英特尔® Cloud Builder英特尔® 主动管理技术 API ...
  • 本文将围绕以太坊,介绍相关基础知识,提供各种查询工具、社群链接,帮助大家更加深入学习以及在以太坊上进行开发。 从 2008 年诞生以来,区块链走过了十多年的风雨路,繁衍出比特币、以太坊、EOS等诸多公有链。...
  • 先下了VMware 10 及其注册机、OS X的dmg安装文件、UltraISO 安装好了虚拟机,用UltraISO将OSX10.8.dmg转换成了.iso文件...二进制转换支持用于Mac OS X。要运行Mac OS X ·······,你需要一台 VMware Workst
  • 电子取证工具

    千次阅读 2007-10-26 14:02:00
    电子取证工具 你准备好了吗?...在国外计算机取证过程中比较流行的是镜像工具和专业的取证软件,但很多工具都属于付费软件,很多读者可能免费拥有它们,但有一些开源工具或者操作系统自身的工具也可以实现
  • osgGIS工具简介

    千次阅读 2011-08-18 11:00:02
    介绍:OsgGIS用于从GIS...OsgGIS能用于:  1.连接到要素数据源(比如shapefile),并读取几何信息和属性信息;  2.装配一个自定义的变换过程来将要素转换为OSG的几何体;  3.构建线形几何体,比如街道和行政界限;  4.
  • 可以组合成如下图: 各内置Filter的详细说明如下表: 名称 类型 次序 描述 ServletDetectionFilter pre -3 该过滤器用于检查请求是否通过Spring Dispatcher。检查后,通过isDispatcherServletRequest设置布尔值。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 128,457
精华内容 51,382
关键字:

下列不能用于选择的工具是