for %%I in (*.jar)do ( echo --unzipping %%~nI 7z x %%I -o%%~nI ) pause
Category Archives: DevOps
Win7调试服务程序,Debugbreak函数不响应,直接退出
上周调试Win7下的一个服务程序,以前都是用Debugbreak()直接可以进入调试的,但这次直接退出了。
查了一下,这样设置一下就可以:
控制面板->操作中心->维护->检查问题报告的解决方案->设置
每次发生问题时,在检查解决方案之前先询问我
保存设置后,就可以进入断点了,再次鄙视微软。
后来,又发现,即使设置后,仍然无法响应断点,没办法,只好用比较挫的代码搞定了:
//在第一个DebugBreak()前面,添加下面的语句
while(!IsDebuggerPresent())
{
Sleep(100);
}
DebugBreak();
这样,服务启动后,会一直等待调试器。启动服务后,手动通过VS、任务管理器或Process Explorer附加到进程,就可以对启动的服务进行调试了。
诡异的dll(2)
还是昨天,还是同一个哥们。他要实现一个语音叫号的功能,要先普通话叫号,然后再粤语叫号。
诡异的事情发生了,在调试状态下,怎么运行都是正常的,
但直接双击运行,只能叫第一种声音(粤语或普通话),另一个声音(粤语或普通话)怎么都发不出来。
悲剧的是,他语音叫号也是调用了一个dll。
只好慢慢调试了,开始以为是线程退出的太快,或者变量作用域问题,或变量中繁体中文乱码问题,或者函数退出太快,或者是release时优化掉了…
弄了一个多小时,没有任何进展。无奈之下,我翻出了Process Explorer,去查看环境变量。
结果调试的时候,第一个环境变量是
__COMPAT_LAYER=WinXpsp3
天啊,这不是兼容模式吗。
于是将exe设成兼容模式,双击运行,就好了。
原来,他用BCB6做开发,在Win7 sp1上无法正常运行,就设成了兼容模式,调试时运行的exe当然也继承了兼容模式的环境变量咯。
吐血啊……
回家,搜了一下__COMPAT_LAYER环境变量,可以设置为以下数值:
兼容性:
| 值 | 兼容模式 |
| WIN95 | Windows 95 |
| WIN98 | Windows 98 / Windows Me |
| NT4SP5 | Windows NT 4.0 (Service Pack 5) |
| WIN2000 | Windows 2000 |
| WINXP | Windows XP |
| WINXPSP2 | Windows XP (Service Pack 2) |
| WINXPSP3 | Windows XP (Service Pack 3) |
| WINSRV03SP1 | Windows Server 2003 (Service Pack 1) |
| WINSRV08SP1 | Windows Server 2008 (Service Pack 1) |
| VISTARTM | Windows Vista |
| VISTASP1 | Windows Vista (Service Pack 1) |
| VISTASP2 | Windows Vista (Service Pack 2) |
| WIN7RTM | Windows 7 |
权限:
| 值 | 权限 |
| RUNASADMIN | 以管理员权限运行 |
| RUNASINVOKER | 以调用者权限运行 |
显示模式:
| 值 | 显示模式 |
| DISABLETHEMES | 禁用视觉主题 |
| 640X480 | 用640×480屏幕分辨率运行 |
| HIGHDPIAWARE | 高DPI设置时禁用显示缩放 |
| 256COLOR | 用256色运行 |
| DISABLEDWM | 禁用桌面元素 |
另外,也可以通过注册表,设置程序的兼容模式:
Windows Registry Editor Version 5.00 [HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers] "D:\\TEST\\Hello.exe"="WINXPSP3"
HKEY hKey;
LPCTSTR strSubKey = "Software\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Layers";
long lRet = ::RegOpenKeyEx( HKEY_CURRENT_USER, strSubKey, 0, KEY_WRITE, &hKey );
if ( lRet == ERROR_SUCCESS )
{
TCHAR achValue[] = { _T("WINXPSP3") };
CString strExePath = _T("D:\\Test\\Hello.exe");
lRet = ::RegSetValueEx( hKey, strExePath, NULL, REG_SZ, (LPBYTE)&achValue, sizeof(achValue) );
RegCloseKey( hKey );
}
诡异的dll(1)
昨天,和哥们一起调试程序。由于上线压力较大,他最近一直在狂改程序,但遇到了一个问题:
从PACS Server取影像时,怎么都取不回来。
首先排查了PACS Server设置,发现稍微有些问题,修改配置后,我以前写的一个测试程序,
就可以正常取回影像了。
但诡异的事情发生了,我写的程序,可以查,可以取,但他写的就是无法取回影像,只能查询。
吐血啊。
经过了一个小时的奋战,实在发现不了问题,他决定把无线网卡禁用后再测一下,
结果就通了~~
原来他取影像用的是一个dll,估计这个dll中,启用监听的时候,会自动选用某一块网卡,
但刚好选了无线网卡,悲剧啊。
能不能不要自作主张选网卡啊~~
能不能调试的时候,先把不需要的网卡禁用了啊~~
Tomcat强制使用HTTPS
配置好Tomcat的SSL后,强制使用HTTPS方法如下:
1、全局强制HTTPS
修改%tomcat_home%\conf\web.xml,在文件底部,后面加上这样一段:
<login-config>
<!-- Authorization setting for SSL -->
<auth-method>CLIENT-CERT</auth-method>
<realm-name>Client Cert Users-only Area</realm-name>
</login-config>
<security-constraint>
<!-- Authorization setting for SSL -->
<web-resource-collection >
<web-resource-name >SSL</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
2、某个webapp强制使用HTTPS
编辑该webapp的web.xml文件,增加以下内容:
<security-constraint> <web-resource-collection> <web-resource-name>securedapp</web-resource-name> <url-pattern>/*</url-pattern> </web-resource-collection> <user-data-constraint> <transport-guarantee>CONFIDENTIAL</transport-guarantee> </user-data-constraint> </security-constraint>
关闭 SSL,只需要将CONFIDENTIAL改为NONE即可。
查询视图时不使用索引
今天发生了一件很诡异的事情,平台网关有一张对外提供的视图,用某字段进行查询时,效率奇低无比。
--view select * from user1.view1 v1 where v1.mark='mark001'; --table select * from user1.table1 t1 where t1.mark='mark001';
分析视图对应的表信息后发现,虽然对mark字段建立了索引,但查询语句中使用的mark字段值“mark001”,
所占比例竟然已经达到40%,应该是历史数据导致的。
然后将历史数据处理后,重建mark字段索引,诡异的事情发生了:
即使mark字段值“mark001”的比例小于0.1%,查询依然不走索引。
重建索引无效,就差重新建表了,压力山大啊。
最后,休息了一下,抱着试试看的态度,重新分析了表table1:
analyze table user1.table1 compute statistics for table for all indexes for all indexed columns;
查询终于走索引了,速度立刻上去了。
这才记起来,前几天,按某人的建议,把oracle的统计信息关掉了。。。
自己挖坑把自己埋了。。。
四个小时啊。。。
我的考评还没来得及写,还有十几封邮件要写,悲剧啊~~
我恨某潘~~
VirtualBox修改硬盘guid及类型转换
1、修改硬盘GUID
"VBoxManage.exe" internalcommands sethduuid "PATH_TO_VID/XXX.vdi"
2、VMDK转VDI
"VBoxManage.exe" clonehd "PATH_TO_VMDK\source.vmdk" "PATH_TO_VID\target.vdi" --format VDI
2、VDI转VMDK
"VBoxManage.exe" clonehd "PATH_TO_VID\source.vdi" "PATH_TO_VMDK\target.vmdk" --format VMDK
VirtualBox从U盘启动
默认情况下,Virtualbox从无法从U盘启动的。
但可以用变通的方法,将宿主机的U盘,模拟为一个虚拟盘,从虚拟盘进行启动。
1、首先产看本地硬盘信息
运行diskmgmt.msc
查看U盘是第几个驱动器,比如我的是第2个驱动器(编号从0开始,0,1,2这样)
2、将U盘模拟为一个虚拟盘
VBoxManage internalcommands createrawvmdk -filename D:\VirtualMashines\VirtualBox\WinXP\usbdisk.vmdk -rawdisk \\.\PhysicalDrive2
3、虚拟机中,添加该虚拟盘
4、启动,按F12,选择虚拟盘启动。
VirtualBox扩展及压缩虚拟磁盘
1、首先定位各虚拟磁盘的UUID
C:\ProgramerTools\Oracle\VirtualBox>VBoxManage.exe list hdds UUID: b806ffa9-ea8e-4059-9dd8-2d246e850ab6 Parent UUID: base State: created Type: normal (base) Location: D:\VirtualMashines\VirtualBox\WinXP\WinXP.vdi Storage format: VDI Capacity: 10240 MBytes UUID: 945de0c8-f928-44ad-ae39-9a12a71568ef Parent UUID: base State: created Type: normal (base) Location: D:\VirtualMashines\VirtualBox\Debian8\Debian8.vdi Storage format: VDI Capacity: 20480 MBytes UUID: e49d8a88-d68b-43b8-954e-2be419933e08 Parent UUID: base State: created Type: normal (base) Location: D:\VirtualMashines\VirtualBox\Docker\Debian8Docker\Debian8Docker .vdi Storage format: VDI Capacity: 20480 MBytes UUID: eab29989-ce9c-4491-8dd0-2190ed3029d6 Parent UUID: base State: created Type: normal (base) Location: D:\VirtualMashines\VirtualBox\FreeBSD10\FreeBSD10.vdi Storage format: VDI Capacity: 20480 MBytes UUID: 74bcd43e-a315-437e-9b4f-895051ff8433 Parent UUID: base State: created Type: normal (base) Location: D:\VirtualMashines\VirtualBox\FreeBSD10\FreeBSD10A01.vdi Storage format: VDI Capacity: 20480 MBytes
2、扩展WinXP虚拟磁盘
2.1我的xp虚拟机一共只有10G,我需要扩展到20G(要关虚拟机)
C:\ProgramerTools\Oracle\VirtualBox>VBoxManage modifyhd b806ffa9-ea8e-4059-9dd8- 2d246e850ab6 --resize 20480 0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
2.2扩展后,开启虚拟机,自己到磁盘管理器中分配空间即可。
3、扩展Debian虚拟磁盘
3.1我的Debian8Docker虚拟机一共只有20G,我需要扩展到30G(要关虚拟机)
C:\ProgramerTools\Oracle\VirtualBox>VBoxManage modifyhd e49d8a88-d68b-43b8-954e- 2be419933e08 --resize 30720 0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
3.2扩展后,开启虚拟机,使用gparted等工具分配空间即可。
需要提前unmount分区,如果是调整扩展分区,需要umount该扩展分区下的所有挂载点。
4、压缩WinXP虚拟磁盘
4.1需要到微软官网下载sdelete工具,然后在虚拟机中运行:
sdelete -z
4.2关闭虚拟机,运行:
VBoxManage modifyhd b806ffa9-ea8e-4059-9dd8-2d246e850ab6 --compact
5、压缩Debian虚拟磁盘:
5.1A在虚拟机中运行zerofree命令,需要将分区挂载为只读模式
apt-get install zerofree cd / umount /home zerofree /dev/sda6
5.1B在虚拟机中运行dd命令,需要将分区挂载为读写模式
dd if=/dev/zero of=/bigemptyfile rm bigemptyfile
5.2关闭虚拟机,运行:
VBoxManage modifyhd 945de0c8-f928-44ad-ae39-9a12a71568ef --compact
6、压缩FreeBSD虚拟磁盘:
6.1A在虚拟机中运行dd命令,需要将分区挂载为读写模式
dd if=/dev/zero of=bigemptyfile bs=1m rm bigemptyfile
6.1B在虚拟机中运行dd命令,需要将分区挂载为读写模式(适用于影片空闲空间较小)
cat /dev/zero > bigemptyfile;sync;sleep 1;sync; rm -f bigemptyfile
6.2关闭虚拟机,运行:
VBoxManage modifyhd eab29989-ce9c-4491-8dd0-2190ed3029d6 --compact VBoxManage modifyhd 74bcd43e-a315-437e-9b4f-895051ff8433 --compact
Windows网络地址无法访问
最近遇到了Windows网络地址无法访问的问题,总结了一下,解决步骤如下:
表现为:
用localhost可以访问本机共享地址
但用网卡ip就不可以访问
1、开启对应的服务(Services.msc)
TCP/IP NetBios Helper
Computer Browser
Workstation
Server
2、网卡
对应的网卡-》Properties
启用Internet Protoclo Version 4
启用File and Printer Sharing for Microsoft Networks
对应的网卡-》Properties-》Networking-》Internet Protoclo Version 4-》Properties-》General->Advanced->WINS->NetBIOS Setting->Enable NetBIOS over TCP/IP
3、共享设置
控制面板Network and Sharing Center
-》Advanced sharing settings
-》(Home or Work/Public)
Trun on network discovery
Turn on file and printer sharing
Turn off Public folder sharing
Use 128-bit encryptiong to help …
Turn on password protected sharing…
4、防火墙
先关闭,尝试是否可以联通
如果可以通过的话,允许网络共享就可以解决问题
5、查看组策略,看下是否有端口禁用配置
如果有的话,禁用该策略
6、如果还不行,还原网卡配置
netsh interface ip reset log.txt
重启,会丢失全部网卡配置信息