日志 关于我们 加入我们
« 1 2 3 4 5 6 7 8 » 
  交互设计是一种思维过程
sunny | 时间:2012年05月04日
网页设计
 

  交互设计师是一个对综合能力要求很多的职业,无法“说一不二”。工具固然很重要,现在很多大企业的设计部门都在制定设计标准,规范性的软件工具掌握越来越受到关注。 不过,我以为然设计师要少些“匠气”,多思考“为什么”,“怎么做”,也就是从“术”逐步转化为“道”的层面。这么说起来交互设计可以归结为思维过程。

  思维方式一:从“平面”到“舞台”的设计
  我们设计时常把内容,想像成一个二维方形界面。一位交互设计前辈曾说设计思维的局限有时在于太拘泥于面前的那个“方块”,就难发挥相象力,如果你把面前的二维方形界面转化一个思维,将它翻转一下(转成45度角)看成一个舞台,你需要的元素都是你的演员,什么时候转场,什么时候出现那位角色,如何出现…很多事情都会豁然开朗。
  其实这种思维方法,就把平时面对的二维交互界面更佳贴合用户接触的三维、四维空间,达到模拟现实,增加用户操作的感知和理解。

  思维方式二:交互设计是关于“时间”的
  思维方式还帮助我们思考“何时出现”,这就是交互设计中非常重要的“时间线”的设计。设计都是有时间的,用户是从开始到最后有时间流逝活动的对象,随着时间的推移,交互介质和交互场景都会发生转化。 即使同一个元素,不同时间状态上展示的方式都应该有所不同。
 
  思维方式三:“术”的过程
  “术”,不仅包含交互设计的初期需要掌握快速原型的方法(纸上快速表现也不错哦),更多的是对常见交互模式的熟知。
  如果你认可:设计是用来解决问题的。交互设计往往为问题提供解决方案。那么,熟知已有的ui模式对于你用来解决常见问题非常有用。

  思维方式四:创新
  所谓设计的创新就是把本应该大的东西做小,本应该小的东西放大。现在想来,其实可以扩散开来,把一些常规的组合打散,把一些元素重新组合。摆脱常规就是一种创新。把不同元素重新组合一起就是一种创新。
  互交设计可以理解为不同思维的集合体,用静、动态界面表达出客户的需求,达到与用户间互动,实现最终目的。
 

Tag:交互设计 思维 网页设计
阅读全文 »
  PHP缓存技术
zyjsms | 时间:2012年05月04日
技术创新
 

普遍缓存技术

数据缓存:这里所说的数据缓存是指数据库查询缓存,每次访问页面的时候,都会先检测相应的缓存数据是否存在,如果不存在,就连接数据库,得到数据,并把查询结果序列化后保存到文件中,以后同样的查询结果就直接从缓存表或文件中获得。

用的最广的例子看Discuz的搜索功能,把结果ID缓存到一个表中,下次搜索相同关键字时先搜索缓存表。

举个常用的方法,多表关联的时候,把附表中的内容生成数组保存到主表的一个字段中,需要的时候数组分解一下,这样的好处是只读一个表,坏处就是两个数据同步会多不少步骤,数据库永远是瓶颈,用硬盘换速度,是这个的关键点。

页面缓存:

每次访问页面的时候,都会先检测相应的缓存页面文件是否存在,如果不存在,就连接数据库,得到数据,显示页面并同时生成缓存页面文件,这样下次访问的时候页面文件就发挥作用了。(模板引擎和网上常见的一些缓存类通常有此功能)

时间触发缓存:

检查文件是否存在并且时间戳小于设置的过期时间,如果文件修改的时间戳比当前时间戳减去过期时间戳大,那么就用缓存,否则更新缓存。

内容触发缓存:

当插入数据或更新数据时,强制更新缓存。

静态缓存:

这里所说的静态缓存是指静态化,直接生成HTML或XML等文本文件,有更新的时候重生成一次,适合于不太变化的页面,这就不说了。

以上内容是代码级的解决方案,我直接CP别的框架,也懒得改,内容都差不多,很容易就做到,而且会几种方式一起用,但下面的内容是服务器端的缓存方案,非代码级的,要有多方的合作才能做到

内存缓存:

Memcached是高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度。

这里说下Memcached的例子:

代码

<?php
$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die ("Could not connect");
$version = $memcache->getVersion();
echo "Server's version: ".$version."\n";
$tmp_object = new stdClass;
$tmp_object->str_attr = 'test';
$tmp_object->int_attr = 123;
$memcache->set('key', $tmp_object, false, 10) or die ("Failed to save data at the server");
echo "Store data in the cache (data will expire in 10 seconds)\n";
$get_result = $memcache->get('key');
echo "Data from the cache:\n";
var_dump($get_result);
?>

读库的例子:

代码

<?php
$sql = 'SELECT * FROM users';
$key = md5($sql);   //memcached 对象标识符
if ( !($datas = $mc->get($key)) ) {
    //  在 memcached 中未获取到缓存数据,则使用数据库查询获取记录集。
    echo "n".str_pad('Read datas from MySQL.', 60, '_')."n";
    $conn = mysql_connect('localhost', 'test', 'test');
    mysql_select_db('test');
    $result = mysql_query($sql);
    while ($row = mysql_fetch_object($result))
        $datas[] = $row;
    //  将数据库中获取到的结果集数据保存到 memcached 中,以供下次访问时使用。
    $mc->add($key, $datas);
} else {
    echo "n".str_pad('Read datas from memcached.', 60, '_')."n";
}
var_dump($datas);
?>

php的缓冲器:

有eaccelerator, apc, phpa,xcache,这个这个就不说了吧,搜索一堆一堆的,自己看啦,知道有这玩意就OK

MYSQL缓存:

这也算非代码级的,经典的数据库就是用的这种方式,看下面的运行时间,0.09xxx之类的
我贴段根据蓝色修改后部分my.ini,2G的MYISAM表可以在0.05S左右,据说他前后改了有快一年

代码拷贝框

代码

[client]
……
default-character-set=gbk
default-storage-engine=MYISAM
max_connections=600
max_connect_errors=500
back_log=200
interactive_timeout=7200
query_cache_size=64M
……
table_cache=512
……
myisam_max_sort_file_size=100G
myisam_max_extra_sort_file_size=100G
myisam_sort_buffer_size=128M
key_buffer_size=1024M
read_buffer_size=512M
……
thread_concurrency=8

基于反向代理的Web缓存:

如Nginx,SQUID,mod_proxy(apache2以上又分为mod_proxy和mod_cache)
NGINX的例子

代码

<nginx.conf>
#user  nobody;
worker_processes  4;
error_log  logs/error.log crit;
pid        logs/nginx.pid;
worker_rlimit_nofile 10240;
events {
    use epoll;
    worker_connections  51200;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile    on;
    keepalive_timeout 65;
    tcp_nodelay on;
    # server pool
    upstream bspfrontsvr {
            server 10.10.10.224:80   weight=1;
            server 10.10.10.221:80   weight=1;
    }
  
    upstream bspimgsvr {
            server 10.10.10.201:80   weight=1;
    }
  
    upstream bspstylesvr {
            server 10.10.10.202:80   weight=1;
    }
  
    upstream bsphelpsvr {
            server 10.10.10.204:80   weight=1;
    }
  
    upstream bspwsisvr {
            server 10.10.10.203:80   weight=1;
    }
  
    upstream bspadminsvr {
            server 10.10.10.222:80   weight=1;
    }
  
    upstream bspbuyersvr {
            server 10.10.10.223:80   weight=1;
    }
  
    upstream bspsellersvr {
            server 10.10.10.225:80   weight=1;
    }
    upstream  bsploginsvr  {
            server 10.10.10.220:443  weight=1;
    }
    upstream  bspregistersvr  {
            server 10.10.10.220:80  weight=1;
    }
    log_format  test_com  '$remote_addr - $remote_user [$time_local] "$request" '
                             '$status $body_bytes_sent "$http_referer" "$http_user_agent" ';
    #--------------------------------------------------------------------
    #img.test.com
    server {
        listen       10.10.10.230:80;
        server_name  img.test.com;
        location / {
                        proxy_pass      http://bspimgsvr;
                        include         proxy_setting.conf;
        }
        access_log  logs/img.log  test_com;
    }
  
    #style.test.com
    server {
        listen       10.10.10.230:80;
        server_name  style.test.com;
        location / {
                        proxy_pass      http://bspstylesvr;
                        include         proxy_setting.conf;
        }
        access_log  logs/style.log  test_com;
    }
  
  
    #help.test.com
    server {
        listen       10.10.10.230:80;
        server_name  help.test.com;
        location / {
                        proxy_pass      http://bsphelpsvr;
                        include         proxy_setting.conf;
        }
        access_log  logs/help.log  test_com;
    }
  
  
    #admin.test.com
    server {
        listen       10.10.10.230:80;
        server_name  admin.test.com;
        location / {
                        proxy_pass      http://bspadminsvr;
                        include         proxy_setting.conf;
        }
        access_log  logs/admin.log  test_com;
    }
  
    #buyer.test.com
    server {
        listen       10.10.10.230:80;
        server_name  buyer.test.com;
        location / {
                        proxy_pass      http://bspbuyersvr;
                        include         proxy_setting.conf;
        }
        access_log  logs/buyer.log  test_com;
    }
  
    #seller.test.com
    server {
        listen       10.10.10.230:80;
        server_name  seller.test.com;
        location / {
                        proxy_pass      http://bspsellersvr;
                        include         proxy_setting.conf;
        }
        access_log  logs/seller.log  test_com;
    }
    #wsi.test.com
    server {
        listen       10.10.10.230:80;
        server_name  wsi.test.com;
        location / {
                        proxy_pass      http://bspwsisvr;
                        include         proxy_setting.conf;
        }
        access_log  logs/wsi.log  test_com;
    }
    #www.test.com
    server {
        listen       10.10.10.230:80;
        server_name  www.test.com   *.test.com;
        location ~ ^/NginxStatus/ {
            stub_status on;
            access_log off;
        }
        location / {
                        proxy_pass      http://bspfrontsvr;
                        include         proxy_setting.conf;
        }
        access_log  logs/www.log  test_com;
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    } 
    #login.test.com
    server {
        listen       10.10.10.230:443;
        server_name  login.test.com;
        ssl                  on;
        ssl_certificate      cert.pem;
        ssl_certificate_key  cert.key;
        ssl_session_timeout  5m;
        ssl_protocols  SSLv2 SSLv3 TLSv1;
        ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
        ssl_prefer_server_ciphers   on;
        location / {
                        proxy_pass        https://bsploginsvr;
                        include         proxy_setting.conf;
        }
        access_log  logs/login.log  test_com;
    }
    #login.test.com for register
    server {
        listen       10.10.10.230:80;
        server_name  login.test.com;
        location / {
                        proxy_pass        http://bspregistersvr;
                        include         proxy_setting.conf;
        }  
        access_log  logs/register.log  test_com;
    } 
  
}
<conf/proxy_setting.conf>
                        proxy_redirect          off;
                        proxy_set_header        Host $host;
                        proxy_set_header        X-Real-IP $remote_addr;
                        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
                        client_max_body_size    10m;
                        client_body_buffer_size 128k;
                        proxy_connect_timeout   90;
                        proxy_send_timeout      90;
                        proxy_read_timeout      90;
                        proxy_buffer_size       4k;
                        proxy_buffers           4 32k;
                        proxy_busy_buffers_size 64k;
                        proxy_temp_file_write_size 64k;

mod_proxy的例子:

代码

<VirtualHost *>
ServerName www.zxsv.com
ServerAdmin admin@zxsv.com
# reverse proxy setting
ProxyPass / http://www.zxsv.com:8080/
ProxyPassReverse / http://www.zxsv.com:8080/
# cache dir root
CacheRoot "/var/www/proxy"
# max cache storage
CacheSize 50000000
# hour: every 4 hour
CacheGcInterval 4
# max page expire time: hour
CacheMaxExpire 240
# Expire time = (now - last_modified) * CacheLastModifiedFactor
CacheLastModifiedFactor 0.1
# defalt expire tag: hour
CacheDefaultExpire 1
# force complete after precent of content retrived: 60-90%
CacheForceCompletion 80
CustomLog /usr/local/apache/logs/dev_access_log combined
</VirtualHost>

而SQUID的例子 ,这方面网上有写的太多。

Tag:缓存
阅读全文 »
  经典SQL语句大全
zyjsms | 时间:2012年05月04日
技术创新
 

一、基础

1、说明:创建数据库
CREATE DATABASE database-name
2、说明:删除数据库
drop database dbname
3、说明:备份sql server
--- 创建 备份数据的 device
USE master
EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat'
--- 开始 备份
BACKUP DATABASE pubs TO testBack
4、说明:创建新表
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)

根据已有的表创建新表:
A:create table tab_new like tab_old (使用旧表创建新表)
B:create table tab_new as select col1,col2… from tab_old definition only
5、说明:删除新表
drop table tabname
6、说明:增加一个列
Alter table tabname add column col type
注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。
7、说明:添加主键: Alter table tabname add primary key(col)
说明:删除主键: Alter table tabname drop primary key(col)
8、说明:创建索引:create [unique] index idxname on tabname(col….)
删除索引:drop index idxname
注:索引是不可更改的,想更改必须删除重新建。
9、说明:创建视图:create view viewname as select statement
删除视图:drop view viewname
10、说明:几个简单的基本的sql语句
选择:select * from table1 where 范围
插入:insert into table1(field1,field2) values(value1,value2)
删除:delete from table1 where 范围
更新:update table1 set field1=value1 where 范围
查找:select * from table1 where field1 like ’%value1%’ ---like的语法很精妙,查资料!
排序:select * from table1 order by field1,field2 [desc]
总数:select count as totalcount from table1
求和:select sum(field1) as sumvalue from table1
平均:select avg(field1) as avgvalue from table1
最大:select max(field1) as maxvalue from table1
最小:select min(field1) as minvalue from table1
11、说明:几个高级查询运算词
A: UNION 运算符
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。
B: EXCEPT 运算符
EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。
C: INTERSECT 运算符
INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。
注:使用运算词的几个查询结果行必须是一致的。
12、说明:使用外连接
A、left (outer) join:
左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。
SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
B:right (outer) join:
右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。
C:full/cross (outer) join:
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。
12、分组:Group by:
   一张表,一旦分组 完成后,查询后只能得到组相关的信息。
    组相关的信息:(统计信息) count,sum,max,min,avg  分组的标准)
    在SQLServer中分组时:不能以text,ntext,image类型的字段作为分组依据
   在selecte统计函数中的字段,不能和普通的字段放在一起;

13、对数据库进行操作:
   分离数据库: sp_detach_db; 附加数据库:sp_attach_db 后接表明,附加需要完整的路径名
14.如何修改数据库的名称:
sp_renamedb 'old_name', 'new_name'

 

二、提升

1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用)
法一:select * into b from a where 1<>1(仅用于SQlServer)
法二:select top 0 * into b from a
2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用)
insert into b(a, b, c) select d,e,f from b;

3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)
insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件
例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where..

4、说明:子查询(表名1:a 表名2:b)
select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)

5、说明:显示文章、提交人和最后回复时间
select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b

6、说明:外连接查询(表名1:a 表名2:b)
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

7、说明:在线视图查询(表名1:a )
select * from (SELECT a,b,c FROM a) T where t.a > 1;

8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括
select * from table1 where time between time1 and time2
select a,b,c, from table1 where a not between 数值1 and 数值2

9、说明:in 的使用方法
select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)

10、说明:两张关联表,删除主表中已经在副表中没有的信息
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )

11、说明:四表联查问题:
select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....

12、说明:日程安排提前五分钟提醒
SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5

13、说明:一条sql 语句搞定数据库分页
select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段
具体实现:
关于数据库分页:

  declare @start int,@end int

  @sql  nvarchar(600)

  set @sql=’select top’+str(@end-@start+1)+’+from T where rid not in(select top’+str(@str-1)+’Rid from T where Rid>-1)’

  exec sp_executesql @sql


注意:在top后不能直接跟一个变量,所以在实际应用中只有这样的进行特殊的处理。Rid为一个标识列,如果top后还有具体的字段,这样做是非常有好处的。因为这样可以避免 top的字段如果是逻辑索引的,查询的结果后实际表中的不一致(逻辑索引中的数据有可能和数据表中的不一致,而查询时如果处在索引则首先查询索引)

14、说明:前10条记录
select top 10 * form table1 where 范围

15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)

16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表
(select a from tableA ) except (select a from tableB) except (select a from tableC)

17、说明:随机取出10条数据
select top 10 * from tablename order by newid()

18、说明:随机选择记录
select newid()

19、说明:删除重复记录
1),delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)
2),select distinct * into temp from tablename
  delete from tablename
  insert into tablename select * from temp
评价: 这种操作牵连大量的数据的移动,这种做法不适合大容量但数据操作
3),例如:在一个外部表中导入数据,由于某些原因第一次只导入了一部分,但很难判断具体位置,这样只有在下一次全部导入,这样也就产生好多重复的字段,怎样删除重复字段

alter table tablename
--添加一个自增列
add  column_b int identity(1,1)
 delete from tablename where column_b not in(
select max(column_b)  from tablename group by column1,column2,...)
alter table tablename drop column column_b

20、说明:列出数据库里所有的表名
select name from sysobjects where type='U' // U代表用户

21、说明:列出表里的所有的列名
select name from syscolumns where id=object_id('TableName')

22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。
select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type
显示结果:
type vender pcs
电脑 A 1
电脑 A 1
光盘 B 2
光盘 A 2
手机 B 3
手机 C 3

23、说明:初始化表table1

TRUNCATE TABLE table1

24、说明:选择从10到15的记录
select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc

三、技巧

1、1=1,1=2的使用,在SQL语句组合时用的较多

“where 1=1” 是表示选择全部    “where 1=2”全部不选,
如:
if @strWhere !=''
begin
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere
end
else
begin
set @strSQL = 'select count(*) as Total from [' + @tblName + ']'
end

我们可以直接写成

错误!未找到目录项。
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where 1=1 安定 '+ @strWhere 2、收缩数据库
--重建索引
DBCC REINDEX
DBCC INDEXDEFRAG
--收缩数据和日志
DBCC SHRINKDB
DBCC SHRINKFILE

3、压缩数据库
dbcc shrinkdatabase(dbname)

4、转移数据库给新用户以已存在用户权限
exec sp_change_users_login 'update_one','newname','oldname'
go

5、检查备份集
RESTORE VERIFYONLY from disk='E:\dvbbs.bak'

6、修复数据库
ALTER DATABASE [dvbbs] SET SINGLE_USER
GO
DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK
GO
ALTER DATABASE [dvbbs] SET MULTI_USER
GO

7、日志清除
SET NOCOUNT ON
DECLARE @LogicalFileName sysname,
 @MaxMinutes INT,
 @NewSize INT


USE tablename -- 要操作的数据库名
SELECT  @LogicalFileName = 'tablename_log', -- 日志文件名
@MaxMinutes = 10, -- Limit on time allowed to wrap log.
 @NewSize = 1  -- 你想设定的日志文件的大小(M)

Setup / initialize
DECLARE @OriginalSize int
SELECT @OriginalSize = size
 FROM sysfiles
 WHERE name = @LogicalFileName
SELECT 'Original Size of ' + db_name() + ' LOG is ' +
 CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' +
 CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB'
 FROM sysfiles
 WHERE name = @LogicalFileName
CREATE TABLE DummyTrans
 (DummyColumn char (8000) not null)


DECLARE @Counter    INT,
 @StartTime DATETIME,
 @TruncLog   VARCHAR(255)
SELECT @StartTime = GETDATE(),
 @TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY'

DBCC SHRINKFILE (@LogicalFileName, @NewSize)
EXEC (@TruncLog)
-- Wrap the log if necessary.
WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired
 AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName) 
 AND (@OriginalSize * 8 /1024) > @NewSize 
 BEGIN -- Outer loop.
SELECT @Counter = 0
 WHILE   ((@Counter < @OriginalSize / 16) AND (@Counter < 50000))
 BEGIN -- update
 INSERT DummyTrans VALUES ('Fill Log') DELETE DummyTrans
 SELECT @Counter = @Counter + 1
 END
 EXEC (@TruncLog) 
 END
SELECT 'Final Size of ' + db_name() + ' LOG is ' +
 CONVERT(VARCHAR(30),size) + ' 8K pages or ' +
 CONVERT(VARCHAR(30),(size*8/1024)) + 'MB'
 FROM sysfiles
 WHERE name = @LogicalFileName
DROP TABLE DummyTrans
SET NOCOUNT OFF

8、说明:更改某个表
exec sp_changeobjectowner 'tablename','dbo'

9、存储更改全部表

CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch
@OldOwner as NVARCHAR(128),
@NewOwner as NVARCHAR(128)
AS

DECLARE @Name    as NVARCHAR(128)
DECLARE @Owner   as NVARCHAR(128)
DECLARE @OwnerName   as NVARCHAR(128)

DECLARE curObject CURSOR FOR
select 'Name'    = name,
   'Owner'    = user_name(uid)
from sysobjects
where user_name(uid)=@OldOwner
order by name

OPEN   curObject
FETCH NEXT FROM curObject INTO @Name, @Owner
WHILE(@@FETCH_STATUS=0)
BEGIN    
if @Owner=@OldOwner
begin
   set @OwnerName = @OldOwner + '.' + rtrim(@Name)
   exec sp_changeobjectowner @OwnerName, @NewOwner
end
-- select @name,@NewOwner,@OldOwner

FETCH NEXT FROM curObject INTO @Name, @Owner
END

close curObject
deallocate curObject
GO


10、SQL SERVER中直接循环写入数据
declare @i int
set @i=1
while @i<30
begin
    insert into test (userid) values(@i)
    set @i=@i+1
end
案例:
有如下表,要求就裱中所有

Tag:SQL
阅读全文 »
  3招提升职场幸福指数
gongjie | 时间:2012年05月03日
悦读周末
 

  社会挑战和现实残酷不因性别差异为转移,女人在职场中所承受的压力与男人不相上下。在这期间,自己的职业规划是产生欲望的一个方面,更强的压力还来自身边人 的无形期待。调查表明,欲望越强,幸福指数越低,也会让自己内心疲累。但另一份心理研究报告指出,与大多数人想象不同的是,女人面对压力挑战时更具柔韧性 与变通性,抗压能力实际远远高于男人。所以,其实你比想象中更有潜力。想要提高内心幸福指数?

  1、拥有好胜心,向自身目标做努力,不与他人做攀比。

  所 谓家家有本难念的经,职场之中也是如此,别人光鲜外表下也隐藏着常人难以想象的辛苦艰难。而我们往往只能看到亮丽的一面,却难以看到背后的苦楚烦恼。有人 说,上帝给你一样东西,就必然要拿走另一样东西作为交换。与其羡慕别人的美好生活,不如全力以赴把自己的故事演绎精彩。

  所 谓成功,就是达到自己设定的短期目标,在实现终极目标的道路上更进一步。你的参照物只有自己,与他人无关。即使长征路上只进步一点点,也意味着其中包含无 数辛劳汗水,弥足珍贵。付出努力,并学会享受成功的喜悦感,是让心灵保持活力所不可缺少的营养。向自身目标做努力,不与他人做攀比,将没用的思想负担统统 丢掉,幸福指数就能提高!

  2、拟定具有自己特色的职场规划清单

  欲望是人类自产生就拥有的一种情绪,佛教有一句偈语:光明只是短暂一瞬,黑暗才是永恒。人类在光明与黑暗的区间中生存,很难完全断绝欲念,但是人类可以自我调节情绪、用脑思考指导行动,这就是区别于动物的最大特点——我们更要善于运用大脑的这项能力。

  满足于现状并不等于失去进取动力,而是把目标计划定在可执行的范围内慢慢实现,不要过于痴迷欲念。列一个具有自己特色的专属清单,针对个人特性、优势,制定适合自己的职业规划和生活蓝图,让自己的生活更轻松。

  3、让“幻想”变成好习惯。

  这里的幻想指的是正面思考,放松大脑和意识,坚持如此使之形成习惯,每天留给自己一部分时间。

  白天忙碌的工作时,也许根本无法思考关于自己的人生规划甚至第二天的工作计划。而睡前的冥想能让你更好地了解自己,也会让第二天的生活更有秩序,工作效率更高。

  有 一种宇宙吸引力的说法,即正面思想会吸引好的事情,负面情绪会吸引坏的事情。这存在一种神秘的宇宙力量,也就是万事万物冥冥之中都具有一种神秘趋向性,关 键在于出发点在哪。从科学角度看,悉心冥想自己拥有的一切,情绪和精神在这种指引下会充满正面力量,让生活变得锦上添花更美好。而不满、抱怨等负面情绪则 让你没办法以饱满的精神状态面对挑战,坏的事情自然接踵而来。

Tag:职场 幸福
阅读全文 »
  网站用户体验的五大分类(五)
yangivy | 时间:2012年05月02日
用户体验
 

  五、信任体验:呈现给用户的信任体验,强调可靠性。

  62. 搜索引擎:查找相关内容可以显示在搜索引擎前列。

  63. 公司介绍:真实可靠的信息发布,包括公司规模、发展状况、公司资质等。

  64. 投资者关系:上市公司需为股民提供真实准确的年报,财务信息等。

  65. 服务保障:将公司的服务保障清晰列出,增强客户信任。

  66. 页面标题:准确地描述公司名称及相关内容。

  67. 文章来源:为摘引的文章标注摘引来源,避免版权纠纷。

  68. 文章编辑作者:为原创性文章注明编辑或作者,以提高文章的可信度。 

  69. 联系方式:准确有效的地址、电话等联系方式,便于查找。

  70. 服务热线:将公司的服务热线列在醒目的地方,便于客户查找。

  71. 有效的投诉途径:为客户提供投诉或建议邮箱或在线反馈。

  72. 安全及隐私条款:对于交互式网站,注明安全及隐私条款可以减少客户顾虑,避免纠纷。

  73. 法律声明:对于网站法律条款的声明可以避免企业陷入不必要的纠纷中。

  74. 网站备案:让浏览者确认网站的合法性。

  75. 相关链接:对于集团企业及相关企业的链接,应该具有相关性。

  76. 帮助中心:对于流程较复杂的服务,必须具备帮助中心进行服务介绍。

  真是不看不知道,一个看似普通的网站,竟然有这么多项体验点,而且还都是最最基本的项目。由此可见,关于用户所体验的每一个点,都应该是经过慎重考虑和论证以后的决定。

全文(完)

阅读全文 »
  网站用户体验的五大分类(四)
yangivy | 时间:2012年04月28日
用户体验
 

【接网站用户体验的五大分类(三)】

  四、情感体验:呈现给用户心理上的体验,强调友好性。 

  50. 客户分类:将不同的浏览者进行划分(如消费者、经销商、内部员工),为客户提供不同的服务。

  51. 友好提示:对于每一个操作进行友好提示,以增加浏览者的亲和度。

  52. 会员交流:提供便利的会员交流功能(如论坛),增进会员感情。

  53. 售后反馈:定期进行售后的反馈跟踪,提高客户满意度。

  54. 会员优惠:定期举办会员优惠活动,让会员感觉到实实在在的利益。 

  55. 会员推荐:根据会员资料及购买习惯,为其推荐适合的产品或服务。

  56. 鼓励用户参与:提供用户评论、投票等功能,让会员更多地参与进来。

  57. 会员活动:定期举办网上会员活动,提供会员网下交流机会。

  58. 专家答疑:为用户提出的疑问进行专业解答。

  59. 邮件/短信问候:针对不同客户,为客户定期提供邮件/短信问候,增进与客户间感情。

  60. 好友推荐:提供邮件推荐功能。

  61. 网站地图:为用户提供清晰的网站指引。

网站用户体验的五大分类(四) 完

阅读全文 »
  网页导航五点细节处理
sunny | 时间:2012年04月27日
网页设计
 

  网页导航是设计网站时需要考虑的一个最重要的方面。网页导航的首要的目的是让访客在你的网站简单迅速地找到他们想要搜寻的内容。高效的导航可以引导浏览者在你的网站尝试搜寻其他内容。在本文中,我们将探讨一些设计有效的网页导航的基本准则。现在我们从5个细节处理来说明:
  
  组织良好的链接
  确保你的链接按照重要性有序排列。浏览者能在不同分类中轻松找到他们想搜索的内容。

  清晰且鲜明
  一旦你决定做链接,你需要考虑把它们置于最优位置。导航必须突出且鲜明。把你设计的链接置于页面顶部或左侧这些最抢眼的位置上。同时,把一些主要的链接置于页面顶部,这样浏览者不用滚动鼠标就可以一目了然。图片的链接应和谐地融入网站设计。避免将链接放置在页面的底部,这样的话,浏览者只有下翻到页底才能看到这些链接。你可以将重要链接同时置于顶部和底部,已引起访客注意。

  连贯性
  导航必须清晰且连贯。在网站每一页的相同位置都应设有相同顺序的重要链接。不要因为不同页面链接的顺序问题让你的浏览者感到困惑。

  易于理解
  确保连接言简意赅。通常你不会有很大的空间来设置长链接,确保空间的有效利用。
  访客需要了然点击链接的位置,因此链接的设置应易于理解,否则没人会点击你的链接,这将有悖于设计网页链接的初衷。

  菜单
  如果你的每个一大堆的分类栏和子栏,你需要导航菜单来帮助你组织链接。网上有很多粘贴脚本,你可以借助它们创建强大的导航系统。

  将这些细节处理铭记于心,你就可以为你的网站创建有效的导航系统。参考其他的网站你会在设计导航系统的技术上有新的思路!
 

Tag:网页导航 网页设计
阅读全文 »
  网站用户体验的五大分类(三)
yangivy | 时间:2012年04月24日
用户体验
 

【接网站用户体验的五大分类(二)】

  三、浏览体验:呈现给用户浏览上的体验,强调吸引性。

  28. 栏目的命名:与栏目内容准确相关,简洁清晰,不宜过于深奥。

  29. 栏目的层级:最多不超过三层,导航清晰,运用JAVAscrip等技术使得层级之间伸缩便利。

  30. 内容的分类:同一栏目下,不同分类区隔清晰,不要互相包含或混淆。

  31. 内容的丰富性:每一个栏目应确保足够的信息量,避免栏目无内容情况出现。

  32. 内容的原创性:尽量多采用原创性内容,以确保内容的可读性。

  33. 信息的更新频率:确保稳定的更新频率,以吸引浏览者经常浏览。

  34. 信息的编写方式:段落标题加粗,以区别于内文。采用倒金字塔结构。

  35. 新文章的标记:为新文章提供不同标识(如new),吸引浏览者查看。

  36. 文章导读:为重要内容在首页设立导读,使得浏览者可以了解到所需信息。文字截取字数准确,避免断章取义。

  37. 精彩内容的推荐:在频道首页或文章左右侧,提供精彩内容推荐,吸引浏览者浏览。 

  38. 相关内容的推荐:在用户浏览文章的左右侧或下部,提供相关内容推荐,吸引浏览者浏览。

  39. 收藏夹的设置:为会员设置收藏夹,对于喜爱的产品或信息,可进行收藏。

  40. 栏目的订阅:提供Rss或邮件订阅功能

  41. 信息的搜索:在页面的醒目位置,提供信息搜索框,便于查找到所需内容。

  42. 页面打印:允许用户打印该页资料,以便于保存。

  43. 文字排列:标题与正文明显区隔,段落清晰。

  44. 文字字体:采用易于阅读的字体,避免文字过小或过密造成的阅读障碍。可对字体进行大中小设置,以满足不同的浏览习惯。

  45. 页面底色:不能干扰主体页面的阅读。

  46. 页面的长度:设置一定的页面长度,避免页面过长而影响阅读。

  47. 分页浏览:对于长篇文章 进行分页浏览。

  48. 语言版本:为面向不同国家的客户提供不同的浏览版本。

  49. 快速通道:为有明确目的的用户提供快速入口。

网站用户体验的五大分类(三) 完

阅读全文 »
  网站用户体验的五大分类(二)
yangivy | 时间:2012年04月23日
用户体验
 

【接网站用户体验的五大分类(一)】

  二、交互体验:呈现给用户操作上的体验,强调易用/可用性。

  13. 会员申请:介绍清晰的会员权责,并提示用户确认已阅读条款。

  14. 会员注册:流程清晰、简洁。待会员注册成功后,再详细完善资料。

  15. 表单填写:尽量采用下拉选择,需填写部分需注明要填写内容,并对必填字段作出限制。(如手机位数、邮编等等,避免无效信息)

  16. 表单提交:表单填写后需输入验证码,防止注水。提交成功后,应显示感谢提示。

  17. 按钮设置:对于交互性的按钮必须清晰突出,以确保用户可以清楚地点击。

  18. 点击提示:点击浏览过的信息颜色需要显示为不同的颜色,以区分于未阅读内容,避免重复阅读。

  19. 错误提示:若表单填写错误,应指明填写错误之处,并保存原有填写内容,减少重复工作。

  20. 在线问答:用户提问后后台要及时反馈,后台显示有新提问以确保回复及时。

  21. 意见反馈:当用户在使用中发生任何问题,都可随时提供反馈意见。

  22. 在线调查:为用户关注的问题设置调查,并显示调查结果,提高用户的参与度。

  23. 在线搜索:搜索提交后,显示清晰列表,并对该搜索结果中的相关字符以不同颜色加以区分。

  24. 页面刷新:尽量采用无刷新(AJAX)技术,以减少页面的刷新率。Ajax是新兴的网络开发技术的象征。它将JavaScript和XML技术结合在一起,用户每次调用新数据时,无需反复向服务器发出请求,而是在浏览器的缓存区预先获取下次可能用到的数据,界面的响应速度因此得到了显著提升。

  25. 新开窗口:尽量减少新开的窗口,以避免开过多的无效窗口,设置弹出窗口的关闭功能。

  26. 资料安全:确保资料的安全保密,对于客户密码和资料进行加密保存。

  27. 显示路径:无论用户浏览到哪一个层级,哪一个页面,都可以清楚知道看到该页面的路径。

网站用户体验的五大分类(二) 完

阅读全文 »
  PHP异步调用、多线程、计划任务
zyjsms | 时间:2012年04月20日
技术创新
 

异步调用一般用来执行耗时较长的操作,让程序在服务器后台执行,前台用户无需等待。

如某SNS社区,在系统里,用户给自己的好友(好友数量上百)发送邮件,每封邮件内容不一,发送后提示发送完毕!
常用PHP写法
sendmail.php
<?php
$count=count($emailarr);//$emailarr数组为好友的邮件地址
for($i=0;$i<$count;$i++){
sendmail(.....);//发送邮件
}
echo '发送完毕';
?>
假设该次发送100封邮件。本次操作会出现什么结果呢?
用户体验:用户等待->发送数十封邮件出去->系统超时返回错误信息
本次操作由于需要发送大量的邮件,导致php执行时间过长,用户烦躁的等待。当apache或者nginx等待超过允许执行时间,返回超时错误。这个时候用户不明确本次操作到底成功与否,到底发出了几封邮件。
我们可以看出该代码用户体验极差,并且不能够顺利完成任务。
那应该怎么操作呢?
这里提到一个概念,异步执行
用户体验:用户等待->发送完毕
朋友们就会问,怎么缺少发信环节?
OK,发信环节就在用户提交请求的时候,把发信任务转给了一个单独处理发信的php程序处理了,当用户看见“发送完毕”的时候其实信还没发送完,这个时候,发信程序正在后台努力的工作着,一封一封的向外发送
sendmail.php
 
<?php
$domain="www.xxxxxx.com";
$url="/system_mail.php";
$par="email=".implode(',',$emailarr)."&........";
$header = "POST $url HTTP/1.0\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($par) . "\r\n\r\n";
$fp = @fsockopen ($domain, 80, $errno, $errstr, 30);
fputs ($fp, $header . $par);
fclose($fp);
echo '发送完毕';
?>
system_mail.php
 
<?php
ini_set("ignore_user_abort",true);
//ignore_user_abort(true);此处的代码需要php.ini开启相关的选项,保证php执行不超时的,“关闭浏览器后,php脚本会不会继续运行”
//获取email地址,发信,此处为发信代码
?>
好了,改成异步方式后,用户提交信息,可以立即得到结果“发送完毕”。信呢,会在后台一封一封的发送,直到发送完毕。

php计划任务的实现
 
<?php
ignore_user_abort(); //即使Client断开(如关掉浏览器),PHP脚本也可以继续执行.
set_time_limit(0); // 执行时间为无限制,php默认的执行时间是30秒,通过set_time_limit(0)可以让程序无限制的执行下去
$interval=60*5; // 每隔5分钟运行
do{$fp = fopen('test.txt','a');
fwrite($fp,'test');
fclose($fp);
sleep($interval);
// 等待5分钟
}while(true);
?>

实际php也可以做抓取,并且原理很简单,直接获取页面源文件,然后通过正则或字符串的参照截取来获取需要的信息。但是性能上不能和搜索引擎的多线程抓取相比。
实现了上一步之后,又思考着,如果抓取可以自动定时获取,那么人工运行可执行页面也就省下来了。
后来也在一些php开源程序中了解到关于"计划任务"的效果:可以定时运行某程序,比如数据库备份,更新缓存,生成静态页面,生成网站地图等。
最近由于项目需要定时更新远程数据库到本地,网上搜了搜,还真找到了。
ignore_user_abort();函数搭配set_time_limit(0);和sleep($interval);即可实现以上自动更新。
先给出一个基本的范式,其中有个人的测试程序:
<?php
ignore_user_abort(); // run script in background
set_time_limit(0); // run script forever
$interval=30; // do every 15 minutes...
do{
$fp = fopen('text3.txt','a');
fwrite($fp,'test');
fclose($fp);
sleep($interval); // wait 15 minutes
}while(true);
?>
首先运行该程序,然后关闭该页面,程序仍然运行中,test会每隔30秒的填补到text3.txt文件。

最后根据php手册简单介绍一些相关的知识:
1.连接处理:
在 PHP 内部,系统维护着连接状态,其状态有三种可能的情况:
0 - NORMAL(正常)
1 - ABORTED(异常退出)
2 - TIMEOUT(超时)
当 PHP 脚本正常地运行 NORMAL 状态时,连接为有效。当远程客户端中断连接时,ABORTED 状态的标记将会被打开。远程客户端连接的中断通常是由用户点击 STOP 按钮导致的。当连接时间超过 PHP 的时限时,TIMEOUT 状态的标记将被打开。
可以决定脚本是否需要在客户端中断连接时退出。有时候让脚本完整地运行会带来很多方便,即使没有远程浏览器接受脚本的输出。默认的情况是当远程客户 端连接中断时脚本将会退出。该处理过程可由 php.ini 的 ignore_user_abort 或由 Apache .conf 设置中对应的"php_value ignore_user_abort"以及 ignore_user_abort() 函数来控制。如果没有告诉 PHP 忽略用户的中断,脚本将会被中断,除非通过 register_shutdown_function() 设置了关闭触发函数。通过该关闭触发函数,当远程用户点击 STOP 按钮后,脚本再次尝试输出数据时,PHP 将会检测到连接已被中断,并调用关闭触发函数。
脚本也有可能被内置的脚本计时器中断。默认的超时限制为 30 秒。这个值可以通过设置 php.ini 的 max_execution_time 或 Apache .conf 设置中对应的"php_value max_execution_time"参数或者 set_time_limit() 函数来更改。当计数器超时的时候,脚本将会类似于以上连接中断的情况退出,先前被注册过的关闭触发函数也将在这时被执行。在该关闭触发函数中,可以通过调 用 connection_status() 函数来检查超时是否导致关闭触发函数被调用。如果超时导致了关闭触发函数的调用,该函数将返回 2。
需要注意的一点是 ABORTED 和 TIMEOUT 状态可以同时有效。这在告诉 PHP 忽略用户的退出操作时是可能的。PHP 将仍然注意用户已经中断了连接但脚本仍然在运行的情况。如果到了运行的时间限制,脚本将被退出,设置过的关闭触发函数也将被执行。在这时会发现函数 connection_status() 返回 3。

2.相关函数
int ignore_user_abort ( [bool setting] )
This function sets whether a client disconnect should cause a script to be aborted. It will return the previous setting and can be called without an argument to not change the current setting and only return the current setting.

int connection_aborted ( void )
Returns TRUE if client disconnected.

int connection_status ( void )
Returns the connection status bitfield.
 

阅读全文 »
« 1 2 3 4 5 6 7 8 » 
 
内容搜索
分类目录
媒体专区 (3)
新闻公告 (5)
技术创新 (4)
用户体验 (15)
网页设计 (19)
团队分享 (20)
悦读周末 (5)
短信中国LOGO (8)
时间索引
2010年07月 (11)
2010年08月 (8)
2010年09月 (11)
2010年11月 (1)
2010年12月 (1)
2011年01月 (3)
2011年02月 (1)
2011年03月 (1)
2011年04月 (1)
2011年05月 (3)
2011年06月 (2)
2011年07月 (1)
2011年10月 (1)
2011年12月 (1)
2012年04月 (8)
2012年05月 (12)
2012年06月 (6)
2012年07月 (6)
2012年08月 (1)
最新发布文章
网页设计技巧解析
电子商务网站设计的10个...
利用统计分析,倾听你...
商标图案创意的原则
提高设计水平的九大秘...
韩国游戏网站设计
最新评论文章
2011年短信中国“给力”...
短信中国,浓浓圣诞节
热门标签
网页布局 网页设计  技巧分析 团队 极速电网 挑战 电子商务 技巧 游戏 好心情 通知 秘决 商标设计 创意 世博 创意大赛 短信 上海 整体作战 明星效应 世界杯 马拉松 短信生活 端午 节日短信 粽子 亲人 营销 市场 用户 
Copyright© 2010 SMS短信应用平台版权所有
http://www.sms.com.cn/Blog SMS短信应用平台团队博客