2011年5月31日星期二

  C#面向对象基础

    1.面向对象简介

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace C_Sharp面向对象基础

{

class Program

{

static void Main(string[] args)

{

Person p1 = new Person();

//p1.Name="tom";

p1.Height = 180;

p1.Age = 30;

p1.SayHello();

 

Person2 p2 = new Person2();

p2.Age = 20;

p2.GiveName("tom");

p2.SayHello();

 

Person3 p3=new Person3();

p3.Age=30;

//Console.WriteLine("年龄是{0}",p3.age);

p3.Age=-1;

Console.WriteLine("年龄是{0}",p3.Age);

p3.Age1=-100;

Console.WriteLine("年龄是{0}",p3.Age1);

 

Person4 p4 = new Person4();

p4.Age = 30;

p4.Age = p4.Age + 1;

Console.WriteLine(p4.Age);

 

//Person5 p5 = new Person5();

//p5.Age = 30;

//Console.WriteLine(p5.Age);

 

Person6 p6 = new Person6();

p6.IncAge();

p6.IncAge();

//p6.Age = 30;

Console.WriteLine("年龄{0}",p6.Age);

 

Person7 p7 = new Person7();

p7.Age = 30;

Console.WriteLine(p7.Age);

 

Console.ReadKey();

 

}

 

class Person

{

public int Height;

public int Age;

private string Name;

 

public void SayHello()

{

Console.WriteLine("大家好,我叫{0},我的身高是{1},我的年龄是{2}",this.Name,this.Height,this.Age);

}

}

 

class Person2

{

public int Height;

public int Age;

private string Name;

 

public void GiveName(string name)

{

if (name == "jerry")

{

return;

}

this.Name=name;

}

 

public void SayHello()

{

睁眼();

Console.WriteLine("大家好,我叫{0},我的身高是{1},我的年龄是{2}", this.Name, this.Height, this.Age);

}

 

private void 睁眼()

{

Console.WriteLine("睁开双眼");

}

}

 

class Person3

{

private int age;

public int Age1;

public int Age

{

set //赋值

{

if(value<0)

{

return;

}

this.age=value;

}

get //取值

{

return this.age;

}

}

}

 

class Person4

{

public int Age

{

set

{

}

get

{

return 3;

}

}

}

 

class Person5

{

private int age;

public int Age

{

set

{

this.Age = value;//给自己赋值,死循环

}

get

{

return this.Age;

}

}

}

 

class Person6

{

private int age;

public int Age //只读属性,因为只有get,没有set

{

get { return age; }

}

 

public void IncAge()

{

age++;

}

}

 

class Person7

{

public int Age

{

get; //编译器自动帮我们生成私有字段和set、get代码块。

set;

}

 

public string Name

{

get;

set;

}

}

}

}

2..聊天机器人

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace 面向对象版聊天机器人

{

class Program

{

static void Main(string[] args)

{

机器人 r1 = new 机器人();

r1.Name = "小I";

r1.Eat(5);

 

机器人 r2 = new 机器人();

r2.Name = "小J";

r1.Eat(8);

 

 

Console.WriteLine();

 

 

Console.WriteLine("请选择机器人:1→小I,2→小J");

 

机器人 r;

string str = Console.ReadLine();

if (str == "1")

{

r = r1; //r指向"r1指向的对象"

}

else

{

r = r2;

}

 

r.SayHello();

while (true)

{

string str1 = Console.ReadLine();

r1.Speak(str1);

}

 

 

 

Console.ReadKey();

}

 

class 机器人

{

public string Name { get; set; }

 

private int FullLevel { get; set; }

 

public void SayHello()

{

Console.WriteLine("我叫:{0}",Name);

}

 

public void Eat(int foodCount)

{

if (FullLevel > 100)

{

return;

}

FullLevel = FullLevel + foodCount;

}

 

public void Speak(string str)

{

if (FullLevel <= 0)

{

Console.WriteLine("饿死了,不说了!");

return;

}

if (str.Contains("姓名") || str.Contains("名字"))

{

this.SayHello();

}

else if (str.Contains("女朋友"))

{

Console.WriteLine("年龄小,不考虑!");

}

else

{

Console.WriteLine("听不懂!");

}

FullLevel--;

}

}

}

}

3.构造函数

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace 构造函数1

{

class Program

{

static void Main(string[] args)

{

Person p1 = new Person();

Person p2 = new Person("tom");

Person p3 = new Person("jerry", 20);

 

Person p4 = new Person();

 

Console.WriteLine("年龄:{0},姓名:{1}",p1.Age,p1.Name);

Console.WriteLine("年龄:{0},姓名:{1}", p2.Age, p2.Name);

Console.WriteLine("年龄:{0},姓名:{1}", p3.Age, p3.Name);

 

Console.ReadKey();

}

}

 

class Person

{

public string Name { get; set; }

public int Age { get; set; }

public Person()

{

Name = "未命名";

Age = 0;

}

public Person(string name)

{

this.Name = name;

}

public Person(string name, int age)

{

this.Name = name;

this.Age = age;

}

}

}

4.继承

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace 继承

{

class Program

{

static void Main(string[] args)

{

中国人 c1=new 中国人();

c1.Height=180;

c1.Name="李小龙";

c1.SayHello();

c1.户口="北京";

 

韩国人 k1=new 韩国人();

k1.Name="金喜善";

k1.Height=170;

k1.SayHello();

k1.做泡菜();

 

Person p1 = c1;

p1.SayHello();

 

Person p2 = k1;

k1.SayHello();

 

//中国人 zgr = p1; //报错,因为p1是Person类

中国人 zgr=(中国人)p1;

zgr.SayHello();

 

//中国人 zgr1 = (中国人)p2; //一旦程序员的保证不靠谱,照样报错

//zgr1.SayHello();

 

Object obj = 3;

//Object是所有类的一个基类

 

Console.ReadKey();

}

 

class Person //所有的类都继承于Object类,等价于Person:Object

{

public string Name{get;set;}

public int Age{get;set;}

public int Height{get;set;}

 

public void SayHello()

{

Console.WriteLine("SayHello", this.Name);

}

}

 

class 中国人:Person

{

public string 户口{get;set;}

 

public void 功夫()

{

Console.WriteLine("我打!!!");

}

}

 

class 韩国人 : Person

{

public string 饭量 { get; set; }

public void 做泡菜()

{

Console.WriteLine("泡菜香!");

}

}

}

}

5.异常

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace 异常

{

class Program

{

static void Main(string[] args)

{

/*

try

{

Console.WriteLine("Convert之前");

int i=Convert.ToInt32("abc");

Console.WriteLine("Convert之后");

}

catch(Exception ex)

{

Console.WriteLine("数据错误:"+ex.Message+"。异常堆栈"+ex.StackTrace);

}

Console.WriteLine("ReadKey之前");

Console.ReadKey();

//DeleteFile("c:\1.avi");

//DeleteFile("c:\2.avi");

//int i = Convert.ToInt32("abc");

*/

 

try

{

string desc = GetAgeDesc(300);

}

catch (Exception ex)

{

Console.WriteLine("数据错误:"+ex.Message);

}

 

Console.ReadKey();

 

}

 

static string GetAgeDesc(int age)

{

if (age >= 0 && age <= 3)

{ return "婴幼儿"; }

else if (age > 3 && age <= 18)

{ return "青少年"; }

else if (age > 19 && age < 150)

{ return "大人"; }

else if (age < 0)

{ throw new Exception("您来自反物质世界吧!"); }

else

{ throw new Exception("您见过老佛爷吧!"); }

}

 

static int DeleteFile(string filepath)

{

//尝试删除文件,发现无法删除

return -1;

//return 0。如果没有权限 return -2,找不到删除的文件return -3。

}

}

}

6.常量

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace 常量

{

class Program

{

public const int pi = 3;//不用new一个类就可以直接调

static void Main(string[] args)

{

int r = 10;

//int pi = 3;

//const int pi = 3;//pi声明为常量

int l = 2 * pi* r;

Console.WriteLine("周长:{0}",l);

int m = pi * r * r;

Console.WriteLine("面积:{0}",m);

 

//Math.PI;

Console.ReadKey();

}

}

}

7.静态成员

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace 静态成员

{

class Program

{

static void Main(string[] args)

{

Person.TotalCount = 30;

Console.WriteLine(Person.TotalCount);

DoIt();

Dog d = new Dog();

d.叫唤();

Person.人口汇报();

 

Person p1 = new Person();

p1.Age = 300;

p1.SayHello();

 

Console.ReadKey();

}

 

public static void DoIt()

{

Console.WriteLine("ffff");

Console.WriteLine("使用全局变量:{0}",Person.TotalCount);

}

}

 

class Person

{

public static int TotalCount;//静态成员

public int Age;

public static void 人口汇报() //static函数

{

//Console.WriteLine("总人口:{0},年龄:{1}",TotalCount,Age);

//static函数中不能调用非static成员

}

 

public void SayHello() //非static函数

{

Console.WriteLine("我的年龄:{0},全球总人口:{1}",Age,TotalCount);

//非static函数可以调用static成员

}

}

 

class Dog

{

public void 叫唤()

{

Console.WriteLine("旺旺:{0}",Person.TotalCount);

}

}

 

//静态类

static class ConsoleHelper //静态类不能被实例化,也就是不能被new的类

{

public static int ReadInt()

{

string str=Console.ReadLine();

return Convert.ToInt32(str);

}

}

}

8.命名空间

Program.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using 命名空间.hr; //如果要使用的类和当前的类不在同一个namespace,则要加using引用

using 命名空间.oa;

using System.Collections;

 

namespace 命名空间

{

class Program

{

static void Main(string[] args)

{

Person p1 = new Person();

命名空间.hr.Person p2 = new 命名空间.hr.Person();

//就像文件的全路径一样

 

Dog d = new Dog();

Mouse m = new Mouse();

 

ArrayList list = new ArrayList();

//在ArrayList上点右键->解析->using System.Collections

 

Console.ReadKey();

}

}

 

class Person

{

}

}

Person.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace 命名空间.hr

{

class Person

{

 

}

}

Dog.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace 命名空间.hr

{

class Dog

{

}

}

Mouse.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace 命名空间.oa

{

class Mouse

{

}

}

9.索引器

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace 索引

{

class Program

{

static void Main(string[] args)

{

int[] values = { 3,5,9,8};

int i=values[1];

 

Person p1 = new Person();

p1[1] = "小明";

Console.WriteLine(p1[1]+p1[2]);

 

string s = "";

//s[0]='aa'; //因为s是string类型,是一个只读的索引器

 

Console.WriteLine(p1["tom",3,9]);

//p1["tom", 3, 9] = "aaa"; //报错,因为p1只读

 

Console.ReadKey();

}

}

 

class Person

{

private string FirstName="大毛";

private string SecondName="二毛";

 

public string this[string name, int x, int y]//索引的参数可以多个

{

get

{

return name + x + y;

}

}

 

public string this[int index] //索引器

{

set

{

if (index == 1)

{

FirstName = value;

}

else if (index == 2)

{

SecondName = value;

}

else

{

throw new Exception("错误的序号");

}

}

get

{

if (index == 1)

{

return FirstName;

}

else if (index == 2)

{

return SecondName;

}

else

{

throw new Exception("错误的序号");

}

}

}

}

}

 

 

  关于信号上升时间和传输延时的关系

      一般来说,当传输线很短时,传输延时在一定的范围内,此时虽然仍然存在反射,但反射的波形在信号的上升沿之内,则从波形看,没有大的影响,但究竟传输延时短到什么程度才算短呢?我们做一个实验,还是通过spice仿真得到结果。图1为仿真电路图,该信号源端上升时间为1ns,幅度为1V,阻抗为10欧姆。

WD]VP2%J~J_IFLOAD)YQZXO

图1 仿真电路图

1、Td=40%Tr(Tr为上升时间,Td为传输延时),开路终端波形。

W0UKJ%6ONY5S1E1L4L7Z84G

图2  Td=40%Tr,开路终端波形

2、Td=30%Tr(Tr为上升时间,Td为传输延时),开路终端波形。

$F6NVZ]CMVS{FPY~(_B37OP

图3  Td=30%Tr,开路终端波形

3、Td=20%Tr(Tr为上升时间,Td为传输延时),开路终端波形。此时的过冲约为0.11V,为信号幅度的11%。

{KU9M$`Z7~`91JC4RTXGP}8

图4 Td=20%Tr,开路终端波形

4、Td=10%Tr(Tr为上升时间,Td为传输延时),开路终端波形。

NT3S9]R9R5@5]UR~32I2{$7

图5 Td=10%Tr,开路终端波

      由仿真可知,信号的过冲和传输线的时延有关,《信号完整性分析》中描述说,“当传输线延时Td>信号上升时间的20%时,就要开始考虑由于导线没有终端端接而产生的振铃噪声。当时延大于上升时间的20%时,振铃会影响电路功能,,必须加以控制,否则这是造成信号完整性问题的隐患。吐过Td<20%信号的上升时间,振铃噪声可以忽略,传输线不需要终端匹配。”

      所以,又出现了无敌的经验法则:

为了避免信号完整性问题,没有端接的传输线的最大长度为,Len < Tr(Tr表示信号上升时间,Len的单位为in)

换算成mil就是乘个1000。

      很悲剧的是,在目前的高速电路中,信号的上升时间已经小于0.25ns,所以Len为0.25in,一般来说,PCB上走线的距离很容易大于这个值,所以,必须对电路进行端接设计。

  各种数据库的连接方法

 

 

一、JDBC连接各种数据库

1、Oracle8/8i/9i数据库(thin模式)

Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();  
String url="jdbc:oracle:thin:@localhost:1521:orcl";  
//orcl为数据库的SID  
String user="test";  
String password="test";  
Connection conn= DriverManager.getConnection(url,user,password);  
 

2、DB2数据库

Class.forName("com.ibm.db2.jdbc.app.DB2Driver ").newInstance();  
String url="jdbc:db2://localhost:5000/sample";  
//sample为你的数据库名  
String user="admin";  
String password="";  
Connection conn= DriverManager.getConnection(url,user,password);  
 

3、Sql Server7.0/2000数据库

Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();  
String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb";  
//mydb为数据库  
String user="sa";  
String password="";  
Connection conn= DriverManager.getConnection(url,user,password);  
 

4、Sybase数据库

Class.forName("com.sybase.jdbc.SybDriver").newInstance();  
String url =" jdbc:sybase:Tds:localhost:5007/myDB";  
//myDB为你的数据库名  
Properties sysProps = System.getProperties();  
SysProps.put("user","userid");  
SysProps.put("password","user_password");  
Connection conn= DriverManager.getConnection(url, SysProps);  
 

5、Informix数据库

Class.forName("com.informix.jdbc.IfxDriver").newInstance();  
String url =  
"jdbc:informix-sqli://123.45.67.89:1533/myDB:INFORMIXSERVER=myserver;  
user=testuser;password=testpassword";  
//myDB为数据库名  
Connection conn= DriverManager.getConnection(url);  
 

6、MySQL数据库

Class.forName("org.gjt.mm.mysql.Driver").newInstance();  
String url ="jdbc:mysql://localhost/myDB?user=soft&password=soft1234&useUnicode=true&characterEncoding=8859_1"  
//myDB为数据库名  
Connection conn= DriverManager.getConnection(url);  
 

7、PostgreSQL数据库

Class.forName("org.postgresql.Driver").newInstance();  
String url ="jdbc:postgresql://localhost/myDB"  
//myDB为数据库名  
String user="myuser";  
String password="mypassword";  
Connection conn= DriverManager.getConnection(url,user,password);  
(http://www.fanqiang.com) 

 

二、ASP连接各种数据库的方法

ODBC链接

适合数据库类型 链接方式  
 
access "Driver={microsoft access driver(*.mdb)};dbq=*.mdb;uid=admin;pwd=pass;"  
 
dBase "Driver={microsoft dbase driver(*.dbf)};driverid=277;dbq=------------;"  
 
Oracle "Driver={microsoft odbc for oracle};server=oraclesever.world;uid=admin;pwd=pass;"  
 
MSSQL server "Driver={sql server};server=servername;database=dbname;uid=sa;pwd=pass;"  
 
MS text "Driver={microsoft text driver(*.txt; *.csv)};dbq=-----;extensions=asc,csv,tab,txt;Persist SecurityInfo=false;"  
 
Visual Foxpro "Driver={microsoft Visual Foxpro driver};sourcetype=DBC;sourceDB=*.dbc;Exclusive=No;"  
 
MySQL "Driver={mysql};database=yourdatabase;uid=username;pwd=yourpassword;option=;"  
 

OLEDB链接

适合的数据库类型 链接方式  
 
access "Provider=microsoft.jet.oledb.4.0;data source=your_database_path;user id=admin;password=pass;"  
 
Oracle "Provider=OraOLEDB.Oracle;data source=dbname;user id=admin;password=pass;"  
 
MS SQL Server "Provider=SQLOLEDB;data source=machinename;initial catalog=dbname;userid=sa;password=pass;"  
 
MS text "Provider=microsof.jet.oledb.4.0;data source=your_path;Extended Properties′text;FMT=Delimited′"  

 

三、PDO对各种数据库的连接方法

PgSQL

 
php 
try { 
$db = new PDO("pgsql:dbname=pdo;host=localhost", "username", "password" ); 
echo "PDO connection object created"; 

catch(PDOException $e) 

echo $e->getMessage(); 

?> 

SQLite

 
php 
try { 
/*** connect to SQLite database ***/ 
$dbh = new PDO("sqlite:/path/to/database.sdb"); 

catch(PDOException $e) 

echo $e->getMessage(); 

?> 

PDO还能在内存中创建SQLite并使用

php 
try { 
/*** connect to SQLite database ***/ 
$db = new PDO("sqlite::memory"); 
/*** a little message to say we did it ***/ 
echo 'database created in memory'; 

catch(PDOException $e) 

echo $e->getMessage(); 

?> 
 
 

MySQL

 
php 
/*** mysql hostname ***/ 
$hostname = 'localhost'; 
 
/*** mysql username ***/ 
$username = 'username'; 
 
/*** mysql password ***/ 
$password = 'password'; 
 
try { 
$dbh = new PDO("mysql:host=$hostname;dbname=mysql", $username, $password); 
/*** echo a message saying we have connected ***/ 
echo 'Connected to database'; 

catch(PDOException $e) 

echo $e->getMessage(); 

?> 
 

 Firebird

 
php 
try { 
$dbh = new PDO("firebird:dbname=localhost:C:\Programs\Firebird\DATABASE.FDB", "SYSDBA", "masterkey"); 

catch (PDOException $e) 

echo $e->getMessage(); 

?> 
 

Informix

 
php 
try { 
$dbh = new PDO("informix:DSN=InformixDB", "username", "password"); 

catch (PDOException $e) 

echo $e->getMessage(); 

?> 

 

Oracle

  

简单连接

 
php 
try { 
$dbh = new PDO("OCI:", "username", "password") 

catch (PDOException $e) 

echo $e->getMessage(); 

?> 

带数据库名和字符集连接

 
php 
try { 
$dbh = new PDO("OCI:dbname=accounts;charset=UTF-8", "username", "password"); 

catch (PDOException $e) 
{      echo $e->getMessage();      } ?> 
ODBC 
 
php 
try { 
$dbh = new PDO("odbc:Driver={Microsoft Access Driver (*.mdb)};Dbq=C:\accounts.mdb;Uid=Admin"); 

catch (PDOException $e) 

echo $e->getMessage(); 

?> 
 

DBLIB

 
php 
try { 
$hostname = "localhost"; 
$port     = 10060; 
$dbname   = "my_database"; 
$username = "username"; 
$password = "password"; 
$dbh = new PDO ("dblib:host=$hostname:$port;dbname=$dbname","$username","$password"); 

catch (PDOException $e) 

echo $e->getMessage(); 

?> 
 

IBM

 
php 
try { 
$db = new PDO("ibm:DRIVER={IBM DB2 ODBC DRIVER};DATABASE=accounts; HOSTNAME=1.2.3,4;PORT=56789;PROTOCOL=TCPIP;", "username", "password"); 

catch (PDOException $e) 

echo $e->getMessage(); 

?> 

 

四、PHP连接各种数据库方法代码

PHP连接MYSQL数据库代码

________________________________________ 
php  
$mysql_server_name='localhost';      //改成自己的mysql数据库服务器 
$mysql_username='root';                  //改成自己的mysql数据库用户名 
$mysql_password='12345678';        //改成自己的mysql数据库密码 
$mysql_database='mycounter';        //改成自己的mysql数据库名 
 
$conn=mysql_connect($mysql_server_name,$mysql_username,$mysql_password,$mysql_database);  
$sql='CREATE DATABASE mycounter DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci;  
';  
mysql_query($sql);  
$sql='CREATE TABLE `counter` (`id` INT(255) UNSIGNED NOT NULL AUTO_INCREMENT ,`count` INT(255) UNSIGNED NOT NULL DEFAULT 0,PRIMARY KEY ( `id` ) ) TYPE = innodb;';  
mysql_select_db($mysql_database,$conn);  
$result=mysql_query($sql);  
//echo $sql;  
mysql_close($conn);  
echo "Hello!数据库mycounter已经成功建立!";  
 
?> 

PHP连接ACCESS数据库代码方法

________________________________________ 
$conn = new com("ADODB.Connection");  
$connstr = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=". realpath("data/db.mdb");  
$conn->Open($connstr);  
$rs = new com("ADODB.RecordSet");  
$rs->Open("select * from szd_t",$conn,1,1);  
while(! $rs->eof) {  
$f = $rs->Fields(1);  
echo $f->value;  
$rs->MoveNext();  
}  
?> 

PHP连接MS SQL数据库代码方法

________________________________________ 
1.安装SQL服务器并添加PHP的MSSQL扩展 
2.使用以下代码连接并测试 
php  
 
$myServer = localhost; //主机 
$myUser = sa; //用户名 
$myPass = password; //密码 
$myDB = Northwind;  //MSSQL库名 
 
$s = @mssql_connect($myServer, $myUser, $myPass)  
or die(Couldnt connect to SQL Server on $myServer);  
 
$d = @mssql_select_db($myDB, $s)  
or die(Couldnt open database $myDB);  
 
$query = SELECT TitleOfCourtesy+ +FirstName+ +LastName AS Employee ;  
$query .= FROM Employees ;  
$query .= WHERE Country=USA AND Left(HomePhone, 5) = (206);  
 
$result = mssql_query($query);  
$numRows = mssql_num_rows($result);  
 
echo 

 . $numRows . Row . ($numRows == 1 ? : s) . Returned ;  
 
while($row = mssql_fetch_array($result))  
{  
echo 
  •  . $row[Employee] . 
  • ;  
    }  
     
    ?> 

    PHP连接Oracle数据库

    PHP提供了两套函数与Oracle连接,分别是ORA_和OCI函数。其中ORA_函数略显陈旧。OCI函数更新据说更好一些。两者的使用语法几乎相差无几。你的PHP安装选项应该可以支持两者的使用。  
     
    连接  
     
    < ? if ($conn=Ora_Logon("user@TNSNAME","password"))  
    { echo "SUCCESS ! Connected to database\n";  
    }else  
    {echo "Failed :-( Could not connect to database\n";}  
    Ora_Logoff($conn);  
    phpinfo();  
    ?>  
     
    以上代码使用TNSNAME(在你的tnsnames.ora文件中指明)定义的Oracle数据库名称、用户名称和密码连接数据库。在成功连接的基础上,ora_logon函数返回一个非零的连接ID并储存在变量$conn中。 
     

     

    五、jsp连接数据库的各种方法

    在练习这些代码的时候,一定将jdbc的驱动程序放到服务器的类路径里,然后要 
    在数据库里建一个表test,有两个字段比如为test1,test2,可以用下面SQL建: 
    create table test(test1 varchar(20),test2 varchar(20) 
     

    一、jsp连接Oracle8/8i/9i数据库(用thin模式)

    testoracle.jsp如下: 
     
    <%@ page contentType="text/html;charset=gb2312"%> 
    <%@ page import="java.sql.*"%> 
     
    <% Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); 
     
    String url="jdbc:oracle:thin:@localhost: 1521:orcl"; 
    //orcl为你的数据库的SID 
    String user="scott"; 
    String password="tiger"; 
    Connection conn= DriverManager.getConnection(url,user,password); 
    Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); 
     
    String sql="select * from test"; 
    ResultSet rs=stmt.executeQuery(sql); 
    while(rs.next()) {%> 
    您的第一个字段内容为:<%=rs.getString( 1)%> 
    您的第二个字段内容为:<%=rs.getString( 2)%> 
    <%}%> 
    <%out.print("数据库操作成功,恭喜你");%> 
    <%rs.close(); 
    stmt.close(); 
    conn.close(); 
    %> 

    二、jsp连接Sql Server数据库

    testsqlserver.jsp如下: 
    <%@ page contentType="text/html;charset=gb2312"%> 
    <%@ page import="java.sql.*"%> 
      
    <%Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance(); 
     
    String url="jdbc:microsoft:sqlserver: //localhost:1433;DatabaseName=pubs"; 
     
    //pubs为你的数据库的 
    String user="sa"; 
    String password="";  
    Connection conn= DriverManager.getConnection(url,user,password); 
    Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); 
     
    String sql="select * from test"; 
    ResultSet rs=stmt.executeQuery(sql); 
    while(rs.next()) {%> 
    您的第一个字段内容为:<%=rs.getString(1)%> 
    您的第二个字段内容为:<%=rs.getString(2)%> 
    <%}%> 
    <%out.print("数据库操作成功,恭喜你");%> 
    <%rs.close(); 
    stmt.close(); 
    conn.close();  
    %> 
     

    三、jsp连接DB2数据库

    testdb2.jsp如下: 
    <%@ page contentType="text/html;charset=gb2312"%> 
    <%@ page import="java.sql.*"%> 
    <%Class.forName("com.ibm.db2.jdbc.app.DB2Driver ").newInstance(); 
     
    String url="jdbc:db2: //localhost:5000/sample"; 
    //sample为你的数据库名 
    String user="admin"; 
    String password=""; 
    Connection conn= DriverManager.getConnection(url,user,password); 
    Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); 
     
    String sql="select * from test"; 
    ResultSet rs=stmt.executeQuery(sql); 
    while(rs.next()) {%> 
    您的第一个字段内容为:<%=rs.getString(1)%> 
    您的第二个字段内容为:<%=rs.getString(2)%> 
    <%}%> 
    <;%out.print("数据库操作成功,恭喜你");%> 
    <%rs.close(); 
    stmt.close(); 
    conn.close(); 
    %> 

    四、jsp连接Informix数据库

    testinformix.jsp如下: 
    <%@ page contentType="text/html;charset=gb2312"%> 
    <%@ page import="java.sql.*"%> 
      
    <%Class.forName("com.informix.jdbc.IfxDriver").newInstance(); 
    String url = 
    "jdbc:informix-sqli: //123.45.67.89:1533/testDB:INFORMIXSERVER=myserver; 
    user=testuser;password=testpassword"; 
    //testDB为你的数据库名 
    Connection conn= DriverManager.getConnection(url); 
    Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); 
     
    String sql="select * from test"; 
    ResultSet rs=stmt.executeQuery(sql); 
    while(rs.next()) {%> 
    您的第一个字段内容为:<%=rs.getString(1)%> 
    您的第二个字段内容为:<%=rs.getString(2)%> 
    <%}%> 
    <%out.print("数据库操作成功,恭喜你");%> 
    <%rs.close(); 
    stmt.close(); 
    conn.close(); 
    %> 
     

    五、jsp连接Sybase数据库

    testmysql.jsp如下: 
    <%@ page contentType="text/html;charset=gb2312"%> 
    <%@ page import="java.sql.*"%> 
      
    <%Class.forName("com.sybase.jdbc.SybDriver").newInstance(); 
    String url =" jdbc:sybase:Tds:localhost:5007/tsdata"; 
    //tsdata为你的数据库名 
    Properties sysProps = System.getProperties(); 
    SysProps.put("user","userid"); 
    SysProps.put("password","user_password"); 
    Connection conn= DriverManager.getConnection(url, SysProps); 
    Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); 
     
    String sql="select * from test"; 
    ResultSet rs=stmt.executeQuery(sql); 
    while(rs.next()) {%> 
    您的第一个字段内容为:<%=rs.getString(1)%> 
    您的第二个字段内容为:<%=rs.getString(2)%> 
    <%}%> 
    <%out.print("数据库操作成功,恭喜你");%> 
    <%rs.close(); 
    stmt.close(); 
    conn.close(); 
    %> 
     

    六、jsp连接MySQL数据库

    testmysql.jsp如下: 
    <%@ page contentType="text/html;charset=gb2312"%> 
    <%@ page import="java.sql.*"%> 
      
    <%Class.forName("org.gjt.mm.mysql.Driver").newInstance(); 
    String url ="jdbc:mysql://localhost/softforum?user=soft&password=soft1234&useUnicode=true&characterEncoding=8859_1" 
     
    //testDB为你的数据库名 
    Connection conn= DriverManager.getConnection(url); 
    Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); 
     
    String sql="select * from test"; 
    ResultSet rs=stmt.executeQuery(sql); 
    while(rs.next()) {%> 
    您的第一个字段内容为:<%=rs.getString(1)%> 
    您的第二个字段内容为:<%=rs.getString(2)%> 
    <%}%> 
    <%out.print("数据库操作成功,恭喜你");%> 
    <%rs.close(); 
    stmt.close(); 
    conn.close(); 
    %> 
     

    七、jsp连接PostgreSQL数据库

    testmysql.jsp如下: 
    <%@ page contentType="text/html;charset=gb2312"%> 
    <%@ page import="java.sql.*"%> 
    <%Class.forName("org.postgresql.Driver").newInstance(); 
    String url ="jdbc:postgresql://localhost/soft" 
    //soft为你的数据库名 
    String user="myuser"; 
    String password="mypassword"; 
    Connection conn= DriverManager.getConnection(url,user,password); 
    Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); 
     
    String sql="select * from test"; 
    ResultSet rs=stmt.executeQuery(sql); 
    while(rs.next()) {%> 
    您的第一个字段内容为:<%=rs.getString(1)%> 
    您的第二个字段内容为:<%=rs.getString(2)%> 
    <%}%> 
    <%out.print("数据库操作成功,恭喜你");%> 
    <%rs.close(); 
    stmt.close(); 
    conn.close(); 
    %> 

    • 发表评论
    • 评论内容:
    •  
    专区推荐内容 << >> 热门招聘职位 【更多

  磨刀不误砍柴工:Ext4核心组件Grid的变化及学习(3):可编辑的grid

我们依然拿旧版对比一下。Ext 3里面要编辑Grid单元格,就必须制定EditorGrid类。通过继承方式可能不太灵活,于是Ext 4就否决了继承的方式,而是采用“插件化”的方式。通过Ext JS4的Editing插件可以自由绑定到任意的Grid的实例,对于全体任何类型的Grid均可使用。于是乎,此举又为提高“灵活性(flexibility)”添泼了一抹浓彩。此外,对于Ext 3中很受大家所欢迎的一款扩展:RowEditor,在这次发布我们也将RowEditor正式加入的Ext 4包中去,成为标准类库的一员。(引自官方说明

4系的编辑模式和3系完全不同,彻底抛弃EditorGrid类,改为使用插件支持编辑。今天,使用direct技术说明grid是如何与后台进行数据联系的。并举了几个实际中经常应用的例子:下拉框编辑、下拉框树形选择,并介绍了几种主从表编辑模式,说明各模式优缺点以供选择。

一、预备知识:grid的选择模式

grid有两种编辑模式:行编辑和单元格编辑,相应的有两种选择模式与其配合:行选择和单元格选择。默认是行选择,可以通过selType: 'cellmodel'改变。效果区别如下:

行选择

image

列选择

image

 

二、编辑模式的设置

两种编辑模式通过实例化Ext.grid.plugin.CellEditing或者Ext.grid.plugin.RowEditing进行设定,注意要与相应的选择模式配合。每个列使用的编辑方法通过field参数指定。field为Ext.form.field.Field的实例,使用xtype设定类别,可以为text、number、combobox等等,具体设置参考各类的api。不设定field则该列不能修改。

Ext.grid.plugin.CellEditing通常只设置clicksToEdit一个属性,1为单击开启修改模式,2为双击。Ext.grid.plugin.RowEditing多一个autoCancel设置,为true的话点击其他行就会自动取消上一个行的编辑并丢弃结果,默认为true,我经常设置为false让用户自己点,不会点错了丢数据。

1、单元格编辑

   Ext.create( ' Ext.grid.Panel ' , { title:  ' Simpsons ' , store:  new  simpsonsStore(), columns: [ {header:  ' Name ' , dataIndex:  ' name ' , field:  ' textfield ' }, {header:  ' Email ' , dataIndex:  ' email ' , flex: 1 , field:{ xtype: ' textfield ' , allowBlank: false  } }, {header:  ' Phone ' , dataIndex:  ' phone ' } ], selType:  ' cellmodel ' , plugins: [ Ext.create( ' Ext.grid.plugin.CellEditing ' , { clicksToEdit:  1  }) ], height:  200 , width:  400 , renderTo: Ext.getBody()});    

image

2、行编辑

   Ext.create( ' Ext.grid.Panel ' , { title:  ' Simpsons ' , store:  new  simpsonsStore(), columns: [ {header:  ' Name ' , dataIndex:  ' name ' , field:  ' textfield ' }, {header:  ' Email ' , dataIndex:  ' email ' , flex: 1 , field:{ xtype: ' textfield ' , allowBlank: false  } }, {header:  ' Phone ' , dataIndex:  ' phone ' } ], plugins: [ Ext.create( ' Ext.grid.plugin.RowEditing ' , { clicksToEdit:  1  }) ], height:  200 , width:  400 , renderTo: Ext.getBody()});    

image

遇到一点问题,起床后再写下grid与后台的交互,写了有点慢,见谅。

  《模式——工程化实现及扩展》(设计模式C# 版)《连贯接口 Fluent Interface》——“自我检验"参考答案

转自:《模式——工程化实现及扩展》(设计模式C# 版)

http://www.cnblogs.com/callwangxiang/

 

 

http://www.cnblogs.com/callwangxiang/archive/2011/05/31/ExerciseAAFluentInterface.html的参考答案

 

 

参考答案

 

设计要点:

  1. 采用连贯接口设计表格的创建过程
  2. 由于表格Head涉及一层嵌套、Body涉及两层嵌套,因此为了便于调整和修改,每个节点元素类型都要保留回溯到父节点的引用

 

1、设计具有Fluent特征的抽象节点类型

/// 
/// 修改后具有Fluent特征的集合类型/// /// 集合元素类型 /// 父节点类型 class FluentCollection where TElement : class where TParent : class { protected List list = new List (); TParent parent; public FluentCollection(TParent parent) { if(parent == null) throw new ArgumentNullException("parent"); this.parent = parent; } /// /// 返回父节点 /// public TParent Parent{get{ return parent;}} /// /// 如何获得一个TElement类型实例的委托 /// public Func GetInstance { get; set; } /// /// 具有fluent特征的追加操作 /// /// /// public FluentCollection Add(TElement t) { list.Add(t); return this; } /// /// 具有fluent特征的空置操作 /// /// public FluentCollection Skip { get { list.Add(GetInstance()); return this; } } /// /// 执行LINQ的foreach操作 /// /// public void ForEach(Action action) { list.ForEach(action); }}/// /// 父节点为table的元素/// class WithTableObject{ Table table; // 父节点 public WithTableObject(Table table) { if(table == null) throw new ArgumentNullException("table"); this.table = table; } /// /// 指向父节点——table /// public Table Parent{get{ return table;}}}

 

2、定义各个节点类型

class Notation{    public Notation(){Data = string.Empty;}    public Notation(string data) {Data = data; }    public string Data { get; private set; }}/// 
/// n元素/// class Item : Notation{ public Item():base(){} public Item(string data) : base(data){}}/// /// col 元素/// class Column : Notation{ public Column():base(){} public Column(string data) : base(data) { }}/// /// line 元素 /// class Line{ FluentCollection items; Body body; public Line(Body body) { if(body == null) throw new ArgumentNullException("body"); this.body = body; items = new FluentCollection (this) { GetInstance = () => { return new Item(); } }; } /// /// 父节点 /// public Body Body { get { return body; } } public FluentCollection Items { get { return items; } } public Line NewLine{get{return body.NewLine;}}}/// /// body 元素/// class Body : WithTableObject{ List lines = new List (); public Body(Table table) : base(table){} public Line NewLine { get { var line = new Line(this); lines.Add(line); return line; } } public List Lines { get { return lines;}} } /// /// head 元素/// class Head : WithTableObject{ FluentCollection columns; public Head(Table table) : base(table) { columns = new FluentCollection (this) { GetInstance = () => { return new Column(); } }; } public FluentCollection Columns { get { return columns; } } } class Table{ string name; Body body; Head head; public Table() { body = new Body(this); head = new Head(this); } public Table Name(string name) { if(string.IsNullOrEmpty(name)) throw new ArgumentNullException("name"); this.name = name; return this; } public override string ToString(){return name;} public Body Body{get{ return body;}} public Head Head{get{ return head;}}}

 

3、定义生成电子表格的数据类型

class Notation{    public Notation(){Data = string.Empty;}    public Notation(string data) {Data = data; }    public string Data { get; private set; }}/// 
/// n元素/// class Item : Notation{ public Item():base(){} public Item(string data) : base(data){}}/// /// col 元素/// class Column : Notation{ public Column():base(){} public Column(string data) : base(data) { }}/// /// line 元素 /// class Line{ FluentCollection items; Body body; public Line(Body body) { if(body == null) throw new ArgumentNullException("body"); this.body = body; items = new FluentCollection (this) { GetInstance = () => { return new Item(); } }; } /// /// 父节点 /// public Body Body { get { return body; } } public FluentCollection Items { get { return items; } } public Line NewLine{get{return body.NewLine;}}}/// /// body 元素/// class Body : WithTableObject{ List lines = new List (); public Body(Table table) : base(table){} public Line NewLine { get { var line = new Line(this); lines.Add(line); return line; } } public List Lines { get { return lines;}}} /// /// head 元素/// class Head : WithTableObject{ FluentCollection columns; public Head(Table table) : base(table) { columns = new FluentCollection (this) { GetInstance = () => { return new Column(); } }; } public FluentCollection Columns { get { return columns; } }} class Table{ string name; Body body; Head head; public Table() { body = new Body(this); head = new Head(this); } public Table Name(string name) { if(string.IsNullOrEmpty(name)) throw new ArgumentNullException("name"); this.name = name; return this; } public override string ToString(){return name;} public Body Body{get{ return body;}} public Head Head{get{ return head;}}}

 

 

4、单元测试

[TestClass]public class FluentInterfaceFixture{    TableWriter writer;    [TestInitialize]      public void Initialize()    {        writer = new TableWriter();    }    [TestMethod]    public void TestFullFillTable()    {        writer.Output(            new Table()                .Name("full fill")                .Head                    .Columns                        .Add(new Column("first"))                        .Add(new Column("second"))                        .Add(new Column("thrid"))                    .Parent                .Parent                .Body                    .NewLine.Items.Add(new Item("11")).Add(new Item("12")).Add(new Item("13")).Parent                    .NewLine.Items.Add(new Item("21")).Add(new Item("22")).Add(new Item("23")).Parent                .Body            .Parent            );    }    [TestMethod]    public void TestSkipColumnTable()    {        writer.Output(            new Table()                .Name("skip columns")                .Head                    .Columns                        .Add(new Column("first"))                        .Skip                        .Add(new Column("thrid"))                    .Parent                .Parent                .Body                    .NewLine.Items.Add(new Item("11")).Add(new Item("12")).Add(new Item("13")).Parent                    .NewLine.Items.Add(new Item("21")).Add(new Item("22")).Add(new Item("23")).Parent                .Body            .Parent            );    }    [TestMethod]    public void TestSkiItemsTable()    {        writer.Output(            new Table()                .Name("skip items")                .Head                    .Columns                        .Add(new Column("first"))                        .Add(new Column("second"))                        .Add(new Column("thrid"))                    .Parent                .Parent                .Body                    .NewLine.Items.Add(new Item("11")).Skip.Add(new Item("13")).Parent                    .NewLine.Items.Add(new Item("21")).Add(new Item("22")).Skip.Parent                .Body            .Parent            );    }    [TestMethod]    public void TestSkipColumnsAndItemsTable()    {        writer.Output(            new Table()                .Name("skip columns and items")                .Head                    .Columns                        .Add(new Column("first"))                        .Skip                        .Add(new Column("thrid"))                    .Parent                .Parent                .Body                    .NewLine.Items.Add(new Item("11")).Skip.Add(new Item("13")).Parent                    .NewLine.Items.Add(new Item("21")).Add(new Item("22")).Skip.Parent                .Body            .Parent            );    }}

 

5、测试结果

------ Test started: Assembly: Concept.Tests.dll ------
full fill first second thrid

  Cadence SPB 16.5 完整下载 (含破解)

Cadence SPB 16.5 完整下载(含破解)

Allegro Orcad

By http://blog.csdn.net/cs9874123/

和谐文件:

Cadence Allegro 16.5 crack 修正 破解 方法 支持 windows 7

一号网盘:

Base_SPB16.50.000_wint_1of5 :http://u.115.com/file/e6kpzze5
Base_SPB16.50.000_wint_2of5 :http://u.115.com/file/bhdtrxup
Base_SPB16.50.000_wint_3of5 :http://u.115.com/file/e6kggk15
Base_SPB16.50.000_wint_4of5 :http://u.115.com/file/bhdtrbr9
Base_SPB16.50.000_wint_5of5 :http://u.115.com/file/e6kgesp4


二号网盘:

解压密码:allegro spb 16.5.000 wint

Base_SPB16.50.000_wint_1of5
http://depositfiles.com/files/urvnww6tq
http://depositfiles.com/files/rlrf4lyni
http://depositfiles.com/files/0zle2ucp9
http://depositfiles.com/files/4pugfxxrs
Base_SPB16.50.000_wint_2of5
http://depositfiles.com/files/ssnz38hlj
http://depositfiles.com/files/4hne09djb
http://depositfiles.com/files/njk9t7zl2
http://depositfiles.com/files/8sqnvevs5
Base_SPB16.50.000_wint_3of5
http://depositfiles.com/files/0wfqjl7oi
http://depositfiles.com/files/71hl9f6hp
http://depositfiles.com/files/kmi2801q3
http://depositfiles.com/files/euivansbo
Base_SPB16.50.000_wint_4of5
http://depositfiles.com/files/76id4fcha
http://depositfiles.com/files/unjzsy6h5
Base_SPB16.50.000_wint_5of5
http://depositfiles.com/files/8jltmt273

  公共参数解决方式

      在我们的项目开发中,经常会定义一些常量来表示同一事物的不同类型或者不同状态,以便于我们页面显示和数据存储。
例如,我们在定义性别时,通常用“0”和“1”来表示“男”和“女”,“0”和“1”我们称之为代码(code),存储到数据库中;
“男”和“女”我们称之为码值(value),显示到页面上给用户看。当我们的项目不太大时,这样定义没有太大问题,
但是,如果项目比较大时,这种代码就会非常多,不利于开发和维护,也不利于页面显示。今天我就分享一下我在项目
开发中使用的解决方式。

       首先,我们需要创建两张表:公共参数种类和公共参数码值(我们也可称为一级码表和二级码表),
一级码表用来记录项目中定义的所有参数类型,如员工性别,付款状态,单据类型等。二级码表用来保存
具体的值,如员工性别有“男”和“女”。假设我们定义员工性别为“18”,则我们可以使用“18A”和“18B”来分别
表示“男”和“女”。表结构如下图所示:

未命名

       既然定义了公共参数,我们就需要对公共参数表进行维护。我们可以在“系统管理”菜单下增加“公共参数管理”的
子菜单,在这里我们可以添加、修改、删除、查询公共参数种类以及码值。如图所示:

添加一级码表

QQ截图20110531114007

添加二级码表

QQ截图20110531114045

查询结果

QQ截图20110531114214 

      这样,我们就完成了码值的存储和维护。我们如何将他们展示到页面上呢。建议使用自定义标签,根据数据库中
查询出来的代码(code),通过我们的自定义标签,直接将代码对应的值显示在页面上。(如何写自定义标签我
就不说了,如果你不会就去google一下)

  为Chrome反广告插件添加过滤器-转载

 

adthwart每种浏览器几乎都有第三方的去广告插件,Chrome也不例外。在Chrome的插件库中有多种去广告插件,大同小异,个人比较喜欢AdThwart(下载AdThwart (606))。这些插件的工作原理与一些不依赖浏览器的反广告软件不同,他们不是使用关键词屏蔽,而是在解析网页时加载一段代码,按照css选择器的方式来阻止黑名单中相应元素的显示(即display:none)。这样的好处在于,其一可以直接将广告所在的块级元素整个不予显示,避免广告去除后留下不和谐的空白;其二通过css选择器过滤,精确有效。

但是如果你只用这些插件中推荐的过滤列表,那么去广告的效果可能并不是特别的好。好在这些插件都提供自己添加过滤器的功能。其实只要灵活应用这些过滤器,滤过的不仅仅只是广告哦!在Chrome的插件库中有一个叫’Better Gmail’的的插件,它的主要功能就是去除Gmail中的广告和一些不需要的元素,比如:聊天边栏、邀请信边栏等。其实这些都可以通过去广告插件来实现。以下就是我用于Gmail的过滤器。

—————gmail——————
mail.google.com##div.nH.mq
mail.google.com##div[style*="width: 225px;"]
mail.google.com##div.nH.pp+div.nH.pp.ps
mail.google.com##div.nH.pp.ps+div.nH.pp.ps

adthwart-filter使用方法:前两条是去广告的,第三条是去邀请信边栏,第四条是去聊天边栏。将需要的过滤器代码复制粘贴到”Add your own filters”中即可实现相应的功能。再回到Gmail看看是不是清爽了很多。

下面以第一条过滤规则为例,简单的说一下创建过滤器的方法。

mail.google.com##div.nH.mq

每条过滤规则分两部分,第一部分是对应的网址”mail.google.com”;第二部分就是css选择器了。二者之间由”##”分割。

对于网址没什么好说的,关键是在于css选择器。’div.nH.mq’的意思就是具有ClassName为’nh mq’的div块级元素。Chrome可以支持到css3中的选择器,如果你学过一些css的话就会很容易上手。表格中的是一些常用到的选择器方法。

*
任何元素

E#myid
id名为’myid’的E元素(div、span等)

E.myclass
class名为’myclass’的E元素

E[foo]
具有’foo’属性的E元素

E[foo*="bar"]
‘foo’属性中包含’bar’字段的E元素

E + F
紧跟随在E元素后的F元素

对于一般的网站用id名和class名就能搞定了,gmail比较变态,很多都是相同的ClassName,有的甚至没有别的属性,最后两条过滤规则中用到了’E+F’的选择方法才得以区分。

更多的选择器方式请看W3C CSS specification

 

*****************************************

俺自己添加的:

image

吼吼,爽!

  CreateThread()之后又马上CloseHandle()的问题

很多程序在创建线程都这样写的:
............
ThreadHandle = CreateThread(NULL,0,.....);
CloseHandel(ThreadHandle );
。。。。。
这不是刚好创建又关闭了吗?线程怎么运行呢?

================================================

Closing a thread handle does not terminate the associated thread. To remove a thread object, you must terminate the thread, then close all handles to the thread.

================================================

1,线程和线程句柄(Handle)不是一个东西,线程是在cpu上运行的.....(说不清楚了),线程句柄是一个内核对象。我们可以通过句柄来操作线程,但是线程的生命周期和线程句柄的生命周期不一样的。线程的生命周期就是线程函数从开始执行到return,线程句柄的生命周期是从CreateThread返回到你CloseHandle()。

2,所有的内核对象(包括线程Handle)都是系统资源,用了要还的,也就是说用完后一定要closehandle关闭之,如果不这么做,你系统的句柄资源很快就用光了。

3,如果你CreateThread以后需要对这个线程做一些操作,比如改变优先级,被其他线程等待,强制TermateThread等,就要保存这个句柄,使用完了在CloseHandle。如果你开了一个线程,而不需要对它进行如何干预,CreateThread后直接CloseHandle就行了。

所以
CloseHandel(ThreadHandle );
只是关闭了一个线程句柄对象,表示我不再使用该句柄,即不对这个句柄对应的线程做任何干预了。并没有结束线程。

如果你觉得多了一个变量,也可以写为:
CloseHandel(CreateThread(NULL,0,.....));

================================================================

《windows核心编程》上说调用closehandle(HANDLE)表示创建者放弃对该内核对象的操作。如果该对象的引用对象记数为0就撤消该对象。

====================================================================

在线程创建后马上调用CloseHandle()是个良好的做法,这里不会影响线程的执行,就是因为即使你close了这个handle,它的内部记数也不为零.   但如果你不关,在线程结束后,那个线程对象将滞留于内存中,也就是说你有handle   leak.
返回这个handle给你,是让你有机会对这个线程实施外部动作,诸如waitforsingleobject之类.

==================================================================

CloseHandle的功能是关闭一个打开的对象句柄,该对象句柄可以是线程句柄,也可以是进程、信号量等其他内核对象的句柄,而ExitThread的功能是终止一个线程,它所接受的参数是一个线程的退出码。
通过调用CloseHandle可以告知系统,已经完成了对某一内核对象的操作,该函数首先检查调用进程的句柄表,来确认进程是否对该句柄所指向的对象有访问权,如果句柄无效则返回FALSE,如果有效,系统将得到该内核对象的数据结构的地址,把结构中的使用计数成员减1,如果计数变为0,则将从内核中释放该内核对象。
如果计数还未到0,就意味着还有其他的进程在使用这个内核对象,那么它就不会被释放。
ExitThread是推荐使用的结束一个线程的方法,当调用该函数时,当前线程的栈被释放,然后线程终止,相对于TerminateThread函数来说,这样做能够更好地完成附加在该线程上的DLL的清除工作。
如果需要进一步的信息,您可以参看:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/handobj_289x.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/prothred_531g.asp
等有关的MSDN信息。

==================================================================

线程作为一种资源创建后不只被创建线程引用,我想系统自身为了管理线程也会有一个引用,所以用户线程释放线程句柄后,引用计数也不会是零。引用计数是资源自我管理的一种机制,资源本身以引用计数为零来得知别人不再需要自己,从而把自己kill掉。

=================================================================

CreateThread后那个线程的引用计数不是1,调用CloseHandle只是说自己对这个线程没有兴趣了,线程还是正常运行的

=================================================================

CreateThread后那个线程的引用计数不是1,而是2。
creating   a   new   process   causes   the   system   to   create   a   process   kernel   object   
and   a   thread   kernel   object.   At   creation   time,   the   system   gives   each   object   
an   initial   usage   count   of   1.   Then,   just   before   CreateProcess   returns,   the   
function   opens   the   process   object   and   the   thread   object   and   places   the   
process-relative   handles   for   each   in   the   hProcess   and   hThread   members   of   
the   PROCESS_INFORMATION   structure.   When   CreateProcess   opens   these   objects   
internally,   the   usage   count   for   each   becomes   2.

=================================================================

创建新的进程后,记数初始化为1,而函数需要返回进程内核对象的句柄,相当于打开一次新创建的类核对象,记数再加1

------------------------------------

CloseHandle函数

BOOL CloseHandle(

HANDLE hObject

);

参数

hObject :代表一个已打开对象handle。

返回值

TRUE:执行成功;

FALSE:执行失败,可以调用GetLastError()获知失败原因。

函数说明:

关闭一个内核对象。其中包括文件、文件映射、进程、线程、安全和同步对象等。在CreateThread成功之后会返回一个hThread的handle,且内核对象的计数加1,CloseHandle之后,引用计数减1,当变为0时,系统删除内核对象。

若在线程执行完之后,没有调用CloseHandle,在进程执行期间,将会造成内核对象的泄露,相当于句柄泄露,但不同于内存泄露,这势必会对系统的效率带来一定程度上的负面影响。但当进程结束退出后,系统会自动清理这些资源。

from:http://blog.csdn.net/lhsxsh/archive/2009/02/18/3905505.aspx

  php扩展之关于extension,zend_extension和zend_extension_ts

php扩展之关于extension,zend_extension和zend_extension_ts

extension意为基于php引擎的扩展

zend_extension意为基于zend引擎的扩展

注:php是基于zend引擎的。晕了吧。

不同的扩展安装后,在php.ini里是用extension还是zend_extension,是取决于该扩展,有的扩展可能只能用zend_extension,如xdebug,也有的扩展可以用extension或zend_extension,如mmcache。

注:上面的结论不保证准确。zend_extension加载php扩展时需用全路径,而extension加载时可以用相对extension_dir的路径。

确定可以用zend_extension之后,还有下面几种可能:

根据 PHP 版本,zend_extension 指令可以是以下之一:

zend_extension              (non ZTS, non debug build)
zend_extension_ts ( ZTS, non debug build)
zend_extension_debug (non ZTS, debug build)
zend_extension_debug_ts ( ZTS, debug build)

ZTS:ZEND Thread Safety

可通过phpinfo()查看ZTS是否启用,从而决定用
zend_extension还是zend_extension_ts,当然试一下怎么生效也可以。



感兴趣的可以试试,有结论了给我留言吧。

  makefile

 

 

1 wildcard 按条件展开

ALL_S_FILES := $(wildcard $(LOCAL_PATH)/$(TARGET_ARCH)/*.S)

2 addprefix 添加前缀

$(addprefix PREFIX,NAMES…)

为name的每一个文件添加前缀

3 filter-out 反过滤函数

$(filter-out , ) 以 模式过滤 字符串中的单词,去除符合模式 的单词。返回不符合模式 的字符串。如果 是 一样或者是其子集,那么返回空。

就是将后者中跟前者一样的除去,剩下前者没有的

C_OBJS := $(filter-out $(ALL_S_OBJS),$(OBJS))

4 filter 过滤函数 与filter-out相反

和“filter-out”函数事项的功能相反。过滤掉字串“TEXT”中所有不符合模式“PATTERN”的单词,保留所有符合此模式的单词。可以有多个模式。存在多个模式时,模式表达式之间使用空格分割。
返回值:空格分割的“TEXT”字串中所有符合模式“PATTERN”的字串。
函数说明:“filter”函数也可以用来筛选一个变量中的某些字符串.

5 $(warning    $())在makefile 中打印内容

  ps – linux 查看进程

ps  :  查看输出这个终端的进程
ps –x   :  查看属于该用于的进程
ps –a  : 查看其它用于进程
ps –u : 查看进程的启动时间
ps –xu
ps –au
ps –axu

  『转』Rails, Wicket, Grails, Play, Lift V.S. JSP

测试结果:JSP无论在单用户还是多用户并发情况下,大大优于其他对手(banq:是否可以得出最接近JSP,最简单MVC或WEB框架性能最好);Rails单用户性能不错,但是并发性能很差,所以它很容易有蒙蔽性,会让人产生错觉;Play框架无论单用户和并发都是倒数第二,羞得Play框架人在原文留言,让作者用native(估计C)来测试,或者用Scala版本的Play来测试。Wicket单用户倒数第一,并发情况下倒是没什么问题,估计还是其基于JSP框架底子撑着。
[该贴被admin于2011-05-31 09:35修改过]

image

image

  关于动态单例设计模式

文章:http://www.lilu.name/Html/diannaojishu/2010-09/003468.html中介绍了三种单例设计模式:动态、静态和可配置。然而这三种模式有一个共同的特点就是都使用了常驻内存的静态变量:静态成员变量或静态局部变量。当单例占用了大量内存且不经常使用时,以上三种模式都不适用;反之,如果单例占用内存较小或经常使用,则可以采用上述模式。针对第一种情况,本文给出了如下动态单例设计模式。

基本思路:使用引用计数(参考c++沉思录中的句柄类)+save/load/clear实现。

适用情况:单例占用了大量内存且不经常使用时

优 点:1、单例特性;2、代理内存管理,用户无需考虑内存管理问题;

缺 点:1、需要额外空间用于保存引用计数;2、需要外存保存单例对象,因此需要占用一部分外存空间。

具体实现:

template<class Type>

class SingletonDynamic;

class Test

{

template<class Type>

friend class SingletonDynamic;

public:

//类的公共接口

void output(void)

{

printf("Test:%d\n",use);

}

void clear(void)

{

//清除test外存

}

//..........

private:

static Test* instance(void)

{

if(0==_instance)

{

_instance= new Test;

_instance->load();

}

use++;

return _instance;

}

void save(void)

{

printf("保存test\n");

}

void load(void)

{

printf("装载test\n");

}

Test(void){use=0;printf("构造Test\n");}

~Test(void){printf("析构Test\n");}

private:

static int use;

static Test* _instance;

};

int Test::use=0;

Test* Test::_instance=0;

template<class Type>

class SingletonDynamic

{

public:

SingletonDynamic(void)

{

iptr=Type::instance();

}

SingletonDynamic(const SingletonDynamic& aSingletonDynamic)

:iptr(aSingletonDynamic.iptr)

{

Test::use++;

}

~SingletonDynamic(void)

{

if(--Test::use==0)

{

iptr->save();

delete iptr;

Test::_instance=0;

}

}

SingletonDynamic& operator=(const SingletonDynamic& aSingletonDynamic)

{

//有意留空

}

public:

Type* operator->(void) const {return iptr;}

Type& operator*(void) const {return *iptr;}

private:

Type* iptr;

};

void f1(SingletonDynamic<Test> a)

{

a->output();

SingletonDynamic<Test> b=a;

b->output();

}

void f2(void)

{

SingletonDynamic<Test> a,b,c;

a->output();

b->output();

c->output();

f1(a);

}

int _tmain(int argc, _TCHAR* argv[])

{

f2();

char ch;

scanf("%c",&ch);

SingletonDynamic<Test> a;

a->clear();

return 0;

}

  试试Live Witer

下了个Live Writer 2011,试试功能哈,还有就是看帖上代码的效果:

   1:  using System;
   2:  using System.Collections.Generic;
   3:  using System.Linq;
   4:  using System.Text;
   5:  using System.Windows;
   6:  using System.Windows.Controls;
   7:  using System.Windows.Data;
   8:  using System.Windows.Documents;
   9:  using System.Windows.Input;
  10:  using System.Windows.Media;
  11:  using System.Windows.Media.Imaging;
  12:  using System.Windows.Navigation;
  13:  using System.Windows.Shapes;
  14:   
  15:  namespace MasterUpgrade
  16:  {
  17:      /// 
   
    
   
  18:      /// LoginPage.xaml 的交互逻辑
  19:      /// 
  20:      public partial class LoginPage : Page
  21:      {
  22:          public LoginPage()
  23:          {
  24:              InitializeComponent();
  25:          }
  26:      }
  27:  }

  激励程序员的9句名言

导读:本文是从《9 Quotes that stayed with me as a developer》这篇文章翻译而来,译文来自外刊IT评论《陪伴我作为程序员的9句名言》。

内容如下:

我发现名人名言能激励人,鼓舞人或有时是煽动人,下面就是我这些年来最喜欢的几句。有时一本书能对你如何写程序或如何解决一个问题具有实实在在影响。有时一句简单的话已足够让你质疑对正在编写的代码的态度。有时候我惊讶于有些人如此的深谙这些藏在我心里多年、只是从未宣讲出来的道理。

“设计是一个发现问题、而不是发现解决方案的过程” —— Leslie Chicoine

“功能说明书里不存在可操作性” —— 37 Signals

“过去的代码都是未经测试的代码” —— Michael Feathers

“任何傻瓜都能写出计算机可以理解的代码。好的程序员能写出人能读懂的代码” —— Martin Fowler

“测试是来表明bug的存在而不是不存在” —— Edsger Dijkstra

“简单不先于复杂,而是在复杂之后” —— Alan Perlis

“Real developers ship” —— Jeff Attwood

“没有绝世神功” —— Frederick Brooks

“过去的33年里,我每天早上看着镜子问自己:“今天是我生命的最后一天吗?我是否要去做今天该做的事?”一天一天太多次是“不是”,我知道这需要改变…所有的事情——所有身外的期望,所有的骄傲,所有的对困难和失败的恐惧——这些东西在死亡面前立刻消失的无影无踪,只剩下真正重要的东西。想着自己即将死去,这是让我避免落入担心失去什么的陷阱里的最好的方法。” —— Steve Jobs

原文出自:9 Quotes that stayed with me as a developer

译文出自:外刊IT评论

  解决 有一个无效 SelectedValue,因为它不在项目列表中

使用DropDownList绑定数据时,有时候会出现问题:有一个无效 SelectedValue,因为它不在项目列表中

产生这个问题的原因是,需绑定的SelectedValue值,在DropDownList中不存在。所以系统抛出异常:

异常详细信息: System.ArgumentOutOfRangeException: “SupplierDrpDwnLst”有一个无效 SelectedValue,因为它不在项目列表中。
参数名: value

 

解决方法:

DropDownList1.SelectedIndex = DropDownList1.Items.IndexOf(DropDownList1.Items.FindByValue("XXX"));

  Linux登录直接进入命令界面

如果当时在安装时设置为一启动就进入图形界面的话,那系统启动后,用户登录界面将是图形化的,有
点象Windows,而且当你输入正确的 用户名与密码,就会直接进入X Window。这个设置是可以修改的:
在/etc目录下有一个inittab文件,其中有一行配置:
id:3:default

  scp—ssh copy

scp h.c user@192.168.0.1:/home/user
scp user@192.168.0.1:/home/user/h.c  ./

  调式A7102的一些心得

A7102设置

A7102有几个时钟,需要说明下

IF时钟:这个根据数据速率来的,已经定好,选择好了数据传送速率,IF速率也就选择好了,如下表:

image 

系统时钟:系统时钟=64*IF时钟,算出系统时钟后,根据以下公式决定寄存器CSC的值:

image

这里要说明下,建议使用A7102时,选用12.8M的晶振,这样使用起来简单

源时钟:f(source)为晶体频率

参考时钟:一般选择800k,根据00寄存器中的GRS来选择,需要设置的寄存器根据以下公式计算:

image

参考比较频率:f(PFD)一般直接选择为晶体频率,这个值应大于40倍数据速率,越大越好,根据公式:

image

其他的设置可按照公式计算得出,

一点非常注意,就是发送和接收的频率不相同,中间可+-一个IF频率,根据08寄存器中的ULS位来决定,打个比方,如果发送的频率为433M,ULS位为0,速率为100K,那得出的IF频率为200K,那么接收端的频率必须设置成432.8M,如果两个模块成对双向通讯,100K速率,可做如下设置

1:频率:433M,ULS为1

2:频率:432.8M,ULS为0

  激发你灵感的 20 个非常规网页布局

我们在策划网页的时候,总是会受一些固定模式的限制,难以创造出“炫”丽夺目的网页效果,看看下面这 20 个网站的设计是否能够激发你新的灵感呢?

转载自不可思E

Festa Coordenadas

20110531102824786 激发你灵感的 20 个非常规网页布局

Beco Digital

20110531102824963 激发你灵感的 20 个非常规网页布局

Taina3

20110531102824521 激发你灵感的 20 个非常规网页布局

Baah Fashion

20110531102825664 激发你灵感的 20 个非常规网页布局

Langoor

20110531102825395 激发你灵感的 20 个非常规网页布局

更多精彩设计 竟在不可思E 原文地址 http://www.tourmsg.com/stimulate-your-inspiration-unconventional-page-layout-20.html

 

  谷歌延迟发布人脸搜索

谷歌很久以前就爆出要推出“人脸搜索”,不可思E也先序报道了相关的内容。不过,最近Google宣布将推迟发布这一项搜索服务,原因在之前的报道中也说明了,就是这项技术开放之后的后果非常的可怕,人们的隐私权也将备受考验。

“人脸搜索”可以让任何一个人只要上传一张你的照片,就可以搜索出你在网上的所有照片,无论是你自己上传在个人博客、个人电子相册上的,或是你亲朋好友、同事同学上传的照片,但照片中有你。进而通过搜索结果,查询到你的其他隐私。

5670448620110531193659099 谷歌延迟发布人脸搜索

Google执行董事长埃里克·施密特表示,人脸搜索技术识别率已经非常高,而发展迅速的程度连他本人都非常担忧。

可以预见,这项技术一旦推出,街边任何一个人,无论是善意的或是敌意的,都可以举起相机拍摄一张你的照片后,就可以在网上轻松“人肉”你的任何隐私。通过搜索出来的照片,进而查到你的名字、查到你的亲朋好友、查到你的微博、查到你的工作,甚至查到你的家人和住宅地址……

来自不可思E的发稿:

当陌生人直呼你的名字

约翰·道格拉斯(前美国联邦调查局著名特工)在他的一本名为《心理神探(Mindhunter)》的书中,介绍过互联网时代之前的一个真实案例,美国一个连环杀手Charlie Davis靠自己在警局的关系根据车牌查出陌生人的姓名,再将对方骗至停车场杀害,在被捕前他杀了五人。这项案例显示,大多数人当别人能够直呼你的姓名时,会倾向于放松警惕。而人脸搜索正是这样一个可能帮助犯罪者查到任何人比名字更多隐私的服务。

实际上目前很多社交网站上,人脸识别技术已经有了雏形。比如在国内流行的开心网和美国的Facebook上,用户自己为相册里的人物加上姓名,然后系统自动为同一相册内所有相同的人脸加上姓名。大多数玩社交网站的网民都十分喜欢这项服务。

而在美国电影中,我们也可以经常看到这样的画面,最典型的就是《谍影重重》系列。电影中调查局为了追踪特工伯恩,不但可以通过身份证系统进行人脸识别,还可以通过任何一个公共场所中的摄像头进行人脸识别。

这些技术早已不再是活在科幻片中的幻想,而是已经来到了每一个普通人的身边,而这项技术如果不加以限制,而是开放给每一个人,其后果是不堪设想的。

技术发展已无法控制

虽然Google董事长埃里克·施密特公开表示推迟了人脸搜索服务。但美国专利商标局仍然在上周发布了谷歌针对公众人物的人脸识别技术专利:自动挖掘公众人物形象的视觉搜索应用。

通过提供人物名单和与其中某个人物相符合的人物图像,谷歌的公众人物人脸搜索可以创造一个精确的符合该名人生物特征的形象,然后识别行为就会在精确度以及回忆的基础之上对人脸进行鉴别,最后决定该人脸属于哪个公众人物,或者根本就是一个未知的非名人。对人脸图片的搜索不只会返回一个被标记的照片,而且还能返回该目标人物在网络上的任何图片。根据该专利内容,数据库已经对30000人中的1000个人进行过测试,其中包括美国总统奥巴马、流行歌手布兰妮、英国哈里王子、布拉德·皮特等。目前,该公众人物人脸识别技术尚不完美。

埃里克·施密特表示,Google不太可能建立数据库供人进行人脸识别,但他也补充说:“有些公司会越过这条线。”

业界观察

虚拟社会里,你无法躲藏

据不完全统计,全球的社交网站用户数已经超过10几亿,这样一个庞大的用户群中积累了巨大无比的人脸数据库,所隐含的安全隐患已经不容忽视。虽然各大网站都设置了一些隐私保护措施,但黑客入侵、倒卖网上隐私数据的现象依旧非常猖獗。

近年来关于高超网络犯罪分子的报道也屡见不鲜,他们善于制造漏洞并取得攻击对象资料,锁定具有高回报价值对象进行诈骗。除了直接攻击某个对象,还同时可以在社交网站上通过假冒用户来攻击其朋友、同事和家人。

目前微博中流行签到功能,通过智能手机的GPS模块,分享自己的位置。人脸照片和地理位置的匹配,使得犯罪分子可以通过网上更加精确地了解对方的照片、特征甚至真实的地理位置。

各种免费的网络服务在为我们提供新鲜、便捷的网络功能的同时,也让我们在网络上无法躲藏。

哪些公司可能推出人脸搜索———

1、社交网站

可能网站:Facebook、腾讯朋友、开心网、人人网等

实际上很多社交网站已经推出了人脸识别的基础功能。只是用户自己为相册里的人物加上姓名,然后系统自动为同一相册内所有相同的人脸加上姓名。

但很快社交网站会进一步强化这个功能,比如Facebook已经决定更进一步,自动为用户识别相册里的好友。如果用户不希望自己被自动识别出来,可以在隐私设置里关掉此功能。但此功能默认开启,用户需要手动关闭,很多人根本不怎么看隐私设置。因此被人直接搜素出照片的几率非常高。

2、微博网站

可能网站:Twitter、新浪微博、腾讯微博、搜狐微博等

微博用户最喜欢就是,即时用手机拍摄自己或是和朋友聚会时候的照片,分享给更多的朋友。这些微博中往往都夹带了许多真实人物的名字。不排除未来微博网站会推出类似社交网站的相册功能,就是当你发照片的时候,自动匹配你好友的名字或微博地址的功能。

比如你会参加聚会,你也会结识很多新朋友,如果没有微博地址怎么办,回家之后,你就会搜索新朋友的名字或者是微博地址。但是如果你怕麻烦,不妨拍下一张照片,然后通过你的手机就会搜索出来新朋友的微博地址哦,如果真的有,这一定很受微博控们欢迎的。

转载自不可思E 原文地址 http://www.tourmsg.com/google-face-search-delay-release.html

菊子曰 今天你 菊子曰了么?

  十大原理/定律

一、彼得原理
每个组织都是由各种不同的职位、等级或阶层的排列所组成,每个人都隶属于其中的某个等级。彼得原理是美国学者劳伦斯•彼得在对组织中人员晋升的相关现象研究后,得出一个结论:在各种组织中,雇员总是趋向于晋升到其不称职的地位。彼得原理有时也被称为向上爬的原理。这种现象在现实生活中无处不在:一名称职的教授被提升为大学校长后,却无法胜任;一个优秀的运动员被提升为主管体育的官员,而无所作为。对一个组织而言,一旦相当部分人员被推到其不称职的级别,就会造成组织的人浮于事,效率低下,导致平庸者出人头地,发展停滞。因此,这就要求改变单纯的根据贡献决定晋升的企业员工晋升机制,不能因某人在某个岗位上干得很出色,就推断此人一定能够胜任更高一级的职务。将一名职工晋升到一个无法很好发挥才能的岗位,不仅不是对本人的奖励,反而使其无法很好发挥才能,也给企业带来损失。
二、酒与污水定律
酒与污水定律是指把一匙酒倒进一桶污水,得到的是一桶污水;如果把一匙污水倒进一桶酒,得到的还是一桶污水。在任何组织里,几乎都存在几个难弄的人物,他们存在的目的似乎就是为了把事情搞糟。最糟糕的是,他们像果箱里的烂苹果,如果不及时处理,它会迅速传染,把果箱里其他苹果也弄烂。烂苹果的可怕之处,在于它那惊人的破坏力。一个正直能干的人进入一个混乱的部门可能会被吞没,而一个无德无才者能很快将一个高效的部门变成一盘散沙。组织系统往往是脆弱的,是建立在相互理解、妥协和容忍的基础上的,很容易被侵害、被毒化。破坏者能力非凡的另一个重要原因在于,破坏总比建设容易。一个能工巧匠花费时日精心制作的陶瓷器,一头驴子一秒钟就能毁坏掉。如果一个组织里有这样的一头驴子,即使拥有再多的能工巧匠,也不会有多少像样的工作成果。如果你的组织里有这样的一头驴子,你应该马上把它清除掉,如果你无力这样做,就应该把它拴起来。
三、木桶定律
水桶定律是讲一只水桶能装多少水,这完全取决于它最短的那块木板。这就是说任何一个组织,可能面临的一个共同问题,即构成组织的各个部分往往是优劣不齐的,而劣势部分往往决定整个组织的水平。水桶定律与酒与污水定律不同,后者讨论的是组织中的破坏力量,最短的木板却是组织中有用的一个部分,只不过比其他部分差一些,你不能把它们当成烂苹果扔掉。强弱只是相对而言的,无法消除,问题在于你容忍这种弱点到什么程度,如果严重到成为阻碍工作的瓶颈,你就不得不有所动作。
四、马太效应
《圣经•马太福音》中有这样一个故事:一个国王远行前,交给3个仆人每人一锭银子,吩咐道:你们去做生意,等我回来时,再来见我。国王回来时,第一个仆人说:主人,你交给我的一锭银子,我已赚了 10锭。于是,国王奖励他10座城邑。第二个仆人报告:主人,你给我的一锭银子,我已赚了5锭。于是,国王奖励他5座城邑。第三仆人报告说:主人,你给我的1锭银子,我一直包在手帕里,怕丢失,一直没有拿出来。于是,国王命令将第三个仆人的1锭银子赏给第一个仆人,说:凡是少的,就连他所有的,也要夺过来。凡是多的,还要给他,叫他多多益善,这就是马太效应,反应当今社会中存在的一个普遍现象,即赢家通吃。对企业经营发展而言,马太效应告诉我们,要想在某一个领域保持优势,就必须在此领域迅速做大。当你成为某个领域的领头羊时,即便投资回报率相同,你也能更轻易地获得比弱小的同行更大的收益。而若没有实力迅速在某个领域做大,就要不停地寻找新的发展领域,才能保证获得较好的回报。
五、零和游戏原理
零和游戏是指一项游戏中,游戏者有输有赢,一方所赢正是另一方所输,游戏的总成绩永远为零,零和游戏原理之所以广受关注,主要是因为人们在社会的方方面面都能发现与零和游戏类似的局面,胜利者的光荣后面往往隐藏着失败者的辛酸和苦涩。20世纪,人类经历两次世界大战、经济高速增长,科技进步、全球一体化以及日益严重的环境污染,零和游戏观念正逐渐被双赢观念所取代。人们开始认识到利已不一定要建立在损人的基础上。通过有效合作皆大欢喜的结局是可能出现的。但从零和游戏走向双赢,要求各方面要有真诚合作的精神和勇气,在合作中不要小聪明,不要总想占别人的小便宜,要遵守游戏规则,否则双赢的局面就不可能出现,最终吃亏的还是合作者自己。
六、华盛顿合作规律
华盛顿合作规律说的是一个人敷衍了事,两个人互相推诿,三个人则永无成事之日。多少有点类似于我们三个和尚的故事。人与人的合作,不是人力的简单相加,而是要复杂和微妙得多。在这种合作中,假定每个人的能力都为1,那么,10个人的合作结果有时比10大得多,有时,甚至比1还要小。因为人不是静止物,而更像方向各异的能量,相互推动时,自然事半功倍,相互抵触时,则一事无成。我们传统的管理理论中,对合作研究得并不多,最直观的反映就是,目前的大多数管理制度和行为都是致力于减少人力的无谓消耗,而非利用组织提高人的效能。换言之,不妨说管理的主要目的不是让每个人做得更好,而是避免内耗过多。
七、手表定理
手表定理是指一个人有一只表时,可以知道现在是几点钟,当他同时拥有两只表时,却无法确定。两只手表并不能告诉一个人更准确的时间,反而会让看表的人失去对准确时间的信心。手表定理在企业经营管理方面,给我们一种非常直观的启发,就是对同一个人或同一个组织的管理,不能同时采用两种不同的方法,不能同时设置两个不同的目标,甚至每一个人不能由两个人同时指挥,否则将使这个企业或这个人无所适从。手表定理所指的另一层含义在于,每个人都不能同时选择两种不同的价值观,否则,你的行为将陷于混乱。
八、不值得定律
不值得定律最直观的表述是:不值得做的的事情,就不值得做好。这个定律再简单不过了,重要性却时时被人们忽视遗忘。不值得定律反映人们的一种心理,一个人如果从事的是一份自认为不值得做的事情,往往会保持冷嘲热讽,敷衍了事的态度,不仅成功率低,而且即使成功,也不觉得有多大的成就感。因此,对个人来说,应在多种可供选择的奋斗目标及价值观中挑选一种,然后为之奋斗。选择你所爱的,爱你所选择的,才可能激发我们的斗志,也可以心安理得。而对一个企业或组织来说,则要很好地分析员工的性格特性,合理分配工作,如让成就欲较强的职工单独或牵头完成具有一定风险和难度的工作,并在其完成时,给予及时的肯定和赞扬;让依附欲较强的职工,更多地参加到某个团体共同工作;让权力欲较强的职工,担任一个与之能力相适应的主管。同时要加强员工对企业目标的认同感,让员工感觉到自己所做的工作是值得的,这样才能激发职工的热情。
九、蘑菇管理
蘑菇管理是许多组织对待初出茅庐者的一种管理方法,初学者被置于阴暗的角落(不受重视的部门,或打杂跑腿的工作),浇上一头大粪(无端的批评、指责、代人受过),任其自生自灭(得不到必要的指导和提携)。相信很多人都有过这样一段蘑菇的经历,这不一定是什么坏事,尤其是当一切刚刚开始的时候,当几天蘑菇,能够消除我们很多不切实际的幻想,让我们更加接近现实,看问题也更加实际。一个组织,一般对新进的人员都是一视同仁,从起薪到工作都不会有大的差别。无论你是多么优秀的人才,在刚开始的时候,都只能从最简单的事情做起,蘑菇的经历,对于成长中的年轻人来说,就象蚕茧,是羽化前必须经历的一步。所以,如何高效率地走过生命的这一段,从中尽可能汲取经验,成熟起来,并树立良好的值得信赖的个人形象,是每个刚入社会的年轻人必须面对的课题。
十、奥卡姆剃刀定律
十二世纪,英国奥卡姆的威廉主张唯名论,只承认确实存在的东西,认为那些空洞无物的普遍性概念都是无用的累赘,应当被无情地剃除。他主张如无必要,勿增实体。这就是常说的奥卡姆剃刀。这把剃刀曾使很多人感到威胁,被认为是异端邪说,威廉本人也因此受到迫害。然而,并未损害这把刀的锋利,相反,经过数百年的岁月,奥卡姆剃刀已被历史磨得越来越快,并早已超载原来狭窄的领域,而具有广泛、丰富、深刻的意义。奥卡姆剃刀定律在企业管理中可进一步演化为简单与复杂定律:把事情变复杂很简单,把事情变简单很复杂。这个定律要求,我们在处理事情时,要把握事情的主要实质,把握主流,解决最根本的问题,尤其要顺应自然,不要把事情人为地复杂化,这样才能把事情处理好。

  混合生产方式(MTO与MTS为例)

一、业务概览

某公司生产的同一种产品正常情况下客户无特别要求,因此采用按库存生产的业务模式,但偶尔客户会有非常细小的改变,这种细小的改变基本不影响BOM和工艺,此时无论是否存在正常的库存,都需要专门生产符合客户需要的产品。

二、系统后台配置实现说明

1、定义需求类型确定的方式(事务代码: OVZI)

本操作使用系统标准设置:需求类型由物料主数据中的计划策略确定,本例中也以此为例。

也可以设置根据项目类别来确定,这样我们可以通过不同的项目类别来确定不同的需求类型。

clip_image002

2、新建计划策略组Z1(事务代码:OPPT)

策略组包括二个标准的策略

按库存生产(MTS)选择系统标准MTS策略中最常见的一种策略40(有最终装配的计划)

按订单生产(MTO)选择系统标准MTO策略中最常见的一种策略20(按订单生产)

clip_image004

3、计划策略的定义(事务代码OPPS)

本操作使用系统标准设置,从下图所示

计划策略40中定义了销售订单创建(客户需求)时的需求类型KSV

计划策略20中定义了销售订单创建(客户需求)时的需求类型KE

clip_image006

5、需求分类(requirement Class)分配给需求类型(requirement Type)(事务代码:OVZH)

clip_image008

6、需求分类(Requirement Class)的确定(事务代码:OVZG)

本操作使用系统标准设置,从下图所示

需求分类040设置了特殊库存E(销售订单库存)。

需求分类050为正常库存

clip_image010

6、系统后台配置总结

本例中使用到的二种业务模式具体设置比较如下

业务模式

计划策略

客户需求的需求类型(Requirement Type)

需求分类(Requirement Class)

特殊库存

MTS按库存生产

40

KSV

050

空白

MTO按订单生产

20

KE

040

E(按订单生产)

三、系统操作说明

1、设置物料的计划策略组为Z1(事务代码MM02)

物料ZF100非限制库存为1000个.

clip_image012

2、创建销售订单,数量10个,执行可用性检查,确认数量也为10个。

系统默认的需求类型为主策略40中定义的需求类型KSV(按库存生产)

clip_image014

3、创建订单2,手工修改需求类型为KE,则尽管有库存,由于需求类型修改为MTO模式,其确认数量为0.

clip_image016

将特殊需求输入到销售订单的行项目的文本“生产记录”(Production Memo)

clip_image018

4、运行MRP,系统将会产生针对销售订单的计划订单(事务代码MD02)

clip_image020

5、将计划订单转为生产订单(事务代码MD04或者CO08)

可以看到销售订单中输入的特殊要求(文本)显示在生产订单中的“生产备忘录”中。

注意:该文本在生产订单中不可修改,当销售订单中后续该文本发生变更时,这里同步发生变更。

clip_image022

6、在销售订单中再次执行可用性检查clip_image024,销售订单需求数量将被确认

clip_image026

四、总结

1、在SAP中,同一个物料通过在计划策略组中设置二种(多种)计划策略来实现不同的业务模式(本例中为MTO和MTS的组合)。

2、在销售订单创建时可以选择主策略、副策略中定义的需求类型,其中计划策略组中的主策略将确定销售订单中默认的需求类型。

3、系统通过定义需求分类(requirement Class)、计划策略来共同确定业务模式(MTO、MTS),其中需求分类又是最为重要的定义。

4、MTO和MTS的生产安排、可用性检查规则相互独立,在MTO业务下,即使存在大量的仓库库存,仍然需要通过专门生产来满足。