当我们都老的时候说句再见,但心未曾离开 - 献给曼联的11号吉格斯

<p></p><div style="page-break-after: always;"><span style="display: none;"><!--more-->& nbsp ;</span></div><p>
北京时间5月19日,曼联球员吉格斯宣布退役,从当年的青葱少年,到如今泛白的两鬓,吉格斯把自己的青春献给了曼联,献给了红魔球迷。</p><p>看到了这篇报道,突然心里颤了一下,之后回忆的黑匣子就打开了,那年曼联的7号已经不是坎通纳的了,是年轻的贝克汉姆的,那年曼联的双翼一个 11 一个 7 是多么让人羡慕的搭配 吉格斯一个伟大的左边路。至今也未曾有几个像他这样的好左路。</p><p>退役了,想起来我刚认识他的时候,是因为贝克汉姆吧。之后慢慢的了解了曼联,了解吉格斯,那年我96年。我们都有自己崇拜的球星,当然吉格斯只是我喜欢的众多球星的一个。 当看到他双鬓斑白的样子,我突然觉得我也老了,因为我所爱戴的球星都陆陆续续退役了,时代变了,那些伟大的球星再也回不来了,想起我的足球生涯,如果不是意外,也许我也会在绿茵场上挥洒汗水吧。</p><p>吉格斯,当我们都老的时候,微笑着说声再见,然后转身,让人们看到你的背番号,让人们永远记住你 和你的背影,就算转身是为了掩盖哭泣,我知道,你的心未曾离开。</p>

阅读剩余部分 -

移动APP营销的8大创意路径

<p>这是一个以APP为主要载体的时代,连楼下卖羊肉串的大叔,订单80%都来自微信,人们的时间和精力几乎被各类APP瓜分。但i黑马提醒各位,对移动App来说,用户数量的多少决定着它的成败。如何通过得当的营销方式快速获取用户?</p>

阅读剩余部分 -

flex中menubar控件的赋值问题

<div><wbr />看了《Flex第一步》的说法,做了个例子如下:</div><div><font face="宋体">var _dataAry:XMLList=new XMLList( <wbr /> <wbr /> <wbr /></font></div><div><font face="宋体"><menu>
 <wbr /> <wbr /> <wbr /> <menuitem label="MenuItem A" data="Menu A">
 <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <menuitem label="SubMenuItem A-1" enabled="false" data="Menu A-1"/>
 <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <menuitem label="SubMenuItem A-2" data="Menu A-2"/>
 <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> </menuitem>
 <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <menuitem label="MenuItem B" data="Menu B"/>
 <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <menuitem label="MenuItem C" data="Menu C"/>
 <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <menuitem label="MenuItem D" data="Menu D">
 <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <menuitem label="SubMenuItem D-1"
 <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> type="radio" groupName="one" data="radio 1"/>
 <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <menuitem label="SubMenuItem D-2"
 <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> type="radio" groupName="one"
 <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> selected="true" <wbr /> data="radio 2"/>
 <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <menuitem label="SubMenuItem D-3"
 <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> type="radio" groupName="one" <wbr /> data="radio 3"/>
 <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> </menuitem> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /></font></div><div><font face="宋体"></menu> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr />
 <wbr /> <wbr /> <wbr />);
 <wbr /> <wbr /> <wbr />
 <wbr /> <wbr /> <wbr />_sampleMenuBar.dataProvider=_dataAry;
 <wbr /> <wbr /> <wbr />_sampleMenuBar.labelField="@label";</font><div style="page-break-after: always;"><span style="display: none;"><!--more-->& nbsp ;</span></div></div><div> <wbr /></div><div>发现会把xmllist的全部内容变成菜单根部,查阅flex自带帮助看到里面这段话:</div><div><ul> <li>With the <samp class="codeph"><mx:XML></samp> tag you must have a single root node, and you set the <samp class="codeph">showRoot</samp> <span>property of the <span class="resultofText" name="resultofMatch">MenuBar</span> control to</span> <samp class="codeph">false</samp><span>. (otherwise, your <span class="resultofText" name="resultofMatch">MenuBar</span> would have only the root as a button). With the</span> <samp class="codeph"><mx:XMLList></samp> tag you define a list of XML nodes, and the top level nodes define the bar buttons.</li></ul></div><p>这段话已经很明白的告诉我们,当使用xml作为数据源的时候,只能有一个单独的根部节点,我们必须把showroot属性设置false,而如果 menubar必须有一个按钮作为顶级菜单项的时候,我们才把它设为true,而当我们使用xmllist作为数据源,根部节点会被定义为菜单按钮,所以 我们上面使用xmllist作为数据源根部节点为<menu>但是我们没有给它赋值,所以出现我们不想要得到的结果,可以 把<menu></menu>这个根部节点去掉或者给menu的根部节点赋值,例如<menu label="顶级菜单"></menu>,而如果去掉根部节点,会发现编译的时候flex builder会报错:</p><p><font face="宋体">1084: 语法错误: <wbr /> rightparen 应在 label 之前。</font></p><p>不管它,让它接着完成编译,发现可以正常运行,不知道什么原因,我使用flex3 beta3进行测试,正式版不知道如何。</p><p>而如果不想看到报错,就必须保留根节点,可以把根节点设为<></>,如果我们保留根节点,而且根节点有命名例 如<menu></menu>但是又不想在页面上出现根节点,可以把showroot设置为false来解决问题。</p><p> <wbr /></p><p>再来测试使用xml作为数据源,如下:</p><p><font face="宋体">var _dataAry:XML=new XML( <wbr />
 <wbr /> <wbr /> <wbr /><menu> <wbr /> <wbr />
 <wbr /> <wbr /> <wbr /> <menuitem label="MenuItem A" data="Menu A">
 <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <menuitem label="SubMenuItem A-1" enabled="false" data="Menu A-1"/>
 <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <menuitem label="SubMenuItem A-2" data="Menu A-2"/>
 <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> </menuitem>
 <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <menuitem label="MenuItem B" data="Menu B"/>
 <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <menuitem label="MenuItem C" data="Menu C"/>
 <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <menuitem label="MenuItem D" data="Menu D">
 <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <menuitem label="SubMenuItem D-1"
 <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> type="radio" groupName="one" data="radio 1"/>
 <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <menuitem label="SubMenuItem D-2"
 <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> type="radio" groupName="one"
 <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> selected="true" <wbr /> data="radio 2"/>
 <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <menuitem label="SubMenuItem D-3"
 <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> type="radio" groupName="one" <wbr /> data="radio 3"/>
 <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> </menuitem> <wbr /> <wbr /> <wbr /> <wbr />
 <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> </menu> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr /> <wbr />
 <wbr /> <wbr /> <wbr />);
 <wbr /> <wbr /> <wbr />
 <wbr /> <wbr /> <wbr />_sampleMenuBar.dataProvider=_dataAry;
 <wbr /> <wbr /> <wbr />_sampleMenuBar.labelField="@label";
 <wbr /> <wbr /> <wbr />_sampleMenuBar.showRoot=false;</font></p><p>注意最后一行:必须把showRoot属性设置为false</p><p> <wbr /></p><p>另外menubar侦听事件是这样写的:</p><p><font face="宋体">_sampleMenuBar.addEventListener(MenuEvent.ITEM_CLICK,clickHandle);</font></p><p> </p><p><font face="宋体">另外分享一个flex学习网站一个 </font></p><p>http://blog.flexexamples.com/<;/p>

阅读剩余部分 -

Flex安全沙箱

<p>Flex就是致力于RIA的应用,Adobe为了扩大战场,推出了AIR环境,那么此时采用Flex编写的程序在浏览器中与桌面环境下都可以很好的 移植了。像Flex与Flash这样奇怪的东西,战场不仅仅在浏览器上,还跑到了桌面环境下。一个很重要的安全模型就被提出了:Flash的安全沙箱。要 是没这样的安全策略,恐怕这个世界就不安宁了,当然初期,这个世界本身就不安宁。这样的策略是这些年逐渐完善的。</p><div style="page-break-after: always;"><span style="display: none;"><!--more-->& nbsp ;</span></div><p>其实说Flash的安全沙箱就包含进Flex了,因为本质都是Flash,都是运行在Flash Player这个容器中的,Flex仅仅是将程序员与设计人员分离了而已。</p><p>进入本次的主题- -。。</p><p>因为是笔记,所以不会详细,而且这些笔记来自我看的书籍与资料(这似乎是废话)。</p><p>安全沙箱包括:远程沙箱与本地沙箱。其实这个沙箱模型类似与浏览器中的同源策略。在同一域内的资源会被放到一个安全组下,这个安全组就被称为安全沙箱了。</p><p>在深入了解沙箱之前先得明确Flash Player的权限控制(我还是按照Flash CS3上的中文官方文档的名词来划分吧):</p><p>1、管理用户控制:</p><p>这指系统的最高权限用户,win下的Administrator,linux下的root等。有两种类型的控制:</p><p>a)、mms.cfg文件:数据加载、隐私控制、Flash Player更新、旧版文件支持、本地文件安全性、全屏模式等。
b)、" 全 局 Flash Player 信任"目录:当某些SWF文件被指定到这个受信任的目录下时,这些SWF 文件会被分配到受信任的本地沙箱。它们可以与任何其它SWF文件进行交互,也可以从任意位置(远程或本地)加载数据。该信任目录的默认路径 为:C:windowssystem32MacromedFlashFlashPlayerTrust。</p><p>2、用户控制:</p><p>相对于第1种,这里的用户是指普通用户。有这三种类型的控制:</p><p>a)、摄像头与麦克风设置:还记得ClickJacking的那个Flash DEMO么?
b)、共享对象存储设置:就是那个SharedObject了。
c)、 相对与"全局 Flash Player 信任"目录,用户权限这也有个"用户 Flash Player 信任"目录。默认路径:C:Documents and SettingsJohnDApplication DataMacromediaFlash Player#SecurityFlashPlayerTrust。</p><p>3、Web 站点控制(跨域策略文件):</p><p>就是家喻户晓的crossdomain.xml文件了,现在的安全策略是该文件只能存放在站点根目录下了,文件格式如:</p><p><?xml version="1.0"?>
<cross-domain-policy>
<allow-access-from domain="" />
</cross-domain-policy></p><p>随便看个例子:http://fanfou.com/crossdomain.xml。通过该文件的配置可以提供允许的域跨域访问本域上内容的权限。</p><p>4、作者(开发人员)控制:</p><p>开发者可以通过编码(在AS脚本中)指定允许的安全控制权限,如:</p><p>Security.allowDomain("www.xeye.us");</p><p>当然都支持通配符
了。这个通配符真是个瘟神,程序员可得谨慎使用,以免添加不必要的安全风险。</p><p>好,Flash Player的权限控制明了之后,现在可以来看看安全沙箱了。</p><p>1、远程沙箱:</p><p>这个远程沙箱控制着远程域上,浏览器环境中的安全策略,比如http://xeye.us/域 中的Flash文件就无法单刀直入地与http: //hi.baidu.com/ycosxhack域上的Flash文件交互。同一个域(严格域)下的所有文件属于一个沙箱,沙箱内的对象是可以互相返 回,而沙箱之间的对象需要交互的话,得靠上面介绍的权限控制的“Web 站点控制(跨域策略文件)”与“作者(开发人员)控制”进行了。</p><p>2、本地沙箱:</p><p>出来个本地沙箱,没办法,Flash与Flex文件可以在我们的桌面环境下运行。如果没有个很好的安全策略来限制这些功能不弱的AS脚本的话,那绝对是很危险的事。</p><p>它有三种类型:</p><p>a)、只能与本地文件系统内容交互的本地沙箱:顾名思义,就是该Flash文件在本地运行时是不能与网络上的对象进行通信的,而只能与本地对象进行交互。
b)、只能与远程内容交互的本地沙箱:还是顾名思义,此时的Flash文件要与远程域对象交互时,需在远程域上通过策略文件或以Security.allowDomain编码方式来设置访问策略(同远程沙箱)。此时不能访问本地文件。
c)、受信任的本地沙箱:完美了,上面介绍的权限控制中,管理用户与普通用户都有Flash Player信任目录的控制权限,只要将我们的SWF文件放到受信任目录内运行,那么这个Flash文件就可以与本地域和远程域通信了:)。</p><p>当然以上这些沙箱类型,我们可以通过编码来确定当前运行的Flash文件被分配到什么类型的沙箱中。还是通过Security类:Security.sandboxType,值:</p><p>Security.REMOTE(远程沙箱)
Security.LOCAL_WITH_FILE(只能与本地文件系统内容交互的本地沙箱)
Security.LOCAL_WITH_NETWORK(只能与远程内容交互的本地沙箱)
Security.LOCAL_TRUSTED(受信任的本地沙箱)</p><p>恩,Flash的安全沙箱就是这些笔记了,写到这,还不得不提下Flash的一些其他安全问题。这些安全问题大多围绕安全沙箱进行。</p><p>在我们发布Flash时生成的HTML文件内, <object>与 <embed>标签内的几个属性需要明确的。</p><p>allowNetworking:</p><p>该参数控制Flash文件的网络访问功能。有三个值:all(所有的网络API都可用)、internal(除了不能使用浏览器导航和浏览器交互的API外,其它的都可用)、none(所以网络API都不可用)。</p><p>allowScriptAccess:</p><p>这 是AS与JS通信的安全控制,还记得ExternalInterface的作用吗。有三个值:never(ExternalInterface的 call方法不能与HTML的JS脚本进行通信)、sameDomain(同域内就可以了,这是默认值)、always(这个就允许所有域了,比较危 险)。</p><p>allowFullScreen:</p><p>全屏模式的安全问题,这是一个boolean值,默认为false,不允许Flash全屏。全屏带来的安全问题莫非是用户界面欺骗这样的类型?我不是很清楚。</p><p>上 面这三个属性得区分好了啊。安全问题不仅这点,还有比如LocalConnetion的本地通信、共享对象SharedObject的使用、 E4X在AS中的使用、其它的Socket通信、一些网络API,比如全局的navigateToURL、Flash与其它非Flash的外部对象的通信 问题等等。这些安全问题大都围绕安全沙箱进行。Flash或者Flex文件可以做得很漂亮,很精彩,比如那些非常优秀的Flash动画与游戏,然而一定得 时刻保持警惕。</p><p> </p><p>关于Flex安全沙箱问题的解决</p><p>最近遇到了flex 的安全沙箱问题,找了很多资料发现不是都是和我,我的程序需要socket连接,而大多数讲的都是跨域文件读取的。我先把两种方法都总结出来:</p><p>跨域文件读取</p><p>方法一:在目标服务器上布署crossdomain.xml文件(我用的此方法很管用,放上就没问题了) 需要远程服务根目录定义有crossdomain.xml文件,如下:</p><p><?xml version="1.0" encoding="UTF-8" ?> <cross-domain-policy>     <allow-access-from domain=""/> </cross-domain-policy></p><p>方法二:使用代理,把Flex要访问的远程文件通过asp, php, jsp等脚本读取到本地,然后再由Flex去访问;</p><p>方法三:使用Adobe flash player 9 打开程序后,点击菜单栏中文件->创建播放器...即生成exe文件,运行exe文件即可突破安全限制;</p><p>方 法四:     1、找到这个文件夹:c:Documents and Settings&lt;UserName>Application         DataMacromediaFlash Player#Security     2、在其下建立一个名为"FlashPlayerTrust"的文件夹     3、在"FlashPlayerTrust"文件夹下新建一TXT文件,内容如下:         c:&nbsp;        d:&nbsp;        e:&nbsp;        f:&nbsp;    4、将该txt文件命名为:"myTrustFiles.cfg"     再打开你硬盘里的SWF文件,就不会出现那个烦人的安全设置提示窗口了!</p><p>方法五: 用HttpService它默认是有Proxy的,需要配置flex-config.xml,里面有一段: <http-service-proxy>      <whitelist>         ………………     </whitelist> </http-service-proxy></p><p>这个是白名单,一般情况下是注释掉的,也就是默认只有本地的http://{localserver}/https://{localserver}/*可以访问。其他的需要在flex-config.xml里的自行修改成需要的就可以了。</p><p>访问本地自然不会跨域,不过你肯定访问局域网其他机器了,所以是依照白名单规则,属于跨域</p><p>Socket沙箱问题</p><p>在 Flex中使用Socket进行通信时,也会受到Flash9的新安全策略的困扰. 解决方法不能像在Web服务器中布置一个crossdomain.xml来解决,或是在服务器上专门开启843端口来提供安全策略. 有一种方法就是在接收到客户端的连接后,向其发送 安全策略.</p><p>比如我是用JAVA来开发, 客户端的Flex会先搜索同域,及服务器的843口,看是否能得到安全策略,这时候Socket是先建立好的,可以在接收到Socket ,即Accept事件发生是,马上向其发送 策略串,否则客户端就会因为安全策略不过关,于断开, 如果成功获取策略,则客户端将断掉先前的那次Socket, 再真正进行程序中你要求的Socket连接请求.</p><p> </p><p> </p><p>1.网络访问的swf文件,Security.sandboxType值为remote,这种情况下通过服务器上的跨域文件crossdomain.xml判断是否能够跨域访问。比如http://site1/flash1.swf需要访问http://site2上的资源,则需要在site2服务器上crossdomain.xml中添加site1的访问许可。</p><p>2. 本地访问的swf文件,Security.sandboxType值为localTrusted、localWithNetwork、 localWithFile三者之一。localWithNetwork仅允许访问网络资源,localWithFile仅允许访问本地资 源,localTrusted两者均可。Flash9 Debug版本默认为localTrusted(?待确认),Flash10 Debug版本默认为localWithNetwork。</p><p>  因此在使用Flex进行编译时,如果访问本地资源将会产生安全沙箱错误。</p><p>  解决方法一:更改工程属性,Flex Compiler - > Additional compiler arguments</p><p>(Flex3),加上"-use-network=false",该选项强制Security.sandboxType为localWithFile,带来的问题是无法访问网络资源.</p><p>   解决方法二:更改工程属性,Run/Debug Settings - > Main ->Url or path to lauch,改为通过Url加载Flash,这样Security.sandboxType为remote,本地资源的相对路径也将作为网络相对路径进行 访问。</p><p>  解决方法三:通过设置Flash Player Trust directory,将swf文件所在目录放入Flash Player Trust directory中,这样该swf安全沙箱类型Security.sandboxType为localTrusted。(但该方法在Window Server 2003,Flash 10 Debug环境下暂未通过)</p><p>更多 详情参考 http://developer.51cto.com/art/201008/218294.htm<;/p>

阅读剩余部分 -

2014年4月移动Root工具类APP数据分析

    超级授权管理是由及ROOT授权管理分别是安卓root授权管理工具,作为管理用户Root权限长期留存于手机上,负责手机上各应用程序所需root权限的管理;
    百度一键root:是由百度出品安卓一键Root工具,操作简单,安全无风险,轻松获取最高权限。
    一键Root大师:是由国内著名应用开发团队卓大师OPDA Team开发完成的一款工具软件,旨在帮助用户方便、快捷的获取手机root权限。



阅读剩余部分 -

After Effects CS6 中文绿色破解版

<p>Adobe AfterEffects CS6中文版安装破解方法:</p><p>
1、先将Adobe CS6 破解补丁和Adobe AfterEffects CS6中文版下载到本地
2、以试用版方式安装Adobe AfterEffects CS6 并运行一次
3、解压Adobe CS6破解补丁,将得到的文件覆盖到Adobe After Effects CS6Support Files下的amtlib.dll</p><div style="page-break-after: always;"><span style="display: none;"><!--more-->& nbsp ;</span></div><p> </p><p>百度网盘下载地址         <span style="background-color:Lime;">猛戳我下载</span></p>

阅读剩余部分 -

防止装箱落实到底,只做一半也是失败

<p>.NET提供struct类型,正确使用可以减少对象数量,从而降低GC压力,提高性能。不过有时候我会发现,某些同学有这方面的意识,但是有时候一疏忽一偷懒,就没有得到相应的效果了。这里举一个真实的例子:假设我们要将一对int作为字典的键,用于映射到某些数据,那么你会怎么做?当然我们可以直接使用Tuple<int, int>,但这样就可能产生大量的对象。于是我们打算使用自定义的值类型:</p><div style="page-break-after: always;"><span style="display: none;"><!--more-->& nbsp ;</span></div><pre class="brush:csharp;">private struct MyKey { private readonly int _a; private readonly int _b; public MyKey(int a, int b) { _a = a; _b = b; }}</pre><p>这么做正确吗?假如你做一下测试,会发现它已经可以“正确使用”了,但实际上还是错误的。我们用它来做字典的键,会依赖GetHashCodeEquals两个方法,由于MyKey没有提供这两个方法,就会自动使用System.ValueType里的实现,这便引起了装箱。</p><p>好吧,那么我们就来实现一下:</p><pre class="brush:csharp;">private struct MyKey { // ... public override int GetHashCode() { // ... } public override bool Equals(object that) { // ... }}</pre><p>那么现在呢?可能现在您就会比较容易意识到,即便GetHashCode已经没有问题了,但是Equals方法还是会引起装箱,因为that参数依然是object类型。</p><p>怎么破?当然有办法,因为像HashSet<T>或是Dictionary<TKey, TValue>集合其实都不会直接调用GetHashCodeEquals方法,都是通过一个IEqualityComparer<T>对象来委托调用的:</p><pre class="brush:csharp;">public interface IEqualityComparer<in T> { bool Equals(T x, T y); int GetHashCode(T obj);}</pre><p>假如在创建集合的时候没有提供比较器,则会使用默认的EqualityComparer<T>.Default对象,它的构造方法是这样的:</p><pre class="brush:csharp;">private static EqualityComparer<T> CreateComparer<T>() { Contract.Ensures(Contract.Result<EqualityComparer<T>>() != null); RuntimeType t = (RuntimeType)typeof(T); // Specialize type byte for performance reasons if (t == typeof(byte)) { return (EqualityComparer<T>)(object)(new ByteEqualityComparer()); } // If T implements IEquatable<T> return a GenericEqualityComparer<T> if (typeof(IEquatable<T>).IsAssignableFrom(t)) { return (EqualityComparer<T>)RuntimeTypeHandle.CreateInstanceForAnotherGenericParameter( (RuntimeType)typeof(GenericEqualityComparer<int>), t); } // If T is a Nullable<U> where U implements IEquatable<U> return a NullableEqualityComparer<U> if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>)) { RuntimeType u = (RuntimeType)t.GetGenericArguments()[0]; if (typeof(IEquatable<>).MakeGenericType(u).IsAssignableFrom(u)) { return (EqualityComparer<T>)RuntimeTypeHandle.CreateInstanceForAnotherGenericParameter( (RuntimeType)typeof(NullableEqualityComparer<int>), u); } } // If T is an int-based Enum, return an EnumEqualityComparer<T> // See the METHOD__JIT_HELPERS__UNSAFE_ENUM_CAST and METHOD__JIT_HELPERS__UNSAFE_ENUM_CAST_LONG cases in getILIntrinsicImplementation if (t.IsEnum && Enum.GetUnderlyingType(t) == typeof(int)) { return (EqualityComparer<T>)RuntimeTypeHandle.CreateInstanceForAnotherGenericParameter( (RuntimeType)typeof(EnumEqualityComparer<int>), t); } // Otherwise return an ObjectEqualityComparer<T> return new ObjectEqualityComparer<T>();}</pre><p>可以看出,根据不同的情况它会使用各式不同的比较器。其中最适合我们的自然就是实现IEquatable<T>接口的分支了。于是我们可以这么做:</p><pre class="brush:csharp;">struct MyKey : IEquatable<MyKey> { // ... public bool Equals(MyKey that) { // ... }}</pre><p> </p><p>这才是最终符合我们要求的做法</p>

阅读剩余部分 -

随机文章

最近回复

分类

其它

友情连接

推广链接