在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美元一年。有需要的同学,可以去看看。
最近工作中要用到一个小工具,出于快速开发的目的,使用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种方式,各位同学可以根据实际情况灵活采用不同的方式。满足了老板的需求,剩下的就是喝啤酒泡妹子去了。
一般说来,程序在运行的时候,会在任务栏上显示图标,当然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中的应用》中,描述了如何在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程序的关联,不需要我们操心在注册表里设置关联了。略有遗憾的是参数只能是字符串形式,如果参数是对象的话,就需要实例化转换成字符串了。
从XP开始,一直到win8,都可以对本机曾经连接过的无线网络信息进行管理。以win8为例,只需要在网络连接上面点击右键,选择“忘记网络”即可。
但是win8.1居然没有,我想删除掉曾经使用过的无线网络连接,洁癖嘛你懂的。找了很久都没有找到,一个偶然的机会让我给发现了。
打开命令行,输入netsh wlan show profile,然后会显示所有的曾经连接网络连接,当然也包括现在正在使用的。一行一条记录,并且会把网络连接的名称显示出来。
接着再输入netsh wlan delete profile name=”网络连接” 回车即可。英文双引号是必须的。要知道解决了这个问题,心里很是舒坦。
最近在项目中添加了一个 SDWebImage 开源组件,然后运行 pod install的时候,结果出现了Pull is not possible because you have unmerged files 错误提示。
删除然后重新安装,依然报错。解决方法如下:
pod repo remove master
pod setup
如果仍然没有效果,那么再清理下缓存
rm -rf ~/.coocapods/
pod setup
我这边只进行了上面的第一步就已经正常了。
13年的整个10月几乎都在加班,似乎每天都没有正常的下班。现在就趁着休假的机会和春节连在一起休掉。
回家给人的感觉就是所有的人都在变老,那感觉太明显了。
其实在这一年里,我的皮肤变差,眼睛近视很多。听姐姐讲那谁谁这2年做工程赚大发了,都是好几百万的收入,只可惜财追人阿,最后是个悲剧。
回家的这几天的时间里,家里早晚温度很低,电脑电话直接给冻的充不进去电了。
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,可以善用上方的搜索条喔。
在上一篇文章里,描述了如何在服务器配置自己的 Git Server,作为系列文章第二篇,这次我们来说一说使用Git 遇到的一个问题。
很多开发者喜欢使用命令行来进行版本控制,看起来很炫,特别是在妹子面前,显得很高深有没有。我其实也想炫一下,可惜记不住命令,所以还是用 GUI 界面来吧。
SVN 客户端我使用的是 TortoiseSVN,好在 Git 客户端也有一个类似的就是 TortoiseGit。
首先在目录里,右键选择克隆,然后输入 URL 地址,剩下的就是日常用法了,该怎么用大家各自搜索去。我想说的是保存用户名密码这个细节。
TortoiseSVN 在第一次签出的时候,会有对话框让你输入用户名密码,同时提供一个选项是记住密码。这样每次提交什么的,就不需要再输入了。而TortoiseGit会每次操作的时候,都让用户输入用户名和密码,并没有提供记住密码的功能。这是在调戏各个开发者的节奏哇。
于是我搜索了下解决方法,并在这里和大家分享出来。一共有3种:
第一个方法,如网上所述,先添加一个环境变量,例如 Home,值为 %USERPROFILE%,接下来在 C:\Users\[当前用户名] 路径下创建一个名为 _netrc 的文件。其实呢, %USERPROFILE% 就是等价于 C:\Users\[当前用户名] 目录。用记事本打开 _netrc 文件,输入下面的内容
machine github.com #git服务器名称
login user #git帐号
password pwd #git密码
保存即可。
第二个方法,比这个简单点。项目目录右键打开 TortoiseGit的设置对话框,Git 节点,选择“编辑本地.git/config”,然后增加两行内容就可以了。
[credential]
helper = store
保存即可。事实上这个方法,会在 C:\Users\[当前用户名] 目录下创建一个名为 .git-credentials 的文件,里面就是保存了用户名和密码。
需要强调的是,上面的两种方法都是明文保存的,所以安全性大家可以看着办。
Visaul Studio 是我用的最频繁的开发环境了。最新的版本是 2013,同时在这个版本里,微软添加了对 Git 的支持。所以就有第三种方法,在 VS 的团队资源管理器中,可以设置项目的 Git 属性,这里是可以记住密码的喔。个人猜测用户名密码是放在 VS 的相关配置里,所以应该看不到明文,起码我没有找到明文保存的路径。如果说大家使用的是 VS 之外的开发环境,可就不那么容易了。
最近看到好些个前端开发的职位,可惜我心有余而力不足。
先来说一说背景。最近一直在加班陪着忙一个项目。项目开始的时候,说是来了一个牛人,很有个性。对于项目的版本控制,坚持要用git。人家用git,是把代码给提交到 Github 上面。
一来,我们这边从上到下都习惯用SVN,版本控制服务器也是个windows服务器,而git server 大部分是linux系统。另外一点,商业项目放在Github上,管理层有些担忧。后来,双方的PM都给那个牛人做工作,在压力下人家最后同意使用svn。
于是项目就开工了,最近一个月周末不休息都在加班。不过这个倒是题外话了。
我一直就在琢磨如何架设自己的 Git Server这个事情,SVN Server 我用的是免费的 VisualSVN Server,一直希望有个类似的window平台上的 Git Server。这么些年来,我习惯了 GUI 的操作,始终觉得 linux 的命令太难以记忆。如果有一个简单的软件在windows服务器上运行,并且有界面配置,简单容易操作,那该多好。
在网上搜索了一把,貌似很多都是在 windows 下模拟的 linux 环境,然后 ssh 登陆什么的。违背了简洁的原则,有这个折腾的功夫,我还不如就用linux服务器呢。昨天终于无意间被我搜索到一个开源的东西,可以满足我的要求了。
主角出场,那就是 Bonobo Git Server。

这个应用的官网是http://bonobogitserver.com/
下载地址是:https://github.com/jakubgarfield/Bonobo-Git-Server
首先允许我来介绍下这个应用,它是运行在 IIS 下的使用 MVC3+ 的网站。网站本身使用了SQLite 存储,然后 git 方面是调用的其它组件。
相比其它的方式,有什么优点呢?首先不需要各种模拟linux环境,原生的。另外VisualSVN Server 还自带安装apache,而 Bonobo Git Server直接使用 IIS,感觉更爽。
下载解压缩,然后添加到 IIS 里,记得使用 netframework 4.0 应用池,为该网站添加一个域名就可以了。安装完成后,访问网站,输出初始用户名和密码 admin,即可登录。当前的版本已经支持多语言了。
进入了管理界面,首先要做的是修改全局设置。修改库目录为服务器上的目录文件夹,记得该文件夹要有写权限。至于是否允许匿名提交、匿名注册什么的,大家就根据实际情况设置吧。
全局设置完毕,再来设置用户,强烈建议大家修改admin的密码。同时再创建一个个人用户,admin 用来管理这个网站,而新建的个人用户则用来代码的提交。用户信息里有一个邮箱项,建议填写真实的邮箱。
然后就是库设置,新建一个库,设置权限什么的,有中文界面,很简单的,就不细说了。创建完成后,点击库,就可以查看库的 URL 地址了,这个地址就是版本控制的地址。
至此,服务器端的设置就完成了。大家可以开发使用了。