1.$用作选择器, var e = $("h1 a");
var f = $("table tr:nth-child(even)")
2.$用作功能函数前缀 var str = ' Welcome to 86shichang.com ';
str = $.trim(str); //$.trim是jQuery的一个工具函数,实现去掉两边空格的功能
jQuery给我们提供了主要有7类工具函数
3.$相当于 window.onload 和$(document).ready(...)
例如:$(function(){...}); 里面的函数会在DOM树加载完之后执行 $(function) 是 $(document).ready()的简写方式,当DOM文档载入完成后执行相应的函数。
以下两个相等
$(document).ready(function(){
alert("Hello World!");
});
$(function(){
alert("Hello World2!");
});
4.$用来创建DOM元素
例如:$("<p>how are you?</p>")
创建DOM对象,注意必须有<p>和</p>或者是其他的html标签,如<h1></h1>,<span></span>
$('<div>86市场网</div>').appendTo('body');//动态创建一个div元素(以及其中的所有内容),并将它追加到body中。
5:$用作扩展jQuery
例如:$.fn.disable = function(){...}
6:使用jQuery和其他库
例如:Prototype库也是使用$符号,jQuery提供noConflict函数避免冲突,jQuery.noConflict();把$符号还原到非jQuery库定义的含义
当我们在VC或者VB或者VS环境下基于MSCOMM控件开发的软件发布后,是不是有种很爽的感觉,可以拿到别人的电脑上运行下你的软件,可是当你移植过去后却发现软件无法点击的动(别笑,我在开发C#软件时就是这样)或者出现如下图所示的情况:
这种情况一般出现在Windows7版本下,这说明MSCOMM32没注册,我们可以选择两种方法去解决,一种方法是当我们安装VC++6.0/VB6.0时,如果选择了ACtiveX控件项(自定义安装),MSComm控件就会自动安装在计算机上了,并在系统文件夹下多了3个文件:Mscomm.srg, Mscomm32.ocx,Mscomm32.dep;
此时,这里提供了两种办法,这两种办法是相辅相成的,大家一起结合着看便知道自己是否成功注册了:
第一种方法:首先须准备MSCOMM32控件的配件,至少如我所显示的这几个:
然后就是如何将其成功注册,在当前的文件下,新建一个记事本文件,内容是:
copy mscomm*.* %windir%\system32\ /y
Regsvr32 %windir%\system32\mscomm32.ocx /s
reg add "HKCR\Licenses\4250E830-6AC2-11cf-8ADB-00AA00C00905" /v "" /d "kjljvjjjoquqmjjjvpqqkqmqykypoqjquoun"
pause
然后将其命名为:注册.cmd
点击注册.cmd,注册成功!!!
---------------------------------------------------------------
第二种办法:
下载这三个文件Mscomm.srg, Mscomm32.ocx,Mscomm32.dep;将其放到C/Windows/System32下之后,用Windows下的注册工具regsvr32注册该OCX控件,
点击“开始”->"运行",再在中填入
Regsvr32 C:\Windows\System32\Mscomm32.ocx,会出现如下成功信息:
完成上面程序之后,在注册表中手工新建一个主键项:先在点击“开始”->"运行",再在中填入regedit命令打开注册表,找到HKEY_CLASSES_ROOT\Licenses,在其中添加主键:4250E830-6AC2-11cf-8ADB-00AA00C00905 并将内容设置为:kjljvjjjoquqmjjjvpqqkqmqykypoqjquoun
这样我们就完成了注册。
版权声明:本文为 testcs_dn(微wx笑) 原创文章,非商用自由转载-保持署名-注明出处,谢谢。 https://blog.csdn.net/testcs_dn/article/details/45438023 执行# ./glibc-2.14/configure 出现以下错误:
checking LD_LIBRARY_PATH variable... contains current directory configure: error: *** LD_LIBRARY_PATH shouldn't contain the current directory when *** building glibc. Please change the environment variable *** and run configure again. 问题分析: LD_LIBRARY_PATH不能包含当前目录,请修改环境变量并重新执行configure
解决方法:
[root@localhost opt]# echo $LD_LIBRARY_PATH :/usr/local/lib [root@localhost opt]# export LD_LIBRARY_PATH= [root@localhost opt]# echo $LD_LIBRARY_PATH [root@localhost opt]# ./glibc-2.14/configure
执行# ./glibc-2.14/configure 出现以下错误:
checking LD_LIBRARY_PATH variable... contains current directory configure: error: *** LD_LIBRARY_PATH shouldn't contain the current directory when *** building glibc. Please change the environment variable *** and run configure again. 问题分析: LD_LIBRARY_PATH不能包含当前目录,请修改环境变量并重新执行configure
解决方法:
[root@localhost opt]# echo $LD_LIBRARY_PATH :/usr/local/lib [root@localhost opt]# export LD_LIBRARY_PATH= [root@localhost opt]# echo $LD_LIBRARY_PATH [root@localhost opt]# ./glibc-2.14/configure
最近6个月开始做SLAM的项目,就一步步把资源的链接给共享出来。
项目内容:主要是从Andrew Davison中的MonoSLAM中起步,做Co-SLAM 推及 Swarm SLAM
下面都是我看过或者亲身实践过的,大家可以相互交流
项目途中,所以文章还是草稿,会实时的更新。
一,入门篇
1. Andrew Davison的课程: http://www.doc.ic.ac.uk/~ajd/Robotics/index.html
AD在在week 8里面推荐了slam的两个入门 Tutorial 1 和Tutorial 2
2. Tutorial的两篇文章文笔灰常秀丽,但是不操作还是云里雾里:
所以这里有一个瑞士苏黎世理工的学生练习
大家把excise 3:SLAM(EKF)做了,也就差不多了解些slam的原理了
关于练习3的答案,我过几天上传好, 答案
3. 对于我这个学渣来说,EKF其实还是比较难理解,所以推荐一本书,详见第三章,学霸无视
二、现有资源
1. OpenSLAM:https://openslam.org/
这个网站中含有很多slam方面的资料,编写的程序也各有不同,很权威
2. Kitti这个图库,大家可以下载做simulation:http://www.cvlibs.net/datasets/kitti/
3. 个人感觉exercise 3练习后,可以选择 Javier Civera 的程序进行试手,感觉灰常不错。注意对calibration的调整
http://webdiis.unizar.es/~jcivera/code/1p-ransac-ekf-monoslam.html
4. 对于JC的1p RANSAC-monoSLAM有一定了解了,可以试试用SURF去实现
这里有个南理工哥们的论文还不错,可以参考 http://cdmd.cnki.com.cn/Article/CDMD-10288-1012319519.htm
三、有用的书籍
1. Multiple View Geometry in Computer Vision Second Edition ,http://www.robots.ox.ac.uk/~vgg/hzbook/
计算机视觉方面大神级别的书,也有中文版,点此下载中英文双版
2. Robotics Vision and Control , pdf下载:http://robotics.itee.uq.edu.au/~metr4202/tpl/Robotics%20Vision%20&%20Control.pdf
通过MATLAB几乎把机器人学给贯穿了,里面每章节都有对应的Code,关于里面Matlab的codes,需要留言
澳大利亚昆士兰理工大学的Peter Corke是机器视觉领域的大牛人物,他所编写的Robotics, vision and control一书更是该领域的经典教材
-------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流>-----
1. throws声明异常
用throws关键字在方法中声明可能出现的异常。如果出现异常,这些异常只是被抛出,方法本身不对其做出处理,而是传给上级处理。
格式:在方法名和大括号之间加入throws 异常类 例如: public int method ( int a ) throws Exception {
}
可以声明多个异常,在异常类之间用逗号隔开
public int method (int a) throws Exception 1 , Exception 2 ,Exception3 {
}
党在方法中声明可能发生的异常时,为了让编译通过,有两种处理方式:
(1)在main方法中声明异常,即不做处理,交给虚拟机处理。
(2)在main中使用try捕获。
2. throw抛出异常
当异常发生时,在方法内部使用throw 关键字抛出异常,把它抛给上一级调用者。抛出的是异常对象或者异常引用。
例如:
public int method (int a) method throw Exception{
……….
throw new ArithmeticException();
………..
}
为了让编译通过,两种处理方式:
(1) 在方法上用throws声明异常。(常用)
(2) 使用try捕获。
1. throw 和 throws 的区别:
(1) throws是声明异常用在方法上,throw是抛出异常用在方法中。
最近在看了许多关于dp-px,px-dp,sp-px,px-sp之间转化的博文,过去我比较常用的方式是:
1 //转换dip为px 2 public static int convertDipOrPx(Context context, int dip) { 3 float scale = context.getResources().getDisplayMetrics().density; 4 return (int)(dip*scale + 0.5f*(dip>=0?1:-1)); 5 } 6 7 //转换px为dip 8 public static int convertPxOrDip(Context context, int px) { 9 float scale = context.getResources().getDisplayMetrics().density; 10 return (int)(px/scale + 0.5f*(px>=0?1:-1)); 11 } 然后看到了一种新的转化方式,代码如下:
1 public static int dp2sp(float dpVal){ 2 return (int)(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dpVal, 3 MyAppliction.getInstance().getApplicationContext().getResources().getDisplayMetrics())); 4 } 5 //????? 6 public static int sp2dp(float spVal){ 7 return (int) TypedValue.
link标签 作用:连接外部css样式表 属性:rel,type,href
Href表示本页面要链接到的地址,在这里可以使相对路径也可以是绝对路径,最好是相对路径。 Type表示的本页面链接到的页面的类型,这里是css样式表。 Rel,rel的英文全称是relation,它的作用就是来说明本页面和链接到的页面之间的关系。
代码演示:
<link rel="stylesheet" type="text/css" href="divTest.css">
带灯船型开关其实是很常见的,只不过比普通开关多了个灯,百度一圈竟然发现没人给出合理的接法,故发个经验图。真的是个很简单的东西。其中ABN就是带灯船型开关的三个引脚。M是负载。
#! /bin/bash clear function verify { if [ $1 -eq "Bob" ] && [ $2 -eq "555" ] then echo "Verified" else echo "Rejected" fi } verify Bob 555 运行时出现 (此处需要整数表达式) 错误
原因在于一个小错误:
"-eq" 对整数进行比较
"==" 对字符串进行比较,修改:
#! /bin/bash clear function verify { if [ $1 == "Bob" ] && [ $2 == "555" ] then echo "Verified" else echo "Rejected" fi } verify Bob 555
在某些场合可能需要禁止横屏和竖屏切换,实现这个要求很简单,只要在AndroidManifest.xml里面加入这一行android :screenOrientation="landscape "(landscape 是横向,portrait 是纵向)。不过android中每次屏幕的切换动会重启Activity,所以应该在Activity销毁前保存当前活动的状态,在 Activity再次Create的时候载入配置。在activity加上 android:configChanges="keyboardHidden|orientation"属性,就不会重启activity.而是去调用 onConfigurationChanged(Configuration newConfig). 这样就可以在这个方法里调整显示方式. if(newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE){ //横屏 setContentView(R.layout.file_list_landscape); }else{ //竖屏 setContentView(R.layout.file_list); }
例:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.ray.linkit" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".Main" android:label="@string/app_name" android:screenOrientation="portrait"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".GamePlay" android:screenOrientation="portrait"></activity> <activity android:name=".OptionView" android:screenOrientation="portrait"></activity> </application> <uses-sdk android:minSdkVersion="3" /> </manifest>
我心里面有两个小人。
一个叫愧疚,对CSDN这么一个分享知识的平台的愧疚,因为我正在做一件对不起CSDN的事情。
一个叫虚荣,对CSDN访问量的渴望过渡使得我踏出了这一步。
这一步,踏入了深渊。。
最终我的愧疚小人死了。。自杀的。。虚荣小人登上历史舞台。于是本篇博文发出。
下面这个脚本是用于自动增加CSDN访问量的shell脚本
首先说明一点,这个脚本是借鉴别人的一个评论稍作改动,加了一个循环而成。本来应该引用一下的,,但是一下子找不到了。。忘记了在哪里。。
原理很简单,就是利用curl工具不断的链接到一个指定的url
在mac或者linux下面,一般都有curl
没有的话
sudo apt-get install curl libcurl3 libcurl3-dev php5-curl 编写脚本
#autocsdn.sh #automatically send request to csdn blog user=hyichao_csdn articles='curl -s "http://blog.csdn.net/$user/" | grep 'href' | egrep -o "$user/articles/details/[[:digit:]]+" | sort | uniq' for i in `seq 1000` do for article in $articles do curl -s "http://blog.csdn.net/$article" > /dev/null sleep 10 echo "One Shot" done echo $i done 运行脚本
sh autocsdn.sh 一般大神,技术牛都不屑于这样子做,因为他们的访问量从来不是问题。。
alsa-lib移植笔记 http://blog.chinaunix.net/uid-21977330-id-3976786.html
l 下载alsa-utils, alsa-lib, 版本要一致 http://www.alsa-project.org/main/index.php/Download l 编译alsa-lib ./configure --host=arm-none-linux-gnueabi --disable-python --prefix=/usr/share/arm-alsa/ 如果出现下列错误信息,--disable-pyhont collect2: ld returned 1 exit status make[3]: *** [smixer-python.la] 错误 1 make[3]: Leaving directory `/home/enzo/work/tq2440/alsa/alsa-lib-1.0.26/ modules/mixer/simple' make[2]: *** [all-recursive] 错误 1 make[2]: Leaving directory `/home/enzo/work/tq2440/alsa/alsa-lib-1.0.26/ modules/mixer' make[1]: *** [all-recursive] 错误 1 make[1]: Leaving directory `/home/enzo/work/tq2440/alsa/alsa-lib-1.0.26/ modules' --with-alsa-inc-prefix和--with-alsa-prefix分别指定了交叉编译util应用所需要的alsa- lib的头文件和库文件;--disable-alsamixer表示不编译生成alsamixer这个应用程序,因为该程序依赖于ncurses这个图 形界面库,目前我们对于该库还不能交叉编译,故放弃 变换到root身份 # sudo su alsa-lib在make install时还需要交叉编译,因此需要将交叉编译器的路径加入到PATH环境变量中 #export PATH=$PATH:/usr/local/arm/4.3.2/bin && make install l 编译alsa-utils ./configure --host=arm-none-linux-gnueabi --prefix=/usr/share/arm-alsa/ --with-alsa-inc-prefix=/usr/share/arm-alsa/include --with-alsa-prefix=/usr/share/arm-alsa/lib --disable-xmlto --disable-alsamixer l 复制alsa-lib, alsa-utils 到开发板 开发板的复制路径不是随便设置,必须和主机编译时相同的路径,否则动态库无法找到某些文件 所以要把/usr/share/arm-alsa文件夹得内容复制到开发板/usr/share/arm-alsa 复制alsa lib到开发板/lib文件夹下 /dev 目录下已经包含一下设备 /dev/controlC0 ,/dev/pcmC0D0p , /dev/pcmC0D0c, /dev/mixer, /dev/timer [root@EmbedSky /]# ls /dev/pcm* /dev/pcmC0D0c /dev/pcmC0D0p [root@EmbedSky /]# ls /dev/con* /dev/console /dev/controlC0 [root@EmbedSky /]# ls /dev/mix* /dev/mice /dev/mixer [root@EmbedSky /]# ls /dev/tim* /dev/timer 测试aplay程序 [root@EmbedSky bin]# .
一、 SLB产生背景: SLB(服务器负载均衡):在多个提供相同服务的服务器的情况下,APV设备上存在VIP,当大量客户端从外部访问VIP地址时,负载均衡设备将这些报文请求根据负载均衡算法,将流量均衡的分配给后台服务器以平衡各个服务器的负载压力,避免在还有服务器压力较小情况下其他服务达到性能临界点出现运行缓慢甚至宕机情况,从而提高服务效率和质量,因此对客户端而言,RS的IP地址即是负载均衡设备VIP地址,真正的RS服务器IP地址对于客户端是不可见的。
二、 SLB的三种传输模式: 七层SLB和四层SLB的区别: 四层SLB:配置APV设备上服务类型为tcp/udp,APV设备将只解析到4层,APV与client三次握手之后就会和RS建立连接; 七层SLB:配置APV设备服务类型为http/ftp/https等,APV设备将解析报文到7层,在APV设备与client三次握手之后,只有收到对应七层报文,才会跟RS建立连接。 在APV设备中,SLB主要工作在以下的三种传输模式中: 反向代理模式 透传模式 三角模式 根据不同的模式,APV的工作方式也不尽相同,但无论在哪种模式下,客户端发起的请求报文总是需要先到达APV设备进行处理,这是负载均衡设备正常工作的前提。网络拓扑环境:
Client:10.8.21.40 APV:172.16.75.83 VIP:172.16.75.84 RS1IP:172.16.75.82 RS2IP:172.16.75.85 在整个报文交互过程中,采用Tcpdump和Wireshark分别在RS和Client处抓包,然后使用Wireshark进行报文解析。
三、 反向代理模式 : 反向代理:普通的代理设备是内网用户通过代理设备出外网进行访问,而工作在这种模式下的APV设备,则是外网用户通过代理设备访问内网,因此称之为反向代理。 在反向代理模式下: 当APV设备收到客户端请求后,会记录下此报文( 源IP地址、目的IP地址、协议号、源端口、目的端口,服务类型以及接口索引),将报文目的地址更改为优选后的RS设备的IP地址,目的端口号不变,源地址修改为APV设备下行与对应RS设备接口的IP地址,源端口号随机发送给RS; 当RS收到报文后,会以源为RS接口IP地址,目的APV设备地址回复给APV设备,APV设备将源修改为VIP,目的端口号修改为客户端的源端口号,目的IP修改为Client的源IP回复报文。 1 APV设备主要配置:
System mode reverse slb real http"service1http" 172.16.75.82 80 1000 tcp 3 3 slb real http"service2http" 172.16.75.85 80 1000 http 3 3 slb group method"rrgroup" rr slb group member"rrgroup" "service1http" 1 0 slb group member"rrgroup" "service2http" 1 0 slb virtual http"virtual1http" 172.
自己写的程序突然安装后图标不见了,在应用程序安装中能找到,但是桌面上就是没有图标,启动只能从最近列表中其中。。一般这种情况只会在服务类程序和测试程序中出现,因为不需要图标。
google无果,自己二分调试解决了,并测试了其他网友提供的其他会出错原因,大致总结如下:
1、AndroidManifest中application元素属性设置问题
属性设置错误
<application android:icon="@drawable/icon" android:label="@string/app_name"> 设置图标为icon,而上面的icon资源文件不存在
解决方法:添加icon资源文件
2、AndroidManifest中 没有activity设置android.intent.category.LAUNCHER category或android.intent.action.MAIN action
AndroidManifest没有任何activity
和时候你会发现如下提示信息,表示异步执行
[2012-03-25 ……] No Launcher activity found!
[2012-03-25 ……] The launch will only sync the application package on the device!
而程序已经安装在列表中,但并没有图标而且也没有将android.intent.action.MAIN属性的activity执行显示在屏幕最前端。
解决方法:在主activity中添加这两个属性
关于这两个属性的意思更多请参考:
3、main intent-filter同时配置了不同种类的action和data,配置如下: Xml代码 收藏代码
<activity android:name=".AccountManageActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> <data android:scheme="aone" android:host="AccountManageActivity" /> </intent-filter> </activity> 有网友说这种方式无法启动,但经过自己测试能启动只是不会显示图标而已
解决方法:分为两个intent-filter,如下 Xml代码 收藏代码
<activity android:name=".AccountManageActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter> <data android:scheme="
默认作用域 Spring IOC容器中,默认的bean作用域有两种:
singleton,这种作用域的bean一旦创建后bean的生命周期和容器同步,只有容器关闭时才会销毁这种bean,相同id的bean在容器的生命周期内只会被实例化一次,通过相同的id向容器请求时会返回相同的实例prototype,这种作用域的bean不会交给容器托管,创建之后不会注册到容器,它的生老病死完全由应用层决定,每次通过相同的id向容器请求bean时,容器都会创建一个不同的实例 自定义作用域 Spring框架提供了扩展机制让使用者自定义作用域,框架提供了两个关键的类实现自定义作用域
org.springframework.beans.factory.config.Scope接口,需要实现以下几个关键方法:
Object get(String name, ObjectFactory<?> objectFactory),使用者可以通过调用这个方法获取该作用域的bean实例,实现的大致逻辑应该,先作用域范围查找是否存在相应name的bean,如果存在直接返回,如果不存在调用objectFactory参数的getObject方法创建bean并且缓存在该作用域内Object remove(String name),使用者可以调用这个方法在该作用域下删除指定name的beanvoid registerDestructionCallback(String name, Runnable callback),注册bean的析构回调,作用域对象需要保存这写回调并且在bean被销毁触发这些回调Object resolveContextualObject(String key) org.springframework.beans.factory.config.CustomScopeConfigurer,这是一个BFPP,它的职责是把作用域注册到容器中
示例代码 下面通过一个例子来演示怎么自定义作用域并且分析框架中的代码自定义作用域是怎么实现,这个自定义scope的功能是把bean缓存到一个LRU缓存中,当bean被踢出缓存时触发析构回调
实现Scope接口,LRU缓存中最多只能放两个bean,被踢掉的bean会触犯析构回调,在removeEldestEntry方法中,析构回调保存在destructionCallback哈希表中:
public class LRUCacheScope implements Scope { private class BeanCache extends LinkedHashMap<String, Object> { private static final long serialVersionUID = -887300667768355251L; @Override protected boolean removeEldestEntry(Entry<String, Object> eldest) { boolean flag = size() > maxBeanNumber; if (flag) { executeDesCallback(eldest.getKey()); } return flag; } } private static final int DEFAULT_MAX_BEAN_NUMBER = 2; private Map<String, Object> beanCache = Collections .
为什么需要协程
在游戏中有许多过程(Process)需要花费多个逻辑帧去计算。你会遇到“密集”的流程,比如说寻路,寻路计算量非常大,所以我们通常会把它分割到不同的逻辑帧去进行计算,以免影响游戏的帧率。
你会遇到“稀疏”的流程,比如说游戏中的触发器,这种触发器大多数时候什么也不做,但是一旦被调用会做非常重要的事情(比图说游戏中自动开启的门就是在门前放了一个Empty Object作为trigger,人到门前就会触发事件)。
不管什么时候,如果你想创建一个能够历经多个逻辑帧的流程,但是却不使用多线程,那你就需要把一个任务来分割成多个任务,然后在下一帧继续执行这个任务。
比如,A*算法是一个拥有主循环的算法,它拥有一个open list来记录它没有处理到的节点,那么我们为了不影响帧率,可以让A*算法在每个逻辑帧中只处理open list中一部分节点,来保证帧率不被影响(这种做法叫做time slicing)。
再比如,我们在处理网络传输问题时,经常需要处理异步传输,需要等文件下载完毕之后再执行其他任务,一般我们使用回调来解决这个问题,但是Unity使用协程可以更加自然的解决这个问题,如下边的程序:
1. private IEnumerator Test() 2. { 3. WWW www = newWWW(ASSEST_URL); 4. yield return www; 5. AssetBundle bundle = www.assetBundle;
6. }
协程是什么
从程序结构的角度来讲,协程是一个有限状态机,这样说可能并不是很明白,说到协程(Coroutine),我们还要提到另一样东西,那就是子例程(Subroutine),子例程一般可以指函数,函数是没有状态的,等到它return之后,它的所有局部变量就消失了,但是在协程中我们可以在一个函数里多次返回,局部变量被当作状态保存在协程函数中,知道最后一次return,协程的状态才别清除。
简单来说,协程就是:你可以写一段顺序的代码,然后标明哪里需要暂停,然后在下一帧或者一段时间后,系统会继续执行这段代码。
协程怎么用?
一个简单的C#代码,如下:
1. IEnumeratorLongComputation()
2. {
3. while(someCondition)
4. {
5. /* 做一系列的工作 */
6. // 在这里暂停然后在下一帧继续执行
7. yield return null;
8. }
9. }
协程是怎么工作的
注意上边的代码示例,你会发现一个协程函数的返回值是IEnumerator,它是一个迭代器,你可以把它当成指向一个序列的某个节点的指针,它提供了两个重要的接口,分别是Current(返回当前指向的元素)和MoveNext()(将指针向前移动一个单位,如果移动成功,则返回true)。IEnumerator是一个interface,所以你不用担心的具体实现。
通常,如果你想实现一个接口,你可以写一个类,实现成员,等等。迭代器块(iterator block)是一个方便的方式实现IEnumerator没有任何麻烦-你只是遵循一些规则,并实现IEnumerator由编译器自动生成。
一个迭代器块具备如下特征:
1. 返回IEnumerator
2. 使用yield关键字
Android 平台提供了两类动画,一类是 Tween 动画,即通过对场景里的对象不断做图像变换 ( 平移、缩放、旋转 ) 产生动画效果;第二类是 Frame 动画,即顺序播放事先做好的图像,跟电影类似。本次讲解的是Tween动画。 一、View (1)对于控件View,android自身提供了动画效果Animation
参考文献:http://gundumw100.iteye.com/blog/850338
http://blog.csdn.net/rhljiayou/article/details/7194483
Animation是以XML格式定义的,定义好的XML文件存放在res\anim中。
Tween Animation,其由4种类型: Alpha:渐变透明度动画效果 Scale:渐变尺寸伸缩动画效果 Translate:画面转换位置移动动画效果 Rotate:画面转换位置移动动画效果
在介绍以上4种类型前,先介绍Tween Animation共同的节点属性。
属性[类型] 功能 Duration[long] 属性为动画持续时间 时间以毫秒为单位 fillAfter [boolean] 当设置为true ,该动画转化在动画结束后被应用 fillBefore[boolean] 当设置为true ,该动画转化在动画开始前被应用 interpolator 指定一个动画的插入器,有一些常见的插入器。accelerate_decelerate_interpolator:加速-减速 动画插入器;accelerate_interpolator:加速-动画插入器;decelerate_interpolator:减速- 动画插入器,其他的属于特定的动画效果 repeatCount[int] 动画的重复次数 repeatMode[String] 定义重复的行为 1:"restart" 2:"reverse" eg: android:repeatMode="reverse" startOffset[long] 动画之间的时间间隔,从上次动画停多少时间开始执行下个动画 zAdjustment[int] 定义动画的Z Order的改变 0:保持Z Order不变,1:保持在最上层,-1:保持在最下层
下面分别举例说明4种类型的动画的定义:
a、alpha渐变透明度动画效果
1 2 3 4 <alpha android:fromAlpha=” 0.1 ″ android:toAlpha=” 1.0 ″ android:duration=” 3000 ″ /> fromAlpha属性为动画起始时透明度 toAlpha 属性为动画结束时透明度 0.
年纪大了,不想在广州深圳飘荡,虽然工资能拿到2W,但一想起要背井离乡,常常加班,就心力不足。回到老家,本来想做小生意,但找不到合适的铺面,唯有利用专业知识网上创业了。做了几个网站,其中一个是本地的招聘网, 化州人才招聘网 免费的,目前还没有想好发展模式,只想把访问量搞上去,让本地的企业都在上面招聘。
这段时间一直在使用odoo8.0,但是由于8.0刚推出来没有多长时间,所以是不是会有新的代码放出来。于是将两种更新odoo的方法记录如下:
首先是odoo步科绿色版的代码更新
1.先将步科绿色版的source目录更改为其他名称,如source_bak。然后下载最新的步科绿色版,解压后,将里面的source目录复制到原source目录所在 的位置。
2.复制绿色版目录下的start.bat为一个新文件update.bat,然后编辑它。
title GreenOdoo - www.GreenOdoo.com COLOR OA SET PATH=%CD%\runtime\pgsql\bin;%CD%\runtime\python;%CD%runtime\win32\wkhtmltopdf;......%CD%\openerp-server.config 在代码的最后加上 -d Odoo80_CN_Demo -u all(注意开始有一个空格),其中需要把“Odoo80_CN_Demo”替换为自己真实的数据库名称。 3.更改完成后,双击执行此文件就可以了
4.别忘了最后删除掉source_bak文件,节约空间!
windows安装版的odoo更新如下:
当然最简单的方法是卸载掉,然后去官网下最新的版本重装。用以下方法就不用卸载了:
1.停掉odoo的服务(win+R,运行services.msc,找到odoo的服务,停止)
2.去官网下载最新的odoo源码(注意是源码,不要exe)
3.找到odoo的安装目录,进入到openerp目录下,删除掉所有的.pyc文件(pyc文件是编译过后的py文件,系统在执行的时候会优先执行pyc文件,可以提高速度)
4.将下载的源码中的openerp文件夹复制到安装目录的server文件夹下
5重启odoo的服务就可以完成更新了。