重置Outlook到初始配置状态

2014年7月24日 没有评论

这2天工作邮箱有问题,给 IT 支持那边反馈了后,他们说是因为我的 Lync 权限问题,已经处理好了。

但是邮箱还是有问题,启动的时候会让我选择使用临时邮箱还是旧数据,如果是旧数据,则无法收发邮件,如果是临时邮箱,里面就没有以往的邮件。

再次给 IT 反馈,然后他们安排了给我恢复历史邮件。但是,还是出现提示无法使用。

本来是想把 outlook 给卸载然后重装的,恰好搜索到小技巧可以避免再次安装了。

在运行里输入:outlook /importprf .\.prf

如果是正常安装的 outlook,这里就不需要填写绝对路径了,点击确定后就可以开始配置账户了。

成功解决问题。

分类: 一句话 标签: ,

Can’t connect to local MySQL server through socket ‘var/run/mysqld/mysqld.sock’问题的一种解决方法

2014年7月9日 没有评论

在虚拟机里安装了Ubuntu系统,在使用mysql 的时候,发现连接不上去。报错 Can’t connect to local MySQL server through socket ‘var/run/mysqld/mysqld.sock’。

按照网上别人的说法,是由于不同版本的linux系统,在安装mysql的时候呢,做了不同的配置,有说可以修改 my.cnf 文件里的路径。但是在虚拟机系统里根本就没有发现这个文件。经过测试发现下面的命令是可以的,看起来应该是做了一个软连接的方式喔。

sudo ln -s /var/lib/mysql/mysql.sock  /var/run/mysqld/mysqld.sock

很不喜欢不同版本的系统,配置会在不同地方的行为。这点貌似windows做的更好一点。

分类: 一句话 标签: , ,

一种mysql 无法登陆的解决办法

2014年7月8日 没有评论

由于工作需要,在内网里假设论坛,本来是打算使用windows系统的,可是下载数据库,很久都没有下载回来,只好放弃而改用linux服务器。

服务器居然是Redhat 的系统,一路各种安装,但是在安装mysql时出错了。

安装mysql后,使用命令登录mysql居然报错了,Mysql ERROR 1045 (28000): Access denied for user ‘root’@’localhost'(using password: NO),这个错误搞得很郁闷,可能是密码在配置mysql的时候异常,所以导致我们没有正确的密码,知道问题后,立即想到解决办法了,那就是重新设置一个密码,方法如下

1.先关闭mysql并设置密码
1.#sudo /etc/init.d/mysql stop
2.#sudo mysqld_safe –user=mysql –skip-grant-tables –skip-networking &
3.#sudo mysql -u root mysql
4.mysql> UPDATE user SET Password=PASSWORD(‘pas’) where USER=’root’;
5.mysql> FLUSH PRIVILEGES;
6.mysql> quit

2.重启mysql并尝试登录
1.#sudo /etc/init.d/mysql restart
2.#sudo mysql -u root -p
3.Enter password:
4.#输入密码,出现下面这个就表示登录正常了
5.mysql>

Mysql ERROR 1045 (28000): Access denied for user ‘root’@’localhost'(using password: NO)这个错误在使用phpmyadmin登录的时候只提示(28000),同时phpmyadmin也会提示密码出错,按以上方法设置之后就可以用新密码登录phpmyadmin了。

登陆成功,剩下的就是拷贝文件,然后进行论坛的初始化操作了,这里就不提了。

分类: 日常 标签: ,

Mac 下国内IP不走VPN

2014年6月18日 没有评论

这几天要升级Android SDK,但是更新一直都下载不成功。当然了有一部分因素是最近对 google 的屏蔽太严重了。

后来,我用其它工具在windows下,总算顺利更新成功。对于mac系统,算是无解。我自己服务器假设的vpn,在mac上可以连接,但是无法发送数据,为此郁闷了好久了。后来还是决定买一个 VPN 帐号。

VPN 问题是解决了,但是所有的流量请求都走 VPN 网络,对于国内的网站来说,可能就降低了访问速度,毕竟没有必要先通过国外的服务器中转。

网络上搜索了一下,找到一个相对简单的方法。步骤如下:

1、先不连接 VPN。

2、使用开源工具。在 chnroutes 的官网下载 chnroutes.py 文件。

3、可以把这个文件放到 Mac 的当前用户名目录下,然后终端执行 python chnroutes.py -p mac,就会在当前目录下生成ip-up 和 ip-down 2个文件。

4、终端执行 sudo sh ip-up ,之后正常连接 VPN即可。不用时在终端执行 sudo sh ip-down。

这样,就可以实现,国内的IP不走VPN通道,以提供网络响应速度。

 

同时呢,你还可以访问 chnroutes-dl.appspot.com 来直接下载 ip-up 和 ip-down 文件。这2个文件会不断更新以调整当前最新的IP。

分类: 一句话 标签: , ,

inno setup初探

2014年6月10日 没有评论

由于工作的原因,需要对应用程序制作安装包。在以前的项目中,都是使用的 InstallShield  来做的安装包,最近的一个项目是从一个日本开发团队的项目中新建的一个分支,他们原本的安装包都是使用 Inno Setup 来创建的,结合项目背景和安装包的复杂度,我们就踏上了inno setup的路。

inno setup 相对于 InstallShield 轻量了很多,也是使用了 iss 作为安装脚本文件的后缀。常量的定义也大大方便了开发人员。

下面描述下常见的常量

AppId 应用程序唯一ID
AppName 应用程序名称
AppVersion 应用程序版本号
AppPublisher 应用程序制造商
AppSupportURL 应用程序厂商的URL

DefaultDirName 默认的安装路径
OutputDir exe安装包的输出路径
UninstallDisplayIcon 卸载程序的图标

上面的几个变量中,第一部分的信息会显示在添加删除程序中,尤其以AppId最为重要,操作系统以此来区分不同的应用程序。如果是同一个应用程序不同的版本,请保证该变量始终是相同的。inno setup可以帮助生成GUID格式的AppId。

而[Files]段是描述了拷贝文件的路径和方式,例如下面的

Source : “{#SourcePath}\WinGather.exe”; DestDir: “{app}”; Flags: ignoreversion

意思就是把 SourcePath 定义的目录下的 WinGather.exe 程序拷贝到程序的安装目录下。{app} 是一个系统变量,表示程序在用户机器上的安装目录。ignoreversion 是在拷贝的过程中忽略版本的不同。

如果一个应用中有很多个文件需要拷贝,有的还包括子目录,都这样写就会很琐碎。于是就有这样的版本:

Source: “{#SourcePath}\ccprompt\*”; DestDir: “{app}\ccprompt”; Flags:ignoreversion recursesubdirs

从这里我们可以看到通配符*的使用,这样就会方便很多哟。此外,recursesubdirs 参数表示如果包含子目录的话,那么连同子目录也一起拷贝。这样 [Files] 就会少很多,尽管有通配符的支持,但是实际应用中要看情况而定,目的是为了避免安装包拷贝时的准确性,如果安装不对劲,也方便查找定位原因。

[run]段的作用是描述在安装的最后一步所要做的操作,多用于启动服务或者清理等操作,例如下面的:

Filename:”net.exe”; Parameters:”stop ccsdk”; Flags:waituntilterminated runhidden runascurrentuser;

这个例子就是调用 net 来停止一个叫做 ccsdk 的服务,同时有3个额外的选项,分别表示等这个操作完成后再进行后续的安装,不显示界面,以当前用户即管理员权限运行。如果运行一个命令行或者批处理,如果不使用 runhidden,那么在界面上就会看到有一个窗口一闪而过,体验不是很好。

[uninstallDelete]段的作用是描述在卸载的时候,要删除的文件,多用于程序在运行期间产生的文件例如日志、临时文件等,例如:

Type:filesanddirs; Name:”{app}\log.txt”

上面就是简单的描述了一下,inno setup其实非常简单,环境本身也提供了安装想到和帮助文档,文档里写的是非常的详细。所以我这里几乎没有什么内容可写。对于E文不懂的同学,可以在网上下一个中文版的帮助手册。最后说一下,inno setup的安装脚本是不区分大小写的。

分类: 日常 标签: , ,

为网站添加https支持

2014年5月22日 没有评论

在ququ的日志里,有提及到使用https,当时看到后,很是动心,由于某些原因,最终只是看一看罢了。

前不久苹果发布了 iOS7.1正式版,这个更新有很多功能改进,其中包括对于app的在线安装的要求提示,文件的url地址必须为使用了ssl 的url,否则应用会安装失败。

开始我并不知道,在给客户发布app新版本的时候,发现无法安装。得,这最后还是要使用https 了。于是我马上就想到了ququ 的那个日志,重温下日志后就去了他们的官网 http://www.thawte.com/。

这个供应商提供ssl 证书和应用程序签名。我们这里只需要使用 ssl 证书。其实呢,我一共交易了2次,第一次域名输错了,好在供应商服务很不错,30天内可以退款的。

对于windows 服务器而言,首先需要在 IIS 里设置,打开服务器证书选项,然后选择“创建证书申请”,按照向导一步步地填写下去,需要注意的是,里面涉及的网址就是需要使用ssl证书的网址。此外还有一点是选择加密长度,长度越大,安全性越高,但是解析的时间也越长。衣服自己洗第一次交易就是由于没有填写带 www 前缀的网址,不过好在thawte很厚道,30天内可以随时revoke掉这个证书。

通过这一步,我学会了revoke这个单词,是不是很神奇的样子?好处就是后来我经常revoke苹果的证书。

按照向导创建完申请后,我们进入到 thawte 的网站,开始完成支付流程,并上传刚才创建的证书,输入验证邮箱。如果顺利的话,一天不到输入的验证邮箱里就可以收到他们的邮件了,邮件里还会附加证书内容。然后进入服务器,导入证书。最后选择网站,设置证书就可以了。这几个步骤就非常简单,衣服自己洗就略过不提啦。

很简单,对不对。

顺利的话当然简单,衣服自己洗就不顺利。在验证邮箱的时候,网页里提示你选择验证邮箱,比如说网站是 withonly.com,那么就有 admin、administraotr、webmaster 这样的前缀可以选择,同时,网页还提供了自定义的文本框。没有想到的是这里居然是一个大坑。衣服自己洗由于是使用的 me 前缀,就选择了自定义模式。结果后面就完全思密达了,邮箱里收不到邮件,交易处于pending 状态,只好找他们的客服,客服很是严谨,各种认证。我和客服说我不会英文,客服居然说她可以说中文,然后要了我的电话给我打过来,诶哟喂,是个妹子的声音你们晓得不啦。

现实生活中屌丝久了,连和妹子说话的机会都没有,所以很高兴有没有。呃,扯远了。所以到时候大家可千万不要选择邮箱的自定义模式,估计这里是他们网站的bug。

到这里证书的是就算完成了,但是整个事情,还没有完成。我们输入 https://www 这样的网址,是可以看到地址栏上的锁出现,但是现在一般网站会把没有www前缀的也自动跳转到 www 上。所以还需要额外做一些重定向,把 http 的请求给重定向到 https 上面来。我这人比较偷懒,在服务器上直接使用了 IIRF 组件实现的。

最后,说下价格,我买的应该最便宜的那种 149美元一年。有需要的同学,可以去看看。

 

分类: 日常 标签: , , ,

.Net程序实现多语言

2014年5月8日 没有评论

最近工作中要用到一个小工具,出于快速开发的目的,使用c#作为开发语言,放弃了c++,功能简单,当然是怎么方便怎么来。其它的功能这里就不说了,衣服自己洗这里要分享的就是其中的一个功能,对全球化多语言的支持。

.Net中要实现全球化,是把不同的语言放在不同的字典中,然后运行时动态选择。具体实现来说,可以有2种方式:

1、系统自带的Resources.resx文件

Resources.resx 是.Net提供的一个资源文件,可以提供对字符串,图片、二进制数据的存储,Resources.resx 本质上是一个xml 文件。比如,我们通过 VS 在文件中添加一个字符串,键为 Name,值为 唠叨下。

接下来,是考虑如何在程序中调用,非常简单,我们可以这样写 string name = Properties.Resources.Name;

注意这里的Name即为我们在Resources.resx里定义的键。之所以可以这么来调用,是由于VS自动帮助我们在 Resources.Designer.cs文件中定义了相关的方法。如果细心点,你会发现还可以使用Resources.ResourceManager 的GetString()方法和GetObject()方法,也可以达到相同的目的。拿到了值后,我们就可以做对应的显示了。

上面是第一步,接着我们来进行第二步。我们直接复制Resources.resx文件,并粘贴后改名,例如Resources.en-US.resx。这里需要说2点,一个是文件名格式,en-US是语言。另外一个是重命名后,Resources.en-US.Designer.cs里的内容给清空了,这个是没有关系的。事实上如果不清空,编译会报错。

这个时候,编译我们的工程,会发现在bin目录下生成一个en-US目录,里面有一个dll文件。默认的Resources.resx不会生存额外的文件夹,会直接编译到主程序中。

最后,我们需要添加显示,不然程序运行始终显示的是里的字符串。在程序的入口添加下面的代码,表示以当前系统的显示语言作为程序的语言。
Thread.CurrentThread.CurrentUICulture = new CultureInfo(System.Globalization.CultureInfo.CurrentUICulture.Name);

有的软件可能想要提供一个菜单,供用户主动选择语言,那么在初始化的时候,可以传入语言参数,例如 new CultureInfo(“zh-CN”)等等。

经过上面的处理,程序在运行的时候,就会得到我们需要的语言。

2、自定义的方式

上面的方式在编译后,会根据不同的语言生成对应的文件夹。例如我要做的小工具,就要生成28个国家的文件夹。看起来是不是很猥琐?我这里做过尝试,把所有的语言文件夹移动同目录下的一个新文件夹中,例如 Language 是不可行的。

还比如说,多语言的翻译和开发是同步进行的,希望以后再不重新编译版本的情况下新增别的语言等等各种需求,我们可以自定义。

不想要那么多文件夹,可以把所有的多语言翻译都放在Resources.resx文件里,并添加语言前缀,例如zh-cn_Name等等,利用Resources.resx会被编译到主程序的原理,就解决了过多的文件夹的问题。

对于想要动态新增语言,就只好将多语言放到数据库或者xml配置文件里,按语言取名,程序读取的时候来解析数据库或者xml。好处是只要新增了xml,程序不需要编译就支持了。缺点是由于可以修改,如果用户手动修改的话,可能会导致一些意外产生,不过额外做一些加密操作应该可以过滤掉大部分误操作。

衣服自己洗在上面介绍了2种方式,各位同学可以根据实际情况灵活采用不同的方式。满足了老板的需求,剩下的就是喝啤酒泡妹子去了。

分类: 日常 标签: ,

c++程序窗口不在任务栏上显示

2014年4月18日 没有评论

一般说来,程序在运行的时候,会在任务栏上显示图标,当然XP系统还是会一起显示程序的标题。虽然加班是不变的,而需求是一定变化的。出于某些需要,要实现程序在运行时不显示窗体。对于c#程序而言,只用设置 ShowInTaskbar = false 即可。而对于c++程序,还不能这么简单的使用。

今天衣服自己洗分享的是使用 ITaskbarList 接口来实现c++程序窗口不在任务栏上显示的目的。

从IE4开始,window提供了ITaskbarList 接口,我们可以简单地调用即可。

首先我们需要添加头文件的引用    #include “ShObjIdl.h”

然后,我们在代码里添加这样一个方法:
void ShowInTaskbar(HWND hWnd, BOOL bshow){
HRESULT hr;
ITaskbarList *pList;
hr = CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER,
IID_ITaskbarList, (void **)&pList);

pList->HrInit();

if (bshow){
pList->AddTab(hWnd);
}
else{
pList->DeleteTab(hWnd);
}

pList->Release();
}

最后一步,在窗口初始化的时候,调用这个方法即可。两个参数分别为窗体的句柄,是否显示。

分类: 日常 标签: , ,

pngcrush 不错的png图片压缩工具

2014年4月18日 没有评论

pngcrush 是一个免费开源的png图片的压缩工具。甚至可以在不损失视觉效果的前提下压缩40%的体积,png图片的加载速度比没有优化前要快很多。其原理是去除png文件头里的部分数据。

第一次接触这个东西时并不是为了做图片压缩,而是在分析 ipa 文件时碰到的。xcode 在打包应用时,会调用pngcrush 来对图片进行压缩,不过由于是对png文件数据格式做了修改,所以无法直接预览,这样在文件夹里显示的就是黑色的图片。

pngcrush 可以在http://sourceforge.net/projects/pmt/files/pngcrush/ 下载,里面既有源代码,也有可执行程序。其实xcode 里已经包含了,可以在命令行里输入下面的命令,即可找到 pngcrush 的位置。

xcrun -sdk iphoneos -find pngcrush

可以把这个程序拷贝到其它方便的目录,或者做一个快捷方式也是可以的。mac 里快速创建一个快捷方式是酱紫的:按住command+option,然后拖动图标到你想要创建快捷方式的位置,松手即可。

至于使用方式么,

pngcrush -d xxx reverted -revert-iphone-optimizations -q *.png

pngcrush -e xxx reverted -revert-iphone-optimizations -q *.png

还可以简单的这么来使用

pngcrush -reduce -brute -d output image.png image.png

上面是对 pngcrush的一个简单介绍,有需要的同学不妨去看看。

分类: 一句话 标签: , ,

桌面程序调用metro/modern应用

2014年3月17日 没有评论

在我的上一篇文章《自定义协议及其在metro中的应用》中,描述了如何在metro应用程序中调用桌面程序。当然,现在微软为了避免版权的问题,已经把metro改名为modern了。今天,项目的需求恰好和这个相反,是由桌面应用程序来调用metro应用。

在以前的文章中,我提到了自定义协议,这次我也寻思着是不是可以一样通过自定义协议来解决。网上狂搜索了一把,还是google给力,在msdn上找到了解决方法,这里给记录下来,方便国内的用户。

首先,我们打开项目,找到Package.appxmanifest文件,然后切换到“声明”选项卡,添加一个协议,同时设置一个名称,例如sgy,其它的信息都是可选的,看着输入好了。

接下来,我们找到App.xaml的代码文件,找到 OnActivated方法,在这个方法里添加代码即可。

protected override void OnActivated(IActivatedEventArgs args){
if(args.Kind == ActivationKind.Protocol){
ProtocolActivatedEventArgs eventArgs = args as ProtocolActivatedEventArgs;
//eventArgs.Uri.AbsoluteUri 就是我们要的数据了,剩下的就是字符串参数操作了
}
}

到这里就差不多完成啦,是不是很简单~

接下来就是程序调用部分了,比如说我们想调用程序并传递一个 wifilist 参数,可以这么来调用:sgy://wifilist,就和打开一个网页是一样样的。操作系统会在安装app的时候帮我们建立sgy协议和metro程序的关联,不需要我们操心在注册表里设置关联了。略有遗憾的是参数只能是字符串形式,如果参数是对象的话,就需要实例化转换成字符串了。

分类: 日常 标签: , ,