首页 文章 精选 留言 我的

精选列表

搜索[个人博客],共10000篇文章
优秀的个人博客,低调大师

Hexo 4.2.0 发布,快速简洁且高效的博客框架

Hexo 4.2.0 发布了,更新内容如下: 特性 默认情况下,在 hexo-server 中禁用缓存 [#3963] 禁用此功能后,可以实时预览任何更改(尤其是主题布局)。 如果在生产环境中使用 hexo-server 为网站提供服务,则可以通过以下方式启用它: _config.yml server: cache: true 将min_depth:选项添加到toc() [#3997] 用法示例: <%- toc(page.content, { min_depth: 2 }) %> // table of content would only include <h2>, <h3> and above 更新说明:https://github.com/hexojs/hexo/releases/tag/4.2.0

优秀的个人博客,低调大师

Hexo 4.1.1 发布,快速简洁且高效的博客框架

Hexo 4.1.1 发布了,更新内容如下: 特性 添加trailing_html:到pretty_urls:选项以从 url 中删除 ".html" [#3917] 使用以下配置从永久链接变量中删除结尾的 ".html" _config.yml pretty_urls: trailing_html: fals 修复 为og:locale标签设置默认语言环境(以 “language_TERRITORY” 格式) [#3921] 之前只有在将language:配置为 "language-TERRITORY" 格式时才插入og:locale 使用此修复程序,如果语言为 “en”,则og:locale将默认为 “en_US” meta_generator()助手应该输出正确的 Hexo 版本 [#3925] permalink_defaults:选项应该被解析,而不是被替换 [#3926] themes/ 中的 "node_modules/" 和 ".git/" 文件夹总是被忽略 [#3918] 更新说明:https://github.com/hexojs/hexo/releases/tag/4.1.1

优秀的个人博客,低调大师

Hexo 4.1.0 发布,快速简洁且高效的博客框架

Hexo 4.1.0 发布了,更新内容如下: 特性 支持添加小时和分钟来发布固定链接 [#3629] 用法示例: _config.yml permalink: :year/:month/:day/:hour/:minute/:title/ 结果是https://yoursite.com/2019/12/09/23/59/a-post/ 插入article:published_time[#3674]article:author[#3805] 打开图标签 在与 iframe 相关的代码插件中启用延迟加载 [#3798] 影响 iframe,jsfiddle,vimeo,youtube 标记插件 需要支持的浏览器才能使用此功能 不支持的浏览器将简单地忽略该属性,因此可以安全使用并始终启用 meta_generator助手来插入元数据元素标签 [#3782] 用法示例: 在主题布局的 <head> 元素内插入以下代码段(如果使用 EJS), <%- meta_generator() %> 将输出<meta name="generator" content="Hexo 4.1.0"> Hexo 3.9.0+ 自动插入标签;为了获得性能优势,需要禁用meta_generator:选项, _config.yml meta_generator: false 在js()[#3681] 和css()[#3690] helpers中支持自定义属性 用法示例: <%- js({ src: 'script.js', integrity: 'foo', async: true }) %> // <script src="/script.js" integrity="foo" async></script> <%- css({ href: 'style.css', integrity: 'foo' }) %> // <link rel="stylesheet" href="/style.css" integrity="foo"> 支持换行:启用/禁用在 <table> 元素中换行反引号代码块的选项 [#3827] 默认情况下启用,启用 line_number 也会启用它 高亮配置: _config.yml highlight: line_number: false # must be disabled to disable wrap: wrap: false 此选项也可以传递给 codeblock() 标签插件 [#3848] {% codeblock lang:js wrap:false %} const foo = (bar) => { return bar; }; {% endcodeblock %} 更新说明:https://github.com/hexojs/hexo/releases/tag/4.1.0

优秀的个人博客,低调大师

Hexo 4.0.0 发布,快速简洁且高效的博客框架

Hexo 4.0.0已经发布,更新内容如下: chore:删除Node 6 修复 post_link和 asset_link 修复:默认情况下编码 permalink 如果你目前使用 encodeURI(post.permalink),提供三个选项:encodeURI(decdeURI(post.permalink))与 HEXO v3.9 向后兼容;HEXO-util 提供的 encodeURL() 函数,它是向后兼容的;删除encodeURI() feat:添加选项禁用元生成器标记(将 meta_generator: false 添加到 config 以禁用) 如果不想在 post.update 变量中使用文件修改时间,可在配置文件中设置 USE_DATE_FORPDATED:true feat(permalink_variable):添加 pretty_urls 选项以从 url 中删除 index.html 使用下面的配置从 permalink 变量中删除跟踪 index.html pretty_urls: trailing_index: false 修复(open_graph):从 url 删除 index.html 修复(helpers, tag plugins):默认情况下编码 url 修复:external_link使用after_render,添加了 field和exclude选项 更多详情见发布说明。

优秀的个人博客,低调大师

[雪峰磁针石博客]python应用性能监控工具简介

监控简介 监视工具捕获,分析和显示Web应用程序执行信息。每个应用程序在Web堆栈的所有层都可能出现问题。监控工具通过展示帮助开发人员和运营团队响应并修复问题。 捕获和分析有关生产环境的数据对于主动处理Web应用程序的稳定性,性能和错误至关重要。 监视和日志记录的目的非常相似,它们有助于诊断应用程序的问题并帮助调试。主要差异为日志基于事件触发,而监视是被动的背景数据集合。 例如发生错误时,通过异常处理程序中的代码显式记录该事件。同时,监视代理程序对代码进行检测,并且不仅收集有关已记录异常的数据,还收集有关函数和方法性能的数据。 操作系统和网络的监控关注: CPU、内存和磁盘利用率,网络带宽和延迟 应用程序级别监视包含几个方面。 基于应用程序是重读,重写还是受到快速波动的影响而有所不同。涉及应用程序警告和错误(500级HTTP错误)、应用代码性能、模板渲染时间、浏览器渲染应用程序的时间、数据库查询性能等。 开源监控项目 错误跟踪 Sentry 最初只是一个Python监控项目,但现在可以用于任何编程语言。 图片.png 度量 statsd 是一个node.js网络守护程序,它监听指标并聚合它们以便转移到另一服务(如Graphite)。 Graphite 存储时间序列数据,并通过Django Web应用程序在图形中显示它们。 图片.png Sensu 是一个用Ruby编写的开源监控框架,但适用于任何编程语言Web应用程序。 Graph Explorer Vimeo的Graph Explorer是一个基于Graphite的仪表板,具有附加功能和平滑的设计。 Munin 基于客户端插件的监控系统,可以将监控流量发送到Munin节点,在那里可以分析和可视化数据。请注意,此项目是用Perl编写的,因此必须在收集数据的节点上安装Perl 5。 用户监控 Bucky 测量来自最终用户浏览器的Web应用程序的性能,并将该数据发送回服务器以进行收集。 本文最新版本地址 https://china-testing.github.io/python_monitor.html 第三方监控服务 第三方监控软件没有部署和操作软件的负担。但是,托管监控成本不低,应用程序数据有危险,因此这些服务并不适合每个项目。 错误跟踪 Rollbar 用于服务器端和客户端,用于捕获和报告异常。 pyrollbar代码库为Python Web应用程序提供了快速集成。还有一些常见Web框架的具体说明,例如Django和Pyramid。 Sentry 是开源工具的托管版本,用于货币化并支持二次开发。 应用程序性能监控(APM) New Relic 提供应用程序和数据库监控以及用于捕获和分析堆栈中其他devleoper工具(如Twilio)的数据的插件。 Opbeat 专为django而建。 Opbeat将性能指标,发布跟踪和错误记录结合到一个简单的服务中。 Scout 监控Django和Flask应用程序的性能,自动检测视图,SQL查询,模板等。 状态页面 Status.io Web应用程序的正常运行时间和响应指标可视化。 StatusPage.io 简单的设置状态页面,用于监控应用程序的运行时间。 事件管理 PagerDuty 如果应用程序存在稳定性,性能或正常运行时间问题,PagerDuty会向指定人员或组发出警报。 监控资源 How to Add Hosted Monitoring to Flask Web Applications及[How to Monitor Bottle Web Applications] (https://www.fullstackpython.com/blog/monitor-python-web-applications.html)系列文章,介绍如何将托管监控添加到主要的Python Web框架应用程序。 The Virtues of Monitoring Effortless Monitoring with collectd, Graphite, and Docker Practical Guide to StatsD/Graphite Monitoring是一个详细的指南,其中包含用于监控基础架构的代码示例。 "10 Things They Forgot to Monitor 描述了超出磁盘和内存使用等标准。 四个Linux服务器监控工具 Four Linux server monitoring tools 如何设计有用的监控和图形可视化 How to design useful monitoring and graphing visualizations 5 years of metrics and monitoring 是一个很好的演示,突出了可视化。线图通常不是最佳解决方案,而且它们被过度使用。 Collector Highlight Series有一篇关于StatsD 的文章,解释了如何安装它以及它是如何工作的。 survey on monitoring tools有一些关于开发人员和运营人员在其环境中使用的数据和图表。 Ryan Frantz写了一篇关于Solving Monitoring 的好文章,其中新的定义是基于当今复杂系统的监控手段,以及该实践应如何发展。 监控学习清单 查看下面的软件即服务和开源监控工具。第三方服务往往更容易设置和托管数据。开源项目为您提供了更多控制权,但您需要为监控准备其他服务器。 我的建议是在试用期内安装New Relic的免费选项,以了解它如何与您的应用配合使用。它将使您对应用程序级监视工具的功能有所了解。 作为您的应用程序比例,请查看如何使用Graphite设置其中一个开源监视项目,例如StatsD。这两个项目的组合将为您提供对您正在收集和可视化的系统指标的细粒度控制。 python监控库参考:https://github.com/china-testing/python-api-tesing#%E7%9B%91%E6%8E%A7 参考资料 讨论 钉钉群21745728 qq群144081101 567351477 本文最新版本地址 本文涉及的python测试开发库 谢谢点赞! 本文相关海量书籍下载 Monitoring

优秀的个人博客,低调大师

[雪峰磁针石博客]2018最佳ssh免费登陆工具

Linux 终端 PAC 参考资料 讨论qq群144081101 591302926 567351477 钉钉免费群21745728 本文涉及的python测试开发库 谢谢点赞! 本文相关海量书籍下载 Windows git终端 https://git-scm.com/download/win MobaXterm http://mobaxterm.mobatek.net/ mRemoteN https://mremoteng.org/download 有些windows7不能安装,windows10的大多可以。 其他 https://www.chiark.greenend.org.uk/~sgtatham/putty/ 不能保存密码https://www.openssh.com/ 官方ssh实现https://alternativeto.net/software/kitty/ putty增强 但还是不能保存密码https://connectbot.org/ 安卓上最佳的连接工具 概览 名称 开发者 状态 最初版本 最新版本 基于 许可证 可获得源代码 AbsoluteTelnet Celestial Software (Brian Pence) 活跃 1996 2012-11-25 9.53 专有 否 Bitvise SSH Client/Tunnelier Bitvise 活跃 5 2002 2014-09-08 7.22 专有 否 ConnectBot Kenny Root / Jeffrey Sharkey 活跃 11 2007 2010-10-08 1.7.1 Apache 是 DameWare SolarWinds 活跃 2012年11月28日 专有 否 Dropbear Matt Johnston 活跃 2003年04月06日 2016-07-21 2016.74 MIT 是 MindTerm Cryptzone 活跃 1998年11月13日 2014年02月25日 专有 是 MobaXterm Mobatek 活跃 2008 2014-08-04 7.2 OpenSSH GPL Yes eSSH Client Ecode Software 不活跃 07 2002 专有 否 Private Shell Imposant 活跃 04 2003 2013-07-29 3.3 专有 否 ProxyCap Proxy Labs 活跃 2002 专有 否 FileZilla Tim Kosse 活跃 2001年06月22日 2016-12-06 3.23.0.2 PuTTY GPL 是 lsh Niels Möller 活跃 1999年05月23日 2013-06-26 2.0.4 GPL 是 OpenSSH The OpenBSD project 活跃 1999年12月01日 2016-12-19 7.4 ossh BSD 是 PACManager David Torrejón Vaquerizas 活跃 2010年01月01日 2016-12-12 4.5.5.5 OpenSSH, Telnet, FTP, vncviewer, rdesktop, cu, remote-tty, mosh, cadaver GPL 是 PuTTY Simon Tatham 活跃 1999年01月22日 2016-03-05 0.67 MIT 是 Reflection for Secure IT Attachmate 活跃 2012-11-12 F-Secure SSH 专有 否 Salt Maarten L. Hekkelman 活跃 11 2011 2013-06-22 3.2.2 专有 否 SecureCRT VanDyke Software 活跃 06 1998 2016-12-06 8.0.4 专有 否 SmartFTP SmartSoft Ltd 活跃 1998 专有 否 SSH Tectia Client/ConnectSecure SSH Communications Security(前身:Tectia) 活跃 07 1995 2013-07 以C语言独立实现 专有 否 SunSSH Open Solaris 活跃 2001 OpenSSH 2.3 CDDL 是 Terminals CodePlex Terminals CodePlex Project 活跃 2006 2013-07-16 3.1 Microsoft MS-CL 是 Tera Term TeraTerm Project 活跃 2004 2013-02-28 4.77 TeraTerm 2.3 (1994–1998) BSD 是 TN3270 Plus SDI USA, Inc. 活跃 2006 专有 否 Token2Shell Choung Networks 活跃 2008 2014-03-06 6.9.1 专有 否 TtyEmulator FCS Software 活跃 05 2002 专有 否 WinSCP Martin Prikryl 活跃 2000 2016-11-30 5.9.3 PuTTY GPL 是 Xshell NetSarang Computer, Inc. 活跃 2002-11-02 2018-09-10 6.0.0098 专有 否 ZOC Terminal EmTec, Innovative Software 活跃 1995年07月01日 2016-12-01 7.11.1 专有 否 Penguinet siliconcircus ? 1998? 2011-07-24 2.54 专有 否 名称 OS X Windows Cygwin BSD Linux Solaris) Java OpenVMS z/OS AIX HP-UX iOS Android Maemo Windows Phone AbsoluteTelnet 否 是 否 否 否 否 否 否 否 否 否 否 否 否 ? ConnectBot 否 否 否 否 否 否 ? ? ? 否 否 否 是 否 ? Dropbear 是 否 是 是 是 是 ? ? ? 是 是 否 是 是 ? eSSH Client 是 是 ? 是 是 是 ? ? ? 否 否 否 否 否 ? JuiceSSH 否 否 否 否 否 否 否 否 否 否 否 否 是 否 否 lsh 是 否 否 部分[注 1] 是 是 ? ? ? 否 否 否 否 否 ? MindTerm 是 是 ? 是 是 是 是 是 ? 是 是 否 否 否 ? MobaXterm 否 是 否 否 否 否 否 否 否 否 否 否 否 否 否 OpenSSH 集成 部分[注 2] 集成 集成 集成[注 3] 是 ? 是 是 是 是 是[注 4] 否 是 ? Private Shell 否 是 否 否 否 否 否 否 否 否 否 否 否 否 否 PACManager 否 否 否 部分 是 否 否 否 否 否 否 否 否 否 否 ProxyCap 是 是 否 否 否 否 否 否 否 否 否 否 否 否 ? PuTTY 部分 是 ? 是 是 ? ? ? ? 否 否 否 否 否 Beta[注 5] Salt 否 是 否 否 否 否 否 否 否 否 否 否 否 否 ? SecureCRT 是 是 否 否 是 否 否 否 否 否 否 否 否 否 ? SmartFTP 否 是 否 否 否 否 否 否 否 否 否 否 否 否 ? SSH Tectia Client/ConnectSecure 否 是 否 否 是 是 是[注 6] 否 是 是 是 否 否 否 ? Tera Term 否 是 否 否 否 否 ? ? ? ? 否 否 否 否 ? TN3270 Plus 否 是 否 否 否 否 否 否 否 否 否 否 否 否 ? Token2Shell 否 是 否 否 否 否 否 否 否 否 否 否 否 否 是[注 7] TtyEmulator 否 是 否 否 否 否 否 否 否 否 否 否 否 否 ? WinSCP 否 是 否 否 否 否 否 否 否 否 否 是[注 4] 否 否 ? Xshell 否 是 否 否 否 否 否 否 否 否 否 否 否 否 否 ZOC 是 是 否 否 否 否 否 否 否 否 否 否 否 否 ? Penguinet 否 是 否 否 否 否 否 否 否 否 否 否 否 否 ? Name OS X Windows Cygwin BSD Linux Solaris) Java OpenVMS z/OS AIX HP-UX iOS Android Maemo Windows Phone

优秀的个人博客,低调大师

[雪峰磁针石博客]python与java对接工具Jython介绍

快速入门 下面我们使用jython来调用自定义jar包中的类。 编辑java文件:Beach.java public class Beach { private String name; private String city; public Beach(String name, String city){ this.name = name; this.city = city; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } } 编译成jar包: # javac Beach.java # echo Main-Class: Beach >manifest.txt # jar cvfm Craps.jar manifest.txt *.class 已添加清单 正在添加: Beach.class(输入 = 795) (输出 = 430)(压缩了 45%) 正在添加: Point.class(输入 = 708) (输出 = 445)(压缩了 37%) 添加Craps.jar到CLASSPATH,修改/etc/profile,修改CLASSPATH export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:/usr/local/jython/Craps.jar 使用. /etc/profile导入变量。然后使用jython调用java代码。 # ./jython Jython 2.7.0 (default:9987c746f838, Apr 29 2015, 02:25:11) [Java HotSpot(TM) 64-Bit Server VM (Oracle Corporation)] on java1.7.0_79 Type "help", "copyright", "credits" or "license" for more information. >>> import Beach >>> beach = Beach("Cocoa Beach","Cocoa Beach") >>> beach.getName() u'Cocoa Beach' >>> print beach.getName() Cocoa Beach >>> 基础 Linux安装: # java -jar jython-installer-2.7.0.jar # ./jython Jython 2.7.0 (default:9987c746f838, Apr 29 2015, 02:25:11) [Java HotSpot(TM) 64-Bit Server VM (Oracle Corporation)] on java1.7.0_79 Type "help", "copyright", "credits" or "license" for more information. >>> windows安装:双击jython-installer-2.7.0.jar, 执行jython.exe 变量定义: java int x = 0; jython: x = 0 x = 'Hello Jython' 是动态类型的。 保留字: and assert break class continue def del elif else except exec finally for from global or pass print raise return try while with yield 编码结构使用缩进。 函数名也可以作为函数的参数。 语句关键字: if-elif-else for while continue break try-except-finally assert def print del raise import 文件名和类名一样可以直接导入。 此部分参考资料: http://www.jython.org/jythonbook/en/1.0/JythonAndJavaIntegration.html http://www.skylit.com/javamethods/faqs/createjar.html 参考资料: http://www.jython.org/jythonbook/en/1.0/ 模块和包 查看命名空间 >>> dir() ['__builtins__', '__doc__', '__name__', '__package__'] Jython的导入不像java那样必须在头部。导入java以右边名优先,python以左边名优先。模块查找路径: >>> import sys >>> sys.path ['', '/usr/local/jython2.7.0/Lib', '__classpath__', '__pyclasspath__/', '/usr/local/jython2.7.0/Lib/site-packages'] >>> import sys >>> sys.path ['', '/usr/local/jython2.7.0/Lib', '__classpath__', '__pyclasspath__/', '/usr/local/jython2.7.0/Lib/site-packages'] >>> import sys >>> sys.path.append("/home/andrew/code/java/mysql-connector-java-5.1.39/mysql-connector-java-5.1.39-bin.jar") >>> import com.mysql *sys-package-mgr*: can't write cache file for '/home/andrew/code/java/mysql-connector-java-5.1.39/mysql-connector-java-5.1.39-bin.jar' *sys-package-mgr*: can't write index file >>> dir(com.mysql) ['__name__', 'fabric', 'jdbc'] >>> import java.util.zip >>> dir(java.util.zip) ['Adler32', 'CRC32', 'CheckedInputStream', 'CheckedOutputStream', 'Checksum', 'DataFormatException', 'Deflater', 'DeflaterInputStream', 'DeflaterOutputStream', 'GZIPInputStream', 'GZIPOutputStream', 'Inflater', 'InflaterInputStream', 'InflaterOutputStream', 'ZipEntry', 'ZipError', 'ZipException', 'ZipFile', 'ZipInputStream', 'ZipOutputStream', '__name__'] >>> dir(java.util.zip.ZipInputStream) ['__class__', '__copy__', '__deepcopy__', '__delattr__', '__doc__', '__ensure_finalizer__', '__eq__', '__format__', '__getattribute__', '__hash__', '__init__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', '__subclasshook__', '__unicode__', 'available', 'class', 'close', 'closeEntry', 'equals', 'getClass', 'getNextEntry', 'hashCode', 'mark', 'markSupported', 'nextEntry', 'notify', 'notifyAll', 'read', 'reset', 'skip', 'toString', 'wait'] Jython 查找Jar和类的方法: python.packages.paths python.packages.directories java.class.path java.ext.dirs python.cachedir.skip pycimport把python字节码转换成java字节码。Jython导入java包可能有多个包合并。 >>> import sys >>> sys.path_hooks [<type 'org.python.core.JavaImporter'>, <type 'zipimport.zipimporter'>, <type 'ClasspathPyImporter'>] import pycimport 数据类型 Jython特定的collection,多用于给java传递数据。 # Import and use a Java ArrayList >>> import java.util.ArrayList as ArrayList >>> arr = ArrayList() # Add method will add an element to the list and return a boolean to signify successsful addition >>> arr.add(1) True >>> arr.add(2) True >>> print arr [1, 2] 比较老的Jarray,不推荐使用,不过可以创建空数组: 类型: Character Java Equivalent z boolean b byte c char d Double f Float h Short i Int l Long >>> my_seq = (1,2,3,4,5) >>> from jarray import array >>> array(my_seq,'i') array('i', [1, 2, 3, 4, 5]) >>> myStr = "Hello Jython" >>> array(myStr,'c') array('c', 'Hello Jython') >>> arr = zeros(10,'z') >>> arr array('z', [False, False, False, False, False, False, False, False, False, False]) >>> arr2 = zeros(6, 'i') >>> arr2 array('i', [0, 0, 0, 0, 0, 0]) 求素数 `>>> ``nums = range(2, 50) ` `>>> ``for i in range(2, 8): ` `... `` nums = filter(lambda x: x == i or x % i, nums)` `... ` `>>> ``print nums` 读取输入: <pre># Obtain a value from the command line and store it into a variable >>> import sys >>> fav_team = sys.stdin.readline() Cubs >>> sys.stdout.write("My favorite team is: %s" % fav_team) My favorite team is: Cubs</pre> 函数 协程: **def** search_file(filename): **print** 'Searching file *%s*' % (filename) my_file = open(filename, 'r') file_content = my_file.read() my_file.close() **while** True: search_text = (**yield**) search_result = file_content.count(search_text) **print** 'Number of matches: *%d*' % (search_result)</pre> Jython脚本编程基础 os.chdir不会改变jvm的启动目录。 >>> import os >>> os.getcwd() '/Users/frank/Desktop/frank/hg/jythonbook~jython-book/src/chapter8' >>> from java.io import File >>> f = File(".") >>> for x in f.list(): ... print x ... args.py search.py >>> os.chdir("/Users/frank") >>> os.getcwd() '/Users/frank' >>> os.listdir(".") ['Desktop', 'Documents', 'Downloads', 'Dropbox', 'Library', 'Movies', 'Music', 'Pictures', 'Public', 'Sites'] >>> g = File(".") >>> for x in g.list(): ... print x ... args.py search.py 编译代码 !/usr/local/jython2.7.0/bin/jython from javax.tools import (ForwardingJavaFileManager, ToolProvider, DiagnosticCollector,)names = ["/home/andrew/code/python/jythonbook/src/chapter8/HelloWorld.java"]compiler = ToolProvider.getSystemJavaCompiler()diagnostics = DiagnosticCollector()manager = compiler.getStandardFileManager(diagnostics, None, None)units = manager.getJavaFileObjectsFromStrings(names)comp_task = compiler.getTask(None, manager, diagnostics, None, None, units)success = comp_task.call()manager.close() import osimport sysimport glob from javax.tools import (forwardingjavafilemanager, toolprovider, diagnosticcollector,) tasks = {} def task(func): tasks[func.func_name] = func @taskdef clean(): files = glob.glob("\*.class") **for** file **in** files: os.unlink(file) @taskdef compile(): files = glob.glob("\*.java") _log("compiling *%s*" % files) **if** **not** _compile(files): quit() _log("compiled") def _log(message): **if** options.verbose: **print** message def _compile(names): compiler = toolprovider.getsystemjavacompiler() diagnostics = diagnosticcollector() manager = compiler.getstandardfilemanager(diagnostics, none, none) units = manager.getjavafileobjectsfromstrings(names) comp_task = compiler.gettask(none, manager, diagnostics, none, none, units) success = comp_task.call() manager.close() **return** success if name == '__main__': **from** **optparse** **import** optionparser parser = optionparser() parser.add_option("-q", "--quiet", action="store_false", dest="verbose", default=true, help="don't print out task messages.") parser.add_option("-p", "--projecthelp", action="store_true", dest="projecthelp", help="print out list of tasks.") (options, args) = parser.parse_args() **if** options.projecthelp: **for** task **in** tasks: **print** task sys.exit(0) **if** len(args) < 1: **print** "usage: jython builder.py [options] task" sys.exit(1) **try**: current = tasks[args[0]] **except** KeyError: **print** "task *%s* not defined." % args[0] sys.exit(1) current()</pre> public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World"); } } [frank@pacman chapter8]$ jython builder.py --helpUsage: builder.py [options] Options: -h, --help show this help message and exit -q, --quiet Don't print out task messages. -p, --projecthelp Print out list of tasks. [frank@pacman chapter8]$ jython builder.py --projecthelpcompileclean[frank@pacman chapter8]$ jython builder.py compilecompiling ['HelloWorld.java']compiled[frank@pacman chapter8]$ lsHelloWorld.java HelloWorld.class builder.py[frank@pacman chapter8]$ jython builder.py clean[frank@pacman chapter8]$ lsHelloWorld.java builder.py[frank@pacman chapter8]$ jython builder.py --quiet compile[frank@pacman chapter8]$ lsHelloWorld.class HelloWorld.java builder.py[frank@pacman chapter8]$

优秀的个人博客,低调大师

[雪峰磁针石博客]multi-mechanize性能测试工具

Multi-Mechanize简介 Multi-Mechanize 是一个开源的性能和负载测试框架,它并发运行多个 Python 脚本对网站或者服务生成负载(组合事务)。测试输出报告保存为HTML或JMeter的兼容的XML。Multi-Mechanize最常用于web性能 和可扩展性(scalability)测试,也适用于任何python可以访问的API。尤其适合后台性能测试。稍微懂点编程的话,这个工具会远强过商业 的性能测试工具。 主要特性: 支持各种 HTTP methods 高级超链接和HTML表单支持 支持 SSL 自动处理 Cookies 可设置HTTP头 自动处理重定向 支持代理 支持 HTTP 认证 图片.png 安装 使 用标准的python安装方式。注意,需要安装matplotlib以支持作图,在centos6下面可以这样安装yum -y install python27-matplotlib。multi-mechanize采用标准的python安装方式pip install multi-mechanize或者easy_install multi-mechanize这里都以linux(centos)为例。 centos 5 安装注意: 注意安装依赖: python26 python26-devel python26-numpy* python26-tornado 要EPEL支持: http://dl.fedoraproject.org/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm 快速入门 创建项目 # multimech-newproject my_project 执行项目 # multimech-run my_project user_groups: 2 threads: 6 [================100%==================] 30s/30s transactions: 119 timers: 119 errors: 0 waiting for all requests to finish... analyzing results... transactions: 125 errors: 0 test start: 2013-09-13 11:47:47 test finish: 2013-09-13 11:48:16 created: ./my_project/results/results_2013.09.13_11.47.46/results.html done. 如果有出现figure没有定义,请在相关文件的头部从matplotlib导入。 测试结果参见: image.png 图片.png 图片.png 目录结构 每个测试项目包含以下内容: config.cfg的配置文件。用于设定测试选项。 test_scripts/虚拟用户脚本的目录。在这里添加您的测试脚本。 results/:结果存储目录。对于每个测试都声称一个时间戳目录,里面包含结果的报告。 multimech-newproject,默认生成一个随机数的脚本。脚本v_user.py如下: import randomimport timeclass Transaction(object): def __init__(self): pass def run(self): r = random.uniform(1, 2) time.sleep(r) self.custom_timers['Example_Timer'] = rif __name__ == '__main__': trans = Transaction() trans.run() print trans.custom_timers 配置参数的含义如下: run_time: duration of test (seconds) 测试的执行时间 rampup: duration of user rampup (seconds) 多少秒内发完请求 results_ts_interval: time series interval for results analysis (seconds) 结果分析时间 progress_bar: turn on/off console progress bar during test run 是否显示进度条 console_logging: turn on/off logging to stdout 是否输出到stdout xml_report: turn on/off xml/jtl report 是否生成xml报告。 results_database: database connection string (optional) 保存结果的数据库连接字符串(可选) post_run_script: hook to call a script at test completion (optional) 调用的善后脚本(可选) 更多介绍参见: http://testutils.org/multi-mechanize/configfile.html 脚本书写 用Python书写,测试脚本模拟虚拟用户对网站/服务/ API的请求,脚本定义了用户事务,更多内容参见脚本手册:http://testutils.org/multi-mechanize/scripts.html#scripts-label。 每个脚本必须实现一个Transaction()类。这个类必须实现一个run()方法。基本的测试脚本结构如下: class Transaction(object): def run(self): # do something here return 运行期间,Transaction()实例化一次,run()方法则反复调用: class Transaction(object): def __init__(self): # do per-user user setup here # this gets called once on user creation return def run(self): # do user actions here # this gets called repeatedly return 从结构上看,如果每次run如果需要setup和teardown,时间也会计算在run里面,会显得事务处理的时间更长。这个就需要使用定时器来精确计时。 另外脚本建议先调试之后在运行,因为Multi-Mechanize有可能报错不够精准。可以这样运行:# python v_suds.py。v_suds.py是你实际使用的脚本名。另外suds这个库好像实现时性能一般,并发200时,客户端cpu占用率经常会100%,为此web service如果要上大量用户的话,建议用其他库替代,比如soapPy。进一步提升效率可以试用python的ctypes模块,或者cython(性能接近c语言)。不过Multi-Mechanize的多进程是基于python的,实在对性能有相当高的要求,就只能全部用c书写了。 下例使用mechanize进行web测试。 class Transaction(object): def __init__(self): pass def run(self): br = mechanize.Browser() br.set_handle_robots(False) resp = br.open('http://192.168.4.13/env.htm') assert (resp.code == 200), 'Bad Response: HTTP %s' % resp.codes assert ('service name' in resp.get_data()) 下面用httplib库重写脚本,并增加定时器。通过定时器,可以分析各个步骤的耗时。 import httplib import time class Transaction(object): def run(self): conn = httplib.HTTPConnection('192.168.4.13') start = time.time() conn.request('GET', '/env.htm') request_time = time.time() resp = conn.getresponse() response_time = time.time() conn.close() transfer_time = time.time() self.custom_timers['request sent'] = request_time - start self.custom_timers['response received'] = response_time - start self.custom_timers['content transferred'] = transfer_time - start assert (resp.status == 200), 'Bad Response: HTTP %s' % resp.status if __name__ == '__main__': trans = Transaction() trans.run() for timer in ('request sent', 'response received', 'content transferred'): print '%s: %.5f secs' % (timer, trans.custom_timers[timer]) http://testutils.org/multi-mechanize/scripts.html#scripts-label 还有更多的实例。 import mechanize import time class Transaction(object): def __init__(self): pass def run(self): # create a Browser instance br = mechanize.Browser() # don't bother with robots.txt br.set_handle_robots(False) # add a custom header so wikipedia allows our requests br.addheaders = [('User-agent', 'Mozilla/5.0 Compatible')] # start the timer start_timer = time.time() # submit the request resp = br.open('http://www.wikipedia.org/') resp.read() # stop the timer latency = time.time() - start_timer # store the custom timer self.custom_timers['Load_Front_Page'] = latency # verify responses are valid assert (resp.code == 200), 'Bad Response: HTTP %s' % resp.code assert ('Wikipedia, the free encyclopedia' in resp.get_data()) # think-time time.sleep(2) # select first (zero-based) form on page br.select_form(nr=0) # set form field br.form['search'] = 'foo' # start the timer start_timer = time.time() # submit the form resp = br.submit() resp.read() # stop the timer latency = time.time() - start_timer # store the custom timer self.custom_timers['Search'] = latency # verify responses are valid assert (resp.code == 200), 'Bad Response: HTTP %s' % resp.code assert ('foobar' in resp.get_data()), 'Text Assertion Failed' # think-time time.sleep(2) import urllib2 import time class Transaction(object): def run(self): start_timer = time.time() resp = urllib2.urlopen('http://www.example.com/') content = resp.read() latency = time.time() - start_timer self.custom_timers['Example_Homepage'] = latency assert (resp.code == 200), 'Bad Response: HTTP %s' % resp.code assert ('Example Web Page' in content), 'Text Assertion Failed' import urllib2 import time class Transaction(object): def __init__(self): self.custom_timers = {} with open('soap.xml') as f: self.soap_body = f.read() def run(self): req = urllib2.Request(url='http://www.foo.com/service', data=self.soap_body) req.add_header('Content-Type', 'application/soap+xml') req.add_header('SOAPAction', 'http://www.foo.com/action') start_timer = time.time() resp = urllib2.urlopen(req) content = resp.read() latency = time.time() - start_timer self.custom_timers['Example_SOAP_Msg'] = latency assert (resp.code == 200), 'Bad Response: HTTP %s' % resp.code assert ('Example SOAP Response' in content), 'Text Assertion Failed' 参考资料 本文涉及的python测试开发库 谢谢点赞! * 讨论 钉钉免费群21745728 qq群144081101 567351477 本文相关海量书籍下载 https://pypi.python.org/pypi/multi-mechanize/1.2.0 http://testutils.org/multi-mechanize

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册