作者对C++的理解深入骨髓,又是顶级的教师,再加上他对本书的精益求精,铸就了C++书籍的一个神话。本书适合对C++和面向对象都有所了解的人,它不但用最合适的方式描述了C++是什么,还讲清楚了为什么。但更值得我们学习的是作者在字里行间所透露的他对编程、对设计、对面向对象思想的理解以及永无止境地追求更高境界的态度。
while (前两章不能很好地理解) {
if (第一次看) {
看完全书;
} else {
sleep(一年); // 其它线程可不能睡,得抓紧时间夯实基础
}
}
步骤:(1)、增加struts的扩展名<constant name="struts.action.extension" value="action,htm" />,struts2拥有了两个扩展名action和htm
(2)、 在web.xml中配置struts2的核心控制器将*.ation,*.htm的请求交给struts2来处理
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
<filter-mapping>希望大家支持千山暮雪
<filter-name>struts2</filter-name>
<url-pattern>*.htm</url-pattern>
</filter-mapping>
(3)、配置具体的action
<package name="news" extends="struts-default" namespace="/index">
<action name="*" class="com.moonteam.struts2.action.ViewNewsAction" >
<param name="paramName" >{1}</param>
<result name="success">index.jsp</result>
</action>
</package>
AsyncTask是个不错的东西,可以使用它来做下载进度条。代码讲解如下:
package com.example.downloadfile;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.widget.TextView;
public class DownloadFile extends Activity {
public static final String LOG_TAG = "test";
private ProgressDialog mProgressDialog;
public static final int DIALOG_DOWNLOAD_PROGRESS = 0;
File rootDir = Environment.getExternalStorageDirectory();
//定义要下载的文件名
public String fileName = "test.jpg";
public String fileURL = "https://lh4.googleusercontent.com/-HiJOyupc-tQ/TgnDx1_HDzI/AAAAAAAAAWo/DEeOtnRimak/s800/DSC04158.JPG";
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView tv = new TextView(this);
tv.setText("Android Download File With Progress Bar");
//检查下载目录是否存在
checkAndCreateDirectory("/mydownloads");秋天的故事
//执行asynctask
new DownloadFileAsync().execute(fileURL);
}
class DownloadFileAsync extends AsyncTask<String, String, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
showDialog(DIALOG_DOWNLOAD_PROGRESS);
}
@Override
protected String doInBackground(String... aurl) {
try {
//连接地址
URL u = new URL(fileURL);
HttpURLConnection c = (HttpURLConnection) u.openConnection();
c.setRequestMethod("GET");
c.setDoOutput(true);
c.connect();
//计算文件长度
int lenghtOfFile = c.getContentLength();
FileOutputStream f = new FileOutputStream(new File(rootDir + "/my_downloads/", fileName));
InputStream in = c.getInputStream();
//下载的代码
byte[] buffer = new byte[1024];
int len1 = 0;
long total = 0;
while ((len1 = in.read(buffer)) > 0) {
total += len1; //total = total + len1
publishProgress("" + (int)((total*100)/lenghtOfFile));
f.write(buffer, 0, len1);
}
f.close();
} catch (Exception e) {
Log.d(LOG_TAG, e.getMessage());
}
return null;
}
protected void onProgressUpdate(String... progress) {
Log.d(LOG_TAG,progress[0]);
mProgressDialog.setProgress(Integer.parseInt(progress[0]));
}
@Override
protected void onPostExecute(String unused) {
//dismiss the dialog after the file was downloaded
dismissDialog(DIALOG_DOWNLOAD_PROGRESS);
}
}
public void checkAndCreateDirectory(String dirName){
File new_dir = new File( rootDir + dirName );
if( !new_dir.exists() ){
new_dir.mkdirs();
}
}
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case DIALOG_DOWNLOAD_PROGRESS: //we set this to 0
mProgressDialog = new ProgressDialog(this);
mProgressDialog.setMessage("Downloading file...");
mProgressDialog.setIndeterminate(false);
mProgressDialog.setMax(100);
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
mProgressDialog.setCancelable(true);
mProgressDialog.show();
return mProgressDialog;
default:
return null;
}
}
}
cookie只是session绑定客户端的一种途径,其它的还有比如url等 session_set_save_handler仅仅是对服务器端,session的存储方式,默认为文件存储,可更改为任何其它存储,比如数据库,memcache等
可以使用 session_set_save_handler的函数:
bool session_set_save_handler(callback $open, callback $close,
callback $read, callback $write,
callback $destroy, callback $gc)
注意: 使用本函数前,先要配置php.ini文件,session.save_hadler=user ,否则,session_set_save_handler()不会生效。
第一个参数是打开会话时调用的处理器,接受两个参数 save_path 和 session_name,分别是会话保存路径 (要记得 PHP 默认机制是文件方式的,因此有文件路径) 和 COOKIE 中用于保存 SESSION ID 的键名,其中键名可以通过 session_name 来获取和修改
第二个参数是关闭会话时的处理器,没有参数
第三个参数是读取会话时的处理器,接受一个参数 session_id,代表 COOKIE 中保存的会话 ID
第四个参数是保存会话时的处理器,接受两个参数 session_id 和 session_data。官方手册中提及到,PHP 5.0.5 以后,close 和 write 处理器将会在类析构之后调用,因此处理器内不能使用类和抛出异常 (Exception 也是一个类) 而在析构函数内可以使用 SESSION,因此我们需要在程序中 (比如在 open 或者 read 处理器内) 声明一下保证让 session_write_close 在析构前完成
register_shutdown_function('session_write_close');
第五个参数是删除会话时的处理器,接受一个参数 session_id,代表 COOKIE 中保存的会话 ID
最后一个参数是会话过期时的处理器,接受一个参数 maxlifetime,代表超时秒数
除了is null,is not null外,对null的任何操作结果还都是null;
oracle中要注意null的相关and和or操作
AND操作:null and true=null,null and false=false,null and null=null
or: null or true=true null or false=false,null or null=null
not null的值依然是null,因为null表示不确定,无论null为true还是FALSE,始终最
后不确定,为null.
注意的是:oracle 把null当作varchar2来处理
' '空字符串其实是null的字符类型的表现格式。
btree索引是不存储null值的,而位图索引是存储NULL值的,而如果复合索引中,如果
包含null值,也是可以的,只要有一个索引列不为空;如果是单列索引,IS NULL是肯定
不能使用索引的了,但IS NOT NULL可以。
大多数函数,如果输入为NULL,则输出也为null.NVL,NVL2,DECODE例外,它们在输入参
数为NULL的时候,结果可能不是NULL,如果这些输入参数均为NULL,则肯定为NULL,如果
不全为NULL,结果可能不是NULL。
聚集函数不会处理null值,不管为max,min,avg还是sum.
使用绑定变量可以减少SQL PARSE,但是使用绑定变量有一个不好的地方,就是对于访
问具有倾斜的列,可能使用错误的执行计划。在Oracle 9i之前,如果WHERE 条件里面全
部使用绑定变量,那么只能使用固定的选择性参数来确定执行计划。
=操作和>=操作的选择性为5%,范围扫描的选择性为25%。缺省值的方式可能生成不好的执
行计划。所以Oracle 9i就出现了一个新的技术,bind peeking。什么是bind peeking呢
?当SQL第一次执行的时候,优化器会根据绑定变量来确定执行计划(如果存在柱状图)
。BIND PEEKING只有当该SQL第一次执行的时候,进行HARD PARSE的时候才进行,第二次
调用该SQL,就不会再次进行BIND PEEKING。这种情况下,就存在另外一个风险,如果某
个列的倾斜性很厉害,那么使用BIND PEEKING就是不安全的,因为不同的参数代入,只能
走第一次执行时的执行计划,那么执行计划就像掷色子一样,要靠运气了。碰到这种情况
,应用就不应该使用绑定变量,而应该改为直接值了。
这时可以使用刷新一下共享池alter system flush shared_pool;
或者alter session set "_optim_peek_user_binds"=false;
我们可以通过隐含的参数来调整数据库默认的bind peeking行为:
_OPTIM_PEEK_USER_BINDS。 如果我们想关闭Bind Variable Peeking,我们可以设置该参
数为 False 即可。
SQL>alter session set "_optim_peek_user_binds"=false
使用了Bind Var能提高性能主要是因为这样做可以尽量避免不必要的硬分析(Hard Parse)
而节约了时间,同时节约了大量的CPU资源。
当一个Client提交一条Sql给Oracle后,Oracle 首先会对其进行解析(Parse),然后
将解析结果提交给优化器(Optimiser)来进行优化而取得Oracle认为的最优的Query Plan
,然后再按照这个最优的Plan来执行这个Sql语句(当然在这之中如果只需要软解析的话会
少部分步骤)。
当Oracle接到 Client提交的Sql后会首先在共享池(Shared Pool)里面去查找是否有之前
已经解析好的与刚接到的这一个Sql完全相同的Sql(注意这里说的是完全相同,既要求语
句上的字符级别的完全相同,又要求涉及的对象也必须完全相同)。当发现有相同的以后
解析器就不再对新的Sql在此解析而直接用之前解析好的结果了。这里就节约了解析时间
以及解析时候消耗的CPU资源。尤其是在OLTP中运行着的大量的短小Sql,效果就会比较明
显了。因为一条两条Sql的时间可能不会有多少感觉,但是当量大了以后就会有比较明显
的感觉了。
但是,使用绑定变量的一个缺点是,给出的执行计划并不一定就是SQL在真正应用程序里
所使用的执行计划。这时我们就可以通过 event 10053 事件来查看。
在jquery中,如果也同时引入了其他js库,而其他库也用了$符号的话,则会产生冲突,
为了防止这种情况的发生,可以使用noconflict进行避免,代码如下:
<script type="text/javascript" src="otherLib.js"></script>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript">
$.noConflict();
// 使用其他js库的代码
</script>
同时,也可以自定义自己的命名项目命名空间,比如项目为abc,可以这样:
ABC('contentArea').show(),而不是只使用$('contentArea').show()
当然,也有方法可以继续在jquery代码中,在冲突的时候使用$符号,可以在
ready事件中继续写:
jQuery(document).ready(function($) {
// 这里继续写$符号的代码.
});
也可以简写为:
jQuery(function($){
//...............
});
总的写法如下,当跟其他库一起用的时候:
<script type="text/javascript" src="otherLib.js"></script>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript">
$.noConflict();
jQuery(function($) {
// jQuery code with $.
});
// 其他js库代码.
</script>
也可以再简单点:
$.noConflict()(function(){
// jQuery code
});
// 其他js库代码.
在jquery中,可以使用triggerhandler来设计自定义事件,比如一般的事件:
$('#id').on("click", function() {
alert("Item clicked");
}
);
而对于自定义事件,一般期望能达到如下的效果:
$('#id').on("test.says.hello", function()
{
alert("Hello Cory");
});
这个就叫自定义事件了。又比如假如提供一个jquery的插件,比如是lightbox的效果,在打开时
$(function() {
$('#id').on("lightbox.open", function() {
alert("The lightbox just opened. Woo!");
});
});
则必须编写自定义事件如下:
function open() {
$('#id')triggerHandler({ type:"lightbox.open" });
}
如果自定义事件中需要有参数传出去,可以这样
$('#id').triggerHandler({
type:"lightbox.open",
var1:'Howdy',
information:'I could pass something here also'
});
则调用的时候:
$(function() {
$('#id').on("lightbox.open", function(o) {
alert(o.var1 + " - " + o.information);
});
}
);
下面来看下trigger和triggerhandler的区别:
triggerHandler() 方法触发被选元素的指定事件类型。但不会执行浏览器默认动作,也不会产生事件冒泡。
triggerHandler() 方法与 trigger() 方法类似。不同的是它不会触发事件(比如表单提交)的默认行为,而且只影响第一个匹配元素。
与 trigger() 方法相比的不同之处
它不会引起事件(比如表单提交)的默认行为
.trigger() 会操作 jQuery 对象匹配的所有元素,而 .triggerHandler() 只影响第一个匹配元素。
由 .triggerHandler() 创建的事件不会在 DOM 树中冒泡;如果目标元素不直接处理它们,则不会发生任何事情。
该方法的返回的是事件处理函数的返回值,而不是具有可链性的 jQuery 对象。此外,如果没有处理程序被触发,则这个方法返回 undefined。
例子区别如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
<script type="text/javascript" src="Scripts/jquery-1.3.2.min.js"></script>
<script type="text/javascript">
$(function() {
$("#txtContent").focus(function() {
$("#dv").html($("#dv").html() + "focus被触发。");
});
$("#btnTrigger").click(function() {
$("#txtContent").trigger('focus');
return false;
});
$("#btnTriggerHandler").click(function() {
$("#txtContent").triggerHandler('focus');
});
});
</script>
</head>
<body>
<form id="myForm" action="">
<input type="text" id="txtContent" name="txtContent" size="20" />
<input type="button" id="btnTriggerHandler" name="btnTriggerHandler" value="TriggerHandler" />
<input type="button" id="btnTrigger" name="btnTrigger" value="Trigger" />
<div id="dv">
</div>
①使用Trigger 时会先触发我们绑定的focus 事件,然后文本框会获得焦点,之后触发了浏览器默认的
focus事件,所以trigger 会有两次输出。
②TriggerHandler 相对于 Trigger 只会触发我们绑定的focus,而不会触发浏览器的默认事件.所以
只会有一次输出
</form>
</body>
</html>
在这里所有的操作要在数据库的那台机器上操作,用SYS用户进行登录,首先设置归档进程关闭。
alter system set log_archive_start=false scope=spfile;
然后关闭数据库
shutdown immediate
再后面把数据库启动到mount的模式
startup mount
关闭flash闪回数据库模式,如果不关闭的话,在后面关闭归档日志的时候就会出现讨厌的ORA-38774错误。
alter database flashback off
接着把数据库改为非归档模式
alter database noarchivelog;
都修改好了以后,然后打开数据库
Alter database open;
察看一下归档日志的空间大小
select * from v$recovery_file_dest;
接着看一下log日志的状态
select * from v$log;
再看一下闪回日志使用状况
select * from v$flash_recovery_area_usage;
jquery mobile:
1) jQM是一个UI类库可以看作,主要依赖于jquery和jquery ui
2) jqm做的一些页面是可以靠JQM本身框架已完成不少功能,甚至不需要或者
很少的javascript
3) 如果是熟JQUERY的话,JQM很容易上手
4) JQM是结构框架上比较松散,所以程序大的时候维护起来稍微麻烦点
5) 能容易跟其他框架整合
6) 支持的设备比sencha touch暂时多点
sencha touch:
1) 框架类库很大,包罗万有,UI,DOM,AJAX等它都包括了
2) 不依赖其他框架类库
3) 学习起来花费时间长点
4) 有很好的框架规范和编程约束,这对中大规模项目来说是好事
5) 提供原生打包(native packaging)功能。只需一条命令,就可以将应用打包为供iOS或Android使用。用户不必编写自己的包裹器,或是再纠缠于其他解决方案,现在 已经在Sencha Touch 2中全面内置。更好之处在于:用户为iOS或Android打包同时支持Mac和Windows环境。
6) 支持的设备比jqm少些
7) 对localstorage的支持好点

