存档

‘日常’ 分类的存档

一种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了。

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

分类: 日常 标签: ,

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();
}

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

分类: 日常 标签: , ,

桌面程序调用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程序的关联,不需要我们操心在注册表里设置关联了。略有遗憾的是参数只能是字符串形式,如果参数是对象的话,就需要实例化转换成字符串了。

分类: 日常 标签: , ,

win8.1清理无线网络连接信息

2014年3月15日 没有评论

从XP开始,一直到win8,都可以对本机曾经连接过的无线网络信息进行管理。以win8为例,只需要在网络连接上面点击右键,选择“忘记网络”即可。

但是win8.1居然没有,我想删除掉曾经使用过的无线网络连接,洁癖嘛你懂的。找了很久都没有找到,一个偶然的机会让我给发现了。

打开命令行,输入netsh wlan show profile,然后会显示所有的曾经连接网络连接,当然也包括现在正在使用的。一行一条记录,并且会把网络连接的名称显示出来。

接着再输入netsh wlan delete profile name=”网络连接” 回车即可。英文双引号是必须的。要知道解决了这个问题,心里很是舒坦。

分类: 日常 标签: , ,

Pull is not possible because you have unmerged files解决方法

2014年3月2日 没有评论

最近在项目中添加了一个 SDWebImage 开源组件,然后运行 pod install的时候,结果出现了Pull is not possible because you have unmerged files 错误提示。

删除然后重新安装,依然报错。解决方法如下:

pod repo remove master

pod setup

如果仍然没有效果,那么再清理下缓存

rm -rf ~/.coocapods/

pod setup

我这边只进行了上面的第一步就已经正常了。

分类: iOS, 日常 标签: ,

我们都在变老

2014年1月21日 没有评论

13年的整个10月几乎都在加班,似乎每天都没有正常的下班。现在就趁着休假的机会和春节连在一起休掉。

回家给人的感觉就是所有的人都在变老,那感觉太明显了。

其实在这一年里,我的皮肤变差,眼睛近视很多。听姐姐讲那谁谁这2年做工程赚大发了,都是好几百万的收入,只可惜财追人阿,最后是个悲剧。

回家的这几天的时间里,家里早晚温度很低,电脑电话直接给冻的充不进去电了。

分类: 一句话, 日常 标签:

iOS第三方库管理工具:CocoaPods

2013年12月3日 没有评论

iOS 开发是我自学的,就那种边学边用的那种。一切都是慢慢摸索。

以前有看到推荐CocoaPods,一看介绍,确实不错,值得一用,但是直到今天才自己为此写文字。

现在来说流程:

首先在命令行里执行如下操作:

1、sudo gem update –system

这是为了让系统组件升级到最新版本。

2、sudo gem install cocoapods

开始安装cocoapods。

3、pod setup

自动配置cocoapods。接下来呢,就是要针对每个 ios 项目了。在想要配置的项目里编辑文件,文件名为 Podfile,内容格式如下:

platform     :ios
pod ‘JSONKit’
pod ‘FMDB’

这里需要特别说明的是,第一行的冒号应该和 ios 放在一起,我最开始是放在前面的,导致出错。剩下的就是每一行一个第三方的库引用。如果不知道名称是什么,可以用   pod search 关键词  命令来搜索看看。其实 Podfile 文件也可以使用touch 命令来创建,但是我更喜欢用编辑器来操作。其实后面还可以跟版本号,我比较喜欢使用最新的版本,所以就去掉啦。文件创建完成后,就执行第四步。

4、pod install

这个命令是需要先在命令行里进入到项目的文件夹,然后才运行的。安装成功后,会在项目的目录中,多出3个文件和一个文件夹,分别是  ***.xcworkspace、Podfile、Podfile.lock、Pods。以后再打开项目的话,就不要用 ***.xcodeproj 了,而是改用 ***.xcworkspace 。

随着项目的进度,会在后面才加入新的第三方库,这个时候只需要在 Podfile 里添加新的行,然后命令行进入到对应的项目文件夹,执行 pod update 就可以了。其实重新执行 pod install 也没有太大影响,只是说相对会慢一点。

上面的步骤和网上其他的地方基本上是大同小异的,实际使用的过程中,我还发现了另外的一个问题,就是在打开项目的时候,XCode 会提示我要不要对文件进行解锁。解锁后,总是提示失败。正是这个原因导致我在开始的时候放弃了CocoaPods。

我不知道这个现象是不是只有我一个人才有,网上也搜索了下,似乎信息很少。有的同学会觉得奇怪,既然无法解锁,那么就不解锁呗。原因是酱紫的,因为第三方库可能存在bug,或者使用了被遗弃掉的API,或者兼容性问题,或者只需要使用其中的某一个子组件。这些情况下,就需要对第三方库进行修改和完善。如果不解锁,就无法保存修改的地方。

既然没有什么有效的方式来解锁,只好使用linux的功能,sudo chmod -R 777  目录名   。这样的话就可以解锁所有的目录了。-R 参数是遍历所有的子目录。先前我每天添加,解锁不完美,后来查询了参数就顺利解决了。

在最后还有一个很重要的步骤,就是添加引用,不然在项目的代码里是无法 #import 头文件的,打开项目的 Target ,选择Build Settings,然后在Search Paths 节点下 User Header Search Paths 添加一个配置 ${SRCROOT},同时要记得选择 recursive。如果你一时发现不了User Header Search Paths,可以善用上方的搜索条喔。

分类: iOS, 日常 标签: , ,