thinkphp设置404页面

听说所有的文件会从index.php进来,所以理论上就不存在404,但是又要404,网上找的。
注意下文件的路径问题,因为每个项目的环境不一样。

第一步,
在Lib/Action文件夹下创建EmptyAction.class.php

<?php
	class EmptyAction extends Action 
	{
		function _empty()
		{
			header("HTTP/1.0 404 Not Found");
			$this->display('Public:404');
		} 
		// 404
		function index() 
		{
			header("HTTP/1.0 404 Not Found");
			$this->display('Public:404');
		}	
	}

第二步,
修改Lib/Action文件夹下所有的Action文件
添加一个方法

	function _empty()
	{
		header("HTTP/1.0 404 Not Found");
		$this->display('Public:404');
	}

第三步,
在Tpl/Public文件夹下创建404.html

http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<META http-equiv=refresh content="20;URL = http://666vpn.com/">
<title>您访问的网页不存在...</title> 
</head>
<body>
<style type="text/css">
body,ul,ol,li,p,dt,dl,dd,h1,h2,h3,h4,h5,h6,form,fieldset,table,td,th,img,div{margin:0;padding:0}
img { border:0}
body{background:#fff;color:#333;font-size:12px;font-family:Arial,'宋体'}
ul,ol{list-style:none}
h2,h3,h4,h5,h6,em,stone,i{font-size:12px;font-weight:400}
select,input,select{vertical-align:middle}
a:link,a:visited{color:#333;text-decoration:none}
a:hover,a:active,a:focus{color:#f60;text-decoration:underline}
.clear{clear:both}
.left { float:left; display:inline-block}
.wrap { width:960px; overflow:hidden; margin:0 auto;}
#top { height:43px; overflow:hidden; background:#343434; width:100%}
#top ul { margin-left:20px;}
#top li { float:left; display:inline-block; padding:0 15px;}
#top a { color:#fff; font-size:14px; line-height:43px;}
.login { float:right; display:inline-block;}
.login a { padding-left:10px;}
.m404 {margin:100px auto; vertical-align:middle; text-align:center}
</style>
<div class="m404">
<a href="http://666vpn.com/"><img src="/Public/images/404.png" width="409" height="177" alt="真的很抱歉,我们搞丢了页面……要不去网站首页看看" border="0"></a></div>
</body>
</html>

如何管理时间

人的一生两个最大的财富是:你的才华和你的时间。才华越来越多,但是时间越来越少,我们的一生可以说是用时间来换取才华。如果一天天过去了,我们的时间少了,而才华没有增加,那就是虚度了时光。所以,我们必须节省时间,有效率地使用时间。如何有效率地利用时间呢?我有下面几个建议:

1)做你真正感兴趣、与自己人生目标一致的事情。我发现我的“生产力”和我的“兴趣”有着直接的关系,而且这种关系还不是单纯的线性关系。如果面对我没有兴趣的事情,我可能会花掉40%的时间,但只能产生20%的效果;如果遇到我感兴趣的事情,我可能会花100%的时间而得到200%的效果。要在工作上奋发图强,身体健康固然重要,但是真正能改变你的状态的关键是心理而不是生理上的问题。真正地投入到你的工作中,你需要的是一种态度、一种渴望、一种意志。

2)知道你的时间是如何花掉的。挑一个星期,每天记录下每30分钟做的事情,然后做一个分类(例如:读书、准备GRE、和朋友聊天、社团活动等)和统计,看看自己什么方面花了太多的时间。凡事想要进步,必须先理解现状。每天结束后,把一整天做的事记下来,每15分钟为一个单位(例如:1:00—1:15等车,1:15—1:45搭车,1:45—2:45与朋友喝茶……)。在一周结束后,分析一下,这周你的时间如何可以更有效率地安排?有没有活动占太大的比例?有没有方法可以增加效率?

3)使用时间碎片和“死时间”。如果你做了上面的时间统计,你一定发现每天有很多时间流失掉了,例如等车、排队、走路、搭车等,可以用来背单字、打电话、温习功课等。现在随时随地都能上网,所以没有任何借口再发呆一次。我前一阵和同事一起出差,他们都很惊讶为什么我和他们整天在一起,但是我的电子邮件都可以及时回答?后来,他们发现,当他们在飞机上和汽车上聊天、读杂志和发呆的时候,我就把电子邮件全回了。重点是,无论自己忙还是不忙,你要把那些可以利用时间碎片做的事先准备好,到你有空闲的时候有计划地拿出来做。

4)要事为先 – 每天一大早挑出最重要的三件事,当天一定要能够做完。在工作和生活中每天都有干不完的事,唯一能够做的就是分清轻重缓急。要理解急事不等于重要的事情。每天除了办又急又重要的事情外,一定要注意不要成为急事的奴隶。有些急但是不重要的事情,你要学会放掉,要能对人说 no! 而且每天这三件事里最好有一件重要但是不急的,这样才能确保你没有成为急事的奴隶。

5)要有纪律。有的年轻人会说自己“没有时间学习”,其实,换个说法就是“学习没有被排上优先级次序”。曾经有一个教学生做时间管理的老师,他上课时带来两个大玻璃缸和一堆大小不一的石头。他做了一个实验,在其中一个玻璃缸中先把小石、砂倒进去,最后大石头就放不下了。而另一个玻璃缸中先放大石头,其它小石和砂却可以慢慢渗入。他以此为比喻说:“时间管理就是要找到自己的优先级,若颠倒顺序,一堆琐事占满了时间,重要的事情就没有空位了。”

6)运用80%—20%原则。人如果利用最高效的时间,只要20%的投入就能产生80%的效率。相对来说,如果使用最低效的时间,80%的时间投入只能产生20%效率。一天头脑最清楚的时候,应该放在最需要专心的工作上。与朋友、家人在一起的时间,相对来说,不需要头脑那么清楚。所以,我们要把握一天中20%的最高效时间(有些人是早晨,也有些人是下午和晚上;除了时间之外,还要看你的心态,血糖的高低,休息是否足够等综合考量),专门用于最困难的科目和最需要思考的学习上。许多同学喜欢熬夜,但是晚睡会伤身,所以还是尽量早睡早起。

7)平衡工作和家庭。我对于家庭的时间分配是用下列的原则:

划清界限、言出必行——对家人做出承诺后,而且一定要做到,但是希望其他时间得到谅解。制定较低的期望值以免造成失望。
忙中偷闲——不要一投入工作就忽视了家人,有时10分钟的体贴比10小时的陪伴还更受用。
闲中偷忙——学会怎么利用时间碎片。例如:家人没起床的时候,你就可以利用这段空闲时间去做你需要的工作。
注重有质量的时间(quality time)——时间不是每一分钟都是一样的,有时需要全神贯注,有时坐在旁边上网就可以了。要记得家人平时为你牺牲很多,度假、周末是你补偿的机会。
转载自李开复博客:http://kaifulee.diandian.com/post/2011-03-13/14702

Android:Managing the Activity Lifecycle

Managing the Activity Lifecycle
活动生命周期管理
 
指定APP启动活动
 
//在AndroidManifest.xml下填写,ECLIPSE可以自动创建
<activity android:name=".MainActivity" android:label="@string/app_name">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
 
//创建一个实例:系统会在所有的活动启动时,调用onCreate()方法
TextView mTextView; // Member variable for text view in the layout
 
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
 
    // Set the user interface layout for this Activity
    // The layout file is defined in the project res/layout/main_activity.xml file
    setContentView(R.layout.main_activity); //根据main_activity.xml设计好的界面设置用户界面
 
    // Initialize member TextView so we can manipulate it later
    mTextView = (TextView) findViewById(R.id.text_message);//获取用户输入id=text_message的内容
 
    // Make sure we're running on Honeycomb or higher to use ActionBar APIs
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { //如果SDK版本大于等于安卓3.0
        // For the main activity, make sure the app icon in the action bar
        // does not behave as a button
        ActionBar actionBar = getActionBar();
        actionBar.setHomeButtonEnabled(false);
    }
}
 
onCreate方法执行完之后立即执行onStart,onResume
 
//销毁活动,大多数不需要onDestroy,只需onPause或者onStop
@Override
public void onDestroy() {
    super.onDestroy();  // Always call the superclass
 
    // Stop method tracing that the activity started during onCreate()
    android.os.Debug.stopMethodTracing();
}
 
//暂停和恢复一个活动(onPause,onResume)
@Override
public void onPause() {
    super.onPause();  // Always call the superclass method first
 
    // Release the Camera because we don't need it when paused
    // and other activities might need to use it.
    if (mCamera != null) {
        mCamera.release()
        mCamera = null;
    }
}
 
@Override
public void onResume() {
    super.onResume();  // Always call the superclass method first
 
    // Get the Camera instance as the activity achieves full user focus
    if (mCamera == null) {
        initializeCamera(); // Local method to handle camera init
    }
}
 
//停止和重启一个活动(onStop,onRestart)
无论什么情况下程序终止,都会先调用onPause,然后再调用onStop
@Override
protected void onStop() {
    super.onStop();  // Always call the superclass method first
 
    // Save the note's current draft, because the activity is stopping
    // and we want to be sure the current note progress isn't lost.
    ContentValues values = new ContentValues();
    values.put(NotePad.Notes.COLUMN_NAME_NOTE, getCurrentNoteText());
    values.put(NotePad.Notes.COLUMN_NAME_TITLE, getCurrentNoteTitle());
 
    getContentResolver().update(
            mUri,    // The URI for the note to update.
            values,  // The map of column names and new values to apply to them.
            null,    // No SELECT criteria are used.
            null     // No WHERE columns are used.
            );
}
 
@Override
protected void onStart() {
    super.onStart();  // Always call the superclass method first
 
    // The activity is either being restarted or started for the first time
    // so this is where we should make sure that GPS is enabled
    LocationManager locationManager = 
            (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    boolean gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
 
    if (!gpsEnabled) {
        // Create a dialog here that requests the user to enable GPS, and use an intent
        // with the android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS action
        // to take the user to the Settings screen to enable GPS when they click "OK"
    }
}
 
@Override
protected void onRestart() {
    super.onRestart();  // Always call the superclass method first
 
    // Activity being restarted from stopped state    
}
 
//重新创建活动
 
保存活动状态
static final String STATE_SCORE = "playerScore";
static final String STATE_LEVEL = "playerLevel";
...
 
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    // Save the user's current game state
    savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
    savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);
 
    // Always call the superclass so it can save the view hierarchy state
    super.onSaveInstanceState(savedInstanceState);
}
 
回复活动状态(必须先检测)
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); // Always call the superclass first
 
    // Check whether we're recreating a previously destroyed instance
    if (savedInstanceState != null) {
        // Restore value of members from saved state
        mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
        mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
    } else {
        // Probably initialize members with default values for a new instance
    }
    ...
}
也可以不检测
public void onRestoreInstanceState(Bundle savedInstanceState) {
    // Always call the superclass so it can restore the view hierarchy
    super.onRestoreInstanceState(savedInstanceState);
 
    // Restore state members from saved instance
    mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
    mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
}

android:building your first app

AndroidManifest.xml
The manifest file describes the fundamental characteristics of the app and defines each of its components. You'll learn about various declarations in this file as you read more training classes.
src/
Directory for your app's main source files. By default, it includes an Activity class that runs when your app is launched using the app icon.
res/
Contains several sub-directories for app resources. Here are just a few:
drawable-hdpi/
Directory for drawable objects (such as bitmaps) that are designed for high-density (hdpi) screens. Other drawable directories contain assets designed for other screen densities(密度).
layout/(用户界面)
Directory for files that define your app's user interface.
values/(存储变量值)
Directory for other various XML files that contain a collection of resources, such as string and color definitions.
 
//创建一个activity_main.xml,match_parent代表着充满整个屏幕
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >
</LinearLayout>
<!-- 
首次定义一个id需要用 @+id/message相当于form表单中的id="message"
android:hint代表这默认的文本框为空时填写的内容
@string/edit_message表示从string.xml中取出名为edit_message的字段值
wrap_content代表充满view
下面为一个文本框和一个按钮
-->
<EditText android:id="@+id/edit_message"
        android:layout_width="wrap_content" <!-- 可改为0 -->
        android:layout_height="wrap_content" <!-- 可改为0dp -->
        android:hint="@string/edit_message" />
<Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/button_send" 
		android:onClick="sendMessage"/> <!-- 点击时,调用MainActivity.java下的sendMessage方法 -->
 
//创建一个strings.xml放在res/values下,用来存储变量值
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">My First App</string>
    <string name="edit_message">Enter a message</string>
    <string name="button_send">Send</string>
    <string name="menu_settings">Settings</string>
    <string name="title_activity_main">MainActivity</string>
</resources>
 
//创建一个MainActivity.java在src/com.exmple.my/下面
package com.example.my.first.app;
 
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
 
public class MainActivity extends Activity {
	//为了intent.putExtra方法的使用,必须现在这里定义EXTRA_MESSAGE
	public final static String EXTRA_MESSAGE = "com.example.my.MESSAGE";
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
 
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
	//必须是公共的,有void返回值,view作为唯一的参数
	public void sendMessage(View view) {
		//intent是一个对象,经常被用来启动另一个活动
		//第一个参数为this,第二个为要启动的活动
		Intent intent = new Intent(this, DisplayMessageActivity.class);
 
		//intent还可以将数据传递给要调用的activity
		//根据id获取输入的内容
    	EditText editText = (EditText) findViewById(R.id.edit_message);
 
		//赋值给message
    	String message = editText.getText().toString();
 
		//putExtra的参数相当于key,value
    	intent.putExtra(EXTRA_MESSAGE, message);
 
    	//开始activity
    	startActivity(intent);
	}
}
 
//创建一个DisplayMessageActivity.java在src/com.exmple.my/下面
package com.example.my;
 
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;
 
public class DisplayMessageActivity extends Activity 
{
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        //所有的Activity必须继承父Activity的onCreate方法
 
        // Get the message from the intent
        Intent intent = getIntent();
        String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
 
        // Create the text view
        TextView textView = new TextView(this);
        textView.setTextSize(40);
        textView.setText(message);
 
        //为活动布局设置文本视图
        setContentView(textView);
    }
}