友人服务器最近到期,准备迁移到阿里云上面。
买好了云服务器后,就开始部署,结果一直报错。说不是有效的32位程序,由于网站的登陆页面使用了加密狗,而报错的就是这个加密狗相关的dll 文件。在IIS 里添加了对32位程序的支持,还是不行,错误提示说是无法加载指定的模块。
后来想到加密狗dll 是用c++开发的,是不是缺少相关运行时导致。不清楚dll是用c++的哪个版本开发的,只好把05、08、12的32/64位运行时都下载了安装。
还是不行。
有点小崩溃了。想到既然是无法加载指定的模块,那应该是缺少模块咯。又用depends查看加密狗dll引用了哪些系统dll。发现引用了msvcr71.dll和mscoree.dll,把这2个dll 从别的电脑上复制到服务器上。运行又报错,不过错误提示发生了变化。
说是 c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\946055b8\92eead15\xxxxxx.dll 拒绝访问。
开始以为是这个目录的权限问题,添加权限还加不上去,估计server 2008 默认是不允许的。后来查询了下,很多人说是需要给系统临时目录添加权限,果断给 temp 目录添加了 network service 权限,发现还是不行。
反复搜索,终于解决,原来是需要在应用程序池设置中将“加载用户配置文件”(Load User Profile)设置为true。
再次运行终于正常出现页面了。接下来又是数据库无法登陆,这个按照网上是说明,选择附加进来的数据库,右键属性,如上图,文件–〉所有者–〉选择用户sa,即可用此sa用户登录数据库。
弄好了这些,都深夜2点多了。
7月份都过去大半了,今天才来写这个月的博客。今天可以来说一说最近发生的一件事情。
这个月,除了玩了很多的LOL外,就是写一个小应用了。某一次在威客网站上接了一个iOS的活,人家已经有android 的版本了,想再来一个iOS的,功能都比较简单。人家问我要多少钱,我很不自信,因为才学习iOS开发没有多久,所以准备说200块。然后又一狠心,又加了50块。
接着就轮到人家不相信了,我想如果从事开发的同学就知道,这个价格是非常低的了。在人家质疑能力的时候,幸好前不久在store上架了一个html5介绍的应用,于是人家也没有多说什么,当然这么低的价格也让人家最终选择了我。
当然最后结果还是不错的,人家主动说250块太低了,然后给加到350块了,后来觉得和我合作很舒服,于是又给添加了350块。虽然钱真的不多,也就一顿饭的支出。但那种被认可的感觉,真的很爽。
因为这个事情,妹子把我说了好几顿了。正所谓万事开头难嘛~再接再励好了。
今天拿到一个 pad mini,所以就想看看糗事在pad 上运行的效果是什么样子的。先在网页上添加了设备的唯一编号,然后运行。结果就报错,弹出错误提示为 “a valid provisioning profile for this executable was not found”。
网上查询了下,大致都是说证书的问题,我印象只是记得在 xcode 的界面中曾提示过什么密码不正确。后来又查看了 provisioning profile ,发现果然没有选择新添加的设备。勾选并重新生成证书,下载安装。问题解决了。
第一个iOS应用终于上架了。这是一个分享传播html5知识的简单应用。历时3个月,被拒绝了5次。通过审核时,真是感觉泪流满面啊。
由于E文水平很菜,当初想了解下苹果从开发到上架的整个流程,于是就想写一个简单的应用尝试看一看。我的很多朋友都是在做前端开发,所以就选择以 html5 作为切入点。
其实最头疼的是没有设计参与进来,所以界面简单而且丑陋。苹果的审核是很严格的,对于不会做设计的我来说,实在是有点难为我。由于程序功能简单,网上很多的界面都只有参考意义。
后来有一次看到微博上一个讲述统计的图片,有点感觉,于是使用了四叶草的变形。也恰好符合程序的几个功能菜单。在最开始的版本里,有放一个广告墙的推荐。被拒绝后在原因描述里说违反了苹果的策略。按说在应用里放广告是很正常的事情,不知道为什么会拒绝。只好给移除掉。
位置是空闲出来了,但是接下来要考虑填充的内容,恰好在看一个 cover flow的特效,那天在家在翻阅一本前端开发的书籍,当时就决定使用这个特效来推荐一些关于 html5的书籍。于是也就有了现在的样子。
应用最初出发点是想熟悉流程的,被苹果拒绝后,看着页面上显示 reject 字样,有点强迫症的我,又开始不甘心了,坚持要给做到通过。是的,最后我坚持下来了,不知道是不是因为他们的审核团队比较烦我才给通过的。
丑是丑了点,我接受各位同学的鄙视,不过你们谁有比较好的设计资源,一定要告诉我呀。
上一个应用中的下拉刷新我是自己摸索着写的,不过是针对 UITableView 的,这次的应用是要针对一个 UIScrollView ,就想用现成的,反正大概原理都差不多,没有必要重复造轮子。于是选择了 EGORefreshTableHeaderView 。
下午就边网上搜索边尝试使用,但是发现这个组件里的文字使用了多语言设置,诶呀我去,我的应用根本不需要多语言,估计写代码的多少都和我一样有点强迫症,于是按照它的结构来添加多语言处理,没有修改源码,顺便就当学习下如何使用多语言呗。
添加语言时,弹出了一个对话框,大概是问是不是要引用系统默认的英文。一想应用又不上国外市场,要着毛用。就取消,然后选择英文,点击删除。列表里干净了,洁癖的人你伤不起。准备添加中文,但是这个时候添加不了了。
对话框里只有一个 Choose files and reference language to create **** localization ,无法下一步了,在这下班的点来了这么下,网上一顿好找,google 时不时和谐,后来终于在 stackoverflow 的某个网页上发现了方法,现在放出来,方便和我一样E文是个半吊子的人。
右键点击*.xcodeproj 文件,选择显示包内容,然后编辑 project.pbxproj 文件,搜索/* End PBXSourcesBuildPhase section */字符,在这个段落的后面添加一个新的段落如下:
/* Begin PBXVariantGroup section */
27548D921611B0BE008EA1CD /* Localizable.strings */ = {
isa = PBXVariantGroup;
children = (
27548D941611B0BE008EA1CD /* en */,
);
name = Localizable.strings;
path = ../Code;
sourceTree = “<group>”;
};
/* End PBXVariantGroup section */
到这里都还算简单,后面的步骤我是摸索了才明白。
接下来,在项目中添加 Localizable.strings 资源文件,然后在project.pbxproj文件中搜索 /* Localizable.strings in Resources */ 字符串,找到前面的字符串标志,替换我红色标记的部分。记得喔,绿色部分的不要替换,我给替换了然后 xcode 直接崩溃掉。蓝色部分的 path 我就不清楚啥意思了,原帖中只是说让大家自己尝试就知道什么情况了。我看了下project.pbxproj里其它地方对于 Localizable.strings 文件有 path 关键字的描述,最后给修改成 Localizable.strings 这个字符串了,而非上面的 ../Code。
重新打开项目,系统默认的语言就又回来了。接下来就是该怎么办就怎么办了,真长姿势。
后面的总结就是,XCode 真心木有 VS 好用。
昨天编译的时候,突然间给跳出了编译错误。File was built for archive which is not the architecture being linked (arm7s)。反正也看不懂英文,就拿错误信息在网上搜索了下,有人说是修改 build setting ,按照操作,发现木有效果。
于是又重新搜索,发现了解决的方法。XCode -> Project Setting -> BuildSettings -> Build Active Architechure Only 从No改成Yes .
问题解决,编译后果断提交审核。
在我们的 metro/modern 应用中,如果我们的程序想实现直接跳转到微软的windows store中的话,可以参考下面的方法,这些也是我在翻 MSDN 的文档中看到的。
使用协议,关于自定义协议的文章,可以看衣服自己洗的文章。
通过ms-windows-store协议来实现。目前该协议支持3种行为,分别为 PDP、Updates、Search。首先我们要知道应用程序的包名,把应用程序的包名作为参数传递过去就可以了。如果是应用程序本身的话,可以通过 Package.Current.Id.FamilyName 来获得。
完整的程序代码:
await Launcher.LaunchUriAsync(new Uri(“ms-windows-store:PDP?PFN=” + Package.Current.Id.FamilyName));
PDP 是打开应用的列表页,参数 PFN 为应用程序的包名。Updates 是打开 store 的更新页。Search 是打开store 的搜索结果列表页,参数 query 是搜索关键词。
最近在一个android 项目中,想对一个字符串变量做 switch 判断,居然提示说有语法错误,感觉太不可思议了。然后按照 Eclipse 的智能提示,自动做修复。但是在对话框中给出了错误信息,Android requires compiler compliance level 5.0 or 6.0. Found ‘1.7’ instead. Please use Android Tools > Fix Project Properties.
在网上搜索了一把,很多文章都写的是在项目上右键 ->android tools->Fix Project。如果不可以,检查Project->Properties->Java Compiler ,确认是 1.6 。
按照这个操作了后,无论修改成 1.6 还是 1.7还是不可以,很是气愤呀。后来无意见看到到了一个,说是需要确保android sdk中有Android1.6(API4)。果断去下载了,然后把 java compiler 改成 1.7 后,问题解决了。
这真是太奇怪了。
最近工作中有遇到这样的一个需求,就是在metro应用中,想调用指定的windows桌面程序来做一些事情。于是就琢磨了下,使用自定义协议来实现的。
其实我们接触自定义协议,用的最多的就是腾讯的 tencent:// 了,可以实现在网页中调用QQ的添加好友界面了。我们常见的协议有 http ftp svn 等。当由于实际业务中这样或者那样的实际需要时,我们可以使用自定义协议来满足我们的要求。
为系统添加自定义协议很简单,最简洁的是2步。首先,我们在注册表 HKEY_Classes_Root 下添加协议的名称做为项,例如 zyx,为该项添加一个字符串“URL Protocol”,值为空字符串。接下来,我们再为该协议设置关联程序,在 HKEY_Classes_Root\zyx 下创建项 shell ,在 shell 下创建项 open ,在open 下创建项 command ,为该项设置默认值为应用程序的绝对路径,如果再路径的后面再添加 “%1” 的话,就表示可以接受额外的参数。
这里我给出 .reg 文件好了,很方便开发时使用。
Windows Registry Editor Version 5.00
;添加自定义协议
[HKEY_CLASSES_ROOT\zyx]
“URL Protocol”=””
;设置关联程序
[HKEY_CLASSES_ROOT\zyx\shell\open\command]
@=”c:\\launch.exe %1″
把上面的代码直接保存为reg文件,双击导入到注册表即可。这里有几个小知识点可以说下,reg文件里的注释是以;开头的,如果是多行注释,那么每一行都需要添加分号。如果路径不存在,那么系统会自动创建路径。设置关联程序时,默认值的内容文本里如果包含斜杠的话,那么应该使用双斜杠,和注册表路径区分出来。如果是反注册的话,只用在 HKEY 字符的前面添加一个-,同时去掉设置即可。
在一开始的时候,为注册表添加协议关联,我还犹豫是选择 bat 格式呢还是选择 inf 格式,后来还是决定用 reg 格式了。容易理解,很方便。
我们的项目中,想在metro下启动windows应用程序,下面来讲述如何使用。
比如说代码中直接这样执行,bool flag=await Windows.System.Launcer.LaunchUriAsync(new Uri(“zyx://ooxx-with-you”)); 在运行的时候,就会运行我们在注册表里设置的关联程序 launch.exe ,同时把 zyx://ooxx-with-you 作为参数传递过去。
有了参数传入,那么程序就可以做各种逻辑操作了。对于参数,我衣服自己洗这里就多啰嗦2句,虽然对于协议来说,zyx 是协议的名称,但是为了和其它协议作为格式上的一致,我们还是要添加上 :// 标志,作为区分也是好的嘛。另外,在参数中需要考虑2个问题,第一个是符号的问题,如果是特殊符号例如空格什么的,需要考虑编码问题。如果是网页中的地址,IE 会自动帮我们转码,但是其它的部分程序又不会例如资源管理器。所以为了避免编码问题带来的潜在风险,就不要使用特殊符号了。第二个问题是,自定义协议是在注册表里设置的,谁都可以调用,为了安全考虑,关联程序需要对接收到的参数进行检查。当然咯,检查的方法是需要自己来实现的。
有的同学还不是很了解应用场景,这里说一个。metro 应用程序是运行在沙盒中的,metro IE 同样也是的,在有网银、ActiveX的页面中,可能会有些问题,虽然未来可能会有解决方案,但是目前的一个思路就是,系统跳回桌面,使用 desktop 下的 IE 来打开,这么一来,使用自定义协议不就可以解决我们的问题了么。
其实,还有扩展名的解决方案,在我的demo中也实现了,和自定义协议大同小异,就留给大家去思考啦。