在iPhone模拟器上测试iOS应用程序,亦或任何手机的PC端模拟器,最难模拟的恐怕就是多指触摸,因为咱PC上没有这个硬件输入设备呀。
虽然MacBook系列的触摸版支持多指触摸,但是也不能实现先定位,再触摸。
后来我无意中发现,在iPhone模拟器上,按住Option键,效果看图中,这时你就能模拟双指触摸了。当然,只能模拟二指水平拖动、旋转效果。要想模拟捏合手势?按住Option-Shift键就行了。
———
转自:http://www.liheran.com/?p=193
NSLog(@"字符串处理"); //获得字符串长度 NSString* str1=@"MAC OS Pro"; NSLog(@"长度是 %d",[str1 length]); //两个字符串连接 NSString* str2=@"MAC OS Pro"; NSString* str3=@" Leopard"; NSString* str4=[str2 stringByAppendingString:str3]; NSLog(str4,nil); NSString* str5=[str2 stringByAppendingFormat:@" %d",10]; NSLog(str5,nil); //可修改字符串 NSMutableString* string=[NSMutableString string]; [string appendString:@"Mac"]; [string appendString:@" OS"]; [string appendString:@" X"]; NSLog(string,nil); //插入字符串 NSMutableString* string1=[NSMutableString stringWithFormat:@"Mac X"]; [string1 insertString:@"OS " atIndex:4]; NSLog(string1,nil); //删除字符串 NSMutableString* string2=[NSMutableString stringWithFormat:@"删除字符串"]; [string2 deleteCharactersInRange:NSMakeRange(0, 2)]; NSLog(string2,nil); //字符串比较 BOOL result; result=[string isEqualToString:string1]; NSLog(@"%d",result,nil); //比较前置串与后置串 NSString* string3=@"Mac Pro"; NSString* string4=@"Mac OS"; //判断是否以Mac开头 result=[string3 hasPrefix:@"Mac"]; NSLog(@"%d",result,nil); //判断是否以OS结尾 result=[string4 hasSuffix:@"OS"]; NSLog(@"%d",result,nil); NSString* string5=@"This is Mac OS X"; //检索字符串 NSRange range; range=[string5 rangeOfString:@"Mac OS"]; if (range.location!=NSNotFound) { //得到字符串的位置和长度 NSLog(@"%d,%d",range.location,range.length); } else { NSLog(@"没有发现",nil); } //抽取部分字符串 NSString* string6=@"This is Mac OS X"; NSString *nstr1,*nstr2,*nstr3; //从开头抽取字符串 nstr1=[string6 substringToIndex:4]; NSLog(nstr1,nil); //抽取末位位置的字符串 nstr2=[string6 substringFromIndex:8]; NSLog(nstr2,nil); //抽取指定范围的字符串 nstr3=[string6 substringWithRange:NSMakeRange(5,2)]; NSLog(nstr3,nil); |
//结果
2011-10-20 14:05:43.940 StringProcessing[1870:1307] 字符串处理
2011-10-20 14:05:43.942 StringProcessing[1870:1307] 长度是 10
2011-10-20 14:05:43.943 StringProcessing[1870:1307] MAC OS Pro Leopard
2011-10-20 14:05:43.943 StringProcessing[1870:1307] MAC OS Pro 10
2011-10-20 14:05:43.944 StringProcessing[1870:1307] Mac OS X
2011-10-20 14:05:43.945 StringProcessing[1870:1307] Mac OS X
2011-10-20 14:05:43.945 StringProcessing[1870:1307] 字符串
2011-10-20 14:05:43.946 StringProcessing[1870:1307] 1
2011-10-20 14:05:43.946 StringProcessing[1870:1307] 1
2011-10-20 14:05:43.947 StringProcessing[1870:1307] 1
2011-10-20 14:05:43.947 StringProcessing[1870:1307] 8,6
2011-10-20 14:05:43.948 StringProcessing[1870:1307] This
2011-10-20 14:05:43.948 StringProcessing[1870:1307] Mac OS X
2011-10-20 14:05:43.949 StringProcessing[1870:1307] is
————
转自:http://www.cnblogs.com/CCSSPP/archive/2011/10/20/2218897.html
php调用thrift,今天碰上了一个看似诡异的问题:php调thrift的一个方法,传递一个参数“6010101033”,可到了java端取到的时“6442450943”,开始以为是哪个地方写错了,全局搜索“64…”也没搜到什么结果~~~后来java端的同事说“可能是越界了”~~~嗯,还真有可能:thrift定义使用的是i64,php内部接收get参数,会做字符串处理,但当调用thfift接口时,貌似默认会将数值按照integer类型传递,相当于thirft的i32,对于超出范围的数值,自然就要出问题了
发现了问题,解决起来自然就是很容易的事,”$id = (double)$id;”,强制转成double,测试ok了
ps:这里转成string是没有用的,因为本来就是string类型,string转数值时才出的问题
从一开始使用thrift就被告诫说数值类型需要做强制类型转换,但由于php基本不怎么区分类型,所以一直也没做过这种转换,也没有发现过问题,但是随着业务的扩大,id慢慢长大,问题便逐步暴漏了~~~常在河边走,哪能不湿鞋~~~~以后还是小心点吧
之前在android-eclipse内搞phoneGap项目,照着phoneGap官网的“开发入门”,很容易就部署成功了helloword项目~~~java的最大优势:什么东西都可以一个jar包搞定
但今天搞phoneGap ios项目却颇废了一番周折,究其原因,一来是第一次搞xcode,不熟悉;二来是phoneGap官网的ios“开发入门”写的真不什么样,云里雾里
下面把关键的几步说一下:
1. 下载最新的phoneGap,安装里面的ios/PhoneGap-x.dmg
2. 打开xcode,“new project”,选择“phoneGap-based Application”,新建你的项目
3. 点击左上角的“Run”,这时,会打开iphone模拟器,打开你的项目,显示找不到index.html的错误~~经过这一步,你的项目目录下会生成www目录,但还不会出现在xcode中
4. 在xcode的左侧项目导航中,选择你的项目,按住ctrl,右击,选择“Add Files To “helloword””,在弹出菜单中,将你项目下的www目录添加到项目中,下方的“folders”选择“Create Folder References For Any Added Folders”,“Add”,此时,左侧项目导航中会出现xcode
5. 这是再点击左上角的Run,在模拟器中可以看到刚才添加的index.html中的内容
6. 貌似,在xcode的左侧项目导航中,是无法在www目录下建立文件夹和js、html等文件的,别急,可以直接Finder窗口中打开www目录,然后新建这些东西,xcode会立即显示出来,你就可以在其中编辑它啦
————
参考:http://mobile.51cto.com/web-334924.htm
macbook用了快三年了,250G的硬盘一直用的紧紧巴巴的,剩余空间从来没有多于30G,电影、照片不敢多放(作为一个比较恋旧的人,这一点很痛苦),双系统也装不了(作为一个喜欢玩游戏的人,更痛苦)~~~~换硬盘!
开始时也考虑要不要干脆搞个SSD的,速度快,还时髦,但容量太小,价格太高,也就作罢了,还是保守点吧
本来准备直接换1T的,但看1T的2.5硬盘只有日立的,评价也不怎么好~~~750G也还可以
硬件方面,给mac换硬盘,和给其他电脑换硬盘并没有什么差别:打开后盖,拧开螺丝,换上新硬盘,装上后盖~~~ok
换硬盘最关心的还是原硬盘内的东西能不能安全的复制到新硬盘上。以前用win的时候,换硬盘的时候顺便做了新系统系统,然后把旧硬盘装到硬盘盒里,把东西倒过去,再把应用重装一遍~~但是这个过程实在太麻烦了~~特别是已经做了将近三年的系统
与win不同,mac系统内置了很多可以方便备份、迁移的工具,可以轻而易举的将整个硬盘内的东西原封不动“搬迁”到新硬盘,下面大概说一下迁移的步骤(顺便说一句,这里说的是之前没使用time machine的步骤,如果之前一直在用time machine,会比下面的步骤省事的多):
最后去掉time分区的这一步,看你实际需要,这种备份方式倒是很方便,不用插USB,time machine会自动备份;不过个人感觉,将备份和系统放在同一个物理磁盘上,备份的价值就大打折扣了
另一个需要注意的问题是,之前看到的一篇文章说,如果系统做过升级,比如现在的系统是狮子,但系统光盘是雪豹,用上面的方式可能是不行的,需要先用光盘装上雪豹,再升级到狮子,最后再用time machine恢复
jquery mobile自带丰富的ui组件,更有codiqa提供了可视化的在线html生成工具,使用起来及其方便,很容易就可以搭建出漂亮的前端应用。
使用jqm的标准书写的组件,在其母“page”被加载时,jqm会将这些组件附加更加丰富的样式以及基础的事件处理程序,包括各种列表样式、icon、页面转场效果等等
但过度智能化也的使得使用中碰上了一个绕不开的问题,两周以来一直没找到好的解决办法:上面说,只有当一个page被加载时,jqm才会对html组件进行处理,附加样式和时间,而page一旦被加载过,再对这个page的内容进行修改,jqm就不会再对它做处理了,也用不了jqm的样式。
开始的时候,试了“$.mobile.initializePage()”,但是它只对第一个page的第一次加载有效,否则除非重新刷新页面页面。
然后又将希望寄托在“$.mobile.changePage(page, optional);”,但是只有当page是一个url地址时,被加载的页面才可会被jqm处理。
找遍了jqm中文和英文的api也再没有发现更好的办法
……….
今天,无意中,在一个叫做“移动互联网”的QQ群里看到了解决方法:“$(page).trigger(“pagecreate”);”~~~~有效!
pagecreate:jqm自定义的事件,页面初始化时,初始化之后触发
使用trigger(“pagecreate”)也就是强制jqm再对page做一次初始化
———————
不足50行的js模板引擎,支持各种js语法:
<script id="test_list" type="text/html"> <%= for(var i = 0, l = p.list.length; i < l; i++){ var stu = p.list[i]; =%> <tr> <td<%=if(i==0){=%> class="first"<%=}=%>><%==stu.name=%></td> <td><%==stu.age=%></td> <td><%==(stu.address || '')=%></td> <tr> <%= } =%> </script> |
“<%= xxx =%>”内是js逻辑代码,“<%== xxx =%>”内是直接输出的变量,类似php的echo的作用。“p”是调用下面build方法时的k-v对象参数,也可以在调用“new JTemp”时设置成别的参数名
调用:
$(function(){ var temp = new JTemp('test_list'), html = temp.build( {list:[ {name:'张三', age:13, address:'北京'}, {name:'李四', age:17, address:'天津'}, {name:'王五', age:13} ]}); $('table').html(html); }); |
上面的temp生成以后,可以多次调用build方法,生成html
一下是模板引擎的代码:
var JTemp = function(){ function Temp(htmlId, p){ p = p || {};//配置信息,大部分情况可以缺省 this.htmlId = htmlId; this.fun; this.oName = p.oName || 'p'; this.TEMP_S = p.tempS || '<%='; this.TEMP_E = p.tempE || '=%>'; this.getFun(); } Temp.prototype = { getFun : function(){ var _ = this, str = $('#' + _.htmlId).html(); if(!str) _.err('error: no temp!!'); var str_ = 'var ' + _.oName + '=this,f=\'\';', s = str.indexOf(_.TEMP_S), e = -1, p, sl = _.TEMP_S.length, el = _.TEMP_E.length; for(;s >= 0;){ e = str.indexOf(_.TEMP_E); if(e < s) alert(':( ERROR!!'); str_ += 'f+=\'' + str.substring(0, s) + '\';'; p = _.trim(str.substring(s+sl, e)); if(p.indexOf('=') !== 0){//js语句 str_ += p; }else{//普通语句 str_ += 'f+=' + p.substring(1) + ';'; } str = str.substring(e + el); s = str.indexOf(_.TEMP_S); } str_ += 'f+=\'' + str + '\';'; str_ = str_.replace(/\n/g, '');//处理换行 var fs = str_ + 'return f;'; this.fun = Function(fs); }, build : function(p){ return this.fun.call(p); }, err : function(s){ alert(s); }, trim : function(s){ return s.trim?s.trim():s.replace(/(^\s*)|(\s*$)/g,""); } }; return Temp; }(); |
核心是将模板代码转变成了一个拼接字符串的function,每次拿数据call这个function。
因为主要是给手机(webkit)用的,所以没有考虑字符串拼接的效率问题,如果需要给IE实用,最好将字符串拼接方法改为Array.push()的形式