使用正则表达式校验svn日志

by kevin 31. 八月 2019 20:08 >
最近想要对svn提交的日志进行管理。 考虑到使用bat命令进行正则校验感觉比较麻烦,而且灵活性也不好,所以选择python来实现。   首先添加svn钩子pre-submit 1: Setlocal 2: set sd=D:\Repositories\hooks 3: set py="D:\Program Files\Python37\python" %sd%\pre-commit.py %1 %2 4: for /F %%i in ('%py%') do (set r=%%i) 5: echo %r% 1>&2 6: if %r%==1 ( 7: exit 1 8: ) else ( 9: exit 0 10: ) 11: Endlocal     上面的代码调用了pre-commit.py,具体代码如下 1: import sys, os, re 2:  3: if(len(sys.argv)<3): 4: print(1) 5: exit() 6:  7: repos = sys.argv[1] 8: txn = sys.argv[2] 9: svnserver = os.environ["VISUALSVN_SERVER"] 10: svnlook = "\"" + svnserver + "bin\\svnlook.exe" + "\"" 11: logcmd = ("\"{0}bin\\svnlook.exe\" log \"{1}\" -t \"{2}\"").format(svnserver, repos , txn) 12: loghandler = os.popen(logcmd) 13: log = loghandler.read() 14: loghandler.close() 15: if(not log): 16: print(1) 17: exit() 18:  19: mr = re.match("^\\d+\\s.*", log) 20: if(mr == None): 21: print(1) 22: else: 23: print(0) 24: exit()

svn日志查看的几个经验

by kevin 17. 八月 2019 11:15 >
最近使用svn碰到的一些情况,记录一下。 说明一下: 服务的:VisualSVN-Server 客户端:TortoiseSVN 1. 高版本客户端提交的日志,低版本的客户端查看不了。 svn客户端升级之后,最好还是svn clear一下。 2. 高版本的客户端提交的日志导致低版本服务端的钩子无法正常运行。 大概的原因是,高版本的客户端提交的日志可能包含一些分隔符(比如换行符),导致服务端无法正常调用钩子。

无法复制网页上的文字

by kevin 18. 三月 2019 18:42 >
最近,碰到一些网页屏蔽了复制功能。写个简单的解决办法。 1. 下载google浏览器(或者360极速浏览器) 2. 再网页上点击鼠标右键,点击弹出菜单中的“检查”     3.在下图左边的小窗口中,找到body,点击body;在右边的小窗口中,找到-webkit-user-select 把前面的勾去掉。

.net 如何修改config文件

by kevin 25. 十月 2018 11:31 >
string appConfigFile = Assembly.GetEntryAssembly().Location; Configuration appConfig = ConfigurationManager.OpenExeConfiguration(appConfigFile); AppSettingsSection appSettings = (AppSettingsSection)appConfig.GetSection("appSettings"); var config = UploadConfig; appSettings.Settings["KEY"].Value = "VALUE"; appConfig.Save(); ConfigurationManager.RefreshSection("appSettings"); 留一份代码,只是为了以后使用ctrl+C、ctrl+V大法。

开发杂记-Oracle学习

by kevin 25. 五月 2017 17:49 >
在Oracle 11g 中默认的profile启用了密码过期时间是180天。 Oracle中如何查看客户端的IP? 缺省从 v$session 中不能直接获得客户端 IP,可以在数据库中创建一个追踪客户端IP地址的触发器: create or replace trigger on_logon_trigger after logon on database begin dbms_application_info.set_client_info(sys_context('userenv', 'ip_address')); end; 常用的显示客户端信息的sql: select v.USERNAME, v.STATUS, v.SCHEMANAME, v.OSUSER, v.PORT, v.TERMINAL, v.PROGRAM, v.TYPE, v.MACHINE, v.CLIENT_INFO from v$session v order by v.MACHINE,v.TERMINAL; 综合v$process和v$session查看连接情况 Oracle常用的包引用 https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/toc.htm

windows下用netstat查看系统端口使用情况

by kevin 21. 九月 2016 23:08 >
首先,看看netstat 都有什么选项  1: C:\Users\Administrator>netstat -help 2:   3: 显示协议统计和当前 TCP/IP 网络连接。 4:   5: NETSTAT [-a] [-b] [-e] [-f] [-n] [-o] [-p proto] [-r] [-s] [-t] [interval] 6:   7: -a 显示所有连接和侦听端口。 8: -b 显示在创建每个连接或侦听端口时涉及的可执行程序。 9: 在某些情况下,已知可执行程序承载多个独立的 10: 组件,这些情况下,显示创建连接或侦听端口时涉 11: 及的组件序列。此情况下,可执行程序的名称 12: 位于底部[]中,它调用的组件位于顶部,直至达 13: 到 TCP/IP。注意,此选项可能很耗时,并且在您没有 14: 足够权限时可能失败。 15: -e 显示以太网统计。此选项可以与 -s 选项结合使用。 16: -f 显示外部地址的完全限定域名(FQDN)。 17: -n 以数字形式显示地址和端口号。 18: -o 显示拥有的与每个连接关联的进程 ID。 19: -p proto 显示 proto 指定的协议的连接;proto 可以是下列任 20: 何一个: TCP、UDP、TCPv6 或 UDPv6。如果与 -s 选 21: 项一起用来显示每个协议的统计,proto 可以是下列任 22: 何一个: IP、IPv6、ICMP、ICMPv6、TCP、TCPv6、UDP 23: 或 UDPv6。 24: -r 显示路由表。 25: -s 显示每个协议的统计。默认情况下,显示 26: IP、IPv6、ICMP、ICMPv6、TCP、TCPv6、UDP 和 UDPv6 27: 的统计;-p 选项可用于指定默认的子网。 28: -t 显示当前连接卸载状态。 29: interval 重新显示选定的统计,各个显示间暂停的间隔秒数。 30: 按 CTRL+C 停止重新显示统计。如果省略,则 netstat 31: 将打印当前的配置信息一次。 .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } 查看一个端口被哪个进程占用 C:\Users\Administrator>netstat -ano|findstr 800 TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 1392 TCP [::]:8080 [::]:0 LISTENING 1392 .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } 查看都有哪些程序使用了哪些端口 C:\Users\Administrator>netstat –abn 活动连接   协议  本地地址          外部地址        状态   TCP    0.0.0.0:80             0.0.0.0:0              LISTENING 无法获取所有权信息   TCP    0.0.0.0:135            0.0.0.0:0              LISTENING   RpcSs [svchost.exe]   TCP    0.0.0.0:445            0.0.0.0:0              LISTENING 无法获取所有权信息   TCP    0.0.0.0:554            0.0.0.0:0              LISTENING [wmpnetwk.exe] .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }

SQL Server 2008 导出/还原/兼容到 SQL Server 2005、2000

by kevin 14. 八月 2016 14:52 >
之前我们要将一个表中的数据导出为脚本,那么只有在网上找一个导出数据的Script,然后运行就可以导出数据脚本了。现在在SQL Server 2008的Management Studio中增加了一个新特性,除了导出表的定义外,还支持将表中的数据导出为脚本。导出过程: 在SSMS2008(SQL Server Management Studio 2008)中的对象资源管理器中,右击需要导出数据的数据库,在弹出式菜单中选择“任务”下的“生成脚本”选项。 在脚本向导的选择脚本选项中,有以下重要选项可以选择: “编写数据的脚本”:是否导出数据库中的表数据。 “包含 If Not Exists”:此选项可以删除数据库中已存在的同名的数据库对象。 “编写创建数据库的脚本”:是否产生 Create Database 的SQL 脚本 “为服务器版本编写脚本”:选择要执行脚本的数据库版本。 然后下一步选择导出的对象,选择导出的表,最后完成时即可以看到由系统导出的表定义和表数据了。 1)另外有两个地方要注意。 一、CREATE DATABASE [DBNAME] (如果选择了“编写创建数据库的脚本”选项) 和 USE [DATABASE] 。 二、改数据库架构,一般本地是用dbo,所以按Ctrl+F键,选择替换窗口,把 dbo 替换成 [YOUR_SCHEMA] 至此脚本改造完成。 2)但是在实际的操作中,如果从08导出到低版本的sql中可能会有很多兼容性的问题,因此向低级版本导出脚本的时候 在“选择数据库”中,可以不勾选“为所选数据库中的所有对象编写脚本”复选框 在“选择脚本选项”中,注意把“为服务器版本编写脚本”中选择导出的数据库版本(2000,2005,2008) 3)导出的脚本如何很大,无法直接在SQL Server Management Studio直接打开运行,使用 sqlcmd 运行 Transact-SQL 脚本文件 (sqlcmd工具)。 运行脚本文件 打开命令提示符窗口。 在命令提示符窗口中,键入 sqlcmd -S myServer\instanceName -i C:\myScript.sql 按 Enter 键。 将此输出保存到文本文件中 打开命令提示符窗口。 在命令提示符窗口中,键入 sqlcmd -S myServer\instanceName -i C:\myScript.sql -o C:\EmpAdds.txt 按 Enter 键。

在Ajax响应之后打开新窗口(标签)

by kevin 3. 八月 2016 14:17 >
最近的开发中有一个功能,点击一个链接之后,要判断当前的用户是否登录,没有登录的话,需要弹出一个登录对话框,用户登录之后,再在新的窗口(标签)中打开链接指向的Url。 不多说,直接贴出代码: $(document).delegate("a", "click", function () { var actionUrl = $(this).attr("href"); var ssoAction = function () { window.open(actionUrl, '_blank'); }; if (isLogin()) { ssoAction(); } else { popup.show({login:function () { $.ajax({ type: "post", dataType: "json", url: "/Account/Login", data: $("frmLogin").serialize(), //发送方式改为同步,避免弹出页面被浏览器拦截 async: false, success: function (oData) { ssoAction(); } }); }); } return false; });   重点:需要使用同步提交,使用异步提交,callback里面打开新窗口(标签),会被浏览器认为是恶意行为。

SmtpClient发送邮件:An invalid character was found in the mail header

by kevin 8. 十月 2015 14:19 >
.net 4.0的环境下使用SmtpClient发送邮件,带有附件。碰到这个恶心的Exception System.FormatException: An invalid character was found in the mail header: 查了两天,终于解决了,是.Net自身的bug,据说后续版本是有解决的(估计.net 4.5以后)。 这里贴出解决方案: public static Attachment CreateAttachment(Stream attachmentFile, string displayName, string contentType, string attachmentFilePath) { var currentCulture = Thread.CurrentThread.CurrentCulture;//.net4.0 bug, var attachment = new Attachment(attachmentFile, displayName); try { Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; attachment.ContentType = new ContentType(contentType); attachment.ContentDisposition.CreationDate = File.GetCreationTime(attachmentFilePath); attachment.ContentDisposition.ModificationDate = File.GetLastWriteTime(attachmentFilePath); attachment.ContentDisposition.ReadDate = File.GetLastAccessTime(attachmentFilePath); attachment.TransferEncoding = TransferEncoding.Base64; attachment.NameEncoding = Encoding.UTF8; string encodedAttachmentName = Convert.ToBase64String(Encoding.UTF8.GetBytes(displayName)); encodedAttachmentName = SplitEncodedAttachmentName(encodedAttachmentName); attachment.Name = encodedAttachmentName; } finally { Thread.CurrentThread.CurrentCulture = currentCulture; } return attachment; } private static string SplitEncodedAttachmentName(string encoded) { const string encodingtoken = "=?UTF-8?B?"; const string softbreak = "?="; const int maxChunkLength = 30; int splitLength = maxChunkLength - encodingtoken.Length - (softbreak.Length * 2); IEnumerable<string> parts = SplitByLength(encoded, splitLength); string encodedAttachmentName = encodingtoken; foreach (var part in parts) { encodedAttachmentName += part + softbreak + encodingtoken; } encodedAttachmentName = encodedAttachmentName.Remove(encodedAttachmentName.Length - encodingtoken.Length, encodingtoken.Length); return encodedAttachmentName; } private static IEnumerable<string> SplitByLength(string stringToSplit, int length) { while (stringToSplit.Length > length) { yield return stringToSplit.Substring(0, length); stringToSplit = stringToSplit.Substring(length); } if (stringToSplit.Length > 0) { yield return stringToSplit; } } .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } 参考:https://support.microsoft.com/zh-cn/kb/2402064

开发杂记-烦心整理

by kevin 11. 十一月 2014 21:10 >
chown命令: 可以用来改变linux文件的所有者,用到这个,是因为交替使用ftp和winscp上传文件,而且使用了不同的用户,导致经常出现上传失败。 css的 line-height: 很多浏览器默认line-height的值是font-size的120%,也有是100%的,所有应该考虑reset一下。 php的日期比较: 过程化方法:date_diff 对象化方法:DateTimeObject->diff 这个没有.net那么舒服,有个TimeSpan,要获取相差多少天,多少秒的,真心麻烦。 直接上代码: 1: public static function datediff($dt_menor, $dt_maior, $str_interval, $relative=false) { 2: if (is_string($dt_menor)) 3: $dt_menor = date_create($dt_menor); 4: if (is_string($dt_maior)) 5: $dt_maior = date_create($dt_maior); 6:  7: $diff = date_diff($dt_menor, $dt_maior, !$relative); 8:  9: switch ($str_interval) { 10: case "y": 11: $total = $diff->y + $diff->m / 12 + $diff->d / 365.25; 12: break; 13: case "m": 14: $total = $diff->y * 12 + $diff->m + $diff->d / 30 + $diff->h / 24; 15: break; 16: case "d": 17: $total = $diff->y * 365.25 + $diff->m * 30 + $diff->d + $diff->h / 24 + $diff->i / 60; 18: break; 19: case "h": 20: $total = ($diff->y * 365.25 + $diff->m * 30 + $diff->d) * 24 + $diff->h + $diff->i / 60; 21: break; 22: case "i": 23: $total = (($diff->y * 365.25 + $diff->m * 30 + $diff->d) * 24 + $diff->h) * 60 + $diff->i + $diff->s / 60; 24: break; 25: case "s": 26: $total = ((($diff->y * 365.25 + $diff->m * 30 + $diff->d) * 24 + $diff->h) * 60 + $diff->i) * 60 + $diff->s; 27: break; 28: } 29: if ($diff->invert) 30: return -1 * $total; 31: else 32: return $total; 33: }