QString NMyUtils::getExeFullPathWithArgs() { QString exePath = QCoreApplication::applicationFilePath().replace("/","\\").replace("Reminder.exe","QTLoader.exe"); QString argPath = "\""+exePath+"\" TrayIcon"; qDebug()<<argPath; return argPath; } bool NMyUtils::isAutoStart() { QSettings reg("HKEY_LOCAL_MACHINE\\SOFTWARE\\MICROSOFT\\WINDOWS\\CURRENTVERSION\\RUN", QSettings::NativeFormat); QString val = reg.value("NReminder").toString(); if(val.length()>0) { return true; } else { return false; } } void NMyUtils::setAutoStart() { QSettings reg("HKEY_LOCAL_MACHINE\\SOFTWARE\\MICROSOFT\\WINDOWS\\CURRENTVERSION\\RUN", QSettings::NativeFormat); reg.setValue("NReminder",NMyUtils::getExeFullPathWithArgs()); } void NMyUtils::removeAutoStart() { QSettings reg("HKEY_LOCAL_MACHINE\\SOFTWARE\\MICROSOFT\\WINDOWS\\CURRENTVERSION\\RUN", QSettings::NativeFormat); reg.remove("NReminder"); }
Category Archives: DevOps
Winform多行标题TabControl
今天写示例程序的时候,遇到了需要多行标题TabControl的情况。
整体流程很简单,就是将标题拆分,然后根据行数和最大行宽设置每一Page标题的高度及宽度即可。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Collections; namespace UITabControlTest { public partial class SubForm : Form { private Dictionary<TabPage, TabPageInfo> allTabMap = new Dictionary<TabPage, TabPageInfo>(); public SubForm() { InitializeComponent(); tabMain.DrawMode = TabDrawMode.OwnerDrawFixed; } private void SubForm_Load(object sender, EventArgs e) { tabPage1.Text = "line1\nline2\nline3\nline4\nlin5"; tabPage2.Text = "line1\nline2\nline3\nline4"; tabPage3.Text = "line1\nline2\nline3"; tabPage4.Text = "line1\nline2"; int lineNum = 0; foreach (TabPage tab in this.tabMain.TabPages) { TabPageInfo pInfo = new TabPageInfo(tab.Text,"\n"); allTabMap.Add(tab, pInfo); lineNum = lineNum>pInfo.LineNum?lineNum:pInfo.LineNum; } foreach (TabPage tab in this.tabMain.TabPages) { TabPageInfo pInfo = allTabMap[tab]; tab.Text = pInfo.MaxLine; } //some thing is wrong, the font height is 14, the padding height is around 9, why? tabMain.Padding = new Point(0, Convert.ToInt32(tabMain.Font.Height * (lineNum - 1) * 0.65)); } private void tabMain_DrawItem(object sender, DrawItemEventArgs e) { TabControl tabControl = (TabControl)sender; TabPage currentTab = tabControl.TabPages[e.Index]; TabPageInfo info = allTabMap[currentTab]; string tabText = info.AllLine; StringFormat sf = new StringFormat(); sf.Alignment = StringAlignment.Center; sf.LineAlignment = StringAlignment.Center; RectangleF tabRect = (RectangleF)e.Bounds; RectangleF textRect = tabRect; if (e.Index == tabControl.SelectedIndex) { tabRect.Inflate(1, 1); } Graphics g = e.Graphics; g.Clip = new Region(tabRect); g.Clear(Control.DefaultBackColor); g.ResetClip(); g.DrawString(tabText, e.Font, SystemBrushes.ControlText, textRect, sf); } } class TabPageInfo { public int LineNum { get { return nLineNum; } } public String MaxLine { get { //prevent auto wrap return szMaxLine+" "; } } public String getLine(int index) { if (index < nLineNum) { return szLines[index]; } else { return ""; } } public String AllLine { get { return szAllLine; } } private int nLineNum = 0; private String[] szLines; private String szAllLine; private String szMaxLine; public TabPageInfo(String pageTitle, String splitString) { szAllLine = pageTitle.Replace(splitString, "\n"); String [] separators = new String[]{splitString}; szLines = pageTitle.Split(separators,StringSplitOptions.RemoveEmptyEntries); nLineNum = szLines.Length; int nMaxLineWidth = 0; foreach(String line in szLines) { if (nMaxLineWidth < line.Length) { nMaxLineWidth = line.Length; szMaxLine = line; } } } } }
如何配置域控
开始->运行
dcpromo
IIS开启程序集绑定日志
最近,将一个AnyCPU+Win32的程序,调整到了x64架构,但一直各种绑定失败。
IIS7一直提示要开启程序就绑定日志:
警告: 程序集绑定日志记录被关闭。 要启用程序集绑定失败日志记录,请将注册表值 [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD)设置为 1。 注意: 会有一些与程序集绑定失败日志记录关联的性能损失。 要关闭此功能,请移除注册表值 [HKLM\Software\Microsoft\Fusion!EnableLog]。
好吧,命令行搞定
reg add HKLM\software\microsoft\fusion /v Enablelog /t REG_DWORD /d 1
然后,IIS7仍然坚持不懈的提示绑定失败。提示dll格式不正确。
弄了一个多小时,发现应用程序池的“Enable 32-Bit Applications”选项打开了,晕死。
关闭之,搞定!!!
PS:
按网上的说法,Fuslogvw.exe可以查看绑定失败的日志。但我打开后没有哦,以后再试试看。
JIRA与Confluence集成安装手册
1、先安装mysql
2、新建DB用户
3、用下面的语句建库
CREATE DATABASE jira CHARACTER SET utf8 COLLATE utf8_bin; CREATE DATABASE confluence CHARACTER SET utf8 COLLATE utf8_bin;
4、安装atlassian-jira-6.4.8-x64
A、安装程序
B、把jdbc驱动拷贝到lib下
C、设置DB
D、设置管理员用户
E、登录后,上传语言包
5、安装atlassian-confluence-5.8.6-x64
A、安装程序
B、把jdbc驱动拷贝到lib下
C、设置DB
D、设置账户连接到JIRA
E、登录后,上传语言包
6、搞定!
此外,如果要重新配置JIRA:
1、导出数据
2、关闭服务
3、重命名文件Application Data\JIRA\dbconfig.xml
4、开启服务登录即可
如果要重新配置Confluence :
1、导出数据
2、关闭服务
3、重命名文件Application Data\Confluence\confluence.cfg.xml
4、开启服务登录即可
如果只是要调整JIRA数据库连接参数,可以
A、编辑Application Data\JIRA\dbconfig.xml
或
B、运行JIRA\bin\config.bat
如果只是要调整Confluence数据库连接参数,可以
A、编辑Application Data\Confluence\confluence.cfg.xml
从WIN ADT复制到MAC ADT
Android SDK超级大(我现在有26.5G),而连接Google的速度超级慢,一次下载要好久。
最近准备在MAC进行Android开发,别的都好下载,但Adroid SDK就有些太大了,于是考虑从WIN下直接复制到MAC。
Android SDK主要由下面几部分组成:
/add-ons:GoogleAPI,操作系统无关 /build-tools:构建工具,这个和操作系统相关的,要重新下载 /docs:文档,操作系统无关 /extras:扩展内容,是否需要重新下载与其功能有关 /extras/android:操作系统无关 /extras/google:操作系统无关 /extras/intel:intel的硬件加速驱动,操作系统相关,需重新下载 /platforms:android平台,早期操作系统相关,后期将操作系统相关内容放到了build-tools中,可以全部拷贝过去,系统相关内容会自动重新下载 /platform-tools:管理工具,这个和操作系统相关的,要重新下载 /samples:demo,操作系统无关 /sources:android源码,操作系统无关 /system-images:android系统映像,操作系统无关 /temp:下载缓存,不需要拷贝 /tools:管理工具,这个和操作系统相关的,要重新下载
MAC设置AndroidStudio初始环境
1、从Oracle下载MAC版本的JDK7
http://www.oracle.com/technetwork/java/javase/downloads/index.html
2、从Google下载MAC版本Android Studio和Android SDK Manager
http://developer.android.com/sdk/index.html
3、安装JDK7、Android Studio、Android SDK Manager,并下载需要版本的Android SDK
4、此时双击Android Studio会报错:
Android Studio was unable to find a valid JVM.
这是因为Android Studio默认使用JDK1.6.*的原因
在Finder中打开Application文件夹,在“Android Studio.app”上右键,显示程序包内容 编辑Content/Info.plist,修改属性JVMOptions->JVMVersion一行,从1.6.*修改为1.7.*
5、此时双击Android Studio会尝试从Google获取最新的Android SDK信息
Fetching Android SDK component information
当然你读不到啦,只好屏蔽初始化方法:
编辑Content/idea.properties/bin/idea.properties文件,添加一行 disable.android.first.run=true
6、现在Android Studio可以启动了,但是不能新建项目
需要告诉Android Studio,Android SDK在哪里:
主界面-》Configure-》Project Defaults-》Project Structure-》Android SDK location 填写Android SDK的绝对路径,保存,然后就能新建应用了
7、那就新建一个简单应用测试一下吧,当然先是虚拟机:
Starting emulator for AVD 'new' emulator: ERROR: x86 emulation currently requires hardware acceleration! Please ensure Intel HAXM is properly installed and usable. CPU acceleration status: HAX kernel module is not installed!
这是因为HAXM模块没有安装,前往Android SDK根目录
安装下面的软件: PATH_TO_SDK/extras/intel/Hardware_Accelerated_Execution_Manager/IntelHAXM_1.1.1_for_10_9_and_above.dmg
8、然后就是在设备上测试,Android SDK找不到我的设备
#添加adb路径 echo "export PATH=${PATH}:/PATH_TO_SDK/android-sdk-macosx/platform-tools/">>~/.bash_profile #然后刷新一下 source .bash_profile #添加设备厂商ID(我的是小米),可以在系统报告中看到设备厂商ID信息 echo"0x2717">>~/.android/adb_usb.ini #杀掉adb服务 adb kill-server #重启adb服务 adb sever #PTP模式连上手机,当然要开启手机调试咯,这样就能看到设备了 adb devices
9、连上设备了,运行时报错:
Permission Denial: starting Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.neohope.testapp/.LoginActivity } from null (pid=29619, uid=2000) not exported from uid 10139
这个错误是因为Main Activity没有设置,在Manifest中对应的Activity中增加如下设置即可
<intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter>
Wireshark过滤规则
Wireshark是一个很好用的sniffer工具,插件十分强大。有时,为了判断问题,在日常工作中也会用到一些,现在记录一部分常用的过滤规则:
1、运算符
lt | < | 小于 |
le | <= | 小于等于 |
eq | == | 等于 |
gt | > | 大于 |
ge | >= | 大于等于 |
ne | != | 不等 |
and | && | 与操作 |
or | || | 或操作 |
not | ! | 非操作 |
2、ip、mac和port过滤
#过滤ip地址为192.168.1.102的全部数据包 ip.addr eq 192.168.1.102 #过滤从192.168.1.102发来的数据包 或 发往192.168.1.102的数据包 ip.src eq 192.168.1.102 or ip.dst eq 192.168.1.102 #过滤MAC地址为00:00:00:01:02:03的所有包 eth.add eq 00:00:00:01:02:03 #过滤MAC地址为00:00:00:01:02:03发送的包 或 发往00:00:00:01:02:03的包 eth.src eq 00:00:00:01:02:03 or eth.dst eq 00:00:00:01:02:03 #过滤8080端口全部tcp数据包(接收和发送) tcp.port eq 8080 #过滤8080端口发送的全部tcp数据包 或 发送到8080端口全部tcp数据包 tcp.srcport eq 8080 or tcp.dstport eq 8080 #过滤21端口全部udp数据包(接收和发送) upd.port eq 21 #过滤21端口发送的全部udp数据包 或 发送到21端口全部udp数据包 udp.srcport eq 21 or udp.dstport eq 21 #过滤1024以内端口数据包 tcp.port <= 1024 #去掉tcp数据包 !tcp #或 not tcp
3、包长度过滤
#udp报文长度等于100 udp.length eq 100 #udp数据长度等于92 udp.len eq 92 #经常可以用到eth(farme),ip,arp,tcp,udp等协议的包长度 #注意区分包长度和payload长度
4、HTTP协议
#过滤GET方法的HTTP数据包 http.request.method == "GET" #按URI过滤HTTP数据包 http.request.uri == "/image/logo.gif" #按内容过滤HTTP数据包 http contains "Content-Type: application/dicom"
5、匹配规则
\d | 0-9的数字 |
\D | \d的补集 |
\w | 单词字符,即大小写字母、0-9的数字、下划线 |
\W | \w的补集 |
\s | 空白字符,包括换行符\n、回车符\r、制表符\t、垂直制表符\v、换页符\f |
\S | \s的补集 |
. | 除换行符\n外的任意字符 |
.* | 匹配任意文本 |
[…] | 匹配[]内所列出的所有字符 |
[^…] | 匹配非[]内所列出的字符 |
^ | 表示其后的字符必须位于字符串的开始处 |
$ | 表示其前面的字符必须位于字符串的结束处 |
\b | 匹配一个单词的边界 |
\B | 匹配一个非单词的边界 |
{n} | 匹配前面的字符n次 |
{n,} | 匹配前面的字符n次或多于n次 |
{n,m} | 匹配前面的字符n到m次 |
? | 匹配前面的字符0或1次 |
+ | 匹配前面的字符1次或多于1次 |
* | 匹配前面的字符0次或式于0次 |
6、包匹配
#字节匹配,比如匹配payload第一个字节0x14的UDP数据包 udp[8]==14 #范围匹配,经常使用到tcp[offset,n],比如匹配payload的前4个字节0x0004002a udp[8:4]==00:04:00:2a #正则匹配,要用match,比如匹配HTTP1.1协议的数据包 tcp[20:] matches "^GET [ -~]*HTTP/1.1\\x0d\\x0a"
7、示例
#DICOMClient 上抓取 DICOMServer ip.dst eq 服务端ip && tcp.port eq 104 #DICOMServer 上抓取 DICOMClient tcp.port eq 104 #HL7v2Client 上抓取 HL7v2Server ip.dst eq 服务端ip && tcp.port eq 3306 #HL7v2Server上抓取 HL7v2Client tcp.port eq 3306
Windows服务程序访问NAS
由于服务程序授权与用户桌面授权互不影响,所以即使在用户桌面映射了NAS盘符,在Windows服务程序下仍然是不可以访问的。
一般来说有这样几种做法来访问NAS或共享盘:
1、加入域,通过“域用户认证”或“通过将NAS资源设置对某台计算机授权”来达到访问NAS的目的
2、不加域,在Windows中添加与NAS相同的用户名及密码,服务程序通过该用户名密码登录,可以访问NAS
3、不加域,通过调阅API的方式来获得访问NAS的权限
A、VC实现如下:
DWORD AcessNetDrtive(TCHAR* szRemotePath, TCHAR* szLocalDriver, const TCHAR* szUsername, const TCHAR* szPassword) { DWORD dwRetVal; DWORD dwFlags; NETRESOURCE nr; memset(&nr, 0, sizeof(NETRESOURCE)); nr.dwScope = RESOURCE_GLOBALNET; nr.dwType = RESOURCETYPE_ANY; nr.lpLocalName = szLocalDriver; nr.lpRemoteName = szRemotePath; nr.lpProvider = NULL; //CONNECT_REDIRECT;CONNECT_UPDATE_PROFILE; dwFlags = 0; dwRetVal = WNetAddConnection2(&nr, szPassword, szUsername, dwFlags); retrun dwRetVal; }
B、C#实现如下:
public class NetworkDrive { public enum ResourceScope { RESOURCE_CONNECTED = 1, RESOURCE_GLOBALNET, RESOURCE_REMEMBERED, RESOURCE_RECENT, RESOURCE_CONTEXT } public enum ResourceType { RESOURCETYPE_ANY, RESOURCETYPE_DISK, RESOURCETYPE_PRINT, RESOURCETYPE_RESERVED } public enum ResourceUsage { RESOURCEUSAGE_CONNECTABLE = 0x00000001, RESOURCEUSAGE_CONTAINER = 0x00000002, RESOURCEUSAGE_NOLOCALDEVICE = 0x00000004, RESOURCEUSAGE_SIBLING = 0x00000008, RESOURCEUSAGE_ATTACHED = 0x00000010, RESOURCEUSAGE_ALL = (RESOURCEUSAGE_CONNECTABLE | RESOURCEUSAGE_CONTAINER | RESOURCEUSAGE_ATTACHED), } public enum ResourceDisplayType { RESOURCEDISPLAYTYPE_GENERIC, RESOURCEDISPLAYTYPE_DOMAIN, RESOURCEDISPLAYTYPE_SERVER, RESOURCEDISPLAYTYPE_SHARE, RESOURCEDISPLAYTYPE_FILE, RESOURCEDISPLAYTYPE_GROUP, RESOURCEDISPLAYTYPE_NETWORK, RESOURCEDISPLAYTYPE_ROOT, RESOURCEDISPLAYTYPE_SHAREADMIN, RESOURCEDISPLAYTYPE_DIRECTORY, RESOURCEDISPLAYTYPE_TREE, RESOURCEDISPLAYTYPE_NDSCONTAINER } [StructLayout(LayoutKind.Sequential)] private class NETRESOURCE { public ResourceScope dwScope = 0; public ResourceType dwType = 0; public ResourceDisplayType dwDisplayType = 0; public ResourceUsage dwUsage = 0; public string lpLocalName = null; public string lpRemoteName = null; public string lpComment = null; public string lpProvider = null; } [DllImport("mpr.dll")] private static extern int WNetAddConnection2(NETRESOURCE lpNetResource, string lpPassword, string lpUsername, int dwFlags); public static int MapNetworkDrive(string remotePath, string localDrive, string userName, string passWord) { NETRESOURCE myNetResource = new NETRESOURCE(); myNetResource.lpLocalName = localDrive; myNetResource.lpRemoteName = remotePath; myNetResource.lpProvider = null; int result = WNetAddConnection2(myNetResource, passWord, userName, 0); return result; } }
IIS程序访问NAS
IIS程序访问NAS,一般有两种情况,加域和没加域
1、加域后,什么都好办,可以通过两种方式认证
A、采用域帐户认证
B、NAS资源可以直接授权给指定计算机访问
2、不加域,那一般有三种方式设置访问权限
A、通过指定程序的用户名和密码访问(这里指定的不是本地的用户名和密码,而是NAS的用户名和密码)
B、不指定用户名和密码,直接通过pass-through authentication方式访问,其规则为:
首先通过用户的真实id进行验证
如果用户没有授权,会尝试使用应用池的账户进行验证
如果应用池账号为NetworkService或LocalSystem,将使用计算机账号进行验证
采取这样的方式IIS会提出警告,因为IIS只有在运行之后,才知道能否访问NAS
C、通过代码实现
//NAS访问封装类 public class NetworkDrive { public enum ResourceScope { RESOURCE_CONNECTED = 1, RESOURCE_GLOBALNET, RESOURCE_REMEMBERED, RESOURCE_RECENT, RESOURCE_CONTEXT } public enum ResourceType { RESOURCETYPE_ANY, RESOURCETYPE_DISK, RESOURCETYPE_PRINT, RESOURCETYPE_RESERVED } public enum ResourceUsage { RESOURCEUSAGE_CONNECTABLE = 0x00000001, RESOURCEUSAGE_CONTAINER = 0x00000002, RESOURCEUSAGE_NOLOCALDEVICE = 0x00000004, RESOURCEUSAGE_SIBLING = 0x00000008, RESOURCEUSAGE_ATTACHED = 0x00000010, RESOURCEUSAGE_ALL = (RESOURCEUSAGE_CONNECTABLE | RESOURCEUSAGE_CONTAINER | RESOURCEUSAGE_ATTACHED), } public enum ResourceDisplayType { RESOURCEDISPLAYTYPE_GENERIC, RESOURCEDISPLAYTYPE_DOMAIN, RESOURCEDISPLAYTYPE_SERVER, RESOURCEDISPLAYTYPE_SHARE, RESOURCEDISPLAYTYPE_FILE, RESOURCEDISPLAYTYPE_GROUP, RESOURCEDISPLAYTYPE_NETWORK, RESOURCEDISPLAYTYPE_ROOT, RESOURCEDISPLAYTYPE_SHAREADMIN, RESOURCEDISPLAYTYPE_DIRECTORY, RESOURCEDISPLAYTYPE_TREE, RESOURCEDISPLAYTYPE_NDSCONTAINER } [StructLayout(LayoutKind.Sequential)] private class NETRESOURCE { public ResourceScope dwScope = 0; public ResourceType dwType = 0; public ResourceDisplayType dwDisplayType = 0; public ResourceUsage dwUsage = 0; public string lpLocalName = null; public string lpRemoteName = null; public string lpComment = null; public string lpProvider = null; } [DllImport("mpr.dll")] private static extern int WNetAddConnection2(NETRESOURCE lpNetResource, string lpPassword, string lpUsername, int dwFlags); public static int MapNetworkDrive(string remotePath, string localDrive, string userName, string passWord) { NETRESOURCE myNetResource = new NETRESOURCE(); myNetResource.lpLocalName = localDrive; myNetResource.lpRemoteName = remotePath; myNetResource.lpProvider = null; int result = WNetAddConnection2(myNetResource, passWord, userName, 0); return result; } } //调用示例 NetworkDrive.MapNetworkDrive("NAS paht with ip", "Local Driver Letter", "user", "password");